From mboxrd@z Thu Jan 1 00:00:00 1970 From: Jaegeuk Kim Subject: Re: [PATCH] f2fscrypt: add a tool for encryption management in the f2fs filesystem Date: Mon, 6 Mar 2017 17:39:05 -0800 Message-ID: <20170307013905.GA6423@jaegeuk.local> References: <7ac27d31-fb60-995e-ecf6-a63b48bc9423@gmail.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: Received: from sog-mx-4.v43.ch3.sourceforge.com ([172.29.43.194] helo=mx.sourceforge.net) by sfs-ml-3.v29.ch3.sourceforge.com with esmtp (Exim 4.76) (envelope-from ) id 1cl46C-0001ay-P8 for linux-f2fs-devel@lists.sourceforge.net; Tue, 07 Mar 2017 01:39:36 +0000 Received: from mail.kernel.org ([198.145.29.136]) by sog-mx-4.v43.ch3.sourceforge.com with esmtps (TLSv1:AES256-SHA:256) (Exim 4.76) id 1cl469-0000yN-CK for linux-f2fs-devel@lists.sourceforge.net; Tue, 07 Mar 2017 01:39:36 +0000 Content-Disposition: inline In-Reply-To: <7ac27d31-fb60-995e-ecf6-a63b48bc9423@gmail.com> List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: linux-f2fs-devel-bounces@lists.sourceforge.net To: Kinglong Mee Cc: linux-f2fs-devel@lists.sourceforge.net SGksCgpUaGVyZSBhcmUgc2V2ZXJhbCBidWlsZCBlcnJvcnMuCgpmMmZzY3J5cHQuYzo5MDozNzog ZXJyb3I6IOKAmEZTX0tFWV9ERVNDUklQVE9SX1NJWkXigJkgdW5kZWNsYXJlZCBoZXJlIChub3Qg aW4gYSBmdW5jdGlvbikKI2RlZmluZSBGMkZTX0tFWV9SRUZfU1RSX0JVRl9TSVpFICgoRlNfS0VZ X0RFU0NSSVBUT1JfU0laRSAqIDIpICsgMSkKXgpmMmZzY3J5cHQuYzoyMDY6MTk6IG5vdGU6IGlu IGV4cGFuc2lvbiBvZiBtYWNybyDigJhGMkZTX0tFWV9SRUZfU1RSX0JVRl9TSVpF4oCZCmNoYXIg a2V5X3JlZl9zdHJbRjJGU19LRVlfUkVGX1NUUl9CVUZfU0laRV07Cl4KZjJmc2NyeXB0LmM6IElu IGZ1bmN0aW9uIOKAmHBhcnNlX3NhbHTigJk6CmYyZnNjcnlwdC5jOjMxOToxOTogZXJyb3I6IOKA mEZTX0lPQ19HRVRfRU5DUllQVElPTl9QV1NBTFTigJkgdW5kZWNsYXJlZCAoZmlyc3QgdXNlIGlu IHRoaXMgZnVuY3Rpb24pCnJldCA9IGlvY3RsKGZkLCBGU19JT0NfR0VUX0VOQ1JZUFRJT05fUFdT QUxULCAmYnVmKTsKCmFuZCBzbyBvbi4KCk9uIDAzLzA2LCBLaW5nbG9uZyBNZWUgd3JvdGU6Cj4g SXQncyBtaWdyYXRlZCBmcm9tIGU0Y3J5cHQuCj4gQWRkcyBhbiBleGFtcGxlIHRvIHRoZSBmMmZz Y3J5cHQgbWFucGFnZXMuCj4gCj4gU2lnbmVkLW9mZi1ieTogS2luZ2xvbmcgTWVlIDxraW5nbG9u Z21lZUBnbWFpbC5jb20+Cj4gLS0tCj4gIHRvb2xzL01ha2VmaWxlLmFtIHwgICA1ICstCj4gIHRv b2xzL2YyZnNjcnlwdC44IHwgMTAyICsrKysrKysKPiAgdG9vbHMvZjJmc2NyeXB0LmMgfCA4OTgg KysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrCj4g IHRvb2xzL3NoYTUxMi5jICAgIHwgMzIzICsrKysrKysrKysrKysrKysrKysrCj4gIDQgZmlsZXMg Y2hhbmdlZCwgMTMyNyBpbnNlcnRpb25zKCspLCAxIGRlbGV0aW9uKC0pCj4gIGNyZWF0ZSBtb2Rl IDEwMDY0NCB0b29scy9mMmZzY3J5cHQuOAo+ICBjcmVhdGUgbW9kZSAxMDA2NDQgdG9vbHMvZjJm c2NyeXB0LmMKPiAgY3JlYXRlIG1vZGUgMTAwNjQ0IHRvb2xzL3NoYTUxMi5jCj4gCj4gZGlmZiAt LWdpdCBhL3Rvb2xzL01ha2VmaWxlLmFtIGIvdG9vbHMvTWFrZWZpbGUuYW0KPiBpbmRleCA2OWEw YmIxLi43Yjc4NmRiIDEwMDY0NAo+IC0tLSBhL3Rvb2xzL01ha2VmaWxlLmFtCj4gKysrIGIvdG9v bHMvTWFrZWZpbGUuYW0KPiBAQCAtMiw3ICsyLDEwIEBACj4gIAo+ICBBTV9DUFBGTEFHUyA9ICR7 bGlidXVpZF9DRkxBR1N9IC1JJCh0b3Bfc3JjZGlyKS9pbmNsdWRlCj4gIEFNX0NGTEFHUyA9IC1X YWxsCj4gLXNiaW5fUFJPR1JBTVMgPSBmMmZzdGF0IGZpYm1hcC5mMmZzIHBhcnNlLmYyZnMKPiAr c2Jpbl9QUk9HUkFNUyA9IGYyZnN0YXQgZmlibWFwLmYyZnMgcGFyc2UuZjJmcyBmMmZzY3J5cHQK PiAgZjJmc3RhdF9TT1VSQ0VTID0gZjJmc3RhdC5jCj4gIGZpYm1hcF9mMmZzX1NPVVJDRVMgPSBm aWJtYXAuYwo+ICBwYXJzZV9mMmZzX1NPVVJDRVMgPSBmMmZzX2lvX3BhcnNlLmMKPiArZjJmc2Ny eXB0X1NPVVJDRVMgPSBmMmZzY3J5cHQuYyBzaGE1MTIuYwo+ICtmMmZzY3J5cHRfTERGTEFHUyA9 IC1sdXVpZCAtbGNyeXB0byAtbHNzbAo+ICtkaXN0X21hbl9NQU5TID0gZjJmc2NyeXB0LjgKPiBk aWZmIC0tZ2l0IGEvdG9vbHMvZjJmc2NyeXB0LjggYi90b29scy9mMmZzY3J5cHQuOAo+IG5ldyBm aWxlIG1vZGUgMTAwNjQ0Cj4gaW5kZXggMDAwMDAwMC4uYTYwYWRjOAo+IC0tLSAvZGV2L251bGwK PiArKysgYi90b29scy9mMmZzY3J5cHQuOAo+IEBAIC0wLDAgKzEsMTAyIEBACj4gKy5USCBGMkZT Q1JZUFQgOAo+ICsuU0ggTkFNRQo+ICtmMmZzY3J5cHQgXC0gZjJmcyBmaWxlc3lzdGVtIGVuY3J5 cHRpb24gdXRpbGl0eQo+ICsuU0ggU1lOT1BTSVMKPiArLkIgZjJmc2NyeXB0IGFkZF9rZXkgLVMg XGZSW1xmQiAtayBcZklrZXlyaW5nXGZSIF0gW1xmQi12XGZSXSBbXGZCLXFcZlJdIFsgXGZJIHBh dGhcZlIgLi4uIF0KPiArLmJyCj4gKy5CIGYyZnNjcnlwdCBuZXdfc2Vzc2lvbgo+ICsuYnIKPiAr LkIgZjJmc2NyeXB0IGdldF9wb2xpY3kgXGZJcGF0aFxmUiAuLi4KPiArLmJyCj4gKy5CIGYyZnNj cnlwdCBzZXRfcG9saWN5IFxmSXBvbGljeSBwYXRoXGZSIC4uLgo+ICsuU0ggREVTQ1JJUFRJT04K PiArLkIgZjJmc2NyeXB0Cj4gK3BlcmZvcm1zIGVuY3J5cHRpb24gbWFuYWdlbWVudCBmb3IgZjJm cyBmaWxlIHN5c3RlbXMuCj4gKy5TSCBDT01NQU5EUwo+ICsuVFAKPiArLkIgZjJmc2NyeXB0IGFk ZF9rZXkgLVMgXGZSW1xmQiAtayBcZklrZXlyaW5nXGZSIF0gW1xmQi12XGZSXSBbXGZCLXFcZlJd IFsgXGZJIHBhdGhcZlIgLi4uIF0KPiArUHJvbXB0cyB0aGUgdXNlciBmb3IgYSBwYXNzcGhyYXNl IGFuZCBpbnNlcnRzIGl0IGludG8gdGhlIHNwZWNpZmllZAo+ICtrZXlyaW5nLiAgSWYgbm8ga2V5 cmluZyBpcyBzcGVjaWZpZWQsIGYyZnNjcnlwdCB3aWxsIHVzZSB0aGUgc2Vzc2lvbgo+ICtrZXly aW5nIGlmIGl0IGV4aXN0cyBvciB0aGUgdXNlciBzZXNzaW9uIGtleXJpbmcgaWYgaXQgZG9lcyBu b3QuCj4gKy5JUAo+ICtJZiBvbmUgb3IgbW9yZSBkaXJlY3RvcnkgcGF0aHMgYXJlIHNwZWNpZmll ZCwgZjJmc2NyeXB0IHdpbGwgdHJ5IHRvCj4gK3NldCB0aGUgcG9saWN5IG9mIHRob3NlIGRpcmVj dG9yaWVzIHRvIHVzZSB0aGUga2V5IGp1c3QgZW50ZXJlZCBieQo+ICt0aGUgdXNlci4KPiArLlRQ Cj4gKy5CIGYyZnNjcnlwdCBnZXRfcG9saWN5IFxmSXBhdGhcZlIgLi4uCj4gK1ByaW50IHRoZSBw b2xpY3kgZm9yIHRoZSBkaXJlY3RvcmllcyBzcGVjaWZpZWQgb24gdGhlIGNvbW1hbmQgbGluZS4K PiArLlRQCj4gKy5CIGYyZnNjcnlwdCBuZXdfc2Vzc2lvbgo+ICtHaXZlIHRoZSBpbnZva2luZyBw cm9jZXNzICh0eXBpY2FsbHkgYSBzaGVsbCkgYSBuZXcgc2Vzc2lvbiBrZXlyaW5nLAo+ICtkaXNj YXJkaW5nIGl0cyBvbGQgc2Vzc2lvbiBrZXlyaW5nLgo+ICsuVFAKPiArLkIgZjJmc2NyeXB0IHNl dF9wb2xpY3kgXGZJcG9saWN5IHBhdGhcZlIgLi4uCj4gK1NldHMgdGhlIHBvbGljeSBmb3IgdGhl IGRpcmVjdG9yaWVzIHNwZWNpZmllZCBvbiB0aGUgY29tbWFuZCBsaW5lLgo+ICtBbGwgZGlyZWN0 b3JpZXMgbXVzdCBiZSBlbXB0eSB0byBzZXQgdGhlIHBvbGljeTsgaWYgdGhlIGRpcmVjdG9yeQo+ ICthbHJlYWR5IGhhcyBhIHBvbGljeSBlc3RhYmxpc2hlZCwgZjJmc2NyeXB0IHdpbGwgdmFsaWRh dGUgdGhhdCB0aGUKPiArcG9saWN5IG1hdGNoZXMgd2hhdCB3YXMgc3BlY2lmaWVkLiAgQSBwb2xp Y3kgaXMgYW4gZW5jcnlwdGlvbiBrZXkKPiAraWRlbnRpZmllciBjb25zaXN0aW5nIG9mIDE2IGhl eGFkZWNpbWFsIGNoYXJhY3RlcnMuCj4gKy5TSCBOT1RFUwo+ICtUaGUgdGFyZ2V0IGRpcmVjdG9y eSBtdXN0IGJlIGVtcHR5Lgo+ICsuU0ggRVhBTVBMRQo+ICsubmYKPiArRm9ybWF0cyBhIGYyZnMg ZmlsZXN5dGVtIHRoYXQgc3VwcG9ydHMgZW5jcnlwdC4KPiArCj4gKy5mdCBSCj4gKyMgbWtmcy5m MmZzIC1PIGVuY3J5cHQgL2Rldi9zZHh4Cj4gKyMgbW91bnQgL2Rldi9zZHh4IC9lbmNyeXB0ZWQv Cj4gKyMgbWtkaXIgL2VuY3J5cHRlZC9kaXIKPiArCj4gKy5uZgo+ICtGaXJzdCBjcmVhdGUgdGhl IGtleSBpbiB0aGUga2V5cmluZyB1c2UgYW4gc2ltcGxlIHNhbHQKPiArKG9yIGdlbmVyYXRlIGEg cmFuZG9tIHNhbHQpLgo+ICtUaGVuIHVzZSBpdCB0byBzZXQgdGhlIHBvbGljeSBmb3IgdGhlIGRp cmVjdG9yeSB0byBiZSBlbmNyeXB0ZWQuCj4gKwo+ICsuZnQgUgo+ICsjIGYyZnNjcnlwdCBhZGRf a2V5IC1TIDB4MTIzNAo+ICsgIEVudGVyIHBhc3NwaHJhc2UgKGVjaG8gZGlzYWJsZWQpOgo+ICsg IEFkZGVkIGtleSB3aXRoIGRlc2NyaXB0b3IgWzI4ZTIxY2MwYzQzOTNkYTFdCj4gKwo+ICsjIGYy ZnNjcnlwdCBzZXRfcG9saWN5IDI4ZTIxY2MwYzQzOTNkYTEgL2VuY3J5cHRlZC9kaXIKPiArICBL ZXkgd2l0aCBkZXNjcmlwdG9yIFsyOGUyMWNjMGM0MzkzZGExXSBhcHBsaWVkIHRvIC9lbmNyeXB0 ZWQvZGlyLgo+ICsKPiArIyB0b3VjaCAvZW5jcnlwdGVkL2Rpci90ZXN0LnR4dAo+ICsjIGxzIC1s IC9lbmNyeXB0ZWQvZGlyLwo+ICsgIC1ydy1yLS1yLS0uIDEgcm9vdCByb290IDAgTWFyICA1IDIx OjQxIHRlc3QudHh0Cj4gKwo+ICsubmYKPiArQWZ0ZXIgZWFjaCByZWJvb3QsIHRoZSBzYW1lIGNv bW1hbmQgY2FuIGJlIHVzZWQgc2V0IHRoZSBrZXkgZm9yCj4gK2RlY3J5cHRpb24gb2YgdGhlIGRp cmVjdG9yeSBhbmQgaXRzIGRlc2NlbmRhbnRzLgo+ICsKPiArLmZ0IFIKPiArIyBscyAtbCAvZW5j cnlwdGVkL2Rpci8KPiArICAtcnctci0tci0tLiAxIHJvb3Qgcm9vdCAwIE1hciAgNSAyMTo0MSB6 Yng3dHNVRU1MemgrQVVWTWtRY25CCj4gKwo+ICsjIGYyZnNjcnlwdCBnZXRfcG9saWN5IC9lbmNy eXB0ZWQvZGlyLwo+ICsgIC9lbmNyeXB0ZWQvZGlyLzogMjhlMjFjYzBjNDM5M2RhMQo+ICsKPiAr IyBmMmZzY3J5cHQgYWRkX2tleSAtUyAweDEyMzQKPiArICBFbnRlciBwYXNzcGhyYXNlIChlY2hv IGRpc2FibGVkKToKPiArICBBZGRlZCBrZXkgd2l0aCBkZXNjcmlwdG9yIFsyOGUyMWNjMGM0Mzkz ZGExXQo+ICsKPiArIyBscyAtbCAvZW5jcnlwdGVkL2Rpci8KPiArICAtcnctci0tci0tLiAxIHJv b3Qgcm9vdCAwIE1hciAgNSAyMTo0MSB0ZXN0LnR4dAo+ICsKPiArLm5mCj4gK1Nob3cgcHJvY2Vz cyBrZXlyaW5ncy4KPiArCj4gKy5mdCBSCj4gKyMga2V5Y3RsIHNob3cKPiArICBTZXNzaW9uIEtl eXJpbmcKPiArICAgIDg0MDIyNDEyIC0tYWxzd3J2ICAgICAgMCAgICAgMCAga2V5cmluZzogX3Nl cwo+ICsgICAyMDQ2MTU3ODkgLS1hbHN3cnYgICAgICAwIDY1NTM0ICAgXFxfIGtleXJpbmc6IF91 aWQuMAo+ICsgICA1Mjk0NzQ5NjEgLS1hbHN3LXYgICAgICAwICAgICAwICAgXFxfIGxvZ29uOiBm MmZzOjI4ZTIxY2MwYzQzOTNkYTEKPiArCj4gKy5TSCBBVVRIT1IKPiArV3JpdHRlbiBieSBLaW5n bG9uZyBNZWUgPGtpbmdsb25nbWVlQGdtYWlsLmNvbT4sCj4gK01pZ3JhdGVkIGZyb20gZTRjcnlw dCB0aGF0IFdyaXR0ZW4gYnkgTWljaGFlbCBIYWxjcm93IDxtaGFsY3Jvd0Bnb29nbGUuY29tPiwK PiArSWxkYXIgTXVzbHVraG92IDxtdXNsdWtob3ZpQGdtYWlsLmNvbT4sIGFuZCBUaGVvZG9yZSBU cydvIDx0eXRzb0BtaXQuZWR1Pgo+ICsuU0ggU0VFIEFMU08KPiArLkJSIGtleWN0bCAoMSksCj4g Ky5CUiBta2ZzLmYyZnMgKDgpLAo+ICsuQlIgbW91bnQgKDgpLgo+IGRpZmYgLS1naXQgYS90b29s cy9mMmZzY3J5cHQuYyBiL3Rvb2xzL2YyZnNjcnlwdC5jCj4gbmV3IGZpbGUgbW9kZSAxMDA2NDQK PiBpbmRleCAwMDAwMDAwLi4zNDY3NDQ2Cj4gLS0tIC9kZXYvbnVsbAo+ICsrKyBiL3Rvb2xzL2Yy ZnNjcnlwdC5jCj4gQEAgLTAsMCArMSw4OTggQEAKPiArLyoKPiArICogZjJmc2NyeXB0LmMgLSBm MmZzIGVuY3J5cHRpb24gbWFuYWdlbWVudCB1dGlsaXR5Cj4gKyAqCj4gKyAqIEF1dGhvcnM6IEtp bmdsb25nIE1lZSA8a2luZ2xvbmdtZWVAZ21haWwuY29tPgo+ICsgKgo+ICsgKiBDb3BpZWQgZnJv bSBlNGNyeXB0IHRoYXQgZm9yIGV4dDQgZmlsZXN5c3RlbS4KPiArICogQXV0aG9yczogTWljaGFl bCBIYWxjcm93IDxtaGFsY3Jvd0Bnb29nbGUuY29tPiwKPiArICoJICAgIElsZGFyIE11c2x1a2hv diA8aWxkYXJtQGdvb2dsZS5jb20+Cj4gKyAqLwo+ICsKPiArI2lmbmRlZiBfTEFSR0VGSUxFX1NP VVJDRQo+ICsjZGVmaW5lIF9MQVJHRUZJTEVfU09VUkNFCj4gKyNlbmRpZgo+ICsKPiArI2lmbmRl ZiBfTEFSR0VGSUxFNjRfU09VUkNFCj4gKyNkZWZpbmUgX0xBUkdFRklMRTY0X1NPVVJDRQo+ICsj ZW5kaWYKPiArCj4gKyNpZm5kZWYgX0dOVV9TT1VSQ0UKPiArI2RlZmluZSBfR05VX1NPVVJDRQo+ ICsjZW5kaWYKPiArCj4gKyNpbmNsdWRlICJjb25maWcuaCIKPiArI2luY2x1ZGUgPGFzc2VydC5o Pgo+ICsjaW5jbHVkZSA8ZXJybm8uaD4KPiArI2luY2x1ZGUgPGdldG9wdC5oPgo+ICsjaW5jbHVk ZSA8ZGlyZW50Lmg+Cj4gKyNpbmNsdWRlIDxlcnJuby5oPgo+ICsjaW5jbHVkZSA8c3RkYXJnLmg+ Cj4gKyNpbmNsdWRlIDxzdGRpby5oPgo+ICsjaW5jbHVkZSA8c3RkbGliLmg+Cj4gKyNpbmNsdWRl IDxzdHJpbmcuaD4KPiArI2luY2x1ZGUgPG1udGVudC5oPgo+ICsjaW5jbHVkZSA8c3lzL2lvY3Rs Lmg+Cj4gKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgo+ICsjaW5jbHVkZSA8c3lzL3R5cGVzLmg+Cj4g KyNpbmNsdWRlIDxmY250bC5oPgo+ICsjaW5jbHVkZSA8dGVybWlvcy5oPgo+ICsjaW5jbHVkZSA8 dW5pc3RkLmg+Cj4gKyNpbmNsdWRlIDxzaWduYWwuaD4KPiArI2luY2x1ZGUgPGxpbnV4L2ZzLmg+ Cj4gKyNpbmNsdWRlIDx1dWlkL3V1aWQuaD4KPiArI2luY2x1ZGUgPG9wZW5zc2wvc2hhLmg+Cj4g Kwo+ICsjaWYgIWRlZmluZWQoSEFWRV9BRERfS0VZKSB8fCAhZGVmaW5lZChIQVZFX0tFWUNUTCkK PiArI2luY2x1ZGUgPHN5cy9zeXNjYWxsLmg+Cj4gKyNlbmRpZgo+ICsjaWZkZWYgSEFWRV9TWVNf S0VZX0gKPiArI2luY2x1ZGUgPHN5cy9rZXkuaD4KPiArI2VuZGlmCj4gKwo+ICsjZGVmaW5lIEYy RlNfTUFYX0tFWV9TSVpFCQk2NAo+ICsjZGVmaW5lIEYyRlNfTUFYX1BBU1NQSFJBU0VfU0laRQkx MDI0Cj4gKyNkZWZpbmUgRjJGU19NQVhfU0FMVF9TSVpFCQkyNTYKPiArCj4gKy8qIEVuY3J5cHRp b24gYWxnb3JpdGhtcywga2V5IHNpemUgYW5kIGtleSByZWZlcmVuY2UgbGVuICovCj4gKyNkZWZp bmUgRjJGU19FTkNSWVBUSU9OX01PREVfSU5WQUxJRAkJMAo+ICsjZGVmaW5lIEYyRlNfRU5DUllQ VElPTl9NT0RFX0FFU18yNTZfWFRTCTEKPiArI2RlZmluZSBGMkZTX0VOQ1JZUFRJT05fTU9ERV9B RVNfMjU2X0dDTQkyCj4gKyNkZWZpbmUgRjJGU19FTkNSWVBUSU9OX01PREVfQUVTXzI1Nl9DQkMJ Mwo+ICsjZGVmaW5lIEYyRlNfRU5DUllQVElPTl9NT0RFX0FFU18yNTZfQ1RTCTQKPiArCj4gKyNk ZWZpbmUgRjJGU19BRVNfMjU2X1hUU19LRVlfU0laRQkJNjQKPiArI2RlZmluZSBGMkZTX0FFU18y NTZfR0NNX0tFWV9TSVpFCQkzMgo+ICsjZGVmaW5lIEYyRlNfQUVTXzI1Nl9DQkNfS0VZX1NJWkUJ CTMyCj4gKyNkZWZpbmUgRjJGU19BRVNfMjU2X0NUU19LRVlfU0laRQkJMzIKPiArI2RlZmluZSBG MkZTX01BWF9LRVlfU0laRQkJCTY0Cj4gKwo+ICsvKiBQYXNzd29yZCBkZXJpdmF0aW9uIGNvbnN0 YW50cyAqLwo+ICsjZGVmaW5lIEYyRlNfTUFYX1BBU1NQSFJBU0VfU0laRQkJMTAyNAo+ICsjZGVm aW5lIEYyRlNfTUFYX1NBTFRfU0laRQkJCTI1Ngo+ICsjZGVmaW5lIEYyRlNfUEJLREYyX0lURVJB VElPTlMJCQkweEZGRkYKPiArCj4gKy8qIHNwZWNpYWwgcHJvY2VzcyBrZXlyaW5nIHNob3J0Y3V0 IElEcyAqLwo+ICsjZGVmaW5lIEtFWV9TUEVDX1RIUkVBRF9LRVlSSU5HCQktMQo+ICsjZGVmaW5l IEtFWV9TUEVDX1BST0NFU1NfS0VZUklORwktMgo+ICsjZGVmaW5lIEtFWV9TUEVDX1NFU1NJT05f S0VZUklORwktMwo+ICsjZGVmaW5lIEtFWV9TUEVDX1VTRVJfS0VZUklORwkJLTQKPiArI2RlZmlu ZSBLRVlfU1BFQ19VU0VSX1NFU1NJT05fS0VZUklORwktNQo+ICsjZGVmaW5lIEtFWV9TUEVDX0dS T1VQX0tFWVJJTkcJCS02Cj4gKwo+ICsjZGVmaW5lIEtFWUNUTF9HRVRfS0VZUklOR19JRAkJMAo+ ICsjZGVmaW5lIEtFWUNUTF9KT0lOX1NFU1NJT05fS0VZUklORwkxCj4gKyNkZWZpbmUgS0VZQ1RM X0RFU0NSSUJFCQkJNgo+ICsjZGVmaW5lIEtFWUNUTF9TRUFSQ0gJCQkxMAo+ICsjZGVmaW5lIEtF WUNUTF9TRVNTSU9OX1RPX1BBUkVOVAkxOAo+ICsKPiArdHlwZWRlZiBpbnQzMl90IGtleV9zZXJp YWxfdDsKPiArCj4gKyNkZWZpbmUgRjJGU19LRVlfUkVGX1NUUl9CVUZfU0laRSAoKEZTX0tFWV9E RVNDUklQVE9SX1NJWkUgKiAyKSArIDEpCj4gKwo+ICsjZGVmaW5lIE9QVF9WRVJCT1NFCTB4MDAw MQo+ICsjZGVmaW5lIE9QVF9RVUlFVAkweDAwMDIKPiArCj4gK3N0cnVjdCBmMmZzX2VuY3J5cHRp b25fa2V5IHsKPiArICAgICAgICBfX3UzMiBtb2RlOwo+ICsgICAgICAgIGNoYXIgcmF3W0YyRlNf TUFYX0tFWV9TSVpFXTsKPiArICAgICAgICBfX3UzMiBzaXplOwo+ICt9IF9fYXR0cmlidXRlX18o KF9fcGFja2VkX18pKTsKPiArCj4gK2ludCBvcHRpb25zOwo+ICsKPiArZXh0ZXJuIHZvaWQgZjJm c19zaGE1MTIoY29uc3QgdW5zaWduZWQgY2hhciAqaW4sIHVuc2lnbmVkIGxvbmcgaW5fc2l6ZSwK PiArCQkJCQkJdW5zaWduZWQgY2hhciAqb3V0KTsKPiArCj4gKyNpZm5kZWYgSEFWRV9LRVlDVEwK PiArc3RhdGljIGxvbmcga2V5Y3RsKGludCBjbWQsIC4uLikKPiArewo+ICsJdmFfbGlzdCB2YTsK PiArCXVuc2lnbmVkIGxvbmcgYXJnMiwgYXJnMywgYXJnNCwgYXJnNTsKPiArCj4gKwl2YV9zdGFy dCh2YSwgY21kKTsKPiArCWFyZzIgPSB2YV9hcmcodmEsIHVuc2lnbmVkIGxvbmcpOwo+ICsJYXJn MyA9IHZhX2FyZyh2YSwgdW5zaWduZWQgbG9uZyk7Cj4gKwlhcmc0ID0gdmFfYXJnKHZhLCB1bnNp Z25lZCBsb25nKTsKPiArCWFyZzUgPSB2YV9hcmcodmEsIHVuc2lnbmVkIGxvbmcpOwo+ICsJdmFf ZW5kKHZhKTsKPiArCXJldHVybiBzeXNjYWxsKF9fTlJfa2V5Y3RsLCBjbWQsIGFyZzIsIGFyZzMs IGFyZzQsIGFyZzUpOwo+ICt9Cj4gKyNlbmRpZgo+ICsKPiArI2lmbmRlZiBIQVZFX0FERF9LRVkK PiArc3RhdGljIGtleV9zZXJpYWxfdCBhZGRfa2V5KGNvbnN0IGNoYXIgKnR5cGUsIGNvbnN0IGNo YXIgKmRlc2NyaXB0aW9uLAo+ICsJCQkgICAgY29uc3Qgdm9pZCAqcGF5bG9hZCwgc2l6ZV90IHBs ZW4sCj4gKwkJCSAgICBrZXlfc2VyaWFsX3Qga2V5cmluZykKPiArewo+ICsJcmV0dXJuIHN5c2Nh bGwoX19OUl9hZGRfa2V5LCB0eXBlLCBkZXNjcmlwdGlvbiwgcGF5bG9hZCwKPiArCQkgICAgICAg cGxlbiwga2V5cmluZyk7Cj4gK30KPiArI2VuZGlmCj4gKwo+ICtzdGF0aWMgY29uc3QgdW5zaWdu ZWQgY2hhciAqaGV4Y2hhcnMgPSAoY29uc3QgdW5zaWduZWQgY2hhciAqKSAiMDEyMzQ1Njc4OWFi Y2RlZiI7Cj4gK3N0YXRpYyBjb25zdCBzaXplX3QgaGV4Y2hhcnNfc2l6ZSA9IDE2Owo+ICsKPiAr I2RlZmluZSBTSEE1MTJfTEVOR1RIIDY0Cj4gKyNkZWZpbmUgRjJGU19LRVlfVFlQRV9MT0dPTiAi bG9nb24iCj4gKyNkZWZpbmUgRjJGU19LRVlfREVTQ19QUkVGSVggImYyZnM6Igo+ICsjZGVmaW5l IEYyRlNfS0VZX0RFU0NfUFJFRklYX1NJWkUgNQo+ICsKPiArc3RhdGljIGludCBpbnRfbG9nMihp bnQgYXJnKQo+ICt7Cj4gKwlpbnQgICAgIGwgPSAwOwo+ICsKPiArCWFyZyA+Pj0gMTsKPiArCXdo aWxlIChhcmcpIHsKPiArCQlsKys7Cj4gKwkJYXJnID4+PSAxOwo+ICsJfQo+ICsJcmV0dXJuIGw7 Cj4gK30KPiArCj4gK3N0YXRpYyB2b2lkIHZhbGlkYXRlX3BhdGhzKGludCBhcmdjLCBjaGFyICph cmd2W10sIGludCBwYXRoX3N0YXJ0X2luZGV4KQo+ICt7Cj4gKwlpbnQgeDsKPiArCWludCB2YWxp ZCA9IDE7Cj4gKwlzdHJ1Y3Qgc3RhdCBzdDsKPiArCj4gKwlmb3IgKHggPSBwYXRoX3N0YXJ0X2lu ZGV4OyB4IDwgYXJnYzsgeCsrKSB7Cj4gKwkJaW50IHJldCA9IGFjY2Vzcyhhcmd2W3hdLCBXX09L KTsKPiArCQlpZiAocmV0KSB7Cj4gKwkJaW52YWxpZDoKPiArCQkJcGVycm9yKGFyZ3ZbeF0pOwo+ ICsJCQl2YWxpZCA9IDA7Cj4gKwkJCWNvbnRpbnVlOwo+ICsJCX0KPiArCQlyZXQgPSBzdGF0KGFy Z3ZbeF0sICZzdCk7Cj4gKwkJaWYgKHJldCA8IDApCj4gKwkJCWdvdG8gaW52YWxpZDsKPiArCQlp ZiAoIVNfSVNESVIoc3Quc3RfbW9kZSkpIHsKPiArCQkJZnByaW50ZihzdGRlcnIsICIlcyBpcyBu b3QgYSBkaXJlY3RvcnlcbiIsIGFyZ3ZbeF0pOwo+ICsJCQlnb3RvIGludmFsaWQ7Cj4gKwkJfQo+ ICsJfQo+ICsJaWYgKCF2YWxpZCkKPiArCQlleGl0KDEpOwo+ICt9Cj4gKwo+ICtzdGF0aWMgaW50 IGhleDJieXRlKGNvbnN0IGNoYXIgKmhleCwgc2l6ZV90IGhleF9zaXplLCB1bnNpZ25lZCBjaGFy ICpieXRlcywKPiArCQkgICAgc2l6ZV90IGJ5dGVzX3NpemUpCj4gK3sKPiArCXNpemVfdCB4Owo+ ICsJdW5zaWduZWQgY2hhciAqaCwgKmw7Cj4gKwo+ICsJaWYgKGhleF9zaXplICUgMikKPiArCQly ZXR1cm4gLUVJTlZBTDsKPiArCWZvciAoeCA9IDA7IHggPCBoZXhfc2l6ZTsgeCArPSAyKSB7Cj4g KwkJaCA9IG1lbWNocihoZXhjaGFycywgaGV4W3hdLCBoZXhjaGFyc19zaXplKTsKPiArCQlpZiAo IWgpCj4gKwkJCXJldHVybiAtRUlOVkFMOwo+ICsJCWwgPSBtZW1jaHIoaGV4Y2hhcnMsIGhleFt4 ICsgMV0sIGhleGNoYXJzX3NpemUpOwo+ICsJCWlmICghbCkKPiArCQkJcmV0dXJuIC1FSU5WQUw7 Cj4gKwkJaWYgKCh4ID4+IDEpID49IGJ5dGVzX3NpemUpCj4gKwkJCXJldHVybiAtRUlOVkFMOwo+ ICsJCWJ5dGVzW3ggPj4gMV0gPSAoKCh1bnNpZ25lZCBjaGFyKShoIC0gaGV4Y2hhcnMpIDw8IDQp ICsKPiArCQkJCSAodW5zaWduZWQgY2hhcikobCAtIGhleGNoYXJzKSk7Cj4gKwl9Cj4gKwlyZXR1 cm4gMDsKPiArfQo+ICsKPiArLyoKPiArICogU2FsdCBoYW5kbGluZwo+ICsgKi8KPiArc3RydWN0 IHNhbHQgewo+ICsJdW5zaWduZWQgY2hhciAqc2FsdDsKPiArCWNoYXIga2V5X3JlZl9zdHJbRjJG U19LRVlfUkVGX1NUUl9CVUZfU0laRV07Cj4gKwl1bnNpZ25lZCBjaGFyIGtleV9kZXNjW0ZTX0tF WV9ERVNDUklQVE9SX1NJWkVdOwo+ICsJdW5zaWduZWQgY2hhciBrZXlbRjJGU19NQVhfS0VZX1NJ WkVdOwo+ICsJc2l6ZV90IHNhbHRfbGVuOwo+ICt9Owo+ICtzdHJ1Y3Qgc2FsdCAqc2FsdF9saXN0 Owo+ICt1bnNpZ25lZCBudW1fc2FsdDsKPiArdW5zaWduZWQgbWF4X3NhbHQ7Cj4gK2NoYXIgaW5f cGFzc3BocmFzZVtGMkZTX01BWF9QQVNTUEhSQVNFX1NJWkVdOwo+ICsKPiArc3RhdGljIHN0cnVj dCBzYWx0ICpmaW5kX2J5X3NhbHQodW5zaWduZWQgY2hhciAqc2FsdCwgc2l6ZV90IHNhbHRfbGVu KQo+ICt7Cj4gKwl1bnNpZ25lZCBpbnQgaTsKPiArCXN0cnVjdCBzYWx0ICpwOwo+ICsKPiArCWZv ciAoaSA9IDAsIHAgPSBzYWx0X2xpc3Q7IGkgPCBudW1fc2FsdDsgaSsrLCBwKyspCj4gKwkJaWYg KChwLT5zYWx0X2xlbiA9PSBzYWx0X2xlbikgJiYKPiArCQkgICAgIW1lbWNtcChwLT5zYWx0LCBz YWx0LCBzYWx0X2xlbikpCj4gKwkJCXJldHVybiBwOwo+ICsJcmV0dXJuIE5VTEw7Cj4gK30KPiAr Cj4gK3N0YXRpYyB2b2lkIGFkZF9zYWx0KHVuc2lnbmVkIGNoYXIgKnNhbHQsIHNpemVfdCBzYWx0 X2xlbikKPiArewo+ICsJaWYgKGZpbmRfYnlfc2FsdChzYWx0LCBzYWx0X2xlbikpCj4gKwkJcmV0 dXJuOwo+ICsJaWYgKG51bV9zYWx0ID49IG1heF9zYWx0KSB7Cj4gKwkJbWF4X3NhbHQgPSBudW1f c2FsdCArIDEwOwo+ICsJCXNhbHRfbGlzdCA9IHJlYWxsb2Moc2FsdF9saXN0LCBtYXhfc2FsdCAq IHNpemVvZihzdHJ1Y3Qgc2FsdCkpOwo+ICsJCWlmICghc2FsdF9saXN0KSB7Cj4gKwkJCWZwcmlu dGYoc3RkZXJyLCAiQ291bGRuJ3QgYWxsb2NhdGUgc2FsdCBsaXN0XG4iKTsKPiArCQkJZXhpdCgx KTsKPiArCQl9Cj4gKwl9Cj4gKwlzYWx0X2xpc3RbbnVtX3NhbHRdLnNhbHQgPSBzYWx0Owo+ICsJ c2FsdF9saXN0W251bV9zYWx0XS5zYWx0X2xlbiA9IHNhbHRfbGVuOwo+ICsJbnVtX3NhbHQrKzsK PiArfQo+ICsKPiArc3RhdGljIHZvaWQgY2xlYXJfc2VjcmV0cyh2b2lkKQo+ICt7Cj4gKwlpZiAo c2FsdF9saXN0KSB7Cj4gKwkJbWVtc2V0KHNhbHRfbGlzdCwgMCwgc2l6ZW9mKHN0cnVjdCBzYWx0 KSAqIG1heF9zYWx0KTsKPiArCQlmcmVlKHNhbHRfbGlzdCk7Cj4gKwkJc2FsdF9saXN0ID0gTlVM TDsKPiArCX0KPiArCW1lbXNldChpbl9wYXNzcGhyYXNlLCAwLCBzaXplb2YoaW5fcGFzc3BocmFz ZSkpOwo+ICt9Cj4gKwo+ICtzdGF0aWMgdm9pZCBkaWVfc2lnbmFsX2hhbmRsZXIoaW50IHNpZ251 bSwgc2lnaW5mb190ICpzaWdpbmZvLCB2b2lkICpjb250ZXh0KQo+ICt7Cj4gKwljbGVhcl9zZWNy ZXRzKCk7Cj4gKwlleGl0KC0xKTsKPiArfQo+ICsKPiArc3RhdGljIHZvaWQgc2lnY2F0Y2hlcl9z ZXR1cCh2b2lkKQo+ICt7Cj4gKwlzdHJ1Y3Qgc2lnYWN0aW9uCXNhOwo+ICsKPiArCW1lbXNldCgm c2EsIDAsIHNpemVvZihzdHJ1Y3Qgc2lnYWN0aW9uKSk7Cj4gKwlzYS5zYV9zaWdhY3Rpb24gPSBk aWVfc2lnbmFsX2hhbmRsZXI7Cj4gKwlzYS5zYV9mbGFncyA9IFNBX1NJR0lORk87Cj4gKwo+ICsJ c2lnYWN0aW9uKFNJR0hVUCwgJnNhLCAwKTsKPiArCXNpZ2FjdGlvbihTSUdJTlQsICZzYSwgMCk7 Cj4gKwlzaWdhY3Rpb24oU0lHUVVJVCwgJnNhLCAwKTsKPiArCXNpZ2FjdGlvbihTSUdGUEUsICZz YSwgMCk7Cj4gKwlzaWdhY3Rpb24oU0lHSUxMLCAmc2EsIDApOwo+ICsJc2lnYWN0aW9uKFNJR0JV UywgJnNhLCAwKTsKPiArCXNpZ2FjdGlvbihTSUdTRUdWLCAmc2EsIDApOwo+ICsJc2lnYWN0aW9u KFNJR0FCUlQsICZzYSwgMCk7Cj4gKwlzaWdhY3Rpb24oU0lHUElQRSwgJnNhLCAwKTsKPiArCXNp Z2FjdGlvbihTSUdBTFJNLCAmc2EsIDApOwo+ICsJc2lnYWN0aW9uKFNJR1RFUk0sICZzYSwgMCk7 Cj4gKwlzaWdhY3Rpb24oU0lHVVNSMSwgJnNhLCAwKTsKPiArCXNpZ2FjdGlvbihTSUdVU1IyLCAm c2EsIDApOwo+ICsJc2lnYWN0aW9uKFNJR1BPTEwsICZzYSwgMCk7Cj4gKwlzaWdhY3Rpb24oU0lH UFJPRiwgJnNhLCAwKTsKPiArCXNpZ2FjdGlvbihTSUdTWVMsICZzYSwgMCk7Cj4gKwlzaWdhY3Rp b24oU0lHVFJBUCwgJnNhLCAwKTsKPiArCXNpZ2FjdGlvbihTSUdWVEFMUk0sICZzYSwgMCk7Cj4g KwlzaWdhY3Rpb24oU0lHWENQVSwgJnNhLCAwKTsKPiArCXNpZ2FjdGlvbihTSUdYRlNaLCAmc2Es IDApOwo+ICt9Cj4gKwo+ICsKPiArI2RlZmluZSBQQVJTRV9GTEFHU19OT1RTVVBQX09LCTB4MDAw MQo+ICsjZGVmaW5lIFBBUlNFX0ZMQUdTX0ZPUkNFX0ZOCTB4MDAwMgo+ICsKPiArc3RhdGljIHZv aWQgcGFyc2Vfc2FsdChjaGFyICpzYWx0X3N0ciwgaW50IGZsYWdzKQo+ICt7Cj4gKwl1bnNpZ25l ZCBjaGFyIGJ1ZltGMkZTX01BWF9TQUxUX1NJWkVdOwo+ICsJY2hhciAqY3AgPSBzYWx0X3N0cjsK PiArCXVuc2lnbmVkIGNoYXIgKnNhbHRfYnVmOwo+ICsJaW50IGZkLCByZXQsIHNhbHRfbGVuID0g MDsKPiArCj4gKwlpZiAoZmxhZ3MgJiBQQVJTRV9GTEFHU19GT1JDRV9GTikKPiArCQlnb3RvIHNh bHRfZnJvbV9maWxlbmFtZTsKPiArCWlmIChzdHJuY21wKGNwLCAiczoiLCAyKSA9PSAwKSB7Cj4g KwkJY3AgKz0gMjsKPiArCQlzYWx0X2xlbiA9IHN0cmxlbihjcCk7Cj4gKwkJaWYgKHNhbHRfbGVu ID49IEYyRlNfTUFYX1NBTFRfU0laRSkKPiArCQkJZ290byBpbnZhbGlkX3NhbHQ7Cj4gKwkJc3Ry bmNweSgoY2hhciAqKSBidWYsIGNwLCBzaXplb2YoYnVmKSk7Cj4gKwl9IGVsc2UgaWYgKGNwWzBd ID09ICcvJykgewo+ICsJc2FsdF9mcm9tX2ZpbGVuYW1lOgo+ICsJCWZkID0gb3BlbihjcCwgT19S RE9OTFkgfCBPX0RJUkVDVE9SWSk7Cj4gKwkJaWYgKGZkID09IC0xICYmIGVycm5vID09IEVOT1RE SVIpCj4gKwkJCWZkID0gb3BlbihjcCwgT19SRE9OTFkpOwo+ICsJCWlmIChmZCA9PSAtMSkgewo+ ICsJCQlwZXJyb3IoY3ApOwo+ICsJCQlleGl0KDEpOwo+ICsJCX0KPiArCQlyZXQgPSBpb2N0bChm ZCwgRlNfSU9DX0dFVF9FTkNSWVBUSU9OX1BXU0FMVCwgJmJ1Zik7Cj4gKwkJY2xvc2UoZmQpOwo+ ICsJCWlmIChyZXQgPCAwKSB7Cj4gKwkJCWlmIChmbGFncyAmIFBBUlNFX0ZMQUdTX05PVFNVUFBf T0spCj4gKwkJCQlyZXR1cm47Cj4gKwkJCXBlcnJvcigiRlNfSU9DX0dFVF9FTkNSWVBUSU9OX1BX U0FMVCIpOwo+ICsJCQlleGl0KDEpOwo+ICsJCX0KPiArCQlpZiAob3B0aW9ucyAmIE9QVF9WRVJC T1NFKSB7Cj4gKwkJCWNoYXIgdG1wWzgwXTsKPiArCQkJdXVpZF91bnBhcnNlKGJ1ZiwgdG1wKTsK PiArCQkJcHJpbnRmKCIlcyBoYXMgcHcgc2FsdCAlc1xuIiwgY3AsIHRtcCk7Cj4gKwkJfQo+ICsJ CXNhbHRfbGVuID0gMTY7Cj4gKwl9IGVsc2UgaWYgKHN0cm5jbXAoY3AsICJmOiIsIDIpID09IDAp IHsKPiArCQljcCArPSAyOwo+ICsJCWdvdG8gc2FsdF9mcm9tX2ZpbGVuYW1lOwo+ICsJfSBlbHNl IGlmIChzdHJuY21wKGNwLCAiMHgiLCAyKSA9PSAwKSB7Cj4gKwkJdW5zaWduZWQgY2hhciAqaCwg Kmw7Cj4gKwo+ICsJCWNwICs9IDI7Cj4gKwkJaWYgKHN0cmxlbihjcCkgJiAxKQo+ICsJCQlnb3Rv IGludmFsaWRfc2FsdDsKPiArCQl3aGlsZSAoKmNwKSB7Cj4gKwkJCWlmIChzYWx0X2xlbiA+PSBG MkZTX01BWF9TQUxUX1NJWkUpCj4gKwkJCQlnb3RvIGludmFsaWRfc2FsdDsKPiArCQkJaCA9IG1l bWNocihoZXhjaGFycywgKmNwKyssIGhleGNoYXJzX3NpemUpOwo+ICsJCQlsID0gbWVtY2hyKGhl eGNoYXJzLCAqY3ArKywgaGV4Y2hhcnNfc2l6ZSk7Cj4gKwkJCWlmICghaCB8fCAhbCkKPiArCQkJ CWdvdG8gaW52YWxpZF9zYWx0Owo+ICsJCQlidWZbc2FsdF9sZW4rK10gPQo+ICsJCQkJKCgodW5z aWduZWQgY2hhcikoaCAtIGhleGNoYXJzKSA8PCA0KSArCj4gKwkJCQkgKHVuc2lnbmVkIGNoYXIp KGwgLSBoZXhjaGFycykpOwo+ICsJCX0KPiArCX0gZWxzZSBpZiAodXVpZF9wYXJzZShjcCwgYnVm KSA9PSAwKSB7Cj4gKwkJc2FsdF9sZW4gPSAxNjsKPiArCX0gZWxzZSB7Cj4gKwlpbnZhbGlkX3Nh bHQ6Cj4gKwkJZnByaW50ZihzdGRlcnIsICJJbnZhbGlkIHNhbHQ6ICVzXG4iLCBzYWx0X3N0cik7 Cj4gKwkJZXhpdCgxKTsKPiArCX0KPiArCXNhbHRfYnVmID0gbWFsbG9jKHNhbHRfbGVuKTsKPiAr CWlmICghc2FsdF9idWYpIHsKPiArCQlmcHJpbnRmKHN0ZGVyciwgIkNvdWxkbid0IGFsbG9jYXRl IHNhbHRcbiIpOwo+ICsJCWV4aXQoMSk7Cj4gKwl9Cj4gKwltZW1jcHkoc2FsdF9idWYsIGJ1Ziwg c2FsdF9sZW4pOwo+ICsJYWRkX3NhbHQoc2FsdF9idWYsIHNhbHRfbGVuKTsKPiArfQo+ICsKPiAr c3RhdGljIHZvaWQgc2V0X3BvbGljeShzdHJ1Y3Qgc2FsdCAqc2V0X3NhbHQsIGludCBwYWQsCj4g KwkJICAgICAgIGludCBhcmdjLCBjaGFyICphcmd2W10sIGludCBwYXRoX3N0YXJ0X2luZGV4KQo+ ICt7Cj4gKwlzdHJ1Y3Qgc2FsdCAqc2FsdDsKPiArCXN0cnVjdCBmc2NyeXB0X3BvbGljeSBwb2xp Y3k7Cj4gKwl1dWlkX3QJdXU7Cj4gKwlpbnQgZmQ7Cj4gKwlpbnQgeDsKPiArCWludCByYzsKPiAr Cj4gKwlpZiAoKHBhZCAhPSA0KSAmJiAocGFkICE9IDgpICYmCj4gKwkJIChwYWQgIT0gMTYpICYm IChwYWQgIT0gMzIpKSB7Cj4gKwkJZnByaW50ZihzdGRlcnIsICJJbnZhbGlkIHBhZGRpbmcgJWRc biIsIHBhZCk7Cj4gKwkJZXhpdCgxKTsKPiArCX0KPiArCj4gKwlmb3IgKHggPSBwYXRoX3N0YXJ0 X2luZGV4OyB4IDwgYXJnYzsgeCsrKSB7Cj4gKwkJZmQgPSBvcGVuKGFyZ3ZbeF0sIE9fRElSRUNU T1JZKTsKPiArCQlpZiAoZmQgPT0gLTEpIHsKPiArCQkJcGVycm9yKGFyZ3ZbeF0pOwo+ICsJCQll eGl0KDEpOwo+ICsJCX0KPiArCQlpZiAoc2V0X3NhbHQpCj4gKwkJCXNhbHQgPSBzZXRfc2FsdDsK PiArCQllbHNlIHsKPiArCQkJaWYgKGlvY3RsKGZkLCBGU19JT0NfR0VUX0VOQ1JZUFRJT05fUFdT QUxULAo+ICsJCQkJICAmdXUpIDwgMCkgewo+ICsJCQkJcGVycm9yKCJGU19JT0NfR0VUX0VOQ1JZ UFRJT05fUFdTQUxUIik7Cj4gKwkJCQlleGl0KDEpOwo+ICsJCQl9Cj4gKwkJCXNhbHQgPSBmaW5k X2J5X3NhbHQodXUsIHNpemVvZih1dSkpOwo+ICsJCQlpZiAoIXNhbHQpIHsKPiArCQkJCWZwcmlu dGYoc3RkZXJyLCAiQ291bGRuJ3QgZmluZCBzYWx0IT8hXG4iKTsKPiArCQkJCWV4aXQoMSk7Cj4g KwkJCX0KPiArCQl9Cj4gKwkJcG9saWN5LnZlcnNpb24gPSAwOwo+ICsJCXBvbGljeS5jb250ZW50 c19lbmNyeXB0aW9uX21vZGUgPQo+ICsJCQlGMkZTX0VOQ1JZUFRJT05fTU9ERV9BRVNfMjU2X1hU UzsKPiArCQlwb2xpY3kuZmlsZW5hbWVzX2VuY3J5cHRpb25fbW9kZSA9Cj4gKwkJCUYyRlNfRU5D UllQVElPTl9NT0RFX0FFU18yNTZfQ1RTOwo+ICsJCXBvbGljeS5mbGFncyA9IGludF9sb2cyKHBh ZCA+PiAyKTsKPiArCQltZW1jcHkocG9saWN5Lm1hc3Rlcl9rZXlfZGVzY3JpcHRvciwgc2FsdC0+ a2V5X2Rlc2MsCj4gKwkJICAgICAgIEZTX0tFWV9ERVNDUklQVE9SX1NJWkUpOwo+ICsJCXJjID0g aW9jdGwoZmQsIEZTX0lPQ19TRVRfRU5DUllQVElPTl9QT0xJQ1ksICZwb2xpY3kpOwo+ICsJCWNs b3NlKGZkKTsKPiArCQlpZiAocmMpIHsKPiArCQkJcHJpbnRmKCJFcnJvciBbJXNdIHNldHRpbmcg cG9saWN5LlxuVGhlIGtleSBkZXNjcmlwdG9yICIKPiArCQkJICAgICAgICJbJXNdIG1heSBub3Qg bWF0Y2ggdGhlIGV4aXN0aW5nIGVuY3J5cHRpb24gIgo+ICsJCQkgICAgICAgImNvbnRleHQgZm9y IGRpcmVjdG9yeSBbJXNdLlxuIiwKPiArCQkJICAgICAgIHN0cmVycm9yKGVycm5vKSwgc2FsdC0+ a2V5X3JlZl9zdHIsIGFyZ3ZbeF0pOwo+ICsJCQljb250aW51ZTsKPiArCQl9Cj4gKwkJcHJpbnRm KCJLZXkgd2l0aCBkZXNjcmlwdG9yIFslc10gYXBwbGllZCB0byAlcy5cbiIsCj4gKwkJICAgICAg IHNhbHQtPmtleV9yZWZfc3RyLCBhcmd2W3hdKTsKPiArCX0KPiArfQo+ICsKPiArc3RhdGljIHZv aWQgcGJrZGYyX3NoYTUxMihjb25zdCBjaGFyICpwYXNzcGhyYXNlLCBzdHJ1Y3Qgc2FsdCAqc2Fs dCwKPiArCQkJICB1bnNpZ25lZCBpbnQgY291bnQsCj4gKwkJCSAgdW5zaWduZWQgY2hhciBkZXJp dmVkX2tleVtGMkZTX01BWF9LRVlfU0laRV0pCj4gK3sKPiArCXNpemVfdCBwYXNzcGhyYXNlX3Np emUgPSBzdHJsZW4ocGFzc3BocmFzZSk7Cj4gKwl1bnNpZ25lZCBjaGFyIGJ1ZltTSEE1MTJfTEVO R1RIICsgRjJGU19NQVhfUEFTU1BIUkFTRV9TSVpFXSA9IHswfTsKPiArCXVuc2lnbmVkIGNoYXIg dGVtcGJ1ZltTSEE1MTJfTEVOR1RIXSA9IHswfTsKPiArCWNoYXIgZmluYWxbU0hBNTEyX0xFTkdU SF0gPSB7MH07Cj4gKwl1bnNpZ25lZCBjaGFyIHNhbHRidWZbRjJGU19NQVhfU0FMVF9TSVpFICsg RjJGU19NQVhfUEFTU1BIUkFTRV9TSVpFXSA9IHswfTsKPiArCWludCBhY3R1YWxfYnVmX2xlbiA9 IFNIQTUxMl9MRU5HVEggKyBwYXNzcGhyYXNlX3NpemU7Cj4gKwlpbnQgYWN0dWFsX3NhbHRidWZf bGVuID0gRjJGU19NQVhfU0FMVF9TSVpFICsgcGFzc3BocmFzZV9zaXplOwo+ICsJdW5zaWduZWQg aW50IHgsIHk7Cj4gKwlfX3UzMiAqZmluYWxfdTMyID0gKF9fdTMyICopZmluYWw7Cj4gKwlfX3Uz MiAqdGVtcF91MzIgPSAoX191MzIgKil0ZW1wYnVmOwo+ICsKPiArCWlmIChwYXNzcGhyYXNlX3Np emUgPiBGMkZTX01BWF9QQVNTUEhSQVNFX1NJWkUpIHsKPiArCQlwcmludGYoIlBhc3NwaHJhc2Ug c2l6ZSBpcyAlemQ7IG1heCBpcyAlZC5cbiIsIHBhc3NwaHJhc2Vfc2l6ZSwKPiArCQkgICAgICAg RjJGU19NQVhfUEFTU1BIUkFTRV9TSVpFKTsKPiArCQlleGl0KDEpOwo+ICsJfQo+ICsJaWYgKHNh bHQtPnNhbHRfbGVuID4gRjJGU19NQVhfU0FMVF9TSVpFKSB7Cj4gKwkJcHJpbnRmKCJTYWx0IHNp emUgaXMgJXpkOyBtYXggaXMgJWQuXG4iLCBzYWx0LT5zYWx0X2xlbiwKPiArCQkgICAgICAgRjJG U19NQVhfU0FMVF9TSVpFKTsKPiArCQlleGl0KDEpOwo+ICsJfQo+ICsJYXNzZXJ0KEYyRlNfTUFY X0tFWV9TSVpFIDw9IFNIQTUxMl9MRU5HVEgpOwo+ICsKPiArCW1lbWNweShzYWx0YnVmLCBzYWx0 LT5zYWx0LCBzYWx0LT5zYWx0X2xlbik7Cj4gKwltZW1jcHkoJnNhbHRidWZbRjJGU19NQVhfU0FM VF9TSVpFXSwgcGFzc3BocmFzZSwgcGFzc3BocmFzZV9zaXplKTsKPiArCj4gKwltZW1jcHkoJmJ1 ZltTSEE1MTJfTEVOR1RIXSwgcGFzc3BocmFzZSwgcGFzc3BocmFzZV9zaXplKTsKPiArCj4gKwlm b3IgKHggPSAwOyB4IDwgY291bnQ7ICsreCkgewo+ICsJCWlmICh4ID09IDApIHsKPiArCQkJZjJm c19zaGE1MTIoc2FsdGJ1ZiwgYWN0dWFsX3NhbHRidWZfbGVuLCB0ZW1wYnVmKTsKPiArCQl9IGVs c2Ugewo+ICsJCQkvKgo+ICsJCQkgKiBidWY6IFtwcmV2aW91cyBoYXNoIHx8IHBhc3NwaHJhc2Vd Cj4gKwkJCSAqLwo+ICsJCQltZW1jcHkoYnVmLCB0ZW1wYnVmLCBTSEE1MTJfTEVOR1RIKTsKPiAr CQkJZjJmc19zaGE1MTIoYnVmLCBhY3R1YWxfYnVmX2xlbiwgdGVtcGJ1Zik7Cj4gKwkJfQo+ICsJ CWZvciAoeSA9IDA7IHkgPCAoc2l6ZW9mKGZpbmFsKSAvIHNpemVvZigqZmluYWxfdTMyKSk7ICsr eSkKPiArCQkJZmluYWxfdTMyW3ldID0gZmluYWxfdTMyW3ldIF4gdGVtcF91MzJbeV07Cj4gKwl9 Cj4gKwltZW1jcHkoZGVyaXZlZF9rZXksIGZpbmFsLCBGMkZTX01BWF9LRVlfU0laRSk7Cj4gK30K PiArCj4gK3N0YXRpYyBpbnQgZGlzYWJsZV9lY2hvKHN0cnVjdCB0ZXJtaW9zICpzYXZlZF9zZXR0 aW5ncykKPiArewo+ICsJc3RydWN0IHRlcm1pb3MgY3VycmVudF9zZXR0aW5nczsKPiArCWludCBy YyA9IDA7Cj4gKwo+ICsJcmMgPSB0Y2dldGF0dHIoMCwgJmN1cnJlbnRfc2V0dGluZ3MpOwo+ICsJ aWYgKHJjKQo+ICsJCXJldHVybiByYzsKPiArCSpzYXZlZF9zZXR0aW5ncyA9IGN1cnJlbnRfc2V0 dGluZ3M7Cj4gKwljdXJyZW50X3NldHRpbmdzLmNfbGZsYWcgJj0gfkVDSE87Cj4gKwlyYyA9IHRj c2V0YXR0cigwLCBUQ1NBTk9XLCAmY3VycmVudF9zZXR0aW5ncyk7Cj4gKwo+ICsJcmV0dXJuIHJj Owo+ICt9Cj4gKwo+ICtzdGF0aWMgdm9pZCBnZXRfcGFzc3BocmFzZShjaGFyICpwYXNzcGhyYXNl LCBpbnQgbGVuKQo+ICt7Cj4gKwljaGFyICpwOwo+ICsJc3RydWN0IHRlcm1pb3MgY3VycmVudF9z ZXR0aW5nczsKPiArCj4gKwlhc3NlcnQobGVuID4gMCk7Cj4gKwlkaXNhYmxlX2VjaG8oJmN1cnJl bnRfc2V0dGluZ3MpOwo+ICsJcCA9IGZnZXRzKHBhc3NwaHJhc2UsIGxlbiwgc3RkaW4pOwo+ICsJ dGNzZXRhdHRyKDAsIFRDU0FOT1csICZjdXJyZW50X3NldHRpbmdzKTsKPiArCXByaW50ZigiXG4i KTsKPiArCWlmICghcCkgewo+ICsJCXByaW50ZigiQWJvcnRpbmcuXG4iKTsKPiArCQlleGl0KDEp Owo+ICsJfQo+ICsJcCA9IHN0cnJjaHIocGFzc3BocmFzZSwgJ1xuJyk7Cj4gKwlpZiAoIXApCj4g KwkJcCA9IHBhc3NwaHJhc2UgKyBsZW4gLSAxOwo+ICsJKnAgPSAnXDAnOwo+ICt9Cj4gKwo+ICtz dHJ1Y3Qga2V5cmluZ19tYXAgewo+ICsJY2hhciBuYW1lWzRdOwo+ICsJc2l6ZV90IG5hbWVfbGVu Owo+ICsJaW50IGNvZGU7Cj4gK307Cj4gKwo+ICtzdGF0aWMgY29uc3Qgc3RydWN0IGtleXJpbmdf bWFwIGtleXJpbmdzW10gPSB7Cj4gKwl7IkB1cyIsIDMsIEtFWV9TUEVDX1VTRVJfU0VTU0lPTl9L RVlSSU5HfSwKPiArCXsiQHUiLCAyLCBLRVlfU1BFQ19VU0VSX0tFWVJJTkd9LAo+ICsJeyJAcyIs IDIsIEtFWV9TUEVDX1NFU1NJT05fS0VZUklOR30sCj4gKwl7IkBnIiwgMiwgS0VZX1NQRUNfR1JP VVBfS0VZUklOR30sCj4gKwl7IkBwIiwgMiwgS0VZX1NQRUNfUFJPQ0VTU19LRVlSSU5HfSwKPiAr CXsiQHQiLCAyLCBLRVlfU1BFQ19USFJFQURfS0VZUklOR30sCj4gK307Cj4gKwo+ICtzdGF0aWMg aW50IGdldF9rZXlyaW5nX2lkKGNvbnN0IGNoYXIgKmtleXJpbmcpCj4gK3sKPiArCXVuc2lnbmVk IGludCB4Owo+ICsJY2hhciAqZW5kOwo+ICsKPiArCS8qCj4gKwkgKiBJZiBubyBrZXlyaW5nIGlz IHNwZWNpZmllZCwgYnkgZGVmYXVsdCB1c2UgZWl0aGVyIHRoZSB1c2VyCj4gKwkgKiBzZXNzaW9u IGtleSByaW5nIG9yIHRoZSBzZXNzaW9uIGtleXJpbmcuICBGZXRjaGluZyB0aGUKPiArCSAqIHNl c3Npb24ga2V5cmluZyB3aWxsIHJldHVybiB0aGUgdXNlciBzZXNzaW9uIGtleXJpbmcgaWYgbm8K PiArCSAqIHNlc3Npb24ga2V5cmluZyBoYXMgYmVlbiBzZXQuCj4gKwkgKgo+ICsJICogV2UgbmVl ZCB0byBkbyB0aGlzIGluc3RlYWQgb2Ygc2ltcGx5IGFkZGluZyB0aGUga2V5IHRvCj4gKwkgKiBL RVlfU1BFQ19TRVNTSU9OX0tFWVJJTkcgc2luY2UgdHJ5aW5nIHRvIGFkZCBhIGtleSB0byBhCj4g KwkgKiBzZXNzaW9uIGtleXJpbmcgdGhhdCBkb2VzIG5vdCB5ZXQgZXhpc3Qgd2lsbCBjYXVzZSB0 aGUKPiArCSAqIGtlcm5lbCB0byBjcmVhdGUgYSBzZXNzaW9uIGtleXJpbmcgLS0tIHdoaWNoIHdp bCB0aGVuIGdldAo+ICsJICogZ2FyYmFnZSBjb2xsZWN0ZWQgYXMgc29vbiBhcyBmMmZzY3J5cHQg ZXhpdHMuCj4gKwkgKgo+ICsJICogVGhlIGZhY3QgdGhhdCB0aGUga2V5Y3RsIHN5c3RlbSBjYWxs IGFuZCB0aGUgYWRkX2tleSBzeXN0ZW0KPiArCSAqIGNhbGwgdHJlYXRzIEtFWV9TUEVDX1NFU1NJ T05fS0VZUklORyBkaWZmZXJlbnRseSB3aGVuIGEKPiArCSAqIHNlc3Npb24ga2V5cmluZyBkb2Vz IG5vdCBleGlzdCBpcyB2ZXJ5IHVuZm9ydHVuYXRlIGFuZAo+ICsJICogY29uZnVzaW5nLCBidXQg c28gaXQgZ29lcy4uLgo+ICsJICovCj4gKwlpZiAoa2V5cmluZyA9PSBOVUxMKQo+ICsJCXJldHVy biBrZXljdGwoS0VZQ1RMX0dFVF9LRVlSSU5HX0lELAo+ICsJCQkgICAgICBLRVlfU1BFQ19TRVNT SU9OX0tFWVJJTkcsIDApOwo+ICsJZm9yICh4ID0gMDsgeCA8IChzaXplb2Yoa2V5cmluZ3MpIC8g c2l6ZW9mKGtleXJpbmdzWzBdKSk7ICsreCkgewo+ICsJCWlmIChzdHJjbXAoa2V5cmluZywga2V5 cmluZ3NbeF0ubmFtZSkgPT0gMCkgewo+ICsJCQlyZXR1cm4ga2V5cmluZ3NbeF0uY29kZTsKPiAr CQl9Cj4gKwl9Cj4gKwl4ID0gc3RydG91bChrZXlyaW5nLCAmZW5kLCAxMCk7Cj4gKwlpZiAoKmVu ZCA9PSAnXDAnKSB7Cj4gKwkJaWYgKGtleWN0bChLRVlDVExfREVTQ1JJQkUsIHgsIE5VTEwsIDAp IDwgMCkKPiArCQkJcmV0dXJuIDA7Cj4gKwkJcmV0dXJuIHg7Cj4gKwl9Cj4gKwlyZXR1cm4gMDsK PiArfQo+ICsKPiArc3RhdGljIHZvaWQgZ2VuZXJhdGVfa2V5X3JlZl9zdHIoc3RydWN0IHNhbHQg KnNhbHQpCj4gK3sKPiArCXVuc2lnbmVkIGNoYXIga2V5X3JlZjFbU0hBNTEyX0xFTkdUSF07Cj4g Kwl1bnNpZ25lZCBjaGFyIGtleV9yZWYyW1NIQTUxMl9MRU5HVEhdOwo+ICsJaW50IHg7Cj4gKwo+ ICsJZjJmc19zaGE1MTIoc2FsdC0+a2V5LCBGMkZTX01BWF9LRVlfU0laRSwga2V5X3JlZjEpOwo+ ICsJZjJmc19zaGE1MTIoa2V5X3JlZjEsIFNIQTUxMl9MRU5HVEgsIGtleV9yZWYyKTsKPiArCW1l bWNweShzYWx0LT5rZXlfZGVzYywga2V5X3JlZjIsIEZTX0tFWV9ERVNDUklQVE9SX1NJWkUpOwo+ ICsJZm9yICh4ID0gMDsgeCA8IEZTX0tFWV9ERVNDUklQVE9SX1NJWkU7ICsreCkgewo+ICsJCXNw cmludGYoJnNhbHQtPmtleV9yZWZfc3RyW3ggKiAyXSwgIiUwMngiLAo+ICsJCQlzYWx0LT5rZXlf ZGVzY1t4XSk7Cj4gKwl9Cj4gKwlzYWx0LT5rZXlfcmVmX3N0cltGMkZTX0tFWV9SRUZfU1RSX0JV Rl9TSVpFIC0gMV0gPSAnXDAnOwo+ICt9Cj4gKwo+ICtzdGF0aWMgdm9pZCBpbnNlcnRfa2V5X2lu dG9fa2V5cmluZyhjb25zdCBjaGFyICprZXlyaW5nLCBzdHJ1Y3Qgc2FsdCAqc2FsdCkKPiArewo+ ICsJaW50IGtleXJpbmdfaWQgPSBnZXRfa2V5cmluZ19pZChrZXlyaW5nKTsKPiArCXN0cnVjdCBm MmZzX2VuY3J5cHRpb25fa2V5IGtleTsKPiArCWNoYXIga2V5X3JlZl9mdWxsW0YyRlNfS0VZX0RF U0NfUFJFRklYX1NJWkUgKwo+ICsJCQkgIEYyRlNfS0VZX1JFRl9TVFJfQlVGX1NJWkVdOwo+ICsJ aW50IHJjOwo+ICsKPiArCWlmIChrZXlyaW5nX2lkID09IDApIHsKPiArCQlwcmludGYoIkludmFs aWQga2V5cmluZyBbJXNdLlxuIiwga2V5cmluZyk7Cj4gKwkJZXhpdCgxKTsKPiArCX0KPiArCXNw cmludGYoa2V5X3JlZl9mdWxsLCAiJXMlcyIsIEYyRlNfS0VZX0RFU0NfUFJFRklYLAo+ICsJCXNh bHQtPmtleV9yZWZfc3RyKTsKPiArCXJjID0ga2V5Y3RsKEtFWUNUTF9TRUFSQ0gsIGtleXJpbmdf aWQsIEYyRlNfS0VZX1RZUEVfTE9HT04sCj4gKwkJICAgIGtleV9yZWZfZnVsbCwgMCk7Cj4gKwlp ZiAocmMgIT0gLTEpIHsKPiArCQlpZiAoKG9wdGlvbnMgJiBPUFRfUVVJRVQpID09IDApCj4gKwkJ CXByaW50ZigiS2V5IHdpdGggZGVzY3JpcHRvciBbJXNdIGFscmVhZHkgZXhpc3RzXG4iLAo+ICsJ CQkgICAgICAgc2FsdC0+a2V5X3JlZl9zdHIpOwo+ICsJCXJldHVybjsKPiArCX0gZWxzZSBpZiAo KHJjID09IC0xKSAmJiAoZXJybm8gIT0gRU5PS0VZKSkgewo+ICsJCXByaW50Zigia2V5Y3RsX3Nl YXJjaCBmYWlsZWQ6ICVzXG4iLCBzdHJlcnJvcihlcnJubykpOwo+ICsJCWlmIChlcnJubyA9PSAt RUlOVkFMKQo+ICsJCQlwcmludGYoIktleXJpbmcgWyVzXSBpcyBub3QgYXZhaWxhYmxlLlxuIiwg a2V5cmluZyk7Cj4gKwkJZXhpdCgxKTsKPiArCX0KPiArCWtleS5tb2RlID0gRjJGU19FTkNSWVBU SU9OX01PREVfQUVTXzI1Nl9YVFM7Cj4gKwltZW1jcHkoa2V5LnJhdywgc2FsdC0+a2V5LCBGMkZT X01BWF9LRVlfU0laRSk7Cj4gKwlrZXkuc2l6ZSA9IEYyRlNfTUFYX0tFWV9TSVpFOwo+ICsJcmMg PSBhZGRfa2V5KEYyRlNfS0VZX1RZUEVfTE9HT04sIGtleV9yZWZfZnVsbCwgKHZvaWQgKikma2V5 LAo+ICsJCSAgICAgc2l6ZW9mKGtleSksIGtleXJpbmdfaWQpOwo+ICsJaWYgKHJjID09IC0xKSB7 Cj4gKwkJaWYgKGVycm5vID09IEVEUVVPVCkgewo+ICsJCQlwcmludGYoIkVycm9yIGFkZGluZyBr ZXkgdG8ga2V5cmluZzsgcXVvdGEgZXhjZWVkZWRcbiIpOwo+ICsJCX0gZWxzZSB7Cj4gKwkJCXBy aW50ZigiRXJyb3IgYWRkaW5nIGtleSB3aXRoIGtleSBkZXNjcmlwdG9yIFslc106ICIKPiArCQkJ ICAgICAgICIlc1xuIiwgc2FsdC0+a2V5X3JlZl9zdHIsIHN0cmVycm9yKGVycm5vKSk7Cj4gKwkJ fQo+ICsJCWV4aXQoMSk7Cj4gKwl9IGVsc2Ugewo+ICsJCWlmICgob3B0aW9ucyAmIE9QVF9RVUlF VCkgPT0gMCkKPiArCQkJcHJpbnRmKCJBZGRlZCBrZXkgd2l0aCBkZXNjcmlwdG9yIFslc11cbiIs Cj4gKwkJCSAgICAgICBzYWx0LT5rZXlfcmVmX3N0cik7Cj4gKwl9Cj4gK30KPiArCj4gK3N0YXRp YyB2b2lkIGdldF9kZWZhdWx0X3NhbHRzKHZvaWQpCj4gK3sKPiArCUZJTEUJKmYgPSBzZXRtbnRl bnQoIi9ldGMvbXRhYiIsICJyIik7Cj4gKwlzdHJ1Y3QgbW50ZW50ICptbnQ7Cj4gKwo+ICsJd2hp bGUgKGYgJiYgKChtbnQgPSBnZXRtbnRlbnQoZikpICE9IE5VTEwpKSB7Cj4gKwkJaWYgKHN0cmNt cChtbnQtPm1udF90eXBlLCAiZjJmcyIpIHx8Cj4gKwkJICAgIGFjY2VzcyhtbnQtPm1udF9kaXIs IFJfT0spKQo+ICsJCQljb250aW51ZTsKPiArCQlwYXJzZV9zYWx0KG1udC0+bW50X2RpciwgUEFS U0VfRkxBR1NfTk9UU1VQUF9PSyk7Cj4gKwl9Cj4gKwllbmRtbnRlbnQoZik7Cj4gK30KPiArCj4g Ky8qIEZ1bmN0aW9ucyB3aGljaCBpbXBsZW1lbnQgdXNlciBjb21tYW5kcyAqLwo+ICsKPiArc3Ry dWN0IGNtZF9kZXNjIHsKPiArCWNvbnN0IGNoYXIgKmNtZF9uYW1lOwo+ICsJdm9pZCAoKmNtZF9m dW5jKShpbnQsIGNoYXIgKiosIGNvbnN0IHN0cnVjdCBjbWRfZGVzYyAqKTsKPiArCWNvbnN0IGNo YXIgKmNtZF9kZXNjOwo+ICsJY29uc3QgY2hhciAqY21kX2hlbHA7Cj4gKwlpbnQgY21kX2ZsYWdz Owo+ICt9Owo+ICsKPiArI2RlZmluZSBDTURfSElEREVOIAkweDAwMDEKPiArCj4gK3N0YXRpYyB2 b2lkIGRvX2hlbHAoaW50IGFyZ2MsIGNoYXIgKiphcmd2LCBjb25zdCBzdHJ1Y3QgY21kX2Rlc2Mg KmNtZCk7Cj4gKwo+ICsjZGVmaW5lIGFkZF9rZXlfZGVzYyAiYWRkcyBhIGtleSB0byB0aGUgdXNl cidzIGtleXJpbmciCj4gKyNkZWZpbmUgYWRkX2tleV9oZWxwIFwKPiArImYyZnNjcnlwdCBhZGRf a2V5IC1TIHNhbHQgWyAtayBrZXlyaW5nIF0gWy12XSBbLXFdIFsgcGF0aCAuLi4gXVxuXG4iIFwK PiArIlByb21wdHMgdGhlIHVzZXIgZm9yIGEgcGFzc3BocmFzZSBhbmQgaW5zZXJ0cyBpdCBpbnRv IHRoZSBzcGVjaWZpZWRcbiIgXAo+ICsia2V5cmluZy4gIElmIG5vIGtleXJpbmcgaXMgc3BlY2lm aWVkLCBmMmZzY3J5cHQgd2lsbCB1c2UgdGhlIHNlc3Npb25cbiIgXAo+ICsia2V5cmluZyBpZiBp dCBleGlzdHMgb3IgdGhlIHVzZXIgc2Vzc2lvbiBrZXlyaW5nIGlmIGl0IGRvZXMgbm90LlxuXG4i IFwKPiArIklmIG9uZSBvciBtb3JlIGRpcmVjdG9yeSBwYXRocyBhcmUgc3BlY2lmaWVkLCBmMmZz Y3J5cHQgd2lsbCB0cnkgdG9cbiIgXAo+ICsic2V0IHRoZSBwb2xpY3kgb2YgdGhvc2UgZGlyZWN0 b3JpZXMgdG8gdXNlIHRoZSBrZXkganVzdCBlbnRlcmVkIGJ5XG4iIFwKPiArInRoZSB1c2VyLlxu Igo+ICsKPiArc3RhdGljIHZvaWQgZG9fYWRkX2tleShpbnQgYXJnYywgY2hhciAqKmFyZ3YsIGNv bnN0IHN0cnVjdCBjbWRfZGVzYyAqY21kKQo+ICt7Cj4gKwlzdHJ1Y3Qgc2FsdCAqc2FsdDsKPiAr CWNoYXIgKmtleXJpbmcgPSBOVUxMOwo+ICsJaW50IGksIG9wdCwgcGFkID0gNDsKPiArCXVuc2ln bmVkIGo7Cj4gKwo+ICsJd2hpbGUgKChvcHQgPSBnZXRvcHQoYXJnYywgYXJndiwgIms6UzpwOnZx IikpICE9IC0xKSB7Cj4gKwkJc3dpdGNoIChvcHQpIHsKPiArCQljYXNlICdrJzoKPiArCQkJLyog U3BlY2lmeSBhIGtleXJpbmcuICovCj4gKwkJCWtleXJpbmcgPSBvcHRhcmc7Cj4gKwkJCWJyZWFr Owo+ICsJCWNhc2UgJ3AnOgo+ICsJCQlwYWQgPSBhdG9pKG9wdGFyZyk7Cj4gKwkJCWJyZWFrOwo+ ICsJCWNhc2UgJ1MnOgo+ICsJCQkvKiBTYWx0IHZhbHVlIGZvciBwYXNzcGhyYXNlLiAqLwo+ICsJ CQlwYXJzZV9zYWx0KG9wdGFyZywgMCk7Cj4gKwkJCWJyZWFrOwo+ICsJCWNhc2UgJ3YnOgo+ICsJ CQlvcHRpb25zIHw9IE9QVF9WRVJCT1NFOwo+ICsJCQlicmVhazsKPiArCQljYXNlICdxJzoKPiAr CQkJb3B0aW9ucyB8PSBPUFRfUVVJRVQ7Cj4gKwkJCWJyZWFrOwo+ICsJCWRlZmF1bHQ6Cj4gKwkJ CWZwcmludGYoc3RkZXJyLCAiVW5yZWNvZ25pemVkIG9wdGlvbjogJWNcbiIsIG9wdCk7Cj4gKwkJ Y2FzZSAnPyc6Cj4gKwkJCWZwdXRzKCJVU0FHRTpcbiAgIiwgc3RkZXJyKTsKPiArCQkJZnB1dHMo Y21kLT5jbWRfaGVscCwgc3RkZXJyKTsKPiArCQkJZXhpdCgxKTsKPiArCQl9Cj4gKwl9Cj4gKwlp ZiAobnVtX3NhbHQgPT0gMCkKPiArCQlnZXRfZGVmYXVsdF9zYWx0cygpOwo+ICsJaWYgKG51bV9z YWx0ID09IDApIHsKPiArCQlmcHJpbnRmKHN0ZGVyciwgIk5vIHNhbHQgdmFsdWVzIGF2YWlsYWJs ZVxuIik7Cj4gKwkJZXhpdCgxKTsKPiArCX0KPiArCXZhbGlkYXRlX3BhdGhzKGFyZ2MsIGFyZ3Ys IG9wdGluZCk7Cj4gKwlmb3IgKGkgPSBvcHRpbmQ7IGkgPCBhcmdjOyBpKyspCj4gKwkJcGFyc2Vf c2FsdChhcmd2W2ldLCBQQVJTRV9GTEFHU19GT1JDRV9GTik7Cj4gKwlwcmludGYoIkVudGVyIHBh c3NwaHJhc2UgKGVjaG8gZGlzYWJsZWQpOiAiKTsKPiArCWdldF9wYXNzcGhyYXNlKGluX3Bhc3Nw aHJhc2UsIHNpemVvZihpbl9wYXNzcGhyYXNlKSk7Cj4gKwlmb3IgKGogPSAwLCBzYWx0ID0gc2Fs dF9saXN0OyBqIDwgbnVtX3NhbHQ7IGorKywgc2FsdCsrKSB7Cj4gKwkJcGJrZGYyX3NoYTUxMihp bl9wYXNzcGhyYXNlLCBzYWx0LAo+ICsJCQkgICAgICBGMkZTX1BCS0RGMl9JVEVSQVRJT05TLCBz YWx0LT5rZXkpOwo+ICsJCWdlbmVyYXRlX2tleV9yZWZfc3RyKHNhbHQpOwo+ICsJCWluc2VydF9r ZXlfaW50b19rZXlyaW5nKGtleXJpbmcsIHNhbHQpOwo+ICsJfQo+ICsJaWYgKG9wdGluZCAhPSBh cmdjKQo+ICsJCXNldF9wb2xpY3koTlVMTCwgcGFkLCBhcmdjLCBhcmd2LCBvcHRpbmQpOwo+ICsJ Y2xlYXJfc2VjcmV0cygpOwo+ICsJZXhpdCgwKTsKPiArfQo+ICsKPiArI2RlZmluZSBzZXRfcG9s aWN5X2Rlc2MgInNldHMgYSBwb2xpY3kgZm9yIGRpcmVjdG9yaWVzIgo+ICsjZGVmaW5lIHNldF9w b2xpY3lfaGVscCBcCj4gKyJmMmZzY3J5cHQgc2V0X3BvbGljeSBwb2xpY3kgcGF0aCAuLi4gXG5c biIgXAo+ICsiU2V0cyB0aGUgcG9saWN5IGZvciB0aGUgZGlyZWN0b3JpZXMgc3BlY2lmaWVkIG9u IHRoZSBjb21tYW5kIGxpbmUuXG4iIFwKPiArIkFsbCBkaXJlY3RvcmllcyBtdXN0IGJlIGVtcHR5 IHRvIHNldCB0aGUgcG9saWN5OyBpZiB0aGUgZGlyZWN0b3J5XG4iIFwKPiArImFscmVhZHkgaGFz IGEgcG9saWN5IGVzdGFibGlzaGVkLCBmMmZzY3J5cHQgd2lsbCB2YWxpZGF0ZSB0aGF0IGl0IHRo ZVxuIiBcCj4gKyJwb2xpY3kgbWF0Y2hlcyB3aGF0IHdhcyBzcGVjaWZpZWQuICBBIHBvbGljeSBp cyBhbiBlbmNyeXB0aW9uIGtleVxuIiBcCj4gKyJpZGVudGlmaWVyIGNvbnNpc3Rpbmcgb2YgMTYg aGV4YWRlY2ltYWwgY2hhcmFjdGVycy5cbiIKPiArCj4gK3N0YXRpYyB2b2lkIGRvX3NldF9wb2xp Y3koaW50IGFyZ2MsIGNoYXIgKiphcmd2LCBjb25zdCBzdHJ1Y3QgY21kX2Rlc2MgKmNtZCkKPiAr ewo+ICsJc3RydWN0IHNhbHQgc2FsdGJ1ZjsKPiArCWludCBjLCBwYWQgPSA0Owo+ICsKPiArCXdo aWxlICgoYyA9IGdldG9wdCAoYXJnYywgYXJndiwgInA6IikpICE9IEVPRikgewo+ICsJCXN3aXRj aCAoYykgewo+ICsJCWNhc2UgJ3AnOgo+ICsJCQlwYWQgPSBhdG9pKG9wdGFyZyk7Cj4gKwkJCWJy ZWFrOwo+ICsJCX0KPiArCX0KPiArCj4gKwlpZiAoYXJnYyA8IG9wdGluZCArIDIpIHsKPiArCQlm cHJpbnRmKHN0ZGVyciwgIk1pc3NpbmcgcmVxdWlyZWQgYXJndW1lbnQocykuXG5cbiIpOwo+ICsJ CWZwdXRzKCJVU0FHRTpcbiAgIiwgc3RkZXJyKTsKPiArCQlmcHV0cyhjbWQtPmNtZF9oZWxwLCBz dGRlcnIpOwo+ICsJCWV4aXQoMSk7Cj4gKwl9Cj4gKwo+ICsJaWYgKChzdHJsZW4oYXJndltvcHRp bmRdKSAhPSAoRlNfS0VZX0RFU0NSSVBUT1JfU0laRSAqIDIpKSB8fAo+ICsJICAgIGhleDJieXRl KGFyZ3Zbb3B0aW5kXSwgKEZTX0tFWV9ERVNDUklQVE9SX1NJWkUgKiAyKSwKPiArCQkgICAgIHNh bHRidWYua2V5X2Rlc2MsIEZTX0tFWV9ERVNDUklQVE9SX1NJWkUpKSB7Cj4gKwkJcHJpbnRmKCJJ bnZhbGlkIGtleSBkZXNjcmlwdG9yIFslc10uIFZhbGlkIGNoYXJhY3RlcnMgIgo+ICsJCSAgICAg ICAiYXJlIDAtOSBhbmQgYS1mLCBsb3dlciBjYXNlLiAgIgo+ICsJCSAgICAgICAiTGVuZ3RoIG11 c3QgYmUgJWQuXG4iLAo+ICsJCSAgICAgICBhcmd2W29wdGluZF0sIChGU19LRVlfREVTQ1JJUFRP Ul9TSVpFICogMikpOwo+ICsJCQlleGl0KDEpOwo+ICsJfQo+ICsJdmFsaWRhdGVfcGF0aHMoYXJn YywgYXJndiwgb3B0aW5kKzEpOwo+ICsJc3RyY3B5KHNhbHRidWYua2V5X3JlZl9zdHIsIGFyZ3Zb b3B0aW5kXSk7Cj4gKwlzZXRfcG9saWN5KCZzYWx0YnVmLCBwYWQsIGFyZ2MsIGFyZ3YsIG9wdGlu ZCsxKTsKPiArCWV4aXQoMCk7Cj4gK30KPiArCj4gKyNkZWZpbmUgZ2V0X3BvbGljeV9kZXNjICJn ZXQgdGhlIGVuY3J5cHRpb24gZm9yIGRpcmVjdG9yaWVzIgo+ICsjZGVmaW5lIGdldF9wb2xpY3lf aGVscCBcCj4gKyJmMmZzY3J5cHQgZ2V0X3BvbGljeSBwYXRoIC4uLiBcblxuIiBcCj4gKyJHZXRz IHRoZSBwb2xpY3kgZm9yIHRoZSBkaXJlY3RvcmllcyBzcGVjaWZpZWQgb24gdGhlIGNvbW1hbmQg bGluZS5cbiIKPiArCj4gK3N0YXRpYyB2b2lkIGRvX2dldF9wb2xpY3koaW50IGFyZ2MsIGNoYXIg Kiphcmd2LCBjb25zdCBzdHJ1Y3QgY21kX2Rlc2MgKmNtZCkKPiArewo+ICsJc3RydWN0IGZzY3J5 cHRfcG9saWN5IHBvbGljeTsKPiArCXN0cnVjdCBzdGF0IHN0Owo+ICsJaW50IGksIGosIGZkLCBy YzsKPiArCj4gKwlpZiAoYXJnYyA8IDIpIHsKPiArCQlmcHJpbnRmKHN0ZGVyciwgIk1pc3Npbmcg cmVxdWlyZWQgYXJndW1lbnQocykuXG5cbiIpOwo+ICsJCWZwdXRzKCJVU0FHRTpcbiAgIiwgc3Rk ZXJyKTsKPiArCQlmcHV0cyhjbWQtPmNtZF9oZWxwLCBzdGRlcnIpOwo+ICsJCWV4aXQoMSk7Cj4g Kwl9Cj4gKwo+ICsJZm9yIChpID0gMTsgaSA8IGFyZ2M7IGkrKykgewo+ICsJCWlmIChzdGF0KGFy Z3ZbaV0sICZzdCkgPCAwKSB7Cj4gKwkJCXBlcnJvcihhcmd2W2ldKTsKPiArCQkJY29udGludWU7 Cj4gKwkJfQo+ICsJCWZkID0gb3Blbihhcmd2W2ldLAo+ICsJCQkgIFNfSVNESVIoc3Quc3RfbW9k ZSkgPyBPX0RJUkVDVE9SWSA6IE9fUkRPTkxZKTsKPiArCQlpZiAoZmQgPT0gLTEpIHsKPiArCQkJ cGVycm9yKGFyZ3ZbaV0pOwo+ICsJCQlleGl0KDEpOwo+ICsJCX0KPiArCQlyYyA9IGlvY3RsKGZk LCBGU19JT0NfR0VUX0VOQ1JZUFRJT05fUE9MSUNZLCAmcG9saWN5KTsKPiArCQljbG9zZShmZCk7 Cj4gKwkJaWYgKHJjKSB7Cj4gKwkJCXByaW50ZigiRXJyb3IgZ2V0dGluZyBwb2xpY3kgZm9yICVz OiAlc1xuIiwKPiArCQkJICAgICAgIGFyZ3ZbaV0sIHN0cmVycm9yKGVycm5vKSk7Cj4gKwkJCWNv bnRpbnVlOwo+ICsJCX0KPiArCQlwcmludGYoIiVzOiAiLCBhcmd2W2ldKTsKPiArCQlmb3IgKGog PSAwOyBqIDwgRlNfS0VZX0RFU0NSSVBUT1JfU0laRTsgaisrKSB7Cj4gKwkJCXByaW50ZigiJTAy eCIsICh1bnNpZ25lZCBjaGFyKSBwb2xpY3kubWFzdGVyX2tleV9kZXNjcmlwdG9yW2pdKTsKPiAr CQl9Cj4gKwkJZnB1dGMoJ1xuJywgc3Rkb3V0KTsKPiArCX0KPiArCWV4aXQoMCk7Cj4gK30KPiAr Cj4gKyNkZWZpbmUgbmV3X3Nlc3Npb25fZGVzYyAiZ2l2ZSB0aGUgaW52b2tpbmcgcHJvY2VzcyBh IG5ldyBzZXNzaW9uIGtleXJpbmciCj4gKyNkZWZpbmUgbmV3X3Nlc3Npb25faGVscCBcCj4gKyJm MmZzY3J5cHQgbmV3X3Nlc3Npb25cblxuIiBcCj4gKyJHaXZlIHRoZSBpbnZva2luZyBwcm9jZXNz ICh0eXBpY2FsbHkgYSBzaGVsbCkgYSBuZXcgc2Vzc2lvbiBrZXlyaW5nLFxuIiBcCj4gKyJkaXNj YXJkaW5nIGl0cyBvbGQgc2Vzc2lvbiBrZXlyaW5nLlxuIgo+ICsKPiArc3RhdGljIHZvaWQgZG9f bmV3X3Nlc3Npb24oaW50IGFyZ2MsIGNoYXIgKiphcmd2LCBjb25zdCBzdHJ1Y3QgY21kX2Rlc2Mg KmNtZCkKPiArewo+ICsJbG9uZyBrZXlpZCwgcmV0Owo+ICsKPiArCWlmIChhcmdjID4gMSkgewo+ ICsJCWZwdXRzKCJFeGNlc3MgYXJndW1lbnRzXG5cbiIsIHN0ZGVycik7Cj4gKwkJZnB1dHMoY21k LT5jbWRfaGVscCwgc3RkZXJyKTsKPiArCQlleGl0KDEpOwo+ICsJfQo+ICsJa2V5aWQgPSBrZXlj dGwoS0VZQ1RMX0pPSU5fU0VTU0lPTl9LRVlSSU5HLCBOVUxMKTsKPiArCWlmIChrZXlpZCA8IDAp IHsKPiArCQlwZXJyb3IoIktFWUNUTF9KT0lOX1NFU1NJT05fS0VZUklORyIpOwo+ICsJCWV4aXQo MSk7Cj4gKwl9Cj4gKwlyZXQgPSBrZXljdGwoS0VZQ1RMX1NFU1NJT05fVE9fUEFSRU5ULCBOVUxM KTsKPiArCWlmIChyZXQgPCAwKSB7Cj4gKwkJcGVycm9yKCJLRVlDVExfU0VTU0lPTl9UT19QQVJF TlQiKTsKPiArCQlleGl0KDEpOwo+ICsJfQo+ICsJcHJpbnRmKCJTd2l0Y2hlZCBpbnZva2luZyBw cm9jZXNzIHRvIG5ldyBzZXNzaW9uIGtleXJpbmcgJWxkXG4iLCBrZXlpZCk7Cj4gKwlleGl0KDAp Owo+ICt9Cj4gKwo+ICsjZGVmaW5lIENNRChuYW1lKSB7ICNuYW1lLCBkb18jI25hbWUsIG5hbWUj I19kZXNjLCBuYW1lIyNfaGVscCwgMCB9Cj4gKyNkZWZpbmUgX0NNRChuYW1lKSB7ICNuYW1lLCBk b18jI25hbWUsIE5VTEwsIE5VTEwsIENNRF9ISURERU4gfQo+ICsKPiArY29uc3Qgc3RydWN0IGNt ZF9kZXNjIGNtZF9saXN0W10gPSB7Cj4gKwlfQ01EKGhlbHApLAo+ICsJQ01EKGFkZF9rZXkpLAo+ ICsJQ01EKGdldF9wb2xpY3kpLAo+ICsJQ01EKG5ld19zZXNzaW9uKSwKPiArCUNNRChzZXRfcG9s aWN5KSwKPiArCXsgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgMCB9Cj4gK307Cj4gKwo+ICtzdGF0 aWMgdm9pZCBkb19oZWxwKGludCBhcmdjLCBjaGFyICoqYXJndiwgY29uc3Qgc3RydWN0IGNtZF9k ZXNjICpjbWQpCj4gK3sKPiArCWNvbnN0IHN0cnVjdCBjbWRfZGVzYyAqcDsKPiArCj4gKwlpZiAo YXJnYyA+IDEpIHsKPiArCQlmb3IgKHAgPSBjbWRfbGlzdDsgcC0+Y21kX25hbWU7IHArKykgewo+ ICsJCQlpZiAocC0+Y21kX2ZsYWdzICYgQ01EX0hJRERFTikKPiArCQkJCWNvbnRpbnVlOwo+ICsJ CQlpZiAoc3RyY21wKHAtPmNtZF9uYW1lLCBhcmd2WzFdKSA9PSAwKSB7Cj4gKwkJCQlwdXRjKCdc bicsIHN0ZG91dCk7Cj4gKwkJCQlmcHV0cygiVVNBR0U6XG4gICIsIHN0ZG91dCk7Cj4gKwkJCQlm cHV0cyhwLT5jbWRfaGVscCwgc3Rkb3V0KTsKPiArCQkJCWV4aXQoMCk7Cj4gKwkJCX0KPiArCQl9 Cj4gKwkJcHJpbnRmKCJVbmtub3duIGNvbW1hbmQ6ICVzXG5cbiIsIGFyZ3ZbMV0pOwo+ICsJfQo+ ICsKPiArCWZwdXRzKCJBdmFpbGFibGUgY29tbWFuZHM6XG4iLCBzdGRvdXQpOwo+ICsJZm9yIChw ID0gY21kX2xpc3Q7IHAtPmNtZF9uYW1lOyBwKyspIHsKPiArCQlpZiAocC0+Y21kX2ZsYWdzICYg Q01EX0hJRERFTikKPiArCQkJY29udGludWU7Cj4gKwkJcHJpbnRmKCIgICUtMjBzICVzXG4iLCBw LT5jbWRfbmFtZSwgcC0+Y21kX2Rlc2MpOwo+ICsJfQo+ICsJcHJpbnRmKCJcblRvIGdldCBtb3Jl IGluZm9ybWF0aW9uIG9uIGEgY29tbWFuZCwgIgo+ICsJICAgICAgICJ0eXBlICdmMmZzY3J5cHQg aGVscCBjbWQnXG4iKTsKPiArCWV4aXQoMCk7Cj4gK30KPiArCj4gK2ludCBtYWluKGludCBhcmdj LCBjaGFyICphcmd2W10pCj4gK3sKPiArCWNvbnN0IHN0cnVjdCBjbWRfZGVzYyAqY21kOwo+ICsK PiArCWlmIChhcmdjIDwgMikKPiArCQlkb19oZWxwKGFyZ2MsIGFyZ3YsIGNtZF9saXN0KTsKPiAr Cj4gKwlzaWdjYXRjaGVyX3NldHVwKCk7Cj4gKwlmb3IgKGNtZCA9IGNtZF9saXN0OyBjbWQtPmNt ZF9uYW1lOyBjbWQrKykgewo+ICsJCWlmIChzdHJjbXAoY21kLT5jbWRfbmFtZSwgYXJndlsxXSkg PT0gMCkgewo+ICsJCQljbWQtPmNtZF9mdW5jKGFyZ2MtMSwgYXJndisxLCBjbWQpOwo+ICsJCQll eGl0KDApOwo+ICsJCX0KPiArCX0KPiArCXByaW50ZigiVW5rbm93biBjb21tYW5kOiAlc1xuXG4i LCBhcmd2WzFdKTsKPiArCWRvX2hlbHAoMSwgYXJndiwgY21kX2xpc3QpOwo+ICsJcmV0dXJuIDA7 Cj4gK30KPiBkaWZmIC0tZ2l0IGEvdG9vbHMvc2hhNTEyLmMgYi90b29scy9zaGE1MTIuYwo+IG5l dyBmaWxlIG1vZGUgMTAwNjQ0Cj4gaW5kZXggMDAwMDAwMC4uYmYwZDlhNAo+IC0tLSAvZGV2L251 bGwKPiArKysgYi90b29scy9zaGE1MTIuYwo+IEBAIC0wLDAgKzEsMzIzIEBACj4gKy8qCj4gKyAq IHNoYTUxMi5jIC0tLSBUaGUgc2hhNTEyIGFsZ29yaXRobQo+ICsgKgo+ICsgKiBDb3B5cmlnaHQg KEMpIDIwMDQgU2FtIEhvY2V2YXIgPHNhbUBob2NldmFyLm5ldD4KPiArICogKGNvcGllZCBmcm9t IGxpYnRvbWNyeXB0IGFuZCB0aGVuIHJlbGljZW5zZWQgdW5kZXIgR1BMdjIpCj4gKyAqCj4gKyAq ICVCZWdpbi1IZWFkZXIlCj4gKyAqIFRoaXMgZmlsZSBtYXkgYmUgcmVkaXN0cmlidXRlZCB1bmRl ciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5Cj4gKyAqIEdlbmVyYWwgUHVibGljIExpY2Vu c2UsIHZlcnNpb24gMi4KPiArICogJUVuZC1IZWFkZXIlCj4gKyAqLwo+ICsKPiArCj4gKyNpbmNs dWRlICJjb25maWcuaCIKPiArI2luY2x1ZGUgPGFzc2VydC5oPgo+ICsjaW5jbHVkZSA8ZXJybm8u aD4KPiArI2luY2x1ZGUgPGdldG9wdC5oPgo+ICsjaW5jbHVkZSA8ZGlyZW50Lmg+Cj4gKyNpbmNs dWRlIDxlcnJuby5oPgo+ICsjaW5jbHVkZSA8c3RkYXJnLmg+Cj4gKyNpbmNsdWRlIDxzdGRpby5o Pgo+ICsjaW5jbHVkZSA8c3RkbGliLmg+Cj4gKyNpbmNsdWRlIDxzdHJpbmcuaD4KPiArI2luY2x1 ZGUgPG1udGVudC5oPgo+ICsjaW5jbHVkZSA8c3lzL2lvY3RsLmg+Cj4gKyNpbmNsdWRlIDxzeXMv c3RhdC5oPgo+ICsjaW5jbHVkZSA8c3lzL3R5cGVzLmg+Cj4gKyNpbmNsdWRlIDxmY250bC5oPgo+ ICsjaW5jbHVkZSA8dGVybWlvcy5oPgo+ICsjaW5jbHVkZSA8dW5pc3RkLmg+Cj4gKyNpbmNsdWRl IDxzaWduYWwuaD4KPiArI2luY2x1ZGUgPGxpbnV4L2ZzLmg+Cj4gKwo+ICsjaWYgSEFWRV9TWVNf VFlQRVNfSAo+ICsjaW5jbHVkZSA8c3lzL3R5cGVzLmg+Cj4gKyNlbmRpZgo+ICsKPiArI2RlZmlu ZSBGMkZTX1NIQTUxMl9MRU5HVEggNjQKPiArCj4gKy8qIHRoZSBLIGFycmF5ICovCj4gKyNkZWZp bmUgQ09OU1Q2NChuKSBuCj4gK3N0YXRpYyBjb25zdCBfX3U2NCBLWzgwXSA9IHsKPiArCUNPTlNU NjQoMHg0MjhhMmY5OGQ3MjhhZTIyKSwgQ09OU1Q2NCgweDcxMzc0NDkxMjNlZjY1Y2QpLAo+ICsJ Q09OU1Q2NCgweGI1YzBmYmNmZWM0ZDNiMmYpLCBDT05TVDY0KDB4ZTliNWRiYTU4MTg5ZGJiYyks Cj4gKwlDT05TVDY0KDB4Mzk1NmMyNWJmMzQ4YjUzOCksIENPTlNUNjQoMHg1OWYxMTFmMWI2MDVk MDE5KSwKPiArCUNPTlNUNjQoMHg5MjNmODJhNGFmMTk0ZjliKSwgQ09OU1Q2NCgweGFiMWM1ZWQ1 ZGE2ZDgxMTgpLAo+ICsJQ09OU1Q2NCgweGQ4MDdhYTk4YTMwMzAyNDIpLCBDT05TVDY0KDB4MTI4 MzViMDE0NTcwNmZiZSksCj4gKwlDT05TVDY0KDB4MjQzMTg1YmU0ZWU0YjI4YyksIENPTlNUNjQo MHg1NTBjN2RjM2Q1ZmZiNGUyKSwKPiArCUNPTlNUNjQoMHg3MmJlNWQ3NGYyN2I4OTZmKSwgQ09O U1Q2NCgweDgwZGViMWZlM2IxNjk2YjEpLAo+ICsJQ09OU1Q2NCgweDliZGMwNmE3MjVjNzEyMzUp LCBDT05TVDY0KDB4YzE5YmYxNzRjZjY5MjY5NCksCj4gKwlDT05TVDY0KDB4ZTQ5YjY5YzE5ZWYx NGFkMiksIENPTlNUNjQoMHhlZmJlNDc4NjM4NGYyNWUzKSwKPiArCUNPTlNUNjQoMHgwZmMxOWRj NjhiOGNkNWI1KSwgQ09OU1Q2NCgweDI0MGNhMWNjNzdhYzljNjUpLAo+ICsJQ09OU1Q2NCgweDJk ZTkyYzZmNTkyYjAyNzUpLCBDT05TVDY0KDB4NGE3NDg0YWE2ZWE2ZTQ4MyksCj4gKwlDT05TVDY0 KDB4NWNiMGE5ZGNiZDQxZmJkNCksIENPTlNUNjQoMHg3NmY5ODhkYTgzMTE1M2I1KSwKPiArCUNP TlNUNjQoMHg5ODNlNTE1MmVlNjZkZmFiKSwgQ09OU1Q2NCgweGE4MzFjNjZkMmRiNDMyMTApLAo+ ICsJQ09OU1Q2NCgweGIwMDMyN2M4OThmYjIxM2YpLCBDT05TVDY0KDB4YmY1OTdmYzdiZWVmMGVl NCksCj4gKwlDT05TVDY0KDB4YzZlMDBiZjMzZGE4OGZjMiksIENPTlNUNjQoMHhkNWE3OTE0Nzkz MGFhNzI1KSwKPiArCUNPTlNUNjQoMHgwNmNhNjM1MWUwMDM4MjZmKSwgQ09OU1Q2NCgweDE0Mjky OTY3MGEwZTZlNzApLAo+ICsJQ09OU1Q2NCgweDI3YjcwYTg1NDZkMjJmZmMpLCBDT05TVDY0KDB4 MmUxYjIxMzg1YzI2YzkyNiksCj4gKwlDT05TVDY0KDB4NGQyYzZkZmM1YWM0MmFlZCksIENPTlNU NjQoMHg1MzM4MGQxMzlkOTViM2RmKSwKPiArCUNPTlNUNjQoMHg2NTBhNzM1NDhiYWY2M2RlKSwg Q09OU1Q2NCgweDc2NmEwYWJiM2M3N2IyYTgpLAo+ICsJQ09OU1Q2NCgweDgxYzJjOTJlNDdlZGFl ZTYpLCBDT05TVDY0KDB4OTI3MjJjODUxNDgyMzUzYiksCj4gKwlDT05TVDY0KDB4YTJiZmU4YTE0 Y2YxMDM2NCksIENPTlNUNjQoMHhhODFhNjY0YmJjNDIzMDAxKSwKPiArCUNPTlNUNjQoMHhjMjRi OGI3MGQwZjg5NzkxKSwgQ09OU1Q2NCgweGM3NmM1MWEzMDY1NGJlMzApLAo+ICsJQ09OU1Q2NCgw eGQxOTJlODE5ZDZlZjUyMTgpLCBDT05TVDY0KDB4ZDY5OTA2MjQ1NTY1YTkxMCksCj4gKwlDT05T VDY0KDB4ZjQwZTM1ODU1NzcxMjAyYSksIENPTlNUNjQoMHgxMDZhYTA3MDMyYmJkMWI4KSwKPiAr CUNPTlNUNjQoMHgxOWE0YzExNmI4ZDJkMGM4KSwgQ09OU1Q2NCgweDFlMzc2YzA4NTE0MWFiNTMp LAo+ICsJQ09OU1Q2NCgweDI3NDg3NzRjZGY4ZWViOTkpLCBDT05TVDY0KDB4MzRiMGJjYjVlMTli NDhhOCksCj4gKwlDT05TVDY0KDB4MzkxYzBjYjNjNWM5NWE2MyksIENPTlNUNjQoMHg0ZWQ4YWE0 YWUzNDE4YWNiKSwKPiArCUNPTlNUNjQoMHg1YjljY2E0Zjc3NjNlMzczKSwgQ09OU1Q2NCgweDY4 MmU2ZmYzZDZiMmI4YTMpLAo+ICsJQ09OU1Q2NCgweDc0OGY4MmVlNWRlZmIyZmMpLCBDT05TVDY0 KDB4NzhhNTYzNmY0MzE3MmY2MCksCj4gKwlDT05TVDY0KDB4ODRjODc4MTRhMWYwYWI3MiksIENP TlNUNjQoMHg4Y2M3MDIwODFhNjQzOWVjKSwKPiArCUNPTlNUNjQoMHg5MGJlZmZmYTIzNjMxZTI4 KSwgQ09OU1Q2NCgweGE0NTA2Y2ViZGU4MmJkZTkpLAo+ICsJQ09OU1Q2NCgweGJlZjlhM2Y3YjJj Njc5MTUpLCBDT05TVDY0KDB4YzY3MTc4ZjJlMzcyNTMyYiksCj4gKwlDT05TVDY0KDB4Y2EyNzNl Y2VlYTI2NjE5YyksIENPTlNUNjQoMHhkMTg2YjhjNzIxYzBjMjA3KSwKPiArCUNPTlNUNjQoMHhl YWRhN2RkNmNkZTBlYjFlKSwgQ09OU1Q2NCgweGY1N2Q0ZjdmZWU2ZWQxNzgpLAo+ICsJQ09OU1Q2 NCgweDA2ZjA2N2FhNzIxNzZmYmEpLCBDT05TVDY0KDB4MGE2MzdkYzVhMmM4OThhNiksCj4gKwlD T05TVDY0KDB4MTEzZjk4MDRiZWY5MGRhZSksIENPTlNUNjQoMHgxYjcxMGIzNTEzMWM0NzFiKSwK PiArCUNPTlNUNjQoMHgyOGRiNzdmNTIzMDQ3ZDg0KSwgQ09OU1Q2NCgweDMyY2FhYjdiNDBjNzI0 OTMpLAo+ICsJQ09OU1Q2NCgweDNjOWViZTBhMTVjOWJlYmMpLCBDT05TVDY0KDB4NDMxZDY3YzQ5 YzEwMGQ0YyksCj4gKwlDT05TVDY0KDB4NGNjNWQ0YmVjYjNlNDJiNiksIENPTlNUNjQoMHg1OTdm Mjk5Y2ZjNjU3ZTJhKSwKPiArCUNPTlNUNjQoMHg1ZmNiNmZhYjNhZDZmYWVjKSwgQ09OU1Q2NCgw eDZjNDQxOThjNGE0NzU4MTcpCj4gK307Cj4gKyNkZWZpbmUgQ2goeCx5LHopICAgICAgICh6IF4g KHggJiAoeSBeIHopKSkKPiArI2RlZmluZSBNYWooeCx5LHopICAgICAgKCgoeCB8IHkpICYgeikg fCAoeCAmIHkpKQo+ICsjZGVmaW5lIFMoeCwgbikgICAgICAgICBST1I2NGMoeCwgbikKPiArI2Rl ZmluZSBSKHgsIG4pICAgICAgICAgKCgoeCkmQ09OU1Q2NCgweEZGRkZGRkZGRkZGRkZGRkYpKT4+ KChfX3U2NCluKSkKPiArI2RlZmluZSBTaWdtYTAoeCkgICAgICAgKFMoeCwgMjgpIF4gUyh4LCAz NCkgXiBTKHgsIDM5KSkKPiArI2RlZmluZSBTaWdtYTEoeCkgICAgICAgKFMoeCwgMTQpIF4gUyh4 LCAxOCkgXiBTKHgsIDQxKSkKPiArI2RlZmluZSBHYW1tYTAoeCkgICAgICAgKFMoeCwgMSkgXiBT KHgsIDgpIF4gUih4LCA3KSkKPiArI2RlZmluZSBHYW1tYTEoeCkgICAgICAgKFMoeCwgMTkpIF4g Uyh4LCA2MSkgXiBSKHgsIDYpKQo+ICsjZGVmaW5lIFJORChhLGIsYyxkLGUsZixnLGgsaSlcCj4g KwkJdDAgPSBoICsgU2lnbWExKGUpICsgQ2goZSwgZiwgZykgKyBLW2ldICsgV1tpXTtcCj4gKwkJ dDEgPSBTaWdtYTAoYSkgKyBNYWooYSwgYiwgYyk7XAo+ICsJCWQgKz0gdDA7XAo+ICsJCWggID0g dDAgKyB0MTsKPiArI2RlZmluZSBTVE9SRTY0SCh4LCB5KSBcCj4gKwlkbyB7IFwKPiArCQkoeSlb MF0gPSAodW5zaWduZWQgY2hhcikoKCh4KT4+NTYpJjI1NSk7XAo+ICsJCSh5KVsxXSA9ICh1bnNp Z25lZCBjaGFyKSgoKHgpPj40OCkmMjU1KTtcCj4gKwkJKHkpWzJdID0gKHVuc2lnbmVkIGNoYXIp KCgoeCk+PjQwKSYyNTUpO1wKPiArCQkoeSlbM10gPSAodW5zaWduZWQgY2hhcikoKCh4KT4+MzIp JjI1NSk7XAo+ICsJCSh5KVs0XSA9ICh1bnNpZ25lZCBjaGFyKSgoKHgpPj4yNCkmMjU1KTtcCj4g KwkJKHkpWzVdID0gKHVuc2lnbmVkIGNoYXIpKCgoeCk+PjE2KSYyNTUpO1wKPiArCQkoeSlbNl0g PSAodW5zaWduZWQgY2hhcikoKCh4KT4+OCkmMjU1KTtcCj4gKwkJKHkpWzddID0gKHVuc2lnbmVk IGNoYXIpKCh4KSYyNTUpOyB9IHdoaWxlKDApCj4gKwo+ICsjZGVmaW5lIExPQUQ2NEgoeCwgeSlc Cj4gKwlkbyB7eCA9IFwKPiArCQkoKChfX3U2NCkoKHkpWzBdICYgMjU1KSkgPDwgNTYpIHxcCj4g KwkJKCgoX191NjQpKCh5KVsxXSAmIDI1NSkpIDw8IDQ4KSB8XAo+ICsJCSgoKF9fdTY0KSgoeSlb Ml0gJiAyNTUpKSA8PCA0MCkgfFwKPiArCQkoKChfX3U2NCkoKHkpWzNdICYgMjU1KSkgPDwgMzIp IHxcCj4gKwkJKCgoX191NjQpKCh5KVs0XSAmIDI1NSkpIDw8IDI0KSB8XAo+ICsJCSgoKF9fdTY0 KSgoeSlbNV0gJiAyNTUpKSA8PCAxNikgfFwKPiArCQkoKChfX3U2NCkoKHkpWzZdICYgMjU1KSkg PDwgOCkgfFwKPiArCQkoKChfX3U2NCkoKHkpWzddICYgMjU1KSkpO1wKPiArCX0gd2hpbGUoMCkK PiArCj4gKyNkZWZpbmUgUk9SNjRjKHgsIHkpIFwKPiArICAgICggKCgoKHgpJkNPTlNUNjQoMHhG RkZGRkZGRkZGRkZGRkZGKSk+PigoX191NjQpKHkpJkNPTlNUNjQoNjMpKSkgfCBcCj4gKyAgICAg ICgoeCk8PCgoX191NjQpKDY0LSgoeSkmQ09OU1Q2NCg2MykpKSkpKSAmIENPTlNUNjQoMHhGRkZG RkZGRkZGRkZGRkZGKSkKPiArCj4gK3N0cnVjdCBzaGE1MTJfc3RhdGUgewo+ICsJX191NjQgIGxl bmd0aCwgc3RhdGVbOF07Cj4gKwl1bnNpZ25lZCBsb25nIGN1cmxlbjsKPiArCXVuc2lnbmVkIGNo YXIgYnVmWzEyOF07Cj4gK307Cj4gKwo+ICsvKiBUaGlzIGlzIGEgaGlnaGx5IHNpbXBsaWZpZWQg dmVyc2lvbiBmcm9tIGxpYnRvbWNyeXB0ICovCj4gK3N0cnVjdCBoYXNoX3N0YXRlIHsKPiArCXN0 cnVjdCBzaGE1MTJfc3RhdGUgc2hhNTEyOwo+ICt9Owo+ICsKPiArc3RhdGljIHZvaWQgc2hhNTEy X2NvbXByZXNzKHN0cnVjdCBoYXNoX3N0YXRlICogbWQsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmJ1 ZikKPiArewo+ICsJX191NjQgU1s4XSwgV1s4MF0sIHQwLCB0MTsKPiArCWludCBpOwo+ICsKPiAr CS8qIGNvcHkgc3RhdGUgaW50byBTICovCj4gKwlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7Cj4g KwkJU1tpXSA9IG1kLT5zaGE1MTIuc3RhdGVbaV07Cj4gKwl9Cj4gKwo+ICsJLyogY29weSB0aGUg c3RhdGUgaW50byAxMDI0LWJpdHMgaW50byBXWzAuLjE1XSAqLwo+ICsJZm9yIChpID0gMDsgaSA8 IDE2OyBpKyspIHsKPiArCQlMT0FENjRIKFdbaV0sIGJ1ZiArICg4KmkpKTsKPiArCX0KPiArCj4g KwkvKiBmaWxsIFdbMTYuLjc5XSAqLwo+ICsJZm9yIChpID0gMTY7IGkgPCA4MDsgaSsrKSB7Cj4g KwkJV1tpXSA9IEdhbW1hMShXW2kgLSAyXSkgKyBXW2kgLSA3XSArCj4gKwkJCUdhbW1hMChXW2kg LSAxNV0pICsgV1tpIC0gMTZdOwo+ICsJfQo+ICsKPiArCWZvciAoaSA9IDA7IGkgPCA4MDsgaSAr PSA4KSB7Cj4gKwkJUk5EKFNbMF0sU1sxXSxTWzJdLFNbM10sU1s0XSxTWzVdLFNbNl0sU1s3XSxp KzApOwo+ICsJCVJORChTWzddLFNbMF0sU1sxXSxTWzJdLFNbM10sU1s0XSxTWzVdLFNbNl0saSsx KTsKPiArCQlSTkQoU1s2XSxTWzddLFNbMF0sU1sxXSxTWzJdLFNbM10sU1s0XSxTWzVdLGkrMik7 Cj4gKwkJUk5EKFNbNV0sU1s2XSxTWzddLFNbMF0sU1sxXSxTWzJdLFNbM10sU1s0XSxpKzMpOwo+ ICsJCVJORChTWzRdLFNbNV0sU1s2XSxTWzddLFNbMF0sU1sxXSxTWzJdLFNbM10saSs0KTsKPiAr CQlSTkQoU1szXSxTWzRdLFNbNV0sU1s2XSxTWzddLFNbMF0sU1sxXSxTWzJdLGkrNSk7Cj4gKwkJ Uk5EKFNbMl0sU1szXSxTWzRdLFNbNV0sU1s2XSxTWzddLFNbMF0sU1sxXSxpKzYpOwo+ICsJCVJO RChTWzFdLFNbMl0sU1szXSxTWzRdLFNbNV0sU1s2XSxTWzddLFNbMF0saSs3KTsKPiArCX0KPiAr Cj4gKwkgLyogZmVlZGJhY2sgKi8KPiArCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspIHsKPiArCQlt ZC0+c2hhNTEyLnN0YXRlW2ldID0gbWQtPnNoYTUxMi5zdGF0ZVtpXSArIFNbaV07Cj4gKwl9Cj4g K30KPiArCj4gK3N0YXRpYyB2b2lkIHNoYTUxMl9pbml0KHN0cnVjdCBoYXNoX3N0YXRlICogbWQp Cj4gK3sKPiArCW1kLT5zaGE1MTIuY3VybGVuID0gMDsKPiArCW1kLT5zaGE1MTIubGVuZ3RoID0g MDsKPiArCW1kLT5zaGE1MTIuc3RhdGVbMF0gPSBDT05TVDY0KDB4NmEwOWU2NjdmM2JjYzkwOCk7 Cj4gKwltZC0+c2hhNTEyLnN0YXRlWzFdID0gQ09OU1Q2NCgweGJiNjdhZTg1ODRjYWE3M2IpOwo+ ICsJbWQtPnNoYTUxMi5zdGF0ZVsyXSA9IENPTlNUNjQoMHgzYzZlZjM3MmZlOTRmODJiKTsKPiAr CW1kLT5zaGE1MTIuc3RhdGVbM10gPSBDT05TVDY0KDB4YTU0ZmY1M2E1ZjFkMzZmMSk7Cj4gKwlt ZC0+c2hhNTEyLnN0YXRlWzRdID0gQ09OU1Q2NCgweDUxMGU1MjdmYWRlNjgyZDEpOwo+ICsJbWQt PnNoYTUxMi5zdGF0ZVs1XSA9IENPTlNUNjQoMHg5YjA1Njg4YzJiM2U2YzFmKTsKPiArCW1kLT5z aGE1MTIuc3RhdGVbNl0gPSBDT05TVDY0KDB4MWY4M2Q5YWJmYjQxYmQ2Yik7Cj4gKwltZC0+c2hh NTEyLnN0YXRlWzddID0gQ09OU1Q2NCgweDViZTBjZDE5MTM3ZTIxNzkpOwo+ICt9Cj4gKwo+ICtz dGF0aWMgdm9pZCBzaGE1MTJfZG9uZShzdHJ1Y3QgaGFzaF9zdGF0ZSAqIG1kLCB1bnNpZ25lZCBj aGFyICpvdXQpCj4gK3sKPiArCWludCBpOwo+ICsKPiArCS8qIGluY3JlYXNlIHRoZSBsZW5ndGgg b2YgdGhlIG1lc3NhZ2UgKi8KPiArCW1kLT5zaGE1MTIubGVuZ3RoICs9IG1kLT5zaGE1MTIuY3Vy bGVuICogQ09OU1Q2NCg4KTsKPiArCj4gKwkvKiBhcHBlbmQgdGhlICcxJyBiaXQgKi8KPiArCW1k LT5zaGE1MTIuYnVmW21kLT5zaGE1MTIuY3VybGVuKytdID0gKHVuc2lnbmVkIGNoYXIpMHg4MDsK PiArCj4gKwkvKiBpZiB0aGUgbGVuZ3RoIGlzIGN1cnJlbnRseSBhYm92ZSAxMTIgYnl0ZXMgd2Ug YXBwZW5kIHplcm9zIHRoZW4KPiArCSAqIGNvbXByZXNzLiBUaGVuIHdlIGNhbiBmYWxsIGJhY2sg dG8gcGFkZGluZyB6ZXJvcyBhbmQgbGVuZ3RoIGVuY29kaW5nCj4gKwkgKiBsaWtlIG5vcm1hbC4g Ki8KPiArCWlmIChtZC0+c2hhNTEyLmN1cmxlbiA+IDExMikgewo+ICsJCXdoaWxlIChtZC0+c2hh NTEyLmN1cmxlbiA8IDEyOCkgewo+ICsJCQltZC0+c2hhNTEyLmJ1ZlttZC0+c2hhNTEyLmN1cmxl bisrXSA9ICh1bnNpZ25lZCBjaGFyKTA7Cj4gKwkJfQo+ICsJCXNoYTUxMl9jb21wcmVzcyhtZCwg bWQtPnNoYTUxMi5idWYpOwo+ICsJCW1kLT5zaGE1MTIuY3VybGVuID0gMDsKPiArCX0KPiArCj4g KwkvKiBwYWQgdXB0byAxMjAgYnl0ZXMgb2YgemVyb2VzIG5vdGU6IHRoYXQgZnJvbSAxMTIgdG8g MTIwIGlzIHRoZSA2NCBNU0IKPiArCSAqIG9mIHRoZSBsZW5ndGguIFdlIGFzc3VtZSB0aGF0IHlv dSB3b24ndCBoYXNoID4gMl42NCBiaXRzIG9mIGRhdGEuICovCj4gKwl3aGlsZSAobWQtPnNoYTUx Mi5jdXJsZW4gPCAxMjApIHsKPiArCQltZC0+c2hhNTEyLmJ1ZlttZC0+c2hhNTEyLmN1cmxlbisr XSA9ICh1bnNpZ25lZCBjaGFyKTA7Cj4gKwl9Cj4gKwo+ICsJLyogc3RvcmUgbGVuZ3RoICovCj4g KwlTVE9SRTY0SChtZC0+c2hhNTEyLmxlbmd0aCwgbWQtPnNoYTUxMi5idWYgKyAxMjApOwo+ICsJ c2hhNTEyX2NvbXByZXNzKG1kLCBtZC0+c2hhNTEyLmJ1Zik7Cj4gKwo+ICsJLyogY29weSBvdXRw dXQgKi8KPiArCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspIHsKPiArCQlTVE9SRTY0SChtZC0+c2hh NTEyLnN0YXRlW2ldLCBvdXQrKDggKiBpKSk7Cj4gKwl9Cj4gK30KPiArCj4gKyNkZWZpbmUgTUlO KHgsIHkpICggKCh4KTwoeSkpPyh4KTooeSkgKQo+ICsjZGVmaW5lIFNIQTUxMl9CTE9DS1NJWkUg MTI4Cj4gK3N0YXRpYyB2b2lkIHNoYTUxMl9wcm9jZXNzKHN0cnVjdCBoYXNoX3N0YXRlICogbWQs Cj4gKwkJCSAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmluLAo+ICsJCQkgICB1bnNpZ25lZCBsb25n IGlubGVuKQo+ICt7Cj4gKwl1bnNpZ25lZCBsb25nIG47Cj4gKwo+ICsJd2hpbGUgKGlubGVuID4g MCkgewo+ICsJCWlmIChtZC0+c2hhNTEyLmN1cmxlbiA9PSAwICYmIGlubGVuID49IFNIQTUxMl9C TE9DS1NJWkUpIHsKPiArCQkJc2hhNTEyX2NvbXByZXNzKG1kLCBpbik7Cj4gKwkJCW1kLT5zaGE1 MTIubGVuZ3RoICs9IFNIQTUxMl9CTE9DS1NJWkUgKiA4Owo+ICsJCQlpbiArPSBTSEE1MTJfQkxP Q0tTSVpFOwo+ICsJCQlpbmxlbiAtPSBTSEE1MTJfQkxPQ0tTSVpFOwo+ICsJCX0gZWxzZSB7Cj4g KwkJCW4gPSBNSU4oaW5sZW4sIChTSEE1MTJfQkxPQ0tTSVpFIC0gbWQtPnNoYTUxMi5jdXJsZW4p KTsKPiArCQkJbWVtY3B5KG1kLT5zaGE1MTIuYnVmICsgbWQtPnNoYTUxMi5jdXJsZW4sCj4gKwkJ CSAgICAgICBpbiwgKHNpemVfdCluKTsKPiArCQkJbWQtPnNoYTUxMi5jdXJsZW4gKz0gbjsKPiAr CQkJaW4gKz0gbjsKPiArCQkJaW5sZW4gLT0gbjsKPiArCQkJaWYgKG1kLT5zaGE1MTIuY3VybGVu ID09IFNIQTUxMl9CTE9DS1NJWkUpIHsKPiArCQkJCXNoYTUxMl9jb21wcmVzcyhtZCwgbWQtPnNo YTUxMi5idWYpOwo+ICsJCQkJbWQtPnNoYTUxMi5sZW5ndGggKz0gU0hBNTEyX0JMT0NLU0laRSAq IDg7Cj4gKwkJCQltZC0+c2hhNTEyLmN1cmxlbiA9IDA7Cj4gKwkJCX0KPiArCQl9Cj4gKwl9Cj4g K30KPiArCj4gK3ZvaWQgZjJmc19zaGE1MTIoY29uc3QgdW5zaWduZWQgY2hhciAqaW4sIHVuc2ln bmVkIGxvbmcgaW5fc2l6ZSwKPiArCQkgICB1bnNpZ25lZCBjaGFyIG91dFtGMkZTX1NIQTUxMl9M RU5HVEhdKQo+ICt7Cj4gKwlzdHJ1Y3QgaGFzaF9zdGF0ZSBtZDsKPiArCj4gKwlzaGE1MTJfaW5p dCgmbWQpOwo+ICsJc2hhNTEyX3Byb2Nlc3MoJm1kLCBpbiwgaW5fc2l6ZSk7Cj4gKwlzaGE1MTJf ZG9uZSgmbWQsIG91dCk7Cj4gK30KPiArCj4gKyNpZmRlZiBVTklUVEVTVAo+ICtzdGF0aWMgY29u c3Qgc3RydWN0IHsKPiArCWNoYXIgKm1zZzsKPiArCXVuc2lnbmVkIGNoYXIgaGFzaFs2NF07Cj4g K30gdGVzdHNbXSA9IHsKPiArCXsgIiIsCj4gKwkgIHsgMHhjZiwgMHg4MywgMHhlMSwgMHgzNSwg MHg3ZSwgMHhlZiwgMHhiOCwgMHhiZCwKPiArCSAgICAweGYxLCAweDU0LCAweDI4LCAweDUwLCAw eGQ2LCAweDZkLCAweDgwLCAweDA3LAo+ICsJICAgIDB4ZDYsIDB4MjAsIDB4ZTQsIDB4MDUsIDB4 MGIsIDB4NTcsIDB4MTUsIDB4ZGMsCj4gKwkgICAgMHg4MywgMHhmNCwgMHhhOSwgMHgyMSwgMHhk MywgMHg2YywgMHhlOSwgMHhjZSwKPiArCSAgICAweDQ3LCAweGQwLCAweGQxLCAweDNjLCAweDVk LCAweDg1LCAweGYyLCAweGIwLAo+ICsJICAgIDB4ZmYsIDB4ODMsIDB4MTgsIDB4ZDIsIDB4ODcs IDB4N2UsIDB4ZWMsIDB4MmYsCj4gKwkgICAgMHg2MywgMHhiOSwgMHgzMSwgMHhiZCwgMHg0Nywg MHg0MSwgMHg3YSwgMHg4MSwKPiArCSAgICAweGE1LCAweDM4LCAweDMyLCAweDdhLCAweGY5LCAw eDI3LCAweGRhLCAweDNlIH0KPiArCX0sCj4gKwl7ICJhYmMiLAo+ICsJICB7IDB4ZGQsIDB4YWYs IDB4MzUsIDB4YTEsIDB4OTMsIDB4NjEsIDB4N2EsIDB4YmEsCj4gKwkgICAgMHhjYywgMHg0MSwg MHg3MywgMHg0OSwgMHhhZSwgMHgyMCwgMHg0MSwgMHgzMSwKPiArCSAgICAweDEyLCAweGU2LCAw eGZhLCAweDRlLCAweDg5LCAweGE5LCAweDdlLCAweGEyLAo+ICsJICAgIDB4MGEsIDB4OWUsIDB4 ZWUsIDB4ZTYsIDB4NGIsIDB4NTUsIDB4ZDMsIDB4OWEsCj4gKwkgICAgMHgyMSwgMHg5MiwgMHg5 OSwgMHgyYSwgMHgyNywgMHg0ZiwgMHhjMSwgMHhhOCwKPiArCSAgICAweDM2LCAweGJhLCAweDNj LCAweDIzLCAweGEzLCAweGZlLCAweGViLCAweGJkLAo+ICsJICAgIDB4NDUsIDB4NGQsIDB4NDQs IDB4MjMsIDB4NjQsIDB4M2MsIDB4ZTgsIDB4MGUsCj4gKwkgICAgMHgyYSwgMHg5YSwgMHhjOSwg MHg0ZiwgMHhhNSwgMHg0YywgMHhhNCwgMHg5ZiB9Cj4gKwl9LAo+ICsJeyAiYWJjZGVmZ2hiY2Rl ZmdoaWNkZWZnaGlqZGVmZ2hpamtlZmdoaWprbGZnaGlqa2xtZ2hpamtsbW5oaWprbG1ub2lqa2xt bm9wamtsbW5vcHFrbG1ub3Bxcmxtbm9wcXJzbW5vcHFyc3Rub3BxcnN0dSIsCj4gKwkgIHsgMHg4 ZSwgMHg5NSwgMHg5YiwgMHg3NSwgMHhkYSwgMHhlMywgMHgxMywgMHhkYSwKPiArCSAgICAweDhj LCAweGY0LCAweGY3LCAweDI4LCAweDE0LCAweGZjLCAweDE0LCAweDNmLAo+ICsJICAgIDB4OGYs IDB4NzcsIDB4NzksIDB4YzYsIDB4ZWIsIDB4OWYsIDB4N2YsIDB4YTEsCj4gKwkgICAgMHg3Miwg MHg5OSwgMHhhZSwgMHhhZCwgMHhiNiwgMHg4OCwgMHg5MCwgMHgxOCwKPiArCSAgICAweDUwLCAw eDFkLCAweDI4LCAweDllLCAweDQ5LCAweDAwLCAweGY3LCAweGU0LAo+ICsJICAgIDB4MzMsIDB4 MWIsIDB4OTksIDB4ZGUsIDB4YzQsIDB4YjUsIDB4NDMsIDB4M2EsCj4gKwkgICAgMHhjNywgMHhk MywgMHgyOSwgMHhlZSwgMHhiNiwgMHhkZCwgMHgyNiwgMHg1NCwKPiArCSAgICAweDVlLCAweDk2 LCAweGU1LCAweDViLCAweDg3LCAweDRiLCAweGU5LCAweDA5IH0KPiArCX0sCj4gK307Cj4gKwo+ ICtpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCj4gK3sKPiArCWludCBpOwo+ICsJaW50 IGVycm9ycyA9IDA7Cj4gKwl1bnNpZ25lZCBjaGFyIHRtcFs2NF07Cj4gKwlzdHJ1Y3QgaGFzaF9z dGF0ZSBtZDsKPiArCj4gKwlmb3IgKGkgPSAwOyBpIDwgKGludCkoc2l6ZW9mKHRlc3RzKSAvIHNp emVvZih0ZXN0c1swXSkpOyBpKyspIHsKPiArCQl1bnNpZ25lZCBjaGFyICptc2cgPSAodW5zaWdu ZWQgY2hhciAqKSB0ZXN0c1tpXS5tc2c7Cj4gKwkJaW50IGxlbiA9IHN0cmxlbih0ZXN0c1tpXS5t c2cpOwo+ICsKPiArCQlmMmZzX3NoYTUxMihtc2csIGxlbiwgdG1wKTsKPiArCQlwcmludGYoIlNI QTUxMiB0ZXN0IG1lc3NhZ2UgJWQ6ICIsIGkpOwo+ICsJCWlmIChtZW1jbXAodG1wLCB0ZXN0c1tp XS5oYXNoLCA2NCkgIT0gMCkgewo+ICsJCQlwcmludGYoIkZBSUxFRFxuIik7Cj4gKwkJCWVycm9y cysrOwo+ICsJCX0gZWxzZQo+ICsJCQlwcmludGYoIk9LXG4iKTsKPiArCX0KPiArCXJldHVybiBl cnJvcnM7Cj4gK30KPiArCj4gKyNlbmRpZiAvKiBVTklUVEVTVCAqLwo+IC0tIAo+IDIuOS4zCgot LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0KQW5ub3VuY2luZyB0aGUgT3hmb3JkIERpY3Rpb25hcmllcyBB UEkhIFRoZSBBUEkgb2ZmZXJzIHdvcmxkLXJlbm93bmVkCmRpY3Rpb25hcnkgY29udGVudCB0aGF0 IGlzIGVhc3kgYW5kIGludHVpdGl2ZSB0byBhY2Nlc3MuIFNpZ24gdXAgZm9yIGFuCmFjY291bnQg dG9kYXkgdG8gc3RhcnQgdXNpbmcgb3VyIGxleGljYWwgZGF0YSB0byBwb3dlciB5b3VyIGFwcHMg YW5kCnByb2plY3RzLiBHZXQgc3RhcnRlZCB0b2RheSBhbmQgZW50ZXIgb3VyIGRldmVsb3BlciBj b21wZXRpdGlvbi4KaHR0cDovL3NkbS5saW5rL294Zm9yZApfX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fXwpMaW51eC1mMmZzLWRldmVsIG1haWxpbmcgbGlzdApM aW51eC1mMmZzLWRldmVsQGxpc3RzLnNvdXJjZWZvcmdlLm5ldApodHRwczovL2xpc3RzLnNvdXJj ZWZvcmdlLm5ldC9saXN0cy9saXN0aW5mby9saW51eC1mMmZzLWRldmVsCg==