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.3 required=3.0 tests=DKIM_SIGNED,DKIM_VALID, DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS,MAILING_LIST_MULTI,SPF_HELO_NONE, SPF_PASS,URIBL_BLOCKED,USER_AGENT_SANE_1 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 D89BEC2D0ED for ; Fri, 27 Mar 2020 16:24:30 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 5E24620658 for ; Fri, 27 Mar 2020 16:24:30 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (1024-bit key) header.d=softiron.com header.i=@softiron.com header.b="WQ+snlQr" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727444AbgC0QYa (ORCPT ); Fri, 27 Mar 2020 12:24:30 -0400 Received: from smtp100.iad3b.emailsrvr.com ([146.20.161.100]:56648 "EHLO smtp100.iad3b.emailsrvr.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726333AbgC0QY3 (ORCPT ); Fri, 27 Mar 2020 12:24:29 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=softiron.com; s=20191119-3p77dzn5; t=1585326267; bh=o9TxnCZztVH45jTet9PtyCOS7Am3+B7w1VhSx1p0HDU=; h=Subject:To:From:Date:From; b=WQ+snlQrIw3mg57cliJQl38uPDMF3IL4TqiU8oEYWDsHAC4Uqz7YjplBAYOKdJRFV gsq/4jVX/66FiFNp3BePYAkFdsmiubW20dM+IggJRBrbN1iUiHhAYdzvk7yPLaZBif 23+T+Wd5RO/R5xiEAD5mcZ+ydgcygGJ98ilyCYdc= X-Auth-ID: alan@softiron.com Received: by smtp21.relay.iad3b.emailsrvr.com (Authenticated sender: alan-AT-softiron.com) with ESMTPSA id DD85E200C3; Fri, 27 Mar 2020 12:24:26 -0400 (EDT) X-Sender-Id: alan@softiron.com Received: from [10.1.1.115] (99-117-187-177.lightspeed.dybhfl.sbcglobal.net [99.117.187.177]) (using TLSv1.2 with cipher DHE-RSA-AES128-SHA) by 0.0.0.0:465 (trex/5.7.12); Fri, 27 Mar 2020 12:24:27 -0400 Subject: Re: pinctrl states vs pinmux vs gpio (i2c bus recovery) To: Ludovic.Desroches@microchip.com, linux@armlinux.org.uk, linus.walleij@linaro.org Cc: kamel.bouhara@bootlin.com, wsa@the-dreams.de, linux-gpio@vger.kernel.org, Codrin.Ciubotariu@microchip.com, linux-arm-kernel@lists.infradead.org References: <20191206173343.GX25745@shell.armlinux.org.uk> <20191213002010.GO25745@shell.armlinux.org.uk> <1ca5d81d-5aa9-8f8d-8731-4d34de9c6bfa@softiron.com> <4f9bb480-ba8d-b70e-961b-d6032232d250@softiron.com> <538ed844-4be1-4bda-a198-8b5706ee818b@microchip.com> <4ad49369-ec70-4452-2149-85b877a1c371@microchip.com> From: Alan Ott Message-ID: <8774c911-7feb-eca5-f4dc-c4b6c6f0021b@softiron.com> Date: Fri, 27 Mar 2020 12:24:26 -0400 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:68.0) Gecko/20100101 Thunderbird/68.4.1 MIME-Version: 1.0 In-Reply-To: <4ad49369-ec70-4452-2149-85b877a1c371@microchip.com> Content-Type: text/plain; charset=utf-8; format=flowed Content-Language: en-US Content-Transfer-Encoding: 8bit X-Classification-ID: e6538fcf-427e-4710-9f26-4128ca35a29a-1-1 Sender: linux-gpio-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-gpio@vger.kernel.org On 3/26/20 4:39 PM, Ludovic.Desroches@microchip.com wrote: > On 3/26/2020 4:55 PM, Alan Ott wrote: >> EXTERNAL EMAIL: Do not click links or open attachments unless you know >> the content is safe >> >> On 3/26/20 2:53 AM, Ludovic.Desroches@microchip.com wrote: >>> On 3/25/2020 10:09 PM, Alan Ott wrote: >>>> EXTERNAL EMAIL: Do not click links or open attachments unless you know >>>> the content is safe >>>> >>>> On 3/25/20 4:06 PM, Ludovic.Desroches@microchip.com wrote: >>>>> On 3/25/2020 1:42 PM, Alan Ott wrote: >>>>>> EXTERNAL EMAIL: Do not click links or open attachments unless you know >>>>>> the content is safe >>>>>> >>>>>> On 2/27/20 11:47 AM, Alan Ott wrote: >>>>>>> On 12/12/19 7:20 PM, Russell King - ARM Linux admin wrote: >>>>>>>> On Mon, Dec 09, 2019 at 01:20:15AM +0100, Linus Walleij wrote: >>>>>>>>> Hi Russell, >>>>>>>>> >>>>>>>>> very nice description of this dual-mode problem. >>>>>>>>> >>>>>>>>> I wish I had a simple and elegant way we could make it >>>>>>>>> unambiguous and simple to use ... but it beats me right >>>>>>>>> now. >>>>>>>>> >>>>>>>>> On Fri, Dec 6, 2019 at 6:33 PM Russell King - ARM Linux admin >>>>>>>>> wrote: >>>>>>>>> >>>>>>>>>> One may expect: >>>>>>>>>> >>>>>>>>>>            pinctrl_select_state(i2c_imx->pinctrl, >>>>>>>>>> i2c_imx->pinctrl_pins_default); >>>>>>>>>> >>>>>>>>>> to change them back to the default state, but that would be >>>>>>>>>> incorrect. >>>>>>>>>> The first thing that pinctrl_select_state() does is check whether >>>>>>>>>> >>>>>>>>>>            p->state == state >>>>>>>>>> >>>>>>>>>> which it will do, as the pinctrl layer hasn't been informed of the >>>>>>>>>> change that has happened behind its back at the pinmux level. >>>>>>>>> Some pin controllers have the .strict property set >>>>>>>>> in their struct pinmux_ops: >>>>>>>>> >>>>>>>>> * @strict: do not allow simultaneous use of the same pin for >>>>>>>>> GPIO and >>>>>>>>> another >>>>>>>>> *      function. Check both gpio_owner and mux_owner strictly >>>>>>>>> before >>>>>>>>> approving >>>>>>>>> *      the pin request. >>>>>>>>> >>>>>>>>> The non-strict pin controllers are those that actually allow GPIO >>>>>>>>> and device functions to be used on the same physical line at the >>>>>>>>> same time. In this case there is not special GPIO mode for the >>>>>>>>> line in some muxing registers, they are just physically connected >>>>>>>>> somehow. >>>>>>>>> >>>>>>>>> One usecase is sort of like how tcpdump work for >>>>>>>>> ethernet interfaces: a GPIO register can "snoop" on a pin while >>>>>>>>> in used by another device. >>>>>>>>> >>>>>>>>> But it would notably also allow you to drive the line and interfere >>>>>>>>> with the device. Which is exactly what this I2C recovery mechanism >>>>>>>>> does, just that its pin controller is actually strict, will not >>>>>>>>> allow >>>>>>>>> the same line to be used for GPIO and some other function at the >>>>>>>>> same time, so I suppose i.MX should probably explore the >>>>>>>>> strict mode. >>>>>>>>> >>>>>>>>> Enabling that will sadly make the problem MORE complex >>>>>>>>> for this I2C recovery, requiring a cycle of >>>>>>>>> gpiod_put()/gpiod_get() to get it released from GPIO mode, i.e. >>>>>>>>> we would need to just get the GPIO when this is strictly needed. >>>>>>>>> Using devm_gpiod_get() and keeping a reference descriptor >>>>>>>>> around would not work all of a sudden. >>>>>>>>> >>>>>>>>> I am thinking whether we can handle the non-strict controllers >>>>>>>>> in a more elegant way, or add some API to explicitly hand over >>>>>>>>> between device function and GPIO function. But I can't really >>>>>>>>> see some obvious solution. >>>>>>>> What I'm currently trying is (error handling removed for brevity): >>>>>>>> >>>>>>>>       struct i2c_bus_recovery_info *bri = &i2c->recovery; >>>>>>>> >>>>>>>>            i2c->pinctrl = devm_pinctrl_get(dev); >>>>>>>>            i2c->pinctrl_default = pinctrl_lookup_state(i2c->pinctrl, >>>>>>>> >>>>>>>> PINCTRL_STATE_DEFAULT); >>>>>>>>            i2c->pinctrl_recovery = >>>>>>>> pinctrl_lookup_state(i2c->pinctrl, >>>>>>>>                                "recovery"); >>>>>>>>            bri->sda_gpiod = devm_gpiod_get(dev, "sda", >>>>>>>> GPIOD_OUT_HIGH_OPEN_DRAIN); >>>>>>>>            bri->scl_gpiod = devm_gpiod_get(dev, "scl", >>>>>>>> GPIOD_OUT_HIGH_OPEN_DRAIN); >>>>>>>> >>>>>>>>       pinctrl_select_state(i2c->pinctrl, i2c->pinctrl_recovery); >>>>>>>>       return pinctrl_select_state(i2c->pinctrl, >>>>>>>> i2c->pinctrl_default); >>>>>>>> >>>>>>>> which seems good enough to get the pins back into i2c mode after the >>>>>>>> gpios are obtained.  Then we switch the pinctrl state between >>>>>>>> pinctrl_recovery and pinctrl_default as we have need to. >>>>>>>> >>>>>>>> The problem is, the generic i2c bus recovery code wants the gpiod >>>>>>>> descriptors to be setup and inplace by the time i2c_init_recovery() >>>>>>>> is called (which is called when the adapter is registered) so >>>>>>>> holding off until we need to do recovery doesn't work. >>>>>>>> >>>>>>>> This seems to work for this SoC I'm currently working with, but I >>>>>>>> think there's more on the horizon - I'm having the same problems >>>>>>>> on another SoC which also needs bus recovery implemented, and as >>>>>>>> the problem device is behind an I2C bus mux, when it locks the I2C >>>>>>>> bus, it kills all I2C buses rooted at that particular SoC I2C >>>>>>>> controller.  However, there's a problem - the pinctrls for that SoC >>>>>>>> are set by ROM firmware at boot time by reading a table from the >>>>>>>> boot media.  *Unprintables about firmware being too way >>>>>>>> limiting*. :p >>>>>>>> >>>>>>    > >>>>>>> Hi all, what's the current state of this? I can confirm that this is >>>>>>> broken with the at91 i2c controller's recovery mode[1], which is >>>>>>> implemented exactly the same as other i2c master recovery modes, so I >>>>>>> suspect them to be broken as well. >>>>>>> >>>>>>> I'm using 5.5.6 with this patch applied (which adds the recovery): >>>>>>>        https://patchwork.kernel.org/cover/11333883/ >>>>>>> >>>>>>> It worked fine with 5.2, but has now broken, the way Russell >>>>>>> describes, >>>>>>> in 5.5.6 and also on the latest 5.6-rc3. Russell's suggested >>>>>>> workaround >>>>>>> of setting the pinctrl to recovery (gpio) and then back to default >>>>>>> does >>>>>>> make it work. >>>>>>> >>>>>>> Alan. >>>>>>> >>>>>>> [1] currently the patch for i2c recovery for at91 is accepted to >>>>>>> Wolfram >>>>>>> Sang's for-next tree. >>>>>>> >>>>>> >>>>>> Is there any word on this? >>>>>> >>>>> >>>>> Internally we have managed it in the same way as the one suggested by >>>>> Russell. >>>>> >>>>> We wondered if we should mainline it or not as it's really tricky to >>>>> proceed like this. >>>> >>>> Certainly it needs to work in mainline though, right? Not just in the >>>> linux4sam vendor kernel? >>> >>> It has been fixed two days ago. We'll send it and see if it will be >>> accepted. >>> >>> By the way, with which SoC have you encountered this issue? It is of >>> intereset as we have two different pin controllers. >> >> SAMA5D33 >> > > Ok, thanks. > >>> >>>> >>>>> >>>>> In the future, we may declare our pinctrl as strict which should cause >>>>> another breakage... It's not done yet because when I tried to do it, >>>>> maybe it has changed now, I was not able to apply the pin configuration >>>>> to the pin muxed as a gpio. >>>>> >>>> >>>> The larger question I think is, is this a breakage in gpio? i2c-at91 is >>>> not the only i2c driver which uses gpio-based bus recovery, and many of >>>> them use nearly the exact same code as i2c-at91. Are they all broken >>>> with this kernel update too? >>>> >>> >>> I don't know what changed in gpio or pinctrl. Thinking more about it >>> I'am surprised it had worked. In my mind, gpiod_get has always ended >>> with a call to the gpio_request_enable operation so changing the mux to >>> a gpio function. >> >> I definitely did an A/B test with 5.2 and 5.5 before writing the email, >> and I also definitely traced it down to devm_gpiod_get() (ie: leave all >> the rest and take those two lines out in 5.5, and that made it not fail). >> > > If I have well understood, in 5.5 you kept devm_gpiod_get() calls > without the recovery stuff and it works. Isn't it? No, it's what I said higher up in the email: * 5.2 plus the recovery patch linked above does work. * 5.5 plus the recovery patch linked above does not work[1]. * 5.5 plus the recovery patch linked above plus a "fix" similar to Russell's does work. > >> Again, other i2c controllers are built the exact same way, with a >> handful of them using the same copied/pasted code. I suspect they are >> broken too (when gpio bus recovery is enabled). If they're not, then >> does it mean devm_gpiod_get() works differently on different CPUs? >> > > devm_gpiod_get() calls gpio_request or gpio_request_enable ops which are > implemented in the pin controller so the behavior can be different. > Are you asserting that, based on the controller,: * Sometimes gpiod_get() adjusts the pinmux, and * Sometimes gpiod_get() doesn't adjust the pinmux? Whatever it is, it appears that the behavior has changed for SAMA5D3 between 5.2 and 5.5, and it makes the patch set (linked above) that's currently in Wolfram's for-next tree no longer work properly. Alan. [1] And "doesn't work" means, nothing in the i2c controller works because the pinctrl is set to gpio rather than to the i2c controller. 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=DKIMWL_WL_HIGH,DKIM_SIGNED, DKIM_VALID,HEADER_FROM_DIFFERENT_DOMAINS,MAILING_LIST_MULTI,SPF_HELO_NONE, SPF_PASS,URIBL_BLOCKED,USER_AGENT_SANE_1 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 C3034C43331 for ; Fri, 27 Mar 2020 16:24:43 +0000 (UTC) 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 mail.kernel.org (Postfix) with ESMTPS id 80AF620658 for ; Fri, 27 Mar 2020 16:24:43 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=lists.infradead.org header.i=@lists.infradead.org header.b="fQX/PqNQ"; dkim=fail reason="signature verification failed" (1024-bit key) header.d=softiron.com header.i=@softiron.com header.b="WQ+snlQr" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 80AF620658 Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=softiron.com Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=linux-arm-kernel-bounces+infradead-linux-arm-kernel=archiver.kernel.org@lists.infradead.org DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20170209; h=Sender:Content-Type: Content-Transfer-Encoding:Cc:List-Subscribe:List-Help:List-Post:List-Archive: List-Unsubscribe:List-Id:In-Reply-To:MIME-Version:Date:Message-ID:From: References:To:Subject:Reply-To:Content-ID:Content-Description:Resent-Date: Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:List-Owner; bh=GPZR0iIpoNdrnHZ1MKJGInIuk+nGJT2YutiMYZcwnpQ=; b=fQX/PqNQaACCAcCTQrCrNE0M6 /9+W/mrmQlKFcLvQVGX5y7nYQKh4g7H/or43UFmfasIIJJoz309SchZaS8cEhdCLfoa+uFzJNtib7 F/Sl24p/KRKHmf51Yo0fCwyJjX91FTY1iXBZNt2oQ0CNMrQoSojxSAja3PwM5fqDhXPrw36kFYb56 127istkRuk34UlZ1//n6x+vlNWK7im8wsvUtlCreCrc5De13YxpDo6rb55C/mm2iM+23m3m7rB3H7 Zhm4mnHJEPTs1/K6C19yEyX8nWBUJW645QuIIZDUC6bzdJ3uSmiIErv1g2mCCgjb7y91h95h28hRm 8lPw5yXBQ==; Received: from localhost ([127.0.0.1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.92.3 #3 (Red Hat Linux)) id 1jHrmh-0000Zz-Fr; Fri, 27 Mar 2020 16:24:39 +0000 Received: from smtp101.iad3b.emailsrvr.com ([146.20.161.101]) by bombadil.infradead.org with esmtps (Exim 4.92.3 #3 (Red Hat Linux)) id 1jHrmd-0000ZB-Ak for linux-arm-kernel@lists.infradead.org; Fri, 27 Mar 2020 16:24:37 +0000 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=softiron.com; s=20191119-3p77dzn5; t=1585326267; bh=o9TxnCZztVH45jTet9PtyCOS7Am3+B7w1VhSx1p0HDU=; h=Subject:To:From:Date:From; b=WQ+snlQrIw3mg57cliJQl38uPDMF3IL4TqiU8oEYWDsHAC4Uqz7YjplBAYOKdJRFV gsq/4jVX/66FiFNp3BePYAkFdsmiubW20dM+IggJRBrbN1iUiHhAYdzvk7yPLaZBif 23+T+Wd5RO/R5xiEAD5mcZ+ydgcygGJ98ilyCYdc= X-Auth-ID: alan@softiron.com Received: by smtp21.relay.iad3b.emailsrvr.com (Authenticated sender: alan-AT-softiron.com) with ESMTPSA id DD85E200C3; Fri, 27 Mar 2020 12:24:26 -0400 (EDT) X-Sender-Id: alan@softiron.com Received: from [10.1.1.115] (99-117-187-177.lightspeed.dybhfl.sbcglobal.net [99.117.187.177]) (using TLSv1.2 with cipher DHE-RSA-AES128-SHA) by 0.0.0.0:465 (trex/5.7.12); Fri, 27 Mar 2020 12:24:27 -0400 Subject: Re: pinctrl states vs pinmux vs gpio (i2c bus recovery) To: Ludovic.Desroches@microchip.com, linux@armlinux.org.uk, linus.walleij@linaro.org References: <20191206173343.GX25745@shell.armlinux.org.uk> <20191213002010.GO25745@shell.armlinux.org.uk> <1ca5d81d-5aa9-8f8d-8731-4d34de9c6bfa@softiron.com> <4f9bb480-ba8d-b70e-961b-d6032232d250@softiron.com> <538ed844-4be1-4bda-a198-8b5706ee818b@microchip.com> <4ad49369-ec70-4452-2149-85b877a1c371@microchip.com> From: Alan Ott Message-ID: <8774c911-7feb-eca5-f4dc-c4b6c6f0021b@softiron.com> Date: Fri, 27 Mar 2020 12:24:26 -0400 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:68.0) Gecko/20100101 Thunderbird/68.4.1 MIME-Version: 1.0 In-Reply-To: <4ad49369-ec70-4452-2149-85b877a1c371@microchip.com> Content-Language: en-US X-Classification-ID: e6538fcf-427e-4710-9f26-4128ca35a29a-1-1 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20200327_092435_638657_8D09C960 X-CRM114-Status: GOOD ( 35.22 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: kamel.bouhara@bootlin.com, linux-gpio@vger.kernel.org, Codrin.Ciubotariu@microchip.com, linux-arm-kernel@lists.infradead.org, wsa@the-dreams.de Content-Transfer-Encoding: base64 Content-Type: text/plain; charset="utf-8"; Format="flowed" Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+infradead-linux-arm-kernel=archiver.kernel.org@lists.infradead.org T24gMy8yNi8yMCA0OjM5IFBNLCBMdWRvdmljLkRlc3JvY2hlc0BtaWNyb2NoaXAuY29tIHdyb3Rl Ogo+IE9uIDMvMjYvMjAyMCA0OjU1IFBNLCBBbGFuIE90dCB3cm90ZToKPj4gRVhURVJOQUwgRU1B SUw6IERvIG5vdCBjbGljayBsaW5rcyBvciBvcGVuIGF0dGFjaG1lbnRzIHVubGVzcyB5b3Uga25v dwo+PiB0aGUgY29udGVudCBpcyBzYWZlCj4+Cj4+IE9uIDMvMjYvMjAgMjo1MyBBTSwgTHVkb3Zp Yy5EZXNyb2NoZXNAbWljcm9jaGlwLmNvbSB3cm90ZToKPj4+IE9uIDMvMjUvMjAyMCAxMDowOSBQ TSwgQWxhbiBPdHQgd3JvdGU6Cj4+Pj4gRVhURVJOQUwgRU1BSUw6IERvIG5vdCBjbGljayBsaW5r cyBvciBvcGVuIGF0dGFjaG1lbnRzIHVubGVzcyB5b3Uga25vdwo+Pj4+IHRoZSBjb250ZW50IGlz IHNhZmUKPj4+Pgo+Pj4+IE9uIDMvMjUvMjAgNDowNiBQTSwgTHVkb3ZpYy5EZXNyb2NoZXNAbWlj cm9jaGlwLmNvbSB3cm90ZToKPj4+Pj4gT24gMy8yNS8yMDIwIDE6NDIgUE0sIEFsYW4gT3R0IHdy b3RlOgo+Pj4+Pj4gRVhURVJOQUwgRU1BSUw6IERvIG5vdCBjbGljayBsaW5rcyBvciBvcGVuIGF0 dGFjaG1lbnRzIHVubGVzcyB5b3Uga25vdwo+Pj4+Pj4gdGhlIGNvbnRlbnQgaXMgc2FmZQo+Pj4+ Pj4KPj4+Pj4+IE9uIDIvMjcvMjAgMTE6NDcgQU0sIEFsYW4gT3R0IHdyb3RlOgo+Pj4+Pj4+IE9u IDEyLzEyLzE5IDc6MjAgUE0sIFJ1c3NlbGwgS2luZyAtIEFSTSBMaW51eCBhZG1pbiB3cm90ZToK Pj4+Pj4+Pj4gT24gTW9uLCBEZWMgMDksIDIwMTkgYXQgMDE6MjA6MTVBTSArMDEwMCwgTGludXMg V2FsbGVpaiB3cm90ZToKPj4+Pj4+Pj4+IEhpIFJ1c3NlbGwsCj4+Pj4+Pj4+Pgo+Pj4+Pj4+Pj4g dmVyeSBuaWNlIGRlc2NyaXB0aW9uIG9mIHRoaXMgZHVhbC1tb2RlIHByb2JsZW0uCj4+Pj4+Pj4+ Pgo+Pj4+Pj4+Pj4gSSB3aXNoIEkgaGFkIGEgc2ltcGxlIGFuZCBlbGVnYW50IHdheSB3ZSBjb3Vs ZCBtYWtlIGl0Cj4+Pj4+Pj4+PiB1bmFtYmlndW91cyBhbmQgc2ltcGxlIHRvIHVzZSAuLi4gYnV0 IGl0IGJlYXRzIG1lIHJpZ2h0Cj4+Pj4+Pj4+PiBub3cuCj4+Pj4+Pj4+Pgo+Pj4+Pj4+Pj4gT24g RnJpLCBEZWMgNiwgMjAxOSBhdCA2OjMzIFBNIFJ1c3NlbGwgS2luZyAtIEFSTSBMaW51eCBhZG1p bgo+Pj4+Pj4+Pj4gPGxpbnV4QGFybWxpbnV4Lm9yZy51az4gd3JvdGU6Cj4+Pj4+Pj4+Pgo+Pj4+ Pj4+Pj4+IE9uZSBtYXkgZXhwZWN0Ogo+Pj4+Pj4+Pj4+Cj4+Pj4+Pj4+Pj4gIMKgwqDCoMKgwqDC oMKgwqDCoMKgIHBpbmN0cmxfc2VsZWN0X3N0YXRlKGkyY19pbXgtPnBpbmN0cmwsCj4+Pj4+Pj4+ Pj4gaTJjX2lteC0+cGluY3RybF9waW5zX2RlZmF1bHQpOwo+Pj4+Pj4+Pj4+Cj4+Pj4+Pj4+Pj4g dG8gY2hhbmdlIHRoZW0gYmFjayB0byB0aGUgZGVmYXVsdCBzdGF0ZSwgYnV0IHRoYXQgd291bGQg YmUKPj4+Pj4+Pj4+PiBpbmNvcnJlY3QuCj4+Pj4+Pj4+Pj4gVGhlIGZpcnN0IHRoaW5nIHRoYXQg cGluY3RybF9zZWxlY3Rfc3RhdGUoKSBkb2VzIGlzIGNoZWNrIHdoZXRoZXIKPj4+Pj4+Pj4+Pgo+ Pj4+Pj4+Pj4+ICDCoMKgwqDCoMKgwqDCoMKgwqDCoCBwLT5zdGF0ZSA9PSBzdGF0ZQo+Pj4+Pj4+ Pj4+Cj4+Pj4+Pj4+Pj4gd2hpY2ggaXQgd2lsbCBkbywgYXMgdGhlIHBpbmN0cmwgbGF5ZXIgaGFz bid0IGJlZW4gaW5mb3JtZWQgb2YgdGhlCj4+Pj4+Pj4+Pj4gY2hhbmdlIHRoYXQgaGFzIGhhcHBl bmVkIGJlaGluZCBpdHMgYmFjayBhdCB0aGUgcGlubXV4IGxldmVsLgo+Pj4+Pj4+Pj4gU29tZSBw aW4gY29udHJvbGxlcnMgaGF2ZSB0aGUgLnN0cmljdCBwcm9wZXJ0eSBzZXQKPj4+Pj4+Pj4+IGlu IHRoZWlyIHN0cnVjdCBwaW5tdXhfb3BzOgo+Pj4+Pj4+Pj4KPj4+Pj4+Pj4+ICogQHN0cmljdDog ZG8gbm90IGFsbG93IHNpbXVsdGFuZW91cyB1c2Ugb2YgdGhlIHNhbWUgcGluIGZvcgo+Pj4+Pj4+ Pj4gR1BJTyBhbmQKPj4+Pj4+Pj4+IGFub3RoZXIKPj4+Pj4+Pj4+ICrCoMKgwqDCoMKgIGZ1bmN0 aW9uLiBDaGVjayBib3RoIGdwaW9fb3duZXIgYW5kIG11eF9vd25lciBzdHJpY3RseQo+Pj4+Pj4+ Pj4gYmVmb3JlCj4+Pj4+Pj4+PiBhcHByb3ZpbmcKPj4+Pj4+Pj4+ICrCoMKgwqDCoMKgIHRoZSBw aW4gcmVxdWVzdC4KPj4+Pj4+Pj4+Cj4+Pj4+Pj4+PiBUaGUgbm9uLXN0cmljdCBwaW4gY29udHJv bGxlcnMgYXJlIHRob3NlIHRoYXQgYWN0dWFsbHkgYWxsb3cgR1BJTwo+Pj4+Pj4+Pj4gYW5kIGRl dmljZSBmdW5jdGlvbnMgdG8gYmUgdXNlZCBvbiB0aGUgc2FtZSBwaHlzaWNhbCBsaW5lIGF0IHRo ZQo+Pj4+Pj4+Pj4gc2FtZSB0aW1lLiBJbiB0aGlzIGNhc2UgdGhlcmUgaXMgbm90IHNwZWNpYWwg R1BJTyBtb2RlIGZvciB0aGUKPj4+Pj4+Pj4+IGxpbmUgaW4gc29tZSBtdXhpbmcgcmVnaXN0ZXJz LCB0aGV5IGFyZSBqdXN0IHBoeXNpY2FsbHkgY29ubmVjdGVkCj4+Pj4+Pj4+PiBzb21laG93Lgo+ Pj4+Pj4+Pj4KPj4+Pj4+Pj4+IE9uZSB1c2VjYXNlIGlzIHNvcnQgb2YgbGlrZSBob3cgdGNwZHVt cCB3b3JrIGZvcgo+Pj4+Pj4+Pj4gZXRoZXJuZXQgaW50ZXJmYWNlczogYSBHUElPIHJlZ2lzdGVy IGNhbiAic25vb3AiIG9uIGEgcGluIHdoaWxlCj4+Pj4+Pj4+PiBpbiB1c2VkIGJ5IGFub3RoZXIg ZGV2aWNlLgo+Pj4+Pj4+Pj4KPj4+Pj4+Pj4+IEJ1dCBpdCB3b3VsZCBub3RhYmx5IGFsc28gYWxs b3cgeW91IHRvIGRyaXZlIHRoZSBsaW5lIGFuZCBpbnRlcmZlcmUKPj4+Pj4+Pj4+IHdpdGggdGhl IGRldmljZS4gV2hpY2ggaXMgZXhhY3RseSB3aGF0IHRoaXMgSTJDIHJlY292ZXJ5IG1lY2hhbmlz bQo+Pj4+Pj4+Pj4gZG9lcywganVzdCB0aGF0IGl0cyBwaW4gY29udHJvbGxlciBpcyBhY3R1YWxs eSBzdHJpY3QsIHdpbGwgbm90Cj4+Pj4+Pj4+PiBhbGxvdwo+Pj4+Pj4+Pj4gdGhlIHNhbWUgbGlu ZSB0byBiZSB1c2VkIGZvciBHUElPIGFuZCBzb21lIG90aGVyIGZ1bmN0aW9uIGF0IHRoZQo+Pj4+ Pj4+Pj4gc2FtZSB0aW1lLCBzbyBJIHN1cHBvc2UgaS5NWCBzaG91bGQgcHJvYmFibHkgZXhwbG9y ZSB0aGUKPj4+Pj4+Pj4+IHN0cmljdCBtb2RlLgo+Pj4+Pj4+Pj4KPj4+Pj4+Pj4+IEVuYWJsaW5n IHRoYXQgd2lsbCBzYWRseSBtYWtlIHRoZSBwcm9ibGVtIE1PUkUgY29tcGxleAo+Pj4+Pj4+Pj4g Zm9yIHRoaXMgSTJDIHJlY292ZXJ5LCByZXF1aXJpbmcgYSBjeWNsZSBvZgo+Pj4+Pj4+Pj4gZ3Bp b2RfcHV0KCkvZ3Bpb2RfZ2V0KCkgdG8gZ2V0IGl0IHJlbGVhc2VkIGZyb20gR1BJTyBtb2RlLCBp LmUuCj4+Pj4+Pj4+PiB3ZSB3b3VsZCBuZWVkIHRvIGp1c3QgZ2V0IHRoZSBHUElPIHdoZW4gdGhp cyBpcyBzdHJpY3RseSBuZWVkZWQuCj4+Pj4+Pj4+PiBVc2luZyBkZXZtX2dwaW9kX2dldCgpIGFu ZCBrZWVwaW5nIGEgcmVmZXJlbmNlIGRlc2NyaXB0b3IKPj4+Pj4+Pj4+IGFyb3VuZCB3b3VsZCBu b3Qgd29yayBhbGwgb2YgYSBzdWRkZW4uCj4+Pj4+Pj4+Pgo+Pj4+Pj4+Pj4gSSBhbSB0aGlua2lu ZyB3aGV0aGVyIHdlIGNhbiBoYW5kbGUgdGhlIG5vbi1zdHJpY3QgY29udHJvbGxlcnMKPj4+Pj4+ Pj4+IGluIGEgbW9yZSBlbGVnYW50IHdheSwgb3IgYWRkIHNvbWUgQVBJIHRvIGV4cGxpY2l0bHkg aGFuZCBvdmVyCj4+Pj4+Pj4+PiBiZXR3ZWVuIGRldmljZSBmdW5jdGlvbiBhbmQgR1BJTyBmdW5j dGlvbi4gQnV0IEkgY2FuJ3QgcmVhbGx5Cj4+Pj4+Pj4+PiBzZWUgc29tZSBvYnZpb3VzIHNvbHV0 aW9uLgo+Pj4+Pj4+PiBXaGF0IEknbSBjdXJyZW50bHkgdHJ5aW5nIGlzIChlcnJvciBoYW5kbGlu ZyByZW1vdmVkIGZvciBicmV2aXR5KToKPj4+Pj4+Pj4KPj4+Pj4+Pj4gIMKgwqDCoMKgwqAgc3Ry dWN0IGkyY19idXNfcmVjb3ZlcnlfaW5mbyAqYnJpID0gJmkyYy0+cmVjb3Zlcnk7Cj4+Pj4+Pj4+ Cj4+Pj4+Pj4+ICDCoMKgwqDCoMKgwqDCoMKgwqDCoCBpMmMtPnBpbmN0cmwgPSBkZXZtX3BpbmN0 cmxfZ2V0KGRldik7Cj4+Pj4+Pj4+ICDCoMKgwqDCoMKgwqDCoMKgwqDCoCBpMmMtPnBpbmN0cmxf ZGVmYXVsdCA9IHBpbmN0cmxfbG9va3VwX3N0YXRlKGkyYy0+cGluY3RybCwKPj4+Pj4+Pj4KPj4+ Pj4+Pj4gUElOQ1RSTF9TVEFURV9ERUZBVUxUKTsKPj4+Pj4+Pj4gIMKgwqDCoMKgwqDCoMKgwqDC oMKgIGkyYy0+cGluY3RybF9yZWNvdmVyeSA9Cj4+Pj4+Pj4+IHBpbmN0cmxfbG9va3VwX3N0YXRl KGkyYy0+cGluY3RybCwKPj4+Pj4+Pj4gIMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCAicmVjb3ZlcnkiKTsKPj4+Pj4+Pj4gIMKgwqDC oMKgwqDCoMKgwqDCoMKgIGJyaS0+c2RhX2dwaW9kID0gZGV2bV9ncGlvZF9nZXQoZGV2LCAic2Rh IiwKPj4+Pj4+Pj4gR1BJT0RfT1VUX0hJR0hfT1BFTl9EUkFJTik7Cj4+Pj4+Pj4+ICDCoMKgwqDC oMKgwqDCoMKgwqDCoCBicmktPnNjbF9ncGlvZCA9IGRldm1fZ3Bpb2RfZ2V0KGRldiwgInNjbCIs Cj4+Pj4+Pj4+IEdQSU9EX09VVF9ISUdIX09QRU5fRFJBSU4pOwo+Pj4+Pj4+Pgo+Pj4+Pj4+PiAg wqDCoMKgwqDCoCBwaW5jdHJsX3NlbGVjdF9zdGF0ZShpMmMtPnBpbmN0cmwsIGkyYy0+cGluY3Ry bF9yZWNvdmVyeSk7Cj4+Pj4+Pj4+ICDCoMKgwqDCoMKgIHJldHVybiBwaW5jdHJsX3NlbGVjdF9z dGF0ZShpMmMtPnBpbmN0cmwsCj4+Pj4+Pj4+IGkyYy0+cGluY3RybF9kZWZhdWx0KTsKPj4+Pj4+ Pj4KPj4+Pj4+Pj4gd2hpY2ggc2VlbXMgZ29vZCBlbm91Z2ggdG8gZ2V0IHRoZSBwaW5zIGJhY2sg aW50byBpMmMgbW9kZSBhZnRlciB0aGUKPj4+Pj4+Pj4gZ3Bpb3MgYXJlIG9idGFpbmVkLsKgIFRo ZW4gd2Ugc3dpdGNoIHRoZSBwaW5jdHJsIHN0YXRlIGJldHdlZW4KPj4+Pj4+Pj4gcGluY3RybF9y ZWNvdmVyeSBhbmQgcGluY3RybF9kZWZhdWx0IGFzIHdlIGhhdmUgbmVlZCB0by4KPj4+Pj4+Pj4K Pj4+Pj4+Pj4gVGhlIHByb2JsZW0gaXMsIHRoZSBnZW5lcmljIGkyYyBidXMgcmVjb3ZlcnkgY29k ZSB3YW50cyB0aGUgZ3Bpb2QKPj4+Pj4+Pj4gZGVzY3JpcHRvcnMgdG8gYmUgc2V0dXAgYW5kIGlu cGxhY2UgYnkgdGhlIHRpbWUgaTJjX2luaXRfcmVjb3ZlcnkoKQo+Pj4+Pj4+PiBpcyBjYWxsZWQg KHdoaWNoIGlzIGNhbGxlZCB3aGVuIHRoZSBhZGFwdGVyIGlzIHJlZ2lzdGVyZWQpIHNvCj4+Pj4+ Pj4+IGhvbGRpbmcgb2ZmIHVudGlsIHdlIG5lZWQgdG8gZG8gcmVjb3ZlcnkgZG9lc24ndCB3b3Jr Lgo+Pj4+Pj4+Pgo+Pj4+Pj4+PiBUaGlzIHNlZW1zIHRvIHdvcmsgZm9yIHRoaXMgU29DIEknbSBj dXJyZW50bHkgd29ya2luZyB3aXRoLCBidXQgSQo+Pj4+Pj4+PiB0aGluayB0aGVyZSdzIG1vcmUg b24gdGhlIGhvcml6b24gLSBJJ20gaGF2aW5nIHRoZSBzYW1lIHByb2JsZW1zCj4+Pj4+Pj4+IG9u IGFub3RoZXIgU29DIHdoaWNoIGFsc28gbmVlZHMgYnVzIHJlY292ZXJ5IGltcGxlbWVudGVkLCBh bmQgYXMKPj4+Pj4+Pj4gdGhlIHByb2JsZW0gZGV2aWNlIGlzIGJlaGluZCBhbiBJMkMgYnVzIG11 eCwgd2hlbiBpdCBsb2NrcyB0aGUgSTJDCj4+Pj4+Pj4+IGJ1cywgaXQga2lsbHMgYWxsIEkyQyBi dXNlcyByb290ZWQgYXQgdGhhdCBwYXJ0aWN1bGFyIFNvQyBJMkMKPj4+Pj4+Pj4gY29udHJvbGxl ci7CoCBIb3dldmVyLCB0aGVyZSdzIGEgcHJvYmxlbSAtIHRoZSBwaW5jdHJscyBmb3IgdGhhdCBT b0MKPj4+Pj4+Pj4gYXJlIHNldCBieSBST00gZmlybXdhcmUgYXQgYm9vdCB0aW1lIGJ5IHJlYWRp bmcgYSB0YWJsZSBmcm9tIHRoZQo+Pj4+Pj4+PiBib290IG1lZGlhLsKgICpVbnByaW50YWJsZXMg YWJvdXQgZmlybXdhcmUgYmVpbmcgdG9vIHdheQo+Pj4+Pj4+PiBsaW1pdGluZyouIDpwCj4+Pj4+ Pj4+Cj4+Pj4+PiAgwqDCoCA+Cj4+Pj4+Pj4gSGkgYWxsLCB3aGF0J3MgdGhlIGN1cnJlbnQgc3Rh dGUgb2YgdGhpcz8gSSBjYW4gY29uZmlybSB0aGF0IHRoaXMgaXMKPj4+Pj4+PiBicm9rZW4gd2l0 aCB0aGUgYXQ5MSBpMmMgY29udHJvbGxlcidzIHJlY292ZXJ5IG1vZGVbMV0sIHdoaWNoIGlzCj4+ Pj4+Pj4gaW1wbGVtZW50ZWQgZXhhY3RseSB0aGUgc2FtZSBhcyBvdGhlciBpMmMgbWFzdGVyIHJl Y292ZXJ5IG1vZGVzLCBzbyBJCj4+Pj4+Pj4gc3VzcGVjdCB0aGVtIHRvIGJlIGJyb2tlbiBhcyB3 ZWxsLgo+Pj4+Pj4+Cj4+Pj4+Pj4gSSdtIHVzaW5nIDUuNS42IHdpdGggdGhpcyBwYXRjaCBhcHBs aWVkICh3aGljaCBhZGRzIHRoZSByZWNvdmVyeSk6Cj4+Pj4+Pj4gIMKgwqDCoMKgwqDCoCBodHRw czovL3BhdGNod29yay5rZXJuZWwub3JnL2NvdmVyLzExMzMzODgzLwo+Pj4+Pj4+Cj4+Pj4+Pj4g SXQgd29ya2VkIGZpbmUgd2l0aCA1LjIsIGJ1dCBoYXMgbm93IGJyb2tlbiwgdGhlIHdheSBSdXNz ZWxsCj4+Pj4+Pj4gZGVzY3JpYmVzLAo+Pj4+Pj4+IGluIDUuNS42IGFuZCBhbHNvIG9uIHRoZSBs YXRlc3QgNS42LXJjMy4gUnVzc2VsbCdzIHN1Z2dlc3RlZAo+Pj4+Pj4+IHdvcmthcm91bmQKPj4+ Pj4+PiBvZiBzZXR0aW5nIHRoZSBwaW5jdHJsIHRvIHJlY292ZXJ5IChncGlvKSBhbmQgdGhlbiBi YWNrIHRvIGRlZmF1bHQKPj4+Pj4+PiBkb2VzCj4+Pj4+Pj4gbWFrZSBpdCB3b3JrLgo+Pj4+Pj4+ Cj4+Pj4+Pj4gQWxhbi4KPj4+Pj4+Pgo+Pj4+Pj4+IFsxXSBjdXJyZW50bHkgdGhlIHBhdGNoIGZv ciBpMmMgcmVjb3ZlcnkgZm9yIGF0OTEgaXMgYWNjZXB0ZWQgdG8KPj4+Pj4+PiBXb2xmcmFtCj4+ Pj4+Pj4gU2FuZydzIGZvci1uZXh0IHRyZWUuCj4+Pj4+Pj4KPj4+Pj4+Cj4+Pj4+PiBJcyB0aGVy ZSBhbnkgd29yZCBvbiB0aGlzPwo+Pj4+Pj4KPj4+Pj4KPj4+Pj4gSW50ZXJuYWxseSB3ZSBoYXZl IG1hbmFnZWQgaXQgaW4gdGhlIHNhbWUgd2F5IGFzIHRoZSBvbmUgc3VnZ2VzdGVkIGJ5Cj4+Pj4+ IFJ1c3NlbGwuCj4+Pj4+Cj4+Pj4+IFdlIHdvbmRlcmVkIGlmIHdlIHNob3VsZCBtYWlubGluZSBp dCBvciBub3QgYXMgaXQncyByZWFsbHkgdHJpY2t5IHRvCj4+Pj4+IHByb2NlZWQgbGlrZSB0aGlz Lgo+Pj4+Cj4+Pj4gQ2VydGFpbmx5IGl0IG5lZWRzIHRvIHdvcmsgaW4gbWFpbmxpbmUgdGhvdWdo LCByaWdodD8gTm90IGp1c3QgaW4gdGhlCj4+Pj4gbGludXg0c2FtIHZlbmRvciBrZXJuZWw/Cj4+ Pgo+Pj4gSXQgaGFzIGJlZW4gZml4ZWQgdHdvIGRheXMgYWdvLiBXZSdsbCBzZW5kIGl0IGFuZCBz ZWUgaWYgaXQgd2lsbCBiZQo+Pj4gYWNjZXB0ZWQuCj4+Pgo+Pj4gQnkgdGhlIHdheSwgd2l0aCB3 aGljaCBTb0MgaGF2ZSB5b3UgZW5jb3VudGVyZWQgdGhpcyBpc3N1ZT8gSXQgaXMgb2YKPj4+IGlu dGVyZXNldCBhcyB3ZSBoYXZlIHR3byBkaWZmZXJlbnQgcGluIGNvbnRyb2xsZXJzLgo+Pgo+PiBT QU1BNUQzMwo+Pgo+IAo+IE9rLCB0aGFua3MuCj4gCj4+Pgo+Pj4+Cj4+Pj4+Cj4+Pj4+IEluIHRo ZSBmdXR1cmUsIHdlIG1heSBkZWNsYXJlIG91ciBwaW5jdHJsIGFzIHN0cmljdCB3aGljaCBzaG91 bGQgY2F1c2UKPj4+Pj4gYW5vdGhlciBicmVha2FnZS4uLiBJdCdzIG5vdCBkb25lIHlldCBiZWNh dXNlIHdoZW4gSSB0cmllZCB0byBkbyBpdCwKPj4+Pj4gbWF5YmUgaXQgaGFzIGNoYW5nZWQgbm93 LCBJIHdhcyBub3QgYWJsZSB0byBhcHBseSB0aGUgcGluIGNvbmZpZ3VyYXRpb24KPj4+Pj4gdG8g dGhlIHBpbiBtdXhlZCBhcyBhIGdwaW8uCj4+Pj4+Cj4+Pj4KPj4+PiBUaGUgbGFyZ2VyIHF1ZXN0 aW9uIEkgdGhpbmsgaXMsIGlzIHRoaXMgYSBicmVha2FnZSBpbiBncGlvPyBpMmMtYXQ5MSBpcwo+ Pj4+IG5vdCB0aGUgb25seSBpMmMgZHJpdmVyIHdoaWNoIHVzZXMgZ3Bpby1iYXNlZCBidXMgcmVj b3ZlcnksIGFuZCBtYW55IG9mCj4+Pj4gdGhlbSB1c2UgbmVhcmx5IHRoZSBleGFjdCBzYW1lIGNv ZGUgYXMgaTJjLWF0OTEuIEFyZSB0aGV5IGFsbCBicm9rZW4KPj4+PiB3aXRoIHRoaXMga2VybmVs IHVwZGF0ZSB0b28/Cj4+Pj4KPj4+Cj4+PiBJIGRvbid0IGtub3cgd2hhdCBjaGFuZ2VkIGluIGdw aW8gb3IgcGluY3RybC4gVGhpbmtpbmcgbW9yZSBhYm91dCBpdAo+Pj4gSSdhbSBzdXJwcmlzZWQg aXQgaGFkIHdvcmtlZC4gSW4gbXkgbWluZCwgZ3Bpb2RfZ2V0IGhhcyBhbHdheXMgZW5kZWQKPj4+ IHdpdGggYSBjYWxsIHRvIHRoZSBncGlvX3JlcXVlc3RfZW5hYmxlIG9wZXJhdGlvbiBzbyBjaGFu Z2luZyB0aGUgbXV4IHRvCj4+PiBhIGdwaW8gZnVuY3Rpb24uCj4+Cj4+IEkgZGVmaW5pdGVseSBk aWQgYW4gQS9CIHRlc3Qgd2l0aCA1LjIgYW5kIDUuNSBiZWZvcmUgd3JpdGluZyB0aGUgZW1haWws Cj4+IGFuZCBJIGFsc28gZGVmaW5pdGVseSB0cmFjZWQgaXQgZG93biB0byBkZXZtX2dwaW9kX2dl dCgpIChpZTogbGVhdmUgYWxsCj4+IHRoZSByZXN0IGFuZCB0YWtlIHRob3NlIHR3byBsaW5lcyBv dXQgaW4gNS41LCBhbmQgdGhhdCBtYWRlIGl0IG5vdCBmYWlsKS4KPj4KPiAKPiBJZiBJIGhhdmUg d2VsbCB1bmRlcnN0b29kLCBpbiA1LjUgeW91IGtlcHQgZGV2bV9ncGlvZF9nZXQoKSBjYWxscwo+ IHdpdGhvdXQgdGhlIHJlY292ZXJ5IHN0dWZmIGFuZCBpdCB3b3Jrcy4gSXNuJ3QgaXQ/CgpObywg aXQncyB3aGF0IEkgc2FpZCBoaWdoZXIgdXAgaW4gdGhlIGVtYWlsOgoKKiA1LjIgcGx1cyB0aGUg cmVjb3ZlcnkgcGF0Y2ggbGlua2VkIGFib3ZlIGRvZXMgd29yay4KKiA1LjUgcGx1cyB0aGUgcmVj b3ZlcnkgcGF0Y2ggbGlua2VkIGFib3ZlIGRvZXMgbm90IHdvcmtbMV0uCiogNS41IHBsdXMgdGhl IHJlY292ZXJ5IHBhdGNoIGxpbmtlZCBhYm92ZSBwbHVzIGEgImZpeCIgc2ltaWxhciB0byAKUnVz c2VsbCdzIGRvZXMgd29yay4KCj4gCj4+IEFnYWluLCBvdGhlciBpMmMgY29udHJvbGxlcnMgYXJl IGJ1aWx0IHRoZSBleGFjdCBzYW1lIHdheSwgd2l0aCBhCj4+IGhhbmRmdWwgb2YgdGhlbSB1c2lu ZyB0aGUgc2FtZSBjb3BpZWQvcGFzdGVkIGNvZGUuIEkgc3VzcGVjdCB0aGV5IGFyZQo+PiBicm9r ZW4gdG9vICh3aGVuIGdwaW8gYnVzIHJlY292ZXJ5IGlzIGVuYWJsZWQpLiBJZiB0aGV5J3JlIG5v dCwgdGhlbgo+PiBkb2VzIGl0IG1lYW4gZGV2bV9ncGlvZF9nZXQoKSB3b3JrcyBkaWZmZXJlbnRs eSBvbiBkaWZmZXJlbnQgQ1BVcz8KPj4KPiAKPiBkZXZtX2dwaW9kX2dldCgpIGNhbGxzIGdwaW9f cmVxdWVzdCBvciBncGlvX3JlcXVlc3RfZW5hYmxlIG9wcyB3aGljaCBhcmUKPiBpbXBsZW1lbnRl ZCBpbiB0aGUgcGluIGNvbnRyb2xsZXIgc28gdGhlIGJlaGF2aW9yIGNhbiBiZSBkaWZmZXJlbnQu Cj4gCgpBcmUgeW91IGFzc2VydGluZyB0aGF0LCBiYXNlZCBvbiB0aGUgY29udHJvbGxlciw6Ciog U29tZXRpbWVzIGdwaW9kX2dldCgpIGFkanVzdHMgdGhlIHBpbm11eCwgYW5kCiogU29tZXRpbWVz IGdwaW9kX2dldCgpIGRvZXNuJ3QgYWRqdXN0IHRoZSBwaW5tdXg/CgpXaGF0ZXZlciBpdCBpcywg aXQgYXBwZWFycyB0aGF0IHRoZSBiZWhhdmlvciBoYXMgY2hhbmdlZCBmb3IgU0FNQTVEMyAKYmV0 d2VlbiA1LjIgYW5kIDUuNSwgYW5kIGl0IG1ha2VzIHRoZSBwYXRjaCBzZXQgKGxpbmtlZCBhYm92 ZSkgdGhhdCdzIApjdXJyZW50bHkgaW4gV29sZnJhbSdzIGZvci1uZXh0IHRyZWUgbm8gbG9uZ2Vy IHdvcmsgcHJvcGVybHkuCgpBbGFuLgoKWzFdIEFuZCAiZG9lc24ndCB3b3JrIiBtZWFucywgbm90 aGluZyBpbiB0aGUgaTJjIGNvbnRyb2xsZXIgd29ya3MgCmJlY2F1c2UgdGhlIHBpbmN0cmwgaXMg c2V0IHRvIGdwaW8gcmF0aGVyIHRoYW4gdG8gdGhlIGkyYyBjb250cm9sbGVyLgoKX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KbGludXgtYXJtLWtlcm5lbCBt YWlsaW5nIGxpc3QKbGludXgtYXJtLWtlcm5lbEBsaXN0cy5pbmZyYWRlYWQub3JnCmh0dHA6Ly9s aXN0cy5pbmZyYWRlYWQub3JnL21haWxtYW4vbGlzdGluZm8vbGludXgtYXJtLWtlcm5lbAo=