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 A7E5CC4345F for ; Wed, 24 Apr 2024 10:59:58 +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:From:References:Cc:To: Subject:MIME-Version:Date:Message-ID:Reply-To:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=CO8ZelmXBDL1R7DkM4kBtgofgKfmTQrQtHgNkR2Z0sg=; b=OF24ciiQrv4kTy 0xhhTeoZdZ1FeUKfxmZPAar5Gq1XdbU9C9xz0VbSDicKAN6Rn1eQh++tqDgJfpaE4Yt1GmLmpQPR9 T1/IYNUAdVOX4w3Zy2vOCWacFn0Hwq/8yWdyOryk6T+6WlWSWFVRDCKR0ZmOWnXfQ30fQEGAU6axO h+zt9vcHQ1nqcWl3QcRwm+OdOpsKVsTmvx4yPWAQAQ2OwX8/nVV6iSnVZwCmZhE/SnXlQRW90ZZ8P CLNVwILRYOTelZpTLRdwSzAy7XR753bB44Xj7MFPsRgquTXoN6KJmPxdelCURaELYkoWb3c9HPb96 qG6AKnUn2MqZBbvslOHw==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.97.1 #2 (Red Hat Linux)) id 1rzaLl-00000003o3A-0RBu; Wed, 24 Apr 2024 10:59: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 1rzaLh-00000003o1r-2HFm for linux-arm-kernel@lists.infradead.org; Wed, 24 Apr 2024 10:59: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 534CD2F; Wed, 24 Apr 2024 04:00:02 -0700 (PDT) Received: from [10.57.57.30] (unknown [10.57.57.30]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPSA id 8A89A3F73F; Wed, 24 Apr 2024 03:59:31 -0700 (PDT) Message-ID: <40413863-3158-460b-ad7e-e5afdb45b701@arm.com> Date: Wed, 24 Apr 2024 11:59:34 +0100 MIME-Version: 1.0 User-Agent: Mozilla Thunderbird Subject: Re: [PATCH v2 13/43] arm64: RME: RTT handling To: Suzuki K Poulose , kvm@vger.kernel.org, kvmarm@lists.linux.dev Cc: Catalin Marinas , Marc Zyngier , Will Deacon , James Morse , Oliver Upton , Zenghui Yu , linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, Joey Gouly , Alexandru Elisei , Christoffer Dall , Fuad Tabba , linux-coco@lists.linux.dev, Ganapatrao Kulkarni References: <20240412084056.1733704-1-steven.price@arm.com> <20240412084309.1733783-1-steven.price@arm.com> <20240412084309.1733783-14-steven.price@arm.com> From: Steven Price Content-Language: en-GB In-Reply-To: X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20240424_035937_869503_0BEC373A X-CRM114-Status: GOOD ( 53.10 ) 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 T24gMTcvMDQvMjAyNCAxNDozNywgU3V6dWtpIEsgUG91bG9zZSB3cm90ZToKPiBIaSBTdGV2ZW4K PiAKPiBtaW5vcnQgbml0LCBTdWJqZWN0OiBhcm02NDogUk1FOiBSVFQgdGVhciBkb3duCj4gCj4g VGhpcyBwYXRjaCBpcyBhbGwgYWJvdXQgdGVhcmluZyB0aGUgUlRUcywgc28gbWF5IGJlIHRoZSBz dWJqZWN0IGNvdWxkCj4gYmUgYWRqdXN0ZWQgYWNjb3JkaW5nbHkuCgpHb29kIHBvaW50LCB0aGlz IHBhdGNoIGhhcyBldm9sdmVkIGFuZCBpcyBub3cgYWxsIGFib3V0IHRlYXJpbmcgZG93bi4KCj4g T24gMTIvMDQvMjAyNCAwOTo0MiwgU3RldmVuIFByaWNlIHdyb3RlOgo+PiBUaGUgUk1NIG93bnMg dGhlIHN0YWdlIDIgcGFnZSB0YWJsZXMgZm9yIGEgcmVhbG0sIGFuZCBLVk0gbXVzdCByZXF1ZXN0 Cj4+IHRoYXQgdGhlIFJNTSBjcmVhdGVzL2Rlc3Ryb3lzIGVudHJpZXMgYXMgbmVjZXNzYXJ5LiBU aGUgcGh5c2ljYWwgcGFnZXMKPj4gdG8gc3RvcmUgdGhlIHBhZ2UgdGFibGVzIGFyZSBkZWxlZ2F0 ZWQgdG8gdGhlIHJlYWxtIGFzIHJlcXVpcmVkLCBhbmQgY2FuCj4+IGJlIHVuZGVsZWdhdGVkIHdo ZW4gbm8gbG9uZ2VyIHVzZWQuCj4+Cj4+IENyZWF0aW5nIG5ldyBSVFRzIGlzIHRoZSBlYXN5IHBh cnQsIHRlYXJpbmcgZG93biBpcyBhIGxpdHRsZSBtb3JlCj4+IHRyaWNreS4gVGhlIHJlc3VsdCBv ZiByZWFsbV9ydHRfZGVzdHJveSgpIGNhbiBiZSB1c2VkIHRvIGVmZmVjdGl2ZWx5Cj4+IHdhbGsg dGhlIHRyZWUgYW5kIGRlc3Ryb3kgdGhlIGVudHJpZXMgKHVuZGVsZWdhdGluZyBwYWdlcyB0aGF0 IHdlcmUKPj4gZ2l2ZW4gdG8gdGhlIHJlYWxtKS4KPiAKPiBUaGUgcGF0Y2ggbG9va3MgZnVuY3Rp b25hbGx5IGNvcnJlY3QgdG8gbWUuIFNvbWUgbWlub3Igc3R5bGUgcmVsYXRlZAo+IGNvbW1lbnRz IGJlbG93Lgo+IAo+PiBTaWduZWQtb2ZmLWJ5OiBTdGV2ZW4gUHJpY2UgPHN0ZXZlbi5wcmljZUBh cm0uY29tPgo+IAo+PiAtLS0KPj4gwqAgYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9rdm1fcm1lLmgg fMKgIDE5ICsrKysKPj4gwqAgYXJjaC9hcm02NC9rdm0vbW11LmPCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqAgfMKgwqAgNiArLQo+PiDCoCBhcmNoL2FybTY0L2t2bS9ybWUuY8KgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoCB8IDE3MSArKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrCj4+IMKgIDMg ZmlsZXMgY2hhbmdlZCwgMTkzIGluc2VydGlvbnMoKyksIDMgZGVsZXRpb25zKC0pCj4+Cj4+IGRp ZmYgLS1naXQgYS9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL2t2bV9ybWUuaAo+PiBiL2FyY2gvYXJt NjQvaW5jbHVkZS9hc20va3ZtX3JtZS5oCj4+IGluZGV4IGZiYTg1ZTljZTNhZS4uNGFiNWNiNWU5 MWIzIDEwMDY0NAo+PiAtLS0gYS9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL2t2bV9ybWUuaAo+PiAr KysgYi9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL2t2bV9ybWUuaAo+PiBAQCAtNzYsNSArNzYsMjQg QEAgdTMyIGt2bV9yZWFsbV9pcGFfbGltaXQodm9pZCk7Cj4+IMKgIGludCBrdm1fcmVhbG1fZW5h YmxlX2NhcChzdHJ1Y3Qga3ZtICprdm0sIHN0cnVjdCBrdm1fZW5hYmxlX2NhcCAqY2FwKTsKPj4g wqAgaW50IGt2bV9pbml0X3JlYWxtX3ZtKHN0cnVjdCBrdm0gKmt2bSk7Cj4+IMKgIHZvaWQga3Zt X2Rlc3Ryb3lfcmVhbG0oc3RydWN0IGt2bSAqa3ZtKTsKPj4gK3ZvaWQga3ZtX3JlYWxtX2Rlc3Ry b3lfcnR0cyhzdHJ1Y3Qga3ZtICprdm0sIHUzMiBpYV9iaXRzKTsKPj4gKwo+PiArI2RlZmluZSBS TUVfUlRUX0JMT0NLX0xFVkVMwqDCoMKgIDIKPj4gKyNkZWZpbmUgUk1FX1JUVF9NQVhfTEVWRUzC oMKgwqAgMwo+PiArCj4+ICsjZGVmaW5lIFJNRV9QQUdFX1NISUZUwqDCoMKgwqDCoMKgwqAgMTIK Pj4gKyNkZWZpbmUgUk1FX1BBR0VfU0laRcKgwqDCoMKgwqDCoMKgIEJJVChSTUVfUEFHRV9TSElG VCkKPj4gKy8qIFNlZSBBUk02NF9IV19QR1RBQkxFX0xFVkVMX1NISUZUKCkgKi8KPj4gKyNkZWZp bmUgUk1FX1JUVF9MRVZFTF9TSElGVChsKcKgwqDCoCBcCj4+ICvCoMKgwqAgKChSTUVfUEFHRV9T SElGVCAtIDMpICogKDQgLSAobCkpICsgMykKPj4gKyNkZWZpbmUgUk1FX0wyX0JMT0NLX1NJWkXC oMKgwqAgQklUKFJNRV9SVFRfTEVWRUxfU0hJRlQoMikpCj4+ICsKPj4gK3N0YXRpYyBpbmxpbmUg dW5zaWduZWQgbG9uZyBybWVfcnR0X2xldmVsX21hcHNpemUoaW50IGxldmVsKQo+PiArewo+PiAr wqDCoMKgIGlmIChXQVJOX09OKGxldmVsID4gUk1FX1JUVF9NQVhfTEVWRUwpKQo+PiArwqDCoMKg wqDCoMKgwqAgcmV0dXJuIFJNRV9QQUdFX1NJWkU7Cj4+ICsKPj4gK8KgwqDCoCByZXR1cm4gKDFV TCA8PCBSTUVfUlRUX0xFVkVMX1NISUZUKGxldmVsKSk7Cj4+ICt9Cj4+Cj4gCj4gc3VwZXIgbWlu b3Igbml0OiBXZSBvbmx5IHN1cHBvcnQgNEsgZm9yIG5vdywgc28gbWF5IGJlIGNvdWxkIHJldXNl Cj4gdGhlIEFSTTY0IGdlbmVyaWMgbWFjcm8gaGVscGVycy4gSSBhbSBmaW5lIGVpdGhlciB3YXku CgpHaXZlbiB3ZSdsbCBsaWtlbHkgd2FudCB0byBzdXBwb3J0IGhvc3QgZ3JhbnVsZXMgb3RoZXIg dGhhbiA0ayBpbiB0aGUKZnV0dXJlIEknZCBsaWtlIHRvIGF2b2lkIHVzaW5nIHRoZSBnZW5lcmlj IG9uZXMuIEl0J3MgYWxzbyBhIGNsZWFyCnNpZ25hbCB0aGF0IHRoZSBjb2RlIGlzIHJlZmVycmlu ZyB0byB0aGUgUlRUcyByYXRoZXIgdGhhbiB0aGUgaG9zdCdzCnBhZ2UgdGFibGVzLgoKPiAKPj4g wqAgI2VuZGlmCj4+IGRpZmYgLS1naXQgYS9hcmNoL2FybTY0L2t2bS9tbXUuYyBiL2FyY2gvYXJt NjQva3ZtL21tdS5jCj4+IGluZGV4IGFmNDU2NGYzYWRkNS4uNDZmMGM0ZTgwYWNlIDEwMDY0NAo+ PiAtLS0gYS9hcmNoL2FybTY0L2t2bS9tbXUuYwo+PiArKysgYi9hcmNoL2FybTY0L2t2bS9tbXUu Ywo+PiBAQCAtMTAxMiwxNyArMTAxMiwxNyBAQCB2b2lkIHN0YWdlMl91bm1hcF92bShzdHJ1Y3Qg a3ZtICprdm0pCj4+IMKgIHZvaWQga3ZtX2ZyZWVfc3RhZ2UyX3BnZChzdHJ1Y3Qga3ZtX3MyX21t dSAqbW11KQo+PiDCoCB7Cj4+IMKgwqDCoMKgwqAgc3RydWN0IGt2bSAqa3ZtID0ga3ZtX3MyX21t dV90b19rdm0obW11KTsKPj4gLcKgwqDCoCBzdHJ1Y3Qga3ZtX3BndGFibGUgKnBndCA9IE5VTEw7 Cj4+ICvCoMKgwqAgc3RydWN0IGt2bV9wZ3RhYmxlICpwZ3Q7Cj4+IMKgIMKgwqDCoMKgwqAgd3Jp dGVfbG9jaygma3ZtLT5tbXVfbG9jayk7Cj4+ICvCoMKgwqAgcGd0ID0gbW11LT5wZ3Q7Cj4+IMKg wqDCoMKgwqAgaWYgKGt2bV9pc19yZWFsbShrdm0pICYmCj4+IMKgwqDCoMKgwqDCoMKgwqDCoCAo a3ZtX3JlYWxtX3N0YXRlKGt2bSkgIT0gUkVBTE1fU1RBVEVfREVBRCAmJgo+PiDCoMKgwqDCoMKg wqDCoMKgwqDCoCBrdm1fcmVhbG1fc3RhdGUoa3ZtKSAhPSBSRUFMTV9TVEFURV9OT05FKSkgewo+ PiAtwqDCoMKgwqDCoMKgwqAgLyogVE9ETzogdGVhcmRvd24gcnR0cyAqLwo+PiDCoMKgwqDCoMKg wqDCoMKgwqAgd3JpdGVfdW5sb2NrKCZrdm0tPm1tdV9sb2NrKTsKPj4gK8KgwqDCoMKgwqDCoMKg IGt2bV9yZWFsbV9kZXN0cm95X3J0dHMoa3ZtLCBwZ3QtPmlhX2JpdHMpOwo+PiDCoMKgwqDCoMKg wqDCoMKgwqAgcmV0dXJuOwo+PiDCoMKgwqDCoMKgIH0KPj4gLcKgwqDCoCBwZ3QgPSBtbXUtPnBn dDsKPj4gwqDCoMKgwqDCoCBpZiAocGd0KSB7Cj4+IMKgwqDCoMKgwqDCoMKgwqDCoCBtbXUtPnBn ZF9waHlzID0gMDsKPj4gwqDCoMKgwqDCoMKgwqDCoMKgIG1tdS0+cGd0ID0gTlVMTDsKPj4gZGlm ZiAtLWdpdCBhL2FyY2gvYXJtNjQva3ZtL3JtZS5jIGIvYXJjaC9hcm02NC9rdm0vcm1lLmMKPj4g aW5kZXggOTY1MmVjNmFiMmZkLi4wOWI1OWJjYWQ4YjYgMTAwNjQ0Cj4+IC0tLSBhL2FyY2gvYXJt NjQva3ZtL3JtZS5jCj4+ICsrKyBiL2FyY2gvYXJtNjQva3ZtL3JtZS5jCj4+IEBAIC00Nyw2ICs0 Nyw1MyBAQCBzdGF0aWMgaW50IHJtaV9jaGVja192ZXJzaW9uKHZvaWQpCj4+IMKgwqDCoMKgwqAg cmV0dXJuIDA7Cj4+IMKgIH0KPj4gwqAgK3N0YXRpYyBwaHlzX2FkZHJfdCBfX2FsbG9jX2RlbGVn YXRlZF9wYWdlKHN0cnVjdCByZWFsbSAqcmVhbG0sCj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqAgc3RydWN0IGt2bV9tbXVfbWVtb3J5X2NhY2hlICptYywKPj4g K8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBnZnBfdCBmbGFncykK PiAKPiBtaW5vciBuaXQ6IERvIHdlIG5lZWQgIl9fIiBoZXJlID8gVGhlIGNvdW50ZXIgcGFydCBp cyBwbGFpbgo+IGZyZWVfZGVsZWdhdGVkX3BhZ2Ugd2l0aG91dCB0aGUgIl9fIi4gV2UgY291bGQg ZHJvcCB0aGUgcHJlZml4Cj4gCj4gT3Igd2UgY291bGQgc3BsaXQgdGhlIGZ1bmN0aW9uIGFzOgo+ IAo+IGFsbG9jX2RlbGVnYXRlZF9wYWdlKCkKPiB7Cj4gwqAgaWYgKHNwYXJlX3BhZ2VfYXZhaWxh YmxlKQo+IMKgwqDCoMKgcmV0dXJuIHNwYXJlX3BhZ2U7Cj4gwqAgcmV0dXJuIF9fYWxsb2NfZGVs ZWdhdGVkX3BhZ2UoKTsgLyogQWxsb2MgYW5kIGRlbGVnYXRlIGEgcGFnZSAqLwo+IH0KCkknbSBu b3QgcmVhbGx5IHN1cmUgSSBmb2xsb3cuIFRoZSByZWFzb24gZm9yIHRoZSAnd3JhcHBlcicgZnVu Y3Rpb24KYWxsb2NfZGVsZWdhdGVkX3BhZ2UoKSBpcyBiZWNhdXNlIG1vc3QgY2FsbCBzaXRlcyBk b24ndCBjYXJlIGFib3V0IHRoZQpHRlAgZmxhZ3MgKGRlZmF1bHRzIHRvIEdGUF9LRVJORUwpLCBi dXQgZm9yIGVuc3VyZV9zcGFyZV9wYWdlKCkgd2UgbmVlZAp0byBwYXNzIEdGUF9BVE9NSUMuCgpB ZG1pdHRlZGx5IHRoZXJlIGFyZSBvbmx5IDMgY2FsbCBzaXRlcyBpbiB0b3RhbCBhbmQgdGhlIHdy YXBwZXIgaXNuJ3QKYWRkZWQgeWV0LiBJJ2xsIHRpZHkgdGhpcyB1cCBieSBzaW1wbHkgYWRkaW5n IHRoZSBHRlBfS0VSTkVMIGZsYWcgb250bwp0aGUgdHdvIGNhbGwgc2l0ZXMuCgo+IAo+PiArewo+ PiArwqDCoMKgIHBoeXNfYWRkcl90IHBoeXMgPSBQSFlTX0FERFJfTUFYOwo+PiArwqDCoMKgIHZv aWQgKnZpcnQ7Cj4+ICsKPj4gK8KgwqDCoCBpZiAocmVhbG0tPnNwYXJlX3BhZ2UgIT0gUEhZU19B RERSX01BWCkgewo+PiArwqDCoMKgwqDCoMKgwqAgc3dhcChyZWFsbS0+c3BhcmVfcGFnZSwgcGh5 cyk7Cj4+ICvCoMKgwqDCoMKgwqDCoCBnb3RvIG91dDsKPj4gK8KgwqDCoCB9Cj4+ICsKPj4gK8Kg wqDCoCBpZiAobWMpCj4+ICvCoMKgwqDCoMKgwqDCoCB2aXJ0ID0ga3ZtX21tdV9tZW1vcnlfY2Fj aGVfYWxsb2MobWMpOwo+PiArwqDCoMKgIGVsc2UKPj4gK8KgwqDCoMKgwqDCoMKgIHZpcnQgPSAo dm9pZCAqKV9fZ2V0X2ZyZWVfcGFnZShmbGFncyk7Cj4+ICsKPj4gK8KgwqDCoCBpZiAoIXZpcnQp Cj4+ICvCoMKgwqDCoMKgwqDCoCBnb3RvIG91dDsKPj4gKwo+PiArwqDCoMKgIHBoeXMgPSB2aXJ0 X3RvX3BoeXModmlydCk7Cj4+ICsKPj4gK8KgwqDCoCBpZiAocm1pX2dyYW51bGVfZGVsZWdhdGUo cGh5cykpIHsKPj4gK8KgwqDCoMKgwqDCoMKgIGZyZWVfcGFnZSgodW5zaWduZWQgbG9uZyl2aXJ0 KTsKPj4gKwo+PiArwqDCoMKgwqDCoMKgwqAgcGh5cyA9IFBIWVNfQUREUl9NQVg7Cj4+ICvCoMKg wqAgfQo+PiArCj4+ICtvdXQ6Cj4+ICvCoMKgwqAgcmV0dXJuIHBoeXM7Cj4+ICt9Cj4+ICsKPj4g K3N0YXRpYyB2b2lkIGZyZWVfZGVsZWdhdGVkX3BhZ2Uoc3RydWN0IHJlYWxtICpyZWFsbSwgcGh5 c19hZGRyX3QgcGh5cykKPj4gK3sKPj4gK8KgwqDCoCBpZiAocmVhbG0tPnNwYXJlX3BhZ2UgPT0g UEhZU19BRERSX01BWCkgewo+PiArwqDCoMKgwqDCoMKgwqAgcmVhbG0tPnNwYXJlX3BhZ2UgPSBw aHlzOwo+PiArwqDCoMKgwqDCoMKgwqAgcmV0dXJuOwo+PiArwqDCoMKgIH0KPj4gKwo+PiArwqDC oMKgIGlmIChXQVJOX09OKHJtaV9ncmFudWxlX3VuZGVsZWdhdGUocGh5cykpKSB7Cj4+ICvCoMKg wqDCoMKgwqDCoCAvKiBVbmRlbGVnYXRlIGZhaWxlZDogbGVhayB0aGUgcGFnZSAqLwo+PiArwqDC oMKgwqDCoMKgwqAgcmV0dXJuOwo+PiArwqDCoMKgIH0KPj4gKwo+PiArwqDCoMKgIGZyZWVfcGFn ZSgodW5zaWduZWQgbG9uZylwaHlzX3RvX3ZpcnQocGh5cykpOwo+PiArfQo+PiArCj4+IMKgIHUz MiBrdm1fcmVhbG1faXBhX2xpbWl0KHZvaWQpCj4+IMKgIHsKPj4gwqDCoMKgwqDCoCByZXR1cm4g dTY0X2dldF9iaXRzKHJtbV9mZWF0X3JlZzAsIFJNSV9GRUFUVVJFX1JFR0lTVEVSXzBfUzJTWik7 Cj4+IEBAIC0xMjQsNiArMTcxLDEzMCBAQCBzdGF0aWMgaW50IHJlYWxtX2NyZWF0ZV9yZChzdHJ1 Y3Qga3ZtICprdm0pCj4+IMKgwqDCoMKgwqAgcmV0dXJuIHI7Cj4+IMKgIH0KPj4gwqAgK3N0YXRp YyBpbnQgcmVhbG1fcnR0X2Rlc3Ryb3koc3RydWN0IHJlYWxtICpyZWFsbSwgdW5zaWduZWQgbG9u ZyBhZGRyLAo+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgaW50IGxldmVsLCBw aHlzX2FkZHJfdCAqcnR0X2dyYW51bGUsCj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoCB1bnNpZ25lZCBsb25nICpuZXh0X2FkZHIpCj4+ICt7Cj4+ICvCoMKgwqAgdW5zaWduZWQg bG9uZyBvdXRfcnR0Owo+PiArwqDCoMKgIHVuc2lnbmVkIGxvbmcgb3V0X3RvcDsKPj4gK8KgwqDC oCBpbnQgcmV0Owo+PiArCj4+ICvCoMKgwqAgcmV0ID0gcm1pX3J0dF9kZXN0cm95KHZpcnRfdG9f cGh5cyhyZWFsbS0+cmQpLCBhZGRyLCBsZXZlbCwKPj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqAgJm91dF9ydHQsICZvdXRfdG9wKTsKPj4gKwo+PiArwqDCoMKgIGlmIChydHRf Z3JhbnVsZSkKPj4gK8KgwqDCoMKgwqDCoMKgICpydHRfZ3JhbnVsZSA9IG91dF9ydHQ7Cj4+ICvC oMKgwqAgaWYgKG5leHRfYWRkcikKPj4gK8KgwqDCoMKgwqDCoMKgICpuZXh0X2FkZHIgPSBvdXRf dG9wOwo+IAo+IG1pbm9yIG5pdDogQXMgbWVudGlvbmVkIGluIHRoZSBwcmV2aW91cyBwYXRjaCwg d2UgY291bGQgbW92ZSB0aGlzIGNoZWNrCj4gdG8gdGhlIHJtaV9ydHRfZGVzdHJveSgpLgoKRG9u ZSwgSSd2ZSBhbHNvIGRyb3BwZWQgdGhlIGNoZWNrIGZvciBydHRfZ3JhbnVsZSAtIGl0J3MgYSBi dWcgdG8gYmUKcGFzc2luZyB0aGF0IGFzIE5VTEwuCgo+PiArCj4+ICvCoMKgwqAgcmV0dXJuIHJl dDsKPj4gK30KPj4gKwo+PiArc3RhdGljIGludCByZWFsbV90ZWFyX2Rvd25fcnR0X2xldmVsKHN0 cnVjdCByZWFsbSAqcmVhbG0sIGludCBsZXZlbCwKPj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqAgdW5zaWduZWQgbG9uZyBzdGFydCwgdW5zaWduZWQgbG9uZyBlbmQp Cj4+ICt7Cj4+ICvCoMKgwqAgc3NpemVfdCBtYXBfc2l6ZTsKPj4gK8KgwqDCoCB1bnNpZ25lZCBs b25nIGFkZHIsIG5leHRfYWRkcjsKPj4gKwo+PiArwqDCoMKgIGlmIChXQVJOX09OKGxldmVsID4g Uk1FX1JUVF9NQVhfTEVWRUwpKQo+PiArwqDCoMKgwqDCoMKgwqAgcmV0dXJuIC1FSU5WQUw7Cj4+ ICsKPj4gK8KgwqDCoCBtYXBfc2l6ZSA9IHJtZV9ydHRfbGV2ZWxfbWFwc2l6ZShsZXZlbCAtIDEp Owo+PiArCj4+ICvCoMKgwqAgZm9yIChhZGRyID0gc3RhcnQ7IGFkZHIgPCBlbmQ7IGFkZHIgPSBu ZXh0X2FkZHIpIHsKPj4gK8KgwqDCoMKgwqDCoMKgIHBoeXNfYWRkcl90IHJ0dF9ncmFudWxlOwo+ PiArwqDCoMKgwqDCoMKgwqAgaW50IHJldDsKPj4gK8KgwqDCoMKgwqDCoMKgIHVuc2lnbmVkIGxv bmcgYWxpZ25fYWRkciA9IEFMSUdOKGFkZHIsIG1hcF9zaXplKTsKPj4gKwo+PiArwqDCoMKgwqDC oMKgwqAgbmV4dF9hZGRyID0gQUxJR04oYWRkciArIDEsIG1hcF9zaXplKTsKPj4gKwo+PiArwqDC oMKgwqDCoMKgwqAgaWYgKG5leHRfYWRkciA8PSBlbmQgJiYgYWxpZ25fYWRkciA9PSBhZGRyKSB7 Cj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHJldCA9IHJlYWxtX3J0dF9kZXN0cm95KHJlYWxt LCBhZGRyLCBsZXZlbCwKPj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqAgJnJ0dF9ncmFudWxlLCAmbmV4dF9hZGRyKTsKPj4gK8KgwqDCoMKgwqDCoMKgIH0g ZWxzZSB7Cj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIC8qIFJlY3Vyc2UgYSBsZXZlbCBkZWVw ZXIgKi8KPj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqAgcmV0ID0gcmVhbG1fdGVhcl9kb3duX3J0 dF9sZXZlbChyZWFsbSwKPj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoCBsZXZlbCArIDEsCj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgYWRkciwKPj4gK8KgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBtaW4obmV4dF9hZGRyLCBlbmQp KTsKPj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqAgaWYgKHJldCkKPj4gK8KgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoCByZXR1cm4gcmV0Owo+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBj b250aW51ZTsKPj4gK8KgwqDCoMKgwqDCoMKgIH0KPiAKPiBJIHRoaW5rIGl0IHdvdWxkIGJlIGJl dHRlciByZWFkYWJsZSBpZiB3ZSBkaWQgc29tZXRoaW5nIGxpa2UgOgo+IAo+IMKgwqDCoMKgwqDC oMKgIC8qCj4gwqDCoMKgwqDCoMKgwqDCoCAqIFRoZSB0YXJnZXQgcmFuZ2UgaXMgc21hbGxlciB0 aGFuIHdoYXQgdGhpcyBsZXZlbAo+IMKgwqDCoMKgwqDCoMKgwqAgKiBjb3ZlcnMuIEdvIGRlZXBl ci4KPiDCoMKgwqDCoMKgwqDCoMKgICovCj4gwqDCoMKgwqDCoMKgwqAgaWYgKG5leHRfYWRkciA+ IGVuZCB8fCBhbGlnbl9hZGRyICE9IGFkZHIpIHsKPiDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHJl dCA9IHJlYWxtX3RlYXJfZG93bl9ydHRfbGV2ZWwocmVhbG0sCj4gwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGxldmVsICsgMSwgYWRkciwKPiDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgbWlu KG5leHRfYWRkciwgZW5kKSk7Cj4gwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBpZiAocmV0KQo+IMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCByZXR1cm4gcmV0Owo+IMKgwqDCoMKgwqDCoMKg wqDCoMKgwqAgY29udGludWU7Cj4gwqDCoMKgwqDCoMKgwqAgfQo+IAo+IMKgwqDCoMKgwqDCoMKg IHJldCA9IHJlYWxtX3J0dF9kZXN0cm95KHJlYWxtLCBhZGRyLCBsZXZlbCwKPiDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCAmcnR0X2dyYW51bGUsICZuZXh0X2FkZHIpOwoK WWVzIHRoYXQgc2VlbXMgY2xlYXJseSwgdGhhbmtzIGZvciB0aGUgc3VnZ2VzdGlvbi4KCj4+ICsK Pj4gK8KgwqDCoMKgwqDCoMKgIHN3aXRjaCAoUk1JX1JFVFVSTl9TVEFUVVMocmV0KSkgewo+PiAr wqDCoMKgwqDCoMKgwqAgY2FzZSBSTUlfU1VDQ0VTUzoKPj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKg wqAgaWYgKCFXQVJOX09OKHJtaV9ncmFudWxlX3VuZGVsZWdhdGUocnR0X2dyYW51bGUpKSkKPj4g K8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBmcmVlX3BhZ2UoKHVuc2lnbmVkIGxvbmcp cGh5c190b192aXJ0KHJ0dF9ncmFudWxlKSk7Cj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGJy ZWFrOwo+PiArwqDCoMKgwqDCoMKgwqAgY2FzZSBSTUlfRVJST1JfUlRUOgo+PiArwqDCoMKgwqDC oMKgwqDCoMKgwqDCoCBpZiAobmV4dF9hZGRyID4gYWRkcikgewo+PiArwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgIC8qIHVuYXNzaWduZWQgb3IgZGVzdHJveWVkICovCj4gCj4gbWlub3Ig bml0Ogo+IMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCAvKiBSVFQgZG9lc24ndCBleGlz dCwgc2tpcCAqLwoKSW5kZWVkLCB0aGlzIGNvbW1lbnQgaXMgb3V0IG9mIGRhdGUgLSB0aGUgc3Bl YyBub3cgY2FsbHMgdGhpcyBjb25kaXRpb24KIk1pc3NpbmcgUlRUIiBzbyBJJ2xsIHVzZSB0aGF0 IHdvcmRpbmcuCgo+IAo+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGJyZWFrOwo+ PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCB9Cj4gCj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKg IGlmIChXQVJOX09OKFJNSV9SRVRVUk5fSU5ERVgocmV0KSAhPSBsZXZlbCkpCj4+ICvCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgcmV0dXJuIC1FQlVTWTsKPiAKPiBJbiBwcmFjdGlzZSwg d2Ugb25seSBjYWxsIHRoaXMgZm9yIHRoZSBmdWxsIElQQSByYW5nZSBhbmQgd2Ugd291bGRuJ3Qg Z28KPiBkZWVwZXIsIGlmIHRoZSB0b3AgbGV2ZWwgZW50cnkgd2FzIG1pc3NpbmcuIFNvLCB0aGVy ZSBpcyBubyByZWFzb24gd2h5Cj4gdGhlIFJNTSBkaWRuJ3Qgd2FsayB0byB0aGUgcmVxdWVzdGVk IGxldmVsLiBNYXkgYmUgd2UgY291bGQgYWRkIGEKPiBjb21tZW50IGhlcmUgOgo+IMKgwqDCoMKg wqDCoMKgwqDCoMKgwqAgLyoKPiDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgKiBXZSB0ZWFyIGRv d24gdGhlIFJUVCByYW5nZSBmb3IgdGhlIGZ1bGwgSVBBCj4gwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgICogc3BhY2UsIGFmdGVyIGV2ZXJ5dGhpbmcgaXMgdW5tYXBwZWQuIEFsc28gd2UKPiDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqAgKiBkZXNjZW5kIGRvd24gb25seSBpZiB3ZSBjYW5ub3QgdGVh ciBkb3duIGEKPiDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgKiB0b3AgbGV2ZWwgUlRULiBUaHVz IFJNTSBtdXN0IGJlIGFibGUgdG8gd2Fsawo+IMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCAqIHRv IHRoZSByZXF1ZXN0ZWQgbGV2ZWwuIGUuZy4sIGEgYmxvY2sgbWFwcGluZwo+IMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoCAqIGV4aXN0cyBhdCBMMSBvciBMMi4KPiDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqAgKi8KClN1cmUsIHdpbGwgYWRkLgoKPj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqAgaWYg KFdBUk5fT04obGV2ZWwgPT0gUk1FX1JUVF9NQVhfTEVWRUwpKSB7Cj4+ICvCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqAgLy8gTGl2ZSBlbnRyeQo+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgIHJldHVybiAtRUJVU1k7Cj4gCj4gCj4gVGhlIGZpcnN0IHBhcnQgb2YgdGhlIGNv bW1lbnQgYWJvdmUgYXBwbGllcyB0byB0aGlzLiBTbyBtYXkgYmUgaXQgaXMKPiBnb29kIHRvIGhh dmUgaXQuCj4gCj4gCj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIH0KPiAKPj4gK8KgwqDCoMKg wqDCoMKgwqDCoMKgwqAgLyogUmVjdXJzZSBhIGxldmVsIGRlZXBlciAqLwo+IAo+IG1pbm9yIG5p dDoKPiDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIC8qCj4gwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg ICogVGhlIHRhYmxlIGhhcyBhY3RpdmUgZW50cmllcyBpbiBpdCwgcmVjdXJzZQo+IMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoCAqIGRlZXBlciBhbmQgdGVhciBkb3duIHRoZSBSVFRzLgo+IMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoCAqLwoKU3VyZQoKPj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqAg bmV4dF9hZGRyID0gQUxJR04oYWRkciArIDEsIG1hcF9zaXplKTsKPj4gK8KgwqDCoMKgwqDCoMKg wqDCoMKgwqAgcmV0ID0gcmVhbG1fdGVhcl9kb3duX3J0dF9sZXZlbChyZWFsbSwKPj4gK8KgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBsZXZlbCAr IDEsCj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqAgYWRkciwKPj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoCBuZXh0X2FkZHIpOwo+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBpZiAo cmV0KQo+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHJldHVybiByZXQ7Cj4+ICvC oMKgwqDCoMKgwqDCoMKgwqDCoMKgIC8qIFRyeSBhZ2FpbiBhdCB0aGlzIGxldmVsICovCj4gCj4g wqDCoMKgwqDCoMKgwqDCoMKgwqDCoCAvKgo+IMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCAqIE5v dyB0aGF0IHRoZSBjaGlsZHJlbiBSVFRzIGFyZSBkZXN0cm95ZWQsCj4gwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgICogcmV0cnkgYXQgdGhpcyBsZXZlbC4KPiDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqAgKi8KClN1cmUKCj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIG5leHRfYWRkciA9IGFkZHI7 Cj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGJyZWFrOwo+PiArwqDCoMKgwqDCoMKgwqAgZGVm YXVsdDoKPj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqAgV0FSTl9PTigxKTsKPj4gK8KgwqDCoMKg wqDCoMKgwqDCoMKgwqAgcmV0dXJuIC1FTlhJTzsKPj4gK8KgwqDCoMKgwqDCoMKgIH0KPj4gK8Kg wqDCoCB9Cj4+ICsKPj4gK8KgwqDCoCByZXR1cm4gMDsKPj4gK30KPj4gKwo+PiArc3RhdGljIGlu dCByZWFsbV90ZWFyX2Rvd25fcnR0X3JhbmdlKHN0cnVjdCByZWFsbSAqcmVhbG0sCj4+ICvCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHVuc2lnbmVkIGxvbmcgc3RhcnQs IHVuc2lnbmVkIGxvbmcgZW5kKQo+PiArewo+PiArwqDCoMKgIHJldHVybiByZWFsbV90ZWFyX2Rv d25fcnR0X2xldmVsKHJlYWxtLCBnZXRfc3RhcnRfbGV2ZWwocmVhbG0pICsgMSwKPj4gK8KgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgc3RhcnQsIGVuZCk7Cj4+ICt9Cj4+ ICsKPj4gK3N0YXRpYyB2b2lkIGVuc3VyZV9zcGFyZV9wYWdlKHN0cnVjdCByZWFsbSAqcmVhbG0p Cj4+ICt7Cj4+ICvCoMKgwqAgcGh5c19hZGRyX3QgdG1wX3J0dDsKPj4gKwo+PiArwqDCoMKgIC8q Cj4+ICvCoMKgwqDCoCAqIE1ha2Ugc3VyZSB3ZSBoYXZlIGEgc3BhcmUgZGVsZWdhdGVkIHBhZ2Ug Zm9yIHRlYXJpbmcgZG93biB0aGUKPj4gK8KgwqDCoMKgICogYmxvY2sgbWFwcGluZ3MuIFdlIGRv IHRoaXMgYnkgYWxsb2NhdGluZyB0aGVuIGZyZWVpbmcgYSBwYWdlLgo+PiArwqDCoMKgwqAgKiBX ZSBtdXN0IHVzZSBBdG9taWMgYWxsb2NhdGlvbnMgYXMgd2UgYXJlIGNhbGxlZCB3aXRoCj4+IGt2 bS0+bW11X2xvY2sKPj4gK8KgwqDCoMKgICogaGVsZC4KPj4gK8KgwqDCoMKgICovCj4+ICvCoMKg wqAgdG1wX3J0dCA9IF9fYWxsb2NfZGVsZWdhdGVkX3BhZ2UocmVhbG0sIE5VTEwsIEdGUF9BVE9N SUMpOwo+PiArCj4+ICvCoMKgwqAgLyoKPj4gK8KgwqDCoMKgICogSWYgdGhlIGFsbG9jYXRpb24g ZmFpbGVkLCBjb250aW51ZSBhcyB3ZSBtYXkgbm90IGhhdmUgYSBibG9jawo+PiBsZXZlbAo+PiAr wqDCoMKgwqAgKiBtYXBwaW5nIHNvIGl0IG1heSBub3QgYmUgZmF0YWwsIG90aGVyd2lzZSBmcmVl IGl0IHRvIGFzc2lnbiBpdAo+PiArwqDCoMKgwqAgKiB0byB0aGUgc3BhcmUgcGFnZS4KPj4gK8Kg wqDCoMKgICovCj4+ICvCoMKgwqAgaWYgKHRtcF9ydHQgIT0gUEhZU19BRERSX01BWCkKPj4gK8Kg wqDCoMKgwqDCoMKgIGZyZWVfZGVsZWdhdGVkX3BhZ2UocmVhbG0sIHRtcF9ydHQpOwo+PiArfQo+ PiArCj4+ICt2b2lkIGt2bV9yZWFsbV9kZXN0cm95X3J0dHMoc3RydWN0IGt2bSAqa3ZtLCB1MzIg aWFfYml0cykKPj4gK3sKPj4gK8KgwqDCoCBzdHJ1Y3QgcmVhbG0gKnJlYWxtID0gJmt2bS0+YXJj aC5yZWFsbTsKPj4gKwo+PiArwqDCoMKgIGVuc3VyZV9zcGFyZV9wYWdlKHJlYWxtKTsKPj4gKwo+ PiArwqDCoMKgIFdBUk5fT04ocmVhbG1fdGVhcl9kb3duX3J0dF9yYW5nZShyZWFsbSwgMCwgKDFV TCA8PCBpYV9iaXRzKSkpOwo+PiArfQo+IAo+IG1pbm9yIG5pdDogV2UgZG9uJ3Qgc2VlbSB0byBi ZSB1c2luZyB0aGUgInNwYXJlX3BhZ2UiIHlldCBpbiB0aGlzIHBhdGNoLgo+IE1heSBiZSBhIGdv b2QgaWRlYSB0byBtb3ZlIGFsbCB0aGUgcmVsYXRlZCBjaGFuZ2VzCj4gKGFsbG9jX2RlbGVnYXRl ZF9wYWdlKCkgLyBmcmVlX2RlbGVnYXRlZF9wYWdlLCBlbnN1cmVfc3BhcmVfcGFnZSgpIGV0YykK PiB0byB0aGUgcGF0Y2ggd2hlcmUgaXQgbWF5IGJlIGJldHRlciBzdWl0ZWQgPwoKR29vZCBwb2lu dCAtIEkgdGhpbmsgdGhlIGNhbGxzIGdldCBhZGRlZCBpbiAiYXJtNjQ6IFJNRTogQWxsb3cgVk1N IHRvCnNldCBSSVBBUyIuIEknbGwgdHJ5IHRvIG1vdmUgdGhlbSB0aGVyZS4KClRoYW5rcywKClN0 ZXZlCgo+IFN1enVraQo+IAo+PiArCj4+IMKgIC8qIFByb3RlY3RzIGFjY2VzcyB0byBybWVfdm1p ZF9iaXRtYXAgKi8KPj4gwqAgc3RhdGljIERFRklORV9TUElOTE9DSyhybWVfdm1pZF9sb2NrKTsK Pj4gwqAgc3RhdGljIHVuc2lnbmVkIGxvbmcgKnJtZV92bWlkX2JpdG1hcDsKPiAKCgpfX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwpsaW51eC1hcm0ta2VybmVs IG1haWxpbmcgbGlzdApsaW51eC1hcm0ta2VybmVsQGxpc3RzLmluZnJhZGVhZC5vcmcKaHR0cDov L2xpc3RzLmluZnJhZGVhZC5vcmcvbWFpbG1hbi9saXN0aW5mby9saW51eC1hcm0ta2VybmVsCg==