From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752665AbdLEOsI (ORCPT ); Tue, 5 Dec 2017 09:48:08 -0500 Received: from mga01.intel.com ([192.55.52.88]:14216 "EHLO mga01.intel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752235AbdLEOsG (ORCPT ); Tue, 5 Dec 2017 09:48:06 -0500 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.45,364,1508828400"; d="scan'208";a="156263087" Subject: Re: [alsa-devel] [PATCH v4 06/15] soundwire: Add IO transfer From: Pierre-Louis Bossart To: Vinod Koul Cc: ALSA , Charles Keepax , Takashi , Greg Kroah-Hartman , plai@codeaurora.org, LKML , Sagar Dharia , patches.audio@intel.com, Mark , srinivas.kandagatla@linaro.org, Sudheer Papothi , alan@linux.intel.com References: <1512122177-2889-1-git-send-email-vinod.koul@intel.com> <1512122177-2889-7-git-send-email-vinod.koul@intel.com> <40d00228-2891-6e25-4c6f-789518a0e2c2@linux.intel.com> <20171203170418.GN32417@localhost> <20171205063114.GL32417@localhost> Message-ID: <6a475ed4-8ca5-0422-e416-2a32f1afa8ef@linux.intel.com> Date: Tue, 5 Dec 2017 08:48:03 -0600 User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.11; rv:52.0) Gecko/20100101 Thunderbird/52.5.0 MIME-Version: 1.0 In-Reply-To: Content-Type: text/plain; charset=utf-8; format=flowed Content-Language: en-US Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On 12/5/17 7:43 AM, Pierre-Louis Bossart wrote: > On 12/5/17 12:31 AM, Vinod Koul wrote: >> On Sun, Dec 03, 2017 at 09:01:41PM -0600, Pierre-Louis Bossart wrote: >>> On 12/3/17 11:04 AM, Vinod Koul wrote: >>>> On Fri, Dec 01, 2017 at 05:27:31PM -0600, Pierre-Louis Bossart wrote: >> >> Sorry looks like I missed replying to this one earlier. >> >>>>>> +static inline int find_response_code(enum sdw_command_response resp) >>>>>> +{ >>>>>> +    switch (resp) { >>>>>> +    case SDW_CMD_OK: >>>>>> +        return 0; >>>>>> + >>>>>> +    case SDW_CMD_IGNORED: >>>>>> +        return -ENODATA; >>>>>> + >>>>>> +    case SDW_CMD_TIMEOUT: >>>>>> +        return -ETIMEDOUT; >>>>>> + >>>>>> +    default: >>>>>> +        return -EIO; >>>>> >>>>> the 'default' case will handle both SDW_CMD_FAIL (which is a bus event >>>>> usually due to bus clash or parity issues) and SDW_CMD_FAIL_OTHER >>>>> (which is >>>>> an imp-def IP event). >>>>> >>>>> Do they really belong in the same basket? From a debug perspective >>>>> there is >>>>> quite a bit of information lost. >>>> >>>> at higher level the error handling is same. the information is not >>>> lost as >>>> it is expected that you would log it at error source. >>> >>> I don't understand this. It's certainly not the same for me if you >>> detect an >>> electric problem or if the IP is in the weeds. Logging at the source >>> is fine >>> but this filtering prevents higher levels from doing anything different. >> >> The point is higher levels like here cant do much than bail out and >> complain. >> >> Can you point out what would be different behaviour in each of these >> cases? >> >>>>>> +static inline int do_transfer(struct sdw_bus *bus, struct sdw_msg >>>>>> *msg) >>>>>> +{ >>>>>> +    int retry = bus->prop.err_threshold; >>>>>> +    enum sdw_command_response resp; >>>>>> +    int ret = 0, i; >>>>>> + >>>>>> +    for (i = 0; i <= retry; i++) { >>>>>> +        resp = bus->ops->xfer_msg(bus, msg); >>>>>> +        ret = find_response_code(resp); >>>>>> + >>>>>> +        /* if cmd is ok or ignored return */ >>>>>> +        if (ret == 0 || ret == -ENODATA) >>>>> >>>>> Can you document why you don't retry on a CMD_IGNORED? I know there >>>>> was a >>>>> reason, I just can't remember it. >>>> >>>> CMD_IGNORED can be okay on broadcast. User of this API can retry all >>>> they >>>> want! >>> >>> So you retry if this is a CMD_FAILED but let higher levels retry for >>> CMD_IGNORED, sorry I don't see the logic. >> >> Yes that is right. >> >> If I am doing a broadcast read, lets say for Device Id registers, why >> in the >> world would I want to retry? CMD_IGNORED is a valid response and >> required to >> stop enumeration cycle in that case. >> >> But if I am not expecting a CMD_IGNORED response, I can very well go >> ahead >> and retry from caller. The context is with caller and they can choose >> to do >> appropriate handling. >> >> And I have clarified this couple of times to you already, not sure how >> many >> more times I would have to do that. > > Until you clarify what you are doing. > There is ONE case where IGNORED is a valid answer (reading the Prepare > not finished bits), and it should not only be documented but analyzed in > more details. I meant Read SCP_DevID registers from Device0... prepare bits should never return a CMD_IGNORED > For a write an IGNORED is never OK. > >> >>>>> Now that I think of it, the retry on TIMEOUT makes no sense to me. >>>>> The retry >>>>> was intended for bus-level issues, where maybe a single bit error >>>>> causes an >>>>> issue without consequences, but the TIMEOUT is a completely >>>>> different beast, >>>>> it's the master IP that doesn't answer really, a completely >>>>> different case. >>>> >>>> well in those cases where you have blue wires, it actually helps :) >>> >>> Blue wires are not supposed to change electrical behavior. TIMEOUT is >>> only >>> an internal SOC level issue, so no I don't get how this helps. >>> >>> You have a retry count that is provided in the BIOS/firmware through >>> disco >>> properties and it's meant to bus errors. You are abusing the >>> definitions. A >>> command failed is supposed to be detected at the frame rate, which is >>> typically 20us. a timeout is likely a 100s of ms value, so if you >>> retry on >>> top it's going to lock up the bus. >> >> The world is not perfect! A guy debugging setups needs all the help. I do >> not see any reason for not to retry. Bus is anyway locked up while a >> transfer is ongoing (we serialize transfers). >> >> Now if you feel this should be abhorred, I can change this for timeout. > > This TIMEOUT thing is your own definition, it's not part of the spec, so > I don't see how it can be lumped together with spec-related parts. > > It's fine to keep a retry but please document what the expectations are > for the TIMEOUT case. > >> >>>>>> +enum sdw_command_response { >>>>>> +    SDW_CMD_OK = 0, >>>>>> +    SDW_CMD_IGNORED = 1, >>>>>> +    SDW_CMD_FAIL = 2, >>>>>> +    SDW_CMD_TIMEOUT = 4, >>>>>> +    SDW_CMD_FAIL_OTHER = 8, >>>>> >>>>> Humm, I can't recall if/why this is a mask? does it need to be? >>>> >>>> mask, not following! >>>> >>>> Taking a wild guess that you are asking about last error, which is >>>> for SW >>>> errors like malloc fail etc... >>> >>> no, I was asking why this is declared as if it was used for a >>> bitmask, why >>> not 0,1,2,3,4? >> >> Oh okay, I think it was something to do with bits for errors, but don >> see it >> helping so I can change it either way... > > Unless you use bit-wise operators and combined responses there is no > reason to keep the current definitions. > > _______________________________________________ > Alsa-devel mailing list > Alsa-devel@alsa-project.org > http://mailman.alsa-project.org/mailman/listinfo/alsa-devel From mboxrd@z Thu Jan 1 00:00:00 1970 From: Pierre-Louis Bossart Subject: Re: [PATCH v4 06/15] soundwire: Add IO transfer Date: Tue, 5 Dec 2017 08:48:03 -0600 Message-ID: <6a475ed4-8ca5-0422-e416-2a32f1afa8ef@linux.intel.com> References: <1512122177-2889-1-git-send-email-vinod.koul@intel.com> <1512122177-2889-7-git-send-email-vinod.koul@intel.com> <40d00228-2891-6e25-4c6f-789518a0e2c2@linux.intel.com> <20171203170418.GN32417@localhost> <20171205063114.GL32417@localhost> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8"; Format="flowed" Content-Transfer-Encoding: base64 Return-path: Received: from mga11.intel.com (mga11.intel.com [192.55.52.93]) by alsa0.perex.cz (Postfix) with ESMTP id 4F516266AE1 for ; Tue, 5 Dec 2017 15:48:06 +0100 (CET) In-Reply-To: Content-Language: en-US List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: alsa-devel-bounces@alsa-project.org Sender: alsa-devel-bounces@alsa-project.org To: Vinod Koul Cc: ALSA , Charles Keepax , Sudheer Papothi , Takashi , Greg Kroah-Hartman , plai@codeaurora.org, LKML , patches.audio@intel.com, Mark , srinivas.kandagatla@linaro.org, Sagar Dharia , alan@linux.intel.com List-Id: alsa-devel@alsa-project.org T24gMTIvNS8xNyA3OjQzIEFNLCBQaWVycmUtTG91aXMgQm9zc2FydCB3cm90ZToKPiBPbiAxMi81 LzE3IDEyOjMxIEFNLCBWaW5vZCBLb3VsIHdyb3RlOgo+PiBPbiBTdW4sIERlYyAwMywgMjAxNyBh dCAwOTowMTo0MVBNIC0wNjAwLCBQaWVycmUtTG91aXMgQm9zc2FydCB3cm90ZToKPj4+IE9uIDEy LzMvMTcgMTE6MDQgQU0sIFZpbm9kIEtvdWwgd3JvdGU6Cj4+Pj4gT24gRnJpLCBEZWMgMDEsIDIw MTcgYXQgMDU6Mjc6MzFQTSAtMDYwMCwgUGllcnJlLUxvdWlzIEJvc3NhcnQgd3JvdGU6Cj4+Cj4+ IFNvcnJ5IGxvb2tzIGxpa2UgSSBtaXNzZWQgcmVwbHlpbmcgdG8gdGhpcyBvbmUgZWFybGllci4K Pj4KPj4+Pj4+ICtzdGF0aWMgaW5saW5lIGludCBmaW5kX3Jlc3BvbnNlX2NvZGUoZW51bSBzZHdf Y29tbWFuZF9yZXNwb25zZSByZXNwKQo+Pj4+Pj4gK3sKPj4+Pj4+ICvCoMKgwqAgc3dpdGNoIChy ZXNwKSB7Cj4+Pj4+PiArwqDCoMKgIGNhc2UgU0RXX0NNRF9PSzoKPj4+Pj4+ICvCoMKgwqDCoMKg wqDCoCByZXR1cm4gMDsKPj4+Pj4+ICsKPj4+Pj4+ICvCoMKgwqAgY2FzZSBTRFdfQ01EX0lHTk9S RUQ6Cj4+Pj4+PiArwqDCoMKgwqDCoMKgwqAgcmV0dXJuIC1FTk9EQVRBOwo+Pj4+Pj4gKwo+Pj4+ Pj4gK8KgwqDCoCBjYXNlIFNEV19DTURfVElNRU9VVDoKPj4+Pj4+ICvCoMKgwqDCoMKgwqDCoCBy ZXR1cm4gLUVUSU1FRE9VVDsKPj4+Pj4+ICsKPj4+Pj4+ICvCoMKgwqAgZGVmYXVsdDoKPj4+Pj4+ ICvCoMKgwqDCoMKgwqDCoCByZXR1cm4gLUVJTzsKPj4+Pj4KPj4+Pj4gdGhlICdkZWZhdWx0JyBj YXNlIHdpbGwgaGFuZGxlIGJvdGggU0RXX0NNRF9GQUlMICh3aGljaCBpcyBhIGJ1cyBldmVudAo+ Pj4+PiB1c3VhbGx5IGR1ZSB0byBidXMgY2xhc2ggb3IgcGFyaXR5IGlzc3VlcykgYW5kIFNEV19D TURfRkFJTF9PVEhFUiAKPj4+Pj4gKHdoaWNoIGlzCj4+Pj4+IGFuIGltcC1kZWYgSVAgZXZlbnQp Lgo+Pj4+Pgo+Pj4+PiBEbyB0aGV5IHJlYWxseSBiZWxvbmcgaW4gdGhlIHNhbWUgYmFza2V0PyBG cm9tIGEgZGVidWcgcGVyc3BlY3RpdmUgCj4+Pj4+IHRoZXJlIGlzCj4+Pj4+IHF1aXRlIGEgYml0 IG9mIGluZm9ybWF0aW9uIGxvc3QuCj4+Pj4KPj4+PiBhdCBoaWdoZXIgbGV2ZWwgdGhlIGVycm9y IGhhbmRsaW5nIGlzIHNhbWUuIHRoZSBpbmZvcm1hdGlvbiBpcyBub3QgCj4+Pj4gbG9zdCBhcwo+ Pj4+IGl0IGlzIGV4cGVjdGVkIHRoYXQgeW91IHdvdWxkIGxvZyBpdCBhdCBlcnJvciBzb3VyY2Uu Cj4+Pgo+Pj4gSSBkb24ndCB1bmRlcnN0YW5kIHRoaXMuIEl0J3MgY2VydGFpbmx5IG5vdCB0aGUg c2FtZSBmb3IgbWUgaWYgeW91IAo+Pj4gZGV0ZWN0IGFuCj4+PiBlbGVjdHJpYyBwcm9ibGVtIG9y IGlmIHRoZSBJUCBpcyBpbiB0aGUgd2VlZHMuIExvZ2dpbmcgYXQgdGhlIHNvdXJjZSAKPj4+IGlz IGZpbmUKPj4+IGJ1dCB0aGlzIGZpbHRlcmluZyBwcmV2ZW50cyBoaWdoZXIgbGV2ZWxzIGZyb20g ZG9pbmcgYW55dGhpbmcgZGlmZmVyZW50Lgo+Pgo+PiBUaGUgcG9pbnQgaXMgaGlnaGVyIGxldmVs cyBsaWtlIGhlcmUgY2FudCBkbyBtdWNoIHRoYW4gYmFpbCBvdXQgYW5kIAo+PiBjb21wbGFpbi4K Pj4KPj4gQ2FuIHlvdSBwb2ludCBvdXQgd2hhdCB3b3VsZCBiZSBkaWZmZXJlbnQgYmVoYXZpb3Vy IGluIGVhY2ggb2YgdGhlc2UgCj4+IGNhc2VzPwo+Pgo+Pj4+Pj4gK3N0YXRpYyBpbmxpbmUgaW50 IGRvX3RyYW5zZmVyKHN0cnVjdCBzZHdfYnVzICpidXMsIHN0cnVjdCBzZHdfbXNnIAo+Pj4+Pj4g Km1zZykKPj4+Pj4+ICt7Cj4+Pj4+PiArwqDCoMKgIGludCByZXRyeSA9IGJ1cy0+cHJvcC5lcnJf dGhyZXNob2xkOwo+Pj4+Pj4gK8KgwqDCoCBlbnVtIHNkd19jb21tYW5kX3Jlc3BvbnNlIHJlc3A7 Cj4+Pj4+PiArwqDCoMKgIGludCByZXQgPSAwLCBpOwo+Pj4+Pj4gKwo+Pj4+Pj4gK8KgwqDCoCBm b3IgKGkgPSAwOyBpIDw9IHJldHJ5OyBpKyspIHsKPj4+Pj4+ICvCoMKgwqDCoMKgwqDCoCByZXNw ID0gYnVzLT5vcHMtPnhmZXJfbXNnKGJ1cywgbXNnKTsKPj4+Pj4+ICvCoMKgwqDCoMKgwqDCoCBy ZXQgPSBmaW5kX3Jlc3BvbnNlX2NvZGUocmVzcCk7Cj4+Pj4+PiArCj4+Pj4+PiArwqDCoMKgwqDC oMKgwqAgLyogaWYgY21kIGlzIG9rIG9yIGlnbm9yZWQgcmV0dXJuICovCj4+Pj4+PiArwqDCoMKg wqDCoMKgwqAgaWYgKHJldCA9PSAwIHx8IHJldCA9PSAtRU5PREFUQSkKPj4+Pj4KPj4+Pj4gQ2Fu IHlvdSBkb2N1bWVudCB3aHkgeW91IGRvbid0IHJldHJ5IG9uIGEgQ01EX0lHTk9SRUQ/IEkga25v dyB0aGVyZSAKPj4+Pj4gd2FzIGEKPj4+Pj4gcmVhc29uLCBJIGp1c3QgY2FuJ3QgcmVtZW1iZXIg aXQuCj4+Pj4KPj4+PiBDTURfSUdOT1JFRCBjYW4gYmUgb2theSBvbiBicm9hZGNhc3QuIFVzZXIg b2YgdGhpcyBBUEkgY2FuIHJldHJ5IGFsbCAKPj4+PiB0aGV5Cj4+Pj4gd2FudCEKPj4+Cj4+PiBT byB5b3UgcmV0cnkgaWYgdGhpcyBpcyBhIENNRF9GQUlMRUQgYnV0IGxldCBoaWdoZXIgbGV2ZWxz IHJldHJ5IGZvcgo+Pj4gQ01EX0lHTk9SRUQsIHNvcnJ5IEkgZG9uJ3Qgc2VlIHRoZSBsb2dpYy4K Pj4KPj4gWWVzIHRoYXQgaXMgcmlnaHQuCj4+Cj4+IElmIEkgYW0gZG9pbmcgYSBicm9hZGNhc3Qg cmVhZCwgbGV0cyBzYXkgZm9yIERldmljZSBJZCByZWdpc3RlcnMsIHdoeSAKPj4gaW4gdGhlCj4+ IHdvcmxkIHdvdWxkIEkgd2FudCB0byByZXRyeT8gQ01EX0lHTk9SRUQgaXMgYSB2YWxpZCByZXNw b25zZSBhbmQgCj4+IHJlcXVpcmVkIHRvCj4+IHN0b3AgZW51bWVyYXRpb24gY3ljbGUgaW4gdGhh dCBjYXNlLgo+Pgo+PiBCdXQgaWYgSSBhbSBub3QgZXhwZWN0aW5nIGEgQ01EX0lHTk9SRUQgcmVz cG9uc2UsIEkgY2FuIHZlcnkgd2VsbCBnbyAKPj4gYWhlYWQKPj4gYW5kIHJldHJ5IGZyb20gY2Fs bGVyLiBUaGUgY29udGV4dCBpcyB3aXRoIGNhbGxlciBhbmQgdGhleSBjYW4gY2hvb3NlIAo+PiB0 byBkbwo+PiBhcHByb3ByaWF0ZSBoYW5kbGluZy4KPj4KPj4gQW5kIEkgaGF2ZSBjbGFyaWZpZWQg dGhpcyBjb3VwbGUgb2YgdGltZXMgdG8geW91IGFscmVhZHksIG5vdCBzdXJlIGhvdyAKPj4gbWFu eQo+PiBtb3JlIHRpbWVzIEkgd291bGQgaGF2ZSB0byBkbyB0aGF0Lgo+IAo+IFVudGlsIHlvdSBj bGFyaWZ5IHdoYXQgeW91IGFyZSBkb2luZy4KPiBUaGVyZSBpcyBPTkUgY2FzZSB3aGVyZSBJR05P UkVEIGlzIGEgdmFsaWQgYW5zd2VyIChyZWFkaW5nIHRoZSBQcmVwYXJlIAo+IG5vdCBmaW5pc2hl ZCBiaXRzKSwgYW5kIGl0IHNob3VsZCBub3Qgb25seSBiZSBkb2N1bWVudGVkIGJ1dCBhbmFseXpl ZCBpbiAKPiBtb3JlIGRldGFpbHMuCkkgbWVhbnQgUmVhZCBTQ1BfRGV2SUQgcmVnaXN0ZXJzIGZy b20gRGV2aWNlMC4uLiBwcmVwYXJlIGJpdHMgc2hvdWxkIApuZXZlciByZXR1cm4gYSBDTURfSUdO T1JFRAoKPiBGb3IgYSB3cml0ZSBhbiBJR05PUkVEIGlzIG5ldmVyIE9LLgo+IAo+Pgo+Pj4+PiBO b3cgdGhhdCBJIHRoaW5rIG9mIGl0LCB0aGUgcmV0cnkgb24gVElNRU9VVCBtYWtlcyBubyBzZW5z ZSB0byBtZS4gCj4+Pj4+IFRoZSByZXRyeQo+Pj4+PiB3YXMgaW50ZW5kZWQgZm9yIGJ1cy1sZXZl bCBpc3N1ZXMsIHdoZXJlIG1heWJlIGEgc2luZ2xlIGJpdCBlcnJvciAKPj4+Pj4gY2F1c2VzIGFu Cj4+Pj4+IGlzc3VlIHdpdGhvdXQgY29uc2VxdWVuY2VzLCBidXQgdGhlIFRJTUVPVVQgaXMgYSBj b21wbGV0ZWx5IAo+Pj4+PiBkaWZmZXJlbnQgYmVhc3QsCj4+Pj4+IGl0J3MgdGhlIG1hc3RlciBJ UCB0aGF0IGRvZXNuJ3QgYW5zd2VyIHJlYWxseSwgYSBjb21wbGV0ZWx5IAo+Pj4+PiBkaWZmZXJl bnQgY2FzZS4KPj4+Pgo+Pj4+IHdlbGwgaW4gdGhvc2UgY2FzZXMgd2hlcmUgeW91IGhhdmUgYmx1 ZSB3aXJlcywgaXQgYWN0dWFsbHkgaGVscHMgOikKPj4+Cj4+PiBCbHVlIHdpcmVzIGFyZSBub3Qg c3VwcG9zZWQgdG8gY2hhbmdlIGVsZWN0cmljYWwgYmVoYXZpb3IuIFRJTUVPVVQgaXMgCj4+PiBv bmx5Cj4+PiBhbiBpbnRlcm5hbCBTT0MgbGV2ZWwgaXNzdWUsIHNvIG5vIEkgZG9uJ3QgZ2V0IGhv dyB0aGlzIGhlbHBzLgo+Pj4KPj4+IFlvdSBoYXZlIGEgcmV0cnkgY291bnQgdGhhdCBpcyBwcm92 aWRlZCBpbiB0aGUgQklPUy9maXJtd2FyZSB0aHJvdWdoIAo+Pj4gZGlzY28KPj4+IHByb3BlcnRp ZXMgYW5kIGl0J3MgbWVhbnQgdG8gYnVzIGVycm9ycy4gWW91IGFyZSBhYnVzaW5nIHRoZSAKPj4+ IGRlZmluaXRpb25zLiBBCj4+PiBjb21tYW5kIGZhaWxlZCBpcyBzdXBwb3NlZCB0byBiZSBkZXRl Y3RlZCBhdCB0aGUgZnJhbWUgcmF0ZSwgd2hpY2ggaXMKPj4+IHR5cGljYWxseSAyMHVzLiBhIHRp bWVvdXQgaXMgbGlrZWx5IGEgMTAwcyBvZiBtcyB2YWx1ZSwgc28gaWYgeW91IAo+Pj4gcmV0cnkg b24KPj4+IHRvcCBpdCdzIGdvaW5nIHRvIGxvY2sgdXAgdGhlIGJ1cy4KPj4KPj4gVGhlIHdvcmxk IGlzIG5vdCBwZXJmZWN0ISBBIGd1eSBkZWJ1Z2dpbmcgc2V0dXBzIG5lZWRzIGFsbCB0aGUgaGVs cC4gSSBkbwo+PiBub3Qgc2VlIGFueSByZWFzb24gZm9yIG5vdCB0byByZXRyeS4gQnVzIGlzIGFu eXdheSBsb2NrZWQgdXAgd2hpbGUgYQo+PiB0cmFuc2ZlciBpcyBvbmdvaW5nICh3ZSBzZXJpYWxp emUgdHJhbnNmZXJzKS4KPj4KPj4gTm93IGlmIHlvdSBmZWVsIHRoaXMgc2hvdWxkIGJlIGFiaG9y cmVkLCBJIGNhbiBjaGFuZ2UgdGhpcyBmb3IgdGltZW91dC4KPiAKPiBUaGlzIFRJTUVPVVQgdGhp bmcgaXMgeW91ciBvd24gZGVmaW5pdGlvbiwgaXQncyBub3QgcGFydCBvZiB0aGUgc3BlYywgc28g Cj4gSSBkb24ndCBzZWUgaG93IGl0IGNhbiBiZSBsdW1wZWQgdG9nZXRoZXIgd2l0aCBzcGVjLXJl bGF0ZWQgcGFydHMuCj4gCj4gSXQncyBmaW5lIHRvIGtlZXAgYSByZXRyeSBidXQgcGxlYXNlIGRv Y3VtZW50IHdoYXQgdGhlIGV4cGVjdGF0aW9ucyBhcmUgCj4gZm9yIHRoZSBUSU1FT1VUIGNhc2Uu Cj4gCj4+Cj4+Pj4+PiArZW51bSBzZHdfY29tbWFuZF9yZXNwb25zZSB7Cj4+Pj4+PiArwqDCoMKg IFNEV19DTURfT0sgPSAwLAo+Pj4+Pj4gK8KgwqDCoCBTRFdfQ01EX0lHTk9SRUQgPSAxLAo+Pj4+ Pj4gK8KgwqDCoCBTRFdfQ01EX0ZBSUwgPSAyLAo+Pj4+Pj4gK8KgwqDCoCBTRFdfQ01EX1RJTUVP VVQgPSA0LAo+Pj4+Pj4gK8KgwqDCoCBTRFdfQ01EX0ZBSUxfT1RIRVIgPSA4LAo+Pj4+Pgo+Pj4+ PiBIdW1tLCBJIGNhbid0IHJlY2FsbCBpZi93aHkgdGhpcyBpcyBhIG1hc2s/IGRvZXMgaXQgbmVl ZCB0byBiZT8KPj4+Pgo+Pj4+IG1hc2ssIG5vdCBmb2xsb3dpbmchCj4+Pj4KPj4+PiBUYWtpbmcg YSB3aWxkIGd1ZXNzIHRoYXQgeW91IGFyZSBhc2tpbmcgYWJvdXQgbGFzdCBlcnJvciwgd2hpY2gg aXMgCj4+Pj4gZm9yIFNXCj4+Pj4gZXJyb3JzIGxpa2UgbWFsbG9jIGZhaWwgZXRjLi4uCj4+Pgo+ Pj4gbm8sIEkgd2FzIGFza2luZyB3aHkgdGhpcyBpcyBkZWNsYXJlZCBhcyBpZiBpdCB3YXMgdXNl ZCBmb3IgYSAKPj4+IGJpdG1hc2ssIHdoeQo+Pj4gbm90IDAsMSwyLDMsND8KPj4KPj4gT2ggb2th eSwgSSB0aGluayBpdCB3YXMgc29tZXRoaW5nIHRvIGRvIHdpdGggYml0cyBmb3IgZXJyb3JzLCBi dXQgZG9uIAo+PiBzZWUgaXQKPj4gaGVscGluZyBzbyBJIGNhbiBjaGFuZ2UgaXQgZWl0aGVyIHdh eS4uLgo+IAo+IFVubGVzcyB5b3UgdXNlIGJpdC13aXNlIG9wZXJhdG9ycyBhbmQgY29tYmluZWQg cmVzcG9uc2VzIHRoZXJlIGlzIG5vIAo+IHJlYXNvbiB0byBrZWVwIHRoZSBjdXJyZW50IGRlZmlu aXRpb25zLgo+IAo+IF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fCj4gQWxzYS1kZXZlbCBtYWlsaW5nIGxpc3QKPiBBbHNhLWRldmVsQGFsc2EtcHJvamVjdC5v cmcKPiBodHRwOi8vbWFpbG1hbi5hbHNhLXByb2plY3Qub3JnL21haWxtYW4vbGlzdGluZm8vYWxz YS1kZXZlbAoKX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18K QWxzYS1kZXZlbCBtYWlsaW5nIGxpc3QKQWxzYS1kZXZlbEBhbHNhLXByb2plY3Qub3JnCmh0dHA6 Ly9tYWlsbWFuLmFsc2EtcHJvamVjdC5vcmcvbWFpbG1hbi9saXN0aW5mby9hbHNhLWRldmVsCg==