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 vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 03D25C636D7 for ; Mon, 13 Feb 2023 01:51:48 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229611AbjBMBvq (ORCPT ); Sun, 12 Feb 2023 20:51:46 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:56036 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229457AbjBMBvo (ORCPT ); Sun, 12 Feb 2023 20:51:44 -0500 Received: from ex01.ufhost.com (ex01.ufhost.com [61.152.239.75]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 19112EC7D for ; Sun, 12 Feb 2023 17:51:40 -0800 (PST) Received: from EXMBX165.cuchost.com (unknown [175.102.18.54]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (Client CN "EXMBX165", Issuer "EXMBX165" (not verified)) by ex01.ufhost.com (Postfix) with ESMTP id CDDDB24E1F6; Mon, 13 Feb 2023 09:51:29 +0800 (CST) Received: from EXMBX061.cuchost.com (172.16.6.61) by EXMBX165.cuchost.com (172.16.6.75) with Microsoft SMTP Server (TLS) id 15.0.1497.42; Mon, 13 Feb 2023 09:51:29 +0800 Received: from EXMBX066.cuchost.com (172.16.7.66) by EXMBX061.cuchost.com (172.16.6.61) with Microsoft SMTP Server (TLS) id 15.0.1497.42; Mon, 13 Feb 2023 09:51:29 +0800 Received: from EXMBX066.cuchost.com ([fe80::5947:9245:907e:339f]) by EXMBX066.cuchost.com ([fe80::5947:9245:907e:339f%17]) with mapi id 15.00.1497.044; Mon, 13 Feb 2023 09:51:29 +0800 From: JeeHeng Sia To: Alexandre Ghiti , "paul.walmsley@sifive.com" , "palmer@dabbelt.com" , "aou@eecs.berkeley.edu" CC: "linux-riscv@lists.infradead.org" , "linux-kernel@vger.kernel.org" , Leyfoon Tan , Mason Huo Subject: RE: [PATCH v3 4/4] RISC-V: Add arch functions to support hibernation/suspend-to-disk Thread-Topic: [PATCH v3 4/4] RISC-V: Add arch functions to support hibernation/suspend-to-disk Thread-Index: AQHZMi9ZN0+4F1UUIkevO0NjoPA2067DLC2AgAFYUND///wZgIABtH4wgAGGZICABHK2QA== Date: Mon, 13 Feb 2023 01:51:29 +0000 Message-ID: References: <20230127091051.1465278-1-jeeheng.sia@starfivetech.com> <20230127091051.1465278-5-jeeheng.sia@starfivetech.com> <5b0f10eb-df3c-81f1-8d06-e65956bd0412@ghiti.fr> <1e24323f1fcb4ba0a45d3889074df907@EXMBX066.cuchost.com> <125a8efc-da13-a08f-8218-76e6167634d7@ghiti.fr> In-Reply-To: <125a8efc-da13-a08f-8218-76e6167634d7@ghiti.fr> Accept-Language: en-US, zh-CN Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: x-ms-exchange-transport-fromentityheader: Hosted x-originating-ip: [60.50.196.81] x-yovoleruleagent: yovoleflag Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org SGkgQWxleCwNCg0KPiAtLS0tLU9yaWdpbmFsIE1lc3NhZ2UtLS0tLQ0KPiBGcm9tOiBBbGV4YW5k cmUgR2hpdGkgPGFsZXhAZ2hpdGkuZnI+DQo+IFNlbnQ6IEZyaWRheSwgMTAgRmVicnVhcnksIDIw MjMgOToyNCBQTQ0KPiBUbzogSmVlSGVuZyBTaWEgPGplZWhlbmcuc2lhQHN0YXJmaXZldGVjaC5j b20+OyBwYXVsLndhbG1zbGV5QHNpZml2ZS5jb207IHBhbG1lckBkYWJiZWx0LmNvbTsgYW91QGVl Y3MuYmVya2VsZXkuZWR1DQo+IENjOiBsaW51eC1yaXNjdkBsaXN0cy5pbmZyYWRlYWQub3JnOyBs aW51eC1rZXJuZWxAdmdlci5rZXJuZWwub3JnOyBMZXlmb29uIFRhbiA8bGV5Zm9vbi50YW5Ac3Rh cmZpdmV0ZWNoLmNvbT47IE1hc29uIEh1bw0KPiA8bWFzb24uaHVvQHN0YXJmaXZldGVjaC5jb20+ DQo+IFN1YmplY3Q6IFJlOiBbUEFUQ0ggdjMgNC80XSBSSVNDLVY6IEFkZCBhcmNoIGZ1bmN0aW9u cyB0byBzdXBwb3J0IGhpYmVybmF0aW9uL3N1c3BlbmQtdG8tZGlzaw0KPiANCj4gT24gMi85LzIz IDA3OjEyLCBKZWVIZW5nIFNpYSB3cm90ZToNCj4gPiBIaSBBbGV4LA0KPiA+DQo+ID4+IC0tLS0t T3JpZ2luYWwgTWVzc2FnZS0tLS0tDQo+ID4+IEZyb206IEFsZXhhbmRyZSBHaGl0aSA8YWxleEBn aGl0aS5mcj4NCj4gPj4gU2VudDogV2VkbmVzZGF5LCA4IEZlYnJ1YXJ5LCAyMDIzIDg6MDUgUE0N Cj4gPj4gVG86IEplZUhlbmcgU2lhIDxqZWVoZW5nLnNpYUBzdGFyZml2ZXRlY2guY29tPjsgcGF1 bC53YWxtc2xleUBzaWZpdmUuY29tOyBwYWxtZXJAZGFiYmVsdC5jb207IGFvdUBlZWNzLmJlcmtl bGV5LmVkdQ0KPiA+PiBDYzogbGludXgtcmlzY3ZAbGlzdHMuaW5mcmFkZWFkLm9yZzsgbGludXgt a2VybmVsQHZnZXIua2VybmVsLm9yZzsgTGV5Zm9vbiBUYW4gPGxleWZvb24udGFuQHN0YXJmaXZl dGVjaC5jb20+OyBNYXNvbiBIdW8NCj4gPj4gPG1hc29uLmh1b0BzdGFyZml2ZXRlY2guY29tPg0K PiA+PiBTdWJqZWN0OiBSZTogW1BBVENIIHYzIDQvNF0gUklTQy1WOiBBZGQgYXJjaCBmdW5jdGlv bnMgdG8gc3VwcG9ydCBoaWJlcm5hdGlvbi9zdXNwZW5kLXRvLWRpc2sNCj4gPj4NCj4gPj4gSGkg U2lhLA0KPiA+Pg0KPiA+PiBPbiAyLzgvMjMgMDU6NDMsIEplZUhlbmcgU2lhIHdyb3RlOg0KPiA+ Pj4+IC0tLS0tT3JpZ2luYWwgTWVzc2FnZS0tLS0tDQo+ID4+Pj4gRnJvbTogQWxleGFuZHJlIEdo aXRpIDxhbGV4QGdoaXRpLmZyPg0KPiA+Pj4+IFNlbnQ6IFR1ZXNkYXksIDcgRmVicnVhcnksIDIw MjMgMTE6NDYgUE0NCj4gPj4+PiBUbzogSmVlSGVuZyBTaWEgPGplZWhlbmcuc2lhQHN0YXJmaXZl dGVjaC5jb20+OyBwYXVsLndhbG1zbGV5QHNpZml2ZS5jb207IHBhbG1lckBkYWJiZWx0LmNvbTsg YW91QGVlY3MuYmVya2VsZXkuZWR1DQo+ID4+Pj4gQ2M6IGxpbnV4LXJpc2N2QGxpc3RzLmluZnJh ZGVhZC5vcmc7IGxpbnV4LWtlcm5lbEB2Z2VyLmtlcm5lbC5vcmc7IExleWZvb24gVGFuIDxsZXlm b29uLnRhbkBzdGFyZml2ZXRlY2guY29tPjsgTWFzb24gSHVvDQo+ID4+Pj4gPG1hc29uLmh1b0Bz dGFyZml2ZXRlY2guY29tPg0KPiA+Pj4+IFN1YmplY3Q6IFJlOiBbUEFUQ0ggdjMgNC80XSBSSVND LVY6IEFkZCBhcmNoIGZ1bmN0aW9ucyB0byBzdXBwb3J0IGhpYmVybmF0aW9uL3N1c3BlbmQtdG8t ZGlzaw0KPiA+Pj4+DQo+ID4+Pj4gSGkgU2lhLA0KPiA+Pj4+DQo+ID4+Pj4gT24gMS8yNy8yMyAx MDoxMCwgU2lhIEplZSBIZW5nIHdyb3RlOg0KPiA+Pj4+PiBMb3cgbGV2ZWwgQXJjaCBmdW5jdGlv bnMgd2VyZSBjcmVhdGVkIHRvIHN1cHBvcnQgaGliZXJuYXRpb24uDQo+ID4+Pj4+IHN3c3VzcF9h cmNoX3N1c3BlbmQoKSByZWxpZXMgY29kZSBmcm9tIF9fY3B1X3N1c3BlbmRfZW50ZXIoKSB0byB3 cml0ZQ0KPiA+Pj4+PiBjcHUgc3RhdGUgb250byB0aGUgc3RhY2ssIHRoZW4gY2FsbGluZyBzd3N1 c3Bfc2F2ZSgpIHRvIHNhdmUgdGhlIG1lbW9yeQ0KPiA+Pj4+PiBpbWFnZS4NCj4gPj4+Pj4NCj4g Pj4+Pj4gQXJjaCBzcGVjaWZpYyBoaWJlcm5hdGlvbiBoZWFkZXIgaXMgaW1wbGVtZW50ZWQgYW5k IGlzIHV0aWxpemVkIGJ5IHRoZQ0KPiA+Pj4+PiBhcmNoX2hpYmVybmF0aW9uX2hlYWRlcl9yZXN0 b3JlKCkgYW5kIGFyY2hfaGliZXJuYXRpb25faGVhZGVyX3NhdmUoKQ0KPiA+Pj4+PiBmdW5jdGlv bnMuIFRoZSBhcmNoIHNwZWNpZmljIGhpYmVybmF0aW9uIGhlYWRlciBjb25zaXN0cyBvZiBzYXRw LCBoYXJ0aWQsDQo+ID4+Pj4+IGFuZCB0aGUgY3B1X3Jlc3VtZSBhZGRyZXNzLiBUaGUga2VybmVs IGJ1aWx0IHZlcnNpb24gaXMgYWxzbyBuZWVkIHRvIGJlDQo+ID4+Pj4+IHNhdmVkIGludG8gdGhl IGhpYmVybmF0aW9uIGltYWdlIGhlYWRlciB0byBtYWtpbmcgc3VyZSBvbmx5IHRoZSBzYW1lDQo+ ID4+Pj4+IGtlcm5lbCBpcyByZXN0b3JlIHdoZW4gcmVzdW1lLg0KPiA+Pj4+Pg0KPiA+Pj4+PiBz d3N1c3BfYXJjaF9yZXN1bWUoKSBjcmVhdGVzIGEgdGVtcG9yYXJ5IHBhZ2UgdGFibGUgdGhhdCBj b3ZlcmluZyBvbmx5DQo+ID4+Pj4+IHRoZSBsaW5lYXIgbWFwLiBJdCBjb3BpZXMgdGhlIHJlc3Rv cmUgY29kZSB0byBhICdzYWZlJyBwYWdlLCB0aGVuIHN0YXJ0DQo+ID4+Pj4+IHRvIHJlc3RvcmUg dGhlIG1lbW9yeSBpbWFnZS4gT25jZSBjb21wbGV0ZWQsIGl0IHJlc3RvcmVzIHRoZSBvcmlnaW5h bA0KPiA+Pj4+PiBrZXJuZWwncyBwYWdlIHRhYmxlLiBJdCB0aGVuIGNhbGxzIGludG8gX19oaWJl cm5hdGVfY3B1X3Jlc3VtZSgpDQo+ID4+Pj4+IHRvIHJlc3RvcmUgdGhlIENQVSBjb250ZXh0LiBG aW5hbGx5LCBpdCBmb2xsb3dzIHRoZSBub3JtYWwgaGliZXJuYXRpb24NCj4gPj4+Pj4gcGF0aCBi YWNrIHRvIHRoZSBoaWJlcm5hdGlvbiBjb3JlLg0KPiA+Pj4+Pg0KPiA+Pj4+PiBUbyBlbmFibGUg aGliZXJuYXRpb24vc3VzcGVuZCB0byBkaXNrIGludG8gUklTQ1YsIHRoZSBiZWxvdyBjb25maWcN Cj4gPj4+Pj4gbmVlZCB0byBiZSBlbmFibGVkOg0KPiA+Pj4+PiAtIENPTkZJR19BUkNIX0hJQkVS TkFUSU9OX0hFQURFUg0KPiA+Pj4+PiAtIENPTkZJR19BUkNIX0hJQkVSTkFUSU9OX1BPU1NJQkxF DQo+ID4+Pj4+DQo+ID4+Pj4+IFNpZ25lZC1vZmYtYnk6IFNpYSBKZWUgSGVuZyA8amVlaGVuZy5z aWFAc3RhcmZpdmV0ZWNoLmNvbT4NCj4gPj4+Pj4gUmV2aWV3ZWQtYnk6IExleSBGb29uIFRhbiA8 bGV5Zm9vbi50YW5Ac3RhcmZpdmV0ZWNoLmNvbT4NCj4gPj4+Pj4gUmV2aWV3ZWQtYnk6IE1hc29u IEh1byA8bWFzb24uaHVvQHN0YXJmaXZldGVjaC5jb20+DQo+ID4+Pj4+IC0tLQ0KPiA+Pj4+PiAg ICAgYXJjaC9yaXNjdi9LY29uZmlnICAgICAgICAgICAgICAgICB8ICAgNyArDQo+ID4+Pj4+ICAg ICBhcmNoL3Jpc2N2L2luY2x1ZGUvYXNtL2Fzc2VtYmxlci5oIHwgIDIwICsrDQo+ID4+Pj4+ICAg ICBhcmNoL3Jpc2N2L2luY2x1ZGUvYXNtL3N1c3BlbmQuaCAgIHwgIDIxICsrDQo+ID4+Pj4+ICAg ICBhcmNoL3Jpc2N2L2tlcm5lbC9NYWtlZmlsZSAgICAgICAgIHwgICAxICsNCj4gPj4+Pj4gICAg IGFyY2gvcmlzY3Yva2VybmVsL2FzbS1vZmZzZXRzLmMgICAgfCAgIDUgKw0KPiA+Pj4+PiAgICAg YXJjaC9yaXNjdi9rZXJuZWwvaGliZXJuYXRlLWFzbS5TICB8ICA4OSArKysrKysrDQo+ID4+Pj4+ ICAgICBhcmNoL3Jpc2N2L2tlcm5lbC9oaWJlcm5hdGUuYyAgICAgIHwgMzYwICsrKysrKysrKysr KysrKysrKysrKysrKysrKysrDQo+ID4+Pj4+ICAgICA3IGZpbGVzIGNoYW5nZWQsIDUwMyBpbnNl cnRpb25zKCspDQo+ID4+Pj4+ICAgICBjcmVhdGUgbW9kZSAxMDA2NDQgYXJjaC9yaXNjdi9rZXJu ZWwvaGliZXJuYXRlLWFzbS5TDQo+ID4+Pj4+ICAgICBjcmVhdGUgbW9kZSAxMDA2NDQgYXJjaC9y aXNjdi9rZXJuZWwvaGliZXJuYXRlLmMNCj4gPj4+Pj4NCj4gPj4+Pj4gZGlmZiAtLWdpdCBhL2Fy Y2gvcmlzY3YvS2NvbmZpZyBiL2FyY2gvcmlzY3YvS2NvbmZpZw0KPiA+Pj4+PiBpbmRleCBlMmI2 NTYwNDNhYmYuLjQ1NTU4NDhhODE3ZiAxMDA2NDQNCj4gPj4+Pj4gLS0tIGEvYXJjaC9yaXNjdi9L Y29uZmlnDQo+ID4+Pj4+ICsrKyBiL2FyY2gvcmlzY3YvS2NvbmZpZw0KPiA+Pj4+PiBAQCAtNjkw LDYgKzY5MCwxMyBAQCBtZW51ICJQb3dlciBtYW5hZ2VtZW50IG9wdGlvbnMiDQo+ID4+Pj4+DQo+ ID4+Pj4+ICAgICBzb3VyY2UgImtlcm5lbC9wb3dlci9LY29uZmlnIg0KPiA+Pj4+Pg0KPiA+Pj4+ PiArY29uZmlnIEFSQ0hfSElCRVJOQVRJT05fUE9TU0lCTEUNCj4gPj4+Pj4gKwlkZWZfYm9vbCB5 DQo+ID4+Pj4+ICsNCj4gPj4+Pj4gK2NvbmZpZyBBUkNIX0hJQkVSTkFUSU9OX0hFQURFUg0KPiA+ Pj4+PiArCWRlZl9ib29sIHkNCj4gPj4+Pj4gKwlkZXBlbmRzIG9uIEhJQkVSTkFUSU9ODQo+ID4+ Pj4+ICsNCj4gPj4+Pj4gICAgIGVuZG1lbnUgIyAiUG93ZXIgbWFuYWdlbWVudCBvcHRpb25zIg0K PiA+Pj4+Pg0KPiA+Pj4+PiAgICAgbWVudSAiQ1BVIFBvd2VyIE1hbmFnZW1lbnQiDQo+ID4+Pj4+ IGRpZmYgLS1naXQgYS9hcmNoL3Jpc2N2L2luY2x1ZGUvYXNtL2Fzc2VtYmxlci5oIGIvYXJjaC9y aXNjdi9pbmNsdWRlL2FzbS9hc3NlbWJsZXIuaA0KPiA+Pj4+PiBpbmRleCBlZjEyODNkMDRiNzAu LjNkZTcwZDNlNmNlYiAxMDA2NDQNCj4gPj4+Pj4gLS0tIGEvYXJjaC9yaXNjdi9pbmNsdWRlL2Fz bS9hc3NlbWJsZXIuaA0KPiA+Pj4+PiArKysgYi9hcmNoL3Jpc2N2L2luY2x1ZGUvYXNtL2Fzc2Vt Ymxlci5oDQo+ID4+Pj4+IEBAIC01OSw0ICs1OSwyNCBAQA0KPiA+Pj4+PiAgICAgCQlSRUdfTAlz MTEsIChTVVNQRU5EX0NPTlRFWFRfUkVHUyArIFBUX1MxMSkoYTApDQo+ID4+Pj4+ICAgICAJLmVu ZG0NCj4gPj4+Pj4NCj4gPj4+Pj4gKy8qKg0KPiA+Pj4+PiArICogY29weV9wYWdlIC0gY29weSAx IHBhZ2UgKDRLQikgb2YgZGF0YSBmcm9tIHNvdXJjZSB0byBkZXN0aW5hdGlvbg0KPiA+Pj4+PiAr ICogQGEwIC0gZGVzdGluYXRpb24NCj4gPj4+Pj4gKyAqIEBhMSAtIHNvdXJjZQ0KPiA+Pj4+PiAr ICovDQo+ID4+Pj4+ICsJLm1hY3JvCWNvcHlfcGFnZSBhMCwgYTENCj4gPj4+Pj4gKwkJbHVpCWEy LCAweDENCj4gPj4+Pj4gKwkJYWRkCWEyLCBhMiwgYTANCj4gPj4+Pj4gKy4xIDoNCj4gPj4+Pj4g KwkJUkVHX0wJdDAsIDAoYTEpDQo+ID4+Pj4+ICsJCVJFR19MCXQxLCBTWlJFRyhhMSkNCj4gPj4+ Pj4gKw0KPiA+Pj4+PiArCQlSRUdfUwl0MCwgMChhMCkNCj4gPj4+Pj4gKwkJUkVHX1MJdDEsIFNa UkVHKGEwKQ0KPiA+Pj4+PiArDQo+ID4+Pj4+ICsJCWFkZGkJYTAsIGEwLCAyICogU1pSRUcNCj4g Pj4+Pj4gKwkJYWRkaQlhMSwgYTEsIDIgKiBTWlJFRw0KPiA+Pj4+PiArCQlibmUJYTIsIGEwLCAu MQ0KPiA+Pj4+PiArCS5lbmRtDQo+ID4+Pj4+ICsNCj4gPj4+Pj4gICAgICNlbmRpZgkvKiBfX0FT TV9BU1NFTUJMRVJfSCAqLw0KPiA+Pj4+PiBkaWZmIC0tZ2l0IGEvYXJjaC9yaXNjdi9pbmNsdWRl L2FzbS9zdXNwZW5kLmggYi9hcmNoL3Jpc2N2L2luY2x1ZGUvYXNtL3N1c3BlbmQuaA0KPiA+Pj4+ PiBpbmRleCA3NTQxOWM1Y2EyNzIuLmRiNDBhZTQzM2FhOSAxMDA2NDQNCj4gPj4+Pj4gLS0tIGEv YXJjaC9yaXNjdi9pbmNsdWRlL2FzbS9zdXNwZW5kLmgNCj4gPj4+Pj4gKysrIGIvYXJjaC9yaXNj di9pbmNsdWRlL2FzbS9zdXNwZW5kLmgNCj4gPj4+Pj4gQEAgLTIxLDYgKzIxLDEyIEBAIHN0cnVj dCBzdXNwZW5kX2NvbnRleHQgew0KPiA+Pj4+PiAgICAgI2VuZGlmDQo+ID4+Pj4+ICAgICB9Ow0K PiA+Pj4+Pg0KPiA+Pj4+PiArLyoNCj4gPj4+Pj4gKyAqIFRoaXMgcGFyYW1ldGVyIHdpbGwgYmUg YXNzaWduZWQgdG8gMCBkdXJpbmcgcmVzdW1lIGFuZCB3aWxsIGJlIHVzZWQgYnkNCj4gPj4+Pj4g KyAqIGhpYmVybmF0aW9uIGNvcmUgZm9yIHRoZSBzdWJzZXF1ZW50IHJlc3VtZSBzZXF1ZW5jZQ0K PiA+Pj4+PiArICovDQo+ID4+Pj4+ICtleHRlcm4gaW50IGluX3N1c3BlbmQ7DQo+ID4+Pj4+ICsN Cj4gPj4+Pj4gICAgIC8qIExvdy1sZXZlbCBDUFUgc3VzcGVuZCBlbnRyeSBmdW5jdGlvbiAqLw0K PiA+Pj4+PiAgICAgaW50IF9fY3B1X3N1c3BlbmRfZW50ZXIoc3RydWN0IHN1c3BlbmRfY29udGV4 dCAqY29udGV4dCk7DQo+ID4+Pj4+DQo+ID4+Pj4+IEBAIC0zNiw0ICs0MiwxOSBAQCBpbnQgX19j cHVfcmVzdW1lX2VudGVyKHVuc2lnbmVkIGxvbmcgaGFydGlkLCB1bnNpZ25lZCBsb25nIGNvbnRl eHQpOw0KPiA+Pj4+PiAgICAgLyogVXNlZCB0byBzYXZlIGFuZCByZXN0b3JlIHRoZSBjc3IgKi8N Cj4gPj4+Pj4gICAgIHZvaWQgc3VzcGVuZF9zYXZlX2NzcnMoc3RydWN0IHN1c3BlbmRfY29udGV4 dCAqY29udGV4dCk7DQo+ID4+Pj4+ICAgICB2b2lkIHN1c3BlbmRfcmVzdG9yZV9jc3JzKHN0cnVj dCBzdXNwZW5kX2NvbnRleHQgKmNvbnRleHQpOw0KPiA+Pj4+PiArDQo+ID4+Pj4+ICsvKiBMb3ct bGV2ZWwgQVBJIHRvIHN1cHBvcnQgaGliZXJuYXRpb24gKi8NCj4gPj4+Pj4gK2ludCBzd3N1c3Bf YXJjaF9zdXNwZW5kKHZvaWQpOw0KPiA+Pj4+PiAraW50IHN3c3VzcF9hcmNoX3Jlc3VtZSh2b2lk KTsNCj4gPj4+Pj4gK2ludCBhcmNoX2hpYmVybmF0aW9uX2hlYWRlcl9zYXZlKHZvaWQgKmFkZHIs IHVuc2lnbmVkIGludCBtYXhfc2l6ZSk7DQo+ID4+Pj4+ICtpbnQgYXJjaF9oaWJlcm5hdGlvbl9o ZWFkZXJfcmVzdG9yZSh2b2lkICphZGRyKTsNCj4gPj4+Pj4gK2ludCBfX2hpYmVybmF0ZV9jcHVf cmVzdW1lKHZvaWQpOw0KPiA+Pj4+PiArDQo+ID4+Pj4+ICsvKiBVc2VkIHRvIHJlc3VtZSBvbiB0 aGUgQ1BVIHdlIGhpYmVybmF0ZWQgb24gKi8NCj4gPj4+Pj4gK2ludCBoaWJlcm5hdGVfcmVzdW1l X25vbmJvb3RfY3B1X2Rpc2FibGUodm9pZCk7DQo+ID4+Pj4+ICsNCj4gPj4+Pj4gKy8qIFVzZWQg dG8gcmVzdG9yZSB0aGUgaGliZXJuYXRlZCBpbWFnZSAqLw0KPiA+Pj4+PiArYXNtbGlua2FnZSB2 b2lkIHJlc3RvcmVfaW1hZ2UodW5zaWduZWQgbG9uZyByZXN1bWVfc2F0cCwgdW5zaWduZWQgbG9u ZyBzYXRwX3RlbXAsDQo+ID4+Pj4+ICsJCQkJdW5zaWduZWQgbG9uZyBjcHVfcmVzdW1lKTsNCj4g Pj4+Pj4gK2FzbWxpbmthZ2UgaW50IGNvcmVfcmVzdG9yZV9jb2RlKHZvaWQpOw0KPiA+Pj4+PiAg ICAgI2VuZGlmDQo+ID4+Pj4+IGRpZmYgLS1naXQgYS9hcmNoL3Jpc2N2L2tlcm5lbC9NYWtlZmls ZSBiL2FyY2gvcmlzY3Yva2VybmVsL01ha2VmaWxlDQo+ID4+Pj4+IGluZGV4IDRjZjMwM2E3Nzlh Yi4uZGFhYjM0MWQ1NWU0IDEwMDY0NA0KPiA+Pj4+PiAtLS0gYS9hcmNoL3Jpc2N2L2tlcm5lbC9N YWtlZmlsZQ0KPiA+Pj4+PiArKysgYi9hcmNoL3Jpc2N2L2tlcm5lbC9NYWtlZmlsZQ0KPiA+Pj4+ PiBAQCAtNjQsNiArNjQsNyBAQCBvYmotJChDT05GSUdfTU9EVUxFUykJCSs9IG1vZHVsZS5vDQo+ ID4+Pj4+ICAgICBvYmotJChDT05GSUdfTU9EVUxFX1NFQ1RJT05TKQkrPSBtb2R1bGUtc2VjdGlv bnMubw0KPiA+Pj4+Pg0KPiA+Pj4+PiAgICAgb2JqLSQoQ09ORklHX0NQVV9QTSkJCSs9IHN1c3Bl bmRfZW50cnkubyBzdXNwZW5kLm8NCj4gPj4+Pj4gK29iai0kKENPTkZJR19ISUJFUk5BVElPTikJ Kz0gaGliZXJuYXRlLm8gaGliZXJuYXRlLWFzbS5vDQo+ID4+Pj4+DQo+ID4+Pj4+ICAgICBvYmot JChDT05GSUdfRlVOQ1RJT05fVFJBQ0VSKQkrPSBtY291bnQubyBmdHJhY2Uubw0KPiA+Pj4+PiAg ICAgb2JqLSQoQ09ORklHX0RZTkFNSUNfRlRSQUNFKQkrPSBtY291bnQtZHluLm8NCj4gPj4+Pj4g ZGlmZiAtLWdpdCBhL2FyY2gvcmlzY3Yva2VybmVsL2FzbS1vZmZzZXRzLmMgYi9hcmNoL3Jpc2N2 L2tlcm5lbC9hc20tb2Zmc2V0cy5jDQo+ID4+Pj4+IGluZGV4IGRmOTQ0NDM5NzkwOC4uZDZhNzVh YWMxZDI3IDEwMDY0NA0KPiA+Pj4+PiAtLS0gYS9hcmNoL3Jpc2N2L2tlcm5lbC9hc20tb2Zmc2V0 cy5jDQo+ID4+Pj4+ICsrKyBiL2FyY2gvcmlzY3Yva2VybmVsL2FzbS1vZmZzZXRzLmMNCj4gPj4+ Pj4gQEAgLTksNiArOSw3IEBADQo+ID4+Pj4+ICAgICAjaW5jbHVkZSA8bGludXgva2J1aWxkLmg+ DQo+ID4+Pj4+ICAgICAjaW5jbHVkZSA8bGludXgvbW0uaD4NCj4gPj4+Pj4gICAgICNpbmNsdWRl IDxsaW51eC9zY2hlZC5oPg0KPiA+Pj4+PiArI2luY2x1ZGUgPGxpbnV4L3N1c3BlbmQuaD4NCj4g Pj4+Pj4gICAgICNpbmNsdWRlIDxhc20va3ZtX2hvc3QuaD4NCj4gPj4+Pj4gICAgICNpbmNsdWRl IDxhc20vdGhyZWFkX2luZm8uaD4NCj4gPj4+Pj4gICAgICNpbmNsdWRlIDxhc20vcHRyYWNlLmg+ DQo+ID4+Pj4+IEBAIC0xMTYsNiArMTE3LDEwIEBAIHZvaWQgYXNtX29mZnNldHModm9pZCkNCj4g Pj4+Pj4NCj4gPj4+Pj4gICAgIAlPRkZTRVQoU1VTUEVORF9DT05URVhUX1JFR1MsIHN1c3BlbmRf Y29udGV4dCwgcmVncyk7DQo+ID4+Pj4+DQo+ID4+Pj4+ICsJT0ZGU0VUKEhJQkVSTl9QQkVfQURE UiwgcGJlLCBhZGRyZXNzKTsNCj4gPj4+Pj4gKwlPRkZTRVQoSElCRVJOX1BCRV9PUklHLCBwYmUs IG9yaWdfYWRkcmVzcyk7DQo+ID4+Pj4+ICsJT0ZGU0VUKEhJQkVSTl9QQkVfTkVYVCwgcGJlLCBu ZXh0KTsNCj4gPj4+Pj4gKw0KPiA+Pj4+PiAgICAgCU9GRlNFVChLVk1fQVJDSF9HVUVTVF9aRVJP LCBrdm1fdmNwdV9hcmNoLCBndWVzdF9jb250ZXh0Lnplcm8pOw0KPiA+Pj4+PiAgICAgCU9GRlNF VChLVk1fQVJDSF9HVUVTVF9SQSwga3ZtX3ZjcHVfYXJjaCwgZ3Vlc3RfY29udGV4dC5yYSk7DQo+ ID4+Pj4+ICAgICAJT0ZGU0VUKEtWTV9BUkNIX0dVRVNUX1NQLCBrdm1fdmNwdV9hcmNoLCBndWVz dF9jb250ZXh0LnNwKTsNCj4gPj4+Pj4gZGlmZiAtLWdpdCBhL2FyY2gvcmlzY3Yva2VybmVsL2hp YmVybmF0ZS1hc20uUyBiL2FyY2gvcmlzY3Yva2VybmVsL2hpYmVybmF0ZS1hc20uUw0KPiA+Pj4+ PiBuZXcgZmlsZSBtb2RlIDEwMDY0NA0KPiA+Pj4+PiBpbmRleCAwMDAwMDAwMDAwMDAuLmE4M2Q1 MzRiODliZA0KPiA+Pj4+PiAtLS0gL2Rldi9udWxsDQo+ID4+Pj4+ICsrKyBiL2FyY2gvcmlzY3Yv a2VybmVsL2hpYmVybmF0ZS1hc20uUw0KPiA+Pj4+PiBAQCAtMCwwICsxLDg5IEBADQo+ID4+Pj4+ ICsvKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMC1vbmx5ICovDQo+ID4+Pj4+ICsv Kg0KPiA+Pj4+PiArICogSGliZXJuYXRpb24gc3VwcG9ydCBzcGVjaWZpYyBmb3IgUklTQ1YNCj4g Pj4+Pj4gKyAqDQo+ID4+Pj4+ICsgKiBDb3B5cmlnaHQgKEMpIDIwMjMgU3RhckZpdmUgVGVjaG5v bG9neSBDby4sIEx0ZC4NCj4gPj4+Pj4gKyAqDQo+ID4+Pj4+ICsgKiBBdXRob3I6IEplZSBIZW5n IFNpYSA8amVlaGVuZy5zaWFAc3RhcmZpdmV0ZWNoLmNvbT4NCj4gPj4+Pj4gKyAqLw0KPiA+Pj4+ PiArDQo+ID4+Pj4+ICsjaW5jbHVkZSA8YXNtL2FzbS5oPg0KPiA+Pj4+PiArI2luY2x1ZGUgPGFz bS9hc20tb2Zmc2V0cy5oPg0KPiA+Pj4+PiArI2luY2x1ZGUgPGFzbS9hc3NlbWJsZXIuaD4NCj4g Pj4+Pj4gKyNpbmNsdWRlIDxhc20vY3NyLmg+DQo+ID4+Pj4+ICsNCj4gPj4+Pj4gKyNpbmNsdWRl IDxsaW51eC9saW5rYWdlLmg+DQo+ID4+Pj4+ICsNCj4gPj4+Pj4gKy8qDQo+ID4+Pj4+ICsgKiBU aGlzIGNvZGUgaXMgZXhlY3V0ZWQgd2hlbiByZXN1bWUgZnJvbSB0aGUgaGliZXJuYXRpb24uDQo+ ID4+Pj4+ICsgKg0KPiA+Pj4+PiArICogSXQgYmVnaW5zIHdpdGggbG9hZGluZyB0aGUgdGVtcG9y YXJ5IHBhZ2UgdGFibGUgdGhlbiByZXN0b3JlcyB0aGUgbWVtb3J5IGltYWdlLg0KPiA+Pj4+PiAr ICogRmluYWxseSBicmFuY2hlcyB0byBfX2hpYmVybmF0ZV9jcHVfcmVzdW1lKCkgdG8gcmVzdG9y ZSB0aGUgc3RhdGUgc2F2ZWQgYnkNCj4gPj4+Pj4gKyAqIHN3c3VzcF9hcmNoX3N1c3BlbmQoKS4N Cj4gPj4+Pj4gKyAqLw0KPiA+Pj4+PiArDQo+ID4+Pj4+ICsvKg0KPiA+Pj4+PiArICogaW50IF9f aGliZXJuYXRlX2NwdV9yZXN1bWUodm9pZCkNCj4gPj4+Pj4gKyAqIFN3aXRjaCBiYWNrIHRvIHRo ZSBoaWJlcm5hdGVkIGltYWdlJ3MgcGFnZSB0YWJsZSBwcmlvciB0byByZXN0b3JlIHRoZSBDUFUN Cj4gPj4+Pj4gKyAqIGNvbnRleHQuDQo+ID4+Pj4+ICsgKg0KPiA+Pj4+PiArICogQWx3YXlzIHJl dHVybnMgMCB0byB0aGUgQyBjb2RlLg0KPiA+Pj4+PiArICovDQo+ID4+Pj4+ICtFTlRSWShfX2hp YmVybmF0ZV9jcHVfcmVzdW1lKQ0KPiA+Pj4+PiArCS8qIHN3aXRjaCB0byBoaWJlcm5hdGVkIGlt YWdlJ3MgcGFnZSB0YWJsZSAqLw0KPiA+Pj4+PiArCWNzcncgQ1NSX1NBVFAsIHMwDQo+ID4+Pj4+ ICsJc2ZlbmNlLnZtYQ0KPiA+Pj4+PiArDQo+ID4+Pj4+ICsJUkVHX0wJYTAsIGhpYmVybmF0ZV9j cHVfY29udGV4dA0KPiA+Pj4+PiArDQo+ID4+Pj4+ICsJLyogUmVzdG9yZSBDU1JzICovDQo+ID4+ Pj4+ICsJcmVzdG9yZV9jc3INCj4gPj4+Pj4gKw0KPiA+Pj4+PiArCS8qIFJlc3RvcmUgcmVnaXN0 ZXJzIChleGNlcHQgQTAgYW5kIFQwLVQ2KSAqLw0KPiA+Pj4+PiArCXJlc3RvcmVfcmVnDQo+ID4+ Pj4+ICsNCj4gPj4+Pj4gKwkvKiBSZXR1cm4gemVybyB2YWx1ZSAqLw0KPiA+Pj4+PiArCWFkZAlh MCwgemVybywgemVybw0KPiA+Pj4+PiArDQo+ID4+Pj4+ICsJLyogUmV0dXJuIHRvIEMgY29kZSAq Lw0KPiA+Pj4+PiArCXJldA0KPiA+Pj4+PiArRU5EKF9faGliZXJuYXRlX2NwdV9yZXN1bWUpDQo+ ID4+Pj4+ICsNCj4gPj4+Pj4gKy8qDQo+ID4+Pj4+ICsgKiBQcmVwYXJlIHRvIHJlc3RvcmUgdGhl IGltYWdlLg0KPiA+Pj4+PiArICogYTA6IHNhdHAgb2Ygc2F2ZWQgcGFnZSB0YWJsZXMNCj4gPj4+ Pj4gKyAqIGExOiBzYXRwIG9mIHRlbXBvcmFyeSBwYWdlIHRhYmxlcw0KPiA+Pj4+PiArICogYTI6 IGNwdV9yZXN1bWUNCj4gPj4+Pj4gKyAqLw0KPiA+Pj4+PiArRU5UUlkocmVzdG9yZV9pbWFnZSkN Cj4gPj4+Pj4gKwltdglzMCwgYTANCj4gPj4+Pj4gKwltdglzMSwgYTENCj4gPj4+Pj4gKwltdglz MiwgYTINCj4gPj4+Pj4gKwlSRUdfTAlzNCwgcmVzdG9yZV9wYmxpc3QNCj4gPj4+Pj4gKwlSRUdf TAlhMSwgcmVsb2NhdGVkX3Jlc3RvcmVfY29kZQ0KPiA+Pj4+PiArDQo+ID4+Pj4+ICsJamFscglh MQ0KPiA+Pj4+PiArRU5EKHJlc3RvcmVfaW1hZ2UpDQo+ID4+Pj4+ICsNCj4gPj4+Pj4gKy8qDQo+ ID4+Pj4+ICsgKiBUaGUgYmVsb3cgY29kZSB3aWxsIGJlIGV4ZWN1dGVkIGZyb20gYSAnc2FmZScg cGFnZS4NCj4gPj4+Pj4gKyAqIEl0IGZpcnN0IHN3aXRjaGVzIHRvIHRoZSB0ZW1wb3JhcnkgcGFn ZSB0YWJsZSwgdGhlbiBzdGFydCB0byBjb3B5IHRoZSBwYWdlcw0KPiA+Pj4+PiArICogYmFjayB0 byB0aGUgb3JpZ2luYWwgbWVtb3J5IGxvY2F0aW9uLiBGaW5hbGx5LCBpdCBqdW1wcyB0byB0aGUg X19oaWJlcm5hdGVfY3B1X3Jlc3VtZSgpDQo+ID4+Pj4+ICsgKiB0byByZXN0b3JlIHRoZSBDUFUg Y29udGV4dC4NCj4gPj4+Pj4gKyAqLw0KPiA+Pj4+PiArRU5UUlkoY29yZV9yZXN0b3JlX2NvZGUp DQo+ID4+Pj4+ICsJLyogc3dpdGNoIHRvIHRlbXAgcGFnZSB0YWJsZSAqLw0KPiA+Pj4+PiArCWNz cncgc2F0cCwgczENCj4gPj4+Pj4gKwlzZmVuY2Uudm1hDQo+ID4+Pj4+ICsuTGNvcHk6DQo+ID4+ Pj4+ICsJLyogVGhlIGJlbG93IGNvZGUgd2lsbCByZXN0b3JlIHRoZSBoaWJlcm5hdGVkIGltYWdl LiAqLw0KPiA+Pj4+PiArCVJFR19MCWExLCBISUJFUk5fUEJFX0FERFIoczQpDQo+ID4+Pj4+ICsJ UkVHX0wJYTAsIEhJQkVSTl9QQkVfT1JJRyhzNCkNCj4gPj4+Pj4gKw0KPiA+Pj4+PiArCWNvcHlf cGFnZSBhMCwgYTENCj4gPj4+Pj4gKw0KPiA+Pj4+PiArCVJFR19MCXM0LCBISUJFUk5fUEJFX05F WFQoczQpDQo+ID4+Pj4+ICsJYm5leglzNCwgLkxjb3B5DQo+ID4+Pj4+ICsNCj4gPj4+Pj4gKwlq YWxyCXMyDQo+ID4+Pj4+ICtFTkQoY29yZV9yZXN0b3JlX2NvZGUpDQo+ID4+Pj4+IGRpZmYgLS1n aXQgYS9hcmNoL3Jpc2N2L2tlcm5lbC9oaWJlcm5hdGUuYyBiL2FyY2gvcmlzY3Yva2VybmVsL2hp YmVybmF0ZS5jDQo+ID4+Pj4+IG5ldyBmaWxlIG1vZGUgMTAwNjQ0DQo+ID4+Pj4+IGluZGV4IDAw MDAwMDAwMDAwMC4uYmY3ZjNjNzgxODIwDQo+ID4+Pj4+IC0tLSAvZGV2L251bGwNCj4gPj4+Pj4g KysrIGIvYXJjaC9yaXNjdi9rZXJuZWwvaGliZXJuYXRlLmMNCj4gPj4+Pj4gQEAgLTAsMCArMSwz NjAgQEANCj4gPj4+Pj4gKy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wLW9ubHkN Cj4gPj4+Pj4gKy8qDQo+ID4+Pj4+ICsgKiBIaWJlcm5hdGlvbiBzdXBwb3J0IHNwZWNpZmljIGZv ciBSSVNDVg0KPiA+Pj4+PiArICoNCj4gPj4+Pj4gKyAqIENvcHlyaWdodCAoQykgMjAyMyBTdGFy Rml2ZSBUZWNobm9sb2d5IENvLiwgTHRkLg0KPiA+Pj4+PiArICoNCj4gPj4+Pj4gKyAqIEF1dGhv cjogSmVlIEhlbmcgU2lhIDxqZWVoZW5nLnNpYUBzdGFyZml2ZXRlY2guY29tPg0KPiA+Pj4+PiAr ICovDQo+ID4+Pj4+ICsNCj4gPj4+Pj4gKyNpbmNsdWRlIDxhc20vYmFycmllci5oPg0KPiA+Pj4+ PiArI2luY2x1ZGUgPGFzbS9jYWNoZWZsdXNoLmg+DQo+ID4+Pj4+ICsjaW5jbHVkZSA8YXNtL21t dV9jb250ZXh0Lmg+DQo+ID4+Pj4+ICsjaW5jbHVkZSA8YXNtL3BhZ2UuaD4NCj4gPj4+Pj4gKyNp bmNsdWRlIDxhc20vcGd0YWJsZS5oPg0KPiA+Pj4+PiArI2luY2x1ZGUgPGFzbS9zZWN0aW9ucy5o Pg0KPiA+Pj4+PiArI2luY2x1ZGUgPGFzbS9zZXRfbWVtb3J5Lmg+DQo+ID4+Pj4+ICsjaW5jbHVk ZSA8YXNtL3NtcC5oPg0KPiA+Pj4+PiArI2luY2x1ZGUgPGFzbS9zdXNwZW5kLmg+DQo+ID4+Pj4+ ICsNCj4gPj4+Pj4gKyNpbmNsdWRlIDxsaW51eC9jcHUuaD4NCj4gPj4+Pj4gKyNpbmNsdWRlIDxs aW51eC9tZW1ibG9jay5oPg0KPiA+Pj4+PiArI2luY2x1ZGUgPGxpbnV4L3BtLmg+DQo+ID4+Pj4+ ICsjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4NCj4gPj4+Pj4gKyNpbmNsdWRlIDxsaW51eC9zdXNw ZW5kLmg+DQo+ID4+Pj4+ICsjaW5jbHVkZSA8bGludXgvdXRzbmFtZS5oPg0KPiA+Pj4+PiArDQo+ ID4+Pj4+ICsvKiBUaGUgbG9naWNhbCBjcHUgbnVtYmVyIHdlIHNob3VsZCByZXN1bWUgb24sIGlu aXRpYWxpc2VkIHRvIGEgbm9uLWNwdSBudW1iZXIgKi8NCj4gPj4+Pj4gK3N0YXRpYyBpbnQgc2xl ZXBfY3B1ID0gLUVJTlZBTDsNCj4gPj4+Pj4gKw0KPiA+Pj4+PiArLyogQ1BVIGNvbnRleHQgdG8g YmUgc2F2ZWQgKi8NCj4gPj4+Pj4gK3N0cnVjdCBzdXNwZW5kX2NvbnRleHQgKmhpYmVybmF0ZV9j cHVfY29udGV4dDsNCj4gPj4+Pj4gKw0KPiA+Pj4+PiArdW5zaWduZWQgbG9uZyByZWxvY2F0ZWRf cmVzdG9yZV9jb2RlOw0KPiA+Pj4+PiArDQo+ID4+Pj4+ICsvKiBQb2ludGVyIHRvIHRoZSB0ZW1w b3JhcnkgcmVzdW1lIHBhZ2UgdGFibGUgKi8NCj4gPj4+Pj4gK3BnZF90ICpyZXN1bWVfcGdfZGly Ow0KPiA+Pj4+PiArDQo+ID4+Pj4+ICsvKioNCj4gPj4+Pj4gKyAqIHN0cnVjdCBhcmNoX2hpYmVy bmF0ZV9oZHJfaW52YXJpYW50cyAtIGNvbnRhaW5lciB0byBzdG9yZSBrZXJuZWwgYnVpbGQgdmVy c2lvbg0KPiA+Pj4+PiArICogQHV0c192ZXJzaW9uOiB0byBzYXZlIHRoZSBidWlsZCBudW1iZXIg YW5kIGRhdGUgc28gdGhhdCB0aGUgd2UgYXJlIG5vdCByZXN1bWUgd2l0aA0KPiA+Pj4+PiArICoJ CWEgZGlmZmVyZW50IGtlcm5lbA0KPiA+Pj4+PiArICovDQo+ID4+Pj4+ICtzdHJ1Y3QgYXJjaF9o aWJlcm5hdGVfaGRyX2ludmFyaWFudHMgew0KPiA+Pj4+PiArCWNoYXIJCXV0c192ZXJzaW9uW19f TkVXX1VUU19MRU4gKyAxXTsNCj4gPj4+Pj4gK307DQo+ID4+Pj4+ICsNCj4gPj4+Pj4gKy8qKg0K PiA+Pj4+PiArICogc3RydWN0IGFyY2hfaGliZXJuYXRlX2hkciAtIGhlbHBlciBwYXJhbWV0ZXJz IHRoYXQgaGVscCB1cyB0byByZXN0b3JlIHRoZSBpbWFnZQ0KPiA+Pj4+PiArICogQGludmFyaWFu dHM6IGNvbnRhaW5lciB0byBzdG9yZSBrZXJuZWwgYnVpbGQgdmVyc2lvbg0KPiA+Pj4+PiArICog QGhhcnRpZDogdG8gbWFrZSBzdXJlIHNhbWUgYm9vdF9jcHUgZXhlY3V0aW5nIHRoZSBoaWJlcm5h dGUvcmVzdG9yZSBjb2RlLg0KPiA+Pj4+PiArICogQHNhdmVkX3NhdHA6IG9yaWdpbmFsIHBhZ2Ug dGFibGUgdXNlZCBieSB0aGUgaGliZXJuYXRlZCBpbWFnZS4NCj4gPj4+Pj4gKyAqIEByZXN0b3Jl X2NwdV9hZGRyOiB0aGUga2VybmVsJ3MgaW1hZ2UgYWRkcmVzcyB0byByZXN0b3JlIHRoZSBDUFUg Y29udGV4dC4NCj4gPj4+Pj4gKyAqLw0KPiA+Pj4+PiArc3RhdGljIHN0cnVjdCBhcmNoX2hpYmVy bmF0ZV9oZHIgew0KPiA+Pj4+PiArCXN0cnVjdCBhcmNoX2hpYmVybmF0ZV9oZHJfaW52YXJpYW50 cyBpbnZhcmlhbnRzOw0KPiA+Pj4+PiArCXVuc2lnbmVkIGxvbmcJaGFydGlkOw0KPiA+Pj4+PiAr CXVuc2lnbmVkIGxvbmcJc2F2ZWRfc2F0cDsNCj4gPj4+Pj4gKwl1bnNpZ25lZCBsb25nCXJlc3Rv cmVfY3B1X2FkZHI7DQo+ID4+Pj4+ICt9IHJlc3VtZV9oZHI7DQo+ID4+Pj4+ICsNCj4gPj4+Pj4g K3N0YXRpYyBpbmxpbmUgdm9pZCBhcmNoX2hkcl9pbnZhcmlhbnRzKHN0cnVjdCBhcmNoX2hpYmVy bmF0ZV9oZHJfaW52YXJpYW50cyAqaSkNCj4gPj4+Pj4gK3sNCj4gPj4+Pj4gKwltZW1zZXQoaSwg MCwgc2l6ZW9mKCppKSk7DQo+ID4+Pj4+ICsJbWVtY3B5KGktPnV0c192ZXJzaW9uLCBpbml0X3V0 c25hbWUoKS0+dmVyc2lvbiwgc2l6ZW9mKGktPnV0c192ZXJzaW9uKSk7DQo+ID4+Pj4+ICt9DQo+ ID4+Pj4+ICsNCj4gPj4+Pj4gKy8qDQo+ID4+Pj4+ICsgKiBDaGVjayBpZiB0aGUgZ2l2ZW4gcGZu IGlzIGluIHRoZSAnbm9zYXZlJyBzZWN0aW9uLg0KPiA+Pj4+PiArICovDQo+ID4+Pj4+ICtpbnQg cGZuX2lzX25vc2F2ZSh1bnNpZ25lZCBsb25nIHBmbikNCj4gPj4+Pj4gK3sNCj4gPj4+Pj4gKwl1 bnNpZ25lZCBsb25nIG5vc2F2ZV9iZWdpbl9wZm4gPSBzeW1fdG9fcGZuKCZfX25vc2F2ZV9iZWdp bik7DQo+ID4+Pj4+ICsJdW5zaWduZWQgbG9uZyBub3NhdmVfZW5kX3BmbiA9IHN5bV90b19wZm4o Jl9fbm9zYXZlX2VuZCAtIDEpOw0KPiA+Pj4+PiArDQo+ID4+Pj4+ICsJcmV0dXJuICgocGZuID49 IG5vc2F2ZV9iZWdpbl9wZm4pICYmIChwZm4gPD0gbm9zYXZlX2VuZF9wZm4pKTsNCj4gPj4+Pj4g K30NCj4gPj4+Pj4gKw0KPiA+Pj4+PiArdm9pZCBub3RyYWNlIHNhdmVfcHJvY2Vzc29yX3N0YXRl KHZvaWQpDQo+ID4+Pj4+ICt7DQo+ID4+Pj4+ICsJV0FSTl9PTihudW1fb25saW5lX2NwdXMoKSAh PSAxKTsNCj4gPj4+Pj4gK30NCj4gPj4+Pj4gKw0KPiA+Pj4+PiArdm9pZCBub3RyYWNlIHJlc3Rv cmVfcHJvY2Vzc29yX3N0YXRlKHZvaWQpDQo+ID4+Pj4+ICt7DQo+ID4+Pj4+ICt9DQo+ID4+Pj4+ ICsNCj4gPj4+Pj4gKy8qDQo+ID4+Pj4+ICsgKiBIZWxwZXIgcGFyYW1ldGVycyBuZWVkIHRvIGJl IHNhdmVkIHRvIHRoZSBoaWJlcm5hdGlvbiBpbWFnZSBoZWFkZXIuDQo+ID4+Pj4+ICsgKi8NCj4g Pj4+Pj4gK2ludCBhcmNoX2hpYmVybmF0aW9uX2hlYWRlcl9zYXZlKHZvaWQgKmFkZHIsIHVuc2ln bmVkIGludCBtYXhfc2l6ZSkNCj4gPj4+Pj4gK3sNCj4gPj4+Pj4gKwlzdHJ1Y3QgYXJjaF9oaWJl cm5hdGVfaGRyICpoZHIgPSBhZGRyOw0KPiA+Pj4+PiArDQo+ID4+Pj4+ICsJaWYgKG1heF9zaXpl IDwgc2l6ZW9mKCpoZHIpKQ0KPiA+Pj4+PiArCQlyZXR1cm4gLUVPVkVSRkxPVzsNCj4gPj4+Pj4g Kw0KPiA+Pj4+PiArCWFyY2hfaGRyX2ludmFyaWFudHMoJmhkci0+aW52YXJpYW50cyk7DQo+ID4+ Pj4+ICsNCj4gPj4+Pj4gKwloZHItPmhhcnRpZCA9IGNwdWlkX3RvX2hhcnRpZF9tYXAoc2xlZXBf Y3B1KTsNCj4gPj4+Pj4gKwloZHItPnNhdmVkX3NhdHAgPSBjc3JfcmVhZChDU1JfU0FUUCk7DQo+ ID4+Pj4+ICsJaGRyLT5yZXN0b3JlX2NwdV9hZGRyID0gKHVuc2lnbmVkIGxvbmcpX19oaWJlcm5h dGVfY3B1X3Jlc3VtZTsNCj4gPj4+Pj4gKw0KPiA+Pj4+PiArCXJldHVybiAwOw0KPiA+Pj4+PiAr fQ0KPiA+Pj4+PiArRVhQT1JUX1NZTUJPTChhcmNoX2hpYmVybmF0aW9uX2hlYWRlcl9zYXZlKTsN Cj4gPj4+Pj4gKw0KPiA+Pj4+PiArLyoNCj4gPj4+Pj4gKyAqIFJldHJpZXZlIHRoZSBoZWxwZXIg cGFyYW1ldGVycyBmcm9tIHRoZSBoaWJlcm5hdGlvbiBpbWFnZSBoZWFkZXINCj4gPj4+Pj4gKyAq Lw0KPiA+Pj4+PiAraW50IGFyY2hfaGliZXJuYXRpb25faGVhZGVyX3Jlc3RvcmUodm9pZCAqYWRk cikNCj4gPj4+Pj4gK3sNCj4gPj4+Pj4gKwlzdHJ1Y3QgYXJjaF9oaWJlcm5hdGVfaGRyX2ludmFy aWFudHMgaW52YXJpYW50czsNCj4gPj4+Pj4gKwlzdHJ1Y3QgYXJjaF9oaWJlcm5hdGVfaGRyICpo ZHIgPSBhZGRyOw0KPiA+Pj4+PiArCWludCByZXQgPSAwOw0KPiA+Pj4+PiArDQo+ID4+Pj4+ICsJ YXJjaF9oZHJfaW52YXJpYW50cygmaW52YXJpYW50cyk7DQo+ID4+Pj4+ICsNCj4gPj4+Pj4gKwlp ZiAobWVtY21wKCZoZHItPmludmFyaWFudHMsICZpbnZhcmlhbnRzLCBzaXplb2YoaW52YXJpYW50 cykpKSB7DQo+ID4+Pj4+ICsJCXByX2NyaXQoIkhpYmVybmF0ZSBpbWFnZSBub3QgZ2VuZXJhdGVk IGJ5IHRoaXMga2VybmVsIVxuIik7DQo+ID4+Pj4+ICsJCXJldHVybiAtRUlOVkFMOw0KPiA+Pj4+ PiArCX0NCj4gPj4+Pj4gKw0KPiA+Pj4+PiArCXNsZWVwX2NwdSA9IHJpc2N2X2hhcnRpZF90b19j cHVpZChoZHItPmhhcnRpZCk7DQo+ID4+Pj4+ICsJaWYgKHNsZWVwX2NwdSA8IDApIHsNCj4gPj4+ Pj4gKwkJcHJfY3JpdCgiSGliZXJuYXRlZCBvbiBhIENQVSBub3Qga25vd24gdG8gdGhpcyBrZXJu ZWwhXG4iKTsNCj4gPj4+Pj4gKwkJc2xlZXBfY3B1ID0gLUVJTlZBTDsNCj4gPj4+Pj4gKwkJcmV0 dXJuIC1FSU5WQUw7DQo+ID4+Pj4+ICsJfQ0KPiA+Pj4+PiArDQo+ID4+Pj4+ICsjaWZkZWYgQ09O RklHX1NNUA0KPiA+Pj4+PiArCXJldCA9IGJyaW5ndXBfaGliZXJuYXRlX2NwdShzbGVlcF9jcHUp Ow0KPiA+Pj4+PiArCWlmIChyZXQpIHsNCj4gPj4+Pj4gKwkJc2xlZXBfY3B1ID0gLUVJTlZBTDsN Cj4gPj4+Pj4gKwkJcmV0dXJuIHJldDsNCj4gPj4+Pj4gKwl9DQo+ID4+Pj4+ICsjZW5kaWYNCj4g Pj4+Pj4gKwlyZXN1bWVfaGRyID0gKmhkcjsNCj4gPj4+Pj4gKw0KPiA+Pj4+PiArCXJldHVybiBy ZXQ7DQo+ID4+Pj4+ICt9DQo+ID4+Pj4+ICtFWFBPUlRfU1lNQk9MKGFyY2hfaGliZXJuYXRpb25f aGVhZGVyX3Jlc3RvcmUpOw0KPiA+Pj4+PiArDQo+ID4+Pj4+ICtpbnQgc3dzdXNwX2FyY2hfc3Vz cGVuZCh2b2lkKQ0KPiA+Pj4+PiArew0KPiA+Pj4+PiArCWludCByZXQgPSAwOw0KPiA+Pj4+PiAr DQo+ID4+Pj4+ICsJaWYgKF9fY3B1X3N1c3BlbmRfZW50ZXIoaGliZXJuYXRlX2NwdV9jb250ZXh0 KSkgew0KPiA+Pj4+PiArCQlzbGVlcF9jcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7DQo+ID4+Pj4+ ICsJCXN1c3BlbmRfc2F2ZV9jc3JzKGhpYmVybmF0ZV9jcHVfY29udGV4dCk7DQo+ID4+Pj4+ICsJ CXJldCA9IHN3c3VzcF9zYXZlKCk7DQo+ID4+Pj4+ICsJfSBlbHNlIHsNCj4gPj4+Pj4gKwkJc3Vz cGVuZF9yZXN0b3JlX2NzcnMoaGliZXJuYXRlX2NwdV9jb250ZXh0KTsNCj4gPj4+Pj4gKwkJZmx1 c2hfdGxiX2FsbCgpOw0KPiA+Pj4+PiArDQo+ID4+Pj4+ICsJCS8qIEludmFsaWRhdGVkIEljYWNo ZSAqLw0KPiA+Pj4+PiArCQlmbHVzaF9pY2FjaGVfYWxsKCk7DQo+ID4+Pj4+ICsNCj4gPj4+Pj4g KwkJLyoNCj4gPj4+Pj4gKwkJICogVGVsbCB0aGUgaGliZXJuYXRpb24gY29yZSB0aGF0IHdlJ3Zl IGp1c3QgcmVzdG9yZWQNCj4gPj4+Pj4gKwkJICogdGhlIG1lbW9yeQ0KPiA+Pj4+PiArCQkgKi8N Cj4gPj4+Pj4gKwkJaW5fc3VzcGVuZCA9IDA7DQo+ID4+Pj4+ICsJCXNsZWVwX2NwdSA9IC1FSU5W QUw7DQo+ID4+Pj4+ICsJfQ0KPiA+Pj4+PiArDQo+ID4+Pj4+ICsJcmV0dXJuIHJldDsNCj4gPj4+ Pj4gK30NCj4gPj4+Pj4gKw0KPiA+Pj4+PiArc3RhdGljIHVuc2lnbmVkIGxvbmcgdGVtcF9wZ3Rh YmxlX21hcF9wdGUocHRlX3QgKnB0ZXAsIHVuc2lnbmVkIGxvbmcgdmFkZHIsIHBncHJvdF90IHBy b3QpDQo+ID4+Pj4+ICt7DQo+ID4+Pj4+ICsJdWludHB0cl90IHB0ZV9pZHggPSBwdGVfaW5kZXgo dmFkZHIpOw0KPiA+Pj4+PiArDQo+ID4+Pj4+ICsJcHRlcFtwdGVfaWR4XSA9IHBmbl9wdGUoUEZO X0RPV04oX19wYSh2YWRkcikpLCBwcm90KTsNCj4gPj4+Pj4gKw0KPiA+Pj4+PiArCXJldHVybiAw Ow0KPiA+Pj4+PiArfQ0KPiA+Pj4+PiArDQo+ID4+Pj4+ICsjaWZuZGVmIF9fUEFHRVRBQkxFX1BN RF9GT0xERUQNCj4gPj4+Pj4gKyNkZWZpbmUgdGVtcF9wZ3RhYmxlX21hcF9wZ2RfbmV4dChwZ2Rw LCB2YWRkciwgcHJvdCkJCQlcDQo+ID4+Pj4+ICsJCShwZ3RhYmxlX2w1X2VuYWJsZWQgPwkJCQkJ XA0KPiA+Pj4+PiArCQl0ZW1wX3BndGFibGVfbWFwX3A0ZChwZ2RwLCB2YWRkciwgcHJvdCkgOgkJ XA0KPiA+Pj4+PiArCQkocGd0YWJsZV9sNF9lbmFibGVkID8JCQkJCVwNCj4gPj4+Pj4gKwkJdGVt cF9wZ3RhYmxlX21hcF9wdWQoKHB1ZF90ICopcGdkcCwgdmFkZHIsIHByb3QpIDoJXA0KPiA+Pj4+ PiArCQl0ZW1wX3BndGFibGVfbWFwX3BtZCgocG1kX3QgKilwZ2RwLCB2YWRkciwgcHJvdCkpKQ0K PiA+Pj4+PiArDQo+ID4+Pj4+ICtzdGF0aWMgdW5zaWduZWQgbG9uZyB0ZW1wX3BndGFibGVfbWFw X3BtZChwbWRfdCAqcG1kcCwgdW5zaWduZWQgbG9uZyB2YWRkciwgcGdwcm90X3QgcHJvdCkNCj4g Pj4+Pj4gK3sNCj4gPj4+Pj4gKwl1aW50cHRyX3QgcG1kX2lkeCA9IHBtZF9pbmRleCh2YWRkcik7 DQo+ID4+Pj4+ICsJcHRlX3QgKnB0ZXA7DQo+ID4+Pj4+ICsNCj4gPj4+Pj4gKwlpZiAocG1kX25v bmUocG1kcFtwbWRfaWR4XSkpIHsNCj4gPj4+Pj4gKwkJcHRlcCA9IChwdGVfdCAqKWdldF9zYWZl X3BhZ2UoR0ZQX0FUT01JQyk7DQo+ID4+Pj4+ICsJCWlmICghcHRlcCkNCj4gPj4+Pj4gKwkJCXJl dHVybiAtRU5PTUVNOw0KPiA+Pj4+PiArDQo+ID4+Pj4+ICsJCW1lbXNldChwdGVwLCAwLCBQQUdF X1NJWkUpOw0KPiA+Pj4+PiArCQlwbWRwW3BtZF9pZHhdID0gcGZuX3BtZChQRk5fRE9XTihfX3Bh KHB0ZXApKSwgUEFHRV9UQUJMRSk7DQo+ID4+Pj4+ICsJfSBlbHNlIHsNCj4gPj4+Pj4gKwkJcHRl cCA9IChwdGVfdCAqKV9fdmEoUEZOX1BIWVMoX3BtZF9wZm4ocG1kcFtwbWRfaWR4XSkpKTsNCj4g Pj4+Pj4gKwl9DQo+ID4+Pj4+ICsNCj4gPj4+Pj4gKwlyZXR1cm4gdGVtcF9wZ3RhYmxlX21hcF9w dGUocHRlcCwgdmFkZHIsIHByb3QpOw0KPiA+Pj4+PiArfQ0KPiA+Pj4+PiArDQo+ID4+Pj4+ICtz dGF0aWMgdW5zaWduZWQgbG9uZyB0ZW1wX3BndGFibGVfbWFwX3B1ZChwdWRfdCAqcHVkcCwgdW5z aWduZWQgbG9uZyB2YWRkciwgcGdwcm90X3QgcHJvdCkNCj4gPj4+Pj4gK3sNCj4gPj4+Pj4gKwl1 aW50cHRyX3QgcHVkX2luZGV4ID0gcHVkX2luZGV4KHZhZGRyKTsNCj4gPj4+Pj4gKwlwbWRfdCAq cG1kcDsNCj4gPj4+Pj4gKw0KPiA+Pj4+PiArCWlmIChwdWRfdmFsKHB1ZHBbcHVkX2luZGV4XSkg PT0gMCkgew0KPiA+Pj4+PiArCQlwbWRwID0gKHBtZF90ICopZ2V0X3NhZmVfcGFnZShHRlBfQVRP TUlDKTsNCj4gPj4+Pj4gKwkJaWYgKCFwbWRwKQ0KPiA+Pj4+PiArCQkJcmV0dXJuIC1FTk9NRU07 DQo+ID4+Pj4+ICsNCj4gPj4+Pj4gKwkJbWVtc2V0KHBtZHAsIDAsIFBBR0VfU0laRSk7DQo+ID4+ Pj4+ICsJCXB1ZHBbcHVkX2luZGV4XSA9IHBmbl9wdWQoUEZOX0RPV04oX19wYShwbWRwKSksIFBB R0VfVEFCTEUpOw0KPiA+Pj4+PiArCX0gZWxzZSB7DQo+ID4+Pj4+ICsJCXBtZHAgPSAocG1kX3Qg KilfX3ZhKFBGTl9QSFlTKF9wdWRfcGZuKHB1ZHBbcHVkX2luZGV4XSkpKTsNCj4gPj4+Pj4gKwl9 DQo+ID4+Pj4+ICsNCj4gPj4+Pj4gKwlyZXR1cm4gdGVtcF9wZ3RhYmxlX21hcF9wbWQocG1kcCwg dmFkZHIsIHByb3QpOw0KPiA+Pj4+PiArfQ0KPiA+Pj4+PiArDQo+ID4+Pj4+ICtzdGF0aWMgdW5z aWduZWQgbG9uZyB0ZW1wX3BndGFibGVfbWFwX3A0ZChwNGRfdCAqcDRkcCwgdW5zaWduZWQgbG9u ZyB2YWRkciwgcGdwcm90X3QgcHJvdCkNCj4gPj4+Pj4gK3sNCj4gPj4+Pj4gKwl1aW50cHRyX3Qg cDRkX2luZGV4ID0gcDRkX2luZGV4KHZhZGRyKTsNCj4gPj4+Pj4gKwlwdWRfdCAqcHVkcDsNCj4g Pj4+Pj4gKw0KPiA+Pj4+PiArCWlmIChwNGRfdmFsKHA0ZHBbcDRkX2luZGV4XSkgPT0gMCkgew0K PiA+Pj4+PiArCQlwdWRwID0gKHB1ZF90ICopZ2V0X3NhZmVfcGFnZShHRlBfQVRPTUlDKTsNCj4g Pj4+Pj4gKwkJaWYgKCFwdWRwKQ0KPiA+Pj4+PiArCQkJcmV0dXJuIC1FTk9NRU07DQo+ID4+Pj4+ ICsNCj4gPj4+Pj4gKwkJbWVtc2V0KHB1ZHAsIDAsIFBBR0VfU0laRSk7DQo+ID4+Pj4+ICsJCXA0 ZHBbcDRkX2luZGV4XSA9IHBmbl9wNGQoUEZOX0RPV04oX19wYShwdWRwKSksIFBBR0VfVEFCTEUp Ow0KPiA+Pj4+PiArCX0gZWxzZSB7DQo+ID4+Pj4+ICsJCXB1ZHAgPSAocHVkX3QgKilfX3ZhKFBG Tl9QSFlTKF9wNGRfcGZuKHA0ZHBbcDRkX2luZGV4XSkpKTsNCj4gPj4+Pj4gKwl9DQo+ID4+Pj4+ ICsNCj4gPj4+Pj4gKwlyZXR1cm4gdGVtcF9wZ3RhYmxlX21hcF9wdWQocHVkcCwgdmFkZHIsIHBy b3QpOw0KPiA+Pj4+PiArfQ0KPiA+Pj4+PiArDQo+ID4+Pj4+ICsjZWxzZQ0KPiA+Pj4+PiArI2Rl ZmluZSB0ZW1wX3BndGFibGVfbWFwX3BnZF9uZXh0KG5leHRwLCB2YWRkciwgcHJvdCkJXA0KPiA+ Pj4+PiArCXRlbXBfcGd0YWJsZV9tYXBfcHRlKChwdGVfdCAqKW5leHRwLCB2YWRkciwgcHJvdCkN Cj4gPj4+Pj4gKyNlbmRpZiAvKiBfX1BBR0VUQUJMRV9QTURfRk9MREVEICovDQo+ID4+Pj4+ICsN Cj4gPj4+Pj4gK3N0YXRpYyB1bnNpZ25lZCBsb25nIHRlbXBfcGd0YWJsZV9tYXBfcGdkKHBnZF90 ICpwZ2RwLCB1bnNpZ25lZCBsb25nIHZhZGRyLCBwZ3Byb3RfdCBwcm90KQ0KPiA+Pj4+PiArew0K PiA+Pj4+PiArCXVpbnRwdHJfdCBwZ2RfaWR4ID0gcGdkX2luZGV4KHZhZGRyKTsNCj4gPj4+Pj4g Kwl2b2lkICpuZXh0cDsNCj4gPj4+Pj4gKw0KPiA+Pj4+PiArCWlmIChwZ2RfdmFsKHBnZHBbcGdk X2lkeF0pID09IDApIHsNCj4gPj4+Pj4gKwkJbmV4dHAgPSAodm9pZCAqKWdldF9zYWZlX3BhZ2Uo R0ZQX0FUT01JQyk7DQo+ID4+Pj4+ICsJCWlmICghbmV4dHApDQo+ID4+Pj4+ICsJCQlyZXR1cm4g LUVOT01FTTsNCj4gPj4+Pj4gKw0KPiA+Pj4+PiArCQltZW1zZXQobmV4dHAsIDAsIFBBR0VfU0la RSk7DQo+ID4+Pj4+ICsJCXBnZHBbcGdkX2lkeF0gPSBwZm5fcGdkKFBGTl9ET1dOKF9fcGEobmV4 dHApKSwgUEFHRV9UQUJMRSk7DQo+ID4+Pj4+ICsJfSBlbHNlIHsNCj4gPj4+Pj4gKwkJbmV4dHAg PSAodm9pZCAqKV9fdmEoUEZOX1BIWVMoX3BnZF9wZm4ocGdkcFtwZ2RfaWR4XSkpKTsNCj4gPj4+ Pj4gKwl9DQo+ID4+Pj4+ICsNCj4gPj4+Pj4gKwlyZXR1cm4gdGVtcF9wZ3RhYmxlX21hcF9wZ2Rf bmV4dChuZXh0cCwgdmFkZHIsIHByb3QpOw0KPiANCj4gDQo+IElzIGl0IHBvc3NpYmxlIHRvIHVz ZSAic3RhbmRhcmQiIHdheSBvZiBnb2luZyB0aHJvdWdoIGEgcGFnZSB0YWJsZQ0KPiBpbnN0ZWFk IG9mIHVzaW5nIHRoZSBfbmV4dCBtYWNyb3M/IEkgbWVhbiBzb21ldGhpbmcgbGlrZSB0aGlzIChl eGFtcGxlDQo+IGZyb20gYXJtNjQgY29kZQ0KPiBodHRwczovL2VsaXhpci5ib290bGluLmNvbS9s aW51eC9sYXRlc3Qvc291cmNlL2FyY2gvYXJtNjQvbW0vdHJhbnNfcGdkLmMjTDE3NA0KPiBvciBt eSByZWNlbnQga2FzYW4gcGF0Y2hzZXQNCj4gaHR0cHM6Ly9wYXRjaHdvcmsua2VybmVsLm9yZy9w cm9qZWN0L2xpbnV4LXJpc2N2L3BhdGNoLzIwMjMwMjAzMDc1MjMyLjI3NDI4Mi0zLWFsZXhnaGl0 aUByaXZvc2luYy5jb20vKToNCj4gDQo+ICDCoMKgwqDCoMKgwqDCoCBkbyB7DQo+ICDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgbmV4dCA9IHBnZF9hZGRyX2VuZCh2YWRkciwgZW5kKTsN Cj4gDQo+ICDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgaWYgKHBnZF9ub25lKCpwZ2Rf aykpIHsNCj4gIMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAg bmV4dHAgPSBnZXRfc2FmZV9wYWdlKEdGUF9BVE9NSUMpOw0KPiAgwqDCoMKgIMKgwqDCoCDCoMKg wqAgwqDCoMKgIMKgwqDCoCDCoMKgwqAgbWVtc2V0KG5leHRwLCAwLCBQQUdFX1NJWkUpOw0KPiAg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBzZXRfcGdkKHBn ZF9rLCBwZm5fcGdkKFBGTl9ET1dOKF9fcGEobmV4dHApKSwNCj4gUEFHRV9UQUJMRSkpOw0KPiBj b250aW51ZTsNCj4gfQ0KPiANCj4gIMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBrYXNh bl9zaGFsbG93X3BvcHVsYXRlX3A0ZChwZ2RfaywgdmFkZHIsIG5leHQpOw0KPiAgwqDCoMKgwqDC oMKgwqAgfSB3aGlsZSAocGdkX2srKywgdmFkZHIgPSBuZXh0LCB2YWRkciAhPSBlbmQpOw0KPiAN Cj4gDQo+IEkgaGF2ZSB0aGUgc2FtZSBjaGFuZ2UgdG8gb3VyIGVhcmx5IHBhZ2UgdGFibGUgY29k ZSBvbiBteSB0b2RvIGxpc3QuDQo+IA0KPiANCj4gPj4+Pj4gK30NCj4gPj4+Pj4gKw0KPiA+Pj4+ PiArc3RhdGljIHVuc2lnbmVkIGxvbmcgdGVtcF9wZ3RhYmxlX21hcHBpbmcocGdkX3QgKnBnZHAs IHVuc2lnbmVkIGxvbmcgdmFkZHIsIHBncHJvdF90IHByb3QpDQo+ID4+Pj4+ICt7DQo+ID4+Pj4+ ICsJcmV0dXJuIHRlbXBfcGd0YWJsZV9tYXBfcGdkKHBnZHAsIHZhZGRyLCBwcm90KTsNCj4gPj4+ Pj4gK30NCj4gPj4+Pj4gKw0KPiA+Pj4+PiArc3RhdGljIHVuc2lnbmVkIGxvbmcgcmVsb2NhdGVf cmVzdG9yZV9jb2RlKHZvaWQpDQo+ID4+Pj4+ICt7DQo+ID4+Pj4+ICsJdW5zaWduZWQgbG9uZyBy ZXQ7DQo+ID4+Pj4+ICsJdm9pZCAqcGFnZSA9ICh2b2lkICopZ2V0X3NhZmVfcGFnZShHRlBfQVRP TUlDKTsNCj4gPj4+Pj4gKw0KPiA+Pj4+PiArCWlmICghcGFnZSkNCj4gPj4+Pj4gKwkJcmV0dXJu IC1FTk9NRU07DQo+ID4+Pj4+ICsNCj4gPj4+Pj4gKwljb3B5X3BhZ2UocGFnZSwgY29yZV9yZXN0 b3JlX2NvZGUpOw0KPiA+Pj4+PiArDQo+ID4+Pj4+ICsJLyogTWFrZSB0aGUgcGFnZSBjb250YWlu aW5nIHRoZSByZWxvY2F0ZWQgY29kZSBleGVjdXRhYmxlICovDQo+ID4+Pj4+ICsJc2V0X21lbW9y eV94KCh1bnNpZ25lZCBsb25nKXBhZ2UsIDEpOw0KPiA+Pj4+PiArDQo+ID4+Pj4+ICsJcmV0ID0g dGVtcF9wZ3RhYmxlX21hcHBpbmcocmVzdW1lX3BnX2RpciwgKHVuc2lnbmVkIGxvbmcpcGFnZSwg UEFHRV9LRVJORUxfUkVBRF9FWEVDKTsNCj4gPj4+Pj4gKwlpZiAocmV0KQ0KPiA+Pj4+PiArCQly ZXR1cm4gcmV0Ow0KPiA+Pj4+PiArDQo+ID4+Pj4+ICsJcmV0dXJuICh1bnNpZ25lZCBsb25nKXBh Z2U7DQo+ID4+Pj4+ICt9DQo+ID4+Pj4+ICsNCj4gPj4+Pj4gK2ludCBzd3N1c3BfYXJjaF9yZXN1 bWUodm9pZCkNCj4gPj4+Pj4gK3sNCj4gPj4+Pj4gKwl1bnNpZ25lZCBsb25nIGFkZHIgPSBQQUdF X09GRlNFVDsNCj4gPj4+Pj4gKwl1bnNpZ25lZCBsb25nIHJldDsNCj4gPj4+Pj4gKw0KPiA+Pj4+ PiArCS8qDQo+ID4+Pj4+ICsJICogTWVtb3J5IGFsbG9jYXRlZCBieSBnZXRfc2FmZV9wYWdlKCkg d2lsbCBiZSBkZWFsdCB3aXRoIGJ5IHRoZSBoaWJlcm5hdGlvbiBjb3JlLA0KPiA+Pj4+PiArCSAq IHdlIGRvbid0IG5lZWQgdG8gZnJlZSBpdCBoZXJlLg0KPiA+Pj4+PiArCSAqLw0KPiA+Pj4+PiAr CXJlc3VtZV9wZ19kaXIgPSAocGdkX3QgKilnZXRfc2FmZV9wYWdlKEdGUF9BVE9NSUMpOw0KPiA+ Pj4+PiArCWlmICghcmVzdW1lX3BnX2RpcikNCj4gPj4+Pj4gKwkJcmV0dXJuIC1FTk9NRU07DQo+ ID4+Pj4+ICsNCj4gPj4+Pj4gKwkvKg0KPiA+Pj4+PiArCSAqIFRoZSBwYWdlcyBuZWVkIHRvIGJl IHdyaXRhYmxlIHdoZW4gcmVzdG9yaW5nIHRoZSBpbWFnZS4NCj4gPj4+Pj4gKwkgKiBDcmVhdGUg YSBzZWNvbmQgY29weSBvZiBwYWdlIHRhYmxlIGp1c3QgZm9yIHRoZSBsaW5lYXIgbWFwLCBhbmQg dXNlIHRoaXMgd2hlbg0KPiA+Pj4+PiArCSAqIHJlc3RvcmluZy4NCj4gPj4+Pj4gKwkgKi8NCj4g Pj4+Pj4gKwlmb3IgKDsgYWRkciA8PSAodW5zaWduZWQgbG9uZylwZm5fdG9fdmlydChtYXhfbG93 X3Bmbik7IGFkZHIgKz0gUEFHRV9TSVpFKSB7DQo+ID4+Pj4+ICsJCXJldCA9IHRlbXBfcGd0YWJs ZV9tYXBwaW5nKHJlc3VtZV9wZ19kaXIsIGFkZHIsIFBBR0VfS0VSTkVMKTsNCj4gPj4+Pj4gKwkJ aWYgKHJldCkNCj4gPj4+Pj4gKwkJCXJldHVybiAoaW50KXJldDsNCj4gPj4+Pj4gKwl9DQo+ID4+ Pj4+ICsNCj4gPj4+PiBUbyBtZSB0aGlzIGlzIHdyb25nIGFzIHRoaXMgZG9lcyBub3QgYWNjb3Vu dCBmb3IgdGhlIHJlYWwgcGh5c2ljYWwNCj4gPj4+PiBtYXBwaW5nIGxheW91dDogY2FuJ3QgeW91 IHNpbXBseSBjb3B5IHRoZSBsaW5lYXIgbWFwcGluZyBmcm9tDQo+ID4+Pj4gc3dhcHBlcl9wZ19k aXI/DQo+ID4+PiBIaSwgd2UgY292ZXJpbmcgdGhlIGxpbmVhciBtYXBwaW5nIGZyb20gUEFHRV9P RkZTRVQgdXAgdG8gcGZuX3RvX3ZpcnQobWF4X2xvd19wZm4pLiBXZSBzaG91bGRuJ3QgY29weSBm cm9tIHRoZQ0KPiA+PiBzd2FwcGVyX3BnX2RpciBhcyB3ZSBhcmUgbm90IHN1cHBvc2UgdG8gbW9k aWZ5IGl0cyBjb250ZW50Lg0KPiA+Pg0KPiA+Pg0KPiA+PiBGaXJzdCwgeW91J3JlIHJpZ2h0LCB3 ZSBuZWVkIHRoZSB0ZW1wb3JhcnkgcGFnZSB0YWJsZSBhcyBzd2FwcGVyX3BnX2Rpcg0KPiA+PiB3 aWxsIGdldCBvdmVyd3JpdHRlbiB1bmRlciBvdXIgZmVldC4NCj4gPj4NCj4gPj4gTm93LCBJIHN0 aWxsIGRpc2FncmVlIHdpdGggbWFwcGluZyBhbGwgdGhlIG1lbW9yeTogdGhlIGxpbmVhciBtYXBw aW5nIGlzDQo+ID4+IHNwYXJzZSBiZWNhdXNlIHdlIG9ubHkgbWFwIHdoYXQgbWVtYmxvY2sgZ2l2 ZXMgdXMgKHNvbWUgcmVnaW9ucyBhcmUNCj4gPj4gbWFya2VkIGFzICJub21hcCIgZm9yIGEgcmVh c29uKS4NCj4gPj4NCj4gPj4gSSBqdXN0IHRvb2sgYSBsb29rIGF0IGFybTY0LCBhbmQgdGhleSBk byBleGFjdGx5IHRoYXQ6IHRoZXkgZ28gdGhyb3VnaA0KPiA+PiBzd2FwcGVyX3BnX2RpciwgY29w eSB0aGUgbGluZWFyIG1hcHBpbmcgYW5kIGVuYWJsZSB3cml0ZSBhdCBldmVyeSBsZWFmDQo+ID4+ IGxldmVsDQo+ID4+IChodHRwczovL2VsaXhpci5ib290bGluLmNvbS9saW51eC9sYXRlc3Qvc291 cmNlL2FyY2gvYXJtNjQva2VybmVsL2hpYmVybmF0ZS5jI0w0MTkpLg0KPiA+IFlvdSdyZSByaWdo dCwgYnV0IHdlIGRvbuKAmXQgaGF2ZSB0byBjb3B5IGZyb20gdGhlIHN3YXBwZXJfcGdfZGlyLiBX ZSBjYW4gaW5zZXJ0IGtlcm5lbF9wYWdlX3ByZXNlbnQoKSB0byB0aGUgZnVuY3Rpb24gdG8gY2hl Y2sgdGhlDQo+IHBhZ2UgdmFsaWRpdHkgcHJpb3IgdG8gZG8gdGhlIG1hcHBpbmcuIEFncmVlPw0K PiANCj4gDQo+IFRoYXQgd291bGQgd29yaywgd2UnZCBsb3NlIHRoZSBiZW5lZml0IG9mIGh1Z2Ug cGFnZXMgdGhvdWdoLCBJJ20gbm90DQo+IG9wcG9zZWQgYXQgYWxsIGJ1dCBpZiB3ZSBjYW4gbGV2 ZXJhZ2UgZXhpc3RpbmcgYXJtNjQgY29kZSwgdGhhdCB3b3VsZA0KPiBldmVuIGJlIGJldHRlciwg b25seSB0aGUgUFRFIHdyaXRlIGZsYWcgaXMgZGlmZmVyZW50IQ0KdGhhdCdzIHRoZSB0aGluZy4g QXJtNjQgdXNlcyB0d28gdHRiciByZWdpc3RlcnMgdG8gbWFuaXB1bGF0ZSB0aGUgdmlydHVhbCBh ZGRyZXNzLiBUaGUgMSBwYWdlIG9mIHJlbG9jYXRlZCBleGVjdXRpb24gY29kZSBpcyBtYXBwZWQg dG8gdGhlIHR0YnIwIHdoaWxlIHRoZSB0ZW1wb3JhcnkgcGFnZSB0YWJsZSB3aXRoIGh1Z2UgcGFn ZSBzdXBwb3J0ZWQgaXMgbWFwcGVkIHRvIHRoZSB0dGJyMS4gU28sIHRoZXJlIGlzIG5vIG5lZWQg dG8gaGFuZGxlIHRoZSBodWdlIHBhZ2Ugc3BsaXQgaW4gdGhlIGFyY2gvYXJtNjQgZm9yIHRlbXBv cmFyeSBwYWdlIHRhYmxlLg0KUklTQ1Ygb25seSBoYXMgMSBzYXRwLCBpZiB3ZSB0cnlpbmcgdG8g c3VwcG9ydCBodWdlIHBhZ2UgZm9yIGhpYmVybmF0aW9uLCB0aGVuIHdlIG5lZWQgdG8gaGFuZGxl IHRoZSBodWdlIHBhZ2Ugc3BsaXQgaW4gYXJjaC9yaXNjdiBmb3IgdGhlIHRlbXBvcmFyeSBwYWdl IHRhYmxlIHRvIGhhbmRsZSB0aGUgMSBwYWdlIG9mIHJlbG9jYXRlZCBleGVjdXRpb24gY29kZS4g Rm9yIGN1cnJlbnQgUklTQ1YgQXJjaCwgd2UgY2FuIGludm9rZSB0aGUga2VybmVsX3BhZ2VfcHJl c2VudCgpIHRvIGNoZWNrIGZvciB0aGUgcGFnZSB2YWxpZGl0eSBidXQgSSBhbSBkb3VidCB3ZSBz aG91bGQgaW1wbGVtZW50IHRoZSBodWdlIHBhZ2Ugc3BsaXQgaW4gdGhlIGFyY2gvcmlzY3Ygd2hp Y2ggaXMgbm9ybWFsbHkgaGFuZGxlZCBieSB0aGUgYnVkZHkgYWxsb2NhdG9yLg0KPiANCj4gVGhh bmtzLA0KPiANCj4gQWxleA0KPiANCj4gDQo+ID4+DQo+ID4+Pj4gQnV0IEkgaGF2ZSB0byBhZG1p dCB0aGF0IEkgc3RydWdnbGUgdG8gdW5kZXJzdGFuZCB0aGUgbmVlZCBmb3IgdGhpcw0KPiA+Pj4+ IHRlbXBvcmFyeSBwYWdlIHRhYmxlOiBhbGwgd2UgbmVlZCB0byBkbyBpcyB0byBhbGxvdyB0byB3 cml0ZSB0byB0aGUNCj4gPj4+PiBsaW5lYXIgbWFwcGluZywgc28gd2h5IGRvbid0IHdlIHNpbXBs eSBzZXRfbWVtb3J5X3J3KGxpbmVhciBtYXBwaW5nKT8NCj4gPj4+IFNpbWlsYXIgdG8gdGhlIGFi b3ZlIGNvbW1lbnQuIFdoZW4gd2UgcmVzdG9yZSB0aGUgbWVtb3J5IGNvbnRlbnQsIHdlIG5lZWQg dG8gbWFrZSBzdXJlIHRoZSBwYWdlcyBhcmUgd3JpdGUtYWJsZS4gaWYgeW91DQo+IG1vZGlmeQ0K PiA+PiB0aGUgc3dhcHBlcl9wZ19kaXIsIHRoZSBrZXJuZWwgd2lsbCBjcmFzaCBhZnRlcndhcmRz Lg0KPiA+Pj4gVGhhdOKAmXMgd2h5IHdlIG5lZWQgYSBzZWNvbmQgcGFnZSB0YWJsZSB0byBkbyB0 aGUgcmVjb3ZlcmluZyBqb2IuDQo+ID4+Pj4+ICsJLyogTW92ZSB0aGUgcmVzdG9yZSBjb2RlIHRv IGEgbmV3IHBhZ2Ugc28gdGhhdCBpdCBkb2Vzbid0IGdldCBvdmVyd3JpdHRlbiBieSBpdHNlbGYg Ki8NCj4gPj4+Pj4gKwlyZWxvY2F0ZWRfcmVzdG9yZV9jb2RlID0gcmVsb2NhdGVfcmVzdG9yZV9j b2RlKCk7DQo+ID4+Pj4gQW5kIGRvIHdlIHJlYWxseSBuZWVkIHRvIGRvIHRoYXQgdG9vPyBUaGUg Y29kZSBpbiBxdWVzdGlvbiBjYW4gb25seSBiZQ0KPiA+Pj4+IG92ZXJ3cml0dGVuIGJ5IHRoZSBz YW1lIGNvZGUgcmlnaHQ/DQo+ID4+PiBZZXMsIHdlIG5lZWQgdG8gbW92ZSB0aGUgcmVjb3Zlcmlu ZyBjb2RlIHRvIGEgbmV3IHBhZ2UgdG8gcHJldmVudCB0aGUgY29kZSBmcm9tIG92ZXJ3cml0ZSBp dHNlbGYgd2hlbiByZXN0b3JpbmcgdGhlIG1lbW9yeS4NCj4gPj4+PiBUaGFua3MsDQo+ID4+Pj4N Cj4gPj4+PiBBbGV4DQo+ID4+Pj4NCj4gPj4+Pg0KPiA+Pj4+PiArCWlmIChyZWxvY2F0ZWRfcmVz dG9yZV9jb2RlID09IC1FTk9NRU0pDQo+ID4+Pj4+ICsJCXJldHVybiAtRU5PTUVNOw0KPiA+Pj4+ PiArDQo+ID4+Pj4+ICsJLyoNCj4gPj4+Pj4gKwkgKiBNYXAgdGhlIF9faGliZXJuYXRlX2NwdV9y ZXN1bWUoKSBhZGRyZXNzIHRvIHRoZSB0ZW1wb3JhcnkgcGFnZSB0YWJsZSBzbyB0aGF0IHRoZQ0K PiA+Pj4+PiArCSAqIHJlc3RvcmUgY29kZSBjYW4ganVtcCB0byBpdCBhZnRlciBmaW5pc2hlZCBy ZXN0b3JlIHRoZSBpbWFnZS4gVGhlIG5leHQgZXhlY3V0aW9uDQo+ID4+Pj4+ICsJICogY29kZSBk b2Vzbid0IGZpbmQgaXRzZWxmIGluIGEgZGlmZmVyZW50IGFkZHJlc3Mgc3BhY2UgYWZ0ZXIgc3dp dGNoaW5nIG92ZXIgdG8gdGhlDQo+ID4+Pj4+ICsJICogb3JpZ2luYWwgcGFnZSB0YWJsZSB1c2Vk IGJ5IHRoZSBoaWJlcm5hdGVkIGltYWdlLg0KPiA+Pj4+PiArCSAqLw0KPiA+Pj4+PiArCXJldCA9 IHRlbXBfcGd0YWJsZV9tYXBwaW5nKHJlc3VtZV9wZ19kaXIsICh1bnNpZ25lZCBsb25nKXJlc3Vt ZV9oZHIucmVzdG9yZV9jcHVfYWRkciwNCj4gPj4+Pj4gKwkJCQkJUEFHRV9LRVJORUxfUkVBRF9F WEVDKTsNCj4gPj4+Pj4gKwlpZiAocmV0KQ0KPiA+Pj4+PiArCQlyZXR1cm4gcmV0Ow0KPiA+Pj4+ PiArDQo+ID4+Pj4+ICsJcmVzdG9yZV9pbWFnZShyZXN1bWVfaGRyLnNhdmVkX3NhdHAsIChQRk5f RE9XTihfX3BhKHJlc3VtZV9wZ19kaXIpKSB8IHNhdHBfbW9kZSksDQo+ID4+Pj4+ICsJCQlyZXN1 bWVfaGRyLnJlc3RvcmVfY3B1X2FkZHIpOw0KPiA+Pj4+PiArDQo+ID4+Pj4+ICsJcmV0dXJuIDA7 DQo+ID4+Pj4+ICt9DQo+ID4+Pj4+ICsNCj4gPj4+Pj4gKyNpZmRlZiBDT05GSUdfUE1fU0xFRVBf U01QDQo+ID4+Pj4+ICtpbnQgaGliZXJuYXRlX3Jlc3VtZV9ub25ib290X2NwdV9kaXNhYmxlKHZv aWQpDQo+ID4+Pj4+ICt7DQo+ID4+Pj4+ICsJaWYgKHNsZWVwX2NwdSA8IDApIHsNCj4gPj4+Pj4g KwkJcHJfZXJyKCJGYWlsaW5nIHRvIHJlc3VtZSBmcm9tIGhpYmVybmF0ZSBvbiBhbiB1bmtub3du IENQVS5cbiIpOw0KPiA+Pj4+PiArCQlyZXR1cm4gLUVOT0RFVjsNCj4gPj4+Pj4gKwl9DQo+ID4+ Pj4+ICsNCj4gPj4+Pj4gKwlyZXR1cm4gZnJlZXplX3NlY29uZGFyeV9jcHVzKHNsZWVwX2NwdSk7 DQo+ID4+Pj4+ICt9DQo+ID4+Pj4+ICsjZW5kaWYNCj4gPj4+Pj4gKw0KPiA+Pj4+PiArc3RhdGlj IGludCBfX2luaXQgcmlzY3ZfaGliZXJuYXRlX2luaXQodm9pZCkNCj4gPj4+Pj4gK3sNCj4gPj4+ Pj4gKwloaWJlcm5hdGVfY3B1X2NvbnRleHQgPSBrY2FsbG9jKDEsIHNpemVvZihzdHJ1Y3Qgc3Vz cGVuZF9jb250ZXh0KSwgR0ZQX0tFUk5FTCk7DQo+ID4+Pj4+ICsNCj4gPj4+Pj4gKwlpZiAoV0FS Tl9PTighaGliZXJuYXRlX2NwdV9jb250ZXh0KSkNCj4gPj4+Pj4gKwkJcmV0dXJuIC1FTk9NRU07 DQo+ID4+Pj4+ICsNCj4gPj4+Pj4gKwlyZXR1cm4gMDsNCj4gPj4+Pj4gK30NCj4gPj4+Pj4gKw0K PiA+Pj4+PiArZWFybHlfaW5pdGNhbGwocmlzY3ZfaGliZXJuYXRlX2luaXQpOw0KPiA+Pj4gX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18NCj4gPj4+IGxpbnV4 LXJpc2N2IG1haWxpbmcgbGlzdA0KPiA+Pj4gbGludXgtcmlzY3ZAbGlzdHMuaW5mcmFkZWFkLm9y Zw0KPiA+Pj4gaHR0cDovL2xpc3RzLmluZnJhZGVhZC5vcmcvbWFpbG1hbi9saXN0aW5mby9saW51 eC1yaXNjdg0KPiA+IF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fDQo+ID4gbGludXgtcmlzY3YgbWFpbGluZyBsaXN0DQo+ID4gbGludXgtcmlzY3ZAbGlzdHMu aW5mcmFkZWFkLm9yZw0KPiA+IGh0dHA6Ly9saXN0cy5pbmZyYWRlYWQub3JnL21haWxtYW4vbGlz dGluZm8vbGludXgtcmlzY3YNCg==