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 lists.gnu.org (lists.gnu.org [209.51.188.17]) (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 72CB4C19F2E for ; Thu, 27 Feb 2025 15:31:42 +0000 (UTC) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1tnfrI-0000Mq-Rm; Thu, 27 Feb 2025 10:31:32 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1tnfr6-0000MT-Sl for grub-devel@gnu.org; Thu, 27 Feb 2025 10:31:22 -0500 Received: from mx0a-001b2d01.pphosted.com ([148.163.156.1]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1tnfr0-0001R5-H8 for grub-devel@gnu.org; Thu, 27 Feb 2025 10:31:20 -0500 Received: from pps.filterd (m0353729.ppops.net [127.0.0.1]) by mx0a-001b2d01.pphosted.com (8.18.1.2/8.18.1.2) with ESMTP id 51REUCQl019825; Thu, 27 Feb 2025 15:31:07 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ibm.com; h=cc :content-transfer-encoding:content-type:date:from:in-reply-to :message-id:mime-version:references:subject:to; s=pp1; bh=DF/Rmb Hle28nGgivAl+BI9ZK7+NCAEfZrd67KaJqBBI=; b=c0gX6jbygRrAX0FFXxoBI1 J6sXTw42LNeBwdjYzSLdQZRV0odLdAL2HVRTLArWHUHWGyD59enu61OfK1/WlscV MWYwICQqKJxxKonVznETo1ZKx2rfj2cQT5mwKi/nTYCpGraamEbwC5zOR+Z/h7hI O7i9TmPKnsWZvIG0pATFs6AmS5CKg2G/qzxlawNmTpeDBlF9EaHJ9PuwMX58h63f Z61TfPt14Hyw/Zg4zxkufFCqJL1bl8RiuCUpKlpanjwKVDzXtweFOddHGkAxDR2c +U1pNlf3ycOSwKIQnldg6Yenk8QhRz3E5FB1o0JcAeHVOFoilvZ7neCEjscW7wzQ == Received: from ppma21.wdc07v.mail.ibm.com (5b.69.3da9.ip4.static.sl-reverse.com [169.61.105.91]) by mx0a-001b2d01.pphosted.com (PPS) with ESMTPS id 452hv8tw1v-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Thu, 27 Feb 2025 15:31:06 +0000 (GMT) Received: from pps.filterd (ppma21.wdc07v.mail.ibm.com [127.0.0.1]) by ppma21.wdc07v.mail.ibm.com (8.18.1.2/8.18.1.2) with ESMTP id 51RD9kHM026280; Thu, 27 Feb 2025 15:31:05 GMT Received: from smtprelay07.dal12v.mail.ibm.com ([172.16.1.9]) by ppma21.wdc07v.mail.ibm.com (PPS) with ESMTPS id 44yswnsasq-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Thu, 27 Feb 2025 15:31:05 +0000 Received: from smtpav02.dal12v.mail.ibm.com (smtpav02.dal12v.mail.ibm.com [10.241.53.101]) by smtprelay07.dal12v.mail.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id 51RFV4jA27460184 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Thu, 27 Feb 2025 15:31:04 GMT Received: from smtpav02.dal12v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 51D8B58060; Thu, 27 Feb 2025 15:31:04 +0000 (GMT) Received: from smtpav02.dal12v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id B93CB5805C; Thu, 27 Feb 2025 15:31:03 +0000 (GMT) Received: from ltc.linux.ibm.com (unknown [9.5.196.140]) by smtpav02.dal12v.mail.ibm.com (Postfix) with ESMTP; Thu, 27 Feb 2025 15:31:03 +0000 (GMT) MIME-Version: 1.0 Date: Thu, 27 Feb 2025 21:01:03 +0530 From: sudhakar To: Avnish Chouhan Cc: grub-devel@gnu.org, dja@axtens.net, jan.setjeeilers@oracle.com, julian.klode@canonical.com, mate.kukri@canonical.com, pjones@redhat.com, stefanb@linux.ibm.com, nayna@linux.ibm.com, ssrish@linux.ibm.com, Javier Martinez Canillas , Michal Suchanek , daniel.kiper@oracle.com Subject: Re: [PATCH v1 09/21] appended signatures: parse PKCS#7 signedData and X.509 certificates In-Reply-To: <61bd8fe408148aaceecb17b4ea6ddd45@linux.ibm.com> References: <20241218145647.1390837-1-sudhakar@linux.ibm.com> <20241218145647.1390837-10-sudhakar@linux.ibm.com> <61bd8fe408148aaceecb17b4ea6ddd45@linux.ibm.com> Message-ID: X-Sender: sudhakar@linux.ibm.com X-TM-AS-GCONF: 00 X-Proofpoint-ORIG-GUID: rMlbgMl8x5VHnYt-gigsZpNQ-OkpVH9I X-Proofpoint-GUID: rMlbgMl8x5VHnYt-gigsZpNQ-OkpVH9I X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1057,Hydra:6.0.680,FMLib:17.12.68.34 definitions=2025-02-27_06,2025-02-27_01,2024-11-22_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 clxscore=1011 suspectscore=0 phishscore=0 lowpriorityscore=0 malwarescore=0 adultscore=0 spamscore=0 impostorscore=0 mlxlogscore=999 priorityscore=1501 mlxscore=0 bulkscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.19.0-2502100000 definitions=main-2502270117 Received-SPF: pass client-ip=148.163.156.1; envelope-from=sudhakar@linux.ibm.com; helo=mx0a-001b2d01.pphosted.com X-Spam_score_int: -26 X-Spam_score: -2.7 X-Spam_bar: -- X-Spam_report: (-2.7 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_LOW=-0.7, RCVD_IN_MSPIKE_H2=0.001, RCVD_IN_VALIDITY_CERTIFIED_BLOCKED=0.001, RCVD_IN_VALIDITY_RPBL_BLOCKED=0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: grub-devel@gnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: The development of GNU GRUB List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Reply-To: The development of GNU GRUB Content-Transfer-Encoding: base64 Content-Type: text/plain; charset="utf-8"; Format="flowed" Errors-To: grub-devel-bounces+grub-devel=archiver.kernel.org@gnu.org Sender: grub-devel-bounces+grub-devel=archiver.kernel.org@gnu.org T24gMjAyNS0wMS0yNCAxNjo0MCwgQXZuaXNoIENob3VoYW4gd3JvdGU6Cj4gU3VnZ2VzdGlvbiA6 IEl0IHdpbGwgYmUgZ29vZCBpZiB3ZSBjYW4gcmVtb3ZlIHRoZSBicmFja2V0cyBpbiBvbmUKPiBs aW5lciBpZiBjb25kaXRpb25zIGFuZCBsb29wcyEKPiAKPiBSZXZpZXdlZC1ieTrCoEF2bmlzaMKg Q2hvdWhhbsKgPGF2bmlzaEBsaW51eC5pYm0uY29tPgo+IAo+IE9uIDIwMjQtMTItMTggMjA6MjYs IFN1ZGhha2FyIEt1cHB1c2FteSB3cm90ZToKPj4gRnJvbTogRGFuaWVsIEF4dGVucyA8ZGphQGF4 dGVucy5uZXQ+Cj4+IAo+PiBUaGlzIGNvZGUgYWxsb3dzIHVzIHRvIHBhcnNlOgo+PiAKPj4gIC0g UEtDUyM3IHNpZ25lZERhdGEgbWVzc2FnZXMuIE9ubHkgYSBzaW5nbGUgc2lnbmVySW5mbyBpcyBz dXBwb3J0ZWQsCj4+ICAgIHdoaWNoIGlzIGFsbCB0aGF0IHRoZSBMaW51eCBzaWduLWZpbGUgdXRp bGl0eSBzdXBwb3J0cyBjcmVhdGluZwo+PiAgICBvdXQtb2YtdGhlLWJveC4gT25seSBSU0EsIFNI QS0yNTYgYW5kIFNIQS01MTIgYXJlIHN1cHBvcnRlZC4KPj4gICAgQW55IGNlcnRpZmljYXRlIGVt YmVkZGVkIGluIHRoZSBQS0NTIzcgbWVzc2FnZSB3aWxsIGJlIGlnbm9yZWQuCj4+IAo+PiAgLSBY LjUwOSBjZXJ0aWZpY2F0ZXM6IGF0IGxlYXN0IGVub3VnaCB0byB2ZXJpZnkgdGhlIHNpZ25hdHVy ZXMgb24gdGhlCj4+ICAgIFBLQ1MjNyBtZXNzYWdlcy4gV2UgZXhwZWN0IHRoYXQgdGhlIGNlcnRp ZmljYXRlcyBlbWJlZGRlZCBpbiBncnViIAo+PiB3aWxsCj4+ICAgIGJlIGxlYWYgY2VydGlmaWNh dGVzLCBub3QgQ0EgY2VydGlmaWNhdGVzLiBUaGUgcGFyc2VyIGVuZm9yY2VzIAo+PiB0aGlzLgo+ PiAKPj4gIC0gWC41MDkgY2VydGlmaWNhdGVzIHN1cHBvcnQgdGhlIEV4dGVuZGVkIEtleSBVc2Fn ZSBleHRlbnNpb24gYW5kIAo+PiBoYW5kbGUKPj4gICAgaXQgYnkgdmVyaWZ5aW5nIHRoYXQgdGhl IGNlcnRpZmljYXRlIGhhcyBhIHNpbmdsZSBwdXJwb3NlLCB0aGF0IGlzIAo+PiBjb2RlCj4+ICAg IHNpZ25pbmcuIFRoaXMgaXMgcmVxdWlyZWQgYmVjYXVzZSBSZWQgSGF0IGNlcnRpZmljYXRlcyBo YXZlIGJvdGggCj4+IEtleQo+PiAgICBVc2FnZSBhbmQgRXh0ZW5kZWQgS2V5IFVzYWdlIGV4dGVu c2lvbnMgcHJlc2VudC4KPj4gCj4+IFNpZ25lZC1vZmYtYnk6IEphdmllciBNYXJ0aW5leiBDYW5p bGxhcyA8amF2aWVybUByZWRoYXQuY29tPiAjIEVLVSAKPj4gc3VwcG9ydAo+PiBSZXBvcnRlZC1i eTogTWljaGFsIFN1Y2hhbmVrIDxtc3VjaGFuZWtAc3VzZS5jb20+ICMga2V5IHVzYWdlIGlzc3Vl Cj4+IFNpZ25lZC1vZmYtYnk6IERhbmllbCBBeHRlbnMgPGRqYUBheHRlbnMubmV0Pgo+PiBTaWdu ZWQtb2ZmLWJ5OiBTdWRoYWthciBLdXBwdXNhbXkgPHN1ZGhha2FyQGxpbnV4LmlibS5jb20+Cj4+ IC0tLQo+PiAgZ3J1Yi1jb3JlL2NvbW1hbmRzL2FwcGVuZGVkc2lnL2FwcGVuZGVkc2lnLmggfCAx MTAgKysrCj4+ICBncnViLWNvcmUvY29tbWFuZHMvYXBwZW5kZWRzaWcvYXNuMXV0aWwuYyAgICB8 ICA5OSArKwo+PiAgZ3J1Yi1jb3JlL2NvbW1hbmRzL2FwcGVuZGVkc2lnL3BrY3M3LmMgICAgICAg fCA0NzMgKysrKysrKysrCj4+ICBncnViLWNvcmUvY29tbWFuZHMvYXBwZW5kZWRzaWcveDUwOS5j ICAgICAgICB8IDk4MSAKPj4gKysrKysrKysrKysrKysrKysrKwo+PiAgNCBmaWxlcyBjaGFuZ2Vk LCAxNjYzIGluc2VydGlvbnMoKykKPj4gIGNyZWF0ZSBtb2RlIDEwMDY0NCBncnViLWNvcmUvY29t bWFuZHMvYXBwZW5kZWRzaWcvYXBwZW5kZWRzaWcuaAo+PiAgY3JlYXRlIG1vZGUgMTAwNjQ0IGdy dWItY29yZS9jb21tYW5kcy9hcHBlbmRlZHNpZy9hc24xdXRpbC5jCj4+ICBjcmVhdGUgbW9kZSAx MDA2NDQgZ3J1Yi1jb3JlL2NvbW1hbmRzL2FwcGVuZGVkc2lnL3BrY3M3LmMKPj4gIGNyZWF0ZSBt b2RlIDEwMDY0NCBncnViLWNvcmUvY29tbWFuZHMvYXBwZW5kZWRzaWcveDUwOS5jCj4+IAo+PiBk aWZmIC0tZ2l0IGEvZ3J1Yi1jb3JlL2NvbW1hbmRzL2FwcGVuZGVkc2lnL2FwcGVuZGVkc2lnLmgK Pj4gYi9ncnViLWNvcmUvY29tbWFuZHMvYXBwZW5kZWRzaWcvYXBwZW5kZWRzaWcuaAo+PiBuZXcg ZmlsZSBtb2RlIDEwMDY0NAo+PiBpbmRleCAwMDAwMDAwMDAuLmZhNTkzMDJjOAo+PiAtLS0gL2Rl di9udWxsCj4+ICsrKyBiL2dydWItY29yZS9jb21tYW5kcy9hcHBlbmRlZHNpZy9hcHBlbmRlZHNp Zy5oCj4+IEBAIC0wLDAgKzEsMTEwIEBACj4+ICsvKgo+PiArICogIEdSVUIgIC0tICBHUmFuZCBV bmlmaWVkIEJvb3Rsb2FkZXIKPj4gKyAqICBDb3B5cmlnaHQgKEMpIDIwMjAsIDIwMjIgRnJlZSBT b2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCj4+ICsgKiAgQ29weXJpZ2h0IChDKSAyMDIwLCAyMDIy IElCTSBDb3Jwb3JhdGlvbgo+PiArICoKPj4gKyAqICBHUlVCIGlzIGZyZWUgc29mdHdhcmU6IHlv dSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKPj4gKyAqICBpdCB1bmRlciB0aGUg dGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCAKPj4g YnkKPj4gKyAqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAz IG9mIHRoZSBMaWNlbnNlLCBvcgo+PiArICogIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZl cnNpb24uCj4+ICsgKgo+PiArICogIEdSVUIgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhh dCBpdCB3aWxsIGJlIHVzZWZ1bCwKPj4gKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdp dGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgo+PiArICogIE1FUkNIQU5UQUJJTElU WSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKPj4gKyAqICBH TlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgo+PiArICoKPj4gKyAq ICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJs aWMgTGljZW5zZQo+PiArICogIGFsb25nIHdpdGggR1JVQi4gIElmIG5vdCwgc2VlIDxodHRwOi8v d3d3LmdudS5vcmcvbGljZW5zZXMvPi4KPj4gKyAqLwo+PiArCj4+ICsjaW5jbHVkZSA8Z3J1Yi9j cnlwdG8uaD4KPj4gKyNpbmNsdWRlIDxncnViL2xpYnRhc24xLmg+Cj4+ICsKPj4gK2V4dGVybiBh c24xX25vZGUgX2dudXRsc19nbnV0bHNfYXNuOwo+PiArZXh0ZXJuIGFzbjFfbm9kZSBfZ251dGxz X3BraXhfYXNuOwo+PiArCj4+ICsjZGVmaW5lIE1BWF9PSURfTEVOIDMyCj4+ICsKPj4gKy8qCj4+ ICsgKiBPbmUgb3IgbW9yZSB4NTA5IGNlcnRpZmljYXRlcy4KPj4gKyAqIFdlIGRvIGxpbWl0ZWQg cGFyc2luZzogZXh0cmFjdGluZyBvbmx5IHRoZSBzZXJpYWwsIENOIGFuZCBSU0EgCj4+IHB1Ymxp YyBrZXkuCj4+ICsgKi8KPj4gK3N0cnVjdCB4NTA5X2NlcnRpZmljYXRlCj4+ICt7Cj4+ICsgIHN0 cnVjdCB4NTA5X2NlcnRpZmljYXRlICpuZXh0Owo+PiArICBncnViX3VpbnQ4X3QgKnNlcmlhbDsK Pj4gKyAgZ3J1Yl9zaXplX3Qgc2VyaWFsX2xlbjsKPj4gKyAgY2hhciAqc3ViamVjdDsKPj4gKyAg Z3J1Yl9zaXplX3Qgc3ViamVjdF9sZW47Cj4+ICsgIC8qIFdlIG9ubHkgc3VwcG9ydCBSU0EgcHVi bGljIGtleXMuIFRoaXMgZW5jb2RlcyBbbW9kdWx1cywgCj4+IHB1YmxpY0V4cG9uZW50XSAqLwo+ PiArICBnY3J5X21waV90IG1waXNbMl07Cj4+ICt9Owo+PiArCj4+ICsvKgo+PiArICogQSBQS0NT Izcgc2lnbmVkRGF0YSBzaWduZXJJbmZvLgo+PiArICovCj4+ICtzdHJ1Y3QgcGtjczdfc2lnbmVy SW5mbwo+PiArewo+PiArICBjb25zdCBnY3J5X21kX3NwZWNfdCAqaGFzaDsKPj4gKyAgZ2NyeV9t cGlfdCBzaWdfbXBpOwo+PiArfTsKPj4gKwo+PiArLyoKPj4gKyAqIEEgUEtDUyM3IHNpZ25lZERh dGEgbWVzc2FnZS4KPj4gKyAqIFdlIG1ha2Ugbm8gYXR0ZW1wdCB0byBtYXRjaCBpbnRlbGxpZ2Vu dGx5LCBzbyB3ZSBkb24ndCBzYXZlIGFueSAKPj4gaW5mbyBhYm91dAo+PiArICogdGhlIHNpZ25l ci4KPj4gKyAqLwo+PiArc3RydWN0IHBrY3M3X3NpZ25lZERhdGEKPj4gK3sKPj4gKyAgaW50IHNp Z25lckluZm9fY291bnQ7Cj4+ICsgIHN0cnVjdCBwa2NzN19zaWduZXJJbmZvICpzaWduZXJJbmZv czsKPj4gK307Cj4+ICsKPj4gKy8qIERvIGxpYnRhc24xIGluaXQgKi8KPj4gK2ludAo+PiArYXNu MV9pbml0ICh2b2lkKTsKPj4gKwo+PiArLyoKPj4gKyAqIEltcG9ydCBhIERFUi1lbmNvZGVkIGNl cnRpZmljYXRlIGF0ICdkYXRhJywgb2Ygc2l6ZSAnc2l6ZScuCj4+ICsgKiBQbGFjZSB0aGUgcmVz dWx0cyBpbnRvICdyZXN1bHRzJywgd2hpY2ggbXVzdCBiZSBhbHJlYWR5IGFsbG9jYXRlZC4KPj4g KyAqLwo+PiArZ3J1Yl9lcnJfdAo+PiArcGFyc2VfeDUwOV9jZXJ0aWZpY2F0ZSAoY29uc3Qgdm9p ZCAqZGF0YSwgZ3J1Yl9zaXplX3Qgc2l6ZSwgc3RydWN0Cj4+IHg1MDlfY2VydGlmaWNhdGUgKnJl c3VsdHMpOwo+PiArCj4+ICsvKgo+PiArICogUmVsZWFzZSBhbGwgdGhlIHN0b3JhZ2UgYXNzb2Np YXRlZCB3aXRoIHRoZSB4NTA5IGNlcnRpZmljYXRlLgo+PiArICogSWYgdGhlIGNhbGxlciBkeW5h bWljYWxseSBhbGxvY2F0ZWQgdGhlIGNlcnRpZmljYXRlLCBpdCBtdXN0IGZyZWUgCj4+IGl0Lgo+ PiArICogVGhlIGNhbGxlciBpcyBhbHNvIHJlc3BvbnNpYmxlIGZvciBtYWludGVuYW5jZSBvZiB0 aGUgbGlua2VkIGxpc3QuCj4+ICsgKi8KPj4gK3ZvaWQKPj4gK2NlcnRpZmljYXRlX3JlbGVhc2Ug KHN0cnVjdCB4NTA5X2NlcnRpZmljYXRlICpjZXJ0KTsKPj4gKwo+PiArLyoKPj4gKyAqIFBhcnNl IGEgUEtDUyM3IG1lc3NhZ2UsIHdoaWNoIG11c3QgYmUgYSBzaWduZWREYXRhIG1lc3NhZ2UuCj4+ ICsgKiBUaGUgbWVzc2FnZSBtdXN0IGJlIGluICdzaWdidWYnIGFuZCBvZiBzaXplICdkYXRhX3Np emUnLiBUaGUgCj4+IHJlc3VsdCBpcwo+PiArICogcGxhY2VkIGluICdtc2cnLCB3aGljaCBtdXN0 IGFscmVhZHkgYmUgYWxsb2NhdGVkLgo+PiArICovCj4+ICtncnViX2Vycl90Cj4+ICtwYXJzZV9w a2NzN19zaWduZWREYXRhIChjb25zdCB2b2lkICpzaWdidWYsIGdydWJfc2l6ZV90IGRhdGFfc2l6 ZSwKPj4gc3RydWN0IHBrY3M3X3NpZ25lZERhdGEgKm1zZyk7Cj4+ICsKPj4gKy8qCj4+ICsgKiBS ZWxlYXNlIGFsbCB0aGUgc3RvcmFnZSBhc3NvY2lhdGVkIHdpdGggdGhlIFBLQ1MjNyBtZXNzYWdl Lgo+PiArICogSWYgdGhlIGNhbGxlciBkeW5hbWljYWxseSBhbGxvY2F0ZWQgdGhlIG1lc3NhZ2Us IGl0IG11c3QgZnJlZSBpdC4KPj4gKyAqLwo+PiArdm9pZAo+PiArcGtjczdfc2lnbmVkRGF0YV9y ZWxlYXNlIChzdHJ1Y3QgcGtjczdfc2lnbmVkRGF0YSAqbXNnKTsKPj4gKwo+PiArLyoKPj4gKyAq IFJlYWQgYSB2YWx1ZSBmcm9tIGFuIEFTTjEgbm9kZSwgYWxsb2NhdGluZyBtZW1vcnkgdG8gc3Rv cmUgaXQuCj4+ICsgKiBJdCB3aWxsIHdvcmsgZm9yIGFueXRoaW5nIHdoZXJlIHRoZSBzaXplIGxp YnRhc24xIHJldHVybnMgaXMgCj4+IHJpZ2h0Ogo+PiArICogIC0gSW50ZWdlcnMKPj4gKyAqICAt IE9jdGV0IHN0cmluZ3MKPj4gKyAqICAtIERFUiBlbmNvZGluZyBvZiBvdGhlciBzdHJ1Y3R1cmVz Cj4+ICsgKiBJdCB3aWxsIF9ub3RfIHdvcmsgZm9yIHRoaW5ncyB3aGVyZSBsaWJ0YXNuMSBzaXpl IHJlcXVpcmVzIAo+PiBhZGp1c3RtZW50Ogo+PiArICogIC0gU3RyaW5ncyB0aGF0IHJlcXVpcmUg YW4gZXh0cmEgTlVMTCBieXRlIGF0IHRoZSBlbmQKPj4gKyAqICAtIEJpdCBzdHJpbmdzIGJlY2F1 c2UgbGlidGFzbjEgcmV0dXJucyB0aGUgbGVuZ3RoIGluIGJpdHMsIG5vdCAKPj4gYnl0ZXMuCj4+ ICsgKgo+PiArICogSWYgdGhlIGZ1bmN0aW9uIHJldHVybnMgYSBub24tTlVMTCB2YWx1ZSwgdGhl IGNhbGxlciBtdXN0IGZyZWUgaXQuCj4+ICsgKi8KPj4gK3ZvaWQgKgo+PiArZ3J1Yl9hc24xX2Fs bG9jYXRlX2FuZF9yZWFkIChhc24xX25vZGUgbm9kZSwgY29uc3QgY2hhciAqbmFtZSwgY29uc3QK Pj4gY2hhciAqZnJpZW5kbHlfbmFtZSwgaW50ICpjb250ZW50X3NpemUpOwo+PiBkaWZmIC0tZ2l0 IGEvZ3J1Yi1jb3JlL2NvbW1hbmRzL2FwcGVuZGVkc2lnL2FzbjF1dGlsLmMKPj4gYi9ncnViLWNv cmUvY29tbWFuZHMvYXBwZW5kZWRzaWcvYXNuMXV0aWwuYwo+PiBuZXcgZmlsZSBtb2RlIDEwMDY0 NAo+PiBpbmRleCAwMDAwMDAwMDAuLjYwOWQwZWNmMgo+PiAtLS0gL2Rldi9udWxsCj4+ICsrKyBi L2dydWItY29yZS9jb21tYW5kcy9hcHBlbmRlZHNpZy9hc24xdXRpbC5jCj4+IEBAIC0wLDAgKzEs OTkgQEAKPj4gKy8qCj4+ICsgKiAgR1JVQiAgLS0gIEdSYW5kIFVuaWZpZWQgQm9vdGxvYWRlcgo+ PiArICogIENvcHlyaWdodCAoQykgMjAyMCwgMjAyMiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24s IEluYy4KPj4gKyAqICBDb3B5cmlnaHQgKEMpIDIwMjAsIDIwMjIgSUJNIENvcnBvcmF0aW9uCj4+ ICsgKgo+PiArICogIEdSVUIgaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUg aXQgYW5kL29yIG1vZGlmeQo+PiArICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdl bmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIAo+PiBieQo+PiArICogIHRoZSBGcmVl IFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9y Cj4+ICsgKiAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KPj4gKyAqCj4+ICsg KiAgR1JVQiBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVs LAo+PiArICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBs aWVkIHdhcnJhbnR5IG9mCj4+ICsgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEg UEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQo+PiArICogIEdOVSBHZW5lcmFsIFB1YmxpYyBM aWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCj4+ICsgKgo+PiArICogIFlvdSBzaG91bGQgaGF2ZSBy ZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCj4+ICsgKiAg YWxvbmcgd2l0aCBHUlVCLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNl cy8+Lgo+PiArICovCj4+ICsKPj4gKyNpbmNsdWRlIDxncnViL2xpYnRhc24xLmg+Cj4+ICsjaW5j bHVkZSA8Z3J1Yi90eXBlcy5oPgo+PiArI2luY2x1ZGUgPGdydWIvZXJyLmg+Cj4+ICsjaW5jbHVk ZSA8Z3J1Yi9tbS5oPgo+PiArI2luY2x1ZGUgPGdydWIvY3J5cHRvLmg+Cj4+ICsjaW5jbHVkZSA8 Z3J1Yi9taXNjLmg+Cj4+ICsjaW5jbHVkZSA8Z3J1Yi9nY3J5cHQvZ2NyeXB0Lmg+Cj4+ICsKPj4g KyNpbmNsdWRlICJhcHBlbmRlZHNpZy5oIgo+PiArCj4+ICthc24xX25vZGUgX2dudXRsc19nbnV0 bHNfYXNuID0gTlVMTDsKPj4gK2FzbjFfbm9kZSBfZ251dGxzX3BraXhfYXNuID0gTlVMTDsKPj4g Kwo+PiArZXh0ZXJuIGNvbnN0IGFzbjFfc3RhdGljX25vZGUgZ251dGxzX2FzbjFfdGFiW107Cj4+ ICtleHRlcm4gY29uc3QgYXNuMV9zdGF0aWNfbm9kZSBwa2l4X2FzbjFfdGFiW107Cj4+ICsKPj4g Ky8qCj4+ICsgKiBSZWFkIGEgdmFsdWUgZnJvbSBhbiBBU04xIG5vZGUsIGFsbG9jYXRpbmcgbWVt b3J5IHRvIHN0b3JlIGl0Lgo+PiArICogSXQgd2lsbCB3b3JrIGZvciBhbnl0aGluZyB3aGVyZSB0 aGUgc2l6ZSBsaWJ0YXNuMSByZXR1cm5zIGlzIAo+PiByaWdodDoKPj4gKyAqICAtIEludGVnZXJz Cj4+ICsgKiAgLSBPY3RldCBzdHJpbmdzCj4+ICsgKiAgLSBERVIgZW5jb2Rpbmcgb2Ygb3RoZXIg c3RydWN0dXJlcwo+PiArICogSXQgd2lsbCBfbm90XyB3b3JrIGZvciB0aGluZ3Mgd2hlcmUgbGli dGFzbjEgc2l6ZSByZXF1aXJlcyAKPj4gYWRqdXN0bWVudDoKPj4gKyAqICAtIFN0cmluZ3MgdGhh dCByZXF1aXJlIGFuIGV4dHJhIE5VTEwgYnl0ZSBhdCB0aGUgZW5kCj4+ICsgKiAgLSBCaXQgc3Ry aW5ncyBiZWNhdXNlIGxpYnRhc24xIHJldHVybnMgdGhlIGxlbmd0aCBpbiBiaXRzLCBub3QgCj4+ IGJ5dGVzLgo+PiArICogSWYgdGhlIGZ1bmN0aW9uIHJldHVybnMgYSBub24tTlVMTCB2YWx1ZSwg dGhlIGNhbGxlciBtdXN0IGZyZWUgaXQuCj4+ICsgKi8KPj4gK3ZvaWQgKgo+PiArZ3J1Yl9hc24x X2FsbG9jYXRlX2FuZF9yZWFkIChhc24xX25vZGUgbm9kZSwgY29uc3QgY2hhciAqbmFtZSwgY29u c3QKPj4gY2hhciAqZnJpZW5kbHlfbmFtZSwgaW50ICpjb250ZW50X3NpemUpCj4+ICt7Cj4+ICsg IGludCByZXN1bHQ7Cj4+ICsgIGdydWJfdWludDhfdCAqdG1wc3RyID0gTlVMTDsKPj4gKyAgaW50 IHRtcHN0cl9zaXplID0gMDsKPj4gKwo+PiArICByZXN1bHQgPSBhc24xX3JlYWRfdmFsdWUgKG5v ZGUsIG5hbWUsIE5VTEwsICZ0bXBzdHJfc2l6ZSk7Cj4+ICsgIGlmIChyZXN1bHQgIT0gQVNOMV9N RU1fRVJST1IpCj4+ICsgICAgewo+PiArICAgICAgZ3J1Yl9zbnByaW50ZiAoZ3J1Yl9lcnJtc2cs IHNpemVvZiAoZ3J1Yl9lcnJtc2cpLAo+PiArICAgICAgICAgICAgICAgICAgICAgXygiUmVhZGlu ZyBzaXplIG9mICVzIGRpZCBub3QgcmV0dXJuIGV4cGVjdGVkCj4+IHN0YXR1czogJXMiKSwKPj4g KyAgICAgICAgICAgICAgICAgICAgIGZyaWVuZGx5X25hbWUsIGFzbjFfc3RyZXJyb3IgKHJlc3Vs dCkpOwo+PiArICAgICAgZ3J1Yl9lcnJubyA9IEdSVUJfRVJSX0JBRF9GSUxFX1RZUEU7Cj4+ICsg ICAgICByZXR1cm4gTlVMTDsKPj4gKyAgICB9Cj4+ICsKPj4gKyAgdG1wc3RyID0gZ3J1Yl9tYWxs b2MgKHRtcHN0cl9zaXplKTsKPj4gKyAgaWYgKHRtcHN0ciA9PSBOVUxMKQo+PiArICAgIHsKPj4g KyAgICAgIGdydWJfc25wcmludGYgKGdydWJfZXJybXNnLCBzaXplb2YgKGdydWJfZXJybXNnKSwK Pj4gKyAgICAgICAgICAgICAgICAgICAgICJDb3VsZCBub3QgYWxsb2NhdGUgbWVtb3J5IHRvIHN0 b3JlICVzIiwgCj4+IGZyaWVuZGx5X25hbWUpOwo+PiArICAgICAgZ3J1Yl9lcnJubyA9IEdSVUJf RVJSX09VVF9PRl9NRU1PUlk7Cj4+ICsgICAgICByZXR1cm4gTlVMTDsKPj4gKyAgICB9Cj4+ICsK Pj4gKyAgcmVzdWx0ID0gYXNuMV9yZWFkX3ZhbHVlIChub2RlLCBuYW1lLCB0bXBzdHIsICZ0bXBz dHJfc2l6ZSk7Cj4+ICsgIGlmIChyZXN1bHQgIT0gQVNOMV9TVUNDRVNTKQo+PiArICAgIHsKPj4g KyAgICAgIGdydWJfZnJlZSAodG1wc3RyKTsKPj4gKyAgICAgIGdydWJfc25wcmludGYgKGdydWJf ZXJybXNnLCBzaXplb2YgKGdydWJfZXJybXNnKSwgIkVycm9yIAo+PiByZWFkaW5nICVzOiAlcyIs Cj4+ICsgICAgICAgICAgICAgICAgICAgICBmcmllbmRseV9uYW1lLCBhc24xX3N0cmVycm9yIChy ZXN1bHQpKTsKPj4gKyAgICAgIGdydWJfZXJybm8gPSBHUlVCX0VSUl9CQURfRklMRV9UWVBFOwo+ PiArICAgICAgcmV0dXJuIE5VTEw7Cj4+ICsgICAgfQo+PiArCj4+ICsgICpjb250ZW50X3NpemUg PSB0bXBzdHJfc2l6ZTsKPj4gKwo+PiArICByZXR1cm4gdG1wc3RyOwo+PiArfQo+PiArCj4+ICtp bnQKPj4gK2FzbjFfaW5pdCAodm9pZCkKPj4gK3sKPj4gKyAgaW50IHJlczsKPj4gKyAgcmVzID0g YXNuMV9hcnJheTJ0cmVlIChnbnV0bHNfYXNuMV90YWIsICZfZ251dGxzX2dudXRsc19hc24sIE5V TEwpOwo+PiArICBpZiAocmVzICE9IEFTTjFfU1VDQ0VTUykKPj4gKyAgICB7Cj4+ICsgICAgICBy ZXR1cm4gcmVzOwo+PiArICAgIH0KPj4gKyAgcmVzID0gYXNuMV9hcnJheTJ0cmVlIChwa2l4X2Fz bjFfdGFiLCAmX2dudXRsc19wa2l4X2FzbiwgTlVMTCk7Cj4+ICsgIHJldHVybiByZXM7Cj4+ICt9 Cj4+IGRpZmYgLS1naXQgYS9ncnViLWNvcmUvY29tbWFuZHMvYXBwZW5kZWRzaWcvcGtjczcuYwo+ PiBiL2dydWItY29yZS9jb21tYW5kcy9hcHBlbmRlZHNpZy9wa2NzNy5jCj4+IG5ldyBmaWxlIG1v ZGUgMTAwNjQ0Cj4+IGluZGV4IDAwMDAwMDAwMC4uNjFlNTYwODU0Cj4+IC0tLSAvZGV2L251bGwK Pj4gKysrIGIvZ3J1Yi1jb3JlL2NvbW1hbmRzL2FwcGVuZGVkc2lnL3BrY3M3LmMKPj4gQEAgLTAs MCArMSw0NzMgQEAKPj4gKy8qCj4+ICsgKiAgR1JVQiAgLS0gIEdSYW5kIFVuaWZpZWQgQm9vdGxv YWRlcgo+PiArICogIENvcHlyaWdodCAoQykgMjAyMCwgMjAyMiBGcmVlIFNvZnR3YXJlIEZvdW5k YXRpb24sIEluYy4KPj4gKyAqICBDb3B5cmlnaHQgKEMpIDIwMjAsIDIwMjIgSUJNIENvcnBvcmF0 aW9uCj4+ICsgKgo+PiArICogIEdSVUIgaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3Ry aWJ1dGUgaXQgYW5kL29yIG1vZGlmeQo+PiArICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUg R05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIAo+PiBieQo+PiArICogIHRo ZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vu c2UsIG9yCj4+ICsgKiAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KPj4gKyAq Cj4+ICsgKiAgR1JVQiBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUg dXNlZnVsLAo+PiArICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRo ZSBpbXBsaWVkIHdhcnJhbnR5IG9mCj4+ICsgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1Mg Rk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQo+PiArICogIEdOVSBHZW5lcmFsIFB1 YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCj4+ICsgKgo+PiArICogIFlvdSBzaG91bGQg aGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCj4+ ICsgKiAgYWxvbmcgd2l0aCBHUlVCLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9s aWNlbnNlcy8+Lgo+PiArICovCj4+ICsKPj4gKyNpbmNsdWRlICJhcHBlbmRlZHNpZy5oIgo+PiAr I2luY2x1ZGUgPGdydWIvbWlzYy5oPgo+PiArI2luY2x1ZGUgPGdydWIvY3J5cHRvLmg+Cj4+ICsj aW5jbHVkZSA8Z3J1Yi9nY3J5cHQvZ2NyeXB0Lmg+Cj4+ICsjaW5jbHVkZSA8c3lzL3R5cGVzLmg+ Cj4+ICsKPj4gK3N0YXRpYyBjaGFyIGFzbjFfZXJyb3JbQVNOMV9NQVhfRVJST1JfREVTQ1JJUFRJ T05fU0laRV07Cj4+ICsKPj4gKy8qCj4+ICsgKiBSRkMgNTY1MiBzIDUuMQo+PiArICovCj4+ICtz dGF0aWMgY29uc3QgY2hhciAqc2lnbmVkRGF0YV9vaWQgPSAiMS4yLjg0MC4xMTM1NDkuMS43LjIi Owo+PiArCj4+ICsvKgo+PiArICogUkZDIDQwNTUgcyAyLjEKPj4gKyAqLwo+PiArc3RhdGljIGNv bnN0IGNoYXIgKnNoYTI1Nl9vaWQgPSAiMi4xNi44NDAuMS4xMDEuMy40LjIuMSI7Cj4+ICtzdGF0 aWMgY29uc3QgY2hhciAqc2hhNTEyX29pZCA9ICIyLjE2Ljg0MC4xLjEwMS4zLjQuMi4zIjsKPj4g Kwo+PiArc3RhdGljIGdydWJfZXJyX3QKPj4gK3Byb2Nlc3NfY29udGVudCAoZ3J1Yl91aW50OF90 ICpjb250ZW50LCBpbnQgc2l6ZSwgc3RydWN0IAo+PiBwa2NzN19zaWduZWREYXRhICptc2cpCj4+ ICt7Cj4+ICsgIGludCByZXM7Cj4+ICsgIGFzbjFfbm9kZSBzaWduZWRfcGFydDsKPj4gKyAgZ3J1 Yl9lcnJfdCBlcnIgPSBHUlVCX0VSUl9OT05FOwo+PiArICBjaGFyIGFsZ29fb2lkW01BWF9PSURf TEVOXTsKPj4gKyAgaW50IGFsZ29fb2lkX3NpemUgPSBzaXplb2YgKGFsZ29fb2lkKTsKPj4gKyAg aW50IGFsZ29fY291bnQ7Cj4+ICsgIGludCBzaWduZXJfY291bnQ7Cj4+ICsgIGludCBpOwo+PiAr ICBjaGFyIHZlcnNpb247Cj4+ICsgIGludCB2ZXJzaW9uX3NpemUgPSBzaXplb2YgKHZlcnNpb24p Owo+PiArICBncnViX3VpbnQ4X3QgKnJlc3VsdF9idWY7Cj4+ICsgIGludCByZXN1bHRfc2l6ZSA9 IDA7Cj4+ICsgIGludCBjcmxzX3NpemUgPSAwOwo+PiArICBnY3J5X2Vycm9yX3QgZ2NyeV9lcnI7 Cj4+ICsgIGJvb2wgc2hhMjU2X2luX2RhLCBzaGEyNTZfaW5fc2ksIHNoYTUxMl9pbl9kYSwgc2hh NTEyX2luX3NpOwo+PiArICBjaGFyICpkYV9wYXRoOwo+PiArICBjaGFyICpzaV9zaWdfcGF0aDsK Pj4gKyAgY2hhciAqc2lfZGFfcGF0aDsKPj4gKwo+PiArICByZXMgPSBhc24xX2NyZWF0ZV9lbGVt ZW50IChfZ251dGxzX3BraXhfYXNuLAo+PiAiUEtJWDEucGtjcy03LVNpZ25lZERhdGEiLCAmc2ln bmVkX3BhcnQpOwo+PiArICBpZiAocmVzICE9IEFTTjFfU1VDQ0VTUykKPj4gKyAgICB7Cj4+ICsg ICAgICByZXR1cm4gZ3J1Yl9lcnJvciAoR1JVQl9FUlJfT1VUX09GX01FTU9SWSwKPj4gKyAgICAg ICAgICAgICAgICAgICAgICAgICAiQ291bGQgbm90IGNyZWF0ZSBBU04uMSBzdHJ1Y3R1cmUgZm9y IFBLQ1MjNyAKPj4gc2lnbmVkICIKPj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAicGFydC4i KTsKPj4gKyAgICB9Cj4+ICsKPj4gKyAgcmVzID0gYXNuMV9kZXJfZGVjb2RpbmcyICgmc2lnbmVk X3BhcnQsIGNvbnRlbnQsICZzaXplLAo+PiArICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFT TjFfREVDT0RFX0ZMQUdfU1RSSUNUX0RFUiwgYXNuMV9lcnJvcik7Cj4+ICsgIGlmIChyZXMgIT0g QVNOMV9TVUNDRVNTKQo+PiArICAgIHsKPj4gKyAgICAgIGVyciA9IGdydWJfZXJyb3IgKEdSVUJf RVJSX0JBRF9TSUdOQVRVUkUsCj4+ICsgICAgICAgICAgICAgICAgICAgICAgICAiRXJyb3IgcmVh ZGluZyBQS0NTIzcgc2lnbmVkIGRhdGE6ICVzIiwgCj4+IGFzbjFfZXJyb3IpOwo+PiArICAgICAg Z290byBjbGVhbnVwX3NpZ25lZF9wYXJ0Owo+PiArICAgIH0KPj4gKwo+PiArICAvKgo+PiArICAg KiBTaWduZWREYXRhIDo6PSBTRVFVRU5DRSB7Cj4+ICsgICAqICAgICB2ZXJzaW9uIENNU1ZlcnNp b24sCj4+ICsgICAqICAgICBkaWdlc3RBbGdvcml0aG1zIERpZ2VzdEFsZ29yaXRobUlkZW50aWZp ZXJzLAo+PiArICAgKiAgICAgZW5jYXBDb250ZW50SW5mbyBFbmNhcHN1bGF0ZWRDb250ZW50SW5m bywKPj4gKyAgICogICAgIGNlcnRpZmljYXRlcyBbMF0gSU1QTElDSVQgQ2VydGlmaWNhdGVTZXQg T1BUSU9OQUwsCj4+ICsgICAqICAgICBjcmxzIFsxXSBJTVBMSUNJVCBSZXZvY2F0aW9uSW5mb0No b2ljZXMgT1BUSU9OQUwsCj4+ICsgICAqICAgICBzaWduZXJJbmZvcyBTaWduZXJJbmZvcyB9Cj4+ ICsgICAqLwo+PiArCj4+ICsgIC8qIHZlcnNpb24gcGVyIHRoZSBhbGdvIGluIDUuMSwgbXVzdCBi ZSAxICovCj4+ICsgIHJlcyA9IGFzbjFfcmVhZF92YWx1ZSAoc2lnbmVkX3BhcnQsICJ2ZXJzaW9u IiwgJnZlcnNpb24sIAo+PiAmdmVyc2lvbl9zaXplKTsKPj4gKyAgaWYgKHJlcyAhPSBBU04xX1NV Q0NFU1MpCj4+ICsgICAgewo+PiArICAgICAgZXJyID0gZ3J1Yl9lcnJvciAoR1JVQl9FUlJfQkFE X1NJR05BVFVSRSwgIkVycm9yIHJlYWRpbmcKPj4gc2lnbmVkRGF0YSB2ZXJzaW9uOiAlcyIsCj4+ ICsgICAgICAgICAgICAgICAgICAgICAgICBhc24xX3N0cmVycm9yIChyZXMpKTsKPj4gKyAgICAg IGdvdG8gY2xlYW51cF9zaWduZWRfcGFydDsKPj4gKyAgICB9Cj4+ICsKPj4gKyAgaWYgKHZlcnNp b24gIT0gMSkKPj4gKyAgICB7Cj4+ICsgICAgICBlcnIgPSBncnViX2Vycm9yIChHUlVCX0VSUl9C QURfU0lHTkFUVVJFLAo+PiArICAgICAgICAgICAgICAgICAgICAgICAgIlVuZXhwZWN0ZWQgc2ln bmF0dXJlIHZlcnNpb24gdiVkLCBvbmx5IHYxCj4+IHN1cHBvcnRlZCIsIHZlcnNpb24pOwo+PiAr ICAgICAgZ290byBjbGVhbnVwX3NpZ25lZF9wYXJ0Owo+PiArICAgIH0KPj4gKwo+PiArICAvKgo+ PiArICAgKiBkaWdlc3RBbGdvcml0aG1zIERpZ2VzdEFsZ29yaXRobUlkZW50aWZpZXJzCj4+ICsg ICAqCj4+ICsgICAqIERpZ2VzdEFsZ29yaXRobUlkZW50aWZpZXJzIDo6PSBTRVQgT0YgRGlnZXN0 QWxnb3JpdGhtSWRlbnRpZmllcgo+PiArICAgKiBEaWdlc3RBbGdvcml0aG1JZGVudGlmZXIgaXMg YW4gWC41MDkgQWxnb3JpdGhtSWRlbnRpZmllciAKPj4gKDEwLjEuMSkKPj4gKyAgICoKPj4gKyAg ICogUkZDIDQwNTUgcyAyLjE6Cj4+ICsgICAqIHNoYTI1NklkZW50aWZpZXIgIEFsZ29yaXRobUlk ZW50aWZpZXIgIDo6PSAgeyBpZC1zaGEyNTYsIE5VTEwgfQo+PiArICAgKiBzaGE1MTJJZGVudGlm aWVyICBBbGdvcml0aG1JZGVudGlmaWVyICA6Oj0gIHsgaWQtc2hhNTEyLCBOVUxMIH0KPj4gKyAg ICoKPj4gKyAgICogV2Ugb25seSBzdXBwb3J0IDEgZWxlbWVudCBpbiB0aGUgc2V0LCBhbmQgd2Ug ZG8gbm90IGNoZWNrIAo+PiBwYXJhbWV0ZXJzIGF0bS4KPj4gKyAgICovCj4+ICsgIHJlcyA9IGFz bjFfbnVtYmVyX29mX2VsZW1lbnRzIChzaWduZWRfcGFydCwgImRpZ2VzdEFsZ29yaXRobXMiLCAK Pj4gJmFsZ29fY291bnQpOwo+PiArICBpZiAocmVzICE9IEFTTjFfU1VDQ0VTUykKPj4gKyAgICB7 Cj4+ICsgICAgICBlcnIgPSBncnViX2Vycm9yIChHUlVCX0VSUl9CQURfU0lHTkFUVVJFLCAiRXJy b3IgY291bnRpbmcKPj4gbnVtYmVyIG9mIGRpZ2VzdCBhbGdvcml0aG1zOiAlcyIsCj4+ICsgICAg ICAgICAgICAgICAgICAgICAgICBhc24xX3N0cmVycm9yIChyZXMpKTsKPj4gKyAgICAgIGdvdG8g Y2xlYW51cF9zaWduZWRfcGFydDsKPj4gKyAgICB9Cj4+ICsKPj4gKyAgaWYgKGFsZ29fY291bnQg PD0gMCkKPj4gKyAgICB7Cj4+ICsgICAgICBlcnIgPSBncnViX2Vycm9yIChHUlVCX0VSUl9CQURf U0lHTkFUVVJFLAo+PiArICAgICAgICAgICAgICAgICAgICAgICAgIkEgbWluaW11bSBvZiAxIGRp Z2VzdCBhbGdvcml0aG0gaXMgCj4+IHJlcXVpcmVkIik7Cj4+ICsgICAgICBnb3RvIGNsZWFudXBf c2lnbmVkX3BhcnQ7Cj4+ICsgICAgfQo+PiArCj4+ICsgIGlmIChhbGdvX2NvdW50ID4gMikKPj4g KyAgICB7Cj4+ICsgICAgICBlcnIgPSBncnViX2Vycm9yIChHUlVCX0VSUl9OT1RfSU1QTEVNRU5U RURfWUVULAo+PiArICAgICAgICAgICAgICAgICAgICAgICAgIkEgbWF4aW11bSBvZiAyIGRpZ2Vz dCBhbGdvcml0aG1zIGFyZSAKPj4gc3VwcG9ydGVkIik7Cj4+ICsgICAgICBnb3RvIGNsZWFudXBf c2lnbmVkX3BhcnQ7Cj4+ICsgICAgfQo+PiArCj4+ICsgIHNoYTI1Nl9pbl9kYSA9IGZhbHNlOwo+ PiArICBzaGE1MTJfaW5fZGEgPSBmYWxzZTsKPj4gKwo+PiArICBmb3IgKGkgPSAwOyBpIDwgYWxn b19jb3VudDsgaSsrKQo+PiArICAgIHsKPj4gKyAgICAgIGRhX3BhdGggPSBncnViX3hhc3ByaW50 ZiAoImRpZ2VzdEFsZ29yaXRobXMuPyVkLmFsZ29yaXRobSIsIGkgKyAKPj4gMSk7Cj4+ICsgICAg ICBpZiAoIWRhX3BhdGgpCj4+ICsgICAgICAgIHsKPj4gKyAgICAgICAgICBlcnIgPSBncnViX2Vy cm9yIChHUlVCX0VSUl9PVVRfT0ZfTUVNT1JZLAo+PiArICAgICAgICAgICAgICAgICAgICAgICAg ICAgICJDb3VsZCBub3QgYWxsb2NhdGUgcGF0aCBmb3IgZGlnZXN0IAo+PiBhbGdvcml0aG0gIgo+ PiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwYXJzaW5nIHBhdGgiKTsKPj4gKyAgICAg ICAgICBnb3RvIGNsZWFudXBfc2lnbmVkX3BhcnQ7Cj4+ICsgICAgICAgIH0KPj4gKwo+PiArICAg ICAgYWxnb19vaWRfc2l6ZSA9IHNpemVvZiAoYWxnb19vaWQpOwo+PiArICAgICAgcmVzID0gYXNu MV9yZWFkX3ZhbHVlIChzaWduZWRfcGFydCwgZGFfcGF0aCwgYWxnb19vaWQsIAo+PiAmYWxnb19v aWRfc2l6ZSk7Cj4+ICsgICAgICBpZiAocmVzICE9IEFTTjFfU1VDQ0VTUykKPj4gKyAgICAgICAg ewo+PiArICAgICAgICAgIGVyciA9IGdydWJfZXJyb3IgKEdSVUJfRVJSX0JBRF9TSUdOQVRVUkUs ICJFcnJvciByZWFkaW5nCj4+IGRpZ2VzdCBhbGdvcml0aG06ICVzIiwKPj4gKyAgICAgICAgICAg ICAgICAgICAgICAgICAgICBhc24xX3N0cmVycm9yIChyZXMpKTsKPj4gKyAgICAgICAgICBncnVi X2ZyZWUgKGRhX3BhdGgpOwo+PiArICAgICAgICAgIGdvdG8gY2xlYW51cF9zaWduZWRfcGFydDsK Pj4gKyAgICAgICAgfQo+PiArCj4+ICsgICAgICBpZiAoZ3J1Yl9zdHJuY21wIChzaGE1MTJfb2lk LCBhbGdvX29pZCwgYWxnb19vaWRfc2l6ZSkgPT0gMCkKPj4gKyAgICAgICAgewo+PiArICAgICAg ICAgIGlmICghc2hhNTEyX2luX2RhKQo+PiArICAgICAgICAgICAgewo+PiArICAgICAgICAgICAg ICBzaGE1MTJfaW5fZGEgPSB0cnVlOwo+PiArICAgICAgICAgICAgfQo+PiArICAgICAgICAgIGVs c2UKPj4gKyAgICAgICAgICAgIHsKPj4gKyAgICAgICAgICAgICAgZXJyID0gZ3J1Yl9lcnJvciAo R1JVQl9FUlJfQkFEX1NJR05BVFVSRSwKPj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgIlNIQS01MTIgc3BlY2lmaWVkIHR3aWNlIGluIGRpZ2VzdCAKPj4gYWxnb3JpdGhtICIKPj4g KyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImxpc3QiKTsKPj4gKyAgICAgICAgICAg ICAgZ3J1Yl9mcmVlIChkYV9wYXRoKTsKPj4gKyAgICAgICAgICAgICAgZ290byBjbGVhbnVwX3Np Z25lZF9wYXJ0Owo+PiArICAgICAgICAgICAgfQo+PiArICAgICAgICB9Cj4+ICsgICAgICBlbHNl IGlmIChncnViX3N0cm5jbXAgKHNoYTI1Nl9vaWQsIGFsZ29fb2lkLCBhbGdvX29pZF9zaXplKSA9 PSAKPj4gMCkKPj4gKyAgICAgICAgewo+PiArICAgICAgICAgIGlmICghc2hhMjU2X2luX2RhKQo+ PiArICAgICAgICAgICAgewo+PiArICAgICAgICAgICAgICBzaGEyNTZfaW5fZGEgPSB0cnVlOwo+ PiArICAgICAgICAgICAgfQo+PiArICAgICAgICAgIGVsc2UKPj4gKyAgICAgICAgICAgIHsKPj4g KyAgICAgICAgICAgICAgZXJyID0gZ3J1Yl9lcnJvciAoR1JVQl9FUlJfQkFEX1NJR05BVFVSRSwK Pj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNIQS0yNTYgc3BlY2lmaWVkIHR3 aWNlIGluIGRpZ2VzdCAKPj4gYWxnb3JpdGhtICIKPj4gKyAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgImxpc3QiKTsKPj4gKyAgICAgICAgICAgICAgZ3J1Yl9mcmVlIChkYV9wYXRoKTsK Pj4gKyAgICAgICAgICAgICAgZ290byBjbGVhbnVwX3NpZ25lZF9wYXJ0Owo+PiArICAgICAgICAg ICAgfQo+PiArICAgICAgICB9Cj4+ICsgICAgICBlbHNlCj4+ICsgICAgICAgIHsKPj4gKyAgICAg ICAgICBlcnIgPSBncnViX2Vycm9yIChHUlVCX0VSUl9OT1RfSU1QTEVNRU5URURfWUVULCAiT25s eQo+PiBTSEEtMjU2IGFuZCBTSEEtNTEyIGhhc2hlcyBhcmUgc3VwcG9ydGVkLCBmb3VuZCBPSUQg JXMiLAo+PiArICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsZ29fb2lkKTsKPj4gKyAgICAg ICAgICBncnViX2ZyZWUgKGRhX3BhdGgpOwo+PiArICAgICAgICAgIGdvdG8gY2xlYW51cF9zaWdu ZWRfcGFydDsKPj4gKyAgICAgICAgfQo+PiArCj4+ICsgICAgICBncnViX2ZyZWUgKGRhX3BhdGgp Owo+PiArICAgIH0KPj4gKwo+PiArICAvKiBhdCB0aGlzIHBvaW50LCBhdCBsZWFzdCBvbmUgb2Yg c2hhezI1Niw1MTJ9X2luX2RhIG11c3QgYmUgdHJ1ZSAKPj4gKi8KPj4gKwo+PiArICAvKgo+PiAr ICAgKiBXZSBpZ25vcmUgdGhlIGNlcnRpZmljYXRlcywgYnV0IHdlIGRvbid0IHBlcm1pdCBDUkxz Lgo+PiArICAgKiBBIENSTCBlbnRyeSBtaWdodCBiZSByZXZva2luZyB0aGUgY2VydGlmaWNhdGUg d2UncmUgdXNpbmcsIGFuZCAKPj4gd2UgaGF2ZQo+PiArICAgKiBubyB3YXkgb2YgZGVhbGluZyB3 aXRoIHRoYXQgYXQgdGhlIG1vbWVudC4KPj4gKyAgICovCj4+ICsgIHJlcyA9IGFzbjFfcmVhZF92 YWx1ZSAoc2lnbmVkX3BhcnQsICJjcmxzIiwgTlVMTCwgJmNybHNfc2l6ZSk7Cj4+ICsgIGlmIChy ZXMgIT0gQVNOMV9FTEVNRU5UX05PVF9GT1VORCkKPj4gKyAgICB7Cj4+ICsgICAgICBlcnIgPSBn cnViX2Vycm9yIChHUlVCX0VSUl9OT1RfSU1QTEVNRU5URURfWUVULAo+PiArICAgICAgICAgICAg ICAgICAgICAgICAgIlBLQ1MjNyBtZXNzYWdlcyB3aXRoIGVtYmVkZGVkIENSTHMgYXJlIG5vdAo+ PiBzdXBwb3J0ZWQiKTsKPj4gKyAgICAgIGdvdG8gY2xlYW51cF9zaWduZWRfcGFydDsKPj4gKyAg ICB9Cj4+ICsKPj4gKyAgLyogcmVhZCB0aGUgc2lnbmF0dXJlcyAqLwo+PiArCj4+ICsgIHJlcyA9 IGFzbjFfbnVtYmVyX29mX2VsZW1lbnRzIChzaWduZWRfcGFydCwgInNpZ25lckluZm9zIiwgCj4+ ICZzaWduZXJfY291bnQpOwo+PiArICBpZiAocmVzICE9IEFTTjFfU1VDQ0VTUykKPj4gKyAgICB7 Cj4+ICsgICAgICBlcnIgPSBncnViX2Vycm9yIChHUlVCX0VSUl9CQURfU0lHTkFUVVJFLCAiRXJy b3IgY291bnRpbmcKPj4gbnVtYmVyIG9mIHNpZ25lcnM6ICVzIiwKPj4gKyAgICAgICAgICAgICAg ICAgICAgICAgIGFzbjFfc3RyZXJyb3IgKHJlcykpOwo+PiArICAgICAgZ290byBjbGVhbnVwX3Np Z25lZF9wYXJ0Owo+PiArICAgIH0KPj4gKwo+PiArICBpZiAoc2lnbmVyX2NvdW50IDw9IDApCj4+ ICsgICAgewo+PiArICAgICAgZXJyID0gZ3J1Yl9lcnJvciAoR1JVQl9FUlJfQkFEX1NJR05BVFVS RSwKPj4gKyAgICAgICAgICAgICAgICAgICAgICAgICJBIG1pbmltdW0gb2YgMSBzaWduZXIgaXMg cmVxdWlyZWQiKTsKPj4gKyAgICAgIGdvdG8gY2xlYW51cF9zaWduZWRfcGFydDsKPj4gKyAgICB9 Cj4+ICsKPj4gKyAgbXNnLT5zaWduZXJJbmZvcyA9IGdydWJfY2FsbG9jIChzaWduZXJfY291bnQs IHNpemVvZiAoc3RydWN0Cj4+IHBrY3M3X3NpZ25lckluZm8pKTsKPj4gKyAgaWYgKCFtc2ctPnNp Z25lckluZm9zKQo+PiArICAgIHsKPj4gKyAgICAgIGVyciA9IGdydWJfZXJyb3IgKEdSVUJfRVJS X09VVF9PRl9NRU1PUlksCj4+ICsgICAgICAgICAgICAgICAgICAgICAgICAiQ291bGQgbm90IGFs bG9jYXRlIHNwYWNlIGZvciAlZCBzaWduZXJzIiwKPj4gc2lnbmVyX2NvdW50KTsKPj4gKyAgICAg IGdvdG8gY2xlYW51cF9zaWduZWRfcGFydDsKPj4gKyAgICB9Cj4+ICsKPj4gKyAgbXNnLT5zaWdu ZXJJbmZvX2NvdW50ID0gMDsKPj4gKyAgZm9yIChpID0gMDsgaSA8IHNpZ25lcl9jb3VudDsgaSsr KQo+PiArICAgIHsKPj4gKyAgICAgIHNpX2RhX3BhdGggPSBncnViX3hhc3ByaW50Zgo+PiAoInNp Z25lckluZm9zLj8lZC5kaWdlc3RBbGdvcml0aG0uYWxnb3JpdGhtIiwgaSArIDEpOwo+PiArICAg ICAgaWYgKCFzaV9kYV9wYXRoKQo+PiArICAgICAgICB7Cj4+ICsgICAgICAgICAgZXJyID0gZ3J1 Yl9lcnJvciAoR1JVQl9FUlJfT1VUX09GX01FTU9SWSwgIkNvdWxkIG5vdAo+PiBhbGxvY2F0ZSBw YXRoIGZvciBzaWduZXIgJWQncyBkaWdlc3QgYWxnb3JpdGhtIHBhcnNpbmcgcGF0aCIsCj4+ICsg ICAgICAgICAgICAgICAgICAgICAgICAgICAgaSk7Cj4+ICsgICAgICAgICAgZ290byBjbGVhbnVw X3NpZ25lckluZm9zOwo+PiArICAgICAgICB9Cj4+ICsKPj4gKyAgICAgIGFsZ29fb2lkX3NpemUg PSBzaXplb2YgKGFsZ29fb2lkKTsKPj4gKyAgICAgIHJlcyA9IGFzbjFfcmVhZF92YWx1ZSAoc2ln bmVkX3BhcnQsIHNpX2RhX3BhdGgsIGFsZ29fb2lkLAo+PiAmYWxnb19vaWRfc2l6ZSk7Cj4+ICsg ICAgICBpZiAocmVzICE9IEFTTjFfU1VDQ0VTUykKPj4gKyAgICAgICAgewo+PiArICAgICAgICAg IGVyciA9IGdydWJfZXJyb3IgKEdSVUJfRVJSX0JBRF9TSUdOQVRVUkUsCj4+ICsgICAgICAgICAg ICAgICAgICAgICAgICAgICAgIkVycm9yIHJlYWRpbmcgc2lnbmVyICVkJ3MgZGlnZXN0Cj4+IGFs Z29yaXRobTogJXMiLCBpLAo+PiArICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzbjFfc3Ry ZXJyb3IgKHJlcykpOwo+PiArICAgICAgICAgIGdydWJfZnJlZSAoc2lfZGFfcGF0aCk7Cj4+ICsg ICAgICAgICAgZ290byBjbGVhbnVwX3NpZ25lckluZm9zOwo+PiArICAgICAgICB9Cj4+ICsKPj4g KyAgICAgIGdydWJfZnJlZSAoc2lfZGFfcGF0aCk7Cj4+ICsKPj4gKyAgICAgIGlmIChncnViX3N0 cm5jbXAgKHNoYTUxMl9vaWQsIGFsZ29fb2lkLCBhbGdvX29pZF9zaXplKSA9PSAwKQo+PiArICAg ICAgICB7Cj4+ICsgICAgICAgICAgaWYgKCFzaGE1MTJfaW5fZGEpCj4+ICsgICAgICAgICAgICB7 Cj4+ICsgICAgICAgICAgICAgIGVyciA9IGdydWJfZXJyb3IgKEdSVUJfRVJSX0JBRF9TSUdOQVRV UkUsICJTaWduZXIgJWQKPj4gY2xhaW1zIGEgU0hBLTUxMiBzaWduYXR1cmUgIgo+PiArICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAid2hpY2ggd2FzIG5vdCBzcGVjaWZpZWQgaW4gdGhl IG91dGVyCj4+IERpZ2VzdEFsZ29yaXRobXMiLCBpKTsKPj4gKyAgICAgICAgICAgICAgZ290byBj bGVhbnVwX3NpZ25lckluZm9zOwo+PiArICAgICAgICAgICAgfQo+PiArICAgICAgICAgIGVsc2UK Pj4gKyAgICAgICAgICAgIHsKPj4gKyAgICAgICAgICAgICAgc2hhNTEyX2luX3NpID0gdHJ1ZTsK Pj4gKyAgICAgICAgICAgICAgbXNnLT5zaWduZXJJbmZvc1tpXS5oYXNoID0KPj4gKyAgICAgICAg ICAgICAgICAgICAgICBncnViX2NyeXB0b19sb29rdXBfbWRfYnlfbmFtZSAoInNoYTUxMiIpOwo+ PiArICAgICAgICAgICAgfQo+PiArICAgICAgICB9Cj4+ICsgICAgICBlbHNlIGlmIChncnViX3N0 cm5jbXAgKHNoYTI1Nl9vaWQsIGFsZ29fb2lkLCBhbGdvX29pZF9zaXplKSA9PSAKPj4gMCkKPj4g KyAgICAgICAgewo+PiArICAgICAgICAgIGlmICghc2hhMjU2X2luX2RhKQo+PiArICAgICAgICAg ICAgewo+PiArICAgICAgICAgICAgICBlcnIgPSBncnViX2Vycm9yIChHUlVCX0VSUl9CQURfU0lH TkFUVVJFLCAiU2lnbmVyICVkCj4+IGNsYWltcyBhIFNIQS0yNTYgc2lnbmF0dXJlICIKPj4gKyAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIndoaWNoIHdhcyBub3Qgc3BlY2lmaWVkIGlu IHRoZSBvdXRlcgo+PiBEaWdlc3RBbGdvcml0aG1zIiwgaSk7Cj4+ICsgICAgICAgICAgICAgIGdv dG8gY2xlYW51cF9zaWduZXJJbmZvczsKPj4gKyAgICAgICAgICAgIH0KPj4gKyAgICAgICAgICBl bHNlCj4+ICsgICAgICAgICAgICB7Cj4+ICsgICAgICAgICAgICAgIHNoYTI1Nl9pbl9zaSA9IHRy dWU7Cj4+ICsgICAgICAgICAgICAgIG1zZy0+c2lnbmVySW5mb3NbaV0uaGFzaCA9Cj4+ICsgICAg ICAgICAgICAgICAgICAgICAgZ3J1Yl9jcnlwdG9fbG9va3VwX21kX2J5X25hbWUgKCJzaGEyNTYi KTsKPj4gKyAgICAgICAgICAgIH0KPj4gKyAgICAgICAgfQo+PiArICAgICAgZWxzZQo+PiArICAg ICAgICB7Cj4+ICsgICAgICAgICAgZXJyID0gZ3J1Yl9lcnJvciAoR1JVQl9FUlJfTk9UX0lNUExF TUVOVEVEX1lFVCwKPj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiT25seSBTSEEtMjU2 IGFuZCBTSEEtNTEyIGhhc2hlcyBhcmUKPj4gc3VwcG9ydGVkLCBmb3VuZCBPSUQgJXMiLAo+PiAr ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsZ29fb2lkKTsKPj4gKyAgICAgICAgICBnb3Rv IGNsZWFudXBfc2lnbmVySW5mb3M7Cj4+ICsgICAgICAgIH0KPj4gKwo+PiArICAgICAgaWYgKCFt c2ctPnNpZ25lckluZm9zW2ldLmhhc2gpCj4+ICsgICAgICAgIHsKPj4gKyAgICAgICAgICBlcnIg PSBncnViX2Vycm9yIChHUlVCX0VSUl9CQURfU0lHTkFUVVJFLAo+PiArICAgICAgICAgICAgICAg ICAgICAgICAgICAgICJIYXNoIGFsZ29yaXRobSBmb3Igc2lnbmVyICVkIChPSUQgJXMpCj4+IG5v dCBsb2FkZWQiLCBpLCBhbGdvX29pZCk7Cj4+ICsgICAgICAgICAgZ290byBjbGVhbnVwX3NpZ25l ckluZm9zOwo+PiArICAgICAgICB9Cj4+ICsKPj4gKyAgICAgIHNpX3NpZ19wYXRoID0gZ3J1Yl94 YXNwcmludGYgKCJzaWduZXJJbmZvcy4/JWQuc2lnbmF0dXJlIiwgaSArIAo+PiAxKTsKPj4gKyAg ICAgIGlmICghc2lfc2lnX3BhdGgpCj4+ICsgICAgICAgIHsKPj4gKyAgICAgICAgICBlcnIgPSBn cnViX2Vycm9yIChHUlVCX0VSUl9PVVRfT0ZfTUVNT1JZLAo+PiArICAgICAgICAgICAgICAgICAg ICAgICAgICAgICJDb3VsZCBub3QgYWxsb2NhdGUgcGF0aCBmb3Igc2lnbmVyICVkJ3MKPj4gc2ln bmF0dXJlIHBhcnNpbmcgcGF0aCIsIGkpOwo+PiArICAgICAgICAgIGdvdG8gY2xlYW51cF9zaWdu ZXJJbmZvczsKPj4gKyAgICAgICAgfQo+PiArCj4+ICsgICAgICByZXN1bHRfYnVmID0gZ3J1Yl9h c24xX2FsbG9jYXRlX2FuZF9yZWFkIChzaWduZWRfcGFydCwgCj4+IHNpX3NpZ19wYXRoLAo+PiAr ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNpZ25hdHVy ZSBkYXRhIiwKPj4gJnJlc3VsdF9zaXplKTsKPj4gKyAgICAgIGdydWJfZnJlZSAoc2lfc2lnX3Bh dGgpOwo+PiArCj4+ICsgICAgICBpZiAoIXJlc3VsdF9idWYpCj4+ICsgICAgICAgIHsKPj4gKyAg ICAgICAgICBlcnIgPSBncnViX2Vycm5vOwo+PiArICAgICAgICAgIGdvdG8gY2xlYW51cF9zaWdu ZXJJbmZvczsKPj4gKyAgICAgICAgfQo+PiArCj4+ICsgICAgICBnY3J5X2VyciA9IGdjcnlfbXBp X3NjYW4gKCYobXNnLT5zaWduZXJJbmZvc1tpXS5zaWdfbXBpKSwKPj4gR0NSWU1QSV9GTVRfVVNH LAo+PiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRfYnVmLCByZXN1bHRf c2l6ZSwgTlVMTCk7Cj4+ICsKPj4gKyAgICAgIGdydWJfZnJlZSAocmVzdWx0X2J1Zik7Cj4+ICsK Pj4gKyAgICAgIGlmIChnY3J5X2VyciAhPSBHUEdfRVJSX05PX0VSUk9SKQo+PiArICAgICAgICB7 Cj4+ICsgICAgICAgICAgZXJyID0gZ3J1Yl9lcnJvciAoR1JVQl9FUlJfQkFEX1NJR05BVFVSRSwK Pj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRXJyb3IgbG9hZGluZyBzaWduYXR1cmUg JWQgaW50byBNUEkKPj4gc3RydWN0dXJlOiAlZCIsCj4+ICsgICAgICAgICAgICAgICAgICAgICAg ICAgICAgaSwgZ2NyeV9lcnIpOwo+PiArICAgICAgICAgIGdvdG8gY2xlYW51cF9zaWduZXJJbmZv czsKPj4gKyAgICAgICAgfQo+PiArCj4+ICsgICAgICAvKgo+PiArICAgICAgICogdXNlIG1zZy0+ c2lnbmVySW5mb19jb3VudCB0byB0cmFjayBmdWxseSBwb3B1bGF0ZWQgCj4+IHNpZ25lckluZm9z IHNvIHdlCj4+ICsgICAgICAgKiBrbm93IGhvdyBtYW55IHdlIG5lZWQgdG8gY2xlYW4gdXAKPj4g KyAgICAgICAqLwo+PiArICAgICAgbXNnLT5zaWduZXJJbmZvX2NvdW50Kys7Cj4+ICsgICAgfQo+ PiArCj4+ICsgIC8qCj4+ICsgICAqIEZpbmFsIGNvbnNpc3RlbmN5IGNoZWNrIG9mIHNpZ25lcklu Zm8uKi5kaWdlc3RBbGdvcml0aG0gdnMKPj4gKyAgICogZGlnZXN0QWxnb3JpdGhtcy4qLmFsZ29y aXRobS4gQW4gYWxnb3JpdGhtIG11c3QgYmUgcHJlc2VudCBpbiAKPj4gYm90aAo+PiArICAgKiBk aWdlc3RBbGdvcml0aG1zIGFuZCBzaWduZXJJbmZvIG9yIGluIG5laXRoZXIuIFdlIGhhdmUgYWxy ZWFkeSAKPj4gY2hlY2tlZAo+PiArICAgKiBmb3IgYW4gYWxnb3JpdGhtIGluIHNpZ25lckluZm8g dGhhdCBpcyBub3QgaW4gZGlnZXN0QWxnb3JpdGhtcywgCj4+IGhlcmUgd2UKPj4gKyAgICogY2hl Y2sgZm9yIGFsZ29yaXRobXMgaW4gZGlnZXN0QWxnb3JpdGhtcyBidXQgbm90IGluIHNpZ25lcklu Zm9zLgo+PiArICAgKi8KPj4gKyAgaWYgKHNoYTUxMl9pbl9kYSAmJiAhc2hhNTEyX2luX3NpKQo+ PiArICAgIHsKPj4gKyAgICAgIGVyciA9IGdydWJfZXJyb3IgKEdSVUJfRVJSX0JBRF9TSUdOQVRV UkUsCj4+ICsgICAgICAgICAgICAgICAgICAgICAgICAiU0hBLTUxMiBzcGVjaWZpZWQgaW4gRGln ZXN0QWxnb3JpdGhtcyBidXQgCj4+IGRpZCBub3QgIgo+PiArICAgICAgICAgICAgICAgICAgICAg ICAgImFwcGVhciBpbiBTaWduZXJJbmZvcyIpOwo+PiArICAgICAgZ290byBjbGVhbnVwX3NpZ25l ckluZm9zOwo+PiArICAgIH0KPj4gKwo+PiArICBpZiAoc2hhMjU2X2luX2RhICYmICFzaGEyNTZf aW5fc2kpCj4+ICsgICAgewo+PiArICAgICAgZXJyID0gZ3J1Yl9lcnJvciAoR1JVQl9FUlJfQkFE X1NJR05BVFVSRSwKPj4gKyAgICAgICAgICAgICAgICAgICAgICAgICJTSEEtMjU2IHNwZWNpZmll ZCBpbiBEaWdlc3RBbGdvcml0aG1zIGJ1dCAKPj4gZGlkIG5vdCAiCj4+ICsgICAgICAgICAgICAg ICAgICAgICAgICAiYXBwZWFyIGluIFNpZ25lckluZm9zIik7Cj4+ICsgICAgICBnb3RvIGNsZWFu dXBfc2lnbmVySW5mb3M7Cj4+ICsgICAgfQo+PiArCj4+ICsgIGFzbjFfZGVsZXRlX3N0cnVjdHVy ZSAoJnNpZ25lZF9wYXJ0KTsKPj4gKyAgcmV0dXJuIEdSVUJfRVJSX05PTkU7Cj4+ICsKPj4gK2Ns ZWFudXBfc2lnbmVySW5mb3M6Cj4+ICsgIGZvciAoaSA9IDA7IGkgPCBtc2ctPnNpZ25lckluZm9f Y291bnQ7IGkrKykKPj4gKyAgICBnY3J5X21waV9yZWxlYXNlIChtc2ctPnNpZ25lckluZm9zW2ld LnNpZ19tcGkpOwo+PiArICBncnViX2ZyZWUgKG1zZy0+c2lnbmVySW5mb3MpOwo+PiArY2xlYW51 cF9zaWduZWRfcGFydDoKPj4gKyAgYXNuMV9kZWxldGVfc3RydWN0dXJlICgmc2lnbmVkX3BhcnQp Owo+PiArICByZXR1cm4gZXJyOwo+PiArfQo+PiArCj4+ICtncnViX2Vycl90Cj4+ICtwYXJzZV9w a2NzN19zaWduZWREYXRhIChjb25zdCB2b2lkICpzaWdidWYsIGdydWJfc2l6ZV90IGRhdGFfc2l6 ZSwKPj4gc3RydWN0IHBrY3M3X3NpZ25lZERhdGEgKm1zZykKPj4gK3sKPj4gKyAgaW50IHJlczsK Pj4gKyAgYXNuMV9ub2RlIGNvbnRlbnRfaW5mbzsKPj4gKyAgZ3J1Yl9lcnJfdCBlcnIgPSBHUlVC X0VSUl9OT05FOwo+PiArICBjaGFyIGNvbnRlbnRfb2lkW01BWF9PSURfTEVOXTsKPj4gKyAgZ3J1 Yl91aW50OF90ICpjb250ZW50Owo+PiArICBpbnQgY29udGVudF9zaXplOwo+PiArICBpbnQgY29u dGVudF9vaWRfc2l6ZSA9IHNpemVvZiAoY29udGVudF9vaWQpOwo+PiArICBpbnQgc2l6ZTsKPj4g Kwo+PiArICBpZiAoZGF0YV9zaXplID4gR1JVQl9JTlRfTUFYKQo+PiArICAgIHJldHVybiBncnVi X2Vycm9yIChHUlVCX0VSUl9PVVRfT0ZfUkFOR0UsICJDYW5ub3QgcGFyc2UgYSBQS0NTIzcgCj4+ IG1lc3NhZ2UgIgo+PiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICJ3aGVyZSBkYXRhIHNpemUgPiAKPj4gSU5UX01BWCIpOwo+PiArICBzaXplID0gKGludCkg ZGF0YV9zaXplOwo+PiArCj4+ICsgIHJlcyA9IGFzbjFfY3JlYXRlX2VsZW1lbnQgKF9nbnV0bHNf cGtpeF9hc24sCj4+ICJQS0lYMS5wa2NzLTctQ29udGVudEluZm8iLCAmY29udGVudF9pbmZvKTsK Pj4gKyAgaWYgKHJlcyAhPSBBU04xX1NVQ0NFU1MpCj4+ICsgICAgewo+PiArICAgICAgcmV0dXJu IGdydWJfZXJyb3IgKEdSVUJfRVJSX09VVF9PRl9NRU1PUlksCj4+ICsgICAgICAgICAgICAgICAg ICAgICAgICAgIkNvdWxkIG5vdCBjcmVhdGUgQVNOLjEgc3RydWN0dXJlIGZvciBQS0NTIzcKPj4g ZGF0YTogJXMiLAo+PiArICAgICAgICAgICAgICAgICAgICAgICAgIGFzbjFfc3RyZXJyb3IgKHJl cykpOwo+PiArICAgIH0KPj4gKwo+PiArICByZXMgPSBhc24xX2Rlcl9kZWNvZGluZzIgKCZjb250 ZW50X2luZm8sIHNpZ2J1ZiwgJnNpemUsCj4+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAg QVNOMV9ERUNPREVfRkxBR19TVFJJQ1RfREVSIHwKPj4gQVNOMV9ERUNPREVfRkxBR19BTExPV19Q QURESU5HLAo+PiArICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzbjFfZXJyb3IpOwo+PiAr ICBpZiAocmVzICE9IEFTTjFfU1VDQ0VTUykKPj4gKyAgICB7Cj4+ICsgICAgICBlcnIgPSBncnVi X2Vycm9yIChHUlVCX0VSUl9CQURfU0lHTkFUVVJFLAo+PiArICAgICAgICAgICAgICAgICAgICAg ICAgIkVycm9yIGRlY29kaW5nIFBLQ1MjNyBtZXNzYWdlIERFUjogJXMiLCAKPj4gYXNuMV9lcnJv cik7Cj4+ICsgICAgICBnb3RvIGNsZWFudXA7Cj4+ICsgICAgfQo+PiArCj4+ICsgIC8qCj4+ICsg ICAqIENvbnRlbnRJbmZvIDo6PSBTRVFVRU5DRSB7Cj4+ICsgICAqICAgICBjb250ZW50VHlwZSBD b250ZW50VHlwZSwKPj4gKyAgICogICAgIGNvbnRlbnQgWzBdIEVYUExJQ0lUIEFOWSBERUZJTkVE IEJZIGNvbnRlbnRUeXBlIH0KPj4gKyAgICoKPj4gKyAgICogQ29udGVudFR5cGUgOjo9IE9CSkVD VCBJREVOVElGSUVSCj4+ICsgICAqLwo+PiArICByZXMgPSBhc24xX3JlYWRfdmFsdWUgKGNvbnRl bnRfaW5mbywgImNvbnRlbnRUeXBlIiwgY29udGVudF9vaWQsCj4+ICZjb250ZW50X29pZF9zaXpl KTsKPj4gKyAgaWYgKHJlcyAhPSBBU04xX1NVQ0NFU1MpCj4+ICsgICAgewo+PiArICAgICAgZXJy ID0gZ3J1Yl9lcnJvciAoR1JVQl9FUlJfQkFEX1NJR05BVFVSRSwgIkVycm9yIHJlYWRpbmcgUEtD UyM3Cj4+IGNvbnRlbnQgdHlwZTogJXMiLAo+PiArICAgICAgICAgICAgICAgICAgICAgICAgYXNu MV9zdHJlcnJvciAocmVzKSk7Cj4+ICsgICAgICBnb3RvIGNsZWFudXA7Cj4+ICsgICAgfQo+PiAr Cj4+ICsgIC8qIE9JRCBmb3IgU2lnbmVkRGF0YSBkZWZpbmVkIGluIDUuMSAqLwo+PiArICBpZiAo Z3J1Yl9zdHJuY21wIChzaWduZWREYXRhX29pZCwgY29udGVudF9vaWQsIGNvbnRlbnRfb2lkX3Np emUpICE9IAo+PiAwKQo+PiArICAgIHsKPj4gKyAgICAgIGVyciA9IGdydWJfZXJyb3IgKEdSVUJf RVJSX0JBRF9TSUdOQVRVUkUsCj4+ICsgICAgICAgICAgICAgICAgICAgICAgICAiVW5leHBlY3Rl ZCBjb250ZW50IHR5cGUgaW4gUEtDUyM3IG1lc3NhZ2U6Cj4+IE9JRCAlcyIsIGNvbnRlbnRfb2lk KTsKPj4gKyAgICAgIGdvdG8gY2xlYW51cDsKPj4gKyAgICB9Cj4+ICsKPj4gKyAgY29udGVudCA9 IGdydWJfYXNuMV9hbGxvY2F0ZV9hbmRfcmVhZCAoY29udGVudF9pbmZvLCAiY29udGVudCIsCj4+ ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJQS0NTIzcgbWVzc2Fn ZSBjb250ZW50IiwKPj4gJmNvbnRlbnRfc2l6ZSk7Cj4+ICsgIGlmICghY29udGVudCkKPj4gKyAg ICB7Cj4+ICsgICAgICBlcnIgPSBncnViX2Vycm5vOwo+PiArICAgICAgZ290byBjbGVhbnVwOwo+ PiArICAgIH0KPj4gKwo+PiArICBlcnIgPSBwcm9jZXNzX2NvbnRlbnQgKGNvbnRlbnQsIGNvbnRl bnRfc2l6ZSwgbXNnKTsKPj4gKyAgZ3J1Yl9mcmVlIChjb250ZW50KTsKPj4gKwo+PiArY2xlYW51 cDoKPj4gKyAgYXNuMV9kZWxldGVfc3RydWN0dXJlICgmY29udGVudF9pbmZvKTsKPj4gKyAgcmV0 dXJuIGVycjsKPj4gK30KPj4gKwo+PiArLyoKPj4gKyAqIFJlbGVhc2UgYWxsIHRoZSBzdG9yYWdl IGFzc29jaWF0ZWQgd2l0aCB0aGUgUEtDUyM3IG1lc3NhZ2UuCj4+ICsgKiBJZiB0aGUgY2FsbGVy IGR5bmFtaWNhbGx5IGFsbG9jYXRlZCB0aGUgbWVzc2FnZSwgaXQgbXVzdCBmcmVlIGl0Lgo+PiAr ICovCj4+ICt2b2lkCj4+ICtwa2NzN19zaWduZWREYXRhX3JlbGVhc2UgKHN0cnVjdCBwa2NzN19z aWduZWREYXRhICptc2cpCj4+ICt7Cj4+ICsgIGdydWJfc3NpemVfdCBpOwo+PiArCj4+ICsgIGZv ciAoaSA9IDA7IGkgPCBtc2ctPnNpZ25lckluZm9fY291bnQ7IGkrKykKPj4gKyAgICB7Cj4+ICsg ICAgICBnY3J5X21waV9yZWxlYXNlIChtc2ctPnNpZ25lckluZm9zW2ldLnNpZ19tcGkpOwo+PiAr ICAgIH0KPj4gKyAgZ3J1Yl9mcmVlIChtc2ctPnNpZ25lckluZm9zKTsKPj4gK30KPj4gZGlmZiAt LWdpdCBhL2dydWItY29yZS9jb21tYW5kcy9hcHBlbmRlZHNpZy94NTA5LmMKPj4gYi9ncnViLWNv cmUvY29tbWFuZHMvYXBwZW5kZWRzaWcveDUwOS5jCj4+IG5ldyBmaWxlIG1vZGUgMTAwNjQ0Cj4+ IGluZGV4IDAwMDAwMDAwMC4uZWI5YTFjYTBmCj4+IC0tLSAvZGV2L251bGwKPj4gKysrIGIvZ3J1 Yi1jb3JlL2NvbW1hbmRzL2FwcGVuZGVkc2lnL3g1MDkuYwo+PiBAQCAtMCwwICsxLDk4MSBAQAo+ PiArLyoKPj4gKyAqICBHUlVCICAtLSAgR1JhbmQgVW5pZmllZCBCb290bG9hZGVyCj4+ICsgKiAg Q29weXJpZ2h0IChDKSAyMDIwLCAyMDIyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgo+ PiArICogIENvcHlyaWdodCAoQykgMjAyMCwgMjAyMiBJQk0gQ29ycG9yYXRpb24KPj4gKyAqCj4+ ICsgKiAgR1JVQiBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQv b3IgbW9kaWZ5Cj4+ICsgKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQ dWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgCj4+IGJ5Cj4+ICsgKiAgdGhlIEZyZWUgU29mdHdh cmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKPj4gKyAq ICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgo+PiArICoKPj4gKyAqICBHUlVC IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCj4+ICsg KiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2Fy cmFudHkgb2YKPj4gKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNV TEFSIFBVUlBPU0UuICBTZWUgdGhlCj4+ICsgKiAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2Ug Zm9yIG1vcmUgZGV0YWlscy4KPj4gKyAqCj4+ICsgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVk IGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKPj4gKyAqICBhbG9uZyB3 aXRoIEdSVUIuICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCj4+ ICsgKi8KPj4gKwo+PiArI2luY2x1ZGUgPGdydWIvbGlidGFzbjEuaD4KPj4gKyNpbmNsdWRlIDxn cnViL3R5cGVzLmg+Cj4+ICsjaW5jbHVkZSA8Z3J1Yi9lcnIuaD4KPj4gKyNpbmNsdWRlIDxncnVi L21tLmg+Cj4+ICsjaW5jbHVkZSA8Z3J1Yi9jcnlwdG8uaD4KPj4gKyNpbmNsdWRlIDxncnViL21p c2MuaD4KPj4gKyNpbmNsdWRlIDxncnViL2djcnlwdC9nY3J5cHQuaD4KPj4gKwo+PiArI2luY2x1 ZGUgImFwcGVuZGVkc2lnLmgiCj4+ICsKPj4gK3N0YXRpYyBjaGFyIGFzbjFfZXJyb3JbQVNOMV9N QVhfRVJST1JfREVTQ1JJUFRJT05fU0laRV07Cj4+ICsKPj4gKy8qCj4+ICsgKiBSRkMgMzI3OSAy LjMuMSAgUlNBIEtleXMKPj4gKyAqLwo+PiArc3RhdGljIGNvbnN0IGNoYXIgKnJzYUVuY3J5cHRp b25fb2lkID0gIjEuMi44NDAuMTEzNTQ5LjEuMS4xIjsKPj4gKwo+PiArLyoKPj4gKyAqIFJGQyA1 MjgwIEFwcGVuZGl4IEEKPj4gKyAqLwo+PiArc3RhdGljIGNvbnN0IGNoYXIgKmNvbW1vbk5hbWVf b2lkID0gIjIuNS40LjMiOwo+PiArCj4+ICsvKgo+PiArICogUkZDIDUyODAgNC4yLjEuMyBLZXkg VXNhZ2UKPj4gKyAqLwo+PiArc3RhdGljIGNvbnN0IGNoYXIgKmtleVVzYWdlX29pZCA9ICIyLjUu MjkuMTUiOwo+PiArCj4+ICtzdGF0aWMgY29uc3QgZ3J1Yl91aW50OF90IGRpZ2l0YWxTaWduYXR1 cmVVc2FnZSA9IDB4ODA7Cj4+ICsKPj4gKy8qCj4+ICsgKiBSRkMgNTI4MCA0LjIuMS45IEJhc2lj IENvbnN0cmFpbnRzCj4+ICsgKi8KPj4gK3N0YXRpYyBjb25zdCBjaGFyICpiYXNpY0NvbnN0cmFp bnRzX29pZCA9ICIyLjUuMjkuMTkiOwo+PiArCj4+ICsvKgo+PiArICogUkZDIDUyODAgNC4yLjEu MTIgRXh0ZW5kZWQgS2V5IFVzYWdlCj4+ICsgKi8KPj4gK3N0YXRpYyBjb25zdCBjaGFyICpleHRl bmRlZEtleVVzYWdlX29pZCA9ICIyLjUuMjkuMzciOwo+PiArc3RhdGljIGNvbnN0IGNoYXIgKmNv ZGVTaWduaW5nVXNhZ2Vfb2lkID0gIjEuMy42LjEuNS41LjcuMy4zIjsKPj4gKwo+PiArLyoKPj4g KyAqIFJGQyAzMjc5IDIuMy4xCj4+ICsgKgo+PiArICogIFRoZSBSU0EgcHVibGljIGtleSBNVVNU IGJlIGVuY29kZWQgdXNpbmcgdGhlIEFTTi4xIHR5cGUgCj4+IFJTQVB1YmxpY0tleToKPj4gKyAq Cj4+ICsgKiAgICAgUlNBUHVibGljS2V5IDo6PSBTRVFVRU5DRSB7Cj4+ICsgKiAgICAgICAgbW9k dWx1cyAgICAgICAgICAgIElOVEVHRVIsICAgIC0tIG4KPj4gKyAqICAgICAgICBwdWJsaWNFeHBv bmVudCAgICAgSU5URUdFUiAgfSAgLS0gZQo+PiArICoKPj4gKyAqICB3aGVyZSBtb2R1bHVzIGlz IHRoZSBtb2R1bHVzIG4sIGFuZCBwdWJsaWNFeHBvbmVudCBpcyB0aGUgcHVibGljCj4+ICsgKiAg ZXhwb25lbnQgZS4KPj4gKyAqLwo+PiArc3RhdGljIGdydWJfZXJyX3QKPj4gK2dydWJfcGFyc2Vf cnNhX3B1YmtleSAoZ3J1Yl91aW50OF90ICpkZXIsIGludCBkZXJzaXplLCBzdHJ1Y3QKPj4geDUw OV9jZXJ0aWZpY2F0ZSAqY2VydGlmaWNhdGUpCj4+ICt7Cj4+ICsgIGludCByZXN1bHQ7Cj4+ICsg IGFzbjFfbm9kZSBzcGsgPSBOVUxMOwo+PiArICBncnViX3VpbnQ4X3QgKm1fZGF0YSwgKmVfZGF0 YTsKPj4gKyAgaW50IG1fc2l6ZSwgZV9zaXplOwo+PiArICBncnViX2Vycl90IGVyciA9IEdSVUJf RVJSX05PTkU7Cj4+ICsgIGdjcnlfZXJyb3JfdCBnY3J5X2VycjsKPj4gKwo+PiArICByZXN1bHQg PSBhc24xX2NyZWF0ZV9lbGVtZW50IChfZ251dGxzX2dudXRsc19hc24sCj4+ICJHTlVUTFMuUlNB UHVibGljS2V5IiwgJnNwayk7Cj4+ICsgIGlmIChyZXN1bHQgIT0gQVNOMV9TVUNDRVNTKQo+PiAr ICAgIHsKPj4gKyAgICAgIHJldHVybiBncnViX2Vycm9yIChHUlVCX0VSUl9PVVRfT0ZfTUVNT1JZ LAo+PiArICAgICAgICAgICAgICAgICAgICAgICAgICJDYW5ub3QgY3JlYXRlIHN0b3JhZ2UgZm9y IHB1YmxpYyBrZXkgQVNOLjEgCj4+IGRhdGEiKTsKPj4gKyAgICB9Cj4+ICsKPj4gKyAgcmVzdWx0 ID0gYXNuMV9kZXJfZGVjb2RpbmcyICgmc3BrLCBkZXIsICZkZXJzaXplLAo+PiBBU04xX0RFQ09E RV9GTEFHX1NUUklDVF9ERVIsIGFzbjFfZXJyb3IpOwo+PiArICBpZiAocmVzdWx0ICE9IEFTTjFf U1VDQ0VTUykKPj4gKyAgICB7Cj4+ICsgICAgICBlcnIgPSBncnViX2Vycm9yIChHUlVCX0VSUl9C QURfRklMRV9UWVBFLAo+PiArICAgICAgICAgICAgICAgICAgICAgICAgIkNhbm5vdCBkZWNvZGUg Y2VydGlmaWNhdGUgcHVibGljIGtleSBERVI6Cj4+ICVzIiwgYXNuMV9lcnJvcik7Cj4+ICsgICAg ICBnb3RvIGNsZWFudXA7Cj4+ICsgICAgfQo+PiArCj4+ICsgIG1fZGF0YSA9IGdydWJfYXNuMV9h bGxvY2F0ZV9hbmRfcmVhZCAoc3BrLCAibW9kdWx1cyIsICJSU0EKPj4gbW9kdWx1cyIsICZtX3Np emUpOwo+PiArICBpZiAoIW1fZGF0YSkKPj4gKyAgICB7Cj4+ICsgICAgICBlcnIgPSBncnViX2Vy cm5vOwo+PiArICAgICAgZ290byBjbGVhbnVwOwo+PiArICAgIH0KPj4gKwo+PiArICBlX2RhdGEg PSBncnViX2FzbjFfYWxsb2NhdGVfYW5kX3JlYWQgKHNwaywgInB1YmxpY0V4cG9uZW50IiwKPj4g KyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUlNBIHB1YmxpYyBleHBv bmVudCIsIAo+PiAmZV9zaXplKTsKPj4gKyAgaWYgKCFlX2RhdGEpCj4+ICsgICAgewo+PiArICAg ICAgZXJyID0gZ3J1Yl9lcnJubzsKPj4gKyAgICAgIGdvdG8gY2xlYW51cF9tX2RhdGE7Cj4+ICsg ICAgfQo+PiArCj4+ICsgIC8qCj4+ICsgICAqIGNvbnZlcnQgbSwgZSB0byBtcGkKPj4gKyAgICoK Pj4gKyAgICogbnNjYW5uZWQgaXMgbm90IHNldCBmb3IgRk1UX1VTRywgaXQncyBvbmx5IHNldCBm b3IgRk1UX1BHUCwKPj4gKyAgICogc28gd2UgY2FuJ3QgdmVyaWZ5IGl0Cj4+ICsgICAqLwo+PiAr ICBnY3J5X2VyciA9IGdjcnlfbXBpX3NjYW4gKCZjZXJ0aWZpY2F0ZS0+bXBpc1swXSwgR0NSWU1Q SV9GTVRfVVNHLAo+PiBtX2RhdGEsIG1fc2l6ZSwgTlVMTCk7Cj4+ICsgIGlmIChnY3J5X2VyciAh PSBHUEdfRVJSX05PX0VSUk9SKQo+PiArICAgIHsKPj4gKyAgICAgIGVyciA9IGdydWJfZXJyb3Ig KEdSVUJfRVJSX0JBRF9GSUxFX1RZUEUsCj4+ICsgICAgICAgICAgICAgICAgICAgICAgICAiRXJy b3IgbG9hZGluZyBSU0EgbW9kdWx1cyBpbnRvIE1QSQo+PiBzdHJ1Y3R1cmU6ICVkIiwgZ2NyeV9l cnIpOwo+PiArICAgICAgZ290byBjbGVhbnVwX2VfZGF0YTsKPj4gKyAgICB9Cj4+ICsKPj4gKyAg Z2NyeV9lcnIgPSBnY3J5X21waV9zY2FuICgmY2VydGlmaWNhdGUtPm1waXNbMV0sIEdDUllNUElf Rk1UX1VTRywKPj4gZV9kYXRhLCBlX3NpemUsIE5VTEwpOwo+PiArICBpZiAoZ2NyeV9lcnIgIT0g R1BHX0VSUl9OT19FUlJPUikKPj4gKyAgICB7Cj4+ICsgICAgICBlcnIgPSBncnViX2Vycm9yIChH UlVCX0VSUl9CQURfRklMRV9UWVBFLAo+PiArICAgICAgICAgICAgICAgICAgICAgICAgIkVycm9y IGxvYWRpbmcgUlNBIGV4cG9uZW50IGludG8gTVBJCj4+IHN0cnVjdHVyZTogJWQiLCBnY3J5X2Vy cik7Cj4+ICsgICAgICBnb3RvIGNsZWFudXBfbV9tcGk7Cj4+ICsgICAgfQo+PiArCj4+ICsgIGdy dWJfZnJlZSAoZV9kYXRhKTsKPj4gKyAgZ3J1Yl9mcmVlIChtX2RhdGEpOwo+PiArICBhc24xX2Rl bGV0ZV9zdHJ1Y3R1cmUgKCZzcGspOwo+PiArICByZXR1cm4gR1JVQl9FUlJfTk9ORTsKPj4gKwo+ PiArY2xlYW51cF9tX21waToKPj4gKyAgZ2NyeV9tcGlfcmVsZWFzZSAoY2VydGlmaWNhdGUtPm1w aXNbMF0pOwo+PiArY2xlYW51cF9lX2RhdGE6Cj4+ICsgIGdydWJfZnJlZSAoZV9kYXRhKTsKPj4g K2NsZWFudXBfbV9kYXRhOgo+PiArICBncnViX2ZyZWUgKG1fZGF0YSk7Cj4+ICtjbGVhbnVwOgo+ PiArICBhc24xX2RlbGV0ZV9zdHJ1Y3R1cmUgKCZzcGspOwo+PiArICByZXR1cm4gZXJyOwo+PiAr fQo+PiArCj4+ICsvKgo+PiArICogUkZDIDUyODA6Cj4+ICsgKiAgIFN1YmplY3RQdWJsaWNLZXlJ bmZvICA6Oj0gIFNFUVVFTkNFICB7Cj4+ICsgKiAgICAgICBhbGdvcml0aG0gICAgICAgICAgICBB bGdvcml0aG1JZGVudGlmaWVyLAo+PiArICogICAgICAgc3ViamVjdFB1YmxpY0tleSAgICAgQklU IFNUUklORyAgfQo+PiArICoKPj4gKyAqIEFsZ29yaXRobUlkZW50aWZpZXJzIGNvbWUgZnJvbSBS RkMgMzI3OSwgd2UgYXJlIG5vdCBzdHJpY3RseSAKPj4gY29tcGlsYW50IGFzIHdlCj4+ICsgKiBv bmx5IHN1cHBvcnQgUlNBIEVuY3J5cHRpb24uCj4+ICsgKi8KPj4gKwo+PiArc3RhdGljIGdydWJf ZXJyX3QKPj4gK2dydWJfeDUwOV9yZWFkX3N1YmplY3RfcHVibGljX2tleSAoYXNuMV9ub2RlIGFz biwgc3RydWN0Cj4+IHg1MDlfY2VydGlmaWNhdGUgKnJlc3VsdHMpCj4+ICt7Cj4+ICsgIGludCBy ZXN1bHQ7Cj4+ICsgIGdydWJfZXJyX3QgZXJyOwo+PiArICBjb25zdCBjaGFyICphbGdvX25hbWUg PQo+PiArICAgICAgICAgICJ0YnNDZXJ0aWZpY2F0ZS5zdWJqZWN0UHVibGljS2V5SW5mby5hbGdv cml0aG0uYWxnb3JpdGhtIjsKPj4gKyAgY29uc3QgY2hhciAqcGFyYW1zX25hbWUgPQo+PiArICAg ICAgICAgICJ0YnNDZXJ0aWZpY2F0ZS5zdWJqZWN0UHVibGljS2V5SW5mby5hbGdvcml0aG0ucGFy YW1ldGVycyI7Cj4+ICsgIGNvbnN0IGNoYXIgKnBrX25hbWUgPSAKPj4gInRic0NlcnRpZmljYXRl LnN1YmplY3RQdWJsaWNLZXlJbmZvLnN1YmplY3RQdWJsaWNLZXkiOwo+PiArICBjaGFyIGFsZ29f b2lkW01BWF9PSURfTEVOXTsKPj4gKyAgaW50IGFsZ29fc2l6ZSA9IHNpemVvZiAoYWxnb19vaWQp Owo+PiArICBjaGFyIHBhcmFtc192YWx1ZVsyXTsKPj4gKyAgaW50IHBhcmFtc19zaXplID0gc2l6 ZW9mIChwYXJhbXNfdmFsdWUpOwo+PiArICBncnViX3VpbnQ4X3QgKmtleV9kYXRhID0gTlVMTDsK Pj4gKyAgaW50IGtleV9zaXplID0gMDsKPj4gKyAgdW5zaWduZWQgaW50IGtleV90eXBlOwo+PiAr Cj4+ICsgIC8qIGFsZ29yaXRobTogc2VlIG5vdGVzIGZvciByc2FFbmNyeXB0aW9uX29pZCAqLwo+ PiArICByZXN1bHQgPSBhc24xX3JlYWRfdmFsdWUgKGFzbiwgYWxnb19uYW1lLCBhbGdvX29pZCwg JmFsZ29fc2l6ZSk7Cj4+ICsgIGlmIChyZXN1bHQgIT0gQVNOMV9TVUNDRVNTKQo+PiArICAgIHsK Pj4gKyAgICAgIHJldHVybiBncnViX2Vycm9yIChHUlVCX0VSUl9CQURfRklMRV9UWVBFLCAiRXJy b3IgcmVhZGluZyB4NTA5Cj4+IHB1YmxpYyBrZXkgYWxnb3JpdGhtOiAlcyIsCj4+ICsgICAgICAg ICAgICAgICAgICAgICAgICAgYXNuMV9zdHJlcnJvciAocmVzdWx0KSk7Cj4+ICsgICAgfQo+PiAr Cj4+ICsgIGlmIChncnViX3N0cm5jbXAgKGFsZ29fb2lkLCByc2FFbmNyeXB0aW9uX29pZCwgc2l6 ZW9mCj4+IChyc2FFbmNyeXB0aW9uX29pZCkpICE9IDApCj4+ICsgICAgewo+PiArICAgICAgcmV0 dXJuIGdydWJfZXJyb3IgKEdSVUJfRVJSX05PVF9JTVBMRU1FTlRFRF9ZRVQsCj4+ICsgICAgICAg ICAgICAgICAgICAgICAgICAgIlVuc3VwcG9ydGVkIHg1MDkgcHVibGljIGtleSBhbGdvcml0aG06 ICVzIiwKPj4gYWxnb19vaWQpOwo+PiArICAgIH0KPj4gKwo+PiArICAvKgo+PiArICAgKiBSRkMg MzI3OSAyLjMuMQo+PiArICAgKiBUaGUgcnNhRW5jcnlwdGlvbiBPSUQgaXMgaW50ZW5kZWQgdG8g YmUgdXNlZCBpbiB0aGUgYWxnb3JpdGhtIAo+PiBmaWVsZAo+PiArICAgKiBvZiBhIHZhbHVlIG9m IHR5cGUgQWxnb3JpdGhtSWRlbnRpZmllci4gIFRoZSBwYXJhbWV0ZXJzIGZpZWxkIAo+PiBNVVNU Cj4+ICsgICAqIGhhdmUgQVNOLjEgdHlwZSBOVUxMIGZvciB0aGlzIGFsZ29yaXRobSBpZGVudGlm aWVyLgo+PiArICAgKi8KPj4gKyAgcmVzdWx0ID0gYXNuMV9yZWFkX3ZhbHVlIChhc24sIHBhcmFt c19uYW1lLCBwYXJhbXNfdmFsdWUsIAo+PiAmcGFyYW1zX3NpemUpOwo+PiArICBpZiAocmVzdWx0 ICE9IEFTTjFfU1VDQ0VTUykKPj4gKyAgICB7Cj4+ICsgICAgICByZXR1cm4gZ3J1Yl9lcnJvciAo R1JVQl9FUlJfQkFEX0ZJTEVfVFlQRSwgIkVycm9yIHJlYWRpbmcgeDUwOQo+PiBwdWJsaWMga2V5 IHBhcmFtZXRlcnM6ICVzIiwKPj4gKyAgICAgICAgICAgICAgICAgICAgICAgICBhc24xX3N0cmVy cm9yIChyZXN1bHQpKTsKPj4gKyAgICB9Cj4+ICsKPj4gKyAgaWYgKHBhcmFtc192YWx1ZVswXSAh PSBBU04xX1RBR19OVUxMKQo+PiArICAgIHsKPj4gKyAgICAgIHJldHVybiBncnViX2Vycm9yIChH UlVCX0VSUl9CQURfRklMRV9UWVBFLAo+PiArICAgICAgICAgICAgICAgICAgICAgICAgICJJbnZh bGlkIHg1MDkgcHVibGljIGtleSBwYXJhbWV0ZXJzOiAKPj4gZXhwZWN0ZWQgTlVMTCIpOwo+PiAr ICAgIH0KPj4gKwo+PiArICAvKgo+PiArICAgKiBSRkMgMzI3OSAyLjMuMTogIFRoZSBERVIgZW5j b2RlZCBSU0FQdWJsaWNLZXkgaXMgdGhlIHZhbHVlIG9mIAo+PiB0aGUgQklUCj4+ICsgICAqIFNU UklORyBzdWJqZWN0UHVibGljS2V5Lgo+PiArICAgKi8KPj4gKyAgcmVzdWx0ID0gYXNuMV9yZWFk X3ZhbHVlX3R5cGUgKGFzbiwgcGtfbmFtZSwgTlVMTCwgJmtleV9zaXplLCAKPj4gJmtleV90eXBl KTsKPj4gKyAgaWYgKHJlc3VsdCAhPSBBU04xX01FTV9FUlJPUikKPj4gKyAgICB7Cj4+ICsgICAg ICByZXR1cm4gZ3J1Yl9lcnJvciAoR1JVQl9FUlJfQkFEX0ZJTEVfVFlQRSwgIkVycm9yIHJlYWRp bmcgc2l6ZQo+PiBvZiB4NTA5IHB1YmxpYyBrZXk6ICVzIiwKPj4gKyAgICAgICAgICAgICAgICAg ICAgICAgICBhc24xX3N0cmVycm9yIChyZXN1bHQpKTsKPj4gKyAgICB9Cj4+ICsgIGlmIChrZXlf dHlwZSAhPSBBU04xX0VUWVBFX0JJVF9TVFJJTkcpCj4+ICsgICAgewo+PiArICAgICAgcmV0dXJu IGdydWJfZXJyb3IgKEdSVUJfRVJSX0JBRF9GSUxFX1RZUEUsICJVbmV4cGVjdGVkIEFTTi4xCj4+ IHR5cGUgd2hlbiByZWFkaW5nIHg1MDkgcHVibGljIGtleTogJXgiLAo+PiArICAgICAgICAgICAg ICAgICAgICAgICAgIGtleV90eXBlKTsKPj4gKyAgICB9Cj4+ICsKPj4gKyAgLyogbGVuZ3RoIGlz IGluIGJpdHMgKi8KPj4gKyAga2V5X3NpemUgPSAoa2V5X3NpemUgKyA3KSAvIDg7Cj4+ICsKPj4g KyAga2V5X2RhdGEgPSBncnViX21hbGxvYyAoa2V5X3NpemUpOwo+PiArICBpZiAoIWtleV9kYXRh KQo+PiArICAgIHsKPj4gKyAgICAgIHJldHVybiBncnViX2Vycm9yIChHUlVCX0VSUl9PVVRfT0Zf TUVNT1JZLAo+PiArICAgICAgICAgICAgICAgICAgICAgICAgICJPdXQgb2YgbWVtb3J5IGZvciB4 NTA5IHB1YmxpYyBrZXkiKTsKPj4gKyAgICB9Cj4+ICsKPj4gKyAgcmVzdWx0ID0gYXNuMV9yZWFk X3ZhbHVlIChhc24sIHBrX25hbWUsIGtleV9kYXRhLCAma2V5X3NpemUpOwo+PiArICBpZiAocmVz dWx0ICE9IEFTTjFfU1VDQ0VTUykKPj4gKyAgICB7Cj4+ICsgICAgICBncnViX2ZyZWUgKGtleV9k YXRhKTsKPj4gKyAgICAgIHJldHVybiBncnViX2Vycm9yIChHUlVCX0VSUl9CQURfRklMRV9UWVBF LAo+PiArICAgICAgICAgICAgICAgICAgICAgICAgICJFcnJvciByZWFkaW5nIHB1YmxpYyBrZXkg ZGF0YSIpOwo+PiArICAgIH0KPj4gKyAga2V5X3NpemUgPSAoa2V5X3NpemUgKyA3KSAvIDg7Cj4+ ICsKPj4gKyAgZXJyID0gZ3J1Yl9wYXJzZV9yc2FfcHVia2V5IChrZXlfZGF0YSwga2V5X3NpemUs IHJlc3VsdHMpOwo+PiArICBncnViX2ZyZWUgKGtleV9kYXRhKTsKPj4gKwo+PiArICByZXR1cm4g ZXJyOwo+PiArfQo+PiArCj4+ICsvKiBEZWNvZGUgYSBzdHJpbmcgYXMgZGVmaW5lZCBpbiBBcHBl bmRpeCBBICovCj4+ICtzdGF0aWMgZ3J1Yl9lcnJfdAo+PiArZGVjb2RlX3N0cmluZyAoY2hhciAq ZGVyLCBpbnQgZGVyX3NpemUsIGNoYXIgKipzdHJpbmcsIGdydWJfc2l6ZV90Cj4+ICpzdHJpbmdf c2l6ZSkKPj4gK3sKPj4gKyAgYXNuMV9ub2RlIHN0cmFzbjsKPj4gKyAgaW50IHJlc3VsdDsKPj4g KyAgY2hhciAqY2hvaWNlOwo+PiArICBpbnQgY2hvaWNlX3NpemUgPSAwOwo+PiArICBpbnQgdG1w X3NpemUgPSAwOwo+PiArICBncnViX2Vycl90IGVyciA9IEdSVUJfRVJSX05PTkU7Cj4+ICsKPj4g KyAgcmVzdWx0ID0gYXNuMV9jcmVhdGVfZWxlbWVudCAoX2dudXRsc19wa2l4X2FzbiwKPj4gIlBL SVgxLkRpcmVjdG9yeVN0cmluZyIsICZzdHJhc24pOwo+PiArICBpZiAocmVzdWx0ICE9IEFTTjFf U1VDQ0VTUykKPj4gKyAgICB7Cj4+ICsgICAgICByZXR1cm4gZ3J1Yl9lcnJvciAoR1JVQl9FUlJf T1VUX09GX01FTU9SWSwKPj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAiQ291bGQgbm90IGNy ZWF0ZSBBU04uMSBzdHJ1Y3R1cmUgZm9yCj4+IGNlcnRpZmljYXRlOiAlcyIsCj4+ICsgICAgICAg ICAgICAgICAgICAgICAgICAgYXNuMV9zdHJlcnJvciAocmVzdWx0KSk7Cj4+ICsgICAgfQo+PiAr Cj4+ICsgIHJlc3VsdCA9IGFzbjFfZGVyX2RlY29kaW5nMiAoJnN0cmFzbiwgZGVyLCAmZGVyX3Np emUsCj4+IEFTTjFfREVDT0RFX0ZMQUdfU1RSSUNUX0RFUiwgYXNuMV9lcnJvcik7Cj4+ICsgIGlm IChyZXN1bHQgIT0gQVNOMV9TVUNDRVNTKQo+PiArICAgIHsKPj4gKyAgICAgIGVyciA9IGdydWJf ZXJyb3IgKEdSVUJfRVJSX0JBRF9GSUxFX1RZUEUsCj4+ICsgICAgICAgICAgICAgICAgICAgICAg ICAiQ291bGQgbm90IHBhcnNlIERFUiBmb3IgRGlyZWN0b3J5U3RyaW5nOgo+PiAlcyIsIGFzbjFf ZXJyb3IpOwo+PiArICAgICAgZ290byBjbGVhbnVwOwo+PiArICAgIH0KPj4gKwo+PiArICBjaG9p Y2UgPSBncnViX2FzbjFfYWxsb2NhdGVfYW5kX3JlYWQgKHN0cmFzbiwgIiIsICJEaXJlY3RvcnlT dHJpbmcKPj4gY2hvaWNlIiwgJmNob2ljZV9zaXplKTsKPj4gKyAgaWYgKCFjaG9pY2UpCj4+ICsg ICAgewo+PiArICAgICAgZXJyID0gZ3J1Yl9lcnJubzsKPj4gKyAgICAgIGdvdG8gY2xlYW51cDsK Pj4gKyAgICB9Cj4+ICsKPj4gKyAgaWYgKGdydWJfc3RybmNtcCAoInV0ZjhTdHJpbmciLCBjaG9p Y2UsIGNob2ljZV9zaXplKSA9PSAwKQo+PiArICAgIHsKPj4gKyAgICAgIHJlc3VsdCA9IGFzbjFf cmVhZF92YWx1ZSAoc3RyYXNuLCAidXRmOFN0cmluZyIsIE5VTEwsIAo+PiAmdG1wX3NpemUpOwo+ PiArICAgICAgaWYgKHJlc3VsdCAhPSBBU04xX01FTV9FUlJPUikKPj4gKyAgICAgICAgewo+PiAr ICAgICAgICAgIGVyciA9IGdydWJfZXJyb3IgKEdSVUJfRVJSX0JBRF9GSUxFX1RZUEUsICJFcnJv ciByZWFkaW5nCj4+IHNpemUgb2YgVVRGLTggc3RyaW5nOiAlcyIsCj4+ICsgICAgICAgICAgICAg ICAgICAgICAgICAgICAgYXNuMV9zdHJlcnJvciAocmVzdWx0KSk7Cj4+ICsgICAgICAgICAgZ290 byBjbGVhbnVwX2Nob2ljZTsKPj4gKyAgICAgICAgfQo+PiArICAgIH0KPj4gKyAgZWxzZSBpZiAo Z3J1Yl9zdHJuY21wICgicHJpbnRhYmxlU3RyaW5nIiwgY2hvaWNlLCBjaG9pY2Vfc2l6ZSkgPT0g Cj4+IDApCj4+ICsgICAgewo+PiArICAgICAgcmVzdWx0ID0gYXNuMV9yZWFkX3ZhbHVlIChzdHJh c24sICJwcmludGFibGVTdHJpbmciLCBOVUxMLCAKPj4gJnRtcF9zaXplKTsKPj4gKyAgICAgIGlm IChyZXN1bHQgIT0gQVNOMV9NRU1fRVJST1IpCj4+ICsgICAgICAgIHsKPj4gKyAgICAgICAgICBl cnIgPSBncnViX2Vycm9yIChHUlVCX0VSUl9CQURfRklMRV9UWVBFLCAiRXJyb3IgcmVhZGluZwo+ PiBzaXplIG9mIFVURi04IHN0cmluZzogJXMiLAo+PiArICAgICAgICAgICAgICAgICAgICAgICAg ICAgIGFzbjFfc3RyZXJyb3IgKHJlc3VsdCkpOwo+PiArICAgICAgICAgIGdvdG8gY2xlYW51cF9j aG9pY2U7Cj4+ICsgICAgICAgIH0KPj4gKyAgICB9Cj4+ICsgIGVsc2UKPj4gKyAgICB7Cj4+ICsg ICAgICBlcnIgPSBncnViX2Vycm9yIChHUlVCX0VSUl9OT1RfSU1QTEVNRU5URURfWUVULCAiT25s eSBVVEYtOCBhbmQKPj4gcHJpbnRhYmxlIERpcmVjdG9yeVN0cmluZ3MgYXJlIHN1cHBvcnRlZCwg Z290ICVzIiwKPj4gKyAgICAgICAgICAgICAgICAgICAgICAgIGNob2ljZSk7Cj4+ICsgICAgICBn b3RvIGNsZWFudXBfY2hvaWNlOwo+PiArICAgIH0KPj4gKwo+PiArICAvKiByZWFkIHNpemUgZG9l cyBub3QgaW5jbHVkZSB0cmFpbGluZyBudWxsICovCj4+ICsgIHRtcF9zaXplKys7Cj4+ICsKPj4g KyAgKnN0cmluZyA9IGdydWJfbWFsbG9jICh0bXBfc2l6ZSk7Cj4+ICsgIGlmICghKnN0cmluZykK Pj4gKyAgICB7Cj4+ICsgICAgICBlcnIgPSBncnViX2Vycm9yIChHUlVCX0VSUl9PVVRfT0ZfTUVN T1JZLAo+PiArICAgICAgICAgICAgICAgICAgICAgICAgIkNhbm5vdCBhbGxvY2F0ZSBtZW1vcnkg Zm9yIERpcmVjdG9yeVN0cmluZyAKPj4gY29udGVudHMiKTsKPj4gKyAgICAgIGdvdG8gY2xlYW51 cF9jaG9pY2U7Cj4+ICsgICAgfQo+PiArCj4+ICsgIHJlc3VsdCA9IGFzbjFfcmVhZF92YWx1ZSAo c3RyYXNuLCBjaG9pY2UsICpzdHJpbmcsICZ0bXBfc2l6ZSk7Cj4+ICsgIGlmIChyZXN1bHQgIT0g QVNOMV9TVUNDRVNTKQo+PiArICAgIHsKPj4gKyAgICAgIGVyciA9IGdydWJfZXJyb3IgKEdSVUJf RVJSX0JBRF9GSUxFX1RZUEUsICJFcnJvciByZWFkaW5nIG91dCAlcwo+PiBpbiBEaXJlY3RvcnlT dHJpbmc6ICVzIiwKPj4gKyAgICAgICAgICAgICAgICAgICAgICAgIGNob2ljZSwgYXNuMV9zdHJl cnJvciAocmVzdWx0KSk7Cj4+ICsgICAgICBncnViX2ZyZWUgKCpzdHJpbmcpOwo+PiArICAgICAg Z290byBjbGVhbnVwX2Nob2ljZTsKPj4gKyAgICB9Cj4+ICsgICpzdHJpbmdfc2l6ZSA9IHRtcF9z aXplICsgMTsKPj4gKyAgKCpzdHJpbmcpW3RtcF9zaXplXSA9ICdcMCc7Cj4+ICsKPj4gK2NsZWFu dXBfY2hvaWNlOgo+PiArICBncnViX2ZyZWUgKGNob2ljZSk7Cj4+ICtjbGVhbnVwOgo+PiArICBh c24xX2RlbGV0ZV9zdHJ1Y3R1cmUgKCZzdHJhc24pOwo+PiArICByZXR1cm4gZXJyOwo+PiArfQo+ PiArCj4+ICsvKgo+PiArICogVEJTQ2VydGlmaWNhdGUgIDo6PSAgU0VRVUVOQ0UgIHsKPj4gKyAq ICAgICAgIHZlcnNpb24gICAgICAgICBbMF0gIEVYUExJQ0lUIFZlcnNpb24gREVGQVVMVCB2MSwK Pj4gKyAqIC4uLgo+PiArICoKPj4gKyAqIFZlcnNpb24gIDo6PSAgSU5URUdFUiAgeyAgdjEoMCks IHYyKDEpLCB2MygyKSAgfQo+PiArICovCj4+ICtzdGF0aWMgZ3J1Yl9lcnJfdAo+PiArY2hlY2tf dmVyc2lvbiAoYXNuMV9ub2RlIGNlcnRpZmljYXRlKQo+PiArewo+PiArICBpbnQgcmM7Cj4+ICsg IGNvbnN0IGNoYXIgKm5hbWUgPSAidGJzQ2VydGlmaWNhdGUudmVyc2lvbiI7Cj4+ICsgIGdydWJf dWludDhfdCB2ZXJzaW9uOwo+PiArICBpbnQgbGVuID0gc2l6ZW9mICh2ZXJzaW9uKTsKPj4gKwo+ PiArICByYyA9IGFzbjFfcmVhZF92YWx1ZSAoY2VydGlmaWNhdGUsIG5hbWUsICZ2ZXJzaW9uLCAm bGVuKTsKPj4gKwo+PiArICAvKiByZXF1aXJlIHZlcnNpb24gMyAqLwo+PiArICBpZiAocmMgIT0g QVNOMV9TVUNDRVNTIHx8IGxlbiAhPSAxKQo+PiArICAgIHJldHVybiBncnViX2Vycm9yIChHUlVC X0VSUl9CQURfRklMRV9UWVBFLAo+PiArICAgICAgICAgICAgICAgICAgICAgICAiRXJyb3IgcmVh ZGluZyBjZXJ0aWZpY2F0ZSB2ZXJzaW9uIik7Cj4+ICsKPj4gKyAgaWYgKHZlcnNpb24gIT0gMHgw MikKPj4gKyAgICByZXR1cm4gZ3J1Yl9lcnJvciAoR1JVQl9FUlJfQkFEX0ZJTEVfVFlQRSwgIklu dmFsaWQgeDUwOQo+PiBjZXJ0aWZpY2F0ZSB2ZXJzaW9uLCBleHBlY3RlZCB2MyAoMHgwMiksIGdv dCAweCUwMngiLAo+PiArICAgICAgICAgICAgICAgICAgICAgICB2ZXJzaW9uKTsKPj4gKwo+PiAr ICByZXR1cm4gR1JVQl9FUlJfTk9ORTsKPj4gK30KPj4gKwo+PiArLyoKPj4gKyAqIFRoaXMgaXMg YW4gWC41MDEgTmFtZSwgd2hpY2ggaXMgY29tcGxleC4KPj4gKyAqCj4+ICsgKiBGb3Igc2ltcGxp Y2l0eSwgd2UgZXh0cmFjdCBvbmx5IHRoZSBDTi4KPj4gKyAqLwo+PiArc3RhdGljIGdydWJfZXJy X3QKPj4gK3JlYWRfbmFtZSAoYXNuMV9ub2RlIGFzbiwgY29uc3QgY2hhciAqbmFtZV9wYXRoLCBj aGFyICoqbmFtZSwKPj4gZ3J1Yl9zaXplX3QgKm5hbWVfc2l6ZSkKPj4gK3sKPj4gKyAgaW50IHNl cV9jb21wb25lbnRzLCBzZXRfY29tcG9uZW50czsKPj4gKyAgaW50IHJlc3VsdDsKPj4gKyAgaW50 IGksIGo7Cj4+ICsgIGNoYXIgKnRvcF9wYXRoLCAqc2V0X3BhdGgsICp0eXBlX3BhdGgsICp2YWxf cGF0aDsKPj4gKyAgY2hhciB0eXBlW01BWF9PSURfTEVOXTsKPj4gKyAgaW50IHR5cGVfbGVuID0g c2l6ZW9mICh0eXBlKTsKPj4gKyAgaW50IHN0cmluZ19zaXplID0gMDsKPj4gKyAgY2hhciAqc3Ry aW5nX2RlcjsKPj4gKyAgZ3J1Yl9lcnJfdCBlcnI7Cj4+ICsKPj4gKyAgKm5hbWUgPSBOVUxMOwo+ PiArCj4+ICsgIHRvcF9wYXRoID0gZ3J1Yl94YXNwcmludGYgKCIlcy5yZG5TZXF1ZW5jZSIsIG5h bWVfcGF0aCk7Cj4+ICsgIGlmICghdG9wX3BhdGgpCj4+ICsgICAgcmV0dXJuIGdydWJfZXJyb3Ig KEdSVUJfRVJSX09VVF9PRl9NRU1PUlksCj4+ICsgICAgICAgICAgICAgICAgICAgICAgICJDb3Vs ZCBub3QgYWxsb2NhdGUgbWVtb3J5IGZvciAlcyBuYW1lIHBhcnNpbmcKPj4gcGF0aCIsIG5hbWVf cGF0aCk7Cj4+ICsKPj4gKyAgcmVzdWx0ID0gYXNuMV9udW1iZXJfb2ZfZWxlbWVudHMgKGFzbiwg dG9wX3BhdGgsICZzZXFfY29tcG9uZW50cyk7Cj4+ICsgIGlmIChyZXN1bHQgIT0gQVNOMV9TVUND RVNTKQo+PiArICAgIHsKPj4gKyAgICAgIGVyciA9IGdydWJfZXJyb3IgKEdSVUJfRVJSX0JBRF9G SUxFX1RZUEUsICJFcnJvciBjb3VudGluZyBuYW1lCj4+IGNvbXBvbmVudHM6ICVzIiwKPj4gKyAg ICAgICAgICAgICAgICAgICAgICAgIGFzbjFfc3RyZXJyb3IgKHJlc3VsdCkpOwo+PiArICAgICAg Z290byBjbGVhbnVwOwo+PiArICAgIH0KPj4gKwo+PiArICBmb3IgKGkgPSAxOyBpIDw9IHNlcV9j b21wb25lbnRzOyBpKyspCj4+ICsgICAgewo+PiArICAgICAgc2V0X3BhdGggPSBncnViX3hhc3By aW50ZiAoIiVzLj8lZCIsIHRvcF9wYXRoLCBpKTsKPj4gKyAgICAgIGlmICghc2V0X3BhdGgpCj4+ ICsgICAgICAgIHsKPj4gKyAgICAgICAgICBlcnIgPSBncnViX2Vycm9yIChHUlVCX0VSUl9PVVRf T0ZfTUVNT1JZLCAiQ291bGQgbm90Cj4+IGFsbG9jYXRlIG1lbW9yeSBmb3IgJXMgbmFtZSBzZXQg cGFyc2luZyBwYXRoIiwKPj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lX3BhdGgp Owo+PiArICAgICAgICAgIGdvdG8gY2xlYW51cF9zZXQ7Cj4+ICsgICAgICAgIH0KPj4gKyAgICAg IC8qIHRoaXMgYnJpbmdzIHVzLCBob3BlZnVsbHksIHRvIGEgc2V0ICovCj4+ICsgICAgICByZXN1 bHQgPSBhc24xX251bWJlcl9vZl9lbGVtZW50cyAoYXNuLCBzZXRfcGF0aCwgCj4+ICZzZXRfY29t cG9uZW50cyk7Cj4+ICsgICAgICBpZiAocmVzdWx0ICE9IEFTTjFfU1VDQ0VTUykKPj4gKyAgICAg ICAgewo+PiArICAgICAgICAgIGVyciA9IGdydWJfZXJyb3IgKEdSVUJfRVJSX0JBRF9GSUxFX1RZ UEUsICJFcnJvciBjb3VudGluZwo+PiBuYW1lIHN1Yi1jb21wb25lbnRzIGNvbXBvbmVudHMgKGVs ZW1lbnQgJWQpOiAlcyIsCj4+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSwgYXNuMV9z dHJlcnJvciAocmVzdWx0KSk7Cj4+ICsgICAgICAgICAgZ290byBjbGVhbnVwX3NldDsKPj4gKyAg ICAgICAgfQo+PiArICAgICAgZm9yIChqID0gMTsgaiA8PSBzZXRfY29tcG9uZW50czsgaisrKQo+ PiArICAgICAgICB7Cj4+ICsgICAgICAgICAgdHlwZV9wYXRoID0gZ3J1Yl94YXNwcmludGYgKCIl cy4/JWQuPyVkLnR5cGUiLCB0b3BfcGF0aCwgaSwgCj4+IGopOwo+PiArICAgICAgICAgIGlmICgh dHlwZV9wYXRoKQo+PiArICAgICAgICAgICAgewo+PiArICAgICAgICAgICAgICBlcnIgPSBncnVi X2Vycm9yIChHUlVCX0VSUl9PVVRfT0ZfTUVNT1JZLCAiQ291bGQgbm90Cj4+IGFsbG9jYXRlIG1l bW9yeSBmb3IgJXMgbmFtZSBjb21wb25lbnQgdHlwZSBwYXRoIiwKPj4gKyAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgbmFtZV9wYXRoKTsKPj4gKyAgICAgICAgICAgICAgZ290byBjbGVh bnVwX3NldDsKPj4gKyAgICAgICAgICAgIH0KPj4gKyAgICAgICAgICB0eXBlX2xlbiA9IHNpemVv ZiAodHlwZSk7Cj4+ICsgICAgICAgICAgcmVzdWx0ID0gYXNuMV9yZWFkX3ZhbHVlIChhc24sIHR5 cGVfcGF0aCwgdHlwZSwgJnR5cGVfbGVuKTsKPj4gKyAgICAgICAgICBpZiAocmVzdWx0ICE9IEFT TjFfU1VDQ0VTUykKPj4gKyAgICAgICAgICAgIHsKPj4gKyAgICAgICAgICAgICAgZXJyID0gZ3J1 Yl9lcnJvciAoR1JVQl9FUlJfQkFEX0ZJTEVfVFlQRSwgIkVycm9yCj4+IHJlYWRpbmcgJXMgbmFt ZSBjb21wb25lbnQgdHlwZTogJXMiLAo+PiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICBuYW1lX3BhdGgsIGFzbjFfc3RyZXJyb3IgKHJlc3VsdCkpOwo+PiArICAgICAgICAgICAgICBn b3RvIGNsZWFudXBfdHlwZTsKPj4gKyAgICAgICAgICAgIH0KPj4gKwo+PiArICAgICAgICAgIGlm IChncnViX3N0cm5jbXAgKHR5cGUsIGNvbW1vbk5hbWVfb2lkLCB0eXBlX2xlbikgIT0gMCkKPj4g KyAgICAgICAgICAgIHsKPj4gKyAgICAgICAgICAgICAgZ3J1Yl9mcmVlICh0eXBlX3BhdGgpOwo+ PiArICAgICAgICAgICAgICBjb250aW51ZTsKPj4gKyAgICAgICAgICAgIH0KPj4gKwo+PiArICAg ICAgICAgIHZhbF9wYXRoID0gZ3J1Yl94YXNwcmludGYgKCIlcy4/JWQuPyVkLnZhbHVlIiwgdG9w X3BhdGgsIGksIAo+PiBqKTsKPj4gKyAgICAgICAgICBpZiAoIXZhbF9wYXRoKQo+PiArICAgICAg ICAgICAgewo+PiArICAgICAgICAgICAgICBlcnIgPSBncnViX2Vycm9yIChHUlVCX0VSUl9PVVRf T0ZfTUVNT1JZLCAiQ291bGQgbm90Cj4+IGFsbG9jYXRlIG1lbW9yeSBmb3IgJXMgbmFtZSBjb21w b25lbnQgdmFsdWUgcGF0aCIsCj4+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5h bWVfcGF0aCk7Cj4+ICsgICAgICAgICAgICAgIGdvdG8gY2xlYW51cF9zZXQ7Cj4+ICsgICAgICAg ICAgICB9Cj4+ICsKPj4gKyAgICAgICAgICBzdHJpbmdfZGVyID0gZ3J1Yl9hc24xX2FsbG9jYXRl X2FuZF9yZWFkIChhc24sIHZhbF9wYXRoLAo+PiBuYW1lX3BhdGgsICZzdHJpbmdfc2l6ZSk7Cj4+ ICsgICAgICAgICAgaWYgKCFzdHJpbmdfZGVyKQo+PiArICAgICAgICAgICAgewo+PiArICAgICAg ICAgICAgICBlcnIgPSBncnViX2Vycm5vOwo+PiArICAgICAgICAgICAgICBnb3RvIGNsZWFudXBf dmFsX3BhdGg7Cj4+ICsgICAgICAgICAgICB9Cj4+ICsKPj4gKyAgICAgICAgICBlcnIgPSBkZWNv ZGVfc3RyaW5nIChzdHJpbmdfZGVyLCBzdHJpbmdfc2l6ZSwgbmFtZSwgCj4+IG5hbWVfc2l6ZSk7 Cj4+ICsgICAgICAgICAgaWYgKGVycikKPj4gKyAgICAgICAgICAgIGdvdG8gY2xlYW51cF9zdHJp bmc7Cj4+ICsKPj4gKyAgICAgICAgICBncnViX2ZyZWUgKHN0cmluZ19kZXIpOwo+PiArICAgICAg ICAgIGdydWJfZnJlZSAodHlwZV9wYXRoKTsKPj4gKyAgICAgICAgICBncnViX2ZyZWUgKHZhbF9w YXRoKTsKPj4gKyAgICAgICAgICBicmVhazsKPj4gKyAgICAgICAgfQo+PiArICAgICAgZ3J1Yl9m cmVlIChzZXRfcGF0aCk7Cj4+ICsKPj4gKyAgICAgIGlmICgqbmFtZSkKPj4gKyAgICAgICAgYnJl YWs7Cj4+ICsgICAgfQo+PiArCj4+ICsgIGdydWJfZnJlZSAodG9wX3BhdGgpOwo+PiArCj4+ICsg IHJldHVybiBHUlVCX0VSUl9OT05FOwo+PiArCj4+ICtjbGVhbnVwX3N0cmluZzoKPj4gKyAgZ3J1 Yl9mcmVlIChzdHJpbmdfZGVyKTsKPj4gK2NsZWFudXBfdmFsX3BhdGg6Cj4+ICsgIGdydWJfZnJl ZSAodmFsX3BhdGgpOwo+PiArY2xlYW51cF90eXBlOgo+PiArICBncnViX2ZyZWUgKHR5cGVfcGF0 aCk7Cj4+ICtjbGVhbnVwX3NldDoKPj4gKyAgZ3J1Yl9mcmVlIChzZXRfcGF0aCk7Cj4+ICtjbGVh bnVwOgo+PiArICBncnViX2ZyZWUgKHRvcF9wYXRoKTsKPj4gKyAgcmV0dXJuIGVycjsKPj4gK30K Pj4gKwo+PiArLyoKPj4gKyAqIFZlcmlmeSB0aGUgS2V5IFVzYWdlIGV4dGVuc2lvbi4KPj4gKyAq IFdlIHJlcXVpcmUgdGhlIERpZ2l0YWwgc2lnbmF0dXJlIHVzYWdlLgo+PiArICovCj4+ICtzdGF0 aWMgZ3J1Yl9lcnJfdAo+PiArdmVyaWZ5X2tleV91c2FnZSAoZ3J1Yl91aW50OF90ICp2YWx1ZSwg aW50IHZhbHVlX3NpemUpCj4+ICt7Cj4+ICsgIGFzbjFfbm9kZSB1c2FnZWFzbjsKPj4gKyAgaW50 IHJlc3VsdDsKPj4gKyAgZ3J1Yl9lcnJfdCBlcnIgPSBHUlVCX0VSUl9OT05FOwo+PiArICBncnVi X3VpbnQ4X3QgdXNhZ2UgPSAweGZmOwo+PiArICBpbnQgdXNhZ2Vfc2l6ZSA9IHNpemVvZiAodXNh Z2Vfc2l6ZSk7Cj4+ICsKPj4gKyAgcmVzdWx0ID0gYXNuMV9jcmVhdGVfZWxlbWVudCAoX2dudXRs c19wa2l4X2FzbiwgIlBLSVgxLktleVVzYWdlIiwgCj4+ICZ1c2FnZWFzbik7Cj4+ICsgIGlmIChy ZXN1bHQgIT0gQVNOMV9TVUNDRVNTKQo+PiArICAgIHsKPj4gKyAgICAgIHJldHVybiBncnViX2Vy cm9yIChHUlVCX0VSUl9PVVRfT0ZfTUVNT1JZLAo+PiArICAgICAgICAgICAgICAgICAgICAgICAg ICJDb3VsZCBub3QgY3JlYXRlIEFTTi4xIHN0cnVjdHVyZSBmb3Iga2V5IAo+PiB1c2FnZSIpOwo+ PiArICAgIH0KPj4gKwo+PiArICByZXN1bHQgPSBhc24xX2Rlcl9kZWNvZGluZzIgKCZ1c2FnZWFz biwgdmFsdWUsICZ2YWx1ZV9zaXplLAo+PiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg IEFTTjFfREVDT0RFX0ZMQUdfU1RSSUNUX0RFUiwgCj4+IGFzbjFfZXJyb3IpOwo+PiArICBpZiAo cmVzdWx0ICE9IEFTTjFfU1VDQ0VTUykKPj4gKyAgICB7Cj4+ICsgICAgICBlcnIgPSBncnViX2Vy cm9yIChHUlVCX0VSUl9CQURfRklMRV9UWVBFLAo+PiArICAgICAgICAgICAgICAgICAgICAgICAg IkVycm9yIHBhcnNpbmcgREVSIGZvciBLZXkgVXNhZ2U6ICVzIiwgCj4+IGFzbjFfZXJyb3IpOwo+ PiArICAgICAgZ290byBjbGVhbnVwOwo+PiArICAgIH0KPj4gKwo+PiArICByZXN1bHQgPSBhc24x X3JlYWRfdmFsdWUgKHVzYWdlYXNuLCAiIiwgJnVzYWdlLCAmdXNhZ2Vfc2l6ZSk7Cj4+ICsgIGlm IChyZXN1bHQgIT0gQVNOMV9TVUNDRVNTKQo+PiArICAgIHsKPj4gKyAgICAgIGVyciA9IGdydWJf ZXJyb3IgKEdSVUJfRVJSX0JBRF9GSUxFX1RZUEUsICJFcnJvciByZWFkaW5nIEtleQo+PiBVc2Fn ZSB2YWx1ZTogJXMiLAo+PiArICAgICAgICAgICAgICAgICAgICAgICAgYXNuMV9zdHJlcnJvciAo cmVzdWx0KSk7Cj4+ICsgICAgICBnb3RvIGNsZWFudXA7Cj4+ICsgICAgfQo+PiArCj4+ICsgIGlm ICghKHVzYWdlICYgZGlnaXRhbFNpZ25hdHVyZVVzYWdlKSkKPj4gKyAgICB7Cj4+ICsgICAgICBl cnIgPSBncnViX2Vycm9yIChHUlVCX0VSUl9CQURfRklMRV9UWVBFLAo+PiArICAgICAgICAgICAg ICAgICAgICAgICAgIktleSBVc2FnZSAoMHgleCkgbWlzc2luZyBEaWdpdGFsIFNpZ25hdHVyZQo+ PiB1c2FnZSIsIHVzYWdlKTsKPj4gKyAgICAgIGdvdG8gY2xlYW51cDsKPj4gKyAgICB9Cj4+ICsK Pj4gK2NsZWFudXA6Cj4+ICsgIGFzbjFfZGVsZXRlX3N0cnVjdHVyZSAoJnVzYWdlYXNuKTsKPj4g KyAgcmV0dXJuIGVycjsKPj4gK30KPj4gKwo+PiArLyoKPj4gKyAqIEJhc2ljQ29uc3RyYWludHMg Ojo9IFNFUVVFTkNFIHsKPj4gKyAqICAgICAgIGNBICAgICAgICAgICAgICAgICAgICAgIEJPT0xF QU4gREVGQVVMVCBGQUxTRSwKPj4gKyAqICAgICAgIHBhdGhMZW5Db25zdHJhaW50ICAgICAgIElO VEVHRVIgKDAuLk1BWCkgT1BUSU9OQUwgfQo+PiArICovCj4+ICtzdGF0aWMgZ3J1Yl9lcnJfdAo+ PiArdmVyaWZ5X2Jhc2ljX2NvbnN0cmFpbnRzIChncnViX3VpbnQ4X3QgKnZhbHVlLCBpbnQgdmFs dWVfc2l6ZSkKPj4gK3sKPj4gKyAgYXNuMV9ub2RlIGJhc2ljYXNuOwo+PiArICBpbnQgcmVzdWx0 Owo+PiArICBncnViX2Vycl90IGVyciA9IEdSVUJfRVJSX05PTkU7Cj4+ICsgIGNoYXIgY0FbNl07 IC8qIEZBTFNFIG9yIFRSVUUgKi8KPj4gKyAgaW50IGNBX3NpemUgPSBzaXplb2YgKGNBKTsKPj4g Kwo+PiArICByZXN1bHQgPSBhc24xX2NyZWF0ZV9lbGVtZW50IChfZ251dGxzX3BraXhfYXNuLAo+ PiAiUEtJWDEuQmFzaWNDb25zdHJhaW50cyIsICZiYXNpY2Fzbik7Cj4+ICsgIGlmIChyZXN1bHQg IT0gQVNOMV9TVUNDRVNTKQo+PiArICAgIHsKPj4gKyAgICAgIHJldHVybiBncnViX2Vycm9yIChH UlVCX0VSUl9PVVRfT0ZfTUVNT1JZLAo+PiArICAgICAgICAgICAgICAgICAgICAgICAgICJDb3Vs ZCBub3QgY3JlYXRlIEFTTi4xIHN0cnVjdHVyZSBmb3IgQmFzaWMgCj4+ICIKPj4gKyAgICAgICAg ICAgICAgICAgICAgICAgICAiQ29uc3RyYWludHMiKTsKPj4gKyAgICB9Cj4+ICsKPj4gKyAgcmVz dWx0ID0gYXNuMV9kZXJfZGVjb2RpbmcyICgmYmFzaWNhc24sIHZhbHVlLCAmdmFsdWVfc2l6ZSwK Pj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBU04xX0RFQ09ERV9GTEFHX1NUUklD VF9ERVIsIAo+PiBhc24xX2Vycm9yKTsKPj4gKyAgaWYgKHJlc3VsdCAhPSBBU04xX1NVQ0NFU1Mp Cj4+ICsgICAgewo+PiArICAgICAgZXJyID0gZ3J1Yl9lcnJvciAoR1JVQl9FUlJfQkFEX0ZJTEVf VFlQRSwKPj4gKyAgICAgICAgICAgICAgICAgICAgICAgICJFcnJvciBwYXJzaW5nIERFUiBmb3Ig QmFzaWMgQ29uc3RyYWludHM6Cj4+ICVzIiwgYXNuMV9lcnJvcik7Cj4+ICsgICAgICBnb3RvIGNs ZWFudXA7Cj4+ICsgICAgfQo+PiArCj4+ICsgIHJlc3VsdCA9IGFzbjFfcmVhZF92YWx1ZSAoYmFz aWNhc24sICJjQSIsIGNBLCAmY0Ffc2l6ZSk7Cj4+ICsgIGlmIChyZXN1bHQgPT0gQVNOMV9FTEVN RU5UX05PVF9GT1VORCkKPj4gKyAgICB7Cj4+ICsgICAgICAvKiBOb3QgcHJlc2VudCwgZGVmYXVs dCBpcyBGYWxzZSwgc28gdGhpcyBpcyBPSyAqLwo+PiArICAgICAgZXJyID0gR1JVQl9FUlJfTk9O RTsKPj4gKyAgICAgIGdvdG8gY2xlYW51cDsKPj4gKyAgICB9Cj4+ICsgIGVsc2UgaWYgKHJlc3Vs dCAhPSBBU04xX1NVQ0NFU1MpCj4+ICsgICAgewo+PiArICAgICAgZXJyID0gZ3J1Yl9lcnJvciAo R1JVQl9FUlJfQkFEX0ZJTEVfVFlQRSwgIkVycm9yIHJlYWRpbmcgQmFzaWMKPj4gQ29uc3RyYWlu dHMgY0EgdmFsdWU6ICVzIiwKPj4gKyAgICAgICAgICAgICAgICAgICAgICAgIGFzbjFfc3RyZXJy b3IgKHJlc3VsdCkpOwo+PiArICAgICAgZ290byBjbGVhbnVwOwo+PiArICAgIH0KPj4gKwo+PiAr ICAvKiBUaGUgY2VydGlmaWNhdGUgbXVzdCBub3QgYmUgYSBDQSBjZXJ0aWZpY2F0ZSAqLwo+PiAr ICBpZiAoZ3J1Yl9zdHJuY21wICgiRkFMU0UiLCBjQSwgY0Ffc2l6ZSkgIT0gMCkKPj4gKyAgICB7 Cj4+ICsgICAgICBlcnIgPSBncnViX2Vycm9yIChHUlVCX0VSUl9CQURfRklMRV9UWVBFLCAiVW5l eHBlY3RlZCBDQSB2YWx1ZTogCj4+ICVzIiwgY0EpOwo+PiArICAgICAgZ290byBjbGVhbnVwOwo+ PiArICAgIH0KPj4gKwo+PiArY2xlYW51cDoKPj4gKyAgYXNuMV9kZWxldGVfc3RydWN0dXJlICgm YmFzaWNhc24pOwo+PiArICByZXR1cm4gZXJyOwo+PiArfQo+PiArCj4+ICsvKgo+PiArICogRXh0 S2V5VXNhZ2VTeW50YXggOjo9IFNFUVVFTkNFIFNJWkUgKDEuLk1BWCkgT0YgS2V5UHVycG9zZUlk Cj4+ICsgKgo+PiArICogS2V5UHVycG9zZUlkIDo6PSBPQkpFQ1QgSURFTlRJRklFUgo+PiArICov Cj4+ICtzdGF0aWMgZ3J1Yl9lcnJfdAo+PiArdmVyaWZ5X2V4dGVuZGVkX2tleV91c2FnZSAoZ3J1 Yl91aW50OF90ICp2YWx1ZSwgaW50IHZhbHVlX3NpemUpCj4+ICt7Cj4+ICsgIGFzbjFfbm9kZSBl eHRlbmRlZGFzbjsKPj4gKyAgaW50IHJlc3VsdCwgY291bnQ7Cj4+ICsgIGdydWJfZXJyX3QgZXJy ID0gR1JVQl9FUlJfTk9ORTsKPj4gKyAgY2hhciB1c2FnZVtNQVhfT0lEX0xFTl07Cj4+ICsgIGlu dCB1c2FnZV9zaXplID0gc2l6ZW9mICh1c2FnZSk7Cj4+ICsKPj4gKyAgcmVzdWx0ID0gYXNuMV9j cmVhdGVfZWxlbWVudCAoX2dudXRsc19wa2l4X2FzbiwKPj4gIlBLSVgxLkV4dEtleVVzYWdlU3lu dGF4IiwgJmV4dGVuZGVkYXNuKTsKPj4gKyAgaWYgKHJlc3VsdCAhPSBBU04xX1NVQ0NFU1MpCj4+ ICsgICAgewo+PiArICAgICAgcmV0dXJuIGdydWJfZXJyb3IgKEdSVUJfRVJSX09VVF9PRl9NRU1P UlksCj4+ICsgICAgICAgICAgICAgICAgICAgICAgICAgIkNvdWxkIG5vdCBjcmVhdGUgQVNOLjEg c3RydWN0dXJlIGZvciAKPj4gRXh0ZW5kZWQgS2V5ICIKPj4gKyAgICAgICAgICAgICAgICAgICAg ICAgICAiVXNhZ2UiKTsKPj4gKyAgICB9Cj4+ICsKPj4gKyAgcmVzdWx0ID0gYXNuMV9kZXJfZGVj b2RpbmcyICgmZXh0ZW5kZWRhc24sIHZhbHVlLCAmdmFsdWVfc2l6ZSwKPj4gKyAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICBBU04xX0RFQ09ERV9GTEFHX1NUUklDVF9ERVIsIAo+PiBhc24x X2Vycm9yKTsKPj4gKyAgaWYgKHJlc3VsdCAhPSBBU04xX1NVQ0NFU1MpCj4+ICsgICAgewo+PiAr ICAgICAgZXJyID0gZ3J1Yl9lcnJvciAoR1JVQl9FUlJfQkFEX0ZJTEVfVFlQRSwKPj4gKyAgICAg ICAgICAgICAgICAgICAgICAgICJFcnJvciBwYXJzaW5nIERFUiBmb3IgRXh0ZW5kZWQgS2V5IFVz YWdlOgo+PiAlcyIsIGFzbjFfZXJyb3IpOwo+PiArICAgICAgZ290byBjbGVhbnVwOwo+PiArICAg IH0KPj4gKwo+PiArICAvKgo+PiArICAgKiBJZiBFS1VzIGFyZSBwcmVzZW50LCB0aGVyZSBtdXN0 IGJlIGV4YWN0bHkgMSB1c2FnZSBhbmQgaXQgbXVzdCAKPj4gYmUgYQo+PiArICAgKiBjb2RlU2ln bmluZyB1c2FnZS4gKElmIHdlIGdldCB0byB0aGlzIHBvaW50LCB3ZSBhcmUgcGFyc2luZyBhbiAK Pj4gRUtVCj4+ICsgICAqIGV4dGVuc2lvbiBhbmQgdGhlcmVmb3JlIG11c3QgaGF2ZSBhIHVzYWdl LiBUaGUgY29kZSB0aGF0IG1ha2VzIAo+PiBoYXZpbmcgYW4KPj4gKyAgICogRUtVIGV4dGVuc2lv biBvcHRpb25hbCBpcyBpbiB2ZXJpZnlfZXh0ZW5zaW9ucy4pCj4+ICsgICAqLwo+PiArICByZXN1 bHQgPSBhc24xX251bWJlcl9vZl9lbGVtZW50cyAoZXh0ZW5kZWRhc24sICIiLCAmY291bnQpOwo+ PiArICBpZiAocmVzdWx0ICE9IEFTTjFfU1VDQ0VTUykKPj4gKyAgICB7Cj4+ICsgICAgICBlcnIg PSBncnViX2Vycm9yIChHUlVCX0VSUl9CQURfRklMRV9UWVBFLCAiRXJyb3IgY291bnRpbmcKPj4g bnVtYmVyIG9mIEV4dGVuZGVkIEtleSBVc2FnZXM6ICVzIiwKPj4gKyAgICAgICAgICAgICAgICAg ICAgICAgIGFzbjFfc3RyZXJyb3IgKHJlc3VsdCkpOwo+PiArICAgICAgZ290byBjbGVhbnVwOwo+ PiArICAgIH0KPj4gKwo+PiArICBpZiAoY291bnQgIT0gMSkKPj4gKyAgICB7Cj4+ICsgICAgICBl cnIgPSBncnViX2Vycm9yIChHUlVCX0VSUl9CQURfRklMRV9UWVBFLCAiVW5leHBlY3RlZCBudW1i ZXIgb2YKPj4gRXh0ZW5kZWQgS2V5IFVzYWdlczogJWQsIDEgZXhwZWN0ZWQiLAo+PiArICAgICAg ICAgICAgICAgICAgICAgICAgY291bnQpOwo+PiArICAgICAgZ290byBjbGVhbnVwOwo+PiArICAg IH0KPj4gKwo+PiArICByZXN1bHQgPSBhc24xX3JlYWRfdmFsdWUgKGV4dGVuZGVkYXNuLCAiPzEi LCB1c2FnZSwgJnVzYWdlX3NpemUpOwo+PiArICBpZiAocmVzdWx0ICE9IEFTTjFfU1VDQ0VTUykK Pj4gKyAgICB7Cj4+ICsgICAgICBlcnIgPSBncnViX2Vycm9yIChHUlVCX0VSUl9CQURfRklMRV9U WVBFLCAiRXJyb3IgcmVhZGluZwo+PiBFeHRlbmRlZCBLZXkgVXNhZ2U6ICVzIiwKPj4gKyAgICAg ICAgICAgICAgICAgICAgICAgIGFzbjFfc3RyZXJyb3IgKHJlc3VsdCkpOwo+PiArICAgICAgZ290 byBjbGVhbnVwOwo+PiArICAgIH0KPj4gKwo+PiArICBpZiAoZ3J1Yl9zdHJuY21wIChjb2RlU2ln bmluZ1VzYWdlX29pZCwgdXNhZ2UsIHVzYWdlX3NpemUpICE9IDApCj4+ICsgICAgewo+PiArICAg ICAgZXJyID0gZ3J1Yl9lcnJvciAoR1JVQl9FUlJfQkFEX0ZJTEVfVFlQRSwKPj4gKyAgICAgICAg ICAgICAgICAgICAgICAgICJVbmV4cGVjdGVkIEV4dGVuZGVkIEtleSBVc2FnZSBPSUQsIGdvdDog JXMiLCAKPj4gdXNhZ2UpOwo+PiArICAgICAgZ290byBjbGVhbnVwOwo+PiArICAgIH0KPj4gKwo+ PiArY2xlYW51cDoKPj4gKyAgYXNuMV9kZWxldGVfc3RydWN0dXJlICgmZXh0ZW5kZWRhc24pOwo+ PiArICByZXR1cm4gZXJyOwo+PiArfQo+PiArCj4+ICsvKgo+PiArICogRXh0ZW5zaW9ucyAgOjo9 ICBTRVFVRU5DRSBTSVpFICgxLi5NQVgpIE9GIEV4dGVuc2lvbgo+PiArICoKPj4gKyAqIEV4dGVu c2lvbiAgOjo9ICBTRVFVRU5DRSAgewo+PiArICogICAgICBleHRuSUQgICAgICBPQkpFQ1QgSURF TlRJRklFUiwKPj4gKyAqICAgICAgY3JpdGljYWwgICAgQk9PTEVBTiBERUZBVUxUIEZBTFNFLAo+ PiArICogICAgICBleHRuVmFsdWUgICBPQ1RFVCBTVFJJTkcKPj4gKyAqICAgICAgICAgICAgICAg ICAgLS0gY29udGFpbnMgdGhlIERFUiBlbmNvZGluZyBvZiBhbiBBU04uMSB2YWx1ZQo+PiArICog ICAgICAgICAgICAgICAgICAtLSBjb3JyZXNwb25kaW5nIHRvIHRoZSBleHRlbnNpb24gdHlwZSBp ZGVudGlmaWVkCj4+ICsgKiAgICAgICAgICAgICAgICAgIC0tIGJ5IGV4dG5JRAo+PiArICogfQo+ PiArICoKPj4gKyAqIEEgY2VydGlmaWNhdGUgbXVzdDoKPj4gKyAqICAtIGNvbnRhaW4gdGhlIERp Z2l0YWwgU2lnbmF0dXJlIHVzYWdlIG9ubHkKPj4gKyAqICAtIG5vdCBiZSBhIENBCj4+ICsgKiAg LSBjb250YWluIG5vIGV4dGVuZGVkIHVzYWdlcywgb3Igb25seSBhIGNvZGUgc2lnbmluZyBleHRl bmRlZCAKPj4gdXNhZ2UKPj4gKyAqICAtIG5vdCBjb250YWluIGFueSBvdGhlciBjcml0aWNhbCBl eHRlbnNpb25zIChSRkMgNTI4MCBzIDQuMikKPj4gKyAqLwo+PiArc3RhdGljIGdydWJfZXJyX3QK Pj4gK3ZlcmlmeV9leHRlbnNpb25zIChhc24xX25vZGUgY2VydCkKPj4gK3sKPj4gKyAgaW50IHJl c3VsdDsKPj4gKyAgaW50IGV4dCwgbnVtX2V4dGVuc2lvbnMgPSAwOwo+PiArICBpbnQgdXNhZ2Vf cHJlc2VudCA9IDAsIGNvbnN0cmFpbnRzX3ByZXNlbnQgPSAwLCAKPj4gZXh0ZW5kZWRfdXNhZ2Vf cHJlc2VudCA9IDA7Cj4+ICsgIGNoYXIgKm9pZF9wYXRoLCAqY3JpdGljYWxfcGF0aCwgKnZhbHVl X3BhdGg7Cj4+ICsgIGNoYXIgZXh0bklEW01BWF9PSURfTEVOXTsKPj4gKyAgaW50IGV4dG5JRF9z aXplOwo+PiArICBncnViX2Vycl90IGVycjsKPj4gKyAgY2hhciBjcml0aWNhbFs2XTsgLyogd2Ug Z2V0IGVpdGhlciAiVFJVRSIgb3IgIkZBTFNFIiAqLwo+PiArICBpbnQgY3JpdGljYWxfc2l6ZTsK Pj4gKyAgZ3J1Yl91aW50OF90ICp2YWx1ZTsKPj4gKyAgaW50IHZhbHVlX3NpemU7Cj4+ICsKPj4g KyAgcmVzdWx0ID0gYXNuMV9udW1iZXJfb2ZfZWxlbWVudHMgKGNlcnQsCj4+ICJ0YnNDZXJ0aWZp Y2F0ZS5leHRlbnNpb25zIiwgJm51bV9leHRlbnNpb25zKTsKPj4gKyAgaWYgKHJlc3VsdCAhPSBB U04xX1NVQ0NFU1MpCj4+ICsgICAgewo+PiArICAgICAgcmV0dXJuIGdydWJfZXJyb3IgKEdSVUJf RVJSX0JBRF9GSUxFX1RZUEUsICJFcnJvciBjb3VudGluZwo+PiBudW1iZXIgb2YgZXh0ZW5zaW9u czogJXMiLAo+PiArICAgICAgICAgICAgICAgICAgICAgICAgIGFzbjFfc3RyZXJyb3IgKHJlc3Vs dCkpOwo+PiArICAgIH0KPj4gKwo+PiArICBpZiAobnVtX2V4dGVuc2lvbnMgPCAyKQo+PiArICAg IHsKPj4gKyAgICAgIHJldHVybiBncnViX2Vycm9yIChHUlVCX0VSUl9CQURfRklMRV9UWVBFLCAi SW5zdWZmaWNpZW50IG51bWJlcgo+PiBvZiBleHRlbnNpb25zIGZvciAiCj4+ICsgICAgICAgICAg ICAgICAgICAgICAgICAgImNlcnRpZmljYXRlLCBuZWVkIGF0IGxlYXN0IDIsIGdvdCAlZCIsCj4+ ICsgICAgICAgICAgICAgICAgICAgICAgICAgbnVtX2V4dGVuc2lvbnMpOwo+PiArICAgIH0KPj4g Kwo+PiArICBmb3IgKGV4dCA9IDE7IGV4dCA8PSBudW1fZXh0ZW5zaW9uczsgZXh0KyspCj4+ICsg ICAgewo+PiArICAgICAgb2lkX3BhdGggPSBncnViX3hhc3ByaW50ZiAKPj4gKCJ0YnNDZXJ0aWZp Y2F0ZS5leHRlbnNpb25zLj8lZC5leHRuSUQiLCBleHQpOwo+PiArCj4+ICsgICAgICBleHRuSURf c2l6ZSA9IHNpemVvZiAoZXh0bklEKTsKPj4gKyAgICAgIHJlc3VsdCA9IGFzbjFfcmVhZF92YWx1 ZSAoY2VydCwgb2lkX3BhdGgsIGV4dG5JRCwgCj4+ICZleHRuSURfc2l6ZSk7Cj4+ICsgICAgICBp ZiAocmVzdWx0ICE9IEFTTjFfU1VDQ0VTUykKPj4gKyAgICAgICAgewo+PiArICAgICAgICAgIGVy ciA9IGdydWJfZXJyb3IgKEdSVUJfRVJSX0JBRF9GSUxFX1RZUEUsICJFcnJvciByZWFkaW5nCj4+ IGV4dGVuc2lvbiBPSUQ6ICVzIiwKPj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc24x X3N0cmVycm9yIChyZXN1bHQpKTsKPj4gKyAgICAgICAgICBnb3RvIGNsZWFudXBfb2lkX3BhdGg7 Cj4+ICsgICAgICAgIH0KPj4gKwo+PiArICAgICAgY3JpdGljYWxfcGF0aCA9IGdydWJfeGFzcHJp bnRmCj4+ICgidGJzQ2VydGlmaWNhdGUuZXh0ZW5zaW9ucy4/JWQuY3JpdGljYWwiLCBleHQpOwo+ PiArICAgICAgY3JpdGljYWxfc2l6ZSA9IHNpemVvZiAoY3JpdGljYWwpOwo+PiArICAgICAgcmVz dWx0ID0gYXNuMV9yZWFkX3ZhbHVlIChjZXJ0LCBjcml0aWNhbF9wYXRoLCBjcml0aWNhbCwgCj4+ ICZjcml0aWNhbF9zaXplKTsKPj4gKyAgICAgIGlmIChyZXN1bHQgPT0gQVNOMV9FTEVNRU5UX05P VF9GT1VORCkKPj4gKyAgICAgICAgewo+PiArICAgICAgICAgIGNyaXRpY2FsWzBdID0gJ1wwJzsK Pj4gKyAgICAgICAgfQo+PiArICAgICAgZWxzZSBpZiAocmVzdWx0ICE9IEFTTjFfU1VDQ0VTUykK Pj4gKyAgICAgICAgewo+PiArICAgICAgICAgIGVyciA9IGdydWJfZXJyb3IgKEdSVUJfRVJSX0JB RF9GSUxFX1RZUEUsICJFcnJvciByZWFkaW5nCj4+IGV4dGVuc2lvbiBjcml0aWNhbGl0eTogJXMi LAo+PiArICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzbjFfc3RyZXJyb3IgKHJlc3VsdCkp Owo+PiArICAgICAgICAgIGdvdG8gY2xlYW51cF9jcml0aWNhbF9wYXRoOwo+PiArICAgICAgICB9 Cj4+ICsKPj4gKyAgICAgIHZhbHVlX3BhdGggPSBncnViX3hhc3ByaW50Zgo+PiAoInRic0NlcnRp ZmljYXRlLmV4dGVuc2lvbnMuPyVkLmV4dG5WYWx1ZSIsIGV4dCk7Cj4+ICsgICAgICB2YWx1ZSA9 IGdydWJfYXNuMV9hbGxvY2F0ZV9hbmRfcmVhZCAoY2VydCwgdmFsdWVfcGF0aCwKPj4gKyAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY2VydGlmaWNhdGUgZXh0ZW5z aW9uCj4+IHZhbHVlIiwgJnZhbHVlX3NpemUpOwo+PiArICAgICAgaWYgKCF2YWx1ZSkKPj4gKyAg ICAgICAgewo+PiArICAgICAgICAgIGVyciA9IGdydWJfZXJybm87Cj4+ICsgICAgICAgICAgZ290 byBjbGVhbnVwX3ZhbHVlX3BhdGg7Cj4+ICsgICAgICAgIH0KPj4gKwo+PiArICAgICAgLyoKPj4g KyAgICAgICAqIE5vdyB3ZSBtdXN0IHNlZSBpZiB3ZSByZWNvZ25pc2UgdGhlIE9JRC4KPj4gKyAg ICAgICAqIElmIHdlIGhhdmUgYW4gdW5yZWNvZ25pc2VkIGNyaXRpY2FsIGV4dGVuc2lvbiB3ZSBN VVNUIGJhaWwuCj4+ICsgICAgICAgKi8KPj4gKyAgICAgIGlmIChncnViX3N0cm5jbXAgKGtleVVz YWdlX29pZCwgZXh0bklELCBleHRuSURfc2l6ZSkgPT0gMCkKPj4gKyAgICAgICAgewo+PiArICAg ICAgICAgIGVyciA9IHZlcmlmeV9rZXlfdXNhZ2UgKHZhbHVlLCB2YWx1ZV9zaXplKTsKPj4gKyAg ICAgICAgICBpZiAoZXJyICE9IEdSVUJfRVJSX05PTkUpCj4+ICsgICAgICAgICAgICB7Cj4+ICsg ICAgICAgICAgICAgIGdvdG8gY2xlYW51cF92YWx1ZTsKPj4gKyAgICAgICAgICAgIH0KPj4gKyAg ICAgICAgICB1c2FnZV9wcmVzZW50Kys7Cj4+ICsgICAgICAgIH0KPj4gKyAgICAgIGVsc2UgaWYg KGdydWJfc3RybmNtcCAoYmFzaWNDb25zdHJhaW50c19vaWQsIGV4dG5JRCwgCj4+IGV4dG5JRF9z aXplKSA9PSAwKQo+PiArICAgICAgICB7Cj4+ICsgICAgICAgICAgZXJyID0gdmVyaWZ5X2Jhc2lj X2NvbnN0cmFpbnRzICh2YWx1ZSwgdmFsdWVfc2l6ZSk7Cj4+ICsgICAgICAgICAgaWYgKGVyciAh PSBHUlVCX0VSUl9OT05FKQo+PiArICAgICAgICAgICAgewo+PiArICAgICAgICAgICAgICBnb3Rv IGNsZWFudXBfdmFsdWU7Cj4+ICsgICAgICAgICAgICB9Cj4+ICsgICAgICAgICAgY29uc3RyYWlu dHNfcHJlc2VudCsrOwo+PiArICAgICAgICB9Cj4+ICsgICAgICBlbHNlIGlmIChncnViX3N0cm5j bXAgKGV4dGVuZGVkS2V5VXNhZ2Vfb2lkLCBleHRuSUQsIAo+PiBleHRuSURfc2l6ZSkgPT0gMCkK Pj4gKyAgICAgICAgewo+PiArICAgICAgICAgIGVyciA9IHZlcmlmeV9leHRlbmRlZF9rZXlfdXNh Z2UgKHZhbHVlLCB2YWx1ZV9zaXplKTsKPj4gKyAgICAgICAgICBpZiAoZXJyICE9IEdSVUJfRVJS X05PTkUpCj4+ICsgICAgICAgICAgICB7Cj4+ICsgICAgICAgICAgICAgIGdvdG8gY2xlYW51cF92 YWx1ZTsKPj4gKyAgICAgICAgICAgIH0KPj4gKyAgICAgICAgICBleHRlbmRlZF91c2FnZV9wcmVz ZW50Kys7Cj4+ICsgICAgICAgIH0KPj4gKyAgICAgIGVsc2UgaWYgKGdydWJfc3RybmNtcCAoIlRS VUUiLCBjcml0aWNhbCwgY3JpdGljYWxfc2l6ZSkgPT0gMCkKPj4gKyAgICAgICAgewo+PiArICAg ICAgICAgIC8qCj4+ICsgICAgICAgICAgICogcGVyIHRoZSBSRkMsIHdlIG11c3Qgbm90IHByb2Nl c3MgYSBjZXJ0aWZpY2F0ZSB3aXRoCj4+ICsgICAgICAgICAgICogYSBjcml0aWNhbCBleHRlbnNp b24gd2UgZG8gbm90IHVuZGVyc3RhbmQuCj4+ICsgICAgICAgICAgICovCj4+ICsgICAgICAgICAg ZXJyID0gZ3J1Yl9lcnJvciAoR1JVQl9FUlJfQkFEX0ZJTEVfVFlQRSwKPj4gKyAgICAgICAgICAg ICAgICAgICAgICAgICAgICAiVW5oYW5kbGVkIGNyaXRpY2FsIHg1MDkgZXh0ZW5zaW9uIHdpdGgK Pj4gT0lEICVzIiwgZXh0bklEKTsKPj4gKyAgICAgICAgICBnb3RvIGNsZWFudXBfdmFsdWU7Cj4+ ICsgICAgICAgIH0KPj4gKwo+PiArICAgICAgZ3J1Yl9mcmVlICh2YWx1ZSk7Cj4+ICsgICAgICBn cnViX2ZyZWUgKHZhbHVlX3BhdGgpOwo+PiArICAgICAgZ3J1Yl9mcmVlIChjcml0aWNhbF9wYXRo KTsKPj4gKyAgICAgIGdydWJfZnJlZSAob2lkX3BhdGgpOwo+PiArICAgIH0KPj4gKwo+PiArICBp ZiAodXNhZ2VfcHJlc2VudCAhPSAxKQo+PiArICAgIHsKPj4gKyAgICAgIHJldHVybiBncnViX2Vy cm9yIChHUlVCX0VSUl9CQURfRklMRV9UWVBFLCAiVW5leHBlY3RlZCBudW1iZXIKPj4gb2YgS2V5 IFVzYWdlIGV4dGVuc2lvbnMgIgo+PiArICAgICAgICAgICAgICAgICAgICAgICAgICItIGV4cGVj dGVkIDEsIGdvdCAlZCIsIHVzYWdlX3ByZXNlbnQpOwo+PiArICAgIH0KPj4gKyAgaWYgKGNvbnN0 cmFpbnRzX3ByZXNlbnQgIT0gMSkKPj4gKyAgICB7Cj4+ICsgICAgICByZXR1cm4gZ3J1Yl9lcnJv ciAoR1JVQl9FUlJfQkFEX0ZJTEVfVFlQRSwgIlVuZXhwZWN0ZWQgbnVtYmVyCj4+IG9mIGJhc2lj IGNvbnN0cmFpbnRzIGV4dGVuc2lvbnMgIgo+PiArICAgICAgICAgICAgICAgICAgICAgICAgICIt IGV4cGVjdGVkIDEsIGdvdCAlZCIsIAo+PiBjb25zdHJhaW50c19wcmVzZW50KTsKPj4gKyAgICB9 Cj4+ICsgIGlmIChleHRlbmRlZF91c2FnZV9wcmVzZW50ID4gMSkKPj4gKyAgICB7Cj4+ICsgICAg ICByZXR1cm4gZ3J1Yl9lcnJvciAoR1JVQl9FUlJfQkFEX0ZJTEVfVFlQRSwgIlVuZXhwZWN0ZWQg bnVtYmVyCj4+IG9mIEV4dGVuZGVkIEtleSBVc2FnZSBleHRlbnNpb25zICIKPj4gKyAgICAgICAg ICAgICAgICAgICAgICAgICAiLSBleHBlY3RlZCAwIG9yIDEsIGdvdCAlZCIsIAo+PiBleHRlbmRl ZF91c2FnZV9wcmVzZW50KTsKPj4gKyAgICB9Cj4+ICsgIHJldHVybiBHUlVCX0VSUl9OT05FOwo+ PiArCj4+ICtjbGVhbnVwX3ZhbHVlOgo+PiArICBncnViX2ZyZWUgKHZhbHVlKTsKPj4gK2NsZWFu dXBfdmFsdWVfcGF0aDoKPj4gKyAgZ3J1Yl9mcmVlICh2YWx1ZV9wYXRoKTsKPj4gK2NsZWFudXBf Y3JpdGljYWxfcGF0aDoKPj4gKyAgZ3J1Yl9mcmVlIChjcml0aWNhbF9wYXRoKTsKPj4gK2NsZWFu dXBfb2lkX3BhdGg6Cj4+ICsgIGdydWJfZnJlZSAob2lkX3BhdGgpOwo+PiArICByZXR1cm4gZXJy Owo+PiArfQo+PiArCj4+ICsvKgo+PiArICogUGFyc2UgYSBjZXJ0aWZpY2F0ZSB3aG9zZSBERVIt ZW5jb2RlZCBmb3JtIGlzIGluIEBkYXRhLCBvZiBzaXplIAo+PiBAZGF0YV9zaXplLgo+PiArICog UmV0dXJuIHRoZSByZXN1bHRzIGluIEByZXN1bHRzLCB3aGljaCBtdXN0IHBvaW50IHRvIGFuIGFs bG9jYXRlZAo+PiB4NTA5IGNlcnRpZmljYXRlLgo+PiArICovCj4+ICtncnViX2Vycl90Cj4+ICtw YXJzZV94NTA5X2NlcnRpZmljYXRlIChjb25zdCB2b2lkICpkYXRhLCBncnViX3NpemVfdCBkYXRh X3NpemUsCj4+IHN0cnVjdCB4NTA5X2NlcnRpZmljYXRlICpyZXN1bHRzKQo+PiArewo+PiArICBp bnQgcmVzdWx0ID0gMDsKPj4gKyAgYXNuMV9ub2RlIGNlcnQ7Cj4+ICsgIGdydWJfZXJyX3QgZXJy Owo+PiArICBpbnQgc2l6ZTsKPj4gKyAgaW50IHRtcF9zaXplOwo+PiArCj4+ICsgIGlmIChkYXRh X3NpemUgPiBHUlVCX0lOVF9NQVgpCj4+ICsgICAgcmV0dXJuIGdydWJfZXJyb3IgKEdSVUJfRVJS X09VVF9PRl9SQU5HRSwKPj4gKyAgICAgICAgICAgICAgICAgICAgICAgIkNhbm5vdCBwYXJzZSBh IGNlcnRpZmljYXRlIHdoZXJlIGRhdGEgc2l6ZSA+IAo+PiBJTlRfTUFYIik7Cj4+ICsgIHNpemUg PSAoaW50KSBkYXRhX3NpemU7Cj4+ICsKPj4gKyAgcmVzdWx0ID0gYXNuMV9jcmVhdGVfZWxlbWVu dCAoX2dudXRsc19wa2l4X2FzbiwgCj4+ICJQS0lYMS5DZXJ0aWZpY2F0ZSIsICZjZXJ0KTsKPj4g KyAgaWYgKHJlc3VsdCAhPSBBU04xX1NVQ0NFU1MpCj4+ICsgICAgewo+PiArICAgICAgcmV0dXJu IGdydWJfZXJyb3IgKEdSVUJfRVJSX09VVF9PRl9NRU1PUlksCj4+ICsgICAgICAgICAgICAgICAg ICAgICAgICAgIkNvdWxkIG5vdCBjcmVhdGUgQVNOLjEgc3RydWN0dXJlIGZvcgo+PiBjZXJ0aWZp Y2F0ZTogJXMiLAo+PiArICAgICAgICAgICAgICAgICAgICAgICAgIGFzbjFfc3RyZXJyb3IgKHJl c3VsdCkpOwo+PiArICAgIH0KPj4gKwo+PiArICByZXN1bHQgPSBhc24xX2Rlcl9kZWNvZGluZzIg KCZjZXJ0LCBkYXRhLCAmc2l6ZSwKPj4gQVNOMV9ERUNPREVfRkxBR19TVFJJQ1RfREVSLCBhc24x X2Vycm9yKTsKPj4gKyAgaWYgKHJlc3VsdCAhPSBBU04xX1NVQ0NFU1MpCj4+ICsgICAgewo+PiAr ICAgICAgZXJyID0gZ3J1Yl9lcnJvciAoR1JVQl9FUlJfQkFEX0ZJTEVfVFlQRSwKPj4gKyAgICAg ICAgICAgICAgICAgICAgICAgICJDb3VsZCBub3QgcGFyc2UgREVSIGZvciBjZXJ0aWZpY2F0ZTog JXMiLCAKPj4gYXNuMV9lcnJvcik7Cj4+ICsgICAgICBnb3RvIGNsZWFudXA7Cj4+ICsgICAgfQo+ PiArCj4+ICsgIC8qCj4+ICsgICAqIFRCU0NlcnRpZmljYXRlICA6Oj0gIFNFUVVFTkNFIHsKPj4g KyAgICogICAgIHZlcnNpb24gICAgICAgICBbMF0gIEVYUExJQ0lUIFZlcnNpb24gREVGQVVMVCB2 MQo+PiArICAgKi8KPj4gKyAgZXJyID0gY2hlY2tfdmVyc2lvbiAoY2VydCk7Cj4+ICsgIGlmIChl cnIgIT0gR1JVQl9FUlJfTk9ORSkKPj4gKyAgICB7Cj4+ICsgICAgICBnb3RvIGNsZWFudXA7Cj4+ ICsgICAgfQo+PiArCj4+ICsgIC8qCj4+ICsgICAqIHNlcmlhbE51bWJlciAgICAgICAgIENlcnRp ZmljYXRlU2VyaWFsTnVtYmVyLAo+PiArICAgKgo+PiArICAgKiBDZXJ0aWZpY2F0ZVNlcmlhbE51 bWJlciAgOjo9ICBJTlRFR0VSCj4+ICsgICAqLwo+PiArICByZXN1bHRzLT5zZXJpYWwgPSBncnVi X2FzbjFfYWxsb2NhdGVfYW5kX3JlYWQgKGNlcnQsCj4+ICJ0YnNDZXJ0aWZpY2F0ZS5zZXJpYWxO dW1iZXIiLAo+PiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICJjZXJ0aWZpY2F0ZSBzZXJpYWwKPj4gbnVtYmVyIiwgJnRtcF9zaXplKTsKPj4gKyAgaWYg KCFyZXN1bHRzLT5zZXJpYWwpCj4+ICsgICAgewo+PiArICAgICAgZXJyID0gZ3J1Yl9lcnJubzsK Pj4gKyAgICAgIGdvdG8gY2xlYW51cDsKPj4gKyAgICB9Cj4+ICsgIC8qCj4+ICsgICAqIEl0J3Mg c2FmZSB0byBjYXN0IHRoZSBzaWduZWQgaW50IHRvIGFuIHVuc2lnbmVkIGhlcmUsIHdlIGtub3cK Pj4gKyAgICogbGVuZ3RoIGlzIG5vbi1uZWdhdGl2ZQo+PiArICAgKi8KPj4gKyAgcmVzdWx0cy0+ c2VyaWFsX2xlbiA9IHRtcF9zaXplOwo+PiArCj4+ICsgIC8qCj4+ICsgICAqIHNpZ25hdHVyZSAg ICAgICAgICAgIEFsZ29yaXRobUlkZW50aWZpZXIsCj4+ICsgICAqCj4+ICsgICAqIFdlIGRvbid0 IGxvYWQgdGhlIHNpZ25hdHVyZSBvciBpc3N1ZXIgYXQgdGhlIG1vbWVudCwKPj4gKyAgICogYXMg d2UgZG9uJ3QgYXR0ZW1wdCB4NTA5IHZlcmlmaWNhdGlvbi4KPj4gKyAgICovCj4+ICsKPj4gKyAg LyoKPj4gKyAgICogaXNzdWVyICAgICAgICAgICAgICAgTmFtZSwKPj4gKyAgICoKPj4gKyAgICog VGhlIFJGQyBvbmx5IHJlcXVpcmVzIHRoZSBzZXJpYWwgbnVtYmVyIHRvIGJlIHVuaXF1ZSB3aXRo aW4KPj4gKyAgICogaXNzdWVycywgc28gdG8gYXZvaWQgYW1iaWd1aXR5IHdlIF90ZWNobmljYWxs eV8gb3VnaHQgdG8gbWFrZQo+PiArICAgKiB0aGlzIGF2YWlsYWJsZS4KPj4gKyAgICovCj4+ICsK Pj4gKyAgLyoKPj4gKyAgICogdmFsaWRpdHkgICAgICAgICAgICAgVmFsaWRpdHksCj4+ICsgICAq Cj4+ICsgICAqIFZhbGlkaXR5IDo6PSBTRVFVRU5DRSB7Cj4+ICsgICAqICAgICBub3RCZWZvcmUg ICAgICBUaW1lLAo+PiArICAgKiAgICAgbm90QWZ0ZXIgICAgICAgVGltZSB9Cj4+ICsgICAqCj4+ ICsgICAqIFdlIGNhbid0IHZhbGlkYXRlIHRoaXMgcmVhc29uYWJseSwgd2UgaGF2ZSBubyB0cnVl IHRpbWUgc291cmNlIAo+PiBvbiBzZXZlcmFsCj4+ICsgICAqIHBsYXRmb3Jtcy4gRm9yIG5vdyB3 ZSBkbyBub3QgcGFyc2UgdGhlbS4KPj4gKyAgICovCj4+ICsKPj4gKyAgLyoKPj4gKyAgICogc3Vi amVjdCAgICAgICAgICAgICAgTmFtZSwKPj4gKyAgICoKPj4gKyAgICogVGhpcyBpcyBhbiBYNTAx IG5hbWUsIHdlIHBhcnNlIG91dCBqdXN0IHRoZSBDTi4KPj4gKyAgICovCj4+ICsgIGVyciA9IHJl YWRfbmFtZSAoY2VydCwgInRic0NlcnRpZmljYXRlLnN1YmplY3QiLCAmcmVzdWx0cy0+c3ViamVj dCwKPj4gJnJlc3VsdHMtPnN1YmplY3RfbGVuKTsKPj4gKyAgaWYgKGVyciAhPSBHUlVCX0VSUl9O T05FKQo+PiArICAgIGdvdG8gY2xlYW51cF9zZXJpYWw7Cj4+ICsKPj4gKyAgLyoKPj4gKyAgICog VEJTQ2VydGlmaWNhdGUgIDo6PSAgU0VRVUVOQ0UgIHsKPj4gKyAgICogICAgLi4uCj4+ICsgICAq ICAgIHN1YmplY3RQdWJsaWNLZXlJbmZvIFN1YmplY3RQdWJsaWNLZXlJbmZvLAo+PiArICAgKiAg ICAuLi4KPj4gKyAgICovCj4+ICsgIGVyciA9IGdydWJfeDUwOV9yZWFkX3N1YmplY3RfcHVibGlj X2tleSAoY2VydCwgcmVzdWx0cyk7Cj4+ICsgIGlmIChlcnIgIT0gR1JVQl9FUlJfTk9ORSkKPj4g KyAgICBnb3RvIGNsZWFudXBfbmFtZTsKPj4gKwo+PiArICAvKgo+PiArICAgKiBUQlNDZXJ0aWZp Y2F0ZSAgOjo9ICBTRVFVRU5DRSAgewo+PiArICAgKiAgICAuLi4KPj4gKyAgICogICAgZXh0ZW5z aW9ucyAgICAgIFszXSAgRVhQTElDSVQgRXh0ZW5zaW9ucyBPUFRJT05BTAo+PiArICAgKiAgICAg ICAgICAgICAgICAgICAgICAgICAtLSBJZiBwcmVzZW50LCB2ZXJzaW9uIE1VU1QgYmUgdjMKPj4g KyAgICogfQo+PiArICAgKi8KPj4gKwo+PiArICBlcnIgPSB2ZXJpZnlfZXh0ZW5zaW9ucyAoY2Vy dCk7Cj4+ICsgIGlmIChlcnIgIT0gR1JVQl9FUlJfTk9ORSkKPj4gKyAgICBnb3RvIGNsZWFudXBf bXBpczsKPj4gKwo+PiArICAvKgo+PiArICAgKiBXZSBkbyBub3QgcmVhZCBvciBjaGVjayB0aGUg c2lnbmF0dXJlIG9uIHRoZSBjZXJ0aWZpY2F0ZToKPj4gKyAgICogYXMgZGlzY3Vzc2VkIHdlIGRv IG5vdCB0cnkgdG8gdmFsaWRhdGUgdGhlIGNlcnRpZmljYXRlIGJ1dCB0cnVzdAo+PiArICAgKiBp dCBpbXBsaWN0bHkuCj4+ICsgICAqLwo+PiArCj4+ICsgIGFzbjFfZGVsZXRlX3N0cnVjdHVyZSAo JmNlcnQpOwo+PiArICByZXR1cm4gR1JVQl9FUlJfTk9ORTsKPj4gKwo+PiArY2xlYW51cF9tcGlz Ogo+PiArICBnY3J5X21waV9yZWxlYXNlIChyZXN1bHRzLT5tcGlzWzBdKTsKPj4gKyAgZ2NyeV9t cGlfcmVsZWFzZSAocmVzdWx0cy0+bXBpc1sxXSk7Cj4+ICtjbGVhbnVwX25hbWU6Cj4+ICsgIGdy dWJfZnJlZSAocmVzdWx0cy0+c3ViamVjdCk7Cj4+ICtjbGVhbnVwX3NlcmlhbDoKPj4gKyAgZ3J1 Yl9mcmVlIChyZXN1bHRzLT5zZXJpYWwpOwo+PiArY2xlYW51cDoKPj4gKyAgYXNuMV9kZWxldGVf c3RydWN0dXJlICgmY2VydCk7Cj4+ICsgIHJldHVybiBlcnI7Cj4+ICt9Cj4+ICsKPj4gKy8qCj4+ ICsgKiBSZWxlYXNlIGFsbCB0aGUgc3RvcmFnZSBhc3NvY2lhdGVkIHdpdGggdGhlIHg1MDkgY2Vy dGlmaWNhdGUuCj4+ICsgKiBJZiB0aGUgY2FsbGVyIGR5bmFtaWNhbGx5IGFsbG9jYXRlZCB0aGUg Y2VydGlmaWNhdGUsIGl0IG11c3QgZnJlZSAKPj4gaXQuCj4+ICsgKiBUaGUgY2FsbGVyIGlzIGFs c28gcmVzcG9uc2libGUgZm9yIG1haW50ZW5hbmNlIG9mIHRoZSBsaW5rZWQgbGlzdC4KPj4gKyAq Lwo+PiArdm9pZAo+PiArY2VydGlmaWNhdGVfcmVsZWFzZSAoc3RydWN0IHg1MDlfY2VydGlmaWNh dGUgKmNlcnQpCj4+ICt7Cj4+ICsgIGdydWJfZnJlZSAoY2VydC0+c3ViamVjdCk7Cj4+ICsgIGdy dWJfZnJlZSAoY2VydC0+c2VyaWFsKTsKPj4gKyAgZ2NyeV9tcGlfcmVsZWFzZSAoY2VydC0+bXBp c1swXSk7Cj4+ICsgIGdjcnlfbXBpX3JlbGVhc2UgKGNlcnQtPm1waXNbMV0pOwo+PiArfQoKCkFk ZHJlc3NlZCB5b3VyIHN1Z2dlc3Rpb24uIHRoYW5rIHlvdSAgQXZuaXNoIENob3VoYW4uCgpUaGFu a3MsClN1ZGhha2FyIEt1cHB1c2FteQoKX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX18KR3J1Yi1kZXZlbCBtYWlsaW5nIGxpc3QKR3J1Yi1kZXZlbEBnbnUub3Jn Cmh0dHBzOi8vbGlzdHMuZ251Lm9yZy9tYWlsbWFuL2xpc3RpbmZvL2dydWItZGV2ZWwK