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 11790C61DF7 for ; Thu, 23 Nov 2023 12:29:11 +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=6bBib1Av0++uER1+ImIt4/Sp7bzGI2FGAfvzMH8brLs=; b=qfGRnlBCKbajSu Oj7L+to4SyP6HjcZNodi1ObsbHP2T6pl98oxxQF/lXmyGy7Dlvco6JY9mzfjIhDshcRfc2ZXYUnq5 enVlKsTE/BGX98AWqtGLiWqDliZ7Z+ksFmDt5u9cADCzGmTeAXuIBxBgnYw7GL3v/xU1jXKtL8cVF bGDbD2HrxUZz3FdXE/PFP+NAnhHjO5kpBiusZbIVVaBiMMU0yFFwOvNukYBgsFyPG9FrNKePycR1h OJPwV2enjeQTpDU791GjIj5xo8sqIuf8YPJb5IOICmqLQJbm5o4DSze+aPd7nfQasFxbZanvpZ1Hk JVj2F1ssGm75/tYmZTAQ==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.96 #2 (Red Hat Linux)) id 1r68p0-004mvm-23; Thu, 23 Nov 2023 12:28:42 +0000 Received: from foss.arm.com ([217.140.110.172]) by bombadil.infradead.org with esmtp (Exim 4.96 #2 (Red Hat Linux)) id 1r68ov-004muv-2c for linux-arm-kernel@lists.infradead.org; Thu, 23 Nov 2023 12:28:40 +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 171001042; Thu, 23 Nov 2023 04:29:22 -0800 (PST) Received: from [10.1.37.168] (XHFQ2J9959.cambridge.arm.com [10.1.37.168]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPSA id 717033F7A6; Thu, 23 Nov 2023 04:28:32 -0800 (PST) Message-ID: <42f9e03f-86ad-418e-a337-7aef202e6a5b@arm.com> Date: Thu, 23 Nov 2023 12:28:31 +0000 MIME-Version: 1.0 User-Agent: Mozilla Thunderbird Subject: Re: [PATCH v2 01/14] mm: Batch-copy PTE ranges during fork() Content-Language: en-GB To: David Hildenbrand , Catalin Marinas , Will Deacon , Ard Biesheuvel , Marc Zyngier , Oliver Upton , James Morse , Suzuki K Poulose , Zenghui Yu , Andrey Ryabinin , Alexander Potapenko , Andrey Konovalov , Dmitry Vyukov , Vincenzo Frascino , Andrew Morton , Anshuman Khandual , Matthew Wilcox , Yu Zhao , Mark Rutland , Kefeng Wang , John Hubbard , Zi Yan Cc: linux-arm-kernel@lists.infradead.org, linux-mm@kvack.org, linux-kernel@vger.kernel.org References: <20231115163018.1303287-1-ryan.roberts@arm.com> <20231115163018.1303287-2-ryan.roberts@arm.com> <89a9fe07-a5c5-4a99-b588-e6145053c58f@redhat.com> <1459f78b-e80c-4f21-bc65-f0ab259d348a@arm.com> <08ef2c36-2b9c-4b96-9d1d-68cca0f68ba5@redhat.com> <2d027a8d-adfb-481d-89ea-c99139e669aa@arm.com> <2618b024-6a95-4bfc-a08d-59d86e9931e5@redhat.com> <118eb2d3-d504-49f0-b7f2-f29b64a8f404@arm.com> <15e2c6cb-e86d-417b-b83d-7c7459d5be8f@redhat.com> From: Ryan Roberts In-Reply-To: <15e2c6cb-e86d-417b-b83d-7c7459d5be8f@redhat.com> X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20231123_042837_969390_666D7DE2 X-CRM114-Status: GOOD ( 28.81 ) 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 T24gMjMvMTEvMjAyMyAxMjoxMiwgRGF2aWQgSGlsZGVuYnJhbmQgd3JvdGU6Cj4gT24gMjMuMTEu MjMgMTE6MjYsIFJ5YW4gUm9iZXJ0cyB3cm90ZToKPj4gT24gMTYvMTEvMjAyMyAxNDoxNSwgRGF2 aWQgSGlsZGVuYnJhbmQgd3JvdGU6Cj4+PiBPbiAxNi4xMS4yMyAxNToxMywgRGF2aWQgSGlsZGVu YnJhbmQgd3JvdGU6Cj4+Pj4gT24gMTYuMTEuMjMgMTQ6NDksIFJ5YW4gUm9iZXJ0cyB3cm90ZToK Pj4+Pj4gT24gMTYvMTEvMjAyMyAxMzoyMCwgRGF2aWQgSGlsZGVuYnJhbmQgd3JvdGU6Cj4+Pj4+ PiBPbiAxNi4xMS4yMyAxMjoyMCwgUnlhbiBSb2JlcnRzIHdyb3RlOgo+Pj4+Pj4+IE9uIDE2LzEx LzIwMjMgMTE6MDMsIERhdmlkIEhpbGRlbmJyYW5kIHdyb3RlOgo+Pj4+Pj4+PiBPbiAxNS4xMS4y MyAxNzozMCwgUnlhbiBSb2JlcnRzIHdyb3RlOgo+Pj4+Pj4+Pj4gQ29udmVydCBjb3B5X3B0ZV9y YW5nZSgpIHRvIGNvcHkgYSBzZXQgb2YgcHRlcyBpbiBhIGJhdGNoLiBBIGdpdmVuIGJhdGNoCj4+ Pj4+Pj4+PiBtYXBzIGEgcGh5c2ljYWxseSBjb250aWd1b3VzIGJsb2NrIG9mIG1lbW9yeSwgYWxs IGJlbG9uZ2luZyB0byB0aGUgc2FtZQo+Pj4+Pj4+Pj4gZm9saW8sIHdpdGggdGhlIHNhbWUgcGVy bWlzc2lvbnMsIGFuZCBmb3Igc2hhcmVkIG1hcHBpbmdzLCB0aGUgc2FtZQo+Pj4+Pj4+Pj4gZGly dHkgc3RhdGUuIFRoaXMgd2lsbCBsaWtlbHkgaW1wcm92ZSBwZXJmb3JtYW5jZSBieSBhIHRpbnkg YW1vdW50IGR1ZQo+Pj4+Pj4+Pj4gdG8gYmF0Y2hpbmcgdGhlIGZvbGlvIHJlZmVyZW5jZSBjb3Vu dCBtYW5hZ2VtZW50IGFuZCBjYWxsaW5nIHNldF9wdGVzKCkKPj4+Pj4+Pj4+IHJhdGhlciB0aGFu IG1ha2luZyBpbmRpdmlkdWFsIGNhbGxzIHRvIHNldF9wdGVfYXQoKS4KPj4+Pj4+Pj4+Cj4+Pj4+ Pj4+PiBIb3dldmVyLCB0aGUgcHJpbWFyeSBtb3RpdmF0aW9uIGZvciB0aGlzIGNoYW5nZSBpcyB0 byByZWR1Y2UgdGhlIG51bWJlcgo+Pj4+Pj4+Pj4gb2YgdGxiIG1haW50ZW5hbmNlIG9wZXJhdGlv bnMgdGhhdCB0aGUgYXJtNjQgYmFja2VuZCBoYXMgdG8gcGVyZm9ybQo+Pj4+Pj4+Pj4gZHVyaW5n IGZvcmssIGFzIGl0IGlzIGFib3V0IHRvIGFkZCB0cmFuc3BhcmVudCBzdXBwb3J0IGZvciB0aGUK Pj4+Pj4+Pj4+ICJjb250aWd1b3VzIGJpdCIgaW4gaXRzIHB0ZXMuIEJ5IHdyaXRlLXByb3RlY3Rp bmcgdGhlIHBhcmVudCB1c2luZyB0aGUKPj4+Pj4+Pj4+IG5ldyBwdGVwX3NldF93cnByb3RlY3Rz KCkgKG5vdGUgdGhlICdzJyBhdCB0aGUgZW5kKSBmdW5jdGlvbiwgdGhlCj4+Pj4+Pj4+PiBiYWNr ZW5kIGNhbiBhdm9pZCBoYXZpbmcgdG8gdW5mb2xkIGNvbnRpZyByYW5nZXMgb2YgUFRFcywgd2hp Y2ggaXMKPj4+Pj4+Pj4+IGV4cGVuc2l2ZSwgd2hlbiBhbGwgcHRlcyBpbiB0aGUgcmFuZ2UgYXJl IGJlaW5nIHdyaXRlLXByb3RlY3RlZC4KPj4+Pj4+Pj4+IFNpbWlsYXJseSwgYnkgdXNpbmcgc2V0 X3B0ZXMoKSByYXRoZXIgdGhhbiBzZXRfcHRlX2F0KCkgdG8gc2V0IHVwIHB0ZXMKPj4+Pj4+Pj4+ IGluIHRoZSBjaGlsZCwgdGhlIGJhY2tlbmQgZG9lcyBub3QgbmVlZCB0byBmb2xkIGEgY29udGln dW91cyByYW5nZSBvbmNlCj4+Pj4+Pj4+PiB0aGV5IGFyZSBhbGwgcG9wdWxhdGVkIC0gdGhleSBj YW4gYmUgaW5pdGlhbGx5IHBvcHVsYXRlZCBhcyBhIGNvbnRpZ3VvdXMKPj4+Pj4+Pj4+IHJhbmdl IGluIHRoZSBmaXJzdCBwbGFjZS4KPj4+Pj4+Pj4+Cj4+Pj4+Pj4+PiBUaGlzIGNoYW5nZSBhZGRy ZXNzZXMgdGhlIGNvcmUtbW0gcmVmYWN0b3Jpbmcgb25seSwgYW5kIGludHJvZHVjZXMKPj4+Pj4+ Pj4+IHB0ZXBfc2V0X3dycHJvdGVjdHMoKSB3aXRoIGEgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiB0 aGF0IGNhbGxzCj4+Pj4+Pj4+PiBwdGVwX3NldF93cnByb3RlY3QoKSBmb3IgZWFjaCBwdGUgaW4g dGhlIHJhbmdlLiBBIHNlcGFyYXRlIGNoYW5nZSB3aWxsCj4+Pj4+Pj4+PiBpbXBsZW1lbnQgcHRl cF9zZXRfd3Jwcm90ZWN0cygpIGluIHRoZSBhcm02NCBiYWNrZW5kIHRvIHJlYWxpemUgdGhlCj4+ Pj4+Pj4+PiBwZXJmb3JtYW5jZSBpbXByb3ZlbWVudCBhcyBwYXJ0IG9mIHRoZSB3b3JrIHRvIGVu YWJsZSBjb250cHRlIG1hcHBpbmdzLgo+Pj4+Pj4+Pj4KPj4+Pj4+Pj4+IFNpZ25lZC1vZmYtYnk6 IFJ5YW4gUm9iZXJ0cyA8cnlhbi5yb2JlcnRzQGFybS5jb20+Cj4+Pj4+Pj4+PiAtLS0KPj4+Pj4+ Pj4+IMKgwqAgwqDCoCBpbmNsdWRlL2xpbnV4L3BndGFibGUuaCB8wqAgMTMgKysrCj4+Pj4+Pj4+ PiDCoMKgIMKgwqAgbW0vbWVtb3J5LmPCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgfCAxNzUKPj4+ Pj4+Pj4+ICsrKysrKysrKysrKysrKysrKysrKysrKysrKysrKystLS0tLS0tLS0KPj4+Pj4+Pj4+ IMKgwqAgwqDCoCAyIGZpbGVzIGNoYW5nZWQsIDE1MCBpbnNlcnRpb25zKCspLCAzOCBkZWxldGlv bnMoLSkKPj4+Pj4+Pj4+Cj4+Pj4+Pj4+PiBkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9wZ3Rh YmxlLmggYi9pbmNsdWRlL2xpbnV4L3BndGFibGUuaAo+Pj4+Pj4+Pj4gaW5kZXggYWY3NjM5YzNi MGEzLi4xYzUwZjhhMGZkZGUgMTAwNjQ0Cj4+Pj4+Pj4+PiAtLS0gYS9pbmNsdWRlL2xpbnV4L3Bn dGFibGUuaAo+Pj4+Pj4+Pj4gKysrIGIvaW5jbHVkZS9saW51eC9wZ3RhYmxlLmgKPj4+Pj4+Pj4+ IEBAIC02MjIsNiArNjIyLDE5IEBAIHN0YXRpYyBpbmxpbmUgdm9pZCBwdGVwX3NldF93cnByb3Rl Y3Qoc3RydWN0Cj4+Pj4+Pj4+PiBtbV9zdHJ1Y3QKPj4+Pj4+Pj4+ICptbSwgdW5zaWduZWQgbG9u ZyBhZGRyZXMKPj4+Pj4+Pj4+IMKgwqAgwqDCoCB9Cj4+Pj4+Pj4+PiDCoMKgIMKgwqAgI2VuZGlm Cj4+Pj4+Pj4+PiDCoMKgIMKgwqAgKyNpZm5kZWYgcHRlcF9zZXRfd3Jwcm90ZWN0cwo+Pj4+Pj4+ Pj4gK3N0cnVjdCBtbV9zdHJ1Y3Q7Cj4+Pj4+Pj4+PiArc3RhdGljIGlubGluZSB2b2lkIHB0ZXBf c2V0X3dycHJvdGVjdHMoc3RydWN0IG1tX3N0cnVjdCAqbW0sCj4+Pj4+Pj4+PiArwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgIHVuc2lnbmVkIGxvbmcgYWRkcmVzcywgcHRlX3QgKnB0ZXAs Cj4+Pj4+Pj4+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHVuc2lnbmVkIGludCBu cikKPj4+Pj4+Pj4+ICt7Cj4+Pj4+Pj4+PiArwqDCoMKgIHVuc2lnbmVkIGludCBpOwo+Pj4+Pj4+ Pj4gKwo+Pj4+Pj4+Pj4gK8KgwqDCoCBmb3IgKGkgPSAwOyBpIDwgbnI7IGkrKywgYWRkcmVzcyAr PSBQQUdFX1NJWkUsIHB0ZXArKykKPj4+Pj4+Pj4+ICvCoMKgwqDCoMKgwqDCoCBwdGVwX3NldF93 cnByb3RlY3QobW0sIGFkZHJlc3MsIHB0ZXApOwo+Pj4+Pj4+Pj4gK30KPj4+Pj4+Pj4+ICsjZW5k aWYKPj4+Pj4+Pj4+ICsKPj4+Pj4+Pj4+IMKgwqAgwqDCoCAvKgo+Pj4+Pj4+Pj4gwqDCoCDCoMKg wqAgKiBPbiBzb21lIGFyY2hpdGVjdHVyZXMgaGFyZHdhcmUgZG9lcyBub3Qgc2V0IHBhZ2UgYWNj ZXNzIGJpdCB3aGVuCj4+Pj4+Pj4+PiBhY2Nlc3NpbmcKPj4+Pj4+Pj4+IMKgwqAgwqDCoMKgICog bWVtb3J5IHBhZ2UsIGl0IGlzIHJlc3BvbnNpYmlsaXR5IG9mIHNvZnR3YXJlIHNldHRpbmcgdGhp cyBiaXQuCj4+Pj4+Pj4+PiBJdCBicmluZ3MKPj4+Pj4+Pj4+IGRpZmYgLS1naXQgYS9tbS9tZW1v cnkuYyBiL21tL21lbW9yeS5jCj4+Pj4+Pj4+PiBpbmRleCAxZjE4ZWQ0YTU0OTcuLmI3YzgyMjg4 ODNjZiAxMDA2NDQKPj4+Pj4+Pj4+IC0tLSBhL21tL21lbW9yeS5jCj4+Pj4+Pj4+PiArKysgYi9t bS9tZW1vcnkuYwo+Pj4+Pj4+Pj4gQEAgLTkyMSw0NiArOTIxLDEyOSBAQCBjb3B5X3ByZXNlbnRf cGFnZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKmRzdF92bWEsCj4+Pj4+Pj4+PiBzdHJ1Y3Qgdm1f YXJlYV9zdHJ1Y3QgKnNyY192bWEKPj4+Pj4+Pj4+IMKgwqAgwqDCoMKgwqDCoMKgwqDCoMKgwqAg LyogVWZmZC13cCBuZWVkcyB0byBiZSBkZWxpdmVyZWQgdG8gZGVzdCBwdGUgYXMgd2VsbCAqLwo+ Pj4+Pj4+Pj4gwqDCoCDCoMKgwqDCoMKgwqDCoMKgwqDCoCBwdGUgPSBwdGVfbWt1ZmZkX3dwKHB0 ZSk7Cj4+Pj4+Pj4+PiDCoMKgIMKgwqDCoMKgwqDCoCBzZXRfcHRlX2F0KGRzdF92bWEtPnZtX21t LCBhZGRyLCBkc3RfcHRlLCBwdGUpOwo+Pj4+Pj4+Pj4gLcKgwqDCoCByZXR1cm4gMDsKPj4+Pj4+ Pj4+ICvCoMKgwqAgcmV0dXJuIDE7Cj4+Pj4+Pj4+PiArfQo+Pj4+Pj4+Pj4gKwo+Pj4+Pj4+Pj4g K3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBwYWdlX2NvbnRfbWFwcGVkX3ZhZGRyKHN0cnVj dCBwYWdlICpwYWdlLAo+Pj4+Pj4+Pj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBz dHJ1Y3QgcGFnZSAqYW5jaG9yLCB1bnNpZ25lZCBsb25nIGFuY2hvcl92YWRkcikKPj4+Pj4+Pj4+ ICt7Cj4+Pj4+Pj4+PiArwqDCoMKgIHVuc2lnbmVkIGxvbmcgb2Zmc2V0Owo+Pj4+Pj4+Pj4gK8Kg wqDCoCB1bnNpZ25lZCBsb25nIHZhZGRyOwo+Pj4+Pj4+Pj4gKwo+Pj4+Pj4+Pj4gK8KgwqDCoCBv ZmZzZXQgPSAocGFnZV90b19wZm4ocGFnZSkgLSBwYWdlX3RvX3BmbihhbmNob3IpKSA8PCBQQUdF X1NISUZUOwo+Pj4+Pj4+Pj4gK8KgwqDCoCB2YWRkciA9IGFuY2hvcl92YWRkciArIG9mZnNldDsK Pj4+Pj4+Pj4+ICsKPj4+Pj4+Pj4+ICvCoMKgwqAgaWYgKGFuY2hvciA+IHBhZ2UpIHsKPj4+Pj4+ Pj4+ICvCoMKgwqDCoMKgwqDCoCBpZiAodmFkZHIgPiBhbmNob3JfdmFkZHIpCj4+Pj4+Pj4+PiAr wqDCoMKgwqDCoMKgwqDCoMKgwqDCoCByZXR1cm4gMDsKPj4+Pj4+Pj4+ICvCoMKgwqAgfSBlbHNl IHsKPj4+Pj4+Pj4+ICvCoMKgwqDCoMKgwqDCoCBpZiAodmFkZHIgPCBhbmNob3JfdmFkZHIpCj4+ Pj4+Pj4+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCByZXR1cm4gVUxPTkdfTUFYOwo+Pj4+Pj4+ Pj4gK8KgwqDCoCB9Cj4+Pj4+Pj4+PiArCj4+Pj4+Pj4+PiArwqDCoMKgIHJldHVybiB2YWRkcjsK Pj4+Pj4+Pj4+ICt9Cj4+Pj4+Pj4+PiArCj4+Pj4+Pj4+PiArc3RhdGljIGludCBmb2xpb19ucl9w YWdlc19jb250X21hcHBlZChzdHJ1Y3QgZm9saW8gKmZvbGlvLAo+Pj4+Pj4+Pj4gK8KgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBzdHJ1Y3QgcGFnZSAqcGFnZSwgcHRl X3QgKnB0ZSwKPj4+Pj4+Pj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqAgdW5zaWduZWQgbG9uZyBhZGRyLCB1bnNpZ25lZCBsb25nIGVuZCwKPj4+Pj4+Pj4+ICvC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgcHRlX3QgcHRlbnQsIGJv b2wgKmFueV9kaXJ0eSkKPj4+Pj4+Pj4+ICt7Cj4+Pj4+Pj4+PiArwqDCoMKgIGludCBmbG9vcHM7 Cj4+Pj4+Pj4+PiArwqDCoMKgIGludCBpOwo+Pj4+Pj4+Pj4gK8KgwqDCoCB1bnNpZ25lZCBsb25n IHBmbjsKPj4+Pj4+Pj4+ICvCoMKgwqAgcGdwcm90X3QgcHJvdDsKPj4+Pj4+Pj4+ICvCoMKgwqAg c3RydWN0IHBhZ2UgKmZvbGlvX2VuZDsKPj4+Pj4+Pj4+ICsKPj4+Pj4+Pj4+ICvCoMKgwqAgaWYg KCFmb2xpb190ZXN0X2xhcmdlKGZvbGlvKSkKPj4+Pj4+Pj4+ICvCoMKgwqDCoMKgwqDCoCByZXR1 cm4gMTsKPj4+Pj4+Pj4+ICsKPj4+Pj4+Pj4+ICvCoMKgwqAgZm9saW9fZW5kID0gJmZvbGlvLT5w YWdlICsgZm9saW9fbnJfcGFnZXMoZm9saW8pOwo+Pj4+Pj4+Pj4gK8KgwqDCoCBlbmQgPSBtaW4o cGFnZV9jb250X21hcHBlZF92YWRkcihmb2xpb19lbmQsIHBhZ2UsIGFkZHIpLCBlbmQpOwo+Pj4+ Pj4+Pj4gK8KgwqDCoCBmbG9vcHMgPSAoZW5kIC0gYWRkcikgPj4gUEFHRV9TSElGVDsKPj4+Pj4+ Pj4+ICvCoMKgwqAgcGZuID0gcGFnZV90b19wZm4ocGFnZSk7Cj4+Pj4+Pj4+PiArwqDCoMKgIHBy b3QgPSBwdGVfcGdwcm90KHB0ZV9ta29sZChwdGVfbWtjbGVhbihwdGVudCkpKTsKPj4+Pj4+Pj4+ ICsKPj4+Pj4+Pj4+ICvCoMKgwqAgKmFueV9kaXJ0eSA9IHB0ZV9kaXJ0eShwdGVudCk7Cj4+Pj4+ Pj4+PiArCj4+Pj4+Pj4+PiArwqDCoMKgIHBmbisrOwo+Pj4+Pj4+Pj4gK8KgwqDCoCBwdGUrKzsK Pj4+Pj4+Pj4+ICsKPj4+Pj4+Pj4+ICvCoMKgwqAgZm9yIChpID0gMTsgaSA8IGZsb29wczsgaSsr KSB7Cj4+Pj4+Pj4+PiArwqDCoMKgwqDCoMKgwqAgcHRlbnQgPSBwdGVwX2dldChwdGUpOwo+Pj4+ Pj4+Pj4gK8KgwqDCoMKgwqDCoMKgIHB0ZW50ID0gcHRlX21rb2xkKHB0ZV9ta2NsZWFuKHB0ZW50 KSk7Cj4+Pj4+Pj4+PiArCj4+Pj4+Pj4+PiArwqDCoMKgwqDCoMKgwqAgaWYgKCFwdGVfcHJlc2Vu dChwdGVudCkgfHwgcHRlX3BmbihwdGVudCkgIT0gcGZuIHx8Cj4+Pj4+Pj4+PiArwqDCoMKgwqDC oMKgwqDCoMKgwqDCoCBwZ3Byb3RfdmFsKHB0ZV9wZ3Byb3QocHRlbnQpKSAhPSBwZ3Byb3RfdmFs KHByb3QpKQo+Pj4+Pj4+Pj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqAgYnJlYWs7Cj4+Pj4+Pj4+ PiArCj4+Pj4+Pj4+PiArwqDCoMKgwqDCoMKgwqAgaWYgKHB0ZV9kaXJ0eShwdGVudCkpCj4+Pj4+ Pj4+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCAqYW55X2RpcnR5ID0gdHJ1ZTsKPj4+Pj4+Pj4+ ICsKPj4+Pj4+Pj4+ICvCoMKgwqDCoMKgwqDCoCBwZm4rKzsKPj4+Pj4+Pj4+ICvCoMKgwqDCoMKg wqDCoCBwdGUrKzsKPj4+Pj4+Pj4+ICvCoMKgwqAgfQo+Pj4+Pj4+Pj4gKwo+Pj4+Pj4+Pj4gK8Kg wqDCoCByZXR1cm4gaTsKPj4+Pj4+Pj4+IMKgwqAgwqDCoCB9Cj4+Pj4+Pj4+PiDCoMKgIMKgwqAg wqAgLyoKPj4+Pj4+Pj4+IC0gKiBDb3B5IG9uZSBwdGUuwqAgUmV0dXJucyAwIGlmIHN1Y2NlZWRl ZCwgb3IgLUVBR0FJTiBpZiBvbmUgcHJlYWxsb2NhdGVkCj4+Pj4+Pj4+PiBwYWdlCj4+Pj4+Pj4+ PiAtICogaXMgcmVxdWlyZWQgdG8gY29weSB0aGlzIHB0ZS4KPj4+Pj4+Pj4+ICsgKiBDb3B5IHNl dCBvZiBjb250aWd1b3VzIHB0ZXMuwqAgUmV0dXJucyBudW1iZXIgb2YgcHRlcyBjb3BpZWQgaWYK Pj4+Pj4+Pj4+IHN1Y2NlZWRlZAo+Pj4+Pj4+Pj4gKyAqIChhbHdheXMgZ3RlIDEpLCBvciAtRUFH QUlOIGlmIG9uZSBwcmVhbGxvY2F0ZWQgcGFnZSBpcyByZXF1aXJlZCB0bwo+Pj4+Pj4+Pj4gY29w eSB0aGUKPj4+Pj4+Pj4+ICsgKiBmaXJzdCBwdGUuCj4+Pj4+Pj4+PiDCoMKgIMKgwqDCoCAqLwo+ Pj4+Pj4+Pj4gwqDCoCDCoMKgIHN0YXRpYyBpbmxpbmUgaW50Cj4+Pj4+Pj4+PiAtY29weV9wcmVz ZW50X3B0ZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKmRzdF92bWEsIHN0cnVjdCB2bV9hcmVhX3N0 cnVjdAo+Pj4+Pj4+Pj4gKnNyY192bWEsCj4+Pj4+Pj4+PiAtwqDCoMKgwqDCoMKgwqDCoCBwdGVf dCAqZHN0X3B0ZSwgcHRlX3QgKnNyY19wdGUsIHVuc2lnbmVkIGxvbmcgYWRkciwgaW50ICpyc3Ms Cj4+Pj4+Pj4+PiAtwqDCoMKgwqDCoMKgwqDCoCBzdHJ1Y3QgZm9saW8gKipwcmVhbGxvYykKPj4+ Pj4+Pj4+ICtjb3B5X3ByZXNlbnRfcHRlcyhzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKmRzdF92bWEs IHN0cnVjdCB2bV9hcmVhX3N0cnVjdAo+Pj4+Pj4+Pj4gKnNyY192bWEsCj4+Pj4+Pj4+PiArwqDC oMKgwqDCoMKgwqDCoMKgIHB0ZV90ICpkc3RfcHRlLCBwdGVfdCAqc3JjX3B0ZSwKPj4+Pj4+Pj4+ ICvCoMKgwqDCoMKgwqDCoMKgwqAgdW5zaWduZWQgbG9uZyBhZGRyLCB1bnNpZ25lZCBsb25nIGVu ZCwKPj4+Pj4+Pj4+ICvCoMKgwqDCoMKgwqDCoMKgwqAgaW50ICpyc3MsIHN0cnVjdCBmb2xpbyAq KnByZWFsbG9jKQo+Pj4+Pj4+Pj4gwqDCoCDCoMKgIHsKPj4+Pj4+Pj4+IMKgwqAgwqDCoMKgwqDC oMKgIHN0cnVjdCBtbV9zdHJ1Y3QgKnNyY19tbSA9IHNyY192bWEtPnZtX21tOwo+Pj4+Pj4+Pj4g wqDCoCDCoMKgwqDCoMKgwqAgdW5zaWduZWQgbG9uZyB2bV9mbGFncyA9IHNyY192bWEtPnZtX2Zs YWdzOwo+Pj4+Pj4+Pj4gwqDCoCDCoMKgwqDCoMKgwqAgcHRlX3QgcHRlID0gcHRlcF9nZXQoc3Jj X3B0ZSk7Cj4+Pj4+Pj4+PiDCoMKgIMKgwqDCoMKgwqDCoCBzdHJ1Y3QgcGFnZSAqcGFnZTsKPj4+ Pj4+Pj4+IMKgwqAgwqDCoMKgwqDCoMKgIHN0cnVjdCBmb2xpbyAqZm9saW87Cj4+Pj4+Pj4+PiAr wqDCoMKgIGludCBuciA9IDE7Cj4+Pj4+Pj4+PiArwqDCoMKgIGJvb2wgYW5vbjsKPj4+Pj4+Pj4+ ICvCoMKgwqAgYm9vbCBhbnlfZGlydHkgPSBwdGVfZGlydHkocHRlKTsKPj4+Pj4+Pj4+ICvCoMKg wqAgaW50IGk7Cj4+Pj4+Pj4+PiDCoMKgIMKgwqAgwqDCoMKgwqDCoCBwYWdlID0gdm1fbm9ybWFs X3BhZ2Uoc3JjX3ZtYSwgYWRkciwgcHRlKTsKPj4+Pj4+Pj4+IC3CoMKgwqAgaWYgKHBhZ2UpCj4+ Pj4+Pj4+PiArwqDCoMKgIGlmIChwYWdlKSB7Cj4+Pj4+Pj4+PiDCoMKgIMKgwqDCoMKgwqDCoMKg wqDCoMKgIGZvbGlvID0gcGFnZV9mb2xpbyhwYWdlKTsKPj4+Pj4+Pj4+IC3CoMKgwqAgaWYgKHBh Z2UgJiYgZm9saW9fdGVzdF9hbm9uKGZvbGlvKSkgewo+Pj4+Pj4+Pj4gLcKgwqDCoMKgwqDCoMKg IC8qCj4+Pj4+Pj4+PiAtwqDCoMKgwqDCoMKgwqDCoCAqIElmIHRoaXMgcGFnZSBtYXkgaGF2ZSBi ZWVuIHBpbm5lZCBieSB0aGUgcGFyZW50IHByb2Nlc3MsCj4+Pj4+Pj4+PiAtwqDCoMKgwqDCoMKg wqDCoCAqIGNvcHkgdGhlIHBhZ2UgaW1tZWRpYXRlbHkgZm9yIHRoZSBjaGlsZCBzbyB0aGF0IHdl J2xsIGFsd2F5cwo+Pj4+Pj4+Pj4gLcKgwqDCoMKgwqDCoMKgwqAgKiBndWFyYW50ZWUgdGhlIHBp bm5lZCBwYWdlIHdvbid0IGJlIHJhbmRvbWx5IHJlcGxhY2VkIGluIHRoZQo+Pj4+Pj4+Pj4gLcKg wqDCoMKgwqDCoMKgwqAgKiBmdXR1cmUuCj4+Pj4+Pj4+PiAtwqDCoMKgwqDCoMKgwqDCoCAqLwo+ Pj4+Pj4+Pj4gLcKgwqDCoMKgwqDCoMKgIGZvbGlvX2dldChmb2xpbyk7Cj4+Pj4+Pj4+PiAtwqDC oMKgwqDCoMKgwqAgaWYgKHVubGlrZWx5KHBhZ2VfdHJ5X2R1cF9hbm9uX3JtYXAocGFnZSwgZmFs c2UsIHNyY192bWEpKSkgewo+Pj4+Pj4+Pj4gLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgLyogUGFn ZSBtYXkgYmUgcGlubmVkLCB3ZSBoYXZlIHRvIGNvcHkuICovCj4+Pj4+Pj4+PiAtwqDCoMKgwqDC oMKgwqDCoMKgwqDCoCBmb2xpb19wdXQoZm9saW8pOwo+Pj4+Pj4+Pj4gLcKgwqDCoMKgwqDCoMKg wqDCoMKgwqAgcmV0dXJuIGNvcHlfcHJlc2VudF9wYWdlKGRzdF92bWEsIHNyY192bWEsIGRzdF9w dGUsIHNyY19wdGUsCj4+Pj4+Pj4+PiAtwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgIGFkZHIsIHJzcywgcHJlYWxsb2MsIHBhZ2UpOwo+Pj4+Pj4+Pj4gK8Kg wqDCoMKgwqDCoMKgIGFub24gPSBmb2xpb190ZXN0X2Fub24oZm9saW8pOwo+Pj4+Pj4+Pj4gK8Kg wqDCoMKgwqDCoMKgIG5yID0gZm9saW9fbnJfcGFnZXNfY29udF9tYXBwZWQoZm9saW8sIHBhZ2Us IHNyY19wdGUsIGFkZHIsCj4+Pj4+Pj4+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoCBlbmQsIHB0ZSwgJmFueV9kaXJ0eSk7Cj4+Pj4+Pj4+PiArCj4+Pj4+ Pj4+PiArwqDCoMKgwqDCoMKgwqAgZm9yIChpID0gMDsgaSA8IG5yOyBpKyssIHBhZ2UrKykgewo+ Pj4+Pj4+Pj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqAgaWYgKGFub24pIHsKPj4+Pj4+Pj4+ICvC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgLyoKPj4+Pj4+Pj4+ICvCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoCAqIElmIHRoaXMgcGFnZSBtYXkgaGF2ZSBiZWVuIHBpbm5lZCBi eSB0aGUKPj4+Pj4+Pj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCAqIHBhcmVu dCBwcm9jZXNzLCBjb3B5IHRoZSBwYWdlIGltbWVkaWF0ZWx5IGZvcgo+Pj4+Pj4+Pj4gK8KgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgICogdGhlIGNoaWxkIHNvIHRoYXQgd2UnbGwgYWx3 YXlzIGd1YXJhbnRlZSB0aGUKPj4+Pj4+Pj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoCAqIHBpbm5lZCBwYWdlIHdvbid0IGJlIHJhbmRvbWx5IHJlcGxhY2VkIGluIHRoZQo+Pj4+ Pj4+Pj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgICogZnV0dXJlLgo+Pj4+Pj4+ Pj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgICovCj4+Pj4+Pj4+PiArwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGlmICh1bmxpa2VseShwYWdlX3RyeV9kdXBfYW5vbl9y bWFwKAo+Pj4+Pj4+Pj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqAgcGFnZSwgZmFsc2UsIHNyY192bWEpKSkgewo+Pj4+Pj4+Pj4gK8KgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGlmIChpICE9IDApCj4+Pj4+Pj4+PiArwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBicmVhazsKPj4+Pj4+Pj4+ICvC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCAvKiBQYWdlIG1heSBiZSBwaW5u ZWQsIHdlIGhhdmUgdG8gY29weS4gKi8KPj4+Pj4+Pj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoCByZXR1cm4gY29weV9wcmVzZW50X3BhZ2UoCj4+Pj4+Pj4+PiArwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBkc3Rfdm1hLCBzcmNf dm1hLCBkc3RfcHRlLAo+Pj4+Pj4+Pj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqAgc3JjX3B0ZSwgYWRkciwgcnNzLCBwcmVhbGxvYywKPj4+Pj4+Pj4+ICvC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHBhZ2UpOwo+Pj4+ Pj4+Pj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCB9Cj4+Pj4+Pj4+PiArwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHJzc1tNTV9BTk9OUEFHRVNdKys7Cj4+Pj4+Pj4+PiAr wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIFZNX0JVR19PTihQYWdlQW5vbkV4Y2x1c2l2 ZShwYWdlKSk7Cj4+Pj4+Pj4+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCB9IGVsc2Ugewo+Pj4+ Pj4+Pj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBwYWdlX2R1cF9maWxlX3JtYXAo cGFnZSwgZmFsc2UpOwo+Pj4+Pj4+Pj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBy c3NbbW1fY291bnRlcl9maWxlKHBhZ2UpXSsrOwo+Pj4+Pj4+Pj4gK8KgwqDCoMKgwqDCoMKgwqDC oMKgwqAgfQo+Pj4+Pj4+Pj4gwqDCoCDCoMKgwqDCoMKgwqDCoMKgwqDCoCB9Cj4+Pj4+Pj4+PiAt wqDCoMKgwqDCoMKgwqAgcnNzW01NX0FOT05QQUdFU10rKzsKPj4+Pj4+Pj4+IC3CoMKgwqAgfSBl bHNlIGlmIChwYWdlKSB7Cj4+Pj4+Pj4+PiAtwqDCoMKgwqDCoMKgwqAgZm9saW9fZ2V0KGZvbGlv KTsKPj4+Pj4+Pj4+IC3CoMKgwqDCoMKgwqDCoCBwYWdlX2R1cF9maWxlX3JtYXAocGFnZSwgZmFs c2UpOwo+Pj4+Pj4+Pj4gLcKgwqDCoMKgwqDCoMKgIHJzc1ttbV9jb3VudGVyX2ZpbGUocGFnZSld Kys7Cj4+Pj4+Pj4+PiArCj4+Pj4+Pj4+PiArwqDCoMKgwqDCoMKgwqAgbnIgPSBpOwo+Pj4+Pj4+ Pj4gK8KgwqDCoMKgwqDCoMKgIGZvbGlvX3JlZl9hZGQoZm9saW8sIG5yKTsKPj4+Pj4+Pj4+IMKg wqAgwqDCoMKgwqDCoMKgIH0KPj4+Pj4+Pj4+IMKgwqAgwqDCoCDCoMKgwqDCoMKgIC8qCj4+Pj4+ Pj4+PiBAQCAtOTY4LDI0ICsxMDUxLDI4IEBAIGNvcHlfcHJlc2VudF9wdGUoc3RydWN0IHZtX2Fy ZWFfc3RydWN0ICpkc3Rfdm1hLAo+Pj4+Pj4+Pj4gc3RydWN0Cj4+Pj4+Pj4+PiB2bV9hcmVhX3N0 cnVjdCAqc3JjX3ZtYSwKPj4+Pj4+Pj4+IMKgwqAgwqDCoMKgwqDCoMKgwqAgKiBpbiB0aGUgcGFy ZW50IGFuZCB0aGUgY2hpbGQKPj4+Pj4+Pj4+IMKgwqAgwqDCoMKgwqDCoMKgwqAgKi8KPj4+Pj4+ Pj4+IMKgwqAgwqDCoMKgwqDCoMKgIGlmIChpc19jb3dfbWFwcGluZyh2bV9mbGFncykgJiYgcHRl X3dyaXRlKHB0ZSkpIHsKPj4+Pj4+Pj4+IC3CoMKgwqDCoMKgwqDCoCBwdGVwX3NldF93cnByb3Rl Y3Qoc3JjX21tLCBhZGRyLCBzcmNfcHRlKTsKPj4+Pj4+Pj4+ICvCoMKgwqDCoMKgwqDCoCBwdGVw X3NldF93cnByb3RlY3RzKHNyY19tbSwgYWRkciwgc3JjX3B0ZSwgbnIpOwo+Pj4+Pj4+Pj4gwqDC oCDCoMKgwqDCoMKgwqDCoMKgwqDCoCBwdGUgPSBwdGVfd3Jwcm90ZWN0KHB0ZSk7Cj4+Pj4+Pj4+ Cj4+Pj4+Pj4+IFlvdSBsaWtlbHkgd2FudCBhbiAiYW55X3B0ZV93cml0YWJsZSIgY2hlY2sgaGVy ZSBpbnN0ZWFkLCBubz8KPj4+Pj4+Pj4KPj4+Pj4+Pj4gQW55IG9wZXJhdGlvbnMgdGhhdCB0YXJn ZXQgYSBzaW5nbGUgaW5kaWl2aWR1YWwgUFRFIHdoaWxlIG11bHRpcGxlIFBURXMgYXJlCj4+Pj4+ Pj4+IGFkanVzdGVkIGFyZSBzdXNwaWNpb3VzIDopCj4+Pj4+Pj4KPj4+Pj4+PiBUaGUgaWRlYSBp cyB0aGF0IEkndmUgYWxyZWFkeSBjb25zdHJhaW5lZCB0aGUgYmF0Y2ggb2YgcGFnZXMgc3VjaCB0 aGF0IHRoZQo+Pj4+Pj4+IHBlcm1pc3Npb25zIGFyZSBhbGwgdGhlIHNhbWUgKHNlZSBmb2xpb19u cl9wYWdlc19jb250X21hcHBlZCgpKS4gU28gaWYgdGhlCj4+Pj4+Pj4gZmlyc3QKPj4+Pj4+PiBw dGUgaXMgd3JpdGFibGUsIHRoZW4gdGhleSBhbGwgYXJlIC0gc29tZXRoaW5nIGhhcyBnb25lIGJh ZGx5IHdyb25nIGlmIHNvbWUKPj4+Pj4+PiBhcmUKPj4+Pj4+PiB3cml0YWJsZSBhbmQgb3RoZXJz IGFyZSBub3QuCj4+Pj4+Pgo+Pj4+Pj4gSSB3b25kZXIgaWYgaXQgd291bGQgYmUgY2xlYW5lciBh bmQgZWFzaWVyIHRvIG5vdCBkbyB0aGF0LCB0aG91Z2guCj4+Pj4+Pgo+Pj4+Pj4gU2ltcGx5IHJl Y29yZCBpZiBhbnkgcHRlIGlzIHdyaXRhYmxlLiBBZnRlcndhcmRzIHRoZXkgd2lsbCAqYWxsKiBi ZSBSL08KPj4+Pj4+IGFuZCB5b3UKPj4+Pj4+IGNhbiBzZXQgdGhlIGNvbnQgYml0LCBjb3JyZWN0 Pwo+Pj4+Pgo+Pj4+PiBPaCBJIHNlZSB3aGF0IHlvdSBtZWFuIC0gdGhhdCBvbmx5IHdvcmtzIGZv ciBjb3cgbWFwcGluZ3MgdGhvdWdoLiBJZiB5b3UKPj4+Pj4gaGF2ZSBhCj4+Pj4+IHNoYXJlZCBt YXBwaW5nLCB5b3Ugd29uJ3QgYmUgbWFraW5nIGl0IHJlYWQtb25seSBhdCBmb3JrLiBTbyBpZiB3 ZSBpZ25vcmUKPj4+Pj4gcHRlX3dyaXRlKCkgc3RhdGUgd2hlbiBkZW1hcmtpbmcgdGhlIGJhdGNo ZXMsIHdlIHdpbGwgZW5kIHVwIHdpdGggYSBiYXRjaCBvZgo+Pj4+PiBwYWdlcyB3aXRoIGEgbWl4 IG9mIFJPIGFuZCBSVyBpbiB0aGUgcGFyZW50LCBidXQgdGhlbiB3ZSBzZXRfcHRlcygpIGZvciB0 aGUKPj4+Pj4gY2hpbGQgYW5kIHRob3NlIHBhZ2VzIHdpbGwgYWxsIGhhdmUgdGhlIHBlcm1pc3Np b25zIG9mIHRoZSBmaXJzdCBwYWdlIG9mIHRoZQo+Pj4+PiBiYXRjaC4KPj4+Pgo+Pj4+IEkgc2Vl IHdoYXQgeW91IG1lYW4uCj4+Pj4KPj4+PiBBZnRlciBmb3JrKCksIGFsbCBhbm9uIHBhZ2VzIHdp bGwgYmUgUi9PIGluIHRoZSBwYXJlbnQgYW5kIHRoZSBjaGlsZC4KPj4+PiBFYXN5LiBJZiBhbnkg UFRFIGlzIHdyaXRhYmxlLCB3cnByb3RlY3QgYWxsIGluIHRoZSBwYXJlbnQgYW5kIHRoZSBjaGls ZC4KPj4+Pgo+Pj4+IEFmdGVyIGZvcmsoKSwgYWxsIHNoYXJlZCBwYWdlcyBjYW4gYmUgUi9PIG9y IFIvVyBpbiB0aGUgcGFyZW50LiBGb3IKPj4+PiBzaW1wbGljaXR5LCBJIHRoaW5rIHlvdSBjYW4g c2ltcGx5IHNldCB0aGVtIGFsbCBSL08gaW4gdGhlIGNoaWxkLiBTbyBpZgo+Pj4+IGFueSBQVEUg aXMgd3JpdGFibGUsIHdycHJvdGVjdCBhbGwgaW4gdGhlIGNoaWxkLgo+Pj4KPj4+IE9yIGJldHRl cjogaWYgYW55IGlzIFIvTywgc2V0IHRoZW0gYWxsIFIvTy4gT3RoZXJ3aXNlIGp1c3QgbGVhdmUg dGhlbSBhcyBpcy4KPj4KPj4gSSd2ZSBqdXN0IGNvbWUgYmFjayB0byB0aGlzIHRvIGNvZGUgaXQg dXAsIGFuZCB3YW50IHRvIGNsYXJpZnkgdGhpcyBsYXN0Cj4+IGNvbW1lbnQ7IEknbSBhbHJlYWR5 IGdvaW5nIHRvIGhhdmUgdG8gY29sbGVjdCBhbnlfd3JpdGFibGUgZm9yIHRoZSBhbm9uIGNhc2Us IHNvCj4+IEkgd2lsbCBhbHJlYWR5IGhhdmUgdGhhdCBpbmZvIGZvciB0aGUgc2hhcmVkIGNhc2Ug dG9vLiBJIHRoaW5rIHlvdSBhcmUKPj4gc3VnZ2VzdGluZyBJICphZGRpdGlvbmFsbHkqIGNvbGxl Y3QgYW55X3JlYWRvbmx5LCB0aGVuIGluIHRoZSBzaGFyZWQgY2FzZSwgSQo+PiBvbmx5IGFwcGx5 IHdycHJvdGVjdCBpZiAoYW55X3dyaXRhYmxlICYmIGFueV9yZWFkb25seSkuIGkuZS4gb25seSBh cHBseQo+PiB3cnByb3RlY3QgaWYgdGhlcmUgaXMgYSBtaXggb2YgcGVybWlzc2lvbnMgZm9yIHRo ZSBiYXRjaCwgb3RoZXJ3aXNlIGFsbCB0aGUKPj4gcGVybWlzc2lvbnMgYXJlIHRoZSBzYW1lIChl aXRoZXIgYWxsIFJXIG9yIGFsbCBSTykgYW5kIEkgY2FuIGVsaWRlIHRoZSB3cnByb3RldC4KPj4g SXMgdGhhdCB3aGF0IHlvdSBtZWFudD8KPiAKPiBZZXMuIEkgc3VzcGVjdCB5b3UgbWlnaHQgc29t ZWhvdyBiZSBhYmxlIHRvIGRlcml2ZSAiYW55X3JlYWRvbmx5ID0gbnIgLQo+ICFhbnlfd3JpdGFi bGUiLgoKWWVwLCBuaWNlLgoKPiAKPiBXaXRoaW4gYSBWTUEsIHdlIHJlYWxseSBzaG91bGQgb25s eSBzZWU6Cj4gKiB3cml0YWJsZSBWTUE6IHNvbWUgbWlnaHQgYmUgUi9PLCBzb21lIG1pZ2h0IGJl IFIvVwo+ICogVk1BIGFwcGxpY2FibGUgdG8gTlVNQSBoaW50aW5nOiBzb21lIG1pZ2h0IGJlIFBS T1RfTk9ORSwgb3RoZXJzIFIvTyBvcgo+IMKgIFIvVwo+IAo+IE9uZSBjb3VsZCBzaW1wbHkgc2tp cCBiYXRjaGluZyBmb3Igbm93IG9uIHB0ZV9wcm90bm9uZSgpIGFuZCBmb2N1cyBvbiB0aGUKPiAi d3JpdGFibGUiIHZzLiAibm90LXdyaXRhYmxlIi4KCkknbSBub3Qgc3VyZSB3ZSBjYW4gc2ltcGx5 ICJza2lwIiBiYXRjaGluZyBvbiBwdGVfcHJvdG5vbmUoKSBzaW5jZSB3ZSB3aWxsIG5lZWQKdG8g dGVybWluYXRlIHRoZSBiYXRjaCBpZiB3ZSBzcG90IGl0LiBCdXQgaWYgd2UgaGF2ZSB0byBsb29r IGZvciBpdCBhbnl3YXksIHdlCm1pZ2h0IGFzIHdlbGwganVzdCB0ZXJtaW5hdGUgdGhlIGJhdGNo IHdoZW4gdGhlIHZhbHVlIG9mIHB0ZV9wcm90bm9uZSgpCipjaGFuZ2VzKi4gSSdtIGFsc28gcHJv cG9zaW5nIHRvIHRha2UgdGhpcyBhcHByb2FjaCBmb3IgcHRlX3VmZmRfd3AoKSB3aGljaCBhbHNv Cm5lZWRzIHRvIGJlIGNhcmVmdWxseSBwcmVzZXJ2ZWQgcGVyLXB0ZS4KCgo+IAoKCl9fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCmxpbnV4LWFybS1rZXJuZWwg bWFpbGluZyBsaXN0CmxpbnV4LWFybS1rZXJuZWxAbGlzdHMuaW5mcmFkZWFkLm9yZwpodHRwOi8v bGlzdHMuaW5mcmFkZWFkLm9yZy9tYWlsbWFuL2xpc3RpbmZvL2xpbnV4LWFybS1rZXJuZWwK