Received: from malur.postgresql.org ([217.196.149.56]) by arkaria.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.94.2) (envelope-from ) id 1uEScp-008Rhi-Ol for pgsql-general@arkaria.postgresql.org; Mon, 12 May 2025 12:51:20 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.94.2) (envelope-from ) id 1uEScn-00Frc1-Kd for pgsql-general@arkaria.postgresql.org; Mon, 12 May 2025 12:51:17 +0000 Received: from magus.postgresql.org ([2a02:c0:301:0:ffff::29]) by malur.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.94.2) (envelope-from ) id 1uEScn-00FrZB-4D for pgsql-general@lists.postgresql.org; Mon, 12 May 2025 12:51:17 +0000 Received: from cloud.gatewaynet.com ([185.90.37.94]) by magus.postgresql.org with esmtps (TLS1.2) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.96) (envelope-from ) id 1uEScj-001Vk8-2u for pgsql-general@lists.postgresql.org; Mon, 12 May 2025 12:51:16 +0000 Content-Type: multipart/mixed; boundary="------------dHdWa0soLj1rn1yGvu55FmCa" Message-ID: <59659764-5790-430c-b38d-e4ecdd4a744a@cloud.gatewaynet.com> Date: Mon, 12 May 2025 13:50:12 +0100 MIME-Version: 1.0 Subject: Re: Postgresql 18beta1 and SPI changes To: Tom Lane Cc: "pgsql-general@lists.postgresql.org" , itdev@gatewaynet.com References: <1e1e7585-4d72-4759-a49c-e58cd65be375@cloud.gatewaynet.com> <892274.1746976813@sss.pgh.pa.us> Content-Language: en-US From: Achilleas Mantzios In-Reply-To: <892274.1746976813@sss.pgh.pa.us> List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk This is a multi-part message in MIME format. --------------dHdWa0soLj1rn1yGvu55FmCa Content-Type: multipart/alternative; boundary="------------cB731ITgkKmpBcTQwNenPO7x" --------------cB731ITgkKmpBcTQwNenPO7x Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit Dear All, Dear Tom On 5/11/25 16:20, Tom Lane wrote: > Achilleas Mantzios writes: >> We use are own version of DBmirror, we run our replication in a highly >> fine grained manner. So every upgrade I have to make the code compile >> and test. Up to PostgreSQL 17, I only got minor compilation problems >> that I managed to resolve fairly easily. However this didn't prove to be >> the case with PostgreSQL 18beta1, it proved harder to compile and as my >> fears were verified, it has serious problems. >> My question : is 18's SPI stabilized ? Can I start work on our version >> of DBmirror ? Or wait for 18beta2 or -RC ? > If you think there are changes we need to make, you'd better get > specific sooner not later. I'm not aware of any large fixes that > are pending, cf > > https://wiki.postgresql.org/wiki/PostgreSQL_18_Open_Items I attach a) our old source (pending.c.orig), as of PostgreSQL 17 (tested for some 7 months, so pretty well tested), b) the compilation errors when compiled against 18beta1, and c) the patch that I came up with, which seems (in my minimal testing) to yield correct results on 18beta1. The majority of serious warnings have to do with de-toasting arrays and the PK's int2vector , while the error has to do with getting column details such as attisdropped and attname. Please have a look, and share your thoughts. I haven't touched serious C coding till I first wrote the above sometime in 2004 with a bunch of additions some years ago. > > regards, tom lane --------------cB731ITgkKmpBcTQwNenPO7x Content-Type: text/html; charset=UTF-8 Content-Transfer-Encoding: 8bit

Dear All, Dear Tom

On 5/11/25 16:20, Tom Lane wrote:

Achilleas Mantzios <a.mantzios@cloud.gatewaynet.com> writes:
We use are own version of DBmirror, we run our replication in a highly 
fine grained manner. So every upgrade I have to make the code compile 
and test. Up to PostgreSQL 17, I only got minor compilation problems 
that I managed to resolve fairly easily. However this didn't prove to be 
the case with PostgreSQL 18beta1, it proved harder to compile and as my 
fears were verified, it has serious problems.

      
My question : is 18's SPI stabilized ? Can I start work on our version 
of DBmirror ? Or wait for 18beta2 or -RC ?
If you think there are changes we need to make, you'd better get
specific sooner not later.  I'm not aware of any large fixes that
are pending, cf

https://wiki.postgresql.org/wiki/PostgreSQL_18_Open_Items

I attach 

a) our old source (pending.c.orig), as of PostgreSQL 17 (tested for some 7 months, so pretty well tested), 

b) the compilation errors when compiled against 18beta1, and 

c) the patch that I came up with, which seems (in my minimal testing) to yield correct results on 18beta1.

The majority of serious warnings have to do with de-toasting arrays and the PK's int2vector , while the error has to do with getting column details such as attisdropped and attname.

Please have a look, and share your thoughts. I haven't touched serious C coding till I first wrote the above sometime in 2004 with a bunch of additions some years ago.



			regards, tom lane
--------------cB731ITgkKmpBcTQwNenPO7x-- --------------dHdWa0soLj1rn1yGvu55FmCa Content-Type: text/plain; charset=UTF-8; name="pending.c.orig" Content-Disposition: attachment; filename="pending.c.orig" Content-Transfer-Encoding: base64 LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioKICogcGVuZGluZy5jCiAqICRJZDogcGVuZGluZy5j LHYgMS44IDIwMDYvMDMvMDIgMTQ6MzE6MjkgYWNoaWxsNCBFeHAgJAogKgogKiBUaGlzIGZp bGUgY29udGFpbnMgYSB0cmlnZ2VyIGZvciBQb3N0Z3Jlc3FsLTcueCB0byByZWNvcmQgY2hh bmdlcyB0byB0YWJsZXMKICogdG8gYSBwZW5kaW5nIHRhYmxlIGZvciBtaXJyb3JpbmcuCiAq IEFsbCB0YWJsZXMgdGhhdCBzaG91bGQgYmUgbWlycm9yZWQgc2hvdWxkIGhhdmUgdGhpcyB0 cmlnZ2VyIGhvb2tlZCB1cCB0byBpdC4KICoKICoJIFdyaXR0ZW4gYnkgU3RldmVuIFNpbmdl ciAoc3NpbmdlckBuYXZ0ZWNoaW5jLmNvbSkKICoJIChjKSAyMDAxLTIwMDIgTmF2dGVjaCBT eXN0ZW1zIFN1cHBvcnQgSW5jLgogKiAgICAgICBBTEwgUklHSFRTIFJFU0VSVkVECiAqCiAq IFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMg c29mdHdhcmUgYW5kIGl0cwogKiBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSwgd2l0 aG91dCBmZWUsIGFuZCB3aXRob3V0IGEgd3JpdHRlbiBhZ3JlZW1lbnQKICogaXMgaGVyZWJ5 IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5k IHRoaXMKICogcGFyYWdyYXBoIGFuZCB0aGUgZm9sbG93aW5nIHR3byBwYXJhZ3JhcGhzIGFw cGVhciBpbiBhbGwgY29waWVzLgogKgogKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9S IE9SIERJU1RSSUJVVE9SUyBCRSBMSUFCTEUgVE8gQU5ZIFBBUlRZIEZPUgogKiBESVJFQ1Qs IElORElSRUNULCBTUEVDSUFMLCBJTkNJREVOVEFMLCBPUiBDT05TRVFVRU5USUFMIERBTUFH RVMsIElOQ0xVRElORwogKiBMT1NUIFBST0ZJVFMsIEFSSVNJTkcgT1VUIE9GIFRIRSBVU0Ug T0YgVEhJUyBTT0ZUV0FSRSBBTkQgSVRTCiAqIERPQ1VNRU5UQVRJT04sIEVWRU4gSUYgVEhF IEFVVEhPUiBPUiBESVNUUklCVVRPUlMgSEFWRSBCRUVOIEFEVklTRUQgT0YgVEhFCiAqIFBP U1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgogKgogKiBUSEUgQVVUSE9SIEFORCBESVNUUklC VVRPUlMgU1BFQ0lGSUNBTExZIERJU0NMQUlNUyBBTlkgV0FSUkFOVElFUywKICogSU5DTFVE SU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVS Q0hBTlRBQklMSVRZCiAqIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4g IFRIRSBTT0ZUV0FSRSBQUk9WSURFRCBIRVJFVU5ERVIgSVMKICogT04gQU4gIkFTIElTIiBC QVNJUywgQU5EIFRIRSBBVVRIT1IgQU5EIERJU1RSSUJVVE9SUyBIQVMgTk8gT0JMSUdBVElP TlMgVE8KICogUFJPVklERSBNQUlOVEVOQU5DRSwgU1VQUE9SVCwgVVBEQVRFUywgRU5IQU5D RU1FTlRTLCBPUiBNT0RJRklDQVRJT05TLgogKgogKgogKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq LwojaW5jbHVkZSA8c3RyaW5nLmg+CgojaW5jbHVkZSAicG9zdGdyZXMuaCIKCiNpbmNsdWRl ICJleGVjdXRvci9zcGkuaCIKI2luY2x1ZGUgImNvbW1hbmRzL3RyaWdnZXIuaCIKI2luY2x1 ZGUgImNhdGFsb2cvcGdfdHlwZS5oIgojaW5jbHVkZSAidXRpbHMvYXJyYXkuaCIKI2luY2x1 ZGUgInV0aWxzL3JlbC5oIgojZGVmaW5lCUludDJWZWN0b3JTaXplKG4pCShvZmZzZXRvZihp bnQydmVjdG9yLCB2YWx1ZXMpICsgKG4pICogc2l6ZW9mKGludDE2KSkKCiNkZWZpbmUgVFJV RSAxCiNkZWZpbmUgRkFMU0UgMAoKUEdfTU9EVUxFX01BR0lDOwoKZW51bSBGaWVsZFVzYWdl CnsKCVBSSU1BUlkgPSAwLCBOT05QUklNQVJZLCBBTEwsIE5VTV9GSUVMRFVTQUdFCn07CgoK aW50IHN0b3JlUGVuZGluZyhjaGFyICpjcFRhYmxlTmFtZSwgSGVhcFR1cGxlIHRCZWZvcmVU dXBsZSwKCQkJIEhlYXBUdXBsZSB0QWZ0ZXJUdXBsZSwKCQkJIFR1cGxlRGVzYyB0VHVwZGVz YywKCQkJIE9pZCB0YWJsZU9pZCwKCQkJIGNoYXIgY09wLGludCBzbGF2ZWlkLCBjaGFyIG9y aWdPcCk7CgppbnQgc3RvcmV4aWQodm9pZCk7CgppbnQgaGFuZGxlcihjaGFyICpjcFRhYmxl TmFtZSwgSGVhcFR1cGxlIHRCZWZvcmVUdXBsZSwKCQkJIEhlYXBUdXBsZSB0QWZ0ZXJUdXBs ZSwKCQkJIFR1cGxlRGVzYyB0VHVwZGVzYywKCQkJIE9pZCB0YWJsZU9pZCwKCQkJIGNoYXIg Y09wLCBpbnQgc2xhdmVpZCwgY2hhciAqcGt4cHJlc3MpOwoKaW50IGV4aXN0c0luQWNjbnQo Y2hhciAqY3BUYWJsZU5hbWUsIGludCBzbGF2ZWlkLCBjaGFyICpwa3hwcmVzcyk7CmludCBj cmVhdGVBY2NudChjaGFyICpjcFRhYmxlTmFtZSwgaW50IHNsYXZlaWQsIGNoYXIgKnBreHBy ZXNzKTsKaW50IGRlY3JlYXNlQWNjbnQoY2hhciAqY3BUYWJsZU5hbWUsIGludCBzbGF2ZWlk LCBjaGFyICpwa3hwcmVzcyk7CmludCBkZWxldGVBY2NudChjaGFyICpjcFRhYmxlTmFtZSwg Y2hhciAqcGt4cHJlc3MpOwppbnQgZGVsZXRlU2xhdmVBY2NudChjaGFyICpjcFRhYmxlTmFt ZSxpbnQgc2xhdmVpZCwgY2hhciAqcGt4cHJlc3MpOwpjaGFyICpnZXRQS3hwcmVzcyhjaGFy ICpjcFRhYmxlTmFtZSxIZWFwVHVwbGUgdHVwbGUsIFR1cGxlRGVzYyB0dXBsZURlc2MsT2lk IHRhYmxlT2lkKTsKaW50ICpnZXRTbGF2ZXMoY2hhciAqY3BUYWJsZU5hbWUsY2hhciAqcGt4 cHJlc3MpOwoKCmludCBnZXRTbGF2ZUlkKGNoYXIgKmNwVGFibGVOYW1lLEhlYXBUdXBsZSB0 dXBsZSwgVHVwbGVEZXNjIHR1cGxlRGVzYyk7CgppbnQgZ2V0Q29tcHV0ZWRTbGF2ZUlkKGNo YXIgKmNwVGFibGVOYW1lLEhlYXBUdXBsZSB0dXBsZSwgVHVwbGVEZXNjIHR1cGxlRGVzYyk7 CmludCBnZXRPbGRDb21wdXRlZFNsYXZlSWQoY2hhciAqY3BUYWJsZU5hbWUsSGVhcFR1cGxl IHR1cGxlLCBUdXBsZURlc2MgdHVwbGVEZXNjKTsKLypjaGFyIGdldEZvcndhcmRQYXJlbnRP cmlnT3AoY2hhciAqY3BUYWJsZU5hbWUsSGVhcFR1cGxlIHR1cGxlLCBUdXBsZURlc2MgdHVw bGVEZXNjKTsqLwoKaW50IGhhbmRsZVBhcmVudHMoY2hhciAqY3BUYWJsZU5hbWUsSGVhcFR1 cGxlIEJ0dXBsZSxIZWFwVHVwbGUgQXR1cGxlLCBUdXBsZURlc2MgdHVwbGVEZXNjLE9pZCB0 YWJsZU9pZCxpbnQgc2xhdmVpZCk7CmludCB1cGRhdGVBY2NudFBhcmVudHMoY2hhciAqY3BU YWJsZU5hbWUsSGVhcFR1cGxlIEJ0dXBsZSxIZWFwVHVwbGUgQXR1cGxlLCBUdXBsZURlc2Mg dHVwbGVEZXNjLE9pZCB0YWJsZU9pZCxpbnQgc2xhdmVpZCk7CgppbnQgc3RvcmVLZXlJbmZv KGNoYXIgKmNwVGFibGVOYW1lLCBIZWFwVHVwbGUgdFR1cGxlRGF0YSwgVHVwbGVEZXNjIHRU dXBsRGVzYywgT2lkIHRhYmxlT2lkKTsKaW50IHN0b3JlRGF0YShjaGFyICpjcFRhYmxlTmFt ZSwgSGVhcFR1cGxlIHRUdXBsZURhdGEsIFR1cGxlRGVzYyB0VHVwbGVEZXNjLE9pZCB0YmFs ZU9pZCxpbnQgaUluY2x1ZGVLZXlEYXRhKTsKCmludDJ2ZWN0b3IgKmdldFByaW1hcnlLZXko T2lkIHRibE9pZCk7CgpjaGFyICpwYWNrYWdlRGF0YShjaGFyICpjcFRhYmxlTmFtZSxIZWFw VHVwbGUgdFR1cGxlRGF0YSwgVHVwbGVEZXNjIHRUdXBsZURlY3MsIE9pZCB0YWJsZU9pZCwK CQkJZW51bSBGaWVsZFVzYWdlIGVLZXlVc2FnZSk7Cgpib29sIGlzRXhjbHVkZWQoY2hhciAq Y3BUYWJsZU5hbWUsVHVwbGVEZXNjIHRUdXBsZURlc2MsaW50IGlDb2x1bW5Db3VudGVyKTsK CmNoYXIgKmdldF9uYW1lc3BhY2VfbmFtZShPaWQgbnNwaWQpOwoKCiNkZWZpbmUgQlVGRkVS X1NJWkUgMjU2CiNkZWZpbmUgTUFYX09JRF9MRU4gMTAKLy8jZGVmaW5lIERFQlVHX09VVFBV VCAxCmV4dGVybiBEYXR1bSByZWNvcmRjaGFuZ2UoUEdfRlVOQ1RJT05fQVJHUyk7CgpQR19G VU5DVElPTl9JTkZPX1YxKHJlY29yZGNoYW5nZSk7CgoKLyoqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqCiAqIFRoZSBlbnRyeSBwb2ludCBmb3IgdGhlIHRyaWdnZXIgZnVuY3Rpb24uCiAqIFRo ZSBUcmlnZ2VyIHRha2VzIGEgc2luZ2xlIFNRTCAndGV4dCcgYXJndW1lbnQgaW5kaWNhdGlu ZyB0aGUgbmFtZSBvZiB0aGUKICogdGFibGUgdGhlIHRyaWdnZXIgd2FzIGFwcGxpZWQgdG8u ICBJZiB0aGlzIG5hbWUgaXMgaW5jb3JyZWN0IHNvIHdpbGwgdGhlCiAqIG1pcnJvcmluZy4K ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKiovCkRhdHVtCnJlY29yZGNoYW5nZShQR19GVU5DVElP Tl9BUkdTKQp7CglUcmlnZ2VyRGF0YSAqdHJpZ2RhdGE7CglUdXBsZURlc2MJdHVwZGVzYzsK CUhlYXBUdXBsZQliZWZvcmVUdXBsZSA9IE5VTEw7CglIZWFwVHVwbGUJYWZ0ZXJUdXBsZSA9 IE5VTEw7CglIZWFwVHVwbGUJcmV0VHVwbGUgPSBOVUxMOwoJY2hhcgkgICAqdGJsbmFtZTsK CWNoYXIJCW9wID0gMDsKCWNoYXIgCSAgICpzY2hlbWFuYW1lOwoJY2hhcgkgICAqZnVsbHlx dWFsdGJsbmFtZTsKCWNoYXIgKnBreHByZXNzOwoJaWYgKGZjaW5mby0+Y29udGV4dCAhPSBO VUxMKQoJewoKCQlpZiAoU1BJX2Nvbm5lY3QoKSA8IDApCgkJewoJCQllbG9nKE5PVElDRSwg InJlY29yZGNoYW5nZSBjb3VsZCBub3QgY29ubmVjdCB0byBTUEkiKTsKCQkJcmV0dXJuIC0x OwoJCX0KCQl0cmlnZGF0YSA9IChUcmlnZ2VyRGF0YSAqKSBmY2luZm8tPmNvbnRleHQ7CgkJ LyogRXh0cmFjdCB0aGUgdGFibGUgbmFtZSAqLwoJCXRibG5hbWUgPSBTUElfZ2V0cmVsbmFt ZSh0cmlnZGF0YS0+dGdfcmVsYXRpb24pOwojaWZuZGVmIE5PU0NIRU1BUwoJCXNjaGVtYW5h bWUgPSBnZXRfbmFtZXNwYWNlX25hbWUoUmVsYXRpb25HZXROYW1lc3BhY2UodHJpZ2RhdGEt PnRnX3JlbGF0aW9uKSk7CgkJZnVsbHlxdWFsdGJsbmFtZSA9IHBhbGxvYyhzdHJsZW4odGJs bmFtZSkgKyAKCQkJCQkgICAgICBzdHJsZW4oc2NoZW1hbmFtZSkgKyA2KTsKIAkJc3ByaW50 ZihmdWxseXF1YWx0YmxuYW1lLCJcIiVzXCIuXCIlc1wiIiwKCQkJc2NoZW1hbmFtZSx0Ymxu YW1lKTsKI2Vsc2UKCQlmdWxseXF1YWx0YmxuYW1lID0gcGFsbG9jKHN0cmxlbih0YmxuYW1l KSArIDMpOwoJCXNwcmludGYoZnVsbHlxdWFsdGJsbmFtZSwiXCIlc1wiIix0YmxuYW1lKTsK I2VuZGlmCgkJdHVwZGVzYyA9IHRyaWdkYXRhLT50Z19yZWxhdGlvbi0+cmRfYXR0OwoJCWlm IChUUklHR0VSX0ZJUkVEX0JZX1VQREFURSh0cmlnZGF0YS0+dGdfZXZlbnQpKQoJCXsKCQkJ cmV0VHVwbGUgPSB0cmlnZGF0YS0+dGdfbmV3dHVwbGU7CgkJCWJlZm9yZVR1cGxlID0gdHJp Z2RhdGEtPnRnX3RyaWd0dXBsZTsKCQkJYWZ0ZXJUdXBsZSA9IHRyaWdkYXRhLT50Z19uZXd0 dXBsZTsKCQkJb3AgPSAndSc7CgoJCX0KCQllbHNlIGlmIChUUklHR0VSX0ZJUkVEX0JZX0lO U0VSVCh0cmlnZGF0YS0+dGdfZXZlbnQpKQoJCXsKCQkJcmV0VHVwbGUgPSB0cmlnZGF0YS0+ dGdfdHJpZ3R1cGxlOwoJCQlhZnRlclR1cGxlID0gdHJpZ2RhdGEtPnRnX3RyaWd0dXBsZTsK CQkJb3AgPSAnaSc7CgkJfQoJCWVsc2UgaWYgKFRSSUdHRVJfRklSRURfQllfREVMRVRFKHRy aWdkYXRhLT50Z19ldmVudCkpCgkJewoJCQlyZXRUdXBsZSA9IHRyaWdkYXRhLT50Z190cmln dHVwbGU7CgkJCWJlZm9yZVR1cGxlID0gdHJpZ2RhdGEtPnRnX3RyaWd0dXBsZTsKCQkJb3Ag PSAnZCc7CgkJfQoKCQlpZiAoc3RvcmV4aWQoKSkgewoJCQllbG9nKEVSUk9SLCAiT3BlcmF0 aW9uIGNvdWxkIG5vdCBiZSBtaXJyb3JlZC4gc3RvcmV4aWQgcHJvYmxlbSIpOwoJCQlyZXR1 cm4gUG9pbnRlckdldERhdHVtKE5VTEwpOwoJCX0KCgkJcGt4cHJlc3M9Z2V0UEt4cHJlc3Mo ZnVsbHlxdWFsdGJsbmFtZSxyZXRUdXBsZSx0dXBkZXNjLHJldFR1cGxlLT50X3RhYmxlT2lk KTsKCQlpZiAoaGFuZGxlcihmdWxseXF1YWx0YmxuYW1lLCBiZWZvcmVUdXBsZSwgYWZ0ZXJU dXBsZSwgdHVwZGVzYyxyZXRUdXBsZS0+dF90YWJsZU9pZCwgb3AsZ2V0U2xhdmVJZChmdWxs eXF1YWx0YmxuYW1lLHJldFR1cGxlLHR1cGRlc2MpLHBreHByZXNzKSkKCQl7CgkJCS8qIEFu IGVycm9yIG9jY291cmVkLiBTa2lwIHRoZSBvcGVyYXRpb24uICovCgkJCWVsb2coRVJST1Is ICJPcGVyYXRpb24gY291bGQgbm90IGJlIG1pcnJvcmVkIik7CgkJCXJldHVybiBQb2ludGVy R2V0RGF0dW0oTlVMTCk7CgoJCX0KI2lmIGRlZmluZWQgREVCVUdfT1VUUFVUCgkJZWxvZyhO T1RJQ0UsICJSZXR1cm5pbmcgb24gc3VjY2VzcyIpOwojZW5kaWYKCQlwZnJlZShmdWxseXF1 YWx0YmxuYW1lKTsKCQlwZnJlZShwa3hwcmVzcyk7CgkJU1BJX2ZpbmlzaCgpOwoJCXJldHVy biBQb2ludGVyR2V0RGF0dW0ocmV0VHVwbGUpOwoJfQoJZWxzZQoJewoJCS8qCgkJICogTm90 IGJlaW5nIGNhbGxlZCBhcyBhIHRyaWdnZXIuCgkJICovCgkJcmV0dXJuIFBvaW50ZXJHZXRE YXR1bShOVUxMKTsKCX0KfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIHN0b3JlcyB0 aGUgY3VycmVudCB4aWQgaW4gZGJtaXJyb3JfeGFjdGlvbnMKICoqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqLwoKaW50CnN0b3JleGlkKHZvaWQpIHsKCS8vY2hhcgkgICAqY3BRdWVyeUJhc2Ug PSAiSU5TRVJUIElOVE8gZGJtaXJyb3JfeGFjdGlvbnMgKFhJRCkgVkFMVUVTICgkMSkiOwoJ Y2hhcgkgICAqY3BRdWVyeUJhc2UgPSAiSU5TRVJUIElOVE8gZGJtaXJyb3JfeGFjdGlvbnMg KFhJRCkgU0VMRUNUICQxIFdIRVJFIE5PVCBFWElTVFMgKFNFTEVDVCAxIEZST00gZGJtaXJy b3JfeGFjdGlvbnMgV0hFUkUgeGlkPSQxKSI7CgoJaW50CQlpUmVzdWx0ID0gMDsKCglEYXR1 bQkJc2FQbGFuRGF0YVsxXTsKCU9pZAkJdGFQbGFuQXJnVHlwZXNbMV0gPSB7SU5UNE9JRH07 Cgl2b2lkCSAgICp2cFBsYW47CgoJdnBQbGFuID0gU1BJX3ByZXBhcmUoY3BRdWVyeUJhc2Us IDEsIHRhUGxhbkFyZ1R5cGVzKTsKCWlmICh2cFBsYW4gPT0gTlVMTCkKCQllbG9nKE5PVElD RSwgIiBzdG9yZXhpZCBFcnJvciBjcmVhdGluZyBwbGFuIik7CgoJc2FQbGFuRGF0YVswXSA9 IEludDMyR2V0RGF0dW0oR2V0Q3VycmVudFRyYW5zYWN0aW9uSWQoKSk7CgoJaVJlc3VsdCA9 IFNQSV9leGVjcCh2cFBsYW4sIHNhUGxhbkRhdGEsIE5VTEwgLCAxKTsKCWlmIChpUmVzdWx0 IDwgMCkgewoJCWVsb2coTk9USUNFLCAic3RvcmV4aWQgZmlyZWQgKCVzKSByZXR1cm5lZCAl ZCIsIGNwUXVlcnlCYXNlLCBpUmVzdWx0KTsKCQlyZXR1cm4gLTE7Cgl9CgoKI2lmIGRlZmlu ZWQgREVCVUdfT1VUUFVUCgllbG9nKE5PVElDRSwgInJvdyBzdWNjZXNzZnVsbHkgc3RvcmVk IGluIGRibWlycm9yX3hhY3Rpb25zIik7CiNlbmRpZgoKCXJldHVybiAwOwoKfQoKLyoqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqCiAqIENvbnN0cnVjdHMgYW5kIGV4ZWN1dGVzIGFuIFNRTCBx dWVyeSB0byB3cml0ZSBhIHJlY29yZCBvZiB0aGlzIHR1cGxlIGNoYW5nZQogKiB0byB0aGUg cGVuZGluZyB0YWJsZS4KICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwppbnQKc3RvcmVQZW5k aW5nKGNoYXIgKmNwVGFibGVOYW1lLCBIZWFwVHVwbGUgdEJlZm9yZVR1cGxlLAoJCQkgSGVh cFR1cGxlIHRBZnRlclR1cGxlLAoJCQkgVHVwbGVEZXNjIHRUdXBEZXNjLAoJCQkgT2lkIHRh YmxlT2lkLAoJCQkgY2hhciBjT3AsIGludCBzbGF2ZWlkLCBjaGFyIG9yaWdPcCkKewoJY2hh cgkgICAqY3BRdWVyeUJhc2UgPSAiSU5TRVJUIElOVE8gZGJtaXJyb3JfcGVuZGluZyAoVGFi bGVOYW1lLE9wLFhJRCxzbGF2ZWlkLG9yaWdvcCkgVkFMVUVTICgkMSwkMiwkMywkNCwkNSki OwoKCWludAkJCWlSZXN1bHQgPSAwOwoJSGVhcFR1cGxlCXRDdXJUdXBsZTsKCWNoYXIgbnVs bHNbNV09IiAgICAiOwoKCS8vUG9pbnRzIHRoZSBjdXJyZW50IHR1cGxlKGJlZm9yZSBvciBh ZnRlcikKCQlEYXR1bQkJc2FQbGFuRGF0YVs1XTsKCU9pZAkJCXRhUGxhbkFyZ1R5cGVzWzVd ID0ge05BTUVPSUQsIENIQVJPSUQsIElOVDRPSUQsIElOVDRPSUQsIENIQVJPSUR9OwoJdm9p ZAkgICAqdnBQbGFuOwoKCXRDdXJUdXBsZSA9IHRCZWZvcmVUdXBsZSA/IHRCZWZvcmVUdXBs ZSA6IHRBZnRlclR1cGxlOwoKCgoJdnBQbGFuID0gU1BJX3ByZXBhcmUoY3BRdWVyeUJhc2Us IDUsIHRhUGxhbkFyZ1R5cGVzKTsKCWlmICh2cFBsYW4gPT0gTlVMTCkKCQllbG9nKE5PVElD RSwgIkVycm9yIGNyZWF0aW5nIHBsYW4iKTsKCS8qIFNQSV9zYXZlcGxhbih2cFBsYW4pOyAq LwoKCXNhUGxhbkRhdGFbMF0gPSBQb2ludGVyR2V0RGF0dW0oY3BUYWJsZU5hbWUpOwoJc2FQ bGFuRGF0YVsxXSA9IENoYXJHZXREYXR1bShjT3ApOwoJc2FQbGFuRGF0YVsyXSA9IEludDMy R2V0RGF0dW0oR2V0Q3VycmVudFRyYW5zYWN0aW9uSWQoKSk7CglzYVBsYW5EYXRhWzNdID0g SW50MzJHZXREYXR1bShzbGF2ZWlkKTsKCWlmIChzbGF2ZWlkIDw9MCkgbnVsbHNbM109J24n OwoJc2FQbGFuRGF0YVs0XSA9IENoYXJHZXREYXR1bShvcmlnT3ApOwoKCWlSZXN1bHQgPSBT UElfZXhlY3AodnBQbGFuLCBzYVBsYW5EYXRhLCBudWxscywgMSk7CglpZiAoaVJlc3VsdCA8 IDApCgkJZWxvZyhOT1RJQ0UsICJzdG9yZWRQZW5kaW5nIGZpcmVkICglcykgcmV0dXJuZWQg JWQiLCBjcFF1ZXJ5QmFzZSwgaVJlc3VsdCk7CgoKI2lmIGRlZmluZWQgREVCVUdfT1VUUFVU CgllbG9nKE5PVElDRSwgInJvdyBzdWNjZXNzZnVsbHkgc3RvcmVkIGluIHBlbmRpbmcgdGFi bGUiKTsKI2VuZGlmCgoJaWYgKGNPcCA9PSAnZCcpCgl7CgkJLyoqCgkJICogVGhpcyBpcyBh IHJlY29yZCBvZiBhIGRlbGV0ZSBvcGVyYXRpb24uCgkJICogSnVzdCBzdG9yZSB0aGUga2V5 IGRhdGEuCgkJICovCgkJaVJlc3VsdCA9IHN0b3JlS2V5SW5mbyhjcFRhYmxlTmFtZSwgdEJl Zm9yZVR1cGxlLCB0VHVwRGVzYywgdGFibGVPaWQpOwoJfQoJZWxzZSBpZiAoY09wID09ICdp JykKCXsKCQkvKioKCQkgKiBBbiBJbnNlcnQgb3BlcmF0aW9uLgoJCSAqIFN0b3JlIGFsbCBk YXRhCgkJICovCgkJaVJlc3VsdCA9IHN0b3JlRGF0YShjcFRhYmxlTmFtZSwgdEFmdGVyVHVw bGUsIHRUdXBEZXNjLCB0YWJsZU9pZCxUUlVFKTsKCgl9CgllbHNlCgl7CgkJLyogb3AgbXVz dCBiZSBhbiB1cGRhdGUuICovCgkJaVJlc3VsdCA9IHN0b3JlS2V5SW5mbyhjcFRhYmxlTmFt ZSwgdEJlZm9yZVR1cGxlLCB0VHVwRGVzYywgdGFibGVPaWQpOwoJCWlSZXN1bHQgPSBpUmVz dWx0ID8gaVJlc3VsdCA6IHN0b3JlRGF0YShjcFRhYmxlTmFtZSwgdEFmdGVyVHVwbGUsIHRU dXBEZXNjLHRhYmxlT2lkLFRSVUUpOwoJfQoKI2lmIGRlZmluZWQgREVCVUdfT1VUUFVUCgll bG9nKE5PVElDRSwgIkRvbmUgc3RvcmluZyBrZXlpbmZvL2RhdGEiKTsKI2VuZGlmCgoJcmV0 dXJuIGlSZXN1bHQ7Cgp9CgppbnQKc3RvcmVLZXlJbmZvKGNoYXIgKmNwVGFibGVOYW1lLCBI ZWFwVHVwbGUgdFR1cGxlRGF0YSwKCQkJIFR1cGxlRGVzYyB0VHVwbGVEZXNjLCBPaWQgdGFi bGVPaWQpCnsKCglPaWQJCQlzYVBsYW5BcmdUeXBlc1sxXSA9IHtWQVJDSEFST0lEfTsKCWNo YXIJICAgKmluc1F1ZXJ5ID0gIklOU0VSVCBJTlRPIGRibWlycm9yX3BlbmRpbmdkYXRhIChT ZXFJZCxJc0tleSxEYXRhKSBWQUxVRVMoY3VycnZhbCgnZGJtaXJyb3JfcGVuZGluZ19zZXFp ZF9zZXEnKSwndCcsJDEpIjsKCXZvaWQJICAgKnBwbGFuOwoJRGF0dW0JCXNhUGxhbkRhdGFb MV07CgljaGFyCSAgICpjcEtleURhdGE7CgljaGFyCSAgICpjcEtleURhdGFfdG1wOwoJaW50 CQkJaVJldENvZGU7CgoJcHBsYW4gPSBTUElfcHJlcGFyZShpbnNRdWVyeSwgMSwgc2FQbGFu QXJnVHlwZXMpOwoJaWYgKHBwbGFuID09IE5VTEwpCgl7CgkJZWxvZyhOT1RJQ0UsICJDb3Vs ZCBub3QgcHJlcGFyZSBJTlNFUlQgcGxhbiIpOwoJCXJldHVybiAtMTsKCX0KCgkvKiBwcGxh biA9IFNQSV9zYXZlcGxhbihwcGxhbik7ICovCgljcEtleURhdGEgPSBwYWNrYWdlRGF0YShj cFRhYmxlTmFtZSx0VHVwbGVEYXRhLCB0VHVwbGVEZXNjLHRhYmxlT2lkLCBQUklNQVJZKTsK CWlmIChjcEtleURhdGEgPT0gTlVMTCkKCXsKCQllbG9nKEVSUk9SLCJDb3VsZCBub3QgZGV0 ZXJtaW5lIHByaW1hcnkga2V5IGRhdGEiKTsKCQlyZXR1cm4gLTE7Cgl9CiNpZiBkZWZpbmVk IERFQlVHX09VVFBVVAoJZWxvZyhOT1RJQ0UsICJLZXlEYXRhOiAlcyIsIGNwS2V5RGF0YSk7 CiNlbmRpZgoJY3BLZXlEYXRhX3RtcCA9IHBhbGxvYyhWQVJIRFJTWitzdHJsZW4oY3BLZXlE YXRhKSk7CgltZW1jcHkoKGNwS2V5RGF0YV90bXArVkFSSERSU1opLCBjcEtleURhdGEsIHN0 cmxlbihjcEtleURhdGEpKTsKCVNFVF9WQVJTSVpFKGNwS2V5RGF0YV90bXAsIFZBUkhEUlNa K3N0cmxlbihjcEtleURhdGEpKTsKCXNhUGxhbkRhdGFbMF0gPSBQb2ludGVyR2V0RGF0dW0o Y3BLZXlEYXRhX3RtcCk7CgoJaVJldENvZGUgPSBTUElfZXhlY3AocHBsYW4sIHNhUGxhbkRh dGEsIE5VTEwsIDEpOwoKCWlmIChjcEtleURhdGEgIT0gTlVMTCkKCQlwZnJlZShjcEtleURh dGEpOwoJaWYgKGNwS2V5RGF0YV90bXAgIT0gMCkKCQlwZnJlZShjcEtleURhdGFfdG1wKTsK CglpZiAoaVJldENvZGUgIT0gU1BJX09LX0lOU0VSVCkKCXsKCQllbG9nKE5PVElDRSwgIkVy cm9yIGluc2VydGluZyByb3cgaW4gc3RvcmVLZXlJbmZvIik7CgkJcmV0dXJuIC0xOwoJfQoj aWYgZGVmaW5lZCBERUJVR19PVVRQVVQKCWVsb2coTk9USUNFLCAiSW5zZXJ0IHN1Y2Nlc3Nm dWwiKTsKI2VuZGlmCgoJcmV0dXJuIDA7Cgp9CgoKCgppbnQydmVjdG9yICoKZ2V0UHJpbWFy eUtleShPaWQgdGJsT2lkKQp7CgljaGFyCSAgICpxdWVyeUJhc2U7CgljaGFyCSAgICpxdWVy eTsKCWJvb2wJCWlzTnVsbDsKCWludDJ2ZWN0b3IgKnJlc3VsdEtleTsKCWludDJ2ZWN0b3Ig KnRwUmVzdWx0S2V5OwoJSGVhcFR1cGxlCXJlc1R1cGxlOwoJRGF0dW0JCXJlc0RhdHVtOwoJ aW50CQkJcmV0OwoKCXF1ZXJ5QmFzZSA9ICJTRUxFQ1QgaW5ka2V5IEZST00gcGdfaW5kZXgg V0hFUkUgaW5kaXNwcmltYXJ5PSd0JyBBTkQgaW5kcmVsaWQ9IjsKCXF1ZXJ5ID0gcGFsbG9j KHN0cmxlbihxdWVyeUJhc2UpICsgTUFYX09JRF9MRU4gKyAxKTsKCXNwcmludGYocXVlcnks ICIlcyVkIiwgcXVlcnlCYXNlLCB0YmxPaWQpOwoJcmV0ID0gU1BJX2V4ZWMocXVlcnksIDEp OwoJaWYgKHJldCAhPSBTUElfT0tfU0VMRUNUIHx8IFNQSV9wcm9jZXNzZWQgIT0gMSkKCXsK CQllbG9nKE5PVElDRSwgIkNvdWxkIG5vdCBzZWxlY3QgcHJpbWFyeSBpbmRleCBrZXkiKTsK CQlyZXR1cm4gTlVMTDsKCX0KCglyZXNUdXBsZSA9IFNQSV90dXB0YWJsZS0+dmFsc1swXTsK CXJlc0RhdHVtID0gU1BJX2dldGJpbnZhbChyZXNUdXBsZSwgU1BJX3R1cHRhYmxlLT50dXBk ZXNjLCAxLCAmaXNOdWxsKTsKCglpZiAoaXNOdWxsKSB7CgkJZWxvZyhOT1RJQ0UsICJQS2V5 IGlzIE5VTEwiKTsKCQlyZXR1cm4gTlVMTDsKCX0KCgl0cFJlc3VsdEtleSA9IChpbnQydmVj dG9yICopIERhdHVtR2V0UG9pbnRlcihQR19ERVRPQVNUX0RBVFVNKHJlc0RhdHVtKSk7Cglp bnQgbj10cFJlc3VsdEtleS0+ZGltMTsKCXJlc3VsdEtleSA9IHBhbGxvYyhJbnQyVmVjdG9y U2l6ZShuKSk7CglpZiAobiA+IDApCgkJbWVtY3B5KHJlc3VsdEtleS0+dmFsdWVzLCB0cFJl c3VsdEtleS0+dmFsdWVzLCBuICogc2l6ZW9mKGludDE2KSk7CgoJU0VUX1ZBUlNJWkUocmVz dWx0S2V5LCBJbnQyVmVjdG9yU2l6ZShuKSk7CglyZXN1bHRLZXktPm5kaW0gPSAxOwoJcmVz dWx0S2V5LT5kYXRhb2Zmc2V0ID0gMDsKCXJlc3VsdEtleS0+ZWxlbXR5cGUgPSBJTlQyT0lE OwoJcmVzdWx0S2V5LT5kaW0xID0gbjsKCXJlc3VsdEtleS0+bGJvdW5kMSA9IDA7CgoJcGZy ZWUocXVlcnkpOwoJcmV0dXJuIHJlc3VsdEtleTsKfQoKLyoqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKgogKiBTdG9yZXMgYSBjb3B5IG9mIHRoZSBub24ta2V5IGRhdGEgZm9yIHRoZSByb3cu CiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKi8KaW50CnN0b3JlRGF0YShjaGFyICpjcFRhYmxl TmFtZSwgSGVhcFR1cGxlIHRUdXBsZURhdGEsIFR1cGxlRGVzYyB0VHVwbGVEZXNjLE9pZCB0 YWJsZU9pZCwgaW50IGlJbmNsdWRlS2V5RGF0YSkKewoKCU9pZAkJCXBsYW5BcmdUeXBlc1sx XSA9IHtWQVJDSEFST0lEfTsKCWNoYXIJICAgKmluc1F1ZXJ5ID0gIklOU0VSVCBJTlRPIGRi bWlycm9yX3BlbmRpbmdkYXRhIChTZXFJZCxJc0tleSxEYXRhKSBWQUxVRVMoY3VycnZhbCgn ZGJtaXJyb3JfcGVuZGluZ19zZXFpZF9zZXEnKSwnZicsJDEpIjsKCVNQSVBsYW5QdHIgcHBs YW47CglEYXR1bQkJcGxhbkRhdGFbMV07CgljaGFyCSAgICpjcEtleURhdGE7CgljaGFyCSAg ICpjcEtleURhdGFfdG1wOwoJaW50CQkJaVJldFZhbHVlOwoKCXBwbGFuID0gU1BJX3ByZXBh cmUoaW5zUXVlcnksIDEsIHBsYW5BcmdUeXBlcyk7CglpZiAocHBsYW4gPT0gTlVMTCkKCXsK CQllbG9nKE5PVElDRSwgIkNvdWxkIG5vdCBwcmVwYXJlIElOU0VSVCBwbGFuIik7CgkJcmV0 dXJuIC0xOwoJfQoKCS8qIHBwbGFuID0gU1BJX3NhdmVwbGFuKHBwbGFuKTsgKi8KCWlmIChp SW5jbHVkZUtleURhdGEgPT0gMCkKCQljcEtleURhdGEgPSBwYWNrYWdlRGF0YShjcFRhYmxl TmFtZSx0VHVwbGVEYXRhLCB0VHVwbGVEZXNjLCB0YWJsZU9pZCwgTk9OUFJJTUFSWSk7Cgll bHNlCgkJY3BLZXlEYXRhID0gcGFja2FnZURhdGEoY3BUYWJsZU5hbWUsdFR1cGxlRGF0YSwg dFR1cGxlRGVzYyx0YWJsZU9pZCwgQUxMKTsKCgljcEtleURhdGFfdG1wID0gcGFsbG9jKFZB UkhEUlNaK3N0cmxlbihjcEtleURhdGEpKTsKCW1lbWNweSgoY3BLZXlEYXRhX3RtcCtWQVJI RFJTWiksIGNwS2V5RGF0YSwgc3RybGVuKGNwS2V5RGF0YSkpOwogICAgICAgIFNFVF9WQVJT SVpFKGNwS2V5RGF0YV90bXAsIFZBUkhEUlNaK3N0cmxlbihjcEtleURhdGEpKTsKCXBsYW5E YXRhWzBdID0gUG9pbnRlckdldERhdHVtKGNwS2V5RGF0YV90bXApOwoKCWlSZXRWYWx1ZSA9 IFNQSV9leGVjcChwcGxhbiwgcGxhbkRhdGEsIE5VTEwsIDEpOwoKCWlmIChjcEtleURhdGEg IT0gMCkKCQlwZnJlZShjcEtleURhdGEpOwoJaWYgKGNwS2V5RGF0YV90bXAgIT0gMCkKCQlw ZnJlZShjcEtleURhdGFfdG1wKTsKCglpZiAoaVJldFZhbHVlICE9IFNQSV9PS19JTlNFUlQp Cgl7CgkJZWxvZyhOT1RJQ0UsICJFcnJvciBpbnNlcnRpbmcgcm93IGluIHN0b3JlRGF0YSIp OwoJCXJldHVybiAtMTsKCX0KI2lmIGRlZmluZWQgREVCVUdfT1VUUFVUCgllbG9nKE5PVElD RSwgIkluc2VydCBzdWNjZXNzZnVsIik7CiNlbmRpZgoKCXJldHVybiAwOwoKfQoKLyoqCiAq IFBhY2thZ2VzIHRoZSBkYXRhIGluIHRUdXBsZURhdGEgaW50byBhIHN0cmluZyBvZiB0aGUg Zm9ybWF0CiAqIEZpZWxkTmFtZT0ndmFsdWUgdGV4dCcgIHdoZXJlIGFueSBxdW90ZXMgaW5z aWRlIG9mIHZhbHVlIHRleHQKICogYXJlIGVzY2FwZWQgd2l0aCBhIGJhY2tzbGFzaCBhbmQg YW55IGJhY2tzbGFzaGVzIGluIHZhbHVlIHRleHQKICogYXJlIGVzYWNwZWQgYnkgYSBzZWNv bmQgYmFjayBzbGFzaC4KICoKICogdFR1cGxlRGVzYyBzaG91bGQgYmUgYSBkZXNjcmlwdGlv biBvZiB0aGUgdHVwbGUgc3RvcmVkIGluCiAqIHRUdXBsZURhdGEuCiAqCiAqIGVGaWVsZFVz YWdlIHNwZWNpZmllcyB3aGljaCBmaWVsZHMgdG8gdXNlLgogKglQUklNQVJZIGltcGxpZXMg aW5jbHVkZSBvbmx5IHByaW1hcnkga2V5IGZpZWxkcy4KICoJTk9OUFJJTUFSWSBpbXBsaWVz IGluY2x1ZGUgb25seSBub24tcHJpbWFyeSBrZXkgZmllbGRzLgogKglBTEwgaW1wbGllcyBp bmNsdWRlIGFsbCBmaWVsZHMuCiAqLwpjaGFyICoKcGFja2FnZURhdGEoY2hhciAqY3BUYWJs ZU5hbWUsSGVhcFR1cGxlIHRUdXBsZURhdGEsIFR1cGxlRGVzYyB0VHVwbGVEZXNjLCBPaWQg dGFibGVPaWQsCgkJCWVudW0gRmllbGRVc2FnZSBlS2V5VXNhZ2UpCnsKCWludAkJCWlOdW1D b2xzOwoJaW50MnZlY3RvciAqdHBQS2V5cyA9IE5VTEw7CglpbnQJCQlpQ29sdW1uQ291bnRl cjsKCWNoYXIJICAgKmNwRGF0YUJsb2NrOwoJaW50CQkJaURhdGFCbG9ja1NpemU7CglpbnQJ CQlpVXNlZERhdGFCbG9jazsKCglpTnVtQ29scyA9IHRUdXBsZURlc2MtPm5hdHRzOwoKCWlm IChlS2V5VXNhZ2UgIT0gQUxMKQoJewoJCXRwUEtleXMgPSBnZXRQcmltYXJ5S2V5KHRhYmxl T2lkKTsKCQlpZiAodHBQS2V5cyA9PSBOVUxMKQoJCQlyZXR1cm4gTlVMTDsKCX0KI2lmIGRl ZmluZWQgREVCVUdfT1VUUFVUCglpZiAodHBQS2V5cyAhPSBOVUxMKQoJCWVsb2coTk9USUNF LCAiSGF2ZSBwcmltYXJ5IGtleXMiKTsKI2VuZGlmCgljcERhdGFCbG9jayA9IHBhbGxvYyhC VUZGRVJfU0laRSk7CglpRGF0YUJsb2NrU2l6ZSA9IEJVRkZFUl9TSVpFOwoJaVVzZWREYXRh QmxvY2sgPSAwOwkJCS8qIFRvIGFjY291bnQgZm9yIHRoZSBudWxsICovCgoJZm9yIChpQ29s dW1uQ291bnRlciA9IDE7IGlDb2x1bW5Db3VudGVyIDw9IGlOdW1Db2xzOyBpQ29sdW1uQ291 bnRlcisrKQoJewoJCWludAkJCWlJc1ByaW1hcnlLZXk7CgkJaW50CQkJaVByaW1hcnlLZXlJ bmRleDsKCQljaGFyCSAgICpjcFVuRm9ybWF0ZWRQdHI7CgkJY2hhcgkgICAqY3BGb3JtYXRl ZFB0cjsKCgkJY2hhcgkgICAqY3BGaWVsZE5hbWU7CgkJY2hhcgkgICAqY3BGaWVsZERhdGE7 CgoJCWlmIChlS2V5VXNhZ2UgIT0gQUxMKQoJCXsKCQkJLyogRGV0ZXJtaW5lIGlmIHRoaXMg aXMgYSBwcmltYXJ5IGtleSBvciBub3QuICovCgkJCWlJc1ByaW1hcnlLZXkgPSAwOwoJCQlp bnQxNiAqdHBQS2V5c1YgPSB0cFBLZXlzLT52YWx1ZXM7CgkJCWludCB0cFBLZXlzU2l6ZSA9 IHRwUEtleXMtPmRpbTE7CgkJCWZvciAoaVByaW1hcnlLZXlJbmRleCA9IDA7IGlQcmltYXJ5 S2V5SW5kZXg8dHBQS2V5c1NpemU7CgkJCQkgaVByaW1hcnlLZXlJbmRleCsrKQoJCQl7CgkJ CQlpZiAodHBQS2V5c1ZbaVByaW1hcnlLZXlJbmRleF0gPT0gaUNvbHVtbkNvdW50ZXIpCgkJ CQl7CgkJCQkJaUlzUHJpbWFyeUtleSA9IDE7CgkJCQkJYnJlYWs7CgkJCQl9CgkJCX0KCQkJ aWYgKGlJc1ByaW1hcnlLZXkgPyAoZUtleVVzYWdlICE9IFBSSU1BUlkpIDogKGVLZXlVc2Fn ZSAhPSBOT05QUklNQVJZKSkKCQkJewoJCQkJLyoqCgkJCQkgKiBEb24ndCB1c2UuCgkJCQkg Ki8KI2lmIGRlZmluZWQgREVCVUdfT1VUUFVUCgkJCQllbG9nKE5PVElDRSwgIlNraXBwaW5n IGNvbHVtbiIpOwojZW5kaWYKCQkJCWNvbnRpbnVlOwoJCQl9CgkJfQkJCQkJCS8qIEtleVVz YWdlIT1BTEwgKi8KI2lmbmRlZiAgTk9EUk9QQ09MVU1OCiAgICAgICAgICAgICAgIC8vIHRo aXMgY29tbWVudCBpcyBmb3IgMTEKICAgICAgICAgICAgICAgaWYodFR1cGxlRGVzYy0+YXR0 cnNbaUNvbHVtbkNvdW50ZXItMV0uYXR0aXNkcm9wcGVkKQogICAgICAgICAgICAgICAvL2lm KHRUdXBsZURlc2MtPmF0dHJzW2lDb2x1bW5Db3VudGVyLTFdLT5hdHRpc2Ryb3BwZWQpCiAg ICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAg ICAgICAgKiBUaGlzIGNvbHVtbiBoYXMgYmVlbiBkcm9wcGVkLgogICAgICAgICAgICAgICAg ICAgICogRG8gbm90IG1pcnJvciBpdC4KICAgICAgICAgICAgICAgICAgICAqLwogICAgICAg ICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICAgfQojZW5kaWYKLyoqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpFZHcgbXBhaW5laSBvIGt3ZGlr YXMgZ2lhIGVsZWd4byBlbmFudGksCnRvdSBkYm1pcnJvcl9leGNsdWRlX2F0dHJpYnV0ZXMs IGdpYQpla3NhaXJldGVhIGNvbHVtbnMKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKi8KCQlpZiAoaXNFeGNsdWRlZChjcFRhYmxlTmFtZSx0VHVwbGVEZXNjLGlD b2x1bW5Db3VudGVyKSkgewoJCQljb250aW51ZTsKCQl9CgoJCS8vIHRoaXMgY29tbWVudCBp cyBmb3IgMTEKCQljcEZpZWxkTmFtZSA9IERhdHVtR2V0UG9pbnRlcihOYW1lR2V0RGF0dW0o JnRUdXBsZURlc2MtPmF0dHJzW2lDb2x1bW5Db3VudGVyIC0gMV0uYXR0bmFtZSkpOwoJCS8v Y3BGaWVsZE5hbWUgPSBEYXR1bUdldFBvaW50ZXIoTmFtZUdldERhdHVtKCZ0VHVwbGVEZXNj LT5hdHRyc1tpQ29sdW1uQ291bnRlciAtIDFdLT5hdHRuYW1lKSk7CiNpZiBkZWZpbmVkIERF QlVHX09VVFBVVAoJCWVsb2coTk9USUNFLCAiRmllbGROYW1lOiAlcyIsIGNwRmllbGROYW1l KTsKI2VuZGlmCgkJd2hpbGUgKGlEYXRhQmxvY2tTaXplIC0gaVVzZWREYXRhQmxvY2sgPCBz dHJsZW4oY3BGaWVsZE5hbWUpICsgNikKCQl7CgkJCWNwRGF0YUJsb2NrID0gcmVwYWxsb2Mo Y3BEYXRhQmxvY2ssIGlEYXRhQmxvY2tTaXplICsgQlVGRkVSX1NJWkUpOwoJCQlpRGF0YUJs b2NrU2l6ZSA9IGlEYXRhQmxvY2tTaXplICsgQlVGRkVSX1NJWkU7CgkJfQoJCXNwcmludGYo Y3BEYXRhQmxvY2sgKyBpVXNlZERhdGFCbG9jaywgIlwiJXNcIj0iLCBjcEZpZWxkTmFtZSk7 CgkJaVVzZWREYXRhQmxvY2sgPSBpVXNlZERhdGFCbG9jayArIHN0cmxlbihjcEZpZWxkTmFt ZSkgKyAzOwoJCWNwRmllbGREYXRhID0gU1BJX2dldHZhbHVlKHRUdXBsZURhdGEsIHRUdXBs ZURlc2MsIGlDb2x1bW5Db3VudGVyKTsKCgkJY3BVbkZvcm1hdGVkUHRyID0gY3BGaWVsZERh dGE7CgkJY3BGb3JtYXRlZFB0ciA9IGNwRGF0YUJsb2NrICsgaVVzZWREYXRhQmxvY2s7CgkJ aWYgKGNwRmllbGREYXRhICE9IE5VTEwpCgkJewoJCQkqY3BGb3JtYXRlZFB0ciA9ICdcJyc7 CgkJCWlVc2VkRGF0YUJsb2NrKys7CgkJCWNwRm9ybWF0ZWRQdHIrKzsKCQl9CgkJZWxzZQoJ CXsKCQkJc3ByaW50ZihjcEZvcm1hdGVkUHRyLCIgIik7CgkJCWlVc2VkRGF0YUJsb2NrKys7 CgkJCWNwRm9ybWF0ZWRQdHIrKzsKCQkJY29udGludWU7CgoJCX0KI2lmIGRlZmluZWQgREVC VUdfT1VUUFVUCgkJZWxvZyhOT1RJQ0UsICJGaWVsZERhdGE6ICVzIiwgY3BGaWVsZERhdGEp OwoJCWVsb2coTk9USUNFLCAiU3RhcnRpbmcgZm9ybWF0IGxvb3AiKTsKI2VuZGlmCgkJd2hp bGUgKCpjcFVuRm9ybWF0ZWRQdHIgIT0gMCkKCQl7CgkJCXdoaWxlIChpRGF0YUJsb2NrU2l6 ZSAtIGlVc2VkRGF0YUJsb2NrIDwgMikKCQkJewoJCQkJY3BEYXRhQmxvY2sgPSByZXBhbGxv YyhjcERhdGFCbG9jaywgaURhdGFCbG9ja1NpemUgKyBCVUZGRVJfU0laRSk7CgkJCQlpRGF0 YUJsb2NrU2l6ZSA9IGlEYXRhQmxvY2tTaXplICsgQlVGRkVSX1NJWkU7CgkJCQljcEZvcm1h dGVkUHRyID0gY3BEYXRhQmxvY2sgKyBpVXNlZERhdGFCbG9jazsKCQkJfQoJCQlpZiAoKmNw VW5Gb3JtYXRlZFB0ciA9PSAnXFwnIHx8ICpjcFVuRm9ybWF0ZWRQdHIgPT0gJ1wnJykKCQkJ ewoJCQkJKmNwRm9ybWF0ZWRQdHIgPSAnXFwnOwoJCQkJY3BGb3JtYXRlZFB0cisrOwoJCQkJ aVVzZWREYXRhQmxvY2srKzsKCQkJfQoJCQkqY3BGb3JtYXRlZFB0ciA9ICpjcFVuRm9ybWF0 ZWRQdHI7CgkJCWNwRm9ybWF0ZWRQdHIrKzsKCQkJY3BVbkZvcm1hdGVkUHRyKys7CgkJCWlV c2VkRGF0YUJsb2NrKys7CgkJfQoKCQlwZnJlZShjcEZpZWxkRGF0YSk7CgoJCXdoaWxlIChp RGF0YUJsb2NrU2l6ZSAtIGlVc2VkRGF0YUJsb2NrIDwgMykKCQl7CgkJCWNwRGF0YUJsb2Nr ID0gcmVwYWxsb2MoY3BEYXRhQmxvY2ssIGlEYXRhQmxvY2tTaXplICsgQlVGRkVSX1NJWkUp OwoJCQlpRGF0YUJsb2NrU2l6ZSA9IGlEYXRhQmxvY2tTaXplICsgQlVGRkVSX1NJWkU7CgkJ CWNwRm9ybWF0ZWRQdHIgPSBjcERhdGFCbG9jayArIGlVc2VkRGF0YUJsb2NrOwoJCX0KCQlz cHJpbnRmKGNwRm9ybWF0ZWRQdHIsICInICIpOwoJCWlVc2VkRGF0YUJsb2NrID0gaVVzZWRE YXRhQmxvY2sgKyAyOwojaWYgZGVmaW5lZCBERUJVR19PVVRQVVQKCQllbG9nKE5PVElDRSwg IkRhdGFCbG9jazogJXMiLCBjcERhdGFCbG9jayk7CiNlbmRpZgoKCX0JCQkJCQkJLyogZm9y IGlDb2x1bW5Db3VudGVyICAqLwoJaWYgKHRwUEtleXMgIT0gTlVMTCkKCQlwZnJlZSh0cFBL ZXlzKTsKI2lmIGRlZmluZWQgREVCVUdfT1VUUFVUCgllbG9nKE5PVElDRSwgIlJldHVybmlu ZzogRGF0YUJsb2NrU2l6ZTolZCBpVXNlZERhdGFCbG9jazolZCIsaURhdGFCbG9ja1NpemUs CgkJCWlVc2VkRGF0YUJsb2NrKTsKI2VuZGlmCgltZW1zZXQoY3BEYXRhQmxvY2sgKyBpVXNl ZERhdGFCbG9jaywgMCwgaURhdGFCbG9ja1NpemUgLSBpVXNlZERhdGFCbG9jayk7CgoJcmV0 dXJuIGNwRGF0YUJsb2NrOwoKfQoKCgoKCmJvb2wgaXNFeGNsdWRlZChjaGFyICpjcFRhYmxl TmFtZSwgVHVwbGVEZXNjIHR1cGxlRGVzYywgaW50IGlDb2x1bW5OdW1iZXIpIHsKCWNoYXIg KnFiMTsKCWNoYXIgKnFiMjsKCWNoYXIgKnE7CgljaGFyICpmaWVsZE5hbWU7CglpbnQgcmV0 OwoJSGVhcFR1cGxlIHJlc1R1cGxlOwoJU1BJVHVwbGVUYWJsZSAqU0lES0VZX3R1cFRhYmxl OwoJaW50ICAgICBTSURLRVlfcHJvY2Vzc2VkOwoJY2hhciAqdmFsdWU7CiNpZiBkZWZpbmVk IERFQlVHX09VVFBVVAoJZWxvZyhOT1RJQ0UsICJpbiBpc0V4Y2x1ZGVkIG9mICVzIixjcFRh YmxlTmFtZSk7CiNlbmRpZgoJZmllbGROYW1lID0gU1BJX2ZuYW1lKHR1cGxlRGVzYyxpQ29s dW1uTnVtYmVyKTsKI2lmIGRlZmluZWQgREVCVUdfT1VUUFVUCgllbG9nKE5PVElDRSwgImZp ZWxkTmFtZT0lcyIsZmllbGROYW1lKTsKI2VuZGlmCglxYjEgPSAiU0VMRUNUICI7CglxYjIg PSAiID0gYW55KGF0dG5hbWVzKSBmcm9tIGRibWlycm9yX2V4Y2x1ZGVfYXR0cmlidXRlcyB3 aGVyZSB0YmxuYW1lPSI7CiNpZiBkZWZpbmVkIERFQlVHX09VVFBVVAoJZWxvZyhOT1RJQ0Us ICIlcyBxIHNpemU9JWQiLGZpZWxkTmFtZSxzdHJsZW4ocWIxKStzdHJsZW4ocWIyKStzdHJs ZW4oY3BUYWJsZU5hbWUpKzIrc3RybGVuKGZpZWxkTmFtZSkrMik7CiNlbmRpZgovKgp0byAr MSBwYXJha2F0dyBlaW5haSBnaWEgdG8gMCAobnVsbCkKKi8KCXEgPSBwYWxsb2Moc3RybGVu KHFiMSkrc3RybGVuKHFiMikrc3RybGVuKGNwVGFibGVOYW1lKSsyK3N0cmxlbihmaWVsZE5h bWUpKzIrMSk7CglzcHJpbnRmKHEsIiVzJyVzJyVzJyVzJyIscWIxLGZpZWxkTmFtZSxxYjIs Y3BUYWJsZU5hbWUpOwoJcmV0ID0gU1BJX2V4ZWMocSwxKTsKCXBmcmVlKHEpOwoJcGZyZWUo ZmllbGROYW1lKTsKCglpZiAocmV0ICE9IFNQSV9PS19TRUxFQ1QgfHwgU1BJX3Byb2Nlc3Nl ZCAhPSAxKSByZXR1cm4gRkFMU0U7CglTSURLRVlfdHVwVGFibGUgPSBTUElfdHVwdGFibGU7 CglTSURLRVlfcHJvY2Vzc2VkID0gU1BJX3Byb2Nlc3NlZDsKCXJlc1R1cGxlID0gU0lES0VZ X3R1cFRhYmxlLT52YWxzWzBdOwoJdmFsdWUgPSBTUElfZ2V0dmFsdWUocmVzVHVwbGUsU0lE S0VZX3R1cFRhYmxlLT50dXBkZXNjLDEpOwoJaWYgKHZhbHVlID09IE5VTEwpIHJldHVybiBG QUxTRTsKCglpZiAoc3RybmNtcCh2YWx1ZSwidCIsMSkgPT0gMCB8fCBzdHJuY21wKHZhbHVl LCJUIiwxKSA9PSAwKSB7CgkJcGZyZWUodmFsdWUpOwoJCXJldHVybiBUUlVFOwoJfSAKCWVs c2UgewoJCXBmcmVlKHZhbHVlKTsKCQlyZXR1cm4gRkFMU0U7Cgl9Cn0KCgoKCiNkZWZpbmUg TUFYS0NPTFMgMzIKI2RlZmluZSBNQVhDT0xfTEVOIDEyOAppbnQgaGFuZGxlciAoY2hhciAq Y3BUYWJsZU5hbWUsSGVhcFR1cGxlIHRCZWZvcmVUdXBsZSxIZWFwVHVwbGUgdEFmdGVyVHVw bGUsVHVwbGVEZXNjIHR1cGxlRGVzYyxPaWQgdGFibGVPaWQsY2hhciBvcCxpbnQgc2xhdmVp ZCxjaGFyICpwa3hwcmVzcykgewoKCUhlYXBUdXBsZSAgICAgICB0dXBsZTsKCXR1cGxlID0g dEJlZm9yZVR1cGxlID8gdEJlZm9yZVR1cGxlIDogdEFmdGVyVHVwbGU7CiNpZiBkZWZpbmVk IERFQlVHX09VVFBVVAoJZWxvZyhOT1RJQ0UsIi0tLS0+SU4gaGFuZGxlciB3aXRoIHRhYmxl aWQ9JWQsdGFibGVuYW1lPSVzLHNsYXZlaWQ9JWQsIG9wPSVjLHBreHByZXNzPSVzIix0YWJs ZU9pZCxjcFRhYmxlTmFtZSxzbGF2ZWlkLG9wLHBreHByZXNzKTsKI2VuZGlmCgoJaWYgKHNs YXZlaWQgPT0gMCAmJiBvcCA9PSAnbScpIHsKCQllbG9nKEVSUk9SLCJGb3VuZCBhbiBleHBs aWNpdCB0YWJsZSBJU0VYUFVOQ09ORCB3aXRoIHRoZSAnbScgKGltcGxpY2l0KSBvcGVyYXRp b24uIFJlYWwgc2xhdmUgaWRzIEFSRSBORVZFUiAwLiBUaGF0IHNob3VsZG50IGhhcHBlbiIp OwoJCXJldHVybiAtMTsKCX0KCS8qCglJU0VYUFVOQ09ORAoJKi8KCWVsc2UgaWYgKHNsYXZl aWQgPT0gMCkgcmV0dXJuIHN0b3JlUGVuZGluZyhjcFRhYmxlTmFtZSx0QmVmb3JlVHVwbGUs dEFmdGVyVHVwbGUsdHVwbGVEZXNjLHRhYmxlT2lkLG9wLHNsYXZlaWQsb3ApOwoJLyoKCUlT RVhQV0lUSFNMQVZFSUQKCSovCgllbHNlIGlmIChzbGF2ZWlkID4gMCAmJiBvcCA9PSdkJykg ewoJCWludCByZXR2YWw7CgkJcmV0dmFsID0gIHN0b3JlUGVuZGluZyhjcFRhYmxlTmFtZSx0 QmVmb3JlVHVwbGUsdEFmdGVyVHVwbGUsdHVwbGVEZXNjLHRhYmxlT2lkLG9wLHNsYXZlaWQs b3ApOwoJCXJldHVybiB1cGRhdGVBY2NudFBhcmVudHMoY3BUYWJsZU5hbWUsdEJlZm9yZVR1 cGxlLE5VTEwsdHVwbGVEZXNjLHRhYmxlT2lkLHNsYXZlaWQpOwoJfQoJZWxzZSBpZiAoc2xh dmVpZCA+IDAgJiYgb3AgPT0gJ2knKSB7CgkJaW50IHJldHZhbDsKCQlyZXR2YWwgPSBoYW5k bGVQYXJlbnRzKGNwVGFibGVOYW1lLHRCZWZvcmVUdXBsZSx0QWZ0ZXJUdXBsZSx0dXBsZURl c2MsdGFibGVPaWQsc2xhdmVpZCk7CgkJcmV0dmFsPSAocmV0dmFsKT9yZXR2YWw6c3RvcmVQ ZW5kaW5nKGNwVGFibGVOYW1lLHRCZWZvcmVUdXBsZSx0QWZ0ZXJUdXBsZSx0dXBsZURlc2Ms dGFibGVPaWQsb3Asc2xhdmVpZCxvcCk7CgkJcmV0dXJuIHJldHZhbDsKCX0KCWVsc2UgaWYg KHNsYXZlaWQgPiAwICYmIG9wID09ICd1JykgewoJCWludCByZXR2YWw7CgkJaW50IG9sZF9z bGF2ZWlkOwoJIAlvbGRfc2xhdmVpZCA9IGdldFNsYXZlSWQoY3BUYWJsZU5hbWUsdEJlZm9y ZVR1cGxlLHR1cGxlRGVzYyk7CgkJcmV0dmFsID0gaGFuZGxlUGFyZW50cyhjcFRhYmxlTmFt ZSwoc2xhdmVpZCE9b2xkX3NsYXZlaWQpP05VTEw6dEJlZm9yZVR1cGxlLHRBZnRlclR1cGxl LHR1cGxlRGVzYyx0YWJsZU9pZCxzbGF2ZWlkKTsKCQlpZiAob2xkX3NsYXZlaWQgIT0gLTMg JiYgb2xkX3NsYXZlaWQgIT0gc2xhdmVpZCkgewoJCQlyZXR2YWwgPSByZXR2YWwgfHwgc3Rv cmVQZW5kaW5nKGNwVGFibGVOYW1lLHRCZWZvcmVUdXBsZSx0QWZ0ZXJUdXBsZSx0dXBsZURl c2MsdGFibGVPaWQsJ2QnLG9sZF9zbGF2ZWlkLG9wKTsKCQl9CgkJaWYgKG9sZF9zbGF2ZWlk ICE9IHNsYXZlaWQpIHsKCQkJcmV0dmFsID0gcmV0dmFsIHx8IHN0b3JlUGVuZGluZyhjcFRh YmxlTmFtZSx0QmVmb3JlVHVwbGUsdEFmdGVyVHVwbGUsdHVwbGVEZXNjLHRhYmxlT2lkLCdp JyxzbGF2ZWlkLG9wKTsKCQl9CgkJZWxzZSB7CgkJCXJldHZhbD0gKHJldHZhbCk/cmV0dmFs OnN0b3JlUGVuZGluZyhjcFRhYmxlTmFtZSx0QmVmb3JlVHVwbGUsdEFmdGVyVHVwbGUsdHVw bGVEZXNjLHRhYmxlT2lkLG9wLHNsYXZlaWQsb3ApOwoJCX0KCQlpZiAob2xkX3NsYXZlaWQg IT0gLTMpIHsKCQkJcmV0dmFsID0gKHJldHZhbCk/cmV0dmFsOnVwZGF0ZUFjY250UGFyZW50 cyhjcFRhYmxlTmFtZSx0QmVmb3JlVHVwbGUsKG9sZF9zbGF2ZWlkIT1zbGF2ZWlkKT9OVUxM OnRBZnRlclR1cGxlLHR1cGxlRGVzYyx0YWJsZU9pZCxvbGRfc2xhdmVpZCk7CgkJfQoJCXJl dHVybiByZXR2YWw7Cgl9CgllbHNlIGlmIChzbGF2ZWlkID09IC0zICYmIChvcCA9PSdkJyB8 fCBvcCA9PSdpJykpIHsKCQlyZXR1cm4gMDsKCX0KCWVsc2UgaWYgKHNsYXZlaWQgPT0gLTMg JiYgb3AgPT0ndScpIHsKCQlpbnQgcmV0dmFsPTA7CgkJaW50IG9sZF9zbGF2ZWlkOwoJIAlv bGRfc2xhdmVpZCA9IGdldFNsYXZlSWQoY3BUYWJsZU5hbWUsdEJlZm9yZVR1cGxlLHR1cGxl RGVzYyk7CgkJaWYgKG9sZF9zbGF2ZWlkID4gMCkgewoJCQlyZXR2YWw9c3RvcmVQZW5kaW5n KGNwVGFibGVOYW1lLHRCZWZvcmVUdXBsZSx0QWZ0ZXJUdXBsZSx0dXBsZURlc2MsdGFibGVP aWQsJ2QnLG9sZF9zbGF2ZWlkLG9wKTsKCQkJcmV0dmFsID0gKHJldHZhbCk/cmV0dmFsOnVw ZGF0ZUFjY250UGFyZW50cyhjcFRhYmxlTmFtZSx0QmVmb3JlVHVwbGUsTlVMTCx0dXBsZURl c2MsdGFibGVPaWQsb2xkX3NsYXZlaWQpOwoJCX0KCQlyZXR1cm4gcmV0dmFsOwoJfQoJLyoK CUlTSU1QTEJBQ0tXQVJEIEtBTEVTTUVOTyBhcG8gaGFuZGxlUGFyZW50cwoJKi8KCWVsc2Ug aWYgKHNsYXZlaWQgPjAgJiYgb3AgPT0gJ20nKSB7CgkJaWYgKGdldFNsYXZlSWQoY3BUYWJs ZU5hbWUsdHVwbGUsdHVwbGVEZXNjKSA+PSAwKSB7CgkJcmV0dXJuIDA7Ci8qClNFIFNYT0xJ TyBHaWF0aSB0d3JhIG1wb3JlaSBlbmFzIHBhdGVyYXMgSVNFWFBVTkNPTkQvSVNFWFBXSVRI U0xBVkVJRCBuYSBleGVpIHBhaWRpIElTSU1QTEJBQ0tXQVJECiovCi8qCgkJCWVsb2coRVJS T1IsIkZvdW5kIGFuIGV4cGxpY2l0IHRhYmxlIElTRVhQVU5DT05EIG9yIElTRVhQV0lUSFNM QVZFSUQgd2l0aCB0aGUgJ20nIChpbXBsaWNpdCkgb3BlcmF0aW9uLiAuRmF0aGVycyBvZiBJ U0VYUFVOQ09ORCBtdXN0IEJFIEFMV0FZUyBJU0VYUFVOQ09ORC4gRmF0aGVycyBvZiBJU0VY UFdJVEhTTEFWRUlEIG11c3QgYmUgYWx3YXlzIElTSU1QTC5UaGF0IHNob3VsZG50IGhhcHBl biIpOwoqLwoJCX0KCQlpZiAoZ2V0U2xhdmVJZChjcFRhYmxlTmFtZSx0dXBsZSx0dXBsZURl c2MpID09IC0yKSB7CgkJcmV0dXJuIDA7Ci8qCiovCgkJfQoJCWlmIChnZXRTbGF2ZUlkKGNw VGFibGVOYW1lLHR1cGxlLHR1cGxlRGVzYykgPT0gLTMpIHsKCQlyZXR1cm4gMDsKCQl9CgkJ aWYgKGV4aXN0c0luQWNjbnQoY3BUYWJsZU5hbWUsc2xhdmVpZCxwa3hwcmVzcykpIHJldHVy biAwOwoJCWVsc2UgewoJCQlpbnQgcmV0dmFsOwoJCQlyZXR2YWwgPSBoYW5kbGVQYXJlbnRz KGNwVGFibGVOYW1lLHRCZWZvcmVUdXBsZSx0QWZ0ZXJUdXBsZSx0dXBsZURlc2MsdGFibGVP aWQsc2xhdmVpZCk7CgkJCXJldHZhbCA9IChyZXR2YWwpP3JldHZhbDpzdG9yZVBlbmRpbmco Y3BUYWJsZU5hbWUsdEJlZm9yZVR1cGxlLHRBZnRlclR1cGxlLHR1cGxlRGVzYyx0YWJsZU9p ZCwnaScsc2xhdmVpZCxvcCk7CgkJCXJldHVybiAocmV0dmFsKT9yZXR2YWw6Y3JlYXRlQWNj bnQoY3BUYWJsZU5hbWUsc2xhdmVpZCxwa3hwcmVzcyk7CgkJfQoJfQoJLyoKCUlTSU1QTCog YnV0IGNhbGxlZCBmcm9tIHRyaWdnZXIgKCdpJywnZCcsJ3UnKQoJKi8KCgkvKgoJSVNJTVBM QkFDS1dBUkQKCSovCgllbHNlIGlmIChzbGF2ZWlkID09IC0xKSB7CgkJaWYgKG9wID09ICdp JykgcmV0dXJuIDA7CgkJLyoKCQlEZWxldGUgaW4gdGhpcyBmYXNoaW9uIG1heSBoYXBwZW4g Zm9yICJvcnBoYW4iIHJvd3MuCgkJVGhlIGRlbGV0aW9ucyB3aWxsIGJlICJ0cmlnZ2VyZWQi IGJ5IGNoaWxkZXJuIGRlbGV0aW9ucy91cGRhdGVzLgoJCSovCgkJZWxzZSBpZiAob3AgPT0g J2QnKSB7CgkJCWludCByZXR2YWw9MDsKCQkJaW50ICpzbGF2ZXM7CgkJCWludCAqcnVuOwoJ CQlzbGF2ZXMgPSBnZXRTbGF2ZXMoY3BUYWJsZU5hbWUscGt4cHJlc3MpOwoJCQlpZiAoc2xh dmVzID09IE5VTEwpIHJldHVybiAwOwoJCQlmb3IgKHJ1bj1zbGF2ZXM7KnJ1bjtydW4rKykg ewoJCQkJcmV0dmFsID0gcmV0dmFsIHx8IHN0b3JlUGVuZGluZyhjcFRhYmxlTmFtZSx0QmVm b3JlVHVwbGUsdEFmdGVyVHVwbGUsdHVwbGVEZXNjLHRhYmxlT2lkLG9wLCpydW4sb3ApOwoJ CQkJcmV0dmFsID0gcmV0dmFsIHx8IHVwZGF0ZUFjY250UGFyZW50cyhjcFRhYmxlTmFtZSx0 QmVmb3JlVHVwbGUsTlVMTCx0dXBsZURlc2MsdGFibGVPaWQsKnJ1bik7CgkJCX0KCgkJCXBm cmVlKHNsYXZlcyk7CgkJCXJldHVybiByZXR2YWwgfHwgZGVsZXRlQWNjbnQoY3BUYWJsZU5h bWUscGt4cHJlc3MpOyAKCgkJfQoJCWVsc2UgaWYgKG9wID09ICd1JykgewoJCQlpbnQgcmV0 dmFsPTA7CgkJCWludCAqc2xhdmVzOwoJCQlpbnQgKnJ1bjsKCgkJCXNsYXZlcyA9IGdldFNs YXZlcyhjcFRhYmxlTmFtZSxwa3hwcmVzcyk7CiNpZiBkZWZpbmVkIERFQlVHX09VVFBVVAoJ CQkJZWxvZyhOT1RJQ0UsImluIHNsYXZlaWQ9LTEsIG9wPSd1Jywgc2xhdmVzPSVkIiwoaW50 KXNsYXZlcyk7CiNlbmRpZgoJCQlpZiAoc2xhdmVzID09IE5VTEwpIHJldHVybiAwOwoJCQlm b3IgKHJ1bj1zbGF2ZXM7KnJ1bjtydW4rKykgewojaWYgZGVmaW5lZCBERUJVR19PVVRQVVQK CQkJCWVsb2coTk9USUNFLCJpbiBzbGF2ZWlkPS0xLCBvcD0ndScsIHJ1bnNsYXZlPSVkIiwq cnVuKTsKI2VuZGlmCgkJCQlyZXR2YWwgPSByZXR2YWwgfHwgaGFuZGxlUGFyZW50cyhjcFRh YmxlTmFtZSx0QmVmb3JlVHVwbGUsdEFmdGVyVHVwbGUsdHVwbGVEZXNjLHRhYmxlT2lkLCpy dW4pOwoJCQkJcmV0dmFsID0gcmV0dmFsIHx8IHN0b3JlUGVuZGluZyhjcFRhYmxlTmFtZSx0 QmVmb3JlVHVwbGUsdEFmdGVyVHVwbGUsdHVwbGVEZXNjLHRhYmxlT2lkLG9wLCpydW4sb3Ap OwoJCQkJcmV0dmFsID0gcmV0dmFsIHx8IHVwZGF0ZUFjY250UGFyZW50cyhjcFRhYmxlTmFt ZSx0QmVmb3JlVHVwbGUsdEFmdGVyVHVwbGUsdHVwbGVEZXNjLHRhYmxlT2lkLCpydW4pOwoJ CQl9CgkJCXBmcmVlKHNsYXZlcyk7CgkJCXJldHVybiByZXR2YWw7CgkJfQoJfQoJLyoKCUlT SU1QTEZPUldBUkQKCSovCgllbHNlIGlmIChzbGF2ZWlkID09IC0yKSB7CgkJaWYgKG9wID09 ICdpJykgewoJCQlpbnQgcmV0dmFsPTA7CgkJCWludCBmb3J3X3NsYXZlaWQgPSBnZXRDb21w dXRlZFNsYXZlSWQoY3BUYWJsZU5hbWUsdHVwbGUsdHVwbGVEZXNjKTsKCQkJaWYgKGZvcndf c2xhdmVpZD4wKSB7CgkJCQlyZXR2YWwgPSByZXR2YWwgfHwgaGFuZGxlUGFyZW50cyhjcFRh YmxlTmFtZSxOVUxMLHRBZnRlclR1cGxlLHR1cGxlRGVzYyx0YWJsZU9pZCxmb3J3X3NsYXZl aWQpOwoJCQkJcmV0dmFsID0gcmV0dmFsIHx8IHN0b3JlUGVuZGluZyhjcFRhYmxlTmFtZSx0 QmVmb3JlVHVwbGUsdEFmdGVyVHVwbGUsdHVwbGVEZXNjLHRhYmxlT2lkLG9wLGZvcndfc2xh dmVpZCxvcCk7CgkJCX0KCQkJcmV0dXJuIHJldHZhbDsKCQl9CgkJZWxzZSBpZiAob3AgPT0g J2QnKSB7CgkJCWludCByZXR2YWw9MDsKCQkJaW50IGZvcndfc2xhdmVpZCA9IGdldENvbXB1 dGVkU2xhdmVJZChjcFRhYmxlTmFtZSx0dXBsZSx0dXBsZURlc2MpOwoKCQkJaWYgKGZvcndf c2xhdmVpZD4wKSB7CgkJCQlyZXR2YWwgPSByZXR2YWwgfHwgc3RvcmVQZW5kaW5nKGNwVGFi bGVOYW1lLHRCZWZvcmVUdXBsZSx0QWZ0ZXJUdXBsZSx0dXBsZURlc2MsdGFibGVPaWQsb3As Zm9yd19zbGF2ZWlkLG9wKTsKCQkJCXJldHZhbCA9IHJldHZhbCB8fCB1cGRhdGVBY2NudFBh cmVudHMoY3BUYWJsZU5hbWUsdEJlZm9yZVR1cGxlLE5VTEwsdHVwbGVEZXNjLHRhYmxlT2lk LGZvcndfc2xhdmVpZCk7CgkJCX0KCQkJcmV0dXJuIHJldHZhbCA7IAoKCQl9CgkJZWxzZSBp ZiAob3AgPT0gJ3UnKSB7Ci8qClBPVEUgQUxMQUdIIFRPVSBWQUxVRSBUT1UgQ09MVU1OIE5B TUUgVE9VIFBBVEggZGhsIHRvdSBDT0xVTU4gTUUgTkFNRSBQQVRIQ09MCiovCgkJCWludCBy ZXR2YWw9MDsKCgkJCWludCBmb3J3X3NsYXZlaWQgPSBnZXRDb21wdXRlZFNsYXZlSWQoY3BU YWJsZU5hbWUsdEFmdGVyVHVwbGUsdHVwbGVEZXNjKTsKCQkJaW50IG9sZF9zbGF2ZWlkID0g Z2V0T2xkQ29tcHV0ZWRTbGF2ZUlkKGNwVGFibGVOYW1lLHRCZWZvcmVUdXBsZSx0dXBsZURl c2MpOwoJCQkvL2NoYXIgb3JpZ29wID0gZ2V0Rm9yd2FyZFBhcmVudE9yaWdPcChjcFRhYmxl TmFtZSx0QmVmb3JlVHVwbGUsdHVwbGVEZXNjKTsKCQkJLy9pZiAob3JpZ29wID09ICdpJykg ewoJCQkvLwlvbGRfc2xhdmVpZCA9IGZvcndfc2xhdmVpZDsKCQkJLy99CgkJCS8vZWxvZyhO T1RJQ0UsICJpbiBoYW5kbGVyIElTSU1QTEZXRCBudSwgb3A9JyVjJyAsIGZvcndfc2xhdmVp ZD0gJWQgLCBvbGRfc2xhdmVpZD0gJWQgIiwgb3AsZm9yd19zbGF2ZWlkLG9sZF9zbGF2ZWlk KTsKCQkJLy8gTEVHQUNZIENPREUgYXMgb2YgMjAxNi0wMy0xOAoJCQkvL3JldHZhbCA9IHJl dHZhbCB8fCBoYW5kbGVQYXJlbnRzKGNwVGFibGVOYW1lLChmb3J3X3NsYXZlaWQhPW9sZF9z bGF2ZWlkKT9OVUxMOnRCZWZvcmVUdXBsZSx0QWZ0ZXJUdXBsZSx0dXBsZURlc2MsdGFibGVP aWQsZm9yd19zbGF2ZWlkKTsKCQkJLy9yZXR2YWwgPSByZXR2YWwgfHwgc3RvcmVQZW5kaW5n KGNwVGFibGVOYW1lLHRCZWZvcmVUdXBsZSx0QWZ0ZXJUdXBsZSx0dXBsZURlc2MsdGFibGVP aWQsb3AsZm9yd19zbGF2ZWlkKTsKCQkJLy9yZXR2YWwgPSByZXR2YWwgfHwgdXBkYXRlQWNj bnRQYXJlbnRzKGNwVGFibGVOYW1lLHRCZWZvcmVUdXBsZSwoZm9yd19zbGF2ZWlkIT1vbGRf c2xhdmVpZCk/TlVMTDp0QWZ0ZXJUdXBsZSx0dXBsZURlc2MsdGFibGVPaWQsb2xkX3NsYXZl aWQpOwoJCQlpZiAoZm9yd19zbGF2ZWlkPjApIHsKCQkJCXJldHZhbCA9IGhhbmRsZVBhcmVu dHMoY3BUYWJsZU5hbWUsKGZvcndfc2xhdmVpZCE9b2xkX3NsYXZlaWQpP05VTEw6dEJlZm9y ZVR1cGxlLHRBZnRlclR1cGxlLHR1cGxlRGVzYyx0YWJsZU9pZCxmb3J3X3NsYXZlaWQpOwoJ CQkJaWYgKG9sZF9zbGF2ZWlkICE9IC0zICYmIG9sZF9zbGF2ZWlkICE9IGZvcndfc2xhdmVp ZCkgewoJCQkJCXJldHZhbCA9IHJldHZhbCB8fCBzdG9yZVBlbmRpbmcoY3BUYWJsZU5hbWUs dEJlZm9yZVR1cGxlLHRBZnRlclR1cGxlLHR1cGxlRGVzYyx0YWJsZU9pZCwnZCcsb2xkX3Ns YXZlaWQsb3ApOwoJCQkJfQoJCQkJaWYgKG9sZF9zbGF2ZWlkICE9IGZvcndfc2xhdmVpZCkg ewoJCQkJCXJldHZhbCA9IHJldHZhbCB8fCBzdG9yZVBlbmRpbmcoY3BUYWJsZU5hbWUsdEJl Zm9yZVR1cGxlLHRBZnRlclR1cGxlLHR1cGxlRGVzYyx0YWJsZU9pZCwnaScsZm9yd19zbGF2 ZWlkLG9wKTsKCQkJCX0KCQkJCWVsc2UgewoJCQkJCXJldHZhbD0gKHJldHZhbCk/cmV0dmFs OnN0b3JlUGVuZGluZyhjcFRhYmxlTmFtZSx0QmVmb3JlVHVwbGUsdEFmdGVyVHVwbGUsdHVw bGVEZXNjLHRhYmxlT2lkLG9wLGZvcndfc2xhdmVpZCxvcCk7CgkJCQl9CgkJCQlpZiAob2xk X3NsYXZlaWQgIT0gLTMpIHsKCQkJCQlyZXR2YWwgPSAocmV0dmFsKT9yZXR2YWw6dXBkYXRl QWNjbnRQYXJlbnRzKGNwVGFibGVOYW1lLHRCZWZvcmVUdXBsZSwob2xkX3NsYXZlaWQhPWZv cndfc2xhdmVpZCk/TlVMTDp0QWZ0ZXJUdXBsZSx0dXBsZURlc2MsdGFibGVPaWQsb2xkX3Ns YXZlaWQpOwoJCQkJfQoJCQl9CgkJCWVsc2UgeyAvLyBJU0lNUExGT1JXQVJEIG1lIHZzbGlk IElTIE5VTEwgLS0+IC0zCgkJCQlpZiAob2xkX3NsYXZlaWQgPiAwKSB7CgkJCQkJcmV0dmFs PXN0b3JlUGVuZGluZyhjcFRhYmxlTmFtZSx0QmVmb3JlVHVwbGUsdEFmdGVyVHVwbGUsdHVw bGVEZXNjLHRhYmxlT2lkLCdkJyxvbGRfc2xhdmVpZCxvcCk7CgkJCQkJcmV0dmFsID0gKHJl dHZhbCk/cmV0dmFsOnVwZGF0ZUFjY250UGFyZW50cyhjcFRhYmxlTmFtZSx0QmVmb3JlVHVw bGUsTlVMTCx0dXBsZURlc2MsdGFibGVPaWQsb2xkX3NsYXZlaWQpOwoJCQkJfQoJCQl9CgkJ CXJldHVybiByZXR2YWw7CgkJfQoJfQoJcmV0dXJuIDA7Cn0KCmludCBnZXRTbGF2ZUlkKGNo YXIgKmNwVGFibGVOYW1lLEhlYXBUdXBsZSB0dXBsZSwgVHVwbGVEZXNjIHR1cGxlRGVzYykg ewoJY2hhciAqc2xhdmVfc2l0ZWlka2V5bmFtZTsKCWNoYXIgKnFiOwoJY2hhciAqcTsKCWNo YXIgKmZvbzsKCWludCByZXQ7CglIZWFwVHVwbGUgcmVzVHVwbGU7CglpbnQgYXR0bnVtOwoJ aW50IHNsYXZlaWQ7CglTUElUdXBsZVRhYmxlICpTSURLRVlfdHVwVGFibGU7CglpbnQgICAg IFNJREtFWV9wcm9jZXNzZWQ7CiNpZiBkZWZpbmVkIERFQlVHX09VVFBVVAoJZWxvZyhOT1RJ Q0UsICJpbiBnZXRTbGF2ZUlkIG9mICVzIixjcFRhYmxlTmFtZSk7CiNlbmRpZgoJcWIgPSAi U0VMRUNUIHNpdGVpZGtleW5hbWUgZnJvbSBkYm1pcnJvcl9leHBsaWNpdHJlcHRhYmxlcyB3 aGVyZSB0YmxuYW1lPSI7CglxID0gcGFsbG9jKHN0cmxlbihxYikrc3RybGVuKGNwVGFibGVO YW1lKSsyKzEpOwoJc3ByaW50ZihxLCIlcyclcyciLHFiLGNwVGFibGVOYW1lKTsKCXJldCA9 IFNQSV9leGVjKHEsMSk7CglwZnJlZShxKTsKCQkvKgoJCUlTSU1QTEJBQ0tXQVJECgkJKi8K CWlmIChyZXQgIT0gU1BJX09LX1NFTEVDVCB8fCBTUElfcHJvY2Vzc2VkICE9IDEpIHJldHVy biAtMTsKCVNJREtFWV90dXBUYWJsZSA9IFNQSV90dXB0YWJsZTsKCVNJREtFWV9wcm9jZXNz ZWQgPSBTUElfcHJvY2Vzc2VkOwoJcmVzVHVwbGUgPSBTSURLRVlfdHVwVGFibGUtPnZhbHNb MF07CglzbGF2ZV9zaXRlaWRrZXluYW1lID0gU1BJX2dldHZhbHVlKHJlc1R1cGxlLFNJREtF WV90dXBUYWJsZS0+dHVwZGVzYywxKTsKCQkvKgoJCUlTRVhQVU5DT05ECgkJKi8KCWlmIChz bGF2ZV9zaXRlaWRrZXluYW1lID09IE5VTEwpIHJldHVybiAwOwoJCS8qCgkJSVNJTVBMRk9S V0FSRAoJCSovCglpZiAoc3RybmNtcChzbGF2ZV9zaXRlaWRrZXluYW1lLCJfX18iLDMpID09 IDApIHsKCQlwZnJlZShzbGF2ZV9zaXRlaWRrZXluYW1lKTsKCQlyZXR1cm4gLTI7Cgl9Cglh dHRudW0gPSBTUElfZm51bWJlcih0dXBsZURlc2Msc2xhdmVfc2l0ZWlka2V5bmFtZSk7Cglp ZiAoYXR0bnVtID09IFNQSV9FUlJPUl9OT0FUVFJJQlVURSkgewoJCWVsb2coRVJST1IsIldS T05HIHNsYXZlaWRrZXluYW1lPSVzIGdpdmVuIGZvciB0YWJsZSAlcyIsc2xhdmVfc2l0ZWlk a2V5bmFtZSxjcFRhYmxlTmFtZSk7CgkJcGZyZWUoc2xhdmVfc2l0ZWlka2V5bmFtZSk7CgkJ cmV0dXJuIDA7Cgl9Cglmb289U1BJX2dldHZhbHVlKHR1cGxlLHR1cGxlRGVzYyxhdHRudW0p OwoJCS8qCgkJSVNFWFBXSVRIU0xBVkVJRCBCVVQgc2l0ZWlka2V5bmFtZSBpcyBudWxsCgkJ Ki8KCWlmIChmb28gPT0gTlVMTCkgewoJCXBmcmVlKHNsYXZlX3NpdGVpZGtleW5hbWUpOwoJ CXJldHVybiAtMzsKCX0KCXBmcmVlKHNsYXZlX3NpdGVpZGtleW5hbWUpOwoJc2xhdmVpZCA9 IGF0b2koZm9vKTsKCXBmcmVlKGZvbyk7CgkJLyoKCQlJU0VYUFdJVEhTTEFWRUlECgkJKi8K CXJldHVybiBzbGF2ZWlkOwp9CgppbnQgZ2V0Q29tcHV0ZWRTbGF2ZUlkKGNoYXIgKmNwVGFi bGVOYW1lLEhlYXBUdXBsZSB0dXBsZSwgVHVwbGVEZXNjIHR1cGxlRGVzYykgewpjaGFyICpz bGF2ZV9zaXRlaWRrZXluYW1lOwpjaGFyICpwYXRoOwpjaGFyICpmb3J3X3RhYmxlOwpjaGFy ICpmb3J3X3RhYmxlX2lkOwpjaGFyICpwYXRoY29sOwpjaGFyICpwYXRoY29sdmFsOwpjaGFy ICpxYjsKY2hhciAqcTsKSGVhcFR1cGxlIHJlc1R1cGxlOwppbnQgcmV0OwpjaGFyICpydW47 CmludCBhdHRudW07ClNQSVR1cGxlVGFibGUgKlNJREtFWV90dXBUYWJsZTsKaW50IFNJREtF WV9wcm9jZXNzZWQ7CkhlYXBUdXBsZSBSZWFsUGFyX3R1cGxlOwpTUElUdXBsZVRhYmxlICpS ZWFsUGFyX3R1cFRhYmxlOwpjaGFyICpQYXJUYWJsZU5hbWU7CiNpZiBkZWZpbmVkIERFQlVH X09VVFBVVAogICAgICAgIGVsb2coTk9USUNFLCAiaW4gZ2V0Q29tcHV0ZWRTbGF2ZUlkIG9m ICVzIixjcFRhYmxlTmFtZSk7CiNlbmRpZgoJcWIgPSAiU0VMRUNUIHNpdGVpZGtleW5hbWUg ZnJvbSBkYm1pcnJvcl9leHBsaWNpdHJlcHRhYmxlcyB3aGVyZSB0YmxuYW1lPSI7CglxID0g cGFsbG9jKHN0cmxlbihxYikrc3RybGVuKGNwVGFibGVOYW1lKSsyKzEpOwoJc3ByaW50Zihx LCIlcyclcyciLHFiLGNwVGFibGVOYW1lKTsKCXJldCA9IFNQSV9leGVjKHEsMSk7CglwZnJl ZShxKTsKCWlmIChyZXQgIT0gU1BJX09LX1NFTEVDVCB8fCBTUElfcHJvY2Vzc2VkICE9IDEp IHsKCQllbG9nKEVSUk9SLCJJU0lNUExGT1JXQVJEIFRhYmxlICVzIE5PVCBJTiBkYm1pcnJv cl9leHBsaWNpdHJlcHRhYmxlcy4gSG93IGRpZCB3ZSBnZXQgaGVyZT8gQ09OVEFDVCBJVCBE RVBUIElNTUVESUFURUxZLiIsY3BUYWJsZU5hbWUpOwoJfQoJU0lES0VZX3R1cFRhYmxlID0g U1BJX3R1cHRhYmxlOwoJU0lES0VZX3Byb2Nlc3NlZCA9IFNQSV9wcm9jZXNzZWQ7CglyZXNU dXBsZSA9IFNJREtFWV90dXBUYWJsZS0+dmFsc1swXTsKCXNsYXZlX3NpdGVpZGtleW5hbWUg PSBTUElfZ2V0dmFsdWUocmVzVHVwbGUsU0lES0VZX3R1cFRhYmxlLT50dXBkZXNjLDEpOwoJ aWYgKHNsYXZlX3NpdGVpZGtleW5hbWUgPT0gTlVMTCkgIHsKCQlwZnJlZShzbGF2ZV9zaXRl aWRrZXluYW1lKTsKCQllbG9nKEVSUk9SLCJJU0lNUExGT1JXQVJEIFRhYmxlICVzIGhhcyBO VUxMIHNpdGVpZGtleW5hbWUgaW4gZGJtaXJyb3JfZXhwbGljaXRyZXB0YWJsZXMuIEhvdyBk aWQgd2UgZ2V0IGhlcmU/IENPTlRBQ1QgSVQgREVQVCBJTU1FRElBVEVMWS4iLGNwVGFibGVO YW1lKTsKCX0KCWlmIChzdHJuY21wKHNsYXZlX3NpdGVpZGtleW5hbWUsIl9fXyIsMykgIT0g MCkgewoJCXBmcmVlKHNsYXZlX3NpdGVpZGtleW5hbWUpOwoJCWVsb2coRVJST1IsIklTSU1Q TEZPUldBUkQgVGFibGUgJXMgaGFzIHNpdGVpZGtleW5hbWUgbm90IHN0YXJ0aW5nIHdpdGgg XCJfX19cIiBpbiBkYm1pcnJvcl9leHBsaWNpdHJlcHRhYmxlcy4gSG93IGRpZCB3ZSBnZXQg aGVyZT8gQ09OVEFDVCBJVCBERVBUIElNTUVESUFURUxZLiIsY3BUYWJsZU5hbWUpOwoJfQov LwllbG9nKE5PVElDRSwic2xhdmVfc2l0ZWlka2V5bmFtZT0tJXMtIixzbGF2ZV9zaXRlaWRr ZXluYW1lKTsKCXBhdGggPSBzbGF2ZV9zaXRlaWRrZXluYW1lICsgMzsKLy8JZWxvZyhOT1RJ Q0UsInBhdGg9LSVzLSIscGF0aCk7CglydW4gPSBpbmRleChwYXRoLCdfJyk7CglpZiAocnVu ID09IE5VTEwpIHsKCQlwZnJlZShzbGF2ZV9zaXRlaWRrZXluYW1lKTsKCQllbG9nKEVSUk9S LCJJU0lNUExGT1JXQVJEIFRhYmxlICVzIGhhcyBub3QgdGhlIHJpZ2h0IFwiX19fbG9jYWxj b2xfZm9yd3RhYmxlXCIgZm9ybWF0IHNpdGVpZGtleW5hbWUgIGluIGRibWlycm9yX2V4cGxp Y2l0cmVwdGFibGVzLiBIb3cgZGlkIHdlIGdldCBoZXJlPyBDT05UQUNUIElUIERFUFQgSU1N RURJQVRFTFkuIixjcFRhYmxlTmFtZSk7Cgl9CglwYXRoY29sID0gcGFsbG9jKE1BWENPTF9M RU4pOwovLwllbG9nKE5PVElDRSwicGF0aD0tJWQtIiwodW5zaWduZWQpcGF0aCk7Ci8vCWVs b2coTk9USUNFLCJydW49LSVkLSIsKHVuc2lnbmVkKXJ1bik7Ci8vCWVsb2coTk9USUNFLCJy dW4tcGF0aD0tJWQtIixydW4tcGF0aCk7CgkqcnVuID0gMDsKCXN0cm5jcHkocGF0aGNvbCxw YXRoLHJ1bi1wYXRoKzEpOwoKLy8JZWxvZyhOT1RJQ0UsInBhdGhjb2w9LSVzLSIscGF0aGNv bCk7CgoJZm9yd190YWJsZSA9IHJ1bisxOwoKCWF0dG51bSA9IFNQSV9mbnVtYmVyKHR1cGxl RGVzYyxwYXRoY29sKTsKCWlmIChhdHRudW0gPT0gU1BJX0VSUk9SX05PQVRUUklCVVRFKSB7 CgkJcGZyZWUoc2xhdmVfc2l0ZWlka2V5bmFtZSk7CgkJZWxvZyhFUlJPUiwiV1JPTkcgcGF0 aGNvbD0lcyBnaXZlbiBmb3IgdGFibGUgJXMiLHNsYXZlX3NpdGVpZGtleW5hbWUsY3BUYWJs ZU5hbWUpOwoJCXJldHVybiAwOwogICAgICAgIH0KCXBhdGhjb2x2YWw9U1BJX2dldHZhbHVl KHR1cGxlLHR1cGxlRGVzYyxhdHRudW0pOwoJCgkvKgoJZm9yd190YWJsZSBQUklNQVJZIEtF WSBQUkVQRUkgUEFOVEEgTkEgRUlOQUkgImlkIgoJKi8KCglydW4gPSBpbmRleChmb3J3X3Rh YmxlLCdAJyk7CglpZiAocnVuID09IE5VTEwpIHsKCQlmb3J3X3RhYmxlX2lkID0gcGFsbG9j KE1BWENPTF9MRU4pOwoJCXN0cm5jcHkoZm9yd190YWJsZV9pZCwiaWQiLDMpOwoJfQoJZWxz ZSB7CgkJZm9yd190YWJsZV9pZCA9IHBhbGxvYyhNQVhDT0xfTEVOKTsKCQkqcnVuPTA7CgkJ c3RybmNweShmb3J3X3RhYmxlX2lkLGZvcndfdGFibGUscnVuLWZvcndfdGFibGUrMSk7CgkJ Zm9yd190YWJsZT1ydW4rMTsKCX0KCglxID0gcGFsbG9jKDUxMik7CglzcHJpbnRmKHEsIlNF TEVDVCAqIEZST00gcHVibGljLiVzIHdoZXJlICVzPSclcyciLGZvcndfdGFibGUsZm9yd190 YWJsZV9pZCxwYXRoY29sdmFsKTsKCXJldCA9IFNQSV9leGVjKHEsMSk7CglpZiAocmV0ICE9 IFNQSV9PS19TRUxFQ1QgfHwgU1BJX3Byb2Nlc3NlZCAhPSAxKSB7CgkJcGZyZWUoc2xhdmVf c2l0ZWlka2V5bmFtZSk7CgkJZWxvZyhFUlJPUiwgIkZhdGFsIGVycm9yOiBDb21wdXRlZFNs YXZlSWQ6IHBhciB0YWJsZSAlcyBzaG91bGQgaGF2ZSByb3cgd2l0aCAlcz0lcyIsZm9yd190 YWJsZSxmb3J3X3RhYmxlX2lkLHBhdGhjb2x2YWwpOwoJCXJldHVybiAtMjsKCX0KCXBmcmVl KHEpOwoJUmVhbFBhcl90dXBUYWJsZSA9IFNQSV90dXB0YWJsZTsKCVJlYWxQYXJfdHVwbGUg PSBSZWFsUGFyX3R1cFRhYmxlLT52YWxzWzBdOwoJUGFyVGFibGVOYW1lID0gcGFsbG9jKDI1 Nik7CglzcHJpbnRmKFBhclRhYmxlTmFtZSwiXCJwdWJsaWNcIi5cIiVzXCIiLGZvcndfdGFi bGUpOwoJcmV0ID0gZ2V0U2xhdmVJZChQYXJUYWJsZU5hbWUsUmVhbFBhcl90dXBsZSxSZWFs UGFyX3R1cFRhYmxlLT50dXBkZXNjKTsKCWlmIChyZXQgPT0gLTIpICB7CgkJcGZyZWUoc2xh dmVfc2l0ZWlka2V5bmFtZSk7CgkJcmV0ID0gZ2V0Q29tcHV0ZWRTbGF2ZUlkKFBhclRhYmxl TmFtZSxSZWFsUGFyX3R1cGxlLFJlYWxQYXJfdHVwVGFibGUtPnR1cGRlc2MpOwoJCXBmcmVl KFBhclRhYmxlTmFtZSk7CgkJcmV0dXJuIHJldDsKCX0KCWlmIChyZXQgPD0gMCkgewoJCXBm cmVlKHNsYXZlX3NpdGVpZGtleW5hbWUpOwoJCXBmcmVlKFBhclRhYmxlTmFtZSk7Ci8vCQll bG9nKEVSUk9SLCAiRmF0YWwgZXJyb3I6IHBhciB0YWJsZSAlcyB3aXRoIHNsYXZlaWQhPS0y IHNob3VsZCBoYXZlIHNsYXZlaWQ+MCIsZm9yd190YWJsZSk7Ci8qKioKCQlhcG9waWVyYSB4 ZWlyaXNtb3UgTlVMTCBzbGF2ZWlkLCBkaGwgaXNvZHluYW1vIElTRVhQV0lUSFNMQVZFSUQg a2FpIHNsYXZlaWQgSVMgTlVMTAoqKiovCgkJcmV0dXJuIC0zOwoJfQoJcGZyZWUoUGFyVGFi bGVOYW1lKTsKCXBmcmVlKHNsYXZlX3NpdGVpZGtleW5hbWUpOwoJcmV0dXJuIHJldDsKLyoK UFJPU09YSDoKVG8gc3dzdG8gZWluYWkgYXBsYSBzdG8gc2xhdmVfc2l0ZWlka2V5bmFtZSBu YSBmeWxhbWUgTU9OTyB0byBwYXJlbnQgdGFibGUsIGthaSBtZXRhCm1lIHF1ZXJ5IG5hIGJy aXNrb3VtZSB0byB0dXBsZSB0b3UgcGFyZW50IHRhYmxlLgoqLwp9CgppbnQgZ2V0T2xkQ29t cHV0ZWRTbGF2ZUlkKGNoYXIgKmNwVGFibGVOYW1lLEhlYXBUdXBsZSB0dXBsZSwgVHVwbGVE ZXNjIHR1cGxlRGVzYykgewpjaGFyICpzbGF2ZV9zaXRlaWRrZXluYW1lOwpjaGFyICpwYXRo OwpjaGFyICpmb3J3X3RhYmxlOwpjaGFyICpmb3J3X3RhYmxlX2lkOwpjaGFyICpwYXRoY29s OwpjaGFyICpwYXRoY29sdmFsOwpjaGFyICpxYjsKY2hhciAqcTsKSGVhcFR1cGxlIHJlc1R1 cGxlOwppbnQgcmV0OwpjaGFyICpydW47CmludCBhdHRudW07ClNQSVR1cGxlVGFibGUgKlNJ REtFWV90dXBUYWJsZTsKaW50IFNJREtFWV9wcm9jZXNzZWQ7CkhlYXBUdXBsZSBSZWFsUGFy X3R1cGxlOwpTUElUdXBsZVRhYmxlICpSZWFsUGFyX3R1cFRhYmxlOwpjaGFyICpQYXJUYWJs ZU5hbWU7CmNoYXIgKmZvbzsKaW50IHNsYXZlaWRfZD0tMzsKI2lmIGRlZmluZWQgREVCVUdf T1VUUFVUCiAgICAgICAgZWxvZyhOT1RJQ0UsICJpbiBnZXRPbGRDb21wdXRlZFNsYXZlSWQg b2YgJXMiLGNwVGFibGVOYW1lKTsKI2VuZGlmCglxYiA9ICJTRUxFQ1Qgc2l0ZWlka2V5bmFt ZSBmcm9tIGRibWlycm9yX2V4cGxpY2l0cmVwdGFibGVzIHdoZXJlIHRibG5hbWU9IjsKCXEg PSBwYWxsb2Moc3RybGVuKHFiKStzdHJsZW4oY3BUYWJsZU5hbWUpKzIrMSk7CglzcHJpbnRm KHEsIiVzJyVzJyIscWIsY3BUYWJsZU5hbWUpOwoJcmV0ID0gU1BJX2V4ZWMocSwxKTsKCXBm cmVlKHEpOwoJaWYgKHJldCAhPSBTUElfT0tfU0VMRUNUIHx8IFNQSV9wcm9jZXNzZWQgIT0g MSkgewoJCWVsb2coRVJST1IsIklTSU1QTEZPUldBUkQgVGFibGUgJXMgTk9UIElOIGRibWly cm9yX2V4cGxpY2l0cmVwdGFibGVzLiBIb3cgZGlkIHdlIGdldCBoZXJlPyBDT05UQUNUIElU IERFUFQgSU1NRURJQVRFTFkuIixjcFRhYmxlTmFtZSk7Cgl9CglTSURLRVlfdHVwVGFibGUg PSBTUElfdHVwdGFibGU7CglTSURLRVlfcHJvY2Vzc2VkID0gU1BJX3Byb2Nlc3NlZDsKCXJl c1R1cGxlID0gU0lES0VZX3R1cFRhYmxlLT52YWxzWzBdOwoJc2xhdmVfc2l0ZWlka2V5bmFt ZSA9IFNQSV9nZXR2YWx1ZShyZXNUdXBsZSxTSURLRVlfdHVwVGFibGUtPnR1cGRlc2MsMSk7 CglpZiAoc2xhdmVfc2l0ZWlka2V5bmFtZSA9PSBOVUxMKSAgewoJCXBmcmVlKHNsYXZlX3Np dGVpZGtleW5hbWUpOwoJCWVsb2coRVJST1IsIklTSU1QTEZPUldBUkQgVGFibGUgJXMgaGFz IE5VTEwgc2l0ZWlka2V5bmFtZSBpbiBkYm1pcnJvcl9leHBsaWNpdHJlcHRhYmxlcy4gSG93 IGRpZCB3ZSBnZXQgaGVyZT8gQ09OVEFDVCBJVCBERVBUIElNTUVESUFURUxZLiIsY3BUYWJs ZU5hbWUpOwoJfQoJaWYgKHN0cm5jbXAoc2xhdmVfc2l0ZWlka2V5bmFtZSwiX19fIiwzKSAh PSAwKSB7CgkJcGZyZWUoc2xhdmVfc2l0ZWlka2V5bmFtZSk7CgkJZWxvZyhFUlJPUiwiSVNJ TVBMRk9SV0FSRCBUYWJsZSAlcyBoYXMgc2l0ZWlka2V5bmFtZSBub3Qgc3RhcnRpbmcgd2l0 aCBcIl9fX1wiIGluIGRibWlycm9yX2V4cGxpY2l0cmVwdGFibGVzLiBIb3cgZGlkIHdlIGdl dCBoZXJlPyBDT05UQUNUIElUIERFUFQgSU1NRURJQVRFTFkuIixjcFRhYmxlTmFtZSk7Cgl9 Ci8vCWVsb2coTk9USUNFLCJzbGF2ZV9zaXRlaWRrZXluYW1lPS0lcy0iLHNsYXZlX3NpdGVp ZGtleW5hbWUpOwoJcGF0aCA9IHNsYXZlX3NpdGVpZGtleW5hbWUgKyAzOwovLwllbG9nKE5P VElDRSwicGF0aD0tJXMtIixwYXRoKTsKCXJ1biA9IGluZGV4KHBhdGgsJ18nKTsKCWlmIChy dW4gPT0gTlVMTCkgewoJCXBmcmVlKHNsYXZlX3NpdGVpZGtleW5hbWUpOwoJCWVsb2coRVJS T1IsIklTSU1QTEZPUldBUkQgVGFibGUgJXMgaGFzIG5vdCB0aGUgcmlnaHQgXCJfX19sb2Nh bGNvbF9mb3J3dGFibGVcIiBmb3JtYXQgc2l0ZWlka2V5bmFtZSAgaW4gZGJtaXJyb3JfZXhw bGljaXRyZXB0YWJsZXMuIEhvdyBkaWQgd2UgZ2V0IGhlcmU/IENPTlRBQ1QgSVQgREVQVCBJ TU1FRElBVEVMWS4iLGNwVGFibGVOYW1lKTsKCX0KCXBhdGhjb2wgPSBwYWxsb2MoTUFYQ09M X0xFTik7Ci8vCWVsb2coTk9USUNFLCJwYXRoPS0lZC0iLCh1bnNpZ25lZClwYXRoKTsKLy8J ZWxvZyhOT1RJQ0UsInJ1bj0tJWQtIiwodW5zaWduZWQpcnVuKTsKLy8JZWxvZyhOT1RJQ0Us InJ1bi1wYXRoPS0lZC0iLHJ1bi1wYXRoKTsKCSpydW4gPSAwOwoJc3RybmNweShwYXRoY29s LHBhdGgscnVuLXBhdGgrMSk7CgovLwllbG9nKE5PVElDRSwicGF0aGNvbD0tJXMtIixwYXRo Y29sKTsKCglmb3J3X3RhYmxlID0gcnVuKzE7CgoJYXR0bnVtID0gU1BJX2ZudW1iZXIodHVw bGVEZXNjLHBhdGhjb2wpOwoJaWYgKGF0dG51bSA9PSBTUElfRVJST1JfTk9BVFRSSUJVVEUp IHsKCQlwZnJlZShzbGF2ZV9zaXRlaWRrZXluYW1lKTsKCQllbG9nKEVSUk9SLCJXUk9ORyBw YXRoY29sPSVzIGdpdmVuIGZvciB0YWJsZSAlcyIsc2xhdmVfc2l0ZWlka2V5bmFtZSxjcFRh YmxlTmFtZSk7CgkJcmV0dXJuIDA7CiAgICAgICAgfQoJcGF0aGNvbHZhbD1TUElfZ2V0dmFs dWUodHVwbGUsdHVwbGVEZXNjLGF0dG51bSk7CgkKCS8qCglmb3J3X3RhYmxlIFBSSU1BUlkg S0VZIFBSRVBFSSBQQU5UQSBOQSBFSU5BSSAiaWQiCgkqLwoKCXJ1biA9IGluZGV4KGZvcndf dGFibGUsJ0AnKTsKCWlmIChydW4gPT0gTlVMTCkgewoJCWZvcndfdGFibGVfaWQgPSBwYWxs b2MoTUFYQ09MX0xFTik7CgkJc3RybmNweShmb3J3X3RhYmxlX2lkLCJpZCIsMyk7Cgl9Cgll bHNlIHsKCQlmb3J3X3RhYmxlX2lkID0gcGFsbG9jKE1BWENPTF9MRU4pOwoJCSpydW49MDsK CQlzdHJuY3B5KGZvcndfdGFibGVfaWQsZm9yd190YWJsZSxydW4tZm9yd190YWJsZSsxKTsK CQlmb3J3X3RhYmxlPXJ1bisxOwoJfQovKgpjb25zdWx0IDogaHR0cHM6Ly9kb2NzLmdvb2ds ZS5jb20vZG9jdW1lbnQvZC8xZ0VYb0Y1Um0tOWllWWdFdGdTVlFwUlBDdmVuNExvTUVVX3Rh TlhPRjZSYy9lZGl0P3VzcD1zaGFyaW5nCmFuIHBhcmVudCdzIG9wPT0nZCcgdG90ZSBzaWdv dXJhIHBhcmVudCdzIG9yaWdvcD09J3UnCiovCglxID0gcGFsbG9jKDUxMik7CglzcHJpbnRm KHEsIiBTRUxFQ1Qgc2xhdmVpZCBGUk9NIHB1YmxpYy5kYm1pcnJvcl9wZW5kaW5nIFdIRVJF IHRhYmxlbmFtZT0nXCJwdWJsaWNcIi5cIiVzXCInIEFORCBvcD0nZCcgQU5EIHhpZD0lZCBP UkRFUiBCWSBzZXFpZCBERVNDIExJTUlUIDEgIixmb3J3X3RhYmxlLEdldEN1cnJlbnRUcmFu c2FjdGlvbklkKCkpOwoJcmV0ID0gU1BJX2V4ZWMocSwxKTsKCWlmIChyZXQgPT0gU1BJX09L X1NFTEVDVCAmJiBTUElfcHJvY2Vzc2VkID09IDEpIHsKCQlSZWFsUGFyX3R1cFRhYmxlID0g U1BJX3R1cHRhYmxlOwoJCVJlYWxQYXJfdHVwbGUgPSBSZWFsUGFyX3R1cFRhYmxlLT52YWxz WzBdOwoJCWZvbyA9IFNQSV9nZXR2YWx1ZShSZWFsUGFyX3R1cGxlLFJlYWxQYXJfdHVwVGFi bGUtPnR1cGRlc2MsMSk7CgkJaWYgKGZvbyA9PSBOVUxMKSB7CgkJCXNsYXZlaWRfZCA9IC0z OwoJCX0KCQllbHNlIHsKCQkJc2xhdmVpZF9kID0gYXRvaShmb28pOwoJCQlwZnJlZShmb28p OwoJCX0KCQlwZnJlZShxKTsKCQlwZnJlZShwYXRoY29sdmFsKTsKCQlyZXR1cm4gc2xhdmVp ZF9kOwoJfQovKiBkaXJ0eSBwYXRjaCBjb2RlIHRvIGhhbmRsZSBjb3B5IHN1cHBseWNhc2Uu IGl0IHdhcyBzdXBwb3NlZCB0byBzb2x2ZSB0aGUgcHJvYmxlbSBvZiBub3QgdHVybmluZyAn dScgdG8gJ2knIGZvciBlLmcgc3VwcGx5Y2FzZXNxdW90ZXMgKi8gCi8qIGJ1dCBpdCBkb2Vz bnQgd29yayBmb3IgZmJfICwgYXMgaXQgdHVybnMgJ2knIHRvICd1JyBhcyBwZXIgOiBkYm1p cnJvciBpc3N1ZXMgd2hlbiBjaGFuZ2luZyB2c2xpZCAobnVsbC0+aW50LCBpbnQtPm51bGws IGludFgtPmludFkpICovIAovKiBmb2xsb3dpbmcgY29kZSBtdXN0IGJlIGhlcmUgKG5vdCBj b21tZW5kZWQpIGFzIG9mIDIwMTgtMTItMjAgKi8KLyogdGhlIGFpbSBpcyBtYWtlIGV2ZXJ5 dGhpbmcgd29yayBjb3JyZWN0bHksIHN1cHBsaWVzICsgZmJfICsgYWxsIHR5cGUgSVNJTVBM Rk9SV0FSRCAoLTIpIHRhYmxlcyAqLwovKgoKCXEgPSBwYWxsb2MoNTEyKTsKCXNwcmludGYo cSwiIFNFTEVDVCBzbGF2ZWlkIEZST00gcHVibGljLmRibWlycm9yX3BlbmRpbmcgV0hFUkUg dGFibGVuYW1lPSclcycgQU5EIG9wPSdpJyBBTkQgeGlkPSVkIE9SREVSIEJZIHNlcWlkIERF U0MgTElNSVQgMSAiLGNwVGFibGVOYW1lLEdldEN1cnJlbnRUcmFuc2FjdGlvbklkKCkpOwoJ cmV0ID0gU1BJX2V4ZWMocSwxKTsKCWlmIChyZXQgPT0gU1BJX09LX1NFTEVDVCAmJiBTUElf cHJvY2Vzc2VkID09IDEpIHsKCQlSZWFsUGFyX3R1cFRhYmxlID0gU1BJX3R1cHRhYmxlOwoJ CVJlYWxQYXJfdHVwbGUgPSBSZWFsUGFyX3R1cFRhYmxlLT52YWxzWzBdOwoJCWZvbyA9IFNQ SV9nZXR2YWx1ZShSZWFsUGFyX3R1cGxlLFJlYWxQYXJfdHVwVGFibGUtPnR1cGRlc2MsMSk7 CgkJaWYgKGZvbyA9PSBOVUxMKSB7CgkJCXNsYXZlaWRfZCA9IC0zOwoJCX0KCQllbHNlIHsK CQkJc2xhdmVpZF9kID0gYXRvaShmb28pOwoJCQlwZnJlZShmb28pOwoJCX0KCQlwZnJlZShx KTsKCQlwZnJlZShwYXRoY29sdmFsKTsKCQlyZXR1cm4gc2xhdmVpZF9kOwoJfQoqLwoKLyoq CnBscyBjb25zdWx0IDogaHR0cHM6Ly9kb2NzLmdvb2dsZS5jb20vZG9jdW1lbnQvZC8xZ0VY b0Y1Um0tOWllWWdFdGdTVlFwUlBDdmVuNExvTUVVX3RhTlhPRjZSYy9lZGl0P3VzcD1zaGFy aW5nCgppZiAocGFyZW50IG9wPT0naScgYW5kIG9yaWdvcCA8PiAnaScgZXhpc3QpIC1wb3Ug c2ltYWluZWkgb3RpIG9yaWdvcD0ndScga2FpIChlaXRlIHNsYXZlaWQgTlVMTCAtPiBOT1Qg TlVMTCBlaXRlIFggLT4gWSwgWCE9WSkgLSB3ZSBjb25zaWRlciB0aGlzIGFzIGFuIGluc2Vy dCBhbmQgcmV0dXJuIC0zIGluIG9yZGVyIHRvIGNvbW11bmljYXRlIHRoaXMgdG8gaGFuZGxl cigpLgpOT1RFLCB0aGlzIG1lYW5zIHRoYXQgaXQgaXMgSUxMRUdBTCBmb3IgdGhlIGFwcCB0 byBkbyBVUERBVEUgb24gdGhlIHBhcmVudCwgdGhlbiB1cGRhdGUgb24gdGhlIGtpZCwgYW5k IHRoZW4gcGVyZm9ybSBhIHNlY29uZCBVUERBVEUgb24gdGhlIGtpZCwgdGhpcyB3aWxsIHJl c3VsdCBpbiBUV08gaW5zZXJ0cyBhbmQgcHJvZHVjZSBhbiBkdXBsaWNhdGUgRVJST1IuCmVs c2UgLSBkaWxhZGkgb3JpZ29wID09ICdpJyBvciBubyBwYXJlbnQgb3A9PSdpJyBleGlzdHMg LSBwb3Ugc2ltYWluZWkgOiAoCmVpdGUgcGFyZW50IG9yaWdvcCA9PSAnaScgKHN5bmVwYWdl dGFpIG90aSBwYXJlbnQgb3AgPT0gJ2knKSAKZWl0ZSBwYXJlbnQgb3AgIT0gJ2knIDogKHN5 bmVwYWdldGFpIDogCgllaXRlIHBhcmVudCBvcCA9PSAnZCcgb3BvdGUgZGVuIHRoYSBmdGFz ZWkgZWRvIG8ga3dkaWthcywgbG9ndyB0b3UgMW91IHN0YXRlbWVudCBwaW8gcGFubwoJZWl0 ZSBwYXJlbnQgb3AgPT0gJ3UnIChjYXNlIE5PVCBOVUxMIChYKSAtPiBOT1QgTlVMTCAoWSkg bWUgWD09WSApCikKKQogdGhlbiB3ZSBsZXQgdGhlIGNvZGUgZmFsbGJhY2sgdG8gcmV0dXJu IGdldENvbXB1dGVkU2xhdmVJZChjcFRhYmxlTmFtZSx0dXBsZSx0dXBsZURlc2MpIHdoaWNo IHdpbGwgcmV0dXJuIGZvcndfc2xhdmVpZCAuCioqLwoJcSA9IHBhbGxvYyg1MTIpOwoJc3By aW50ZihxLCIgU0VMRUNUIHNsYXZlaWQgRlJPTSBwdWJsaWMuZGJtaXJyb3JfcGVuZGluZyBX SEVSRSB0YWJsZW5hbWU9J1wicHVibGljXCIuXCIlc1wiJyBBTkQgb3A9J2knIEFORCBvcmln b3AgPD4gJ2knIEFORCB4aWQ9JWQgT1JERVIgQlkgc2VxaWQgREVTQyBMSU1JVCAxICIsZm9y d190YWJsZSxHZXRDdXJyZW50VHJhbnNhY3Rpb25JZCgpKTsKCXJldCA9IFNQSV9leGVjKHEs MSk7CglpZiAocmV0ID09IFNQSV9PS19TRUxFQ1QgJiYgU1BJX3Byb2Nlc3NlZCA9PSAxKSB7 CgkJcGZyZWUoc2xhdmVfc2l0ZWlka2V5bmFtZSk7CgkJcGZyZWUocGF0aGNvbHZhbCk7CgkJ cmV0dXJuIC0zOwoJfQoKCXBmcmVlKHNsYXZlX3NpdGVpZGtleW5hbWUpOwoJcGZyZWUocGF0 aGNvbHZhbCk7CglyZXR1cm4gZ2V0Q29tcHV0ZWRTbGF2ZUlkKGNwVGFibGVOYW1lLHR1cGxl LHR1cGxlRGVzYykgOyAvKiBJU0EgJ3UnICovCgovKgoqIFBST1lQT1RIRVRPVU1FIE9USSBP IEFNRVNPUyBCQUJBUyBleGVpIGVudHJ5IHN0byBkYm1pcnJvcl9wZW5kaW5nIG1lIHRvIGlk aW8geGlkIGthaSBvcD0nZCcKKi8KfQoKLyoKY2hhciBnZXRGb3J3YXJkUGFyZW50T3JpZ09w KGNoYXIgKmNwVGFibGVOYW1lLEhlYXBUdXBsZSB0dXBsZSwgVHVwbGVEZXNjIHR1cGxlRGVz YykgewpjaGFyICpzbGF2ZV9zaXRlaWRrZXluYW1lOwpjaGFyICpwYXRoOwpjaGFyICpmb3J3 X3RhYmxlOwpjaGFyICpmb3J3X3RhYmxlX2lkOwpjaGFyICpwYXRoY29sOwpjaGFyICpwYXRo Y29sdmFsOwpjaGFyICpxYjsKY2hhciAqcTsKSGVhcFR1cGxlIHJlc1R1cGxlOwppbnQgcmV0 OwpjaGFyICpydW47CmludCBhdHRudW07ClNQSVR1cGxlVGFibGUgKlNJREtFWV90dXBUYWJs ZTsKaW50IFNJREtFWV9wcm9jZXNzZWQ7CkhlYXBUdXBsZSBSZWFsUGFyX3R1cGxlOwpTUElU dXBsZVRhYmxlICpSZWFsUGFyX3R1cFRhYmxlOwpjaGFyICpQYXJUYWJsZU5hbWU7CmNoYXIg KmZvbzsKaW50IHNsYXZlaWRfZD0tMzsKY2hhciBvcmlnb3A7CiNpZiBkZWZpbmVkIERFQlVH X09VVFBVVAogICAgICAgIGVsb2coTk9USUNFLCAiaW4gZ2V0Rm9yd2FyZFBhcmVudE9yaWdP cCBvZiAlcyIsY3BUYWJsZU5hbWUpOwojZW5kaWYKCXFiID0gIlNFTEVDVCBzaXRlaWRrZXlu YW1lIGZyb20gZGJtaXJyb3JfZXhwbGljaXRyZXB0YWJsZXMgd2hlcmUgdGJsbmFtZT0iOwoJ cSA9IHBhbGxvYyhzdHJsZW4ocWIpK3N0cmxlbihjcFRhYmxlTmFtZSkrMisxKTsKCXNwcmlu dGYocSwiJXMnJXMnIixxYixjcFRhYmxlTmFtZSk7CglyZXQgPSBTUElfZXhlYyhxLDEpOwoJ cGZyZWUocSk7CglpZiAocmV0ICE9IFNQSV9PS19TRUxFQ1QgfHwgU1BJX3Byb2Nlc3NlZCAh PSAxKSB7CgkJZWxvZyhFUlJPUiwiSVNJTVBMRk9SV0FSRCBUYWJsZSAlcyBOT1QgSU4gZGJt aXJyb3JfZXhwbGljaXRyZXB0YWJsZXMuIEhvdyBkaWQgd2UgZ2V0IGhlcmU/IENPTlRBQ1Qg SVQgREVQVCBJTU1FRElBVEVMWS4iLGNwVGFibGVOYW1lKTsKCX0KCVNJREtFWV90dXBUYWJs ZSA9IFNQSV90dXB0YWJsZTsKCVNJREtFWV9wcm9jZXNzZWQgPSBTUElfcHJvY2Vzc2VkOwoJ cmVzVHVwbGUgPSBTSURLRVlfdHVwVGFibGUtPnZhbHNbMF07CglzbGF2ZV9zaXRlaWRrZXlu YW1lID0gU1BJX2dldHZhbHVlKHJlc1R1cGxlLFNJREtFWV90dXBUYWJsZS0+dHVwZGVzYywx KTsKCWlmIChzbGF2ZV9zaXRlaWRrZXluYW1lID09IE5VTEwpICB7CgkJcGZyZWUoc2xhdmVf c2l0ZWlka2V5bmFtZSk7CgkJZWxvZyhFUlJPUiwiSVNJTVBMRk9SV0FSRCBUYWJsZSAlcyBo YXMgTlVMTCBzaXRlaWRrZXluYW1lIGluIGRibWlycm9yX2V4cGxpY2l0cmVwdGFibGVzLiBI b3cgZGlkIHdlIGdldCBoZXJlPyBDT05UQUNUIElUIERFUFQgSU1NRURJQVRFTFkuIixjcFRh YmxlTmFtZSk7Cgl9CglpZiAoc3RybmNtcChzbGF2ZV9zaXRlaWRrZXluYW1lLCJfX18iLDMp ICE9IDApIHsKCQlwZnJlZShzbGF2ZV9zaXRlaWRrZXluYW1lKTsKCQllbG9nKEVSUk9SLCJJ U0lNUExGT1JXQVJEIFRhYmxlICVzIGhhcyBzaXRlaWRrZXluYW1lIG5vdCBzdGFydGluZyB3 aXRoIFwiX19fXCIgaW4gZGJtaXJyb3JfZXhwbGljaXRyZXB0YWJsZXMuIEhvdyBkaWQgd2Ug Z2V0IGhlcmU/IENPTlRBQ1QgSVQgREVQVCBJTU1FRElBVEVMWS4iLGNwVGFibGVOYW1lKTsK CX0KLy8JZWxvZyhOT1RJQ0UsInNsYXZlX3NpdGVpZGtleW5hbWU9LSVzLSIsc2xhdmVfc2l0 ZWlka2V5bmFtZSk7CglwYXRoID0gc2xhdmVfc2l0ZWlka2V5bmFtZSArIDM7Ci8vCWVsb2co Tk9USUNFLCJwYXRoPS0lcy0iLHBhdGgpOwoJcnVuID0gaW5kZXgocGF0aCwnXycpOwoJaWYg KHJ1biA9PSBOVUxMKSB7CgkJcGZyZWUoc2xhdmVfc2l0ZWlka2V5bmFtZSk7CgkJZWxvZyhF UlJPUiwiSVNJTVBMRk9SV0FSRCBUYWJsZSAlcyBoYXMgbm90IHRoZSByaWdodCBcIl9fX2xv Y2FsY29sX2Zvcnd0YWJsZVwiIGZvcm1hdCBzaXRlaWRrZXluYW1lICBpbiBkYm1pcnJvcl9l eHBsaWNpdHJlcHRhYmxlcy4gSG93IGRpZCB3ZSBnZXQgaGVyZT8gQ09OVEFDVCBJVCBERVBU IElNTUVESUFURUxZLiIsY3BUYWJsZU5hbWUpOwoJfQoJcGF0aGNvbCA9IHBhbGxvYyhNQVhD T0xfTEVOKTsKLy8JZWxvZyhOT1RJQ0UsInBhdGg9LSVkLSIsKHVuc2lnbmVkKXBhdGgpOwov LwllbG9nKE5PVElDRSwicnVuPS0lZC0iLCh1bnNpZ25lZClydW4pOwovLwllbG9nKE5PVElD RSwicnVuLXBhdGg9LSVkLSIscnVuLXBhdGgpOwoJKnJ1biA9IDA7CglzdHJuY3B5KHBhdGhj b2wscGF0aCxydW4tcGF0aCsxKTsKCi8vCWVsb2coTk9USUNFLCJwYXRoY29sPS0lcy0iLHBh dGhjb2wpOwoKCWZvcndfdGFibGUgPSBydW4rMTsKCglhdHRudW0gPSBTUElfZm51bWJlcih0 dXBsZURlc2MscGF0aGNvbCk7CglpZiAoYXR0bnVtID09IFNQSV9FUlJPUl9OT0FUVFJJQlVU RSkgewoJCXBmcmVlKHNsYXZlX3NpdGVpZGtleW5hbWUpOwoJCWVsb2coRVJST1IsIldST05H IHBhdGhjb2w9JXMgZ2l2ZW4gZm9yIHRhYmxlICVzIixzbGF2ZV9zaXRlaWRrZXluYW1lLGNw VGFibGVOYW1lKTsKCQlyZXR1cm4gMDsKICAgICAgICB9CglwYXRoY29sdmFsPVNQSV9nZXR2 YWx1ZSh0dXBsZSx0dXBsZURlc2MsYXR0bnVtKTsKKi8JCgkvKgoJZm9yd190YWJsZSBQUklN QVJZIEtFWSBQUkVQRUkgUEFOVEEgTkEgRUlOQUkgImlkIgoJKi8KLyoKCglydW4gPSBpbmRl eChmb3J3X3RhYmxlLCdAJyk7CglpZiAocnVuID09IE5VTEwpIHsKCQlmb3J3X3RhYmxlX2lk ID0gcGFsbG9jKE1BWENPTF9MRU4pOwoJCXN0cm5jcHkoZm9yd190YWJsZV9pZCwiaWQiLDMp OwoJfQoJZWxzZSB7CgkJZm9yd190YWJsZV9pZCA9IHBhbGxvYyhNQVhDT0xfTEVOKTsKCQkq cnVuPTA7CgkJc3RybmNweShmb3J3X3RhYmxlX2lkLGZvcndfdGFibGUscnVuLWZvcndfdGFi bGUrMSk7CgkJZm9yd190YWJsZT1ydW4rMTsKCX0KCglxID0gcGFsbG9jKDUxMik7CglzcHJp bnRmKHEsIiBTRUxFQ1Qgb3JpZ29wIEZST00gcHVibGljLmRibWlycm9yX3BlbmRpbmcgV0hF UkUgdGFibGVuYW1lPSdcInB1YmxpY1wiLlwiJXNcIicgQU5EIHhpZD0lZCBPUkRFUiBCWSBz ZXFpZCBERVNDIExJTUlUIDEgIixmb3J3X3RhYmxlLEdldEN1cnJlbnRUcmFuc2FjdGlvbklk KCkpOwoJcmV0ID0gU1BJX2V4ZWMocSwxKTsKCWlmIChyZXQgPT0gU1BJX09LX1NFTEVDVCAm JiBTUElfcHJvY2Vzc2VkID09IDEpIHsKCQlSZWFsUGFyX3R1cFRhYmxlID0gU1BJX3R1cHRh YmxlOwoJCVJlYWxQYXJfdHVwbGUgPSBSZWFsUGFyX3R1cFRhYmxlLT52YWxzWzBdOwoJCWZv byA9IFNQSV9nZXR2YWx1ZShSZWFsUGFyX3R1cGxlLFJlYWxQYXJfdHVwVGFibGUtPnR1cGRl c2MsMSk7CgkJaWYgKGZvbyA9PSBOVUxMKSB7CgkJCXBmcmVlKHEpOwoJCQlwZnJlZShwYXRo Y29sdmFsKTsKCQkJZWxvZyhFUlJPUiwiV1JPTkcgZm9yd2FyZCBwYXJlbnQgdGFibGUgJXMg aGFzIG51bGwgb3JpZ29wIGluIHRoaXMgdHJhbnNhY3Rpb24iLGZvcndfdGFibGUpOwoJCX0K CQllbHNlIHsKCQkJb3JpZ29wID0gZm9vWzBdOwoJCQlwZnJlZShmb28pOwoJCX0KCQlwZnJl ZShxKTsKCQlwZnJlZShwYXRoY29sdmFsKTsKCQlyZXR1cm4gb3JpZ29wOwoJfQoJcmV0dXJu ICcgJzsKfQoqLwoKI2RlZmluZSBNQVhfV0hFUkVfQ0xBVVNFCTUxMgojZGVmaW5lIE1BWF9R VUVSWV9MRU4JNTEyCmludCBoYW5kbGVQYXJlbnRzKGNoYXIgKmNwVGFibGVOYW1lLEhlYXBU dXBsZSBCdHVwbGUsSGVhcFR1cGxlIEF0dXBsZSwgVHVwbGVEZXNjIHR1cGxlRGVzYyxPaWQg dGFibGVPaWQsaW50IHNsYXZlaWQpIHsKCWNoYXIgKnFiOwoJY2hhciAqcTsKCWJvb2wgaXNO dWxsOwoJaW50IHJldDsKCWludCBpOwoJSGVhcFR1cGxlIHJlc1R1cGxlOwoJRGF0dW0gcmVz RGF0dW07CglPaWQgY29uZnJlbGlkOwoJY2hhciAqY29uZnJlbG5hbWU7CglpbnQxNgkqdGhp c0NvbHM7CglpbnQxNgkqZmtDb2xzOwoJaW50MTYJKnJ1bjsKCUFycmF5VHlwZSAqYXJyOwoJ Y2hhcglBdGhpc0NvbHNWYWxzW01BWEtDT0xTXVtNQVhDT0xfTEVOXTsKCWNoYXIJZmtDb2xz TmFtZXNbTUFYS0NPTFNdW01BWENPTF9MRU5dOwoJY2hhcgl0aGlzQ29sc1R5cGVzW01BWEtD T0xTXVsxMDBdOwoJc2hvcnQJbnVtT2ZDb2xzOwoJU1BJVHVwbGVUYWJsZSAqRktfdHVwVGFi bGU7CglpbnQJRktfcHJvY2Vzc2VkOwoKI2lmIGRlZmluZWQgREVCVUdfT1VUUFVUCgllbG9n KE5PVElDRSwgImluIGhhbmRsZVBhcmVudHMgb2YgVGFibGU9JWQiLHRhYmxlT2lkKTsKI2Vu ZGlmCgoJcWIgPSAiU0VMRUNUIGMuY29uZnJlbGlkLGMuY29ua2V5LGMuY29uZmtleSxmLnJl bG5hbWUgRlJPTSBwZ19jYXRhbG9nLnBnX2NvbnN0cmFpbnQgYyxwZ19jYXRhbG9nLnBnX2Ns YXNzIGYgV0hFUkUgYy5jb250eXBlID0gJ2YnIEFORCBjLmNvbmZyZWxpZCA9IGYub2lkIEFO RCBjLmNvbnJlbGlkID0gIjsKCXEgPSBwYWxsb2Moc3RybGVuKHFiKStNQVhfT0lEX0xFTisx KTsKCXNwcmludGYocSwiJXMlZCIscWIsdGFibGVPaWQpOwoJcmV0ID0gU1BJX2V4ZWMocSww KTsKCXBmcmVlKHEpOwoJaWYgKHJldCAhPSBTUElfT0tfU0VMRUNUIHx8IFNQSV9wcm9jZXNz ZWQgPCAwKSB7IAoJCWVsb2coTk9USUNFLCAibm8gRktzIik7CgkJcmV0dXJuIDA7Cgl9Cgkv KgoJRm9yIGV2ZXJ5IEZLIGRlcGVuZGVuY3kgd2UgdHJhY2sgYW5kIGhhbmRsZSB0aGUgcGFy ZW50IHRhYmxlCgkqLwoJRktfdHVwVGFibGUgPSBTUElfdHVwdGFibGU7CglGS19wcm9jZXNz ZWQgPSBTUElfcHJvY2Vzc2VkOwoKCWZvciAoaT0wO2k8RktfcHJvY2Vzc2VkO2krKykgewoJ CWNoYXIgKldIRVJFOwoJCWNoYXIgKlBhclRhYmxlTmFtZTsKCQlpbnQgajsKCQljaGFyIEZr SGFzTnVsbFZhbHVlT1JYY2x1ZGVkPTA7CgkJY2hhciBoYW5kbGVpdD0wOwoKCQlTUElUdXBs ZVRhYmxlICpSZWFsUGFyX3R1cFRhYmxlOwoJCWludCAgICAgUmVhbFBhcl9wcm9jZXNzZWQ7 CgkJSGVhcFR1cGxlIFJlYWxQYXJfdHVwbGU7CgkJaW50IGNvbHJ1bjsKCQlTUElUdXBsZVRh YmxlICp0aGlzYXR0X3R1cFRhYmxlOwoJCWludCAgICAgdGhpc2F0dF9wcm9jZXNzZWQ7CgkJ SGVhcFR1cGxlIHRoaXNhdHRfdHVwbGU7CgoJCXJlc1R1cGxlID0gRktfdHVwVGFibGUtPnZh bHNbaV07CgoKCQlyZXNEYXR1bSA9IFNQSV9nZXRiaW52YWwocmVzVHVwbGUsRktfdHVwVGFi bGUtPnR1cGRlc2MsMSwmaXNOdWxsKTsKCQljb25mcmVsaWQgPSAoT2lkKSBEYXR1bUdldE9i amVjdElkKHJlc0RhdHVtKTsKCgkJcmVzRGF0dW0gPSBTUElfZ2V0YmludmFsKHJlc1R1cGxl LEZLX3R1cFRhYmxlLT50dXBkZXNjLDIsJmlzTnVsbCk7CgkJYXJyID0gKEFycmF5VHlwZSAq KSBEYXR1bUdldFBvaW50ZXIoUEdfREVUT0FTVF9EQVRVTShyZXNEYXR1bSkpOwoJCXRoaXND b2xzID0gKGludDE2ICopQVJSX0RBVEFfUFRSKGFycik7CgkJbnVtT2ZDb2xzPUFSUl9ESU1T KGFycilbMF07CiNpZiBkZWZpbmVkIERFQlVHX09VVFBVVAoJCWludCBESU1fMCA9IEFSUl9E SU1TKGFycilbMF07CgkJaW50IExCT1VORF8wID0gQVJSX0xCT1VORChhcnIpWzBdOwovLwkJ cmVzRGF0dW0gPSBTUElfZ2V0YmludmFsKHJlc1R1cGxlLEZLX3R1cFRhYmxlLT50dXBkZXNj LDQsJmlzTnVsbCk7Ci8vCQljb25mcmVsbmFtZSA9IChjaGFyICopIERhdHVtR2V0TmFtZShy ZXNEYXR1bSk7Ci8vCQllbG9nKE5PVElDRSwgImluIGhhbmRsZVBhcmVudHMgb2YgVGFibGU9 JWQsIElOIGZldGNoaW5nIEZLIGZvciB0YWJsZT0lcywgRElNPSV1LCBMQk9VTkQ9JXUiLHRh YmxlT2lkLGNvbmZyZWxuYW1lLERJTV8wLExCT1VORF8wKTsKI2VuZGlmCgkJZm9yIChydW49 dGhpc0NvbHMsY29scnVuPTA7Y29scnVuPG51bU9mQ29scztydW4rKyxjb2xydW4rKykgIHsK CQkJaW50IHRoaXNjb2xydW47CiNpZiBkZWZpbmVkIERFQlVHX09VVFBVVAojZW5kaWYKCQkJ Y2hhciAqZm9vbmFtZTsKCgkJCXEgPSBwYWxsb2MoNTEyKTsKCQkJc3ByaW50ZihxLCJTRUxF Q1QgYXR0bmFtZSBGUk9NIHBnX2F0dHJpYnV0ZSBXSEVSRSBhdHRyZWxpZD0lZCBhbmQgYXR0 bnVtPSVkIix0YWJsZU9pZCwqcnVuKTsKCQkJcmV0ID0gU1BJX2V4ZWMocSwxKTsKCQkJaWYg KHJldCAhPSBTUElfT0tfU0VMRUNUIHx8IFNQSV9wcm9jZXNzZWQgIT0gMSkgewoJCSAgICAg ICAgICAgICAgICBlbG9nKEVSUk9SLCAiRmF0YWwgZXJyb3I6IGhhbmRsZVBhcmVudHM6IHRo aXMgdGFibGUgb2lkPSVkIHNob3VsZCBoYXZlIGF0dHJpYnV0ZSB3aXRoIGF0dG51bT0lZCIs dGFibGVPaWQsKnJ1bik7CgkJCQlyZXR1cm4gLTI7CgkJCX0KCQkJcGZyZWUocSk7CgkJCXRo aXNhdHRfcHJvY2Vzc2VkID0gU1BJX3Byb2Nlc3NlZDsKCQkJdGhpc2F0dF90dXBUYWJsZSA9 IFNQSV90dXB0YWJsZTsKCQkJdGhpc2F0dF90dXBsZSA9IHRoaXNhdHRfdHVwVGFibGUtPnZh bHNbMF07CgkJCWZvb25hbWUgPSBTUElfZ2V0dmFsdWUodGhpc2F0dF90dXBsZSx0aGlzYXR0 X3R1cFRhYmxlLT50dXBkZXNjLDEpOwoJCQljaGFyICp2YWx1ZSA9IFNQSV9nZXR2YWx1ZShB dHVwbGUsdHVwbGVEZXNjLHRoaXNjb2xydW49U1BJX2ZudW1iZXIodHVwbGVEZXNjLGZvb25h bWUpKTsKCQkJY2hhciAqY29sdHlwZSA9IFNQSV9nZXR0eXBlKHR1cGxlRGVzYyx0aGlzY29s cnVuPVNQSV9mbnVtYmVyKHR1cGxlRGVzYyxmb29uYW1lKSk7CgoJCQkKCiNpZiBkZWZpbmVk IERFQlVHX09VVFBVVAoJCQllbG9nKE5PVElDRSwiRm91bmQgY29sbmFtZT0lcyBzeXNjb2w9 JWQgdGhpc2NvbD0lZCB3aXRoIEFmdGVyIHZhbHVlPSVzIixmb29uYW1lLCpydW4sdGhpc2Nv bHJ1bix2YWx1ZSk7CiNlbmRpZgoJCQlpZiAodmFsdWUgPT0gTlVMTCB8fCBpc0V4Y2x1ZGVk KGNwVGFibGVOYW1lLHR1cGxlRGVzYyx0aGlzY29scnVuKSkgIHsKCQkJCUZrSGFzTnVsbFZh bHVlT1JYY2x1ZGVkPTE7CgkJCQlicmVhazsKCQkJfQoJCQltZW1jcHkoJihBdGhpc0NvbHNW YWxzW2NvbHJ1bl1bMF0pLHZhbHVlLHN0cmxlbih2YWx1ZSkrMSk7CgkJCW1lbWNweSgmKHRo aXNDb2xzVHlwZXNbY29scnVuXVswXSksY29sdHlwZSxzdHJsZW4oY29sdHlwZSkrMSk7CgkJ CQoJCQlpZiAoQnR1cGxlICE9IE5VTEwpIHsKCQkJCWNoYXIgKkJ2YWx1ZSA9IFNQSV9nZXR2 YWx1ZShCdHVwbGUsdHVwbGVEZXNjLHRoaXNjb2xydW4pOwojaWYgZGVmaW5lZCBERUJVR19P VVRQVVQKCQkJCWVsb2coTk9USUNFLCJGb3VuZCBjb2xuYW1lPSVzIHN5c2NvbD0lZCB0aGlz Y29sPSVkIHdpdGggQWZ0ZXIgdmFsdWU9JXMsQmVmb3JlIHZhbHVlPSVzIixmb29uYW1lLCpy dW4sdGhpc2NvbHJ1bix2YWx1ZSxCdmFsdWUpOwojZW5kaWYKCQkJCWlmIChCdmFsdWUgPT0g TlVMTCkgaGFuZGxlaXQ9MTsKCQkJCWVsc2UgaWYgKHN0cmNtcChCdmFsdWUsdmFsdWUpKSB7 CgkJCQkJaGFuZGxlaXQ9MTsKCQkJCQlwZnJlZShCdmFsdWUpOwoJCQkJfQoKCQkJfQoJCQll bHNlIGhhbmRsZWl0PTE7CgkJCXBmcmVlKHZhbHVlKTsKCQl9CiNpZiBkZWZpbmVkIERFQlVH X09VVFBVVAoJCWVsb2coTk9USUNFLCJpbiBoYW5kbGVQYXJlbnRzLS0+IEVORCBPRiBBVFRS IExPT1AiKTsKCQllbG9nKE5PVElDRSwiaGFuZGxlIGl0ID0gJWQsICIsaGFuZGxlaXQpOwoJ CWVsb2coTk9USUNFLCJGa0hhc051bGxWYWx1ZU9SWGNsdWRlZCAgPSAlZCwgIixGa0hhc051 bGxWYWx1ZU9SWGNsdWRlZCk7CiNlbmRpZgoJCWlmIChGa0hhc051bGxWYWx1ZU9SWGNsdWRl ZCB8fCAhaGFuZGxlaXQpIGNvbnRpbnVlOwoJCXJlc0RhdHVtID0gU1BJX2dldGJpbnZhbChy ZXNUdXBsZSxGS190dXBUYWJsZS0+dHVwZGVzYywzLCZpc051bGwpOwoJCWFyciA9IChBcnJh eVR5cGUgKikgRGF0dW1HZXRQb2ludGVyKFBHX0RFVE9BU1RfREFUVU0ocmVzRGF0dW0pKTsK CQlma0NvbHMgPSAoaW50MTYgKilBUlJfREFUQV9QVFIoYXJyKTsKCQlmb3IgKHJ1bj1ma0Nv bHMsY29scnVuPTA7Y29scnVuPG51bU9mQ29scztydW4rKyxjb2xydW4rKykgewoJCQlTUElU dXBsZVRhYmxlICpQQVJfdHVwVGFibGU7CgkJCWludCAgICAgUEFSX3Byb2Nlc3NlZDsKCQkJ SGVhcFR1cGxlIFBBUl9yZXNUdXBsZTsKCQkJY2hhciAqdmFsdWU7CgkJCXEgPSBwYWxsb2Mo c3RybGVuKCJTRUxFQ1QgYXR0bmFtZSBmcm9tIHBnX2F0dHJpYnV0ZSB3aGVyZSBhdHRyZWxp ZD0gYW5kIGF0dG51bT0iKSsyKihNQVhfT0lEX0xFTisxKSk7CgkJCXNwcmludGYocSwiU0VM RUNUIGF0dG5hbWUgZnJvbSBwZ19hdHRyaWJ1dGUgd2hlcmUgYXR0cmVsaWQ9JWQgYW5kIGF0 dG51bT0lZCIsY29uZnJlbGlkLCpydW4pOwoJCQlyZXQgPSBTUElfZXhlYyhxLDEpOwoJCQlp ZiAocmV0ICE9IFNQSV9PS19TRUxFQ1QgfHwgU1BJX3Byb2Nlc3NlZCAhPSAxKSB7CgkJCQll bG9nKEVSUk9SLCAiRmF0YWwgRXJyb3I6bm8gUEsgZm9yIEZLIHJlbGF0aW9uIik7CgkJCQly ZXR1cm4gLTI7CgkJCX0KCQkJcGZyZWUocSk7CgkJCVBBUl90dXBUYWJsZSA9IFNQSV90dXB0 YWJsZTsKCQkJUEFSX3Byb2Nlc3NlZCA9IFNQSV9wcm9jZXNzZWQ7CgkJCVBBUl9yZXNUdXBs ZSA9IFBBUl90dXBUYWJsZS0+dmFsc1swXTsKCQkJdmFsdWUgPSBTUElfZ2V0dmFsdWUoUEFS X3Jlc1R1cGxlLFBBUl90dXBUYWJsZS0+dHVwZGVzYywxKTsKCQkJbWVtY3B5KCYoZmtDb2xz TmFtZXNbY29scnVuXVswXSksdmFsdWUsc3RybGVuKHZhbHVlKSsxKTsKCQkJcGZyZWUodmFs dWUpOwoKCQl9CgkJCgkJcmVzRGF0dW0gPSBTUElfZ2V0YmludmFsKHJlc1R1cGxlLEZLX3R1 cFRhYmxlLT50dXBkZXNjLDQsJmlzTnVsbCk7CgkJY29uZnJlbG5hbWUgPSAoY2hhciAqKSBE YXR1bUdldE5hbWUocmVzRGF0dW0pOwoJLyoKCVRoZXJlIG11c3QgYmUgYXQgbGVhc3QgMSBj b2x1bW4gaW4gY29tcG91bmQgRkshIQoJKi8KCQlXSEVSRSA9IHBhbGxvYyhNQVhfV0hFUkVf Q0xBVVNFKTsKCQlpZiAoIXN0cm5jbXAodGhpc0NvbHNUeXBlc1swXSwiaW50IiwzKSkKCQkJ c3ByaW50ZihXSEVSRSwiXCIlc1wiPSVzIixma0NvbHNOYW1lc1swXSxBdGhpc0NvbHNWYWxz WzBdKTsKCQllbHNlCgkJCXNwcmludGYoV0hFUkUsIlwiJXNcIj0nJXMnIixma0NvbHNOYW1l c1swXSxBdGhpc0NvbHNWYWxzWzBdKTsKCQlmb3IgKGo9MTtqPG51bU9mQ29scztqKyspIHsK CQkJaWYgKCFzdHJuY21wKHRoaXNDb2xzVHlwZXNbal0sImludCIsMykpCgkJCQlzcHJpbnRm KFdIRVJFLCIlcyBBTkQgXCIlc1wiPSVzIixXSEVSRSxma0NvbHNOYW1lc1tqXSxBdGhpc0Nv bHNWYWxzW2pdKTsKCQkJZWxzZQoJCQkJc3ByaW50ZihXSEVSRSwiJXMgQU5EIFwiJXNcIj0n JXMnIixXSEVSRSxma0NvbHNOYW1lc1tqXSxBdGhpc0NvbHNWYWxzW2pdKTsKCQl9CgoJCXEg PSBwYWxsb2MoNTEyKTsKCQlzcHJpbnRmKHEsIlNFTEVDVCAqIEZST00gcHVibGljLiVzIFdI RVJFICVzIixjb25mcmVsbmFtZSxXSEVSRSk7CgkJLy9lbG9nKE5PVElDRSwiaGFuZGxlUGFy ZW50cyA6IEZvdW5kIEZLLCBTUUw9JXMiLHEpOwojaWYgZGVmaW5lZCBERUJVR19PVVRQVVQK CQllbG9nKE5PVElDRSwiRm91bmQgRkssIFNRTD0lcyIscSk7CiNlbmRpZgoJCXJldCA9IFNQ SV9leGVjKHEsMSk7CgkJaWYgKHJldCAhPSBTUElfT0tfU0VMRUNUIHx8IFNQSV9wcm9jZXNz ZWQgIT0gMSkgewoJICAgICAgICAgICAgICAgIGVsb2coRVJST1IsICJGYXRhbCBlcnJvcjog aGFuZGxlUGFyZW50czogcGFyIHRhYmxlICVzIHNob3VsZCBoYXZlIHJvdyB3aXRoICVzIixj b25mcmVsbmFtZSxXSEVSRSk7CgkJCXJldHVybiAtMjsKCQl9CgkJcGZyZWUocSk7CgkJUmVh bFBhcl9wcm9jZXNzZWQgPSBTUElfcHJvY2Vzc2VkOwoJCVJlYWxQYXJfdHVwVGFibGUgPSBT UElfdHVwdGFibGU7CgkJUmVhbFBhcl90dXBsZSA9IFJlYWxQYXJfdHVwVGFibGUtPnZhbHNb MF07CgkJUGFyVGFibGVOYW1lID0gcGFsbG9jKDI1Nik7CgkJc3ByaW50ZihQYXJUYWJsZU5h bWUsIlwicHVibGljXCIuXCIlc1wiIixjb25mcmVsbmFtZSk7CgkJcmV0ID0gaGFuZGxlcihQ YXJUYWJsZU5hbWUsTlVMTCxSZWFsUGFyX3R1cGxlLFJlYWxQYXJfdHVwVGFibGUtPnR1cGRl c2MsY29uZnJlbGlkLCdtJyxzbGF2ZWlkLFdIRVJFKTsKCQlwZnJlZShQYXJUYWJsZU5hbWUp OwoJCXBmcmVlKFdIRVJFKTsKCgl9CglyZXR1cm4gMDsKfQoKaW50IGV4aXN0c0luQWNjbnQo Y2hhciAqY3BUYWJsZU5hbWUsIGludCBzbGF2ZWlkLCBjaGFyICpwa3hwcmVzcykgewoJY2hh ciAqcTsKCWludCByZXQ7CgojaWYgZGVmaW5lZCBERUJVR19PVVRQVVQKCWVsb2coTk9USUNF LCAiaW4gZXhpc3RzSW5BY2NudCBvZiBUYWJsZT0lcyIsY3BUYWJsZU5hbWUpOwojZW5kaWYK CglxID0gcGFsbG9jKE1BWF9RVUVSWV9MRU4pOwoJLyoKCXNwcmludGYocSwiU0VMRUNUIDEg RlJPTSBkYm1pcnJvcl9hY2NvdW50aW5nIFdIRVJFIHRibG5hbWU9JyVzJyBBTkQgcGt4cHJl c3M9JyVzJyBBTkQgc2xhdmVpZD0lZCIsY3BUYWJsZU5hbWUscGt4cHJlc3Msc2xhdmVpZCk7 CglyZXQgPSBTUElfZXhlYyhxLDEpOwoJcGZyZWUocSk7CglpZiAocmV0ICE9IFNQSV9PS19T RUxFQ1QgfHwgU1BJX3Byb2Nlc3NlZCAhPSAxKSByZXR1cm4gMDsKCWVsc2UgcmV0dXJuIDE7 CgkqLwoJc3ByaW50ZihxLCJVUERBVEUgZGJtaXJyb3JfYWNjb3VudGluZyBzZXQgY250PWNu dCsxIFdIRVJFIHRibG5hbWU9JyVzJyBBTkQgcGt4cHJlc3M9JyVzJyBBTkQgc2xhdmVpZD0l ZCIsY3BUYWJsZU5hbWUscGt4cHJlc3Msc2xhdmVpZCk7CglyZXQgPSBTUElfZXhlYyhxLDEp OwoJcGZyZWUocSk7CglpZiAocmV0ICE9IFNQSV9PS19VUERBVEUgfHwgU1BJX3Byb2Nlc3Nl ZCAhPSAxKSByZXR1cm4gMDsKCWVsc2UgcmV0dXJuIDE7Cn0KCmludCBkZWNyZWFzZUFjY250 KGNoYXIgKmNwVGFibGVOYW1lLCBpbnQgc2xhdmVpZCwgY2hhciAqcGt4cHJlc3MpIHsKCWNo YXIgKnE7CglpbnQgcmV0OwoJYm9vbCBpc051bGw7CgojaWYgZGVmaW5lZCBERUJVR19PVVRQ VVQKCWVsb2coTk9USUNFLCAiaW4gZGVjcmVhc2VBY2NudCBvZiBUYWJsZT0lcyIsY3BUYWJs ZU5hbWUpOwojZW5kaWYKCglxID0gcGFsbG9jKE1BWF9RVUVSWV9MRU4pOwoJc3ByaW50Zihx LCJVUERBVEUgZGJtaXJyb3JfYWNjb3VudGluZyBzZXQgY250PWNudC0xIFdIRVJFIHRibG5h bWU9JyVzJyBBTkQgcGt4cHJlc3M9JyVzJyBBTkQgc2xhdmVpZD0lZCIsY3BUYWJsZU5hbWUs cGt4cHJlc3Msc2xhdmVpZCk7CglyZXQgPSBTUElfZXhlYyhxLDEpOwoJcGZyZWUocSk7Cglp ZiAocmV0ICE9IFNQSV9PS19VUERBVEUgfHwgU1BJX3Byb2Nlc3NlZCAhPSAxKSBlbG9nKEVS Uk9SLCJwcm9ibGVtIGluIGRlY3JlYXNlQWNjbnQgZm9yIHRhYmxlICVzLCBzbGF2ZWlkPSVk LCBwa3hwcmVzcz0lcyIsY3BUYWJsZU5hbWUsc2xhdmVpZCxwa3hwcmVzcyk7CglxID0gcGFs bG9jKE1BWF9RVUVSWV9MRU4pOwoJc3ByaW50ZihxLCJTRUxFQ1QgY250IEZST00gZGJtaXJy b3JfYWNjb3VudGluZyBXSEVSRSB0YmxuYW1lPSclcycgQU5EIHBreHByZXNzPSclcycgQU5E IHNsYXZlaWQ9JWQiLGNwVGFibGVOYW1lLHBreHByZXNzLHNsYXZlaWQpOwoJcmV0ID0gU1BJ X2V4ZWMocSwxKTsKCXBmcmVlKHEpOwoJaWYgKHJldCAhPSBTUElfT0tfU0VMRUNUIHx8IFNQ SV9wcm9jZXNzZWQgIT0gMSkgZWxvZyhFUlJPUiwicHJvYmxlbSBpbiBkZWNyZWFzZUFjY250 IGZvciB0YWJsZSAlcywgc2xhdmVpZD0lZCwgcGt4cHJlc3M9JXMiLGNwVGFibGVOYW1lLHNs YXZlaWQscGt4cHJlc3MpOwoJcmV0dXJuIERhdHVtR2V0SW50MzIoU1BJX2dldGJpbnZhbChT UElfdHVwdGFibGUtPnZhbHNbMF0sU1BJX3R1cHRhYmxlLT50dXBkZXNjLDEsJmlzTnVsbCkp Owp9CgppbnQgY3JlYXRlQWNjbnQoY2hhciAqY3BUYWJsZU5hbWUsIGludCBzbGF2ZWlkLCBj aGFyICpwa3hwcmVzcykgewoJY2hhciAqcTsKCWludCByZXQ7CgojaWYgZGVmaW5lZCBERUJV R19PVVRQVVQKCWVsb2coTk9USUNFLCAiaW4gY3JlYXRlQWNjbnQgb2YgVGFibGU9JXMiLGNw VGFibGVOYW1lKTsKI2VuZGlmCgoJcSA9IHBhbGxvYyhNQVhfUVVFUllfTEVOKTsKCS8qCglw dWJsaWMuZGJtaXJyb3JfYWNjb3VudGluZy5jbnQgREVGQVVMVCA9IDEKCSovCglzcHJpbnRm KHEsIklOU0VSVCBJTlRPIGRibWlycm9yX2FjY291bnRpbmcgKHRibG5hbWUscGt4cHJlc3Ms c2xhdmVpZCkgVkFMVUVTKCclcycsJyVzJywlZCkiLGNwVGFibGVOYW1lLHBreHByZXNzLHNs YXZlaWQpOwoJcmV0ID0gU1BJX2V4ZWMocSwxKTsKCXBmcmVlKHEpOwoJaWYgKHJldCAhPSBT UElfT0tfSU5TRVJUIHx8IFNQSV9wcm9jZXNzZWQgIT0gMSkgcmV0dXJuIC0yOwoJZWxzZSBy ZXR1cm4gMDsKfQoKCmNoYXIgKmdldFBLeHByZXNzKGNoYXIgKmNwVGFibGVOYW1lLCBIZWFw VHVwbGUgdHVwbGUsIFR1cGxlRGVzYyB0dXBsZURlc2MsIE9pZCB0YWJsZU9pZCkgewoJaW50 MnZlY3RvciAqcGs7CglpbnQgaTsKCWNoYXIgKldIRVJFID0gcGFsbG9jKE1BWF9XSEVSRV9D TEFVU0UpOwoKI2lmIGRlZmluZWQgREVCVUdfT1VUUFVUCgllbG9nKE5PVElDRSwgImluIGdl dFBLeHByZXNzIG9mIFRhYmxlPSVzIixjcFRhYmxlTmFtZSk7CiNlbmRpZgoKCXBrID0gZ2V0 UHJpbWFyeUtleSh0YWJsZU9pZCk7CglpZiAocGsgPT0gTlVMTCkgcmV0dXJuIE5VTEw7Cglp bnQxNiAqcGtWID0gcGstPnZhbHVlczsKCWludCBwa1NpemUgPSBway0+ZGltMTsKCWlmIChw a1NpemU+MCkgewoJCWNoYXIgKmtleW5hbWU7CgkJY2hhciAqa2V5dmFsOwoJCWtleW5hbWUg PSBTUElfZm5hbWUodHVwbGVEZXNjLHBrVlswXSk7CgkJaWYgKGtleW5hbWUgPT0gTlVMTCkg ewoJCQllbG9nKEVSUk9SLCJGQVRBTCBFUlJPUjogV1JPTkcga2V5bmFtZSBrZXk9JWQgZ2l2 ZW4gZm9yIHRhYmxlICVzIixwa1ZbMF0sY3BUYWJsZU5hbWUpOwoJCQlyZXR1cm4gTlVMTDsK CQl9CgkJa2V5dmFsID0gU1BJX2dldHZhbHVlKHR1cGxlLHR1cGxlRGVzYyxwa1ZbMF0pOwoJ CWlmIChrZXl2YWwgPT0gTlVMTCkgewoJCQllbG9nKEVSUk9SLCJGQVRBTCBFUlJPUjogV1JP Tkcga2V5dmFsIGtleT0lZCBnaXZlbiBmb3IgdGFibGUgJXMiLHBrVlswXSxjcFRhYmxlTmFt ZSk7CgkJCXJldHVybiBOVUxMOwoJCX0KCgkJc3ByaW50ZihXSEVSRSwiXCIlc1wiPSVzIixr ZXluYW1lLGtleXZhbCk7CgkJcGZyZWUoa2V5bmFtZSk7CgkJcGZyZWUoa2V5dmFsKTsKCX0K CWZvciAoaT0xO2k8cGtTaXplO2krKykgewoJCWNoYXIgKmtleW5hbWU7CgkJY2hhciAqa2V5 dmFsOwoJCWtleW5hbWUgPSBTUElfZm5hbWUodHVwbGVEZXNjLHBrVltpXSk7CgkJaWYgKGtl eW5hbWUgPT0gTlVMTCkgewoJCQllbG9nKEVSUk9SLCJGQVRBTCBFUlJPUjogV1JPTkcga2V5 bmFtZSBrZXk9JWQgZ2l2ZW4gZm9yIHRhYmxlICVzIixwa1ZbaV0sY3BUYWJsZU5hbWUpOwoJ CQlyZXR1cm4gTlVMTDsKCQl9CgkJa2V5dmFsID0gU1BJX2dldHZhbHVlKHR1cGxlLHR1cGxl RGVzYyxwa1ZbaV0pOwoJCWlmIChrZXl2YWwgPT0gTlVMTCkgewoJCQllbG9nKEVSUk9SLCJG QVRBTCBFUlJPUjogV1JPTkcga2V5dmFsIGtleT0lZCBnaXZlbiBmb3IgdGFibGUgJXMiLHBr VltpXSxjcFRhYmxlTmFtZSk7CgkJCXJldHVybiBOVUxMOwoJCX0KCgkJc3ByaW50ZihXSEVS RSwiJXMgQU5EIFwiJXNcIj0lcyIsV0hFUkUsa2V5bmFtZSxrZXl2YWwpOwoJCXBmcmVlKGtl eW5hbWUpOwoJCXBmcmVlKGtleXZhbCk7CgkJCgl9CglwZnJlZShwayk7CglyZXR1cm4gV0hF UkU7Cn0KaW50ICpnZXRTbGF2ZXMoY2hhciAqY3BUYWJsZU5hbWUsY2hhciAqcGt4cHJlc3Mp IHsKCWNoYXIgKnE7CglpbnQgcmV0OwoJaW50IFNMQVZFX3Byb2Nlc3NlZDsKCVNQSVR1cGxl VGFibGUgKlNMQVZFX3R1cFRhYmxlOwoJaW50ICpzbGF2ZXM7CgojaWYgZGVmaW5lZCBERUJV R19PVVRQVVQKCWVsb2coTk9USUNFLCAiaW4gZ2V0U2xhdmVzIG9mIFRhYmxlPSVzLCBwa3hw cmVzcz0lcyIsY3BUYWJsZU5hbWUscGt4cHJlc3MpOwojZW5kaWYKCglpZiAocGt4cHJlc3Mg PT0gTlVMTCkgcmV0dXJuIE5VTEw7CgkKCXEgPSBwYWxsb2MoTUFYX1FVRVJZX0xFTik7Cglz cHJpbnRmKHEsIlNFTEVDVCBzbGF2ZWlkIEZST00gZGJtaXJyb3JfYWNjb3VudGluZyBXSEVS RSB0YmxuYW1lPSclcycgQU5EIHBreHByZXNzPSclcyciLGNwVGFibGVOYW1lLHBreHByZXNz KTsKCXJldCA9IFNQSV9leGVjKHEsMCk7CglwZnJlZShxKTsKCWlmIChyZXQgIT0gU1BJX09L X1NFTEVDVCB8fCBTUElfcHJvY2Vzc2VkIDw9IDApIHJldHVybiBOVUxMOwoJU0xBVkVfdHVw VGFibGUgPSBTUElfdHVwdGFibGU7CglTTEFWRV9wcm9jZXNzZWQgPSBTUElfcHJvY2Vzc2Vk OwoJc2xhdmVzID0gcGFsbG9jKChTTEFWRV9wcm9jZXNzZWQrMSkgKiBzaXplb2YoaW50KSk7 CiNpZiBkZWZpbmVkIERFQlVHX09VVFBVVAoJZWxvZyhOT1RJQ0UsIlNMQVZFX3Byb2Nlc3Nl ZD0lZCIsU0xBVkVfcHJvY2Vzc2VkKTsKI2VuZGlmCglmb3IgKHJldD0wO3JldDxTTEFWRV9w cm9jZXNzZWQ7cmV0KyspIHsKCQljaGFyICpzbGF2ZWlkU3RyID0gU1BJX2dldHZhbHVlKFNM QVZFX3R1cFRhYmxlLT52YWxzW3JldF0sU0xBVkVfdHVwVGFibGUtPnR1cGRlc2MsMSk7CgkJ KihzbGF2ZXMrcmV0KSA9IGF0b2koc2xhdmVpZFN0cik7CgkJcGZyZWUoc2xhdmVpZFN0cik7 CgkJCgl9CgkqKHNsYXZlcytTTEFWRV9wcm9jZXNzZWQpID0gMDsKCXJldHVybiBzbGF2ZXM7 CgoKfQoKaW50IGRlbGV0ZUFjY250IChjaGFyICpjcFRhYmxlTmFtZSwgY2hhciAqcGt4cHJl c3MpIHsKCWNoYXIgKnE7CglpbnQgcmV0OwoKI2lmIGRlZmluZWQgREVCVUdfT1VUUFVUCgll bG9nKE5PVElDRSwgImluIGRlbGV0ZUFjY250IG9mIFRhYmxlPSVzIixjcFRhYmxlTmFtZSk7 CiNlbmRpZgoKCXEgPSBwYWxsb2MoTUFYX1FVRVJZX0xFTik7CglzcHJpbnRmKHEsIkRFTEVU RSBGUk9NIGRibWlycm9yX2FjY291bnRpbmcgd2hlcmUgdGJsbmFtZT0nJXMnIEFORCBwa3hw cmVzcz0nJXMnIixjcFRhYmxlTmFtZSxwa3hwcmVzcyk7CglyZXQgPSBTUElfZXhlYyhxLDAp OwoJcGZyZWUocSk7CglpZiAocmV0ID09IFNQSV9PS19ERUxFVEUpIHJldHVybiAwOwoJZWxz ZSByZXR1cm4gLTI7Cn0KCmludCBkZWxldGVTbGF2ZUFjY250IChjaGFyICpjcFRhYmxlTmFt ZSxpbnQgc2xhdmVpZCwgY2hhciAqcGt4cHJlc3MpIHsKCWNoYXIgKnE7CglpbnQgcmV0OwoK I2lmIGRlZmluZWQgREVCVUdfT1VUUFVUCgllbG9nKE5PVElDRSwgImluIGRlbGV0ZVNsYXZl QWNjbnQgb2YgVGFibGU9JXMiLGNwVGFibGVOYW1lKTsKI2VuZGlmCgoJcSA9IHBhbGxvYyhN QVhfUVVFUllfTEVOKTsKCXNwcmludGYocSwiREVMRVRFIEZST00gZGJtaXJyb3JfYWNjb3Vu dGluZyB3aGVyZSB0YmxuYW1lPSclcycgQU5EIHBreHByZXNzPSclcycgQU5EIHNsYXZlaWQ9 JWQiLGNwVGFibGVOYW1lLHBreHByZXNzLHNsYXZlaWQpOwoJcmV0ID0gU1BJX2V4ZWMocSww KTsKCXBmcmVlKHEpOwoJaWYgKHJldCA9PSBTUElfT0tfREVMRVRFKSByZXR1cm4gMDsKCWVs c2UgcmV0dXJuIC0yOwp9CgppbnQgdXBkYXRlQWNjbnRQYXJlbnRzKGNoYXIgKmNwVGFibGVO YW1lLEhlYXBUdXBsZSBCdHVwbGUsSGVhcFR1cGxlIEF0dXBsZSwgVHVwbGVEZXNjIHR1cGxl RGVzYyxPaWQgdGFibGVPaWQsaW50IHNsYXZlaWQpIHsKCWNoYXIgKnFiOwoJY2hhciAqcTsK CWJvb2wgaXNOdWxsOwoJaW50IHJldDsKCWludCBpOwoJSGVhcFR1cGxlIHJlc1R1cGxlOwoJ RGF0dW0gcmVzRGF0dW07CglPaWQgY29uZnJlbGlkOwoJY2hhciAqY29uZnJlbG5hbWU7Cglp bnQxNgkqdGhpc0NvbHM7CglpbnQxNgkqZmtDb2xzOwoJaW50MTYJKnJ1bjsKCUFycmF5VHlw ZSAqYXJyOwoJY2hhcglCdGhpc0NvbHNWYWxzW01BWEtDT0xTXVtNQVhDT0xfTEVOXTsKCWNo YXIJZmtDb2xzTmFtZXNbTUFYS0NPTFNdW01BWENPTF9MRU5dOwoJY2hhcgl0aGlzQ29sc1R5 cGVzW01BWEtDT0xTXVsxMDBdOwoJc2hvcnQJbnVtT2ZDb2xzOwoJU1BJVHVwbGVUYWJsZSAq RktfdHVwVGFibGU7CglpbnQJRktfcHJvY2Vzc2VkOwoJaW50IFBhclNsYXZlSWQ7CgojaWYg ZGVmaW5lZCBERUJVR19PVVRQVVQKCWVsb2coTk9USUNFLCAiaW4gdXBkYXRlQWNjbnQgcGFy ZW50cyBvZiBUYWJsZT0lZCIsdGFibGVPaWQpOwojZW5kaWYKCglxYiA9ICJTRUxFQ1QgYy5j b25mcmVsaWQsYy5jb25rZXksYy5jb25ma2V5LGYucmVsbmFtZSBGUk9NIHBnX2NhdGFsb2cu cGdfY29uc3RyYWludCBjLHBnX2NhdGFsb2cucGdfY2xhc3MgZiBXSEVSRSBjLmNvbnR5cGUg PSAnZicgQU5EIGMuY29uZnJlbGlkID0gZi5vaWQgQU5EIGMuY29ucmVsaWQgPSAiOwoJcSA9 IHBhbGxvYyhzdHJsZW4ocWIpK01BWF9PSURfTEVOKzEpOwoJc3ByaW50ZihxLCIlcyVkIixx Yix0YWJsZU9pZCk7CglyZXQgPSBTUElfZXhlYyhxLDApOwoJcGZyZWUocSk7CglpZiAocmV0 ICE9IFNQSV9PS19TRUxFQ1QgfHwgU1BJX3Byb2Nlc3NlZCA8IDApIHsgCgkJZWxvZyhOT1RJ Q0UsICJubyBGS3MiKTsKCQlyZXR1cm4gMDsKCX0KCS8qCglGb3IgZXZlcnkgRksgZGVwZW5k ZW5jeSB3ZSB0cmFjayBhbmQgaGFuZGxlIHRoZSBwYXJlbnQgdGFibGUKCSovCglGS190dXBU YWJsZSA9IFNQSV90dXB0YWJsZTsKCUZLX3Byb2Nlc3NlZCA9IFNQSV9wcm9jZXNzZWQ7CgoJ Zm9yIChpPTA7aTxGS19wcm9jZXNzZWQ7aSsrKSB7CgkJY2hhciAqV0hFUkU7CgkJY2hhciAq UGFyVGFibGVOYW1lOwoJCWludCBqOwoJCWNoYXIgRmtIYXNOdWxsVmFsdWVPUlhjbHVkZWQ9 MDsKCQljaGFyIGRlY3JlYXNlaXQ9MDsKCgkJU1BJVHVwbGVUYWJsZSAqUmVhbFBhcl90dXBU YWJsZTsKCQlpbnQgICAgIFJlYWxQYXJfcHJvY2Vzc2VkOwoJCUhlYXBUdXBsZSBSZWFsUGFy X3R1cGxlOwoJCWludCBjb2xydW47CgkJU1BJVHVwbGVUYWJsZSAqdGhpc2F0dF90dXBUYWJs ZTsKICAgICAgICAgICAgICAgIGludCAgICAgdGhpc2F0dF9wcm9jZXNzZWQ7CiAgICAgICAg ICAgICAgICBIZWFwVHVwbGUgdGhpc2F0dF90dXBsZTsKCgoJCXJlc1R1cGxlID0gRktfdHVw VGFibGUtPnZhbHNbaV07CgoKCQlyZXNEYXR1bSA9IFNQSV9nZXRiaW52YWwocmVzVHVwbGUs RktfdHVwVGFibGUtPnR1cGRlc2MsMSwmaXNOdWxsKTsKCQljb25mcmVsaWQgPSAoT2lkKSBE YXR1bUdldE9iamVjdElkKHJlc0RhdHVtKTsKCgkJcmVzRGF0dW0gPSBTUElfZ2V0YmludmFs KHJlc1R1cGxlLEZLX3R1cFRhYmxlLT50dXBkZXNjLDIsJmlzTnVsbCk7CgkJYXJyID0gKEFy cmF5VHlwZSAqKSBEYXR1bUdldFBvaW50ZXIoUEdfREVUT0FTVF9EQVRVTShyZXNEYXR1bSkp OwoJCXRoaXNDb2xzID0gKGludDE2ICopQVJSX0RBVEFfUFRSKGFycik7CgkJbnVtT2ZDb2xz PUFSUl9ESU1TKGFycilbMF07CgkJZm9yIChydW49dGhpc0NvbHMsY29scnVuPTA7Y29scnVu PG51bU9mQ29scztydW4rKyxjb2xydW4rKykgIHsKCQkJaW50IHRoaXNjb2xydW47CiNpZiBk ZWZpbmVkIERFQlVHX09VVFBVVAojZW5kaWYKICAgICAgICAgICAgICAgICAgICAgICAgY2hh ciAqZm9vbmFtZTsKCiAgICAgICAgICAgICAgICAgICAgICAgIHEgPSBwYWxsb2MoNTEyKTsK ICAgICAgICAgICAgICAgICAgICAgICAgc3ByaW50ZihxLCJTRUxFQ1QgYXR0bmFtZSBGUk9N IHBnX2F0dHJpYnV0ZSBXSEVSRSBhdHRyZWxpZD0lZCBhbmQgYXR0bnVtPSVkIix0YWJsZU9p ZCwqcnVuKTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0ID0gU1BJX2V4ZWMocSwxKTsK ICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJldCAhPSBTUElfT0tfU0VMRUNUIHx8IFNQ SV9wcm9jZXNzZWQgIT0gMSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVs b2coRVJST1IsICJGYXRhbCBlcnJvcjogaGFuZGxlUGFyZW50czogdGhpcyB0YWJsZSBvaWQ9 JWQgc2hvdWxkIGhhdmUgYXR0cmlidXRlIHdpdGggYXR0bnVtPSVkIix0YWJsZU9pZCwqcnVu KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTI7CiAgICAgICAg ICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgcGZyZWUocSk7CiAg ICAgICAgICAgICAgICAgICAgICAgIHRoaXNhdHRfcHJvY2Vzc2VkID0gU1BJX3Byb2Nlc3Nl ZDsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpc2F0dF90dXBUYWJsZSA9IFNQSV90dXB0 YWJsZTsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpc2F0dF90dXBsZSA9IHRoaXNhdHRf dHVwVGFibGUtPnZhbHNbMF07CiAgICAgICAgICAgICAgICAgICAgICAgIGZvb25hbWUgPSBT UElfZ2V0dmFsdWUodGhpc2F0dF90dXBsZSx0aGlzYXR0X3R1cFRhYmxlLT50dXBkZXNjLDEp OwogICAgICAgICAgICAgICAgICAgICAgICBjaGFyICp2YWx1ZSA9IFNQSV9nZXR2YWx1ZShC dHVwbGUsdHVwbGVEZXNjLHRoaXNjb2xydW49U1BJX2ZudW1iZXIodHVwbGVEZXNjLGZvb25h bWUpKTsKCgkJCWNoYXIgKmNvbHR5cGUgPSBTUElfZ2V0dHlwZSh0dXBsZURlc2MsdGhpc2Nv bHJ1bj1TUElfZm51bWJlcih0dXBsZURlc2MsZm9vbmFtZSkpOwoKCgojaWYgZGVmaW5lZCBE RUJVR19PVVRQVVQKCQkJZWxvZyhOT1RJQ0UsIkZvdW5kIGNvbG5hbWU9JXMgc3lzY29sPSVk IHRoaXNjb2w9JWQgd2l0aCBCZWZvcmUgdmFsdWU9JXMiLGZvb25hbWUsKnJ1bix0aGlzY29s cnVuLHZhbHVlKTsKI2VuZGlmCgkJCWlmICh2YWx1ZSA9PSBOVUxMIHx8IGlzRXhjbHVkZWQo Y3BUYWJsZU5hbWUsdHVwbGVEZXNjLHRoaXNjb2xydW4pKSAgewoJCQkJRmtIYXNOdWxsVmFs dWVPUlhjbHVkZWQ9MTsKCQkJCWJyZWFrOwoJCQkJLyoKCQkJCU5vdGhpbmcgaXMgZG9uZSBy ZWdhcmRpbmcgIkJlZm9yZSIgc3RhdHVzIG9mIHBhcmVudCBzaW5jZSB0aGVyZSBpcyBub3Qg b25lCgkJCQkqLwoJCQl9CgkJCW1lbWNweSgmKEJ0aGlzQ29sc1ZhbHNbY29scnVuXVswXSks dmFsdWUsc3RybGVuKHZhbHVlKSsxKTsKCQkJbWVtY3B5KCYodGhpc0NvbHNUeXBlc1tjb2xy dW5dWzBdKSxjb2x0eXBlLHN0cmxlbihjb2x0eXBlKSsxKTsKCgkJCWlmIChBdHVwbGUgIT0g TlVMTCkgewoJCQkJY2hhciAqQXZhbHVlID0gU1BJX2dldHZhbHVlKEF0dXBsZSx0dXBsZURl c2MsdGhpc2NvbHJ1bik7CiNpZiBkZWZpbmVkIERFQlVHX09VVFBVVAoJCQkJZWxvZyhOT1RJ Q0UsIkZvdW5kIGNvbG5hbWU9JXMgc3lzY29sPSVkIHRoaXNjb2w9JWQgd2l0aCBCZWZvcmUg dmFsdWU9JXMsQWZ0ZXIgdmFsdWU9JXMiLGZvb25hbWUsKnJ1bix0aGlzY29scnVuLHZhbHVl LEF2YWx1ZSk7CiNlbmRpZgoJCQkJaWYgKEF2YWx1ZSA9PSBOVUxMKSBkZWNyZWFzZWl0PTE7 CgkJCQllbHNlIGlmIChzdHJjbXAoQXZhbHVlLHZhbHVlKSkgewoJCQkJCWRlY3JlYXNlaXQ9 MTsKCQkJCQlwZnJlZShBdmFsdWUpOwoJCQkJfQoJCQl9CgkJCWVsc2UgZGVjcmVhc2VpdD0x OyAvKiBpcyBkZWxldGUgb3BlcmF0aW9uKi8KCQkJcGZyZWUodmFsdWUpOwoJCX0KI2lmIGRl ZmluZWQgREVCVUdfT1VUUFVUCgkJZWxvZyhOT1RJQ0UsImluIHVwZGF0ZUFjY25QYXJlbnRz LS0+IEVORCBPRiBBVFRSIExPT1AiKTsKCQllbG9nKE5PVElDRSwiZGVjcmVhc2UgaXQgPSAl ZCwgIixkZWNyZWFzZWl0KTsKCQllbG9nKE5PVElDRSwiRmtIYXNOdWxsVmFsdWVPUlhjbHVk ZWQgID0gJWQsICIsRmtIYXNOdWxsVmFsdWVPUlhjbHVkZWQpOwojZW5kaWYKCgkJaWYgKEZr SGFzTnVsbFZhbHVlT1JYY2x1ZGVkIHx8ICFkZWNyZWFzZWl0KSBjb250aW51ZTsKCgoJCQoJ CQoJCXJlc0RhdHVtID0gU1BJX2dldGJpbnZhbChyZXNUdXBsZSxGS190dXBUYWJsZS0+dHVw ZGVzYywzLCZpc051bGwpOwoJCWFyciA9IChBcnJheVR5cGUgKikgRGF0dW1HZXRQb2ludGVy KFBHX0RFVE9BU1RfREFUVU0ocmVzRGF0dW0pKTsKCQlma0NvbHMgPSAoaW50MTYgKilBUlJf REFUQV9QVFIoYXJyKTsKCQlmb3IgKHJ1bj1ma0NvbHMsY29scnVuPTA7Y29scnVuPG51bU9m Q29scztydW4rKyxjb2xydW4rKykgewoJCQlTUElUdXBsZVRhYmxlICpQQVJfdHVwVGFibGU7 CgkJCWludCAgICAgUEFSX3Byb2Nlc3NlZDsKCQkJSGVhcFR1cGxlIFBBUl9yZXNUdXBsZTsK CQkJY2hhciAqdmFsdWU7CgkJCXEgPSBwYWxsb2Moc3RybGVuKCJTRUxFQ1QgYXR0bmFtZSBm cm9tIHBnX2F0dHJpYnV0ZSB3aGVyZSBhdHRyZWxpZD0gYW5kIGF0dG51bT0iKSsyKihNQVhf T0lEX0xFTisxKSk7CgkJCXNwcmludGYocSwiU0VMRUNUIGF0dG5hbWUgZnJvbSBwZ19hdHRy aWJ1dGUgd2hlcmUgYXR0cmVsaWQ9JWQgYW5kIGF0dG51bT0lZCIsY29uZnJlbGlkLCpydW4p OwoJCQlyZXQgPSBTUElfZXhlYyhxLDEpOwoJCQlpZiAocmV0ICE9IFNQSV9PS19TRUxFQ1Qg fHwgU1BJX3Byb2Nlc3NlZCAhPSAxKSB7CgkJCQllbG9nKEVSUk9SLCAiRmF0YWwgRXJyb3I6 bm8gUEsgZm9yIEZLIHJlbGF0aW9uIik7CgkJCQlyZXR1cm4gLTI7CgkJCX0KCQkJcGZyZWUo cSk7CgkJCVBBUl90dXBUYWJsZSA9IFNQSV90dXB0YWJsZTsKCQkJUEFSX3Byb2Nlc3NlZCA9 IFNQSV9wcm9jZXNzZWQ7CgkJCVBBUl9yZXNUdXBsZSA9IFBBUl90dXBUYWJsZS0+dmFsc1sw XTsKCQkJdmFsdWUgPSBTUElfZ2V0dmFsdWUoUEFSX3Jlc1R1cGxlLFBBUl90dXBUYWJsZS0+ dHVwZGVzYywxKTsKCQkJbWVtY3B5KCYoZmtDb2xzTmFtZXNbY29scnVuXVswXSksdmFsdWUs c3RybGVuKHZhbHVlKSsxKTsKCQkJcGZyZWUodmFsdWUpOwoKCQl9CgkJCgkJcmVzRGF0dW0g PSBTUElfZ2V0YmludmFsKHJlc1R1cGxlLEZLX3R1cFRhYmxlLT50dXBkZXNjLDQsJmlzTnVs bCk7CgkJY29uZnJlbG5hbWUgPSAoY2hhciAqKSBEYXR1bUdldE5hbWUocmVzRGF0dW0pOwoJ LyoKCXRoZXJlIG11c3QgYmUgYXQgbGVhc3QgMSBjb2x1bW4gaW4gY29tcG91bmQgRkshIQoJ Ki8KCQlXSEVSRSA9IHBhbGxvYyhNQVhfV0hFUkVfQ0xBVVNFKTsKCQlpZiAoIXN0cm5jbXAo dGhpc0NvbHNUeXBlc1swXSwiaW50IiwzKSkKCQkJc3ByaW50ZihXSEVSRSwiXCIlc1wiPSVz Iixma0NvbHNOYW1lc1swXSxCdGhpc0NvbHNWYWxzWzBdKTsKCQllbHNlCgkJCXNwcmludGYo V0hFUkUsIlwiJXNcIj0nJXMnIixma0NvbHNOYW1lc1swXSxCdGhpc0NvbHNWYWxzWzBdKTsK CQlmb3IgKGo9MTtqPG51bU9mQ29scztqKyspIHsKCQkJaWYgKCFzdHJuY21wKHRoaXNDb2xz VHlwZXNbal0sImludCIsMykpCgkJCQlzcHJpbnRmKFdIRVJFLCIlcyBBTkQgXCIlc1wiPSVz IixXSEVSRSxma0NvbHNOYW1lc1tqXSxCdGhpc0NvbHNWYWxzW2pdKTsKCQkJZWxzZQoJCQkJ c3ByaW50ZihXSEVSRSwiJXMgQU5EIFwiJXNcIj0nJXMnIixXSEVSRSxma0NvbHNOYW1lc1tq XSxCdGhpc0NvbHNWYWxzW2pdKTsKCQl9CgoJCXEgPSBwYWxsb2MoNTEyKTsKCQlzcHJpbnRm KHEsIlNFTEVDVCAqIEZST00gcHVibGljLiVzIFdIRVJFICVzIixjb25mcmVsbmFtZSxXSEVS RSk7CgkJLy9lbG9nKE5PVElDRSwidXBkYXRlQWNjbnRQYXJlbnRzIDogRm91bmQgRkssIFNR TD0lcyIscSk7CiNpZiBkZWZpbmVkIERFQlVHX09VVFBVVAoJCWVsb2coTk9USUNFLCJGb3Vu ZCBGSywgU1FMPSVzIixxKTsKI2VuZGlmCgkJcmV0ID0gU1BJX2V4ZWMocSwxKTsKCQlpZiAo cmV0ICE9IFNQSV9PS19TRUxFQ1QgfHwgU1BJX3Byb2Nlc3NlZCAhPSAxKSB7CgkgICAgICAg ICAgICAgICAgZWxvZyhFUlJPUiwgIkZhdGFsIGVycm9yOiB1cGRhdGVBY2N0UGFyZW50czog cGFyIHRhYmxlICVzIHNob3VsZCBoYXZlIHJvdyB3aXRoICVzIixjb25mcmVsbmFtZSxXSEVS RSk7CgkJCXJldHVybiAtMjsKCQl9CgkJcGZyZWUocSk7CgkJUmVhbFBhcl9wcm9jZXNzZWQg PSBTUElfcHJvY2Vzc2VkOwoJCVJlYWxQYXJfdHVwVGFibGUgPSBTUElfdHVwdGFibGU7CgkJ UmVhbFBhcl90dXBsZSA9IFJlYWxQYXJfdHVwVGFibGUtPnZhbHNbMF07CgkJUGFyVGFibGVO YW1lID0gcGFsbG9jKDI1Nik7CgkJc3ByaW50ZihQYXJUYWJsZU5hbWUsIlwicHVibGljXCIu XCIlc1wiIixjb25mcmVsbmFtZSk7CgkJUGFyU2xhdmVJZCA9IGdldFNsYXZlSWQoUGFyVGFi bGVOYW1lLFJlYWxQYXJfdHVwbGUsUmVhbFBhcl90dXBUYWJsZS0+dHVwZGVzYyk7CgkJaWYg KFBhclNsYXZlSWQgPj0gMCB8fCBQYXJTbGF2ZUlkID09IC0yIHx8IFBhclNsYXZlSWQgPT0g LTMpIHsKCQkJcGZyZWUoUGFyVGFibGVOYW1lKTsKCQkJY29udGludWU7CgkJfQoJCWlmIChk ZWNyZWFzZUFjY250KFBhclRhYmxlTmFtZSxzbGF2ZWlkLFdIRVJFKT09MCkgewoJCQlyZXQg PSBzdG9yZVBlbmRpbmcoUGFyVGFibGVOYW1lLFJlYWxQYXJfdHVwbGUsTlVMTCxSZWFsUGFy X3R1cFRhYmxlLT50dXBkZXNjLGNvbmZyZWxpZCwnZCcsc2xhdmVpZCwnZicpOwoJCQlyZXQg PSBkZWxldGVTbGF2ZUFjY250KFBhclRhYmxlTmFtZSxzbGF2ZWlkLFdIRVJFKTsKCQkJcmV0 ID0gdXBkYXRlQWNjbnRQYXJlbnRzKFBhclRhYmxlTmFtZSxSZWFsUGFyX3R1cGxlLE5VTEws UmVhbFBhcl90dXBUYWJsZS0+dHVwZGVzYyxjb25mcmVsaWQsc2xhdmVpZCk7CgoJCX0KCQlw ZnJlZShQYXJUYWJsZU5hbWUpOwoJCXBmcmVlKFdIRVJFKTsKCgl9CglyZXR1cm4gMDsKfQo= --------------dHdWa0soLj1rn1yGvu55FmCa Content-Type: text/x-log; charset=UTF-8; name="make.log" Content-Disposition: attachment; filename="make.log" Content-Transfer-Encoding: base64 Z2NjIC1XYWxsIC1XbWlzc2luZy1wcm90b3R5cGVzIC1XcG9pbnRlci1hcml0aCAtV2RlY2xh cmF0aW9uLWFmdGVyLXN0YXRlbWVudCAtV2Vycm9yPXZsYSAtV2VuZGlmLWxhYmVscyAtV21p c3NpbmctZm9ybWF0LWF0dHJpYnV0ZSAtV2ltcGxpY2l0LWZhbGx0aHJvdWdoPTMgLVdjYXN0 LWZ1bmN0aW9uLXR5cGUgLVdzaGFkb3c9Y29tcGF0aWJsZS1sb2NhbCAtV2Zvcm1hdC1zZWN1 cml0eSAtZm5vLXN0cmljdC1hbGlhc2luZyAtZndyYXB2IC1mZXhjZXNzLXByZWNpc2lvbj1z dGFuZGFyZCAtV25vLWZvcm1hdC10cnVuY2F0aW9uIC1Xbm8tc3RyaW5nb3AtdHJ1bmNhdGlv biAtTzIgLWZQSUMgLURQSUMgLWZ2aXNpYmlsaXR5PWhpZGRlbiAtSS4gLUkuLyAtSS91c3Iv bG9jYWwvcGdzcWwvaW5jbHVkZS9zZXJ2ZXIgLUkvdXNyL2xvY2FsL3Bnc3FsL2luY2x1ZGUv aW50ZXJuYWwgLUkvdXNyL2xvY2FsL2luY2x1ZGUgICAgIC1jIC1vIHBlbmRpbmcubyBwZW5k aW5nLmMKcGVuZGluZy5jOiBJbiBmdW5jdGlvbiAnc3RvcmVQZW5kaW5nJzoKcGVuZGluZy5j OjI0OToyNTogd2FybmluZzogdmFyaWFibGUgJ3RDdXJUdXBsZScgc2V0IGJ1dCBub3QgdXNl ZCBbLVd1bnVzZWQtYnV0LXNldC12YXJpYWJsZV0KICAyNDkgfCAgICAgICAgIEhlYXBUdXBs ZSAgICAgICB0Q3VyVHVwbGU7CiAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgXn5+ fn5+fn5+CkluIGZpbGUgaW5jbHVkZWQgZnJvbSAvdXNyL2xvY2FsL3Bnc3FsL2luY2x1ZGUv c2VydmVyL25vZGVzL2V4ZWNub2Rlcy5oOjM0LAogICAgICAgICAgICAgICAgIGZyb20gL3Vz ci9sb2NhbC9wZ3NxbC9pbmNsdWRlL3NlcnZlci9jb21tYW5kcy90cmlnZ2VyLmg6MTgsCiAg ICAgICAgICAgICAgICAgZnJvbSAvdXNyL2xvY2FsL3Bnc3FsL2luY2x1ZGUvc2VydmVyL2V4 ZWN1dG9yL3NwaS5oOjE2LAogICAgICAgICAgICAgICAgIGZyb20gcGVuZGluZy5jOjM2Ogpw ZW5kaW5nLmM6IEluIGZ1bmN0aW9uICdnZXRQcmltYXJ5S2V5JzoKL3Vzci9sb2NhbC9wZ3Nx bC9pbmNsdWRlL3NlcnZlci9mbWdyLmg6MjQxOjk6IHdhcm5pbmc6IHBhc3NpbmcgYXJndW1l bnQgMSBvZiAnRGF0dW1HZXRQb2ludGVyJyBtYWtlcyBpbnRlZ2VyIGZyb20gcG9pbnRlciB3 aXRob3V0IGEgY2FzdCBbLVdpbnQtY29udmVyc2lvbl0KICAyNDEgfCAgICAgICAgIHBnX2Rl dG9hc3RfZGF0dW0oKHN0cnVjdCB2YXJsZW5hICopIERhdHVtR2V0UG9pbnRlcihkYXR1bSkp CiAgICAgIHwgICAgICAgICBefn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+ fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgogICAgICB8ICAgICAgICAgfAogICAgICB8ICAgICAg ICAgc3RydWN0IHZhcmxlbmEgKgpwZW5kaW5nLmM6NDAyOjU0OiBub3RlOiBpbiBleHBhbnNp b24gb2YgbWFjcm8gJ1BHX0RFVE9BU1RfREFUVU0nCiAgNDAyIHwgICAgICAgICB0cFJlc3Vs dEtleSA9IChpbnQydmVjdG9yICopIERhdHVtR2V0UG9pbnRlcihQR19ERVRPQVNUX0RBVFVN KHJlc0RhdHVtKSk7CiAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICBefn5+fn5+fn5+fn5+fn5+CkluIGZpbGUgaW5jbHVkZWQg ZnJvbSBwZW5kaW5nLmM6MzQ6Ci91c3IvbG9jYWwvcGdzcWwvaW5jbHVkZS9zZXJ2ZXIvcG9z dGdyZXMuaDozMTc6MjM6IG5vdGU6IGV4cGVjdGVkICdEYXR1bScge2FrYSAnbG9uZyB1bnNp Z25lZCBpbnQnfSBidXQgYXJndW1lbnQgaXMgb2YgdHlwZSAnc3RydWN0IHZhcmxlbmEgKicK ICAzMTcgfCBEYXR1bUdldFBvaW50ZXIoRGF0dW0gWCkKICAgICAgfCAgICAgICAgICAgICAg ICAgfn5+fn5+XgpwZW5kaW5nLmM6NDAzOjk6IHdhcm5pbmc6IElTTyBDOTAgZm9yYmlkcyBt aXhlZCBkZWNsYXJhdGlvbnMgYW5kIGNvZGUgWy1XZGVjbGFyYXRpb24tYWZ0ZXItc3RhdGVt ZW50XQogIDQwMyB8ICAgICAgICAgaW50IG49dHBSZXN1bHRLZXktPmRpbTE7CiAgICAgIHwg ICAgICAgICBefn4KcGVuZGluZy5jOiBJbiBmdW5jdGlvbiAncGFja2FnZURhdGEnOgpwZW5k aW5nLmM6NTI3OjI1OiB3YXJuaW5nOiBJU08gQzkwIGZvcmJpZHMgbWl4ZWQgZGVjbGFyYXRp b25zIGFuZCBjb2RlIFstV2RlY2xhcmF0aW9uLWFmdGVyLXN0YXRlbWVudF0KICA1MjcgfCAg ICAgICAgICAgICAgICAgICAgICAgICBpbnQxNiAqdHBQS2V5c1YgPSB0cFBLZXlzLT52YWx1 ZXM7CiAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgXn5+fn4KcGVuZGluZy5jOjU1 MToyOTogZXJyb3I6ICdzdHJ1Y3QgVHVwbGVEZXNjRGF0YScgaGFzIG5vIG1lbWJlciBuYW1l ZCAnYXR0cnMnCiAgNTUxIHwgICAgICAgICAgICAgICAgaWYodFR1cGxlRGVzYy0+YXR0cnNb aUNvbHVtbkNvdW50ZXItMV0uYXR0aXNkcm9wcGVkKQogICAgICB8ICAgICAgICAgICAgICAg ICAgICAgICAgICAgICBefgpwZW5kaW5nLmM6NTcxOjcxOiBlcnJvcjogJ3N0cnVjdCBUdXBs ZURlc2NEYXRhJyBoYXMgbm8gbWVtYmVyIG5hbWVkICdhdHRycycKICA1NzEgfCAgICAgICAg ICAgICAgICAgY3BGaWVsZE5hbWUgPSBEYXR1bUdldFBvaW50ZXIoTmFtZUdldERhdHVtKCZ0 VHVwbGVEZXNjLT5hdHRyc1tpQ29sdW1uQ291bnRlciAtIDFdLmF0dG5hbWUpKTsKICAgICAg fCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgXn4KcGVuZGluZy5jOiBJbiBmdW5jdGlvbiAnaXNFeGNsdWRl ZCc6CnBlbmRpbmcuYzo2NjQ6MTc6IHdhcm5pbmc6IHZhcmlhYmxlICdTSURLRVlfcHJvY2Vz c2VkJyBzZXQgYnV0IG5vdCB1c2VkIFstV3VudXNlZC1idXQtc2V0LXZhcmlhYmxlXQogIDY2 NCB8ICAgICAgICAgaW50ICAgICBTSURLRVlfcHJvY2Vzc2VkOwogICAgICB8ICAgICAgICAg ICAgICAgICBefn5+fn5+fn5+fn5+fn5+CnBlbmRpbmcuYzogSW4gZnVuY3Rpb24gJ2hhbmRs ZXInOgpwZW5kaW5nLmM6NzI5OjIxOiB3YXJuaW5nOiB2YXJpYWJsZSAncmV0dmFsJyBzZXQg YnV0IG5vdCB1c2VkIFstV3VudXNlZC1idXQtc2V0LXZhcmlhYmxlXQogIDcyOSB8ICAgICAg ICAgICAgICAgICBpbnQgcmV0dmFsOwogICAgICB8ICAgICAgICAgICAgICAgICAgICAgXn5+ fn5+CnBlbmRpbmcuYzogSW4gZnVuY3Rpb24gJ2dldFNsYXZlSWQnOgpwZW5kaW5nLmM6OTI4 OjE3OiB3YXJuaW5nOiB2YXJpYWJsZSAnU0lES0VZX3Byb2Nlc3NlZCcgc2V0IGJ1dCBub3Qg dXNlZCBbLVd1bnVzZWQtYnV0LXNldC12YXJpYWJsZV0KICA5MjggfCAgICAgICAgIGludCAg ICAgU0lES0VZX3Byb2Nlc3NlZDsKICAgICAgfCAgICAgICAgICAgICAgICAgXn5+fn5+fn5+ fn5+fn5+fgpwZW5kaW5nLmM6IEluIGZ1bmN0aW9uICdnZXRDb21wdXRlZFNsYXZlSWQnOgpw ZW5kaW5nLmM6OTkzOjU6IHdhcm5pbmc6IHZhcmlhYmxlICdTSURLRVlfcHJvY2Vzc2VkJyBz ZXQgYnV0IG5vdCB1c2VkIFstV3VudXNlZC1idXQtc2V0LXZhcmlhYmxlXQogIDk5MyB8IGlu dCBTSURLRVlfcHJvY2Vzc2VkOwogICAgICB8ICAgICBefn5+fn5+fn5+fn5+fn5+CnBlbmRp bmcuYzogSW4gZnVuY3Rpb24gJ2dldE9sZENvbXB1dGVkU2xhdmVJZCc6CnBlbmRpbmcuYzox MTE5Ojc6IHdhcm5pbmc6IHVudXNlZCB2YXJpYWJsZSAnUGFyVGFibGVOYW1lJyBbLVd1bnVz ZWQtdmFyaWFibGVdCiAxMTE5IHwgY2hhciAqUGFyVGFibGVOYW1lOwogICAgICB8ICAgICAg IF5+fn5+fn5+fn5+fgpwZW5kaW5nLmM6MTExNjo1OiB3YXJuaW5nOiB2YXJpYWJsZSAnU0lE S0VZX3Byb2Nlc3NlZCcgc2V0IGJ1dCBub3QgdXNlZCBbLVd1bnVzZWQtYnV0LXNldC12YXJp YWJsZV0KIDExMTYgfCBpbnQgU0lES0VZX3Byb2Nlc3NlZDsKICAgICAgfCAgICAgXn5+fn5+ fn5+fn5+fn5+fgpwZW5kaW5nLmM6IEluIGZ1bmN0aW9uICdoYW5kbGVQYXJlbnRzJzoKL3Vz ci9sb2NhbC9wZ3NxbC9pbmNsdWRlL3NlcnZlci9mbWdyLmg6MjQxOjk6IHdhcm5pbmc6IHBh c3NpbmcgYXJndW1lbnQgMSBvZiAnRGF0dW1HZXRQb2ludGVyJyBtYWtlcyBpbnRlZ2VyIGZy b20gcG9pbnRlciB3aXRob3V0IGEgY2FzdCBbLVdpbnQtY29udmVyc2lvbl0KICAyNDEgfCAg ICAgICAgIHBnX2RldG9hc3RfZGF0dW0oKHN0cnVjdCB2YXJsZW5hICopIERhdHVtR2V0UG9p bnRlcihkYXR1bSkpCiAgICAgIHwgICAgICAgICBefn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+ fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgogICAgICB8ICAgICAgICAgfAog ICAgICB8ICAgICAgICAgc3RydWN0IHZhcmxlbmEgKgpwZW5kaW5nLmM6MTQ0NDo1Mzogbm90 ZTogaW4gZXhwYW5zaW9uIG9mIG1hY3JvICdQR19ERVRPQVNUX0RBVFVNJwogMTQ0NCB8ICAg ICAgICAgICAgICAgICBhcnIgPSAoQXJyYXlUeXBlICopIERhdHVtR2V0UG9pbnRlcihQR19E RVRPQVNUX0RBVFVNKHJlc0RhdHVtKSk7CiAgICAgIHwgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF5+fn5+fn5+fn5+fn5+fn4KL3Vzci9s b2NhbC9wZ3NxbC9pbmNsdWRlL3NlcnZlci9wb3N0Z3Jlcy5oOjMxNzoyMzogbm90ZTogZXhw ZWN0ZWQgJ0RhdHVtJyB7YWthICdsb25nIHVuc2lnbmVkIGludCd9IGJ1dCBhcmd1bWVudCBp cyBvZiB0eXBlICdzdHJ1Y3QgdmFybGVuYSAqJwogIDMxNyB8IERhdHVtR2V0UG9pbnRlcihE YXR1bSBYKQogICAgICB8ICAgICAgICAgICAgICAgICB+fn5+fn5eCnBlbmRpbmcuYzoxNDcy OjI1OiB3YXJuaW5nOiBJU08gQzkwIGZvcmJpZHMgbWl4ZWQgZGVjbGFyYXRpb25zIGFuZCBj b2RlIFstV2RlY2xhcmF0aW9uLWFmdGVyLXN0YXRlbWVudF0KIDE0NzIgfCAgICAgICAgICAg ICAgICAgICAgICAgICBjaGFyICp2YWx1ZSA9IFNQSV9nZXR2YWx1ZShBdHVwbGUsdHVwbGVE ZXNjLHRoaXNjb2xydW49U1BJX2ZudW1iZXIodHVwbGVEZXNjLGZvb25hbWUpKTsKICAgICAg fCAgICAgICAgICAgICAgICAgICAgICAgICBefn5+Ci91c3IvbG9jYWwvcGdzcWwvaW5jbHVk ZS9zZXJ2ZXIvZm1nci5oOjI0MTo5OiB3YXJuaW5nOiBwYXNzaW5nIGFyZ3VtZW50IDEgb2Yg J0RhdHVtR2V0UG9pbnRlcicgbWFrZXMgaW50ZWdlciBmcm9tIHBvaW50ZXIgd2l0aG91dCBh IGNhc3QgWy1XaW50LWNvbnZlcnNpb25dCiAgMjQxIHwgICAgICAgICBwZ19kZXRvYXN0X2Rh dHVtKChzdHJ1Y3QgdmFybGVuYSAqKSBEYXR1bUdldFBvaW50ZXIoZGF0dW0pKQogICAgICB8 ICAgICAgICAgXn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+ fn5+fn5+fn5+fn5+fn4KICAgICAgfCAgICAgICAgIHwKICAgICAgfCAgICAgICAgIHN0cnVj dCB2YXJsZW5hICoKcGVuZGluZy5jOjE1MDk6NTM6IG5vdGU6IGluIGV4cGFuc2lvbiBvZiBt YWNybyAnUEdfREVUT0FTVF9EQVRVTScKIDE1MDkgfCAgICAgICAgICAgICAgICAgYXJyID0g KEFycmF5VHlwZSAqKSBEYXR1bUdldFBvaW50ZXIoUEdfREVUT0FTVF9EQVRVTShyZXNEYXR1 bSkpOwogICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICBefn5+fn5+fn5+fn5+fn5+Ci91c3IvbG9jYWwvcGdzcWwvaW5jbHVkZS9z ZXJ2ZXIvcG9zdGdyZXMuaDozMTc6MjM6IG5vdGU6IGV4cGVjdGVkICdEYXR1bScge2FrYSAn bG9uZyB1bnNpZ25lZCBpbnQnfSBidXQgYXJndW1lbnQgaXMgb2YgdHlwZSAnc3RydWN0IHZh cmxlbmEgKicKICAzMTcgfCBEYXR1bUdldFBvaW50ZXIoRGF0dW0gWCkKICAgICAgfCAgICAg ICAgICAgICAgICAgfn5+fn5+XgpwZW5kaW5nLmM6MTUxMzozMzogd2FybmluZzogdmFyaWFi bGUgJ1BBUl9wcm9jZXNzZWQnIHNldCBidXQgbm90IHVzZWQgWy1XdW51c2VkLWJ1dC1zZXQt dmFyaWFibGVdCiAxNTEzIHwgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICBQQVJf cHJvY2Vzc2VkOwogICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXn5+ fn5+fn5+fn5+fgpwZW5kaW5nLmM6MTQzNDoyNTogd2FybmluZzogdmFyaWFibGUgJ3RoaXNh dHRfcHJvY2Vzc2VkJyBzZXQgYnV0IG5vdCB1c2VkIFstV3VudXNlZC1idXQtc2V0LXZhcmlh YmxlXQogMTQzNCB8ICAgICAgICAgICAgICAgICBpbnQgICAgIHRoaXNhdHRfcHJvY2Vzc2Vk OwogICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgIF5+fn5+fn5+fn5+fn5+fn5+CnBl bmRpbmcuYzoxNDMwOjI1OiB3YXJuaW5nOiB2YXJpYWJsZSAnUmVhbFBhcl9wcm9jZXNzZWQn IHNldCBidXQgbm90IHVzZWQgWy1XdW51c2VkLWJ1dC1zZXQtdmFyaWFibGVdCiAxNDMwIHwg ICAgICAgICAgICAgICAgIGludCAgICAgUmVhbFBhcl9wcm9jZXNzZWQ7CiAgICAgIHwgICAg ICAgICAgICAgICAgICAgICAgICAgXn5+fn5+fn5+fn5+fn5+fn4KcGVuZGluZy5jOiBJbiBm dW5jdGlvbiAnZ2V0UEt4cHJlc3MnOgpwZW5kaW5nLmM6MTY1MTo5OiB3YXJuaW5nOiBJU08g QzkwIGZvcmJpZHMgbWl4ZWQgZGVjbGFyYXRpb25zIGFuZCBjb2RlIFstV2RlY2xhcmF0aW9u LWFmdGVyLXN0YXRlbWVudF0KIDE2NTEgfCAgICAgICAgIGludDE2ICpwa1YgPSBway0+dmFs dWVzOwogICAgICB8ICAgICAgICAgXn5+fn4KcGVuZGluZy5jOiBJbiBmdW5jdGlvbiAndXBk YXRlQWNjbnRQYXJlbnRzJzoKL3Vzci9sb2NhbC9wZ3NxbC9pbmNsdWRlL3NlcnZlci9mbWdy Lmg6MjQxOjk6IHdhcm5pbmc6IHBhc3NpbmcgYXJndW1lbnQgMSBvZiAnRGF0dW1HZXRQb2lu dGVyJyBtYWtlcyBpbnRlZ2VyIGZyb20gcG9pbnRlciB3aXRob3V0IGEgY2FzdCBbLVdpbnQt Y29udmVyc2lvbl0KICAyNDEgfCAgICAgICAgIHBnX2RldG9hc3RfZGF0dW0oKHN0cnVjdCB2 YXJsZW5hICopIERhdHVtR2V0UG9pbnRlcihkYXR1bSkpCiAgICAgIHwgICAgICAgICBefn5+ fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+ fgogICAgICB8ICAgICAgICAgfAogICAgICB8ICAgICAgICAgc3RydWN0IHZhcmxlbmEgKgpw ZW5kaW5nLmM6MTgyNTo1Mzogbm90ZTogaW4gZXhwYW5zaW9uIG9mIG1hY3JvICdQR19ERVRP QVNUX0RBVFVNJwogMTgyNSB8ICAgICAgICAgICAgICAgICBhcnIgPSAoQXJyYXlUeXBlICop IERhdHVtR2V0UG9pbnRlcihQR19ERVRPQVNUX0RBVFVNKHJlc0RhdHVtKSk7CiAgICAgIHwg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF5+ fn5+fn5+fn5+fn5+fn4KL3Vzci9sb2NhbC9wZ3NxbC9pbmNsdWRlL3NlcnZlci9wb3N0Z3Jl cy5oOjMxNzoyMzogbm90ZTogZXhwZWN0ZWQgJ0RhdHVtJyB7YWthICdsb25nIHVuc2lnbmVk IGludCd9IGJ1dCBhcmd1bWVudCBpcyBvZiB0eXBlICdzdHJ1Y3QgdmFybGVuYSAqJwogIDMx NyB8IERhdHVtR2V0UG9pbnRlcihEYXR1bSBYKQogICAgICB8ICAgICAgICAgICAgICAgICB+ fn5+fn5eCnBlbmRpbmcuYzoxODQ2OjI1OiB3YXJuaW5nOiBJU08gQzkwIGZvcmJpZHMgbWl4 ZWQgZGVjbGFyYXRpb25zIGFuZCBjb2RlIFstV2RlY2xhcmF0aW9uLWFmdGVyLXN0YXRlbWVu dF0KIDE4NDYgfCAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICp2YWx1ZSA9IFNQSV9n ZXR2YWx1ZShCdHVwbGUsdHVwbGVEZXNjLHRoaXNjb2xydW49U1BJX2ZudW1iZXIodHVwbGVE ZXNjLGZvb25hbWUpKTsKICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICBefn5+Ci91 c3IvbG9jYWwvcGdzcWwvaW5jbHVkZS9zZXJ2ZXIvZm1nci5oOjI0MTo5OiB3YXJuaW5nOiBw YXNzaW5nIGFyZ3VtZW50IDEgb2YgJ0RhdHVtR2V0UG9pbnRlcicgbWFrZXMgaW50ZWdlciBm cm9tIHBvaW50ZXIgd2l0aG91dCBhIGNhc3QgWy1XaW50LWNvbnZlcnNpb25dCiAgMjQxIHwg ICAgICAgICBwZ19kZXRvYXN0X2RhdHVtKChzdHJ1Y3QgdmFybGVuYSAqKSBEYXR1bUdldFBv aW50ZXIoZGF0dW0pKQogICAgICB8ICAgICAgICAgXn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+ fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KICAgICAgfCAgICAgICAgIHwK ICAgICAgfCAgICAgICAgIHN0cnVjdCB2YXJsZW5hICoKcGVuZGluZy5jOjE4OTE6NTM6IG5v dGU6IGluIGV4cGFuc2lvbiBvZiBtYWNybyAnUEdfREVUT0FTVF9EQVRVTScKIDE4OTEgfCAg ICAgICAgICAgICAgICAgYXJyID0gKEFycmF5VHlwZSAqKSBEYXR1bUdldFBvaW50ZXIoUEdf REVUT0FTVF9EQVRVTShyZXNEYXR1bSkpOwogICAgICB8ICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBefn5+fn5+fn5+fn5+fn5+Ci91c3Iv bG9jYWwvcGdzcWwvaW5jbHVkZS9zZXJ2ZXIvcG9zdGdyZXMuaDozMTc6MjM6IG5vdGU6IGV4 cGVjdGVkICdEYXR1bScge2FrYSAnbG9uZyB1bnNpZ25lZCBpbnQnfSBidXQgYXJndW1lbnQg aXMgb2YgdHlwZSAnc3RydWN0IHZhcmxlbmEgKicKICAzMTcgfCBEYXR1bUdldFBvaW50ZXIo RGF0dW0gWCkKICAgICAgfCAgICAgICAgICAgICAgICAgfn5+fn5+XgpwZW5kaW5nLmM6MTg5 NTozMzogd2FybmluZzogdmFyaWFibGUgJ1BBUl9wcm9jZXNzZWQnIHNldCBidXQgbm90IHVz ZWQgWy1XdW51c2VkLWJ1dC1zZXQtdmFyaWFibGVdCiAxODk1IHwgICAgICAgICAgICAgICAg ICAgICAgICAgaW50ICAgICBQQVJfcHJvY2Vzc2VkOwogICAgICB8ICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgXn5+fn5+fn5+fn5+fgpwZW5kaW5nLmM6MTgxNDoyNTogd2Fy bmluZzogdmFyaWFibGUgJ3RoaXNhdHRfcHJvY2Vzc2VkJyBzZXQgYnV0IG5vdCB1c2VkIFst V3VudXNlZC1idXQtc2V0LXZhcmlhYmxlXQogMTgxNCB8ICAgICAgICAgICAgICAgICBpbnQg ICAgIHRoaXNhdHRfcHJvY2Vzc2VkOwogICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAg IF5+fn5+fn5+fn5+fn5+fn5+CnBlbmRpbmcuYzoxODEwOjI1OiB3YXJuaW5nOiB2YXJpYWJs ZSAnUmVhbFBhcl9wcm9jZXNzZWQnIHNldCBidXQgbm90IHVzZWQgWy1XdW51c2VkLWJ1dC1z ZXQtdmFyaWFibGVdCiAxODEwIHwgICAgICAgICAgICAgICAgIGludCAgICAgUmVhbFBhcl9w cm9jZXNzZWQ7CiAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgXn5+fn5+fn5+fn5+ fn5+fn4KZ21ha2U6ICoqKiBbPGJ1aWx0aW4+OiBwZW5kaW5nLm9dIEVycm9yIDEK --------------dHdWa0soLj1rn1yGvu55FmCa Content-Type: text/x-patch; charset=UTF-8; name="pending_changes_against_18beta1.patch" Content-Disposition: attachment; filename="pending_changes_against_18beta1.patch" Content-Transfer-Encoding: base64 ZGlmZiAtLWdpdCBhL2NvZGUvZGJtaXJyb3IvcGVuZGluZy5jIGIvY29kZS9kYm1pcnJvci9w ZW5kaW5nLmMKaW5kZXggZmNhNzYzMTguLmIxYzYxZTAyIDEwMDY0NAotLS0gYS9jb2RlL2Ri bWlycm9yL3BlbmRpbmcuYworKysgYi9jb2RlL2RibWlycm9yL3BlbmRpbmcuYwpAQCAtOTgs NyArOTgsNyBAQCBjaGFyICpnZXRfbmFtZXNwYWNlX25hbWUoT2lkIG5zcGlkKTsKIAogI2Rl ZmluZSBCVUZGRVJfU0laRSAyNTYKICNkZWZpbmUgTUFYX09JRF9MRU4gMTAKLS8vI2RlZmlu ZSBERUJVR19PVVRQVVQgMQorI2RlZmluZSBERUJVR19PVVRQVVQgMQogZXh0ZXJuIERhdHVt IHJlY29yZGNoYW5nZShQR19GVU5DVElPTl9BUkdTKTsKIAogUEdfRlVOQ1RJT05fSU5GT19W MShyZWNvcmRjaGFuZ2UpOwpAQCAtMzk5LDcgKzM5OSw4IEBAIGdldFByaW1hcnlLZXkoT2lk IHRibE9pZCkKIAkJcmV0dXJuIE5VTEw7CiAJfQogCi0JdHBSZXN1bHRLZXkgPSAoaW50MnZl Y3RvciAqKSBEYXR1bUdldFBvaW50ZXIoUEdfREVUT0FTVF9EQVRVTShyZXNEYXR1bSkpOwor CS8vdHBSZXN1bHRLZXkgPSAoaW50MnZlY3RvciAqKSBEYXR1bUdldFBvaW50ZXIoUEdfREVU T0FTVF9EQVRVTShyZXNEYXR1bSkpOworCXRwUmVzdWx0S2V5ID0gKGludDJ2ZWN0b3IgKikg UEdfREVUT0FTVF9EQVRVTShyZXNEYXR1bSk7CiAJaW50IG49dHBSZXN1bHRLZXktPmRpbTE7 CiAJcmVzdWx0S2V5ID0gcGFsbG9jKEludDJWZWN0b3JTaXplKG4pKTsKIAlpZiAobiA+IDAp CkBAIC01NDgsNyArNTQ5LDggQEAgcGFja2FnZURhdGEoY2hhciAqY3BUYWJsZU5hbWUsSGVh cFR1cGxlIHRUdXBsZURhdGEsIFR1cGxlRGVzYyB0VHVwbGVEZXNjLCBPaWQgdGEKIAkJfQkJ CQkJCS8qIEtleVVzYWdlIT1BTEwgKi8KICNpZm5kZWYgIE5PRFJPUENPTFVNTgogICAgICAg ICAgICAgICAgLy8gdGhpcyBjb21tZW50IGlzIGZvciAxMQotICAgICAgICAgICAgICAgaWYo dFR1cGxlRGVzYy0+YXR0cnNbaUNvbHVtbkNvdW50ZXItMV0uYXR0aXNkcm9wcGVkKQorICAg ICAgICAgICAgICAgLy8vL2lmKHRUdXBsZURlc2MtPmF0dHJzW2lDb2x1bW5Db3VudGVyLTFd LmF0dGlzZHJvcHBlZCkKKwkJaWYgKFR1cGxlRGVzY0F0dHIodFR1cGxlRGVzYyxpQ29sdW1u Q291bnRlci0xKS0+YXR0aXNkcm9wcGVkKQogICAgICAgICAgICAgICAgLy9pZih0VHVwbGVE ZXNjLT5hdHRyc1tpQ29sdW1uQ291bnRlci0xXS0+YXR0aXNkcm9wcGVkKQogICAgICAgICAg ICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLyoqCkBAIC01NjgsNyArNTcwLDggQEAg ZWtzYWlyZXRlYSBjb2x1bW5zCiAJCX0KIAogCQkvLyB0aGlzIGNvbW1lbnQgaXMgZm9yIDEx Ci0JCWNwRmllbGROYW1lID0gRGF0dW1HZXRQb2ludGVyKE5hbWVHZXREYXR1bSgmdFR1cGxl RGVzYy0+YXR0cnNbaUNvbHVtbkNvdW50ZXIgLSAxXS5hdHRuYW1lKSk7CisJCS8vLy9jcEZp ZWxkTmFtZSA9IERhdHVtR2V0UG9pbnRlcihOYW1lR2V0RGF0dW0oJnRUdXBsZURlc2MtPmF0 dHJzW2lDb2x1bW5Db3VudGVyIC0gMV0uYXR0bmFtZSkpOworCQljcEZpZWxkTmFtZSA9IE5h bWVTdHIoVHVwbGVEZXNjQXR0cih0VHVwbGVEZXNjLGlDb2x1bW5Db3VudGVyIC0gMSktPmF0 dG5hbWUgKTsKIAkJLy9jcEZpZWxkTmFtZSA9IERhdHVtR2V0UG9pbnRlcihOYW1lR2V0RGF0 dW0oJnRUdXBsZURlc2MtPmF0dHJzW2lDb2x1bW5Db3VudGVyIC0gMV0tPmF0dG5hbWUpKTsK ICNpZiBkZWZpbmVkIERFQlVHX09VVFBVVAogCQllbG9nKE5PVElDRSwgIkZpZWxkTmFtZTog JXMiLCBjcEZpZWxkTmFtZSk7CkBAIC0xNDQxLDcgKzE0NDQsOCBAQCBpbnQgaGFuZGxlUGFy ZW50cyhjaGFyICpjcFRhYmxlTmFtZSxIZWFwVHVwbGUgQnR1cGxlLEhlYXBUdXBsZSBBdHVw bGUsIFR1cGxlRGVzYwogCQljb25mcmVsaWQgPSAoT2lkKSBEYXR1bUdldE9iamVjdElkKHJl c0RhdHVtKTsKIAogCQlyZXNEYXR1bSA9IFNQSV9nZXRiaW52YWwocmVzVHVwbGUsRktfdHVw VGFibGUtPnR1cGRlc2MsMiwmaXNOdWxsKTsKLQkJYXJyID0gKEFycmF5VHlwZSAqKSBEYXR1 bUdldFBvaW50ZXIoUEdfREVUT0FTVF9EQVRVTShyZXNEYXR1bSkpOworCQkvL2FyciA9IChB cnJheVR5cGUgKikgRGF0dW1HZXRQb2ludGVyKFBHX0RFVE9BU1RfREFUVU0ocmVzRGF0dW0p KTsKKwkJYXJyID0gKEFycmF5VHlwZSAqKSBQR19ERVRPQVNUX0RBVFVNKHJlc0RhdHVtKTsK IAkJdGhpc0NvbHMgPSAoaW50MTYgKilBUlJfREFUQV9QVFIoYXJyKTsKIAkJbnVtT2ZDb2xz PUFSUl9ESU1TKGFycilbMF07CiAjaWYgZGVmaW5lZCBERUJVR19PVVRQVVQKQEAgLTE1MDYs NyArMTUxMCw4IEBAIGludCBoYW5kbGVQYXJlbnRzKGNoYXIgKmNwVGFibGVOYW1lLEhlYXBU dXBsZSBCdHVwbGUsSGVhcFR1cGxlIEF0dXBsZSwgVHVwbGVEZXNjCiAjZW5kaWYKIAkJaWYg KEZrSGFzTnVsbFZhbHVlT1JYY2x1ZGVkIHx8ICFoYW5kbGVpdCkgY29udGludWU7CiAJCXJl c0RhdHVtID0gU1BJX2dldGJpbnZhbChyZXNUdXBsZSxGS190dXBUYWJsZS0+dHVwZGVzYywz LCZpc051bGwpOwotCQlhcnIgPSAoQXJyYXlUeXBlICopIERhdHVtR2V0UG9pbnRlcihQR19E RVRPQVNUX0RBVFVNKHJlc0RhdHVtKSk7CisJCS8vYXJyID0gKEFycmF5VHlwZSAqKSBEYXR1 bUdldFBvaW50ZXIoUEdfREVUT0FTVF9EQVRVTShyZXNEYXR1bSkpOworCQlhcnIgPSAoQXJy YXlUeXBlICopIFBHX0RFVE9BU1RfREFUVU0ocmVzRGF0dW0pOwogCQlma0NvbHMgPSAoaW50 MTYgKilBUlJfREFUQV9QVFIoYXJyKTsKIAkJZm9yIChydW49ZmtDb2xzLGNvbHJ1bj0wO2Nv bHJ1bjxudW1PZkNvbHM7cnVuKyssY29scnVuKyspIHsKIAkJCVNQSVR1cGxlVGFibGUgKlBB Ul90dXBUYWJsZTsKQEAgLTE4MjIsNyArMTgyNyw4IEBAIGludCB1cGRhdGVBY2NudFBhcmVu dHMoY2hhciAqY3BUYWJsZU5hbWUsSGVhcFR1cGxlIEJ0dXBsZSxIZWFwVHVwbGUgQXR1cGxl LCBUdXBsCiAJCWNvbmZyZWxpZCA9IChPaWQpIERhdHVtR2V0T2JqZWN0SWQocmVzRGF0dW0p OwogCiAJCXJlc0RhdHVtID0gU1BJX2dldGJpbnZhbChyZXNUdXBsZSxGS190dXBUYWJsZS0+ dHVwZGVzYywyLCZpc051bGwpOwotCQlhcnIgPSAoQXJyYXlUeXBlICopIERhdHVtR2V0UG9p bnRlcihQR19ERVRPQVNUX0RBVFVNKHJlc0RhdHVtKSk7CisJCS8vYXJyID0gKEFycmF5VHlw ZSAqKSBEYXR1bUdldFBvaW50ZXIoUEdfREVUT0FTVF9EQVRVTShyZXNEYXR1bSkpOworCQlh cnIgPSAoQXJyYXlUeXBlICopIFBHX0RFVE9BU1RfREFUVU0ocmVzRGF0dW0pOwogCQl0aGlz Q29scyA9IChpbnQxNiAqKUFSUl9EQVRBX1BUUihhcnIpOwogCQludW1PZkNvbHM9QVJSX0RJ TVMoYXJyKVswXTsKIAkJZm9yIChydW49dGhpc0NvbHMsY29scnVuPTA7Y29scnVuPG51bU9m Q29scztydW4rKyxjb2xydW4rKykgIHsKQEAgLTE4ODgsNyArMTg5NCw4IEBAIGludCB1cGRh dGVBY2NudFBhcmVudHMoY2hhciAqY3BUYWJsZU5hbWUsSGVhcFR1cGxlIEJ0dXBsZSxIZWFw VHVwbGUgQXR1cGxlLCBUdXBsCiAJCQogCQkKIAkJcmVzRGF0dW0gPSBTUElfZ2V0YmludmFs KHJlc1R1cGxlLEZLX3R1cFRhYmxlLT50dXBkZXNjLDMsJmlzTnVsbCk7Ci0JCWFyciA9IChB cnJheVR5cGUgKikgRGF0dW1HZXRQb2ludGVyKFBHX0RFVE9BU1RfREFUVU0ocmVzRGF0dW0p KTsKKwkJLy9hcnIgPSAoQXJyYXlUeXBlICopIERhdHVtR2V0UG9pbnRlcihQR19ERVRPQVNU X0RBVFVNKHJlc0RhdHVtKSk7CisJCWFyciA9IChBcnJheVR5cGUgKikgUEdfREVUT0FTVF9E QVRVTShyZXNEYXR1bSk7CiAJCWZrQ29scyA9IChpbnQxNiAqKUFSUl9EQVRBX1BUUihhcnIp OwogCQlmb3IgKHJ1bj1ma0NvbHMsY29scnVuPTA7Y29scnVuPG51bU9mQ29scztydW4rKyxj b2xydW4rKykgewogCQkJU1BJVHVwbGVUYWJsZSAqUEFSX3R1cFRhYmxlOwo= --------------dHdWa0soLj1rn1yGvu55FmCa--