Received: by 2002:a05:6a10:2726:0:0:0:0 with SMTP id ib38csp939460pxb; Wed, 6 Apr 2022 04:53:20 -0700 (PDT) X-Google-Smtp-Source: ABdhPJwxNN1zW9wpQhSPOt1CAL/WZKui6EWikQitFJRiOJLFrhh/Nfij1MxAUESrbYSNrLSs9m5f X-Received: by 2002:aa7:8893:0:b0:4fb:10e1:8976 with SMTP id z19-20020aa78893000000b004fb10e18976mr8480474pfe.36.1649246000307; Wed, 06 Apr 2022 04:53:20 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1649246000; cv=none; d=google.com; s=arc-20160816; b=Fc+jeOhgfsJN6ClC1z9aZTvl78FsfQTZo2l9zyjjf17qrF5w5umrE5AL6cPTpN7d/u kq7k9c1tDh5zy4P8DzHSoo4X9CrqwCu15DTEHwWTPXk7C8cchJK9D5s8YyQuEZCQ+Znc i+cFTIxodLZTgiLNWzooUSVrjfFtl0vpty5nB4mF31Ri75BiVBbfutbSXIGDTZMBJ7oe ohzOrNB0SXlaFB6GubMG49ljLc3d0S8cjgZ1ODGiF1awmyjZ2cac5GzD2kKZCsZu/cap ddbJTpY7kzNySZ3rGrXeO/G7zJ4tZnfbAapd8ku0wgzXFSHbps7qnJnKFvEJyOIHJz4X beyA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:mime-version:user-agent :content-transfer-encoding:references:in-reply-to:date:cc:to:from :subject:message-id:dkim-signature; bh=BOlBgqdK6beLpY7du1n6RwZ3ENU8W/8ZVqVAnbguLJM=; b=ImqEybIMWMSIJLaXHnKiwiETZ3Gdjex59kTNtBq9l9xX9bcrBUsv9ND2ejkQqyao+c S3ADYm6f378RdfFB/FFIcRZz1ISK9z4rXcQJYFY81E3e6KVLPPuEdxJNPhBTfhD+x8EB u/ygMyLPrxZQt9eJ/Y1HFXt1SaPnJAM3jSq77FNzsscsADmiI8f1FWM0GSCbN2jK30Wr Z8ivI5C6Sj6SjaGqq1th9VA052+3nB0O88NGG5Mik9fz1nIuW0ou42bG1KXKHkVXcdj9 B46FCq3xqJKnsX200D369X+++g7uK2/W4EmJJ2zSC9WXXyfPFfv5KuXtfTacMgCg3Swq Vmng== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=k20201202 header.b=WmegNqna; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Return-Path: Received: from lindbergh.monkeyblade.net (lindbergh.monkeyblade.net. [2620:137:e000::1:18]) by mx.google.com with ESMTPS id mi8-20020a17090b4b4800b001c9c607ee7asi5074612pjb.112.2022.04.06.04.53.19 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 06 Apr 2022 04:53:20 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:18 as permitted sender) client-ip=2620:137:e000::1:18; Authentication-Results: mx.google.com; dkim=pass header.i=@kernel.org header.s=k20201202 header.b=WmegNqna; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Received: from out1.vger.email (out1.vger.email [IPv6:2620:137:e000::1:20]) by lindbergh.monkeyblade.net (Postfix) with ESMTP id 3597B63FF78; Wed, 6 Apr 2022 03:13:56 -0700 (PDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1382985AbiDEU3i (ORCPT + 99 others); Tue, 5 Apr 2022 16:29:38 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:35868 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1446593AbiDEPow (ORCPT ); Tue, 5 Apr 2022 11:44:52 -0400 Received: from dfw.source.kernel.org (dfw.source.kernel.org [IPv6:2604:1380:4641:c500::1]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 798D4237D1; Tue, 5 Apr 2022 07:17:56 -0700 (PDT) Received: from smtp.kernel.org (relay.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by dfw.source.kernel.org (Postfix) with ESMTPS id E2ADA60AF5; Tue, 5 Apr 2022 14:17:55 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id C8622C385A0; Tue, 5 Apr 2022 14:17:54 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1649168275; bh=BOlBgqdK6beLpY7du1n6RwZ3ENU8W/8ZVqVAnbguLJM=; h=Subject:From:To:Cc:Date:In-Reply-To:References:From; b=WmegNqnaBqfEAOsTSMNUTajo9hgTUNidDAOTXWcXDxZmR75qiQyjxJ9PvSXJJZBrW PZ3G/YReag27GcIPGnGM6NT2+XaTXNta+tjuWtZAZrsiV6sLon8lTkh2aUxX0LWpss 3znZLMuVB+23b1LViql9rwAjJqZr2oh1dNWtXTxZUU5EDwxyBi3dQrWg4RwYocCqlo hboz3iCb9OAuSr0QyF4Cr2xhIWpJzznUE8BvUhoauOyH0alSmU6CMECKdJkqr3uzkn 6nawTD3Nb2kOadq0KVLYGGA4B2aeiSRuLTUK9GY+5GDNBxvexvXi8hcBTJ3rhLOwQX 76+2pIvqESKFA== Message-ID: <10303ca73ea02a300636580e87446766374f66cb.camel@kernel.org> Subject: Re: [PATCH V3 14/30] x86/sgx: Support restricting of enclave page permissions From: Jarkko Sakkinen To: Reinette Chatre , dave.hansen@linux.intel.com, tglx@linutronix.de, bp@alien8.de, luto@kernel.org, mingo@redhat.com, linux-sgx@vger.kernel.org, x86@kernel.org Cc: seanjc@google.com, kai.huang@intel.com, cathy.zhang@intel.com, cedric.xing@intel.com, haitao.huang@intel.com, mark.shanahan@intel.com, hpa@zytor.com, linux-kernel@vger.kernel.org, nathaniel@profian.com Date: Tue, 05 Apr 2022 17:19:05 +0300 In-Reply-To: <91a02d50b2cba34dfb058fd864ba20ef1e6a5554.camel@kernel.org> References: <8ed9ee98ca26c9eefde0fd49062bca6e7b9efe80.1648847675.git.reinette.chatre@intel.com> <26ab773de8842d03b40caf8645ca86884b195901.camel@kernel.org> <91a02d50b2cba34dfb058fd864ba20ef1e6a5554.camel@kernel.org> Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: base64 User-Agent: Evolution 3.42.4 MIME-Version: 1.0 X-Spam-Status: No, score=-2.3 required=5.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,MAILING_LIST_MULTI, RDNS_NONE,SPF_HELO_NONE,T_SCC_BODY_TEXT_LINE autolearn=unavailable autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org T24gVHVlLCAyMDIyLTA0LTA1IGF0IDE2OjQwICswMzAwLCBKYXJra28gU2Fra2luZW4gd3JvdGU6 Cj4gT24gVHVlLCAyMDIyLTA0LTA1IGF0IDA4OjA3ICswMzAwLCBKYXJra28gU2Fra2luZW4gd3Jv dGU6Cj4gPiBPbiBUdWUsIDIwMjItMDQtMDUgYXQgMDg6MDMgKzAzMDAsIEphcmtrbyBTYWtraW5l biB3cm90ZToKPiA+ID4gT24gTW9uLCAyMDIyLTA0LTA0IGF0IDA5OjQ5IC0wNzAwLCBSZWluZXR0 ZSBDaGF0cmUgd3JvdGU6Cj4gPiA+ID4gSW4gdGhlIGluaXRpYWwgKFNHWDEpIHZlcnNpb24gb2Yg U0dYLCBwYWdlcyBpbiBhbiBlbmNsYXZlIG5lZWQgdG8gYmUKPiA+ID4gPiBjcmVhdGVkIHdpdGgg cGVybWlzc2lvbnMgdGhhdCBzdXBwb3J0IGFsbCB1c2FnZXMgb2YgdGhlIHBhZ2VzLCBmcm9tIHRo ZQo+ID4gPiA+IHRpbWUgdGhlIGVuY2xhdmUgaXMgaW5pdGlhbGl6ZWQgdW50aWwgaXQgaXMgdW5s b2FkZWQuIEZvciBleGFtcGxlLAo+ID4gPiA+IHBhZ2VzIHVzZWQgYnkgYSBKSVQgY29tcGlsZXIg b3Igd2hlbiBjb2RlIG5lZWRzIHRvIG90aGVyd2lzZSBiZQo+ID4gPiA+IHJlbG9jYXRlZCBuZWVk IHRvIGFsd2F5cyBoYXZlIFJXWCBwZXJtaXNzaW9ucy4KPiA+ID4gPiAKPiA+ID4gPiBTR1gyIGlu Y2x1ZGVzIGEgbmV3IGZ1bmN0aW9uIEVOQ0xTW0VNT0RQUl0gdGhhdCBpcyBydW4gZnJvbSB0aGUg a2VybmVsCj4gPiA+ID4gYW5kIGNhbiBiZSB1c2VkIHRvIHJlc3RyaWN0IHRoZSBFUENNIHBlcm1p c3Npb25zIG9mIHJlZ3VsYXIgZW5jbGF2ZQo+ID4gPiA+IHBhZ2VzIHdpdGhpbiBhbiBpbml0aWFs aXplZCBlbmNsYXZlLgo+ID4gPiA+IAo+ID4gPiA+IEludHJvZHVjZSBpb2N0bCgpIFNHWF9JT0Nf RU5DTEFWRV9SRVNUUklDVF9QRVJNSVNTSU9OUyB0byBzdXBwb3J0Cj4gPiA+ID4gcmVzdHJpY3Rp bmcgRVBDTSBwZXJtaXNzaW9ucy4gV2l0aCB0aGlzIGlvY3RsKCkgdGhlIHVzZXIgc3BlY2lmaWVz Cj4gPiA+ID4gYSBwYWdlIHJhbmdlIGFuZCB0aGUgRVBDTSBwZXJtaXNzaW9ucyB0byBiZSBhcHBs aWVkIHRvIGFsbCBwYWdlcyBpbgo+ID4gPiA+IHRoZSBwcm92aWRlZCByYW5nZS4gRU5DTFNbRU1P RFBSXSBpcyBydW4gdG8gcmVzdHJpY3QgdGhlIEVQQ00KPiA+ID4gPiBwZXJtaXNzaW9ucyBmb2xs b3dlZCBieSB0aGUgRU5DTFNbRVRSQUNLXSBmbG93IHRoYXQgd2lsbCBlbnN1cmUKPiA+ID4gPiBu byBjYWNoZWQgbGluZWFyLXRvLXBoeXNpY2FsIGFkZHJlc3MgbWFwcGluZ3MgdG8gdGhlIGNoYW5n ZWQKPiA+ID4gPiBwYWdlcyByZW1haW4uCj4gPiA+ID4gCj4gPiA+ID4gSXQgaXMgcG9zc2libGUg Zm9yIHRoZSBwZXJtaXNzaW9uIGNoYW5nZSByZXF1ZXN0IHRvIGZhaWwgb24gYW55Cj4gPiA+ID4g cGFnZSB3aXRoaW4gdGhlIHByb3ZpZGVkIHJhbmdlLCBlaXRoZXIgd2l0aCBhbiBlcnJvciBlbmNv dW50ZXJlZAo+ID4gPiA+IGJ5IHRoZSBrZXJuZWwgb3IgYnkgdGhlIFNHWCBoYXJkd2FyZSB3aGls ZSBydW5uaW5nCj4gPiA+ID4gRU5DTFNbRU1PRFBSXS4gVG8gc3VwcG9ydCBwYXJ0aWFsIHN1Y2Nl c3MgdGhlIGlvY3RsKCkgcmV0dXJucyBhbgo+ID4gPiA+IGVycm9yIGNvZGUgYmFzZWQgb24gZmFp bHVyZXMgZW5jb3VudGVyZWQgYnkgdGhlIGtlcm5lbCBhcyB3ZWxsCj4gPiA+ID4gYXMgdHdvIHJl c3VsdCBvdXRwdXQgcGFyYW1ldGVyczogb25lIGZvciB0aGUgbnVtYmVyIG9mIHBhZ2VzCj4gPiA+ ID4gdGhhdCB3ZXJlIHN1Y2Nlc3NmdWxseSBjaGFuZ2VkIGFuZCBvbmUgZm9yIHRoZSBTR1ggcmV0 dXJuIGNvZGUuCj4gPiA+ID4gCj4gPiA+ID4gVGhlIHBhZ2UgdGFibGUgZW50cnkgcGVybWlzc2lv bnMgYXJlIG5vdCBpbXBhY3RlZCBieSB0aGUgRVBDTQo+ID4gPiA+IHBlcm1pc3Npb24gY2hhbmdl cy4gVk1BcyBhbmQgUFRFcyB3aWxsIGNvbnRpbnVlIHRvIGFsbG93IHRoZQo+ID4gPiA+IG1heGlt dW0gdmV0dGVkIHBlcm1pc3Npb25zIGRldGVybWluZWQgYXQgdGhlIHRpbWUgdGhlIHBhZ2VzCj4g PiA+ID4gYXJlIGFkZGVkIHRvIHRoZSBlbmNsYXZlLiBUaGUgU0dYIGVycm9yIGNvZGUgaW4gYSBw YWdlIGZhdWx0Cj4gPiA+ID4gd2lsbCBpbmRpY2F0ZSBpZiBpdCB3YXMgYW4gRVBDTSBwZXJtaXNz aW9uIGNoZWNrIHRoYXQgcHJldmVudGVkCj4gPiA+ID4gYW4gYWNjZXNzIGF0dGVtcHQuCj4gPiA+ ID4gCj4gPiA+ID4gTm8gY2hlY2tpbmcgaXMgZG9uZSB0byBlbnN1cmUgdGhhdCB0aGUgcGVybWlz c2lvbnMgYXJlIGFjdHVhbGx5Cj4gPiA+ID4gYmVpbmcgcmVzdHJpY3RlZC4gVGhpcyBpcyBiZWNh dXNlIHRoZSBlbmNsYXZlIG1heSBoYXZlIHJlbGF4ZWQKPiA+ID4gPiB0aGUgRVBDTSBwZXJtaXNz aW9ucyBmcm9tIHdpdGhpbiB0aGUgZW5jbGF2ZSB3aXRob3V0IGxldHRpbmcgdGhlCj4gPiA+ID4g a2VybmVsIGtub3cuIEFuIGF0dGVtcHQgdG8gcmVsYXggcGVybWlzc2lvbnMgdXNpbmcgdGhpcyBj YWxsIHdpbGwKPiA+ID4gPiBiZSBpZ25vcmVkIGJ5IHRoZSBoYXJkd2FyZS4KPiA+ID4gPiAKPiA+ ID4gPiBTaWduZWQtb2ZmLWJ5OiBSZWluZXR0ZSBDaGF0cmUgPHJlaW5ldHRlLmNoYXRyZUBpbnRl bC5jb20+Cj4gPiA+ID4gLS0tCj4gPiA+ID4gQ2hhbmdlcyBzaW5jZSBWMjoKPiA+ID4gPiAtIElu Y2x1ZGUgdGhlIHNneF9pb2Nfc2d4Ml9yZWFkeSgpIHV0aWxpdHkKPiA+ID4gPiDCoCB0aGF0IHBy ZXZpb3VzbHkgd2FzIGluICJ4ODYvc2d4OiBTdXBwb3J0IHJlbGF4aW5nIG9mIGVuY2xhdmUgcGFn ZQo+ID4gPiA+IMKgIHBlcm1pc3Npb25zIiB0aGF0IGlzIHJlbW92ZWQgZnJvbSB0aGUgbmV4dCB2 ZXJzaW9uLgo+ID4gPiA+IC0gRmV3IHJlbmFtZXMgcmVxdWVzdGVkIGJ5IEphcmtrbzoKPiA+ID4g PiDCoCBzdHJ1Y3Qgc2d4X2VuY2xhdmVfcmVzdHJpY3RfcGVybSAtPgo+ID4gPiA+IMKgwqDCoMKg wqDCoMKgwqAgc3RydWN0IHNneF9lbmNsYXZlX3Jlc3RyaWN0X3Blcm1pc3Npb25zCj4gPiA+ID4g wqAgc2d4X2VuY2xhdmVfcmVzdHJpY3RfcGVybSgpwqDCoMKgwqAgLT4KPiA+ID4gPiDCoMKgwqDC oMKgwqDCoMKgIHNneF9lbmNsYXZlX3Jlc3RyaWN0X3Blcm1pc3Npb25zKCkKPiA+ID4gPiDCoCBz Z3hfaW9jX2VuY2xhdmVfcmVzdHJpY3RfcGVybSgpIC0+Cj4gPiA+ID4gwqDCoMKgwqDCoMKgwqDC oCBzZ3hfaW9jX2VuY2xhdmVfcmVzdHJpY3RfcGVybWlzc2lvbnMoKQo+ID4gPiA+IC0gTWFrZSBF UENNIHBlcm1pc3Npb25zIGluZGVwZW5kZW50IGZyb20ga2VybmVsIHZpZXcgb2YKPiA+ID4gPiDC oCBwZXJtaXNzaW9ucy7CoCAoSmFya2tvKQo+ID4gPiA+IMKgIC0gUmVtb3ZlIGF0dGVtcHQgYXQg cnVudGltZSB0cmFja2luZyBvZiBFUENNIHBlcm1pc3Npb25zCj4gPiA+ID4gwqDCoMKgIChzZ3hf ZW5jbF9wYWdlLT52bV9ydW5fcHJvdF9iaXRzKS4KPiA+ID4gPiDCoCAtIERvIG5vdCBmbHVzaCBw YWdlIHRhYmxlIGVudHJpZXMgLSB0aGV5IGFyZSBubyBsb25nZXIgaW1wYWN0ZWQgYnkKPiA+ID4g PiDCoMKgwqAgRVBDTSBwZXJtaXNzaW9uIGNoYW5nZXMuCj4gPiA+ID4gwqAgLSBNb2RpZnkgY2hh bmdlbG9nIHRvIHJlZmxlY3QgbmV3IGFyY2hpdGVjdHVyZS4KPiA+ID4gPiAtIEVuc3VyZSBhdCBs ZWFzdCBQUk9UX1JFQUQgaXMgcmVxdWVzdGVkIC0gZW5jbGF2ZSByZXF1aXJlcyByZWFkCj4gPiA+ ID4gwqAgYWNjZXNzIHRvIHRoZSBwYWdlIGZvciBjb21tYW5kcyBsaWtlIEVNT0RQRSBhbmQgRUFD Q0VQVC4gKEphcmtrbykKPiA+ID4gPiAKPiA+ID4gPiBDaGFuZ2VzIHNpbmNlIFYxOgo+ID4gPiA+ IC0gQ2hhbmdlIHRlcm1pbm9sb2d5IHRvIHVzZSAicmVsYXgiIGluc3RlYWQgb2YgImV4dGVuZCIg dG8gcmVmZXIgdG8KPiA+ID4gPiDCoCB0aGUgY2FzZSB3aGVuIGVuY2xhdmUgcGFnZSBwZXJtaXNz aW9ucyBhcmUgYWRkZWQgKERhdmUpLgo+ID4gPiA+IC0gVXNlIGlvY3RsKCkgaW4gY29tbWl0IG1l c3NhZ2UgKERhdmUpLgo+ID4gPiA+IC0gQWRkIGV4YW1wbGVzIG9uIHdoYXQgcGVybWlzc2lvbnMg d291bGQgYmUgYWxsb3dlZCAoRGF2ZSkuCj4gPiA+ID4gLSBTcGxpdCBlbmNsYXZlIHBhZ2UgcGVy bWlzc2lvbiBjaGFuZ2VzIGludG8gdHdvIGlvY3RsKClzLCBvbmUgZm9yCj4gPiA+ID4gwqAgcGVy bWlzc2lvbiByZXN0cmljdGluZyAoU0dYX0lPQ19FTkNMQVZFX1JFU1RSSUNUX1BFUk1JU1NJT05T KQo+ID4gPiA+IMKgIGFuZCBvbmUgZm9yIHBlcm1pc3Npb24gcmVsYXhpbmcgKFNHWF9JT0NfRU5D TEFWRV9SRUxBWF9QRVJNSVNTSU9OUykKPiA+ID4gPiDCoCAoSmFya2tvKS4KPiA+ID4gPiAtIElu IHN1cHBvcnQgb2YgdGhlIGlvY3RsKCkgbmFtZSBjaGFuZ2UgdGhlIGZvbGxvd2luZyBuYW1lcyBo YXZlIGJlZW4KPiA+ID4gPiDCoCBjaGFuZ2VkOgo+ID4gPiA+IMKgIHN0cnVjdCBzZ3hfcGFnZV9t b2RwIC0+IHN0cnVjdCBzZ3hfZW5jbGF2ZV9yZXN0cmljdF9wZXJtCj4gPiA+ID4gwqAgc2d4X2lv Y19wYWdlX21vZHAoKSAtPiBzZ3hfaW9jX2VuY2xhdmVfcmVzdHJpY3RfcGVybSgpCj4gPiA+ID4g wqAgc2d4X3BhZ2VfbW9kcCgpIC0+IHNneF9lbmNsYXZlX3Jlc3RyaWN0X3Blcm0oKQo+ID4gPiA+ IC0gaW9jdGwoKSB0YWtlcyBlbnRpcmUgc2VjaW5mbyBhcyBpbnB1dCBpbnN0ZWFkIG9mCj4gPiA+ ID4gwqAgcGFnZSBwZXJtaXNzaW9ucyBvbmx5IChKYXJra28pLgo+ID4gPiA+IC0gRml4IGtlcm5l bC1kb2MgdG8gaW5jbHVkZSAoKSBpbiBmdW5jdGlvbiBuYW1lLgo+ID4gPiA+IC0gQ3JlYXRlIGFu ZCB1c2UgdXRpbGl0eSBmb3IgdGhlIEVUUkFDSyBmbG93Lgo+ID4gPiA+IC0gRml4dXBzIGluIGNv bW1lbnRzCj4gPiA+ID4gLSBNb3ZlIGtlcm5lbC1kb2MgdG8gZnVuY3Rpb24gdGhhdCBwcm92aWRl cyBkb2N1bWVudGF0aW9uIGZvcgo+ID4gPiA+IMKgIERvY3VtZW50YXRpb24veDg2L3NneC5yc3Qu Cj4gPiA+ID4gLSBSZW1vdmUgcmVkdW5kYW50IGNvbW1lbnQuCj4gPiA+ID4gLSBNYWtlIGV4cGxp Y2l0IHdoaWNoIG1lbWJlcnMgb2Ygc3RydWN0IHNneF9lbmNsYXZlX3Jlc3RyaWN0X3Blcm0KPiA+ ID4gPiDCoCBhcmUgZm9yIG91dHB1dCAoRGF2ZSkuCj4gPiA+ID4gCj4gPiA+ID4gwqBhcmNoL3g4 Ni9pbmNsdWRlL3VhcGkvYXNtL3NneC5oIHzCoCAyMSArKysKPiA+ID4gPiDCoGFyY2gveDg2L2tl cm5lbC9jcHUvc2d4L2lvY3RsLmMgfCAyNDIgKysrKysrKysrKysrKysrKysrKysrKysrKysrKysr KysKPiA+ID4gPiDCoDIgZmlsZXMgY2hhbmdlZCwgMjYzIGluc2VydGlvbnMoKykKPiA+ID4gPiAK PiA+ID4gPiBkaWZmIC0tZ2l0IGEvYXJjaC94ODYvaW5jbHVkZS91YXBpL2FzbS9zZ3guaCBiL2Fy Y2gveDg2L2luY2x1ZGUvdWFwaS9hc20vc2d4LmgKPiA+ID4gPiBpbmRleCBmNGI4MTU4N2U5MGIu LmEwYTI0ZTk0ZmIyNyAxMDA2NDQKPiA+ID4gPiAtLS0gYS9hcmNoL3g4Ni9pbmNsdWRlL3VhcGkv YXNtL3NneC5oCj4gPiA+ID4gKysrIGIvYXJjaC94ODYvaW5jbHVkZS91YXBpL2FzbS9zZ3guaAo+ ID4gPiA+IEBAIC0yOSw2ICsyOSw4IEBAIGVudW0gc2d4X3BhZ2VfZmxhZ3Mgewo+ID4gPiA+IMKg wqDCoMKgwqDCoMKgwqBfSU9XKFNHWF9NQUdJQywgMHgwMywgc3RydWN0IHNneF9lbmNsYXZlX3By b3Zpc2lvbikKPiA+ID4gPiDCoCNkZWZpbmUgU0dYX0lPQ19WRVBDX1JFTU9WRV9BTEwgXAo+ID4g PiA+IMKgwqDCoMKgwqDCoMKgwqBfSU8oU0dYX01BR0lDLCAweDA0KQo+ID4gPiA+ICsjZGVmaW5l IFNHWF9JT0NfRU5DTEFWRV9SRVNUUklDVF9QRVJNSVNTSU9OUyBcCj4gPiA+ID4gK8KgwqDCoMKg wqDCoMKgX0lPV1IoU0dYX01BR0lDLCAweDA1LCBzdHJ1Y3Qgc2d4X2VuY2xhdmVfcmVzdHJpY3Rf cGVybWlzc2lvbnMpCj4gPiA+ID4gwqAKPiA+ID4gPiDCoC8qKgo+ID4gPiA+IMKgICogc3RydWN0 IHNneF9lbmNsYXZlX2NyZWF0ZSAtIHBhcmFtZXRlciBzdHJ1Y3R1cmUgZm9yIHRoZQo+ID4gPiA+ IEBAIC03Niw2ICs3OCwyNSBAQCBzdHJ1Y3Qgc2d4X2VuY2xhdmVfcHJvdmlzaW9uIHsKPiA+ID4g PiDCoMKgwqDCoMKgwqDCoMKgX191NjQgZmQ7Cj4gPiA+ID4gwqB9Owo+ID4gPiA+IMKgCj4gPiA+ ID4gKy8qKgo+ID4gPiA+ICsgKiBzdHJ1Y3Qgc2d4X2VuY2xhdmVfcmVzdHJpY3RfcGVybWlzc2lv bnMgLSBwYXJhbWV0ZXJzIGZvciBpb2N0bAo+ID4gPiA+ICsgKsKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oCAlU0dYX0lPQ19FTkNMQVZFX1JFU1RSSUNUX1BFUk1JU1NJT05TCj4gPiA+ID4gKyAqIEBvZmZz ZXQ6wqDCoMKgwqBzdGFydGluZyBwYWdlIG9mZnNldCAocGFnZSBhbGlnbmVkIHJlbGF0aXZlIHRv IGVuY2xhdmUgYmFzZQo+ID4gPiA+ICsgKsKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgYWRkcmVz cyBkZWZpbmVkIGluIFNFQ1MpCj4gPiA+ID4gKyAqIEBsZW5ndGg6wqDCoMKgwqBsZW5ndGggb2Yg bWVtb3J5IChtdWx0aXBsZSBvZiB0aGUgcGFnZSBzaXplKQo+ID4gPiA+ICsgKiBAc2VjaW5mbzrC oMKgwqBhZGRyZXNzIGZvciB0aGUgU0VDSU5GTyBkYXRhIGNvbnRhaW5pbmcgdGhlIG5ldyBwZXJt aXNzaW9uIGJpdHMKPiA+ID4gPiArICrCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGZvciBwYWdl cyBpbiByYW5nZSBkZXNjcmliZWQgYnkgQG9mZnNldCBhbmQgQGxlbmd0aAo+ID4gPiA+ICsgKiBA cmVzdWx0OsKgwqDCoMKgKG91dHB1dCkgU0dYIHJlc3VsdCBjb2RlIG9mIEVOQ0xTW0VNT0RQUl0g ZnVuY3Rpb24KPiA+ID4gPiArICogQGNvdW50OsKgwqDCoMKgwqAob3V0cHV0KSBieXRlcyBzdWNj ZXNzZnVsbHkgY2hhbmdlZCAobXVsdGlwbGUgb2YgcGFnZSBzaXplKQo+ID4gPiA+ICsgKi8KPiA+ ID4gPiArc3RydWN0IHNneF9lbmNsYXZlX3Jlc3RyaWN0X3Blcm1pc3Npb25zIHsKPiA+ID4gPiAr wqDCoMKgwqDCoMKgwqBfX3U2NCBvZmZzZXQ7Cj4gPiA+ID4gK8KgwqDCoMKgwqDCoMKgX191NjQg bGVuZ3RoOwo+ID4gPiA+ICvCoMKgwqDCoMKgwqDCoF9fdTY0IHNlY2luZm87Cj4gPiA+ID4gK8Kg wqDCoMKgwqDCoMKgX191NjQgcmVzdWx0Owo+ID4gPiA+ICvCoMKgwqDCoMKgwqDCoF9fdTY0IGNv dW50Owo+ID4gPiA+ICt9Owo+ID4gPiA+ICsKPiA+ID4gPiDCoHN0cnVjdCBzZ3hfZW5jbGF2ZV9y dW47Cj4gPiA+ID4gwqAKPiA+ID4gPiDCoC8qKgo+ID4gPiA+IGRpZmYgLS1naXQgYS9hcmNoL3g4 Ni9rZXJuZWwvY3B1L3NneC9pb2N0bC5jIGIvYXJjaC94ODYva2VybmVsL2NwdS9zZ3gvaW9jdGwu Ywo+ID4gPiA+IGluZGV4IDA0NjBmZDIyNGEwNS4uNGQ4OGJmZDE2M2U3IDEwMDY0NAo+ID4gPiA+ IC0tLSBhL2FyY2gveDg2L2tlcm5lbC9jcHUvc2d4L2lvY3RsLmMKPiA+ID4gPiArKysgYi9hcmNo L3g4Ni9rZXJuZWwvY3B1L3NneC9pb2N0bC5jCj4gPiA+ID4gQEAgLTY2MCw2ICs2NjAsMjQ0IEBA IHN0YXRpYyBsb25nIHNneF9pb2NfZW5jbGF2ZV9wcm92aXNpb24oc3RydWN0IHNneF9lbmNsICpl bmNsLCB2b2lkIF9fdXNlciAqYXJnKQo+ID4gPiA+IMKgwqDCoMKgwqDCoMKgwqByZXR1cm4gc2d4 X3NldF9hdHRyaWJ1dGUoJmVuY2wtPmF0dHJpYnV0ZXNfbWFzaywgcGFyYW1zLmZkKTsKPiA+ID4g PiDCoH0KPiA+ID4gPiDCoAo+ID4gPiA+ICsvKgo+ID4gPiA+ICsgKiBFbnN1cmUgZW5jbGF2ZSBp cyByZWFkeSBmb3IgU0dYMiBmdW5jdGlvbnMuIFJlYWRpbmVzcyBpcyBjaGVja2VkCj4gPiA+ID4g KyAqIGJ5IGVuc3VyaW5nIHRoZSBoYXJkd2FyZSBzdXBwb3J0cyBTR1gyIGFuZCB0aGUgZW5jbGF2 ZSBpcyBpbml0aWFsaXplZAo+ID4gPiA+ICsgKiBhbmQgdGh1cyBhYmxlIHRvIGhhbmRsZSByZXF1 ZXN0cyB0byBtb2RpZnkgcGFnZXMgd2l0aGluIGl0Lgo+ID4gPiA+ICsgKi8KPiA+ID4gPiArc3Rh dGljIGludCBzZ3hfaW9jX3NneDJfcmVhZHkoc3RydWN0IHNneF9lbmNsICplbmNsKQo+ID4gPiA+ ICt7Cj4gPiA+ID4gK8KgwqDCoMKgwqDCoMKgaWYgKCEoY3B1X2ZlYXR1cmVfZW5hYmxlZChYODZf RkVBVFVSRV9TR1gyKSkpCj4gPiA+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoHJl dHVybiAtRU5PREVWOwo+ID4gPiA+ICsKPiA+ID4gPiArwqDCoMKgwqDCoMKgwqBpZiAoIXRlc3Rf Yml0KFNHWF9FTkNMX0lOSVRJQUxJWkVELCAmZW5jbC0+ZmxhZ3MpKQo+ID4gPiA+ICvCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqByZXR1cm4gLUVJTlZBTDsKPiA+ID4gPiArCj4gPiA+ID4g K8KgwqDCoMKgwqDCoMKgcmV0dXJuIDA7Cj4gPiA+ID4gK30KPiA+ID4gPiArCj4gPiA+ID4gKy8q Cj4gPiA+ID4gKyAqIFJldHVybiB2YWxpZCBwZXJtaXNzaW9uIGZpZWxkcyBmcm9tIGEgc2VjaW5m byBzdHJ1Y3R1cmUgcHJvdmlkZWQgYnkKPiA+ID4gPiArICogdXNlciBzcGFjZS4gVGhlIHNlY2lu Zm8gc3RydWN0dXJlIGlzIHJlcXVpcmVkIHRvIG9ubHkgaGF2ZSBiaXRzIGluCj4gPiA+ID4gKyAq IHRoZSBwZXJtaXNzaW9uIGZpZWxkcyBzZXQuCj4gPiA+ID4gKyAqLwo+ID4gPiA+ICtzdGF0aWMg aW50IHNneF9wZXJtX2Zyb21fdXNlcl9zZWNpbmZvKHZvaWQgX191c2VyICpfc2VjaW5mbywgdTY0 ICpzZWNpbmZvX3Blcm0pCj4gPiA+ID4gK3sKPiA+ID4gPiArwqDCoMKgwqDCoMKgwqBzdHJ1Y3Qg c2d4X3NlY2luZm8gc2VjaW5mbzsKPiA+ID4gPiArwqDCoMKgwqDCoMKgwqB1NjQgcGVybTsKPiA+ ID4gPiArCj4gPiA+ID4gK8KgwqDCoMKgwqDCoMKgaWYgKGNvcHlfZnJvbV91c2VyKCZzZWNpbmZv LCAodm9pZCBfX3VzZXIgKilfc2VjaW5mbywKPiA+ID4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgc2l6ZW9mKHNlY2luZm8pKSkKPiA+ID4gPiAr wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgcmV0dXJuIC1FRkFVTFQ7Cj4gPiA+ID4gKwo+ ID4gPiA+ICvCoMKgwqDCoMKgwqDCoGlmIChzZWNpbmZvLmZsYWdzICYgflNHWF9TRUNJTkZPX1BF Uk1JU1NJT05fTUFTSykKPiA+ID4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgcmV0 dXJuIC1FSU5WQUw7Cj4gPiA+ID4gKwo+ID4gPiA+ICvCoMKgwqDCoMKgwqDCoGlmIChtZW1jaHJf aW52KHNlY2luZm8ucmVzZXJ2ZWQsIDAsIHNpemVvZihzZWNpbmZvLnJlc2VydmVkKSkpCj4gPiA+ ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoHJldHVybiAtRUlOVkFMOwo+ID4gPiA+ ICsKPiA+ID4gPiArwqDCoMKgwqDCoMKgwqBwZXJtID0gc2VjaW5mby5mbGFncyAmIFNHWF9TRUNJ TkZPX1BFUk1JU1NJT05fTUFTSzsKPiA+ID4gPiArCj4gPiA+ID4gK8KgwqDCoMKgwqDCoMKgLyoK PiA+ID4gPiArwqDCoMKgwqDCoMKgwqAgKiBSZWFkIGFjY2VzcyBpcyByZXF1aXJlZCBmb3IgdGhl IGVuY2xhdmUgdG8gYmUgYWJsZSB0byB1c2UgdGhlIHBhZ2UuCj4gPiA+ID4gK8KgwqDCoMKgwqDC oMKgICogU0dYIGluc3RydWN0aW9ucyBsaWtlIEVOQ0xVW0VNT0RQRV0gYW5kIEVOQ0xVW0VBQ0NF UFRdIHJlcXVpcmUKPiA+ID4gPiArwqDCoMKgwqDCoMKgwqAgKiByZWFkIGFjY2Vzcy4KPiA+ID4g PiArwqDCoMKgwqDCoMKgwqAgKi8KPiA+ID4gPiArwqDCoMKgwqDCoMKgwqBpZiAoIShwZXJtICYg U0dYX1NFQ0lORk9fUikpCj4gPiA+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoHJl dHVybiAtRUlOVkFMOwo+ID4gPiA+ICsKPiA+ID4gPiArwqDCoMKgwqDCoMKgwqAqc2VjaW5mb19w ZXJtID0gcGVybTsKPiA+ID4gPiArCj4gPiA+ID4gK8KgwqDCoMKgwqDCoMKgcmV0dXJuIDA7Cj4g PiA+ID4gK30KPiA+ID4gPiArCj4gPiA+ID4gKy8qCj4gPiA+ID4gKyAqIFNvbWUgU0dYIGZ1bmN0 aW9ucyByZXF1aXJlIHRoYXQgbm8gY2FjaGVkIGxpbmVhci10by1waHlzaWNhbCBhZGRyZXNzCj4g PiA+ID4gKyAqIG1hcHBpbmdzIGFyZSBwcmVzZW50IGJlZm9yZSB0aGV5IGNhbiBzdWNjZWVkLiBD b2xsYWJvcmF0ZSB3aXRoCj4gPiA+ID4gKyAqIGhhcmR3YXJlIHZpYSBFTkNMU1tFVFJBQ0tdIHRv IGVuc3VyZSB0aGF0IGFsbCBjYWNoZWQKPiA+ID4gPiArICogbGluZWFyLXRvLXBoeXNpY2FsIGFk ZHJlc3MgbWFwcGluZ3MgYmVsb25naW5nIHRvIGFsbCB0aHJlYWRzIG9mCj4gPiA+ID4gKyAqIHRo ZSBlbmNsYXZlIGFyZSBjbGVhcmVkLiBTZWUgc2d4X2VuY2xfY3B1bWFzaygpIGZvciBkZXRhaWxz Lgo+ID4gPiA+ICsgKi8KPiA+ID4gPiArc3RhdGljIGludCBzZ3hfZW5jbGF2ZV9ldHJhY2soc3Ry dWN0IHNneF9lbmNsICplbmNsKQo+ID4gPiA+ICt7Cj4gPiA+ID4gK8KgwqDCoMKgwqDCoMKgdm9p ZCAqZXBjX3ZpcnQ7Cj4gPiA+ID4gK8KgwqDCoMKgwqDCoMKgaW50IHJldDsKPiA+ID4gPiArCj4g PiA+ID4gK8KgwqDCoMKgwqDCoMKgZXBjX3ZpcnQgPSBzZ3hfZ2V0X2VwY192aXJ0X2FkZHIoZW5j bC0+c2Vjcy5lcGNfcGFnZSk7Cj4gPiA+ID4gK8KgwqDCoMKgwqDCoMKgcmV0ID0gX19ldHJhY2so ZXBjX3ZpcnQpOwo+ID4gPiA+ICvCoMKgwqDCoMKgwqDCoGlmIChyZXQpIHsKPiA+ID4gPiArwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgLyoKPiA+ID4gPiArwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgICogRVRSQUNLIG9ubHkgZmFpbHMgd2hlbiB0aGVyZSBpcyBhbiBPUyBpc3N1 ZS4gRm9yCj4gPiA+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCAqIGV4YW1wbGUs IHR3byBjb25zZWN1dGl2ZSBFVFJBQ0sgd2FzIHNlbnQgd2l0aG91dAo+ID4gPiA+ICvCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgKiBjb21wbGV0ZWQgSVBJIGJldHdlZW4uCj4gPiA+ID4g K8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCAqLwo+ID4gPiA+ICvCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqBwcl9lcnJfb25jZSgiRVRSQUNLIHJldHVybmVkICVkICgweCV4KSIs IHJldCwgcmV0KTsKPiA+ID4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgLyoKPiA+ ID4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgICogU2VuZCBJUElzIHRvIGtpY2sg Q1BVcyBvdXQgb2YgdGhlIGVuY2xhdmUgYW5kCj4gPiA+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoCAqIHRyeSBFVFJBQ0sgYWdhaW4uCj4gPiA+ID4gK8KgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoCAqLwo+ID4gPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBv bl9lYWNoX2NwdV9tYXNrKHNneF9lbmNsX2NwdW1hc2soZW5jbCksIHNneF9pcGlfY2IsIE5VTEws IDEpOwo+ID4gPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqByZXQgPSBfX2V0cmFj ayhlcGNfdmlydCk7Cj4gPiA+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGlmIChy ZXQpIHsKPiA+ID4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoHByX2Vycl9vbmNlKCJFVFJBQ0sgcmVwZWF0IHJldHVybmVkICVkICgweCV4KSIsCj4gPiA+ ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgIHJldCwgcmV0KTsKPiA+ID4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoHJldHVybiAtRUZBVUxUOwo+ID4gPiA+ICvCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqB9Cj4gPiA+ID4gK8KgwqDCoMKgwqDCoMKgfQo+ID4gPiA+ ICvCoMKgwqDCoMKgwqDCoG9uX2VhY2hfY3B1X21hc2soc2d4X2VuY2xfY3B1bWFzayhlbmNsKSwg c2d4X2lwaV9jYiwgTlVMTCwgMSk7Cj4gPiA+ID4gKwo+ID4gPiA+ICvCoMKgwqDCoMKgwqDCoHJl dHVybiAwOwo+ID4gPiA+ICt9Cj4gPiA+ID4gKwo+ID4gPiA+ICsvKioKPiA+ID4gPiArICogc2d4 X2VuY2xhdmVfcmVzdHJpY3RfcGVybWlzc2lvbnMoKSAtIFJlc3RyaWN0IEVQQ00gcGVybWlzc2lv bnMKPiA+ID4gPiArICogQGVuY2w6wqDCoMKgwqDCoMKgRW5jbGF2ZSB0byB3aGljaCB0aGUgcGFn ZXMgYmVsb25nLgo+ID4gPiA+ICsgKiBAbW9kcDrCoMKgwqDCoMKgwqBDaGVja2VkIHBhcmFtZXRl cnMgZnJvbSB1c2VyIG9uIHdoaWNoIHBhZ2VzIG5lZWQgbW9kaWZ5aW5nLgo+ID4gPiA+ICsgKiBA c2VjaW5mb19wZXJtOiBOZXcgKHZhbGlkYXRlZCkgcGVybWlzc2lvbiBiaXRzLgo+ID4gPiA+ICsg Kgo+ID4gPiA+ICsgKiBSZXR1cm46Cj4gPiA+ID4gKyAqIC0gMDrCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoFN1Y2Nlc3MuCj4gPiA+ID4gKyAqIC0gLWVycm5vOsKgwqDCoE90aGVyd2lz ZS4KPiA+ID4gPiArICovCj4gPiA+ID4gK3N0YXRpYyBsb25nCj4gPiA+ID4gK3NneF9lbmNsYXZl X3Jlc3RyaWN0X3Blcm1pc3Npb25zKHN0cnVjdCBzZ3hfZW5jbCAqZW5jbCwKPiA+ID4gPiArwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqAgc3RydWN0IHNneF9lbmNsYXZlX3Jlc3RyaWN0X3Blcm1pc3Npb25zICptb2RwLAo+ID4gPiA+ ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoCB1NjQgc2VjaW5mb19wZXJtKQo+ID4gPiA+ICt7Cj4gPiA+ID4gK8KgwqDCoMKgwqDC oMKgc3RydWN0IHNneF9lbmNsX3BhZ2UgKmVudHJ5Owo+ID4gPiA+ICvCoMKgwqDCoMKgwqDCoHN0 cnVjdCBzZ3hfc2VjaW5mbyBzZWNpbmZvOwo+ID4gPiA+ICvCoMKgwqDCoMKgwqDCoHVuc2lnbmVk IGxvbmcgYWRkcjsKPiA+ID4gPiArwqDCoMKgwqDCoMKgwqB1bnNpZ25lZCBsb25nIGM7Cj4gPiA+ ID4gK8KgwqDCoMKgwqDCoMKgdm9pZCAqZXBjX3ZpcnQ7Cj4gPiA+ID4gK8KgwqDCoMKgwqDCoMKg aW50IHJldDsKPiA+ID4gPiArCj4gPiA+ID4gK8KgwqDCoMKgwqDCoMKgbWVtc2V0KCZzZWNpbmZv LCAwLCBzaXplb2Yoc2VjaW5mbykpOwo+ID4gPiA+ICvCoMKgwqDCoMKgwqDCoHNlY2luZm8uZmxh Z3MgPSBzZWNpbmZvX3Blcm07Cj4gPiA+ID4gKwo+ID4gPiA+ICvCoMKgwqDCoMKgwqDCoGZvciAo YyA9IDAgOyBjIDwgbW9kcC0+bGVuZ3RoOyBjICs9IFBBR0VfU0laRSkgewo+ID4gPiA+ICvCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBhZGRyID0gZW5jbC0+YmFzZSArIG1vZHAtPm9mZnNl dCArIGM7Cj4gPiA+ID4gKwo+ID4gPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBt dXRleF9sb2NrKCZlbmNsLT5sb2NrKTsKPiA+ID4gPiArCj4gPiA+ID4gK8KgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoGVudHJ5ID0gc2d4X2VuY2xfbG9hZF9wYWdlKGVuY2wsIGFkZHIpOwo+ ID4gPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBpZiAoSVNfRVJSKGVudHJ5KSkg ewo+ID4gPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg cmV0ID0gUFRSX0VSUihlbnRyeSkgPT0gLUVCVVNZID8gLUVBR0FJTiA6IC1FRkFVTFQ7Cj4gPiA+ ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBnb3RvIG91 dF91bmxvY2s7Cj4gPiA+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoH0KPiA+ID4g PiArCj4gPiA+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoC8qCj4gPiA+ID4gK8Kg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCAqIENoYW5naW5nIEVQQ00gcGVybWlzc2lvbnMg aXMgb25seSBzdXBwb3J0ZWQgb24gcmVndWxhcgo+ID4gPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqAgKiBTR1ggcGFnZXMuIEF0dGVtcHRpbmcgdGhpcyBjaGFuZ2Ugb24gb3RoZXIg cGFnZXMgd2lsbAo+ID4gPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgKiByZXN1 bHQgaW4gI1BGLgo+ID4gPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgKi8KPiA+ ID4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgaWYgKGVudHJ5LT50eXBlICE9IFNH WF9QQUdFX1RZUEVfUkVHKSB7Cj4gPiA+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqByZXQgPSAtRUlOVkFMOwo+ID4gPiA+ICvCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgZ290byBvdXRfdW5sb2NrOwo+ID4gPiA+ICvC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqB9Cj4gPiA+ID4gKwo+ID4gPiA+ICvCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAvKgo+ID4gPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqAgKiBEbyBub3QgdmVyaWZ5IHRoZSBwZXJtaXNzaW9uIGJpdHMgcmVxdWVzdGVkLiBL ZXJuZWwKPiA+ID4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgICogaGFzIG5vIGNv bnRyb2wgb3ZlciBob3cgRVBDTSBwZXJtaXNzaW9ucyBjYW4gYmUgcmVsYXhlZAo+ID4gPiA+ICvC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgKiBmcm9tIHdpdGhpbiB0aGUgZW5jbGF2ZS4g RU5DTFNbRU1PRFBSXSBjYW4gb25seQo+ID4gPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqAgKiByZW1vdmUgZXhpc3RpbmcgRVBDTSBwZXJtaXNzaW9ucywgYXR0ZW1wdGluZyB0byBz ZXQKPiA+ID4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgICogbmV3IHBlcm1pc3Np b25zIHdpbGwgYmUgaWdub3JlZCBieSB0aGUgaGFyZHdhcmUuCj4gPiA+ID4gK8KgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoCAqLwo+ID4gPiA+ICsKPiA+ID4gPiArwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgLyogQ2hhbmdlIEVQQ00gcGVybWlzc2lvbnMuICovCj4gPiA+ID4gK8Kg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGVwY192aXJ0ID0gc2d4X2dldF9lcGNfdmlydF9h ZGRyKGVudHJ5LT5lcGNfcGFnZSk7Cj4gPiA+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoHJldCA9IF9fZW1vZHByKCZzZWNpbmZvLCBlcGNfdmlydCk7Cj4gPiA+ID4gK8KgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoGlmIChlbmNsc19mYXVsdGVkKHJldCkpIHsKPiA+ID4gPiAr wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoC8qCj4gPiA+ID4g K8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgKiBBbGwgcG9z c2libGUgZmF1bHRzIHNob3VsZCBiZSBhdm9pZGFibGU6Cj4gPiA+ID4gK8KgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgKiBwYXJhbWV0ZXJzIGhhdmUgYmVlbiBj aGVja2VkLCB3aWxsIG9ubHkgY2hhbmdlCj4gPiA+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgKiBwZXJtaXNzaW9ucyBvZiBhIHJlZ3VsYXIgcGFnZSwg YW5kIG5vIGNvbmN1cnJlbnQKPiA+ID4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoCAqIFNHWDEvU0dYMiBFTkNMUyBpbnN0cnVjdGlvbnMgc2luY2UgdGhl c2UKPiA+ID4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oCAqIGFyZSBwcm90ZWN0ZWQgd2l0aCBtdXRleC4KPiA+ID4gPiArwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCAqLwo+ID4gPiA+ICvCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgcHJfZXJyX29uY2UoIkVNT0RQUiBlbmNvdW50 ZXJlZCBleGNlcHRpb24gJWRcbiIsCj4gPiA+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIEVOQ0xTX1RSQVBOUihy ZXQpKTsKPiA+ID4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoHJldCA9IC1FRkFVTFQ7Cj4gPiA+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqBnb3RvIG91dF91bmxvY2s7Cj4gPiA+ID4gK8KgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoH0KPiA+ID4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg aWYgKGVuY2xzX2ZhaWxlZChyZXQpKSB7Cj4gPiA+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBtb2RwLT5yZXN1bHQgPSByZXQ7Cj4gPiA+ID4gK8KgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqByZXQgPSAtRUZBVUxUOwo+ ID4gPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgZ290 byBvdXRfdW5sb2NrOwo+ID4gPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqB9Cj4g PiA+ID4gKwo+ID4gPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqByZXQgPSBzZ3hf ZW5jbGF2ZV9ldHJhY2soZW5jbCk7Cj4gPiA+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoGlmIChyZXQpIHsKPiA+ID4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoHJldCA9IC1FRkFVTFQ7Cj4gPiA+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBnb3RvIG91dF91bmxvY2s7Cj4gPiA+ID4gK8KgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoH0KPiA+ID4gPiArCj4gPiA+ID4gK8KgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoG11dGV4X3VubG9jaygmZW5jbC0+bG9jayk7Cj4gPiA+ID4gK8Kg wqDCoMKgwqDCoMKgfQo+ID4gPiA+ICsKPiA+ID4gPiArwqDCoMKgwqDCoMKgwqByZXQgPSAwOwo+ ID4gPiA+ICvCoMKgwqDCoMKgwqDCoGdvdG8gb3V0Owo+ID4gPiA+ICsKPiA+ID4gPiArb3V0X3Vu bG9jazoKPiA+ID4gPiArwqDCoMKgwqDCoMKgwqBtdXRleF91bmxvY2soJmVuY2wtPmxvY2spOwo+ ID4gPiA+ICtvdXQ6Cj4gPiA+ID4gK8KgwqDCoMKgwqDCoMKgbW9kcC0+Y291bnQgPSBjOwo+ID4g PiA+ICsKPiA+ID4gPiArwqDCoMKgwqDCoMKgwqByZXR1cm4gcmV0Owo+ID4gPiA+ICt9Cj4gPiA+ ID4gKwo+ID4gPiA+ICsvKioKPiA+ID4gPiArICogc2d4X2lvY19lbmNsYXZlX3Jlc3RyaWN0X3Bl cm1pc3Npb25zKCkgLSBoYW5kbGVyIGZvcgo+ID4gPiA+ICsgKsKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oCAlU0dYX0lPQ19FTkNMQVZFX1JFU1RSSUNUX1BFUk1JU1NJT05TCj4gPiA+ID4gKyAqIEBlbmNs OsKgwqDCoMKgwqDCoGFuIGVuY2xhdmUgcG9pbnRlcgo+ID4gPiA+ICsgKiBAYXJnOsKgwqDCoMKg wqDCoMKgdXNlcnNwYWNlIHBvaW50ZXIgdG8gYSAmc3RydWN0IHNneF9lbmNsYXZlX3Jlc3RyaWN0 X3Blcm1pc3Npb25zCj4gPiA+ID4gKyAqwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBpbnN0YW5j ZQo+ID4gPiA+ICsgKgo+ID4gPiA+ICsgKiBTR1gyIGRpc3Rpbmd1aXNoZXMgYmV0d2VlbiByZWxh eGluZyBhbmQgcmVzdHJpY3RpbmcgdGhlIGVuY2xhdmUgcGFnZQo+ID4gPiA+ICsgKiBwZXJtaXNz aW9ucyBtYWludGFpbmVkIGJ5IHRoZSBoYXJkd2FyZSAoRVBDTSBwZXJtaXNzaW9ucykgb2YgcGFn ZXMKPiA+ID4gPiArICogYmVsb25naW5nIHRvIGFuIGluaXRpYWxpemVkIGVuY2xhdmUgKGFmdGVy IFNHWF9JT0NfRU5DTEFWRV9JTklUKS4KPiA+ID4gPiArICoKPiA+ID4gPiArICogRVBDTSBwZXJt aXNzaW9ucyBjYW5ub3QgYmUgcmVzdHJpY3RlZCBmcm9tIHdpdGhpbiB0aGUgZW5jbGF2ZSwgdGhl IGVuY2xhdmUKPiA+ID4gPiArICogcmVxdWlyZXMgdGhlIGtlcm5lbCB0byBydW4gdGhlIHByaXZp bGVnZWQgbGV2ZWwgMCBpbnN0cnVjdGlvbnMgRU5DTFNbRU1PRFBSXQo+ID4gPiA+ICsgKiBhbmQg RU5DTFNbRVRSQUNLXS4gQW4gYXR0ZW1wdCB0byByZWxheCBFUENNIHBlcm1pc3Npb25zIHdpdGgg dGhpcyBjYWxsCj4gPiA+ID4gKyAqIHdpbGwgYmUgaWdub3JlZCBieSB0aGUgaGFyZHdhcmUuCj4g PiA+ID4gKyAqCj4gPiA+ID4gKyAqIFJldHVybjoKPiA+ID4gPiArICogLSAwOsKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgU3VjY2Vzcwo+ID4gPiA+ICsgKiAtIC1lcnJubzrCoMKgwqBP dGhlcndpc2UKPiA+ID4gPiArICovCj4gPiA+ID4gK3N0YXRpYyBsb25nIHNneF9pb2NfZW5jbGF2 ZV9yZXN0cmljdF9wZXJtaXNzaW9ucyhzdHJ1Y3Qgc2d4X2VuY2wgKmVuY2wsCj4gPiA+ID4gK8Kg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgdm9pZCBfX3VzZXIgKmFyZykKPiA+ ID4gPiArewo+ID4gPiA+ICvCoMKgwqDCoMKgwqDCoHN0cnVjdCBzZ3hfZW5jbGF2ZV9yZXN0cmlj dF9wZXJtaXNzaW9ucyBwYXJhbXM7Cj4gPiA+ID4gK8KgwqDCoMKgwqDCoMKgdTY0IHNlY2luZm9f cGVybTsKPiA+ID4gPiArwqDCoMKgwqDCoMKgwqBsb25nIHJldDsKPiA+ID4gPiArCj4gPiA+ID4g K8KgwqDCoMKgwqDCoMKgcmV0ID0gc2d4X2lvY19zZ3gyX3JlYWR5KGVuY2wpOwo+ID4gPiA+ICvC oMKgwqDCoMKgwqDCoGlmIChyZXQpCj4gPiA+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoHJldHVybiByZXQ7Cj4gPiA+ID4gKwo+ID4gPiA+ICvCoMKgwqDCoMKgwqDCoGlmIChjb3B5 X2Zyb21fdXNlcigmcGFyYW1zLCBhcmcsIHNpemVvZihwYXJhbXMpKSkKPiA+ID4gPiArwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgcmV0dXJuIC1FRkFVTFQ7Cj4gPiA+ID4gKwo+ID4gPiA+ ICvCoMKgwqDCoMKgwqDCoGlmIChzZ3hfdmFsaWRhdGVfb2Zmc2V0X2xlbmd0aChlbmNsLCBwYXJh bXMub2Zmc2V0LCBwYXJhbXMubGVuZ3RoKSkKPiA+ID4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgcmV0dXJuIC1FSU5WQUw7Cj4gPiA+ID4gKwo+ID4gPiA+ICvCoMKgwqDCoMKgwqDC oHJldCA9IHNneF9wZXJtX2Zyb21fdXNlcl9zZWNpbmZvKCh2b2lkIF9fdXNlciAqKXBhcmFtcy5z ZWNpbmZvLAo+ID4gPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgJnNlY2luZm9fcGVybSk7Cj4g PiA+ID4gK8KgwqDCoMKgwqDCoMKgaWYgKHJldCkKPiA+ID4gPiArwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgcmV0dXJuIHJldDsKPiA+ID4gPiArCj4gPiA+ID4gK8KgwqDCoMKgwqDCoMKg aWYgKHBhcmFtcy5yZXN1bHQgfHwgcGFyYW1zLmNvdW50KQo+ID4gPiA+ICvCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqByZXR1cm4gLUVJTlZBTDsKPiA+ID4gPiArCj4gPiA+ID4gK8KgwqDC oMKgwqDCoMKgcmV0ID0gc2d4X2VuY2xhdmVfcmVzdHJpY3RfcGVybWlzc2lvbnMoZW5jbCwgJnBh cmFtcywgc2VjaW5mb19wZXJtKTsKPiA+ID4gPiArCj4gPiA+ID4gK8KgwqDCoMKgwqDCoMKgaWYg KGNvcHlfdG9fdXNlcihhcmcsICZwYXJhbXMsIHNpemVvZihwYXJhbXMpKSkKPiA+ID4gPiArwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgcmV0dXJuIC1FRkFVTFQ7Cj4gPiA+ID4gKwo+ID4g PiA+ICvCoMKgwqDCoMKgwqDCoHJldHVybiByZXQ7Cj4gPiA+ID4gK30KPiA+ID4gPiArCj4gPiA+ ID4gwqBsb25nIHNneF9pb2N0bChzdHJ1Y3QgZmlsZSAqZmlsZXAsIHVuc2lnbmVkIGludCBjbWQs IHVuc2lnbmVkIGxvbmcgYXJnKQo+ID4gPiA+IMKgewo+ID4gPiA+IMKgwqDCoMKgwqDCoMKgwqBz dHJ1Y3Qgc2d4X2VuY2wgKmVuY2wgPSBmaWxlcC0+cHJpdmF0ZV9kYXRhOwo+ID4gPiA+IEBAIC02 ODEsNiArOTE5LDEwIEBAIGxvbmcgc2d4X2lvY3RsKHN0cnVjdCBmaWxlICpmaWxlcCwgdW5zaWdu ZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCj4gPiA+ID4gwqDCoMKgwqDCoMKgwqDCoGNh c2UgU0dYX0lPQ19FTkNMQVZFX1BST1ZJU0lPTjoKPiA+ID4gPiDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoHJldCA9IHNneF9pb2NfZW5jbGF2ZV9wcm92aXNpb24oZW5jbCwgKHZvaWQg X191c2VyICopYXJnKTsKPiA+ID4gPiDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGJy ZWFrOwo+ID4gPiA+ICvCoMKgwqDCoMKgwqDCoGNhc2UgU0dYX0lPQ19FTkNMQVZFX1JFU1RSSUNU X1BFUk1JU1NJT05TOgo+ID4gPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqByZXQg PSBzZ3hfaW9jX2VuY2xhdmVfcmVzdHJpY3RfcGVybWlzc2lvbnMoZW5jbCwKPiA+ID4gPiArwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgICh2 b2lkIF9fdXNlciAqKWFyZyk7Cj4gPiA+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oGJyZWFrOwo+ID4gPiA+IMKgwqDCoMKgwqDCoMKgwqBkZWZhdWx0Ogo+ID4gPiA+IMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgcmV0ID0gLUVOT0lPQ1RMQ01EOwo+ID4gPiA+IMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgYnJlYWs7Cj4gPiA+IAo+ID4gPiBJIHRoaW5rIHRo aXMgYSBiaWcgaW1wcm92ZW1lbnQgYWxsIHRoaW5ncyBjb25zaWRlcmVkLiBJIGp1c3QgcHV0wqAK PiA+ID4gYSBrZXJuZWwgYnVpbGRpbmcgYW5kIHNlZSBpZiBJIGdldCB0aGlzIHdpcmVkIHRvIG91 ciBjb2RlOgo+ID4gPiAKPiA+ID4gaHR0cHM6Ly9naXRodWIuY29tL2phcmtrb2pzL2F1ci1saW51 eC1zZ3gvYWN0aW9ucy9ydW5zLzIwOTQwODQ5NDMKPiA+ID4gCj4gPiA+IEknbGwgcmVwb3J0IG15 IGZpbmRpbmdzIGxhdGVyIG9uLgo+ID4gCj4gPiBJIHB1bGxlZCB0aGUgcGF0Y2hlcyBmcm9tIHNn eDJfc3VibWl0dGVkX3YzX3BsdXNfcnd4IGJyYW5jaC4gSnVzdAo+ID4gc2FuaXR5IGNoZWNraW5n IHRoYXQgaXQgaXMgdjMsIGNvcnJlY3Q/Cj4gCj4gSSdtIGdldHRpbmcgRUlOVkFMIHdpdGggU0VD SU5GTyB0aGF0IEkgdGhpbmsgaXMgbGVnaXQ6Cj4gCj4gbGV0IG11dCBzZWNpbmZvX2J1ZjogW3U4 OyA2NF0gPSBbMDsgNjRdOyAvLyBJbml0aWFsaXplIHdpdGggemVyb3MKPiBzZWNpbmZvX2J1Zlsw XSA9IDE7IC8vIFJFQUQKPiBzZWNpbmZvX2J1ZlsxXSA9IDI7IC8vIFJlZ3VsYXIKPiAKPiBJIG1h ZGUgYSBzbWFsbCBicGZ0cmFjZSBzY3JpcHQsIGFuZCBoZXJlJ3Mgd2hhdCBoYXBwZW5zOgo+IAo+ ICQgY2F0IHNneC5idAo+IGtyZXRwcm9iZTpzZ3hfaW9jdGwgL3JldHZhbCAhPSAwLwo+IHsKPiDC oMKgwqDCoMKgwqDCoMKgcHJpbnRmKCJzZ3hfaW9jdGw6ICVkXG4iLCByZXR2YWwpCj4gfQo+IAo+ IGtyZXRwcm9iZTpzZ3hfcGVybV9mcm9tX3VzZXJfc2VjaW5mby5jb25zdHByb3AuMCAvcmV0dmFs Lwo+IHsKPiDCoMKgwqDCoMKgwqDCoMKgcHJpbnRmKCJzZ3hfcGVybV9mcm9tX3VzZXJfc2VjaW5m by5jb25zdHByb3AuMCAlZFxuIiwgcmV0dmFsKQo+IH0KPiAKPiBrcmV0cHJvYmU6c2d4X2VuY2xh dmVfcmVzdHJpY3RfcGVybWlzc2lvbnMgL3JldHZhbC8KPiB7Cj4gwqDCoMKgwqDCoMKgwqDCoHBy aW50Zigic2d4X2VuY2xhdmVfcmVzdHJpY3RfcGVybWlzc2lvbnM6ICVkXG4iLCByZXR2YWwpCj4g fQo+IAo+ICQgc3VkbyBicGZ0cmFjZSBzZ3guYnQKPiBbc3Vkb10gcGFzc3dvcmQgZm9yIGphcmtr bzogCj4gQXR0YWNoaW5nIDMgcHJvYmVzLi4uCj4gc2d4X3Blcm1fZnJvbV91c2VyX3NlY2luZm8u Y29uc3Rwcm9wLjAgLTIyCj4gc2d4X2lvY3RsOiAtMjIKPiAKPiBDb3VsZCBiZSB0aGF0IEknbSBk b2luZyBzb21ldGhpbmcgd3JvbmcgYnV0IGluc3RhbnRseSBkbyBub3Qgc2VlCj4gYW55dGhpbmcg b2J2aW91cy4uLgoKSXQgd2FzIG15IGJhZCwgaS5lLgoKbGV0IG11dCBzZWNpbmZvX2J1ZjogW3U4 OyA2NF0gPSBbMDsgNjRdOwpzZWNpbmZvX2J1ZlswXSA9IDE7CnNlY2luZm9fYnVmWzFdID0gMDsK IApCUiwgSmFya2tvCgo=