From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from foss.arm.com (foss.arm.com [217.140.110.172]) by smtp.subspace.kernel.org (Postfix) with ESMTP id E111475809 for ; Tue, 9 Apr 2024 14:56:36 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=217.140.110.172 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1712674598; cv=none; b=eISoSxAd3f/o3UmTJk5n1kW80nCJLtXH16f6poBWESVHsCPeuaA76B8J4xIKT9EO9YJ8ILC9qNrALah8KQr5R0eRvKQ3ezjUY3sy+1d028LtnY3iDz17qb/CuEW9ii8PAjiJfL5iTIGU/zevPQ//ysFgdBdhAZoHjg1bNpvbl2s= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1712674598; c=relaxed/simple; bh=khRu5VdoVrrj5cWOtph5wpTinEW9B0gxtBcey3JzqwM=; h=Date:From:To:Cc:Subject:Message-ID:References:MIME-Version: Content-Type:Content-Disposition:In-Reply-To; b=tv1XRlPW5balBHjQnfPKgQ2//BnE0ZWQzHMwHCLzbaGFzr9dLMHjbdqFhmGUb/6nw/AgqueQETmXQSh3xe2cwQ/eHY65E+qiIjBaLH7Nngd86SuXM7GqSoQ9iPU2RDkeujm9an2JL+WVW0EgAVnzyIVF1Xb1Gk6jVgU3yJmAKME= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=arm.com; spf=pass smtp.mailfrom=arm.com; arc=none smtp.client-ip=217.140.110.172 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=arm.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=arm.com 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 83F4A139F; Tue, 9 Apr 2024 07:57:06 -0700 (PDT) Received: from pluto (unknown [172.31.20.19]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPSA id 7D09D3F6C4; Tue, 9 Apr 2024 07:56:34 -0700 (PDT) Date: Tue, 9 Apr 2024 15:56:32 +0100 From: Cristian Marussi To: Rob Herring Cc: Peng Fan , Krzysztof Kozlowski , "Peng Fan (OSS)" , Krzysztof Kozlowski , Conor Dooley , Shawn Guo , Sascha Hauer , Pengutronix Kernel Team , Fabio Estevam , Sudeep Holla , "devicetree@vger.kernel.org" , "imx@lists.linux.dev" , "linux-arm-kernel@lists.infradead.org" , "linux-kernel@vger.kernel.org" Subject: Re: [PATCH v2 1/6] dt-bindings: firmware: arm,scmi: set additionalProperties to true Message-ID: References: <5b9e0e44-0b9c-44fc-9d18-21c47b46dc63@kernel.org> Precedence: bulk X-Mailing-List: imx@lists.linux.dev List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: On Tue, Apr 09, 2024 at 09:09:46AM -0500, Rob Herring wrote: > On Tue, Apr 9, 2024 at 7:01 AM Cristian Marussi > wrote: > > > > On Tue, Apr 09, 2024 at 09:25:10AM +0000, Peng Fan wrote: > > > Hi Krzysztof, > > > > > > > Subject: RE: [PATCH v2 1/6] dt-bindings: firmware: arm,scmi: set > > > > additionalProperties to true > > > > > > > > > Subject: Re: [PATCH v2 1/6] dt-bindings: firmware: arm,scmi: set > > > > > additionalProperties to true > > > > > > > > > > On 08/04/2024 08:08, Peng Fan wrote: > > > > > >> Subject: Re: [PATCH v2 1/6] dt-bindings: firmware: arm,scmi: set > > > > > >> additionalProperties to true > > > > > >> > > > > > >> On 08/04/2024 01:50, Peng Fan wrote: > > > > > >>>> Subject: Re: [PATCH v2 1/6] dt-bindings: firmware: arm,scmi: set > > > > > >>>> additionalProperties to true > > > > > >>>> > > > > > >>>> On 07/04/2024 12:04, Peng Fan wrote: > > > > > >>>>>> Subject: Re: [PATCH v2 1/6] dt-bindings: firmware: arm,scmi: > > > > > >>>>>> set additionalProperties to true > > > > > >>>>>> > > > > > >>>>>> On 07/04/2024 02:37, Peng Fan wrote: > > > > > >>>>>>>> Subject: Re: [PATCH v2 1/6] dt-bindings: firmware: arm,scmi: > > > > > >>>>>>>> set additionalProperties to true > > > > > >>>>>>>> > > > > > >>>>>>>> On 05/04/2024 14:39, Peng Fan (OSS) wrote: > > > > > >>>>>>>>> From: Peng Fan > > > > > >>>>>>>>> > > > > > >>>>>>>>> When adding vendor extension protocols, there is dt-schema > > > > > >> warning: > > > > > >>>>>>>>> " > > > > > >>>>>>>>> imx,scmi.example.dtb: scmi: 'protocol@81', 'protocol@84' do > > > > > >>>>>>>>> not match any of the regexes: 'pinctrl-[0-9]+' > > > > > >>>>>>>>> " > > > > > >>>>>>>>> > > > > > >>>>>>>>> Set additionalProperties to true to address the issue. > > > > > >>>>>>>> > > > > > >>>>>>>> I do not see anything addressed here, except making the > > > > > >>>>>>>> binding accepting anything anywhere... > > > > > >>>>>>> > > > > > >>>>>>> I not wanna add vendor protocols in arm,scmi.yaml, so will > > > > > >>>>>>> introduce a new yaml imx.scmi.yaml which add i.MX SCMI > > > > > >>>>>>> protocol > > > > > >> extension. > > > > > >>>>>>> > > > > > >>>>>>> With additionalProperties set to false, I not know how, please > > > > > suggest. > > > > > >>>>>> > > > > > >>>>>> First of all, you cannot affect negatively existing devices > > > > > >>>>>> (their > > > > > >>>>>> bindings) and your patch does exactly that. This should make > > > > > >>>>>> you thing what is the correct approach... > > > > > >>>>>> > > > > > >>>>>> Rob gave you the comment about missing compatible - you still > > > > > >>>>>> did not address that. > > > > > >>>>> > > > > > >>>>> I added the compatible in patch 2/6 in the examples "compatible > > > > > >>>>> = > > > > > >>>> "arm,scmi";" > > > > > >>>> > > > > > >>>> So you claim that your vendor extensions are the same or fully > > > > > >>>> compatible with arm,scmi and you add nothing... Are your > > > > > >>>> extensions/protocol valid for arm,scmi? > > > > > >>> > > > > > >>> Yes. They are valid for arm,scmi. > > > > > >>> > > > > > >>> If yes, why is this in separate binding. If no, why you use > > > > > >>> someone > > > > > >>>> else's compatible? > > > > > >>> > > > > > >>> Per SCMI Spec > > > > > >>> 0x80-0xFF: Reserved for vendor or platform-specific extensions to > > > > > >>> this interface > > > > > >>> > > > > > >>> i.MX use 0x81 for BBM, 0x84 for MISC. But other vendors will use > > > > > >>> the id for their own protocol. > > > > > >> > > > > > >> So how are they valid for arm,scmi? I don't understand. > > > > > > > > > > > > arm,scmi is a firmware compatible string. The protocol node is a sub-node. > > > > > > I think the arm,scmi is that saying the firmware following SCMI spec > > > > > > to implement the protocols. > > > > > > > > > > > > For vendor reserved ID, firmware also follow the SCMI spec to > > > > > > implement their own usage, so from firmware level, it is ARM SCMI > > > > > > spec > > > > > compatible. > > > > > > > > > > That's not the point. It is obvious that your firmware is compatible > > > > > with arm,scmi, but what you try to say in this and revised patch is > > > > > that every arm,scmi is compatible with your implementation. What you > > > > > are saying is that 0x84 is MISC protocol for every firmware, Qualcomm, > > > > > NXP, Samsung, TI, Mediatek etc. > > > > > > > > > > I claim it is not true. 0x84 is not MISC for Qualcomm, for example. > > > > > > > > You are right. I am lost now on how to add vendor ID support, using > > > > arm,scmi.yaml or adding a new imx,scmi.yaml or else. > > > > > > > Hi Peng, > > > > I dont think in the following you will find the solution to the problem, > > it is just to recap the situation and constraints around vendor protocol > > bindings. > > > > Describing SCMI vendors protocols is tricky because while on one side > > the protocol node has to be rooted under the main scmi fw DT node (like > > all the standard protocols) and be 'derived' from the arm,scmi.yaml > > protocol-node definition, the optional additional properties of the a specific > > vendor protocol nodes can be customized by each single vendor, and since, > > as you said, you can have multiple protocols from different vendors sharing the > > same protocol number, you could have multiple disjoint sets of valid properties > > allowed under that same protocol node number; so on one side you have to stick > > to some basic protocol-node defs and be rooted under the SCMI node, while on > > the other side you will have multiple possibly allowed sets of additional > > properties to check against, so IOW you cannot anyway just set > > additionalProperties to false since that will result in no checks at all. > > > > As a consequence, at runtime, in the final DTB shipped with a specific > > platform you should have only one of the possible vendor nodes for each > > of these overlapping protocols, and the SCMI core at probe time will > > pick the proper protocol implementation based on the vendor/sub_vendor > > IDs gathered from the running SCMI fw platform at init: this way you > > can just build the usual "all-inclusive" defconfig without worrying > > about vendor protocol clashes since the SCMI core can pick the right > > protocol implementation, you should just had taken care to provide the > > proper DTB for your protocol; BUT this also means that it is not possible > > to add multiple DT bindings based on a 'if vendor' condition since the > > vendor itself is NOT defined and not needed in the bindings since it is > > discoverable at runtime. > > > > So, after all of this blabbing of mine about this, I am wondering if it > > is not possible that the solution is to handle each and every vendor > > protocol node that appears with a block of addtional properties that > > are picked via a oneOf statement from some external vendor specific > > yaml. > > (...in a similar way to how pinctrl additional properties are added...) > > > > > > NOTE THAT the following is just an example of what I mean, it is certainly > > wrong, incomplete annd maybe just not acceptable (and could cause DT > > maintainers eyes to bleed :P)... > > > > ...so it is just fr the sake of explaining what I mean... > > > > diff --git a/Documentation/devicetree/bindings/firmware/arm,scmi.yaml b/Documentation/devicetree/bindings/firmware/arm,scmi.yaml > > index e9d3f043c4ed..3c38a1e3ffed 100644 > > --- a/Documentation/devicetree/bindings/firmware/arm,scmi.yaml > > +++ b/Documentation/devicetree/bindings/firmware/arm,scmi.yaml > > @@ -278,6 +278,22 @@ properties: > > required: > > - reg > > > > + protocol@81: > > + $ref: '#/$defs/protocol-node' > > + unevaluatedProperties: false > > + > > + properties: > > + reg: > > + const: 0x81 > > + > > + patternProperties: > > + '$': > > + type: object > > Did you mean to have child nodes under the protocol node rather than in it? ... nope ... it is just as bad as my yaml-fu is :P ... but not sure if vendors has also this needs or plain props will suffice... > > > + oneOf: > > + - $ref: /schemas/vendor-A/scmi-protos.yaml# > > + - $ref: /schemas/vendor-B/protos.yaml# > > Moved up one level, this would work, but it would have to be an > 'anyOf' because it is possible that 2 vendors have the exact same set > of properties. > ok > I can think of 2 other ways to structure this. > > First, is a specific vendor protocol discoverable? Not that is 0x81 > protocol present, but that 0x81 is vendor Foo's extra special > value-add protocol? If not, I think we should require a compatible > string on vendor protocols. Then the base SCMI schema can require just > that, and each vendor protocol defines its node with a $ref to > '#/$defs/protocol-node'. Basically yes it is discoverable, since at runtime the SCMI core, early on, normally discovers the vendor_id/sub_vendor_id by querying the platform via Base protocol and then later only loads/initializes (by closest match) the vendor protocols that are present in the DT AND that has been 'tagged' at compile time with the same vendor_id/sub_vendor_id tuple (in the vendor module code, struct scmi_protocol) Of course you should take care to put the proper protocol@81 node in your vendor_A DTB for the vendor_A SCMI driver to make use of the additional vendor_A properties that you have defined under your node as referred in your vendor-protos.yaml...if you botch that up I will load a protocol and call your vendor_A driver with a vendor_X DT node. DT is currrently vendor-agnostic. > > The 2nd way is just a variation of the oneOf above, but do we do 1 > file per vendor protocol or 1 file per vendor. Either should be > doable, just a matter of where 'protocol@81', etc. are defined. > Oh, yes mine was just an ill example...one file per vendor will do just fine: the important thing is that the list and the yaml itself can be extended as new vendors appears (in a backward compatble way of course) Thanks, Cristian 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 A514BC67861 for ; Tue, 9 Apr 2024 14:56:54 +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-Transfer-Encoding:Content-Type:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:In-Reply-To:MIME-Version:References: Message-ID:Subject:Cc:To:From:Date:Reply-To:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=aUJ5Ycx0s7pZZ+vSQCSSyH1ESUokUbGqjD64NkzKnas=; b=QvCh0gcQV2TCvp 8O+xDIa7JfCU6Z7hO8PlRDLgQOnqbyX7r5lwjdRfHTIk74edeGYQtCCnUcWAaXJe7yGggnq8v2aXZ roTGp87zVAJc3UFewt1xlQHwA+74qEkxPxKFqXzj0X+z4k5498nFUoeHe1LQzWufPicA0aUdFGg5t l5u5H91X8DQ3YctjsnS37uORlPDIJz6ys3OS8EHLzEKGXAo/0z+tY/lc9SZ45aWcInC/r0NPBfD46 N4l659MNXVscM3wTJf6zV0QJtaDC4afiBW4862g5M1PnR9EZkdVB0kI3RTJ4X8up1v7Ai33gA5XNF wuG7LlboajMKVSNCkTzw==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.97.1 #2 (Red Hat Linux)) id 1ruCtt-00000002XpV-0TLN; Tue, 09 Apr 2024 14:56:41 +0000 Received: from foss.arm.com ([217.140.110.172]) by bombadil.infradead.org with esmtp (Exim 4.97.1 #2 (Red Hat Linux)) id 1ruCtq-00000002XoQ-0xbo for linux-arm-kernel@lists.infradead.org; Tue, 09 Apr 2024 14:56:39 +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 83F4A139F; Tue, 9 Apr 2024 07:57:06 -0700 (PDT) Received: from pluto (unknown [172.31.20.19]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPSA id 7D09D3F6C4; Tue, 9 Apr 2024 07:56:34 -0700 (PDT) Date: Tue, 9 Apr 2024 15:56:32 +0100 From: Cristian Marussi To: Rob Herring Cc: Peng Fan , Krzysztof Kozlowski , "Peng Fan (OSS)" , Krzysztof Kozlowski , Conor Dooley , Shawn Guo , Sascha Hauer , Pengutronix Kernel Team , Fabio Estevam , Sudeep Holla , "devicetree@vger.kernel.org" , "imx@lists.linux.dev" , "linux-arm-kernel@lists.infradead.org" , "linux-kernel@vger.kernel.org" Subject: Re: [PATCH v2 1/6] dt-bindings: firmware: arm,scmi: set additionalProperties to true Message-ID: References: <5b9e0e44-0b9c-44fc-9d18-21c47b46dc63@kernel.org> MIME-Version: 1.0 Content-Disposition: inline In-Reply-To: X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20240409_075638_385148_D3DF45E7 X-CRM114-Status: GOOD ( 58.92 ) 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-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org T24gVHVlLCBBcHIgMDksIDIwMjQgYXQgMDk6MDk6NDZBTSAtMDUwMCwgUm9iIEhlcnJpbmcgd3Jv dGU6Cj4gT24gVHVlLCBBcHIgOSwgMjAyNCBhdCA3OjAx4oCvQU0gQ3Jpc3RpYW4gTWFydXNzaQo+ IDxjcmlzdGlhbi5tYXJ1c3NpQGFybS5jb20+IHdyb3RlOgo+ID4KPiA+IE9uIFR1ZSwgQXByIDA5 LCAyMDI0IGF0IDA5OjI1OjEwQU0gKzAwMDAsIFBlbmcgRmFuIHdyb3RlOgo+ID4gPiBIaSBLcnp5 c3p0b2YsCj4gPiA+Cj4gPiA+ID4gU3ViamVjdDogUkU6IFtQQVRDSCB2MiAxLzZdIGR0LWJpbmRp bmdzOiBmaXJtd2FyZTogYXJtLHNjbWk6IHNldAo+ID4gPiA+IGFkZGl0aW9uYWxQcm9wZXJ0aWVz IHRvIHRydWUKPiA+ID4gPgo+ID4gPiA+ID4gU3ViamVjdDogUmU6IFtQQVRDSCB2MiAxLzZdIGR0 LWJpbmRpbmdzOiBmaXJtd2FyZTogYXJtLHNjbWk6IHNldAo+ID4gPiA+ID4gYWRkaXRpb25hbFBy b3BlcnRpZXMgdG8gdHJ1ZQo+ID4gPiA+ID4KPiA+ID4gPiA+IE9uIDA4LzA0LzIwMjQgMDg6MDgs IFBlbmcgRmFuIHdyb3RlOgo+ID4gPiA+ID4gPj4gU3ViamVjdDogUmU6IFtQQVRDSCB2MiAxLzZd IGR0LWJpbmRpbmdzOiBmaXJtd2FyZTogYXJtLHNjbWk6IHNldAo+ID4gPiA+ID4gPj4gYWRkaXRp b25hbFByb3BlcnRpZXMgdG8gdHJ1ZQo+ID4gPiA+ID4gPj4KPiA+ID4gPiA+ID4+IE9uIDA4LzA0 LzIwMjQgMDE6NTAsIFBlbmcgRmFuIHdyb3RlOgo+ID4gPiA+ID4gPj4+PiBTdWJqZWN0OiBSZTog W1BBVENIIHYyIDEvNl0gZHQtYmluZGluZ3M6IGZpcm13YXJlOiBhcm0sc2NtaTogc2V0Cj4gPiA+ ID4gPiA+Pj4+IGFkZGl0aW9uYWxQcm9wZXJ0aWVzIHRvIHRydWUKPiA+ID4gPiA+ID4+Pj4KPiA+ ID4gPiA+ID4+Pj4gT24gMDcvMDQvMjAyNCAxMjowNCwgUGVuZyBGYW4gd3JvdGU6Cj4gPiA+ID4g PiA+Pj4+Pj4gU3ViamVjdDogUmU6IFtQQVRDSCB2MiAxLzZdIGR0LWJpbmRpbmdzOiBmaXJtd2Fy ZTogYXJtLHNjbWk6Cj4gPiA+ID4gPiA+Pj4+Pj4gc2V0IGFkZGl0aW9uYWxQcm9wZXJ0aWVzIHRv IHRydWUKPiA+ID4gPiA+ID4+Pj4+Pgo+ID4gPiA+ID4gPj4+Pj4+IE9uIDA3LzA0LzIwMjQgMDI6 MzcsIFBlbmcgRmFuIHdyb3RlOgo+ID4gPiA+ID4gPj4+Pj4+Pj4gU3ViamVjdDogUmU6IFtQQVRD SCB2MiAxLzZdIGR0LWJpbmRpbmdzOiBmaXJtd2FyZTogYXJtLHNjbWk6Cj4gPiA+ID4gPiA+Pj4+ Pj4+PiBzZXQgYWRkaXRpb25hbFByb3BlcnRpZXMgdG8gdHJ1ZQo+ID4gPiA+ID4gPj4+Pj4+Pj4K PiA+ID4gPiA+ID4+Pj4+Pj4+IE9uIDA1LzA0LzIwMjQgMTQ6MzksIFBlbmcgRmFuIChPU1MpIHdy b3RlOgo+ID4gPiA+ID4gPj4+Pj4+Pj4+IEZyb206IFBlbmcgRmFuIDxwZW5nLmZhbkBueHAuY29t Pgo+ID4gPiA+ID4gPj4+Pj4+Pj4+Cj4gPiA+ID4gPiA+Pj4+Pj4+Pj4gV2hlbiBhZGRpbmcgdmVu ZG9yIGV4dGVuc2lvbiBwcm90b2NvbHMsIHRoZXJlIGlzIGR0LXNjaGVtYQo+ID4gPiA+ID4gPj4g d2FybmluZzoKPiA+ID4gPiA+ID4+Pj4+Pj4+PiAiCj4gPiA+ID4gPiA+Pj4+Pj4+Pj4gaW14LHNj bWkuZXhhbXBsZS5kdGI6IHNjbWk6ICdwcm90b2NvbEA4MScsICdwcm90b2NvbEA4NCcgZG8KPiA+ ID4gPiA+ID4+Pj4+Pj4+PiBub3QgbWF0Y2ggYW55IG9mIHRoZSByZWdleGVzOiAncGluY3RybC1b MC05XSsnCj4gPiA+ID4gPiA+Pj4+Pj4+Pj4gIgo+ID4gPiA+ID4gPj4+Pj4+Pj4+Cj4gPiA+ID4g PiA+Pj4+Pj4+Pj4gU2V0IGFkZGl0aW9uYWxQcm9wZXJ0aWVzIHRvIHRydWUgdG8gYWRkcmVzcyB0 aGUgaXNzdWUuCj4gPiA+ID4gPiA+Pj4+Pj4+Pgo+ID4gPiA+ID4gPj4+Pj4+Pj4gSSBkbyBub3Qg c2VlIGFueXRoaW5nIGFkZHJlc3NlZCBoZXJlLCBleGNlcHQgbWFraW5nIHRoZQo+ID4gPiA+ID4g Pj4+Pj4+Pj4gYmluZGluZyBhY2NlcHRpbmcgYW55dGhpbmcgYW55d2hlcmUuLi4KPiA+ID4gPiA+ ID4+Pj4+Pj4KPiA+ID4gPiA+ID4+Pj4+Pj4gSSBub3Qgd2FubmEgYWRkIHZlbmRvciBwcm90b2Nv bHMgaW4gYXJtLHNjbWkueWFtbCwgc28gd2lsbAo+ID4gPiA+ID4gPj4+Pj4+PiBpbnRyb2R1Y2Ug YSBuZXcgeWFtbCBpbXguc2NtaS55YW1sIHdoaWNoIGFkZCBpLk1YIFNDTUkKPiA+ID4gPiA+ID4+ Pj4+Pj4gcHJvdG9jb2wKPiA+ID4gPiA+ID4+IGV4dGVuc2lvbi4KPiA+ID4gPiA+ID4+Pj4+Pj4K PiA+ID4gPiA+ID4+Pj4+Pj4gV2l0aCBhZGRpdGlvbmFsUHJvcGVydGllcyBzZXQgdG8gZmFsc2Us IEkgbm90IGtub3cgaG93LCBwbGVhc2UKPiA+ID4gPiA+IHN1Z2dlc3QuCj4gPiA+ID4gPiA+Pj4+ Pj4KPiA+ID4gPiA+ID4+Pj4+PiBGaXJzdCBvZiBhbGwsIHlvdSBjYW5ub3QgYWZmZWN0IG5lZ2F0 aXZlbHkgZXhpc3RpbmcgZGV2aWNlcwo+ID4gPiA+ID4gPj4+Pj4+ICh0aGVpcgo+ID4gPiA+ID4g Pj4+Pj4+IGJpbmRpbmdzKSBhbmQgeW91ciBwYXRjaCBkb2VzIGV4YWN0bHkgdGhhdC4gVGhpcyBz aG91bGQgbWFrZQo+ID4gPiA+ID4gPj4+Pj4+IHlvdSB0aGluZyB3aGF0IGlzIHRoZSBjb3JyZWN0 IGFwcHJvYWNoLi4uCj4gPiA+ID4gPiA+Pj4+Pj4KPiA+ID4gPiA+ID4+Pj4+PiBSb2IgZ2F2ZSB5 b3UgdGhlIGNvbW1lbnQgYWJvdXQgbWlzc2luZyBjb21wYXRpYmxlIC0geW91IHN0aWxsCj4gPiA+ ID4gPiA+Pj4+Pj4gZGlkIG5vdCBhZGRyZXNzIHRoYXQuCj4gPiA+ID4gPiA+Pj4+Pgo+ID4gPiA+ ID4gPj4+Pj4gSSBhZGRlZCB0aGUgY29tcGF0aWJsZSBpbiBwYXRjaCAyLzYgaW4gdGhlIGV4YW1w bGVzICJjb21wYXRpYmxlCj4gPiA+ID4gPiA+Pj4+PiA9Cj4gPiA+ID4gPiA+Pj4+ICJhcm0sc2Nt aSI7Igo+ID4gPiA+ID4gPj4+Pgo+ID4gPiA+ID4gPj4+PiBTbyB5b3UgY2xhaW0gdGhhdCB5b3Vy IHZlbmRvciBleHRlbnNpb25zIGFyZSB0aGUgc2FtZSBvciBmdWxseQo+ID4gPiA+ID4gPj4+PiBj b21wYXRpYmxlIHdpdGggYXJtLHNjbWkgYW5kIHlvdSBhZGQgbm90aGluZy4uLiBBcmUgeW91cgo+ ID4gPiA+ID4gPj4+PiBleHRlbnNpb25zL3Byb3RvY29sIHZhbGlkIGZvciBhcm0sc2NtaT8KPiA+ ID4gPiA+ID4+Pgo+ID4gPiA+ID4gPj4+IFllcy4gVGhleSBhcmUgdmFsaWQgZm9yIGFybSxzY21p Lgo+ID4gPiA+ID4gPj4+Cj4gPiA+ID4gPiA+Pj4gIElmIHllcywgd2h5IGlzIHRoaXMgaW4gc2Vw YXJhdGUgYmluZGluZy4gSWYgbm8sIHdoeSB5b3UgdXNlCj4gPiA+ID4gPiA+Pj4gc29tZW9uZQo+ ID4gPiA+ID4gPj4+PiBlbHNlJ3MgY29tcGF0aWJsZT8KPiA+ID4gPiA+ID4+Pgo+ID4gPiA+ID4g Pj4+IFBlciBTQ01JIFNwZWMKPiA+ID4gPiA+ID4+PiAweDgwLTB4RkY6IFJlc2VydmVkIGZvciB2 ZW5kb3Igb3IgcGxhdGZvcm0tc3BlY2lmaWMgZXh0ZW5zaW9ucyB0bwo+ID4gPiA+ID4gPj4+IHRo aXMgaW50ZXJmYWNlCj4gPiA+ID4gPiA+Pj4KPiA+ID4gPiA+ID4+PiBpLk1YIHVzZSAweDgxIGZv ciBCQk0sIDB4ODQgZm9yIE1JU0MuIEJ1dCBvdGhlciB2ZW5kb3JzIHdpbGwgdXNlCj4gPiA+ID4g PiA+Pj4gdGhlIGlkIGZvciB0aGVpciBvd24gcHJvdG9jb2wuCj4gPiA+ID4gPiA+Pgo+ID4gPiA+ ID4gPj4gU28gaG93IGFyZSB0aGV5IHZhbGlkIGZvciBhcm0sc2NtaT8gSSBkb24ndCB1bmRlcnN0 YW5kLgo+ID4gPiA+ID4gPgo+ID4gPiA+ID4gPiBhcm0sc2NtaSBpcyBhIGZpcm13YXJlIGNvbXBh dGlibGUgc3RyaW5nLiBUaGUgcHJvdG9jb2wgbm9kZSBpcyBhIHN1Yi1ub2RlLgo+ID4gPiA+ID4g PiBJIHRoaW5rIHRoZSBhcm0sc2NtaSBpcyB0aGF0IHNheWluZyB0aGUgZmlybXdhcmUgZm9sbG93 aW5nIFNDTUkgc3BlYwo+ID4gPiA+ID4gPiB0byBpbXBsZW1lbnQgdGhlIHByb3RvY29scy4KPiA+ ID4gPiA+ID4KPiA+ID4gPiA+ID4gRm9yIHZlbmRvciByZXNlcnZlZCBJRCwgZmlybXdhcmUgYWxz byBmb2xsb3cgdGhlIFNDTUkgc3BlYyB0bwo+ID4gPiA+ID4gPiBpbXBsZW1lbnQgdGhlaXIgb3du IHVzYWdlLCBzbyBmcm9tIGZpcm13YXJlIGxldmVsLCBpdCBpcyBBUk0gU0NNSQo+ID4gPiA+ID4g PiBzcGVjCj4gPiA+ID4gPiBjb21wYXRpYmxlLgo+ID4gPiA+ID4KPiA+ID4gPiA+IFRoYXQncyBu b3QgdGhlIHBvaW50LiBJdCBpcyBvYnZpb3VzIHRoYXQgeW91ciBmaXJtd2FyZSBpcyBjb21wYXRp YmxlCj4gPiA+ID4gPiB3aXRoIGFybSxzY21pLCBidXQgd2hhdCB5b3UgdHJ5IHRvIHNheSBpbiB0 aGlzIGFuZCByZXZpc2VkIHBhdGNoIGlzCj4gPiA+ID4gPiB0aGF0IGV2ZXJ5IGFybSxzY21pIGlz IGNvbXBhdGlibGUgd2l0aCB5b3VyIGltcGxlbWVudGF0aW9uLiBXaGF0IHlvdQo+ID4gPiA+ID4g YXJlIHNheWluZyBpcyB0aGF0IDB4ODQgaXMgTUlTQyBwcm90b2NvbCBmb3IgZXZlcnkgZmlybXdh cmUsIFF1YWxjb21tLAo+ID4gPiA+ID4gTlhQLCBTYW1zdW5nLCBUSSwgTWVkaWF0ZWsgZXRjLgo+ ID4gPiA+ID4KPiA+ID4gPiA+IEkgY2xhaW0gaXQgaXMgbm90IHRydWUuIDB4ODQgaXMgbm90IE1J U0MgZm9yIFF1YWxjb21tLCBmb3IgZXhhbXBsZS4KPiA+ID4gPgo+ID4gPiA+IFlvdSBhcmUgcmln aHQuIEkgYW0gbG9zdCBub3cgb24gaG93IHRvIGFkZCB2ZW5kb3IgSUQgc3VwcG9ydCwgdXNpbmcK PiA+ID4gPiBhcm0sc2NtaS55YW1sIG9yIGFkZGluZyBhIG5ldyBpbXgsc2NtaS55YW1sIG9yIGVs c2UuCj4gPiA+Cj4gPgo+ID4gSGkgUGVuZywKPiA+Cj4gPiBJIGRvbnQgdGhpbmsgaW4gdGhlIGZv bGxvd2luZyB5b3Ugd2lsbCBmaW5kIHRoZSBzb2x1dGlvbiB0byB0aGUgcHJvYmxlbSwKPiA+IGl0 IGlzIGp1c3QgdG8gcmVjYXAgdGhlIHNpdHVhdGlvbiBhbmQgY29uc3RyYWludHMgYXJvdW5kIHZl bmRvciBwcm90b2NvbAo+ID4gYmluZGluZ3MuCj4gPgo+ID4gRGVzY3JpYmluZyBTQ01JIHZlbmRv cnMgcHJvdG9jb2xzIGlzIHRyaWNreSBiZWNhdXNlIHdoaWxlIG9uIG9uZSBzaWRlCj4gPiB0aGUg cHJvdG9jb2wgbm9kZSBoYXMgdG8gYmUgcm9vdGVkIHVuZGVyIHRoZSBtYWluIHNjbWkgZncgRFQg bm9kZSAobGlrZQo+ID4gYWxsIHRoZSBzdGFuZGFyZCBwcm90b2NvbHMpIGFuZCBiZSAnZGVyaXZl ZCcgZnJvbSB0aGUgYXJtLHNjbWkueWFtbAo+ID4gcHJvdG9jb2wtbm9kZSBkZWZpbml0aW9uLCB0 aGUgb3B0aW9uYWwgYWRkaXRpb25hbCBwcm9wZXJ0aWVzIG9mIHRoZSBhIHNwZWNpZmljCj4gPiB2 ZW5kb3IgcHJvdG9jb2wgbm9kZXMgY2FuIGJlIGN1c3RvbWl6ZWQgYnkgZWFjaCBzaW5nbGUgdmVu ZG9yLCBhbmQgc2luY2UsCj4gPiBhcyB5b3Ugc2FpZCwgeW91IGNhbiBoYXZlIG11bHRpcGxlIHBy b3RvY29scyBmcm9tIGRpZmZlcmVudCB2ZW5kb3JzIHNoYXJpbmcgdGhlCj4gPiBzYW1lIHByb3Rv Y29sIG51bWJlciwgeW91IGNvdWxkIGhhdmUgbXVsdGlwbGUgZGlzam9pbnQgc2V0cyBvZiB2YWxp ZCBwcm9wZXJ0aWVzCj4gPiBhbGxvd2VkIHVuZGVyIHRoYXQgc2FtZSBwcm90b2NvbCBub2RlIG51 bWJlcjsgc28gb24gb25lIHNpZGUgeW91IGhhdmUgdG8gc3RpY2sKPiA+IHRvIHNvbWUgYmFzaWMg cHJvdG9jb2wtbm9kZSBkZWZzIGFuZCBiZSByb290ZWQgdW5kZXIgdGhlIFNDTUkgbm9kZSwgd2hp bGUgb24KPiA+IHRoZSBvdGhlciBzaWRlIHlvdSB3aWxsIGhhdmUgbXVsdGlwbGUgcG9zc2libHkg YWxsb3dlZCBzZXRzIG9mIGFkZGl0aW9uYWwKPiA+IHByb3BlcnRpZXMgdG8gY2hlY2sgYWdhaW5z dCwgc28gSU9XIHlvdSBjYW5ub3QgYW55d2F5IGp1c3Qgc2V0Cj4gPiBhZGRpdGlvbmFsUHJvcGVy dGllcyB0byBmYWxzZSBzaW5jZSB0aGF0IHdpbGwgcmVzdWx0IGluIG5vIGNoZWNrcyBhdCBhbGwu Cj4gPgo+ID4gQXMgYSBjb25zZXF1ZW5jZSwgYXQgcnVudGltZSwgaW4gdGhlIGZpbmFsIERUQiBz aGlwcGVkIHdpdGggYSBzcGVjaWZpYwo+ID4gcGxhdGZvcm0geW91IHNob3VsZCBoYXZlIG9ubHkg b25lIG9mIHRoZSBwb3NzaWJsZSB2ZW5kb3Igbm9kZXMgZm9yIGVhY2gKPiA+IG9mIHRoZXNlIG92 ZXJsYXBwaW5nIHByb3RvY29scywgYW5kIHRoZSBTQ01JIGNvcmUgYXQgcHJvYmUgdGltZSB3aWxs Cj4gPiBwaWNrIHRoZSBwcm9wZXIgcHJvdG9jb2wgaW1wbGVtZW50YXRpb24gYmFzZWQgb24gdGhl IHZlbmRvci9zdWJfdmVuZG9yCj4gPiBJRHMgZ2F0aGVyZWQgZnJvbSB0aGUgcnVubmluZyBTQ01J IGZ3IHBsYXRmb3JtIGF0IGluaXQ6IHRoaXMgd2F5IHlvdQo+ID4gY2FuIGp1c3QgYnVpbGQgdGhl IHVzdWFsICJhbGwtaW5jbHVzaXZlIiBkZWZjb25maWcgd2l0aG91dCB3b3JyeWluZwo+ID4gYWJv dXQgdmVuZG9yIHByb3RvY29sIGNsYXNoZXMgc2luY2UgdGhlIFNDTUkgY29yZSBjYW4gcGljayB0 aGUgcmlnaHQKPiA+IHByb3RvY29sIGltcGxlbWVudGF0aW9uLCB5b3Ugc2hvdWxkIGp1c3QgaGFk IHRha2VuIGNhcmUgdG8gcHJvdmlkZSB0aGUKPiA+IHByb3BlciBEVEIgZm9yIHlvdXIgcHJvdG9j b2w7IEJVVCB0aGlzIGFsc28gbWVhbnMgdGhhdCBpdCBpcyBub3QgcG9zc2libGUKPiA+IHRvIGFk ZCBtdWx0aXBsZSBEVCBiaW5kaW5ncyBiYXNlZCBvbiBhICdpZiB2ZW5kb3InIGNvbmRpdGlvbiBz aW5jZSB0aGUKPiA+IHZlbmRvciBpdHNlbGYgaXMgTk9UIGRlZmluZWQgYW5kIG5vdCBuZWVkZWQg aW4gdGhlIGJpbmRpbmdzIHNpbmNlIGl0IGlzCj4gPiBkaXNjb3ZlcmFibGUgYXQgcnVudGltZS4K PiA+Cj4gPiBTbywgYWZ0ZXIgYWxsIG9mIHRoaXMgYmxhYmJpbmcgb2YgbWluZSBhYm91dCB0aGlz LCBJIGFtIHdvbmRlcmluZyBpZiBpdAo+ID4gaXMgbm90IHBvc3NpYmxlIHRoYXQgdGhlIHNvbHV0 aW9uIGlzIHRvIGhhbmRsZSBlYWNoIGFuZCBldmVyeSB2ZW5kb3IKPiA+IHByb3RvY29sIG5vZGUg dGhhdCBhcHBlYXJzIHdpdGggYSBibG9jayBvZiBhZGR0aW9uYWwgcHJvcGVydGllcyB0aGF0Cj4g PiBhcmUgcGlja2VkIHZpYSBhIG9uZU9mIHN0YXRlbWVudCBmcm9tIHNvbWUgZXh0ZXJuYWwgdmVu ZG9yIHNwZWNpZmljCj4gPiB5YW1sLgo+ID4gKC4uLmluIGEgc2ltaWxhciB3YXkgdG8gaG93IHBp bmN0cmwgYWRkaXRpb25hbCBwcm9wZXJ0aWVzIGFyZSBhZGRlZC4uLikKPiA+Cj4gPgo+ID4gTk9U RSBUSEFUIHRoZSBmb2xsb3dpbmcgaXMganVzdCBhbiBleGFtcGxlIG9mIHdoYXQgSSBtZWFuLCBp dCBpcyBjZXJ0YWlubHkKPiA+IHdyb25nLCBpbmNvbXBsZXRlIGFubmQgbWF5YmUganVzdCBub3Qg YWNjZXB0YWJsZSAoYW5kIGNvdWxkIGNhdXNlIERUCj4gPiBtYWludGFpbmVycyBleWVzIHRvIGJs ZWVkIDpQKS4uLgo+ID4KPiA+IC4uLnNvIGl0IGlzIGp1c3QgZnIgdGhlIHNha2Ugb2YgZXhwbGFp bmluZyB3aGF0IEkgbWVhbi4uLgo+ID4KPiA+IGRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2Rl dmljZXRyZWUvYmluZGluZ3MvZmlybXdhcmUvYXJtLHNjbWkueWFtbCBiL0RvY3VtZW50YXRpb24v ZGV2aWNldHJlZS9iaW5kaW5ncy9maXJtd2FyZS9hcm0sc2NtaS55YW1sCj4gPiBpbmRleCBlOWQz ZjA0M2M0ZWQuLjNjMzhhMWUzZmZlZCAxMDA2NDQKPiA+IC0tLSBhL0RvY3VtZW50YXRpb24vZGV2 aWNldHJlZS9iaW5kaW5ncy9maXJtd2FyZS9hcm0sc2NtaS55YW1sCj4gPiArKysgYi9Eb2N1bWVu dGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvZmlybXdhcmUvYXJtLHNjbWkueWFtbAo+ID4gQEAg LTI3OCw2ICsyNzgsMjIgQEAgcHJvcGVydGllczoKPiA+ICAgICAgcmVxdWlyZWQ6Cj4gPiAgICAg ICAgLSByZWcKPiA+Cj4gPiArICBwcm90b2NvbEA4MToKPiA+ICsgICAgJHJlZjogJyMvJGRlZnMv cHJvdG9jb2wtbm9kZScKPiA+ICsgICAgdW5ldmFsdWF0ZWRQcm9wZXJ0aWVzOiBmYWxzZQo+ID4g Kwo+ID4gKyAgICBwcm9wZXJ0aWVzOgo+ID4gKyAgICAgIHJlZzoKPiA+ICsgICAgICAgIGNvbnN0 OiAweDgxCj4gPiArCj4gPiArICAgIHBhdHRlcm5Qcm9wZXJ0aWVzOgo+ID4gKyAgICAgICckJzoK PiA+ICsgICAgICAgIHR5cGU6IG9iamVjdAo+IAo+IERpZCB5b3UgbWVhbiB0byBoYXZlIGNoaWxk IG5vZGVzIHVuZGVyIHRoZSBwcm90b2NvbCBub2RlIHJhdGhlciB0aGFuIGluIGl0PwoKLi4uIG5v cGUgLi4uIGl0IGlzIGp1c3QgYXMgYmFkIGFzIG15IHlhbWwtZnUgaXMgOlAgLi4uIGJ1dCBub3Qg c3VyZSBpZgp2ZW5kb3JzIGhhcyBhbHNvIHRoaXMgbmVlZHMgb3IgcGxhaW4gcHJvcHMgd2lsbCBz dWZmaWNlLi4uCgo+IAo+ID4gKyAgICAgICAgb25lT2Y6Cj4gPiArICAgICAgICAgIC0gJHJlZjog L3NjaGVtYXMvdmVuZG9yLUEvc2NtaS1wcm90b3MueWFtbCMKPiA+ICsgICAgICAgICAgLSAkcmVm OiAvc2NoZW1hcy92ZW5kb3ItQi9wcm90b3MueWFtbCMKPiAKPiBNb3ZlZCB1cCBvbmUgbGV2ZWws IHRoaXMgd291bGQgd29yaywgYnV0IGl0IHdvdWxkIGhhdmUgdG8gYmUgYW4KPiAnYW55T2YnIGJl Y2F1c2UgaXQgaXMgcG9zc2libGUgdGhhdCAyIHZlbmRvcnMgaGF2ZSB0aGUgZXhhY3Qgc2FtZSBz ZXQKPiBvZiBwcm9wZXJ0aWVzLgo+IAoKb2sKCj4gSSBjYW4gdGhpbmsgb2YgMiBvdGhlciB3YXlz IHRvIHN0cnVjdHVyZSB0aGlzLgo+IAo+IEZpcnN0LCBpcyBhIHNwZWNpZmljIHZlbmRvciBwcm90 b2NvbCBkaXNjb3ZlcmFibGU/IE5vdCB0aGF0IGlzIDB4ODEKPiBwcm90b2NvbCBwcmVzZW50LCBi dXQgdGhhdCAweDgxIGlzIHZlbmRvciBGb28ncyBleHRyYSBzcGVjaWFsCj4gdmFsdWUtYWRkIHBy b3RvY29sPyBJZiBub3QsIEkgdGhpbmsgd2Ugc2hvdWxkIHJlcXVpcmUgYSBjb21wYXRpYmxlCj4g c3RyaW5nIG9uIHZlbmRvciBwcm90b2NvbHMuIFRoZW4gdGhlIGJhc2UgU0NNSSBzY2hlbWEgY2Fu IHJlcXVpcmUganVzdAo+IHRoYXQsIGFuZCBlYWNoIHZlbmRvciBwcm90b2NvbCBkZWZpbmVzIGl0 cyBub2RlIHdpdGggYSAkcmVmIHRvCj4gJyMvJGRlZnMvcHJvdG9jb2wtbm9kZScuCgpCYXNpY2Fs bHkgeWVzIGl0IGlzIGRpc2NvdmVyYWJsZSwgc2luY2UgYXQgcnVudGltZSB0aGUgU0NNSSBjb3Jl LCBlYXJseSBvbiwKbm9ybWFsbHkgZGlzY292ZXJzIHRoZSB2ZW5kb3JfaWQvc3ViX3ZlbmRvcl9p ZCBieSBxdWVyeWluZyB0aGUgcGxhdGZvcm0gdmlhCkJhc2UgcHJvdG9jb2wgYW5kIHRoZW4gbGF0 ZXIgb25seSBsb2Fkcy9pbml0aWFsaXplcyAoYnkgY2xvc2VzdCBtYXRjaCkgdGhlCnZlbmRvciBw cm90b2NvbHMgdGhhdCBhcmUgcHJlc2VudCBpbiB0aGUgRFQgQU5EIHRoYXQgaGFzIGJlZW4gJ3Rh Z2dlZCcgYXQKY29tcGlsZSB0aW1lIHdpdGggdGhlIHNhbWUgdmVuZG9yX2lkL3N1Yl92ZW5kb3Jf aWQgdHVwbGUgKGluIHRoZSB2ZW5kb3IKbW9kdWxlIGNvZGUsIHN0cnVjdCBzY21pX3Byb3RvY29s KQoKT2YgY291cnNlIHlvdSBzaG91bGQgdGFrZSBjYXJlIHRvIHB1dCB0aGUgcHJvcGVyIHByb3Rv Y29sQDgxIG5vZGUgaW4geW91cgp2ZW5kb3JfQSBEVEIgZm9yIHRoZSB2ZW5kb3JfQSBTQ01JIGRy aXZlciB0byBtYWtlIHVzZSBvZiB0aGUgYWRkaXRpb25hbAp2ZW5kb3JfQSBwcm9wZXJ0aWVzIHRo YXQgeW91IGhhdmUgZGVmaW5lZCB1bmRlciB5b3VyIG5vZGUgYXMgcmVmZXJyZWQKaW4geW91ciB2 ZW5kb3ItcHJvdG9zLnlhbWwuLi5pZiB5b3UgYm90Y2ggdGhhdCB1cCBJIHdpbGwgbG9hZCBhIHBy b3RvY29sCmFuZCBjYWxsIHlvdXIgdmVuZG9yX0EgZHJpdmVyIHdpdGggYSB2ZW5kb3JfWCBEVCBu b2RlLgoKRFQgaXMgY3VycnJlbnRseSB2ZW5kb3ItYWdub3N0aWMuCgo+IAo+IFRoZSAybmQgd2F5 IGlzIGp1c3QgYSB2YXJpYXRpb24gb2YgdGhlIG9uZU9mIGFib3ZlLCBidXQgZG8gd2UgZG8gMQo+ IGZpbGUgcGVyIHZlbmRvciBwcm90b2NvbCBvciAxIGZpbGUgcGVyIHZlbmRvci4gRWl0aGVyIHNo b3VsZCBiZQo+IGRvYWJsZSwganVzdCBhIG1hdHRlciBvZiB3aGVyZSAncHJvdG9jb2xAODEnLCBl dGMuIGFyZSBkZWZpbmVkLgo+IAoKT2gsIHllcyBtaW5lIHdhcyBqdXN0IGFuIGlsbCBleGFtcGxl Li4ub25lIGZpbGUgcGVyIHZlbmRvciB3aWxsIGRvIGp1c3QKZmluZTogdGhlIGltcG9ydGFudCB0 aGluZyBpcyB0aGF0IHRoZSBsaXN0IGFuZCB0aGUgeWFtbCBpdHNlbGYgY2FuIGJlCmV4dGVuZGVk IGFzIG5ldyB2ZW5kb3JzIGFwcGVhcnMgKGluIGEgYmFja3dhcmQgY29tcGF0YmxlIHdheSBvZiBj b3Vyc2UpCgpUaGFua3MsCkNyaXN0aWFuCgpfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fXwpsaW51eC1hcm0ta2VybmVsIG1haWxpbmcgbGlzdApsaW51eC1hcm0t a2VybmVsQGxpc3RzLmluZnJhZGVhZC5vcmcKaHR0cDovL2xpc3RzLmluZnJhZGVhZC5vcmcvbWFp bG1hbi9saXN0aW5mby9saW51eC1hcm0ta2VybmVsCg==