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.96) (envelope-from ) id 1wgE2c-0061qp-0T for pgsql-hackers@arkaria.postgresql.org; Sun, 05 Jul 2026 04:01:15 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.96) (envelope-from ) id 1wgE1Z-00BMOC-2h for pgsql-hackers@arkaria.postgresql.org; Sun, 05 Jul 2026 04:00:10 +0000 Received: from makus.postgresql.org ([2001:4800:3e1:1::229]) by malur.postgresql.org with utf8esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.96) (envelope-from <44973863@qq.com>) id 1wgD9h-00BLO1-2e for pgsql-hackers@lists.postgresql.org; Sun, 05 Jul 2026 03:04:31 +0000 Received: from out162-62-57-49.mail.qq.com ([162.62.57.49]) by makus.postgresql.org with utf8esmtps (TLS1.2) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.98.2) (envelope-from <44973863@qq.com>) id 1wgD9Y-00000001Z3C-27av for pgsql-hackers@lists.postgresql.org; Sun, 05 Jul 2026 03:04:28 +0000 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=qq.com; s=s201512; t=1783220651; bh=RR3XbhK05Zfleg5t+4GyNCSfvwdVn1jJbGBAu02mB5Q=; h=From:To:Cc:Subject:Date:References:In-Reply-To; b=V/9hn1I3mZP7z/N0aCHy5szNBau3YMuyBx0g4Qj+ElzzTvBsKSqt0ZE1ELaiQ+4Hx 3SoWX6t1d/lJk0KSfWzX5UeSEb3XZvVneEwJVzn31LoYRCBnS8JVNP1ld2N67osv/4 IFDh7NRhVNYnX81XIc3XUQWIdpbEaMunliiSYsNw= X-QQ-XMRINFO: OWPUhxQsoeAVwkVaQIEGSKwwgKCxK/fD5g== X-QQ-XMAILINFO: NeAn+xacksH+fCN00QnbQA77D0Hbq14Wl+BloFjNh1K849HNYTXiC4x/ZS1HSr 50wQj9zAlvrW6hbPxmuOZFYKPImCukR1pvASEaCPq3X0Ah/kn9qR3FTaz1tPB2NhKUrPTYWYfo1oG fzAYfzTTOMF1lWOTs1RV/fwEVSYnrU5Bs70UqcMnfDTiCbU+gnU/vZG5wIFxROkYenn5QkYim9qIc gJqpeCqMYy2J1oAOgGLHvw2kvlg41Lnogmfhd8Z61ClF/q3EjXLTqfh11LNXdK53RW2nvnl8k5Tpi B5OWEOC82lskLM14XQWzqiO48XnoynVUlil11dyDLVAueBHzq9xU/aLHlT8cHa2stUVs/fK4gNEMe ZCdsUyERlKHVulTY/lvIJ89HsHdStdrDZE/4LQIut6E6LFZmcQycw41hnZrwWhvlAylhQ+1F3c69r 6dVrANRa556ucXTth4FQ8t6dRQcNtUShphfddF5d9Ce3SoZqXQtBmcaUykYCxUTt+MfSBqazT/tQQ ZSQsCxoiUgKv2qncVhL28pHfSqJKvTWrEeBWwk12KdwFa0KCDngtIp+KVe6mJbDzrZQP7Bn5wbuge XaXnms17fhJHB4+8MkkWjj3bZqD86BiG4tS79MFRFf/DGA4VwKd1snQ8BCSI9eNzzBT2v/aKDd/v8 2FXmLtnUO/xJuYY8Angv71lw+WPxNk+K+HsezPUtGkN5KqKlJNvY1CpHto/Hxu2CZWzwlAuzlJT7a G+5CDBvXcOsfbVt5L29/9pUgeUvdPkTBDo4qsmCF87yW98YScDRd1gC52/5Ia3OH9gVroKjcJJ9r3 425fucUWA+GwdjewBMfmhR06ZT55xQbB9TNS8OsmvvBOSstC31FwbuM2kx/IfRMbTfvWHaDjuqDTm ewe7fD7+g4Iyg1E7913Flg1yNHFDX/xZOEGRgBYfpyTrBFel9U33PogNNar8tsF3a2UEA9tiQdaSf vwA1OAFLVEtYDF9bzb/7Lq9e2i3xwTqpCbg6pW9/rALht/+xFStyIStSaODZxbvVeLW+NyBexo5dY NPnoqJgr1Pa6bgEcFi0MJhMmh/kCdlbC5+ZEE3i3iIKhi3nEGyQELH/8KFCcplwn0ZHxBPqVgtZht ZeyTdPv9nTzKLlxYcCpU1/ICwfZdqnEGgRusBYYxPEQCn1rIVqpJ+Uta From: "=?utf-8?B?Wml6aHVhbkxpdSBYLU1BTg==?=" <44973863@qq.com> To: "=?utf-8?B?amlhbiBoZQ==?=" , "=?utf-8?B?UGV0ZXIgRWlzZW50cmF1dA==?=" , "=?utf-8?B?cGdzcWwtaGFja2Vycw==?=" Cc: "=?utf-8?B?Q29yZXkgSHVpbmtlcg==?=" , "=?utf-8?B?VG9tIExhbmU=?=" , "=?utf-8?B?Y2hlbmdwZW5nX3lhbg==?=" , "=?utf-8?B?Z3VvZmVuZ2xpbnV4?=" , "=?utf-8?B?5oiR6Ieq5bex55qE6YKu566x?=" <44973863@qq.com> Subject: Re: support create index on virtual generated column. Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="----=_NextPart_6A49C9A9_E0657D40_6AAF3ADB" Content-Transfer-Encoding: 8Bit Date: Sun, 5 Jul 2026 11:04:09 +0800 X-Priority: 3 Message-ID: X-QQ-MIME: TCMime 1.0 by Tencent X-Mailer: QQMail 2.x X-QQ-Mailer: QQMail 2.x References: <1178617.1753217685@sss.pgh.pa.us> In-Reply-To: X-QQ-mid: xmsezb43-0t1783220649tzrgi2hqo 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. ------=_NextPart_6A49C9A9_E0657D40_6AAF3ADB Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Pk9uIEZyaSwgTWFyIDEzLCAyMDI2IGF0IDEwOjAxP1BNIFBldGVyIEVpc2VudHJhdXQgPHBl dGVyQGVpc2VudHJhdXQub3JnPiB3cm90ZToKPj4KPj4gSSB0aGluayB5b3UgY291bGQgZG8g YSBtdWNoIHNpbXBsZXIgaW5pdGlhbCB2ZXJzaW9uIG9mIHRoaXMgaWYgeW91IGp1c3QKPj4g c3VwcG9ydGVkIHZpcnR1YWwgZ2VuZXJhdGVkIGNvbHVtbnMgaW4gZXhwcmVzc2lvbiBpbmRl eGVzLiAgQW5kIHRoZW4KPj4gcHJvaGliaXQgU0VUIEVYUFJFU1NJT04gaWYgdGhlIGNvbHVt biBpcyB1c2VkIGluIGFuIGluZGV4LiAgVGhlbiB5b3UKPj4gZG9uJ3QgbmVlZCB0byB3b3Jy eSBhYm91dCBpbmRleCByZWJ1aWxkaW5nLCBBTFRFUiBUQUJMRSByZWN1cnNpb24sIG5ldwo+ PiBjYXRhbG9nIGNvbHVtbnMsIGFuZCBhbGwgdGhhdC4KPj4KPgo+Q1JFQVRFIFRBQkxFIGd0 ZXN0MjJjIChhIGludCwgYiBpbnQgR0VORVJBVEVEIEFMV0FZUyBBUyAoYSkgVklSVFVBTCk7 Cj5DUkVBVEUgSU5ERVggZ3Rlc3QyMmNfYV9pZHggT04gZ3Rlc3QyMmMgKGEpOwo+Q1JFQVRF IElOREVYIGd0ZXN0MjJjX2JfaWR4IE9OIGd0ZXN0MjJjIChiKTsKPgo+SWYgd2UgZG9uJ3Qg YWRkIGEgbmV3IGNhdGFsb2cgY29sdW1uIChqdXN0IGEgc2luZ2xlIGJvb2xlYW4KPmluZGlz dmlydHVhbCBpcyBub3QgZW5vdWdoLCBpIHRoaW5rKSwKPmhvdyBjYW4gd2UgZGlzdGluZ3Vp c2ggYmV0d2VlbiB0aGUgZ3Rlc3QyMmNfYV9pZHggYW5kIGd0ZXN0MjJjX2JfaWR4Cj5pbmRl eGVzIGluIHRoZSBleGFtcGxlIGFib3ZlPwo+Cj5JZiBDUkVBVEUgSU5ERVggc2ltcGx5IGV4 cGFuZHMgdGhlIHZpcnR1YWwgZ2VuZXJhdGVkIGNvbHVtbiBleHByZXNzaW9uCj53aXRob3V0 IGRlcGVuZGVuY3kgdHJhY2tpbmcsIHRoYXQgd291bGQgYmUgcXVpdGUgZWFzeSwgc2VlIHRo ZQo+YXR0YWNoZWQgdjguCj5JZiBzbywgd2UgbmVlZCB0byBleHBsaWNpdGx5IGRvY3VtZW50 IHRoYXQgU0VUIEVYUFJFU1NJT04gaGFzIG5vCj5lZmZlY3Qgb24gZXhpc3RpbmcgaW5kZXhl cyB0aGF0IG9yaWdpbmFsbHkgcmVmZXJlbmNlZCB0aGUgdmlydHVhbAo+Z2VuZXJhdGVkIGNv bHVtbiB3aGVuIENSRUFURSBJTkRFWCB3YXMgdXNlZC4KPgo+PiBCdXQgdGhlcmUgaXMgYSBj b21tZW50IGluIERlZmluZUluZGV4KCk6Cj4+Cj4+ICAgICAgLyoKPj4gICAgICAgKiBYWFgg VmlydHVhbCBnZW5lcmF0ZWQgY29sdW1ucyBpbiBpbmRleCBleHByZXNzaW9ucyBvciBwcmVk aWNhdGVzCj4+ICAgICAgICogY291bGQgYmUgc3VwcG9ydGVkLCBidXQgaXQgbmVlZHMgc3Vw cG9ydCBpbgo+PiAgICAgICAqIFJlbGF0aW9uR2V0SW5kZXhFeHByZXNzaW9ucygpIGFuZCBS ZWxhdGlvbkdldEluZGV4UHJlZGljYXRlKCkuCj4+ICAgICAgICovCj4+Cj4+IHdoaWNoIHlv dSBkZWxldGUsIGJ1dCB5b3UgZG9uJ3QgbWFrZSBhbnkgY2hhbmdlcyB0byB0aG9zZSBtZW50 aW9uZWQKPj4gZnVuY3Rpb25zLiAgTWF5YmUgdGhlIGNvbW1lbnQgaXMgd3JvbmcsIGluIHdo aWNoIGNhc2UsIGxldCdzIGRpc2N1c3MKPj4gdGhhdCBhbmQgZml4IGl0LiAgKElmIHRoZSBj b21tZW50IGlzIGluZGVlZCB3cm9uZywgdGhlbiB0aGUgZmVhdHVyZQo+PiBtaWdodCBldmVu IGJlIHZlcnkgZWFzeS4pCj4+Cj4KPkkgZG9uJ3QgdGhpbmsgaXQncyBhIGdvb2QgaWRlYSB0 byBzdG9yZSB0aGUgdmlydHVhbCBnZW5lcmF0ZWQgY29sdW1ucwo+YXMgaXMgaW4gRm9ybV9w Z19pbmRleC0+aW5ka2V5Cj5iZWNhdXNlIEluZGV4SW5mby0+aWlfSW5kZXhBdHRyTnVtYmVy cyBhbmQgRm9ybS0+cGdfaW5kZXgtPmluZGtleSBhcmUKPnJlZmVyZW5jZWQgaW4gdG9vIG1h bnkgcGxhY2VzIChzZWUgQnVpbGRJbmRleEluZm8pLgo+Rm9yIGV2ZXJ5IHNpbmdsZSBvY2N1 cnJlbmNlIG9mIG5ka2V5LnZhbHVlc1tpXSwgd2UgbmVlZCB0byBjb25zaWRlcgo+d2hldGhl ciBpdCdzIG9rIGZvciBpdCBiZSBhIHZpcnR1YWwgZ2VuZXJhdGVkIGNvbHVtbi4KPkluc3Rl YWQsIEFudW1fcGdfaW5kZXhfaW5kZXhwcnMgYW5kIEFudW1fcGdfaW5kZXhfaW5kcHJlZCBz dG9yZSB0aGUKPmV4cHJlc3Npb25zIGFmdGVyIHRoZSB2aXJ0dWFsIGdlbmVyYXRlZCBjb2x1 bW5zIGV4cGFuc2lvbiwKPnRoZW4gd2UgZG9uJ3QgbmVlZCB0byB3b3JyeSBhYm91dCBGb3Jt X3BnX2luZGV4LT5pbmRrZXkudmFsdWVzW2ldIGlzCj52aXJ0dWFsIGdlbmVyYXRlZCBjb2x1 bW4gb3Igbm90Lgo+Cj5UaGVyZWZvcmUsIGkgdGhpbmsgUmVsYXRpb25HZXRJbmRleEV4cHJl c3Npb25zIGFuZAo+UmVsYXRpb25HZXRJbmRleFByZWRpY2F0ZSBkb24ndCBuZWVkIHRvCj5k ZWFsIHdpdGggdmlydHVhbCBnZW5lcmF0ZWQgY29sdW1uIGV4cHJlc3Npb25zIGF0IGFsbC4K Pk92ZXJhbGwsIEkgdGhpbmsgdGhlIGNvbW1lbnQgYWJvdmUgaXMgd3JvbmcuCj4KPgo+Cj4t LQo+amlhbgo+aHR0cHM6Ly93d3cuZW50ZXJwcmlzZWRiLmNvbS8KCgpIaSwgaGFja2VycwoK UXVpY2sgZ2xvc3Nhcnk6ClZHQyA9IHZpcnR1YWwgZ2VuZXJhdGVkIGNvbHVtbnMKU0dDID0g c3RvcmVkIGdlbmVyYXRlZCBjb2x1bW5zCgojIyMgMS4gSXRlcmF0aW9uIG9mIGltcGxlbWVu dGF0aW9uIGF0dGVtcHRzCkkgZmlyc3QgZHJhZnRlZCBWMDogbm8gVkdDIGV4cGFuc2lvbiBk dXJpbmcgaW5kZXggY3JlYXRpb24sIG9ubHkgdGVtcG9yYXJ5IGV4cGFuc2lvbiBhdCBydW50 aW1lLiAKVGhlIHNjb3BlIG9mIHJlcXVpcmVkIGNoYW5nZXMga2VwdCBleHBhbmRpbmcgKHNl ZSBgdjAucGF0Y2gudHh0YCksIHNvIEkgYWJhbmRvbmVkIHRoaXMgYXBwcm9hY2guCgpOZXh0 IEkgdHJpZWQgVjEsIGV4cGFuZGluZyBWR0NzIGRpcmVjdGx5IG9uIGluZGV4IGNyZWF0aW9u IHRvIHN1cHBvcnQgVkdDIGluIGluZGV4IGV4cHJlc3Npb25zLApgSU5DTFVERWAgY29sdW1u cyBhbmQgcGFydGlhbCBpbmRleCBgV0hFUkVgIGNsYXVzZXMuIFVuZm9ydHVuYXRlbHkgdGhp cyB3b3VsZCBicmVhayBtZXRhZGF0YQpjYXRhbG9nIGltbXV0YWJpbGl0eS4gQmVmb3JlIGZp bmFsaXppbmcgdGhlIHBhdGNoIChzZWUgYHYxLnBhdGNoLnR4dGApLCBJIGZvdW5kIHByaW9y IGNvbW11bml0eQpkaXNjdXNzaW9ucyBhbmQgcHJvdG90eXBlIGF0dGVtcHRzIHdpdGggc2V2 ZXJhbCBtYWpvciBkZXNpZ24gcmV2aXNpb25zOgpodHRwczovL3Bvc3Rnci5lcy9tL0NBQ0p1 ZnhHYW8tY3lwZE5oaWZIQWR0OGpIZks2LUhYPXRSQm92QmtnUnV4dzA2M0dhQUBtYWlsLmdt YWlsLmNvbQpodHRwczovL3Bvc3Rnci5lcy9tL0NBQ0p1ZnhHZ2tIMFB5eXFQNmdncWNFV0h4 Wnpta1Y9cHVZOGFkPXM4a2lzc3M5TUF3Z0BtYWlsLmdtYWlsLmNvbQpodHRwczovL3Bvc3Rn ci5lcy9tLzE4OTcwLWE3ZDFjZmUxZjhkNWQ4ZDlAcG9zdGdyZXNxbC5vcmcKaHR0cHM6Ly93 d3cucG9zdGdyZXNxbC5vcmcvbWVzc2FnZS1pZC9mbGF0L0NBQ0p1ZnhFeGU3JTJCR2g1TUtN RmlONXh3d21QWGFhWkMxampRT0Z1b3Z2OFE3YjFMZ0Z3JTQwbWFpbC5nbWFpbC5jb20jZGUx NTQxMDQ4ZjBkODI1NzI0OGU3ZWI5Y2JiNGE0NDAKaHR0cHM6Ly93d3cucG9zdGdyZXNxbC5v cmcvbWVzc2FnZS1pZC9mbGF0L0NBQ0p1ZnhHZ2tIMFB5eXFQNmdncWNFV0h4Wnpta1YlM0Rw dVk4YWQlM0RzOGtpc3NzOU1Bd2clNDBtYWlsLmdtYWlsLmNvbSM2ZmUzOGVlMjA1M2FmMWFj MDI1YjFmOGQ5MjYxYTE2OApodHRwczovL2NvbW1pdGZlc3QucG9zdGdyZXNxbC5vcmcvcGF0 Y2gvNTY2NwpodHRwczovL2NvbW1pdGZlc3QucG9zdGdyZXNxbC5vcmcvcGF0Y2gvNjA5NC8K aHR0cHM6Ly93d3cucG9zdGdyZXNxbC5vcmcvbWVzc2FnZS1pZC9mbGF0L0NBTWJXczQ4MTFu RzN3XzNzTHhwcyUyQkVBdVVzZmZBXzgzWlEtMWFjRUhfalFlcTExN21nJTQwbWFpbC5nbWFp bC5jb20KCgpJIHRoZW4gcmVkZXNpZ25lZCBmb3IgVjIuIERldmVsb3BpbmcgdGhpcyB2ZXJz aW9uIG1hZGUgaXQgY2xlYXIgaG93IGNvbXBsZXggdGhlIGZlYXR1cmUgaXMuIEV2ZXJ5IGNo YW5nZQp3YXMgcmV2aWV3ZWQgZm9yIGxvY2FsIGJlaGF2aW9yIHBsdXMgdXBzdHJlYW0vZG93 bnN0cmVhbSBpbXBhY3RzLCB0aG91Z2ggc29tZSBlZGdlIGNhc2VzIG1heSBzdGlsbCBiZSBv dmVybG9va2VkLgoKIyMjIDIuIENvcmUgZGVzaWduIHByaW5jaXBsZXMKMS4gKipHb2FsKio6 IEVuYWJsZSBWR0Mgc3VwcG9ydCBmb3IgcmVndWxhciBpbmRleCBjb2x1bW5zLCBleHByZXNz aW9uIGNvbHVtbnMsIGBJTkNMVURFYCBjb2x1bW5zIGFuZCBjb2x1bW5zIHVzZWQKaW4gcGFy dGlhbCBpbmRleCBwcmVkaWNhdGVzLgoKMi4gKipJbW11dGFibGUgbWV0YWRhdGEgY2F0YWxv ZyoqOiBXZSBtdXN0IG5vdCBhbHRlciBleGlzdGluZyBjYXRhbG9nIGVudHJpZXMoc2VlIHYy LVNRTF90ZXN0X3Jlc3VsdC54bHN4KS4gVkdDcyBhcmUKYmVuY2htYXJrZWQgYWdhaW5zdCBT R0NzIHRvIGd1YXJhbnRlZSBubyByZWdyZXNzaW9ucyBmb3IgaW5kZXggcmVidWlsZCwgbG9n aWNhbCByZXBsaWNhdGlvbiwgaW5kZXggY29tcGFyaXNvbiwgc3RhdHMKY29sbGVjdGlvbiBh bmQgYHBnX2R1bXBgLgoKMy4gKipSdW50aW1lIGV4cGFuc2lvbiByZXF1aXJlZCoqOiBUaGUg cGFyc2VyIGV4cGFuZHMgVkdDcyBkdXJpbmcgcXVlcnkgYW5hbHlzaXMsIHdoaWxlIFNHQ3Mg YXJlIHN0b3JlZCB1bmV4cGFuZGVkCmF0IGluZGV4IGNyZWF0aW9uLiBXaXRob3V0IHJ1bnRp bWUgZXhwYW5zaW9uLCB0aGUgcGxhbm5lciBjYW5ub3QgcHJvcGVybHkgc2VsZWN0IGFjY2Vz cyBwYXRocywgc29ydCBzdHJhdGVnaWVzIG9yIHBhcnRpYWwgaW5kZXhlcy4KCkkgYWRkZWQg cGFpcmVkIGV4cGFuZCBmaWVsZHMgYW5kIGhlbHBlciBmdW5jdGlvbnMgdG8gYEluZGV4SW5m b2AsIGBSZWxhdGlvbkRhdGFgIGFuZCBgSW5kZXhPcHRJbmZvYC4gRXhwYW5kZWQgZXhwcmVz c2lvbnMKYXJlIGJ1aWx0IG9uY2UgaW5zdGVhZCBvZiBkeW5hbWljYWxseSBvbiBlYWNoIGFj Y2VzcywgaGVuY2UgcGFpcmVkIGNvZGUgcGF0aHMgZm9yIHJhdyBhbmQgZXhwYW5kZWQgZmll bGRzLgoKNC4gSSB1cGRhdGVkIGNvbW1lbnRzIGZvciBgQ29tcHV0ZUluZGV4QXR0cnMoKWAg YW5kIGBtYWtlSW5kZXhJbmZvKClgLiBUaGVzZSBmdW5jdGlvbnMgcmVtYWluIHVubW9kaWZp ZWQ7IHdlIGV4cGFuZAp0aGUgbmV3IGZpZWxkcyByaWdodCBhZnRlciBjYWxsaW5nIHRoZW0g Zm9yIGxhdGVyIGFjY2VzcyBzYWZldHkuCgo1LiBNYWpvciBjaGFuZ2VzIHRvIGBGb3JtSW5k ZXhEYXR1bWA6IFZHQyB2YWx1ZXMgYXJlIGNvbXB1dGVkIG9uIHRoZSBmbHkgdmlhIGV4cGFu ZGVkIGV4cHJlc3Npb25zIGFuZCBzdG9yZWQgaW5pbmRleAp0dXBsZXMsIGJlaGF2aW5nIGxp a2UgU0dDcyB0byBzdXBwb3J0IGluZGV4IGtleSBldmFsdWF0aW9uLCBJTkNMVURFIGNvbHVt bnMsIGV4cHJlc3Npb24gaW5kZXhlcywgYW5kIHBhcnRpYWwgaW5kZXggbWF0Y2hpbmcuCgoj IyMgMy4gTWFpbiBjaGFsbGVuZ2UKVGhlIG1vc3QgdHJpY2t5IHBhcnQgaXMgZGlzdGluZ3Vp c2hpbmcgd2hpY2ggY29kZSBwYXRocyBzaG91bGQgdXNlIHJhdyBub24tZXhwYW5kZWQgbm9k ZXMgdmVyc3VzIGV4cGFuZGVkIG9uZXMsCndoaWNoIGNvbnN1bWVkIG1vc3Qgb2YgbXkgZGV2 ZWxvcG1lbnQgZWZmb3J0LgoKIyMjIDQuIENvZGUgcmV2aWV3IHNjb3BlCkkgYXVkaXRlZCBh bGwgY29kZSBwYXRocyBmb3IgdGhlIGZvbGxvd2luZyBmdW5jdGlvbnMvZmllbGRzIHRvIGNo b29zZSBleHBhbnNpb24gbW9kZSBhbmQgYXNzZXNzIHNpZGUgZWZmZWN0czoKbWFrZUluZGV4 SW5mb3xpbmRwcmVkRXhwYW5kfGluZHByZWR8aW5kZXhwcnNFeHBhbmR8aW5kZXhwcnN8aWlf UHJlZGljYXRlU3RhdGV8aWlfUHJlZGljYXRlRXhwYW5kU3RhdGV8CmlpX1ByZWRpY2F0ZUV4 cGFuZHxpaV9QcmVkaWNhdGV8aWlfRXhwcmVzc2lvbnNTdGF0ZXxpaV9FeHByZXNzaW9uc0V4 cGFuZFN0YXRlfGlpX0V4cHJlc3Npb25zRXhwYW5kfGlpX0V4cHJlc3Npb25zfApSZWxhdGlv bkdldEluZGV4UHJlZGljYXRlRXhwYW5kIHxSZWxhdGlvbkdldEluZGV4UHJlZGljYXRlfFJl bGF0aW9uR2V0SW5kZXhFeHByZXNzaW9uc0V4cGFuZHwKUmVsYXRpb25HZXRJbmRleEV4cHJl c3Npb25zfEZvcm1JbmRleERhdHVtfENvbXB1dGVJbmRleEF0dHJzfHJkX2luZHByZWRFeHBh bmR8cmRfaW5kcHJlZHxyZF9pbmRleHByc0V4cGFuZHxyZF9pbmRleHBycy4KCkFsbCBjaGFu Z2VzIGFuZCBiZWhhdmlvcmFsIGltcGFjdHMgYXJlIHJlY29yZGVkIGluIAp2Mi3nm7jlhbPm iJDlkZjjgIHlh73mlbDnmoTmlbTkvZPliIbmnpAueGxzeCAgICAoQ2hpbmVzZSkKdjItQ29t cHJlaGVuc2l2ZSBBbmFseXNpcyBvZiBSZWxhdGVkIE1lbWJlcnMgYW5kIEZ1bmN0aW9ucy54 bHN4ICAgIChFbmdsaXNoKS4KCiMjIyA1LiBDdXJyZW50IHN0YXR1cwpXaGlsZSBJIGhhdmUg bWFkZSBzdWJzdGFudGlhbCBjaGFuZ2VzLCBmdWxsIHRlc3QgY292ZXJhZ2UgbWF5IHN0aWxs IGJlIGluY29tcGxldGUuIENvbW11bml0eSByZXZpZXcsIHRlc3RpbmcgYW5kCmZlZWRiYWNr IGFyZSBoaWdobHkgYXBwcmVjaWF0ZWQuIEJhc2VkIG9uIGN1cnJlbnQgcHJvZ3Jlc3MgYW5k IG15IHRlc3RpbmcgKHdoaWNoIGlzIGFkbWl0dGVkbHkgbm90IGNvbXByZWhlbnNpdmUKb3Ig dGhvcm91Z2gpLCBpdCBhbGlnbnMgd2l0aCBTR0NzIGluIG1vc3QgbWV0YWRhdGEgY2F0YWxv ZyBhc3BlY3RzLiBzZWUgInYyLVNRTF90ZXN0X3Jlc3VsdC54bHN4IiBpbmNsdWRpbmcgY2hl Y2tpbmcgU1FMLgoKQmFzaWMgaW5kZXggc2NhbnMgbm93IHdvcmssIGJ1dCB0aGVyZSBhcmUg c3RpbGwgbWlub3IgcGxhbm5lciBpbmNvbnNpc3RlbmNpZXMgdGhhdCBJIGFtIGRlYnVnZ2lu ZyBhbmQgcmVzb2x2aW5nLiAgCnhtYW41PSMgXGQrIHQxCiAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRhYmxlICJwdWJsaWMudDEi CiBDb2x1bW4gfCAgVHlwZSAgIHwgQ29sbGF0aW9uIHwgTnVsbGFibGUgfCAgICAgICAgICAg ICAgRGVmYXVsdCAgICAgICAgICAgICAgIHwgU3RvcmFnZSB8IENvbXByZXNzaW9uIHwgU3Rh dHMgdGFyZ2V0IHwgRGVzY3JpcHRpb24gCi0tLS0tLS0tKy0tLS0tLS0tLSstLS0tLS0tLS0t LSstLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0t LS0tLS0rLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tCiBhICAg ICAgfCBpbnRlZ2VyIHwgICAgICAgICAgIHwgICAgICAgICAgfCAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgIHwgcGxhaW4gICB8ICAgICAgICAgICAgIHwgICAgICAgICAg ICAgIHwgCiBzMSAgICAgfCBpbnRlZ2VyIHwgICAgICAgICAgIHwgICAgICAgICAgfCBnZW5l cmF0ZWQgYWx3YXlzIGFzIChhICogMSkgc3RvcmVkIHwgcGxhaW4gICB8ICAgICAgICAgICAg IHwgICAgICAgICAgICAgIHwgCiBzMiAgICAgfCBpbnRlZ2VyIHwgICAgICAgICAgIHwgICAg ICAgICAgfCBnZW5lcmF0ZWQgYWx3YXlzIGFzIChhICogMikgc3RvcmVkIHwgcGxhaW4gICB8 ICAgICAgICAgICAgIHwgICAgICAgICAgICAgIHwgCiBzMyAgICAgfCBpbnRlZ2VyIHwgICAg ICAgICAgIHwgICAgICAgICAgfCBnZW5lcmF0ZWQgYWx3YXlzIGFzIChhICogMykgc3RvcmVk IHwgcGxhaW4gICB8ICAgICAgICAgICAgIHwgICAgICAgICAgICAgIHwgCiBzNCAgICAgfCBp bnRlZ2VyIHwgICAgICAgICAgIHwgICAgICAgICAgfCBnZW5lcmF0ZWQgYWx3YXlzIGFzIChh ICogNCkgc3RvcmVkIHwgcGxhaW4gICB8ICAgICAgICAgICAgIHwgICAgICAgICAgICAgIHwg CiB2MSAgICAgfCBpbnRlZ2VyIHwgICAgICAgICAgIHwgICAgICAgICAgfCBnZW5lcmF0ZWQg YWx3YXlzIGFzIChhICogMTEpICAgICAgIHwgcGxhaW4gICB8ICAgICAgICAgICAgIHwgICAg ICAgICAgICAgIHwgCiB2MiAgICAgfCBpbnRlZ2VyIHwgICAgICAgICAgIHwgICAgICAgICAg fCBnZW5lcmF0ZWQgYWx3YXlzIGFzIChhICogMjIpICAgICAgIHwgcGxhaW4gICB8ICAgICAg ICAgICAgIHwgICAgICAgICAgICAgIHwgCiB2MyAgICAgfCBpbnRlZ2VyIHwgICAgICAgICAg IHwgICAgICAgICAgfCBnZW5lcmF0ZWQgYWx3YXlzIGFzIChhICogMzMpICAgICAgIHwgcGxh aW4gICB8ICAgICAgICAgICAgIHwgICAgICAgICAgICAgIHwgCiB2NCAgICAgfCBpbnRlZ2Vy IHwgICAgICAgICAgIHwgICAgICAgICAgfCBnZW5lcmF0ZWQgYWx3YXlzIGFzIChhICogNDQp ICAgICAgIHwgcGxhaW4gICB8ICAgICAgICAgICAgIHwgICAgICAgICAgICAgIHwgCkluZGV4 ZXM6CiAgICAiaWR4X3QxX3MiIGJ0cmVlIChhLCBzMSwgYWJzKHMyKSkgSU5DTFVERSAoczMp IFdIRVJFIHM0IDwgMTAwCiAgICAiaWR4X3QxX3YiIGJ0cmVlIChhLCB2MSwgYWJzKHYyKSkg SU5DTFVERSAodjMpIFdIRVJFIHY0IDwgMTAwCkFjY2VzcyBtZXRob2Q6IGhlYXAKCkZvcmV4 YW1wbGU6CnhtYW41PSMgZXhwbGFpbiBzZWxlY3QgIGEgZnJvbSB0MSB3aGVyZSBzNCA8IDEw MDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFFVRVJZIFBMQU4gICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogSW5kZXggT25seSBT Y2FuIHVzaW5nIGlkeF90MV9zIG9uIHQxICAoY29zdD0wLjEzLi44LjE0IHJvd3M9MSB3aWR0 aD00KQooMSByb3cpCgoKeG1hbjU9IyBleHBsYWluIHNlbGVjdCAgYSBmcm9tIHQxIHdoZXJl IHY0IDwgMTAwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUVVFUlkgUExBTiAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIEJp dG1hcCBIZWFwIFNjYW4gb24gdDEgIChjb3N0PTQuMTguLjEwLjQ4IHJvd3M9MTUzIHdpZHRo PTQpICAgICAgICAgLS0tLS0tLXN0aWxsIG5lZWQgaGVhcCBTY2FuIGFuZCBSZWNoZWNrIENv bmQKICAgUmVjaGVjayBDb25kOiAoKGEgKiA0NCkgPCAxMDApCiAgIC0+ICBCaXRtYXAgSW5k ZXggU2NhbiBvbiBpZHhfdDFfdiAgKGNvc3Q9MC4wMC4uNC4xNCByb3dzPTE1MyB3aWR0aD0w KQooMyByb3dzKQoKCnJlZ2FyZHMsCi0tClppemh1YW5MaXXCoChYLU1BTinCoAo0NDk3Mzg2 M0BxcS5jb20= ------=_NextPart_6A49C9A9_E0657D40_6AAF3ADB Content-Type: application/octet-stream; charset="utf-8"; name="v0.patch.txt" Content-Disposition: attachment; filename="v0.patch.txt" Content-Transfer-Encoding: base64 ZGlmZiAtLWdpdCBhL3NyYy9iYWNrZW5kL2FjY2Vzcy9oZWFwL2hlYXBhbV9oYW5kbGVyLmMg Yi9zcmMvYmFja2VuZC9hY2Nlc3MvaGVhcC9oZWFwYW1faGFuZGxlci5jCmluZGV4IDIyNjhj YzI3Li5iYjNmMmU2MyAxMDA2NDQKLS0tIGEvc3JjL2JhY2tlbmQvYWNjZXNzL2hlYXAvaGVh cGFtX2hhbmRsZXIuYworKysgYi9zcmMvYmFja2VuZC9hY2Nlc3MvaGVhcC9oZWFwYW1faGFu ZGxlci5jCkBAIC0xMjAwLDcgKzEyMDAsOCBAQCBoZWFwYW1faW5kZXhfYnVpbGRfcmFuZ2Vf c2NhbihSZWxhdGlvbiBoZWFwUmVsYXRpb24sCiAJZWNvbnRleHQtPmVjeHRfc2NhbnR1cGxl ID0gc2xvdDsKIAogCS8qIFNldCB1cCBleGVjdXRpb24gc3RhdGUgZm9yIHByZWRpY2F0ZSwg aWYgYW55LiAqLwotCXByZWRpY2F0ZSA9IEV4ZWNQcmVwYXJlUXVhbChpbmRleEluZm8tPmlp X1ByZWRpY2F0ZSwgZXN0YXRlKTsKKwlwcmVkaWNhdGUgPSBFeGVjUHJlcGFyZVF1YWwoKExp c3QgKilleHBhbmRfZ2VuZXJhdGVkX2NvbHVtbnMoKE5vZGUgKilpbmRleEluZm8tPmlpX1By ZWRpY2F0ZSwgaGVhcFJlbGF0aW9uLCBJbnZhbGlkT2lkKSwKKwkJCQkJCQkJZXN0YXRlKTsK IAogCS8qCiAJICogUHJlcGFyZSBmb3Igc2NhbiBvZiB0aGUgYmFzZSByZWxhdGlvbi4gIElu IGEgbm9ybWFsIGluZGV4IGJ1aWxkLCB3ZSB1c2UKQEAgLTE3NTgsNyArMTc1OSw4IEBAIGhl YXBhbV9pbmRleF92YWxpZGF0ZV9zY2FuKFJlbGF0aW9uIGhlYXBSZWxhdGlvbiwKIAllY29u dGV4dC0+ZWN4dF9zY2FudHVwbGUgPSBzbG90OwogCiAJLyogU2V0IHVwIGV4ZWN1dGlvbiBz dGF0ZSBmb3IgcHJlZGljYXRlLCBpZiBhbnkuICovCi0JcHJlZGljYXRlID0gRXhlY1ByZXBh cmVRdWFsKGluZGV4SW5mby0+aWlfUHJlZGljYXRlLCBlc3RhdGUpOworCXByZWRpY2F0ZSA9 IEV4ZWNQcmVwYXJlUXVhbCgoTGlzdCAqKWV4cGFuZF9nZW5lcmF0ZWRfY29sdW1ucygoTm9k ZSAqKWluZGV4SW5mby0+aWlfUHJlZGljYXRlLCBoZWFwUmVsYXRpb24sIEludmFsaWRPaWQp LAorCQkJCQkJCQllc3RhdGUpOwogCiAJLyoKIAkgKiBQcmVwYXJlIGZvciBzY2FuIG9mIHRo ZSBiYXNlIHJlbGF0aW9uLiAgV2UgbmVlZCBqdXN0IHRob3NlIHR1cGxlcwpkaWZmIC0tZ2l0 IGEvc3JjL2JhY2tlbmQvY2F0YWxvZy9pbmRleC5jIGIvc3JjL2JhY2tlbmQvY2F0YWxvZy9p bmRleC5jCmluZGV4IDk0MDdjMzU3Li44YzBmYmZkOCAxMDA2NDQKLS0tIGEvc3JjL2JhY2tl bmQvY2F0YWxvZy9pbmRleC5jCisrKyBiL3NyYy9iYWNrZW5kL2NhdGFsb2cvaW5kZXguYwpA QCAtODEsNiArODEsNyBAQAogI2luY2x1ZGUgInV0aWxzL3NuYXBtZ3IuaCIKICNpbmNsdWRl ICJ1dGlscy9zeXNjYWNoZS5oIgogI2luY2x1ZGUgInV0aWxzL3R1cGxlc29ydC5oIgorI2lu Y2x1ZGUgInJld3JpdGUvcmV3cml0ZUhhbmRsZXIuaCIKIAogLyogUG90ZW50aWFsbHkgc2V0 IGJ5IHBnX3VwZ3JhZGVfc3VwcG9ydCBmdW5jdGlvbnMgKi8KIE9pZAkJCWJpbmFyeV91cGdy YWRlX25leHRfaW5kZXhfcGdfY2xhc3Nfb2lkID0gSW52YWxpZE9pZDsKQEAgLTMwMjksNiAr MzAzMCw3IEBAIGluZGV4X2J1aWxkKFJlbGF0aW9uIGhlYXBSZWxhdGlvbiwKIAlPaWQJCQlz YXZlX3VzZXJpZDsKIAlpbnQJCQlzYXZlX3NlY19jb250ZXh0OwogCWludAkJCXNhdmVfbmVz dGxldmVsOworCUxpc3QJICAgKnNhdmVfaWlfUHJlZGljYXRlID0gTklMOwogCiAJLyoKIAkg KiBzYW5pdHkgY2hlY2tzCkBAIC0zMDkzLDYgKzMwOTUsOSBAQCBpbmRleF9idWlsZChSZWxh dGlvbiBoZWFwUmVsYXRpb24sCiAJCXBnc3RhdF9wcm9ncmVzc191cGRhdGVfbXVsdGlfcGFy YW0oNiwgcHJvZ3Jlc3NfaW5kZXgsIHByb2dyZXNzX3ZhbHMpOwogCX0KIAorCXNhdmVfaWlf UHJlZGljYXRlID0gaW5kZXhJbmZvLT5paV9QcmVkaWNhdGU7CisJaW5kZXhJbmZvLT5paV9Q cmVkaWNhdGUgPSAoTGlzdCAqKWV4cGFuZF9nZW5lcmF0ZWRfY29sdW1ucygoTm9kZSAqKWlu ZGV4SW5mby0+aWlfUHJlZGljYXRlLAorCQkJCQkJCQkJCQkJCQkJCWhlYXBSZWxhdGlvbiwg SW52YWxpZE9pZCk7CiAJLyoKIAkgKiBDYWxsIHRoZSBhY2Nlc3MgbWV0aG9kJ3MgYnVpbGQg cHJvY2VkdXJlCiAJICovCkBAIC0zMTAwLDYgKzMxMDUsOCBAQCBpbmRleF9idWlsZChSZWxh dGlvbiBoZWFwUmVsYXRpb24sCiAJCQkJCQkJCQkJCSBpbmRleEluZm8pOwogCUFzc2VydChz dGF0cyk7CiAKKwlpbmRleEluZm8tPmlpX1ByZWRpY2F0ZSA9IHNhdmVfaWlfUHJlZGljYXRl OworCiAJLyoKIAkgKiBJZiB0aGlzIGlzIGFuIHVubG9nZ2VkIGluZGV4LCB3ZSBtYXkgbmVl ZCB0byB3cml0ZSBvdXQgYW4gaW5pdCBmb3JrIGZvcgogCSAqIGl0IC0tIGJ1dCB3ZSBtdXN0 IGZpcnN0IGNoZWNrIHdoZXRoZXIgb25lIGFscmVhZHkgZXhpc3RzLiAgSWYsIGZvcgpAQCAt MzI0Niw3ICszMjUzLDggQEAgSW5kZXhDaGVja0V4Y2x1c2lvbihSZWxhdGlvbiBoZWFwUmVs YXRpb24sCiAJZWNvbnRleHQtPmVjeHRfc2NhbnR1cGxlID0gc2xvdDsKIAogCS8qIFNldCB1 cCBleGVjdXRpb24gc3RhdGUgZm9yIHByZWRpY2F0ZSwgaWYgYW55LiAqLwotCXByZWRpY2F0 ZSA9IEV4ZWNQcmVwYXJlUXVhbChpbmRleEluZm8tPmlpX1ByZWRpY2F0ZSwgZXN0YXRlKTsK KwlwcmVkaWNhdGUgPSBFeGVjUHJlcGFyZVF1YWwoKExpc3QgKilleHBhbmRfZ2VuZXJhdGVk X2NvbHVtbnMoKE5vZGUgKilpbmRleEluZm8tPmlpX1ByZWRpY2F0ZSwgaGVhcFJlbGF0aW9u LCBJbnZhbGlkT2lkKSwKKwkJCQkJCQkJZXN0YXRlKTsKIAogCS8qCiAJICogU2NhbiBhbGwg bGl2ZSB0dXBsZXMgaW4gdGhlIGJhc2UgcmVsYXRpb24uCkBAIC00MzA5LDMgKzQzMTcsMzgg QEAgUmVzdG9yZVJlaW5kZXhTdGF0ZShjb25zdCB2b2lkICpyZWluZGV4c3RhdGUpCiAJLyog Tm90ZSB0aGUgd29ya2VyIGhhcyBpdHMgb3duIHRyYW5zYWN0aW9uIG5lc3RpbmcgbGV2ZWwg Ki8KIAlyZWluZGV4aW5nTmVzdExldmVsID0gR2V0Q3VycmVudFRyYW5zYWN0aW9uTmVzdExl dmVsKCk7CiB9CisKKworTm9kZSAqCitleHBhbmRfZ2VuZXJhdGVkX2NvbHVtbnMoTm9kZSAq bm9kZSwgUmVsYXRpb24gcmVsYXRpb24sIE9pZCByZWxpZCkKK3sKKwkvKmV4cGFuZF9WR0Nf Y29udGV4dCAJY29udGV4dDsKKwlUdXBsZURlc2MJCQl0dXBkZXNjOyovCisJYm9vbCAJCQkJ b3BlbmVkX3JlbGF0aW9uID0gZmFsc2U7CisKKwlpZiAobm9kZSA9PSBOVUxMIHx8IChyZWxh dGlvbiA9PSBOVUxMICYmIHJlbGlkID09IEludmFsaWRPaWQpKQorCQlyZXR1cm4gbm9kZTsK KworCWlmIChyZWxhdGlvbiA9PSBOVUxMKQorCXsKKwkJcmVsYXRpb24gPSB0YWJsZV9vcGVu KHJlbGlkLCBOb0xvY2spOworCQlvcGVuZWRfcmVsYXRpb24gPSB0cnVlOworCX0KKworCW5v ZGUgPSBleHBhbmRfZ2VuZXJhdGVkX2NvbHVtbnNfaW5fZXhwcihub2RlLCByZWxhdGlvbiwg MSk7CisKKwkvKnR1cGRlc2MgPSBSZWxhdGlvbkdldERlc2NyKHJlbGF0aW9uKTsKKworCWlm ICgodHVwZGVzYy0+Y29uc3RyICYmIHR1cGRlc2MtPmNvbnN0ci0+aGFzX2dlbmVyYXRlZF92 aXJ0dWFsKSkKKwl7CisJCWNvbnRleHQucmVsYXRpb24gPSByZWxhdGlvbjsKKwkJY29udGV4 dC50dXBkZXNjID0gdHVwZGVzYzsKKworCQlub2RlID0gZXhwYW5kX1ZHQ19pbXBsKG5vZGUs ICZjb250ZXh0KTsKKwl9Ki8KKworCWlmIChvcGVuZWRfcmVsYXRpb24pCisJCXRhYmxlX2Ns b3NlKHJlbGF0aW9uLCBOb0xvY2spOworCisJcmV0dXJuIG5vZGU7Cit9CmRpZmYgLS1naXQg YS9zcmMvYmFja2VuZC9jb21tYW5kcy9hbmFseXplLmMgYi9zcmMvYmFja2VuZC9jb21tYW5k cy9hbmFseXplLmMKaW5kZXggZjY2ZTgwYjcuLjY5YmEzYzM3IDEwMDY0NAotLS0gYS9zcmMv YmFja2VuZC9jb21tYW5kcy9hbmFseXplLmMKKysrIGIvc3JjL2JhY2tlbmQvY29tbWFuZHMv YW5hbHl6ZS5jCkBAIC05MjYsNyArOTI2LDggQEAgY29tcHV0ZV9pbmRleF9zdGF0cyhSZWxh dGlvbiBvbmVyZWwsIGRvdWJsZSB0b3RhbHJvd3MsCiAJCWVjb250ZXh0LT5lY3h0X3NjYW50 dXBsZSA9IHNsb3Q7CiAKIAkJLyogU2V0IHVwIGV4ZWN1dGlvbiBzdGF0ZSBmb3IgcHJlZGlj YXRlLiAqLwotCQlwcmVkaWNhdGUgPSBFeGVjUHJlcGFyZVF1YWwoaW5kZXhJbmZvLT5paV9Q cmVkaWNhdGUsIGVzdGF0ZSk7CisJCXByZWRpY2F0ZSA9IEV4ZWNQcmVwYXJlUXVhbCgoTGlz dCAqKWV4cGFuZF9nZW5lcmF0ZWRfY29sdW1ucygoTm9kZSAqKWluZGV4SW5mby0+aWlfUHJl ZGljYXRlLCBvbmVyZWwsIEludmFsaWRPaWQpLAorCQkJCQkJCQkJZXN0YXRlKTsKIAogCQkv KiBDb21wdXRlIGFuZCBzYXZlIGluZGV4IGV4cHJlc3Npb24gdmFsdWVzICovCiAJCWV4cHJ2 YWxzID0gKERhdHVtICopIHBhbGxvYyhudW1yb3dzICogYXR0cl9jbnQgKiBzaXplb2YoRGF0 dW0pKTsKZGlmZiAtLWdpdCBhL3NyYy9iYWNrZW5kL2NvbW1hbmRzL2luZGV4Y21kcy5jIGIv c3JjL2JhY2tlbmQvY29tbWFuZHMvaW5kZXhjbWRzLmMKaW5kZXggOWFiNzRjOGQuLmY3Y2I3 YzcwIDEwMDY0NAotLS0gYS9zcmMvYmFja2VuZC9jb21tYW5kcy9pbmRleGNtZHMuYworKysg Yi9zcmMvYmFja2VuZC9jb21tYW5kcy9pbmRleGNtZHMuYwpAQCAtMTEyMyw2ICsxMTIzLDcg QEAgRGVmaW5lSW5kZXgoUGFyc2VTdGF0ZSAqcHN0YXRlLAogCQkJCQkgZXJybXNnKCJpbmRl eCBjcmVhdGlvbiBvbiBzeXN0ZW0gY29sdW1ucyBpcyBub3Qgc3VwcG9ydGVkIikpKTsKIAog CisJCS8qCiAJCWlmIChhdHRubyA+IDAgJiYKIAkJCVR1cGxlRGVzY0F0dHIoUmVsYXRpb25H ZXREZXNjcihyZWwpLCBhdHRubyAtIDEpLT5hdHRnZW5lcmF0ZWQgPT0gQVRUUklCVVRFX0dF TkVSQVRFRF9WSVJUVUFMKQogCQkJZXJlcG9ydChFUlJPUiwKQEAgLTExMzIsNiArMTEzMyw3 IEBAIERlZmluZUluZGV4KFBhcnNlU3RhdGUgKnBzdGF0ZSwKIAkJCQkJc3RtdC0+aXNjb25z dHJhaW50ID8KIAkJCQkJZXJybXNnKCJ1bmlxdWUgY29uc3RyYWludHMgb24gdmlydHVhbCBn ZW5lcmF0ZWQgY29sdW1ucyBhcmUgbm90IHN1cHBvcnRlZCIpIDoKIAkJCQkJZXJybXNnKCJp bmRleGVzIG9uIHZpcnR1YWwgZ2VuZXJhdGVkIGNvbHVtbnMgYXJlIG5vdCBzdXBwb3J0ZWQi KSk7CisJCSovCiAJfQogCiAJLyoKQEAgLTExNDAsMTYgKzExNDIsMjMgQEAgRGVmaW5lSW5k ZXgoUGFyc2VTdGF0ZSAqcHN0YXRlLAogCSAqLwogCWlmIChpbmRleEluZm8tPmlpX0V4cHJl c3Npb25zIHx8IGluZGV4SW5mby0+aWlfUHJlZGljYXRlKQogCXsKLQkJQml0bWFwc2V0ICAq aW5kZXhhdHRycyA9IE5VTEw7CisJCUJpdG1hcHNldCAgKmluZGV4YXR0cnNFeHByID0gTlVM TDsKKwkJQml0bWFwc2V0ICAqaW5kZXhhdHRyc1ByZWQgPSBOVUxMOwogCQlpbnQJCQlqOwog Ci0JCXB1bGxfdmFyYXR0bm9zKChOb2RlICopIGluZGV4SW5mby0+aWlfRXhwcmVzc2lvbnMs IDEsICZpbmRleGF0dHJzKTsKLQkJcHVsbF92YXJhdHRub3MoKE5vZGUgKikgaW5kZXhJbmZv LT5paV9QcmVkaWNhdGUsIDEsICZpbmRleGF0dHJzKTsKKwkJcHVsbF92YXJhdHRub3MoKE5v ZGUgKikgaW5kZXhJbmZvLT5paV9FeHByZXNzaW9ucywgMSwgJmluZGV4YXR0cnNFeHByKTsK KwkJcHVsbF92YXJhdHRub3MoKE5vZGUgKikgaW5kZXhJbmZvLT5paV9QcmVkaWNhdGUsIDEs ICZpbmRleGF0dHJzUHJlZCk7CiAKIAkJZm9yIChpbnQgaSA9IEZpcnN0TG93SW52YWxpZEhl YXBBdHRyaWJ1dGVOdW1iZXIgKyAxOyBpIDwgMDsgaSsrKQogCQl7CiAJCQlpZiAoYm1zX2lz X21lbWJlcihpIC0gRmlyc3RMb3dJbnZhbGlkSGVhcEF0dHJpYnV0ZU51bWJlciwKLQkJCQkJ CQkgIGluZGV4YXR0cnMpKQorCQkJCQkJCSAgaW5kZXhhdHRyc0V4cHIpKQorCQkJCWVyZXBv cnQoRVJST1IsCisJCQkJCQkoZXJyY29kZShFUlJDT0RFX0ZFQVRVUkVfTk9UX1NVUFBPUlRF RCksCisJCQkJCQkgZXJybXNnKCJpbmRleCBjcmVhdGlvbiBvbiBzeXN0ZW0gY29sdW1ucyBp cyBub3Qgc3VwcG9ydGVkIikpKTsKKworCQkJaWYgKGJtc19pc19tZW1iZXIoaSAtIEZpcnN0 TG93SW52YWxpZEhlYXBBdHRyaWJ1dGVOdW1iZXIsCisJCQkJCQkJICBpbmRleGF0dHJzUHJl ZCkpCiAJCQkJZXJlcG9ydChFUlJPUiwKIAkJCQkJCShlcnJjb2RlKEVSUkNPREVfRkVBVFVS RV9OT1RfU1VQUE9SVEVEKSwKIAkJCQkJCSBlcnJtc2coImluZGV4IGNyZWF0aW9uIG9uIHN5 c3RlbSBjb2x1bW5zIGlzIG5vdCBzdXBwb3J0ZWQiKSkpOwpAQCAtMTE2MSw3ICsxMTcwLDcg QEAgRGVmaW5lSW5kZXgoUGFyc2VTdGF0ZSAqcHN0YXRlLAogCQkgKiBSZWxhdGlvbkdldElu ZGV4RXhwcmVzc2lvbnMoKSBhbmQgUmVsYXRpb25HZXRJbmRleFByZWRpY2F0ZSgpLgogCQkg Ki8KIAkJaiA9IC0xOwotCQl3aGlsZSAoKGogPSBibXNfbmV4dF9tZW1iZXIoaW5kZXhhdHRy cywgaikpID49IDApCisJCXdoaWxlICgoaiA9IGJtc19uZXh0X21lbWJlcihpbmRleGF0dHJz RXhwciwgaikpID49IDApCiAJCXsKIAkJCUF0dHJOdW1iZXIJYXR0bm8gPSBqICsgRmlyc3RM b3dJbnZhbGlkSGVhcEF0dHJpYnV0ZU51bWJlcjsKIApkaWZmIC0tZ2l0IGEvc3JjL2JhY2tl bmQvZXhlY3V0b3IvZXhlY0V4cHJJbnRlcnAuYyBiL3NyYy9iYWNrZW5kL2V4ZWN1dG9yL2V4 ZWNFeHBySW50ZXJwLmMKaW5kZXggMDYzNGFmOTYuLjVlYmJiM2VmIDEwMDY0NAotLS0gYS9z cmMvYmFja2VuZC9leGVjdXRvci9leGVjRXhwckludGVycC5jCisrKyBiL3NyYy9iYWNrZW5k L2V4ZWN1dG9yL2V4ZWNFeHBySW50ZXJwLmMKQEAgLTI0MTYsOCArMjQxNiw4IEBAIENoZWNr VmFyU2xvdENvbXBhdGliaWxpdHkoVHVwbGVUYWJsZVNsb3QgKnNsb3QsIGludCBhdHRudW0s IE9pZCB2YXJ0eXBlKQogCQlhdHRyID0gVHVwbGVEZXNjQXR0cihzbG90X3R1cGRlc2MsIGF0 dG51bSAtIDEpOwogCiAJCS8qIEludGVybmFsIGVycm9yOiBzb21lYm9keSBmb3Jnb3QgdG8g ZXhwYW5kIGl0LiAqLwotCQlpZiAoYXR0ci0+YXR0Z2VuZXJhdGVkID09IEFUVFJJQlVURV9H RU5FUkFURURfVklSVFVBTCkKLQkJCWVsb2coRVJST1IsICJ1bmV4cGVjdGVkIHZpcnR1YWwg Z2VuZXJhdGVkIGNvbHVtbiByZWZlcmVuY2UiKTsKKwkJLyppZiAoYXR0ci0+YXR0Z2VuZXJh dGVkID09IEFUVFJJQlVURV9HRU5FUkFURURfVklSVFVBTCkKKwkJCWVsb2coRVJST1IsICJ1 bmV4cGVjdGVkIHZpcnR1YWwgZ2VuZXJhdGVkIGNvbHVtbiByZWZlcmVuY2UiKTsgKi8KIAog CQlpZiAoYXR0ci0+YXR0aXNkcm9wcGVkKQogCQkJZXJlcG9ydChFUlJPUiwKZGlmZiAtLWdp dCBhL3NyYy9iYWNrZW5kL2V4ZWN1dG9yL2V4ZWNJbmRleGluZy5jIGIvc3JjL2JhY2tlbmQv ZXhlY3V0b3IvZXhlY0luZGV4aW5nLmMKaW5kZXggZWIzODM4MTIuLjNhODY1YjE5IDEwMDY0 NAotLS0gYS9zcmMvYmFja2VuZC9leGVjdXRvci9leGVjSW5kZXhpbmcuYworKysgYi9zcmMv YmFja2VuZC9leGVjdXRvci9leGVjSW5kZXhpbmcuYwpAQCAtMzg4LDcgKzM4OCw4IEBAIEV4 ZWNJbnNlcnRJbmRleFR1cGxlcyhSZXN1bHRSZWxJbmZvICpyZXN1bHRSZWxJbmZvLAogCQkJ cHJlZGljYXRlID0gaW5kZXhJbmZvLT5paV9QcmVkaWNhdGVTdGF0ZTsKIAkJCWlmIChwcmVk aWNhdGUgPT0gTlVMTCkKIAkJCXsKLQkJCQlwcmVkaWNhdGUgPSBFeGVjUHJlcGFyZVF1YWwo aW5kZXhJbmZvLT5paV9QcmVkaWNhdGUsIGVzdGF0ZSk7CisJCQkJcHJlZGljYXRlID0gRXhl Y1ByZXBhcmVRdWFsKChMaXN0ICopZXhwYW5kX2dlbmVyYXRlZF9jb2x1bW5zKChOb2RlICop aW5kZXhJbmZvLT5paV9QcmVkaWNhdGUsIGhlYXBSZWxhdGlvbiwgSW52YWxpZE9pZCksCisJ CQkJCQkJCQkJCWVzdGF0ZSk7CiAJCQkJaW5kZXhJbmZvLT5paV9QcmVkaWNhdGVTdGF0ZSA9 IHByZWRpY2F0ZTsKIAkJCX0KIApAQCAtNjI0LDcgKzYyNSw4IEBAIEV4ZWNDaGVja0luZGV4 Q29uc3RyYWludHMoUmVzdWx0UmVsSW5mbyAqcmVzdWx0UmVsSW5mbywgVHVwbGVUYWJsZVNs b3QgKnNsb3QsCiAJCQlwcmVkaWNhdGUgPSBpbmRleEluZm8tPmlpX1ByZWRpY2F0ZVN0YXRl OwogCQkJaWYgKHByZWRpY2F0ZSA9PSBOVUxMKQogCQkJewotCQkJCXByZWRpY2F0ZSA9IEV4 ZWNQcmVwYXJlUXVhbChpbmRleEluZm8tPmlpX1ByZWRpY2F0ZSwgZXN0YXRlKTsKKwkJCQlw cmVkaWNhdGUgPSBFeGVjUHJlcGFyZVF1YWwoKExpc3QgKilleHBhbmRfZ2VuZXJhdGVkX2Nv bHVtbnMoKE5vZGUgKilpbmRleEluZm8tPmlpX1ByZWRpY2F0ZSwgaGVhcFJlbGF0aW9uLCBJ bnZhbGlkT2lkKSwKKwkJCQkJCQkJCQkJZXN0YXRlKTsKIAkJCQlpbmRleEluZm8tPmlpX1By ZWRpY2F0ZVN0YXRlID0gcHJlZGljYXRlOwogCQkJfQogCmRpZmYgLS1naXQgYS9zcmMvYmFj a2VuZC9vcHRpbWl6ZXIvcGF0aC9pbmR4cGF0aC5jIGIvc3JjL2JhY2tlbmQvb3B0aW1pemVy L3BhdGgvaW5keHBhdGguYwppbmRleCAzZjVkNGZhMy4uMDA3ZTg5MmYgMTAwNjQ0Ci0tLSBh L3NyYy9iYWNrZW5kL29wdGltaXplci9wYXRoL2luZHhwYXRoLmMKKysrIGIvc3JjL2JhY2tl bmQvb3B0aW1pemVyL3BhdGgvaW5keHBhdGguYwpAQCAtMzUsNiArMzUsNyBAQAogI2luY2x1 ZGUgIm9wdGltaXplci9yZXN0cmljdGluZm8uaCIKICNpbmNsdWRlICJ1dGlscy9sc3lzY2Fj aGUuaCIKICNpbmNsdWRlICJ1dGlscy9zZWxmdW5jcy5oIgorI2luY2x1ZGUgImNhdGFsb2cv aW5kZXguaCIKIAogCiAvKiBYWFggc2VlIFBhcnRDb2xsTWF0Y2hlc0V4cHJDb2xsICovCkBA IC0xMDk0LDYgKzEwOTUsNyBAQCBidWlsZF9wYXRoc19mb3JfT1IoUGxhbm5lckluZm8gKnJv b3QsIFJlbE9wdEluZm8gKnJlbCwKIAlMaXN0CSAgICpyZXN1bHQgPSBOSUw7CiAJTGlzdAkg ICAqYWxsX2NsYXVzZXMgPSBOSUw7CS8qIG5vdCBjb21wdXRlZCB0aWxsIG5lZWRlZCAqLwog CUxpc3RDZWxsICAgKmxjOworCU9pZCAgCQloZWFwUmVsSWQgPSBJbnZhbGlkT2lkOwogCiAJ Zm9yZWFjaChsYywgcmVsLT5pbmRleGxpc3QpCiAJewpAQCAtMTEyNywxNCArMTEyOSwxOCBA QCBidWlsZF9wYXRoc19mb3JfT1IoUGxhbm5lckluZm8gKnJvb3QsIFJlbE9wdEluZm8gKnJl bCwKIAkJCX0KIAkJCWVsc2UKIAkJCXsKKwkJCQloZWFwUmVsSWQgPSAocm9vdC0+c2ltcGxl X3J0ZV9hcnJheVtpbmRleC0+cmVsLT5yZWxpZF0pLT5yZWxpZDsKKwogCQkJCS8qIEZvcm0g YWxsX2NsYXVzZXMgaWYgbm90IGRvbmUgYWxyZWFkeSAqLwogCQkJCWlmIChhbGxfY2xhdXNl cyA9PSBOSUwpCiAJCQkJCWFsbF9jbGF1c2VzID0gbGlzdF9jb25jYXRfY29weShjbGF1c2Vz LCBvdGhlcl9jbGF1c2VzKTsKIAotCQkJCWlmICghcHJlZGljYXRlX2ltcGxpZWRfYnkoaW5k ZXgtPmluZHByZWQsIGFsbF9jbGF1c2VzLCBmYWxzZSkpCisJCQkJaWYgKCFwcmVkaWNhdGVf aW1wbGllZF9ieSgoTGlzdCAqKWV4cGFuZF9nZW5lcmF0ZWRfY29sdW1ucygoTm9kZSAqKWlu ZGV4LT5pbmRwcmVkLCBOVUxMLCBoZWFwUmVsSWQpLAorCQkJCQkJCQkJCSAgYWxsX2NsYXVz ZXMsIGZhbHNlKSkKIAkJCQkJY29udGludWU7CS8qIGNhbid0IHVzZSBpdCBhdCBhbGwgKi8K IAotCQkJCWlmICghcHJlZGljYXRlX2ltcGxpZWRfYnkoaW5kZXgtPmluZHByZWQsIG90aGVy X2NsYXVzZXMsIGZhbHNlKSkKKwkJCQlpZiAoIXByZWRpY2F0ZV9pbXBsaWVkX2J5KChMaXN0 ICopZXhwYW5kX2dlbmVyYXRlZF9jb2x1bW5zKChOb2RlICopaW5kZXgtPmluZHByZWQsIE5V TEwsIGhlYXBSZWxJZCksCisJCQkJCQkJCQkJICBvdGhlcl9jbGF1c2VzLCBmYWxzZSkpCiAJ CQkJCXVzZWZ1bF9wcmVkaWNhdGUgPSB0cnVlOwogCQkJfQogCQl9CkBAIC0zOTQ0LDYgKzM5 NTAsNyBAQCBjaGVja19pbmRleF9wcmVkaWNhdGVzKFBsYW5uZXJJbmZvICpyb290LCBSZWxP cHRJbmZvICpyZWwpCiAJYm9vbAkJaXNfdGFyZ2V0X3JlbDsKIAlSZWxpZHMJCW90aGVycmVs czsKIAlMaXN0Q2VsbCAgICpsYzsKKwlPaWQgIAkJaGVhcFJlbElkID0gSW52YWxpZE9pZDsK IAogCS8qIEluZGV4ZXMgYXJlIGF2YWlsYWJsZSBvbmx5IG9uIGJhc2Ugb3IgIm90aGVyIiBt ZW1iZXIgcmVsYXRpb25zLiAqLwogCUFzc2VydChJU19TSU1QTEVfUkVMKHJlbCkpOwpAQCAt NDA0MSw5ICs0MDQ4LDEwIEBAIGNoZWNrX2luZGV4X3ByZWRpY2F0ZXMoUGxhbm5lckluZm8g KnJvb3QsIFJlbE9wdEluZm8gKnJlbCkKIAkJaWYgKGluZGV4LT5pbmRwcmVkID09IE5JTCkK IAkJCWNvbnRpbnVlOwkJCS8qIGlnbm9yZSBub24tcGFydGlhbCBpbmRleGVzIGhlcmUgKi8K IAorCQloZWFwUmVsSWQgPSAocm9vdC0+c2ltcGxlX3J0ZV9hcnJheVtpbmRleC0+cmVsLT5y ZWxpZF0pLT5yZWxpZDsKIAkJaWYgKCFpbmRleC0+cHJlZE9LKQkJLyogZG9uJ3QgcmVwZWF0 IHdvcmsgaWYgYWxyZWFkeSBwcm92ZW4gT0sgKi8KLQkJCWluZGV4LT5wcmVkT0sgPSBwcmVk aWNhdGVfaW1wbGllZF9ieShpbmRleC0+aW5kcHJlZCwgY2xhdXNlbGlzdCwKLQkJCQkJCQkJ CQkJCSBmYWxzZSk7CisJCQlpbmRleC0+cHJlZE9LID0gcHJlZGljYXRlX2ltcGxpZWRfYnko KExpc3QgKilleHBhbmRfZ2VuZXJhdGVkX2NvbHVtbnMoKE5vZGUgKilpbmRleC0+aW5kcHJl ZCwgTlVMTCwgaGVhcFJlbElkKSwKKwkJCQkJCQkJCQkJCSBjbGF1c2VsaXN0LCBmYWxzZSk7 CiAKIAkJLyogSWYgcmVsIGlzIGFuIHVwZGF0ZSB0YXJnZXQsIGxlYXZlIGluZHJlc3RyaWN0 aW5mbyBhcyBzZXQgYWJvdmUgKi8KIAkJaWYgKGlzX3RhcmdldF9yZWwpCkBAIC00MDY4LDcg KzQwNzYsOCBAQCBjaGVja19pbmRleF9wcmVkaWNhdGVzKFBsYW5uZXJJbmZvICpyb290LCBS ZWxPcHRJbmZvICpyZWwpCiAJCQkvKiBwcmVkaWNhdGVfaW1wbGllZF9ieSgpIGFzc3VtZXMg Zmlyc3QgYXJnIGlzIGltbXV0YWJsZSAqLwogCQkJaWYgKGNvbnRhaW5fbXV0YWJsZV9mdW5j dGlvbnMoKE5vZGUgKikgcmluZm8tPmNsYXVzZSkgfHwKIAkJCQkhcHJlZGljYXRlX2ltcGxp ZWRfYnkobGlzdF9tYWtlMShyaW5mby0+Y2xhdXNlKSwKLQkJCQkJCQkJCSAgaW5kZXgtPmlu ZHByZWQsIGZhbHNlKSkKKwkJCQkJCQkJCSAgKExpc3QgKilleHBhbmRfZ2VuZXJhdGVkX2Nv bHVtbnMoKE5vZGUgKilpbmRleC0+aW5kcHJlZCwgTlVMTCwgaGVhcFJlbElkKSwKKwkJCQkJ CQkJCSAgZmFsc2UpKQogCQkJCWluZGV4LT5pbmRyZXN0cmljdGluZm8gPSBsYXBwZW5kKGlu ZGV4LT5pbmRyZXN0cmljdGluZm8sIHJpbmZvKTsKIAkJfQogCX0KZGlmZiAtLWdpdCBhL3Ny Yy9pbmNsdWRlL2NhdGFsb2cvaW5kZXguaCBiL3NyYy9pbmNsdWRlL2NhdGFsb2cvaW5kZXgu aAppbmRleCA5YWVlODIyNi4uMDE1ZWM2NzQgMTAwNjQ0Ci0tLSBhL3NyYy9pbmNsdWRlL2Nh dGFsb2cvaW5kZXguaAorKysgYi9zcmMvaW5jbHVkZS9jYXRhbG9nL2luZGV4LmgKQEAgLTE2 LDYgKzE2LDkgQEAKIAogI2luY2x1ZGUgImNhdGFsb2cvb2JqZWN0YWRkcmVzcy5oIgogI2lu Y2x1ZGUgIm5vZGVzL2V4ZWNub2Rlcy5oIgorLyojaW5jbHVkZSAicmV3cml0ZS9yZXdyaXRl TWFuaXAuaCIKKworI2luY2x1ZGUgIm5vZGVzL25vZGVGdW5jcy5oIiovCiAKIAogLyoKQEAg LTU5LDYgKzYyLDEyIEBAIHR5cGVkZWYgc3RydWN0IFZhbGlkYXRlSW5kZXhTdGF0ZQogCQkJ CXR1cHNfaW5zZXJ0ZWQ7CiB9IFZhbGlkYXRlSW5kZXhTdGF0ZTsKIAordHlwZWRlZiBzdHJ1 Y3QgZXhwYW5kX1ZHQ19jb250ZXh0Cit7CisJUmVsYXRpb24JcmVsYXRpb247CS8qIHRoZSBy ZWxhdGlvbiBvZiB0aGUgdmlydHVhbCBnZW5lcmF0ZWQgY29sdW1uICovCisJVHVwbGVEZXNj CXR1cGRlc2M7Cit9IGV4cGFuZF9WR0NfY29udGV4dDsKKwogZXh0ZXJuIHZvaWQgaW5kZXhf Y2hlY2tfcHJpbWFyeV9rZXkoUmVsYXRpb24gaGVhcFJlbCwKIAkJCQkJCQkJCWNvbnN0IElu ZGV4SW5mbyAqaW5kZXhJbmZvLAogCQkJCQkJCQkJYm9vbCBpc19hbHRlcl90YWJsZSwKQEAg LTIyMyw0ICsyMzIsMzUgQEAgaXRlbXB0cl9kZWNvZGUoSXRlbVBvaW50ZXIgaXRlbXB0ciwg aW50NjQgZW5jb2RlZCkKIAlJdGVtUG9pbnRlclNldChpdGVtcHRyLCBibG9jaywgb2Zmc2V0 KTsKIH0KIAorLyoKK3N0YXRpYyBOb2RlICoKK2V4cGFuZF9WR0NfaW1wbChOb2RlICpub2Rl LCBleHBhbmRfVkdDX2NvbnRleHQgKmNvbnRleHQpCit7CisJaWYgKG5vZGUgPT0gTlVMTCkK Kwl7CisJCQorCX0KKwllbHNlIGlmIChJc0Eobm9kZSwgVmFyKSkKKwl7CisJCWludCB2YXJh dHRubyA9ICgoVmFyICopbm9kZSktPnZhcmF0dG5vOworCisJCUZvcm1fcGdfYXR0cmlidXRl IGF0dHIgPSBUdXBsZURlc2NBdHRyKGNvbnRleHQtPnR1cGRlc2MsIHZhcmF0dG5vIC0gMSk7 CisJCWlmIChhdHRyLT5hdHRnZW5lcmF0ZWQgPT0gQVRUUklCVVRFX0dFTkVSQVRFRF9WSVJU VUFMKQorCQl7CisJCQlub2RlID0gYnVpbGRfZ2VuZXJhdGlvbl9leHByZXNzaW9uKGNvbnRl eHQtPnJlbGF0aW9uLAorCQkJCQkJCQkJCQkgICB2YXJhdHRubyk7CisJCQlDaGFuZ2VWYXJO b2Rlcyhub2RlLCAxLCAxLCAwKTsKKwkJfQorCQllbHNlCisJCQlub2RlID0gY29weU9iamVj dChub2RlKTsKKwl9CisJZWxzZQorCQlub2RlID0gZXhwcmVzc2lvbl90cmVlX211dGF0b3Io bm9kZSwgZXhwYW5kX1ZHQ19pbXBsLCBjb250ZXh0KTsKKworCXJldHVybiBub2RlOworfQor Ki8KKworZXh0ZXJuIE5vZGUgKmV4cGFuZF9nZW5lcmF0ZWRfY29sdW1ucyhOb2RlICpub2Rl LCBSZWxhdGlvbiByZWxhdGlvbiwgT2lkIHJlbGlkKTsKKwogI2VuZGlmCQkJCQkJCS8qIElO REVYX0ggKi8K ------=_NextPart_6A49C9A9_E0657D40_6AAF3ADB Content-Type: application/octet-stream; charset="utf-8"; name="v1.patch.txt" Content-Disposition: attachment; filename="v1.patch.txt" Content-Transfer-Encoding: base64 ZGlmZiAtLWdpdCBhL3NyYy9iYWNrZW5kL2NvbW1hbmRzL2luZGV4Y21kcy5jIGIvc3JjL2Jh Y2tlbmQvY29tbWFuZHMvaW5kZXhjbWRzLmMKaW5kZXggOWFiNzRjOGQuLjYzNTQwY2ZiIDEw MDY0NAotLS0gYS9zcmMvYmFja2VuZC9jb21tYW5kcy9pbmRleGNtZHMuYworKysgYi9zcmMv YmFja2VuZC9jb21tYW5kcy9pbmRleGNtZHMuYwpAQCAtNTk0LDYgKzU5NCw3IEBAIERlZmlu ZUluZGV4KFBhcnNlU3RhdGUgKnBzdGF0ZSwKIAlPaWQJCQlyb290X3NhdmVfdXNlcmlkOwog CWludAkJCXJvb3Rfc2F2ZV9zZWNfY29udGV4dDsKIAlpbnQJCQlyb290X3NhdmVfbmVzdGxl dmVsOworCU5vZGUJICAgKndoZXJlQ2xhdXNlID0gTlVMTDsKIAogCXJvb3Rfc2F2ZV9uZXN0 bGV2ZWwgPSBOZXdHVUNOZXN0TGV2ZWwoKTsKIApAQCAtOTA1LDggKzkwNiwxMSBAQCBEZWZp bmVJbmRleChQYXJzZVN0YXRlICpwc3RhdGUsCiAJLyoKIAkgKiBWYWxpZGF0ZSBwcmVkaWNh dGUsIGlmIGdpdmVuCiAJICovCi0JaWYgKHN0bXQtPndoZXJlQ2xhdXNlKQotCQlDaGVja1By ZWRpY2F0ZSgoRXhwciAqKSBzdG10LT53aGVyZUNsYXVzZSk7CisJaWYgKHN0bXQtPndoZXJl Q2xhdXNlKXsKKwkJLyogRXhwYW5kIHZpcnR1YWwgZ2VuZXJhdGVkIGNvbHVtbnMgaW4gZXhw cmVzc2lvbnMgKi8KKwkJd2hlcmVDbGF1c2UgPSBFeHBhbmRWaXJ0dWFsR2VuZXJhdGVkQ29s dW1ucyhjb3B5T2JqZWN0KHN0bXQtPndoZXJlQ2xhdXNlKSwgcmVsLCBJbnZhbGlkT2lkKTsK KwkJQ2hlY2tQcmVkaWNhdGUoKEV4cHIgKikgd2hlcmVDbGF1c2UpOworCX0KIAogCS8qCiAJ ICogUGFyc2UgQU0tc3BlY2lmaWMgb3B0aW9ucywgY29udmVydCB0byB0ZXh0IGFycmF5IGZv cm0sIHZhbGlkYXRlLgpAQCAtOTI1LDcgKzkyOSw3IEBAIERlZmluZUluZGV4KFBhcnNlU3Rh dGUgKnBzdGF0ZSwKIAkJCQkJCQkgIG51bWJlck9mS2V5QXR0cmlidXRlcywKIAkJCQkJCQkg IGFjY2Vzc01ldGhvZElkLAogCQkJCQkJCSAgTklMLAkvKiBleHByZXNzaW9ucywgTklMIGZv ciBub3cgKi8KLQkJCQkJCQkgIG1ha2VfYW5kc19pbXBsaWNpdCgoRXhwciAqKSBzdG10LT53 aGVyZUNsYXVzZSksCisJCQkJCQkJICBtYWtlX2FuZHNfaW1wbGljaXQoKEV4cHIgKikgd2hl cmVDbGF1c2UpLAogCQkJCQkJCSAgc3RtdC0+dW5pcXVlLAogCQkJCQkJCSAgc3RtdC0+bnVs bHNfbm90X2Rpc3RpbmN0LAogCQkJCQkJCSAgIWNvbmN1cnJlbnQsCkBAIC05NDgsNiArOTUy LDExIEBAIERlZmluZUluZGV4KFBhcnNlU3RhdGUgKnBzdGF0ZSwKIAkJCQkJICByb290X3Nh dmVfdXNlcmlkLCByb290X3NhdmVfc2VjX2NvbnRleHQsCiAJCQkJCSAgJnJvb3Rfc2F2ZV9u ZXN0bGV2ZWwpOwogCisJLyogRXhwYW5kIHZpcnR1YWwgZ2VuZXJhdGVkIGNvbHVtbnMgaW4g ZXhwcmVzc2lvbnMgKi8KKwlpZiAoaW5kZXhJbmZvLT5paV9FeHByZXNzaW9ucykKKwkJaW5k ZXhJbmZvLT5paV9FeHByZXNzaW9ucyA9CisJCQkoTGlzdCAqKUV4cGFuZFZpcnR1YWxHZW5l cmF0ZWRDb2x1bW5zKChOb2RlICopaW5kZXhJbmZvLT5paV9FeHByZXNzaW9ucywgcmVsLCBJ bnZhbGlkT2lkKTsKKwogCS8qCiAJICogRXh0cmEgY2hlY2tzIHdoZW4gY3JlYXRpbmcgYSBQ UklNQVJZIEtFWSBpbmRleC4KIAkgKi8KQEAgLTExMjIsOCArMTEzMSw4IEBAIERlZmluZUlu ZGV4KFBhcnNlU3RhdGUgKnBzdGF0ZSwKIAkJCQkJKGVycmNvZGUoRVJSQ09ERV9GRUFUVVJF X05PVF9TVVBQT1JURUQpLAogCQkJCQkgZXJybXNnKCJpbmRleCBjcmVhdGlvbiBvbiBzeXN0 ZW0gY29sdW1ucyBpcyBub3Qgc3VwcG9ydGVkIikpKTsKIAotCi0JCWlmIChhdHRubyA+IDAg JiYKKwkJLyogYWxsb3cgdmlydHVhbCBnZW5lcmF0ZWQgY29sdW1ucyBpbiBpbmNsdWRlKC4u LikqLworCQlpZiAoYXR0bm8gPiAwICYmIGkgPCBudW1iZXJPZktleUF0dHJpYnV0ZXMgJiYK IAkJCVR1cGxlRGVzY0F0dHIoUmVsYXRpb25HZXREZXNjcihyZWwpLCBhdHRubyAtIDEpLT5h dHRnZW5lcmF0ZWQgPT0gQVRUUklCVVRFX0dFTkVSQVRFRF9WSVJUVUFMKQogCQkJZXJlcG9y dChFUlJPUiwKIAkJCQkJZXJyY29kZShFUlJDT0RFX0ZFQVRVUkVfTk9UX1NVUFBPUlRFRCks CkBAIC0xMTM1LDEzICsxMTQ0LDEyIEBAIERlZmluZUluZGV4KFBhcnNlU3RhdGUgKnBzdGF0 ZSwKIAl9CiAKIAkvKgotCSAqIEFsc28gY2hlY2sgZm9yIHN5c3RlbSBhbmQgZ2VuZXJhdGVk IGNvbHVtbnMgdXNlZCBpbiBleHByZXNzaW9ucyBvcgotCSAqIHByZWRpY2F0ZXMuCisJICog QWxzbyBjaGVjayBmb3Igc3lzdGVtIGNvbHVtbnMgdXNlZCBpbiBleHByZXNzaW9ucyBvciBw cmVkaWNhdGVzLgogCSAqLwogCWlmIChpbmRleEluZm8tPmlpX0V4cHJlc3Npb25zIHx8IGlu ZGV4SW5mby0+aWlfUHJlZGljYXRlKQogCXsKIAkJQml0bWFwc2V0ICAqaW5kZXhhdHRycyA9 IE5VTEw7Ci0JCWludAkJCWo7CisJCS8qaW50CQkJajsqLwogCiAJCXB1bGxfdmFyYXR0bm9z KChOb2RlICopIGluZGV4SW5mby0+aWlfRXhwcmVzc2lvbnMsIDEsICZpbmRleGF0dHJzKTsK IAkJcHVsbF92YXJhdHRub3MoKE5vZGUgKikgaW5kZXhJbmZvLT5paV9QcmVkaWNhdGUsIDEs ICZpbmRleGF0dHJzKTsKQEAgLTExNjAsNyArMTE2OCw3IEBAIERlZmluZUluZGV4KFBhcnNl U3RhdGUgKnBzdGF0ZSwKIAkJICogY291bGQgYmUgc3VwcG9ydGVkLCBidXQgaXQgbmVlZHMg c3VwcG9ydCBpbgogCQkgKiBSZWxhdGlvbkdldEluZGV4RXhwcmVzc2lvbnMoKSBhbmQgUmVs YXRpb25HZXRJbmRleFByZWRpY2F0ZSgpLgogCQkgKi8KLQkJaiA9IC0xOworCQkvKmogPSAt MTsKIAkJd2hpbGUgKChqID0gYm1zX25leHRfbWVtYmVyKGluZGV4YXR0cnMsIGopKSA+PSAw KQogCQl7CiAJCQlBdHRyTnVtYmVyCWF0dG5vID0gaiArIEZpcnN0TG93SW52YWxpZEhlYXBB dHRyaWJ1dGVOdW1iZXI7CkBAIC0xMTcyLDcgKzExODAsNyBAQCBEZWZpbmVJbmRleChQYXJz ZVN0YXRlICpwc3RhdGUsCiAJCQkJCQkgc3RtdC0+aXNjb25zdHJhaW50ID8KIAkJCQkJCSBl cnJtc2coInVuaXF1ZSBjb25zdHJhaW50cyBvbiB2aXJ0dWFsIGdlbmVyYXRlZCBjb2x1bW5z IGFyZSBub3Qgc3VwcG9ydGVkIikgOgogCQkJCQkJIGVycm1zZygiaW5kZXhlcyBvbiB2aXJ0 dWFsIGdlbmVyYXRlZCBjb2x1bW5zIGFyZSBub3Qgc3VwcG9ydGVkIikpKTsKLQkJfQorCQl9 Ki8KIAl9CiAKIAkvKiBJcyBpbmRleCBzYWZlIGZvciBvdGhlcnMgdG8gaWdub3JlPyAgU2Vl IHNldF9pbmRleHNhZmVfcHJvY2ZsYWdzKCkgKi8KZGlmZiAtLWdpdCBhL3NyYy9iYWNrZW5k L3V0aWxzL2NhY2hlL3JlbGNhY2hlLmMgYi9zcmMvYmFja2VuZC91dGlscy9jYWNoZS9yZWxj YWNoZS5jCmluZGV4IDA1NzJhYjQyLi43YjUzMTYyOCAxMDA2NDQKLS0tIGEvc3JjL2JhY2tl bmQvdXRpbHMvY2FjaGUvcmVsY2FjaGUuYworKysgYi9zcmMvYmFja2VuZC91dGlscy9jYWNo ZS9yZWxjYWNoZS5jCkBAIC05MSw2ICs5MSw3IEBACiAjaW5jbHVkZSAidXRpbHMvcmVzb3du ZXIuaCIKICNpbmNsdWRlICJ1dGlscy9zbmFwbWdyLmgiCiAjaW5jbHVkZSAidXRpbHMvc3lz Y2FjaGUuaCIKKyNpbmNsdWRlICJyZXdyaXRlL3Jld3JpdGVIYW5kbGVyLmgiCiAKICNkZWZp bmUgUkVMQ0FDSEVfSU5JVF9GSUxFTUFHSUMJCTB4NTczMjY2CS8qIHZlcnNpb24gSUQgdmFs dWUgKi8KIApAQCAtNTEwMiw2ICs1MTAzLDggQEAgUmVsYXRpb25HZXRJbmRleEV4cHJlc3Np b25zKFJlbGF0aW9uIHJlbGF0aW9uKQogCWJvb2wJCWlzbnVsbDsKIAljaGFyCSAgICpleHBy c1N0cmluZzsKIAlNZW1vcnlDb250ZXh0IG9sZGN4dDsKKwlEYXR1bQkJaGVhcFJlbGlkRGF0 dW07CisJT2lkICAgICAgICAgaGVhcFJlbGlkOwogCiAJLyogUXVpY2sgZXhpdCBpZiB3ZSBh bHJlYWR5IGNvbXB1dGVkIHRoZSByZXN1bHQuICovCiAJaWYgKHJlbGF0aW9uLT5yZF9pbmRl eHBycykKQEAgLTUxMzgsNiArNTE0MSwxNSBAQCBSZWxhdGlvbkdldEluZGV4RXhwcmVzc2lv bnMoUmVsYXRpb24gcmVsYXRpb24pCiAJLyogTWF5IGFzIHdlbGwgZml4IG9wZnVuY2lkcyB0 b28gKi8KIAlmaXhfb3BmdW5jaWRzKChOb2RlICopIHJlc3VsdCk7CiAKKwloZWFwUmVsaWRE YXR1bSA9IGhlYXBfZ2V0YXR0cihyZWxhdGlvbi0+cmRfaW5kZXh0dXBsZSwKKwkJCQkJCQkg QW51bV9wZ19pbmRleF9pbmRyZWxpZCwKKwkJCQkJCQkgR2V0UGdJbmRleERlc2NyaXB0b3Io KSwKKwkJCQkJCQkgJmlzbnVsbCk7CisJQXNzZXJ0KCFpc251bGwpOworCWhlYXBSZWxpZCA9 IERhdHVtR2V0T2JqZWN0SWQoaGVhcFJlbGlkRGF0dW0pOworCisJcmVzdWx0ID0gKExpc3Qg KilFeHBhbmRWaXJ0dWFsR2VuZXJhdGVkQ29sdW1ucygoTm9kZSAqKSByZXN1bHQsIE5VTEws IGhlYXBSZWxpZCk7CisKIAkvKiBOb3cgc2F2ZSBhIGNvcHkgb2YgdGhlIGNvbXBsZXRlZCB0 cmVlIGluIHRoZSByZWxjYWNoZSBlbnRyeS4gKi8KIAlvbGRjeHQgPSBNZW1vcnlDb250ZXh0 U3dpdGNoVG8ocmVsYXRpb24tPnJkX2luZGV4Y3h0KTsKIAlyZWxhdGlvbi0+cmRfaW5kZXhw cnMgPSBjb3B5T2JqZWN0KHJlc3VsdCk7CkBAIC01MjE1LDYgKzUyMjcsOCBAQCBSZWxhdGlv bkdldEluZGV4UHJlZGljYXRlKFJlbGF0aW9uIHJlbGF0aW9uKQogCWJvb2wJCWlzbnVsbDsK IAljaGFyCSAgICpwcmVkU3RyaW5nOwogCU1lbW9yeUNvbnRleHQgb2xkY3h0OworCURhdHVt CQloZWFwUmVsaWREYXR1bTsKKwlPaWQgICAgICAgICBoZWFwUmVsaWQ7CiAKIAkvKiBRdWlj ayBleGl0IGlmIHdlIGFscmVhZHkgY29tcHV0ZWQgdGhlIHJlc3VsdC4gKi8KIAlpZiAocmVs YXRpb24tPnJkX2luZHByZWQpCkBAIC01MjU4LDYgKzUyNzIsMTUgQEAgUmVsYXRpb25HZXRJ bmRleFByZWRpY2F0ZShSZWxhdGlvbiByZWxhdGlvbikKIAkvKiBNYXkgYXMgd2VsbCBmaXgg b3BmdW5jaWRzIHRvbyAqLwogCWZpeF9vcGZ1bmNpZHMoKE5vZGUgKikgcmVzdWx0KTsKIAor CWhlYXBSZWxpZERhdHVtID0gaGVhcF9nZXRhdHRyKHJlbGF0aW9uLT5yZF9pbmRleHR1cGxl LAorCQkJCQkJCSBBbnVtX3BnX2luZGV4X2luZHJlbGlkLAorCQkJCQkJCSBHZXRQZ0luZGV4 RGVzY3JpcHRvcigpLAorCQkJCQkJCSAmaXNudWxsKTsKKwlBc3NlcnQoIWlzbnVsbCk7CisJ aGVhcFJlbGlkID0gRGF0dW1HZXRPYmplY3RJZChoZWFwUmVsaWREYXR1bSk7CisKKwlyZXN1 bHQgPSAoTGlzdCAqKUV4cGFuZFZpcnR1YWxHZW5lcmF0ZWRDb2x1bW5zKChOb2RlICopIHJl c3VsdCwgTlVMTCwgaGVhcFJlbGlkKTsKKwogCS8qIE5vdyBzYXZlIGEgY29weSBvZiB0aGUg Y29tcGxldGVkIHRyZWUgaW4gdGhlIHJlbGNhY2hlIGVudHJ5LiAqLwogCW9sZGN4dCA9IE1l bW9yeUNvbnRleHRTd2l0Y2hUbyhyZWxhdGlvbi0+cmRfaW5kZXhjeHQpOwogCXJlbGF0aW9u LT5yZF9pbmRwcmVkID0gY29weU9iamVjdChyZXN1bHQpOwpAQCAtNzAxOSwzICs3MDQyLDQ2 IEBAIFJlc093bmVyUmVsZWFzZVJlbGF0aW9uKERhdHVtIHJlcykKIAogCVJlbGF0aW9uQ2xv c2VDbGVhbnVwKChSZWxhdGlvbikgRGF0dW1HZXRQb2ludGVyKHJlcykpOwogfQorCitOb2Rl ICoKK0V4cGFuZFZpcnR1YWxHZW5lcmF0ZWRDb2x1bW5zKE5vZGUgKm5vZGUsIFJlbGF0aW9u IGhlYXBSZWxhdGlvbiwgT2lkIGhlYXBSZWxJZCkKK3sKKwlib29sIAkJCQkgb3BlbmVkX3Jl bGF0aW9uID0gZmFsc2U7CisJVHVwbGVEZXNjCQkJIHR1cGRlc2M7CisKKwlpZiAobm9kZSA9 PSBOVUxMIHx8IChoZWFwUmVsYXRpb24gPT0gTlVMTCAmJiBoZWFwUmVsSWQgPT0gSW52YWxp ZE9pZCkpCisJCXJldHVybiBub2RlOworCisJaWYgKGhlYXBSZWxhdGlvbiA9PSBOVUxMKQor CXsKKwkJaGVhcFJlbGF0aW9uID0gdGFibGVfb3BlbihoZWFwUmVsSWQsIE5vTG9jayk7CisJ CW9wZW5lZF9yZWxhdGlvbiA9IHRydWU7CisJfQorCisJdHVwZGVzYyA9IFJlbGF0aW9uR2V0 RGVzY3IoaGVhcFJlbGF0aW9uKTsKKwlpZiAoKHR1cGRlc2MtPmNvbnN0ciAmJiB0dXBkZXNj LT5jb25zdHItPmhhc19nZW5lcmF0ZWRfdmlydHVhbCkpCisJeworCQlpbnQJCQkJajsKKwkJ Qml0bWFwc2V0CQkqaW5kZXhhdHRycyA9IE5VTEw7CisKKwkJcHVsbF92YXJhdHRub3Mobm9k ZSwgMSwgJmluZGV4YXR0cnMpOworCisJCWogPSAtMTsKKwkJd2hpbGUgKChqID0gYm1zX25l eHRfbWVtYmVyKGluZGV4YXR0cnMsIGopKSA+PSAwKQorCQl7CisJCQlBdHRyTnVtYmVyCWF0 dG5vID0gaiArIEZpcnN0TG93SW52YWxpZEhlYXBBdHRyaWJ1dGVOdW1iZXI7CisKKwkJCWlm IChhdHRubyA+IDAgJiYKKwkJCQlUdXBsZURlc2NBdHRyKHR1cGRlc2MsIGF0dG5vIC0gMSkt PmF0dGdlbmVyYXRlZCA9PSBBVFRSSUJVVEVfR0VORVJBVEVEX1ZJUlRVQUwpCisJCQl7CisJ CQkJbm9kZSA9IGV4cGFuZF9nZW5lcmF0ZWRfY29sdW1uc19pbl9leHByKG5vZGUsIGhlYXBS ZWxhdGlvbiwgMSk7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9CisKKwlpZiAob3BlbmVk X3JlbGF0aW9uKQorCQl0YWJsZV9jbG9zZShoZWFwUmVsYXRpb24sIE5vTG9jayk7CisKKwly ZXR1cm4gbm9kZTsKK30KZGlmZiAtLWdpdCBhL3NyYy9pbmNsdWRlL3V0aWxzL3JlbGNhY2hl LmggYi9zcmMvaW5jbHVkZS91dGlscy9yZWxjYWNoZS5oCmluZGV4IDg5YzI3YWExLi4wN2U3 MDI3MyAxMDA2NDQKLS0tIGEvc3JjL2luY2x1ZGUvdXRpbHMvcmVsY2FjaGUuaAorKysgYi9z cmMvaW5jbHVkZS91dGlscy9yZWxjYWNoZS5oCkBAIC0xNjEsNCArMTYxLDYgQEAgZXh0ZXJu IFBHRExMSU1QT1JUIGJvb2wgY3JpdGljYWxSZWxjYWNoZXNCdWlsdDsKIC8qIHNob3VsZCBi ZSB1c2VkIG9ubHkgYnkgcmVsY2FjaGUuYyBhbmQgcG9zdGluaXQuYyAqLwogZXh0ZXJuIFBH RExMSU1QT1JUIGJvb2wgY3JpdGljYWxTaGFyZWRSZWxjYWNoZXNCdWlsdDsKIAorZXh0ZXJu IE5vZGUgKkV4cGFuZFZpcnR1YWxHZW5lcmF0ZWRDb2x1bW5zKE5vZGUgKm5vZGUsIFJlbGF0 aW9uIGhlYXBSZWxhdGlvbiwgT2lkIGhlYXBSZWxJZCk7CisKICNlbmRpZgkJCQkJCQkvKiBS RUxDQUNIRV9IICovCg== ------=_NextPart_6A49C9A9_E0657D40_6AAF3ADB Content-Type: application/octet-stream; charset="utf-8"; name="=?utf-8?B?djIt55u45YWz5oiQ5ZGY44CB5Ye95pWw55qE5pW05L2T5YiG5p6QLnhsc3g=?=" Content-Disposition: attachment; filename="=?utf-8?B?djIt55u45YWz5oiQ5ZGY44CB5Ye95pWw55qE5pW05L2T5YiG5p6QLnhsc3g=?=" Content-Transfer-Encoding: base64 UEsDBBQABgAIAAAAIQBgknq+gAEAAAwGAAATAAgCW0NvbnRlbnRfVHlwZXNdLnhtbCCiBAIo oAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADEVM1KAzEQvgu+w5Kr7Kb2ICLdevDnqELr A6TJdDc0m4TMVNu3dzbaIlJbigUvWbLJfD+T5BvdrjpXvEFCG3wtLquBKMDrYKxvavE6fSyv RYGkvFEueKjFGlDcjs/PRtN1BCy42mMtWqJ4IyXqFjqFVYjgeWUeUqeIp6mRUemFakAOB4Mr qYMn8FRSjyHGo3uYq6Wj4mHFvz+VzKwXxd3nvp6qFipGZ7UiFirfvPlBUob53GowQS87hq4w JlAGWwDqXBWTZcY0ASI2hkLu5Ezg8DjSL1cVV2Zh2NqIF2z9F4Z+5XdXX3XPfBzJGiheVKIn 1bF3uXLyPaTFLIRFtR/k2NbkFlWdsn6jew9/3owyfy5PLKT3l4GP1DH8Jx3Edx1kHv/eigxz wDjS2gGe+vgz6CHmViUwE+JX1JxcwHfsAzq0cvqu5at64iZscffxc7S8pBCR0yvB8QI2UdFX l5GBIJGFbVjsenRbRo6+PzuGPlsNmB3cMmf5+AMAAP//AwBQSwMEFAAGAAgAAAAhALVVMCP0 AAAATAIAAAsACAJfcmVscy8ucmVscyCiBAIooAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AACskk1PwzAMhu9I/IfI99XdkBBCS3dBSLshVH6ASdwPtY2jJBvdvyccEFQagwNHf71+/Mrb 3TyN6sgh9uI0rIsSFDsjtnethpf6cXUHKiZylkZxrOHEEXbV9dX2mUdKeSh2vY8qq7iooUvJ 3yNG0/FEsRDPLlcaCROlHIYWPZmBWsZNWd5i+K4B1UJT7a2GsLc3oOqTz5t/15am6Q0/iDlM 7NKZFchzYmfZrnzIbCH1+RpVU2g5abBinnI6InlfZGzA80SbvxP9fC1OnMhSIjQS+DLPR8cl oPV/WrQ08cudecQ3CcOryPDJgosfqN4BAAD//wMAUEsDBBQABgAIAAAAIQD+aepXCgEAAMwD AAAaAAgBeGwvX3JlbHMvd29ya2Jvb2sueG1sLnJlbHMgogQBKKAAAQAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC8k09LxDAQxe+C3yHM3aatuohsugdF2KuuHyCk 06Zsm5TM+Kff3lCxdWGpl+Jx3pD3fjwy291n14p3DNR4pyBLUhDojC8bVyt4PTxd3YEg1q7U rXeoYECCXXF5sX3GVnN8RLbpSUQXRwosc38vJRmLnabE9+jipvKh0xzHUMtem6OuUeZpupHh twcUJ55iXyoI+/IaxGHoY/Lf3r6qGoOP3rx16PhMhOTIhdFQhxpZwTh+i1kSQUGeZ8jXZPjw 4UgWkWeOSSI5bvIlmOyfYRab2awJY3RrHqxu3NzMJC01crsmBFkdsHzhEC+AZpATeQnmZlUY Htp4cNOHpXH+iZcnN1h8AQAA//8DAFBLAwQUAAYACAAAACEAbtd2//MCAABdBQAADwAAAHhs L3dvcmtib29rLnhtbKxUW2vUQBh9F/wPw7ynuWy21mWz0stWC0VKrQplX2aT2c3QSSbOTLq7 iGBRvBRBBfVBpFZF1Ieigoho7a9x0/4MvySuXe2LohAyt+R8l3PO1E/1I47WqVRMxB62JyyM aOyLgMVdD59fmTemMFKaxAHhIqYeHlCFTzWOH6v3hFxrC7GGACBWHg61TmqmqfyQRkRNiITG cNIRMiIalrJrqkRSEqiQUh1x07GsSTMiLMYlQk3+CYbodJhP54SfRjTWJYiknGhIX4UsUSO0 yP8TuIjItTQxfBElANFmnOlBAYpR5NcWurGQpM2h7L5dHSHD9Ah0xHwplOjoCYAyyySP1Gtb pm2XJTfqHcbphbLtiCTJWRLlUThGnCjdDJimgYcnYSl69JcNmSYzKeNwaruuY2Gz8ZOKJYkC 2iEp1ytAwggePqxWHMfJv4SiprmmMiaazopYQw9/dP9f+1Vgz4YC2EHL9FLKJAVR5G1r1OFN /BppqyWiQ5RK7uG5WmtxdbUVtCPVWjqdfb63v72x//h6/mw/2H/zsZXdun+4cCxn0rAmDcc1 skfvhptPD659NYZPXu9/eD7cffjt087w+dZwczt78Da7s7HOpE4JR10aUwl1Bq0x5shRWfwF d8TPm2hCF8tKy/nvHW3Uc19cYLSnDrnJl6h/kcWB6HkYXDYYm/eK7Yss0KGHnYrlwnm5d4ay bqiBQqsCXCPia7ZOV0gbdopUxiIVxoKIxYjiQlDzAIwk7aacSET7YECVG11lT19mt/eynRcH r64fPHt9sLc33L0LRs+9uQDScjCSNQYTuRAUgcZBz6UR+GaA4FJA0zHhA8VU9v5mdvXL8O7m 8NaNbOveGJQ9BlVo0Bwl6hPug2TzIY9pV52qXQSjfb2odKMOI6iFefiy7VrTJ6yTrmE1K1XD nTrpGFNuxTFm3TmnWT3RnGvOVK/8X4OCaGujOy7PMiRSr0jir8HNuEw7M0SBYUsSIE9Qwihr c/RX4zsAAAD//wMAUEsDBBQABgAIAAAAIQBgoU4aHQQAAD4aAAANAAAAeGwvc3R5bGVzLnht bOxZzY7bNhC+F+g7CLxr9WPLsQ1JQRyvgAApEGA3QK+0RNlEKFKQ6I2doLfecsxD9NZzLn2b BshjdEhJtprNbuyV7XWA6GCLFDnzzXDmIzXyn64yZtyQoqSCB8i5sJFBeCwSyucBen0dmUNk lBLzBDPBSYDWpERPw19/8Uu5ZuRqQYg0QAQvA7SQMh9bVhkvSIbLC5ETDk9SUWRYQrOYW2Ve EJyUalLGLNe2B1aGKUeVhHEW7yIkw8WbZW7GIsuxpDPKqFxrWcjI4vGLORcFnjGAunL6OG5k 68Yt8RmNC1GKVF6AOEukKY3JbZQja2SBpNBPBZelEYsllwF6AqKVhvEbLt7ySD0CB9ajQr98 Z9xgBj0OskI/FkwUhgTPADDdw3FGqhGf//7w7z8f1agUZ5Stq15XT1vgogQPV5J6fdWn/VtP zShYqzotBa0CuFU9Uk9OoKdtYjGfBSiCy4brR9Dfe7ifZ2o1Oi7zEdTvvQQdMDyK+TrYS4h2 ytgmHV2VedAR+kALkhQ8goZR31+vc8g7DgxWJYse953R8wKvHddrTbC0wtCfiSIBxmyIQGmu ukKfkVRCVBR0vlD/UuTwOxNSAr2EfkLxXHDMVMI2M9ozgWmBVAMkF0CKDWlQnpAVSQI00Olv KRW1hp3Gaywayk7DAXKDeKfxlXHftq02EpYqJoxdKeN+Tzd+U1y5Sg2+zKJMvgADYe9RNNbc wiLVt5WPqkboY0bnPCMcaJEUksaKZWNokooJVyl4t62v0t5S7A4fpNlYpXtA2NcyB7aTWr6B 85ytJzrKqi1lB5MPqK/S/6xx83chGG8LnF+TFWyKemuz1BKcDs9CFPQdxI2KA5UcqBUXEM3o jOF9Fbbn4bMa1Bm5rUF0K99/YgTa0GxxZ7belx2HXGkg75Py1z36zt8jR2VYF7bRb+2dt3YY 9c6iKPug+03vUbV3tv28V2aPyD4MZx7bn212Ogzi/qPGnzrC7pR729NdB7ba+3TT2TknD8Bj I+52pPjpz69fDg593Bh0TecTHwZOifdcj8V3vpbf9X5zyjTq/IbY+YBzNA7VVQ+oc7TKLf8r tmyKIoYqCgfo86dPX/76s3Vuny0pk5RXVQ5VpNrMAJnJalu60ZVdqcrsuqiz0QLbX0JSvGTy evMwQNv730hClxkcKupRr+iNkFpEgLb3L1X1zBmoyhsUFV6WUO6Cf2NZ0AC9v5w8GU0vI9cc 2pOh2e8Rzxx5k6np9Z9PptNoZLv28z9aVf8ONX/9bQIqGU5/XDL4MlDUxtbgr7Z9AWo1Kvi6 bgiw29hH7sB+5jm2GfVsx+wP8NAcDnqeGXmOOx30J5de5LWwew/D7tiW41QfVhR4byxpRhjl zVo1K9TuhUWC5j1GWM1KWNsPP+F/AAAA//8DAFBLAwQUAAYACAAAACEAO20yS8EAAABCAQAA IwAAAHhsL3dvcmtzaGVldHMvX3JlbHMvc2hlZXQyLnhtbC5yZWxzhI/BisIwFEX3A/5DeHuT 1oUMQ1M3IrhV5wNi+toG25eQ9xT9e7McZcDl5XDP5Tab+zypG2YOkSzUugKF5GMXaLDwe9ot v0GxOOrcFAktPJBh0y6+mgNOTkqJx5BYFQuxhVEk/RjDfsTZsY4JqZA+5tlJiXkwyfmLG9Cs qmpt8l8HtC9Ote8s5H1Xgzo9Uln+7I59Hzxuo7/OSPLPhEk5kGA+okg5yEXt8oBiQet39p5r fQ4Epm3My/P2CQAA//8DAFBLAwQUAAYACAAAACEAFlQyOg5gAABcSwIAGAAAAHhsL3dvcmtz aGVldHMvc2hlZXQyLnhtbKydW5MbubWs30/E+Q8KnWdLzTt7YmYcbpLNJlnlcNjn8tyj6fEo LKl1pB5f9q/fSWIBWCsTbHbJ3g97Zj4nwOoECkAW6vL97//58cOrvz98+fr+8dMPr0dvrl6/ evj07vHn95/++sPr//O/b3+3fP3q69P9p5/vPzx+evjh9b8evr7+/Y//8398/4/HL3/7+uvD w9Mr1PDp6w+vf316+vzd27df3/368PH+65vHzw+f8L/88vjl4/0T/vPLX99+/fzl4f7nU6GP H96Or67mbz/ev//0OtXw3ZeX1PH4yy/v3z2sH9/99vHh01Oq5MvDh/snHP/XX99//ppr+/ju JdV9vP/yt98+/+7d48fPqOKn9x/eP/3rVOnrVx/ffbf766fHL/c/fcDf/c/R9P5drvv0H1L9 x/fvvjx+ffzl6Q2qe5sOVP/m67fXb1HTj9///B5/wdH2V18efvnh9R9G3/15ejV9/fbH708O /d/3D//46v791dP9T395+PDw7unhZzTU61f/9fj48S/v7o8Hd41WK//5x6PjHxI8NtJPj49/ O1a2Q7Er/O7n+08Pr/71l8/4U0/1PD1+7h5+eVo9fEChP4xfv7p/9/T+7w9/guyH1z89Pj09 fjz+76du8AT0y5fH/3r4dDrO0+Ec/4JjnVGcKkmV3l6j8P8//ZX4V/yBb8tf6P89/7W3py7z py+vfn745f63D09/fvzH3cP7v/56PNzpmyka4dgW3/38r/XD13foBPiz3oxnx3rfPX5AJfj/ rz6+P/ZmNOL9P0///Mf7n59+/eH18s1yOV+MlovZ8c/518k7K5iK4M8/FcE/rchk+maxWEym E1dmBL9/evj6dGsWvvvtK1z6f+k3RqHCiVWIf1qFo2s9iBEO9ZlK8Defjgr/tEqmozfj8Gdc qAF/76mGeT2M2Zv5fHo1h3PZigt1LKwO/DP/KTjsYuNzfwAGkdPP45+lJcRV9JJnPMD/eqoC /8wtM3szmYyvJiP3Jzxfx7HdUo/Av9TmYB8uVFK6Ff7lQr96m3rkqbuv75/uf/z+y+M/XmGg OxqHkwbD5ui7EfrGsXOP0TvPdW706mOxPxzLpbP2h9dfcTL//cf5YvL927/jPHpnmpukQVWo 0zTzWdSskga9vGoWpFk3NHP6rY1qlotx/K3blobq2bb+rlGs566lod/aZc1xMDgatmdwYNAx 6B14i+YqbQa3Qpu1h6HcUkf1D69xxhaHr6idsiIf64rBmsGGwS2DLYM7BjsGewYHBl0CaWA7 uto7ECxCTx5g0VF97MzZgJsElgWsEhgXsM6gurpYLqOvGy50y2Cbf7jWMqXOf8fHtmuUmccf 3nOZA4OOQe9AMBL9ZoCRRzWMxMBcOhudPDdJMq5WroxUbxlsGNwy2NoPlzruGOwY7BkcGHQM egeCSceZiwfR4yydZpGyZrg0ph6rweiL094NmNS2N0VUztZERpgsSrHlYhq7xNqKYbpxAy0N BJuGaDld0CjaEs3p57Z2TO7XuJ67JEG/q0c9v46/tcuaMooyODDoGPQOhEbDCuSbZr5juVMr ldFCyCqR0CTzBbXk2oqFJmEHNg3RckoDzW0R5UPa2gF4/6nQXZbkMrtGGWqPPZc5MOgY9A4E +zFGDBhYjupoupBVIvg918Op864bmjlpNkmzKGPJLYNtAv48ndGpdNeQ0Ei4y5LSuRkcGHQM egeCu8ew7Eek55cIR3V0V8gqkXkdpRlsEnC+JRAHJu67WxO5VpvRWuquIaFl2y5LipcMDgw6 Br0DwctjaHy5l0d19FLIKhHnJYNNAs5LBtsEQh+kQfiuIaHVxS5Lim8MDgw6Br0DwbdjyBlg 3EkenVO0MuS8E7Ix4twzErvinPrZNqt8X6RB+66loQFkVzR18X+0wq8wD6LphPSeRGePyYAX HLPFG4x9z5/ox2CtSwyaGW6qqqwxDNEiQ4KaVf/8KiNX71XLKU01t02VNplmsRlPdPnYw0qD RLsiqm2miU0jm2a2c6FtxKntxUk7ZRwsC8uC41RXOFVWhi4sOXLB59ccLZWuA6uqrDryQfgT iNr1rmjKukPIPhOfI7iDHKRYJ6T3JJ5BwwLi8coIjeqKVoaeX4G0RLIEMZEfwdIRVLI1TUgL vAppaGa8DCma2vMlP4qmE9J7Er0eliFHFu58fxe0MpWfB5Koko1pvItJ4/vVktflWysWjJVL QDkK1sXmjNckpZ5qrGRO0XRCek+isZw7Lwz+Eh1vRpomDXljk8gbm4g3lsnW6gku8sKuoZnx CqVoqos5XGZyEE0npPckunhMKC9f340k7d0oWhnyLqZy3sVEvIuZ+EwsqxTNaXw19M5+PqwO ZZXCUW1fSlVjJd+JpvckGjss4h2vGh3HWLRuCXD0t99UTV2ZlGIZrVW1UXSraKvoTtFO0V7R QVFnyF2+9CR6NyzAjTjM3BhxlzCNuGuYhTx3EVOK3QrZlp930ZvDiBziTsheyEFIJ6T3JJo4 LLkd1050pVx2NLKkdj8m61JN1myE3ArZCrkTshOyF3IQ0hnxve5cYhsPS2wnebhubsT1OiOu 1xXyXK+TYrdCtuXnXa/jq+ctDUW6nfwZeyEHIZ2Q3pPQD49XdIds2GimoZPp5lQjdpHrBoUR 77OFsaLZiOZWyNZI7S13QnZC9kIOQjohvSfRsFZWSlvuAy+pY5/heE7HJTlFkpsiKmd1sxhF xrWJ/BXsOV9335gIY1Su/FbRNqNw7ZJ2HVsaTrEtDV/DLZoyywvphPSexLYalqTGKVvUZdCN kJWQtZGJ68uWUbyvgrZWzq+DFpyRWhrOSEVTFqFCDkI6Ib0n0cVhGWnMWedGyErI2oh30QKJ d1HQ1soFF3kp39JwICqa6qIEItF0QnpPoovDAtHpdo3j4JCP50bISsjaiHfRAol3UdDWygUX eZFUNOXiSKsUTXJ7KXUQ0gnpPYkuDgtEYw42N0JWQtZGvIuWNbyLgrZWLrjI12iLprqomWlB eWgvpQ5COiG9J9HFYelnnHemal9kshLN2oh30XaEvIuCtlYuuMiXTVsa3p8tmnpGyyaWaDoh vSfRxWE5aMybUjdCVkLWRryLlqe8i4K2Vs67uJTZhZPZrpSqnukG15JmoIOU6oT0nkQXhwWh cWPjiG8ZShK/AE3EL0CZbKziqrkVsi0/nu25E7ITshdyENIJ6T0Jhk04CNV7PgcuQE810QKU G/emiMoCtFmM7+kwkb9gMucOuDGR68lCtkZCR+YJvqXhCb5oStcWchDSCek9ie0yLElNUgRy E7yQlZC1kXQj7/Eus40R72GquZKtaYKHPL0XTZmYWqV4epdSByGdkN6T6CGHq+evGk9ygioT k5CVkLUR72Gqx3uYibvaybsTW6so2MrzfUvDVzuLpnZNvpnwIJpOSO9JtHVYDppIDhKyErI2 4m1N9XhbM3G28s1XW6so2MoLgKKpvTVvDLmqOV5KqYOQTkjvSbR1WDCaSDASshKyNuJtTfV4 W5lsrZT38Jqn/5aGw2XR1K4psUg0nZDek+jhsFg04f2eGyErIWsj3sNUj/cwk2fP+Ly9U0XX Mhk1NDIZ8TbR3g6xXts6COmE9J5EW4flpInkJCErIWsj3tZUj7eVydZKha4pk5FmomvefCv1 1K7JO0IH0XRCek+ih8NS0kRSkpCVkLUR72Gqx3vIZGulgocy83Da2bVKcdIsmuzqQUgnpPck ejgsI00kIwlZCVkb8R6meryHmTw782jYuZaZp6Hh6GkHVE/mvZCDkE5I70m0dVhomqS049ea TFaiWRvxtnKyujUNPHH3d1Of2prI99bRlcxGfO/erlmMJqh9EdX+yhV1ouk9CcZOh+0yneTh Kp2QlZC1EWesEddfhWyNRBd58mmKePYpojJyCjkI6YT0nkQXh0WhqUQhISshayPeRQ4+t6YJ 3VPWmyaKxvKM1BTxlFRE1dh0SG5aF00npPckGjssH00tRvh7iviZDdPg6n8J+Bm5p17sPr+6 xyGaWyHb/PPuyRfONTvR7IUchHRCek+iZcOyz5TvL7sx4i4nGXGXkwrx4YNmhY0UuxWyLT9f Kxpd8cwux7hrFuOpXYodQrEHPCn5y4+/e7XCM+JPX3579/Tq5/un3z7iufd3T49fXuEZ9Vd4 uP3V+08/P/zz1dNvnz88fP/2l+PDlf/rj3/oN7+PF+E6+bHek9hCHKO++YLWNCcst+u+5Pt0 iqj291YxvqDVrJuf9DSRu21KyNZIHG54ldEU8TKjiOpwI+FMNJ2Q3pPYMsPC2VTCmZCVkLWQ jRHvotzCZ5rg4ojXFEVUrhII2Qs5NKumdUcnxXpPoovDsthUspiQlZC1kI0R72Kq2d2na5ro oqwpOFbtSrHa8TSwjUZ0dhykWCek9yS6yGns20eJHNT8KCHTouxwTVvFZJTgYhsr5pshaXwz 5KjmRv2RrEBaIlmBcOjb2+/7FQhrOtH0nsRmGBbophLohKyErIVsjHgXU83eRU1mo5HMnbLn ZVXHc0DmTi52KMXyOdAJ6T2JLob8hrqfv849lfwmZCVkLWRjxLuYavYu6gbbaCTTU0sk0xMH sb39vu+LEtZE03sSXJyFsHbRxZM8hDUhKyFrIRsjzkUhWyOhU415eiqiMj01i3HklWIHIZ2Q 3pPoYghrcPGbB9ZZznF+YOUHuIqoLL+axfjxraaIV9gm8i2TDsn1b9PEluEpryniGF1EZRYU chDSCek9iS0T0t7l/i27YTMmKyFrIRsj3sVUj3cxBzk3Y415xrKK6um+K8QX4z1FKXYQ0gnp PYkuhgB42UXZ/JoxWQlZC9kY8S6meryLumc1GvOMZRXFDstbiEVU+yIH2YNoOiG9J9HFENIu uyh7XTMmKyFrIRsj3sVUj3cxhx7fqXjGsop8X2wV4x1DKXYQ0gnpPYkuhkB12UUJVDMmKyFr IRsj3kUJVKYJ3WwiMxbvW+2axWTG4mKHUqysnoT0nkQXQ6C67KIEqhmTlZC1kI0R76IEKtN4 F/XlIpKnSql69spWlmg6Ib2QPx9Jfd3NpM5z0dCQrS4bKjtdM0lLQtZCNka8oRKNTBO7Jc3E d0VUF1KNsDSh+WkvxQ5COiG9J9HFEI0uuyjRaMZkJWQtZGPEu5jq8UNkji++M/DzKFaRHyI5 9exFcxDSCemF/PlIXL+sc150lGPSty9Nc4LyS1OaRG9msilWiC8mS9NUDGNc3QPjB/03VpPb 4RGyNRL7Oh3kXVPEz1oUUR1QOGgdRNMJ6T0JLTMfFr1O8hC9hKyErI24HR4jzkUhWyPRRX7S v4jKiCFkL+QgpBPSexIt45z1fOaf5zCVj/BGyErI2oi3LNXjLWOytVLBsinP/U0R3y9URKXj CTkI6YT0nkQXh2WiuWQiISshayPeRblD0DTuLksj0UVOlkVUOx7vie1FcxDSCek9iZYNC0Bz CUBCVkLWRrxlcvefabxljQA05RhpxaKvfOGziGrHkwAkmk5I70l0cVgAmksAErISsjbiXUz1 uNvSTYNeU6cb2dM2UfSMk2VTxMmyiKqxsskkmk5I70k0dtgm01wykZCVkLURb2yqxxubiZ/H aYDbWkXRWHl9nd4COOJ3xOxKTdVYiUmi6YT0nkRjed/ptHoazd6g61yYe3I+cssevn30Zi4h yojbFy/EV0SWbqTYrZCtkWC7vNeuKZIZipPVvhTLDXEQ0gnpPYm2tzaqppMXuN7YYLrmp/zn krSMeNeTxo8Qc75NdSPFboVsjUTXZUZrRC1530ypqXZ23oU6iKYT0nsSXQ/hC0P/sbMn1wc+ FTPPKcz3WX7IvYjKVWwjvhlSRbEZaN7aSLFbIVsjsRlkluSstivFquesOYimE9J7Ej0P8Qye XxhVZBdrLoGrEB+4eJPVRD5wza9pctuYyK9706/55UdjG4tf8nNnFUX3+T0NRVS9lsAlmk5I 70nwejHsxsSTPAQuISshayNuljTiXBSyNRIN4thaRGXd2yxGM+leih2EdEJ6T6KLIYNd7LEL yWBCVkLWRryLksFM4/qikegix9Yiqi6mqkOxOUW3vRQ7COmE9J5EF0MGu+yiZLCF7EsV4tde 9GesTeSNlVhmGn95aSkPbpkomsavUWuK+FX6RVTOeyEHIZ2Q3pPodQhvl72W8LaQ3SshayPe WAlvpgnGSuwwUTSWr9Y2RTTG74qoGit5TjSdkN6TaGzrrsOXfF1i0bhb8JovJRZRWR8YCauB Jc9sDdFyxrvcRZTrvhWyNRIbgi/4tkQzntmKqDaE5D/RdEJ6T2JDcP775ou8p4/P0PPM/PzG TRHVlsmJ8rmLvM26pWV4V+3WirlL8UZiy3Ayb4o4mRdRbRkJkKLphPSexJYZduPiQvbZhKyE rIVsjLgNDSFbI9FFjuFNEd+lVETVRdl7E00npPckush58PlV8kI214SshKyFbIx4F2VzzTTB RXkHURHVNUcj8S14z1eKHYR0QnpPoouc7y64KJtrC9lcE7IWsjHiXZTNNdNEFzklF1F1sbEn x58p2kuxg5BOSO9JdHFYYltIYhOyErIWsjHiXUw1+3GxkcX4jWV3VlG0mi8FF1E9oyWLiaYT 0nsSXFwOy2InechiQlZC1kI2RpyLQrZGokE8uzRFPLsUUXFRyEFIJ6T3JLo4LIstJYsJWQlZ C9kY8S6mml1fNE10kWeXIipndLMY31EkxQ5COiG9J9HFYVlsKVlMyErIWsjGiHcx1exdzBtb bqdf3kFkFbmbDgrxxXh2kWIHIZ2Q3pPoIqesb16DLlNKCR9KWvKcelNVZRXaKrjgp2TX7er5 irqpfOukw/Kt09h642el7qwi3zqtYpTw9lLsIKQT0nsSW4ej2oUvxtiWmXtJ+1LQStFa0cZQ /LYEX0+4rarcnNuMsFSq97lw3rvLqvKE5E7IXshBSCek9ySaOWy7bWmbYt5MQStVrRVtDPlu yYFpa5ow9C45uDZFHFyLqE5gEo9E0wnpPYlODotHyxQr/LcyFK0UrRVtDHkn5VZE00Qn+bJs EdVJLKcf32/5sqwUOwjphPSeRCeHRaSl7W/5Pilopaq1oo0h76TEJNNEJ/nSbBFVJxsxiXdR 91LsIKQT0nsSnRwWk5a2ReWdFLRS1VrRxpB3UqKSaYKT13zhtYiqk7xvtW9WRJnrIBV1QnpP opPDotIyRYxwdgtaqWqtaGPIO5nj0nO3JlixaC5ffC2iam4jeF3zrbJS7CCkE9J7Esw9fot7 yHfL0ieqvLmnGuJnhhStFW0MOXOFbI1EJ3kSKqLipJB9syKaqA5SrBPSexKdHJairlPWCU4K WqlqrWhjiL6hRzPMbS6IFZi7X4kmlG2uy6+W+KL6XVPEt74WUZn2hRyEdEJ6T6LjwxLXdUpB wXFBK1WtFW0MXViN5oLRcX4pT64rOM6TWhHVPp5DXbVXY96Yc8tBKuqE9J5Ex1vpbDF+M7v2 /4c/d+CdHteNrLa4ounopqpKVmsXpOln3VItF9RfN6a61KZ2qKFN5YtzuS7/lRr+e+6aIt7X LKLazLL9JppOSO9JbNNhme5aM52ilaK1oo2hS+OW/WJwXHaSc13BcZ5zi6ieRbaF5tMh3yC4 l2IHIZ2Q3pPo+LDgd63BT9HKkH/KaM5vL1+/RLQxkZ+XJRyaxs/L4yu+Eaohku/KFU3t3pIN RdMJ6T2JZg/LhteaDRWtDPlvs/KW28Y03sacDJ9bO1qx6KyseDQayo1+paLqrGyniaYT0nsS nR2WFa81KypaGfLO8jbcxjTeWUmKpok28uX3hki+LFc01Ua5X1I0nZDek2jjsKB4rUFR0cqQ t5F33Tam8TbmmPjcDe1WLDrLVzMaohnvaxRNdZbT5UE0nZDek+jssOB4bfHLTwV8N4lp8J2b ugSxcFnf0ZZF9R1tQm6FbPPP13e0CdkJ2Qs5COmE9J4Ey/A2yMZHg7/po0qpqlMwrN1pcSUf Szv9In2mtjJflBpjnX/Bz3kLnoXwneeUWV0/V4SvOuePL9dfHF/xTlNVlQVEuyDvNWlBfNuZ P/eMjzszwtedHaKmGhY4R1eaOBsM384WHZxOzH+X0lCwNan8CbRckBVwOqnCACIvDKsq53Sr IO9HaUE4nQvmuuA0IzjtEDk9LGiOrjRpNhicFh2c5n1BdGDe0LtVBFsb6W/ENz9UlbO1VZA3 krQgbOUEClsZwVaHyNZhd1SOrkpKzAd/02CwVXSwlW++hK28EwdbM3ruCklWxQ7Mi9+qck7r lt14xC9d0YJwmiMfnGYEpx0ip4dlvNGVhrwGg9Oig9OJhaEioTBUMEIHtijmE5y8NayqnK2t gvzeMC0IW3NBNy4wgq0Oka2tGyZfcufq6EozXYPBYNHBYGP+8+wLfjUpundDtpzRgIAuX2TZ BLREjmBuLpQ3j1WVawkrGJZQV9rDJeJpZejhrEJTOERNMSzm4VWup08++nOY34+VNe59sxn5 z+NaTRXBeguR9WuOiuAyx7E7RTtFe0XoyVwX7GME+xwi+zjLffNtF6OrnNf80k295VSHvt4o OKLpHb2/VT3f/ptVYcSRjJhVcSDnK69NFb9BDu3EqRDtJEFREdqJVWgnh6idhoXF0ZXcfakI zrMKNktczCh4+pLAmAsGm8e819hW8dXQqiqhURFOBw6SsJkRbHaIbB6WHEdXcnumItjMKtjM CIMH35CJMVru0cwoesqXO1squQJXRc5SuU1TVbCUVbDUoWjpaNhG4+ikD/dqKlopWivaZOR7 rlUfoopcU84Fo8uy0rO6vEquxtWqqsulXEYHVXWK+oDI5WOG+Xz/CV8zHn03wnrw+Ru0RiPO dTeK4DKr4DIjuJxQcJnRNquipXx9s63i+4qqynnKuQ6eMoKnjOCpQ+TpwPQ34gQHTxnBU0bw VKOfoeBpToPPXaTLdUWb+SpdW8X7uFXlbOacB5s1DQqCzWfT4LG31q6LNfelrsuJDjYzgs2M YLNGQUPBZk6H6LqN+DaW5UJDJReVa1XOUg50sFRjnyBYejb2jULse4GlHN1gKSNYygiWauYz FCzNme/5nttIc/L6w/yLYczlC8xV5FzmfAeXNQUKgstnU+AopMAXuNwISdSL4HsS+exhyGcP QRiFLc+57CEIXZmz1Z2inaK9IvjHdWF81ejmEY2vIbrBv2/PHqO8C+eyB19ahLe8V4c+3SrI txG0VfweiawKPT/v/NWMbb8YBuiJLIqLqmZsQWgUDbNj94bJd8fPk6KdNCMKQj8/mxFHISO+ oJ9zxIPzmvoEYTRhFXo1h7dbRejVOTe56xYTWRQXlfNUw5uoYKBWjwUvfW6lqnL18PRsnhuF PPcCTzXPnarwC2X0Zs1zguBpDm/5QOEpI3iaQ5L3VJfAnK4weDBCP2UETzWpCYKBrPrjCdX7 +d11AhpcQpJ7gcGa5I63p2A9XS9owmBNcoJgsCY5QTA4RyZvsC6IOWvBYEYwWHObIIzOmtua B3HmXaCjcYhy/9aAfaoqPii+4K+V3KQfjC1gBcPTPYsRnYzrXDI+BCRfv84yP2TbD1wIiKaK o7gss4uqjjiNggv+0Mg+H5f7TIOiTlEfUDwhjlYMWWaf9DGHC1qNDLl7K+F9SlSObTK7cI/d y2TbIvM7BhPZs7XjcI9ONQte0XQP9zVLCoL7miU9IvdDlrw8HOFGgzj24GTQLGkoup9k0f0c HeuIb0Vrz4erOaL5AUliTlG5Ps0JEBZqTmxVz684hatcEH36bHTEJ/Ninz6uII9fkx14G+ro VBF1ds2Upop2J1m024IZhlv3PmJa493mH8U5UVeH9hNhXJnK6rCoXBtwZEQbaLDMyI9uC97h QSNwSTTC2bA5PgakcunpBV3bApU/Bl2rn2r94bXPQYZ8DhKEkSZV794qqQh9nbPfnaKdIpiq OVIQDGQVDDybI8ecI789B52q4mmVP6w1KqrcfTCOW3r0HW/Bmx0Y2nPI9DmLpj00gUZRQWiC xmbjVO5baKr4OzC1rhr4S8GMDqpCQ2lg9YgGcQ6sF65UjTlvYhDXCGoojipJdlwslBFEmgNG N2Tyri0MNEXmBppGdJT3/uaSxxxTjmM85dc9FFkZyHCecOiE/ZpDBeE8OZtDxwNz6EmP6+Fh oOFnC0amCgNNim1hoGEE8xnBaEbo5ZwwMdAwwkCjOVQQDGQV+i8jGHg2dI4Hhs6THgaWZkX/ TYEsuJVQcCsj33v5EflcVxipuS4Y2MihU76ht6rcjKg5VP4geKo5VBA8dSoaE0LOxCT5bwze OVx612hARAtoKi3IF6QxEmO3Vr/k9xSiV2t2FYRGaWRX+cpKWyW7DKUuN3ZrnBUV+r7GWY9i O00GbkOe9HFFKGg1ErRWtMnIp0wr6JffhuLST5bfLRW/hnmXf7GeuXtFB0Wdoj4g8jRESvT9 C/PhJCWmekHlZiQInrIKnjKCpwkFTxltsyp4yru9d22V3IFgvxg81aAoKniqQdEj8jQExRd4 qkFxokFREDxlFTzVmCgInjZiIm97w9OWil8xWVX13C8F67pNEDzVmOgReRpi4gs85eiHfqpp UBA8ZRU8TSj0U0bwNKcrt8yS1yBXVZ3kmgVpdsS5r0lQEDzV1OcReRpS3781700sscXswe/7 HlVZjS2Z1WcwsgyrSLdylohiBUOzpMMIQ3LObL5Z5Cqf1RUHGZnmisp1dc2SokKzaJb0iJol ZMkXdPWS+/Jhoa8Lw6DMkQ6dPSF/v6+h4GpShcup8tLaXFe0UOc+TYwL/lgj5j6OdOj/jDD3 MYLRmgU9IqNDFnyB0ZbB/GL6eKUKGwwu+cFoY75HF5nv0rL9aCWD+alk6NKN3MerQIzeLRV/ x6GqXJfW2Ffqyio4zSqsMs7GvkmIfTbSvOhm61PJ4C86t0W02g7wXPOeyjCUW7CKl/VonX3b ljW6fI5pbmzhx8nREC2VXP4oKtcQHAzR5TU+CkJDnI2PkxAfX9DlLcyFLi8M9muAzKgWhf1J Fvp3Rs9cZ8Xk2kiQc9nJLCo3ubYKyk3tUhBOa6gUBKfPhsoJh8pLC+uUhNxAgo4uDE4b84NL K3TyGxJyweA9B0UY3UiFc4nqTZXcwlNUrktrKhQVxhZNhR7FUXw6MBWe9DSiKFuNMnNGG/LT pSHvqqBtrivMjXPZ7LKCfrOrID/CyAOKUvBQf7GO2KLqg4pcHZgLpykghe6rDK6azruqydBU wVVNhqYKrsqLl/MvBldzmnOuyquXtSBc5RjYKYKrTkWuDkyGU9kIvBkpg6um867mbOgXHPKs hRUMRnOCRPfVIMhfQrpricYLSeClqjomCILPHA3hs6ZFj8jngWlxmmJT7L3C4LMx77PmRVMF UzUvmir2XrnhqajqlNYsyK8ay4fqbz+QuuCq5kWPyNX/XF6cpkAUEh7fKIqunlU1LRryV6qb dcmValOFRtG0aKrYKHJDT1G5RuGEt89HH1qAVWgBjYYeUQsMjIZTznfwlBF6tQZDUW2yKhiY g2H2AUOF5rvxQtYPReUM1MgnKgwMGvkEYQB2KjJwYOSbpkjjL3cKgoEa+ATBQFbdKoKBjdjG 7wLCYMvpa6cIPVCTnCD0QE1yHpGB35zkpimUBCsZwUrNcQW5mYzvDIW7XBDuMoK7jSzGLxOD u5yy4C4juKvxrFH9gm/mheFcED32bGKbDkxsJ33c9BAEmzWvFZW3maYV2KwJThBsbqQufpkE bFYVLrTHe3LhPAcxOM8IA4PGNUGw+Wxcmw6Mayc92ZxjmJutNKxJQXjKMQxdNyOXivX6g6nC bCXvhs91hQVwK+XJayNK9fkPgs2czNCbNax5FIeP2cCwdtJHmwWtRob8okDQRlW3FT1rs9UV bZYbuoqqzmmC9vkXY138yt2qqulN6uqDimzm9PbtO9qznM78sEAroptRUdW+3yrIT1yttSDa iZMe2knDnyFv5GIiC42ico3SCH9L6ftS8JAPop5HnSI0ytnwNxsY/k566vu6LSgqeKrbgob8 4k3QNheMnspeiRX044kgdHTOazBQU11BLonz+/3hqStIHX1g0JvpJh2/ZwedOYn8DTKGwgjD WRA9lxF6LiO4zJnrTtFOESzlgrCUEfqkRjqPyL9mpEtftx56A+6sken45mCYq5muVXAijwNI QfjNAQ5+a6YzFIdcyXRF5UaKxtbhUjZmpSBaRWOeIPRqp6JWGRjzZhq69EEME4VercHPVP6N KILgMhdEr+Zkhl7NCL1aU54g+KcpTxD8O5vyZpzyjtPfbPEGeHCnzgHQTX98Mzc6NcdErEly 2vMF5anEl6jQzzU5CkILNJLjUkfvlkp2uktd9TKdILQTJ0eMPhomPaJ+zmHywh7JTNMbP3eD tkii0M81VJoq9HNNkKKCyxze0M81LgrC6K1xURD802zoEfk3MBvOUvxBE9VnGpby+HJRubWc Flzwfd5Yd2RVLoieq3FREDxtxEU+LtjMEQ/DiWbDVl38vRD0XI2LgjDCnI2Ls4Fx8aSntZzG RVHBU1bBU42LguBpI+LJR0Kqys16nOfQdVt1aWjRbFgK5urhqVPF3jwfmA1P+vigxJJb+mZU VLU3NwoudL0hBTe5Lr+KNpW/PcNQWG9cy4X9pkpuriuqOg4LOuTj8slEVH1QkfMcFy+Mw/Oc CfNRwWZGK0VrRfBU056gbVZFT2UNZwWjSt48U1TOUxfa7Il7UXX1IGpv9irydGDam1vGwfhf H42WnG0qP7kZ8tFEEGzmHcJbRbCZE9qdop2ivSJ0Sk17gtApz0a7OUe7b7+GcaqK32Y8lbcZ V5kbK8ouoF/H8RfHR1Y0zqyyB2WqMH7oxqCpYi+WdVxR1ZG7URDPi8frqWgqTZGC0Nc1RXpE fZ1T5KXxIyWfsN06F4YRRBiGEM6P6NsaAwWhbzfSHH/XHN2doxu6OyN42KqLnMYZoDFQEM6A szFwPjAGnvR0Z4sy2Grprc4XsDUxf2uLodBbk8qPUUu9LG0FfQee8Lds4LSmQ0FwWqPthD/G Aqc1MAqC02cD45wD46UObIHM3xZ3qoPuBFUGpzkrogMnFJxmhA6syW3CD77DVg5g6MCMYCsj eNiqnsZIjAua7zyicWFgvptbAgu2CkMHFgZbEwsdOKFga0bP3m1odcUOLHcbFpUbgTm9wWmN fY3qx9yQcFqToEfkNCfB0xWP5RvgoVc85in0xMFZGBpBGBpBE6Ch0AgcCtG3NQFO+N3D6Nua AAXBcVahb7eqp4UhHOeCGDLOJsD5wAR40vPgbNuD/kZm1cFWDYGGgq2NPUN9LaYVjH1bVxec 5TCKaC4UBKc1Kk74UwxwmuuC02dz4aL1WYvJ6Fv69qkqagRlq5GytWN+JSi38FtR3zCCtrmy 2ArysIQV9DstBbkNk5G8L10KHuov5tGqU9QHFEeYxcCMeNKz1SlmhYclVAerRbfJ7NLbZ6xo eCFHZi5ZTfSjFUVVh/OM/HpHPjBWjqzcFAizOU/CbEYw2yEym8Pjt2efhQU/39UWvGa7GVVZ zT7topJ9TBazD10dQvul4wjnBSOcFzkO+nNMdnWLyjWVFmxkHymIptKYKghNdTamLgbuQJ70 fF6UkOnMF4bzIjG/xjEUbNVIaaow3PDr2e9y9WG44Ri4ryo3Al1L9im/6IYbjZReRWfAwEi5 aERKZRjZG5HSWLBVI6WpLmQfU0Wn5Y0oReU6sKbMVl2afaQujDVcFzrw2ZS5GJgyT3ruwJIo 4XQjZRoLTudIma24zSX9NVUrGG2Va6pF5WzVDUdRYRBopUzJPlIQtp6NlIuBkfKkZ1slZsJW YRgXNFIaCuNCjpQu+8jHT3Nd0WnJPlZ9GCo0ZYoKTmvKbGQfKQinXfU0VAxMmYtGylQGpxsp 01jowJoyTRU6cE5z1fwJfz4IIzBnvp0ijMAaKQty1fNnZTAuaKT0iGxtRcrp1ZtF+F4wahwa MBeNgKkM/jcCprHgP6dJDCAZPXtbn6liT9e1hmbOUrBuIAhCT29lTtpoR5No5vSImmRg5lxI vsRCr5E5lWFMKbrn404OnW74ZoRlXSMVcmpB79fQ2Sg4bsQdLgj3GcFqDZ0eRauXAzcjT3oa vpWtRsrWDbbJzI/fVtSPKoZiF5bnCrMqLF1mstfYkmnaKT+ZG/yQj9VvP4qqDyrymqPlt6ed ZUmOrtfyu3VuRlVWF9zNovz3o7FavzCVp21NFtovlQztlxOgnxXkMoDVFVpZP2JUVHVUEoS2 0mQqCG11NpkuW8n02y7GnKriU6akVdcwwtAKwnDKWEbDae5e2UkXaG6dLP/EtjB/hUC/cpR/ oAT9XSnoT63JWN5GKyXREJo7BaEhzubO5X9ue/RUFW2PLvmWaJw0jZTaKrrgi45oLisarxHI wyUmCyeNhllTxdNBskBTpWOe5ttS0A1wrOryX1THPLSVU9EAx2H2OMCNZ5M3aN2hq6dlI+gq w0TTCLqZ+eWTMbquRssgnDWWH+PJRTvcOJF0Y3Qylvs0miq5T6Oo3IDGwRbnkW6yCkLbnI2/ y4Hx96Q/vlDR3aYhb2c1kb9Nw5C/TUMQxjALze4LIILgMofaO0UYmzT6CoJ/unUqCP6dzblL zrn/xuSdY6yfu+XliacfjC+UL8gXlJcnSkHYnSNxXb0Kgt2NndGxbJk0VXJjbVG5Ts3BGY3C CAMOIzTK2Ui8HBiJT/p4e6IgDCkpPtbRAwM7I3iqeVgQPG3kYf0eU1HVCzqC9rUuN2Jz0oWB Gn5bB+GeQqdBnPPwhXsElinZ+eddBcFTVsFTRvBUM64geNpInPpZmqZK3tNQVK6fclRFP2UE mzXQekSeDgy0yxThgqeM4CkjeMoInmpyFQRPG8lVP0tTVK6fctpEP9WYKggGakxtHkRdy0RP rwcm15OeJjQa3G5GJvITmiE/oQna5IL+BcGi2mZVXU3dKdop2is6KOoU9QGRf/+5NHqdYlRY 9c7U26yqkadRcMHvklyPmipZVJvKL6oFoQUaSXQiC7eiqv1cEBqFMyYaRWOnIDTK2dh5zbHz wuB70scJTdBqJAiepsDlV8iGgoF55/LZ24isYAgq+ohqUTlPORvCU0bwVBOkIHh6NkFeD9y5 POnJU96QhKeM4KluWxoKnuak9+xFWysYPZW1WFE5TzXpiQqeatITBE/PJr3rgduWJz15mqJK 7YHwlBE8zci5tZSbUUwVbOadTZz7jdCmn+IpKucpZy/0U01ogjAgswqenk1o1wMT2klPnqb4 EjxlBE8ZYfrS3UlBMLCxfcgPlGBGa6j4+VhMcpraBKGfamoTBE/PprZrTm2XxlPeYcSSgBH6 KSN4ygieaugqyI+ntCaFzY0cph/WaapkfVtUdX0rCDZrDhMEm8/msOuBOeykp67LCQs2aw4T BJs1hwmCp40cxk9GoOu2VHIxraicpxy64KlGM0Hw1KlofTYwh11rDhMETzWHCYKnmsMKen7a akQz/gYLbG6p5LpYUTmbNZqJCqOuRjOPyOaB0exao5kg2KzRTBBs1mgmCF23Ec30AxZNlVyW KSrnqaY1UcFTTWseBU/HV8OiWdKH4UDRStFa0SYjtxSoyHVdftXYNqvCiou3xe6aKvmmRVUV mxUdFHWK+oDIZk5wz09u4ysOYDeKYDOrYDMj2JxQsJkRPG2kLfmmRVvFM1lVOU8lgKkKnrIK np4LYLhHx38hDuvfS55yjoKnjOApI3gqASyj4GkjgMmDSLlg6LrymYu2iie3qnI2SyZTFWxm FWw+l8nGV8MyWdLz97FodIPzKa+4qzcZuas3itCbbd+ubkcoQm/m0IThgNFO0V4Rzn0JYIpg 4LkANr7iAHbaavuWB2FSVbItypdvnKxcvymsvie2Ih/YaG6H4SkFuctlimB4I7DJp0aqqgS2 gmBf2SKfzPiVNloS7SLbbIrQLudC3PhqWIhL+nhzQINhBLENM3+OL2b88qAzMrXfAhMm9XoL AU92t6U2/LVVJrdSZlkcfvhaRVW5ZrLDwBrYNROd1jh9OASimSQXKkIzncuF46thuTDpuZlS HPJPeTR0GOlFh/5vUSo0wJw/u+pk2TScFI10yB0BAxMnOgxMjOAsIzjbqJ4/uoHBngvC7HPp cHw1LB0mPZudclI0WxjMFgazLWPF3k4dFL29yJzZjUDIzQSzOerBbEYwWzJiRa7/8/kFs7kg zD4XG8dXHBtPT0jO3+AcHngLRqqK2yFlq9gOwtAOwtAOlstCO/ByEO1gRcOo01j0NELknG+P Kb9Z72WqyJvO7xXXgjg1OFeiaSRqBkTr9RA1cbrYw6tYJQ1umhTH0Ax+mtUFUZG5ObtRtDWT mMz/AL9XB02aVbl+NB8jDFmNBDvnTZeqchOEFYRDdYLgz3TgzJIIqwhtJRE2oNhWoxBh0VYX csBJT+eKstVY2doxf18Hfwcsyy48GehkdRizXw0z9Fxm6KKqDdAsKBO0FDyUoyjnXaeoD4j8 D9n2Bf6nROef5h6PhMF/YfBf2CazaDYPQrdO5sxuhN453+xaSrqByY6j7g7vq8r1f/70B8zm hAuzNfR6RGaH0PsCs1Oui2YLg9nCYLax8LnoGd9X3JTp56KdzPmfU6f3jF9jnEu6J3sUwX+N voJgtkZfQX86qeoo5j4ZQo0RorHNEi/5hth4xJnyJqM4T/CZj4bK+dcNQLzMQdOpasnfR8GZ o1la0LYeq28kmb3lL9q1Ci74C1loN7YCJ4kmbkEYkc4m7lFI3C84SThJojUs9br3IDjmvb+K bzOC91IUTtsvXFhPNWV6/TPL/FS74Afiym/6YUtT+oIXsWgRtgMtollbEFrkbNYehaz9ghbh 0IgWKbG6LpCUwX7Rwf5WiNblbFOmy9ksC/bzU1rlN739spGqKnidVb6X8ZOfWhD2n83Qo2Pg +3z/CZ+FHH13/I9LSyRNlvzWLjRIEvlLeIb8JTxBaI1U0F9REoRhh3PrnSKMMaxC92UESxlh ImAE/xyigT7EYhvop6eb5S85yYEQviWEOFI/JctLbIzzSYXfqiq+AwKdPavyOQF3E/KXpgXB 3UZalq+OVJVbZmpabtbFj99rXWgDTcseURuEtPyCPqyhk59QQlskUejDlmndhVJTuTfz5oKh D3NBuMyZE32YEfowI/RhRujDGmkFoQ87FfnXirTHl0hc6sGcxeBaQrEH0wCIHpxUoQfz4ho9 OKtcD04o9GBG8FaTKq61xMkYdvPRw+5GxOVPlKAFNKgKQg/WoOpRbIExB9Vvfi5hfKqKNwKu aQlw42R1zrSivlmW15Tw17mku+kwo0s5y+rHqV0vRPO7ZrelMj+HLmXlb3WFK+m8JN7VuvIf uVd0UNQp6gOi1hsYc48L+fgZZrRHI+Yac48wZFkwP5X054QVdA9v5oLh4sGSX/VRVXVUt7p8 nhUECzUuj/idLXBV86xH5OrAPDtu5Fllq7Gx4GoqGly1NHhhWW6VhS6ty0JTRfMlJxWVM58z KfqvBuMFf50V7cEFYb7mW4/IfM6vF6aCcU5c9dTmR1LRx5PIT6mG/LJQ0CYX9FOqqDBw6M6u IAwJrIKlmjMFwT9WYUg4mzPHA3PmSX98riG3PdxKkSlMknzVCL25odLFYFHVqdRQGDZSXWHY 0Fg44U/e3OWD8Jdh5A+Cza26aHpBz9U8KQjOn82T44F7tyc9OZ/SkrsBd2yqMGiwCv00oeAp I/RTTXET/lILPOVEiK6rIbFZFy114CkXRG9mBE/PhsTxMf6UkIhOf2k00JDIj5mjf2tINBRG A06EcJnRrSK4zCkOljKCpYzQTRnBP0bwjxH8c4hG0xAS4d9xefeikDjWkGgoLLH5e9AYF1LB YKXVhVOnBkf+6DHs5ZKwlxHsbaTEJb/Mo6gw9dSLpvyxDLSCJkdBaAVWoRU0JnpErRBi4gt6 Mccq9NmE4phMEzm8b6n4TYRZdby04JqDn4oospm7rcl+AFd16gXzzLzT/IEJnAKaMTMKbcSb hDgtNHcKQoOwCqfF2dw5DrnzBQ2iefNURXi+eiwIkcUKhgWeseCrMHT0RiaU74lXlVu7WUH8 XbXvc9yBr5omBcFXTZMexY4+GXjn7klP9+WN+YMDY1P51ZshP8gI2uSCfvUmqm1WuacqFe0U 7RUdFHWK+oDIwBDoLnfMCeeam7GheHLLhZCmiqbvda2rrt6soF9pCIKnjU1MvhRwV1W178of BJtbdcnqTQrCeQ19HpHzIfS9wHkONXCew9xKETzVyGcoeJpUF+KdFQzx7lqu+heVs1njXbMu WdBJXbBZ451HZHOIdy+wmbMPbE7IL5IFwWZWYThIKNjMCF03/6IfPGV9UVTOUz5UdN1WXXIV WuqCp1wXBg2HyNMQ+V7gKQcdeJrDXL0mJwiesgqecnK7rchdbNMrE1bQd92pfP0i1+XzXSlY r6w166ILdxibNd8Jgs1n891kYL476WO+MxS6Loc52Kz5zlDouprvyi9W56fy6YtcffBU812z Lpqa4anmO0Hw9Gy+mwzMdyc9eZrCT/CUETxlhK6bUPCUEYaDnK28p7KvLceFBYMGPEEwUANe 8xdpvoOnZzPfhDPfhcx80pOnKd0ETxnBU0bwNKHgaUbPDwea6qb8ZlYsGDh1wWZNcIJgsya4 gnzD0nwHm11BGnUHhrqJhjpDweac4PLoBpsZweaEgs2M0HXzL/q/UGcyDWZyqJjJNIQ1q6fJ DTOZ5jKPyNOBuWyiucxQ8DSp/CU0UcHTpAqeMoKnGsqm8pGEqnKrAz5UeKoBTBAMbP0iTW7o p66u6Ol0YCY76eNwYMh7Kmg9FrTJyHtqqrCw1WdCykG4rstfIL/L1fuZTI5+r6pDRb56uZ1F 6upDXWRzSG748y6MulNNboaCzUnlu66oYLNuxBXkRl35yk0u+N+sneuS3caxpV9F4Qewet+6 dzNkRah38046zpzzBBqblhljiwqKPhMzTz8LQBWQub4Ee4OeP7S1kFUbvSqRqA+XQpqE+aeC ZbPv6mtKstmjZLNL7+pfxMktNjSbE6ZdYTMx7UhMg6RsJqY1KWVzx7TlcliLyp6CyeaopUJA kqd972OegsnQUDaTyaJkniYmu8JTMtmRTAZJnpLJmpQ8JZO1qOwpzmRzVPCUTIYo5alHyUCS 29EfN1M5WGWyY2KyKzwlk41d5CuMkOQpmaxJydOOaV8vB7xPdvTnk1QOfFdVDlxS6rokmwlg sxQS3G/fyuZVJjsmJrvCZueVh/3YhdlMJkOUqq4D2AtKL7uUUtdvSclT3nODJE89Sp52KRrI MxnvucW+rBwkJrvCU0cYeUomg6TUJZM1KaUumaxFZU/BZHNUKAdkMkTJUzIZJCWlR/2PUZqv uB/Dgr5m8MAU803NKwx2eJHBk5SmCi7JYJeUtJOUDO5SqA1+EVF53HciJhpPa76rqg0uKY9d kudV93amU1X2hhqGIJnNCdCusJmAdnT0uuwhyWYCWpOSzR3Qvl6CC2bb80xHZmu/GJ+WgiSb vaE8JaBBUmorKqT2gnnmeQK4KzwnwB2d1uQ5AQ6SUpsAB0l5XOBUWMx2/Ky56rHvl/KYAAdJ BlfdG63Jc+9LebwKcKcEcE97OsZngGtSLBeQHveQnncp5nGL0n587aX+eSdC1hzw1B929XX/ xZjHiHq7RMXucdpDw/ep+5y6p40AN8abzU5rl32LigAHSTYT4CC97FHptHfAaQ/7JU+dw97U feGmGhq+Y1/yNHRvnm6ktRNprUkpdR3NlLqktSal1CWtzb8YEwmnNeyXPOUdNEjK0wLgDjit oaE8Dd2bpxtp7URaa1J+re/edku5O7VMYXf+Qoa8n8OWu8T9R1XUvrZCSB1mO6LEL2AMK28u Uct8D3+7Et/t0CBV3eNCJhpqkFbx77QR/8Z4KyYT9IS3ZDUi0GQ/NNWTBkzZfixZUYbxKtG8 c+EY8RU5X82/Gd4tw18l+4mFZfc4ZaKh7F/FwtNGLBzjzf4JmbL90GQ/NNnfcCvZz1f7rgpT 9heId+SplARZNrSTpEaEUAlJZZ8EGSUrURsJ8kSCbFK2fwoLmuyHJvtbd09l/zVhsr/vXMx+ nnX9T9AZompop1jZ7w1Vj8ifkJT9IcrsH5Bo5ksdJE9cij45VT3sm6SfCE8IWklUOep8GaL8 rSUNUY8Kp4eOnF160aOW07WcL5jwyHMzow53ZrMGgxQKSc57lBKfyBklcz4h5xXOEzlPRE5I 8pTI2aQ03+nIuVydblFpDonVQHv38cbK3HB57KLo6+AvhstTIickZXOIMk8TUsrTqx9hPhEu mxRh9s5f8VJed96MeW0VV2PgVKrKQwSFpLwuGNE/jafzKREUkspH1ReeMEJD5TURNEp5DG4T gj6d12N8/ljGHi8CtqD4WGeT4mOdkJ7vIb2g9LJL8bHOebeWGSKkN2z4ltI7Su+TZP4ltrzC Pwe2h/1tZ8uYk3gAvIyykvm49LVU5NYwVg9I8rTvVzgX+vK1r6oof0/sdRlkeauhcB80FC5p KFzSUKwi6W1C0iuGgkg6dpHvGECSyUTSJiWTiaQtKpVorno7R4VcJpIiSgZ6lAzk3UJIfx6j lkuAp6UeWq4nPr3CYPLprd8nvOwhyWCPUmWYpGSwS8rigve43u0cFQyuGmLpNzSU5/43ynOX lLSrOHmbcPIKT52yVD8mKV5HgSRPPUqeTlLy1CV52n8xVgas0TZHBU+rhlhqFQ3lqf+N8tQl eRoky9PEiFd46gQkTycpeeqSPHVJnk5S8tQleVqAn38XSdWWUXdWSFVtfedVW8l9kGQpuS9K ZmnivissJffdTlKy1CVZ6pIsnaRkqUuytGAyXz1MlhLmIMlAklvRffEyOhoqTVdh7nYjzI3x +VJGk5KnzmTylJjWpOSpk5s8LTCNK8piv5SUZLKiL5+e68gnpUGSpSHK0nQjpd2S0pqULHUk k6WktCYlS0lp8y+Gauqr6CpNfb9kqUtKU5dkIJEMkgz0KE0BIjgdwxJvZrAj2xMXIG4Jak1K FyD89W/NCipQw7ohc1SY7hLUWlS8ADHvVxwGXHnD3msYCirzxWU1Mv5na2RcUgUmqEUpO3+3 EdTG+FwtmhRTG9LjHtLzLsXUblHR0/kXo6e4nIb9et27T9NiX6LqzRLVx/otpXeU3ifJPN0I b3eNPVR/5umyf9z5Yd+iIv02KdIvJNk8dR9faoT0skdF+u37FS7QQ5KBRC5IMpDIFSUz0JFr XLj47o86uJ8oDMNSUMP6cGFxiiblKzi4ddWiUvnwZ1qUxES0JqUkJqLN+xWTGFcmyyjbVeU1 qQ2SkpjUBklJvHrX8C5Rmf7jKeeJOnv/fvd+7PRPf0g5PLVLOeySctilF5SUw45IryjJP49S Drsk/0hgkOTfKoHdJQK7wj8S2NiFrY9150sSXPY9LJaPO3/vW7k7/UC+Oeuv3ctp0hskOV1A mF+ykflVFFBjjlouFEPSeJDeIGk8VuntLtHbFeNBehu7SGtuy3ziG8PkKvkNklwt+M3X0ZGr VZTd/lSWE+AgyVWPUqUmwEXJKnUCuCtcJcDdTVK6cde0+BAMw+QqEQ6SXC0QztcSkatVlF0u lau+/6odpDpIctWjlKurCHeXEO4KV51vNFuYpOwqGY5hcrX1pmnk+gNbqr9z2HKzqGvx0T+u 6dujcsFiBpP25v7DZI1shyh5vcp2d4ntrvC6Q06Yq9kpWu5PQek8N0npPOeSvHdJPrukjHbQ UvoS7SApV4l2kJSrHiX/gmQVIKGb/Lt+rkaIu5ukNFfzdUhUcwuI87UidL7rUQvENSnN1Zzr 5G7BYn5/WIZXUf5NySUqnNsIcXNfPUpjQIiLUh6D88Y39sZ4u9uGb3m0oJjDTYo5DOn5HtIL Si+7FHlj3q3lYi+kN2z4ltI7Su+TZP4lYGs5fNUS+Gfed2tSzmG7xHDZt6gneGOOWnK4STGH Icnd4r6b32l/VUf5NzyXqCWH8WdrDHibDZLGYPU22zkx39N1eIy3HLap5cO+BaUcnogn5bBL ymGXlMMuyWVnLFnq0mtKymGPkn/kNUjyb5XXzgOJxIXvvn1d3rGr4XZluHPsD3vK2wl94mWf siG+GVdG4YMcLSrl+fSL8eJQi0rXePxmhgalU1qgb3/sSONELoSkcSIXQtI4rXLheSMXjvH5 W7WQVE4m7okTZkjKarIdJGV1QW1c1biMwkdU56hQOxzk5CnZDpI8XWW780a2G+PNU+c4eUq0 gyRPSXaQ5GnBbGcsqztHhRMgMa7syy6IylOSHSR5GqLsnLiR7M4TzSwZqArhkjx16ZGSPCXX QZKnBbGdcQd5jgqesiFuuqlGk+sgaZ5BrouSebqR686NWiIo+atHsnmKSie5Rn9h+f8WFZf/ h6STnDeUzQ5YqqcuqXgS1iApKQlrkJSUq7B2dlgbTnLnb/rY4NiVLz7v60nJ3EZf8RM6XYvu dkgLyHxjRKu8Jt1BkuGdteLZCteKyyhcK56jQv0lAyJKeU0GjJLldWJAtXziWvF5gptwcUJG Q1O1aFo0uknxc15nX7JKTldh/tkmpfsctlzDaFqaUnC52B4VD80jl4udOwv+k/8QJf/Jf1HK /t8n/nva/zE+z50PlqwP+xYUy0qT4twZ0vPeMN5vQtTLHhX5b96tpVRDesOGbym9o/Q+SeZf 4j/59+1z5/sJcOLc+XyDBUrnqP6XXvZlQ9yZLqPs3K8RmHYizp0haQQKRuQyvEUUn82sgvBs 5hy0XLyDpIHjjcIo2cAlaLwi8f3+ndLcJQ2FS4+UZPIUlUx2SSZ3YAvF3FcsflVHYTI997UU E0g6GAiSkHQwrILkfQLJKzx1DpSnRENI8tSj5KkT3gtK8rTAOb9KKE8d1F5TUjXxKBlIwoMk Az3qP0dped41XJG0pE0EeIXBznYy2CUlLQkQkgwmAUKSwSTA3QFfFJ2jQrku0PGE513RUJ6T ACHJ81UCvE8EeIWnznbylAQISUnrUfKUBAhJnhYE6F8sUtI6tSlpi4YnPO+KhvKUBAhJnq4S 4H0iwCs8JQGOXeQH3yHJU28oT0mAkORpQYBczbiI4vOuc1CorQRAROl8RQCMkh36CQCvsHQi oQjV9y7p0HdJlrokSycpna9ckqWdveL5Ch8km6PCoU8ARJRykt0Xz7uiodJ0lQnvExNe4elE NslTl+SpS/LUJXk6SclTl+TpJCWiuMcSLXNU8LQ3DEnJvvi8K7pSmnpXsjRIlqYbee7eb7Wp mrokS12SpS7J0klKlrokSzsexTTlGcohStWUDU9O/ZoVkNEgyVMyWpSSp4ebbYw2xadrlJQu lB4pPe9S8JTSyy7FND35NYxXS9ScppTeUHpL6R2l95T+c5TmadXuuMCUGewQ9/WLEIebBhqR 4H3BmYceFSi4S4GCKcnzqftAwZTkudOODHbpNSUZ7FEy2CUZDJhKkhnoMPXNFHy46QQVL4f5 04BL1EzBlJTPVV92RpLdoDFKsps0dsJ650tUSHGHKo0A+8Jr5BoU0BglZf0ajR1uttHYFG9l AzTGKNkMGutSKhsOaPKUNHbyKx7KatAYJXkKGqOkrPYoGcidiPMKS/RtAHa4AYBRUikGgFFS ngLAKMlTctTpxp95X6JCnjpHyVOXlJSgLUry1KP+PEoL4R5XFnU73CQa09A8VYpBY1MXiRwo KWlBY11KSeuAJoMJVacbv3e0RAWDHapksEsyGOhFSQZXO7FUSUvaRGNXeAoaO9y4pKR1SZ6C xrqUPHVAk6eksRO+ZbxEBU8doeQp2IuSCgF/EetJyObQl3macOwKTztVxdOaPzh1uAGhdSlN GaYoFf7lIcsbm8GqXPSo7tYLSnKeVHW6ccBYooLzVUO/cMuGSnCnPQ2GS3J+DdoONwna5Py/ MdeYMCavTeYr7GsiN4eF2UbTlvtLISw+/Oqfuuth6YgA+PWoNKPG2v9LVBgXgB+jNAgepUEA 5iXJ0j9h3hXp3+6WhbdrDjfQVFSaFm1FmHIbpLdIwXx8CahHZVv9s9tV1AF3LpaoGbEpyWkn PTkN+EtSdnq37QHNwxif3jR4KLTLrAWn2fR5D8sfPffrsi/qMH8L8eUcFirXCZ9aqKP8efol arG//QFLkr1l1DtK75Nk9ic0fDrRd7wzdvB7eIcWFMmwSbHMQ9JokAwhyWWSIaTXjHpDSf6R DCHJvxBl/iUy/Leq9a6gOf/6unK9Ry21umzoSyyxoewmGUKS3QUZ4sMWdZQvHbZEhaR2DNSg kAwhaVBWyXCXyPCKpHbAk80uqaK49EhJnk5R8fQ3S6F0Y2XI3jCXbn+2pY7yZ1uWqGAz+bHt 11JOVDvIj1Gy3E+weIXNhMWdS7KZsAhJNhMWISl1C1jcYfZXRvm7eEtfwVPy49xXj5KnHqXU DZJ5upEP9fXg4a3ecMn+AEmeepRSl3zYpJS6nQ+/8r6TbC5oDd+6qKP81aYlKthMipx/Mdjs UbI5SGazI+M4yb65+aMmiX/51+9fPv3z1YePv4zik4g+fPt5HILg0Y7nRBJma5jOiVNUQp9b KwJK/h61oA8kjUoBnfhaxhK1TLHnhmEIqr78C4bsS8nvtKpRWYXOnUPnt6PP2FV+UP+8s9OR qjx5tGxoJUNHjzfUoExSOnpc0qAUWOnL+b1aosKgOENqOuOSzpyET0gagVX43Dl8PnF5aoy3 8jNxVnj54YAoGehRMtApUdNugmOT0mnSV4SQgQ57mg8SHCHJQIIjJBkYoqywbATHATy8fruk +u2SDHRJBpIaISkDO50t5erkyxHIQGc4GeiSMtAlGUgehCQDQ1Q2cL+RB8f4nIGQLgdIj5Se dykewq1heLGmR+UM9OcA6ih/gWyJWkpt+8UIeZDeseH7JJmnCfI093jiqB4uGFlSQpKnHiVP XZKnk5Q8dellj8qe+k3rJWopi6371NDfA3jDhm8pyVNnQXm6Cn77BH5XeOrc9nAYu8gX8iHJ U28oT8ltkORpwW3+LPOrJSp4WjU0npSn5DZI8tSj5Okqt+0Tt13hKblt7MI8JbchSp6S2yDJ 085HoXj69Q956hT1mpIMJJFBkoEkMkh/HqPmi+Wn8CETKwSJ2K4wmMS2J7FBUtJ6lAwmsUGS wQWxHXD3qYzyN8yXvkJxJbHNfS0oAUlJu0ps+0RsCvv2SevYlU9afa3nwxy1XAEqG/pSxWyo QekU+JWryi/YUONUIJ9/jEUHgjOZDgSXdCCQ7yDpQCDfRckSPfHdFYnudKbqTGCDpET3KHnq kgx0SQYWRIXvsNRRuDQx9xUS3blLZzyX5CnpLErmaaKzKzx1RpKn5C1I8pRwBUmeepQ8LeAK H1dZosIZr2polyaUp+QtSPLUo1Q8Vnlrn3jrCk8dm+QpeQuSPCVvQZKnHiVPO+qEMx6+mLJE BU+Lhv4QmTx13lKeEsEgydNVBNsnBLvCUyLY2IXNIohgiNKx71Hy1CV5SgQ74JXnKuoUHvEb v66nekoqgyRPSWWQ5OkqlR22rYV5GOMzlUG6MOqR0nNKLyi97FICgSOeC2o7kaNwl2KOWuop pLfLLy4TB0S9T1G5nh6cyr594jB25RMHX3rpMEctE4eqoV+51aAQ65oUsQ6SBqXjUyweuKcx Ry3Fo2rI4oGGGhRnuHeUNCirWHfYiHVjvCW6A5sS3SV5SqxrUvLUSU+eFnSGr84sUcFTR7E3 jJKBHiUDyXCQ/jxGXYEgB2e8fyPrO9iFyeseF97HH8y1fJZiQzvda4ScG1WKCImQNEKExLN/ 7/zVEhVGyFlPI0RIhKQRIiRGyerORgg8EAIhKcU9SgYSApuUUty5UAYWEIiP+ixRwUDHOxlI 4oMkAz1KNWKV+A5OfE9cThvjrUb43TcZyHt0kJSB/YZc/6N1MnRJBhZ0Fh5JnT7Mu0QFA0ln c189SjXCo2Qg6SxKloEb6exAOoMkAz1KGUg6a1LKwCkqXuNtUWmegI/z9O5zFO5ozn2F2QTp DFHylHQWJfN0I50dSGeQ5KlHyVPSWZOSp1NU8rSArPDlm56Ujk+v+y9mm/3bi0tUyFPvS56S zqJknm6kswPpDJI89Sh5SjprUvJ0ikqeFpDlT6/pVONEJU+rhv5BRTbUsU86g6TiuUpnh410 NsZb8XSikqekM0gqnlNU8tQlFU/S2cnfKpanTlTylCgGSQYSxSDJQI/SBEvSMsEKH6/JSXvc iGpjfDYY0uUA6ZHS8y5Fg1vDmLRNyscznsopo3Dpa45aiiukt32/4pNOiHqfoszT/3+oduws FeeednPl4TBHLahWNjTA1aAQ1aqGDgwv2PBll9I44cspS9Qyi2i/GL47zygNClENkgZlFdWO G1FtjLdEJ6ohSp4S1SDJQI+SgQWqhQ+9tDNeGeUrnCx9hUR3LpOnpDdI8jREWaJvvAN35B04 SCoevAMHScXDo+SpS/KUcHXyB7FfLVEhKauGvgAHG8pTh6t3lORpiDJPN/LWkbwFSZ6StyDJ U4+Spy7J04K3/HMw8tQZ6XXZ8IRZBBrKU+9LnhLBomSebkSwo8OVSiwRDJKOfY+Spy7JU5fk aYFg/iSfPK2i8DjvHBWOfecteUoqg6Q8DVHm6UYqO5LKIClPSWWQ5CnvmUGSp8U9M3xao47i xMHh6s3ScCGI+Re7pDwllUXJPHUqW5aA3/qY6bFzV5g4+FIZymqnM40AGa5JOg0sb9j5Q3Qa lKlhfE8fkgalwDp8mWOJCgW5aoibbnP3YVCIdYhSoocoG5SNWHck1kGSzcS6WYo242neFpUm zSS9FpUmY/hUR9+J8LHxRQrwcAd6nrsPNpP0ECWbV0nvuJH0xnibn5H0EKUa7VFKXZIeJKVu QXr4JscSFVK3asjznjOcajThD5I8DVE5dU8b4W6MTx/9OjRJVSwc+/7RrzoKj0HPfXVrnveG MZtbVETAeb9iUuLGEPb+de8+Hwa292+WqCWb0dc7Rr1PkjnvCPjERd+T083DoUnxyWhIj4yS p1NfydMuhVHkO0XzTkSbQdrYVdnc9z42xNvPaPh2abicMBElm1eh7rQR6sZ4S3BCXYsKa8Af IMlmv9n2gtLLLqUM9BXzXy1RS9GYdzV46gtUKXUJdZCUurwlFyVL3QR1+o+nUteBR6nrIHah pNT1KHk6SSl1uxRSl28yt4bZZv9eaO8+nu/KhjjfzVGhQpDzEKXUXeW8U+K8K2xuwKN5ylyJ w5Ob49UBOT9FxXdpmxTfG4Ik56eGcfYGSdns1KXUJedBUp56lI59Qh0kGRiiLE8T1F1hoAOP 3OogFk9uVreUulNUMrBLoaE/Ry5PvaEqhEvytIA6/96ubK6i8CjKHLWgHyQ5T/SDJOdX0e+U 0O8K552B5LwTnGyepGRzl6LNvhg8G8pm70s2FzR45hzCd1Unt6oh5xDeUDa7pEJMGoySJXii wStsdtCRzY3JYl08+5Mxst7RTcW5bGmFUSk+haWC7ZK8L9gNK8HXUSDxua+Q4v6Hy3tCHySl +Cr0nRL0XeG904+8n6T44cBZC8tMMEyuOtApo8l4TUrnPCw73humc15xN8+X0lbJ9j9JrpLx IMnVVcY7Jca7wlXnH7k6SdnVpkVXESZXW2/xDHrmrY0lrGeYErggOP8wrGq0766KR9WQ0wui H/pS8fAoWb2KfrcbX4wb4/PMuEnJ6q4Fqxn2/NB7e8LqJWyxet6RMO/1bxK+mn9g+aL2IsWG sBp/51v29Y7S+yTlOn2bWO/prB7j7aMReNe4BcWJXJPiCRKSrJ9gKU7kIL3sUeGjEZReU3pD Sf7xzhwk+bcKcbcJ4uTftR++PIwtLWkn1FEJWq5X+DT50humK5r+OsVjHYUVrNpOJMOnnVgk GV7c3MOq5fyDNAbObhoDQh8k5TChr9yJtXXybgd0id/Be4IDx3hLa6xU2oJSWk+IlNLaJaW1 Sy8oyWWHMlUKl2SpS7LUJaW1S7LUJaV1kKwsOOAtn1h6ykkno4fDbee6mNbmrtK6Q1yMwmW4 MgrrwM5RvTTLcGdEGd53NRZdvN08Ry2XN8qGtqsaFmIjJA2LR2lYVrHxdiM2jvGW1nhWvgWl tCY1tqgl05XWRERIctmBTWntktLaJfnnktKa8AdJ/q3C363D37c/kT12Ze8h+NcxlPpExbIh 87w3jFeObn74/r9//OH7v/z4w3jFRCMwRUWCgaQRIAQeb3F9aY4Kee7Ep0EhKkJSUhMVi504 3a8tHXu7kR7H+Hw/BZIqzERM8dIoJHlKKoQkT0mFt1wmfY4KnjrcydOqLxtr5X4VZaMo5717 HQ6roHi7ERTHeLPZbwXKZt4dhCSbiYmQZDNp75bLSs9RwWanPdlc9eVfzFyilqv66F6ermLi 7UZMHOPN0wmM4s0TRGmC51HydJJSOXBJnhLrbrnq8RwVPHWGk6eEv7J7O9srT8mDUcqzkbuN PDjG22kPC/S2oHjaa1KczUF6foD0gtLLLkVImXdrsRTSGzZ8S+kdpfdJMv82Qt4db+g1Kbnl sPZ4aFFxkgBJbnlDucWbcLdcNRr79XppuFxRQ5QMJOVBkoGrlHfnlPfEJHiMtwS0i4EPhxaU LHX2kqUuKQFdkqWEtnkfujOvelS8nIYoJSAJDZISkIQWJUtAx7Fvn3fdTcyiCcbCyEf/bOVh jup//GWRYkMsHYqGsnv6xVhVISmDO0st3d9y9e0yCpeJ56iQ1EX3voi08pzYB0l5vop9d459 T+X5RCpxScaxi/wOIiRltTeUzZOUbHZJNpPZbn3lWCV6FYXnjOeoYHPVEIv/oaEOB2JclOxw 2Ihxd7x/5ms9qJxMQamcEONaVKrQxDhEyXhiHCSVY2IcJKUpMQ6S0nQV4+4c455K0wqm8Pbs 2KtlrvOVMneSkoGksBYVnwNqUrzjccu1hasoLKVWdoVnsuaont4ynnf1IMn4EGWJu5HL7py4 lKYuqTI7ccnlSUouk8vmhl99vKJFZeNx87SKovENpfQ/89nndof7qeUvWmcaDEc1VRHSW5Rs MDbS251zmQaD9NakJXM1GFNUGgzSGxqqZhTExbfDqyg6X3Tlqzdo6lJF2eRAxjsbyniXdBSs It7dRsQb4zPiQdJR4KQm4ycpGU/EmxuGo4DPx7WodBRwidwqimPR2C0dBb4agQaj4Mw9B8NB UINBNoxSPgrOG9lwjM+DAelyaFI8CpoUBwNRL9jwZZey81iupfWVouB8FeQPs78pf9CXAn+7 RC0XOubuu/Q+RZnxG6HyPNFVnCtCkvFTVDLecfE5o2R8b/jVo6BF5bHAuaCK4lg0WsxHAc4F c1/LWbjq3sfnXf+DFljTYKwC6nkjoI7xdhRMQBevOrWoNBjEUURpMKaoOP1pUnYez+eWUeCj OWqZuENSgjuhylNCa5QswR1an5hlnjuZ9r160EpXtrqsEtxp8rFLqbKQOdFQlaWAQn+S71Ud haUbel/LmKmQOE7KVBImJCXqKmGeNxLmGJ+vpJD2W1BEnybFS3mQVEf8pqBSl/cJ531YrqRA et0bxjeBESX/nBOVlETHKFlSbkTHs6OWkpKg2KTkllOh3CIoQlJSElZv/ak9JaXvlwwkO0KS gWRHSErAVXY8b2THMd4SEO+wt6CUgM6JOs6JjpCUgB4lSx3b5J9L8s8lHcAuyT8iICT5t4qA 540IOMbbfVJfrE45SSpsUjr5kAoRJQMdFGVg56qAbVzLeI5ars+XDfEmNRrKZsIdJNkcouw4 3wh3Z8IdJJ18HNuUlIQ7RMlTbyhPC9bi8sVzVPC0amhzMKWuE5k8JbdBkqer3HbeyG1jvE2S /KabPCW3NSmd0MltaChPC2TiUsNzVPC0aognUtBQnhK/IMnTEJXz9H4jfo3x2VNIl0OT4rHf pOgpol6w4csupYmnP6jxaolaPG3dp4Z+2fUNG76l9I7S+ySZpxvJ6p5kBUmekqyalDz1KHnq kjztIBLqqU/L5GkRBYwqu8IK/HPUQlGQ5HLgo/EJGbm8ikz3G5FpjLfMJTK1qJS5RCZEyeWO TIFf+dXFFhVzcncEvxZR/OZlD0r86ovuKr95NxCSnCdYRcnyeyNY3ROsICm/CVZNSvlNsEJD 5TfBasdVGYuowuaC0Xz+I5dJWpDkskcpv1dJ634jaY3xlt9+l04u+y25xy4ll3kvb24Y89uO cxlf3H874psIVRQLS+sq5zfmGXNfobKQ0RAl50OU5fdGRrsnMflx+HBoQRExmhSpDdLz3nCJ Uq1xkJPxjlUq30Q0SMpcj9L5j4gGSf6tItr9RkQb4x0x8FLCHLU8EtCkVKzJaIiSgX7HTwZ2 YoqnRDxMXEUxc6uuMJkrf9AulWksiHuQNBaruHe/EffGeKsiZLsWlYwn2yFKxne2++odvxaV Zm5c0rSK4lg0QktVxO+u6CgoANMX/NRgEAohaTBWofB+IxSO8TYYzokq6YTCJqWS7lEaDEJh k7LzdqddlaUgQDpfBPl6nzKemFjug5UDnUu9oYxfJcf7jeQ4xpvxJMcWlY4C3vFDlIzvMBmO gns7s6kiFUzIxT2rKI5F6yofBbjXMfcVzqXVTlj/Ggze8YtSOr0eb7Yh5xRvV/D8S0M9KJxe uxROr5SeU3pB6eWyD/MlZEqvKb2h9JbSO0rvk2T+bcPL403Hy1hz/eWoJWo+vXYp5HeXQmFh lAwEcXYpFxb/at4SNVM8JXnqmChPXZKngMkkmafbYPJ44+T4QOnSpWQgYJJRMrCCSZ9s96jh E6nL0yxY9XQOW15XpSRTwYmUZCo4MUlm6jZOPN6AEynJVHBil1JWghPZUId1AXdY9XSJClnp JCcDgYCUZCAQMElm4DYEPN447ykrgYBdSlnpN81UF4GAi/S1yVuPsqz015XmsJiVzm0y1SUd 6qA7SiqfoLvvf//7hw9fHn/+8vOPP/zzw+dfPlw+/OMfv3/3l0//+lVHz07PaQX9u88f/van P/ykifUzodv9sJNzm2nb8EG6Z+PnfbjtJ321Re305ZGq3XGndlqHsWx3UDut91xtUzttq9sd 74Zt1X7+pI9Ya5u+ZF31udsP207ltpvzsK3el5vh927GFDJffjrcDH3elL+3vx/+Bk0Ain3Z 7e+fPez0LZBy20nb9L23ctvNsK1uN/ztO33Bt2o3/A07fd6+3Db0eVP6srvT37fTozZVu1uN 307vIVTbTvJzp0UTynbD7+kt9WrbefgbdAW/3Db8nu42l9vk9U6PRxTb7o7PHvR4c7VFRtdt zvopXRMs2uxvNHL73co2/dT+ZpyXeaYMSau17ooeT9p1reRRbdFP6f3QYstBFmoF7mr/nr0t 9213/+xtnRtH7XR9pA15WA/94Had9MoXfQKOO3bZ35ye6Z9q26vTs/fVn3mRaY+1abfKE72l WRhwK6P1FmG1RTmp1wmKfdNbBs/G5/wrq7VND5+WCaSnj7VND5BU7c5D2dCFt2KbJmfyXGWb 27TwisZ2WM6s2k9tG5dzK9tpuIZ1j8ptw75oRQ5uGxYgUp8r22Tz+PJetS/apvcn6zI8DE+9 Td+EGLwuy74Wa90N26q/QfJ52Fb93rCWrvZlZdtu+Pv0ndjqb9Bpbfy2XbVNp7Xxc2DV2KpP feGxzgn1qdNh7bVOM/pEfLVNH5PfD9uq4+BxOJU81qeSy7DtUm9Tk6HP8vSkJvuhXeX1ZX/W 7+mf8jjWKeFxr9enilzaq26q3UqfBx3/5baf9mcdmvu67A99alvd5+39sC+Vnw97bXuot6nJ cWhXVYnLsE3/VNvU3VDg19qN+1Lm5344xvZlkX8Ytumfumaehj7L0+hlfzuMkd7tLY73YZsM WOlzGKO6TuxPg9fltsf9Xrm716coi2Nl2Haptz0M2/RP3W44xvZaIbP6G4ZpZb3tsh+Oaf1T 7ovOdNq2sp+qn3t96Lz8G4ac0KeLq33ZD+Nebvtpv1e9rvvUbgy/t6uPI00k9IfU+7Ib9qWs BZp7DGNU14ndUCd2us1WHJu7+6FPMW3xtw/tdG6uj2mdt9WunKAM7TThKdvthlpQT9cuwzb9 U9bknaaAaleN3+MwHdU/1b5I1rjXU9XL0E6/V9bk3VDr6qmjmsiXetvjTtNf/bOynxr3emp8 Gdpph8qc2Gna/FhPm9Vu6LOcNl92J42t/inHVvNLbasnhWqnaXo9pT4NU/GyFvy0G+asdZ+P u+MwRvrsRpWDmmtqW3mO0z3rYVs99R/mqLt6Jrg7DNtWfk+Y9Vhj1mVAsEu9TU2G/dSH8qq/ 4TDkpz6kVW4bfq+cmOv3bvR7Jbo9Dtv0Tznn22k+oXblnGgnrHusse4ybLvU29Rk+BvqGjls U7syr++V8uWM9vFeRUK3JIraojaXss1FbS5lm8fdzeBHOT/W3zX4WOOqfuuh7vFO+1ei3kVb LuWWx6GAlRB4GcpXvUUn7EuJbI/DqbzeMkxiai7RlktdKYaCVrfRoXkpZxOPQyGotwgnH+us 1ZZLueVxOJTLmfpFWy71HH7I1roIj7W0nFIOs80ysYb0LmfSOkGqWtbn+GEKOmz5frkq9uMP v/39068fvnz8y398/u5vn3798vqv0w2Y//Pbhz/94ddPl0+//veHz79//PTr0PC3n3/58P7n z798/PX37/7x4W+6mnbzR12T/vzxl2GZgPH/f/n02/j/9MzA//z05cunf/b/+vuHn//64fPw X7ow+rdPn770/2j9/teHL//67bvffv7tw+f/+vh/9eO60/Tp88cPv375+Yt+/k9/+O3T5y+f f/74Rb/37KP28vPrv47nke//96fP/2u85Pfj/xMAAAD//wMAUEsDBBQABgAIAAAAIQB3i32W nAYAAI8aAAATAAAAeGwvdGhlbWUvdGhlbWUxLnhtbOxZW4sbNxR+L/Q/DPPu+DbjyxJvsMd2 ts1uErJOSh5lW/YoqxmZkbwbEwIleSwUStOSl0LpSx9K20ACLTT9NZumpCnkL/RIM/ZIa7lJ 0w2kJWtYZjSfjj6dc/TpdvbczYg6hzjhhMUtt3ym5Do4HrExiact9+qgX2i4DhcoHiPKYtxy F5i757bff+8s2hIhjrAD9WO+hVpuKMRsq1jkIyhG/Ayb4Ri+TVgSIQGvybQ4TtAR2I1osVIq 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 bFBLBQYAAAAADgAOAKoDAADDuQAAAAA= ------=_NextPart_6A49C9A9_E0657D40_6AAF3ADB Content-Type: application/octet-stream; charset="utf-8"; name="=?utf-8?B?djItQ29tcHJlaGVuc2l2ZSBBbmFseXNpcyBvZiBSZWxhdGVkIE1lbWJlcnMgYW5kIEZ1bmN0aW9ucy54bHN4?=" Content-Disposition: attachment; filename="=?utf-8?B?djItQ29tcHJlaGVuc2l2ZSBBbmFseXNpcyBvZiBSZWxhdGVkIE1lbWJlcnMgYW5kIEZ1bmN0aW9ucy54bHN4?=" Content-Transfer-Encoding: base64 UEsDBBQABgAIAAAAIQBgknq+gAEAAAwGAAATAAgCW0NvbnRlbnRfVHlwZXNdLnhtbCCiBAIo oAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADEVM1KAzEQvgu+w5Kr7Kb2ICLdevDnqELr A6TJdDc0m4TMVNu3dzbaIlJbigUvWbLJfD+T5BvdrjpXvEFCG3wtLquBKMDrYKxvavE6fSyv RYGkvFEueKjFGlDcjs/PRtN1BCy42mMtWqJ4IyXqFjqFVYjgeWUeUqeIp6mRUemFakAOB4Mr qYMn8FRSjyHGo3uYq6Wj4mHFvz+VzKwXxd3nvp6qFipGZ7UiFirfvPlBUob53GowQS87hq4w JlAGWwDqXBWTZcY0ASI2hkLu5Ezg8DjSL1cVV2Zh2NqIF2z9F4Z+5XdXX3XPfBzJGiheVKIn 1bF3uXLyPaTFLIRFtR/k2NbkFlWdsn6jew9/3owyfy5PLKT3l4GP1DH8Jx3Edx1kHv/eigxz wDjS2gGe+vgz6CHmViUwE+JX1JxcwHfsAzq0cvqu5at64iZscffxc7S8pBCR0yvB8QI2UdFX l5GBIJGFbVjsenRbRo6+PzuGPlsNmB3cMmf5+AMAAP//AwBQSwMEFAAGAAgAAAAhALVVMCP0 AAAATAIAAAsACAJfcmVscy8ucmVscyCiBAIooAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AACskk1PwzAMhu9I/IfI99XdkBBCS3dBSLshVH6ASdwPtY2jJBvdvyccEFQagwNHf71+/Mrb 3TyN6sgh9uI0rIsSFDsjtnethpf6cXUHKiZylkZxrOHEEXbV9dX2mUdKeSh2vY8qq7iooUvJ 3yNG0/FEsRDPLlcaCROlHIYWPZmBWsZNWd5i+K4B1UJT7a2GsLc3oOqTz5t/15am6Q0/iDlM 7NKZFchzYmfZrnzIbCH1+RpVU2g5abBinnI6InlfZGzA80SbvxP9fC1OnMhSIjQS+DLPR8cl oPV/WrQ08cudecQ3CcOryPDJgosfqN4BAAD//wMAUEsDBBQABgAIAAAAIQD+aepXCgEAAMwD AAAaAAgBeGwvX3JlbHMvd29ya2Jvb2sueG1sLnJlbHMgogQBKKAAAQAAAAAAAAAAAAAAAAAA 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 c2hlZXQyLnhtbKydW5MbubWs30/E+Q8KnWdLXbz3xMw43CSbTbLK4bDP5Vmj6fEoPFLPkXp8 2b9+J6sWgLUyQbJL9n7Ysj8nQHYCBJAFVNW3v//nx19e/f3x85cPT5++e928uXn96vHT+6cf P3z663ev/8//vv/d6vWrL8/vPv347penT4/fvf7X45fXv//+f/6Pb//x9PlvX35+fHx+hRo+ ffnu9c/Pz79+8/btl/c/P3589+XN06+Pn/C//PT0+eO7Z/zXz399++XXz4/vfuwLffzl7eTm ZvH247sPn14PNXzz+SV1PP3004f3j5un9799fPz0PFTy+fGXd8/4/l9+/vDrl1Tbx/cvqe7j u89/++3X371/+vgrqvjhwy8fnv/VV/r61cf33+z/+unp87sffsHf/c9m9u59qrv/L1L9xw/v Pz99efrp+Q2qezt8Uf2bb9/evkVN33/74wf8BSfbX31+/Om7139ovvnz7Gb2+u333/YO/d8P j//44v7zq+d3P/zl8ZfH98+PP6KhXr/6r6enj395/+705W7Ravm//vHk+C8DPDXSD09PfztV tkexG3zur+8+Pb76119+xZ/a1/P89Gv7+NPz+vEXFPrD5PWrd++fP/z98U+Qfff6h6fn56eP p/+97wbPQD99fvqvx0/99+y/zukvONUZxUMlVul0uUDx/z/8nfgv39xNV9NTDW/zn+r/c/qz 7/u+86fPr358/Ondb788//npHw+PH/768+l7z97M0BqnRvnmx39tHr+8R2/A3/dmMj/V+/7p F1SC///q44dTt0Zrvvtn/+8/Pvz4/PN3r1dvVqvFslkt56e/618nE1PBoQh86IvgXysynb1Z LpfT2dSVwZ/1w+OX53uz8v1vX+DW/xs+orEvMtQ3tfrwr9XX3Op3WL5+daEO/MX9d8K/Vsd8 OrYO/L19Hfjm6XvM3ywWs5sFnEtWXP4a+F/7KvBvqgIGZxcv/QUYTPqi+Dc3hJiK73HBhFur Av+mhpm/mU4nN9PG/QWX62jwexk6BP5DaQ624UoluVfhP1zpVm+HDtn39s2753fff/v56R+v MOCdjMOPB8Nn802DvoH/MME/w98/9P9edOrzs+kb9MZ6n0dnP1X3h1N9qAJ/Fgp8wa/9798v b2++fft3/L7em+jORPjHiZooWpsIn+hEkyjaVEXTKNpWRbMouq+K5lG0q/x1i8Uiih6qomUU 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 Byl2FNIK6TyJToYEd7XnLjXBKVor2iTknZQEZyLXJ41EJzn4ZlFxcqg6FOOnyR2k2FFIK6Tz JDo57izkUhOconVBfgzgdxQklTdXQp2JwtlTWdqZKBrHz4qriug77bMojwFCjkJaIZ0n0e8Q /a73XI1+S90jU7RJyJsr0c9Elw/2miiay9eAqyKa4vZZVMyVNCiaVkjnSTS3dgbyJcu3ZfXI Iw1id0WVl28JhSOrfMtvTdTQwLrNolT3vZCdkdgUPNfVRHOe67KoNIVkR9G0QjpPYlPUsuNX 3Y/dv9WH78de8v3YRVXaJmfOSyuRWvUrPpKzNZW7xC9kZyS2Dif7qoiTfRaV1pGAKZpWSOdJ bJ1xhyj7t0TRSkT38lS1UbQ15J2UvTzTRCc5qldFfEoqi4qTsr8nmlZI50l0khPj5TX0Ujfw FK0VbRRtDXknZQPPNMFJPsr9kEVlJVJJhUveX5ZiRyGtkM6T6CRnwCtO6gbeUlOdoo2irSHv pGzgmSY6yWk6i4qTKbK5zbYlzZ4HKXYU0grpPIlOjst1S811itaKNoq2hryTQ+3u9IhpopMc h6sivrycReXXLYlNNK2QzpPg5GpcYuvlcZxUtFa0UbQ15JwUsjMSneQZpyriGSeLspNCjkJa IZ0n0clxiW2liU3RWtFG0daQd3Ko3fVJ00QnecbJovzrrhbjE01S7CikFdJ5Ep0cl9hWmtgU rRVtFG0NeSflvKJpgpPyjKUsKk5WjjnyI5UOUuwopBXSeRKd5Cz21Ycb8NJMed/UcsmX3Ysq r1FrBVd8jHlTVTV8Z5ypfOsMX8v388rW3opnMavIndzLxM1iK57FpNhRSCuk8yS2Doe5y+uB lUU491h1RWtFG0VbQ/SuElr/3BdVas5dQujM5WzNiue2pMqXmvdCDkKOQlohnSfRTI5jV8y0 6OTNFLReCdoo2hry3VKOQZomDhocbKsiDrZZVCYyiU6iaYV0nkQnx0WnleUk76Sgtao2iraG vJMSnUwTneSLuFlUht+Uiny/5Yu4UuwopBXSeRKdHBedVhadvJOC1qraKNoa8k5KdDJNdJIv 4mZRcbISnfiBQgcpdhTSCuk8iU6Oi04ry0neSUFrVW0UbQ15JyU6mSY4ecuXZ7OoOMm7XYdq RTR7HaWiVkjnSXRyXHRaWXTyTgpaq2qjaGvIO5mi06VjDVYsmsuXZ7OomFvZNrvlI7pS7Cik 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 1Ib83Bx2ar9Br3ZmdWrbTb5Nx6L8HNJzTIcx/oZ0m5pA/cSgDyCmbbSXZ+k2NcF+bIe83Hr8 Dek5fTNom44lb4fxPBr0aAeP5XrYj/tLzyNtG39fWu4wjMOEQa83pn5eqVy6TUXGnNCgKPNF 2w75NlU35u6pctOxpNcxEdq7abiaHKdWT303LRKZHMu4bVoYMi23Hctlfo6rnGmbVvFJ+p5x m17szbft1J+Nr8hmx6Jtevk6/X16LX/cX77tatymGydJu4/F9Pp+tkU/QK+WZ1uUKvkoT6+b 6ej1IlRSatymJ+BPbBuPUE8NZr96PdapD6Vk2zY6E8Z1zjOXNzrzxlWJ03IaHZ7aNvbG41e7 s3IajU4fEk2PczwWfbIw++2qUx/XzX+76tTnA/NsuBh/wyr/7Std3dZpz3k7jFf2tW6IJcc5 bjvk21RkrPMi81NFdFU8sW0Yr4r6k5/NqnPQO6NJG409i8ql+TcOXNL+/Vrd+03KLNdrncjp GPB6ePeUj6uu3j2lV9frceCbZta12ittkuvVONbKu9dh7EEze/QzD+nPvNWW23yLfuZt+jPV Pu8O+SB4HP+nP+egLYf8FBrxKs1LXbQ1wE1bdGzs9IeOPJYPt8bRXZpygzIurex+++4lG04c NjrkHFa05eYExgip1KDpcGiloeBNPhS8HvHgJscDDbvVR+Z4oHLj/lI8uF7tx6F8fhkeh8ja liOATkBtS1N8vGLm3a5uMtzkZcZdpbcSrgW0Nym26uTTb847K20bO8CL9HIydizalp83IzLk ndX1Shh5k2Okto0naXrbQNtG/9NbETqDR//zDmG8paBtqf/j8FfD2NT/4WIcsqRDf33ae/tu +uJ0dtEYh3L5BWX8lJbK5d2TvtGqcukF83osp22p1/ouxbgtH0KMvqzzvm2tC5G2peePnm8d hx6TZ79td8V+/89f//Ll8+v3T3/8l28//fnL5+8PfzpOxPzP19ff/ebzl8OXz//1+u2XT18+ j33M148/v758/Pbzp8+//PTX1z/rbtrFP2k+9Nunn8flBaZ/f//ydfqXniH4jy/fv3/5W/3f X14//un12/g/3Rr985cv3+t/Sr3//vr9719/+vrx6+u3f//0v9q5ppe+fPv0+vn7x+/a/e9+ 8/XLt+/fPn76rv29+6Sj/Pbwp+ky99v//vLtP6dbfr//PwEAAAD//wMAUEsDBBQABgAIAAAA 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 ------=_NextPart_6A49C9A9_E0657D40_6AAF3ADB Content-Type: application/octet-stream; charset="utf-8"; name="v2-SQL_test_result.xlsx" Content-Disposition: attachment; filename="v2-SQL_test_result.xlsx" Content-Transfer-Encoding: base64 UEsDBBQABgAIAAAAIQBe/jo6lwEAAM0JAAATAAgCW0NvbnRlbnRfVHlwZXNdLnhtbCCiBAIo oAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADMlttOwzAMhu+ReIcqt2jNxmEMtI4LDpeA tPEAoXHXaG0SxQa2t8cN24TQGJo2id60ahL//2dXij28mddV8g4BjbOZ6KVdkYDNnTZ2momX yUNnIBIkZbWqnIVMLADFzej4aDhZeMCEoy1moiTy11JiXkKtMHUeLO8ULtSK+DNMpVf5TE1B nna7fZk7S2CpQ42GGA3voFBvFSX3c17+Ink1ViS3X+caq0wo7yuTK2JQ+W71D5OOKwqTg3b5 W83SKfoASmMJQHWV+mDYMYyBiBNDITd6BqhwN9NlVilHRjAsjccTTv0Xh2bn96yWcU/8O4LR kDyrQI+q5tzlvJIfLsxenZul20V2LU0sUVorY1fcW/zjYZTx1TswSJNfFN6R47QlHGct4Thv CcdFSzj6LeG4bAnHoCUcVy3h6HX/CYS4WYKMz/3v0ijzx82JtKgAD90/ouhfzqUKoMfEbXh6 cIDv2ts4eDZ4Ds4jjx8Bdq/Cqtc30R3PQhDIwLrbb+qaa0eeXfYuOzTDkQa9wVvGYWz0CQAA //8DAFBLAwQUAAYACAAAACEAtVUwI/QAAABMAgAACwAIAl9yZWxzLy5yZWxzIKIEAiigAAIA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKySTU/DMAyG70j8h8j31d2QEEJLd0FIuyFUfoBJ 3A+1jaMkG92/JxwQVBqDA0d/vX78ytvdPI3qyCH24jSsixIUOyO2d62Gl/pxdQcqJnKWRnGs 4cQRdtX11faZR0p5KHa9jyqruKihS8nfI0bT8USxEM8uVxoJE6UchhY9mYFaxk1Z3mL4rgHV QlPtrYawtzeg6pPPm3/XlqbpDT+IOUzs0pkVyHNiZ9mufMhsIfX5GlVTaDlpsGKecjoieV9k bMDzRJu/E/18LU6cyFIiNBL4Ms9HxyWg9X9atDTxy515xDcJw6vI8MmCix+o3gEAAP//AwBQ SwMEFAAGAAgAAAAhAJIZEeE3AQAAtAcAABoACAF4bC9fcmVscy93b3JrYm9vay54bWwucmVs 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 Z/94799sY+RXg4d8lT2vm/+Vr//Ni8enhhLi7ORMOFiWa2pN/webQuQJDU/2vf18LR6aJzq6 GA6Wz3VTbpI34c2sM5i8GZwNB28GFyfn52cXV5fnw8HXvG7MQvQGfVDLtlP6PPYB+qYza+1o VH66b7oLWh/0+am+r9/s6POn+x7TPdmNNh18qvfxe5xo/H++/+m+fzr4XP8U7u7MfyXu433g xcHn+t+HfvwrsR/vgy8OPtf/PvzjX4n/ZB9/cfCp/if7+E/YyH3wvpvsx39Cw/nZLBp1M0c7 /xhZk93fVuXrgKZ6OrV6l4kfjvENOabJRah/kEwTQU3fX+6vTm9HLzRhLemPrN5NKZkZ0xnJ 76bji/G7bet4LtOJTA2ZTmVqQs8W9GxDWwdSF3r2oK0PaQCvN4S2EaQx9JxA2wW83lTnWcoN SnQurUg+5MZEie9s2qbbdHJ9daFkTUfOrqeXh1xs88k4ECXTTK03S+vN1to4WuJqvXlaG19L Au31hFqbSEtirbdEa7PQXk/KeZOiTj8vXNRJ7kX9TI7trE+vlJSYI2ggaEqdnitpY0Fqy1SZ pByZKmfsQurJVBkKX6bn8kAFkIYyvZRtI5leyTSGNJHptWy7kOiFMs6pjkppQz9sXNqQ3Esb ZTRm5+1koc4hc142eNnkZYuXbV52eNnlZY+XfV4OeDnk5YiXY15OeHnBy+mRLIWQliRcCEnu hVCZ1WdiufFyr9wEc1Y1WNVkVYtVbVZ1WNVlVY9VfVYNWDVk1YhVY1ZNWHXBqqmqShETD6fM wo/kXsSUaWR22UZMXdOxqsGqZqcqU6rFqnanKhOs06lK1ris6nWqMnX4napkY8CeQ9ip6nTa qeo0yp5D0qnqtMleW6qqUsRECYiJGMm9iCnnNLtqI/ZFDRkvG7xs8rLFyzYvO7zs8rLHyz4v B7wc8nLEyzEvJ7y84OX0SJZCSM+fXAhJ7oVQSZXZdRtC5Zd1zqoGq5qsarGqzaoOq7qs6rGq z6oBq4asGrFqzKoJqy5YNVVVKWKi6sM+IJN+iNlUic5MmB3wmXJXzjE2MDYxtjC2MXYwdjH2 MPYxDjAOMY4wjjFOMF5gnGqxnEy6aku/3DKeKpP1TNQPD9UY5bdzDqkBqQmpBakNqQOpC6kH qQ9pAGkIaQRpDGkC6QLSVEfl3KG6CzsRSfWYqZIds7GEz5TfljnGBsYmxhbGNsYOxi7GHsY+ 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 AAB4bC93b3Jrc2hlZXRzL3NoZWV0My54bWxQSwECLQAUAAYACAAAACEAW1nDt3wFAADkGAAA GAAAAAAAAAAAAAAAAADlGAAAeGwvd29ya3NoZWV0cy9zaGVldDIueG1sUEsBAi0AFAAGAAgA AAAhADttMkvBAAAAQgEAACMAAAAAAAAAAAAAAAAAlx4AAHhsL3dvcmtzaGVldHMvX3JlbHMv c2hlZXQyLnhtbC5yZWxzUEsBAi0AFAAGAAgAAAAhABPELBPCAAAAQgEAACMAAAAAAAAAAAAA AAAAmR8AAHhsL3dvcmtzaGVldHMvX3JlbHMvc2hlZXQzLnhtbC5yZWxzUEsBAi0AFAAGAAgA AAAhADShCZLCAAAAQgEAACMAAAAAAAAAAAAAAAAAnCAAAHhsL3dvcmtzaGVldHMvX3JlbHMv c2hlZXQ0LnhtbC5yZWxzUEsBAi0AFAAGAAgAAAAhAEOWEaPCAAAAQgEAACMAAAAAAAAAAAAA AAAAnyEAAHhsL3dvcmtzaGVldHMvX3JlbHMvc2hlZXQ2LnhtbC5yZWxzUEsBAi0AFAAGAAgA AAAhAGTzNCLCAAAAQgEAACMAAAAAAAAAAAAAAAAAoiIAAHhsL3dvcmtzaGVldHMvX3JlbHMv c2hlZXQ3LnhtbC5yZWxzUEsBAi0AFAAGAAgAAAAhAJhnkfEKEAAAq2YAABQAAAAAAAAAAAAA AAAApSMAAHhsL3NoYXJlZFN0cmluZ3MueG1sUEsBAi0AFAAGAAgAAAAhABV9oBEEAwAAaAsA ABgAAAAAAAAAAAAAAAAA4TMAAHhsL3dvcmtzaGVldHMvc2hlZXQxLnhtbFBLAQItABQABgAI AAAAIQAfRCdUlQQAAPUWAAAYAAAAAAAAAAAAAAAAABs3AAB4bC93b3Jrc2hlZXRzL3NoZWV0 NS54bWxQSwECLQAUAAYACAAAACEAs5aHQC4CAADOBQAAGQAAAAAAAAAAAAAAAADmOwAAeGwv d29ya3NoZWV0cy9zaGVldDEwLnhtbFBLAQItABQABgAIAAAAIQBDTWJrKQMAAMkLAAAYAAAA AAAAAAAAAAAAAEs+AAB4bC93b3Jrc2hlZXRzL3NoZWV0OS54bWxQSwECLQAUAAYACAAAACEA BPYS1rsCAAAgCQAAGAAAAAAAAAAAAAAAAACqQQAAeGwvd29ya3NoZWV0cy9zaGVldDgueG1s UEsBAi0AFAAGAAgAAAAhAHO7Yvo4AwAAUwkAABgAAAAAAAAAAAAAAAAAm0QAAHhsL3dvcmtz aGVldHMvc2hlZXQ3LnhtbFBLAQItABQABgAIAAAAIQC/TQzCMAQAAAYPAAAYAAAAAAAAAAAA AAAAAAlIAAB4bC93b3Jrc2hlZXRzL3NoZWV0Ni54bWxQSwECLQAUAAYACAAAACEA2OpR6JMD AABEDgAADQAAAAAAAAAAAAAAAABvTAAAeGwvc3R5bGVzLnhtbFBLAQItABQABgAIAAAAIQB3 i32WnAYAAI8aAAATAAAAAAAAAAAAAAAAAC1QAAB4bC90aGVtZS90aGVtZTEueG1sUEsBAi0A FAAGAAgAAAAhALQAgmFEAQAAVwIAABEAAAAAAAAAAAAAAAAA+lYAAGRvY1Byb3BzL2NvcmUu eG1sUEsBAi0AFAAGAAgAAAAhAK4L/Ym7AQAALBUAACcAAAAAAAAAAAAAAAAAdVkAAHhsL3By aW50ZXJTZXR0aW5ncy9wcmludGVyU2V0dGluZ3MxLmJpblBLAQItABQABgAIAAAAIQCuC/2J uwEAACwVAAAnAAAAAAAAAAAAAAAAAHVbAAB4bC9wcmludGVyU2V0dGluZ3MvcHJpbnRlclNl dHRpbmdzMi5iaW5QSwECLQAUAAYACAAAACEArgv9ibsBAAAsFQAAJwAAAAAAAAAAAAAAAAB1 XQAAeGwvcHJpbnRlclNldHRpbmdzL3ByaW50ZXJTZXR0aW5nczMuYmluUEsBAi0AFAAGAAgA AAAhAK4L/Ym7AQAALBUAACcAAAAAAAAAAAAAAAAAdV8AAHhsL3ByaW50ZXJTZXR0aW5ncy9w cmludGVyU2V0dGluZ3M0LmJpblBLAQItABQABgAIAAAAIQCuC/2JuwEAACwVAAAnAAAAAAAA AAAAAAAAAHVhAAB4bC9wcmludGVyU2V0dGluZ3MvcHJpbnRlclNldHRpbmdzNS5iaW5QSwEC LQAUAAYACAAAACEAUXYoH+IBAAAnBAAAEAAAAAAAAAAAAAAAAAB1YwAAZG9jUHJvcHMvYXBw LnhtbFBLBQYAAAAAHQAdADUIAACNZgAAAAA= ------=_NextPart_6A49C9A9_E0657D40_6AAF3ADB Content-Type: application/octet-stream; charset="utf-8"; name="v2.pathch.txt" Content-Disposition: attachment; filename="v2.pathch.txt" Content-Transfer-Encoding: base64 ZGlmZiAtLWdpdCBhL3NyYy9iYWNrZW5kL2FjY2Vzcy9oZWFwL2hlYXBhbV9oYW5kbGVyLmMg Yi9zcmMvYmFja2VuZC9hY2Nlc3MvaGVhcC9oZWFwYW1faGFuZGxlci5jCmluZGV4IDIyNjhj YzI3Li4yMmUwNzYyZSAxMDA2NDQKLS0tIGEvc3JjL2JhY2tlbmQvYWNjZXNzL2hlYXAvaGVh cGFtX2hhbmRsZXIuYworKysgYi9zcmMvYmFja2VuZC9hY2Nlc3MvaGVhcC9oZWFwYW1faGFu ZGxlci5jCkBAIC0xMTU5LDcgKzExNTksNyBAQCBoZWFwYW1faW5kZXhfYnVpbGRfcmFuZ2Vf c2NhbihSZWxhdGlvbiBoZWFwUmVsYXRpb24sCiAJRGF0dW0JCXZhbHVlc1tJTkRFWF9NQVhf S0VZU107CiAJYm9vbAkJaXNudWxsW0lOREVYX01BWF9LRVlTXTsKIAlkb3VibGUJCXJlbHR1 cGxlczsKLQlFeHByU3RhdGUgICpwcmVkaWNhdGU7CisJRXhwclN0YXRlICAqcHJlZGljYXRl RXhwYW5kOwogCVR1cGxlVGFibGVTbG90ICpzbG90OwogCUVTdGF0ZQkgICAqZXN0YXRlOwog CUV4cHJDb250ZXh0ICplY29udGV4dDsKQEAgLTEyMDAsNyArMTIwMCw3IEBAIGhlYXBhbV9p bmRleF9idWlsZF9yYW5nZV9zY2FuKFJlbGF0aW9uIGhlYXBSZWxhdGlvbiwKIAllY29udGV4 dC0+ZWN4dF9zY2FudHVwbGUgPSBzbG90OwogCiAJLyogU2V0IHVwIGV4ZWN1dGlvbiBzdGF0 ZSBmb3IgcHJlZGljYXRlLCBpZiBhbnkuICovCi0JcHJlZGljYXRlID0gRXhlY1ByZXBhcmVR dWFsKGluZGV4SW5mby0+aWlfUHJlZGljYXRlLCBlc3RhdGUpOworCXByZWRpY2F0ZUV4cGFu ZCA9IEV4ZWNQcmVwYXJlUXVhbChpbmRleEluZm8tPmlpX1ByZWRpY2F0ZUV4cGFuZCwgZXN0 YXRlKTsKIAogCS8qCiAJICogUHJlcGFyZSBmb3Igc2NhbiBvZiB0aGUgYmFzZSByZWxhdGlv bi4gIEluIGEgbm9ybWFsIGluZGV4IGJ1aWxkLCB3ZSB1c2UKQEAgLTE2MDcsOSArMTYwNyw5 IEBAIGhlYXBhbV9pbmRleF9idWlsZF9yYW5nZV9zY2FuKFJlbGF0aW9uIGhlYXBSZWxhdGlv biwKIAkJICogSW4gYSBwYXJ0aWFsIGluZGV4LCBkaXNjYXJkIHR1cGxlcyB0aGF0IGRvbid0 IHNhdGlzZnkgdGhlCiAJCSAqIHByZWRpY2F0ZS4KIAkJICovCi0JCWlmIChwcmVkaWNhdGUg IT0gTlVMTCkKKwkJaWYgKHByZWRpY2F0ZUV4cGFuZCAhPSBOVUxMKQogCQl7Ci0JCQlpZiAo IUV4ZWNRdWFsKHByZWRpY2F0ZSwgZWNvbnRleHQpKQorCQkJaWYgKCFFeGVjUXVhbChwcmVk aWNhdGVFeHBhbmQsIGVjb250ZXh0KSkKIAkJCQljb250aW51ZTsKIAkJfQogCkBAIC0xNzA5 LDcgKzE3MDksOSBAQCBoZWFwYW1faW5kZXhfYnVpbGRfcmFuZ2Vfc2NhbihSZWxhdGlvbiBo ZWFwUmVsYXRpb24sCiAKIAkvKiBUaGVzZSBtYXkgaGF2ZSBiZWVuIHBvaW50aW5nIHRvIHRo ZSBub3ctZ29uZSBlc3RhdGUgKi8KIAlpbmRleEluZm8tPmlpX0V4cHJlc3Npb25zU3RhdGUg PSBOSUw7CisJaW5kZXhJbmZvLT5paV9FeHByZXNzaW9uc0V4cGFuZFN0YXRlID0gTklMOwog CWluZGV4SW5mby0+aWlfUHJlZGljYXRlU3RhdGUgPSBOVUxMOworCWluZGV4SW5mby0+aWlf UHJlZGljYXRlRXhwYW5kU3RhdGUgPSBOVUxMOwogCiAJcmV0dXJuIHJlbHR1cGxlczsKIH0K QEAgLTE3MjYsNyArMTcyOCw3IEBAIGhlYXBhbV9pbmRleF92YWxpZGF0ZV9zY2FuKFJlbGF0 aW9uIGhlYXBSZWxhdGlvbiwKIAlIZWFwVHVwbGUJaGVhcFR1cGxlOwogCURhdHVtCQl2YWx1 ZXNbSU5ERVhfTUFYX0tFWVNdOwogCWJvb2wJCWlzbnVsbFtJTkRFWF9NQVhfS0VZU107Ci0J RXhwclN0YXRlICAqcHJlZGljYXRlOworCUV4cHJTdGF0ZSAgKnByZWRpY2F0ZUV4cGFuZDsK IAlUdXBsZVRhYmxlU2xvdCAqc2xvdDsKIAlFU3RhdGUJICAgKmVzdGF0ZTsKIAlFeHByQ29u dGV4dCAqZWNvbnRleHQ7CkBAIC0xNzU4LDcgKzE3NjAsNyBAQCBoZWFwYW1faW5kZXhfdmFs aWRhdGVfc2NhbihSZWxhdGlvbiBoZWFwUmVsYXRpb24sCiAJZWNvbnRleHQtPmVjeHRfc2Nh bnR1cGxlID0gc2xvdDsKIAogCS8qIFNldCB1cCBleGVjdXRpb24gc3RhdGUgZm9yIHByZWRp Y2F0ZSwgaWYgYW55LiAqLwotCXByZWRpY2F0ZSA9IEV4ZWNQcmVwYXJlUXVhbChpbmRleElu Zm8tPmlpX1ByZWRpY2F0ZSwgZXN0YXRlKTsKKwlwcmVkaWNhdGVFeHBhbmQgPSBFeGVjUHJl cGFyZVF1YWwoaW5kZXhJbmZvLT5paV9QcmVkaWNhdGVFeHBhbmQsIGVzdGF0ZSk7CiAKIAkv KgogCSAqIFByZXBhcmUgZm9yIHNjYW4gb2YgdGhlIGJhc2UgcmVsYXRpb24uICBXZSBuZWVk IGp1c3QgdGhvc2UgdHVwbGVzCkBAIC0xODk1LDkgKzE4OTcsOSBAQCBoZWFwYW1faW5kZXhf dmFsaWRhdGVfc2NhbihSZWxhdGlvbiBoZWFwUmVsYXRpb24sCiAJCQkgKiBJbiBhIHBhcnRp YWwgaW5kZXgsIGRpc2NhcmQgdHVwbGVzIHRoYXQgZG9uJ3Qgc2F0aXNmeSB0aGUKIAkJCSAq IHByZWRpY2F0ZS4KIAkJCSAqLwotCQkJaWYgKHByZWRpY2F0ZSAhPSBOVUxMKQorCQkJaWYg KHByZWRpY2F0ZUV4cGFuZCAhPSBOVUxMKQogCQkJewotCQkJCWlmICghRXhlY1F1YWwocHJl ZGljYXRlLCBlY29udGV4dCkpCisJCQkJaWYgKCFFeGVjUXVhbChwcmVkaWNhdGVFeHBhbmQs IGVjb250ZXh0KSkKIAkJCQkJY29udGludWU7CiAJCQl9CiAKQEAgLTE5NTIsNyArMTk1NCw5 IEBAIGhlYXBhbV9pbmRleF92YWxpZGF0ZV9zY2FuKFJlbGF0aW9uIGhlYXBSZWxhdGlvbiwK IAogCS8qIFRoZXNlIG1heSBoYXZlIGJlZW4gcG9pbnRpbmcgdG8gdGhlIG5vdy1nb25lIGVz dGF0ZSAqLwogCWluZGV4SW5mby0+aWlfRXhwcmVzc2lvbnNTdGF0ZSA9IE5JTDsKKwlpbmRl eEluZm8tPmlpX0V4cHJlc3Npb25zRXhwYW5kU3RhdGUgPSBOSUw7CiAJaW5kZXhJbmZvLT5p aV9QcmVkaWNhdGVTdGF0ZSA9IE5VTEw7CisJaW5kZXhJbmZvLT5paV9QcmVkaWNhdGVFeHBh bmRTdGF0ZSA9IE5VTEw7CiB9CiAKIC8qCmRpZmYgLS1naXQgYS9zcmMvYmFja2VuZC9ib290 c3RyYXAvYm9vdHN0cmFwLmMgYi9zcmMvYmFja2VuZC9ib290c3RyYXAvYm9vdHN0cmFwLmMK aW5kZXggYjBkY2Q5ODcuLjgwYmY0ZmM0IDEwMDY0NAotLS0gYS9zcmMvYmFja2VuZC9ib290 c3RyYXAvYm9vdHN0cmFwLmMKKysrIGIvc3JjL2JhY2tlbmQvYm9vdHN0cmFwL2Jvb3RzdHJh cC5jCkBAIC0xMTU2LDExICsxMTU2LDE3IEBAIGluZGV4X3JlZ2lzdGVyKE9pZCBoZWFwLAog CS8qIGV4cHJlc3Npb25zIHdpbGwgbGlrZWx5IGJlIG51bGwsIGJ1dCBtYXkgYXMgd2VsbCBj b3B5IGl0ICovCiAJbmV3aW5kLT5pbF9pbmZvLT5paV9FeHByZXNzaW9ucyA9CiAJCWNvcHlP YmplY3QoaW5kZXhJbmZvLT5paV9FeHByZXNzaW9ucyk7CisJbmV3aW5kLT5pbF9pbmZvLT5p aV9FeHByZXNzaW9uc0V4cGFuZCA9CisJCWNvcHlPYmplY3QoaW5kZXhJbmZvLT5paV9FeHBy ZXNzaW9uc0V4cGFuZCk7CiAJbmV3aW5kLT5pbF9pbmZvLT5paV9FeHByZXNzaW9uc1N0YXRl ID0gTklMOworCW5ld2luZC0+aWxfaW5mby0+aWlfRXhwcmVzc2lvbnNFeHBhbmRTdGF0ZSA9 IE5JTDsKIAkvKiBwcmVkaWNhdGUgd2lsbCBsaWtlbHkgYmUgbnVsbCwgYnV0IG1heSBhcyB3 ZWxsIGNvcHkgaXQgKi8KIAluZXdpbmQtPmlsX2luZm8tPmlpX1ByZWRpY2F0ZSA9CiAJCWNv cHlPYmplY3QoaW5kZXhJbmZvLT5paV9QcmVkaWNhdGUpOworCW5ld2luZC0+aWxfaW5mby0+ aWlfUHJlZGljYXRlRXhwYW5kID0KKwkJY29weU9iamVjdChpbmRleEluZm8tPmlpX1ByZWRp Y2F0ZUV4cGFuZCk7CiAJbmV3aW5kLT5pbF9pbmZvLT5paV9QcmVkaWNhdGVTdGF0ZSA9IE5V TEw7CisJbmV3aW5kLT5pbF9pbmZvLT5paV9QcmVkaWNhdGVFeHBhbmRTdGF0ZSA9IE5VTEw7 CiAJLyogbm8gZXhjbHVzaW9uIGNvbnN0cmFpbnRzIGF0IGJvb3RzdHJhcCB0aW1lLCBzbyBu byBuZWVkIHRvIGNvcHkgKi8KIAlBc3NlcnQoaW5kZXhJbmZvLT5paV9FeGNsdXNpb25PcHMg PT0gTlVMTCk7CiAJQXNzZXJ0KGluZGV4SW5mby0+aWlfRXhjbHVzaW9uUHJvY3MgPT0gTlVM TCk7CmRpZmYgLS1naXQgYS9zcmMvYmFja2VuZC9jYXRhbG9nL2luZGV4LmMgYi9zcmMvYmFj a2VuZC9jYXRhbG9nL2luZGV4LmMKaW5kZXggOTQwN2MzNTcuLjc3NTVlODc0IDEwMDY0NAot LS0gYS9zcmMvYmFja2VuZC9jYXRhbG9nL2luZGV4LmMKKysrIGIvc3JjL2JhY2tlbmQvY2F0 YWxvZy9pbmRleC5jCkBAIC0xNDAzLDYgKzE0MDMsMTAgQEAgaW5kZXhfY3JlYXRlX2NvcHko UmVsYXRpb24gaGVhcFJlbGF0aW9uLCB1aW50MTYgZmxhZ3MsCiAJCQkJCQkJY29uY3VycmVu dGx5LAkvKiBjb25jdXJyZW50ICovCiAJCQkJCQkJaW5kZXhSZWxhdGlvbi0+cmRfaW5kYW0t PmFtc3VtbWFyaXppbmcsCiAJCQkJCQkJb2xkSW5mby0+aWlfV2l0aG91dE92ZXJsYXBzKTsK KwluZXdJbmZvLT5paV9FeHByZXNzaW9uc0V4cGFuZCA9CisJCShMaXN0ICopRXhwYW5kVmly dHVhbEdlbmVyYXRlZENvbHVtbnMoKE5vZGUgKilpbmRleEV4cHJzLCBoZWFwUmVsYXRpb24s IEludmFsaWRPaWQpOworCW5ld0luZm8tPmlpX1ByZWRpY2F0ZUV4cGFuZCA9CisJCShMaXN0 ICopRXhwYW5kVmlydHVhbEdlbmVyYXRlZENvbHVtbnMoKE5vZGUgKilpbmRleFByZWRzLCBo ZWFwUmVsYXRpb24sIEludmFsaWRPaWQpOwogCiAJLyogZmV0Y2ggZXhjbHVzaW9uIGNvbnN0 cmFpbnQgaW5mbyBpZiBhbnkgKi8KIAlpZiAoaW5kZXhSZWxhdGlvbi0+cmRfaW5kZXgtPmlu ZGlzZXhjbHVzaW9uKQpAQCAtMjQ3MSw2ICsyNDc1LDggQEAgQnVpbGRJbmRleEluZm8oUmVs YXRpb24gaW5kZXgpCiAJCQkJCSAgIGZhbHNlLAogCQkJCQkgICBpbmRleC0+cmRfaW5kYW0t PmFtc3VtbWFyaXppbmcsCiAJCQkJCSAgIGluZGV4U3RydWN0LT5pbmRpc2V4Y2x1c2lvbiAm JiBpbmRleFN0cnVjdC0+aW5kaXN1bmlxdWUpOworCWlpLT5paV9FeHByZXNzaW9uc0V4cGFu ZCA9IChMaXN0ICopUmVsYXRpb25HZXRJbmRleEV4cHJlc3Npb25zRXhwYW5kKGluZGV4KTsK KwlpaS0+aWlfUHJlZGljYXRlRXhwYW5kID0gKExpc3QgKilSZWxhdGlvbkdldEluZGV4UHJl ZGljYXRlRXhwYW5kKGluZGV4KTsKIAogCS8qIGZpbGwgaW4gYXR0cmlidXRlIG51bWJlcnMg Ki8KIAlmb3IgKGkgPSAwOyBpIDwgbnVtQXR0czsgaSsrKQpAQCAtMjc2MCwxMCArMjc2Niwx MiBAQCBGb3JtSW5kZXhEYXR1bShJbmRleEluZm8gKmluZGV4SW5mbywKIAkJLyogRmlyc3Qg dGltZSB0aHJvdWdoLCBzZXQgdXAgZXhwcmVzc2lvbiBldmFsdWF0aW9uIHN0YXRlICovCiAJ CWluZGV4SW5mby0+aWlfRXhwcmVzc2lvbnNTdGF0ZSA9CiAJCQlFeGVjUHJlcGFyZUV4cHJM aXN0KGluZGV4SW5mby0+aWlfRXhwcmVzc2lvbnMsIGVzdGF0ZSk7CisJCWluZGV4SW5mby0+ aWlfRXhwcmVzc2lvbnNFeHBhbmRTdGF0ZSA9CisJCQlFeGVjUHJlcGFyZUV4cHJMaXN0KGlu ZGV4SW5mby0+aWlfRXhwcmVzc2lvbnNFeHBhbmQsIGVzdGF0ZSk7CiAJCS8qIENoZWNrIGNh bGxlciBoYXMgc2V0IHVwIGNvbnRleHQgY29ycmVjdGx5ICovCiAJCUFzc2VydChHZXRQZXJU dXBsZUV4cHJDb250ZXh0KGVzdGF0ZSktPmVjeHRfc2NhbnR1cGxlID09IHNsb3QpOwogCX0K LQlpbmRleHByX2l0ZW0gPSBsaXN0X2hlYWQoaW5kZXhJbmZvLT5paV9FeHByZXNzaW9uc1N0 YXRlKTsKKwlpbmRleHByX2l0ZW0gPSBsaXN0X2hlYWQoaW5kZXhJbmZvLT5paV9FeHByZXNz aW9uc0V4cGFuZFN0YXRlKTsKIAogCWZvciAoaSA9IDA7IGkgPCBpbmRleEluZm8tPmlpX051 bUluZGV4QXR0cnM7IGkrKykKIAl7CkBAIC0yNzc1LDExICsyNzgzLDQwIEBAIEZvcm1JbmRl eERhdHVtKEluZGV4SW5mbyAqaW5kZXhJbmZvLAogCQkJaURhdHVtID0gc2xvdF9nZXRzeXNh dHRyKHNsb3QsIGtleWNvbCwgJmlzTnVsbCk7CiAJCWVsc2UgaWYgKGtleWNvbCAhPSAwKQog CQl7Ci0JCQkvKgotCQkJICogUGxhaW4gaW5kZXggY29sdW1uOyBnZXQgdGhlIHZhbHVlIHdl IG5lZWQgZGlyZWN0bHkgZnJvbSB0aGUKLQkJCSAqIGhlYXAgdHVwbGUuCi0JCQkgKi8KLQkJ CWlEYXR1bSA9IHNsb3RfZ2V0YXR0cihzbG90LCBrZXljb2wsICZpc051bGwpOworCQkJVHVw bGVEZXNjCQkJdHVwZGVzYyA9IHNsb3QtPnR0c190dXBsZURlc2NyaXB0b3I7CisJCQlGb3Jt X3BnX2F0dHJpYnV0ZSAJYXR0ID0gVHVwbGVEZXNjQXR0cih0dXBkZXNjLCBrZXljb2wgLSAx KTsKKworCQkJaWYgKGF0dC0+YXR0Z2VuZXJhdGVkICE9IEFUVFJJQlVURV9HRU5FUkFURURf VklSVFVBTCkKKwkJCXsKKwkJCQkvKgorCQkJCSAqIFBsYWluIGluZGV4IGNvbHVtbjsgZ2V0 IHRoZSB2YWx1ZSB3ZSBuZWVkIGRpcmVjdGx5IGZyb20gdGhlCisJCQkJICogaGVhcCB0dXBs ZS4KKwkJCQkqLworCQkJCWlEYXR1bSA9IHNsb3RfZ2V0YXR0cihzbG90LCBrZXljb2wsICZp c051bGwpOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCVR1cGxlQ29uc3RyIAkqY29uc3Ry ID0gdHVwZGVzYy0+Y29uc3RyOworCisJCQkJZm9yIChpbnQgaiA9IDA7IGogPCBjb25zdHIt Pm51bV9kZWZ2YWw7IGorKykKKwkJCQl7CisJCQkJCUF0dHJEZWZhdWx0IAkqZGVmdmFsOwor CQkJCQlFeHByCSAgIAkJKmV4cHIgPSBOVUxMOworCQkJCQlFeHByU3RhdGUgIAkJKmV4cHJz dGF0ZTsKKworCQkJCQlkZWZ2YWwgPSAmY29uc3RyLT5kZWZ2YWxbal07CisJCQkJCWlmIChk ZWZ2YWwtPmFkbnVtID09IGtleWNvbCkKKwkJCQkJeworCQkJCQkJZXhwciA9IHN0cmluZ1Rv Tm9kZShkZWZ2YWwtPmFkYmluKTsKKwkJCQkJCWV4cHJzdGF0ZSA9IEV4ZWNQcmVwYXJlRXhw cihleHByLCBlc3RhdGUpOworCQkJCQkJaURhdHVtID0gRXhlY0V2YWxFeHByU3dpdGNoQ29u dGV4dChleHByc3RhdGUsCisJCQkJCQkJCQkJCQkJCSAgIEdldFBlclR1cGxlRXhwckNvbnRl eHQoZXN0YXRlKSwKKwkJCQkJCQkJCQkJCQkJICAgJmlzTnVsbCk7CisJCQkJCQlicmVhazsK KwkJCQkJfQorCQkJCQlBc3NlcnQoaiArIDEgPCBjb25zdHItPm51bV9kZWZ2YWwpOworCQkJ CX0KKwkJCX0KIAkJfQogCQllbHNlCiAJCXsKQEAgLTI3OTEsNyArMjgyOCw3IEBAIEZvcm1J bmRleERhdHVtKEluZGV4SW5mbyAqaW5kZXhJbmZvLAogCQkJaURhdHVtID0gRXhlY0V2YWxF eHByU3dpdGNoQ29udGV4dCgoRXhwclN0YXRlICopIGxmaXJzdChpbmRleHByX2l0ZW0pLAog CQkJCQkJCQkJCQkgICBHZXRQZXJUdXBsZUV4cHJDb250ZXh0KGVzdGF0ZSksCiAJCQkJCQkJ CQkJCSAgICZpc051bGwpOwotCQkJaW5kZXhwcl9pdGVtID0gbG5leHQoaW5kZXhJbmZvLT5p aV9FeHByZXNzaW9uc1N0YXRlLCBpbmRleHByX2l0ZW0pOworCQkJaW5kZXhwcl9pdGVtID0g bG5leHQoaW5kZXhJbmZvLT5paV9FeHByZXNzaW9uc0V4cGFuZFN0YXRlLCBpbmRleHByX2l0 ZW0pOwogCQl9CiAJCXZhbHVlc1tpXSA9IGlEYXR1bTsKIAkJaXNudWxsW2ldID0gaXNOdWxs OwpAQCAtMzIyMCw3ICszMjU3LDcgQEAgSW5kZXhDaGVja0V4Y2x1c2lvbihSZWxhdGlvbiBo ZWFwUmVsYXRpb24sCiAJVGFibGVTY2FuRGVzYyBzY2FuOwogCURhdHVtCQl2YWx1ZXNbSU5E RVhfTUFYX0tFWVNdOwogCWJvb2wJCWlzbnVsbFtJTkRFWF9NQVhfS0VZU107Ci0JRXhwclN0 YXRlICAqcHJlZGljYXRlOworCUV4cHJTdGF0ZSAgKnByZWRpY2F0ZUV4cGFuZDsKIAlUdXBs ZVRhYmxlU2xvdCAqc2xvdDsKIAlFU3RhdGUJICAgKmVzdGF0ZTsKIAlFeHByQ29udGV4dCAq ZWNvbnRleHQ7CkBAIC0zMjQ2LDcgKzMyODMsNyBAQCBJbmRleENoZWNrRXhjbHVzaW9uKFJl bGF0aW9uIGhlYXBSZWxhdGlvbiwKIAllY29udGV4dC0+ZWN4dF9zY2FudHVwbGUgPSBzbG90 OwogCiAJLyogU2V0IHVwIGV4ZWN1dGlvbiBzdGF0ZSBmb3IgcHJlZGljYXRlLCBpZiBhbnku ICovCi0JcHJlZGljYXRlID0gRXhlY1ByZXBhcmVRdWFsKGluZGV4SW5mby0+aWlfUHJlZGlj YXRlLCBlc3RhdGUpOworCXByZWRpY2F0ZUV4cGFuZCA9IEV4ZWNQcmVwYXJlUXVhbChpbmRl eEluZm8tPmlpX1ByZWRpY2F0ZUV4cGFuZCwgZXN0YXRlKTsKIAogCS8qCiAJICogU2NhbiBh bGwgbGl2ZSB0dXBsZXMgaW4gdGhlIGJhc2UgcmVsYXRpb24uCkBAIC0zMjY2LDkgKzMzMDMs OSBAQCBJbmRleENoZWNrRXhjbHVzaW9uKFJlbGF0aW9uIGhlYXBSZWxhdGlvbiwKIAkJLyoK IAkJICogSW4gYSBwYXJ0aWFsIGluZGV4LCBpZ25vcmUgdHVwbGVzIHRoYXQgZG9uJ3Qgc2F0 aXNmeSB0aGUgcHJlZGljYXRlLgogCQkgKi8KLQkJaWYgKHByZWRpY2F0ZSAhPSBOVUxMKQor CQlpZiAocHJlZGljYXRlRXhwYW5kICE9IE5VTEwpCiAJCXsKLQkJCWlmICghRXhlY1F1YWwo cHJlZGljYXRlLCBlY29udGV4dCkpCisJCQlpZiAoIUV4ZWNRdWFsKHByZWRpY2F0ZUV4cGFu ZCwgZWNvbnRleHQpKQogCQkJCWNvbnRpbnVlOwogCQl9CiAKQEAgLTMzMDEsNyArMzMzOCw5 IEBAIEluZGV4Q2hlY2tFeGNsdXNpb24oUmVsYXRpb24gaGVhcFJlbGF0aW9uLAogCiAJLyog VGhlc2UgbWF5IGhhdmUgYmVlbiBwb2ludGluZyB0byB0aGUgbm93LWdvbmUgZXN0YXRlICov CiAJaW5kZXhJbmZvLT5paV9FeHByZXNzaW9uc1N0YXRlID0gTklMOworCWluZGV4SW5mby0+ aWlfRXhwcmVzc2lvbnNFeHBhbmRTdGF0ZSA9IE5JTDsKIAlpbmRleEluZm8tPmlpX1ByZWRp Y2F0ZVN0YXRlID0gTlVMTDsKKwlpbmRleEluZm8tPmlpX1ByZWRpY2F0ZUV4cGFuZFN0YXRl ID0gTlVMTDsKIH0KIAogLyoKZGlmZiAtLWdpdCBhL3NyYy9iYWNrZW5kL2NhdGFsb2cvaW5k ZXhpbmcuYyBiL3NyYy9iYWNrZW5kL2NhdGFsb2cvaW5kZXhpbmcuYwppbmRleCBmZDdkMmVj MC4uZDI3YWFhMDkgMTAwNjQ0Ci0tLSBhL3NyYy9iYWNrZW5kL2NhdGFsb2cvaW5kZXhpbmcu YworKysgYi9zcmMvYmFja2VuZC9jYXRhbG9nL2luZGV4aW5nLmMKQEAgLTEzMyw3ICsxMzMs OSBAQCBDYXRhbG9nSW5kZXhJbnNlcnQoQ2F0YWxvZ0luZGV4U3RhdGUgaW5kc3RhdGUsIEhl YXBUdXBsZSBoZWFwVHVwbGUsCiAJCSAqIHN1cHBvcnRlZCwgbm9yIGV4Y2x1c2lvbiBjb25z dHJhaW50cywgbm9yIGRlZmVycmVkIHVuaXF1ZW5lc3MKIAkJICovCiAJCUFzc2VydChpbmRl eEluZm8tPmlpX0V4cHJlc3Npb25zID09IE5JTCk7CisJCUFzc2VydChpbmRleEluZm8tPmlp X0V4cHJlc3Npb25zRXhwYW5kID09IE5JTCk7CiAJCUFzc2VydChpbmRleEluZm8tPmlpX1By ZWRpY2F0ZSA9PSBOSUwpOworCQlBc3NlcnQoaW5kZXhJbmZvLT5paV9QcmVkaWNhdGVFeHBh bmQgPT0gTklMKTsKIAkJQXNzZXJ0KGluZGV4SW5mby0+aWlfRXhjbHVzaW9uT3BzID09IE5V TEwpOwogCQlBc3NlcnQoaW5kZXgtPnJkX2luZGV4LT5pbmRpbW1lZGlhdGUpOwogCQlBc3Nl cnQoaW5kZXhJbmZvLT5paV9OdW1JbmRleEtleUF0dHJzICE9IDApOwpkaWZmIC0tZ2l0IGEv c3JjL2JhY2tlbmQvY2F0YWxvZy90b2FzdGluZy5jIGIvc3JjL2JhY2tlbmQvY2F0YWxvZy90 b2FzdGluZy5jCmluZGV4IDRhYTUyYTRiLi5kYWViZmRhMSAxMDA2NDQKLS0tIGEvc3JjL2Jh Y2tlbmQvY2F0YWxvZy90b2FzdGluZy5jCisrKyBiL3NyYy9iYWNrZW5kL2NhdGFsb2cvdG9h c3RpbmcuYwpAQCAtMjk4LDkgKzI5OCwxMyBAQCBjcmVhdGVfdG9hc3RfdGFibGUoUmVsYXRp b24gcmVsLCBPaWQgdG9hc3RPaWQsIE9pZCB0b2FzdEluZGV4T2lkLAogCWluZGV4SW5mby0+ aWlfSW5kZXhBdHRyTnVtYmVyc1swXSA9IDE7CiAJaW5kZXhJbmZvLT5paV9JbmRleEF0dHJO dW1iZXJzWzFdID0gMjsKIAlpbmRleEluZm8tPmlpX0V4cHJlc3Npb25zID0gTklMOworCWlu ZGV4SW5mby0+aWlfRXhwcmVzc2lvbnNFeHBhbmQgPSBOSUw7CiAJaW5kZXhJbmZvLT5paV9F eHByZXNzaW9uc1N0YXRlID0gTklMOworCWluZGV4SW5mby0+aWlfRXhwcmVzc2lvbnNFeHBh bmRTdGF0ZSA9IE5JTDsKIAlpbmRleEluZm8tPmlpX1ByZWRpY2F0ZSA9IE5JTDsKKwlpbmRl eEluZm8tPmlpX1ByZWRpY2F0ZUV4cGFuZCA9IE5JTDsKIAlpbmRleEluZm8tPmlpX1ByZWRp Y2F0ZVN0YXRlID0gTlVMTDsKKwlpbmRleEluZm8tPmlpX1ByZWRpY2F0ZUV4cGFuZFN0YXRl ID0gTlVMTDsKIAlpbmRleEluZm8tPmlpX0V4Y2x1c2lvbk9wcyA9IE5VTEw7CiAJaW5kZXhJ bmZvLT5paV9FeGNsdXNpb25Qcm9jcyA9IE5VTEw7CiAJaW5kZXhJbmZvLT5paV9FeGNsdXNp b25TdHJhdHMgPSBOVUxMOwpkaWZmIC0tZ2l0IGEvc3JjL2JhY2tlbmQvY29tbWFuZHMvYW5h bHl6ZS5jIGIvc3JjL2JhY2tlbmQvY29tbWFuZHMvYW5hbHl6ZS5jCmluZGV4IGY2NmU4MGI3 Li5mYzY3YzI0YSAxMDA2NDQKLS0tIGEvc3JjL2JhY2tlbmQvY29tbWFuZHMvYW5hbHl6ZS5j CisrKyBiL3NyYy9iYWNrZW5kL2NvbW1hbmRzL2FuYWx5emUuYwpAQCAtODk5LDcgKzg5OSw3 IEBAIGNvbXB1dGVfaW5kZXhfc3RhdHMoUmVsYXRpb24gb25lcmVsLCBkb3VibGUgdG90YWxy b3dzLAogCQlUdXBsZVRhYmxlU2xvdCAqc2xvdDsKIAkJRVN0YXRlCSAgICplc3RhdGU7CiAJ CUV4cHJDb250ZXh0ICplY29udGV4dDsKLQkJRXhwclN0YXRlICAqcHJlZGljYXRlOworCQlF eHByU3RhdGUgICpwcmVkaWNhdGVFeHBhbmQ7CiAJCURhdHVtCSAgICpleHBydmFsczsKIAkJ Ym9vbAkgICAqZXhwcm51bGxzOwogCQlpbnQJCQludW1pbmRleHJvd3MsCkBAIC05MDgsNyAr OTA4LDcgQEAgY29tcHV0ZV9pbmRleF9zdGF0cyhSZWxhdGlvbiBvbmVyZWwsIGRvdWJsZSB0 b3RhbHJvd3MsCiAJCWRvdWJsZQkJdG90YWxpbmRleHJvd3M7CiAKIAkJLyogSWdub3JlIGlu ZGV4IGlmIG5vIGNvbHVtbnMgdG8gYW5hbHl6ZSBhbmQgbm90IHBhcnRpYWwgKi8KLQkJaWYg KGF0dHJfY250ID09IDAgJiYgaW5kZXhJbmZvLT5paV9QcmVkaWNhdGUgPT0gTklMKQorCQlp ZiAoYXR0cl9jbnQgPT0gMCAmJiBpbmRleEluZm8tPmlpX1ByZWRpY2F0ZUV4cGFuZCA9PSBO SUwpCiAJCQljb250aW51ZTsKIAogCQkvKgpAQCAtOTI2LDcgKzkyNiw3IEBAIGNvbXB1dGVf aW5kZXhfc3RhdHMoUmVsYXRpb24gb25lcmVsLCBkb3VibGUgdG90YWxyb3dzLAogCQllY29u dGV4dC0+ZWN4dF9zY2FudHVwbGUgPSBzbG90OwogCiAJCS8qIFNldCB1cCBleGVjdXRpb24g c3RhdGUgZm9yIHByZWRpY2F0ZS4gKi8KLQkJcHJlZGljYXRlID0gRXhlY1ByZXBhcmVRdWFs KGluZGV4SW5mby0+aWlfUHJlZGljYXRlLCBlc3RhdGUpOworCQlwcmVkaWNhdGVFeHBhbmQg PSBFeGVjUHJlcGFyZVF1YWwoaW5kZXhJbmZvLT5paV9QcmVkaWNhdGVFeHBhbmQsIGVzdGF0 ZSk7CiAKIAkJLyogQ29tcHV0ZSBhbmQgc2F2ZSBpbmRleCBleHByZXNzaW9uIHZhbHVlcyAq LwogCQlleHBydmFscyA9IChEYXR1bSAqKSBwYWxsb2MobnVtcm93cyAqIGF0dHJfY250ICog c2l6ZW9mKERhdHVtKSk7CkBAIC05NDksOSArOTQ5LDkgQEAgY29tcHV0ZV9pbmRleF9zdGF0 cyhSZWxhdGlvbiBvbmVyZWwsIGRvdWJsZSB0b3RhbHJvd3MsCiAJCQlFeGVjU3RvcmVIZWFw VHVwbGUoaGVhcFR1cGxlLCBzbG90LCBmYWxzZSk7CiAKIAkJCS8qIElmIGluZGV4IGlzIHBh cnRpYWwsIGNoZWNrIHByZWRpY2F0ZSAqLwotCQkJaWYgKHByZWRpY2F0ZSAhPSBOVUxMKQor CQkJaWYgKHByZWRpY2F0ZUV4cGFuZCAhPSBOVUxMKQogCQkJewotCQkJCWlmICghRXhlY1F1 YWwocHJlZGljYXRlLCBlY29udGV4dCkpCisJCQkJaWYgKCFFeGVjUXVhbChwcmVkaWNhdGVF eHBhbmQsIGVjb250ZXh0KSkKIAkJCQkJY29udGludWU7CiAJCQl9CiAJCQludW1pbmRleHJv d3MrKzsKZGlmZiAtLWdpdCBhL3NyYy9iYWNrZW5kL2NvbW1hbmRzL2luZGV4Y21kcy5jIGIv c3JjL2JhY2tlbmQvY29tbWFuZHMvaW5kZXhjbWRzLmMKaW5kZXggOWFiNzRjOGQuLmY0ODU0 OTExIDEwMDY0NAotLS0gYS9zcmMvYmFja2VuZC9jb21tYW5kcy9pbmRleGNtZHMuYworKysg Yi9zcmMvYmFja2VuZC9jb21tYW5kcy9pbmRleGNtZHMuYwpAQCAtOTMyLDYgKzkzMiw4IEBA IERlZmluZUluZGV4KFBhcnNlU3RhdGUgKnBzdGF0ZSwKIAkJCQkJCQkgIGNvbmN1cnJlbnQs CiAJCQkJCQkJICBhbWlzc3VtbWFyaXppbmcsCiAJCQkJCQkJICBzdG10LT5pc3dpdGhvdXRv dmVybGFwcyk7CisJaW5kZXhJbmZvLT5paV9QcmVkaWNhdGVFeHBhbmQgPQorCQkoTGlzdCAq KUV4cGFuZFZpcnR1YWxHZW5lcmF0ZWRDb2x1bW5zKHN0bXQtPndoZXJlQ2xhdXNlLCByZWws IEludmFsaWRPaWQpOwogCiAJdHlwZUlkcyA9IHBhbGxvY19hcnJheShPaWQsIG51bWJlck9m QXR0cmlidXRlcyk7CiAJY29sbGF0aW9uSWRzID0gcGFsbG9jX2FycmF5KE9pZCwgbnVtYmVy T2ZBdHRyaWJ1dGVzKTsKQEAgLTk0OCw2ICs5NTAsOCBAQCBEZWZpbmVJbmRleChQYXJzZVN0 YXRlICpwc3RhdGUsCiAJCQkJCSAgcm9vdF9zYXZlX3VzZXJpZCwgcm9vdF9zYXZlX3NlY19j b250ZXh0LAogCQkJCQkgICZyb290X3NhdmVfbmVzdGxldmVsKTsKIAorCWluZGV4SW5mby0+ aWlfRXhwcmVzc2lvbnNFeHBhbmQgPQorCQkoTGlzdCAqKUV4cGFuZFZpcnR1YWxHZW5lcmF0 ZWRDb2x1bW5zKChOb2RlICopaW5kZXhJbmZvLT5paV9FeHByZXNzaW9uc0V4cGFuZCwgcmVs LCBJbnZhbGlkT2lkKTsKIAkvKgogCSAqIEV4dHJhIGNoZWNrcyB3aGVuIGNyZWF0aW5nIGEg UFJJTUFSWSBLRVkgaW5kZXguCiAJICovCkBAIC0xMTEwLDcgKzExMTQsNyBAQCBEZWZpbmVJ bmRleChQYXJzZVN0YXRlICpwc3RhdGUsCiAJICogV2UgZGlzYWxsb3cgaW5kZXhlcyBvbiBz eXN0ZW0gY29sdW1ucy4gIFRoZXkgd291bGQgbm90IG5lY2Vzc2FyaWx5IGdldAogCSAqIHVw ZGF0ZWQgY29ycmVjdGx5LCBhbmQgdGhleSBkb24ndCBzZWVtIHVzZWZ1bCBhbnl3YXkuCiAJ ICoKLQkgKiBBbHNvIGRpc2FsbG93IHZpcnR1YWwgZ2VuZXJhdGVkIGNvbHVtbnMgaW4gaW5k ZXhlcyAodXNlIGV4cHJlc3Npb24KKwkgKiBBaXNhbGxvdyB2aXJ0dWFsIGdlbmVyYXRlZCBj b2x1bW5zIGluIGluZGV4ZXMgKGluY2x1ZGUgdXNpbmcgZXhwcmVzc2lvbgogCSAqIGluZGV4 IGluc3RlYWQpLgogCSAqLwogCWZvciAoaW50IGkgPSAwOyBpIDwgaW5kZXhJbmZvLT5paV9O dW1JbmRleEF0dHJzOyBpKyspCkBAIC0xMTIzLDcgKzExMjcsNyBAQCBEZWZpbmVJbmRleChQ YXJzZVN0YXRlICpwc3RhdGUsCiAJCQkJCSBlcnJtc2coImluZGV4IGNyZWF0aW9uIG9uIHN5 c3RlbSBjb2x1bW5zIGlzIG5vdCBzdXBwb3J0ZWQiKSkpOwogCiAKLQkJaWYgKGF0dG5vID4g MCAmJgorCQkvKmlmIChhdHRubyA+IDAgJiYgaSA8IG51bWJlck9mS2V5QXR0cmlidXRlcyAm JgogCQkJVHVwbGVEZXNjQXR0cihSZWxhdGlvbkdldERlc2NyKHJlbCksIGF0dG5vIC0gMSkt PmF0dGdlbmVyYXRlZCA9PSBBVFRSSUJVVEVfR0VORVJBVEVEX1ZJUlRVQUwpCiAJCQllcmVw b3J0KEVSUk9SLAogCQkJCQllcnJjb2RlKEVSUkNPREVfRkVBVFVSRV9OT1RfU1VQUE9SVEVE KSwKQEAgLTExMzEsMTcgKzExMzUsMTUgQEAgRGVmaW5lSW5kZXgoUGFyc2VTdGF0ZSAqcHN0 YXRlLAogCQkJCQllcnJtc2coInByaW1hcnkga2V5cyBvbiB2aXJ0dWFsIGdlbmVyYXRlZCBj b2x1bW5zIGFyZSBub3Qgc3VwcG9ydGVkIikgOgogCQkJCQlzdG10LT5pc2NvbnN0cmFpbnQg PwogCQkJCQllcnJtc2coInVuaXF1ZSBjb25zdHJhaW50cyBvbiB2aXJ0dWFsIGdlbmVyYXRl ZCBjb2x1bW5zIGFyZSBub3Qgc3VwcG9ydGVkIikgOgotCQkJCQllcnJtc2coImluZGV4ZXMg b24gdmlydHVhbCBnZW5lcmF0ZWQgY29sdW1ucyBhcmUgbm90IHN1cHBvcnRlZCIpKTsKKwkJ CQkJZXJybXNnKCJpbmRleGVzIG9uIHZpcnR1YWwgZ2VuZXJhdGVkIGNvbHVtbnMgYXJlIG5v dCBzdXBwb3J0ZWQiKSk7Ki8KIAl9CiAKIAkvKgotCSAqIEFsc28gY2hlY2sgZm9yIHN5c3Rl bSBhbmQgZ2VuZXJhdGVkIGNvbHVtbnMgdXNlZCBpbiBleHByZXNzaW9ucyBvcgotCSAqIHBy ZWRpY2F0ZXMuCisJICogQWxzbyBjaGVjayBmb3Igc3lzdGVtIGNvbHVtbnMgdXNlZCBpbiBl eHByZXNzaW9ucyBvciBwcmVkaWNhdGVzLgogCSAqLwogCWlmIChpbmRleEluZm8tPmlpX0V4 cHJlc3Npb25zIHx8IGluZGV4SW5mby0+aWlfUHJlZGljYXRlKQogCXsKIAkJQml0bWFwc2V0 ICAqaW5kZXhhdHRycyA9IE5VTEw7Ci0JCWludAkJCWo7CiAKIAkJcHVsbF92YXJhdHRub3Mo KE5vZGUgKikgaW5kZXhJbmZvLT5paV9FeHByZXNzaW9ucywgMSwgJmluZGV4YXR0cnMpOwog CQlwdWxsX3ZhcmF0dG5vcygoTm9kZSAqKSBpbmRleEluZm8tPmlpX1ByZWRpY2F0ZSwgMSwg JmluZGV4YXR0cnMpOwpAQCAtMTE1NCwyNSArMTE1Niw2IEBAIERlZmluZUluZGV4KFBhcnNl U3RhdGUgKnBzdGF0ZSwKIAkJCQkJCShlcnJjb2RlKEVSUkNPREVfRkVBVFVSRV9OT1RfU1VQ UE9SVEVEKSwKIAkJCQkJCSBlcnJtc2coImluZGV4IGNyZWF0aW9uIG9uIHN5c3RlbSBjb2x1 bW5zIGlzIG5vdCBzdXBwb3J0ZWQiKSkpOwogCQl9Ci0KLQkJLyoKLQkJICogWFhYIFZpcnR1 YWwgZ2VuZXJhdGVkIGNvbHVtbnMgaW4gaW5kZXggZXhwcmVzc2lvbnMgb3IgcHJlZGljYXRl cwotCQkgKiBjb3VsZCBiZSBzdXBwb3J0ZWQsIGJ1dCBpdCBuZWVkcyBzdXBwb3J0IGluCi0J CSAqIFJlbGF0aW9uR2V0SW5kZXhFeHByZXNzaW9ucygpIGFuZCBSZWxhdGlvbkdldEluZGV4 UHJlZGljYXRlKCkuCi0JCSAqLwotCQlqID0gLTE7Ci0JCXdoaWxlICgoaiA9IGJtc19uZXh0 X21lbWJlcihpbmRleGF0dHJzLCBqKSkgPj0gMCkKLQkJewotCQkJQXR0ck51bWJlcglhdHRu byA9IGogKyBGaXJzdExvd0ludmFsaWRIZWFwQXR0cmlidXRlTnVtYmVyOwotCi0JCQlpZiAo YXR0bm8gPiAwICYmCi0JCQkJVHVwbGVEZXNjQXR0cihSZWxhdGlvbkdldERlc2NyKHJlbCks IGF0dG5vIC0gMSktPmF0dGdlbmVyYXRlZCA9PSBBVFRSSUJVVEVfR0VORVJBVEVEX1ZJUlRV QUwpCi0JCQkJZXJlcG9ydChFUlJPUiwKLQkJCQkJCShlcnJjb2RlKEVSUkNPREVfRkVBVFVS RV9OT1RfU1VQUE9SVEVEKSwKLQkJCQkJCSBzdG10LT5pc2NvbnN0cmFpbnQgPwotCQkJCQkJ IGVycm1zZygidW5pcXVlIGNvbnN0cmFpbnRzIG9uIHZpcnR1YWwgZ2VuZXJhdGVkIGNvbHVt bnMgYXJlIG5vdCBzdXBwb3J0ZWQiKSA6Ci0JCQkJCQkgZXJybXNnKCJpbmRleGVzIG9uIHZp cnR1YWwgZ2VuZXJhdGVkIGNvbHVtbnMgYXJlIG5vdCBzdXBwb3J0ZWQiKSkpOwotCQl9CiAJ fQogCiAJLyogSXMgaW5kZXggc2FmZSBmb3Igb3RoZXJzIHRvIGlnbm9yZT8gIFNlZSBzZXRf aW5kZXhzYWZlX3Byb2NmbGFncygpICovCkBAIC0xODc2LDYgKzE4NTksMTEgQEAgQ2hlY2tQ cmVkaWNhdGUoRXhwciAqcHJlZGljYXRlKQogICogSWYgdGhlIGNhbGxlciBzd2l0Y2hlZCB0 byB0aGUgdGFibGUgb3duZXIsIGRkbF91c2VyaWQgaXMgdGhlIHJvbGUgZm9yIEFDTAogICog Y2hlY2tzIHJlYWNoZWQgd2l0aG91dCB0cmF2ZXJzaW5nIG9wYXF1ZSBleHByZXNzaW9ucy4g IE90aGVyd2lzZSwgaXQncwogICogSW52YWxpZE9pZCwgYW5kIG90aGVyIGRkbF8qIGFyZ3Vt ZW50cyBhcmUgdW5kZWZpbmVkLgorICoKKyAqIFVwb24gcmV0dXJuaW5nIGZyb20gdGhpcyBm dW5jdGlvbiwgY2FsbGVycyBtdXN0IGFwcGx5CisgKiBFeHBhbmRWaXJ0dWFsR2VuZXJhdGVk Q29sdW1ucygpIHRvIGlpX0V4cHJlc3Npb25zRXhwYW5kCisgKiB3aGVuIG5lY2Vzc2FyeSBm b3IgYWN0dWFsIGV4cGFuc2lvbiBpZiBpaV9FeHByZXNzaW9uc0V4cGFuZAorICogaXMgbm90 IE5JTCBvciBkdW1teS4KICAqLwogc3RhdGljIHZvaWQKIENvbXB1dGVJbmRleEF0dHJzKFBh cnNlU3RhdGUgKnBzdGF0ZSwKQEAgLTIyNzQsNiArMjI2MiwxMCBAQCBDb21wdXRlSW5kZXhB dHRycyhQYXJzZVN0YXRlICpwc3RhdGUsCiAKIAkJYXR0bisrOwogCX0KKworCWluZGV4SW5m by0+aWlfRXhwcmVzc2lvbnNFeHBhbmQgPQorCQkoTGlzdCAqKUV4cGFuZFZpcnR1YWxHZW5l cmF0ZWRDb2x1bW5zKChOb2RlICopY29weU9iamVjdChpbmRleEluZm8tPmlpX0V4cHJlc3Np b25zKSwKKwkJCQkJCQkJCQkJICBOVUxMLCByZWxJZCk7CiB9CiAKIC8qCmRpZmYgLS1naXQg YS9zcmMvYmFja2VuZC9leGVjdXRvci9leGVjSW5kZXhpbmcuYyBiL3NyYy9iYWNrZW5kL2V4 ZWN1dG9yL2V4ZWNJbmRleGluZy5jCmluZGV4IGViMzgzODEyLi5iNDdkYWFmNSAxMDA2NDQK LS0tIGEvc3JjL2JhY2tlbmQvZXhlY3V0b3IvZXhlY0luZGV4aW5nLmMKKysrIGIvc3JjL2Jh Y2tlbmQvZXhlY3V0b3IvZXhlY0luZGV4aW5nLmMKQEAgLTM4MCwyMCArMzgwLDI0IEBAIEV4 ZWNJbnNlcnRJbmRleFR1cGxlcyhSZXN1bHRSZWxJbmZvICpyZXN1bHRSZWxJbmZvLAogCQlp ZiAoaW5kZXhJbmZvLT5paV9QcmVkaWNhdGUgIT0gTklMKQogCQl7CiAJCQlFeHByU3RhdGUg ICpwcmVkaWNhdGU7CisJCQlFeHByU3RhdGUgICpwcmVkaWNhdGVFeHBhbmQ7CiAKIAkJCS8q CiAJCQkgKiBJZiBwcmVkaWNhdGUgc3RhdGUgbm90IHNldCB1cCB5ZXQsIGNyZWF0ZSBpdCAo aW4gdGhlIGVzdGF0ZSdzCiAJCQkgKiBwZXItcXVlcnkgY29udGV4dCkKIAkJCSAqLwogCQkJ cHJlZGljYXRlID0gaW5kZXhJbmZvLT5paV9QcmVkaWNhdGVTdGF0ZTsKKwkJCXByZWRpY2F0 ZUV4cGFuZCA9IGluZGV4SW5mby0+aWlfUHJlZGljYXRlRXhwYW5kU3RhdGU7CiAJCQlpZiAo cHJlZGljYXRlID09IE5VTEwpCiAJCQl7CiAJCQkJcHJlZGljYXRlID0gRXhlY1ByZXBhcmVR dWFsKGluZGV4SW5mby0+aWlfUHJlZGljYXRlLCBlc3RhdGUpOworCQkJCXByZWRpY2F0ZUV4 cGFuZCA9IEV4ZWNQcmVwYXJlUXVhbChpbmRleEluZm8tPmlpX1ByZWRpY2F0ZUV4cGFuZCwg ZXN0YXRlKTsKIAkJCQlpbmRleEluZm8tPmlpX1ByZWRpY2F0ZVN0YXRlID0gcHJlZGljYXRl OworCQkJCWluZGV4SW5mby0+aWlfUHJlZGljYXRlRXhwYW5kU3RhdGUgPSBwcmVkaWNhdGVF eHBhbmQ7CiAJCQl9CiAKIAkJCS8qIFNraXAgdGhpcyBpbmRleC11cGRhdGUgaWYgdGhlIHBy ZWRpY2F0ZSBpc24ndCBzYXRpc2ZpZWQgKi8KLQkJCWlmICghRXhlY1F1YWwocHJlZGljYXRl LCBlY29udGV4dCkpCisJCQlpZiAoIUV4ZWNRdWFsKHByZWRpY2F0ZUV4cGFuZCwgZWNvbnRl eHQpKQogCQkJCWNvbnRpbnVlOwogCQl9CiAKQEAgLTYxNiwyMCArNjIwLDI0IEBAIEV4ZWND aGVja0luZGV4Q29uc3RyYWludHMoUmVzdWx0UmVsSW5mbyAqcmVzdWx0UmVsSW5mbywgVHVw bGVUYWJsZVNsb3QgKnNsb3QsCiAJCWlmIChpbmRleEluZm8tPmlpX1ByZWRpY2F0ZSAhPSBO SUwpCiAJCXsKIAkJCUV4cHJTdGF0ZSAgKnByZWRpY2F0ZTsKKwkJCUV4cHJTdGF0ZSAgKnBy ZWRpY2F0ZUV4cGFuZDsKIAogCQkJLyoKIAkJCSAqIElmIHByZWRpY2F0ZSBzdGF0ZSBub3Qg c2V0IHVwIHlldCwgY3JlYXRlIGl0IChpbiB0aGUgZXN0YXRlJ3MKIAkJCSAqIHBlci1xdWVy eSBjb250ZXh0KQogCQkJICovCiAJCQlwcmVkaWNhdGUgPSBpbmRleEluZm8tPmlpX1ByZWRp Y2F0ZVN0YXRlOworCQkJcHJlZGljYXRlRXhwYW5kID0gaW5kZXhJbmZvLT5paV9QcmVkaWNh dGVFeHBhbmRTdGF0ZTsKIAkJCWlmIChwcmVkaWNhdGUgPT0gTlVMTCkKIAkJCXsKIAkJCQlw cmVkaWNhdGUgPSBFeGVjUHJlcGFyZVF1YWwoaW5kZXhJbmZvLT5paV9QcmVkaWNhdGUsIGVz dGF0ZSk7CisJCQkJcHJlZGljYXRlRXhwYW5kID0gRXhlY1ByZXBhcmVRdWFsKGluZGV4SW5m by0+aWlfUHJlZGljYXRlRXhwYW5kLCBlc3RhdGUpOwogCQkJCWluZGV4SW5mby0+aWlfUHJl ZGljYXRlU3RhdGUgPSBwcmVkaWNhdGU7CisJCQkJaW5kZXhJbmZvLT5paV9QcmVkaWNhdGVF eHBhbmRTdGF0ZSA9IHByZWRpY2F0ZUV4cGFuZDsKIAkJCX0KIAogCQkJLyogU2tpcCB0aGlz IGluZGV4LXVwZGF0ZSBpZiB0aGUgcHJlZGljYXRlIGlzbid0IHNhdGlzZmllZCAqLwotCQkJ aWYgKCFFeGVjUXVhbChwcmVkaWNhdGUsIGVjb250ZXh0KSkKKwkJCWlmICghRXhlY1F1YWwo cHJlZGljYXRlRXhwYW5kLCBlY29udGV4dCkpCiAJCQkJY29udGludWU7CiAJCX0KIApAQCAt MTEwMiw2ICsxMTEwLDcgQEAgaW5kZXhfdW5jaGFuZ2VkX2J5X3VwZGF0ZShSZXN1bHRSZWxJ bmZvICpyZXN1bHRSZWxJbmZvLCBFU3RhdGUgKmVzdGF0ZSwKIAkgKiBwYXNzIGhpbnQuCiAJ ICovCiAJaWR4RXhwcnMgPSBSZWxhdGlvbkdldEluZGV4RXhwcmVzc2lvbnMoaW5kZXhSZWxh dGlvbik7CisJaWR4RXhwcnMgPSBsaXN0X2NvbmNhdChpZHhFeHBycywgUmVsYXRpb25HZXRJ bmRleEV4cHJlc3Npb25zRXhwYW5kKGluZGV4UmVsYXRpb24pKTsKIAloYXNleHByZXNzaW9u ID0gaW5kZXhfZXhwcmVzc2lvbl9jaGFuZ2VkX3dhbGtlcigoTm9kZSAqKSBpZHhFeHBycywK IAkJCQkJCQkJCQkJCQlhbGxVcGRhdGVkQ29scyk7CiAJbGlzdF9mcmVlKGlkeEV4cHJzKTsK ZGlmZiAtLWdpdCBhL3NyYy9iYWNrZW5kL25vZGVzL21ha2VmdW5jcy5jIGIvc3JjL2JhY2tl bmQvbm9kZXMvbWFrZWZ1bmNzLmMKaW5kZXggNDBiMDk5NTguLjk0Njg5MWI5IDEwMDY0NAot LS0gYS9zcmMvYmFja2VuZC9ub2Rlcy9tYWtlZnVuY3MuYworKysgYi9zcmMvYmFja2VuZC9u b2Rlcy9tYWtlZnVuY3MuYwpAQCAtODI4LDcgKzgyOCwxMSBAQCBtYWtlX2FuZHNfaW1wbGlj aXQoRXhwciAqY2xhdXNlKQogCiAvKgogICogbWFrZUluZGV4SW5mbwotICoJICBjcmVhdGUg YW4gSW5kZXhJbmZvIG5vZGUKKyAqCSAgY3JlYXRlIGFuIEluZGV4SW5mbyBub2RlLiAgVXBv biByZXR1cm5pbmcgZnJvbSB0aGlzIGZ1bmN0aW9uLAorICogY2FsbGVycyBtdXN0IGFwcGx5 IEV4cGFuZFZpcnR1YWxHZW5lcmF0ZWRDb2x1bW5zKCkgCisgKiBvciBSZWxhdGlvbkdldElu ZGV4RXhwcmVzc2lvbnNFeHBhbmQgb3IgUmVsYXRpb25HZXRJbmRleFByZWRpY2F0ZUV4cGFu ZCgpIHRvCisgKiBpaV9FeHByZXNzaW9uc0V4cGFuZCBhbmQgaWlfUHJlZGljYXRlRXhwYW5k IGFzIG5lZWRlZCBmb3IgYWN0dWFsCisgKiBleHBhbnNpb24gd2hlbiB0aGV5IGFyZSBub3Qg TklMIG9yIGR1bW15LgogICovCiBJbmRleEluZm8gKgogbWFrZUluZGV4SW5mbyhpbnQgbnVt YXR0cnMsIGludCBudW1rZXlhdHRycywgT2lkIGFtb2lkLCBMaXN0ICpleHByZXNzaW9ucywK QEAgLTg1NiwxMSArODYwLDE1IEBAIG1ha2VJbmRleEluZm8oaW50IG51bWF0dHJzLCBpbnQg bnVta2V5YXR0cnMsIE9pZCBhbW9pZCwgTGlzdCAqZXhwcmVzc2lvbnMsCiAKIAkvKiBleHBy ZXNzaW9ucyAqLwogCW4tPmlpX0V4cHJlc3Npb25zID0gZXhwcmVzc2lvbnM7CisJbi0+aWlf RXhwcmVzc2lvbnNFeHBhbmQgPSBjb3B5T2JqZWN0KGV4cHJlc3Npb25zKTsKIAluLT5paV9F eHByZXNzaW9uc1N0YXRlID0gTklMOworCW4tPmlpX0V4cHJlc3Npb25zRXhwYW5kU3RhdGUg PSBOSUw7CiAKIAkvKiBwcmVkaWNhdGVzICAqLwogCW4tPmlpX1ByZWRpY2F0ZSA9IHByZWRp Y2F0ZXM7CisJbi0+aWlfUHJlZGljYXRlRXhwYW5kID0gY29weU9iamVjdChwcmVkaWNhdGVz KTsKIAluLT5paV9QcmVkaWNhdGVTdGF0ZSA9IE5VTEw7CisJbi0+aWlfUHJlZGljYXRlRXhw YW5kU3RhdGUgPSBOVUxMOwogCiAJLyogZXhjbHVzaW9uIGNvbnN0cmFpbnRzICovCiAJbi0+ aWlfRXhjbHVzaW9uT3BzID0gTlVMTDsKZGlmZiAtLWdpdCBhL3NyYy9iYWNrZW5kL29wdGlt aXplci9wYXRoL2luZHhwYXRoLmMgYi9zcmMvYmFja2VuZC9vcHRpbWl6ZXIvcGF0aC9pbmR4 cGF0aC5jCmluZGV4IDNmNWQ0ZmEzLi5iNzE2ZWU5MiAxMDA2NDQKLS0tIGEvc3JjL2JhY2tl bmQvb3B0aW1pemVyL3BhdGgvaW5keHBhdGguYworKysgYi9zcmMvYmFja2VuZC9vcHRpbWl6 ZXIvcGF0aC9pbmR4cGF0aC5jCkBAIC0xMTE5LDcgKzExMTksNyBAQCBidWlsZF9wYXRoc19m b3JfT1IoUGxhbm5lckluZm8gKnJvb3QsIFJlbE9wdEluZm8gKnJlbCwKIAkJICoganVzdCBz Y2FubmluZyB0aGUgcHJlZE9LIGluZGV4IGFsb25lLCBubyBPUi4pCiAJCSAqLwogCQl1c2Vm dWxfcHJlZGljYXRlID0gZmFsc2U7Ci0JCWlmIChpbmRleC0+aW5kcHJlZCAhPSBOSUwpCisJ CWlmIChpbmRleC0+aW5kcHJlZEV4cGFuZCAhPSBOSUwpCiAJCXsKIAkJCWlmIChpbmRleC0+ cHJlZE9LKQogCQkJewpAQCAtMTEzMSwxMCArMTEzMSwxMCBAQCBidWlsZF9wYXRoc19mb3Jf T1IoUGxhbm5lckluZm8gKnJvb3QsIFJlbE9wdEluZm8gKnJlbCwKIAkJCQlpZiAoYWxsX2Ns YXVzZXMgPT0gTklMKQogCQkJCQlhbGxfY2xhdXNlcyA9IGxpc3RfY29uY2F0X2NvcHkoY2xh dXNlcywgb3RoZXJfY2xhdXNlcyk7CiAKLQkJCQlpZiAoIXByZWRpY2F0ZV9pbXBsaWVkX2J5 KGluZGV4LT5pbmRwcmVkLCBhbGxfY2xhdXNlcywgZmFsc2UpKQorCQkJCWlmICghcHJlZGlj YXRlX2ltcGxpZWRfYnkoaW5kZXgtPmluZHByZWRFeHBhbmQsIGFsbF9jbGF1c2VzLCBmYWxz ZSkpCiAJCQkJCWNvbnRpbnVlOwkvKiBjYW4ndCB1c2UgaXQgYXQgYWxsICovCiAKLQkJCQlp ZiAoIXByZWRpY2F0ZV9pbXBsaWVkX2J5KGluZGV4LT5pbmRwcmVkLCBvdGhlcl9jbGF1c2Vz LCBmYWxzZSkpCisJCQkJaWYgKCFwcmVkaWNhdGVfaW1wbGllZF9ieShpbmRleC0+aW5kcHJl ZEV4cGFuZCwgb3RoZXJfY2xhdXNlcywgZmFsc2UpKQogCQkJCQl1c2VmdWxfcHJlZGljYXRl ID0gdHJ1ZTsKIAkJCX0KIAkJfQpAQCAtMjE4Myw3ICsyMTgzLDcgQEAgZmluZF9pbmRleHBh dGhfcXVhbHMoUGF0aCAqYml0bWFwcXVhbCwgTGlzdCAqKnF1YWxzLCBMaXN0ICoqcHJlZHMp CiAKIAkJCSpxdWFscyA9IGxhcHBlbmQoKnF1YWxzLCBpY2xhdXNlLT5yaW5mby0+Y2xhdXNl KTsKIAkJfQotCQkqcHJlZHMgPSBsaXN0X2NvbmNhdCgqcHJlZHMsIGlwYXRoLT5pbmRleGlu Zm8tPmluZHByZWQpOworCQkqcHJlZHMgPSBsaXN0X2NvbmNhdCgqcHJlZHMsIGlwYXRoLT5p bmRleGluZm8tPmluZHByZWRFeHBhbmQpOwogCX0KIAllbHNlCiAJCWVsb2coRVJST1IsICJ1 bnJlY29nbml6ZWQgbm9kZSB0eXBlOiAlZCIsIG5vZGVUYWcoYml0bWFwcXVhbCkpOwpAQCAt NDAzOCwxMSArNDAzOCwxMSBAQCBjaGVja19pbmRleF9wcmVkaWNhdGVzKFBsYW5uZXJJbmZv ICpyb290LCBSZWxPcHRJbmZvICpyZWwpCiAJCUluZGV4T3B0SW5mbyAqaW5kZXggPSAoSW5k ZXhPcHRJbmZvICopIGxmaXJzdChsYyk7CiAJCUxpc3RDZWxsICAgKmxjcjsKIAotCQlpZiAo aW5kZXgtPmluZHByZWQgPT0gTklMKQorCQlpZiAoaW5kZXgtPmluZHByZWRFeHBhbmQgPT0g TklMKQogCQkJY29udGludWU7CQkJLyogaWdub3JlIG5vbi1wYXJ0aWFsIGluZGV4ZXMgaGVy ZSAqLwogCiAJCWlmICghaW5kZXgtPnByZWRPSykJCS8qIGRvbid0IHJlcGVhdCB3b3JrIGlm IGFscmVhZHkgcHJvdmVuIE9LICovCi0JCQlpbmRleC0+cHJlZE9LID0gcHJlZGljYXRlX2lt cGxpZWRfYnkoaW5kZXgtPmluZHByZWQsIGNsYXVzZWxpc3QsCisJCQlpbmRleC0+cHJlZE9L ID0gcHJlZGljYXRlX2ltcGxpZWRfYnkoaW5kZXgtPmluZHByZWRFeHBhbmQsIGNsYXVzZWxp c3QsCiAJCQkJCQkJCQkJCQkgZmFsc2UpOwogCiAJCS8qIElmIHJlbCBpcyBhbiB1cGRhdGUg dGFyZ2V0LCBsZWF2ZSBpbmRyZXN0cmljdGluZm8gYXMgc2V0IGFib3ZlICovCkBAIC00MDY4 LDcgKzQwNjgsNyBAQCBjaGVja19pbmRleF9wcmVkaWNhdGVzKFBsYW5uZXJJbmZvICpyb290 LCBSZWxPcHRJbmZvICpyZWwpCiAJCQkvKiBwcmVkaWNhdGVfaW1wbGllZF9ieSgpIGFzc3Vt ZXMgZmlyc3QgYXJnIGlzIGltbXV0YWJsZSAqLwogCQkJaWYgKGNvbnRhaW5fbXV0YWJsZV9m dW5jdGlvbnMoKE5vZGUgKikgcmluZm8tPmNsYXVzZSkgfHwKIAkJCQkhcHJlZGljYXRlX2lt cGxpZWRfYnkobGlzdF9tYWtlMShyaW5mby0+Y2xhdXNlKSwKLQkJCQkJCQkJCSAgaW5kZXgt PmluZHByZWQsIGZhbHNlKSkKKwkJCQkJCQkJCSAgaW5kZXgtPmluZHByZWRFeHBhbmQsIGZh bHNlKSkKIAkJCQlpbmRleC0+aW5kcmVzdHJpY3RpbmZvID0gbGFwcGVuZChpbmRleC0+aW5k cmVzdHJpY3RpbmZvLCByaW5mbyk7CiAJCX0KIAl9CkBAIC00NDAyLDE0ICs0NDAyLDE0IEBA IG1hdGNoX2luZGV4X3RvX29wZXJhbmQoTm9kZSAqb3BlcmFuZCwKIAkJaW50CQkJaTsKIAkJ Tm9kZQkgICAqaW5kZXhrZXk7CiAKLQkJaW5kZXhwcl9pdGVtID0gbGlzdF9oZWFkKGluZGV4 LT5pbmRleHBycyk7CisJCWluZGV4cHJfaXRlbSA9IGxpc3RfaGVhZChpbmRleC0+aW5kZXhw cnNFeHBhbmQpOwogCQlmb3IgKGkgPSAwOyBpIDwgaW5kZXhjb2w7IGkrKykKIAkJewogCQkJ aWYgKGluZGV4LT5pbmRleGtleXNbaV0gPT0gMCkKIAkJCXsKIAkJCQlpZiAoaW5kZXhwcl9p dGVtID09IE5VTEwpCiAJCQkJCWVsb2coRVJST1IsICJ3cm9uZyBudW1iZXIgb2YgaW5kZXgg ZXhwcmVzc2lvbnMiKTsKLQkJCQlpbmRleHByX2l0ZW0gPSBsbmV4dChpbmRleC0+aW5kZXhw cnMsIGluZGV4cHJfaXRlbSk7CisJCQkJaW5kZXhwcl9pdGVtID0gbG5leHQoaW5kZXgtPmlu ZGV4cHJzRXhwYW5kLCBpbmRleHByX2l0ZW0pOwogCQkJfQogCQl9CiAJCWlmIChpbmRleHBy X2l0ZW0gPT0gTlVMTCkKZGlmZiAtLWdpdCBhL3NyYy9iYWNrZW5kL29wdGltaXplci9wbGFu L2NyZWF0ZXBsYW4uYyBiL3NyYy9iYWNrZW5kL29wdGltaXplci9wbGFuL2NyZWF0ZXBsYW4u YwppbmRleCBkZTZhMTgzZC4uMmJkYWQ3YmQgMTAwNjQ0Ci0tLSBhL3NyYy9iYWNrZW5kL29w dGltaXplci9wbGFuL2NyZWF0ZXBsYW4uYworKysgYi9zcmMvYmFja2VuZC9vcHRpbWl6ZXIv cGxhbi9jcmVhdGVwbGFuLmMKQEAgLTMzNDAsNyArMzM0MCw3IEBAIGNyZWF0ZV9iaXRtYXBf c3VicGxhbihQbGFubmVySW5mbyAqcm9vdCwgUGF0aCAqYml0bWFwcXVhbCwKIAkJCQlzdWJp bmRleEVDcyA9IGxhcHBlbmQoc3ViaW5kZXhFQ3MsIHJpbmZvLT5wYXJlbnRfZWMpOwogCQl9 CiAJCS8qIFdlIGNhbiBhZGQgYW55IGluZGV4IHByZWRpY2F0ZSBjb25kaXRpb25zLCB0b28g Ki8KLQkJZm9yZWFjaChsLCBpcGF0aC0+aW5kZXhpbmZvLT5pbmRwcmVkKQorCQlmb3JlYWNo KGwsIGlwYXRoLT5pbmRleGluZm8tPmluZHByZWRFeHBhbmQpCiAJCXsKIAkJCUV4cHIJICAg KnByZWQgPSAoRXhwciAqKSBsZmlyc3QobCk7CiAKQEAgLTUxNDIsNyArNTE0Miw3IEBAIGZp eF9pbmRleHF1YWxfb3BlcmFuZChOb2RlICpub2RlLCBJbmRleE9wdEluZm8gKmluZGV4LCBp bnQgaW5kZXhjb2wpCiAJfQogCiAJLyogSXQncyBhbiBpbmRleCBleHByZXNzaW9uLCBzbyBm aW5kIGFuZCBjcm9zcy1jaGVjayB0aGUgZXhwcmVzc2lvbiAqLwotCWluZGV4cHJfaXRlbSA9 IGxpc3RfaGVhZChpbmRleC0+aW5kZXhwcnMpOworCWluZGV4cHJfaXRlbSA9IGxpc3RfaGVh ZChpbmRleC0+aW5kZXhwcnNFeHBhbmQpOwogCWZvciAocG9zID0gMDsgcG9zIDwgaW5kZXgt Pm5jb2x1bW5zOyBwb3MrKykKIAl7CiAJCWlmIChpbmRleC0+aW5kZXhrZXlzW3Bvc10gPT0g MCkKQEAgLTUxNjcsNyArNTE2Nyw3IEBAIGZpeF9pbmRleHF1YWxfb3BlcmFuZChOb2RlICpu b2RlLCBJbmRleE9wdEluZm8gKmluZGV4LCBpbnQgaW5kZXhjb2wpCiAJCQkJZWxzZQogCQkJ CQllbG9nKEVSUk9SLCAiaW5kZXgga2V5IGRvZXMgbm90IG1hdGNoIGV4cGVjdGVkIGluZGV4 IGNvbHVtbiIpOwogCQkJfQotCQkJaW5kZXhwcl9pdGVtID0gbG5leHQoaW5kZXgtPmluZGV4 cHJzLCBpbmRleHByX2l0ZW0pOworCQkJaW5kZXhwcl9pdGVtID0gbG5leHQoaW5kZXgtPmlu ZGV4cHJzRXhwYW5kLCBpbmRleHByX2l0ZW0pOwogCQl9CiAJfQogCmRpZmYgLS1naXQgYS9z cmMvYmFja2VuZC9vcHRpbWl6ZXIvdXRpbC9wbGFuY2F0LmMgYi9zcmMvYmFja2VuZC9vcHRp bWl6ZXIvdXRpbC9wbGFuY2F0LmMKaW5kZXggN2M0YmUxNzQuLjcyODQ2ZDllIDEwMDY0NAot LS0gYS9zcmMvYmFja2VuZC9vcHRpbWl6ZXIvdXRpbC9wbGFuY2F0LmMKKysrIGIvc3JjL2Jh Y2tlbmQvb3B0aW1pemVyL3V0aWwvcGxhbmNhdC5jCkBAIC00MzMsMjQgKzQzMywzOCBAQCBn ZXRfcmVsYXRpb25faW5mbyhQbGFubmVySW5mbyAqcm9vdCwgT2lkIHJlbGF0aW9uT2JqZWN0 SWQsIGJvb2wgaW5ocGFyZW50LAogCQkJICogcHJvcGVybHkgcmVkdWNlZC4KIAkJCSAqLwog CQkJaW5mby0+aW5kZXhwcnMgPSBSZWxhdGlvbkdldEluZGV4RXhwcmVzc2lvbnMoaW5kZXhS ZWxhdGlvbik7CisJCQlpbmZvLT5pbmRleHByc0V4cGFuZCA9IFJlbGF0aW9uR2V0SW5kZXhF eHByZXNzaW9uc0V4cGFuZChpbmRleFJlbGF0aW9uKTsKIAkJCWluZm8tPmluZHByZWQgPSBS ZWxhdGlvbkdldEluZGV4UHJlZGljYXRlKGluZGV4UmVsYXRpb24pOworCQkJaW5mby0+aW5k cHJlZEV4cGFuZCA9IFJlbGF0aW9uR2V0SW5kZXhQcmVkaWNhdGVFeHBhbmQoaW5kZXhSZWxh dGlvbik7CiAJCQlpZiAoaW5mby0+aW5kZXhwcnMpCiAJCQl7CiAJCQkJaWYgKHZhcm5vICE9 IDEpCisJCQkJewogCQkJCQlDaGFuZ2VWYXJOb2RlcygoTm9kZSAqKSBpbmZvLT5pbmRleHBy cywgMSwgdmFybm8sIDApOworCQkJCQlDaGFuZ2VWYXJOb2RlcygoTm9kZSAqKSBpbmZvLT5p bmRleHByc0V4cGFuZCwgMSwgdmFybm8sIDApOworCQkJCX0KIAogCQkJCWluZm8tPmluZGV4 cHJzID0gKExpc3QgKikKIAkJCQkJZXZhbF9jb25zdF9leHByZXNzaW9ucyhyb290LCAoTm9k ZSAqKSBpbmZvLT5pbmRleHBycyk7CisJCQkJaW5mby0+aW5kZXhwcnNFeHBhbmQgPSAoTGlz dCAqKQorCQkJCQlldmFsX2NvbnN0X2V4cHJlc3Npb25zKHJvb3QsIChOb2RlICopIGluZm8t PmluZGV4cHJzRXhwYW5kKTsKIAkJCX0KIAkJCWlmIChpbmZvLT5pbmRwcmVkKQogCQkJewog CQkJCWlmICh2YXJubyAhPSAxKQorCQkJCXsKIAkJCQkJQ2hhbmdlVmFyTm9kZXMoKE5vZGUg KikgaW5mby0+aW5kcHJlZCwgMSwgdmFybm8sIDApOworCQkJCQlDaGFuZ2VWYXJOb2Rlcygo Tm9kZSAqKSBpbmZvLT5pbmRwcmVkRXhwYW5kLCAxLCB2YXJubywgMCk7CisJCQkJfQogCiAJ CQkJaW5mby0+aW5kcHJlZCA9IChMaXN0ICopCiAJCQkJCWV2YWxfY29uc3RfZXhwcmVzc2lv bnMocm9vdCwKIAkJCQkJCQkJCQkgICAoTm9kZSAqKSBtYWtlX2FuZHNfZXhwbGljaXQoaW5m by0+aW5kcHJlZCkpOworCQkJCWluZm8tPmluZHByZWRFeHBhbmQgPSAoTGlzdCAqKQorCQkJ CQlldmFsX2NvbnN0X2V4cHJlc3Npb25zKHJvb3QsCisJCQkJCQkJCQkJICAgKE5vZGUgKikg bWFrZV9hbmRzX2V4cGxpY2l0KGluZm8tPmluZHByZWRFeHBhbmQpKTsKIAkJCQlpbmZvLT5p bmRwcmVkID0gbWFrZV9hbmRzX2ltcGxpY2l0KChFeHByICopIGluZm8tPmluZHByZWQpOwor CQkJCWluZm8tPmluZHByZWRFeHBhbmQgPSBtYWtlX2FuZHNfaW1wbGljaXQoKEV4cHIgKikg aW5mby0+aW5kcHJlZEV4cGFuZCk7CiAJCQl9CiAKIAkJCS8qIEJ1aWxkIHRhcmdldGxpc3Qg dXNpbmcgdGhlIGNvbXBsZXRlZCBpbmRleHBycyBkYXRhICovCkBAIC05NDEsOCArOTU1LDgg QEAgaW5mZXJfYXJiaXRlcl9pbmRleGVzKFBsYW5uZXJJbmZvICpyb290KQogCQkJCQkJCQkJ CSAgIGF0dG5vIC0gRmlyc3RMb3dJbnZhbGlkSGVhcEF0dHJpYnV0ZU51bWJlcik7CiAJCQkJ fQogCi0JCQkJaW5mZXJFbGVtcyA9IFJlbGF0aW9uR2V0SW5kZXhFeHByZXNzaW9ucyhpZHhS ZWwpOwotCQkJCWluZmVySW5kZXhFeHBycyA9IFJlbGF0aW9uR2V0SW5kZXhQcmVkaWNhdGUo aWR4UmVsKTsKKwkJCQlpbmZlckVsZW1zID0gUmVsYXRpb25HZXRJbmRleEV4cHJlc3Npb25z RXhwYW5kKGlkeFJlbCk7CisJCQkJaW5mZXJJbmRleEV4cHJzID0gUmVsYXRpb25HZXRJbmRl eFByZWRpY2F0ZUV4cGFuZChpZHhSZWwpOwogCQkJCWJyZWFrOwogCQkJfQogCQl9CkBAIC0x MDcyLDcgKzEwODYsNyBAQCBpbmZlcl9hcmJpdGVyX2luZGV4ZXMoUGxhbm5lckluZm8gKnJv b3QpCiAJCQljb250aW51ZTsKIAogCQkvKiBFeHByZXNzaW9uIGF0dHJpYnV0ZXMgKGlmIGFu eSkgbXVzdCBtYXRjaCAqLwotCQlpZHhFeHBycyA9IFJlbGF0aW9uR2V0SW5kZXhFeHByZXNz aW9ucyhpZHhSZWwpOworCQlpZHhFeHBycyA9IFJlbGF0aW9uR2V0SW5kZXhFeHByZXNzaW9u c0V4cGFuZChpZHhSZWwpOwogCQlpZiAoaWR4RXhwcnMpCiAJCXsKIAkJCWlmICh2YXJubyAh PSAxKQpAQCAtMTEzOSw3ICsxMTUzLDcgQEAgaW5mZXJfYXJiaXRlcl9pbmRleGVzKFBsYW5u ZXJJbmZvICpyb290KQogCQlpZiAobGlzdF9kaWZmZXJlbmNlKGlkeEV4cHJzLCBpbmZlckVs ZW1zKSAhPSBOSUwpCiAJCQljb250aW51ZTsKIAotCQlwcmVkRXhwcnMgPSBSZWxhdGlvbkdl dEluZGV4UHJlZGljYXRlKGlkeFJlbCk7CisJCXByZWRFeHBycyA9IFJlbGF0aW9uR2V0SW5k ZXhQcmVkaWNhdGVFeHBhbmQoaWR4UmVsKTsKIAkJaWYgKHByZWRFeHBycykKIAkJewogCQkJ aWYgKHZhcm5vICE9IDEpCmRpZmYgLS1naXQgYS9zcmMvYmFja2VuZC91dGlscy9hZHQvc2Vs ZnVuY3MuYyBiL3NyYy9iYWNrZW5kL3V0aWxzL2FkdC9zZWxmdW5jcy5jCmluZGV4IGQ2ZWZk MDcwLi45OGU3MjE2ZSAxMDA2NDQKLS0tIGEvc3JjL2JhY2tlbmQvdXRpbHMvYWR0L3NlbGZ1 bmNzLmMKKysrIGIvc3JjL2JhY2tlbmQvdXRpbHMvYWR0L3NlbGZ1bmNzLmMKQEAgLTc2Mzks MTAgKzc2MzksMTAgQEAgYWRkX3ByZWRpY2F0ZV90b19pbmRleF9xdWFscyhJbmRleE9wdElu Zm8gKmluZGV4LCBMaXN0ICppbmRleFF1YWxzKQogCUxpc3QJICAgKnByZWRFeHRyYVF1YWxz ID0gTklMOwogCUxpc3RDZWxsICAgKmxjOwogCi0JaWYgKGluZGV4LT5pbmRwcmVkID09IE5J TCkKKwlpZiAoaW5kZXgtPmluZHByZWRFeHBhbmQgPT0gTklMKQogCQlyZXR1cm4gaW5kZXhR dWFsczsKIAotCWZvcmVhY2gobGMsIGluZGV4LT5pbmRwcmVkKQorCWZvcmVhY2gobGMsIGlu ZGV4LT5pbmRwcmVkRXhwYW5kKQogCXsKIAkJTm9kZQkgICAqcHJlZFF1YWwgPSAoTm9kZSAq KSBsZmlyc3QobGMpOwogCQlMaXN0CSAgICpvbmVRdWFsID0gbGlzdF9tYWtlMShwcmVkUXVh bCk7CmRpZmYgLS1naXQgYS9zcmMvYmFja2VuZC91dGlscy9jYWNoZS9yZWxjYWNoZS5jIGIv c3JjL2JhY2tlbmQvdXRpbHMvY2FjaGUvcmVsY2FjaGUuYwppbmRleCAwNTcyYWI0Mi4uNWY4 ZjQwNGIgMTAwNjQ0Ci0tLSBhL3NyYy9iYWNrZW5kL3V0aWxzL2NhY2hlL3JlbGNhY2hlLmMK KysrIGIvc3JjL2JhY2tlbmQvdXRpbHMvY2FjaGUvcmVsY2FjaGUuYwpAQCAtOTEsNiArOTEs NyBAQAogI2luY2x1ZGUgInV0aWxzL3Jlc293bmVyLmgiCiAjaW5jbHVkZSAidXRpbHMvc25h cG1nci5oIgogI2luY2x1ZGUgInV0aWxzL3N5c2NhY2hlLmgiCisjaW5jbHVkZSAicmV3cml0 ZS9yZXdyaXRlSGFuZGxlci5oIgogCiAjZGVmaW5lIFJFTENBQ0hFX0lOSVRfRklMRU1BR0lD CQkweDU3MzI2NgkvKiB2ZXJzaW9uIElEIHZhbHVlICovCiAKQEAgLTE1ODMsNyArMTU4NCw5 IEBAIFJlbGF0aW9uSW5pdEluZGV4QWNjZXNzSW5mbyhSZWxhdGlvbiByZWxhdGlvbikKIAkg KiBleHByZXNzaW9ucywgcHJlZGljYXRlLCBleGNsdXNpb24gY2FjaGVzIHdpbGwgYmUgZmls bGVkIGxhdGVyCiAJICovCiAJcmVsYXRpb24tPnJkX2luZGV4cHJzID0gTklMOworCXJlbGF0 aW9uLT5yZF9pbmRleHByc0V4cGFuZCA9IE5JTDsKIAlyZWxhdGlvbi0+cmRfaW5kcHJlZCA9 IE5JTDsKKwlyZWxhdGlvbi0+cmRfaW5kcHJlZEV4cGFuZCA9IE5JTDsKIAlyZWxhdGlvbi0+ cmRfZXhjbG9wcyA9IE5VTEw7CiAJcmVsYXRpb24tPnJkX2V4Y2xwcm9jcyA9IE5VTEw7CiAJ cmVsYXRpb24tPnJkX2V4Y2xzdHJhdHMgPSBOVUxMOwpAQCAtNTE0Niw2ICs1MTQ5LDQ1IEBA IFJlbGF0aW9uR2V0SW5kZXhFeHByZXNzaW9ucyhSZWxhdGlvbiByZWxhdGlvbikKIAlyZXR1 cm4gcmVzdWx0OwogfQogCitMaXN0ICoKK1JlbGF0aW9uR2V0SW5kZXhFeHByZXNzaW9uc0V4 cGFuZChSZWxhdGlvbiByZWxhdGlvbikKK3sKKwlMaXN0CSAgICpyZXN1bHQ7CisJTWVtb3J5 Q29udGV4dCBvbGRjeHQ7CisJYm9vbAkJaXNudWxsOworCURhdHVtCQloZWFwUmVsaWREYXR1 bTsKKwlPaWQgICAgICAgICBoZWFwUmVsaWQ7CisKKwkvKiBRdWljayBleGl0IGlmIHdlIGFs cmVhZHkgY29tcHV0ZWQgdGhlIHJlc3VsdC4gKi8KKwlpZiAocmVsYXRpb24tPnJkX2luZGV4 cHJzRXhwYW5kKQorCQlyZXR1cm4gY29weU9iamVjdChyZWxhdGlvbi0+cmRfaW5kZXhwcnNF eHBhbmQpOworCisJLyogUXVpY2sgZXhpdCBpZiB0aGVyZSBpcyBub3RoaW5nIHRvIGRvLiAq LworCWlmIChyZWxhdGlvbi0+cmRfaW5kZXh0dXBsZSA9PSBOVUxMIHx8CisJCWhlYXBfYXR0 aXNudWxsKHJlbGF0aW9uLT5yZF9pbmRleHR1cGxlLCBBbnVtX3BnX2luZGV4X2luZGV4cHJz LCBOVUxMKSkKKwkJcmV0dXJuIE5JTDsKKworCXJlc3VsdCA9IFJlbGF0aW9uR2V0SW5kZXhF eHByZXNzaW9ucyhyZWxhdGlvbik7CisJaWYgKHJlc3VsdCA9PSBOSUwpCisJCXJldHVybiBO SUw7CisKKwloZWFwUmVsaWREYXR1bSA9IGhlYXBfZ2V0YXR0cihyZWxhdGlvbi0+cmRfaW5k ZXh0dXBsZSwKKwkJCQkJCQkgQW51bV9wZ19pbmRleF9pbmRyZWxpZCwKKwkJCQkJCQkgR2V0 UGdJbmRleERlc2NyaXB0b3IoKSwKKwkJCQkJCQkgJmlzbnVsbCk7CisJQXNzZXJ0KCFpc251 bGwpOworCWhlYXBSZWxpZCA9IERhdHVtR2V0T2JqZWN0SWQoaGVhcFJlbGlkRGF0dW0pOwor CisJcmVzdWx0ID0gKExpc3QgKilFeHBhbmRWaXJ0dWFsR2VuZXJhdGVkQ29sdW1ucygoTm9k ZSAqKSByZXN1bHQsIE5VTEwsIGhlYXBSZWxpZCk7CisKKwkvKiBOb3cgc2F2ZSBhIGNvcHkg b2YgdGhlIGNvbXBsZXRlZCB0cmVlIGluIHRoZSByZWxjYWNoZSBlbnRyeS4gKi8KKwlvbGRj eHQgPSBNZW1vcnlDb250ZXh0U3dpdGNoVG8ocmVsYXRpb24tPnJkX2luZGV4Y3h0KTsKKwly ZWxhdGlvbi0+cmRfaW5kZXhwcnNFeHBhbmQgPSBjb3B5T2JqZWN0KHJlc3VsdCk7CisJTWVt b3J5Q29udGV4dFN3aXRjaFRvKG9sZGN4dCk7CisKKwlyZXR1cm4gcmVzdWx0OworfQorCiAv KgogICogUmVsYXRpb25HZXREdW1teUluZGV4RXhwcmVzc2lvbnMgLS0gZ2V0IGR1bW15IGV4 cHJlc3Npb25zIGZvciBhbiBpbmRleAogICoKQEAgLTUyNjYsNiArNTMwOCw0NSBAQCBSZWxh dGlvbkdldEluZGV4UHJlZGljYXRlKFJlbGF0aW9uIHJlbGF0aW9uKQogCXJldHVybiByZXN1 bHQ7CiB9CiAKK0xpc3QgKgorUmVsYXRpb25HZXRJbmRleFByZWRpY2F0ZUV4cGFuZChSZWxh dGlvbiByZWxhdGlvbikKK3sKKwlMaXN0CSAgICpyZXN1bHQ7CisJTWVtb3J5Q29udGV4dCBv bGRjeHQ7CisJYm9vbAkJaXNudWxsOworCURhdHVtCQloZWFwUmVsaWREYXR1bTsKKwlPaWQg ICAgICAgICBoZWFwUmVsaWQ7CisKKwkvKiBRdWljayBleGl0IGlmIHdlIGFscmVhZHkgY29t cHV0ZWQgdGhlIHJlc3VsdC4gKi8KKwlpZiAocmVsYXRpb24tPnJkX2luZHByZWRFeHBhbmQp CisJCXJldHVybiBjb3B5T2JqZWN0KHJlbGF0aW9uLT5yZF9pbmRwcmVkRXhwYW5kKTsKKwor CS8qIFF1aWNrIGV4aXQgaWYgdGhlcmUgaXMgbm90aGluZyB0byBkby4gKi8KKwlpZiAocmVs YXRpb24tPnJkX2luZGV4dHVwbGUgPT0gTlVMTCB8fAorCQloZWFwX2F0dGlzbnVsbChyZWxh dGlvbi0+cmRfaW5kZXh0dXBsZSwgQW51bV9wZ19pbmRleF9pbmRwcmVkLCBOVUxMKSkKKwkJ cmV0dXJuIE5JTDsKKworCXJlc3VsdCA9IFJlbGF0aW9uR2V0SW5kZXhQcmVkaWNhdGUocmVs YXRpb24pOworCWlmIChyZXN1bHQgPT0gTklMKQorCQlyZXR1cm4gTklMOworCisJaGVhcFJl bGlkRGF0dW0gPSBoZWFwX2dldGF0dHIocmVsYXRpb24tPnJkX2luZGV4dHVwbGUsCisJCQkJ CQkJIEFudW1fcGdfaW5kZXhfaW5kcmVsaWQsCisJCQkJCQkJIEdldFBnSW5kZXhEZXNjcmlw dG9yKCksCisJCQkJCQkJICZpc251bGwpOworCUFzc2VydCghaXNudWxsKTsKKwloZWFwUmVs aWQgPSBEYXR1bUdldE9iamVjdElkKGhlYXBSZWxpZERhdHVtKTsKKworCXJlc3VsdCA9IChM aXN0ICopRXhwYW5kVmlydHVhbEdlbmVyYXRlZENvbHVtbnMoKE5vZGUgKikgcmVzdWx0LCBO VUxMLCBoZWFwUmVsaWQpOworCisJLyogTm93IHNhdmUgYSBjb3B5IG9mIHRoZSBjb21wbGV0 ZWQgdHJlZSBpbiB0aGUgcmVsY2FjaGUgZW50cnkuICovCisJb2xkY3h0ID0gTWVtb3J5Q29u dGV4dFN3aXRjaFRvKHJlbGF0aW9uLT5yZF9pbmRleGN4dCk7CisJcmVsYXRpb24tPnJkX2lu ZHByZWRFeHBhbmQgPSBjb3B5T2JqZWN0KHJlc3VsdCk7CisJTWVtb3J5Q29udGV4dFN3aXRj aFRvKG9sZGN4dCk7CisKKwlyZXR1cm4gcmVzdWx0OworfQorCiAvKgogICogUmVsYXRpb25H ZXRJbmRleEF0dHJCaXRtYXAgLS0gZ2V0IGEgYml0bWFwIG9mIGluZGV4IGF0dHJpYnV0ZSBu dW1iZXJzCiAgKgpAQCAtNjQ5MCw3ICs2NTcxLDkgQEAgbG9hZF9yZWxjYWNoZV9pbml0X2Zp bGUoYm9vbCBzaGFyZWQpCiAJCXJlbC0+cmRfcGFydGNoZWNrdmFsaWQgPSBmYWxzZTsKIAkJ cmVsLT5yZF9wYXJ0Y2hlY2tjeHQgPSBOVUxMOwogCQlyZWwtPnJkX2luZGV4cHJzID0gTklM OworCQlyZWwtPnJkX2luZGV4cHJzRXhwYW5kID0gTklMOwogCQlyZWwtPnJkX2luZHByZWQg PSBOSUw7CisJCXJlbC0+cmRfaW5kcHJlZEV4cGFuZCA9IE5JTDsKIAkJcmVsLT5yZF9leGNs b3BzID0gTlVMTDsKIAkJcmVsLT5yZF9leGNscHJvY3MgPSBOVUxMOwogCQlyZWwtPnJkX2V4 Y2xzdHJhdHMgPSBOVUxMOwpAQCAtNzAxOSwzICs3MTAyLDQ2IEBAIFJlc093bmVyUmVsZWFz ZVJlbGF0aW9uKERhdHVtIHJlcykKIAogCVJlbGF0aW9uQ2xvc2VDbGVhbnVwKChSZWxhdGlv bikgRGF0dW1HZXRQb2ludGVyKHJlcykpOwogfQorCitOb2RlICoKK0V4cGFuZFZpcnR1YWxH ZW5lcmF0ZWRDb2x1bW5zKE5vZGUgKm5vZGUsIFJlbGF0aW9uIGhlYXBSZWxhdGlvbiwgT2lk IGhlYXBSZWxJZCkKK3sKKwlib29sIAkJCQkgb3BlbmVkX3JlbGF0aW9uID0gZmFsc2U7CisJ VHVwbGVEZXNjCQkJIHR1cGRlc2M7CisKKwlpZiAobm9kZSA9PSBOVUxMIHx8IChoZWFwUmVs YXRpb24gPT0gTlVMTCAmJiBoZWFwUmVsSWQgPT0gSW52YWxpZE9pZCkpCisJCXJldHVybiBu b2RlOworCisJaWYgKGhlYXBSZWxhdGlvbiA9PSBOVUxMKQorCXsKKwkJaGVhcFJlbGF0aW9u ID0gdGFibGVfb3BlbihoZWFwUmVsSWQsIE5vTG9jayk7CisJCW9wZW5lZF9yZWxhdGlvbiA9 IHRydWU7CisJfQorCisJdHVwZGVzYyA9IFJlbGF0aW9uR2V0RGVzY3IoaGVhcFJlbGF0aW9u KTsKKwlpZiAoKHR1cGRlc2MtPmNvbnN0ciAmJiB0dXBkZXNjLT5jb25zdHItPmhhc19nZW5l cmF0ZWRfdmlydHVhbCkpCisJeworCQlpbnQJCQkJIGo7CisJCUJpdG1hcHNldAkJKmluZGV4 YXR0cnMgPSBOVUxMOworCisJCXB1bGxfdmFyYXR0bm9zKG5vZGUsIDEsICZpbmRleGF0dHJz KTsKKworCQlqID0gLTE7CisJCXdoaWxlICgoaiA9IGJtc19uZXh0X21lbWJlcihpbmRleGF0 dHJzLCBqKSkgPj0gMCkKKwkJeworCQkJQXR0ck51bWJlcglhdHRubyA9IGogKyBGaXJzdExv d0ludmFsaWRIZWFwQXR0cmlidXRlTnVtYmVyOworCisJCQlpZiAoYXR0bm8gPiAwICYmCisJ CQkJVHVwbGVEZXNjQXR0cih0dXBkZXNjLCBhdHRubyAtIDEpLT5hdHRnZW5lcmF0ZWQgPT0g QVRUUklCVVRFX0dFTkVSQVRFRF9WSVJUVUFMKQorCQkJeworCQkJCW5vZGUgPSBleHBhbmRf Z2VuZXJhdGVkX2NvbHVtbnNfaW5fZXhwcihub2RlLCBoZWFwUmVsYXRpb24sIDEpOworCQkJ CWJyZWFrOworCQkJfQorCQl9CisJfQorCisJaWYgKG9wZW5lZF9yZWxhdGlvbikKKwkJdGFi bGVfY2xvc2UoaGVhcFJlbGF0aW9uLCBOb0xvY2spOworCisJcmV0dXJuIG5vZGU7Cit9CmRp ZmYgLS1naXQgYS9zcmMvaW5jbHVkZS9ub2Rlcy9leGVjbm9kZXMuaCBiL3NyYy9pbmNsdWRl L25vZGVzL2V4ZWNub2Rlcy5oCmluZGV4IDUzYzEzODMxLi4yMGEyZTYxOCAxMDA2NDQKLS0t IGEvc3JjL2luY2x1ZGUvbm9kZXMvZXhlY25vZGVzLmgKKysrIGIvc3JjL2luY2x1ZGUvbm9k ZXMvZXhlY25vZGVzLmgKQEAgLTE5MCwxMyArMTkwLDE3IEBAIHR5cGVkZWYgc3RydWN0IElu ZGV4SW5mbwogCiAJLyogZXhwciB0cmVlcyBmb3IgZXhwcmVzc2lvbiBlbnRyaWVzLCBvciBO SUwgaWYgbm9uZSAqLwogCUxpc3QJICAgKmlpX0V4cHJlc3Npb25zOyAvKiBsaXN0IG9mIEV4 cHIgKi8KKwlMaXN0CSAgICppaV9FeHByZXNzaW9uc0V4cGFuZDsgCS8qIGxpc3Qgb2YgRXhw ciAqLwogCS8qIGV4ZWMgc3RhdGUgZm9yIGV4cHJlc3Npb25zLCBvciBOSUwgaWYgbm9uZSAq LwogCUxpc3QJICAgKmlpX0V4cHJlc3Npb25zU3RhdGU7CS8qIGxpc3Qgb2YgRXhwclN0YXRl ICovCisJTGlzdAkgICAqaWlfRXhwcmVzc2lvbnNFeHBhbmRTdGF0ZTsJLyogbGlzdCBvZiBF eHByU3RhdGUgKi8KIAogCS8qIHBhcnRpYWwtaW5kZXggcHJlZGljYXRlLCBvciBOSUwgaWYg bm9uZSAqLwogCUxpc3QJICAgKmlpX1ByZWRpY2F0ZTsJLyogbGlzdCBvZiBFeHByICovCisJ TGlzdAkgICAqaWlfUHJlZGljYXRlRXhwYW5kOwkJLyogbGlzdCBvZiBFeHByICovCiAJLyog ZXhlYyBzdGF0ZSBmb3IgZXhwcmVzc2lvbnMsIG9yIE5JTCBpZiBub25lICovCiAJRXhwclN0 YXRlICAqaWlfUHJlZGljYXRlU3RhdGU7CisJRXhwclN0YXRlICAqaWlfUHJlZGljYXRlRXhw YW5kU3RhdGU7CiAKIAkvKiBQZXItY29sdW1uIGV4Y2x1c2lvbiBvcGVyYXRvcnMsIG9yIE5V TEwgaWYgbm9uZSAqLwogCU9pZAkJICAgKmlpX0V4Y2x1c2lvbk9wczsJLyogYXJyYXkgd2l0 aCBvbmUgZW50cnkgcGVyIGNvbHVtbiAqLwpkaWZmIC0tZ2l0IGEvc3JjL2luY2x1ZGUvbm9k ZXMvcGF0aG5vZGVzLmggYi9zcmMvaW5jbHVkZS9ub2Rlcy9wYXRobm9kZXMuaAppbmRleCAy N2EyYzY4MS4uOWM2NWUxMjMgMTAwNjQ0Ci0tLSBhL3NyYy9pbmNsdWRlL25vZGVzL3BhdGhu b2Rlcy5oCisrKyBiL3NyYy9pbmNsdWRlL25vZGVzL3BhdGhub2Rlcy5oCkBAIC0xNDAzLDgg KzE0MDMsMTAgQEAgdHlwZWRlZiBzdHJ1Y3QgSW5kZXhPcHRJbmZvCiAJICogcHJpbnQgaW5k ZXh0bGlzdAogCSAqLwogCUxpc3QJICAgKmluZGV4cHJzIHBnX25vZGVfYXR0cihyZWFkX3dy aXRlX2lnbm9yZSk7CisJTGlzdAkgICAqaW5kZXhwcnNFeHBhbmQgcGdfbm9kZV9hdHRyKHJl YWRfd3JpdGVfaWdub3JlKTsKIAkvKiBwcmVkaWNhdGUgaWYgYSBwYXJ0aWFsIGluZGV4LCBl bHNlIE5JTCAqLwogCUxpc3QJICAgKmluZHByZWQ7CisJTGlzdAkgICAqaW5kcHJlZEV4cGFu ZDsKIAogCS8qIHRhcmdldGxpc3QgcmVwcmVzZW50aW5nIGluZGV4IGNvbHVtbnMgKi8KIAlM aXN0CSAgICppbmRleHRsaXN0OwpkaWZmIC0tZ2l0IGEvc3JjL2luY2x1ZGUvdXRpbHMvcmVs LmggYi9zcmMvaW5jbHVkZS91dGlscy9yZWwuaAppbmRleCBmYTA3ZWJmOC4uN2JkMDFiMzYg MTAwNjQ0Ci0tLSBhL3NyYy9pbmNsdWRlL3V0aWxzL3JlbC5oCisrKyBiL3NyYy9pbmNsdWRl L3V0aWxzL3JlbC5oCkBAIC0yMTAsNyArMjEwLDkgQEAgdHlwZWRlZiBzdHJ1Y3QgUmVsYXRp b25EYXRhCiAJc3RydWN0IEZtZ3JJbmZvICpyZF9zdXBwb3J0aW5mbzsJLyogbG9va3VwIGlu Zm8gZm9yIHN1cHBvcnQgcHJvY2VkdXJlcyAqLwogCWludDE2CSAgICpyZF9pbmRvcHRpb247 CS8qIHBlci1jb2x1bW4gQU0tc3BlY2lmaWMgZmxhZ3MgKi8KIAlMaXN0CSAgICpyZF9pbmRl eHByczsJLyogaW5kZXggZXhwcmVzc2lvbiB0cmVlcywgaWYgYW55ICovCisJTGlzdAkgICAq cmRfaW5kZXhwcnNFeHBhbmQ7CS8qIGV4cGFuZGVkIGluZGV4IGV4cHJlc3Npb24gdHJlZXMs IGlmIGFueSAqLwogCUxpc3QJICAgKnJkX2luZHByZWQ7CQkvKiBpbmRleCBwcmVkaWNhdGUg dHJlZSwgaWYgYW55ICovCisJTGlzdAkgICAqcmRfaW5kcHJlZEV4cGFuZDsJCS8qIGV4cGFu ZGVkIGluZGV4IHByZWRpY2F0ZSB0cmVlLCBpZiBhbnkgKi8KIAlPaWQJCSAgICpyZF9leGNs b3BzOwkJLyogT0lEcyBvZiBleGNsdXNpb24gb3BlcmF0b3JzLCBpZiBhbnkgKi8KIAlPaWQJ CSAgICpyZF9leGNscHJvY3M7CS8qIE9JRHMgb2YgZXhjbHVzaW9uIG9wcycgcHJvY3MsIGlm IGFueSAqLwogCXVpbnQxNgkgICAqcmRfZXhjbHN0cmF0czsJLyogZXhjbHVzaW9uIG9wcycg c3RyYXRlZ3kgbnVtYmVycywgaWYgYW55ICovCmRpZmYgLS1naXQgYS9zcmMvaW5jbHVkZS91 dGlscy9yZWxjYWNoZS5oIGIvc3JjL2luY2x1ZGUvdXRpbHMvcmVsY2FjaGUuaAppbmRleCA4 OWMyN2FhMS4uNmRkOTZmYzIgMTAwNjQ0Ci0tLSBhL3NyYy9pbmNsdWRlL3V0aWxzL3JlbGNh Y2hlLmgKKysrIGIvc3JjL2luY2x1ZGUvdXRpbHMvcmVsY2FjaGUuaApAQCAtNTgsOCArNTgs MTAgQEAgZXh0ZXJuIExpc3QgKlJlbGF0aW9uR2V0U3RhdEV4dExpc3QoUmVsYXRpb24gcmVs YXRpb24pOwogZXh0ZXJuIE9pZAlSZWxhdGlvbkdldFByaW1hcnlLZXlJbmRleChSZWxhdGlv biByZWxhdGlvbiwgYm9vbCBkZWZlcnJhYmxlX29rKTsKIGV4dGVybiBPaWQJUmVsYXRpb25H ZXRSZXBsaWNhSW5kZXgoUmVsYXRpb24gcmVsYXRpb24pOwogZXh0ZXJuIExpc3QgKlJlbGF0 aW9uR2V0SW5kZXhFeHByZXNzaW9ucyhSZWxhdGlvbiByZWxhdGlvbik7CitleHRlcm4gTGlz dCAqUmVsYXRpb25HZXRJbmRleEV4cHJlc3Npb25zRXhwYW5kKFJlbGF0aW9uIHJlbGF0aW9u KTsKIGV4dGVybiBMaXN0ICpSZWxhdGlvbkdldER1bW15SW5kZXhFeHByZXNzaW9ucyhSZWxh dGlvbiByZWxhdGlvbik7CiBleHRlcm4gTGlzdCAqUmVsYXRpb25HZXRJbmRleFByZWRpY2F0 ZShSZWxhdGlvbiByZWxhdGlvbik7CitleHRlcm4gTGlzdCAqUmVsYXRpb25HZXRJbmRleFBy ZWRpY2F0ZUV4cGFuZChSZWxhdGlvbiByZWxhdGlvbik7CiBleHRlcm4gYnl0ZWEgKipSZWxh dGlvbkdldEluZGV4QXR0T3B0aW9ucyhSZWxhdGlvbiByZWxhdGlvbiwgYm9vbCBjb3B5KTsK IAogLyoKQEAgLTE2MSw0ICsxNjMsNiBAQCBleHRlcm4gUEdETExJTVBPUlQgYm9vbCBjcml0 aWNhbFJlbGNhY2hlc0J1aWx0OwogLyogc2hvdWxkIGJlIHVzZWQgb25seSBieSByZWxjYWNo ZS5jIGFuZCBwb3N0aW5pdC5jICovCiBleHRlcm4gUEdETExJTVBPUlQgYm9vbCBjcml0aWNh bFNoYXJlZFJlbGNhY2hlc0J1aWx0OwogCitleHRlcm4gTm9kZSAqRXhwYW5kVmlydHVhbEdl bmVyYXRlZENvbHVtbnMoTm9kZSAqbm9kZSwgUmVsYXRpb24gaGVhcFJlbGF0aW9uLCBPaWQg aGVhcFJlbElkKTsKKwogI2VuZGlmCQkJCQkJCS8qIFJFTENBQ0hFX0ggKi8K ------=_NextPart_6A49C9A9_E0657D40_6AAF3ADB Content-Type: application/octet-stream; charset="utf-8"; name="v2.source_files.tar" Content-Disposition: attachment; filename="v2.source_files.tar" Content-Transfer-Encoding: base64 Li9hbmFseXplLmMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAwMDA2NjQA MDAwMTc1MAAwMDAxNzUwADAwMDAwMjcyNTIwADE1MjIxNjc1MzcxADAxMTUzNQAgMAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB1c3RhciAgAHhtYW4A AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeG1hbgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICoKICog YW5hbHl6ZS5jCiAqCSAgdGhlIFBvc3RncmVzIHN0YXRpc3RpY3MgZ2VuZXJhdG9yCiAqCiAq IFBvcnRpb25zIENvcHlyaWdodCAoYykgMTk5Ni0yMDI2LCBQb3N0Z3JlU1FMIEdsb2JhbCBE ZXZlbG9wbWVudCBHcm91cAogKiBQb3J0aW9ucyBDb3B5cmlnaHQgKGMpIDE5OTQsIFJlZ2Vu dHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYQogKgogKgogKiBJREVOVElGSUNB VElPTgogKgkgIHNyYy9iYWNrZW5kL2NvbW1hbmRzL2FuYWx5emUuYwogKgogKi0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0KICovCiNpbmNsdWRlICJwb3N0Z3Jlcy5oIgoKI2luY2x1ZGUgPG1hdGgu aD4KCiNpbmNsdWRlICJhY2Nlc3MvZGV0b2FzdC5oIgojaW5jbHVkZSAiYWNjZXNzL2dlbmFt LmgiCiNpbmNsdWRlICJhY2Nlc3MvbXVsdGl4YWN0LmgiCiNpbmNsdWRlICJhY2Nlc3MvcmVs YXRpb24uaCIKI2luY2x1ZGUgImFjY2Vzcy90YWJsZS5oIgojaW5jbHVkZSAiYWNjZXNzL3Rh YmxlYW0uaCIKI2luY2x1ZGUgImFjY2Vzcy90cmFuc2FtLmgiCiNpbmNsdWRlICJhY2Nlc3Mv dHVwY29udmVydC5oIgojaW5jbHVkZSAiYWNjZXNzL3Zpc2liaWxpdHltYXAuaCIKI2luY2x1 ZGUgImFjY2Vzcy94YWN0LmgiCiNpbmNsdWRlICJjYXRhbG9nL2luZGV4LmgiCiNpbmNsdWRl ICJjYXRhbG9nL2luZGV4aW5nLmgiCiNpbmNsdWRlICJjYXRhbG9nL3BnX2luaGVyaXRzLmgi CiNpbmNsdWRlICJjb21tYW5kcy9wcm9ncmVzcy5oIgojaW5jbHVkZSAiY29tbWFuZHMvdGFi bGVjbWRzLmgiCiNpbmNsdWRlICJjb21tYW5kcy92YWN1dW0uaCIKI2luY2x1ZGUgImNvbW1v bi9wZ19wcm5nLmgiCiNpbmNsdWRlICJleGVjdXRvci9leGVjdXRvci5oIgojaW5jbHVkZSAi ZXhlY3V0b3IvaW5zdHJ1bWVudC5oIgojaW5jbHVkZSAiZm9yZWlnbi9mZHdhcGkuaCIKI2lu Y2x1ZGUgIm1pc2NhZG1pbi5oIgojaW5jbHVkZSAibm9kZXMvbm9kZUZ1bmNzLmgiCiNpbmNs dWRlICJwYXJzZXIvcGFyc2Vfb3Blci5oIgojaW5jbHVkZSAicGFyc2VyL3BhcnNlX3JlbGF0 aW9uLmgiCiNpbmNsdWRlICJwZ3N0YXQuaCIKI2luY2x1ZGUgInN0YXRpc3RpY3MvZXh0ZW5k ZWRfc3RhdHNfaW50ZXJuYWwuaCIKI2luY2x1ZGUgInN0YXRpc3RpY3Mvc3RhdGlzdGljcy5o IgojaW5jbHVkZSAic3RvcmFnZS9idWZtZ3IuaCIKI2luY2x1ZGUgInN0b3JhZ2UvcHJvY2Fy cmF5LmgiCiNpbmNsdWRlICJ1dGlscy9hdHRvcHRjYWNoZS5oIgojaW5jbHVkZSAidXRpbHMv ZGF0dW0uaCIKI2luY2x1ZGUgInV0aWxzL2d1Yy5oIgojaW5jbHVkZSAidXRpbHMvbHN5c2Nh Y2hlLmgiCiNpbmNsdWRlICJ1dGlscy9tZW11dGlscy5oIgojaW5jbHVkZSAidXRpbHMvcGdf cnVzYWdlLmgiCiNpbmNsdWRlICJ1dGlscy9zYW1wbGluZy5oIgojaW5jbHVkZSAidXRpbHMv c29ydHN1cHBvcnQuaCIKI2luY2x1ZGUgInV0aWxzL3N5c2NhY2hlLmgiCiNpbmNsdWRlICJ1 dGlscy90aW1lc3RhbXAuaCIKCgovKiBQZXItaW5kZXggZGF0YSBmb3IgQU5BTFlaRSAqLwp0 eXBlZGVmIHN0cnVjdCBBbmxJbmRleERhdGEKewoJSW5kZXhJbmZvICAqaW5kZXhJbmZvOwkJ LyogQnVpbGRJbmRleEluZm8gcmVzdWx0ICovCglkb3VibGUJCXR1cGxlRnJhY3Q7CQkvKiBm cmFjdGlvbiBvZiByb3dzIGZvciBwYXJ0aWFsIGluZGV4ICovCglWYWNBdHRyU3RhdHMgKip2 YWNhdHRyc3RhdHM7CS8qIGluZGV4IGF0dHJzIHRvIGFuYWx5emUgKi8KCWludAkJCWF0dHJf Y250Owp9IEFubEluZGV4RGF0YTsKCgovKiBEZWZhdWx0IHN0YXRpc3RpY3MgdGFyZ2V0IChH VUMgcGFyYW1ldGVyKSAqLwppbnQJCQlkZWZhdWx0X3N0YXRpc3RpY3NfdGFyZ2V0ID0gMTAw OwoKLyogQSBmZXcgdmFyaWFibGVzIHRoYXQgZG9uJ3Qgc2VlbSB3b3J0aCBwYXNzaW5nIGFy b3VuZCBhcyBwYXJhbWV0ZXJzICovCnN0YXRpYyBNZW1vcnlDb250ZXh0IGFubF9jb250ZXh0 ID0gTlVMTDsKc3RhdGljIEJ1ZmZlckFjY2Vzc1N0cmF0ZWd5IHZhY19zdHJhdGVneTsKCgpz dGF0aWMgdm9pZCBkb19hbmFseXplX3JlbChSZWxhdGlvbiBvbmVyZWwsCgkJCQkJCSAgIGNv bnN0IFZhY3V1bVBhcmFtcyAqcGFyYW1zLCBMaXN0ICp2YV9jb2xzLAoJCQkJCQkgICBBY3F1 aXJlU2FtcGxlUm93c0Z1bmMgYWNxdWlyZWZ1bmMsIEJsb2NrTnVtYmVyIHJlbHBhZ2VzLAoJ CQkJCQkgICBib29sIGluaCwgYm9vbCBpbl9vdXRlcl94YWN0LCBpbnQgZWxldmVsKTsKc3Rh dGljIHZvaWQgY29tcHV0ZV9pbmRleF9zdGF0cyhSZWxhdGlvbiBvbmVyZWwsIGRvdWJsZSB0 b3RhbHJvd3MsCgkJCQkJCQkJQW5sSW5kZXhEYXRhICppbmRleGRhdGEsIGludCBuaW5kZXhl cywKCQkJCQkJCQlIZWFwVHVwbGUgKnJvd3MsIGludCBudW1yb3dzLAoJCQkJCQkJCU1lbW9y eUNvbnRleHQgY29sX2NvbnRleHQpOwpzdGF0aWMgdm9pZCB2YWxpZGF0ZV92YV9jb2xzX2xp c3QoUmVsYXRpb24gb25lcmVsLCBMaXN0ICp2YV9jb2xzKTsKc3RhdGljIFZhY0F0dHJTdGF0 cyAqZXhhbWluZV9hdHRyaWJ1dGUoUmVsYXRpb24gb25lcmVsLCBpbnQgYXR0bnVtLAoJCQkJ CQkJCQkgICBOb2RlICppbmRleF9leHByKTsKc3RhdGljIGludAlhY3F1aXJlX3NhbXBsZV9y b3dzKFJlbGF0aW9uIG9uZXJlbCwgaW50IGVsZXZlbCwKCQkJCQkJCQlIZWFwVHVwbGUgKnJv d3MsIGludCB0YXJncm93cywKCQkJCQkJCQlkb3VibGUgKnRvdGFscm93cywgZG91YmxlICp0 b3RhbGRlYWRyb3dzKTsKc3RhdGljIGludAljb21wYXJlX3Jvd3MoY29uc3Qgdm9pZCAqYSwg Y29uc3Qgdm9pZCAqYiwgdm9pZCAqYXJnKTsKc3RhdGljIGludAlhY3F1aXJlX2luaGVyaXRl ZF9zYW1wbGVfcm93cyhSZWxhdGlvbiBvbmVyZWwsIGludCBlbGV2ZWwsCgkJCQkJCQkJCQkg IEhlYXBUdXBsZSAqcm93cywgaW50IHRhcmdyb3dzLAoJCQkJCQkJCQkJICBkb3VibGUgKnRv dGFscm93cywgZG91YmxlICp0b3RhbGRlYWRyb3dzKTsKc3RhdGljIHZvaWQgdXBkYXRlX2F0 dHN0YXRzKE9pZCByZWxpZCwgYm9vbCBpbmgsCgkJCQkJCQlpbnQgbmF0dHMsIFZhY0F0dHJT dGF0cyAqKnZhY2F0dHJzdGF0cyk7CnN0YXRpYyBEYXR1bSBzdGRfZmV0Y2hfZnVuYyhWYWNB dHRyU3RhdHNQIHN0YXRzLCBpbnQgcm93bnVtLCBib29sICppc051bGwpOwpzdGF0aWMgRGF0 dW0gaW5kX2ZldGNoX2Z1bmMoVmFjQXR0clN0YXRzUCBzdGF0cywgaW50IHJvd251bSwgYm9v bCAqaXNOdWxsKTsKCgovKgogKglhbmFseXplX3JlbCgpIC0tIGFuYWx5emUgb25lIHJlbGF0 aW9uCiAqCiAqIHJlbGlkIGlkZW50aWZpZXMgdGhlIHJlbGF0aW9uIHRvIGFuYWx5emUuICBJ ZiByZWxhdGlvbiBpcyBzdXBwbGllZCwgdXNlCiAqIHRoZSBuYW1lIHRoZXJlaW4gZm9yIHJl cG9ydGluZyBhbnkgZmFpbHVyZSB0byBvcGVuL2xvY2sgdGhlIHJlbDsgZG8gbm90CiAqIHVz ZSBpdCBvbmNlIHdlJ3ZlIHN1Y2Nlc3NmdWxseSBvcGVuZWQgdGhlIHJlbCwgc2luY2UgaXQg bWlnaHQgYmUgc3RhbGUuCiAqLwp2b2lkCmFuYWx5emVfcmVsKE9pZCByZWxpZCwgUmFuZ2VW YXIgKnJlbGF0aW9uLAoJCQljb25zdCBWYWN1dW1QYXJhbXMgKnBhcmFtcywgTGlzdCAqdmFf Y29scywgYm9vbCBpbl9vdXRlcl94YWN0LAoJCQlCdWZmZXJBY2Nlc3NTdHJhdGVneSBic3Ry YXRlZ3kpCnsKCVJlbGF0aW9uCW9uZXJlbDsKCWludAkJCWVsZXZlbDsKCUFjcXVpcmVTYW1w bGVSb3dzRnVuYyBhY3F1aXJlZnVuYyA9IE5VTEw7CglCbG9ja051bWJlciByZWxwYWdlcyA9 IDA7Cglib29sCQlzdGF0c19pbXBvcnRlZCA9IGZhbHNlOwoKCS8qIFNlbGVjdCBsb2dnaW5n IGxldmVsICovCglpZiAocGFyYW1zLT5vcHRpb25zICYgVkFDT1BUX1ZFUkJPU0UpCgkJZWxl dmVsID0gSU5GTzsKCWVsc2UKCQllbGV2ZWwgPSBERUJVRzI7CgoJLyogU2V0IHVwIHN0YXRp YyB2YXJpYWJsZXMgKi8KCXZhY19zdHJhdGVneSA9IGJzdHJhdGVneTsKCgkvKgoJICogQ2hl Y2sgZm9yIHVzZXItcmVxdWVzdGVkIGFib3J0LgoJICovCglDSEVDS19GT1JfSU5URVJSVVBU UygpOwoKCS8qCgkgKiBPcGVuIHRoZSByZWxhdGlvbiwgZ2V0dGluZyBTaGFyZVVwZGF0ZUV4 Y2x1c2l2ZUxvY2sgdG8gZW5zdXJlIHRoYXQgdHdvCgkgKiBBTkFMWVpFcyBkb24ndCBydW4g b24gaXQgY29uY3VycmVudGx5LiAgKFRoaXMgYWxzbyBsb2NrcyBvdXQgYQoJICogY29uY3Vy cmVudCBWQUNVVU0sIHdoaWNoIGRvZXNuJ3QgbWF0dGVyIG11Y2ggYXQgdGhlIG1vbWVudCBi dXQgbWlnaHQKCSAqIG1hdHRlciBpZiB3ZSBldmVyIHRyeSB0byBhY2N1bXVsYXRlIHN0YXRz IG9uIGRlYWQgdHVwbGVzLikgSWYgdGhlIHJlbAoJICogaGFzIGJlZW4gZHJvcHBlZCBzaW5j ZSB3ZSBsYXN0IHNhdyBpdCwgd2UgZG9uJ3QgbmVlZCB0byBwcm9jZXNzIGl0LgoJICoKCSAq IE1ha2Ugc3VyZSB0byBnZW5lcmF0ZSBvbmx5IGxvZ3MgZm9yIEFOQUxZWkUgaW4gdGhpcyBj YXNlLgoJICovCglvbmVyZWwgPSB2YWN1dW1fb3Blbl9yZWxhdGlvbihyZWxpZCwgcmVsYXRp b24sIHBhcmFtcy0+b3B0aW9ucyAmIH4oVkFDT1BUX1ZBQ1VVTSksCgkJCQkJCQkJICBwYXJh bXMtPmxvZ19hbmFseXplX21pbl9kdXJhdGlvbiA+PSAwLAoJCQkJCQkJCSAgU2hhcmVVcGRh dGVFeGNsdXNpdmVMb2NrKTsKCgkvKiBsZWF2ZSBpZiByZWxhdGlvbiBjb3VsZCBub3QgYmUg b3BlbmVkIG9yIGxvY2tlZCAqLwoJaWYgKCFvbmVyZWwpCgkJcmV0dXJuOwoKCS8qCgkgKiBD aGVjayBpZiByZWxhdGlvbiBuZWVkcyB0byBiZSBza2lwcGVkIGJhc2VkIG9uIHByaXZpbGVn ZXMuICBUaGlzIGNoZWNrCgkgKiBoYXBwZW5zIGFsc28gd2hlbiBidWlsZGluZyB0aGUgcmVs YXRpb24gbGlzdCB0byBhbmFseXplIGZvciBhIG1hbnVhbAoJICogb3BlcmF0aW9uLCBhbmQg bmVlZHMgdG8gYmUgZG9uZSBhZGRpdGlvbmFsbHkgaGVyZSBhcyBBTkFMWVpFIGNvdWxkCgkg KiBoYXBwZW4gYWNyb3NzIG11bHRpcGxlIHRyYW5zYWN0aW9ucyB3aGVyZSBwcml2aWxlZ2Vz IGNvdWxkIGhhdmUgY2hhbmdlZAoJICogaW4tYmV0d2Vlbi4gIE1ha2Ugc3VyZSB0byBnZW5l cmF0ZSBvbmx5IGxvZ3MgZm9yIEFOQUxZWkUgaW4gdGhpcyBjYXNlLgoJICovCglpZiAoIXZh Y3V1bV9pc19wZXJtaXR0ZWRfZm9yX3JlbGF0aW9uKFJlbGF0aW9uR2V0UmVsaWQob25lcmVs KSwKCQkJCQkJCQkJCSAgb25lcmVsLT5yZF9yZWwsCgkJCQkJCQkJCQkgIHBhcmFtcy0+b3B0 aW9ucyAmIH5WQUNPUFRfVkFDVVVNKSkKCXsKCQlyZWxhdGlvbl9jbG9zZShvbmVyZWwsIFNo YXJlVXBkYXRlRXhjbHVzaXZlTG9jayk7CgkJcmV0dXJuOwoJfQoKCS8qCgkgKiBTaWxlbnRs eSBpZ25vcmUgdGFibGVzIHRoYXQgYXJlIHRlbXAgdGFibGVzIG9mIG90aGVyIGJhY2tlbmRz IC0tLQoJICogdHJ5aW5nIHRvIGFuYWx5emUgdGhlc2UgaXMgcmF0aGVyIHBvaW50bGVzcywg c2luY2UgdGhlaXIgY29udGVudHMgYXJlCgkgKiBwcm9iYWJseSBub3QgdXAtdG8tZGF0ZSBv biBkaXNrLiAgKFdlIGRvbid0IHRocm93IGEgd2FybmluZyBoZXJlOyBpdAoJICogd291bGQg anVzdCBsZWFkIHRvIGNoYXR0ZXIgZHVyaW5nIGEgZGF0YWJhc2Utd2lkZSBBTkFMWVpFLikK CSAqLwoJaWYgKFJFTEFUSU9OX0lTX09USEVSX1RFTVAob25lcmVsKSkKCXsKCQlyZWxhdGlv bl9jbG9zZShvbmVyZWwsIFNoYXJlVXBkYXRlRXhjbHVzaXZlTG9jayk7CgkJcmV0dXJuOwoJ fQoKCS8qCgkgKiBXZSBjYW4gQU5BTFlaRSBhbnkgdGFibGUgZXhjZXB0IHBnX3N0YXRpc3Rp Yy4gU2VlIHVwZGF0ZV9hdHRzdGF0cwoJICovCglpZiAoUmVsYXRpb25HZXRSZWxpZChvbmVy ZWwpID09IFN0YXRpc3RpY1JlbGF0aW9uSWQpCgl7CgkJcmVsYXRpb25fY2xvc2Uob25lcmVs LCBTaGFyZVVwZGF0ZUV4Y2x1c2l2ZUxvY2spOwoJCXJldHVybjsKCX0KCgkvKgoJICogQ2hl Y2sgdGhlIGdpdmVuIGxpc3Qgb2YgY29sdW1ucwoJICovCglpZiAodmFfY29scyAhPSBOSUwp CgkJdmFsaWRhdGVfdmFfY29sc19saXN0KG9uZXJlbCwgdmFfY29scyk7CgoJLyoKCSAqIElu aXRpYWxpemUgcHJvZ3Jlc3MgcmVwb3J0aW5nIGJlZm9yZSBzZXR1cCBmb3IgcmVndWxhci9m b3JlaWduIHRhYmxlcy4KCSAqIChGb3IgdGhlIGZvcm1lciwgdGhlIHRpbWUgc3BlbnQgb24g aXQgd291bGQgYmUgbmVnbGlnaWJsZSwgYnV0IGZvciB0aGUKCSAqIGxhdHRlciwgaWYgRkRX cyBzdXBwb3J0IHN0YXRpc3RpY3MgaW1wb3J0IG9yIGFuYWx5c2lzLCB0aGV5J2QgZG8gc29t ZQoJICogd29yayB0aGF0IG5lZWRzIHRoZSByZW1vdGUgYWNjZXNzLCBzbyB0aGUgdGltZSBt aWdodCBiZQoJICogbm9uLW5lZ2xpZ2libGUuKQoJICovCglwZ3N0YXRfcHJvZ3Jlc3Nfc3Rh cnRfY29tbWFuZChQUk9HUkVTU19DT01NQU5EX0FOQUxZWkUsCgkJCQkJCQkJICBSZWxhdGlv bkdldFJlbGlkKG9uZXJlbCkpOwoJaWYgKEFtQXV0b1ZhY3V1bVdvcmtlclByb2Nlc3MoKSkK CQlwZ3N0YXRfcHJvZ3Jlc3NfdXBkYXRlX3BhcmFtKFBST0dSRVNTX0FOQUxZWkVfU1RBUlRF RF9CWSwKCQkJCQkJCQkJIFBST0dSRVNTX0FOQUxZWkVfU1RBUlRFRF9CWV9BVVRPVkFDVVVN KTsKCWVsc2UKCQlwZ3N0YXRfcHJvZ3Jlc3NfdXBkYXRlX3BhcmFtKFBST0dSRVNTX0FOQUxZ WkVfU1RBUlRFRF9CWSwKCQkJCQkJCQkJIFBST0dSRVNTX0FOQUxZWkVfU1RBUlRFRF9CWV9N QU5VQUwpOwoKCS8qCgkgKiBDaGVjayB0aGF0IGl0J3Mgb2YgYW4gYW5hbHl6YWJsZSByZWxr aW5kLCBhbmQgc2V0IHVwIGFwcHJvcHJpYXRlbHkuCgkgKi8KCWlmIChvbmVyZWwtPnJkX3Jl bC0+cmVsa2luZCA9PSBSRUxLSU5EX1JFTEFUSU9OIHx8CgkJb25lcmVsLT5yZF9yZWwtPnJl bGtpbmQgPT0gUkVMS0lORF9NQVRWSUVXKQoJewoJCS8qIFJlZ3VsYXIgdGFibGUsIHNvIHdl J2xsIHVzZSB0aGUgcmVndWxhciByb3cgYWNxdWlzaXRpb24gZnVuY3Rpb24gKi8KCQlhY3F1 aXJlZnVuYyA9IGFjcXVpcmVfc2FtcGxlX3Jvd3M7CgkJLyogQWxzbyBnZXQgcmVndWxhciB0 YWJsZSdzIHNpemUgKi8KCQlyZWxwYWdlcyA9IFJlbGF0aW9uR2V0TnVtYmVyT2ZCbG9ja3Mo b25lcmVsKTsKCX0KCWVsc2UgaWYgKG9uZXJlbC0+cmRfcmVsLT5yZWxraW5kID09IFJFTEtJ TkRfRk9SRUlHTl9UQUJMRSkKCXsKCQkvKgoJCSAqIEZvciBhIGZvcmVpZ24gdGFibGUsIGNh bGwgdGhlIEZEVydzIGhvb2sgZnVuY3Rpb25zIHRvIHNlZSB3aGV0aGVyCgkJICogaXQgc3Vw cG9ydHMgc3RhdGlzdGljcyBpbXBvcnQgb3IgYW5hbHlzaXMuCgkJICovCgkJRmR3Um91dGlu ZSAqZmR3cm91dGluZTsKCgkJZmR3cm91dGluZSA9IEdldEZkd1JvdXRpbmVGb3JSZWxhdGlv bihvbmVyZWwsIGZhbHNlKTsKCgkJaWYgKGZkd3JvdXRpbmUtPkltcG9ydEZvcmVpZ25TdGF0 aXN0aWNzICE9IE5VTEwgJiYKCQkJZmR3cm91dGluZS0+SW1wb3J0Rm9yZWlnblN0YXRpc3Rp Y3Mob25lcmVsLCB2YV9jb2xzLCBlbGV2ZWwpKQoJCQlzdGF0c19pbXBvcnRlZCA9IHRydWU7 CgkJZWxzZQoJCXsKCQkJYm9vbAkJb2sgPSBmYWxzZTsKCgkJCWlmIChmZHdyb3V0aW5lLT5B bmFseXplRm9yZWlnblRhYmxlICE9IE5VTEwpCgkJCQlvayA9IGZkd3JvdXRpbmUtPkFuYWx5 emVGb3JlaWduVGFibGUob25lcmVsLAoJCQkJCQkJCQkJCQkJICZhY3F1aXJlZnVuYywKCQkJ CQkJCQkJCQkJCSAmcmVscGFnZXMpOwoKCQkJaWYgKCFvaykKCQkJewoJCQkJZXJlcG9ydChX QVJOSU5HLAoJCQkJCQllcnJtc2coInNraXBwaW5nIFwiJXNcIiAtLSBjYW5ub3QgYW5hbHl6 ZSB0aGlzIGZvcmVpZ24gdGFibGUuIiwKCQkJCQkJCSAgIFJlbGF0aW9uR2V0UmVsYXRpb25O YW1lKG9uZXJlbCkpKTsKCQkJCXJlbGF0aW9uX2Nsb3NlKG9uZXJlbCwgU2hhcmVVcGRhdGVF eGNsdXNpdmVMb2NrKTsKCQkJCWdvdG8gb3V0OwoJCQl9CgkJfQoJfQoJZWxzZSBpZiAob25l cmVsLT5yZF9yZWwtPnJlbGtpbmQgPT0gUkVMS0lORF9QQVJUSVRJT05FRF9UQUJMRSkKCXsK CQkvKgoJCSAqIEZvciBwYXJ0aXRpb25lZCB0YWJsZXMsIHdlIHdhbnQgdG8gZG8gdGhlIHJl Y3Vyc2l2ZSBBTkFMWVpFIGJlbG93LgoJCSAqLwoJfQoJZWxzZQoJewoJCS8qIE5vIG5lZWQg Zm9yIGEgV0FSTklORyBpZiB3ZSBhbHJlYWR5IGNvbXBsYWluZWQgZHVyaW5nIFZBQ1VVTSAq LwoJCWlmICghKHBhcmFtcy0+b3B0aW9ucyAmIFZBQ09QVF9WQUNVVU0pKQoJCQllcmVwb3J0 KFdBUk5JTkcsCgkJCQkJKGVycm1zZygic2tpcHBpbmcgXCIlc1wiIC0tLSBjYW5ub3QgYW5h bHl6ZSBub24tdGFibGVzIG9yIHNwZWNpYWwgc3lzdGVtIHRhYmxlcyIsCgkJCQkJCQlSZWxh dGlvbkdldFJlbGF0aW9uTmFtZShvbmVyZWwpKSkpOwoJCXJlbGF0aW9uX2Nsb3NlKG9uZXJl bCwgU2hhcmVVcGRhdGVFeGNsdXNpdmVMb2NrKTsKCQlnb3RvIG91dDsKCX0KCgkvKgoJICog RG8gdGhlIG5vcm1hbCBub24tcmVjdXJzaXZlIEFOQUxZWkUuICBXZSBjYW4gc2tpcCB0aGlz IGZvciBwYXJ0aXRpb25lZAoJICogdGFibGVzLCB3aGljaCBkb24ndCBjb250YWluIGFueSBy b3dzLCBhbmQgZm9yZWlnbiB0YWJsZXMgdGhhdAoJICogc3VjY2Vzc2Z1bGx5IGltcG9ydGVk IHN0YXRpc3RpY3MuCgkgKi8KCWlmICgob25lcmVsLT5yZF9yZWwtPnJlbGtpbmQgIT0gUkVM S0lORF9QQVJUSVRJT05FRF9UQUJMRSkKCQkmJiAhc3RhdHNfaW1wb3J0ZWQpCgkJZG9fYW5h bHl6ZV9yZWwob25lcmVsLCBwYXJhbXMsIHZhX2NvbHMsIGFjcXVpcmVmdW5jLAoJCQkJCSAg IHJlbHBhZ2VzLCBmYWxzZSwgaW5fb3V0ZXJfeGFjdCwgZWxldmVsKTsKCgkvKgoJICogSWYg dGhlcmUgYXJlIGNoaWxkIHRhYmxlcywgZG8gcmVjdXJzaXZlIEFOQUxZWkUuCgkgKi8KCWlm IChvbmVyZWwtPnJkX3JlbC0+cmVsaGFzc3ViY2xhc3MpCgkJZG9fYW5hbHl6ZV9yZWwob25l cmVsLCBwYXJhbXMsIHZhX2NvbHMsIGFjcXVpcmVmdW5jLCByZWxwYWdlcywKCQkJCQkgICB0 cnVlLCBpbl9vdXRlcl94YWN0LCBlbGV2ZWwpOwoKCS8qCgkgKiBDbG9zZSBzb3VyY2UgcmVs YXRpb24gbm93LCBidXQga2VlcCBsb2NrIHNvIHRoYXQgbm8gb25lIGRlbGV0ZXMgaXQKCSAq IGJlZm9yZSB3ZSBjb21taXQuICAoSWYgc29tZW9uZSBkaWQsIHRoZXknZCBmYWlsIHRvIGNs ZWFuIHVwIHRoZSBlbnRyaWVzCgkgKiB3ZSBtYWRlIGluIHBnX3N0YXRpc3RpYy4gIEFsc28s IHJlbGVhc2luZyB0aGUgbG9jayBiZWZvcmUgY29tbWl0IHdvdWxkCgkgKiBleHBvc2UgdXMg dG8gY29uY3VycmVudC11cGRhdGUgZmFpbHVyZXMgaW4gdXBkYXRlX2F0dHN0YXRzLikKCSAq LwoJcmVsYXRpb25fY2xvc2Uob25lcmVsLCBOb0xvY2spOwoKb3V0OgoJcGdzdGF0X3Byb2dy ZXNzX2VuZF9jb21tYW5kKCk7Cn0KCi8qCiAqCWRvX2FuYWx5emVfcmVsKCkgLS0gYW5hbHl6 ZSBvbmUgcmVsYXRpb24sIHJlY3Vyc2l2ZWx5IG9yIG5vdAogKgogKiBOb3RlIHRoYXQgImFj cXVpcmVmdW5jIiBpcyBvbmx5IHJlbGV2YW50IGZvciB0aGUgbm9uLWluaGVyaXRlZCBjYXNl LgogKiBGb3IgdGhlIGluaGVyaXRlZCBjYXNlLCBhY3F1aXJlX2luaGVyaXRlZF9zYW1wbGVf cm93cygpIGRldGVybWluZXMgdGhlCiAqIGFwcHJvcHJpYXRlIGFjcXVpcmVmdW5jIGZvciBl YWNoIGNoaWxkIHRhYmxlLgogKi8Kc3RhdGljIHZvaWQKZG9fYW5hbHl6ZV9yZWwoUmVsYXRp b24gb25lcmVsLCBjb25zdCBWYWN1dW1QYXJhbXMgKnBhcmFtcywKCQkJICAgTGlzdCAqdmFf Y29scywgQWNxdWlyZVNhbXBsZVJvd3NGdW5jIGFjcXVpcmVmdW5jLAoJCQkgICBCbG9ja051 bWJlciByZWxwYWdlcywgYm9vbCBpbmgsIGJvb2wgaW5fb3V0ZXJfeGFjdCwKCQkJICAgaW50 IGVsZXZlbCkKewoJaW50CQkJYXR0cl9jbnQsCgkJCQl0Y250LAoJCQkJaSwKCQkJCWluZDsK CVJlbGF0aW9uICAgKklyZWw7CglpbnQJCQluaW5kZXhlczsKCWJvb2wJCXZlcmJvc2UsCgkJ CQlpbnN0cnVtZW50LAoJCQkJaGFzaW5kZXg7CglWYWNBdHRyU3RhdHMgKip2YWNhdHRyc3Rh dHM7CglBbmxJbmRleERhdGEgKmluZGV4ZGF0YTsKCWludAkJCXRhcmdyb3dzLAoJCQkJbnVt cm93cywKCQkJCW1pbnJvd3M7Cglkb3VibGUJCXRvdGFscm93cywKCQkJCXRvdGFsZGVhZHJv d3M7CglIZWFwVHVwbGUgICpyb3dzOwoJUEdSVXNhZ2UJcnUwOwoJVGltZXN0YW1wVHogc3Rh cnR0aW1lID0gMDsKCU1lbW9yeUNvbnRleHQgY2FsbGVyX2NvbnRleHQ7CglPaWQJCQlzYXZl X3VzZXJpZDsKCWludAkJCXNhdmVfc2VjX2NvbnRleHQ7CglpbnQJCQlzYXZlX25lc3RsZXZl bDsKCVdhbFVzYWdlCXN0YXJ0d2FsdXNhZ2UgPSBwZ1dhbFVzYWdlOwoJQnVmZmVyVXNhZ2Ug c3RhcnRidWZmZXJ1c2FnZSA9IHBnQnVmZmVyVXNhZ2U7CglCdWZmZXJVc2FnZSBidWZmZXJ1 c2FnZTsKCVBnU3RhdF9Db3VudGVyIHN0YXJ0cmVhZHRpbWUgPSAwOwoJUGdTdGF0X0NvdW50 ZXIgc3RhcnR3cml0ZXRpbWUgPSAwOwoKCXZlcmJvc2UgPSAocGFyYW1zLT5vcHRpb25zICYg VkFDT1BUX1ZFUkJPU0UpICE9IDA7CglpbnN0cnVtZW50ID0gKHZlcmJvc2UgfHwgKEFtQXV0 b1ZhY3V1bVdvcmtlclByb2Nlc3MoKSAmJgoJCQkJCQkJICBwYXJhbXMtPmxvZ19hbmFseXpl X21pbl9kdXJhdGlvbiA+PSAwKSk7CglpZiAoaW5oKQoJCWVyZXBvcnQoZWxldmVsLAoJCQkJ KGVycm1zZygiYW5hbHl6aW5nIFwiJXMuJXNcIiBpbmhlcml0YW5jZSB0cmVlIiwKCQkJCQkJ Z2V0X25hbWVzcGFjZV9uYW1lKFJlbGF0aW9uR2V0TmFtZXNwYWNlKG9uZXJlbCkpLAoJCQkJ CQlSZWxhdGlvbkdldFJlbGF0aW9uTmFtZShvbmVyZWwpKSkpOwoJZWxzZQoJCWVyZXBvcnQo ZWxldmVsLAoJCQkJKGVycm1zZygiYW5hbHl6aW5nIFwiJXMuJXNcIiIsCgkJCQkJCWdldF9u YW1lc3BhY2VfbmFtZShSZWxhdGlvbkdldE5hbWVzcGFjZShvbmVyZWwpKSwKCQkJCQkJUmVs YXRpb25HZXRSZWxhdGlvbk5hbWUob25lcmVsKSkpKTsKCgkvKgoJICogU2V0IHVwIGEgd29y a2luZyBjb250ZXh0IHNvIHRoYXQgd2UgY2FuIGVhc2lseSBmcmVlIHdoYXRldmVyIGp1bmsg Z2V0cwoJICogY3JlYXRlZC4KCSAqLwoJYW5sX2NvbnRleHQgPSBBbGxvY1NldENvbnRleHRD cmVhdGUoQ3VycmVudE1lbW9yeUNvbnRleHQsCgkJCQkJCQkJCQkiQW5hbHl6ZSIsCgkJCQkJ CQkJCQlBTExPQ1NFVF9ERUZBVUxUX1NJWkVTKTsKCWNhbGxlcl9jb250ZXh0ID0gTWVtb3J5 Q29udGV4dFN3aXRjaFRvKGFubF9jb250ZXh0KTsKCgkvKgoJICogU3dpdGNoIHRvIHRoZSB0 YWJsZSBvd25lcidzIHVzZXJpZCwgc28gdGhhdCBhbnkgaW5kZXggZnVuY3Rpb25zIGFyZSBy dW4KCSAqIGFzIHRoYXQgdXNlci4gIEFsc28gbG9jayBkb3duIHNlY3VyaXR5LXJlc3RyaWN0 ZWQgb3BlcmF0aW9ucyBhbmQKCSAqIGFycmFuZ2UgdG8gbWFrZSBHVUMgdmFyaWFibGUgY2hh bmdlcyBsb2NhbCB0byB0aGlzIGNvbW1hbmQuCgkgKi8KCUdldFVzZXJJZEFuZFNlY0NvbnRl eHQoJnNhdmVfdXNlcmlkLCAmc2F2ZV9zZWNfY29udGV4dCk7CglTZXRVc2VySWRBbmRTZWND b250ZXh0KG9uZXJlbC0+cmRfcmVsLT5yZWxvd25lciwKCQkJCQkJICAgc2F2ZV9zZWNfY29u dGV4dCB8IFNFQ1VSSVRZX1JFU1RSSUNURURfT1BFUkFUSU9OKTsKCXNhdmVfbmVzdGxldmVs ID0gTmV3R1VDTmVzdExldmVsKCk7CglSZXN0cmljdFNlYXJjaFBhdGgoKTsKCgkvKgoJICog V2hlbiB2ZXJib3NlIG9yIGF1dG92YWN1dW0gbG9nZ2luZyBpcyB1c2VkLCBpbml0aWFsaXpl IGEgcmVzb3VyY2UgdXNhZ2UKCSAqIHNuYXBzaG90IGFuZCBvcHRpb25hbGx5IHRyYWNrIEkv TyB0aW1pbmcuCgkgKi8KCWlmIChpbnN0cnVtZW50KQoJewoJCWlmICh0cmFja19pb190aW1p bmcpCgkJewoJCQlzdGFydHJlYWR0aW1lID0gcGdTdGF0QmxvY2tSZWFkVGltZTsKCQkJc3Rh cnR3cml0ZXRpbWUgPSBwZ1N0YXRCbG9ja1dyaXRlVGltZTsKCQl9CgoJCXBnX3J1c2FnZV9p bml0KCZydTApOwoJfQoKCS8qIFVzZWQgZm9yIGluc3RydW1lbnRhdGlvbiBhbmQgc3RhdHMg cmVwb3J0ICovCglzdGFydHRpbWUgPSBHZXRDdXJyZW50VGltZXN0YW1wKCk7CgoJLyoKCSAq IERldGVybWluZSB3aGljaCBjb2x1bW5zIHRvIGFuYWx5emUuCgkgKi8KCWlmICh2YV9jb2xz ICE9IE5JTCkKCXsKCQlMaXN0Q2VsbCAgICpsZTsKCgkJdmFjYXR0cnN0YXRzID0gKFZhY0F0 dHJTdGF0cyAqKikgcGFsbG9jKGxpc3RfbGVuZ3RoKHZhX2NvbHMpICoKCQkJCQkJCQkJCQkJ c2l6ZW9mKFZhY0F0dHJTdGF0cyAqKSk7CgkJdGNudCA9IDA7CgkJZm9yZWFjaChsZSwgdmFf Y29scykKCQl7CgkJCWNoYXIJICAgKmNvbCA9IHN0clZhbChsZmlyc3QobGUpKTsKCgkJCWkg PSBhdHRuYW1lQXR0TnVtKG9uZXJlbCwgY29sLCBmYWxzZSk7CgkJCUFzc2VydChpICE9IElu dmFsaWRBdHRyTnVtYmVyKTsKCQkJdmFjYXR0cnN0YXRzW3RjbnRdID0gZXhhbWluZV9hdHRy aWJ1dGUob25lcmVsLCBpLCBOVUxMKTsKCQkJaWYgKHZhY2F0dHJzdGF0c1t0Y250XSAhPSBO VUxMKQoJCQkJdGNudCsrOwoJCX0KCQlhdHRyX2NudCA9IHRjbnQ7Cgl9CgllbHNlCgl7CgkJ YXR0cl9jbnQgPSBvbmVyZWwtPnJkX2F0dC0+bmF0dHM7CgkJdmFjYXR0cnN0YXRzID0gKFZh Y0F0dHJTdGF0cyAqKikKCQkJcGFsbG9jKGF0dHJfY250ICogc2l6ZW9mKFZhY0F0dHJTdGF0 cyAqKSk7CgkJdGNudCA9IDA7CgkJZm9yIChpID0gMTsgaSA8PSBhdHRyX2NudDsgaSsrKQoJ CXsKCQkJdmFjYXR0cnN0YXRzW3RjbnRdID0gZXhhbWluZV9hdHRyaWJ1dGUob25lcmVsLCBp LCBOVUxMKTsKCQkJaWYgKHZhY2F0dHJzdGF0c1t0Y250XSAhPSBOVUxMKQoJCQkJdGNudCsr OwoJCX0KCQlhdHRyX2NudCA9IHRjbnQ7Cgl9CgoJLyoKCSAqIE9wZW4gYWxsIGluZGV4ZXMg b2YgdGhlIHJlbGF0aW9uLCBhbmQgc2VlIGlmIHRoZXJlIGFyZSBhbnkgYW5hbHl6YWJsZQoJ ICogY29sdW1ucyBpbiB0aGUgaW5kZXhlcy4gIFdlIGRvIG5vdCBhbmFseXplIGluZGV4IGNv bHVtbnMgaWYgdGhlcmUgd2FzCgkgKiBhbiBleHBsaWNpdCBjb2x1bW4gbGlzdCBpbiB0aGUg QU5BTFlaRSBjb21tYW5kLCBob3dldmVyLgoJICoKCSAqIElmIHdlIGFyZSBkb2luZyBhIHJl Y3Vyc2l2ZSBzY2FuLCB3ZSBkb24ndCB3YW50IHRvIHRvdWNoIHRoZSBwYXJlbnQncwoJICog aW5kZXhlcyBhdCBhbGwuICBJZiB3ZSdyZSBwcm9jZXNzaW5nIGEgcGFydGl0aW9uZWQgdGFi bGUsIHdlIG5lZWQgdG8KCSAqIGtub3cgaWYgdGhlcmUgYXJlIGFueSBpbmRleGVzLCBidXQg d2UgZG9uJ3Qgd2FudCB0byBwcm9jZXNzIHRoZW0uCgkgKi8KCWlmIChvbmVyZWwtPnJkX3Jl bC0+cmVsa2luZCA9PSBSRUxLSU5EX1BBUlRJVElPTkVEX1RBQkxFKQoJewoJCUxpc3QJICAg KmlkeHMgPSBSZWxhdGlvbkdldEluZGV4TGlzdChvbmVyZWwpOwoKCQlJcmVsID0gTlVMTDsK CQluaW5kZXhlcyA9IDA7CgkJaGFzaW5kZXggPSBpZHhzICE9IE5JTDsKCQlsaXN0X2ZyZWUo aWR4cyk7Cgl9CgllbHNlIGlmICghaW5oKQoJewoJCXZhY19vcGVuX2luZGV4ZXMob25lcmVs LCBBY2Nlc3NTaGFyZUxvY2ssICZuaW5kZXhlcywgJklyZWwpOwoJCWhhc2luZGV4ID0gbmlu ZGV4ZXMgPiAwOwoJfQoJZWxzZQoJewoJCUlyZWwgPSBOVUxMOwoJCW5pbmRleGVzID0gMDsK CQloYXNpbmRleCA9IGZhbHNlOwoJfQoJaW5kZXhkYXRhID0gTlVMTDsKCWlmIChuaW5kZXhl cyA+IDApCgl7CgkJaW5kZXhkYXRhID0gKEFubEluZGV4RGF0YSAqKSBwYWxsb2MwKG5pbmRl eGVzICogc2l6ZW9mKEFubEluZGV4RGF0YSkpOwoJCWZvciAoaW5kID0gMDsgaW5kIDwgbmlu ZGV4ZXM7IGluZCsrKQoJCXsKCQkJQW5sSW5kZXhEYXRhICp0aGlzZGF0YSA9ICZpbmRleGRh dGFbaW5kXTsKCQkJSW5kZXhJbmZvICAqaW5kZXhJbmZvOwoKCQkJdGhpc2RhdGEtPmluZGV4 SW5mbyA9IGluZGV4SW5mbyA9IEJ1aWxkSW5kZXhJbmZvKElyZWxbaW5kXSk7CgkJCXRoaXNk YXRhLT50dXBsZUZyYWN0ID0gMS4wOyAvKiBmaXggbGF0ZXIgaWYgcGFydGlhbCAqLwoJCQlp ZiAoaW5kZXhJbmZvLT5paV9FeHByZXNzaW9ucyAhPSBOSUwgJiYgdmFfY29scyA9PSBOSUwp CgkJCXsKCQkJCUxpc3RDZWxsICAgKmluZGV4cHJfaXRlbSA9IGxpc3RfaGVhZChpbmRleElu Zm8tPmlpX0V4cHJlc3Npb25zKTsKCgkJCQl0aGlzZGF0YS0+dmFjYXR0cnN0YXRzID0gKFZh Y0F0dHJTdGF0cyAqKikKCQkJCQlwYWxsb2MoaW5kZXhJbmZvLT5paV9OdW1JbmRleEF0dHJz ICogc2l6ZW9mKFZhY0F0dHJTdGF0cyAqKSk7CgkJCQl0Y250ID0gMDsKCQkJCWZvciAoaSA9 IDA7IGkgPCBpbmRleEluZm8tPmlpX051bUluZGV4QXR0cnM7IGkrKykKCQkJCXsKCQkJCQlp bnQJCQlrZXljb2wgPSBpbmRleEluZm8tPmlpX0luZGV4QXR0ck51bWJlcnNbaV07CgoJCQkJ CWlmIChrZXljb2wgPT0gMCkKCQkJCQl7CgkJCQkJCS8qIEZvdW5kIGFuIGluZGV4IGV4cHJl c3Npb24gKi8KCQkJCQkJTm9kZQkgICAqaW5kZXhrZXk7CgoJCQkJCQlpZiAoaW5kZXhwcl9p dGVtID09IE5VTEwpCS8qIHNob3VsZG4ndCBoYXBwZW4gKi8KCQkJCQkJCWVsb2coRVJST1Is ICJ0b28gZmV3IGVudHJpZXMgaW4gaW5kZXhwcnMgbGlzdCIpOwoJCQkJCQlpbmRleGtleSA9 IChOb2RlICopIGxmaXJzdChpbmRleHByX2l0ZW0pOwoJCQkJCQlpbmRleHByX2l0ZW0gPSBs bmV4dChpbmRleEluZm8tPmlpX0V4cHJlc3Npb25zLAoJCQkJCQkJCQkJCSBpbmRleHByX2l0 ZW0pOwoJCQkJCQl0aGlzZGF0YS0+dmFjYXR0cnN0YXRzW3RjbnRdID0KCQkJCQkJCWV4YW1p bmVfYXR0cmlidXRlKElyZWxbaW5kXSwgaSArIDEsIGluZGV4a2V5KTsKCQkJCQkJaWYgKHRo aXNkYXRhLT52YWNhdHRyc3RhdHNbdGNudF0gIT0gTlVMTCkKCQkJCQkJCXRjbnQrKzsKCQkJ CQl9CgkJCQl9CgkJCQl0aGlzZGF0YS0+YXR0cl9jbnQgPSB0Y250OwoJCQl9CgkJfQoJfQoK CS8qCgkgKiBEZXRlcm1pbmUgaG93IG1hbnkgcm93cyB3ZSBuZWVkIHRvIHNhbXBsZSwgdXNp bmcgdGhlIHdvcnN0IGNhc2UgZnJvbQoJICogYWxsIGFuYWx5emFibGUgY29sdW1ucy4gIFdl IHVzZSBhIGxvd2VyIGJvdW5kIG9mIDEwMCByb3dzIHRvIGF2b2lkCgkgKiBwb3NzaWJsZSBv dmVyZmxvdyBpbiBWaXR0ZXIncyBhbGdvcml0aG0uICAoTm90ZTogdGhhdCB3aWxsIGFsc28g YmUgdGhlCgkgKiB0YXJnZXQgaW4gdGhlIGNvcm5lciBjYXNlIHdoZXJlIHRoZXJlIGFyZSBu byBhbmFseXphYmxlIGNvbHVtbnMuKQoJICovCgl0YXJncm93cyA9IDEwMDsKCWZvciAoaSA9 IDA7IGkgPCBhdHRyX2NudDsgaSsrKQoJewoJCWlmICh0YXJncm93cyA8IHZhY2F0dHJzdGF0 c1tpXS0+bWlucm93cykKCQkJdGFyZ3Jvd3MgPSB2YWNhdHRyc3RhdHNbaV0tPm1pbnJvd3M7 Cgl9Cglmb3IgKGluZCA9IDA7IGluZCA8IG5pbmRleGVzOyBpbmQrKykKCXsKCQlBbmxJbmRl eERhdGEgKnRoaXNkYXRhID0gJmluZGV4ZGF0YVtpbmRdOwoKCQlmb3IgKGkgPSAwOyBpIDwg dGhpc2RhdGEtPmF0dHJfY250OyBpKyspCgkJewoJCQlpZiAodGFyZ3Jvd3MgPCB0aGlzZGF0 YS0+dmFjYXR0cnN0YXRzW2ldLT5taW5yb3dzKQoJCQkJdGFyZ3Jvd3MgPSB0aGlzZGF0YS0+ dmFjYXR0cnN0YXRzW2ldLT5taW5yb3dzOwoJCX0KCX0KCgkvKgoJICogTG9vayBhdCBleHRl bmRlZCBzdGF0aXN0aWNzIG9iamVjdHMgdG9vLCBhcyB0aG9zZSBtYXkgZGVmaW5lIGN1c3Rv bQoJICogc3RhdGlzdGljcyB0YXJnZXQuIFNvIHdlIG1heSBuZWVkIHRvIHNhbXBsZSBtb3Jl IHJvd3MgYW5kIHRoZW4gYnVpbGQKCSAqIHRoZSBzdGF0aXN0aWNzIHdpdGggZW5vdWdoIGRl dGFpbC4KCSAqLwoJbWlucm93cyA9IENvbXB1dGVFeHRTdGF0aXN0aWNzUm93cyhvbmVyZWws IGF0dHJfY250LCB2YWNhdHRyc3RhdHMpOwoKCWlmICh0YXJncm93cyA8IG1pbnJvd3MpCgkJ dGFyZ3Jvd3MgPSBtaW5yb3dzOwoKCS8qCgkgKiBBY3F1aXJlIHRoZSBzYW1wbGUgcm93cwoJ ICovCglyb3dzID0gKEhlYXBUdXBsZSAqKSBwYWxsb2ModGFyZ3Jvd3MgKiBzaXplb2YoSGVh cFR1cGxlKSk7CglwZ3N0YXRfcHJvZ3Jlc3NfdXBkYXRlX3BhcmFtKFBST0dSRVNTX0FOQUxZ WkVfUEhBU0UsCgkJCQkJCQkJIGluaCA/IFBST0dSRVNTX0FOQUxZWkVfUEhBU0VfQUNRVUlS RV9TQU1QTEVfUk9XU19JTkggOgoJCQkJCQkJCSBQUk9HUkVTU19BTkFMWVpFX1BIQVNFX0FD UVVJUkVfU0FNUExFX1JPV1MpOwoJaWYgKGluaCkKCQludW1yb3dzID0gYWNxdWlyZV9pbmhl cml0ZWRfc2FtcGxlX3Jvd3Mob25lcmVsLCBlbGV2ZWwsCgkJCQkJCQkJCQkJCXJvd3MsIHRh cmdyb3dzLAoJCQkJCQkJCQkJCQkmdG90YWxyb3dzLCAmdG90YWxkZWFkcm93cyk7CgllbHNl CgkJbnVtcm93cyA9ICgqYWNxdWlyZWZ1bmMpIChvbmVyZWwsIGVsZXZlbCwKCQkJCQkJCQkg IHJvd3MsIHRhcmdyb3dzLAoJCQkJCQkJCSAgJnRvdGFscm93cywgJnRvdGFsZGVhZHJvd3Mp OwoKCS8qCgkgKiBDb21wdXRlIHRoZSBzdGF0aXN0aWNzLiAgVGVtcG9yYXJ5IHJlc3VsdHMg ZHVyaW5nIHRoZSBjYWxjdWxhdGlvbnMgZm9yCgkgKiBlYWNoIGNvbHVtbiBhcmUgc3RvcmVk IGluIGEgY2hpbGQgY29udGV4dC4gIFRoZSBjYWxjIHJvdXRpbmVzIGFyZQoJICogcmVzcG9u c2libGUgdG8gbWFrZSBzdXJlIHRoYXQgd2hhdGV2ZXIgdGhleSBzdG9yZSBpbnRvIHRoZSBW YWNBdHRyU3RhdHMKCSAqIHN0cnVjdHVyZSBpcyBhbGxvY2F0ZWQgaW4gYW5sX2NvbnRleHQu CgkgKi8KCWlmIChudW1yb3dzID4gMCkKCXsKCQlNZW1vcnlDb250ZXh0IGNvbF9jb250ZXh0 LAoJCQkJCW9sZF9jb250ZXh0OwoKCQlwZ3N0YXRfcHJvZ3Jlc3NfdXBkYXRlX3BhcmFtKFBS T0dSRVNTX0FOQUxZWkVfUEhBU0UsCgkJCQkJCQkJCSBQUk9HUkVTU19BTkFMWVpFX1BIQVNF X0NPTVBVVEVfU1RBVFMpOwoKCQljb2xfY29udGV4dCA9IEFsbG9jU2V0Q29udGV4dENyZWF0 ZShhbmxfY29udGV4dCwKCQkJCQkJCQkJCQkiQW5hbHl6ZSBDb2x1bW4iLAoJCQkJCQkJCQkJ CUFMTE9DU0VUX0RFRkFVTFRfU0laRVMpOwoJCW9sZF9jb250ZXh0ID0gTWVtb3J5Q29udGV4 dFN3aXRjaFRvKGNvbF9jb250ZXh0KTsKCgkJZm9yIChpID0gMDsgaSA8IGF0dHJfY250OyBp KyspCgkJewoJCQlWYWNBdHRyU3RhdHMgKnN0YXRzID0gdmFjYXR0cnN0YXRzW2ldOwoJCQlB dHRyaWJ1dGVPcHRzICphb3B0OwoKCQkJc3RhdHMtPnJvd3MgPSByb3dzOwoJCQlzdGF0cy0+ dHVwRGVzYyA9IG9uZXJlbC0+cmRfYXR0OwoJCQlzdGF0cy0+Y29tcHV0ZV9zdGF0cyhzdGF0 cywKCQkJCQkJCQkgc3RkX2ZldGNoX2Z1bmMsCgkJCQkJCQkJIG51bXJvd3MsCgkJCQkJCQkJ IHRvdGFscm93cyk7CgoJCQkvKgoJCQkgKiBJZiB0aGUgYXBwcm9wcmlhdGUgZmxhdm9yIG9m IHRoZSBuX2Rpc3RpbmN0IG9wdGlvbiBpcwoJCQkgKiBzcGVjaWZpZWQsIG92ZXJyaWRlIHdp dGggdGhlIGNvcnJlc3BvbmRpbmcgdmFsdWUuCgkJCSAqLwoJCQlhb3B0ID0gZ2V0X2F0dHJp YnV0ZV9vcHRpb25zKG9uZXJlbC0+cmRfaWQsIHN0YXRzLT50dXBhdHRudW0pOwoJCQlpZiAo YW9wdCAhPSBOVUxMKQoJCQl7CgkJCQlmbG9hdDgJCW5fZGlzdGluY3Q7CgoJCQkJbl9kaXN0 aW5jdCA9IGluaCA/IGFvcHQtPm5fZGlzdGluY3RfaW5oZXJpdGVkIDogYW9wdC0+bl9kaXN0 aW5jdDsKCQkJCWlmIChuX2Rpc3RpbmN0ICE9IDAuMCkKCQkJCQlzdGF0cy0+c3RhZGlzdGlu Y3QgPSBuX2Rpc3RpbmN0OwoJCQl9CgoJCQlNZW1vcnlDb250ZXh0UmVzZXQoY29sX2NvbnRl eHQpOwoJCX0KCgkJaWYgKG5pbmRleGVzID4gMCkKCQkJY29tcHV0ZV9pbmRleF9zdGF0cyhv bmVyZWwsIHRvdGFscm93cywKCQkJCQkJCQlpbmRleGRhdGEsIG5pbmRleGVzLAoJCQkJCQkJ CXJvd3MsIG51bXJvd3MsCgkJCQkJCQkJY29sX2NvbnRleHQpOwoKCQlNZW1vcnlDb250ZXh0 U3dpdGNoVG8ob2xkX2NvbnRleHQpOwoJCU1lbW9yeUNvbnRleHREZWxldGUoY29sX2NvbnRl eHQpOwoKCQkvKgoJCSAqIEVtaXQgdGhlIGNvbXBsZXRlZCBzdGF0cyByb3dzIGludG8gcGdf c3RhdGlzdGljLCByZXBsYWNpbmcgYW55CgkJICogcHJldmlvdXMgc3RhdGlzdGljcyBmb3Ig dGhlIHRhcmdldCBjb2x1bW5zLiAgKElmIHRoZXJlIGFyZSBzdGF0cyBpbgoJCSAqIHBnX3N0 YXRpc3RpYyBmb3IgY29sdW1ucyB3ZSBkaWRuJ3QgcHJvY2Vzcywgd2UgbGVhdmUgdGhlbSBh bG9uZS4pCgkJICovCgkJdXBkYXRlX2F0dHN0YXRzKFJlbGF0aW9uR2V0UmVsaWQob25lcmVs KSwgaW5oLAoJCQkJCQlhdHRyX2NudCwgdmFjYXR0cnN0YXRzKTsKCgkJZm9yIChpbmQgPSAw OyBpbmQgPCBuaW5kZXhlczsgaW5kKyspCgkJewoJCQlBbmxJbmRleERhdGEgKnRoaXNkYXRh ID0gJmluZGV4ZGF0YVtpbmRdOwoKCQkJdXBkYXRlX2F0dHN0YXRzKFJlbGF0aW9uR2V0UmVs aWQoSXJlbFtpbmRdKSwgZmFsc2UsCgkJCQkJCQl0aGlzZGF0YS0+YXR0cl9jbnQsIHRoaXNk YXRhLT52YWNhdHRyc3RhdHMpOwoJCX0KCgkJLyogQnVpbGQgZXh0ZW5kZWQgc3RhdGlzdGlj cyAoaWYgdGhlcmUgYXJlIGFueSkuICovCgkJQnVpbGRSZWxhdGlvbkV4dFN0YXRpc3RpY3Mo b25lcmVsLCBpbmgsIHRvdGFscm93cywgbnVtcm93cywgcm93cywKCQkJCQkJCQkgICBhdHRy X2NudCwgdmFjYXR0cnN0YXRzKTsKCX0KCglwZ3N0YXRfcHJvZ3Jlc3NfdXBkYXRlX3BhcmFt KFBST0dSRVNTX0FOQUxZWkVfUEhBU0UsCgkJCQkJCQkJIFBST0dSRVNTX0FOQUxZWkVfUEhB U0VfRklOQUxJWkVfQU5BTFlaRSk7CgoJLyoKCSAqIFVwZGF0ZSBwYWdlcy90dXBsZXMgc3Rh dHMgaW4gcGdfY2xhc3MgLi4uIGJ1dCBub3QgaWYgd2UncmUgZG9pbmcKCSAqIGluaGVyaXRl ZCBzdGF0cy4KCSAqCgkgKiBXZSBhc3N1bWUgdGhhdCBWQUNVVU0gaGFzbid0IHNldCBwZ19j bGFzcy5yZWx0dXBsZXMgYWxyZWFkeSwgZXZlbgoJICogZHVyaW5nIGEgVkFDVVVNIEFOQUxZ WkUuICBBbHRob3VnaCBWQUNVVU0gb2Z0ZW4gdXBkYXRlcyBwZ19jbGFzcywKCSAqIGV4Y2Vw dGlvbnMgZXhpc3QuICBBICJWQUNVVU0gKEFOQUxZWkUsIElOREVYX0NMRUFOVVAgT0ZGKSIg Y29tbWFuZCB3aWxsCgkgKiBuZXZlciB1cGRhdGUgcGdfY2xhc3MgZW50cmllcyBmb3IgaW5k ZXggcmVsYXRpb25zLiAgSXQncyBhbHNvIHBvc3NpYmxlCgkgKiB0aGF0IGFuIGluZGl2aWR1 YWwgaW5kZXgncyBwZ19jbGFzcyBlbnRyeSB3b24ndCBiZSB1cGRhdGVkIGR1cmluZwoJICog VkFDVVVNIGlmIHRoZSBpbmRleCBBTSByZXR1cm5zIE5VTEwgZnJvbSBpdHMgYW12YWN1dW1j bGVhbnVwKCkgcm91dGluZS4KCSAqLwoJaWYgKCFpbmgpCgl7CgkJQmxvY2tOdW1iZXIgcmVs YWxsdmlzaWJsZSA9IDA7CgkJQmxvY2tOdW1iZXIgcmVsYWxsZnJvemVuID0gMDsKCgkJaWYg KFJFTEtJTkRfSEFTX1NUT1JBR0Uob25lcmVsLT5yZF9yZWwtPnJlbGtpbmQpKQoJCQl2aXNp YmlsaXR5bWFwX2NvdW50KG9uZXJlbCwgJnJlbGFsbHZpc2libGUsICZyZWxhbGxmcm96ZW4p OwoKCQkvKgoJCSAqIFVwZGF0ZSBwZ19jbGFzcyBmb3IgdGFibGUgcmVsYXRpb24uICBDQ0kg Zmlyc3QsIGluIGNhc2UgYWNxdWlyZWZ1bmMKCQkgKiB1cGRhdGVkIHBnX2NsYXNzLgoJCSAq LwoJCUNvbW1hbmRDb3VudGVySW5jcmVtZW50KCk7CgkJdmFjX3VwZGF0ZV9yZWxzdGF0cyhv bmVyZWwsCgkJCQkJCQlyZWxwYWdlcywKCQkJCQkJCXRvdGFscm93cywKCQkJCQkJCXJlbGFs bHZpc2libGUsCgkJCQkJCQlyZWxhbGxmcm96ZW4sCgkJCQkJCQloYXNpbmRleCwKCQkJCQkJ CUludmFsaWRUcmFuc2FjdGlvbklkLAoJCQkJCQkJSW52YWxpZE11bHRpWGFjdElkLAoJCQkJ CQkJTlVMTCwgTlVMTCwKCQkJCQkJCWluX291dGVyX3hhY3QpOwoKCQkvKiBTYW1lIGZvciBp bmRleGVzICovCgkJZm9yIChpbmQgPSAwOyBpbmQgPCBuaW5kZXhlczsgaW5kKyspCgkJewoJ CQlBbmxJbmRleERhdGEgKnRoaXNkYXRhID0gJmluZGV4ZGF0YVtpbmRdOwoJCQlkb3VibGUJ CXRvdGFsaW5kZXhyb3dzOwoKCQkJdG90YWxpbmRleHJvd3MgPSBjZWlsKHRoaXNkYXRhLT50 dXBsZUZyYWN0ICogdG90YWxyb3dzKTsKCQkJdmFjX3VwZGF0ZV9yZWxzdGF0cyhJcmVsW2lu ZF0sCgkJCQkJCQkJUmVsYXRpb25HZXROdW1iZXJPZkJsb2NrcyhJcmVsW2luZF0pLAoJCQkJ CQkJCXRvdGFsaW5kZXhyb3dzLAoJCQkJCQkJCTAsIDAsCgkJCQkJCQkJZmFsc2UsCgkJCQkJ CQkJSW52YWxpZFRyYW5zYWN0aW9uSWQsCgkJCQkJCQkJSW52YWxpZE11bHRpWGFjdElkLAoJ CQkJCQkJCU5VTEwsIE5VTEwsCgkJCQkJCQkJaW5fb3V0ZXJfeGFjdCk7CgkJfQoJfQoJZWxz ZSBpZiAob25lcmVsLT5yZF9yZWwtPnJlbGtpbmQgPT0gUkVMS0lORF9QQVJUSVRJT05FRF9U QUJMRSkKCXsKCQkvKgoJCSAqIFBhcnRpdGlvbmVkIHRhYmxlcyBkb24ndCBoYXZlIHN0b3Jh Z2UsIHNvIHdlIGRvbid0IHNldCBhbnkgZmllbGRzCgkJICogaW4gdGhlaXIgcGdfY2xhc3Mg ZW50cmllcyBleGNlcHQgZm9yIHJlbHR1cGxlcyBhbmQgcmVsaGFzaW5kZXguCgkJICovCgkJ Q29tbWFuZENvdW50ZXJJbmNyZW1lbnQoKTsKCQl2YWNfdXBkYXRlX3JlbHN0YXRzKG9uZXJl bCwgLTEsIHRvdGFscm93cywKCQkJCQkJCTAsIDAsIGhhc2luZGV4LCBJbnZhbGlkVHJhbnNh Y3Rpb25JZCwKCQkJCQkJCUludmFsaWRNdWx0aVhhY3RJZCwKCQkJCQkJCU5VTEwsIE5VTEws CgkJCQkJCQlpbl9vdXRlcl94YWN0KTsKCX0KCgkvKgoJICogTm93IHJlcG9ydCBBTkFMWVpF IHRvIHRoZSBjdW11bGF0aXZlIHN0YXRzIHN5c3RlbS4gIEZvciByZWd1bGFyIHRhYmxlcywK CSAqIHdlIGRvIGl0IG9ubHkgaWYgbm90IGRvaW5nIGluaGVyaXRlZCBzdGF0cy4gIEZvciBw YXJ0aXRpb25lZCB0YWJsZXMsIHdlCgkgKiBvbmx5IGRvIGl0IGZvciBpbmhlcml0ZWQgc3Rh dHMuIChXZSdyZSBuZXZlciBjYWxsZWQgZm9yIG5vdC1pbmhlcml0ZWQKCSAqIHN0YXRzIG9u IHBhcnRpdGlvbmVkIHRhYmxlcyBhbnl3YXkuKQoJICoKCSAqIFJlc2V0IHRoZSBtb2Rfc2lu Y2VfYW5hbHl6ZSBjb3VudGVyIG9ubHkgaWYgd2UgYW5hbHl6ZWQgYWxsIGNvbHVtbnM7Cgkg KiBvdGhlcndpc2UsIHRoZXJlIGlzIHN0aWxsIHdvcmsgZm9yIGF1dG8tYW5hbHl6ZSB0byBk by4KCSAqLwoJaWYgKCFpbmgpCgkJcGdzdGF0X3JlcG9ydF9hbmFseXplKG9uZXJlbCwgdG90 YWxyb3dzLCB0b3RhbGRlYWRyb3dzLAoJCQkJCQkJICAodmFfY29scyA9PSBOSUwpLCBzdGFy dHRpbWUpOwoJZWxzZSBpZiAob25lcmVsLT5yZF9yZWwtPnJlbGtpbmQgPT0gUkVMS0lORF9Q QVJUSVRJT05FRF9UQUJMRSkKCQlwZ3N0YXRfcmVwb3J0X2FuYWx5emUob25lcmVsLCAwLCAw LCAodmFfY29scyA9PSBOSUwpLCBzdGFydHRpbWUpOwoKCS8qCgkgKiBJZiB0aGlzIGlzbid0 IHBhcnQgb2YgVkFDVVVNIEFOQUxZWkUsIGxldCBpbmRleCBBTXMgZG8gY2xlYW51cC4KCSAq CgkgKiBOb3RlIHRoYXQgbW9zdCBpbmRleCBBTXMgcGVyZm9ybSBhIG5vLW9wIGFzIGEgbWF0 dGVyIG9mIHBvbGljeSBmb3IKCSAqIGFtdmFjdXVtY2xlYW51cCgpIHdoZW4gY2FsbGVkIGlu IEFOQUxZWkUtb25seSBtb2RlLiAgVGhlIG9ubHkgZXhjZXB0aW9uCgkgKiBhbW9uZyBjb3Jl IGluZGV4IEFNcyBpcyBHSU4vZ2ludmFjdXVtY2xlYW51cCgpLgoJICovCglpZiAoIShwYXJh bXMtPm9wdGlvbnMgJiBWQUNPUFRfVkFDVVVNKSkKCXsKCQlmb3IgKGluZCA9IDA7IGluZCA8 IG5pbmRleGVzOyBpbmQrKykKCQl7CgkJCUluZGV4QnVsa0RlbGV0ZVJlc3VsdCAqc3RhdHM7 CgkJCUluZGV4VmFjdXVtSW5mbyBpdmluZm87CgoJCQlpdmluZm8uaW5kZXggPSBJcmVsW2lu ZF07CgkJCWl2aW5mby5oZWFwcmVsID0gb25lcmVsOwoJCQlpdmluZm8uYW5hbHl6ZV9vbmx5 ID0gdHJ1ZTsKCQkJaXZpbmZvLmVzdGltYXRlZF9jb3VudCA9IHRydWU7CgkJCWl2aW5mby5t ZXNzYWdlX2xldmVsID0gZWxldmVsOwoJCQlpdmluZm8ubnVtX2hlYXBfdHVwbGVzID0gb25l cmVsLT5yZF9yZWwtPnJlbHR1cGxlczsKCQkJaXZpbmZvLnN0cmF0ZWd5ID0gdmFjX3N0cmF0 ZWd5OwoKCQkJc3RhdHMgPSBpbmRleF92YWN1dW1fY2xlYW51cCgmaXZpbmZvLCBOVUxMKTsK CgkJCWlmIChzdGF0cykKCQkJCXBmcmVlKHN0YXRzKTsKCQl9Cgl9CgoJLyogRG9uZSB3aXRo IGluZGV4ZXMgKi8KCXZhY19jbG9zZV9pbmRleGVzKG5pbmRleGVzLCBJcmVsLCBOb0xvY2sp OwoKCS8qIExvZyB0aGUgYWN0aW9uIGlmIGFwcHJvcHJpYXRlICovCglpZiAoaW5zdHJ1bWVu dCkKCXsKCQlUaW1lc3RhbXBUeiBlbmR0aW1lID0gR2V0Q3VycmVudFRpbWVzdGFtcCgpOwoK CQlpZiAodmVyYm9zZSB8fCBwYXJhbXMtPmxvZ19hbmFseXplX21pbl9kdXJhdGlvbiA9PSAw IHx8CgkJCVRpbWVzdGFtcERpZmZlcmVuY2VFeGNlZWRzKHN0YXJ0dGltZSwgZW5kdGltZSwK CQkJCQkJCQkJICAgcGFyYW1zLT5sb2dfYW5hbHl6ZV9taW5fZHVyYXRpb24pKQoJCXsKCQkJ bG9uZwkJZGVsYXlfaW5fbXM7CgkJCVdhbFVzYWdlCXdhbHVzYWdlOwoJCQlkb3VibGUJCXJl YWRfcmF0ZSA9IDA7CgkJCWRvdWJsZQkJd3JpdGVfcmF0ZSA9IDA7CgkJCWNoYXIJICAgKm1z Z2ZtdDsKCQkJU3RyaW5nSW5mb0RhdGEgYnVmOwoJCQlpbnQ2NAkJdG90YWxfYmxrc19oaXQ7 CgkJCWludDY0CQl0b3RhbF9ibGtzX3JlYWQ7CgkJCWludDY0CQl0b3RhbF9ibGtzX2RpcnRp ZWQ7CgoJCQltZW1zZXQoJmJ1ZmZlcnVzYWdlLCAwLCBzaXplb2YoQnVmZmVyVXNhZ2UpKTsK CQkJQnVmZmVyVXNhZ2VBY2N1bURpZmYoJmJ1ZmZlcnVzYWdlLCAmcGdCdWZmZXJVc2FnZSwg JnN0YXJ0YnVmZmVydXNhZ2UpOwoJCQltZW1zZXQoJndhbHVzYWdlLCAwLCBzaXplb2YoV2Fs VXNhZ2UpKTsKCQkJV2FsVXNhZ2VBY2N1bURpZmYoJndhbHVzYWdlLCAmcGdXYWxVc2FnZSwg JnN0YXJ0d2FsdXNhZ2UpOwoKCQkJdG90YWxfYmxrc19oaXQgPSBidWZmZXJ1c2FnZS5zaGFy ZWRfYmxrc19oaXQgKwoJCQkJYnVmZmVydXNhZ2UubG9jYWxfYmxrc19oaXQ7CgkJCXRvdGFs X2Jsa3NfcmVhZCA9IGJ1ZmZlcnVzYWdlLnNoYXJlZF9ibGtzX3JlYWQgKwoJCQkJYnVmZmVy dXNhZ2UubG9jYWxfYmxrc19yZWFkOwoJCQl0b3RhbF9ibGtzX2RpcnRpZWQgPSBidWZmZXJ1 c2FnZS5zaGFyZWRfYmxrc19kaXJ0aWVkICsKCQkJCWJ1ZmZlcnVzYWdlLmxvY2FsX2Jsa3Nf ZGlydGllZDsKCgkJCS8qCgkJCSAqIFdlIGRvIG5vdCBleHBlY3QgYW4gYW5hbHl6ZSB0byB0 YWtlID4gMjUgZGF5cyBhbmQgaXQgc2ltcGxpZmllcwoJCQkgKiB0aGluZ3MgYSBiaXQgdG8g dXNlIFRpbWVzdGFtcERpZmZlcmVuY2VNaWxsaXNlY29uZHMuCgkJCSAqLwoJCQlkZWxheV9p bl9tcyA9IFRpbWVzdGFtcERpZmZlcmVuY2VNaWxsaXNlY29uZHMoc3RhcnR0aW1lLCBlbmR0 aW1lKTsKCgkJCS8qCgkJCSAqIE5vdGUgdGhhdCB3ZSBhcmUgcmVwb3J0aW5nIHRoZXNlIHJl YWQvd3JpdGUgcmF0ZXMgaW4gdGhlIHNhbWUKCQkJICogbWFubmVyIGFzIFZBQ1VVTSBkb2Vz LCB3aGljaCBtZWFucyB0aGF0IHdoaWxlIHRoZSAnYXZlcmFnZSByZWFkCgkJCSAqIHJhdGUn IGhlcmUgYWN0dWFsbHkgY29ycmVzcG9uZHMgdG8gcGFnZSBtaXNzZXMgYW5kIHJlc3VsdGlu ZwoJCQkgKiByZWFkcyB3aGljaCBhcmUgYWxzbyBwaWNrZWQgdXAgYnkgdHJhY2tfaW9fdGlt aW5nLCBpZiBlbmFibGVkLAoJCQkgKiB0aGUgJ2F2ZXJhZ2Ugd3JpdGUgcmF0ZScgaXMgYWN0 dWFsbHkgdGFsa2luZyBhYm91dCB0aGUgcmF0ZSBvZgoJCQkgKiBwYWdlcyBiZWluZyBkaXJ0 aWVkLCBub3QgYmVpbmcgd3JpdHRlbiBvdXQsIHNvIGl0J3MgdHlwaWNhbCB0bwoJCQkgKiBo YXZlIGEgbm9uLXplcm8gJ2F2ZyB3cml0ZSByYXRlJyB3aGlsZSBJL08gdGltaW5ncyBvbmx5 IHJlcG9ydHMKCQkJICogcmVhZHMuCgkJCSAqCgkJCSAqIEl0J3Mgbm90IGNsZWFyIHRoYXQg YW4gQU5BTFlaRSB3aWxsIGV2ZXIgcmVzdWx0IGluCgkJCSAqIEZsdXNoQnVmZmVyKCkgYmVp bmcgY2FsbGVkLCBidXQgd2UgdHJhY2sgYW5kIHN1cHBvcnQgcmVwb3J0aW5nCgkJCSAqIG9u IEkvTyB3cml0ZSB0aW1lIGluIGNhc2UgdGhhdCBjaGFuZ2VzIGFzIGl0J3MgcHJhY3RpY2Fs bHkgZnJlZQoJCQkgKiB0byBkbyBzbyBhbnl3YXkuCgkJCSAqLwoKCQkJaWYgKGRlbGF5X2lu X21zID4gMCkKCQkJewoJCQkJcmVhZF9yYXRlID0gKGRvdWJsZSkgQkxDS1NaICogdG90YWxf Ymxrc19yZWFkIC8KCQkJCQkoMTAyNCAqIDEwMjQpIC8gKGRlbGF5X2luX21zIC8gMTAwMC4w KTsKCQkJCXdyaXRlX3JhdGUgPSAoZG91YmxlKSBCTENLU1ogKiB0b3RhbF9ibGtzX2RpcnRp ZWQgLwoJCQkJCSgxMDI0ICogMTAyNCkgLyAoZGVsYXlfaW5fbXMgLyAxMDAwLjApOwoJCQl9 CgoJCQkvKgoJCQkgKiBXZSBzcGxpdCB0aGlzIHVwIHNvIHdlIGRvbid0IGVtaXQgZW1wdHkg SS9PIHRpbWluZyB2YWx1ZXMgd2hlbgoJCQkgKiB0cmFja19pb190aW1pbmcgaXNuJ3QgZW5h YmxlZC4KCQkJICovCgoJCQlpbml0U3RyaW5nSW5mbygmYnVmKTsKCgkJCWlmIChBbUF1dG9W YWN1dW1Xb3JrZXJQcm9jZXNzKCkpCgkJCQltc2dmbXQgPSBfKCJhdXRvbWF0aWMgYW5hbHl6 ZSBvZiB0YWJsZSBcIiVzLiVzLiVzXCJcbiIpOwoJCQllbHNlCgkJCQltc2dmbXQgPSBfKCJm aW5pc2hlZCBhbmFseXppbmcgdGFibGUgXCIlcy4lcy4lc1wiXG4iKTsKCgkJCWFwcGVuZFN0 cmluZ0luZm8oJmJ1ZiwgbXNnZm10LAoJCQkJCQkJIGdldF9kYXRhYmFzZV9uYW1lKE15RGF0 YWJhc2VJZCksCgkJCQkJCQkgZ2V0X25hbWVzcGFjZV9uYW1lKFJlbGF0aW9uR2V0TmFtZXNw YWNlKG9uZXJlbCkpLAoJCQkJCQkJIFJlbGF0aW9uR2V0UmVsYXRpb25OYW1lKG9uZXJlbCkp OwoJCQlpZiAodHJhY2tfY29zdF9kZWxheV90aW1pbmcpCgkJCXsKCQkJCS8qCgkJCQkgKiBX ZSBieXBhc3MgdGhlIGNoYW5nZWNvdW50IG1lY2hhbmlzbSBiZWNhdXNlIHRoaXMgdmFsdWUg aXMKCQkJCSAqIG9ubHkgdXBkYXRlZCBieSB0aGUgY2FsbGluZyBwcm9jZXNzLgoJCQkJICov CgkJCQlhcHBlbmRTdHJpbmdJbmZvKCZidWYsIF8oImRlbGF5IHRpbWU6ICUuM2YgbXNcbiIp LAoJCQkJCQkJCSAoZG91YmxlKSBNeUJFRW50cnktPnN0X3Byb2dyZXNzX3BhcmFtW1BST0dS RVNTX0FOQUxZWkVfREVMQVlfVElNRV0gLyAxMDAwMDAwLjApOwoJCQl9CgkJCWlmICh0cmFj a19pb190aW1pbmcpCgkJCXsKCQkJCWRvdWJsZQkJcmVhZF9tcyA9IChkb3VibGUpIChwZ1N0 YXRCbG9ja1JlYWRUaW1lIC0gc3RhcnRyZWFkdGltZSkgLyAxMDAwOwoJCQkJZG91YmxlCQl3 cml0ZV9tcyA9IChkb3VibGUpIChwZ1N0YXRCbG9ja1dyaXRlVGltZSAtIHN0YXJ0d3JpdGV0 aW1lKSAvIDEwMDA7CgoJCQkJYXBwZW5kU3RyaW5nSW5mbygmYnVmLCBfKCJJL08gdGltaW5n czogcmVhZDogJS4zZiBtcywgd3JpdGU6ICUuM2YgbXNcbiIpLAoJCQkJCQkJCSByZWFkX21z LCB3cml0ZV9tcyk7CgkJCX0KCQkJYXBwZW5kU3RyaW5nSW5mbygmYnVmLCBfKCJhdmcgcmVh ZCByYXRlOiAlLjNmIE1CL3MsIGF2ZyB3cml0ZSByYXRlOiAlLjNmIE1CL3NcbiIpLAoJCQkJ CQkJIHJlYWRfcmF0ZSwgd3JpdGVfcmF0ZSk7CgkJCWFwcGVuZFN0cmluZ0luZm8oJmJ1Ziwg XygiYnVmZmVyIHVzYWdlOiAlIiBQUklkNjQgIiBoaXRzLCAlIiBQUklkNjQgIiByZWFkcywg JSIgUFJJZDY0ICIgZGlydGllZFxuIiksCgkJCQkJCQkgdG90YWxfYmxrc19oaXQsCgkJCQkJ CQkgdG90YWxfYmxrc19yZWFkLAoJCQkJCQkJIHRvdGFsX2Jsa3NfZGlydGllZCk7CgkJCWFw cGVuZFN0cmluZ0luZm8oJmJ1ZiwKCQkJCQkJCSBfKCJXQUwgdXNhZ2U6ICUiIFBSSWQ2NCAi IHJlY29yZHMsICUiIFBSSWQ2NCAiIGZ1bGwgcGFnZSBpbWFnZXMsICUiIFBSSXU2NCAiIGJ5 dGVzLCAlIiBQUkl1NjQgIiBmdWxsIHBhZ2UgaW1hZ2UgYnl0ZXMsICUiIFBSSWQ2NCAiIGJ1 ZmZlcnMgZnVsbFxuIiksCgkJCQkJCQkgd2FsdXNhZ2Uud2FsX3JlY29yZHMsCgkJCQkJCQkg d2FsdXNhZ2Uud2FsX2ZwaSwKCQkJCQkJCSB3YWx1c2FnZS53YWxfYnl0ZXMsCgkJCQkJCQkg d2FsdXNhZ2Uud2FsX2ZwaV9ieXRlcywKCQkJCQkJCSB3YWx1c2FnZS53YWxfYnVmZmVyc19m dWxsKTsKCQkJYXBwZW5kU3RyaW5nSW5mbygmYnVmLCBfKCJzeXN0ZW0gdXNhZ2U6ICVzIiks IHBnX3J1c2FnZV9zaG93KCZydTApKTsKCgkJCWVyZXBvcnQodmVyYm9zZSA/IElORk8gOiBM T0csCgkJCQkJKGVycm1zZ19pbnRlcm5hbCgiJXMiLCBidWYuZGF0YSkpKTsKCgkJCXBmcmVl KGJ1Zi5kYXRhKTsKCQl9Cgl9CgoJLyogUm9sbCBiYWNrIGFueSBHVUMgY2hhbmdlcyBleGVj dXRlZCBieSBpbmRleCBmdW5jdGlvbnMgKi8KCUF0RU9YYWN0X0dVQyhmYWxzZSwgc2F2ZV9u ZXN0bGV2ZWwpOwoKCS8qIFJlc3RvcmUgdXNlcmlkIGFuZCBzZWN1cml0eSBjb250ZXh0ICov CglTZXRVc2VySWRBbmRTZWNDb250ZXh0KHNhdmVfdXNlcmlkLCBzYXZlX3NlY19jb250ZXh0 KTsKCgkvKiBSZXN0b3JlIGN1cnJlbnQgY29udGV4dCBhbmQgcmVsZWFzZSBtZW1vcnkgKi8K CU1lbW9yeUNvbnRleHRTd2l0Y2hUbyhjYWxsZXJfY29udGV4dCk7CglNZW1vcnlDb250ZXh0 RGVsZXRlKGFubF9jb250ZXh0KTsKCWFubF9jb250ZXh0ID0gTlVMTDsKfQoKLyoKICogQ29t cHV0ZSBzdGF0aXN0aWNzIGFib3V0IGluZGV4ZXMgb2YgYSByZWxhdGlvbgogKi8Kc3RhdGlj IHZvaWQKY29tcHV0ZV9pbmRleF9zdGF0cyhSZWxhdGlvbiBvbmVyZWwsIGRvdWJsZSB0b3Rh bHJvd3MsCgkJCQkJQW5sSW5kZXhEYXRhICppbmRleGRhdGEsIGludCBuaW5kZXhlcywKCQkJ CQlIZWFwVHVwbGUgKnJvd3MsIGludCBudW1yb3dzLAoJCQkJCU1lbW9yeUNvbnRleHQgY29s X2NvbnRleHQpCnsKCU1lbW9yeUNvbnRleHQgaW5kX2NvbnRleHQsCgkJCQlvbGRfY29udGV4 dDsKCURhdHVtCQl2YWx1ZXNbSU5ERVhfTUFYX0tFWVNdOwoJYm9vbAkJaXNudWxsW0lOREVY X01BWF9LRVlTXTsKCWludAkJCWluZCwKCQkJCWk7CgoJaW5kX2NvbnRleHQgPSBBbGxvY1Nl dENvbnRleHRDcmVhdGUoYW5sX2NvbnRleHQsCgkJCQkJCQkJCQkiQW5hbHl6ZSBJbmRleCIs CgkJCQkJCQkJCQlBTExPQ1NFVF9ERUZBVUxUX1NJWkVTKTsKCW9sZF9jb250ZXh0ID0gTWVt b3J5Q29udGV4dFN3aXRjaFRvKGluZF9jb250ZXh0KTsKCglmb3IgKGluZCA9IDA7IGluZCA8 IG5pbmRleGVzOyBpbmQrKykKCXsKCQlBbmxJbmRleERhdGEgKnRoaXNkYXRhID0gJmluZGV4 ZGF0YVtpbmRdOwoJCUluZGV4SW5mbyAgKmluZGV4SW5mbyA9IHRoaXNkYXRhLT5pbmRleElu Zm87CgkJaW50CQkJYXR0cl9jbnQgPSB0aGlzZGF0YS0+YXR0cl9jbnQ7CgkJVHVwbGVUYWJs ZVNsb3QgKnNsb3Q7CgkJRVN0YXRlCSAgICplc3RhdGU7CgkJRXhwckNvbnRleHQgKmVjb250 ZXh0OwoJCUV4cHJTdGF0ZSAgKnByZWRpY2F0ZUV4cGFuZDsKCQlEYXR1bQkgICAqZXhwcnZh bHM7CgkJYm9vbAkgICAqZXhwcm51bGxzOwoJCWludAkJCW51bWluZGV4cm93cywKCQkJCQl0 Y250LAoJCQkJCXJvd25vOwoJCWRvdWJsZQkJdG90YWxpbmRleHJvd3M7CgoJCS8qIElnbm9y ZSBpbmRleCBpZiBubyBjb2x1bW5zIHRvIGFuYWx5emUgYW5kIG5vdCBwYXJ0aWFsICovCgkJ aWYgKGF0dHJfY250ID09IDAgJiYgaW5kZXhJbmZvLT5paV9QcmVkaWNhdGVFeHBhbmQgPT0g TklMKQoJCQljb250aW51ZTsKCgkJLyoKCQkgKiBOZWVkIGFuIEVTdGF0ZSBmb3IgZXZhbHVh dGlvbiBvZiBpbmRleCBleHByZXNzaW9ucyBhbmQKCQkgKiBwYXJ0aWFsLWluZGV4IHByZWRp Y2F0ZXMuICBDcmVhdGUgaXQgaW4gdGhlIHBlci1pbmRleCBjb250ZXh0IHRvIGJlCgkJICog c3VyZSBpdCBnZXRzIGNsZWFuZWQgdXAgYXQgdGhlIGJvdHRvbSBvZiB0aGUgbG9vcC4KCQkg Ki8KCQllc3RhdGUgPSBDcmVhdGVFeGVjdXRvclN0YXRlKCk7CgkJZWNvbnRleHQgPSBHZXRQ ZXJUdXBsZUV4cHJDb250ZXh0KGVzdGF0ZSk7CgkJLyogTmVlZCBhIHNsb3QgdG8gaG9sZCB0 aGUgY3VycmVudCBoZWFwIHR1cGxlLCB0b28gKi8KCQlzbG90ID0gTWFrZVNpbmdsZVR1cGxl VGFibGVTbG90KFJlbGF0aW9uR2V0RGVzY3Iob25lcmVsKSwKCQkJCQkJCQkJCSZUVFNPcHNI ZWFwVHVwbGUpOwoKCQkvKiBBcnJhbmdlIGZvciBlY29udGV4dCdzIHNjYW4gdHVwbGUgdG8g YmUgdGhlIHR1cGxlIHVuZGVyIHRlc3QgKi8KCQllY29udGV4dC0+ZWN4dF9zY2FudHVwbGUg PSBzbG90OwoKCQkvKiBTZXQgdXAgZXhlY3V0aW9uIHN0YXRlIGZvciBwcmVkaWNhdGUuICov CgkJcHJlZGljYXRlRXhwYW5kID0gRXhlY1ByZXBhcmVRdWFsKGluZGV4SW5mby0+aWlfUHJl ZGljYXRlRXhwYW5kLCBlc3RhdGUpOwoKCQkvKiBDb21wdXRlIGFuZCBzYXZlIGluZGV4IGV4 cHJlc3Npb24gdmFsdWVzICovCgkJZXhwcnZhbHMgPSAoRGF0dW0gKikgcGFsbG9jKG51bXJv d3MgKiBhdHRyX2NudCAqIHNpemVvZihEYXR1bSkpOwoJCWV4cHJudWxscyA9IChib29sICop IHBhbGxvYyhudW1yb3dzICogYXR0cl9jbnQgKiBzaXplb2YoYm9vbCkpOwoJCW51bWluZGV4 cm93cyA9IDA7CgkJdGNudCA9IDA7CgkJZm9yIChyb3dubyA9IDA7IHJvd25vIDwgbnVtcm93 czsgcm93bm8rKykKCQl7CgkJCUhlYXBUdXBsZQloZWFwVHVwbGUgPSByb3dzW3Jvd25vXTsK CgkJCXZhY3V1bV9kZWxheV9wb2ludCh0cnVlKTsKCgkJCS8qCgkJCSAqIFJlc2V0IHRoZSBw ZXItdHVwbGUgY29udGV4dCBlYWNoIHRpbWUsIHRvIHJlY2xhaW0gYW55IGNydWZ0CgkJCSAq IGxlZnQgYmVoaW5kIGJ5IGV2YWx1YXRpbmcgdGhlIHByZWRpY2F0ZSBvciBpbmRleCBleHBy ZXNzaW9ucy4KCQkJICovCgkJCVJlc2V0RXhwckNvbnRleHQoZWNvbnRleHQpOwoKCQkJLyog U2V0IHVwIGZvciBwcmVkaWNhdGUgb3IgZXhwcmVzc2lvbiBldmFsdWF0aW9uICovCgkJCUV4 ZWNTdG9yZUhlYXBUdXBsZShoZWFwVHVwbGUsIHNsb3QsIGZhbHNlKTsKCgkJCS8qIElmIGlu ZGV4IGlzIHBhcnRpYWwsIGNoZWNrIHByZWRpY2F0ZSAqLwoJCQlpZiAocHJlZGljYXRlRXhw YW5kICE9IE5VTEwpCgkJCXsKCQkJCWlmICghRXhlY1F1YWwocHJlZGljYXRlRXhwYW5kLCBl Y29udGV4dCkpCgkJCQkJY29udGludWU7CgkJCX0KCQkJbnVtaW5kZXhyb3dzKys7CgoJCQlp ZiAoYXR0cl9jbnQgPiAwKQoJCQl7CgkJCQkvKgoJCQkJICogRXZhbHVhdGUgdGhlIGluZGV4 IHJvdyB0byBjb21wdXRlIGV4cHJlc3Npb24gdmFsdWVzLiBXZQoJCQkJICogY291bGQgZG8g dGhpcyBieSBoYW5kLCBidXQgRm9ybUluZGV4RGF0dW0gaXMgY29udmVuaWVudC4KCQkJCSAq LwoJCQkJRm9ybUluZGV4RGF0dW0oaW5kZXhJbmZvLAoJCQkJCQkJICAgc2xvdCwKCQkJCQkJ CSAgIGVzdGF0ZSwKCQkJCQkJCSAgIHZhbHVlcywKCQkJCQkJCSAgIGlzbnVsbCk7CgoJCQkJ LyoKCQkJCSAqIFNhdmUganVzdCB0aGUgY29sdW1ucyB3ZSBjYXJlIGFib3V0LiAgV2UgY29w eSB0aGUgdmFsdWVzCgkJCQkgKiBpbnRvIGluZF9jb250ZXh0IGZyb20gdGhlIGVzdGF0ZSdz IHBlci10dXBsZSBjb250ZXh0LgoJCQkJICovCgkJCQlmb3IgKGkgPSAwOyBpIDwgYXR0cl9j bnQ7IGkrKykKCQkJCXsKCQkJCQlWYWNBdHRyU3RhdHMgKnN0YXRzID0gdGhpc2RhdGEtPnZh Y2F0dHJzdGF0c1tpXTsKCQkJCQlpbnQJCQlhdHRudW0gPSBzdGF0cy0+dHVwYXR0bnVtOwoK CQkJCQlpZiAoaXNudWxsW2F0dG51bSAtIDFdKQoJCQkJCXsKCQkJCQkJZXhwcnZhbHNbdGNu dF0gPSAoRGF0dW0pIDA7CgkJCQkJCWV4cHJudWxsc1t0Y250XSA9IHRydWU7CgkJCQkJfQoJ CQkJCWVsc2UKCQkJCQl7CgkJCQkJCWV4cHJ2YWxzW3RjbnRdID0gZGF0dW1Db3B5KHZhbHVl c1thdHRudW0gLSAxXSwKCQkJCQkJCQkJCQkJICAgc3RhdHMtPmF0dHJ0eXBlLT50eXBieXZh bCwKCQkJCQkJCQkJCQkJICAgc3RhdHMtPmF0dHJ0eXBlLT50eXBsZW4pOwoJCQkJCQlleHBy bnVsbHNbdGNudF0gPSBmYWxzZTsKCQkJCQl9CgkJCQkJdGNudCsrOwoJCQkJfQoJCQl9CgkJ fQoKCQkvKgoJCSAqIEhhdmluZyBjb3VudGVkIHRoZSBudW1iZXIgb2Ygcm93cyB0aGF0IHBh c3MgdGhlIHByZWRpY2F0ZSBpbiB0aGUKCQkgKiBzYW1wbGUsIHdlIGNhbiBlc3RpbWF0ZSB0 aGUgdG90YWwgbnVtYmVyIG9mIHJvd3MgaW4gdGhlIGluZGV4LgoJCSAqLwoJCXRoaXNkYXRh LT50dXBsZUZyYWN0ID0gKGRvdWJsZSkgbnVtaW5kZXhyb3dzIC8gKGRvdWJsZSkgbnVtcm93 czsKCQl0b3RhbGluZGV4cm93cyA9IGNlaWwodGhpc2RhdGEtPnR1cGxlRnJhY3QgKiB0b3Rh bHJvd3MpOwoKCQkvKgoJCSAqIE5vdyB3ZSBjYW4gY29tcHV0ZSB0aGUgc3RhdGlzdGljcyBm b3IgdGhlIGV4cHJlc3Npb24gY29sdW1ucy4KCQkgKi8KCQlpZiAobnVtaW5kZXhyb3dzID4g MCkKCQl7CgkJCU1lbW9yeUNvbnRleHRTd2l0Y2hUbyhjb2xfY29udGV4dCk7CgkJCWZvciAo aSA9IDA7IGkgPCBhdHRyX2NudDsgaSsrKQoJCQl7CgkJCQlWYWNBdHRyU3RhdHMgKnN0YXRz ID0gdGhpc2RhdGEtPnZhY2F0dHJzdGF0c1tpXTsKCgkJCQlzdGF0cy0+ZXhwcnZhbHMgPSBl eHBydmFscyArIGk7CgkJCQlzdGF0cy0+ZXhwcm51bGxzID0gZXhwcm51bGxzICsgaTsKCQkJ CXN0YXRzLT5yb3dzdHJpZGUgPSBhdHRyX2NudDsKCQkJCXN0YXRzLT5jb21wdXRlX3N0YXRz KHN0YXRzLAoJCQkJCQkJCQkgaW5kX2ZldGNoX2Z1bmMsCgkJCQkJCQkJCSBudW1pbmRleHJv d3MsCgkJCQkJCQkJCSB0b3RhbGluZGV4cm93cyk7CgoJCQkJTWVtb3J5Q29udGV4dFJlc2V0 KGNvbF9jb250ZXh0KTsKCQkJfQoJCX0KCgkJLyogQW5kIGNsZWFuIHVwICovCgkJTWVtb3J5 Q29udGV4dFN3aXRjaFRvKGluZF9jb250ZXh0KTsKCgkJRXhlY0Ryb3BTaW5nbGVUdXBsZVRh YmxlU2xvdChzbG90KTsKCQlGcmVlRXhlY3V0b3JTdGF0ZShlc3RhdGUpOwoJCU1lbW9yeUNv bnRleHRSZXNldChpbmRfY29udGV4dCk7Cgl9CgoJTWVtb3J5Q29udGV4dFN3aXRjaFRvKG9s ZF9jb250ZXh0KTsKCU1lbW9yeUNvbnRleHREZWxldGUoaW5kX2NvbnRleHQpOwp9CgovKgog KiB2YWxpZGF0ZV92YV9jb2xzX2xpc3QgLS0gdmFsaWRhdGUgdGhlIGNvbHVtbnMgbGlzdCBn aXZlbiB0byBhbmFseXplX3JlbAogKgogKiBOb3RlIHRoYXQgc3lzdGVtIGF0dHJpYnV0ZXMg YXJlIG5ldmVyIGFuYWx5emVkLCBzbyB3ZSBqdXN0IHJlamVjdCB0aGVtIGF0CiAqIHRoZSBs b29rdXAgc3RhZ2UuICBXZSBhbHNvIHJlamVjdCBkdXBsaWNhdGUgY29sdW1uIG1lbnRpb25z LiAgKFdlIGNvdWxkCiAqIGFsdGVybmF0aXZlbHkgaWdub3JlIGR1cGxpY2F0ZXMsIGJ1dCBh bmFseXppbmcgYSBjb2x1bW4gdHdpY2Ugd29uJ3Qgd29yazsKICogd2UnZCBlbmQgdXAgbWFr aW5nIGEgY29uZmxpY3RpbmcgdXBkYXRlIGluIHBnX3N0YXRpc3RpYy4pCiAqLwpzdGF0aWMg dm9pZAp2YWxpZGF0ZV92YV9jb2xzX2xpc3QoUmVsYXRpb24gb25lcmVsLCBMaXN0ICp2YV9j b2xzKQp7CglCaXRtYXBzZXQgICp1bmlxdWVfY29scyA9IE5VTEw7CglMaXN0Q2VsbCAgICps ZTsKCglBc3NlcnQodmFfY29scyAhPSBOSUwpOwoJZm9yZWFjaChsZSwgdmFfY29scykKCXsK CQljaGFyCSAgICpjb2wgPSBzdHJWYWwobGZpcnN0KGxlKSk7CgkJaW50CQkJaSA9IGF0dG5h bWVBdHROdW0ob25lcmVsLCBjb2wsIGZhbHNlKTsKCgkJaWYgKGkgPT0gSW52YWxpZEF0dHJO dW1iZXIpCgkJCWVyZXBvcnQoRVJST1IsCgkJCQkJKGVycmNvZGUoRVJSQ09ERV9VTkRFRklO RURfQ09MVU1OKSwKCQkJCQkgZXJybXNnKCJjb2x1bW4gXCIlc1wiIG9mIHJlbGF0aW9uIFwi JXNcIiBkb2VzIG5vdCBleGlzdCIsCgkJCQkJCQljb2wsIFJlbGF0aW9uR2V0UmVsYXRpb25O YW1lKG9uZXJlbCkpKSk7CgkJaWYgKGJtc19pc19tZW1iZXIoaSwgdW5pcXVlX2NvbHMpKQoJ CQllcmVwb3J0KEVSUk9SLAoJCQkJCShlcnJjb2RlKEVSUkNPREVfRFVQTElDQVRFX0NPTFVN TiksCgkJCQkJIGVycm1zZygiY29sdW1uIFwiJXNcIiBvZiByZWxhdGlvbiBcIiVzXCIgYXBw ZWFycyBtb3JlIHRoYW4gb25jZSIsCgkJCQkJCQljb2wsIFJlbGF0aW9uR2V0UmVsYXRpb25O YW1lKG9uZXJlbCkpKSk7CgkJdW5pcXVlX2NvbHMgPSBibXNfYWRkX21lbWJlcih1bmlxdWVf Y29scywgaSk7Cgl9Cn0KCi8qCiAqIGV4YW1pbmVfYXR0cmlidXRlIC0tIHByZS1hbmFseXNp cyBvZiBhIHNpbmdsZSBjb2x1bW4KICoKICogRGV0ZXJtaW5lIHdoZXRoZXIgdGhlIGNvbHVt biBpcyBhbmFseXphYmxlOyBpZiBzbywgY3JlYXRlIGFuZCBpbml0aWFsaXplCiAqIGEgVmFj QXR0clN0YXRzIHN0cnVjdCBmb3IgaXQuICBJZiBub3QsIHJldHVybiBOVUxMLgogKgogKiBJ ZiBpbmRleF9leHByIGlzbid0IE5VTEwsIHRoZW4gd2UncmUgdHJ5aW5nIHRvIGFuYWx5emUg YW4gZXhwcmVzc2lvbiBpbmRleCwKICogYW5kIGluZGV4X2V4cHIgaXMgdGhlIGV4cHJlc3Np b24gdHJlZSByZXByZXNlbnRpbmcgdGhlIGNvbHVtbidzIGRhdGEuCiAqLwpzdGF0aWMgVmFj QXR0clN0YXRzICoKZXhhbWluZV9hdHRyaWJ1dGUoUmVsYXRpb24gb25lcmVsLCBpbnQgYXR0 bnVtLCBOb2RlICppbmRleF9leHByKQp7CglGb3JtX3BnX2F0dHJpYnV0ZSBhdHRyID0gVHVw bGVEZXNjQXR0cihvbmVyZWwtPnJkX2F0dCwgYXR0bnVtIC0gMSk7CglpbnQJCQlhdHRzdGF0 dGFyZ2V0OwoJSGVhcFR1cGxlCXR5cHR1cGxlOwoJVmFjQXR0clN0YXRzICpzdGF0czsKCWlu dAkJCWk7Cglib29sCQlvazsKCgkvKgoJICogQ2hlY2sgaWYgdGhlIGNvbHVtbiBpcyBhbmFs eXphYmxlLgoJICovCglpZiAoIWF0dHJpYnV0ZV9pc19hbmFseXphYmxlKG9uZXJlbCwgYXR0 bnVtLCBhdHRyLCAmYXR0c3RhdHRhcmdldCkpCgkJcmV0dXJuIE5VTEw7CgoJLyoKCSAqIENy ZWF0ZSB0aGUgVmFjQXR0clN0YXRzIHN0cnVjdC4KCSAqLwoJc3RhdHMgPSBwYWxsb2MwX29i amVjdChWYWNBdHRyU3RhdHMpOwoJc3RhdHMtPmF0dHN0YXR0YXJnZXQgPSBhdHRzdGF0dGFy Z2V0OwoKCS8qCgkgKiBXaGVuIGFuYWx5emluZyBhbiBleHByZXNzaW9uIGluZGV4LCBiZWxp ZXZlIHRoZSBleHByZXNzaW9uIHRyZWUncyB0eXBlCgkgKiBub3QgdGhlIGNvbHVtbiBkYXRh dHlwZSAtLS0gdGhlIGxhdHRlciBtaWdodCBiZSB0aGUgb3Bja2V5dHlwZSBzdG9yYWdlCgkg KiB0eXBlIG9mIHRoZSBvcGNsYXNzLCB3aGljaCBpcyBub3QgaW50ZXJlc3RpbmcgZm9yIG91 ciBwdXJwb3Nlcy4gIChOb3RlOgoJICogaWYgd2UgZGlkIGFueXRoaW5nIHdpdGggbm9uLWV4 cHJlc3Npb24gaW5kZXggY29sdW1ucywgd2UnZCBuZWVkIHRvCgkgKiBmaWd1cmUgb3V0IHdo ZXJlIHRvIGdldCB0aGUgY29ycmVjdCB0eXBlIGluZm8gZnJvbSwgYnV0IGZvciBub3cgdGhh dCdzCgkgKiBub3QgYSBwcm9ibGVtLikJSXQncyBub3QgY2xlYXIgd2hldGhlciBhbnlvbmUg d2lsbCBjYXJlIGFib3V0IHRoZQoJICogdHlwbW9kLCBidXQgd2Ugc3RvcmUgdGhhdCB0b28g anVzdCBpbiBjYXNlLgoJICovCglpZiAoaW5kZXhfZXhwcikKCXsKCQlzdGF0cy0+YXR0cnR5 cGlkID0gZXhwclR5cGUoaW5kZXhfZXhwcik7CgkJc3RhdHMtPmF0dHJ0eXBtb2QgPSBleHBy VHlwbW9kKGluZGV4X2V4cHIpOwoKCQkvKgoJCSAqIElmIGEgY29sbGF0aW9uIGhhcyBiZWVu IHNwZWNpZmllZCBmb3IgdGhlIGluZGV4IGNvbHVtbiwgdXNlIHRoYXQgaW4KCQkgKiBwcmVm ZXJlbmNlIHRvIGFueXRoaW5nIGVsc2U7IGJ1dCBpZiBub3QsIGZhbGwgYmFjayB0byB3aGF0 ZXZlciB3ZQoJCSAqIGNhbiBnZXQgZnJvbSB0aGUgZXhwcmVzc2lvbi4KCQkgKi8KCQlpZiAo T2lkSXNWYWxpZChvbmVyZWwtPnJkX2luZGNvbGxhdGlvblthdHRudW0gLSAxXSkpCgkJCXN0 YXRzLT5hdHRyY29sbGlkID0gb25lcmVsLT5yZF9pbmRjb2xsYXRpb25bYXR0bnVtIC0gMV07 CgkJZWxzZQoJCQlzdGF0cy0+YXR0cmNvbGxpZCA9IGV4cHJDb2xsYXRpb24oaW5kZXhfZXhw cik7Cgl9CgllbHNlCgl7CgkJc3RhdHMtPmF0dHJ0eXBpZCA9IGF0dHItPmF0dHR5cGlkOwoJ CXN0YXRzLT5hdHRydHlwbW9kID0gYXR0ci0+YXR0dHlwbW9kOwoJCXN0YXRzLT5hdHRyY29s bGlkID0gYXR0ci0+YXR0Y29sbGF0aW9uOwoJfQoKCXR5cHR1cGxlID0gU2VhcmNoU3lzQ2Fj aGVDb3B5MShUWVBFT0lELAoJCQkJCQkJCSAgIE9iamVjdElkR2V0RGF0dW0oc3RhdHMtPmF0 dHJ0eXBpZCkpOwoJaWYgKCFIZWFwVHVwbGVJc1ZhbGlkKHR5cHR1cGxlKSkKCQllbG9nKEVS Uk9SLCAiY2FjaGUgbG9va3VwIGZhaWxlZCBmb3IgdHlwZSAldSIsIHN0YXRzLT5hdHRydHlw aWQpOwoJc3RhdHMtPmF0dHJ0eXBlID0gKEZvcm1fcGdfdHlwZSkgR0VUU1RSVUNUKHR5cHR1 cGxlKTsKCXN0YXRzLT5hbmxfY29udGV4dCA9IGFubF9jb250ZXh0OwoJc3RhdHMtPnR1cGF0 dG51bSA9IGF0dG51bTsKCgkvKgoJICogVGhlIGZpZWxkcyBkZXNjcmliaW5nIHRoZSBzdGF0 cy0+c3RhdmFsdWVzW25dIGVsZW1lbnQgdHlwZXMgZGVmYXVsdCB0bwoJICogdGhlIHR5cGUg b2YgdGhlIGRhdGEgYmVpbmcgYW5hbHl6ZWQsIGJ1dCB0aGUgdHlwZS1zcGVjaWZpYyB0eXBh bmFseXplCgkgKiBmdW5jdGlvbiBjYW4gY2hhbmdlIHRoZW0gaWYgaXQgd2FudHMgdG8gc3Rv cmUgc29tZXRoaW5nIGVsc2UuCgkgKi8KCWZvciAoaSA9IDA7IGkgPCBTVEFUSVNUSUNfTlVN X1NMT1RTOyBpKyspCgl7CgkJc3RhdHMtPnN0YXR5cGlkW2ldID0gc3RhdHMtPmF0dHJ0eXBp ZDsKCQlzdGF0cy0+c3RhdHlwbGVuW2ldID0gc3RhdHMtPmF0dHJ0eXBlLT50eXBsZW47CgkJ c3RhdHMtPnN0YXR5cGJ5dmFsW2ldID0gc3RhdHMtPmF0dHJ0eXBlLT50eXBieXZhbDsKCQlz dGF0cy0+c3RhdHlwYWxpZ25baV0gPSBzdGF0cy0+YXR0cnR5cGUtPnR5cGFsaWduOwoJfQoK CS8qCgkgKiBDYWxsIHRoZSB0eXBlLXNwZWNpZmljIHR5cGFuYWx5emUgZnVuY3Rpb24uICBJ ZiBub25lIGlzIHNwZWNpZmllZCwgdXNlCgkgKiBzdGRfdHlwYW5hbHl6ZSgpLgoJICovCglp ZiAoT2lkSXNWYWxpZChzdGF0cy0+YXR0cnR5cGUtPnR5cGFuYWx5emUpKQoJCW9rID0gRGF0 dW1HZXRCb29sKE9pZEZ1bmN0aW9uQ2FsbDEoc3RhdHMtPmF0dHJ0eXBlLT50eXBhbmFseXpl LAoJCQkJCQkJCQkJICAgUG9pbnRlckdldERhdHVtKHN0YXRzKSkpOwoJZWxzZQoJCW9rID0g c3RkX3R5cGFuYWx5emUoc3RhdHMpOwoKCWlmICghb2sgfHwgc3RhdHMtPmNvbXB1dGVfc3Rh dHMgPT0gTlVMTCB8fCBzdGF0cy0+bWlucm93cyA8PSAwKQoJewoJCWhlYXBfZnJlZXR1cGxl KHR5cHR1cGxlKTsKCQlwZnJlZShzdGF0cyk7CgkJcmV0dXJuIE5VTEw7Cgl9CgoJcmV0dXJu IHN0YXRzOwp9Cgpib29sCmF0dHJpYnV0ZV9pc19hbmFseXphYmxlKFJlbGF0aW9uIG9uZXJl bCwgaW50IGF0dG51bSwgRm9ybV9wZ19hdHRyaWJ1dGUgYXR0ciwKCQkJCQkJaW50ICpwX2F0 dHN0YXR0YXJnZXQpCnsKCWludAkJCWF0dHN0YXR0YXJnZXQ7CglIZWFwVHVwbGUJYXR0dHVw bGU7CglEYXR1bQkJZGF0OwoJYm9vbAkJaXNudWxsOwoKCS8qIE5ldmVyIGFuYWx5emUgZHJv cHBlZCBjb2x1bW5zICovCglpZiAoYXR0ci0+YXR0aXNkcm9wcGVkKQoJCXJldHVybiBmYWxz ZTsKCgkvKiBEb24ndCBhbmFseXplIHZpcnR1YWwgZ2VuZXJhdGVkIGNvbHVtbnMgKi8KCWlm IChhdHRyLT5hdHRnZW5lcmF0ZWQgPT0gQVRUUklCVVRFX0dFTkVSQVRFRF9WSVJUVUFMKQoJ CXJldHVybiBmYWxzZTsKCgkvKgoJICogR2V0IGF0dHN0YXR0YXJnZXQgdmFsdWUuICBTZXQg dG8gLTEgaWYgbnVsbC4gIChBbmFseXplIGZ1bmN0aW9ucyBleHBlY3QKCSAqIC0xIHRvIG1l YW4gdXNlIGRlZmF1bHRfc3RhdGlzdGljc190YXJnZXQ7IHNlZSBmb3IgZXhhbXBsZQoJICog c3RkX3R5cGFuYWx5emUuKQoJICovCglhdHR0dXBsZSA9IFNlYXJjaFN5c0NhY2hlMihBVFRO VU0sIE9iamVjdElkR2V0RGF0dW0oUmVsYXRpb25HZXRSZWxpZChvbmVyZWwpKSwgSW50MTZH ZXREYXR1bShhdHRudW0pKTsKCWlmICghSGVhcFR1cGxlSXNWYWxpZChhdHR0dXBsZSkpCgkJ ZWxvZyhFUlJPUiwgImNhY2hlIGxvb2t1cCBmYWlsZWQgZm9yIGF0dHJpYnV0ZSAlZCBvZiBy ZWxhdGlvbiAldSIsCgkJCSBhdHRudW0sIFJlbGF0aW9uR2V0UmVsaWQob25lcmVsKSk7Cglk YXQgPSBTeXNDYWNoZUdldEF0dHIoQVRUTlVNLCBhdHR0dXBsZSwgQW51bV9wZ19hdHRyaWJ1 dGVfYXR0c3RhdHRhcmdldCwgJmlzbnVsbCk7CglhdHRzdGF0dGFyZ2V0ID0gaXNudWxsID8g LTEgOiBEYXR1bUdldEludDE2KGRhdCk7CglSZWxlYXNlU3lzQ2FjaGUoYXR0dHVwbGUpOwoK CS8qIERvbid0IGFuYWx5emUgY29sdW1uIGlmIHVzZXIgaGFzIHNwZWNpZmllZCBub3QgdG8g Ki8KCWlmIChhdHRzdGF0dGFyZ2V0ID09IDApCgkJcmV0dXJuIGZhbHNlOwoKCWlmIChwX2F0 dHN0YXR0YXJnZXQpCgkJKnBfYXR0c3RhdHRhcmdldCA9IGF0dHN0YXR0YXJnZXQ7CglyZXR1 cm4gdHJ1ZTsKfQoKLyoKICogUmVhZCBzdHJlYW0gY2FsbGJhY2sgcmV0dXJuaW5nIHRoZSBu ZXh0IEJsb2NrTnVtYmVyIGFzIGNob3NlbiBieSB0aGUKICogQmxvY2tTYW1wbGluZyBhbGdv cml0aG0uCiAqLwpzdGF0aWMgQmxvY2tOdW1iZXIKYmxvY2tfc2FtcGxpbmdfcmVhZF9zdHJl YW1fbmV4dChSZWFkU3RyZWFtICpzdHJlYW0sCgkJCQkJCQkJdm9pZCAqY2FsbGJhY2tfcHJp dmF0ZV9kYXRhLAoJCQkJCQkJCXZvaWQgKnBlcl9idWZmZXJfZGF0YSkKewoJQmxvY2tTYW1w bGVyRGF0YSAqYnMgPSBjYWxsYmFja19wcml2YXRlX2RhdGE7CgoJcmV0dXJuIEJsb2NrU2Ft cGxlcl9IYXNNb3JlKGJzKSA/IEJsb2NrU2FtcGxlcl9OZXh0KGJzKSA6IEludmFsaWRCbG9j a051bWJlcjsKfQoKLyoKICogYWNxdWlyZV9zYW1wbGVfcm93cyAtLSBhY3F1aXJlIGEgcmFu ZG9tIHNhbXBsZSBvZiByb3dzIGZyb20gdGhlIHRhYmxlCiAqCiAqIFNlbGVjdGVkIHJvd3Mg YXJlIHJldHVybmVkIGluIHRoZSBjYWxsZXItYWxsb2NhdGVkIGFycmF5IHJvd3NbXSwgd2hp Y2gKICogbXVzdCBoYXZlIGF0IGxlYXN0IHRhcmdyb3dzIGVudHJpZXMuCiAqIFRoZSBhY3R1 YWwgbnVtYmVyIG9mIHJvd3Mgc2VsZWN0ZWQgaXMgcmV0dXJuZWQgYXMgdGhlIGZ1bmN0aW9u IHJlc3VsdC4KICogV2UgYWxzbyBlc3RpbWF0ZSB0aGUgdG90YWwgbnVtYmVycyBvZiBsaXZl IGFuZCBkZWFkIHJvd3MgaW4gdGhlIHRhYmxlLAogKiBhbmQgcmV0dXJuIHRoZW0gaW50byAq dG90YWxyb3dzIGFuZCAqdG90YWxkZWFkcm93cywgcmVzcGVjdGl2ZWx5LgogKgogKiBUaGUg cmV0dXJuZWQgbGlzdCBvZiB0dXBsZXMgaXMgaW4gb3JkZXIgYnkgcGh5c2ljYWwgcG9zaXRp b24gaW4gdGhlIHRhYmxlLgogKiAoV2Ugd2lsbCByZWx5IG9uIHRoaXMgbGF0ZXIgdG8gZGVy aXZlIGNvcnJlbGF0aW9uIGVzdGltYXRlcy4pCiAqCiAqIEFzIG9mIE1heSAyMDA0IHdlIHVz ZSBhIG5ldyB0d28tc3RhZ2UgbWV0aG9kOiAgU3RhZ2Ugb25lIHNlbGVjdHMgdXAKICogdG8g dGFyZ3Jvd3MgcmFuZG9tIGJsb2NrcyAob3IgYWxsIGJsb2NrcywgaWYgdGhlcmUgYXJlbid0 IHNvIG1hbnkpLgogKiBTdGFnZSB0d28gc2NhbnMgdGhlc2UgYmxvY2tzIGFuZCB1c2VzIHRo ZSBWaXR0ZXIgYWxnb3JpdGhtIHRvIGNyZWF0ZQogKiBhIHJhbmRvbSBzYW1wbGUgb2YgdGFy Z3Jvd3Mgcm93cyAob3IgbGVzcywgaWYgdGhlcmUgYXJlIGxlc3MgaW4gdGhlCiAqIHNhbXBs ZSBvZiBibG9ja3MpLiAgVGhlIHR3byBzdGFnZXMgYXJlIGV4ZWN1dGVkIHNpbXVsdGFuZW91 c2x5OiBlYWNoCiAqIGJsb2NrIGlzIHByb2Nlc3NlZCBhcyBzb29uIGFzIHN0YWdlIG9uZSBy ZXR1cm5zIGl0cyBudW1iZXIgYW5kIHdoaWxlCiAqIHRoZSByb3dzIGFyZSByZWFkIHN0YWdl IHR3byBjb250cm9scyB3aGljaCBvbmVzIGFyZSB0byBiZSBpbnNlcnRlZAogKiBpbnRvIHRo ZSBzYW1wbGUuCiAqCiAqIEFsdGhvdWdoIGV2ZXJ5IHJvdyBoYXMgYW4gZXF1YWwgY2hhbmNl IG9mIGVuZGluZyB1cCBpbiB0aGUgZmluYWwKICogc2FtcGxlLCB0aGlzIHNhbXBsaW5nIG1l dGhvZCBpcyBub3QgcGVyZmVjdDogbm90IGV2ZXJ5IHBvc3NpYmxlCiAqIHNhbXBsZSBoYXMg YW4gZXF1YWwgY2hhbmNlIG9mIGJlaW5nIHNlbGVjdGVkLiAgRm9yIGxhcmdlIHJlbGF0aW9u cwogKiB0aGUgbnVtYmVyIG9mIGRpZmZlcmVudCBibG9ja3MgcmVwcmVzZW50ZWQgYnkgdGhl IHNhbXBsZSB0ZW5kcyB0byBiZQogKiB0b28gc21hbGwuICBXZSBjYW4gbGl2ZSB3aXRoIHRo YXQgZm9yIG5vdy4gIEltcHJvdmVtZW50cyBhcmUgd2VsY29tZS4KICoKICogQW4gaW1wb3J0 YW50IHByb3BlcnR5IG9mIHRoaXMgc2FtcGxpbmcgbWV0aG9kIGlzIHRoYXQgYmVjYXVzZSB3 ZSBkbwogKiBsb29rIGF0IGEgc3RhdGlzdGljYWxseSB1bmJpYXNlZCBzZXQgb2YgYmxvY2tz LCB3ZSBzaG91bGQgZ2V0CiAqIHVuYmlhc2VkIGVzdGltYXRlcyBvZiB0aGUgYXZlcmFnZSBu dW1iZXJzIG9mIGxpdmUgYW5kIGRlYWQgcm93cyBwZXIKICogYmxvY2suICBUaGUgcHJldmlv dXMgc2FtcGxpbmcgbWV0aG9kIHB1dCB0b28gbXVjaCBjcmVkZW5jZSBpbiB0aGUgcm93CiAq IGRlbnNpdHkgbmVhciB0aGUgc3RhcnQgb2YgdGhlIHRhYmxlLgogKi8Kc3RhdGljIGludAph Y3F1aXJlX3NhbXBsZV9yb3dzKFJlbGF0aW9uIG9uZXJlbCwgaW50IGVsZXZlbCwKCQkJCQlI ZWFwVHVwbGUgKnJvd3MsIGludCB0YXJncm93cywKCQkJCQlkb3VibGUgKnRvdGFscm93cywg ZG91YmxlICp0b3RhbGRlYWRyb3dzKQp7CglpbnQJCQludW1yb3dzID0gMDsJLyogIyByb3dz IG5vdyBpbiByZXNlcnZvaXIgKi8KCWRvdWJsZQkJc2FtcGxlcm93cyA9IDA7IC8qIHRvdGFs ICMgcm93cyBjb2xsZWN0ZWQgKi8KCWRvdWJsZQkJbGl2ZXJvd3MgPSAwOwkvKiAjIGxpdmUg cm93cyBzZWVuICovCglkb3VibGUJCWRlYWRyb3dzID0gMDsJLyogIyBkZWFkIHJvd3Mgc2Vl biAqLwoJZG91YmxlCQlyb3dzdG9za2lwID0gLTE7CS8qIC0xIG1lYW5zIG5vdCBzZXQgeWV0 ICovCgl1aW50MzIJCXJhbmRzZWVkOwkJLyogU2VlZCBmb3IgYmxvY2sgc2FtcGxlcihzKSAq LwoJQmxvY2tOdW1iZXIgdG90YWxibG9ja3M7CglCbG9ja1NhbXBsZXJEYXRhIGJzOwoJUmVz ZXJ2b2lyU3RhdGVEYXRhIHJzdGF0ZTsKCVR1cGxlVGFibGVTbG90ICpzbG90OwoJVGFibGVT Y2FuRGVzYyBzY2FuOwoJQmxvY2tOdW1iZXIgbmJsb2NrczsKCUJsb2NrTnVtYmVyIGJsa3Nk b25lID0gMDsKCVJlYWRTdHJlYW0gKnN0cmVhbTsKCglBc3NlcnQodGFyZ3Jvd3MgPiAwKTsK Cgl0b3RhbGJsb2NrcyA9IFJlbGF0aW9uR2V0TnVtYmVyT2ZCbG9ja3Mob25lcmVsKTsKCgkv KiBQcmVwYXJlIGZvciBzYW1wbGluZyBibG9jayBudW1iZXJzICovCglyYW5kc2VlZCA9IHBn X3BybmdfdWludDMyKCZwZ19nbG9iYWxfcHJuZ19zdGF0ZSk7CgluYmxvY2tzID0gQmxvY2tT YW1wbGVyX0luaXQoJmJzLCB0b3RhbGJsb2NrcywgdGFyZ3Jvd3MsIHJhbmRzZWVkKTsKCgkv KiBSZXBvcnQgc2FtcGxpbmcgYmxvY2sgbnVtYmVycyAqLwoJcGdzdGF0X3Byb2dyZXNzX3Vw ZGF0ZV9wYXJhbShQUk9HUkVTU19BTkFMWVpFX0JMT0NLU19UT1RBTCwKCQkJCQkJCQkgbmJs b2Nrcyk7CgoJLyogUHJlcGFyZSBmb3Igc2FtcGxpbmcgcm93cyAqLwoJcmVzZXJ2b2lyX2lu aXRfc2VsZWN0aW9uX3N0YXRlKCZyc3RhdGUsIHRhcmdyb3dzKTsKCglzY2FuID0gdGFibGVf YmVnaW5zY2FuX2FuYWx5emUob25lcmVsKTsKCXNsb3QgPSB0YWJsZV9zbG90X2NyZWF0ZShv bmVyZWwsIE5VTEwpOwoKCS8qCgkgKiBJdCBpcyBzYWZlIHRvIHVzZSBiYXRjaGluZywgYXMg YmxvY2tfc2FtcGxpbmdfcmVhZF9zdHJlYW1fbmV4dCBuZXZlcgoJICogYmxvY2tzLgoJICov CglzdHJlYW0gPSByZWFkX3N0cmVhbV9iZWdpbl9yZWxhdGlvbihSRUFEX1NUUkVBTV9NQUlO VEVOQU5DRSB8CgkJCQkJCQkJCQlSRUFEX1NUUkVBTV9VU0VfQkFUQ0hJTkcsCgkJCQkJCQkJ CQl2YWNfc3RyYXRlZ3ksCgkJCQkJCQkJCQlzY2FuLT5yc19yZCwKCQkJCQkJCQkJCU1BSU5f Rk9SS05VTSwKCQkJCQkJCQkJCWJsb2NrX3NhbXBsaW5nX3JlYWRfc3RyZWFtX25leHQsCgkJ CQkJCQkJCQkmYnMsCgkJCQkJCQkJCQkwKTsKCgkvKiBPdXRlciBsb29wIG92ZXIgYmxvY2tz IHRvIHNhbXBsZSAqLwoJd2hpbGUgKHRhYmxlX3NjYW5fYW5hbHl6ZV9uZXh0X2Jsb2NrKHNj YW4sIHN0cmVhbSkpCgl7CgkJdmFjdXVtX2RlbGF5X3BvaW50KHRydWUpOwoKCQl3aGlsZSAo dGFibGVfc2Nhbl9hbmFseXplX25leHRfdHVwbGUoc2NhbiwgJmxpdmVyb3dzLCAmZGVhZHJv d3MsIHNsb3QpKQoJCXsKCQkJLyoKCQkJICogVGhlIGZpcnN0IHRhcmdyb3dzIHNhbXBsZSBy b3dzIGFyZSBzaW1wbHkgY29waWVkIGludG8gdGhlCgkJCSAqIHJlc2Vydm9pci4gVGhlbiB3 ZSBzdGFydCByZXBsYWNpbmcgdHVwbGVzIGluIHRoZSBzYW1wbGUgdW50aWwKCQkJICogd2Ug cmVhY2ggdGhlIGVuZCBvZiB0aGUgcmVsYXRpb24uICBUaGlzIGFsZ29yaXRobSBpcyBmcm9t IEplZmYKCQkJICogVml0dGVyJ3MgcGFwZXIgKHNlZSBmdWxsIGNpdGF0aW9uIGluIHV0aWxz L21pc2Mvc2FtcGxpbmcuYykuIEl0CgkJCSAqIHdvcmtzIGJ5IHJlcGVhdGVkbHkgY29tcHV0 aW5nIHRoZSBudW1iZXIgb2YgdHVwbGVzIHRvIHNraXAKCQkJICogYmVmb3JlIHNlbGVjdGlu ZyBhIHR1cGxlLCB3aGljaCByZXBsYWNlcyBhIHJhbmRvbWx5IGNob3NlbgoJCQkgKiBlbGVt ZW50IG9mIHRoZSByZXNlcnZvaXIgKGN1cnJlbnQgc2V0IG9mIHR1cGxlcykuICBBdCBhbGwg dGltZXMKCQkJICogdGhlIHJlc2Vydm9pciBpcyBhIHRydWUgcmFuZG9tIHNhbXBsZSBvZiB0 aGUgdHVwbGVzIHdlJ3ZlCgkJCSAqIHBhc3NlZCBvdmVyIHNvIGZhciwgc28gd2hlbiB3ZSBm YWxsIG9mZiB0aGUgZW5kIG9mIHRoZSByZWxhdGlvbgoJCQkgKiB3ZSdyZSBkb25lLgoJCQkg Ki8KCQkJaWYgKG51bXJvd3MgPCB0YXJncm93cykKCQkJCXJvd3NbbnVtcm93cysrXSA9IEV4 ZWNDb3B5U2xvdEhlYXBUdXBsZShzbG90KTsKCQkJZWxzZQoJCQl7CgkJCQkvKgoJCQkJICog dCBpbiBWaXR0ZXIncyBwYXBlciBpcyB0aGUgbnVtYmVyIG9mIHJlY29yZHMgYWxyZWFkeQoJ CQkJICogcHJvY2Vzc2VkLiAgSWYgd2UgbmVlZCB0byBjb21wdXRlIGEgbmV3IFMgdmFsdWUs IHdlIG11c3QKCQkJCSAqIHVzZSB0aGUgbm90LXlldC1pbmNyZW1lbnRlZCB2YWx1ZSBvZiBz YW1wbGVyb3dzIGFzIHQuCgkJCQkgKi8KCQkJCWlmIChyb3dzdG9za2lwIDwgMCkKCQkJCQly b3dzdG9za2lwID0gcmVzZXJ2b2lyX2dldF9uZXh0X1MoJnJzdGF0ZSwgc2FtcGxlcm93cywg dGFyZ3Jvd3MpOwoKCQkJCWlmIChyb3dzdG9za2lwIDw9IDApCgkJCQl7CgkJCQkJLyoKCQkJ CQkgKiBGb3VuZCBhIHN1aXRhYmxlIHR1cGxlLCBzbyBzYXZlIGl0LCByZXBsYWNpbmcgb25l IG9sZAoJCQkJCSAqIHR1cGxlIGF0IHJhbmRvbQoJCQkJCSAqLwoJCQkJCWludAkJCWsgPSAo aW50KSAodGFyZ3Jvd3MgKiBzYW1wbGVyX3JhbmRvbV9mcmFjdCgmcnN0YXRlLnJhbmRzdGF0 ZSkpOwoKCQkJCQlBc3NlcnQoayA+PSAwICYmIGsgPCB0YXJncm93cyk7CgkJCQkJaGVhcF9m cmVldHVwbGUocm93c1trXSk7CgkJCQkJcm93c1trXSA9IEV4ZWNDb3B5U2xvdEhlYXBUdXBs ZShzbG90KTsKCQkJCX0KCgkJCQlyb3dzdG9za2lwIC09IDE7CgkJCX0KCgkJCXNhbXBsZXJv d3MgKz0gMTsKCQl9CgoJCXBnc3RhdF9wcm9ncmVzc191cGRhdGVfcGFyYW0oUFJPR1JFU1Nf QU5BTFlaRV9CTE9DS1NfRE9ORSwKCQkJCQkJCQkJICsrYmxrc2RvbmUpOwoJfQoKCXJlYWRf c3RyZWFtX2VuZChzdHJlYW0pOwoKCUV4ZWNEcm9wU2luZ2xlVHVwbGVUYWJsZVNsb3Qoc2xv dCk7Cgl0YWJsZV9lbmRzY2FuKHNjYW4pOwoKCS8qCgkgKiBJZiB3ZSBkaWRuJ3QgZmluZCBh cyBtYW55IHR1cGxlcyBhcyB3ZSB3YW50ZWQgdGhlbiB3ZSdyZSBkb25lLiBObyBzb3J0Cgkg KiBpcyBuZWVkZWQsIHNpbmNlIHRoZXkncmUgYWxyZWFkeSBpbiBvcmRlci4KCSAqCgkgKiBP dGhlcndpc2Ugd2UgbmVlZCB0byBzb3J0IHRoZSBjb2xsZWN0ZWQgdHVwbGVzIGJ5IHBvc2l0 aW9uCgkgKiAoaXRlbXBvaW50ZXIpLiBJdCdzIG5vdCB3b3J0aCB3b3JyeWluZyBhYm91dCBj b3JuZXIgY2FzZXMgd2hlcmUgdGhlCgkgKiB0dXBsZXMgYXJlIGFscmVhZHkgc29ydGVkLgoJ ICovCglpZiAobnVtcm93cyA9PSB0YXJncm93cykKCQlxc29ydF9pbnRlcnJ1cHRpYmxlKHJv d3MsIG51bXJvd3MsIHNpemVvZihIZWFwVHVwbGUpLAoJCQkJCQkJY29tcGFyZV9yb3dzLCBO VUxMKTsKCgkvKgoJICogRXN0aW1hdGUgdG90YWwgbnVtYmVycyBvZiBsaXZlIGFuZCBkZWFk IHJvd3MgaW4gcmVsYXRpb24sIGV4dHJhcG9sYXRpbmcKCSAqIG9uIHRoZSBhc3N1bXB0aW9u IHRoYXQgdGhlIGF2ZXJhZ2UgdHVwbGUgZGVuc2l0eSBpbiBwYWdlcyB3ZSBkaWRuJ3QKCSAq IHNjYW4gaXMgdGhlIHNhbWUgYXMgaW4gdGhlIHBhZ2VzIHdlIGRpZCBzY2FuLiAgU2luY2Ug d2hhdCB3ZSBzY2FubmVkIGlzCgkgKiBhIHJhbmRvbSBzYW1wbGUgb2YgdGhlIHBhZ2VzIGlu IHRoZSByZWxhdGlvbiwgdGhpcyBzaG91bGQgYmUgYSBnb29kCgkgKiBhc3N1bXB0aW9uLgoJ ICovCglpZiAoYnMubSA+IDApCgl7CgkJKnRvdGFscm93cyA9IGZsb29yKChsaXZlcm93cyAv IGJzLm0pICogdG90YWxibG9ja3MgKyAwLjUpOwoJCSp0b3RhbGRlYWRyb3dzID0gZmxvb3Io KGRlYWRyb3dzIC8gYnMubSkgKiB0b3RhbGJsb2NrcyArIDAuNSk7Cgl9CgllbHNlCgl7CgkJ KnRvdGFscm93cyA9IDAuMDsKCQkqdG90YWxkZWFkcm93cyA9IDAuMDsKCX0KCgkvKgoJICog RW1pdCBzb21lIGludGVyZXN0aW5nIHJlbGF0aW9uIGluZm8KCSAqLwoJZXJlcG9ydChlbGV2 ZWwsCgkJCShlcnJtc2coIlwiJXNcIjogc2Nhbm5lZCAlZCBvZiAldSBwYWdlcywgIgoJCQkJ CSJjb250YWluaW5nICUuMGYgbGl2ZSByb3dzIGFuZCAlLjBmIGRlYWQgcm93czsgIgoJCQkJ CSIlZCByb3dzIGluIHNhbXBsZSwgJS4wZiBlc3RpbWF0ZWQgdG90YWwgcm93cyIsCgkJCQkJ UmVsYXRpb25HZXRSZWxhdGlvbk5hbWUob25lcmVsKSwKCQkJCQlicy5tLCB0b3RhbGJsb2Nr cywKCQkJCQlsaXZlcm93cywgZGVhZHJvd3MsCgkJCQkJbnVtcm93cywgKnRvdGFscm93cykp KTsKCglyZXR1cm4gbnVtcm93czsKfQoKLyoKICogQ29tcGFyYXRvciBmb3Igc29ydGluZyBy b3dzW10gYXJyYXkKICovCnN0YXRpYyBpbnQKY29tcGFyZV9yb3dzKGNvbnN0IHZvaWQgKmEs IGNvbnN0IHZvaWQgKmIsIHZvaWQgKmFyZykKewoJSGVhcFR1cGxlCWhhID0gKihjb25zdCBI ZWFwVHVwbGUgKikgYTsKCUhlYXBUdXBsZQloYiA9ICooY29uc3QgSGVhcFR1cGxlICopIGI7 CglCbG9ja051bWJlciBiYSA9IEl0ZW1Qb2ludGVyR2V0QmxvY2tOdW1iZXIoJmhhLT50X3Nl bGYpOwoJT2Zmc2V0TnVtYmVyIG9hID0gSXRlbVBvaW50ZXJHZXRPZmZzZXROdW1iZXIoJmhh LT50X3NlbGYpOwoJQmxvY2tOdW1iZXIgYmIgPSBJdGVtUG9pbnRlckdldEJsb2NrTnVtYmVy KCZoYi0+dF9zZWxmKTsKCU9mZnNldE51bWJlciBvYiA9IEl0ZW1Qb2ludGVyR2V0T2Zmc2V0 TnVtYmVyKCZoYi0+dF9zZWxmKTsKCglpZiAoYmEgPCBiYikKCQlyZXR1cm4gLTE7CglpZiAo YmEgPiBiYikKCQlyZXR1cm4gMTsKCWlmIChvYSA8IG9iKQoJCXJldHVybiAtMTsKCWlmIChv YSA+IG9iKQoJCXJldHVybiAxOwoJcmV0dXJuIDA7Cn0KCgovKgogKiBhY3F1aXJlX2luaGVy aXRlZF9zYW1wbGVfcm93cyAtLSBhY3F1aXJlIHNhbXBsZSByb3dzIGZyb20gaW5oZXJpdGFu Y2UgdHJlZQogKgogKiBUaGlzIGhhcyB0aGUgc2FtZSBBUEkgYXMgYWNxdWlyZV9zYW1wbGVf cm93cywgZXhjZXB0IHRoYXQgcm93cyBhcmUKICogY29sbGVjdGVkIGZyb20gYWxsIGluaGVy aXRhbmNlIGNoaWxkcmVuIGFzIHdlbGwgYXMgdGhlIHNwZWNpZmllZCB0YWJsZS4KICogV2Ug ZmFpbCBhbmQgcmV0dXJuIHplcm8gaWYgdGhlcmUgYXJlIG5vIGluaGVyaXRhbmNlIGNoaWxk cmVuLCBvciBpZiBhbGwKICogY2hpbGRyZW4gYXJlIGZvcmVpZ24gdGFibGVzIHRoYXQgZG9u J3Qgc3VwcG9ydCBBTkFMWVpFLgogKi8Kc3RhdGljIGludAphY3F1aXJlX2luaGVyaXRlZF9z YW1wbGVfcm93cyhSZWxhdGlvbiBvbmVyZWwsIGludCBlbGV2ZWwsCgkJCQkJCQkgIEhlYXBU dXBsZSAqcm93cywgaW50IHRhcmdyb3dzLAoJCQkJCQkJICBkb3VibGUgKnRvdGFscm93cywg ZG91YmxlICp0b3RhbGRlYWRyb3dzKQp7CglMaXN0CSAgICp0YWJsZU9JRHM7CglSZWxhdGlv biAgICpyZWxzOwoJQWNxdWlyZVNhbXBsZVJvd3NGdW5jICphY3F1aXJlZnVuY3M7Cglkb3Vi bGUJICAgKnJlbGJsb2NrczsKCWRvdWJsZQkJdG90YWxibG9ja3M7CglpbnQJCQludW1yb3dz LAoJCQkJbnJlbHMsCgkJCQlpOwoJTGlzdENlbGwgICAqbGM7Cglib29sCQloYXNfY2hpbGQ7 CgoJLyogSW5pdGlhbGl6ZSBvdXRwdXQgcGFyYW1ldGVycyB0byB6ZXJvIG5vdywgaW4gY2Fz ZSB3ZSBleGl0IGVhcmx5ICovCgkqdG90YWxyb3dzID0gMDsKCSp0b3RhbGRlYWRyb3dzID0g MDsKCgkvKgoJICogRmluZCBhbGwgbWVtYmVycyBvZiBpbmhlcml0YW5jZSBzZXQuICBXZSBv bmx5IG5lZWQgQWNjZXNzU2hhcmVMb2NrIG9uCgkgKiB0aGUgY2hpbGRyZW4uCgkgKi8KCXRh YmxlT0lEcyA9CgkJZmluZF9hbGxfaW5oZXJpdG9ycyhSZWxhdGlvbkdldFJlbGlkKG9uZXJl bCksIEFjY2Vzc1NoYXJlTG9jaywgTlVMTCk7CgoJLyoKCSAqIENoZWNrIHRoYXQgdGhlcmUn cyBhdCBsZWFzdCBvbmUgZGVzY2VuZGFudCwgZWxzZSBmYWlsLiAgVGhpcyBjb3VsZAoJICog aGFwcGVuIGRlc3BpdGUgYW5hbHl6ZV9yZWwncyByZWxoYXNzdWJjbGFzcyBjaGVjaywgaWYg dGFibGUgb25jZSBoYWQgYQoJICogY2hpbGQgYnV0IG5vIGxvbmdlciBkb2VzLiAgSW4gdGhh dCBjYXNlLCB3ZSBjYW4gY2xlYXIgdGhlCgkgKiByZWxoYXNzdWJjbGFzcyBmaWVsZCBzbyBh cyBub3QgdG8gbWFrZSB0aGUgc2FtZSBtaXN0YWtlIGFnYWluIGxhdGVyLgoJICogKFRoaXMg aXMgc2FmZSBiZWNhdXNlIHdlIGhvbGQgU2hhcmVVcGRhdGVFeGNsdXNpdmVMb2NrLikKCSAq LwoJaWYgKGxpc3RfbGVuZ3RoKHRhYmxlT0lEcykgPCAyKQoJewoJCS8qIENDSSBiZWNhdXNl IHdlIGFscmVhZHkgdXBkYXRlZCB0aGUgcGdfY2xhc3Mgcm93IGluIHRoaXMgY29tbWFuZCAq LwoJCUNvbW1hbmRDb3VudGVySW5jcmVtZW50KCk7CgkJU2V0UmVsYXRpb25IYXNTdWJjbGFz cyhSZWxhdGlvbkdldFJlbGlkKG9uZXJlbCksIGZhbHNlKTsKCQllcmVwb3J0KGVsZXZlbCwK CQkJCShlcnJtc2coInNraXBwaW5nIGFuYWx5emUgb2YgXCIlcy4lc1wiIGluaGVyaXRhbmNl IHRyZWUgLS0tIHRoaXMgaW5oZXJpdGFuY2UgdHJlZSBjb250YWlucyBubyBjaGlsZCB0YWJs ZXMiLAoJCQkJCQlnZXRfbmFtZXNwYWNlX25hbWUoUmVsYXRpb25HZXROYW1lc3BhY2Uob25l cmVsKSksCgkJCQkJCVJlbGF0aW9uR2V0UmVsYXRpb25OYW1lKG9uZXJlbCkpKSk7CgkJcmV0 dXJuIDA7Cgl9CgoJLyoKCSAqIElkZW50aWZ5IGFjcXVpcmVmdW5jcyB0byB1c2UsIGFuZCBj b3VudCBibG9ja3MgaW4gYWxsIHRoZSByZWxhdGlvbnMuCgkgKiBUaGUgcmVzdWx0IGNvdWxk IG92ZXJmbG93IEJsb2NrTnVtYmVyLCBzbyB3ZSB1c2UgZG91YmxlIGFyaXRobWV0aWMuCgkg Ki8KCXJlbHMgPSAoUmVsYXRpb24gKikgcGFsbG9jKGxpc3RfbGVuZ3RoKHRhYmxlT0lEcykg KiBzaXplb2YoUmVsYXRpb24pKTsKCWFjcXVpcmVmdW5jcyA9IChBY3F1aXJlU2FtcGxlUm93 c0Z1bmMgKikKCQlwYWxsb2MobGlzdF9sZW5ndGgodGFibGVPSURzKSAqIHNpemVvZihBY3F1 aXJlU2FtcGxlUm93c0Z1bmMpKTsKCXJlbGJsb2NrcyA9IChkb3VibGUgKikgcGFsbG9jKGxp c3RfbGVuZ3RoKHRhYmxlT0lEcykgKiBzaXplb2YoZG91YmxlKSk7Cgl0b3RhbGJsb2NrcyA9 IDA7CglucmVscyA9IDA7CgloYXNfY2hpbGQgPSBmYWxzZTsKCWZvcmVhY2gobGMsIHRhYmxl T0lEcykKCXsKCQlPaWQJCQljaGlsZE9JRCA9IGxmaXJzdF9vaWQobGMpOwoJCVJlbGF0aW9u CWNoaWxkcmVsOwoJCUFjcXVpcmVTYW1wbGVSb3dzRnVuYyBhY3F1aXJlZnVuYyA9IE5VTEw7 CgkJQmxvY2tOdW1iZXIgcmVscGFnZXMgPSAwOwoKCQkvKiBXZSBhbHJlYWR5IGdvdCB0aGUg bmVlZGVkIGxvY2sgKi8KCQljaGlsZHJlbCA9IHRhYmxlX29wZW4oY2hpbGRPSUQsIE5vTG9j ayk7CgoJCS8qIElnbm9yZSBpZiB0ZW1wIHRhYmxlIG9mIGFub3RoZXIgYmFja2VuZCAqLwoJ CWlmIChSRUxBVElPTl9JU19PVEhFUl9URU1QKGNoaWxkcmVsKSkKCQl7CgkJCS8qIC4uLiBi dXQgcmVsZWFzZSB0aGUgbG9jayBvbiBpdCAqLwoJCQlBc3NlcnQoY2hpbGRyZWwgIT0gb25l cmVsKTsKCQkJdGFibGVfY2xvc2UoY2hpbGRyZWwsIEFjY2Vzc1NoYXJlTG9jayk7CgkJCWNv bnRpbnVlOwoJCX0KCgkJLyogQ2hlY2sgdGFibGUgdHlwZSAoTUFUVklFVyBjYW4ndCBoYXBw ZW4sIGJ1dCBtaWdodCBhcyB3ZWxsIGFsbG93KSAqLwoJCWlmIChjaGlsZHJlbC0+cmRfcmVs LT5yZWxraW5kID09IFJFTEtJTkRfUkVMQVRJT04gfHwKCQkJY2hpbGRyZWwtPnJkX3JlbC0+ cmVsa2luZCA9PSBSRUxLSU5EX01BVFZJRVcpCgkJewoJCQkvKiBSZWd1bGFyIHRhYmxlLCBz byB1c2UgdGhlIHJlZ3VsYXIgcm93IGFjcXVpc2l0aW9uIGZ1bmN0aW9uICovCgkJCWFjcXVp cmVmdW5jID0gYWNxdWlyZV9zYW1wbGVfcm93czsKCQkJcmVscGFnZXMgPSBSZWxhdGlvbkdl dE51bWJlck9mQmxvY2tzKGNoaWxkcmVsKTsKCQl9CgkJZWxzZSBpZiAoY2hpbGRyZWwtPnJk X3JlbC0+cmVsa2luZCA9PSBSRUxLSU5EX0ZPUkVJR05fVEFCTEUpCgkJewoJCQkvKgoJCQkg KiBGb3IgYSBmb3JlaWduIHRhYmxlLCBjYWxsIHRoZSBGRFcncyBob29rIGZ1bmN0aW9uIHRv IHNlZQoJCQkgKiB3aGV0aGVyIGl0IHN1cHBvcnRzIGFuYWx5c2lzLgoJCQkgKi8KCQkJRmR3 Um91dGluZSAqZmR3cm91dGluZTsKCQkJYm9vbAkJb2sgPSBmYWxzZTsKCgkJCWZkd3JvdXRp bmUgPSBHZXRGZHdSb3V0aW5lRm9yUmVsYXRpb24oY2hpbGRyZWwsIGZhbHNlKTsKCgkJCWlm IChmZHdyb3V0aW5lLT5BbmFseXplRm9yZWlnblRhYmxlICE9IE5VTEwpCgkJCQlvayA9IGZk d3JvdXRpbmUtPkFuYWx5emVGb3JlaWduVGFibGUoY2hpbGRyZWwsCgkJCQkJCQkJCQkJCQkg JmFjcXVpcmVmdW5jLAoJCQkJCQkJCQkJCQkJICZyZWxwYWdlcyk7CgoJCQlpZiAoIW9rKQoJ CQl7CgkJCQkvKiBpZ25vcmUsIGJ1dCByZWxlYXNlIHRoZSBsb2NrIG9uIGl0ICovCgkJCQlB c3NlcnQoY2hpbGRyZWwgIT0gb25lcmVsKTsKCQkJCXRhYmxlX2Nsb3NlKGNoaWxkcmVsLCBB Y2Nlc3NTaGFyZUxvY2spOwoJCQkJY29udGludWU7CgkJCX0KCQl9CgkJZWxzZQoJCXsKCQkJ LyoKCQkJICogaWdub3JlLCBidXQgcmVsZWFzZSB0aGUgbG9jayBvbiBpdC4gIGRvbid0IHRy eSB0byB1bmxvY2sgdGhlCgkJCSAqIHBhc3NlZC1pbiByZWxhdGlvbgoJCQkgKi8KCQkJQXNz ZXJ0KGNoaWxkcmVsLT5yZF9yZWwtPnJlbGtpbmQgPT0gUkVMS0lORF9QQVJUSVRJT05FRF9U QUJMRSk7CgkJCWlmIChjaGlsZHJlbCAhPSBvbmVyZWwpCgkJCQl0YWJsZV9jbG9zZShjaGls ZHJlbCwgQWNjZXNzU2hhcmVMb2NrKTsKCQkJZWxzZQoJCQkJdGFibGVfY2xvc2UoY2hpbGRy ZWwsIE5vTG9jayk7CgkJCWNvbnRpbnVlOwoJCX0KCgkJLyogT0ssIHdlJ2xsIHByb2Nlc3Mg dGhpcyBjaGlsZCAqLwoJCWhhc19jaGlsZCA9IHRydWU7CgkJcmVsc1tucmVsc10gPSBjaGls ZHJlbDsKCQlhY3F1aXJlZnVuY3NbbnJlbHNdID0gYWNxdWlyZWZ1bmM7CgkJcmVsYmxvY2tz W25yZWxzXSA9IChkb3VibGUpIHJlbHBhZ2VzOwoJCXRvdGFsYmxvY2tzICs9IChkb3VibGUp IHJlbHBhZ2VzOwoJCW5yZWxzKys7Cgl9CgoJLyoKCSAqIElmIHdlIGRvbid0IGhhdmUgYXQg bGVhc3Qgb25lIGNoaWxkIHRhYmxlIHRvIGNvbnNpZGVyLCBmYWlsLiAgSWYgdGhlCgkgKiBy ZWxhdGlvbiBpcyBhIHBhcnRpdGlvbmVkIHRhYmxlLCBpdCdzIG5vdCBjb3VudGVkIGFzIGEg Y2hpbGQgdGFibGUuCgkgKi8KCWlmICghaGFzX2NoaWxkKQoJewoJCWVyZXBvcnQoZWxldmVs LAoJCQkJKGVycm1zZygic2tpcHBpbmcgYW5hbHl6ZSBvZiBcIiVzLiVzXCIgaW5oZXJpdGFu Y2UgdHJlZSAtLS0gdGhpcyBpbmhlcml0YW5jZSB0cmVlIGNvbnRhaW5zIG5vIGFuYWx5emFi bGUgY2hpbGQgdGFibGVzIiwKCQkJCQkJZ2V0X25hbWVzcGFjZV9uYW1lKFJlbGF0aW9uR2V0 TmFtZXNwYWNlKG9uZXJlbCkpLAoJCQkJCQlSZWxhdGlvbkdldFJlbGF0aW9uTmFtZShvbmVy ZWwpKSkpOwoJCXJldHVybiAwOwoJfQoKCS8qCgkgKiBOb3cgc2FtcGxlIHJvd3MgZnJvbSBl YWNoIHJlbGF0aW9uLCBwcm9wb3J0aW9uYWxseSB0byBpdHMgZnJhY3Rpb24gb2YKCSAqIHRo ZSB0b3RhbCBibG9jayBjb3VudC4gIChUaGlzIG1pZ2h0IGJlIGxlc3MgdGhhbiBkZXNpcmFi bGUgaWYgdGhlIGNoaWxkCgkgKiByZWxzIGhhdmUgcmFkaWNhbGx5IGRpZmZlcmVudCBmcmVl LXNwYWNlIHBlcmNlbnRhZ2VzLCBidXQgaXQncyBub3QKCSAqIGNsZWFyIHRoYXQgaXQncyB3 b3J0aCB3b3JraW5nIGhhcmRlci4pCgkgKi8KCXBnc3RhdF9wcm9ncmVzc191cGRhdGVfcGFy YW0oUFJPR1JFU1NfQU5BTFlaRV9DSElMRF9UQUJMRVNfVE9UQUwsCgkJCQkJCQkJIG5yZWxz KTsKCW51bXJvd3MgPSAwOwoJZm9yIChpID0gMDsgaSA8IG5yZWxzOyBpKyspCgl7CgkJUmVs YXRpb24JY2hpbGRyZWwgPSByZWxzW2ldOwoJCUFjcXVpcmVTYW1wbGVSb3dzRnVuYyBhY3F1 aXJlZnVuYyA9IGFjcXVpcmVmdW5jc1tpXTsKCQlkb3VibGUJCWNoaWxkYmxvY2tzID0gcmVs YmxvY2tzW2ldOwoKCQkvKgoJCSAqIFJlcG9ydCBwcm9ncmVzcy4gIFRoZSBzYW1wbGluZyBm dW5jdGlvbiB3aWxsIG5vcm1hbGx5IHJlcG9ydCBibG9ja3MKCQkgKiBkb25lL3RvdGFsLCBi dXQgd2UgbmVlZCB0byByZXNldCB0aGVtIHRvIDAgaGVyZSwgc28gdGhhdCB0aGV5IGRvbid0 CgkJICogc2hvdyBhbiBvbGQgdmFsdWUgdW50aWwgdGhhdC4KCQkgKi8KCQl7CgkJCWNvbnN0 IGludAlwcm9ncmVzc19pbmRleFtdID0gewoJCQkJUFJPR1JFU1NfQU5BTFlaRV9DVVJSRU5U X0NISUxEX1RBQkxFX1JFTElELAoJCQkJUFJPR1JFU1NfQU5BTFlaRV9CTE9DS1NfRE9ORSwK CQkJCVBST0dSRVNTX0FOQUxZWkVfQkxPQ0tTX1RPVEFMCgkJCX07CgkJCWNvbnN0IGludDY0 IHByb2dyZXNzX3ZhbHNbXSA9IHsKCQkJCVJlbGF0aW9uR2V0UmVsaWQoY2hpbGRyZWwpLAoJ CQkJMCwKCQkJCTAsCgkJCX07CgoJCQlwZ3N0YXRfcHJvZ3Jlc3NfdXBkYXRlX211bHRpX3Bh cmFtKDMsIHByb2dyZXNzX2luZGV4LCBwcm9ncmVzc192YWxzKTsKCQl9CgoJCWlmIChjaGls ZGJsb2NrcyA+IDApCgkJewoJCQlpbnQJCQljaGlsZHRhcmdyb3dzOwoKCQkJY2hpbGR0YXJn cm93cyA9IChpbnQpIHJpbnQodGFyZ3Jvd3MgKiBjaGlsZGJsb2NrcyAvIHRvdGFsYmxvY2tz KTsKCQkJLyogTWFrZSBzdXJlIHdlIGRvbid0IG92ZXJydW4gZHVlIHRvIHJvdW5kb2ZmIGVy cm9yICovCgkJCWNoaWxkdGFyZ3Jvd3MgPSBNaW4oY2hpbGR0YXJncm93cywgdGFyZ3Jvd3Mg LSBudW1yb3dzKTsKCQkJaWYgKGNoaWxkdGFyZ3Jvd3MgPiAwKQoJCQl7CgkJCQlpbnQJCQlj aGlsZHJvd3M7CgkJCQlkb3VibGUJCXRyb3dzLAoJCQkJCQkJdGRyb3dzOwoKCQkJCS8qIEZl dGNoIGEgcmFuZG9tIHNhbXBsZSBvZiB0aGUgY2hpbGQncyByb3dzICovCgkJCQljaGlsZHJv d3MgPSAoKmFjcXVpcmVmdW5jKSAoY2hpbGRyZWwsIGVsZXZlbCwKCQkJCQkJCQkJCQlyb3dz ICsgbnVtcm93cywgY2hpbGR0YXJncm93cywKCQkJCQkJCQkJCQkmdHJvd3MsICZ0ZHJvd3Mp OwoKCQkJCS8qIFdlIG1heSBuZWVkIHRvIGNvbnZlcnQgZnJvbSBjaGlsZCdzIHJvd3R5cGUg dG8gcGFyZW50J3MgKi8KCQkJCWlmIChjaGlsZHJvd3MgPiAwICYmCgkJCQkJIWVxdWFsUm93 VHlwZXMoUmVsYXRpb25HZXREZXNjcihjaGlsZHJlbCksCgkJCQkJCQkJICAgUmVsYXRpb25H ZXREZXNjcihvbmVyZWwpKSkKCQkJCXsKCQkJCQlUdXBsZUNvbnZlcnNpb25NYXAgKm1hcDsK CgkJCQkJbWFwID0gY29udmVydF90dXBsZXNfYnlfbmFtZShSZWxhdGlvbkdldERlc2NyKGNo aWxkcmVsKSwKCQkJCQkJCQkJCQkJIFJlbGF0aW9uR2V0RGVzY3Iob25lcmVsKSk7CgkJCQkJ aWYgKG1hcCAhPSBOVUxMKQoJCQkJCXsKCQkJCQkJaW50CQkJajsKCgkJCQkJCWZvciAoaiA9 IDA7IGogPCBjaGlsZHJvd3M7IGorKykKCQkJCQkJewoJCQkJCQkJSGVhcFR1cGxlCW5ld3R1 cDsKCgkJCQkJCQluZXd0dXAgPSBleGVjdXRlX2F0dHJfbWFwX3R1cGxlKHJvd3NbbnVtcm93 cyArIGpdLCBtYXApOwoJCQkJCQkJaGVhcF9mcmVldHVwbGUocm93c1tudW1yb3dzICsgal0p OwoJCQkJCQkJcm93c1tudW1yb3dzICsgal0gPSBuZXd0dXA7CgkJCQkJCX0KCQkJCQkJZnJl ZV9jb252ZXJzaW9uX21hcChtYXApOwoJCQkJCX0KCQkJCX0KCgkJCQkvKiBBbmQgYWRkIHRv IGNvdW50cyAqLwoJCQkJbnVtcm93cyArPSBjaGlsZHJvd3M7CgkJCQkqdG90YWxyb3dzICs9 IHRyb3dzOwoJCQkJKnRvdGFsZGVhZHJvd3MgKz0gdGRyb3dzOwoJCQl9CgkJfQoKCQkvKgoJ CSAqIE5vdGU6IHdlIGNhbm5vdCByZWxlYXNlIHRoZSBjaGlsZC10YWJsZSBsb2Nrcywgc2lu Y2Ugd2UgbWF5IGhhdmUKCQkgKiBwb2ludGVycyB0byB0aGVpciBUT0FTVCB0YWJsZXMgaW4g dGhlIHNhbXBsZWQgcm93cy4KCQkgKi8KCQl0YWJsZV9jbG9zZShjaGlsZHJlbCwgTm9Mb2Nr KTsKCQlwZ3N0YXRfcHJvZ3Jlc3NfdXBkYXRlX3BhcmFtKFBST0dSRVNTX0FOQUxZWkVfQ0hJ TERfVEFCTEVTX0RPTkUsCgkJCQkJCQkJCSBpICsgMSk7Cgl9CgoJcmV0dXJuIG51bXJvd3M7 Cn0KCgovKgogKgl1cGRhdGVfYXR0c3RhdHMoKSAtLSB1cGRhdGUgYXR0cmlidXRlIHN0YXRp c3RpY3MgZm9yIG9uZSByZWxhdGlvbgogKgogKgkJU3RhdGlzdGljcyBhcmUgc3RvcmVkIGlu IHNldmVyYWwgcGxhY2VzOiB0aGUgcGdfY2xhc3Mgcm93IGZvciB0aGUKICoJCXJlbGF0aW9u IGhhcyBzdGF0cyBhYm91dCB0aGUgd2hvbGUgcmVsYXRpb24sIGFuZCB0aGVyZSBpcyBhCiAq CQlwZ19zdGF0aXN0aWMgcm93IGZvciBlYWNoIChub24tc3lzdGVtKSBhdHRyaWJ1dGUgdGhh dCBoYXMgZXZlcgogKgkJYmVlbiBhbmFseXplZC4gIFRoZSBwZ19jbGFzcyB2YWx1ZXMgYXJl IHVwZGF0ZWQgYnkgVkFDVVVNLCBub3QgaGVyZS4KICoKICoJCXBnX3N0YXRpc3RpYyByb3dz IGFyZSBqdXN0IGFkZGVkIG9yIHVwZGF0ZWQgbm9ybWFsbHkuICBUaGlzIG1lYW5zCiAqCQl0 aGF0IHBnX3N0YXRpc3RpYyB3aWxsIHByb2JhYmx5IGNvbnRhaW4gc29tZSBkZWxldGVkIHJv d3MgYXQgdGhlCiAqCQljb21wbGV0aW9uIG9mIGEgdmFjdXVtIGN5Y2xlLCB1bmxlc3MgaXQg aGFwcGVucyB0byBnZXQgdmFjdXVtZWQgbGFzdC4KICoKICoJCVRvIGtlZXAgdGhpbmdzIHNp bXBsZSwgd2UgcHVudCBmb3IgcGdfc3RhdGlzdGljLCBhbmQgZG9uJ3QgdHJ5CiAqCQl0byBj b21wdXRlIG9yIHN0b3JlIHJvd3MgZm9yIHBnX3N0YXRpc3RpYyBpdHNlbGYgaW4gcGdfc3Rh dGlzdGljLgogKgkJVGhpcyBjb3VsZCBwb3NzaWJseSBiZSBtYWRlIHRvIHdvcmssIGJ1dCBp dCdzIG5vdCB3b3J0aCB0aGUgdHJvdWJsZS4KICoJCU5vdGUgYW5hbHl6ZV9yZWwoKSBoYXMg c2VlbiB0byBpdCB0aGF0IHdlIHdvbid0IGNvbWUgaGVyZSB3aGVuCiAqCQl2YWN1dW1pbmcg cGdfc3RhdGlzdGljIGl0c2VsZi4KICoKICoJCU5vdGU6IHRoZXJlIHdvdWxkIGJlIGEgcmFj ZSBjb25kaXRpb24gaGVyZSBpZiB0d28gYmFja2VuZHMgY291bGQKICoJCUFOQUxZWkUgdGhl IHNhbWUgdGFibGUgY29uY3VycmVudGx5LiAgUHJlc2VudGx5LCB3ZSBsb2NrIHRoYXQgb3V0 CiAqCQlieSB0YWtpbmcgYSBzZWxmLWV4Y2x1c2l2ZSBsb2NrIG9uIHRoZSByZWxhdGlvbiBp biBhbmFseXplX3JlbCgpLgogKi8Kc3RhdGljIHZvaWQKdXBkYXRlX2F0dHN0YXRzKE9pZCBy ZWxpZCwgYm9vbCBpbmgsIGludCBuYXR0cywgVmFjQXR0clN0YXRzICoqdmFjYXR0cnN0YXRz KQp7CglSZWxhdGlvbglzZDsKCWludAkJCWF0dG5vOwoJQ2F0YWxvZ0luZGV4U3RhdGUgaW5k c3RhdGUgPSBOVUxMOwoKCWlmIChuYXR0cyA8PSAwKQoJCXJldHVybjsJCQkJCS8qIG5vdGhp bmcgdG8gZG8gKi8KCglzZCA9IHRhYmxlX29wZW4oU3RhdGlzdGljUmVsYXRpb25JZCwgUm93 RXhjbHVzaXZlTG9jayk7CgoJZm9yIChhdHRubyA9IDA7IGF0dG5vIDwgbmF0dHM7IGF0dG5v KyspCgl7CgkJVmFjQXR0clN0YXRzICpzdGF0cyA9IHZhY2F0dHJzdGF0c1thdHRub107CgkJ SGVhcFR1cGxlCXN0dXAsCgkJCQkJb2xkdHVwOwoJCWludAkJCWksCgkJCQkJaywKCQkJCQlu OwoJCURhdHVtCQl2YWx1ZXNbTmF0dHNfcGdfc3RhdGlzdGljXTsKCQlib29sCQludWxsc1tO YXR0c19wZ19zdGF0aXN0aWNdOwoJCWJvb2wJCXJlcGxhY2VzW05hdHRzX3BnX3N0YXRpc3Rp Y107CgoJCS8qIElnbm9yZSBhdHRyIGlmIHdlIHdlcmVuJ3QgYWJsZSB0byBjb2xsZWN0IHN0 YXRzICovCgkJaWYgKCFzdGF0cy0+c3RhdHNfdmFsaWQpCgkJCWNvbnRpbnVlOwoKCQkvKgoJ CSAqIENvbnN0cnVjdCBhIG5ldyBwZ19zdGF0aXN0aWMgdHVwbGUKCQkgKi8KCQlmb3IgKGkg PSAwOyBpIDwgTmF0dHNfcGdfc3RhdGlzdGljOyArK2kpCgkJewoJCQludWxsc1tpXSA9IGZh bHNlOwoJCQlyZXBsYWNlc1tpXSA9IHRydWU7CgkJfQoKCQl2YWx1ZXNbQW51bV9wZ19zdGF0 aXN0aWNfc3RhcmVsaWQgLSAxXSA9IE9iamVjdElkR2V0RGF0dW0ocmVsaWQpOwoJCXZhbHVl c1tBbnVtX3BnX3N0YXRpc3RpY19zdGFhdHRudW0gLSAxXSA9IEludDE2R2V0RGF0dW0oc3Rh dHMtPnR1cGF0dG51bSk7CgkJdmFsdWVzW0FudW1fcGdfc3RhdGlzdGljX3N0YWluaGVyaXQg LSAxXSA9IEJvb2xHZXREYXR1bShpbmgpOwoJCXZhbHVlc1tBbnVtX3BnX3N0YXRpc3RpY19z dGFudWxsZnJhYyAtIDFdID0gRmxvYXQ0R2V0RGF0dW0oc3RhdHMtPnN0YW51bGxmcmFjKTsK CQl2YWx1ZXNbQW51bV9wZ19zdGF0aXN0aWNfc3Rhd2lkdGggLSAxXSA9IEludDMyR2V0RGF0 dW0oc3RhdHMtPnN0YXdpZHRoKTsKCQl2YWx1ZXNbQW51bV9wZ19zdGF0aXN0aWNfc3RhZGlz dGluY3QgLSAxXSA9IEZsb2F0NEdldERhdHVtKHN0YXRzLT5zdGFkaXN0aW5jdCk7CgkJaSA9 IEFudW1fcGdfc3RhdGlzdGljX3N0YWtpbmQxIC0gMTsKCQlmb3IgKGsgPSAwOyBrIDwgU1RB VElTVElDX05VTV9TTE9UUzsgaysrKQoJCXsKCQkJdmFsdWVzW2krK10gPSBJbnQxNkdldERh dHVtKHN0YXRzLT5zdGFraW5kW2tdKTsgLyogc3Rha2luZE4gKi8KCQl9CgkJaSA9IEFudW1f cGdfc3RhdGlzdGljX3N0YW9wMSAtIDE7CgkJZm9yIChrID0gMDsgayA8IFNUQVRJU1RJQ19O VU1fU0xPVFM7IGsrKykKCQl7CgkJCXZhbHVlc1tpKytdID0gT2JqZWN0SWRHZXREYXR1bShz dGF0cy0+c3Rhb3Bba10pOwkvKiBzdGFvcE4gKi8KCQl9CgkJaSA9IEFudW1fcGdfc3RhdGlz dGljX3N0YWNvbGwxIC0gMTsKCQlmb3IgKGsgPSAwOyBrIDwgU1RBVElTVElDX05VTV9TTE9U UzsgaysrKQoJCXsKCQkJdmFsdWVzW2krK10gPSBPYmplY3RJZEdldERhdHVtKHN0YXRzLT5z dGFjb2xsW2tdKTsJLyogc3RhY29sbE4gKi8KCQl9CgkJaSA9IEFudW1fcGdfc3RhdGlzdGlj X3N0YW51bWJlcnMxIC0gMTsKCQlmb3IgKGsgPSAwOyBrIDwgU1RBVElTVElDX05VTV9TTE9U UzsgaysrKQoJCXsKCQkJaWYgKHN0YXRzLT5zdGFudW1iZXJzW2tdICE9IE5VTEwpCgkJCXsK CQkJCWludAkJCW5udW0gPSBzdGF0cy0+bnVtbnVtYmVyc1trXTsKCQkJCURhdHVtCSAgICpu dW1kYXR1bXMgPSAoRGF0dW0gKikgcGFsbG9jKG5udW0gKiBzaXplb2YoRGF0dW0pKTsKCQkJ CUFycmF5VHlwZSAgKmFycnk7CgoJCQkJZm9yIChuID0gMDsgbiA8IG5udW07IG4rKykKCQkJ CQludW1kYXR1bXNbbl0gPSBGbG9hdDRHZXREYXR1bShzdGF0cy0+c3RhbnVtYmVyc1trXVtu XSk7CgkJCQlhcnJ5ID0gY29uc3RydWN0X2FycmF5X2J1aWx0aW4obnVtZGF0dW1zLCBubnVt LCBGTE9BVDRPSUQpOwoJCQkJdmFsdWVzW2krK10gPSBQb2ludGVyR2V0RGF0dW0oYXJyeSk7 CS8qIHN0YW51bWJlcnNOICovCgkJCX0KCQkJZWxzZQoJCQl7CgkJCQludWxsc1tpXSA9IHRy dWU7CgkJCQl2YWx1ZXNbaSsrXSA9IChEYXR1bSkgMDsKCQkJfQoJCX0KCQlpID0gQW51bV9w Z19zdGF0aXN0aWNfc3RhdmFsdWVzMSAtIDE7CgkJZm9yIChrID0gMDsgayA8IFNUQVRJU1RJ Q19OVU1fU0xPVFM7IGsrKykKCQl7CgkJCWlmIChzdGF0cy0+c3RhdmFsdWVzW2tdICE9IE5V TEwpCgkJCXsKCQkJCUFycmF5VHlwZSAgKmFycnk7CgoJCQkJYXJyeSA9IGNvbnN0cnVjdF9h cnJheShzdGF0cy0+c3RhdmFsdWVzW2tdLAoJCQkJCQkJCQkgICBzdGF0cy0+bnVtdmFsdWVz W2tdLAoJCQkJCQkJCQkgICBzdGF0cy0+c3RhdHlwaWRba10sCgkJCQkJCQkJCSAgIHN0YXRz LT5zdGF0eXBsZW5ba10sCgkJCQkJCQkJCSAgIHN0YXRzLT5zdGF0eXBieXZhbFtrXSwKCQkJ CQkJCQkJICAgc3RhdHMtPnN0YXR5cGFsaWduW2tdKTsKCQkJCXZhbHVlc1tpKytdID0gUG9p bnRlckdldERhdHVtKGFycnkpOwkvKiBzdGF2YWx1ZXNOICovCgkJCX0KCQkJZWxzZQoJCQl7 CgkJCQludWxsc1tpXSA9IHRydWU7CgkJCQl2YWx1ZXNbaSsrXSA9IChEYXR1bSkgMDsKCQkJ fQoJCX0KCgkJLyogSXMgdGhlcmUgYWxyZWFkeSBhIHBnX3N0YXRpc3RpYyB0dXBsZSBmb3Ig dGhpcyBhdHRyaWJ1dGU/ICovCgkJb2xkdHVwID0gU2VhcmNoU3lzQ2FjaGUzKFNUQVRSRUxB VFRJTkgsCgkJCQkJCQkJIE9iamVjdElkR2V0RGF0dW0ocmVsaWQpLAoJCQkJCQkJCSBJbnQx NkdldERhdHVtKHN0YXRzLT50dXBhdHRudW0pLAoJCQkJCQkJCSBCb29sR2V0RGF0dW0oaW5o KSk7CgoJCS8qIE9wZW4gaW5kZXggaW5mb3JtYXRpb24gd2hlbiB3ZSBrbm93IHdlIG5lZWQg aXQgKi8KCQlpZiAoaW5kc3RhdGUgPT0gTlVMTCkKCQkJaW5kc3RhdGUgPSBDYXRhbG9nT3Bl bkluZGV4ZXMoc2QpOwoKCQlpZiAoSGVhcFR1cGxlSXNWYWxpZChvbGR0dXApKQoJCXsKCQkJ LyogWWVzLCByZXBsYWNlIGl0ICovCgkJCXN0dXAgPSBoZWFwX21vZGlmeV90dXBsZShvbGR0 dXAsCgkJCQkJCQkJCSBSZWxhdGlvbkdldERlc2NyKHNkKSwKCQkJCQkJCQkJIHZhbHVlcywK CQkJCQkJCQkJIG51bGxzLAoJCQkJCQkJCQkgcmVwbGFjZXMpOwoJCQlSZWxlYXNlU3lzQ2Fj aGUob2xkdHVwKTsKCQkJQ2F0YWxvZ1R1cGxlVXBkYXRlV2l0aEluZm8oc2QsICZzdHVwLT50 X3NlbGYsIHN0dXAsIGluZHN0YXRlKTsKCQl9CgkJZWxzZQoJCXsKCQkJLyogTm8sIGluc2Vy dCBuZXcgdHVwbGUgKi8KCQkJc3R1cCA9IGhlYXBfZm9ybV90dXBsZShSZWxhdGlvbkdldERl c2NyKHNkKSwgdmFsdWVzLCBudWxscyk7CgkJCUNhdGFsb2dUdXBsZUluc2VydFdpdGhJbmZv KHNkLCBzdHVwLCBpbmRzdGF0ZSk7CgkJfQoKCQloZWFwX2ZyZWV0dXBsZShzdHVwKTsKCX0K CglpZiAoaW5kc3RhdGUgIT0gTlVMTCkKCQlDYXRhbG9nQ2xvc2VJbmRleGVzKGluZHN0YXRl KTsKCXRhYmxlX2Nsb3NlKHNkLCBSb3dFeGNsdXNpdmVMb2NrKTsKfQoKLyoKICogU3RhbmRh cmQgZmV0Y2ggZnVuY3Rpb24gZm9yIHVzZSBieSBjb21wdXRlX3N0YXRzIHN1YnJvdXRpbmVz LgogKgogKiBUaGlzIGV4aXN0cyB0byBwcm92aWRlIHNvbWUgaW5zdWxhdGlvbiBiZXR3ZWVu IGNvbXB1dGVfc3RhdHMgcm91dGluZXMKICogYW5kIHRoZSBhY3R1YWwgc3RvcmFnZSBvZiB0 aGUgc2FtcGxlIGRhdGEuCiAqLwpzdGF0aWMgRGF0dW0Kc3RkX2ZldGNoX2Z1bmMoVmFjQXR0 clN0YXRzUCBzdGF0cywgaW50IHJvd251bSwgYm9vbCAqaXNOdWxsKQp7CglpbnQJCQlhdHRu dW0gPSBzdGF0cy0+dHVwYXR0bnVtOwoJSGVhcFR1cGxlCXR1cGxlID0gc3RhdHMtPnJvd3Nb cm93bnVtXTsKCVR1cGxlRGVzYwl0dXBEZXNjID0gc3RhdHMtPnR1cERlc2M7CgoJcmV0dXJu IGhlYXBfZ2V0YXR0cih0dXBsZSwgYXR0bnVtLCB0dXBEZXNjLCBpc051bGwpOwp9CgovKgog KiBGZXRjaCBmdW5jdGlvbiBmb3IgYW5hbHl6aW5nIGluZGV4IGV4cHJlc3Npb25zLgogKgog KiBXZSBoYXZlIG5vdCBib3RoZXJlZCB0byBjb25zdHJ1Y3QgaW5kZXggdHVwbGVzLCBpbnN0 ZWFkIHRoZSBkYXRhIGlzCiAqIGp1c3QgaW4gRGF0dW0gYXJyYXlzLgogKi8Kc3RhdGljIERh dHVtCmluZF9mZXRjaF9mdW5jKFZhY0F0dHJTdGF0c1Agc3RhdHMsIGludCByb3dudW0sIGJv b2wgKmlzTnVsbCkKewoJaW50CQkJaTsKCgkvKiBleHBydmFscyBhbmQgZXhwcm51bGxzIGFy ZSBhbHJlYWR5IG9mZnNldCBmb3IgcHJvcGVyIGNvbHVtbiAqLwoJaSA9IHJvd251bSAqIHN0 YXRzLT5yb3dzdHJpZGU7CgkqaXNOdWxsID0gc3RhdHMtPmV4cHJudWxsc1tpXTsKCXJldHVy biBzdGF0cy0+ZXhwcnZhbHNbaV07Cn0KCgovKgogKiA9PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQog KgogKiBDb2RlIGJlbG93IHRoaXMgcG9pbnQgcmVwcmVzZW50cyB0aGUgInN0YW5kYXJkIiB0 eXBlLXNwZWNpZmljIHN0YXRpc3RpY3MKICogYW5hbHlzaXMgYWxnb3JpdGhtcy4gIFRoaXMg Y29kZSBjYW4gYmUgcmVwbGFjZWQgb24gYSBwZXItZGF0YS10eXBlIGJhc2lzCiAqIGJ5IHNl dHRpbmcgYSBub256ZXJvIHZhbHVlIGluIHBnX3R5cGUudHlwYW5hbHl6ZS4KICoKICo9PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PQogKi8KCgovKgogKiBUbyBhdm9pZCBjb25zdW1pbmcgdG9vIG11 Y2ggbWVtb3J5IGR1cmluZyBhbmFseXNpcyBhbmQvb3IgdG9vIG11Y2ggc3BhY2UKICogaW4g dGhlIHJlc3VsdGluZyBwZ19zdGF0aXN0aWMgcm93cywgd2UgaWdub3JlIHZhcmxlbmEgZGF0 dW1zIHRoYXQgYXJlIHdpZGVyCiAqIHRoYW4gV0lEVEhfVEhSRVNIT0xEIChhZnRlciBkZXRv YXN0aW5nISkuICBUaGlzIGlzIGxlZ2l0aW1hdGUgZm9yIE1DVgogKiBhbmQgZGlzdGluY3Qt dmFsdWUgY2FsY3VsYXRpb25zIHNpbmNlIGEgd2lkZSB2YWx1ZSBpcyB1bmxpa2VseSB0byBi ZQogKiBkdXBsaWNhdGVkIGF0IGFsbCwgbXVjaCBsZXNzIGJlIGEgbW9zdC1jb21tb24gdmFs dWUuICBGb3IgdGhlIHNhbWUgcmVhc29uLAogKiBpZ25vcmluZyB3aWRlIHZhbHVlcyB3aWxs IG5vdCBhZmZlY3Qgb3VyIGVzdGltYXRlcyBvZiBoaXN0b2dyYW0gYmluCiAqIGJvdW5kYXJp ZXMgdmVyeSBtdWNoLgogKi8KI2RlZmluZSBXSURUSF9USFJFU0hPTEQgIDEwMjQKCiNkZWZp bmUgc3dhcEludChhLGIpCWRvIHtpbnQgX3RtcDsgX3RtcD1hOyBhPWI7IGI9X3RtcDt9IHdo aWxlKDApCiNkZWZpbmUgc3dhcERhdHVtKGEsYikJZG8ge0RhdHVtIF90bXA7IF90bXA9YTsg YT1iOyBiPV90bXA7fSB3aGlsZSgwKQoKLyoKICogRXh0cmEgaW5mb3JtYXRpb24gdXNlZCBi eSB0aGUgZGVmYXVsdCBhbmFseXNpcyByb3V0aW5lcwogKi8KdHlwZWRlZiBzdHJ1Y3QKewoJ aW50CQkJY291bnQ7CQkJLyogIyBvZiBkdXBsaWNhdGVzICovCglpbnQJCQlmaXJzdDsJCQkv KiB2YWx1ZXNbXSBpbmRleCBvZiBmaXJzdCBvY2N1cnJlbmNlICovCn0gU2NhbGFyTUNWSXRl bTsKCnR5cGVkZWYgc3RydWN0CnsKCVNvcnRTdXBwb3J0IHNzdXA7CglpbnQJCSAgICp0dXBu b0xpbms7Cn0gQ29tcGFyZVNjYWxhcnNDb250ZXh0OwoKCnN0YXRpYyB2b2lkIGNvbXB1dGVf dHJpdmlhbF9zdGF0cyhWYWNBdHRyU3RhdHNQIHN0YXRzLAoJCQkJCQkJCSAgQW5hbHl6ZUF0 dHJGZXRjaEZ1bmMgZmV0Y2hmdW5jLAoJCQkJCQkJCSAgaW50IHNhbXBsZXJvd3MsCgkJCQkJ CQkJICBkb3VibGUgdG90YWxyb3dzKTsKc3RhdGljIHZvaWQgY29tcHV0ZV9kaXN0aW5jdF9z dGF0cyhWYWNBdHRyU3RhdHNQIHN0YXRzLAoJCQkJCQkJCSAgIEFuYWx5emVBdHRyRmV0Y2hG dW5jIGZldGNoZnVuYywKCQkJCQkJCQkgICBpbnQgc2FtcGxlcm93cywKCQkJCQkJCQkgICBk b3VibGUgdG90YWxyb3dzKTsKc3RhdGljIHZvaWQgY29tcHV0ZV9zY2FsYXJfc3RhdHMoVmFj QXR0clN0YXRzUCBzdGF0cywKCQkJCQkJCQkgQW5hbHl6ZUF0dHJGZXRjaEZ1bmMgZmV0Y2hm dW5jLAoJCQkJCQkJCSBpbnQgc2FtcGxlcm93cywKCQkJCQkJCQkgZG91YmxlIHRvdGFscm93 cyk7CnN0YXRpYyBpbnQJY29tcGFyZV9zY2FsYXJzKGNvbnN0IHZvaWQgKmEsIGNvbnN0IHZv aWQgKmIsIHZvaWQgKmFyZyk7CnN0YXRpYyBpbnQJY29tcGFyZV9tY3ZzKGNvbnN0IHZvaWQg KmEsIGNvbnN0IHZvaWQgKmIsIHZvaWQgKmFyZyk7CnN0YXRpYyBpbnQJYW5hbHl6ZV9tY3Zf bGlzdChpbnQgKm1jdl9jb3VudHMsCgkJCQkJCQkgaW50IG51bV9tY3YsCgkJCQkJCQkgZG91 YmxlIHN0YWRpc3RpbmN0LAoJCQkJCQkJIGRvdWJsZSBzdGFudWxsZnJhYywKCQkJCQkJCSBp bnQgc2FtcGxlcm93cywKCQkJCQkJCSBkb3VibGUgdG90YWxyb3dzKTsKCgovKgogKiBzdGRf dHlwYW5hbHl6ZSAtLSB0aGUgZGVmYXVsdCB0eXBlLXNwZWNpZmljIHR5cGFuYWx5emUgZnVu Y3Rpb24KICovCmJvb2wKc3RkX3R5cGFuYWx5emUoVmFjQXR0clN0YXRzICpzdGF0cykKewoJ T2lkCQkJbHRvcHI7CglPaWQJCQllcW9wcjsKCVN0ZEFuYWx5emVEYXRhICpteXN0YXRzOwoK CS8qIElmIHRoZSBhdHRzdGF0dGFyZ2V0IGNvbHVtbiBpcyBuZWdhdGl2ZSwgdXNlIHRoZSBk ZWZhdWx0IHZhbHVlICovCglpZiAoc3RhdHMtPmF0dHN0YXR0YXJnZXQgPCAwKQoJCXN0YXRz LT5hdHRzdGF0dGFyZ2V0ID0gZGVmYXVsdF9zdGF0aXN0aWNzX3RhcmdldDsKCgkvKiBMb29r IGZvciBkZWZhdWx0ICI8IiBhbmQgIj0iIG9wZXJhdG9ycyBmb3IgY29sdW1uJ3MgdHlwZSAq LwoJZ2V0X3NvcnRfZ3JvdXBfb3BlcmF0b3JzKHN0YXRzLT5hdHRydHlwaWQsCgkJCQkJCQkg ZmFsc2UsIGZhbHNlLCBmYWxzZSwKCQkJCQkJCSAmbHRvcHIsICZlcW9wciwgTlVMTCwKCQkJ CQkJCSBOVUxMKTsKCgkvKiBTYXZlIHRoZSBvcGVyYXRvciBpbmZvIGZvciBjb21wdXRlX3N0 YXRzIHJvdXRpbmVzICovCglteXN0YXRzID0gcGFsbG9jX29iamVjdChTdGRBbmFseXplRGF0 YSk7CglteXN0YXRzLT5lcW9wciA9IGVxb3ByOwoJbXlzdGF0cy0+ZXFmdW5jID0gT2lkSXNW YWxpZChlcW9wcikgPyBnZXRfb3Bjb2RlKGVxb3ByKSA6IEludmFsaWRPaWQ7CglteXN0YXRz LT5sdG9wciA9IGx0b3ByOwoJc3RhdHMtPmV4dHJhX2RhdGEgPSBteXN0YXRzOwoKCS8qCgkg KiBEZXRlcm1pbmUgd2hpY2ggc3RhbmRhcmQgc3RhdGlzdGljcyBhbGdvcml0aG0gdG8gdXNl CgkgKi8KCWlmIChPaWRJc1ZhbGlkKGVxb3ByKSAmJiBPaWRJc1ZhbGlkKGx0b3ByKSkKCXsK CQkvKiBTZWVtcyB0byBiZSBhIHNjYWxhciBkYXRhdHlwZSAqLwoJCXN0YXRzLT5jb21wdXRl X3N0YXRzID0gY29tcHV0ZV9zY2FsYXJfc3RhdHM7CgkJLyotLS0tLS0tLS0tLS0tLS0tLS0t LQoJCSAqIFRoZSBmb2xsb3dpbmcgY2hvaWNlIG9mIG1pbnJvd3MgaXMgYmFzZWQgb24gdGhl IHBhcGVyCgkJICogIlJhbmRvbSBzYW1wbGluZyBmb3IgaGlzdG9ncmFtIGNvbnN0cnVjdGlv bjogaG93IG11Y2ggaXMgZW5vdWdoPyIKCQkgKiBieSBTdXJhaml0IENoYXVkaHVyaSwgUmFq ZWV2IE1vdHdhbmkgYW5kIFZpdmVrIE5hcmFzYXl5YSwgaW4KCQkgKiBQcm9jZWVkaW5ncyBv ZiBBQ00gU0lHTU9EIEludGVybmF0aW9uYWwgQ29uZmVyZW5jZSBvbiBNYW5hZ2VtZW50CgkJ ICogb2YgRGF0YSwgMTk5OCwgUGFnZXMgNDM2LTQ0Ny4gIFRoZWlyIENvcm9sbGFyeSAxIHRv IFRoZW9yZW0gNQoJCSAqIHNheXMgdGhhdCBmb3IgdGFibGUgc2l6ZSBuLCBoaXN0b2dyYW0g c2l6ZSBrLCBtYXhpbXVtIHJlbGF0aXZlCgkJICogZXJyb3IgaW4gYmluIHNpemUgZiwgYW5k IGVycm9yIHByb2JhYmlsaXR5IGdhbW1hLCB0aGUgbWluaW11bQoJCSAqIHJhbmRvbSBzYW1w bGUgc2l6ZSBpcwoJCSAqCQlyID0gNCAqIGsgKiBsbigyKm4vZ2FtbWEpIC8gZl4yCgkJICog VGFraW5nIGYgPSAwLjUsIGdhbW1hID0gMC4wMSwgbiA9IDEwXjYgcm93cywgd2Ugb2J0YWlu CgkJICoJCXIgPSAzMDUuODIgKiBrCgkJICogTm90ZSB0aGF0IGJlY2F1c2Ugb2YgdGhlIGxv ZyBmdW5jdGlvbiwgdGhlIGRlcGVuZGVuY2Ugb24gbiBpcwoJCSAqIHF1aXRlIHdlYWs7IGV2 ZW4gYXQgbiA9IDEwXjEyLCBhIDMwMCprIHNhbXBsZSBnaXZlcyA8PSAwLjY2CgkJICogYmlu IHNpemUgZXJyb3Igd2l0aCBwcm9iYWJpbGl0eSAwLjk5LiAgU28gdGhlcmUncyBubyByZWFs IG5lZWQgdG8KCQkgKiBzY2FsZSBmb3Igbiwgd2hpY2ggaXMgYSBnb29kIHRoaW5nIGJlY2F1 c2Ugd2UgZG9uJ3QgbmVjZXNzYXJpbHkKCQkgKiBrbm93IGl0IGF0IHRoaXMgcG9pbnQuCgkJ ICotLS0tLS0tLS0tLS0tLS0tLS0tLQoJCSAqLwoJCXN0YXRzLT5taW5yb3dzID0gMzAwICog c3RhdHMtPmF0dHN0YXR0YXJnZXQ7Cgl9CgllbHNlIGlmIChPaWRJc1ZhbGlkKGVxb3ByKSkK CXsKCQkvKiBXZSBjYW4gc3RpbGwgcmVjb2duaXplIGRpc3RpbmN0IHZhbHVlcyAqLwoJCXN0 YXRzLT5jb21wdXRlX3N0YXRzID0gY29tcHV0ZV9kaXN0aW5jdF9zdGF0czsKCQkvKiBNaWdo dCBhcyB3ZWxsIHVzZSB0aGUgc2FtZSBtaW5yb3dzIGFzIGFib3ZlICovCgkJc3RhdHMtPm1p bnJvd3MgPSAzMDAgKiBzdGF0cy0+YXR0c3RhdHRhcmdldDsKCX0KCWVsc2UKCXsKCQkvKiBD YW4ndCBkbyBtdWNoIGJ1dCB0aGUgdHJpdmlhbCBzdHVmZiAqLwoJCXN0YXRzLT5jb21wdXRl X3N0YXRzID0gY29tcHV0ZV90cml2aWFsX3N0YXRzOwoJCS8qIE1pZ2h0IGFzIHdlbGwgdXNl IHRoZSBzYW1lIG1pbnJvd3MgYXMgYWJvdmUgKi8KCQlzdGF0cy0+bWlucm93cyA9IDMwMCAq IHN0YXRzLT5hdHRzdGF0dGFyZ2V0OwoJfQoKCXJldHVybiB0cnVlOwp9CgoKLyoKICoJY29t cHV0ZV90cml2aWFsX3N0YXRzKCkgLS0gY29tcHV0ZSB2ZXJ5IGJhc2ljIGNvbHVtbiBzdGF0 aXN0aWNzCiAqCiAqCVdlIHVzZSB0aGlzIHdoZW4gd2UgY2Fubm90IGZpbmQgYSBoYXNoICI9 IiBvcGVyYXRvciBmb3IgdGhlIGRhdGF0eXBlLgogKgogKglXZSBkZXRlcm1pbmUgdGhlIGZy YWN0aW9uIG9mIG5vbi1udWxsIHJvd3MgYW5kIHRoZSBhdmVyYWdlIGRhdHVtIHdpZHRoLgog Ki8Kc3RhdGljIHZvaWQKY29tcHV0ZV90cml2aWFsX3N0YXRzKFZhY0F0dHJTdGF0c1Agc3Rh dHMsCgkJCQkJICBBbmFseXplQXR0ckZldGNoRnVuYyBmZXRjaGZ1bmMsCgkJCQkJICBpbnQg c2FtcGxlcm93cywKCQkJCQkgIGRvdWJsZSB0b3RhbHJvd3MpCnsKCWludAkJCWk7CglpbnQJ CQludWxsX2NudCA9IDA7CglpbnQJCQlub25udWxsX2NudCA9IDA7Cglkb3VibGUJCXRvdGFs X3dpZHRoID0gMDsKCWJvb2wJCWlzX3ZhcmxlbmEgPSAoIXN0YXRzLT5hdHRydHlwZS0+dHlw Ynl2YWwgJiYKCQkJCQkJCSAgc3RhdHMtPmF0dHJ0eXBlLT50eXBsZW4gPT0gLTEpOwoJYm9v bAkJaXNfdmFyd2lkdGggPSAoIXN0YXRzLT5hdHRydHlwZS0+dHlwYnl2YWwgJiYKCQkJCQkJ CSAgIHN0YXRzLT5hdHRydHlwZS0+dHlwbGVuIDwgMCk7CgoJZm9yIChpID0gMDsgaSA8IHNh bXBsZXJvd3M7IGkrKykKCXsKCQlEYXR1bQkJdmFsdWU7CgkJYm9vbAkJaXNudWxsOwoKCQl2 YWN1dW1fZGVsYXlfcG9pbnQodHJ1ZSk7CgoJCXZhbHVlID0gZmV0Y2hmdW5jKHN0YXRzLCBp LCAmaXNudWxsKTsKCgkJLyogQ2hlY2sgZm9yIG51bGwvbm9ubnVsbCAqLwoJCWlmIChpc251 bGwpCgkJewoJCQludWxsX2NudCsrOwoJCQljb250aW51ZTsKCQl9CgkJbm9ubnVsbF9jbnQr KzsKCgkJLyoKCQkgKiBJZiBpdCdzIGEgdmFyaWFibGUtd2lkdGggZmllbGQsIGFkZCB1cCB3 aWR0aHMgZm9yIGF2ZXJhZ2Ugd2lkdGgKCQkgKiBjYWxjdWxhdGlvbi4gIE5vdGUgdGhhdCBp ZiB0aGUgdmFsdWUgaXMgdG9hc3RlZCwgd2UgdXNlIHRoZSB0b2FzdGVkCgkJICogd2lkdGgu ICBXZSBkb24ndCBib3RoZXIgd2l0aCB0aGlzIGNhbGN1bGF0aW9uIGlmIGl0J3MgYSBmaXhl ZC13aWR0aAoJCSAqIHR5cGUuCgkJICovCgkJaWYgKGlzX3ZhcmxlbmEpCgkJewoJCQl0b3Rh bF93aWR0aCArPSBWQVJTSVpFX0FOWShEYXR1bUdldFBvaW50ZXIodmFsdWUpKTsKCQl9CgkJ ZWxzZSBpZiAoaXNfdmFyd2lkdGgpCgkJewoJCQkvKiBtdXN0IGJlIGNzdHJpbmcgKi8KCQkJ dG90YWxfd2lkdGggKz0gc3RybGVuKERhdHVtR2V0Q1N0cmluZyh2YWx1ZSkpICsgMTsKCQl9 Cgl9CgoJLyogV2UgY2FuIG9ubHkgY29tcHV0ZSBhdmVyYWdlIHdpZHRoIGlmIHdlIGZvdW5k IHNvbWUgbm9uLW51bGwgdmFsdWVzLiAqLwoJaWYgKG5vbm51bGxfY250ID4gMCkKCXsKCQlz dGF0cy0+c3RhdHNfdmFsaWQgPSB0cnVlOwoJCS8qIERvIHRoZSBzaW1wbGUgbnVsbC1mcmFj IGFuZCB3aWR0aCBzdGF0cyAqLwoJCXN0YXRzLT5zdGFudWxsZnJhYyA9IChkb3VibGUpIG51 bGxfY250IC8gKGRvdWJsZSkgc2FtcGxlcm93czsKCQlpZiAoaXNfdmFyd2lkdGgpCgkJCXN0 YXRzLT5zdGF3aWR0aCA9IHRvdGFsX3dpZHRoIC8gKGRvdWJsZSkgbm9ubnVsbF9jbnQ7CgkJ ZWxzZQoJCQlzdGF0cy0+c3Rhd2lkdGggPSBzdGF0cy0+YXR0cnR5cGUtPnR5cGxlbjsKCQlz dGF0cy0+c3RhZGlzdGluY3QgPSAwLjA7CS8qICJ1bmtub3duIiAqLwoJfQoJZWxzZSBpZiAo bnVsbF9jbnQgPiAwKQoJewoJCS8qIFdlIGZvdW5kIG9ubHkgbnVsbHM7IGFzc3VtZSB0aGUg Y29sdW1uIGlzIGVudGlyZWx5IG51bGwgKi8KCQlzdGF0cy0+c3RhdHNfdmFsaWQgPSB0cnVl OwoJCXN0YXRzLT5zdGFudWxsZnJhYyA9IDEuMDsKCQlpZiAoaXNfdmFyd2lkdGgpCgkJCXN0 YXRzLT5zdGF3aWR0aCA9IDA7CS8qICJ1bmtub3duIiAqLwoJCWVsc2UKCQkJc3RhdHMtPnN0 YXdpZHRoID0gc3RhdHMtPmF0dHJ0eXBlLT50eXBsZW47CgkJc3RhdHMtPnN0YWRpc3RpbmN0 ID0gMC4wOwkvKiAidW5rbm93biIgKi8KCX0KfQoKCi8qCiAqCWNvbXB1dGVfZGlzdGluY3Rf c3RhdHMoKSAtLSBjb21wdXRlIGNvbHVtbiBzdGF0aXN0aWNzIGluY2x1ZGluZyBuZGlzdGlu Y3QKICoKICoJV2UgdXNlIHRoaXMgd2hlbiB3ZSBjYW4gZmluZCBvbmx5IGFuICI9IiBvcGVy YXRvciBmb3IgdGhlIGRhdGF0eXBlLgogKgogKglXZSBkZXRlcm1pbmUgdGhlIGZyYWN0aW9u IG9mIG5vbi1udWxsIHJvd3MsIHRoZSBhdmVyYWdlIHdpZHRoLCB0aGUKICoJbW9zdCBjb21t b24gdmFsdWVzLCBhbmQgdGhlIChlc3RpbWF0ZWQpIG51bWJlciBvZiBkaXN0aW5jdCB2YWx1 ZXMuCiAqCiAqCVRoZSBtb3N0IGNvbW1vbiB2YWx1ZXMgYXJlIGRldGVybWluZWQgYnkgYnJ1 dGUgZm9yY2U6IHdlIGtlZXAgYSBsaXN0CiAqCW9mIHByZXZpb3VzbHkgc2VlbiB2YWx1ZXMs IG9yZGVyZWQgYnkgbnVtYmVyIG9mIHRpbWVzIHNlZW4sIGFzIHdlIHNjYW4KICoJdGhlIHNh bXBsZXMuICBBIG5ld2x5IHNlZW4gdmFsdWUgaXMgaW5zZXJ0ZWQganVzdCBhZnRlciB0aGUg bGFzdAogKgltdWx0aXBseS1zZWVuIHZhbHVlLCBjYXVzaW5nIHRoZSBib3R0b21tb3N0IChv bGRlc3QpIHNpbmdseS1zZWVuIHZhbHVlCiAqCXRvIGRyb3Agb2ZmIHRoZSBsaXN0LiAgVGhl IGFjY3VyYWN5IG9mIHRoaXMgbWV0aG9kLCBhbmQgYWxzbyBpdHMgY29zdCwKICoJZGVwZW5k IG1haW5seSBvbiB0aGUgbGVuZ3RoIG9mIHRoZSBsaXN0IHdlIGFyZSB3aWxsaW5nIHRvIGtl ZXAuCiAqLwpzdGF0aWMgdm9pZApjb21wdXRlX2Rpc3RpbmN0X3N0YXRzKFZhY0F0dHJTdGF0 c1Agc3RhdHMsCgkJCQkJICAgQW5hbHl6ZUF0dHJGZXRjaEZ1bmMgZmV0Y2hmdW5jLAoJCQkJ CSAgIGludCBzYW1wbGVyb3dzLAoJCQkJCSAgIGRvdWJsZSB0b3RhbHJvd3MpCnsKCWludAkJ CWk7CglpbnQJCQludWxsX2NudCA9IDA7CglpbnQJCQlub25udWxsX2NudCA9IDA7CglpbnQJ CQl0b293aWRlX2NudCA9IDA7Cglkb3VibGUJCXRvdGFsX3dpZHRoID0gMDsKCWJvb2wJCWlz X3ZhcmxlbmEgPSAoIXN0YXRzLT5hdHRydHlwZS0+dHlwYnl2YWwgJiYKCQkJCQkJCSAgc3Rh dHMtPmF0dHJ0eXBlLT50eXBsZW4gPT0gLTEpOwoJYm9vbAkJaXNfdmFyd2lkdGggPSAoIXN0 YXRzLT5hdHRydHlwZS0+dHlwYnl2YWwgJiYKCQkJCQkJCSAgIHN0YXRzLT5hdHRydHlwZS0+ dHlwbGVuIDwgMCk7CglGbWdySW5mbwlmX2NtcGVxOwoJdHlwZWRlZiBzdHJ1Y3QKCXsKCQlE YXR1bQkJdmFsdWU7CgkJaW50CQkJY291bnQ7Cgl9IFRyYWNrSXRlbTsKCVRyYWNrSXRlbSAg KnRyYWNrOwoJaW50CQkJdHJhY2tfY250LAoJCQkJdHJhY2tfbWF4OwoJaW50CQkJbnVtX21j diA9IHN0YXRzLT5hdHRzdGF0dGFyZ2V0OwoJU3RkQW5hbHl6ZURhdGEgKm15c3RhdHMgPSAo U3RkQW5hbHl6ZURhdGEgKikgc3RhdHMtPmV4dHJhX2RhdGE7CgoJLyoKCSAqIFdlIHRyYWNr IHVwIHRvIDIqbiB2YWx1ZXMgZm9yIGFuIG4tZWxlbWVudCBNQ1YgbGlzdDsgYnV0IGF0IGxl YXN0IDEwCgkgKi8KCXRyYWNrX21heCA9IDIgKiBudW1fbWN2OwoJaWYgKHRyYWNrX21heCA8 IDEwKQoJCXRyYWNrX21heCA9IDEwOwoJdHJhY2sgPSAoVHJhY2tJdGVtICopIHBhbGxvYyh0 cmFja19tYXggKiBzaXplb2YoVHJhY2tJdGVtKSk7Cgl0cmFja19jbnQgPSAwOwoKCWZtZ3Jf aW5mbyhteXN0YXRzLT5lcWZ1bmMsICZmX2NtcGVxKTsKCglmb3IgKGkgPSAwOyBpIDwgc2Ft cGxlcm93czsgaSsrKQoJewoJCURhdHVtCQl2YWx1ZTsKCQlib29sCQlpc251bGw7CgkJYm9v bAkJbWF0Y2g7CgkJaW50CQkJZmlyc3Rjb3VudDEsCgkJCQkJajsKCgkJdmFjdXVtX2RlbGF5 X3BvaW50KHRydWUpOwoKCQl2YWx1ZSA9IGZldGNoZnVuYyhzdGF0cywgaSwgJmlzbnVsbCk7 CgoJCS8qIENoZWNrIGZvciBudWxsL25vbm51bGwgKi8KCQlpZiAoaXNudWxsKQoJCXsKCQkJ bnVsbF9jbnQrKzsKCQkJY29udGludWU7CgkJfQoJCW5vbm51bGxfY250Kys7CgoJCS8qCgkJ ICogSWYgaXQncyBhIHZhcmlhYmxlLXdpZHRoIGZpZWxkLCBhZGQgdXAgd2lkdGhzIGZvciBh dmVyYWdlIHdpZHRoCgkJICogY2FsY3VsYXRpb24uICBOb3RlIHRoYXQgaWYgdGhlIHZhbHVl IGlzIHRvYXN0ZWQsIHdlIHVzZSB0aGUgdG9hc3RlZAoJCSAqIHdpZHRoLiAgV2UgZG9uJ3Qg Ym90aGVyIHdpdGggdGhpcyBjYWxjdWxhdGlvbiBpZiBpdCdzIGEgZml4ZWQtd2lkdGgKCQkg KiB0eXBlLgoJCSAqLwoJCWlmIChpc192YXJsZW5hKQoJCXsKCQkJdG90YWxfd2lkdGggKz0g VkFSU0laRV9BTlkoRGF0dW1HZXRQb2ludGVyKHZhbHVlKSk7CgoJCQkvKgoJCQkgKiBJZiB0 aGUgdmFsdWUgaXMgdG9hc3RlZCwgd2Ugd2FudCB0byBkZXRvYXN0IGl0IGp1c3Qgb25jZSB0 bwoJCQkgKiBhdm9pZCByZXBlYXRlZCBkZXRvYXN0aW5ncyBhbmQgcmVzdWx0YW50IGV4Y2Vz cyBtZW1vcnkgdXNhZ2UKCQkJICogZHVyaW5nIHRoZSBjb21wYXJpc29ucy4gIEFsc28sIGNo ZWNrIHRvIHNlZSBpZiB0aGUgdmFsdWUgaXMKCQkJICogZXhjZXNzaXZlbHkgd2lkZSwgYW5k IGlmIHNvIGRvbid0IGRldG9hc3QgYXQgYWxsIC0tLSBqdXN0CgkJCSAqIGlnbm9yZSB0aGUg dmFsdWUuCgkJCSAqLwoJCQlpZiAodG9hc3RfcmF3X2RhdHVtX3NpemUodmFsdWUpID4gV0lE VEhfVEhSRVNIT0xEKQoJCQl7CgkJCQl0b293aWRlX2NudCsrOwoJCQkJY29udGludWU7CgkJ CX0KCQkJdmFsdWUgPSBQb2ludGVyR2V0RGF0dW0oUEdfREVUT0FTVF9EQVRVTSh2YWx1ZSkp OwoJCX0KCQllbHNlIGlmIChpc192YXJ3aWR0aCkKCQl7CgkJCS8qIG11c3QgYmUgY3N0cmlu ZyAqLwoJCQl0b3RhbF93aWR0aCArPSBzdHJsZW4oRGF0dW1HZXRDU3RyaW5nKHZhbHVlKSkg KyAxOwoJCX0KCgkJLyoKCQkgKiBTZWUgaWYgdGhlIHZhbHVlIG1hdGNoZXMgYW55dGhpbmcg d2UncmUgYWxyZWFkeSB0cmFja2luZy4KCQkgKi8KCQltYXRjaCA9IGZhbHNlOwoJCWZpcnN0 Y291bnQxID0gdHJhY2tfY250OwoJCWZvciAoaiA9IDA7IGogPCB0cmFja19jbnQ7IGorKykK CQl7CgkJCWlmIChEYXR1bUdldEJvb2woRnVuY3Rpb25DYWxsMkNvbGwoJmZfY21wZXEsCgkJ CQkJCQkJCQkJICAgc3RhdHMtPmF0dHJjb2xsaWQsCgkJCQkJCQkJCQkJICAgdmFsdWUsIHRy YWNrW2pdLnZhbHVlKSkpCgkJCXsKCQkJCW1hdGNoID0gdHJ1ZTsKCQkJCWJyZWFrOwoJCQl9 CgkJCWlmIChqIDwgZmlyc3Rjb3VudDEgJiYgdHJhY2tbal0uY291bnQgPT0gMSkKCQkJCWZp cnN0Y291bnQxID0gajsKCQl9CgoJCWlmIChtYXRjaCkKCQl7CgkJCS8qIEZvdW5kIGEgbWF0 Y2ggKi8KCQkJdHJhY2tbal0uY291bnQrKzsKCQkJLyogVGhpcyB2YWx1ZSBtYXkgbm93IG5l ZWQgdG8gImJ1YmJsZSB1cCIgaW4gdGhlIHRyYWNrIGxpc3QgKi8KCQkJd2hpbGUgKGogPiAw ICYmIHRyYWNrW2pdLmNvdW50ID4gdHJhY2tbaiAtIDFdLmNvdW50KQoJCQl7CgkJCQlzd2Fw RGF0dW0odHJhY2tbal0udmFsdWUsIHRyYWNrW2ogLSAxXS52YWx1ZSk7CgkJCQlzd2FwSW50 KHRyYWNrW2pdLmNvdW50LCB0cmFja1tqIC0gMV0uY291bnQpOwoJCQkJai0tOwoJCQl9CgkJ fQoJCWVsc2UKCQl7CgkJCS8qIE5vIG1hdGNoLiAgSW5zZXJ0IGF0IGhlYWQgb2YgY291bnQt MSBsaXN0ICovCgkJCWlmICh0cmFja19jbnQgPCB0cmFja19tYXgpCgkJCQl0cmFja19jbnQr KzsKCQkJZm9yIChqID0gdHJhY2tfY250IC0gMTsgaiA+IGZpcnN0Y291bnQxOyBqLS0pCgkJ CXsKCQkJCXRyYWNrW2pdLnZhbHVlID0gdHJhY2tbaiAtIDFdLnZhbHVlOwoJCQkJdHJhY2tb al0uY291bnQgPSB0cmFja1tqIC0gMV0uY291bnQ7CgkJCX0KCQkJaWYgKGZpcnN0Y291bnQx IDwgdHJhY2tfY250KQoJCQl7CgkJCQl0cmFja1tmaXJzdGNvdW50MV0udmFsdWUgPSB2YWx1 ZTsKCQkJCXRyYWNrW2ZpcnN0Y291bnQxXS5jb3VudCA9IDE7CgkJCX0KCQl9Cgl9CgoJLyog V2UgY2FuIG9ubHkgY29tcHV0ZSByZWFsIHN0YXRzIGlmIHdlIGZvdW5kIHNvbWUgbm9uLW51 bGwgdmFsdWVzLiAqLwoJaWYgKG5vbm51bGxfY250ID4gMCkKCXsKCQlpbnQJCQlubXVsdGlw bGUsCgkJCQkJc3VtbXVsdGlwbGU7CgoJCXN0YXRzLT5zdGF0c192YWxpZCA9IHRydWU7CgkJ LyogRG8gdGhlIHNpbXBsZSBudWxsLWZyYWMgYW5kIHdpZHRoIHN0YXRzICovCgkJc3RhdHMt PnN0YW51bGxmcmFjID0gKGRvdWJsZSkgbnVsbF9jbnQgLyAoZG91YmxlKSBzYW1wbGVyb3dz OwoJCWlmIChpc192YXJ3aWR0aCkKCQkJc3RhdHMtPnN0YXdpZHRoID0gdG90YWxfd2lkdGgg LyAoZG91YmxlKSBub25udWxsX2NudDsKCQllbHNlCgkJCXN0YXRzLT5zdGF3aWR0aCA9IHN0 YXRzLT5hdHRydHlwZS0+dHlwbGVuOwoKCQkvKiBDb3VudCB0aGUgbnVtYmVyIG9mIHZhbHVl cyB3ZSBmb3VuZCBtdWx0aXBsZSB0aW1lcyAqLwoJCXN1bW11bHRpcGxlID0gMDsKCQlmb3Ig KG5tdWx0aXBsZSA9IDA7IG5tdWx0aXBsZSA8IHRyYWNrX2NudDsgbm11bHRpcGxlKyspCgkJ ewoJCQlpZiAodHJhY2tbbm11bHRpcGxlXS5jb3VudCA9PSAxKQoJCQkJYnJlYWs7CgkJCXN1 bW11bHRpcGxlICs9IHRyYWNrW25tdWx0aXBsZV0uY291bnQ7CgkJfQoKCQlpZiAobm11bHRp cGxlID09IDApCgkJewoJCQkvKgoJCQkgKiBJZiB3ZSBmb3VuZCBubyByZXBlYXRlZCBub24t bnVsbCB2YWx1ZXMsIGFzc3VtZSBpdCdzIGEgdW5pcXVlCgkJCSAqIGNvbHVtbjsgYnV0IGJl IHN1cmUgdG8gZGlzY291bnQgZm9yIGFueSBudWxscyB3ZSBmb3VuZC4KCQkJICovCgkJCXN0 YXRzLT5zdGFkaXN0aW5jdCA9IC0xLjAgKiAoMS4wIC0gc3RhdHMtPnN0YW51bGxmcmFjKTsK CQl9CgkJZWxzZSBpZiAodHJhY2tfY250IDwgdHJhY2tfbWF4ICYmIHRvb3dpZGVfY250ID09 IDAgJiYKCQkJCSBubXVsdGlwbGUgPT0gdHJhY2tfY250KQoJCXsKCQkJLyoKCQkJICogT3Vy IHRyYWNrIGxpc3QgaW5jbHVkZXMgZXZlcnkgdmFsdWUgaW4gdGhlIHNhbXBsZSwgYW5kIGV2 ZXJ5CgkJCSAqIHZhbHVlIGFwcGVhcmVkIG1vcmUgdGhhbiBvbmNlLiAgQXNzdW1lIHRoZSBj b2x1bW4gaGFzIGp1c3QKCQkJICogdGhlc2UgdmFsdWVzLiAgKFRoaXMgY2FzZSBpcyBtZWFu dCB0byBhZGRyZXNzIGNvbHVtbnMgd2l0aAoJCQkgKiBzbWFsbCwgZml4ZWQgc2V0cyBvZiBw b3NzaWJsZSB2YWx1ZXMsIHN1Y2ggYXMgYm9vbGVhbiBvciBlbnVtCgkJCSAqIGNvbHVtbnMu ICBJZiB0aGVyZSBhcmUgYW55IHZhbHVlcyB0aGF0IGFwcGVhciBqdXN0IG9uY2UgaW4gdGhl CgkJCSAqIHNhbXBsZSwgaW5jbHVkaW5nIHRvby13aWRlIHZhbHVlcywgd2Ugc2hvdWxkIGFz c3VtZSB0aGF0IHRoYXQncwoJCQkgKiBub3Qgd2hhdCB3ZSdyZSBkZWFsaW5nIHdpdGguKQoJ CQkgKi8KCQkJc3RhdHMtPnN0YWRpc3RpbmN0ID0gdHJhY2tfY250OwoJCX0KCQllbHNlCgkJ ewoJCQkvKi0tLS0tLS0tLS0KCQkJICogRXN0aW1hdGUgdGhlIG51bWJlciBvZiBkaXN0aW5j dCB2YWx1ZXMgdXNpbmcgdGhlIGVzdGltYXRvcgoJCQkgKiBwcm9wb3NlZCBieSBIYWFzIGFu ZCBTdG9rZXMgaW4gSUJNIFJlc2VhcmNoIFJlcG9ydCBSSiAxMDAyNToKCQkJICoJCW4qZCAv IChuIC0gZjEgKyBmMSpuL04pCgkJCSAqIHdoZXJlIGYxIGlzIHRoZSBudW1iZXIgb2YgZGlz dGluY3QgdmFsdWVzIHRoYXQgb2NjdXJyZWQKCQkJICogZXhhY3RseSBvbmNlIGluIG91ciBz YW1wbGUgb2YgbiByb3dzIChmcm9tIGEgdG90YWwgb2YgTiksCgkJCSAqIGFuZCBkIGlzIHRo ZSB0b3RhbCBudW1iZXIgb2YgZGlzdGluY3QgdmFsdWVzIGluIHRoZSBzYW1wbGUuCgkJCSAq IFRoaXMgaXMgdGhlaXIgRHVqMSBlc3RpbWF0b3I7IHRoZSBvdGhlciBlc3RpbWF0b3JzIHRo ZXkKCQkJICogcmVjb21tZW5kIGFyZSBjb25zaWRlcmFibHkgbW9yZSBjb21wbGV4LCBhbmQg YXJlIG51bWVyaWNhbGx5CgkJCSAqIHZlcnkgdW5zdGFibGUgd2hlbiBuIGlzIG11Y2ggc21h bGxlciB0aGFuIE4uCgkJCSAqCgkJCSAqIEluIHRoaXMgY2FsY3VsYXRpb24sIHdlIGNvbnNp ZGVyIG9ubHkgbm9uLW51bGxzLiAgV2UgdXNlZCB0bwoJCQkgKiBpbmNsdWRlIHJvd3Mgd2l0 aCBudWxsIHZhbHVlcyBpbiB0aGUgbiBhbmQgTiBjb3VudHMsIGJ1dCB0aGF0CgkJCSAqIGxl YWRzIHRvIGluYWNjdXJhdGUgYW5zd2VycyBpbiBjb2x1bW5zIHdpdGggbWFueSBudWxscywg YW5kCgkJCSAqIGl0J3MgaW50dWl0aXZlbHkgYm9ndXMgYW55d2F5IGNvbnNpZGVyaW5nIHRo ZSBkZXNpcmVkIHJlc3VsdCBpcwoJCQkgKiB0aGUgbnVtYmVyIG9mIGRpc3RpbmN0IG5vbi1u dWxsIHZhbHVlcy4KCQkJICoKCQkJICogV2UgYXNzdW1lIChub3QgdmVyeSByZWxpYWJseSEp IHRoYXQgYWxsIHRoZSBtdWx0aXBseS1vY2N1cnJpbmcKCQkJICogdmFsdWVzIGFyZSByZWZs ZWN0ZWQgaW4gdGhlIGZpbmFsIHRyYWNrW10gbGlzdCwgYW5kIHRoZSBvdGhlcgoJCQkgKiBu b25udWxsIHZhbHVlcyBhbGwgYXBwZWFyZWQgYnV0IG9uY2UuICAoWFhYIHRoaXMgdXN1YWxs eQoJCQkgKiByZXN1bHRzIGluIGEgZHJhc3RpYyBvdmVyZXN0aW1hdGUgb2YgbmRpc3RpbmN0 LiAgQ2FuIHdlIGRvCgkJCSAqIGFueSBiZXR0ZXI/KQoJCQkgKi0tLS0tLS0tLS0KCQkJICov CgkJCWludAkJCWYxID0gbm9ubnVsbF9jbnQgLSBzdW1tdWx0aXBsZTsKCQkJaW50CQkJZCA9 IGYxICsgbm11bHRpcGxlOwoJCQlkb3VibGUJCW4gPSBzYW1wbGVyb3dzIC0gbnVsbF9jbnQ7 CgkJCWRvdWJsZQkJTiA9IHRvdGFscm93cyAqICgxLjAgLSBzdGF0cy0+c3RhbnVsbGZyYWMp OwoJCQlkb3VibGUJCXN0YWRpc3RpbmN0OwoKCQkJLyogTiA9PSAwIHNob3VsZG4ndCBoYXBw ZW4sIGJ1dCBqdXN0IGluIGNhc2UgLi4uICovCgkJCWlmIChOID4gMCkKCQkJCXN0YWRpc3Rp bmN0ID0gKG4gKiBkKSAvICgobiAtIGYxKSArIGYxICogbiAvIE4pOwoJCQllbHNlCgkJCQlz dGFkaXN0aW5jdCA9IDA7CgoJCQkvKiBDbGFtcCB0byBzYW5lIHJhbmdlIGluIGNhc2Ugb2Yg cm91bmRvZmYgZXJyb3IgKi8KCQkJaWYgKHN0YWRpc3RpbmN0IDwgZCkKCQkJCXN0YWRpc3Rp bmN0ID0gZDsKCQkJaWYgKHN0YWRpc3RpbmN0ID4gTikKCQkJCXN0YWRpc3RpbmN0ID0gTjsK CQkJLyogQW5kIHJvdW5kIHRvIGludGVnZXIgKi8KCQkJc3RhdHMtPnN0YWRpc3RpbmN0ID0g Zmxvb3Ioc3RhZGlzdGluY3QgKyAwLjUpOwoJCX0KCgkJLyoKCQkgKiBJZiB3ZSBlc3RpbWF0 ZWQgdGhlIG51bWJlciBvZiBkaXN0aW5jdCB2YWx1ZXMgYXQgbW9yZSB0aGFuIDEwJSBvZgoJ CSAqIHRoZSB0b3RhbCByb3cgY291bnQgKGEgdmVyeSBhcmJpdHJhcnkgbGltaXQpLCB0aGVu IGFzc3VtZSB0aGF0CgkJICogc3RhZGlzdGluY3Qgc2hvdWxkIHNjYWxlIHdpdGggdGhlIHJv dyBjb3VudCByYXRoZXIgdGhhbiBiZSBhIGZpeGVkCgkJICogdmFsdWUuCgkJICovCgkJaWYg KHN0YXRzLT5zdGFkaXN0aW5jdCA+IDAuMSAqIHRvdGFscm93cykKCQkJc3RhdHMtPnN0YWRp c3RpbmN0ID0gLShzdGF0cy0+c3RhZGlzdGluY3QgLyB0b3RhbHJvd3MpOwoKCQkvKgoJCSAq IERlY2lkZSBob3cgbWFueSB2YWx1ZXMgYXJlIHdvcnRoIHN0b3JpbmcgYXMgbW9zdC1jb21t b24gdmFsdWVzLiBJZgoJCSAqIHdlIGFyZSBhYmxlIHRvIGdlbmVyYXRlIGEgY29tcGxldGUg TUNWIGxpc3QgKGFsbCB0aGUgdmFsdWVzIGluIHRoZQoJCSAqIHNhbXBsZSB3aWxsIGZpdCwg YW5kIHdlIHRoaW5rIHRoZXNlIGFyZSBhbGwgdGhlIG9uZXMgaW4gdGhlIHRhYmxlKSwKCQkg KiB0aGVuIGRvIHNvLiAgT3RoZXJ3aXNlLCBzdG9yZSBvbmx5IHRob3NlIHZhbHVlcyB0aGF0 IGFyZQoJCSAqIHNpZ25pZmljYW50bHkgbW9yZSBjb21tb24gdGhhbiB0aGUgdmFsdWVzIG5v dCBpbiB0aGUgbGlzdC4KCQkgKgoJCSAqIE5vdGU6IHRoZSBmaXJzdCBvZiB0aGVzZSBjYXNl cyBpcyBtZWFudCB0byBhZGRyZXNzIGNvbHVtbnMgd2l0aAoJCSAqIHNtYWxsLCBmaXhlZCBz ZXRzIG9mIHBvc3NpYmxlIHZhbHVlcywgc3VjaCBhcyBib29sZWFuIG9yIGVudW0KCQkgKiBj b2x1bW5zLiAgSWYgd2UgY2FuICpjb21wbGV0ZWx5KiByZXByZXNlbnQgdGhlIGNvbHVtbiBw b3B1bGF0aW9uIGJ5CgkJICogYW4gTUNWIGxpc3QgdGhhdCB3aWxsIGZpdCBpbnRvIHRoZSBz dGF0cyB0YXJnZXQsIHRoZW4gd2Ugc2hvdWxkIGRvCgkJICogc28gYW5kIHRodXMgcHJvdmlk ZSB0aGUgcGxhbm5lciB3aXRoIGNvbXBsZXRlIGluZm9ybWF0aW9uLiAgQnV0IGlmCgkJICog dGhlIE1DViBsaXN0IGlzIG5vdCBjb21wbGV0ZSwgaXQncyBnZW5lcmFsbHkgd29ydGggYmVp bmcgbW9yZQoJCSAqIHNlbGVjdGl2ZSwgYW5kIG5vdCBqdXN0IGZpbGxpbmcgaXQgYWxsIHRo ZSB3YXkgdXAgdG8gdGhlIHN0YXRzCgkJICogdGFyZ2V0LgoJCSAqLwoJCWlmICh0cmFja19j bnQgPCB0cmFja19tYXggJiYgdG9vd2lkZV9jbnQgPT0gMCAmJgoJCQlzdGF0cy0+c3RhZGlz dGluY3QgPiAwICYmCgkJCXRyYWNrX2NudCA8PSBudW1fbWN2KQoJCXsKCQkJLyogVHJhY2sg bGlzdCBpbmNsdWRlcyBhbGwgdmFsdWVzIHNlZW4sIGFuZCBhbGwgd2lsbCBmaXQgKi8KCQkJ bnVtX21jdiA9IHRyYWNrX2NudDsKCQl9CgkJZWxzZQoJCXsKCQkJaW50CQkgICAqbWN2X2Nv dW50czsKCgkJCS8qIEluY29tcGxldGUgbGlzdDsgZGVjaWRlIGhvdyBtYW55IHZhbHVlcyBh cmUgd29ydGgga2VlcGluZyAqLwoJCQlpZiAobnVtX21jdiA+IHRyYWNrX2NudCkKCQkJCW51 bV9tY3YgPSB0cmFja19jbnQ7CgoJCQlpZiAobnVtX21jdiA+IDApCgkJCXsKCQkJCW1jdl9j b3VudHMgPSAoaW50ICopIHBhbGxvYyhudW1fbWN2ICogc2l6ZW9mKGludCkpOwoJCQkJZm9y IChpID0gMDsgaSA8IG51bV9tY3Y7IGkrKykKCQkJCQltY3ZfY291bnRzW2ldID0gdHJhY2tb aV0uY291bnQ7CgoJCQkJbnVtX21jdiA9IGFuYWx5emVfbWN2X2xpc3QobWN2X2NvdW50cywg bnVtX21jdiwKCQkJCQkJCQkJCSAgIHN0YXRzLT5zdGFkaXN0aW5jdCwKCQkJCQkJCQkJCSAg IHN0YXRzLT5zdGFudWxsZnJhYywKCQkJCQkJCQkJCSAgIHNhbXBsZXJvd3MsIHRvdGFscm93 cyk7CgkJCX0KCQl9CgoJCS8qIEdlbmVyYXRlIE1DViBzbG90IGVudHJ5ICovCgkJaWYgKG51 bV9tY3YgPiAwKQoJCXsKCQkJTWVtb3J5Q29udGV4dCBvbGRfY29udGV4dDsKCQkJRGF0dW0J ICAgKm1jdl92YWx1ZXM7CgkJCWZsb2F0NAkgICAqbWN2X2ZyZXFzOwoKCQkJLyogTXVzdCBj b3B5IHRoZSB0YXJnZXQgdmFsdWVzIGludG8gYW5sX2NvbnRleHQgKi8KCQkJb2xkX2NvbnRl eHQgPSBNZW1vcnlDb250ZXh0U3dpdGNoVG8oc3RhdHMtPmFubF9jb250ZXh0KTsKCQkJbWN2 X3ZhbHVlcyA9IChEYXR1bSAqKSBwYWxsb2MobnVtX21jdiAqIHNpemVvZihEYXR1bSkpOwoJ CQltY3ZfZnJlcXMgPSAoZmxvYXQ0ICopIHBhbGxvYyhudW1fbWN2ICogc2l6ZW9mKGZsb2F0 NCkpOwoJCQlmb3IgKGkgPSAwOyBpIDwgbnVtX21jdjsgaSsrKQoJCQl7CgkJCQltY3ZfdmFs dWVzW2ldID0gZGF0dW1Db3B5KHRyYWNrW2ldLnZhbHVlLAoJCQkJCQkJCQkJICBzdGF0cy0+ YXR0cnR5cGUtPnR5cGJ5dmFsLAoJCQkJCQkJCQkJICBzdGF0cy0+YXR0cnR5cGUtPnR5cGxl bik7CgkJCQltY3ZfZnJlcXNbaV0gPSAoZG91YmxlKSB0cmFja1tpXS5jb3VudCAvIChkb3Vi bGUpIHNhbXBsZXJvd3M7CgkJCX0KCQkJTWVtb3J5Q29udGV4dFN3aXRjaFRvKG9sZF9jb250 ZXh0KTsKCgkJCXN0YXRzLT5zdGFraW5kWzBdID0gU1RBVElTVElDX0tJTkRfTUNWOwoJCQlz dGF0cy0+c3Rhb3BbMF0gPSBteXN0YXRzLT5lcW9wcjsKCQkJc3RhdHMtPnN0YWNvbGxbMF0g PSBzdGF0cy0+YXR0cmNvbGxpZDsKCQkJc3RhdHMtPnN0YW51bWJlcnNbMF0gPSBtY3ZfZnJl cXM7CgkJCXN0YXRzLT5udW1udW1iZXJzWzBdID0gbnVtX21jdjsKCQkJc3RhdHMtPnN0YXZh bHVlc1swXSA9IG1jdl92YWx1ZXM7CgkJCXN0YXRzLT5udW12YWx1ZXNbMF0gPSBudW1fbWN2 OwoKCQkJLyoKCQkJICogQWNjZXB0IHRoZSBkZWZhdWx0cyBmb3Igc3RhdHMtPnN0YXR5cGlk IGFuZCBvdGhlcnMuIFRoZXkgaGF2ZQoJCQkgKiBiZWVuIHNldCBiZWZvcmUgd2Ugd2VyZSBj YWxsZWQgKHNlZSB2YWN1dW0uaCkKCQkJICovCgkJfQoJfQoJZWxzZSBpZiAobnVsbF9jbnQg PiAwKQoJewoJCS8qIFdlIGZvdW5kIG9ubHkgbnVsbHM7IGFzc3VtZSB0aGUgY29sdW1uIGlz IGVudGlyZWx5IG51bGwgKi8KCQlzdGF0cy0+c3RhdHNfdmFsaWQgPSB0cnVlOwoJCXN0YXRz LT5zdGFudWxsZnJhYyA9IDEuMDsKCQlpZiAoaXNfdmFyd2lkdGgpCgkJCXN0YXRzLT5zdGF3 aWR0aCA9IDA7CS8qICJ1bmtub3duIiAqLwoJCWVsc2UKCQkJc3RhdHMtPnN0YXdpZHRoID0g c3RhdHMtPmF0dHJ0eXBlLT50eXBsZW47CgkJc3RhdHMtPnN0YWRpc3RpbmN0ID0gMC4wOwkv KiAidW5rbm93biIgKi8KCX0KCgkvKiBXZSBkb24ndCBuZWVkIHRvIGJvdGhlciBjbGVhbmlu ZyB1cCBhbnkgb2Ygb3VyIHRlbXBvcmFyeSBwYWxsb2MncyAqLwp9CgoKLyoKICoJY29tcHV0 ZV9zY2FsYXJfc3RhdHMoKSAtLSBjb21wdXRlIGNvbHVtbiBzdGF0aXN0aWNzCiAqCiAqCVdl IHVzZSB0aGlzIHdoZW4gd2UgY2FuIGZpbmQgIj0iIGFuZCAiPCIgb3BlcmF0b3JzIGZvciB0 aGUgZGF0YXR5cGUuCiAqCiAqCVdlIGRldGVybWluZSB0aGUgZnJhY3Rpb24gb2Ygbm9uLW51 bGwgcm93cywgdGhlIGF2ZXJhZ2Ugd2lkdGgsIHRoZQogKgltb3N0IGNvbW1vbiB2YWx1ZXMs IHRoZSAoZXN0aW1hdGVkKSBudW1iZXIgb2YgZGlzdGluY3QgdmFsdWVzLCB0aGUKICoJZGlz dHJpYnV0aW9uIGhpc3RvZ3JhbSwgYW5kIHRoZSBjb3JyZWxhdGlvbiBvZiBwaHlzaWNhbCB0 byBsb2dpY2FsIG9yZGVyLgogKgogKglUaGUgZGVzaXJlZCBzdGF0cyBjYW4gYmUgZGV0ZXJt aW5lZCBmYWlybHkgZWFzaWx5IGFmdGVyIHNvcnRpbmcgdGhlCiAqCWRhdGEgdmFsdWVzIGlu dG8gb3JkZXIuCiAqLwpzdGF0aWMgdm9pZApjb21wdXRlX3NjYWxhcl9zdGF0cyhWYWNBdHRy U3RhdHNQIHN0YXRzLAoJCQkJCSBBbmFseXplQXR0ckZldGNoRnVuYyBmZXRjaGZ1bmMsCgkJ CQkJIGludCBzYW1wbGVyb3dzLAoJCQkJCSBkb3VibGUgdG90YWxyb3dzKQp7CglpbnQJCQlp OwoJaW50CQkJbnVsbF9jbnQgPSAwOwoJaW50CQkJbm9ubnVsbF9jbnQgPSAwOwoJaW50CQkJ dG9vd2lkZV9jbnQgPSAwOwoJZG91YmxlCQl0b3RhbF93aWR0aCA9IDA7Cglib29sCQlpc192 YXJsZW5hID0gKCFzdGF0cy0+YXR0cnR5cGUtPnR5cGJ5dmFsICYmCgkJCQkJCQkgIHN0YXRz LT5hdHRydHlwZS0+dHlwbGVuID09IC0xKTsKCWJvb2wJCWlzX3ZhcndpZHRoID0gKCFzdGF0 cy0+YXR0cnR5cGUtPnR5cGJ5dmFsICYmCgkJCQkJCQkgICBzdGF0cy0+YXR0cnR5cGUtPnR5 cGxlbiA8IDApOwoJZG91YmxlCQljb3JyX3h5c3VtOwoJU29ydFN1cHBvcnREYXRhIHNzdXA7 CglTY2FsYXJJdGVtICp2YWx1ZXM7CglpbnQJCQl2YWx1ZXNfY250ID0gMDsKCWludAkJICAg KnR1cG5vTGluazsKCVNjYWxhck1DVkl0ZW0gKnRyYWNrOwoJaW50CQkJdHJhY2tfY250ID0g MDsKCWludAkJCW51bV9tY3YgPSBzdGF0cy0+YXR0c3RhdHRhcmdldDsKCWludAkJCW51bV9i aW5zID0gc3RhdHMtPmF0dHN0YXR0YXJnZXQ7CglTdGRBbmFseXplRGF0YSAqbXlzdGF0cyA9 IChTdGRBbmFseXplRGF0YSAqKSBzdGF0cy0+ZXh0cmFfZGF0YTsKCgl2YWx1ZXMgPSAoU2Nh bGFySXRlbSAqKSBwYWxsb2Moc2FtcGxlcm93cyAqIHNpemVvZihTY2FsYXJJdGVtKSk7Cgl0 dXBub0xpbmsgPSAoaW50ICopIHBhbGxvYyhzYW1wbGVyb3dzICogc2l6ZW9mKGludCkpOwoJ dHJhY2sgPSAoU2NhbGFyTUNWSXRlbSAqKSBwYWxsb2MobnVtX21jdiAqIHNpemVvZihTY2Fs YXJNQ1ZJdGVtKSk7CgoJbWVtc2V0KCZzc3VwLCAwLCBzaXplb2Yoc3N1cCkpOwoJc3N1cC5z c3VwX2N4dCA9IEN1cnJlbnRNZW1vcnlDb250ZXh0OwoJc3N1cC5zc3VwX2NvbGxhdGlvbiA9 IHN0YXRzLT5hdHRyY29sbGlkOwoJc3N1cC5zc3VwX251bGxzX2ZpcnN0ID0gZmFsc2U7CgoJ LyoKCSAqIEZvciBub3csIGRvbid0IHBlcmZvcm0gYWJicmV2aWF0ZWQga2V5IGNvbnZlcnNp b24sIGJlY2F1c2UgZnVsbCB2YWx1ZXMKCSAqIGFyZSByZXF1aXJlZCBmb3IgTUNWIHNsb3Qg Z2VuZXJhdGlvbi4gIFN1cHBvcnRpbmcgdGhhdCBvcHRpbWl6YXRpb24KCSAqIHdvdWxkIG5l Y2Vzc2l0YXRlIHRlYWNoaW5nIGNvbXBhcmVfc2NhbGFycygpIHRvIGNhbGwgYSB0aWUtYnJl YWtlci4KCSAqLwoJc3N1cC5hYmJyZXZpYXRlID0gZmFsc2U7CgoJUHJlcGFyZVNvcnRTdXBw b3J0RnJvbU9yZGVyaW5nT3AobXlzdGF0cy0+bHRvcHIsICZzc3VwKTsKCgkvKiBJbml0aWFs IHNjYW4gdG8gZmluZCBzb3J0YWJsZSB2YWx1ZXMgKi8KCWZvciAoaSA9IDA7IGkgPCBzYW1w bGVyb3dzOyBpKyspCgl7CgkJRGF0dW0JCXZhbHVlOwoJCWJvb2wJCWlzbnVsbDsKCgkJdmFj dXVtX2RlbGF5X3BvaW50KHRydWUpOwoKCQl2YWx1ZSA9IGZldGNoZnVuYyhzdGF0cywgaSwg JmlzbnVsbCk7CgoJCS8qIENoZWNrIGZvciBudWxsL25vbm51bGwgKi8KCQlpZiAoaXNudWxs KQoJCXsKCQkJbnVsbF9jbnQrKzsKCQkJY29udGludWU7CgkJfQoJCW5vbm51bGxfY250Kys7 CgoJCS8qCgkJICogSWYgaXQncyBhIHZhcmlhYmxlLXdpZHRoIGZpZWxkLCBhZGQgdXAgd2lk dGhzIGZvciBhdmVyYWdlIHdpZHRoCgkJICogY2FsY3VsYXRpb24uICBOb3RlIHRoYXQgaWYg dGhlIHZhbHVlIGlzIHRvYXN0ZWQsIHdlIHVzZSB0aGUgdG9hc3RlZAoJCSAqIHdpZHRoLiAg V2UgZG9uJ3QgYm90aGVyIHdpdGggdGhpcyBjYWxjdWxhdGlvbiBpZiBpdCdzIGEgZml4ZWQt d2lkdGgKCQkgKiB0eXBlLgoJCSAqLwoJCWlmIChpc192YXJsZW5hKQoJCXsKCQkJdG90YWxf d2lkdGggKz0gVkFSU0laRV9BTlkoRGF0dW1HZXRQb2ludGVyKHZhbHVlKSk7CgoJCQkvKgoJ CQkgKiBJZiB0aGUgdmFsdWUgaXMgdG9hc3RlZCwgd2Ugd2FudCB0byBkZXRvYXN0IGl0IGp1 c3Qgb25jZSB0bwoJCQkgKiBhdm9pZCByZXBlYXRlZCBkZXRvYXN0aW5ncyBhbmQgcmVzdWx0 YW50IGV4Y2VzcyBtZW1vcnkgdXNhZ2UKCQkJICogZHVyaW5nIHRoZSBjb21wYXJpc29ucy4g IEFsc28sIGNoZWNrIHRvIHNlZSBpZiB0aGUgdmFsdWUgaXMKCQkJICogZXhjZXNzaXZlbHkg d2lkZSwgYW5kIGlmIHNvIGRvbid0IGRldG9hc3QgYXQgYWxsIC0tLSBqdXN0CgkJCSAqIGln bm9yZSB0aGUgdmFsdWUuCgkJCSAqLwoJCQlpZiAodG9hc3RfcmF3X2RhdHVtX3NpemUodmFs dWUpID4gV0lEVEhfVEhSRVNIT0xEKQoJCQl7CgkJCQl0b293aWRlX2NudCsrOwoJCQkJY29u dGludWU7CgkJCX0KCQkJdmFsdWUgPSBQb2ludGVyR2V0RGF0dW0oUEdfREVUT0FTVF9EQVRV TSh2YWx1ZSkpOwoJCX0KCQllbHNlIGlmIChpc192YXJ3aWR0aCkKCQl7CgkJCS8qIG11c3Qg YmUgY3N0cmluZyAqLwoJCQl0b3RhbF93aWR0aCArPSBzdHJsZW4oRGF0dW1HZXRDU3RyaW5n KHZhbHVlKSkgKyAxOwoJCX0KCgkJLyogQWRkIGl0IHRvIHRoZSBsaXN0IHRvIGJlIHNvcnRl ZCAqLwoJCXZhbHVlc1t2YWx1ZXNfY250XS52YWx1ZSA9IHZhbHVlOwoJCXZhbHVlc1t2YWx1 ZXNfY250XS50dXBubyA9IHZhbHVlc19jbnQ7CgkJdHVwbm9MaW5rW3ZhbHVlc19jbnRdID0g dmFsdWVzX2NudDsKCQl2YWx1ZXNfY250Kys7Cgl9CgoJLyogV2UgY2FuIG9ubHkgY29tcHV0 ZSByZWFsIHN0YXRzIGlmIHdlIGZvdW5kIHNvbWUgc29ydGFibGUgdmFsdWVzLiAqLwoJaWYg KHZhbHVlc19jbnQgPiAwKQoJewoJCWludAkJCW5kaXN0aW5jdCwJLyogIyBkaXN0aW5jdCB2 YWx1ZXMgaW4gc2FtcGxlICovCgkJCQkJbm11bHRpcGxlLAkvKiAjIHRoYXQgYXBwZWFyIG11 bHRpcGxlIHRpbWVzICovCgkJCQkJbnVtX2hpc3QsCgkJCQkJZHVwc19jbnQ7CgkJaW50CQkJ c2xvdF9pZHggPSAwOwoJCUNvbXBhcmVTY2FsYXJzQ29udGV4dCBjeHQ7CgoJCS8qIFNvcnQg dGhlIGNvbGxlY3RlZCB2YWx1ZXMgKi8KCQljeHQuc3N1cCA9ICZzc3VwOwoJCWN4dC50dXBu b0xpbmsgPSB0dXBub0xpbms7CgkJcXNvcnRfaW50ZXJydXB0aWJsZSh2YWx1ZXMsIHZhbHVl c19jbnQsIHNpemVvZihTY2FsYXJJdGVtKSwKCQkJCQkJCWNvbXBhcmVfc2NhbGFycywgJmN4 dCk7CgoJCS8qCgkJICogTm93IHNjYW4gdGhlIHZhbHVlcyBpbiBvcmRlciwgZmluZCB0aGUg bW9zdCBjb21tb24gb25lcywgYW5kIGFsc28KCQkgKiBhY2N1bXVsYXRlIG9yZGVyaW5nLWNv cnJlbGF0aW9uIHN0YXRpc3RpY3MuCgkJICoKCQkgKiBUbyBkZXRlcm1pbmUgd2hpY2ggYXJl IG1vc3QgY29tbW9uLCB3ZSBmaXJzdCBoYXZlIHRvIGNvdW50IHRoZQoJCSAqIG51bWJlciBv ZiBkdXBsaWNhdGVzIG9mIGVhY2ggdmFsdWUuICBUaGUgZHVwbGljYXRlcyBhcmUgYWRqYWNl bnQgaW4KCQkgKiB0aGUgc29ydGVkIGxpc3QsIHNvIGEgYnJ1dGUtZm9yY2UgYXBwcm9hY2gg aXMgdG8gY29tcGFyZSBzdWNjZXNzaXZlCgkJICogZGF0dW0gdmFsdWVzIHVudGlsIHdlIGZp bmQgdHdvIHRoYXQgYXJlIG5vdCBlcXVhbC4gSG93ZXZlciwgdGhhdAoJCSAqIHJlcXVpcmVz IE4tMSBpbnZvY2F0aW9ucyBvZiB0aGUgZGF0dW0gY29tcGFyaXNvbiByb3V0aW5lLCB3aGlj aCBhcmUKCQkgKiBjb21wbGV0ZWx5IHJlZHVuZGFudCB3aXRoIHdvcmsgdGhhdCB3YXMgZG9u ZSBkdXJpbmcgdGhlIHNvcnQuICAoVGhlCgkJICogc29ydCBhbGdvcml0aG0gbXVzdCBhdCBz b21lIHBvaW50IGhhdmUgY29tcGFyZWQgZWFjaCBwYWlyIG9mIGl0ZW1zCgkJICogdGhhdCBh cmUgYWRqYWNlbnQgaW4gdGhlIHNvcnRlZCBvcmRlcjsgb3RoZXJ3aXNlIGl0IGNvdWxkIG5v dCBrbm93CgkJICogdGhhdCBpdCdzIG9yZGVyZWQgdGhlIHBhaXIgY29ycmVjdGx5LikgV2Ug ZXhwbG9pdCB0aGlzIGJ5IGhhdmluZwoJCSAqIGNvbXBhcmVfc2NhbGFycyByZW1lbWJlciB0 aGUgaGlnaGVzdCB0dXBubyBpbmRleCB0aGF0IGVhY2gKCQkgKiBTY2FsYXJJdGVtIGhhcyBi ZWVuIGZvdW5kIGVxdWFsIHRvLiAgQXQgdGhlIGVuZCBvZiB0aGUgc29ydCwgYQoJCSAqIFNj YWxhckl0ZW0ncyB0dXBub0xpbmsgd2lsbCBzdGlsbCBwb2ludCB0byBpdHNlbGYgaWYgYW5k IG9ubHkgaWYgaXQKCQkgKiBpcyB0aGUgbGFzdCBpdGVtIG9mIGl0cyBncm91cCBvZiBkdXBs aWNhdGVzIChzaW5jZSB0aGUgZ3JvdXAgd2lsbAoJCSAqIGJlIG9yZGVyZWQgYnkgdHVwbm8p LgoJCSAqLwoJCWNvcnJfeHlzdW0gPSAwOwoJCW5kaXN0aW5jdCA9IDA7CgkJbm11bHRpcGxl ID0gMDsKCQlkdXBzX2NudCA9IDA7CgkJZm9yIChpID0gMDsgaSA8IHZhbHVlc19jbnQ7IGkr KykKCQl7CgkJCWludAkJCXR1cG5vID0gdmFsdWVzW2ldLnR1cG5vOwoKCQkJY29ycl94eXN1 bSArPSAoKGRvdWJsZSkgaSkgKiAoKGRvdWJsZSkgdHVwbm8pOwoJCQlkdXBzX2NudCsrOwoJ CQlpZiAodHVwbm9MaW5rW3R1cG5vXSA9PSB0dXBubykKCQkJewoJCQkJLyogUmVhY2hlZCBl bmQgb2YgZHVwbGljYXRlcyBvZiB0aGlzIHZhbHVlICovCgkJCQluZGlzdGluY3QrKzsKCQkJ CWlmIChkdXBzX2NudCA+IDEpCgkJCQl7CgkJCQkJbm11bHRpcGxlKys7CgkJCQkJaWYgKHRy YWNrX2NudCA8IG51bV9tY3YgfHwKCQkJCQkJZHVwc19jbnQgPiB0cmFja1t0cmFja19jbnQg LSAxXS5jb3VudCkKCQkJCQl7CgkJCQkJCS8qCgkJCQkJCSAqIEZvdW5kIGEgbmV3IGl0ZW0g Zm9yIHRoZSBtY3YgbGlzdDsgZmluZCBpdHMKCQkJCQkJICogcG9zaXRpb24sIGJ1YmJsaW5n IGRvd24gb2xkIGl0ZW1zIGlmIG5lZWRlZC4gTG9vcAoJCQkJCQkgKiBpbnZhcmlhbnQgaXMg dGhhdCBqIHBvaW50cyBhdCBhbiBlbXB0eS8gcmVwbGFjZWFibGUKCQkJCQkJICogc2xvdC4K CQkJCQkJICovCgkJCQkJCWludAkJCWo7CgoJCQkJCQlpZiAodHJhY2tfY250IDwgbnVtX21j dikKCQkJCQkJCXRyYWNrX2NudCsrOwoJCQkJCQlmb3IgKGogPSB0cmFja19jbnQgLSAxOyBq ID4gMDsgai0tKQoJCQkJCQl7CgkJCQkJCQlpZiAoZHVwc19jbnQgPD0gdHJhY2tbaiAtIDFd LmNvdW50KQoJCQkJCQkJCWJyZWFrOwoJCQkJCQkJdHJhY2tbal0uY291bnQgPSB0cmFja1tq IC0gMV0uY291bnQ7CgkJCQkJCQl0cmFja1tqXS5maXJzdCA9IHRyYWNrW2ogLSAxXS5maXJz dDsKCQkJCQkJfQoJCQkJCQl0cmFja1tqXS5jb3VudCA9IGR1cHNfY250OwoJCQkJCQl0cmFj a1tqXS5maXJzdCA9IGkgKyAxIC0gZHVwc19jbnQ7CgkJCQkJfQoJCQkJfQoJCQkJZHVwc19j bnQgPSAwOwoJCQl9CgkJfQoKCQlzdGF0cy0+c3RhdHNfdmFsaWQgPSB0cnVlOwoJCS8qIERv IHRoZSBzaW1wbGUgbnVsbC1mcmFjIGFuZCB3aWR0aCBzdGF0cyAqLwoJCXN0YXRzLT5zdGFu dWxsZnJhYyA9IChkb3VibGUpIG51bGxfY250IC8gKGRvdWJsZSkgc2FtcGxlcm93czsKCQlp ZiAoaXNfdmFyd2lkdGgpCgkJCXN0YXRzLT5zdGF3aWR0aCA9IHRvdGFsX3dpZHRoIC8gKGRv dWJsZSkgbm9ubnVsbF9jbnQ7CgkJZWxzZQoJCQlzdGF0cy0+c3Rhd2lkdGggPSBzdGF0cy0+ YXR0cnR5cGUtPnR5cGxlbjsKCgkJaWYgKG5tdWx0aXBsZSA9PSAwKQoJCXsKCQkJLyoKCQkJ ICogSWYgd2UgZm91bmQgbm8gcmVwZWF0ZWQgbm9uLW51bGwgdmFsdWVzLCBhc3N1bWUgaXQn cyBhIHVuaXF1ZQoJCQkgKiBjb2x1bW47IGJ1dCBiZSBzdXJlIHRvIGRpc2NvdW50IGZvciBh bnkgbnVsbHMgd2UgZm91bmQuCgkJCSAqLwoJCQlzdGF0cy0+c3RhZGlzdGluY3QgPSAtMS4w ICogKDEuMCAtIHN0YXRzLT5zdGFudWxsZnJhYyk7CgkJfQoJCWVsc2UgaWYgKHRvb3dpZGVf Y250ID09IDAgJiYgbm11bHRpcGxlID09IG5kaXN0aW5jdCkKCQl7CgkJCS8qCgkJCSAqIEV2 ZXJ5IHZhbHVlIGluIHRoZSBzYW1wbGUgYXBwZWFyZWQgbW9yZSB0aGFuIG9uY2UuICBBc3N1 bWUgdGhlCgkJCSAqIGNvbHVtbiBoYXMganVzdCB0aGVzZSB2YWx1ZXMuICAoVGhpcyBjYXNl IGlzIG1lYW50IHRvIGFkZHJlc3MKCQkJICogY29sdW1ucyB3aXRoIHNtYWxsLCBmaXhlZCBz ZXRzIG9mIHBvc3NpYmxlIHZhbHVlcywgc3VjaCBhcwoJCQkgKiBib29sZWFuIG9yIGVudW0g Y29sdW1ucy4gIElmIHRoZXJlIGFyZSBhbnkgdmFsdWVzIHRoYXQgYXBwZWFyCgkJCSAqIGp1 c3Qgb25jZSBpbiB0aGUgc2FtcGxlLCBpbmNsdWRpbmcgdG9vLXdpZGUgdmFsdWVzLCB3ZSBz aG91bGQKCQkJICogYXNzdW1lIHRoYXQgdGhhdCdzIG5vdCB3aGF0IHdlJ3JlIGRlYWxpbmcg d2l0aC4pCgkJCSAqLwoJCQlzdGF0cy0+c3RhZGlzdGluY3QgPSBuZGlzdGluY3Q7CgkJfQoJ CWVsc2UKCQl7CgkJCS8qLS0tLS0tLS0tLQoJCQkgKiBFc3RpbWF0ZSB0aGUgbnVtYmVyIG9m IGRpc3RpbmN0IHZhbHVlcyB1c2luZyB0aGUgZXN0aW1hdG9yCgkJCSAqIHByb3Bvc2VkIGJ5 IEhhYXMgYW5kIFN0b2tlcyBpbiBJQk0gUmVzZWFyY2ggUmVwb3J0IFJKIDEwMDI1OgoJCQkg KgkJbipkIC8gKG4gLSBmMSArIGYxKm4vTikKCQkJICogd2hlcmUgZjEgaXMgdGhlIG51bWJl ciBvZiBkaXN0aW5jdCB2YWx1ZXMgdGhhdCBvY2N1cnJlZAoJCQkgKiBleGFjdGx5IG9uY2Ug aW4gb3VyIHNhbXBsZSBvZiBuIHJvd3MgKGZyb20gYSB0b3RhbCBvZiBOKSwKCQkJICogYW5k IGQgaXMgdGhlIHRvdGFsIG51bWJlciBvZiBkaXN0aW5jdCB2YWx1ZXMgaW4gdGhlIHNhbXBs ZS4KCQkJICogVGhpcyBpcyB0aGVpciBEdWoxIGVzdGltYXRvcjsgdGhlIG90aGVyIGVzdGlt YXRvcnMgdGhleQoJCQkgKiByZWNvbW1lbmQgYXJlIGNvbnNpZGVyYWJseSBtb3JlIGNvbXBs ZXgsIGFuZCBhcmUgbnVtZXJpY2FsbHkKCQkJICogdmVyeSB1bnN0YWJsZSB3aGVuIG4gaXMg bXVjaCBzbWFsbGVyIHRoYW4gTi4KCQkJICoKCQkJICogSW4gdGhpcyBjYWxjdWxhdGlvbiwg d2UgY29uc2lkZXIgb25seSBub24tbnVsbHMuICBXZSB1c2VkIHRvCgkJCSAqIGluY2x1ZGUg cm93cyB3aXRoIG51bGwgdmFsdWVzIGluIHRoZSBuIGFuZCBOIGNvdW50cywgYnV0IHRoYXQK CQkJICogbGVhZHMgdG8gaW5hY2N1cmF0ZSBhbnN3ZXJzIGluIGNvbHVtbnMgd2l0aCBtYW55 IG51bGxzLCBhbmQKCQkJICogaXQncyBpbnR1aXRpdmVseSBib2d1cyBhbnl3YXkgY29uc2lk ZXJpbmcgdGhlIGRlc2lyZWQgcmVzdWx0IGlzCgkJCSAqIHRoZSBudW1iZXIgb2YgZGlzdGlu Y3Qgbm9uLW51bGwgdmFsdWVzLgoJCQkgKgoJCQkgKiBPdmVyd2lkdGggdmFsdWVzIGFyZSBh c3N1bWVkIHRvIGhhdmUgYmVlbiBkaXN0aW5jdC4KCQkJICotLS0tLS0tLS0tCgkJCSAqLwoJ CQlpbnQJCQlmMSA9IG5kaXN0aW5jdCAtIG5tdWx0aXBsZSArIHRvb3dpZGVfY250OwoJCQlp bnQJCQlkID0gZjEgKyBubXVsdGlwbGU7CgkJCWRvdWJsZQkJbiA9IHNhbXBsZXJvd3MgLSBu dWxsX2NudDsKCQkJZG91YmxlCQlOID0gdG90YWxyb3dzICogKDEuMCAtIHN0YXRzLT5zdGFu dWxsZnJhYyk7CgkJCWRvdWJsZQkJc3RhZGlzdGluY3Q7CgoJCQkvKiBOID09IDAgc2hvdWxk bid0IGhhcHBlbiwgYnV0IGp1c3QgaW4gY2FzZSAuLi4gKi8KCQkJaWYgKE4gPiAwKQoJCQkJ c3RhZGlzdGluY3QgPSAobiAqIGQpIC8gKChuIC0gZjEpICsgZjEgKiBuIC8gTik7CgkJCWVs c2UKCQkJCXN0YWRpc3RpbmN0ID0gMDsKCgkJCS8qIENsYW1wIHRvIHNhbmUgcmFuZ2UgaW4g Y2FzZSBvZiByb3VuZG9mZiBlcnJvciAqLwoJCQlpZiAoc3RhZGlzdGluY3QgPCBkKQoJCQkJ c3RhZGlzdGluY3QgPSBkOwoJCQlpZiAoc3RhZGlzdGluY3QgPiBOKQoJCQkJc3RhZGlzdGlu Y3QgPSBOOwoJCQkvKiBBbmQgcm91bmQgdG8gaW50ZWdlciAqLwoJCQlzdGF0cy0+c3RhZGlz dGluY3QgPSBmbG9vcihzdGFkaXN0aW5jdCArIDAuNSk7CgkJfQoKCQkvKgoJCSAqIElmIHdl IGVzdGltYXRlZCB0aGUgbnVtYmVyIG9mIGRpc3RpbmN0IHZhbHVlcyBhdCBtb3JlIHRoYW4g MTAlIG9mCgkJICogdGhlIHRvdGFsIHJvdyBjb3VudCAoYSB2ZXJ5IGFyYml0cmFyeSBsaW1p dCksIHRoZW4gYXNzdW1lIHRoYXQKCQkgKiBzdGFkaXN0aW5jdCBzaG91bGQgc2NhbGUgd2l0 aCB0aGUgcm93IGNvdW50IHJhdGhlciB0aGFuIGJlIGEgZml4ZWQKCQkgKiB2YWx1ZS4KCQkg Ki8KCQlpZiAoc3RhdHMtPnN0YWRpc3RpbmN0ID4gMC4xICogdG90YWxyb3dzKQoJCQlzdGF0 cy0+c3RhZGlzdGluY3QgPSAtKHN0YXRzLT5zdGFkaXN0aW5jdCAvIHRvdGFscm93cyk7CgoJ CS8qCgkJICogRGVjaWRlIGhvdyBtYW55IHZhbHVlcyBhcmUgd29ydGggc3RvcmluZyBhcyBt b3N0LWNvbW1vbiB2YWx1ZXMuIElmCgkJICogd2UgYXJlIGFibGUgdG8gZ2VuZXJhdGUgYSBj b21wbGV0ZSBNQ1YgbGlzdCAoYWxsIHRoZSB2YWx1ZXMgaW4gdGhlCgkJICogc2FtcGxlIHdp bGwgZml0LCBhbmQgd2UgdGhpbmsgdGhlc2UgYXJlIGFsbCB0aGUgb25lcyBpbiB0aGUgdGFi bGUpLAoJCSAqIHRoZW4gZG8gc28uICBPdGhlcndpc2UsIHN0b3JlIG9ubHkgdGhvc2UgdmFs dWVzIHRoYXQgYXJlCgkJICogc2lnbmlmaWNhbnRseSBtb3JlIGNvbW1vbiB0aGFuIHRoZSB2 YWx1ZXMgbm90IGluIHRoZSBsaXN0LgoJCSAqCgkJICogTm90ZTogdGhlIGZpcnN0IG9mIHRo ZXNlIGNhc2VzIGlzIG1lYW50IHRvIGFkZHJlc3MgY29sdW1ucyB3aXRoCgkJICogc21hbGws IGZpeGVkIHNldHMgb2YgcG9zc2libGUgdmFsdWVzLCBzdWNoIGFzIGJvb2xlYW4gb3IgZW51 bQoJCSAqIGNvbHVtbnMuICBJZiB3ZSBjYW4gKmNvbXBsZXRlbHkqIHJlcHJlc2VudCB0aGUg Y29sdW1uIHBvcHVsYXRpb24gYnkKCQkgKiBhbiBNQ1YgbGlzdCB0aGF0IHdpbGwgZml0IGlu dG8gdGhlIHN0YXRzIHRhcmdldCwgdGhlbiB3ZSBzaG91bGQgZG8KCQkgKiBzbyBhbmQgdGh1 cyBwcm92aWRlIHRoZSBwbGFubmVyIHdpdGggY29tcGxldGUgaW5mb3JtYXRpb24uICBCdXQg aWYKCQkgKiB0aGUgTUNWIGxpc3QgaXMgbm90IGNvbXBsZXRlLCBpdCdzIGdlbmVyYWxseSB3 b3J0aCBiZWluZyBtb3JlCgkJICogc2VsZWN0aXZlLCBhbmQgbm90IGp1c3QgZmlsbGluZyBp dCBhbGwgdGhlIHdheSB1cCB0byB0aGUgc3RhdHMKCQkgKiB0YXJnZXQuCgkJICovCgkJaWYg KHRyYWNrX2NudCA9PSBuZGlzdGluY3QgJiYgdG9vd2lkZV9jbnQgPT0gMCAmJgoJCQlzdGF0 cy0+c3RhZGlzdGluY3QgPiAwICYmCgkJCXRyYWNrX2NudCA8PSBudW1fbWN2KQoJCXsKCQkJ LyogVHJhY2sgbGlzdCBpbmNsdWRlcyBhbGwgdmFsdWVzIHNlZW4sIGFuZCBhbGwgd2lsbCBm aXQgKi8KCQkJbnVtX21jdiA9IHRyYWNrX2NudDsKCQl9CgkJZWxzZQoJCXsKCQkJaW50CQkg ICAqbWN2X2NvdW50czsKCgkJCS8qIEluY29tcGxldGUgbGlzdDsgZGVjaWRlIGhvdyBtYW55 IHZhbHVlcyBhcmUgd29ydGgga2VlcGluZyAqLwoJCQlpZiAobnVtX21jdiA+IHRyYWNrX2Nu dCkKCQkJCW51bV9tY3YgPSB0cmFja19jbnQ7CgoJCQlpZiAobnVtX21jdiA+IDApCgkJCXsK CQkJCW1jdl9jb3VudHMgPSAoaW50ICopIHBhbGxvYyhudW1fbWN2ICogc2l6ZW9mKGludCkp OwoJCQkJZm9yIChpID0gMDsgaSA8IG51bV9tY3Y7IGkrKykKCQkJCQltY3ZfY291bnRzW2ld ID0gdHJhY2tbaV0uY291bnQ7CgoJCQkJbnVtX21jdiA9IGFuYWx5emVfbWN2X2xpc3QobWN2 X2NvdW50cywgbnVtX21jdiwKCQkJCQkJCQkJCSAgIHN0YXRzLT5zdGFkaXN0aW5jdCwKCQkJ CQkJCQkJCSAgIHN0YXRzLT5zdGFudWxsZnJhYywKCQkJCQkJCQkJCSAgIHNhbXBsZXJvd3Ms IHRvdGFscm93cyk7CgkJCX0KCQl9CgoJCS8qIEdlbmVyYXRlIE1DViBzbG90IGVudHJ5ICov CgkJaWYgKG51bV9tY3YgPiAwKQoJCXsKCQkJTWVtb3J5Q29udGV4dCBvbGRfY29udGV4dDsK CQkJRGF0dW0JICAgKm1jdl92YWx1ZXM7CgkJCWZsb2F0NAkgICAqbWN2X2ZyZXFzOwoKCQkJ LyogTXVzdCBjb3B5IHRoZSB0YXJnZXQgdmFsdWVzIGludG8gYW5sX2NvbnRleHQgKi8KCQkJ b2xkX2NvbnRleHQgPSBNZW1vcnlDb250ZXh0U3dpdGNoVG8oc3RhdHMtPmFubF9jb250ZXh0 KTsKCQkJbWN2X3ZhbHVlcyA9IChEYXR1bSAqKSBwYWxsb2MobnVtX21jdiAqIHNpemVvZihE YXR1bSkpOwoJCQltY3ZfZnJlcXMgPSAoZmxvYXQ0ICopIHBhbGxvYyhudW1fbWN2ICogc2l6 ZW9mKGZsb2F0NCkpOwoJCQlmb3IgKGkgPSAwOyBpIDwgbnVtX21jdjsgaSsrKQoJCQl7CgkJ CQltY3ZfdmFsdWVzW2ldID0gZGF0dW1Db3B5KHZhbHVlc1t0cmFja1tpXS5maXJzdF0udmFs dWUsCgkJCQkJCQkJCQkgIHN0YXRzLT5hdHRydHlwZS0+dHlwYnl2YWwsCgkJCQkJCQkJCQkg IHN0YXRzLT5hdHRydHlwZS0+dHlwbGVuKTsKCQkJCW1jdl9mcmVxc1tpXSA9IChkb3VibGUp IHRyYWNrW2ldLmNvdW50IC8gKGRvdWJsZSkgc2FtcGxlcm93czsKCQkJfQoJCQlNZW1vcnlD b250ZXh0U3dpdGNoVG8ob2xkX2NvbnRleHQpOwoKCQkJc3RhdHMtPnN0YWtpbmRbc2xvdF9p ZHhdID0gU1RBVElTVElDX0tJTkRfTUNWOwoJCQlzdGF0cy0+c3Rhb3Bbc2xvdF9pZHhdID0g bXlzdGF0cy0+ZXFvcHI7CgkJCXN0YXRzLT5zdGFjb2xsW3Nsb3RfaWR4XSA9IHN0YXRzLT5h dHRyY29sbGlkOwoJCQlzdGF0cy0+c3RhbnVtYmVyc1tzbG90X2lkeF0gPSBtY3ZfZnJlcXM7 CgkJCXN0YXRzLT5udW1udW1iZXJzW3Nsb3RfaWR4XSA9IG51bV9tY3Y7CgkJCXN0YXRzLT5z dGF2YWx1ZXNbc2xvdF9pZHhdID0gbWN2X3ZhbHVlczsKCQkJc3RhdHMtPm51bXZhbHVlc1tz bG90X2lkeF0gPSBudW1fbWN2OwoKCQkJLyoKCQkJICogQWNjZXB0IHRoZSBkZWZhdWx0cyBm b3Igc3RhdHMtPnN0YXR5cGlkIGFuZCBvdGhlcnMuIFRoZXkgaGF2ZQoJCQkgKiBiZWVuIHNl dCBiZWZvcmUgd2Ugd2VyZSBjYWxsZWQgKHNlZSB2YWN1dW0uaCkKCQkJICovCgkJCXNsb3Rf aWR4Kys7CgkJfQoKCQkvKgoJCSAqIEdlbmVyYXRlIGEgaGlzdG9ncmFtIHNsb3QgZW50cnkg aWYgdGhlcmUgYXJlIGF0IGxlYXN0IHR3byBkaXN0aW5jdAoJCSAqIHZhbHVlcyBub3QgYWNj b3VudGVkIGZvciBpbiB0aGUgTUNWIGxpc3QuICAoVGhpcyBlbnN1cmVzIHRoZQoJCSAqIGhp c3RvZ3JhbSB3b24ndCBjb2xsYXBzZSB0byBlbXB0eSBvciBhIHNpbmdsZXRvbi4pCgkJICov CgkJbnVtX2hpc3QgPSBuZGlzdGluY3QgLSBudW1fbWN2OwoJCWlmIChudW1faGlzdCA+IG51 bV9iaW5zKQoJCQludW1faGlzdCA9IG51bV9iaW5zICsgMTsKCQlpZiAobnVtX2hpc3QgPj0g MikKCQl7CgkJCU1lbW9yeUNvbnRleHQgb2xkX2NvbnRleHQ7CgkJCURhdHVtCSAgICpoaXN0 X3ZhbHVlczsKCQkJaW50CQkJbnZhbHM7CgkJCWludAkJCXBvcywKCQkJCQkJcG9zZnJhYywK CQkJCQkJZGVsdGEsCgkJCQkJCWRlbHRhZnJhYzsKCgkJCS8qIFNvcnQgdGhlIE1DViBpdGVt cyBpbnRvIHBvc2l0aW9uIG9yZGVyIHRvIHNwZWVkIG5leHQgbG9vcCAqLwoJCQlxc29ydF9p bnRlcnJ1cHRpYmxlKHRyYWNrLCBudW1fbWN2LCBzaXplb2YoU2NhbGFyTUNWSXRlbSksCgkJ CQkJCQkJY29tcGFyZV9tY3ZzLCBOVUxMKTsKCgkJCS8qCgkJCSAqIENvbGxhcHNlIG91dCB0 aGUgTUNWIGl0ZW1zIGZyb20gdGhlIHZhbHVlc1tdIGFycmF5LgoJCQkgKgoJCQkgKiBOb3Rl IHdlIGRlc3Ryb3kgdGhlIHZhbHVlc1tdIGFycmF5IGhlcmUuLi4gYnV0IHdlIGRvbid0IG5l ZWQgaXQKCQkJICogZm9yIGFueXRoaW5nIG1vcmUuICBXZSBkbywgaG93ZXZlciwgc3RpbGwg bmVlZCB2YWx1ZXNfY250LgoJCQkgKiBudmFscyB3aWxsIGJlIHRoZSBudW1iZXIgb2YgcmVt YWluaW5nIGVudHJpZXMgaW4gdmFsdWVzW10uCgkJCSAqLwoJCQlpZiAobnVtX21jdiA+IDAp CgkJCXsKCQkJCWludAkJCXNyYywKCQkJCQkJCWRlc3Q7CgkJCQlpbnQJCQlqOwoKCQkJCXNy YyA9IGRlc3QgPSAwOwoJCQkJaiA9IDA7CQkJLyogaW5kZXggb2YgbmV4dCBpbnRlcmVzdGlu ZyBNQ1YgaXRlbSAqLwoJCQkJd2hpbGUgKHNyYyA8IHZhbHVlc19jbnQpCgkJCQl7CgkJCQkJ aW50CQkJbmNvcHk7CgoJCQkJCWlmIChqIDwgbnVtX21jdikKCQkJCQl7CgkJCQkJCWludAkJ CWZpcnN0ID0gdHJhY2tbal0uZmlyc3Q7CgoJCQkJCQlpZiAoc3JjID49IGZpcnN0KQoJCQkJ CQl7CgkJCQkJCQkvKiBhZHZhbmNlIHBhc3QgdGhpcyBNQ1YgaXRlbSAqLwoJCQkJCQkJc3Jj ID0gZmlyc3QgKyB0cmFja1tqXS5jb3VudDsKCQkJCQkJCWorKzsKCQkJCQkJCWNvbnRpbnVl OwoJCQkJCQl9CgkJCQkJCW5jb3B5ID0gZmlyc3QgLSBzcmM7CgkJCQkJfQoJCQkJCWVsc2UK CQkJCQkJbmNvcHkgPSB2YWx1ZXNfY250IC0gc3JjOwoJCQkJCW1lbW1vdmUoJnZhbHVlc1tk ZXN0XSwgJnZhbHVlc1tzcmNdLAoJCQkJCQkJbmNvcHkgKiBzaXplb2YoU2NhbGFySXRlbSkp OwoJCQkJCXNyYyArPSBuY29weTsKCQkJCQlkZXN0ICs9IG5jb3B5OwoJCQkJfQoJCQkJbnZh bHMgPSBkZXN0OwoJCQl9CgkJCWVsc2UKCQkJCW52YWxzID0gdmFsdWVzX2NudDsKCQkJQXNz ZXJ0KG52YWxzID49IG51bV9oaXN0KTsKCgkJCS8qIE11c3QgY29weSB0aGUgdGFyZ2V0IHZh bHVlcyBpbnRvIGFubF9jb250ZXh0ICovCgkJCW9sZF9jb250ZXh0ID0gTWVtb3J5Q29udGV4 dFN3aXRjaFRvKHN0YXRzLT5hbmxfY29udGV4dCk7CgkJCWhpc3RfdmFsdWVzID0gKERhdHVt ICopIHBhbGxvYyhudW1faGlzdCAqIHNpemVvZihEYXR1bSkpOwoKCQkJLyoKCQkJICogVGhl IG9iamVjdCBvZiB0aGlzIGxvb3AgaXMgdG8gY29weSB0aGUgZmlyc3QgYW5kIGxhc3QgdmFs dWVzW10KCQkJICogZW50cmllcyBhbG9uZyB3aXRoIGV2ZW5seS1zcGFjZWQgdmFsdWVzIGlu IGJldHdlZW4uICBTbyB0aGUKCQkJICogaSd0aCB2YWx1ZSBpcyB2YWx1ZXNbKGkgKiAobnZh bHMgLSAxKSkgLyAobnVtX2hpc3QgLSAxKV0uICBCdXQKCQkJICogY29tcHV0aW5nIHRoYXQg c3Vic2NyaXB0IGRpcmVjdGx5IHJpc2tzIGludGVnZXIgb3ZlcmZsb3cgd2hlbgoJCQkgKiB0 aGUgc3RhdHMgdGFyZ2V0IGlzIG1vcmUgdGhhbiBhIGNvdXBsZSB0aG91c2FuZC4gIEluc3Rl YWQgd2UKCQkJICogYWRkIChudmFscyAtIDEpIC8gKG51bV9oaXN0IC0gMSkgdG8gcG9zIGF0 IGVhY2ggc3RlcCwgdHJhY2tpbmcKCQkJICogdGhlIGludGVncmFsIGFuZCBmcmFjdGlvbmFs IHBhcnRzIG9mIHRoZSBzdW0gc2VwYXJhdGVseS4KCQkJICovCgkJCWRlbHRhID0gKG52YWxz IC0gMSkgLyAobnVtX2hpc3QgLSAxKTsKCQkJZGVsdGFmcmFjID0gKG52YWxzIC0gMSkgJSAo bnVtX2hpc3QgLSAxKTsKCQkJcG9zID0gcG9zZnJhYyA9IDA7CgoJCQlmb3IgKGkgPSAwOyBp IDwgbnVtX2hpc3Q7IGkrKykKCQkJewoJCQkJaGlzdF92YWx1ZXNbaV0gPSBkYXR1bUNvcHko dmFsdWVzW3Bvc10udmFsdWUsCgkJCQkJCQkJCQkgICBzdGF0cy0+YXR0cnR5cGUtPnR5cGJ5 dmFsLAoJCQkJCQkJCQkJICAgc3RhdHMtPmF0dHJ0eXBlLT50eXBsZW4pOwoJCQkJcG9zICs9 IGRlbHRhOwoJCQkJcG9zZnJhYyArPSBkZWx0YWZyYWM7CgkJCQlpZiAocG9zZnJhYyA+PSAo bnVtX2hpc3QgLSAxKSkKCQkJCXsKCQkJCQkvKiBmcmFjdGlvbmFsIHBhcnQgZXhjZWVkcyAx LCBjYXJyeSB0byBpbnRlZ2VyIHBhcnQgKi8KCQkJCQlwb3MrKzsKCQkJCQlwb3NmcmFjIC09 IChudW1faGlzdCAtIDEpOwoJCQkJfQoJCQl9CgoJCQlNZW1vcnlDb250ZXh0U3dpdGNoVG8o b2xkX2NvbnRleHQpOwoKCQkJc3RhdHMtPnN0YWtpbmRbc2xvdF9pZHhdID0gU1RBVElTVElD X0tJTkRfSElTVE9HUkFNOwoJCQlzdGF0cy0+c3Rhb3Bbc2xvdF9pZHhdID0gbXlzdGF0cy0+ bHRvcHI7CgkJCXN0YXRzLT5zdGFjb2xsW3Nsb3RfaWR4XSA9IHN0YXRzLT5hdHRyY29sbGlk OwoJCQlzdGF0cy0+c3RhdmFsdWVzW3Nsb3RfaWR4XSA9IGhpc3RfdmFsdWVzOwoJCQlzdGF0 cy0+bnVtdmFsdWVzW3Nsb3RfaWR4XSA9IG51bV9oaXN0OwoKCQkJLyoKCQkJICogQWNjZXB0 IHRoZSBkZWZhdWx0cyBmb3Igc3RhdHMtPnN0YXR5cGlkIGFuZCBvdGhlcnMuIFRoZXkgaGF2 ZQoJCQkgKiBiZWVuIHNldCBiZWZvcmUgd2Ugd2VyZSBjYWxsZWQgKHNlZSB2YWN1dW0uaCkK CQkJICovCgkJCXNsb3RfaWR4Kys7CgkJfQoKCQkvKiBHZW5lcmF0ZSBhIGNvcnJlbGF0aW9u IGVudHJ5IGlmIHRoZXJlIGFyZSBtdWx0aXBsZSB2YWx1ZXMgKi8KCQlpZiAodmFsdWVzX2Nu dCA+IDEpCgkJewoJCQlNZW1vcnlDb250ZXh0IG9sZF9jb250ZXh0OwoJCQlmbG9hdDQJICAg KmNvcnJzOwoJCQlkb3VibGUJCWNvcnJfeHN1bSwKCQkJCQkJY29ycl94MnN1bTsKCgkJCS8q IE11c3QgY29weSB0aGUgdGFyZ2V0IHZhbHVlcyBpbnRvIGFubF9jb250ZXh0ICovCgkJCW9s ZF9jb250ZXh0ID0gTWVtb3J5Q29udGV4dFN3aXRjaFRvKHN0YXRzLT5hbmxfY29udGV4dCk7 CgkJCWNvcnJzID0gcGFsbG9jX29iamVjdChmbG9hdDQpOwoJCQlNZW1vcnlDb250ZXh0U3dp dGNoVG8ob2xkX2NvbnRleHQpOwoKCQkJLyotLS0tLS0tLS0tCgkJCSAqIFNpbmNlIHdlIGtu b3cgdGhlIHggYW5kIHkgdmFsdWUgc2V0cyBhcmUgYm90aAoJCQkgKgkJMCwgMSwgLi4uLCB2 YWx1ZXNfY250LTEKCQkJICogd2UgaGF2ZSBzdW0oeCkgPSBzdW0oeSkgPQoJCQkgKgkJKHZh bHVlc19jbnQtMSkqdmFsdWVzX2NudCAvIDIKCQkJICogYW5kIHN1bSh4XjIpID0gc3VtKHle MikgPQoJCQkgKgkJKHZhbHVlc19jbnQtMSkqdmFsdWVzX2NudCooMip2YWx1ZXNfY250LTEp IC8gNi4KCQkJICotLS0tLS0tLS0tCgkJCSAqLwoJCQljb3JyX3hzdW0gPSAoKGRvdWJsZSkg KHZhbHVlc19jbnQgLSAxKSkgKgoJCQkJKChkb3VibGUpIHZhbHVlc19jbnQpIC8gMi4wOwoJ CQljb3JyX3gyc3VtID0gKChkb3VibGUpICh2YWx1ZXNfY250IC0gMSkpICoKCQkJCSgoZG91 YmxlKSB2YWx1ZXNfY250KSAqIChkb3VibGUpICgyICogdmFsdWVzX2NudCAtIDEpIC8gNi4w OwoKCQkJLyogQW5kIHRoZSBjb3JyZWxhdGlvbiBjb2VmZmljaWVudCByZWR1Y2VzIHRvICov CgkJCWNvcnJzWzBdID0gKHZhbHVlc19jbnQgKiBjb3JyX3h5c3VtIC0gY29ycl94c3VtICog Y29ycl94c3VtKSAvCgkJCQkodmFsdWVzX2NudCAqIGNvcnJfeDJzdW0gLSBjb3JyX3hzdW0g KiBjb3JyX3hzdW0pOwoKCQkJc3RhdHMtPnN0YWtpbmRbc2xvdF9pZHhdID0gU1RBVElTVElD X0tJTkRfQ09SUkVMQVRJT047CgkJCXN0YXRzLT5zdGFvcFtzbG90X2lkeF0gPSBteXN0YXRz LT5sdG9wcjsKCQkJc3RhdHMtPnN0YWNvbGxbc2xvdF9pZHhdID0gc3RhdHMtPmF0dHJjb2xs aWQ7CgkJCXN0YXRzLT5zdGFudW1iZXJzW3Nsb3RfaWR4XSA9IGNvcnJzOwoJCQlzdGF0cy0+ bnVtbnVtYmVyc1tzbG90X2lkeF0gPSAxOwoJCQlzbG90X2lkeCsrOwoJCX0KCX0KCWVsc2Ug aWYgKG5vbm51bGxfY250ID4gMCkKCXsKCQkvKiBXZSBmb3VuZCBzb21lIG5vbi1udWxsIHZh bHVlcywgYnV0IHRoZXkgd2VyZSBhbGwgdG9vIHdpZGUgKi8KCQlBc3NlcnQobm9ubnVsbF9j bnQgPT0gdG9vd2lkZV9jbnQpOwoJCXN0YXRzLT5zdGF0c192YWxpZCA9IHRydWU7CgkJLyog RG8gdGhlIHNpbXBsZSBudWxsLWZyYWMgYW5kIHdpZHRoIHN0YXRzICovCgkJc3RhdHMtPnN0 YW51bGxmcmFjID0gKGRvdWJsZSkgbnVsbF9jbnQgLyAoZG91YmxlKSBzYW1wbGVyb3dzOwoJ CWlmIChpc192YXJ3aWR0aCkKCQkJc3RhdHMtPnN0YXdpZHRoID0gdG90YWxfd2lkdGggLyAo ZG91YmxlKSBub25udWxsX2NudDsKCQllbHNlCgkJCXN0YXRzLT5zdGF3aWR0aCA9IHN0YXRz LT5hdHRydHlwZS0+dHlwbGVuOwoJCS8qIEFzc3VtZSBhbGwgdG9vLXdpZGUgdmFsdWVzIGFy ZSBkaXN0aW5jdCwgc28gaXQncyBhIHVuaXF1ZSBjb2x1bW4gKi8KCQlzdGF0cy0+c3RhZGlz dGluY3QgPSAtMS4wICogKDEuMCAtIHN0YXRzLT5zdGFudWxsZnJhYyk7Cgl9CgllbHNlIGlm IChudWxsX2NudCA+IDApCgl7CgkJLyogV2UgZm91bmQgb25seSBudWxsczsgYXNzdW1lIHRo ZSBjb2x1bW4gaXMgZW50aXJlbHkgbnVsbCAqLwoJCXN0YXRzLT5zdGF0c192YWxpZCA9IHRy dWU7CgkJc3RhdHMtPnN0YW51bGxmcmFjID0gMS4wOwoJCWlmIChpc192YXJ3aWR0aCkKCQkJ c3RhdHMtPnN0YXdpZHRoID0gMDsJLyogInVua25vd24iICovCgkJZWxzZQoJCQlzdGF0cy0+ c3Rhd2lkdGggPSBzdGF0cy0+YXR0cnR5cGUtPnR5cGxlbjsKCQlzdGF0cy0+c3RhZGlzdGlu Y3QgPSAwLjA7CS8qICJ1bmtub3duIiAqLwoJfQoKCS8qIFdlIGRvbid0IG5lZWQgdG8gYm90 aGVyIGNsZWFuaW5nIHVwIGFueSBvZiBvdXIgdGVtcG9yYXJ5IHBhbGxvYydzICovCn0KCi8q CiAqIENvbXBhcmF0b3IgZm9yIHNvcnRpbmcgU2NhbGFySXRlbXMKICoKICogQXNpZGUgZnJv bSBzb3J0aW5nIHRoZSBpdGVtcywgd2UgdXBkYXRlIHRoZSB0dXBub0xpbmtbXSBhcnJheQog KiB3aGVuZXZlciB0d28gU2NhbGFySXRlbXMgYXJlIGZvdW5kIHRvIGNvbnRhaW4gZXF1YWwg ZGF0dW1zLiAgVGhlIGFycmF5CiAqIGlzIGluZGV4ZWQgYnkgdHVwbm87IGZvciBlYWNoIFNj YWxhckl0ZW0sIGl0IGNvbnRhaW5zIHRoZSBoaWdoZXN0CiAqIHR1cG5vIHRoYXQgdGhhdCBp dGVtJ3MgZGF0dW0gaGFzIGJlZW4gZm91bmQgdG8gYmUgZXF1YWwgdG8uICBUaGlzIGFsbG93 cwogKiB1cyB0byBhdm9pZCBhZGRpdGlvbmFsIGNvbXBhcmlzb25zIGluIGNvbXB1dGVfc2Nh bGFyX3N0YXRzKCkuCiAqLwpzdGF0aWMgaW50CmNvbXBhcmVfc2NhbGFycyhjb25zdCB2b2lk ICphLCBjb25zdCB2b2lkICpiLCB2b2lkICphcmcpCnsKCURhdHVtCQlkYSA9ICgoY29uc3Qg U2NhbGFySXRlbSAqKSBhKS0+dmFsdWU7CglpbnQJCQl0YSA9ICgoY29uc3QgU2NhbGFySXRl bSAqKSBhKS0+dHVwbm87CglEYXR1bQkJZGIgPSAoKGNvbnN0IFNjYWxhckl0ZW0gKikgYikt PnZhbHVlOwoJaW50CQkJdGIgPSAoKGNvbnN0IFNjYWxhckl0ZW0gKikgYiktPnR1cG5vOwoJ Q29tcGFyZVNjYWxhcnNDb250ZXh0ICpjeHQgPSAoQ29tcGFyZVNjYWxhcnNDb250ZXh0ICop IGFyZzsKCWludAkJCWNvbXBhcmU7CgoJY29tcGFyZSA9IEFwcGx5U29ydENvbXBhcmF0b3Io ZGEsIGZhbHNlLCBkYiwgZmFsc2UsIGN4dC0+c3N1cCk7CglpZiAoY29tcGFyZSAhPSAwKQoJ CXJldHVybiBjb21wYXJlOwoKCS8qCgkgKiBUaGUgdHdvIGRhdHVtcyBhcmUgZXF1YWwsIHNv IHVwZGF0ZSBjeHQtPnR1cG5vTGlua1tdLgoJICovCglpZiAoY3h0LT50dXBub0xpbmtbdGFd IDwgdGIpCgkJY3h0LT50dXBub0xpbmtbdGFdID0gdGI7CglpZiAoY3h0LT50dXBub0xpbmtb dGJdIDwgdGEpCgkJY3h0LT50dXBub0xpbmtbdGJdID0gdGE7CgoJLyoKCSAqIEZvciBlcXVh bCBkYXR1bXMsIHNvcnQgYnkgdHVwbm8KCSAqLwoJcmV0dXJuIHRhIC0gdGI7Cn0KCi8qCiAq IENvbXBhcmF0b3IgZm9yIHNvcnRpbmcgU2NhbGFyTUNWSXRlbXMgYnkgcG9zaXRpb24KICov CnN0YXRpYyBpbnQKY29tcGFyZV9tY3ZzKGNvbnN0IHZvaWQgKmEsIGNvbnN0IHZvaWQgKmIs IHZvaWQgKmFyZykKewoJaW50CQkJZGEgPSAoKGNvbnN0IFNjYWxhck1DVkl0ZW0gKikgYSkt PmZpcnN0OwoJaW50CQkJZGIgPSAoKGNvbnN0IFNjYWxhck1DVkl0ZW0gKikgYiktPmZpcnN0 OwoKCXJldHVybiBkYSAtIGRiOwp9CgovKgogKiBBbmFseXplIHRoZSBsaXN0IG9mIGNvbW1v biB2YWx1ZXMgaW4gdGhlIHNhbXBsZSBhbmQgZGVjaWRlIGhvdyBtYW55IGFyZQogKiB3b3J0 aCBzdG9yaW5nIGluIHRoZSB0YWJsZSdzIE1DViBsaXN0LgogKgogKiBtY3ZfY291bnRzIGlz IGFzc3VtZWQgdG8gYmUgYSBsaXN0IG9mIHRoZSBjb3VudHMgb2YgdGhlIG1vc3QgY29tbW9u IHZhbHVlcwogKiBzZWVuIGluIHRoZSBzYW1wbGUsIHN0YXJ0aW5nIHdpdGggdGhlIG1vc3Qg Y29tbW9uLiAgVGhlIHJldHVybiB2YWx1ZSBpcyB0aGUKICogbnVtYmVyIHRoYXQgYXJlIHNp Z25pZmljYW50bHkgbW9yZSBjb21tb24gdGhhbiB0aGUgdmFsdWVzIG5vdCBpbiB0aGUgbGlz dCwKICogYW5kIHdoaWNoIGFyZSB0aGVyZWZvcmUgZGVlbWVkIHdvcnRoIHN0b3JpbmcgaW4g dGhlIHRhYmxlJ3MgTUNWIGxpc3QuCiAqLwpzdGF0aWMgaW50CmFuYWx5emVfbWN2X2xpc3Qo aW50ICptY3ZfY291bnRzLAoJCQkJIGludCBudW1fbWN2LAoJCQkJIGRvdWJsZSBzdGFkaXN0 aW5jdCwKCQkJCSBkb3VibGUgc3RhbnVsbGZyYWMsCgkJCQkgaW50IHNhbXBsZXJvd3MsCgkJ CQkgZG91YmxlIHRvdGFscm93cykKewoJZG91YmxlCQluZGlzdGluY3RfdGFibGU7Cglkb3Vi bGUJCXN1bWNvdW50OwoJaW50CQkJaTsKCgkvKgoJICogSWYgdGhlIGVudGlyZSB0YWJsZSB3 YXMgc2FtcGxlZCwga2VlcCB0aGUgd2hvbGUgbGlzdC4gIFRoaXMgYWxzbwoJICogcHJvdGVj dHMgdXMgYWdhaW5zdCBkaXZpc2lvbiBieSB6ZXJvIGluIHRoZSBjb2RlIGJlbG93LgoJICov CglpZiAoc2FtcGxlcm93cyA9PSB0b3RhbHJvd3MgfHwgdG90YWxyb3dzIDw9IDEuMCkKCQly ZXR1cm4gbnVtX21jdjsKCgkvKiBSZS1leHRyYWN0IHRoZSBlc3RpbWF0ZWQgbnVtYmVyIG9m IGRpc3RpbmN0IG5vbm51bGwgdmFsdWVzIGluIHRhYmxlICovCgluZGlzdGluY3RfdGFibGUg PSBzdGFkaXN0aW5jdDsKCWlmIChuZGlzdGluY3RfdGFibGUgPCAwKQoJCW5kaXN0aW5jdF90 YWJsZSA9IC1uZGlzdGluY3RfdGFibGUgKiB0b3RhbHJvd3M7CgoJLyoKCSAqIEV4Y2x1ZGUg dGhlIGxlYXN0IGNvbW1vbiB2YWx1ZXMgZnJvbSB0aGUgTUNWIGxpc3QsIGlmIHRoZXkgYXJl IG5vdAoJICogc2lnbmlmaWNhbnRseSBtb3JlIGNvbW1vbiB0aGFuIHRoZSBlc3RpbWF0ZWQg c2VsZWN0aXZpdHkgdGhleSB3b3VsZAoJICogaGF2ZSBpZiB0aGV5IHdlcmVuJ3QgaW4gdGhl IGxpc3QuICBBbGwgbm9uLU1DViB2YWx1ZXMgYXJlIGFzc3VtZWQgdG8gYmUKCSAqIGVxdWFs bHkgY29tbW9uLCBhZnRlciB0YWtpbmcgaW50byBhY2NvdW50IHRoZSBmcmVxdWVuY2llcyBv ZiBhbGwgdGhlCgkgKiB2YWx1ZXMgaW4gdGhlIE1DViBsaXN0IGFuZCB0aGUgbnVtYmVyIG9m IG51bGxzIChjLmYuIGVxc2VsKCkpLgoJICoKCSAqIEhlcmUgc3VtY291bnQgdHJhY2tzIHRo ZSB0b3RhbCBjb3VudCBvZiBhbGwgYnV0IHRoZSBsYXN0IChsZWFzdCBjb21tb24pCgkgKiB2 YWx1ZSBpbiB0aGUgTUNWIGxpc3QsIGFsbG93aW5nIHVzIHRvIGRldGVybWluZSB0aGUgZWZm ZWN0IG9mIGV4Y2x1ZGluZwoJICogdGhhdCB2YWx1ZSBmcm9tIHRoZSBsaXN0LgoJICoKCSAq IE5vdGUgdGhhdCB3ZSBkZWxpYmVyYXRlbHkgZG8gdGhpcyBieSByZW1vdmluZyB2YWx1ZXMg ZnJvbSB0aGUgZnVsbAoJICogbGlzdCwgcmF0aGVyIHRoYW4gc3RhcnRpbmcgd2l0aCBhbiBl bXB0eSBsaXN0IGFuZCBhZGRpbmcgdmFsdWVzLAoJICogYmVjYXVzZSB0aGUgbGF0dGVyIGFw cHJvYWNoIGNhbiBmYWlsIHRvIGFkZCBhbnkgdmFsdWVzIGlmIGFsbCB0aGUgbW9zdAoJICog Y29tbW9uIHZhbHVlcyBoYXZlIGFyb3VuZCB0aGUgc2FtZSBmcmVxdWVuY3kgYW5kIG1ha2Ug dXAgdGhlIG1ham9yaXR5CgkgKiBvZiB0aGUgdGFibGUsIHNvIHRoYXQgdGhlIG92ZXJhbGwg YXZlcmFnZSBmcmVxdWVuY3kgb2YgYWxsIHZhbHVlcyBpcwoJICogcm91Z2hseSB0aGUgc2Ft ZSBhcyB0aGF0IG9mIHRoZSBjb21tb24gdmFsdWVzLiAgVGhpcyB3b3VsZCBsZWFkIHRvIGFu eQoJICogdW5jb21tb24gdmFsdWVzIGJlaW5nIHNpZ25pZmljYW50bHkgb3ZlcmVzdGltYXRl ZC4KCSAqLwoJc3VtY291bnQgPSAwLjA7Cglmb3IgKGkgPSAwOyBpIDwgbnVtX21jdiAtIDE7 IGkrKykKCQlzdW1jb3VudCArPSBtY3ZfY291bnRzW2ldOwoKCXdoaWxlIChudW1fbWN2ID4g MCkKCXsKCQlkb3VibGUJCXNlbGVjLAoJCQkJCW90aGVyZGlzdGluY3QsCgkJCQkJTiwKCQkJ CQluLAoJCQkJCUssCgkJCQkJdmFyaWFuY2UsCgkJCQkJc3RkZGV2OwoKCQkvKgoJCSAqIEVz dGltYXRlZCBzZWxlY3Rpdml0eSB0aGUgbGVhc3QgY29tbW9uIHZhbHVlIHdvdWxkIGhhdmUg aWYgaXQKCQkgKiB3YXNuJ3QgaW4gdGhlIE1DViBsaXN0IChjLmYuIGVxc2VsKCkpLgoJCSAq LwoJCXNlbGVjID0gMS4wIC0gc3VtY291bnQgLyBzYW1wbGVyb3dzIC0gc3RhbnVsbGZyYWM7 CgkJaWYgKHNlbGVjIDwgMC4wKQoJCQlzZWxlYyA9IDAuMDsKCQlpZiAoc2VsZWMgPiAxLjAp CgkJCXNlbGVjID0gMS4wOwoJCW90aGVyZGlzdGluY3QgPSBuZGlzdGluY3RfdGFibGUgLSAo bnVtX21jdiAtIDEpOwoJCWlmIChvdGhlcmRpc3RpbmN0ID4gMSkKCQkJc2VsZWMgLz0gb3Ro ZXJkaXN0aW5jdDsKCgkJLyoKCQkgKiBJZiB0aGUgdmFsdWUgaXMga2VwdCBpbiB0aGUgTUNW IGxpc3QsIGl0cyBwb3B1bGF0aW9uIGZyZXF1ZW5jeSBpcwoJCSAqIGFzc3VtZWQgdG8gZXF1 YWwgaXRzIHNhbXBsZSBmcmVxdWVuY3kuICBXZSB1c2UgdGhlIGxvd2VyIGVuZCBvZiBhCgkJ ICogdGV4dGJvb2sgY29udGludWl0eS1jb3JyZWN0ZWQgV2FsZC10eXBlIGNvbmZpZGVuY2Ug aW50ZXJ2YWwgdG8KCQkgKiBkZXRlcm1pbmUgaWYgdGhhdCBpcyBzaWduaWZpY2FudGx5IG1v cmUgY29tbW9uIHRoYW4gdGhlIG5vbi1NQ1YKCQkgKiBmcmVxdWVuY3kgLS0tIHNwZWNpZmlj YWxseSB3ZSBhc3N1bWUgdGhlIHBvcHVsYXRpb24gZnJlcXVlbmN5IGlzCgkJICogaGlnaGx5 IGxpa2VseSB0byBiZSB3aXRoaW4gYXJvdW5kIDIgc3RhbmRhcmQgZXJyb3JzIG9mIHRoZSBz YW1wbGUKCQkgKiBmcmVxdWVuY3ksIHdoaWNoIGVxdWF0ZXMgdG8gYW4gaW50ZXJ2YWwgb2Yg MiBzdGFuZGFyZCBkZXZpYXRpb25zCgkJICogZWl0aGVyIHNpZGUgb2YgdGhlIHNhbXBsZSBj b3VudCwgcGx1cyBhbiBhZGRpdGlvbmFsIDAuNSBmb3IgdGhlCgkJICogY29udGludWl0eSBj b3JyZWN0aW9uLiAgU2luY2Ugd2UgYXJlIHNhbXBsaW5nIHdpdGhvdXQgcmVwbGFjZW1lbnQs CgkJICogdGhpcyBpcyBhIGh5cGVyZ2VvbWV0cmljIGRpc3RyaWJ1dGlvbi4KCQkgKgoJCSAq IFhYWDogRW1waXJpY2FsbHksIHRoaXMgYXBwcm9hY2ggc2VlbXMgdG8gd29yayBxdWl0ZSB3 ZWxsLCBidXQgaXQKCQkgKiBtYXkgYmUgd29ydGggY29uc2lkZXJpbmcgbW9yZSBhZHZhbmNl ZCB0ZWNobmlxdWVzIGZvciBlc3RpbWF0aW5nCgkJICogdGhlIGNvbmZpZGVuY2UgaW50ZXJ2 YWwgb2YgdGhlIGh5cGVyZ2VvbWV0cmljIGRpc3RyaWJ1dGlvbi4KCQkgKi8KCQlOID0gdG90 YWxyb3dzOwoJCW4gPSBzYW1wbGVyb3dzOwoJCUsgPSBOICogbWN2X2NvdW50c1tudW1fbWN2 IC0gMV0gLyBuOwoJCXZhcmlhbmNlID0gbiAqIEsgKiAoTiAtIEspICogKE4gLSBuKSAvIChO ICogTiAqIChOIC0gMSkpOwoJCXN0ZGRldiA9IHNxcnQodmFyaWFuY2UpOwoKCQlpZiAobWN2 X2NvdW50c1tudW1fbWN2IC0gMV0gPiBzZWxlYyAqIHNhbXBsZXJvd3MgKyAyICogc3RkZGV2 ICsgMC41KQoJCXsKCQkJLyoKCQkJICogVGhlIHZhbHVlIGlzIHNpZ25pZmljYW50bHkgbW9y ZSBjb21tb24gdGhhbiB0aGUgbm9uLU1DVgoJCQkgKiBzZWxlY3Rpdml0eSB3b3VsZCBzdWdn ZXN0LiAgS2VlcCBpdCwgYW5kIGFsbCB0aGUgb3RoZXIgbW9yZQoJCQkgKiBjb21tb24gdmFs dWVzIGluIHRoZSBsaXN0LgoJCQkgKi8KCQkJYnJlYWs7CgkJfQoJCWVsc2UKCQl7CgkJCS8q IERpc2NhcmQgdGhpcyB2YWx1ZSBhbmQgY29uc2lkZXIgdGhlIG5leHQgbGVhc3QgY29tbW9u IHZhbHVlICovCgkJCW51bV9tY3YtLTsKCQkJaWYgKG51bV9tY3YgPT0gMCkKCQkJCWJyZWFr OwoJCQlzdW1jb3VudCAtPSBtY3ZfY291bnRzW251bV9tY3YgLSAxXTsKCQl9Cgl9CglyZXR1 cm4gbnVtX21jdjsKfQoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC4vYm9vdHN0cmFwLmMAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAwMDAwNjY0ADAwMDE3NTAAMDAwMTc1MAAwMDAwMDEwMDc2 NwAxNTIyMTYwMzc1MAAwMTIxMDIAIDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAdXN0YXIgIAB4bWFuAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AHhtYW4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA LyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAqCiAqIGJvb3RzdHJhcC5jCiAqCSAgcm91dGluZXMg dG8gc3VwcG9ydCBydW5uaW5nIHBvc3RncmVzIGluICdib290c3RyYXAnIG1vZGUKICoJYm9v dHN0cmFwIG1vZGUgaXMgdXNlZCB0byBjcmVhdGUgdGhlIGluaXRpYWwgdGVtcGxhdGUgZGF0 YWJhc2UKICoKICogUG9ydGlvbnMgQ29weXJpZ2h0IChjKSAxOTk2LTIwMjYsIFBvc3RncmVT UUwgR2xvYmFsIERldmVsb3BtZW50IEdyb3VwCiAqIFBvcnRpb25zIENvcHlyaWdodCAoYykg MTk5NCwgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhCiAqCiAqIElE RU5USUZJQ0FUSU9OCiAqCSAgc3JjL2JhY2tlbmQvYm9vdHN0cmFwL2Jvb3RzdHJhcC5jCiAq CiAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogKi8KI2luY2x1ZGUgInBvc3RncmVzLmgiCgojaW5j bHVkZSA8dW5pc3RkLmg+CiNpbmNsdWRlIDxzaWduYWwuaD4KCiNpbmNsdWRlICJhY2Nlc3Mv Z2VuYW0uaCIKI2luY2x1ZGUgImFjY2Vzcy9oZWFwYW0uaCIKI2luY2x1ZGUgImFjY2Vzcy9o dHVwX2RldGFpbHMuaCIKI2luY2x1ZGUgImFjY2Vzcy90YWJsZWFtLmgiCiNpbmNsdWRlICJh Y2Nlc3MvdG9hc3RfY29tcHJlc3Npb24uaCIKI2luY2x1ZGUgImFjY2Vzcy94YWN0LmgiCiNp bmNsdWRlICJib290c3RyYXAvYm9vdHN0cmFwLmgiCiNpbmNsdWRlICJjYXRhbG9nL2luZGV4 LmgiCiNpbmNsdWRlICJjYXRhbG9nL3BnX2F1dGhpZC5oIgojaW5jbHVkZSAiY2F0YWxvZy9w Z19jb2xsYXRpb24uaCIKI2luY2x1ZGUgImNhdGFsb2cvcGdfcHJvYy5oIgojaW5jbHVkZSAi Y2F0YWxvZy9wZ190eXBlLmgiCiNpbmNsdWRlICJjb21tb24vbGluay1jYW5hcnkuaCIKI2lu Y2x1ZGUgIm1pc2NhZG1pbi5oIgojaW5jbHVkZSAibm9kZXMvbWFrZWZ1bmNzLmgiCiNpbmNs dWRlICJwb3J0L3BnX2dldG9wdF9jdHguaCIKI2luY2x1ZGUgInBvc3RtYXN0ZXIvcG9zdG1h c3Rlci5oIgojaW5jbHVkZSAic3RvcmFnZS9idWZwYWdlLmgiCiNpbmNsdWRlICJzdG9yYWdl L2NoZWNrc3VtLmgiCiNpbmNsdWRlICJzdG9yYWdlL2ZkLmgiCiNpbmNsdWRlICJzdG9yYWdl L2lwYy5oIgojaW5jbHVkZSAic3RvcmFnZS9wcm9jLmgiCiNpbmNsdWRlICJzdG9yYWdlL3No bWVtX2ludGVybmFsLmgiCiNpbmNsdWRlICJ1dGlscy9idWlsdGlucy5oIgojaW5jbHVkZSAi dXRpbHMvZm1ncm9pZHMuaCIKI2luY2x1ZGUgInV0aWxzL2d1Yy5oIgojaW5jbHVkZSAidXRp bHMvbWVtdXRpbHMuaCIKI2luY2x1ZGUgInV0aWxzL3JlbC5oIgojaW5jbHVkZSAidXRpbHMv cmVsbWFwcGVyLmgiCgoKc3RhdGljIHZvaWQgQ2hlY2tlck1vZGVNYWluKHZvaWQpOwpzdGF0 aWMgdm9pZCBib290c3RyYXBfc2lnbmFscyh2b2lkKTsKc3RhdGljIEZvcm1fcGdfYXR0cmli dXRlIEFsbG9jYXRlQXR0cmlidXRlKHZvaWQpOwpzdGF0aWMgdm9pZCBJbnNlcnRPbmVQcm9h cmdkZWZhdWx0c1ZhbHVlKGNoYXIgKnZhbHVlKTsKc3RhdGljIHZvaWQgcG9wdWxhdGVfdHlw X2xpc3Qodm9pZCk7CnN0YXRpYyBPaWQJZ2V0dHlwZShjaGFyICp0eXBlKTsKc3RhdGljIHZv aWQgY2xlYW51cCh2b2lkKTsKCi8qIC0tLS0tLS0tLS0tLS0tLS0KICoJCWdsb2JhbCB2YXJp YWJsZXMKICogLS0tLS0tLS0tLS0tLS0tLQogKi8KClJlbGF0aW9uCWJvb3RfcmVsZGVzYzsJ CS8qIGN1cnJlbnQgcmVsYXRpb24gZGVzY3JpcHRvciAqLwoKRm9ybV9wZ19hdHRyaWJ1dGUg YXR0cnR5cGVzW01BWEFUVFJdOwkvKiBwb2ludHMgdG8gYXR0cmlidXRlIGluZm8gKi8KaW50 CQkJbnVtYXR0cjsJCQkvKiBudW1iZXIgb2YgYXR0cmlidXRlcyBmb3IgY3VyLiByZWwgKi8K CgovKgogKiBCYXNpYyBpbmZvcm1hdGlvbiBhc3NvY2lhdGVkIHdpdGggZWFjaCB0eXBlLiAg VGhpcyBpcyB1c2VkIGJlZm9yZQogKiBwZ190eXBlIGlzIGZpbGxlZCwgc28gaXQgaGFzIHRv IGNvdmVyIHRoZSBkYXRhdHlwZXMgdXNlZCBhcyBjb2x1bW4gdHlwZXMKICogaW4gdGhlIGNv cmUgImJvb3RzdHJhcHBlZCIgY2F0YWxvZ3MuCiAqCiAqCQlYWFggc2V2ZXJhbCBvZiB0aGVz ZSBpbnB1dC9vdXRwdXQgZnVuY3Rpb25zIGRvIGNhdGFsb2cgc2NhbnMKICoJCQkoZS5nLiwg Rl9SRUdQUk9DSU4gc2NhbnMgcGdfcHJvYykuICB0aGlzIG9idmlvdXNseSBjcmVhdGVzIHNv bWUKICoJCQlvcmRlciBkZXBlbmRlbmNpZXMgaW4gdGhlIGNhdGFsb2cgY3JlYXRpb24gcHJv Y2Vzcy4KICovCnN0cnVjdCB0eXBpbmZvCnsKCWNoYXIJCW5hbWVbTkFNRURBVEFMRU5dOwoJ T2lkCQkJb2lkOwoJT2lkCQkJZWxlbTsKCWludDE2CQlsZW47Cglib29sCQlieXZhbDsKCWNo YXIJCWFsaWduOwoJY2hhcgkJc3RvcmFnZTsKCU9pZAkJCWNvbGxhdGlvbjsKCU9pZAkJCWlu cHJvYzsKCU9pZAkJCW91dHByb2M7Cn07CgpzdGF0aWMgY29uc3Qgc3RydWN0IHR5cGluZm8g VHlwSW5mb1tdID0gewoJeyJib29sIiwgQk9PTE9JRCwgMCwgMSwgdHJ1ZSwgVFlQQUxJR05f Q0hBUiwgVFlQU1RPUkFHRV9QTEFJTiwgSW52YWxpZE9pZCwKCUZfQk9PTElOLCBGX0JPT0xP VVR9LAoJeyJieXRlYSIsIEJZVEVBT0lELCAwLCAtMSwgZmFsc2UsIFRZUEFMSUdOX0lOVCwg VFlQU1RPUkFHRV9FWFRFTkRFRCwgSW52YWxpZE9pZCwKCUZfQllURUFJTiwgRl9CWVRFQU9V VH0sCgl7ImNoYXIiLCBDSEFST0lELCAwLCAxLCB0cnVlLCBUWVBBTElHTl9DSEFSLCBUWVBT VE9SQUdFX1BMQUlOLCBJbnZhbGlkT2lkLAoJRl9DSEFSSU4sIEZfQ0hBUk9VVH0sCgl7ImNz dHJpbmciLCBDU1RSSU5HT0lELCAwLCAtMiwgZmFsc2UsIFRZUEFMSUdOX0NIQVIsIFRZUFNU T1JBR0VfUExBSU4sIEludmFsaWRPaWQsCglGX0NTVFJJTkdfSU4sIEZfQ1NUUklOR19PVVR9 LAoJeyJpbnQyIiwgSU5UMk9JRCwgMCwgMiwgdHJ1ZSwgVFlQQUxJR05fU0hPUlQsIFRZUFNU T1JBR0VfUExBSU4sIEludmFsaWRPaWQsCglGX0lOVDJJTiwgRl9JTlQyT1VUfSwKCXsiaW50 NCIsIElOVDRPSUQsIDAsIDQsIHRydWUsIFRZUEFMSUdOX0lOVCwgVFlQU1RPUkFHRV9QTEFJ TiwgSW52YWxpZE9pZCwKCUZfSU5UNElOLCBGX0lOVDRPVVR9LAoJeyJpbnQ4IiwgSU5UOE9J RCwgMCwgOCwgdHJ1ZSwgVFlQQUxJR05fRE9VQkxFLCBUWVBTVE9SQUdFX1BMQUlOLCBJbnZh bGlkT2lkLAoJRl9JTlQ4SU4sIEZfSU5UOE9VVH0sCgl7ImZsb2F0NCIsIEZMT0FUNE9JRCwg MCwgNCwgdHJ1ZSwgVFlQQUxJR05fSU5ULCBUWVBTVE9SQUdFX1BMQUlOLCBJbnZhbGlkT2lk LAoJRl9GTE9BVDRJTiwgRl9GTE9BVDRPVVR9LAoJeyJmbG9hdDgiLCBGTE9BVDhPSUQsIDAs IDgsIHRydWUsIFRZUEFMSUdOX0RPVUJMRSwgVFlQU1RPUkFHRV9QTEFJTiwgSW52YWxpZE9p ZCwKCUZfRkxPQVQ4SU4sIEZfRkxPQVQ4T1VUfSwKCXsibmFtZSIsIE5BTUVPSUQsIENIQVJP SUQsIE5BTUVEQVRBTEVOLCBmYWxzZSwgVFlQQUxJR05fQ0hBUiwgVFlQU1RPUkFHRV9QTEFJ TiwgQ19DT0xMQVRJT05fT0lELAoJRl9OQU1FSU4sIEZfTkFNRU9VVH0sCgl7InJlZ3Byb2Mi LCBSRUdQUk9DT0lELCAwLCA0LCB0cnVlLCBUWVBBTElHTl9JTlQsIFRZUFNUT1JBR0VfUExB SU4sIEludmFsaWRPaWQsCglGX1JFR1BST0NJTiwgRl9SRUdQUk9DT1VUfSwKCXsidGV4dCIs IFRFWFRPSUQsIDAsIC0xLCBmYWxzZSwgVFlQQUxJR05fSU5ULCBUWVBTVE9SQUdFX0VYVEVO REVELCBERUZBVUxUX0NPTExBVElPTl9PSUQsCglGX1RFWFRJTiwgRl9URVhUT1VUfSwKCXsi anNvbmIiLCBKU09OQk9JRCwgMCwgLTEsIGZhbHNlLCBUWVBBTElHTl9JTlQsIFRZUFNUT1JB R0VfRVhURU5ERUQsIEludmFsaWRPaWQsCglGX0pTT05CX0lOLCBGX0pTT05CX09VVH0sCgl7 Im9pZCIsIE9JRE9JRCwgMCwgNCwgdHJ1ZSwgVFlQQUxJR05fSU5ULCBUWVBTVE9SQUdFX1BM QUlOLCBJbnZhbGlkT2lkLAoJRl9PSURJTiwgRl9PSURPVVR9LAoJeyJhY2xpdGVtIiwgQUNM SVRFTU9JRCwgMCwgMTYsIGZhbHNlLCBUWVBBTElHTl9ET1VCTEUsIFRZUFNUT1JBR0VfUExB SU4sIEludmFsaWRPaWQsCglGX0FDTElURU1JTiwgRl9BQ0xJVEVNT1VUfSwKCXsicGdfbm9k ZV90cmVlIiwgUEdfTk9ERV9UUkVFT0lELCAwLCAtMSwgZmFsc2UsIFRZUEFMSUdOX0lOVCwg VFlQU1RPUkFHRV9FWFRFTkRFRCwgREVGQVVMVF9DT0xMQVRJT05fT0lELAoJRl9QR19OT0RF X1RSRUVfSU4sIEZfUEdfTk9ERV9UUkVFX09VVH0sCgl7ImludDJ2ZWN0b3IiLCBJTlQyVkVD VE9ST0lELCBJTlQyT0lELCAtMSwgZmFsc2UsIFRZUEFMSUdOX0lOVCwgVFlQU1RPUkFHRV9Q TEFJTiwgSW52YWxpZE9pZCwKCUZfSU5UMlZFQ1RPUklOLCBGX0lOVDJWRUNUT1JPVVR9LAoJ eyJvaWR2ZWN0b3IiLCBPSURWRUNUT1JPSUQsIE9JRE9JRCwgLTEsIGZhbHNlLCBUWVBBTElH Tl9JTlQsIFRZUFNUT1JBR0VfUExBSU4sIEludmFsaWRPaWQsCglGX09JRFZFQ1RPUklOLCBG X09JRFZFQ1RPUk9VVH0sCgl7Il9pbnQ0IiwgSU5UNEFSUkFZT0lELCBJTlQ0T0lELCAtMSwg ZmFsc2UsIFRZUEFMSUdOX0lOVCwgVFlQU1RPUkFHRV9FWFRFTkRFRCwgSW52YWxpZE9pZCwK CUZfQVJSQVlfSU4sIEZfQVJSQVlfT1VUfSwKCXsiX3RleHQiLCBURVhUQVJSQVlPSUQsIFRF WFRPSUQsIC0xLCBmYWxzZSwgVFlQQUxJR05fSU5ULCBUWVBTVE9SQUdFX0VYVEVOREVELCBE RUZBVUxUX0NPTExBVElPTl9PSUQsCglGX0FSUkFZX0lOLCBGX0FSUkFZX09VVH0sCgl7Il9v aWQiLCBPSURBUlJBWU9JRCwgT0lET0lELCAtMSwgZmFsc2UsIFRZUEFMSUdOX0lOVCwgVFlQ U1RPUkFHRV9FWFRFTkRFRCwgSW52YWxpZE9pZCwKCUZfQVJSQVlfSU4sIEZfQVJSQVlfT1VU fSwKCXsiX2NoYXIiLCBDSEFSQVJSQVlPSUQsIENIQVJPSUQsIC0xLCBmYWxzZSwgVFlQQUxJ R05fSU5ULCBUWVBTVE9SQUdFX0VYVEVOREVELCBJbnZhbGlkT2lkLAoJRl9BUlJBWV9JTiwg Rl9BUlJBWV9PVVR9LAoJeyJfYWNsaXRlbSIsIEFDTElURU1BUlJBWU9JRCwgQUNMSVRFTU9J RCwgLTEsIGZhbHNlLCBUWVBBTElHTl9ET1VCTEUsIFRZUFNUT1JBR0VfRVhURU5ERUQsIElu dmFsaWRPaWQsCglGX0FSUkFZX0lOLCBGX0FSUkFZX09VVH0KfTsKCnN0YXRpYyBjb25zdCBp bnQgbl90eXBlcyA9IHNpemVvZihUeXBJbmZvKSAvIHNpemVvZihzdHJ1Y3QgdHlwaW5mbyk7 CgpzdHJ1Y3QgdHlwbWFwCnsJCQkJCQkJCS8qIGEgaGFjayAqLwoJT2lkCQkJYW1fb2lkOwoJ Rm9ybURhdGFfcGdfdHlwZSBhbV90eXA7Cn07CgpzdGF0aWMgTGlzdCAqVHlwID0gTklMOwkJ CS8qIExpc3Qgb2Ygc3RydWN0IHR5cG1hcCogKi8Kc3RhdGljIHN0cnVjdCB0eXBtYXAgKkFw ID0gTlVMTDsKCi8qCiAqIEJhc2ljIGluZm9ybWF0aW9uIGFib3V0IGJ1aWx0LWluIHJvbGVz LgogKgogKiBQcmVzZW50bHksIHRoaXMgbmVlZCBvbmx5IGxpc3Qgcm9sZXMgdGhhdCBhcmUg bWVudGlvbmVkIGluIGFjbGl0ZW0gYXJyYXlzCiAqIGluIHRoZSBjYXRhbG9nIC5kYXQgZmls ZXMuICBXZSBtaWdodCBhcyB3ZWxsIGxpc3QgZXZlcnl0aGluZyB0aGF0IGlzIGluCiAqIHBn X2F1dGhpZC5kYXQsIHNpbmNlIHRoZXJlIGFyZW4ndCB0aGF0IG1hbnkuICBMaWtlIHBnX2F1 dGhpZC5kYXQsIHdlCiAqIHJlcHJlc2VudCB0aGUgYm9vdHN0cmFwIHN1cGVydXNlcidzIG5h bWUgYXMgIlBPU1RHUkVTIiwgZXZlbiB0aG91Z2ggaXQKICogKHByb2JhYmx5KSB3b24ndCBi ZSB0aGF0IGluIHRoZSBmaW5pc2hlZCBpbnN0YWxsYXRpb247IHRoaXMgbWVhbnMgYWNsaXRl bQogKiBlbnRyaWVzIGluIC5kYXQgZmlsZXMgbXVzdCBzcGVsbCBpdCBsaWtlIHRoYXQuCiAq LwpzdHJ1Y3Qgcm9saW5mbwp7Cgljb25zdCBjaGFyICpyb2xuYW1lOwoJT2lkCQkJb2lkOwp9 OwoKc3RhdGljIGNvbnN0IHN0cnVjdCByb2xpbmZvIFJvbEluZm9bXSA9IHsKCXsiUE9TVEdS RVMiLCBCT09UU1RSQVBfU1VQRVJVU0VSSUR9LAoJeyJwZ19kYXRhYmFzZV9vd25lciIsIFJP TEVfUEdfREFUQUJBU0VfT1dORVJ9LAoJeyJwZ19yZWFkX2FsbF9kYXRhIiwgUk9MRV9QR19S RUFEX0FMTF9EQVRBfSwKCXsicGdfd3JpdGVfYWxsX2RhdGEiLCBST0xFX1BHX1dSSVRFX0FM TF9EQVRBfSwKCXsicGdfbW9uaXRvciIsIFJPTEVfUEdfTU9OSVRPUn0sCgl7InBnX3JlYWRf YWxsX3NldHRpbmdzIiwgUk9MRV9QR19SRUFEX0FMTF9TRVRUSU5HU30sCgl7InBnX3JlYWRf YWxsX3N0YXRzIiwgUk9MRV9QR19SRUFEX0FMTF9TVEFUU30sCgl7InBnX3N0YXRfc2Nhbl90 YWJsZXMiLCBST0xFX1BHX1NUQVRfU0NBTl9UQUJMRVN9LAoJeyJwZ19yZWFkX3NlcnZlcl9m aWxlcyIsIFJPTEVfUEdfUkVBRF9TRVJWRVJfRklMRVN9LAoJeyJwZ193cml0ZV9zZXJ2ZXJf ZmlsZXMiLCBST0xFX1BHX1dSSVRFX1NFUlZFUl9GSUxFU30sCgl7InBnX2V4ZWN1dGVfc2Vy dmVyX3Byb2dyYW0iLCBST0xFX1BHX0VYRUNVVEVfU0VSVkVSX1BST0dSQU19LAoJeyJwZ19z aWduYWxfYmFja2VuZCIsIFJPTEVfUEdfU0lHTkFMX0JBQ0tFTkR9LAoJeyJwZ19jaGVja3Bv aW50IiwgUk9MRV9QR19DSEVDS1BPSU5UfSwKCXsicGdfbWFpbnRhaW4iLCBST0xFX1BHX01B SU5UQUlOfSwKCXsicGdfdXNlX3Jlc2VydmVkX2Nvbm5lY3Rpb25zIiwgUk9MRV9QR19VU0Vf UkVTRVJWRURfQ09OTkVDVElPTlN9LAoJeyJwZ19jcmVhdGVfc3Vic2NyaXB0aW9uIiwgUk9M RV9QR19DUkVBVEVfU1VCU0NSSVBUSU9OfSwKCXsicGdfc2lnbmFsX2F1dG92YWN1dW1fd29y a2VyIiwgUk9MRV9QR19TSUdOQUxfQVVUT1ZBQ1VVTV9XT1JLRVJ9Cn07CgoKc3RhdGljIERh dHVtIHZhbHVlc1tNQVhBVFRSXTsJLyogY3VycmVudCByb3cncyBhdHRyaWJ1dGUgdmFsdWVz ICovCnN0YXRpYyBib29sIE51bGxzW01BWEFUVFJdOwoKc3RhdGljIE1lbW9yeUNvbnRleHQg bm9nYyA9IE5VTEw7CS8qIHNwZWNpYWwgbm8tZ2MgbWVtIGNvbnRleHQgKi8KCi8qCiAqCUF0 IGJvb3RzdHJhcCB0aW1lLCB3ZSBmaXJzdCBkZWNsYXJlIGFsbCB0aGUgaW5kaWNlcyB0byBi ZSBidWlsdCwgYW5kCiAqCXRoZW4gYnVpbGQgdGhlbS4gIFRoZSBJbmRleExpc3Qgc3RydWN0 dXJlIHN0b3JlcyBlbm91Z2ggaW5mb3JtYXRpb24KICoJdG8gYWxsb3cgdXMgdG8gYnVpbGQg dGhlIGluZGljZXMgYWZ0ZXIgdGhleSd2ZSBiZWVuIGRlY2xhcmVkLgogKi8KCnR5cGVkZWYg c3RydWN0IF9JbmRleExpc3QKewoJT2lkCQkJaWxfaGVhcDsKCU9pZAkJCWlsX2luZDsKCUlu ZGV4SW5mbyAgKmlsX2luZm87CglzdHJ1Y3QgX0luZGV4TGlzdCAqaWxfbmV4dDsKfSBJbmRl eExpc3Q7CgpzdGF0aWMgSW5kZXhMaXN0ICpJTEhlYWQgPSBOVUxMOwoKCi8qCiAqIEluIHNo YXJlZCBtZW1vcnkgY2hlY2tlciBtb2RlLCBhbGwgd2UgcmVhbGx5IHdhbnQgdG8gZG8gaXMg Y3JlYXRlIHNoYXJlZAogKiBtZW1vcnkgYW5kIHNlbWFwaG9yZXMgKGp1c3QgdG8gcHJvdmUg d2UgY2FuIGRvIGl0IHdpdGggdGhlIGN1cnJlbnQgR1VDCiAqIHNldHRpbmdzKS4gIFNpbmNl LCBpbiBmYWN0LCB0aGF0IHdhcyBhbHJlYWR5IGRvbmUgYnkKICogQ3JlYXRlU2hhcmVkTWVt b3J5QW5kU2VtYXBob3JlcygpLCB3ZSBoYXZlIG5vdGhpbmcgbW9yZSB0byBkbyBoZXJlLgog Ki8Kc3RhdGljIHZvaWQKQ2hlY2tlck1vZGVNYWluKHZvaWQpCnsKCXByb2NfZXhpdCgwKTsK fQoKLyoKICoJIFRoZSBtYWluIGVudHJ5IHBvaW50IGZvciBydW5uaW5nIHRoZSBiYWNrZW5k IGluIGJvb3RzdHJhcCBtb2RlCiAqCiAqCSBUaGUgYm9vdHN0cmFwIG1vZGUgaXMgdXNlZCB0 byBpbml0aWFsaXplIHRoZSB0ZW1wbGF0ZSBkYXRhYmFzZS4KICoJIFRoZSBib290c3RyYXAg YmFja2VuZCBkb2Vzbid0IHNwZWFrIFNRTCwgYnV0IGluc3RlYWQgZXhwZWN0cwogKgkgY29t bWFuZHMgaW4gYSBzcGVjaWFsIGJvb3RzdHJhcCBsYW5ndWFnZS4KICoKICoJIFdoZW4gY2hl Y2tfb25seSBpcyB0cnVlLCBzdGFydHVwIGlzIGRvbmUgb25seSBmYXIgZW5vdWdoIHRvIHZl cmlmeSB0aGF0CiAqCSB0aGUgY3VycmVudCBjb25maWd1cmF0aW9uLCBwYXJ0aWN1bGFybHkg dGhlIHBhc3NlZCBpbiBvcHRpb25zIHBlcnRhaW5pbmcKICoJIHRvIHNoYXJlZCBtZW1vcnkg c2l6aW5nLCBvcHRpb25zIHdvcmsgKG9yIGF0IGxlYXN0IGRvIG5vdCBjYXVzZSBhbiBlcnJv cgogKgkgdXAgdG8gc2hhcmVkIG1lbW9yeSBjcmVhdGlvbikuCiAqLwp2b2lkCkJvb3RzdHJh cE1vZGVNYWluKGludCBhcmdjLCBjaGFyICphcmd2W10sIGJvb2wgY2hlY2tfb25seSkKewoJ aW50CQkJaTsKCWNoYXIJICAgKnByb2duYW1lID0gYXJndlswXTsKCXBnX2dldG9wdF9jdHgg b3B0Y3R4OwoJaW50CQkJZmxhZzsKCWNoYXIJICAgKnVzZXJEb3B0aW9uID0gTlVMTDsKCXVp bnQzMgkJYm9vdHN0cmFwX2RhdGFfY2hlY2tzdW1fdmVyc2lvbiA9IFBHX0RBVEFfQ0hFQ0tT VU1fT0ZGOwoJeXlzY2FuX3QJc2Nhbm5lcjsKCglBc3NlcnQoIUlzVW5kZXJQb3N0bWFzdGVy KTsKCglJbml0U3RhbmRhbG9uZVByb2Nlc3MoYXJndlswXSk7CgoJLyogU2V0IGRlZmF1bHRz LCB0byBiZSBvdmVycmlkZGVuIGJ5IGV4cGxpY2l0IG9wdGlvbnMgYmVsb3cgKi8KCUluaXRp YWxpemVHVUNPcHRpb25zKCk7CgoJLyogYW4gaW5pdGlhbCAtLWJvb3Qgb3IgLS1jaGVjayBz aG91bGQgYmUgcHJlc2VudCAqLwoJQXNzZXJ0KGFyZ2MgPiAxCgkJICAgJiYgKHN0cmNtcChh cmd2WzFdLCAiLS1ib290IikgPT0gMAoJCQkgICB8fCBzdHJjbXAoYXJndlsxXSwgIi0tY2hl Y2siKSA9PSAwKSk7Cglhcmd2Kys7CglhcmdjLS07CgoJcGdfZ2V0b3B0X3N0YXJ0KCZvcHRj dHgsIGFyZ2MsIGFyZ3YsICJCOmM6ZDpEOkZrcjpYOi06Iik7Cgl3aGlsZSAoKGZsYWcgPSBw Z19nZXRvcHRfbmV4dCgmb3B0Y3R4KSkgIT0gLTEpCgl7CgkJc3dpdGNoIChmbGFnKQoJCXsK CQkJY2FzZSAnQic6CgkJCQlTZXRDb25maWdPcHRpb24oInNoYXJlZF9idWZmZXJzIiwgb3B0 Y3R4Lm9wdGFyZywgUEdDX1BPU1RNQVNURVIsIFBHQ19TX0FSR1YpOwoJCQkJYnJlYWs7CgkJ CWNhc2UgJy0nOgoKCQkJCS8qCgkJCQkgKiBFcnJvciBpZiB0aGUgdXNlciBtaXNwbGFjZWQg YSBzcGVjaWFsIG11c3QtYmUtZmlyc3Qgb3B0aW9uCgkJCQkgKiBmb3IgZGlzcGF0Y2hpbmcg dG8gYSBzdWJwcm9ncmFtLiAgcGFyc2VfZGlzcGF0Y2hfb3B0aW9uKCkKCQkJCSAqIHJldHVy bnMgRElTUEFUQ0hfUE9TVE1BU1RFUiBpZiBpdCBkb2Vzbid0IGZpbmQgYSBtYXRjaCwgc28K CQkJCSAqIGVycm9yIGZvciBhbnl0aGluZyBlbHNlLgoJCQkJICovCgkJCQlpZiAocGFyc2Vf ZGlzcGF0Y2hfb3B0aW9uKG9wdGN0eC5vcHRhcmcpICE9IERJU1BBVENIX1BPU1RNQVNURVIp CgkJCQkJZXJlcG9ydChFUlJPUiwKCQkJCQkJCShlcnJjb2RlKEVSUkNPREVfU1lOVEFYX0VS Uk9SKSwKCQkJCQkJCSBlcnJtc2coIi0tJXMgbXVzdCBiZSBmaXJzdCBhcmd1bWVudCIsIG9w dGN0eC5vcHRhcmcpKSk7CgoJCQkJcGdfZmFsbHRocm91Z2g7CgkJCWNhc2UgJ2MnOgoJCQkJ ewoJCQkJCWNoYXIJICAgKm5hbWUsCgkJCQkJCQkgICAqdmFsdWU7CgoJCQkJCVBhcnNlTG9u Z09wdGlvbihvcHRjdHgub3B0YXJnLCAmbmFtZSwgJnZhbHVlKTsKCQkJCQlpZiAoIXZhbHVl KQoJCQkJCXsKCQkJCQkJaWYgKGZsYWcgPT0gJy0nKQoJCQkJCQkJZXJlcG9ydChFUlJPUiwK CQkJCQkJCQkJKGVycmNvZGUoRVJSQ09ERV9TWU5UQVhfRVJST1IpLAoJCQkJCQkJCQkgZXJy bXNnKCItLSVzIHJlcXVpcmVzIGEgdmFsdWUiLAoJCQkJCQkJCQkJCW9wdGN0eC5vcHRhcmcp KSk7CgkJCQkJCWVsc2UKCQkJCQkJCWVyZXBvcnQoRVJST1IsCgkJCQkJCQkJCShlcnJjb2Rl KEVSUkNPREVfU1lOVEFYX0VSUk9SKSwKCQkJCQkJCQkJIGVycm1zZygiLWMgJXMgcmVxdWly ZXMgYSB2YWx1ZSIsCgkJCQkJCQkJCQkJb3B0Y3R4Lm9wdGFyZykpKTsKCQkJCQl9CgoJCQkJ CVNldENvbmZpZ09wdGlvbihuYW1lLCB2YWx1ZSwgUEdDX1BPU1RNQVNURVIsIFBHQ19TX0FS R1YpOwoJCQkJCXBmcmVlKG5hbWUpOwoJCQkJCXBmcmVlKHZhbHVlKTsKCQkJCQlicmVhazsK CQkJCX0KCQkJY2FzZSAnRCc6CgkJCQl1c2VyRG9wdGlvbiA9IHBzdHJkdXAob3B0Y3R4Lm9w dGFyZyk7CgkJCQlicmVhazsKCQkJY2FzZSAnZCc6CgkJCQl7CgkJCQkJLyogVHVybiBvbiBk ZWJ1Z2dpbmcgZm9yIHRoZSBib290c3RyYXAgcHJvY2Vzcy4gKi8KCQkJCQljaGFyCSAgICpk ZWJ1Z3N0cjsKCgkJCQkJZGVidWdzdHIgPSBwc3ByaW50ZigiZGVidWclcyIsIG9wdGN0eC5v cHRhcmcpOwoJCQkJCVNldENvbmZpZ09wdGlvbigibG9nX21pbl9tZXNzYWdlcyIsIGRlYnVn c3RyLAoJCQkJCQkJCQlQR0NfUE9TVE1BU1RFUiwgUEdDX1NfQVJHVik7CgkJCQkJU2V0Q29u ZmlnT3B0aW9uKCJjbGllbnRfbWluX21lc3NhZ2VzIiwgZGVidWdzdHIsCgkJCQkJCQkJCVBH Q19QT1NUTUFTVEVSLCBQR0NfU19BUkdWKTsKCQkJCQlwZnJlZShkZWJ1Z3N0cik7CgkJCQl9 CgkJCQlicmVhazsKCQkJY2FzZSAnRic6CgkJCQlTZXRDb25maWdPcHRpb24oImZzeW5jIiwg ImZhbHNlIiwgUEdDX1BPU1RNQVNURVIsIFBHQ19TX0FSR1YpOwoJCQkJYnJlYWs7CgkJCWNh c2UgJ2snOgoJCQkJYm9vdHN0cmFwX2RhdGFfY2hlY2tzdW1fdmVyc2lvbiA9IFBHX0RBVEFf Q0hFQ0tTVU1fVkVSU0lPTjsKCQkJCWJyZWFrOwoJCQljYXNlICdyJzoKCQkJCXN0cmxjcHko T3V0cHV0RmlsZU5hbWUsIG9wdGN0eC5vcHRhcmcsIE1BWFBHUEFUSCk7CgkJCQlicmVhazsK CQkJY2FzZSAnWCc6CgkJCQlTZXRDb25maWdPcHRpb24oIndhbF9zZWdtZW50X3NpemUiLCBv cHRjdHgub3B0YXJnLCBQR0NfSU5URVJOQUwsIFBHQ19TX0RZTkFNSUNfREVGQVVMVCk7CgkJ CQlicmVhazsKCQkJZGVmYXVsdDoKCQkJCXdyaXRlX3N0ZGVycigiVHJ5IFwiJXMgLS1oZWxw XCIgZm9yIG1vcmUgaW5mb3JtYXRpb24uXG4iLAoJCQkJCQkJIHByb2duYW1lKTsKCQkJCXBy b2NfZXhpdCgxKTsKCQkJCWJyZWFrOwoJCX0KCX0KCglpZiAoYXJnYyAhPSBvcHRjdHgub3B0 aW5kKQoJewoJCXdyaXRlX3N0ZGVycigiJXM6IGludmFsaWQgY29tbWFuZC1saW5lIGFyZ3Vt ZW50c1xuIiwgcHJvZ25hbWUpOwoJCXByb2NfZXhpdCgxKTsKCX0KCgkvKiBBY3F1aXJlIGNv bmZpZ3VyYXRpb24gcGFyYW1ldGVycyAqLwoJaWYgKCFTZWxlY3RDb25maWdGaWxlcyh1c2Vy RG9wdGlvbiwgcHJvZ25hbWUpKQoJCXByb2NfZXhpdCgxKTsKCgkvKgoJICogVmFsaWRhdGUg d2UgaGF2ZSBiZWVuIGdpdmVuIGEgcmVhc29uYWJsZS1sb29raW5nIERhdGFEaXIgYW5kIGNo YW5nZQoJICogaW50byBpdAoJICovCgljaGVja0RhdGFEaXIoKTsKCUNoYW5nZVRvRGF0YURp cigpOwoKCUNyZWF0ZURhdGFEaXJMb2NrRmlsZShmYWxzZSk7CgoJU2V0UHJvY2Vzc2luZ01v ZGUoQm9vdHN0cmFwUHJvY2Vzc2luZyk7CglJZ25vcmVTeXN0ZW1JbmRleGVzID0gdHJ1ZTsK CglSZWdpc3RlckJ1aWx0aW5TaG1lbUNhbGxiYWNrcygpOwoKCUluaXRpYWxpemVNYXhCYWNr ZW5kcygpOwoKCS8qCgkgKiBFdmVuIHRob3VnaCBib290c3RyYXBwaW5nIHJ1bnMgaW4gc2lu Z2xlLXByb2Nlc3MgbW9kZSwgaW5pdGlhbGl6ZQoJICogcG9zdG1hc3RlciBjaGlsZCBzbG90 cyBhcnJheSBzbyB0aGF0IC0tY2hlY2sgY2FuIGRldGVjdCBydW5uaW5nIG91dCBvZgoJICog c2hhcmVkIG1lbW9yeSBvciBvdGhlciByZXNvdXJjZXMgaWYgbWF4X2Nvbm5lY3Rpb25zIGlz IHNldCB0b28gaGlnaC4KCSAqLwoJSW5pdFBvc3RtYXN0ZXJDaGlsZFNsb3RzKCk7CgoJSW5p dGlhbGl6ZUZhc3RQYXRoTG9ja3MoKTsKCglTaG1lbUNhbGxSZXF1ZXN0Q2FsbGJhY2tzKCk7 CglDcmVhdGVTaGFyZWRNZW1vcnlBbmRTZW1hcGhvcmVzKCk7CgoJLyoKCSAqIEVzdGltYXRl IG51bWJlciBvZiBvcGVuYWJsZSBmaWxlcy4gIFRoaXMgaXMgZXNzZW50aWFsIHRvbyBpbiAt LWNoZWNrCgkgKiBtb2RlLCBiZWNhdXNlIG9uIHNvbWUgcGxhdGZvcm1zIHNlbWFwaG9yZXMg Y291bnQgYXMgb3BlbiBmaWxlcy4KCSAqLwoJc2V0X21heF9zYWZlX2ZkcygpOwoKCS8qCgkg KiBYWFg6IEl0IG1pZ2h0IG1ha2Ugc2Vuc2UgdG8gbW92ZSB0aGlzIGludG8gaXRzIG93biBm dW5jdGlvbiBhdCBzb21lCgkgKiBwb2ludC4gUmlnaHQgbm93IGl0IHNlZW1zIGxpa2UgaXQn ZCBjYXVzZSBtb3JlIGNvZGUgZHVwbGljYXRpb24gdGhhbgoJICogaXQncyB3b3J0aC4KCSAq LwoJaWYgKGNoZWNrX29ubHkpCgl7CgkJU2V0UHJvY2Vzc2luZ01vZGUoTm9ybWFsUHJvY2Vz c2luZyk7CgkJQ2hlY2tlck1vZGVNYWluKCk7CgkJYWJvcnQoKTsKCX0KCgkvKgoJICogRG8g YmFja2VuZC1saWtlIGluaXRpYWxpemF0aW9uIGZvciBib290c3RyYXAgbW9kZQoJICovCglJ bml0UHJvY2VzcygpOwoKCUJhc2VJbml0KCk7CgoJYm9vdHN0cmFwX3NpZ25hbHMoKTsKCUJv b3RTdHJhcFhMT0coYm9vdHN0cmFwX2RhdGFfY2hlY2tzdW1fdmVyc2lvbik7CgoJLyoKCSAq IFRvIGVuc3VyZSB0aGF0IHNyYy9jb21tb24vbGluay1jYW5hcnkuYyBpcyBsaW5rZWQgaW50 byB0aGUgYmFja2VuZCwgd2UKCSAqIG11c3QgY2FsbCBpdCBmcm9tIHNvbWV3aGVyZS4gIEhl cmUgaXMgYXMgZ29vZCBhcyBhbnl3aGVyZS4KCSAqLwoJaWYgKHBnX2xpbmtfY2FuYXJ5X2lz X2Zyb250ZW5kKCkpCgkJZWxvZyhFUlJPUiwgImJhY2tlbmQgaXMgaW5jb3JyZWN0bHkgbGlu a2VkIHRvIGZyb250ZW5kIGZ1bmN0aW9ucyIpOwoKCUluaXRQb3N0Z3JlcyhOVUxMLCBJbnZh bGlkT2lkLCBOVUxMLCBJbnZhbGlkT2lkLCAwLCBOVUxMKTsKCgkvKiBJbml0aWFsaXplIHN0 dWZmIGZvciBib290c3RyYXAtZmlsZSBwcm9jZXNzaW5nICovCglmb3IgKGkgPSAwOyBpIDwg TUFYQVRUUjsgaSsrKQoJewoJCWF0dHJ0eXBlc1tpXSA9IE5VTEw7CgkJTnVsbHNbaV0gPSBm YWxzZTsKCX0KCglpZiAoYm9vdF95eWxleF9pbml0KCZzY2FubmVyKSAhPSAwKQoJCWVsb2co RVJST1IsICJ5eWxleF9pbml0KCkgZmFpbGVkOiAlbSIpOwoKCS8qCgkgKiBQcm9jZXNzIGJv b3RzdHJhcCBpbnB1dC4KCSAqLwoJU3RhcnRUcmFuc2FjdGlvbkNvbW1hbmQoKTsKCWJvb3Rf eXlwYXJzZShzY2FubmVyKTsKCUNvbW1pdFRyYW5zYWN0aW9uQ29tbWFuZCgpOwoKCS8qCgkg KiBXZSBzaG91bGQgbm93IGtub3cgYWJvdXQgYWxsIG1hcHBlZCByZWxhdGlvbnMsIHNvIGl0 J3Mgb2theSB0byB3cml0ZQoJICogb3V0IHRoZSBpbml0aWFsIHJlbGF0aW9uIG1hcHBpbmcg ZmlsZXMuCgkgKi8KCVJlbGF0aW9uTWFwRmluaXNoQm9vdHN0cmFwKCk7CgoJLyogQ2xlYW4g dXAgYW5kIGV4aXQgKi8KCWNsZWFudXAoKTsKCXByb2NfZXhpdCgwKTsKfQoKCi8qIC0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0KICoJCQkJCQltaXNjIGZ1bmN0aW9ucwogKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAqLwoKLyoKICog U2V0IHVwIHNpZ25hbCBoYW5kbGluZyBmb3IgYSBib290c3RyYXAgcHJvY2VzcwogKi8Kc3Rh dGljIHZvaWQKYm9vdHN0cmFwX3NpZ25hbHModm9pZCkKewoJQXNzZXJ0KCFJc1VuZGVyUG9z dG1hc3Rlcik7CgoJLyoKCSAqIFdlIGRvbid0IGFjdHVhbGx5IG5lZWQgYW55IG5vbi1kZWZh dWx0IHNpZ25hbCBoYW5kbGluZyBpbiBib290c3RyYXAKCSAqIG1vZGU7ICJjdXJsIHVwIGFu ZCBkaWUiIGlzIGEgc3VmZmljaWVudCByZXNwb25zZSBmb3IgYWxsIHRoZXNlIGNhc2VzLgoJ ICogTGV0J3Mgc2V0IHRoYXQgaGFuZGxpbmcgZXhwbGljaXRseSwgYXMgZG9jdW1lbnRhdGlv biBpZiBub3RoaW5nIGVsc2UuCgkgKi8KCXBxc2lnbmFsKFNJR0hVUCwgUEdfU0lHX0RGTCk7 CglwcXNpZ25hbChTSUdJTlQsIFBHX1NJR19ERkwpOwoJcHFzaWduYWwoU0lHVEVSTSwgUEdf U0lHX0RGTCk7CglwcXNpZ25hbChTSUdRVUlULCBQR19TSUdfREZMKTsKfQoKLyogLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLQogKgkJCQlNQU5VQUwgQkFDS0VORCBJTlRFUkFDVElWRSBJTlRFUkZBQ0UgQ09NTUFO RFMKICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLQogKi8KCi8qIC0tLS0tLS0tLS0tLS0tLS0KICoJCWJvb3Rfb3Bl bnJlbAogKgogKiBFeGVjdXRlIEJLSSBPUEVOIGNvbW1hbmQuCiAqIC0tLS0tLS0tLS0tLS0t LS0KICovCnZvaWQKYm9vdF9vcGVucmVsKGNoYXIgKnJlbG5hbWUpCnsKCWludAkJCWk7CgoJ aWYgKHN0cmxlbihyZWxuYW1lKSA+PSBOQU1FREFUQUxFTikKCQlyZWxuYW1lW05BTUVEQVRB TEVOIC0gMV0gPSAnXDAnOwoKCS8qCgkgKiBwZ190eXBlIG11c3QgYmUgZmlsbGVkIGJlZm9y ZSBhbnkgT1BFTiBjb21tYW5kIGlzIGV4ZWN1dGVkLCBoZW5jZSB3ZQoJICogY2FuIG5vdyBw b3B1bGF0ZSBUeXAgaWYgd2UgaGF2ZW4ndCB5ZXQuCgkgKi8KCWlmIChUeXAgPT0gTklMKQoJ CXBvcHVsYXRlX3R5cF9saXN0KCk7CgoJaWYgKGJvb3RfcmVsZGVzYyAhPSBOVUxMKQoJCWNs b3NlcmVsKE5VTEwpOwoKCWVsb2coREVCVUc0LCAib3BlbiByZWxhdGlvbiAlcywgYXR0cnNp emUgJWQiLAoJCSByZWxuYW1lLCAoaW50KSBBVFRSSUJVVEVfRklYRURfUEFSVF9TSVpFKTsK Cglib290X3JlbGRlc2MgPSB0YWJsZV9vcGVucnYobWFrZVJhbmdlVmFyKE5VTEwsIHJlbG5h bWUsIC0xKSwgTm9Mb2NrKTsKCW51bWF0dHIgPSBSZWxhdGlvbkdldE51bWJlck9mQXR0cmli dXRlcyhib290X3JlbGRlc2MpOwoJZm9yIChpID0gMDsgaSA8IG51bWF0dHI7IGkrKykKCXsK CQlpZiAoYXR0cnR5cGVzW2ldID09IE5VTEwpCgkJCWF0dHJ0eXBlc1tpXSA9IEFsbG9jYXRl QXR0cmlidXRlKCk7CgkJbWVtbW92ZShhdHRydHlwZXNbaV0sCgkJCQlUdXBsZURlc2NBdHRy KGJvb3RfcmVsZGVzYy0+cmRfYXR0LCBpKSwKCQkJCUFUVFJJQlVURV9GSVhFRF9QQVJUX1NJ WkUpOwoKCQl7CgkJCUZvcm1fcGdfYXR0cmlidXRlIGF0ID0gYXR0cnR5cGVzW2ldOwoKCQkJ ZWxvZyhERUJVRzQsICJjcmVhdGUgYXR0cmlidXRlICVkIG5hbWUgJXMgbGVuICVkIG51bSAl ZCB0eXBlICV1IiwKCQkJCSBpLCBOYW1lU3RyKGF0LT5hdHRuYW1lKSwgYXQtPmF0dGxlbiwg YXQtPmF0dG51bSwKCQkJCSBhdC0+YXR0dHlwaWQpOwoJCX0KCX0KfQoKLyogLS0tLS0tLS0t LS0tLS0tLQogKgkJY2xvc2VyZWwKICogLS0tLS0tLS0tLS0tLS0tLQogKi8Kdm9pZApjbG9z ZXJlbChjaGFyICpyZWxuYW1lKQp7CglpZiAocmVsbmFtZSkKCXsKCQlpZiAoYm9vdF9yZWxk ZXNjKQoJCXsKCQkJaWYgKHN0cmNtcChSZWxhdGlvbkdldFJlbGF0aW9uTmFtZShib290X3Jl bGRlc2MpLCByZWxuYW1lKSAhPSAwKQoJCQkJZWxvZyhFUlJPUiwgImNsb3NlIG9mICVzIHdo ZW4gJXMgd2FzIGV4cGVjdGVkIiwKCQkJCQkgcmVsbmFtZSwgUmVsYXRpb25HZXRSZWxhdGlv bk5hbWUoYm9vdF9yZWxkZXNjKSk7CgkJfQoJCWVsc2UKCQkJZWxvZyhFUlJPUiwgImNsb3Nl IG9mICVzIGJlZm9yZSBhbnkgcmVsYXRpb24gd2FzIG9wZW5lZCIsCgkJCQkgcmVsbmFtZSk7 Cgl9CgoJaWYgKGJvb3RfcmVsZGVzYyA9PSBOVUxMKQoJCWVsb2coRVJST1IsICJubyBvcGVu IHJlbGF0aW9uIHRvIGNsb3NlIik7CgllbHNlCgl7CgkJZWxvZyhERUJVRzQsICJjbG9zZSBy ZWxhdGlvbiAlcyIsCgkJCSBSZWxhdGlvbkdldFJlbGF0aW9uTmFtZShib290X3JlbGRlc2Mp KTsKCQl0YWJsZV9jbG9zZShib290X3JlbGRlc2MsIE5vTG9jayk7CgkJYm9vdF9yZWxkZXNj ID0gTlVMTDsKCX0KfQoKCgovKiAtLS0tLS0tLS0tLS0tLS0tCiAqIERFRklORUFUVFIoKQog KgogKiBkZWZpbmUgYSA8ZmllbGQsdHlwZT4gcGFpcgogKiBpZiB0aGVyZSBhcmUgbiBmaWVs ZHMgaW4gYSByZWxhdGlvbiB0byBiZSBjcmVhdGVkLCB0aGlzIHJvdXRpbmUKICogd2lsbCBi ZSBjYWxsZWQgbiB0aW1lcwogKiAtLS0tLS0tLS0tLS0tLS0tCiAqLwp2b2lkCkRlZmluZUF0 dHIoY2hhciAqbmFtZSwgY2hhciAqdHlwZSwgaW50IGF0dG51bSwgaW50IG51bGxuZXNzKQp7 CglPaWQJCQl0eXBlb2lkOwoKCWlmIChib290X3JlbGRlc2MgIT0gTlVMTCkKCXsKCQllbG9n KFdBUk5JTkcsICJubyBvcGVuIHJlbGF0aW9ucyBhbGxvd2VkIHdpdGggQ1JFQVRFIGNvbW1h bmQiKTsKCQljbG9zZXJlbChOVUxMKTsKCX0KCglpZiAoYXR0cnR5cGVzW2F0dG51bV0gPT0g TlVMTCkKCQlhdHRydHlwZXNbYXR0bnVtXSA9IEFsbG9jYXRlQXR0cmlidXRlKCk7CglNZW1T ZXQoYXR0cnR5cGVzW2F0dG51bV0sIDAsIEFUVFJJQlVURV9GSVhFRF9QQVJUX1NJWkUpOwoK CW5hbWVzdHJjcHkoJmF0dHJ0eXBlc1thdHRudW1dLT5hdHRuYW1lLCBuYW1lKTsKCWVsb2co REVCVUc0LCAiY29sdW1uICVzICVzIiwgTmFtZVN0cihhdHRydHlwZXNbYXR0bnVtXS0+YXR0 bmFtZSksIHR5cGUpOwoJYXR0cnR5cGVzW2F0dG51bV0tPmF0dG51bSA9IGF0dG51bSArIDE7 CgoJdHlwZW9pZCA9IGdldHR5cGUodHlwZSk7CgoJaWYgKFR5cCAhPSBOSUwpCgl7CgkJYXR0 cnR5cGVzW2F0dG51bV0tPmF0dHR5cGlkID0gQXAtPmFtX29pZDsKCQlhdHRydHlwZXNbYXR0 bnVtXS0+YXR0bGVuID0gQXAtPmFtX3R5cC50eXBsZW47CgkJYXR0cnR5cGVzW2F0dG51bV0t PmF0dGJ5dmFsID0gQXAtPmFtX3R5cC50eXBieXZhbDsKCQlhdHRydHlwZXNbYXR0bnVtXS0+ YXR0YWxpZ24gPSBBcC0+YW1fdHlwLnR5cGFsaWduOwoJCWF0dHJ0eXBlc1thdHRudW1dLT5h dHRzdG9yYWdlID0gQXAtPmFtX3R5cC50eXBzdG9yYWdlOwoJCWF0dHJ0eXBlc1thdHRudW1d LT5hdHRjb21wcmVzc2lvbiA9IEludmFsaWRDb21wcmVzc2lvbk1ldGhvZDsKCQlhdHRydHlw ZXNbYXR0bnVtXS0+YXR0Y29sbGF0aW9uID0gQXAtPmFtX3R5cC50eXBjb2xsYXRpb247CgkJ LyogaWYgYW4gYXJyYXkgdHlwZSwgYXNzdW1lIDEtZGltZW5zaW9uYWwgYXR0cmlidXRlICov CgkJaWYgKEFwLT5hbV90eXAudHlwZWxlbSAhPSBJbnZhbGlkT2lkICYmIEFwLT5hbV90eXAu dHlwbGVuIDwgMCkKCQkJYXR0cnR5cGVzW2F0dG51bV0tPmF0dG5kaW1zID0gMTsKCQllbHNl CgkJCWF0dHJ0eXBlc1thdHRudW1dLT5hdHRuZGltcyA9IDA7Cgl9CgllbHNlCgl7CgkJYXR0 cnR5cGVzW2F0dG51bV0tPmF0dHR5cGlkID0gVHlwSW5mb1t0eXBlb2lkXS5vaWQ7CgkJYXR0 cnR5cGVzW2F0dG51bV0tPmF0dGxlbiA9IFR5cEluZm9bdHlwZW9pZF0ubGVuOwoJCWF0dHJ0 eXBlc1thdHRudW1dLT5hdHRieXZhbCA9IFR5cEluZm9bdHlwZW9pZF0uYnl2YWw7CgkJYXR0 cnR5cGVzW2F0dG51bV0tPmF0dGFsaWduID0gVHlwSW5mb1t0eXBlb2lkXS5hbGlnbjsKCQlh dHRydHlwZXNbYXR0bnVtXS0+YXR0c3RvcmFnZSA9IFR5cEluZm9bdHlwZW9pZF0uc3RvcmFn ZTsKCQlhdHRydHlwZXNbYXR0bnVtXS0+YXR0Y29tcHJlc3Npb24gPSBJbnZhbGlkQ29tcHJl c3Npb25NZXRob2Q7CgkJYXR0cnR5cGVzW2F0dG51bV0tPmF0dGNvbGxhdGlvbiA9IFR5cElu Zm9bdHlwZW9pZF0uY29sbGF0aW9uOwoJCS8qIGlmIGFuIGFycmF5IHR5cGUsIGFzc3VtZSAx LWRpbWVuc2lvbmFsIGF0dHJpYnV0ZSAqLwoJCWlmIChUeXBJbmZvW3R5cGVvaWRdLmVsZW0g IT0gSW52YWxpZE9pZCAmJgoJCQlhdHRydHlwZXNbYXR0bnVtXS0+YXR0bGVuIDwgMCkKCQkJ YXR0cnR5cGVzW2F0dG51bV0tPmF0dG5kaW1zID0gMTsKCQllbHNlCgkJCWF0dHJ0eXBlc1th dHRudW1dLT5hdHRuZGltcyA9IDA7Cgl9CgoJLyoKCSAqIElmIGEgc3lzdGVtIGNhdGFsb2cg Y29sdW1uIGlzIGNvbGxhdGlvbi1hd2FyZSwgZm9yY2UgaXQgdG8gdXNlIEMKCSAqIGNvbGxh dGlvbiwgc28gdGhhdCBpdHMgYmVoYXZpb3IgaXMgaW5kZXBlbmRlbnQgb2YgdGhlIGRhdGFi YXNlJ3MKCSAqIGNvbGxhdGlvbi4gIFRoaXMgaXMgZXNzZW50aWFsIHRvIGFsbG93IHRlbXBs YXRlMCB0byBiZSBjbG9uZWQgd2l0aCBhCgkgKiBkaWZmZXJlbnQgZGF0YWJhc2UgY29sbGF0 aW9uLgoJICovCglpZiAoT2lkSXNWYWxpZChhdHRydHlwZXNbYXR0bnVtXS0+YXR0Y29sbGF0 aW9uKSkKCQlhdHRydHlwZXNbYXR0bnVtXS0+YXR0Y29sbGF0aW9uID0gQ19DT0xMQVRJT05f T0lEOwoKCWF0dHJ0eXBlc1thdHRudW1dLT5hdHR0eXBtb2QgPSAtMTsKCWF0dHJ0eXBlc1th dHRudW1dLT5hdHRpc2xvY2FsID0gdHJ1ZTsKCglpZiAobnVsbG5lc3MgPT0gQk9PVENPTF9O VUxMX0ZPUkNFX05PVF9OVUxMKQoJewoJCWF0dHJ0eXBlc1thdHRudW1dLT5hdHRub3RudWxs ID0gdHJ1ZTsKCX0KCWVsc2UgaWYgKG51bGxuZXNzID09IEJPT1RDT0xfTlVMTF9GT1JDRV9O VUxMKQoJewoJCWF0dHJ0eXBlc1thdHRudW1dLT5hdHRub3RudWxsID0gZmFsc2U7Cgl9Cgll bHNlCgl7CgkJQXNzZXJ0KG51bGxuZXNzID09IEJPT1RDT0xfTlVMTF9BVVRPKTsKCgkJLyoK CQkgKiBNYXJrIGFzICJub3QgbnVsbCIgaWYgdHlwZSBpcyBmaXhlZC13aWR0aCBhbmQgcHJp b3IgY29sdW1ucyBhcmUKCQkgKiBsaWtld2lzZSBmaXhlZC13aWR0aCBhbmQgbm90LW51bGwu ICBUaGlzIGNvcnJlc3BvbmRzIHRvIGNhc2Ugd2hlcmUKCQkgKiBjb2x1bW4gY2FuIGJlIGFj Y2Vzc2VkIGRpcmVjdGx5IHZpYSBDIHN0cnVjdCBkZWNsYXJhdGlvbi4KCQkgKi8KCQlpZiAo YXR0cnR5cGVzW2F0dG51bV0tPmF0dGxlbiA+IDApCgkJewoJCQlpbnQJCQlpOwoKCQkJLyog Y2hlY2sgZWFybGllciBhdHRyaWJ1dGVzICovCgkJCWZvciAoaSA9IDA7IGkgPCBhdHRudW07 IGkrKykKCQkJewoJCQkJaWYgKGF0dHJ0eXBlc1tpXS0+YXR0bGVuIDw9IDAgfHwKCQkJCQkh YXR0cnR5cGVzW2ldLT5hdHRub3RudWxsKQoJCQkJCWJyZWFrOwoJCQl9CgkJCWlmIChpID09 IGF0dG51bSkKCQkJCWF0dHJ0eXBlc1thdHRudW1dLT5hdHRub3RudWxsID0gdHJ1ZTsKCQl9 Cgl9Cn0KCgovKiAtLS0tLS0tLS0tLS0tLS0tCiAqCQlJbnNlcnRPbmVUdXBsZQogKgogKiBJ ZiBvYmplY3RpZCBpcyBub3QgemVybywgaXQgaXMgYSBzcGVjaWZpYyBPSUQgdG8gYXNzaWdu IHRvIHRoZSB0dXBsZS4KICogT3RoZXJ3aXNlLCBhbiBPSUQgd2lsbCBiZSBhc3NpZ25lZCAo aWYgbmVjZXNzYXJ5KSBieSBoZWFwX2luc2VydC4KICogLS0tLS0tLS0tLS0tLS0tLQogKi8K dm9pZApJbnNlcnRPbmVUdXBsZSh2b2lkKQp7CglIZWFwVHVwbGUJdHVwbGU7CglUdXBsZURl c2MJdHVwRGVzYzsKCWludAkJCWk7CgoJZWxvZyhERUJVRzQsICJpbnNlcnRpbmcgcm93IHdp dGggJWQgY29sdW1ucyIsIG51bWF0dHIpOwoKCXR1cERlc2MgPSBDcmVhdGVUdXBsZURlc2Mo bnVtYXR0ciwgYXR0cnR5cGVzKTsKCXR1cGxlID0gaGVhcF9mb3JtX3R1cGxlKHR1cERlc2Ms IHZhbHVlcywgTnVsbHMpOwoJcGZyZWUodHVwRGVzYyk7CQkJCS8qIGp1c3QgZnJlZSdzIHR1 cERlc2MsIG5vdCB0aGUgYXR0cnR5cGVzICovCgoJc2ltcGxlX2hlYXBfaW5zZXJ0KGJvb3Rf cmVsZGVzYywgdHVwbGUpOwoJaGVhcF9mcmVldHVwbGUodHVwbGUpOwoJZWxvZyhERUJVRzQs ICJyb3cgaW5zZXJ0ZWQiKTsKCgkvKgoJICogUmVzZXQgbnVsbCBtYXJrZXJzIGZvciBuZXh0 IHR1cGxlCgkgKi8KCWZvciAoaSA9IDA7IGkgPCBudW1hdHRyOyBpKyspCgkJTnVsbHNbaV0g PSBmYWxzZTsKfQoKLyogLS0tLS0tLS0tLS0tLS0tLQogKgkJSW5zZXJ0T25lVmFsdWUKICog LS0tLS0tLS0tLS0tLS0tLQogKi8Kdm9pZApJbnNlcnRPbmVWYWx1ZShjaGFyICp2YWx1ZSwg aW50IGkpCnsKCUZvcm1fcGdfYXR0cmlidXRlIGF0dHI7CglPaWQJCQl0eXBvaWQ7CglpbnQx NgkJdHlwbGVuOwoJYm9vbAkJdHlwYnl2YWw7CgljaGFyCQl0eXBhbGlnbjsKCWNoYXIJCXR5 cGRlbGltOwoJT2lkCQkJdHlwaW9wYXJhbTsKCU9pZAkJCXR5cGlucHV0OwoJT2lkCQkJdHlw b3V0cHV0OwoJT2lkCQkJdHlwY29sbGF0aW9uOwoKCUFzc2VydChpID49IDAgJiYgaSA8IE1B WEFUVFIpOwoKCWVsb2coREVCVUc0LCAiaW5zZXJ0aW5nIGNvbHVtbiAlZCB2YWx1ZSBcIiVz XCIiLCBpLCB2YWx1ZSk7CgoJYXR0ciA9IFR1cGxlRGVzY0F0dHIoUmVsYXRpb25HZXREZXNj cihib290X3JlbGRlc2MpLCBpKTsKCXR5cG9pZCA9IGF0dHItPmF0dHR5cGlkOwoKCWJvb3Rf Z2V0X3R5cGVfaW9fZGF0YSh0eXBvaWQsCgkJCQkJCSAgJnR5cGxlbiwgJnR5cGJ5dmFsLCAm dHlwYWxpZ24sCgkJCQkJCSAgJnR5cGRlbGltLCAmdHlwaW9wYXJhbSwKCQkJCQkJICAmdHlw aW5wdXQsICZ0eXBvdXRwdXQsCgkJCQkJCSAgJnR5cGNvbGxhdGlvbik7CgoJLyoKCSAqIHBn X25vZGVfdHJlZSB2YWx1ZXMgY2FuJ3QgYmUgaW5zZXJ0ZWQgbm9ybWFsbHkgKHBnX25vZGVf dHJlZV9pbiB3b3VsZAoJICoganVzdCBlcnJvciBvdXQpLCBzbyBwcm92aWRlIHNwZWNpYWwg Y2FzZXMgZm9yIHN1Y2ggY29sdW1ucyB0aGF0IHdlCgkgKiB3b3VsZCBsaWtlIHRvIGZpbGwg ZHVyaW5nIGJvb3RzdHJhcC4KCSAqLwoJaWYgKHR5cG9pZCA9PSBQR19OT0RFX1RSRUVPSUQp Cgl7CgkJLyogcGdfcHJvYy5wcm9hcmdkZWZhdWx0cyAqLwoJCWlmIChSZWxhdGlvbkdldFJl bGlkKGJvb3RfcmVsZGVzYykgPT0gUHJvY2VkdXJlUmVsYXRpb25JZCAmJgoJCQlpID09IEFu dW1fcGdfcHJvY19wcm9hcmdkZWZhdWx0cyAtIDEpCgkJCUluc2VydE9uZVByb2FyZ2RlZmF1 bHRzVmFsdWUodmFsdWUpOwoJCWVsc2UJCQkJCS8qIG1heWJlIG90aGVyIGNhc2VzIGxhdGVy ICovCgkJCWVsb2coRVJST1IsICJjYW4ndCBoYW5kbGUgcGdfbm9kZV90cmVlIGlucHV0IGZv ciAlcy4lcyIsCgkJCQkgUmVsYXRpb25HZXRSZWxhdGlvbk5hbWUoYm9vdF9yZWxkZXNjKSwK CQkJCSBOYW1lU3RyKGF0dHItPmF0dG5hbWUpKTsKCX0KCWVsc2UKCXsKCQkvKiBOb3JtYWwg Y2FzZSAqLwoJCXZhbHVlc1tpXSA9IE9pZElucHV0RnVuY3Rpb25DYWxsKHR5cGlucHV0LCB2 YWx1ZSwgdHlwaW9wYXJhbSwgLTEpOwoJfQoKCS8qCgkgKiBXZSB1c2UgZXJlcG9ydCBub3Qg ZWxvZyBoZXJlIHNvIHRoYXQgcGFyYW1ldGVycyBhcmVuJ3QgZXZhbHVhdGVkIHVubGVzcwoJ ICogdGhlIG1lc3NhZ2UgaXMgZ29pbmcgdG8gYmUgcHJpbnRlZCwgd2hpY2ggZ2VuZXJhbGx5 IGl0IGlzbid0CgkgKi8KCWVyZXBvcnQoREVCVUc0LAoJCQkoZXJybXNnX2ludGVybmFsKCJp bnNlcnRlZCAtPiAlcyIsCgkJCQkJCQkgT2lkT3V0cHV0RnVuY3Rpb25DYWxsKHR5cG91dHB1 dCwgdmFsdWVzW2ldKSkpKTsKfQoKLyogLS0tLS0tLS0tLS0tLS0tLQogKgkJSW5zZXJ0T25l UHJvYXJnZGVmYXVsdHNWYWx1ZQogKgogKiBJbiBnZW5lcmFsLCBwcm9hcmdkZWZhdWx0cyBj YW4gYmUgYSBsaXN0IG9mIGFueSBleHByZXNzaW9ucywgYnV0CiAqIGZvciBib290c3RyYXAg d2Ugb25seSBzdXBwb3J0IGEgbGlzdCBvZiBDb25zdCBub2Rlcy4gIFRoZSBpbnB1dAogKiBo YXMgdGhlIGZvcm0gb2YgYSB0ZXh0IGFycmF5LCBhbmQgd2UgZmVlZCBub24tbnVsbCBlbGVt ZW50cyB0byB0aGUKICogdHlwaW5wdXQgZnVuY3Rpb25zIGZvciB0aGUgYXBwcm9wcmlhdGUg cGFyYW1ldGVycy4KICogLS0tLS0tLS0tLS0tLS0tLQogKi8Kc3RhdGljIHZvaWQKSW5zZXJ0 T25lUHJvYXJnZGVmYXVsdHNWYWx1ZShjaGFyICp2YWx1ZSkKewoJaW50CQkJcHJvbmFyZ3M7 CglvaWR2ZWN0b3IgICpwcm9hcmd0eXBlczsKCURhdHVtCQlhcnJheXZhbDsKCURhdHVtCSAg ICphcnJheV9kYXR1bXM7Cglib29sCSAgICphcnJheV9udWxsczsKCWludAkJCWFycmF5X2Nv dW50OwoJTGlzdAkgICAqcHJvYXJnZGVmYXVsdHM7CgljaGFyCSAgICpub2Rlc3RyaW5nOwoK CS8qIFRoZSBwZ19wcm9jIGNvbHVtbnMgd2UgbmVlZCB0byB1c2UgbXVzdCBoYXZlIGJlZW4g ZmlsbGVkIGFscmVhZHkgKi8KCVN0YXRpY0Fzc2VydERlY2woQW51bV9wZ19wcm9jX3Byb25h cmdzIDwgQW51bV9wZ19wcm9jX3Byb2FyZ2RlZmF1bHRzLAoJCQkJCSAicHJvbmFyZ3MgbXVz dCBjb21lIGJlZm9yZSBwcm9hcmdkZWZhdWx0cyIpOwoJU3RhdGljQXNzZXJ0RGVjbChBbnVt X3BnX3Byb2NfcHJvbmFyZ2RlZmF1bHRzIDwgQW51bV9wZ19wcm9jX3Byb2FyZ2RlZmF1bHRz LAoJCQkJCSAicHJvbmFyZ2RlZmF1bHRzIG11c3QgY29tZSBiZWZvcmUgcHJvYXJnZGVmYXVs dHMiKTsKCVN0YXRpY0Fzc2VydERlY2woQW51bV9wZ19wcm9jX3Byb2FyZ3R5cGVzIDwgQW51 bV9wZ19wcm9jX3Byb2FyZ2RlZmF1bHRzLAoJCQkJCSAicHJvYXJndHlwZXMgbXVzdCBjb21l IGJlZm9yZSBwcm9hcmdkZWZhdWx0cyIpOwoJaWYgKE51bGxzW0FudW1fcGdfcHJvY19wcm9u YXJncyAtIDFdKQoJCWVsb2coRVJST1IsICJwcm9uYXJncyBtdXN0IG5vdCBiZSBudWxsIik7 CglpZiAoTnVsbHNbQW51bV9wZ19wcm9jX3Byb2FyZ3R5cGVzIC0gMV0pCgkJZWxvZyhFUlJP UiwgInByb2FyZ3R5cGVzIG11c3Qgbm90IGJlIG51bGwiKTsKCXByb25hcmdzID0gRGF0dW1H ZXRJbnQxNih2YWx1ZXNbQW51bV9wZ19wcm9jX3Byb25hcmdzIC0gMV0pOwoJcHJvYXJndHlw ZXMgPSBEYXR1bUdldFBvaW50ZXIodmFsdWVzW0FudW1fcGdfcHJvY19wcm9hcmd0eXBlcyAt IDFdKTsKCUFzc2VydChwcm9uYXJncyA9PSBwcm9hcmd0eXBlcy0+ZGltMSk7CgoJLyogUGFy c2UgdGhlIGlucHV0IHN0cmluZyBhcyBhbiBhcnJheSB2YWx1ZSwgdGhlbiBkZWNvbnN0cnVj dCB0byBEYXR1bXMgKi8KCWFycmF5dmFsID0gT2lkRnVuY3Rpb25DYWxsMyhGX0FSUkFZX0lO LAoJCQkJCQkJCUNTdHJpbmdHZXREYXR1bSh2YWx1ZSksCgkJCQkJCQkJT2JqZWN0SWRHZXRE YXR1bShDU1RSSU5HT0lEKSwKCQkJCQkJCQlJbnQzMkdldERhdHVtKC0xKSk7CglkZWNvbnN0 cnVjdF9hcnJheV9idWlsdGluKERhdHVtR2V0QXJyYXlUeXBlUChhcnJheXZhbCksIENTVFJJ TkdPSUQsCgkJCQkJCQkgICZhcnJheV9kYXR1bXMsICZhcnJheV9udWxscywgJmFycmF5X2Nv dW50KTsKCgkvKiBUaGUgdmFsdWVzIHNob3VsZCBjb3JyZXNwb25kIHRvIHRoZSBsYXN0IE4g YXJndHlwZXMgKi8KCWlmIChhcnJheV9jb3VudCA+IHByb25hcmdzKQoJCWVsb2coRVJST1Is ICJ0b28gbWFueSBwcm9hcmdkZWZhdWx0cyBlbnRyaWVzIik7CgoJLyogQnVpbGQgdGhlIExp c3Qgb2YgQ29uc3Qgbm9kZXMgKi8KCXByb2FyZ2RlZmF1bHRzID0gTklMOwoJZm9yIChpbnQg aSA9IDA7IGkgPCBhcnJheV9jb3VudDsgaSsrKQoJewoJCU9pZAkJCWFyZ3R5cGUgPSBwcm9h cmd0eXBlcy0+dmFsdWVzW3Byb25hcmdzIC0gYXJyYXlfY291bnQgKyBpXTsKCQlpbnQxNgkJ dHlwbGVuOwoJCWJvb2wJCXR5cGJ5dmFsOwoJCWNoYXIJCXR5cGFsaWduOwoJCWNoYXIJCXR5 cGRlbGltOwoJCU9pZAkJCXR5cGlvcGFyYW07CgkJT2lkCQkJdHlwaW5wdXQ7CgkJT2lkCQkJ dHlwb3V0cHV0OwoJCU9pZAkJCXR5cGNvbGxhdGlvbjsKCQlEYXR1bQkJZGVmdmFsOwoJCWJv b2wJCWRlZm51bGw7CgkJQ29uc3QJICAgKmRlZkNvbnN0OwoKCQlib290X2dldF90eXBlX2lv X2RhdGEoYXJndHlwZSwKCQkJCQkJCSAgJnR5cGxlbiwgJnR5cGJ5dmFsLCAmdHlwYWxpZ24s CgkJCQkJCQkgICZ0eXBkZWxpbSwgJnR5cGlvcGFyYW0sCgkJCQkJCQkgICZ0eXBpbnB1dCwg JnR5cG91dHB1dCwKCQkJCQkJCSAgJnR5cGNvbGxhdGlvbik7CgoJCWRlZm51bGwgPSBhcnJh eV9udWxsc1tpXTsKCQlpZiAoZGVmbnVsbCkKCQkJZGVmdmFsID0gKERhdHVtKSAwOwoJCWVs c2UKCQkJZGVmdmFsID0gT2lkSW5wdXRGdW5jdGlvbkNhbGwodHlwaW5wdXQsCgkJCQkJCQkJ CQkgIERhdHVtR2V0Q1N0cmluZyhhcnJheV9kYXR1bXNbaV0pLAoJCQkJCQkJCQkJICB0eXBp b3BhcmFtLCAtMSk7CgoJCWRlZkNvbnN0ID0gbWFrZUNvbnN0KGFyZ3R5cGUsCgkJCQkJCQkg LTEsCS8qIG5ldmVyIGFueSB0eXBtb2QgKi8KCQkJCQkJCSB0eXBjb2xsYXRpb24sCgkJCQkJ CQkgdHlwbGVuLAoJCQkJCQkJIGRlZnZhbCwKCQkJCQkJCSBkZWZudWxsLAoJCQkJCQkJIHR5 cGJ5dmFsKTsKCQlwcm9hcmdkZWZhdWx0cyA9IGxhcHBlbmQocHJvYXJnZGVmYXVsdHMsIGRl ZkNvbnN0KTsKCX0KCgkvKgoJICogRmxhdHRlbiB0aGUgTGlzdCB0byBhIG5vZGUtdHJlZSBz dHJpbmcsIHRoZW4gY29udmVydCB0byBhIHRleHQgZGF0dW0sCgkgKiB3aGljaCBpcyB0aGUg c3RvcmFnZSByZXByZXNlbnRhdGlvbiBvZiBwZ19ub2RlX3RyZWUuCgkgKi8KCW5vZGVzdHJp bmcgPSBub2RlVG9TdHJpbmcocHJvYXJnZGVmYXVsdHMpOwoJdmFsdWVzW0FudW1fcGdfcHJv Y19wcm9hcmdkZWZhdWx0cyAtIDFdID0gQ1N0cmluZ0dldFRleHREYXR1bShub2Rlc3RyaW5n KTsKCU51bGxzW0FudW1fcGdfcHJvY19wcm9hcmdkZWZhdWx0cyAtIDFdID0gZmFsc2U7CgoJ LyoKCSAqIEhhY2s6IGZpbGwgaW4gcHJvbmFyZ2RlZmF1bHRzIHdpdGggdGhlIHJpZ2h0IHZh bHVlLiAgVGhpcyBpcyBzdXJlbHkKCSAqIHVnbHksIGJ1dCBpdCBiZWF0cyBtYWtpbmcgdGhl IHByb2dyYW1tZXIgZG8gaXQuCgkgKi8KCXZhbHVlc1tBbnVtX3BnX3Byb2NfcHJvbmFyZ2Rl ZmF1bHRzIC0gMV0gPSBJbnQxNkdldERhdHVtKGFycmF5X2NvdW50KTsKCU51bGxzW0FudW1f cGdfcHJvY19wcm9uYXJnZGVmYXVsdHMgLSAxXSA9IGZhbHNlOwp9CgovKiAtLS0tLS0tLS0t LS0tLS0tCiAqCQlJbnNlcnRPbmVOdWxsCiAqIC0tLS0tLS0tLS0tLS0tLS0KICovCnZvaWQK SW5zZXJ0T25lTnVsbChpbnQgaSkKewoJZWxvZyhERUJVRzQsICJpbnNlcnRpbmcgY29sdW1u ICVkIE5VTEwiLCBpKTsKCUFzc2VydChpID49IDAgJiYgaSA8IE1BWEFUVFIpOwoJaWYgKFR1 cGxlRGVzY0F0dHIoYm9vdF9yZWxkZXNjLT5yZF9hdHQsIGkpLT5hdHRub3RudWxsKQoJCWVs b2coRVJST1IsCgkJCSAiTlVMTCB2YWx1ZSBzcGVjaWZpZWQgZm9yIG5vdC1udWxsIGNvbHVt biBcIiVzXCIgb2YgcmVsYXRpb24gXCIlc1wiIiwKCQkJIE5hbWVTdHIoVHVwbGVEZXNjQXR0 cihib290X3JlbGRlc2MtPnJkX2F0dCwgaSktPmF0dG5hbWUpLAoJCQkgUmVsYXRpb25HZXRS ZWxhdGlvbk5hbWUoYm9vdF9yZWxkZXNjKSk7Cgl2YWx1ZXNbaV0gPSBQb2ludGVyR2V0RGF0 dW0oTlVMTCk7CglOdWxsc1tpXSA9IHRydWU7Cn0KCi8qIC0tLS0tLS0tLS0tLS0tLS0KICoJ CWNsZWFudXAKICogLS0tLS0tLS0tLS0tLS0tLQogKi8Kc3RhdGljIHZvaWQKY2xlYW51cCh2 b2lkKQp7CglpZiAoYm9vdF9yZWxkZXNjICE9IE5VTEwpCgkJY2xvc2VyZWwoTlVMTCk7Cn0K Ci8qIC0tLS0tLS0tLS0tLS0tLS0KICoJCXBvcHVsYXRlX3R5cF9saXN0CiAqCiAqIExvYWQg dGhlIFR5cCBsaXN0IGJ5IHJlYWRpbmcgcGdfdHlwZS4KICogLS0tLS0tLS0tLS0tLS0tLQog Ki8Kc3RhdGljIHZvaWQKcG9wdWxhdGVfdHlwX2xpc3Qodm9pZCkKewoJUmVsYXRpb24JcmVs OwoJVGFibGVTY2FuRGVzYyBzY2FuOwoJSGVhcFR1cGxlCXR1cDsKCU1lbW9yeUNvbnRleHQg b2xkOwoKCUFzc2VydChUeXAgPT0gTklMKTsKCglyZWwgPSB0YWJsZV9vcGVuKFR5cGVSZWxh dGlvbklkLCBOb0xvY2spOwoJc2NhbiA9IHRhYmxlX2JlZ2luc2Nhbl9jYXRhbG9nKHJlbCwg MCwgTlVMTCk7CglvbGQgPSBNZW1vcnlDb250ZXh0U3dpdGNoVG8oVG9wTWVtb3J5Q29udGV4 dCk7Cgl3aGlsZSAoKHR1cCA9IGhlYXBfZ2V0bmV4dChzY2FuLCBGb3J3YXJkU2NhbkRpcmVj dGlvbikpICE9IE5VTEwpCgl7CgkJRm9ybV9wZ190eXBlIHR5cEZvcm0gPSAoRm9ybV9wZ190 eXBlKSBHRVRTVFJVQ1QodHVwKTsKCQlzdHJ1Y3QgdHlwbWFwICpuZXd0eXA7CgoJCW5ld3R5 cCA9IHBhbGxvY19vYmplY3Qoc3RydWN0IHR5cG1hcCk7CgkJVHlwID0gbGFwcGVuZChUeXAs IG5ld3R5cCk7CgoJCW5ld3R5cC0+YW1fb2lkID0gdHlwRm9ybS0+b2lkOwoJCW1lbWNweSgm bmV3dHlwLT5hbV90eXAsIHR5cEZvcm0sIHNpemVvZihuZXd0eXAtPmFtX3R5cCkpOwoJfQoJ TWVtb3J5Q29udGV4dFN3aXRjaFRvKG9sZCk7Cgl0YWJsZV9lbmRzY2FuKHNjYW4pOwoJdGFi bGVfY2xvc2UocmVsLCBOb0xvY2spOwp9CgovKiAtLS0tLS0tLS0tLS0tLS0tCiAqCQlnZXR0 eXBlCiAqCiAqIE5COiB0aGlzIGlzIHJlYWxseSB1Z2x5OyBpdCB3aWxsIHJldHVybiBhbiBp bnRlZ2VyIGluZGV4IGludG8gVHlwSW5mb1tdLAogKiBhbmQgbm90IGFuIE9JRCBhdCBhbGws IHVudGlsIHRoZSBmaXJzdCByZWZlcmVuY2UgdG8gYSB0eXBlIG5vdCBrbm93biBpbgogKiBU eXBJbmZvW10uICBBdCB0aGF0IHBvaW50IGl0IHdpbGwgcmVhZCBhbmQgY2FjaGUgcGdfdHlw ZSBpbiBUeXAsCiAqIGFuZCBzdWJzZXF1ZW50bHkgcmV0dXJuIGEgcmVhbCBPSUQgKGFuZCBz ZXQgdGhlIGdsb2JhbCBwb2ludGVyIEFwIHRvCiAqIHBvaW50IGF0IHRoZSBmb3VuZCByb3cg aW4gVHlwKS4gIFNvIGNhbGxlciBtdXN0IGNoZWNrIHdoZXRoZXIgVHlwIGlzCiAqIHN0aWxs IE5JTCB0byBkZXRlcm1pbmUgd2hhdCB0aGUgcmV0dXJuIHZhbHVlIGlzIQogKiAtLS0tLS0t LS0tLS0tLS0tCiAqLwpzdGF0aWMgT2lkCmdldHR5cGUoY2hhciAqdHlwZSkKewoJaWYgKFR5 cCAhPSBOSUwpCgl7CgkJTGlzdENlbGwgICAqbGM7CgoJCWZvcmVhY2gobGMsIFR5cCkKCQl7 CgkJCXN0cnVjdCB0eXBtYXAgKmFwcCA9IGxmaXJzdChsYyk7CgoJCQlpZiAoc3RybmNtcChO YW1lU3RyKGFwcC0+YW1fdHlwLnR5cG5hbWUpLCB0eXBlLCBOQU1FREFUQUxFTikgPT0gMCkK CQkJewoJCQkJQXAgPSBhcHA7CgkJCQlyZXR1cm4gYXBwLT5hbV9vaWQ7CgkJCX0KCQl9CgoJ CS8qCgkJICogVGhlIHR5cGUgd2Fzbid0IGtub3duOyByZWxvYWQgdGhlIHBnX3R5cGUgY29u dGVudHMgYW5kIGNoZWNrIGFnYWluCgkJICogdG8gaGFuZGxlIGNvbXBvc2l0ZSB0eXBlcywg YWRkZWQgc2luY2UgbGFzdCBwb3B1bGF0aW5nIHRoZSBsaXN0LgoJCSAqLwoKCQlsaXN0X2Zy ZWVfZGVlcChUeXApOwoJCVR5cCA9IE5JTDsKCQlwb3B1bGF0ZV90eXBfbGlzdCgpOwoKCQkv KgoJCSAqIENhbGxpbmcgZ2V0dHlwZSB3b3VsZCByZXN1bHQgaW4gaW5maW5pdGUgcmVjdXJz aW9uIGZvciB0eXBlcwoJCSAqIG1pc3NpbmcgaW4gcGdfdHlwZSwgc28ganVzdCByZXBlYXQg dGhlIGxvb2t1cC4KCQkgKi8KCQlmb3JlYWNoKGxjLCBUeXApCgkJewoJCQlzdHJ1Y3QgdHlw bWFwICphcHAgPSBsZmlyc3QobGMpOwoKCQkJaWYgKHN0cm5jbXAoTmFtZVN0cihhcHAtPmFt X3R5cC50eXBuYW1lKSwgdHlwZSwgTkFNRURBVEFMRU4pID09IDApCgkJCXsKCQkJCUFwID0g YXBwOwoJCQkJcmV0dXJuIGFwcC0+YW1fb2lkOwoJCQl9CgkJfQoJfQoJZWxzZQoJewoJCWlu dAkJCWk7CgoJCWZvciAoaSA9IDA7IGkgPCBuX3R5cGVzOyBpKyspCgkJewoJCQlpZiAoc3Ry bmNtcCh0eXBlLCBUeXBJbmZvW2ldLm5hbWUsIE5BTUVEQVRBTEVOKSA9PSAwKQoJCQkJcmV0 dXJuIGk7CgkJfQoJCS8qIE5vdCBpbiBUeXBJbmZvLCBzbyB3ZSdkIGJldHRlciBiZSBhYmxl IHRvIHJlYWQgcGdfdHlwZSBub3cgKi8KCQllbG9nKERFQlVHNCwgImV4dGVybmFsIHR5cGU6 ICVzIiwgdHlwZSk7CgkJcG9wdWxhdGVfdHlwX2xpc3QoKTsKCQlyZXR1cm4gZ2V0dHlwZSh0 eXBlKTsKCX0KCWVsb2coRVJST1IsICJ1bnJlY29nbml6ZWQgdHlwZSBcIiVzXCIiLCB0eXBl KTsKCS8qIG5vdCByZWFjaGVkLCBoZXJlIHRvIG1ha2UgY29tcGlsZXIgaGFwcHkgKi8KCXJl dHVybiAwOwp9CgovKiAtLS0tLS0tLS0tLS0tLS0tCiAqCQlib290X2dldF90eXBlX2lvX2Rh dGEKICoKICogT2J0YWluIHR5cGUgSS9PIGluZm9ybWF0aW9uIGF0IGJvb3RzdHJhcCB0aW1l LiAgVGhpcyBpbnRlbnRpb25hbGx5IGhhcwogKiBhbiBBUEkgdmVyeSBjbG9zZSB0byB0aGF0 IG9mIGxzeXNjYWNoZS5jJ3MgZ2V0X3R5cGVfaW9fZGF0YSwgZXhjZXB0IHRoYXQKICogd2Ug b25seSBzdXBwb3J0IG9idGFpbmluZyB0aGUgdHlwaW5wdXQgYW5kIHR5cG91dHB1dCByb3V0 aW5lcywgbm90CiAqIHRoZSBiaW5hcnkgSS9PIHJvdXRpbmVzLCBhbmQgd2UgYWxzbyByZXR1 cm4gdGhlIHR5cGUncyBjb2xsYXRpb24uCiAqIFRoaXMgaXMgZXhwb3J0ZWQgc28gdGhhdCBh cnJheV9pbiBhbmQgYXJyYXlfb3V0IGNhbiBiZSBtYWRlIHRvIHdvcmsKICogZHVyaW5nIGVh cmx5IGJvb3RzdHJhcC4KICogLS0tLS0tLS0tLS0tLS0tLQogKi8Kdm9pZApib290X2dldF90 eXBlX2lvX2RhdGEoT2lkIHR5cGlkLAoJCQkJCSAgaW50MTYgKnR5cGxlbiwKCQkJCQkgIGJv b2wgKnR5cGJ5dmFsLAoJCQkJCSAgY2hhciAqdHlwYWxpZ24sCgkJCQkJICBjaGFyICp0eXBk ZWxpbSwKCQkJCQkgIE9pZCAqdHlwaW9wYXJhbSwKCQkJCQkgIE9pZCAqdHlwaW5wdXQsCgkJ CQkJICBPaWQgKnR5cG91dHB1dCwKCQkJCQkgIE9pZCAqdHlwY29sbGF0aW9uKQp7CglpZiAo VHlwICE9IE5JTCkKCXsKCQkvKiBXZSBoYXZlIHRoZSBib290LXRpbWUgY29udGVudHMgb2Yg cGdfdHlwZSwgc28gdXNlIGl0ICovCgkJc3RydWN0IHR5cG1hcCAqYXAgPSBOVUxMOwoJCUxp c3RDZWxsICAgKmxjOwoKCQlmb3JlYWNoKGxjLCBUeXApCgkJewoJCQlhcCA9IGxmaXJzdChs Yyk7CgkJCWlmIChhcC0+YW1fb2lkID09IHR5cGlkKQoJCQkJYnJlYWs7CgkJfQoKCQlpZiAo IWFwIHx8IGFwLT5hbV9vaWQgIT0gdHlwaWQpCgkJCWVsb2coRVJST1IsICJ0eXBlIE9JRCAl dSBub3QgZm91bmQgaW4gVHlwIGxpc3QiLCB0eXBpZCk7CgoJCSp0eXBsZW4gPSBhcC0+YW1f dHlwLnR5cGxlbjsKCQkqdHlwYnl2YWwgPSBhcC0+YW1fdHlwLnR5cGJ5dmFsOwoJCSp0eXBh bGlnbiA9IGFwLT5hbV90eXAudHlwYWxpZ247CgkJKnR5cGRlbGltID0gYXAtPmFtX3R5cC50 eXBkZWxpbTsKCgkJLyogWFhYIHRoaXMgbG9naWMgbXVzdCBtYXRjaCBnZXRUeXBlSU9QYXJh bSgpICovCgkJaWYgKE9pZElzVmFsaWQoYXAtPmFtX3R5cC50eXBlbGVtKSkKCQkJKnR5cGlv cGFyYW0gPSBhcC0+YW1fdHlwLnR5cGVsZW07CgkJZWxzZQoJCQkqdHlwaW9wYXJhbSA9IHR5 cGlkOwoKCQkqdHlwaW5wdXQgPSBhcC0+YW1fdHlwLnR5cGlucHV0OwoJCSp0eXBvdXRwdXQg PSBhcC0+YW1fdHlwLnR5cG91dHB1dDsKCgkJKnR5cGNvbGxhdGlvbiA9IGFwLT5hbV90eXAu dHlwY29sbGF0aW9uOwoJfQoJZWxzZQoJewoJCS8qIFdlIGRvbid0IGhhdmUgcGdfdHlwZSB5 ZXQsIHNvIHVzZSB0aGUgaGFyZC13aXJlZCBUeXBJbmZvIGFycmF5ICovCgkJaW50CQkJdHlw ZWluZGV4OwoKCQlmb3IgKHR5cGVpbmRleCA9IDA7IHR5cGVpbmRleCA8IG5fdHlwZXM7IHR5 cGVpbmRleCsrKQoJCXsKCQkJaWYgKFR5cEluZm9bdHlwZWluZGV4XS5vaWQgPT0gdHlwaWQp CgkJCQlicmVhazsKCQl9CgkJaWYgKHR5cGVpbmRleCA+PSBuX3R5cGVzKQoJCQllbG9nKEVS Uk9SLCAidHlwZSBPSUQgJXUgbm90IGZvdW5kIGluIFR5cEluZm8iLCB0eXBpZCk7CgoJCSp0 eXBsZW4gPSBUeXBJbmZvW3R5cGVpbmRleF0ubGVuOwoJCSp0eXBieXZhbCA9IFR5cEluZm9b dHlwZWluZGV4XS5ieXZhbDsKCQkqdHlwYWxpZ24gPSBUeXBJbmZvW3R5cGVpbmRleF0uYWxp Z247CgkJLyogV2UgYXNzdW1lIHR5cGRlbGltIGlzICcsJyBmb3IgYWxsIGJvb3QtdGltZSB0 eXBlcyAqLwoJCSp0eXBkZWxpbSA9ICcsJzsKCgkJLyogWFhYIHRoaXMgbG9naWMgbXVzdCBt YXRjaCBnZXRUeXBlSU9QYXJhbSgpICovCgkJaWYgKE9pZElzVmFsaWQoVHlwSW5mb1t0eXBl aW5kZXhdLmVsZW0pKQoJCQkqdHlwaW9wYXJhbSA9IFR5cEluZm9bdHlwZWluZGV4XS5lbGVt OwoJCWVsc2UKCQkJKnR5cGlvcGFyYW0gPSB0eXBpZDsKCgkJKnR5cGlucHV0ID0gVHlwSW5m b1t0eXBlaW5kZXhdLmlucHJvYzsKCQkqdHlwb3V0cHV0ID0gVHlwSW5mb1t0eXBlaW5kZXhd Lm91dHByb2M7CgoJCSp0eXBjb2xsYXRpb24gPSBUeXBJbmZvW3R5cGVpbmRleF0uY29sbGF0 aW9uOwoJfQp9CgovKiAtLS0tLS0tLS0tLS0tLS0tCiAqCQlib290X2dldF9yb2xlX29pZAog KgogKiBMb29rIHVwIGEgcm9sZSBuYW1lIGF0IGJvb3RzdHJhcCB0aW1lLiAgVGhpcyBpcyBl cXVpdmFsZW50IHRvCiAqIGdldF9yb2xlX29pZChyb2xuYW1lLCB0cnVlKTogcmV0dXJuIHRo ZSByb2xlIE9JRCBvciBJbnZhbGlkT2lkIGlmCiAqIG5vdCBmb3VuZC4gIFdlIG9ubHkgbmVl ZCB0byBjb3BlIHdpdGggYnVpbHQtaW4gcm9sZSBuYW1lcy4KICogLS0tLS0tLS0tLS0tLS0t LQogKi8KT2lkCmJvb3RfZ2V0X3JvbGVfb2lkKGNvbnN0IGNoYXIgKnJvbG5hbWUpCnsKCWZv ciAoaW50IGkgPSAwOyBpIDwgbGVuZ3Rob2YoUm9sSW5mbyk7IGkrKykKCXsKCQlpZiAoc3Ry Y21wKFJvbEluZm9baV0ucm9sbmFtZSwgcm9sbmFtZSkgPT0gMCkKCQkJcmV0dXJuIFJvbElu Zm9baV0ub2lkOwoJfQoJcmV0dXJuIEludmFsaWRPaWQ7Cn0KCi8qIC0tLS0tLS0tLS0tLS0t LS0KICoJCUFsbG9jYXRlQXR0cmlidXRlCiAqCiAqIE5vdGU6IGJvb3RzdHJhcCBuZXZlciBz ZXRzIGFueSBwZXItY29sdW1uIEFDTHMsIHNvIHdlIG9ubHkgbmVlZAogKiBBVFRSSUJVVEVf RklYRURfUEFSVF9TSVpFIHNwYWNlIHBlciBhdHRyaWJ1dGUuCiAqIC0tLS0tLS0tLS0tLS0t LS0KICovCnN0YXRpYyBGb3JtX3BnX2F0dHJpYnV0ZQpBbGxvY2F0ZUF0dHJpYnV0ZSh2b2lk KQp7CglyZXR1cm4gKEZvcm1fcGdfYXR0cmlidXRlKQoJCU1lbW9yeUNvbnRleHRBbGxvY1pl cm8oVG9wTWVtb3J5Q29udGV4dCwgQVRUUklCVVRFX0ZJWEVEX1BBUlRfU0laRSk7Cn0KCi8q CiAqCWluZGV4X3JlZ2lzdGVyKCkgLS0gcmVjb3JkIGFuIGluZGV4IHRoYXQgaGFzIGJlZW4g c2V0IHVwIGZvciBidWlsZGluZwogKgkJCQkJCWxhdGVyLgogKgogKgkJQXQgYm9vdHN0cmFw IHRpbWUsIHdlIGRlZmluZSBhIGJ1bmNoIG9mIGluZGV4ZXMgb24gc3lzdGVtIGNhdGFsb2dz LgogKgkJV2UgcG9zdHBvbmUgYWN0dWFsbHkgYnVpbGRpbmcgdGhlIGluZGV4ZXMgdW50aWwg anVzdCBiZWZvcmUgd2UncmUKICoJCWZpbmlzaGVkIHdpdGggaW5pdGlhbGl6YXRpb24sIGhv d2V2ZXIuICBUaGlzIGlzIGJlY2F1c2UgdGhlIGluZGV4ZXMKICoJCXRoZW1zZWx2ZXMgaGF2 ZSBjYXRhbG9nIGVudHJpZXMsIGFuZCB0aG9zZSBoYXZlIHRvIGJlIGluY2x1ZGVkIGluIHRo ZQogKgkJaW5kZXhlcyBvbiB0aG9zZSBjYXRhbG9ncy4gIERvaW5nIGl0IGluIHR3byBwaGFz ZXMgaXMgdGhlIHNpbXBsZXN0CiAqCQl3YXkgb2YgbWFraW5nIHN1cmUgdGhlIGluZGV4ZXMg aGF2ZSB0aGUgcmlnaHQgY29udGVudHMgYXQgdGhlIGVuZC4KICovCnZvaWQKaW5kZXhfcmVn aXN0ZXIoT2lkIGhlYXAsCgkJCSAgIE9pZCBpbmQsCgkJCSAgIGNvbnN0IEluZGV4SW5mbyAq aW5kZXhJbmZvKQp7CglJbmRleExpc3QgICpuZXdpbmQ7CglNZW1vcnlDb250ZXh0IG9sZGN4 dDsKCgkvKgoJICogWFhYIG1hbyAxMC8zMS85MiAtLSBkb24ndCBnYyBpbmRleCByZWxkZXNj cywgYXNzb2NpYXRlZCBpbmZvIGF0CgkgKiBib290c3RyYXAgdGltZS4gIHdlJ2xsIGRlY2xh cmUgdGhlIGluZGV4ZXMgbm93LCBidXQgd2FudCB0byBjcmVhdGUgdGhlbQoJICogbGF0ZXIu CgkgKi8KCglpZiAobm9nYyA9PSBOVUxMKQoJCW5vZ2MgPSBBbGxvY1NldENvbnRleHRDcmVh dGUoTlVMTCwKCQkJCQkJCQkJICJCb290c3RyYXBOb0dDIiwKCQkJCQkJCQkJIEFMTE9DU0VU X0RFRkFVTFRfU0laRVMpOwoKCW9sZGN4dCA9IE1lbW9yeUNvbnRleHRTd2l0Y2hUbyhub2dj KTsKCgluZXdpbmQgPSBwYWxsb2Nfb2JqZWN0KEluZGV4TGlzdCk7CgluZXdpbmQtPmlsX2hl YXAgPSBoZWFwOwoJbmV3aW5kLT5pbF9pbmQgPSBpbmQ7CgluZXdpbmQtPmlsX2luZm8gPSBw YWxsb2Nfb2JqZWN0KEluZGV4SW5mbyk7CgoJbWVtY3B5KG5ld2luZC0+aWxfaW5mbywgaW5k ZXhJbmZvLCBzaXplb2YoSW5kZXhJbmZvKSk7CgkvKiBleHByZXNzaW9ucyB3aWxsIGxpa2Vs eSBiZSBudWxsLCBidXQgbWF5IGFzIHdlbGwgY29weSBpdCAqLwoJbmV3aW5kLT5pbF9pbmZv LT5paV9FeHByZXNzaW9ucyA9CgkJY29weU9iamVjdChpbmRleEluZm8tPmlpX0V4cHJlc3Np b25zKTsKCW5ld2luZC0+aWxfaW5mby0+aWlfRXhwcmVzc2lvbnNFeHBhbmQgPQoJCWNvcHlP YmplY3QoaW5kZXhJbmZvLT5paV9FeHByZXNzaW9uc0V4cGFuZCk7CgluZXdpbmQtPmlsX2lu Zm8tPmlpX0V4cHJlc3Npb25zU3RhdGUgPSBOSUw7CgluZXdpbmQtPmlsX2luZm8tPmlpX0V4 cHJlc3Npb25zRXhwYW5kU3RhdGUgPSBOSUw7CgkvKiBwcmVkaWNhdGUgd2lsbCBsaWtlbHkg YmUgbnVsbCwgYnV0IG1heSBhcyB3ZWxsIGNvcHkgaXQgKi8KCW5ld2luZC0+aWxfaW5mby0+ aWlfUHJlZGljYXRlID0KCQljb3B5T2JqZWN0KGluZGV4SW5mby0+aWlfUHJlZGljYXRlKTsK CW5ld2luZC0+aWxfaW5mby0+aWlfUHJlZGljYXRlRXhwYW5kID0KCQljb3B5T2JqZWN0KGlu ZGV4SW5mby0+aWlfUHJlZGljYXRlRXhwYW5kKTsKCW5ld2luZC0+aWxfaW5mby0+aWlfUHJl ZGljYXRlU3RhdGUgPSBOVUxMOwoJbmV3aW5kLT5pbF9pbmZvLT5paV9QcmVkaWNhdGVFeHBh bmRTdGF0ZSA9IE5VTEw7CgkvKiBubyBleGNsdXNpb24gY29uc3RyYWludHMgYXQgYm9vdHN0 cmFwIHRpbWUsIHNvIG5vIG5lZWQgdG8gY29weSAqLwoJQXNzZXJ0KGluZGV4SW5mby0+aWlf RXhjbHVzaW9uT3BzID09IE5VTEwpOwoJQXNzZXJ0KGluZGV4SW5mby0+aWlfRXhjbHVzaW9u UHJvY3MgPT0gTlVMTCk7CglBc3NlcnQoaW5kZXhJbmZvLT5paV9FeGNsdXNpb25TdHJhdHMg PT0gTlVMTCk7CgoJbmV3aW5kLT5pbF9uZXh0ID0gSUxIZWFkOwoJSUxIZWFkID0gbmV3aW5k OwoKCU1lbW9yeUNvbnRleHRTd2l0Y2hUbyhvbGRjeHQpOwp9CgoKLyoKICogYnVpbGRfaW5k aWNlcyAtLSBmaWxsIGluIGFsbCB0aGUgaW5kZXhlcyByZWdpc3RlcmVkIGVhcmxpZXIKICov CnZvaWQKYnVpbGRfaW5kaWNlcyh2b2lkKQp7Cglmb3IgKDsgSUxIZWFkICE9IE5VTEw7IElM SGVhZCA9IElMSGVhZC0+aWxfbmV4dCkKCXsKCQlSZWxhdGlvbgloZWFwOwoJCVJlbGF0aW9u CWluZDsKCgkJLyogbmVlZCBub3QgYm90aGVyIHdpdGggbG9ja3MgZHVyaW5nIGJvb3RzdHJh cCAqLwoJCWhlYXAgPSB0YWJsZV9vcGVuKElMSGVhZC0+aWxfaGVhcCwgTm9Mb2NrKTsKCQlp bmQgPSBpbmRleF9vcGVuKElMSGVhZC0+aWxfaW5kLCBOb0xvY2spOwoKCQlpbmRleF9idWls ZChoZWFwLCBpbmQsIElMSGVhZC0+aWxfaW5mbywgZmFsc2UsIGZhbHNlLCBmYWxzZSk7CgoJ CWluZGV4X2Nsb3NlKGluZCwgTm9Mb2NrKTsKCQl0YWJsZV9jbG9zZShoZWFwLCBOb0xvY2sp OwoJfQp9CgAAAAAAAAAAAC4vY3JlYXRlcGxhbi5jAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAwMDAwNjY0ADAwMDE3NTAAMDAwMTc1MAAwMDAwMDY2NjUzMQAxNTIyMTczMDMx MwAwMTIyMDUAIDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAdXN0YXIgIAB4bWFuAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHhtYW4AAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALyotLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tCiAqCiAqIGNyZWF0ZXBsYW4uYwogKgkgIFJvdXRpbmVzIHRvIGNyZWF0ZSB0 aGUgZGVzaXJlZCBwbGFuIGZvciBwcm9jZXNzaW5nIGEgcXVlcnkuCiAqCSAgUGxhbm5pbmcg aXMgY29tcGxldGUsIHdlIGp1c3QgbmVlZCB0byBjb252ZXJ0IHRoZSBzZWxlY3RlZAogKgkg IFBhdGggaW50byBhIFBsYW4uCiAqCiAqIFBvcnRpb25zIENvcHlyaWdodCAoYykgMTk5Ni0y MDI2LCBQb3N0Z3JlU1FMIEdsb2JhbCBEZXZlbG9wbWVudCBHcm91cAogKiBQb3J0aW9ucyBD b3B5cmlnaHQgKGMpIDE5OTQsIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZv cm5pYQogKgogKgogKiBJREVOVElGSUNBVElPTgogKgkgIHNyYy9iYWNrZW5kL29wdGltaXpl ci9wbGFuL2NyZWF0ZXBsYW4uYwogKgogKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICovCiNpbmNs dWRlICJwb3N0Z3Jlcy5oIgoKI2luY2x1ZGUgImFjY2Vzcy9zeXNhdHRyLmgiCiNpbmNsdWRl ICJhY2Nlc3MvdHJhbnNhbS5oIgojaW5jbHVkZSAiY2F0YWxvZy9wZ19jbGFzcy5oIgojaW5j bHVkZSAiZm9yZWlnbi9mZHdhcGkuaCIKI2luY2x1ZGUgIm1pc2NhZG1pbi5oIgojaW5jbHVk ZSAibm9kZXMvZXh0ZW5zaWJsZS5oIgojaW5jbHVkZSAibm9kZXMvbWFrZWZ1bmNzLmgiCiNp bmNsdWRlICJub2Rlcy9ub2RlRnVuY3MuaCIKI2luY2x1ZGUgIm9wdGltaXplci9jbGF1c2Vz LmgiCiNpbmNsdWRlICJvcHRpbWl6ZXIvY29zdC5oIgojaW5jbHVkZSAib3B0aW1pemVyL29w dGltaXplci5oIgojaW5jbHVkZSAib3B0aW1pemVyL3BhcmFtYXNzaWduLmgiCiNpbmNsdWRl ICJvcHRpbWl6ZXIvcGF0aG5vZGUuaCIKI2luY2x1ZGUgIm9wdGltaXplci9wYXRocy5oIgoj aW5jbHVkZSAib3B0aW1pemVyL3BsYWNlaG9sZGVyLmgiCiNpbmNsdWRlICJvcHRpbWl6ZXIv cGxhbmNhdC5oIgojaW5jbHVkZSAib3B0aW1pemVyL3BsYW5tYWluLmgiCiNpbmNsdWRlICJv cHRpbWl6ZXIvcHJlcC5oIgojaW5jbHVkZSAib3B0aW1pemVyL3Jlc3RyaWN0aW5mby5oIgoj aW5jbHVkZSAib3B0aW1pemVyL3N1YnNlbGVjdC5oIgojaW5jbHVkZSAib3B0aW1pemVyL3Rs aXN0LmgiCiNpbmNsdWRlICJwYXJzZXIvcGFyc2VfY2xhdXNlLmgiCiNpbmNsdWRlICJwYXJz ZXIvcGFyc2V0cmVlLmgiCiNpbmNsdWRlICJwYXJ0aXRpb25pbmcvcGFydHBydW5lLmgiCiNp bmNsdWRlICJ0Y29wL3Rjb3Bwcm90LmgiCiNpbmNsdWRlICJ1dGlscy9sc3lzY2FjaGUuaCIK CgovKgogKiBGbGFnIGJpdHMgdGhhdCBjYW4gYXBwZWFyIGluIHRoZSBmbGFncyBhcmd1bWVu dCBvZiBjcmVhdGVfcGxhbl9yZWN1cnNlKCkuCiAqIFRoZXNlIGNhbiBiZSBPUi1lZCB0b2dl dGhlci4KICoKICogQ1BfRVhBQ1RfVExJU1Qgc3BlY2lmaWVzIHRoYXQgdGhlIGdlbmVyYXRl ZCBwbGFuIG5vZGUgbXVzdCByZXR1cm4gZXhhY3RseQogKiB0aGUgdGxpc3Qgc3BlY2lmaWVk IGJ5IHRoZSBwYXRoJ3MgcGF0aHRhcmdldCAodGhpcyBvdmVycmlkZXMgYm90aAogKiBDUF9T TUFMTF9UTElTVCBhbmQgQ1BfTEFCRUxfVExJU1QsIGlmIHRob3NlIGFyZSBzZXQpLiAgT3Ro ZXJ3aXNlLCB0aGUKICogcGxhbiBub2RlIGlzIGFsbG93ZWQgdG8gcmV0dXJuIGp1c3QgdGhl IFZhcnMgYW5kIFBsYWNlSG9sZGVyVmFycyBuZWVkZWQKICogdG8gZXZhbHVhdGUgdGhlIHBh dGh0YXJnZXQuCiAqCiAqIENQX1NNQUxMX1RMSVNUIHNwZWNpZmllcyB0aGF0IGEgbmFycm93 ZXIgdGxpc3QgaXMgcHJlZmVycmVkLiAgVGhpcyBpcwogKiBwYXNzZWQgZG93biBieSBwYXJl bnQgbm9kZXMgc3VjaCBhcyBTb3J0IGFuZCBIYXNoLCB3aGljaCB3aWxsIGhhdmUgdG8KICog c3RvcmUgdGhlIHJldHVybmVkIHR1cGxlcy4KICoKICogQ1BfTEFCRUxfVExJU1Qgc3BlY2lm aWVzIHRoYXQgdGhlIHBsYW4gbm9kZSBtdXN0IHJldHVybiBjb2x1bW5zIG1hdGNoaW5nCiAq IGFueSBzb3J0Z3JvdXByZWZzIHNwZWNpZmllZCBpbiBpdHMgcGF0aHRhcmdldCwgd2l0aCBh cHByb3ByaWF0ZQogKiByZXNzb3J0Z3JvdXByZWYgbGFiZWxzLiAgVGhpcyBpcyBwYXNzZWQg ZG93biBieSBwYXJlbnQgbm9kZXMgc3VjaCBhcyBTb3J0CiAqIGFuZCBHcm91cCwgd2hpY2gg bmVlZCB0aGVzZSB2YWx1ZXMgdG8gYmUgYXZhaWxhYmxlIGluIHRoZWlyIGlucHV0cy4KICoK ICogQ1BfSUdOT1JFX1RMSVNUIHNwZWNpZmllcyB0aGF0IHRoZSBjYWxsZXIgcGxhbnMgdG8g cmVwbGFjZSB0aGUgdGFyZ2V0bGlzdCwKICogYW5kIHRoZXJlZm9yZSBpdCBkb2Vzbid0IG1h dHRlciBhIGJpdCB3aGF0IHRhcmdldCBsaXN0IGdldHMgZ2VuZXJhdGVkLgogKi8KI2RlZmlu ZSBDUF9FWEFDVF9UTElTVAkJMHgwMDAxCS8qIFBsYW4gbXVzdCByZXR1cm4gc3BlY2lmaWVk IHRsaXN0ICovCiNkZWZpbmUgQ1BfU01BTExfVExJU1QJCTB4MDAwMgkvKiBQcmVmZXIgbmFy cm93ZXIgdGxpc3RzICovCiNkZWZpbmUgQ1BfTEFCRUxfVExJU1QJCTB4MDAwNAkvKiB0bGlz dCBtdXN0IGNvbnRhaW4gc29ydGdyb3VwcmVmcyAqLwojZGVmaW5lIENQX0lHTk9SRV9UTElT VAkJMHgwMDA4CS8qIGNhbGxlciB3aWxsIHJlcGxhY2UgdGxpc3QgKi8KCgpzdGF0aWMgUGxh biAqY3JlYXRlX3BsYW5fcmVjdXJzZShQbGFubmVySW5mbyAqcm9vdCwgUGF0aCAqYmVzdF9w YXRoLAoJCQkJCQkJCSBpbnQgZmxhZ3MpOwpzdGF0aWMgUGxhbiAqY3JlYXRlX3NjYW5fcGxh bihQbGFubmVySW5mbyAqcm9vdCwgUGF0aCAqYmVzdF9wYXRoLAoJCQkJCQkJICBpbnQgZmxh Z3MpOwpzdGF0aWMgTGlzdCAqYnVpbGRfcGF0aF90bGlzdChQbGFubmVySW5mbyAqcm9vdCwg UGF0aCAqcGF0aCk7CnN0YXRpYyBib29sIHVzZV9waHlzaWNhbF90bGlzdChQbGFubmVySW5m byAqcm9vdCwgUGF0aCAqcGF0aCwgaW50IGZsYWdzKTsKc3RhdGljIExpc3QgKmdldF9nYXRp bmdfcXVhbHMoUGxhbm5lckluZm8gKnJvb3QsIExpc3QgKnF1YWxzKTsKc3RhdGljIFBsYW4g KmNyZWF0ZV9nYXRpbmdfcGxhbihQbGFubmVySW5mbyAqcm9vdCwgUGF0aCAqcGF0aCwgUGxh biAqcGxhbiwKCQkJCQkJCQlMaXN0ICpnYXRpbmdfcXVhbHMpOwpzdGF0aWMgUGxhbiAqY3Jl YXRlX2pvaW5fcGxhbihQbGFubmVySW5mbyAqcm9vdCwgSm9pblBhdGggKmJlc3RfcGF0aCk7 CnN0YXRpYyBib29sIG1hcmtfYXN5bmNfY2FwYWJsZV9wbGFuKFBsYW4gKnBsYW4sIFBhdGgg KnBhdGgpOwpzdGF0aWMgUGxhbiAqY3JlYXRlX2FwcGVuZF9wbGFuKFBsYW5uZXJJbmZvICpy b290LCBBcHBlbmRQYXRoICpiZXN0X3BhdGgsCgkJCQkJCQkJaW50IGZsYWdzKTsKc3RhdGlj IFBsYW4gKmNyZWF0ZV9tZXJnZV9hcHBlbmRfcGxhbihQbGFubmVySW5mbyAqcm9vdCwgTWVy Z2VBcHBlbmRQYXRoICpiZXN0X3BhdGgsCgkJCQkJCQkJCSAgaW50IGZsYWdzKTsKc3RhdGlj IFJlc3VsdCAqY3JlYXRlX2dyb3VwX3Jlc3VsdF9wbGFuKFBsYW5uZXJJbmZvICpyb290LAoJ CQkJCQkJCQkJR3JvdXBSZXN1bHRQYXRoICpiZXN0X3BhdGgpOwpzdGF0aWMgUHJvamVjdFNl dCAqY3JlYXRlX3Byb2plY3Rfc2V0X3BsYW4oUGxhbm5lckluZm8gKnJvb3QsIFByb2plY3RT ZXRQYXRoICpiZXN0X3BhdGgpOwpzdGF0aWMgTWF0ZXJpYWwgKmNyZWF0ZV9tYXRlcmlhbF9w bGFuKFBsYW5uZXJJbmZvICpyb290LCBNYXRlcmlhbFBhdGggKmJlc3RfcGF0aCwKCQkJCQkJ CQkJICBpbnQgZmxhZ3MpOwpzdGF0aWMgTWVtb2l6ZSAqY3JlYXRlX21lbW9pemVfcGxhbihQ bGFubmVySW5mbyAqcm9vdCwgTWVtb2l6ZVBhdGggKmJlc3RfcGF0aCwKCQkJCQkJCQkJaW50 IGZsYWdzKTsKc3RhdGljIEdhdGhlciAqY3JlYXRlX2dhdGhlcl9wbGFuKFBsYW5uZXJJbmZv ICpyb290LCBHYXRoZXJQYXRoICpiZXN0X3BhdGgpOwpzdGF0aWMgUGxhbiAqY3JlYXRlX3By b2plY3Rpb25fcGxhbihQbGFubmVySW5mbyAqcm9vdCwKCQkJCQkJCQkJUHJvamVjdGlvblBh dGggKmJlc3RfcGF0aCwKCQkJCQkJCQkJaW50IGZsYWdzKTsKc3RhdGljIFBsYW4gKmluamVj dF9wcm9qZWN0aW9uX3BsYW4oUGxhbiAqc3VicGxhbiwgTGlzdCAqdGxpc3QsCgkJCQkJCQkJ CWJvb2wgcGFyYWxsZWxfc2FmZSk7CnN0YXRpYyBTb3J0ICpjcmVhdGVfc29ydF9wbGFuKFBs YW5uZXJJbmZvICpyb290LCBTb3J0UGF0aCAqYmVzdF9wYXRoLCBpbnQgZmxhZ3MpOwpzdGF0 aWMgSW5jcmVtZW50YWxTb3J0ICpjcmVhdGVfaW5jcmVtZW50YWxzb3J0X3BsYW4oUGxhbm5l ckluZm8gKnJvb3QsCgkJCQkJCQkJCQkJCQlJbmNyZW1lbnRhbFNvcnRQYXRoICpiZXN0X3Bh dGgsIGludCBmbGFncyk7CnN0YXRpYyBHcm91cCAqY3JlYXRlX2dyb3VwX3BsYW4oUGxhbm5l ckluZm8gKnJvb3QsIEdyb3VwUGF0aCAqYmVzdF9wYXRoKTsKc3RhdGljIFVuaXF1ZSAqY3Jl YXRlX3VuaXF1ZV9wbGFuKFBsYW5uZXJJbmZvICpyb290LCBVbmlxdWVQYXRoICpiZXN0X3Bh dGgsIGludCBmbGFncyk7CnN0YXRpYyBBZ2cgKmNyZWF0ZV9hZ2dfcGxhbihQbGFubmVySW5m byAqcm9vdCwgQWdnUGF0aCAqYmVzdF9wYXRoKTsKc3RhdGljIFBsYW4gKmNyZWF0ZV9ncm91 cGluZ3NldHNfcGxhbihQbGFubmVySW5mbyAqcm9vdCwgR3JvdXBpbmdTZXRzUGF0aCAqYmVz dF9wYXRoKTsKc3RhdGljIFJlc3VsdCAqY3JlYXRlX21pbm1heGFnZ19wbGFuKFBsYW5uZXJJ bmZvICpyb290LCBNaW5NYXhBZ2dQYXRoICpiZXN0X3BhdGgpOwpzdGF0aWMgV2luZG93QWdn ICpjcmVhdGVfd2luZG93YWdnX3BsYW4oUGxhbm5lckluZm8gKnJvb3QsIFdpbmRvd0FnZ1Bh dGggKmJlc3RfcGF0aCk7CnN0YXRpYyBTZXRPcCAqY3JlYXRlX3NldG9wX3BsYW4oUGxhbm5l ckluZm8gKnJvb3QsIFNldE9wUGF0aCAqYmVzdF9wYXRoLAoJCQkJCQkJCWludCBmbGFncyk7 CnN0YXRpYyBSZWN1cnNpdmVVbmlvbiAqY3JlYXRlX3JlY3Vyc2l2ZXVuaW9uX3BsYW4oUGxh bm5lckluZm8gKnJvb3QsIFJlY3Vyc2l2ZVVuaW9uUGF0aCAqYmVzdF9wYXRoKTsKc3RhdGlj IExvY2tSb3dzICpjcmVhdGVfbG9ja3Jvd3NfcGxhbihQbGFubmVySW5mbyAqcm9vdCwgTG9j a1Jvd3NQYXRoICpiZXN0X3BhdGgsCgkJCQkJCQkJCSAgaW50IGZsYWdzKTsKc3RhdGljIE1v ZGlmeVRhYmxlICpjcmVhdGVfbW9kaWZ5dGFibGVfcGxhbihQbGFubmVySW5mbyAqcm9vdCwg TW9kaWZ5VGFibGVQYXRoICpiZXN0X3BhdGgpOwpzdGF0aWMgTGltaXQgKmNyZWF0ZV9saW1p dF9wbGFuKFBsYW5uZXJJbmZvICpyb290LCBMaW1pdFBhdGggKmJlc3RfcGF0aCwKCQkJCQkJ CQlpbnQgZmxhZ3MpOwpzdGF0aWMgU2VxU2NhbiAqY3JlYXRlX3NlcXNjYW5fcGxhbihQbGFu bmVySW5mbyAqcm9vdCwgUGF0aCAqYmVzdF9wYXRoLAoJCQkJCQkJCQlMaXN0ICp0bGlzdCwg TGlzdCAqc2Nhbl9jbGF1c2VzKTsKc3RhdGljIFNhbXBsZVNjYW4gKmNyZWF0ZV9zYW1wbGVz Y2FuX3BsYW4oUGxhbm5lckluZm8gKnJvb3QsIFBhdGggKmJlc3RfcGF0aCwKCQkJCQkJCQkJ CSAgTGlzdCAqdGxpc3QsIExpc3QgKnNjYW5fY2xhdXNlcyk7CnN0YXRpYyBTY2FuICpjcmVh dGVfaW5kZXhzY2FuX3BsYW4oUGxhbm5lckluZm8gKnJvb3QsIEluZGV4UGF0aCAqYmVzdF9w YXRoLAoJCQkJCQkJCSAgIExpc3QgKnRsaXN0LCBMaXN0ICpzY2FuX2NsYXVzZXMsIGJvb2wg aW5kZXhvbmx5KTsKc3RhdGljIEJpdG1hcEhlYXBTY2FuICpjcmVhdGVfYml0bWFwX3NjYW5f cGxhbihQbGFubmVySW5mbyAqcm9vdCwKCQkJCQkJCQkJCQkgICBCaXRtYXBIZWFwUGF0aCAq YmVzdF9wYXRoLAoJCQkJCQkJCQkJCSAgIExpc3QgKnRsaXN0LCBMaXN0ICpzY2FuX2NsYXVz ZXMpOwpzdGF0aWMgUGxhbiAqY3JlYXRlX2JpdG1hcF9zdWJwbGFuKFBsYW5uZXJJbmZvICpy b290LCBQYXRoICpiaXRtYXBxdWFsLAoJCQkJCQkJCSAgIExpc3QgKipxdWFsLCBMaXN0ICoq aW5kZXhxdWFsLCBMaXN0ICoqaW5kZXhFQ3MpOwpzdGF0aWMgdm9pZCBiaXRtYXBfc3VicGxh bl9tYXJrX3NoYXJlZChQbGFuICpwbGFuKTsKc3RhdGljIFRpZFNjYW4gKmNyZWF0ZV90aWRz Y2FuX3BsYW4oUGxhbm5lckluZm8gKnJvb3QsIFRpZFBhdGggKmJlc3RfcGF0aCwKCQkJCQkJ CQkJTGlzdCAqdGxpc3QsIExpc3QgKnNjYW5fY2xhdXNlcyk7CnN0YXRpYyBUaWRSYW5nZVNj YW4gKmNyZWF0ZV90aWRyYW5nZXNjYW5fcGxhbihQbGFubmVySW5mbyAqcm9vdCwKCQkJCQkJ CQkJCQkgIFRpZFJhbmdlUGF0aCAqYmVzdF9wYXRoLAoJCQkJCQkJCQkJCSAgTGlzdCAqdGxp c3QsCgkJCQkJCQkJCQkJICBMaXN0ICpzY2FuX2NsYXVzZXMpOwpzdGF0aWMgU3VicXVlcnlT Y2FuICpjcmVhdGVfc3VicXVlcnlzY2FuX3BsYW4oUGxhbm5lckluZm8gKnJvb3QsCgkJCQkJ CQkJCQkJICBTdWJxdWVyeVNjYW5QYXRoICpiZXN0X3BhdGgsCgkJCQkJCQkJCQkJICBMaXN0 ICp0bGlzdCwgTGlzdCAqc2Nhbl9jbGF1c2VzKTsKc3RhdGljIEZ1bmN0aW9uU2NhbiAqY3Jl YXRlX2Z1bmN0aW9uc2Nhbl9wbGFuKFBsYW5uZXJJbmZvICpyb290LCBQYXRoICpiZXN0X3Bh dGgsCgkJCQkJCQkJCQkJICBMaXN0ICp0bGlzdCwgTGlzdCAqc2Nhbl9jbGF1c2VzKTsKc3Rh dGljIFZhbHVlc1NjYW4gKmNyZWF0ZV92YWx1ZXNzY2FuX3BsYW4oUGxhbm5lckluZm8gKnJv b3QsIFBhdGggKmJlc3RfcGF0aCwKCQkJCQkJCQkJCSAgTGlzdCAqdGxpc3QsIExpc3QgKnNj YW5fY2xhdXNlcyk7CnN0YXRpYyBUYWJsZUZ1bmNTY2FuICpjcmVhdGVfdGFibGVmdW5jc2Nh bl9wbGFuKFBsYW5uZXJJbmZvICpyb290LCBQYXRoICpiZXN0X3BhdGgsCgkJCQkJCQkJCQkJ CUxpc3QgKnRsaXN0LCBMaXN0ICpzY2FuX2NsYXVzZXMpOwpzdGF0aWMgQ3RlU2NhbiAqY3Jl YXRlX2N0ZXNjYW5fcGxhbihQbGFubmVySW5mbyAqcm9vdCwgUGF0aCAqYmVzdF9wYXRoLAoJ CQkJCQkJCQlMaXN0ICp0bGlzdCwgTGlzdCAqc2Nhbl9jbGF1c2VzKTsKc3RhdGljIE5hbWVk VHVwbGVzdG9yZVNjYW4gKmNyZWF0ZV9uYW1lZHR1cGxlc3RvcmVzY2FuX3BsYW4oUGxhbm5l ckluZm8gKnJvb3QsCgkJCQkJCQkJCQkJCQkJCVBhdGggKmJlc3RfcGF0aCwgTGlzdCAqdGxp c3QsIExpc3QgKnNjYW5fY2xhdXNlcyk7CnN0YXRpYyBSZXN1bHQgKmNyZWF0ZV9yZXN1bHRz Y2FuX3BsYW4oUGxhbm5lckluZm8gKnJvb3QsIFBhdGggKmJlc3RfcGF0aCwKCQkJCQkJCQkJ ICBMaXN0ICp0bGlzdCwgTGlzdCAqc2Nhbl9jbGF1c2VzKTsKc3RhdGljIFdvcmtUYWJsZVNj YW4gKmNyZWF0ZV93b3JrdGFibGVzY2FuX3BsYW4oUGxhbm5lckluZm8gKnJvb3QsIFBhdGgg KmJlc3RfcGF0aCwKCQkJCQkJCQkJCQkJTGlzdCAqdGxpc3QsIExpc3QgKnNjYW5fY2xhdXNl cyk7CnN0YXRpYyBGb3JlaWduU2NhbiAqY3JlYXRlX2ZvcmVpZ25zY2FuX3BsYW4oUGxhbm5l ckluZm8gKnJvb3QsIEZvcmVpZ25QYXRoICpiZXN0X3BhdGgsCgkJCQkJCQkJCQkJTGlzdCAq dGxpc3QsIExpc3QgKnNjYW5fY2xhdXNlcyk7CnN0YXRpYyBDdXN0b21TY2FuICpjcmVhdGVf Y3VzdG9tc2Nhbl9wbGFuKFBsYW5uZXJJbmZvICpyb290LAoJCQkJCQkJCQkJICBDdXN0b21Q YXRoICpiZXN0X3BhdGgsCgkJCQkJCQkJCQkgIExpc3QgKnRsaXN0LCBMaXN0ICpzY2FuX2Ns YXVzZXMpOwpzdGF0aWMgTmVzdExvb3AgKmNyZWF0ZV9uZXN0bG9vcF9wbGFuKFBsYW5uZXJJ bmZvICpyb290LCBOZXN0UGF0aCAqYmVzdF9wYXRoKTsKc3RhdGljIE1lcmdlSm9pbiAqY3Jl YXRlX21lcmdlam9pbl9wbGFuKFBsYW5uZXJJbmZvICpyb290LCBNZXJnZVBhdGggKmJlc3Rf cGF0aCk7CnN0YXRpYyBIYXNoSm9pbiAqY3JlYXRlX2hhc2hqb2luX3BsYW4oUGxhbm5lcklu Zm8gKnJvb3QsIEhhc2hQYXRoICpiZXN0X3BhdGgpOwpzdGF0aWMgTm9kZSAqcmVwbGFjZV9u ZXN0bG9vcF9wYXJhbXMoUGxhbm5lckluZm8gKnJvb3QsIE5vZGUgKmV4cHIpOwpzdGF0aWMg Tm9kZSAqcmVwbGFjZV9uZXN0bG9vcF9wYXJhbXNfbXV0YXRvcihOb2RlICpub2RlLCBQbGFu bmVySW5mbyAqcm9vdCk7CnN0YXRpYyB2b2lkIGZpeF9pbmRleHF1YWxfcmVmZXJlbmNlcyhQ bGFubmVySW5mbyAqcm9vdCwgSW5kZXhQYXRoICppbmRleF9wYXRoLAoJCQkJCQkJCQkgTGlz dCAqKnN0cmlwcGVkX2luZGV4cXVhbHNfcCwKCQkJCQkJCQkJIExpc3QgKipmaXhlZF9pbmRl eHF1YWxzX3ApOwpzdGF0aWMgTGlzdCAqZml4X2luZGV4b3JkZXJieV9yZWZlcmVuY2VzKFBs YW5uZXJJbmZvICpyb290LCBJbmRleFBhdGggKmluZGV4X3BhdGgpOwpzdGF0aWMgTm9kZSAq Zml4X2luZGV4cXVhbF9jbGF1c2UoUGxhbm5lckluZm8gKnJvb3QsCgkJCQkJCQkJICBJbmRl eE9wdEluZm8gKmluZGV4LCBpbnQgaW5kZXhjb2wsCgkJCQkJCQkJICBOb2RlICpjbGF1c2Us IExpc3QgKmluZGV4Y29sbm9zKTsKc3RhdGljIE5vZGUgKmZpeF9pbmRleHF1YWxfb3BlcmFu ZChOb2RlICpub2RlLCBJbmRleE9wdEluZm8gKmluZGV4LCBpbnQgaW5kZXhjb2wpOwpzdGF0 aWMgTGlzdCAqZ2V0X3N3aXRjaGVkX2NsYXVzZXMoTGlzdCAqY2xhdXNlcywgUmVsaWRzIG91 dGVycmVsaWRzKTsKc3RhdGljIExpc3QgKm9yZGVyX3F1YWxfY2xhdXNlcyhQbGFubmVySW5m byAqcm9vdCwgTGlzdCAqY2xhdXNlcyk7CnN0YXRpYyB2b2lkIGNvcHlfZ2VuZXJpY19wYXRo X2luZm8oUGxhbiAqZGVzdCwgUGF0aCAqc3JjKTsKc3RhdGljIHZvaWQgY29weV9wbGFuX2Nv c3RzaXplKFBsYW4gKmRlc3QsIFBsYW4gKnNyYyk7CnN0YXRpYyB2b2lkIGxhYmVsX3NvcnRf d2l0aF9jb3N0c2l6ZShQbGFubmVySW5mbyAqcm9vdCwgU29ydCAqcGxhbiwKCQkJCQkJCQkJ IGRvdWJsZSBsaW1pdF90dXBsZXMpOwpzdGF0aWMgdm9pZCBsYWJlbF9pbmNyZW1lbnRhbHNv cnRfd2l0aF9jb3N0c2l6ZShQbGFubmVySW5mbyAqcm9vdCwgSW5jcmVtZW50YWxTb3J0ICpw bGFuLAoJCQkJCQkJCQkJCQlMaXN0ICpwYXRoa2V5cywgZG91YmxlIGxpbWl0X3R1cGxlcyk7 CnN0YXRpYyBTZXFTY2FuICptYWtlX3NlcXNjYW4oTGlzdCAqcXB0bGlzdCwgTGlzdCAqcXBx dWFsLCBJbmRleCBzY2FucmVsaWQpOwpzdGF0aWMgU2FtcGxlU2NhbiAqbWFrZV9zYW1wbGVz Y2FuKExpc3QgKnFwdGxpc3QsIExpc3QgKnFwcXVhbCwgSW5kZXggc2NhbnJlbGlkLAoJCQkJ CQkJCSAgIFRhYmxlU2FtcGxlQ2xhdXNlICp0c2MpOwpzdGF0aWMgSW5kZXhTY2FuICptYWtl X2luZGV4c2NhbihMaXN0ICpxcHRsaXN0LCBMaXN0ICpxcHF1YWwsIEluZGV4IHNjYW5yZWxp ZCwKCQkJCQkJCQkgT2lkIGluZGV4aWQsIExpc3QgKmluZGV4cXVhbCwgTGlzdCAqaW5kZXhx dWFsb3JpZywKCQkJCQkJCQkgTGlzdCAqaW5kZXhvcmRlcmJ5LCBMaXN0ICppbmRleG9yZGVy YnlvcmlnLAoJCQkJCQkJCSBMaXN0ICppbmRleG9yZGVyYnlvcHMsCgkJCQkJCQkJIFNjYW5E aXJlY3Rpb24gaW5kZXhzY2FuZGlyKTsKc3RhdGljIEluZGV4T25seVNjYW4gKm1ha2VfaW5k ZXhvbmx5c2NhbihMaXN0ICpxcHRsaXN0LCBMaXN0ICpxcHF1YWwsCgkJCQkJCQkJCQkgSW5k ZXggc2NhbnJlbGlkLCBPaWQgaW5kZXhpZCwKCQkJCQkJCQkJCSBMaXN0ICppbmRleHF1YWws IExpc3QgKnJlY2hlY2txdWFsLAoJCQkJCQkJCQkJIExpc3QgKmluZGV4b3JkZXJieSwKCQkJ CQkJCQkJCSBMaXN0ICppbmRleHRsaXN0LAoJCQkJCQkJCQkJIFNjYW5EaXJlY3Rpb24gaW5k ZXhzY2FuZGlyKTsKc3RhdGljIEJpdG1hcEluZGV4U2NhbiAqbWFrZV9iaXRtYXBfaW5kZXhz Y2FuKEluZGV4IHNjYW5yZWxpZCwgT2lkIGluZGV4aWQsCgkJCQkJCQkJCQkJICBMaXN0ICpp bmRleHF1YWwsCgkJCQkJCQkJCQkJICBMaXN0ICppbmRleHF1YWxvcmlnKTsKc3RhdGljIEJp dG1hcEhlYXBTY2FuICptYWtlX2JpdG1hcF9oZWFwc2NhbihMaXN0ICpxcHRsaXN0LAoJCQkJ CQkJCQkJCUxpc3QgKnFwcXVhbCwKCQkJCQkJCQkJCQlQbGFuICpsZWZ0dHJlZSwKCQkJCQkJ CQkJCQlMaXN0ICpiaXRtYXBxdWFsb3JpZywKCQkJCQkJCQkJCQlJbmRleCBzY2FucmVsaWQp OwpzdGF0aWMgVGlkU2NhbiAqbWFrZV90aWRzY2FuKExpc3QgKnFwdGxpc3QsIExpc3QgKnFw cXVhbCwgSW5kZXggc2NhbnJlbGlkLAoJCQkJCQkJIExpc3QgKnRpZHF1YWxzKTsKc3RhdGlj IFRpZFJhbmdlU2NhbiAqbWFrZV90aWRyYW5nZXNjYW4oTGlzdCAqcXB0bGlzdCwgTGlzdCAq cXBxdWFsLAoJCQkJCQkJCQkgICBJbmRleCBzY2FucmVsaWQsIExpc3QgKnRpZHJhbmdlcXVh bHMpOwpzdGF0aWMgU3VicXVlcnlTY2FuICptYWtlX3N1YnF1ZXJ5c2NhbihMaXN0ICpxcHRs aXN0LAoJCQkJCQkJCQkgICBMaXN0ICpxcHF1YWwsCgkJCQkJCQkJCSAgIEluZGV4IHNjYW5y ZWxpZCwKCQkJCQkJCQkJICAgUGxhbiAqc3VicGxhbik7CnN0YXRpYyBGdW5jdGlvblNjYW4g Km1ha2VfZnVuY3Rpb25zY2FuKExpc3QgKnFwdGxpc3QsIExpc3QgKnFwcXVhbCwKCQkJCQkJ CQkJICAgSW5kZXggc2NhbnJlbGlkLCBMaXN0ICpmdW5jdGlvbnMsIGJvb2wgZnVuY29yZGlu YWxpdHkpOwpzdGF0aWMgVmFsdWVzU2NhbiAqbWFrZV92YWx1ZXNzY2FuKExpc3QgKnFwdGxp c3QsIExpc3QgKnFwcXVhbCwKCQkJCQkJCQkgICBJbmRleCBzY2FucmVsaWQsIExpc3QgKnZh bHVlc19saXN0cyk7CnN0YXRpYyBUYWJsZUZ1bmNTY2FuICptYWtlX3RhYmxlZnVuY3NjYW4o TGlzdCAqcXB0bGlzdCwgTGlzdCAqcXBxdWFsLAoJCQkJCQkJCQkJIEluZGV4IHNjYW5yZWxp ZCwgVGFibGVGdW5jICp0YWJsZWZ1bmMpOwpzdGF0aWMgQ3RlU2NhbiAqbWFrZV9jdGVzY2Fu KExpc3QgKnFwdGxpc3QsIExpc3QgKnFwcXVhbCwKCQkJCQkJCSBJbmRleCBzY2FucmVsaWQs IGludCBjdGVQbGFuSWQsIGludCBjdGVQYXJhbSk7CnN0YXRpYyBOYW1lZFR1cGxlc3RvcmVT Y2FuICptYWtlX25hbWVkdHVwbGVzdG9yZXNjYW4oTGlzdCAqcXB0bGlzdCwgTGlzdCAqcXBx dWFsLAoJCQkJCQkJCQkJCQkJIEluZGV4IHNjYW5yZWxpZCwgY2hhciAqZW5ybmFtZSk7CnN0 YXRpYyBXb3JrVGFibGVTY2FuICptYWtlX3dvcmt0YWJsZXNjYW4oTGlzdCAqcXB0bGlzdCwg TGlzdCAqcXBxdWFsLAoJCQkJCQkJCQkJIEluZGV4IHNjYW5yZWxpZCwgaW50IHd0UGFyYW0p OwpzdGF0aWMgUmVjdXJzaXZlVW5pb24gKm1ha2VfcmVjdXJzaXZlX3VuaW9uKExpc3QgKnRs aXN0LAoJCQkJCQkJCQkJCVBsYW4gKmxlZnR0cmVlLAoJCQkJCQkJCQkJCVBsYW4gKnJpZ2h0 dHJlZSwKCQkJCQkJCQkJCQlpbnQgd3RQYXJhbSwKCQkJCQkJCQkJCQlMaXN0ICpkaXN0aW5j dExpc3QsCgkJCQkJCQkJCQkJQ2FyZGluYWxpdHkgbnVtR3JvdXBzKTsKc3RhdGljIEJpdG1h cEFuZCAqbWFrZV9iaXRtYXBfYW5kKExpc3QgKmJpdG1hcHBsYW5zKTsKc3RhdGljIEJpdG1h cE9yICptYWtlX2JpdG1hcF9vcihMaXN0ICpiaXRtYXBwbGFucyk7CnN0YXRpYyBOZXN0TG9v cCAqbWFrZV9uZXN0bG9vcChMaXN0ICp0bGlzdCwKCQkJCQkJCSAgIExpc3QgKmpvaW5jbGF1 c2VzLCBMaXN0ICpvdGhlcmNsYXVzZXMsIExpc3QgKm5lc3RQYXJhbXMsCgkJCQkJCQkgICBQ bGFuICpsZWZ0dHJlZSwgUGxhbiAqcmlnaHR0cmVlLAoJCQkJCQkJICAgSm9pblR5cGUgam9p bnR5cGUsIGJvb2wgaW5uZXJfdW5pcXVlKTsKc3RhdGljIEhhc2hKb2luICptYWtlX2hhc2hq b2luKExpc3QgKnRsaXN0LAoJCQkJCQkJICAgTGlzdCAqam9pbmNsYXVzZXMsIExpc3QgKm90 aGVyY2xhdXNlcywKCQkJCQkJCSAgIExpc3QgKmhhc2hjbGF1c2VzLAoJCQkJCQkJICAgTGlz dCAqaGFzaG9wZXJhdG9ycywgTGlzdCAqaGFzaGNvbGxhdGlvbnMsCgkJCQkJCQkgICBMaXN0 ICpoYXNoa2V5cywKCQkJCQkJCSAgIFBsYW4gKmxlZnR0cmVlLCBQbGFuICpyaWdodHRyZWUs CgkJCQkJCQkgICBKb2luVHlwZSBqb2ludHlwZSwgYm9vbCBpbm5lcl91bmlxdWUpOwpzdGF0 aWMgSGFzaCAqbWFrZV9oYXNoKFBsYW4gKmxlZnR0cmVlLAoJCQkJCSAgIExpc3QgKmhhc2hr ZXlzLAoJCQkJCSAgIE9pZCBza2V3VGFibGUsCgkJCQkJICAgQXR0ck51bWJlciBza2V3Q29s dW1uLAoJCQkJCSAgIGJvb2wgc2tld0luaGVyaXQpOwpzdGF0aWMgTWVyZ2VKb2luICptYWtl X21lcmdlam9pbihMaXN0ICp0bGlzdCwKCQkJCQkJCQkgTGlzdCAqam9pbmNsYXVzZXMsIExp c3QgKm90aGVyY2xhdXNlcywKCQkJCQkJCQkgTGlzdCAqbWVyZ2VjbGF1c2VzLAoJCQkJCQkJ CSBPaWQgKm1lcmdlZmFtaWxpZXMsCgkJCQkJCQkJIE9pZCAqbWVyZ2Vjb2xsYXRpb25zLAoJ CQkJCQkJCSBib29sICptZXJnZXJldmVyc2FscywKCQkJCQkJCQkgYm9vbCAqbWVyZ2VudWxs c2ZpcnN0LAoJCQkJCQkJCSBQbGFuICpsZWZ0dHJlZSwgUGxhbiAqcmlnaHR0cmVlLAoJCQkJ CQkJCSBKb2luVHlwZSBqb2ludHlwZSwgYm9vbCBpbm5lcl91bmlxdWUsCgkJCQkJCQkJIGJv b2wgc2tpcF9tYXJrX3Jlc3RvcmUpOwpzdGF0aWMgU29ydCAqbWFrZV9zb3J0KFBsYW4gKmxl ZnR0cmVlLCBpbnQgbnVtQ29scywKCQkJCQkgICBBdHRyTnVtYmVyICpzb3J0Q29sSWR4LCBP aWQgKnNvcnRPcGVyYXRvcnMsCgkJCQkJICAgT2lkICpjb2xsYXRpb25zLCBib29sICpudWxs c0ZpcnN0KTsKc3RhdGljIEluY3JlbWVudGFsU29ydCAqbWFrZV9pbmNyZW1lbnRhbHNvcnQo UGxhbiAqbGVmdHRyZWUsCgkJCQkJCQkJCQkJIGludCBudW1Db2xzLCBpbnQgblByZXNvcnRl ZENvbHMsCgkJCQkJCQkJCQkJIEF0dHJOdW1iZXIgKnNvcnRDb2xJZHgsIE9pZCAqc29ydE9w ZXJhdG9ycywKCQkJCQkJCQkJCQkgT2lkICpjb2xsYXRpb25zLCBib29sICpudWxsc0ZpcnN0 KTsKc3RhdGljIFBsYW4gKnByZXBhcmVfc29ydF9mcm9tX3BhdGhrZXlzKFBsYW4gKmxlZnR0 cmVlLCBMaXN0ICpwYXRoa2V5cywKCQkJCQkJCQkJCVJlbGlkcyByZWxpZHMsCgkJCQkJCQkJ CQljb25zdCBBdHRyTnVtYmVyICpyZXFDb2xJZHgsCgkJCQkJCQkJCQlib29sIGFkanVzdF90 bGlzdF9pbl9wbGFjZSwKCQkJCQkJCQkJCWludCAqcF9udW1zb3J0a2V5cywKCQkJCQkJCQkJ CUF0dHJOdW1iZXIgKipwX3NvcnRDb2xJZHgsCgkJCQkJCQkJCQlPaWQgKipwX3NvcnRPcGVy YXRvcnMsCgkJCQkJCQkJCQlPaWQgKipwX2NvbGxhdGlvbnMsCgkJCQkJCQkJCQlib29sICoq cF9udWxsc0ZpcnN0KTsKc3RhdGljIFNvcnQgKm1ha2Vfc29ydF9mcm9tX3BhdGhrZXlzKFBs YW4gKmxlZnR0cmVlLCBMaXN0ICpwYXRoa2V5cywKCQkJCQkJCQkJIFJlbGlkcyByZWxpZHMp OwpzdGF0aWMgSW5jcmVtZW50YWxTb3J0ICptYWtlX2luY3JlbWVudGFsc29ydF9mcm9tX3Bh dGhrZXlzKFBsYW4gKmxlZnR0cmVlLAoJCQkJCQkJCQkJCQkJCSAgIExpc3QgKnBhdGhrZXlz LCBSZWxpZHMgcmVsaWRzLCBpbnQgblByZXNvcnRlZENvbHMpOwpzdGF0aWMgU29ydCAqbWFr ZV9zb3J0X2Zyb21fZ3JvdXBjb2xzKExpc3QgKmdyb3VwY2xzLAoJCQkJCQkJCQkgIEF0dHJO dW1iZXIgKmdycENvbElkeCwKCQkJCQkJCQkJICBQbGFuICpsZWZ0dHJlZSk7CnN0YXRpYyBN YXRlcmlhbCAqbWFrZV9tYXRlcmlhbChQbGFuICpsZWZ0dHJlZSk7CnN0YXRpYyBNZW1vaXpl ICptYWtlX21lbW9pemUoUGxhbiAqbGVmdHRyZWUsIE9pZCAqaGFzaG9wZXJhdG9ycywKCQkJ CQkJCSBPaWQgKmNvbGxhdGlvbnMsIExpc3QgKnBhcmFtX2V4cHJzLAoJCQkJCQkJIGJvb2wg c2luZ2xlcm93LCBib29sIGJpbmFyeV9tb2RlLAoJCQkJCQkJIHVpbnQzMiBlc3RfZW50cmll cywgQml0bWFwc2V0ICprZXlwYXJhbWlkcywKCQkJCQkJCSBDYXJkaW5hbGl0eSBlc3RfY2Fs bHMsCgkJCQkJCQkgQ2FyZGluYWxpdHkgZXN0X3VuaXF1ZV9rZXlzLAoJCQkJCQkJIGRvdWJs ZSBlc3RfaGl0X3JhdGlvKTsKc3RhdGljIFdpbmRvd0FnZyAqbWFrZV93aW5kb3dhZ2coTGlz dCAqdGxpc3QsIFdpbmRvd0NsYXVzZSAqd2MsCgkJCQkJCQkJIGludCBwYXJ0TnVtQ29scywg QXR0ck51bWJlciAqcGFydENvbElkeCwgT2lkICpwYXJ0T3BlcmF0b3JzLCBPaWQgKnBhcnRD b2xsYXRpb25zLAoJCQkJCQkJCSBpbnQgb3JkTnVtQ29scywgQXR0ck51bWJlciAqb3JkQ29s SWR4LCBPaWQgKm9yZE9wZXJhdG9ycywgT2lkICpvcmRDb2xsYXRpb25zLAoJCQkJCQkJCSBM aXN0ICpydW5Db25kaXRpb24sIExpc3QgKnF1YWwsIGJvb2wgdG9wV2luZG93LAoJCQkJCQkJ CSBQbGFuICpsZWZ0dHJlZSk7CnN0YXRpYyBHcm91cCAqbWFrZV9ncm91cChMaXN0ICp0bGlz dCwgTGlzdCAqcXVhbCwgaW50IG51bUdyb3VwQ29scywKCQkJCQkJIEF0dHJOdW1iZXIgKmdy cENvbElkeCwgT2lkICpncnBPcGVyYXRvcnMsIE9pZCAqZ3JwQ29sbGF0aW9ucywKCQkJCQkJ IFBsYW4gKmxlZnR0cmVlKTsKc3RhdGljIFVuaXF1ZSAqbWFrZV91bmlxdWVfZnJvbV9wYXRo a2V5cyhQbGFuICpsZWZ0dHJlZSwKCQkJCQkJCQkJCSBMaXN0ICpwYXRoa2V5cywgaW50IG51 bUNvbHMsCgkJCQkJCQkJCQkgUmVsaWRzIHJlbGlkcyk7CnN0YXRpYyBHYXRoZXIgKm1ha2Vf Z2F0aGVyKExpc3QgKnFwdGxpc3QsIExpc3QgKnFwcXVhbCwKCQkJCQkJICAgaW50IG53b3Jr ZXJzLCBpbnQgcmVzY2FuX3BhcmFtLCBib29sIHNpbmdsZV9jb3B5LCBQbGFuICpzdWJwbGFu KTsKc3RhdGljIFNldE9wICptYWtlX3NldG9wKFNldE9wQ21kIGNtZCwgU2V0T3BTdHJhdGVn eSBzdHJhdGVneSwKCQkJCQkJIExpc3QgKnRsaXN0LCBQbGFuICpsZWZ0dHJlZSwgUGxhbiAq cmlnaHR0cmVlLAoJCQkJCQkgTGlzdCAqZ3JvdXBMaXN0LCBDYXJkaW5hbGl0eSBudW1Hcm91 cHMpOwpzdGF0aWMgTG9ja1Jvd3MgKm1ha2VfbG9ja3Jvd3MoUGxhbiAqbGVmdHRyZWUsIExp c3QgKnJvd01hcmtzLCBpbnQgZXBxUGFyYW0pOwpzdGF0aWMgUmVzdWx0ICptYWtlX2dhdGlu Z19yZXN1bHQoTGlzdCAqdGxpc3QsIE5vZGUgKnJlc2NvbnN0YW50cXVhbCwKCQkJCQkJCQkg IFBsYW4gKnN1YnBsYW4pOwpzdGF0aWMgUmVzdWx0ICptYWtlX29uZV9yb3dfcmVzdWx0KExp c3QgKnRsaXN0LCBOb2RlICpyZXNjb25zdGFudHF1YWwsCgkJCQkJCQkJICAgUmVsT3B0SW5m byAqcmVsKTsKc3RhdGljIFByb2plY3RTZXQgKm1ha2VfcHJvamVjdF9zZXQoTGlzdCAqdGxp c3QsIFBsYW4gKnN1YnBsYW4pOwpzdGF0aWMgTW9kaWZ5VGFibGUgKm1ha2VfbW9kaWZ5dGFi bGUoUGxhbm5lckluZm8gKnJvb3QsIFBsYW4gKnN1YnBsYW4sCgkJCQkJCQkJCSBDbWRUeXBl IG9wZXJhdGlvbiwgYm9vbCBjYW5TZXRUYWcsCgkJCQkJCQkJCSBJbmRleCBub21pbmFsUmVs YXRpb24sIEluZGV4IHJvb3RSZWxhdGlvbiwKCQkJCQkJCQkJIExpc3QgKnJlc3VsdFJlbGF0 aW9ucywKCQkJCQkJCQkJIExpc3QgKnVwZGF0ZUNvbG5vc0xpc3RzLAoJCQkJCQkJCQkgTGlz dCAqd2l0aENoZWNrT3B0aW9uTGlzdHMsIExpc3QgKnJldHVybmluZ0xpc3RzLAoJCQkJCQkJ CQkgTGlzdCAqcm93TWFya3MsIE9uQ29uZmxpY3RFeHByICpvbmNvbmZsaWN0LAoJCQkJCQkJ CQkgTGlzdCAqbWVyZ2VBY3Rpb25MaXN0cywgTGlzdCAqbWVyZ2VKb2luQ29uZGl0aW9ucywK CQkJCQkJCQkJIEZvclBvcnRpb25PZkV4cHIgKmZvclBvcnRpb25PZiwgaW50IGVwcVBhcmFt KTsKc3RhdGljIEdhdGhlck1lcmdlICpjcmVhdGVfZ2F0aGVyX21lcmdlX3BsYW4oUGxhbm5l ckluZm8gKnJvb3QsCgkJCQkJCQkJCQkJIEdhdGhlck1lcmdlUGF0aCAqYmVzdF9wYXRoKTsK CgovKgogKiBjcmVhdGVfcGxhbgogKgkgIENyZWF0ZXMgdGhlIGFjY2VzcyBwbGFuIGZvciBh IHF1ZXJ5IGJ5IHJlY3Vyc2l2ZWx5IHByb2Nlc3NpbmcgdGhlCiAqCSAgZGVzaXJlZCB0cmVl IG9mIHBhdGhub2Rlcywgc3RhcnRpbmcgYXQgdGhlIG5vZGUgJ2Jlc3RfcGF0aCcuICBGb3IK ICoJICBldmVyeSBwYXRobm9kZSBmb3VuZCwgd2UgY3JlYXRlIGEgY29ycmVzcG9uZGluZyBw bGFuIG5vZGUgY29udGFpbmluZwogKgkgIGFwcHJvcHJpYXRlIGlkLCB0YXJnZXQgbGlzdCwg YW5kIHF1YWxpZmljYXRpb24gaW5mb3JtYXRpb24uCiAqCiAqCSAgVGhlIHRsaXN0cyBhbmQg cXVhbHMgaW4gdGhlIHBsYW4gdHJlZSBhcmUgc3RpbGwgaW4gcGxhbm5lciBmb3JtYXQsCiAq CSAgaWUsIFZhcnMgc3RpbGwgY29ycmVzcG9uZCB0byB0aGUgcGFyc2VyJ3MgbnVtYmVyaW5n LiAgVGhpcyB3aWxsIGJlCiAqCSAgZml4ZWQgbGF0ZXIgYnkgc2V0cmVmcy5jLgogKgogKgkg IGJlc3RfcGF0aCBpcyB0aGUgYmVzdCBhY2Nlc3MgcGF0aAogKgogKgkgIFJldHVybnMgYSBQ bGFuIHRyZWUuCiAqLwpQbGFuICoKY3JlYXRlX3BsYW4oUGxhbm5lckluZm8gKnJvb3QsIFBh dGggKmJlc3RfcGF0aCkKewoJUGxhbgkgICAqcGxhbjsKCgkvKiBwbGFuX3BhcmFtcyBzaG91 bGQgbm90IGJlIGluIHVzZSBpbiBjdXJyZW50IHF1ZXJ5IGxldmVsICovCglBc3NlcnQocm9v dC0+cGxhbl9wYXJhbXMgPT0gTklMKTsKCgkvKiBJbml0aWFsaXplIHRoaXMgbW9kdWxlJ3Mg d29ya3NwYWNlIGluIFBsYW5uZXJJbmZvICovCglyb290LT5jdXJPdXRlclJlbHMgPSBOVUxM OwoJcm9vdC0+Y3VyT3V0ZXJQYXJhbXMgPSBOSUw7CgoJLyogUmVjdXJzaXZlbHkgcHJvY2Vz cyB0aGUgcGF0aCB0cmVlLCBkZW1hbmRpbmcgdGhlIGNvcnJlY3QgdGxpc3QgcmVzdWx0ICov CglwbGFuID0gY3JlYXRlX3BsYW5fcmVjdXJzZShyb290LCBiZXN0X3BhdGgsIENQX0VYQUNU X1RMSVNUKTsKCgkvKgoJICogTWFrZSBzdXJlIHRoZSB0b3Btb3N0IHBsYW4gbm9kZSdzIHRh cmdldGxpc3QgZXhwb3NlcyB0aGUgb3JpZ2luYWwKCSAqIGNvbHVtbiBuYW1lcyBhbmQgb3Ro ZXIgZGVjb3JhdGl2ZSBpbmZvLiAgVGFyZ2V0bGlzdHMgZ2VuZXJhdGVkIHdpdGhpbgoJICog dGhlIHBsYW5uZXIgZG9uJ3QgYm90aGVyIHdpdGggdGhhdCBzdHVmZiwgYnV0IHdlIG11c3Qg aGF2ZSBpdCBvbiB0aGUKCSAqIHRvcC1sZXZlbCB0bGlzdCBzZWVuIGF0IGV4ZWN1dGlvbiB0 aW1lLiAgSG93ZXZlciwgTW9kaWZ5VGFibGUgcGxhbgoJICogbm9kZXMgZG9uJ3QgaGF2ZSBh IHRsaXN0IG1hdGNoaW5nIHRoZSBxdWVyeXRyZWUgdGFyZ2V0bGlzdC4KCSAqLwoJaWYgKCFJ c0EocGxhbiwgTW9kaWZ5VGFibGUpKQoJCWFwcGx5X3RsaXN0X2xhYmVsaW5nKHBsYW4tPnRh cmdldGxpc3QsIHJvb3QtPnByb2Nlc3NlZF90bGlzdCk7CgoJLyoKCSAqIEF0dGFjaCBhbnkg aW5pdFBsYW5zIGNyZWF0ZWQgaW4gdGhpcyBxdWVyeSBsZXZlbCB0byB0aGUgdG9wbW9zdCBw bGFuCgkgKiBub2RlLiAgKEluIHByaW5jaXBsZSB0aGUgaW5pdHBsYW5zIGNvdWxkIGdvIGlu IGFueSBwbGFuIG5vZGUgYXQgb3IKCSAqIGFib3ZlIHdoZXJlIHRoZXkncmUgcmVmZXJlbmNl ZCwgYnV0IHRoZXJlIHNlZW1zIG5vIHJlYXNvbiB0byBwdXQgdGhlbQoJICogYW55IGxvd2Vy IHRoYW4gdGhlIHRvcG1vc3Qgbm9kZSBmb3IgdGhlIHF1ZXJ5IGxldmVsLiAgQWxzbywgc2Vl CgkgKiBjb21tZW50cyBmb3IgU1NfZmluYWxpemVfcGxhbiBiZWZvcmUgeW91IHRyeSB0byBj aGFuZ2UgdGhpcy4pCgkgKi8KCVNTX2F0dGFjaF9pbml0cGxhbnMocm9vdCwgcGxhbik7CgoJ LyogQ2hlY2sgd2Ugc3VjY2Vzc2Z1bGx5IGFzc2lnbmVkIGFsbCBOZXN0TG9vcFBhcmFtcyB0 byBwbGFuIG5vZGVzICovCglpZiAocm9vdC0+Y3VyT3V0ZXJQYXJhbXMgIT0gTklMKQoJCWVs b2coRVJST1IsICJmYWlsZWQgdG8gYXNzaWduIGFsbCBOZXN0TG9vcFBhcmFtcyB0byBwbGFu IG5vZGVzIik7CgoJLyoKCSAqIFJlc2V0IHBsYW5fcGFyYW1zIHRvIGVuc3VyZSBwYXJhbSBJ RHMgdXNlZCBmb3IgbmVzdGxvb3AgcGFyYW1zIGFyZSBub3QKCSAqIHJlLXVzZWQgbGF0ZXIK CSAqLwoJcm9vdC0+cGxhbl9wYXJhbXMgPSBOSUw7CgoJcmV0dXJuIHBsYW47Cn0KCi8qCiAq IGNyZWF0ZV9wbGFuX3JlY3Vyc2UKICoJICBSZWN1cnNpdmUgZ3V0cyBvZiBjcmVhdGVfcGxh bigpLgogKi8Kc3RhdGljIFBsYW4gKgpjcmVhdGVfcGxhbl9yZWN1cnNlKFBsYW5uZXJJbmZv ICpyb290LCBQYXRoICpiZXN0X3BhdGgsIGludCBmbGFncykKewoJUGxhbgkgICAqcGxhbjsK CgkvKiBHdWFyZCBhZ2FpbnN0IHN0YWNrIG92ZXJmbG93IGR1ZSB0byBvdmVybHkgY29tcGxl eCBwbGFucyAqLwoJY2hlY2tfc3RhY2tfZGVwdGgoKTsKCglzd2l0Y2ggKGJlc3RfcGF0aC0+ cGF0aHR5cGUpCgl7CgkJY2FzZSBUX1NlcVNjYW46CgkJY2FzZSBUX1NhbXBsZVNjYW46CgkJ Y2FzZSBUX0luZGV4U2NhbjoKCQljYXNlIFRfSW5kZXhPbmx5U2NhbjoKCQljYXNlIFRfQml0 bWFwSGVhcFNjYW46CgkJY2FzZSBUX1RpZFNjYW46CgkJY2FzZSBUX1RpZFJhbmdlU2NhbjoK CQljYXNlIFRfU3VicXVlcnlTY2FuOgoJCWNhc2UgVF9GdW5jdGlvblNjYW46CgkJY2FzZSBU X1RhYmxlRnVuY1NjYW46CgkJY2FzZSBUX1ZhbHVlc1NjYW46CgkJY2FzZSBUX0N0ZVNjYW46 CgkJY2FzZSBUX1dvcmtUYWJsZVNjYW46CgkJY2FzZSBUX05hbWVkVHVwbGVzdG9yZVNjYW46 CgkJY2FzZSBUX0ZvcmVpZ25TY2FuOgoJCWNhc2UgVF9DdXN0b21TY2FuOgoJCQlwbGFuID0g Y3JlYXRlX3NjYW5fcGxhbihyb290LCBiZXN0X3BhdGgsIGZsYWdzKTsKCQkJYnJlYWs7CgkJ Y2FzZSBUX0hhc2hKb2luOgoJCWNhc2UgVF9NZXJnZUpvaW46CgkJY2FzZSBUX05lc3RMb29w OgoJCQlwbGFuID0gY3JlYXRlX2pvaW5fcGxhbihyb290LAoJCQkJCQkJCQkoSm9pblBhdGgg KikgYmVzdF9wYXRoKTsKCQkJYnJlYWs7CgkJY2FzZSBUX0FwcGVuZDoKCQkJcGxhbiA9IGNy ZWF0ZV9hcHBlbmRfcGxhbihyb290LAoJCQkJCQkJCQkgIChBcHBlbmRQYXRoICopIGJlc3Rf cGF0aCwKCQkJCQkJCQkJICBmbGFncyk7CgkJCWJyZWFrOwoJCWNhc2UgVF9NZXJnZUFwcGVu ZDoKCQkJcGxhbiA9IGNyZWF0ZV9tZXJnZV9hcHBlbmRfcGxhbihyb290LAoJCQkJCQkJCQkJ CShNZXJnZUFwcGVuZFBhdGggKikgYmVzdF9wYXRoLAoJCQkJCQkJCQkJCWZsYWdzKTsKCQkJ YnJlYWs7CgkJY2FzZSBUX1Jlc3VsdDoKCQkJaWYgKElzQShiZXN0X3BhdGgsIFByb2plY3Rp b25QYXRoKSkKCQkJewoJCQkJcGxhbiA9IGNyZWF0ZV9wcm9qZWN0aW9uX3BsYW4ocm9vdCwK CQkJCQkJCQkJCQkgIChQcm9qZWN0aW9uUGF0aCAqKSBiZXN0X3BhdGgsCgkJCQkJCQkJCQkJ ICBmbGFncyk7CgkJCX0KCQkJZWxzZSBpZiAoSXNBKGJlc3RfcGF0aCwgTWluTWF4QWdnUGF0 aCkpCgkJCXsKCQkJCXBsYW4gPSAoUGxhbiAqKSBjcmVhdGVfbWlubWF4YWdnX3BsYW4ocm9v dCwKCQkJCQkJCQkJCQkJCSAgKE1pbk1heEFnZ1BhdGggKikgYmVzdF9wYXRoKTsKCQkJfQoJ CQllbHNlIGlmIChJc0EoYmVzdF9wYXRoLCBHcm91cFJlc3VsdFBhdGgpKQoJCQl7CgkJCQlw bGFuID0gKFBsYW4gKikgY3JlYXRlX2dyb3VwX3Jlc3VsdF9wbGFuKHJvb3QsCgkJCQkJCQkJ CQkJCQkJIChHcm91cFJlc3VsdFBhdGggKikgYmVzdF9wYXRoKTsKCQkJfQoJCQllbHNlCgkJ CXsKCQkJCS8qIFNpbXBsZSBSVEVfUkVTVUxUIGJhc2UgcmVsYXRpb24gKi8KCQkJCUFzc2Vy dChJc0EoYmVzdF9wYXRoLCBQYXRoKSk7CgkJCQlwbGFuID0gY3JlYXRlX3NjYW5fcGxhbihy b290LCBiZXN0X3BhdGgsIGZsYWdzKTsKCQkJfQoJCQlicmVhazsKCQljYXNlIFRfUHJvamVj dFNldDoKCQkJcGxhbiA9IChQbGFuICopIGNyZWF0ZV9wcm9qZWN0X3NldF9wbGFuKHJvb3Qs CgkJCQkJCQkJCQkJCQkoUHJvamVjdFNldFBhdGggKikgYmVzdF9wYXRoKTsKCQkJYnJlYWs7 CgkJY2FzZSBUX01hdGVyaWFsOgoJCQlwbGFuID0gKFBsYW4gKikgY3JlYXRlX21hdGVyaWFs X3BsYW4ocm9vdCwKCQkJCQkJCQkJCQkJIChNYXRlcmlhbFBhdGggKikgYmVzdF9wYXRoLAoJ CQkJCQkJCQkJCQkgZmxhZ3MpOwoJCQlicmVhazsKCQljYXNlIFRfTWVtb2l6ZToKCQkJcGxh biA9IChQbGFuICopIGNyZWF0ZV9tZW1vaXplX3BsYW4ocm9vdCwKCQkJCQkJCQkJCQkJKE1l bW9pemVQYXRoICopIGJlc3RfcGF0aCwKCQkJCQkJCQkJCQkJZmxhZ3MpOwoJCQlicmVhazsK CQljYXNlIFRfVW5pcXVlOgoJCQlwbGFuID0gKFBsYW4gKikgY3JlYXRlX3VuaXF1ZV9wbGFu KHJvb3QsCgkJCQkJCQkJCQkJICAgKFVuaXF1ZVBhdGggKikgYmVzdF9wYXRoLAoJCQkJCQkJ CQkJCSAgIGZsYWdzKTsKCQkJYnJlYWs7CgkJY2FzZSBUX0dhdGhlcjoKCQkJcGxhbiA9IChQ bGFuICopIGNyZWF0ZV9nYXRoZXJfcGxhbihyb290LAoJCQkJCQkJCQkJCSAgIChHYXRoZXJQ YXRoICopIGJlc3RfcGF0aCk7CgkJCWJyZWFrOwoJCWNhc2UgVF9Tb3J0OgoJCQlwbGFuID0g KFBsYW4gKikgY3JlYXRlX3NvcnRfcGxhbihyb290LAoJCQkJCQkJCQkJCSAoU29ydFBhdGgg KikgYmVzdF9wYXRoLAoJCQkJCQkJCQkJCSBmbGFncyk7CgkJCWJyZWFrOwoJCWNhc2UgVF9J bmNyZW1lbnRhbFNvcnQ6CgkJCXBsYW4gPSAoUGxhbiAqKSBjcmVhdGVfaW5jcmVtZW50YWxz b3J0X3BsYW4ocm9vdCwKCQkJCQkJCQkJCQkJCQkoSW5jcmVtZW50YWxTb3J0UGF0aCAqKSBi ZXN0X3BhdGgsCgkJCQkJCQkJCQkJCQkJZmxhZ3MpOwoJCQlicmVhazsKCQljYXNlIFRfR3Jv dXA6CgkJCXBsYW4gPSAoUGxhbiAqKSBjcmVhdGVfZ3JvdXBfcGxhbihyb290LAoJCQkJCQkJ CQkJCSAgKEdyb3VwUGF0aCAqKSBiZXN0X3BhdGgpOwoJCQlicmVhazsKCQljYXNlIFRfQWdn OgoJCQlpZiAoSXNBKGJlc3RfcGF0aCwgR3JvdXBpbmdTZXRzUGF0aCkpCgkJCQlwbGFuID0g Y3JlYXRlX2dyb3VwaW5nc2V0c19wbGFuKHJvb3QsCgkJCQkJCQkJCQkJCShHcm91cGluZ1Nl dHNQYXRoICopIGJlc3RfcGF0aCk7CgkJCWVsc2UKCQkJewoJCQkJQXNzZXJ0KElzQShiZXN0 X3BhdGgsIEFnZ1BhdGgpKTsKCQkJCXBsYW4gPSAoUGxhbiAqKSBjcmVhdGVfYWdnX3BsYW4o cm9vdCwKCQkJCQkJCQkJCQkJKEFnZ1BhdGggKikgYmVzdF9wYXRoKTsKCQkJfQoJCQlicmVh azsKCQljYXNlIFRfV2luZG93QWdnOgoJCQlwbGFuID0gKFBsYW4gKikgY3JlYXRlX3dpbmRv d2FnZ19wbGFuKHJvb3QsCgkJCQkJCQkJCQkJCSAgKFdpbmRvd0FnZ1BhdGggKikgYmVzdF9w YXRoKTsKCQkJYnJlYWs7CgkJY2FzZSBUX1NldE9wOgoJCQlwbGFuID0gKFBsYW4gKikgY3Jl YXRlX3NldG9wX3BsYW4ocm9vdCwKCQkJCQkJCQkJCQkgIChTZXRPcFBhdGggKikgYmVzdF9w YXRoLAoJCQkJCQkJCQkJCSAgZmxhZ3MpOwoJCQlicmVhazsKCQljYXNlIFRfUmVjdXJzaXZl VW5pb246CgkJCXBsYW4gPSAoUGxhbiAqKSBjcmVhdGVfcmVjdXJzaXZldW5pb25fcGxhbihy b290LAoJCQkJCQkJCQkJCQkJICAgKFJlY3Vyc2l2ZVVuaW9uUGF0aCAqKSBiZXN0X3BhdGgp OwoJCQlicmVhazsKCQljYXNlIFRfTG9ja1Jvd3M6CgkJCXBsYW4gPSAoUGxhbiAqKSBjcmVh dGVfbG9ja3Jvd3NfcGxhbihyb290LAoJCQkJCQkJCQkJCQkgKExvY2tSb3dzUGF0aCAqKSBi ZXN0X3BhdGgsCgkJCQkJCQkJCQkJCSBmbGFncyk7CgkJCWJyZWFrOwoJCWNhc2UgVF9Nb2Rp ZnlUYWJsZToKCQkJcGxhbiA9IChQbGFuICopIGNyZWF0ZV9tb2RpZnl0YWJsZV9wbGFuKHJv b3QsCgkJCQkJCQkJCQkJCQkoTW9kaWZ5VGFibGVQYXRoICopIGJlc3RfcGF0aCk7CgkJCWJy ZWFrOwoJCWNhc2UgVF9MaW1pdDoKCQkJcGxhbiA9IChQbGFuICopIGNyZWF0ZV9saW1pdF9w bGFuKHJvb3QsCgkJCQkJCQkJCQkJICAoTGltaXRQYXRoICopIGJlc3RfcGF0aCwKCQkJCQkJ CQkJCQkgIGZsYWdzKTsKCQkJYnJlYWs7CgkJY2FzZSBUX0dhdGhlck1lcmdlOgoJCQlwbGFu ID0gKFBsYW4gKikgY3JlYXRlX2dhdGhlcl9tZXJnZV9wbGFuKHJvb3QsCgkJCQkJCQkJCQkJ CQkgKEdhdGhlck1lcmdlUGF0aCAqKSBiZXN0X3BhdGgpOwoJCQlicmVhazsKCQlkZWZhdWx0 OgoJCQllbG9nKEVSUk9SLCAidW5yZWNvZ25pemVkIG5vZGUgdHlwZTogJWQiLAoJCQkJIChp bnQpIGJlc3RfcGF0aC0+cGF0aHR5cGUpOwoJCQlwbGFuID0gTlVMTDsJCS8qIGtlZXAgY29t cGlsZXIgcXVpZXQgKi8KCQkJYnJlYWs7Cgl9CgoJcmV0dXJuIHBsYW47Cn0KCi8qCiAqIGNy ZWF0ZV9zY2FuX3BsYW4KICoJIENyZWF0ZSBhIHNjYW4gcGxhbiBmb3IgdGhlIHBhcmVudCBy ZWxhdGlvbiBvZiAnYmVzdF9wYXRoJy4KICovCnN0YXRpYyBQbGFuICoKY3JlYXRlX3NjYW5f cGxhbihQbGFubmVySW5mbyAqcm9vdCwgUGF0aCAqYmVzdF9wYXRoLCBpbnQgZmxhZ3MpCnsK CVJlbE9wdEluZm8gKnJlbCA9IGJlc3RfcGF0aC0+cGFyZW50OwoJTGlzdAkgICAqc2Nhbl9j bGF1c2VzOwoJTGlzdAkgICAqZ2F0aW5nX2NsYXVzZXM7CglMaXN0CSAgICp0bGlzdDsKCVBs YW4JICAgKnBsYW47CgoJLyoKCSAqIEV4dHJhY3QgdGhlIHJlbGV2YW50IHJlc3RyaWN0aW9u IGNsYXVzZXMgZnJvbSB0aGUgcGFyZW50IHJlbGF0aW9uLiBUaGUKCSAqIGV4ZWN1dG9yIG11 c3QgYXBwbHkgYWxsIHRoZXNlIHJlc3RyaWN0aW9ucyBkdXJpbmcgdGhlIHNjYW4sIGV4Y2Vw dCBmb3IKCSAqIHBzZXVkb2NvbnN0YW50cyB3aGljaCB3ZSdsbCB0YWtlIGNhcmUgb2YgYmVs b3cuCgkgKgoJICogSWYgdGhpcyBpcyBhIHBsYWluIGluZGV4c2NhbiBvciBpbmRleC1vbmx5 IHNjYW4sIHdlIG5lZWQgbm90IGNvbnNpZGVyCgkgKiByZXN0cmljdGlvbiBjbGF1c2VzIHRo YXQgYXJlIGltcGxpZWQgYnkgdGhlIGluZGV4J3MgcHJlZGljYXRlLCBzbyB1c2UKCSAqIGlu ZHJlc3RyaWN0aW5mbyBub3QgYmFzZXJlc3RyaWN0aW5mby4gIE5vdGUgdGhhdCB3ZSBjYW4n dCBkbyB0aGF0IGZvcgoJICogYml0bWFwIGluZGV4c2NhbnMsIHNpbmNlIHRoZXJlJ3Mgbm90 IG5lY2Vzc2FyaWx5IGEgc2luZ2xlIGluZGV4CgkgKiBpbnZvbHZlZDsgYnV0IGl0IGRvZXNu J3QgbWF0dGVyIHNpbmNlIGNyZWF0ZV9iaXRtYXBfc2Nhbl9wbGFuKCkgd2lsbCBiZQoJICog YWJsZSB0byBnZXQgcmlkIG9mIHN1Y2ggY2xhdXNlcyBhbnl3YXkgdmlhIHByZWRpY2F0ZSBw cm9vZi4KCSAqLwoJc3dpdGNoIChiZXN0X3BhdGgtPnBhdGh0eXBlKQoJewoJCWNhc2UgVF9J bmRleFNjYW46CgkJY2FzZSBUX0luZGV4T25seVNjYW46CgkJCXNjYW5fY2xhdXNlcyA9IGNh c3ROb2RlKEluZGV4UGF0aCwgYmVzdF9wYXRoKS0+aW5kZXhpbmZvLT5pbmRyZXN0cmljdGlu Zm87CgkJCWJyZWFrOwoJCWRlZmF1bHQ6CgkJCXNjYW5fY2xhdXNlcyA9IHJlbC0+YmFzZXJl c3RyaWN0aW5mbzsKCQkJYnJlYWs7Cgl9CgoJLyoKCSAqIElmIHRoaXMgaXMgYSBwYXJhbWV0 ZXJpemVkIHNjYW4sIHdlIGFsc28gbmVlZCB0byBlbmZvcmNlIGFsbCB0aGUgam9pbgoJICog Y2xhdXNlcyBhdmFpbGFibGUgZnJvbSB0aGUgb3V0ZXIgcmVsYXRpb24ocykuCgkgKgoJICog Rm9yIHBhcmFub2lhJ3Mgc2FrZSwgZG9uJ3QgbW9kaWZ5IHRoZSBzdG9yZWQgYmFzZXJlc3Ry aWN0aW5mbyBsaXN0LgoJICovCglpZiAoYmVzdF9wYXRoLT5wYXJhbV9pbmZvKQoJCXNjYW5f Y2xhdXNlcyA9IGxpc3RfY29uY2F0X2NvcHkoc2Nhbl9jbGF1c2VzLAoJCQkJCQkJCQkJYmVz dF9wYXRoLT5wYXJhbV9pbmZvLT5wcGlfY2xhdXNlcyk7CgoJLyoKCSAqIERldGVjdCB3aGV0 aGVyIHdlIGhhdmUgYW55IHBzZXVkb2NvbnN0YW50IHF1YWxzIHRvIGRlYWwgd2l0aC4gIFRo ZW4sIGlmCgkgKiB3ZSdsbCBuZWVkIGEgZ2F0aW5nIFJlc3VsdCBub2RlLCBpdCB3aWxsIGJl IGFibGUgdG8gcHJvamVjdCwgc28gdGhlcmUKCSAqIGFyZSBubyByZXF1aXJlbWVudHMgb24g dGhlIGNoaWxkJ3MgdGxpc3QuCgkgKgoJICogSWYgdGhpcyByZXBsYWNlcyBhIGpvaW4sIGl0 IG11c3QgYmUgYSBmb3JlaWduIHNjYW4gb3IgYSBjdXN0b20gc2NhbiwKCSAqIGFuZCB0aGUg RkRXIG9yIHRoZSBjdXN0b20gc2NhbiBwcm92aWRlciB3b3VsZCBoYXZlIHN0b3JlZCBpbiB0 aGUgYmVzdAoJICogcGF0aCB0aGUgbGlzdCBvZiBSZXN0cmljdEluZm8gbm9kZXMgdG8gYXBw bHkgdG8gdGhlIGpvaW47IGNoZWNrIGFnYWluc3QKCSAqIHRoYXQgbGlzdCBpbiB0aGF0IGNh c2UuCgkgKi8KCWlmIChJU19KT0lOX1JFTChyZWwpKQoJewoJCUxpc3QJICAgKmpvaW5fY2xh dXNlczsKCgkJQXNzZXJ0KGJlc3RfcGF0aC0+cGF0aHR5cGUgPT0gVF9Gb3JlaWduU2NhbiB8 fAoJCQkgICBiZXN0X3BhdGgtPnBhdGh0eXBlID09IFRfQ3VzdG9tU2Nhbik7CgkJaWYgKGJl c3RfcGF0aC0+cGF0aHR5cGUgPT0gVF9Gb3JlaWduU2NhbikKCQkJam9pbl9jbGF1c2VzID0g KChGb3JlaWduUGF0aCAqKSBiZXN0X3BhdGgpLT5mZHdfcmVzdHJpY3RpbmZvOwoJCWVsc2UK CQkJam9pbl9jbGF1c2VzID0gKChDdXN0b21QYXRoICopIGJlc3RfcGF0aCktPmN1c3RvbV9y ZXN0cmljdGluZm87CgoJCWdhdGluZ19jbGF1c2VzID0gZ2V0X2dhdGluZ19xdWFscyhyb290 LCBqb2luX2NsYXVzZXMpOwoJfQoJZWxzZQoJCWdhdGluZ19jbGF1c2VzID0gZ2V0X2dhdGlu Z19xdWFscyhyb290LCBzY2FuX2NsYXVzZXMpOwoJaWYgKGdhdGluZ19jbGF1c2VzKQoJCWZs YWdzID0gMDsKCgkvKgoJICogRm9yIHRhYmxlIHNjYW5zLCByYXRoZXIgdGhhbiB1c2luZyB0 aGUgcmVsYXRpb24gdGFyZ2V0bGlzdCAod2hpY2ggaXMKCSAqIG9ubHkgdGhvc2UgVmFycyBh Y3R1YWxseSBuZWVkZWQgYnkgdGhlIHF1ZXJ5KSwgd2UgcHJlZmVyIHRvIGdlbmVyYXRlIGEK CSAqIHRsaXN0IGNvbnRhaW5pbmcgYWxsIFZhcnMgaW4gb3JkZXIuICBUaGlzIHdpbGwgYWxs b3cgdGhlIGV4ZWN1dG9yIHRvCgkgKiBvcHRpbWl6ZSBhd2F5IHByb2plY3Rpb24gb2YgdGhl IHRhYmxlIHR1cGxlcywgaWYgcG9zc2libGUuCgkgKgoJICogQnV0IGlmIHRoZSBjYWxsZXIg aXMgZ29pbmcgdG8gaWdub3JlIG91ciB0bGlzdCBhbnl3YXksIHRoZW4gZG9uJ3QKCSAqIGJv dGhlciBnZW5lcmF0aW5nIG9uZSBhdCBhbGwuICBXZSB1c2UgYW4gZXhhY3QgZXF1YWxpdHkg dGVzdCBoZXJlLCBzbwoJICogdGhhdCB0aGlzIG9ubHkgYXBwbGllcyB3aGVuIENQX0lHTk9S RV9UTElTVCBpcyB0aGUgb25seSBmbGFnIHNldC4KCSAqLwoJaWYgKGZsYWdzID09IENQX0lH Tk9SRV9UTElTVCkKCXsKCQl0bGlzdCA9IE5VTEw7Cgl9CgllbHNlIGlmICh1c2VfcGh5c2lj YWxfdGxpc3Qocm9vdCwgYmVzdF9wYXRoLCBmbGFncykpCgl7CgkJaWYgKGJlc3RfcGF0aC0+ cGF0aHR5cGUgPT0gVF9JbmRleE9ubHlTY2FuKQoJCXsKCQkJLyogRm9yIGluZGV4LW9ubHkg c2NhbiwgdGhlIHByZWZlcnJlZCB0bGlzdCBpcyB0aGUgaW5kZXgncyAqLwoJCQl0bGlzdCA9 IGNvcHlPYmplY3QoKChJbmRleFBhdGggKikgYmVzdF9wYXRoKS0+aW5kZXhpbmZvLT5pbmRl eHRsaXN0KTsKCgkJCS8qCgkJCSAqIFRyYW5zZmVyIHNvcnRncm91cHJlZiBkYXRhIHRvIHRo ZSByZXBsYWNlbWVudCB0bGlzdCwgaWYKCQkJICogcmVxdWVzdGVkICh1c2VfcGh5c2ljYWxf dGxpc3QgY2hlY2tlZCB0aGF0IHRoaXMgd2lsbCB3b3JrKS4KCQkJICovCgkJCWlmIChmbGFn cyAmIENQX0xBQkVMX1RMSVNUKQoJCQkJYXBwbHlfcGF0aHRhcmdldF9sYWJlbGluZ190b190 bGlzdCh0bGlzdCwgYmVzdF9wYXRoLT5wYXRodGFyZ2V0KTsKCQl9CgkJZWxzZQoJCXsKCQkJ dGxpc3QgPSBidWlsZF9waHlzaWNhbF90bGlzdChyb290LCByZWwpOwoJCQlpZiAodGxpc3Qg PT0gTklMKQoJCQl7CgkJCQkvKiBGYWlsZWQgYmVjYXVzZSBvZiBkcm9wcGVkIGNvbHMsIHNv IHVzZSByZWd1bGFyIG1ldGhvZCAqLwoJCQkJdGxpc3QgPSBidWlsZF9wYXRoX3RsaXN0KHJv b3QsIGJlc3RfcGF0aCk7CgkJCX0KCQkJZWxzZQoJCQl7CgkJCQkvKiBBcyBhYm92ZSwgdHJh bnNmZXIgc29ydGdyb3VwcmVmIGRhdGEgdG8gcmVwbGFjZW1lbnQgdGxpc3QgKi8KCQkJCWlm IChmbGFncyAmIENQX0xBQkVMX1RMSVNUKQoJCQkJCWFwcGx5X3BhdGh0YXJnZXRfbGFiZWxp bmdfdG9fdGxpc3QodGxpc3QsIGJlc3RfcGF0aC0+cGF0aHRhcmdldCk7CgkJCX0KCQl9Cgl9 CgllbHNlCgl7CgkJdGxpc3QgPSBidWlsZF9wYXRoX3RsaXN0KHJvb3QsIGJlc3RfcGF0aCk7 Cgl9CgoJc3dpdGNoIChiZXN0X3BhdGgtPnBhdGh0eXBlKQoJewoJCWNhc2UgVF9TZXFTY2Fu OgoJCQlwbGFuID0gKFBsYW4gKikgY3JlYXRlX3NlcXNjYW5fcGxhbihyb290LAoJCQkJCQkJ CQkJCQliZXN0X3BhdGgsCgkJCQkJCQkJCQkJCXRsaXN0LAoJCQkJCQkJCQkJCQlzY2FuX2Ns YXVzZXMpOwoJCQlicmVhazsKCgkJY2FzZSBUX1NhbXBsZVNjYW46CgkJCXBsYW4gPSAoUGxh biAqKSBjcmVhdGVfc2FtcGxlc2Nhbl9wbGFuKHJvb3QsCgkJCQkJCQkJCQkJCSAgIGJlc3Rf cGF0aCwKCQkJCQkJCQkJCQkJICAgdGxpc3QsCgkJCQkJCQkJCQkJCSAgIHNjYW5fY2xhdXNl cyk7CgkJCWJyZWFrOwoKCQljYXNlIFRfSW5kZXhTY2FuOgoJCQlwbGFuID0gKFBsYW4gKikg Y3JlYXRlX2luZGV4c2Nhbl9wbGFuKHJvb3QsCgkJCQkJCQkJCQkJCSAgKEluZGV4UGF0aCAq KSBiZXN0X3BhdGgsCgkJCQkJCQkJCQkJCSAgdGxpc3QsCgkJCQkJCQkJCQkJCSAgc2Nhbl9j bGF1c2VzLAoJCQkJCQkJCQkJCQkgIGZhbHNlKTsKCQkJYnJlYWs7CgoJCWNhc2UgVF9JbmRl eE9ubHlTY2FuOgoJCQlwbGFuID0gKFBsYW4gKikgY3JlYXRlX2luZGV4c2Nhbl9wbGFuKHJv b3QsCgkJCQkJCQkJCQkJCSAgKEluZGV4UGF0aCAqKSBiZXN0X3BhdGgsCgkJCQkJCQkJCQkJ CSAgdGxpc3QsCgkJCQkJCQkJCQkJCSAgc2Nhbl9jbGF1c2VzLAoJCQkJCQkJCQkJCQkgIHRy dWUpOwoJCQlicmVhazsKCgkJY2FzZSBUX0JpdG1hcEhlYXBTY2FuOgoJCQlwbGFuID0gKFBs YW4gKikgY3JlYXRlX2JpdG1hcF9zY2FuX3BsYW4ocm9vdCwKCQkJCQkJCQkJCQkJCShCaXRt YXBIZWFwUGF0aCAqKSBiZXN0X3BhdGgsCgkJCQkJCQkJCQkJCQl0bGlzdCwKCQkJCQkJCQkJ CQkJCXNjYW5fY2xhdXNlcyk7CgkJCWJyZWFrOwoKCQljYXNlIFRfVGlkU2NhbjoKCQkJcGxh biA9IChQbGFuICopIGNyZWF0ZV90aWRzY2FuX3BsYW4ocm9vdCwKCQkJCQkJCQkJCQkJKFRp ZFBhdGggKikgYmVzdF9wYXRoLAoJCQkJCQkJCQkJCQl0bGlzdCwKCQkJCQkJCQkJCQkJc2Nh bl9jbGF1c2VzKTsKCQkJYnJlYWs7CgoJCWNhc2UgVF9UaWRSYW5nZVNjYW46CgkJCXBsYW4g PSAoUGxhbiAqKSBjcmVhdGVfdGlkcmFuZ2VzY2FuX3BsYW4ocm9vdCwKCQkJCQkJCQkJCQkJ CSAoVGlkUmFuZ2VQYXRoICopIGJlc3RfcGF0aCwKCQkJCQkJCQkJCQkJCSB0bGlzdCwKCQkJ CQkJCQkJCQkJCSBzY2FuX2NsYXVzZXMpOwoJCQlicmVhazsKCgkJY2FzZSBUX1N1YnF1ZXJ5 U2NhbjoKCQkJcGxhbiA9IChQbGFuICopIGNyZWF0ZV9zdWJxdWVyeXNjYW5fcGxhbihyb290 LAoJCQkJCQkJCQkJCQkJIChTdWJxdWVyeVNjYW5QYXRoICopIGJlc3RfcGF0aCwKCQkJCQkJ CQkJCQkJCSB0bGlzdCwKCQkJCQkJCQkJCQkJCSBzY2FuX2NsYXVzZXMpOwoJCQlicmVhazsK CgkJY2FzZSBUX0Z1bmN0aW9uU2NhbjoKCQkJcGxhbiA9IChQbGFuICopIGNyZWF0ZV9mdW5j dGlvbnNjYW5fcGxhbihyb290LAoJCQkJCQkJCQkJCQkJIGJlc3RfcGF0aCwKCQkJCQkJCQkJ CQkJCSB0bGlzdCwKCQkJCQkJCQkJCQkJCSBzY2FuX2NsYXVzZXMpOwoJCQlicmVhazsKCgkJ Y2FzZSBUX1RhYmxlRnVuY1NjYW46CgkJCXBsYW4gPSAoUGxhbiAqKSBjcmVhdGVfdGFibGVm dW5jc2Nhbl9wbGFuKHJvb3QsCgkJCQkJCQkJCQkJCQkgIGJlc3RfcGF0aCwKCQkJCQkJCQkJ CQkJCSAgdGxpc3QsCgkJCQkJCQkJCQkJCQkgIHNjYW5fY2xhdXNlcyk7CgkJCWJyZWFrOwoK CQljYXNlIFRfVmFsdWVzU2NhbjoKCQkJcGxhbiA9IChQbGFuICopIGNyZWF0ZV92YWx1ZXNz Y2FuX3BsYW4ocm9vdCwKCQkJCQkJCQkJCQkJICAgYmVzdF9wYXRoLAoJCQkJCQkJCQkJCQkg ICB0bGlzdCwKCQkJCQkJCQkJCQkJICAgc2Nhbl9jbGF1c2VzKTsKCQkJYnJlYWs7CgoJCWNh c2UgVF9DdGVTY2FuOgoJCQlwbGFuID0gKFBsYW4gKikgY3JlYXRlX2N0ZXNjYW5fcGxhbihy b290LAoJCQkJCQkJCQkJCQliZXN0X3BhdGgsCgkJCQkJCQkJCQkJCXRsaXN0LAoJCQkJCQkJ CQkJCQlzY2FuX2NsYXVzZXMpOwoJCQlicmVhazsKCgkJY2FzZSBUX05hbWVkVHVwbGVzdG9y ZVNjYW46CgkJCXBsYW4gPSAoUGxhbiAqKSBjcmVhdGVfbmFtZWR0dXBsZXN0b3Jlc2Nhbl9w bGFuKHJvb3QsCgkJCQkJCQkJCQkJCQkJCWJlc3RfcGF0aCwKCQkJCQkJCQkJCQkJCQkJdGxp c3QsCgkJCQkJCQkJCQkJCQkJCXNjYW5fY2xhdXNlcyk7CgkJCWJyZWFrOwoKCQljYXNlIFRf UmVzdWx0OgoJCQlwbGFuID0gKFBsYW4gKikgY3JlYXRlX3Jlc3VsdHNjYW5fcGxhbihyb290 LAoJCQkJCQkJCQkJCQkgICBiZXN0X3BhdGgsCgkJCQkJCQkJCQkJCSAgIHRsaXN0LAoJCQkJ CQkJCQkJCQkgICBzY2FuX2NsYXVzZXMpOwoJCQlicmVhazsKCgkJY2FzZSBUX1dvcmtUYWJs ZVNjYW46CgkJCXBsYW4gPSAoUGxhbiAqKSBjcmVhdGVfd29ya3RhYmxlc2Nhbl9wbGFuKHJv b3QsCgkJCQkJCQkJCQkJCQkgIGJlc3RfcGF0aCwKCQkJCQkJCQkJCQkJCSAgdGxpc3QsCgkJ CQkJCQkJCQkJCQkgIHNjYW5fY2xhdXNlcyk7CgkJCWJyZWFrOwoKCQljYXNlIFRfRm9yZWln blNjYW46CgkJCXBsYW4gPSAoUGxhbiAqKSBjcmVhdGVfZm9yZWlnbnNjYW5fcGxhbihyb290 LAoJCQkJCQkJCQkJCQkJKEZvcmVpZ25QYXRoICopIGJlc3RfcGF0aCwKCQkJCQkJCQkJCQkJ CXRsaXN0LAoJCQkJCQkJCQkJCQkJc2Nhbl9jbGF1c2VzKTsKCQkJYnJlYWs7CgoJCWNhc2Ug VF9DdXN0b21TY2FuOgoJCQlwbGFuID0gKFBsYW4gKikgY3JlYXRlX2N1c3RvbXNjYW5fcGxh bihyb290LAoJCQkJCQkJCQkJCQkgICAoQ3VzdG9tUGF0aCAqKSBiZXN0X3BhdGgsCgkJCQkJ CQkJCQkJCSAgIHRsaXN0LAoJCQkJCQkJCQkJCQkgICBzY2FuX2NsYXVzZXMpOwoJCQlicmVh azsKCgkJZGVmYXVsdDoKCQkJZWxvZyhFUlJPUiwgInVucmVjb2duaXplZCBub2RlIHR5cGU6 ICVkIiwKCQkJCSAoaW50KSBiZXN0X3BhdGgtPnBhdGh0eXBlKTsKCQkJcGxhbiA9IE5VTEw7 CQkvKiBrZWVwIGNvbXBpbGVyIHF1aWV0ICovCgkJCWJyZWFrOwoJfQoKCS8qCgkgKiBJZiB0 aGVyZSBhcmUgYW55IHBzZXVkb2NvbnN0YW50IGNsYXVzZXMgYXR0YWNoZWQgdG8gdGhpcyBu b2RlLCBpbnNlcnQgYQoJICogZ2F0aW5nIFJlc3VsdCBub2RlIHRoYXQgZXZhbHVhdGVzIHRo ZSBwc2V1ZG9jb25zdGFudHMgYXMgb25lLXRpbWUKCSAqIHF1YWxzLgoJICovCglpZiAoZ2F0 aW5nX2NsYXVzZXMpCgkJcGxhbiA9IGNyZWF0ZV9nYXRpbmdfcGxhbihyb290LCBiZXN0X3Bh dGgsIHBsYW4sIGdhdGluZ19jbGF1c2VzKTsKCglyZXR1cm4gcGxhbjsKfQoKLyoKICogQnVp bGQgYSB0YXJnZXQgbGlzdCAoaWUsIGEgbGlzdCBvZiBUYXJnZXRFbnRyeSkgZm9yIHRoZSBQ YXRoJ3Mgb3V0cHV0LgogKgogKiBUaGlzIGlzIGFsbW9zdCBqdXN0IG1ha2VfdGxpc3RfZnJv bV9wYXRodGFyZ2V0KCksIGJ1dCB3ZSBhbHNvIGhhdmUgdG8KICogZGVhbCB3aXRoIHJlcGxh Y2luZyBuZXN0bG9vcCBwYXJhbXMuCiAqLwpzdGF0aWMgTGlzdCAqCmJ1aWxkX3BhdGhfdGxp c3QoUGxhbm5lckluZm8gKnJvb3QsIFBhdGggKnBhdGgpCnsKCUxpc3QJICAgKnRsaXN0ID0g TklMOwoJSW5kZXgJICAgKnNvcnRncm91cHJlZnMgPSBwYXRoLT5wYXRodGFyZ2V0LT5zb3J0 Z3JvdXByZWZzOwoJaW50CQkJcmVzbm8gPSAxOwoJTGlzdENlbGwgICAqdjsKCglmb3JlYWNo KHYsIHBhdGgtPnBhdGh0YXJnZXQtPmV4cHJzKQoJewoJCU5vZGUJICAgKm5vZGUgPSAoTm9k ZSAqKSBsZmlyc3Qodik7CgkJVGFyZ2V0RW50cnkgKnRsZTsKCgkJLyoKCQkgKiBJZiBpdCdz IGEgcGFyYW1ldGVyaXplZCBwYXRoLCB0aGVyZSBtaWdodCBiZSBsYXRlcmFsIHJlZmVyZW5j ZXMgaW4KCQkgKiB0aGUgdGxpc3QsIHdoaWNoIG5lZWQgdG8gYmUgcmVwbGFjZWQgd2l0aCBQ YXJhbXMuICBUaGVyZSdzIG5vIG5lZWQKCQkgKiB0byByZW1ha2UgdGhlIFRhcmdldEVudHJ5 IG5vZGVzLCBzbyBhcHBseSB0aGlzIHRvIGVhY2ggbGlzdCBpdGVtCgkJICogc2VwYXJhdGVs eS4KCQkgKi8KCQlpZiAocGF0aC0+cGFyYW1faW5mbykKCQkJbm9kZSA9IHJlcGxhY2VfbmVz dGxvb3BfcGFyYW1zKHJvb3QsIG5vZGUpOwoKCQl0bGUgPSBtYWtlVGFyZ2V0RW50cnkoKEV4 cHIgKikgbm9kZSwKCQkJCQkJCSAgcmVzbm8sCgkJCQkJCQkgIE5VTEwsCgkJCQkJCQkgIGZh bHNlKTsKCQlpZiAoc29ydGdyb3VwcmVmcykKCQkJdGxlLT5yZXNzb3J0Z3JvdXByZWYgPSBz b3J0Z3JvdXByZWZzW3Jlc25vIC0gMV07CgoJCXRsaXN0ID0gbGFwcGVuZCh0bGlzdCwgdGxl KTsKCQlyZXNubysrOwoJfQoJcmV0dXJuIHRsaXN0Owp9CgovKgogKiB1c2VfcGh5c2ljYWxf dGxpc3QKICoJCURlY2lkZSB3aGV0aGVyIHRvIHVzZSBhIHRsaXN0IG1hdGNoaW5nIHJlbGF0 aW9uIHN0cnVjdHVyZSwKICoJCXJhdGhlciB0aGFuIG9ubHkgdGhvc2UgVmFycyBhY3R1YWxs eSByZWZlcmVuY2VkLgogKi8Kc3RhdGljIGJvb2wKdXNlX3BoeXNpY2FsX3RsaXN0KFBsYW5u ZXJJbmZvICpyb290LCBQYXRoICpwYXRoLCBpbnQgZmxhZ3MpCnsKCVJlbE9wdEluZm8gKnJl bCA9IHBhdGgtPnBhcmVudDsKCWludAkJCWk7CglMaXN0Q2VsbCAgICpsYzsKCgkvKgoJICog Rm9yZ2V0IGl0IGlmIGVpdGhlciBleGFjdCB0bGlzdCBvciBzbWFsbCB0bGlzdCBpcyBkZW1h bmRlZC4KCSAqLwoJaWYgKGZsYWdzICYgKENQX0VYQUNUX1RMSVNUIHwgQ1BfU01BTExfVExJ U1QpKQoJCXJldHVybiBmYWxzZTsKCgkvKgoJICogV2UgY2FuIGRvIHRoaXMgZm9yIHJlYWwg cmVsYXRpb24gc2NhbnMsIHN1YnF1ZXJ5IHNjYW5zLCBmdW5jdGlvbiBzY2FucywKCSAqIHRh YmxlZnVuYyBzY2FucywgdmFsdWVzIHNjYW5zLCBhbmQgQ1RFIHNjYW5zIChidXQgbm90IGZv ciwgZWcsIGpvaW5zKS4KCSAqLwoJaWYgKHJlbC0+cnRla2luZCAhPSBSVEVfUkVMQVRJT04g JiYKCQlyZWwtPnJ0ZWtpbmQgIT0gUlRFX1NVQlFVRVJZICYmCgkJcmVsLT5ydGVraW5kICE9 IFJURV9GVU5DVElPTiAmJgoJCXJlbC0+cnRla2luZCAhPSBSVEVfVEFCTEVGVU5DICYmCgkJ cmVsLT5ydGVraW5kICE9IFJURV9WQUxVRVMgJiYKCQlyZWwtPnJ0ZWtpbmQgIT0gUlRFX0NU RSkKCQlyZXR1cm4gZmFsc2U7CgoJLyoKCSAqIENhbid0IGRvIGl0IHdpdGggaW5oZXJpdGFu Y2UgY2FzZXMgZWl0aGVyIChtYWlubHkgYmVjYXVzZSBBcHBlbmQKCSAqIGRvZXNuJ3QgcHJv amVjdDsgdGhpcyB0ZXN0IG1heSBiZSB1bm5lY2Vzc2FyeSBub3cgdGhhdAoJICogY3JlYXRl X2FwcGVuZF9wbGFuIGluc3RydWN0cyBpdHMgY2hpbGRyZW4gdG8gcmV0dXJuIGFuIGV4YWN0 IHRsaXN0KS4KCSAqLwoJaWYgKHJlbC0+cmVsb3B0a2luZCAhPSBSRUxPUFRfQkFTRVJFTCkK CQlyZXR1cm4gZmFsc2U7CgoJLyoKCSAqIEFsc28sIGRvbid0IGRvIGl0IHRvIGEgQ3VzdG9t UGF0aDsgdGhlIHByZW1pc2UgdGhhdCB3ZSdyZSBleHRyYWN0aW5nCgkgKiBjb2x1bW5zIGZy b20gYSBzaW1wbGUgcGh5c2ljYWwgdHVwbGUgaXMgdW5saWtlbHkgdG8gaG9sZCBmb3IgdGhv c2UuCgkgKiAoV2hlbiBpdCBkb2VzIG1ha2Ugc2Vuc2UsIHRoZSBjdXN0b20gcGF0aCBjcmVh dG9yIGNhbiBzZXQgdXAgdGhlIHBhdGgncwoJICogcGF0aHRhcmdldCB0aGF0IHdheS4pCgkg Ki8KCWlmIChJc0EocGF0aCwgQ3VzdG9tUGF0aCkpCgkJcmV0dXJuIGZhbHNlOwoKCS8qCgkg KiBJZiBhIGJpdG1hcCBzY2FuJ3MgdGxpc3QgaXMgZW1wdHksIGtlZXAgaXQgYXMtaXMuICBU aGlzIG1heSBhbGxvdyB0aGUKCSAqIGV4ZWN1dG9yIHRvIHNraXAgaGVhcCBwYWdlIGZldGNo ZXMsIGFuZCBpbiBhbnkgY2FzZSwgdGhlIGJlbmVmaXQgb2YKCSAqIHVzaW5nIGEgcGh5c2lj YWwgdGxpc3QgaW5zdGVhZCB3b3VsZCBiZSBtaW5pbWFsLgoJICovCglpZiAoSXNBKHBhdGgs IEJpdG1hcEhlYXBQYXRoKSAmJgoJCXBhdGgtPnBhdGh0YXJnZXQtPmV4cHJzID09IE5JTCkK CQlyZXR1cm4gZmFsc2U7CgoJLyoKCSAqIENhbid0IGRvIGl0IGlmIGFueSBzeXN0ZW0gY29s dW1ucyBvciB3aG9sZS1yb3cgVmFycyBhcmUgcmVxdWVzdGVkLgoJICogKFRoaXMgY291bGQg cG9zc2libHkgYmUgZml4ZWQgYnV0IHdvdWxkIHRha2Ugc29tZSBmcmFnaWxlIGFzc3VtcHRp b25zCgkgKiBpbiBzZXRyZWZzLmMsIEkgdGhpbmsuKQoJICovCglmb3IgKGkgPSByZWwtPm1p bl9hdHRyOyBpIDw9IDA7IGkrKykKCXsKCQlpZiAoIWJtc19pc19lbXB0eShyZWwtPmF0dHJf bmVlZGVkW2kgLSByZWwtPm1pbl9hdHRyXSkpCgkJCXJldHVybiBmYWxzZTsKCX0KCgkvKgoJ ICogQ2FuJ3QgZG8gaXQgaWYgdGhlIHJlbCBpcyByZXF1aXJlZCB0byBlbWl0IGFueSBwbGFj ZWhvbGRlciBleHByZXNzaW9ucywKCSAqIGVpdGhlci4KCSAqLwoJZm9yZWFjaChsYywgcm9v dC0+cGxhY2Vob2xkZXJfbGlzdCkKCXsKCQlQbGFjZUhvbGRlckluZm8gKnBoaW5mbyA9IChQ bGFjZUhvbGRlckluZm8gKikgbGZpcnN0KGxjKTsKCgkJaWYgKGJtc19ub25lbXB0eV9kaWZm ZXJlbmNlKHBoaW5mby0+cGhfbmVlZGVkLCByZWwtPnJlbGlkcykgJiYKCQkJYm1zX2lzX3N1 YnNldChwaGluZm8tPnBoX2V2YWxfYXQsIHJlbC0+cmVsaWRzKSkKCQkJcmV0dXJuIGZhbHNl OwoJfQoKCS8qCgkgKiBGb3IgYW4gaW5kZXgtb25seSBzY2FuLCB0aGUgInBoeXNpY2FsIHRs aXN0IiBpcyB0aGUgaW5kZXgncyBpbmRleHRsaXN0LgoJICogV2UgY2FuIG9ubHkgcmV0dXJu IHRoYXQgd2l0aG91dCBhIHByb2plY3Rpb24gaWYgYWxsIHRoZSBpbmRleCdzIGNvbHVtbnMK CSAqIGFyZSByZXR1cm5hYmxlLgoJICovCglpZiAocGF0aC0+cGF0aHR5cGUgPT0gVF9JbmRl eE9ubHlTY2FuKQoJewoJCUluZGV4T3B0SW5mbyAqaW5kZXhpbmZvID0gKChJbmRleFBhdGgg KikgcGF0aCktPmluZGV4aW5mbzsKCgkJZm9yIChpID0gMDsgaSA8IGluZGV4aW5mby0+bmNv bHVtbnM7IGkrKykKCQl7CgkJCWlmICghaW5kZXhpbmZvLT5jYW5yZXR1cm5baV0pCgkJCQly ZXR1cm4gZmFsc2U7CgkJfQoJfQoKCS8qCgkgKiBBbHNvLCBjYW4ndCBkbyBpdCBpZiBDUF9M QUJFTF9UTElTVCBpcyBzcGVjaWZpZWQgYW5kIHBhdGggaXMgcmVxdWVzdGVkCgkgKiB0byBl bWl0IGFueSBzb3J0L2dyb3VwIGNvbHVtbnMgdGhhdCBhcmUgbm90IHNpbXBsZSBWYXJzLiAg KElmIHRoZXkgYXJlCgkgKiBzaW1wbGUgVmFycywgdGhleSBzaG91bGQgYXBwZWFyIGluIHRo ZSBwaHlzaWNhbCB0bGlzdCwgYW5kCgkgKiBhcHBseV9wYXRodGFyZ2V0X2xhYmVsaW5nX3Rv X3RsaXN0IHdpbGwgdGFrZSBjYXJlIG9mIGdldHRpbmcgdGhlbQoJICogbGFiZWxlZCBhZ2Fp bi4pCVdlIGFsc28gaGF2ZSB0byBjaGVjayB0aGF0IG5vIHR3byBzb3J0L2dyb3VwIGNvbHVt bnMKCSAqIGFyZSB0aGUgc2FtZSBWYXIsIGVsc2UgdGhhdCBlbGVtZW50IG9mIHRoZSBwaHlz aWNhbCB0bGlzdCB3b3VsZCBuZWVkCgkgKiBjb25mbGljdGluZyByZXNzb3J0Z3JvdXByZWYg bGFiZWxzLgoJICovCglpZiAoKGZsYWdzICYgQ1BfTEFCRUxfVExJU1QpICYmIHBhdGgtPnBh dGh0YXJnZXQtPnNvcnRncm91cHJlZnMpCgl7CgkJQml0bWFwc2V0ICAqc29ydGdyb3VwYXR0 cyA9IE5VTEw7CgoJCWkgPSAwOwoJCWZvcmVhY2gobGMsIHBhdGgtPnBhdGh0YXJnZXQtPmV4 cHJzKQoJCXsKCQkJRXhwcgkgICAqZXhwciA9IChFeHByICopIGxmaXJzdChsYyk7CgoJCQlp ZiAocGF0aC0+cGF0aHRhcmdldC0+c29ydGdyb3VwcmVmc1tpXSkKCQkJewoJCQkJaWYgKGV4 cHIgJiYgSXNBKGV4cHIsIFZhcikpCgkJCQl7CgkJCQkJaW50CQkJYXR0bm8gPSAoKFZhciAq KSBleHByKS0+dmFyYXR0bm87CgoJCQkJCWF0dG5vIC09IEZpcnN0TG93SW52YWxpZEhlYXBB dHRyaWJ1dGVOdW1iZXI7CgkJCQkJaWYgKGJtc19pc19tZW1iZXIoYXR0bm8sIHNvcnRncm91 cGF0dHMpKQoJCQkJCQlyZXR1cm4gZmFsc2U7CgkJCQkJc29ydGdyb3VwYXR0cyA9IGJtc19h ZGRfbWVtYmVyKHNvcnRncm91cGF0dHMsIGF0dG5vKTsKCQkJCX0KCQkJCWVsc2UKCQkJCQly ZXR1cm4gZmFsc2U7CgkJCX0KCQkJaSsrOwoJCX0KCX0KCglyZXR1cm4gdHJ1ZTsKfQoKLyoK ICogZ2V0X2dhdGluZ19xdWFscwogKgkgIFNlZSBpZiB0aGVyZSBhcmUgcHNldWRvY29uc3Rh bnQgcXVhbHMgaW4gYSBub2RlJ3MgcXVhbHMgbGlzdAogKgogKiBJZiB0aGUgbm9kZSdzIHF1 YWxzIGxpc3QgaW5jbHVkZXMgYW55IHBzZXVkb2NvbnN0YW50IHF1YWxzLAogKiByZXR1cm4g anVzdCB0aG9zZSBxdWFscy4KICovCnN0YXRpYyBMaXN0ICoKZ2V0X2dhdGluZ19xdWFscyhQ bGFubmVySW5mbyAqcm9vdCwgTGlzdCAqcXVhbHMpCnsKCS8qIE5vIG5lZWQgdG8gbG9vayBp ZiB3ZSBrbm93IHRoZXJlIGFyZSBubyBwc2V1ZG9jb25zdGFudHMgKi8KCWlmICghcm9vdC0+ aGFzUHNldWRvQ29uc3RhbnRRdWFscykKCQlyZXR1cm4gTklMOwoKCS8qIFNvcnQgaW50byBk ZXNpcmFibGUgZXhlY3V0aW9uIG9yZGVyIHdoaWxlIHN0aWxsIGluIFJlc3RyaWN0SW5mbyBm b3JtICovCglxdWFscyA9IG9yZGVyX3F1YWxfY2xhdXNlcyhyb290LCBxdWFscyk7CgoJLyog UHVsbCBvdXQgYW55IHBzZXVkb2NvbnN0YW50IHF1YWxzIGZyb20gdGhlIFJlc3RyaWN0SW5m byBsaXN0ICovCglyZXR1cm4gZXh0cmFjdF9hY3R1YWxfY2xhdXNlcyhxdWFscywgdHJ1ZSk7 Cn0KCi8qCiAqIGNyZWF0ZV9nYXRpbmdfcGxhbgogKgkgIERlYWwgd2l0aCBwc2V1ZG9jb25z dGFudCBxdWFsIGNsYXVzZXMKICoKICogQWRkIGEgZ2F0aW5nIFJlc3VsdCBub2RlIGF0b3Ag dGhlIGFscmVhZHktYnVpbHQgcGxhbi4KICovCnN0YXRpYyBQbGFuICoKY3JlYXRlX2dhdGlu Z19wbGFuKFBsYW5uZXJJbmZvICpyb290LCBQYXRoICpwYXRoLCBQbGFuICpwbGFuLAoJCQkJ ICAgTGlzdCAqZ2F0aW5nX3F1YWxzKQp7CglSZXN1bHQJICAgKmdwbGFuOwoKCUFzc2VydChn YXRpbmdfcXVhbHMpOwoKCS8qCgkgKiBTaW5jZSB3ZSBuZWVkIGEgUmVzdWx0IG5vZGUgYW55 d2F5LCBhbHdheXMgcmV0dXJuIHRoZSBwYXRoJ3MgcmVxdWVzdGVkCgkgKiB0bGlzdDsgdGhh dCdzIG5ldmVyIGEgd3JvbmcgY2hvaWNlLCBldmVuIGlmIHRoZSBwYXJlbnQgbm9kZSBkaWRu J3QgYXNrCgkgKiBmb3IgQ1BfRVhBQ1RfVExJU1QuCgkgKi8KCWdwbGFuID0gbWFrZV9nYXRp bmdfcmVzdWx0KGJ1aWxkX3BhdGhfdGxpc3Qocm9vdCwgcGF0aCksCgkJCQkJCQkgICAoTm9k ZSAqKSBnYXRpbmdfcXVhbHMsIHBsYW4pOwoKCS8qCgkgKiBXZSBtaWdodCBoYXZlIGhhZCBh IHRyaXZpYWwgUmVzdWx0IHBsYW4gYWxyZWFkeS4gIFN0YWNraW5nIG9uZSBSZXN1bHQKCSAq IGF0b3AgYW5vdGhlciBpcyBzaWxseSwgc28gaWYgdGhhdCBhcHBsaWVzLCBqdXN0IGRpc2Nh cmQgdGhlIGlucHV0IHBsYW4uCgkgKiAoV2UncmUgYXNzdW1pbmcgaXRzIHRhcmdldGxpc3Qg aXMgdW5pbnRlcmVzdGluZzsgaXQgc2hvdWxkIGJlIGVpdGhlcgoJICogdGhlIHNhbWUgYXMg dGhlIHJlc3VsdCBvZiBidWlsZF9wYXRoX3RsaXN0LCBvciBhIHNpbXBsaWZpZWQgdmVyc2lv bi4KCSAqIEhvd2V2ZXIsIHdlIHByZXNlcnZlIHRoZSBzZXQgb2YgcmVsaWRzIHRoYXQgaXQg cHVycG9ydHMgdG8gc2NhbiBhbmQKCSAqIGF0dHJpYnV0ZSB0aGF0IHRvIG91ciByZXBsYWNl bWVudCBSZXN1bHQgaW5zdGVhZCwgYW5kIGxpa2V3aXNlIGZvciB0aGUKCSAqIHJlc3VsdF90 eXBlLikKCSAqLwoJaWYgKElzQShwbGFuLCBSZXN1bHQpKQoJewoJCVJlc3VsdAkgICAqcnBs YW4gPSAoUmVzdWx0ICopIHBsYW47CgoJCWdwbGFuLT5wbGFuLmxlZnR0cmVlID0gTlVMTDsK CQlncGxhbi0+cmVsaWRzID0gcnBsYW4tPnJlbGlkczsKCQlncGxhbi0+cmVzdWx0X3R5cGUg PSBycGxhbi0+cmVzdWx0X3R5cGU7Cgl9CgoJLyoKCSAqIE5vdGljZSB0aGF0IHdlIGRvbid0 IGNoYW5nZSBjb3N0IG9yIHNpemUgZXN0aW1hdGVzIHdoZW4gZG9pbmcgZ2F0aW5nLgoJICog VGhlIGNvc3RzIG9mIHF1YWwgZXZhbCB3ZXJlIGFscmVhZHkgaW5jbHVkZWQgaW4gdGhlIHN1 YnBsYW4ncyBjb3N0LgoJICogTGVhdmluZyB0aGUgc2l6ZSBhbG9uZSBhbW91bnRzIHRvIGFz c3VtaW5nIHRoYXQgdGhlIGdhdGluZyBxdWFsIHdpbGwKCSAqIHN1Y2NlZWQsIHdoaWNoIGlz IHRoZSBjb25zZXJ2YXRpdmUgZXN0aW1hdGUgZm9yIHBsYW5uaW5nIHVwcGVyIHF1ZXJpZXMu CgkgKiBXZSBjZXJ0YWlubHkgZG9uJ3Qgd2FudCB0byBhc3N1bWUgdGhlIG91dHB1dCBzaXpl IGlzIHplcm8gKHVubGVzcyB0aGUKCSAqIGdhdGluZyBxdWFsIGlzIGFjdHVhbGx5IGNvbnN0 YW50IEZBTFNFLCBhbmQgdGhhdCBjYXNlIGlzIGRlYWx0IHdpdGggaW4KCSAqIGNsYXVzZXNl bC5jKS4gIEludGVycG9sYXRpbmcgYmV0d2VlbiB0aGUgdHdvIGNhc2VzIGlzIHNpbGx5LCBi ZWNhdXNlIGl0CgkgKiBkb2Vzbid0IHJlZmxlY3Qgd2hhdCB3aWxsIHJlYWxseSBoYXBwZW4g YXQgcnVudGltZSwgYW5kIGJlc2lkZXMgd2hpY2gKCSAqIGluIG1vc3QgY2FzZXMgd2UgaGF2 ZSBvbmx5IGEgdmVyeSBiYWQgaWRlYSBvZiB0aGUgcHJvYmFiaWxpdHkgb2YgdGhlCgkgKiBn YXRpbmcgcXVhbCBiZWluZyB0cnVlLgoJICovCgljb3B5X3BsYW5fY29zdHNpemUoJmdwbGFu LT5wbGFuLCBwbGFuKTsKCgkvKiBHYXRpbmcgcXVhbHMgY291bGQgYmUgdW5zYWZlLCBzbyBi ZXR0ZXIgdXNlIHRoZSBQYXRoJ3Mgc2FmZXR5IGZsYWcgKi8KCWdwbGFuLT5wbGFuLnBhcmFs bGVsX3NhZmUgPSBwYXRoLT5wYXJhbGxlbF9zYWZlOwoKCXJldHVybiAmZ3BsYW4tPnBsYW47 Cn0KCi8qCiAqIGNyZWF0ZV9qb2luX3BsYW4KICoJICBDcmVhdGUgYSBqb2luIHBsYW4gZm9y ICdiZXN0X3BhdGgnIGFuZCAocmVjdXJzaXZlbHkpIHBsYW5zIGZvciBpdHMKICoJICBpbm5l ciBhbmQgb3V0ZXIgcGF0aHMuCiAqLwpzdGF0aWMgUGxhbiAqCmNyZWF0ZV9qb2luX3BsYW4o UGxhbm5lckluZm8gKnJvb3QsIEpvaW5QYXRoICpiZXN0X3BhdGgpCnsKCVBsYW4JICAgKnBs YW47CglMaXN0CSAgICpnYXRpbmdfY2xhdXNlczsKCglzd2l0Y2ggKGJlc3RfcGF0aC0+cGF0 aC5wYXRodHlwZSkKCXsKCQljYXNlIFRfTWVyZ2VKb2luOgoJCQlwbGFuID0gKFBsYW4gKikg Y3JlYXRlX21lcmdlam9pbl9wbGFuKHJvb3QsCgkJCQkJCQkJCQkJCSAgKE1lcmdlUGF0aCAq KSBiZXN0X3BhdGgpOwoJCQlicmVhazsKCQljYXNlIFRfSGFzaEpvaW46CgkJCXBsYW4gPSAo UGxhbiAqKSBjcmVhdGVfaGFzaGpvaW5fcGxhbihyb290LAoJCQkJCQkJCQkJCQkgKEhhc2hQ YXRoICopIGJlc3RfcGF0aCk7CgkJCWJyZWFrOwoJCWNhc2UgVF9OZXN0TG9vcDoKCQkJcGxh biA9IChQbGFuICopIGNyZWF0ZV9uZXN0bG9vcF9wbGFuKHJvb3QsCgkJCQkJCQkJCQkJCSAo TmVzdFBhdGggKikgYmVzdF9wYXRoKTsKCQkJYnJlYWs7CgkJZGVmYXVsdDoKCQkJZWxvZyhF UlJPUiwgInVucmVjb2duaXplZCBub2RlIHR5cGU6ICVkIiwKCQkJCSAoaW50KSBiZXN0X3Bh dGgtPnBhdGgucGF0aHR5cGUpOwoJCQlwbGFuID0gTlVMTDsJCS8qIGtlZXAgY29tcGlsZXIg cXVpZXQgKi8KCQkJYnJlYWs7Cgl9CgoJLyoKCSAqIElmIHRoZXJlIGFyZSBhbnkgcHNldWRv Y29uc3RhbnQgY2xhdXNlcyBhdHRhY2hlZCB0byB0aGlzIG5vZGUsIGluc2VydCBhCgkgKiBn YXRpbmcgUmVzdWx0IG5vZGUgdGhhdCBldmFsdWF0ZXMgdGhlIHBzZXVkb2NvbnN0YW50cyBh cyBvbmUtdGltZQoJICogcXVhbHMuCgkgKi8KCWdhdGluZ19jbGF1c2VzID0gZ2V0X2dhdGlu Z19xdWFscyhyb290LCBiZXN0X3BhdGgtPmpvaW5yZXN0cmljdGluZm8pOwoJaWYgKGdhdGlu Z19jbGF1c2VzKQoJCXBsYW4gPSBjcmVhdGVfZ2F0aW5nX3BsYW4ocm9vdCwgKFBhdGggKikg YmVzdF9wYXRoLCBwbGFuLAoJCQkJCQkJCSAgZ2F0aW5nX2NsYXVzZXMpOwoKI2lmZGVmIE5P VF9VU0VECgoJLyoKCSAqICogRXhwZW5zaXZlIGZ1bmN0aW9uIHB1bGx1cHMgbWF5IGhhdmUg cHVsbGVkIGxvY2FsIHByZWRpY2F0ZXMgKiBpbnRvCgkgKiB0aGlzIHBhdGggbm9kZS4gIFB1 dCB0aGVtIGluIHRoZSBxcHF1YWwgb2YgdGhlIHBsYW4gbm9kZS4gKiBKTUgsCgkgKiA2LzE1 LzkyCgkgKi8KCWlmIChnZXRfbG9jX3Jlc3RyaWN0aW5mbyhiZXN0X3BhdGgpICE9IE5JTCkK CQlzZXRfcXBxdWFsKChQbGFuKSBwbGFuLAoJCQkJICAgbGlzdF9jb25jYXQoZ2V0X3FwcXVh bCgoUGxhbikgcGxhbiksCgkJCQkJCQkgICBnZXRfYWN0dWFsX2NsYXVzZXMoZ2V0X2xvY19y ZXN0cmljdGluZm8oYmVzdF9wYXRoKSkpKTsKI2VuZGlmCgoJcmV0dXJuIHBsYW47Cn0KCi8q CiAqIG1hcmtfYXN5bmNfY2FwYWJsZV9wbGFuCiAqCQlDaGVjayB3aGV0aGVyIHRoZSBQbGFu IG5vZGUgY3JlYXRlZCBmcm9tIGEgUGF0aCBub2RlIGlzIGFzeW5jLWNhcGFibGUsCiAqCQlh bmQgaWYgc28sIG1hcmsgdGhlIFBsYW4gbm9kZSBhcyBzdWNoIGFuZCByZXR1cm4gdHJ1ZSwg b3RoZXJ3aXNlCiAqCQlyZXR1cm4gZmFsc2UuCiAqLwpzdGF0aWMgYm9vbAptYXJrX2FzeW5j X2NhcGFibGVfcGxhbihQbGFuICpwbGFuLCBQYXRoICpwYXRoKQp7Cglzd2l0Y2ggKG5vZGVU YWcocGF0aCkpCgl7CgkJY2FzZSBUX1N1YnF1ZXJ5U2NhblBhdGg6CgkJCXsKCQkJCVN1YnF1 ZXJ5U2NhbiAqc2Nhbl9wbGFuID0gKFN1YnF1ZXJ5U2NhbiAqKSBwbGFuOwoKCQkJCS8qCgkJ CQkgKiBJZiB0aGUgZ2VuZXJhdGVkIHBsYW4gbm9kZSBpbmNsdWRlcyBhIGdhdGluZyBSZXN1 bHQgbm9kZSwKCQkJCSAqIHdlIGNhbid0IGV4ZWN1dGUgaXQgYXN5bmNocm9ub3VzbHkuCgkJ CQkgKi8KCQkJCWlmIChJc0EocGxhbiwgUmVzdWx0KSkKCQkJCQlyZXR1cm4gZmFsc2U7CgoJ CQkJLyoKCQkJCSAqIElmIGEgU3VicXVlcnlTY2FuIG5vZGUgYXRvcCBvZiBhbiBhc3luYy1j YXBhYmxlIHBsYW4gbm9kZQoJCQkJICogaXMgZGVsZXRhYmxlLCBjb25zaWRlciBpdCBhcyBh c3luYy1jYXBhYmxlLgoJCQkJICovCgkJCQlpZiAodHJpdmlhbF9zdWJxdWVyeXNjYW4oc2Nh bl9wbGFuKSAmJgoJCQkJCW1hcmtfYXN5bmNfY2FwYWJsZV9wbGFuKHNjYW5fcGxhbi0+c3Vi cGxhbiwKCQkJCQkJCQkJCQkoKFN1YnF1ZXJ5U2NhblBhdGggKikgcGF0aCktPnN1YnBhdGgp KQoJCQkJCWJyZWFrOwoJCQkJcmV0dXJuIGZhbHNlOwoJCQl9CgkJY2FzZSBUX0ZvcmVpZ25Q YXRoOgoJCQl7CgkJCQlGZHdSb3V0aW5lICpmZHdyb3V0aW5lID0gcGF0aC0+cGFyZW50LT5m ZHdyb3V0aW5lOwoKCQkJCS8qCgkJCQkgKiBJZiB0aGUgZ2VuZXJhdGVkIHBsYW4gbm9kZSBp bmNsdWRlcyBhIGdhdGluZyBSZXN1bHQgbm9kZSwKCQkJCSAqIHdlIGNhbid0IGV4ZWN1dGUg aXQgYXN5bmNocm9ub3VzbHkuCgkJCQkgKi8KCQkJCWlmIChJc0EocGxhbiwgUmVzdWx0KSkK CQkJCQlyZXR1cm4gZmFsc2U7CgoJCQkJQXNzZXJ0KGZkd3JvdXRpbmUgIT0gTlVMTCk7CgkJ CQlpZiAoZmR3cm91dGluZS0+SXNGb3JlaWduUGF0aEFzeW5jQ2FwYWJsZSAhPSBOVUxMICYm CgkJCQkJZmR3cm91dGluZS0+SXNGb3JlaWduUGF0aEFzeW5jQ2FwYWJsZSgoRm9yZWlnblBh dGggKikgcGF0aCkpCgkJCQkJYnJlYWs7CgkJCQlyZXR1cm4gZmFsc2U7CgkJCX0KCQljYXNl IFRfUHJvamVjdGlvblBhdGg6CgoJCQkvKgoJCQkgKiBJZiB0aGUgZ2VuZXJhdGVkIHBsYW4g bm9kZSBpbmNsdWRlcyBhIFJlc3VsdCBub2RlIGZvciB0aGUKCQkJICogcHJvamVjdGlvbiwg d2UgY2FuJ3QgZXhlY3V0ZSBpdCBhc3luY2hyb25vdXNseS4KCQkJICovCgkJCWlmIChJc0Eo cGxhbiwgUmVzdWx0KSkKCQkJCXJldHVybiBmYWxzZTsKCgkJCS8qCgkJCSAqIGNyZWF0ZV9w cm9qZWN0aW9uX3BsYW4oKSB3b3VsZCBoYXZlIHB1bGxlZCB1cCB0aGUgc3VicGxhbiwgc28K CQkJICogY2hlY2sgdGhlIGNhcGFiaWxpdHkgdXNpbmcgdGhlIHN1YnBhdGguCgkJCSAqLwoJ CQlpZiAobWFya19hc3luY19jYXBhYmxlX3BsYW4ocGxhbiwKCQkJCQkJCQkJCSgoUHJvamVj dGlvblBhdGggKikgcGF0aCktPnN1YnBhdGgpKQoJCQkJcmV0dXJuIHRydWU7CgkJCXJldHVy biBmYWxzZTsKCQlkZWZhdWx0OgoJCQlyZXR1cm4gZmFsc2U7Cgl9CgoJcGxhbi0+YXN5bmNf Y2FwYWJsZSA9IHRydWU7CgoJcmV0dXJuIHRydWU7Cn0KCi8qCiAqIGNyZWF0ZV9hcHBlbmRf cGxhbgogKgkgIENyZWF0ZSBhbiBBcHBlbmQgcGxhbiBmb3IgJ2Jlc3RfcGF0aCcgYW5kIChy ZWN1cnNpdmVseSkgcGxhbnMKICoJICBmb3IgaXRzIHN1YnBhdGhzLgogKgogKgkgIFJldHVy bnMgYSBQbGFuIG5vZGUuCiAqLwpzdGF0aWMgUGxhbiAqCmNyZWF0ZV9hcHBlbmRfcGxhbihQ bGFubmVySW5mbyAqcm9vdCwgQXBwZW5kUGF0aCAqYmVzdF9wYXRoLCBpbnQgZmxhZ3MpCnsK CUFwcGVuZAkgICAqcGxhbjsKCUxpc3QJICAgKnRsaXN0ID0gYnVpbGRfcGF0aF90bGlzdChy b290LCAmYmVzdF9wYXRoLT5wYXRoKTsKCWludAkJCW9yaWdfdGxpc3RfbGVuZ3RoID0gbGlz dF9sZW5ndGgodGxpc3QpOwoJYm9vbAkJdGxpc3Rfd2FzX2NoYW5nZWQgPSBmYWxzZTsKCUxp c3QJICAgKnBhdGhrZXlzID0gYmVzdF9wYXRoLT5wYXRoLnBhdGhrZXlzOwoJTGlzdAkgICAq c3VicGxhbnMgPSBOSUw7CglMaXN0Q2VsbCAgICpzdWJwYXRoczsKCWludAkJCW5hc3luY3Bs YW5zID0gMDsKCVJlbE9wdEluZm8gKnJlbCA9IGJlc3RfcGF0aC0+cGF0aC5wYXJlbnQ7Cglp bnQJCQlub2RlbnVtc29ydGtleXMgPSAwOwoJQXR0ck51bWJlciAqbm9kZVNvcnRDb2xJZHgg PSBOVUxMOwoJT2lkCQkgICAqbm9kZVNvcnRPcGVyYXRvcnMgPSBOVUxMOwoJT2lkCQkgICAq bm9kZUNvbGxhdGlvbnMgPSBOVUxMOwoJYm9vbAkgICAqbm9kZU51bGxzRmlyc3QgPSBOVUxM OwoJYm9vbAkJY29uc2lkZXJfYXN5bmMgPSBmYWxzZTsKCgkvKgoJICogVGhlIHN1YnBhdGhz IGxpc3QgY291bGQgYmUgZW1wdHksIGlmIGV2ZXJ5IGNoaWxkIHdhcyBwcm92ZW4gZW1wdHkg YnkKCSAqIGNvbnN0cmFpbnQgZXhjbHVzaW9uLiAgSW4gdGhhdCBjYXNlIGdlbmVyYXRlIGEg ZHVtbXkgcGxhbiB0aGF0IHJldHVybnMKCSAqIG5vIHJvd3MuCgkgKgoJICogTm90ZSB0aGF0 IGFuIEFwcGVuZFBhdGggd2l0aCBubyBtZW1iZXJzIGlzIGFsc28gZ2VuZXJhdGVkIGluIGNl cnRhaW4KCSAqIGNhc2VzIHdoZXJlIHRoZXJlIHdhcyBubyBhcHBlbmRpbmcgY29uc3RydWN0 IGF0IGFsbCwgYnV0IHdlIGtub3cgdGhlCgkgKiByZWxhdGlvbiBpcyBlbXB0eSAoc2VlIHNl dF9kdW1teV9yZWxfcGF0aGxpc3QgYW5kIG1hcmtfZHVtbXlfcmVsKS4KCSAqLwoJaWYgKGJl c3RfcGF0aC0+c3VicGF0aHMgPT0gTklMKQoJewoJCS8qIEdlbmVyYXRlIGEgUmVzdWx0IHBs YW4gd2l0aCBjb25zdGFudC1GQUxTRSBnYXRpbmcgcXVhbCAqLwoJCVBsYW4JICAgKnBsYW47 CgoJCXBsYW4gPSAoUGxhbiAqKSBtYWtlX29uZV9yb3dfcmVzdWx0KHRsaXN0LAoJCQkJCQkJ CQkJCShOb2RlICopIGxpc3RfbWFrZTEobWFrZUJvb2xDb25zdChmYWxzZSwKCQkJCQkJCQkJ CQkJCQkJCQkJCSAgZmFsc2UpKSwKCQkJCQkJCQkJCQliZXN0X3BhdGgtPnBhdGgucGFyZW50 KTsKCgkJY29weV9nZW5lcmljX3BhdGhfaW5mbyhwbGFuLCAoUGF0aCAqKSBiZXN0X3BhdGgp OwoKCQlyZXR1cm4gcGxhbjsKCX0KCgkvKgoJICogT3RoZXJ3aXNlIGJ1aWxkIGFuIEFwcGVu ZCBwbGFuLiAgTm90ZSB0aGF0IGlmIHRoZXJlJ3MganVzdCBvbmUgY2hpbGQsCgkgKiB0aGUg QXBwZW5kIGlzIHByZXR0eSB1c2VsZXNzOyBidXQgd2Ugd2FpdCB0aWxsIHNldHJlZnMuYyB0 byBnZXQgcmlkIG9mCgkgKiBpdC4gIERvaW5nIHNvIGhlcmUgZG9lc24ndCB3b3JrIGJlY2F1 c2UgdGhlIHZhcm5vIG9mIHRoZSBjaGlsZCBzY2FuCgkgKiBwbGFuIHdvbid0IG1hdGNoIHRo ZSBwYXJlbnQtcmVsIFZhcnMgaXQnbGwgYmUgYXNrZWQgdG8gZW1pdC4KCSAqCgkgKiBXZSBk b24ndCBoYXZlIHRoZSBhY3R1YWwgY3JlYXRpb24gb2YgdGhlIEFwcGVuZCBub2RlIHNwbGl0 IG91dCBpbnRvIGEKCSAqIHNlcGFyYXRlIG1ha2VfeHh4IGZ1bmN0aW9uLiAgVGhpcyBpcyBi ZWNhdXNlIHdlIHdhbnQgdG8gcnVuCgkgKiBwcmVwYXJlX3NvcnRfZnJvbV9wYXRoa2V5cyBv biBpdCBiZWZvcmUgd2UgZG8gc28gb24gdGhlIGluZGl2aWR1YWwKCSAqIGNoaWxkIHBsYW5z LCB0byBtYWtlIGNyb3NzLWNoZWNraW5nIHRoZSBzb3J0IGluZm8gZWFzaWVyLgoJICovCglw bGFuID0gbWFrZU5vZGUoQXBwZW5kKTsKCXBsYW4tPnBsYW4udGFyZ2V0bGlzdCA9IHRsaXN0 OwoJcGxhbi0+cGxhbi5xdWFsID0gTklMOwoJcGxhbi0+cGxhbi5sZWZ0dHJlZSA9IE5VTEw7 CglwbGFuLT5wbGFuLnJpZ2h0dHJlZSA9IE5VTEw7CglwbGFuLT5hcHByZWxpZHMgPSByZWwt PnJlbGlkczsKCXBsYW4tPmNoaWxkX2FwcGVuZF9yZWxpZF9zZXRzID0gYmVzdF9wYXRoLT5j aGlsZF9hcHBlbmRfcmVsaWRfc2V0czsKCglpZiAocGF0aGtleXMgIT0gTklMKQoJewoJCS8q CgkJICogQ29tcHV0ZSBzb3J0IGNvbHVtbiBpbmZvLCBhbmQgYWRqdXN0IHRoZSBBcHBlbmQn cyB0bGlzdCBhcyBuZWVkZWQuCgkJICogQmVjYXVzZSB3ZSBwYXNzIGFkanVzdF90bGlzdF9p bl9wbGFjZSA9IHRydWUsIHdlIG1heSBpZ25vcmUgdGhlCgkJICogZnVuY3Rpb24gcmVzdWx0 OyBpdCBtdXN0IGJlIHRoZSBzYW1lIHBsYW4gbm9kZS4gIEhvd2V2ZXIsIHdlIHRoZW4KCQkg KiBuZWVkIHRvIGRldGVjdCB3aGV0aGVyIGFueSB0bGlzdCBlbnRyaWVzIHdlcmUgYWRkZWQu CgkJICovCgkJKHZvaWQpIHByZXBhcmVfc29ydF9mcm9tX3BhdGhrZXlzKChQbGFuICopIHBs YW4sIHBhdGhrZXlzLAoJCQkJCQkJCQkJICBiZXN0X3BhdGgtPnBhdGgucGFyZW50LT5yZWxp ZHMsCgkJCQkJCQkJCQkgIE5VTEwsCgkJCQkJCQkJCQkgIHRydWUsCgkJCQkJCQkJCQkgICZu b2RlbnVtc29ydGtleXMsCgkJCQkJCQkJCQkgICZub2RlU29ydENvbElkeCwKCQkJCQkJCQkJ CSAgJm5vZGVTb3J0T3BlcmF0b3JzLAoJCQkJCQkJCQkJICAmbm9kZUNvbGxhdGlvbnMsCgkJ CQkJCQkJCQkgICZub2RlTnVsbHNGaXJzdCk7CgkJdGxpc3Rfd2FzX2NoYW5nZWQgPSAob3Jp Z190bGlzdF9sZW5ndGggIT0gbGlzdF9sZW5ndGgocGxhbi0+cGxhbi50YXJnZXRsaXN0KSk7 Cgl9CgoJLyogSWYgYXBwcm9wcmlhdGUsIGNvbnNpZGVyIGFzeW5jIGFwcGVuZCAqLwoJY29u c2lkZXJfYXN5bmMgPSAoZW5hYmxlX2FzeW5jX2FwcGVuZCAmJiBwYXRoa2V5cyA9PSBOSUwg JiYKCQkJCQkgICFiZXN0X3BhdGgtPnBhdGgucGFyYWxsZWxfc2FmZSAmJgoJCQkJCSAgbGlz dF9sZW5ndGgoYmVzdF9wYXRoLT5zdWJwYXRocykgPiAxKTsKCgkvKiBCdWlsZCB0aGUgcGxh biBmb3IgZWFjaCBjaGlsZCAqLwoJZm9yZWFjaChzdWJwYXRocywgYmVzdF9wYXRoLT5zdWJw YXRocykKCXsKCQlQYXRoCSAgICpzdWJwYXRoID0gKFBhdGggKikgbGZpcnN0KHN1YnBhdGhz KTsKCQlQbGFuCSAgICpzdWJwbGFuOwoKCQkvKiBNdXN0IGluc2lzdCB0aGF0IGFsbCBjaGls ZHJlbiByZXR1cm4gdGhlIHNhbWUgdGxpc3QgKi8KCQlzdWJwbGFuID0gY3JlYXRlX3BsYW5f cmVjdXJzZShyb290LCBzdWJwYXRoLCBDUF9FWEFDVF9UTElTVCk7CgoJCS8qCgkJICogRm9y IG9yZGVyZWQgQXBwZW5kcywgd2UgbXVzdCBpbnNlcnQgYSBTb3J0IG5vZGUgaWYgc3VicGxh biBpc24ndAoJCSAqIHN1ZmZpY2llbnRseSBvcmRlcmVkLgoJCSAqLwoJCWlmIChwYXRoa2V5 cyAhPSBOSUwpCgkJewoJCQlpbnQJCQludW1zb3J0a2V5czsKCQkJQXR0ck51bWJlciAqc29y dENvbElkeDsKCQkJT2lkCQkgICAqc29ydE9wZXJhdG9yczsKCQkJT2lkCQkgICAqY29sbGF0 aW9uczsKCQkJYm9vbAkgICAqbnVsbHNGaXJzdDsKCQkJaW50CQkJcHJlc29ydGVkX2tleXM7 CgoJCQkvKgoJCQkgKiBDb21wdXRlIHNvcnQgY29sdW1uIGluZm8sIGFuZCBhZGp1c3Qgc3Vi cGxhbidzIHRsaXN0IGFzIG5lZWRlZC4KCQkJICogV2UgbXVzdCBhcHBseSBwcmVwYXJlX3Nv cnRfZnJvbV9wYXRoa2V5cyBldmVuIHRvIHN1YnBsYW5zIHRoYXQKCQkJICogZG9uJ3QgbmVl ZCBhbiBleHBsaWNpdCBzb3J0LCB0byBtYWtlIHN1cmUgdGhleSBhcmUgcmV0dXJuaW5nCgkJ CSAqIHRoZSBzYW1lIHNvcnQga2V5IGNvbHVtbnMgdGhlIEFwcGVuZCBleHBlY3RzLgoJCQkg Ki8KCQkJc3VicGxhbiA9IHByZXBhcmVfc29ydF9mcm9tX3BhdGhrZXlzKHN1YnBsYW4sIHBh dGhrZXlzLAoJCQkJCQkJCQkJCQkgc3VicGF0aC0+cGFyZW50LT5yZWxpZHMsCgkJCQkJCQkJ CQkJCSBub2RlU29ydENvbElkeCwKCQkJCQkJCQkJCQkJIGZhbHNlLAoJCQkJCQkJCQkJCQkg Jm51bXNvcnRrZXlzLAoJCQkJCQkJCQkJCQkgJnNvcnRDb2xJZHgsCgkJCQkJCQkJCQkJCSAm c29ydE9wZXJhdG9ycywKCQkJCQkJCQkJCQkJICZjb2xsYXRpb25zLAoJCQkJCQkJCQkJCQkg Jm51bGxzRmlyc3QpOwoKCQkJLyoKCQkJICogQ2hlY2sgdGhhdCB3ZSBnb3QgdGhlIHNhbWUg c29ydCBrZXkgaW5mb3JtYXRpb24uICBXZSBqdXN0CgkJCSAqIEFzc2VydCB0aGF0IHRoZSBz b3J0b3BzIG1hdGNoLCBzaW5jZSB0aG9zZSBkZXBlbmQgb25seSBvbiB0aGUKCQkJICogcGF0 aGtleXM7IGJ1dCBpdCBzZWVtcyBsaWtlIGEgZ29vZCBpZGVhIHRvIGNoZWNrIHRoZSBzb3J0 CgkJCSAqIGNvbHVtbiBudW1iZXJzIGV4cGxpY2l0bHksIHRvIGVuc3VyZSB0aGUgdGxpc3Rz IG1hdGNoIHVwLgoJCQkgKi8KCQkJQXNzZXJ0KG51bXNvcnRrZXlzID09IG5vZGVudW1zb3J0 a2V5cyk7CgkJCWlmIChtZW1jbXAoc29ydENvbElkeCwgbm9kZVNvcnRDb2xJZHgsCgkJCQkJ ICAgbnVtc29ydGtleXMgKiBzaXplb2YoQXR0ck51bWJlcikpICE9IDApCgkJCQllbG9nKEVS Uk9SLCAiQXBwZW5kIGNoaWxkJ3MgdGFyZ2V0bGlzdCBkb2Vzbid0IG1hdGNoIEFwcGVuZCIp OwoJCQlBc3NlcnQobWVtY21wKHNvcnRPcGVyYXRvcnMsIG5vZGVTb3J0T3BlcmF0b3JzLAoJ CQkJCQkgIG51bXNvcnRrZXlzICogc2l6ZW9mKE9pZCkpID09IDApOwoJCQlBc3NlcnQobWVt Y21wKGNvbGxhdGlvbnMsIG5vZGVDb2xsYXRpb25zLAoJCQkJCQkgIG51bXNvcnRrZXlzICog c2l6ZW9mKE9pZCkpID09IDApOwoJCQlBc3NlcnQobWVtY21wKG51bGxzRmlyc3QsIG5vZGVO dWxsc0ZpcnN0LAoJCQkJCQkgIG51bXNvcnRrZXlzICogc2l6ZW9mKGJvb2wpKSA9PSAwKTsK CgkJCS8qIE5vdywgaW5zZXJ0IGEgU29ydCBub2RlIGlmIHN1YnBsYW4gaXNuJ3Qgc3VmZmlj aWVudGx5IG9yZGVyZWQgKi8KCQkJaWYgKCFwYXRoa2V5c19jb3VudF9jb250YWluZWRfaW4o cGF0aGtleXMsIHN1YnBhdGgtPnBhdGhrZXlzLAoJCQkJCQkJCQkJCSAmcHJlc29ydGVkX2tl eXMpKQoJCQl7CgkJCQlQbGFuCSAgICpzb3J0X3BsYW47CgoJCQkJLyoKCQkJCSAqIFdlIGNo b29zZSB0byB1c2UgaW5jcmVtZW50YWwgc29ydCBpZiBpdCBpcyBlbmFibGVkIGFuZAoJCQkJ ICogdGhlcmUgYXJlIHByZXNvcnRlZCBrZXlzOyBvdGhlcndpc2Ugd2UgdXNlIGZ1bGwgc29y dC4KCQkJCSAqLwoJCQkJaWYgKGVuYWJsZV9pbmNyZW1lbnRhbF9zb3J0ICYmIHByZXNvcnRl ZF9rZXlzID4gMCkKCQkJCXsKCQkJCQlzb3J0X3BsYW4gPSAoUGxhbiAqKQoJCQkJCQltYWtl X2luY3JlbWVudGFsc29ydChzdWJwbGFuLCBudW1zb3J0a2V5cywgcHJlc29ydGVkX2tleXMs CgkJCQkJCQkJCQkJIHNvcnRDb2xJZHgsIHNvcnRPcGVyYXRvcnMsCgkJCQkJCQkJCQkJIGNv bGxhdGlvbnMsIG51bGxzRmlyc3QpOwoKCQkJCQlsYWJlbF9pbmNyZW1lbnRhbHNvcnRfd2l0 aF9jb3N0c2l6ZShyb290LAoJCQkJCQkJCQkJCQkJCShJbmNyZW1lbnRhbFNvcnQgKikgc29y dF9wbGFuLAoJCQkJCQkJCQkJCQkJCXBhdGhrZXlzLAoJCQkJCQkJCQkJCQkJCWJlc3RfcGF0 aC0+bGltaXRfdHVwbGVzKTsKCQkJCX0KCQkJCWVsc2UKCQkJCXsKCQkJCQlzb3J0X3BsYW4g PSAoUGxhbiAqKSBtYWtlX3NvcnQoc3VicGxhbiwgbnVtc29ydGtleXMsCgkJCQkJCQkJCQkJ CSAgIHNvcnRDb2xJZHgsIHNvcnRPcGVyYXRvcnMsCgkJCQkJCQkJCQkJCSAgIGNvbGxhdGlv bnMsIG51bGxzRmlyc3QpOwoKCQkJCQlsYWJlbF9zb3J0X3dpdGhfY29zdHNpemUocm9vdCwg KFNvcnQgKikgc29ydF9wbGFuLAoJCQkJCQkJCQkJCSBiZXN0X3BhdGgtPmxpbWl0X3R1cGxl cyk7CgkJCQl9CgoJCQkJc3VicGxhbiA9IHNvcnRfcGxhbjsKCQkJfQoJCX0KCgkJLyogSWYg bmVlZGVkLCBjaGVjayB0byBzZWUgaWYgc3VicGxhbiBjYW4gYmUgZXhlY3V0ZWQgYXN5bmNo cm9ub3VzbHkgKi8KCQlpZiAoY29uc2lkZXJfYXN5bmMgJiYgbWFya19hc3luY19jYXBhYmxl X3BsYW4oc3VicGxhbiwgc3VicGF0aCkpCgkJewoJCQlBc3NlcnQoc3VicGxhbi0+YXN5bmNf Y2FwYWJsZSk7CgkJCSsrbmFzeW5jcGxhbnM7CgkJfQoKCQlzdWJwbGFucyA9IGxhcHBlbmQo c3VicGxhbnMsIHN1YnBsYW4pOwoJfQoKCS8qIFNldCBiZWxvdyBpZiB3ZSBmaW5kIHF1YWxz IHRoYXQgd2UgY2FuIHVzZSB0byBydW4tdGltZSBwcnVuZSAqLwoJcGxhbi0+cGFydF9wcnVu ZV9pbmRleCA9IC0xOwoKCS8qCgkgKiBJZiBhbnkgcXVhbHMgZXhpc3QsIHRoZXkgbWF5IGJl IHVzZWZ1bCB0byBwZXJmb3JtIGZ1cnRoZXIgcGFydGl0aW9uCgkgKiBwcnVuaW5nIGR1cmlu ZyBleGVjdXRpb24uICBHYXRoZXIgaW5mb3JtYXRpb24gbmVlZGVkIGJ5IHRoZSBleGVjdXRv ciB0bwoJICogZG8gcGFydGl0aW9uIHBydW5pbmcuCgkgKi8KCWlmIChlbmFibGVfcGFydGl0 aW9uX3BydW5pbmcpCgl7CgkJTGlzdAkgICAqcHJ1bmVxdWFsOwoKCQlwcnVuZXF1YWwgPSBl eHRyYWN0X2FjdHVhbF9jbGF1c2VzKHJlbC0+YmFzZXJlc3RyaWN0aW5mbywgZmFsc2UpOwoK CQlpZiAoYmVzdF9wYXRoLT5wYXRoLnBhcmFtX2luZm8pCgkJewoJCQlMaXN0CSAgICpwcm1x dWFscyA9IGJlc3RfcGF0aC0+cGF0aC5wYXJhbV9pbmZvLT5wcGlfY2xhdXNlczsKCgkJCXBy bXF1YWxzID0gZXh0cmFjdF9hY3R1YWxfY2xhdXNlcyhwcm1xdWFscywgZmFsc2UpOwoJCQlw cm1xdWFscyA9IChMaXN0ICopIHJlcGxhY2VfbmVzdGxvb3BfcGFyYW1zKHJvb3QsCgkJCQkJ CQkJCQkJCQkJKE5vZGUgKikgcHJtcXVhbHMpOwoKCQkJcHJ1bmVxdWFsID0gbGlzdF9jb25j YXQocHJ1bmVxdWFsLCBwcm1xdWFscyk7CgkJfQoKCQlpZiAocHJ1bmVxdWFsICE9IE5JTCkK CQkJcGxhbi0+cGFydF9wcnVuZV9pbmRleCA9IG1ha2VfcGFydGl0aW9uX3BydW5laW5mbyhy b290LCByZWwsCgkJCQkJCQkJCQkJCQkJCSAgYmVzdF9wYXRoLT5zdWJwYXRocywKCQkJCQkJ CQkJCQkJCQkJICBwcnVuZXF1YWwpOwoJfQoKCXBsYW4tPmFwcGVuZHBsYW5zID0gc3VicGxh bnM7CglwbGFuLT5uYXN5bmNwbGFucyA9IG5hc3luY3BsYW5zOwoJcGxhbi0+Zmlyc3RfcGFy dGlhbF9wbGFuID0gYmVzdF9wYXRoLT5maXJzdF9wYXJ0aWFsX3BhdGg7CgoJY29weV9nZW5l cmljX3BhdGhfaW5mbygmcGxhbi0+cGxhbiwgKFBhdGggKikgYmVzdF9wYXRoKTsKCgkvKgoJ ICogSWYgcHJlcGFyZV9zb3J0X2Zyb21fcGF0aGtleXMgYWRkZWQgc29ydCBjb2x1bW5zLCBi dXQgd2Ugd2VyZSB0b2xkIHRvCgkgKiBwcm9kdWNlIGVpdGhlciB0aGUgZXhhY3QgdGxpc3Qg b3IgYSBuYXJyb3cgdGxpc3QsIHdlIHNob3VsZCBnZXQgcmlkIG9mCgkgKiB0aGUgc29ydCBj b2x1bW5zIGFnYWluLiAgV2UgbXVzdCBpbmplY3QgYSBwcm9qZWN0aW9uIG5vZGUgdG8gZG8g c28uCgkgKi8KCWlmICh0bGlzdF93YXNfY2hhbmdlZCAmJiAoZmxhZ3MgJiAoQ1BfRVhBQ1Rf VExJU1QgfCBDUF9TTUFMTF9UTElTVCkpKQoJewoJCXRsaXN0ID0gbGlzdF9jb3B5X2hlYWQo cGxhbi0+cGxhbi50YXJnZXRsaXN0LCBvcmlnX3RsaXN0X2xlbmd0aCk7CgkJcmV0dXJuIGlu amVjdF9wcm9qZWN0aW9uX3BsYW4oKFBsYW4gKikgcGxhbiwgdGxpc3QsCgkJCQkJCQkJCSAg cGxhbi0+cGxhbi5wYXJhbGxlbF9zYWZlKTsKCX0KCWVsc2UKCQlyZXR1cm4gKFBsYW4gKikg cGxhbjsKfQoKLyoKICogY3JlYXRlX21lcmdlX2FwcGVuZF9wbGFuCiAqCSAgQ3JlYXRlIGEg TWVyZ2VBcHBlbmQgcGxhbiBmb3IgJ2Jlc3RfcGF0aCcgYW5kIChyZWN1cnNpdmVseSkgcGxh bnMKICoJICBmb3IgaXRzIHN1YnBhdGhzLgogKgogKgkgIFJldHVybnMgYSBQbGFuIG5vZGUu CiAqLwpzdGF0aWMgUGxhbiAqCmNyZWF0ZV9tZXJnZV9hcHBlbmRfcGxhbihQbGFubmVySW5m byAqcm9vdCwgTWVyZ2VBcHBlbmRQYXRoICpiZXN0X3BhdGgsCgkJCQkJCSBpbnQgZmxhZ3Mp CnsKCU1lcmdlQXBwZW5kICpub2RlID0gbWFrZU5vZGUoTWVyZ2VBcHBlbmQpOwoJUGxhbgkg ICAqcGxhbiA9ICZub2RlLT5wbGFuOwoJTGlzdAkgICAqdGxpc3QgPSBidWlsZF9wYXRoX3Rs aXN0KHJvb3QsICZiZXN0X3BhdGgtPnBhdGgpOwoJaW50CQkJb3JpZ190bGlzdF9sZW5ndGgg PSBsaXN0X2xlbmd0aCh0bGlzdCk7Cglib29sCQl0bGlzdF93YXNfY2hhbmdlZDsKCUxpc3QJ ICAgKnBhdGhrZXlzID0gYmVzdF9wYXRoLT5wYXRoLnBhdGhrZXlzOwoJTGlzdAkgICAqc3Vi cGxhbnMgPSBOSUw7CglMaXN0Q2VsbCAgICpzdWJwYXRoczsKCVJlbE9wdEluZm8gKnJlbCA9 IGJlc3RfcGF0aC0+cGF0aC5wYXJlbnQ7CgoJLyoKCSAqIFdlIGRvbid0IGhhdmUgdGhlIGFj dHVhbCBjcmVhdGlvbiBvZiB0aGUgTWVyZ2VBcHBlbmQgbm9kZSBzcGxpdCBvdXQKCSAqIGlu dG8gYSBzZXBhcmF0ZSBtYWtlX3h4eCBmdW5jdGlvbi4gIFRoaXMgaXMgYmVjYXVzZSB3ZSB3 YW50IHRvIHJ1bgoJICogcHJlcGFyZV9zb3J0X2Zyb21fcGF0aGtleXMgb24gaXQgYmVmb3Jl IHdlIGRvIHNvIG9uIHRoZSBpbmRpdmlkdWFsCgkgKiBjaGlsZCBwbGFucywgdG8gbWFrZSBj cm9zcy1jaGVja2luZyB0aGUgc29ydCBpbmZvIGVhc2llci4KCSAqLwoJY29weV9nZW5lcmlj X3BhdGhfaW5mbyhwbGFuLCAoUGF0aCAqKSBiZXN0X3BhdGgpOwoJcGxhbi0+dGFyZ2V0bGlz dCA9IHRsaXN0OwoJcGxhbi0+cXVhbCA9IE5JTDsKCXBsYW4tPmxlZnR0cmVlID0gTlVMTDsK CXBsYW4tPnJpZ2h0dHJlZSA9IE5VTEw7Cglub2RlLT5hcHByZWxpZHMgPSByZWwtPnJlbGlk czsKCW5vZGUtPmNoaWxkX2FwcGVuZF9yZWxpZF9zZXRzID0gYmVzdF9wYXRoLT5jaGlsZF9h cHBlbmRfcmVsaWRfc2V0czsKCgkvKgoJICogQ29tcHV0ZSBzb3J0IGNvbHVtbiBpbmZvLCBh bmQgYWRqdXN0IE1lcmdlQXBwZW5kJ3MgdGxpc3QgYXMgbmVlZGVkLgoJICogQmVjYXVzZSB3 ZSBwYXNzIGFkanVzdF90bGlzdF9pbl9wbGFjZSA9IHRydWUsIHdlIG1heSBpZ25vcmUgdGhl CgkgKiBmdW5jdGlvbiByZXN1bHQ7IGl0IG11c3QgYmUgdGhlIHNhbWUgcGxhbiBub2RlLiAg SG93ZXZlciwgd2UgdGhlbiBuZWVkCgkgKiB0byBkZXRlY3Qgd2hldGhlciBhbnkgdGxpc3Qg ZW50cmllcyB3ZXJlIGFkZGVkLgoJICovCgkodm9pZCkgcHJlcGFyZV9zb3J0X2Zyb21fcGF0 aGtleXMocGxhbiwgcGF0aGtleXMsCgkJCQkJCQkJCSAgYmVzdF9wYXRoLT5wYXRoLnBhcmVu dC0+cmVsaWRzLAoJCQkJCQkJCQkgIE5VTEwsCgkJCQkJCQkJCSAgdHJ1ZSwKCQkJCQkJCQkJ ICAmbm9kZS0+bnVtQ29scywKCQkJCQkJCQkJICAmbm9kZS0+c29ydENvbElkeCwKCQkJCQkJ CQkJICAmbm9kZS0+c29ydE9wZXJhdG9ycywKCQkJCQkJCQkJICAmbm9kZS0+Y29sbGF0aW9u cywKCQkJCQkJCQkJICAmbm9kZS0+bnVsbHNGaXJzdCk7Cgl0bGlzdF93YXNfY2hhbmdlZCA9 IChvcmlnX3RsaXN0X2xlbmd0aCAhPSBsaXN0X2xlbmd0aChwbGFuLT50YXJnZXRsaXN0KSk7 CgoJLyoKCSAqIE5vdyBwcmVwYXJlIHRoZSBjaGlsZCBwbGFucy4gIFdlIG11c3QgYXBwbHkg cHJlcGFyZV9zb3J0X2Zyb21fcGF0aGtleXMKCSAqIGV2ZW4gdG8gc3VicGxhbnMgdGhhdCBk b24ndCBuZWVkIGFuIGV4cGxpY2l0IHNvcnQsIHRvIG1ha2Ugc3VyZSB0aGV5CgkgKiBhcmUg cmV0dXJuaW5nIHRoZSBzYW1lIHNvcnQga2V5IGNvbHVtbnMgdGhlIE1lcmdlQXBwZW5kIGV4 cGVjdHMuCgkgKi8KCWZvcmVhY2goc3VicGF0aHMsIGJlc3RfcGF0aC0+c3VicGF0aHMpCgl7 CgkJUGF0aAkgICAqc3VicGF0aCA9IChQYXRoICopIGxmaXJzdChzdWJwYXRocyk7CgkJUGxh bgkgICAqc3VicGxhbjsKCQlpbnQJCQludW1zb3J0a2V5czsKCQlBdHRyTnVtYmVyICpzb3J0 Q29sSWR4OwoJCU9pZAkJICAgKnNvcnRPcGVyYXRvcnM7CgkJT2lkCQkgICAqY29sbGF0aW9u czsKCQlib29sCSAgICpudWxsc0ZpcnN0OwoJCWludAkJCXByZXNvcnRlZF9rZXlzOwoKCQkv KiBCdWlsZCB0aGUgY2hpbGQgcGxhbiAqLwoJCS8qIE11c3QgaW5zaXN0IHRoYXQgYWxsIGNo aWxkcmVuIHJldHVybiB0aGUgc2FtZSB0bGlzdCAqLwoJCXN1YnBsYW4gPSBjcmVhdGVfcGxh bl9yZWN1cnNlKHJvb3QsIHN1YnBhdGgsIENQX0VYQUNUX1RMSVNUKTsKCgkJLyogQ29tcHV0 ZSBzb3J0IGNvbHVtbiBpbmZvLCBhbmQgYWRqdXN0IHN1YnBsYW4ncyB0bGlzdCBhcyBuZWVk ZWQgKi8KCQlzdWJwbGFuID0gcHJlcGFyZV9zb3J0X2Zyb21fcGF0aGtleXMoc3VicGxhbiwg cGF0aGtleXMsCgkJCQkJCQkJCQkJIHN1YnBhdGgtPnBhcmVudC0+cmVsaWRzLAoJCQkJCQkJ CQkJCSBub2RlLT5zb3J0Q29sSWR4LAoJCQkJCQkJCQkJCSBmYWxzZSwKCQkJCQkJCQkJCQkg Jm51bXNvcnRrZXlzLAoJCQkJCQkJCQkJCSAmc29ydENvbElkeCwKCQkJCQkJCQkJCQkgJnNv cnRPcGVyYXRvcnMsCgkJCQkJCQkJCQkJICZjb2xsYXRpb25zLAoJCQkJCQkJCQkJCSAmbnVs bHNGaXJzdCk7CgoJCS8qCgkJICogQ2hlY2sgdGhhdCB3ZSBnb3QgdGhlIHNhbWUgc29ydCBr ZXkgaW5mb3JtYXRpb24uICBXZSBqdXN0IEFzc2VydAoJCSAqIHRoYXQgdGhlIHNvcnRvcHMg bWF0Y2gsIHNpbmNlIHRob3NlIGRlcGVuZCBvbmx5IG9uIHRoZSBwYXRoa2V5czsKCQkgKiBi dXQgaXQgc2VlbXMgbGlrZSBhIGdvb2QgaWRlYSB0byBjaGVjayB0aGUgc29ydCBjb2x1bW4g bnVtYmVycwoJCSAqIGV4cGxpY2l0bHksIHRvIGVuc3VyZSB0aGUgdGxpc3RzIHJlYWxseSBk byBtYXRjaCB1cC4KCQkgKi8KCQlBc3NlcnQobnVtc29ydGtleXMgPT0gbm9kZS0+bnVtQ29s cyk7CgkJaWYgKG1lbWNtcChzb3J0Q29sSWR4LCBub2RlLT5zb3J0Q29sSWR4LAoJCQkJICAg bnVtc29ydGtleXMgKiBzaXplb2YoQXR0ck51bWJlcikpICE9IDApCgkJCWVsb2coRVJST1Is ICJNZXJnZUFwcGVuZCBjaGlsZCdzIHRhcmdldGxpc3QgZG9lc24ndCBtYXRjaCBNZXJnZUFw cGVuZCIpOwoJCUFzc2VydChtZW1jbXAoc29ydE9wZXJhdG9ycywgbm9kZS0+c29ydE9wZXJh dG9ycywKCQkJCQkgIG51bXNvcnRrZXlzICogc2l6ZW9mKE9pZCkpID09IDApOwoJCUFzc2Vy dChtZW1jbXAoY29sbGF0aW9ucywgbm9kZS0+Y29sbGF0aW9ucywKCQkJCQkgIG51bXNvcnRr ZXlzICogc2l6ZW9mKE9pZCkpID09IDApOwoJCUFzc2VydChtZW1jbXAobnVsbHNGaXJzdCwg bm9kZS0+bnVsbHNGaXJzdCwKCQkJCQkgIG51bXNvcnRrZXlzICogc2l6ZW9mKGJvb2wpKSA9 PSAwKTsKCgkJLyogTm93LCBpbnNlcnQgYSBTb3J0IG5vZGUgaWYgc3VicGxhbiBpc24ndCBz dWZmaWNpZW50bHkgb3JkZXJlZCAqLwoJCWlmICghcGF0aGtleXNfY291bnRfY29udGFpbmVk X2luKHBhdGhrZXlzLCBzdWJwYXRoLT5wYXRoa2V5cywKCQkJCQkJCQkJCSAmcHJlc29ydGVk X2tleXMpKQoJCXsKCQkJUGxhbgkgICAqc29ydF9wbGFuOwoKCQkJLyoKCQkJICogV2UgY2hv b3NlIHRvIHVzZSBpbmNyZW1lbnRhbCBzb3J0IGlmIGl0IGlzIGVuYWJsZWQgYW5kIHRoZXJl CgkJCSAqIGFyZSBwcmVzb3J0ZWQga2V5czsgb3RoZXJ3aXNlIHdlIHVzZSBmdWxsIHNvcnQu CgkJCSAqLwoJCQlpZiAoZW5hYmxlX2luY3JlbWVudGFsX3NvcnQgJiYgcHJlc29ydGVkX2tl eXMgPiAwKQoJCQl7CgkJCQlzb3J0X3BsYW4gPSAoUGxhbiAqKQoJCQkJCW1ha2VfaW5jcmVt ZW50YWxzb3J0KHN1YnBsYW4sIG51bXNvcnRrZXlzLCBwcmVzb3J0ZWRfa2V5cywKCQkJCQkJ CQkJCSBzb3J0Q29sSWR4LCBzb3J0T3BlcmF0b3JzLAoJCQkJCQkJCQkJIGNvbGxhdGlvbnMs IG51bGxzRmlyc3QpOwoKCQkJCWxhYmVsX2luY3JlbWVudGFsc29ydF93aXRoX2Nvc3RzaXpl KHJvb3QsCgkJCQkJCQkJCQkJCQkoSW5jcmVtZW50YWxTb3J0ICopIHNvcnRfcGxhbiwKCQkJ CQkJCQkJCQkJCXBhdGhrZXlzLAoJCQkJCQkJCQkJCQkJYmVzdF9wYXRoLT5saW1pdF90dXBs ZXMpOwoJCQl9CgkJCWVsc2UKCQkJewoJCQkJc29ydF9wbGFuID0gKFBsYW4gKikgbWFrZV9z b3J0KHN1YnBsYW4sIG51bXNvcnRrZXlzLAoJCQkJCQkJCQkJCSAgIHNvcnRDb2xJZHgsIHNv cnRPcGVyYXRvcnMsCgkJCQkJCQkJCQkJICAgY29sbGF0aW9ucywgbnVsbHNGaXJzdCk7CgoJ CQkJbGFiZWxfc29ydF93aXRoX2Nvc3RzaXplKHJvb3QsIChTb3J0ICopIHNvcnRfcGxhbiwK CQkJCQkJCQkJCSBiZXN0X3BhdGgtPmxpbWl0X3R1cGxlcyk7CgkJCX0KCgkJCXN1YnBsYW4g PSBzb3J0X3BsYW47CgkJfQoKCQlzdWJwbGFucyA9IGxhcHBlbmQoc3VicGxhbnMsIHN1YnBs YW4pOwoJfQoKCS8qIFNldCBiZWxvdyBpZiB3ZSBmaW5kIHF1YWxzIHRoYXQgd2UgY2FuIHVz ZSB0byBydW4tdGltZSBwcnVuZSAqLwoJbm9kZS0+cGFydF9wcnVuZV9pbmRleCA9IC0xOwoK CS8qCgkgKiBJZiBhbnkgcXVhbHMgZXhpc3QsIHRoZXkgbWF5IGJlIHVzZWZ1bCB0byBwZXJm b3JtIGZ1cnRoZXIgcGFydGl0aW9uCgkgKiBwcnVuaW5nIGR1cmluZyBleGVjdXRpb24uICBH YXRoZXIgaW5mb3JtYXRpb24gbmVlZGVkIGJ5IHRoZSBleGVjdXRvciB0bwoJICogZG8gcGFy dGl0aW9uIHBydW5pbmcuCgkgKi8KCWlmIChlbmFibGVfcGFydGl0aW9uX3BydW5pbmcpCgl7 CgkJTGlzdAkgICAqcHJ1bmVxdWFsOwoKCQlwcnVuZXF1YWwgPSBleHRyYWN0X2FjdHVhbF9j bGF1c2VzKHJlbC0+YmFzZXJlc3RyaWN0aW5mbywgZmFsc2UpOwoKCQkvKiBXZSBkb24ndCBj dXJyZW50bHkgZ2VuZXJhdGUgYW55IHBhcmFtZXRlcml6ZWQgTWVyZ2VBcHBlbmQgcGF0aHMg Ki8KCQlBc3NlcnQoYmVzdF9wYXRoLT5wYXRoLnBhcmFtX2luZm8gPT0gTlVMTCk7CgoJCWlm IChwcnVuZXF1YWwgIT0gTklMKQoJCQlub2RlLT5wYXJ0X3BydW5lX2luZGV4ID0gbWFrZV9w YXJ0aXRpb25fcHJ1bmVpbmZvKHJvb3QsIHJlbCwKCQkJCQkJCQkJCQkJCQkJICBiZXN0X3Bh dGgtPnN1YnBhdGhzLAoJCQkJCQkJCQkJCQkJCQkgIHBydW5lcXVhbCk7Cgl9CgoJbm9kZS0+ bWVyZ2VwbGFucyA9IHN1YnBsYW5zOwoKCS8qCgkgKiBJZiBwcmVwYXJlX3NvcnRfZnJvbV9w YXRoa2V5cyBhZGRlZCBzb3J0IGNvbHVtbnMsIGJ1dCB3ZSB3ZXJlIHRvbGQgdG8KCSAqIHBy b2R1Y2UgZWl0aGVyIHRoZSBleGFjdCB0bGlzdCBvciBhIG5hcnJvdyB0bGlzdCwgd2Ugc2hv dWxkIGdldCByaWQgb2YKCSAqIHRoZSBzb3J0IGNvbHVtbnMgYWdhaW4uICBXZSBtdXN0IGlu amVjdCBhIHByb2plY3Rpb24gbm9kZSB0byBkbyBzby4KCSAqLwoJaWYgKHRsaXN0X3dhc19j aGFuZ2VkICYmIChmbGFncyAmIChDUF9FWEFDVF9UTElTVCB8IENQX1NNQUxMX1RMSVNUKSkp Cgl7CgkJdGxpc3QgPSBsaXN0X2NvcHlfaGVhZChwbGFuLT50YXJnZXRsaXN0LCBvcmlnX3Rs aXN0X2xlbmd0aCk7CgkJcmV0dXJuIGluamVjdF9wcm9qZWN0aW9uX3BsYW4ocGxhbiwgdGxp c3QsIHBsYW4tPnBhcmFsbGVsX3NhZmUpOwoJfQoJZWxzZQoJCXJldHVybiBwbGFuOwp9Cgov KgogKiBjcmVhdGVfZ3JvdXBfcmVzdWx0X3BsYW4KICoJICBDcmVhdGUgYSBSZXN1bHQgcGxh biBmb3IgJ2Jlc3RfcGF0aCcuCiAqCSAgVGhpcyBpcyBvbmx5IHVzZWQgZm9yIGRlZ2VuZXJh dGUgZ3JvdXBpbmcgY2FzZXMuCiAqCiAqCSAgUmV0dXJucyBhIFBsYW4gbm9kZS4KICovCnN0 YXRpYyBSZXN1bHQgKgpjcmVhdGVfZ3JvdXBfcmVzdWx0X3BsYW4oUGxhbm5lckluZm8gKnJv b3QsIEdyb3VwUmVzdWx0UGF0aCAqYmVzdF9wYXRoKQp7CglSZXN1bHQJICAgKnBsYW47CglM aXN0CSAgICp0bGlzdDsKCUxpc3QJICAgKnF1YWxzOwoKCXRsaXN0ID0gYnVpbGRfcGF0aF90 bGlzdChyb290LCAmYmVzdF9wYXRoLT5wYXRoKTsKCgkvKiBiZXN0X3BhdGgtPnF1YWxzIGlz IGp1c3QgYmFyZSBjbGF1c2VzICovCglxdWFscyA9IG9yZGVyX3F1YWxfY2xhdXNlcyhyb290 LCBiZXN0X3BhdGgtPnF1YWxzKTsKCglwbGFuID0gbWFrZV9vbmVfcm93X3Jlc3VsdCh0bGlz dCwgKE5vZGUgKikgcXVhbHMsIGJlc3RfcGF0aC0+cGF0aC5wYXJlbnQpOwoKCWNvcHlfZ2Vu ZXJpY19wYXRoX2luZm8oJnBsYW4tPnBsYW4sIChQYXRoICopIGJlc3RfcGF0aCk7CgoJcmV0 dXJuIHBsYW47Cn0KCi8qCiAqIGNyZWF0ZV9wcm9qZWN0X3NldF9wbGFuCiAqCSAgQ3JlYXRl IGEgUHJvamVjdFNldCBwbGFuIGZvciAnYmVzdF9wYXRoJy4KICoKICoJICBSZXR1cm5zIGEg UGxhbiBub2RlLgogKi8Kc3RhdGljIFByb2plY3RTZXQgKgpjcmVhdGVfcHJvamVjdF9zZXRf cGxhbihQbGFubmVySW5mbyAqcm9vdCwgUHJvamVjdFNldFBhdGggKmJlc3RfcGF0aCkKewoJ UHJvamVjdFNldCAqcGxhbjsKCVBsYW4JICAgKnN1YnBsYW47CglMaXN0CSAgICp0bGlzdDsK CgkvKiBTaW5jZSB3ZSBpbnRlbmQgdG8gcHJvamVjdCwgd2UgZG9uJ3QgbmVlZCB0byBjb25z dHJhaW4gY2hpbGQgdGxpc3QgKi8KCXN1YnBsYW4gPSBjcmVhdGVfcGxhbl9yZWN1cnNlKHJv b3QsIGJlc3RfcGF0aC0+c3VicGF0aCwgMCk7CgoJdGxpc3QgPSBidWlsZF9wYXRoX3RsaXN0 KHJvb3QsICZiZXN0X3BhdGgtPnBhdGgpOwoKCXBsYW4gPSBtYWtlX3Byb2plY3Rfc2V0KHRs aXN0LCBzdWJwbGFuKTsKCgljb3B5X2dlbmVyaWNfcGF0aF9pbmZvKCZwbGFuLT5wbGFuLCAo UGF0aCAqKSBiZXN0X3BhdGgpOwoKCXJldHVybiBwbGFuOwp9CgovKgogKiBjcmVhdGVfbWF0 ZXJpYWxfcGxhbgogKgkgIENyZWF0ZSBhIE1hdGVyaWFsIHBsYW4gZm9yICdiZXN0X3BhdGgn IGFuZCAocmVjdXJzaXZlbHkpIHBsYW5zCiAqCSAgZm9yIGl0cyBzdWJwYXRocy4KICoKICoJ ICBSZXR1cm5zIGEgUGxhbiBub2RlLgogKi8Kc3RhdGljIE1hdGVyaWFsICoKY3JlYXRlX21h dGVyaWFsX3BsYW4oUGxhbm5lckluZm8gKnJvb3QsIE1hdGVyaWFsUGF0aCAqYmVzdF9wYXRo LCBpbnQgZmxhZ3MpCnsKCU1hdGVyaWFsICAgKnBsYW47CglQbGFuCSAgICpzdWJwbGFuOwoK CS8qCgkgKiBXZSBkb24ndCB3YW50IGFueSBleGNlc3MgY29sdW1ucyBpbiB0aGUgbWF0ZXJp YWxpemVkIHR1cGxlcywgc28gcmVxdWVzdAoJICogYSBzbWFsbGVyIHRsaXN0LiAgT3RoZXJ3 aXNlLCBzaW5jZSBNYXRlcmlhbCBkb2Vzbid0IHByb2plY3QsIHRsaXN0CgkgKiByZXF1aXJl bWVudHMgcGFzcyB0aHJvdWdoLgoJICovCglzdWJwbGFuID0gY3JlYXRlX3BsYW5fcmVjdXJz ZShyb290LCBiZXN0X3BhdGgtPnN1YnBhdGgsCgkJCQkJCQkJICBmbGFncyB8IENQX1NNQUxM X1RMSVNUKTsKCglwbGFuID0gbWFrZV9tYXRlcmlhbChzdWJwbGFuKTsKCgljb3B5X2dlbmVy aWNfcGF0aF9pbmZvKCZwbGFuLT5wbGFuLCAoUGF0aCAqKSBiZXN0X3BhdGgpOwoKCXJldHVy biBwbGFuOwp9CgovKgogKiBjcmVhdGVfbWVtb2l6ZV9wbGFuCiAqCSAgQ3JlYXRlIGEgTWVt b2l6ZSBwbGFuIGZvciAnYmVzdF9wYXRoJyBhbmQgKHJlY3Vyc2l2ZWx5KSBwbGFucyBmb3Ig aXRzCiAqCSAgc3VicGF0aHMuCiAqCiAqCSAgUmV0dXJucyBhIFBsYW4gbm9kZS4KICovCnN0 YXRpYyBNZW1vaXplICoKY3JlYXRlX21lbW9pemVfcGxhbihQbGFubmVySW5mbyAqcm9vdCwg TWVtb2l6ZVBhdGggKmJlc3RfcGF0aCwgaW50IGZsYWdzKQp7CglNZW1vaXplICAgICpwbGFu OwoJQml0bWFwc2V0ICAqa2V5cGFyYW1pZHM7CglQbGFuCSAgICpzdWJwbGFuOwoJT2lkCQkg ICAqb3BlcmF0b3JzOwoJT2lkCQkgICAqY29sbGF0aW9uczsKCUxpc3QJICAgKnBhcmFtX2V4 cHJzID0gTklMOwoJTGlzdENlbGwgICAqbGM7CglMaXN0Q2VsbCAgICpsYzI7CglpbnQJCQlu a2V5czsKCWludAkJCWk7CgoJc3VicGxhbiA9IGNyZWF0ZV9wbGFuX3JlY3Vyc2Uocm9vdCwg YmVzdF9wYXRoLT5zdWJwYXRoLAoJCQkJCQkJCSAgZmxhZ3MgfCBDUF9TTUFMTF9UTElTVCk7 CgoJcGFyYW1fZXhwcnMgPSAoTGlzdCAqKSByZXBsYWNlX25lc3Rsb29wX3BhcmFtcyhyb290 LCAoTm9kZSAqKQoJCQkJCQkJCQkJCQkgICBiZXN0X3BhdGgtPnBhcmFtX2V4cHJzKTsKCglu a2V5cyA9IGxpc3RfbGVuZ3RoKHBhcmFtX2V4cHJzKTsKCUFzc2VydChua2V5cyA+IDApOwoJ b3BlcmF0b3JzID0gcGFsbG9jKG5rZXlzICogc2l6ZW9mKE9pZCkpOwoJY29sbGF0aW9ucyA9 IHBhbGxvYyhua2V5cyAqIHNpemVvZihPaWQpKTsKCglpID0gMDsKCWZvcmJvdGgobGMsIHBh cmFtX2V4cHJzLCBsYzIsIGJlc3RfcGF0aC0+aGFzaF9vcGVyYXRvcnMpCgl7CgkJRXhwcgkg ICAqcGFyYW1fZXhwciA9IChFeHByICopIGxmaXJzdChsYyk7CgkJT2lkCQkJb3BubyA9IGxm aXJzdF9vaWQobGMyKTsKCgkJb3BlcmF0b3JzW2ldID0gb3BubzsKCQljb2xsYXRpb25zW2ld ID0gZXhwckNvbGxhdGlvbigoTm9kZSAqKSBwYXJhbV9leHByKTsKCQlpKys7Cgl9CgoJa2V5 cGFyYW1pZHMgPSBwdWxsX3BhcmFtaWRzKChFeHByICopIHBhcmFtX2V4cHJzKTsKCglwbGFu ID0gbWFrZV9tZW1vaXplKHN1YnBsYW4sIG9wZXJhdG9ycywgY29sbGF0aW9ucywgcGFyYW1f ZXhwcnMsCgkJCQkJCWJlc3RfcGF0aC0+c2luZ2xlcm93LCBiZXN0X3BhdGgtPmJpbmFyeV9t b2RlLAoJCQkJCQliZXN0X3BhdGgtPmVzdF9lbnRyaWVzLCBrZXlwYXJhbWlkcywgYmVzdF9w YXRoLT5lc3RfY2FsbHMsCgkJCQkJCWJlc3RfcGF0aC0+ZXN0X3VuaXF1ZV9rZXlzLCBiZXN0 X3BhdGgtPmVzdF9oaXRfcmF0aW8pOwoKCWNvcHlfZ2VuZXJpY19wYXRoX2luZm8oJnBsYW4t PnBsYW4sIChQYXRoICopIGJlc3RfcGF0aCk7CgoJcmV0dXJuIHBsYW47Cn0KCi8qCiAqIGNy ZWF0ZV9nYXRoZXJfcGxhbgogKgogKgkgIENyZWF0ZSBhIEdhdGhlciBwbGFuIGZvciAnYmVz dF9wYXRoJyBhbmQgKHJlY3Vyc2l2ZWx5KSBwbGFucwogKgkgIGZvciBpdHMgc3VicGF0aHMu CiAqLwpzdGF0aWMgR2F0aGVyICoKY3JlYXRlX2dhdGhlcl9wbGFuKFBsYW5uZXJJbmZvICpy b290LCBHYXRoZXJQYXRoICpiZXN0X3BhdGgpCnsKCUdhdGhlcgkgICAqZ2F0aGVyX3BsYW47 CglQbGFuCSAgICpzdWJwbGFuOwoJTGlzdAkgICAqdGxpc3Q7CgoJLyoKCSAqIFB1c2ggcHJv amVjdGlvbiBkb3duIHRvIHRoZSBjaGlsZCBub2RlLiAgVGhhdCB3YXksIHRoZSBwcm9qZWN0 aW9uIHdvcmsKCSAqIGlzIHBhcmFsbGVsaXplZCwgYW5kIHRoZXJlIGNhbiBiZSBubyBzeXN0 ZW0gY29sdW1ucyBpbiB0aGUgcmVzdWx0ICh0aGV5CgkgKiBjYW4ndCB0cmF2ZWwgdGhyb3Vn aCBhIHR1cGxlIHF1ZXVlIGJlY2F1c2UgaXQgdXNlcyBNaW5pbWFsVHVwbGUKCSAqIHJlcHJl c2VudGF0aW9uKS4KCSAqLwoJc3VicGxhbiA9IGNyZWF0ZV9wbGFuX3JlY3Vyc2Uocm9vdCwg YmVzdF9wYXRoLT5zdWJwYXRoLCBDUF9FWEFDVF9UTElTVCk7CgoJdGxpc3QgPSBidWlsZF9w YXRoX3RsaXN0KHJvb3QsICZiZXN0X3BhdGgtPnBhdGgpOwoKCWdhdGhlcl9wbGFuID0gbWFr ZV9nYXRoZXIodGxpc3QsCgkJCQkJCQkgIE5JTCwKCQkJCQkJCSAgYmVzdF9wYXRoLT5udW1f d29ya2VycywKCQkJCQkJCSAgYXNzaWduX3NwZWNpYWxfZXhlY19wYXJhbShyb290KSwKCQkJ CQkJCSAgYmVzdF9wYXRoLT5zaW5nbGVfY29weSwKCQkJCQkJCSAgc3VicGxhbik7CgoJY29w eV9nZW5lcmljX3BhdGhfaW5mbygmZ2F0aGVyX3BsYW4tPnBsYW4sICZiZXN0X3BhdGgtPnBh dGgpOwoKCS8qIHVzZSBwYXJhbGxlbCBtb2RlIGZvciBwYXJhbGxlbCBwbGFucy4gKi8KCXJv b3QtPmdsb2ItPnBhcmFsbGVsTW9kZU5lZWRlZCA9IHRydWU7CgoJcmV0dXJuIGdhdGhlcl9w bGFuOwp9CgovKgogKiBjcmVhdGVfZ2F0aGVyX21lcmdlX3BsYW4KICoKICoJICBDcmVhdGUg YSBHYXRoZXIgTWVyZ2UgcGxhbiBmb3IgJ2Jlc3RfcGF0aCcgYW5kIChyZWN1cnNpdmVseSkK ICoJICBwbGFucyBmb3IgaXRzIHN1YnBhdGhzLgogKi8Kc3RhdGljIEdhdGhlck1lcmdlICoK Y3JlYXRlX2dhdGhlcl9tZXJnZV9wbGFuKFBsYW5uZXJJbmZvICpyb290LCBHYXRoZXJNZXJn ZVBhdGggKmJlc3RfcGF0aCkKewoJR2F0aGVyTWVyZ2UgKmdtX3BsYW47CglQbGFuCSAgICpz dWJwbGFuOwoJTGlzdAkgICAqcGF0aGtleXMgPSBiZXN0X3BhdGgtPnBhdGgucGF0aGtleXM7 CglMaXN0CSAgICp0bGlzdCA9IGJ1aWxkX3BhdGhfdGxpc3Qocm9vdCwgJmJlc3RfcGF0aC0+ cGF0aCk7CgoJLyogQXMgd2l0aCBHYXRoZXIsIHByb2plY3QgYXdheSBjb2x1bW5zIGluIHRo ZSB3b3JrZXJzLiAqLwoJc3VicGxhbiA9IGNyZWF0ZV9wbGFuX3JlY3Vyc2Uocm9vdCwgYmVz dF9wYXRoLT5zdWJwYXRoLCBDUF9FWEFDVF9UTElTVCk7CgoJLyogQ3JlYXRlIGEgc2hlbGwg Zm9yIGEgR2F0aGVyTWVyZ2UgcGxhbi4gKi8KCWdtX3BsYW4gPSBtYWtlTm9kZShHYXRoZXJN ZXJnZSk7CglnbV9wbGFuLT5wbGFuLnRhcmdldGxpc3QgPSB0bGlzdDsKCWdtX3BsYW4tPm51 bV93b3JrZXJzID0gYmVzdF9wYXRoLT5udW1fd29ya2VyczsKCWNvcHlfZ2VuZXJpY19wYXRo X2luZm8oJmdtX3BsYW4tPnBsYW4sICZiZXN0X3BhdGgtPnBhdGgpOwoKCS8qIEFzc2lnbiB0 aGUgcmVzY2FuIFBhcmFtLiAqLwoJZ21fcGxhbi0+cmVzY2FuX3BhcmFtID0gYXNzaWduX3Nw ZWNpYWxfZXhlY19wYXJhbShyb290KTsKCgkvKiBHYXRoZXIgTWVyZ2UgaXMgcG9pbnRsZXNz IHdpdGggbm8gcGF0aGtleXM7IHVzZSBHYXRoZXIgaW5zdGVhZC4gKi8KCUFzc2VydChwYXRo a2V5cyAhPSBOSUwpOwoKCS8qIENvbXB1dGUgc29ydCBjb2x1bW4gaW5mbywgYW5kIGFkanVz dCBzdWJwbGFuJ3MgdGxpc3QgYXMgbmVlZGVkICovCglzdWJwbGFuID0gcHJlcGFyZV9zb3J0 X2Zyb21fcGF0aGtleXMoc3VicGxhbiwgcGF0aGtleXMsCgkJCQkJCQkJCQkgYmVzdF9wYXRo LT5zdWJwYXRoLT5wYXJlbnQtPnJlbGlkcywKCQkJCQkJCQkJCSBnbV9wbGFuLT5zb3J0Q29s SWR4LAoJCQkJCQkJCQkJIGZhbHNlLAoJCQkJCQkJCQkJICZnbV9wbGFuLT5udW1Db2xzLAoJ CQkJCQkJCQkJICZnbV9wbGFuLT5zb3J0Q29sSWR4LAoJCQkJCQkJCQkJICZnbV9wbGFuLT5z b3J0T3BlcmF0b3JzLAoJCQkJCQkJCQkJICZnbV9wbGFuLT5jb2xsYXRpb25zLAoJCQkJCQkJ CQkJICZnbV9wbGFuLT5udWxsc0ZpcnN0KTsKCgkvKgoJICogQWxsIGdhdGhlciBtZXJnZSBw YXRocyBzaG91bGQgaGF2ZSBhbHJlYWR5IGd1YXJhbnRlZWQgdGhlIG5lY2Vzc2FyeQoJICog c29ydCBvcmRlci4gIFNlZSBjcmVhdGVfZ2F0aGVyX21lcmdlX3BhdGguCgkgKi8KCUFzc2Vy dChwYXRoa2V5c19jb250YWluZWRfaW4ocGF0aGtleXMsIGJlc3RfcGF0aC0+c3VicGF0aC0+ cGF0aGtleXMpKTsKCgkvKiBOb3cgaW5zZXJ0IHRoZSBzdWJwbGFuIHVuZGVyIEdhdGhlck1l cmdlLiAqLwoJZ21fcGxhbi0+cGxhbi5sZWZ0dHJlZSA9IHN1YnBsYW47CgoJLyogdXNlIHBh cmFsbGVsIG1vZGUgZm9yIHBhcmFsbGVsIHBsYW5zLiAqLwoJcm9vdC0+Z2xvYi0+cGFyYWxs ZWxNb2RlTmVlZGVkID0gdHJ1ZTsKCglyZXR1cm4gZ21fcGxhbjsKfQoKLyoKICogY3JlYXRl X3Byb2plY3Rpb25fcGxhbgogKgogKgkgIENyZWF0ZSBhIHBsYW4gdHJlZSB0byBkbyBhIHBy b2plY3Rpb24gc3RlcCBhbmQgKHJlY3Vyc2l2ZWx5KSBwbGFucwogKgkgIGZvciBpdHMgc3Vi cGF0aHMuICBXZSBtYXkgbmVlZCBhIFJlc3VsdCBub2RlIGZvciB0aGUgcHJvamVjdGlvbiwK ICoJICBidXQgc29tZXRpbWVzIHdlIGNhbiBqdXN0IGxldCB0aGUgc3VicGxhbiBkbyB0aGUg d29yay4KICovCnN0YXRpYyBQbGFuICoKY3JlYXRlX3Byb2plY3Rpb25fcGxhbihQbGFubmVy SW5mbyAqcm9vdCwgUHJvamVjdGlvblBhdGggKmJlc3RfcGF0aCwgaW50IGZsYWdzKQp7CglQ bGFuCSAgICpwbGFuOwoJUGxhbgkgICAqc3VicGxhbjsKCUxpc3QJICAgKnRsaXN0OwoJYm9v bAkJbmVlZHNfcmVzdWx0X25vZGUgPSBmYWxzZTsKCgkvKgoJICogQ29udmVydCBvdXIgc3Vi cGF0aCB0byBhIFBsYW4gYW5kIGRldGVybWluZSB3aGV0aGVyIHdlIG5lZWQgYSBSZXN1bHQK CSAqIG5vZGUuCgkgKgoJICogSW4gbW9zdCBjYXNlcyB3aGVyZSB3ZSBkb24ndCBuZWVkIHRv IHByb2plY3QsIGNyZWF0ZV9wcm9qZWN0aW9uX3BhdGgKCSAqIHdpbGwgaGF2ZSBzZXQgZHVt bXlwcCwgYnV0IG5vdCBhbHdheXMuICBGaXJzdCwgc29tZSBjcmVhdGVwbGFuLmMKCSAqIHJv dXRpbmVzIGNoYW5nZSB0aGUgdGxpc3RzIG9mIHRoZWlyIG5vZGVzLiAgKEFuIGV4YW1wbGUg aXMgdGhhdAoJICogY3JlYXRlX21lcmdlX2FwcGVuZF9wbGFuIG1pZ2h0IGFkZCByZXNqdW5r IHNvcnQgY29sdW1ucyB0byBhCgkgKiBNZXJnZUFwcGVuZC4pICBTZWNvbmQsIGNyZWF0ZV9w cm9qZWN0aW9uX3BhdGggaGFzIG5vIHdheSBvZiBrbm93aW5nCgkgKiB3aGF0IHBhdGggbm9k ZSB3aWxsIGJlIHBsYWNlZCBvbiB0b3Agb2YgdGhlIHByb2plY3Rpb24gcGF0aCBhbmQKCSAq IHRoZXJlZm9yZSBjYW4ndCBwcmVkaWN0IHdoZXRoZXIgaXQgd2lsbCByZXF1aXJlIGFuIGV4 YWN0IHRsaXN0LiBGb3IKCSAqIGJvdGggb2YgdGhlc2UgcmVhc29ucywgd2UgaGF2ZSB0byBy ZWNoZWNrIGhlcmUuCgkgKi8KCWlmICh1c2VfcGh5c2ljYWxfdGxpc3Qocm9vdCwgJmJlc3Rf cGF0aC0+cGF0aCwgZmxhZ3MpKQoJewoJCS8qCgkJICogT3VyIGNhbGxlciBkb2Vzbid0IHJl YWxseSBjYXJlIHdoYXQgdGxpc3Qgd2UgcmV0dXJuLCBzbyB3ZSBkb24ndAoJCSAqIGFjdHVh bGx5IG5lZWQgdG8gcHJvamVjdC4gIEhvd2V2ZXIsIHdlIG1heSBzdGlsbCBuZWVkIHRvIGVu c3VyZQoJCSAqIHByb3BlciBzb3J0Z3JvdXByZWYgbGFiZWxzLCBpZiB0aGUgY2FsbGVyIGNh cmVzIGFib3V0IHRob3NlLgoJCSAqLwoJCXN1YnBsYW4gPSBjcmVhdGVfcGxhbl9yZWN1cnNl KHJvb3QsIGJlc3RfcGF0aC0+c3VicGF0aCwgMCk7CgkJdGxpc3QgPSBzdWJwbGFuLT50YXJn ZXRsaXN0OwoJCWlmIChmbGFncyAmIENQX0xBQkVMX1RMSVNUKQoJCQlhcHBseV9wYXRodGFy Z2V0X2xhYmVsaW5nX3RvX3RsaXN0KHRsaXN0LAoJCQkJCQkJCQkJCSAgIGJlc3RfcGF0aC0+ cGF0aC5wYXRodGFyZ2V0KTsKCX0KCWVsc2UgaWYgKGlzX3Byb2plY3Rpb25fY2FwYWJsZV9w YXRoKGJlc3RfcGF0aC0+c3VicGF0aCkpCgl7CgkJLyoKCQkgKiBPdXIgY2FsbGVyIHJlcXVp cmVzIHRoYXQgd2UgcmV0dXJuIHRoZSBleGFjdCB0bGlzdCwgYnV0IG5vIHNlcGFyYXRlCgkJ ICogcmVzdWx0IG5vZGUgaXMgbmVlZGVkIGJlY2F1c2UgdGhlIHN1YnBhdGggaXMgcHJvamVj dGlvbi1jYXBhYmxlLgoJCSAqIFRlbGwgY3JlYXRlX3BsYW5fcmVjdXJzZSB0aGF0IHdlJ3Jl IGdvaW5nIHRvIGlnbm9yZSB0aGUgdGxpc3QgaXQKCQkgKiBwcm9kdWNlcy4KCQkgKi8KCQlz dWJwbGFuID0gY3JlYXRlX3BsYW5fcmVjdXJzZShyb290LCBiZXN0X3BhdGgtPnN1YnBhdGgs CgkJCQkJCQkJCSAgQ1BfSUdOT1JFX1RMSVNUKTsKCQlBc3NlcnQoaXNfcHJvamVjdGlvbl9j YXBhYmxlX3BsYW4oc3VicGxhbikpOwoJCXRsaXN0ID0gYnVpbGRfcGF0aF90bGlzdChyb290 LCAmYmVzdF9wYXRoLT5wYXRoKTsKCX0KCWVsc2UKCXsKCQkvKgoJCSAqIEl0IGxvb2tzIGxp a2Ugd2UgbmVlZCBhIHJlc3VsdCBub2RlLCB1bmxlc3MgYnkgZ29vZCBmb3J0dW5lIHRoZQoJ CSAqIHJlcXVlc3RlZCB0bGlzdCBpcyBleGFjdGx5IHRoZSBvbmUgdGhlIGNoaWxkIHdhbnRz IHRvIHByb2R1Y2UuCgkJICovCgkJc3VicGxhbiA9IGNyZWF0ZV9wbGFuX3JlY3Vyc2Uocm9v dCwgYmVzdF9wYXRoLT5zdWJwYXRoLCAwKTsKCQl0bGlzdCA9IGJ1aWxkX3BhdGhfdGxpc3Qo cm9vdCwgJmJlc3RfcGF0aC0+cGF0aCk7CgkJbmVlZHNfcmVzdWx0X25vZGUgPSAhdGxpc3Rf c2FtZV9leHBycyh0bGlzdCwgc3VicGxhbi0+dGFyZ2V0bGlzdCk7Cgl9CgoJLyoKCSAqIElm IHdlIG1ha2UgYSBkaWZmZXJlbnQgZGVjaXNpb24gYWJvdXQgd2hldGhlciB0byBpbmNsdWRl IGEgUmVzdWx0IG5vZGUKCSAqIHRoYW4gY3JlYXRlX3Byb2plY3Rpb25fcGF0aCBkaWQsIHdl J2xsIGhhdmUgbWFkZSBzbGlnaHRseSB3cm9uZyBjb3N0CgkgKiBlc3RpbWF0ZXM7IGJ1dCBs YWJlbCB0aGUgcGxhbiB3aXRoIHRoZSBjb3N0IGVzdGltYXRlcyB3ZSBhY3R1YWxseSB1c2Vk LAoJICogbm90ICJjb3JyZWN0ZWQiIG9uZXMuICAoWFhYIHRoaXMgY291bGQgYmUgY2xlYW5l ZCB1cCBpZiB3ZSBtb3ZlZCBtb3JlCgkgKiBvZiB0aGUgc29ydGNvbHVtbiBzZXR1cCBsb2dp YyBpbnRvIFBhdGggY3JlYXRpb24sIGJ1dCB0aGF0IHdvdWxkIGFkZAoJICogZXhwZW5zZSB0 byBjcmVhdGluZyBQYXRocyB3ZSBtaWdodCBlbmQgdXAgbm90IHVzaW5nLikKCSAqLwoJaWYg KCFuZWVkc19yZXN1bHRfbm9kZSkKCXsKCQkvKiBEb24ndCBuZWVkIGEgc2VwYXJhdGUgUmVz dWx0LCBqdXN0IGFzc2lnbiB0bGlzdCB0byBzdWJwbGFuICovCgkJcGxhbiA9IHN1YnBsYW47 CgkJcGxhbi0+dGFyZ2V0bGlzdCA9IHRsaXN0OwoKCQkvKiBMYWJlbCBwbGFuIHdpdGggdGhl IGVzdGltYXRlZCBjb3N0cyB3ZSBhY3R1YWxseSB1c2VkICovCgkJcGxhbi0+c3RhcnR1cF9j b3N0ID0gYmVzdF9wYXRoLT5wYXRoLnN0YXJ0dXBfY29zdDsKCQlwbGFuLT50b3RhbF9jb3N0 ID0gYmVzdF9wYXRoLT5wYXRoLnRvdGFsX2Nvc3Q7CgkJcGxhbi0+cGxhbl9yb3dzID0gYmVz dF9wYXRoLT5wYXRoLnJvd3M7CgkJcGxhbi0+cGxhbl93aWR0aCA9IGJlc3RfcGF0aC0+cGF0 aC5wYXRodGFyZ2V0LT53aWR0aDsKCQlwbGFuLT5wYXJhbGxlbF9zYWZlID0gYmVzdF9wYXRo LT5wYXRoLnBhcmFsbGVsX3NhZmU7CgkJLyogLi4uIGJ1dCBkb24ndCBjaGFuZ2Ugc3VicGxh bidzIHBhcmFsbGVsX2F3YXJlIGZsYWcgKi8KCX0KCWVsc2UKCXsKCQlwbGFuID0gKFBsYW4g KikgbWFrZV9nYXRpbmdfcmVzdWx0KHRsaXN0LCBOVUxMLCBzdWJwbGFuKTsKCgkJY29weV9n ZW5lcmljX3BhdGhfaW5mbyhwbGFuLCAoUGF0aCAqKSBiZXN0X3BhdGgpOwoJfQoKCXJldHVy biBwbGFuOwp9CgovKgogKiBpbmplY3RfcHJvamVjdGlvbl9wbGFuCiAqCSAgSW5zZXJ0IGEg UmVzdWx0IG5vZGUgdG8gZG8gYSBwcm9qZWN0aW9uIHN0ZXAuCiAqCiAqIFRoaXMgaXMgdXNl ZCBpbiBhIGZldyBwbGFjZXMgd2hlcmUgd2UgZGVjaWRlIG9uLXRoZS1mbHkgdGhhdCB3ZSBu ZWVkIGEKICogcHJvamVjdGlvbiBzdGVwIGFzIHBhcnQgb2YgdGhlIHRyZWUgZ2VuZXJhdGVk IGZvciBzb21lIFBhdGggbm9kZS4KICogV2Ugc2hvdWxkIHRyeSB0byBnZXQgcmlkIG9mIHRo aXMgaW4gZmF2b3Igb2YgZG9pbmcgaXQgbW9yZSBob25lc3RseS4KICoKICogT25lIHJlYXNv biBpdCdzIHVnbHkgaXMgd2UgaGF2ZSB0byBiZSB0b2xkIHRoZSByaWdodCBwYXJhbGxlbF9z YWZlIG1hcmtpbmcKICogdG8gYXBwbHkgKHNpbmNlIHRoZSB0bGlzdCBtaWdodCBiZSB1bnNh ZmUgZXZlbiBpZiB0aGUgY2hpbGQgcGxhbiBpcyBzYWZlKS4KICovCnN0YXRpYyBQbGFuICoK aW5qZWN0X3Byb2plY3Rpb25fcGxhbihQbGFuICpzdWJwbGFuLCBMaXN0ICp0bGlzdCwgYm9v bCBwYXJhbGxlbF9zYWZlKQp7CglQbGFuCSAgICpwbGFuOwoKCXBsYW4gPSAoUGxhbiAqKSBt YWtlX2dhdGluZ19yZXN1bHQodGxpc3QsIE5VTEwsIHN1YnBsYW4pOwoKCS8qCgkgKiBJbiBw cmluY2lwbGUsIHdlIHNob3VsZCBjaGFyZ2UgdGxpc3QgZXZhbCBjb3N0IHBsdXMgY3B1X3Bl cl90dXBsZSBwZXIKCSAqIHJvdyBmb3IgdGhlIFJlc3VsdCBub2RlLiAgQnV0IHRoZSBmb3Jt ZXIgaGFzIHByb2JhYmx5IGJlZW4gZmFjdG9yZWQgaW4KCSAqIGFscmVhZHkgYW5kIHRoZSBs YXR0ZXIgd2FzIG5vdCBhY2NvdW50ZWQgZm9yIGR1cmluZyBQYXRoIGNvbnN0cnVjdGlvbiwK CSAqIHNvIGJlaW5nIGZvcm1hbGx5IGNvcnJlY3QgbWlnaHQganVzdCBtYWtlIHRoZSBFWFBM QUlOIG91dHB1dCBsb29rIGxlc3MKCSAqIGNvbnNpc3RlbnQgbm90IG1vcmUgc28uICBIZW5j ZSwganVzdCBjb3B5IHRoZSBzdWJwbGFuJ3MgY29zdC4KCSAqLwoJY29weV9wbGFuX2Nvc3Rz aXplKHBsYW4sIHN1YnBsYW4pOwoJcGxhbi0+cGFyYWxsZWxfc2FmZSA9IHBhcmFsbGVsX3Nh ZmU7CgoJcmV0dXJuIHBsYW47Cn0KCi8qCiAqIGNoYW5nZV9wbGFuX3RhcmdldGxpc3QKICoJ ICBFeHRlcm5hbGx5IGF2YWlsYWJsZSB3cmFwcGVyIGZvciBpbmplY3RfcHJvamVjdGlvbl9w bGFuLgogKgogKiBUaGlzIGlzIG1lYW50IGZvciB1c2UgYnkgRkRXIHBsYW4tZ2VuZXJhdGlv biBmdW5jdGlvbnMsIHdoaWNoIG1pZ2h0CiAqIHdhbnQgdG8gYWRqdXN0IHRoZSB0bGlzdCBj b21wdXRlZCBieSBzb21lIHN1YnBsYW4gdHJlZS4gIEluIGdlbmVyYWwsCiAqIGEgUmVzdWx0 IG5vZGUgaXMgbmVlZGVkIHRvIGNvbXB1dGUgdGhlIG5ldyB0bGlzdCwgYnV0IHdlIGNhbiBv cHRpbWl6ZQogKiBzb21lIGNhc2VzLgogKgogKiBJbiBtb3N0IGNhc2VzLCB0bGlzdF9wYXJh bGxlbF9zYWZlIGNhbiBqdXN0IGJlIHBhc3NlZCBhcyB0aGUgcGFyYWxsZWxfc2FmZQogKiBm bGFnIG9mIHRoZSBGRFcncyBvd24gUGF0aCBub2RlLgogKi8KUGxhbiAqCmNoYW5nZV9wbGFu X3RhcmdldGxpc3QoUGxhbiAqc3VicGxhbiwgTGlzdCAqdGxpc3QsIGJvb2wgdGxpc3RfcGFy YWxsZWxfc2FmZSkKewoJLyoKCSAqIElmIHRoZSB0b3AgcGxhbiBub2RlIGNhbid0IGRvIHBy b2plY3Rpb25zIGFuZCBpdHMgZXhpc3RpbmcgdGFyZ2V0IGxpc3QKCSAqIGlzbid0IGFscmVh ZHkgd2hhdCB3ZSBuZWVkLCB3ZSBuZWVkIHRvIGFkZCBhIFJlc3VsdCBub2RlIHRvIGhlbHAg aXQKCSAqIGFsb25nLgoJICovCglpZiAoIWlzX3Byb2plY3Rpb25fY2FwYWJsZV9wbGFuKHN1 YnBsYW4pICYmCgkJIXRsaXN0X3NhbWVfZXhwcnModGxpc3QsIHN1YnBsYW4tPnRhcmdldGxp c3QpKQoJCXN1YnBsYW4gPSBpbmplY3RfcHJvamVjdGlvbl9wbGFuKHN1YnBsYW4sIHRsaXN0 LAoJCQkJCQkJCQkJIHN1YnBsYW4tPnBhcmFsbGVsX3NhZmUgJiYKCQkJCQkJCQkJCSB0bGlz dF9wYXJhbGxlbF9zYWZlKTsKCWVsc2UKCXsKCQkvKiBFbHNlIHdlIGNhbiBqdXN0IHJlcGxh Y2UgdGhlIHBsYW4gbm9kZSdzIHRsaXN0ICovCgkJc3VicGxhbi0+dGFyZ2V0bGlzdCA9IHRs aXN0OwoJCXN1YnBsYW4tPnBhcmFsbGVsX3NhZmUgJj0gdGxpc3RfcGFyYWxsZWxfc2FmZTsK CX0KCXJldHVybiBzdWJwbGFuOwp9CgovKgogKiBjcmVhdGVfc29ydF9wbGFuCiAqCiAqCSAg Q3JlYXRlIGEgU29ydCBwbGFuIGZvciAnYmVzdF9wYXRoJyBhbmQgKHJlY3Vyc2l2ZWx5KSBw bGFucwogKgkgIGZvciBpdHMgc3VicGF0aHMuCiAqLwpzdGF0aWMgU29ydCAqCmNyZWF0ZV9z b3J0X3BsYW4oUGxhbm5lckluZm8gKnJvb3QsIFNvcnRQYXRoICpiZXN0X3BhdGgsIGludCBm bGFncykKewoJU29ydAkgICAqcGxhbjsKCVBsYW4JICAgKnN1YnBsYW47CgoJLyoKCSAqIFdl IGRvbid0IHdhbnQgYW55IGV4Y2VzcyBjb2x1bW5zIGluIHRoZSBzb3J0ZWQgdHVwbGVzLCBz byByZXF1ZXN0IGEKCSAqIHNtYWxsZXIgdGxpc3QuICBPdGhlcndpc2UsIHNpbmNlIFNvcnQg ZG9lc24ndCBwcm9qZWN0LCB0bGlzdAoJICogcmVxdWlyZW1lbnRzIHBhc3MgdGhyb3VnaC4K CSAqLwoJc3VicGxhbiA9IGNyZWF0ZV9wbGFuX3JlY3Vyc2Uocm9vdCwgYmVzdF9wYXRoLT5z dWJwYXRoLAoJCQkJCQkJCSAgZmxhZ3MgfCBDUF9TTUFMTF9UTElTVCk7CgoJLyoKCSAqIG1h a2Vfc29ydF9mcm9tX3BhdGhrZXlzIGluZGlyZWN0bHkgY2FsbHMgZmluZF9lY19tZW1iZXJf bWF0Y2hpbmdfZXhwciwKCSAqIHdoaWNoIHdpbGwgaWdub3JlIGFueSBjaGlsZCBFQyBtZW1i ZXJzIHRoYXQgZG9uJ3QgYmVsb25nIHRvIHRoZSBnaXZlbgoJICogcmVsaWRzLiBUaHVzLCBp ZiB0aGlzIHNvcnQgcGF0aCBpcyBiYXNlZCBvbiBhIGNoaWxkIHJlbGF0aW9uLCB3ZSBtdXN0 CgkgKiBwYXNzIGl0cyByZWxpZHMuCgkgKi8KCXBsYW4gPSBtYWtlX3NvcnRfZnJvbV9wYXRo a2V5cyhzdWJwbGFuLCBiZXN0X3BhdGgtPnBhdGgucGF0aGtleXMsCgkJCQkJCQkJICAgSVNf T1RIRVJfUkVMKGJlc3RfcGF0aC0+c3VicGF0aC0+cGFyZW50KSA/CgkJCQkJCQkJICAgYmVz dF9wYXRoLT5wYXRoLnBhcmVudC0+cmVsaWRzIDogTlVMTCk7CgoJY29weV9nZW5lcmljX3Bh dGhfaW5mbygmcGxhbi0+cGxhbiwgKFBhdGggKikgYmVzdF9wYXRoKTsKCglyZXR1cm4gcGxh bjsKfQoKLyoKICogY3JlYXRlX2luY3JlbWVudGFsc29ydF9wbGFuCiAqCiAqCSAgRG8gdGhl IHNhbWUgYXMgY3JlYXRlX3NvcnRfcGxhbiwgYnV0IGNyZWF0ZSBJbmNyZW1lbnRhbFNvcnQg cGxhbi4KICovCnN0YXRpYyBJbmNyZW1lbnRhbFNvcnQgKgpjcmVhdGVfaW5jcmVtZW50YWxz b3J0X3BsYW4oUGxhbm5lckluZm8gKnJvb3QsIEluY3JlbWVudGFsU29ydFBhdGggKmJlc3Rf cGF0aCwKCQkJCQkJCWludCBmbGFncykKewoJSW5jcmVtZW50YWxTb3J0ICpwbGFuOwoJUGxh bgkgICAqc3VicGxhbjsKCgkvKiBTZWUgY29tbWVudHMgaW4gY3JlYXRlX3NvcnRfcGxhbigp IGFib3ZlICovCglzdWJwbGFuID0gY3JlYXRlX3BsYW5fcmVjdXJzZShyb290LCBiZXN0X3Bh dGgtPnNwYXRoLnN1YnBhdGgsCgkJCQkJCQkJICBmbGFncyB8IENQX1NNQUxMX1RMSVNUKTsK CXBsYW4gPSBtYWtlX2luY3JlbWVudGFsc29ydF9mcm9tX3BhdGhrZXlzKHN1YnBsYW4sCgkJ CQkJCQkJCQkJICBiZXN0X3BhdGgtPnNwYXRoLnBhdGgucGF0aGtleXMsCgkJCQkJCQkJCQkJ ICBJU19PVEhFUl9SRUwoYmVzdF9wYXRoLT5zcGF0aC5zdWJwYXRoLT5wYXJlbnQpID8KCQkJ CQkJCQkJCQkgIGJlc3RfcGF0aC0+c3BhdGgucGF0aC5wYXJlbnQtPnJlbGlkcyA6IE5VTEws CgkJCQkJCQkJCQkJICBiZXN0X3BhdGgtPm5QcmVzb3J0ZWRDb2xzKTsKCgljb3B5X2dlbmVy aWNfcGF0aF9pbmZvKCZwbGFuLT5zb3J0LnBsYW4sIChQYXRoICopIGJlc3RfcGF0aCk7CgoJ cmV0dXJuIHBsYW47Cn0KCi8qCiAqIGNyZWF0ZV9ncm91cF9wbGFuCiAqCiAqCSAgQ3JlYXRl IGEgR3JvdXAgcGxhbiBmb3IgJ2Jlc3RfcGF0aCcgYW5kIChyZWN1cnNpdmVseSkgcGxhbnMK ICoJICBmb3IgaXRzIHN1YnBhdGhzLgogKi8Kc3RhdGljIEdyb3VwICoKY3JlYXRlX2dyb3Vw X3BsYW4oUGxhbm5lckluZm8gKnJvb3QsIEdyb3VwUGF0aCAqYmVzdF9wYXRoKQp7CglHcm91 cAkgICAqcGxhbjsKCVBsYW4JICAgKnN1YnBsYW47CglMaXN0CSAgICp0bGlzdDsKCUxpc3QJ ICAgKnF1YWxzOwoKCS8qCgkgKiBHcm91cCBjYW4gcHJvamVjdCwgc28gbm8gbmVlZCB0byBi ZSB0ZXJyaWJseSBwaWNreSBhYm91dCBjaGlsZCB0bGlzdCwKCSAqIGJ1dCB3ZSBkbyBuZWVk IGdyb3VwaW5nIGNvbHVtbnMgdG8gYmUgYXZhaWxhYmxlCgkgKi8KCXN1YnBsYW4gPSBjcmVh dGVfcGxhbl9yZWN1cnNlKHJvb3QsIGJlc3RfcGF0aC0+c3VicGF0aCwgQ1BfTEFCRUxfVExJ U1QpOwoKCXRsaXN0ID0gYnVpbGRfcGF0aF90bGlzdChyb290LCAmYmVzdF9wYXRoLT5wYXRo KTsKCglxdWFscyA9IG9yZGVyX3F1YWxfY2xhdXNlcyhyb290LCBiZXN0X3BhdGgtPnF1YWwp OwoKCXBsYW4gPSBtYWtlX2dyb3VwKHRsaXN0LAoJCQkJCSAgcXVhbHMsCgkJCQkJICBsaXN0 X2xlbmd0aChiZXN0X3BhdGgtPmdyb3VwQ2xhdXNlKSwKCQkJCQkgIGV4dHJhY3RfZ3JvdXBp bmdfY29scyhiZXN0X3BhdGgtPmdyb3VwQ2xhdXNlLAoJCQkJCQkJCQkJCXN1YnBsYW4tPnRh cmdldGxpc3QpLAoJCQkJCSAgZXh0cmFjdF9ncm91cGluZ19vcHMoYmVzdF9wYXRoLT5ncm91 cENsYXVzZSksCgkJCQkJICBleHRyYWN0X2dyb3VwaW5nX2NvbGxhdGlvbnMoYmVzdF9wYXRo LT5ncm91cENsYXVzZSwKCQkJCQkJCQkJCQkJICBzdWJwbGFuLT50YXJnZXRsaXN0KSwKCQkJ CQkgIHN1YnBsYW4pOwoKCWNvcHlfZ2VuZXJpY19wYXRoX2luZm8oJnBsYW4tPnBsYW4sIChQ YXRoICopIGJlc3RfcGF0aCk7CgoJcmV0dXJuIHBsYW47Cn0KCi8qCiAqIGNyZWF0ZV91bmlx dWVfcGxhbgogKgogKgkgIENyZWF0ZSBhIFVuaXF1ZSBwbGFuIGZvciAnYmVzdF9wYXRoJyBh bmQgKHJlY3Vyc2l2ZWx5KSBwbGFucwogKgkgIGZvciBpdHMgc3VicGF0aHMuCiAqLwpzdGF0 aWMgVW5pcXVlICoKY3JlYXRlX3VuaXF1ZV9wbGFuKFBsYW5uZXJJbmZvICpyb290LCBVbmlx dWVQYXRoICpiZXN0X3BhdGgsIGludCBmbGFncykKewoJVW5pcXVlCSAgICpwbGFuOwoJUGxh bgkgICAqc3VicGxhbjsKCgkvKgoJICogVW5pcXVlIGRvZXNuJ3QgcHJvamVjdCwgc28gdGxp c3QgcmVxdWlyZW1lbnRzIHBhc3MgdGhyb3VnaDsgbW9yZW92ZXIgd2UKCSAqIG5lZWQgZ3Jv dXBpbmcgY29sdW1ucyB0byBiZSBsYWJlbGVkLgoJICovCglzdWJwbGFuID0gY3JlYXRlX3Bs YW5fcmVjdXJzZShyb290LCBiZXN0X3BhdGgtPnN1YnBhdGgsCgkJCQkJCQkJICBmbGFncyB8 IENQX0xBQkVMX1RMSVNUKTsKCgkvKgoJICogbWFrZV91bmlxdWVfZnJvbV9wYXRoa2V5cyBj YWxscyBmaW5kX2VjX21lbWJlcl9tYXRjaGluZ19leHByLCB3aGljaAoJICogd2lsbCBpZ25v cmUgYW55IGNoaWxkIEVDIG1lbWJlcnMgdGhhdCBkb24ndCBiZWxvbmcgdG8gdGhlIGdpdmVu IHJlbGlkcy4KCSAqIFRodXMsIGlmIHRoaXMgdW5pcXVlIHBhdGggaXMgYmFzZWQgb24gYSBj aGlsZCByZWxhdGlvbiwgd2UgbXVzdCBwYXNzCgkgKiBpdHMgcmVsaWRzLgoJICovCglwbGFu ID0gbWFrZV91bmlxdWVfZnJvbV9wYXRoa2V5cyhzdWJwbGFuLAoJCQkJCQkJCQkgYmVzdF9w YXRoLT5wYXRoLnBhdGhrZXlzLAoJCQkJCQkJCQkgYmVzdF9wYXRoLT5udW1rZXlzLAoJCQkJ CQkJCQkgSVNfT1RIRVJfUkVMKGJlc3RfcGF0aC0+cGF0aC5wYXJlbnQpID8KCQkJCQkJCQkJ IGJlc3RfcGF0aC0+cGF0aC5wYXJlbnQtPnJlbGlkcyA6IE5VTEwpOwoKCWNvcHlfZ2VuZXJp Y19wYXRoX2luZm8oJnBsYW4tPnBsYW4sIChQYXRoICopIGJlc3RfcGF0aCk7CgoJcmV0dXJu IHBsYW47Cn0KCi8qCiAqIGNyZWF0ZV9hZ2dfcGxhbgogKgogKgkgIENyZWF0ZSBhbiBBZ2cg cGxhbiBmb3IgJ2Jlc3RfcGF0aCcgYW5kIChyZWN1cnNpdmVseSkgcGxhbnMKICoJICBmb3Ig aXRzIHN1YnBhdGhzLgogKi8Kc3RhdGljIEFnZyAqCmNyZWF0ZV9hZ2dfcGxhbihQbGFubmVy SW5mbyAqcm9vdCwgQWdnUGF0aCAqYmVzdF9wYXRoKQp7CglBZ2cJCSAgICpwbGFuOwoJUGxh bgkgICAqc3VicGxhbjsKCUxpc3QJICAgKnRsaXN0OwoJTGlzdAkgICAqcXVhbHM7CgoJLyoK CSAqIEFnZyBjYW4gcHJvamVjdCwgc28gbm8gbmVlZCB0byBiZSB0ZXJyaWJseSBwaWNreSBh Ym91dCBjaGlsZCB0bGlzdCwgYnV0CgkgKiB3ZSBkbyBuZWVkIGdyb3VwaW5nIGNvbHVtbnMg dG8gYmUgYXZhaWxhYmxlCgkgKi8KCXN1YnBsYW4gPSBjcmVhdGVfcGxhbl9yZWN1cnNlKHJv b3QsIGJlc3RfcGF0aC0+c3VicGF0aCwgQ1BfTEFCRUxfVExJU1QpOwoKCXRsaXN0ID0gYnVp bGRfcGF0aF90bGlzdChyb290LCAmYmVzdF9wYXRoLT5wYXRoKTsKCglxdWFscyA9IG9yZGVy X3F1YWxfY2xhdXNlcyhyb290LCBiZXN0X3BhdGgtPnF1YWwpOwoKCXBsYW4gPSBtYWtlX2Fn Zyh0bGlzdCwgcXVhbHMsCgkJCQkJYmVzdF9wYXRoLT5hZ2dzdHJhdGVneSwKCQkJCQliZXN0 X3BhdGgtPmFnZ3NwbGl0LAoJCQkJCWxpc3RfbGVuZ3RoKGJlc3RfcGF0aC0+Z3JvdXBDbGF1 c2UpLAoJCQkJCWV4dHJhY3RfZ3JvdXBpbmdfY29scyhiZXN0X3BhdGgtPmdyb3VwQ2xhdXNl LAoJCQkJCQkJCQkJICBzdWJwbGFuLT50YXJnZXRsaXN0KSwKCQkJCQlleHRyYWN0X2dyb3Vw aW5nX29wcyhiZXN0X3BhdGgtPmdyb3VwQ2xhdXNlKSwKCQkJCQlleHRyYWN0X2dyb3VwaW5n X2NvbGxhdGlvbnMoYmVzdF9wYXRoLT5ncm91cENsYXVzZSwKCQkJCQkJCQkJCQkJc3VicGxh bi0+dGFyZ2V0bGlzdCksCgkJCQkJTklMLAoJCQkJCU5JTCwKCQkJCQliZXN0X3BhdGgtPm51 bUdyb3VwcywKCQkJCQliZXN0X3BhdGgtPnRyYW5zaXRpb25TcGFjZSwKCQkJCQlzdWJwbGFu KTsKCgljb3B5X2dlbmVyaWNfcGF0aF9pbmZvKCZwbGFuLT5wbGFuLCAoUGF0aCAqKSBiZXN0 X3BhdGgpOwoKCXJldHVybiBwbGFuOwp9CgovKgogKiBHaXZlbiBhIGdyb3VwY2xhdXNlIGZv ciBhIGNvbGxlY3Rpb24gb2YgZ3JvdXBpbmcgc2V0cywgcHJvZHVjZSB0aGUKICogY29ycmVz cG9uZGluZyBncm91cENvbElkeC4KICoKICogcm9vdC0+Z3JvdXBpbmdfbWFwIG1hcHMgdGhl IHRsZVNvcnRHcm91cFJlZiB0byB0aGUgYWN0dWFsIGNvbHVtbiBwb3NpdGlvbiBpbgogKiB0 aGUgaW5wdXQgdHVwbGUuIFNvIHdlIGdldCB0aGUgcmVmIGZyb20gdGhlIGVudHJpZXMgaW4g dGhlIGdyb3VwY2xhdXNlIGFuZAogKiBsb29rIHRoZW0gdXAgdGhlcmUuCiAqLwpzdGF0aWMg QXR0ck51bWJlciAqCnJlbWFwX2dyb3VwQ29sSWR4KFBsYW5uZXJJbmZvICpyb290LCBMaXN0 ICpncm91cENsYXVzZSkKewoJQXR0ck51bWJlciAqZ3JvdXBpbmdfbWFwID0gcm9vdC0+Z3Jv dXBpbmdfbWFwOwoJQXR0ck51bWJlciAqbmV3X2dycENvbElkeDsKCUxpc3RDZWxsICAgKmxj OwoJaW50CQkJaTsKCglBc3NlcnQoZ3JvdXBpbmdfbWFwKTsKCgluZXdfZ3JwQ29sSWR4ID0g cGFsbG9jMF9hcnJheShBdHRyTnVtYmVyLCBsaXN0X2xlbmd0aChncm91cENsYXVzZSkpOwoK CWkgPSAwOwoJZm9yZWFjaChsYywgZ3JvdXBDbGF1c2UpCgl7CgkJU29ydEdyb3VwQ2xhdXNl ICpjbGF1c2UgPSBsZmlyc3QobGMpOwoKCQluZXdfZ3JwQ29sSWR4W2krK10gPSBncm91cGlu Z19tYXBbY2xhdXNlLT50bGVTb3J0R3JvdXBSZWZdOwoJfQoKCXJldHVybiBuZXdfZ3JwQ29s SWR4Owp9CgovKgogKiBjcmVhdGVfZ3JvdXBpbmdzZXRzX3BsYW4KICoJICBDcmVhdGUgYSBw bGFuIGZvciAnYmVzdF9wYXRoJyBhbmQgKHJlY3Vyc2l2ZWx5KSBwbGFucwogKgkgIGZvciBp dHMgc3VicGF0aHMuCiAqCiAqCSAgV2hhdCB3ZSBlbWl0IGlzIGFuIEFnZyBwbGFuIHdpdGgg c29tZSB2ZXN0aWdpYWwgQWdnIGFuZCBTb3J0IG5vZGVzCiAqCSAgaGFuZ2luZyBvZmYgdGhl IHNpZGUuICBUaGUgdG9wIEFnZyBpbXBsZW1lbnRzIHRoZSBsYXN0IGdyb3VwaW5nIHNldAog KgkgIHNwZWNpZmllZCBpbiB0aGUgR3JvdXBpbmdTZXRzUGF0aCwgYW5kIGFueSBhZGRpdGlv bmFsIGdyb3VwaW5nIHNldHMKICoJICBlYWNoIGdpdmUgcmlzZSB0byBhIHN1YnNpZGlhcnkg QWdnIGFuZCBTb3J0IG5vZGUgaW4gdGhlIHRvcCBBZ2cncwogKgkgICJjaGFpbiIgbGlzdC4g IFRoZXNlIG5vZGVzIGRvbid0IHBhcnRpY2lwYXRlIGluIHRoZSBwbGFuIGRpcmVjdGx5LAog KgkgIGJ1dCB0aGV5IGFyZSBhIGNvbnZlbmllbnQgd2F5IHRvIHJlcHJlc2VudCB0aGUgcmVx dWlyZWQgZGF0YSBmb3IKICoJICB0aGUgZXh0cmEgc3RlcHMuCiAqCiAqCSAgUmV0dXJucyBh IFBsYW4gbm9kZS4KICovCnN0YXRpYyBQbGFuICoKY3JlYXRlX2dyb3VwaW5nc2V0c19wbGFu KFBsYW5uZXJJbmZvICpyb290LCBHcm91cGluZ1NldHNQYXRoICpiZXN0X3BhdGgpCnsKCUFn ZwkJICAgKnBsYW47CglQbGFuCSAgICpzdWJwbGFuOwoJTGlzdAkgICAqcm9sbHVwcyA9IGJl c3RfcGF0aC0+cm9sbHVwczsKCUF0dHJOdW1iZXIgKmdyb3VwaW5nX21hcDsKCWludAkJCW1h eHJlZjsKCUxpc3QJICAgKmNoYWluOwoJTGlzdENlbGwgICAqbGM7CgoJLyogU2hvdWxkbid0 IGdldCBoZXJlIHdpdGhvdXQgZ3JvdXBpbmcgc2V0cyAqLwoJQXNzZXJ0KHJvb3QtPnBhcnNl LT5ncm91cGluZ1NldHMpOwoJQXNzZXJ0KHJvbGx1cHMgIT0gTklMKTsKCgkvKgoJICogQWdn IGNhbiBwcm9qZWN0LCBzbyBubyBuZWVkIHRvIGJlIHRlcnJpYmx5IHBpY2t5IGFib3V0IGNo aWxkIHRsaXN0LCBidXQKCSAqIHdlIGRvIG5lZWQgZ3JvdXBpbmcgY29sdW1ucyB0byBiZSBh dmFpbGFibGUKCSAqLwoJc3VicGxhbiA9IGNyZWF0ZV9wbGFuX3JlY3Vyc2Uocm9vdCwgYmVz dF9wYXRoLT5zdWJwYXRoLCBDUF9MQUJFTF9UTElTVCk7CgoJLyoKCSAqIENvbXB1dGUgdGhl IG1hcHBpbmcgZnJvbSB0bGVTb3J0R3JvdXBSZWYgdG8gY29sdW1uIGluZGV4IGluIHRoZSBj aGlsZCdzCgkgKiB0bGlzdC4gIEZpcnN0LCBpZGVudGlmeSBtYXggU29ydEdyb3VwUmVmIGlu IGdyb3VwQ2xhdXNlLCBmb3IgYXJyYXkKCSAqIHNpemluZy4KCSAqLwoJbWF4cmVmID0gMDsK CWZvcmVhY2gobGMsIHJvb3QtPnByb2Nlc3NlZF9ncm91cENsYXVzZSkKCXsKCQlTb3J0R3Jv dXBDbGF1c2UgKmdjID0gKFNvcnRHcm91cENsYXVzZSAqKSBsZmlyc3QobGMpOwoKCQlpZiAo Z2MtPnRsZVNvcnRHcm91cFJlZiA+IG1heHJlZikKCQkJbWF4cmVmID0gZ2MtPnRsZVNvcnRH cm91cFJlZjsKCX0KCglncm91cGluZ19tYXAgPSAoQXR0ck51bWJlciAqKSBwYWxsb2MwKCht YXhyZWYgKyAxKSAqIHNpemVvZihBdHRyTnVtYmVyKSk7CgoJLyogTm93IGxvb2sgdXAgdGhl IGNvbHVtbiBudW1iZXJzIGluIHRoZSBjaGlsZCdzIHRsaXN0ICovCglmb3JlYWNoKGxjLCBy b290LT5wcm9jZXNzZWRfZ3JvdXBDbGF1c2UpCgl7CgkJU29ydEdyb3VwQ2xhdXNlICpnYyA9 IChTb3J0R3JvdXBDbGF1c2UgKikgbGZpcnN0KGxjKTsKCQlUYXJnZXRFbnRyeSAqdGxlID0g Z2V0X3NvcnRncm91cGNsYXVzZV90bGUoZ2MsIHN1YnBsYW4tPnRhcmdldGxpc3QpOwoKCQln cm91cGluZ19tYXBbZ2MtPnRsZVNvcnRHcm91cFJlZl0gPSB0bGUtPnJlc25vOwoJfQoKCS8q CgkgKiBEdXJpbmcgc2V0cmVmcy5jLCB3ZSdsbCBuZWVkIHRoZSBncm91cGluZ19tYXAgdG8g Zml4IHVwIHRoZSBjb2xzIGxpc3RzCgkgKiBpbiBHcm91cGluZ0Z1bmMgbm9kZXMuICBTYXZl IGl0IGZvciBzZXRyZWZzLmMgdG8gdXNlLgoJICovCglBc3NlcnQocm9vdC0+Z3JvdXBpbmdf bWFwID09IE5VTEwpOwoJcm9vdC0+Z3JvdXBpbmdfbWFwID0gZ3JvdXBpbmdfbWFwOwoKCS8q CgkgKiBHZW5lcmF0ZSB0aGUgc2lkZSBub2RlcyB0aGF0IGRlc2NyaWJlIHRoZSBvdGhlciBz b3J0IGFuZCBncm91cAoJICogb3BlcmF0aW9ucyBiZXNpZGVzIHRoZSB0b3Agb25lLiAgTm90 ZSB0aGF0IHdlIGRvbid0IHdvcnJ5IGFib3V0IHB1dHRpbmcKCSAqIGFjY3VyYXRlIGNvc3Qg ZXN0aW1hdGVzIGluIHRoZSBzaWRlIG5vZGVzOyBvbmx5IHRoZSB0b3Btb3N0IEFnZyBub2Rl J3MKCSAqIGNvc3RzIHdpbGwgYmUgc2hvd24gYnkgRVhQTEFJTi4KCSAqLwoJY2hhaW4gPSBO SUw7CglpZiAobGlzdF9sZW5ndGgocm9sbHVwcykgPiAxKQoJewoJCWJvb2wJCWlzX2ZpcnN0 X3NvcnQgPSAoKFJvbGx1cERhdGEgKikgbGluaXRpYWwocm9sbHVwcykpLT5pc19oYXNoZWQ7 CgoJCWZvcl9lYWNoX2Zyb20obGMsIHJvbGx1cHMsIDEpCgkJewoJCQlSb2xsdXBEYXRhICpy b2xsdXAgPSBsZmlyc3QobGMpOwoJCQlBdHRyTnVtYmVyICpuZXdfZ3JwQ29sSWR4OwoJCQlQ bGFuCSAgICpzb3J0X3BsYW4gPSBOVUxMOwoJCQlQbGFuCSAgICphZ2dfcGxhbjsKCQkJQWdn U3RyYXRlZ3kgc3RyYXQ7CgoJCQluZXdfZ3JwQ29sSWR4ID0gcmVtYXBfZ3JvdXBDb2xJZHgo cm9vdCwgcm9sbHVwLT5ncm91cENsYXVzZSk7CgoJCQlpZiAoIXJvbGx1cC0+aXNfaGFzaGVk ICYmICFpc19maXJzdF9zb3J0KQoJCQl7CgkJCQlzb3J0X3BsYW4gPSAoUGxhbiAqKQoJCQkJ CW1ha2Vfc29ydF9mcm9tX2dyb3VwY29scyhyb2xsdXAtPmdyb3VwQ2xhdXNlLAoJCQkJCQkJ CQkJCSBuZXdfZ3JwQ29sSWR4LAoJCQkJCQkJCQkJCSBzdWJwbGFuKTsKCQkJfQoKCQkJaWYg KCFyb2xsdXAtPmlzX2hhc2hlZCkKCQkJCWlzX2ZpcnN0X3NvcnQgPSBmYWxzZTsKCgkJCWlm IChyb2xsdXAtPmlzX2hhc2hlZCkKCQkJCXN0cmF0ID0gQUdHX0hBU0hFRDsKCQkJZWxzZSBp ZiAobGluaXRpYWwocm9sbHVwLT5nc2V0cykgPT0gTklMKQoJCQkJc3RyYXQgPSBBR0dfUExB SU47CgkJCWVsc2UKCQkJCXN0cmF0ID0gQUdHX1NPUlRFRDsKCgkJCWFnZ19wbGFuID0gKFBs YW4gKikgbWFrZV9hZ2coTklMLAoJCQkJCQkJCQkJIE5JTCwKCQkJCQkJCQkJCSBzdHJhdCwK CQkJCQkJCQkJCSBBR0dTUExJVF9TSU1QTEUsCgkJCQkJCQkJCQkgbGlzdF9sZW5ndGgoKExp c3QgKikgbGluaXRpYWwocm9sbHVwLT5nc2V0cykpLAoJCQkJCQkJCQkJIG5ld19ncnBDb2xJ ZHgsCgkJCQkJCQkJCQkgZXh0cmFjdF9ncm91cGluZ19vcHMocm9sbHVwLT5ncm91cENsYXVz ZSksCgkJCQkJCQkJCQkgZXh0cmFjdF9ncm91cGluZ19jb2xsYXRpb25zKHJvbGx1cC0+Z3Jv dXBDbGF1c2UsIHN1YnBsYW4tPnRhcmdldGxpc3QpLAoJCQkJCQkJCQkJIHJvbGx1cC0+Z3Nl dHMsCgkJCQkJCQkJCQkgTklMLAoJCQkJCQkJCQkJIHJvbGx1cC0+bnVtR3JvdXBzLAoJCQkJ CQkJCQkJIGJlc3RfcGF0aC0+dHJhbnNpdGlvblNwYWNlLAoJCQkJCQkJCQkJIHNvcnRfcGxh bik7CgoJCQkvKgoJCQkgKiBSZW1vdmUgc3R1ZmYgd2UgZG9uJ3QgbmVlZCB0byBhdm9pZCBi bG9hdGluZyBkZWJ1ZyBvdXRwdXQuCgkJCSAqLwoJCQlpZiAoc29ydF9wbGFuKQoJCQl7CgkJ CQlzb3J0X3BsYW4tPnRhcmdldGxpc3QgPSBOSUw7CgkJCQlzb3J0X3BsYW4tPmxlZnR0cmVl ID0gTlVMTDsKCQkJfQoKCQkJY2hhaW4gPSBsYXBwZW5kKGNoYWluLCBhZ2dfcGxhbik7CgkJ fQoJfQoKCS8qCgkgKiBOb3cgbWFrZSB0aGUgcmVhbCBBZ2cgbm9kZQoJICovCgl7CgkJUm9s bHVwRGF0YSAqcm9sbHVwID0gbGluaXRpYWwocm9sbHVwcyk7CgkJQXR0ck51bWJlciAqdG9w X2dycENvbElkeDsKCQlpbnQJCQludW1Hcm91cENvbHM7CgoJCXRvcF9ncnBDb2xJZHggPSBy ZW1hcF9ncm91cENvbElkeChyb290LCByb2xsdXAtPmdyb3VwQ2xhdXNlKTsKCgkJbnVtR3Jv dXBDb2xzID0gbGlzdF9sZW5ndGgoKExpc3QgKikgbGluaXRpYWwocm9sbHVwLT5nc2V0cykp OwoKCQlwbGFuID0gbWFrZV9hZ2coYnVpbGRfcGF0aF90bGlzdChyb290LCAmYmVzdF9wYXRo LT5wYXRoKSwKCQkJCQkJYmVzdF9wYXRoLT5xdWFsLAoJCQkJCQliZXN0X3BhdGgtPmFnZ3N0 cmF0ZWd5LAoJCQkJCQlBR0dTUExJVF9TSU1QTEUsCgkJCQkJCW51bUdyb3VwQ29scywKCQkJ CQkJdG9wX2dycENvbElkeCwKCQkJCQkJZXh0cmFjdF9ncm91cGluZ19vcHMocm9sbHVwLT5n cm91cENsYXVzZSksCgkJCQkJCWV4dHJhY3RfZ3JvdXBpbmdfY29sbGF0aW9ucyhyb2xsdXAt Pmdyb3VwQ2xhdXNlLCBzdWJwbGFuLT50YXJnZXRsaXN0KSwKCQkJCQkJcm9sbHVwLT5nc2V0 cywKCQkJCQkJY2hhaW4sCgkJCQkJCXJvbGx1cC0+bnVtR3JvdXBzLAoJCQkJCQliZXN0X3Bh dGgtPnRyYW5zaXRpb25TcGFjZSwKCQkJCQkJc3VicGxhbik7CgoJCS8qIENvcHkgY29zdCBk YXRhIGZyb20gUGF0aCB0byBQbGFuICovCgkJY29weV9nZW5lcmljX3BhdGhfaW5mbygmcGxh bi0+cGxhbiwgJmJlc3RfcGF0aC0+cGF0aCk7Cgl9CgoJcmV0dXJuIChQbGFuICopIHBsYW47 Cn0KCi8qCiAqIGNyZWF0ZV9taW5tYXhhZ2dfcGxhbgogKgogKgkgIENyZWF0ZSBhIFJlc3Vs dCBwbGFuIGZvciAnYmVzdF9wYXRoJyBhbmQgKHJlY3Vyc2l2ZWx5KSBwbGFucwogKgkgIGZv ciBpdHMgc3VicGF0aHMuCiAqLwpzdGF0aWMgUmVzdWx0ICoKY3JlYXRlX21pbm1heGFnZ19w bGFuKFBsYW5uZXJJbmZvICpyb290LCBNaW5NYXhBZ2dQYXRoICpiZXN0X3BhdGgpCnsKCVJl c3VsdAkgICAqcGxhbjsKCUxpc3QJICAgKnRsaXN0OwoJTGlzdENlbGwgICAqbGM7CgoJLyog UHJlcGFyZSBhbiBJbml0UGxhbiBmb3IgZWFjaCBhZ2dyZWdhdGUncyBzdWJxdWVyeS4gKi8K CWZvcmVhY2gobGMsIGJlc3RfcGF0aC0+bW1hZ2dyZWdhdGVzKQoJewoJCU1pbk1heEFnZ0lu Zm8gKm1taW5mbyA9IChNaW5NYXhBZ2dJbmZvICopIGxmaXJzdChsYyk7CgkJUGxhbm5lcklu Zm8gKnN1YnJvb3QgPSBtbWluZm8tPnN1YnJvb3Q7CgkJUXVlcnkJICAgKnN1YnBhcnNlID0g c3Vicm9vdC0+cGFyc2U7CgkJUGxhbgkgICAqcGxhbjsKCgkJLyoKCQkgKiBHZW5lcmF0ZSB0 aGUgcGxhbiBmb3IgdGhlIHN1YnF1ZXJ5LiBXZSBhbHJlYWR5IGhhdmUgYSBQYXRoLCBidXQg d2UKCQkgKiBoYXZlIHRvIGNvbnZlcnQgaXQgdG8gYSBQbGFuIGFuZCBhdHRhY2ggYSBMSU1J VCBub2RlIGFib3ZlIGl0LgoJCSAqIFNpbmNlIHdlIGFyZSBlbnRlcmluZyBhIGRpZmZlcmVu dCBwbGFubmVyIGNvbnRleHQgKHN1YnJvb3QpLAoJCSAqIHJlY3Vyc2UgdG8gY3JlYXRlX3Bs YW4gbm90IGNyZWF0ZV9wbGFuX3JlY3Vyc2UuCgkJICovCgkJcGxhbiA9IGNyZWF0ZV9wbGFu KHN1YnJvb3QsIG1taW5mby0+cGF0aCk7CgoJCXBsYW4gPSAoUGxhbiAqKSBtYWtlX2xpbWl0 KHBsYW4sCgkJCQkJCQkJICAgc3VicGFyc2UtPmxpbWl0T2Zmc2V0LAoJCQkJCQkJCSAgIHN1 YnBhcnNlLT5saW1pdENvdW50LAoJCQkJCQkJCSAgIHN1YnBhcnNlLT5saW1pdE9wdGlvbiwK CQkJCQkJCQkgICAwLCBOVUxMLCBOVUxMLCBOVUxMKTsKCgkJLyogTXVzdCBhcHBseSBjb3Jy ZWN0IGNvc3Qvd2lkdGggZGF0YSB0byBMaW1pdCBub2RlICovCgkJcGxhbi0+ZGlzYWJsZWRf bm9kZXMgPSBtbWluZm8tPnBhdGgtPmRpc2FibGVkX25vZGVzOwoJCXBsYW4tPnN0YXJ0dXBf Y29zdCA9IG1taW5mby0+cGF0aC0+c3RhcnR1cF9jb3N0OwoJCXBsYW4tPnRvdGFsX2Nvc3Qg PSBtbWluZm8tPnBhdGhjb3N0OwoJCXBsYW4tPnBsYW5fcm93cyA9IDE7CgkJcGxhbi0+cGxh bl93aWR0aCA9IG1taW5mby0+cGF0aC0+cGF0aHRhcmdldC0+d2lkdGg7CgkJcGxhbi0+cGFy YWxsZWxfYXdhcmUgPSBmYWxzZTsKCQlwbGFuLT5wYXJhbGxlbF9zYWZlID0gbW1pbmZvLT5w YXRoLT5wYXJhbGxlbF9zYWZlOwoKCQkvKiBDb252ZXJ0IHRoZSBwbGFuIGludG8gYW4gSW5p dFBsYW4gaW4gdGhlIG91dGVyIHF1ZXJ5LiAqLwoJCVNTX21ha2VfaW5pdHBsYW5fZnJvbV9w bGFuKHJvb3QsIHN1YnJvb3QsIHBsYW4sIG1taW5mby0+cGFyYW0pOwoJfQoKCS8qIEdlbmVy YXRlIHRoZSBvdXRwdXQgcGxhbiAtLS0gYmFzaWNhbGx5IGp1c3QgYSBSZXN1bHQgKi8KCXRs aXN0ID0gYnVpbGRfcGF0aF90bGlzdChyb290LCAmYmVzdF9wYXRoLT5wYXRoKTsKCglwbGFu ID0gbWFrZV9vbmVfcm93X3Jlc3VsdCh0bGlzdCwgKE5vZGUgKikgYmVzdF9wYXRoLT5xdWFs cywKCQkJCQkJCSAgIGJlc3RfcGF0aC0+cGF0aC5wYXJlbnQpOwoJcGxhbi0+cmVzdWx0X3R5 cGUgPSBSRVNVTFRfVFlQRV9NSU5NQVg7CgoJY29weV9nZW5lcmljX3BhdGhfaW5mbygmcGxh bi0+cGxhbiwgKFBhdGggKikgYmVzdF9wYXRoKTsKCgkvKgoJICogRHVyaW5nIHNldHJlZnMu Yywgd2UnbGwgbmVlZCB0byByZXBsYWNlIHJlZmVyZW5jZXMgdG8gdGhlIEFnZyBub2RlcwoJ ICogd2l0aCBJbml0UGxhbiBvdXRwdXQgcGFyYW1zLiAgKFdlIGNhbid0IGp1c3QgZG8gdGhh dCBsb2NhbGx5IGluIHRoZQoJICogTWluTWF4QWdnIG5vZGUsIGJlY2F1c2UgcGF0aCBub2Rl cyBhYm92ZSBoZXJlIG1heSBoYXZlIEFnZyByZWZlcmVuY2VzCgkgKiBhcyB3ZWxsLikgIFNh dmUgdGhlIG1tYWdncmVnYXRlcyBsaXN0IHRvIHRlbGwgc2V0cmVmcy5jIHRvIGRvIHRoYXQu CgkgKi8KCUFzc2VydChyb290LT5taW5tYXhfYWdncyA9PSBOSUwpOwoJcm9vdC0+bWlubWF4 X2FnZ3MgPSBiZXN0X3BhdGgtPm1tYWdncmVnYXRlczsKCglyZXR1cm4gcGxhbjsKfQoKLyoK ICogY3JlYXRlX3dpbmRvd2FnZ19wbGFuCiAqCiAqCSAgQ3JlYXRlIGEgV2luZG93QWdnIHBs YW4gZm9yICdiZXN0X3BhdGgnIGFuZCAocmVjdXJzaXZlbHkpIHBsYW5zCiAqCSAgZm9yIGl0 cyBzdWJwYXRocy4KICovCnN0YXRpYyBXaW5kb3dBZ2cgKgpjcmVhdGVfd2luZG93YWdnX3Bs YW4oUGxhbm5lckluZm8gKnJvb3QsIFdpbmRvd0FnZ1BhdGggKmJlc3RfcGF0aCkKewoJV2lu ZG93QWdnICAqcGxhbjsKCVdpbmRvd0NsYXVzZSAqd2MgPSBiZXN0X3BhdGgtPndpbmNsYXVz ZTsKCWludAkJCW51bVBhcnQgPSBsaXN0X2xlbmd0aCh3Yy0+cGFydGl0aW9uQ2xhdXNlKTsK CWludAkJCW51bU9yZGVyID0gbGlzdF9sZW5ndGgod2MtPm9yZGVyQ2xhdXNlKTsKCVBsYW4J ICAgKnN1YnBsYW47CglMaXN0CSAgICp0bGlzdDsKCWludAkJCXBhcnROdW1Db2xzOwoJQXR0 ck51bWJlciAqcGFydENvbElkeDsKCU9pZAkJICAgKnBhcnRPcGVyYXRvcnM7CglPaWQJCSAg ICpwYXJ0Q29sbGF0aW9uczsKCWludAkJCW9yZE51bUNvbHM7CglBdHRyTnVtYmVyICpvcmRD b2xJZHg7CglPaWQJCSAgICpvcmRPcGVyYXRvcnM7CglPaWQJCSAgICpvcmRDb2xsYXRpb25z OwoJTGlzdENlbGwgICAqbGM7CgoJLyoKCSAqIENob2ljZSBvZiB0bGlzdCBoZXJlIGlzIG1v dGl2YXRlZCBieSB0aGUgZmFjdCB0aGF0IFdpbmRvd0FnZyB3aWxsIGJlCgkgKiBzdG9yaW5n IHRoZSBpbnB1dCByb3dzIG9mIHdpbmRvdyBmcmFtZXMgaW4gYSB0dXBsZXN0b3JlOyBpdCB0 aGVyZWZvcmUKCSAqIGJlaG9vdmVzIHVzIHRvIHJlcXVlc3QgYSBzbWFsbCB0bGlzdCB0byBh dm9pZCB3YXN0aW5nIHNwYWNlLiBXZSBkbyBvZgoJICogY291cnNlIG5lZWQgZ3JvdXBpbmcg Y29sdW1ucyB0byBiZSBhdmFpbGFibGUuCgkgKi8KCXN1YnBsYW4gPSBjcmVhdGVfcGxhbl9y ZWN1cnNlKHJvb3QsIGJlc3RfcGF0aC0+c3VicGF0aCwKCQkJCQkJCQkgIENQX0xBQkVMX1RM SVNUIHwgQ1BfU01BTExfVExJU1QpOwoKCXRsaXN0ID0gYnVpbGRfcGF0aF90bGlzdChyb290 LCAmYmVzdF9wYXRoLT5wYXRoKTsKCgkvKgoJICogQ29udmVydCBTb3J0R3JvdXBDbGF1c2Ug bGlzdHMgaW50byBhcnJheXMgb2YgYXR0ciBpbmRleGVzIGFuZCBlcXVhbGl0eQoJICogb3Bl cmF0b3JzLCBhcyB3YW50ZWQgYnkgZXhlY3V0b3IuCgkgKi8KCXBhcnRDb2xJZHggPSBwYWxs b2NfYXJyYXkoQXR0ck51bWJlciwgbnVtUGFydCk7CglwYXJ0T3BlcmF0b3JzID0gcGFsbG9j X2FycmF5KE9pZCwgbnVtUGFydCk7CglwYXJ0Q29sbGF0aW9ucyA9IHBhbGxvY19hcnJheShP aWQsIG51bVBhcnQpOwoKCXBhcnROdW1Db2xzID0gMDsKCWZvcmVhY2gobGMsIHdjLT5wYXJ0 aXRpb25DbGF1c2UpCgl7CgkJU29ydEdyb3VwQ2xhdXNlICpzZ2MgPSAoU29ydEdyb3VwQ2xh dXNlICopIGxmaXJzdChsYyk7CgkJVGFyZ2V0RW50cnkgKnRsZSA9IGdldF9zb3J0Z3JvdXBj bGF1c2VfdGxlKHNnYywgc3VicGxhbi0+dGFyZ2V0bGlzdCk7CgoJCUFzc2VydChPaWRJc1Zh bGlkKHNnYy0+ZXFvcCkpOwoJCXBhcnRDb2xJZHhbcGFydE51bUNvbHNdID0gdGxlLT5yZXNu bzsKCQlwYXJ0T3BlcmF0b3JzW3BhcnROdW1Db2xzXSA9IHNnYy0+ZXFvcDsKCQlwYXJ0Q29s bGF0aW9uc1twYXJ0TnVtQ29sc10gPSBleHByQ29sbGF0aW9uKChOb2RlICopIHRsZS0+ZXhw cik7CgkJcGFydE51bUNvbHMrKzsKCX0KCglvcmRDb2xJZHggPSBwYWxsb2NfYXJyYXkoQXR0 ck51bWJlciwgbnVtT3JkZXIpOwoJb3JkT3BlcmF0b3JzID0gcGFsbG9jX2FycmF5KE9pZCwg bnVtT3JkZXIpOwoJb3JkQ29sbGF0aW9ucyA9IHBhbGxvY19hcnJheShPaWQsIG51bU9yZGVy KTsKCglvcmROdW1Db2xzID0gMDsKCWZvcmVhY2gobGMsIHdjLT5vcmRlckNsYXVzZSkKCXsK CQlTb3J0R3JvdXBDbGF1c2UgKnNnYyA9IChTb3J0R3JvdXBDbGF1c2UgKikgbGZpcnN0KGxj KTsKCQlUYXJnZXRFbnRyeSAqdGxlID0gZ2V0X3NvcnRncm91cGNsYXVzZV90bGUoc2djLCBz dWJwbGFuLT50YXJnZXRsaXN0KTsKCgkJQXNzZXJ0KE9pZElzVmFsaWQoc2djLT5lcW9wKSk7 CgkJb3JkQ29sSWR4W29yZE51bUNvbHNdID0gdGxlLT5yZXNubzsKCQlvcmRPcGVyYXRvcnNb b3JkTnVtQ29sc10gPSBzZ2MtPmVxb3A7CgkJb3JkQ29sbGF0aW9uc1tvcmROdW1Db2xzXSA9 IGV4cHJDb2xsYXRpb24oKE5vZGUgKikgdGxlLT5leHByKTsKCQlvcmROdW1Db2xzKys7Cgl9 CgoJLyogQW5kIGZpbmFsbHkgd2UgY2FuIG1ha2UgdGhlIFdpbmRvd0FnZyBub2RlICovCglw bGFuID0gbWFrZV93aW5kb3dhZ2codGxpc3QsCgkJCQkJCSAgd2MsCgkJCQkJCSAgcGFydE51 bUNvbHMsCgkJCQkJCSAgcGFydENvbElkeCwKCQkJCQkJICBwYXJ0T3BlcmF0b3JzLAoJCQkJ CQkgIHBhcnRDb2xsYXRpb25zLAoJCQkJCQkgIG9yZE51bUNvbHMsCgkJCQkJCSAgb3JkQ29s SWR4LAoJCQkJCQkgIG9yZE9wZXJhdG9ycywKCQkJCQkJICBvcmRDb2xsYXRpb25zLAoJCQkJ CQkgIGJlc3RfcGF0aC0+cnVuQ29uZGl0aW9uLAoJCQkJCQkgIGJlc3RfcGF0aC0+cXVhbCwK CQkJCQkJICBiZXN0X3BhdGgtPnRvcHdpbmRvdywKCQkJCQkJICBzdWJwbGFuKTsKCgljb3B5 X2dlbmVyaWNfcGF0aF9pbmZvKCZwbGFuLT5wbGFuLCAoUGF0aCAqKSBiZXN0X3BhdGgpOwoK CXJldHVybiBwbGFuOwp9CgovKgogKiBjcmVhdGVfc2V0b3BfcGxhbgogKgogKgkgIENyZWF0 ZSBhIFNldE9wIHBsYW4gZm9yICdiZXN0X3BhdGgnIGFuZCAocmVjdXJzaXZlbHkpIHBsYW5z CiAqCSAgZm9yIGl0cyBzdWJwYXRocy4KICovCnN0YXRpYyBTZXRPcCAqCmNyZWF0ZV9zZXRv cF9wbGFuKFBsYW5uZXJJbmZvICpyb290LCBTZXRPcFBhdGggKmJlc3RfcGF0aCwgaW50IGZs YWdzKQp7CglTZXRPcAkgICAqcGxhbjsKCUxpc3QJICAgKnRsaXN0ID0gYnVpbGRfcGF0aF90 bGlzdChyb290LCAmYmVzdF9wYXRoLT5wYXRoKTsKCVBsYW4JICAgKmxlZnRwbGFuOwoJUGxh bgkgICAqcmlnaHRwbGFuOwoKCS8qCgkgKiBTZXRPcCBkb2Vzbid0IHByb2plY3QsIHNvIHRs aXN0IHJlcXVpcmVtZW50cyBwYXNzIHRocm91Z2g7IG1vcmVvdmVyIHdlCgkgKiBuZWVkIGdy b3VwaW5nIGNvbHVtbnMgdG8gYmUgbGFiZWxlZC4KCSAqLwoJbGVmdHBsYW4gPSBjcmVhdGVf cGxhbl9yZWN1cnNlKHJvb3QsIGJlc3RfcGF0aC0+bGVmdHBhdGgsCgkJCQkJCQkJICAgZmxh Z3MgfCBDUF9MQUJFTF9UTElTVCk7CglyaWdodHBsYW4gPSBjcmVhdGVfcGxhbl9yZWN1cnNl KHJvb3QsIGJlc3RfcGF0aC0+cmlnaHRwYXRoLAoJCQkJCQkJCQlmbGFncyB8IENQX0xBQkVM X1RMSVNUKTsKCglwbGFuID0gbWFrZV9zZXRvcChiZXN0X3BhdGgtPmNtZCwKCQkJCQkgIGJl c3RfcGF0aC0+c3RyYXRlZ3ksCgkJCQkJICB0bGlzdCwKCQkJCQkgIGxlZnRwbGFuLAoJCQkJ CSAgcmlnaHRwbGFuLAoJCQkJCSAgYmVzdF9wYXRoLT5ncm91cExpc3QsCgkJCQkJICBiZXN0 X3BhdGgtPm51bUdyb3Vwcyk7CgoJY29weV9nZW5lcmljX3BhdGhfaW5mbygmcGxhbi0+cGxh biwgKFBhdGggKikgYmVzdF9wYXRoKTsKCglyZXR1cm4gcGxhbjsKfQoKLyoKICogY3JlYXRl X3JlY3Vyc2l2ZXVuaW9uX3BsYW4KICoKICoJICBDcmVhdGUgYSBSZWN1cnNpdmVVbmlvbiBw bGFuIGZvciAnYmVzdF9wYXRoJyBhbmQgKHJlY3Vyc2l2ZWx5KSBwbGFucwogKgkgIGZvciBp dHMgc3VicGF0aHMuCiAqLwpzdGF0aWMgUmVjdXJzaXZlVW5pb24gKgpjcmVhdGVfcmVjdXJz aXZldW5pb25fcGxhbihQbGFubmVySW5mbyAqcm9vdCwgUmVjdXJzaXZlVW5pb25QYXRoICpi ZXN0X3BhdGgpCnsKCVJlY3Vyc2l2ZVVuaW9uICpwbGFuOwoJUGxhbgkgICAqbGVmdHBsYW47 CglQbGFuCSAgICpyaWdodHBsYW47CglMaXN0CSAgICp0bGlzdDsKCgkvKiBOZWVkIGJvdGgg Y2hpbGRyZW4gdG8gcHJvZHVjZSBzYW1lIHRsaXN0LCBzbyBmb3JjZSBpdCAqLwoJbGVmdHBs YW4gPSBjcmVhdGVfcGxhbl9yZWN1cnNlKHJvb3QsIGJlc3RfcGF0aC0+bGVmdHBhdGgsIENQ X0VYQUNUX1RMSVNUKTsKCXJpZ2h0cGxhbiA9IGNyZWF0ZV9wbGFuX3JlY3Vyc2Uocm9vdCwg YmVzdF9wYXRoLT5yaWdodHBhdGgsIENQX0VYQUNUX1RMSVNUKTsKCgl0bGlzdCA9IGJ1aWxk X3BhdGhfdGxpc3Qocm9vdCwgJmJlc3RfcGF0aC0+cGF0aCk7CgoJcGxhbiA9IG1ha2VfcmVj dXJzaXZlX3VuaW9uKHRsaXN0LAoJCQkJCQkJCWxlZnRwbGFuLAoJCQkJCQkJCXJpZ2h0cGxh biwKCQkJCQkJCQliZXN0X3BhdGgtPnd0UGFyYW0sCgkJCQkJCQkJYmVzdF9wYXRoLT5kaXN0 aW5jdExpc3QsCgkJCQkJCQkJYmVzdF9wYXRoLT5udW1Hcm91cHMpOwoKCWNvcHlfZ2VuZXJp Y19wYXRoX2luZm8oJnBsYW4tPnBsYW4sIChQYXRoICopIGJlc3RfcGF0aCk7CgoJcmV0dXJu IHBsYW47Cn0KCi8qCiAqIGNyZWF0ZV9sb2Nrcm93c19wbGFuCiAqCiAqCSAgQ3JlYXRlIGEg TG9ja1Jvd3MgcGxhbiBmb3IgJ2Jlc3RfcGF0aCcgYW5kIChyZWN1cnNpdmVseSkgcGxhbnMK ICoJICBmb3IgaXRzIHN1YnBhdGhzLgogKi8Kc3RhdGljIExvY2tSb3dzICoKY3JlYXRlX2xv Y2tyb3dzX3BsYW4oUGxhbm5lckluZm8gKnJvb3QsIExvY2tSb3dzUGF0aCAqYmVzdF9wYXRo LAoJCQkJCSBpbnQgZmxhZ3MpCnsKCUxvY2tSb3dzICAgKnBsYW47CglQbGFuCSAgICpzdWJw bGFuOwoKCS8qIExvY2tSb3dzIGRvZXNuJ3QgcHJvamVjdCwgc28gdGxpc3QgcmVxdWlyZW1l bnRzIHBhc3MgdGhyb3VnaCAqLwoJc3VicGxhbiA9IGNyZWF0ZV9wbGFuX3JlY3Vyc2Uocm9v dCwgYmVzdF9wYXRoLT5zdWJwYXRoLCBmbGFncyk7CgoJcGxhbiA9IG1ha2VfbG9ja3Jvd3Mo c3VicGxhbiwgYmVzdF9wYXRoLT5yb3dNYXJrcywgYmVzdF9wYXRoLT5lcHFQYXJhbSk7CgoJ Y29weV9nZW5lcmljX3BhdGhfaW5mbygmcGxhbi0+cGxhbiwgKFBhdGggKikgYmVzdF9wYXRo KTsKCglyZXR1cm4gcGxhbjsKfQoKLyoKICogY3JlYXRlX21vZGlmeXRhYmxlX3BsYW4KICoJ ICBDcmVhdGUgYSBNb2RpZnlUYWJsZSBwbGFuIGZvciAnYmVzdF9wYXRoJy4KICoKICoJICBS ZXR1cm5zIGEgUGxhbiBub2RlLgogKi8Kc3RhdGljIE1vZGlmeVRhYmxlICoKY3JlYXRlX21v ZGlmeXRhYmxlX3BsYW4oUGxhbm5lckluZm8gKnJvb3QsIE1vZGlmeVRhYmxlUGF0aCAqYmVz dF9wYXRoKQp7CglNb2RpZnlUYWJsZSAqcGxhbjsKCVBhdGgJICAgKnN1YnBhdGggPSBiZXN0 X3BhdGgtPnN1YnBhdGg7CglQbGFuCSAgICpzdWJwbGFuOwoKCS8qIFN1YnBsYW4gbXVzdCBw cm9kdWNlIGV4YWN0bHkgdGhlIHNwZWNpZmllZCB0bGlzdCAqLwoJc3VicGxhbiA9IGNyZWF0 ZV9wbGFuX3JlY3Vyc2Uocm9vdCwgc3VicGF0aCwgQ1BfRVhBQ1RfVExJU1QpOwoKCS8qIFRy YW5zZmVyIHJlc25hbWUvcmVzanVuayBsYWJlbGluZywgdG9vLCB0byBrZWVwIGV4ZWN1dG9y IGhhcHB5ICovCglhcHBseV90bGlzdF9sYWJlbGluZyhzdWJwbGFuLT50YXJnZXRsaXN0LCBy b290LT5wcm9jZXNzZWRfdGxpc3QpOwoKCXBsYW4gPSBtYWtlX21vZGlmeXRhYmxlKHJvb3Qs CgkJCQkJCQlzdWJwbGFuLAoJCQkJCQkJYmVzdF9wYXRoLT5vcGVyYXRpb24sCgkJCQkJCQli ZXN0X3BhdGgtPmNhblNldFRhZywKCQkJCQkJCWJlc3RfcGF0aC0+bm9taW5hbFJlbGF0aW9u LAoJCQkJCQkJYmVzdF9wYXRoLT5yb290UmVsYXRpb24sCgkJCQkJCQliZXN0X3BhdGgtPnJl c3VsdFJlbGF0aW9ucywKCQkJCQkJCWJlc3RfcGF0aC0+dXBkYXRlQ29sbm9zTGlzdHMsCgkJ CQkJCQliZXN0X3BhdGgtPndpdGhDaGVja09wdGlvbkxpc3RzLAoJCQkJCQkJYmVzdF9wYXRo LT5yZXR1cm5pbmdMaXN0cywKCQkJCQkJCWJlc3RfcGF0aC0+cm93TWFya3MsCgkJCQkJCQli ZXN0X3BhdGgtPm9uY29uZmxpY3QsCgkJCQkJCQliZXN0X3BhdGgtPm1lcmdlQWN0aW9uTGlz dHMsCgkJCQkJCQliZXN0X3BhdGgtPm1lcmdlSm9pbkNvbmRpdGlvbnMsCgkJCQkJCQliZXN0 X3BhdGgtPmZvclBvcnRpb25PZiwKCQkJCQkJCWJlc3RfcGF0aC0+ZXBxUGFyYW0pOwoKCWNv cHlfZ2VuZXJpY19wYXRoX2luZm8oJnBsYW4tPnBsYW4sICZiZXN0X3BhdGgtPnBhdGgpOwoK CXJldHVybiBwbGFuOwp9CgovKgogKiBjcmVhdGVfbGltaXRfcGxhbgogKgogKgkgIENyZWF0 ZSBhIExpbWl0IHBsYW4gZm9yICdiZXN0X3BhdGgnIGFuZCAocmVjdXJzaXZlbHkpIHBsYW5z CiAqCSAgZm9yIGl0cyBzdWJwYXRocy4KICovCnN0YXRpYyBMaW1pdCAqCmNyZWF0ZV9saW1p dF9wbGFuKFBsYW5uZXJJbmZvICpyb290LCBMaW1pdFBhdGggKmJlc3RfcGF0aCwgaW50IGZs YWdzKQp7CglMaW1pdAkgICAqcGxhbjsKCVBsYW4JICAgKnN1YnBsYW47CglpbnQJCQludW1V bmlxa2V5cyA9IDA7CglBdHRyTnVtYmVyICp1bmlxQ29sSWR4ID0gTlVMTDsKCU9pZAkJICAg KnVuaXFPcGVyYXRvcnMgPSBOVUxMOwoJT2lkCQkgICAqdW5pcUNvbGxhdGlvbnMgPSBOVUxM OwoKCS8qIExpbWl0IGRvZXNuJ3QgcHJvamVjdCwgc28gdGxpc3QgcmVxdWlyZW1lbnRzIHBh c3MgdGhyb3VnaCAqLwoJc3VicGxhbiA9IGNyZWF0ZV9wbGFuX3JlY3Vyc2Uocm9vdCwgYmVz dF9wYXRoLT5zdWJwYXRoLCBmbGFncyk7CgoJLyogRXh0cmFjdCBpbmZvcm1hdGlvbiBuZWNl c3NhcnkgZm9yIGNvbXBhcmluZyByb3dzIGZvciBXSVRIIFRJRVMuICovCglpZiAoYmVzdF9w YXRoLT5saW1pdE9wdGlvbiA9PSBMSU1JVF9PUFRJT05fV0lUSF9USUVTKQoJewoJCVF1ZXJ5 CSAgICpwYXJzZSA9IHJvb3QtPnBhcnNlOwoJCUxpc3RDZWxsICAgKmw7CgoJCW51bVVuaXFr ZXlzID0gbGlzdF9sZW5ndGgocGFyc2UtPnNvcnRDbGF1c2UpOwoJCXVuaXFDb2xJZHggPSAo QXR0ck51bWJlciAqKSBwYWxsb2MobnVtVW5pcWtleXMgKiBzaXplb2YoQXR0ck51bWJlcikp OwoJCXVuaXFPcGVyYXRvcnMgPSAoT2lkICopIHBhbGxvYyhudW1Vbmlxa2V5cyAqIHNpemVv ZihPaWQpKTsKCQl1bmlxQ29sbGF0aW9ucyA9IChPaWQgKikgcGFsbG9jKG51bVVuaXFrZXlz ICogc2l6ZW9mKE9pZCkpOwoKCQludW1Vbmlxa2V5cyA9IDA7CgkJZm9yZWFjaChsLCBwYXJz ZS0+c29ydENsYXVzZSkKCQl7CgkJCVNvcnRHcm91cENsYXVzZSAqc29ydGNsID0gKFNvcnRH cm91cENsYXVzZSAqKSBsZmlyc3QobCk7CgkJCVRhcmdldEVudHJ5ICp0bGUgPSBnZXRfc29y dGdyb3VwY2xhdXNlX3RsZShzb3J0Y2wsIHBhcnNlLT50YXJnZXRMaXN0KTsKCgkJCXVuaXFD b2xJZHhbbnVtVW5pcWtleXNdID0gdGxlLT5yZXNubzsKCQkJdW5pcU9wZXJhdG9yc1tudW1V bmlxa2V5c10gPSBzb3J0Y2wtPmVxb3A7CgkJCXVuaXFDb2xsYXRpb25zW251bVVuaXFrZXlz XSA9IGV4cHJDb2xsYXRpb24oKE5vZGUgKikgdGxlLT5leHByKTsKCQkJbnVtVW5pcWtleXMr KzsKCQl9Cgl9CgoJcGxhbiA9IG1ha2VfbGltaXQoc3VicGxhbiwKCQkJCQkgIGJlc3RfcGF0 aC0+bGltaXRPZmZzZXQsCgkJCQkJICBiZXN0X3BhdGgtPmxpbWl0Q291bnQsCgkJCQkJICBi ZXN0X3BhdGgtPmxpbWl0T3B0aW9uLAoJCQkJCSAgbnVtVW5pcWtleXMsIHVuaXFDb2xJZHgs IHVuaXFPcGVyYXRvcnMsIHVuaXFDb2xsYXRpb25zKTsKCgljb3B5X2dlbmVyaWNfcGF0aF9p bmZvKCZwbGFuLT5wbGFuLCAoUGF0aCAqKSBiZXN0X3BhdGgpOwoKCXJldHVybiBwbGFuOwp9 CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCiAqCUJBU0UtUkVMQVRJT04gU0NBTiBN RVRIT0RTCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCgovKgogKiBjcmVhdGVfc2Vx c2Nhbl9wbGFuCiAqCSBSZXR1cm5zIGEgc2Vxc2NhbiBwbGFuIGZvciB0aGUgYmFzZSByZWxh dGlvbiBzY2FubmVkIGJ5ICdiZXN0X3BhdGgnCiAqCSB3aXRoIHJlc3RyaWN0aW9uIGNsYXVz ZXMgJ3NjYW5fY2xhdXNlcycgYW5kIHRhcmdldGxpc3QgJ3RsaXN0Jy4KICovCnN0YXRpYyBT ZXFTY2FuICoKY3JlYXRlX3NlcXNjYW5fcGxhbihQbGFubmVySW5mbyAqcm9vdCwgUGF0aCAq YmVzdF9wYXRoLAoJCQkJCUxpc3QgKnRsaXN0LCBMaXN0ICpzY2FuX2NsYXVzZXMpCnsKCVNl cVNjYW4gICAgKnNjYW5fcGxhbjsKCUluZGV4CQlzY2FuX3JlbGlkID0gYmVzdF9wYXRoLT5w YXJlbnQtPnJlbGlkOwoKCS8qIGl0IHNob3VsZCBiZSBhIGJhc2UgcmVsLi4uICovCglBc3Nl cnQoc2Nhbl9yZWxpZCA+IDApOwoJQXNzZXJ0KGJlc3RfcGF0aC0+cGFyZW50LT5ydGVraW5k ID09IFJURV9SRUxBVElPTik7CgoJLyogU29ydCBjbGF1c2VzIGludG8gYmVzdCBleGVjdXRp b24gb3JkZXIgKi8KCXNjYW5fY2xhdXNlcyA9IG9yZGVyX3F1YWxfY2xhdXNlcyhyb290LCBz Y2FuX2NsYXVzZXMpOwoKCS8qIFJlZHVjZSBSZXN0cmljdEluZm8gbGlzdCB0byBiYXJlIGV4 cHJlc3Npb25zOyBpZ25vcmUgcHNldWRvY29uc3RhbnRzICovCglzY2FuX2NsYXVzZXMgPSBl eHRyYWN0X2FjdHVhbF9jbGF1c2VzKHNjYW5fY2xhdXNlcywgZmFsc2UpOwoKCS8qIFJlcGxh Y2UgYW55IG91dGVyLXJlbGF0aW9uIHZhcmlhYmxlcyB3aXRoIG5lc3Rsb29wIHBhcmFtcyAq LwoJaWYgKGJlc3RfcGF0aC0+cGFyYW1faW5mbykKCXsKCQlzY2FuX2NsYXVzZXMgPSAoTGlz dCAqKQoJCQlyZXBsYWNlX25lc3Rsb29wX3BhcmFtcyhyb290LCAoTm9kZSAqKSBzY2FuX2Ns YXVzZXMpOwoJfQoKCXNjYW5fcGxhbiA9IG1ha2Vfc2Vxc2Nhbih0bGlzdCwKCQkJCQkJCSBz Y2FuX2NsYXVzZXMsCgkJCQkJCQkgc2Nhbl9yZWxpZCk7CgoJY29weV9nZW5lcmljX3BhdGhf aW5mbygmc2Nhbl9wbGFuLT5zY2FuLnBsYW4sIGJlc3RfcGF0aCk7CgoJcmV0dXJuIHNjYW5f cGxhbjsKfQoKLyoKICogY3JlYXRlX3NhbXBsZXNjYW5fcGxhbgogKgkgUmV0dXJucyBhIHNh bXBsZXNjYW4gcGxhbiBmb3IgdGhlIGJhc2UgcmVsYXRpb24gc2Nhbm5lZCBieSAnYmVzdF9w YXRoJwogKgkgd2l0aCByZXN0cmljdGlvbiBjbGF1c2VzICdzY2FuX2NsYXVzZXMnIGFuZCB0 YXJnZXRsaXN0ICd0bGlzdCcuCiAqLwpzdGF0aWMgU2FtcGxlU2NhbiAqCmNyZWF0ZV9zYW1w bGVzY2FuX3BsYW4oUGxhbm5lckluZm8gKnJvb3QsIFBhdGggKmJlc3RfcGF0aCwKCQkJCQkg ICBMaXN0ICp0bGlzdCwgTGlzdCAqc2Nhbl9jbGF1c2VzKQp7CglTYW1wbGVTY2FuICpzY2Fu X3BsYW47CglJbmRleAkJc2Nhbl9yZWxpZCA9IGJlc3RfcGF0aC0+cGFyZW50LT5yZWxpZDsK CVJhbmdlVGJsRW50cnkgKnJ0ZTsKCVRhYmxlU2FtcGxlQ2xhdXNlICp0c2M7CgoJLyogaXQg c2hvdWxkIGJlIGEgYmFzZSByZWwgd2l0aCBhIHRhYmxlc2FtcGxlIGNsYXVzZS4uLiAqLwoJ QXNzZXJ0KHNjYW5fcmVsaWQgPiAwKTsKCXJ0ZSA9IHBsYW5uZXJfcnRfZmV0Y2goc2Nhbl9y ZWxpZCwgcm9vdCk7CglBc3NlcnQocnRlLT5ydGVraW5kID09IFJURV9SRUxBVElPTik7Cgl0 c2MgPSBydGUtPnRhYmxlc2FtcGxlOwoJQXNzZXJ0KHRzYyAhPSBOVUxMKTsKCgkvKiBTb3J0 IGNsYXVzZXMgaW50byBiZXN0IGV4ZWN1dGlvbiBvcmRlciAqLwoJc2Nhbl9jbGF1c2VzID0g b3JkZXJfcXVhbF9jbGF1c2VzKHJvb3QsIHNjYW5fY2xhdXNlcyk7CgoJLyogUmVkdWNlIFJl c3RyaWN0SW5mbyBsaXN0IHRvIGJhcmUgZXhwcmVzc2lvbnM7IGlnbm9yZSBwc2V1ZG9jb25z dGFudHMgKi8KCXNjYW5fY2xhdXNlcyA9IGV4dHJhY3RfYWN0dWFsX2NsYXVzZXMoc2Nhbl9j bGF1c2VzLCBmYWxzZSk7CgoJLyogUmVwbGFjZSBhbnkgb3V0ZXItcmVsYXRpb24gdmFyaWFi bGVzIHdpdGggbmVzdGxvb3AgcGFyYW1zICovCglpZiAoYmVzdF9wYXRoLT5wYXJhbV9pbmZv KQoJewoJCXNjYW5fY2xhdXNlcyA9IChMaXN0ICopCgkJCXJlcGxhY2VfbmVzdGxvb3BfcGFy YW1zKHJvb3QsIChOb2RlICopIHNjYW5fY2xhdXNlcyk7CgkJdHNjID0gKFRhYmxlU2FtcGxl Q2xhdXNlICopCgkJCXJlcGxhY2VfbmVzdGxvb3BfcGFyYW1zKHJvb3QsIChOb2RlICopIHRz Yyk7Cgl9CgoJc2Nhbl9wbGFuID0gbWFrZV9zYW1wbGVzY2FuKHRsaXN0LAoJCQkJCQkJCXNj YW5fY2xhdXNlcywKCQkJCQkJCQlzY2FuX3JlbGlkLAoJCQkJCQkJCXRzYyk7CgoJY29weV9n ZW5lcmljX3BhdGhfaW5mbygmc2Nhbl9wbGFuLT5zY2FuLnBsYW4sIGJlc3RfcGF0aCk7CgoJ cmV0dXJuIHNjYW5fcGxhbjsKfQoKLyoKICogY3JlYXRlX2luZGV4c2Nhbl9wbGFuCiAqCSAg UmV0dXJucyBhbiBpbmRleHNjYW4gcGxhbiBmb3IgdGhlIGJhc2UgcmVsYXRpb24gc2Nhbm5l ZCBieSAnYmVzdF9wYXRoJwogKgkgIHdpdGggcmVzdHJpY3Rpb24gY2xhdXNlcyAnc2Nhbl9j bGF1c2VzJyBhbmQgdGFyZ2V0bGlzdCAndGxpc3QnLgogKgogKiBXZSB1c2UgdGhpcyBmb3Ig Ym90aCBwbGFpbiBJbmRleFNjYW5zIGFuZCBJbmRleE9ubHlTY2FucywgYmVjYXVzZSB0aGUK ICogcXVhbCBwcmVwcm9jZXNzaW5nIHdvcmsgaXMgdGhlIHNhbWUgZm9yIGJvdGguICBOb3Rl IHRoYXQgdGhlIGNhbGxlciB0ZWxscwogKiB1cyB3aGljaCB0byBidWlsZCAtLS0gd2UgZG9u J3QgbG9vayBhdCBiZXN0X3BhdGgtPnBhdGgucGF0aHR5cGUsIGJlY2F1c2UKICogY3JlYXRl X2JpdG1hcF9zdWJwbGFuIG5lZWRzIHRvIGJlIGFibGUgdG8gb3ZlcnJpZGUgdGhlIHByaW9y IGRlY2lzaW9uLgogKi8Kc3RhdGljIFNjYW4gKgpjcmVhdGVfaW5kZXhzY2FuX3BsYW4oUGxh bm5lckluZm8gKnJvb3QsCgkJCQkJICBJbmRleFBhdGggKmJlc3RfcGF0aCwKCQkJCQkgIExp c3QgKnRsaXN0LAoJCQkJCSAgTGlzdCAqc2Nhbl9jbGF1c2VzLAoJCQkJCSAgYm9vbCBpbmRl eG9ubHkpCnsKCVNjYW4JICAgKnNjYW5fcGxhbjsKCUxpc3QJICAgKmluZGV4Y2xhdXNlcyA9 IGJlc3RfcGF0aC0+aW5kZXhjbGF1c2VzOwoJTGlzdAkgICAqaW5kZXhvcmRlcmJ5cyA9IGJl c3RfcGF0aC0+aW5kZXhvcmRlcmJ5czsKCUluZGV4CQliYXNlcmVsaWQgPSBiZXN0X3BhdGgt PnBhdGgucGFyZW50LT5yZWxpZDsKCUluZGV4T3B0SW5mbyAqaW5kZXhpbmZvID0gYmVzdF9w YXRoLT5pbmRleGluZm87CglPaWQJCQlpbmRleG9pZCA9IGluZGV4aW5mby0+aW5kZXhvaWQ7 CglMaXN0CSAgICpxcHF1YWw7CglMaXN0CSAgICpzdHJpcHBlZF9pbmRleHF1YWxzOwoJTGlz dAkgICAqZml4ZWRfaW5kZXhxdWFsczsKCUxpc3QJICAgKmZpeGVkX2luZGV4b3JkZXJieXM7 CglMaXN0CSAgICppbmRleG9yZGVyYnlvcHMgPSBOSUw7CglMaXN0Q2VsbCAgICpsOwoKCS8q IGl0IHNob3VsZCBiZSBhIGJhc2UgcmVsLi4uICovCglBc3NlcnQoYmFzZXJlbGlkID4gMCk7 CglBc3NlcnQoYmVzdF9wYXRoLT5wYXRoLnBhcmVudC0+cnRla2luZCA9PSBSVEVfUkVMQVRJ T04pOwoJLyogY2hlY2sgdGhlIHNjYW4gZGlyZWN0aW9uIGlzIHZhbGlkICovCglBc3NlcnQo YmVzdF9wYXRoLT5pbmRleHNjYW5kaXIgPT0gRm9yd2FyZFNjYW5EaXJlY3Rpb24gfHwKCQkg ICBiZXN0X3BhdGgtPmluZGV4c2NhbmRpciA9PSBCYWNrd2FyZFNjYW5EaXJlY3Rpb24pOwoK CS8qCgkgKiBFeHRyYWN0IHRoZSBpbmRleCBxdWFsIGV4cHJlc3Npb25zIChzdHJpcHBlZCBv ZiBSZXN0cmljdEluZm9zKSBmcm9tIHRoZQoJICogSW5kZXhDbGF1c2VzIGxpc3QsIGFuZCBw cmVwYXJlIGEgY29weSB3aXRoIGluZGV4IFZhcnMgc3Vic3RpdHV0ZWQgZm9yCgkgKiB0YWJs ZSBWYXJzLiAgKFRoaXMgc3RlcCBhbHNvIGRvZXMgcmVwbGFjZV9uZXN0bG9vcF9wYXJhbXMg b24gdGhlCgkgKiBmaXhlZF9pbmRleHF1YWxzLikKCSAqLwoJZml4X2luZGV4cXVhbF9yZWZl cmVuY2VzKHJvb3QsIGJlc3RfcGF0aCwKCQkJCQkJCSAmc3RyaXBwZWRfaW5kZXhxdWFscywK CQkJCQkJCSAmZml4ZWRfaW5kZXhxdWFscyk7CgoJLyoKCSAqIExpa2V3aXNlIGZpeCB1cCBp bmRleCBhdHRyIHJlZmVyZW5jZXMgaW4gdGhlIE9SREVSIEJZIGV4cHJlc3Npb25zLgoJICov CglmaXhlZF9pbmRleG9yZGVyYnlzID0gZml4X2luZGV4b3JkZXJieV9yZWZlcmVuY2VzKHJv b3QsIGJlc3RfcGF0aCk7CgoJLyoKCSAqIFRoZSBxcHF1YWwgbGlzdCBtdXN0IGNvbnRhaW4g YWxsIHJlc3RyaWN0aW9ucyBub3QgYXV0b21hdGljYWxseSBoYW5kbGVkCgkgKiBieSB0aGUg aW5kZXgsIG90aGVyIHRoYW4gcHNldWRvY29uc3RhbnQgY2xhdXNlcyB3aGljaCB3aWxsIGJl IGhhbmRsZWQKCSAqIGJ5IGEgc2VwYXJhdGUgZ2F0aW5nIHBsYW4gbm9kZS4gIEFsbCB0aGUg cHJlZGljYXRlcyBpbiB0aGUgaW5kZXhxdWFscwoJICogd2lsbCBiZSBjaGVja2VkIChlaXRo ZXIgYnkgdGhlIGluZGV4IGl0c2VsZiwgb3IgYnkgbm9kZUluZGV4c2Nhbi5jKSwKCSAqIGJ1 dCBpZiB0aGVyZSBhcmUgYW55ICJzcGVjaWFsIiBvcGVyYXRvcnMgaW52b2x2ZWQgdGhlbiB0 aGV5IG11c3QgYmUKCSAqIGluY2x1ZGVkIGluIHFwcXVhbC4gIFRoZSB1cHNob3QgaXMgdGhh dCBxcHF1YWwgbXVzdCBjb250YWluCgkgKiBzY2FuX2NsYXVzZXMgbWludXMgd2hhdGV2ZXIg YXBwZWFycyBpbiBpbmRleHF1YWxzLgoJICoKCSAqIGlzX3JlZHVuZGFudF93aXRoX2luZGV4 Y2xhdXNlcygpIGRldGVjdHMgY2FzZXMgd2hlcmUgYSBzY2FuIGNsYXVzZSBpcwoJICogcHJl c2VudCBpbiB0aGUgaW5kZXhjbGF1c2VzIGxpc3Qgb3IgaXMgZ2VuZXJhdGVkIGZyb20gdGhl IHNhbWUKCSAqIEVxdWl2YWxlbmNlQ2xhc3MgYXMgc29tZSBpbmRleGNsYXVzZSwgYW5kIGlz IHRoZXJlZm9yZSByZWR1bmRhbnQgd2l0aAoJICogaXQsIHRob3VnaCBub3QgZXF1YWwuICAo VGhlIGxhdHRlciBoYXBwZW5zIHdoZW4gaW5keHBhdGguYyBwcmVmZXJzIGEKCSAqIGRpZmZl cmVudCBkZXJpdmVkIGVxdWFsaXR5IHRoYW4gd2hhdCBnZW5lcmF0ZV9qb2luX2ltcGxpZWRf ZXF1YWxpdGllcwoJICogcGlja2VkIGZvciBhIHBhcmFtZXRlcml6ZWQgc2NhbidzIHBwaV9j bGF1c2VzLikgIE5vdGUgdGhhdCBpdCB3aWxsIG5vdAoJICogbWF0Y2ggdG8gbG9zc3kgaW5k ZXggY2xhdXNlcywgd2hpY2ggaXMgY3JpdGljYWwgYmVjYXVzZSB3ZSBoYXZlIHRvCgkgKiBp bmNsdWRlIHRoZSBvcmlnaW5hbCBjbGF1c2UgaW4gcXBxdWFsIGluIHRoYXQgY2FzZS4KCSAq CgkgKiBJbiBzb21lIHNpdHVhdGlvbnMgKHBhcnRpY3VsYXJseSB3aXRoIE9SJ2QgaW5kZXgg Y29uZGl0aW9ucykgd2UgbWF5CgkgKiBoYXZlIHNjYW5fY2xhdXNlcyB0aGF0IGFyZSBub3Qg ZXF1YWwgdG8sIGJ1dCBhcmUgbG9naWNhbGx5IGltcGxpZWQgYnksCgkgKiB0aGUgaW5kZXgg cXVhbHM7IHNvIHdlIGFsc28gdHJ5IGEgcHJlZGljYXRlX2ltcGxpZWRfYnkoKSBjaGVjayB0 byBzZWUKCSAqIGlmIHdlIGNhbiBkaXNjYXJkIHF1YWxzIHRoYXQgd2F5LiAgKHByZWRpY2F0 ZV9pbXBsaWVkX2J5IGFzc3VtZXMgaXRzCgkgKiBmaXJzdCBpbnB1dCBjb250YWlucyBvbmx5 IGltbXV0YWJsZSBmdW5jdGlvbnMsIHNvIHdlIGhhdmUgdG8gY2hlY2sKCSAqIHRoYXQuKQoJ ICoKCSAqIE5vdGU6IGlmIHlvdSBjaGFuZ2UgdGhpcyBiaXQgb2YgY29kZSB5b3Ugc2hvdWxk IGFsc28gbG9vayBhdAoJICogZXh0cmFjdF9ub25pbmRleF9jb25kaXRpb25zKCkgaW4gY29z dHNpemUuYy4KCSAqLwoJcXBxdWFsID0gTklMOwoJZm9yZWFjaChsLCBzY2FuX2NsYXVzZXMp Cgl7CgkJUmVzdHJpY3RJbmZvICpyaW5mbyA9IGxmaXJzdF9ub2RlKFJlc3RyaWN0SW5mbywg bCk7CgoJCWlmIChyaW5mby0+cHNldWRvY29uc3RhbnQpCgkJCWNvbnRpbnVlOwkJCS8qIHdl IG1heSBkcm9wIHBzZXVkb2NvbnN0YW50cyBoZXJlICovCgkJaWYgKGlzX3JlZHVuZGFudF93 aXRoX2luZGV4Y2xhdXNlcyhyaW5mbywgaW5kZXhjbGF1c2VzKSkKCQkJY29udGludWU7CQkJ LyogZHVwIG9yIGRlcml2ZWQgZnJvbSBzYW1lIEVxdWl2YWxlbmNlQ2xhc3MgKi8KCQlpZiAo IWNvbnRhaW5fbXV0YWJsZV9mdW5jdGlvbnMoKE5vZGUgKikgcmluZm8tPmNsYXVzZSkgJiYK CQkJcHJlZGljYXRlX2ltcGxpZWRfYnkobGlzdF9tYWtlMShyaW5mby0+Y2xhdXNlKSwgc3Ry aXBwZWRfaW5kZXhxdWFscywKCQkJCQkJCQkgZmFsc2UpKQoJCQljb250aW51ZTsJCQkvKiBw cm92YWJseSBpbXBsaWVkIGJ5IGluZGV4cXVhbHMgKi8KCQlxcHF1YWwgPSBsYXBwZW5kKHFw cXVhbCwgcmluZm8pOwoJfQoKCS8qIFNvcnQgY2xhdXNlcyBpbnRvIGJlc3QgZXhlY3V0aW9u IG9yZGVyICovCglxcHF1YWwgPSBvcmRlcl9xdWFsX2NsYXVzZXMocm9vdCwgcXBxdWFsKTsK CgkvKiBSZWR1Y2UgUmVzdHJpY3RJbmZvIGxpc3QgdG8gYmFyZSBleHByZXNzaW9uczsgaWdu b3JlIHBzZXVkb2NvbnN0YW50cyAqLwoJcXBxdWFsID0gZXh0cmFjdF9hY3R1YWxfY2xhdXNl cyhxcHF1YWwsIGZhbHNlKTsKCgkvKgoJICogV2UgaGF2ZSB0byByZXBsYWNlIGFueSBvdXRl ci1yZWxhdGlvbiB2YXJpYWJsZXMgd2l0aCBuZXN0bG9vcCBwYXJhbXMgaW4KCSAqIHRoZSBp bmRleHF1YWxvcmlnLCBxcHF1YWwsIGFuZCBpbmRleG9yZGVyYnlvcmlnIGV4cHJlc3Npb25z LiAgQSBiaXQKCSAqIGFubm95aW5nIHRvIGhhdmUgdG8gZG8gdGhpcyBzZXBhcmF0ZWx5IGZy b20gdGhlIHByb2Nlc3NpbmcgaW4KCSAqIGZpeF9pbmRleHF1YWxfcmVmZXJlbmNlcyAtLS0g cmV0aGluayB0aGlzIHdoZW4gZ2VuZXJhbGl6aW5nIHRoZSBpbm5lcgoJICogaW5kZXhzY2Fu IHN1cHBvcnQuICBCdXQgbm90ZSB3ZSBjYW4ndCByZWFsbHkgZG8gdGhpcyBlYXJsaWVyIGJl Y2F1c2UKCSAqIGl0J2QgYnJlYWsgdGhlIGNvbXBhcmlzb25zIHRvIHByZWRpY2F0ZXMgYWJv dmUgLi4uIChvciB3b3VsZCBpdD8gIFRob3NlCgkgKiB3b3VsZG4ndCBoYXZlIG91dGVyIHJl ZnMpCgkgKi8KCWlmIChiZXN0X3BhdGgtPnBhdGgucGFyYW1faW5mbykKCXsKCQlzdHJpcHBl ZF9pbmRleHF1YWxzID0gKExpc3QgKikKCQkJcmVwbGFjZV9uZXN0bG9vcF9wYXJhbXMocm9v dCwgKE5vZGUgKikgc3RyaXBwZWRfaW5kZXhxdWFscyk7CgkJcXBxdWFsID0gKExpc3QgKikK CQkJcmVwbGFjZV9uZXN0bG9vcF9wYXJhbXMocm9vdCwgKE5vZGUgKikgcXBxdWFsKTsKCQlp bmRleG9yZGVyYnlzID0gKExpc3QgKikKCQkJcmVwbGFjZV9uZXN0bG9vcF9wYXJhbXMocm9v dCwgKE5vZGUgKikgaW5kZXhvcmRlcmJ5cyk7Cgl9CgoJLyoKCSAqIElmIHRoZXJlIGFyZSBP UkRFUiBCWSBleHByZXNzaW9ucywgbG9vayB1cCB0aGUgc29ydCBvcGVyYXRvcnMgZm9yIHRo ZWlyCgkgKiByZXN1bHQgZGF0YXR5cGVzLgoJICovCglpZiAoaW5kZXhvcmRlcmJ5cykKCXsK CQlMaXN0Q2VsbCAgICpwYXRoa2V5Q2VsbCwKCQkJCSAgICpleHByQ2VsbDsKCgkJLyoKCQkg KiBQYXRoS2V5IGNvbnRhaW5zIE9JRCBvZiB0aGUgYnRyZWUgb3BmYW1pbHkgd2UncmUgc29y dGluZyBieSwgYnV0CgkJICogdGhhdCdzIG5vdCBxdWl0ZSBlbm91Z2ggYmVjYXVzZSB3ZSBu ZWVkIHRoZSBleHByZXNzaW9uJ3MgZGF0YXR5cGUKCQkgKiB0byBsb29rIHVwIHRoZSBzb3J0 IG9wZXJhdG9yIGluIHRoZSBvcGVyYXRvciBmYW1pbHkuCgkJICovCgkJQXNzZXJ0KGxpc3Rf bGVuZ3RoKGJlc3RfcGF0aC0+cGF0aC5wYXRoa2V5cykgPT0gbGlzdF9sZW5ndGgoaW5kZXhv cmRlcmJ5cykpOwoJCWZvcmJvdGgocGF0aGtleUNlbGwsIGJlc3RfcGF0aC0+cGF0aC5wYXRo a2V5cywgZXhwckNlbGwsIGluZGV4b3JkZXJieXMpCgkJewoJCQlQYXRoS2V5ICAgICpwYXRo a2V5ID0gKFBhdGhLZXkgKikgbGZpcnN0KHBhdGhrZXlDZWxsKTsKCQkJTm9kZQkgICAqZXhw ciA9IChOb2RlICopIGxmaXJzdChleHByQ2VsbCk7CgkJCU9pZAkJCWV4cHJ0eXBlID0gZXhw clR5cGUoZXhwcik7CgkJCU9pZAkJCXNvcnRvcDsKCgkJCS8qIEdldCBzb3J0IG9wZXJhdG9y IGZyb20gb3BmYW1pbHkgKi8KCQkJc29ydG9wID0gZ2V0X29wZmFtaWx5X21lbWJlcl9mb3Jf Y21wdHlwZShwYXRoa2V5LT5wa19vcGZhbWlseSwKCQkJCQkJCQkJCQkJCSBleHBydHlwZSwK CQkJCQkJCQkJCQkJCSBleHBydHlwZSwKCQkJCQkJCQkJCQkJCSBwYXRoa2V5LT5wa19jbXB0 eXBlKTsKCQkJaWYgKCFPaWRJc1ZhbGlkKHNvcnRvcCkpCgkJCQllbG9nKEVSUk9SLCAibWlz c2luZyBvcGVyYXRvciAlZCgldSwldSkgaW4gb3BmYW1pbHkgJXUiLAoJCQkJCSBwYXRoa2V5 LT5wa19jbXB0eXBlLCBleHBydHlwZSwgZXhwcnR5cGUsIHBhdGhrZXktPnBrX29wZmFtaWx5 KTsKCQkJaW5kZXhvcmRlcmJ5b3BzID0gbGFwcGVuZF9vaWQoaW5kZXhvcmRlcmJ5b3BzLCBz b3J0b3ApOwoJCX0KCX0KCgkvKgoJICogRm9yIGFuIGluZGV4LW9ubHkgc2Nhbiwgd2UgbXVz dCBtYXJrIGluZGV4dGxpc3QgZW50cmllcyBhcyByZXNqdW5rIGlmCgkgKiB0aGV5IGFyZSBj b2x1bW5zIHRoYXQgdGhlIGluZGV4IEFNIGNhbid0IHJldHVybjsgdGhpcyBjdWVzIHNldHJl ZnMuYyB0bwoJICogbm90IGdlbmVyYXRlIHJlZmVyZW5jZXMgdG8gdGhvc2UgY29sdW1ucy4K CSAqLwoJaWYgKGluZGV4b25seSkKCXsKCQlpbnQJCQlpID0gMDsKCgkJZm9yZWFjaChsLCBp bmRleGluZm8tPmluZGV4dGxpc3QpCgkJewoJCQlUYXJnZXRFbnRyeSAqaW5kZXh0bGUgPSAo VGFyZ2V0RW50cnkgKikgbGZpcnN0KGwpOwoKCQkJaW5kZXh0bGUtPnJlc2p1bmsgPSAhaW5k ZXhpbmZvLT5jYW5yZXR1cm5baV07CgkJCWkrKzsKCQl9Cgl9CgoJLyogRmluYWxseSByZWFk eSB0byBidWlsZCB0aGUgcGxhbiBub2RlICovCglpZiAoaW5kZXhvbmx5KQoJCXNjYW5fcGxh biA9IChTY2FuICopIG1ha2VfaW5kZXhvbmx5c2Nhbih0bGlzdCwKCQkJCQkJCQkJCQkJcXBx dWFsLAoJCQkJCQkJCQkJCQliYXNlcmVsaWQsCgkJCQkJCQkJCQkJCWluZGV4b2lkLAoJCQkJ CQkJCQkJCQlmaXhlZF9pbmRleHF1YWxzLAoJCQkJCQkJCQkJCQlzdHJpcHBlZF9pbmRleHF1 YWxzLAoJCQkJCQkJCQkJCQlmaXhlZF9pbmRleG9yZGVyYnlzLAoJCQkJCQkJCQkJCQlpbmRl eGluZm8tPmluZGV4dGxpc3QsCgkJCQkJCQkJCQkJCWJlc3RfcGF0aC0+aW5kZXhzY2FuZGly KTsKCWVsc2UKCQlzY2FuX3BsYW4gPSAoU2NhbiAqKSBtYWtlX2luZGV4c2Nhbih0bGlzdCwK CQkJCQkJCQkJCQlxcHF1YWwsCgkJCQkJCQkJCQkJYmFzZXJlbGlkLAoJCQkJCQkJCQkJCWlu ZGV4b2lkLAoJCQkJCQkJCQkJCWZpeGVkX2luZGV4cXVhbHMsCgkJCQkJCQkJCQkJc3RyaXBw ZWRfaW5kZXhxdWFscywKCQkJCQkJCQkJCQlmaXhlZF9pbmRleG9yZGVyYnlzLAoJCQkJCQkJ CQkJCWluZGV4b3JkZXJieXMsCgkJCQkJCQkJCQkJaW5kZXhvcmRlcmJ5b3BzLAoJCQkJCQkJ CQkJCWJlc3RfcGF0aC0+aW5kZXhzY2FuZGlyKTsKCgljb3B5X2dlbmVyaWNfcGF0aF9pbmZv KCZzY2FuX3BsYW4tPnBsYW4sICZiZXN0X3BhdGgtPnBhdGgpOwoKCXJldHVybiBzY2FuX3Bs YW47Cn0KCi8qCiAqIGNyZWF0ZV9iaXRtYXBfc2Nhbl9wbGFuCiAqCSAgUmV0dXJucyBhIGJp dG1hcCBzY2FuIHBsYW4gZm9yIHRoZSBiYXNlIHJlbGF0aW9uIHNjYW5uZWQgYnkgJ2Jlc3Rf cGF0aCcKICoJICB3aXRoIHJlc3RyaWN0aW9uIGNsYXVzZXMgJ3NjYW5fY2xhdXNlcycgYW5k IHRhcmdldGxpc3QgJ3RsaXN0Jy4KICovCnN0YXRpYyBCaXRtYXBIZWFwU2NhbiAqCmNyZWF0 ZV9iaXRtYXBfc2Nhbl9wbGFuKFBsYW5uZXJJbmZvICpyb290LAoJCQkJCQlCaXRtYXBIZWFw UGF0aCAqYmVzdF9wYXRoLAoJCQkJCQlMaXN0ICp0bGlzdCwKCQkJCQkJTGlzdCAqc2Nhbl9j bGF1c2VzKQp7CglJbmRleAkJYmFzZXJlbGlkID0gYmVzdF9wYXRoLT5wYXRoLnBhcmVudC0+ cmVsaWQ7CglQbGFuCSAgICpiaXRtYXBxdWFscGxhbjsKCUxpc3QJICAgKmJpdG1hcHF1YWxv cmlnOwoJTGlzdAkgICAqaW5kZXhxdWFsczsKCUxpc3QJICAgKmluZGV4RUNzOwoJTGlzdAkg ICAqcXBxdWFsOwoJTGlzdENlbGwgICAqbDsKCUJpdG1hcEhlYXBTY2FuICpzY2FuX3BsYW47 CgoJLyogaXQgc2hvdWxkIGJlIGEgYmFzZSByZWwuLi4gKi8KCUFzc2VydChiYXNlcmVsaWQg PiAwKTsKCUFzc2VydChiZXN0X3BhdGgtPnBhdGgucGFyZW50LT5ydGVraW5kID09IFJURV9S RUxBVElPTik7CgoJLyogUHJvY2VzcyB0aGUgYml0bWFwcXVhbCB0cmVlIGludG8gYSBQbGFu IHRyZWUgYW5kIHF1YWwgbGlzdHMgKi8KCWJpdG1hcHF1YWxwbGFuID0gY3JlYXRlX2JpdG1h cF9zdWJwbGFuKHJvb3QsIGJlc3RfcGF0aC0+Yml0bWFwcXVhbCwKCQkJCQkJCQkJCSAgICZi aXRtYXBxdWFsb3JpZywgJmluZGV4cXVhbHMsCgkJCQkJCQkJCQkgICAmaW5kZXhFQ3MpOwoK CWlmIChiZXN0X3BhdGgtPnBhdGgucGFyYWxsZWxfYXdhcmUpCgkJYml0bWFwX3N1YnBsYW5f bWFya19zaGFyZWQoYml0bWFwcXVhbHBsYW4pOwoKCS8qCgkgKiBUaGUgcXBxdWFsIGxpc3Qg bXVzdCBjb250YWluIGFsbCByZXN0cmljdGlvbnMgbm90IGF1dG9tYXRpY2FsbHkgaGFuZGxl ZAoJICogYnkgdGhlIGluZGV4LCBvdGhlciB0aGFuIHBzZXVkb2NvbnN0YW50IGNsYXVzZXMg d2hpY2ggd2lsbCBiZSBoYW5kbGVkCgkgKiBieSBhIHNlcGFyYXRlIGdhdGluZyBwbGFuIG5v ZGUuICBBbGwgdGhlIHByZWRpY2F0ZXMgaW4gdGhlIGluZGV4cXVhbHMKCSAqIHdpbGwgYmUg Y2hlY2tlZCAoZWl0aGVyIGJ5IHRoZSBpbmRleCBpdHNlbGYsIG9yIGJ5CgkgKiBub2RlQml0 bWFwSGVhcHNjYW4uYyksIGJ1dCBpZiB0aGVyZSBhcmUgYW55ICJzcGVjaWFsIiBvcGVyYXRv cnMKCSAqIGludm9sdmVkIHRoZW4gdGhleSBtdXN0IGJlIGFkZGVkIHRvIHFwcXVhbC4gIFRo ZSB1cHNob3QgaXMgdGhhdCBxcHF1YWwKCSAqIG11c3QgY29udGFpbiBzY2FuX2NsYXVzZXMg bWludXMgd2hhdGV2ZXIgYXBwZWFycyBpbiBpbmRleHF1YWxzLgoJICoKCSAqIFRoaXMgbG9v cCBpcyBzaW1pbGFyIHRvIHRoZSBjb21wYXJhYmxlIGNvZGUgaW4gY3JlYXRlX2luZGV4c2Nh bl9wbGFuKCksCgkgKiBidXQgd2l0aCBzb21lIGRpZmZlcmVuY2VzIGJlY2F1c2UgaXQgaGFz IHRvIGNvbXBhcmUgdGhlIHNjYW4gY2xhdXNlcyB0bwoJICogc3RyaXBwZWQgKG5vIFJlc3Ry aWN0SW5mb3MpIGluZGV4cXVhbHMuICBTZWUgY29tbWVudHMgdGhlcmUgZm9yIG1vcmUKCSAq IGluZm8uCgkgKgoJICogSW4gbm9ybWFsIGNhc2VzIHNpbXBsZSBlcXVhbCgpIGNoZWNrcyB3 aWxsIGJlIGVub3VnaCB0byBzcG90IGR1cGxpY2F0ZQoJICogY2xhdXNlcywgc28gd2UgdHJ5 IHRoYXQgZmlyc3QuICBXZSBuZXh0IHNlZSBpZiB0aGUgc2NhbiBjbGF1c2UgaXMKCSAqIHJl ZHVuZGFudCB3aXRoIGFueSB0b3AtbGV2ZWwgaW5kZXhxdWFsIGJ5IHZpcnR1ZSBvZiBiZWlu ZyBnZW5lcmF0ZWQKCSAqIGZyb20gdGhlIHNhbWUgRUMuICBBZnRlciB0aGF0LCB0cnkgcHJl ZGljYXRlX2ltcGxpZWRfYnkoKS4KCSAqCgkgKiBVbmxpa2UgY3JlYXRlX2luZGV4c2Nhbl9w bGFuKCksIHRoZSBwcmVkaWNhdGVfaW1wbGllZF9ieSgpIHRlc3QgaGVyZSBpcwoJICogdXNl ZnVsIGZvciBnZXR0aW5nIHJpZCBvZiBxcHF1YWxzIHRoYXQgYXJlIGltcGxpZWQgYnkgaW5k ZXggcHJlZGljYXRlcywKCSAqIGJlY2F1c2UgdGhlIHByZWRpY2F0ZSBjb25kaXRpb25zIGFy ZSBpbmNsdWRlZCBpbiB0aGUgImluZGV4cXVhbHMiCgkgKiByZXR1cm5lZCBieSBjcmVhdGVf Yml0bWFwX3N1YnBsYW4oKS4gIEJpdG1hcCBzY2FucyBoYXZlIHRvIGRvIGl0IHRoYXQKCSAq IHdheSBiZWNhdXNlIHByZWRpY2F0ZSBjb25kaXRpb25zIG5lZWQgdG8gYmUgcmVjaGVja2Vk IGlmIHRoZSBzY2FuCgkgKiBiZWNvbWVzIGxvc3N5LCBzbyB0aGV5IGhhdmUgdG8gYmUgaW5j bHVkZWQgaW4gYml0bWFwcXVhbG9yaWcuCgkgKi8KCXFwcXVhbCA9IE5JTDsKCWZvcmVhY2go bCwgc2Nhbl9jbGF1c2VzKQoJewoJCVJlc3RyaWN0SW5mbyAqcmluZm8gPSBsZmlyc3Rfbm9k ZShSZXN0cmljdEluZm8sIGwpOwoJCU5vZGUJICAgKmNsYXVzZSA9IChOb2RlICopIHJpbmZv LT5jbGF1c2U7CgoJCWlmIChyaW5mby0+cHNldWRvY29uc3RhbnQpCgkJCWNvbnRpbnVlOwkJ CS8qIHdlIG1heSBkcm9wIHBzZXVkb2NvbnN0YW50cyBoZXJlICovCgkJaWYgKGxpc3RfbWVt YmVyKGluZGV4cXVhbHMsIGNsYXVzZSkpCgkJCWNvbnRpbnVlOwkJCS8qIHNpbXBsZSBkdXBs aWNhdGUgKi8KCQlpZiAocmluZm8tPnBhcmVudF9lYyAmJiBsaXN0X21lbWJlcl9wdHIoaW5k ZXhFQ3MsIHJpbmZvLT5wYXJlbnRfZWMpKQoJCQljb250aW51ZTsJCQkvKiBkZXJpdmVkIGZy b20gc2FtZSBFcXVpdmFsZW5jZUNsYXNzICovCgkJaWYgKCFjb250YWluX211dGFibGVfZnVu Y3Rpb25zKGNsYXVzZSkgJiYKCQkJcHJlZGljYXRlX2ltcGxpZWRfYnkobGlzdF9tYWtlMShj bGF1c2UpLCBpbmRleHF1YWxzLCBmYWxzZSkpCgkJCWNvbnRpbnVlOwkJCS8qIHByb3ZhYmx5 IGltcGxpZWQgYnkgaW5kZXhxdWFscyAqLwoJCXFwcXVhbCA9IGxhcHBlbmQocXBxdWFsLCBy aW5mbyk7Cgl9CgoJLyogU29ydCBjbGF1c2VzIGludG8gYmVzdCBleGVjdXRpb24gb3JkZXIg Ki8KCXFwcXVhbCA9IG9yZGVyX3F1YWxfY2xhdXNlcyhyb290LCBxcHF1YWwpOwoKCS8qIFJl ZHVjZSBSZXN0cmljdEluZm8gbGlzdCB0byBiYXJlIGV4cHJlc3Npb25zOyBpZ25vcmUgcHNl dWRvY29uc3RhbnRzICovCglxcHF1YWwgPSBleHRyYWN0X2FjdHVhbF9jbGF1c2VzKHFwcXVh bCwgZmFsc2UpOwoKCS8qCgkgKiBXaGVuIGRlYWxpbmcgd2l0aCBzcGVjaWFsIG9wZXJhdG9y cywgd2Ugd2lsbCBhdCB0aGlzIHBvaW50IGhhdmUKCSAqIGR1cGxpY2F0ZSBjbGF1c2VzIGlu IHFwcXVhbCBhbmQgYml0bWFwcXVhbG9yaWcuICBXZSBtYXkgYXMgd2VsbCBkcm9wCgkgKiAn ZW0gZnJvbSBiaXRtYXBxdWFsb3JpZywgc2luY2UgdGhlcmUncyBubyBwb2ludCBpbiBtYWtp bmcgdGhlIHRlc3RzCgkgKiB0d2ljZS4KCSAqLwoJYml0bWFwcXVhbG9yaWcgPSBsaXN0X2Rp ZmZlcmVuY2VfcHRyKGJpdG1hcHF1YWxvcmlnLCBxcHF1YWwpOwoKCS8qCgkgKiBXZSBoYXZl IHRvIHJlcGxhY2UgYW55IG91dGVyLXJlbGF0aW9uIHZhcmlhYmxlcyB3aXRoIG5lc3Rsb29w IHBhcmFtcyBpbgoJICogdGhlIHFwcXVhbCBhbmQgYml0bWFwcXVhbG9yaWcgZXhwcmVzc2lv bnMuICAoVGhpcyB3YXMgYWxyZWFkeSBkb25lIGZvcgoJICogZXhwcmVzc2lvbnMgYXR0YWNo ZWQgdG8gcGxhbiBub2RlcyBpbiB0aGUgYml0bWFwcXVhbHBsYW4gdHJlZS4pCgkgKi8KCWlm IChiZXN0X3BhdGgtPnBhdGgucGFyYW1faW5mbykKCXsKCQlxcHF1YWwgPSAoTGlzdCAqKQoJ CQlyZXBsYWNlX25lc3Rsb29wX3BhcmFtcyhyb290LCAoTm9kZSAqKSBxcHF1YWwpOwoJCWJp dG1hcHF1YWxvcmlnID0gKExpc3QgKikKCQkJcmVwbGFjZV9uZXN0bG9vcF9wYXJhbXMocm9v dCwgKE5vZGUgKikgYml0bWFwcXVhbG9yaWcpOwoJfQoKCS8qIEZpbmFsbHkgcmVhZHkgdG8g YnVpbGQgdGhlIHBsYW4gbm9kZSAqLwoJc2Nhbl9wbGFuID0gbWFrZV9iaXRtYXBfaGVhcHNj YW4odGxpc3QsCgkJCQkJCQkJCSBxcHF1YWwsCgkJCQkJCQkJCSBiaXRtYXBxdWFscGxhbiwK CQkJCQkJCQkJIGJpdG1hcHF1YWxvcmlnLAoJCQkJCQkJCQkgYmFzZXJlbGlkKTsKCgljb3B5 X2dlbmVyaWNfcGF0aF9pbmZvKCZzY2FuX3BsYW4tPnNjYW4ucGxhbiwgJmJlc3RfcGF0aC0+ cGF0aCk7CgoJcmV0dXJuIHNjYW5fcGxhbjsKfQoKLyoKICogR2l2ZW4gYSBiaXRtYXBxdWFs IHRyZWUsIGdlbmVyYXRlIHRoZSBQbGFuIHRyZWUgdGhhdCBpbXBsZW1lbnRzIGl0CiAqCiAq IEFzIGJ5cHJvZHVjdHMsIHdlIGFsc28gcmV0dXJuIGluICpxdWFsIGFuZCAqaW5kZXhxdWFs IHRoZSBxdWFsIGxpc3RzCiAqIChpbiBpbXBsaWNpdC1BTkQgZm9ybSwgd2l0aG91dCBSZXN0 cmljdEluZm9zKSBkZXNjcmliaW5nIHRoZSBvcmlnaW5hbCBpbmRleAogKiBjb25kaXRpb25z IGFuZCB0aGUgZ2VuZXJhdGVkIGluZGV4cXVhbCBjb25kaXRpb25zLiAgKFRoZXNlIGFyZSB0 aGUgc2FtZSBpbgogKiBzaW1wbGUgY2FzZXMsIGJ1dCB3aGVuIHNwZWNpYWwgaW5kZXggb3Bl cmF0b3JzIGFyZSBpbnZvbHZlZCwgdGhlIGZvcm1lcgogKiBsaXN0IGluY2x1ZGVzIHRoZSBz cGVjaWFsIGNvbmRpdGlvbnMgd2hpbGUgdGhlIGxhdHRlciBpbmNsdWRlcyB0aGUgYWN0dWFs CiAqIGluZGV4YWJsZSBjb25kaXRpb25zIGRlcml2ZWQgZnJvbSB0aGVtLikgIEJvdGggbGlz dHMgaW5jbHVkZSBwYXJ0aWFsLWluZGV4CiAqIHByZWRpY2F0ZXMsIGJlY2F1c2Ugd2UgaGF2 ZSB0byByZWNoZWNrIHByZWRpY2F0ZXMgYXMgd2VsbCBhcyBpbmRleAogKiBjb25kaXRpb25z IGlmIHRoZSBiaXRtYXAgc2NhbiBiZWNvbWVzIGxvc3N5LgogKgogKiBJbiBhZGRpdGlvbiwg d2UgcmV0dXJuIGEgbGlzdCBvZiBFcXVpdmFsZW5jZUNsYXNzIHBvaW50ZXJzIGZvciBhbGwg dGhlCiAqIHRvcC1sZXZlbCBpbmRleHF1YWxzIHRoYXQgd2VyZSBwb3NzaWJseS1yZWR1bmRh bnRseSBkZXJpdmVkIGZyb20gRUNzLgogKiBUaGlzIGFsbG93cyByZW1vdmFsIG9mIHNjYW5f Y2xhdXNlcyB0aGF0IGFyZSByZWR1bmRhbnQgd2l0aCBzdWNoIHF1YWxzLgogKiAoV2UgZG8g bm90IGF0dGVtcHQgdG8gZGV0ZWN0IHN1Y2ggcmVkdW5kYW5jaWVzIGZvciBxdWFscyB0aGF0 IGFyZSB3aXRoaW4KICogT1Igc3VidHJlZXMuICBUaGlzIGNvdWxkIGJlIGRvbmUgaW4gYSBs ZXNzIGhhY2t5IHdheSBpZiB3ZSByZXR1cm5lZCB0aGUKICogaW5kZXhxdWFscyBpbiBSZXN0 cmljdEluZm8gZm9ybSwgYnV0IHRoYXQgd291bGQgYmUgc2xvd2VyIGFuZCBzdGlsbCBwcmV0 dHkKICogbWVzc3ksIHNpbmNlIHdlJ2QgaGF2ZSB0byBidWlsZCBuZXcgUmVzdHJpY3RJbmZv cyBpbiBtYW55IGNhc2VzLikKICovCnN0YXRpYyBQbGFuICoKY3JlYXRlX2JpdG1hcF9zdWJw bGFuKFBsYW5uZXJJbmZvICpyb290LCBQYXRoICpiaXRtYXBxdWFsLAoJCQkJCSAgTGlzdCAq KnF1YWwsIExpc3QgKippbmRleHF1YWwsIExpc3QgKippbmRleEVDcykKewoJUGxhbgkgICAq cGxhbjsKCglpZiAoSXNBKGJpdG1hcHF1YWwsIEJpdG1hcEFuZFBhdGgpKQoJewoJCUJpdG1h cEFuZFBhdGggKmFwYXRoID0gKEJpdG1hcEFuZFBhdGggKikgYml0bWFwcXVhbDsKCQlMaXN0 CSAgICpzdWJwbGFucyA9IE5JTDsKCQlMaXN0CSAgICpzdWJxdWFscyA9IE5JTDsKCQlMaXN0 CSAgICpzdWJpbmRleHF1YWxzID0gTklMOwoJCUxpc3QJICAgKnN1YmluZGV4RUNzID0gTklM OwoJCUxpc3RDZWxsICAgKmw7CgoJCS8qCgkJICogVGhlcmUgbWF5IHdlbGwgYmUgcmVkdW5k YW50IHF1YWxzIGFtb25nIHRoZSBzdWJwbGFucywgc2luY2UgYQoJCSAqIHRvcC1sZXZlbCBX SEVSRSBxdWFsIG1pZ2h0IGhhdmUgZ290dGVuIHVzZWQgdG8gZm9ybSBzZXZlcmFsCgkJICog ZGlmZmVyZW50IGluZGV4IHF1YWxzLiAgV2UgZG9uJ3QgdHJ5IGV4Y2VlZGluZ2x5IGhhcmQg dG8gZWxpbWluYXRlCgkJICogcmVkdW5kYW5jaWVzLCBidXQgd2UgZG8gZWxpbWluYXRlIG9i dmlvdXMgZHVwbGljYXRlcyBieSB1c2luZwoJCSAqIGxpc3RfY29uY2F0X3VuaXF1ZS4KCQkg Ki8KCQlmb3JlYWNoKGwsIGFwYXRoLT5iaXRtYXBxdWFscykKCQl7CgkJCVBsYW4JICAgKnN1 YnBsYW47CgkJCUxpc3QJICAgKnN1YnF1YWw7CgkJCUxpc3QJICAgKnN1YmluZGV4cXVhbDsK CQkJTGlzdAkgICAqc3ViaW5kZXhFQzsKCgkJCXN1YnBsYW4gPSBjcmVhdGVfYml0bWFwX3N1 YnBsYW4ocm9vdCwgKFBhdGggKikgbGZpcnN0KGwpLAoJCQkJCQkJCQkJCSZzdWJxdWFsLCAm c3ViaW5kZXhxdWFsLAoJCQkJCQkJCQkJCSZzdWJpbmRleEVDKTsKCQkJc3VicGxhbnMgPSBs YXBwZW5kKHN1YnBsYW5zLCBzdWJwbGFuKTsKCQkJc3VicXVhbHMgPSBsaXN0X2NvbmNhdF91 bmlxdWUoc3VicXVhbHMsIHN1YnF1YWwpOwoJCQlzdWJpbmRleHF1YWxzID0gbGlzdF9jb25j YXRfdW5pcXVlKHN1YmluZGV4cXVhbHMsIHN1YmluZGV4cXVhbCk7CgkJCS8qIER1cGxpY2F0 ZXMgaW4gaW5kZXhFQ3MgYXJlbid0IHdvcnRoIGdldHRpbmcgcmlkIG9mICovCgkJCXN1Ymlu ZGV4RUNzID0gbGlzdF9jb25jYXQoc3ViaW5kZXhFQ3MsIHN1YmluZGV4RUMpOwoJCX0KCQlw bGFuID0gKFBsYW4gKikgbWFrZV9iaXRtYXBfYW5kKHN1YnBsYW5zKTsKCQlwbGFuLT5zdGFy dHVwX2Nvc3QgPSBhcGF0aC0+cGF0aC5zdGFydHVwX2Nvc3Q7CgkJcGxhbi0+dG90YWxfY29z dCA9IGFwYXRoLT5wYXRoLnRvdGFsX2Nvc3Q7CgkJcGxhbi0+cGxhbl9yb3dzID0KCQkJY2xh bXBfcm93X2VzdChhcGF0aC0+Yml0bWFwc2VsZWN0aXZpdHkgKiBhcGF0aC0+cGF0aC5wYXJl bnQtPnR1cGxlcyk7CgkJcGxhbi0+cGxhbl93aWR0aCA9IDA7CS8qIG1lYW5pbmdsZXNzICov CgkJcGxhbi0+cGFyYWxsZWxfYXdhcmUgPSBmYWxzZTsKCQlwbGFuLT5wYXJhbGxlbF9zYWZl ID0gYXBhdGgtPnBhdGgucGFyYWxsZWxfc2FmZTsKCQkqcXVhbCA9IHN1YnF1YWxzOwoJCSpp bmRleHF1YWwgPSBzdWJpbmRleHF1YWxzOwoJCSppbmRleEVDcyA9IHN1YmluZGV4RUNzOwoJ fQoJZWxzZSBpZiAoSXNBKGJpdG1hcHF1YWwsIEJpdG1hcE9yUGF0aCkpCgl7CgkJQml0bWFw T3JQYXRoICpvcGF0aCA9IChCaXRtYXBPclBhdGggKikgYml0bWFwcXVhbDsKCQlMaXN0CSAg ICpzdWJwbGFucyA9IE5JTDsKCQlMaXN0CSAgICpzdWJxdWFscyA9IE5JTDsKCQlMaXN0CSAg ICpzdWJpbmRleHF1YWxzID0gTklMOwoJCWJvb2wJCWNvbnN0X3RydWVfc3VicXVhbCA9IGZh bHNlOwoJCWJvb2wJCWNvbnN0X3RydWVfc3ViaW5kZXhxdWFsID0gZmFsc2U7CgkJTGlzdENl bGwgICAqbDsKCgkJLyoKCQkgKiBIZXJlLCB3ZSBvbmx5IGRldGVjdCBxdWFsLWZyZWUgc3Vi cGxhbnMuICBBIHF1YWwtZnJlZSBzdWJwbGFuIHdvdWxkCgkJICogY2F1c2UgdXMgdG8gZ2Vu ZXJhdGUgIi4uLiBPUiB0cnVlIC4uLiIgIHdoaWNoIHdlIG1heSBhcyB3ZWxsIHJlZHVjZQoJ CSAqIHRvIGp1c3QgInRydWUiLiAgV2UgZG8gbm90IHRyeSB0byBlbGltaW5hdGUgcmVkdW5k YW50IHN1YmNsYXVzZXMKCQkgKiBiZWNhdXNlIChhKSBpdCdzIG5vdCBhcyBsaWtlbHkgYXMg aW4gdGhlIEFORCBjYXNlLCBhbmQgKGIpIHdlIG1pZ2h0CgkJICogd2VsbCBiZSB3b3JraW5n IHdpdGggaHVuZHJlZHMgb3IgZXZlbiB0aG91c2FuZHMgb2YgT1IgY29uZGl0aW9ucywKCQkg KiBwZXJoYXBzIGZyb20gYSBsb25nIElOIGxpc3QuICBUaGUgcGVyZm9ybWFuY2Ugb2YgbGlz dF9hcHBlbmRfdW5pcXVlCgkJICogd291bGQgYmUgdW5hY2NlcHRhYmxlLgoJCSAqLwoJCWZv cmVhY2gobCwgb3BhdGgtPmJpdG1hcHF1YWxzKQoJCXsKCQkJUGxhbgkgICAqc3VicGxhbjsK CQkJTGlzdAkgICAqc3VicXVhbDsKCQkJTGlzdAkgICAqc3ViaW5kZXhxdWFsOwoJCQlMaXN0 CSAgICpzdWJpbmRleEVDOwoKCQkJc3VicGxhbiA9IGNyZWF0ZV9iaXRtYXBfc3VicGxhbihy b290LCAoUGF0aCAqKSBsZmlyc3QobCksCgkJCQkJCQkJCQkJJnN1YnF1YWwsICZzdWJpbmRl eHF1YWwsCgkJCQkJCQkJCQkJJnN1YmluZGV4RUMpOwoJCQlzdWJwbGFucyA9IGxhcHBlbmQo c3VicGxhbnMsIHN1YnBsYW4pOwoJCQlpZiAoc3VicXVhbCA9PSBOSUwpCgkJCQljb25zdF90 cnVlX3N1YnF1YWwgPSB0cnVlOwoJCQllbHNlIGlmICghY29uc3RfdHJ1ZV9zdWJxdWFsKQoJ CQkJc3VicXVhbHMgPSBsYXBwZW5kKHN1YnF1YWxzLAoJCQkJCQkJCSAgIG1ha2VfYW5kc19l eHBsaWNpdChzdWJxdWFsKSk7CgkJCWlmIChzdWJpbmRleHF1YWwgPT0gTklMKQoJCQkJY29u c3RfdHJ1ZV9zdWJpbmRleHF1YWwgPSB0cnVlOwoJCQllbHNlIGlmICghY29uc3RfdHJ1ZV9z dWJpbmRleHF1YWwpCgkJCQlzdWJpbmRleHF1YWxzID0gbGFwcGVuZChzdWJpbmRleHF1YWxz LAoJCQkJCQkJCQkJbWFrZV9hbmRzX2V4cGxpY2l0KHN1YmluZGV4cXVhbCkpOwoJCX0KCgkJ LyoKCQkgKiBJbiB0aGUgcHJlc2VuY2Ugb2YgU2NhbGFyQXJyYXlPcEV4cHIgcXVhbHMsIHdl IG1pZ2h0IGhhdmUgYnVpbHQKCQkgKiBCaXRtYXBPclBhdGhzIHdpdGgganVzdCBvbmUgc3Vi cGF0aDsgZG9uJ3QgYWRkIGFuIE9SIHN0ZXAuCgkJICovCgkJaWYgKGxpc3RfbGVuZ3RoKHN1 YnBsYW5zKSA9PSAxKQoJCXsKCQkJcGxhbiA9IChQbGFuICopIGxpbml0aWFsKHN1YnBsYW5z KTsKCQl9CgkJZWxzZQoJCXsKCQkJcGxhbiA9IChQbGFuICopIG1ha2VfYml0bWFwX29yKHN1 YnBsYW5zKTsKCQkJcGxhbi0+c3RhcnR1cF9jb3N0ID0gb3BhdGgtPnBhdGguc3RhcnR1cF9j b3N0OwoJCQlwbGFuLT50b3RhbF9jb3N0ID0gb3BhdGgtPnBhdGgudG90YWxfY29zdDsKCQkJ cGxhbi0+cGxhbl9yb3dzID0KCQkJCWNsYW1wX3Jvd19lc3Qob3BhdGgtPmJpdG1hcHNlbGVj dGl2aXR5ICogb3BhdGgtPnBhdGgucGFyZW50LT50dXBsZXMpOwoJCQlwbGFuLT5wbGFuX3dp ZHRoID0gMDsJLyogbWVhbmluZ2xlc3MgKi8KCQkJcGxhbi0+cGFyYWxsZWxfYXdhcmUgPSBm YWxzZTsKCQkJcGxhbi0+cGFyYWxsZWxfc2FmZSA9IG9wYXRoLT5wYXRoLnBhcmFsbGVsX3Nh ZmU7CgkJfQoKCQkvKgoJCSAqIElmIHRoZXJlIHdlcmUgY29uc3RhbnQtVFJVRSBzdWJxdWFs cywgdGhlIE9SIHJlZHVjZXMgdG8gY29uc3RhbnQKCQkgKiBUUlVFLiAgQWxzbywgYXZvaWQg Z2VuZXJhdGluZyBvbmUtZWxlbWVudCBPUnMsIHdoaWNoIGNvdWxkIGhhcHBlbgoJCSAqIGR1 ZSB0byByZWR1bmRhbmN5IGVsaW1pbmF0aW9uIG9yIFNjYWxhckFycmF5T3BFeHByIHF1YWxz LgoJCSAqLwoJCWlmIChjb25zdF90cnVlX3N1YnF1YWwpCgkJCSpxdWFsID0gTklMOwoJCWVs c2UgaWYgKGxpc3RfbGVuZ3RoKHN1YnF1YWxzKSA8PSAxKQoJCQkqcXVhbCA9IHN1YnF1YWxz OwoJCWVsc2UKCQkJKnF1YWwgPSBsaXN0X21ha2UxKG1ha2Vfb3JjbGF1c2Uoc3VicXVhbHMp KTsKCQlpZiAoY29uc3RfdHJ1ZV9zdWJpbmRleHF1YWwpCgkJCSppbmRleHF1YWwgPSBOSUw7 CgkJZWxzZSBpZiAobGlzdF9sZW5ndGgoc3ViaW5kZXhxdWFscykgPD0gMSkKCQkJKmluZGV4 cXVhbCA9IHN1YmluZGV4cXVhbHM7CgkJZWxzZQoJCQkqaW5kZXhxdWFsID0gbGlzdF9tYWtl MShtYWtlX29yY2xhdXNlKHN1YmluZGV4cXVhbHMpKTsKCQkqaW5kZXhFQ3MgPSBOSUw7Cgl9 CgllbHNlIGlmIChJc0EoYml0bWFwcXVhbCwgSW5kZXhQYXRoKSkKCXsKCQlJbmRleFBhdGgg ICppcGF0aCA9IChJbmRleFBhdGggKikgYml0bWFwcXVhbDsKCQlJbmRleFNjYW4gICppc2Nh bjsKCQlMaXN0CSAgICpzdWJxdWFsczsKCQlMaXN0CSAgICpzdWJpbmRleHF1YWxzOwoJCUxp c3QJICAgKnN1YmluZGV4RUNzOwoJCUxpc3RDZWxsICAgKmw7CgoJCS8qIFVzZSB0aGUgcmVn dWxhciBpbmRleHNjYW4gcGxhbiBidWlsZCBtYWNoaW5lcnkuLi4gKi8KCQlpc2NhbiA9IGNh c3ROb2RlKEluZGV4U2NhbiwKCQkJCQkJIGNyZWF0ZV9pbmRleHNjYW5fcGxhbihyb290LCBp cGF0aCwKCQkJCQkJCQkJCQkgICBOSUwsIE5JTCwgZmFsc2UpKTsKCQkvKiB0aGVuIGNvbnZl cnQgdG8gYSBiaXRtYXAgaW5kZXhzY2FuICovCgkJcGxhbiA9IChQbGFuICopIG1ha2VfYml0 bWFwX2luZGV4c2Nhbihpc2Nhbi0+c2Nhbi5zY2FucmVsaWQsCgkJCQkJCQkJCQkJICBpc2Nh bi0+aW5kZXhpZCwKCQkJCQkJCQkJCQkgIGlzY2FuLT5pbmRleHF1YWwsCgkJCQkJCQkJCQkJ ICBpc2Nhbi0+aW5kZXhxdWFsb3JpZyk7CgkJLyogYW5kIHNldCBpdHMgY29zdC93aWR0aCBm aWVsZHMgYXBwcm9wcmlhdGVseSAqLwoJCXBsYW4tPnN0YXJ0dXBfY29zdCA9IDAuMDsKCQlw bGFuLT50b3RhbF9jb3N0ID0gaXBhdGgtPmluZGV4dG90YWxjb3N0OwoJCXBsYW4tPnBsYW5f cm93cyA9CgkJCWNsYW1wX3Jvd19lc3QoaXBhdGgtPmluZGV4c2VsZWN0aXZpdHkgKiBpcGF0 aC0+cGF0aC5wYXJlbnQtPnR1cGxlcyk7CgkJcGxhbi0+cGxhbl93aWR0aCA9IDA7CS8qIG1l YW5pbmdsZXNzICovCgkJcGxhbi0+cGFyYWxsZWxfYXdhcmUgPSBmYWxzZTsKCQlwbGFuLT5w YXJhbGxlbF9zYWZlID0gaXBhdGgtPnBhdGgucGFyYWxsZWxfc2FmZTsKCQkvKiBFeHRyYWN0 IG9yaWdpbmFsIGluZGV4IGNsYXVzZXMsIGFjdHVhbCBpbmRleCBxdWFscywgcmVsZXZhbnQg RUNzICovCgkJc3VicXVhbHMgPSBOSUw7CgkJc3ViaW5kZXhxdWFscyA9IE5JTDsKCQlzdWJp bmRleEVDcyA9IE5JTDsKCQlmb3JlYWNoKGwsIGlwYXRoLT5pbmRleGNsYXVzZXMpCgkJewoJ CQlJbmRleENsYXVzZSAqaWNsYXVzZSA9IChJbmRleENsYXVzZSAqKSBsZmlyc3QobCk7CgkJ CVJlc3RyaWN0SW5mbyAqcmluZm8gPSBpY2xhdXNlLT5yaW5mbzsKCgkJCUFzc2VydCghcmlu Zm8tPnBzZXVkb2NvbnN0YW50KTsKCQkJc3VicXVhbHMgPSBsYXBwZW5kKHN1YnF1YWxzLCBy aW5mby0+Y2xhdXNlKTsKCQkJc3ViaW5kZXhxdWFscyA9IGxpc3RfY29uY2F0KHN1YmluZGV4 cXVhbHMsCgkJCQkJCQkJCQlnZXRfYWN0dWFsX2NsYXVzZXMoaWNsYXVzZS0+aW5kZXhxdWFs cykpOwoJCQlpZiAocmluZm8tPnBhcmVudF9lYykKCQkJCXN1YmluZGV4RUNzID0gbGFwcGVu ZChzdWJpbmRleEVDcywgcmluZm8tPnBhcmVudF9lYyk7CgkJfQoJCS8qIFdlIGNhbiBhZGQg YW55IGluZGV4IHByZWRpY2F0ZSBjb25kaXRpb25zLCB0b28gKi8KCQlmb3JlYWNoKGwsIGlw YXRoLT5pbmRleGluZm8tPmluZHByZWRFeHBhbmQpCgkJewoJCQlFeHByCSAgICpwcmVkID0g KEV4cHIgKikgbGZpcnN0KGwpOwoKCQkJLyoKCQkJICogV2Uga25vdyB0aGF0IHRoZSBpbmRl eCBwcmVkaWNhdGUgbXVzdCBoYXZlIGJlZW4gaW1wbGllZCBieSB0aGUKCQkJICogcXVlcnkg Y29uZGl0aW9uIGFzIGEgd2hvbGUsIGJ1dCBpdCBtYXkgb3IgbWF5IG5vdCBiZSBpbXBsaWVk IGJ5CgkJCSAqIHRoZSBjb25kaXRpb25zIHRoYXQgZ290IHB1c2hlZCBpbnRvIHRoZSBiaXRt YXBxdWFsLiAgQXZvaWQKCQkJICogZ2VuZXJhdGluZyByZWR1bmRhbnQgY29uZGl0aW9ucy4K CQkJICovCgkJCWlmICghcHJlZGljYXRlX2ltcGxpZWRfYnkobGlzdF9tYWtlMShwcmVkKSwg c3VicXVhbHMsIGZhbHNlKSkKCQkJewoJCQkJc3VicXVhbHMgPSBsYXBwZW5kKHN1YnF1YWxz LCBwcmVkKTsKCQkJCXN1YmluZGV4cXVhbHMgPSBsYXBwZW5kKHN1YmluZGV4cXVhbHMsIHBy ZWQpOwoJCQl9CgkJfQoJCSpxdWFsID0gc3VicXVhbHM7CgkJKmluZGV4cXVhbCA9IHN1Ymlu ZGV4cXVhbHM7CgkJKmluZGV4RUNzID0gc3ViaW5kZXhFQ3M7Cgl9CgllbHNlCgl7CgkJZWxv ZyhFUlJPUiwgInVucmVjb2duaXplZCBub2RlIHR5cGU6ICVkIiwgbm9kZVRhZyhiaXRtYXBx dWFsKSk7CgkJcGxhbiA9IE5VTEw7CQkJLyoga2VlcCBjb21waWxlciBxdWlldCAqLwoJfQoK CXJldHVybiBwbGFuOwp9CgovKgogKiBjcmVhdGVfdGlkc2Nhbl9wbGFuCiAqCSBSZXR1cm5z IGEgdGlkc2NhbiBwbGFuIGZvciB0aGUgYmFzZSByZWxhdGlvbiBzY2FubmVkIGJ5ICdiZXN0 X3BhdGgnCiAqCSB3aXRoIHJlc3RyaWN0aW9uIGNsYXVzZXMgJ3NjYW5fY2xhdXNlcycgYW5k IHRhcmdldGxpc3QgJ3RsaXN0Jy4KICovCnN0YXRpYyBUaWRTY2FuICoKY3JlYXRlX3RpZHNj YW5fcGxhbihQbGFubmVySW5mbyAqcm9vdCwgVGlkUGF0aCAqYmVzdF9wYXRoLAoJCQkJCUxp c3QgKnRsaXN0LCBMaXN0ICpzY2FuX2NsYXVzZXMpCnsKCVRpZFNjYW4gICAgKnNjYW5fcGxh bjsKCUluZGV4CQlzY2FuX3JlbGlkID0gYmVzdF9wYXRoLT5wYXRoLnBhcmVudC0+cmVsaWQ7 CglMaXN0CSAgICp0aWRxdWFscyA9IGJlc3RfcGF0aC0+dGlkcXVhbHM7CgoJLyogaXQgc2hv dWxkIGJlIGEgYmFzZSByZWwuLi4gKi8KCUFzc2VydChzY2FuX3JlbGlkID4gMCk7CglBc3Nl cnQoYmVzdF9wYXRoLT5wYXRoLnBhcmVudC0+cnRla2luZCA9PSBSVEVfUkVMQVRJT04pOwoK CS8qCgkgKiBUaGUgcXBxdWFsIGxpc3QgbXVzdCBjb250YWluIGFsbCByZXN0cmljdGlvbnMg bm90IGVuZm9yY2VkIGJ5IHRoZQoJICogdGlkcXVhbHMgbGlzdC4gIFNpbmNlIHRpZHF1YWxz IGhhcyBPUiBzZW1hbnRpY3MsIHdlIGhhdmUgdG8gYmUgY2FyZWZ1bAoJICogYWJvdXQgbWF0 Y2hpbmcgaXQgdXAgdG8gc2Nhbl9jbGF1c2VzLiAgSXQncyBjb252ZW5pZW50IHRvIGhhbmRs ZSB0aGUKCSAqIHNpbmdsZS10aWRxdWFsIGNhc2Ugc2VwYXJhdGVseSBmcm9tIHRoZSBtdWx0 aXBsZS10aWRxdWFsIGNhc2UuICBJbiB0aGUKCSAqIHNpbmdsZS10aWRxdWFsIGNhc2UsIHdl IGxvb2sgdGhyb3VnaCB0aGUgc2Nhbl9jbGF1c2VzIHdoaWxlIHRoZXkgYXJlCgkgKiBzdGls bCBpbiBSZXN0cmljdEluZm8gZm9ybSwgYW5kIGRyb3AgYW55IHRoYXQgYXJlIHJlZHVuZGFu dCB3aXRoIHRoZQoJICogdGlkcXVhbC4KCSAqCgkgKiBJbiBub3JtYWwgY2FzZXMgc2ltcGxl IHBvaW50ZXIgZXF1YWxpdHkgY2hlY2tzIHdpbGwgYmUgZW5vdWdoIHRvIHNwb3QKCSAqIGR1 cGxpY2F0ZSBSZXN0cmljdEluZm9zLCBzbyB3ZSB0cnkgdGhhdCBmaXJzdC4KCSAqCgkgKiBB bm90aGVyIGNvbW1vbiBjYXNlIGlzIHRoYXQgYSBzY2FuX2NsYXVzZXMgZW50cnkgaXMgZ2Vu ZXJhdGVkIGZyb20gdGhlCgkgKiBzYW1lIEVxdWl2YWxlbmNlQ2xhc3MgYXMgc29tZSB0aWRx dWFsLCBhbmQgaXMgdGhlcmVmb3JlIHJlZHVuZGFudCB3aXRoCgkgKiBpdCwgdGhvdWdoIG5v dCBlcXVhbC4KCSAqCgkgKiBVbmxpa2UgaW5kZXhwYXRocywgd2UgZG9uJ3QgYm90aGVyIHdp dGggcHJlZGljYXRlX2ltcGxpZWRfYnkoKTsgdGhlCgkgKiBudW1iZXIgb2YgY2FzZXMgd2hl cmUgaXQgY291bGQgd2luIGFyZSBwcmV0dHkgc21hbGwuCgkgKi8KCWlmIChsaXN0X2xlbmd0 aCh0aWRxdWFscykgPT0gMSkKCXsKCQlMaXN0CSAgICpxcHF1YWwgPSBOSUw7CgkJTGlzdENl bGwgICAqbDsKCgkJZm9yZWFjaChsLCBzY2FuX2NsYXVzZXMpCgkJewoJCQlSZXN0cmljdElu Zm8gKnJpbmZvID0gbGZpcnN0X25vZGUoUmVzdHJpY3RJbmZvLCBsKTsKCgkJCWlmIChyaW5m by0+cHNldWRvY29uc3RhbnQpCgkJCQljb250aW51ZTsJCS8qIHdlIG1heSBkcm9wIHBzZXVk b2NvbnN0YW50cyBoZXJlICovCgkJCWlmIChsaXN0X21lbWJlcl9wdHIodGlkcXVhbHMsIHJp bmZvKSkKCQkJCWNvbnRpbnVlOwkJLyogc2ltcGxlIGR1cGxpY2F0ZSAqLwoJCQlpZiAoaXNf cmVkdW5kYW50X2Rlcml2ZWRfY2xhdXNlKHJpbmZvLCB0aWRxdWFscykpCgkJCQljb250aW51 ZTsJCS8qIGRlcml2ZWQgZnJvbSBzYW1lIEVxdWl2YWxlbmNlQ2xhc3MgKi8KCQkJcXBxdWFs ID0gbGFwcGVuZChxcHF1YWwsIHJpbmZvKTsKCQl9CgkJc2Nhbl9jbGF1c2VzID0gcXBxdWFs OwoJfQoKCS8qIFNvcnQgY2xhdXNlcyBpbnRvIGJlc3QgZXhlY3V0aW9uIG9yZGVyICovCglz Y2FuX2NsYXVzZXMgPSBvcmRlcl9xdWFsX2NsYXVzZXMocm9vdCwgc2Nhbl9jbGF1c2VzKTsK CgkvKiBSZWR1Y2UgUmVzdHJpY3RJbmZvIGxpc3RzIHRvIGJhcmUgZXhwcmVzc2lvbnM7IGln bm9yZSBwc2V1ZG9jb25zdGFudHMgKi8KCXRpZHF1YWxzID0gZXh0cmFjdF9hY3R1YWxfY2xh dXNlcyh0aWRxdWFscywgZmFsc2UpOwoJc2Nhbl9jbGF1c2VzID0gZXh0cmFjdF9hY3R1YWxf Y2xhdXNlcyhzY2FuX2NsYXVzZXMsIGZhbHNlKTsKCgkvKgoJICogSWYgd2UgaGF2ZSBtdWx0 aXBsZSB0aWRxdWFscywgaXQncyBtb3JlIGNvbnZlbmllbnQgdG8gcmVtb3ZlIGR1cGxpY2F0 ZQoJICogc2Nhbl9jbGF1c2VzIGFmdGVyIHN0cmlwcGluZyB0aGUgUmVzdHJpY3RJbmZvcy4g IEluIHRoaXMgc2l0dWF0aW9uLAoJICogYmVjYXVzZSB0aGUgdGlkcXVhbHMgcmVwcmVzZW50 IE9SIHN1Yi1jbGF1c2VzLCB0aGV5IGNvdWxkIG5vdCBoYXZlIGNvbWUKCSAqIGZyb20gRXF1 aXZhbGVuY2VDbGFzc2VzIHNvIHdlIGRvbid0IGhhdmUgdG8gd29ycnkgYWJvdXQgbWF0Y2hp bmcgdXAKCSAqIG5vbi1pZGVudGljYWwgY2xhdXNlcy4gIE9uIHRoZSBvdGhlciBoYW5kLCBi ZWNhdXNlIHRpZHBhdGguYyB3aWxsIGhhdmUKCSAqIGV4dHJhY3RlZCB0aG9zZSBzdWItY2xh dXNlcyBmcm9tIHNvbWUgT1IgY2xhdXNlIGFuZCBidWlsdCBpdHMgb3duIGxpc3QsCgkgKiB3 ZSB3aWxsIGNlcnRhaW5seSBub3QgaGF2ZSBwb2ludGVyIGVxdWFsaXR5IHRvIGFueSBzY2Fu IGNsYXVzZS4gIFNvCgkgKiBjb252ZXJ0IHRoZSB0aWRxdWFscyBsaXN0IHRvIGFuIGV4cGxp Y2l0IE9SIGNsYXVzZSBhbmQgc2VlIGlmIHdlIGNhbgoJICogbWF0Y2ggaXQgdmlhIGVxdWFs KCkgdG8gYW55IHNjYW4gY2xhdXNlLgoJICovCglpZiAobGlzdF9sZW5ndGgodGlkcXVhbHMp ID4gMSkKCQlzY2FuX2NsYXVzZXMgPSBsaXN0X2RpZmZlcmVuY2Uoc2Nhbl9jbGF1c2VzLAoJ CQkJCQkJCQkgICBsaXN0X21ha2UxKG1ha2Vfb3JjbGF1c2UodGlkcXVhbHMpKSk7CgoJLyog UmVwbGFjZSBhbnkgb3V0ZXItcmVsYXRpb24gdmFyaWFibGVzIHdpdGggbmVzdGxvb3AgcGFy YW1zICovCglpZiAoYmVzdF9wYXRoLT5wYXRoLnBhcmFtX2luZm8pCgl7CgkJdGlkcXVhbHMg PSAoTGlzdCAqKQoJCQlyZXBsYWNlX25lc3Rsb29wX3BhcmFtcyhyb290LCAoTm9kZSAqKSB0 aWRxdWFscyk7CgkJc2Nhbl9jbGF1c2VzID0gKExpc3QgKikKCQkJcmVwbGFjZV9uZXN0bG9v cF9wYXJhbXMocm9vdCwgKE5vZGUgKikgc2Nhbl9jbGF1c2VzKTsKCX0KCglzY2FuX3BsYW4g PSBtYWtlX3RpZHNjYW4odGxpc3QsCgkJCQkJCQkgc2Nhbl9jbGF1c2VzLAoJCQkJCQkJIHNj YW5fcmVsaWQsCgkJCQkJCQkgdGlkcXVhbHMpOwoKCWNvcHlfZ2VuZXJpY19wYXRoX2luZm8o JnNjYW5fcGxhbi0+c2Nhbi5wbGFuLCAmYmVzdF9wYXRoLT5wYXRoKTsKCglyZXR1cm4gc2Nh bl9wbGFuOwp9CgovKgogKiBjcmVhdGVfdGlkcmFuZ2VzY2FuX3BsYW4KICoJIFJldHVybnMg YSB0aWRyYW5nZXNjYW4gcGxhbiBmb3IgdGhlIGJhc2UgcmVsYXRpb24gc2Nhbm5lZCBieSAn YmVzdF9wYXRoJwogKgkgd2l0aCByZXN0cmljdGlvbiBjbGF1c2VzICdzY2FuX2NsYXVzZXMn IGFuZCB0YXJnZXRsaXN0ICd0bGlzdCcuCiAqLwpzdGF0aWMgVGlkUmFuZ2VTY2FuICoKY3Jl YXRlX3RpZHJhbmdlc2Nhbl9wbGFuKFBsYW5uZXJJbmZvICpyb290LCBUaWRSYW5nZVBhdGgg KmJlc3RfcGF0aCwKCQkJCQkJIExpc3QgKnRsaXN0LCBMaXN0ICpzY2FuX2NsYXVzZXMpCnsK CVRpZFJhbmdlU2NhbiAqc2Nhbl9wbGFuOwoJSW5kZXgJCXNjYW5fcmVsaWQgPSBiZXN0X3Bh dGgtPnBhdGgucGFyZW50LT5yZWxpZDsKCUxpc3QJICAgKnRpZHJhbmdlcXVhbHMgPSBiZXN0 X3BhdGgtPnRpZHJhbmdlcXVhbHM7CgoJLyogaXQgc2hvdWxkIGJlIGEgYmFzZSByZWwuLi4g Ki8KCUFzc2VydChzY2FuX3JlbGlkID4gMCk7CglBc3NlcnQoYmVzdF9wYXRoLT5wYXRoLnBh cmVudC0+cnRla2luZCA9PSBSVEVfUkVMQVRJT04pOwoKCS8qCgkgKiBUaGUgcXBxdWFsIGxp c3QgbXVzdCBjb250YWluIGFsbCByZXN0cmljdGlvbnMgbm90IGVuZm9yY2VkIGJ5IHRoZQoJ ICogdGlkcmFuZ2VxdWFscyBsaXN0LiAgdGlkcmFuZ2VxdWFscyBoYXMgQU5EIHNlbWFudGlj cywgc28gd2UgY2FuIHNpbXBseQoJICogcmVtb3ZlIGFueSBxdWFsIHRoYXQgYXBwZWFycyBp biBpdC4KCSAqLwoJewoJCUxpc3QJICAgKnFwcXVhbCA9IE5JTDsKCQlMaXN0Q2VsbCAgICps OwoKCQlmb3JlYWNoKGwsIHNjYW5fY2xhdXNlcykKCQl7CgkJCVJlc3RyaWN0SW5mbyAqcmlu Zm8gPSBsZmlyc3Rfbm9kZShSZXN0cmljdEluZm8sIGwpOwoKCQkJaWYgKHJpbmZvLT5wc2V1 ZG9jb25zdGFudCkKCQkJCWNvbnRpbnVlOwkJLyogd2UgbWF5IGRyb3AgcHNldWRvY29uc3Rh bnRzIGhlcmUgKi8KCQkJaWYgKGxpc3RfbWVtYmVyX3B0cih0aWRyYW5nZXF1YWxzLCByaW5m bykpCgkJCQljb250aW51ZTsJCS8qIHNpbXBsZSBkdXBsaWNhdGUgKi8KCQkJcXBxdWFsID0g bGFwcGVuZChxcHF1YWwsIHJpbmZvKTsKCQl9CgkJc2Nhbl9jbGF1c2VzID0gcXBxdWFsOwoJ fQoKCS8qIFNvcnQgY2xhdXNlcyBpbnRvIGJlc3QgZXhlY3V0aW9uIG9yZGVyICovCglzY2Fu X2NsYXVzZXMgPSBvcmRlcl9xdWFsX2NsYXVzZXMocm9vdCwgc2Nhbl9jbGF1c2VzKTsKCgkv KiBSZWR1Y2UgUmVzdHJpY3RJbmZvIGxpc3RzIHRvIGJhcmUgZXhwcmVzc2lvbnM7IGlnbm9y ZSBwc2V1ZG9jb25zdGFudHMgKi8KCXRpZHJhbmdlcXVhbHMgPSBleHRyYWN0X2FjdHVhbF9j bGF1c2VzKHRpZHJhbmdlcXVhbHMsIGZhbHNlKTsKCXNjYW5fY2xhdXNlcyA9IGV4dHJhY3Rf YWN0dWFsX2NsYXVzZXMoc2Nhbl9jbGF1c2VzLCBmYWxzZSk7CgoJLyogUmVwbGFjZSBhbnkg b3V0ZXItcmVsYXRpb24gdmFyaWFibGVzIHdpdGggbmVzdGxvb3AgcGFyYW1zICovCglpZiAo YmVzdF9wYXRoLT5wYXRoLnBhcmFtX2luZm8pCgl7CgkJdGlkcmFuZ2VxdWFscyA9IChMaXN0 ICopCgkJCXJlcGxhY2VfbmVzdGxvb3BfcGFyYW1zKHJvb3QsIChOb2RlICopIHRpZHJhbmdl cXVhbHMpOwoJCXNjYW5fY2xhdXNlcyA9IChMaXN0ICopCgkJCXJlcGxhY2VfbmVzdGxvb3Bf cGFyYW1zKHJvb3QsIChOb2RlICopIHNjYW5fY2xhdXNlcyk7Cgl9CgoJc2Nhbl9wbGFuID0g bWFrZV90aWRyYW5nZXNjYW4odGxpc3QsCgkJCQkJCQkJICBzY2FuX2NsYXVzZXMsCgkJCQkJ CQkJICBzY2FuX3JlbGlkLAoJCQkJCQkJCSAgdGlkcmFuZ2VxdWFscyk7CgoJY29weV9nZW5l cmljX3BhdGhfaW5mbygmc2Nhbl9wbGFuLT5zY2FuLnBsYW4sICZiZXN0X3BhdGgtPnBhdGgp OwoKCXJldHVybiBzY2FuX3BsYW47Cn0KCi8qCiAqIGNyZWF0ZV9zdWJxdWVyeXNjYW5fcGxh bgogKgkgUmV0dXJucyBhIHN1YnF1ZXJ5c2NhbiBwbGFuIGZvciB0aGUgYmFzZSByZWxhdGlv biBzY2FubmVkIGJ5ICdiZXN0X3BhdGgnCiAqCSB3aXRoIHJlc3RyaWN0aW9uIGNsYXVzZXMg J3NjYW5fY2xhdXNlcycgYW5kIHRhcmdldGxpc3QgJ3RsaXN0Jy4KICovCnN0YXRpYyBTdWJx dWVyeVNjYW4gKgpjcmVhdGVfc3VicXVlcnlzY2FuX3BsYW4oUGxhbm5lckluZm8gKnJvb3Qs IFN1YnF1ZXJ5U2NhblBhdGggKmJlc3RfcGF0aCwKCQkJCQkJIExpc3QgKnRsaXN0LCBMaXN0 ICpzY2FuX2NsYXVzZXMpCnsKCVN1YnF1ZXJ5U2NhbiAqc2Nhbl9wbGFuOwoJUmVsT3B0SW5m byAqcmVsID0gYmVzdF9wYXRoLT5wYXRoLnBhcmVudDsKCUluZGV4CQlzY2FuX3JlbGlkID0g cmVsLT5yZWxpZDsKCVBsYW4JICAgKnN1YnBsYW47CgoJLyogaXQgc2hvdWxkIGJlIGEgc3Vi cXVlcnkgYmFzZSByZWwuLi4gKi8KCUFzc2VydChzY2FuX3JlbGlkID4gMCk7CglBc3NlcnQo cmVsLT5ydGVraW5kID09IFJURV9TVUJRVUVSWSk7CgoJLyoKCSAqIFJlY3Vyc2l2ZWx5IGNy ZWF0ZSBQbGFuIGZyb20gUGF0aCBmb3Igc3VicXVlcnkuICBTaW5jZSB3ZSBhcmUgZW50ZXJp bmcKCSAqIGEgZGlmZmVyZW50IHBsYW5uZXIgY29udGV4dCAoc3Vicm9vdCksIHJlY3Vyc2Ug dG8gY3JlYXRlX3BsYW4gbm90CgkgKiBjcmVhdGVfcGxhbl9yZWN1cnNlLgoJICovCglzdWJw bGFuID0gY3JlYXRlX3BsYW4ocmVsLT5zdWJyb290LCBiZXN0X3BhdGgtPnN1YnBhdGgpOwoK CS8qIFNvcnQgY2xhdXNlcyBpbnRvIGJlc3QgZXhlY3V0aW9uIG9yZGVyICovCglzY2FuX2Ns YXVzZXMgPSBvcmRlcl9xdWFsX2NsYXVzZXMocm9vdCwgc2Nhbl9jbGF1c2VzKTsKCgkvKiBS ZWR1Y2UgUmVzdHJpY3RJbmZvIGxpc3QgdG8gYmFyZSBleHByZXNzaW9uczsgaWdub3JlIHBz ZXVkb2NvbnN0YW50cyAqLwoJc2Nhbl9jbGF1c2VzID0gZXh0cmFjdF9hY3R1YWxfY2xhdXNl cyhzY2FuX2NsYXVzZXMsIGZhbHNlKTsKCgkvKgoJICogUmVwbGFjZSBhbnkgb3V0ZXItcmVs YXRpb24gdmFyaWFibGVzIHdpdGggbmVzdGxvb3AgcGFyYW1zLgoJICoKCSAqIFdlIG11c3Qg cHJvdmlkZSBuZXN0bG9vcCBwYXJhbXMgZm9yIGJvdGggbGF0ZXJhbCByZWZlcmVuY2VzIG9m IHRoZQoJICogc3VicXVlcnkgYW5kIG91dGVyIHZhcnMgaW4gdGhlIHNjYW5fY2xhdXNlcy4g IEl0J3MgYmV0dGVyIHRvIGFzc2lnbiB0aGUKCSAqIGZvcm1lciBmaXJzdCwgYmVjYXVzZSB0 aGF0IGNvZGUgcGF0aCByZXF1aXJlcyBzcGVjaWZpYyBwYXJhbSBJRHMsIHdoaWxlCgkgKiBy ZXBsYWNlX25lc3Rsb29wX3BhcmFtcyBjYW4gYWRhcHQgdG8gdGhlIElEcyBhc3NpZ25lZCBi eQoJICogcHJvY2Vzc19zdWJxdWVyeV9uZXN0bG9vcF9wYXJhbXMuICBUaGlzIGF2b2lkcyBw b3NzaWJseSBkdXBsaWNhdGluZwoJICogbmVzdGxvb3AgcGFyYW1zIHdoZW4gdGhlIHNhbWUg VmFyIGlzIG5lZWRlZCBmb3IgYm90aCByZWFzb25zLgoJICovCglpZiAoYmVzdF9wYXRoLT5w YXRoLnBhcmFtX2luZm8pCgl7CgkJcHJvY2Vzc19zdWJxdWVyeV9uZXN0bG9vcF9wYXJhbXMo cm9vdCwKCQkJCQkJCQkJCSByZWwtPnN1YnBsYW5fcGFyYW1zKTsKCQlzY2FuX2NsYXVzZXMg PSAoTGlzdCAqKQoJCQlyZXBsYWNlX25lc3Rsb29wX3BhcmFtcyhyb290LCAoTm9kZSAqKSBz Y2FuX2NsYXVzZXMpOwoJfQoKCXNjYW5fcGxhbiA9IG1ha2Vfc3VicXVlcnlzY2FuKHRsaXN0 LAoJCQkJCQkJCSAgc2Nhbl9jbGF1c2VzLAoJCQkJCQkJCSAgc2Nhbl9yZWxpZCwKCQkJCQkJ CQkgIHN1YnBsYW4pOwoKCWNvcHlfZ2VuZXJpY19wYXRoX2luZm8oJnNjYW5fcGxhbi0+c2Nh bi5wbGFuLCAmYmVzdF9wYXRoLT5wYXRoKTsKCglyZXR1cm4gc2Nhbl9wbGFuOwp9CgovKgog KiBjcmVhdGVfZnVuY3Rpb25zY2FuX3BsYW4KICoJIFJldHVybnMgYSBmdW5jdGlvbnNjYW4g cGxhbiBmb3IgdGhlIGJhc2UgcmVsYXRpb24gc2Nhbm5lZCBieSAnYmVzdF9wYXRoJwogKgkg d2l0aCByZXN0cmljdGlvbiBjbGF1c2VzICdzY2FuX2NsYXVzZXMnIGFuZCB0YXJnZXRsaXN0 ICd0bGlzdCcuCiAqLwpzdGF0aWMgRnVuY3Rpb25TY2FuICoKY3JlYXRlX2Z1bmN0aW9uc2Nh bl9wbGFuKFBsYW5uZXJJbmZvICpyb290LCBQYXRoICpiZXN0X3BhdGgsCgkJCQkJCSBMaXN0 ICp0bGlzdCwgTGlzdCAqc2Nhbl9jbGF1c2VzKQp7CglGdW5jdGlvblNjYW4gKnNjYW5fcGxh bjsKCUluZGV4CQlzY2FuX3JlbGlkID0gYmVzdF9wYXRoLT5wYXJlbnQtPnJlbGlkOwoJUmFu Z2VUYmxFbnRyeSAqcnRlOwoJTGlzdAkgICAqZnVuY3Rpb25zOwoKCS8qIGl0IHNob3VsZCBi ZSBhIGZ1bmN0aW9uIGJhc2UgcmVsLi4uICovCglBc3NlcnQoc2Nhbl9yZWxpZCA+IDApOwoJ cnRlID0gcGxhbm5lcl9ydF9mZXRjaChzY2FuX3JlbGlkLCByb290KTsKCUFzc2VydChydGUt PnJ0ZWtpbmQgPT0gUlRFX0ZVTkNUSU9OKTsKCWZ1bmN0aW9ucyA9IHJ0ZS0+ZnVuY3Rpb25z OwoKCS8qIFNvcnQgY2xhdXNlcyBpbnRvIGJlc3QgZXhlY3V0aW9uIG9yZGVyICovCglzY2Fu X2NsYXVzZXMgPSBvcmRlcl9xdWFsX2NsYXVzZXMocm9vdCwgc2Nhbl9jbGF1c2VzKTsKCgkv KiBSZWR1Y2UgUmVzdHJpY3RJbmZvIGxpc3QgdG8gYmFyZSBleHByZXNzaW9uczsgaWdub3Jl IHBzZXVkb2NvbnN0YW50cyAqLwoJc2Nhbl9jbGF1c2VzID0gZXh0cmFjdF9hY3R1YWxfY2xh dXNlcyhzY2FuX2NsYXVzZXMsIGZhbHNlKTsKCgkvKiBSZXBsYWNlIGFueSBvdXRlci1yZWxh dGlvbiB2YXJpYWJsZXMgd2l0aCBuZXN0bG9vcCBwYXJhbXMgKi8KCWlmIChiZXN0X3BhdGgt PnBhcmFtX2luZm8pCgl7CgkJc2Nhbl9jbGF1c2VzID0gKExpc3QgKikKCQkJcmVwbGFjZV9u ZXN0bG9vcF9wYXJhbXMocm9vdCwgKE5vZGUgKikgc2Nhbl9jbGF1c2VzKTsKCQkvKiBUaGUg ZnVuY3Rpb24gZXhwcmVzc2lvbnMgY291bGQgY29udGFpbiBuZXN0bG9vcCBwYXJhbXMsIHRv byAqLwoJCWZ1bmN0aW9ucyA9IChMaXN0ICopIHJlcGxhY2VfbmVzdGxvb3BfcGFyYW1zKHJv b3QsIChOb2RlICopIGZ1bmN0aW9ucyk7Cgl9CgoJc2Nhbl9wbGFuID0gbWFrZV9mdW5jdGlv bnNjYW4odGxpc3QsIHNjYW5fY2xhdXNlcywgc2Nhbl9yZWxpZCwKCQkJCQkJCQkgIGZ1bmN0 aW9ucywgcnRlLT5mdW5jb3JkaW5hbGl0eSk7CgoJY29weV9nZW5lcmljX3BhdGhfaW5mbygm c2Nhbl9wbGFuLT5zY2FuLnBsYW4sIGJlc3RfcGF0aCk7CgoJcmV0dXJuIHNjYW5fcGxhbjsK fQoKLyoKICogY3JlYXRlX3RhYmxlZnVuY3NjYW5fcGxhbgogKgkgUmV0dXJucyBhIHRhYmxl ZnVuY3NjYW4gcGxhbiBmb3IgdGhlIGJhc2UgcmVsYXRpb24gc2Nhbm5lZCBieSAnYmVzdF9w YXRoJwogKgkgd2l0aCByZXN0cmljdGlvbiBjbGF1c2VzICdzY2FuX2NsYXVzZXMnIGFuZCB0 YXJnZXRsaXN0ICd0bGlzdCcuCiAqLwpzdGF0aWMgVGFibGVGdW5jU2NhbiAqCmNyZWF0ZV90 YWJsZWZ1bmNzY2FuX3BsYW4oUGxhbm5lckluZm8gKnJvb3QsIFBhdGggKmJlc3RfcGF0aCwK CQkJCQkJICBMaXN0ICp0bGlzdCwgTGlzdCAqc2Nhbl9jbGF1c2VzKQp7CglUYWJsZUZ1bmNT Y2FuICpzY2FuX3BsYW47CglJbmRleAkJc2Nhbl9yZWxpZCA9IGJlc3RfcGF0aC0+cGFyZW50 LT5yZWxpZDsKCVJhbmdlVGJsRW50cnkgKnJ0ZTsKCVRhYmxlRnVuYyAgKnRhYmxlZnVuYzsK CgkvKiBpdCBzaG91bGQgYmUgYSBmdW5jdGlvbiBiYXNlIHJlbC4uLiAqLwoJQXNzZXJ0KHNj YW5fcmVsaWQgPiAwKTsKCXJ0ZSA9IHBsYW5uZXJfcnRfZmV0Y2goc2Nhbl9yZWxpZCwgcm9v dCk7CglBc3NlcnQocnRlLT5ydGVraW5kID09IFJURV9UQUJMRUZVTkMpOwoJdGFibGVmdW5j ID0gcnRlLT50YWJsZWZ1bmM7CgoJLyogU29ydCBjbGF1c2VzIGludG8gYmVzdCBleGVjdXRp b24gb3JkZXIgKi8KCXNjYW5fY2xhdXNlcyA9IG9yZGVyX3F1YWxfY2xhdXNlcyhyb290LCBz Y2FuX2NsYXVzZXMpOwoKCS8qIFJlZHVjZSBSZXN0cmljdEluZm8gbGlzdCB0byBiYXJlIGV4 cHJlc3Npb25zOyBpZ25vcmUgcHNldWRvY29uc3RhbnRzICovCglzY2FuX2NsYXVzZXMgPSBl eHRyYWN0X2FjdHVhbF9jbGF1c2VzKHNjYW5fY2xhdXNlcywgZmFsc2UpOwoKCS8qIFJlcGxh Y2UgYW55IG91dGVyLXJlbGF0aW9uIHZhcmlhYmxlcyB3aXRoIG5lc3Rsb29wIHBhcmFtcyAq LwoJaWYgKGJlc3RfcGF0aC0+cGFyYW1faW5mbykKCXsKCQlzY2FuX2NsYXVzZXMgPSAoTGlz dCAqKQoJCQlyZXBsYWNlX25lc3Rsb29wX3BhcmFtcyhyb290LCAoTm9kZSAqKSBzY2FuX2Ns YXVzZXMpOwoJCS8qIFRoZSBmdW5jdGlvbiBleHByZXNzaW9ucyBjb3VsZCBjb250YWluIG5l c3Rsb29wIHBhcmFtcywgdG9vICovCgkJdGFibGVmdW5jID0gKFRhYmxlRnVuYyAqKSByZXBs YWNlX25lc3Rsb29wX3BhcmFtcyhyb290LCAoTm9kZSAqKSB0YWJsZWZ1bmMpOwoJfQoKCXNj YW5fcGxhbiA9IG1ha2VfdGFibGVmdW5jc2Nhbih0bGlzdCwgc2Nhbl9jbGF1c2VzLCBzY2Fu X3JlbGlkLAoJCQkJCQkJCSAgIHRhYmxlZnVuYyk7CgoJY29weV9nZW5lcmljX3BhdGhfaW5m bygmc2Nhbl9wbGFuLT5zY2FuLnBsYW4sIGJlc3RfcGF0aCk7CgoJcmV0dXJuIHNjYW5fcGxh bjsKfQoKLyoKICogY3JlYXRlX3ZhbHVlc3NjYW5fcGxhbgogKgkgUmV0dXJucyBhIHZhbHVl c3NjYW4gcGxhbiBmb3IgdGhlIGJhc2UgcmVsYXRpb24gc2Nhbm5lZCBieSAnYmVzdF9wYXRo JwogKgkgd2l0aCByZXN0cmljdGlvbiBjbGF1c2VzICdzY2FuX2NsYXVzZXMnIGFuZCB0YXJn ZXRsaXN0ICd0bGlzdCcuCiAqLwpzdGF0aWMgVmFsdWVzU2NhbiAqCmNyZWF0ZV92YWx1ZXNz Y2FuX3BsYW4oUGxhbm5lckluZm8gKnJvb3QsIFBhdGggKmJlc3RfcGF0aCwKCQkJCQkgICBM aXN0ICp0bGlzdCwgTGlzdCAqc2Nhbl9jbGF1c2VzKQp7CglWYWx1ZXNTY2FuICpzY2FuX3Bs YW47CglJbmRleAkJc2Nhbl9yZWxpZCA9IGJlc3RfcGF0aC0+cGFyZW50LT5yZWxpZDsKCVJh bmdlVGJsRW50cnkgKnJ0ZTsKCUxpc3QJICAgKnZhbHVlc19saXN0czsKCgkvKiBpdCBzaG91 bGQgYmUgYSB2YWx1ZXMgYmFzZSByZWwuLi4gKi8KCUFzc2VydChzY2FuX3JlbGlkID4gMCk7 CglydGUgPSBwbGFubmVyX3J0X2ZldGNoKHNjYW5fcmVsaWQsIHJvb3QpOwoJQXNzZXJ0KHJ0 ZS0+cnRla2luZCA9PSBSVEVfVkFMVUVTKTsKCXZhbHVlc19saXN0cyA9IHJ0ZS0+dmFsdWVz X2xpc3RzOwoKCS8qIFNvcnQgY2xhdXNlcyBpbnRvIGJlc3QgZXhlY3V0aW9uIG9yZGVyICov CglzY2FuX2NsYXVzZXMgPSBvcmRlcl9xdWFsX2NsYXVzZXMocm9vdCwgc2Nhbl9jbGF1c2Vz KTsKCgkvKiBSZWR1Y2UgUmVzdHJpY3RJbmZvIGxpc3QgdG8gYmFyZSBleHByZXNzaW9uczsg aWdub3JlIHBzZXVkb2NvbnN0YW50cyAqLwoJc2Nhbl9jbGF1c2VzID0gZXh0cmFjdF9hY3R1 YWxfY2xhdXNlcyhzY2FuX2NsYXVzZXMsIGZhbHNlKTsKCgkvKiBSZXBsYWNlIGFueSBvdXRl ci1yZWxhdGlvbiB2YXJpYWJsZXMgd2l0aCBuZXN0bG9vcCBwYXJhbXMgKi8KCWlmIChiZXN0 X3BhdGgtPnBhcmFtX2luZm8pCgl7CgkJc2Nhbl9jbGF1c2VzID0gKExpc3QgKikKCQkJcmVw bGFjZV9uZXN0bG9vcF9wYXJhbXMocm9vdCwgKE5vZGUgKikgc2Nhbl9jbGF1c2VzKTsKCQkv KiBUaGUgdmFsdWVzIGxpc3RzIGNvdWxkIGNvbnRhaW4gbmVzdGxvb3AgcGFyYW1zLCB0b28g Ki8KCQl2YWx1ZXNfbGlzdHMgPSAoTGlzdCAqKQoJCQlyZXBsYWNlX25lc3Rsb29wX3BhcmFt cyhyb290LCAoTm9kZSAqKSB2YWx1ZXNfbGlzdHMpOwoJfQoKCXNjYW5fcGxhbiA9IG1ha2Vf dmFsdWVzc2Nhbih0bGlzdCwgc2Nhbl9jbGF1c2VzLCBzY2FuX3JlbGlkLAoJCQkJCQkJCXZh bHVlc19saXN0cyk7CgoJY29weV9nZW5lcmljX3BhdGhfaW5mbygmc2Nhbl9wbGFuLT5zY2Fu LnBsYW4sIGJlc3RfcGF0aCk7CgoJcmV0dXJuIHNjYW5fcGxhbjsKfQoKLyoKICogY3JlYXRl X2N0ZXNjYW5fcGxhbgogKgkgUmV0dXJucyBhIGN0ZXNjYW4gcGxhbiBmb3IgdGhlIGJhc2Ug cmVsYXRpb24gc2Nhbm5lZCBieSAnYmVzdF9wYXRoJwogKgkgd2l0aCByZXN0cmljdGlvbiBj bGF1c2VzICdzY2FuX2NsYXVzZXMnIGFuZCB0YXJnZXRsaXN0ICd0bGlzdCcuCiAqLwpzdGF0 aWMgQ3RlU2NhbiAqCmNyZWF0ZV9jdGVzY2FuX3BsYW4oUGxhbm5lckluZm8gKnJvb3QsIFBh dGggKmJlc3RfcGF0aCwKCQkJCQlMaXN0ICp0bGlzdCwgTGlzdCAqc2Nhbl9jbGF1c2VzKQp7 CglDdGVTY2FuICAgICpzY2FuX3BsYW47CglJbmRleAkJc2Nhbl9yZWxpZCA9IGJlc3RfcGF0 aC0+cGFyZW50LT5yZWxpZDsKCVJhbmdlVGJsRW50cnkgKnJ0ZTsKCVN1YlBsYW4gICAgKmN0 ZXNwbGFuID0gTlVMTDsKCWludAkJCXBsYW5faWQ7CglpbnQJCQljdGVfcGFyYW1faWQ7CglQ bGFubmVySW5mbyAqY3Rlcm9vdDsKCUluZGV4CQlsZXZlbHN1cDsKCWludAkJCW5keDsKCUxp c3RDZWxsICAgKmxjOwoKCUFzc2VydChzY2FuX3JlbGlkID4gMCk7CglydGUgPSBwbGFubmVy X3J0X2ZldGNoKHNjYW5fcmVsaWQsIHJvb3QpOwoJQXNzZXJ0KHJ0ZS0+cnRla2luZCA9PSBS VEVfQ1RFKTsKCUFzc2VydCghcnRlLT5zZWxmX3JlZmVyZW5jZSk7CgoJLyoKCSAqIEZpbmQg dGhlIHJlZmVyZW5jZWQgQ1RFLCBhbmQgbG9jYXRlIHRoZSBTdWJQbGFuIHByZXZpb3VzbHkg bWFkZSBmb3IgaXQuCgkgKi8KCWxldmVsc3VwID0gcnRlLT5jdGVsZXZlbHN1cDsKCWN0ZXJv b3QgPSByb290OwoJd2hpbGUgKGxldmVsc3VwLS0gPiAwKQoJewoJCWN0ZXJvb3QgPSBjdGVy b290LT5wYXJlbnRfcm9vdDsKCQlpZiAoIWN0ZXJvb3QpCQkJLyogc2hvdWxkbid0IGhhcHBl biAqLwoJCQllbG9nKEVSUk9SLCAiYmFkIGxldmVsc3VwIGZvciBDVEUgXCIlc1wiIiwgcnRl LT5jdGVuYW1lKTsKCX0KCgkvKgoJICogTm90ZTogY3RlX3BsYW5faWRzIGNhbiBiZSBzaG9y dGVyIHRoYW4gY3RlTGlzdCwgaWYgd2UgYXJlIHN0aWxsIHdvcmtpbmcKCSAqIG9uIHBsYW5u aW5nIHRoZSBDVEVzIChpZSwgdGhpcyBpcyBhIHNpZGUtcmVmZXJlbmNlIGZyb20gYW5vdGhl ciBDVEUpLgoJICogU28gd2UgbXVzdG4ndCB1c2UgZm9yYm90aCBoZXJlLgoJICovCgluZHgg PSAwOwoJZm9yZWFjaChsYywgY3Rlcm9vdC0+cGFyc2UtPmN0ZUxpc3QpCgl7CgkJQ29tbW9u VGFibGVFeHByICpjdGUgPSAoQ29tbW9uVGFibGVFeHByICopIGxmaXJzdChsYyk7CgoJCWlm IChzdHJjbXAoY3RlLT5jdGVuYW1lLCBydGUtPmN0ZW5hbWUpID09IDApCgkJCWJyZWFrOwoJ CW5keCsrOwoJfQoJaWYgKGxjID09IE5VTEwpCQkJCS8qIHNob3VsZG4ndCBoYXBwZW4gKi8K CQllbG9nKEVSUk9SLCAiY291bGQgbm90IGZpbmQgQ1RFIFwiJXNcIiIsIHJ0ZS0+Y3RlbmFt ZSk7CglpZiAobmR4ID49IGxpc3RfbGVuZ3RoKGN0ZXJvb3QtPmN0ZV9wbGFuX2lkcykpCgkJ ZWxvZyhFUlJPUiwgImNvdWxkIG5vdCBmaW5kIHBsYW4gZm9yIENURSBcIiVzXCIiLCBydGUt PmN0ZW5hbWUpOwoJcGxhbl9pZCA9IGxpc3RfbnRoX2ludChjdGVyb290LT5jdGVfcGxhbl9p ZHMsIG5keCk7CglpZiAocGxhbl9pZCA8PSAwKQoJCWVsb2coRVJST1IsICJubyBwbGFuIHdh cyBtYWRlIGZvciBDVEUgXCIlc1wiIiwgcnRlLT5jdGVuYW1lKTsKCWZvcmVhY2gobGMsIGN0 ZXJvb3QtPmluaXRfcGxhbnMpCgl7CgkJY3Rlc3BsYW4gPSAoU3ViUGxhbiAqKSBsZmlyc3Qo bGMpOwoJCWlmIChjdGVzcGxhbi0+cGxhbl9pZCA9PSBwbGFuX2lkKQoJCQlicmVhazsKCX0K CWlmIChsYyA9PSBOVUxMKQkJCQkvKiBzaG91bGRuJ3QgaGFwcGVuICovCgkJZWxvZyhFUlJP UiwgImNvdWxkIG5vdCBmaW5kIHBsYW4gZm9yIENURSBcIiVzXCIiLCBydGUtPmN0ZW5hbWUp OwoKCS8qCgkgKiBXZSBuZWVkIHRoZSBDVEUgcGFyYW0gSUQsIHdoaWNoIGlzIHRoZSBzb2xl IG1lbWJlciBvZiB0aGUgU3ViUGxhbidzCgkgKiBzZXRQYXJhbSBsaXN0LgoJICovCgljdGVf cGFyYW1faWQgPSBsaW5pdGlhbF9pbnQoY3Rlc3BsYW4tPnNldFBhcmFtKTsKCgkvKiBTb3J0 IGNsYXVzZXMgaW50byBiZXN0IGV4ZWN1dGlvbiBvcmRlciAqLwoJc2Nhbl9jbGF1c2VzID0g b3JkZXJfcXVhbF9jbGF1c2VzKHJvb3QsIHNjYW5fY2xhdXNlcyk7CgoJLyogUmVkdWNlIFJl c3RyaWN0SW5mbyBsaXN0IHRvIGJhcmUgZXhwcmVzc2lvbnM7IGlnbm9yZSBwc2V1ZG9jb25z dGFudHMgKi8KCXNjYW5fY2xhdXNlcyA9IGV4dHJhY3RfYWN0dWFsX2NsYXVzZXMoc2Nhbl9j bGF1c2VzLCBmYWxzZSk7CgoJLyogUmVwbGFjZSBhbnkgb3V0ZXItcmVsYXRpb24gdmFyaWFi bGVzIHdpdGggbmVzdGxvb3AgcGFyYW1zICovCglpZiAoYmVzdF9wYXRoLT5wYXJhbV9pbmZv KQoJewoJCXNjYW5fY2xhdXNlcyA9IChMaXN0ICopCgkJCXJlcGxhY2VfbmVzdGxvb3BfcGFy YW1zKHJvb3QsIChOb2RlICopIHNjYW5fY2xhdXNlcyk7Cgl9CgoJc2Nhbl9wbGFuID0gbWFr ZV9jdGVzY2FuKHRsaXN0LCBzY2FuX2NsYXVzZXMsIHNjYW5fcmVsaWQsCgkJCQkJCQkgcGxh bl9pZCwgY3RlX3BhcmFtX2lkKTsKCgljb3B5X2dlbmVyaWNfcGF0aF9pbmZvKCZzY2FuX3Bs YW4tPnNjYW4ucGxhbiwgYmVzdF9wYXRoKTsKCglyZXR1cm4gc2Nhbl9wbGFuOwp9CgovKgog KiBjcmVhdGVfbmFtZWR0dXBsZXN0b3Jlc2Nhbl9wbGFuCiAqCSBSZXR1cm5zIGEgdHVwbGVz dG9yZXNjYW4gcGxhbiBmb3IgdGhlIGJhc2UgcmVsYXRpb24gc2Nhbm5lZCBieQogKgknYmVz dF9wYXRoJyB3aXRoIHJlc3RyaWN0aW9uIGNsYXVzZXMgJ3NjYW5fY2xhdXNlcycgYW5kIHRh cmdldGxpc3QKICoJJ3RsaXN0Jy4KICovCnN0YXRpYyBOYW1lZFR1cGxlc3RvcmVTY2FuICoK Y3JlYXRlX25hbWVkdHVwbGVzdG9yZXNjYW5fcGxhbihQbGFubmVySW5mbyAqcm9vdCwgUGF0 aCAqYmVzdF9wYXRoLAoJCQkJCQkJCUxpc3QgKnRsaXN0LCBMaXN0ICpzY2FuX2NsYXVzZXMp CnsKCU5hbWVkVHVwbGVzdG9yZVNjYW4gKnNjYW5fcGxhbjsKCUluZGV4CQlzY2FuX3JlbGlk ID0gYmVzdF9wYXRoLT5wYXJlbnQtPnJlbGlkOwoJUmFuZ2VUYmxFbnRyeSAqcnRlOwoKCUFz c2VydChzY2FuX3JlbGlkID4gMCk7CglydGUgPSBwbGFubmVyX3J0X2ZldGNoKHNjYW5fcmVs aWQsIHJvb3QpOwoJQXNzZXJ0KHJ0ZS0+cnRla2luZCA9PSBSVEVfTkFNRURUVVBMRVNUT1JF KTsKCgkvKiBTb3J0IGNsYXVzZXMgaW50byBiZXN0IGV4ZWN1dGlvbiBvcmRlciAqLwoJc2Nh bl9jbGF1c2VzID0gb3JkZXJfcXVhbF9jbGF1c2VzKHJvb3QsIHNjYW5fY2xhdXNlcyk7CgoJ LyogUmVkdWNlIFJlc3RyaWN0SW5mbyBsaXN0IHRvIGJhcmUgZXhwcmVzc2lvbnM7IGlnbm9y ZSBwc2V1ZG9jb25zdGFudHMgKi8KCXNjYW5fY2xhdXNlcyA9IGV4dHJhY3RfYWN0dWFsX2Ns YXVzZXMoc2Nhbl9jbGF1c2VzLCBmYWxzZSk7CgoJLyogUmVwbGFjZSBhbnkgb3V0ZXItcmVs YXRpb24gdmFyaWFibGVzIHdpdGggbmVzdGxvb3AgcGFyYW1zICovCglpZiAoYmVzdF9wYXRo LT5wYXJhbV9pbmZvKQoJewoJCXNjYW5fY2xhdXNlcyA9IChMaXN0ICopCgkJCXJlcGxhY2Vf bmVzdGxvb3BfcGFyYW1zKHJvb3QsIChOb2RlICopIHNjYW5fY2xhdXNlcyk7Cgl9CgoJc2Nh bl9wbGFuID0gbWFrZV9uYW1lZHR1cGxlc3RvcmVzY2FuKHRsaXN0LCBzY2FuX2NsYXVzZXMs IHNjYW5fcmVsaWQsCgkJCQkJCQkJCQkgcnRlLT5lbnJuYW1lKTsKCgljb3B5X2dlbmVyaWNf cGF0aF9pbmZvKCZzY2FuX3BsYW4tPnNjYW4ucGxhbiwgYmVzdF9wYXRoKTsKCglyZXR1cm4g c2Nhbl9wbGFuOwp9CgovKgogKiBjcmVhdGVfcmVzdWx0c2Nhbl9wbGFuCiAqCSBSZXR1cm5z IGEgUmVzdWx0IHBsYW4gZm9yIHRoZSBSVEVfUkVTVUxUIGJhc2UgcmVsYXRpb24gc2Nhbm5l ZCBieQogKgknYmVzdF9wYXRoJyB3aXRoIHJlc3RyaWN0aW9uIGNsYXVzZXMgJ3NjYW5fY2xh dXNlcycgYW5kIHRhcmdldGxpc3QKICoJJ3RsaXN0Jy4KICovCnN0YXRpYyBSZXN1bHQgKgpj cmVhdGVfcmVzdWx0c2Nhbl9wbGFuKFBsYW5uZXJJbmZvICpyb290LCBQYXRoICpiZXN0X3Bh dGgsCgkJCQkJICAgTGlzdCAqdGxpc3QsIExpc3QgKnNjYW5fY2xhdXNlcykKewoJUmVzdWx0 CSAgICpzY2FuX3BsYW47CglJbmRleAkJc2Nhbl9yZWxpZCA9IGJlc3RfcGF0aC0+cGFyZW50 LT5yZWxpZDsKCVJhbmdlVGJsRW50cnkgKnJ0ZSBQR19VU0VEX0ZPUl9BU1NFUlRTX09OTFk7 CgoJQXNzZXJ0KHNjYW5fcmVsaWQgPiAwKTsKCXJ0ZSA9IHBsYW5uZXJfcnRfZmV0Y2goc2Nh bl9yZWxpZCwgcm9vdCk7CglBc3NlcnQocnRlLT5ydGVraW5kID09IFJURV9SRVNVTFQpOwoK CS8qIFNvcnQgY2xhdXNlcyBpbnRvIGJlc3QgZXhlY3V0aW9uIG9yZGVyICovCglzY2FuX2Ns YXVzZXMgPSBvcmRlcl9xdWFsX2NsYXVzZXMocm9vdCwgc2Nhbl9jbGF1c2VzKTsKCgkvKiBS ZWR1Y2UgUmVzdHJpY3RJbmZvIGxpc3QgdG8gYmFyZSBleHByZXNzaW9uczsgaWdub3JlIHBz ZXVkb2NvbnN0YW50cyAqLwoJc2Nhbl9jbGF1c2VzID0gZXh0cmFjdF9hY3R1YWxfY2xhdXNl cyhzY2FuX2NsYXVzZXMsIGZhbHNlKTsKCgkvKiBSZXBsYWNlIGFueSBvdXRlci1yZWxhdGlv biB2YXJpYWJsZXMgd2l0aCBuZXN0bG9vcCBwYXJhbXMgKi8KCWlmIChiZXN0X3BhdGgtPnBh cmFtX2luZm8pCgl7CgkJc2Nhbl9jbGF1c2VzID0gKExpc3QgKikKCQkJcmVwbGFjZV9uZXN0 bG9vcF9wYXJhbXMocm9vdCwgKE5vZGUgKikgc2Nhbl9jbGF1c2VzKTsKCX0KCglzY2FuX3Bs YW4gPSBtYWtlX29uZV9yb3dfcmVzdWx0KHRsaXN0LCAoTm9kZSAqKSBzY2FuX2NsYXVzZXMs CgkJCQkJCQkJCWJlc3RfcGF0aC0+cGFyZW50KTsKCgljb3B5X2dlbmVyaWNfcGF0aF9pbmZv KCZzY2FuX3BsYW4tPnBsYW4sIGJlc3RfcGF0aCk7CgoJcmV0dXJuIHNjYW5fcGxhbjsKfQoK LyoKICogY3JlYXRlX3dvcmt0YWJsZXNjYW5fcGxhbgogKgkgUmV0dXJucyBhIHdvcmt0YWJs ZXNjYW4gcGxhbiBmb3IgdGhlIGJhc2UgcmVsYXRpb24gc2Nhbm5lZCBieSAnYmVzdF9wYXRo JwogKgkgd2l0aCByZXN0cmljdGlvbiBjbGF1c2VzICdzY2FuX2NsYXVzZXMnIGFuZCB0YXJn ZXRsaXN0ICd0bGlzdCcuCiAqLwpzdGF0aWMgV29ya1RhYmxlU2NhbiAqCmNyZWF0ZV93b3Jr dGFibGVzY2FuX3BsYW4oUGxhbm5lckluZm8gKnJvb3QsIFBhdGggKmJlc3RfcGF0aCwKCQkJ CQkJICBMaXN0ICp0bGlzdCwgTGlzdCAqc2Nhbl9jbGF1c2VzKQp7CglXb3JrVGFibGVTY2Fu ICpzY2FuX3BsYW47CglJbmRleAkJc2Nhbl9yZWxpZCA9IGJlc3RfcGF0aC0+cGFyZW50LT5y ZWxpZDsKCVJhbmdlVGJsRW50cnkgKnJ0ZTsKCUluZGV4CQlsZXZlbHN1cDsKCVBsYW5uZXJJ bmZvICpjdGVyb290OwoKCUFzc2VydChzY2FuX3JlbGlkID4gMCk7CglydGUgPSBwbGFubmVy X3J0X2ZldGNoKHNjYW5fcmVsaWQsIHJvb3QpOwoJQXNzZXJ0KHJ0ZS0+cnRla2luZCA9PSBS VEVfQ1RFKTsKCUFzc2VydChydGUtPnNlbGZfcmVmZXJlbmNlKTsKCgkvKgoJICogV2UgbmVl ZCB0byBmaW5kIHRoZSB3b3JrdGFibGUgcGFyYW0gSUQsIHdoaWNoIGlzIGluIHRoZSBwbGFu IGxldmVsCgkgKiB0aGF0J3MgcHJvY2Vzc2luZyB0aGUgcmVjdXJzaXZlIFVOSU9OLCB3aGlj aCBpcyBvbmUgbGV2ZWwgKmJlbG93KiB3aGVyZQoJICogdGhlIENURSBjb21lcyBmcm9tLgoJ ICovCglsZXZlbHN1cCA9IHJ0ZS0+Y3RlbGV2ZWxzdXA7CglpZiAobGV2ZWxzdXAgPT0gMCkJ CQkvKiBzaG91bGRuJ3QgaGFwcGVuICovCgkJZWxvZyhFUlJPUiwgImJhZCBsZXZlbHN1cCBm b3IgQ1RFIFwiJXNcIiIsIHJ0ZS0+Y3RlbmFtZSk7CglsZXZlbHN1cC0tOwoJY3Rlcm9vdCA9 IHJvb3Q7Cgl3aGlsZSAobGV2ZWxzdXAtLSA+IDApCgl7CgkJY3Rlcm9vdCA9IGN0ZXJvb3Qt PnBhcmVudF9yb290OwoJCWlmICghY3Rlcm9vdCkJCQkvKiBzaG91bGRuJ3QgaGFwcGVuICov CgkJCWVsb2coRVJST1IsICJiYWQgbGV2ZWxzdXAgZm9yIENURSBcIiVzXCIiLCBydGUtPmN0 ZW5hbWUpOwoJfQoJaWYgKGN0ZXJvb3QtPnd0X3BhcmFtX2lkIDwgMCkJLyogc2hvdWxkbid0 IGhhcHBlbiAqLwoJCWVsb2coRVJST1IsICJjb3VsZCBub3QgZmluZCBwYXJhbSBJRCBmb3Ig Q1RFIFwiJXNcIiIsIHJ0ZS0+Y3RlbmFtZSk7CgoJLyogU29ydCBjbGF1c2VzIGludG8gYmVz dCBleGVjdXRpb24gb3JkZXIgKi8KCXNjYW5fY2xhdXNlcyA9IG9yZGVyX3F1YWxfY2xhdXNl cyhyb290LCBzY2FuX2NsYXVzZXMpOwoKCS8qIFJlZHVjZSBSZXN0cmljdEluZm8gbGlzdCB0 byBiYXJlIGV4cHJlc3Npb25zOyBpZ25vcmUgcHNldWRvY29uc3RhbnRzICovCglzY2FuX2Ns YXVzZXMgPSBleHRyYWN0X2FjdHVhbF9jbGF1c2VzKHNjYW5fY2xhdXNlcywgZmFsc2UpOwoK CS8qIFJlcGxhY2UgYW55IG91dGVyLXJlbGF0aW9uIHZhcmlhYmxlcyB3aXRoIG5lc3Rsb29w IHBhcmFtcyAqLwoJaWYgKGJlc3RfcGF0aC0+cGFyYW1faW5mbykKCXsKCQlzY2FuX2NsYXVz ZXMgPSAoTGlzdCAqKQoJCQlyZXBsYWNlX25lc3Rsb29wX3BhcmFtcyhyb290LCAoTm9kZSAq KSBzY2FuX2NsYXVzZXMpOwoJfQoKCXNjYW5fcGxhbiA9IG1ha2Vfd29ya3RhYmxlc2Nhbih0 bGlzdCwgc2Nhbl9jbGF1c2VzLCBzY2FuX3JlbGlkLAoJCQkJCQkJCSAgIGN0ZXJvb3QtPnd0 X3BhcmFtX2lkKTsKCgljb3B5X2dlbmVyaWNfcGF0aF9pbmZvKCZzY2FuX3BsYW4tPnNjYW4u cGxhbiwgYmVzdF9wYXRoKTsKCglyZXR1cm4gc2Nhbl9wbGFuOwp9CgovKgogKiBjcmVhdGVf Zm9yZWlnbnNjYW5fcGxhbgogKgkgUmV0dXJucyBhIGZvcmVpZ25zY2FuIHBsYW4gZm9yIHRo ZSByZWxhdGlvbiBzY2FubmVkIGJ5ICdiZXN0X3BhdGgnCiAqCSB3aXRoIHJlc3RyaWN0aW9u IGNsYXVzZXMgJ3NjYW5fY2xhdXNlcycgYW5kIHRhcmdldGxpc3QgJ3RsaXN0Jy4KICovCnN0 YXRpYyBGb3JlaWduU2NhbiAqCmNyZWF0ZV9mb3JlaWduc2Nhbl9wbGFuKFBsYW5uZXJJbmZv ICpyb290LCBGb3JlaWduUGF0aCAqYmVzdF9wYXRoLAoJCQkJCQlMaXN0ICp0bGlzdCwgTGlz dCAqc2Nhbl9jbGF1c2VzKQp7CglGb3JlaWduU2NhbiAqc2Nhbl9wbGFuOwoJUmVsT3B0SW5m byAqcmVsID0gYmVzdF9wYXRoLT5wYXRoLnBhcmVudDsKCUluZGV4CQlzY2FuX3JlbGlkID0g cmVsLT5yZWxpZDsKCU9pZAkJCXJlbF9vaWQgPSBJbnZhbGlkT2lkOwoJUGxhbgkgICAqb3V0 ZXJfcGxhbiA9IE5VTEw7CgoJQXNzZXJ0KHJlbC0+ZmR3cm91dGluZSAhPSBOVUxMKTsKCgkv KiB0cmFuc2Zvcm0gdGhlIGNoaWxkIHBhdGggaWYgYW55ICovCglpZiAoYmVzdF9wYXRoLT5m ZHdfb3V0ZXJwYXRoKQoJCW91dGVyX3BsYW4gPSBjcmVhdGVfcGxhbl9yZWN1cnNlKHJvb3Qs IGJlc3RfcGF0aC0+ZmR3X291dGVycGF0aCwKCQkJCQkJCQkJCSBDUF9FWEFDVF9UTElTVCk7 CgoJLyoKCSAqIElmIHdlJ3JlIHNjYW5uaW5nIGEgYmFzZSByZWxhdGlvbiwgZmV0Y2ggaXRz IE9JRC4gIChJcnJlbGV2YW50IGlmCgkgKiBzY2FubmluZyBhIGpvaW4gcmVsYXRpb24uKQoJ ICovCglpZiAoc2Nhbl9yZWxpZCA+IDApCgl7CgkJUmFuZ2VUYmxFbnRyeSAqcnRlOwoKCQlB c3NlcnQocmVsLT5ydGVraW5kID09IFJURV9SRUxBVElPTik7CgkJcnRlID0gcGxhbm5lcl9y dF9mZXRjaChzY2FuX3JlbGlkLCByb290KTsKCQlBc3NlcnQocnRlLT5ydGVraW5kID09IFJU RV9SRUxBVElPTik7CgkJcmVsX29pZCA9IHJ0ZS0+cmVsaWQ7Cgl9CgoJLyoKCSAqIFNvcnQg Y2xhdXNlcyBpbnRvIGJlc3QgZXhlY3V0aW9uIG9yZGVyLiAgV2UgZG8gdGhpcyBmaXJzdCBz aW5jZSB0aGUgRkRXCgkgKiBtaWdodCBoYXZlIG1vcmUgaW5mbyB0aGFuIHdlIGRvIGFuZCB3 aXNoIHRvIGFkanVzdCB0aGUgb3JkZXJpbmcuCgkgKi8KCXNjYW5fY2xhdXNlcyA9IG9yZGVy X3F1YWxfY2xhdXNlcyhyb290LCBzY2FuX2NsYXVzZXMpOwoKCS8qCgkgKiBMZXQgdGhlIEZE VyBwZXJmb3JtIGl0cyBwcm9jZXNzaW5nIG9uIHRoZSByZXN0cmljdGlvbiBjbGF1c2VzIGFu ZAoJICogZ2VuZXJhdGUgdGhlIHBsYW4gbm9kZS4gIE5vdGUgdGhhdCB0aGUgRkRXIG1pZ2h0 IHJlbW92ZSByZXN0cmljdGlvbgoJICogY2xhdXNlcyB0aGF0IGl0IGludGVuZHMgdG8gZXhl Y3V0ZSByZW1vdGVseSwgb3IgZXZlbiBhZGQgbW9yZSAoaWYgaXQKCSAqIGhhcyBzZWxlY3Rl ZCBzb21lIGpvaW4gY2xhdXNlcyBmb3IgcmVtb3RlIHVzZSBidXQgYWxzbyB3YW50cyB0aGVt CgkgKiByZWNoZWNrZWQgbG9jYWxseSkuCgkgKi8KCXNjYW5fcGxhbiA9IHJlbC0+ZmR3cm91 dGluZS0+R2V0Rm9yZWlnblBsYW4ocm9vdCwgcmVsLCByZWxfb2lkLAoJCQkJCQkJCQkJCQli ZXN0X3BhdGgsCgkJCQkJCQkJCQkJCXRsaXN0LCBzY2FuX2NsYXVzZXMsCgkJCQkJCQkJCQkJ CW91dGVyX3BsYW4pOwoKCS8qIENvcHkgY29zdCBkYXRhIGZyb20gUGF0aCB0byBQbGFuOyBu byBuZWVkIHRvIG1ha2UgRkRXIGRvIHRoaXMgKi8KCWNvcHlfZ2VuZXJpY19wYXRoX2luZm8o JnNjYW5fcGxhbi0+c2Nhbi5wbGFuLCAmYmVzdF9wYXRoLT5wYXRoKTsKCgkvKiBDb3B5IHVz ZXIgT0lEIHRvIGFjY2VzcyBhczsgbGlrZXdpc2Ugbm8gbmVlZCB0byBtYWtlIEZEVyBkbyB0 aGlzICovCglzY2FuX3BsYW4tPmNoZWNrQXNVc2VyID0gcmVsLT51c2VyaWQ7CgoJLyogQ29w eSBmb3JlaWduIHNlcnZlciBPSUQ7IGxpa2V3aXNlLCBubyBuZWVkIHRvIG1ha2UgRkRXIGRv IHRoaXMgKi8KCXNjYW5fcGxhbi0+ZnNfc2VydmVyID0gcmVsLT5zZXJ2ZXJpZDsKCgkvKgoJ ICogTGlrZXdpc2UsIGNvcHkgdGhlIHJlbGlkcyB0aGF0IGFyZSByZXByZXNlbnRlZCBieSB0 aGlzIGZvcmVpZ24gc2Nhbi4gQW4KCSAqIHVwcGVyIHJlbCBkb2Vzbid0IGhhdmUgcmVsaWRz IHNldCwgYnV0IGl0IGNvdmVycyBhbGwgdGhlIHJlbGF0aW9ucwoJICogcGFydGljaXBhdGlu ZyBpbiB0aGUgdW5kZXJseWluZyBzY2FuL2pvaW4sIHNvIHVzZSByb290LT5hbGxfcXVlcnlf cmVscy4KCSAqLwoJaWYgKHJlbC0+cmVsb3B0a2luZCA9PSBSRUxPUFRfVVBQRVJfUkVMKQoJ CXNjYW5fcGxhbi0+ZnNfcmVsaWRzID0gcm9vdC0+YWxsX3F1ZXJ5X3JlbHM7CgllbHNlCgkJ c2Nhbl9wbGFuLT5mc19yZWxpZHMgPSBiZXN0X3BhdGgtPnBhdGgucGFyZW50LT5yZWxpZHM7 CgoJLyoKCSAqIEpvaW4gcmVsaWQgc2V0cyBpbmNsdWRlIHJlbGV2YW50IG91dGVyIGpvaW5z LCBidXQgRkRXcyBtYXkgbmVlZCB0byBrbm93CgkgKiB3aGljaCBhcmUgdGhlIGluY2x1ZGVk IGJhc2UgcmVscy4gIFRoYXQncyBhIGJpdCB0ZWRpb3VzIHRvIGdldCB3aXRob3V0CgkgKiBh Y2Nlc3MgdG8gdGhlIHBsYW4tdGltZSBkYXRhIHN0cnVjdHVyZXMsIHNvIGNvbXB1dGUgaXQg aGVyZS4KCSAqLwoJc2Nhbl9wbGFuLT5mc19iYXNlX3JlbGlkcyA9IGJtc19kaWZmZXJlbmNl KHNjYW5fcGxhbi0+ZnNfcmVsaWRzLAoJCQkJCQkJCQkJCSAgIHJvb3QtPm91dGVyX2pvaW5f cmVscyk7CgoJLyoKCSAqIElmIHRoaXMgaXMgYSBmb3JlaWduIGpvaW4sIGFuZCB0byBtYWtl IGl0IHZhbGlkIHRvIHB1c2ggZG93biB3ZSBoYWQgdG8KCSAqIGFzc3VtZSB0aGF0IHRoZSBj dXJyZW50IHVzZXIgaXMgdGhlIHNhbWUgYXMgc29tZSB1c2VyIGV4cGxpY2l0bHkgbmFtZWQK CSAqIGluIHRoZSBxdWVyeSwgbWFyayB0aGUgZmluaXNoZWQgcGxhbiBhcyBkZXBlbmRpbmcg b24gdGhlIGN1cnJlbnQgdXNlci4KCSAqLwoJaWYgKHJlbC0+dXNlcmlkaXNjdXJyZW50KQoJ CXJvb3QtPmdsb2ItPmRlcGVuZHNPblJvbGUgPSB0cnVlOwoKCS8qCgkgKiBSZXBsYWNlIGFu eSBvdXRlci1yZWxhdGlvbiB2YXJpYWJsZXMgd2l0aCBuZXN0bG9vcCBwYXJhbXMgaW4gdGhl IHF1YWwsCgkgKiBmZHdfZXhwcnMgYW5kIGZkd19yZWNoZWNrX3F1YWxzIGV4cHJlc3Npb25z LiAgV2UgZG8gdGhpcyBsYXN0IHNvIHRoYXQKCSAqIHRoZSBGRFcgZG9lc24ndCBoYXZlIHRv IGJlIGludm9sdmVkLiAgKE5vdGUgdGhhdCBwYXJ0cyBvZiBmZHdfZXhwcnMgb3IKCSAqIGZk d19yZWNoZWNrX3F1YWxzIGNvdWxkIGhhdmUgY29tZSBmcm9tIGpvaW4gY2xhdXNlcywgc28g ZG9pbmcgdGhpcwoJICogYmVmb3JlaGFuZCBvbiB0aGUgc2Nhbl9jbGF1c2VzIHdvdWxkbid0 IHdvcmsuKSAgV2UgYXNzdW1lCgkgKiBmZHdfc2Nhbl90bGlzdCBjb250YWlucyBubyBzdWNo IHZhcmlhYmxlcy4KCSAqLwoJaWYgKGJlc3RfcGF0aC0+cGF0aC5wYXJhbV9pbmZvKQoJewoJ CXNjYW5fcGxhbi0+c2Nhbi5wbGFuLnF1YWwgPSAoTGlzdCAqKQoJCQlyZXBsYWNlX25lc3Rs b29wX3BhcmFtcyhyb290LCAoTm9kZSAqKSBzY2FuX3BsYW4tPnNjYW4ucGxhbi5xdWFsKTsK CQlzY2FuX3BsYW4tPmZkd19leHBycyA9IChMaXN0ICopCgkJCXJlcGxhY2VfbmVzdGxvb3Bf cGFyYW1zKHJvb3QsIChOb2RlICopIHNjYW5fcGxhbi0+ZmR3X2V4cHJzKTsKCQlzY2FuX3Bs YW4tPmZkd19yZWNoZWNrX3F1YWxzID0gKExpc3QgKikKCQkJcmVwbGFjZV9uZXN0bG9vcF9w YXJhbXMocm9vdCwKCQkJCQkJCQkJKE5vZGUgKikgc2Nhbl9wbGFuLT5mZHdfcmVjaGVja19x dWFscyk7Cgl9CgoJLyoKCSAqIElmIHJlbCBpcyBhIGJhc2UgcmVsYXRpb24sIGRldGVjdCB3 aGV0aGVyIGFueSBzeXN0ZW0gY29sdW1ucyBhcmUKCSAqIHJlcXVlc3RlZCBmcm9tIHRoZSBy ZWwuICAoSWYgcmVsIGlzIGEgam9pbiByZWxhdGlvbiwgcmVsLT5yZWxpZCB3aWxsIGJlCgkg KiAwLCBidXQgdGhlcmUgY2FuIGJlIG5vIFZhciB3aXRoIHJlbGlkIDAgaW4gdGhlIHJlbCdz IHRhcmdldGxpc3Qgb3IgdGhlCgkgKiByZXN0cmljdGlvbiBjbGF1c2VzLCBzbyB3ZSBza2lw IHRoaXMgaW4gdGhhdCBjYXNlLiAgTm90ZSB0aGF0IGFueSBzdWNoCgkgKiBjb2x1bW5zIGlu IGJhc2UgcmVsYXRpb25zIHRoYXQgd2VyZSBqb2luZWQgYXJlIGFzc3VtZWQgdG8gYmUgY29u dGFpbmVkCgkgKiBpbiBmZHdfc2Nhbl90bGlzdC4pCVRoaXMgaXMgYSBiaXQgb2YgYSBrbHVn ZSBhbmQgbWlnaHQgZ28gYXdheQoJICogc29tZWRheSwgc28gd2UgaW50ZW50aW9uYWxseSBs ZWF2ZSBpdCBvdXQgb2YgdGhlIEFQSSBwcmVzZW50ZWQgdG8gRkRXcy4KCSAqLwoJc2Nhbl9w bGFuLT5mc1N5c3RlbUNvbCA9IGZhbHNlOwoJaWYgKHNjYW5fcmVsaWQgPiAwKQoJewoJCUJp dG1hcHNldCAgKmF0dHJzX3VzZWQgPSBOVUxMOwoJCUxpc3RDZWxsICAgKmxjOwoJCWludAkJ CWk7CgoJCS8qCgkJICogRmlyc3QsIGV4YW1pbmUgYWxsIHRoZSBhdHRyaWJ1dGVzIG5lZWRl ZCBmb3Igam9pbnMgb3IgZmluYWwgb3V0cHV0LgoJCSAqIE5vdGU6IHdlIG11c3QgbG9vayBh dCByZWwncyB0YXJnZXRsaXN0LCBub3QgdGhlIGF0dHJfbmVlZGVkIGRhdGEsCgkJICogYmVj YXVzZSBhdHRyX25lZWRlZCBpc24ndCBjb21wdXRlZCBmb3IgaW5oZXJpdGFuY2UgY2hpbGQg cmVscy4KCQkgKi8KCQlwdWxsX3ZhcmF0dG5vcygoTm9kZSAqKSByZWwtPnJlbHRhcmdldC0+ ZXhwcnMsIHNjYW5fcmVsaWQsICZhdHRyc191c2VkKTsKCgkJLyogQWRkIGFsbCB0aGUgYXR0 cmlidXRlcyB1c2VkIGJ5IHJlc3RyaWN0aW9uIGNsYXVzZXMuICovCgkJZm9yZWFjaChsYywg cmVsLT5iYXNlcmVzdHJpY3RpbmZvKQoJCXsKCQkJUmVzdHJpY3RJbmZvICpyaW5mbyA9IChS ZXN0cmljdEluZm8gKikgbGZpcnN0KGxjKTsKCgkJCXB1bGxfdmFyYXR0bm9zKChOb2RlICop IHJpbmZvLT5jbGF1c2UsIHNjYW5fcmVsaWQsICZhdHRyc191c2VkKTsKCQl9CgoJCS8qIE5v dywgYXJlIGFueSBzeXN0ZW0gY29sdW1ucyByZXF1ZXN0ZWQgZnJvbSByZWw/ICovCgkJZm9y IChpID0gRmlyc3RMb3dJbnZhbGlkSGVhcEF0dHJpYnV0ZU51bWJlciArIDE7IGkgPCAwOyBp KyspCgkJewoJCQlpZiAoYm1zX2lzX21lbWJlcihpIC0gRmlyc3RMb3dJbnZhbGlkSGVhcEF0 dHJpYnV0ZU51bWJlciwgYXR0cnNfdXNlZCkpCgkJCXsKCQkJCXNjYW5fcGxhbi0+ZnNTeXN0 ZW1Db2wgPSB0cnVlOwoJCQkJYnJlYWs7CgkJCX0KCQl9CgoJCWJtc19mcmVlKGF0dHJzX3Vz ZWQpOwoJfQoKCXJldHVybiBzY2FuX3BsYW47Cn0KCi8qCiAqIGNyZWF0ZV9jdXN0b21zY2Fu X3BsYW4KICoKICogVHJhbnNmb3JtIGEgQ3VzdG9tUGF0aCBpbnRvIGEgUGxhbi4KICovCnN0 YXRpYyBDdXN0b21TY2FuICoKY3JlYXRlX2N1c3RvbXNjYW5fcGxhbihQbGFubmVySW5mbyAq cm9vdCwgQ3VzdG9tUGF0aCAqYmVzdF9wYXRoLAoJCQkJCSAgIExpc3QgKnRsaXN0LCBMaXN0 ICpzY2FuX2NsYXVzZXMpCnsKCUN1c3RvbVNjYW4gKmNwbGFuOwoJUmVsT3B0SW5mbyAqcmVs ID0gYmVzdF9wYXRoLT5wYXRoLnBhcmVudDsKCUxpc3QJICAgKmN1c3RvbV9wbGFucyA9IE5J TDsKCUxpc3RDZWxsICAgKmxjOwoKCS8qIFJlY3Vyc2l2ZWx5IHRyYW5zZm9ybSBjaGlsZCBw YXRocy4gKi8KCWZvcmVhY2gobGMsIGJlc3RfcGF0aC0+Y3VzdG9tX3BhdGhzKQoJewoJCVBs YW4JICAgKnBsYW4gPSBjcmVhdGVfcGxhbl9yZWN1cnNlKHJvb3QsIChQYXRoICopIGxmaXJz dChsYyksCgkJCQkJCQkJCQkJICAgQ1BfRVhBQ1RfVExJU1QpOwoKCQljdXN0b21fcGxhbnMg PSBsYXBwZW5kKGN1c3RvbV9wbGFucywgcGxhbik7Cgl9CgoJLyoKCSAqIFNvcnQgY2xhdXNl cyBpbnRvIHRoZSBiZXN0IGV4ZWN1dGlvbiBvcmRlciwgYWx0aG91Z2ggY3VzdG9tLXNjYW4K CSAqIHByb3ZpZGVyIGNhbiByZW9yZGVyIHRoZW0gYWdhaW4uCgkgKi8KCXNjYW5fY2xhdXNl cyA9IG9yZGVyX3F1YWxfY2xhdXNlcyhyb290LCBzY2FuX2NsYXVzZXMpOwoKCS8qCgkgKiBJ bnZva2UgY3VzdG9tIHBsYW4gcHJvdmlkZXIgdG8gY3JlYXRlIHRoZSBQbGFuIG5vZGUgcmVw cmVzZW50ZWQgYnkgdGhlCgkgKiBDdXN0b21QYXRoLgoJICovCgljcGxhbiA9IGNhc3ROb2Rl KEN1c3RvbVNjYW4sCgkJCQkJIGJlc3RfcGF0aC0+bWV0aG9kcy0+UGxhbkN1c3RvbVBhdGgo cm9vdCwKCQkJCQkJCQkJCQkJCQlyZWwsCgkJCQkJCQkJCQkJCQkJYmVzdF9wYXRoLAoJCQkJ CQkJCQkJCQkJCXRsaXN0LAoJCQkJCQkJCQkJCQkJCXNjYW5fY2xhdXNlcywKCQkJCQkJCQkJ CQkJCQljdXN0b21fcGxhbnMpKTsKCgkvKgoJICogQ29weSBjb3N0IGRhdGEgZnJvbSBQYXRo IHRvIFBsYW47IG5vIG5lZWQgdG8gbWFrZSBjdXN0b20tcGxhbiBwcm92aWRlcnMKCSAqIGRv IHRoaXMKCSAqLwoJY29weV9nZW5lcmljX3BhdGhfaW5mbygmY3BsYW4tPnNjYW4ucGxhbiwg JmJlc3RfcGF0aC0+cGF0aCk7CgoJLyogTGlrZXdpc2UsIGNvcHkgdGhlIHJlbGlkcyB0aGF0 IGFyZSByZXByZXNlbnRlZCBieSB0aGlzIGN1c3RvbSBzY2FuICovCgljcGxhbi0+Y3VzdG9t X3JlbGlkcyA9IGJlc3RfcGF0aC0+cGF0aC5wYXJlbnQtPnJlbGlkczsKCgkvKgoJICogUmVw bGFjZSBhbnkgb3V0ZXItcmVsYXRpb24gdmFyaWFibGVzIHdpdGggbmVzdGxvb3AgcGFyYW1z IGluIHRoZSBxdWFsCgkgKiBhbmQgY3VzdG9tX2V4cHJzIGV4cHJlc3Npb25zLiAgV2UgZG8g dGhpcyBsYXN0IHNvIHRoYXQgdGhlIGN1c3RvbS1wbGFuCgkgKiBwcm92aWRlciBkb2Vzbid0 IGhhdmUgdG8gYmUgaW52b2x2ZWQuICAoTm90ZSB0aGF0IHBhcnRzIG9mIGN1c3RvbV9leHBy cwoJICogY291bGQgaGF2ZSBjb21lIGZyb20gam9pbiBjbGF1c2VzLCBzbyBkb2luZyB0aGlz IGJlZm9yZWhhbmQgb24gdGhlCgkgKiBzY2FuX2NsYXVzZXMgd291bGRuJ3Qgd29yay4pICBX ZSBhc3N1bWUgY3VzdG9tX3NjYW5fdGxpc3QgY29udGFpbnMgbm8KCSAqIHN1Y2ggdmFyaWFi bGVzLgoJICovCglpZiAoYmVzdF9wYXRoLT5wYXRoLnBhcmFtX2luZm8pCgl7CgkJY3BsYW4t PnNjYW4ucGxhbi5xdWFsID0gKExpc3QgKikKCQkJcmVwbGFjZV9uZXN0bG9vcF9wYXJhbXMo cm9vdCwgKE5vZGUgKikgY3BsYW4tPnNjYW4ucGxhbi5xdWFsKTsKCQljcGxhbi0+Y3VzdG9t X2V4cHJzID0gKExpc3QgKikKCQkJcmVwbGFjZV9uZXN0bG9vcF9wYXJhbXMocm9vdCwgKE5v ZGUgKikgY3BsYW4tPmN1c3RvbV9leHBycyk7Cgl9CgoJcmV0dXJuIGNwbGFuOwp9CgoKLyoq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqCiAqCiAqCUpPSU4gTUVUSE9EUwogKgogKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKiovCgpzdGF0aWMgTmVzdExvb3AgKgpjcmVhdGVfbmVzdGxvb3BfcGxh bihQbGFubmVySW5mbyAqcm9vdCwKCQkJCQkgTmVzdFBhdGggKmJlc3RfcGF0aCkKewoJTmVz dExvb3AgICAqam9pbl9wbGFuOwoJUGxhbgkgICAqb3V0ZXJfcGxhbjsKCVBsYW4JICAgKmlu bmVyX3BsYW47CglSZWxpZHMJCW91dGVycmVsaWRzOwoJTGlzdAkgICAqdGxpc3QgPSBidWls ZF9wYXRoX3RsaXN0KHJvb3QsICZiZXN0X3BhdGgtPmpwYXRoLnBhdGgpOwoJTGlzdAkgICAq am9pbnJlc3RyaWN0Y2xhdXNlcyA9IGJlc3RfcGF0aC0+anBhdGguam9pbnJlc3RyaWN0aW5m bzsKCUxpc3QJICAgKmpvaW5jbGF1c2VzOwoJTGlzdAkgICAqb3RoZXJjbGF1c2VzOwoJTGlz dAkgICAqbmVzdFBhcmFtczsKCUxpc3QJICAgKm91dGVyX3RsaXN0OwoJYm9vbAkJb3V0ZXJf cGFyYWxsZWxfc2FmZTsKCVJlbGlkcwkJc2F2ZU91dGVyUmVscyA9IHJvb3QtPmN1ck91dGVy UmVsczsKCUxpc3RDZWxsICAgKmxjOwoKCS8qCgkgKiBJZiB0aGUgaW5uZXIgcGF0aCBpcyBw YXJhbWV0ZXJpemVkIGJ5IHRoZSB0b3Btb3N0IHBhcmVudCBvZiB0aGUgb3V0ZXIKCSAqIHJl bCByYXRoZXIgdGhhbiB0aGUgb3V0ZXIgcmVsIGl0c2VsZiwgZml4IHRoYXQuICAoTm90aGlu ZyBoYXBwZW5zIGhlcmUKCSAqIGlmIGl0IGlzIG5vdCBzbyBwYXJhbWV0ZXJpemVkLikKCSAq LwoJYmVzdF9wYXRoLT5qcGF0aC5pbm5lcmpvaW5wYXRoID0KCQlyZXBhcmFtZXRlcml6ZV9w YXRoX2J5X2NoaWxkKHJvb3QsCgkJCQkJCQkJCSBiZXN0X3BhdGgtPmpwYXRoLmlubmVyam9p bnBhdGgsCgkJCQkJCQkJCSBiZXN0X3BhdGgtPmpwYXRoLm91dGVyam9pbnBhdGgtPnBhcmVu dCk7CgoJLyoKCSAqIEZhaWx1cmUgaGVyZSBwcm9iYWJseSBtZWFucyB0aGF0IHJlcGFyYW1l dGVyaXplX3BhdGhfYnlfY2hpbGQoKSBpcyBub3QKCSAqIGluIHN5bmMgd2l0aCBwYXRoX2lz X3JlcGFyYW1ldGVyaXphYmxlX2J5X2NoaWxkKCkuCgkgKi8KCUFzc2VydChiZXN0X3BhdGgt PmpwYXRoLmlubmVyam9pbnBhdGggIT0gTlVMTCk7CgoJLyogTmVzdExvb3AgY2FuIHByb2pl Y3QsIHNvIG5vIG5lZWQgdG8gYmUgcGlja3kgYWJvdXQgY2hpbGQgdGxpc3RzICovCglvdXRl cl9wbGFuID0gY3JlYXRlX3BsYW5fcmVjdXJzZShyb290LCBiZXN0X3BhdGgtPmpwYXRoLm91 dGVyam9pbnBhdGgsIDApOwoKCS8qIEZvciBhIG5lc3Rsb29wLCBpbmNsdWRlIG91dGVyIHJl bGlkcyBpbiBjdXJPdXRlclJlbHMgZm9yIGlubmVyIHNpZGUgKi8KCW91dGVycmVsaWRzID0g YmVzdF9wYXRoLT5qcGF0aC5vdXRlcmpvaW5wYXRoLT5wYXJlbnQtPnJlbGlkczsKCXJvb3Qt PmN1ck91dGVyUmVscyA9IGJtc191bmlvbihyb290LT5jdXJPdXRlclJlbHMsIG91dGVycmVs aWRzKTsKCglpbm5lcl9wbGFuID0gY3JlYXRlX3BsYW5fcmVjdXJzZShyb290LCBiZXN0X3Bh dGgtPmpwYXRoLmlubmVyam9pbnBhdGgsIDApOwoKCS8qIFJlc3RvcmUgY3VyT3V0ZXJSZWxz ICovCglibXNfZnJlZShyb290LT5jdXJPdXRlclJlbHMpOwoJcm9vdC0+Y3VyT3V0ZXJSZWxz ID0gc2F2ZU91dGVyUmVsczsKCgkvKiBTb3J0IGpvaW4gcXVhbCBjbGF1c2VzIGludG8gYmVz dCBleGVjdXRpb24gb3JkZXIgKi8KCWpvaW5yZXN0cmljdGNsYXVzZXMgPSBvcmRlcl9xdWFs X2NsYXVzZXMocm9vdCwgam9pbnJlc3RyaWN0Y2xhdXNlcyk7CgoJLyogR2V0IHRoZSBqb2lu IHF1YWwgY2xhdXNlcyAoaW4gcGxhaW4gZXhwcmVzc2lvbiBmb3JtKSAqLwoJLyogQW55IHBz ZXVkb2NvbnN0YW50IGNsYXVzZXMgYXJlIGlnbm9yZWQgaGVyZSAqLwoJaWYgKElTX09VVEVS X0pPSU4oYmVzdF9wYXRoLT5qcGF0aC5qb2ludHlwZSkpCgl7CgkJZXh0cmFjdF9hY3R1YWxf am9pbl9jbGF1c2VzKGpvaW5yZXN0cmljdGNsYXVzZXMsCgkJCQkJCQkJCWJlc3RfcGF0aC0+ anBhdGgucGF0aC5wYXJlbnQtPnJlbGlkcywKCQkJCQkJCQkJJmpvaW5jbGF1c2VzLCAmb3Ro ZXJjbGF1c2VzKTsKCX0KCWVsc2UKCXsKCQkvKiBXZSBjYW4gdHJlYXQgYWxsIGNsYXVzZXMg YWxpa2UgZm9yIGFuIGlubmVyIGpvaW4gKi8KCQlqb2luY2xhdXNlcyA9IGV4dHJhY3RfYWN0 dWFsX2NsYXVzZXMoam9pbnJlc3RyaWN0Y2xhdXNlcywgZmFsc2UpOwoJCW90aGVyY2xhdXNl cyA9IE5JTDsKCX0KCgkvKiBSZXBsYWNlIGFueSBvdXRlci1yZWxhdGlvbiB2YXJpYWJsZXMg d2l0aCBuZXN0bG9vcCBwYXJhbXMgKi8KCWlmIChiZXN0X3BhdGgtPmpwYXRoLnBhdGgucGFy YW1faW5mbykKCXsKCQlqb2luY2xhdXNlcyA9IChMaXN0ICopCgkJCXJlcGxhY2VfbmVzdGxv b3BfcGFyYW1zKHJvb3QsIChOb2RlICopIGpvaW5jbGF1c2VzKTsKCQlvdGhlcmNsYXVzZXMg PSAoTGlzdCAqKQoJCQlyZXBsYWNlX25lc3Rsb29wX3BhcmFtcyhyb290LCAoTm9kZSAqKSBv dGhlcmNsYXVzZXMpOwoJfQoKCS8qCgkgKiBJZGVudGlmeSBhbnkgbmVzdGxvb3AgcGFyYW1l dGVycyB0aGF0IHNob3VsZCBiZSBzdXBwbGllZCBieSB0aGlzIGpvaW4KCSAqIG5vZGUsIGFu ZCByZW1vdmUgdGhlbSBmcm9tIHJvb3QtPmN1ck91dGVyUGFyYW1zLgoJICovCgluZXN0UGFy YW1zID0gaWRlbnRpZnlfY3VycmVudF9uZXN0bG9vcF9wYXJhbXMocm9vdCwKCQkJCQkJCQkJ CQkJICBvdXRlcnJlbGlkcywKCQkJCQkJCQkJCQkJICBQQVRIX1JFUV9PVVRFUigoUGF0aCAq KSBiZXN0X3BhdGgpKTsKCgkvKgoJICogV2hpbGUgbmVzdGxvb3AgcGFyYW1ldGVycyB0aGF0 IGFyZSBWYXJzIGhhZCBiZXR0ZXIgYmUgYXZhaWxhYmxlIGZyb20KCSAqIHRoZSBvdXRlcl9w bGFuIGFscmVhZHksIHRoZXJlIGFyZSBlZGdlIGNhc2VzIHdoZXJlIG5lc3Rsb29wIHBhcmFt ZXRlcnMKCSAqIHRoYXQgYXJlIFBIVnMgd29uJ3QgYmUuICBJbiBzdWNoIGNhc2VzIHdlIG11 c3QgYWRkIHRoZW0gdG8gdGhlCgkgKiBvdXRlcl9wbGFuJ3MgdGxpc3QsIHNpbmNlIHRoZSBl eGVjdXRvcidzIE5lc3RMb29wUGFyYW0gbWFjaGluZXJ5CgkgKiByZXF1aXJlcyB0aGUgcGFy YW1zIHRvIGJlIHNpbXBsZSBvdXRlci1WYXIgcmVmZXJlbmNlcyB0byB0aGF0IHRsaXN0LgoJ ICogKFRoaXMgaXMgY2hlYXRpbmcgYSBsaXR0bGUgYml0LCBiZWNhdXNlIHRoZSBvdXRlciBw YXRoJ3MgcmVxdWlyZWQtb3V0ZXIKCSAqIHJlbGlkcyBtaWdodCBub3QgYmUgZW5vdWdoIHRv IGFsbG93IGV2YWx1YXRpbmcgc3VjaCBhIFBIVi4gIEJ1dCBpbgoJICogcHJhY3RpY2UsIGlm IHdlIGNvdWxkIGhhdmUgZXZhbHVhdGVkIHRoZSBQSFYgYXQgdGhlIG5lc3Rsb29wIG5vZGUs IHdlCgkgKiBjYW4gZG8gc28gaW4gdGhlIG91dGVyIHBsYW4gdG9vLikKCSAqLwoJb3V0ZXJf dGxpc3QgPSBvdXRlcl9wbGFuLT50YXJnZXRsaXN0OwoJb3V0ZXJfcGFyYWxsZWxfc2FmZSA9 IG91dGVyX3BsYW4tPnBhcmFsbGVsX3NhZmU7Cglmb3JlYWNoKGxjLCBuZXN0UGFyYW1zKQoJ ewoJCU5lc3RMb29wUGFyYW0gKm5scCA9IChOZXN0TG9vcFBhcmFtICopIGxmaXJzdChsYyk7 CgkJUGxhY2VIb2xkZXJWYXIgKnBodjsKCQlUYXJnZXRFbnRyeSAqdGxlOwoKCQlpZiAoSXNB KG5scC0+cGFyYW12YWwsIFZhcikpCgkJCWNvbnRpbnVlOwkJCS8qIG5vdGhpbmcgdG8gZG8g Zm9yIHNpbXBsZSBWYXJzICovCgkJLyogT3RoZXJ3aXNlIGl0IG11c3QgYmUgYSBQSFYgKi8K CQlwaHYgPSBjYXN0Tm9kZShQbGFjZUhvbGRlclZhciwgbmxwLT5wYXJhbXZhbCk7CgoJCWlm ICh0bGlzdF9tZW1iZXIoKEV4cHIgKikgcGh2LCBvdXRlcl90bGlzdCkpCgkJCWNvbnRpbnVl OwkJCS8qIGFscmVhZHkgYXZhaWxhYmxlICovCgoJCS8qCgkJICogSXQncyBwb3NzaWJsZSB0 aGF0IG5lc3Rsb29wIHBhcmFtZXRlciBQSFZzIHNlbGVjdGVkIHRvIGV2YWx1YXRlCgkJICog aGVyZSBjb250YWluIHJlZmVyZW5jZXMgdG8gc3Vydml2aW5nIHJvb3QtPmN1ck91dGVyUGFy YW1zIGl0ZW1zCgkJICogKHRoYXQgaXMsIHRoZXkgcmVmZXJlbmNlIHZhbHVlcyB0aGF0IHdp bGwgYmUgc3VwcGxpZWQgYnkgc29tZQoJCSAqIGhpZ2hlci1sZXZlbCBuZXN0bG9vcCkuICBU aG9zZSBuZWVkIHRvIGJlIGNvbnZlcnRlZCB0byBQYXJhbXMgbm93LgoJCSAqIE5vdGU6IGl0 J3Mgc2FmZSB0byBkbyB0aGlzIGFmdGVyIHRoZSB0bGlzdF9tZW1iZXIoKSBjaGVjaywgYmVj YXVzZQoJCSAqIGVxdWFsKCkgd29uJ3QgcGF5IGF0dGVudGlvbiB0byBwaHYtPnBoZXhwci4K CQkgKi8KCQlwaHYtPnBoZXhwciA9IChFeHByICopIHJlcGxhY2VfbmVzdGxvb3BfcGFyYW1z KHJvb3QsCgkJCQkJCQkJCQkJCQkgICAoTm9kZSAqKSBwaHYtPnBoZXhwcik7CgoJCS8qIE1h a2UgYSBzaGFsbG93IGNvcHkgb2Ygb3V0ZXJfdGxpc3QsIGlmIHdlIGRpZG4ndCBhbHJlYWR5 ICovCgkJaWYgKG91dGVyX3RsaXN0ID09IG91dGVyX3BsYW4tPnRhcmdldGxpc3QpCgkJCW91 dGVyX3RsaXN0ID0gbGlzdF9jb3B5KG91dGVyX3RsaXN0KTsKCQkvKiAuLi4gYW5kIGFkZCB0 aGUgbmVlZGVkIGV4cHJlc3Npb24gKi8KCQl0bGUgPSBtYWtlVGFyZ2V0RW50cnkoKEV4cHIg KikgY29weU9iamVjdChwaHYpLAoJCQkJCQkJICBsaXN0X2xlbmd0aChvdXRlcl90bGlzdCkg KyAxLAoJCQkJCQkJICBOVUxMLAoJCQkJCQkJICB0cnVlKTsKCQlvdXRlcl90bGlzdCA9IGxh cHBlbmQob3V0ZXJfdGxpc3QsIHRsZSk7CgkJLyogLi4uIGFuZCB0cmFjayB3aGV0aGVyIHRs aXN0IGlzIChzdGlsbCkgcGFyYWxsZWwtc2FmZSAqLwoJCWlmIChvdXRlcl9wYXJhbGxlbF9z YWZlKQoJCQlvdXRlcl9wYXJhbGxlbF9zYWZlID0gaXNfcGFyYWxsZWxfc2FmZShyb290LCAo Tm9kZSAqKSBwaHYpOwoJfQoJaWYgKG91dGVyX3RsaXN0ICE9IG91dGVyX3BsYW4tPnRhcmdl dGxpc3QpCgkJb3V0ZXJfcGxhbiA9IGNoYW5nZV9wbGFuX3RhcmdldGxpc3Qob3V0ZXJfcGxh biwgb3V0ZXJfdGxpc3QsCgkJCQkJCQkJCQkJb3V0ZXJfcGFyYWxsZWxfc2FmZSk7CgoJLyog QW5kIGZpbmFsbHksIHdlIGNhbiBidWlsZCB0aGUgam9pbiBwbGFuIG5vZGUgKi8KCWpvaW5f cGxhbiA9IG1ha2VfbmVzdGxvb3AodGxpc3QsCgkJCQkJCQkgIGpvaW5jbGF1c2VzLAoJCQkJ CQkJICBvdGhlcmNsYXVzZXMsCgkJCQkJCQkgIG5lc3RQYXJhbXMsCgkJCQkJCQkgIG91dGVy X3BsYW4sCgkJCQkJCQkgIGlubmVyX3BsYW4sCgkJCQkJCQkgIGJlc3RfcGF0aC0+anBhdGgu am9pbnR5cGUsCgkJCQkJCQkgIGJlc3RfcGF0aC0+anBhdGguaW5uZXJfdW5pcXVlKTsKCglj b3B5X2dlbmVyaWNfcGF0aF9pbmZvKCZqb2luX3BsYW4tPmpvaW4ucGxhbiwgJmJlc3RfcGF0 aC0+anBhdGgucGF0aCk7CgoJcmV0dXJuIGpvaW5fcGxhbjsKfQoKc3RhdGljIE1lcmdlSm9p biAqCmNyZWF0ZV9tZXJnZWpvaW5fcGxhbihQbGFubmVySW5mbyAqcm9vdCwKCQkJCQkgIE1l cmdlUGF0aCAqYmVzdF9wYXRoKQp7CglNZXJnZUpvaW4gICpqb2luX3BsYW47CglQbGFuCSAg ICpvdXRlcl9wbGFuOwoJUGxhbgkgICAqaW5uZXJfcGxhbjsKCUxpc3QJICAgKnRsaXN0ID0g YnVpbGRfcGF0aF90bGlzdChyb290LCAmYmVzdF9wYXRoLT5qcGF0aC5wYXRoKTsKCUxpc3QJ ICAgKmpvaW5jbGF1c2VzOwoJTGlzdAkgICAqb3RoZXJjbGF1c2VzOwoJTGlzdAkgICAqbWVy Z2VjbGF1c2VzOwoJTGlzdAkgICAqb3V0ZXJwYXRoa2V5czsKCUxpc3QJICAgKmlubmVycGF0 aGtleXM7CglpbnQJCQluQ2xhdXNlczsKCU9pZAkJICAgKm1lcmdlZmFtaWxpZXM7CglPaWQJ CSAgICptZXJnZWNvbGxhdGlvbnM7Cglib29sCSAgICptZXJnZXJldmVyc2FsczsKCWJvb2wJ ICAgKm1lcmdlbnVsbHNmaXJzdDsKCVBhdGhLZXkgICAgKm9wYXRoa2V5OwoJRXF1aXZhbGVu Y2VDbGFzcyAqb3BlY2xhc3M7CglpbnQJCQlpOwoJTGlzdENlbGwgICAqbGM7CglMaXN0Q2Vs bCAgICpsb3A7CglMaXN0Q2VsbCAgICpsaXA7CglQYXRoCSAgICpvdXRlcl9wYXRoID0gYmVz dF9wYXRoLT5qcGF0aC5vdXRlcmpvaW5wYXRoOwoJUGF0aAkgICAqaW5uZXJfcGF0aCA9IGJl c3RfcGF0aC0+anBhdGguaW5uZXJqb2lucGF0aDsKCgkvKgoJICogTWVyZ2VKb2luIGNhbiBw cm9qZWN0LCBzbyB3ZSBkb24ndCBoYXZlIHRvIGRlbWFuZCBleGFjdCB0bGlzdHMgZnJvbSB0 aGUKCSAqIGlucHV0cy4gIEhvd2V2ZXIsIGlmIHdlJ3JlIGludGVuZGluZyB0byBzb3J0IGFu IGlucHV0J3MgcmVzdWx0LCBpdCdzCgkgKiBiZXN0IHRvIHJlcXVlc3QgYSBzbWFsbCB0bGlz dCBzbyB3ZSBhcmVuJ3Qgc29ydGluZyBtb3JlIGRhdGEgdGhhbgoJICogbmVjZXNzYXJ5LgoJ ICovCglvdXRlcl9wbGFuID0gY3JlYXRlX3BsYW5fcmVjdXJzZShyb290LCBiZXN0X3BhdGgt PmpwYXRoLm91dGVyam9pbnBhdGgsCgkJCQkJCQkJCSAoYmVzdF9wYXRoLT5vdXRlcnNvcnRr ZXlzICE9IE5JTCkgPyBDUF9TTUFMTF9UTElTVCA6IDApOwoKCWlubmVyX3BsYW4gPSBjcmVh dGVfcGxhbl9yZWN1cnNlKHJvb3QsIGJlc3RfcGF0aC0+anBhdGguaW5uZXJqb2lucGF0aCwK CQkJCQkJCQkJIChiZXN0X3BhdGgtPmlubmVyc29ydGtleXMgIT0gTklMKSA/IENQX1NNQUxM X1RMSVNUIDogMCk7CgoJLyogU29ydCBqb2luIHF1YWwgY2xhdXNlcyBpbnRvIGJlc3QgZXhl Y3V0aW9uIG9yZGVyICovCgkvKiBOQjogZG8gTk9UIHJlb3JkZXIgdGhlIG1lcmdlY2xhdXNl cyAqLwoJam9pbmNsYXVzZXMgPSBvcmRlcl9xdWFsX2NsYXVzZXMocm9vdCwgYmVzdF9wYXRo LT5qcGF0aC5qb2lucmVzdHJpY3RpbmZvKTsKCgkvKiBHZXQgdGhlIGpvaW4gcXVhbCBjbGF1 c2VzIChpbiBwbGFpbiBleHByZXNzaW9uIGZvcm0pICovCgkvKiBBbnkgcHNldWRvY29uc3Rh bnQgY2xhdXNlcyBhcmUgaWdub3JlZCBoZXJlICovCglpZiAoSVNfT1VURVJfSk9JTihiZXN0 X3BhdGgtPmpwYXRoLmpvaW50eXBlKSkKCXsKCQlleHRyYWN0X2FjdHVhbF9qb2luX2NsYXVz ZXMoam9pbmNsYXVzZXMsCgkJCQkJCQkJCWJlc3RfcGF0aC0+anBhdGgucGF0aC5wYXJlbnQt PnJlbGlkcywKCQkJCQkJCQkJJmpvaW5jbGF1c2VzLCAmb3RoZXJjbGF1c2VzKTsKCX0KCWVs c2UKCXsKCQkvKiBXZSBjYW4gdHJlYXQgYWxsIGNsYXVzZXMgYWxpa2UgZm9yIGFuIGlubmVy IGpvaW4gKi8KCQlqb2luY2xhdXNlcyA9IGV4dHJhY3RfYWN0dWFsX2NsYXVzZXMoam9pbmNs YXVzZXMsIGZhbHNlKTsKCQlvdGhlcmNsYXVzZXMgPSBOSUw7Cgl9CgoJLyoKCSAqIFJlbW92 ZSB0aGUgbWVyZ2VjbGF1c2VzIGZyb20gdGhlIGxpc3Qgb2Ygam9pbiBxdWFsIGNsYXVzZXMs IGxlYXZpbmcgdGhlCgkgKiBsaXN0IG9mIHF1YWxzIHRoYXQgbXVzdCBiZSBjaGVja2VkIGFz IHFwcXVhbHMuCgkgKi8KCW1lcmdlY2xhdXNlcyA9IGdldF9hY3R1YWxfY2xhdXNlcyhiZXN0 X3BhdGgtPnBhdGhfbWVyZ2VjbGF1c2VzKTsKCWpvaW5jbGF1c2VzID0gbGlzdF9kaWZmZXJl bmNlKGpvaW5jbGF1c2VzLCBtZXJnZWNsYXVzZXMpOwoKCS8qCgkgKiBSZXBsYWNlIGFueSBv dXRlci1yZWxhdGlvbiB2YXJpYWJsZXMgd2l0aCBuZXN0bG9vcCBwYXJhbXMuICBUaGVyZQoJ ICogc2hvdWxkIG5vdCBiZSBhbnkgaW4gdGhlIG1lcmdlY2xhdXNlcy4KCSAqLwoJaWYgKGJl c3RfcGF0aC0+anBhdGgucGF0aC5wYXJhbV9pbmZvKQoJewoJCWpvaW5jbGF1c2VzID0gKExp c3QgKikKCQkJcmVwbGFjZV9uZXN0bG9vcF9wYXJhbXMocm9vdCwgKE5vZGUgKikgam9pbmNs YXVzZXMpOwoJCW90aGVyY2xhdXNlcyA9IChMaXN0ICopCgkJCXJlcGxhY2VfbmVzdGxvb3Bf cGFyYW1zKHJvb3QsIChOb2RlICopIG90aGVyY2xhdXNlcyk7Cgl9CgoJLyoKCSAqIFJlYXJy YW5nZSBtZXJnZWNsYXVzZXMsIGlmIG5lZWRlZCwgc28gdGhhdCB0aGUgb3V0ZXIgdmFyaWFi bGUgaXMgYWx3YXlzCgkgKiBvbiB0aGUgbGVmdDsgbWFyayB0aGUgbWVyZ2VjbGF1c2UgcmVz dHJpY3RpbmZvcyB3aXRoIGNvcnJlY3QKCSAqIG91dGVyX2lzX2xlZnQgc3RhdHVzLgoJICov CgltZXJnZWNsYXVzZXMgPSBnZXRfc3dpdGNoZWRfY2xhdXNlcyhiZXN0X3BhdGgtPnBhdGhf bWVyZ2VjbGF1c2VzLAoJCQkJCQkJCQkJYmVzdF9wYXRoLT5qcGF0aC5vdXRlcmpvaW5wYXRo LT5wYXJlbnQtPnJlbGlkcyk7CgoJLyoKCSAqIENyZWF0ZSBleHBsaWNpdCBzb3J0IG5vZGVz IGZvciB0aGUgb3V0ZXIgYW5kIGlubmVyIHBhdGhzIGlmIG5lY2Vzc2FyeS4KCSAqLwoJaWYg KGJlc3RfcGF0aC0+b3V0ZXJzb3J0a2V5cykKCXsKCQlSZWxpZHMJCW91dGVyX3JlbGlkcyA9 IG91dGVyX3BhdGgtPnBhcmVudC0+cmVsaWRzOwoJCVBsYW4JICAgKnNvcnRfcGxhbjsKCgkJ LyoKCQkgKiBXZSBjYW4gYXNzZXJ0IHRoYXQgdGhlIG91dGVyIHBhdGggaXMgbm90IGFscmVh ZHkgb3JkZXJlZAoJCSAqIGFwcHJvcHJpYXRlbHkgZm9yIHRoZSBtZXJnZWpvaW47IG90aGVy d2lzZSwgb3V0ZXJzb3J0a2V5cyB3b3VsZAoJCSAqIGhhdmUgYmVlbiBzZXQgdG8gTklMLgoJ CSAqLwoJCUFzc2VydCghcGF0aGtleXNfY29udGFpbmVkX2luKGJlc3RfcGF0aC0+b3V0ZXJz b3J0a2V5cywKCQkJCQkJCQkJICBvdXRlcl9wYXRoLT5wYXRoa2V5cykpOwoKCQkvKgoJCSAq IFdlIGNob29zZSB0byB1c2UgaW5jcmVtZW50YWwgc29ydCBpZiBpdCBpcyBlbmFibGVkIGFu ZCB0aGVyZSBhcmUKCQkgKiBwcmVzb3J0ZWQga2V5czsgb3RoZXJ3aXNlIHdlIHVzZSBmdWxs IHNvcnQuCgkJICovCgkJaWYgKGVuYWJsZV9pbmNyZW1lbnRhbF9zb3J0ICYmIGJlc3RfcGF0 aC0+b3V0ZXJfcHJlc29ydGVkX2tleXMgPiAwKQoJCXsKCQkJc29ydF9wbGFuID0gKFBsYW4g KikKCQkJCW1ha2VfaW5jcmVtZW50YWxzb3J0X2Zyb21fcGF0aGtleXMob3V0ZXJfcGxhbiwK CQkJCQkJCQkJCQkJICAgYmVzdF9wYXRoLT5vdXRlcnNvcnRrZXlzLAoJCQkJCQkJCQkJCQkg ICBvdXRlcl9yZWxpZHMsCgkJCQkJCQkJCQkJCSAgIGJlc3RfcGF0aC0+b3V0ZXJfcHJlc29y dGVkX2tleXMpOwoKCQkJbGFiZWxfaW5jcmVtZW50YWxzb3J0X3dpdGhfY29zdHNpemUocm9v dCwKCQkJCQkJCQkJCQkJKEluY3JlbWVudGFsU29ydCAqKSBzb3J0X3BsYW4sCgkJCQkJCQkJ CQkJCWJlc3RfcGF0aC0+b3V0ZXJzb3J0a2V5cywKCQkJCQkJCQkJCQkJLTEuMCk7CgkJfQoJ CWVsc2UKCQl7CgkJCXNvcnRfcGxhbiA9IChQbGFuICopCgkJCQltYWtlX3NvcnRfZnJvbV9w YXRoa2V5cyhvdXRlcl9wbGFuLAoJCQkJCQkJCQkJYmVzdF9wYXRoLT5vdXRlcnNvcnRrZXlz LAoJCQkJCQkJCQkJb3V0ZXJfcmVsaWRzKTsKCgkJCWxhYmVsX3NvcnRfd2l0aF9jb3N0c2l6 ZShyb290LCAoU29ydCAqKSBzb3J0X3BsYW4sIC0xLjApOwoJCX0KCgkJb3V0ZXJfcGxhbiA9 IHNvcnRfcGxhbjsKCQlvdXRlcnBhdGhrZXlzID0gYmVzdF9wYXRoLT5vdXRlcnNvcnRrZXlz OwoJfQoJZWxzZQoJCW91dGVycGF0aGtleXMgPSBiZXN0X3BhdGgtPmpwYXRoLm91dGVyam9p bnBhdGgtPnBhdGhrZXlzOwoKCWlmIChiZXN0X3BhdGgtPmlubmVyc29ydGtleXMpCgl7CgkJ LyoKCQkgKiBXZSBkbyBub3QgY29uc2lkZXIgaW5jcmVtZW50YWwgc29ydCBmb3IgaW5uZXIg cGF0aCwgYmVjYXVzZQoJCSAqIGluY3JlbWVudGFsIHNvcnQgZG9lcyBub3Qgc3VwcG9ydCBt YXJrL3Jlc3RvcmUuCgkJICovCgoJCVJlbGlkcwkJaW5uZXJfcmVsaWRzID0gaW5uZXJfcGF0 aC0+cGFyZW50LT5yZWxpZHM7CgkJU29ydAkgICAqc29ydDsKCgkJLyoKCQkgKiBXZSBjYW4g YXNzZXJ0IHRoYXQgdGhlIGlubmVyIHBhdGggaXMgbm90IGFscmVhZHkgb3JkZXJlZAoJCSAq IGFwcHJvcHJpYXRlbHkgZm9yIHRoZSBtZXJnZWpvaW47IG90aGVyd2lzZSwgaW5uZXJzb3J0 a2V5cyB3b3VsZAoJCSAqIGhhdmUgYmVlbiBzZXQgdG8gTklMLgoJCSAqLwoJCUFzc2VydCgh cGF0aGtleXNfY29udGFpbmVkX2luKGJlc3RfcGF0aC0+aW5uZXJzb3J0a2V5cywKCQkJCQkJ CQkJICBpbm5lcl9wYXRoLT5wYXRoa2V5cykpOwoKCQlzb3J0ID0gbWFrZV9zb3J0X2Zyb21f cGF0aGtleXMoaW5uZXJfcGxhbiwKCQkJCQkJCQkJICAgYmVzdF9wYXRoLT5pbm5lcnNvcnRr ZXlzLAoJCQkJCQkJCQkgICBpbm5lcl9yZWxpZHMpOwoKCQlsYWJlbF9zb3J0X3dpdGhfY29z dHNpemUocm9vdCwgc29ydCwgLTEuMCk7CgkJaW5uZXJfcGxhbiA9IChQbGFuICopIHNvcnQ7 CgkJaW5uZXJwYXRoa2V5cyA9IGJlc3RfcGF0aC0+aW5uZXJzb3J0a2V5czsKCX0KCWVsc2UK CQlpbm5lcnBhdGhrZXlzID0gYmVzdF9wYXRoLT5qcGF0aC5pbm5lcmpvaW5wYXRoLT5wYXRo a2V5czsKCgkvKgoJICogSWYgc3BlY2lmaWVkLCBhZGQgYSBtYXRlcmlhbGl6ZSBub2RlIHRv IHNoaWVsZCB0aGUgaW5uZXIgcGxhbiBmcm9tIHRoZQoJICogbmVlZCB0byBoYW5kbGUgbWFy ay9yZXN0b3JlLgoJICovCglpZiAoYmVzdF9wYXRoLT5tYXRlcmlhbGl6ZV9pbm5lcikKCXsK CQlQbGFuCSAgICptYXRwbGFuID0gKFBsYW4gKikgbWFrZV9tYXRlcmlhbChpbm5lcl9wbGFu KTsKCgkJLyoKCQkgKiBXZSBhc3N1bWUgdGhlIG1hdGVyaWFsaXplIHdpbGwgbm90IHNwaWxs IHRvIGRpc2ssIGFuZCB0aGVyZWZvcmUKCQkgKiBjaGFyZ2UganVzdCBjcHVfb3BlcmF0b3Jf Y29zdCBwZXIgdHVwbGUuICAoS2VlcCB0aGlzIGVzdGltYXRlIGluCgkJICogc3luYyB3aXRo IGZpbmFsX2Nvc3RfbWVyZ2Vqb2luLikKCQkgKi8KCQljb3B5X3BsYW5fY29zdHNpemUobWF0 cGxhbiwgaW5uZXJfcGxhbik7CgkJbWF0cGxhbi0+dG90YWxfY29zdCArPSBjcHVfb3BlcmF0 b3JfY29zdCAqIG1hdHBsYW4tPnBsYW5fcm93czsKCgkJaW5uZXJfcGxhbiA9IG1hdHBsYW47 Cgl9CgoJLyoKCSAqIENvbXB1dGUgdGhlIG9wZmFtaWx5L2NvbGxhdGlvbi9zdHJhdGVneS9u dWxsc2ZpcnN0IGFycmF5cyBuZWVkZWQgYnkgdGhlCgkgKiBleGVjdXRvci4gIFRoZSBpbmZv cm1hdGlvbiBpcyBpbiB0aGUgcGF0aGtleXMgZm9yIHRoZSB0d28gaW5wdXRzLCBidXQKCSAq IHdlIG5lZWQgdG8gYmUgY2FyZWZ1bCBhYm91dCB0aGUgcG9zc2liaWxpdHkgb2YgbWVyZ2Vj bGF1c2VzIHNoYXJpbmcgYQoJICogcGF0aGtleSwgYXMgd2VsbCBhcyB0aGUgcG9zc2liaWxp dHkgdGhhdCB0aGUgaW5uZXIgcGF0aGtleXMgYXJlIG5vdCBpbgoJICogYW4gb3JkZXIgbWF0 Y2hpbmcgdGhlIG1lcmdlY2xhdXNlcy4KCSAqLwoJbkNsYXVzZXMgPSBsaXN0X2xlbmd0aCht ZXJnZWNsYXVzZXMpOwoJQXNzZXJ0KG5DbGF1c2VzID09IGxpc3RfbGVuZ3RoKGJlc3RfcGF0 aC0+cGF0aF9tZXJnZWNsYXVzZXMpKTsKCW1lcmdlZmFtaWxpZXMgPSAoT2lkICopIHBhbGxv YyhuQ2xhdXNlcyAqIHNpemVvZihPaWQpKTsKCW1lcmdlY29sbGF0aW9ucyA9IChPaWQgKikg cGFsbG9jKG5DbGF1c2VzICogc2l6ZW9mKE9pZCkpOwoJbWVyZ2VyZXZlcnNhbHMgPSAoYm9v bCAqKSBwYWxsb2MobkNsYXVzZXMgKiBzaXplb2YoYm9vbCkpOwoJbWVyZ2VudWxsc2ZpcnN0 ID0gKGJvb2wgKikgcGFsbG9jKG5DbGF1c2VzICogc2l6ZW9mKGJvb2wpKTsKCglvcGF0aGtl eSA9IE5VTEw7CglvcGVjbGFzcyA9IE5VTEw7Cglsb3AgPSBsaXN0X2hlYWQob3V0ZXJwYXRo a2V5cyk7CglsaXAgPSBsaXN0X2hlYWQoaW5uZXJwYXRoa2V5cyk7CglpID0gMDsKCWZvcmVh Y2gobGMsIGJlc3RfcGF0aC0+cGF0aF9tZXJnZWNsYXVzZXMpCgl7CgkJUmVzdHJpY3RJbmZv ICpyaW5mbyA9IGxmaXJzdF9ub2RlKFJlc3RyaWN0SW5mbywgbGMpOwoJCUVxdWl2YWxlbmNl Q2xhc3MgKm9lY2xhc3M7CgkJRXF1aXZhbGVuY2VDbGFzcyAqaWVjbGFzczsKCQlQYXRoS2V5 ICAgICppcGF0aGtleSA9IE5VTEw7CgkJRXF1aXZhbGVuY2VDbGFzcyAqaXBlY2xhc3MgPSBO VUxMOwoJCWJvb2wJCWZpcnN0X2lubmVyX21hdGNoID0gZmFsc2U7CgoJCS8qIGZldGNoIG91 dGVyL2lubmVyIGVjbGFzcyBmcm9tIG1lcmdlY2xhdXNlICovCgkJaWYgKHJpbmZvLT5vdXRl cl9pc19sZWZ0KQoJCXsKCQkJb2VjbGFzcyA9IHJpbmZvLT5sZWZ0X2VjOwoJCQlpZWNsYXNz ID0gcmluZm8tPnJpZ2h0X2VjOwoJCX0KCQllbHNlCgkJewoJCQlvZWNsYXNzID0gcmluZm8t PnJpZ2h0X2VjOwoJCQlpZWNsYXNzID0gcmluZm8tPmxlZnRfZWM7CgkJfQoJCUFzc2VydChv ZWNsYXNzICE9IE5VTEwpOwoJCUFzc2VydChpZWNsYXNzICE9IE5VTEwpOwoKCQkvKgoJCSAq IFdlIG11c3QgaWRlbnRpZnkgdGhlIHBhdGhrZXkgZWxlbWVudHMgYXNzb2NpYXRlZCB3aXRo IHRoaXMgY2xhdXNlCgkJICogYnkgbWF0Y2hpbmcgdGhlIGVjbGFzc2VzICh3aGljaCBzaG91 bGQgZ2l2ZSBhIHVuaXF1ZSBtYXRjaCwgc2luY2UKCQkgKiB0aGUgcGF0aGtleSBsaXN0cyBz aG91bGQgYmUgY2Fub25pY2FsKS4gIEluIHR5cGljYWwgY2FzZXMgdGhlIG1lcmdlCgkJICog Y2xhdXNlcyBhcmUgb25lLXRvLW9uZSB3aXRoIHRoZSBwYXRoa2V5cywgYnV0IHdoZW4gZGVh bGluZyB3aXRoCgkJICogcGFydGlhbGx5IHJlZHVuZGFudCBxdWVyeSBjb25kaXRpb25zLCB0 aGluZ3MgYXJlIG1vcmUgY29tcGxpY2F0ZWQuCgkJICoKCQkgKiBsb3AgYW5kIGxpcCByZWZl cmVuY2UgdGhlIGZpcnN0IGFzLXlldC11bm1hdGNoZWQgcGF0aGtleSBlbGVtZW50cy4KCQkg KiBJZiB0aGV5J3JlIE5VTEwgdGhlbiBhbGwgcGF0aGtleSBlbGVtZW50cyBoYXZlIGJlZW4g bWF0Y2hlZC4KCQkgKgoJCSAqIFRoZSBvcmRlcmluZyBvZiB0aGUgb3V0ZXIgcGF0aGtleXMg c2hvdWxkIG1hdGNoIHRoZSBtZXJnZWNsYXVzZXMsCgkJICogYnkgY29uc3RydWN0aW9uIChz ZWUgZmluZF9tZXJnZWNsYXVzZXNfZm9yX291dGVyX3BhdGhrZXlzKCkpLiBUaGVyZQoJCSAq IGNvdWxkIGJlIG1vcmUgdGhhbiBvbmUgbWVyZ2VjbGF1c2UgZm9yIHRoZSBzYW1lIG91dGVy IHBhdGhrZXksIGJ1dAoJCSAqIG5vIHBhdGhrZXkgbWF5IGJlIGVudGlyZWx5IHNraXBwZWQg b3Zlci4KCQkgKi8KCQlpZiAob2VjbGFzcyAhPSBvcGVjbGFzcykJLyogbXVsdGlwbGUgbWF0 Y2hlcyBhcmUgbm90IGludGVyZXN0aW5nICovCgkJewoJCQkvKiBkb2Vzbid0IG1hdGNoIHRo ZSBjdXJyZW50IG9wYXRoa2V5LCBzbyBtdXN0IG1hdGNoIHRoZSBuZXh0ICovCgkJCWlmIChs b3AgPT0gTlVMTCkKCQkJCWVsb2coRVJST1IsICJvdXRlciBwYXRoa2V5cyBkbyBub3QgbWF0 Y2ggbWVyZ2VjbGF1c2VzIik7CgkJCW9wYXRoa2V5ID0gKFBhdGhLZXkgKikgbGZpcnN0KGxv cCk7CgkJCW9wZWNsYXNzID0gb3BhdGhrZXktPnBrX2VjbGFzczsKCQkJbG9wID0gbG5leHQo b3V0ZXJwYXRoa2V5cywgbG9wKTsKCQkJaWYgKG9lY2xhc3MgIT0gb3BlY2xhc3MpCgkJCQll bG9nKEVSUk9SLCAib3V0ZXIgcGF0aGtleXMgZG8gbm90IG1hdGNoIG1lcmdlY2xhdXNlcyIp OwoJCX0KCgkJLyoKCQkgKiBUaGUgaW5uZXIgcGF0aGtleXMgbGlrZXdpc2Ugc2hvdWxkIG5v dCBoYXZlIHNraXBwZWQtb3ZlciBrZXlzLCBidXQKCQkgKiBpdCdzIHBvc3NpYmxlIGZvciBh IG1lcmdlY2xhdXNlIHRvIHJlZmVyZW5jZSBzb21lIGVhcmxpZXIgaW5uZXIKCQkgKiBwYXRo a2V5IGlmIHdlIGhhZCByZWR1bmRhbnQgcGF0aGtleXMuICBGb3IgZXhhbXBsZSB3ZSBtaWdo dCBoYXZlCgkJICogbWVyZ2VjbGF1c2VzIGxpa2UgIm8uYSA9IGkueCBBTkQgby5iID0gaS55 IEFORCBvLmMgPSBpLngiLiAgVGhlCgkJICogaW1wbGllZCBpbm5lciBvcmRlcmluZyBpcyB0 aGVuICJPUkRFUiBCWSB4LCB5LCB4IiwgYnV0IHRoZSBwYXRoa2V5CgkJICogbWVjaGFuaXNt IGRyb3BzIHRoZSBzZWNvbmQgc29ydCBieSB4IGFzIHJlZHVuZGFudCwgYW5kIHRoaXMgY29k ZQoJCSAqIG11c3QgY29wZS4KCQkgKgoJCSAqIEl0J3MgYWxzbyBwb3NzaWJsZSBmb3IgdGhl IGltcGxpZWQgaW5uZXItcmVsIG9yZGVyaW5nIHRvIGJlIGxpa2UKCQkgKiAiT1JERVIgQlkg eCwgeSwgeCBERVNDIi4gIFdlIHN0aWxsIGRyb3AgdGhlIHNlY29uZCBpbnN0YW5jZSBvZiB4 IGFzCgkJICogcmVkdW5kYW50OyBidXQgdGhpcyBtZWFucyB0aGF0IHRoZSBzb3J0IG9yZGVy aW5nIG9mIGEgcmVkdW5kYW50CgkJICogaW5uZXIgcGF0aGtleSBzaG91bGQgbm90IGJlIGNv bnNpZGVyZWQgc2lnbmlmaWNhbnQuICBTbyB3ZSBtdXN0CgkJICogZGV0ZWN0IHdoZXRoZXIg dGhpcyBpcyB0aGUgZmlyc3QgY2xhdXNlIG1hdGNoaW5nIGFuIGlubmVyIHBhdGhrZXkuCgkJ ICovCgkJaWYgKGxpcCkKCQl7CgkJCWlwYXRoa2V5ID0gKFBhdGhLZXkgKikgbGZpcnN0KGxp cCk7CgkJCWlwZWNsYXNzID0gaXBhdGhrZXktPnBrX2VjbGFzczsKCQkJaWYgKGllY2xhc3Mg PT0gaXBlY2xhc3MpCgkJCXsKCQkJCS8qIHN1Y2Nlc3NmdWwgZmlyc3QgbWF0Y2ggdG8gdGhp cyBpbm5lciBwYXRoa2V5ICovCgkJCQlsaXAgPSBsbmV4dChpbm5lcnBhdGhrZXlzLCBsaXAp OwoJCQkJZmlyc3RfaW5uZXJfbWF0Y2ggPSB0cnVlOwoJCQl9CgkJfQoJCWlmICghZmlyc3Rf aW5uZXJfbWF0Y2gpCgkJewoJCQkvKiByZWR1bmRhbnQgY2xhdXNlIC4uLiBtdXN0IG1hdGNo IHNvbWV0aGluZyBiZWZvcmUgbGlwICovCgkJCUxpc3RDZWxsICAgKmwyOwoKCQkJZm9yZWFj aChsMiwgaW5uZXJwYXRoa2V5cykKCQkJewoJCQkJaWYgKGwyID09IGxpcCkKCQkJCQlicmVh azsKCQkJCWlwYXRoa2V5ID0gKFBhdGhLZXkgKikgbGZpcnN0KGwyKTsKCQkJCWlwZWNsYXNz ID0gaXBhdGhrZXktPnBrX2VjbGFzczsKCQkJCWlmIChpZWNsYXNzID09IGlwZWNsYXNzKQoJ CQkJCWJyZWFrOwoJCQl9CgkJCWlmIChpZWNsYXNzICE9IGlwZWNsYXNzKQoJCQkJZWxvZyhF UlJPUiwgImlubmVyIHBhdGhrZXlzIGRvIG5vdCBtYXRjaCBtZXJnZWNsYXVzZXMiKTsKCQl9 CgoJCS8qCgkJICogVGhlIHBhdGhrZXlzIHNob3VsZCBhbHdheXMgbWF0Y2ggZWFjaCBvdGhl ciBhcyB0byBvcGZhbWlseSBhbmQKCQkgKiBjb2xsYXRpb24gKHdoaWNoIGFmZmVjdCBlcXVh bGl0eSksIGJ1dCBpZiB3ZSdyZSBjb25zaWRlcmluZyBhCgkJICogcmVkdW5kYW50IGlubmVy IHBhdGhrZXksIGl0cyBzb3J0IG9yZGVyaW5nIG1pZ2h0IG5vdCBtYXRjaC4gIEluCgkJICog c3VjaCBjYXNlcyB3ZSBtYXkgaWdub3JlIHRoZSBpbm5lciBwYXRoa2V5J3Mgc29ydCBvcmRl cmluZyBhbmQgdXNlCgkJICogdGhlIG91dGVyJ3MuICAoSW4gZWZmZWN0LCB3ZSdyZSBseWlu ZyB0byB0aGUgZXhlY3V0b3IgYWJvdXQgdGhlCgkJICogc29ydCBkaXJlY3Rpb24gb2YgdGhp cyBpbm5lciBjb2x1bW4sIGJ1dCBpdCBkb2VzIG5vdCBtYXR0ZXIgc2luY2UKCQkgKiB0aGUg cnVuLXRpbWUgcm93IGNvbXBhcmlzb25zIHdvdWxkIG9ubHkgcmVhY2ggdGhpcyBjb2x1bW4g d2hlbgoJCSAqIHRoZXJlJ3MgZXF1YWxpdHkgZm9yIHRoZSBlYXJsaWVyIGNvbHVtbiBjb250 YWluaW5nIHRoZSBzYW1lIGVjbGFzcy4KCQkgKiBUaGVyZSBjb3VsZCBiZSBvbmx5IG9uZSB2 YWx1ZSBpbiB0aGlzIGNvbHVtbiBmb3IgdGhlIHJhbmdlIG9mIGlubmVyCgkJICogcm93cyBo YXZpbmcgYSBnaXZlbiB2YWx1ZSBpbiB0aGUgZWFybGllciBjb2x1bW4sIHNvIGl0IGRvZXMg bm90CgkJICogbWF0dGVyIHdoaWNoIHdheSB3ZSBpbWFnaW5lIHRoaXMgY29sdW1uIHRvIGJl IG9yZGVyZWQuKSAgQnV0IGEKCQkgKiBub24tcmVkdW5kYW50IGlubmVyIHBhdGhrZXkgaGFk IGJldHRlciBtYXRjaCBvdXRlcidzIG9yZGVyaW5nIHRvby4KCQkgKi8KCQlpZiAob3BhdGhr ZXktPnBrX29wZmFtaWx5ICE9IGlwYXRoa2V5LT5wa19vcGZhbWlseSB8fAoJCQlvcGF0aGtl eS0+cGtfZWNsYXNzLT5lY19jb2xsYXRpb24gIT0gaXBhdGhrZXktPnBrX2VjbGFzcy0+ZWNf Y29sbGF0aW9uKQoJCQllbG9nKEVSUk9SLCAibGVmdCBhbmQgcmlnaHQgcGF0aGtleXMgZG8g bm90IG1hdGNoIGluIG1lcmdlam9pbiIpOwoJCWlmIChmaXJzdF9pbm5lcl9tYXRjaCAmJgoJ CQkob3BhdGhrZXktPnBrX2NtcHR5cGUgIT0gaXBhdGhrZXktPnBrX2NtcHR5cGUgfHwKCQkJ IG9wYXRoa2V5LT5wa19udWxsc19maXJzdCAhPSBpcGF0aGtleS0+cGtfbnVsbHNfZmlyc3Qp KQoJCQllbG9nKEVSUk9SLCAibGVmdCBhbmQgcmlnaHQgcGF0aGtleXMgZG8gbm90IG1hdGNo IGluIG1lcmdlam9pbiIpOwoKCQkvKiBPSywgc2F2ZSBpbmZvIGZvciBleGVjdXRvciAqLwoJ CW1lcmdlZmFtaWxpZXNbaV0gPSBvcGF0aGtleS0+cGtfb3BmYW1pbHk7CgkJbWVyZ2Vjb2xs YXRpb25zW2ldID0gb3BhdGhrZXktPnBrX2VjbGFzcy0+ZWNfY29sbGF0aW9uOwoJCW1lcmdl cmV2ZXJzYWxzW2ldID0gKG9wYXRoa2V5LT5wa19jbXB0eXBlID09IENPTVBBUkVfR1QgPyB0 cnVlIDogZmFsc2UpOwoJCW1lcmdlbnVsbHNmaXJzdFtpXSA9IG9wYXRoa2V5LT5wa19udWxs c19maXJzdDsKCQlpKys7Cgl9CgoJLyoKCSAqIE5vdGU6IGl0IGlzIG5vdCBhbiBlcnJvciBp ZiB3ZSBoYXZlIGFkZGl0aW9uYWwgcGF0aGtleSBlbGVtZW50cyAoaS5lLiwKCSAqIGxvcCBv ciBsaXAgaXNuJ3QgTlVMTCBoZXJlKS4gIFRoZSBpbnB1dCBwYXRocyBtaWdodCBiZSBiZXR0 ZXItc29ydGVkCgkgKiB0aGFuIHdlIG5lZWQgZm9yIHRoZSBjdXJyZW50IG1lcmdlam9pbi4K CSAqLwoKCS8qCgkgKiBOb3cgd2UgY2FuIGJ1aWxkIHRoZSBtZXJnZWpvaW4gbm9kZS4KCSAq LwoJam9pbl9wbGFuID0gbWFrZV9tZXJnZWpvaW4odGxpc3QsCgkJCQkJCQkgICBqb2luY2xh dXNlcywKCQkJCQkJCSAgIG90aGVyY2xhdXNlcywKCQkJCQkJCSAgIG1lcmdlY2xhdXNlcywK CQkJCQkJCSAgIG1lcmdlZmFtaWxpZXMsCgkJCQkJCQkgICBtZXJnZWNvbGxhdGlvbnMsCgkJ CQkJCQkgICBtZXJnZXJldmVyc2FscywKCQkJCQkJCSAgIG1lcmdlbnVsbHNmaXJzdCwKCQkJ CQkJCSAgIG91dGVyX3BsYW4sCgkJCQkJCQkgICBpbm5lcl9wbGFuLAoJCQkJCQkJICAgYmVz dF9wYXRoLT5qcGF0aC5qb2ludHlwZSwKCQkJCQkJCSAgIGJlc3RfcGF0aC0+anBhdGguaW5u ZXJfdW5pcXVlLAoJCQkJCQkJICAgYmVzdF9wYXRoLT5za2lwX21hcmtfcmVzdG9yZSk7CgoJ LyogQ29zdHMgb2Ygc29ydCBhbmQgbWF0ZXJpYWwgc3RlcHMgYXJlIGluY2x1ZGVkIGluIHBh dGggY29zdCBhbHJlYWR5ICovCgljb3B5X2dlbmVyaWNfcGF0aF9pbmZvKCZqb2luX3BsYW4t PmpvaW4ucGxhbiwgJmJlc3RfcGF0aC0+anBhdGgucGF0aCk7CgoJcmV0dXJuIGpvaW5fcGxh bjsKfQoKc3RhdGljIEhhc2hKb2luICoKY3JlYXRlX2hhc2hqb2luX3BsYW4oUGxhbm5lcklu Zm8gKnJvb3QsCgkJCQkJIEhhc2hQYXRoICpiZXN0X3BhdGgpCnsKCUhhc2hKb2luICAgKmpv aW5fcGxhbjsKCUhhc2gJICAgKmhhc2hfcGxhbjsKCVBsYW4JICAgKm91dGVyX3BsYW47CglQ bGFuCSAgICppbm5lcl9wbGFuOwoJTGlzdAkgICAqdGxpc3QgPSBidWlsZF9wYXRoX3RsaXN0 KHJvb3QsICZiZXN0X3BhdGgtPmpwYXRoLnBhdGgpOwoJTGlzdAkgICAqam9pbmNsYXVzZXM7 CglMaXN0CSAgICpvdGhlcmNsYXVzZXM7CglMaXN0CSAgICpoYXNoY2xhdXNlczsKCUxpc3QJ ICAgKmhhc2hvcGVyYXRvcnMgPSBOSUw7CglMaXN0CSAgICpoYXNoY29sbGF0aW9ucyA9IE5J TDsKCUxpc3QJICAgKmlubmVyX2hhc2hrZXlzID0gTklMOwoJTGlzdAkgICAqb3V0ZXJfaGFz aGtleXMgPSBOSUw7CglPaWQJCQlza2V3VGFibGUgPSBJbnZhbGlkT2lkOwoJQXR0ck51bWJl cglza2V3Q29sdW1uID0gSW52YWxpZEF0dHJOdW1iZXI7Cglib29sCQlza2V3SW5oZXJpdCA9 IGZhbHNlOwoJTGlzdENlbGwgICAqbGM7CgoJLyoKCSAqIEhhc2hKb2luIGNhbiBwcm9qZWN0 LCBzbyB3ZSBkb24ndCBoYXZlIHRvIGRlbWFuZCBleGFjdCB0bGlzdHMgZnJvbSB0aGUKCSAq IGlucHV0cy4gIEhvd2V2ZXIsIGl0J3MgYmVzdCB0byByZXF1ZXN0IGEgc21hbGwgdGxpc3Qg ZnJvbSB0aGUgaW5uZXIKCSAqIHNpZGUsIHNvIHRoYXQgd2UgYXJlbid0IHN0b3JpbmcgbW9y ZSBkYXRhIHRoYW4gbmVjZXNzYXJ5LiAgTGlrZXdpc2UsIGlmCgkgKiB3ZSBhbnRpY2lwYXRl IGJhdGNoaW5nLCByZXF1ZXN0IGEgc21hbGwgdGxpc3QgZnJvbSB0aGUgb3V0ZXIgc2lkZSBz bwoJICogdGhhdCB3ZSBkb24ndCBwdXQgZXh0cmEgZGF0YSBpbiB0aGUgb3V0ZXIgYmF0Y2gg ZmlsZXMuCgkgKi8KCW91dGVyX3BsYW4gPSBjcmVhdGVfcGxhbl9yZWN1cnNlKHJvb3QsIGJl c3RfcGF0aC0+anBhdGgub3V0ZXJqb2lucGF0aCwKCQkJCQkJCQkJIChiZXN0X3BhdGgtPm51 bV9iYXRjaGVzID4gMSkgPyBDUF9TTUFMTF9UTElTVCA6IDApOwoKCWlubmVyX3BsYW4gPSBj cmVhdGVfcGxhbl9yZWN1cnNlKHJvb3QsIGJlc3RfcGF0aC0+anBhdGguaW5uZXJqb2lucGF0 aCwKCQkJCQkJCQkJIENQX1NNQUxMX1RMSVNUKTsKCgkvKiBTb3J0IGpvaW4gcXVhbCBjbGF1 c2VzIGludG8gYmVzdCBleGVjdXRpb24gb3JkZXIgKi8KCWpvaW5jbGF1c2VzID0gb3JkZXJf cXVhbF9jbGF1c2VzKHJvb3QsIGJlc3RfcGF0aC0+anBhdGguam9pbnJlc3RyaWN0aW5mbyk7 CgkvKiBUaGVyZSdzIG5vIHBvaW50IGluIHNvcnRpbmcgdGhlIGhhc2ggY2xhdXNlcyAuLi4g Ki8KCgkvKiBHZXQgdGhlIGpvaW4gcXVhbCBjbGF1c2VzIChpbiBwbGFpbiBleHByZXNzaW9u IGZvcm0pICovCgkvKiBBbnkgcHNldWRvY29uc3RhbnQgY2xhdXNlcyBhcmUgaWdub3JlZCBo ZXJlICovCglpZiAoSVNfT1VURVJfSk9JTihiZXN0X3BhdGgtPmpwYXRoLmpvaW50eXBlKSkK CXsKCQlleHRyYWN0X2FjdHVhbF9qb2luX2NsYXVzZXMoam9pbmNsYXVzZXMsCgkJCQkJCQkJ CWJlc3RfcGF0aC0+anBhdGgucGF0aC5wYXJlbnQtPnJlbGlkcywKCQkJCQkJCQkJJmpvaW5j bGF1c2VzLCAmb3RoZXJjbGF1c2VzKTsKCX0KCWVsc2UKCXsKCQkvKiBXZSBjYW4gdHJlYXQg YWxsIGNsYXVzZXMgYWxpa2UgZm9yIGFuIGlubmVyIGpvaW4gKi8KCQlqb2luY2xhdXNlcyA9 IGV4dHJhY3RfYWN0dWFsX2NsYXVzZXMoam9pbmNsYXVzZXMsIGZhbHNlKTsKCQlvdGhlcmNs YXVzZXMgPSBOSUw7Cgl9CgoJLyoKCSAqIFJlbW92ZSB0aGUgaGFzaGNsYXVzZXMgZnJvbSB0 aGUgbGlzdCBvZiBqb2luIHF1YWwgY2xhdXNlcywgbGVhdmluZyB0aGUKCSAqIGxpc3Qgb2Yg cXVhbHMgdGhhdCBtdXN0IGJlIGNoZWNrZWQgYXMgcXBxdWFscy4KCSAqLwoJaGFzaGNsYXVz ZXMgPSBnZXRfYWN0dWFsX2NsYXVzZXMoYmVzdF9wYXRoLT5wYXRoX2hhc2hjbGF1c2VzKTsK CWpvaW5jbGF1c2VzID0gbGlzdF9kaWZmZXJlbmNlKGpvaW5jbGF1c2VzLCBoYXNoY2xhdXNl cyk7CgoJLyoKCSAqIFJlcGxhY2UgYW55IG91dGVyLXJlbGF0aW9uIHZhcmlhYmxlcyB3aXRo IG5lc3Rsb29wIHBhcmFtcy4gIFRoZXJlCgkgKiBzaG91bGQgbm90IGJlIGFueSBpbiB0aGUg aGFzaGNsYXVzZXMuCgkgKi8KCWlmIChiZXN0X3BhdGgtPmpwYXRoLnBhdGgucGFyYW1faW5m bykKCXsKCQlqb2luY2xhdXNlcyA9IChMaXN0ICopCgkJCXJlcGxhY2VfbmVzdGxvb3BfcGFy YW1zKHJvb3QsIChOb2RlICopIGpvaW5jbGF1c2VzKTsKCQlvdGhlcmNsYXVzZXMgPSAoTGlz dCAqKQoJCQlyZXBsYWNlX25lc3Rsb29wX3BhcmFtcyhyb290LCAoTm9kZSAqKSBvdGhlcmNs YXVzZXMpOwoJfQoKCS8qCgkgKiBSZWFycmFuZ2UgaGFzaGNsYXVzZXMsIGlmIG5lZWRlZCwg c28gdGhhdCB0aGUgb3V0ZXIgdmFyaWFibGUgaXMgYWx3YXlzCgkgKiBvbiB0aGUgbGVmdC4K CSAqLwoJaGFzaGNsYXVzZXMgPSBnZXRfc3dpdGNoZWRfY2xhdXNlcyhiZXN0X3BhdGgtPnBh dGhfaGFzaGNsYXVzZXMsCgkJCQkJCQkJCSAgIGJlc3RfcGF0aC0+anBhdGgub3V0ZXJqb2lu cGF0aC0+cGFyZW50LT5yZWxpZHMpOwoKCS8qCgkgKiBJZiB0aGVyZSBpcyBhIHNpbmdsZSBq b2luIGNsYXVzZSBhbmQgd2UgY2FuIGlkZW50aWZ5IHRoZSBvdXRlciB2YXJpYWJsZQoJICog YXMgYSBzaW1wbGUgY29sdW1uIHJlZmVyZW5jZSwgc3VwcGx5IGl0cyBpZGVudGl0eSBmb3Ig cG9zc2libGUgdXNlIGluCgkgKiBza2V3IG9wdGltaXphdGlvbi4gIChOb3RlOiBpbiBwcmlu Y2lwbGUgd2UgY291bGQgZG8gc2tldyBvcHRpbWl6YXRpb24KCSAqIHdpdGggbXVsdGlwbGUg am9pbiBjbGF1c2VzLCBidXQgd2UnZCBoYXZlIHRvIGJlIGFibGUgdG8gZGV0ZXJtaW5lIHRo ZQoJICogbW9zdCBjb21tb24gY29tYmluYXRpb25zIG9mIG91dGVyIHZhbHVlcywgd2hpY2gg d2UgZG9uJ3QgY3VycmVudGx5IGhhdmUKCSAqIGVub3VnaCBzdGF0cyBmb3IuKQoJICovCglp ZiAobGlzdF9sZW5ndGgoaGFzaGNsYXVzZXMpID09IDEpCgl7CgkJT3BFeHByCSAgICpjbGF1 c2UgPSAoT3BFeHByICopIGxpbml0aWFsKGhhc2hjbGF1c2VzKTsKCQlOb2RlCSAgICpub2Rl OwoKCQlBc3NlcnQoaXNfb3BjbGF1c2UoY2xhdXNlKSk7CgkJbm9kZSA9IChOb2RlICopIGxp bml0aWFsKGNsYXVzZS0+YXJncyk7CgkJaWYgKElzQShub2RlLCBSZWxhYmVsVHlwZSkpCgkJ CW5vZGUgPSAoTm9kZSAqKSAoKFJlbGFiZWxUeXBlICopIG5vZGUpLT5hcmc7CgkJaWYgKElz QShub2RlLCBWYXIpKQoJCXsKCQkJVmFyCQkgICAqdmFyID0gKFZhciAqKSBub2RlOwoJCQlS YW5nZVRibEVudHJ5ICpydGU7CgoJCQlydGUgPSByb290LT5zaW1wbGVfcnRlX2FycmF5W3Zh ci0+dmFybm9dOwoJCQlpZiAocnRlLT5ydGVraW5kID09IFJURV9SRUxBVElPTikKCQkJewoJ CQkJc2tld1RhYmxlID0gcnRlLT5yZWxpZDsKCQkJCXNrZXdDb2x1bW4gPSB2YXItPnZhcmF0 dG5vOwoJCQkJc2tld0luaGVyaXQgPSBydGUtPmluaDsKCQkJfQoJCX0KCX0KCgkvKgoJICog Q29sbGVjdCBoYXNoIHJlbGF0ZWQgaW5mb3JtYXRpb24uIFRoZSBoYXNoZWQgZXhwcmVzc2lv bnMgYXJlCgkgKiBkZWNvbnN0cnVjdGVkIGludG8gb3V0ZXIvaW5uZXIgZXhwcmVzc2lvbnMs IHNvIHRoZXkgY2FuIGJlIGNvbXB1dGVkCgkgKiBzZXBhcmF0ZWx5IChpbm5lciBleHByZXNz aW9ucyBhcmUgdXNlZCB0byBidWlsZCB0aGUgaGFzaHRhYmxlIHZpYSBIYXNoLAoJICogb3V0 ZXIgZXhwcmVzc2lvbnMgdG8gcGVyZm9ybSBsb29rdXBzIG9mIHR1cGxlcyBmcm9tIEhhc2hK b2luJ3Mgb3V0ZXIKCSAqIHBsYW4gaW4gdGhlIGhhc2h0YWJsZSkuIEFsc28gY29sbGVjdCBv cGVyYXRvciBpbmZvcm1hdGlvbiBuZWNlc3NhcnkgdG8KCSAqIGJ1aWxkIHRoZSBoYXNodGFi bGUuCgkgKi8KCWZvcmVhY2gobGMsIGhhc2hjbGF1c2VzKQoJewoJCU9wRXhwcgkgICAqaGNs YXVzZSA9IGxmaXJzdF9ub2RlKE9wRXhwciwgbGMpOwoKCQloYXNob3BlcmF0b3JzID0gbGFw cGVuZF9vaWQoaGFzaG9wZXJhdG9ycywgaGNsYXVzZS0+b3Bubyk7CgkJaGFzaGNvbGxhdGlv bnMgPSBsYXBwZW5kX29pZChoYXNoY29sbGF0aW9ucywgaGNsYXVzZS0+aW5wdXRjb2xsaWQp OwoJCW91dGVyX2hhc2hrZXlzID0gbGFwcGVuZChvdXRlcl9oYXNoa2V5cywgbGluaXRpYWwo aGNsYXVzZS0+YXJncykpOwoJCWlubmVyX2hhc2hrZXlzID0gbGFwcGVuZChpbm5lcl9oYXNo a2V5cywgbHNlY29uZChoY2xhdXNlLT5hcmdzKSk7Cgl9CgoJLyoKCSAqIEJ1aWxkIHRoZSBo YXNoIG5vZGUgYW5kIGhhc2ggam9pbiBub2RlLgoJICovCgloYXNoX3BsYW4gPSBtYWtlX2hh c2goaW5uZXJfcGxhbiwKCQkJCQkJICBpbm5lcl9oYXNoa2V5cywKCQkJCQkJICBza2V3VGFi bGUsCgkJCQkJCSAgc2tld0NvbHVtbiwKCQkJCQkJICBza2V3SW5oZXJpdCk7CgoJLyoKCSAq IFNldCBIYXNoIG5vZGUncyBzdGFydHVwICYgdG90YWwgY29zdHMgZXF1YWwgdG8gdG90YWwg Y29zdCBvZiBpbnB1dAoJICogcGxhbjsgdGhpcyBvbmx5IGFmZmVjdHMgRVhQTEFJTiBkaXNw bGF5IG5vdCBkZWNpc2lvbnMuCgkgKi8KCWNvcHlfcGxhbl9jb3N0c2l6ZSgmaGFzaF9wbGFu LT5wbGFuLCBpbm5lcl9wbGFuKTsKCWhhc2hfcGxhbi0+cGxhbi5zdGFydHVwX2Nvc3QgPSBo YXNoX3BsYW4tPnBsYW4udG90YWxfY29zdDsKCgkvKgoJICogSWYgcGFyYWxsZWwtYXdhcmUs IHRoZSBleGVjdXRvciB3aWxsIGFsc28gbmVlZCBhbiBlc3RpbWF0ZSBvZiB0aGUgdG90YWwK CSAqIG51bWJlciBvZiByb3dzIGV4cGVjdGVkIGZyb20gYWxsIHBhcnRpY2lwYW50cyBzbyB0 aGF0IGl0IGNhbiBzaXplIHRoZQoJICogc2hhcmVkIGhhc2ggdGFibGUuCgkgKi8KCWlmIChi ZXN0X3BhdGgtPmpwYXRoLnBhdGgucGFyYWxsZWxfYXdhcmUpCgl7CgkJaGFzaF9wbGFuLT5w bGFuLnBhcmFsbGVsX2F3YXJlID0gdHJ1ZTsKCQloYXNoX3BsYW4tPnJvd3NfdG90YWwgPSBi ZXN0X3BhdGgtPmlubmVyX3Jvd3NfdG90YWw7Cgl9CgoJam9pbl9wbGFuID0gbWFrZV9oYXNo am9pbih0bGlzdCwKCQkJCQkJCSAgam9pbmNsYXVzZXMsCgkJCQkJCQkgIG90aGVyY2xhdXNl cywKCQkJCQkJCSAgaGFzaGNsYXVzZXMsCgkJCQkJCQkgIGhhc2hvcGVyYXRvcnMsCgkJCQkJ CQkgIGhhc2hjb2xsYXRpb25zLAoJCQkJCQkJICBvdXRlcl9oYXNoa2V5cywKCQkJCQkJCSAg b3V0ZXJfcGxhbiwKCQkJCQkJCSAgKFBsYW4gKikgaGFzaF9wbGFuLAoJCQkJCQkJICBiZXN0 X3BhdGgtPmpwYXRoLmpvaW50eXBlLAoJCQkJCQkJICBiZXN0X3BhdGgtPmpwYXRoLmlubmVy X3VuaXF1ZSk7CgoJY29weV9nZW5lcmljX3BhdGhfaW5mbygmam9pbl9wbGFuLT5qb2luLnBs YW4sICZiZXN0X3BhdGgtPmpwYXRoLnBhdGgpOwoKCXJldHVybiBqb2luX3BsYW47Cn0KCgov KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioKICoKICoJU1VQUE9SVElORyBST1VUSU5FUwogKgog KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKiovCgovKgogKiByZXBsYWNlX25lc3Rsb29wX3BhcmFt cwogKgkgIFJlcGxhY2Ugb3V0ZXItcmVsYXRpb24gVmFycyBhbmQgUGxhY2VIb2xkZXJWYXJz IGluIHRoZSBnaXZlbiBleHByZXNzaW9uCiAqCSAgd2l0aCBuZXN0bG9vcCBQYXJhbXMKICoK ICogQWxsIFZhcnMgYW5kIFBsYWNlSG9sZGVyVmFycyBiZWxvbmdpbmcgdG8gdGhlIHJlbGF0 aW9uKHMpIGlkZW50aWZpZWQgYnkKICogcm9vdC0+Y3VyT3V0ZXJSZWxzIGFyZSByZXBsYWNl ZCBieSBQYXJhbXMsIGFuZCBlbnRyaWVzIGFyZSBhZGRlZCB0bwogKiByb290LT5jdXJPdXRl clBhcmFtcyBpZiBub3QgYWxyZWFkeSBwcmVzZW50LgogKi8Kc3RhdGljIE5vZGUgKgpyZXBs YWNlX25lc3Rsb29wX3BhcmFtcyhQbGFubmVySW5mbyAqcm9vdCwgTm9kZSAqZXhwcikKewoJ LyogTm8gc2V0dXAgbmVlZGVkIGZvciB0cmVlIHdhbGssIHNvIGF3YXkgd2UgZ28gKi8KCXJl dHVybiByZXBsYWNlX25lc3Rsb29wX3BhcmFtc19tdXRhdG9yKGV4cHIsIHJvb3QpOwp9Cgpz dGF0aWMgTm9kZSAqCnJlcGxhY2VfbmVzdGxvb3BfcGFyYW1zX211dGF0b3IoTm9kZSAqbm9k ZSwgUGxhbm5lckluZm8gKnJvb3QpCnsKCWlmIChub2RlID09IE5VTEwpCgkJcmV0dXJuIE5V TEw7CglpZiAoSXNBKG5vZGUsIFZhcikpCgl7CgkJVmFyCQkgICAqdmFyID0gKFZhciAqKSBu b2RlOwoKCQkvKiBVcHBlci1sZXZlbCBWYXJzIHNob3VsZCBiZSBsb25nIGdvbmUgYXQgdGhp cyBwb2ludCAqLwoJCUFzc2VydCh2YXItPnZhcmxldmVsc3VwID09IDApOwoJCS8qIElmIG5v dCB0byBiZSByZXBsYWNlZCwgd2UgY2FuIGp1c3QgcmV0dXJuIHRoZSBWYXIgdW5tb2RpZmll ZCAqLwoJCWlmIChJU19TUEVDSUFMX1ZBUk5PKHZhci0+dmFybm8pIHx8CgkJCSFibXNfaXNf bWVtYmVyKHZhci0+dmFybm8sIHJvb3QtPmN1ck91dGVyUmVscykpCgkJCXJldHVybiBub2Rl OwoJCS8qIFJlcGxhY2UgdGhlIFZhciB3aXRoIGEgbmVzdGxvb3AgUGFyYW0gKi8KCQlyZXR1 cm4gKE5vZGUgKikgcmVwbGFjZV9uZXN0bG9vcF9wYXJhbV92YXIocm9vdCwgdmFyKTsKCX0K CWlmIChJc0Eobm9kZSwgUGxhY2VIb2xkZXJWYXIpKQoJewoJCVBsYWNlSG9sZGVyVmFyICpw aHYgPSAoUGxhY2VIb2xkZXJWYXIgKikgbm9kZTsKCgkJLyogVXBwZXItbGV2ZWwgUGxhY2VI b2xkZXJWYXJzIHNob3VsZCBiZSBsb25nIGdvbmUgYXQgdGhpcyBwb2ludCAqLwoJCUFzc2Vy dChwaHYtPnBobGV2ZWxzdXAgPT0gMCk7CgoJCS8qIENoZWNrIHdoZXRoZXIgd2UgbmVlZCB0 byByZXBsYWNlIHRoZSBQSFYgKi8KCQlpZiAoIWJtc19pc19zdWJzZXQoZmluZF9wbGFjZWhv bGRlcl9pbmZvKHJvb3QsIHBodiktPnBoX2V2YWxfYXQsCgkJCQkJCSAgIHJvb3QtPmN1ck91 dGVyUmVscykpCgkJewoJCQkvKgoJCQkgKiBXZSBjYW4ndCByZXBsYWNlIHRoZSB3aG9sZSBQ SFYsIGJ1dCB3ZSBtaWdodCBzdGlsbCBuZWVkIHRvCgkJCSAqIHJlcGxhY2UgVmFycyBvciBQ SFZzIHdpdGhpbiBpdHMgZXhwcmVzc2lvbiwgaW4gY2FzZSBpdCBlbmRzIHVwCgkJCSAqIGFj dHVhbGx5IGdldHRpbmcgZXZhbHVhdGVkIGhlcmUuICAoSXQgbWlnaHQgZ2V0IGV2YWx1YXRl ZCBpbgoJCQkgKiB0aGlzIHBsYW4gbm9kZSwgb3Igc29tZSBjaGlsZCBub2RlOyBpbiB0aGUg bGF0dGVyIGNhc2Ugd2UgZG9uJ3QKCQkJICogcmVhbGx5IG5lZWQgdG8gcHJvY2VzcyB0aGUg ZXhwcmVzc2lvbiBoZXJlLCBidXQgd2UgaGF2ZW4ndCBnb3QKCQkJICogZW5vdWdoIGluZm8g dG8gdGVsbCBpZiB0aGF0J3MgdGhlIGNhc2UuKSAgRmxhdC1jb3B5IHRoZSBQSFYKCQkJICog bm9kZSBhbmQgdGhlbiByZWN1cnNlIG9uIGl0cyBleHByZXNzaW9uLgoJCQkgKgoJCQkgKiBO b3RlIHRoYXQgYWZ0ZXIgZG9pbmcgdGhpcywgd2UgbWlnaHQgaGF2ZSBkaWZmZXJlbnQKCQkJ ICogcmVwcmVzZW50YXRpb25zIG9mIHRoZSBjb250ZW50cyBvZiB0aGUgc2FtZSBQSFYgaW4g ZGlmZmVyZW50CgkJCSAqIHBhcnRzIG9mIHRoZSBwbGFuIHRyZWUuICBUaGlzIGlzIE9LIGJl Y2F1c2UgZXF1YWwoKSB3aWxsIGp1c3QKCQkJICogbWF0Y2ggb24gcGhpZC9waGxldmVsc3Vw LCBzbyBzZXRyZWZzLmMgd2lsbCBzdGlsbCByZWNvZ25pemUgYW4KCQkJICogdXBwZXItbGV2 ZWwgcmVmZXJlbmNlIHRvIGEgbG93ZXItbGV2ZWwgY29weSBvZiB0aGUgc2FtZSBQSFYuCgkJ CSAqLwoJCQlQbGFjZUhvbGRlclZhciAqbmV3cGh2ID0gbWFrZU5vZGUoUGxhY2VIb2xkZXJW YXIpOwoKCQkJbWVtY3B5KG5ld3BodiwgcGh2LCBzaXplb2YoUGxhY2VIb2xkZXJWYXIpKTsK CQkJbmV3cGh2LT5waGV4cHIgPSAoRXhwciAqKQoJCQkJcmVwbGFjZV9uZXN0bG9vcF9wYXJh bXNfbXV0YXRvcigoTm9kZSAqKSBwaHYtPnBoZXhwciwKCQkJCQkJCQkJCQkJcm9vdCk7CgkJ CXJldHVybiAoTm9kZSAqKSBuZXdwaHY7CgkJfQoJCS8qIFJlcGxhY2UgdGhlIFBsYWNlSG9s ZGVyVmFyIHdpdGggYSBuZXN0bG9vcCBQYXJhbSAqLwoJCXJldHVybiAoTm9kZSAqKSByZXBs YWNlX25lc3Rsb29wX3BhcmFtX3BsYWNlaG9sZGVydmFyKHJvb3QsIHBodik7Cgl9CglyZXR1 cm4gZXhwcmVzc2lvbl90cmVlX211dGF0b3Iobm9kZSwgcmVwbGFjZV9uZXN0bG9vcF9wYXJh bXNfbXV0YXRvciwgcm9vdCk7Cn0KCi8qCiAqIGZpeF9pbmRleHF1YWxfcmVmZXJlbmNlcwog KgkgIEFkanVzdCBpbmRleHF1YWwgY2xhdXNlcyB0byB0aGUgZm9ybSB0aGUgZXhlY3V0b3In cyBpbmRleHF1YWwKICoJICBtYWNoaW5lcnkgbmVlZHMuCiAqCiAqIFdlIGhhdmUgdGhyZWUg dGFza3MgaGVyZToKICoJKiBTZWxlY3QgdGhlIGFjdHVhbCBxdWFsIGNsYXVzZXMgb3V0IG9m IHRoZSBpbnB1dCBJbmRleENsYXVzZSBsaXN0LAogKgkgIGFuZCByZW1vdmUgUmVzdHJpY3RJ bmZvIG5vZGVzIGZyb20gdGhlIHF1YWwgY2xhdXNlcy4KICoJKiBSZXBsYWNlIGFueSBvdXRl ci1yZWxhdGlvbiBWYXIgb3IgUEhWIG5vZGVzIHdpdGggbmVzdGxvb3AgUGFyYW1zLgogKgkg IChYWFggZXZlbnR1YWxseSwgdGhhdCByZXNwb25zaWJpbGl0eSBzaG91bGQgZ28gZWxzZXdo ZXJlPykKICoJKiBJbmRleCBrZXlzIG11c3QgYmUgcmVwcmVzZW50ZWQgYnkgVmFyIG5vZGVz IHdpdGggdmFyYXR0bm8gc2V0IHRvIHRoZQogKgkgIGluZGV4J3MgYXR0cmlidXRlIG51bWJl ciwgbm90IHRoZSBhdHRyaWJ1dGUgbnVtYmVyIGluIHRoZSBvcmlnaW5hbCByZWwuCiAqCiAq ICpzdHJpcHBlZF9pbmRleHF1YWxzX3AgcmVjZWl2ZXMgYSBsaXN0IG9mIHRoZSBhY3R1YWwg cXVhbCBjbGF1c2VzLgogKgogKiAqZml4ZWRfaW5kZXhxdWFsc19wIHJlY2VpdmVzIGEgbGlz dCBvZiB0aGUgYWRqdXN0ZWQgcXVhbHMuICBUaGlzIGlzIGEgY29weQogKiB0aGF0IHNoYXJl cyBubyBzdWJzdHJ1Y3R1cmUgd2l0aCB0aGUgb3JpZ2luYWw7IHRoaXMgaXMgbmVlZGVkIGlu IGNhc2UgdGhlcmUKICogYXJlIHN1YnBsYW5zIGluIGl0ICh3ZSBuZWVkIHR3byBzZXBhcmF0 ZSBjb3BpZXMgb2YgdGhlIHN1YnBsYW4gdHJlZSwgb3IKICogdGhpbmdzIHdpbGwgZ28gYXdy eSkuCiAqLwpzdGF0aWMgdm9pZApmaXhfaW5kZXhxdWFsX3JlZmVyZW5jZXMoUGxhbm5lcklu Zm8gKnJvb3QsIEluZGV4UGF0aCAqaW5kZXhfcGF0aCwKCQkJCQkJIExpc3QgKipzdHJpcHBl ZF9pbmRleHF1YWxzX3AsIExpc3QgKipmaXhlZF9pbmRleHF1YWxzX3ApCnsKCUluZGV4T3B0 SW5mbyAqaW5kZXggPSBpbmRleF9wYXRoLT5pbmRleGluZm87CglMaXN0CSAgICpzdHJpcHBl ZF9pbmRleHF1YWxzOwoJTGlzdAkgICAqZml4ZWRfaW5kZXhxdWFsczsKCUxpc3RDZWxsICAg KmxjOwoKCXN0cmlwcGVkX2luZGV4cXVhbHMgPSBmaXhlZF9pbmRleHF1YWxzID0gTklMOwoK CWZvcmVhY2gobGMsIGluZGV4X3BhdGgtPmluZGV4Y2xhdXNlcykKCXsKCQlJbmRleENsYXVz ZSAqaWNsYXVzZSA9IGxmaXJzdF9ub2RlKEluZGV4Q2xhdXNlLCBsYyk7CgkJaW50CQkJaW5k ZXhjb2wgPSBpY2xhdXNlLT5pbmRleGNvbDsKCQlMaXN0Q2VsbCAgICpsYzI7CgoJCWZvcmVh Y2gobGMyLCBpY2xhdXNlLT5pbmRleHF1YWxzKQoJCXsKCQkJUmVzdHJpY3RJbmZvICpyaW5m byA9IGxmaXJzdF9ub2RlKFJlc3RyaWN0SW5mbywgbGMyKTsKCQkJTm9kZQkgICAqY2xhdXNl ID0gKE5vZGUgKikgcmluZm8tPmNsYXVzZTsKCgkJCXN0cmlwcGVkX2luZGV4cXVhbHMgPSBs YXBwZW5kKHN0cmlwcGVkX2luZGV4cXVhbHMsIGNsYXVzZSk7CgkJCWNsYXVzZSA9IGZpeF9p bmRleHF1YWxfY2xhdXNlKHJvb3QsIGluZGV4LCBpbmRleGNvbCwKCQkJCQkJCQkJCSAgY2xh dXNlLCBpY2xhdXNlLT5pbmRleGNvbHMpOwoJCQlmaXhlZF9pbmRleHF1YWxzID0gbGFwcGVu ZChmaXhlZF9pbmRleHF1YWxzLCBjbGF1c2UpOwoJCX0KCX0KCgkqc3RyaXBwZWRfaW5kZXhx dWFsc19wID0gc3RyaXBwZWRfaW5kZXhxdWFsczsKCSpmaXhlZF9pbmRleHF1YWxzX3AgPSBm aXhlZF9pbmRleHF1YWxzOwp9CgovKgogKiBmaXhfaW5kZXhvcmRlcmJ5X3JlZmVyZW5jZXMK ICoJICBBZGp1c3QgaW5kZXhvcmRlcmJ5IGNsYXVzZXMgdG8gdGhlIGZvcm0gdGhlIGV4ZWN1 dG9yJ3MgaW5kZXgKICoJICBtYWNoaW5lcnkgbmVlZHMuCiAqCiAqIFRoaXMgaXMgYSBzaW1w bGlmaWVkIHZlcnNpb24gb2YgZml4X2luZGV4cXVhbF9yZWZlcmVuY2VzLiAgVGhlIGlucHV0 IGlzCiAqIGJhcmUgY2xhdXNlcyBhbmQgYSBzZXBhcmF0ZSBpbmRleGNvbCBsaXN0LCBpbnN0 ZWFkIG9mIEluZGV4Q2xhdXNlcy4KICovCnN0YXRpYyBMaXN0ICoKZml4X2luZGV4b3JkZXJi eV9yZWZlcmVuY2VzKFBsYW5uZXJJbmZvICpyb290LCBJbmRleFBhdGggKmluZGV4X3BhdGgp CnsKCUluZGV4T3B0SW5mbyAqaW5kZXggPSBpbmRleF9wYXRoLT5pbmRleGluZm87CglMaXN0 CSAgICpmaXhlZF9pbmRleG9yZGVyYnlzOwoJTGlzdENlbGwgICAqbGNjLAoJCQkgICAqbGNp OwoKCWZpeGVkX2luZGV4b3JkZXJieXMgPSBOSUw7CgoJZm9yYm90aChsY2MsIGluZGV4X3Bh dGgtPmluZGV4b3JkZXJieXMsIGxjaSwgaW5kZXhfcGF0aC0+aW5kZXhvcmRlcmJ5Y29scykK CXsKCQlOb2RlCSAgICpjbGF1c2UgPSAoTm9kZSAqKSBsZmlyc3QobGNjKTsKCQlpbnQJCQlp bmRleGNvbCA9IGxmaXJzdF9pbnQobGNpKTsKCgkJY2xhdXNlID0gZml4X2luZGV4cXVhbF9j bGF1c2Uocm9vdCwgaW5kZXgsIGluZGV4Y29sLCBjbGF1c2UsIE5JTCk7CgkJZml4ZWRfaW5k ZXhvcmRlcmJ5cyA9IGxhcHBlbmQoZml4ZWRfaW5kZXhvcmRlcmJ5cywgY2xhdXNlKTsKCX0K CglyZXR1cm4gZml4ZWRfaW5kZXhvcmRlcmJ5czsKfQoKLyoKICogZml4X2luZGV4cXVhbF9j bGF1c2UKICoJICBDb252ZXJ0IGEgc2luZ2xlIGluZGV4cXVhbCBjbGF1c2UgdG8gdGhlIGZv cm0gbmVlZGVkIGJ5IHRoZSBleGVjdXRvci4KICoKICogV2UgcmVwbGFjZSBuZXN0bG9vcCBw YXJhbXMgaGVyZSwgYW5kIHJlcGxhY2UgdGhlIGluZGV4IGtleSB2YXJpYWJsZXMKICogb3Ig ZXhwcmVzc2lvbnMgYnkgaW5kZXggVmFyIG5vZGVzLgogKi8Kc3RhdGljIE5vZGUgKgpmaXhf aW5kZXhxdWFsX2NsYXVzZShQbGFubmVySW5mbyAqcm9vdCwgSW5kZXhPcHRJbmZvICppbmRl eCwgaW50IGluZGV4Y29sLAoJCQkJCSBOb2RlICpjbGF1c2UsIExpc3QgKmluZGV4Y29sbm9z KQp7CgkvKgoJICogUmVwbGFjZSBhbnkgb3V0ZXItcmVsYXRpb24gdmFyaWFibGVzIHdpdGgg bmVzdGxvb3AgcGFyYW1zLgoJICoKCSAqIFRoaXMgYWxzbyBtYWtlcyBhIGNvcHkgb2YgdGhl IGNsYXVzZSwgc28gaXQncyBzYWZlIHRvIG1vZGlmeSBpdAoJICogaW4tcGxhY2UgYmVsb3cu CgkgKi8KCWNsYXVzZSA9IHJlcGxhY2VfbmVzdGxvb3BfcGFyYW1zKHJvb3QsIGNsYXVzZSk7 CgoJaWYgKElzQShjbGF1c2UsIE9wRXhwcikpCgl7CgkJT3BFeHByCSAgICpvcCA9IChPcEV4 cHIgKikgY2xhdXNlOwoKCQkvKiBSZXBsYWNlIHRoZSBpbmRleGtleSBleHByZXNzaW9uIHdp dGggYW4gaW5kZXggVmFyLiAqLwoJCWxpbml0aWFsKG9wLT5hcmdzKSA9IGZpeF9pbmRleHF1 YWxfb3BlcmFuZChsaW5pdGlhbChvcC0+YXJncyksCgkJCQkJCQkJCQkJCSAgIGluZGV4LAoJ CQkJCQkJCQkJCQkgICBpbmRleGNvbCk7Cgl9CgllbHNlIGlmIChJc0EoY2xhdXNlLCBSb3dD b21wYXJlRXhwcikpCgl7CgkJUm93Q29tcGFyZUV4cHIgKnJjID0gKFJvd0NvbXBhcmVFeHBy ICopIGNsYXVzZTsKCQlMaXN0Q2VsbCAgICpsY2EsCgkJCQkgICAqbGNhaTsKCgkJLyogUmVw bGFjZSB0aGUgaW5kZXhrZXkgZXhwcmVzc2lvbnMgd2l0aCBpbmRleCBWYXJzLiAqLwoJCUFz c2VydChsaXN0X2xlbmd0aChyYy0+bGFyZ3MpID09IGxpc3RfbGVuZ3RoKGluZGV4Y29sbm9z KSk7CgkJZm9yYm90aChsY2EsIHJjLT5sYXJncywgbGNhaSwgaW5kZXhjb2xub3MpCgkJewoJ CQlsZmlyc3QobGNhKSA9IGZpeF9pbmRleHF1YWxfb3BlcmFuZChsZmlyc3QobGNhKSwKCQkJ CQkJCQkJCQkJaW5kZXgsCgkJCQkJCQkJCQkJCWxmaXJzdF9pbnQobGNhaSkpOwoJCX0KCX0K CWVsc2UgaWYgKElzQShjbGF1c2UsIFNjYWxhckFycmF5T3BFeHByKSkKCXsKCQlTY2FsYXJB cnJheU9wRXhwciAqc2FvcCA9IChTY2FsYXJBcnJheU9wRXhwciAqKSBjbGF1c2U7CgoJCS8q IFJlcGxhY2UgdGhlIGluZGV4a2V5IGV4cHJlc3Npb24gd2l0aCBhbiBpbmRleCBWYXIuICov CgkJbGluaXRpYWwoc2FvcC0+YXJncykgPSBmaXhfaW5kZXhxdWFsX29wZXJhbmQobGluaXRp YWwoc2FvcC0+YXJncyksCgkJCQkJCQkJCQkJCQkgaW5kZXgsCgkJCQkJCQkJCQkJCQkgaW5k ZXhjb2wpOwoJfQoJZWxzZSBpZiAoSXNBKGNsYXVzZSwgTnVsbFRlc3QpKQoJewoJCU51bGxU ZXN0ICAgKm50ID0gKE51bGxUZXN0ICopIGNsYXVzZTsKCgkJLyogUmVwbGFjZSB0aGUgaW5k ZXhrZXkgZXhwcmVzc2lvbiB3aXRoIGFuIGluZGV4IFZhci4gKi8KCQludC0+YXJnID0gKEV4 cHIgKikgZml4X2luZGV4cXVhbF9vcGVyYW5kKChOb2RlICopIG50LT5hcmcsCgkJCQkJCQkJ CQkJCSBpbmRleCwKCQkJCQkJCQkJCQkJIGluZGV4Y29sKTsKCX0KCWVsc2UKCQllbG9nKEVS Uk9SLCAidW5zdXBwb3J0ZWQgaW5kZXhxdWFsIHR5cGU6ICVkIiwKCQkJIChpbnQpIG5vZGVU YWcoY2xhdXNlKSk7CgoJcmV0dXJuIGNsYXVzZTsKfQoKLyoKICogZml4X2luZGV4cXVhbF9v cGVyYW5kCiAqCSAgQ29udmVydCBhbiBpbmRleHF1YWwgZXhwcmVzc2lvbiB0byBhIFZhciBy ZWZlcmVuY2luZyB0aGUgaW5kZXggY29sdW1uLgogKgogKiBXZSByZXByZXNlbnQgaW5kZXgg a2V5cyBieSBWYXIgbm9kZXMgaGF2aW5nIHZhcm5vID09IElOREVYX1ZBUiBhbmQgdmFyYXR0 bm8KICogZXF1YWwgdG8gdGhlIGluZGV4J3MgYXR0cmlidXRlIG51bWJlciAoaW5kZXggY29s dW1uIHBvc2l0aW9uKS4KICoKICogTW9zdCBvZiB0aGUgY29kZSBoZXJlIGlzIGp1c3QgZm9y IHNhbml0eSBjcm9zcy1jaGVja2luZyB0aGF0IHRoZSBnaXZlbgogKiBleHByZXNzaW9uIGFj dHVhbGx5IG1hdGNoZXMgdGhlIGluZGV4IGNvbHVtbiBpdCdzIGNsYWltZWQgdG8uICBJdCBz aG91bGQKICogbWF0Y2ggdGhlIGxvZ2ljIGluIG1hdGNoX2luZGV4X3RvX29wZXJhbmQoKS4K ICovCnN0YXRpYyBOb2RlICoKZml4X2luZGV4cXVhbF9vcGVyYW5kKE5vZGUgKm5vZGUsIElu ZGV4T3B0SW5mbyAqaW5kZXgsIGludCBpbmRleGNvbCkKewoJVmFyCQkgICAqcmVzdWx0OwoJ aW50CQkJcG9zOwoJTGlzdENlbGwgICAqaW5kZXhwcl9pdGVtOwoKCUFzc2VydChpbmRleGNv bCA+PSAwICYmIGluZGV4Y29sIDwgaW5kZXgtPm5jb2x1bW5zKTsKCgkvKgoJICogUmVtb3Zl IGFueSBQbGFjZUhvbGRlclZhciB3cmFwcGluZyBvZiB0aGUgaW5kZXhrZXkKCSAqLwoJbm9k ZSA9IHN0cmlwX25vb3BfcGh2cyhub2RlKTsKCgkvKgoJICogUmVtb3ZlIGFueSBiaW5hcnkt Y29tcGF0aWJsZSByZWxhYmVsaW5nIG9mIHRoZSBpbmRleGtleQoJICovCgl3aGlsZSAoSXNB KG5vZGUsIFJlbGFiZWxUeXBlKSkKCQlub2RlID0gKE5vZGUgKikgKChSZWxhYmVsVHlwZSAq KSBub2RlKS0+YXJnOwoKCWlmIChpbmRleC0+aW5kZXhrZXlzW2luZGV4Y29sXSAhPSAwKQoJ ewoJCS8qIEl0J3MgYSBzaW1wbGUgaW5kZXggY29sdW1uICovCgkJaWYgKElzQShub2RlLCBW YXIpICYmCgkJCSgoVmFyICopIG5vZGUpLT52YXJubyA9PSBpbmRleC0+cmVsLT5yZWxpZCAm JgoJCQkoKFZhciAqKSBub2RlKS0+dmFyYXR0bm8gPT0gaW5kZXgtPmluZGV4a2V5c1tpbmRl eGNvbF0pCgkJewoJCQlyZXN1bHQgPSAoVmFyICopIGNvcHlPYmplY3Qobm9kZSk7CgkJCXJl c3VsdC0+dmFybm8gPSBJTkRFWF9WQVI7CgkJCXJlc3VsdC0+dmFyYXR0bm8gPSBpbmRleGNv bCArIDE7CgkJCXJldHVybiAoTm9kZSAqKSByZXN1bHQ7CgkJfQoJCWVsc2UKCQkJZWxvZyhF UlJPUiwgImluZGV4IGtleSBkb2VzIG5vdCBtYXRjaCBleHBlY3RlZCBpbmRleCBjb2x1bW4i KTsKCX0KCgkvKiBJdCdzIGFuIGluZGV4IGV4cHJlc3Npb24sIHNvIGZpbmQgYW5kIGNyb3Nz LWNoZWNrIHRoZSBleHByZXNzaW9uICovCglpbmRleHByX2l0ZW0gPSBsaXN0X2hlYWQoaW5k ZXgtPmluZGV4cHJzRXhwYW5kKTsKCWZvciAocG9zID0gMDsgcG9zIDwgaW5kZXgtPm5jb2x1 bW5zOyBwb3MrKykKCXsKCQlpZiAoaW5kZXgtPmluZGV4a2V5c1twb3NdID09IDApCgkJewoJ CQlpZiAoaW5kZXhwcl9pdGVtID09IE5VTEwpCgkJCQllbG9nKEVSUk9SLCAidG9vIGZldyBl bnRyaWVzIGluIGluZGV4cHJzIGxpc3QiKTsKCQkJaWYgKHBvcyA9PSBpbmRleGNvbCkKCQkJ ewoJCQkJTm9kZQkgICAqaW5kZXhrZXk7CgoJCQkJaW5kZXhrZXkgPSAoTm9kZSAqKSBsZmly c3QoaW5kZXhwcl9pdGVtKTsKCQkJCWlmIChpbmRleGtleSAmJiBJc0EoaW5kZXhrZXksIFJl bGFiZWxUeXBlKSkKCQkJCQlpbmRleGtleSA9IChOb2RlICopICgoUmVsYWJlbFR5cGUgKikg aW5kZXhrZXkpLT5hcmc7CgkJCQlpZiAoZXF1YWwobm9kZSwgaW5kZXhrZXkpKQoJCQkJewoJ CQkJCXJlc3VsdCA9IG1ha2VWYXIoSU5ERVhfVkFSLCBpbmRleGNvbCArIDEsCgkJCQkJCQkJ CSBleHByVHlwZShsZmlyc3QoaW5kZXhwcl9pdGVtKSksIC0xLAoJCQkJCQkJCQkgZXhwckNv bGxhdGlvbihsZmlyc3QoaW5kZXhwcl9pdGVtKSksCgkJCQkJCQkJCSAwKTsKCQkJCQlyZXR1 cm4gKE5vZGUgKikgcmVzdWx0OwoJCQkJfQoJCQkJZWxzZQoJCQkJCWVsb2coRVJST1IsICJp bmRleCBrZXkgZG9lcyBub3QgbWF0Y2ggZXhwZWN0ZWQgaW5kZXggY29sdW1uIik7CgkJCX0K CQkJaW5kZXhwcl9pdGVtID0gbG5leHQoaW5kZXgtPmluZGV4cHJzRXhwYW5kLCBpbmRleHBy X2l0ZW0pOwoJCX0KCX0KCgkvKiBPb3BzLi4uICovCgllbG9nKEVSUk9SLCAiaW5kZXgga2V5 IGRvZXMgbm90IG1hdGNoIGV4cGVjdGVkIGluZGV4IGNvbHVtbiIpOwoJcmV0dXJuIE5VTEw7 CQkJCS8qIGtlZXAgY29tcGlsZXIgcXVpZXQgKi8KfQoKLyoKICogZ2V0X3N3aXRjaGVkX2Ns YXVzZXMKICoJICBHaXZlbiBhIGxpc3Qgb2YgbWVyZ2Ugb3IgaGFzaCBqb2luY2xhdXNlcyAo YXMgUmVzdHJpY3RJbmZvIG5vZGVzKSwKICoJICBleHRyYWN0IHRoZSBiYXJlIGNsYXVzZXMs IGFuZCByZWFycmFuZ2UgdGhlIGVsZW1lbnRzIHdpdGhpbiB0aGUKICoJICBjbGF1c2VzLCBp ZiBuZWVkZWQsIHNvIHRoZSBvdXRlciBqb2luIHZhcmlhYmxlIGlzIG9uIHRoZSBsZWZ0IGFu ZAogKgkgIHRoZSBpbm5lciBpcyBvbiB0aGUgcmlnaHQuICBUaGUgb3JpZ2luYWwgY2xhdXNl IGRhdGEgc3RydWN0dXJlIGlzIG5vdAogKgkgIHRvdWNoZWQ7IGEgbW9kaWZpZWQgbGlzdCBp cyByZXR1cm5lZC4gIFdlIGRvLCBob3dldmVyLCBzZXQgdGhlIHRyYW5zaWVudAogKgkgIG91 dGVyX2lzX2xlZnQgZmllbGQgaW4gZWFjaCBSZXN0cmljdEluZm8gdG8gc2hvdyB3aGljaCBz aWRlIHdhcyB3aGljaC4KICovCnN0YXRpYyBMaXN0ICoKZ2V0X3N3aXRjaGVkX2NsYXVzZXMo TGlzdCAqY2xhdXNlcywgUmVsaWRzIG91dGVycmVsaWRzKQp7CglMaXN0CSAgICp0X2xpc3Qg PSBOSUw7CglMaXN0Q2VsbCAgICpsOwoKCWZvcmVhY2gobCwgY2xhdXNlcykKCXsKCQlSZXN0 cmljdEluZm8gKnJlc3RyaWN0aW5mbyA9IChSZXN0cmljdEluZm8gKikgbGZpcnN0KGwpOwoJ CU9wRXhwcgkgICAqY2xhdXNlID0gKE9wRXhwciAqKSByZXN0cmljdGluZm8tPmNsYXVzZTsK CgkJQXNzZXJ0KGlzX29wY2xhdXNlKGNsYXVzZSkpOwoJCWlmIChibXNfaXNfc3Vic2V0KHJl c3RyaWN0aW5mby0+cmlnaHRfcmVsaWRzLCBvdXRlcnJlbGlkcykpCgkJewoJCQkvKgoJCQkg KiBEdXBsaWNhdGUganVzdCBlbm91Z2ggb2YgdGhlIHN0cnVjdHVyZSB0byBhbGxvdyBjb21t dXRpbmcgdGhlCgkJCSAqIGNsYXVzZSB3aXRob3V0IGNoYW5naW5nIHRoZSBvcmlnaW5hbCBs aXN0LiAgQ291bGQgdXNlCgkJCSAqIGNvcHlPYmplY3QsIGJ1dCBhIGNvbXBsZXRlIGRlZXAg Y29weSBpcyBvdmVya2lsbC4KCQkJICovCgkJCU9wRXhwcgkgICAqdGVtcCA9IG1ha2VOb2Rl KE9wRXhwcik7CgoJCQl0ZW1wLT5vcG5vID0gY2xhdXNlLT5vcG5vOwoJCQl0ZW1wLT5vcGZ1 bmNpZCA9IEludmFsaWRPaWQ7CgkJCXRlbXAtPm9wcmVzdWx0dHlwZSA9IGNsYXVzZS0+b3By ZXN1bHR0eXBlOwoJCQl0ZW1wLT5vcHJldHNldCA9IGNsYXVzZS0+b3ByZXRzZXQ7CgkJCXRl bXAtPm9wY29sbGlkID0gY2xhdXNlLT5vcGNvbGxpZDsKCQkJdGVtcC0+aW5wdXRjb2xsaWQg PSBjbGF1c2UtPmlucHV0Y29sbGlkOwoJCQl0ZW1wLT5hcmdzID0gbGlzdF9jb3B5KGNsYXVz ZS0+YXJncyk7CgkJCXRlbXAtPmxvY2F0aW9uID0gY2xhdXNlLT5sb2NhdGlvbjsKCQkJLyog Q29tbXV0ZSBpdCAtLS0gbm90ZSB0aGlzIG1vZGlmaWVzIHRoZSB0ZW1wIG5vZGUgaW4tcGxh Y2UuICovCgkJCUNvbW11dGVPcEV4cHIodGVtcCk7CgkJCXRfbGlzdCA9IGxhcHBlbmQodF9s aXN0LCB0ZW1wKTsKCQkJcmVzdHJpY3RpbmZvLT5vdXRlcl9pc19sZWZ0ID0gZmFsc2U7CgkJ fQoJCWVsc2UKCQl7CgkJCUFzc2VydChibXNfaXNfc3Vic2V0KHJlc3RyaWN0aW5mby0+bGVm dF9yZWxpZHMsIG91dGVycmVsaWRzKSk7CgkJCXRfbGlzdCA9IGxhcHBlbmQodF9saXN0LCBj bGF1c2UpOwoJCQlyZXN0cmljdGluZm8tPm91dGVyX2lzX2xlZnQgPSB0cnVlOwoJCX0KCX0K CXJldHVybiB0X2xpc3Q7Cn0KCi8qCiAqIG9yZGVyX3F1YWxfY2xhdXNlcwogKgkJR2l2ZW4g YSBsaXN0IG9mIHF1YWwgY2xhdXNlcyB0aGF0IHdpbGwgYWxsIGJlIGV2YWx1YXRlZCBhdCB0 aGUgc2FtZQogKgkJcGxhbiBub2RlLCBzb3J0IHRoZSBsaXN0IGludG8gdGhlIG9yZGVyIHdl IHdhbnQgdG8gY2hlY2sgdGhlIHF1YWxzCiAqCQlpbiBhdCBydW50aW1lLgogKgogKiBXaGVu IHNlY3VyaXR5IGJhcnJpZXIgcXVhbHMgYXJlIHVzZWQgaW4gdGhlIHF1ZXJ5LCB3ZSBtYXkg aGF2ZSBxdWFscyB3aXRoCiAqIGRpZmZlcmVudCBzZWN1cml0eSBsZXZlbHMgaW4gdGhlIGxp c3QuICBRdWFscyBvZiBsb3dlciBzZWN1cml0eV9sZXZlbAogKiBtdXN0IGdvIGJlZm9yZSBx dWFscyBvZiBoaWdoZXIgc2VjdXJpdHlfbGV2ZWwsIGV4Y2VwdCB0aGF0IHdlIGNhbiBncmFu dAogKiBleGNlcHRpb25zIHRvIG1vdmUgdXAgcXVhbHMgdGhhdCBhcmUgbGVha3Byb29mLiAg V2hlbiBzZWN1cml0eSBsZXZlbAogKiBkb2Vzbid0IGZvcmNlIHRoZSBkZWNpc2lvbiwgd2Ug cHJlZmVyIHRvIG9yZGVyIGNsYXVzZXMgYnkgZXN0aW1hdGVkCiAqIGV4ZWN1dGlvbiBjb3N0 LCBjaGVhcGVzdCBmaXJzdC4KICoKICogSWRlYWxseSB0aGUgb3JkZXIgc2hvdWxkIGJlIGRy aXZlbiBieSBhIGNvbWJpbmF0aW9uIG9mIGV4ZWN1dGlvbiBjb3N0IGFuZAogKiBzZWxlY3Rp dml0eSwgYnV0IGl0J3Mgbm90IGltbWVkaWF0ZWx5IGNsZWFyIGhvdyB0byBhY2NvdW50IGZv ciBib3RoLAogKiBhbmQgZ2l2ZW4gdGhlIHVuY2VydGFpbnR5IG9mIHRoZSBlc3RpbWF0ZXMg dGhlIHJlbGlhYmlsaXR5IG9mIHRoZSBkZWNpc2lvbnMKICogd291bGQgYmUgZG91YnRmdWwg YW55d2F5LiAgU28gd2UganVzdCBvcmRlciBieSBzZWN1cml0eSBsZXZlbCB0aGVuCiAqIGVz dGltYXRlZCBwZXItdHVwbGUgY29zdCwgYmVpbmcgY2FyZWZ1bCBub3QgdG8gY2hhbmdlIHRo ZSBvcmRlciB3aGVuCiAqIChhcyBpcyBvZnRlbiB0aGUgY2FzZSkgdGhlIGVzdGltYXRlcyBh cmUgaWRlbnRpY2FsLgogKgogKiBBbHRob3VnaCB0aGlzIHdpbGwgd29yayBvbiBlaXRoZXIg YmFyZSBjbGF1c2VzIG9yIFJlc3RyaWN0SW5mb3MsIGl0J3MKICogbXVjaCBmYXN0ZXIgdG8g YXBwbHkgaXQgdG8gUmVzdHJpY3RJbmZvcywgc2luY2UgaXQgY2FuIHJlLXVzZSBjb3N0CiAq IGluZm9ybWF0aW9uIHRoYXQgaXMgY2FjaGVkIGluIFJlc3RyaWN0SW5mb3MuICBYWFggaW4g dGhlIGJhcmUtY2xhdXNlCiAqIGNhc2UsIHdlIGFyZSBhbHNvIG5vdCBhYmxlIHRvIGFwcGx5 IHNlY3VyaXR5IGNvbnNpZGVyYXRpb25zLiAgVGhhdCBpcwogKiBhbGwgcmlnaHQgZm9yIHRo ZSBtb21lbnQsIGJlY2F1c2UgdGhlIGJhcmUtY2xhdXNlIGNhc2UgZG9lc24ndCBvY2N1cgog KiBhbnl3aGVyZSB0aGF0IGJhcnJpZXIgcXVhbHMgY291bGQgYmUgcHJlc2VudCwgYnV0IGl0 IHdvdWxkIGJlIGJldHRlciB0bwogKiBnZXQgcmlkIG9mIGl0LgogKgogKiBOb3RlOiBzb21l IGNhbGxlcnMgcGFzcyBsaXN0cyB0aGF0IGNvbnRhaW4gZW50cmllcyB0aGF0IHdpbGwgbGF0 ZXIgYmUKICogcmVtb3ZlZDsgdGhpcyBpcyB0aGUgZWFzaWVzdCB3YXkgdG8gbGV0IHRoaXMg cm91dGluZSBzZWUgUmVzdHJpY3RJbmZvcwogKiBpbnN0ZWFkIG9mIGJhcmUgY2xhdXNlcy4g IFRoaXMgaXMgYW5vdGhlciByZWFzb24gd2h5IHRyeWluZyB0byBjb25zaWRlcgogKiBzZWxl Y3Rpdml0eSBpbiB0aGUgb3JkZXJpbmcgd291bGQgbGlrZWx5IGRvIHRoZSB3cm9uZyB0aGlu Zy4KICovCnN0YXRpYyBMaXN0ICoKb3JkZXJfcXVhbF9jbGF1c2VzKFBsYW5uZXJJbmZvICpy b290LCBMaXN0ICpjbGF1c2VzKQp7Cgl0eXBlZGVmIHN0cnVjdAoJewoJCU5vZGUJICAgKmNs YXVzZTsKCQlDb3N0CQljb3N0OwoJCUluZGV4CQlzZWN1cml0eV9sZXZlbDsKCX0gUXVhbEl0 ZW07CglpbnQJCQluaXRlbXMgPSBsaXN0X2xlbmd0aChjbGF1c2VzKTsKCVF1YWxJdGVtICAg Kml0ZW1zOwoJTGlzdENlbGwgICAqbGM7CglpbnQJCQlpOwoJTGlzdAkgICAqcmVzdWx0OwoK CS8qIE5vIG5lZWQgdG8gd29yayBoYXJkIGZvciAwIG9yIDEgY2xhdXNlICovCglpZiAobml0 ZW1zIDw9IDEpCgkJcmV0dXJuIGNsYXVzZXM7CgoJLyoKCSAqIENvbGxlY3QgdGhlIGl0ZW1z IGFuZCBjb3N0cyBpbnRvIGFuIGFycmF5LiAgVGhpcyBpcyB0byBhdm9pZCByZXBlYXRlZAoJ ICogY29zdF9xdWFsX2V2YWwgd29yayBpZiB0aGUgaW5wdXRzIGFyZW4ndCBSZXN0cmljdElu Zm9zLgoJICovCglpdGVtcyA9IChRdWFsSXRlbSAqKSBwYWxsb2Mobml0ZW1zICogc2l6ZW9m KFF1YWxJdGVtKSk7CglpID0gMDsKCWZvcmVhY2gobGMsIGNsYXVzZXMpCgl7CgkJTm9kZQkg ICAqY2xhdXNlID0gKE5vZGUgKikgbGZpcnN0KGxjKTsKCQlRdWFsQ29zdAlxY29zdDsKCgkJ Y29zdF9xdWFsX2V2YWxfbm9kZSgmcWNvc3QsIGNsYXVzZSwgcm9vdCk7CgkJaXRlbXNbaV0u Y2xhdXNlID0gY2xhdXNlOwoJCWl0ZW1zW2ldLmNvc3QgPSBxY29zdC5wZXJfdHVwbGU7CgkJ aWYgKElzQShjbGF1c2UsIFJlc3RyaWN0SW5mbykpCgkJewoJCQlSZXN0cmljdEluZm8gKnJp bmZvID0gKFJlc3RyaWN0SW5mbyAqKSBjbGF1c2U7CgoJCQkvKgoJCQkgKiBJZiBhIGNsYXVz ZSBpcyBsZWFrcHJvb2YsIGl0IGRvZXNuJ3QgaGF2ZSB0byBiZSBjb25zdHJhaW5lZCBieQoJ CQkgKiBpdHMgbm9taW5hbCBzZWN1cml0eSBsZXZlbC4gIElmIGl0J3MgYWxzbyByZWFzb25h Ymx5IGNoZWFwCgkJCSAqIChoZXJlIGRlZmluZWQgYXMgMTBYIGNwdV9vcGVyYXRvcl9jb3N0 KSwgcHJldGVuZCBpdCBoYXMKCQkJICogc2VjdXJpdHlfbGV2ZWwgMCwgd2hpY2ggd2lsbCBh bGxvdyBpdCB0byBnbyBpbiBmcm9udCBvZgoJCQkgKiBtb3JlLWV4cGVuc2l2ZSBxdWFscyBv ZiBsb3dlciBzZWN1cml0eSBsZXZlbHMuICBPZiBjb3Vyc2UsIHRoYXQKCQkJICogd2lsbCBh bHNvIGZvcmNlIGl0IHRvIGdvIGluIGZyb250IG9mIGNoZWFwZXIgcXVhbHMgb2YgaXRzIG93 bgoJCQkgKiBzZWN1cml0eSBsZXZlbCwgd2hpY2ggaXMgbm90IHNvIGdyZWF0LCBidXQgd2Ug Y2FuIGFsbGV2aWF0ZQoJCQkgKiB0aGF0IHJpc2sgYnkgYXBwbHlpbmcgdGhlIGNvc3QgbGlt aXQgY3V0b2ZmLgoJCQkgKi8KCQkJaWYgKHJpbmZvLT5sZWFrcHJvb2YgJiYgaXRlbXNbaV0u Y29zdCA8IDEwICogY3B1X29wZXJhdG9yX2Nvc3QpCgkJCQlpdGVtc1tpXS5zZWN1cml0eV9s ZXZlbCA9IDA7CgkJCWVsc2UKCQkJCWl0ZW1zW2ldLnNlY3VyaXR5X2xldmVsID0gcmluZm8t PnNlY3VyaXR5X2xldmVsOwoJCX0KCQllbHNlCgkJCWl0ZW1zW2ldLnNlY3VyaXR5X2xldmVs ID0gMDsKCQlpKys7Cgl9CgoJLyoKCSAqIFNvcnQuICBXZSBkb24ndCB1c2UgcXNvcnQoKSBi ZWNhdXNlIGl0J3Mgbm90IGd1YXJhbnRlZWQgc3RhYmxlIGZvcgoJICogZXF1YWwga2V5cy4g IFRoZSBleHBlY3RlZCBudW1iZXIgb2YgZW50cmllcyBpcyBzbWFsbCBlbm91Z2ggdGhhdCBh CgkgKiBzaW1wbGUgaW5zZXJ0aW9uIHNvcnQgc2hvdWxkIGJlIGdvb2QgZW5vdWdoLgoJICov Cglmb3IgKGkgPSAxOyBpIDwgbml0ZW1zOyBpKyspCgl7CgkJUXVhbEl0ZW0JbmV3aXRlbSA9 IGl0ZW1zW2ldOwoJCWludAkJCWo7CgoJCS8qIGluc2VydCBuZXdpdGVtIGludG8gdGhlIGFs cmVhZHktc29ydGVkIHN1YmFycmF5ICovCgkJZm9yIChqID0gaTsgaiA+IDA7IGotLSkKCQl7 CgkJCVF1YWxJdGVtICAgKm9sZGl0ZW0gPSAmaXRlbXNbaiAtIDFdOwoKCQkJaWYgKG5ld2l0 ZW0uc2VjdXJpdHlfbGV2ZWwgPiBvbGRpdGVtLT5zZWN1cml0eV9sZXZlbCB8fAoJCQkJKG5l d2l0ZW0uc2VjdXJpdHlfbGV2ZWwgPT0gb2xkaXRlbS0+c2VjdXJpdHlfbGV2ZWwgJiYKCQkJ CSBuZXdpdGVtLmNvc3QgPj0gb2xkaXRlbS0+Y29zdCkpCgkJCQlicmVhazsKCQkJaXRlbXNb al0gPSAqb2xkaXRlbTsKCQl9CgkJaXRlbXNbal0gPSBuZXdpdGVtOwoJfQoKCS8qIENvbnZl cnQgYmFjayB0byBhIGxpc3QgKi8KCXJlc3VsdCA9IE5JTDsKCWZvciAoaSA9IDA7IGkgPCBu aXRlbXM7IGkrKykKCQlyZXN1bHQgPSBsYXBwZW5kKHJlc3VsdCwgaXRlbXNbaV0uY2xhdXNl KTsKCglyZXR1cm4gcmVzdWx0Owp9CgovKgogKiBDb3B5IGNvc3QgYW5kIHNpemUgaW5mbyBm cm9tIGEgUGF0aCBub2RlIHRvIHRoZSBQbGFuIG5vZGUgY3JlYXRlZCBmcm9tIGl0LgogKiBU aGUgZXhlY3V0b3IgdXN1YWxseSB3b24ndCB1c2UgdGhpcyBpbmZvLCBidXQgaXQncyBuZWVk ZWQgYnkgRVhQTEFJTi4KICogQWxzbyBjb3B5IHRoZSBwYXJhbGxlbC1yZWxhdGVkIGZsYWdz LCB3aGljaCB0aGUgZXhlY3V0b3IgKndpbGwqIHVzZS4KICovCnN0YXRpYyB2b2lkCmNvcHlf Z2VuZXJpY19wYXRoX2luZm8oUGxhbiAqZGVzdCwgUGF0aCAqc3JjKQp7CglkZXN0LT5kaXNh YmxlZF9ub2RlcyA9IHNyYy0+ZGlzYWJsZWRfbm9kZXM7CglkZXN0LT5zdGFydHVwX2Nvc3Qg PSBzcmMtPnN0YXJ0dXBfY29zdDsKCWRlc3QtPnRvdGFsX2Nvc3QgPSBzcmMtPnRvdGFsX2Nv c3Q7CglkZXN0LT5wbGFuX3Jvd3MgPSBzcmMtPnJvd3M7CglkZXN0LT5wbGFuX3dpZHRoID0g c3JjLT5wYXRodGFyZ2V0LT53aWR0aDsKCWRlc3QtPnBhcmFsbGVsX2F3YXJlID0gc3JjLT5w YXJhbGxlbF9hd2FyZTsKCWRlc3QtPnBhcmFsbGVsX3NhZmUgPSBzcmMtPnBhcmFsbGVsX3Nh ZmU7Cn0KCi8qCiAqIENvcHkgY29zdCBhbmQgc2l6ZSBpbmZvIGZyb20gYSBsb3dlciBwbGFu IG5vZGUgdG8gYW4gaW5zZXJ0ZWQgbm9kZS4KICogKE1vc3QgY2FsbGVycyBhbHRlciB0aGUg aW5mbyBhZnRlciBjb3B5aW5nIGl0LikKICovCnN0YXRpYyB2b2lkCmNvcHlfcGxhbl9jb3N0 c2l6ZShQbGFuICpkZXN0LCBQbGFuICpzcmMpCnsKCWRlc3QtPmRpc2FibGVkX25vZGVzID0g c3JjLT5kaXNhYmxlZF9ub2RlczsKCWRlc3QtPnN0YXJ0dXBfY29zdCA9IHNyYy0+c3RhcnR1 cF9jb3N0OwoJZGVzdC0+dG90YWxfY29zdCA9IHNyYy0+dG90YWxfY29zdDsKCWRlc3QtPnBs YW5fcm93cyA9IHNyYy0+cGxhbl9yb3dzOwoJZGVzdC0+cGxhbl93aWR0aCA9IHNyYy0+cGxh bl93aWR0aDsKCS8qIEFzc3VtZSB0aGUgaW5zZXJ0ZWQgbm9kZSBpcyBub3QgcGFyYWxsZWwt YXdhcmUuICovCglkZXN0LT5wYXJhbGxlbF9hd2FyZSA9IGZhbHNlOwoJLyogQXNzdW1lIHRo ZSBpbnNlcnRlZCBub2RlIGlzIHBhcmFsbGVsLXNhZmUsIGlmIGNoaWxkIHBsYW4gaXMuICov CglkZXN0LT5wYXJhbGxlbF9zYWZlID0gc3JjLT5wYXJhbGxlbF9zYWZlOwp9CgovKgogKiBT b21lIHBsYWNlcyBpbiB0aGlzIGZpbGUgYnVpbGQgU29ydCBub2RlcyB0aGF0IGRvbid0IGhh dmUgYSBkaXJlY3RseQogKiBjb3JyZXNwb25kaW5nIFBhdGggbm9kZS4gIFRoZSBjb3N0IG9m IHRoZSBzb3J0IGlzLCBvciBzaG91bGQgaGF2ZSBiZWVuLAogKiBpbmNsdWRlZCBpbiB0aGUg Y29zdCBvZiB0aGUgUGF0aCBub2RlIHdlJ3JlIHdvcmtpbmcgZnJvbSwgYnV0IHNpbmNlIGl0 J3MKICogbm90IHNwbGl0IG91dCwgd2UgaGF2ZSB0byByZS1maWd1cmUgaXQgdXNpbmcgY29z dF9zb3J0KCkuICBUaGlzIGlzIGp1c3QKICogdG8gbGFiZWwgdGhlIFNvcnQgbm9kZSBuaWNl bHkgZm9yIEVYUExBSU4uCiAqCiAqIGxpbWl0X3R1cGxlcyBpcyBhcyBmb3IgY29zdF9zb3J0 IChpbiBwYXJ0aWN1bGFyLCBwYXNzIC0xIGlmIG5vIGxpbWl0KQogKi8Kc3RhdGljIHZvaWQK bGFiZWxfc29ydF93aXRoX2Nvc3RzaXplKFBsYW5uZXJJbmZvICpyb290LCBTb3J0ICpwbGFu LCBkb3VibGUgbGltaXRfdHVwbGVzKQp7CglQbGFuCSAgICpsZWZ0dHJlZSA9IHBsYW4tPnBs YW4ubGVmdHRyZWU7CglQYXRoCQlzb3J0X3BhdGg7CQkvKiBkdW1teSBmb3IgcmVzdWx0IG9m IGNvc3Rfc29ydCAqLwoKCUFzc2VydChJc0EocGxhbiwgU29ydCkpOwoKCWNvc3Rfc29ydCgm c29ydF9wYXRoLCByb290LCBOSUwsCgkJCSAgcGxhbi0+cGxhbi5kaXNhYmxlZF9ub2RlcywK CQkJICBsZWZ0dHJlZS0+dG90YWxfY29zdCwKCQkJICBsZWZ0dHJlZS0+cGxhbl9yb3dzLAoJ CQkgIGxlZnR0cmVlLT5wbGFuX3dpZHRoLAoJCQkgIDAuMCwKCQkJICB3b3JrX21lbSwKCQkJ ICBsaW1pdF90dXBsZXMpOwoJcGxhbi0+cGxhbi5zdGFydHVwX2Nvc3QgPSBzb3J0X3BhdGgu c3RhcnR1cF9jb3N0OwoJcGxhbi0+cGxhbi50b3RhbF9jb3N0ID0gc29ydF9wYXRoLnRvdGFs X2Nvc3Q7CglwbGFuLT5wbGFuLnBsYW5fcm93cyA9IGxlZnR0cmVlLT5wbGFuX3Jvd3M7Cglw bGFuLT5wbGFuLnBsYW5fd2lkdGggPSBsZWZ0dHJlZS0+cGxhbl93aWR0aDsKCXBsYW4tPnBs YW4ucGFyYWxsZWxfYXdhcmUgPSBmYWxzZTsKCXBsYW4tPnBsYW4ucGFyYWxsZWxfc2FmZSA9 IGxlZnR0cmVlLT5wYXJhbGxlbF9zYWZlOwp9CgovKgogKiBTYW1lIGFzIGxhYmVsX3NvcnRf d2l0aF9jb3N0c2l6ZSwgYnV0IGxhYmVscyB0aGUgSW5jcmVtZW50YWxTb3J0IG5vZGUKICog aW5zdGVhZC4KICovCnN0YXRpYyB2b2lkCmxhYmVsX2luY3JlbWVudGFsc29ydF93aXRoX2Nv c3RzaXplKFBsYW5uZXJJbmZvICpyb290LCBJbmNyZW1lbnRhbFNvcnQgKnBsYW4sCgkJCQkJ CQkJCUxpc3QgKnBhdGhrZXlzLCBkb3VibGUgbGltaXRfdHVwbGVzKQp7CglQbGFuCSAgICps ZWZ0dHJlZSA9IHBsYW4tPnNvcnQucGxhbi5sZWZ0dHJlZTsKCVBhdGgJCXNvcnRfcGF0aDsJ CS8qIGR1bW15IGZvciByZXN1bHQgb2YgY29zdF9pbmNyZW1lbnRhbF9zb3J0ICovCgoJQXNz ZXJ0KElzQShwbGFuLCBJbmNyZW1lbnRhbFNvcnQpKTsKCgljb3N0X2luY3JlbWVudGFsX3Nv cnQoJnNvcnRfcGF0aCwgcm9vdCwgcGF0aGtleXMsCgkJCQkJCSAgcGxhbi0+blByZXNvcnRl ZENvbHMsCgkJCQkJCSAgcGxhbi0+c29ydC5wbGFuLmRpc2FibGVkX25vZGVzLAoJCQkJCQkg IGxlZnR0cmVlLT5zdGFydHVwX2Nvc3QsCgkJCQkJCSAgbGVmdHRyZWUtPnRvdGFsX2Nvc3Qs CgkJCQkJCSAgbGVmdHRyZWUtPnBsYW5fcm93cywKCQkJCQkJICBsZWZ0dHJlZS0+cGxhbl93 aWR0aCwKCQkJCQkJICAwLjAsCgkJCQkJCSAgd29ya19tZW0sCgkJCQkJCSAgbGltaXRfdHVw bGVzKTsKCXBsYW4tPnNvcnQucGxhbi5zdGFydHVwX2Nvc3QgPSBzb3J0X3BhdGguc3RhcnR1 cF9jb3N0OwoJcGxhbi0+c29ydC5wbGFuLnRvdGFsX2Nvc3QgPSBzb3J0X3BhdGgudG90YWxf Y29zdDsKCXBsYW4tPnNvcnQucGxhbi5wbGFuX3Jvd3MgPSBsZWZ0dHJlZS0+cGxhbl9yb3dz OwoJcGxhbi0+c29ydC5wbGFuLnBsYW5fd2lkdGggPSBsZWZ0dHJlZS0+cGxhbl93aWR0aDsK CXBsYW4tPnNvcnQucGxhbi5wYXJhbGxlbF9hd2FyZSA9IGZhbHNlOwoJcGxhbi0+c29ydC5w bGFuLnBhcmFsbGVsX3NhZmUgPSBsZWZ0dHJlZS0+cGFyYWxsZWxfc2FmZTsKfQoKLyoKICog Yml0bWFwX3N1YnBsYW5fbWFya19zaGFyZWQKICoJIFNldCBpc3NoYXJlZCBmbGFnIGluIGJp dG1hcCBzdWJwbGFuIHNvIHRoYXQgaXQgd2lsbCBiZSBjcmVhdGVkIGluCiAqCSBzaGFyZWQg bWVtb3J5LgogKi8Kc3RhdGljIHZvaWQKYml0bWFwX3N1YnBsYW5fbWFya19zaGFyZWQoUGxh biAqcGxhbikKewoJaWYgKElzQShwbGFuLCBCaXRtYXBBbmQpKQoJCWJpdG1hcF9zdWJwbGFu X21hcmtfc2hhcmVkKGxpbml0aWFsKCgoQml0bWFwQW5kICopIHBsYW4pLT5iaXRtYXBwbGFu cykpOwoJZWxzZSBpZiAoSXNBKHBsYW4sIEJpdG1hcE9yKSkKCXsKCQkoKEJpdG1hcE9yICop IHBsYW4pLT5pc3NoYXJlZCA9IHRydWU7CgkJYml0bWFwX3N1YnBsYW5fbWFya19zaGFyZWQo bGluaXRpYWwoKChCaXRtYXBPciAqKSBwbGFuKS0+Yml0bWFwcGxhbnMpKTsKCX0KCWVsc2Ug aWYgKElzQShwbGFuLCBCaXRtYXBJbmRleFNjYW4pKQoJCSgoQml0bWFwSW5kZXhTY2FuICop IHBsYW4pLT5pc3NoYXJlZCA9IHRydWU7CgllbHNlCgkJZWxvZyhFUlJPUiwgInVucmVjb2du aXplZCBub2RlIHR5cGU6ICVkIiwgbm9kZVRhZyhwbGFuKSk7Cn0KCi8qKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKgogKgogKglQTEFOIE5PREUgQlVJTERJTkcgUk9VVElORVMKICoKICogSW4g Z2VuZXJhbCwgdGhlc2UgZnVuY3Rpb25zIGFyZSBub3QgcGFzc2VkIHRoZSBvcmlnaW5hbCBQ YXRoIGFuZCB0aGVyZWZvcmUKICogbGVhdmUgaXQgdG8gdGhlIGNhbGxlciB0byBmaWxsIGlu IHRoZSBjb3N0L3dpZHRoIGZpZWxkcyBmcm9tIHRoZSBQYXRoLAogKiB0eXBpY2FsbHkgYnkg Y2FsbGluZyBjb3B5X2dlbmVyaWNfcGF0aF9pbmZvKCkuICBUaGlzIGNvbnZlbnRpb24gaXMK ICogc29tZXdoYXQgaGlzdG9yaWNhbCwgYnV0IGl0IGRvZXMgc3VwcG9ydCBhIGZldyBwbGFj ZXMgYWJvdmUgd2hlcmUgd2UgYnVpbGQKICogYSBwbGFuIG5vZGUgd2l0aG91dCBoYXZpbmcg YW4gZXhhY3RseSBjb3JyZXNwb25kaW5nIFBhdGggbm9kZS4gIFVuZGVyIG5vCiAqIGNpcmN1 bXN0YW5jZXMgc2hvdWxkIG9uZSBvZiB0aGVzZSBmdW5jdGlvbnMgZG8gaXRzIG93biBjb3N0 IGNhbGN1bGF0aW9ucywKICogYXMgdGhhdCB3b3VsZCBiZSByZWR1bmRhbnQgd2l0aCBjYWxj dWxhdGlvbnMgZG9uZSB3aGlsZSBidWlsZGluZyBQYXRocy4KICoKICoqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqLwoKc3RhdGljIFNlcVNjYW4gKgptYWtlX3NlcXNjYW4oTGlzdCAqcXB0bGlz dCwKCQkJIExpc3QgKnFwcXVhbCwKCQkJIEluZGV4IHNjYW5yZWxpZCkKewoJU2VxU2NhbiAg ICAqbm9kZSA9IG1ha2VOb2RlKFNlcVNjYW4pOwoJUGxhbgkgICAqcGxhbiA9ICZub2RlLT5z Y2FuLnBsYW47CgoJcGxhbi0+dGFyZ2V0bGlzdCA9IHFwdGxpc3Q7CglwbGFuLT5xdWFsID0g cXBxdWFsOwoJcGxhbi0+bGVmdHRyZWUgPSBOVUxMOwoJcGxhbi0+cmlnaHR0cmVlID0gTlVM TDsKCW5vZGUtPnNjYW4uc2NhbnJlbGlkID0gc2NhbnJlbGlkOwoKCXJldHVybiBub2RlOwp9 CgpzdGF0aWMgU2FtcGxlU2NhbiAqCm1ha2Vfc2FtcGxlc2NhbihMaXN0ICpxcHRsaXN0LAoJ CQkJTGlzdCAqcXBxdWFsLAoJCQkJSW5kZXggc2NhbnJlbGlkLAoJCQkJVGFibGVTYW1wbGVD bGF1c2UgKnRzYykKewoJU2FtcGxlU2NhbiAqbm9kZSA9IG1ha2VOb2RlKFNhbXBsZVNjYW4p OwoJUGxhbgkgICAqcGxhbiA9ICZub2RlLT5zY2FuLnBsYW47CgoJcGxhbi0+dGFyZ2V0bGlz dCA9IHFwdGxpc3Q7CglwbGFuLT5xdWFsID0gcXBxdWFsOwoJcGxhbi0+bGVmdHRyZWUgPSBO VUxMOwoJcGxhbi0+cmlnaHR0cmVlID0gTlVMTDsKCW5vZGUtPnNjYW4uc2NhbnJlbGlkID0g c2NhbnJlbGlkOwoJbm9kZS0+dGFibGVzYW1wbGUgPSB0c2M7CgoJcmV0dXJuIG5vZGU7Cn0K CnN0YXRpYyBJbmRleFNjYW4gKgptYWtlX2luZGV4c2NhbihMaXN0ICpxcHRsaXN0LAoJCQkg ICBMaXN0ICpxcHF1YWwsCgkJCSAgIEluZGV4IHNjYW5yZWxpZCwKCQkJICAgT2lkIGluZGV4 aWQsCgkJCSAgIExpc3QgKmluZGV4cXVhbCwKCQkJICAgTGlzdCAqaW5kZXhxdWFsb3JpZywK CQkJICAgTGlzdCAqaW5kZXhvcmRlcmJ5LAoJCQkgICBMaXN0ICppbmRleG9yZGVyYnlvcmln LAoJCQkgICBMaXN0ICppbmRleG9yZGVyYnlvcHMsCgkJCSAgIFNjYW5EaXJlY3Rpb24gaW5k ZXhzY2FuZGlyKQp7CglJbmRleFNjYW4gICpub2RlID0gbWFrZU5vZGUoSW5kZXhTY2FuKTsK CVBsYW4JICAgKnBsYW4gPSAmbm9kZS0+c2Nhbi5wbGFuOwoKCXBsYW4tPnRhcmdldGxpc3Qg PSBxcHRsaXN0OwoJcGxhbi0+cXVhbCA9IHFwcXVhbDsKCXBsYW4tPmxlZnR0cmVlID0gTlVM TDsKCXBsYW4tPnJpZ2h0dHJlZSA9IE5VTEw7Cglub2RlLT5zY2FuLnNjYW5yZWxpZCA9IHNj YW5yZWxpZDsKCW5vZGUtPmluZGV4aWQgPSBpbmRleGlkOwoJbm9kZS0+aW5kZXhxdWFsID0g aW5kZXhxdWFsOwoJbm9kZS0+aW5kZXhxdWFsb3JpZyA9IGluZGV4cXVhbG9yaWc7Cglub2Rl LT5pbmRleG9yZGVyYnkgPSBpbmRleG9yZGVyYnk7Cglub2RlLT5pbmRleG9yZGVyYnlvcmln ID0gaW5kZXhvcmRlcmJ5b3JpZzsKCW5vZGUtPmluZGV4b3JkZXJieW9wcyA9IGluZGV4b3Jk ZXJieW9wczsKCW5vZGUtPmluZGV4b3JkZXJkaXIgPSBpbmRleHNjYW5kaXI7CgoJcmV0dXJu IG5vZGU7Cn0KCnN0YXRpYyBJbmRleE9ubHlTY2FuICoKbWFrZV9pbmRleG9ubHlzY2FuKExp c3QgKnFwdGxpc3QsCgkJCQkgICBMaXN0ICpxcHF1YWwsCgkJCQkgICBJbmRleCBzY2FucmVs aWQsCgkJCQkgICBPaWQgaW5kZXhpZCwKCQkJCSAgIExpc3QgKmluZGV4cXVhbCwKCQkJCSAg IExpc3QgKnJlY2hlY2txdWFsLAoJCQkJICAgTGlzdCAqaW5kZXhvcmRlcmJ5LAoJCQkJICAg TGlzdCAqaW5kZXh0bGlzdCwKCQkJCSAgIFNjYW5EaXJlY3Rpb24gaW5kZXhzY2FuZGlyKQp7 CglJbmRleE9ubHlTY2FuICpub2RlID0gbWFrZU5vZGUoSW5kZXhPbmx5U2Nhbik7CglQbGFu CSAgICpwbGFuID0gJm5vZGUtPnNjYW4ucGxhbjsKCglwbGFuLT50YXJnZXRsaXN0ID0gcXB0 bGlzdDsKCXBsYW4tPnF1YWwgPSBxcHF1YWw7CglwbGFuLT5sZWZ0dHJlZSA9IE5VTEw7Cglw bGFuLT5yaWdodHRyZWUgPSBOVUxMOwoJbm9kZS0+c2Nhbi5zY2FucmVsaWQgPSBzY2FucmVs aWQ7Cglub2RlLT5pbmRleGlkID0gaW5kZXhpZDsKCW5vZGUtPmluZGV4cXVhbCA9IGluZGV4 cXVhbDsKCW5vZGUtPnJlY2hlY2txdWFsID0gcmVjaGVja3F1YWw7Cglub2RlLT5pbmRleG9y ZGVyYnkgPSBpbmRleG9yZGVyYnk7Cglub2RlLT5pbmRleHRsaXN0ID0gaW5kZXh0bGlzdDsK CW5vZGUtPmluZGV4b3JkZXJkaXIgPSBpbmRleHNjYW5kaXI7CgoJcmV0dXJuIG5vZGU7Cn0K CnN0YXRpYyBCaXRtYXBJbmRleFNjYW4gKgptYWtlX2JpdG1hcF9pbmRleHNjYW4oSW5kZXgg c2NhbnJlbGlkLAoJCQkJCSAgT2lkIGluZGV4aWQsCgkJCQkJICBMaXN0ICppbmRleHF1YWws CgkJCQkJICBMaXN0ICppbmRleHF1YWxvcmlnKQp7CglCaXRtYXBJbmRleFNjYW4gKm5vZGUg PSBtYWtlTm9kZShCaXRtYXBJbmRleFNjYW4pOwoJUGxhbgkgICAqcGxhbiA9ICZub2RlLT5z Y2FuLnBsYW47CgoJcGxhbi0+dGFyZ2V0bGlzdCA9IE5JTDsJCS8qIG5vdCB1c2VkICovCglw bGFuLT5xdWFsID0gTklMOwkJCS8qIG5vdCB1c2VkICovCglwbGFuLT5sZWZ0dHJlZSA9IE5V TEw7CglwbGFuLT5yaWdodHRyZWUgPSBOVUxMOwoJbm9kZS0+c2Nhbi5zY2FucmVsaWQgPSBz Y2FucmVsaWQ7Cglub2RlLT5pbmRleGlkID0gaW5kZXhpZDsKCW5vZGUtPmluZGV4cXVhbCA9 IGluZGV4cXVhbDsKCW5vZGUtPmluZGV4cXVhbG9yaWcgPSBpbmRleHF1YWxvcmlnOwoKCXJl dHVybiBub2RlOwp9CgpzdGF0aWMgQml0bWFwSGVhcFNjYW4gKgptYWtlX2JpdG1hcF9oZWFw c2NhbihMaXN0ICpxcHRsaXN0LAoJCQkJCSBMaXN0ICpxcHF1YWwsCgkJCQkJIFBsYW4gKmxl ZnR0cmVlLAoJCQkJCSBMaXN0ICpiaXRtYXBxdWFsb3JpZywKCQkJCQkgSW5kZXggc2NhbnJl bGlkKQp7CglCaXRtYXBIZWFwU2NhbiAqbm9kZSA9IG1ha2VOb2RlKEJpdG1hcEhlYXBTY2Fu KTsKCVBsYW4JICAgKnBsYW4gPSAmbm9kZS0+c2Nhbi5wbGFuOwoKCXBsYW4tPnRhcmdldGxp c3QgPSBxcHRsaXN0OwoJcGxhbi0+cXVhbCA9IHFwcXVhbDsKCXBsYW4tPmxlZnR0cmVlID0g bGVmdHRyZWU7CglwbGFuLT5yaWdodHRyZWUgPSBOVUxMOwoJbm9kZS0+c2Nhbi5zY2FucmVs aWQgPSBzY2FucmVsaWQ7Cglub2RlLT5iaXRtYXBxdWFsb3JpZyA9IGJpdG1hcHF1YWxvcmln OwoKCXJldHVybiBub2RlOwp9CgpzdGF0aWMgVGlkU2NhbiAqCm1ha2VfdGlkc2NhbihMaXN0 ICpxcHRsaXN0LAoJCQkgTGlzdCAqcXBxdWFsLAoJCQkgSW5kZXggc2NhbnJlbGlkLAoJCQkg TGlzdCAqdGlkcXVhbHMpCnsKCVRpZFNjYW4gICAgKm5vZGUgPSBtYWtlTm9kZShUaWRTY2Fu KTsKCVBsYW4JICAgKnBsYW4gPSAmbm9kZS0+c2Nhbi5wbGFuOwoKCXBsYW4tPnRhcmdldGxp c3QgPSBxcHRsaXN0OwoJcGxhbi0+cXVhbCA9IHFwcXVhbDsKCXBsYW4tPmxlZnR0cmVlID0g TlVMTDsKCXBsYW4tPnJpZ2h0dHJlZSA9IE5VTEw7Cglub2RlLT5zY2FuLnNjYW5yZWxpZCA9 IHNjYW5yZWxpZDsKCW5vZGUtPnRpZHF1YWxzID0gdGlkcXVhbHM7CgoJcmV0dXJuIG5vZGU7 Cn0KCnN0YXRpYyBUaWRSYW5nZVNjYW4gKgptYWtlX3RpZHJhbmdlc2NhbihMaXN0ICpxcHRs aXN0LAoJCQkJICBMaXN0ICpxcHF1YWwsCgkJCQkgIEluZGV4IHNjYW5yZWxpZCwKCQkJCSAg TGlzdCAqdGlkcmFuZ2VxdWFscykKewoJVGlkUmFuZ2VTY2FuICpub2RlID0gbWFrZU5vZGUo VGlkUmFuZ2VTY2FuKTsKCVBsYW4JICAgKnBsYW4gPSAmbm9kZS0+c2Nhbi5wbGFuOwoKCXBs YW4tPnRhcmdldGxpc3QgPSBxcHRsaXN0OwoJcGxhbi0+cXVhbCA9IHFwcXVhbDsKCXBsYW4t PmxlZnR0cmVlID0gTlVMTDsKCXBsYW4tPnJpZ2h0dHJlZSA9IE5VTEw7Cglub2RlLT5zY2Fu LnNjYW5yZWxpZCA9IHNjYW5yZWxpZDsKCW5vZGUtPnRpZHJhbmdlcXVhbHMgPSB0aWRyYW5n ZXF1YWxzOwoKCXJldHVybiBub2RlOwp9CgpzdGF0aWMgU3VicXVlcnlTY2FuICoKbWFrZV9z dWJxdWVyeXNjYW4oTGlzdCAqcXB0bGlzdCwKCQkJCSAgTGlzdCAqcXBxdWFsLAoJCQkJICBJ bmRleCBzY2FucmVsaWQsCgkJCQkgIFBsYW4gKnN1YnBsYW4pCnsKCVN1YnF1ZXJ5U2NhbiAq bm9kZSA9IG1ha2VOb2RlKFN1YnF1ZXJ5U2Nhbik7CglQbGFuCSAgICpwbGFuID0gJm5vZGUt PnNjYW4ucGxhbjsKCglwbGFuLT50YXJnZXRsaXN0ID0gcXB0bGlzdDsKCXBsYW4tPnF1YWwg PSBxcHF1YWw7CglwbGFuLT5sZWZ0dHJlZSA9IE5VTEw7CglwbGFuLT5yaWdodHRyZWUgPSBO VUxMOwoJbm9kZS0+c2Nhbi5zY2FucmVsaWQgPSBzY2FucmVsaWQ7Cglub2RlLT5zdWJwbGFu ID0gc3VicGxhbjsKCW5vZGUtPnNjYW5zdGF0dXMgPSBTVUJRVUVSWV9TQ0FOX1VOS05PV047 CgoJcmV0dXJuIG5vZGU7Cn0KCnN0YXRpYyBGdW5jdGlvblNjYW4gKgptYWtlX2Z1bmN0aW9u c2NhbihMaXN0ICpxcHRsaXN0LAoJCQkJICBMaXN0ICpxcHF1YWwsCgkJCQkgIEluZGV4IHNj YW5yZWxpZCwKCQkJCSAgTGlzdCAqZnVuY3Rpb25zLAoJCQkJICBib29sIGZ1bmNvcmRpbmFs aXR5KQp7CglGdW5jdGlvblNjYW4gKm5vZGUgPSBtYWtlTm9kZShGdW5jdGlvblNjYW4pOwoJ UGxhbgkgICAqcGxhbiA9ICZub2RlLT5zY2FuLnBsYW47CgoJcGxhbi0+dGFyZ2V0bGlzdCA9 IHFwdGxpc3Q7CglwbGFuLT5xdWFsID0gcXBxdWFsOwoJcGxhbi0+bGVmdHRyZWUgPSBOVUxM OwoJcGxhbi0+cmlnaHR0cmVlID0gTlVMTDsKCW5vZGUtPnNjYW4uc2NhbnJlbGlkID0gc2Nh bnJlbGlkOwoJbm9kZS0+ZnVuY3Rpb25zID0gZnVuY3Rpb25zOwoJbm9kZS0+ZnVuY29yZGlu YWxpdHkgPSBmdW5jb3JkaW5hbGl0eTsKCglyZXR1cm4gbm9kZTsKfQoKc3RhdGljIFRhYmxl RnVuY1NjYW4gKgptYWtlX3RhYmxlZnVuY3NjYW4oTGlzdCAqcXB0bGlzdCwKCQkJCSAgIExp c3QgKnFwcXVhbCwKCQkJCSAgIEluZGV4IHNjYW5yZWxpZCwKCQkJCSAgIFRhYmxlRnVuYyAq dGFibGVmdW5jKQp7CglUYWJsZUZ1bmNTY2FuICpub2RlID0gbWFrZU5vZGUoVGFibGVGdW5j U2Nhbik7CglQbGFuCSAgICpwbGFuID0gJm5vZGUtPnNjYW4ucGxhbjsKCglwbGFuLT50YXJn ZXRsaXN0ID0gcXB0bGlzdDsKCXBsYW4tPnF1YWwgPSBxcHF1YWw7CglwbGFuLT5sZWZ0dHJl ZSA9IE5VTEw7CglwbGFuLT5yaWdodHRyZWUgPSBOVUxMOwoJbm9kZS0+c2Nhbi5zY2FucmVs aWQgPSBzY2FucmVsaWQ7Cglub2RlLT50YWJsZWZ1bmMgPSB0YWJsZWZ1bmM7CgoJcmV0dXJu IG5vZGU7Cn0KCnN0YXRpYyBWYWx1ZXNTY2FuICoKbWFrZV92YWx1ZXNzY2FuKExpc3QgKnFw dGxpc3QsCgkJCQlMaXN0ICpxcHF1YWwsCgkJCQlJbmRleCBzY2FucmVsaWQsCgkJCQlMaXN0 ICp2YWx1ZXNfbGlzdHMpCnsKCVZhbHVlc1NjYW4gKm5vZGUgPSBtYWtlTm9kZShWYWx1ZXNT Y2FuKTsKCVBsYW4JICAgKnBsYW4gPSAmbm9kZS0+c2Nhbi5wbGFuOwoKCXBsYW4tPnRhcmdl dGxpc3QgPSBxcHRsaXN0OwoJcGxhbi0+cXVhbCA9IHFwcXVhbDsKCXBsYW4tPmxlZnR0cmVl ID0gTlVMTDsKCXBsYW4tPnJpZ2h0dHJlZSA9IE5VTEw7Cglub2RlLT5zY2FuLnNjYW5yZWxp ZCA9IHNjYW5yZWxpZDsKCW5vZGUtPnZhbHVlc19saXN0cyA9IHZhbHVlc19saXN0czsKCgly ZXR1cm4gbm9kZTsKfQoKc3RhdGljIEN0ZVNjYW4gKgptYWtlX2N0ZXNjYW4oTGlzdCAqcXB0 bGlzdCwKCQkJIExpc3QgKnFwcXVhbCwKCQkJIEluZGV4IHNjYW5yZWxpZCwKCQkJIGludCBj dGVQbGFuSWQsCgkJCSBpbnQgY3RlUGFyYW0pCnsKCUN0ZVNjYW4gICAgKm5vZGUgPSBtYWtl Tm9kZShDdGVTY2FuKTsKCVBsYW4JICAgKnBsYW4gPSAmbm9kZS0+c2Nhbi5wbGFuOwoKCXBs YW4tPnRhcmdldGxpc3QgPSBxcHRsaXN0OwoJcGxhbi0+cXVhbCA9IHFwcXVhbDsKCXBsYW4t PmxlZnR0cmVlID0gTlVMTDsKCXBsYW4tPnJpZ2h0dHJlZSA9IE5VTEw7Cglub2RlLT5zY2Fu LnNjYW5yZWxpZCA9IHNjYW5yZWxpZDsKCW5vZGUtPmN0ZVBsYW5JZCA9IGN0ZVBsYW5JZDsK CW5vZGUtPmN0ZVBhcmFtID0gY3RlUGFyYW07CgoJcmV0dXJuIG5vZGU7Cn0KCnN0YXRpYyBO YW1lZFR1cGxlc3RvcmVTY2FuICoKbWFrZV9uYW1lZHR1cGxlc3RvcmVzY2FuKExpc3QgKnFw dGxpc3QsCgkJCQkJCSBMaXN0ICpxcHF1YWwsCgkJCQkJCSBJbmRleCBzY2FucmVsaWQsCgkJ CQkJCSBjaGFyICplbnJuYW1lKQp7CglOYW1lZFR1cGxlc3RvcmVTY2FuICpub2RlID0gbWFr ZU5vZGUoTmFtZWRUdXBsZXN0b3JlU2Nhbik7CglQbGFuCSAgICpwbGFuID0gJm5vZGUtPnNj YW4ucGxhbjsKCgkvKiBjb3N0IHNob3VsZCBiZSBpbnNlcnRlZCBieSBjYWxsZXIgKi8KCXBs YW4tPnRhcmdldGxpc3QgPSBxcHRsaXN0OwoJcGxhbi0+cXVhbCA9IHFwcXVhbDsKCXBsYW4t PmxlZnR0cmVlID0gTlVMTDsKCXBsYW4tPnJpZ2h0dHJlZSA9IE5VTEw7Cglub2RlLT5zY2Fu LnNjYW5yZWxpZCA9IHNjYW5yZWxpZDsKCW5vZGUtPmVucm5hbWUgPSBlbnJuYW1lOwoKCXJl dHVybiBub2RlOwp9CgpzdGF0aWMgV29ya1RhYmxlU2NhbiAqCm1ha2Vfd29ya3RhYmxlc2Nh bihMaXN0ICpxcHRsaXN0LAoJCQkJICAgTGlzdCAqcXBxdWFsLAoJCQkJICAgSW5kZXggc2Nh bnJlbGlkLAoJCQkJICAgaW50IHd0UGFyYW0pCnsKCVdvcmtUYWJsZVNjYW4gKm5vZGUgPSBt YWtlTm9kZShXb3JrVGFibGVTY2FuKTsKCVBsYW4JICAgKnBsYW4gPSAmbm9kZS0+c2Nhbi5w bGFuOwoKCXBsYW4tPnRhcmdldGxpc3QgPSBxcHRsaXN0OwoJcGxhbi0+cXVhbCA9IHFwcXVh bDsKCXBsYW4tPmxlZnR0cmVlID0gTlVMTDsKCXBsYW4tPnJpZ2h0dHJlZSA9IE5VTEw7Cglu b2RlLT5zY2FuLnNjYW5yZWxpZCA9IHNjYW5yZWxpZDsKCW5vZGUtPnd0UGFyYW0gPSB3dFBh cmFtOwoKCXJldHVybiBub2RlOwp9CgpGb3JlaWduU2NhbiAqCm1ha2VfZm9yZWlnbnNjYW4o TGlzdCAqcXB0bGlzdCwKCQkJCSBMaXN0ICpxcHF1YWwsCgkJCQkgSW5kZXggc2NhbnJlbGlk LAoJCQkJIExpc3QgKmZkd19leHBycywKCQkJCSBMaXN0ICpmZHdfcHJpdmF0ZSwKCQkJCSBM aXN0ICpmZHdfc2Nhbl90bGlzdCwKCQkJCSBMaXN0ICpmZHdfcmVjaGVja19xdWFscywKCQkJ CSBQbGFuICpvdXRlcl9wbGFuKQp7CglGb3JlaWduU2NhbiAqbm9kZSA9IG1ha2VOb2RlKEZv cmVpZ25TY2FuKTsKCVBsYW4JICAgKnBsYW4gPSAmbm9kZS0+c2Nhbi5wbGFuOwoKCS8qIGNv c3Qgd2lsbCBiZSBmaWxsZWQgaW4gYnkgY3JlYXRlX2ZvcmVpZ25zY2FuX3BsYW4gKi8KCXBs YW4tPnRhcmdldGxpc3QgPSBxcHRsaXN0OwoJcGxhbi0+cXVhbCA9IHFwcXVhbDsKCXBsYW4t PmxlZnR0cmVlID0gb3V0ZXJfcGxhbjsKCXBsYW4tPnJpZ2h0dHJlZSA9IE5VTEw7Cglub2Rl LT5zY2FuLnNjYW5yZWxpZCA9IHNjYW5yZWxpZDsKCgkvKiB0aGVzZSBtYXkgYmUgb3ZlcnJp ZGRlbiBieSB0aGUgRkRXJ3MgUGxhbkRpcmVjdE1vZGlmeSBjYWxsYmFjay4gKi8KCW5vZGUt Pm9wZXJhdGlvbiA9IENNRF9TRUxFQ1Q7Cglub2RlLT5yZXN1bHRSZWxhdGlvbiA9IDA7CgoJ LyogY2hlY2tBc1VzZXIsIGZzX3NlcnZlciB3aWxsIGJlIGZpbGxlZCBpbiBieSBjcmVhdGVf Zm9yZWlnbnNjYW5fcGxhbiAqLwoJbm9kZS0+Y2hlY2tBc1VzZXIgPSBJbnZhbGlkT2lkOwoJ bm9kZS0+ZnNfc2VydmVyID0gSW52YWxpZE9pZDsKCW5vZGUtPmZkd19leHBycyA9IGZkd19l eHByczsKCW5vZGUtPmZkd19wcml2YXRlID0gZmR3X3ByaXZhdGU7Cglub2RlLT5mZHdfc2Nh bl90bGlzdCA9IGZkd19zY2FuX3RsaXN0OwoJbm9kZS0+ZmR3X3JlY2hlY2tfcXVhbHMgPSBm ZHdfcmVjaGVja19xdWFsczsKCS8qIGZzX3JlbGlkcywgZnNfYmFzZV9yZWxpZHMgd2lsbCBi ZSBmaWxsZWQgYnkgY3JlYXRlX2ZvcmVpZ25zY2FuX3BsYW4gKi8KCW5vZGUtPmZzX3JlbGlk cyA9IE5VTEw7Cglub2RlLT5mc19iYXNlX3JlbGlkcyA9IE5VTEw7CgkvKiBmc1N5c3RlbUNv bCB3aWxsIGJlIGZpbGxlZCBpbiBieSBjcmVhdGVfZm9yZWlnbnNjYW5fcGxhbiAqLwoJbm9k ZS0+ZnNTeXN0ZW1Db2wgPSBmYWxzZTsKCglyZXR1cm4gbm9kZTsKfQoKc3RhdGljIFJlY3Vy c2l2ZVVuaW9uICoKbWFrZV9yZWN1cnNpdmVfdW5pb24oTGlzdCAqdGxpc3QsCgkJCQkJIFBs YW4gKmxlZnR0cmVlLAoJCQkJCSBQbGFuICpyaWdodHRyZWUsCgkJCQkJIGludCB3dFBhcmFt LAoJCQkJCSBMaXN0ICpkaXN0aW5jdExpc3QsCgkJCQkJIENhcmRpbmFsaXR5IG51bUdyb3Vw cykKewoJUmVjdXJzaXZlVW5pb24gKm5vZGUgPSBtYWtlTm9kZShSZWN1cnNpdmVVbmlvbik7 CglQbGFuCSAgICpwbGFuID0gJm5vZGUtPnBsYW47CglpbnQJCQludW1Db2xzID0gbGlzdF9s ZW5ndGgoZGlzdGluY3RMaXN0KTsKCglwbGFuLT50YXJnZXRsaXN0ID0gdGxpc3Q7CglwbGFu LT5xdWFsID0gTklMOwoJcGxhbi0+bGVmdHRyZWUgPSBsZWZ0dHJlZTsKCXBsYW4tPnJpZ2h0 dHJlZSA9IHJpZ2h0dHJlZTsKCW5vZGUtPnd0UGFyYW0gPSB3dFBhcmFtOwoKCS8qCgkgKiBj b252ZXJ0IFNvcnRHcm91cENsYXVzZSBsaXN0IGludG8gYXJyYXlzIG9mIGF0dHIgaW5kZXhl cyBhbmQgZXF1YWxpdHkKCSAqIG9wZXJhdG9ycywgYXMgd2FudGVkIGJ5IGV4ZWN1dG9yCgkg Ki8KCW5vZGUtPm51bUNvbHMgPSBudW1Db2xzOwoJaWYgKG51bUNvbHMgPiAwKQoJewoJCWlu dAkJCWtleW5vID0gMDsKCQlBdHRyTnVtYmVyICpkdXBDb2xJZHg7CgkJT2lkCQkgICAqZHVw T3BlcmF0b3JzOwoJCU9pZAkJICAgKmR1cENvbGxhdGlvbnM7CgkJTGlzdENlbGwgICAqc2xp dGVtOwoKCQlkdXBDb2xJZHggPSBwYWxsb2NfYXJyYXkoQXR0ck51bWJlciwgbnVtQ29scyk7 CgkJZHVwT3BlcmF0b3JzID0gcGFsbG9jX2FycmF5KE9pZCwgbnVtQ29scyk7CgkJZHVwQ29s bGF0aW9ucyA9IHBhbGxvY19hcnJheShPaWQsIG51bUNvbHMpOwoKCQlmb3JlYWNoKHNsaXRl bSwgZGlzdGluY3RMaXN0KQoJCXsKCQkJU29ydEdyb3VwQ2xhdXNlICpzb3J0Y2wgPSAoU29y dEdyb3VwQ2xhdXNlICopIGxmaXJzdChzbGl0ZW0pOwoJCQlUYXJnZXRFbnRyeSAqdGxlID0g Z2V0X3NvcnRncm91cGNsYXVzZV90bGUoc29ydGNsLAoJCQkJCQkJCQkJCQkJICAgcGxhbi0+ dGFyZ2V0bGlzdCk7CgoJCQlkdXBDb2xJZHhba2V5bm9dID0gdGxlLT5yZXNubzsKCQkJZHVw T3BlcmF0b3JzW2tleW5vXSA9IHNvcnRjbC0+ZXFvcDsKCQkJZHVwQ29sbGF0aW9uc1trZXlu b10gPSBleHByQ29sbGF0aW9uKChOb2RlICopIHRsZS0+ZXhwcik7CgkJCUFzc2VydChPaWRJ c1ZhbGlkKGR1cE9wZXJhdG9yc1trZXlub10pKTsKCQkJa2V5bm8rKzsKCQl9CgkJbm9kZS0+ ZHVwQ29sSWR4ID0gZHVwQ29sSWR4OwoJCW5vZGUtPmR1cE9wZXJhdG9ycyA9IGR1cE9wZXJh dG9yczsKCQlub2RlLT5kdXBDb2xsYXRpb25zID0gZHVwQ29sbGF0aW9uczsKCX0KCW5vZGUt Pm51bUdyb3VwcyA9IG51bUdyb3VwczsKCglyZXR1cm4gbm9kZTsKfQoKc3RhdGljIEJpdG1h cEFuZCAqCm1ha2VfYml0bWFwX2FuZChMaXN0ICpiaXRtYXBwbGFucykKewoJQml0bWFwQW5k ICAqbm9kZSA9IG1ha2VOb2RlKEJpdG1hcEFuZCk7CglQbGFuCSAgICpwbGFuID0gJm5vZGUt PnBsYW47CgoJcGxhbi0+dGFyZ2V0bGlzdCA9IE5JTDsKCXBsYW4tPnF1YWwgPSBOSUw7Cglw bGFuLT5sZWZ0dHJlZSA9IE5VTEw7CglwbGFuLT5yaWdodHRyZWUgPSBOVUxMOwoJbm9kZS0+ Yml0bWFwcGxhbnMgPSBiaXRtYXBwbGFuczsKCglyZXR1cm4gbm9kZTsKfQoKc3RhdGljIEJp dG1hcE9yICoKbWFrZV9iaXRtYXBfb3IoTGlzdCAqYml0bWFwcGxhbnMpCnsKCUJpdG1hcE9y ICAgKm5vZGUgPSBtYWtlTm9kZShCaXRtYXBPcik7CglQbGFuCSAgICpwbGFuID0gJm5vZGUt PnBsYW47CgoJcGxhbi0+dGFyZ2V0bGlzdCA9IE5JTDsKCXBsYW4tPnF1YWwgPSBOSUw7Cglw bGFuLT5sZWZ0dHJlZSA9IE5VTEw7CglwbGFuLT5yaWdodHRyZWUgPSBOVUxMOwoJbm9kZS0+ Yml0bWFwcGxhbnMgPSBiaXRtYXBwbGFuczsKCglyZXR1cm4gbm9kZTsKfQoKc3RhdGljIE5l c3RMb29wICoKbWFrZV9uZXN0bG9vcChMaXN0ICp0bGlzdCwKCQkJICBMaXN0ICpqb2luY2xh dXNlcywKCQkJICBMaXN0ICpvdGhlcmNsYXVzZXMsCgkJCSAgTGlzdCAqbmVzdFBhcmFtcywK CQkJICBQbGFuICpsZWZ0dHJlZSwKCQkJICBQbGFuICpyaWdodHRyZWUsCgkJCSAgSm9pblR5 cGUgam9pbnR5cGUsCgkJCSAgYm9vbCBpbm5lcl91bmlxdWUpCnsKCU5lc3RMb29wICAgKm5v ZGUgPSBtYWtlTm9kZShOZXN0TG9vcCk7CglQbGFuCSAgICpwbGFuID0gJm5vZGUtPmpvaW4u cGxhbjsKCglwbGFuLT50YXJnZXRsaXN0ID0gdGxpc3Q7CglwbGFuLT5xdWFsID0gb3RoZXJj bGF1c2VzOwoJcGxhbi0+bGVmdHRyZWUgPSBsZWZ0dHJlZTsKCXBsYW4tPnJpZ2h0dHJlZSA9 IHJpZ2h0dHJlZTsKCW5vZGUtPmpvaW4uam9pbnR5cGUgPSBqb2ludHlwZTsKCW5vZGUtPmpv aW4uaW5uZXJfdW5pcXVlID0gaW5uZXJfdW5pcXVlOwoJbm9kZS0+am9pbi5qb2lucXVhbCA9 IGpvaW5jbGF1c2VzOwoJbm9kZS0+bmVzdFBhcmFtcyA9IG5lc3RQYXJhbXM7CgoJcmV0dXJu IG5vZGU7Cn0KCnN0YXRpYyBIYXNoSm9pbiAqCm1ha2VfaGFzaGpvaW4oTGlzdCAqdGxpc3Qs CgkJCSAgTGlzdCAqam9pbmNsYXVzZXMsCgkJCSAgTGlzdCAqb3RoZXJjbGF1c2VzLAoJCQkg IExpc3QgKmhhc2hjbGF1c2VzLAoJCQkgIExpc3QgKmhhc2hvcGVyYXRvcnMsCgkJCSAgTGlz dCAqaGFzaGNvbGxhdGlvbnMsCgkJCSAgTGlzdCAqaGFzaGtleXMsCgkJCSAgUGxhbiAqbGVm dHRyZWUsCgkJCSAgUGxhbiAqcmlnaHR0cmVlLAoJCQkgIEpvaW5UeXBlIGpvaW50eXBlLAoJ CQkgIGJvb2wgaW5uZXJfdW5pcXVlKQp7CglIYXNoSm9pbiAgICpub2RlID0gbWFrZU5vZGUo SGFzaEpvaW4pOwoJUGxhbgkgICAqcGxhbiA9ICZub2RlLT5qb2luLnBsYW47CgoJcGxhbi0+ dGFyZ2V0bGlzdCA9IHRsaXN0OwoJcGxhbi0+cXVhbCA9IG90aGVyY2xhdXNlczsKCXBsYW4t PmxlZnR0cmVlID0gbGVmdHRyZWU7CglwbGFuLT5yaWdodHRyZWUgPSByaWdodHRyZWU7Cglu b2RlLT5oYXNoY2xhdXNlcyA9IGhhc2hjbGF1c2VzOwoJbm9kZS0+aGFzaG9wZXJhdG9ycyA9 IGhhc2hvcGVyYXRvcnM7Cglub2RlLT5oYXNoY29sbGF0aW9ucyA9IGhhc2hjb2xsYXRpb25z OwoJbm9kZS0+aGFzaGtleXMgPSBoYXNoa2V5czsKCW5vZGUtPmpvaW4uam9pbnR5cGUgPSBq b2ludHlwZTsKCW5vZGUtPmpvaW4uaW5uZXJfdW5pcXVlID0gaW5uZXJfdW5pcXVlOwoJbm9k ZS0+am9pbi5qb2lucXVhbCA9IGpvaW5jbGF1c2VzOwoKCXJldHVybiBub2RlOwp9CgpzdGF0 aWMgSGFzaCAqCm1ha2VfaGFzaChQbGFuICpsZWZ0dHJlZSwKCQkgIExpc3QgKmhhc2hrZXlz LAoJCSAgT2lkIHNrZXdUYWJsZSwKCQkgIEF0dHJOdW1iZXIgc2tld0NvbHVtbiwKCQkgIGJv b2wgc2tld0luaGVyaXQpCnsKCUhhc2gJICAgKm5vZGUgPSBtYWtlTm9kZShIYXNoKTsKCVBs YW4JICAgKnBsYW4gPSAmbm9kZS0+cGxhbjsKCglwbGFuLT50YXJnZXRsaXN0ID0gbGVmdHRy ZWUtPnRhcmdldGxpc3Q7CglwbGFuLT5xdWFsID0gTklMOwoJcGxhbi0+bGVmdHRyZWUgPSBs ZWZ0dHJlZTsKCXBsYW4tPnJpZ2h0dHJlZSA9IE5VTEw7CgoJbm9kZS0+aGFzaGtleXMgPSBo YXNoa2V5czsKCW5vZGUtPnNrZXdUYWJsZSA9IHNrZXdUYWJsZTsKCW5vZGUtPnNrZXdDb2x1 bW4gPSBza2V3Q29sdW1uOwoJbm9kZS0+c2tld0luaGVyaXQgPSBza2V3SW5oZXJpdDsKCgly ZXR1cm4gbm9kZTsKfQoKc3RhdGljIE1lcmdlSm9pbiAqCm1ha2VfbWVyZ2Vqb2luKExpc3Qg KnRsaXN0LAoJCQkgICBMaXN0ICpqb2luY2xhdXNlcywKCQkJICAgTGlzdCAqb3RoZXJjbGF1 c2VzLAoJCQkgICBMaXN0ICptZXJnZWNsYXVzZXMsCgkJCSAgIE9pZCAqbWVyZ2VmYW1pbGll cywKCQkJICAgT2lkICptZXJnZWNvbGxhdGlvbnMsCgkJCSAgIGJvb2wgKm1lcmdlcmV2ZXJz YWxzLAoJCQkgICBib29sICptZXJnZW51bGxzZmlyc3QsCgkJCSAgIFBsYW4gKmxlZnR0cmVl LAoJCQkgICBQbGFuICpyaWdodHRyZWUsCgkJCSAgIEpvaW5UeXBlIGpvaW50eXBlLAoJCQkg ICBib29sIGlubmVyX3VuaXF1ZSwKCQkJICAgYm9vbCBza2lwX21hcmtfcmVzdG9yZSkKewoJ TWVyZ2VKb2luICAqbm9kZSA9IG1ha2VOb2RlKE1lcmdlSm9pbik7CglQbGFuCSAgICpwbGFu ID0gJm5vZGUtPmpvaW4ucGxhbjsKCglwbGFuLT50YXJnZXRsaXN0ID0gdGxpc3Q7CglwbGFu LT5xdWFsID0gb3RoZXJjbGF1c2VzOwoJcGxhbi0+bGVmdHRyZWUgPSBsZWZ0dHJlZTsKCXBs YW4tPnJpZ2h0dHJlZSA9IHJpZ2h0dHJlZTsKCW5vZGUtPnNraXBfbWFya19yZXN0b3JlID0g c2tpcF9tYXJrX3Jlc3RvcmU7Cglub2RlLT5tZXJnZWNsYXVzZXMgPSBtZXJnZWNsYXVzZXM7 Cglub2RlLT5tZXJnZUZhbWlsaWVzID0gbWVyZ2VmYW1pbGllczsKCW5vZGUtPm1lcmdlQ29s bGF0aW9ucyA9IG1lcmdlY29sbGF0aW9uczsKCW5vZGUtPm1lcmdlUmV2ZXJzYWxzID0gbWVy Z2VyZXZlcnNhbHM7Cglub2RlLT5tZXJnZU51bGxzRmlyc3QgPSBtZXJnZW51bGxzZmlyc3Q7 Cglub2RlLT5qb2luLmpvaW50eXBlID0gam9pbnR5cGU7Cglub2RlLT5qb2luLmlubmVyX3Vu aXF1ZSA9IGlubmVyX3VuaXF1ZTsKCW5vZGUtPmpvaW4uam9pbnF1YWwgPSBqb2luY2xhdXNl czsKCglyZXR1cm4gbm9kZTsKfQoKLyoKICogbWFrZV9zb3J0IC0tLSBiYXNpYyByb3V0aW5l IHRvIGJ1aWxkIGEgU29ydCBwbGFuIG5vZGUKICoKICogQ2FsbGVyIG11c3QgaGF2ZSBidWls dCB0aGUgc29ydENvbElkeCwgc29ydE9wZXJhdG9ycywgY29sbGF0aW9ucywgYW5kCiAqIG51 bGxzRmlyc3QgYXJyYXlzIGFscmVhZHkuCiAqLwpzdGF0aWMgU29ydCAqCm1ha2Vfc29ydChQ bGFuICpsZWZ0dHJlZSwgaW50IG51bUNvbHMsCgkJICBBdHRyTnVtYmVyICpzb3J0Q29sSWR4 LCBPaWQgKnNvcnRPcGVyYXRvcnMsCgkJICBPaWQgKmNvbGxhdGlvbnMsIGJvb2wgKm51bGxz Rmlyc3QpCnsKCVNvcnQJICAgKm5vZGU7CglQbGFuCSAgICpwbGFuOwoKCW5vZGUgPSBtYWtl Tm9kZShTb3J0KTsKCglwbGFuID0gJm5vZGUtPnBsYW47CglwbGFuLT50YXJnZXRsaXN0ID0g bGVmdHRyZWUtPnRhcmdldGxpc3Q7CglwbGFuLT5kaXNhYmxlZF9ub2RlcyA9IGxlZnR0cmVl LT5kaXNhYmxlZF9ub2RlcyArIChlbmFibGVfc29ydCA9PSBmYWxzZSk7CglwbGFuLT5xdWFs ID0gTklMOwoJcGxhbi0+bGVmdHRyZWUgPSBsZWZ0dHJlZTsKCXBsYW4tPnJpZ2h0dHJlZSA9 IE5VTEw7Cglub2RlLT5udW1Db2xzID0gbnVtQ29sczsKCW5vZGUtPnNvcnRDb2xJZHggPSBz b3J0Q29sSWR4OwoJbm9kZS0+c29ydE9wZXJhdG9ycyA9IHNvcnRPcGVyYXRvcnM7Cglub2Rl LT5jb2xsYXRpb25zID0gY29sbGF0aW9uczsKCW5vZGUtPm51bGxzRmlyc3QgPSBudWxsc0Zp cnN0OwoKCXJldHVybiBub2RlOwp9CgovKgogKiBtYWtlX2luY3JlbWVudGFsc29ydCAtLS0g YmFzaWMgcm91dGluZSB0byBidWlsZCBhbiBJbmNyZW1lbnRhbFNvcnQgcGxhbiBub2RlCiAq CiAqIENhbGxlciBtdXN0IGhhdmUgYnVpbHQgdGhlIHNvcnRDb2xJZHgsIHNvcnRPcGVyYXRv cnMsIGNvbGxhdGlvbnMsIGFuZAogKiBudWxsc0ZpcnN0IGFycmF5cyBhbHJlYWR5LgogKi8K c3RhdGljIEluY3JlbWVudGFsU29ydCAqCm1ha2VfaW5jcmVtZW50YWxzb3J0KFBsYW4gKmxl ZnR0cmVlLCBpbnQgbnVtQ29scywgaW50IG5QcmVzb3J0ZWRDb2xzLAoJCQkJCSBBdHRyTnVt YmVyICpzb3J0Q29sSWR4LCBPaWQgKnNvcnRPcGVyYXRvcnMsCgkJCQkJIE9pZCAqY29sbGF0 aW9ucywgYm9vbCAqbnVsbHNGaXJzdCkKewoJSW5jcmVtZW50YWxTb3J0ICpub2RlOwoJUGxh bgkgICAqcGxhbjsKCglub2RlID0gbWFrZU5vZGUoSW5jcmVtZW50YWxTb3J0KTsKCglwbGFu ID0gJm5vZGUtPnNvcnQucGxhbjsKCXBsYW4tPnRhcmdldGxpc3QgPSBsZWZ0dHJlZS0+dGFy Z2V0bGlzdDsKCXBsYW4tPnF1YWwgPSBOSUw7CglwbGFuLT5sZWZ0dHJlZSA9IGxlZnR0cmVl OwoJcGxhbi0+cmlnaHR0cmVlID0gTlVMTDsKCW5vZGUtPm5QcmVzb3J0ZWRDb2xzID0gblBy ZXNvcnRlZENvbHM7Cglub2RlLT5zb3J0Lm51bUNvbHMgPSBudW1Db2xzOwoJbm9kZS0+c29y dC5zb3J0Q29sSWR4ID0gc29ydENvbElkeDsKCW5vZGUtPnNvcnQuc29ydE9wZXJhdG9ycyA9 IHNvcnRPcGVyYXRvcnM7Cglub2RlLT5zb3J0LmNvbGxhdGlvbnMgPSBjb2xsYXRpb25zOwoJ bm9kZS0+c29ydC5udWxsc0ZpcnN0ID0gbnVsbHNGaXJzdDsKCglyZXR1cm4gbm9kZTsKfQoK LyoKICogcHJlcGFyZV9zb3J0X2Zyb21fcGF0aGtleXMKICoJICBQcmVwYXJlIHRvIHNvcnQg YWNjb3JkaW5nIHRvIGdpdmVuIHBhdGhrZXlzCiAqCiAqIFRoaXMgaXMgdXNlZCB0byBzZXQg dXAgZm9yIFNvcnQsIE1lcmdlQXBwZW5kLCBhbmQgR2F0aGVyIE1lcmdlIG5vZGVzLiAgSXQK ICogY2FsY3VsYXRlcyB0aGUgZXhlY3V0b3IncyByZXByZXNlbnRhdGlvbiBvZiB0aGUgc29y dCBrZXkgaW5mb3JtYXRpb24sIGFuZAogKiBhZGp1c3RzIHRoZSBwbGFuIHRhcmdldGxpc3Qg aWYgbmVlZGVkIHRvIGFkZCByZXNqdW5rIHNvcnQgY29sdW1ucy4KICoKICogSW5wdXQgcGFy YW1ldGVyczoKICoJICAnbGVmdHRyZWUnIGlzIHRoZSBwbGFuIG5vZGUgd2hpY2ggeWllbGRz IGlucHV0IHR1cGxlcwogKgkgICdwYXRoa2V5cycgaXMgdGhlIGxpc3Qgb2YgcGF0aGtleXMg Ynkgd2hpY2ggdGhlIHJlc3VsdCBpcyB0byBiZSBzb3J0ZWQKICoJICAncmVsaWRzJyBpZGVu dGlmaWVzIHRoZSBjaGlsZCByZWxhdGlvbiBiZWluZyBzb3J0ZWQsIGlmIGFueQogKgkgICdy ZXFDb2xJZHgnIGlzIE5VTEwgb3IgYW4gYXJyYXkgb2YgcmVxdWlyZWQgc29ydCBrZXkgY29s dW1uIG51bWJlcnMKICoJICAnYWRqdXN0X3RsaXN0X2luX3BsYWNlJyBpcyB0cnVlIGlmIGxl ZnR0cmVlIG11c3QgYmUgbW9kaWZpZWQgaW4tcGxhY2UKICoKICogV2UgbXVzdCBjb252ZXJ0 IHRoZSBwYXRoa2V5IGluZm9ybWF0aW9uIGludG8gYXJyYXlzIG9mIHNvcnQga2V5IGNvbHVt bgogKiBudW1iZXJzLCBzb3J0IG9wZXJhdG9yIE9JRHMsIGNvbGxhdGlvbiBPSURzLCBhbmQg bnVsbHMtZmlyc3QgZmxhZ3MsCiAqIHdoaWNoIGlzIHRoZSByZXByZXNlbnRhdGlvbiB0aGUg ZXhlY3V0b3Igd2FudHMuICBUaGVzZSBhcmUgcmV0dXJuZWQgaW50bwogKiB0aGUgb3V0cHV0 IHBhcmFtZXRlcnMgKnBfbnVtc29ydGtleXMgZXRjLgogKgogKiBXaGVuIGxvb2tpbmcgZm9y IG1hdGNoZXMgdG8gYW4gRXF1aXZhbGVuY2VDbGFzcydzIG1lbWJlcnMsIHdlIHdpbGwgb25s eQogKiBjb25zaWRlciBjaGlsZCBFQyBtZW1iZXJzIGlmIHRoZXkgYmVsb25nIHRvIGdpdmVu ICdyZWxpZHMnLiAgVGhpcyBwcm90ZWN0cwogKiBhZ2FpbnN0IHBvc3NpYmxlIGluY29ycmVj dCBtYXRjaGVzIHRvIGNoaWxkIGV4cHJlc3Npb25zIHRoYXQgY29udGFpbiBubwogKiBWYXJz LgogKgogKiBJZiByZXFDb2xJZHggaXNuJ3QgTlVMTCB0aGVuIGl0IGNvbnRhaW5zIHNvcnQg a2V5IGNvbHVtbiBudW1iZXJzIHRoYXQKICogd2Ugc2hvdWxkIG1hdGNoLiAgVGhpcyBpcyB1 c2VkIHdoZW4gbWFraW5nIGNoaWxkIHBsYW5zIGZvciBhIE1lcmdlQXBwZW5kOwogKiBpdCdz IGFuIGVycm9yIGlmIHdlIGNhbid0IG1hdGNoIHRoZSBjb2x1bW5zLgogKgogKiBJZiB0aGUg cGF0aGtleXMgaW5jbHVkZSBleHByZXNzaW9ucyB0aGF0IGFyZW4ndCBzaW1wbGUgVmFycywg d2Ugd2lsbAogKiB1c3VhbGx5IG5lZWQgdG8gYWRkIHJlc2p1bmsgaXRlbXMgdG8gdGhlIGlu cHV0IHBsYW4ncyB0YXJnZXRsaXN0IHRvCiAqIGNvbXB1dGUgdGhlc2UgZXhwcmVzc2lvbnMs IHNpbmNlIGEgU29ydCBvciBNZXJnZUFwcGVuZCBub2RlIGl0c2VsZiB3b24ndAogKiBkbyBh bnkgc3VjaCBjYWxjdWxhdGlvbnMuICBJZiB0aGUgaW5wdXQgcGxhbiB0eXBlIGlzbid0IG9u ZSB0aGF0IGNhbiBkbwogKiBwcm9qZWN0aW9ucywgdGhpcyBtZWFucyBhZGRpbmcgYSBSZXN1 bHQgbm9kZSBqdXN0IHRvIGRvIHRoZSBwcm9qZWN0aW9uLgogKiBIb3dldmVyLCB0aGUgY2Fs bGVyIGNhbiBwYXNzIGFkanVzdF90bGlzdF9pbl9wbGFjZSA9IHRydWUgdG8gZm9yY2UgdGhl CiAqIGxlZnR0cmVlIHRsaXN0IHRvIGJlIG1vZGlmaWVkIGluLXBsYWNlIHJlZ2FyZGxlc3Mg b2Ygd2hldGhlciB0aGUgbm9kZSB0eXBlCiAqIGNhbiBwcm9qZWN0IC0tLSB3ZSB1c2UgdGhp cyBmb3IgZml4aW5nIHRoZSB0bGlzdCBvZiBNZXJnZUFwcGVuZCBpdHNlbGYuCiAqCiAqIFJl dHVybnMgdGhlIG5vZGUgd2hpY2ggaXMgdG8gYmUgdGhlIGlucHV0IHRvIHRoZSBTb3J0IChl aXRoZXIgbGVmdHRyZWUsCiAqIG9yIGEgUmVzdWx0IHN0YWNrZWQgYXRvcCBsZWZ0dHJlZSku CiAqLwpzdGF0aWMgUGxhbiAqCnByZXBhcmVfc29ydF9mcm9tX3BhdGhrZXlzKFBsYW4gKmxl ZnR0cmVlLCBMaXN0ICpwYXRoa2V5cywKCQkJCQkJICAgUmVsaWRzIHJlbGlkcywKCQkJCQkJ ICAgY29uc3QgQXR0ck51bWJlciAqcmVxQ29sSWR4LAoJCQkJCQkgICBib29sIGFkanVzdF90 bGlzdF9pbl9wbGFjZSwKCQkJCQkJICAgaW50ICpwX251bXNvcnRrZXlzLAoJCQkJCQkgICBB dHRyTnVtYmVyICoqcF9zb3J0Q29sSWR4LAoJCQkJCQkgICBPaWQgKipwX3NvcnRPcGVyYXRv cnMsCgkJCQkJCSAgIE9pZCAqKnBfY29sbGF0aW9ucywKCQkJCQkJICAgYm9vbCAqKnBfbnVs bHNGaXJzdCkKewoJTGlzdAkgICAqdGxpc3QgPSBsZWZ0dHJlZS0+dGFyZ2V0bGlzdDsKCUxp c3RDZWxsICAgKmk7CglpbnQJCQludW1zb3J0a2V5czsKCUF0dHJOdW1iZXIgKnNvcnRDb2xJ ZHg7CglPaWQJCSAgICpzb3J0T3BlcmF0b3JzOwoJT2lkCQkgICAqY29sbGF0aW9uczsKCWJv b2wJICAgKm51bGxzRmlyc3Q7CgoJLyoKCSAqIFdlIHdpbGwgbmVlZCBhdCBtb3N0IGxpc3Rf bGVuZ3RoKHBhdGhrZXlzKSBzb3J0IGNvbHVtbnM7IHBvc3NpYmx5IGxlc3MKCSAqLwoJbnVt c29ydGtleXMgPSBsaXN0X2xlbmd0aChwYXRoa2V5cyk7Cglzb3J0Q29sSWR4ID0gKEF0dHJO dW1iZXIgKikgcGFsbG9jKG51bXNvcnRrZXlzICogc2l6ZW9mKEF0dHJOdW1iZXIpKTsKCXNv cnRPcGVyYXRvcnMgPSAoT2lkICopIHBhbGxvYyhudW1zb3J0a2V5cyAqIHNpemVvZihPaWQp KTsKCWNvbGxhdGlvbnMgPSAoT2lkICopIHBhbGxvYyhudW1zb3J0a2V5cyAqIHNpemVvZihP aWQpKTsKCW51bGxzRmlyc3QgPSAoYm9vbCAqKSBwYWxsb2MobnVtc29ydGtleXMgKiBzaXpl b2YoYm9vbCkpOwoKCW51bXNvcnRrZXlzID0gMDsKCglmb3JlYWNoKGksIHBhdGhrZXlzKQoJ ewoJCVBhdGhLZXkgICAgKnBhdGhrZXkgPSAoUGF0aEtleSAqKSBsZmlyc3QoaSk7CgkJRXF1 aXZhbGVuY2VDbGFzcyAqZWMgPSBwYXRoa2V5LT5wa19lY2xhc3M7CgkJRXF1aXZhbGVuY2VN ZW1iZXIgKmVtOwoJCVRhcmdldEVudHJ5ICp0bGUgPSBOVUxMOwoJCU9pZAkJCXBrX2RhdGF0 eXBlID0gSW52YWxpZE9pZDsKCQlPaWQJCQlzb3J0b3A7CgkJTGlzdENlbGwgICAqajsKCgkJ aWYgKGVjLT5lY19oYXNfdm9sYXRpbGUpCgkJewoJCQkvKgoJCQkgKiBJZiB0aGUgcGF0aGtl eSdzIEVxdWl2YWxlbmNlQ2xhc3MgaXMgdm9sYXRpbGUsIHRoZW4gaXQgbXVzdAoJCQkgKiBo YXZlIGNvbWUgZnJvbSBhbiBPUkRFUiBCWSBjbGF1c2UsIGFuZCB3ZSBoYXZlIHRvIG1hdGNo IGl0IHRvCgkJCSAqIHRoYXQgc2FtZSB0YXJnZXRsaXN0IGVudHJ5LgoJCQkgKi8KCQkJaWYg KGVjLT5lY19zb3J0cmVmID09IDApCS8qIGNhbid0IGhhcHBlbiAqLwoJCQkJZWxvZyhFUlJP UiwgInZvbGF0aWxlIEVxdWl2YWxlbmNlQ2xhc3MgaGFzIG5vIHNvcnRyZWYiKTsKCQkJdGxl ID0gZ2V0X3NvcnRncm91cHJlZl90bGUoZWMtPmVjX3NvcnRyZWYsIHRsaXN0KTsKCQkJQXNz ZXJ0KHRsZSk7CgkJCUFzc2VydChsaXN0X2xlbmd0aChlYy0+ZWNfbWVtYmVycykgPT0gMSk7 CgkJCXBrX2RhdGF0eXBlID0gKChFcXVpdmFsZW5jZU1lbWJlciAqKSBsaW5pdGlhbChlYy0+ ZWNfbWVtYmVycykpLT5lbV9kYXRhdHlwZTsKCQl9CgkJZWxzZSBpZiAocmVxQ29sSWR4ICE9 IE5VTEwpCgkJewoJCQkvKgoJCQkgKiBJZiB3ZSBhcmUgZ2l2ZW4gYSBzb3J0IGNvbHVtbiBu dW1iZXIgdG8gbWF0Y2gsIG9ubHkgY29uc2lkZXIKCQkJICogdGhlIHNpbmdsZSBUTEUgYXQg dGhhdCBwb3NpdGlvbi4gIEl0J3MgcG9zc2libGUgdGhhdCB0aGVyZSBpcwoJCQkgKiBubyBz dWNoIFRMRSwgaW4gd2hpY2ggY2FzZSBmYWxsIHRocm91Z2ggYW5kIGdlbmVyYXRlIGEgcmVz anVuawoJCQkgKiB0YXJnZXRlbnRyeSAod2UgYXNzdW1lIHRoaXMgbXVzdCBoYXZlIGhhcHBl bmVkIGluIHRoZSBwYXJlbnQKCQkJICogcGxhbiBhcyB3ZWxsKS4gIElmIHRoZXJlIGlzIGEg VExFIGJ1dCBpdCBkb2Vzbid0IG1hdGNoIHRoZQoJCQkgKiBwYXRoa2V5J3MgRUMsIHdlIGRv IHRoZSBzYW1lLCB3aGljaCBpcyBwcm9iYWJseSB0aGUgd3JvbmcgdGhpbmcKCQkJICogYnV0 IHdlJ2xsIGxlYXZlIGl0IHRvIGNhbGxlciB0byBjb21wbGFpbiBhYm91dCB0aGUgbWlzbWF0 Y2guCgkJCSAqLwoJCQl0bGUgPSBnZXRfdGxlX2J5X3Jlc25vKHRsaXN0LCByZXFDb2xJZHhb bnVtc29ydGtleXNdKTsKCQkJaWYgKHRsZSkKCQkJewoJCQkJZW0gPSBmaW5kX2VjX21lbWJl cl9tYXRjaGluZ19leHByKGVjLCB0bGUtPmV4cHIsIHJlbGlkcyk7CgkJCQlpZiAoZW0pCgkJ CQl7CgkJCQkJLyogZm91bmQgZXhwciBhdCByaWdodCBwbGFjZSBpbiB0bGlzdCAqLwoJCQkJ CXBrX2RhdGF0eXBlID0gZW0tPmVtX2RhdGF0eXBlOwoJCQkJfQoJCQkJZWxzZQoJCQkJCXRs ZSA9IE5VTEw7CgkJCX0KCQl9CgkJZWxzZQoJCXsKCQkJLyoKCQkJICogT3RoZXJ3aXNlLCB3 ZSBjYW4gc29ydCBieSBhbnkgbm9uLWNvbnN0YW50IGV4cHJlc3Npb24gbGlzdGVkIGluCgkJ CSAqIHRoZSBwYXRoa2V5J3MgRXF1aXZhbGVuY2VDbGFzcy4gIEZvciBub3csIHdlIHRha2Ug dGhlIGZpcnN0CgkJCSAqIHRsaXN0IGl0ZW0gZm91bmQgaW4gdGhlIEVDLiBJZiB0aGVyZSdz IG5vIG1hdGNoLCB3ZSdsbCBnZW5lcmF0ZQoJCQkgKiBhIHJlc2p1bmsgZW50cnkgdXNpbmcg dGhlIGZpcnN0IEVDIG1lbWJlciB0aGF0IGlzIGFuIGV4cHJlc3Npb24KCQkJICogaW4gdGhl IGlucHV0J3MgdmFycy4KCQkJICoKCQkJICogWFhYIGlmIHdlIGhhdmUgYSBjaG9pY2UsIGlz IHRoZXJlIGFueSB3YXkgb2YgZmlndXJpbmcgb3V0IHdoaWNoCgkJCSAqIG1pZ2h0IGJlIGNo ZWFwZXN0IHRvIGV4ZWN1dGU/ICAoRm9yIGV4YW1wbGUsIGludDRsdCBpcyBsaWtlbHkKCQkJ ICogbXVjaCBjaGVhcGVyIHRvIGV4ZWN1dGUgdGhhbiBudW1lcmljbHQsIGJ1dCBib3RoIG1p Z2h0IGFwcGVhcgoJCQkgKiBpbiB0aGUgc2FtZSBlcXVpdmFsZW5jZSBjbGFzcy4uLikgIE5v dCBjbGVhciB0aGF0IHdlIGV2ZXIgd2lsbAoJCQkgKiBoYXZlIGFuIGludGVyZXN0aW5nIGNo b2ljZSBpbiBwcmFjdGljZSwgc28gaXQgbWF5IG5vdCBtYXR0ZXIuCgkJCSAqLwoJCQlmb3Jl YWNoKGosIHRsaXN0KQoJCQl7CgkJCQl0bGUgPSAoVGFyZ2V0RW50cnkgKikgbGZpcnN0KGop OwoJCQkJZW0gPSBmaW5kX2VjX21lbWJlcl9tYXRjaGluZ19leHByKGVjLCB0bGUtPmV4cHIs IHJlbGlkcyk7CgkJCQlpZiAoZW0pCgkJCQl7CgkJCQkJLyogZm91bmQgZXhwciBhbHJlYWR5 IGluIHRsaXN0ICovCgkJCQkJcGtfZGF0YXR5cGUgPSBlbS0+ZW1fZGF0YXR5cGU7CgkJCQkJ YnJlYWs7CgkJCQl9CgkJCQl0bGUgPSBOVUxMOwoJCQl9CgkJfQoKCQlpZiAoIXRsZSkKCQl7 CgkJCS8qCgkJCSAqIE5vIG1hdGNoaW5nIHRsaXN0IGl0ZW07IGxvb2sgZm9yIGEgY29tcHV0 YWJsZSBleHByZXNzaW9uLgoJCQkgKi8KCQkJZW0gPSBmaW5kX2NvbXB1dGFibGVfZWNfbWVt YmVyKE5VTEwsIGVjLCB0bGlzdCwgcmVsaWRzLCBmYWxzZSk7CgkJCWlmICghZW0pCgkJCQll bG9nKEVSUk9SLCAiY291bGQgbm90IGZpbmQgcGF0aGtleSBpdGVtIHRvIHNvcnQiKTsKCQkJ cGtfZGF0YXR5cGUgPSBlbS0+ZW1fZGF0YXR5cGU7CgoJCQkvKgoJCQkgKiBEbyB3ZSBuZWVk IHRvIGluc2VydCBhIFJlc3VsdCBub2RlPwoJCQkgKi8KCQkJaWYgKCFhZGp1c3RfdGxpc3Rf aW5fcGxhY2UgJiYKCQkJCSFpc19wcm9qZWN0aW9uX2NhcGFibGVfcGxhbihsZWZ0dHJlZSkp CgkJCXsKCQkJCS8qIGNvcHkgbmVlZGVkIHNvIHdlIGRvbid0IG1vZGlmeSBpbnB1dCdzIHRs aXN0IGJlbG93ICovCgkJCQl0bGlzdCA9IGNvcHlPYmplY3QodGxpc3QpOwoJCQkJbGVmdHRy ZWUgPSBpbmplY3RfcHJvamVjdGlvbl9wbGFuKGxlZnR0cmVlLCB0bGlzdCwKCQkJCQkJCQkJ CQkJICBsZWZ0dHJlZS0+cGFyYWxsZWxfc2FmZSk7CgkJCX0KCgkJCS8qIERvbid0IGJvdGhl ciB0ZXN0aW5nIGlzX3Byb2plY3Rpb25fY2FwYWJsZV9wbGFuIGFnYWluICovCgkJCWFkanVz dF90bGlzdF9pbl9wbGFjZSA9IHRydWU7CgoJCQkvKgoJCQkgKiBBZGQgcmVzanVuayBlbnRy eSB0byBpbnB1dCdzIHRsaXN0CgkJCSAqLwoJCQl0bGUgPSBtYWtlVGFyZ2V0RW50cnkoY29w eU9iamVjdChlbS0+ZW1fZXhwciksCgkJCQkJCQkJICBsaXN0X2xlbmd0aCh0bGlzdCkgKyAx LAoJCQkJCQkJCSAgTlVMTCwKCQkJCQkJCQkgIHRydWUpOwoJCQl0bGlzdCA9IGxhcHBlbmQo dGxpc3QsIHRsZSk7CgkJCWxlZnR0cmVlLT50YXJnZXRsaXN0ID0gdGxpc3Q7CS8qIGp1c3Qg aW4gY2FzZSBOSUwgYmVmb3JlICovCgkJfQoKCQkvKgoJCSAqIExvb2sgdXAgdGhlIGNvcnJl Y3Qgc29ydCBvcGVyYXRvciBmcm9tIHRoZSBQYXRoS2V5J3Mgc2xpZ2h0bHkKCQkgKiBhYnN0 cmFjdGVkIHJlcHJlc2VudGF0aW9uLgoJCSAqLwoJCXNvcnRvcCA9IGdldF9vcGZhbWlseV9t ZW1iZXJfZm9yX2NtcHR5cGUocGF0aGtleS0+cGtfb3BmYW1pbHksCgkJCQkJCQkJCQkJCSBw a19kYXRhdHlwZSwKCQkJCQkJCQkJCQkJIHBrX2RhdGF0eXBlLAoJCQkJCQkJCQkJCQkgcGF0 aGtleS0+cGtfY21wdHlwZSk7CgkJaWYgKCFPaWRJc1ZhbGlkKHNvcnRvcCkpCS8qIHNob3Vs ZCBub3QgaGFwcGVuICovCgkJCWVsb2coRVJST1IsICJtaXNzaW5nIG9wZXJhdG9yICVkKCV1 LCV1KSBpbiBvcGZhbWlseSAldSIsCgkJCQkgcGF0aGtleS0+cGtfY21wdHlwZSwgcGtfZGF0 YXR5cGUsIHBrX2RhdGF0eXBlLAoJCQkJIHBhdGhrZXktPnBrX29wZmFtaWx5KTsKCgkJLyog QWRkIHRoZSBjb2x1bW4gdG8gdGhlIHNvcnQgYXJyYXlzICovCgkJc29ydENvbElkeFtudW1z b3J0a2V5c10gPSB0bGUtPnJlc25vOwoJCXNvcnRPcGVyYXRvcnNbbnVtc29ydGtleXNdID0g c29ydG9wOwoJCWNvbGxhdGlvbnNbbnVtc29ydGtleXNdID0gZWMtPmVjX2NvbGxhdGlvbjsK CQludWxsc0ZpcnN0W251bXNvcnRrZXlzXSA9IHBhdGhrZXktPnBrX251bGxzX2ZpcnN0OwoJ CW51bXNvcnRrZXlzKys7Cgl9CgoJLyogUmV0dXJuIHJlc3VsdHMgKi8KCSpwX251bXNvcnRr ZXlzID0gbnVtc29ydGtleXM7CgkqcF9zb3J0Q29sSWR4ID0gc29ydENvbElkeDsKCSpwX3Nv cnRPcGVyYXRvcnMgPSBzb3J0T3BlcmF0b3JzOwoJKnBfY29sbGF0aW9ucyA9IGNvbGxhdGlv bnM7CgkqcF9udWxsc0ZpcnN0ID0gbnVsbHNGaXJzdDsKCglyZXR1cm4gbGVmdHRyZWU7Cn0K Ci8qCiAqIG1ha2Vfc29ydF9mcm9tX3BhdGhrZXlzCiAqCSAgQ3JlYXRlIHNvcnQgcGxhbiB0 byBzb3J0IGFjY29yZGluZyB0byBnaXZlbiBwYXRoa2V5cwogKgogKgkgICdsZWZ0dHJlZScg aXMgdGhlIG5vZGUgd2hpY2ggeWllbGRzIGlucHV0IHR1cGxlcwogKgkgICdwYXRoa2V5cycg aXMgdGhlIGxpc3Qgb2YgcGF0aGtleXMgYnkgd2hpY2ggdGhlIHJlc3VsdCBpcyB0byBiZSBz b3J0ZWQKICoJICAncmVsaWRzJyBpcyB0aGUgc2V0IG9mIHJlbGF0aW9ucyByZXF1aXJlZCBi eSBwcmVwYXJlX3NvcnRfZnJvbV9wYXRoa2V5cygpCiAqLwpzdGF0aWMgU29ydCAqCm1ha2Vf c29ydF9mcm9tX3BhdGhrZXlzKFBsYW4gKmxlZnR0cmVlLCBMaXN0ICpwYXRoa2V5cywgUmVs aWRzIHJlbGlkcykKewoJaW50CQkJbnVtc29ydGtleXM7CglBdHRyTnVtYmVyICpzb3J0Q29s SWR4OwoJT2lkCQkgICAqc29ydE9wZXJhdG9yczsKCU9pZAkJICAgKmNvbGxhdGlvbnM7Cgli b29sCSAgICpudWxsc0ZpcnN0OwoKCS8qIENvbXB1dGUgc29ydCBjb2x1bW4gaW5mbywgYW5k IGFkanVzdCBsZWZ0dHJlZSBhcyBuZWVkZWQgKi8KCWxlZnR0cmVlID0gcHJlcGFyZV9zb3J0 X2Zyb21fcGF0aGtleXMobGVmdHRyZWUsIHBhdGhrZXlzLAoJCQkJCQkJCQkJICByZWxpZHMs CgkJCQkJCQkJCQkgIE5VTEwsCgkJCQkJCQkJCQkgIGZhbHNlLAoJCQkJCQkJCQkJICAmbnVt c29ydGtleXMsCgkJCQkJCQkJCQkgICZzb3J0Q29sSWR4LAoJCQkJCQkJCQkJICAmc29ydE9w ZXJhdG9ycywKCQkJCQkJCQkJCSAgJmNvbGxhdGlvbnMsCgkJCQkJCQkJCQkgICZudWxsc0Zp cnN0KTsKCgkvKiBOb3cgYnVpbGQgdGhlIFNvcnQgbm9kZSAqLwoJcmV0dXJuIG1ha2Vfc29y dChsZWZ0dHJlZSwgbnVtc29ydGtleXMsCgkJCQkJIHNvcnRDb2xJZHgsIHNvcnRPcGVyYXRv cnMsCgkJCQkJIGNvbGxhdGlvbnMsIG51bGxzRmlyc3QpOwp9CgovKgogKiBtYWtlX2luY3Jl bWVudGFsc29ydF9mcm9tX3BhdGhrZXlzCiAqCSAgQ3JlYXRlIHNvcnQgcGxhbiB0byBzb3J0 IGFjY29yZGluZyB0byBnaXZlbiBwYXRoa2V5cwogKgogKgkgICdsZWZ0dHJlZScgaXMgdGhl IG5vZGUgd2hpY2ggeWllbGRzIGlucHV0IHR1cGxlcwogKgkgICdwYXRoa2V5cycgaXMgdGhl IGxpc3Qgb2YgcGF0aGtleXMgYnkgd2hpY2ggdGhlIHJlc3VsdCBpcyB0byBiZSBzb3J0ZWQK ICoJICAncmVsaWRzJyBpcyB0aGUgc2V0IG9mIHJlbGF0aW9ucyByZXF1aXJlZCBieSBwcmVw YXJlX3NvcnRfZnJvbV9wYXRoa2V5cygpCiAqCSAgJ25QcmVzb3J0ZWRDb2xzJyBpcyB0aGUg bnVtYmVyIG9mIHByZXNvcnRlZCBjb2x1bW5zIGluIGlucHV0IHR1cGxlcwogKi8Kc3RhdGlj IEluY3JlbWVudGFsU29ydCAqCm1ha2VfaW5jcmVtZW50YWxzb3J0X2Zyb21fcGF0aGtleXMo UGxhbiAqbGVmdHRyZWUsIExpc3QgKnBhdGhrZXlzLAoJCQkJCQkJCSAgIFJlbGlkcyByZWxp ZHMsIGludCBuUHJlc29ydGVkQ29scykKewoJaW50CQkJbnVtc29ydGtleXM7CglBdHRyTnVt YmVyICpzb3J0Q29sSWR4OwoJT2lkCQkgICAqc29ydE9wZXJhdG9yczsKCU9pZAkJICAgKmNv bGxhdGlvbnM7Cglib29sCSAgICpudWxsc0ZpcnN0OwoKCS8qIENvbXB1dGUgc29ydCBjb2x1 bW4gaW5mbywgYW5kIGFkanVzdCBsZWZ0dHJlZSBhcyBuZWVkZWQgKi8KCWxlZnR0cmVlID0g cHJlcGFyZV9zb3J0X2Zyb21fcGF0aGtleXMobGVmdHRyZWUsIHBhdGhrZXlzLAoJCQkJCQkJ CQkJICByZWxpZHMsCgkJCQkJCQkJCQkgIE5VTEwsCgkJCQkJCQkJCQkgIGZhbHNlLAoJCQkJ CQkJCQkJICAmbnVtc29ydGtleXMsCgkJCQkJCQkJCQkgICZzb3J0Q29sSWR4LAoJCQkJCQkJ CQkJICAmc29ydE9wZXJhdG9ycywKCQkJCQkJCQkJCSAgJmNvbGxhdGlvbnMsCgkJCQkJCQkJ CQkgICZudWxsc0ZpcnN0KTsKCgkvKiBOb3cgYnVpbGQgdGhlIFNvcnQgbm9kZSAqLwoJcmV0 dXJuIG1ha2VfaW5jcmVtZW50YWxzb3J0KGxlZnR0cmVlLCBudW1zb3J0a2V5cywgblByZXNv cnRlZENvbHMsCgkJCQkJCQkJc29ydENvbElkeCwgc29ydE9wZXJhdG9ycywKCQkJCQkJCQlj b2xsYXRpb25zLCBudWxsc0ZpcnN0KTsKfQoKLyoKICogbWFrZV9zb3J0X2Zyb21fc29ydGNs YXVzZXMKICoJICBDcmVhdGUgc29ydCBwbGFuIHRvIHNvcnQgYWNjb3JkaW5nIHRvIGdpdmVu IHNvcnRjbGF1c2VzCiAqCiAqCSAgJ3NvcnRjbHMnIGlzIGEgbGlzdCBvZiBTb3J0R3JvdXBD bGF1c2VzCiAqCSAgJ2xlZnR0cmVlJyBpcyB0aGUgbm9kZSB3aGljaCB5aWVsZHMgaW5wdXQg dHVwbGVzCiAqLwpTb3J0ICoKbWFrZV9zb3J0X2Zyb21fc29ydGNsYXVzZXMoTGlzdCAqc29y dGNscywgUGxhbiAqbGVmdHRyZWUpCnsKCUxpc3QJICAgKnN1Yl90bGlzdCA9IGxlZnR0cmVl LT50YXJnZXRsaXN0OwoJTGlzdENlbGwgICAqbDsKCWludAkJCW51bXNvcnRrZXlzOwoJQXR0 ck51bWJlciAqc29ydENvbElkeDsKCU9pZAkJICAgKnNvcnRPcGVyYXRvcnM7CglPaWQJCSAg ICpjb2xsYXRpb25zOwoJYm9vbAkgICAqbnVsbHNGaXJzdDsKCgkvKiBDb252ZXJ0IGxpc3Qt aXNoIHJlcHJlc2VudGF0aW9uIHRvIGFycmF5cyB3YW50ZWQgYnkgZXhlY3V0b3IgKi8KCW51 bXNvcnRrZXlzID0gbGlzdF9sZW5ndGgoc29ydGNscyk7Cglzb3J0Q29sSWR4ID0gKEF0dHJO dW1iZXIgKikgcGFsbG9jKG51bXNvcnRrZXlzICogc2l6ZW9mKEF0dHJOdW1iZXIpKTsKCXNv cnRPcGVyYXRvcnMgPSAoT2lkICopIHBhbGxvYyhudW1zb3J0a2V5cyAqIHNpemVvZihPaWQp KTsKCWNvbGxhdGlvbnMgPSAoT2lkICopIHBhbGxvYyhudW1zb3J0a2V5cyAqIHNpemVvZihP aWQpKTsKCW51bGxzRmlyc3QgPSAoYm9vbCAqKSBwYWxsb2MobnVtc29ydGtleXMgKiBzaXpl b2YoYm9vbCkpOwoKCW51bXNvcnRrZXlzID0gMDsKCWZvcmVhY2gobCwgc29ydGNscykKCXsK CQlTb3J0R3JvdXBDbGF1c2UgKnNvcnRjbCA9IChTb3J0R3JvdXBDbGF1c2UgKikgbGZpcnN0 KGwpOwoJCVRhcmdldEVudHJ5ICp0bGUgPSBnZXRfc29ydGdyb3VwY2xhdXNlX3RsZShzb3J0 Y2wsIHN1Yl90bGlzdCk7CgoJCXNvcnRDb2xJZHhbbnVtc29ydGtleXNdID0gdGxlLT5yZXNu bzsKCQlzb3J0T3BlcmF0b3JzW251bXNvcnRrZXlzXSA9IHNvcnRjbC0+c29ydG9wOwoJCWNv bGxhdGlvbnNbbnVtc29ydGtleXNdID0gZXhwckNvbGxhdGlvbigoTm9kZSAqKSB0bGUtPmV4 cHIpOwoJCW51bGxzRmlyc3RbbnVtc29ydGtleXNdID0gc29ydGNsLT5udWxsc19maXJzdDsK CQludW1zb3J0a2V5cysrOwoJfQoKCXJldHVybiBtYWtlX3NvcnQobGVmdHRyZWUsIG51bXNv cnRrZXlzLAoJCQkJCSBzb3J0Q29sSWR4LCBzb3J0T3BlcmF0b3JzLAoJCQkJCSBjb2xsYXRp b25zLCBudWxsc0ZpcnN0KTsKfQoKLyoKICogbWFrZV9zb3J0X2Zyb21fZ3JvdXBjb2xzCiAq CSAgQ3JlYXRlIHNvcnQgcGxhbiB0byBzb3J0IGJhc2VkIG9uIGdyb3VwaW5nIGNvbHVtbnMK ICoKICogJ2dyb3VwY2xzJyBpcyB0aGUgbGlzdCBvZiBTb3J0R3JvdXBDbGF1c2VzCiAqICdn cnBDb2xJZHgnIGdpdmVzIHRoZSBjb2x1bW4gbnVtYmVycyB0byB1c2UKICoKICogVGhpcyBt aWdodCBsb29rIGxpa2UgaXQgY291bGQgYmUgbWVyZ2VkIHdpdGggbWFrZV9zb3J0X2Zyb21f c29ydGNsYXVzZXMsCiAqIGJ1dCBwcmVzZW50bHkgd2UgKm11c3QqIHVzZSB0aGUgZ3JwQ29s SWR4W10gYXJyYXkgdG8gbG9jYXRlIHNvcnQgY29sdW1ucywKICogYmVjYXVzZSB0aGUgY2hp bGQgcGxhbidzIHRsaXN0IGlzIG5vdCBtYXJrZWQgd2l0aCByZXNzb3J0Z3JvdXByZWYgaW5m bwogKiBhcHByb3ByaWF0ZSB0byB0aGUgZ3JvdXBpbmcgbm9kZS4gIFNvLCBvbmx5IHRoZSBz b3J0IG9yZGVyaW5nIGluZm8KICogaXMgdXNlZCBmcm9tIHRoZSBTb3J0R3JvdXBDbGF1c2Ug ZW50cmllcy4KICovCnN0YXRpYyBTb3J0ICoKbWFrZV9zb3J0X2Zyb21fZ3JvdXBjb2xzKExp c3QgKmdyb3VwY2xzLAoJCQkJCQkgQXR0ck51bWJlciAqZ3JwQ29sSWR4LAoJCQkJCQkgUGxh biAqbGVmdHRyZWUpCnsKCUxpc3QJICAgKnN1Yl90bGlzdCA9IGxlZnR0cmVlLT50YXJnZXRs aXN0OwoJTGlzdENlbGwgICAqbDsKCWludAkJCW51bXNvcnRrZXlzOwoJQXR0ck51bWJlciAq c29ydENvbElkeDsKCU9pZAkJICAgKnNvcnRPcGVyYXRvcnM7CglPaWQJCSAgICpjb2xsYXRp b25zOwoJYm9vbAkgICAqbnVsbHNGaXJzdDsKCgkvKiBDb252ZXJ0IGxpc3QtaXNoIHJlcHJl c2VudGF0aW9uIHRvIGFycmF5cyB3YW50ZWQgYnkgZXhlY3V0b3IgKi8KCW51bXNvcnRrZXlz ID0gbGlzdF9sZW5ndGgoZ3JvdXBjbHMpOwoJc29ydENvbElkeCA9IChBdHRyTnVtYmVyICop IHBhbGxvYyhudW1zb3J0a2V5cyAqIHNpemVvZihBdHRyTnVtYmVyKSk7Cglzb3J0T3BlcmF0 b3JzID0gKE9pZCAqKSBwYWxsb2MobnVtc29ydGtleXMgKiBzaXplb2YoT2lkKSk7Cgljb2xs YXRpb25zID0gKE9pZCAqKSBwYWxsb2MobnVtc29ydGtleXMgKiBzaXplb2YoT2lkKSk7Cglu dWxsc0ZpcnN0ID0gKGJvb2wgKikgcGFsbG9jKG51bXNvcnRrZXlzICogc2l6ZW9mKGJvb2wp KTsKCgludW1zb3J0a2V5cyA9IDA7Cglmb3JlYWNoKGwsIGdyb3VwY2xzKQoJewoJCVNvcnRH cm91cENsYXVzZSAqZ3JwY2wgPSAoU29ydEdyb3VwQ2xhdXNlICopIGxmaXJzdChsKTsKCQlU YXJnZXRFbnRyeSAqdGxlID0gZ2V0X3RsZV9ieV9yZXNubyhzdWJfdGxpc3QsIGdycENvbElk eFtudW1zb3J0a2V5c10pOwoKCQlpZiAoIXRsZSkKCQkJZWxvZyhFUlJPUiwgImNvdWxkIG5v dCByZXRyaWV2ZSB0bGUgZm9yIHNvcnQtZnJvbS1ncm91cGNvbHMiKTsKCgkJc29ydENvbElk eFtudW1zb3J0a2V5c10gPSB0bGUtPnJlc25vOwoJCXNvcnRPcGVyYXRvcnNbbnVtc29ydGtl eXNdID0gZ3JwY2wtPnNvcnRvcDsKCQljb2xsYXRpb25zW251bXNvcnRrZXlzXSA9IGV4cHJD b2xsYXRpb24oKE5vZGUgKikgdGxlLT5leHByKTsKCQludWxsc0ZpcnN0W251bXNvcnRrZXlz XSA9IGdycGNsLT5udWxsc19maXJzdDsKCQludW1zb3J0a2V5cysrOwoJfQoKCXJldHVybiBt YWtlX3NvcnQobGVmdHRyZWUsIG51bXNvcnRrZXlzLAoJCQkJCSBzb3J0Q29sSWR4LCBzb3J0 T3BlcmF0b3JzLAoJCQkJCSBjb2xsYXRpb25zLCBudWxsc0ZpcnN0KTsKfQoKc3RhdGljIE1h dGVyaWFsICoKbWFrZV9tYXRlcmlhbChQbGFuICpsZWZ0dHJlZSkKewoJTWF0ZXJpYWwgICAq bm9kZSA9IG1ha2VOb2RlKE1hdGVyaWFsKTsKCVBsYW4JICAgKnBsYW4gPSAmbm9kZS0+cGxh bjsKCglwbGFuLT50YXJnZXRsaXN0ID0gbGVmdHRyZWUtPnRhcmdldGxpc3Q7CglwbGFuLT5x dWFsID0gTklMOwoJcGxhbi0+bGVmdHRyZWUgPSBsZWZ0dHJlZTsKCXBsYW4tPnJpZ2h0dHJl ZSA9IE5VTEw7CgoJcmV0dXJuIG5vZGU7Cn0KCi8qCiAqIG1hdGVyaWFsaXplX2ZpbmlzaGVk X3BsYW46IHN0aWNrIGEgTWF0ZXJpYWwgbm9kZSBhdG9wIGEgY29tcGxldGVkIHBsYW4KICoK ICogVGhlcmUgYXJlIGEgY291cGxlIG9mIHBsYWNlcyB3aGVyZSB3ZSB3YW50IHRvIGF0dGFj aCBhIE1hdGVyaWFsIG5vZGUKICogYWZ0ZXIgY29tcGxldGlvbiBvZiBjcmVhdGVfcGxhbigp LCB3aXRob3V0IGFueSBNYXRlcmlhbFBhdGggcGF0aC4KICogVGhvc2UgcGxhY2VzIHNob3Vs ZCBwcm9iYWJseSBiZSByZWZhY3RvcmVkIHNvbWVkYXkgdG8gZG8gdGhpcyBvbiB0aGUKICog UGF0aCByZXByZXNlbnRhdGlvbiwgYnV0IGl0J3Mgbm90IHdvcnRoIHRoZSB0cm91YmxlIHll dC4KICovClBsYW4gKgptYXRlcmlhbGl6ZV9maW5pc2hlZF9wbGFuKFBsYW4gKnN1YnBsYW4p CnsKCVBsYW4JICAgKm1hdHBsYW47CglQYXRoCQltYXRwYXRoOwkJLyogZHVtbXkgZm9yIGNv c3RfbWF0ZXJpYWwgKi8KCUNvc3QJCWluaXRwbGFuX2Nvc3Q7Cglib29sCQl1bnNhZmVfaW5p dHBsYW5zOwoKCW1hdHBsYW4gPSAoUGxhbiAqKSBtYWtlX21hdGVyaWFsKHN1YnBsYW4pOwoK CS8qCgkgKiBYWFggaG9ycmlkIGtsdWdlOiBpZiB0aGVyZSBhcmUgYW55IGluaXRQbGFucyBh dHRhY2hlZCB0byB0aGUgc3VicGxhbiwKCSAqIG1vdmUgdGhlbSB1cCB0byB0aGUgTWF0ZXJp YWwgbm9kZSwgd2hpY2ggaXMgbm93IGVmZmVjdGl2ZWx5IHRoZSB0b3AKCSAqIHBsYW4gbm9k ZSBpbiBpdHMgcXVlcnkgbGV2ZWwuICBUaGlzIHByZXZlbnRzIGZhaWx1cmUgaW4KCSAqIFNT X2ZpbmFsaXplX3BsYW4oKSwgd2hpY2ggc2VlIGZvciBjb21tZW50cy4KCSAqLwoJbWF0cGxh bi0+aW5pdFBsYW4gPSBzdWJwbGFuLT5pbml0UGxhbjsKCXN1YnBsYW4tPmluaXRQbGFuID0g TklMOwoKCS8qIE1vdmUgdGhlIGluaXRwbGFucycgY29zdCBkZWx0YSwgYXMgd2VsbCAqLwoJ U1NfY29tcHV0ZV9pbml0cGxhbl9jb3N0KG1hdHBsYW4tPmluaXRQbGFuLAoJCQkJCQkJICZp bml0cGxhbl9jb3N0LCAmdW5zYWZlX2luaXRwbGFucyk7CglzdWJwbGFuLT5zdGFydHVwX2Nv c3QgLT0gaW5pdHBsYW5fY29zdDsKCXN1YnBsYW4tPnRvdGFsX2Nvc3QgLT0gaW5pdHBsYW5f Y29zdDsKCgkvKiBTZXQgY29zdCBkYXRhICovCgljb3N0X21hdGVyaWFsKCZtYXRwYXRoLAoJ CQkJICBlbmFibGVfbWF0ZXJpYWwsCgkJCQkgIHN1YnBsYW4tPmRpc2FibGVkX25vZGVzLAoJ CQkJICBzdWJwbGFuLT5zdGFydHVwX2Nvc3QsCgkJCQkgIHN1YnBsYW4tPnRvdGFsX2Nvc3Qs CgkJCQkgIHN1YnBsYW4tPnBsYW5fcm93cywKCQkJCSAgc3VicGxhbi0+cGxhbl93aWR0aCk7 CgltYXRwbGFuLT5kaXNhYmxlZF9ub2RlcyA9IHN1YnBsYW4tPmRpc2FibGVkX25vZGVzOwoJ bWF0cGxhbi0+c3RhcnR1cF9jb3N0ID0gbWF0cGF0aC5zdGFydHVwX2Nvc3QgKyBpbml0cGxh bl9jb3N0OwoJbWF0cGxhbi0+dG90YWxfY29zdCA9IG1hdHBhdGgudG90YWxfY29zdCArIGlu aXRwbGFuX2Nvc3Q7CgltYXRwbGFuLT5wbGFuX3Jvd3MgPSBzdWJwbGFuLT5wbGFuX3Jvd3M7 CgltYXRwbGFuLT5wbGFuX3dpZHRoID0gc3VicGxhbi0+cGxhbl93aWR0aDsKCW1hdHBsYW4t PnBhcmFsbGVsX2F3YXJlID0gZmFsc2U7CgltYXRwbGFuLT5wYXJhbGxlbF9zYWZlID0gc3Vi cGxhbi0+cGFyYWxsZWxfc2FmZTsKCglyZXR1cm4gbWF0cGxhbjsKfQoKc3RhdGljIE1lbW9p emUgKgptYWtlX21lbW9pemUoUGxhbiAqbGVmdHRyZWUsIE9pZCAqaGFzaG9wZXJhdG9ycywg T2lkICpjb2xsYXRpb25zLAoJCQkgTGlzdCAqcGFyYW1fZXhwcnMsIGJvb2wgc2luZ2xlcm93 LCBib29sIGJpbmFyeV9tb2RlLAoJCQkgdWludDMyIGVzdF9lbnRyaWVzLCBCaXRtYXBzZXQg KmtleXBhcmFtaWRzLAoJCQkgQ2FyZGluYWxpdHkgZXN0X2NhbGxzLCBDYXJkaW5hbGl0eSBl c3RfdW5pcXVlX2tleXMsCgkJCSBkb3VibGUgZXN0X2hpdF9yYXRpbykKewoJTWVtb2l6ZSAg ICAqbm9kZSA9IG1ha2VOb2RlKE1lbW9pemUpOwoJUGxhbgkgICAqcGxhbiA9ICZub2RlLT5w bGFuOwoKCXBsYW4tPnRhcmdldGxpc3QgPSBsZWZ0dHJlZS0+dGFyZ2V0bGlzdDsKCXBsYW4t PnF1YWwgPSBOSUw7CglwbGFuLT5sZWZ0dHJlZSA9IGxlZnR0cmVlOwoJcGxhbi0+cmlnaHR0 cmVlID0gTlVMTDsKCglub2RlLT5udW1LZXlzID0gbGlzdF9sZW5ndGgocGFyYW1fZXhwcnMp OwoJbm9kZS0+aGFzaE9wZXJhdG9ycyA9IGhhc2hvcGVyYXRvcnM7Cglub2RlLT5jb2xsYXRp b25zID0gY29sbGF0aW9uczsKCW5vZGUtPnBhcmFtX2V4cHJzID0gcGFyYW1fZXhwcnM7Cglu b2RlLT5zaW5nbGVyb3cgPSBzaW5nbGVyb3c7Cglub2RlLT5iaW5hcnlfbW9kZSA9IGJpbmFy eV9tb2RlOwoJbm9kZS0+ZXN0X2VudHJpZXMgPSBlc3RfZW50cmllczsKCW5vZGUtPmtleXBh cmFtaWRzID0ga2V5cGFyYW1pZHM7Cglub2RlLT5lc3RfY2FsbHMgPSBlc3RfY2FsbHM7Cglu b2RlLT5lc3RfdW5pcXVlX2tleXMgPSBlc3RfdW5pcXVlX2tleXM7Cglub2RlLT5lc3RfaGl0 X3JhdGlvID0gZXN0X2hpdF9yYXRpbzsKCglyZXR1cm4gbm9kZTsKfQoKQWdnICoKbWFrZV9h Z2coTGlzdCAqdGxpc3QsIExpc3QgKnF1YWwsCgkJIEFnZ1N0cmF0ZWd5IGFnZ3N0cmF0ZWd5 LCBBZ2dTcGxpdCBhZ2dzcGxpdCwKCQkgaW50IG51bUdyb3VwQ29scywgQXR0ck51bWJlciAq Z3JwQ29sSWR4LCBPaWQgKmdycE9wZXJhdG9ycywgT2lkICpncnBDb2xsYXRpb25zLAoJCSBM aXN0ICpncm91cGluZ1NldHMsIExpc3QgKmNoYWluLCBDYXJkaW5hbGl0eSBudW1Hcm91cHMs CgkJIFNpemUgdHJhbnNpdGlvblNwYWNlLCBQbGFuICpsZWZ0dHJlZSkKewoJQWdnCQkgICAq bm9kZSA9IG1ha2VOb2RlKEFnZyk7CglQbGFuCSAgICpwbGFuID0gJm5vZGUtPnBsYW47CgoJ bm9kZS0+YWdnc3RyYXRlZ3kgPSBhZ2dzdHJhdGVneTsKCW5vZGUtPmFnZ3NwbGl0ID0gYWdn c3BsaXQ7Cglub2RlLT5udW1Db2xzID0gbnVtR3JvdXBDb2xzOwoJbm9kZS0+Z3JwQ29sSWR4 ID0gZ3JwQ29sSWR4OwoJbm9kZS0+Z3JwT3BlcmF0b3JzID0gZ3JwT3BlcmF0b3JzOwoJbm9k ZS0+Z3JwQ29sbGF0aW9ucyA9IGdycENvbGxhdGlvbnM7Cglub2RlLT5udW1Hcm91cHMgPSBu dW1Hcm91cHM7Cglub2RlLT50cmFuc2l0aW9uU3BhY2UgPSB0cmFuc2l0aW9uU3BhY2U7Cglu b2RlLT5hZ2dQYXJhbXMgPSBOVUxMOwkJLyogU1NfZmluYWxpemVfcGxhbigpIHdpbGwgZmls bCB0aGlzICovCglub2RlLT5ncm91cGluZ1NldHMgPSBncm91cGluZ1NldHM7Cglub2RlLT5j aGFpbiA9IGNoYWluOwoKCXBsYW4tPnF1YWwgPSBxdWFsOwoJcGxhbi0+dGFyZ2V0bGlzdCA9 IHRsaXN0OwoJcGxhbi0+bGVmdHRyZWUgPSBsZWZ0dHJlZTsKCXBsYW4tPnJpZ2h0dHJlZSA9 IE5VTEw7CgoJcmV0dXJuIG5vZGU7Cn0KCnN0YXRpYyBXaW5kb3dBZ2cgKgptYWtlX3dpbmRv d2FnZyhMaXN0ICp0bGlzdCwgV2luZG93Q2xhdXNlICp3YywKCQkJICAgaW50IHBhcnROdW1D b2xzLCBBdHRyTnVtYmVyICpwYXJ0Q29sSWR4LCBPaWQgKnBhcnRPcGVyYXRvcnMsIE9pZCAq cGFydENvbGxhdGlvbnMsCgkJCSAgIGludCBvcmROdW1Db2xzLCBBdHRyTnVtYmVyICpvcmRD b2xJZHgsIE9pZCAqb3JkT3BlcmF0b3JzLCBPaWQgKm9yZENvbGxhdGlvbnMsCgkJCSAgIExp c3QgKnJ1bkNvbmRpdGlvbiwgTGlzdCAqcXVhbCwgYm9vbCB0b3BXaW5kb3csIFBsYW4gKmxl ZnR0cmVlKQp7CglXaW5kb3dBZ2cgICpub2RlID0gbWFrZU5vZGUoV2luZG93QWdnKTsKCVBs YW4JICAgKnBsYW4gPSAmbm9kZS0+cGxhbjsKCglub2RlLT53aW5uYW1lID0gd2MtPm5hbWU7 Cglub2RlLT53aW5yZWYgPSB3Yy0+d2lucmVmOwoJbm9kZS0+cGFydE51bUNvbHMgPSBwYXJ0 TnVtQ29sczsKCW5vZGUtPnBhcnRDb2xJZHggPSBwYXJ0Q29sSWR4OwoJbm9kZS0+cGFydE9w ZXJhdG9ycyA9IHBhcnRPcGVyYXRvcnM7Cglub2RlLT5wYXJ0Q29sbGF0aW9ucyA9IHBhcnRD b2xsYXRpb25zOwoJbm9kZS0+b3JkTnVtQ29scyA9IG9yZE51bUNvbHM7Cglub2RlLT5vcmRD b2xJZHggPSBvcmRDb2xJZHg7Cglub2RlLT5vcmRPcGVyYXRvcnMgPSBvcmRPcGVyYXRvcnM7 Cglub2RlLT5vcmRDb2xsYXRpb25zID0gb3JkQ29sbGF0aW9uczsKCW5vZGUtPmZyYW1lT3B0 aW9ucyA9IHdjLT5mcmFtZU9wdGlvbnM7Cglub2RlLT5zdGFydE9mZnNldCA9IHdjLT5zdGFy dE9mZnNldDsKCW5vZGUtPmVuZE9mZnNldCA9IHdjLT5lbmRPZmZzZXQ7Cglub2RlLT5ydW5D b25kaXRpb24gPSBydW5Db25kaXRpb247CgkvKiBhIGR1cGxpY2F0ZSBvZiB0aGUgYWJvdmUg Zm9yIEVYUExBSU4gKi8KCW5vZGUtPnJ1bkNvbmRpdGlvbk9yaWcgPSBydW5Db25kaXRpb247 Cglub2RlLT5zdGFydEluUmFuZ2VGdW5jID0gd2MtPnN0YXJ0SW5SYW5nZUZ1bmM7Cglub2Rl LT5lbmRJblJhbmdlRnVuYyA9IHdjLT5lbmRJblJhbmdlRnVuYzsKCW5vZGUtPmluUmFuZ2VD b2xsID0gd2MtPmluUmFuZ2VDb2xsOwoJbm9kZS0+aW5SYW5nZUFzYyA9IHdjLT5pblJhbmdl QXNjOwoJbm9kZS0+aW5SYW5nZU51bGxzRmlyc3QgPSB3Yy0+aW5SYW5nZU51bGxzRmlyc3Q7 Cglub2RlLT50b3BXaW5kb3cgPSB0b3BXaW5kb3c7CgoJcGxhbi0+dGFyZ2V0bGlzdCA9IHRs aXN0OwoJcGxhbi0+bGVmdHRyZWUgPSBsZWZ0dHJlZTsKCXBsYW4tPnJpZ2h0dHJlZSA9IE5V TEw7CglwbGFuLT5xdWFsID0gcXVhbDsKCglyZXR1cm4gbm9kZTsKfQoKc3RhdGljIEdyb3Vw ICoKbWFrZV9ncm91cChMaXN0ICp0bGlzdCwKCQkgICBMaXN0ICpxdWFsLAoJCSAgIGludCBu dW1Hcm91cENvbHMsCgkJICAgQXR0ck51bWJlciAqZ3JwQ29sSWR4LAoJCSAgIE9pZCAqZ3Jw T3BlcmF0b3JzLAoJCSAgIE9pZCAqZ3JwQ29sbGF0aW9ucywKCQkgICBQbGFuICpsZWZ0dHJl ZSkKewoJR3JvdXAJICAgKm5vZGUgPSBtYWtlTm9kZShHcm91cCk7CglQbGFuCSAgICpwbGFu ID0gJm5vZGUtPnBsYW47CgoJbm9kZS0+bnVtQ29scyA9IG51bUdyb3VwQ29sczsKCW5vZGUt PmdycENvbElkeCA9IGdycENvbElkeDsKCW5vZGUtPmdycE9wZXJhdG9ycyA9IGdycE9wZXJh dG9yczsKCW5vZGUtPmdycENvbGxhdGlvbnMgPSBncnBDb2xsYXRpb25zOwoKCXBsYW4tPnF1 YWwgPSBxdWFsOwoJcGxhbi0+dGFyZ2V0bGlzdCA9IHRsaXN0OwoJcGxhbi0+bGVmdHRyZWUg PSBsZWZ0dHJlZTsKCXBsYW4tPnJpZ2h0dHJlZSA9IE5VTEw7CgoJcmV0dXJuIG5vZGU7Cn0K Ci8qCiAqIHBhdGhrZXlzIGlzIGEgbGlzdCBvZiBQYXRoS2V5cywgaWRlbnRpZnlpbmcgdGhl IHNvcnQgY29sdW1ucyBhbmQgc2VtYW50aWNzLgogKiBUaGUgaW5wdXQgcGxhbiBtdXN0IGFs cmVhZHkgYmUgc29ydGVkIGFjY29yZGluZ2x5LgogKgogKiByZWxpZHMgaWRlbnRpZmllcyB0 aGUgY2hpbGQgcmVsYXRpb24gYmVpbmcgdW5pcXVlLWlmaWVkLCBpZiBhbnkuCiAqLwpzdGF0 aWMgVW5pcXVlICoKbWFrZV91bmlxdWVfZnJvbV9wYXRoa2V5cyhQbGFuICpsZWZ0dHJlZSwg TGlzdCAqcGF0aGtleXMsIGludCBudW1Db2xzLAoJCQkJCQkgIFJlbGlkcyByZWxpZHMpCnsK CVVuaXF1ZQkgICAqbm9kZSA9IG1ha2VOb2RlKFVuaXF1ZSk7CglQbGFuCSAgICpwbGFuID0g Jm5vZGUtPnBsYW47CglpbnQJCQlrZXlubyA9IDA7CglBdHRyTnVtYmVyICp1bmlxQ29sSWR4 OwoJT2lkCQkgICAqdW5pcU9wZXJhdG9yczsKCU9pZAkJICAgKnVuaXFDb2xsYXRpb25zOwoJ TGlzdENlbGwgICAqbGM7CgoJcGxhbi0+dGFyZ2V0bGlzdCA9IGxlZnR0cmVlLT50YXJnZXRs aXN0OwoJcGxhbi0+cXVhbCA9IE5JTDsKCXBsYW4tPmxlZnR0cmVlID0gbGVmdHRyZWU7Cglw bGFuLT5yaWdodHRyZWUgPSBOVUxMOwoKCS8qCgkgKiBDb252ZXJ0IHBhdGhrZXlzIGxpc3Qg aW50byBhcnJheXMgb2YgYXR0ciBpbmRleGVzIGFuZCBlcXVhbGl0eQoJICogb3BlcmF0b3Jz LCBhcyB3YW50ZWQgYnkgZXhlY3V0b3IuICBUaGlzIGhhcyBhIGxvdCBpbiBjb21tb24gd2l0 aAoJICogcHJlcGFyZV9zb3J0X2Zyb21fcGF0aGtleXMgLi4uIG1heWJlIHVuaWZ5IHNvbWV0 aW1lPwoJICovCglBc3NlcnQobnVtQ29scyA+PSAwICYmIG51bUNvbHMgPD0gbGlzdF9sZW5n dGgocGF0aGtleXMpKTsKCXVuaXFDb2xJZHggPSBwYWxsb2NfYXJyYXkoQXR0ck51bWJlciwg bnVtQ29scyk7Cgl1bmlxT3BlcmF0b3JzID0gcGFsbG9jX2FycmF5KE9pZCwgbnVtQ29scyk7 Cgl1bmlxQ29sbGF0aW9ucyA9IHBhbGxvY19hcnJheShPaWQsIG51bUNvbHMpOwoKCWZvcmVh Y2gobGMsIHBhdGhrZXlzKQoJewoJCVBhdGhLZXkgICAgKnBhdGhrZXkgPSAoUGF0aEtleSAq KSBsZmlyc3QobGMpOwoJCUVxdWl2YWxlbmNlQ2xhc3MgKmVjID0gcGF0aGtleS0+cGtfZWNs YXNzOwoJCUVxdWl2YWxlbmNlTWVtYmVyICplbTsKCQlUYXJnZXRFbnRyeSAqdGxlID0gTlVM TDsKCQlPaWQJCQlwa19kYXRhdHlwZSA9IEludmFsaWRPaWQ7CgkJT2lkCQkJZXFvcDsKCQlM aXN0Q2VsbCAgICpqOwoKCQkvKiBJZ25vcmUgcGF0aGtleXMgYmV5b25kIHRoZSBzcGVjaWZp ZWQgbnVtYmVyIG9mIGNvbHVtbnMgKi8KCQlpZiAoa2V5bm8gPj0gbnVtQ29scykKCQkJYnJl YWs7CgoJCWlmIChlYy0+ZWNfaGFzX3ZvbGF0aWxlKQoJCXsKCQkJLyoKCQkJICogSWYgdGhl IHBhdGhrZXkncyBFcXVpdmFsZW5jZUNsYXNzIGlzIHZvbGF0aWxlLCB0aGVuIGl0IG11c3QK CQkJICogaGF2ZSBjb21lIGZyb20gYW4gT1JERVIgQlkgY2xhdXNlLCBhbmQgd2UgaGF2ZSB0 byBtYXRjaCBpdCB0bwoJCQkgKiB0aGF0IHNhbWUgdGFyZ2V0bGlzdCBlbnRyeS4KCQkJICov CgkJCWlmIChlYy0+ZWNfc29ydHJlZiA9PSAwKQkvKiBjYW4ndCBoYXBwZW4gKi8KCQkJCWVs b2coRVJST1IsICJ2b2xhdGlsZSBFcXVpdmFsZW5jZUNsYXNzIGhhcyBubyBzb3J0cmVmIik7 CgkJCXRsZSA9IGdldF9zb3J0Z3JvdXByZWZfdGxlKGVjLT5lY19zb3J0cmVmLCBwbGFuLT50 YXJnZXRsaXN0KTsKCQkJQXNzZXJ0KHRsZSk7CgkJCUFzc2VydChsaXN0X2xlbmd0aChlYy0+ ZWNfbWVtYmVycykgPT0gMSk7CgkJCXBrX2RhdGF0eXBlID0gKChFcXVpdmFsZW5jZU1lbWJl ciAqKSBsaW5pdGlhbChlYy0+ZWNfbWVtYmVycykpLT5lbV9kYXRhdHlwZTsKCQl9CgkJZWxz ZQoJCXsKCQkJLyoKCQkJICogT3RoZXJ3aXNlLCB3ZSBjYW4gdXNlIGFueSBub24tY29uc3Rh bnQgZXhwcmVzc2lvbiBsaXN0ZWQgaW4gdGhlCgkJCSAqIHBhdGhrZXkncyBFcXVpdmFsZW5j ZUNsYXNzLiAgRm9yIG5vdywgd2UgdGFrZSB0aGUgZmlyc3QgdGxpc3QKCQkJICogaXRlbSBm b3VuZCBpbiB0aGUgRUMuCgkJCSAqLwoJCQlmb3JlYWNoKGosIHBsYW4tPnRhcmdldGxpc3Qp CgkJCXsKCQkJCXRsZSA9IChUYXJnZXRFbnRyeSAqKSBsZmlyc3Qoaik7CgkJCQllbSA9IGZp bmRfZWNfbWVtYmVyX21hdGNoaW5nX2V4cHIoZWMsIHRsZS0+ZXhwciwgcmVsaWRzKTsKCQkJ CWlmIChlbSkKCQkJCXsKCQkJCQkvKiBmb3VuZCBleHByIGFscmVhZHkgaW4gdGxpc3QgKi8K CQkJCQlwa19kYXRhdHlwZSA9IGVtLT5lbV9kYXRhdHlwZTsKCQkJCQlicmVhazsKCQkJCX0K CQkJCXRsZSA9IE5VTEw7CgkJCX0KCQl9CgoJCWlmICghdGxlKQoJCQllbG9nKEVSUk9SLCAi Y291bGQgbm90IGZpbmQgcGF0aGtleSBpdGVtIHRvIHNvcnQiKTsKCgkJLyoKCQkgKiBMb29r IHVwIHRoZSBjb3JyZWN0IGVxdWFsaXR5IG9wZXJhdG9yIGZyb20gdGhlIFBhdGhLZXkncyBz bGlnaHRseQoJCSAqIGFic3RyYWN0ZWQgcmVwcmVzZW50YXRpb24uCgkJICovCgkJZXFvcCA9 IGdldF9vcGZhbWlseV9tZW1iZXJfZm9yX2NtcHR5cGUocGF0aGtleS0+cGtfb3BmYW1pbHks CgkJCQkJCQkJCQkJICAgcGtfZGF0YXR5cGUsCgkJCQkJCQkJCQkJICAgcGtfZGF0YXR5cGUs CgkJCQkJCQkJCQkJICAgQ09NUEFSRV9FUSk7CgkJaWYgKCFPaWRJc1ZhbGlkKGVxb3ApKQkv KiBzaG91bGQgbm90IGhhcHBlbiAqLwoJCQllbG9nKEVSUk9SLCAibWlzc2luZyBvcGVyYXRv ciAlZCgldSwldSkgaW4gb3BmYW1pbHkgJXUiLAoJCQkJIENPTVBBUkVfRVEsIHBrX2RhdGF0 eXBlLCBwa19kYXRhdHlwZSwKCQkJCSBwYXRoa2V5LT5wa19vcGZhbWlseSk7CgoJCXVuaXFD b2xJZHhba2V5bm9dID0gdGxlLT5yZXNubzsKCQl1bmlxT3BlcmF0b3JzW2tleW5vXSA9IGVx b3A7CgkJdW5pcUNvbGxhdGlvbnNba2V5bm9dID0gZWMtPmVjX2NvbGxhdGlvbjsKCgkJa2V5 bm8rKzsKCX0KCglub2RlLT5udW1Db2xzID0gbnVtQ29sczsKCW5vZGUtPnVuaXFDb2xJZHgg PSB1bmlxQ29sSWR4OwoJbm9kZS0+dW5pcU9wZXJhdG9ycyA9IHVuaXFPcGVyYXRvcnM7Cglu b2RlLT51bmlxQ29sbGF0aW9ucyA9IHVuaXFDb2xsYXRpb25zOwoKCXJldHVybiBub2RlOwp9 CgpzdGF0aWMgR2F0aGVyICoKbWFrZV9nYXRoZXIoTGlzdCAqcXB0bGlzdCwKCQkJTGlzdCAq cXBxdWFsLAoJCQlpbnQgbndvcmtlcnMsCgkJCWludCByZXNjYW5fcGFyYW0sCgkJCWJvb2wg c2luZ2xlX2NvcHksCgkJCVBsYW4gKnN1YnBsYW4pCnsKCUdhdGhlcgkgICAqbm9kZSA9IG1h a2VOb2RlKEdhdGhlcik7CglQbGFuCSAgICpwbGFuID0gJm5vZGUtPnBsYW47CgoJcGxhbi0+ dGFyZ2V0bGlzdCA9IHFwdGxpc3Q7CglwbGFuLT5xdWFsID0gcXBxdWFsOwoJcGxhbi0+bGVm dHRyZWUgPSBzdWJwbGFuOwoJcGxhbi0+cmlnaHR0cmVlID0gTlVMTDsKCW5vZGUtPm51bV93 b3JrZXJzID0gbndvcmtlcnM7Cglub2RlLT5yZXNjYW5fcGFyYW0gPSByZXNjYW5fcGFyYW07 Cglub2RlLT5zaW5nbGVfY29weSA9IHNpbmdsZV9jb3B5OwoJbm9kZS0+aW52aXNpYmxlID0g ZmFsc2U7Cglub2RlLT5pbml0UGFyYW0gPSBOVUxMOwoKCXJldHVybiBub2RlOwp9CgovKgog KiBncm91cExpc3QgaXMgYSBsaXN0IG9mIFNvcnRHcm91cENsYXVzZXMsIGlkZW50aWZ5aW5n IHRoZSB0YXJnZXRsaXN0CiAqIGl0ZW1zIHRoYXQgc2hvdWxkIGJlIGNvbnNpZGVyZWQgYnkg dGhlIFNldE9wIGZpbHRlci4gIFRoZSBpbnB1dCBwbGFucyBtdXN0CiAqIGFscmVhZHkgYmUg c29ydGVkIGFjY29yZGluZ2x5LCBpZiB3ZSdyZSBkb2luZyBTRVRPUF9TT1JURUQgbW9kZS4K ICovCnN0YXRpYyBTZXRPcCAqCm1ha2Vfc2V0b3AoU2V0T3BDbWQgY21kLCBTZXRPcFN0cmF0 ZWd5IHN0cmF0ZWd5LAoJCSAgIExpc3QgKnRsaXN0LCBQbGFuICpsZWZ0dHJlZSwgUGxhbiAq cmlnaHR0cmVlLAoJCSAgIExpc3QgKmdyb3VwTGlzdCwgQ2FyZGluYWxpdHkgbnVtR3JvdXBz KQp7CglTZXRPcAkgICAqbm9kZSA9IG1ha2VOb2RlKFNldE9wKTsKCVBsYW4JICAgKnBsYW4g PSAmbm9kZS0+cGxhbjsKCWludAkJCW51bUNvbHMgPSBsaXN0X2xlbmd0aChncm91cExpc3Qp OwoJaW50CQkJa2V5bm8gPSAwOwoJQXR0ck51bWJlciAqY21wQ29sSWR4OwoJT2lkCQkgICAq Y21wT3BlcmF0b3JzOwoJT2lkCQkgICAqY21wQ29sbGF0aW9uczsKCWJvb2wJICAgKmNtcE51 bGxzRmlyc3Q7CglMaXN0Q2VsbCAgICpzbGl0ZW07CgoJcGxhbi0+dGFyZ2V0bGlzdCA9IHRs aXN0OwoJcGxhbi0+cXVhbCA9IE5JTDsKCXBsYW4tPmxlZnR0cmVlID0gbGVmdHRyZWU7Cglw bGFuLT5yaWdodHRyZWUgPSByaWdodHRyZWU7CgoJLyoKCSAqIGNvbnZlcnQgU29ydEdyb3Vw Q2xhdXNlIGxpc3QgaW50byBhcnJheXMgb2YgYXR0ciBpbmRleGVzIGFuZCBjb21wYXJpc29u CgkgKiBvcGVyYXRvcnMsIGFzIHdhbnRlZCBieSBleGVjdXRvcgoJICovCgljbXBDb2xJZHgg PSBwYWxsb2NfYXJyYXkoQXR0ck51bWJlciwgbnVtQ29scyk7CgljbXBPcGVyYXRvcnMgPSBw YWxsb2NfYXJyYXkoT2lkLCBudW1Db2xzKTsKCWNtcENvbGxhdGlvbnMgPSBwYWxsb2NfYXJy YXkoT2lkLCBudW1Db2xzKTsKCWNtcE51bGxzRmlyc3QgPSBwYWxsb2NfYXJyYXkoYm9vbCwg bnVtQ29scyk7CgoJZm9yZWFjaChzbGl0ZW0sIGdyb3VwTGlzdCkKCXsKCQlTb3J0R3JvdXBD bGF1c2UgKnNvcnRjbCA9IChTb3J0R3JvdXBDbGF1c2UgKikgbGZpcnN0KHNsaXRlbSk7CgkJ VGFyZ2V0RW50cnkgKnRsZSA9IGdldF9zb3J0Z3JvdXBjbGF1c2VfdGxlKHNvcnRjbCwgcGxh bi0+dGFyZ2V0bGlzdCk7CgoJCWNtcENvbElkeFtrZXlub10gPSB0bGUtPnJlc25vOwoJCWlm IChzdHJhdGVneSA9PSBTRVRPUF9IQVNIRUQpCgkJCWNtcE9wZXJhdG9yc1trZXlub10gPSBz b3J0Y2wtPmVxb3A7CgkJZWxzZQoJCQljbXBPcGVyYXRvcnNba2V5bm9dID0gc29ydGNsLT5z b3J0b3A7CgkJQXNzZXJ0KE9pZElzVmFsaWQoY21wT3BlcmF0b3JzW2tleW5vXSkpOwoJCWNt cENvbGxhdGlvbnNba2V5bm9dID0gZXhwckNvbGxhdGlvbigoTm9kZSAqKSB0bGUtPmV4cHIp OwoJCWNtcE51bGxzRmlyc3Rba2V5bm9dID0gc29ydGNsLT5udWxsc19maXJzdDsKCQlrZXlu bysrOwoJfQoKCW5vZGUtPmNtZCA9IGNtZDsKCW5vZGUtPnN0cmF0ZWd5ID0gc3RyYXRlZ3k7 Cglub2RlLT5udW1Db2xzID0gbnVtQ29sczsKCW5vZGUtPmNtcENvbElkeCA9IGNtcENvbElk eDsKCW5vZGUtPmNtcE9wZXJhdG9ycyA9IGNtcE9wZXJhdG9yczsKCW5vZGUtPmNtcENvbGxh dGlvbnMgPSBjbXBDb2xsYXRpb25zOwoJbm9kZS0+Y21wTnVsbHNGaXJzdCA9IGNtcE51bGxz Rmlyc3Q7Cglub2RlLT5udW1Hcm91cHMgPSBudW1Hcm91cHM7CgoJcmV0dXJuIG5vZGU7Cn0K Ci8qCiAqIG1ha2VfbG9ja3Jvd3MKICoJICBCdWlsZCBhIExvY2tSb3dzIHBsYW4gbm9kZQog Ki8Kc3RhdGljIExvY2tSb3dzICoKbWFrZV9sb2Nrcm93cyhQbGFuICpsZWZ0dHJlZSwgTGlz dCAqcm93TWFya3MsIGludCBlcHFQYXJhbSkKewoJTG9ja1Jvd3MgICAqbm9kZSA9IG1ha2VO b2RlKExvY2tSb3dzKTsKCVBsYW4JICAgKnBsYW4gPSAmbm9kZS0+cGxhbjsKCglwbGFuLT50 YXJnZXRsaXN0ID0gbGVmdHRyZWUtPnRhcmdldGxpc3Q7CglwbGFuLT5xdWFsID0gTklMOwoJ cGxhbi0+bGVmdHRyZWUgPSBsZWZ0dHJlZTsKCXBsYW4tPnJpZ2h0dHJlZSA9IE5VTEw7CgoJ bm9kZS0+cm93TWFya3MgPSByb3dNYXJrczsKCW5vZGUtPmVwcVBhcmFtID0gZXBxUGFyYW07 CgoJcmV0dXJuIG5vZGU7Cn0KCi8qCiAqIG1ha2VfbGltaXQKICoJICBCdWlsZCBhIExpbWl0 IHBsYW4gbm9kZQogKi8KTGltaXQgKgptYWtlX2xpbWl0KFBsYW4gKmxlZnR0cmVlLCBOb2Rl ICpsaW1pdE9mZnNldCwgTm9kZSAqbGltaXRDb3VudCwKCQkgICBMaW1pdE9wdGlvbiBsaW1p dE9wdGlvbiwgaW50IHVuaXFOdW1Db2xzLCBBdHRyTnVtYmVyICp1bmlxQ29sSWR4LAoJCSAg IE9pZCAqdW5pcU9wZXJhdG9ycywgT2lkICp1bmlxQ29sbGF0aW9ucykKewoJTGltaXQJICAg Km5vZGUgPSBtYWtlTm9kZShMaW1pdCk7CglQbGFuCSAgICpwbGFuID0gJm5vZGUtPnBsYW47 CgoJcGxhbi0+dGFyZ2V0bGlzdCA9IGxlZnR0cmVlLT50YXJnZXRsaXN0OwoJcGxhbi0+cXVh bCA9IE5JTDsKCXBsYW4tPmxlZnR0cmVlID0gbGVmdHRyZWU7CglwbGFuLT5yaWdodHRyZWUg PSBOVUxMOwoKCW5vZGUtPmxpbWl0T2Zmc2V0ID0gbGltaXRPZmZzZXQ7Cglub2RlLT5saW1p dENvdW50ID0gbGltaXRDb3VudDsKCW5vZGUtPmxpbWl0T3B0aW9uID0gbGltaXRPcHRpb247 Cglub2RlLT51bmlxTnVtQ29scyA9IHVuaXFOdW1Db2xzOwoJbm9kZS0+dW5pcUNvbElkeCA9 IHVuaXFDb2xJZHg7Cglub2RlLT51bmlxT3BlcmF0b3JzID0gdW5pcU9wZXJhdG9yczsKCW5v ZGUtPnVuaXFDb2xsYXRpb25zID0gdW5pcUNvbGxhdGlvbnM7CgoJcmV0dXJuIG5vZGU7Cn0K Ci8qCiAqIG1ha2VfZ2F0aW5nX3Jlc3VsdAogKgkgIEJ1aWxkIGEgUmVzdWx0IHBsYW4gbm9k ZSB0aGF0IHBlcmZvcm1zIHByb2plY3Rpb24gb2YgYSBzdWJwbGFuLCBhbmQvb3IKICoJICBh cHBsaWVzIGEgb25lIHRpbWUgZmlsdGVyIChyZXNjb25zdGFudHF1YWwpCiAqLwpzdGF0aWMg UmVzdWx0ICoKbWFrZV9nYXRpbmdfcmVzdWx0KExpc3QgKnRsaXN0LAoJCQkJICAgTm9kZSAq cmVzY29uc3RhbnRxdWFsLAoJCQkJICAgUGxhbiAqc3VicGxhbikKewoJUmVzdWx0CSAgICpu b2RlID0gbWFrZU5vZGUoUmVzdWx0KTsKCVBsYW4JICAgKnBsYW4gPSAmbm9kZS0+cGxhbjsK CglBc3NlcnQoc3VicGxhbiAhPSBOVUxMKTsKCglwbGFuLT50YXJnZXRsaXN0ID0gdGxpc3Q7 CglwbGFuLT5xdWFsID0gTklMOwoJcGxhbi0+bGVmdHRyZWUgPSBzdWJwbGFuOwoJcGxhbi0+ cmlnaHR0cmVlID0gTlVMTDsKCW5vZGUtPnJlc3VsdF90eXBlID0gUkVTVUxUX1RZUEVfR0FU SU5HOwoJbm9kZS0+cmVzY29uc3RhbnRxdWFsID0gcmVzY29uc3RhbnRxdWFsOwoJbm9kZS0+ cmVsaWRzID0gTlVMTDsKCglyZXR1cm4gbm9kZTsKfQoKLyoKICogbWFrZV9vbmVfcm93X3Jl c3VsdAogKgkgIEJ1aWxkIGEgUmVzdWx0IHBsYW4gbm9kZSB0aGF0IHJldHVybnMgYSBzaW5n bGUgcm93IChvciBwb3NzaWJseSBubyByb3dzLAogKgkgIGlmIHRoZSBvbmUtdGltZSBmaWx0 ZXJlZCBkZWZpbmVkIGJ5IHJlc2NvbnN0YW50cXVhbCByZXR1cm5zIGZhbHNlKQogKgogKiAn cmVsJyBzaG91bGQgYmUgdGhpcyBwYXRoJ3MgUmVsT3B0SW5mby4gSW4gZXNzZW5jZSwgd2Un cmUgc2F5aW5nIHRoYXQgdGhpcwogKiBSZXN1bHQgbm9kZSBnZW5lcmF0ZXMgYWxsIHRoZSB0 dXBsZXMgZm9yIHRoYXQgUmVsT3B0SW5mby4gTm90ZSB0aGF0IHRoZSBzYW1lCiAqIGNvbnNp ZGVyYXRpb24gY2FuIG5ldmVyIGFyaXNlIGluIG1ha2VfZ2F0aW5nX3Jlc3VsdCgpLCBiZWNh dXNlIGluIHRoYXQgY2FzZQogKiB0aGUgdHVwbGVzIGFyZSBhbHdheXMgY29taW5nIGZyb20g c29tZSBzdWJvcmRpbmF0ZSBub2RlLgogKi8Kc3RhdGljIFJlc3VsdCAqCm1ha2Vfb25lX3Jv d19yZXN1bHQoTGlzdCAqdGxpc3QsCgkJCQkJTm9kZSAqcmVzY29uc3RhbnRxdWFsLAoJCQkJ CVJlbE9wdEluZm8gKnJlbCkKewoJUmVzdWx0CSAgICpub2RlID0gbWFrZU5vZGUoUmVzdWx0 KTsKCVBsYW4JICAgKnBsYW4gPSAmbm9kZS0+cGxhbjsKCglwbGFuLT50YXJnZXRsaXN0ID0g dGxpc3Q7CglwbGFuLT5xdWFsID0gTklMOwoJcGxhbi0+bGVmdHRyZWUgPSBOVUxMOwoJcGxh bi0+cmlnaHR0cmVlID0gTlVMTDsKCW5vZGUtPnJlc3VsdF90eXBlID0gSVNfVVBQRVJfUkVM KHJlbCkgPyBSRVNVTFRfVFlQRV9VUFBFUiA6CgkJSVNfSk9JTl9SRUwocmVsKSA/IFJFU1VM VF9UWVBFX0pPSU4gOiBSRVNVTFRfVFlQRV9TQ0FOOwoJbm9kZS0+cmVzY29uc3RhbnRxdWFs ID0gcmVzY29uc3RhbnRxdWFsOwoJbm9kZS0+cmVsaWRzID0gcmVsLT5yZWxpZHM7CgoJcmV0 dXJuIG5vZGU7Cn0KCi8qCiAqIG1ha2VfcHJvamVjdF9zZXQKICoJICBCdWlsZCBhIFByb2pl Y3RTZXQgcGxhbiBub2RlCiAqLwpzdGF0aWMgUHJvamVjdFNldCAqCm1ha2VfcHJvamVjdF9z ZXQoTGlzdCAqdGxpc3QsCgkJCQkgUGxhbiAqc3VicGxhbikKewoJUHJvamVjdFNldCAqbm9k ZSA9IG1ha2VOb2RlKFByb2plY3RTZXQpOwoJUGxhbgkgICAqcGxhbiA9ICZub2RlLT5wbGFu OwoKCXBsYW4tPnRhcmdldGxpc3QgPSB0bGlzdDsKCXBsYW4tPnF1YWwgPSBOSUw7CglwbGFu LT5sZWZ0dHJlZSA9IHN1YnBsYW47CglwbGFuLT5yaWdodHRyZWUgPSBOVUxMOwoKCXJldHVy biBub2RlOwp9CgovKgogKiBtYWtlX21vZGlmeXRhYmxlCiAqCSAgQnVpbGQgYSBNb2RpZnlU YWJsZSBwbGFuIG5vZGUKICovCnN0YXRpYyBNb2RpZnlUYWJsZSAqCm1ha2VfbW9kaWZ5dGFi bGUoUGxhbm5lckluZm8gKnJvb3QsIFBsYW4gKnN1YnBsYW4sCgkJCQkgQ21kVHlwZSBvcGVy YXRpb24sIGJvb2wgY2FuU2V0VGFnLAoJCQkJIEluZGV4IG5vbWluYWxSZWxhdGlvbiwgSW5k ZXggcm9vdFJlbGF0aW9uLAoJCQkJIExpc3QgKnJlc3VsdFJlbGF0aW9ucywKCQkJCSBMaXN0 ICp1cGRhdGVDb2xub3NMaXN0cywKCQkJCSBMaXN0ICp3aXRoQ2hlY2tPcHRpb25MaXN0cywg TGlzdCAqcmV0dXJuaW5nTGlzdHMsCgkJCQkgTGlzdCAqcm93TWFya3MsIE9uQ29uZmxpY3RF eHByICpvbmNvbmZsaWN0LAoJCQkJIExpc3QgKm1lcmdlQWN0aW9uTGlzdHMsIExpc3QgKm1l cmdlSm9pbkNvbmRpdGlvbnMsCgkJCQkgRm9yUG9ydGlvbk9mRXhwciAqZm9yUG9ydGlvbk9m LCBpbnQgZXBxUGFyYW0pCnsKCU1vZGlmeVRhYmxlICpub2RlID0gbWFrZU5vZGUoTW9kaWZ5 VGFibGUpOwoJYm9vbAkJcmV0dXJuaW5nX29sZF9vcl9uZXcgPSBmYWxzZTsKCWJvb2wJCXJl dHVybmluZ19vbGRfb3JfbmV3X3ZhbGlkID0gZmFsc2U7Cglib29sCQl0cmFuc2l0aW9uX3Rh YmxlcyA9IGZhbHNlOwoJYm9vbAkJdHJhbnNpdGlvbl90YWJsZXNfdmFsaWQgPSBmYWxzZTsK CUxpc3QJICAgKmZkd19wcml2YXRlX2xpc3Q7CglCaXRtYXBzZXQgICpkaXJlY3RfbW9kaWZ5 X3BsYW5zOwoJTGlzdENlbGwgICAqbGM7CglpbnQJCQlpOwoKCUFzc2VydChvcGVyYXRpb24g PT0gQ01EX01FUkdFIHx8CgkJICAgKG9wZXJhdGlvbiA9PSBDTURfVVBEQVRFID8KCQkJbGlz dF9sZW5ndGgocmVzdWx0UmVsYXRpb25zKSA9PSBsaXN0X2xlbmd0aCh1cGRhdGVDb2xub3NM aXN0cykgOgoJCQl1cGRhdGVDb2xub3NMaXN0cyA9PSBOSUwpKTsKCUFzc2VydCh3aXRoQ2hl Y2tPcHRpb25MaXN0cyA9PSBOSUwgfHwKCQkgICBsaXN0X2xlbmd0aChyZXN1bHRSZWxhdGlv bnMpID09IGxpc3RfbGVuZ3RoKHdpdGhDaGVja09wdGlvbkxpc3RzKSk7CglBc3NlcnQocmV0 dXJuaW5nTGlzdHMgPT0gTklMIHx8CgkJICAgbGlzdF9sZW5ndGgocmVzdWx0UmVsYXRpb25z KSA9PSBsaXN0X2xlbmd0aChyZXR1cm5pbmdMaXN0cykpOwoKCW5vZGUtPnBsYW4ubGVmdHRy ZWUgPSBzdWJwbGFuOwoJbm9kZS0+cGxhbi5yaWdodHRyZWUgPSBOVUxMOwoJbm9kZS0+cGxh bi5xdWFsID0gTklMOwoJLyogc2V0cmVmcy5jIHdpbGwgZmlsbCBpbiB0aGUgdGFyZ2V0bGlz dCwgaWYgbmVlZGVkICovCglub2RlLT5wbGFuLnRhcmdldGxpc3QgPSBOSUw7CgoJbm9kZS0+ b3BlcmF0aW9uID0gb3BlcmF0aW9uOwoJbm9kZS0+Y2FuU2V0VGFnID0gY2FuU2V0VGFnOwoJ bm9kZS0+bm9taW5hbFJlbGF0aW9uID0gbm9taW5hbFJlbGF0aW9uOwoJbm9kZS0+cm9vdFJl bGF0aW9uID0gcm9vdFJlbGF0aW9uOwoJbm9kZS0+cmVzdWx0UmVsYXRpb25zID0gcmVzdWx0 UmVsYXRpb25zOwoJaWYgKCFvbmNvbmZsaWN0KQoJewoJCW5vZGUtPm9uQ29uZmxpY3RBY3Rp b24gPSBPTkNPTkZMSUNUX05PTkU7CgkJbm9kZS0+b25Db25mbGljdExvY2tTdHJlbmd0aCA9 IExDU19OT05FOwoJCW5vZGUtPm9uQ29uZmxpY3RTZXQgPSBOSUw7CgkJbm9kZS0+b25Db25m bGljdENvbHMgPSBOSUw7CgkJbm9kZS0+b25Db25mbGljdFdoZXJlID0gTlVMTDsKCQlub2Rl LT5hcmJpdGVySW5kZXhlcyA9IE5JTDsKCQlub2RlLT5leGNsUmVsUlRJID0gMDsKCQlub2Rl LT5leGNsUmVsVGxpc3QgPSBOSUw7Cgl9CgllbHNlCgl7CgkJbm9kZS0+b25Db25mbGljdEFj dGlvbiA9IG9uY29uZmxpY3QtPmFjdGlvbjsKCgkJLyogTG9jayBzdHJlbmd0aCBmb3IgT04g Q09ORkxJQ1QgRE8gU0VMRUNUIFtGT1IgVVBEQVRFL1NIQVJFXSAqLwoJCW5vZGUtPm9uQ29u ZmxpY3RMb2NrU3RyZW5ndGggPSBvbmNvbmZsaWN0LT5sb2NrU3RyZW5ndGg7CgoJCS8qCgkJ ICogSGVyZSB3ZSBjb252ZXJ0IHRoZSBPTiBDT05GTElDVCBVUERBVEUgdGxpc3QsIGlmIGFu eSwgdG8gdGhlCgkJICogZXhlY3V0b3IncyBjb252ZW50aW9uIG9mIGhhdmluZyBjb25zZWN1 dGl2ZSByZXNubydzLiAgVGhlIGFjdHVhbAoJCSAqIHRhcmdldCBjb2x1bW4gbnVtYmVycyBh cmUgc2F2ZWQgaW4gbm9kZS0+b25Db25mbGljdENvbHMuICAoVGhpcwoJCSAqIGNvdWxkIGJl IGRvbmUgZWFybGllciwgYnV0IHRoZXJlIHNlZW1zIG5vIG5lZWQgdG8uKQoJCSAqLwoJCW5v ZGUtPm9uQ29uZmxpY3RTZXQgPSBvbmNvbmZsaWN0LT5vbkNvbmZsaWN0U2V0OwoJCW5vZGUt Pm9uQ29uZmxpY3RDb2xzID0KCQkJZXh0cmFjdF91cGRhdGVfdGFyZ2V0bGlzdF9jb2xub3Mo bm9kZS0+b25Db25mbGljdFNldCk7CgkJbm9kZS0+b25Db25mbGljdFdoZXJlID0gb25jb25m bGljdC0+b25Db25mbGljdFdoZXJlOwoKCQkvKgoJCSAqIElmIGEgc2V0IG9mIHVuaXF1ZSBp bmRleCBpbmZlcmVuY2UgZWxlbWVudHMgd2FzIHByb3ZpZGVkIChhbgoJCSAqIElOU0VSVC4u Lk9OIENPTkZMSUNUICJpbmZlcmVuY2Ugc3BlY2lmaWNhdGlvbiIpLCB0aGVuIGluZmVyCgkJ ICogYXBwcm9wcmlhdGUgdW5pcXVlIGluZGV4ZXMgKG9yIHRocm93IGFuIGVycm9yIGlmIG5v bmUgYXJlCgkJICogYXZhaWxhYmxlKS4KCQkgKi8KCQlub2RlLT5hcmJpdGVySW5kZXhlcyA9 IGluZmVyX2FyYml0ZXJfaW5kZXhlcyhyb290KTsKCgkJbm9kZS0+ZXhjbFJlbFJUSSA9IG9u Y29uZmxpY3QtPmV4Y2xSZWxJbmRleDsKCQlub2RlLT5leGNsUmVsVGxpc3QgPSBvbmNvbmZs aWN0LT5leGNsUmVsVGxpc3Q7Cgl9Cglub2RlLT51cGRhdGVDb2xub3NMaXN0cyA9IHVwZGF0 ZUNvbG5vc0xpc3RzOwoJbm9kZS0+Zm9yUG9ydGlvbk9mID0gKE5vZGUgKikgZm9yUG9ydGlv bk9mOwoJbm9kZS0+d2l0aENoZWNrT3B0aW9uTGlzdHMgPSB3aXRoQ2hlY2tPcHRpb25MaXN0 czsKCW5vZGUtPnJldHVybmluZ09sZEFsaWFzID0gcm9vdC0+cGFyc2UtPnJldHVybmluZ09s ZEFsaWFzOwoJbm9kZS0+cmV0dXJuaW5nTmV3QWxpYXMgPSByb290LT5wYXJzZS0+cmV0dXJu aW5nTmV3QWxpYXM7Cglub2RlLT5yZXR1cm5pbmdMaXN0cyA9IHJldHVybmluZ0xpc3RzOwoJ bm9kZS0+cm93TWFya3MgPSByb3dNYXJrczsKCW5vZGUtPm1lcmdlQWN0aW9uTGlzdHMgPSBt ZXJnZUFjdGlvbkxpc3RzOwoJbm9kZS0+bWVyZ2VKb2luQ29uZGl0aW9ucyA9IG1lcmdlSm9p bkNvbmRpdGlvbnM7Cglub2RlLT5lcHFQYXJhbSA9IGVwcVBhcmFtOwoKCS8qCgkgKiBGb3Ig ZWFjaCByZXN1bHQgcmVsYXRpb24gdGhhdCBpcyBhIGZvcmVpZ24gdGFibGUsIGFsbG93IHRo ZSBGRFcgdG8KCSAqIGNvbnN0cnVjdCBwcml2YXRlIHBsYW4gZGF0YSwgYW5kIGFjY3VtdWxh dGUgaXQgYWxsIGludG8gYSBsaXN0LgoJICovCglmZHdfcHJpdmF0ZV9saXN0ID0gTklMOwoJ ZGlyZWN0X21vZGlmeV9wbGFucyA9IE5VTEw7CglpID0gMDsKCWZvcmVhY2gobGMsIHJlc3Vs dFJlbGF0aW9ucykKCXsKCQlJbmRleAkJcnRpID0gbGZpcnN0X2ludChsYyk7CgkJRmR3Um91 dGluZSAqZmR3cm91dGluZTsKCQlMaXN0CSAgICpmZHdfcHJpdmF0ZTsKCQlib29sCQlkaXJl Y3RfbW9kaWZ5OwoKCQkvKgoJCSAqIElmIHBvc3NpYmxlLCB3ZSB3YW50IHRvIGdldCB0aGUg RmR3Um91dGluZSBmcm9tIG91ciBSZWxPcHRJbmZvIGZvcgoJCSAqIHRoZSB0YWJsZS4gIEJ1 dCBzb21ldGltZXMgd2UgZG9uJ3QgaGF2ZSBhIFJlbE9wdEluZm8gYW5kIG11c3QgZ2V0CgkJ ICogaXQgdGhlIGhhcmQgd2F5LiAgKEluIElOU0VSVCwgdGhlIHRhcmdldCByZWxhdGlvbiBp cyBub3Qgc2Nhbm5lZCwKCQkgKiBzbyBpdCdzIG5vdCBhIGJhc2VyZWw7IGFuZCB0aGVyZSBh cmUgYWxzbyBjb3JuZXIgY2FzZXMgZm9yCgkJICogdXBkYXRhYmxlIHZpZXdzIHdoZXJlIHRo ZSB0YXJnZXQgcmVsIGlzbid0IGEgYmFzZXJlbC4pCgkJICovCgkJaWYgKHJ0aSA8IHJvb3Qt PnNpbXBsZV9yZWxfYXJyYXlfc2l6ZSAmJgoJCQlyb290LT5zaW1wbGVfcmVsX2FycmF5W3J0 aV0gIT0gTlVMTCkKCQl7CgkJCVJlbE9wdEluZm8gKnJlc3VsdFJlbCA9IHJvb3QtPnNpbXBs ZV9yZWxfYXJyYXlbcnRpXTsKCgkJCWZkd3JvdXRpbmUgPSByZXN1bHRSZWwtPmZkd3JvdXRp bmU7CgkJfQoJCWVsc2UKCQl7CgkJCVJhbmdlVGJsRW50cnkgKnJ0ZSA9IHBsYW5uZXJfcnRf ZmV0Y2gocnRpLCByb290KTsKCgkJCWlmIChydGUtPnJ0ZWtpbmQgPT0gUlRFX1JFTEFUSU9O ICYmCgkJCQlydGUtPnJlbGtpbmQgPT0gUkVMS0lORF9GT1JFSUdOX1RBQkxFKQoJCQl7CgkJ CQkvKiBDaGVjayBpZiB0aGUgYWNjZXNzIHRvIGZvcmVpZ24gdGFibGVzIGlzIHJlc3RyaWN0 ZWQgKi8KCQkJCWlmICh1bmxpa2VseSgocmVzdHJpY3Rfbm9uc3lzdGVtX3JlbGF0aW9uX2tp bmQgJiBSRVNUUklDVF9SRUxLSU5EX0ZPUkVJR05fVEFCTEUpICE9IDApKQoJCQkJewoJCQkJ CS8qIHRoZXJlIG11c3Qgbm90IGJlIGJ1aWx0LWluIGZvcmVpZ24gdGFibGVzICovCgkJCQkJ QXNzZXJ0KHJ0ZS0+cmVsaWQgPj0gRmlyc3ROb3JtYWxPYmplY3RJZCk7CgkJCQkJZXJlcG9y dChFUlJPUiwKCQkJCQkJCShlcnJjb2RlKEVSUkNPREVfT0JKRUNUX05PVF9JTl9QUkVSRVFV SVNJVEVfU1RBVEUpLAoJCQkJCQkJIGVycm1zZygiYWNjZXNzIHRvIG5vbi1zeXN0ZW0gZm9y ZWlnbiB0YWJsZSBpcyByZXN0cmljdGVkIikpKTsKCQkJCX0KCgkJCQlmZHdyb3V0aW5lID0g R2V0RmR3Um91dGluZUJ5UmVsSWQocnRlLT5yZWxpZCk7CgkJCX0KCQkJZWxzZQoJCQkJZmR3 cm91dGluZSA9IE5VTEw7CgkJfQoKCQkvKgoJCSAqIE1FUkdFIGlzIG5vdCBjdXJyZW50bHkg c3VwcG9ydGVkIGZvciBmb3JlaWduIHRhYmxlcy4gIFdlIGFscmVhZHkKCQkgKiBjaGVja2Vk IHRoYXQgd2hlbiB0aGUgdGFibGUgbWVudGlvbmVkIGluIHRoZSBxdWVyeSBpcyBmb3JlaWdu OyBidXQKCQkgKiB3ZSBjYW4gc3RpbGwgZ2V0IGhlcmUgaWYgYSBwYXJ0aXRpb25lZCB0YWJs ZSBoYXMgYSBmb3JlaWduIHRhYmxlIGFzCgkJICogcGFydGl0aW9uLiAgRGlzYWxsb3cgdGhh dCBub3csIHRvIGF2b2lkIGFuIHVnbGllciBlcnJvciBtZXNzYWdlCgkJICogbGF0ZXIuCgkJ ICovCgkJaWYgKG9wZXJhdGlvbiA9PSBDTURfTUVSR0UgJiYgZmR3cm91dGluZSAhPSBOVUxM KQoJCXsKCQkJUmFuZ2VUYmxFbnRyeSAqcnRlID0gcGxhbm5lcl9ydF9mZXRjaChydGksIHJv b3QpOwoKCQkJZXJlcG9ydChFUlJPUiwKCQkJCQllcnJjb2RlKEVSUkNPREVfRkVBVFVSRV9O T1RfU1VQUE9SVEVEKSwKCQkJCQllcnJtc2coImNhbm5vdCBleGVjdXRlIE1FUkdFIG9uIHJl bGF0aW9uIFwiJXNcIiIsCgkJCQkJCSAgIGdldF9yZWxfbmFtZShydGUtPnJlbGlkKSksCgkJ CQkJZXJyZGV0YWlsX3JlbGtpbmRfbm90X3N1cHBvcnRlZChydGUtPnJlbGtpbmQpKTsKCQl9 CgoJCS8qCgkJICogVHJ5IHRvIG1vZGlmeSB0aGUgZm9yZWlnbiB0YWJsZSBkaXJlY3RseSBp ZiAoMSkgdGhlIEZEVyBwcm92aWRlcwoJCSAqIGNhbGxiYWNrIGZ1bmN0aW9ucyBuZWVkZWQg Zm9yIHRoYXQgYW5kICgyKSB0aGVyZSBhcmUgbm8gbG9jYWwKCQkgKiBzdHJ1Y3R1cmVzIHRo YXQgbmVlZCB0byBiZSBydW4gZm9yIGVhY2ggbW9kaWZpZWQgcm93OiByb3ctbGV2ZWwKCQkg KiB0cmlnZ2VycyBvbiB0aGUgZm9yZWlnbiB0YWJsZSwgc3RvcmVkIGdlbmVyYXRlZCBjb2x1 bW5zLCBXSVRIIENIRUNLCgkJICogT1BUSU9OcyBmcm9tIHBhcmVudCB2aWV3cywgVmFycyBy ZXR1cm5pbmcgT0xEL05FVyBpbiB0aGUgUkVUVVJOSU5HCgkJICogbGlzdCwgb3IgdHJhbnNp dGlvbiB0YWJsZXMgb24gdGhlIG5hbWVkIHJlbGF0aW9uLgoJCSAqLwoJCWRpcmVjdF9tb2Rp ZnkgPSBmYWxzZTsKCQlpZiAoZmR3cm91dGluZSAhPSBOVUxMICYmCgkJCWZkd3JvdXRpbmUt PlBsYW5EaXJlY3RNb2RpZnkgIT0gTlVMTCAmJgoJCQlmZHdyb3V0aW5lLT5CZWdpbkRpcmVj dE1vZGlmeSAhPSBOVUxMICYmCgkJCWZkd3JvdXRpbmUtPkl0ZXJhdGVEaXJlY3RNb2RpZnkg IT0gTlVMTCAmJgoJCQlmZHdyb3V0aW5lLT5FbmREaXJlY3RNb2RpZnkgIT0gTlVMTCAmJgoJ CQl3aXRoQ2hlY2tPcHRpb25MaXN0cyA9PSBOSUwgJiYKCQkJIWhhc19yb3dfdHJpZ2dlcnMo cm9vdCwgcnRpLCBvcGVyYXRpb24pICYmCgkJCSFoYXNfc3RvcmVkX2dlbmVyYXRlZF9jb2x1 bW5zKHJvb3QsIHJ0aSkpCgkJewoJCQkvKgoJCQkgKiByZXR1cm5pbmdfb2xkX29yX25ldyBh bmQgdHJhbnNpdGlvbl90YWJsZXMgYXJlIHRoZSBzYW1lIGZvciBhbGwKCQkJICogcmVzdWx0 IHJlbGF0aW9ucywgcmVzcGVjdGl2ZWx5CgkJCSAqLwoJCQlpZiAoIXJldHVybmluZ19vbGRf b3JfbmV3X3ZhbGlkKQoJCQl7CgkJCQlyZXR1cm5pbmdfb2xkX29yX25ldyA9CgkJCQkJY29u dGFpbl92YXJzX3JldHVybmluZ19vbGRfb3JfbmV3KChOb2RlICopCgkJCQkJCQkJCQkJCQkg IHJvb3QtPnBhcnNlLT5yZXR1cm5pbmdMaXN0KTsKCQkJCXJldHVybmluZ19vbGRfb3JfbmV3 X3ZhbGlkID0gdHJ1ZTsKCQkJfQoJCQlpZiAoIXJldHVybmluZ19vbGRfb3JfbmV3KQoJCQl7 CgkJCQlpZiAoIXRyYW5zaXRpb25fdGFibGVzX3ZhbGlkKQoJCQkJewoJCQkJCXRyYW5zaXRp b25fdGFibGVzID0gaGFzX3RyYW5zaXRpb25fdGFibGVzKHJvb3QsCgkJCQkJCQkJCQkJCQkJ CSAgbm9taW5hbFJlbGF0aW9uLAoJCQkJCQkJCQkJCQkJCQkgIG9wZXJhdGlvbik7CgkJCQkJ dHJhbnNpdGlvbl90YWJsZXNfdmFsaWQgPSB0cnVlOwoJCQkJfQoJCQkJaWYgKCF0cmFuc2l0 aW9uX3RhYmxlcykKCQkJCQlkaXJlY3RfbW9kaWZ5ID0gZmR3cm91dGluZS0+UGxhbkRpcmVj dE1vZGlmeShyb290LCBub2RlLAoJCQkJCQkJCQkJCQkJCQkJIHJ0aSwgaSk7CgkJCX0KCQl9 CgkJaWYgKGRpcmVjdF9tb2RpZnkpCgkJCWRpcmVjdF9tb2RpZnlfcGxhbnMgPSBibXNfYWRk X21lbWJlcihkaXJlY3RfbW9kaWZ5X3BsYW5zLCBpKTsKCgkJaWYgKCFkaXJlY3RfbW9kaWZ5 ICYmCgkJCWZkd3JvdXRpbmUgIT0gTlVMTCAmJgoJCQlmZHdyb3V0aW5lLT5QbGFuRm9yZWln bk1vZGlmeSAhPSBOVUxMKQoJCQlmZHdfcHJpdmF0ZSA9IGZkd3JvdXRpbmUtPlBsYW5Gb3Jl aWduTW9kaWZ5KHJvb3QsIG5vZGUsIHJ0aSwgaSk7CgkJZWxzZQoJCQlmZHdfcHJpdmF0ZSA9 IE5JTDsKCQlmZHdfcHJpdmF0ZV9saXN0ID0gbGFwcGVuZChmZHdfcHJpdmF0ZV9saXN0LCBm ZHdfcHJpdmF0ZSk7CgkJaSsrOwoJfQoJbm9kZS0+ZmR3UHJpdkxpc3RzID0gZmR3X3ByaXZh dGVfbGlzdDsKCW5vZGUtPmZkd0RpcmVjdE1vZGlmeVBsYW5zID0gZGlyZWN0X21vZGlmeV9w bGFuczsKCglyZXR1cm4gbm9kZTsKfQoKLyoKICogaXNfcHJvamVjdGlvbl9jYXBhYmxlX3Bh dGgKICoJCUNoZWNrIHdoZXRoZXIgYSBnaXZlbiBQYXRoIG5vZGUgaXMgYWJsZSB0byBkbyBw cm9qZWN0aW9uLgogKi8KYm9vbAppc19wcm9qZWN0aW9uX2NhcGFibGVfcGF0aChQYXRoICpw YXRoKQp7CgkvKiBNb3N0IHBsYW4gdHlwZXMgY2FuIHByb2plY3QsIHNvIGp1c3QgbGlzdCB0 aGUgb25lcyB0aGF0IGNhbid0ICovCglzd2l0Y2ggKHBhdGgtPnBhdGh0eXBlKQoJewoJCWNh c2UgVF9IYXNoOgoJCWNhc2UgVF9NYXRlcmlhbDoKCQljYXNlIFRfTWVtb2l6ZToKCQljYXNl IFRfU29ydDoKCQljYXNlIFRfSW5jcmVtZW50YWxTb3J0OgoJCWNhc2UgVF9VbmlxdWU6CgkJ Y2FzZSBUX1NldE9wOgoJCWNhc2UgVF9Mb2NrUm93czoKCQljYXNlIFRfTGltaXQ6CgkJY2Fz ZSBUX01vZGlmeVRhYmxlOgoJCWNhc2UgVF9NZXJnZUFwcGVuZDoKCQljYXNlIFRfUmVjdXJz aXZlVW5pb246CgkJCXJldHVybiBmYWxzZTsKCQljYXNlIFRfQ3VzdG9tU2NhbjoKCQkJaWYg KGNhc3ROb2RlKEN1c3RvbVBhdGgsIHBhdGgpLT5mbGFncyAmIENVU1RPTVBBVEhfU1VQUE9S VF9QUk9KRUNUSU9OKQoJCQkJcmV0dXJuIHRydWU7CgkJCXJldHVybiBmYWxzZTsKCQljYXNl IFRfQXBwZW5kOgoKCQkJLyoKCQkJICogQXBwZW5kIGNhbid0IHByb2plY3QsIGJ1dCBpZiBh biBBcHBlbmRQYXRoIGlzIGJlaW5nIHVzZWQgdG8KCQkJICogcmVwcmVzZW50IGEgZHVtbXkg cGF0aCwgd2hhdCB3aWxsIGFjdHVhbGx5IGJlIGdlbmVyYXRlZCBpcyBhCgkJCSAqIFJlc3Vs dCB3aGljaCBjYW4gcHJvamVjdC4KCQkJICovCgkJCXJldHVybiBJU19EVU1NWV9BUFBFTkQo cGF0aCk7CgkJY2FzZSBUX1Byb2plY3RTZXQ6CgoJCQkvKgoJCQkgKiBBbHRob3VnaCBQcm9q ZWN0U2V0IGNlcnRhaW5seSBwcm9qZWN0cywgc2F5ICJubyIgYmVjYXVzZSB3ZQoJCQkgKiBk b24ndCB3YW50IHRoZSBwbGFubmVyIHRvIHJhbmRvbWx5IHJlcGxhY2UgaXRzIHRsaXN0IHdp dGgKCQkJICogc29tZXRoaW5nIGVsc2U7IHRoZSBTUkZzIGhhdmUgdG8gc3RheSBhdCB0b3Ag bGV2ZWwuICBUaGlzIG1pZ2h0CgkJCSAqIGdldCByZWxheGVkIGxhdGVyLgoJCQkgKi8KCQkJ cmV0dXJuIGZhbHNlOwoJCWRlZmF1bHQ6CgkJCWJyZWFrOwoJfQoJcmV0dXJuIHRydWU7Cn0K Ci8qCiAqIGlzX3Byb2plY3Rpb25fY2FwYWJsZV9wbGFuCiAqCQlDaGVjayB3aGV0aGVyIGEg Z2l2ZW4gUGxhbiBub2RlIGlzIGFibGUgdG8gZG8gcHJvamVjdGlvbi4KICovCmJvb2wKaXNf cHJvamVjdGlvbl9jYXBhYmxlX3BsYW4oUGxhbiAqcGxhbikKewoJLyogTW9zdCBwbGFuIHR5 cGVzIGNhbiBwcm9qZWN0LCBzbyBqdXN0IGxpc3QgdGhlIG9uZXMgdGhhdCBjYW4ndCAqLwoJ c3dpdGNoIChub2RlVGFnKHBsYW4pKQoJewoJCWNhc2UgVF9IYXNoOgoJCWNhc2UgVF9NYXRl cmlhbDoKCQljYXNlIFRfTWVtb2l6ZToKCQljYXNlIFRfU29ydDoKCQljYXNlIFRfVW5pcXVl OgoJCWNhc2UgVF9TZXRPcDoKCQljYXNlIFRfTG9ja1Jvd3M6CgkJY2FzZSBUX0xpbWl0OgoJ CWNhc2UgVF9Nb2RpZnlUYWJsZToKCQljYXNlIFRfQXBwZW5kOgoJCWNhc2UgVF9NZXJnZUFw cGVuZDoKCQljYXNlIFRfUmVjdXJzaXZlVW5pb246CgkJCXJldHVybiBmYWxzZTsKCQljYXNl IFRfQ3VzdG9tU2NhbjoKCQkJaWYgKCgoQ3VzdG9tU2NhbiAqKSBwbGFuKS0+ZmxhZ3MgJiBD VVNUT01QQVRIX1NVUFBPUlRfUFJPSkVDVElPTikKCQkJCXJldHVybiB0cnVlOwoJCQlyZXR1 cm4gZmFsc2U7CgkJY2FzZSBUX1Byb2plY3RTZXQ6CgoJCQkvKgoJCQkgKiBBbHRob3VnaCBQ cm9qZWN0U2V0IGNlcnRhaW5seSBwcm9qZWN0cywgc2F5ICJubyIgYmVjYXVzZSB3ZQoJCQkg KiBkb24ndCB3YW50IHRoZSBwbGFubmVyIHRvIHJhbmRvbWx5IHJlcGxhY2UgaXRzIHRsaXN0 IHdpdGgKCQkJICogc29tZXRoaW5nIGVsc2U7IHRoZSBTUkZzIGhhdmUgdG8gc3RheSBhdCB0 b3AgbGV2ZWwuICBUaGlzIG1pZ2h0CgkJCSAqIGdldCByZWxheGVkIGxhdGVyLgoJCQkgKi8K CQkJcmV0dXJuIGZhbHNlOwoJCWRlZmF1bHQ6CgkJCWJyZWFrOwoJfQoJcmV0dXJuIHRydWU7 Cn0KAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAuL2V4ZWNJbmRleGluZy5jAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA MDAwMDY2NAAwMDAxNzUwADAwMDE3NTAAMDAwMDAxMTQ1NDQAMTUyMjE2MDM3NTAAMDEyNDc1 ACAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHVzdGFy ICAAeG1hbgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB4bWFuAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC8qLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LQogKgogKiBleGVjSW5kZXhpbmcuYwogKgkgIHJvdXRpbmVzIGZvciBpbnNlcnRpbmcgaW5k ZXggdHVwbGVzIGFuZCBlbmZvcmNpbmcgdW5pcXVlIGFuZAogKgkgIGV4Y2x1c2lvbiBjb25z dHJhaW50cy4KICoKICogRXhlY0luc2VydEluZGV4VHVwbGVzKCkgaXMgdGhlIG1haW4gZW50 cnkgcG9pbnQuICBJdCdzIGNhbGxlZCBhZnRlcgogKiBpbnNlcnRpbmcgYSB0dXBsZSB0byB0 aGUgaGVhcCwgYW5kIGl0IGluc2VydHMgY29ycmVzcG9uZGluZyBpbmRleCB0dXBsZXMKICog aW50byBhbGwgaW5kZXhlcy4gIEF0IHRoZSBzYW1lIHRpbWUsIGl0IGVuZm9yY2VzIGFueSB1 bmlxdWUgYW5kCiAqIGV4Y2x1c2lvbiBjb25zdHJhaW50czoKICoKICogVW5pcXVlIEluZGV4 ZXMKICogLS0tLS0tLS0tLS0tLS0KICoKICogRW5mb3JjaW5nIGEgdW5pcXVlIGNvbnN0cmFp bnQgaXMgc3RyYWlnaHRmb3J3YXJkLiAgV2hlbiB0aGUgaW5kZXggQU0KICogaW5zZXJ0cyB0 aGUgdHVwbGUgdG8gdGhlIGluZGV4LCBpdCBhbHNvIGNoZWNrcyB0aGF0IHRoZXJlIGFyZSBu bwogKiBjb25mbGljdGluZyB0dXBsZXMgaW4gdGhlIGluZGV4IGFscmVhZHkuICBJdCBkb2Vz IHNvIGF0b21pY2FsbHksIHNvIHRoYXQKICogZXZlbiBpZiB0d28gYmFja2VuZHMgdHJ5IHRv IGluc2VydCB0aGUgc2FtZSBrZXkgY29uY3VycmVudGx5LCBvbmx5IG9uZQogKiBvZiB0aGVt IHdpbGwgc3VjY2VlZC4gIEFsbCB0aGUgbG9naWMgdG8gZW5zdXJlIGF0b21pY2l0eSwgYW5k IHRvIHdhaXQKICogZm9yIGluLXByb2dyZXNzIHRyYW5zYWN0aW9ucyB0byBmaW5pc2gsIGlz IGhhbmRsZWQgYnkgdGhlIGluZGV4IEFNLgogKgogKiBJZiBhIHVuaXF1ZSBjb25zdHJhaW50 IGlzIGRlZmVycmVkLCB3ZSByZXF1ZXN0IHRoZSBpbmRleCBBTSB0byBub3QKICogdGhyb3cg YW4gZXJyb3IgaWYgYSBjb25mbGljdCBpcyBmb3VuZC4gIEluc3RlYWQsIHdlIG1ha2Ugbm90 ZSB0aGF0IHRoZXJlCiAqIHdhcyBhIGNvbmZsaWN0IGFuZCByZXR1cm4gdGhlIGxpc3Qgb2Yg aW5kZXhlcyB3aXRoIGNvbmZsaWN0cyB0byB0aGUKICogY2FsbGVyLiAgVGhlIGNhbGxlciBt dXN0IHJlLWNoZWNrIHRoZW0gbGF0ZXIsIGJ5IGNhbGxpbmcgaW5kZXhfaW5zZXJ0KCkKICog d2l0aCB0aGUgVU5JUVVFX0NIRUNLX0VYSVNUSU5HIG9wdGlvbi4KICoKICogRXhjbHVzaW9u IENvbnN0cmFpbnRzCiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLQogKgogKiBFeGNsdXNpb24g Y29uc3RyYWludHMgYXJlIGRpZmZlcmVudCBmcm9tIHVuaXF1ZSBpbmRleGVzIGluIHRoYXQg d2hlbiB0aGUKICogdHVwbGUgaXMgaW5zZXJ0ZWQgdG8gdGhlIGluZGV4LCB0aGUgaW5kZXgg QU0gZG9lcyBub3QgY2hlY2sgZm9yCiAqIGR1cGxpY2F0ZSBrZXlzIGF0IHRoZSBzYW1lIHRp bWUuICBBZnRlciB0aGUgaW5zZXJ0aW9uLCB3ZSBwZXJmb3JtIGEKICogc2VwYXJhdGUgc2Nh biBvbiB0aGUgaW5kZXggdG8gY2hlY2sgZm9yIGNvbmZsaWN0aW5nIHR1cGxlcywgYW5kIGlm IG9uZQogKiBpcyBmb3VuZCwgd2UgdGhyb3cgYW4gZXJyb3IgYW5kIHRoZSB0cmFuc2FjdGlv biBpcyBhYm9ydGVkLiAgSWYgdGhlCiAqIGNvbmZsaWN0aW5nIHR1cGxlJ3MgaW5zZXJ0ZXIg b3IgZGVsZXRlciBpcyBpbi1wcm9ncmVzcywgd2Ugd2FpdCBmb3IgaXQKICogdG8gZmluaXNo IGZpcnN0LgogKgogKiBUaGVyZSBpcyBhIGNoYW5jZSBvZiBkZWFkbG9jaywgaWYgdHdvIGJh Y2tlbmRzIGluc2VydCBhIHR1cGxlIGF0IHRoZQogKiBzYW1lIHRpbWUsIGFuZCB0aGVuIHBl cmZvcm0gdGhlIHNjYW4gdG8gY2hlY2sgZm9yIGNvbmZsaWN0cy4gIFRoZXkgd2lsbAogKiBm aW5kIGVhY2ggb3RoZXIncyB0dXBsZSwgYW5kIGJvdGggdHJ5IHRvIHdhaXQgZm9yIGVhY2gg b3RoZXIuICBUaGUKICogZGVhZGxvY2sgZGV0ZWN0b3Igd2lsbCBkZXRlY3QgdGhhdCwgYW5k IGFib3J0IG9uZSBvZiB0aGUgdHJhbnNhY3Rpb25zLgogKiBUaGF0J3MgZmFpcmx5IGhhcm1s ZXNzLCBhcyBvbmUgb2YgdGhlbSB3YXMgYm91bmQgdG8gYWJvcnQgd2l0aCBhCiAqICJkdXBs aWNhdGUga2V5IGVycm9yIiBhbnl3YXksIGFsdGhvdWdoIHlvdSBnZXQgYSBkaWZmZXJlbnQg ZXJyb3IKICogbWVzc2FnZS4KICoKICogSWYgYW4gZXhjbHVzaW9uIGNvbnN0cmFpbnQgaXMg ZGVmZXJyZWQsIHdlIHN0aWxsIHBlcmZvcm0gdGhlIGNvbmZsaWN0CiAqIGNoZWNraW5nIHNj YW4gaW1tZWRpYXRlbHkgYWZ0ZXIgaW5zZXJ0aW5nIHRoZSBpbmRleCB0dXBsZS4gIEJ1dCBp bnN0ZWFkCiAqIG9mIHRocm93aW5nIGFuIGVycm9yIGlmIGEgY29uZmxpY3QgaXMgZm91bmQs IHdlIHJldHVybiB0aGF0IGluZm9ybWF0aW9uCiAqIHRvIHRoZSBjYWxsZXIuICBUaGUgY2Fs bGVyIG11c3QgcmUtY2hlY2sgdGhlbSBsYXRlciBieSBjYWxsaW5nCiAqIGNoZWNrX2V4Y2x1 c2lvbl9jb25zdHJhaW50KCkuCiAqCiAqIFNwZWN1bGF0aXZlIGluc2VydGlvbgogKiAtLS0t LS0tLS0tLS0tLS0tLS0tLS0KICoKICogU3BlY3VsYXRpdmUgaW5zZXJ0aW9uIGlzIGEgdHdv LXBoYXNlIG1lY2hhbmlzbSB1c2VkIHRvIGltcGxlbWVudAogKiBJTlNFUlQgLi4uIE9OIENP TkZMSUNULiAgVGhlIHR1cGxlIGlzIGZpcnN0IGluc2VydGVkIGludG8gdGhlIGhlYXAKICog YW5kIHRoZSBpbmRleGVzIGFyZSB1cGRhdGVkIGFzIHVzdWFsLCBidXQgaWYgYSBjb25zdHJh aW50IGlzIHZpb2xhdGVkLAogKiB3ZSBjYW4gc3RpbGwgYmFjayBvdXQgb2YgdGhlIGluc2Vy dGlvbiB3aXRob3V0IGFib3J0aW5nIHRoZSB3aG9sZQogKiB0cmFuc2FjdGlvbi4gIEluIGFu IElOU0VSVCAuLi4gT04gQ09ORkxJQ1Qgc3RhdGVtZW50LCBpZiBhIGNvbmZsaWN0IGlzCiAq IGRldGVjdGVkLCB0aGUgaW5zZXJ0ZWQgdHVwbGUgaXMgYmFja2VkIG91dCBhbmQgdGhlIE9O IENPTkZMSUNUIGFjdGlvbiBpcwogKiBleGVjdXRlZCBpbnN0ZWFkLgogKgogKiBJbnNlcnRp b24gdG8gYSB1bmlxdWUgaW5kZXggd29ya3MgYXMgdXN1YWw6IHRoZSBpbmRleCBBTSBjaGVj a3MgZm9yCiAqIGR1cGxpY2F0ZSBrZXlzIGF0b21pY2FsbHkgd2l0aCB0aGUgaW5zZXJ0aW9u LiAgQnV0IGluc3RlYWQgb2YgdGhyb3dpbmcKICogYW4gZXJyb3Igb24gYSBjb25mbGljdCwg dGhlIHNwZWN1bGF0aXZlbHkgaW5zZXJ0ZWQgaGVhcCB0dXBsZSBpcyBiYWNrZWQKICogb3V0 LgogKgogKiBFeGNsdXNpb24gY29uc3RyYWludHMgYXJlIHNsaWdodGx5IG1vcmUgY29tcGxp Y2F0ZWQuICBBcyBtZW50aW9uZWQKICogZWFybGllciwgdGhlcmUgaXMgYSByaXNrIG9mIGRl YWRsb2NrIHdoZW4gdHdvIGJhY2tlbmRzIGluc2VydCB0aGUgc2FtZQogKiBrZXkgY29uY3Vy cmVudGx5LiAgVGhhdCB3YXMgbm90IGEgcHJvYmxlbSBmb3IgcmVndWxhciBpbnNlcnRpb25z LCB3aGVuCiAqIG9uZSBvZiB0aGUgdHJhbnNhY3Rpb25zIGhhcyB0byBiZSBhYm9ydGVkIGFu eXdheSwgYnV0IHdpdGggYSBzcGVjdWxhdGl2ZQogKiBpbnNlcnRpb24gd2UgY2Fubm90IGxl dCBhIGRlYWRsb2NrIGhhcHBlbiwgYmVjYXVzZSB3ZSBvbmx5IHdhbnQgdG8gYmFjawogKiBv dXQgdGhlIHNwZWN1bGF0aXZlbHkgaW5zZXJ0ZWQgdHVwbGUgb24gY29uZmxpY3QsIG5vdCBh Ym9ydCB0aGUgd2hvbGUKICogdHJhbnNhY3Rpb24uCiAqCiAqIFdoZW4gYSBiYWNrZW5kIGRl dGVjdHMgdGhhdCB0aGUgc3BlY3VsYXRpdmUgaW5zZXJ0aW9uIGNvbmZsaWN0cyB3aXRoCiAq IGFub3RoZXIgaW4tcHJvZ3Jlc3MgdHVwbGUsIGl0IGhhcyB0d28gb3B0aW9uczoKICoKICog MS4gYmFjayBvdXQgdGhlIHNwZWN1bGF0aXZlbHkgaW5zZXJ0ZWQgdHVwbGUsIHRoZW4gd2Fp dCBmb3IgdGhlIG90aGVyCiAqCSAgdHJhbnNhY3Rpb24sIGFuZCByZXRyeS4gT3IsCiAqIDIu IHdhaXQgZm9yIHRoZSBvdGhlciB0cmFuc2FjdGlvbiwgd2l0aCB0aGUgc3BlY3VsYXRpdmVs eSBpbnNlcnRlZCB0dXBsZQogKgkgIHN0aWxsIGluIHBsYWNlLgogKgogKiBJZiB0d28gYmFj a2VuZHMgaW5zZXJ0IGF0IHRoZSBzYW1lIHRpbWUsIGFuZCBib3RoIHRyeSB0byB3YWl0IGZv ciBlYWNoCiAqIG90aGVyLCB0aGV5IHdpbGwgZGVhZGxvY2suICBTbyBvcHRpb24gMiBpcyBu b3QgYWNjZXB0YWJsZS4gIE9wdGlvbiAxCiAqIGF2b2lkcyB0aGUgZGVhZGxvY2ssIGJ1dCBp dCBpcyBwcm9uZSB0byBhIGxpdmVsb2NrIGluc3RlYWQuICBCb3RoCiAqIHRyYW5zYWN0aW9u cyB3aWxsIHdha2UgdXAgaW1tZWRpYXRlbHkgYXMgdGhlIG90aGVyIHRyYW5zYWN0aW9uIGJh Y2tzCiAqIG91dC4gIFRoZW4gdGhleSBib3RoIHJldHJ5LCBhbmQgY29uZmxpY3Qgd2l0aCBl YWNoIG90aGVyIGFnYWluLCBsYXRoZXIsCiAqIHJpbnNlLCByZXBlYXQuCiAqCiAqIFRvIGF2 b2lkIHRoZSBsaXZlbG9jaywgb25lIG9mIHRoZSBiYWNrZW5kcyBtdXN0IGJhY2sgb3V0IGZp cnN0LCBhbmQgdGhlbgogKiB3YWl0LCB3aGlsZSB0aGUgb3RoZXIgb25lIHdhaXRzIHdpdGhv dXQgYmFja2luZyBvdXQuICBJdCBkb2Vzbid0IG1hdHRlcgogKiB3aGljaCBvbmUgYmFja3Mg b3V0LCBzbyB3ZSBlbXBsb3kgYW4gYXJiaXRyYXJ5IHJ1bGUgdGhhdCB0aGUgdHJhbnNhY3Rp b24KICogd2l0aCB0aGUgaGlnaGVyIFhJRCBiYWNrcyBvdXQuCiAqCiAqCiAqIFBvcnRpb25z IENvcHlyaWdodCAoYykgMTk5Ni0yMDI2LCBQb3N0Z3JlU1FMIEdsb2JhbCBEZXZlbG9wbWVu dCBHcm91cAogKiBQb3J0aW9ucyBDb3B5cmlnaHQgKGMpIDE5OTQsIFJlZ2VudHMgb2YgdGhl IFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYQogKgogKgogKiBJREVOVElGSUNBVElPTgogKgkg IHNyYy9iYWNrZW5kL2V4ZWN1dG9yL2V4ZWNJbmRleGluZy5jCiAqCiAqLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLQogKi8KI2luY2x1ZGUgInBvc3RncmVzLmgiCgojaW5jbHVkZSAiYWNjZXNzL2dl bmFtLmgiCiNpbmNsdWRlICJhY2Nlc3MvcmVsc2Nhbi5oIgojaW5jbHVkZSAiYWNjZXNzL3Rh YmxlYW0uaCIKI2luY2x1ZGUgImFjY2Vzcy94YWN0LmgiCiNpbmNsdWRlICJjYXRhbG9nL2lu ZGV4LmgiCiNpbmNsdWRlICJleGVjdXRvci9leGVjdXRvci5oIgojaW5jbHVkZSAibm9kZXMv bm9kZUZ1bmNzLmgiCiNpbmNsdWRlICJzdG9yYWdlL2xtZ3IuaCIKI2luY2x1ZGUgInV0aWxz L2luamVjdGlvbl9wb2ludC5oIgojaW5jbHVkZSAidXRpbHMvbHN5c2NhY2hlLmgiCiNpbmNs dWRlICJ1dGlscy9tdWx0aXJhbmdldHlwZXMuaCIKI2luY2x1ZGUgInV0aWxzL3JhbmdldHlw ZXMuaCIKI2luY2x1ZGUgInV0aWxzL3NuYXBtZ3IuaCIKCi8qIHdhaXRNb2RlIGFyZ3VtZW50 IHRvIGNoZWNrX2V4Y2x1c2lvbl9vcl91bmlxdWVfY29uc3RyYWludCgpICovCnR5cGVkZWYg ZW51bQp7CglDRU9VQ19XQUlULAoJQ0VPVUNfTk9XQUlULAoJQ0VPVUNfTElWRUxPQ0tfUFJF VkVOVElOR19XQUlULAp9IENFT1VDX1dBSVRfTU9ERTsKCnN0YXRpYyBib29sIGNoZWNrX2V4 Y2x1c2lvbl9vcl91bmlxdWVfY29uc3RyYWludChSZWxhdGlvbiBoZWFwLCBSZWxhdGlvbiBp bmRleCwKCQkJCQkJCQkJCQkJIEluZGV4SW5mbyAqaW5kZXhJbmZvLAoJCQkJCQkJCQkJCQkg Y29uc3QgSXRlbVBvaW50ZXJEYXRhICp0dXBsZWlkLAoJCQkJCQkJCQkJCQkgY29uc3QgRGF0 dW0gKnZhbHVlcywgY29uc3QgYm9vbCAqaXNudWxsLAoJCQkJCQkJCQkJCQkgRVN0YXRlICpl c3RhdGUsIGJvb2wgbmV3SW5kZXgsCgkJCQkJCQkJCQkJCSBDRU9VQ19XQUlUX01PREUgd2Fp dE1vZGUsCgkJCQkJCQkJCQkJCSBib29sIHZpb2xhdGlvbk9LLAoJCQkJCQkJCQkJCQkgSXRl bVBvaW50ZXIgY29uZmxpY3RUaWQpOwoKc3RhdGljIGJvb2wgaW5kZXhfcmVjaGVja19jb25z dHJhaW50KFJlbGF0aW9uIGluZGV4LCBjb25zdCBPaWQgKmNvbnN0cl9wcm9jcywKCQkJCQkJ CQkJIGNvbnN0IERhdHVtICpleGlzdGluZ192YWx1ZXMsIGNvbnN0IGJvb2wgKmV4aXN0aW5n X2lzbnVsbCwKCQkJCQkJCQkJIGNvbnN0IERhdHVtICpuZXdfdmFsdWVzKTsKc3RhdGljIGJv b2wgaW5kZXhfdW5jaGFuZ2VkX2J5X3VwZGF0ZShSZXN1bHRSZWxJbmZvICpyZXN1bHRSZWxJ bmZvLAoJCQkJCQkJCQkgIEVTdGF0ZSAqZXN0YXRlLCBJbmRleEluZm8gKmluZGV4SW5mbywK CQkJCQkJCQkJICBSZWxhdGlvbiBpbmRleFJlbGF0aW9uKTsKc3RhdGljIGJvb2wgaW5kZXhf ZXhwcmVzc2lvbl9jaGFuZ2VkX3dhbGtlcihOb2RlICpub2RlLAoJCQkJCQkJCQkJCUJpdG1h cHNldCAqYWxsVXBkYXRlZENvbHMpOwpzdGF0aWMgdm9pZCBFeGVjV2l0aG91dE92ZXJsYXBz Tm90RW1wdHkoUmVsYXRpb24gcmVsLCBOYW1lRGF0YSBhdHRuYW1lLCBEYXR1bSBhdHR2YWws CgkJCQkJCQkJCQljaGFyIHR5cHR5cGUsIE9pZCBhdHR0eXBpZCk7CgovKiAtLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t CiAqCQlFeGVjT3BlbkluZGljZXMKICoKICoJCUZpbmQgdGhlIGluZGljZXMgYXNzb2NpYXRl ZCB3aXRoIGEgcmVzdWx0IHJlbGF0aW9uLCBvcGVuIHRoZW0sCiAqCQlhbmQgc2F2ZSBpbmZv cm1hdGlvbiBhYm91dCB0aGVtIGluIHRoZSByZXN1bHQgUmVzdWx0UmVsSW5mby4KICoKICoJ CUF0IGVudHJ5LCBjYWxsZXIgaGFzIGFscmVhZHkgb3BlbmVkIGFuZCBsb2NrZWQKICoJCXJl c3VsdFJlbEluZm8tPnJpX1JlbGF0aW9uRGVzYy4KICogLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogKi8Kdm9pZApF eGVjT3BlbkluZGljZXMoUmVzdWx0UmVsSW5mbyAqcmVzdWx0UmVsSW5mbywgYm9vbCBzcGVj dWxhdGl2ZSkKewoJUmVsYXRpb24JcmVzdWx0UmVsYXRpb24gPSByZXN1bHRSZWxJbmZvLT5y aV9SZWxhdGlvbkRlc2M7CglMaXN0CSAgICppbmRleG9pZGxpc3Q7CglMaXN0Q2VsbCAgICps OwoJaW50CQkJbGVuLAoJCQkJaTsKCVJlbGF0aW9uUHRyIHJlbGF0aW9uRGVzY3M7CglJbmRl eEluZm8gKippbmRleEluZm9BcnJheTsKCglyZXN1bHRSZWxJbmZvLT5yaV9OdW1JbmRpY2Vz ID0gMDsKCgkvKiBmYXN0IHBhdGggaWYgbm8gaW5kZXhlcyAqLwoJaWYgKCFSZWxhdGlvbkdl dEZvcm0ocmVzdWx0UmVsYXRpb24pLT5yZWxoYXNpbmRleCkKCQlyZXR1cm47CgoJLyoKCSAq IEdldCBjYWNoZWQgbGlzdCBvZiBpbmRleCBPSURzCgkgKi8KCWluZGV4b2lkbGlzdCA9IFJl bGF0aW9uR2V0SW5kZXhMaXN0KHJlc3VsdFJlbGF0aW9uKTsKCWxlbiA9IGxpc3RfbGVuZ3Ro KGluZGV4b2lkbGlzdCk7CglpZiAobGVuID09IDApCgkJcmV0dXJuOwoKCS8qIFRoaXMgQXNz ZXJ0IHdpbGwgZmFpbCBpZiBFeGVjT3BlbkluZGljZXMgaXMgY2FsbGVkIHR3aWNlICovCglB c3NlcnQocmVzdWx0UmVsSW5mby0+cmlfSW5kZXhSZWxhdGlvbkRlc2NzID09IE5VTEwpOwoK CS8qCgkgKiBhbGxvY2F0ZSBzcGFjZSBmb3IgcmVzdWx0IGFycmF5cwoJICovCglyZWxhdGlv bkRlc2NzID0gcGFsbG9jX2FycmF5KFJlbGF0aW9uLCBsZW4pOwoJaW5kZXhJbmZvQXJyYXkg PSBwYWxsb2NfYXJyYXkoSW5kZXhJbmZvICosIGxlbik7CgoJcmVzdWx0UmVsSW5mby0+cmlf TnVtSW5kaWNlcyA9IGxlbjsKCXJlc3VsdFJlbEluZm8tPnJpX0luZGV4UmVsYXRpb25EZXNj cyA9IHJlbGF0aW9uRGVzY3M7CglyZXN1bHRSZWxJbmZvLT5yaV9JbmRleFJlbGF0aW9uSW5m byA9IGluZGV4SW5mb0FycmF5OwoKCS8qCgkgKiBGb3IgZWFjaCBpbmRleCwgb3BlbiB0aGUg aW5kZXggcmVsYXRpb24gYW5kIHNhdmUgcGdfaW5kZXggaW5mby4gV2UKCSAqIGFjcXVpcmUg Um93RXhjbHVzaXZlTG9jaywgc2lnbmlmeWluZyB3ZSB3aWxsIHVwZGF0ZSB0aGUgaW5kZXgu CgkgKgoJICogTm90ZTogd2UgZG8gdGhpcyBldmVuIGlmIHRoZSBpbmRleCBpcyBub3QgaW5k aXNyZWFkeTsgaXQncyBub3Qgd29ydGgKCSAqIHRoZSB0cm91YmxlIHRvIG9wdGltaXplIGZv ciB0aGUgY2FzZSB3aGVyZSBpdCBpc24ndC4KCSAqLwoJaSA9IDA7Cglmb3JlYWNoKGwsIGlu ZGV4b2lkbGlzdCkKCXsKCQlPaWQJCQlpbmRleE9pZCA9IGxmaXJzdF9vaWQobCk7CgkJUmVs YXRpb24JaW5kZXhEZXNjOwoJCUluZGV4SW5mbyAgKmlpOwoKCQlpbmRleERlc2MgPSBpbmRl eF9vcGVuKGluZGV4T2lkLCBSb3dFeGNsdXNpdmVMb2NrKTsKCgkJLyogZXh0cmFjdCBpbmRl eCBrZXkgaW5mb3JtYXRpb24gZnJvbSB0aGUgaW5kZXgncyBwZ19pbmRleCBpbmZvICovCgkJ aWkgPSBCdWlsZEluZGV4SW5mbyhpbmRleERlc2MpOwoKCQkvKgoJCSAqIElmIHRoZSBpbmRl eGVzIGFyZSB0byBiZSB1c2VkIGZvciBzcGVjdWxhdGl2ZSBpbnNlcnRpb24sIGFkZCBleHRy YQoJCSAqIGluZm9ybWF0aW9uIHJlcXVpcmVkIGJ5IHVuaXF1ZSBpbmRleCBlbnRyaWVzLgoJ CSAqLwoJCWlmIChzcGVjdWxhdGl2ZSAmJiBpaS0+aWlfVW5pcXVlICYmICFpbmRleERlc2Mt PnJkX2luZGV4LT5pbmRpc2V4Y2x1c2lvbikKCQkJQnVpbGRTcGVjdWxhdGl2ZUluZGV4SW5m byhpbmRleERlc2MsIGlpKTsKCgkJcmVsYXRpb25EZXNjc1tpXSA9IGluZGV4RGVzYzsKCQlp bmRleEluZm9BcnJheVtpXSA9IGlpOwoJCWkrKzsKCX0KCglsaXN0X2ZyZWUoaW5kZXhvaWRs aXN0KTsKfQoKLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogKgkJRXhlY0Nsb3NlSW5kaWNlcwogKgogKgkJQ2xv c2UgdGhlIGluZGV4IHJlbGF0aW9ucyBzdG9yZWQgaW4gcmVzdWx0UmVsSW5mbwogKiAtLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tCiAqLwp2b2lkCkV4ZWNDbG9zZUluZGljZXMoUmVzdWx0UmVsSW5mbyAqcmVzdWx0 UmVsSW5mbykKewoJaW50CQkJaTsKCWludAkJCW51bUluZGljZXM7CglSZWxhdGlvblB0ciBp bmRleERlc2NzOwoJSW5kZXhJbmZvICoqaW5kZXhJbmZvczsKCgludW1JbmRpY2VzID0gcmVz dWx0UmVsSW5mby0+cmlfTnVtSW5kaWNlczsKCWluZGV4RGVzY3MgPSByZXN1bHRSZWxJbmZv LT5yaV9JbmRleFJlbGF0aW9uRGVzY3M7CglpbmRleEluZm9zID0gcmVzdWx0UmVsSW5mby0+ cmlfSW5kZXhSZWxhdGlvbkluZm87CgoJZm9yIChpID0gMDsgaSA8IG51bUluZGljZXM7IGkr KykKCXsKCQkvKiBUaGlzIEFzc2VydCB3aWxsIGZhaWwgaWYgRXhlY0Nsb3NlSW5kaWNlcyBp cyBjYWxsZWQgdHdpY2UgKi8KCQlBc3NlcnQoaW5kZXhEZXNjc1tpXSAhPSBOVUxMKTsKCgkJ LyogR2l2ZSB0aGUgaW5kZXggYSBjaGFuY2UgdG8gZG8gc29tZSBwb3N0LWluc2VydCBjbGVh bnVwICovCgkJaW5kZXhfaW5zZXJ0X2NsZWFudXAoaW5kZXhEZXNjc1tpXSwgaW5kZXhJbmZv c1tpXSk7CgoJCS8qIERyb3AgbG9jayBhY3F1aXJlZCBieSBFeGVjT3BlbkluZGljZXMgKi8K CQlpbmRleF9jbG9zZShpbmRleERlc2NzW2ldLCBSb3dFeGNsdXNpdmVMb2NrKTsKCgkJLyog TWFyayB0aGUgaW5kZXggYXMgY2xvc2VkICovCgkJaW5kZXhEZXNjc1tpXSA9IE5VTEw7Cgl9 CgoJLyoKCSAqIFdlIGRvbid0IGF0dGVtcHQgdG8gZnJlZSB0aGUgSW5kZXhJbmZvIGRhdGEg c3RydWN0dXJlcyBvciB0aGUgYXJyYXlzLAoJICogaW5zdGVhZCBhc3N1bWluZyB0aGF0IHN1 Y2ggc3R1ZmYgd2lsbCBiZSBjbGVhbmVkIHVwIGF1dG9tYXRpY2FsbHkgaW4KCSAqIEZyZWVF eGVjdXRvclN0YXRlLgoJICovCn0KCi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICoJCUV4ZWNJbnNlcnRJbmRl eFR1cGxlcwogKgogKgkJVGhpcyByb3V0aW5lIHRha2VzIGNhcmUgb2YgaW5zZXJ0aW5nIGlu ZGV4IHR1cGxlcwogKgkJaW50byBhbGwgdGhlIHJlbGF0aW9ucyBpbmRleGluZyB0aGUgcmVz dWx0IHJlbGF0aW9uCiAqCQl3aGVuIGEgaGVhcCB0dXBsZSBpcyBpbnNlcnRlZCBpbnRvIHRo ZSByZXN1bHQgcmVsYXRpb24uCiAqCiAqCQlXaGVuIEVJSVRfSVNfVVBEQVRFIGlzIHNldCBh bmQgRUlJVF9PTkxZX1NVTU1BUklaSU5HIGlzbid0LAogKgkJZXhlY3V0b3IgaXMgcGVyZm9y bWluZyBhbiBVUERBVEUgdGhhdCBjb3VsZCBub3QgdXNlIGFuCiAqCQlvcHRpbWl6YXRpb24g bGlrZSBoZWFwYW0ncyBIT1QgKGluIG1vcmUgZ2VuZXJhbCB0ZXJtcyBhCiAqCQljYWxsIHRv IHRhYmxlX3R1cGxlX3VwZGF0ZSgpIHRvb2sgcGxhY2UgYW5kIHNldAogKgkJJ3VwZGF0ZV9p bmRleGVzJyB0byBUVV9BbGwpLiAgUmVjZWl2aW5nIHRoaXMgaGludCBtYWtlcwogKgkJdXMg Y29uc2lkZXIgaWYgd2Ugc2hvdWxkIHBhc3MgZG93biB0aGUgJ2luZGV4VW5jaGFuZ2VkJwog KgkJaGludCBpbiB0dXJuLiAgVGhhdCdzIHNvbWV0aGluZyB0aGF0IHdlIGZpZ3VyZSBvdXQg Zm9yCiAqCQllYWNoIGluZGV4X2luc2VydCgpIGNhbGwgaWZmIEVJSVRfSVNfVVBEQVRFIGlz IHNldC4KICoJCShXaGVuIHRoYXQgZmxhZyBpcyBub3Qgc2V0IHdlIGFscmVhZHkga25vdyBu b3QgdG8gcGFzcyB0aGUKICoJCWhpbnQgdG8gYW55IGluZGV4LikKICoKICoJCUlmIEVJSVRf T05MWV9TVU1NQVJJWklORyBpcyBzZXQsIGFuIGVxdWl2YWxlbnQgb3B0aW1pemF0aW9uIHRv CiAqCQlIT1QgaGFzIGJlZW4gYXBwbGllZCBhbmQgYW55IHVwZGF0ZWQgY29sdW1ucyBhcmUg aW5kZXhlZAogKgkJb25seSBieSBzdW1tYXJpemluZyBpbmRleGVzIChvciBpbiBtb3JlIGdl bmVyYWwgdGVybXMgYQogKgkJY2FsbCB0byB0YWJsZV90dXBsZV91cGRhdGUoKSB0b29rIHBs YWNlIGFuZCBzZXQKICoJCSd1cGRhdGVfaW5kZXhlcycgdG8gVFVfU3VtbWFyaXppbmcpLiBX ZSBjYW4gKGFuZCBtdXN0KQogKgkJdGhlcmVmb3JlIG9ubHkgdXBkYXRlIHRoZSBpbmRleGVz IHRoYXQgaGF2ZQogKgkJJ2Ftc3VtbWFyaXppbmcnID0gdHJ1ZS4KICoKICoJCVVuaXF1ZSBh bmQgZXhjbHVzaW9uIGNvbnN0cmFpbnRzIGFyZSBlbmZvcmNlZCBhdCB0aGUgc2FtZQogKgkJ dGltZS4gIFRoaXMgcmV0dXJucyBhIGxpc3Qgb2YgaW5kZXggT0lEcyBmb3IgYW55IHVuaXF1 ZSBvcgogKgkJZXhjbHVzaW9uIGNvbnN0cmFpbnRzIHRoYXQgYXJlIGRlZmVycmVkIGFuZCB0 aGF0IGhhZAogKgkJcG90ZW50aWFsICh1bmNvbmZpcm1lZCkgY29uZmxpY3RzLiAgKGlmIEVJ SVRfTk9fRFVQRV9FUlJPUiwKICoJCXRoZSBzYW1lIGlzIGRvbmUgZm9yIG5vbi1kZWZlcnJl ZCBjb25zdHJhaW50cywgYnV0IHJlcG9ydAogKgkJaWYgY29uZmxpY3Qgd2FzIHNwZWN1bGF0 aXZlIG9yIGRlZmVycmVkIGNvbmZsaWN0IHRvIGNhbGxlcikKICoKICoJCUlmICdhcmJpdGVy SW5kZXhlcycgaXMgbm9uZW1wdHksIEVJSVRfTk9fRFVQRV9FUlJPUiBhcHBsaWVzIG9ubHkg dG8KICoJCXRob3NlIGluZGV4ZXMuICBOSUwgbWVhbnMgRUlJVF9OT19EVVBFX0VSUk9SIGFw cGxpZXMgdG8gYWxsIGluZGV4ZXMuCiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICovCkxpc3QgKgpFeGVjSW5z ZXJ0SW5kZXhUdXBsZXMoUmVzdWx0UmVsSW5mbyAqcmVzdWx0UmVsSW5mbywKCQkJCQkgIEVT dGF0ZSAqZXN0YXRlLAoJCQkJCSAgdWludDMyIGZsYWdzLAoJCQkJCSAgVHVwbGVUYWJsZVNs b3QgKnNsb3QsCgkJCQkJICBMaXN0ICphcmJpdGVySW5kZXhlcywKCQkJCQkgIGJvb2wgKnNw ZWNDb25mbGljdCkKewoJSXRlbVBvaW50ZXIgdHVwbGVpZCA9ICZzbG90LT50dHNfdGlkOwoJ TGlzdAkgICAqcmVzdWx0ID0gTklMOwoJaW50CQkJaTsKCWludAkJCW51bUluZGljZXM7CglS ZWxhdGlvblB0ciByZWxhdGlvbkRlc2NzOwoJUmVsYXRpb24JaGVhcFJlbGF0aW9uOwoJSW5k ZXhJbmZvICoqaW5kZXhJbmZvQXJyYXk7CglFeHByQ29udGV4dCAqZWNvbnRleHQ7CglEYXR1 bQkJdmFsdWVzW0lOREVYX01BWF9LRVlTXTsKCWJvb2wJCWlzbnVsbFtJTkRFWF9NQVhfS0VZ U107CgoJQXNzZXJ0KEl0ZW1Qb2ludGVySXNWYWxpZCh0dXBsZWlkKSk7CgoJLyoKCSAqIEdl dCBpbmZvcm1hdGlvbiBmcm9tIHRoZSByZXN1bHQgcmVsYXRpb24gaW5mbyBzdHJ1Y3R1cmUu CgkgKi8KCW51bUluZGljZXMgPSByZXN1bHRSZWxJbmZvLT5yaV9OdW1JbmRpY2VzOwoJcmVs YXRpb25EZXNjcyA9IHJlc3VsdFJlbEluZm8tPnJpX0luZGV4UmVsYXRpb25EZXNjczsKCWlu ZGV4SW5mb0FycmF5ID0gcmVzdWx0UmVsSW5mby0+cmlfSW5kZXhSZWxhdGlvbkluZm87Cglo ZWFwUmVsYXRpb24gPSByZXN1bHRSZWxJbmZvLT5yaV9SZWxhdGlvbkRlc2M7CgoJLyogU2Fu aXR5IGNoZWNrOiBzbG90IG11c3QgYmVsb25nIHRvIHRoZSBzYW1lIHJlbCBhcyB0aGUgcmVz dWx0UmVsSW5mby4gKi8KCUFzc2VydChzbG90LT50dHNfdGFibGVPaWQgPT0gUmVsYXRpb25H ZXRSZWxpZChoZWFwUmVsYXRpb24pKTsKCgkvKgoJICogV2Ugd2lsbCB1c2UgdGhlIEVTdGF0 ZSdzIHBlci10dXBsZSBjb250ZXh0IGZvciBldmFsdWF0aW5nIHByZWRpY2F0ZXMKCSAqIGFu ZCBpbmRleCBleHByZXNzaW9ucyAoY3JlYXRpbmcgaXQgaWYgaXQncyBub3QgYWxyZWFkeSB0 aGVyZSkuCgkgKi8KCWVjb250ZXh0ID0gR2V0UGVyVHVwbGVFeHByQ29udGV4dChlc3RhdGUp OwoKCS8qIEFycmFuZ2UgZm9yIGVjb250ZXh0J3Mgc2NhbiB0dXBsZSB0byBiZSB0aGUgdHVw bGUgdW5kZXIgdGVzdCAqLwoJZWNvbnRleHQtPmVjeHRfc2NhbnR1cGxlID0gc2xvdDsKCgkv KgoJICogZm9yIGVhY2ggaW5kZXgsIGZvcm0gYW5kIGluc2VydCB0aGUgaW5kZXggdHVwbGUK CSAqLwoJZm9yIChpID0gMDsgaSA8IG51bUluZGljZXM7IGkrKykKCXsKCQlSZWxhdGlvbglp bmRleFJlbGF0aW9uID0gcmVsYXRpb25EZXNjc1tpXTsKCQlJbmRleEluZm8gICppbmRleElu Zm87CgkJYm9vbAkJYXBwbHlOb0R1cEVycjsKCQlJbmRleFVuaXF1ZUNoZWNrIGNoZWNrVW5p cXVlOwoJCWJvb2wJCWluZGV4VW5jaGFuZ2VkOwoJCWJvb2wJCXNhdGlzZmllc0NvbnN0cmFp bnQ7CgoJCWlmIChpbmRleFJlbGF0aW9uID09IE5VTEwpCgkJCWNvbnRpbnVlOwoKCQlpbmRl eEluZm8gPSBpbmRleEluZm9BcnJheVtpXTsKCgkJLyogSWYgdGhlIGluZGV4IGlzIG1hcmtl ZCBhcyByZWFkLW9ubHksIGlnbm9yZSBpdCAqLwoJCWlmICghaW5kZXhJbmZvLT5paV9SZWFk eUZvckluc2VydHMpCgkJCWNvbnRpbnVlOwoKCQkvKgoJCSAqIFNraXAgcHJvY2Vzc2luZyBv ZiBub24tc3VtbWFyaXppbmcgaW5kZXhlcyBpZiB3ZSBvbmx5IHVwZGF0ZQoJCSAqIHN1bW1h cml6aW5nIGluZGV4ZXMKCQkgKi8KCQlpZiAoKGZsYWdzICYgRUlJVF9PTkxZX1NVTU1BUkla SU5HKSAmJiAhaW5kZXhJbmZvLT5paV9TdW1tYXJpemluZykKCQkJY29udGludWU7CgoJCS8q IENoZWNrIGZvciBwYXJ0aWFsIGluZGV4ICovCgkJaWYgKGluZGV4SW5mby0+aWlfUHJlZGlj YXRlICE9IE5JTCkKCQl7CgkJCUV4cHJTdGF0ZSAgKnByZWRpY2F0ZTsKCQkJRXhwclN0YXRl ICAqcHJlZGljYXRlRXhwYW5kOwoKCQkJLyoKCQkJICogSWYgcHJlZGljYXRlIHN0YXRlIG5v dCBzZXQgdXAgeWV0LCBjcmVhdGUgaXQgKGluIHRoZSBlc3RhdGUncwoJCQkgKiBwZXItcXVl cnkgY29udGV4dCkKCQkJICovCgkJCXByZWRpY2F0ZSA9IGluZGV4SW5mby0+aWlfUHJlZGlj YXRlU3RhdGU7CgkJCXByZWRpY2F0ZUV4cGFuZCA9IGluZGV4SW5mby0+aWlfUHJlZGljYXRl RXhwYW5kU3RhdGU7CgkJCWlmIChwcmVkaWNhdGUgPT0gTlVMTCkKCQkJewoJCQkJcHJlZGlj YXRlID0gRXhlY1ByZXBhcmVRdWFsKGluZGV4SW5mby0+aWlfUHJlZGljYXRlLCBlc3RhdGUp OwoJCQkJcHJlZGljYXRlRXhwYW5kID0gRXhlY1ByZXBhcmVRdWFsKGluZGV4SW5mby0+aWlf UHJlZGljYXRlRXhwYW5kLCBlc3RhdGUpOwoJCQkJaW5kZXhJbmZvLT5paV9QcmVkaWNhdGVT dGF0ZSA9IHByZWRpY2F0ZTsKCQkJCWluZGV4SW5mby0+aWlfUHJlZGljYXRlRXhwYW5kU3Rh dGUgPSBwcmVkaWNhdGVFeHBhbmQ7CgkJCX0KCgkJCS8qIFNraXAgdGhpcyBpbmRleC11cGRh dGUgaWYgdGhlIHByZWRpY2F0ZSBpc24ndCBzYXRpc2ZpZWQgKi8KCQkJaWYgKCFFeGVjUXVh bChwcmVkaWNhdGVFeHBhbmQsIGVjb250ZXh0KSkKCQkJCWNvbnRpbnVlOwoJCX0KCgkJLyoK CQkgKiBGb3JtSW5kZXhEYXR1bSBmaWxscyBpbiBpdHMgdmFsdWVzIGFuZCBpc251bGwgcGFy YW1ldGVycyB3aXRoIHRoZQoJCSAqIGFwcHJvcHJpYXRlIHZhbHVlcyBmb3IgdGhlIGNvbHVt bihzKSBvZiB0aGUgaW5kZXguCgkJICovCgkJRm9ybUluZGV4RGF0dW0oaW5kZXhJbmZvLAoJ CQkJCSAgIHNsb3QsCgkJCQkJICAgZXN0YXRlLAoJCQkJCSAgIHZhbHVlcywKCQkJCQkgICBp c251bGwpOwoKCQkvKiBDaGVjayB3aGV0aGVyIHRvIGFwcGx5IG5vRHVwRXJyIHRvIHRoaXMg aW5kZXggKi8KCQlhcHBseU5vRHVwRXJyID0gKGZsYWdzICYgRUlJVF9OT19EVVBFX0VSUk9S KSAmJgoJCQkoYXJiaXRlckluZGV4ZXMgPT0gTklMIHx8CgkJCSBsaXN0X21lbWJlcl9vaWQo YXJiaXRlckluZGV4ZXMsCgkJCQkJCQkgaW5kZXhSZWxhdGlvbi0+cmRfaW5kZXgtPmluZGV4 cmVsaWQpKTsKCgkJLyoKCQkgKiBUaGUgaW5kZXggQU0gZG9lcyB0aGUgYWN0dWFsIGluc2Vy dGlvbiwgcGx1cyB1bmlxdWVuZXNzIGNoZWNraW5nLgoJCSAqCgkJICogRm9yIGFuIGltbWVk aWF0ZS1tb2RlIHVuaXF1ZSBpbmRleCwgd2UganVzdCB0ZWxsIHRoZSBpbmRleCBBTSB0bwoJ CSAqIHRocm93IGVycm9yIGlmIG5vdCB1bmlxdWUuCgkJICoKCQkgKiBGb3IgYSBkZWZlcnJh YmxlIHVuaXF1ZSBpbmRleCwgd2UgdGVsbCB0aGUgaW5kZXggQU0gdG8ganVzdCBkZXRlY3QK CQkgKiBwb3NzaWJsZSBub24tdW5pcXVlbmVzcywgYW5kIHdlIGFkZCB0aGUgaW5kZXggT0lE IHRvIHRoZSByZXN1bHQKCQkgKiBsaXN0IGlmIGZ1cnRoZXIgY2hlY2tpbmcgaXMgbmVlZGVk LgoJCSAqCgkJICogRm9yIGEgc3BlY3VsYXRpdmUgaW5zZXJ0aW9uICh1c2VkIGJ5IElOU0VS VCAuLi4gT04gQ09ORkxJQ1QpLCBkbwoJCSAqIHRoZSBzYW1lIGFzIGZvciBhIGRlZmVycmFi bGUgdW5pcXVlIGluZGV4LgoJCSAqLwoJCWlmICghaW5kZXhSZWxhdGlvbi0+cmRfaW5kZXgt PmluZGlzdW5pcXVlKQoJCQljaGVja1VuaXF1ZSA9IFVOSVFVRV9DSEVDS19OTzsKCQllbHNl IGlmIChhcHBseU5vRHVwRXJyKQoJCQljaGVja1VuaXF1ZSA9IFVOSVFVRV9DSEVDS19QQVJU SUFMOwoJCWVsc2UgaWYgKGluZGV4UmVsYXRpb24tPnJkX2luZGV4LT5pbmRpbW1lZGlhdGUp CgkJCWNoZWNrVW5pcXVlID0gVU5JUVVFX0NIRUNLX1lFUzsKCQllbHNlCgkJCWNoZWNrVW5p cXVlID0gVU5JUVVFX0NIRUNLX1BBUlRJQUw7CgoJCS8qCgkJICogVGhlcmUncyBkZWZpbml0 ZWx5IGdvaW5nIHRvIGJlIGFuIGluZGV4X2luc2VydCgpIGNhbGwgZm9yIHRoaXMKCQkgKiBp bmRleC4gIElmIHdlJ3JlIGJlaW5nIGNhbGxlZCBhcyBwYXJ0IG9mIGFuIFVQREFURSBzdGF0 ZW1lbnQsCgkJICogY29uc2lkZXIgaWYgdGhlICdpbmRleFVuY2hhbmdlZCcgPSB0cnVlIGhp bnQgc2hvdWxkIGJlIHBhc3NlZC4KCQkgKi8KCQlpbmRleFVuY2hhbmdlZCA9ICgoZmxhZ3Mg JiBFSUlUX0lTX1VQREFURSkgJiYKCQkJCQkJICBpbmRleF91bmNoYW5nZWRfYnlfdXBkYXRl KHJlc3VsdFJlbEluZm8sCgkJCQkJCQkJCQkJCQllc3RhdGUsCgkJCQkJCQkJCQkJCQlpbmRl eEluZm8sCgkJCQkJCQkJCQkJCQlpbmRleFJlbGF0aW9uKSk7CgoJCXNhdGlzZmllc0NvbnN0 cmFpbnQgPQoJCQlpbmRleF9pbnNlcnQoaW5kZXhSZWxhdGlvbiwgLyogaW5kZXggcmVsYXRp b24gKi8KCQkJCQkJIHZhbHVlcywJLyogYXJyYXkgb2YgaW5kZXggRGF0dW1zICovCgkJCQkJ CSBpc251bGwsCS8qIG51bGwgZmxhZ3MgKi8KCQkJCQkJIHR1cGxlaWQsCS8qIHRpZCBvZiBo ZWFwIHR1cGxlICovCgkJCQkJCSBoZWFwUmVsYXRpb24sCS8qIGhlYXAgcmVsYXRpb24gKi8K CQkJCQkJIGNoZWNrVW5pcXVlLAkvKiB0eXBlIG9mIHVuaXF1ZW5lc3MgY2hlY2sgdG8gZG8g Ki8KCQkJCQkJIGluZGV4VW5jaGFuZ2VkLAkvKiBVUERBVEUgd2l0aG91dCBsb2dpY2FsIGNo YW5nZT8gKi8KCQkJCQkJIGluZGV4SW5mbyk7CS8qIGluZGV4IEFNIG1heSBuZWVkIHRoaXMg Ki8KCgkJLyoKCQkgKiBJZiB0aGUgaW5kZXggaGFzIGFuIGFzc29jaWF0ZWQgZXhjbHVzaW9u IGNvbnN0cmFpbnQsIGNoZWNrIHRoYXQuCgkJICogVGhpcyBpcyBzaW1wbGVyIHRoYW4gdGhl IHByb2Nlc3MgZm9yIHVuaXF1ZW5lc3MgY2hlY2tzIHNpbmNlIHdlCgkJICogYWx3YXlzIGlu c2VydCBmaXJzdCBhbmQgdGhlbiBjaGVjay4gIElmIHRoZSBjb25zdHJhaW50IGlzIGRlZmVy cmVkLAoJCSAqIHdlIGNoZWNrIG5vdyBhbnl3YXksIGJ1dCBkb24ndCB0aHJvdyBlcnJvciBv biB2aW9sYXRpb24gb3Igd2FpdCBmb3IKCQkgKiBhIGNvbmNsdXNpdmUgb3V0Y29tZSBmcm9t IGEgY29uY3VycmVudCBpbnNlcnRpb247IGluc3RlYWQgd2UnbGwKCQkgKiBxdWV1ZSBhIHJl Y2hlY2sgZXZlbnQuICBTaW1pbGFybHksIG5vRHVwRXJyIGNhbGxlcnMgKHNwZWN1bGF0aXZl CgkJICogaW5zZXJ0ZXJzKSB3aWxsIHJlY2hlY2sgbGF0ZXIsIGFuZCB3YWl0IGZvciBhIGNv bmNsdXNpdmUgb3V0Y29tZQoJCSAqIHRoZW4uCgkJICoKCQkgKiBBbiBpbmRleCBmb3IgYW4g ZXhjbHVzaW9uIGNvbnN0cmFpbnQgY2FuJ3QgYWxzbyBiZSBVTklRVUUgKG5vdCBhbgoJCSAq IGVzc2VudGlhbCBwcm9wZXJ0eSwgd2UganVzdCBkb24ndCBhbGxvdyBpdCBpbiB0aGUgZ3Jh bW1hciksIHNvIG5vCgkJICogbmVlZCB0byBwcmVzZXJ2ZSB0aGUgcHJpb3Igc3RhdGUgb2Yg c2F0aXNmaWVzQ29uc3RyYWludC4KCQkgKi8KCQlpZiAoaW5kZXhJbmZvLT5paV9FeGNsdXNp b25PcHMgIT0gTlVMTCkKCQl7CgkJCWJvb2wJCXZpb2xhdGlvbk9LOwoJCQlDRU9VQ19XQUlU X01PREUgd2FpdE1vZGU7CgoJCQlpZiAoYXBwbHlOb0R1cEVycikKCQkJewoJCQkJdmlvbGF0 aW9uT0sgPSB0cnVlOwoJCQkJd2FpdE1vZGUgPSBDRU9VQ19MSVZFTE9DS19QUkVWRU5USU5H X1dBSVQ7CgkJCX0KCQkJZWxzZSBpZiAoIWluZGV4UmVsYXRpb24tPnJkX2luZGV4LT5pbmRp bW1lZGlhdGUpCgkJCXsKCQkJCXZpb2xhdGlvbk9LID0gdHJ1ZTsKCQkJCXdhaXRNb2RlID0g Q0VPVUNfTk9XQUlUOwoJCQl9CgkJCWVsc2UKCQkJewoJCQkJdmlvbGF0aW9uT0sgPSBmYWxz ZTsKCQkJCXdhaXRNb2RlID0gQ0VPVUNfV0FJVDsKCQkJfQoKCQkJc2F0aXNmaWVzQ29uc3Ry YWludCA9CgkJCQljaGVja19leGNsdXNpb25fb3JfdW5pcXVlX2NvbnN0cmFpbnQoaGVhcFJl bGF0aW9uLAoJCQkJCQkJCQkJCQkJIGluZGV4UmVsYXRpb24sIGluZGV4SW5mbywKCQkJCQkJ CQkJCQkJCSB0dXBsZWlkLCB2YWx1ZXMsIGlzbnVsbCwKCQkJCQkJCQkJCQkJCSBlc3RhdGUs IGZhbHNlLAoJCQkJCQkJCQkJCQkJIHdhaXRNb2RlLCB2aW9sYXRpb25PSywgTlVMTCk7CgkJ fQoKCQlpZiAoKGNoZWNrVW5pcXVlID09IFVOSVFVRV9DSEVDS19QQVJUSUFMIHx8CgkJCSBp bmRleEluZm8tPmlpX0V4Y2x1c2lvbk9wcyAhPSBOVUxMKSAmJgoJCQkhc2F0aXNmaWVzQ29u c3RyYWludCkKCQl7CgkJCS8qCgkJCSAqIFRoZSB0dXBsZSBwb3RlbnRpYWxseSB2aW9sYXRl cyB0aGUgdW5pcXVlbmVzcyBvciBleGNsdXNpb24KCQkJICogY29uc3RyYWludCwgc28gbWFr ZSBhIG5vdGUgb2YgdGhlIGluZGV4IHNvIHRoYXQgd2UgY2FuIHJlLWNoZWNrCgkJCSAqIGl0 IGxhdGVyLiAgU3BlY3VsYXRpdmUgaW5zZXJ0ZXJzIGFyZSB0b2xkIGlmIHRoZXJlIHdhcyBh CgkJCSAqIHNwZWN1bGF0aXZlIGNvbmZsaWN0LCBzaW5jZSB0aGF0IGFsd2F5cyByZXF1aXJl cyBhIHJlc3RhcnQuCgkJCSAqLwoJCQlyZXN1bHQgPSBsYXBwZW5kX29pZChyZXN1bHQsIFJl bGF0aW9uR2V0UmVsaWQoaW5kZXhSZWxhdGlvbikpOwoJCQlpZiAoaW5kZXhSZWxhdGlvbi0+ cmRfaW5kZXgtPmluZGltbWVkaWF0ZSAmJiBzcGVjQ29uZmxpY3QpCgkJCQkqc3BlY0NvbmZs aWN0ID0gdHJ1ZTsKCQl9Cgl9CgoJcmV0dXJuIHJlc3VsdDsKfQoKLyogLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQog KgkJRXhlY0NoZWNrSW5kZXhDb25zdHJhaW50cwogKgogKgkJVGhpcyByb3V0aW5lIGNoZWNr cyBpZiBhIHR1cGxlIHZpb2xhdGVzIGFueSB1bmlxdWUgb3IKICoJCWV4Y2x1c2lvbiBjb25z dHJhaW50cy4gIFJldHVybnMgdHJ1ZSBpZiB0aGVyZSBpcyBubyBjb25mbGljdC4KICoJCU90 aGVyd2lzZSByZXR1cm5zIGZhbHNlLCBhbmQgdGhlIFRJRCBvZiB0aGUgY29uZmxpY3RpbmcK ICoJCXR1cGxlIGlzIHJldHVybmVkIGluICpjb25mbGljdFRpZC4KICoKICoJCUlmICdhcmJp dGVySW5kZXhlcycgaXMgZ2l2ZW4sIG9ubHkgdGhvc2UgaW5kZXhlcyBhcmUgY2hlY2tlZC4K ICoJCU5JTCBtZWFucyBhbGwgaW5kZXhlcy4KICoKICoJCU5vdGUgdGhhdCB0aGlzIGRvZXNu J3QgbG9jayB0aGUgdmFsdWVzIGluIGFueSB3YXksIHNvIGl0J3MKICoJCXBvc3NpYmxlIHRo YXQgYSBjb25mbGljdGluZyB0dXBsZSBpcyBpbnNlcnRlZCBpbW1lZGlhdGVseQogKgkJYWZ0 ZXIgdGhpcyByZXR1cm5zLiAgVGhpcyBjYW4gYmUgdXNlZCBmb3IgZWl0aGVyIGEgcHJlLWNo ZWNrCiAqCQliZWZvcmUgaW5zZXJ0aW9uIG9yIGEgcmUtY2hlY2sgYWZ0ZXIgZmluZGluZyBh IGNvbmZsaWN0LgogKgogKgkJJ3R1cGxlaWQnIHNob3VsZCBiZSB0aGUgVElEIG9mIHRoZSB0 dXBsZSB0aGF0IGhhcyBiZWVuIHJlY2VudGx5CiAqCQlpbnNlcnRlZCAob3IgY2FuIGJlIGlu dmFsaWQgaWYgd2UgaGF2ZW4ndCBpbnNlcnRlZCBhIG5ldyB0dXBsZSB5ZXQpLgogKgkJVGhp cyB0dXBsZSB3aWxsIGJlIGV4Y2x1ZGVkIGZyb20gY29uZmxpY3QgY2hlY2tpbmcuCiAqIC0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0KICovCmJvb2wKRXhlY0NoZWNrSW5kZXhDb25zdHJhaW50cyhSZXN1bHRSZWxJ bmZvICpyZXN1bHRSZWxJbmZvLCBUdXBsZVRhYmxlU2xvdCAqc2xvdCwKCQkJCQkJICBFU3Rh dGUgKmVzdGF0ZSwgSXRlbVBvaW50ZXIgY29uZmxpY3RUaWQsCgkJCQkJCSAgY29uc3QgSXRl bVBvaW50ZXJEYXRhICp0dXBsZWlkLCBMaXN0ICphcmJpdGVySW5kZXhlcykKewoJaW50CQkJ aTsKCWludAkJCW51bUluZGljZXM7CglSZWxhdGlvblB0ciByZWxhdGlvbkRlc2NzOwoJUmVs YXRpb24JaGVhcFJlbGF0aW9uOwoJSW5kZXhJbmZvICoqaW5kZXhJbmZvQXJyYXk7CglFeHBy Q29udGV4dCAqZWNvbnRleHQ7CglEYXR1bQkJdmFsdWVzW0lOREVYX01BWF9LRVlTXTsKCWJv b2wJCWlzbnVsbFtJTkRFWF9NQVhfS0VZU107CglJdGVtUG9pbnRlckRhdGEgaW52YWxpZEl0 ZW1QdHI7Cglib29sCQljaGVja2VkSW5kZXggPSBmYWxzZTsKCglJdGVtUG9pbnRlclNldElu dmFsaWQoY29uZmxpY3RUaWQpOwoJSXRlbVBvaW50ZXJTZXRJbnZhbGlkKCZpbnZhbGlkSXRl bVB0cik7CgoJLyoKCSAqIEdldCBpbmZvcm1hdGlvbiBmcm9tIHRoZSByZXN1bHQgcmVsYXRp b24gaW5mbyBzdHJ1Y3R1cmUuCgkgKi8KCW51bUluZGljZXMgPSByZXN1bHRSZWxJbmZvLT5y aV9OdW1JbmRpY2VzOwoJcmVsYXRpb25EZXNjcyA9IHJlc3VsdFJlbEluZm8tPnJpX0luZGV4 UmVsYXRpb25EZXNjczsKCWluZGV4SW5mb0FycmF5ID0gcmVzdWx0UmVsSW5mby0+cmlfSW5k ZXhSZWxhdGlvbkluZm87CgloZWFwUmVsYXRpb24gPSByZXN1bHRSZWxJbmZvLT5yaV9SZWxh dGlvbkRlc2M7CgoJLyoKCSAqIFdlIHdpbGwgdXNlIHRoZSBFU3RhdGUncyBwZXItdHVwbGUg Y29udGV4dCBmb3IgZXZhbHVhdGluZyBwcmVkaWNhdGVzCgkgKiBhbmQgaW5kZXggZXhwcmVz c2lvbnMgKGNyZWF0aW5nIGl0IGlmIGl0J3Mgbm90IGFscmVhZHkgdGhlcmUpLgoJICovCgll Y29udGV4dCA9IEdldFBlclR1cGxlRXhwckNvbnRleHQoZXN0YXRlKTsKCgkvKiBBcnJhbmdl IGZvciBlY29udGV4dCdzIHNjYW4gdHVwbGUgdG8gYmUgdGhlIHR1cGxlIHVuZGVyIHRlc3Qg Ki8KCWVjb250ZXh0LT5lY3h0X3NjYW50dXBsZSA9IHNsb3Q7CgoJLyoKCSAqIEZvciBlYWNo IGluZGV4LCBmb3JtIGluZGV4IHR1cGxlIGFuZCBjaGVjayBpZiBpdCBzYXRpc2ZpZXMgdGhl CgkgKiBjb25zdHJhaW50LgoJICovCglmb3IgKGkgPSAwOyBpIDwgbnVtSW5kaWNlczsgaSsr KQoJewoJCVJlbGF0aW9uCWluZGV4UmVsYXRpb24gPSByZWxhdGlvbkRlc2NzW2ldOwoJCUlu ZGV4SW5mbyAgKmluZGV4SW5mbzsKCQlib29sCQlzYXRpc2ZpZXNDb25zdHJhaW50OwoKCQlp ZiAoaW5kZXhSZWxhdGlvbiA9PSBOVUxMKQoJCQljb250aW51ZTsKCgkJaW5kZXhJbmZvID0g aW5kZXhJbmZvQXJyYXlbaV07CgoJCWlmICghaW5kZXhJbmZvLT5paV9VbmlxdWUgJiYgIWlu ZGV4SW5mby0+aWlfRXhjbHVzaW9uT3BzKQoJCQljb250aW51ZTsKCgkJLyogSWYgdGhlIGlu ZGV4IGlzIG1hcmtlZCBhcyByZWFkLW9ubHksIGlnbm9yZSBpdCAqLwoJCWlmICghaW5kZXhJ bmZvLT5paV9SZWFkeUZvckluc2VydHMpCgkJCWNvbnRpbnVlOwoKCQkvKiBXaGVuIHNwZWNp ZmljIGFyYml0ZXIgaW5kZXhlcyByZXF1ZXN0ZWQsIG9ubHkgZXhhbWluZSB0aGVtICovCgkJ aWYgKGFyYml0ZXJJbmRleGVzICE9IE5JTCAmJgoJCQkhbGlzdF9tZW1iZXJfb2lkKGFyYml0 ZXJJbmRleGVzLAoJCQkJCQkJIGluZGV4UmVsYXRpb24tPnJkX2luZGV4LT5pbmRleHJlbGlk KSkKCQkJY29udGludWU7CgoJCWlmICghaW5kZXhSZWxhdGlvbi0+cmRfaW5kZXgtPmluZGlt bWVkaWF0ZSkKCQkJZXJlcG9ydChFUlJPUiwKCQkJCQkoZXJyY29kZShFUlJDT0RFX09CSkVD VF9OT1RfSU5fUFJFUkVRVUlTSVRFX1NUQVRFKSwKCQkJCQkgZXJybXNnKCJPTiBDT05GTElD VCBkb2VzIG5vdCBzdXBwb3J0IGRlZmVycmFibGUgdW5pcXVlIGNvbnN0cmFpbnRzL2V4Y2x1 c2lvbiBjb25zdHJhaW50cyBhcyBhcmJpdGVycyIpLAoJCQkJCSBlcnJ0YWJsZWNvbnN0cmFp bnQoaGVhcFJlbGF0aW9uLAoJCQkJCQkJCQkJUmVsYXRpb25HZXRSZWxhdGlvbk5hbWUoaW5k ZXhSZWxhdGlvbikpKSk7CgoJCWNoZWNrZWRJbmRleCA9IHRydWU7CgoJCS8qIENoZWNrIGZv ciBwYXJ0aWFsIGluZGV4ICovCgkJaWYgKGluZGV4SW5mby0+aWlfUHJlZGljYXRlICE9IE5J TCkKCQl7CgkJCUV4cHJTdGF0ZSAgKnByZWRpY2F0ZTsKCQkJRXhwclN0YXRlICAqcHJlZGlj YXRlRXhwYW5kOwoKCQkJLyoKCQkJICogSWYgcHJlZGljYXRlIHN0YXRlIG5vdCBzZXQgdXAg eWV0LCBjcmVhdGUgaXQgKGluIHRoZSBlc3RhdGUncwoJCQkgKiBwZXItcXVlcnkgY29udGV4 dCkKCQkJICovCgkJCXByZWRpY2F0ZSA9IGluZGV4SW5mby0+aWlfUHJlZGljYXRlU3RhdGU7 CgkJCXByZWRpY2F0ZUV4cGFuZCA9IGluZGV4SW5mby0+aWlfUHJlZGljYXRlRXhwYW5kU3Rh dGU7CgkJCWlmIChwcmVkaWNhdGUgPT0gTlVMTCkKCQkJewoJCQkJcHJlZGljYXRlID0gRXhl Y1ByZXBhcmVRdWFsKGluZGV4SW5mby0+aWlfUHJlZGljYXRlLCBlc3RhdGUpOwoJCQkJcHJl ZGljYXRlRXhwYW5kID0gRXhlY1ByZXBhcmVRdWFsKGluZGV4SW5mby0+aWlfUHJlZGljYXRl RXhwYW5kLCBlc3RhdGUpOwoJCQkJaW5kZXhJbmZvLT5paV9QcmVkaWNhdGVTdGF0ZSA9IHBy ZWRpY2F0ZTsKCQkJCWluZGV4SW5mby0+aWlfUHJlZGljYXRlRXhwYW5kU3RhdGUgPSBwcmVk aWNhdGVFeHBhbmQ7CgkJCX0KCgkJCS8qIFNraXAgdGhpcyBpbmRleC11cGRhdGUgaWYgdGhl IHByZWRpY2F0ZSBpc24ndCBzYXRpc2ZpZWQgKi8KCQkJaWYgKCFFeGVjUXVhbChwcmVkaWNh dGVFeHBhbmQsIGVjb250ZXh0KSkKCQkJCWNvbnRpbnVlOwoJCX0KCgkJLyoKCQkgKiBGb3Jt SW5kZXhEYXR1bSBmaWxscyBpbiBpdHMgdmFsdWVzIGFuZCBpc251bGwgcGFyYW1ldGVycyB3 aXRoIHRoZQoJCSAqIGFwcHJvcHJpYXRlIHZhbHVlcyBmb3IgdGhlIGNvbHVtbihzKSBvZiB0 aGUgaW5kZXguCgkJICovCgkJRm9ybUluZGV4RGF0dW0oaW5kZXhJbmZvLAoJCQkJCSAgIHNs b3QsCgkJCQkJICAgZXN0YXRlLAoJCQkJCSAgIHZhbHVlcywKCQkJCQkgICBpc251bGwpOwoK CQlzYXRpc2ZpZXNDb25zdHJhaW50ID0KCQkJY2hlY2tfZXhjbHVzaW9uX29yX3VuaXF1ZV9j b25zdHJhaW50KGhlYXBSZWxhdGlvbiwgaW5kZXhSZWxhdGlvbiwKCQkJCQkJCQkJCQkJIGlu ZGV4SW5mbywgdHVwbGVpZCwKCQkJCQkJCQkJCQkJIHZhbHVlcywgaXNudWxsLCBlc3RhdGUs IGZhbHNlLAoJCQkJCQkJCQkJCQkgQ0VPVUNfV0FJVCwgdHJ1ZSwKCQkJCQkJCQkJCQkJIGNv bmZsaWN0VGlkKTsKCQlpZiAoIXNhdGlzZmllc0NvbnN0cmFpbnQpCgkJCXJldHVybiBmYWxz ZTsKCX0KCglpZiAoYXJiaXRlckluZGV4ZXMgIT0gTklMICYmICFjaGVja2VkSW5kZXgpCgkJ ZWxvZyhFUlJPUiwgInVuZXhwZWN0ZWQgZmFpbHVyZSB0byBmaW5kIGFyYml0ZXIgaW5kZXgi KTsKCglyZXR1cm4gdHJ1ZTsKfQoKLyoKICogQ2hlY2sgZm9yIHZpb2xhdGlvbiBvZiBhbiBl eGNsdXNpb24gb3IgdW5pcXVlIGNvbnN0cmFpbnQKICoKICogaGVhcDogdGhlIHRhYmxlIGNv bnRhaW5pbmcgdGhlIG5ldyB0dXBsZQogKiBpbmRleDogdGhlIGluZGV4IHN1cHBvcnRpbmcg dGhlIGNvbnN0cmFpbnQKICogaW5kZXhJbmZvOiBpbmZvIGFib3V0IHRoZSBpbmRleCwgaW5j bHVkaW5nIHRoZSBleGNsdXNpb24gcHJvcGVydGllcwogKiB0dXBsZWlkOiBoZWFwIFRJRCBv ZiB0aGUgbmV3IHR1cGxlIHdlIGhhdmUganVzdCBpbnNlcnRlZCAoaW52YWxpZCBpZiB3ZQog KgkJaGF2ZW4ndCBpbnNlcnRlZCBhIG5ldyB0dXBsZSB5ZXQpCiAqIHZhbHVlcywgaXNudWxs OiB0aGUgKmluZGV4KiBjb2x1bW4gdmFsdWVzIGNvbXB1dGVkIGZvciB0aGUgbmV3IHR1cGxl CiAqIGVzdGF0ZTogYW4gRVN0YXRlIHdlIGNhbiBkbyBldmFsdWF0aW9uIGluCiAqIG5ld0lu ZGV4OiBpZiB0cnVlLCB3ZSBhcmUgdHJ5aW5nIHRvIGJ1aWxkIGEgbmV3IGluZGV4ICh0aGlz IGFmZmVjdHMKICoJCW9ubHkgdGhlIHdvcmRpbmcgb2YgZXJyb3IgbWVzc2FnZXMpCiAqIHdh aXRNb2RlOiB3aGV0aGVyIHRvIHdhaXQgZm9yIGNvbmN1cnJlbnQgaW5zZXJ0ZXJzL2RlbGV0 ZXJzCiAqIHZpb2xhdGlvbk9LOiBpZiB0cnVlLCBkb24ndCB0aHJvdyBlcnJvciBmb3Igdmlv bGF0aW9uCiAqIGNvbmZsaWN0VGlkOiBpZiBub3QtTlVMTCwgdGhlIFRJRCBvZiB0aGUgY29u ZmxpY3RpbmcgdHVwbGUgaXMgcmV0dXJuZWQgaGVyZQogKgogKiBSZXR1cm5zIHRydWUgaWYg T0ssIGZhbHNlIGlmIGFjdHVhbCBvciBwb3RlbnRpYWwgdmlvbGF0aW9uCiAqCiAqICd3YWl0 TW9kZScgZGV0ZXJtaW5lcyB3aGF0IGhhcHBlbnMgaWYgYSBjb25mbGljdCBpcyBkZXRlY3Rl ZCB3aXRoIGEgdHVwbGUKICogdGhhdCB3YXMgaW5zZXJ0ZWQgb3IgZGVsZXRlZCBieSBhIHRy YW5zYWN0aW9uIHRoYXQncyBzdGlsbCBydW5uaW5nLgogKiBDRU9VQ19XQUlUIG1lYW5zIHRo YXQgd2Ugd2FpdCBmb3IgdGhlIHRyYW5zYWN0aW9uIHRvIGNvbW1pdCwgYmVmb3JlCiAqIHRo cm93aW5nIGFuIGVycm9yIG9yIHJldHVybmluZy4gIENFT1VDX05PV0FJVCBtZWFucyB0aGF0 IHdlIHJlcG9ydCB0aGUKICogdmlvbGF0aW9uIGltbWVkaWF0ZWx5OyBzbyB0aGUgdmlvbGF0 aW9uIGlzIG9ubHkgcG90ZW50aWFsLCBhbmQgdGhlIGNhbGxlcgogKiBtdXN0IHJlY2hlY2sg c29tZXRpbWUgbGF0ZXIuICBUaGlzIGJlaGF2aW9yIGlzIGNvbnZlbmllbnQgZm9yIGRlZmVy cmVkCiAqIGV4Y2x1c2lvbiBjaGVja3M7IHdlIG5lZWQgbm90IGJvdGhlciBxdWV1aW5nIGEg ZGVmZXJyZWQgZXZlbnQgaWYgdGhlcmUgaXMKICogZGVmaW5pdGVseSBubyBjb25mbGljdCBh dCBpbnNlcnRpb24gdGltZS4KICoKICogQ0VPVUNfTElWRUxPQ0tfUFJFVkVOVElOR19XQUlU IGlzIGxpa2UgQ0VPVUNfTk9XQUlULCBidXQgd2Ugd2lsbCBzb21ldGltZXMKICogd2FpdCBh bnl3YXksIHRvIHByZXZlbnQgbGl2ZWxvY2tpbmcgaWYgdHdvIHRyYW5zYWN0aW9ucyB0cnkg aW5zZXJ0aW5nIGF0CiAqIHRoZSBzYW1lIHRpbWUuICBUaGlzIGlzIHVzZWQgd2l0aCBzcGVj dWxhdGl2ZSBpbnNlcnRpb25zLCBmb3IgSU5TRVJUIE9OCiAqIENPTkZMSUNUIHN0YXRlbWVu dHMuIChTZWUgbm90ZXMgaW4gZmlsZSBoZWFkZXIpCiAqCiAqIElmIHZpb2xhdGlvbk9LIGlz IHRydWUsIHdlIGp1c3QgcmVwb3J0IHRoZSBwb3RlbnRpYWwgb3IgYWN0dWFsIHZpb2xhdGlv biB0bwogKiB0aGUgY2FsbGVyIGJ5IHJldHVybmluZyAnZmFsc2UnLiAgT3RoZXJ3aXNlIHdl IHRocm93IGEgZGVzY3JpcHRpdmUgZXJyb3IKICogbWVzc2FnZSBoZXJlLiAgV2hlbiB2aW9s YXRpb25PSyBpcyBmYWxzZSwgYSBmYWxzZSByZXN1bHQgaXMgaW1wb3NzaWJsZS4KICoKICog Tm90ZTogVGhlIGluZGV4YW0gaXMgbm9ybWFsbHkgcmVzcG9uc2libGUgZm9yIGNoZWNraW5n IHVuaXF1ZSBjb25zdHJhaW50cywKICogc28gdGhpcyBub3JtYWxseSBvbmx5IG5lZWRzIHRv IGJlIHVzZWQgZm9yIGV4Y2x1c2lvbiBjb25zdHJhaW50cy4gIEJ1dCB0aGlzCiAqIGZ1bmN0 aW9uIGlzIGFsc28gY2FsbGVkIHdoZW4gZG9pbmcgYSAicHJlLWNoZWNrIiBmb3IgY29uZmxp Y3RzIG9uIGEgdW5pcXVlCiAqIGNvbnN0cmFpbnQsIHdoZW4gZG9pbmcgc3BlY3VsYXRpdmUg aW5zZXJ0aW9uLiAgQ2FsbGVyIG1heSB1c2UgdGhlIHJldHVybmVkCiAqIGNvbmZsaWN0IFRJ RCB0byB0YWtlIGZ1cnRoZXIgc3RlcHMuCiAqLwpzdGF0aWMgYm9vbApjaGVja19leGNsdXNp b25fb3JfdW5pcXVlX2NvbnN0cmFpbnQoUmVsYXRpb24gaGVhcCwgUmVsYXRpb24gaW5kZXgs CgkJCQkJCQkJCSBJbmRleEluZm8gKmluZGV4SW5mbywKCQkJCQkJCQkJIGNvbnN0IEl0ZW1Q b2ludGVyRGF0YSAqdHVwbGVpZCwKCQkJCQkJCQkJIGNvbnN0IERhdHVtICp2YWx1ZXMsIGNv bnN0IGJvb2wgKmlzbnVsbCwKCQkJCQkJCQkJIEVTdGF0ZSAqZXN0YXRlLCBib29sIG5ld0lu ZGV4LAoJCQkJCQkJCQkgQ0VPVUNfV0FJVF9NT0RFIHdhaXRNb2RlLAoJCQkJCQkJCQkgYm9v bCB2aW9sYXRpb25PSywKCQkJCQkJCQkJIEl0ZW1Qb2ludGVyIGNvbmZsaWN0VGlkKQp7CglP aWQJCSAgICpjb25zdHJfcHJvY3M7Cgl1aW50MTYJICAgKmNvbnN0cl9zdHJhdHM7CglPaWQJ CSAgICppbmRleF9jb2xsYXRpb25zID0gaW5kZXgtPnJkX2luZGNvbGxhdGlvbjsKCWludAkJ CWluZG5rZXlhdHRzID0gSW5kZXhSZWxhdGlvbkdldE51bWJlck9mS2V5QXR0cmlidXRlcyhp bmRleCk7CglJbmRleFNjYW5EZXNjIGluZGV4X3NjYW47CglTY2FuS2V5RGF0YSBzY2Fua2V5 c1tJTkRFWF9NQVhfS0VZU107CglTbmFwc2hvdERhdGEgRGlydHlTbmFwc2hvdDsKCWludAkJ CWk7Cglib29sCQljb25mbGljdDsKCWJvb2wJCWZvdW5kX3NlbGY7CglFeHByQ29udGV4dCAq ZWNvbnRleHQ7CglUdXBsZVRhYmxlU2xvdCAqZXhpc3Rpbmdfc2xvdDsKCVR1cGxlVGFibGVT bG90ICpzYXZlX3NjYW50dXBsZTsKCglpZiAoaW5kZXhJbmZvLT5paV9FeGNsdXNpb25PcHMp Cgl7CgkJY29uc3RyX3Byb2NzID0gaW5kZXhJbmZvLT5paV9FeGNsdXNpb25Qcm9jczsKCQlj b25zdHJfc3RyYXRzID0gaW5kZXhJbmZvLT5paV9FeGNsdXNpb25TdHJhdHM7Cgl9CgllbHNl Cgl7CgkJY29uc3RyX3Byb2NzID0gaW5kZXhJbmZvLT5paV9VbmlxdWVQcm9jczsKCQljb25z dHJfc3RyYXRzID0gaW5kZXhJbmZvLT5paV9VbmlxdWVTdHJhdHM7Cgl9CgoJLyoKCSAqIElm IHRoaXMgaXMgYSBXSVRIT1VUIE9WRVJMQVBTIGNvbnN0cmFpbnQsIHdlIG11c3QgYWxzbyBm b3JiaWQgZW1wdHkKCSAqIHJhbmdlcy9tdWx0aXJhbmdlcy4gVGhpcyBtdXN0IGhhcHBlbiBi ZWZvcmUgd2UgbG9vayBmb3IgTlVMTHMgYmVsb3csIG9yCgkgKiBhIFVOSVFVRSBjb25zdHJh aW50IGNvdWxkIGluc2VydCBhbiBlbXB0eSByYW5nZSBhbG9uZyB3aXRoIGEgTlVMTAoJICog c2NhbGFyIHBhcnQuCgkgKi8KCWlmIChpbmRleEluZm8tPmlpX1dpdGhvdXRPdmVybGFwcykK CXsKCQkvKgoJCSAqIExvb2sgdXAgdGhlIHR5cGUgZnJvbSB0aGUgaGVhcCB0dXBsZSwgYnV0 IGNoZWNrIHRoZSBEYXR1bSBmcm9tIHRoZQoJCSAqIGluZGV4IHR1cGxlLgoJCSAqLwoJCUF0 dHJOdW1iZXIJYXR0bm8gPSBpbmRleEluZm8tPmlpX0luZGV4QXR0ck51bWJlcnNbaW5kbmtl eWF0dHMgLSAxXTsKCgkJaWYgKCFpc251bGxbaW5kbmtleWF0dHMgLSAxXSkKCQl7CgkJCVR1 cGxlRGVzYwl0dXBkZXNjID0gUmVsYXRpb25HZXREZXNjcihoZWFwKTsKCQkJRm9ybV9wZ19h dHRyaWJ1dGUgYXR0ID0gVHVwbGVEZXNjQXR0cih0dXBkZXNjLCBhdHRubyAtIDEpOwoJCQlU eXBlQ2FjaGVFbnRyeSAqdHlwY2FjaGUgPSBsb29rdXBfdHlwZV9jYWNoZShhdHQtPmF0dHR5 cGlkLAoJCQkJCQkJCQkJCQkJCSBUWVBFQ0FDSEVfRE9NQUlOX0JBU0VfSU5GTyk7CgkJCWNo YXIJCXR5cHR5cGU7CgoJCQlpZiAoT2lkSXNWYWxpZCh0eXBjYWNoZS0+ZG9tYWluQmFzZVR5 cGUpKQoJCQkJdHlwdHlwZSA9IGdldF90eXB0eXBlKHR5cGNhY2hlLT5kb21haW5CYXNlVHlw ZSk7CgkJCWVsc2UKCQkJCXR5cHR5cGUgPSB0eXBjYWNoZS0+dHlwdHlwZTsKCgkJCUV4ZWNX aXRob3V0T3ZlcmxhcHNOb3RFbXB0eShoZWFwLCBhdHQtPmF0dG5hbWUsCgkJCQkJCQkJCQl2 YWx1ZXNbaW5kbmtleWF0dHMgLSAxXSwKCQkJCQkJCQkJCXR5cHR5cGUsIGF0dC0+YXR0dHlw aWQpOwoJCX0KCX0KCgkvKgoJICogSWYgYW55IG9mIHRoZSBpbnB1dCB2YWx1ZXMgYXJlIE5V TEwsIGFuZCB0aGUgaW5kZXggdXNlcyB0aGUgZGVmYXVsdAoJICogbnVsbHMtYXJlLWRpc3Rp bmN0IG1vZGUsIHRoZSBjb25zdHJhaW50IGNoZWNrIGlzIGFzc3VtZWQgdG8gcGFzcyAoaS5l LiwKCSAqIHdlIGFzc3VtZSB0aGUgb3BlcmF0b3JzIGFyZSBzdHJpY3QpLiAgT3RoZXJ3aXNl LCB3ZSBpbnRlcnByZXQgdGhlCgkgKiBjb25zdHJhaW50IGFzIHNwZWNpZnlpbmcgSVMgTlVM TCBmb3IgZWFjaCBjb2x1bW4gd2hvc2UgaW5wdXQgdmFsdWUgaXMKCSAqIE5VTEwuCgkgKi8K CWlmICghaW5kZXhJbmZvLT5paV9OdWxsc05vdERpc3RpbmN0KQoJewoJCWZvciAoaSA9IDA7 IGkgPCBpbmRua2V5YXR0czsgaSsrKQoJCXsKCQkJaWYgKGlzbnVsbFtpXSkKCQkJCXJldHVy biB0cnVlOwoJCX0KCX0KCgkvKgoJICogU2VhcmNoIHRoZSB0dXBsZXMgdGhhdCBhcmUgaW4g dGhlIGluZGV4IGZvciBhbnkgdmlvbGF0aW9ucywgaW5jbHVkaW5nCgkgKiB0dXBsZXMgdGhh dCBhcmVuJ3QgdmlzaWJsZSB5ZXQuCgkgKi8KCUluaXREaXJ0eVNuYXBzaG90KERpcnR5U25h cHNob3QpOwoKCWZvciAoaSA9IDA7IGkgPCBpbmRua2V5YXR0czsgaSsrKQoJewoJCVNjYW5L ZXlFbnRyeUluaXRpYWxpemUoJnNjYW5rZXlzW2ldLAoJCQkJCQkJICAgaXNudWxsW2ldID8g U0tfSVNOVUxMIHwgU0tfU0VBUkNITlVMTCA6IDAsCgkJCQkJCQkgICBpICsgMSwKCQkJCQkJ CSAgIGNvbnN0cl9zdHJhdHNbaV0sCgkJCQkJCQkgICBJbnZhbGlkT2lkLAoJCQkJCQkJICAg aW5kZXhfY29sbGF0aW9uc1tpXSwKCQkJCQkJCSAgIGNvbnN0cl9wcm9jc1tpXSwKCQkJCQkJ CSAgIHZhbHVlc1tpXSk7Cgl9CgoJLyoKCSAqIE5lZWQgYSBUdXBsZVRhYmxlU2xvdCB0byBw dXQgZXhpc3RpbmcgdHVwbGVzIGluLgoJICoKCSAqIFRvIHVzZSBGb3JtSW5kZXhEYXR1bSwg d2UgaGF2ZSB0byBtYWtlIHRoZSBlY29udGV4dCdzIHNjYW50dXBsZSBwb2ludAoJICogdG8g dGhpcyBzbG90LiAgQmUgc3VyZSB0byBzYXZlIGFuZCByZXN0b3JlIGNhbGxlcidzIHZhbHVl IGZvcgoJICogc2NhbnR1cGxlLgoJICovCglleGlzdGluZ19zbG90ID0gdGFibGVfc2xvdF9j cmVhdGUoaGVhcCwgTlVMTCk7CgoJZWNvbnRleHQgPSBHZXRQZXJUdXBsZUV4cHJDb250ZXh0 KGVzdGF0ZSk7CglzYXZlX3NjYW50dXBsZSA9IGVjb250ZXh0LT5lY3h0X3NjYW50dXBsZTsK CWVjb250ZXh0LT5lY3h0X3NjYW50dXBsZSA9IGV4aXN0aW5nX3Nsb3Q7CgoJLyoKCSAqIE1h eSBoYXZlIHRvIHJlc3RhcnQgc2NhbiBmcm9tIHRoaXMgcG9pbnQgaWYgYSBwb3RlbnRpYWwg Y29uZmxpY3QgaXMKCSAqIGZvdW5kLgoJICovCnJldHJ5OgoJY29uZmxpY3QgPSBmYWxzZTsK CWZvdW5kX3NlbGYgPSBmYWxzZTsKCWluZGV4X3NjYW4gPSBpbmRleF9iZWdpbnNjYW4oaGVh cCwgaW5kZXgsCgkJCQkJCQkJICZEaXJ0eVNuYXBzaG90LCBOVUxMLCBpbmRua2V5YXR0cywg MCwKCQkJCQkJCQkgU09fTk9ORSk7CglpbmRleF9yZXNjYW4oaW5kZXhfc2Nhbiwgc2Nhbmtl eXMsIGluZG5rZXlhdHRzLCBOVUxMLCAwKTsKCgl3aGlsZSAoaW5kZXhfZ2V0bmV4dF9zbG90 KGluZGV4X3NjYW4sIEZvcndhcmRTY2FuRGlyZWN0aW9uLCBleGlzdGluZ19zbG90KSkKCXsK CQlUcmFuc2FjdGlvbklkIHh3YWl0OwoJCVhMVFdfT3BlcglyZWFzb25fd2FpdDsKCQlEYXR1 bQkJZXhpc3RpbmdfdmFsdWVzW0lOREVYX01BWF9LRVlTXTsKCQlib29sCQlleGlzdGluZ19p c251bGxbSU5ERVhfTUFYX0tFWVNdOwoJCWNoYXIJICAgKmVycm9yX25ldzsKCQljaGFyCSAg ICplcnJvcl9leGlzdGluZzsKCgkJLyoKCQkgKiBJZ25vcmUgdGhlIGVudHJ5IGZvciB0aGUg dHVwbGUgd2UncmUgdHJ5aW5nIHRvIGNoZWNrLgoJCSAqLwoJCWlmIChJdGVtUG9pbnRlcklz VmFsaWQodHVwbGVpZCkgJiYKCQkJSXRlbVBvaW50ZXJFcXVhbHModHVwbGVpZCwgJmV4aXN0 aW5nX3Nsb3QtPnR0c190aWQpKQoJCXsKCQkJaWYgKGZvdW5kX3NlbGYpCQkvKiBzaG91bGQg bm90IGhhcHBlbiAqLwoJCQkJZWxvZyhFUlJPUiwgImZvdW5kIHNlbGYgdHVwbGUgbXVsdGlw bGUgdGltZXMgaW4gaW5kZXggXCIlc1wiIiwKCQkJCQkgUmVsYXRpb25HZXRSZWxhdGlvbk5h bWUoaW5kZXgpKTsKCQkJZm91bmRfc2VsZiA9IHRydWU7CgkJCWNvbnRpbnVlOwoJCX0KCgkJ LyoKCQkgKiBFeHRyYWN0IHRoZSBpbmRleCBjb2x1bW4gdmFsdWVzIGFuZCBpc251bGwgZmxh Z3MgZnJvbSB0aGUgZXhpc3RpbmcKCQkgKiB0dXBsZS4KCQkgKi8KCQlGb3JtSW5kZXhEYXR1 bShpbmRleEluZm8sIGV4aXN0aW5nX3Nsb3QsIGVzdGF0ZSwKCQkJCQkgICBleGlzdGluZ192 YWx1ZXMsIGV4aXN0aW5nX2lzbnVsbCk7CgoJCS8qIElmIGxvc3N5IGluZGV4c2NhbiwgbXVz dCByZWNoZWNrIHRoZSBjb25kaXRpb24gKi8KCQlpZiAoaW5kZXhfc2Nhbi0+eHNfcmVjaGVj aykKCQl7CgkJCWlmICghaW5kZXhfcmVjaGVja19jb25zdHJhaW50KGluZGV4LAoJCQkJCQkJ CQkJICBjb25zdHJfcHJvY3MsCgkJCQkJCQkJCQkgIGV4aXN0aW5nX3ZhbHVlcywKCQkJCQkJ CQkJCSAgZXhpc3RpbmdfaXNudWxsLAoJCQkJCQkJCQkJICB2YWx1ZXMpKQoJCQkJY29udGlu dWU7CQkvKiB0dXBsZSBkb2Vzbid0IGFjdHVhbGx5IG1hdGNoLCBzbyBubwoJCQkJCQkJCSAq IGNvbmZsaWN0ICovCgkJfQoKCQkvKgoJCSAqIEF0IHRoaXMgcG9pbnQgd2UgaGF2ZSBlaXRo ZXIgYSBjb25mbGljdCBvciBhIHBvdGVudGlhbCBjb25mbGljdC4KCQkgKgoJCSAqIElmIGFu IGluLXByb2dyZXNzIHRyYW5zYWN0aW9uIGlzIGFmZmVjdGluZyB0aGUgdmlzaWJpbGl0eSBv ZiB0aGlzCgkJICogdHVwbGUsIHdlIG5lZWQgdG8gd2FpdCBmb3IgaXQgdG8gY29tcGxldGUg YW5kIHRoZW4gcmVjaGVjayAodW5sZXNzCgkJICogdGhlIGNhbGxlciByZXF1ZXN0ZWQgbm90 IHRvKS4gIEZvciBzaW1wbGljaXR5IHdlIGRvIHJlY2hlY2tpbmcgYnkKCQkgKiBqdXN0IHJl c3RhcnRpbmcgdGhlIHdob2xlIHNjYW4gLS0tIHRoaXMgY2FzZSBwcm9iYWJseSBkb2Vzbid0 CgkJICogaGFwcGVuIG9mdGVuIGVub3VnaCB0byBiZSB3b3J0aCB0cnlpbmcgaGFyZGVyLCBh bmQgYW55d2F5IHdlIGRvbid0CgkJICogd2FudCB0byBob2xkIGFueSBpbmRleCBpbnRlcm5h bCBsb2NrcyB3aGlsZSB3YWl0aW5nLgoJCSAqLwoJCXh3YWl0ID0gVHJhbnNhY3Rpb25JZElz VmFsaWQoRGlydHlTbmFwc2hvdC54bWluKSA/CgkJCURpcnR5U25hcHNob3QueG1pbiA6IERp cnR5U25hcHNob3QueG1heDsKCgkJaWYgKFRyYW5zYWN0aW9uSWRJc1ZhbGlkKHh3YWl0KSAm JgoJCQkod2FpdE1vZGUgPT0gQ0VPVUNfV0FJVCB8fAoJCQkgKHdhaXRNb2RlID09IENFT1VD X0xJVkVMT0NLX1BSRVZFTlRJTkdfV0FJVCAmJgoJCQkgIERpcnR5U25hcHNob3Quc3BlY3Vs YXRpdmVUb2tlbiAmJgoJCQkgIFRyYW5zYWN0aW9uSWRQcmVjZWRlcyhHZXRDdXJyZW50VHJh bnNhY3Rpb25JZCgpLCB4d2FpdCkpKSkKCQl7CgkJCXJlYXNvbl93YWl0ID0gaW5kZXhJbmZv LT5paV9FeGNsdXNpb25PcHMgPwoJCQkJWExUV19SZWNoZWNrRXhjbHVzaW9uQ29uc3RyIDog WExUV19JbnNlcnRJbmRleDsKCQkJaW5kZXhfZW5kc2NhbihpbmRleF9zY2FuKTsKCQkJaWYg KERpcnR5U25hcHNob3Quc3BlY3VsYXRpdmVUb2tlbikKCQkJCVNwZWN1bGF0aXZlSW5zZXJ0 aW9uV2FpdChEaXJ0eVNuYXBzaG90LnhtaW4sCgkJCQkJCQkJCQkgRGlydHlTbmFwc2hvdC5z cGVjdWxhdGl2ZVRva2VuKTsKCQkJZWxzZQoJCQkJWGFjdExvY2tUYWJsZVdhaXQoeHdhaXQs IGhlYXAsCgkJCQkJCQkJICAmZXhpc3Rpbmdfc2xvdC0+dHRzX3RpZCwgcmVhc29uX3dhaXQp OwoJCQlnb3RvIHJldHJ5OwoJCX0KCgkJLyoKCQkgKiBXZSBoYXZlIGEgZGVmaW5pdGUgY29u ZmxpY3QgKG9yIGEgcG90ZW50aWFsIG9uZSwgYnV0IHRoZSBjYWxsZXIKCQkgKiBkaWRuJ3Qg d2FudCB0byB3YWl0KS4gIFJldHVybiBpdCB0byBjYWxsZXIsIG9yIHJlcG9ydCBpdC4KCQkg Ki8KCQlpZiAodmlvbGF0aW9uT0spCgkJewoJCQljb25mbGljdCA9IHRydWU7CgkJCWlmIChj b25mbGljdFRpZCkKCQkJCSpjb25mbGljdFRpZCA9IGV4aXN0aW5nX3Nsb3QtPnR0c190aWQ7 CgkJCWJyZWFrOwoJCX0KCgkJZXJyb3JfbmV3ID0gQnVpbGRJbmRleFZhbHVlRGVzY3JpcHRp b24oaW5kZXgsIHZhbHVlcywgaXNudWxsKTsKCQllcnJvcl9leGlzdGluZyA9IEJ1aWxkSW5k ZXhWYWx1ZURlc2NyaXB0aW9uKGluZGV4LCBleGlzdGluZ192YWx1ZXMsCgkJCQkJCQkJCQkJ CQlleGlzdGluZ19pc251bGwpOwoJCWlmIChuZXdJbmRleCkKCQkJZXJlcG9ydChFUlJPUiwK CQkJCQkoZXJyY29kZShFUlJDT0RFX0VYQ0xVU0lPTl9WSU9MQVRJT04pLAoJCQkJCSBlcnJt c2coImNvdWxkIG5vdCBjcmVhdGUgZXhjbHVzaW9uIGNvbnN0cmFpbnQgXCIlc1wiIiwKCQkJ CQkJCVJlbGF0aW9uR2V0UmVsYXRpb25OYW1lKGluZGV4KSksCgkJCQkJIGVycm9yX25ldyAm JiBlcnJvcl9leGlzdGluZyA/CgkJCQkJIGVycmRldGFpbCgiS2V5ICVzIGNvbmZsaWN0cyB3 aXRoIGtleSAlcy4iLAoJCQkJCQkJICAgZXJyb3JfbmV3LCBlcnJvcl9leGlzdGluZykgOgoJ CQkJCSBlcnJkZXRhaWwoIktleSBjb25mbGljdHMgZXhpc3QuIiksCgkJCQkJIGVycnRhYmxl Y29uc3RyYWludChoZWFwLAoJCQkJCQkJCQkJUmVsYXRpb25HZXRSZWxhdGlvbk5hbWUoaW5k ZXgpKSkpOwoJCWVsc2UKCQkJZXJlcG9ydChFUlJPUiwKCQkJCQkoZXJyY29kZShFUlJDT0RF X0VYQ0xVU0lPTl9WSU9MQVRJT04pLAoJCQkJCSBlcnJtc2coImNvbmZsaWN0aW5nIGtleSB2 YWx1ZSB2aW9sYXRlcyBleGNsdXNpb24gY29uc3RyYWludCBcIiVzXCIiLAoJCQkJCQkJUmVs YXRpb25HZXRSZWxhdGlvbk5hbWUoaW5kZXgpKSwKCQkJCQkgZXJyb3JfbmV3ICYmIGVycm9y X2V4aXN0aW5nID8KCQkJCQkgZXJyZGV0YWlsKCJLZXkgJXMgY29uZmxpY3RzIHdpdGggZXhp c3Rpbmcga2V5ICVzLiIsCgkJCQkJCQkgICBlcnJvcl9uZXcsIGVycm9yX2V4aXN0aW5nKSA6 CgkJCQkJIGVycmRldGFpbCgiS2V5IGNvbmZsaWN0cyB3aXRoIGV4aXN0aW5nIGtleS4iKSwK CQkJCQkgZXJydGFibGVjb25zdHJhaW50KGhlYXAsCgkJCQkJCQkJCQlSZWxhdGlvbkdldFJl bGF0aW9uTmFtZShpbmRleCkpKSk7Cgl9CgoJaW5kZXhfZW5kc2NhbihpbmRleF9zY2FuKTsK CgkvKgoJICogT3JkaW5hcmlseSwgYXQgdGhpcyBwb2ludCB0aGUgc2VhcmNoIHNob3VsZCBo YXZlIGZvdW5kIHRoZSBvcmlnaW5hbGx5CgkgKiBpbnNlcnRlZCB0dXBsZSAoaWYgYW55KSwg dW5sZXNzIHdlIGV4aXRlZCB0aGUgbG9vcCBlYXJseSBiZWNhdXNlIG9mCgkgKiBjb25mbGlj dC4gIEhvd2V2ZXIsIGl0IGlzIHBvc3NpYmxlIHRvIGRlZmluZSBleGNsdXNpb24gY29uc3Ry YWludHMgZm9yCgkgKiB3aGljaCB0aGF0IHdvdWxkbid0IGJlIHRydWUgLS0tIGZvciBpbnN0 YW5jZSwgaWYgdGhlIG9wZXJhdG9yIGlzIDw+LiBTbwoJICogd2Ugbm8gbG9uZ2VyIGNvbXBs YWluIGlmIGZvdW5kX3NlbGYgaXMgc3RpbGwgZmFsc2UuCgkgKi8KCgllY29udGV4dC0+ZWN4 dF9zY2FudHVwbGUgPSBzYXZlX3NjYW50dXBsZTsKCglFeGVjRHJvcFNpbmdsZVR1cGxlVGFi bGVTbG90KGV4aXN0aW5nX3Nsb3QpOwoKI2lmZGVmIFVTRV9JTkpFQ1RJT05fUE9JTlRTCglp ZiAoIWNvbmZsaWN0KQoJCUlOSkVDVElPTl9QT0lOVCgiY2hlY2stZXhjbHVzaW9uLW9yLXVu aXF1ZS1jb25zdHJhaW50LW5vLWNvbmZsaWN0IiwgTlVMTCk7CiNlbmRpZgoKCXJldHVybiAh Y29uZmxpY3Q7Cn0KCi8qCiAqIENoZWNrIGZvciB2aW9sYXRpb24gb2YgYW4gZXhjbHVzaW9u IGNvbnN0cmFpbnQKICoKICogVGhpcyBpcyBhIGR1bWJlZCBkb3duIHZlcnNpb24gb2YgY2hl Y2tfZXhjbHVzaW9uX29yX3VuaXF1ZV9jb25zdHJhaW50CiAqIGZvciBleHRlcm5hbCBjYWxs ZXJzLiBUaGV5IGRvbid0IG5lZWQgYWxsIHRoZSBzcGVjaWFsIG1vZGVzLgogKi8Kdm9pZApj aGVja19leGNsdXNpb25fY29uc3RyYWludChSZWxhdGlvbiBoZWFwLCBSZWxhdGlvbiBpbmRl eCwKCQkJCQkJICAgSW5kZXhJbmZvICppbmRleEluZm8sCgkJCQkJCSAgIGNvbnN0IEl0ZW1Q b2ludGVyRGF0YSAqdHVwbGVpZCwKCQkJCQkJICAgY29uc3QgRGF0dW0gKnZhbHVlcywgY29u c3QgYm9vbCAqaXNudWxsLAoJCQkJCQkgICBFU3RhdGUgKmVzdGF0ZSwgYm9vbCBuZXdJbmRl eCkKewoJKHZvaWQpIGNoZWNrX2V4Y2x1c2lvbl9vcl91bmlxdWVfY29uc3RyYWludChoZWFw LCBpbmRleCwgaW5kZXhJbmZvLCB0dXBsZWlkLAoJCQkJCQkJCQkJCQl2YWx1ZXMsIGlzbnVs bCwKCQkJCQkJCQkJCQkJZXN0YXRlLCBuZXdJbmRleCwKCQkJCQkJCQkJCQkJQ0VPVUNfV0FJ VCwgZmFsc2UsIE5VTEwpOwp9CgovKgogKiBDaGVjayBleGlzdGluZyB0dXBsZSdzIGluZGV4 IHZhbHVlcyB0byBzZWUgaWYgaXQgcmVhbGx5IG1hdGNoZXMgdGhlCiAqIGV4Y2x1c2lvbiBj b25kaXRpb24gYWdhaW5zdCB0aGUgbmV3X3ZhbHVlcy4gIFJldHVybnMgdHJ1ZSBpZiBjb25m bGljdC4KICovCnN0YXRpYyBib29sCmluZGV4X3JlY2hlY2tfY29uc3RyYWludChSZWxhdGlv biBpbmRleCwgY29uc3QgT2lkICpjb25zdHJfcHJvY3MsCgkJCQkJCSBjb25zdCBEYXR1bSAq ZXhpc3RpbmdfdmFsdWVzLCBjb25zdCBib29sICpleGlzdGluZ19pc251bGwsCgkJCQkJCSBj b25zdCBEYXR1bSAqbmV3X3ZhbHVlcykKewoJaW50CQkJaW5kbmtleWF0dHMgPSBJbmRleFJl bGF0aW9uR2V0TnVtYmVyT2ZLZXlBdHRyaWJ1dGVzKGluZGV4KTsKCWludAkJCWk7CgoJZm9y IChpID0gMDsgaSA8IGluZG5rZXlhdHRzOyBpKyspCgl7CgkJLyogQXNzdW1lIHRoZSBleGNs dXNpb24gb3BlcmF0b3JzIGFyZSBzdHJpY3QgKi8KCQlpZiAoZXhpc3RpbmdfaXNudWxsW2ld KQoJCQlyZXR1cm4gZmFsc2U7CgoJCWlmICghRGF0dW1HZXRCb29sKE9pZEZ1bmN0aW9uQ2Fs bDJDb2xsKGNvbnN0cl9wcm9jc1tpXSwKCQkJCQkJCQkJCQkgICBpbmRleC0+cmRfaW5kY29s bGF0aW9uW2ldLAoJCQkJCQkJCQkJCSAgIGV4aXN0aW5nX3ZhbHVlc1tpXSwKCQkJCQkJCQkJ CQkgICBuZXdfdmFsdWVzW2ldKSkpCgkJCXJldHVybiBmYWxzZTsKCX0KCglyZXR1cm4gdHJ1 ZTsKfQoKLyoKICogQ2hlY2sgaWYgRXhlY0luc2VydEluZGV4VHVwbGVzKCkgc2hvdWxkIHBh c3MgaW5kZXhVbmNoYW5nZWQgaGludC4KICoKICogV2hlbiB0aGUgZXhlY3V0b3IgcGVyZm9y bXMgYW4gVVBEQVRFIHRoYXQgcmVxdWlyZXMgYSBuZXcgcm91bmQgb2YgaW5kZXgKICogdHVw bGVzLCBkZXRlcm1pbmUgaWYgd2Ugc2hvdWxkIHBhc3MgJ2luZGV4VW5jaGFuZ2VkJyA9IHRy dWUgaGludCBmb3Igb25lCiAqIHNpbmdsZSBpbmRleC4KICovCnN0YXRpYyBib29sCmluZGV4 X3VuY2hhbmdlZF9ieV91cGRhdGUoUmVzdWx0UmVsSW5mbyAqcmVzdWx0UmVsSW5mbywgRVN0 YXRlICplc3RhdGUsCgkJCQkJCSAgSW5kZXhJbmZvICppbmRleEluZm8sIFJlbGF0aW9uIGlu ZGV4UmVsYXRpb24pCnsKCUJpdG1hcHNldCAgKnVwZGF0ZWRDb2xzOwoJQml0bWFwc2V0ICAq ZXh0cmFVcGRhdGVkQ29sczsKCUJpdG1hcHNldCAgKmFsbFVwZGF0ZWRDb2xzOwoJYm9vbAkJ aGFzZXhwcmVzc2lvbiA9IGZhbHNlOwoJTGlzdAkgICAqaWR4RXhwcnM7CgoJLyoKCSAqIENo ZWNrIGNhY2hlIGZpcnN0CgkgKi8KCWlmIChpbmRleEluZm8tPmlpX0NoZWNrZWRVbmNoYW5n ZWQpCgkJcmV0dXJuIGluZGV4SW5mby0+aWlfSW5kZXhVbmNoYW5nZWQ7CglpbmRleEluZm8t PmlpX0NoZWNrZWRVbmNoYW5nZWQgPSB0cnVlOwoKCS8qCgkgKiBDaGVjayBmb3IgaW5kZXhl ZCBhdHRyaWJ1dGUgb3ZlcmxhcCB3aXRoIHVwZGF0ZWQgY29sdW1ucy4KCSAqCgkgKiBPbmx5 IGRvIHRoaXMgZm9yIGtleSBjb2x1bW5zLiAgQSBjaGFuZ2UgdG8gYSBub24ta2V5IGNvbHVt biB3aXRoaW4gYW4KCSAqIElOQ0xVREUgaW5kZXggc2hvdWxkIG5vdCBiZSBjb3VudGVkIGhl cmUuICBOb24ta2V5IGNvbHVtbiB2YWx1ZXMgYXJlCgkgKiBvcGFxdWUgcGF5bG9hZCBzdGF0 ZSB0byB0aGUgaW5kZXggQU0sIGEgbGl0dGxlIGxpa2UgYW4gZXh0cmEgdGFibGUgVElELgoJ ICoKCSAqIE5vdGUgdGhhdCByb3ctbGV2ZWwgQkVGT1JFIHRyaWdnZXJzIHdvbid0IGFmZmVj dCBvdXIgYmVoYXZpb3IsIHNpbmNlCgkgKiB0aGV5IGRvbid0IGFmZmVjdCB0aGUgdXBkYXRl ZENvbHMgYml0bWFwcyBnZW5lcmFsbHkuICBJdCBkb2Vzbid0IHNlZW0KCSAqIHdvcnRoIHRo ZSB0cm91YmxlIG9mIGNoZWNraW5nIHdoaWNoIGF0dHJpYnV0ZXMgd2VyZSBjaGFuZ2VkIGRp cmVjdGx5LgoJICovCgl1cGRhdGVkQ29scyA9IEV4ZWNHZXRVcGRhdGVkQ29scyhyZXN1bHRS ZWxJbmZvLCBlc3RhdGUpOwoJZXh0cmFVcGRhdGVkQ29scyA9IEV4ZWNHZXRFeHRyYVVwZGF0 ZWRDb2xzKHJlc3VsdFJlbEluZm8sIGVzdGF0ZSk7Cglmb3IgKGludCBhdHRyID0gMDsgYXR0 ciA8IGluZGV4SW5mby0+aWlfTnVtSW5kZXhLZXlBdHRyczsgYXR0cisrKQoJewoJCWludAkJ CWtleWNvbCA9IGluZGV4SW5mby0+aWlfSW5kZXhBdHRyTnVtYmVyc1thdHRyXTsKCgkJaWYg KGtleWNvbCA8PSAwKQoJCXsKCQkJLyoKCQkJICogU2tpcCBleHByZXNzaW9ucyBmb3Igbm93 LCBidXQgcmVtZW1iZXIgdG8gZGVhbCB3aXRoIHRoZW0gbGF0ZXIKCQkJICogb24KCQkJICov CgkJCWhhc2V4cHJlc3Npb24gPSB0cnVlOwoJCQljb250aW51ZTsKCQl9CgoJCWlmIChibXNf aXNfbWVtYmVyKGtleWNvbCAtIEZpcnN0TG93SW52YWxpZEhlYXBBdHRyaWJ1dGVOdW1iZXIs CgkJCQkJCSAgdXBkYXRlZENvbHMpIHx8CgkJCWJtc19pc19tZW1iZXIoa2V5Y29sIC0gRmly c3RMb3dJbnZhbGlkSGVhcEF0dHJpYnV0ZU51bWJlciwKCQkJCQkJICBleHRyYVVwZGF0ZWRD b2xzKSkKCQl7CgkJCS8qIENoYW5nZWQga2V5IGNvbHVtbiAtLSBkb24ndCBoaW50IGZvciB0 aGlzIGluZGV4ICovCgkJCWluZGV4SW5mby0+aWlfSW5kZXhVbmNoYW5nZWQgPSBmYWxzZTsK CQkJcmV0dXJuIGZhbHNlOwoJCX0KCX0KCgkvKgoJICogV2hlbiB3ZSBnZXQgdGhpcyBmYXIg YW5kIGluZGV4IGhhcyBubyBleHByZXNzaW9ucywgcmV0dXJuIHRydWUgc28gdGhhdAoJICog aW5kZXhfaW5zZXJ0KCkgY2FsbCB3aWxsIGdvIG9uIHRvIHBhc3MgJ2luZGV4VW5jaGFuZ2Vk JyA9IHRydWUgaGludC4KCSAqCgkgKiBUaGUgX2Fic2VuY2VfIG9mIGFuIGluZGV4ZWQga2V5 IGF0dHJpYnV0ZSB0aGF0IG92ZXJsYXBzIHdpdGggdXBkYXRlZAoJICogYXR0cmlidXRlcyAo aW4gYWRkaXRpb24gdG8gdGhlIHRvdGFsIGFic2VuY2Ugb2YgaW5kZXhlZCBleHByZXNzaW9u cykKCSAqIHNob3dzIHRoYXQgdGhlIGluZGV4IGFzIGEgd2hvbGUgaXMgbG9naWNhbGx5IHVu Y2hhbmdlZCBieSBVUERBVEUuCgkgKi8KCWlmICghaGFzZXhwcmVzc2lvbikKCXsKCQlpbmRl eEluZm8tPmlpX0luZGV4VW5jaGFuZ2VkID0gdHJ1ZTsKCQlyZXR1cm4gdHJ1ZTsKCX0KCgkv KgoJICogTmVlZCB0byBwYXNzIG9ubHkgb25lIGJtcyB0byBleHByZXNzaW9uX3RyZWVfd2Fs a2VyIGhlbHBlciBmdW5jdGlvbi4KCSAqIEF2b2lkIGFsbG9jYXRpbmcgbWVtb3J5IGluIGNv bW1vbiBjYXNlIHdoZXJlIHRoZXJlIGFyZSBubyBleHRyYSBjb2xzLgoJICovCglpZiAoIWV4 dHJhVXBkYXRlZENvbHMpCgkJYWxsVXBkYXRlZENvbHMgPSB1cGRhdGVkQ29sczsKCWVsc2UK CQlhbGxVcGRhdGVkQ29scyA9IGJtc191bmlvbih1cGRhdGVkQ29scywgZXh0cmFVcGRhdGVk Q29scyk7CgoJLyoKCSAqIFdlIGhhdmUgdG8gd29yayBzbGlnaHRseSBoYXJkZXIgaW4gdGhl IGV2ZW50IG9mIGluZGV4ZWQgZXhwcmVzc2lvbnMsCgkgKiBidXQgdGhlIHByaW5jaXBsZSBp cyB0aGUgc2FtZSBhcyBiZWZvcmU6IHRyeSB0byBmaW5kIGNvbHVtbnMgKFZhcnMsCgkgKiBh Y3R1YWxseSkgdGhhdCBvdmVybGFwIHdpdGgga25vd24tdXBkYXRlZCBjb2x1bW5zLgoJICoK CSAqIElmIHdlIGZpbmQgYW55IG1hdGNoaW5nIFZhcnMsIGRvbid0IHBhc3MgaGludCBmb3Ig aW5kZXguICBPdGhlcndpc2UKCSAqIHBhc3MgaGludC4KCSAqLwoJaWR4RXhwcnMgPSBSZWxh dGlvbkdldEluZGV4RXhwcmVzc2lvbnMoaW5kZXhSZWxhdGlvbik7CglpZHhFeHBycyA9IGxp c3RfY29uY2F0KGlkeEV4cHJzLCBSZWxhdGlvbkdldEluZGV4RXhwcmVzc2lvbnNFeHBhbmQo aW5kZXhSZWxhdGlvbikpOwoJaGFzZXhwcmVzc2lvbiA9IGluZGV4X2V4cHJlc3Npb25fY2hh bmdlZF93YWxrZXIoKE5vZGUgKikgaWR4RXhwcnMsCgkJCQkJCQkJCQkJCQlhbGxVcGRhdGVk Q29scyk7CglsaXN0X2ZyZWUoaWR4RXhwcnMpOwoJaWYgKGV4dHJhVXBkYXRlZENvbHMpCgkJ Ym1zX2ZyZWUoYWxsVXBkYXRlZENvbHMpOwoKCWlmIChoYXNleHByZXNzaW9uKQoJewoJCWlu ZGV4SW5mby0+aWlfSW5kZXhVbmNoYW5nZWQgPSBmYWxzZTsKCQlyZXR1cm4gZmFsc2U7Cgl9 CgoJLyoKCSAqIERlbGliZXJhdGVseSBkb24ndCBjb25zaWRlciBpbmRleCBwcmVkaWNhdGVz LiAgV2Ugc2hvdWxkIGV2ZW4gZ2l2ZSB0aGUKCSAqIGhpbnQgd2hlbiByZXN1bHQgcmVsJ3Mg InVwZGF0ZWQgdHVwbGUiIGhhcyBubyBjb3JyZXNwb25kaW5nIGluZGV4CgkgKiB0dXBsZSwg d2hpY2ggaXMgcG9zc2libGUgd2l0aCBhIHBhcnRpYWwgaW5kZXggKHByb3ZpZGVkIHRoZSB1 c3VhbAoJICogY29uZGl0aW9ucyBhcmUgbWV0KS4KCSAqLwoJaW5kZXhJbmZvLT5paV9JbmRl eFVuY2hhbmdlZCA9IHRydWU7CglyZXR1cm4gdHJ1ZTsKfQoKLyoKICogSW5kZXhlZCBleHBy ZXNzaW9uIGhlbHBlciBmb3IgaW5kZXhfdW5jaGFuZ2VkX2J5X3VwZGF0ZSgpLgogKgogKiBS ZXR1cm5zIHRydWUgd2hlbiBWYXIgdGhhdCBhcHBlYXJzIHdpdGhpbiBhbGxVcGRhdGVkQ29s cyBsb2NhdGVkLgogKi8Kc3RhdGljIGJvb2wKaW5kZXhfZXhwcmVzc2lvbl9jaGFuZ2VkX3dh bGtlcihOb2RlICpub2RlLCBCaXRtYXBzZXQgKmFsbFVwZGF0ZWRDb2xzKQp7CglpZiAobm9k ZSA9PSBOVUxMKQoJCXJldHVybiBmYWxzZTsKCglpZiAoSXNBKG5vZGUsIFZhcikpCgl7CgkJ VmFyCQkgICAqdmFyID0gKFZhciAqKSBub2RlOwoKCQlpZiAoYm1zX2lzX21lbWJlcih2YXIt PnZhcmF0dG5vIC0gRmlyc3RMb3dJbnZhbGlkSGVhcEF0dHJpYnV0ZU51bWJlciwKCQkJCQkJ ICBhbGxVcGRhdGVkQ29scykpCgkJewoJCQkvKiBWYXIgd2FzIHVwZGF0ZWQgLS0gaW5kaWNh dGVzIHRoYXQgd2Ugc2hvdWxkIG5vdCBoaW50ICovCgkJCXJldHVybiB0cnVlOwoJCX0KCgkJ LyogU3RpbGwgaGF2ZW4ndCBmb3VuZCBhIHJlYXNvbiB0byBub3QgcGFzcyB0aGUgaGludCAq LwoJCXJldHVybiBmYWxzZTsKCX0KCglyZXR1cm4gZXhwcmVzc2lvbl90cmVlX3dhbGtlcihu b2RlLCBpbmRleF9leHByZXNzaW9uX2NoYW5nZWRfd2Fsa2VyLAoJCQkJCQkJCSAgYWxsVXBk YXRlZENvbHMpOwp9CgovKgogKiBFeGVjV2l0aG91dE92ZXJsYXBzTm90RW1wdHkgLSByYWlz ZSBhbiBlcnJvciBpZiB0aGUgdHVwbGUgaGFzIGFuIGVtcHR5CiAqIHJhbmdlIG9yIG11bHRp cmFuZ2UgaW4gdGhlIGdpdmVuIGF0dHJpYnV0ZS4KICovCnN0YXRpYyB2b2lkCkV4ZWNXaXRo b3V0T3ZlcmxhcHNOb3RFbXB0eShSZWxhdGlvbiByZWwsIE5hbWVEYXRhIGF0dG5hbWUsIERh dHVtIGF0dHZhbCwgY2hhciB0eXB0eXBlLCBPaWQgYXR0dHlwaWQpCnsKCWJvb2wJCWlzZW1w dHk7CglSYW5nZVR5cGUgICpyOwoJTXVsdGlyYW5nZVR5cGUgKm1yOwoKCXN3aXRjaCAodHlw dHlwZSkKCXsKCQljYXNlIFRZUFRZUEVfUkFOR0U6CgkJCXIgPSBEYXR1bUdldFJhbmdlVHlw ZVAoYXR0dmFsKTsKCQkJaXNlbXB0eSA9IFJhbmdlSXNFbXB0eShyKTsKCQkJYnJlYWs7CgkJ Y2FzZSBUWVBUWVBFX01VTFRJUkFOR0U6CgkJCW1yID0gRGF0dW1HZXRNdWx0aXJhbmdlVHlw ZVAoYXR0dmFsKTsKCQkJaXNlbXB0eSA9IE11bHRpcmFuZ2VJc0VtcHR5KG1yKTsKCQkJYnJl YWs7CgkJZGVmYXVsdDoKCQkJZWxvZyhFUlJPUiwgIldJVEhPVVQgT1ZFUkxBUFMgY29sdW1u IFwiJXNcIiBpcyBub3QgYSByYW5nZSBvciBtdWx0aXJhbmdlIiwKCQkJCSBOYW1lU3RyKGF0 dG5hbWUpKTsKCX0KCgkvKiBSZXBvcnQgYSBDSEVDS19WSU9MQVRJT04gKi8KCWlmIChpc2Vt cHR5KQoJCWVyZXBvcnQoRVJST1IsCgkJCQkoZXJyY29kZShFUlJDT0RFX0NIRUNLX1ZJT0xB VElPTiksCgkJCQkgZXJybXNnKCJlbXB0eSBXSVRIT1VUIE9WRVJMQVBTIHZhbHVlIGZvdW5k IGluIGNvbHVtbiBcIiVzXCIgaW4gcmVsYXRpb24gXCIlc1wiIiwKCQkJCQkJTmFtZVN0cihh dHRuYW1lKSwgUmVsYXRpb25HZXRSZWxhdGlvbk5hbWUocmVsKSkpKTsKfQoAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAuL2V4ZWNub2Rlcy5oAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDAwMDY2NAAwMDAxNzUwADAwMDE3NTAA MDAwMDAzMTQ1NjcAMTUyMjE2MDM3NTAAMDEyMDU0ACAwAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHVzdGFyICAAeG1hbgAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAB4bWFuAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogKgogKiBleGVjbm9kZXMuaAogKgkg IGRlZmluaXRpb25zIGZvciBleGVjdXRvciBzdGF0ZSBub2RlcwogKgogKiBNb3N0IHBsYW4g bm9kZSB0eXBlcyBkZWNsYXJlZCBpbiBwbGFubm9kZXMuaCBoYXZlIGEgY29ycmVzcG9uZGlu ZwogKiBleGVjdXRpb24tc3RhdGUgbm9kZSB0eXBlIGRlY2xhcmVkIGhlcmUuICBBbiBleGNl cHRpb24gaXMgdGhhdAogKiBleHByZXNzaW9uIG5vZGVzIChzdWJ0eXBlcyBvZiBFeHByKSBh cmUgdXN1YWxseSByZXByZXNlbnRlZCBieSBzdGVwcwogKiBvZiBhbiBFeHByU3RhdGUsIGFu ZCBmdWxseSBoYW5kbGVkIHdpdGhpbiBleGVjRXhwciogLSBidXQgc29tZXRpbWVzCiAqIHRo ZWlyIHN0YXRlIG5lZWRzIHRvIGJlIHNoYXJlZCB3aXRoIG90aGVyIHBhcnRzIG9mIHRoZSBl eGVjdXRvciwgYXMKICogZm9yIGV4YW1wbGUgd2l0aCBTdWJQbGFuU3RhdGUsIHdoaWNoIG5v ZGVTdWJwbGFuLmMgaGFzIHRvIG1vZGlmeS4KICoKICogTm9kZSB0eXBlcyBkZWNsYXJlZCBp biB0aGlzIGZpbGUgZG8gbm90IGhhdmUgYW55IGNvcHkvZXF1YWwvb3V0L3JlYWQKICogc3Vw cG9ydC4gIChUaGF0IGlzIGN1cnJlbnRseSBoYXJkLXdpcmVkIGluIGdlbl9ub2RlX3N1cHBv cnQucGwsIHJhdGhlcgogKiB0aGFuIGJlaW5nIGV4cGxpY2l0bHkgcmVwcmVzZW50ZWQgYnkg cGdfbm9kZV9hdHRyIGRlY29yYXRpb25zIGhlcmUuKQogKiBUaGVyZSBpcyBubyBuZWVkIGZv ciBjb3B5LCBlcXVhbCwgb3IgcmVhZCBzdXBwb3J0IGZvciBleGVjdXRvciB0cmVlcy4KICog T3V0cHV0IHN1cHBvcnQgY291bGQgYmUgdXNlZnVsIGZvciBkZWJ1Z2dpbmc7IGJ1dCB0aGVy ZSBhcmUgYSBsb3Qgb2YKICogc3BlY2lhbGl6ZWQgZmllbGRzIHRoYXQgd291bGQgcmVxdWly ZSBjdXN0b20gY29kZSwgc28gZm9yIG5vdyBpdCdzCiAqIG5vdCBwcm92aWRlZC4KICoKICoK ICogUG9ydGlvbnMgQ29weXJpZ2h0IChjKSAxOTk2LTIwMjYsIFBvc3RncmVTUUwgR2xvYmFs IERldmVsb3BtZW50IEdyb3VwCiAqIFBvcnRpb25zIENvcHlyaWdodCAoYykgMTk5NCwgUmVn ZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhCiAqCiAqIHNyYy9pbmNsdWRl L25vZGVzL2V4ZWNub2Rlcy5oCiAqCiAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogKi8KI2lmbmRl ZiBFWEVDTk9ERVNfSAojZGVmaW5lIEVYRUNOT0RFU19ICgojaW5jbHVkZSAiYWNjZXNzL2h0 dXAuaCIKI2luY2x1ZGUgImV4ZWN1dG9yL2luc3RydW1lbnRfbm9kZS5oIgojaW5jbHVkZSAi Zm1nci5oIgojaW5jbHVkZSAibGliL2lsaXN0LmgiCiNpbmNsdWRlICJub2Rlcy9taXNjbm9k ZXMuaCIKI2luY2x1ZGUgIm5vZGVzL3BhcmFtcy5oIgojaW5jbHVkZSAibm9kZXMvcGxhbm5v ZGVzLmgiCiNpbmNsdWRlICJwYXJ0aXRpb25pbmcvcGFydGRlZnMuaCIKI2luY2x1ZGUgInN0 b3JhZ2UvYnVmLmgiCiNpbmNsdWRlICJ1dGlscy9yZWx0cmlnZ2VyLmgiCiNpbmNsdWRlICJ1 dGlscy90eXBjYWNoZS5oIgoKCi8qCiAqIGZvcndhcmQgcmVmZXJlbmNlcyBpbiB0aGlzIGZp bGUKICovCnR5cGVkZWYgc3RydWN0IEJ1ZmZlclVzYWdlIEJ1ZmZlclVzYWdlOwp0eXBlZGVm IHN0cnVjdCBFeGVjUm93TWFyayBFeGVjUm93TWFyazsKdHlwZWRlZiBzdHJ1Y3QgRXhwclN0 YXRlIEV4cHJTdGF0ZTsKdHlwZWRlZiBzdHJ1Y3QgRXhwckNvbnRleHQgRXhwckNvbnRleHQ7 CnR5cGVkZWYgc3RydWN0IEhUQUIgSFRBQjsKdHlwZWRlZiBzdHJ1Y3QgSW5zdHJ1bWVudGF0 aW9uIEluc3RydW1lbnRhdGlvbjsKdHlwZWRlZiBzdHJ1Y3QgcGFpcmluZ2hlYXAgcGFpcmlu Z2hlYXA7CnR5cGVkZWYgc3RydWN0IFBsYW5TdGF0ZSBQbGFuU3RhdGU7CnR5cGVkZWYgc3Ry dWN0IFF1ZXJ5RW52aXJvbm1lbnQgUXVlcnlFbnZpcm9ubWVudDsKdHlwZWRlZiBzdHJ1Y3Qg UmVsYXRpb25EYXRhICpSZWxhdGlvbjsKdHlwZWRlZiBSZWxhdGlvbiAqUmVsYXRpb25QdHI7 CnR5cGVkZWYgc3RydWN0IFNjYW5LZXlEYXRhIFNjYW5LZXlEYXRhOwp0eXBlZGVmIHN0cnVj dCBTbmFwc2hvdERhdGEgKlNuYXBzaG90Owp0eXBlZGVmIHN0cnVjdCBTb3J0U3VwcG9ydERh dGEgKlNvcnRTdXBwb3J0Owp0eXBlZGVmIHN0cnVjdCBUSURCaXRtYXAgVElEQml0bWFwOwp0 eXBlZGVmIHN0cnVjdCBOb2RlSW5zdHJ1bWVudGF0aW9uIE5vZGVJbnN0cnVtZW50YXRpb247 CnR5cGVkZWYgc3RydWN0IFRyaWdnZXJJbnN0cnVtZW50YXRpb24gVHJpZ2dlckluc3RydW1l bnRhdGlvbjsKdHlwZWRlZiBzdHJ1Y3QgVHVwbGVDb252ZXJzaW9uTWFwIFR1cGxlQ29udmVy c2lvbk1hcDsKdHlwZWRlZiBzdHJ1Y3QgVHVwbGVEZXNjRGF0YSAqVHVwbGVEZXNjOwp0eXBl ZGVmIHN0cnVjdCBUdXBsZXNvcnRzdGF0ZSBUdXBsZXNvcnRzdGF0ZTsKdHlwZWRlZiBzdHJ1 Y3QgVHVwbGVzdG9yZXN0YXRlIFR1cGxlc3RvcmVzdGF0ZTsKdHlwZWRlZiBzdHJ1Y3QgVHVw bGVUYWJsZVNsb3QgVHVwbGVUYWJsZVNsb3Q7CnR5cGVkZWYgc3RydWN0IFR1cGxlVGFibGVT bG90T3BzIFR1cGxlVGFibGVTbG90T3BzOwp0eXBlZGVmIHN0cnVjdCBXYWxVc2FnZSBXYWxV c2FnZTsKdHlwZWRlZiBzdHJ1Y3QgV29ya2VyTm9kZUluc3RydW1lbnRhdGlvbiBXb3JrZXJO b2RlSW5zdHJ1bWVudGF0aW9uOwoKCi8qIC0tLS0tLS0tLS0tLS0tLS0KICoJCUV4cHJTdGF0 ZSBub2RlCiAqCiAqIEV4cHJTdGF0ZSByZXByZXNlbnRzIHRoZSBldmFsdWF0aW9uIHN0YXRl IGZvciBhIHdob2xlIGV4cHJlc3Npb24gdHJlZS4KICogSXQgY29udGFpbnMgaW5zdHJ1Y3Rp b25zIChpbiAtPnN0ZXBzKSB0byBldmFsdWF0ZSB0aGUgZXhwcmVzc2lvbi4KICogLS0tLS0t LS0tLS0tLS0tLQogKi8KdHlwZWRlZiBEYXR1bSAoKkV4cHJTdGF0ZUV2YWxGdW5jKSAoRXhw clN0YXRlICpleHByZXNzaW9uLAoJCQkJCQkJCQlFeHByQ29udGV4dCAqZWNvbnRleHQsCgkJ CQkJCQkJCWJvb2wgKmlzTnVsbCk7CgovKiBCaXRzIGluIEV4cHJTdGF0ZS0+ZmxhZ3MgKHNl ZSBhbHNvIGV4ZWNFeHByLmggZm9yIHByaXZhdGUgZmxhZyBiaXRzKTogKi8KLyogZXhwcmVz c2lvbiBpcyBmb3IgdXNlIHdpdGggRXhlY1F1YWwoKSAqLwojZGVmaW5lIEVFT19GTEFHX0lT X1FVQUwJCQkJCSgxIDw8IDApCi8qIGV4cHJlc3Npb24gcmVmZXJzIHRvIE9MRCB0YWJsZSBj b2x1bW5zICovCiNkZWZpbmUgRUVPX0ZMQUdfSEFTX09MRAkJCQkJKDEgPDwgMSkKLyogZXhw cmVzc2lvbiByZWZlcnMgdG8gTkVXIHRhYmxlIGNvbHVtbnMgKi8KI2RlZmluZSBFRU9fRkxB R19IQVNfTkVXCQkJCQkoMSA8PCAyKQovKiBPTEQgdGFibGUgcm93IGlzIE5VTEwgaW4gUkVU VVJOSU5HIGxpc3QgKi8KI2RlZmluZSBFRU9fRkxBR19PTERfSVNfTlVMTAkJCQkoMSA8PCAz KQovKiBORVcgdGFibGUgcm93IGlzIE5VTEwgaW4gUkVUVVJOSU5HIGxpc3QgKi8KI2RlZmlu ZSBFRU9fRkxBR19ORVdfSVNfTlVMTAkJCQkoMSA8PCA0KQoKdHlwZWRlZiBzdHJ1Y3QgRXhw clN0YXRlCnsKCU5vZGVUYWcJCXR5cGU7CgojZGVmaW5lIEZJRUxETk9fRVhQUlNUQVRFX0ZM QUdTIDEKCXVpbnQ4CQlmbGFnczsJCQkvKiBiaXRtYXNrIG9mIEVFT19GTEFHXyogYml0cywg c2VlIGFib3ZlICovCgoJLyoKCSAqIFN0b3JhZ2UgZm9yIHJlc3VsdCB2YWx1ZSBvZiBhIHNj YWxhciBleHByZXNzaW9uLCBvciBmb3IgaW5kaXZpZHVhbAoJICogY29sdW1uIHJlc3VsdHMg d2l0aGluIGV4cHJlc3Npb25zIGJ1aWx0IGJ5IEV4ZWNCdWlsZFByb2plY3Rpb25JbmZvKCku CgkgKi8KI2RlZmluZSBGSUVMRE5PX0VYUFJTVEFURV9SRVNOVUxMIDIKCWJvb2wJCXJlc251 bGw7CiNkZWZpbmUgRklFTEROT19FWFBSU1RBVEVfUkVTVkFMVUUgMwoJRGF0dW0JCXJlc3Zh bHVlOwoKCS8qCgkgKiBJZiBwcm9qZWN0aW5nIGEgdHVwbGUgcmVzdWx0LCB0aGlzIHNsb3Qg aG9sZHMgdGhlIHJlc3VsdDsgZWxzZSBOVUxMLgoJICovCiNkZWZpbmUgRklFTEROT19FWFBS U1RBVEVfUkVTVUxUU0xPVCA0CglUdXBsZVRhYmxlU2xvdCAqcmVzdWx0c2xvdDsKCgkvKgoJ ICogSW5zdHJ1Y3Rpb25zIHRvIGNvbXB1dGUgZXhwcmVzc2lvbidzIHJldHVybiB2YWx1ZS4K CSAqLwoJc3RydWN0IEV4cHJFdmFsU3RlcCAqc3RlcHM7CgoJLyoKCSAqIEZ1bmN0aW9uIHRo YXQgYWN0dWFsbHkgZXZhbHVhdGVzIHRoZSBleHByZXNzaW9uLiAgVGhpcyBjYW4gYmUgc2V0 IHRvCgkgKiBkaWZmZXJlbnQgdmFsdWVzIGRlcGVuZGluZyBvbiB0aGUgY29tcGxleGl0eSBv ZiB0aGUgZXhwcmVzc2lvbi4KCSAqLwoJRXhwclN0YXRlRXZhbEZ1bmMgZXZhbGZ1bmM7CgoJ Lyogb3JpZ2luYWwgZXhwcmVzc2lvbiB0cmVlLCBmb3IgZGVidWdnaW5nIG9ubHkgKi8KCUV4 cHIJICAgKmV4cHI7CgoJLyogcHJpdmF0ZSBzdGF0ZSBmb3IgYW4gZXZhbGZ1bmMgKi8KCXZv aWQJICAgKmV2YWxmdW5jX3ByaXZhdGU7CgoJLyoKCSAqIFhYWDogZm9sbG93aW5nIGZpZWxk cyBvbmx5IG5lZWRlZCBkdXJpbmcgImNvbXBpbGF0aW9uIiAoRXhlY0luaXRFeHByKTsKCSAq IGNvdWxkIGJlIHRocm93biBhd2F5IGFmdGVyd2FyZHMuCgkgKi8KCglpbnQJCQlzdGVwc19s ZW47CQkvKiBudW1iZXIgb2Ygc3RlcHMgY3VycmVudGx5ICovCglpbnQJCQlzdGVwc19hbGxv YzsJLyogYWxsb2NhdGVkIGxlbmd0aCBvZiBzdGVwcyBhcnJheSAqLwoKI2RlZmluZSBGSUVM RE5PX0VYUFJTVEFURV9QQVJFTlQgMTEKCVBsYW5TdGF0ZSAgKnBhcmVudDsJCQkvKiBwYXJl bnQgUGxhblN0YXRlIG5vZGUsIGlmIGFueSAqLwoJUGFyYW1MaXN0SW5mbyBleHRfcGFyYW1z OwkvKiBmb3IgY29tcGlsaW5nIFBBUkFNX0VYVEVSTiBub2RlcyAqLwoKCURhdHVtCSAgICpp bm5lcm1vc3RfY2FzZXZhbDsKCWJvb2wJICAgKmlubmVybW9zdF9jYXNlbnVsbDsKCglEYXR1 bQkgICAqaW5uZXJtb3N0X2RvbWFpbnZhbDsKCWJvb2wJICAgKmlubmVybW9zdF9kb21haW5u dWxsOwoKCS8qCgkgKiBGb3IgZXhwcmVzc2lvbiBub2RlcyB0aGF0IHN1cHBvcnQgc29mdCBl cnJvcnMuIFNob3VsZCBiZSBzZXQgdG8gTlVMTCBpZgoJICogdGhlIGNhbGxlciB3YW50cyBl cnJvcnMgdG8gYmUgdGhyb3duLiBDYWxsZXJzIHRoYXQgZG8gbm90IHdhbnQgZXJyb3JzCgkg KiB0aHJvd24gc2hvdWxkIHNldCBpdCB0byBhIHZhbGlkIEVycm9yU2F2ZUNvbnRleHQgYmVm b3JlIGNhbGxpbmcKCSAqIEV4ZWNJbml0RXhwclJlYygpLgoJICovCglFcnJvclNhdmVDb250 ZXh0ICplc2NvbnRleHQ7Cn0gRXhwclN0YXRlOwoKCi8qIC0tLS0tLS0tLS0tLS0tLS0KICoJ ICBJbmRleEluZm8gaW5mb3JtYXRpb24KICoKICoJCXRoaXMgc3RydWN0IGhvbGRzIHRoZSBp bmZvcm1hdGlvbiBuZWVkZWQgdG8gY29uc3RydWN0IG5ldyBpbmRleAogKgkJZW50cmllcyBm b3IgYSBwYXJ0aWN1bGFyIGluZGV4LiAgVXNlZCBmb3IgYm90aCBpbmRleF9idWlsZCBhbmQK ICoJCXJldGFpbCBjcmVhdGlvbiBvZiBpbmRleCBlbnRyaWVzLgogKgogKiBpaV9Db25jdXJy ZW50LCBpaV9Ccm9rZW5Ib3RDaGFpbiwgYW5kIGlpX1BhcmFsbGVsV29ya2VycyBhcmUgdXNl ZCBvbmx5CiAqIGR1cmluZyBpbmRleCBidWlsZDsgdGhleSdyZSBjb252ZW50aW9uYWxseSB6 ZXJvZWQgb3RoZXJ3aXNlLgogKiAtLS0tLS0tLS0tLS0tLS0tCiAqLwp0eXBlZGVmIHN0cnVj dCBJbmRleEluZm8KewoJTm9kZVRhZwkJdHlwZTsKCgkvKiB0b3RhbCBudW1iZXIgb2YgY29s dW1ucyBpbiBpbmRleCAqLwoJaW50CQkJaWlfTnVtSW5kZXhBdHRyczsKCS8qIG51bWJlciBv ZiBrZXkgY29sdW1ucyBpbiBpbmRleCAqLwoJaW50CQkJaWlfTnVtSW5kZXhLZXlBdHRyczsK CgkvKgoJICogVW5kZXJseWluZy1yZWwgYXR0cmlidXRlIG51bWJlcnMgdXNlZCBhcyBrZXlz ICh6ZXJvZXMgaW5kaWNhdGUKCSAqIGV4cHJlc3Npb25zKS4gSXQgYWxzbyBjb250YWlucyBp bmZvIGFib3V0IGluY2x1ZGVkIGNvbHVtbnMuCgkgKi8KCUF0dHJOdW1iZXIJaWlfSW5kZXhB dHRyTnVtYmVyc1tJTkRFWF9NQVhfS0VZU107CgoJLyogZXhwciB0cmVlcyBmb3IgZXhwcmVz c2lvbiBlbnRyaWVzLCBvciBOSUwgaWYgbm9uZSAqLwoJTGlzdAkgICAqaWlfRXhwcmVzc2lv bnM7IC8qIGxpc3Qgb2YgRXhwciAqLwoJTGlzdAkgICAqaWlfRXhwcmVzc2lvbnNFeHBhbmQ7 IAkvKiBsaXN0IG9mIEV4cHIgKi8KCS8qIGV4ZWMgc3RhdGUgZm9yIGV4cHJlc3Npb25zLCBv ciBOSUwgaWYgbm9uZSAqLwoJTGlzdAkgICAqaWlfRXhwcmVzc2lvbnNTdGF0ZTsJLyogbGlz dCBvZiBFeHByU3RhdGUgKi8KCUxpc3QJICAgKmlpX0V4cHJlc3Npb25zRXhwYW5kU3RhdGU7 CS8qIGxpc3Qgb2YgRXhwclN0YXRlICovCgoJLyogcGFydGlhbC1pbmRleCBwcmVkaWNhdGUs IG9yIE5JTCBpZiBub25lICovCglMaXN0CSAgICppaV9QcmVkaWNhdGU7CS8qIGxpc3Qgb2Yg RXhwciAqLwoJTGlzdAkgICAqaWlfUHJlZGljYXRlRXhwYW5kOwkJLyogbGlzdCBvZiBFeHBy ICovCgkvKiBleGVjIHN0YXRlIGZvciBleHByZXNzaW9ucywgb3IgTklMIGlmIG5vbmUgKi8K CUV4cHJTdGF0ZSAgKmlpX1ByZWRpY2F0ZVN0YXRlOwoJRXhwclN0YXRlICAqaWlfUHJlZGlj YXRlRXhwYW5kU3RhdGU7CgoJLyogUGVyLWNvbHVtbiBleGNsdXNpb24gb3BlcmF0b3JzLCBv ciBOVUxMIGlmIG5vbmUgKi8KCU9pZAkJICAgKmlpX0V4Y2x1c2lvbk9wczsJLyogYXJyYXkg d2l0aCBvbmUgZW50cnkgcGVyIGNvbHVtbiAqLwoJLyogVW5kZXJseWluZyBmdW5jdGlvbiBP SURzIGZvciBFeGNsdXNpb25PcHMgKi8KCU9pZAkJICAgKmlpX0V4Y2x1c2lvblByb2NzOwkv KiBhcnJheSB3aXRoIG9uZSBlbnRyeSBwZXIgY29sdW1uICovCgkvKiBPcGNsYXNzIHN0cmF0 ZWd5IG51bWJlcnMgZm9yIEV4Y2x1c2lvbk9wcyAqLwoJdWludDE2CSAgICppaV9FeGNsdXNp b25TdHJhdHM7IC8qIGFycmF5IHdpdGggb25lIGVudHJ5IHBlciBjb2x1bW4gKi8KCgkvKiBU aGVzZSBhcmUgbGlrZSBFeGNsdXNpb24qLCBidXQgZm9yIHVuaXF1ZSBpbmRleGVzICovCglP aWQJCSAgICppaV9VbmlxdWVPcHM7CS8qIGFycmF5IHdpdGggb25lIGVudHJ5IHBlciBjb2x1 bW4gKi8KCU9pZAkJICAgKmlpX1VuaXF1ZVByb2NzOyAvKiBhcnJheSB3aXRoIG9uZSBlbnRy eSBwZXIgY29sdW1uICovCgl1aW50MTYJICAgKmlpX1VuaXF1ZVN0cmF0czsJLyogYXJyYXkg d2l0aCBvbmUgZW50cnkgcGVyIGNvbHVtbiAqLwoKCS8qIGlzIGl0IGEgdW5pcXVlIGluZGV4 PyAqLwoJYm9vbAkJaWlfVW5pcXVlOwoJLyogaXMgTlVMTFMgTk9UIERJU1RJTkNUPyAqLwoJ Ym9vbAkJaWlfTnVsbHNOb3REaXN0aW5jdDsKCS8qIGlzIGl0IHZhbGlkIGZvciBpbnNlcnRz PyAqLwoJYm9vbAkJaWlfUmVhZHlGb3JJbnNlcnRzOwoJLyogSW5kZXhVbmNoYW5nZWQgc3Rh dHVzIGRldGVybWluZWQgeWV0PyAqLwoJYm9vbAkJaWlfQ2hlY2tlZFVuY2hhbmdlZDsKCS8q IGFtaW5zZXJ0IGhpbnQsIGNhY2hlZCBmb3IgcmV0YWlsIGluc2VydHMgKi8KCWJvb2wJCWlp X0luZGV4VW5jaGFuZ2VkOwoJLyogYXJlIHdlIGRvaW5nIGEgY29uY3VycmVudCBpbmRleCBi dWlsZD8gKi8KCWJvb2wJCWlpX0NvbmN1cnJlbnQ7CgkvKiBkaWQgd2UgZGV0ZWN0IGFueSBi cm9rZW4gSE9UIGNoYWlucz8gKi8KCWJvb2wJCWlpX0Jyb2tlbkhvdENoYWluOwoJLyogaXMg aXQgYSBzdW1tYXJpemluZyBpbmRleD8gKi8KCWJvb2wJCWlpX1N1bW1hcml6aW5nOwoJLyog aXMgaXQgYSBXSVRIT1VUIE9WRVJMQVBTIGluZGV4PyAqLwoJYm9vbAkJaWlfV2l0aG91dE92 ZXJsYXBzOwoJLyogIyBvZiB3b3JrZXJzIHJlcXVlc3RlZCAoZXhjbHVkZXMgbGVhZGVyKSAq LwoJaW50CQkJaWlfUGFyYWxsZWxXb3JrZXJzOwoKCS8qIE9pZCBvZiBpbmRleCBBTSAqLwoJ T2lkCQkJaWlfQW07CgkvKiBwcml2YXRlIGNhY2hlIGFyZWEgZm9yIGluZGV4IEFNICovCgl2 b2lkCSAgICppaV9BbUNhY2hlOwoKCS8qIG1lbW9yeSBjb250ZXh0IGhvbGRpbmcgdGhpcyBJ bmRleEluZm8gKi8KCU1lbW9yeUNvbnRleHQgaWlfQ29udGV4dDsKfSBJbmRleEluZm87Cgov KiAtLS0tLS0tLS0tLS0tLS0tCiAqCSAgRXhwckNvbnRleHRfQ0IKICoKICoJCUxpc3Qgb2Yg Y2FsbGJhY2tzIHRvIGJlIGNhbGxlZCBhdCBFeHByQ29udGV4dCBzaHV0ZG93bi4KICogLS0t LS0tLS0tLS0tLS0tLQogKi8KdHlwZWRlZiB2b2lkICgqRXhwckNvbnRleHRDYWxsYmFja0Z1 bmN0aW9uKSAoRGF0dW0gYXJnKTsKCnR5cGVkZWYgc3RydWN0IEV4cHJDb250ZXh0X0NCCnsK CXN0cnVjdCBFeHByQ29udGV4dF9DQiAqbmV4dDsKCUV4cHJDb250ZXh0Q2FsbGJhY2tGdW5j dGlvbiBmdW5jdGlvbjsKCURhdHVtCQlhcmc7Cn0gRXhwckNvbnRleHRfQ0I7CgovKiAtLS0t LS0tLS0tLS0tLS0tCiAqCSAgRXhwckNvbnRleHQKICoKICoJCVRoaXMgY2xhc3MgaG9sZHMg dGhlICJjdXJyZW50IGNvbnRleHQiIGluZm9ybWF0aW9uCiAqCQluZWVkZWQgdG8gZXZhbHVh dGUgZXhwcmVzc2lvbnMgZm9yIGRvaW5nIHR1cGxlIHF1YWxpZmljYXRpb25zCiAqCQlhbmQg dHVwbGUgcHJvamVjdGlvbnMuICBGb3IgZXhhbXBsZSwgaWYgYW4gZXhwcmVzc2lvbiByZWZl cnMKICoJCXRvIGFuIGF0dHJpYnV0ZSBpbiB0aGUgY3VycmVudCBpbm5lciB0dXBsZSB0aGVu IHdlIG5lZWQgdG8ga25vdwogKgkJd2hhdCB0aGUgY3VycmVudCBpbm5lciB0dXBsZSBpcyBh bmQgc28gd2UgbG9vayBhdCB0aGUgZXhwcmVzc2lvbgogKgkJY29udGV4dC4KICoKICoJVGhl cmUgYXJlIHR3byBtZW1vcnkgY29udGV4dHMgYXNzb2NpYXRlZCB3aXRoIGFuIEV4cHJDb250 ZXh0OgogKgkqIGVjeHRfcGVyX3F1ZXJ5X21lbW9yeSBpcyBhIHF1ZXJ5LWxpZmVzcGFuIGNv bnRleHQsIHR5cGljYWxseSB0aGUgc2FtZQogKgkgIGNvbnRleHQgdGhlIEV4cHJDb250ZXh0 IG5vZGUgaXRzZWxmIGlzIGFsbG9jYXRlZCBpbi4gIFRoaXMgY29udGV4dAogKgkgIGNhbiBi ZSB1c2VkIGZvciBwdXJwb3NlcyBzdWNoIGFzIHN0b3JpbmcgZnVuY3Rpb24gY2FsbCBjYWNo ZSBpbmZvLgogKgkqIGVjeHRfcGVyX3R1cGxlX21lbW9yeSBpcyBhIHNob3J0LXRlcm0gY29u dGV4dCBmb3IgZXhwcmVzc2lvbiByZXN1bHRzLgogKgkgIEFzIHRoZSBuYW1lIHN1Z2dlc3Rz LCBpdCB3aWxsIHR5cGljYWxseSBiZSByZXNldCBvbmNlIHBlciB0dXBsZSwKICoJICBiZWZv cmUgd2UgYmVnaW4gdG8gZXZhbHVhdGUgZXhwcmVzc2lvbnMgZm9yIHRoYXQgdHVwbGUuICBF YWNoCiAqCSAgRXhwckNvbnRleHQgbm9ybWFsbHkgaGFzIGl0cyB2ZXJ5IG93biBwZXItdHVw bGUgbWVtb3J5IGNvbnRleHQuCiAqCiAqCUN1cnJlbnRNZW1vcnlDb250ZXh0IHNob3VsZCBi ZSBzZXQgdG8gZWN4dF9wZXJfdHVwbGVfbWVtb3J5IGJlZm9yZQogKgljYWxsaW5nIEV4ZWNF dmFsRXhwcigpIC0tLSBzZWUgRXhlY0V2YWxFeHByU3dpdGNoQ29udGV4dCgpLgogKiAtLS0t LS0tLS0tLS0tLS0tCiAqLwp0eXBlZGVmIHN0cnVjdCBFeHByQ29udGV4dAp7CglOb2RlVGFn CQl0eXBlOwoKCS8qIFR1cGxlcyB0aGF0IFZhciBub2RlcyBpbiBleHByZXNzaW9uIG1heSBy ZWZlciB0byAqLwojZGVmaW5lIEZJRUxETk9fRVhQUkNPTlRFWFRfU0NBTlRVUExFIDEKCVR1 cGxlVGFibGVTbG90ICplY3h0X3NjYW50dXBsZTsKI2RlZmluZSBGSUVMRE5PX0VYUFJDT05U RVhUX0lOTkVSVFVQTEUgMgoJVHVwbGVUYWJsZVNsb3QgKmVjeHRfaW5uZXJ0dXBsZTsKI2Rl ZmluZSBGSUVMRE5PX0VYUFJDT05URVhUX09VVEVSVFVQTEUgMwoJVHVwbGVUYWJsZVNsb3Qg KmVjeHRfb3V0ZXJ0dXBsZTsKCgkvKiBNZW1vcnkgY29udGV4dHMgZm9yIGV4cHJlc3Npb24g ZXZhbHVhdGlvbiAtLS0gc2VlIG5vdGVzIGFib3ZlICovCglNZW1vcnlDb250ZXh0IGVjeHRf cGVyX3F1ZXJ5X21lbW9yeTsKCU1lbW9yeUNvbnRleHQgZWN4dF9wZXJfdHVwbGVfbWVtb3J5 OwoKCS8qIFZhbHVlcyB0byBzdWJzdGl0dXRlIGZvciBQYXJhbSBub2RlcyBpbiBleHByZXNz aW9uICovCglQYXJhbUV4ZWNEYXRhICplY3h0X3BhcmFtX2V4ZWNfdmFsczsJLyogZm9yIFBB UkFNX0VYRUMgcGFyYW1zICovCglQYXJhbUxpc3RJbmZvIGVjeHRfcGFyYW1fbGlzdF9pbmZv OyAvKiBmb3Igb3RoZXIgcGFyYW0gdHlwZXMgKi8KCgkvKgoJICogVmFsdWVzIHRvIHN1YnN0 aXR1dGUgZm9yIEFnZ3JlZiBub2RlcyBpbiB0aGUgZXhwcmVzc2lvbnMgb2YgYW4gQWdnCgkg KiBub2RlLCBvciBmb3IgV2luZG93RnVuYyBub2RlcyB3aXRoaW4gYSBXaW5kb3dBZ2cgbm9k ZS4KCSAqLwojZGVmaW5lIEZJRUxETk9fRVhQUkNPTlRFWFRfQUdHVkFMVUVTIDgKCURhdHVt CSAgICplY3h0X2FnZ3ZhbHVlczsgLyogcHJlY29tcHV0ZWQgdmFsdWVzIGZvciBhZ2dzL3dp bmRvd2Z1bmNzICovCiNkZWZpbmUgRklFTEROT19FWFBSQ09OVEVYVF9BR0dOVUxMUyA5Cgli b29sCSAgICplY3h0X2FnZ251bGxzOwkvKiBudWxsIGZsYWdzIGZvciBhZ2dzL3dpbmRvd2Z1 bmNzICovCgoJLyogVmFsdWUgdG8gc3Vic3RpdHV0ZSBmb3IgQ2FzZVRlc3RFeHByIG5vZGVz IGluIGV4cHJlc3Npb24gKi8KI2RlZmluZSBGSUVMRE5PX0VYUFJDT05URVhUX0NBU0VEQVRV TSAxMAoJRGF0dW0JCWNhc2VWYWx1ZV9kYXR1bTsKI2RlZmluZSBGSUVMRE5PX0VYUFJDT05U RVhUX0NBU0VOVUxMIDExCglib29sCQljYXNlVmFsdWVfaXNOdWxsOwoKCS8qIFZhbHVlIHRv IHN1YnN0aXR1dGUgZm9yIENvZXJjZVRvRG9tYWluVmFsdWUgbm9kZXMgaW4gZXhwcmVzc2lv biAqLwojZGVmaW5lIEZJRUxETk9fRVhQUkNPTlRFWFRfRE9NQUlOREFUVU0gMTIKCURhdHVt CQlkb21haW5WYWx1ZV9kYXR1bTsKI2RlZmluZSBGSUVMRE5PX0VYUFJDT05URVhUX0RPTUFJ Tk5VTEwgMTMKCWJvb2wJCWRvbWFpblZhbHVlX2lzTnVsbDsKCgkvKiBUdXBsZXMgdGhhdCBP TEQvTkVXIFZhciBub2RlcyBpbiBSRVRVUk5JTkcgbWF5IHJlZmVyIHRvICovCiNkZWZpbmUg RklFTEROT19FWFBSQ09OVEVYVF9PTERUVVBMRSAxNAoJVHVwbGVUYWJsZVNsb3QgKmVjeHRf b2xkdHVwbGU7CiNkZWZpbmUgRklFTEROT19FWFBSQ09OVEVYVF9ORVdUVVBMRSAxNQoJVHVw bGVUYWJsZVNsb3QgKmVjeHRfbmV3dHVwbGU7CgoJLyogTGluayB0byBjb250YWluaW5nIEVT dGF0ZSAoTlVMTCBpZiBhIHN0YW5kYWxvbmUgRXhwckNvbnRleHQpICovCglzdHJ1Y3QgRVN0 YXRlICplY3h0X2VzdGF0ZTsKCgkvKiBGdW5jdGlvbnMgdG8gY2FsbCBiYWNrIHdoZW4gRXhw ckNvbnRleHQgaXMgc2h1dCBkb3duIG9yIHJlc2Nhbm5lZCAqLwoJRXhwckNvbnRleHRfQ0Ig KmVjeHRfY2FsbGJhY2tzOwp9IEV4cHJDb250ZXh0OwoKLyoKICogU2V0LXJlc3VsdCBzdGF0 dXMgdXNlZCB3aGVuIGV2YWx1YXRpbmcgZnVuY3Rpb25zIHBvdGVudGlhbGx5IHJldHVybmlu ZyBhCiAqIHNldC4KICovCnR5cGVkZWYgZW51bQp7CglFeHByU2luZ2xlUmVzdWx0LAkJCS8q IGV4cHJlc3Npb24gZG9lcyBub3QgcmV0dXJuIGEgc2V0ICovCglFeHByTXVsdGlwbGVSZXN1 bHQsCQkJLyogdGhpcyByZXN1bHQgaXMgYW4gZWxlbWVudCBvZiBhIHNldCAqLwoJRXhwckVu ZFJlc3VsdCwJCQkJLyogdGhlcmUgYXJlIG5vIG1vcmUgZWxlbWVudHMgaW4gdGhlIHNldCAq Lwp9IEV4cHJEb25lQ29uZDsKCi8qCiAqIFJldHVybiBtb2RlcyBmb3IgZnVuY3Rpb25zIHJl dHVybmluZyBzZXRzLiAgTm90ZSB2YWx1ZXMgbXVzdCBiZSBjaG9zZW4KICogYXMgc2VwYXJh dGUgYml0cyBzbyB0aGF0IGEgYml0bWFzayBjYW4gYmUgZm9ybWVkIHRvIGluZGljYXRlIHN1 cHBvcnRlZAogKiBtb2Rlcy4gIFNGUk1fTWF0ZXJpYWxpemVfUmFuZG9tIGFuZCBTRlJNX01h dGVyaWFsaXplX1ByZWZlcnJlZCBhcmUKICogYXV4aWxpYXJ5IGZsYWdzIGFib3V0IFNGUk1f TWF0ZXJpYWxpemUgbW9kZSwgcmF0aGVyIHRoYW4gc2VwYXJhdGUgbW9kZXMuCiAqLwp0eXBl ZGVmIGVudW0KewoJU0ZSTV9WYWx1ZVBlckNhbGwgPSAweDAxLAkvKiBvbmUgdmFsdWUgcmV0 dXJuZWQgcGVyIGNhbGwgKi8KCVNGUk1fTWF0ZXJpYWxpemUgPSAweDAyLAkvKiByZXN1bHQg c2V0IGluc3RhbnRpYXRlZCBpbiBUdXBsZXN0b3JlICovCglTRlJNX01hdGVyaWFsaXplX1Jh bmRvbSA9IDB4MDQsIC8qIFR1cGxlc3RvcmUgbmVlZHMgcmFuZG9tQWNjZXNzICovCglTRlJN X01hdGVyaWFsaXplX1ByZWZlcnJlZCA9IDB4MDgsCS8qIGNhbGxlciBwcmVmZXJzIFR1cGxl c3RvcmUgKi8KfSBTZXRGdW5jdGlvblJldHVybk1vZGU7CgovKgogKiBXaGVuIGNhbGxpbmcg YSBmdW5jdGlvbiB0aGF0IG1pZ2h0IHJldHVybiBhIHNldCAobXVsdGlwbGUgcm93cyksCiAq IGEgbm9kZSBvZiB0aGlzIHR5cGUgaXMgcGFzc2VkIGFzIGZjaW5mby0+cmVzdWx0aW5mbyB0 byBhbGxvdwogKiByZXR1cm4gc3RhdHVzIHRvIGJlIHBhc3NlZCBiYWNrLiAgQSBmdW5jdGlv biByZXR1cm5pbmcgc2V0IHNob3VsZAogKiByYWlzZSBhbiBlcnJvciBpZiBubyBzdWNoIHJl c3VsdGluZm8gaXMgcHJvdmlkZWQuCiAqLwp0eXBlZGVmIHN0cnVjdCBSZXR1cm5TZXRJbmZv CnsKCU5vZGVUYWcJCXR5cGU7CgkvKiB2YWx1ZXMgc2V0IGJ5IGNhbGxlcjogKi8KCUV4cHJD b250ZXh0ICplY29udGV4dDsJCS8qIGNvbnRleHQgZnVuY3Rpb24gaXMgYmVpbmcgY2FsbGVk IGluICovCglUdXBsZURlc2MJZXhwZWN0ZWREZXNjOwkvKiB0dXBsZSBkZXNjcmlwdG9yIGV4 cGVjdGVkIGJ5IGNhbGxlciAqLwoJaW50CQkJYWxsb3dlZE1vZGVzOwkvKiBiaXRtYXNrOiBy ZXR1cm4gbW9kZXMgY2FsbGVyIGNhbiBoYW5kbGUgKi8KCS8qIHJlc3VsdCBzdGF0dXMgZnJv bSBmdW5jdGlvbiAoYnV0IHByZS1pbml0aWFsaXplZCBieSBjYWxsZXIpOiAqLwoJU2V0RnVu Y3Rpb25SZXR1cm5Nb2RlIHJldHVybk1vZGU7CS8qIGFjdHVhbCByZXR1cm4gbW9kZSAqLwoJ RXhwckRvbmVDb25kIGlzRG9uZTsJCS8qIHN0YXR1cyBmb3IgVmFsdWVQZXJDYWxsIG1vZGUg Ki8KCS8qIGZpZWxkcyBmaWxsZWQgYnkgZnVuY3Rpb24gaW4gTWF0ZXJpYWxpemUgcmV0dXJu IG1vZGU6ICovCglUdXBsZXN0b3Jlc3RhdGUgKnNldFJlc3VsdDsgLyogaG9sZHMgdGhlIGNv bXBsZXRlIHJldHVybmVkIHR1cGxlIHNldCAqLwoJVHVwbGVEZXNjCXNldERlc2M7CQkvKiBh Y3R1YWwgZGVzY3JpcHRvciBmb3IgcmV0dXJuZWQgdHVwbGVzICovCn0gUmV0dXJuU2V0SW5m bzsKCi8qIC0tLS0tLS0tLS0tLS0tLS0KICoJCVByb2plY3Rpb25JbmZvIG5vZGUgaW5mb3Jt YXRpb24KICoKICoJCVRoaXMgaXMgYWxsIHRoZSBpbmZvcm1hdGlvbiBuZWVkZWQgdG8gcGVy Zm9ybSBwcm9qZWN0aW9ucyAtLS0KICoJCXRoYXQgaXMsIGZvcm0gbmV3IHR1cGxlcyBieSBl dmFsdWF0aW9uIG9mIHRhcmdldGxpc3QgZXhwcmVzc2lvbnMuCiAqCQlOb2RlcyB3aGljaCBu ZWVkIHRvIGRvIHByb2plY3Rpb25zIGNyZWF0ZSBvbmUgb2YgdGhlc2UuCiAqCiAqCQlUaGUg dGFyZ2V0IHR1cGxlIHNsb3QgaXMga2VwdCBpbiBQcm9qZWN0aW9uSW5mby0+cGlfc3RhdGUu cmVzdWx0c2xvdC4KICoJCUV4ZWNQcm9qZWN0KCkgZXZhbHVhdGVzIHRoZSB0bGlzdCwgZm9y bXMgYSB0dXBsZSwgYW5kIHN0b3JlcyBpdAogKgkJaW4gdGhlIGdpdmVuIHNsb3QuICBOb3Rl IHRoYXQgdGhlIHJlc3VsdCB3aWxsIGJlIGEgInZpcnR1YWwiIHR1cGxlCiAqCQl1bmxlc3Mg RXhlY01hdGVyaWFsaXplU2xvdCgpIGlzIHRoZW4gY2FsbGVkIHRvIGZvcmNlIGl0IHRvIGJl CiAqCQljb252ZXJ0ZWQgdG8gYSBwaHlzaWNhbCB0dXBsZS4gIFRoZSBzbG90IG11c3QgaGF2 ZSBhIHR1cGxlZGVzYwogKgkJdGhhdCBtYXRjaGVzIHRoZSBvdXRwdXQgb2YgdGhlIHRsaXN0 IQogKiAtLS0tLS0tLS0tLS0tLS0tCiAqLwp0eXBlZGVmIHN0cnVjdCBQcm9qZWN0aW9uSW5m bwp7CglOb2RlVGFnCQl0eXBlOwoJLyogaW5zdHJ1Y3Rpb25zIHRvIGV2YWx1YXRlIHByb2pl Y3Rpb24gKi8KCUV4cHJTdGF0ZQlwaV9zdGF0ZTsKCS8qIGV4cHJlc3Npb24gY29udGV4dCBp biB3aGljaCB0byBldmFsdWF0ZSBleHByZXNzaW9uICovCglFeHByQ29udGV4dCAqcGlfZXhw ckNvbnRleHQ7Cn0gUHJvamVjdGlvbkluZm87CgovKiAtLS0tLS0tLS0tLS0tLS0tCiAqCSAg SnVua0ZpbHRlcgogKgogKgkgIFRoaXMgY2xhc3MgaXMgdXNlZCB0byBzdG9yZSBpbmZvcm1h dGlvbiByZWdhcmRpbmcganVuayBhdHRyaWJ1dGVzLgogKgkgIEEganVuayBhdHRyaWJ1dGUg aXMgYW4gYXR0cmlidXRlIGluIGEgdHVwbGUgdGhhdCBpcyBuZWVkZWQgb25seSBmb3IKICoJ ICBzdG9yaW5nIGludGVybWVkaWF0ZSBpbmZvcm1hdGlvbiBpbiB0aGUgZXhlY3V0b3IsIGFu ZCBkb2VzIG5vdCBiZWxvbmcKICoJICBpbiBlbWl0dGVkIHR1cGxlcy4gIEZvciBleGFtcGxl LCB3aGVuIHdlIGRvIGFuIFVQREFURSBxdWVyeSwKICoJICB0aGUgcGxhbm5lciBhZGRzIGEg Imp1bmsiIGVudHJ5IHRvIHRoZSB0YXJnZXRsaXN0IHNvIHRoYXQgdGhlIHR1cGxlcwogKgkg IHJldHVybmVkIHRvIEV4ZWN1dGVQbGFuKCkgY29udGFpbiBhbiBleHRyYSBhdHRyaWJ1dGU6 IHRoZSBjdGlkIG9mCiAqCSAgdGhlIHR1cGxlIHRvIGJlIHVwZGF0ZWQuICBUaGlzIGlzIG5l ZWRlZCB0byBkbyB0aGUgdXBkYXRlLCBidXQgd2UKICoJICBkb24ndCB3YW50IHRoZSBjdGlk IHRvIGJlIHBhcnQgb2YgdGhlIHN0b3JlZCBuZXcgdHVwbGUhICBTbywgd2UKICoJICBhcHBs eSBhICJqdW5rIGZpbHRlciIgdG8gcmVtb3ZlIHRoZSBqdW5rIGF0dHJpYnV0ZXMgYW5kIGZv cm0gdGhlCiAqCSAgcmVhbCBvdXRwdXQgdHVwbGUuICBUaGUganVua2ZpbHRlciBjb2RlIGFs c28gcHJvdmlkZXMgcm91dGluZXMgdG8KICoJICBleHRyYWN0IHRoZSB2YWx1ZXMgb2YgdGhl IGp1bmsgYXR0cmlidXRlKHMpIGZyb20gdGhlIGlucHV0IHR1cGxlLgogKgogKgkgIHRhcmdl dExpc3Q6CQl0aGUgb3JpZ2luYWwgdGFyZ2V0IGxpc3QgKGluY2x1ZGluZyBqdW5rIGF0dHJp YnV0ZXMpLgogKgkgIGNsZWFuVHVwVHlwZToJCXRoZSB0dXBsZSBkZXNjcmlwdG9yIGZvciB0 aGUgImNsZWFuIiB0dXBsZSAod2l0aAogKgkJCQkJCWp1bmsgYXR0cmlidXRlcyByZW1vdmVk KS4KICoJICBjbGVhbk1hcDoJCQlBIG1hcCB3aXRoIHRoZSBjb3JyZXNwb25kZW5jZSBiZXR3 ZWVuIHRoZSBub24tanVuawogKgkJCQkJCWF0dHJpYnV0ZSBudW1iZXJzIG9mIHRoZSAib3Jp Z2luYWwiIHR1cGxlIGFuZCB0aGUKICoJCQkJCQlhdHRyaWJ1dGUgbnVtYmVycyBvZiB0aGUg ImNsZWFuIiB0dXBsZS4KICoJICByZXN1bHRTbG90OgkJdHVwbGUgc2xvdCB1c2VkIHRvIGhv bGQgY2xlYW5lZCB0dXBsZS4KICogLS0tLS0tLS0tLS0tLS0tLQogKi8KdHlwZWRlZiBzdHJ1 Y3QgSnVua0ZpbHRlcgp7CglOb2RlVGFnCQl0eXBlOwoJTGlzdAkgICAqamZfdGFyZ2V0TGlz dDsKCVR1cGxlRGVzYwlqZl9jbGVhblR1cFR5cGU7CglBdHRyTnVtYmVyICpqZl9jbGVhbk1h cDsKCVR1cGxlVGFibGVTbG90ICpqZl9yZXN1bHRTbG90Owp9IEp1bmtGaWx0ZXI7CgovKgog KiBPbkNvbmZsaWN0QWN0aW9uU3RhdGUKICoKICogRXhlY3V0b3Igc3RhdGUgb2YgYW4gT04g Q09ORkxJQ1QgRE8gU0VMRUNUL1VQREFURSBvcGVyYXRpb24uCiAqLwp0eXBlZGVmIHN0cnVj dCBPbkNvbmZsaWN0QWN0aW9uU3RhdGUKewoJTm9kZVRhZwkJdHlwZTsKCglUdXBsZVRhYmxl U2xvdCAqb2NfRXhpc3Rpbmc7CS8qIHNsb3QgdG8gc3RvcmUgZXhpc3RpbmcgdGFyZ2V0IHR1 cGxlIGluICovCglUdXBsZVRhYmxlU2xvdCAqb2NfUHJvalNsb3Q7CS8qIENPTkZMSUNUIC4u LiBTRVQgLi4uIHByb2plY3Rpb24gdGFyZ2V0ICovCglQcm9qZWN0aW9uSW5mbyAqb2NfUHJv akluZm87CS8qIGZvciBPTiBDT05GTElDVCBETyBVUERBVEUgU0VUICovCglMb2NrQ2xhdXNl U3RyZW5ndGggb2NfTG9ja1N0cmVuZ3RoOyAvKiBsb2NrIHN0cmVuZ3RoIGZvciBETyBTRUxF Q1QgKi8KCUV4cHJTdGF0ZSAgKm9jX1doZXJlQ2xhdXNlOyAvKiBzdGF0ZSBmb3IgdGhlIFdI RVJFIGNsYXVzZSAqLwp9IE9uQ29uZmxpY3RBY3Rpb25TdGF0ZTsKCi8qIC0tLS0tLS0tLS0t LS0tLS0KICoJIE1lcmdlQWN0aW9uU3RhdGUgaW5mb3JtYXRpb24KICoKICoJRXhlY3V0b3Ig c3RhdGUgZm9yIGEgTUVSR0UgYWN0aW9uLgogKiAtLS0tLS0tLS0tLS0tLS0tCiAqLwp0eXBl ZGVmIHN0cnVjdCBNZXJnZUFjdGlvblN0YXRlCnsKCU5vZGVUYWcJCXR5cGU7CgoJTWVyZ2VB Y3Rpb24gKm1hc19hY3Rpb247CS8qIGFzc29jaWF0ZWQgTWVyZ2VBY3Rpb24gbm9kZSAqLwoJ UHJvamVjdGlvbkluZm8gKm1hc19wcm9qOwkvKiBwcm9qZWN0aW9uIG9mIHRoZSBhY3Rpb24n cyB0YXJnZXRsaXN0IGZvcgoJCQkJCQkJCSAqIHRoaXMgcmVsICovCglFeHByU3RhdGUgICpt YXNfd2hlbnF1YWw7CS8qIFdIRU4gW05PVF0gTUFUQ0hFRCBBTkQgY29uZGl0aW9ucyAqLwp9 IE1lcmdlQWN0aW9uU3RhdGU7CgovKgogKiBGb3JQb3J0aW9uT2ZTdGF0ZQogKgogKiBFeGVj dXRvciBzdGF0ZSBvZiBhIEZPUiBQT1JUSU9OIE9GIG9wZXJhdGlvbi4KICovCnR5cGVkZWYg c3RydWN0IEZvclBvcnRpb25PZlN0YXRlCnsKCU5vZGVUYWcJCXR5cGU7CgoJY2hhcgkgICAq ZnBfcmFuZ2VOYW1lOwkvKiB0aGUgY29sdW1uIG5hbWVkIGluIEZPUiBQT1JUSU9OIE9GICov CglPaWQJCQlmcF9yYW5nZVR5cGU7CS8qIHRoZSBiYXNlIHR5cGUgKG5vdCBkb21haW4pIG9m IHRoZSBGT1IKCQkJCQkJCQkgKiBQT1JUSU9OIE9GIGV4cHJlc3Npb24gKi8KCWludAkJCWZw X3JhbmdlQXR0bm87CS8qIHRoZSBhdHRubyBvZiB0aGUgcmFuZ2UgY29sdW1uICovCglEYXR1 bQkJZnBfdGFyZ2V0UmFuZ2U7IC8qIHRoZSByYW5nZS9tdWx0aXJhbmdlIGZyb20gRk9SIFBP UlRJT04gT0YgKi8KCVR5cGVDYWNoZUVudHJ5ICpmcF9sZWZ0b3ZlcnN0eXBjYWNoZTsJLyog dHlwZSBjYWNoZSBlbnRyeSBvZiB0aGUgcmFuZ2UgKi8KCVR1cGxlVGFibGVTbG90ICpmcF9F eGlzdGluZzsJLyogc2xvdCB0byBzdG9yZSBvbGQgdHVwbGUgKi8KCVR1cGxlVGFibGVTbG90 ICpmcF9MZWZ0b3ZlcjsJLyogc2xvdCB0byBzdG9yZSBsZWZ0b3ZlciAqLwp9IEZvclBvcnRp b25PZlN0YXRlOwoKLyoKICogUmVzdWx0UmVsSW5mbwogKgogKiBXaGVuZXZlciB3ZSB1cGRh dGUgYW4gZXhpc3RpbmcgcmVsYXRpb24sIHdlIGhhdmUgdG8gdXBkYXRlIGluZGV4ZXMgb24g dGhlCiAqIHJlbGF0aW9uLCBhbmQgcGVyaGFwcyBhbHNvIGZpcmUgdHJpZ2dlcnMuICBSZXN1 bHRSZWxJbmZvIGhvbGRzIGFsbCB0aGUKICogaW5mb3JtYXRpb24gbmVlZGVkIGFib3V0IGEg cmVzdWx0IHJlbGF0aW9uLCBpbmNsdWRpbmcgaW5kZXhlcy4KICoKICogTm9ybWFsbHksIGEg UmVzdWx0UmVsSW5mbyByZWZlcnMgdG8gYSB0YWJsZSB0aGF0IGlzIGluIHRoZSBxdWVyeSdz IHJhbmdlCiAqIHRhYmxlOyB0aGVuIHJpX1JhbmdlVGFibGVJbmRleCBpcyB0aGUgUlQgaW5k ZXggYW5kIHJpX1JlbGF0aW9uRGVzYyBpcwogKiBqdXN0IGEgY29weSBvZiB0aGUgcmVsZXZh bnQgZXNfcmVsYXRpb25zW10gZW50cnkuICBIb3dldmVyLCBpbiBzb21lCiAqIHNpdHVhdGlv bnMgd2UgY3JlYXRlIFJlc3VsdFJlbEluZm9zIGZvciByZWxhdGlvbnMgdGhhdCBhcmUgbm90 IGluIHRoZQogKiByYW5nZSB0YWJsZSwgbmFtZWx5IGZvciB0YXJnZXRzIG9mIHR1cGxlIHJv dXRpbmcgaW4gYSBwYXJ0aXRpb25lZCB0YWJsZSwKICogYW5kIHdoZW4gZmlyaW5nIHRyaWdn ZXJzIGluIHRhYmxlcyBvdGhlciB0aGFuIHRoZSB0YXJnZXQgdGFibGVzIChTZWUKICogRXhl Y0dldFRyaWdnZXJSZXN1bHRSZWwpLiAgSW4gdGhlc2Ugc2l0dWF0aW9ucywgcmlfUmFuZ2VU YWJsZUluZGV4IGlzIDAKICogYW5kIHJpX1JlbGF0aW9uRGVzYyBpcyBhIHNlcGFyYXRlbHkt b3BlbmVkIHJlbGNhY2hlIHBvaW50ZXIgdGhhdCBuZWVkcyB0bwogKiBiZSBzZXBhcmF0ZWx5 IGNsb3NlZC4KICovCnR5cGVkZWYgc3RydWN0IFJlc3VsdFJlbEluZm8KewoJTm9kZVRhZwkJ dHlwZTsKCgkvKiByZXN1bHQgcmVsYXRpb24ncyByYW5nZSB0YWJsZSBpbmRleCwgb3IgMCBp ZiBub3QgaW4gcmFuZ2UgdGFibGUgKi8KCUluZGV4CQlyaV9SYW5nZVRhYmxlSW5kZXg7CgoJ LyogcmVsYXRpb24gZGVzY3JpcHRvciBmb3IgcmVzdWx0IHJlbGF0aW9uICovCglSZWxhdGlv bglyaV9SZWxhdGlvbkRlc2M7CgoJLyogIyBvZiBpbmRpY2VzIGV4aXN0aW5nIG9uIHJlc3Vs dCByZWxhdGlvbiAqLwoJaW50CQkJcmlfTnVtSW5kaWNlczsKCgkvKiBhcnJheSBvZiByZWxh dGlvbiBkZXNjcmlwdG9ycyBmb3IgaW5kaWNlcyAqLwoJUmVsYXRpb25QdHIgcmlfSW5kZXhS ZWxhdGlvbkRlc2NzOwoKCS8qIGFycmF5IG9mIGtleS9hdHRyIGluZm8gZm9yIGluZGljZXMg Ki8KCUluZGV4SW5mbyAqKnJpX0luZGV4UmVsYXRpb25JbmZvOwoKCS8qCgkgKiBGb3IgVVBE QVRFL0RFTEVURS9NRVJHRSByZXN1bHQgcmVsYXRpb25zLCB0aGUgYXR0cmlidXRlIG51bWJl ciBvZiB0aGUKCSAqIHJvdyBpZGVudGl0eSBqdW5rIGF0dHJpYnV0ZSBpbiB0aGUgc291cmNl IHBsYW4ncyBvdXRwdXQgdHVwbGVzCgkgKi8KCUF0dHJOdW1iZXIJcmlfUm93SWRBdHRObzsK CgkvKiBGb3IgVVBEQVRFLCBhdHRudW1zIG9mIGdlbmVyYXRlZCBjb2x1bW5zIHRvIGJlIGNv bXB1dGVkICovCglCaXRtYXBzZXQgICpyaV9leHRyYVVwZGF0ZWRDb2xzOwoJLyogdHJ1ZSBp ZiB0aGUgYWJvdmUgaGFzIGJlZW4gY29tcHV0ZWQgKi8KCWJvb2wJCXJpX2V4dHJhVXBkYXRl ZENvbHNfdmFsaWQ7CgoJLyogUHJvamVjdGlvbiB0byBnZW5lcmF0ZSBuZXcgdHVwbGUgaW4g YW4gSU5TRVJUL1VQREFURSAqLwoJUHJvamVjdGlvbkluZm8gKnJpX3Byb2plY3ROZXc7Cgkv KiBTbG90IHRvIGhvbGQgdGhhdCB0dXBsZSAqLwoJVHVwbGVUYWJsZVNsb3QgKnJpX25ld1R1 cGxlU2xvdDsKCS8qIFNsb3QgdG8gaG9sZCB0aGUgb2xkIHR1cGxlIGJlaW5nIHVwZGF0ZWQg Ki8KCVR1cGxlVGFibGVTbG90ICpyaV9vbGRUdXBsZVNsb3Q7CgkvKiBIYXZlIHRoZSBwcm9q ZWN0aW9uIGFuZCB0aGUgc2xvdHMgYWJvdmUgYmVlbiBpbml0aWFsaXplZD8gKi8KCWJvb2wJ CXJpX3Byb2plY3ROZXdJbmZvVmFsaWQ7CgoJLyogdXBkYXRlcyBkbyBMb2NrVHVwbGUoKSBi ZWZvcmUgb2xkdHVwIHJlYWQ7IHNlZSBSRUFETUUudHVwbG9jayAqLwoJYm9vbAkJcmlfbmVl ZExvY2tUYWdUdXBsZTsKCgkvKiB0cmlnZ2VycyB0byBiZSBmaXJlZCwgaWYgYW55ICovCglU cmlnZ2VyRGVzYyAqcmlfVHJpZ0Rlc2M7CgoJLyogY2FjaGVkIGxvb2t1cCBpbmZvIGZvciB0 cmlnZ2VyIGZ1bmN0aW9ucyAqLwoJRm1nckluZm8gICAqcmlfVHJpZ0Z1bmN0aW9uczsKCgkv KiBhcnJheSBvZiB0cmlnZ2VyIFdIRU4gZXhwciBzdGF0ZXMgKi8KCUV4cHJTdGF0ZSAqKnJp X1RyaWdXaGVuRXhwcnM7CgoJLyogb3B0aW9uYWwgcnVudGltZSBtZWFzdXJlbWVudHMgZm9y IHRyaWdnZXJzICovCglUcmlnZ2VySW5zdHJ1bWVudGF0aW9uICpyaV9UcmlnSW5zdHJ1bWVu dDsKCgkvKiBPbi1kZW1hbmQgY3JlYXRlZCBzbG90cyBmb3IgdHJpZ2dlcnMgLyByZXR1cm5p bmcgcHJvY2Vzc2luZyAqLwoJVHVwbGVUYWJsZVNsb3QgKnJpX1JldHVybmluZ1Nsb3Q7CS8q IGZvciB0cmlnZ2VyIG91dHB1dCB0dXBsZXMgKi8KCVR1cGxlVGFibGVTbG90ICpyaV9Ucmln T2xkU2xvdDsgLyogZm9yIGEgdHJpZ2dlcidzIG9sZCB0dXBsZSAqLwoJVHVwbGVUYWJsZVNs b3QgKnJpX1RyaWdOZXdTbG90OyAvKiBmb3IgYSB0cmlnZ2VyJ3MgbmV3IHR1cGxlICovCglU dXBsZVRhYmxlU2xvdCAqcmlfQWxsTnVsbFNsb3Q7IC8qIGZvciBSRVRVUk5JTkcgT0xEL05F VyAqLwoKCS8qIEZEVyBjYWxsYmFjayBmdW5jdGlvbnMsIGlmIGZvcmVpZ24gdGFibGUgKi8K CXN0cnVjdCBGZHdSb3V0aW5lICpyaV9GZHdSb3V0aW5lOwoKCS8qIGF2YWlsYWJsZSB0byBz YXZlIHByaXZhdGUgc3RhdGUgb2YgRkRXICovCgl2b2lkCSAgICpyaV9GZHdTdGF0ZTsKCgkv KiB0cnVlIHdoZW4gbW9kaWZ5aW5nIGZvcmVpZ24gdGFibGUgZGlyZWN0bHkgKi8KCWJvb2wJ CXJpX3VzZXNGZHdEaXJlY3RNb2RpZnk7CgoJLyogYmF0Y2ggaW5zZXJ0IHN0dWZmICovCglp bnQJCQlyaV9OdW1TbG90czsJLyogbnVtYmVyIG9mIHNsb3RzIGluIHRoZSBhcnJheSAqLwoJ aW50CQkJcmlfTnVtU2xvdHNJbml0aWFsaXplZDsgLyogbnVtYmVyIG9mIGluaXRpYWxpemVk IHNsb3RzICovCglpbnQJCQlyaV9CYXRjaFNpemU7CS8qIG1heCBzbG90cyBpbnNlcnRlZCBp biBhIHNpbmdsZSBiYXRjaCAqLwoJVHVwbGVUYWJsZVNsb3QgKipyaV9TbG90czsJLyogaW5w dXQgdHVwbGVzIGZvciBiYXRjaCBpbnNlcnQgKi8KCVR1cGxlVGFibGVTbG90ICoqcmlfUGxh blNsb3RzOwoKCS8qIGxpc3Qgb2YgV2l0aENoZWNrT3B0aW9uJ3MgdG8gYmUgY2hlY2tlZCAq LwoJTGlzdAkgICAqcmlfV2l0aENoZWNrT3B0aW9uczsKCgkvKiBsaXN0IG9mIFdpdGhDaGVj a09wdGlvbiBleHByIHN0YXRlcyAqLwoJTGlzdAkgICAqcmlfV2l0aENoZWNrT3B0aW9uRXhw cnM7CgoJLyogYXJyYXkgb2YgZXhwciBzdGF0ZXMgZm9yIGNoZWNraW5nIGNoZWNrIGNvbnN0 cmFpbnRzICovCglFeHByU3RhdGUgKipyaV9DaGVja0NvbnN0cmFpbnRFeHByczsKCgkvKgoJ ICogYXJyYXkgb2YgZXhwciBzdGF0ZXMgZm9yIGNoZWNraW5nIG5vdC1udWxsIGNvbnN0cmFp bnRzIG9uIHZpcnR1YWwKCSAqIGdlbmVyYXRlZCBjb2x1bW5zCgkgKi8KCUV4cHJTdGF0ZSAq KnJpX0dlblZpcnR1YWxOb3ROdWxsQ29uc3RyYWludEV4cHJzOwoKCS8qCgkgKiBBcnJheXMg b2Ygc3RvcmVkIGdlbmVyYXRlZCBjb2x1bW5zIEV4cHJTdGF0ZXMgZm9yIElOU0VSVC9VUERB VEUvTUVSR0UuCgkgKi8KCUV4cHJTdGF0ZSAqKnJpX0dlbmVyYXRlZEV4cHJzSTsKCUV4cHJT dGF0ZSAqKnJpX0dlbmVyYXRlZEV4cHJzVTsKCgkvKiBudW1iZXIgb2Ygc3RvcmVkIGdlbmVy YXRlZCBjb2x1bW5zIHdlIG5lZWQgdG8gY29tcHV0ZSAqLwoJaW50CQkJcmlfTnVtR2VuZXJh dGVkTmVlZGVkSTsKCWludAkJCXJpX051bUdlbmVyYXRlZE5lZWRlZFU7CgoJLyogbGlzdCBv ZiBSRVRVUk5JTkcgZXhwcmVzc2lvbnMgKi8KCUxpc3QJICAgKnJpX3JldHVybmluZ0xpc3Q7 CgoJLyogZm9yIGNvbXB1dGluZyBhIFJFVFVSTklORyBsaXN0ICovCglQcm9qZWN0aW9uSW5m byAqcmlfcHJvamVjdFJldHVybmluZzsKCgkvKiBsaXN0IG9mIGFyYml0ZXIgaW5kZXhlcyB0 byB1c2UgdG8gY2hlY2sgY29uZmxpY3RzICovCglMaXN0CSAgICpyaV9vbkNvbmZsaWN0QXJi aXRlckluZGV4ZXM7CgoJLyogT04gQ09ORkxJQ1QgZXZhbHVhdGlvbiBzdGF0ZSBmb3IgRE8g U0VMRUNUL1VQREFURSAqLwoJT25Db25mbGljdEFjdGlvblN0YXRlICpyaV9vbkNvbmZsaWN0 OwoKCS8qIGZvciBNRVJHRSwgbGlzdHMgb2YgTWVyZ2VBY3Rpb25TdGF0ZSAob25lIHBlciBN ZXJnZU1hdGNoS2luZCkgKi8KCUxpc3QJICAgKnJpX01lcmdlQWN0aW9uc1tOVU1fTUVSR0Vf TUFUQ0hfS0lORFNdOwoKCS8qIGZvciBNRVJHRSwgZXhwciBzdGF0ZSBmb3IgY2hlY2tpbmcg dGhlIGpvaW4gY29uZGl0aW9uICovCglFeHByU3RhdGUgICpyaV9NZXJnZUpvaW5Db25kaXRp b247CgoJLyogRk9SIFBPUlRJT04gT0YgZXZhbHVhdGlvbiBzdGF0ZSAqLwoJRm9yUG9ydGlv bk9mU3RhdGUgKnJpX2ZvclBvcnRpb25PZjsKCgkvKiBwYXJ0aXRpb24gY2hlY2sgZXhwcmVz c2lvbiBzdGF0ZSAoTlVMTCBpZiBub3Qgc2V0IHVwIHlldCkgKi8KCUV4cHJTdGF0ZSAgKnJp X1BhcnRpdGlvbkNoZWNrRXhwcjsKCgkvKgoJICogTWFwIHRvIGNvbnZlcnQgY2hpbGQgcmVz dWx0IHJlbGF0aW9uIHR1cGxlcyB0byB0aGUgZm9ybWF0IG9mIHRoZSB0YWJsZQoJICogYWN0 dWFsbHkgbWVudGlvbmVkIGluIHRoZSBxdWVyeSAoY2FsbGVkICJyb290IikuICBDb21wdXRl ZCBvbmx5IGlmCgkgKiBuZWVkZWQuICBBIE5VTEwgbWFwIHZhbHVlIGluZGljYXRlcyB0aGF0 IG5vIGNvbnZlcnNpb24gaXMgbmVlZGVkLCBzbyB3ZQoJICogbXVzdCBoYXZlIGEgc2VwYXJh dGUgZmxhZyB0byBzaG93IGlmIHRoZSBtYXAgaGFzIGJlZW4gY29tcHV0ZWQuCgkgKi8KCVR1 cGxlQ29udmVyc2lvbk1hcCAqcmlfQ2hpbGRUb1Jvb3RNYXA7Cglib29sCQlyaV9DaGlsZFRv Um9vdE1hcFZhbGlkOwoKCS8qCgkgKiBBcyBhYm92ZSwgYnV0IGluIHRoZSBvdGhlciBkaXJl Y3Rpb24uCgkgKi8KCVR1cGxlQ29udmVyc2lvbk1hcCAqcmlfUm9vdFRvQ2hpbGRNYXA7Cgli b29sCQlyaV9Sb290VG9DaGlsZE1hcFZhbGlkOwoKCS8qCgkgKiBPdGhlciBpbmZvcm1hdGlv biBuZWVkZWQgYnkgY2hpbGQgcmVzdWx0IHJlbGF0aW9ucwoJICoKCSAqIHJpX1Jvb3RSZXN1 bHRSZWxJbmZvIGdpdmVzIHRoZSB0YXJnZXQgcmVsYXRpb24gbWVudGlvbmVkIGluIHRoZSBx dWVyeS4KCSAqIFVzZWQgYXMgdGhlIHJvb3QgZm9yIHR1cGxlIHJvdXRpbmcgYW5kL29yIHRy YW5zaXRpb24gY2FwdHVyZS4KCSAqCgkgKiByaV9QYXJ0aXRpb25UdXBsZVNsb3QgaXMgbm9u LU5VTEwgaWYgdGhlIHJlbGF0aW9uIGlzIGEgcGFydGl0aW9uIHRvCgkgKiByb3V0ZSB0dXBs ZXMgaW50byBhbmQgcmlfUm9vdFRvQ2hpbGRNYXAgY29udmVyc2lvbiBpcyBuZWVkZWQuCgkg Ki8KCXN0cnVjdCBSZXN1bHRSZWxJbmZvICpyaV9Sb290UmVzdWx0UmVsSW5mbzsKCVR1cGxl VGFibGVTbG90ICpyaV9QYXJ0aXRpb25UdXBsZVNsb3Q7CgoJLyogZm9yIHVzZSBieSBjb3B5 ZnJvbS5jIHdoZW4gcGVyZm9ybWluZyBtdWx0aS1pbnNlcnRzICovCglzdHJ1Y3QgQ29weU11 bHRpSW5zZXJ0QnVmZmVyICpyaV9Db3B5TXVsdGlJbnNlcnRCdWZmZXI7CgoJLyoKCSAqIFVz ZWQgd2hlbiBhIGxlYWYgcGFydGl0aW9uIGlzIGludm9sdmVkIGluIGEgY3Jvc3MtcGFydGl0 aW9uIHVwZGF0ZSBvZgoJICogb25lIG9mIGl0cyBhbmNlc3RvcnM7IHNlZSBFeGVjQ3Jvc3NQ YXJ0aXRpb25VcGRhdGVGb3JlaWduS2V5KCkuCgkgKi8KCUxpc3QJICAgKnJpX2FuY2VzdG9y UmVzdWx0UmVsczsKfSBSZXN1bHRSZWxJbmZvOwoKLyogLS0tLS0tLS0tLS0tLS0tLQogKgkg IEFzeW5jUmVxdWVzdAogKgogKiBTdGF0ZSBmb3IgYW4gYXN5bmNocm9ub3VzIHR1cGxlIHJl cXVlc3QuCiAqIC0tLS0tLS0tLS0tLS0tLS0KICovCnR5cGVkZWYgc3RydWN0IEFzeW5jUmVx dWVzdAp7CglQbGFuU3RhdGUgICpyZXF1ZXN0b3I7CQkvKiBOb2RlIHRoYXQgd2FudHMgYSB0 dXBsZSAqLwoJUGxhblN0YXRlICAqcmVxdWVzdGVlOwkJLyogTm9kZSBmcm9tIHdoaWNoIGEg dHVwbGUgaXMgd2FudGVkICovCglpbnQJCQlyZXF1ZXN0X2luZGV4OwkvKiBTY3JhdGNoIHNw YWNlIGZvciByZXF1ZXN0b3IgKi8KCWJvb2wJCWNhbGxiYWNrX3BlbmRpbmc7CS8qIENhbGxi YWNrIGlzIG5lZWRlZCAqLwoJYm9vbAkJcmVxdWVzdF9jb21wbGV0ZTsJLyogUmVxdWVzdCBj b21wbGV0ZSwgcmVzdWx0IHZhbGlkICovCglUdXBsZVRhYmxlU2xvdCAqcmVzdWx0OwkJLyog UmVzdWx0IChOVUxMIG9yIGFuIGVtcHR5IHNsb3QgaWYgbm8gbW9yZQoJCQkJCQkJCSAqIHR1 cGxlcykgKi8KfSBBc3luY1JlcXVlc3Q7CgovKiAtLS0tLS0tLS0tLS0tLS0tCiAqCSAgRVN0 YXRlIGluZm9ybWF0aW9uCiAqCiAqIFdvcmtpbmcgc3RhdGUgZm9yIGFuIEV4ZWN1dG9yIGlu dm9jYXRpb24KICogLS0tLS0tLS0tLS0tLS0tLQogKi8KdHlwZWRlZiBzdHJ1Y3QgRVN0YXRl CnsKCU5vZGVUYWcJCXR5cGU7CgoJLyogQmFzaWMgc3RhdGUgZm9yIGFsbCBxdWVyeSB0eXBl czogKi8KCVNjYW5EaXJlY3Rpb24gZXNfZGlyZWN0aW9uOyAvKiBjdXJyZW50IHNjYW4gZGly ZWN0aW9uICovCglTbmFwc2hvdAllc19zbmFwc2hvdDsJLyogdGltZSBxdWFsIHRvIHVzZSAq LwoJU25hcHNob3QJZXNfY3Jvc3NjaGVja19zbmFwc2hvdDsgLyogY3Jvc3NjaGVjayB0aW1l IHF1YWwgZm9yIFJJICovCglMaXN0CSAgICplc19yYW5nZV90YWJsZTsgLyogTGlzdCBvZiBS YW5nZVRibEVudHJ5ICovCglJbmRleAkJZXNfcmFuZ2VfdGFibGVfc2l6ZTsJLyogc2l6ZSBv ZiB0aGUgcmFuZ2UgdGFibGUgYXJyYXlzICovCglSZWxhdGlvbiAgICplc19yZWxhdGlvbnM7 CS8qIEFycmF5IG9mIHBlci1yYW5nZS10YWJsZS1lbnRyeSBSZWxhdGlvbgoJCQkJCQkJCSAq IHBvaW50ZXJzLCBvciBOVUxMIGlmIG5vdCB5ZXQgb3BlbmVkICovCglFeGVjUm93TWFyayAq KmVzX3Jvd21hcmtzOwkvKiBBcnJheSBvZiBwZXItcmFuZ2UtdGFibGUtZW50cnkKCQkJCQkJ CQkgKiBFeGVjUm93TWFya3MsIG9yIE5VTEwgaWYgbm9uZSAqLwoJTGlzdAkgICAqZXNfcnRl cGVybWluZm9zOwkvKiBMaXN0IG9mIFJURVBlcm1pc3Npb25JbmZvICovCglQbGFubmVkU3Rt dCAqZXNfcGxhbm5lZHN0bXQ7CS8qIGxpbmsgdG8gdG9wIG9mIHBsYW4gdHJlZSAqLwoJTGlz dAkgICAqZXNfcGFydF9wcnVuZV9pbmZvczsJLyogTGlzdCBvZiBQYXJ0aXRpb25QcnVuZUlu Zm8gKi8KCUxpc3QJICAgKmVzX3BhcnRfcHJ1bmVfc3RhdGVzOwkvKiBMaXN0IG9mIFBhcnRp dGlvblBydW5lU3RhdGUgKi8KCUxpc3QJICAgKmVzX3BhcnRfcHJ1bmVfcmVzdWx0czsJLyog TGlzdCBvZiBCaXRtYXBzZXQgKi8KCUJpdG1hcHNldCAgKmVzX3VucHJ1bmVkX3JlbGlkczsg LyogUGxhbm5lZFN0bXQudW5wcnVuYWJsZVJlbGlkcyArIFJUCgkJCQkJCQkJCSAqIGluZGV4 ZXMgb2YgbGVhZiBwYXJ0aXRpb25zIHRoYXQgc3Vydml2ZQoJCQkJCQkJCQkgKiBpbml0aWFs IHBydW5pbmc7IHNlZQoJCQkJCQkJCQkgKiBFeGVjRG9Jbml0aWFsUHJ1bmluZygpICovCglj b25zdCBjaGFyICplc19zb3VyY2VUZXh0OwkvKiBTb3VyY2UgdGV4dCBmcm9tIFF1ZXJ5RGVz YyAqLwoKCUp1bmtGaWx0ZXIgKmVzX2p1bmtGaWx0ZXI7CS8qIHRvcC1sZXZlbCBqdW5rIGZp bHRlciwgaWYgYW55ICovCgoJLyogSWYgcXVlcnkgY2FuIGluc2VydC9kZWxldGUgdHVwbGVz LCB0aGUgY29tbWFuZCBJRCB0byBtYXJrIHRoZW0gd2l0aCAqLwoJQ29tbWFuZElkCWVzX291 dHB1dF9jaWQ7CgoJLyogSW5mbyBhYm91dCB0YXJnZXQgdGFibGUocykgZm9yIGluc2VydC91 cGRhdGUvZGVsZXRlIHF1ZXJpZXM6ICovCglSZXN1bHRSZWxJbmZvICoqZXNfcmVzdWx0X3Jl bGF0aW9uczsJLyogQXJyYXkgb2YgcGVyLXJhbmdlLXRhYmxlLWVudHJ5CgkJCQkJCQkJCQkJ ICogUmVzdWx0UmVsSW5mbyBwb2ludGVycywgb3IgTlVMTAoJCQkJCQkJCQkJCSAqIGlmIG5v dCBhIHRhcmdldCB0YWJsZSAqLwoJTGlzdAkgICAqZXNfb3BlbmVkX3Jlc3VsdF9yZWxhdGlv bnM7IC8qIExpc3Qgb2Ygbm9uLU5VTEwgZW50cmllcyBpbgoJCQkJCQkJCQkJCSAqIGVzX3Jl c3VsdF9yZWxhdGlvbnMgaW4gbm8KCQkJCQkJCQkJCQkgKiBzcGVjaWZpYyBvcmRlciAqLwoK CVBhcnRpdGlvbkRpcmVjdG9yeSBlc19wYXJ0aXRpb25fZGlyZWN0b3J5OwkvKiBmb3IgUGFy dGl0aW9uRGVzYyBsb29rdXAgKi8KCgkvKgoJICogVGhlIGZvbGxvd2luZyBsaXN0IGNvbnRh aW5zIFJlc3VsdFJlbEluZm9zIGNyZWF0ZWQgYnkgdGhlIHR1cGxlIHJvdXRpbmcKCSAqIGNv ZGUgZm9yIHBhcnRpdGlvbnMgdGhhdCBhcmVuJ3QgZm91bmQgaW4gdGhlIGVzX3Jlc3VsdF9y ZWxhdGlvbnMgYXJyYXkuCgkgKi8KCUxpc3QJICAgKmVzX3R1cGxlX3JvdXRpbmdfcmVzdWx0 X3JlbGF0aW9uczsKCgkvKiBTdHVmZiB1c2VkIGZvciBmaXJpbmcgdHJpZ2dlcnM6ICovCglM aXN0CSAgICplc190cmlnX3RhcmdldF9yZWxhdGlvbnM7CS8qIHRyaWdnZXItb25seSBSZXN1 bHRSZWxJbmZvcyAqLwoKCS8qIFBhcmFtZXRlciBpbmZvOiAqLwoJUGFyYW1MaXN0SW5mbyBl c19wYXJhbV9saXN0X2luZm87CS8qIHZhbHVlcyBvZiBleHRlcm5hbCBwYXJhbXMgKi8KCVBh cmFtRXhlY0RhdGEgKmVzX3BhcmFtX2V4ZWNfdmFsczsJLyogdmFsdWVzIG9mIGludGVybmFs IHBhcmFtcyAqLwoKCVF1ZXJ5RW52aXJvbm1lbnQgKmVzX3F1ZXJ5RW52OwkvKiBxdWVyeSBl bnZpcm9ubWVudCAqLwoKCS8qIE90aGVyIHdvcmtpbmcgc3RhdGU6ICovCglNZW1vcnlDb250 ZXh0IGVzX3F1ZXJ5X2N4dDsgLyogcGVyLXF1ZXJ5IGNvbnRleHQgaW4gd2hpY2ggRVN0YXRl IGxpdmVzICovCgoJTGlzdAkgICAqZXNfdHVwbGVUYWJsZTsJLyogTGlzdCBvZiBUdXBsZVRh YmxlU2xvdHMgKi8KCgl1aW50NjQJCWVzX3Byb2Nlc3NlZDsJLyogIyBvZiB0dXBsZXMgcHJv Y2Vzc2VkIGR1cmluZyBvbmUKCQkJCQkJCQkgKiBFeGVjdXRvclJ1bigpIGNhbGwuICovCgl1 aW50NjQJCWVzX3RvdGFsX3Byb2Nlc3NlZDsgLyogdG90YWwgIyBvZiB0dXBsZXMgYWdncmVn YXRlZCBhY3Jvc3MgYWxsCgkJCQkJCQkJCSAqIEV4ZWN1dG9yUnVuKCkgY2FsbHMuICovCgoJ aW50CQkJZXNfdG9wX2VmbGFnczsJLyogZWZsYWdzIHBhc3NlZCB0byBFeGVjdXRvclN0YXJ0 ICovCglpbnQJCQllc19pbnN0cnVtZW50OwkvKiBPUiBvZiBJbnN0cnVtZW50T3B0aW9uIGZs YWdzICovCglib29sCQllc19maW5pc2hlZDsJLyogdHJ1ZSB3aGVuIEV4ZWN1dG9yRmluaXNo IGlzIGRvbmUgKi8KCglMaXN0CSAgICplc19leHByY29udGV4dHM7CS8qIExpc3Qgb2YgRXhw ckNvbnRleHRzIHdpdGhpbiBFU3RhdGUgKi8KCglMaXN0CSAgICplc19zdWJwbGFuc3RhdGVz OwkvKiBMaXN0IG9mIFBsYW5TdGF0ZSBmb3IgU3ViUGxhbnMgKi8KCglMaXN0CSAgICplc19h dXhtb2RpZnl0YWJsZXM7IC8qIExpc3Qgb2Ygc2Vjb25kYXJ5IE1vZGlmeVRhYmxlU3RhdGVz ICovCgoJLyoKCSAqIHRoaXMgRXhwckNvbnRleHQgaXMgZm9yIHBlci1vdXRwdXQtdHVwbGUg b3BlcmF0aW9ucywgc3VjaCBhcyBjb25zdHJhaW50CgkgKiBjaGVja3MgYW5kIGluZGV4LXZh bHVlIGNvbXB1dGF0aW9ucy4gIEl0IHdpbGwgYmUgcmVzZXQgZm9yIGVhY2ggb3V0cHV0Cgkg KiB0dXBsZS4gIE5vdGUgdGhhdCBpdCB3aWxsIGJlIGNyZWF0ZWQgb25seSBpZiBuZWVkZWQu CgkgKi8KCUV4cHJDb250ZXh0ICplc19wZXJfdHVwbGVfZXhwcmNvbnRleHQ7CgoJLyoKCSAq IElmIG5vdCBOVUxMLCB0aGlzIGlzIGFuIEVQUVN0YXRlJ3MgRVN0YXRlLiBUaGlzIGlzIGEg ZmllbGQgaW4gRVN0YXRlCgkgKiBib3RoIHRvIGFsbG93IEV2YWxQbGFuUXVhbCBhd2FyZSBl eGVjdXRvciBub2RlcyB0byBkZXRlY3QgdGhhdCB0aGV5CgkgKiBuZWVkIHRvIHBlcmZvcm0g RVBRIHJlbGF0ZWQgd29yaywgYW5kIHRvIHByb3ZpZGUgbmVjZXNzYXJ5IGluZm9ybWF0aW9u CgkgKiB0byBkbyBzby4KCSAqLwoJc3RydWN0IEVQUVN0YXRlICplc19lcHFfYWN0aXZlOwoK CWJvb2wJCWVzX3VzZV9wYXJhbGxlbF9tb2RlOwkvKiBjYW4gd2UgdXNlIHBhcmFsbGVsIHdv cmtlcnM/ICovCgoJaW50CQkJZXNfcGFyYWxsZWxfd29ya2Vyc190b19sYXVuY2g7CS8qIG51 bWJlciBvZiB3b3JrZXJzIHRvCgkJCQkJCQkJCQkJCSAqIGxhdW5jaC4gKi8KCWludAkJCWVz X3BhcmFsbGVsX3dvcmtlcnNfbGF1bmNoZWQ7CS8qIG51bWJlciBvZiB3b3JrZXJzIGFjdHVh bGx5CgkJCQkJCQkJCQkJCSAqIGxhdW5jaGVkLiAqLwoKCS8qIFRoZSBwZXItcXVlcnkgc2hh cmVkIG1lbW9yeSBhcmVhIHRvIHVzZSBmb3IgcGFyYWxsZWwgZXhlY3V0aW9uLiAqLwoJc3Ry dWN0IGRzYV9hcmVhICplc19xdWVyeV9kc2E7CgoJLyoKCSAqIEpJVCBpbmZvcm1hdGlvbi4g ZXNfaml0X2ZsYWdzIGluZGljYXRlcyB3aGV0aGVyIEpJVCBzaG91bGQgYmUgcGVyZm9ybWVk CgkgKiBhbmQgd2l0aCB3aGljaCBvcHRpb25zLiAgZXNfaml0IGlzIGNyZWF0ZWQgb24tZGVt YW5kIHdoZW4gSklUaW5nIGlzCgkgKiBwZXJmb3JtZWQuCgkgKgoJICogZXNfaml0X3dvcmtl cl9pbnN0ciBpcyB0aGUgY29tYmluZWQsIG9uIGRlbWFuZCBhbGxvY2F0ZWQsCgkgKiBpbnN0 cnVtZW50YXRpb24gZnJvbSBhbGwgd29ya2Vycy4gVGhlIGxlYWRlcidzIGluc3RydW1lbnRh dGlvbiBpcyBrZXB0CgkgKiBzZXBhcmF0ZSwgYW5kIGlzIGNvbWJpbmVkIG9uIGRlbWFuZCBi eSBFeHBsYWluUHJpbnRKSVRTdW1tYXJ5KCkuCgkgKi8KCWludAkJCWVzX2ppdF9mbGFnczsK CXN0cnVjdCBKaXRDb250ZXh0ICplc19qaXQ7CglzdHJ1Y3QgSml0SW5zdHJ1bWVudGF0aW9u ICplc19qaXRfd29ya2VyX2luc3RyOwoKCS8qCgkgKiBMaXN0cyBvZiBSZXN1bHRSZWxJbmZv cyBmb3IgZm9yZWlnbiB0YWJsZXMgb24gd2hpY2ggYmF0Y2gtaW5zZXJ0cyBhcmUKCSAqIHRv IGJlIGV4ZWN1dGVkIGFuZCBvd25pbmcgTW9kaWZ5VGFibGVTdGF0ZXMsIHN0b3JlZCBpbiB0 aGUgc2FtZSBvcmRlci4KCSAqLwoJTGlzdAkgICAqZXNfaW5zZXJ0X3BlbmRpbmdfcmVzdWx0 X3JlbGF0aW9uczsKCUxpc3QJICAgKmVzX2luc2VydF9wZW5kaW5nX21vZGlmeXRhYmxlczsK fSBFU3RhdGU7CgoKLyoKICogRXhlY1Jvd01hcmsgLQogKgkgICBydW50aW1lIHJlcHJlc2Vu dGF0aW9uIG9mIEZPUiBbS0VZXSBVUERBVEUvU0hBUkUgY2xhdXNlcwogKgogKiBXaGVuIGRv aW5nIFVQREFURS9ERUxFVEUvTUVSR0UvU0VMRUNUIEZPUiBbS0VZXSBVUERBVEUvU0hBUkUs IHdlIHdpbGwgaGF2ZQogKiBhbiBFeGVjUm93TWFyayBmb3IgZWFjaCBub24tdGFyZ2V0IHJl bGF0aW9uIGluIHRoZSBxdWVyeSAoZXhjZXB0IGluaGVyaXRhbmNlCiAqIHBhcmVudCBSVEVz LCB3aGljaCBjYW4gYmUgaWdub3JlZCBhdCBydW50aW1lKS4gIFZpcnR1YWwgcmVsYXRpb25z IHN1Y2ggYXMKICogc3VicXVlcmllcy1pbi1GUk9NIHdpbGwgaGF2ZSBhbiBFeGVjUm93TWFy ayB3aXRoIHJlbGF0aW9uID09IE5VTEwuICBTZWUKICogUGxhblJvd01hcmsgZm9yIGRldGFp bHMgYWJvdXQgbW9zdCBvZiB0aGUgZmllbGRzLiAgSW4gYWRkaXRpb24gdG8gZmllbGRzCiAq IGRpcmVjdGx5IGRlcml2ZWQgZnJvbSBQbGFuUm93TWFyaywgd2Ugc3RvcmUgYW4gYWN0aXZp dHkgZmxhZyAodG8gZGVub3RlCiAqIGluYWN0aXZlIGNoaWxkcmVuIG9mIGluaGVyaXRhbmNl IHRyZWVzKSwgY3VyQ3RpZCwgd2hpY2ggaXMgdXNlZCBieSB0aGUKICogV0hFUkUgQ1VSUkVO VCBPRiBjb2RlLCBhbmQgZXJtRXh0cmEsIHdoaWNoIGlzIGF2YWlsYWJsZSBmb3IgdXNlIGJ5 IHRoZSBwbGFuCiAqIG5vZGUgdGhhdCBzb3VyY2VzIHRoZSByZWxhdGlvbiAoZS5nLiwgZm9y IGEgZm9yZWlnbiB0YWJsZSB0aGUgRkRXIGNhbiB1c2UKICogZXJtRXh0cmEgdG8gaG9sZCBp bmZvcm1hdGlvbikuCiAqCiAqIEVTdGF0ZS0+ZXNfcm93bWFya3MgaXMgYW4gYXJyYXkgb2Yg dGhlc2Ugc3RydWN0cywgaW5kZXhlZCBieSBSVCBpbmRleCwKICogd2l0aCBOVUxMcyBmb3Ig aXJyZWxldmFudCBSVCBpbmRleGVzLiAgZXNfcm93bWFya3MgaXRzZWxmIGlzIE5VTEwgaWYK ICogdGhlcmUgYXJlIG5vIHJvd21hcmtzLgogKi8KdHlwZWRlZiBzdHJ1Y3QgRXhlY1Jvd01h cmsKewoJUmVsYXRpb24JcmVsYXRpb247CQkvKiBvcGVuZWQgYW5kIHN1aXRhYmx5IGxvY2tl ZCByZWxhdGlvbiAqLwoJT2lkCQkJcmVsaWQ7CQkJLyogaXRzIE9JRCAob3IgSW52YWxpZE9p ZCwgaWYgc3VicXVlcnkpICovCglJbmRleAkJcnRpOwkJCS8qIGl0cyByYW5nZSB0YWJsZSBp bmRleCAqLwoJSW5kZXgJCXBydGk7CQkJLyogcGFyZW50IHJhbmdlIHRhYmxlIGluZGV4LCBp ZiBjaGlsZCAqLwoJSW5kZXgJCXJvd21hcmtJZDsJCS8qIHVuaXF1ZSBpZGVudGlmaWVyIGZv ciByZXNqdW5rIGNvbHVtbnMgKi8KCVJvd01hcmtUeXBlIG1hcmtUeXBlOwkJLyogc2VlIGVu dW0gaW4gbm9kZXMvcGxhbm5vZGVzLmggKi8KCUxvY2tDbGF1c2VTdHJlbmd0aCBzdHJlbmd0 aDsJLyogTG9ja2luZ0NsYXVzZSdzIHN0cmVuZ3RoLCBvciBMQ1NfTk9ORSAqLwoJTG9ja1dh aXRQb2xpY3kgd2FpdFBvbGljeTsJLyogTk9XQUlUIGFuZCBTS0lQIExPQ0tFRCAqLwoJYm9v bAkJZXJtQWN0aXZlOwkJLyogaXMgdGhpcyBtYXJrIHJlbGV2YW50IGZvciBjdXJyZW50IHR1 cGxlPyAqLwoJSXRlbVBvaW50ZXJEYXRhIGN1ckN0aWQ7CS8qIGN0aWQgb2YgY3VycmVudGx5 IGxvY2tlZCB0dXBsZSwgaWYgYW55ICovCgl2b2lkCSAgICplcm1FeHRyYTsJCS8qIGF2YWls YWJsZSBmb3IgdXNlIGJ5IHJlbGF0aW9uIHNvdXJjZSBub2RlICovCn0gRXhlY1Jvd01hcms7 CgovKgogKiBFeGVjQXV4Um93TWFyayAtCiAqCSAgIGFkZGl0aW9uYWwgcnVudGltZSByZXBy ZXNlbnRhdGlvbiBvZiBGT1IgW0tFWV0gVVBEQVRFL1NIQVJFIGNsYXVzZXMKICoKICogRWFj aCBMb2NrUm93cyBhbmQgTW9kaWZ5VGFibGUgbm9kZSBrZWVwcyBhIGxpc3Qgb2YgdGhlIHJv d21hcmtzIGl0IG5lZWRzIHRvCiAqIGRlYWwgd2l0aC4gIEluIGFkZGl0aW9uIHRvIGEgcG9p bnRlciB0byB0aGUgcmVsYXRlZCBlbnRyeSBpbiBlc19yb3dtYXJrcywKICogdGhpcyBzdHJ1 Y3QgY2FycmllcyB0aGUgY29sdW1uIG51bWJlcihzKSBvZiB0aGUgcmVzanVuayBjb2x1bW5z IGFzc29jaWF0ZWQKICogd2l0aCB0aGUgcm93bWFyayAoc2VlIGNvbW1lbnRzIGZvciBQbGFu Um93TWFyayBmb3IgbW9yZSBkZXRhaWwpLgogKi8KdHlwZWRlZiBzdHJ1Y3QgRXhlY0F1eFJv d01hcmsKewoJRXhlY1Jvd01hcmsgKnJvd21hcms7CQkvKiByZWxhdGVkIGVudHJ5IGluIGVz X3Jvd21hcmtzICovCglBdHRyTnVtYmVyCWN0aWRBdHRObzsJCS8qIHJlc25vIG9mIGN0aWQg anVuayBhdHRyaWJ1dGUsIGlmIGFueSAqLwoJQXR0ck51bWJlcgl0b2lkQXR0Tm87CQkvKiBy ZXNubyBvZiB0YWJsZW9pZCBqdW5rIGF0dHJpYnV0ZSwgaWYgYW55ICovCglBdHRyTnVtYmVy CXdob2xlQXR0Tm87CQkvKiByZXNubyBvZiB3aG9sZS1yb3cganVuayBhdHRyaWJ1dGUsIGlm IGFueSAqLwp9IEV4ZWNBdXhSb3dNYXJrOwoKCi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICoJCQkJIFR1cGxl IEhhc2ggVGFibGVzCiAqCiAqIEFsbC1pbi1tZW1vcnkgdHVwbGUgaGFzaCB0YWJsZXMgYXJl IHVzZWQgZm9yIGEgbnVtYmVyIG9mIHB1cnBvc2VzLgogKgogKiBOb3RlOiB0YWJfaGFzaF9l eHByIGlzIGZvciBoYXNoaW5nIHRoZSBrZXkgZGF0YXR5cGUocykgc3RvcmVkIGluIHRoZSB0 YWJsZSwKICogYW5kIHRhYl9lcV9mdW5jIGlzIGEgbm9uLWNyb3NzLXR5cGUgRXhwclN0YXRl IGZvciBlcXVhbGl0eSBjaGVja3Mgb24gdGhvc2UKICogdHlwZXMuICBOb3JtYWxseSB0aGVz ZSBhcmUgdGhlIG9ubHkgRXhwclN0YXRlcyB1c2VkLCBidXQKICogRmluZFR1cGxlSGFzaEVu dHJ5KCkgc3VwcG9ydHMgc2VhcmNoaW5nIGEgaGFzaHRhYmxlIHVzaW5nIGNyb3NzLWRhdGEt dHlwZQogKiBoYXNoaW5nLiAgRm9yIHRoYXQsIHRoZSBjYWxsZXIgbXVzdCBzdXBwbHkgYW4g RXhwclN0YXRlIHRvIGhhc2ggdGhlIExIUwogKiBkYXRhdHlwZSBhcyB3ZWxsIGFzIHRoZSBj cm9zcy10eXBlIGVxdWFsaXR5IEV4cHJTdGF0ZSB0byB1c2UuICBpbl9oYXNoX2V4cHIKICog YW5kIGN1cl9lcV9mdW5jIGFyZSBzZXQgdG8gcG9pbnQgdG8gdGhlIGNhbGxlcidzIGhhc2gg YW5kIGVxdWFsaXR5CiAqIEV4cHJTdGF0ZXMgd2hpbGUgZG9pbmcgc3VjaCBhIHNlYXJjaC4g IER1cmluZyBMb29rdXBUdXBsZUhhc2hFbnRyeSgpLCB0aGV5CiAqIHBvaW50IHRvIHRhYl9o YXNoX2V4cHIgYW5kIHRhYl9lcV9mdW5jIHJlc3BlY3RpdmVseS4KICogLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQog Ki8KdHlwZWRlZiBzdHJ1Y3QgVHVwbGVIYXNoRW50cnlEYXRhICpUdXBsZUhhc2hFbnRyeTsK dHlwZWRlZiBzdHJ1Y3QgVHVwbGVIYXNoVGFibGVEYXRhICpUdXBsZUhhc2hUYWJsZTsKCi8q CiAqIFR1cGxlSGFzaEVudHJ5RGF0YSBpcyBhIHNsb3QgaW4gdGhlIHR1cGxlaGFzaF9oYXNo IHRhYmxlLiAgSWYgaXQncwogKiBwb3B1bGF0ZWQsIGl0IGNvbnRhaW5zIGEgcG9pbnRlciB0 byBhIE1pbmltYWxUdXBsZSB0aGF0IGNhbiBhbHNvIGhhdmUKICogYXNzb2NpYXRlZCAiYWRk aXRpb25hbCBkYXRhIi4gIFRoYXQncyBzdG9yZWQgaW4gdGhlIFR1cGxlSGFzaFRhYmxlJ3MK ICogdHVwbGVzY3h0LgogKi8KdHlwZWRlZiBzdHJ1Y3QgVHVwbGVIYXNoRW50cnlEYXRhCnsK CU1pbmltYWxUdXBsZSBmaXJzdFR1cGxlOwkvKiAtPiBjb3B5IG9mIGZpcnN0IHR1cGxlIGlu IHRoaXMgZ3JvdXAgKi8KCXVpbnQzMgkJc3RhdHVzOwkJCS8qIGhhc2ggc3RhdHVzICovCgl1 aW50MzIJCWhhc2g7CQkJLyogaGFzaCB2YWx1ZSAoY2FjaGVkKSAqLwp9IFR1cGxlSGFzaEVu dHJ5RGF0YTsKCi8qIGRlZmluZSBwYXJhbWV0ZXJzIG5lY2Vzc2FyeSB0byBnZW5lcmF0ZSB0 aGUgdHVwbGUgaGFzaCB0YWJsZSBpbnRlcmZhY2UgKi8KI2RlZmluZSBTSF9QUkVGSVggdHVw bGVoYXNoCiNkZWZpbmUgU0hfRUxFTUVOVF9UWVBFIFR1cGxlSGFzaEVudHJ5RGF0YQojZGVm aW5lIFNIX0tFWV9UWVBFIE1pbmltYWxUdXBsZQojZGVmaW5lIFNIX1NDT1BFIGV4dGVybgoj ZGVmaW5lIFNIX0RFQ0xBUkUKI2luY2x1ZGUgImxpYi9zaW1wbGVoYXNoLmgiCgp0eXBlZGVm IHN0cnVjdCBUdXBsZUhhc2hUYWJsZURhdGEKewoJdHVwbGVoYXNoX2hhc2ggKmhhc2h0YWI7 CS8qIHVuZGVybHlpbmcgc2ltcGxlaGFzaCBoYXNoIHRhYmxlICovCglpbnQJCQludW1Db2xz OwkJLyogbnVtYmVyIG9mIGNvbHVtbnMgaW4gbG9va3VwIGtleSAqLwoJQXR0ck51bWJlciAq a2V5Q29sSWR4OwkJLyogYXR0ciBudW1iZXJzIG9mIGtleSBjb2x1bW5zICovCglFeHByU3Rh dGUgICp0YWJfaGFzaF9leHByOwkvKiBFeHByU3RhdGUgZm9yIGhhc2hpbmcgdGFibGUgZGF0 YXR5cGUocykgKi8KCUV4cHJTdGF0ZSAgKnRhYl9lcV9mdW5jOwkvKiBjb21wYXJhdG9yIGZv ciB0YWJsZSBkYXRhdHlwZShzKSAqLwoJT2lkCQkgICAqdGFiX2NvbGxhdGlvbnM7IC8qIGNv bGxhdGlvbnMgZm9yIGhhc2ggYW5kIGNvbXBhcmlzb24gKi8KCU1lbW9yeUNvbnRleHQgdHVw bGVzY3h0OwkvKiBtZW1vcnkgY29udGV4dCBzdG9yaW5nIGhhc2hlZCB0dXBsZXMgKi8KCU1l bW9yeUNvbnRleHQgdGVtcGN4dDsJCS8qIGNvbnRleHQgZm9yIGZ1bmN0aW9uIGV2YWx1YXRp b25zICovCglTaXplCQlhZGRpdGlvbmFsc2l6ZTsgLyogc2l6ZSBvZiBhZGRpdGlvbmFsIGRh dGEgKi8KCVR1cGxlVGFibGVTbG90ICp0YWJsZXNsb3Q7CS8qIHNsb3QgZm9yIHJlZmVyZW5j aW5nIHRhYmxlIGVudHJpZXMgKi8KCS8qIFRoZSBmb2xsb3dpbmcgZmllbGRzIGFyZSBzZXQg dHJhbnNpZW50bHkgZm9yIGVhY2ggdGFibGUgc2VhcmNoOiAqLwoJVHVwbGVUYWJsZVNsb3Qg KmlucHV0c2xvdDsJLyogY3VycmVudCBpbnB1dCB0dXBsZSdzIHNsb3QgKi8KCUV4cHJTdGF0 ZSAgKmluX2hhc2hfZXhwcjsJLyogRXhwclN0YXRlIGZvciBoYXNoaW5nIGlucHV0IGRhdGF0 eXBlKHMpICovCglFeHByU3RhdGUgICpjdXJfZXFfZnVuYzsJLyogY29tcGFyYXRvciBmb3Ig aW5wdXQgdnMuIHRhYmxlICovCglFeHByQ29udGV4dCAqZXhwcmNvbnRleHQ7CS8qIGV4cHJl c3Npb24gY29udGV4dCAqLwp9IFR1cGxlSGFzaFRhYmxlRGF0YTsKCnR5cGVkZWYgdHVwbGVo YXNoX2l0ZXJhdG9yIFR1cGxlSGFzaEl0ZXJhdG9yOwoKLyoKICogVXNlIEluaXRUdXBsZUhh c2hJdGVyYXRvci9UZXJtVHVwbGVIYXNoSXRlcmF0b3IgZm9yIGEgcmVhZC93cml0ZSBzY2Fu LgogKiBVc2UgUmVzZXRUdXBsZUhhc2hJdGVyYXRvciBpZiB0aGUgdGFibGUgY2FuIGJlIGZy b3plbiAoaW4gdGhpcyBjYXNlIG5vCiAqIGV4cGxpY2l0IHNjYW4gdGVybWluYXRpb24gaXMg bmVlZGVkKS4KICovCiNkZWZpbmUgSW5pdFR1cGxlSGFzaEl0ZXJhdG9yKGh0YWJsZSwgaXRl cikgXAoJdHVwbGVoYXNoX3N0YXJ0X2l0ZXJhdGUoaHRhYmxlLT5oYXNodGFiLCBpdGVyKQoj ZGVmaW5lIFRlcm1UdXBsZUhhc2hJdGVyYXRvcihpdGVyKSBcCgkoKHZvaWQpIDApCiNkZWZp bmUgUmVzZXRUdXBsZUhhc2hJdGVyYXRvcihodGFibGUsIGl0ZXIpIFwKCUluaXRUdXBsZUhh c2hJdGVyYXRvcihodGFibGUsIGl0ZXIpCiNkZWZpbmUgU2NhblR1cGxlSGFzaFRhYmxlKGh0 YWJsZSwgaXRlcikgXAoJdHVwbGVoYXNoX2l0ZXJhdGUoaHRhYmxlLT5oYXNodGFiLCBpdGVy KQoKCi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0KICoJCQkJIEV4cHJlc3Npb24gU3RhdGUgTm9kZXMKICoKICog Rm9ybWVybHksIHRoZXJlIHdhcyBhIHNlcGFyYXRlIGV4ZWN1dG9yIGV4cHJlc3Npb24gc3Rh dGUgbm9kZSBjb3JyZXNwb25kaW5nCiAqIHRvIGVhY2ggbm9kZSBpbiBhIHBsYW5uZWQgZXhw cmVzc2lvbiB0cmVlLiAgVGhhdCdzIG5vIGxvbmdlciB0aGUgY2FzZTsgZm9yCiAqIGNvbW1v biBleHByZXNzaW9uIG5vZGUgdHlwZXMsIGFsbCB0aGUgZXhlY3V0aW9uIGluZm8gaXMgZW1i ZWRkZWQgaW50bwogKiBzdGVwKHMpIGluIGEgc2luZ2xlIEV4cHJTdGF0ZSBub2RlLiAgQnV0 IHdlIHN0aWxsIGhhdmUgYSBmZXcgZXhlY3V0b3Igc3RhdGUKICogbm9kZSB0eXBlcyBmb3Ig c2VsZWN0ZWQgZXhwcmVzc2lvbiBub2RlIHR5cGVzLCBtb3N0bHkgdGhvc2UgaW4gd2hpY2gg aW5mbwogKiBoYXMgdG8gYmUgc2hhcmVkIHdpdGggb3RoZXIgcGFydHMgb2YgdGhlIGV4ZWN1 dGlvbiBzdGF0ZSB0cmVlLgogKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAqLwoKLyogLS0tLS0tLS0tLS0tLS0t LQogKgkJV2luZG93RnVuY0V4cHJTdGF0ZSBub2RlCiAqIC0tLS0tLS0tLS0tLS0tLS0KICov CnR5cGVkZWYgc3RydWN0IFdpbmRvd0Z1bmNFeHByU3RhdGUKewoJTm9kZVRhZwkJdHlwZTsK CVdpbmRvd0Z1bmMgKndmdW5jOwkJCS8qIGV4cHJlc3Npb24gcGxhbiBub2RlICovCglMaXN0 CSAgICphcmdzOwkJCS8qIEV4cHJTdGF0ZXMgZm9yIGFyZ3VtZW50IGV4cHJlc3Npb25zICov CglFeHByU3RhdGUgICphZ2dmaWx0ZXI7CQkvKiBGSUxURVIgZXhwcmVzc2lvbiAqLwoJaW50 CQkJd2Z1bmNubzsJCS8qIElEIG51bWJlciBmb3Igd2Z1bmMgd2l0aGluIGl0cyBwbGFuIG5v ZGUgKi8KfSBXaW5kb3dGdW5jRXhwclN0YXRlOwoKCi8qIC0tLS0tLS0tLS0tLS0tLS0KICoJ CVNldEV4cHJTdGF0ZSBub2RlCiAqCiAqIFN0YXRlIGZvciBldmFsdWF0aW5nIGEgcG90ZW50 aWFsbHkgc2V0LXJldHVybmluZyBleHByZXNzaW9uIChsaWtlIEZ1bmNFeHByCiAqIG9yIE9w RXhwcikuICBJbiBzb21lIGNhc2VzLCBsaWtlIHNvbWUgb2YgdGhlIGV4cHJlc3Npb25zIGlu IFJPV1MgRlJPTSguLi4pCiAqIHRoZSBleHByZXNzaW9uIG1pZ2h0IG5vdCBiZSBhIFNSRiwg YnV0IG5vbmV0aGVsZXNzIGl0IHVzZXMgdGhlIHNhbWUKICogbWFjaGluZXJ5IGFzIFNSRnM7 IGl0IHdpbGwgYmUgdHJlYXRlZCBhcyBhIFNSRiByZXR1cm5pbmcgYSBzaW5nbGUgcm93Lgog KiAtLS0tLS0tLS0tLS0tLS0tCiAqLwp0eXBlZGVmIHN0cnVjdCBTZXRFeHByU3RhdGUKewoJ Tm9kZVRhZwkJdHlwZTsKCUV4cHIJICAgKmV4cHI7CQkJLyogZXhwcmVzc2lvbiBwbGFuIG5v ZGUgKi8KCUxpc3QJICAgKmFyZ3M7CQkJLyogRXhwclN0YXRlcyBmb3IgYXJndW1lbnQgZXhw cmVzc2lvbnMgKi8KCgkvKgoJICogSW4gUk9XUyBGUk9NLCBmdW5jdGlvbnMgY2FuIGJlIGlu bGluZWQsIHJlbW92aW5nIHRoZSBGdW5jRXhwciBub3JtYWxseQoJICogaW5zaWRlLiAgSW4g c3VjaCBhIGNhc2UgdGhpcyBpcyB0aGUgY29tcGlsZWQgZXhwcmVzc2lvbiAod2hpY2ggY2Fu bm90CgkgKiByZXR1cm4gYSBzZXQpLCB3aGljaCdsbCBiZSBldmFsdWF0ZWQgdXNpbmcgcmVn dWxhciBFeGVjRXZhbEV4cHIoKS4KCSAqLwoJRXhwclN0YXRlICAqZWxpZGVkRnVuY1N0YXRl OwoKCS8qCgkgKiBGdW5jdGlvbiBtYW5hZ2VyJ3MgbG9va3VwIGluZm8gZm9yIHRoZSB0YXJn ZXQgZnVuY3Rpb24uICBJZiBmdW5jLmZuX29pZAoJICogaXMgSW52YWxpZE9pZCwgd2UgaGF2 ZW4ndCBpbml0aWFsaXplZCBpdCB5ZXQgKG5vciBhbnkgb2YgdGhlIGZvbGxvd2luZwoJICog ZmllbGRzLCBleGNlcHQgZnVuY1JldHVybnNTZXQpLgoJICovCglGbWdySW5mbwlmdW5jOwoK CS8qCgkgKiBGb3IgYSBzZXQtcmV0dXJuaW5nIGZ1bmN0aW9uIChTUkYpIHRoYXQgcmV0dXJu cyBhIHR1cGxlc3RvcmUsIHdlIGtlZXAKCSAqIHRoZSB0dXBsZXN0b3JlIGhlcmUgYW5kIGRv bGUgb3V0IHRoZSByZXN1bHQgcm93cyBvbmUgYXQgYSB0aW1lLiBUaGUKCSAqIHNsb3QgaG9s ZHMgdGhlIHJvdyBjdXJyZW50bHkgYmVpbmcgcmV0dXJuZWQuCgkgKi8KCVR1cGxlc3RvcmVz dGF0ZSAqZnVuY1Jlc3VsdFN0b3JlOwoJVHVwbGVUYWJsZVNsb3QgKmZ1bmNSZXN1bHRTbG90 OwoKCS8qCgkgKiBJbiBzb21lIGNhc2VzIHdlIG5lZWQgdG8gY29tcHV0ZSBhIHR1cGxlIGRl c2NyaXB0b3IgZm9yIHRoZSBmdW5jdGlvbidzCgkgKiBvdXRwdXQuICBJZiBzbywgaXQncyBz dG9yZWQgaGVyZS4KCSAqLwoJVHVwbGVEZXNjCWZ1bmNSZXN1bHREZXNjOwoJYm9vbAkJZnVu Y1JldHVybnNUdXBsZTsJLyogdmFsaWQgd2hlbiBmdW5jUmVzdWx0RGVzYyBpc24ndCBOVUxM ICovCgoJLyoKCSAqIFJlbWVtYmVyIHdoZXRoZXIgdGhlIGZ1bmN0aW9uIGlzIGRlY2xhcmVk IHRvIHJldHVybiBhIHNldC4gIFRoaXMgaXMgc2V0CgkgKiBieSBFeGVjSW5pdEV4cHIsIGFu ZCBpcyB2YWxpZCBldmVuIGJlZm9yZSB0aGUgRm1nckluZm8gaXMgc2V0IHVwLgoJICovCgli b29sCQlmdW5jUmV0dXJuc1NldDsKCgkvKgoJICogc2V0QXJnc1ZhbGlkIGlzIHRydWUgd2hl biB3ZSBhcmUgZXZhbHVhdGluZyBhIHNldC1yZXR1cm5pbmcgZnVuY3Rpb24KCSAqIHRoYXQg dXNlcyB2YWx1ZS1wZXItY2FsbCBtb2RlIGFuZCB3ZSBhcmUgaW4gdGhlIG1pZGRsZSBvZiBh IGNhbGwKCSAqIHNlcmllczsgd2Ugd2FudCB0byBwYXNzIHRoZSBzYW1lIGFyZ3VtZW50IHZh bHVlcyB0byB0aGUgZnVuY3Rpb24gYWdhaW4KCSAqIChhbmQgYWdhaW4sIHVudGlsIGl0IHJl dHVybnMgRXhwckVuZFJlc3VsdCkuICBUaGlzIGluZGljYXRlcyB0aGF0CgkgKiBmY2luZm9f ZGF0YSBhbHJlYWR5IGNvbnRhaW5zIHZhbGlkIGFyZ3VtZW50IGRhdGEuCgkgKi8KCWJvb2wJ CXNldEFyZ3NWYWxpZDsKCgkvKgoJICogRmxhZyB0byByZW1lbWJlciB3aGV0aGVyIHdlIGhh dmUgcmVnaXN0ZXJlZCBhIHNodXRkb3duIGNhbGxiYWNrIGZvcgoJICogdGhpcyBTZXRFeHBy U3RhdGUuICBXZSBkbyBzbyBvbmx5IGlmIGZ1bmNSZXN1bHRTdG9yZSBvciBzZXRBcmdzVmFs aWQKCSAqIGhhcyBiZWVuIHNldCBhdCBsZWFzdCBvbmNlIChzaW5jZSBhbGwgdGhlIGNhbGxi YWNrIGlzIGZvciBpcyB0byByZWxlYXNlCgkgKiB0aGUgdHVwbGVzdG9yZSBvciBjbGVhciBz ZXRBcmdzVmFsaWQpLgoJICovCglib29sCQlzaHV0ZG93bl9yZWc7CS8qIGEgc2h1dGRvd24g Y2FsbGJhY2sgaXMgcmVnaXN0ZXJlZCAqLwoKCS8qCgkgKiBDYWxsIHBhcmFtZXRlciBzdHJ1 Y3R1cmUgZm9yIHRoZSBmdW5jdGlvbi4gIFRoaXMgaGFzIGJlZW4gaW5pdGlhbGl6ZWQKCSAq IChieSBJbml0RnVuY3Rpb25DYWxsSW5mb0RhdGEpIGlmIGZ1bmMuZm5fb2lkIGlzIHZhbGlk LiAgSXQgYWxzbyBzYXZlcwoJICogYXJndW1lbnQgdmFsdWVzIGJldHdlZW4gY2FsbHMsIHdo ZW4gc2V0QXJnc1ZhbGlkIGlzIHRydWUuCgkgKi8KCUZ1bmN0aW9uQ2FsbEluZm8gZmNpbmZv Owp9IFNldEV4cHJTdGF0ZTsKCi8qIC0tLS0tLS0tLS0tLS0tLS0KICoJCVN1YlBsYW5TdGF0 ZSBub2RlCiAqIC0tLS0tLS0tLS0tLS0tLS0KICovCnR5cGVkZWYgc3RydWN0IFN1YlBsYW5T dGF0ZQp7CglOb2RlVGFnCQl0eXBlOwoJU3ViUGxhbiAgICAqc3VicGxhbjsJCS8qIGV4cHJl c3Npb24gcGxhbiBub2RlICovCglQbGFuU3RhdGUgICpwbGFuc3RhdGU7CQkvKiBzdWJzZWxl Y3QgcGxhbidzIHN0YXRlIHRyZWUgKi8KCVBsYW5TdGF0ZSAgKnBhcmVudDsJCQkvKiBwYXJl bnQgcGxhbiBub2RlJ3Mgc3RhdGUgdHJlZSAqLwoJRXhwclN0YXRlICAqdGVzdGV4cHI7CQkv KiBzdGF0ZSBvZiBjb21iaW5pbmcgZXhwcmVzc2lvbiAqLwoJSGVhcFR1cGxlCWN1clR1cGxl OwkJLyogY29weSBvZiBtb3N0IHJlY2VudCB0dXBsZSBmcm9tIHN1YnBsYW4gKi8KCURhdHVt CQljdXJBcnJheTsJCS8qIG1vc3QgcmVjZW50IGFycmF5IGZyb20gQVJSQVkoKSBzdWJwbGFu ICovCgkvKiB0aGVzZSBhcmUgdXNlZCB3aGVuIGhhc2hpbmcgdGhlIHN1YnNlbGVjdCdzIG91 dHB1dDogKi8KCVR1cGxlRGVzYwlkZXNjUmlnaHQ7CQkvKiBzdWJzZWxlY3QgZGVzYyBhZnRl ciBwcm9qZWN0aW9uICovCglQcm9qZWN0aW9uSW5mbyAqcHJvakxlZnQ7CS8qIGZvciBwcm9q ZWN0aW5nIGxlZnRoYW5kIGV4cHJzICovCglQcm9qZWN0aW9uSW5mbyAqcHJvalJpZ2h0Owkv KiBmb3IgcHJvamVjdGluZyBzdWJzZWxlY3Qgb3V0cHV0ICovCglUdXBsZUhhc2hUYWJsZSBo YXNodGFibGU7CS8qIGhhc2ggdGFibGUgZm9yIG5vLW51bGxzIHN1YnNlbGVjdCByb3dzICov CglUdXBsZUhhc2hUYWJsZSBoYXNobnVsbHM7CS8qIGhhc2ggdGFibGUgZm9yIHJvd3Mgd2l0 aCBudWxsKHMpICovCglib29sCQloYXZlaGFzaHJvd3M7CS8qIHRydWUgaWYgaGFzaHRhYmxl IGlzIG5vdCBlbXB0eSAqLwoJYm9vbAkJaGF2ZW51bGxyb3dzOwkvKiB0cnVlIGlmIGhhc2hu dWxscyBpcyBub3QgZW1wdHkgKi8KCU1lbW9yeUNvbnRleHQgdHVwbGVzQ29udGV4dDsJLyog Y29udGV4dCBjb250YWluaW5nIGhhc2ggdGFibGVzJyB0dXBsZXMgKi8KCUV4cHJDb250ZXh0 ICppbm5lcmVjb250ZXh0OyAvKiBlY29udGV4dCBmb3IgY29tcHV0aW5nIGlubmVyIHR1cGxl cyAqLwoJaW50CQkJbnVtQ29sczsJCS8qIG51bWJlciBvZiBjb2x1bW5zIGJlaW5nIGhhc2hl ZCAqLwoJLyogZWFjaCBvZiB0aGUgcmVtYWluaW5nIGZpZWxkcyBpcyBhbiBhcnJheSBvZiBs ZW5ndGggbnVtQ29sczogKi8KCUF0dHJOdW1iZXIgKmtleUNvbElkeDsJCS8qIGNvbnRyb2wg ZGF0YSBmb3IgaGFzaCB0YWJsZXMgKi8KCU9pZAkJICAgKnRhYl9lcV9mdW5jb2lkczsJLyog ZXF1YWxpdHkgZnVuYyBvaWRzIGZvciB0YWJsZQoJCQkJCQkJCQkgKiBkYXRhdHlwZShzKSAq LwoJT2lkCQkgICAqdGFiX2NvbGxhdGlvbnM7IC8qIGNvbGxhdGlvbnMgZm9yIGhhc2ggYW5k IGNvbXBhcmlzb24gKi8KCUZtZ3JJbmZvICAgKnRhYl9oYXNoX2Z1bmNzOyAvKiBoYXNoIGZ1 bmN0aW9ucyBmb3IgdGFibGUgZGF0YXR5cGUocykgKi8KCUV4cHJTdGF0ZSAgKmxoc19oYXNo X2V4cHI7CS8qIGhhc2ggZXhwciBmb3IgbGVmdGhhbmQgZGF0YXR5cGUocykgKi8KCUZtZ3JJ bmZvICAgKmN1cl9lcV9mdW5jczsJLyogZXF1YWxpdHkgZnVuY3Rpb25zIGZvciBMSFMgdnMu IHRhYmxlICovCglFeHByU3RhdGUgICpjdXJfZXFfY29tcDsJLyogZXF1YWxpdHkgY29tcGFy YXRvciBmb3IgTEhTIHZzLiB0YWJsZSAqLwp9IFN1YlBsYW5TdGF0ZTsKCi8qCiAqIERvbWFp bkNvbnN0cmFpbnRTdGF0ZSAtIG9uZSBpdGVtIHRvIGNoZWNrIGR1cmluZyBDb2VyY2VUb0Rv bWFpbgogKgogKiBOb3RlOiB3ZSBjb25zaWRlciB0aGlzIHRvIGJlIHBhcnQgb2YgYW4gRXhw clN0YXRlIHRyZWUsIHNvIHdlIGdpdmUgaXQKICogYSBuYW1lIGZvbGxvd2luZyB0aGUgeHh4 U3RhdGUgY29udmVudGlvbi4gIEJ1dCB0aGVyZSdzIG5vIGRpcmVjdGx5CiAqIGFzc29jaWF0 ZWQgcGxhbi10cmVlIG5vZGUuCiAqLwp0eXBlZGVmIGVudW0gRG9tYWluQ29uc3RyYWludFR5 cGUKewoJRE9NX0NPTlNUUkFJTlRfTk9UTlVMTCwKCURPTV9DT05TVFJBSU5UX0NIRUNLLAp9 IERvbWFpbkNvbnN0cmFpbnRUeXBlOwoKdHlwZWRlZiBzdHJ1Y3QgRG9tYWluQ29uc3RyYWlu dFN0YXRlCnsKCU5vZGVUYWcJCXR5cGU7CglEb21haW5Db25zdHJhaW50VHlwZSBjb25zdHJh aW50dHlwZTsJLyogY29uc3RyYWludCB0eXBlICovCgljaGFyCSAgICpuYW1lOwkJCS8qIG5h bWUgb2YgY29uc3RyYWludCAoZm9yIGVycm9yIG1zZ3MpICovCglFeHByCSAgICpjaGVja19l eHByOwkJLyogZm9yIENIRUNLLCBhIGJvb2xlYW4gZXhwcmVzc2lvbiAqLwoJRXhwclN0YXRl ICAqY2hlY2tfZXhwcnN0YXRlOwkvKiBjaGVja19leHByJ3MgZXZhbCBzdGF0ZSwgb3IgTlVM TCAqLwp9IERvbWFpbkNvbnN0cmFpbnRTdGF0ZTsKCi8qCiAqIFN0YXRlIGZvciBKc29uRXhw ciBldmFsdWF0aW9uLCB0b28gYmlnIHRvIGlubGluZS4KICoKICogVGhpcyBjb250YWlucyB0 aGUgaW5mb3JtYXRpb24gZ29pbmcgaW50byBhbmQgY29taW5nIG91dCBvZiB0aGUKICogRUVP UF9KU09ORVhQUl9QQVRIIGV2YWwgc3RlcC4KICovCnR5cGVkZWYgc3RydWN0IEpzb25FeHBy U3RhdGUKewoJLyogb3JpZ2luYWwgZXhwcmVzc2lvbiBub2RlICovCglKc29uRXhwciAgICpq c2V4cHI7CgoJLyogdmFsdWUvaXNudWxsIGZvciBmb3JtYXR0ZWRfZXhwciAqLwoJTnVsbGFi bGVEYXR1bSBmb3JtYXR0ZWRfZXhwcjsKCgkvKiB2YWx1ZS9pc251bGwgZm9yIHBhdGhzcGVj ICovCglOdWxsYWJsZURhdHVtIHBhdGhzcGVjOwoKCS8qIEpzb25QYXRoVmFyaWFibGUgZW50 cmllcyBmb3IgcGFzc2luZ192YWx1ZXMgKi8KCUxpc3QJICAgKmFyZ3M7CgoJLyoKCSAqIE91 dHB1dCB2YXJpYWJsZXMgdGhhdCBkcml2ZSB0aGUgRUVPUF9KVU1QX0lGX05PVF9UUlVFIHN0 ZXBzIHRoYXQgYXJlCgkgKiBhZGRlZCBmb3IgT04gRVJST1IgYW5kIE9OIEVNUFRZIGV4cHJl c3Npb25zLCBpZiBhbnkuCgkgKgoJICogUmVzZXQgZm9yIGVhY2ggZXZhbHVhdGlvbiBvZiBF RU9QX0pTT05FWFBSX1BBVEguCgkgKi8KCgkvKiBTZXQgdG8gdHJ1ZSBpZiBqc29ucGF0aCBl dmFsdWF0aW9uIGNhdXNlIGFuIGVycm9yLiAgKi8KCU51bGxhYmxlRGF0dW0gZXJyb3I7CgoJ LyogU2V0IHRvIHRydWUgaWYgdGhlIGpzb25wYXRoIGV2YWx1YXRpb24gcmV0dXJuZWQgMCBp dGVtcy4gKi8KCU51bGxhYmxlRGF0dW0gZW1wdHk7CgoJLyoKCSAqIEFkZHJlc3NlcyBvZiBz dGVwcyB0aGF0IGltcGxlbWVudCB0aGUgbm9uLUVSUk9SIHZhcmlhbnQgb2YgT04gRU1QVFkg YW5kCgkgKiBPTiBFUlJPUiBiZWhhdmlvcnMsIHJlc3BlY3RpdmVseS4KCSAqLwoJaW50CQkJ anVtcF9lbXB0eTsKCWludAkJCWp1bXBfZXJyb3I7CgoJLyoKCSAqIEFkZHJlc3Mgb2YgdGhl IHN0ZXAgdG8gY29lcmNlIHRoZSByZXN1bHQgdmFsdWUgb2YganNvbnBhdGggZXZhbHVhdGlv bgoJICogdG8gdGhlIFJFVFVSTklORyB0eXBlLiAgLTEgaWYgbm8gY29lcmNpb24gaWYgSnNv bkV4cHIudXNlX2lvX2NvZXJjaW9uCgkgKiBpcyB0cnVlLgoJICovCglpbnQJCQlqdW1wX2V2 YWxfY29lcmNpb247CgoJLyoKCSAqIEFkZHJlc3MgdG8ganVtcCB0byB3aGVuIHNraXBwaW5n IGFsbCB0aGUgc3RlcHMgYWZ0ZXIgcGVyZm9ybWluZwoJICogRXhlY0V2YWxKc29uRXhwclBh dGgoKSBzbyBhcyB0byByZXR1cm4gd2hhdGV2ZXIgdGhlIEpzb25QYXRoKiBmdW5jdGlvbgoJ ICogcmV0dXJuZWQgYXMgaXMsIHRoYXQgaXMsIGluIHRoZSBjYXNlcyB3aGVyZSB0aGVyZSdz IG5vIGVycm9yIGFuZCBubwoJICogY29lcmNpb24gaXMgbmVjZXNzYXJ5LgoJICovCglpbnQJ CQlqdW1wX2VuZDsKCgkvKgoJICogUkVUVVJOSU5HIHR5cGUgaW5wdXQgZnVuY3Rpb24gaW52 b2NhdGlvbiBpbmZvIHdoZW4KCSAqIEpzb25FeHByLnVzZV9pb19jb2VyY2lvbiBpcyB0cnVl LgoJICovCglGdW5jdGlvbkNhbGxJbmZvIGlucHV0X2ZjaW5mbzsKCgkvKgoJICogRm9yIGVy cm9yLXNhZmUgZXZhbHVhdGlvbiBvZiBjb2VyY2lvbnMuICBXaGVuIHRoZSBPTiBFUlJPUiBi ZWhhdmlvciBpcwoJICogbm90IEVSUk9SLCBhIHBvaW50ZXIgdG8gdGhpcyBpcyBwYXNzZWQg dG8gRXhlY0luaXRFeHByUmVjKCkgd2hlbgoJICogaW5pdGlhbGl6aW5nIHRoZSBjb2VyY2lv biBleHByZXNzaW9ucyBvciB0byBFeGVjSW5pdEpzb25Db2VyY2lvbigpLgoJICoKCSAqIFJl c2V0IGZvciBlYWNoIGV2YWx1YXRpb24gb2YgRUVPUF9KU09ORVhQUl9QQVRILgoJICovCglF cnJvclNhdmVDb250ZXh0IGVzY29udGV4dDsKfSBKc29uRXhwclN0YXRlOwoKCi8qIC0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0KICoJCQkJIEV4ZWN1dG9yIFN0YXRlIFRyZWVzCiAqCiAqIEFuIGV4ZWN1dGluZyBx dWVyeSBoYXMgYSBQbGFuU3RhdGUgdHJlZSBwYXJhbGxlbGluZyB0aGUgUGxhbiB0cmVlCiAq IHRoYXQgZGVzY3JpYmVzIHRoZSBwbGFuLgogKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAqLwoKLyogLS0tLS0t LS0tLS0tLS0tLQogKgkgRXhlY1Byb2NOb2RlTXRkCiAqCiAqIFRoaXMgaXMgdGhlIG1ldGhv ZCBjYWxsZWQgYnkgRXhlY1Byb2NOb2RlIHRvIHJldHVybiB0aGUgbmV4dCB0dXBsZQogKiBm cm9tIGFuIGV4ZWN1dG9yIG5vZGUuICBJdCByZXR1cm5zIE5VTEwsIG9yIGFuIGVtcHR5IFR1 cGxlVGFibGVTbG90LAogKiBpZiBubyBtb3JlIHR1cGxlcyBhcmUgYXZhaWxhYmxlLgogKiAt LS0tLS0tLS0tLS0tLS0tCiAqLwp0eXBlZGVmIFR1cGxlVGFibGVTbG90ICooKkV4ZWNQcm9j Tm9kZU10ZCkgKFBsYW5TdGF0ZSAqcHN0YXRlKTsKCi8qIC0tLS0tLS0tLS0tLS0tLS0KICoJ CVBsYW5TdGF0ZSBub2RlCiAqCiAqIFdlIG5ldmVyIGFjdHVhbGx5IGluc3RhbnRpYXRlIGFu eSBQbGFuU3RhdGUgbm9kZXM7IHRoaXMgaXMganVzdCB0aGUgY29tbW9uCiAqIGFic3RyYWN0 IHN1cGVyY2xhc3MgZm9yIGFsbCBQbGFuU3RhdGUtdHlwZSBub2Rlcy4KICogLS0tLS0tLS0t LS0tLS0tLQogKi8KdHlwZWRlZiBzdHJ1Y3QgUGxhblN0YXRlCnsKCXBnX25vZGVfYXR0cihh YnN0cmFjdCkKCglOb2RlVGFnCQl0eXBlOwoKCVBsYW4JICAgKnBsYW47CQkJLyogYXNzb2Np YXRlZCBQbGFuIG5vZGUgKi8KCglFU3RhdGUJICAgKnN0YXRlOwkJCS8qIGF0IGV4ZWN1dGlv biB0aW1lLCBzdGF0ZXMgb2YgaW5kaXZpZHVhbAoJCQkJCQkJCSAqIG5vZGVzIHBvaW50IHRv IG9uZSBFU3RhdGUgZm9yIHRoZSB3aG9sZQoJCQkJCQkJCSAqIHRvcC1sZXZlbCBwbGFuICov CgoJRXhlY1Byb2NOb2RlTXRkIEV4ZWNQcm9jTm9kZTsJLyogZnVuY3Rpb24gdG8gcmV0dXJu IG5leHQgdHVwbGUgKi8KCUV4ZWNQcm9jTm9kZU10ZCBFeGVjUHJvY05vZGVSZWFsOwkvKiBh Y3R1YWwgZnVuY3Rpb24sIGlmIGFib3ZlIGlzIGEKCQkJCQkJCQkJCSAqIHdyYXBwZXIgKi8K CglOb2RlSW5zdHJ1bWVudGF0aW9uICppbnN0cnVtZW50OwkvKiBPcHRpb25hbCBydW50aW1l IHN0YXRzIGZvciB0aGlzCgkJCQkJCQkJCQkgKiBub2RlICovCglXb3JrZXJOb2RlSW5zdHJ1 bWVudGF0aW9uICp3b3JrZXJfaW5zdHJ1bWVudDsJLyogcGVyLXdvcmtlcgoJCQkJCQkJCQkJ CQkJICogaW5zdHJ1bWVudGF0aW9uICovCgoJLyogUGVyLXdvcmtlciBKSVQgaW5zdHJ1bWVu dGF0aW9uICovCglzdHJ1Y3QgU2hhcmVkSml0SW5zdHJ1bWVudGF0aW9uICp3b3JrZXJfaml0 X2luc3RydW1lbnQ7CgoJLyoKCSAqIENvbW1vbiBzdHJ1Y3R1cmFsIGRhdGEgZm9yIGFsbCBQ bGFuIHR5cGVzLiAgVGhlc2UgbGlua3MgdG8gc3Vic2lkaWFyeQoJICogc3RhdGUgdHJlZXMg cGFyYWxsZWwgbGlua3MgaW4gdGhlIGFzc29jaWF0ZWQgcGxhbiB0cmVlIChleGNlcHQgZm9y IHRoZQoJICogc3ViUGxhbiBsaXN0LCB3aGljaCBkb2VzIG5vdCBleGlzdCBpbiB0aGUgcGxh biB0cmVlKS4KCSAqLwoJRXhwclN0YXRlICAqcXVhbDsJCQkvKiBib29sZWFuIHF1YWwgY29u ZGl0aW9uICovCglQbGFuU3RhdGUgICpsZWZ0dHJlZTsJCS8qIGlucHV0IHBsYW4gdHJlZShz KSAqLwoJUGxhblN0YXRlICAqcmlnaHR0cmVlOwoKCUxpc3QJICAgKmluaXRQbGFuOwkJLyog SW5pdCBTdWJQbGFuU3RhdGUgbm9kZXMgKHVuLWNvcnJlbGF0ZWQgZXhwcgoJCQkJCQkJCSAq IHN1YnNlbGVjdHMpICovCglMaXN0CSAgICpzdWJQbGFuOwkJLyogU3ViUGxhblN0YXRlIG5v ZGVzIGluIG15IGV4cHJlc3Npb25zICovCgoJLyoKCSAqIFN0YXRlIGZvciBtYW5hZ2VtZW50 IG9mIHBhcmFtZXRlci1jaGFuZ2UtZHJpdmVuIHJlc2Nhbm5pbmcKCSAqLwoJQml0bWFwc2V0 ICAqY2hnUGFyYW07CQkvKiBzZXQgb2YgSURzIG9mIGNoYW5nZWQgUGFyYW1zICovCgoJLyoK CSAqIE90aGVyIHJ1bi10aW1lIHN0YXRlIG5lZWRlZCBieSBtb3N0IGlmIG5vdCBhbGwgbm9k ZSB0eXBlcy4KCSAqLwoJVHVwbGVEZXNjCXBzX1Jlc3VsdFR1cGxlRGVzYzsgLyogbm9kZSdz IHJldHVybiB0eXBlICovCglUdXBsZVRhYmxlU2xvdCAqcHNfUmVzdWx0VHVwbGVTbG90OyAv KiBzbG90IGZvciBteSByZXN1bHQgdHVwbGVzICovCglFeHByQ29udGV4dCAqcHNfRXhwckNv bnRleHQ7CS8qIG5vZGUncyBleHByZXNzaW9uLWV2YWx1YXRpb24gY29udGV4dCAqLwoJUHJv amVjdGlvbkluZm8gKnBzX1Byb2pJbmZvOwkvKiBpbmZvIGZvciBkb2luZyB0dXBsZSBwcm9q ZWN0aW9uICovCgoJYm9vbAkJYXN5bmNfY2FwYWJsZTsJLyogdHJ1ZSBpZiBub2RlIGlzIGFz eW5jLWNhcGFibGUgKi8KCgkvKgoJICogU2NhbnNsb3QncyBkZXNjcmlwdG9yIGlmIGtub3du LiBUaGlzIGlzIGEgYml0IG9mIGEgaGFjaywgYnV0IG90aGVyd2lzZQoJICogaXQncyBoYXJk IGZvciBleHByZXNzaW9uIGNvbXBpbGF0aW9uIHRvIG9wdGltaXplIGJhc2VkIG9uIHRoZQoJ ICogZGVzY3JpcHRvciwgd2l0aG91dCBlbmNvZGluZyBrbm93bGVkZ2UgYWJvdXQgYWxsIGV4 ZWN1dG9yIG5vZGVzLgoJICovCglUdXBsZURlc2MJc2NhbmRlc2M7CgoJLyoKCSAqIERlZmlu ZSB0aGUgc2xvdCB0eXBlcyBmb3IgaW5uZXIsIG91dGVyIGFuZCBzY2Fuc2xvdHMgZm9yIGV4 cHJlc3Npb24KCSAqIGNvbnRleHRzIHdpdGggdGhpcyBzdGF0ZSBhcyBhIHBhcmVudC4gIElm ICpvcHNzZXQgaXMgc2V0LCB0aGVuCgkgKiAqb3BzZml4ZWQgaW5kaWNhdGVzIHdoZXRoZXIg Km9wcyBpcyBndWFyYW50ZWVkIHRvIGJlIHRoZSB0eXBlIG9mIHNsb3QKCSAqIHVzZWQuIFRo YXQgbWVhbnMgdGhhdCBldmVyeSBzbG90IGluIHRoZSBjb3JyZXNwb25kaW5nCgkgKiBFeHBy Q29udGV4dC5lY3h0Xyp0dXBsZSB3aWxsIHBvaW50IHRvIGEgc2xvdCBvZiB0aGF0IHR5cGUs IHdoaWxlCgkgKiBldmFsdWF0aW5nIHRoZSBleHByZXNzaW9uLiAgSWYgKm9wc2ZpeGVkIGlz IGZhbHNlLCBidXQgKm9wcyBpcyBzZXQsCgkgKiB0aGF0IGluZGljYXRlcyB0aGUgbW9zdCBs aWtlbHkgdHlwZSBvZiBzbG90LgoJICoKCSAqIFRoZSBzY2FuKiBmaWVsZHMgYXJlIHNldCBi eSBFeGVjSW5pdFNjYW5UdXBsZVNsb3QoKS4gSWYgdGhhdCdzIG5vdAoJICogY2FsbGVkLCBu b2RlcyBjYW4gaW5pdGlhbGl6ZSB0aGUgZmllbGRzIHRoZW1zZWx2ZXMuCgkgKgoJICogSWYg b3V0ZXIvaW5uZXJvcHNzZXQgaXMgZmFsc2UsIHRoZSBpbmZvcm1hdGlvbiBpcyBpbmZlcnJl ZCBvbi1kZW1hbmQKCSAqIHVzaW5nIEV4ZWNHZXRSZXN1bHRTbG90T3BzKCkgb24gLT5yaWdo dHRyZWUvbGVmdHRyZWUsIHVzaW5nIHRoZQoJICogY29ycmVzcG9uZGluZyBub2RlJ3MgcmVz dWx0b3BzKiBmaWVsZHMuCgkgKgoJICogVGhlIHJlc3VsdCogZmllbGRzIGFyZSBhdXRvbWF0 aWNhbGx5IHNldCB3aGVuIEV4ZWNJbml0UmVzdWx0U2xvdCBpcwoJICogdXNlZCAoYmUgaXQg ZGlyZWN0bHkgb3Igd2hlbiB0aGUgc2xvdCBpcyBjcmVhdGVkIGJ5CgkgKiBFeGVjQXNzaWdu U2NhblByb2plY3Rpb25JbmZvKCkgLwoJICogRXhlY0NvbmRpdGlvbmFsQXNzaWduUHJvamVj dGlvbkluZm8oKSkuICBJZiBubyBwcm9qZWN0aW9uIGlzIG5lY2Vzc2FyeQoJICogRXhlY0Nv bmRpdGlvbmFsQXNzaWduUHJvamVjdGlvbkluZm8oKSBkZWZhdWx0cyB0aG9zZSBmaWVsZHMg dG8gdGhlIHNjYW4KCSAqIG9wZXJhdGlvbnMuCgkgKi8KCWNvbnN0IFR1cGxlVGFibGVTbG90 T3BzICpzY2Fub3BzOwoJY29uc3QgVHVwbGVUYWJsZVNsb3RPcHMgKm91dGVyb3BzOwoJY29u c3QgVHVwbGVUYWJsZVNsb3RPcHMgKmlubmVyb3BzOwoJY29uc3QgVHVwbGVUYWJsZVNsb3RP cHMgKnJlc3VsdG9wczsKCWJvb2wJCXNjYW5vcHNmaXhlZDsKCWJvb2wJCW91dGVyb3BzZml4 ZWQ7Cglib29sCQlpbm5lcm9wc2ZpeGVkOwoJYm9vbAkJcmVzdWx0b3BzZml4ZWQ7Cglib29s CQlzY2Fub3Bzc2V0OwoJYm9vbAkJb3V0ZXJvcHNzZXQ7Cglib29sCQlpbm5lcm9wc3NldDsK CWJvb2wJCXJlc3VsdG9wc3NldDsKfSBQbGFuU3RhdGU7CgovKiAtLS0tLS0tLS0tLS0tLS0t CiAqCXRoZXNlIGFyZSBkZWZpbmVkIHRvIGF2b2lkIGNvbmZ1c2lvbiBwcm9ibGVtcyB3aXRo ICJsZWZ0IgogKglhbmQgInJpZ2h0IiBhbmQgImlubmVyIiBhbmQgIm91dGVyIi4gIFRoZSBj b252ZW50aW9uIGlzIHRoYXQKICoJdGhlICJsZWZ0IiBwbGFuIGlzIHRoZSAib3V0ZXIiIHBs YW4gYW5kIHRoZSAicmlnaHQiIHBsYW4gaXMKICoJdGhlIGlubmVyIHBsYW4sIGJ1dCB0aGVz ZSBtYWtlIHRoZSBjb2RlIG1vcmUgcmVhZGFibGUuCiAqIC0tLS0tLS0tLS0tLS0tLS0KICov CiNkZWZpbmUgaW5uZXJQbGFuU3RhdGUobm9kZSkJCSgoKFBsYW5TdGF0ZSAqKShub2RlKSkt PnJpZ2h0dHJlZSkKI2RlZmluZSBvdXRlclBsYW5TdGF0ZShub2RlKQkJKCgoUGxhblN0YXRl ICopKG5vZGUpKS0+bGVmdHRyZWUpCgovKiBNYWNyb3MgZm9yIGlubGluZSBhY2Nlc3MgdG8g Y2VydGFpbiBpbnN0cnVtZW50YXRpb24gY291bnRlcnMgKi8KI2RlZmluZSBJbnN0ckNvdW50 VHVwbGVzMihub2RlLCBkZWx0YSkgXAoJZG8geyBcCgkJaWYgKCgoUGxhblN0YXRlICopKG5v ZGUpKS0+aW5zdHJ1bWVudCkgXAoJCQkoKFBsYW5TdGF0ZSAqKShub2RlKSktPmluc3RydW1l bnQtPm50dXBsZXMyICs9IChkZWx0YSk7IFwKCX0gd2hpbGUgKDApCiNkZWZpbmUgSW5zdHJD b3VudEZpbHRlcmVkMShub2RlLCBkZWx0YSkgXAoJZG8geyBcCgkJaWYgKCgoUGxhblN0YXRl ICopKG5vZGUpKS0+aW5zdHJ1bWVudCkgXAoJCQkoKFBsYW5TdGF0ZSAqKShub2RlKSktPmlu c3RydW1lbnQtPm5maWx0ZXJlZDEgKz0gKGRlbHRhKTsgXAoJfSB3aGlsZSgwKQojZGVmaW5l IEluc3RyQ291bnRGaWx0ZXJlZDIobm9kZSwgZGVsdGEpIFwKCWRvIHsgXAoJCWlmICgoKFBs YW5TdGF0ZSAqKShub2RlKSktPmluc3RydW1lbnQpIFwKCQkJKChQbGFuU3RhdGUgKikobm9k ZSkpLT5pbnN0cnVtZW50LT5uZmlsdGVyZWQyICs9IChkZWx0YSk7IFwKCX0gd2hpbGUoMCkK Ci8qCiAqIEVQUVN0YXRlIGlzIHN0YXRlIGZvciBleGVjdXRpbmcgYW4gRXZhbFBsYW5RdWFs IHJlY2hlY2sgb24gYSBjYW5kaWRhdGUKICogdHVwbGVzIGUuZy4gaW4gTW9kaWZ5VGFibGUg b3IgTG9ja1Jvd3MuCiAqCiAqIFRvIGV4ZWN1dGUgRVBRIGEgc2VwYXJhdGUgRVN0YXRlIGlz IGNyZWF0ZWQgKHN0b3JlZCBpbiAtPnJlY2hlY2tlc3RhdGUpLAogKiB3aGljaCBzaGFyZXMg c29tZSByZXNvdXJjZXMsIGxpa2UgdGhlIHJhbmdldGFibGUsIHdpdGggdGhlIG1haW4gcXVl cnkncwogKiBFU3RhdGUgKHN0b3JlZCBpbiAtPnBhcmVudGVzdGF0ZSkuIFRoZSAoc3ViLSl0 cmVlIG9mIHRoZSBwbGFuIHRoYXQgbmVlZHMgdG8KICogYmUgcmVjaGVja2VkIChpbiAtPnBs YW4pLCBpcyBzZXBhcmF0ZWx5IGluaXRpYWxpemVkIChpbnRvCiAqIC0+cmVjaGVja3BsYW5z dGF0ZSksIGJ1dCBzaGFyZXMgcGxhbiBub2RlcyB3aXRoIHRoZSBjb3JyZXNwb25kaW5nIG5v ZGVzIGluCiAqIHRoZSBtYWluIHF1ZXJ5LiBUaGUgc2NhbiBub2RlcyBpbiB0aGF0IHNlcGFy YXRlIGV4ZWN1dG9yIHRyZWUgYXJlIGNoYW5nZWQKICogdG8gcmV0dXJuIG9ubHkgdGhlIGN1 cnJlbnQgdHVwbGUgb2YgaW50ZXJlc3QgZm9yIHRoZSByZXNwZWN0aXZlCiAqIHRhYmxlLiBU aG9zZSB0dXBsZXMgYXJlIGVpdGhlciBwcm92aWRlZCBieSB0aGUgY2FsbGVyICh1c2luZwog KiBFdmFsUGxhblF1YWxTbG90KSwgYW5kL29yIGZvdW5kIHVzaW5nIHRoZSByb3dtYXJrIG1l Y2hhbmlzbSAobm9uLWxvY2tpbmcKICogcm93bWFya3MgYnkgdGhlIEVQUSBtYWNoaW5lcnkg aXRzZWxmLCBsb2NraW5nIG9uZXMgYnkgdGhlIGNhbGxlcikuCiAqCiAqIFdoaWxlIHRoZSBw bGFuIHRvIGJlIGNoZWNrZWQgbWF5IGJlIGNoYW5nZWQgdXNpbmcgRXZhbFBsYW5RdWFsU2V0 UGxhbigpLAogKiBhbGwgc3VjaCBwbGFucyBuZWVkIHRvIHNoYXJlIHRoZSBzYW1lIEVTdGF0 ZS4KICovCnR5cGVkZWYgc3RydWN0IEVQUVN0YXRlCnsKCS8qIFRoZXNlIGFyZSBpbml0aWFs aXplZCBieSBFdmFsUGxhblF1YWxJbml0KCkgYW5kIGRvIG5vdCBjaGFuZ2UgbGF0ZXI6ICov CglFU3RhdGUJICAgKnBhcmVudGVzdGF0ZTsJLyogbWFpbiBxdWVyeSdzIEVTdGF0ZSAqLwoJ aW50CQkJZXBxUGFyYW07CQkvKiBJRCBvZiBQYXJhbSB0byBmb3JjZSBzY2FuIG5vZGUgcmUt ZXZhbCAqLwoJTGlzdAkgICAqcmVzdWx0UmVsYXRpb25zOwkvKiBpbnRlZ2VyIGxpc3Qgb2Yg UlQgaW5kZXhlcywgb3IgTklMICovCgoJLyoKCSAqIHJlbHN1YnNfc2xvdFtzY2FucmVsaWQg LSAxXSBob2xkcyB0aGUgRVBRIHRlc3QgdHVwbGUgdG8gYmUgcmV0dXJuZWQgYnkKCSAqIHRo ZSBzY2FuIG5vZGUgZm9yIHRoZSBzY2FucmVsaWQndGggUlQgaW5kZXgsIGluIHBsYWNlIG9m IHBlcmZvcm1pbmcgYW4KCSAqIGFjdHVhbCB0YWJsZSBzY2FuLiAgQ2FsbGVycyBzaG91bGQg dXNlIEV2YWxQbGFuUXVhbFNsb3QoKSB0byBmZXRjaAoJICogdGhlc2Ugc2xvdHMuCgkgKi8K CUxpc3QJICAgKnR1cGxlX3RhYmxlOwkvKiB0dXBsZSB0YWJsZSBmb3IgcmVsc3Vic19zbG90 ICovCglUdXBsZVRhYmxlU2xvdCAqKnJlbHN1YnNfc2xvdDsKCgkvKgoJICogSW5pdGlhbGl6 ZWQgYnkgRXZhbFBsYW5RdWFsSW5pdCgpLCBtYXkgYmUgY2hhbmdlZCBsYXRlciB3aXRoCgkg KiBFdmFsUGxhblF1YWxTZXRQbGFuKCk6CgkgKi8KCglQbGFuCSAgICpwbGFuOwkJCS8qIHBs YW4gdHJlZSB0byBiZSBleGVjdXRlZCAqLwoJTGlzdAkgICAqYXJvd01hcmtzOwkJLyogRXhl Y0F1eFJvd01hcmtzIChub24tbG9ja2luZyBvbmx5KSAqLwoKCgkvKgoJICogVGhlIG9yaWdp bmFsIG91dHB1dCB0dXBsZSB0byBiZSByZWNoZWNrZWQuICBTZXQgYnkKCSAqIEV2YWxQbGFu UXVhbFNldFNsb3QoKSwgYmVmb3JlIEV2YWxQbGFuUXVhbE5leHQoKSBvciBFdmFsUGxhblF1 YWwoKSBtYXkKCSAqIGJlIGNhbGxlZC4KCSAqLwoJVHVwbGVUYWJsZVNsb3QgKm9yaWdzbG90 OwoKCgkvKiBJbml0aWFsaXplZCBvciByZXNldCBieSBFdmFsUGxhblF1YWxCZWdpbigpOiAq LwoKCUVTdGF0ZQkgICAqcmVjaGVja2VzdGF0ZTsJLyogRVN0YXRlIGZvciBFUFEgZXhlY3V0 aW9uLCBzZWUgYWJvdmUgKi8KCgkvKgoJICogUm93bWFya3MgdGhhdCBjYW4gYmUgZmV0Y2hl ZCBvbi1kZW1hbmQgdXNpbmcKCSAqIEV2YWxQbGFuUXVhbEZldGNoUm93TWFyaygpLCBpbmRl eGVkIGJ5IHNjYW5yZWxpZCAtIDEuIE9ubHkgbm9uLWxvY2tpbmcKCSAqIHJvd21hcmtzLgoJ ICovCglFeGVjQXV4Um93TWFyayAqKnJlbHN1YnNfcm93bWFyazsKCgkvKgoJICogcmVsc3Vi c19kb25lW3NjYW5yZWxpZCAtIDFdIGlzIHRydWUgaWYgdGhlcmUgaXMgbm8gRVBRIHR1cGxl IGZvciB0aGlzCgkgKiB0YXJnZXQgcmVsYXRpb24gb3IgaXQgaGFzIGFscmVhZHkgYmVlbiBm ZXRjaGVkIGluIHRoZSBjdXJyZW50IHNjYW4gb2YKCSAqIHRoaXMgdGFyZ2V0IHJlbGF0aW9u IHdpdGhpbiB0aGUgY3VycmVudCBFdmFsUGxhblF1YWwgdGVzdC4KCSAqLwoJYm9vbAkgICAq cmVsc3Vic19kb25lOwoKCS8qCgkgKiByZWxzdWJzX2Jsb2NrZWRbc2NhbnJlbGlkIC0gMV0g aXMgdHJ1ZSBpZiB0aGVyZSBpcyBubyBFUFEgdHVwbGUgZm9yCgkgKiB0aGlzIHRhcmdldCBy ZWxhdGlvbiBkdXJpbmcgdGhlIGN1cnJlbnQgRXZhbFBsYW5RdWFsIHRlc3QuICBXZSBrZWVw CgkgKiB0aGVzZSBmbGFncyBzZXQgZm9yIGFsbCByZWxpZHMgbGlzdGVkIGluIHJlc3VsdFJl bGF0aW9ucywgYnV0CgkgKiB0cmFuc2llbnRseSBjbGVhciB0aGUgb25lIGZvciB0aGUgcmVs YXRpb24gd2hvc2UgdHVwbGUgaXMgYWN0dWFsbHkKCSAqIHBhc3NlZCB0byBFdmFsUGxhblF1 YWwoKS4KCSAqLwoJYm9vbAkgICAqcmVsc3Vic19ibG9ja2VkOwoKCVBsYW5TdGF0ZSAgKnJl Y2hlY2twbGFuc3RhdGU7CS8qIEVQUSBzcGVjaWZpYyBleGVjIG5vZGVzLCBmb3IgLT5wbGFu ICovCn0gRVBRU3RhdGU7CgoKLyogLS0tLS0tLS0tLS0tLS0tLQogKgkgUmVzdWx0U3RhdGUg aW5mb3JtYXRpb24KICogLS0tLS0tLS0tLS0tLS0tLQogKi8KdHlwZWRlZiBzdHJ1Y3QgUmVz dWx0U3RhdGUKewoJUGxhblN0YXRlCXBzOwkJCQkvKiBpdHMgZmlyc3QgZmllbGQgaXMgTm9k ZVRhZyAqLwoJRXhwclN0YXRlICAqcmVzY29uc3RhbnRxdWFsOwoJYm9vbAkJcnNfZG9uZTsJ CS8qIGFyZSB3ZSBkb25lPyAqLwoJYm9vbAkJcnNfY2hlY2txdWFsOwkvKiBkbyB3ZSBuZWVk IHRvIGNoZWNrIHRoZSBxdWFsPyAqLwp9IFJlc3VsdFN0YXRlOwoKLyogLS0tLS0tLS0tLS0t LS0tLQogKgkgUHJvamVjdFNldFN0YXRlIGluZm9ybWF0aW9uCiAqCiAqIE5vdGU6IGF0IGxl YXN0IG9uZSBvZiB0aGUgImVsZW1zIiB3aWxsIGJlIGEgU2V0RXhwclN0YXRlOyB0aGUgcmVz dCBhcmUKICogcmVndWxhciBFeHByU3RhdGVzLgogKiAtLS0tLS0tLS0tLS0tLS0tCiAqLwp0 eXBlZGVmIHN0cnVjdCBQcm9qZWN0U2V0U3RhdGUKewoJUGxhblN0YXRlCXBzOwkJCQkvKiBp dHMgZmlyc3QgZmllbGQgaXMgTm9kZVRhZyAqLwoJTm9kZQkgICoqZWxlbXM7CQkJLyogYXJy YXkgb2YgZXhwcmVzc2lvbiBzdGF0ZXMgKi8KCUV4cHJEb25lQ29uZCAqZWxlbWRvbmU7CQkv KiBhcnJheSBvZiBwZXItU1JGIGlzLWRvbmUgc3RhdGVzICovCglpbnQJCQluZWxlbXM7CQkJ LyogbGVuZ3RoIG9mIGVsZW1kb25lW10gYXJyYXkgKi8KCWJvb2wJCXBlbmRpbmdfc3JmX3R1 cGxlczsgLyogc3RpbGwgZXZhbHVhdGluZyBzcmZzIGluIHRsaXN0PyAqLwoJTWVtb3J5Q29u dGV4dCBhcmdjb250ZXh0OwkvKiBjb250ZXh0IGZvciBTUkYgYXJndW1lbnRzICovCn0gUHJv amVjdFNldFN0YXRlOwoKCi8qIGZsYWdzIGZvciBtdF9tZXJnZV9zdWJjb21tYW5kcyAqLwoj ZGVmaW5lIE1FUkdFX0lOU0VSVAkweDAxCiNkZWZpbmUgTUVSR0VfVVBEQVRFCTB4MDIKI2Rl ZmluZSBNRVJHRV9ERUxFVEUJMHgwNAoKLyogLS0tLS0tLS0tLS0tLS0tLQogKgkgTW9kaWZ5 VGFibGVTdGF0ZSBpbmZvcm1hdGlvbgogKiAtLS0tLS0tLS0tLS0tLS0tCiAqLwp0eXBlZGVm IHN0cnVjdCBNb2RpZnlUYWJsZVN0YXRlCnsKCVBsYW5TdGF0ZQlwczsJCQkJLyogaXRzIGZp cnN0IGZpZWxkIGlzIE5vZGVUYWcgKi8KCUNtZFR5cGUJCW9wZXJhdGlvbjsJCS8qIElOU0VS VCwgVVBEQVRFLCBERUxFVEUsIG9yIE1FUkdFICovCglib29sCQljYW5TZXRUYWc7CQkvKiBk byB3ZSBzZXQgdGhlIGNvbW1hbmQgdGFnL2VzX3Byb2Nlc3NlZD8gKi8KCWJvb2wJCW10X2Rv bmU7CQkvKiBhcmUgd2UgZG9uZT8gKi8KCWludAkJCW10X25yZWxzOwkJLyogbnVtYmVyIG9m IGVudHJpZXMgaW4gcmVzdWx0UmVsSW5mb1tdICovCglSZXN1bHRSZWxJbmZvICpyZXN1bHRS ZWxJbmZvOwkvKiBpbmZvIGFib3V0IHRhcmdldCByZWxhdGlvbihzKSAqLwoKCS8qCgkgKiBU YXJnZXQgcmVsYXRpb24gbWVudGlvbmVkIGluIHRoZSBvcmlnaW5hbCBzdGF0ZW1lbnQsIHVz ZWQgdG8gZmlyZQoJICogc3RhdGVtZW50LWxldmVsIHRyaWdnZXJzIGFuZCBhcyB0aGUgcm9v dCBmb3IgdHVwbGUgcm91dGluZy4gIChUaGlzCgkgKiBtaWdodCBwb2ludCB0byBvbmUgb2Yg dGhlIHJlc3VsdFJlbEluZm9bXSBlbnRyaWVzLCBidXQgaXQgY2FuIGFsc28gYmUgYQoJICog ZGlzdGluY3Qgc3RydWN0LikKCSAqLwoJUmVzdWx0UmVsSW5mbyAqcm9vdFJlc3VsdFJlbElu Zm87CgoJRVBRU3RhdGUJbXRfZXBxc3RhdGU7CS8qIGZvciBldmFsdWF0aW5nIEV2YWxQbGFu UXVhbCByZWNoZWNrcyAqLwoJYm9vbAkJZmlyZUJTVHJpZ2dlcnM7IC8qIGRvIHdlIG5lZWQg dG8gZmlyZSBzdG10IHRyaWdnZXJzPyAqLwoKCS8qCgkgKiBUaGVzZSBmaWVsZHMgYXJlIHVz ZWQgZm9yIGluaGVyaXRlZCBVUERBVEUgYW5kIERFTEVURSwgdG8gdHJhY2sgd2hpY2gKCSAq IHRhcmdldCByZWxhdGlvbiBhIGdpdmVuIHR1cGxlIGlzIGZyb20uICBJZiB0aGVyZSBhcmUg YSBsb3Qgb2YgdGFyZ2V0CgkgKiByZWxhdGlvbnMsIHdlIHVzZSBhIGhhc2ggdGFibGUgdG8g dHJhbnNsYXRlIHRhYmxlIE9JRHMgdG8KCSAqIHJlc3VsdFJlbEluZm9bXSBpbmRleGVzOyBv dGhlcndpc2UgbXRfcmVzdWx0T2lkSGFzaCBpcyBOVUxMLgoJICovCglpbnQJCQltdF9yZXN1 bHRPaWRBdHRubzsJLyogcmVzbm8gb2YgInRhYmxlb2lkIiBqdW5rIGF0dHIgKi8KCU9pZAkJ CW10X2xhc3RSZXN1bHRPaWQ7CS8qIGxhc3Qtc2VlbiB2YWx1ZSBvZiB0YWJsZW9pZCAqLwoJ aW50CQkJbXRfbGFzdFJlc3VsdEluZGV4OyAvKiBjb3JyZXNwb25kaW5nIGluZGV4IGluIHJl c3VsdFJlbEluZm9bXSAqLwoJSFRBQgkgICAqbXRfcmVzdWx0T2lkSGFzaDsJLyogb3B0aW9u YWwgaGFzaCB0YWJsZSB0byBzcGVlZCBsb29rdXBzICovCgoJLyoKCSAqIFNsb3QgZm9yIHN0 b3JpbmcgdHVwbGVzIGluIHRoZSByb290IHBhcnRpdGlvbmVkIHRhYmxlJ3Mgcm93dHlwZSBk dXJpbmcKCSAqIGFuIFVQREFURSBvZiBhIHBhcnRpdGlvbmVkIHRhYmxlLgoJICovCglUdXBs ZVRhYmxlU2xvdCAqbXRfcm9vdF90dXBsZV9zbG90OwoKCS8qIFR1cGxlLXJvdXRpbmcgc3Vw cG9ydCBpbmZvICovCglzdHJ1Y3QgUGFydGl0aW9uVHVwbGVSb3V0aW5nICptdF9wYXJ0aXRp b25fdHVwbGVfcm91dGluZzsKCgkvKiBjb250cm9scyB0cmFuc2l0aW9uIHRhYmxlIHBvcHVs YXRpb24gZm9yIHNwZWNpZmllZCBvcGVyYXRpb24gKi8KCXN0cnVjdCBUcmFuc2l0aW9uQ2Fw dHVyZVN0YXRlICptdF90cmFuc2l0aW9uX2NhcHR1cmU7CgoJLyogY29udHJvbHMgdHJhbnNp dGlvbiB0YWJsZSBwb3B1bGF0aW9uIGZvciBJTlNFUlQuLi5PTiBDT05GTElDVCBVUERBVEUg Ki8KCXN0cnVjdCBUcmFuc2l0aW9uQ2FwdHVyZVN0YXRlICptdF9vY190cmFuc2l0aW9uX2Nh cHR1cmU7CgoJLyogRmxhZ3Mgc2hvd2luZyB3aGljaCBzdWJjb21tYW5kcyBhcmUgcHJlc2Vu dCBJTlMvVVBEL0RFTC9ETyBOT1RISU5HICovCglpbnQJCQltdF9tZXJnZV9zdWJjb21tYW5k czsKCgkvKiBGb3IgTUVSR0UsIHRoZSBhY3Rpb24gY3VycmVudGx5IGJlaW5nIGV4ZWN1dGVk ICovCglNZXJnZUFjdGlvblN0YXRlICptdF9tZXJnZV9hY3Rpb247CgoJLyoKCSAqIEZvciBN RVJHRSwgaWYgdGhlcmUgaXMgYSBwZW5kaW5nIE5PVCBNQVRDSEVEIFtCWSBUQVJHRVRdIGFj dGlvbiB0byBiZQoJICogcGVyZm9ybWVkLCB0aGlzIHdpbGwgYmUgdGhlIGxhc3QgdHVwbGUg cmVhZCBmcm9tIHRoZSBzdWJwbGFuOyBvdGhlcndpc2UKCSAqIGl0IHdpbGwgYmUgTlVMTCAt LS0gc2VlIHRoZSBjb21tZW50cyBpbiBFeGVjTWVyZ2UoKS4KCSAqLwoJVHVwbGVUYWJsZVNs b3QgKm10X21lcmdlX3BlbmRpbmdfbm90X21hdGNoZWQ7CgoJLyogdHVwbGUgY291bnRlcnMg Zm9yIE1FUkdFICovCglkb3VibGUJCW10X21lcmdlX2luc2VydGVkOwoJZG91YmxlCQltdF9t ZXJnZV91cGRhdGVkOwoJZG91YmxlCQltdF9tZXJnZV9kZWxldGVkOwoKCS8qCgkgKiBMaXN0 cyBvZiB2YWxpZCB1cGRhdGVDb2xub3NMaXN0cywgbWVyZ2VBY3Rpb25MaXN0cywgYW5kCgkg KiBtZXJnZUpvaW5Db25kaXRpb25zLiAgVGhlc2UgY29udGFpbiBvbmx5IGVudHJpZXMgZm9y IHVucHJ1bmVkCgkgKiByZWxhdGlvbnMsIGZpbHRlcmVkIGZyb20gdGhlIGNvcnJlc3BvbmRp bmcgbGlzdHMgaW4gTW9kaWZ5VGFibGUuCgkgKi8KCUxpc3QJICAgKm10X3VwZGF0ZUNvbG5v c0xpc3RzOwoJTGlzdAkgICAqbXRfbWVyZ2VBY3Rpb25MaXN0czsKCUxpc3QJICAgKm10X21l cmdlSm9pbkNvbmRpdGlvbnM7Cn0gTW9kaWZ5VGFibGVTdGF0ZTsKCi8qIC0tLS0tLS0tLS0t LS0tLS0KICoJIEFwcGVuZFN0YXRlIGluZm9ybWF0aW9uCiAqCiAqCQlucGxhbnMJCQkJaG93 IG1hbnkgcGxhbnMgYXJlIGluIHRoZSBhcnJheQogKgkJd2hpY2hwbGFuCQkJd2hpY2ggc3lu Y2hyb25vdXMgcGxhbiBpcyBiZWluZyBleGVjdXRlZCAoMCAuLiBuLTEpCiAqCQkJCQkJCW9y IGEgc3BlY2lhbCBuZWdhdGl2ZSB2YWx1ZS4gU2VlIG5vZGVBcHBlbmQuYy4KICoJCXBydW5l X3N0YXRlCQkJZGV0YWlscyByZXF1aXJlZCB0byBhbGxvdyBwYXJ0aXRpb25zIHRvIGJlCiAq CQkJCQkJCWVsaW1pbmF0ZWQgZnJvbSB0aGUgc2Nhbiwgb3IgTlVMTCBpZiBub3QgcG9zc2li bGUuCiAqCQl2YWxpZF9zdWJwbGFucwkJZm9yIHJ1bnRpbWUgcHJ1bmluZywgdmFsaWQgc3lu Y2hyb25vdXMgYXBwZW5kcGxhbnMKICoJCQkJCQkJaW5kZXhlcyB0byBzY2FuLgogKiAtLS0t LS0tLS0tLS0tLS0tCiAqLwoKc3RydWN0IEFwcGVuZFN0YXRlOwp0eXBlZGVmIHN0cnVjdCBB cHBlbmRTdGF0ZSBBcHBlbmRTdGF0ZTsKc3RydWN0IFBhcmFsbGVsQXBwZW5kU3RhdGU7CnR5 cGVkZWYgc3RydWN0IFBhcmFsbGVsQXBwZW5kU3RhdGUgUGFyYWxsZWxBcHBlbmRTdGF0ZTsK c3RydWN0IFBhcnRpdGlvblBydW5lU3RhdGU7CgpzdHJ1Y3QgQXBwZW5kU3RhdGUKewoJUGxh blN0YXRlCXBzOwkJCQkvKiBpdHMgZmlyc3QgZmllbGQgaXMgTm9kZVRhZyAqLwoJUGxhblN0 YXRlICoqYXBwZW5kcGxhbnM7CS8qIGFycmF5IG9mIFBsYW5TdGF0ZXMgZm9yIG15IGlucHV0 cyAqLwoJaW50CQkJYXNfbnBsYW5zOwoJaW50CQkJYXNfd2hpY2hwbGFuOwoJYm9vbAkJYXNf YmVndW47CQkvKiBmYWxzZSBtZWFucyBuZWVkIHRvIGluaXRpYWxpemUgKi8KCUJpdG1hcHNl dCAgKmFzX2FzeW5jcGxhbnM7CS8qIGFzeW5jaHJvbm91cyBwbGFucyBpbmRleGVzICovCglp bnQJCQlhc19uYXN5bmNwbGFuczsgLyogIyBvZiBhc3luY2hyb25vdXMgcGxhbnMgKi8KCUFz eW5jUmVxdWVzdCAqKmFzX2FzeW5jcmVxdWVzdHM7CS8qIGFycmF5IG9mIEFzeW5jUmVxdWVz dHMgKi8KCVR1cGxlVGFibGVTbG90ICoqYXNfYXN5bmNyZXN1bHRzOwkvKiB1bnJldHVybmVk IHJlc3VsdHMgb2YgYXN5bmMgcGxhbnMgKi8KCWludAkJCWFzX25hc3luY3Jlc3VsdHM7CS8q ICMgb2YgdmFsaWQgZW50cmllcyBpbiBhc19hc3luY3Jlc3VsdHMgKi8KCWJvb2wJCWFzX3N5 bmNkb25lOwkvKiB0cnVlIGlmIGFsbCBzeW5jaHJvbm91cyBwbGFucyBkb25lIGluCgkJCQkJ CQkJICogYXN5bmNocm9ub3VzIG1vZGUsIGVsc2UgZmFsc2UgKi8KCWludAkJCWFzX25hc3lu Y3JlbWFpbjsJLyogIyBvZiByZW1haW5pbmcgYXN5bmNocm9ub3VzIHBsYW5zICovCglCaXRt YXBzZXQgICphc19uZWVkcmVxdWVzdDsgLyogYXN5bmNocm9ub3VzIHBsYW5zIG5lZWRpbmcg YSBuZXcgcmVxdWVzdCAqLwoJc3RydWN0IFdhaXRFdmVudFNldCAqYXNfZXZlbnRzZXQ7CS8q IFdhaXRFdmVudFNldCB1c2VkIHRvIGNvbmZpZ3VyZSBmaWxlCgkJCQkJCQkJCQkgKiBkZXNj cmlwdG9yIHdhaXQgZXZlbnRzICovCglpbnQJCQlhc19maXJzdF9wYXJ0aWFsX3BsYW47CS8q IEluZGV4IG9mICdhcHBlbmRwbGFucycgY29udGFpbmluZwoJCQkJCQkJCQkJICogdGhlIGZp cnN0IHBhcnRpYWwgcGxhbiAqLwoJUGFyYWxsZWxBcHBlbmRTdGF0ZSAqYXNfcHN0YXRlOyAv KiBwYXJhbGxlbCBjb29yZGluYXRpb24gaW5mbyAqLwoJU2l6ZQkJcHN0YXRlX2xlbjsJCS8q IHNpemUgb2YgcGFyYWxsZWwgY29vcmRpbmF0aW9uIGluZm8gKi8KCXN0cnVjdCBQYXJ0aXRp b25QcnVuZVN0YXRlICphc19wcnVuZV9zdGF0ZTsKCWJvb2wJCWFzX3ZhbGlkX3N1YnBsYW5z X2lkZW50aWZpZWQ7CS8qIGlzIGFzX3ZhbGlkX3N1YnBsYW5zIHZhbGlkPyAqLwoJQml0bWFw c2V0ICAqYXNfdmFsaWRfc3VicGxhbnM7CglCaXRtYXBzZXQgICphc192YWxpZF9hc3luY3Bs YW5zOwkvKiB2YWxpZCBhc3luY2hyb25vdXMgcGxhbnMgaW5kZXhlcyAqLwoJYm9vbAkJKCpj aG9vc2VfbmV4dF9zdWJwbGFuKSAoQXBwZW5kU3RhdGUgKik7Cn07CgovKiAtLS0tLS0tLS0t LS0tLS0tCiAqCSBNZXJnZUFwcGVuZFN0YXRlIGluZm9ybWF0aW9uCiAqCiAqCQlucGxhbnMJ CQlob3cgbWFueSBwbGFucyBhcmUgaW4gdGhlIGFycmF5CiAqCQlua2V5cwkJCW51bWJlciBv ZiBzb3J0IGtleSBjb2x1bW5zCiAqCQlzb3J0a2V5cwkJc29ydCBrZXlzIGluIFNvcnRTdXBw b3J0IHJlcHJlc2VudGF0aW9uCiAqCQlzbG90cwkJCWN1cnJlbnQgb3V0cHV0IHR1cGxlIG9m IGVhY2ggc3VicGxhbgogKgkJaGVhcAkJCWhlYXAgb2YgYWN0aXZlIHR1cGxlcwogKgkJaW5p dGlhbGl6ZWQJCXRydWUgaWYgd2UgaGF2ZSBmZXRjaGVkIGZpcnN0IHR1cGxlIGZyb20gZWFj aCBzdWJwbGFuCiAqCQlwcnVuZV9zdGF0ZQkJZGV0YWlscyByZXF1aXJlZCB0byBhbGxvdyBw YXJ0aXRpb25zIHRvIGJlCiAqCQkJCQkJZWxpbWluYXRlZCBmcm9tIHRoZSBzY2FuLCBvciBO VUxMIGlmIG5vdCBwb3NzaWJsZS4KICoJCXZhbGlkX3N1YnBsYW5zCWZvciBydW50aW1lIHBy dW5pbmcsIHZhbGlkIG1lcmdlcGxhbnMgaW5kZXhlcyB0bwogKgkJCQkJCXNjYW4uCiAqIC0t LS0tLS0tLS0tLS0tLS0KICovCnR5cGVkZWYgc3RydWN0IE1lcmdlQXBwZW5kU3RhdGUKewoJ UGxhblN0YXRlCXBzOwkJCQkvKiBpdHMgZmlyc3QgZmllbGQgaXMgTm9kZVRhZyAqLwoJUGxh blN0YXRlICoqbWVyZ2VwbGFuczsJCS8qIGFycmF5IG9mIFBsYW5TdGF0ZXMgZm9yIG15IGlu cHV0cyAqLwoJaW50CQkJbXNfbnBsYW5zOwoJaW50CQkJbXNfbmtleXM7CglTb3J0U3VwcG9y dCBtc19zb3J0a2V5czsJLyogYXJyYXkgb2YgbGVuZ3RoIG1zX25rZXlzICovCglUdXBsZVRh YmxlU2xvdCAqKm1zX3Nsb3RzOwkvKiBhcnJheSBvZiBsZW5ndGggbXNfbnBsYW5zICovCglz dHJ1Y3QgYmluYXJ5aGVhcCAqbXNfaGVhcDsgLyogYmluYXJ5IGhlYXAgb2Ygc2xvdCBpbmRp Y2VzICovCglib29sCQltc19pbml0aWFsaXplZDsgLyogYXJlIHN1YnBsYW5zIHN0YXJ0ZWQ/ ICovCglzdHJ1Y3QgUGFydGl0aW9uUHJ1bmVTdGF0ZSAqbXNfcHJ1bmVfc3RhdGU7CglCaXRt YXBzZXQgICptc192YWxpZF9zdWJwbGFuczsKfSBNZXJnZUFwcGVuZFN0YXRlOwoKLyogLS0t LS0tLS0tLS0tLS0tLQogKgkgUmVjdXJzaXZlVW5pb25TdGF0ZSBpbmZvcm1hdGlvbgogKgog KgkJUmVjdXJzaXZlVW5pb25TdGF0ZSBpcyB1c2VkIGZvciBwZXJmb3JtaW5nIGEgcmVjdXJz aXZlIHVuaW9uLgogKgogKgkJcmVjdXJzaW5nCQkJVCB3aGVuIHdlJ3JlIGRvbmUgc2Nhbm5p bmcgdGhlIG5vbi1yZWN1cnNpdmUgdGVybQogKgkJaW50ZXJtZWRpYXRlX2VtcHR5CVQgaWYg aW50ZXJtZWRpYXRlX3RhYmxlIGlzIGN1cnJlbnRseSBlbXB0eQogKgkJd29ya2luZ190YWJs ZQkJd29ya2luZyB0YWJsZSAodG8gYmUgc2Nhbm5lZCBieSByZWN1cnNpdmUgdGVybSkKICoJ CWludGVybWVkaWF0ZV90YWJsZQljdXJyZW50IHJlY3Vyc2l2ZSBvdXRwdXQgKG5leHQgZ2Vu ZXJhdGlvbiBvZiBXVCkKICogLS0tLS0tLS0tLS0tLS0tLQogKi8KdHlwZWRlZiBzdHJ1Y3Qg UmVjdXJzaXZlVW5pb25TdGF0ZQp7CglQbGFuU3RhdGUJcHM7CQkJCS8qIGl0cyBmaXJzdCBm aWVsZCBpcyBOb2RlVGFnICovCglib29sCQlyZWN1cnNpbmc7Cglib29sCQlpbnRlcm1lZGlh dGVfZW1wdHk7CglUdXBsZXN0b3Jlc3RhdGUgKndvcmtpbmdfdGFibGU7CglUdXBsZXN0b3Jl c3RhdGUgKmludGVybWVkaWF0ZV90YWJsZTsKCS8qIFJlbWFpbmluZyBmaWVsZHMgYXJlIHVu dXNlZCBpbiBVTklPTiBBTEwgY2FzZSAqLwoJT2lkCQkgICAqZXFmdW5jb2lkczsJCS8qIHBl ci1ncm91cGluZy1maWVsZCBlcXVhbGl0eSBmbnMgKi8KCUZtZ3JJbmZvICAgKmhhc2hmdW5j dGlvbnM7CS8qIHBlci1ncm91cGluZy1maWVsZCBoYXNoIGZucyAqLwoJTWVtb3J5Q29udGV4 dCB0ZW1wQ29udGV4dDsJLyogc2hvcnQtdGVybSBjb250ZXh0IGZvciBjb21wYXJpc29ucyAq LwoJVHVwbGVIYXNoVGFibGUgaGFzaHRhYmxlOwkvKiBoYXNoIHRhYmxlIGZvciB0dXBsZXMg YWxyZWFkeSBzZWVuICovCglNZW1vcnlDb250ZXh0IHR1cGxlc0NvbnRleHQ7CS8qIGNvbnRl eHQgY29udGFpbmluZyBoYXNoIHRhYmxlJ3MgdHVwbGVzICovCn0gUmVjdXJzaXZlVW5pb25T dGF0ZTsKCi8qIC0tLS0tLS0tLS0tLS0tLS0KICoJIEJpdG1hcEFuZFN0YXRlIGluZm9ybWF0 aW9uCiAqIC0tLS0tLS0tLS0tLS0tLS0KICovCnR5cGVkZWYgc3RydWN0IEJpdG1hcEFuZFN0 YXRlCnsKCVBsYW5TdGF0ZQlwczsJCQkJLyogaXRzIGZpcnN0IGZpZWxkIGlzIE5vZGVUYWcg Ki8KCVBsYW5TdGF0ZSAqKmJpdG1hcHBsYW5zOwkvKiBhcnJheSBvZiBQbGFuU3RhdGVzIGZv ciBteSBpbnB1dHMgKi8KCWludAkJCW5wbGFuczsJCQkvKiBudW1iZXIgb2YgaW5wdXQgcGxh bnMgKi8KfSBCaXRtYXBBbmRTdGF0ZTsKCi8qIC0tLS0tLS0tLS0tLS0tLS0KICoJIEJpdG1h cE9yU3RhdGUgaW5mb3JtYXRpb24KICogLS0tLS0tLS0tLS0tLS0tLQogKi8KdHlwZWRlZiBz dHJ1Y3QgQml0bWFwT3JTdGF0ZQp7CglQbGFuU3RhdGUJcHM7CQkJCS8qIGl0cyBmaXJzdCBm aWVsZCBpcyBOb2RlVGFnICovCglQbGFuU3RhdGUgKipiaXRtYXBwbGFuczsJLyogYXJyYXkg b2YgUGxhblN0YXRlcyBmb3IgbXkgaW5wdXRzICovCglpbnQJCQlucGxhbnM7CQkJLyogbnVt YmVyIG9mIGlucHV0IHBsYW5zICovCn0gQml0bWFwT3JTdGF0ZTsKCi8qIC0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0K ICoJCQkJIFNjYW4gU3RhdGUgSW5mb3JtYXRpb24KICogLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogKi8KCi8qIC0t LS0tLS0tLS0tLS0tLS0KICoJIFNjYW5TdGF0ZSBpbmZvcm1hdGlvbgogKgogKgkJU2NhblN0 YXRlIGV4dGVuZHMgUGxhblN0YXRlIGZvciBub2RlIHR5cGVzIHRoYXQgcmVwcmVzZW50CiAq CQlzY2FucyBvZiBhbiB1bmRlcmx5aW5nIHJlbGF0aW9uLiAgSXQgY2FuIGFsc28gYmUgdXNl ZCBmb3Igbm9kZXMKICoJCXRoYXQgc2NhbiB0aGUgb3V0cHV0IG9mIGFuIHVuZGVybHlpbmcg cGxhbiBub2RlIC0tLSBpbiB0aGF0IGNhc2UsCiAqCQlvbmx5IFNjYW5UdXBsZVNsb3QgaXMg YWN0dWFsbHkgdXNlZnVsLCBhbmQgaXQgcmVmZXJzIHRvIHRoZSB0dXBsZQogKgkJcmV0cmll dmVkIGZyb20gdGhlIHN1YnBsYW4uCiAqCiAqCQljdXJyZW50UmVsYXRpb24gICAgcmVsYXRp b24gYmVpbmcgc2Nhbm5lZCAoTlVMTCBpZiBub25lKQogKgkJY3VycmVudFNjYW5EZXNjICAg IGN1cnJlbnQgc2NhbiBkZXNjcmlwdG9yIGZvciBzY2FuIChOVUxMIGlmIG5vbmUpCiAqCQlT Y2FuVHVwbGVTbG90CSAgIHBvaW50ZXIgdG8gc2xvdCBpbiB0dXBsZSB0YWJsZSBob2xkaW5n IHNjYW4gdHVwbGUKICogLS0tLS0tLS0tLS0tLS0tLQogKi8KdHlwZWRlZiBzdHJ1Y3QgU2Nh blN0YXRlCnsKCVBsYW5TdGF0ZQlwczsJCQkJLyogaXRzIGZpcnN0IGZpZWxkIGlzIE5vZGVU YWcgKi8KCVJlbGF0aW9uCXNzX2N1cnJlbnRSZWxhdGlvbjsKCXN0cnVjdCBUYWJsZVNjYW5E ZXNjRGF0YSAqc3NfY3VycmVudFNjYW5EZXNjOwoJVHVwbGVUYWJsZVNsb3QgKnNzX1NjYW5U dXBsZVNsb3Q7Cn0gU2NhblN0YXRlOwoKLyogLS0tLS0tLS0tLS0tLS0tLQogKgkgU2VxU2Nh blN0YXRlIGluZm9ybWF0aW9uCiAqIC0tLS0tLS0tLS0tLS0tLS0KICovCnR5cGVkZWYgc3Ry dWN0IFNlcVNjYW5TdGF0ZQp7CglTY2FuU3RhdGUJc3M7CQkJCS8qIGl0cyBmaXJzdCBmaWVs ZCBpcyBOb2RlVGFnICovCglTaXplCQlwc2Nhbl9sZW47CQkvKiBzaXplIG9mIHBhcmFsbGVs IGhlYXAgc2NhbiBkZXNjcmlwdG9yICovCglzdHJ1Y3QgU2hhcmVkU2VxU2Nhbkluc3RydW1l bnRhdGlvbiAqc2luc3RydW1lbnQ7Cn0gU2VxU2NhblN0YXRlOwoKLyogLS0tLS0tLS0tLS0t LS0tLQogKgkgU2FtcGxlU2NhblN0YXRlIGluZm9ybWF0aW9uCiAqIC0tLS0tLS0tLS0tLS0t LS0KICovCnR5cGVkZWYgc3RydWN0IFNhbXBsZVNjYW5TdGF0ZQp7CglTY2FuU3RhdGUJc3M7 CglMaXN0CSAgICphcmdzOwkJCS8qIGV4cHIgc3RhdGVzIGZvciBUQUJMRVNBTVBMRSBwYXJh bXMgKi8KCUV4cHJTdGF0ZSAgKnJlcGVhdGFibGU7CQkvKiBleHByIHN0YXRlIGZvciBSRVBF QVRBQkxFIGV4cHIgKi8KCS8qIHVzZSBzdHJ1Y3QgcG9pbnRlciB0byBhdm9pZCBpbmNsdWRp bmcgdHNtYXBpLmggaGVyZSAqLwoJc3RydWN0IFRzbVJvdXRpbmUgKnRzbXJvdXRpbmU7CS8q IGRlc2NyaXB0b3IgZm9yIHRhYmxlc2FtcGxlIG1ldGhvZCAqLwoJdm9pZAkgICAqdHNtX3N0 YXRlOwkJLyogdGFibGVzYW1wbGUgbWV0aG9kIGNhbiBrZWVwIHN0YXRlIGhlcmUgKi8KCWJv b2wJCXVzZV9idWxrcmVhZDsJLyogdXNlIGJ1bGtyZWFkIGJ1ZmZlciBhY2Nlc3Mgc3RyYXRl Z3k/ICovCglib29sCQl1c2VfcGFnZW1vZGU7CS8qIHVzZSBwYWdlLWF0LWEtdGltZSB2aXNp YmlsaXR5IGNoZWNraW5nPyAqLwoJYm9vbAkJYmVndW47CQkJLyogZmFsc2UgbWVhbnMgbmVl ZCB0byBjYWxsIEJlZ2luU2FtcGxlU2NhbiAqLwoJdWludDMyCQlzZWVkOwkJCS8qIHJhbmRv bSBzZWVkICovCglpbnQ2NAkJZG9uZXR1cGxlczsJCS8qIG51bWJlciBvZiB0dXBsZXMgYWxy ZWFkeSByZXR1cm5lZCAqLwoJYm9vbAkJaGF2ZWJsb2NrOwkJLyogaGFzIGEgYmxvY2sgZm9y IHNhbXBsaW5nIGJlZW4gZGV0ZXJtaW5lZCAqLwoJYm9vbAkJZG9uZTsJCQkvKiBleGhhdXN0 ZWQgYWxsIHR1cGxlcz8gKi8KfSBTYW1wbGVTY2FuU3RhdGU7CgovKgogKiBUaGVzZSBzdHJ1 Y3RzIHN0b3JlIGluZm9ybWF0aW9uIGFib3V0IGluZGV4IHF1YWxzIHRoYXQgZG9uJ3QgaGF2 ZSBzaW1wbGUKICogY29uc3RhbnQgcmlnaHQtaGFuZCBzaWRlcy4gIFNlZSBjb21tZW50cyBm b3IgRXhlY0luZGV4QnVpbGRTY2FuS2V5cygpCiAqIGZvciBkaXNjdXNzaW9uLgogKi8KdHlw ZWRlZiBzdHJ1Y3QKewoJU2NhbktleURhdGEgKnNjYW5fa2V5OwkJLyogc2NhbmtleSB0byBw dXQgdmFsdWUgaW50byAqLwoJRXhwclN0YXRlICAqa2V5X2V4cHI7CQkvKiBleHByIHRvIGV2 YWx1YXRlIHRvIGdldCB2YWx1ZSAqLwoJYm9vbAkJa2V5X3RvYXN0YWJsZTsJLyogaXMgZXhw cidzIHJlc3VsdCBhIHRvYXN0YWJsZSBkYXRhdHlwZT8gKi8KfSBJbmRleFJ1bnRpbWVLZXlJ bmZvOwoKdHlwZWRlZiBzdHJ1Y3QKewoJU2NhbktleURhdGEgKnNjYW5fa2V5OwkJLyogc2Nh bmtleSB0byBwdXQgdmFsdWUgaW50byAqLwoJRXhwclN0YXRlICAqYXJyYXlfZXhwcjsJCS8q IGV4cHIgdG8gZXZhbHVhdGUgdG8gZ2V0IGFycmF5IHZhbHVlICovCglpbnQJCQluZXh0X2Vs ZW07CQkvKiBuZXh0IGFycmF5IGVsZW1lbnQgdG8gdXNlICovCglpbnQJCQludW1fZWxlbXM7 CQkvKiBudW1iZXIgb2YgZWxlbXMgaW4gY3VycmVudCBhcnJheSB2YWx1ZSAqLwoJRGF0dW0J ICAgKmVsZW1fdmFsdWVzOwkvKiBhcnJheSBvZiBudW1fZWxlbXMgRGF0dW1zICovCglib29s CSAgICplbGVtX251bGxzOwkJLyogYXJyYXkgb2YgbnVtX2VsZW1zIGlzLW51bGwgZmxhZ3Mg Ki8KfSBJbmRleEFycmF5S2V5SW5mbzsKCi8qIC0tLS0tLS0tLS0tLS0tLS0KICoJIEluZGV4 U2NhblN0YXRlIGluZm9ybWF0aW9uCiAqCiAqCQlpbmRleHF1YWxvcmlnCSAgIGV4ZWN1dGlv biBzdGF0ZSBmb3IgaW5kZXhxdWFsb3JpZyBleHByZXNzaW9ucwogKgkJaW5kZXhvcmRlcmJ5 b3JpZyAgIGV4ZWN1dGlvbiBzdGF0ZSBmb3IgaW5kZXhvcmRlcmJ5b3JpZyBleHByZXNzaW9u cwogKgkJU2NhbktleXMJCSAgIFNrZXkgc3RydWN0dXJlcyBmb3IgaW5kZXggcXVhbHMKICoJ CU51bVNjYW5LZXlzCQkgICBudW1iZXIgb2YgU2NhbktleXMKICoJCU9yZGVyQnlLZXlzCQkg ICBTa2V5IHN0cnVjdHVyZXMgZm9yIGluZGV4IG9yZGVyaW5nIG9wZXJhdG9ycwogKgkJTnVt T3JkZXJCeUtleXMJICAgbnVtYmVyIG9mIE9yZGVyQnlLZXlzCiAqCQlSdW50aW1lS2V5cwkJ ICAgaW5mbyBhYm91dCBTa2V5cyB0aGF0IG11c3QgYmUgZXZhbHVhdGVkIGF0IHJ1bnRpbWUK ICoJCU51bVJ1bnRpbWVLZXlzCSAgIG51bWJlciBvZiBSdW50aW1lS2V5cwogKgkJUnVudGlt ZUtleXNSZWFkeSAgIHRydWUgaWYgcnVudGltZSBTa2V5cyBoYXZlIGJlZW4gY29tcHV0ZWQK ICoJCVJ1bnRpbWVDb250ZXh0CSAgIGV4cHIgY29udGV4dCBmb3IgZXZhbGluZyBydW50aW1l IFNrZXlzCiAqCQlSZWxhdGlvbkRlc2MJICAgaW5kZXggcmVsYXRpb24gZGVzY3JpcHRvcgog KgkJU2NhbkRlc2MJCSAgIGluZGV4IHNjYW4gZGVzY3JpcHRvcgogKgkJSW5zdHJ1bWVudAkJ ICAgbG9jYWwgaW5kZXggc2NhbiBpbnN0cnVtZW50YXRpb24KICoJCVNoYXJlZEluZm8JCSAg IHBhcmFsbGVsIHdvcmtlciBpbnN0cnVtZW50YXRpb24gKG5vIGxlYWRlciBlbnRyeSkKICoK ICoJCVJlb3JkZXJRdWV1ZQkgICB0dXBsZXMgdGhhdCBuZWVkIHJlb3JkZXJpbmcgZHVlIHRv IHJlLWNoZWNrCiAqCQlSZWFjaGVkRW5kCQkgICBoYXZlIHdlIGZldGNoZWQgYWxsIHR1cGxl cyBmcm9tIGluZGV4IGFscmVhZHk/CiAqCQlPcmRlckJ5VmFsdWVzCSAgIHZhbHVlcyBvZiBP UkRFUiBCWSBleHBycyBvZiBsYXN0IGZldGNoZWQgdHVwbGUKICoJCU9yZGVyQnlOdWxscwkg ICBudWxsIGZsYWdzIGZvciBPcmRlckJ5VmFsdWVzCiAqCQlTb3J0U3VwcG9ydAkJICAgZm9y IHJlb3JkZXJpbmcgT1JERVIgQlkgZXhwcnMKICoJCU9yZGVyQnlUeXBCeVZhbHMgICBpcyB0 aGUgZGF0YXR5cGUgb2Ygb3JkZXIgYnkgZXhwcmVzc2lvbiBwYXNzLWJ5LXZhbHVlPwogKgkJ T3JkZXJCeVR5cExlbnMJICAgdHlwbGVucyBvZiB0aGUgZGF0YXR5cGVzIG9mIG9yZGVyIGJ5 IGV4cHJlc3Npb25zCiAqCQlQc2NhbkxlbgkJICAgc2l6ZSBvZiBwYXJhbGxlbCBpbmRleCBz Y2FuIGRlc2NyaXB0b3IKICogLS0tLS0tLS0tLS0tLS0tLQogKi8KdHlwZWRlZiBzdHJ1Y3Qg SW5kZXhTY2FuU3RhdGUKewoJU2NhblN0YXRlCXNzOwkJCQkvKiBpdHMgZmlyc3QgZmllbGQg aXMgTm9kZVRhZyAqLwoJRXhwclN0YXRlICAqaW5kZXhxdWFsb3JpZzsKCUxpc3QJICAgKmlu ZGV4b3JkZXJieW9yaWc7CglTY2FuS2V5RGF0YSAqaXNzX1NjYW5LZXlzOwoJaW50CQkJaXNz X051bVNjYW5LZXlzOwoJU2NhbktleURhdGEgKmlzc19PcmRlckJ5S2V5czsKCWludAkJCWlz c19OdW1PcmRlckJ5S2V5czsKCUluZGV4UnVudGltZUtleUluZm8gKmlzc19SdW50aW1lS2V5 czsKCWludAkJCWlzc19OdW1SdW50aW1lS2V5czsKCWJvb2wJCWlzc19SdW50aW1lS2V5c1Jl YWR5OwoJRXhwckNvbnRleHQgKmlzc19SdW50aW1lQ29udGV4dDsKCVJlbGF0aW9uCWlzc19S ZWxhdGlvbkRlc2M7CglzdHJ1Y3QgSW5kZXhTY2FuRGVzY0RhdGEgKmlzc19TY2FuRGVzYzsK CUluZGV4U2Nhbkluc3RydW1lbnRhdGlvbiAqaXNzX0luc3RydW1lbnQ7CglTaGFyZWRJbmRl eFNjYW5JbnN0cnVtZW50YXRpb24gKmlzc19TaGFyZWRJbmZvOwoKCS8qIFRoZXNlIGFyZSBu ZWVkZWQgZm9yIHJlLWNoZWNraW5nIE9SREVSIEJZIGV4cHIgb3JkZXJpbmcgKi8KCXBhaXJp bmdoZWFwICppc3NfUmVvcmRlclF1ZXVlOwoJYm9vbAkJaXNzX1JlYWNoZWRFbmQ7CglEYXR1 bQkgICAqaXNzX09yZGVyQnlWYWx1ZXM7Cglib29sCSAgICppc3NfT3JkZXJCeU51bGxzOwoJ U29ydFN1cHBvcnQgaXNzX1NvcnRTdXBwb3J0OwoJYm9vbAkgICAqaXNzX09yZGVyQnlUeXBC eVZhbHM7CglpbnQxNgkgICAqaXNzX09yZGVyQnlUeXBMZW5zOwoJU2l6ZQkJaXNzX1BzY2Fu TGVuOwp9IEluZGV4U2NhblN0YXRlOwoKLyogLS0tLS0tLS0tLS0tLS0tLQogKgkgSW5kZXhP bmx5U2NhblN0YXRlIGluZm9ybWF0aW9uCiAqCiAqCQlyZWNoZWNrcXVhbAkJICAgZXhlY3V0 aW9uIHN0YXRlIGZvciByZWNoZWNrcXVhbCBleHByZXNzaW9ucwogKgkJU2NhbktleXMJCSAg IFNrZXkgc3RydWN0dXJlcyBmb3IgaW5kZXggcXVhbHMKICoJCU51bVNjYW5LZXlzCQkgICBu dW1iZXIgb2YgU2NhbktleXMKICoJCU9yZGVyQnlLZXlzCQkgICBTa2V5IHN0cnVjdHVyZXMg Zm9yIGluZGV4IG9yZGVyaW5nIG9wZXJhdG9ycwogKgkJTnVtT3JkZXJCeUtleXMJICAgbnVt YmVyIG9mIE9yZGVyQnlLZXlzCiAqCQlSdW50aW1lS2V5cwkJICAgaW5mbyBhYm91dCBTa2V5 cyB0aGF0IG11c3QgYmUgZXZhbHVhdGVkIGF0IHJ1bnRpbWUKICoJCU51bVJ1bnRpbWVLZXlz CSAgIG51bWJlciBvZiBSdW50aW1lS2V5cwogKgkJUnVudGltZUtleXNSZWFkeSAgIHRydWUg aWYgcnVudGltZSBTa2V5cyBoYXZlIGJlZW4gY29tcHV0ZWQKICoJCVJ1bnRpbWVDb250ZXh0 CSAgIGV4cHIgY29udGV4dCBmb3IgZXZhbGluZyBydW50aW1lIFNrZXlzCiAqCQlSZWxhdGlv bkRlc2MJICAgaW5kZXggcmVsYXRpb24gZGVzY3JpcHRvcgogKgkJU2NhbkRlc2MJCSAgIGlu ZGV4IHNjYW4gZGVzY3JpcHRvcgogKgkJSW5zdHJ1bWVudAkJICAgbG9jYWwgaW5kZXggc2Nh biBpbnN0cnVtZW50YXRpb24KICoJCVNoYXJlZEluZm8JCSAgIHBhcmFsbGVsIHdvcmtlciBp bnN0cnVtZW50YXRpb24gKG5vIGxlYWRlciBlbnRyeSkKICoJCVRhYmxlU2xvdAkJICAgc2xv dCBmb3IgaG9sZGluZyB0dXBsZXMgZmV0Y2hlZCBmcm9tIHRoZSB0YWJsZQogKgkJVk1CdWZm ZXIJCSAgIGJ1ZmZlciBpbiB1c2UgZm9yIHZpc2liaWxpdHkgbWFwIHRlc3RpbmcsIGlmIGFu eQogKgkJUHNjYW5MZW4JCSAgIHNpemUgb2YgcGFyYWxsZWwgaW5kZXgtb25seSBzY2FuIGRl c2NyaXB0b3IKICoJCU5hbWVDU3RyaW5nQXR0TnVtcyBhdHRudW1zIG9mIG5hbWUgdHlwZWQg Y29sdW1ucyB0byBwYWQgdG8gTkFNRURBVEFMRU4KICoJCU5hbWVDU3RyaW5nQ291bnQgICBu dW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIE5hbWVDU3RyaW5nQXR0TnVtcyBhcnJheQogKiAt LS0tLS0tLS0tLS0tLS0tCiAqLwp0eXBlZGVmIHN0cnVjdCBJbmRleE9ubHlTY2FuU3RhdGUK ewoJU2NhblN0YXRlCXNzOwkJCQkvKiBpdHMgZmlyc3QgZmllbGQgaXMgTm9kZVRhZyAqLwoJ RXhwclN0YXRlICAqcmVjaGVja3F1YWw7CglTY2FuS2V5RGF0YSAqaW9zc19TY2FuS2V5czsK CWludAkJCWlvc3NfTnVtU2NhbktleXM7CglTY2FuS2V5RGF0YSAqaW9zc19PcmRlckJ5S2V5 czsKCWludAkJCWlvc3NfTnVtT3JkZXJCeUtleXM7CglJbmRleFJ1bnRpbWVLZXlJbmZvICpp b3NzX1J1bnRpbWVLZXlzOwoJaW50CQkJaW9zc19OdW1SdW50aW1lS2V5czsKCWJvb2wJCWlv c3NfUnVudGltZUtleXNSZWFkeTsKCUV4cHJDb250ZXh0ICppb3NzX1J1bnRpbWVDb250ZXh0 OwoJUmVsYXRpb24JaW9zc19SZWxhdGlvbkRlc2M7CglzdHJ1Y3QgSW5kZXhTY2FuRGVzY0Rh dGEgKmlvc3NfU2NhbkRlc2M7CglJbmRleFNjYW5JbnN0cnVtZW50YXRpb24gKmlvc3NfSW5z dHJ1bWVudDsKCVNoYXJlZEluZGV4U2Nhbkluc3RydW1lbnRhdGlvbiAqaW9zc19TaGFyZWRJ bmZvOwoJVHVwbGVUYWJsZVNsb3QgKmlvc3NfVGFibGVTbG90OwoJQnVmZmVyCQlpb3NzX1ZN QnVmZmVyOwoJU2l6ZQkJaW9zc19Qc2NhbkxlbjsKCUF0dHJOdW1iZXIgKmlvc3NfTmFtZUNT dHJpbmdBdHROdW1zOwoJaW50CQkJaW9zc19OYW1lQ1N0cmluZ0NvdW50Owp9IEluZGV4T25s eVNjYW5TdGF0ZTsKCi8qIC0tLS0tLS0tLS0tLS0tLS0KICoJIEJpdG1hcEluZGV4U2NhblN0 YXRlIGluZm9ybWF0aW9uCiAqCiAqCQlyZXN1bHQJCQkgICBiaXRtYXAgdG8gcmV0dXJuIG91 dHB1dCBpbnRvLCBvciBOVUxMCiAqCQlTY2FuS2V5cwkJICAgU2tleSBzdHJ1Y3R1cmVzIGZv ciBpbmRleCBxdWFscwogKgkJTnVtU2NhbktleXMJCSAgIG51bWJlciBvZiBTY2FuS2V5cwog KgkJUnVudGltZUtleXMJCSAgIGluZm8gYWJvdXQgU2tleXMgdGhhdCBtdXN0IGJlIGV2YWx1 YXRlZCBhdCBydW50aW1lCiAqCQlOdW1SdW50aW1lS2V5cwkgICBudW1iZXIgb2YgUnVudGlt ZUtleXMKICoJCUFycmF5S2V5cwkJICAgaW5mbyBhYm91dCBTa2V5cyB0aGF0IGNvbWUgZnJv bSBTY2FsYXJBcnJheU9wRXhwcnMKICoJCU51bUFycmF5S2V5cwkgICBudW1iZXIgb2YgQXJy YXlLZXlzCiAqCQlSdW50aW1lS2V5c1JlYWR5ICAgdHJ1ZSBpZiBydW50aW1lIFNrZXlzIGhh dmUgYmVlbiBjb21wdXRlZAogKgkJUnVudGltZUNvbnRleHQJICAgZXhwciBjb250ZXh0IGZv ciBldmFsaW5nIHJ1bnRpbWUgU2tleXMKICoJCVJlbGF0aW9uRGVzYwkgICBpbmRleCByZWxh dGlvbiBkZXNjcmlwdG9yCiAqCQlTY2FuRGVzYwkJICAgaW5kZXggc2NhbiBkZXNjcmlwdG9y CiAqCQlJbnN0cnVtZW50CQkgICBsb2NhbCBpbmRleCBzY2FuIGluc3RydW1lbnRhdGlvbgog KgkJU2hhcmVkSW5mbwkJICAgcGFyYWxsZWwgd29ya2VyIGluc3RydW1lbnRhdGlvbiAobm8g bGVhZGVyIGVudHJ5KQogKiAtLS0tLS0tLS0tLS0tLS0tCiAqLwp0eXBlZGVmIHN0cnVjdCBC aXRtYXBJbmRleFNjYW5TdGF0ZQp7CglTY2FuU3RhdGUJc3M7CQkJCS8qIGl0cyBmaXJzdCBm aWVsZCBpcyBOb2RlVGFnICovCglUSURCaXRtYXAgICpiaXNzX3Jlc3VsdDsKCVNjYW5LZXlE YXRhICpiaXNzX1NjYW5LZXlzOwoJaW50CQkJYmlzc19OdW1TY2FuS2V5czsKCUluZGV4UnVu dGltZUtleUluZm8gKmJpc3NfUnVudGltZUtleXM7CglpbnQJCQliaXNzX051bVJ1bnRpbWVL ZXlzOwoJSW5kZXhBcnJheUtleUluZm8gKmJpc3NfQXJyYXlLZXlzOwoJaW50CQkJYmlzc19O dW1BcnJheUtleXM7Cglib29sCQliaXNzX1J1bnRpbWVLZXlzUmVhZHk7CglFeHByQ29udGV4 dCAqYmlzc19SdW50aW1lQ29udGV4dDsKCVJlbGF0aW9uCWJpc3NfUmVsYXRpb25EZXNjOwoJ c3RydWN0IEluZGV4U2NhbkRlc2NEYXRhICpiaXNzX1NjYW5EZXNjOwoJSW5kZXhTY2FuSW5z dHJ1bWVudGF0aW9uICpiaXNzX0luc3RydW1lbnQ7CglTaGFyZWRJbmRleFNjYW5JbnN0cnVt ZW50YXRpb24gKmJpc3NfU2hhcmVkSW5mbzsKfSBCaXRtYXBJbmRleFNjYW5TdGF0ZTsKCgov KiAtLS0tLS0tLS0tLS0tLS0tCiAqCSBCaXRtYXBIZWFwU2NhblN0YXRlIGluZm9ybWF0aW9u CiAqCiAqCQliaXRtYXBxdWFsb3JpZwkgICBleGVjdXRpb24gc3RhdGUgZm9yIGJpdG1hcHF1 YWxvcmlnIGV4cHJlc3Npb25zCiAqCQl0Ym0JCQkJICAgYml0bWFwIG9idGFpbmVkIGZyb20g Y2hpbGQgaW5kZXggc2NhbihzKQogKgkJc3RhdHMJCQkgICBleGVjdXRpb24gc3RhdGlzdGlj cwogKgkJaW5pdGlhbGl6ZWQJCSAgIGlzIG5vZGUgaXMgcmVhZHkgdG8gaXRlcmF0ZQogKgkJ cHN0YXRlCQkJICAgc2hhcmVkIHN0YXRlIGZvciBwYXJhbGxlbCBiaXRtYXAgc2NhbgogKgkJ c2luc3RydW1lbnQJCSAgIHN0YXRpc3RpY3MgZm9yIHBhcmFsbGVsIHdvcmtlcnMKICoJCXJl Y2hlY2sJCQkgICBkbyBjdXJyZW50IHBhZ2UncyB0dXBsZXMgbmVlZCByZWNoZWNrCiAqIC0t LS0tLS0tLS0tLS0tLS0KICovCgovKiB0aGlzIHN0cnVjdCBpcyBkZWZpbmVkIGluIG5vZGVC aXRtYXBIZWFwc2Nhbi5jICovCnR5cGVkZWYgc3RydWN0IFBhcmFsbGVsQml0bWFwSGVhcFN0 YXRlIFBhcmFsbGVsQml0bWFwSGVhcFN0YXRlOwoKdHlwZWRlZiBzdHJ1Y3QgQml0bWFwSGVh cFNjYW5TdGF0ZQp7CglTY2FuU3RhdGUJc3M7CQkJCS8qIGl0cyBmaXJzdCBmaWVsZCBpcyBO b2RlVGFnICovCglFeHByU3RhdGUgICpiaXRtYXBxdWFsb3JpZzsKCVRJREJpdG1hcCAgKnRi bTsKCUJpdG1hcEhlYXBTY2FuSW5zdHJ1bWVudGF0aW9uIHN0YXRzOwoJYm9vbAkJaW5pdGlh bGl6ZWQ7CglQYXJhbGxlbEJpdG1hcEhlYXBTdGF0ZSAqcHN0YXRlOwoJU2hhcmVkQml0bWFw SGVhcEluc3RydW1lbnRhdGlvbiAqc2luc3RydW1lbnQ7Cglib29sCQlyZWNoZWNrOwp9IEJp dG1hcEhlYXBTY2FuU3RhdGU7CgovKiAtLS0tLS0tLS0tLS0tLS0tCiAqCSBUaWRTY2FuU3Rh dGUgaW5mb3JtYXRpb24KICoKICoJCXRpZGV4cHJzCSAgIGxpc3Qgb2YgVGlkRXhwciBzdHJ1 Y3RzIChzZWUgbm9kZVRpZHNjYW4uYykKICoJCWlzQ3VycmVudE9mICAgIHNjYW4gaGFzIGEg Q3VycmVudE9mRXhwciBxdWFsCiAqCQlOdW1UaWRzCQkgICBudW1iZXIgb2YgdGlkcyBpbiB0 aGlzIHNjYW4KICoJCVRpZFB0cgkJICAgaW5kZXggb2YgY3VycmVudGx5IGZldGNoZWQgdGlk CiAqCQlUaWRMaXN0CQkgICBldmFsdWF0ZWQgaXRlbSBwb2ludGVycyAoYXJyYXkgb2Ygc2l6 ZSBOdW1UaWRzKQogKiAtLS0tLS0tLS0tLS0tLS0tCiAqLwp0eXBlZGVmIHN0cnVjdCBUaWRT Y2FuU3RhdGUKewoJU2NhblN0YXRlCXNzOwkJCQkvKiBpdHMgZmlyc3QgZmllbGQgaXMgTm9k ZVRhZyAqLwoJTGlzdAkgICAqdHNzX3RpZGV4cHJzOwoJYm9vbAkJdHNzX2lzQ3VycmVudE9m OwoJaW50CQkJdHNzX051bVRpZHM7CglpbnQJCQl0c3NfVGlkUHRyOwoJSXRlbVBvaW50ZXJE YXRhICp0c3NfVGlkTGlzdDsKfSBUaWRTY2FuU3RhdGU7CgovKiAtLS0tLS0tLS0tLS0tLS0t CiAqCSBUaWRSYW5nZVNjYW5TdGF0ZSBpbmZvcm1hdGlvbgogKgogKgkJdHJzc190aWRleHBy cwkJbGlzdCBvZiBUaWRPcEV4cHIgc3RydWN0cyAoc2VlIG5vZGVUaWRyYW5nZXNjYW4uYykK ICoJCXRyc3NfbWludGlkCQkJdGhlIGxvd2VzdCBUSUQgaW4gdGhlIHNjYW4gcmFuZ2UKICoJ CXRyc3NfbWF4dGlkCQkJdGhlIGhpZ2hlc3QgVElEIGluIHRoZSBzY2FuIHJhbmdlCiAqCQl0 cnNzX2luU2NhbgkJCWlzIGEgc2NhbiBjdXJyZW50bHkgaW4gcHJvZ3Jlc3M/CiAqCQl0cnNz X3BzY2FubGVuCQlzaXplIG9mIHBhcmFsbGVsIGhlYXAgc2NhbiBkZXNjcmlwdG9yCiAqIC0t LS0tLS0tLS0tLS0tLS0KICovCnR5cGVkZWYgc3RydWN0IFRpZFJhbmdlU2NhblN0YXRlCnsK CVNjYW5TdGF0ZQlzczsJCQkJLyogaXRzIGZpcnN0IGZpZWxkIGlzIE5vZGVUYWcgKi8KCUxp c3QJICAgKnRyc3NfdGlkZXhwcnM7CglJdGVtUG9pbnRlckRhdGEgdHJzc19taW50aWQ7CglJ dGVtUG9pbnRlckRhdGEgdHJzc19tYXh0aWQ7Cglib29sCQl0cnNzX2luU2NhbjsKCVNpemUJ CXRyc3NfcHNjYW5sZW47CglzdHJ1Y3QgU2hhcmVkVGlkUmFuZ2VTY2FuSW5zdHJ1bWVudGF0 aW9uICp0cnNzX3NpbnN0cnVtZW50Owp9IFRpZFJhbmdlU2NhblN0YXRlOwoKLyogLS0tLS0t LS0tLS0tLS0tLQogKgkgU3VicXVlcnlTY2FuU3RhdGUgaW5mb3JtYXRpb24KICoKICoJCVN1 YnF1ZXJ5U2NhblN0YXRlIGlzIHVzZWQgZm9yIHNjYW5uaW5nIGEgc3ViLXF1ZXJ5IGluIHRo ZSByYW5nZSB0YWJsZS4KICoJCVNjYW5UdXBsZVNsb3QgcmVmZXJlbmNlcyB0aGUgY3VycmVu dCBvdXRwdXQgdHVwbGUgb2YgdGhlIHN1Yi1xdWVyeS4KICogLS0tLS0tLS0tLS0tLS0tLQog Ki8KdHlwZWRlZiBzdHJ1Y3QgU3VicXVlcnlTY2FuU3RhdGUKewoJU2NhblN0YXRlCXNzOwkJ CQkvKiBpdHMgZmlyc3QgZmllbGQgaXMgTm9kZVRhZyAqLwoJUGxhblN0YXRlICAqc3VicGxh bjsKfSBTdWJxdWVyeVNjYW5TdGF0ZTsKCi8qIC0tLS0tLS0tLS0tLS0tLS0KICoJIEZ1bmN0 aW9uU2NhblN0YXRlIGluZm9ybWF0aW9uCiAqCiAqCQlGdW5jdGlvbiBub2RlcyBhcmUgdXNl ZCB0byBzY2FuIHRoZSByZXN1bHRzIG9mIGEKICoJCWZ1bmN0aW9uIGFwcGVhcmluZyBpbiBG Uk9NICh0eXBpY2FsbHkgYSBmdW5jdGlvbiByZXR1cm5pbmcgc2V0KS4KICoKICoJCWVmbGFn cwkJCQlub2RlJ3MgY2FwYWJpbGl0eSBmbGFncwogKgkJb3JkaW5hbGl0eQkJCWlzIHRoaXMg c2NhbiBXSVRIIE9SRElOQUxJVFk/CiAqCQlzaW1wbGUJCQkJdHJ1ZSBpZiB3ZSBoYXZlIDEg ZnVuY3Rpb24gYW5kIG5vIG9yZGluYWxpdHkKICoJCW9yZGluYWwJCQkJY3VycmVudCBvcmRp bmFsIGNvbHVtbiB2YWx1ZQogKgkJbmZ1bmNzCQkJCW51bWJlciBvZiBmdW5jdGlvbnMgYmVp bmcgZXhlY3V0ZWQKICoJCWZ1bmNzdGF0ZXMJCQlwZXItZnVuY3Rpb24gZXhlY3V0aW9uIHN0 YXRlcyAocHJpdmF0ZSBpbgogKgkJCQkJCQlub2RlRnVuY3Rpb25zY2FuLmMpCiAqCQlhcmdj b250ZXh0CQkJbWVtb3J5IGNvbnRleHQgdG8gZXZhbHVhdGUgZnVuY3Rpb24gYXJndW1lbnRz IGluCiAqIC0tLS0tLS0tLS0tLS0tLS0KICovCnN0cnVjdCBGdW5jdGlvblNjYW5QZXJGdW5j U3RhdGU7Cgp0eXBlZGVmIHN0cnVjdCBGdW5jdGlvblNjYW5TdGF0ZQp7CglTY2FuU3RhdGUJ c3M7CQkJCS8qIGl0cyBmaXJzdCBmaWVsZCBpcyBOb2RlVGFnICovCglpbnQJCQllZmxhZ3M7 Cglib29sCQlvcmRpbmFsaXR5OwoJYm9vbAkJc2ltcGxlOwoJaW50NjQJCW9yZGluYWw7Cglp bnQJCQluZnVuY3M7CglzdHJ1Y3QgRnVuY3Rpb25TY2FuUGVyRnVuY1N0YXRlICpmdW5jc3Rh dGVzOwkvKiBhcnJheSBvZiBsZW5ndGggbmZ1bmNzICovCglNZW1vcnlDb250ZXh0IGFyZ2Nv bnRleHQ7Cn0gRnVuY3Rpb25TY2FuU3RhdGU7CgovKiAtLS0tLS0tLS0tLS0tLS0tCiAqCSBW YWx1ZXNTY2FuU3RhdGUgaW5mb3JtYXRpb24KICoKICoJCVZhbHVlc1NjYW4gbm9kZXMgYXJl IHVzZWQgdG8gc2NhbiB0aGUgcmVzdWx0cyBvZiBhIFZBTFVFUyBsaXN0CiAqCiAqCQlyb3dj b250ZXh0CQkJcGVyLWV4cHJlc3Npb24tbGlzdCBjb250ZXh0CiAqCQlleHBybGlzdHMJCQlh cnJheSBvZiBleHByZXNzaW9uIGxpc3RzIGJlaW5nIGV2YWx1YXRlZAogKgkJZXhwcnN0YXRl bGlzdHMJCWFycmF5IG9mIGV4cHJlc3Npb24gc3RhdGUgbGlzdHMsIGZvciBTdWJQbGFucyBv bmx5CiAqCQlhcnJheV9sZW4JCQlzaXplIG9mIGFib3ZlIGFycmF5cwogKgkJY3Vycl9pZHgJ CQljdXJyZW50IGFycmF5IGluZGV4ICgwLWJhc2VkKQogKgogKglOb3RlOiBzcy5wcy5wc19F eHByQ29udGV4dCBpcyB1c2VkIHRvIGV2YWx1YXRlIGFueSBxdWFsIG9yIHByb2plY3Rpb24K ICoJZXhwcmVzc2lvbnMgYXR0YWNoZWQgdG8gdGhlIG5vZGUuICBXZSBjcmVhdGUgYSBzZWNv bmQgRXhwckNvbnRleHQsCiAqCXJvd2NvbnRleHQsIGluIHdoaWNoIHRvIGJ1aWxkIHRoZSBl eGVjdXRvciBleHByZXNzaW9uIHN0YXRlIGZvciBlYWNoCiAqCVZhbHVlcyBzdWJsaXN0LiAg UmVzZXR0aW5nIHRoaXMgY29udGV4dCBsZXRzIHVzIGdldCByaWQgb2YgZXhwcmVzc2lvbgog KglzdGF0ZSBmb3IgZWFjaCByb3csIGF2b2lkaW5nIG1ham9yIG1lbW9yeSBsZWFrYWdlIG92 ZXIgYSBsb25nIHZhbHVlcyBsaXN0LgogKglIb3dldmVyLCB0aGF0IGRvZXNuJ3Qgd29yayBm b3Igc3VibGlzdHMgY29udGFpbmluZyBTdWJQbGFucywgYmVjYXVzZSBhCiAqCVN1YlBsYW4g aGFzIHRvIGJlIGNvbm5lY3RlZCB1cCB0byB0aGUgb3V0ZXIgcGxhbiB0cmVlIHRvIHdvcmsg cHJvcGVybHkuCiAqCVRoZXJlZm9yZSwgZm9yIG9ubHkgdGhvc2Ugc3VibGlzdHMgY29udGFp bmluZyBTdWJQbGFucywgd2UgZG8gZXhwcmVzc2lvbgogKglzdGF0ZSBjb25zdHJ1Y3Rpb24g YXQgZXhlY3V0b3Igc3RhcnQsIGFuZCBzdG9yZSB0aG9zZSBwb2ludGVycyBpbgogKglleHBy c3RhdGVsaXN0c1tdLiAgTlVMTCBlbnRyaWVzIGluIHRoYXQgYXJyYXkgY29ycmVzcG9uZCB0 byBzaW1wbGUKICoJc3ViZXhwcmVzc2lvbnMgdGhhdCBhcmUgaGFuZGxlZCBhcyBkZXNjcmli ZWQgYWJvdmUuCiAqIC0tLS0tLS0tLS0tLS0tLS0KICovCnR5cGVkZWYgc3RydWN0IFZhbHVl c1NjYW5TdGF0ZQp7CglTY2FuU3RhdGUJc3M7CQkJCS8qIGl0cyBmaXJzdCBmaWVsZCBpcyBO b2RlVGFnICovCglFeHByQ29udGV4dCAqcm93Y29udGV4dDsKCUxpc3QJICAqKmV4cHJsaXN0 czsKCUxpc3QJICAqKmV4cHJzdGF0ZWxpc3RzOwoJaW50CQkJYXJyYXlfbGVuOwoJaW50CQkJ Y3Vycl9pZHg7Cn0gVmFsdWVzU2NhblN0YXRlOwoKLyogLS0tLS0tLS0tLS0tLS0tLQogKgkJ VGFibGVGdW5jU2NhblN0YXRlIG5vZGUKICoKICogVXNlZCBpbiB0YWJsZS1leHByZXNzaW9u IGZ1bmN0aW9ucyBsaWtlIFhNTFRBQkxFLgogKiAtLS0tLS0tLS0tLS0tLS0tCiAqLwp0eXBl ZGVmIHN0cnVjdCBUYWJsZUZ1bmNTY2FuU3RhdGUKewoJU2NhblN0YXRlCXNzOwkJCQkvKiBp dHMgZmlyc3QgZmllbGQgaXMgTm9kZVRhZyAqLwoJRXhwclN0YXRlICAqZG9jZXhwcjsJCS8q IHN0YXRlIGZvciBkb2N1bWVudCBleHByZXNzaW9uICovCglFeHByU3RhdGUgICpyb3dleHBy OwkJLyogc3RhdGUgZm9yIHJvdy1nZW5lcmF0aW5nIGV4cHJlc3Npb24gKi8KCUxpc3QJICAg KmNvbGV4cHJzOwkJLyogc3RhdGUgZm9yIGNvbHVtbi1nZW5lcmF0aW5nIGV4cHJlc3Npb24g Ki8KCUxpc3QJICAgKmNvbGRlZmV4cHJzOwkvKiBzdGF0ZSBmb3IgY29sdW1uIGRlZmF1bHQg ZXhwcmVzc2lvbnMgKi8KCUxpc3QJICAgKmNvbHZhbGV4cHJzOwkvKiBzdGF0ZSBmb3IgY29s dW1uIHZhbHVlIGV4cHJlc3Npb25zICovCglMaXN0CSAgICpwYXNzaW5ndmFsZXhwcnM7CS8q IHN0YXRlIGZvciBQQVNTSU5HIGFyZ3VtZW50IGV4cHJlc3Npb25zICovCglMaXN0CSAgICpu c19uYW1lczsJCS8qIHNhbWUgYXMgVGFibGVGdW5jLm5zX25hbWVzICovCglMaXN0CSAgICpu c191cmlzOwkJLyogbGlzdCBvZiBzdGF0ZXMgb2YgbmFtZXNwYWNlIFVSSSBleHBycyAqLwoJ Qml0bWFwc2V0ICAqbm90bnVsbHM7CQkvKiBudWxsYWJpbGl0eSBmbGFnIGZvciBlYWNoIG91 dHB1dCBjb2x1bW4gKi8KCXZvaWQJICAgKm9wYXF1ZTsJCQkvKiB0YWJsZSBidWlsZGVyIHBy aXZhdGUgc3BhY2UgKi8KCWNvbnN0IHN0cnVjdCBUYWJsZUZ1bmNSb3V0aW5lICpyb3V0aW5l OyAvKiB0YWJsZSBidWlsZGVyIG1ldGhvZHMgKi8KCUZtZ3JJbmZvICAgKmluX2Z1bmN0aW9u czsJLyogaW5wdXQgZnVuY3Rpb24gZm9yIGVhY2ggY29sdW1uICovCglPaWQJCSAgICp0eXBp b3BhcmFtczsJLyogdHlwaW9wYXJhbSBmb3IgZWFjaCBjb2x1bW4gKi8KCWludDY0CQlvcmRp bmFsOwkJLyogcm93IG51bWJlciB0byBiZSBvdXRwdXQgbmV4dCAqLwoJTWVtb3J5Q29udGV4 dCBwZXJUYWJsZUN4dDsJLyogcGVyLXRhYmxlIGNvbnRleHQgKi8KCVR1cGxlc3RvcmVzdGF0 ZSAqdHVwc3RvcmU7CS8qIG91dHB1dCB0dXBsZSBzdG9yZSAqLwp9IFRhYmxlRnVuY1NjYW5T dGF0ZTsKCi8qIC0tLS0tLS0tLS0tLS0tLS0KICoJIEN0ZVNjYW5TdGF0ZSBpbmZvcm1hdGlv bgogKgogKgkJQ3RlU2NhbiBub2RlcyBhcmUgdXNlZCB0byBzY2FuIGEgQ29tbW9uVGFibGVF eHByIHF1ZXJ5LgogKgogKiBNdWx0aXBsZSBDdGVTY2FuIG5vZGVzIGNhbiByZWFkIG91dCBm cm9tIHRoZSBzYW1lIENURSBxdWVyeS4gIFdlIHVzZQogKiBhIHR1cGxlc3RvcmUgdG8gaG9s ZCByb3dzIHRoYXQgaGF2ZSBiZWVuIHJlYWQgZnJvbSB0aGUgQ1RFIHF1ZXJ5IGJ1dAogKiBu b3QgeWV0IGNvbnN1bWVkIGJ5IGFsbCByZWFkZXJzLgogKiAtLS0tLS0tLS0tLS0tLS0tCiAq Lwp0eXBlZGVmIHN0cnVjdCBDdGVTY2FuU3RhdGUKewoJU2NhblN0YXRlCXNzOwkJCQkvKiBp dHMgZmlyc3QgZmllbGQgaXMgTm9kZVRhZyAqLwoJaW50CQkJZWZsYWdzOwkJCS8qIGNhcGFi aWxpdHkgZmxhZ3MgdG8gcGFzcyB0byB0dXBsZXN0b3JlICovCglpbnQJCQlyZWFkcHRyOwkJ LyogaW5kZXggb2YgbXkgdHVwbGVzdG9yZSByZWFkIHBvaW50ZXIgKi8KCVBsYW5TdGF0ZSAg KmN0ZXBsYW5zdGF0ZTsJLyogUGxhblN0YXRlIGZvciB0aGUgQ1RFIHF1ZXJ5IGl0c2VsZiAq LwoJLyogTGluayB0byB0aGUgImxlYWRlciIgQ3RlU2NhblN0YXRlIChwb3NzaWJseSB0aGlz IHNhbWUgbm9kZSkgKi8KCXN0cnVjdCBDdGVTY2FuU3RhdGUgKmxlYWRlcjsKCS8qIFRoZSBy ZW1haW5pbmcgZmllbGRzIGFyZSBvbmx5IHZhbGlkIGluIHRoZSAibGVhZGVyIiBDdGVTY2Fu U3RhdGUgKi8KCVR1cGxlc3RvcmVzdGF0ZSAqY3RlX3RhYmxlOyAvKiByb3dzIGFscmVhZHkg cmVhZCBmcm9tIHRoZSBDVEUgcXVlcnkgKi8KCWJvb2wJCWVvZl9jdGU7CQkvKiByZWFjaGVk IGVuZCBvZiBDVEUgcXVlcnk/ICovCn0gQ3RlU2NhblN0YXRlOwoKLyogLS0tLS0tLS0tLS0t LS0tLQogKgkgTmFtZWRUdXBsZXN0b3JlU2NhblN0YXRlIGluZm9ybWF0aW9uCiAqCiAqCQlO YW1lZFR1cGxlc3RvcmVTY2FuIG5vZGVzIGFyZSB1c2VkIHRvIHNjYW4gYSBUdXBsZXN0b3Jl IGNyZWF0ZWQgYW5kCiAqCQluYW1lZCBwcmlvciB0byBleGVjdXRpb24gb2YgdGhlIHF1ZXJ5 LiAgQW4gZXhhbXBsZSBpcyBhIHRyYW5zaXRpb24KICoJCXRhYmxlIGZvciBhbiBBRlRFUiB0 cmlnZ2VyLgogKgogKiBNdWx0aXBsZSBOYW1lZFR1cGxlc3RvcmVTY2FuIG5vZGVzIGNhbiBy ZWFkIG91dCBmcm9tIHRoZSBzYW1lIFR1cGxlc3RvcmUuCiAqIC0tLS0tLS0tLS0tLS0tLS0K ICovCnR5cGVkZWYgc3RydWN0IE5hbWVkVHVwbGVzdG9yZVNjYW5TdGF0ZQp7CglTY2FuU3Rh dGUJc3M7CQkJCS8qIGl0cyBmaXJzdCBmaWVsZCBpcyBOb2RlVGFnICovCglpbnQJCQlyZWFk cHRyOwkJLyogaW5kZXggb2YgbXkgdHVwbGVzdG9yZSByZWFkIHBvaW50ZXIgKi8KCVR1cGxl RGVzYwl0dXBkZXNjOwkJLyogZm9ybWF0IG9mIHRoZSB0dXBsZXMgaW4gdGhlIHR1cGxlc3Rv cmUgKi8KCVR1cGxlc3RvcmVzdGF0ZSAqcmVsYXRpb247CS8qIHRoZSByb3dzICovCn0gTmFt ZWRUdXBsZXN0b3JlU2NhblN0YXRlOwoKLyogLS0tLS0tLS0tLS0tLS0tLQogKgkgV29ya1Rh YmxlU2NhblN0YXRlIGluZm9ybWF0aW9uCiAqCiAqCQlXb3JrVGFibGVTY2FuIG5vZGVzIGFy ZSB1c2VkIHRvIHNjYW4gdGhlIHdvcmsgdGFibGUgY3JlYXRlZCBieQogKgkJYSBSZWN1cnNp dmVVbmlvbiBub2RlLiAgV2UgbG9jYXRlIHRoZSBSZWN1cnNpdmVVbmlvbiBub2RlCiAqCQlk dXJpbmcgZXhlY3V0b3Igc3RhcnR1cC4KICogLS0tLS0tLS0tLS0tLS0tLQogKi8KdHlwZWRl ZiBzdHJ1Y3QgV29ya1RhYmxlU2NhblN0YXRlCnsKCVNjYW5TdGF0ZQlzczsJCQkJLyogaXRz IGZpcnN0IGZpZWxkIGlzIE5vZGVUYWcgKi8KCVJlY3Vyc2l2ZVVuaW9uU3RhdGUgKnJ1c3Rh dGU7Cn0gV29ya1RhYmxlU2NhblN0YXRlOwoKLyogLS0tLS0tLS0tLS0tLS0tLQogKgkgRm9y ZWlnblNjYW5TdGF0ZSBpbmZvcm1hdGlvbgogKgogKgkJRm9yZWlnblNjYW4gbm9kZXMgYXJl IHVzZWQgdG8gc2NhbiBmb3JlaWduLWRhdGEgdGFibGVzLgogKiAtLS0tLS0tLS0tLS0tLS0t CiAqLwp0eXBlZGVmIHN0cnVjdCBGb3JlaWduU2NhblN0YXRlCnsKCVNjYW5TdGF0ZQlzczsJ CQkJLyogaXRzIGZpcnN0IGZpZWxkIGlzIE5vZGVUYWcgKi8KCUV4cHJTdGF0ZSAgKmZkd19y ZWNoZWNrX3F1YWxzOwkvKiBvcmlnaW5hbCBxdWFscyBub3QgaW4gc3MucHMucXVhbCAqLwoJ U2l6ZQkJcHNjYW5fbGVuOwkJLyogc2l6ZSBvZiBwYXJhbGxlbCBjb29yZGluYXRpb24gaW5m b3JtYXRpb24gKi8KCVJlc3VsdFJlbEluZm8gKnJlc3VsdFJlbEluZm87CS8qIHJlc3VsdCBy ZWwgaW5mbywgaWYgVVBEQVRFIG9yIERFTEVURSAqLwoJLyogdXNlIHN0cnVjdCBwb2ludGVy IHRvIGF2b2lkIGluY2x1ZGluZyBmZHdhcGkuaCBoZXJlICovCglzdHJ1Y3QgRmR3Um91dGlu ZSAqZmR3cm91dGluZTsKCXZvaWQJICAgKmZkd19zdGF0ZTsJCS8qIGZvcmVpZ24tZGF0YSB3 cmFwcGVyIGNhbiBrZWVwIHN0YXRlIGhlcmUgKi8KfSBGb3JlaWduU2NhblN0YXRlOwoKLyog LS0tLS0tLS0tLS0tLS0tLQogKgkgQ3VzdG9tU2NhblN0YXRlIGluZm9ybWF0aW9uCiAqCiAq CQlDdXN0b21TY2FuIG5vZGVzIGFyZSB1c2VkIHRvIGV4ZWN1dGUgY3VzdG9tIGNvZGUgd2l0 aGluIGV4ZWN1dG9yLgogKgogKiBDb3JlIGNvZGUgbXVzdCBhdm9pZCBhc3N1bWluZyB0aGF0 IHRoZSBDdXN0b21TY2FuU3RhdGUgaXMgb25seSBhcyBsYXJnZSBhcwogKiB0aGUgc3RydWN0 dXJlIGRlY2xhcmVkIGhlcmU7IHByb3ZpZGVycyBhcmUgYWxsb3dlZCB0byBtYWtlIGl0IHRo ZSBmaXJzdAogKiBlbGVtZW50IGluIGEgbGFyZ2VyIHN0cnVjdHVyZSwgYW5kIHR5cGljYWxs eSB3b3VsZCBuZWVkIHRvIGRvIHNvLiAgVGhlCiAqIHN0cnVjdCBpcyBhY3R1YWxseSBhbGxv Y2F0ZWQgYnkgdGhlIENyZWF0ZUN1c3RvbVNjYW5TdGF0ZSBtZXRob2QgYXNzb2NpYXRlZAog KiB3aXRoIHRoZSBwbGFuIG5vZGUuICBBbnkgYWRkaXRpb25hbCBmaWVsZHMgY2FuIGJlIGlu aXRpYWxpemVkIHRoZXJlLCBvciBpbgogKiB0aGUgQmVnaW5DdXN0b21TY2FuIG1ldGhvZC4K ICogLS0tLS0tLS0tLS0tLS0tLQogKi8Kc3RydWN0IEN1c3RvbUV4ZWNNZXRob2RzOwoKdHlw ZWRlZiBzdHJ1Y3QgQ3VzdG9tU2NhblN0YXRlCnsKCVNjYW5TdGF0ZQlzczsKCXVpbnQzMgkJ ZmxhZ3M7CQkJLyogbWFzayBvZiBDVVNUT01QQVRIXyogZmxhZ3MsIHNlZQoJCQkJCQkJCSAq IG5vZGVzL2V4dGVuc2libGUuaCAqLwoJTGlzdAkgICAqY3VzdG9tX3BzOwkJLyogbGlzdCBv ZiBjaGlsZCBQbGFuU3RhdGUgbm9kZXMsIGlmIGFueSAqLwoJU2l6ZQkJcHNjYW5fbGVuOwkJ Lyogc2l6ZSBvZiBwYXJhbGxlbCBjb29yZGluYXRpb24gaW5mb3JtYXRpb24gKi8KCWNvbnN0 IHN0cnVjdCBDdXN0b21FeGVjTWV0aG9kcyAqbWV0aG9kczsKCWNvbnN0IHN0cnVjdCBUdXBs ZVRhYmxlU2xvdE9wcyAqc2xvdE9wczsKfSBDdXN0b21TY2FuU3RhdGU7CgovKiAtLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tCiAqCQkJCSBKb2luIFN0YXRlIEluZm9ybWF0aW9uCiAqIC0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICovCgov KiAtLS0tLS0tLS0tLS0tLS0tCiAqCSBKb2luU3RhdGUgaW5mb3JtYXRpb24KICoKICoJCVN1 cGVyY2xhc3MgZm9yIHN0YXRlIG5vZGVzIG9mIGpvaW4gcGxhbnMuCiAqIC0tLS0tLS0tLS0t LS0tLS0KICovCnR5cGVkZWYgc3RydWN0IEpvaW5TdGF0ZQp7CglQbGFuU3RhdGUJcHM7CglK b2luVHlwZQlqb2ludHlwZTsKCWJvb2wJCXNpbmdsZV9tYXRjaDsJLyogVHJ1ZSBpZiB3ZSBz aG91bGQgc2tpcCB0byBuZXh0IG91dGVyIHR1cGxlCgkJCQkJCQkJICogYWZ0ZXIgZmluZGlu ZyBvbmUgaW5uZXIgbWF0Y2ggKi8KCUV4cHJTdGF0ZSAgKmpvaW5xdWFsOwkJLyogSk9JTiBx dWFscyAoaW4gYWRkaXRpb24gdG8gcHMucXVhbCkgKi8KfSBKb2luU3RhdGU7CgovKiAtLS0t LS0tLS0tLS0tLS0tCiAqCSBOZXN0TG9vcFN0YXRlIGluZm9ybWF0aW9uCiAqCiAqCQlOZWVk TmV3T3V0ZXIJICAgdHJ1ZSBpZiBuZWVkIG5ldyBvdXRlciB0dXBsZSBvbiBuZXh0IGNhbGwK ICoJCU1hdGNoZWRPdXRlcgkgICB0cnVlIGlmIGZvdW5kIGEgam9pbiBtYXRjaCBmb3IgY3Vy cmVudCBvdXRlciB0dXBsZQogKgkJTnVsbElubmVyVHVwbGVTbG90IHByZXBhcmVkIG51bGwg dHVwbGUgZm9yIGxlZnQgb3V0ZXIgam9pbnMKICogLS0tLS0tLS0tLS0tLS0tLQogKi8KdHlw ZWRlZiBzdHJ1Y3QgTmVzdExvb3BTdGF0ZQp7CglKb2luU3RhdGUJanM7CQkJCS8qIGl0cyBm aXJzdCBmaWVsZCBpcyBOb2RlVGFnICovCglib29sCQlubF9OZWVkTmV3T3V0ZXI7Cglib29s CQlubF9NYXRjaGVkT3V0ZXI7CglUdXBsZVRhYmxlU2xvdCAqbmxfTnVsbElubmVyVHVwbGVT bG90Owp9IE5lc3RMb29wU3RhdGU7CgovKiAtLS0tLS0tLS0tLS0tLS0tCiAqCSBNZXJnZUpv aW5TdGF0ZSBpbmZvcm1hdGlvbgogKgogKgkJTnVtQ2xhdXNlcwkJICAgbnVtYmVyIG9mIG1l cmdlam9pbmFibGUgam9pbiBjbGF1c2VzCiAqCQlDbGF1c2VzCQkJICAgaW5mbyBmb3IgZWFj aCBtZXJnZWpvaW5hYmxlIGNsYXVzZQogKgkJSm9pblN0YXRlCQkgICBjdXJyZW50IHN0YXRl IG9mIEV4ZWNNZXJnZUpvaW4gc3RhdGUgbWFjaGluZQogKgkJU2tpcE1hcmtSZXN0b3JlICAg IHRydWUgaWYgd2UgbWF5IHNraXAgTWFyayBhbmQgUmVzdG9yZSBvcGVyYXRpb25zCiAqCQlF eHRyYU1hcmtzCQkgICB0cnVlIHRvIGlzc3VlIGV4dHJhIE1hcmsgb3BlcmF0aW9ucyBvbiBp bm5lciBzY2FuCiAqCQlDb25zdEZhbHNlSm9pbgkgICB0cnVlIGlmIHdlIGhhdmUgYSBjb25z dGFudC1mYWxzZSBqb2lucXVhbAogKgkJRmlsbE91dGVyCQkgICB0cnVlIGlmIHNob3VsZCBl bWl0IHVuam9pbmVkIG91dGVyIHR1cGxlcyBhbnl3YXkKICoJCUZpbGxJbm5lcgkJICAgdHJ1 ZSBpZiBzaG91bGQgZW1pdCB1bmpvaW5lZCBpbm5lciB0dXBsZXMgYW55d2F5CiAqCQlNYXRj aGVkT3V0ZXIJICAgdHJ1ZSBpZiBmb3VuZCBhIGpvaW4gbWF0Y2ggZm9yIGN1cnJlbnQgb3V0 ZXIgdHVwbGUKICoJCU1hdGNoZWRJbm5lcgkgICB0cnVlIGlmIGZvdW5kIGEgam9pbiBtYXRj aCBmb3IgY3VycmVudCBpbm5lciB0dXBsZQogKgkJT3V0ZXJUdXBsZVNsb3QJICAgc2xvdCBp biB0dXBsZSB0YWJsZSBmb3IgY3VyIG91dGVyIHR1cGxlCiAqCQlJbm5lclR1cGxlU2xvdAkg ICBzbG90IGluIHR1cGxlIHRhYmxlIGZvciBjdXIgaW5uZXIgdHVwbGUKICoJCU1hcmtlZFR1 cGxlU2xvdCAgICBzbG90IGluIHR1cGxlIHRhYmxlIGZvciBtYXJrZWQgdHVwbGUKICoJCU51 bGxPdXRlclR1cGxlU2xvdCBwcmVwYXJlZCBudWxsIHR1cGxlIGZvciByaWdodCBvdXRlciBq b2lucwogKgkJTnVsbElubmVyVHVwbGVTbG90IHByZXBhcmVkIG51bGwgdHVwbGUgZm9yIGxl ZnQgb3V0ZXIgam9pbnMKICoJCU91dGVyRUNvbnRleHQJICAgd29ya3NwYWNlIGZvciBjb21w dXRpbmcgb3V0ZXIgdHVwbGUncyBqb2luIHZhbHVlcwogKgkJSW5uZXJFQ29udGV4dAkgICB3 b3Jrc3BhY2UgZm9yIGNvbXB1dGluZyBpbm5lciB0dXBsZSdzIGpvaW4gdmFsdWVzCiAqIC0t LS0tLS0tLS0tLS0tLS0KICovCi8qIHByaXZhdGUgaW4gbm9kZU1lcmdlam9pbi5jOiAqLwp0 eXBlZGVmIHN0cnVjdCBNZXJnZUpvaW5DbGF1c2VEYXRhICpNZXJnZUpvaW5DbGF1c2U7Cgp0 eXBlZGVmIHN0cnVjdCBNZXJnZUpvaW5TdGF0ZQp7CglKb2luU3RhdGUJanM7CQkJCS8qIGl0 cyBmaXJzdCBmaWVsZCBpcyBOb2RlVGFnICovCglpbnQJCQltal9OdW1DbGF1c2VzOwoJTWVy Z2VKb2luQ2xhdXNlIG1qX0NsYXVzZXM7IC8qIGFycmF5IG9mIGxlbmd0aCBtal9OdW1DbGF1 c2VzICovCglpbnQJCQltal9Kb2luU3RhdGU7Cglib29sCQltal9Ta2lwTWFya1Jlc3RvcmU7 Cglib29sCQltal9FeHRyYU1hcmtzOwoJYm9vbAkJbWpfQ29uc3RGYWxzZUpvaW47Cglib29s CQltal9GaWxsT3V0ZXI7Cglib29sCQltal9GaWxsSW5uZXI7Cglib29sCQltal9NYXRjaGVk T3V0ZXI7Cglib29sCQltal9NYXRjaGVkSW5uZXI7CglUdXBsZVRhYmxlU2xvdCAqbWpfT3V0 ZXJUdXBsZVNsb3Q7CglUdXBsZVRhYmxlU2xvdCAqbWpfSW5uZXJUdXBsZVNsb3Q7CglUdXBs ZVRhYmxlU2xvdCAqbWpfTWFya2VkVHVwbGVTbG90OwoJVHVwbGVUYWJsZVNsb3QgKm1qX051 bGxPdXRlclR1cGxlU2xvdDsKCVR1cGxlVGFibGVTbG90ICptal9OdWxsSW5uZXJUdXBsZVNs b3Q7CglFeHByQ29udGV4dCAqbWpfT3V0ZXJFQ29udGV4dDsKCUV4cHJDb250ZXh0ICptal9J bm5lckVDb250ZXh0Owp9IE1lcmdlSm9pblN0YXRlOwoKLyogLS0tLS0tLS0tLS0tLS0tLQog KgkgSGFzaEpvaW5TdGF0ZSBpbmZvcm1hdGlvbgogKgogKgkJaGFzaGNsYXVzZXMJCQkJb3Jp Z2luYWwgZm9ybSBvZiB0aGUgaGFzaGpvaW4gY29uZGl0aW9uCiAqCQloal9PdXRlckhhc2gJ CQlFeHByU3RhdGUgZm9yIGhhc2hpbmcgb3V0ZXIga2V5cwogKgkJaGpfSGFzaFRhYmxlCQkJ aGFzaCB0YWJsZSBmb3IgdGhlIGhhc2hqb2luCiAqCQkJCQkJCQkoTlVMTCBpZiB0YWJsZSBu b3QgYnVpbHQgeWV0KQogKgkJaGpfQ3VySGFzaFZhbHVlCQkJaGFzaCB2YWx1ZSBmb3IgY3Vy cmVudCBvdXRlciB0dXBsZQogKgkJaGpfQ3VyQnVja2V0Tm8JCQlyZWd1bGFyIGJ1Y2tldCMg Zm9yIGN1cnJlbnQgb3V0ZXIgdHVwbGUKICoJCWhqX0N1clNrZXdCdWNrZXRObwkJc2tldyBi dWNrZXQjIGZvciBjdXJyZW50IG91dGVyIHR1cGxlCiAqCQloal9DdXJUdXBsZQkJCQlsYXN0 IGlubmVyIHR1cGxlIG1hdGNoZWQgdG8gY3VycmVudCBvdXRlcgogKgkJCQkJCQkJdHVwbGUs IG9yIE5VTEwgaWYgc3RhcnRpbmcgc2VhcmNoCiAqCQkJCQkJCQkoaGpfQ3VyWFhYIHZhcmlh YmxlcyBhcmUgdW5kZWZpbmVkIGlmCiAqCQkJCQkJCQlPdXRlclR1cGxlU2xvdCBpcyBlbXB0 eSEpCiAqCQloal9PdXRlclR1cGxlU2xvdAkJdHVwbGUgc2xvdCBmb3Igb3V0ZXIgdHVwbGVz CiAqCQloal9IYXNoVHVwbGVTbG90CQl0dXBsZSBzbG90IGZvciBpbm5lciAoaGFzaGVkKSB0 dXBsZXMKICoJCWhqX051bGxPdXRlclR1cGxlU2xvdAlwcmVwYXJlZCBudWxsIHR1cGxlIGZv ciByaWdodC9yaWdodC1hbnRpL2Z1bGwKICoJCQkJCQkJCW91dGVyIGpvaW5zCiAqCQloal9O dWxsSW5uZXJUdXBsZVNsb3QJcHJlcGFyZWQgbnVsbCB0dXBsZSBmb3IgbGVmdC9mdWxsIG91 dGVyIGpvaW5zCiAqCQloal9OdWxsT3V0ZXJUdXBsZVN0b3JlCXR1cGxlc3RvcmUgaG9sZGlu ZyBvdXRlciB0dXBsZXMgdGhhdCBoYXZlCiAqCQkJCQkJCQludWxsIGpvaW4ga2V5cyAoYnV0 IG11c3QgYmUgZW1pdHRlZCBhbnl3YXkpCiAqCQloal9GaXJzdE91dGVyVHVwbGVTbG90CWZp cnN0IHR1cGxlIHJldHJpZXZlZCBmcm9tIG91dGVyIHBsYW4KICoJCWhqX0pvaW5TdGF0ZQkJ CWN1cnJlbnQgc3RhdGUgb2YgRXhlY0hhc2hKb2luIHN0YXRlIG1hY2hpbmUKICoJCWhqX0tl ZXBOdWxsVHVwbGVzCQl0cnVlIHRvIGtlZXAgb3V0ZXIgdHVwbGVzIHdpdGggbnVsbCBqb2lu IGtleXMKICoJCWhqX01hdGNoZWRPdXRlcgkJCXRydWUgaWYgZm91bmQgYSBqb2luIG1hdGNo IGZvciBjdXJyZW50IG91dGVyCiAqCQloal9PdXRlck5vdEVtcHR5CQl0cnVlIGlmIG91dGVy IHJlbGF0aW9uIGtub3duIG5vdCBlbXB0eQogKiAtLS0tLS0tLS0tLS0tLS0tCiAqLwoKLyog dGhlc2Ugc3RydWN0cyBhcmUgZGVmaW5lZCBpbiBleGVjdXRvci9oYXNoam9pbi5oOiAqLwp0 eXBlZGVmIHN0cnVjdCBIYXNoSm9pblR1cGxlRGF0YSAqSGFzaEpvaW5UdXBsZTsKdHlwZWRl ZiBzdHJ1Y3QgSGFzaEpvaW5UYWJsZURhdGEgKkhhc2hKb2luVGFibGU7Cgp0eXBlZGVmIHN0 cnVjdCBIYXNoSm9pblN0YXRlCnsKCUpvaW5TdGF0ZQlqczsJCQkJLyogaXRzIGZpcnN0IGZp ZWxkIGlzIE5vZGVUYWcgKi8KCUV4cHJTdGF0ZSAgKmhhc2hjbGF1c2VzOwoJRXhwclN0YXRl ICAqaGpfT3V0ZXJIYXNoOwoJSGFzaEpvaW5UYWJsZSBoal9IYXNoVGFibGU7Cgl1aW50MzIJ CWhqX0N1ckhhc2hWYWx1ZTsKCWludAkJCWhqX0N1ckJ1Y2tldE5vOwoJaW50CQkJaGpfQ3Vy U2tld0J1Y2tldE5vOwoJSGFzaEpvaW5UdXBsZSBoal9DdXJUdXBsZTsKCVR1cGxlVGFibGVT bG90ICpoal9PdXRlclR1cGxlU2xvdDsKCVR1cGxlVGFibGVTbG90ICpoal9IYXNoVHVwbGVT bG90OwoJVHVwbGVUYWJsZVNsb3QgKmhqX051bGxPdXRlclR1cGxlU2xvdDsKCVR1cGxlVGFi bGVTbG90ICpoal9OdWxsSW5uZXJUdXBsZVNsb3Q7CglUdXBsZXN0b3Jlc3RhdGUgKmhqX051 bGxPdXRlclR1cGxlU3RvcmU7CglUdXBsZVRhYmxlU2xvdCAqaGpfRmlyc3RPdXRlclR1cGxl U2xvdDsKCWludAkJCWhqX0pvaW5TdGF0ZTsKCWJvb2wJCWhqX0tlZXBOdWxsVHVwbGVzOwoJ Ym9vbAkJaGpfTWF0Y2hlZE91dGVyOwoJYm9vbAkJaGpfT3V0ZXJOb3RFbXB0eTsKfSBIYXNo Sm9pblN0YXRlOwoKCi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICoJCQkJIE1hdGVyaWFsaXphdGlvbiBTdGF0 ZSBJbmZvcm1hdGlvbgogKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAqLwoKLyogLS0tLS0tLS0tLS0tLS0tLQog KgkgTWF0ZXJpYWxTdGF0ZSBpbmZvcm1hdGlvbgogKgogKgkJbWF0ZXJpYWxpemUgbm9kZXMg YXJlIHVzZWQgdG8gbWF0ZXJpYWxpemUgdGhlIHJlc3VsdHMKICoJCW9mIGEgc3VicGxhbiBp bnRvIGEgdGVtcG9yYXJ5IGZpbGUuCiAqCiAqCQlzcy5zc19TY2FuVHVwbGVTbG90IHJlZmVy cyB0byBvdXRwdXQgb2YgdW5kZXJseWluZyBwbGFuLgogKiAtLS0tLS0tLS0tLS0tLS0tCiAq Lwp0eXBlZGVmIHN0cnVjdCBNYXRlcmlhbFN0YXRlCnsKCVNjYW5TdGF0ZQlzczsJCQkJLyog aXRzIGZpcnN0IGZpZWxkIGlzIE5vZGVUYWcgKi8KCWludAkJCWVmbGFnczsJCQkvKiBjYXBh YmlsaXR5IGZsYWdzIHRvIHBhc3MgdG8gdHVwbGVzdG9yZSAqLwoJYm9vbAkJZW9mX3VuZGVy bHlpbmc7IC8qIHJlYWNoZWQgZW5kIG9mIHVuZGVybHlpbmcgcGxhbj8gKi8KCVR1cGxlc3Rv cmVzdGF0ZSAqdHVwbGVzdG9yZXN0YXRlOwp9IE1hdGVyaWFsU3RhdGU7CgpzdHJ1Y3QgTWVt b2l6ZUVudHJ5OwpzdHJ1Y3QgTWVtb2l6ZVR1cGxlOwpzdHJ1Y3QgTWVtb2l6ZUtleTsKCi8q IC0tLS0tLS0tLS0tLS0tLS0KICoJIE1lbW9pemVTdGF0ZSBpbmZvcm1hdGlvbgogKgogKgkJ bWVtb2l6ZSBub2RlcyBhcmUgdXNlZCB0byBjYWNoZSByZWNlbnQgYW5kIGNvbW1vbmx5IHNl ZW4gcmVzdWx0cyBmcm9tCiAqCQlhIHBhcmFtZXRlcml6ZWQgc2Nhbi4KICogLS0tLS0tLS0t LS0tLS0tLQogKi8KdHlwZWRlZiBzdHJ1Y3QgTWVtb2l6ZVN0YXRlCnsKCVNjYW5TdGF0ZQlz czsJCQkJLyogaXRzIGZpcnN0IGZpZWxkIGlzIE5vZGVUYWcgKi8KCWludAkJCW1zdGF0dXM7 CQkvKiB2YWx1ZSBvZiBFeGVjTWVtb2l6ZSBzdGF0ZSBtYWNoaW5lICovCglpbnQJCQlua2V5 czsJCQkvKiBudW1iZXIgb2YgY2FjaGUga2V5cyAqLwoJc3RydWN0IG1lbW9pemVfaGFzaCAq aGFzaHRhYmxlOyAvKiBoYXNoIHRhYmxlIGZvciBjYWNoZSBlbnRyaWVzICovCglUdXBsZURl c2MJaGFzaGtleWRlc2M7CS8qIHR1cGxlIGRlc2NyaXB0b3IgZm9yIGNhY2hlIGtleXMgKi8K CVR1cGxlVGFibGVTbG90ICp0YWJsZXNsb3Q7CS8qIG1pbiB0dXBsZSBzbG90IGZvciBleGlz dGluZyBjYWNoZSBlbnRyaWVzICovCglUdXBsZVRhYmxlU2xvdCAqcHJvYmVzbG90OwkvKiB2 aXJ0dWFsIHNsb3QgdXNlZCBmb3IgaGFzaCBsb29rdXBzICovCglFeHByU3RhdGUgICpjYWNo ZV9lcV9leHByOwkvKiBDb21wYXJlIGV4ZWMgcGFyYW1zIHRvIGhhc2gga2V5ICovCglFeHBy U3RhdGUgKipwYXJhbV9leHByczsJLyogZXhwcnMgY29udGFpbmluZyB0aGUgcGFyYW1ldGVy cyB0byB0aGlzCgkJCQkJCQkJICogbm9kZSAqLwoJRm1nckluZm8gICAqaGFzaGZ1bmN0aW9u czsJLyogbG9va3VwIGRhdGEgZm9yIGhhc2ggZnVuY3MgbmtleXMgaW4gc2l6ZSAqLwoJT2lk CQkgICAqY29sbGF0aW9uczsJCS8qIGNvbGxhdGlvbiBmb3IgY29tcGFyaXNvbnMgbmtleXMg aW4gc2l6ZSAqLwoJdWludDY0CQltZW1fdXNlZDsJCS8qIGJ5dGVzIG9mIG1lbW9yeSB1c2Vk IGJ5IGNhY2hlICovCgl1aW50NjQJCW1lbV9saW1pdDsJCS8qIG1lbW9yeSBsaW1pdCBpbiBi eXRlcyBmb3IgdGhlIGNhY2hlICovCglNZW1vcnlDb250ZXh0IHRhYmxlQ29udGV4dDsgLyog bWVtb3J5IGNvbnRleHQgdG8gc3RvcmUgY2FjaGUgZGF0YSAqLwoJZGxpc3RfaGVhZAlscnVf bGlzdDsJCS8qIGxlYXN0IHJlY2VudGx5IHVzZWQgZW50cnkgbGlzdCAqLwoJc3RydWN0IE1l bW9pemVUdXBsZSAqbGFzdF90dXBsZTsJLyogVXNlZCB0byBwb2ludCB0byB0aGUgbGFzdCB0 dXBsZQoJCQkJCQkJCQkJICogcmV0dXJuZWQgZHVyaW5nIGEgY2FjaGUgaGl0IGFuZCB0aGUK CQkJCQkJCQkJCSAqIHR1cGxlIHdlIGxhc3Qgc3RvcmVkIHdoZW4KCQkJCQkJCQkJCSAqIHBv cHVsYXRpbmcgdGhlIGNhY2hlLiAqLwoJc3RydWN0IE1lbW9pemVFbnRyeSAqZW50cnk7IC8q IHRoZSBlbnRyeSB0aGF0ICdsYXN0X3R1cGxlJyBiZWxvbmdzIHRvIG9yCgkJCQkJCQkJICog TlVMTCBpZiAnbGFzdF90dXBsZScgaXMgTlVMTC4gKi8KCWJvb2wJCXNpbmdsZXJvdzsJCS8q IHRydWUgaWYgdGhlIGNhY2hlIGVudHJ5IGlzIHRvIGJlIG1hcmtlZCBhcwoJCQkJCQkJCSAq IGNvbXBsZXRlIGFmdGVyIGNhY2hpbmcgdGhlIGZpcnN0IHR1cGxlLiAqLwoJYm9vbAkJYmlu YXJ5X21vZGU7CS8qIHRydWUgd2hlbiBjYWNoZSBrZXkgc2hvdWxkIGJlIGNvbXBhcmVkIGJp dAoJCQkJCQkJCSAqIGJ5IGJpdCwgZmFsc2Ugd2hlbiB1c2luZyBoYXNoIGVxdWFsaXR5IG9w cyAqLwoJTWVtb2l6ZUluc3RydW1lbnRhdGlvbiBzdGF0czsJLyogZXhlY3V0aW9uIHN0YXRp c3RpY3MgKi8KCVNoYXJlZE1lbW9pemVJbmZvICpzaGFyZWRfaW5mbzsgLyogc3RhdGlzdGlj cyBmb3IgcGFyYWxsZWwgd29ya2VycyAqLwoJQml0bWFwc2V0ICAqa2V5cGFyYW1pZHM7CS8q IFBhcmFtLT5wYXJhbWlkcyBvZiBleHByZXNzaW9ucyBiZWxvbmdpbmcgdG8KCQkJCQkJCQkg KiBwYXJhbV9leHBycyAqLwp9IE1lbW9pemVTdGF0ZTsKCi8qIC0tLS0tLS0tLS0tLS0tLS0K ICoJIFdoZW4gcGVyZm9ybWluZyBzb3J0aW5nIGJ5IG11bHRpcGxlIGtleXMsIGl0J3MgcG9z c2libGUgdGhhdCB0aGUgaW5wdXQKICoJIGRhdGFzZXQgaXMgYWxyZWFkeSBzb3J0ZWQgb24g YSBwcmVmaXggb2YgdGhvc2Uga2V5cy4gV2UgY2FsbCB0aGVzZQogKgkgInByZXNvcnRlZCBr ZXlzIi4KICoJIFByZXNvcnRlZEtleURhdGEgcmVwcmVzZW50cyBpbmZvcm1hdGlvbiBhYm91 dCBvbmUgc3VjaCBrZXkuCiAqIC0tLS0tLS0tLS0tLS0tLS0KICovCnR5cGVkZWYgc3RydWN0 IFByZXNvcnRlZEtleURhdGEKewoJRm1nckluZm8JZmxpbmZvOwkJCS8qIGNvbXBhcmlzb24g ZnVuY3Rpb24gaW5mbyAqLwoJRnVuY3Rpb25DYWxsSW5mbyBmY2luZm87CS8qIGNvbXBhcmlz b24gZnVuY3Rpb24gY2FsbCBpbmZvICovCglPZmZzZXROdW1iZXIgYXR0bm87CQkJLyogYXR0 cmlidXRlIG51bWJlciBpbiB0dXBsZSAqLwp9IFByZXNvcnRlZEtleURhdGE7CgovKiAtLS0t LS0tLS0tLS0tLS0tCiAqCSBTb3J0U3RhdGUgaW5mb3JtYXRpb24KICogLS0tLS0tLS0tLS0t LS0tLQogKi8KdHlwZWRlZiBzdHJ1Y3QgU29ydFN0YXRlCnsKCVNjYW5TdGF0ZQlzczsJCQkJ LyogaXRzIGZpcnN0IGZpZWxkIGlzIE5vZGVUYWcgKi8KCWJvb2wJCXJhbmRvbUFjY2VzczsJ LyogbmVlZCByYW5kb20gYWNjZXNzIHRvIHNvcnQgb3V0cHV0PyAqLwoJYm9vbAkJYm91bmRl ZDsJCS8qIGlzIHRoZSByZXN1bHQgc2V0IGJvdW5kZWQ/ICovCglpbnQ2NAkJYm91bmQ7CQkJ LyogaWYgYm91bmRlZCwgaG93IG1hbnkgdHVwbGVzIGFyZSBuZWVkZWQgKi8KCWJvb2wJCXNv cnRfRG9uZTsJCS8qIHNvcnQgY29tcGxldGVkIHlldD8gKi8KCWJvb2wJCWJvdW5kZWRfRG9u ZTsJLyogdmFsdWUgb2YgYm91bmRlZCB3ZSBkaWQgdGhlIHNvcnQgd2l0aCAqLwoJaW50NjQJ CWJvdW5kX0RvbmU7CQkvKiB2YWx1ZSBvZiBib3VuZCB3ZSBkaWQgdGhlIHNvcnQgd2l0aCAq LwoJdm9pZAkgICAqdHVwbGVzb3J0c3RhdGU7IC8qIHByaXZhdGUgc3RhdGUgb2YgdHVwbGVz b3J0LmMgKi8KCWJvb2wJCWFtX3dvcmtlcjsJCS8qIGFyZSB3ZSBhIHdvcmtlcj8gKi8KCWJv b2wJCWRhdHVtU29ydDsJCS8qIERhdHVtIHNvcnQgaW5zdGVhZCBvZiB0dXBsZSBzb3J0PyAq LwoJU2hhcmVkU29ydEluZm8gKnNoYXJlZF9pbmZvOwkvKiBvbmUgZW50cnkgcGVyIHdvcmtl ciAqLwp9IFNvcnRTdGF0ZTsKCnR5cGVkZWYgZW51bQp7CglJTkNTT1JUX0xPQURGVUxMU09S VCwKCUlOQ1NPUlRfTE9BRFBSRUZJWFNPUlQsCglJTkNTT1JUX1JFQURGVUxMU09SVCwKCUlO Q1NPUlRfUkVBRFBSRUZJWFNPUlQsCn0gSW5jcmVtZW50YWxTb3J0RXhlY3V0aW9uU3RhdHVz OwoKdHlwZWRlZiBzdHJ1Y3QgSW5jcmVtZW50YWxTb3J0U3RhdGUKewoJU2NhblN0YXRlCXNz OwkJCQkvKiBpdHMgZmlyc3QgZmllbGQgaXMgTm9kZVRhZyAqLwoJYm9vbAkJYm91bmRlZDsJ CS8qIGlzIHRoZSByZXN1bHQgc2V0IGJvdW5kZWQ/ICovCglpbnQ2NAkJYm91bmQ7CQkJLyog aWYgYm91bmRlZCwgaG93IG1hbnkgdHVwbGVzIGFyZSBuZWVkZWQgKi8KCWJvb2wJCW91dGVy Tm9kZURvbmU7CS8qIGZpbmlzaGVkIGZldGNoaW5nIHR1cGxlcyBmcm9tIG91dGVyIG5vZGUg Ki8KCWludDY0CQlib3VuZF9Eb25lOwkJLyogdmFsdWUgb2YgYm91bmQgd2UgZGlkIHRoZSBz b3J0IHdpdGggKi8KCUluY3JlbWVudGFsU29ydEV4ZWN1dGlvblN0YXR1cyBleGVjdXRpb25f c3RhdHVzOwoJaW50NjQJCW5fZnVsbHNvcnRfcmVtYWluaW5nOwoJVHVwbGVzb3J0c3RhdGUg KmZ1bGxzb3J0X3N0YXRlOyAvKiBwcml2YXRlIHN0YXRlIG9mIHR1cGxlc29ydC5jICovCglU dXBsZXNvcnRzdGF0ZSAqcHJlZml4c29ydF9zdGF0ZTsJLyogcHJpdmF0ZSBzdGF0ZSBvZiB0 dXBsZXNvcnQuYyAqLwoJLyogdGhlIGtleXMgYnkgd2hpY2ggdGhlIGlucHV0IHBhdGggaXMg YWxyZWFkeSBzb3J0ZWQgKi8KCVByZXNvcnRlZEtleURhdGEgKnByZXNvcnRlZF9rZXlzOwoK CUluY3JlbWVudGFsU29ydEluZm8gaW5jc29ydF9pbmZvOwoKCS8qIHNsb3QgZm9yIHBpdm90 IHR1cGxlIGRlZmluaW5nIHZhbHVlcyBvZiBwcmVzb3J0ZWQga2V5cyB3aXRoaW4gZ3JvdXAg Ki8KCVR1cGxlVGFibGVTbG90ICpncm91cF9waXZvdDsKCVR1cGxlVGFibGVTbG90ICp0cmFu c2Zlcl90dXBsZTsKCWJvb2wJCWFtX3dvcmtlcjsJCS8qIGFyZSB3ZSBhIHdvcmtlcj8gKi8K CVNoYXJlZEluY3JlbWVudGFsU29ydEluZm8gKnNoYXJlZF9pbmZvOyAvKiBvbmUgZW50cnkg cGVyIHdvcmtlciAqLwp9IEluY3JlbWVudGFsU29ydFN0YXRlOwoKLyogLS0tLS0tLS0tLS0t LS0tLS0tLS0tCiAqCUdyb3VwU3RhdGUgaW5mb3JtYXRpb24KICogLS0tLS0tLS0tLS0tLS0t LS0tLS0tCiAqLwp0eXBlZGVmIHN0cnVjdCBHcm91cFN0YXRlCnsKCVNjYW5TdGF0ZQlzczsJ CQkJLyogaXRzIGZpcnN0IGZpZWxkIGlzIE5vZGVUYWcgKi8KCUV4cHJTdGF0ZSAgKmVxZnVu Y3Rpb247CQkvKiBlcXVhbGl0eSBmdW5jdGlvbiAqLwoJYm9vbAkJZ3JwX2RvbmU7CQkvKiBp bmRpY2F0ZXMgY29tcGxldGlvbiBvZiBHcm91cCBzY2FuICovCn0gR3JvdXBTdGF0ZTsKCi8q IC0tLS0tLS0tLS0tLS0tLS0tLS0tLQogKglBZ2dTdGF0ZSBpbmZvcm1hdGlvbgogKgogKglz cy5zc19TY2FuVHVwbGVTbG90IHJlZmVycyB0byBvdXRwdXQgb2YgdW5kZXJseWluZyBwbGFu LgogKgogKglOb3RlOiBzcy5wcy5wc19FeHByQ29udGV4dCBjb250YWlucyBlY3h0X2FnZ3Zh bHVlcyBhbmQKICoJZWN4dF9hZ2dudWxscyBhcnJheXMsIHdoaWNoIGhvbGQgdGhlIGNvbXB1 dGVkIGFnZyB2YWx1ZXMgZm9yIHRoZSBjdXJyZW50CiAqCWlucHV0IGdyb3VwIGR1cmluZyBl dmFsdWF0aW9uIG9mIGFuIEFnZyBub2RlJ3Mgb3V0cHV0IHR1cGxlKHMpLiAgV2UKICoJY3Jl YXRlIGEgc2Vjb25kIEV4cHJDb250ZXh0LCB0bXBjb250ZXh0LCBpbiB3aGljaCB0byBldmFs dWF0ZSBpbnB1dAogKglleHByZXNzaW9ucyBhbmQgcnVuIHRoZSBhZ2dyZWdhdGUgdHJhbnNp dGlvbiBmdW5jdGlvbnMuCiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLQogKi8KLyogdGhlc2Ug c3RydWN0cyBhcmUgcHJpdmF0ZSBpbiBub2RlQWdnLmM6ICovCnR5cGVkZWYgc3RydWN0IEFn Z1N0YXRlUGVyQWdnRGF0YSAqQWdnU3RhdGVQZXJBZ2c7CnR5cGVkZWYgc3RydWN0IEFnZ1N0 YXRlUGVyVHJhbnNEYXRhICpBZ2dTdGF0ZVBlclRyYW5zOwp0eXBlZGVmIHN0cnVjdCBBZ2dT dGF0ZVBlckdyb3VwRGF0YSAqQWdnU3RhdGVQZXJHcm91cDsKdHlwZWRlZiBzdHJ1Y3QgQWdn U3RhdGVQZXJQaGFzZURhdGEgKkFnZ1N0YXRlUGVyUGhhc2U7CnR5cGVkZWYgc3RydWN0IEFn Z1N0YXRlUGVySGFzaERhdGEgKkFnZ1N0YXRlUGVySGFzaDsKCnR5cGVkZWYgc3RydWN0IEFn Z1N0YXRlCnsKCVNjYW5TdGF0ZQlzczsJCQkJLyogaXRzIGZpcnN0IGZpZWxkIGlzIE5vZGVU YWcgKi8KCUxpc3QJICAgKmFnZ3M7CQkJLyogYWxsIEFnZ3JlZiBub2RlcyBpbiB0YXJnZXRs aXN0ICYgcXVhbHMgKi8KCWludAkJCW51bWFnZ3M7CQkvKiBsZW5ndGggb2YgbGlzdCAoY291 bGQgYmUgemVybyEpICovCglpbnQJCQludW10cmFuczsJCS8qIG51bWJlciBvZiBwZXJ0cmFu cyBpdGVtcyAqLwoJQWdnU3RyYXRlZ3kgYWdnc3RyYXRlZ3k7CS8qIHN0cmF0ZWd5IG1vZGUg Ki8KCUFnZ1NwbGl0CWFnZ3NwbGl0OwkJLyogYWdnLXNwbGl0dGluZyBtb2RlLCBzZWUgbm9k ZXMuaCAqLwoJQWdnU3RhdGVQZXJQaGFzZSBwaGFzZTsJCS8qIHBvaW50ZXIgdG8gY3VycmVu dCBwaGFzZSBkYXRhICovCglpbnQJCQludW1waGFzZXM7CQkvKiBudW1iZXIgb2YgcGhhc2Vz IChpbmNsdWRpbmcgcGhhc2UgMCkgKi8KCWludAkJCWN1cnJlbnRfcGhhc2U7CS8qIGN1cnJl bnQgcGhhc2UgbnVtYmVyICovCglBZ2dTdGF0ZVBlckFnZyBwZXJhZ2c7CQkvKiBwZXItQWdn cmVmIGluZm9ybWF0aW9uICovCglBZ2dTdGF0ZVBlclRyYW5zIHBlcnRyYW5zOwkvKiBwZXIt VHJhbnMgc3RhdGUgaW5mb3JtYXRpb24gKi8KCUV4cHJDb250ZXh0ICpoYXNoY29udGV4dDsJ LyogZWNvbnRleHRzIGZvciBsb25nLWxpdmVkIGRhdGEgKGhhc2h0YWJsZSkgKi8KCUV4cHJD b250ZXh0ICoqYWdnY29udGV4dHM7CS8qIGVjb250ZXh0cyBmb3IgbG9uZy1saXZlZCBkYXRh IChwZXIgR1MpICovCglFeHByQ29udGV4dCAqdG1wY29udGV4dDsJLyogZWNvbnRleHQgZm9y IGlucHV0IGV4cHJlc3Npb25zICovCiNkZWZpbmUgRklFTEROT19BR0dTVEFURV9DVVJBR0dD T05URVhUIDE0CglFeHByQ29udGV4dCAqY3VyYWdnY29udGV4dDsgLyogY3VycmVudGx5IGFj dGl2ZSBhZ2djb250ZXh0ICovCglBZ2dTdGF0ZVBlckFnZyBjdXJwZXJhZ2c7CS8qIGN1cnJl bnRseSBhY3RpdmUgYWdncmVnYXRlLCBpZiBhbnkgKi8KI2RlZmluZSBGSUVMRE5PX0FHR1NU QVRFX0NVUlBFUlRSQU5TIDE2CglBZ2dTdGF0ZVBlclRyYW5zIGN1cnBlcnRyYW5zOwkvKiBj dXJyZW50bHkgYWN0aXZlIHRyYW5zIHN0YXRlLCBpZiBhbnkgKi8KCWJvb2wJCWlucHV0X2Rv bmU7CQkvKiBpbmRpY2F0ZXMgZW5kIG9mIGlucHV0ICovCglib29sCQlhZ2dfZG9uZTsJCS8q IGluZGljYXRlcyBjb21wbGV0aW9uIG9mIEFnZyBzY2FuICovCglpbnQJCQlwcm9qZWN0ZWRf c2V0OwkvKiBUaGUgbGFzdCBwcm9qZWN0ZWQgZ3JvdXBpbmcgc2V0ICovCiNkZWZpbmUgRklF TEROT19BR0dTVEFURV9DVVJSRU5UX1NFVCAyMAoJaW50CQkJY3VycmVudF9zZXQ7CS8qIFRo ZSBjdXJyZW50IGdyb3VwaW5nIHNldCBiZWluZyBldmFsdWF0ZWQgKi8KCUJpdG1hcHNldCAg Kmdyb3VwZWRfY29sczsJLyogZ3JvdXBlZCBjb2xzIGluIGN1cnJlbnQgcHJvamVjdGlvbiAq LwoJTGlzdAkgICAqYWxsX2dyb3VwZWRfY29sczsJLyogbGlzdCBvZiBhbGwgZ3JvdXBlZCBj b2xzIGluIERFU0Mgb3JkZXIgKi8KCUJpdG1hcHNldCAgKmNvbG5vc19uZWVkZWQ7CS8qIGFs bCBjb2x1bW5zIG5lZWRlZCBmcm9tIHRoZSBvdXRlciBwbGFuICovCglpbnQJCQltYXhfY29s bm9fbmVlZGVkOwkvKiBoaWdoZXN0IGNvbG5vIG5lZWRlZCBmcm9tIG91dGVyIHBsYW4gKi8K CWJvb2wJCWFsbF9jb2xzX25lZWRlZDsJLyogYXJlIGFsbCBjb2xzIGZyb20gb3V0ZXIgcGxh biBuZWVkZWQ/ICovCgkvKiBUaGVzZSBmaWVsZHMgYXJlIGZvciBncm91cGluZyBzZXQgcGhh c2UgZGF0YSAqLwoJaW50CQkJbWF4c2V0czsJCS8qIFRoZSBtYXggbnVtYmVyIG9mIHNldHMg aW4gYW55IHBoYXNlICovCglBZ2dTdGF0ZVBlclBoYXNlIHBoYXNlczsJLyogYXJyYXkgb2Yg YWxsIHBoYXNlcyAqLwoJVHVwbGVzb3J0c3RhdGUgKnNvcnRfaW47CS8qIHNvcnRlZCBpbnB1 dCB0byBwaGFzZXMgPiAxICovCglUdXBsZXNvcnRzdGF0ZSAqc29ydF9vdXQ7CS8qIGlucHV0 IGlzIGNvcGllZCBoZXJlIGZvciBuZXh0IHBoYXNlICovCglUdXBsZVRhYmxlU2xvdCAqc29y dF9zbG90OwkvKiBzbG90IGZvciBzb3J0IHJlc3VsdHMgKi8KCS8qIHRoZXNlIGZpZWxkcyBh cmUgdXNlZCBpbiBBR0dfUExBSU4gYW5kIEFHR19TT1JURUQgbW9kZXM6ICovCglBZ2dTdGF0 ZVBlckdyb3VwICpwZXJncm91cHM7CS8qIGdyb3VwaW5nIHNldCBpbmRleGVkIGFycmF5IG9m IHBlci1ncm91cAoJCQkJCQkJCQkgKiBwb2ludGVycyAqLwoJSGVhcFR1cGxlCWdycF9maXJz dFR1cGxlOyAvKiBjb3B5IG9mIGZpcnN0IHR1cGxlIG9mIGN1cnJlbnQgZ3JvdXAgKi8KCS8q IHRoZXNlIGZpZWxkcyBhcmUgdXNlZCBpbiBBR0dfSEFTSEVEIGFuZCBBR0dfTUlYRUQgbW9k ZXM6ICovCglib29sCQl0YWJsZV9maWxsZWQ7CS8qIGhhc2ggdGFibGUgZmlsbGVkIHlldD8g Ki8KCWludAkJCW51bV9oYXNoZXM7CglNZW1vcnlDb250ZXh0IGhhc2hfbWV0YWN4dDsgLyog bWVtb3J5IGZvciBoYXNoIHRhYmxlIGJ1Y2tldCBhcnJheSAqLwoJTWVtb3J5Q29udGV4dCBo YXNoX3R1cGxlc2N4dDsJLyogbWVtb3J5IGZvciBoYXNoIHRhYmxlIHR1cGxlcyAqLwoJc3Ry dWN0IExvZ2ljYWxUYXBlU2V0ICpoYXNoX3RhcGVzZXQ7CS8qIHRhcGUgc2V0IGZvciBoYXNo IHNwaWxsIHRhcGVzICovCglzdHJ1Y3QgSGFzaEFnZ1NwaWxsICpoYXNoX3NwaWxsczsJLyog SGFzaEFnZ1NwaWxsIGZvciBlYWNoIGdyb3VwaW5nIHNldCwKCQkJCQkJCQkJCSAqIGV4aXN0 cyBvbmx5IGR1cmluZyBmaXJzdCBwYXNzICovCglUdXBsZVRhYmxlU2xvdCAqaGFzaF9zcGls bF9yc2xvdDsJLyogZm9yIHJlYWRpbmcgc3BpbGwgZmlsZXMgKi8KCVR1cGxlVGFibGVTbG90 ICpoYXNoX3NwaWxsX3dzbG90OwkvKiBmb3Igd3JpdGluZyBzcGlsbCBmaWxlcyAqLwoJTGlz dAkgICAqaGFzaF9iYXRjaGVzOwkvKiBoYXNoIGJhdGNoZXMgcmVtYWluaW5nIHRvIGJlIHBy b2Nlc3NlZCAqLwoJYm9vbAkJaGFzaF9ldmVyX3NwaWxsZWQ7CS8qIGV2ZXIgc3BpbGxlZCBk dXJpbmcgdGhpcyBleGVjdXRpb24/ICovCglib29sCQloYXNoX3NwaWxsX21vZGU7CS8qIHdl IGhpdCBhIGxpbWl0IGR1cmluZyB0aGUgY3VycmVudCBiYXRjaAoJCQkJCQkJCQkgKiBhbmQg d2UgbXVzdCBub3QgY3JlYXRlIG5ldyBncm91cHMgKi8KCVNpemUJCWhhc2hfbWVtX2xpbWl0 OyAvKiBsaW1pdCBiZWZvcmUgc3BpbGxpbmcgaGFzaCB0YWJsZSAqLwoJdWludDY0CQloYXNo X25ncm91cHNfbGltaXQ7IC8qIGxpbWl0IGJlZm9yZSBzcGlsbGluZyBoYXNoIHRhYmxlICov CglpbnQJCQloYXNoX3BsYW5uZWRfcGFydGl0aW9uczsJLyogbnVtYmVyIG9mIHBhcnRpdGlv bnMgcGxhbm5lZAoJCQkJCQkJCQkJCSAqIGZvciBmaXJzdCBwYXNzICovCglkb3VibGUJCWhh c2hlbnRyeXNpemU7CS8qIGVzdGltYXRlIHJldmlzZWQgZHVyaW5nIGV4ZWN1dGlvbiAqLwoJ U2l6ZQkJaGFzaF9tZW1fcGVhazsJLyogcGVhayBoYXNoIHRhYmxlIG1lbW9yeSB1c2FnZSAq LwoJdWludDY0CQloYXNoX25ncm91cHNfY3VycmVudDsJLyogbnVtYmVyIG9mIGdyb3VwcyBj dXJyZW50bHkgaW4KCQkJCQkJCQkJCSAqIG1lbW9yeSBpbiBhbGwgaGFzaCB0YWJsZXMgKi8K CXVpbnQ2NAkJaGFzaF9kaXNrX3VzZWQ7IC8qIGtCIG9mIGRpc2sgc3BhY2UgdXNlZCAqLwoJ aW50CQkJaGFzaF9iYXRjaGVzX3VzZWQ7CS8qIGJhdGNoZXMgdXNlZCBkdXJpbmcgZW50aXJl IGV4ZWN1dGlvbiAqLwoKCUFnZ1N0YXRlUGVySGFzaCBwZXJoYXNoOwkvKiBhcnJheSBvZiBw ZXItaGFzaHRhYmxlIGRhdGEgKi8KCUFnZ1N0YXRlUGVyR3JvdXAgKmhhc2hfcGVyZ3JvdXA7 CS8qIGdyb3VwaW5nIHNldCBpbmRleGVkIGFycmF5IG9mCgkJCQkJCQkJCQkgKiBwZXItZ3Jv dXAgcG9pbnRlcnMgKi8KCgkvKiBzdXBwb3J0IGZvciBldmFsdWF0aW9uIG9mIGFnZyBpbnB1 dCBleHByZXNzaW9uczogKi8KI2RlZmluZSBGSUVMRE5PX0FHR1NUQVRFX0FMTF9QRVJHUk9V UFMgNTQKCUFnZ1N0YXRlUGVyR3JvdXAgKmFsbF9wZXJncm91cHM7CS8qIGFycmF5IG9mIGZp cnN0IC0+cGVyZ3JvdXBzLCB0aGFuCgkJCQkJCQkJCQkgKiAtPmhhc2hfcGVyZ3JvdXAgKi8K CVNoYXJlZEFnZ0luZm8gKnNoYXJlZF9pbmZvOyAvKiBvbmUgZW50cnkgcGVyIHdvcmtlciAq Lwp9IEFnZ1N0YXRlOwoKLyogLS0tLS0tLS0tLS0tLS0tLQogKglXaW5kb3dBZ2dTdGF0ZSBp bmZvcm1hdGlvbgogKiAtLS0tLS0tLS0tLS0tLS0tCiAqLwovKiB0aGVzZSBzdHJ1Y3RzIGFy ZSBwcml2YXRlIGluIG5vZGVXaW5kb3dBZ2cuYzogKi8KdHlwZWRlZiBzdHJ1Y3QgV2luZG93 U3RhdGVQZXJGdW5jRGF0YSAqV2luZG93U3RhdGVQZXJGdW5jOwp0eXBlZGVmIHN0cnVjdCBX aW5kb3dTdGF0ZVBlckFnZ0RhdGEgKldpbmRvd1N0YXRlUGVyQWdnOwoKLyoKICogV2luZG93 QWdnU3RhdHVzIC0tIFVzZWQgdG8gdHJhY2sgdGhlIHN0YXR1cyBvZiBXaW5kb3dBZ2dTdGF0 ZQogKi8KdHlwZWRlZiBlbnVtIFdpbmRvd0FnZ1N0YXR1cwp7CglXSU5ET1dBR0dfRE9ORSwJ CQkJLyogTm8gbW9yZSBwcm9jZXNzaW5nIHRvIGRvICovCglXSU5ET1dBR0dfUlVOLAkJCQkv KiBOb3JtYWwgcHJvY2Vzc2luZyBvZiB3aW5kb3cgZnVuY3MgKi8KCVdJTkRPV0FHR19QQVNT VEhST1VHSCwJCS8qIERvbid0IGV2YWwgd2luZG93IGZ1bmNzICovCglXSU5ET1dBR0dfUEFT U1RIUk9VR0hfU1RSSUNULAkvKiBQYXNzLXRocm91Z2ggcGx1cyBkb24ndCBzdG9yZSBuZXcK CQkJCQkJCQkJICogdHVwbGVzIGR1cmluZyBzcG9vbCAqLwp9IFdpbmRvd0FnZ1N0YXR1czsK CnR5cGVkZWYgc3RydWN0IFdpbmRvd0FnZ1N0YXRlCnsKCVNjYW5TdGF0ZQlzczsJCQkJLyog aXRzIGZpcnN0IGZpZWxkIGlzIE5vZGVUYWcgKi8KCgkvKiB0aGVzZSBmaWVsZHMgYXJlIGZp bGxlZCBpbiBieSBFeGVjSW5pdEV4cHI6ICovCglMaXN0CSAgICpmdW5jczsJCQkvKiBhbGwg V2luZG93RnVuYyBub2RlcyBpbiB0YXJnZXRsaXN0ICovCglpbnQJCQludW1mdW5jczsJCS8q IHRvdGFsIG51bWJlciBvZiB3aW5kb3cgZnVuY3Rpb25zICovCglpbnQJCQludW1hZ2dzOwkJ LyogbnVtYmVyIHRoYXQgYXJlIHBsYWluIGFnZ3JlZ2F0ZXMgKi8KCglXaW5kb3dTdGF0ZVBl ckZ1bmMgcGVyZnVuYzsgLyogcGVyLXdpbmRvdy1mdW5jdGlvbiBpbmZvcm1hdGlvbiAqLwoJ V2luZG93U3RhdGVQZXJBZ2cgcGVyYWdnOwkvKiBwZXItcGxhaW4tYWdncmVnYXRlIGluZm9y bWF0aW9uICovCglFeHByU3RhdGUgICpwYXJ0RXFmdW5jdGlvbjsgLyogZXF1YWxpdHkgZnVu Y3MgZm9yIHBhcnRpdGlvbiBjb2x1bW5zICovCglFeHByU3RhdGUgICpvcmRFcWZ1bmN0aW9u OwkvKiBlcXVhbGl0eSBmdW5jcyBmb3Igb3JkZXJpbmcgY29sdW1ucyAqLwoJVHVwbGVzdG9y ZXN0YXRlICpidWZmZXI7CS8qIHN0b3JlcyByb3dzIG9mIGN1cnJlbnQgcGFydGl0aW9uICov CglpbnQJCQljdXJyZW50X3B0cjsJLyogcmVhZCBwb2ludGVyICMgZm9yIGN1cnJlbnQgcm93 ICovCglpbnQJCQlmcmFtZWhlYWRfcHRyOwkvKiByZWFkIHBvaW50ZXIgIyBmb3IgZnJhbWUg aGVhZCwgaWYgdXNlZCAqLwoJaW50CQkJZnJhbWV0YWlsX3B0cjsJLyogcmVhZCBwb2ludGVy ICMgZm9yIGZyYW1lIHRhaWwsIGlmIHVzZWQgKi8KCWludAkJCWdyb3VwdGFpbF9wdHI7CS8q IHJlYWQgcG9pbnRlciAjIGZvciBncm91cCB0YWlsLCBpZiB1c2VkICovCglpbnQ2NAkJc3Bv b2xlZF9yb3dzOwkvKiB0b3RhbCAjIG9mIHJvd3MgaW4gYnVmZmVyICovCglpbnQ2NAkJY3Vy cmVudHBvczsJCS8qIHBvc2l0aW9uIG9mIGN1cnJlbnQgcm93IGluIHBhcnRpdGlvbiAqLwoJ aW50NjQJCWZyYW1laGVhZHBvczsJLyogY3VycmVudCBmcmFtZSBoZWFkIHBvc2l0aW9uICov CglpbnQ2NAkJZnJhbWV0YWlscG9zOwkvKiBjdXJyZW50IGZyYW1lIHRhaWwgcG9zaXRpb24g KGZyYW1lIGVuZCsxKSAqLwoJLyogdXNlIHN0cnVjdCBwb2ludGVyIHRvIGF2b2lkIGluY2x1 ZGluZyB3aW5kb3dhcGkuaCBoZXJlICovCglzdHJ1Y3QgV2luZG93T2JqZWN0RGF0YSAqYWdn X3dpbm9iajsJLyogd2lub2JqIGZvciBhZ2dyZWdhdGUgZmV0Y2hlcyAqLwoJaW50NjQJCWFn Z3JlZ2F0ZWRiYXNlOyAvKiBzdGFydCByb3cgZm9yIGN1cnJlbnQgYWdncmVnYXRlcyAqLwoJ aW50NjQJCWFnZ3JlZ2F0ZWR1cHRvOyAvKiByb3dzIGJlZm9yZSB0aGlzIG9uZSBhcmUgYWdn cmVnYXRlZCAqLwoJV2luZG93QWdnU3RhdHVzIHN0YXR1czsJCS8qIHJ1biBzdGF0dXMgb2Yg V2luZG93QWdnU3RhdGUgKi8KCglpbnQJCQlmcmFtZU9wdGlvbnM7CS8qIGZyYW1lX2NsYXVz ZSBvcHRpb25zLCBzZWUgV2luZG93RGVmICovCglFeHByU3RhdGUgICpzdGFydE9mZnNldDsJ LyogZXhwcmVzc2lvbiBmb3Igc3RhcnRpbmcgYm91bmQgb2Zmc2V0ICovCglFeHByU3RhdGUg ICplbmRPZmZzZXQ7CQkvKiBleHByZXNzaW9uIGZvciBlbmRpbmcgYm91bmQgb2Zmc2V0ICov CglEYXR1bQkJc3RhcnRPZmZzZXRWYWx1ZTsJLyogcmVzdWx0IG9mIHN0YXJ0T2Zmc2V0IGV2 YWx1YXRpb24gKi8KCURhdHVtCQllbmRPZmZzZXRWYWx1ZTsgLyogcmVzdWx0IG9mIGVuZE9m ZnNldCBldmFsdWF0aW9uICovCgoJLyogdGhlc2UgZmllbGRzIGFyZSB1c2VkIHdpdGggUkFO R0Ugb2Zmc2V0IFBSRUNFRElORy9GT0xMT1dJTkc6ICovCglGbWdySW5mbwlzdGFydEluUmFu Z2VGdW5jOwkvKiBpbl9yYW5nZSBmdW5jdGlvbiBmb3Igc3RhcnRPZmZzZXQgKi8KCUZtZ3JJ bmZvCWVuZEluUmFuZ2VGdW5jOyAvKiBpbl9yYW5nZSBmdW5jdGlvbiBmb3IgZW5kT2Zmc2V0 ICovCglPaWQJCQlpblJhbmdlQ29sbDsJLyogY29sbGF0aW9uIGZvciBpbl9yYW5nZSB0ZXN0 cyAqLwoJYm9vbAkJaW5SYW5nZUFzYzsJCS8qIHVzZSBBU0Mgc29ydCBvcmRlciBmb3IgaW5f cmFuZ2UgdGVzdHM/ICovCglib29sCQlpblJhbmdlTnVsbHNGaXJzdDsJLyogbnVsbHMgc29y dCBmaXJzdCBmb3IgaW5fcmFuZ2UgdGVzdHM/ICovCgoJLyogZmllbGRzIHJlbGF0aW5nIHRv IHJ1bmNvbmRpdGlvbnMgKi8KCWJvb2wJCXVzZV9wYXNzX3Rocm91Z2g7CS8qIFdoZW4gZmFs c2UsIHN0b3AgZXhlY3V0aW9uIHdoZW4KCQkJCQkJCQkJICogcnVuY29uZGl0aW9uIGlzIG5v IGxvbmdlciB0cnVlLiAgRWxzZQoJCQkJCQkJCQkgKiBqdXN0IHN0b3AgZXZhbHVhdGluZyB3 aW5kb3cgZnVuY3MuICovCglib29sCQl0b3Bfd2luZG93OwkJLyogdHJ1ZSBpZiB0aGlzIGlz IHRoZSB0b3AtbW9zdCBXaW5kb3dBZ2cgb3IKCQkJCQkJCQkgKiB0aGUgb25seSBXaW5kb3dB Z2cgaW4gdGhpcyBxdWVyeSBsZXZlbCAqLwoJRXhwclN0YXRlICAqcnVuY29uZGl0aW9uOwkv KiBDb25kaXRpb24gd2hpY2ggbXVzdCByZW1haW4gdHJ1ZSBvdGhlcndpc2UKCQkJCQkJCQkg KiBleGVjdXRpb24gb2YgdGhlIFdpbmRvd0FnZyB3aWxsIGZpbmlzaCBvcgoJCQkJCQkJCSAq IGdvIGludG8gcGFzcy10aHJvdWdoIG1vZGUuICBOVUxMIHdoZW4gdGhlcmUKCQkJCQkJCQkg KiBpcyBubyBzdWNoIGNvbmRpdGlvbi4gKi8KCgkvKiB0aGVzZSBmaWVsZHMgYXJlIHVzZWQg aW4gR1JPVVBTIG1vZGU6ICovCglpbnQ2NAkJY3VycmVudGdyb3VwOwkvKiBwZWVyIGdyb3Vw ICMgb2YgY3VycmVudCByb3cgaW4gcGFydGl0aW9uICovCglpbnQ2NAkJZnJhbWVoZWFkZ3Jv dXA7IC8qIHBlZXIgZ3JvdXAgIyBvZiBmcmFtZSBoZWFkIHJvdyAqLwoJaW50NjQJCWZyYW1l dGFpbGdyb3VwOyAvKiBwZWVyIGdyb3VwICMgb2YgZnJhbWUgdGFpbCByb3cgKi8KCWludDY0 CQlncm91cGhlYWRwb3M7CS8qIGN1cnJlbnQgcm93J3MgcGVlciBncm91cCBoZWFkIHBvc2l0 aW9uICovCglpbnQ2NAkJZ3JvdXB0YWlscG9zOwkvKiAiICIgIiAiIHRhaWwgcG9zaXRpb24g KGdyb3VwIGVuZCsxKSAqLwoKCU1lbW9yeUNvbnRleHQgcGFydGNvbnRleHQ7CS8qIGNvbnRl eHQgZm9yIHBhcnRpdGlvbi1saWZlc3BhbiBkYXRhICovCglNZW1vcnlDb250ZXh0IGFnZ2Nv bnRleHQ7CS8qIHNoYXJlZCBjb250ZXh0IGZvciBhZ2dyZWdhdGUgd29ya2luZyBkYXRhICov CglNZW1vcnlDb250ZXh0IGN1cmFnZ2NvbnRleHQ7CS8qIGN1cnJlbnQgYWdncmVnYXRlJ3Mg d29ya2luZyBkYXRhICovCglFeHByQ29udGV4dCAqdG1wY29udGV4dDsJLyogc2hvcnQtdGVy bSBldmFsdWF0aW9uIGNvbnRleHQgKi8KCglib29sCQlhbGxfZmlyc3Q7CQkvKiB0cnVlIGlm IHRoZSBzY2FuIGlzIHN0YXJ0aW5nICovCglib29sCQlwYXJ0aXRpb25fc3Bvb2xlZDsJLyog dHJ1ZSBpZiBhbGwgdHVwbGVzIGluIGN1cnJlbnQgcGFydGl0aW9uCgkJCQkJCQkJCSAqIGhh dmUgYmVlbiBzcG9vbGVkIGludG8gdHVwbGVzdG9yZSAqLwoJYm9vbAkJbmV4dF9wYXJ0aXRp b247IC8qIHRydWUgaWYgYmVnaW5fcGFydGl0aW9uIG5lZWRzIHRvIGJlIGNhbGxlZCAqLwoJ Ym9vbAkJbW9yZV9wYXJ0aXRpb25zOwkvKiB0cnVlIGlmIHRoZXJlJ3MgbW9yZSBwYXJ0aXRp b25zIGFmdGVyCgkJCQkJCQkJCSAqIHRoaXMgb25lICovCglib29sCQlmcmFtZWhlYWRfdmFs aWQ7CS8qIHRydWUgaWYgZnJhbWVoZWFkcG9zIGlzIGtub3duIHVwIHRvCgkJCQkJCQkJCSAq IGRhdGUgZm9yIGN1cnJlbnQgcm93ICovCglib29sCQlmcmFtZXRhaWxfdmFsaWQ7CS8qIHRy dWUgaWYgZnJhbWV0YWlscG9zIGlzIGtub3duIHVwIHRvCgkJCQkJCQkJCSAqIGRhdGUgZm9y IGN1cnJlbnQgcm93ICovCglib29sCQlncm91cHRhaWxfdmFsaWQ7CS8qIHRydWUgaWYgZ3Jv dXB0YWlscG9zIGlzIGtub3duIHVwIHRvCgkJCQkJCQkJCSAqIGRhdGUgZm9yIGN1cnJlbnQg cm93ICovCgoJVHVwbGVUYWJsZVNsb3QgKmZpcnN0X3BhcnRfc2xvdDsJLyogZmlyc3QgdHVw bGUgb2YgY3VycmVudCBvciBuZXh0CgkJCQkJCQkJCQkgKiBwYXJ0aXRpb24gKi8KCVR1cGxl VGFibGVTbG90ICpmcmFtZWhlYWRfc2xvdDsgLyogZmlyc3QgdHVwbGUgb2YgY3VycmVudCBm cmFtZSAqLwoJVHVwbGVUYWJsZVNsb3QgKmZyYW1ldGFpbF9zbG90OyAvKiBmaXJzdCB0dXBs ZSBhZnRlciBjdXJyZW50IGZyYW1lICovCgoJLyogdGVtcG9yYXJ5IHNsb3RzIGZvciB0dXBs ZXMgZmV0Y2hlZCBiYWNrIGZyb20gdHVwbGVzdG9yZSAqLwoJVHVwbGVUYWJsZVNsb3QgKmFn Z19yb3dfc2xvdDsKCVR1cGxlVGFibGVTbG90ICp0ZW1wX3Nsb3RfMTsKCVR1cGxlVGFibGVT bG90ICp0ZW1wX3Nsb3RfMjsKfSBXaW5kb3dBZ2dTdGF0ZTsKCi8qIC0tLS0tLS0tLS0tLS0t LS0KICoJIFVuaXF1ZVN0YXRlIGluZm9ybWF0aW9uCiAqCiAqCQlVbmlxdWUgbm9kZXMgYXJl IHVzZWQgIm9uIHRvcCBvZiIgc29ydCBub2RlcyB0byBkaXNjYXJkCiAqCQlkdXBsaWNhdGUg dHVwbGVzIHJldHVybmVkIGZyb20gdGhlIHNvcnQgcGhhc2UuICBCYXNpY2FsbHkKICoJCWFs bCBpdCBkb2VzIGlzIGNvbXBhcmUgdGhlIGN1cnJlbnQgdHVwbGUgZnJvbSB0aGUgc3VicGxh bgogKgkJd2l0aCB0aGUgcHJldmlvdXNseSBmZXRjaGVkIHR1cGxlIChzdG9yZWQgaW4gaXRz IHJlc3VsdCBzbG90KS4KICoJCUlmIHRoZSB0d28gYXJlIGlkZW50aWNhbCBpbiBhbGwgaW50 ZXJlc3RpbmcgZmllbGRzLCB0aGVuCiAqCQl3ZSBqdXN0IGZldGNoIGFub3RoZXIgdHVwbGUg ZnJvbSB0aGUgc29ydCBhbmQgdHJ5IGFnYWluLgogKiAtLS0tLS0tLS0tLS0tLS0tCiAqLwp0 eXBlZGVmIHN0cnVjdCBVbmlxdWVTdGF0ZQp7CglQbGFuU3RhdGUJcHM7CQkJCS8qIGl0cyBm aXJzdCBmaWVsZCBpcyBOb2RlVGFnICovCglFeHByU3RhdGUgICplcWZ1bmN0aW9uOwkJLyog dHVwbGUgZXF1YWxpdHkgcXVhbCAqLwp9IFVuaXF1ZVN0YXRlOwoKLyogLS0tLS0tLS0tLS0t LS0tLQogKiBHYXRoZXJTdGF0ZSBpbmZvcm1hdGlvbgogKgogKgkJR2F0aGVyIG5vZGVzIGxh dW5jaCAxIG9yIG1vcmUgcGFyYWxsZWwgd29ya2VycywgcnVuIGEgc3VicGxhbgogKgkJaW4g dGhvc2Ugd29ya2VycywgYW5kIGNvbGxlY3QgdGhlIHJlc3VsdHMuCiAqIC0tLS0tLS0tLS0t LS0tLS0KICovCnR5cGVkZWYgc3RydWN0IEdhdGhlclN0YXRlCnsKCVBsYW5TdGF0ZQlwczsJ CQkJLyogaXRzIGZpcnN0IGZpZWxkIGlzIE5vZGVUYWcgKi8KCWJvb2wJCWluaXRpYWxpemVk OwkvKiB3b3JrZXJzIGxhdW5jaGVkPyAqLwoJYm9vbAkJbmVlZF90b19zY2FuX2xvY2FsbHk7 CS8qIG5lZWQgdG8gcmVhZCBmcm9tIGxvY2FsIHBsYW4/ICovCglpbnQ2NAkJdHVwbGVzX25l ZWRlZDsJLyogdHVwbGUgYm91bmQsIHNlZSBFeGVjU2V0VHVwbGVCb3VuZCAqLwoJLyogdGhl c2UgZmllbGRzIGFyZSBzZXQgdXAgb25jZTogKi8KCVR1cGxlVGFibGVTbG90ICpmdW5uZWxf c2xvdDsKCXN0cnVjdCBQYXJhbGxlbEV4ZWN1dG9ySW5mbyAqcGVpOwoJLyogYWxsIHJlbWFp bmluZyBmaWVsZHMgYXJlIHJlaW5pdGlhbGl6ZWQgZHVyaW5nIGEgcmVzY2FuOiAqLwoJaW50 CQkJbndvcmtlcnNfbGF1bmNoZWQ7CS8qIG9yaWdpbmFsIG51bWJlciBvZiB3b3JrZXJzICov CglpbnQJCQlucmVhZGVyczsJCS8qIG51bWJlciBvZiBzdGlsbC1hY3RpdmUgd29ya2VycyAq LwoJaW50CQkJbmV4dHJlYWRlcjsJCS8qIG5leHQgb25lIHRvIHRyeSB0byByZWFkIGZyb20g Ki8KCXN0cnVjdCBUdXBsZVF1ZXVlUmVhZGVyICoqcmVhZGVyOwkvKiBhcnJheSB3aXRoIG5y ZWFkZXJzIGFjdGl2ZSBlbnRyaWVzICovCn0gR2F0aGVyU3RhdGU7CgovKiAtLS0tLS0tLS0t LS0tLS0tCiAqIEdhdGhlck1lcmdlU3RhdGUgaW5mb3JtYXRpb24KICoKICoJCUdhdGhlciBt ZXJnZSBub2RlcyBsYXVuY2ggMSBvciBtb3JlIHBhcmFsbGVsIHdvcmtlcnMsIHJ1biBhCiAq CQlzdWJwbGFuIHdoaWNoIHByb2R1Y2VzIHNvcnRlZCBvdXRwdXQgaW4gZWFjaCB3b3JrZXIs IGFuZCB0aGVuCiAqCQltZXJnZSB0aGUgcmVzdWx0cyBpbnRvIGEgc2luZ2xlIHNvcnRlZCBz dHJlYW0uCiAqIC0tLS0tLS0tLS0tLS0tLS0KICovCnN0cnVjdCBHTVJlYWRlclR1cGxlQnVm ZmVyOwkJLyogcHJpdmF0ZSBpbiBub2RlR2F0aGVyTWVyZ2UuYyAqLwoKdHlwZWRlZiBzdHJ1 Y3QgR2F0aGVyTWVyZ2VTdGF0ZQp7CglQbGFuU3RhdGUJcHM7CQkJCS8qIGl0cyBmaXJzdCBm aWVsZCBpcyBOb2RlVGFnICovCglib29sCQlpbml0aWFsaXplZDsJLyogd29ya2VycyBsYXVu Y2hlZD8gKi8KCWJvb2wJCWdtX2luaXRpYWxpemVkOyAvKiBnYXRoZXJfbWVyZ2VfaW5pdCgp IGRvbmU/ICovCglib29sCQluZWVkX3RvX3NjYW5fbG9jYWxseTsJLyogbmVlZCB0byByZWFk IGZyb20gbG9jYWwgcGxhbj8gKi8KCWludDY0CQl0dXBsZXNfbmVlZGVkOwkvKiB0dXBsZSBi b3VuZCwgc2VlIEV4ZWNTZXRUdXBsZUJvdW5kICovCgkvKiB0aGVzZSBmaWVsZHMgYXJlIHNl dCB1cCBvbmNlOiAqLwoJVHVwbGVEZXNjCXR1cERlc2M7CQkvKiBkZXNjcmlwdG9yIGZvciBz dWJwbGFuIHJlc3VsdCB0dXBsZXMgKi8KCWludAkJCWdtX25rZXlzOwkJLyogbnVtYmVyIG9m IHNvcnQgY29sdW1ucyAqLwoJU29ydFN1cHBvcnQgZ21fc29ydGtleXM7CS8qIGFycmF5IG9m IGxlbmd0aCBnbV9ua2V5cyAqLwoJc3RydWN0IFBhcmFsbGVsRXhlY3V0b3JJbmZvICpwZWk7 CgkvKiBhbGwgcmVtYWluaW5nIGZpZWxkcyBhcmUgcmVpbml0aWFsaXplZCBkdXJpbmcgYSBy ZXNjYW4gKi8KCS8qIChidXQgdGhlIGFycmF5cyBhcmUgbm90IHJlYWxsb2NhdGVkLCBqdXN0 IGNsZWFyZWQpICovCglpbnQJCQlud29ya2Vyc19sYXVuY2hlZDsJLyogb3JpZ2luYWwgbnVt YmVyIG9mIHdvcmtlcnMgKi8KCWludAkJCW5yZWFkZXJzOwkJLyogbnVtYmVyIG9mIGFjdGl2 ZSB3b3JrZXJzICovCglUdXBsZVRhYmxlU2xvdCAqKmdtX3Nsb3RzOwkvKiBhcnJheSB3aXRo IG5yZWFkZXJzKzEgZW50cmllcyAqLwoJc3RydWN0IFR1cGxlUXVldWVSZWFkZXIgKipyZWFk ZXI7CS8qIGFycmF5IHdpdGggbnJlYWRlcnMgYWN0aXZlIGVudHJpZXMgKi8KCXN0cnVjdCBH TVJlYWRlclR1cGxlQnVmZmVyICpnbV90dXBsZV9idWZmZXJzOwkvKiBucmVhZGVycyB0dXBs ZSBidWZmZXJzICovCglzdHJ1Y3QgYmluYXJ5aGVhcCAqZ21faGVhcDsgLyogYmluYXJ5IGhl YXAgb2Ygc2xvdCBpbmRpY2VzICovCn0gR2F0aGVyTWVyZ2VTdGF0ZTsKCi8qIC0tLS0tLS0t LS0tLS0tLS0KICoJIEhhc2hTdGF0ZSBpbmZvcm1hdGlvbgogKiAtLS0tLS0tLS0tLS0tLS0t CiAqLwp0eXBlZGVmIHN0cnVjdCBIYXNoU3RhdGUKewoJUGxhblN0YXRlCXBzOwkJCQkvKiBp dHMgZmlyc3QgZmllbGQgaXMgTm9kZVRhZyAqLwoJSGFzaEpvaW5UYWJsZSBoYXNodGFibGU7 CS8qIGhhc2ggdGFibGUgZm9yIHRoZSBoYXNoam9pbiAqLwoJRXhwclN0YXRlICAqaGFzaF9l eHByOwkJLyogRXhwclN0YXRlIHRvIGdldCBoYXNoIHZhbHVlICovCgoJRm1nckluZm8gICAq c2tld19oYXNoZnVuY3Rpb247CS8qIGxvb2t1cCBkYXRhIGZvciBza2V3IGhhc2ggZnVuY3Rp b24gKi8KCU9pZAkJCXNrZXdfY29sbGF0aW9uOyAvKiBjb2xsYXRpb24gdG8gY2FsbCBza2V3 X2hhc2hmdW5jdGlvbiB3aXRoICovCgoJVHVwbGVzdG9yZXN0YXRlICpudWxsX3R1cGxlX3N0 b3JlOwkvKiB3aGVyZSB0byBwdXQgbnVsbC1rZXllZCB0dXBsZXMgKi8KCWJvb2wJCWtlZXBf bnVsbF90dXBsZXM7CS8qIGRvIHdlIG5lZWQgdG8gc2F2ZSBzdWNoIHR1cGxlcz8gKi8KCgkv KgoJICogSW4gYSBwYXJhbGxlbGl6ZWQgaGFzaCBqb2luLCB0aGUgbGVhZGVyIHJldGFpbnMg YSBwb2ludGVyIHRvIHRoZQoJICogc2hhcmVkLW1lbW9yeSBzdGF0cyBhcmVhIGluIGl0cyBz aGFyZWRfaW5mbyBmaWVsZCwgYW5kIHRoZW4gY29waWVzIHRoZQoJICogc2hhcmVkLW1lbW9y eSBpbmZvIGJhY2sgdG8gbG9jYWwgc3RvcmFnZSBiZWZvcmUgRFNNIHNodXRkb3duLiAgVGhl CgkgKiBzaGFyZWRfaW5mbyBmaWVsZCByZW1haW5zIE5VTEwgaW4gd29ya2Vycywgb3IgaW4g bm9uLXBhcmFsbGVsIGpvaW5zLgoJICovCglTaGFyZWRIYXNoSW5mbyAqc2hhcmVkX2luZm87 CgoJLyoKCSAqIElmIHdlIGFyZSBjb2xsZWN0aW5nIGhhc2ggc3RhdHMsIHRoaXMgcG9pbnRz IHRvIGFuIGluaXRpYWxseS16ZXJvZWQKCSAqIGNvbGxlY3Rpb24gYXJlYSwgd2hpY2ggY291 bGQgYmUgZWl0aGVyIGxvY2FsIHN0b3JhZ2Ugb3IgaW4gc2hhcmVkCgkgKiBtZW1vcnk7IGVp dGhlciB3YXkgaXQncyBmb3IganVzdCBvbmUgcHJvY2Vzcy4KCSAqLwoJSGFzaEluc3RydW1l bnRhdGlvbiAqaGluc3RydW1lbnQ7CgoJLyogUGFyYWxsZWwgaGFzaCBzdGF0ZS4gKi8KCXN0 cnVjdCBQYXJhbGxlbEhhc2hKb2luU3RhdGUgKnBhcmFsbGVsX3N0YXRlOwp9IEhhc2hTdGF0 ZTsKCi8qIC0tLS0tLS0tLS0tLS0tLS0KICoJIFNldE9wU3RhdGUgaW5mb3JtYXRpb24KICoK ICoJCVNldE9wIG5vZGVzIHN1cHBvcnQgZWl0aGVyIHNvcnRlZCBvciBoYXNoZWQgZGUtZHVw bGljYXRpb24uCiAqCQlUaGUgc29ydGVkIG1vZGUgaXMgYSBiaXQgbGlrZSBNZXJnZUpvaW4s IHRoZSBoYXNoZWQgbW9kZSBsaWtlIEFnZy4KICogLS0tLS0tLS0tLS0tLS0tLQogKi8KdHlw ZWRlZiBzdHJ1Y3QgU2V0T3BTdGF0ZVBlcklucHV0CnsKCVR1cGxlVGFibGVTbG90ICpmaXJz dFR1cGxlU2xvdDsgLyogZmlyc3QgdHVwbGUgb2YgY3VycmVudCBncm91cCAqLwoJaW50NjQJ CW51bVR1cGxlczsJCS8qIG51bWJlciBvZiB0dXBsZXMgaW4gY3VycmVudCBncm91cCAqLwoJ VHVwbGVUYWJsZVNsb3QgKm5leHRUdXBsZVNsb3Q7CS8qIG5leHQgaW5wdXQgdHVwbGUsIGlm IGFscmVhZHkgcmVhZCAqLwoJYm9vbAkJbmVlZEdyb3VwOwkJLyogZG8gd2UgbmVlZCB0byBs b2FkIGEgbmV3IGdyb3VwPyAqLwp9IFNldE9wU3RhdGVQZXJJbnB1dDsKCnR5cGVkZWYgc3Ry dWN0IFNldE9wU3RhdGUKewoJUGxhblN0YXRlCXBzOwkJCQkvKiBpdHMgZmlyc3QgZmllbGQg aXMgTm9kZVRhZyAqLwoJYm9vbAkJc2V0b3BfZG9uZTsJCS8qIGluZGljYXRlcyBjb21wbGV0 aW9uIG9mIG91dHB1dCBzY2FuICovCglpbnQ2NAkJbnVtT3V0cHV0OwkJLyogbnVtYmVyIG9m IGR1cHMgbGVmdCB0byBvdXRwdXQgKi8KCWludAkJCW51bUNvbHM7CQkvKiBudW1iZXIgb2Yg Z3JvdXBpbmcgY29sdW1ucyAqLwoKCS8qIHRoZXNlIGZpZWxkcyBhcmUgdXNlZCBpbiBTRVRP UF9TT1JURUQgbW9kZTogKi8KCVNvcnRTdXBwb3J0IHNvcnRLZXlzOwkJLyogcGVyLWdyb3Vw aW5nLWZpZWxkIHNvcnQgZGF0YSAqLwoJU2V0T3BTdGF0ZVBlcklucHV0IGxlZnRJbnB1dDsJ LyogY3VycmVudCBvdXRlci1yZWxhdGlvbiBpbnB1dCBzdGF0ZSAqLwoJU2V0T3BTdGF0ZVBl cklucHV0IHJpZ2h0SW5wdXQ7CS8qIGN1cnJlbnQgaW5uZXItcmVsYXRpb24gaW5wdXQgc3Rh dGUgKi8KCWJvb2wJCW5lZWRfaW5pdDsJCS8qIGhhdmUgd2UgcmVhZCB0aGUgZmlyc3QgdHVw bGVzIHlldD8gKi8KCgkvKiB0aGVzZSBmaWVsZHMgYXJlIHVzZWQgaW4gU0VUT1BfSEFTSEVE IG1vZGU6ICovCglPaWQJCSAgICplcWZ1bmNvaWRzOwkJLyogcGVyLWdyb3VwaW5nLWZpZWxk IGVxdWFsaXR5IGZucyAqLwoJRm1nckluZm8gICAqaGFzaGZ1bmN0aW9uczsJLyogcGVyLWdy b3VwaW5nLWZpZWxkIGhhc2ggZm5zICovCglUdXBsZUhhc2hUYWJsZSBoYXNodGFibGU7CS8q IGhhc2ggdGFibGUgd2l0aCBvbmUgZW50cnkgcGVyIGdyb3VwICovCglNZW1vcnlDb250ZXh0 IHR1cGxlc0NvbnRleHQ7CS8qIGNvbnRleHQgY29udGFpbmluZyBoYXNoIHRhYmxlJ3MgdHVw bGVzICovCglib29sCQl0YWJsZV9maWxsZWQ7CS8qIGhhc2ggdGFibGUgZmlsbGVkIHlldD8g Ki8KCVR1cGxlSGFzaEl0ZXJhdG9yIGhhc2hpdGVyOyAvKiBmb3IgaXRlcmF0aW5nIHRocm91 Z2ggaGFzaCB0YWJsZSAqLwp9IFNldE9wU3RhdGU7CgovKiAtLS0tLS0tLS0tLS0tLS0tCiAq CSBMb2NrUm93c1N0YXRlIGluZm9ybWF0aW9uCiAqCiAqCQlMb2NrUm93cyBub2RlcyBhcmUg dXNlZCB0byBlbmZvcmNlIEZPUiBbS0VZXSBVUERBVEUvU0hBUkUgbG9ja2luZy4KICogLS0t LS0tLS0tLS0tLS0tLQogKi8KdHlwZWRlZiBzdHJ1Y3QgTG9ja1Jvd3NTdGF0ZQp7CglQbGFu U3RhdGUJcHM7CQkJCS8qIGl0cyBmaXJzdCBmaWVsZCBpcyBOb2RlVGFnICovCglMaXN0CSAg ICpscl9hcm93TWFya3M7CS8qIExpc3Qgb2YgRXhlY0F1eFJvd01hcmtzICovCglFUFFTdGF0 ZQlscl9lcHFzdGF0ZTsJLyogZm9yIGV2YWx1YXRpbmcgRXZhbFBsYW5RdWFsIHJlY2hlY2tz ICovCn0gTG9ja1Jvd3NTdGF0ZTsKCi8qIC0tLS0tLS0tLS0tLS0tLS0KICoJIExpbWl0U3Rh dGUgaW5mb3JtYXRpb24KICoKICoJCUxpbWl0IG5vZGVzIGFyZSB1c2VkIHRvIGVuZm9yY2Ug TElNSVQvT0ZGU0VUIGNsYXVzZXMuCiAqCQlUaGV5IGp1c3Qgc2VsZWN0IHRoZSBkZXNpcmVk IHN1YnJhbmdlIG9mIHRoZWlyIHN1YnBsYW4ncyBvdXRwdXQuCiAqCiAqIG9mZnNldCBpcyB0 aGUgbnVtYmVyIG9mIGluaXRpYWwgdHVwbGVzIHRvIHNraXAgKDAgZG9lcyBub3RoaW5nKS4K ICogY291bnQgaXMgdGhlIG51bWJlciBvZiB0dXBsZXMgdG8gcmV0dXJuIGFmdGVyIHNraXBw aW5nIHRoZSBvZmZzZXQgdHVwbGVzLgogKiBJZiBubyBsaW1pdCBjb3VudCB3YXMgc3BlY2lm aWVkLCBjb3VudCBpcyB1bmRlZmluZWQgYW5kIG5vQ291bnQgaXMgdHJ1ZS4KICogV2hlbiBs c3RhdGUgPT0gTElNSVRfSU5JVElBTCwgb2Zmc2V0L2NvdW50L25vQ291bnQgaGF2ZW4ndCBi ZWVuIHNldCB5ZXQuCiAqIC0tLS0tLS0tLS0tLS0tLS0KICovCnR5cGVkZWYgZW51bQp7CglM SU1JVF9JTklUSUFMLAkJCQkvKiBpbml0aWFsIHN0YXRlIGZvciBMSU1JVCBub2RlICovCglM SU1JVF9SRVNDQU4sCQkJCS8qIHJlc2NhbiBhZnRlciByZWNvbXB1dGluZyBwYXJhbWV0ZXJz ICovCglMSU1JVF9FTVBUWSwJCQkJLyogdGhlcmUgYXJlIG5vIHJldHVybmFibGUgcm93cyAq LwoJTElNSVRfSU5XSU5ET1csCQkJCS8qIGhhdmUgcmV0dXJuZWQgYSByb3cgaW4gdGhlIHdp bmRvdyAqLwoJTElNSVRfV0lORE9XRU5EX1RJRVMsCQkvKiBoYXZlIHJldHVybmVkIGEgdGll ZCByb3cgKi8KCUxJTUlUX1NVQlBMQU5FT0YsCQkJLyogYXQgRU9GIG9mIHN1YnBsYW4gKHdp dGhpbiB3aW5kb3cpICovCglMSU1JVF9XSU5ET1dFTkQsCQkJLyogc3RlcHBlZCBvZmYgZW5k IG9mIHdpbmRvdyAqLwoJTElNSVRfV0lORE9XU1RBUlQsCQkJLyogc3RlcHBlZCBvZmYgYmVn aW5uaW5nIG9mIHdpbmRvdyAqLwp9IExpbWl0U3RhdGVDb25kOwoKdHlwZWRlZiBzdHJ1Y3Qg TGltaXRTdGF0ZQp7CglQbGFuU3RhdGUJcHM7CQkJCS8qIGl0cyBmaXJzdCBmaWVsZCBpcyBO b2RlVGFnICovCglFeHByU3RhdGUgICpsaW1pdE9mZnNldDsJLyogT0ZGU0VUIHBhcmFtZXRl ciwgb3IgTlVMTCBpZiBub25lICovCglFeHByU3RhdGUgICpsaW1pdENvdW50OwkJLyogQ09V TlQgcGFyYW1ldGVyLCBvciBOVUxMIGlmIG5vbmUgKi8KCUxpbWl0T3B0aW9uIGxpbWl0T3B0 aW9uOwkvKiBsaW1pdCBzcGVjaWZpY2F0aW9uIHR5cGUgKi8KCWludDY0CQlvZmZzZXQ7CQkJ LyogY3VycmVudCBPRkZTRVQgdmFsdWUgKi8KCWludDY0CQljb3VudDsJCQkvKiBjdXJyZW50 IENPVU5ULCBpZiBhbnkgKi8KCWJvb2wJCW5vQ291bnQ7CQkvKiBpZiB0cnVlLCBpZ25vcmUg Y291bnQgKi8KCUxpbWl0U3RhdGVDb25kIGxzdGF0ZTsJCS8qIHN0YXRlIG1hY2hpbmUgc3Rh dHVzLCBhcyBhYm92ZSAqLwoJaW50NjQJCXBvc2l0aW9uOwkJLyogMS1iYXNlZCBpbmRleCBv ZiBsYXN0IHR1cGxlIHJldHVybmVkICovCglUdXBsZVRhYmxlU2xvdCAqc3ViU2xvdDsJLyog dHVwbGUgbGFzdCBvYnRhaW5lZCBmcm9tIHN1YnBsYW4gKi8KCUV4cHJTdGF0ZSAgKmVxZnVu Y3Rpb247CQkvKiB0dXBsZSBlcXVhbGl0eSBxdWFsIGluIGNhc2Ugb2YgV0lUSCBUSUVTCgkJ CQkJCQkJICogb3B0aW9uICovCglUdXBsZVRhYmxlU2xvdCAqbGFzdF9zbG90OwkvKiBzbG90 IGZvciBldmFsdWF0aW9uIG9mIHRpZXMgKi8KfSBMaW1pdFN0YXRlOwoKI2VuZGlmCQkJCQkJ CS8qIEVYRUNOT0RFU19IICovCgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALi9maWxl cy50eHQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAwMDA2NjQAMDAwMTc1 MAAwMDAxNzUwADAwMDAwMDAxMTE3ADE1MjIyMzM2MzIzADAxMTU1MQAgMAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB1c3RhciAgAHhtYW4AAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAeG1hbgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAABzcmMvYmFja2VuZC9hY2Nlc3MvaGVhcC9oZWFwYW1faGFu ZGxlci5jCnNyYy9iYWNrZW5kL2Jvb3RzdHJhcC9ib290c3RyYXAuYwpzcmMvYmFja2VuZC9j YXRhbG9nL2luZGV4LmMKc3JjL2JhY2tlbmQvY2F0YWxvZy9pbmRleGluZy5jCnNyYy9iYWNr ZW5kL2NhdGFsb2cvdG9hc3RpbmcuYwpzcmMvYmFja2VuZC9jb21tYW5kcy9hbmFseXplLmMK c3JjL2JhY2tlbmQvY29tbWFuZHMvaW5kZXhjbWRzLmMKc3JjL2JhY2tlbmQvZXhlY3V0b3Iv ZXhlY0luZGV4aW5nLmMKc3JjL2JhY2tlbmQvbm9kZXMvbWFrZWZ1bmNzLmMKc3JjL2JhY2tl bmQvb3B0aW1pemVyL3BhdGgvaW5keHBhdGguYwpzcmMvYmFja2VuZC9vcHRpbWl6ZXIvcGxh bi9jcmVhdGVwbGFuLmMKc3JjL2JhY2tlbmQvb3B0aW1pemVyL3V0aWwvcGxhbmNhdC5jCnNy Yy9iYWNrZW5kL3V0aWxzL2FkdC9zZWxmdW5jcy5jCnNyYy9iYWNrZW5kL3V0aWxzL2NhY2hl L3JlbGNhY2hlLmMKc3JjL2luY2x1ZGUvbm9kZXMvZXhlY25vZGVzLmgKc3JjL2luY2x1ZGUv bm9kZXMvcGF0aG5vZGVzLmgKc3JjL2luY2x1ZGUvdXRpbHMvcmVsLmgKc3JjL2luY2x1ZGUv dXRpbHMvcmVsY2FjaGUuaAoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAALi9oZWFwYW1faGFuZGxlci5jAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAADAwMDA2NjQAMDAwMTc1MAAwMDAxNzUwADAwMDAwMjM2MDY1ADE1MjIxNjA0 MDQwADAxMzAwNwAgMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAB1c3RhciAgAHhtYW4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeG1hbgAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAvKi0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0KICoKICogaGVhcGFtX2hhbmRsZXIuYwogKgkgIGhlYXAgdGFibGUgYWNj ZXNzIG1ldGhvZCBjb2RlCiAqCiAqIFBvcnRpb25zIENvcHlyaWdodCAoYykgMTk5Ni0yMDI2 LCBQb3N0Z3JlU1FMIEdsb2JhbCBEZXZlbG9wbWVudCBHcm91cAogKiBQb3J0aW9ucyBDb3B5 cmlnaHQgKGMpIDE5OTQsIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5p YQogKgogKgogKiBJREVOVElGSUNBVElPTgogKgkgIHNyYy9iYWNrZW5kL2FjY2Vzcy9oZWFw L2hlYXBhbV9oYW5kbGVyLmMKICoKICoKICogTk9URVMKICoJICBUaGlzIGZpbGVzIHdpcmVz IHVwIHRoZSBsb3dlciBsZXZlbCBoZWFwYW0uYyBldCBhbCByb3V0aW5lcyB3aXRoIHRoZQog KgkgIHRhYmxlYW0gYWJzdHJhY3Rpb24uCiAqCiAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogKi8K I2luY2x1ZGUgInBvc3RncmVzLmgiCgojaW5jbHVkZSAiYWNjZXNzL2dlbmFtLmgiCiNpbmNs dWRlICJhY2Nlc3MvaGVhcGFtLmgiCiNpbmNsdWRlICJhY2Nlc3MvaGVhcHRvYXN0LmgiCiNp bmNsdWRlICJhY2Nlc3MvbXVsdGl4YWN0LmgiCiNpbmNsdWRlICJhY2Nlc3MvcmV3cml0ZWhl YXAuaCIKI2luY2x1ZGUgImFjY2Vzcy9zeW5jc2Nhbi5oIgojaW5jbHVkZSAiYWNjZXNzL3Rh YmxlYW0uaCIKI2luY2x1ZGUgImFjY2Vzcy90c21hcGkuaCIKI2luY2x1ZGUgImFjY2Vzcy92 aXNpYmlsaXR5bWFwLmgiCiNpbmNsdWRlICJhY2Nlc3MveGFjdC5oIgojaW5jbHVkZSAiY2F0 YWxvZy9jYXRhbG9nLmgiCiNpbmNsdWRlICJjYXRhbG9nL2luZGV4LmgiCiNpbmNsdWRlICJj YXRhbG9nL3N0b3JhZ2UuaCIKI2luY2x1ZGUgImNhdGFsb2cvc3RvcmFnZV94bG9nLmgiCiNp bmNsdWRlICJjb21tYW5kcy9wcm9ncmVzcy5oIgojaW5jbHVkZSAiZXhlY3V0b3IvZXhlY3V0 b3IuaCIKI2luY2x1ZGUgIm1pc2NhZG1pbi5oIgojaW5jbHVkZSAicGdzdGF0LmgiCiNpbmNs dWRlICJzdG9yYWdlL2J1Zm1nci5oIgojaW5jbHVkZSAic3RvcmFnZS9idWZwYWdlLmgiCiNp bmNsdWRlICJzdG9yYWdlL2xtZ3IuaCIKI2luY2x1ZGUgInN0b3JhZ2UvbG9jay5oIgojaW5j bHVkZSAic3RvcmFnZS9wcmVkaWNhdGUuaCIKI2luY2x1ZGUgInN0b3JhZ2UvcHJvY2FycmF5 LmgiCiNpbmNsdWRlICJzdG9yYWdlL3NtZ3IuaCIKI2luY2x1ZGUgInV0aWxzL2J1aWx0aW5z LmgiCiNpbmNsdWRlICJ1dGlscy9yZWwuaCIKI2luY2x1ZGUgInV0aWxzL3R1cGxlc29ydC5o IgoKc3RhdGljIHZvaWQgcmVmb3JtX2FuZF9yZXdyaXRlX3R1cGxlKEhlYXBUdXBsZSB0dXBs ZSwKCQkJCQkJCQkJIFJlbGF0aW9uIE9sZEhlYXAsIFJlbGF0aW9uIE5ld0hlYXAsCgkJCQkJ CQkJCSBEYXR1bSAqdmFsdWVzLCBib29sICppc251bGwsIFJld3JpdGVTdGF0ZSByd3N0YXRl KTsKc3RhdGljIHZvaWQgaGVhcF9pbnNlcnRfZm9yX3JlcGFjayhIZWFwVHVwbGUgdHVwbGUs IFJlbGF0aW9uIE9sZEhlYXAsCgkJCQkJCQkJICAgUmVsYXRpb24gTmV3SGVhcCwgRGF0dW0g KnZhbHVlcywgYm9vbCAqaXNudWxsLAoJCQkJCQkJCSAgIEJ1bGtJbnNlcnRTdGF0ZSBiaXN0 YXRlKTsKc3RhdGljIEhlYXBUdXBsZSByZWZvcm1fdHVwbGUoSGVhcFR1cGxlIHR1cGxlLCBS ZWxhdGlvbiBPbGRIZWFwLAoJCQkJCQkJICBSZWxhdGlvbiBOZXdIZWFwLCBEYXR1bSAqdmFs dWVzLCBib29sICppc251bGwpOwoKc3RhdGljIGJvb2wgU2FtcGxlSGVhcFR1cGxlVmlzaWJs ZShUYWJsZVNjYW5EZXNjIHNjYW4sIEJ1ZmZlciBidWZmZXIsCgkJCQkJCQkJICAgSGVhcFR1 cGxlIHR1cGxlLAoJCQkJCQkJCSAgIE9mZnNldE51bWJlciB0dXBvZmZzZXQpOwoKc3RhdGlj IEJsb2NrTnVtYmVyIGhlYXBhbV9zY2FuX2dldF9ibG9ja3NfZG9uZShIZWFwU2NhbkRlc2Mg aHNjYW4pOwoKc3RhdGljIGJvb2wgQml0bWFwSGVhcFNjYW5OZXh0QmxvY2soVGFibGVTY2Fu RGVzYyBzY2FuLAoJCQkJCQkJCQlib29sICpyZWNoZWNrLAoJCQkJCQkJCQl1aW50NjQgKmxv c3N5X3BhZ2VzLCB1aW50NjQgKmV4YWN0X3BhZ2VzKTsKCgovKiAtLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0KICogU2xvdCByZWxhdGVkIGNhbGxiYWNrcyBmb3IgaGVhcCBBTQogKiAtLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0KICovCgpzdGF0aWMgY29uc3QgVHVwbGVUYWJsZVNsb3RPcHMgKgpoZWFwYW1f c2xvdF9jYWxsYmFja3MoUmVsYXRpb24gcmVsYXRpb24pCnsKCXJldHVybiAmVFRTT3BzQnVm ZmVySGVhcFR1cGxlOwp9CgoKLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAqIENhbGxiYWNrcyBm b3Igbm9uLW1vZGlmeWluZyBvcGVyYXRpb25zIG9uIGluZGl2aWR1YWwgdHVwbGVzIGZvciBo ZWFwIEFNCiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogKi8KCnN0YXRpYyBib29sCmhlYXBhbV9m ZXRjaF9yb3dfdmVyc2lvbihSZWxhdGlvbiByZWxhdGlvbiwKCQkJCQkJIEl0ZW1Qb2ludGVy IHRpZCwKCQkJCQkJIFNuYXBzaG90IHNuYXBzaG90LAoJCQkJCQkgVHVwbGVUYWJsZVNsb3Qg KnNsb3QpCnsKCUJ1ZmZlckhlYXBUdXBsZVRhYmxlU2xvdCAqYnNsb3QgPSAoQnVmZmVySGVh cFR1cGxlVGFibGVTbG90ICopIHNsb3Q7CglCdWZmZXIJCWJ1ZmZlcjsKCglBc3NlcnQoVFRT X0lTX0JVRkZFUlRVUExFKHNsb3QpKTsKCglic2xvdC0+YmFzZS50dXBkYXRhLnRfc2VsZiA9 ICp0aWQ7CglpZiAoaGVhcF9mZXRjaChyZWxhdGlvbiwgc25hcHNob3QsICZic2xvdC0+YmFz ZS50dXBkYXRhLCAmYnVmZmVyLCBmYWxzZSkpCgl7CgkJLyogc3RvcmUgaW4gc2xvdCwgdHJh bnNmZXJyaW5nIGV4aXN0aW5nIHBpbiAqLwoJCUV4ZWNTdG9yZVBpbm5lZEJ1ZmZlckhlYXBU dXBsZSgmYnNsb3QtPmJhc2UudHVwZGF0YSwgc2xvdCwgYnVmZmVyKTsKCQlzbG90LT50dHNf dGFibGVPaWQgPSBSZWxhdGlvbkdldFJlbGlkKHJlbGF0aW9uKTsKCgkJcmV0dXJuIHRydWU7 Cgl9CgoJcmV0dXJuIGZhbHNlOwp9CgpzdGF0aWMgYm9vbApoZWFwYW1fdHVwbGVfdGlkX3Zh bGlkKFRhYmxlU2NhbkRlc2Mgc2NhbiwgSXRlbVBvaW50ZXIgdGlkKQp7CglIZWFwU2NhbkRl c2MgaHNjYW4gPSAoSGVhcFNjYW5EZXNjKSBzY2FuOwoKCXJldHVybiBJdGVtUG9pbnRlcklz VmFsaWQodGlkKSAmJgoJCUl0ZW1Qb2ludGVyR2V0QmxvY2tOdW1iZXIodGlkKSA8IGhzY2Fu LT5yc19uYmxvY2tzOwp9CgpzdGF0aWMgYm9vbApoZWFwYW1fdHVwbGVfc2F0aXNmaWVzX3Nu YXBzaG90KFJlbGF0aW9uIHJlbCwgVHVwbGVUYWJsZVNsb3QgKnNsb3QsCgkJCQkJCQkJU25h cHNob3Qgc25hcHNob3QpCnsKCUJ1ZmZlckhlYXBUdXBsZVRhYmxlU2xvdCAqYnNsb3QgPSAo QnVmZmVySGVhcFR1cGxlVGFibGVTbG90ICopIHNsb3Q7Cglib29sCQlyZXM7CgoJQXNzZXJ0 KFRUU19JU19CVUZGRVJUVVBMRShzbG90KSk7CglBc3NlcnQoQnVmZmVySXNWYWxpZChic2xv dC0+YnVmZmVyKSk7CgoJLyoKCSAqIFdlIG5lZWQgYnVmZmVyIHBpbiBhbmQgbG9jayB0byBj YWxsIEhlYXBUdXBsZVNhdGlzZmllc1Zpc2liaWxpdHkuCgkgKiBDYWxsZXIgc2hvdWxkIGJl IGhvbGRpbmcgcGluLCBidXQgbm90IGxvY2suCgkgKi8KCUxvY2tCdWZmZXIoYnNsb3QtPmJ1 ZmZlciwgQlVGRkVSX0xPQ0tfU0hBUkUpOwoJcmVzID0gSGVhcFR1cGxlU2F0aXNmaWVzVmlz aWJpbGl0eShic2xvdC0+YmFzZS50dXBsZSwgc25hcHNob3QsCgkJCQkJCQkJCSAgIGJzbG90 LT5idWZmZXIpOwoJTG9ja0J1ZmZlcihic2xvdC0+YnVmZmVyLCBCVUZGRVJfTE9DS19VTkxP Q0spOwoKCXJldHVybiByZXM7Cn0KCgovKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAqICBG dW5jdGlvbnMgZm9yIG1hbmlwdWxhdGlvbnMgb2YgcGh5c2ljYWwgdHVwbGVzIGZvciBoZWFw IEFNLgogKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAqLwoKc3RhdGljIHZvaWQKaGVhcGFt X3R1cGxlX2luc2VydChSZWxhdGlvbiByZWxhdGlvbiwgVHVwbGVUYWJsZVNsb3QgKnNsb3Qs IENvbW1hbmRJZCBjaWQsCgkJCQkJdWludDMyIG9wdGlvbnMsIEJ1bGtJbnNlcnRTdGF0ZSBi aXN0YXRlKQp7Cglib29sCQlzaG91bGRGcmVlID0gdHJ1ZTsKCUhlYXBUdXBsZQl0dXBsZSA9 IEV4ZWNGZXRjaFNsb3RIZWFwVHVwbGUoc2xvdCwgdHJ1ZSwgJnNob3VsZEZyZWUpOwoKCS8q IFVwZGF0ZSB0aGUgdHVwbGUgd2l0aCB0YWJsZSBvaWQgKi8KCXNsb3QtPnR0c190YWJsZU9p ZCA9IFJlbGF0aW9uR2V0UmVsaWQocmVsYXRpb24pOwoJdHVwbGUtPnRfdGFibGVPaWQgPSBz bG90LT50dHNfdGFibGVPaWQ7CgoJLyogUGVyZm9ybSB0aGUgaW5zZXJ0aW9uLCBhbmQgY29w eSB0aGUgcmVzdWx0aW5nIEl0ZW1Qb2ludGVyICovCgloZWFwX2luc2VydChyZWxhdGlvbiwg dHVwbGUsIGNpZCwgb3B0aW9ucywgYmlzdGF0ZSk7CglJdGVtUG9pbnRlckNvcHkoJnR1cGxl LT50X3NlbGYsICZzbG90LT50dHNfdGlkKTsKCglpZiAoc2hvdWxkRnJlZSkKCQlwZnJlZSh0 dXBsZSk7Cn0KCnN0YXRpYyB2b2lkCmhlYXBhbV90dXBsZV9pbnNlcnRfc3BlY3VsYXRpdmUo UmVsYXRpb24gcmVsYXRpb24sIFR1cGxlVGFibGVTbG90ICpzbG90LAoJCQkJCQkJCUNvbW1h bmRJZCBjaWQsIHVpbnQzMiBvcHRpb25zLAoJCQkJCQkJCUJ1bGtJbnNlcnRTdGF0ZSBiaXN0 YXRlLCB1aW50MzIgc3BlY1Rva2VuKQp7Cglib29sCQlzaG91bGRGcmVlID0gdHJ1ZTsKCUhl YXBUdXBsZQl0dXBsZSA9IEV4ZWNGZXRjaFNsb3RIZWFwVHVwbGUoc2xvdCwgdHJ1ZSwgJnNo b3VsZEZyZWUpOwoKCS8qIFVwZGF0ZSB0aGUgdHVwbGUgd2l0aCB0YWJsZSBvaWQgKi8KCXNs b3QtPnR0c190YWJsZU9pZCA9IFJlbGF0aW9uR2V0UmVsaWQocmVsYXRpb24pOwoJdHVwbGUt PnRfdGFibGVPaWQgPSBzbG90LT50dHNfdGFibGVPaWQ7CgoJSGVhcFR1cGxlSGVhZGVyU2V0 U3BlY3VsYXRpdmVUb2tlbih0dXBsZS0+dF9kYXRhLCBzcGVjVG9rZW4pOwoJb3B0aW9ucyB8 PSBIRUFQX0lOU0VSVF9TUEVDVUxBVElWRTsKCgkvKiBQZXJmb3JtIHRoZSBpbnNlcnRpb24s IGFuZCBjb3B5IHRoZSByZXN1bHRpbmcgSXRlbVBvaW50ZXIgKi8KCWhlYXBfaW5zZXJ0KHJl bGF0aW9uLCB0dXBsZSwgY2lkLCBvcHRpb25zLCBiaXN0YXRlKTsKCUl0ZW1Qb2ludGVyQ29w eSgmdHVwbGUtPnRfc2VsZiwgJnNsb3QtPnR0c190aWQpOwoKCWlmIChzaG91bGRGcmVlKQoJ CXBmcmVlKHR1cGxlKTsKfQoKc3RhdGljIHZvaWQKaGVhcGFtX3R1cGxlX2NvbXBsZXRlX3Nw ZWN1bGF0aXZlKFJlbGF0aW9uIHJlbGF0aW9uLCBUdXBsZVRhYmxlU2xvdCAqc2xvdCwKCQkJ CQkJCQkgIHVpbnQzMiBzcGVjVG9rZW4sIGJvb2wgc3VjY2VlZGVkKQp7Cglib29sCQlzaG91 bGRGcmVlID0gdHJ1ZTsKCUhlYXBUdXBsZQl0dXBsZSA9IEV4ZWNGZXRjaFNsb3RIZWFwVHVw bGUoc2xvdCwgdHJ1ZSwgJnNob3VsZEZyZWUpOwoKCS8qIGFkanVzdCB0aGUgdHVwbGUncyBz dGF0ZSBhY2NvcmRpbmdseSAqLwoJaWYgKHN1Y2NlZWRlZCkKCQloZWFwX2ZpbmlzaF9zcGVj dWxhdGl2ZShyZWxhdGlvbiwgJnNsb3QtPnR0c190aWQpOwoJZWxzZQoJCWhlYXBfYWJvcnRf c3BlY3VsYXRpdmUocmVsYXRpb24sICZzbG90LT50dHNfdGlkKTsKCglpZiAoc2hvdWxkRnJl ZSkKCQlwZnJlZSh0dXBsZSk7Cn0KCnN0YXRpYyBUTV9SZXN1bHQKaGVhcGFtX3R1cGxlX2Rl bGV0ZShSZWxhdGlvbiByZWxhdGlvbiwgSXRlbVBvaW50ZXIgdGlkLCBDb21tYW5kSWQgY2lk LAoJCQkJCXVpbnQzMiBvcHRpb25zLCBTbmFwc2hvdCBzbmFwc2hvdCwgU25hcHNob3QgY3Jv c3NjaGVjaywKCQkJCQlib29sIHdhaXQsIFRNX0ZhaWx1cmVEYXRhICp0bWZkKQp7CgkvKgoJ ICogQ3VycmVudGx5IERlbGV0aW5nIG9mIGluZGV4IHR1cGxlcyBhcmUgaGFuZGxlZCBhdCB2 YWN1dW0sIGluIGNhc2UgaWYKCSAqIHRoZSBzdG9yYWdlIGl0c2VsZiBpcyBjbGVhbmluZyB0 aGUgZGVhZCB0dXBsZXMgYnkgaXRzZWxmLCBpdCBpcyB0aGUKCSAqIHRpbWUgdG8gY2FsbCB0 aGUgaW5kZXggdHVwbGUgZGVsZXRpb24gYWxzby4KCSAqLwoJcmV0dXJuIGhlYXBfZGVsZXRl KHJlbGF0aW9uLCB0aWQsIGNpZCwgb3B0aW9ucywgY3Jvc3NjaGVjaywgd2FpdCwKCQkJCQkg ICB0bWZkKTsKfQoKCnN0YXRpYyBUTV9SZXN1bHQKaGVhcGFtX3R1cGxlX3VwZGF0ZShSZWxh dGlvbiByZWxhdGlvbiwgSXRlbVBvaW50ZXIgb3RpZCwgVHVwbGVUYWJsZVNsb3QgKnNsb3Qs CgkJCQkJQ29tbWFuZElkIGNpZCwgdWludDMyIG9wdGlvbnMsCgkJCQkJU25hcHNob3Qgc25h cHNob3QsIFNuYXBzaG90IGNyb3NzY2hlY2ssCgkJCQkJYm9vbCB3YWl0LCBUTV9GYWlsdXJl RGF0YSAqdG1mZCwKCQkJCQlMb2NrVHVwbGVNb2RlICpsb2NrbW9kZSwgVFVfVXBkYXRlSW5k ZXhlcyAqdXBkYXRlX2luZGV4ZXMpCnsKCWJvb2wJCXNob3VsZEZyZWUgPSB0cnVlOwoJSGVh cFR1cGxlCXR1cGxlID0gRXhlY0ZldGNoU2xvdEhlYXBUdXBsZShzbG90LCB0cnVlLCAmc2hv dWxkRnJlZSk7CglUTV9SZXN1bHQJcmVzdWx0OwoKCS8qIFVwZGF0ZSB0aGUgdHVwbGUgd2l0 aCB0YWJsZSBvaWQgKi8KCXNsb3QtPnR0c190YWJsZU9pZCA9IFJlbGF0aW9uR2V0UmVsaWQo cmVsYXRpb24pOwoJdHVwbGUtPnRfdGFibGVPaWQgPSBzbG90LT50dHNfdGFibGVPaWQ7CgoJ cmVzdWx0ID0gaGVhcF91cGRhdGUocmVsYXRpb24sIG90aWQsIHR1cGxlLCBjaWQsIG9wdGlv bnMsCgkJCQkJCSBjcm9zc2NoZWNrLCB3YWl0LAoJCQkJCQkgdG1mZCwgbG9ja21vZGUsIHVw ZGF0ZV9pbmRleGVzKTsKCUl0ZW1Qb2ludGVyQ29weSgmdHVwbGUtPnRfc2VsZiwgJnNsb3Qt PnR0c190aWQpOwoKCS8qCgkgKiBEZWNpZGUgd2hldGhlciBuZXcgaW5kZXggZW50cmllcyBh cmUgbmVlZGVkIGZvciB0aGUgdHVwbGUKCSAqCgkgKiBOb3RlOiBoZWFwX3VwZGF0ZSByZXR1 cm5zIHRoZSB0aWQgKGxvY2F0aW9uKSBvZiB0aGUgbmV3IHR1cGxlIGluIHRoZQoJICogdF9z ZWxmIGZpZWxkLgoJICoKCSAqIElmIHRoZSB1cGRhdGUgaXMgbm90IEhPVCwgd2UgbXVzdCB1 cGRhdGUgYWxsIGluZGV4ZXMuIElmIHRoZSB1cGRhdGUgaXMKCSAqIEhPVCwgaXQgY291bGQg YmUgdGhhdCB3ZSB1cGRhdGVkIHN1bW1hcml6ZWQgY29sdW1ucywgc28gd2UgZWl0aGVyCgkg KiB1cGRhdGUgb25seSBzdW1tYXJpemVkIGluZGV4ZXMsIG9yIG5vbmUgYXQgYWxsLgoJICov CglpZiAocmVzdWx0ICE9IFRNX09rKQoJewoJCUFzc2VydCgqdXBkYXRlX2luZGV4ZXMgPT0g VFVfTm9uZSk7CgkJKnVwZGF0ZV9pbmRleGVzID0gVFVfTm9uZTsKCX0KCWVsc2UgaWYgKCFI ZWFwVHVwbGVJc0hlYXBPbmx5KHR1cGxlKSkKCQlBc3NlcnQoKnVwZGF0ZV9pbmRleGVzID09 IFRVX0FsbCk7CgllbHNlCgkJQXNzZXJ0KCgqdXBkYXRlX2luZGV4ZXMgPT0gVFVfU3VtbWFy aXppbmcpIHx8CgkJCSAgICgqdXBkYXRlX2luZGV4ZXMgPT0gVFVfTm9uZSkpOwoKCWlmIChz aG91bGRGcmVlKQoJCXBmcmVlKHR1cGxlKTsKCglyZXR1cm4gcmVzdWx0Owp9CgpzdGF0aWMg VE1fUmVzdWx0CmhlYXBhbV90dXBsZV9sb2NrKFJlbGF0aW9uIHJlbGF0aW9uLCBJdGVtUG9p bnRlciB0aWQsIFNuYXBzaG90IHNuYXBzaG90LAoJCQkJICBUdXBsZVRhYmxlU2xvdCAqc2xv dCwgQ29tbWFuZElkIGNpZCwgTG9ja1R1cGxlTW9kZSBtb2RlLAoJCQkJICBMb2NrV2FpdFBv bGljeSB3YWl0X3BvbGljeSwgdWludDggZmxhZ3MsCgkJCQkgIFRNX0ZhaWx1cmVEYXRhICp0 bWZkKQp7CglCdWZmZXJIZWFwVHVwbGVUYWJsZVNsb3QgKmJzbG90ID0gKEJ1ZmZlckhlYXBU dXBsZVRhYmxlU2xvdCAqKSBzbG90OwoJVE1fUmVzdWx0CXJlc3VsdDsKCUJ1ZmZlcgkJYnVm ZmVyOwoJSGVhcFR1cGxlCXR1cGxlID0gJmJzbG90LT5iYXNlLnR1cGRhdGE7Cglib29sCQlm b2xsb3dfdXBkYXRlczsKCglmb2xsb3dfdXBkYXRlcyA9IChmbGFncyAmIFRVUExFX0xPQ0tf RkxBR19MT0NLX1VQREFURV9JTl9QUk9HUkVTUykgIT0gMDsKCXRtZmQtPnRyYXZlcnNlZCA9 IGZhbHNlOwoKCUFzc2VydChUVFNfSVNfQlVGRkVSVFVQTEUoc2xvdCkpOwoKdHVwbGVfbG9j a19yZXRyeToKCXR1cGxlLT50X3NlbGYgPSAqdGlkOwoJcmVzdWx0ID0gaGVhcF9sb2NrX3R1 cGxlKHJlbGF0aW9uLCB0dXBsZSwgY2lkLCBtb2RlLCB3YWl0X3BvbGljeSwKCQkJCQkJCSBm b2xsb3dfdXBkYXRlcywgJmJ1ZmZlciwgdG1mZCk7CgoJaWYgKHJlc3VsdCA9PSBUTV9VcGRh dGVkICYmCgkJKGZsYWdzICYgVFVQTEVfTE9DS19GTEFHX0ZJTkRfTEFTVF9WRVJTSU9OKSkK CXsKCQkvKiBTaG91bGQgbm90IGVuY291bnRlciBzcGVjdWxhdGl2ZSB0dXBsZSBvbiByZWNo ZWNrICovCgkJQXNzZXJ0KCFIZWFwVHVwbGVIZWFkZXJJc1NwZWN1bGF0aXZlKHR1cGxlLT50 X2RhdGEpKTsKCgkJUmVsZWFzZUJ1ZmZlcihidWZmZXIpOwoKCQlpZiAoIUl0ZW1Qb2ludGVy RXF1YWxzKCZ0bWZkLT5jdGlkLCAmdHVwbGUtPnRfc2VsZikpCgkJewoJCQlTbmFwc2hvdERh dGEgU25hcHNob3REaXJ0eTsKCQkJVHJhbnNhY3Rpb25JZCBwcmlvclhtYXg7CgoJCQkvKiBp dCB3YXMgdXBkYXRlZCwgc28gbG9vayBhdCB0aGUgdXBkYXRlZCB2ZXJzaW9uICovCgkJCSp0 aWQgPSB0bWZkLT5jdGlkOwoJCQkvKiB1cGRhdGVkIHJvdyBzaG91bGQgaGF2ZSB4bWluIG1h dGNoaW5nIHRoaXMgeG1heCAqLwoJCQlwcmlvclhtYXggPSB0bWZkLT54bWF4OwoKCQkJLyog c2lnbmFsIHRoYXQgYSB0dXBsZSBsYXRlciBpbiB0aGUgY2hhaW4gaXMgZ2V0dGluZyBsb2Nr ZWQgKi8KCQkJdG1mZC0+dHJhdmVyc2VkID0gdHJ1ZTsKCgkJCS8qCgkJCSAqIGZldGNoIHRh cmdldCB0dXBsZQoJCQkgKgoJCQkgKiBMb29wIGhlcmUgdG8gZGVhbCB3aXRoIHVwZGF0ZWQg b3IgYnVzeSB0dXBsZXMKCQkJICovCgkJCUluaXREaXJ0eVNuYXBzaG90KFNuYXBzaG90RGly dHkpOwoJCQlmb3IgKDs7KQoJCQl7CgkJCQlpZiAoSXRlbVBvaW50ZXJJbmRpY2F0ZXNNb3Zl ZFBhcnRpdGlvbnModGlkKSkKCQkJCQllcmVwb3J0KEVSUk9SLAoJCQkJCQkJKGVycmNvZGUo RVJSQ09ERV9UX1JfU0VSSUFMSVpBVElPTl9GQUlMVVJFKSwKCQkJCQkJCSBlcnJtc2coInR1 cGxlIHRvIGJlIGxvY2tlZCB3YXMgYWxyZWFkeSBtb3ZlZCB0byBhbm90aGVyIHBhcnRpdGlv biBkdWUgdG8gY29uY3VycmVudCB1cGRhdGUiKSkpOwoKCQkJCXR1cGxlLT50X3NlbGYgPSAq dGlkOwoJCQkJaWYgKGhlYXBfZmV0Y2gocmVsYXRpb24sICZTbmFwc2hvdERpcnR5LCB0dXBs ZSwgJmJ1ZmZlciwgdHJ1ZSkpCgkJCQl7CgkJCQkJLyoKCQkJCQkgKiBJZiB4bWluIGlzbid0 IHdoYXQgd2UncmUgZXhwZWN0aW5nLCB0aGUgc2xvdCBtdXN0IGhhdmUKCQkJCQkgKiBiZWVu IHJlY3ljbGVkIGFuZCByZXVzZWQgZm9yIGFuIHVucmVsYXRlZCB0dXBsZS4gIFRoaXMKCQkJ CQkgKiBpbXBsaWVzIHRoYXQgdGhlIGxhdGVzdCB2ZXJzaW9uIG9mIHRoZSByb3cgd2FzIGRl bGV0ZWQsCgkJCQkJICogc28gd2UgbmVlZCBkbyBub3RoaW5nLiAgKFNob3VsZCBiZSBzYWZl IHRvIGV4YW1pbmUgeG1pbgoJCQkJCSAqIHdpdGhvdXQgZ2V0dGluZyBidWZmZXIncyBjb250 ZW50IGxvY2suICBXZSBhc3N1bWUKCQkJCQkgKiByZWFkaW5nIGEgVHJhbnNhY3Rpb25JZCB0 byBiZSBhdG9taWMsIGFuZCBYbWluIG5ldmVyCgkJCQkJICogY2hhbmdlcyBpbiBhbiBleGlz dGluZyB0dXBsZSwgZXhjZXB0IHRvIGludmFsaWQgb3IKCQkJCQkgKiBmcm96ZW4sIGFuZCBu ZWl0aGVyIG9mIHRob3NlIGNhbiBtYXRjaCBwcmlvclhtYXguKQoJCQkJCSAqLwoJCQkJCWlm ICghVHJhbnNhY3Rpb25JZEVxdWFscyhIZWFwVHVwbGVIZWFkZXJHZXRYbWluKHR1cGxlLT50 X2RhdGEpLAoJCQkJCQkJCQkJCSBwcmlvclhtYXgpKQoJCQkJCXsKCQkJCQkJUmVsZWFzZUJ1 ZmZlcihidWZmZXIpOwoJCQkJCQlyZXR1cm4gVE1fRGVsZXRlZDsKCQkJCQl9CgoJCQkJCS8q IG90aGVyd2lzZSB4bWluIHNob3VsZCBub3QgYmUgZGlydHkuLi4gKi8KCQkJCQlpZiAoVHJh bnNhY3Rpb25JZElzVmFsaWQoU25hcHNob3REaXJ0eS54bWluKSkKCQkJCQkJZXJlcG9ydChF UlJPUiwKCQkJCQkJCQkoZXJyY29kZShFUlJDT0RFX0RBVEFfQ09SUlVQVEVEKSwKCQkJCQkJ CQkgZXJybXNnX2ludGVybmFsKCJ0X3htaW4gJXUgaXMgdW5jb21taXR0ZWQgaW4gdHVwbGUg KCV1LCV1KSB0byBiZSB1cGRhdGVkIGluIHRhYmxlIFwiJXNcIiIsCgkJCQkJCQkJCQkJCSBT bmFwc2hvdERpcnR5LnhtaW4sCgkJCQkJCQkJCQkJCSBJdGVtUG9pbnRlckdldEJsb2NrTnVt YmVyKCZ0dXBsZS0+dF9zZWxmKSwKCQkJCQkJCQkJCQkJIEl0ZW1Qb2ludGVyR2V0T2Zmc2V0 TnVtYmVyKCZ0dXBsZS0+dF9zZWxmKSwKCQkJCQkJCQkJCQkJIFJlbGF0aW9uR2V0UmVsYXRp b25OYW1lKHJlbGF0aW9uKSkpKTsKCgkJCQkJLyoKCQkJCQkgKiBJZiB0dXBsZSBpcyBiZWlu ZyB1cGRhdGVkIGJ5IG90aGVyIHRyYW5zYWN0aW9uIHRoZW4gd2UKCQkJCQkgKiBoYXZlIHRv IHdhaXQgZm9yIGl0cyBjb21taXQvYWJvcnQsIG9yIGRpZSB0cnlpbmcuCgkJCQkJICovCgkJ CQkJaWYgKFRyYW5zYWN0aW9uSWRJc1ZhbGlkKFNuYXBzaG90RGlydHkueG1heCkpCgkJCQkJ ewoJCQkJCQlSZWxlYXNlQnVmZmVyKGJ1ZmZlcik7CgkJCQkJCXN3aXRjaCAod2FpdF9wb2xp Y3kpCgkJCQkJCXsKCQkJCQkJCWNhc2UgTG9ja1dhaXRCbG9jazoKCQkJCQkJCQlYYWN0TG9j a1RhYmxlV2FpdChTbmFwc2hvdERpcnR5LnhtYXgsCgkJCQkJCQkJCQkJCSAgcmVsYXRpb24s ICZ0dXBsZS0+dF9zZWxmLAoJCQkJCQkJCQkJCQkgIFhMVFdfRmV0Y2hVcGRhdGVkKTsKCQkJ CQkJCQlicmVhazsKCQkJCQkJCWNhc2UgTG9ja1dhaXRTa2lwOgoJCQkJCQkJCWlmICghQ29u ZGl0aW9uYWxYYWN0TG9ja1RhYmxlV2FpdChTbmFwc2hvdERpcnR5LnhtYXgsIGZhbHNlKSkK CQkJCQkJCQkJLyogc2tpcCBpbnN0ZWFkIG9mIHdhaXRpbmcgKi8KCQkJCQkJCQkJcmV0dXJu IFRNX1dvdWxkQmxvY2s7CgkJCQkJCQkJYnJlYWs7CgkJCQkJCQljYXNlIExvY2tXYWl0RXJy b3I6CgkJCQkJCQkJaWYgKCFDb25kaXRpb25hbFhhY3RMb2NrVGFibGVXYWl0KFNuYXBzaG90 RGlydHkueG1heCwgbG9nX2xvY2tfZmFpbHVyZXMpKQoJCQkJCQkJCQllcmVwb3J0KEVSUk9S LAoJCQkJCQkJCQkJCShlcnJjb2RlKEVSUkNPREVfTE9DS19OT1RfQVZBSUxBQkxFKSwKCQkJ CQkJCQkJCQkgZXJybXNnKCJjb3VsZCBub3Qgb2J0YWluIGxvY2sgb24gcm93IGluIHJlbGF0 aW9uIFwiJXNcIiIsCgkJCQkJCQkJCQkJCQlSZWxhdGlvbkdldFJlbGF0aW9uTmFtZShyZWxh dGlvbikpKSk7CgkJCQkJCQkJYnJlYWs7CgkJCQkJCX0KCQkJCQkJY29udGludWU7CS8qIGxv b3AgYmFjayB0byByZXBlYXQgaGVhcF9mZXRjaCAqLwoJCQkJCX0KCgkJCQkJLyoKCQkJCQkg KiBJZiB0dXBsZSB3YXMgaW5zZXJ0ZWQgYnkgb3VyIG93biB0cmFuc2FjdGlvbiwgd2UgaGF2 ZQoJCQkJCSAqIHRvIGNoZWNrIGNtaW4gYWdhaW5zdCBjaWQ6IGNtaW4gPj0gY3VycmVudCBD SUQgbWVhbnMKCQkJCQkgKiBvdXIgY29tbWFuZCBjYW5ub3Qgc2VlIHRoZSB0dXBsZSwgc28g d2Ugc2hvdWxkIGlnbm9yZQoJCQkJCSAqIGl0LiBPdGhlcndpc2UgaGVhcF9sb2NrX3R1cGxl KCkgd2lsbCB0aHJvdyBhbiBlcnJvciwKCQkJCQkgKiBhbmQgc28gd291bGQgYW55IGxhdGVy IGF0dGVtcHQgdG8gdXBkYXRlIG9yIGRlbGV0ZSB0aGUKCQkJCQkgKiB0dXBsZS4gIChXZSBu ZWVkIG5vdCBjaGVjayBjbWF4IGJlY2F1c2UKCQkJCQkgKiBIZWFwVHVwbGVTYXRpc2ZpZXNE aXJ0eSB3aWxsIGNvbnNpZGVyIGEgdHVwbGUgZGVsZXRlZAoJCQkJCSAqIGJ5IG91ciB0cmFu c2FjdGlvbiBkZWFkLCByZWdhcmRsZXNzIG9mIGNtYXguKSAgV2UganVzdAoJCQkJCSAqIGNo ZWNrZWQgdGhhdCBwcmlvclhtYXggPT0geG1pbiwgc28gd2UgY2FuIHRlc3QgdGhhdAoJCQkJ CSAqIHZhcmlhYmxlIGluc3RlYWQgb2YgZG9pbmcgSGVhcFR1cGxlSGVhZGVyR2V0WG1pbiBh Z2Fpbi4KCQkJCQkgKi8KCQkJCQlpZiAoVHJhbnNhY3Rpb25JZElzQ3VycmVudFRyYW5zYWN0 aW9uSWQocHJpb3JYbWF4KSAmJgoJCQkJCQlIZWFwVHVwbGVIZWFkZXJHZXRDbWluKHR1cGxl LT50X2RhdGEpID49IGNpZCkKCQkJCQl7CgkJCQkJCXRtZmQtPnhtYXggPSBwcmlvclhtYXg7 CgoJCQkJCQkvKgoJCQkJCQkgKiBDbWluIGlzIHRoZSBwcm9ibGVtYXRpYyB2YWx1ZSwgc28g c3RvcmUgdGhhdC4gU2VlCgkJCQkJCSAqIGFib3ZlLgoJCQkJCQkgKi8KCQkJCQkJdG1mZC0+ Y21heCA9IEhlYXBUdXBsZUhlYWRlckdldENtaW4odHVwbGUtPnRfZGF0YSk7CgkJCQkJCVJl bGVhc2VCdWZmZXIoYnVmZmVyKTsKCQkJCQkJcmV0dXJuIFRNX1NlbGZNb2RpZmllZDsKCQkJ CQl9CgoJCQkJCS8qCgkJCQkJICogVGhpcyBpcyBhIGxpdmUgdHVwbGUsIHNvIHRyeSB0byBs b2NrIGl0IGFnYWluLgoJCQkJCSAqLwoJCQkJCVJlbGVhc2VCdWZmZXIoYnVmZmVyKTsKCQkJ CQlnb3RvIHR1cGxlX2xvY2tfcmV0cnk7CgkJCQl9CgoJCQkJLyoKCQkJCSAqIElmIHRoZSBy ZWZlcmVuY2VkIHNsb3Qgd2FzIGFjdHVhbGx5IGVtcHR5LCB0aGUgbGF0ZXN0CgkJCQkgKiB2 ZXJzaW9uIG9mIHRoZSByb3cgbXVzdCBoYXZlIGJlZW4gZGVsZXRlZCwgc28gd2UgbmVlZCBk bwoJCQkJICogbm90aGluZy4KCQkJCSAqLwoJCQkJaWYgKHR1cGxlLT50X2RhdGEgPT0gTlVM TCkKCQkJCXsKCQkJCQlBc3NlcnQoIUJ1ZmZlcklzVmFsaWQoYnVmZmVyKSk7CgkJCQkJcmV0 dXJuIFRNX0RlbGV0ZWQ7CgkJCQl9CgoJCQkJLyoKCQkJCSAqIEFzIGFib3ZlLCBpZiB4bWlu IGlzbid0IHdoYXQgd2UncmUgZXhwZWN0aW5nLCBkbyBub3RoaW5nLgoJCQkJICovCgkJCQlp ZiAoIVRyYW5zYWN0aW9uSWRFcXVhbHMoSGVhcFR1cGxlSGVhZGVyR2V0WG1pbih0dXBsZS0+ dF9kYXRhKSwKCQkJCQkJCQkJCSBwcmlvclhtYXgpKQoJCQkJewoJCQkJCVJlbGVhc2VCdWZm ZXIoYnVmZmVyKTsKCQkJCQlyZXR1cm4gVE1fRGVsZXRlZDsKCQkJCX0KCgkJCQkvKgoJCQkJ ICogSWYgd2UgZ2V0IGhlcmUsIHRoZSB0dXBsZSB3YXMgZm91bmQgYnV0IGZhaWxlZAoJCQkJ ICogU25hcHNob3REaXJ0eS4gQXNzdW1pbmcgdGhlIHhtaW4gaXMgZWl0aGVyIGEgY29tbWl0 dGVkIHhhY3QKCQkJCSAqIG9yIG91ciBvd24geGFjdCAoYXMgaXQgY2VydGFpbmx5IHNob3Vs ZCBiZSBpZiB3ZSdyZSB0cnlpbmcKCQkJCSAqIHRvIG1vZGlmeSB0aGUgdHVwbGUpLCB0aGlz IG11c3QgbWVhbiB0aGF0IHRoZSByb3cgd2FzCgkJCQkgKiB1cGRhdGVkIG9yIGRlbGV0ZWQg YnkgZWl0aGVyIGEgY29tbWl0dGVkIHhhY3Qgb3Igb3VyIG93bgoJCQkJICogeGFjdC4gIElm IGl0IHdhcyBkZWxldGVkLCB3ZSBjYW4gaWdub3JlIGl0OyBpZiBpdCB3YXMKCQkJCSAqIHVw ZGF0ZWQgdGhlbiBjaGFpbiB1cCB0byB0aGUgbmV4dCB2ZXJzaW9uIGFuZCByZXBlYXQgdGhl CgkJCQkgKiB3aG9sZSBwcm9jZXNzLgoJCQkJICoKCQkJCSAqIEFzIGFib3ZlLCBpdCBzaG91 bGQgYmUgc2FmZSB0byBleGFtaW5lIHhtYXggYW5kIHRfY3RpZAoJCQkJICogd2l0aG91dCB0 aGUgYnVmZmVyIGNvbnRlbnQgbG9jaywgYmVjYXVzZSB0aGV5IGNhbid0IGJlCgkJCQkgKiBj aGFuZ2luZy4gIFdlJ2QgYmV0dGVyIGhvbGQgYSBidWZmZXIgcGluIHRob3VnaC4KCQkJCSAq LwoJCQkJaWYgKEl0ZW1Qb2ludGVyRXF1YWxzKCZ0dXBsZS0+dF9zZWxmLCAmdHVwbGUtPnRf ZGF0YS0+dF9jdGlkKSkKCQkJCXsKCQkJCQkvKiBkZWxldGVkLCBzbyBmb3JnZXQgYWJvdXQg aXQgKi8KCQkJCQlSZWxlYXNlQnVmZmVyKGJ1ZmZlcik7CgkJCQkJcmV0dXJuIFRNX0RlbGV0 ZWQ7CgkJCQl9CgoJCQkJLyogdXBkYXRlZCwgc28gbG9vayBhdCB0aGUgdXBkYXRlZCByb3cg Ki8KCQkJCSp0aWQgPSB0dXBsZS0+dF9kYXRhLT50X2N0aWQ7CgkJCQkvKiB1cGRhdGVkIHJv dyBzaG91bGQgaGF2ZSB4bWluIG1hdGNoaW5nIHRoaXMgeG1heCAqLwoJCQkJcHJpb3JYbWF4 ID0gSGVhcFR1cGxlSGVhZGVyR2V0VXBkYXRlWGlkKHR1cGxlLT50X2RhdGEpOwoJCQkJUmVs ZWFzZUJ1ZmZlcihidWZmZXIpOwoJCQkJLyogbG9vcCBiYWNrIHRvIGZldGNoIG5leHQgaW4g Y2hhaW4gKi8KCQkJfQoJCX0KCQllbHNlCgkJewoJCQkvKiB0dXBsZSB3YXMgZGVsZXRlZCwg c28gZ2l2ZSB1cCAqLwoJCQlyZXR1cm4gVE1fRGVsZXRlZDsKCQl9Cgl9CgoJc2xvdC0+dHRz X3RhYmxlT2lkID0gUmVsYXRpb25HZXRSZWxpZChyZWxhdGlvbik7Cgl0dXBsZS0+dF90YWJs ZU9pZCA9IHNsb3QtPnR0c190YWJsZU9pZDsKCgkvKiBzdG9yZSBpbiBzbG90LCB0cmFuc2Zl cnJpbmcgZXhpc3RpbmcgcGluICovCglFeGVjU3RvcmVQaW5uZWRCdWZmZXJIZWFwVHVwbGUo dHVwbGUsIHNsb3QsIGJ1ZmZlcik7CgoJcmV0dXJuIHJlc3VsdDsKfQoKCi8qIC0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLQogKiBEREwgcmVsYXRlZCBjYWxsYmFja3MgZm9yIGhlYXAgQU0uCiAqIC0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLQogKi8KCnN0YXRpYyB2b2lkCmhlYXBhbV9yZWxhdGlvbl9zZXRf bmV3X2ZpbGVsb2NhdG9yKFJlbGF0aW9uIHJlbCwKCQkJCQkJCQkJY29uc3QgUmVsRmlsZUxv Y2F0b3IgKm5ld3Jsb2NhdG9yLAoJCQkJCQkJCQljaGFyIHBlcnNpc3RlbmNlLAoJCQkJCQkJ CQlUcmFuc2FjdGlvbklkICpmcmVlemVYaWQsCgkJCQkJCQkJCU11bHRpWGFjdElkICptaW5t dWx0aSkKewoJU01nclJlbGF0aW9uIHNyZWw7CgoJLyoKCSAqIEluaXRpYWxpemUgdG8gdGhl IG1pbmltdW0gWElEIHRoYXQgY291bGQgcHV0IHR1cGxlcyBpbiB0aGUgdGFibGUuIFdlCgkg KiBrbm93IHRoYXQgbm8geGFjdHMgb2xkZXIgdGhhbiBSZWNlbnRYbWluIGFyZSBzdGlsbCBy dW5uaW5nLCBzbyB0aGF0CgkgKiB3aWxsIGRvLgoJICovCgkqZnJlZXplWGlkID0gUmVjZW50 WG1pbjsKCgkvKgoJICogU2ltaWxhcmx5LCBpbml0aWFsaXplIHRoZSBtaW5pbXVtIE11bHRp eGFjdCB0byB0aGUgZmlyc3QgdmFsdWUgdGhhdAoJICogY291bGQgcG9zc2libHkgYmUgc3Rv cmVkIGluIHR1cGxlcyBpbiB0aGUgdGFibGUuICBSdW5uaW5nIHRyYW5zYWN0aW9ucwoJICog Y291bGQgcmV1c2UgdmFsdWVzIGZyb20gdGhlaXIgbG9jYWwgY2FjaGUsIHNvIHdlIGFyZSBj YXJlZnVsIHRvCgkgKiBjb25zaWRlciBhbGwgY3VycmVudGx5IHJ1bm5pbmcgbXVsdGlzLgoJ ICoKCSAqIFhYWCB0aGlzIGNvdWxkIGJlIHJlZmluZWQgZnVydGhlciwgYnV0IGlzIGl0IHdv cnRoIHRoZSBoYXNzbGU/CgkgKi8KCSptaW5tdWx0aSA9IEdldE9sZGVzdE11bHRpWGFjdElk KCk7CgoJc3JlbCA9IFJlbGF0aW9uQ3JlYXRlU3RvcmFnZSgqbmV3cmxvY2F0b3IsIHBlcnNp c3RlbmNlLCB0cnVlKTsKCgkvKgoJICogSWYgcmVxdWlyZWQsIHNldCB1cCBhbiBpbml0IGZv cmsgZm9yIGFuIHVubG9nZ2VkIHRhYmxlIHNvIHRoYXQgaXQgY2FuCgkgKiBiZSBjb3JyZWN0 bHkgcmVpbml0aWFsaXplZCBvbiByZXN0YXJ0LgoJICovCglpZiAocGVyc2lzdGVuY2UgPT0g UkVMUEVSU0lTVEVOQ0VfVU5MT0dHRUQpCgl7CgkJQXNzZXJ0KHJlbC0+cmRfcmVsLT5yZWxr aW5kID09IFJFTEtJTkRfUkVMQVRJT04gfHwKCQkJICAgcmVsLT5yZF9yZWwtPnJlbGtpbmQg PT0gUkVMS0lORF9UT0FTVFZBTFVFKTsKCQlzbWdyY3JlYXRlKHNyZWwsIElOSVRfRk9SS05V TSwgZmFsc2UpOwoJCWxvZ19zbWdyY3JlYXRlKG5ld3Jsb2NhdG9yLCBJTklUX0ZPUktOVU0p OwoJfQoKCXNtZ3JjbG9zZShzcmVsKTsKfQoKc3RhdGljIHZvaWQKaGVhcGFtX3JlbGF0aW9u X25vbnRyYW5zYWN0aW9uYWxfdHJ1bmNhdGUoUmVsYXRpb24gcmVsKQp7CglSZWxhdGlvblRy dW5jYXRlKHJlbCwgMCk7Cn0KCnN0YXRpYyB2b2lkCmhlYXBhbV9yZWxhdGlvbl9jb3B5X2Rh dGEoUmVsYXRpb24gcmVsLCBjb25zdCBSZWxGaWxlTG9jYXRvciAqbmV3cmxvY2F0b3IpCnsK CVNNZ3JSZWxhdGlvbiBkc3RyZWw7CgoJLyoKCSAqIFNpbmNlIHdlIGNvcHkgdGhlIGZpbGUg ZGlyZWN0bHkgd2l0aG91dCBsb29raW5nIGF0IHRoZSBzaGFyZWQgYnVmZmVycywKCSAqIHdl J2QgYmV0dGVyIGZpcnN0IGZsdXNoIG91dCBhbnkgcGFnZXMgb2YgdGhlIHNvdXJjZSByZWxh dGlvbiB0aGF0IGFyZQoJICogaW4gc2hhcmVkIGJ1ZmZlcnMuICBXZSBhc3N1bWUgbm8gbmV3 IGNoYW5nZXMgd2lsbCBiZSBtYWRlIHdoaWxlIHdlIGFyZQoJICogaG9sZGluZyBleGNsdXNp dmUgbG9jayBvbiB0aGUgcmVsLgoJICovCglGbHVzaFJlbGF0aW9uQnVmZmVycyhyZWwpOwoK CS8qCgkgKiBDcmVhdGUgYW5kIGNvcHkgYWxsIGZvcmtzIG9mIHRoZSByZWxhdGlvbiwgYW5k IHNjaGVkdWxlIHVubGlua2luZyBvZgoJICogb2xkIHBoeXNpY2FsIGZpbGVzLgoJICoKCSAq IE5PVEU6IGFueSBjb25mbGljdCBpbiByZWxmaWxlbnVtYmVyIHZhbHVlIHdpbGwgYmUgY2F1 Z2h0IGluCgkgKiBSZWxhdGlvbkNyZWF0ZVN0b3JhZ2UoKS4KCSAqLwoJZHN0cmVsID0gUmVs YXRpb25DcmVhdGVTdG9yYWdlKCpuZXdybG9jYXRvciwgcmVsLT5yZF9yZWwtPnJlbHBlcnNp c3RlbmNlLCB0cnVlKTsKCgkvKiBjb3B5IG1haW4gZm9yayAqLwoJUmVsYXRpb25Db3B5U3Rv cmFnZShSZWxhdGlvbkdldFNtZ3IocmVsKSwgZHN0cmVsLCBNQUlOX0ZPUktOVU0sCgkJCQkJ CXJlbC0+cmRfcmVsLT5yZWxwZXJzaXN0ZW5jZSk7CgoJLyogY29weSB0aG9zZSBleHRyYSBm b3JrcyB0aGF0IGV4aXN0ICovCglmb3IgKEZvcmtOdW1iZXIgZm9ya051bSA9IE1BSU5fRk9S S05VTSArIDE7CgkJIGZvcmtOdW0gPD0gTUFYX0ZPUktOVU07IGZvcmtOdW0rKykKCXsKCQlp ZiAoc21ncmV4aXN0cyhSZWxhdGlvbkdldFNtZ3IocmVsKSwgZm9ya051bSkpCgkJewoJCQlz bWdyY3JlYXRlKGRzdHJlbCwgZm9ya051bSwgZmFsc2UpOwoKCQkJLyoKCQkJICogV0FMIGxv ZyBjcmVhdGlvbiBpZiB0aGUgcmVsYXRpb24gaXMgcGVyc2lzdGVudCwgb3IgdGhpcyBpcyB0 aGUKCQkJICogaW5pdCBmb3JrIG9mIGFuIHVubG9nZ2VkIHJlbGF0aW9uLgoJCQkgKi8KCQkJ aWYgKFJlbGF0aW9uSXNQZXJtYW5lbnQocmVsKSB8fAoJCQkJKHJlbC0+cmRfcmVsLT5yZWxw ZXJzaXN0ZW5jZSA9PSBSRUxQRVJTSVNURU5DRV9VTkxPR0dFRCAmJgoJCQkJIGZvcmtOdW0g PT0gSU5JVF9GT1JLTlVNKSkKCQkJCWxvZ19zbWdyY3JlYXRlKG5ld3Jsb2NhdG9yLCBmb3Jr TnVtKTsKCQkJUmVsYXRpb25Db3B5U3RvcmFnZShSZWxhdGlvbkdldFNtZ3IocmVsKSwgZHN0 cmVsLCBmb3JrTnVtLAoJCQkJCQkJCXJlbC0+cmRfcmVsLT5yZWxwZXJzaXN0ZW5jZSk7CgkJ fQoJfQoKCgkvKiBkcm9wIG9sZCByZWxhdGlvbiwgYW5kIGNsb3NlIG5ldyBvbmUgKi8KCVJl bGF0aW9uRHJvcFN0b3JhZ2UocmVsKTsKCXNtZ3JjbG9zZShkc3RyZWwpOwp9CgpzdGF0aWMg dm9pZApoZWFwYW1fcmVsYXRpb25fY29weV9mb3JfY2x1c3RlcihSZWxhdGlvbiBPbGRIZWFw LCBSZWxhdGlvbiBOZXdIZWFwLAoJCQkJCQkJCSBSZWxhdGlvbiBPbGRJbmRleCwgYm9vbCB1 c2Vfc29ydCwKCQkJCQkJCQkgVHJhbnNhY3Rpb25JZCBPbGRlc3RYbWluLAoJCQkJCQkJCSBT bmFwc2hvdCBzbmFwc2hvdCwKCQkJCQkJCQkgVHJhbnNhY3Rpb25JZCAqeGlkX2N1dG9mZiwK CQkJCQkJCQkgTXVsdGlYYWN0SWQgKm11bHRpX2N1dG9mZiwKCQkJCQkJCQkgZG91YmxlICpu dW1fdHVwbGVzLAoJCQkJCQkJCSBkb3VibGUgKnR1cHNfdmFjdXVtZWQsCgkJCQkJCQkJIGRv dWJsZSAqdHVwc19yZWNlbnRseV9kZWFkKQp7CglSZXdyaXRlU3RhdGUgcndzdGF0ZTsKCUJ1 bGtJbnNlcnRTdGF0ZSBiaXN0YXRlOwoJSW5kZXhTY2FuRGVzYyBpbmRleFNjYW47CglUYWJs ZVNjYW5EZXNjIHRhYmxlU2NhbjsKCUhlYXBTY2FuRGVzYyBoZWFwU2NhbjsKCWJvb2wJCWlz X3N5c3RlbV9jYXRhbG9nOwoJVHVwbGVzb3J0c3RhdGUgKnR1cGxlc29ydDsKCVR1cGxlRGVz YwlvbGRUdXBEZXNjID0gUmVsYXRpb25HZXREZXNjcihPbGRIZWFwKTsKCVR1cGxlRGVzYwlu ZXdUdXBEZXNjID0gUmVsYXRpb25HZXREZXNjcihOZXdIZWFwKTsKCVR1cGxlVGFibGVTbG90 ICpzbG90OwoJaW50CQkJbmF0dHM7CglEYXR1bQkgICAqdmFsdWVzOwoJYm9vbAkgICAqaXNu dWxsOwoJQnVmZmVySGVhcFR1cGxlVGFibGVTbG90ICpoc2xvdDsKCUJsb2NrTnVtYmVyIHBy ZXZfY2Jsb2NrID0gSW52YWxpZEJsb2NrTnVtYmVyOwoJYm9vbAkJY29uY3VycmVudCA9IHNu YXBzaG90ICE9IE5VTEw7CgoJLyogUmVtZW1iZXIgaWYgaXQncyBhIHN5c3RlbSBjYXRhbG9n ICovCglpc19zeXN0ZW1fY2F0YWxvZyA9IElzU3lzdGVtUmVsYXRpb24oT2xkSGVhcCk7CgoJ LyoKCSAqIFZhbGlkIHNtZ3JfdGFyZ2Jsb2NrIGltcGxpZXMgc29tZXRoaW5nIGFscmVhZHkg d3JvdGUgdG8gdGhlIHJlbGF0aW9uLgoJICogVGhpcyBtYXkgYmUgaGFybWxlc3MsIGJ1dCB0 aGlzIGZ1bmN0aW9uIGhhc24ndCBwbGFubmVkIGZvciBpdC4KCSAqLwoJQXNzZXJ0KFJlbGF0 aW9uR2V0VGFyZ2V0QmxvY2soTmV3SGVhcCkgPT0gSW52YWxpZEJsb2NrTnVtYmVyKTsKCgkv KiBQcmVhbGxvY2F0ZSB2YWx1ZXMvaXNudWxsIGFycmF5cyAqLwoJbmF0dHMgPSBuZXdUdXBE ZXNjLT5uYXR0czsKCXZhbHVlcyA9IHBhbGxvY19hcnJheShEYXR1bSwgbmF0dHMpOwoJaXNu dWxsID0gcGFsbG9jX2FycmF5KGJvb2wsIG5hdHRzKTsKCgkvKgoJICogSW4gbm9uLWNvbmN1 cnJlbnQgbW9kZSwgaW5pdGlhbGl6ZSB0aGUgcmV3cml0ZSBvcGVyYXRpb24uICBUaGlzIGlz IG5vdAoJICogbmVlZGVkIGluIGNvbmN1cnJlbnQgbW9kZS4KCSAqLwoJaWYgKCFjb25jdXJy ZW50KQoJCXJ3c3RhdGUgPSBiZWdpbl9oZWFwX3Jld3JpdGUoT2xkSGVhcCwgTmV3SGVhcCwg T2xkZXN0WG1pbiwKCQkJCQkJCQkJICp4aWRfY3V0b2ZmLCAqbXVsdGlfY3V0b2ZmKTsKCWVs c2UKCQlyd3N0YXRlID0gTlVMTDsKCgkvKiBJbiBjb25jdXJyZW50IG1vZGUsIHByZXBhcmUg Zm9yIGJ1bGstaW5zZXJ0IG9wZXJhdGlvbi4gKi8KCWlmIChjb25jdXJyZW50KQoJCWJpc3Rh dGUgPSBHZXRCdWxrSW5zZXJ0U3RhdGUoKTsKCWVsc2UKCQliaXN0YXRlID0gTlVMTDsKCgkv KiBTZXQgdXAgc29ydGluZyBpZiB3YW50ZWQgKi8KCWlmICh1c2Vfc29ydCkKCQl0dXBsZXNv cnQgPSB0dXBsZXNvcnRfYmVnaW5fY2x1c3RlcihvbGRUdXBEZXNjLCBPbGRJbmRleCwKCQkJ CQkJCQkJCQltYWludGVuYW5jZV93b3JrX21lbSwKCQkJCQkJCQkJCQlOVUxMLCBUVVBMRVNP UlRfTk9ORSk7CgllbHNlCgkJdHVwbGVzb3J0ID0gTlVMTDsKCgkvKgoJICogUHJlcGFyZSB0 byBzY2FuIHRoZSBPbGRIZWFwLiAgVG8gZW5zdXJlIHdlIHNlZSByZWNlbnRseS1kZWFkIHR1 cGxlcwoJICogdGhhdCBzdGlsbCBuZWVkIHRvIGJlIGNvcGllZCwgd2Ugc2NhbiB3aXRoIFNu YXBzaG90QW55IGFuZCB1c2UKCSAqIEhlYXBUdXBsZVNhdGlzZmllc1ZhY3V1bSBmb3IgdGhl IHZpc2liaWxpdHkgdGVzdC4KCSAqCgkgKiBJbiB0aGUgQ09OQ1VSUkVOVExZIGNhc2UsIHdl IGRvIHJlZ3VsYXIgTVZDQyB2aXNpYmlsaXR5IHRlc3RzLCB1c2luZwoJICogdGhlIHNuYXBz aG90IHBhc3NlZCBieSB0aGUgY2FsbGVyLgoJICovCglpZiAoT2xkSW5kZXggIT0gTlVMTCAm JiAhdXNlX3NvcnQpCgl7CgkJY29uc3QgaW50CWNpX2luZGV4W10gPSB7CgkJCVBST0dSRVNT X1JFUEFDS19QSEFTRSwKCQkJUFJPR1JFU1NfUkVQQUNLX0lOREVYX1JFTElECgkJfTsKCQlp bnQ2NAkJY2lfdmFsWzJdOwoKCQkvKiBTZXQgcGhhc2UgYW5kIE9JRE9sZEluZGV4IHRvIGNv bHVtbnMgKi8KCQljaV92YWxbMF0gPSBQUk9HUkVTU19SRVBBQ0tfUEhBU0VfSU5ERVhfU0NB Tl9IRUFQOwoJCWNpX3ZhbFsxXSA9IFJlbGF0aW9uR2V0UmVsaWQoT2xkSW5kZXgpOwoJCXBn c3RhdF9wcm9ncmVzc191cGRhdGVfbXVsdGlfcGFyYW0oMiwgY2lfaW5kZXgsIGNpX3ZhbCk7 CgoJCXRhYmxlU2NhbiA9IE5VTEw7CgkJaGVhcFNjYW4gPSBOVUxMOwoJCWluZGV4U2NhbiA9 IGluZGV4X2JlZ2luc2NhbihPbGRIZWFwLCBPbGRJbmRleCwKCQkJCQkJCQkJc25hcHNob3Qg PyBzbmFwc2hvdCA6IFNuYXBzaG90QW55LAoJCQkJCQkJCQlOVUxMLCAwLCAwLAoJCQkJCQkJ CQlTT19OT05FKTsKCQlpbmRleF9yZXNjYW4oaW5kZXhTY2FuLCBOVUxMLCAwLCBOVUxMLCAw KTsKCX0KCWVsc2UKCXsKCQkvKiBJbiBzY2FuLWFuZC1zb3J0IG1vZGUgYW5kIGFsc28gVkFD VVVNIEZVTEwsIHNldCBwaGFzZSAqLwoJCXBnc3RhdF9wcm9ncmVzc191cGRhdGVfcGFyYW0o UFJPR1JFU1NfUkVQQUNLX1BIQVNFLAoJCQkJCQkJCQkgUFJPR1JFU1NfUkVQQUNLX1BIQVNF X1NFUV9TQ0FOX0hFQVApOwoKCQl0YWJsZVNjYW4gPSB0YWJsZV9iZWdpbnNjYW4oT2xkSGVh cCwKCQkJCQkJCQkJc25hcHNob3QgPyBzbmFwc2hvdCA6IFNuYXBzaG90QW55LAoJCQkJCQkJ CQkwLCAoU2NhbktleSkgTlVMTCwKCQkJCQkJCQkJU09fTk9ORSk7CgkJaGVhcFNjYW4gPSAo SGVhcFNjYW5EZXNjKSB0YWJsZVNjYW47CgkJaW5kZXhTY2FuID0gTlVMTDsKCgkJLyogU2V0 IHRvdGFsIGhlYXAgYmxvY2tzICovCgkJcGdzdGF0X3Byb2dyZXNzX3VwZGF0ZV9wYXJhbShQ Uk9HUkVTU19SRVBBQ0tfVE9UQUxfSEVBUF9CTEtTLAoJCQkJCQkJCQkgaGVhcFNjYW4tPnJz X25ibG9ja3MpOwoJfQoKCXNsb3QgPSB0YWJsZV9zbG90X2NyZWF0ZShPbGRIZWFwLCBOVUxM KTsKCWhzbG90ID0gKEJ1ZmZlckhlYXBUdXBsZVRhYmxlU2xvdCAqKSBzbG90OwoKCS8qCgkg KiBTY2FuIHRocm91Z2ggdGhlIE9sZEhlYXAsIGVpdGhlciBpbiBPbGRJbmRleCBvcmRlciBv ciBzZXF1ZW50aWFsbHk7CgkgKiBjb3B5IGVhY2ggdHVwbGUgaW50byB0aGUgTmV3SGVhcCwg b3IgdHJhbnNpZW50bHkgdG8gdGhlIHR1cGxlc29ydAoJICogbW9kdWxlLiAgTm90ZSB0aGF0 IHdlIGRvbid0IGJvdGhlciBzb3J0aW5nIGRlYWQgdHVwbGVzICh0aGV5IHdvbid0IGdldAoJ ICogdG8gdGhlIG5ldyB0YWJsZSBhbnl3YXkpLgoJICovCglmb3IgKDs7KQoJewoJCUhlYXBU dXBsZQl0dXBsZTsKCQlCdWZmZXIJCWJ1ZjsKCQlib29sCQlpc2RlYWQ7CgoJCUNIRUNLX0ZP Ul9JTlRFUlJVUFRTKCk7CgoJCWlmIChpbmRleFNjYW4gIT0gTlVMTCkKCQl7CgkJCWlmICgh aW5kZXhfZ2V0bmV4dF9zbG90KGluZGV4U2NhbiwgRm9yd2FyZFNjYW5EaXJlY3Rpb24sIHNs b3QpKQoJCQkJYnJlYWs7CgoJCQkvKiBTaW5jZSB3ZSB1c2VkIG5vIHNjYW4ga2V5cywgc2hv dWxkIG5ldmVyIG5lZWQgdG8gcmVjaGVjayAqLwoJCQlpZiAoaW5kZXhTY2FuLT54c19yZWNo ZWNrKQoJCQkJZWxvZyhFUlJPUiwgIkNMVVNURVIgZG9lcyBub3Qgc3VwcG9ydCBsb3NzeSBp bmRleCBjb25kaXRpb25zIik7CgkJfQoJCWVsc2UKCQl7CgkJCWlmICghdGFibGVfc2Nhbl9n ZXRuZXh0c2xvdCh0YWJsZVNjYW4sIEZvcndhcmRTY2FuRGlyZWN0aW9uLCBzbG90KSkKCQkJ ewoJCQkJLyoKCQkJCSAqIElmIHRoZSBsYXN0IHBhZ2VzIG9mIHRoZSBzY2FuIHdlcmUgZW1w dHksIHdlIHdvdWxkIGdvIHRvCgkJCQkgKiB0aGUgbmV4dCBwaGFzZSB3aGlsZSBoZWFwX2Js a3Nfc2Nhbm5lZCAhPSBoZWFwX2Jsa3NfdG90YWwuCgkJCQkgKiBJbnN0ZWFkLCB0byBlbnN1 cmUgdGhhdCBoZWFwX2Jsa3Nfc2Nhbm5lZCBpcyBlcXVpdmFsZW50IHRvCgkJCQkgKiBoZWFw X2Jsa3NfdG90YWwgYWZ0ZXIgdGhlIHRhYmxlIHNjYW4gcGhhc2UsIHRoaXMgcGFyYW1ldGVy CgkJCQkgKiBpcyBtYW51YWxseSB1cGRhdGVkIHRvIHRoZSBjb3JyZWN0IHZhbHVlIHdoZW4g dGhlIHRhYmxlCgkJCQkgKiBzY2FuIGZpbmlzaGVzLgoJCQkJICovCgkJCQlwZ3N0YXRfcHJv Z3Jlc3NfdXBkYXRlX3BhcmFtKFBST0dSRVNTX1JFUEFDS19IRUFQX0JMS1NfU0NBTk5FRCwK CQkJCQkJCQkJCQkgaGVhcFNjYW4tPnJzX25ibG9ja3MpOwoJCQkJYnJlYWs7CgkJCX0KCgkJ CS8qCgkJCSAqIEluIHNjYW4tYW5kLXNvcnQgbW9kZSBhbmQgYWxzbyBWQUNVVU0gRlVMTCwg c2V0IGhlYXAgYmxvY2tzCgkJCSAqIHNjYW5uZWQKCQkJICoKCQkJICogTm90ZSB0aGF0IGhl YXBTY2FuIG1heSBzdGFydCBhdCBhbiBvZmZzZXQgYW5kIHdyYXAgYXJvdW5kLCBpLmUuCgkJ CSAqIHJzX3N0YXJ0YmxvY2sgbWF5IGJlID4wLCBhbmQgcnNfY2Jsb2NrIG1heSBlbmQgd2l0 aCBhIG51bWJlcgoJCQkgKiBiZWxvdyByc19zdGFydGJsb2NrLiBUbyBwcmV2ZW50IHNob3dp bmcgdGhpcyB3cmFwYXJvdW5kIHRvIHRoZQoJCQkgKiB1c2VyLCB3ZSBvZmZzZXQgcnNfY2Js b2NrIGJ5IHJzX3N0YXJ0YmxvY2sgKG1vZHVsbyByc19uYmxvY2tzKS4KCQkJICovCgkJCWlm IChwcmV2X2NibG9jayAhPSBoZWFwU2Nhbi0+cnNfY2Jsb2NrKQoJCQl7CgkJCQlwZ3N0YXRf cHJvZ3Jlc3NfdXBkYXRlX3BhcmFtKFBST0dSRVNTX1JFUEFDS19IRUFQX0JMS1NfU0NBTk5F RCwKCQkJCQkJCQkJCQkgKGhlYXBTY2FuLT5yc19jYmxvY2sgKwoJCQkJCQkJCQkJCSAgaGVh cFNjYW4tPnJzX25ibG9ja3MgLQoJCQkJCQkJCQkJCSAgaGVhcFNjYW4tPnJzX3N0YXJ0Ymxv Y2sKCQkJCQkJCQkJCQkgICkgJSBoZWFwU2Nhbi0+cnNfbmJsb2NrcyArIDEpOwoJCQkJcHJl dl9jYmxvY2sgPSBoZWFwU2Nhbi0+cnNfY2Jsb2NrOwoJCQl9CgkJfQoKCQl0dXBsZSA9IEV4 ZWNGZXRjaFNsb3RIZWFwVHVwbGUoc2xvdCwgZmFsc2UsIE5VTEwpOwoJCWJ1ZiA9IGhzbG90 LT5idWZmZXI7CgoJCS8qCgkJICogSW4gY29uY3VycmVudCBtb2RlLCBvdXIgdGFibGUgb3Ig aW5kZXggc2NhbiBoYXMgdXNlZCByZWd1bGFyIE1WQ0MKCQkgKiB2aXNpYmlsaXR5IHRlc3Qg YWdhaW5zdCBhIHNuYXBzaG90IHBhc3NlZCBieSBjYWxsZXI7IHRoZXJlZm9yZSB3ZQoJCSAq IGRvbid0IG5lZWQgYW5vdGhlciB2aXNpYmlsaXR5IHRlc3QuICBJbiBub24tY29uY3VycmVu dCBtb2RlCgkJICogaG93ZXZlciwgd2UgbXVzdCB0ZXN0IHRoZSB2aXNpYmlsaXR5IG9mIGVh Y2ggdHVwbGUgd2UgcmVhZC4KCQkgKi8KCQlpZiAoIWNvbmN1cnJlbnQpCgkJewoJCQkvKgoJ CQkgKiBUbyBiZSBhYmxlIHRvIGd1YXJhbnRlZSB0aGF0IHdlIGNhbiBzZXQgdGhlIGhpbnQg Yml0LCBhY3F1aXJlCgkJCSAqIGFuIGV4Y2x1c2l2ZSBsb2NrIG9uIHRoZSBvbGQgYnVmZmVy LiBXZSBuZWVkIHRoZSBoaW50IGJpdHMsIHNldAoJCQkgKiBpbiBoZWFwYW1fcmVsYXRpb25f Y29weV9mb3JfY2x1c3RlcigpIC0+CgkJCSAqIEhlYXBUdXBsZVNhdGlzZmllc1ZhY3V1bSgp LCB0byBiZSBzZXQsIGFzIG90aGVyd2lzZQoJCQkgKiByZWZvcm1fYW5kX3Jld3JpdGVfdHVw bGUoKSAtPiByZXdyaXRlX2hlYXBfdHVwbGUoKSB3aWxsIGdldAoJCQkgKiBjb25mdXNlZC4g U3BlY2lmaWNhbGx5LCByZXdyaXRlX2hlYXBfdHVwbGUoKSBjaGVja3MgZm9yCgkJCSAqIEhF QVBfWE1BWF9JTlZBTElEIGluIHRoZSBvbGQgdHVwbGUgdG8gZGV0ZXJtaW5lIHdoZXRoZXIg dG8KCQkJICogY2hlY2sgdGhlIG9sZC10by1uZXcgbWFwcGluZyBoYXNoIHRhYmxlLgoJCQkg KgoJCQkgKiBJdCdkIGJlIGJldHRlciBpZiB3ZSBzb21laG93IGNvdWxkIGF2b2lkIHNldHRp bmcgaGludCBiaXRzIG9uCgkJCSAqIHRoZSBvbGQgcGFnZS4gT25lIHJlYXNvbiB0byB1c2Ug VkFDVVVNIEZVTEwgYXJlIHZlcnkgYmxvYXRlZAoJCQkgKiB0YWJsZXMgLSByZXdyaXRpbmcg bW9zdCBvZiB0aGUgb2xkIHRhYmxlIGR1cmluZyBWQUNVVU0gRlVMTAoJCQkgKiBkb2Vzbid0 IGV4YWN0bHkgaGVscC4uLgoJCQkgKi8KCQkJTG9ja0J1ZmZlcihidWYsIEJVRkZFUl9MT0NL X0VYQ0xVU0lWRSk7CgoJCQlzd2l0Y2ggKEhlYXBUdXBsZVNhdGlzZmllc1ZhY3V1bSh0dXBs ZSwgT2xkZXN0WG1pbiwgYnVmKSkKCQkJewoJCQkJY2FzZSBIRUFQVFVQTEVfREVBRDoKCQkJ CQkvKiBEZWZpbml0ZWx5IGRlYWQgKi8KCQkJCQlpc2RlYWQgPSB0cnVlOwoJCQkJCWJyZWFr OwoJCQkJY2FzZSBIRUFQVFVQTEVfUkVDRU5UTFlfREVBRDoKCQkJCQkqdHVwc19yZWNlbnRs eV9kZWFkICs9IDE7CgkJCQkJcGdfZmFsbHRocm91Z2g7CgkJCQljYXNlIEhFQVBUVVBMRV9M SVZFOgoJCQkJCS8qIExpdmUgb3IgcmVjZW50bHkgZGVhZCwgbXVzdCBjb3B5IGl0ICovCgkJ CQkJaXNkZWFkID0gZmFsc2U7CgkJCQkJYnJlYWs7CgkJCQljYXNlIEhFQVBUVVBMRV9JTlNF UlRfSU5fUFJPR1JFU1M6CgoJCQkJCS8qCgkJCQkJICogQXMgbG9uZyBhcyB3ZSBob2xkIGV4 Y2x1c2l2ZSBsb2NrIG9uIHRoZSByZWxhdGlvbiwKCQkJCQkgKiBub3JtYWxseSB0aGUgb25s eSB3YXkgdG8gc2VlIHRoaXMgaXMgaWYgaXQgd2FzIGluc2VydGVkCgkJCQkJICogZWFybGll ciBpbiBvdXIgb3duIHRyYW5zYWN0aW9uLiAgSG93ZXZlciwgaXQgY2FuIGhhcHBlbgoJCQkJ CSAqIGluIHN5c3RlbSBjYXRhbG9ncywgc2luY2Ugd2UgdGVuZCB0byByZWxlYXNlIHdyaXRl IGxvY2sKCQkJCQkgKiBiZWZvcmUgY29tbWl0IHRoZXJlLiBHaXZlIGEgd2FybmluZyBpZiBu ZWl0aGVyIGNhc2UKCQkJCQkgKiBhcHBsaWVzOyBidXQgaW4gYW55IGNhc2Ugd2UgaGFkIGJl dHRlciBjb3B5IGl0LgoJCQkJCSAqLwoJCQkJCWlmICghaXNfc3lzdGVtX2NhdGFsb2cgJiYK CQkJCQkJIVRyYW5zYWN0aW9uSWRJc0N1cnJlbnRUcmFuc2FjdGlvbklkKEhlYXBUdXBsZUhl YWRlckdldFhtaW4odHVwbGUtPnRfZGF0YSkpKQoJCQkJCQllbG9nKFdBUk5JTkcsICJjb25j dXJyZW50IGluc2VydCBpbiBwcm9ncmVzcyB3aXRoaW4gdGFibGUgXCIlc1wiIiwKCQkJCQkJ CSBSZWxhdGlvbkdldFJlbGF0aW9uTmFtZShPbGRIZWFwKSk7CgkJCQkJLyogdHJlYXQgYXMg bGl2ZSAqLwoJCQkJCWlzZGVhZCA9IGZhbHNlOwoJCQkJCWJyZWFrOwoJCQkJY2FzZSBIRUFQ VFVQTEVfREVMRVRFX0lOX1BST0dSRVNTOgoKCQkJCQkvKgoJCQkJCSAqIFNpbWlsYXIgc2l0 dWF0aW9uIHRvIElOU0VSVF9JTl9QUk9HUkVTUyBjYXNlLgoJCQkJCSAqLwoJCQkJCWlmICgh aXNfc3lzdGVtX2NhdGFsb2cgJiYKCQkJCQkJIVRyYW5zYWN0aW9uSWRJc0N1cnJlbnRUcmFu c2FjdGlvbklkKEhlYXBUdXBsZUhlYWRlckdldFVwZGF0ZVhpZCh0dXBsZS0+dF9kYXRhKSkp CgkJCQkJCWVsb2coV0FSTklORywgImNvbmN1cnJlbnQgZGVsZXRlIGluIHByb2dyZXNzIHdp dGhpbiB0YWJsZSBcIiVzXCIiLAoJCQkJCQkJIFJlbGF0aW9uR2V0UmVsYXRpb25OYW1lKE9s ZEhlYXApKTsKCQkJCQkvKiB0cmVhdCBhcyByZWNlbnRseSBkZWFkICovCgkJCQkJKnR1cHNf cmVjZW50bHlfZGVhZCArPSAxOwoJCQkJCWlzZGVhZCA9IGZhbHNlOwoJCQkJCWJyZWFrOwoJ CQkJZGVmYXVsdDoKCQkJCQllbG9nKEVSUk9SLCAidW5leHBlY3RlZCBIZWFwVHVwbGVTYXRp c2ZpZXNWYWN1dW0gcmVzdWx0Iik7CgkJCQkJaXNkZWFkID0gZmFsc2U7IC8qIGtlZXAgY29t cGlsZXIgcXVpZXQgKi8KCQkJCQlicmVhazsKCQkJfQoKCQkJTG9ja0J1ZmZlcihidWYsIEJV RkZFUl9MT0NLX1VOTE9DSyk7CgoJCQlpZiAoaXNkZWFkKQoJCQl7CgkJCQkqdHVwc192YWN1 dW1lZCArPSAxOwoJCQkJLyogaGVhcCByZXdyaXRlIG1vZHVsZSBzdGlsbCBuZWVkcyB0byBz ZWUgaXQuLi4gKi8KCQkJCWlmIChyZXdyaXRlX2hlYXBfZGVhZF90dXBsZShyd3N0YXRlLCB0 dXBsZSkpCgkJCQl7CgkJCQkJLyogQSBwcmV2aW91cyByZWNlbnRseS1kZWFkIHR1cGxlIGlz IG5vdyBrbm93biBkZWFkICovCgkJCQkJKnR1cHNfdmFjdXVtZWQgKz0gMTsKCQkJCQkqdHVw c19yZWNlbnRseV9kZWFkIC09IDE7CgkJCQl9CgoJCQkJY29udGludWU7CgkJCX0KCQl9CgoJ CSpudW1fdHVwbGVzICs9IDE7CgkJaWYgKHR1cGxlc29ydCAhPSBOVUxMKQoJCXsKCQkJdHVw bGVzb3J0X3B1dGhlYXB0dXBsZSh0dXBsZXNvcnQsIHR1cGxlKTsKCgkJCS8qCgkJCSAqIElu IHNjYW4tYW5kLXNvcnQgbW9kZSwgcmVwb3J0IGluY3JlYXNlIGluIG51bWJlciBvZiB0dXBs ZXMKCQkJICogc2Nhbm5lZAoJCQkgKi8KCQkJcGdzdGF0X3Byb2dyZXNzX3VwZGF0ZV9wYXJh bShQUk9HUkVTU19SRVBBQ0tfSEVBUF9UVVBMRVNfU0NBTk5FRCwKCQkJCQkJCQkJCSAqbnVt X3R1cGxlcyk7CgkJfQoJCWVsc2UKCQl7CgkJCWNvbnN0IGludAljdF9pbmRleFtdID0gewoJ CQkJUFJPR1JFU1NfUkVQQUNLX0hFQVBfVFVQTEVTX1NDQU5ORUQsCgkJCQlQUk9HUkVTU19S RVBBQ0tfSEVBUF9UVVBMRVNfSU5TRVJURUQKCQkJfTsKCQkJaW50NjQJCWN0X3ZhbFsyXTsK CgkJCWlmICghY29uY3VycmVudCkKCQkJCXJlZm9ybV9hbmRfcmV3cml0ZV90dXBsZSh0dXBs ZSwgT2xkSGVhcCwgTmV3SGVhcCwKCQkJCQkJCQkJCSB2YWx1ZXMsIGlzbnVsbCwgcndzdGF0 ZSk7CgkJCWVsc2UKCQkJCWhlYXBfaW5zZXJ0X2Zvcl9yZXBhY2sodHVwbGUsIE9sZEhlYXAs IE5ld0hlYXAsCgkJCQkJCQkJCSAgIHZhbHVlcywgaXNudWxsLCBiaXN0YXRlKTsKCgkJCS8q CgkJCSAqIEluIGluZGV4c2NhbiBtb2RlIGFuZCBhbHNvIFZBQ1VVTSBGVUxMLCByZXBvcnQg aW5jcmVhc2UgaW4KCQkJICogbnVtYmVyIG9mIHR1cGxlcyBzY2FubmVkIGFuZCB3cml0dGVu CgkJCSAqLwoJCQljdF92YWxbMF0gPSAqbnVtX3R1cGxlczsKCQkJY3RfdmFsWzFdID0gKm51 bV90dXBsZXM7CgkJCXBnc3RhdF9wcm9ncmVzc191cGRhdGVfbXVsdGlfcGFyYW0oMiwgY3Rf aW5kZXgsIGN0X3ZhbCk7CgkJfQoJfQoKCWlmIChpbmRleFNjYW4gIT0gTlVMTCkKCQlpbmRl eF9lbmRzY2FuKGluZGV4U2Nhbik7CglpZiAodGFibGVTY2FuICE9IE5VTEwpCgkJdGFibGVf ZW5kc2Nhbih0YWJsZVNjYW4pOwoJaWYgKHNsb3QpCgkJRXhlY0Ryb3BTaW5nbGVUdXBsZVRh YmxlU2xvdChzbG90KTsKCgkvKgoJICogSW4gc2Nhbi1hbmQtc29ydCBtb2RlLCBjb21wbGV0 ZSB0aGUgc29ydCwgdGhlbiByZWFkIG91dCBhbGwgbGl2ZSB0dXBsZXMKCSAqIGZyb20gdGhl IHR1cGxlc3RvcmUgYW5kIHdyaXRlIHRoZW0gdG8gdGhlIG5ldyByZWxhdGlvbi4KCSAqLwoJ aWYgKHR1cGxlc29ydCAhPSBOVUxMKQoJewoJCWRvdWJsZQkJbl90dXBsZXMgPSAwOwoKCQkv KiBSZXBvcnQgdGhhdCB3ZSBhcmUgbm93IHNvcnRpbmcgdHVwbGVzICovCgkJcGdzdGF0X3By b2dyZXNzX3VwZGF0ZV9wYXJhbShQUk9HUkVTU19SRVBBQ0tfUEhBU0UsCgkJCQkJCQkJCSBQ Uk9HUkVTU19SRVBBQ0tfUEhBU0VfU09SVF9UVVBMRVMpOwoKCQl0dXBsZXNvcnRfcGVyZm9y bXNvcnQodHVwbGVzb3J0KTsKCgkJLyogUmVwb3J0IHRoYXQgd2UgYXJlIG5vdyB3cml0aW5n IG5ldyBoZWFwICovCgkJcGdzdGF0X3Byb2dyZXNzX3VwZGF0ZV9wYXJhbShQUk9HUkVTU19S RVBBQ0tfUEhBU0UsCgkJCQkJCQkJCSBQUk9HUkVTU19SRVBBQ0tfUEhBU0VfV1JJVEVfTkVX X0hFQVApOwoKCQlmb3IgKDs7KQoJCXsKCQkJSGVhcFR1cGxlCXR1cGxlOwoKCQkJQ0hFQ0tf Rk9SX0lOVEVSUlVQVFMoKTsKCgkJCXR1cGxlID0gdHVwbGVzb3J0X2dldGhlYXB0dXBsZSh0 dXBsZXNvcnQsIHRydWUpOwoJCQlpZiAodHVwbGUgPT0gTlVMTCkKCQkJCWJyZWFrOwoKCQkJ bl90dXBsZXMgKz0gMTsKCQkJaWYgKCFjb25jdXJyZW50KQoJCQkJcmVmb3JtX2FuZF9yZXdy aXRlX3R1cGxlKHR1cGxlLAoJCQkJCQkJCQkJIE9sZEhlYXAsIE5ld0hlYXAsCgkJCQkJCQkJ CQkgdmFsdWVzLCBpc251bGwsCgkJCQkJCQkJCQkgcndzdGF0ZSk7CgkJCWVsc2UKCQkJCWhl YXBfaW5zZXJ0X2Zvcl9yZXBhY2sodHVwbGUsIE9sZEhlYXAsIE5ld0hlYXAsCgkJCQkJCQkJ CSAgIHZhbHVlcywgaXNudWxsLCBiaXN0YXRlKTsKCgkJCS8qIFJlcG9ydCBuX3R1cGxlcyAq LwoJCQlwZ3N0YXRfcHJvZ3Jlc3NfdXBkYXRlX3BhcmFtKFBST0dSRVNTX1JFUEFDS19IRUFQ X1RVUExFU19JTlNFUlRFRCwKCQkJCQkJCQkJCSBuX3R1cGxlcyk7CgkJfQoKCQl0dXBsZXNv cnRfZW5kKHR1cGxlc29ydCk7Cgl9CgoJLyogV3JpdGUgb3V0IGFueSByZW1haW5pbmcgdHVw bGVzLCBhbmQgZnN5bmMgaWYgbmVlZGVkICovCglpZiAocndzdGF0ZSkKCQllbmRfaGVhcF9y ZXdyaXRlKHJ3c3RhdGUpOwoJaWYgKGJpc3RhdGUpCgkJRnJlZUJ1bGtJbnNlcnRTdGF0ZShi aXN0YXRlKTsKCgkvKiBDbGVhbiB1cCAqLwoJcGZyZWUodmFsdWVzKTsKCXBmcmVlKGlzbnVs bCk7Cn0KCi8qCiAqIFByZXBhcmUgdG8gYW5hbHl6ZSB0aGUgbmV4dCBibG9jayBpbiB0aGUg cmVhZCBzdHJlYW0uICBSZXR1cm5zIGZhbHNlIGlmCiAqIHRoZSBzdHJlYW0gaXMgZXhoYXVz dGVkIGFuZCB0cnVlIG90aGVyd2lzZS4gVGhlIHNjYW4gbXVzdCBoYXZlIGJlZW4gc3RhcnRl ZAogKiB3aXRoIFNPX1RZUEVfQU5BTFlaRSBvcHRpb24uCiAqCiAqIFRoaXMgcm91dGluZSBo b2xkcyBhIGJ1ZmZlciBwaW4gYW5kIGxvY2sgb24gdGhlIGhlYXAgcGFnZS4gIFRoZXkgYXJl IGhlbGQKICogdW50aWwgaGVhcGFtX3NjYW5fYW5hbHl6ZV9uZXh0X3R1cGxlKCkgcmV0dXJu cyBmYWxzZS4gIFRoYXQgaXMgdW50aWwgYWxsIHRoZQogKiBpdGVtcyBvZiB0aGUgaGVhcCBw YWdlIGFyZSBhbmFseXplZC4KICovCnN0YXRpYyBib29sCmhlYXBhbV9zY2FuX2FuYWx5emVf bmV4dF9ibG9jayhUYWJsZVNjYW5EZXNjIHNjYW4sIFJlYWRTdHJlYW0gKnN0cmVhbSkKewoJ SGVhcFNjYW5EZXNjIGhzY2FuID0gKEhlYXBTY2FuRGVzYykgc2NhbjsKCgkvKgoJICogV2Ug bXVzdCBtYWludGFpbiBhIHBpbiBvbiB0aGUgdGFyZ2V0IHBhZ2UncyBidWZmZXIgdG8gZW5z dXJlIHRoYXQKCSAqIGNvbmN1cnJlbnQgYWN0aXZpdHkgLSBlLmcuIEhPVCBwcnVuaW5nIC0g ZG9lc24ndCBkZWxldGUgdHVwbGVzIG91dCBmcm9tCgkgKiB1bmRlciB1cy4gIEl0IGNvbWVz IGZyb20gdGhlIHN0cmVhbSBhbHJlYWR5IHBpbm5lZC4gICBXZSBhbHNvIGNob29zZSB0bwoJ ICogaG9sZCBzaGFyZWxvY2sgb24gdGhlIGJ1ZmZlciB0aHJvdWdob3V0IC0tLSB3ZSBjb3Vs ZCByZWxlYXNlIGFuZAoJICogcmUtYWNxdWlyZSBzaGFyZWxvY2sgZm9yIGVhY2ggdHVwbGUs IGJ1dCBzaW5jZSB3ZSBhcmVuJ3QgZG9pbmcgbXVjaAoJICogd29yayBwZXIgdHVwbGUsIHRo ZSBleHRyYSBsb2NrIHRyYWZmaWMgaXMgcHJvYmFibHkgYmV0dGVyIGF2b2lkZWQuCgkgKi8K CWhzY2FuLT5yc19jYnVmID0gcmVhZF9zdHJlYW1fbmV4dF9idWZmZXIoc3RyZWFtLCBOVUxM KTsKCWlmICghQnVmZmVySXNWYWxpZChoc2Nhbi0+cnNfY2J1ZikpCgkJcmV0dXJuIGZhbHNl OwoKCUxvY2tCdWZmZXIoaHNjYW4tPnJzX2NidWYsIEJVRkZFUl9MT0NLX1NIQVJFKTsKCglo c2Nhbi0+cnNfY2Jsb2NrID0gQnVmZmVyR2V0QmxvY2tOdW1iZXIoaHNjYW4tPnJzX2NidWYp OwoJaHNjYW4tPnJzX2NpbmRleCA9IEZpcnN0T2Zmc2V0TnVtYmVyOwoJcmV0dXJuIHRydWU7 Cn0KCnN0YXRpYyBib29sCmhlYXBhbV9zY2FuX2FuYWx5emVfbmV4dF90dXBsZShUYWJsZVNj YW5EZXNjIHNjYW4sCgkJCQkJCQkgICBkb3VibGUgKmxpdmVyb3dzLCBkb3VibGUgKmRlYWRy b3dzLAoJCQkJCQkJICAgVHVwbGVUYWJsZVNsb3QgKnNsb3QpCnsKCUhlYXBTY2FuRGVzYyBo c2NhbiA9IChIZWFwU2NhbkRlc2MpIHNjYW47CglQYWdlCQl0YXJncGFnZTsKCU9mZnNldE51 bWJlciBtYXhvZmZzZXQ7CglCdWZmZXJIZWFwVHVwbGVUYWJsZVNsb3QgKmhzbG90OwoKCUFz c2VydChUVFNfSVNfQlVGRkVSVFVQTEUoc2xvdCkpOwoKCWhzbG90ID0gKEJ1ZmZlckhlYXBU dXBsZVRhYmxlU2xvdCAqKSBzbG90OwoJdGFyZ3BhZ2UgPSBCdWZmZXJHZXRQYWdlKGhzY2Fu LT5yc19jYnVmKTsKCW1heG9mZnNldCA9IFBhZ2VHZXRNYXhPZmZzZXROdW1iZXIodGFyZ3Bh Z2UpOwoKCS8qIElubmVyIGxvb3Agb3ZlciBhbGwgdHVwbGVzIG9uIHRoZSBzZWxlY3RlZCBw YWdlICovCglmb3IgKDsgaHNjYW4tPnJzX2NpbmRleCA8PSBtYXhvZmZzZXQ7IGhzY2FuLT5y c19jaW5kZXgrKykKCXsKCQlJdGVtSWQJCWl0ZW1pZDsKCQlIZWFwVHVwbGUJdGFyZ3R1cGxl ID0gJmhzbG90LT5iYXNlLnR1cGRhdGE7CgkJYm9vbAkJc2FtcGxlX2l0ID0gZmFsc2U7CgkJ VHJhbnNhY3Rpb25JZCBkZWFkX2FmdGVyOwoKCQlpdGVtaWQgPSBQYWdlR2V0SXRlbUlkKHRh cmdwYWdlLCBoc2Nhbi0+cnNfY2luZGV4KTsKCgkJLyoKCQkgKiBXZSBpZ25vcmUgdW51c2Vk IGFuZCByZWRpcmVjdCBsaW5lIHBvaW50ZXJzLiAgREVBRCBsaW5lIHBvaW50ZXJzCgkJICog c2hvdWxkIGJlIGNvdW50ZWQgYXMgZGVhZCwgYmVjYXVzZSB3ZSBuZWVkIHZhY3V1bSB0byBy dW4gdG8gZ2V0IHJpZAoJCSAqIG9mIHRoZW0uICBOb3RlIHRoYXQgdGhpcyBydWxlIGFncmVl cyB3aXRoIHRoZSB3YXkgdGhhdAoJCSAqIGhlYXBfcGFnZV9wcnVuZV9hbmRfZnJlZXplKCkg Y291bnRzIHRoaW5ncy4KCQkgKi8KCQlpZiAoIUl0ZW1JZElzTm9ybWFsKGl0ZW1pZCkpCgkJ ewoJCQlpZiAoSXRlbUlkSXNEZWFkKGl0ZW1pZCkpCgkJCQkqZGVhZHJvd3MgKz0gMTsKCQkJ Y29udGludWU7CgkJfQoKCQlJdGVtUG9pbnRlclNldCgmdGFyZ3R1cGxlLT50X3NlbGYsIGhz Y2FuLT5yc19jYmxvY2ssIGhzY2FuLT5yc19jaW5kZXgpOwoKCQl0YXJndHVwbGUtPnRfdGFi bGVPaWQgPSBSZWxhdGlvbkdldFJlbGlkKHNjYW4tPnJzX3JkKTsKCQl0YXJndHVwbGUtPnRf ZGF0YSA9IChIZWFwVHVwbGVIZWFkZXIpIFBhZ2VHZXRJdGVtKHRhcmdwYWdlLCBpdGVtaWQp OwoJCXRhcmd0dXBsZS0+dF9sZW4gPSBJdGVtSWRHZXRMZW5ndGgoaXRlbWlkKTsKCgkJc3dp dGNoIChIZWFwVHVwbGVTYXRpc2ZpZXNWYWN1dW1Ib3Jpem9uKHRhcmd0dXBsZSwKCQkJCQkJ CQkJCQkJaHNjYW4tPnJzX2NidWYsCgkJCQkJCQkJCQkJCSZkZWFkX2FmdGVyKSkKCQl7CgkJ CWNhc2UgSEVBUFRVUExFX0xJVkU6CgkJCQlzYW1wbGVfaXQgPSB0cnVlOwoJCQkJKmxpdmVy b3dzICs9IDE7CgkJCQlicmVhazsKCgkJCWNhc2UgSEVBUFRVUExFX0RFQUQ6CgkJCWNhc2Ug SEVBUFRVUExFX1JFQ0VOVExZX0RFQUQ6CgkJCQkvKiBDb3VudCBkZWFkIGFuZCByZWNlbnRs eS1kZWFkIHJvd3MgKi8KCQkJCSpkZWFkcm93cyArPSAxOwoJCQkJYnJlYWs7CgoJCQljYXNl IEhFQVBUVVBMRV9JTlNFUlRfSU5fUFJPR1JFU1M6CgoJCQkJLyoKCQkJCSAqIEluc2VydC1p bi1wcm9ncmVzcyByb3dzIGFyZSBub3QgY291bnRlZC4gIFdlIGFzc3VtZSB0aGF0CgkJCQkg KiB3aGVuIHRoZSBpbnNlcnRpbmcgdHJhbnNhY3Rpb24gY29tbWl0cyBvciBhYm9ydHMsIGl0 IHdpbGwKCQkJCSAqIHNlbmQgYSBzdGF0cyBtZXNzYWdlIHRvIGluY3JlbWVudCB0aGUgcHJv cGVyIGNvdW50LiAgVGhpcwoJCQkJICogd29ya3MgcmlnaHQgb25seSBpZiB0aGF0IHRyYW5z YWN0aW9uIGVuZHMgYWZ0ZXIgd2UgZmluaXNoCgkJCQkgKiBhbmFseXppbmcgdGhlIHRhYmxl OyBpZiB0aGluZ3MgaGFwcGVuIGluIHRoZSBvdGhlciBvcmRlciwKCQkJCSAqIGl0cyBzdGF0 cyB1cGRhdGUgd2lsbCBiZSBvdmVyd3JpdHRlbiBieSBvdXJzLiAgSG93ZXZlciwgdGhlCgkJ CQkgKiBlcnJvciB3aWxsIGJlIGxhcmdlIG9ubHkgaWYgdGhlIG90aGVyIHRyYW5zYWN0aW9u IHJ1bnMgbG9uZwoJCQkJICogZW5vdWdoIHRvIGluc2VydCBtYW55IHR1cGxlcywgc28gYXNz dW1pbmcgaXQgd2lsbCBmaW5pc2gKCQkJCSAqIGFmdGVyIHVzIGlzIHRoZSBzYWZlciBvcHRp b24uCgkJCQkgKgoJCQkJICogQSBzcGVjaWFsIGNhc2UgaXMgdGhhdCB0aGUgaW5zZXJ0aW5n IHRyYW5zYWN0aW9uIG1pZ2h0IGJlCgkJCQkgKiBvdXIgb3duLiAgSW4gdGhpcyBjYXNlIHdl IHNob3VsZCBjb3VudCBhbmQgc2FtcGxlIHRoZSByb3csCgkJCQkgKiB0byBhY2NvbW1vZGF0 ZSB1c2VycyB3aG8gbG9hZCBhIHRhYmxlIGFuZCBhbmFseXplIGl0IGluIG9uZQoJCQkJICog dHJhbnNhY3Rpb24uICAocGdzdGF0X3JlcG9ydF9hbmFseXplIGhhcyB0byBhZGp1c3QgdGhl CgkJCQkgKiBudW1iZXJzIHdlIHJlcG9ydCB0byB0aGUgY3VtdWxhdGl2ZSBzdGF0cyBzeXN0 ZW0gdG8gbWFrZQoJCQkJICogdGhpcyBjb21lIG91dCByaWdodC4pCgkJCQkgKi8KCQkJCWlm IChUcmFuc2FjdGlvbklkSXNDdXJyZW50VHJhbnNhY3Rpb25JZChIZWFwVHVwbGVIZWFkZXJH ZXRYbWluKHRhcmd0dXBsZS0+dF9kYXRhKSkpCgkJCQl7CgkJCQkJc2FtcGxlX2l0ID0gdHJ1 ZTsKCQkJCQkqbGl2ZXJvd3MgKz0gMTsKCQkJCX0KCQkJCWJyZWFrOwoKCQkJY2FzZSBIRUFQ VFVQTEVfREVMRVRFX0lOX1BST0dSRVNTOgoKCQkJCS8qCgkJCQkgKiBXZSBjb3VudCBhbmQg c2FtcGxlIGRlbGV0ZS1pbi1wcm9ncmVzcyByb3dzIHRoZSBzYW1lIGFzCgkJCQkgKiBsaXZl IG9uZXMsIHNvIHRoYXQgdGhlIHN0YXRzIGNvdW50ZXJzIGNvbWUgb3V0IHJpZ2h0IGlmIHRo ZQoJCQkJICogZGVsZXRpbmcgdHJhbnNhY3Rpb24gY29tbWl0cyBhZnRlciB1cywgcGVyIHRo ZSBzYW1lCgkJCQkgKiByZWFzb25pbmcgZ2l2ZW4gYWJvdmUuCgkJCQkgKgoJCQkJICogSWYg dGhlIGRlbGV0ZSB3YXMgZG9uZSBieSBvdXIgb3duIHRyYW5zYWN0aW9uLCBob3dldmVyLCB3 ZQoJCQkJICogbXVzdCBjb3VudCB0aGUgcm93IGFzIGRlYWQgdG8gbWFrZSBwZ3N0YXRfcmVw b3J0X2FuYWx5emUncwoJCQkJICogc3RhdHMgYWRqdXN0bWVudHMgY29tZSBvdXQgcmlnaHQu ICAoTm90ZTogdGhpcyB3b3JrcyBvdXQKCQkJCSAqIHByb3Blcmx5IHdoZW4gdGhlIHJvdyB3 YXMgYm90aCBpbnNlcnRlZCBhbmQgZGVsZXRlZCBpbiBvdXIKCQkJCSAqIHhhY3QuKQoJCQkJ ICoKCQkJCSAqIFRoZSBuZXQgZWZmZWN0IG9mIHRoZXNlIGNob2ljZXMgaXMgdGhhdCB3ZSBh Y3QgYXMgdGhvdWdoIGFuCgkJCQkgKiBJTl9QUk9HUkVTUyB0cmFuc2FjdGlvbiBoYXNuJ3Qg aGFwcGVuZWQgeWV0LCBleGNlcHQgaWYgaXQKCQkJCSAqIGlzIG91ciBvd24gdHJhbnNhY3Rp b24sIHdoaWNoIHdlIGFzc3VtZSBoYXMgaGFwcGVuZWQuCgkJCQkgKgoJCQkJICogVGhpcyBh cHByb2FjaCBlbnN1cmVzIHRoYXQgd2UgYmVoYXZlIHNhbmVseSBpZiB3ZSBzZWUgYm90aAoJ CQkJICogdGhlIHByZS1pbWFnZSBhbmQgcG9zdC1pbWFnZSByb3dzIGZvciBhIHJvdyBiZWlu ZyB1cGRhdGVkCgkJCQkgKiBieSBhIGNvbmN1cnJlbnQgdHJhbnNhY3Rpb246IHdlIHdpbGwg c2FtcGxlIHRoZSBwcmUtaW1hZ2UKCQkJCSAqIGJ1dCBub3QgdGhlIHBvc3QtaW1hZ2UuICBX ZSBhbHNvIGdldCBzYW5lIHJlc3VsdHMgaWYgdGhlCgkJCQkgKiBjb25jdXJyZW50IHRyYW5z YWN0aW9uIG5ldmVyIGNvbW1pdHMuCgkJCQkgKi8KCQkJCWlmIChUcmFuc2FjdGlvbklkSXND dXJyZW50VHJhbnNhY3Rpb25JZChIZWFwVHVwbGVIZWFkZXJHZXRVcGRhdGVYaWQodGFyZ3R1 cGxlLT50X2RhdGEpKSkKCQkJCQkqZGVhZHJvd3MgKz0gMTsKCQkJCWVsc2UKCQkJCXsKCQkJ CQlzYW1wbGVfaXQgPSB0cnVlOwoJCQkJCSpsaXZlcm93cyArPSAxOwoJCQkJfQoJCQkJYnJl YWs7CgoJCQlkZWZhdWx0OgoJCQkJZWxvZyhFUlJPUiwgInVuZXhwZWN0ZWQgSGVhcFR1cGxl U2F0aXNmaWVzVmFjdXVtIHJlc3VsdCIpOwoJCQkJYnJlYWs7CgkJfQoKCQlpZiAoc2FtcGxl X2l0KQoJCXsKCQkJRXhlY1N0b3JlQnVmZmVySGVhcFR1cGxlKHRhcmd0dXBsZSwgc2xvdCwg aHNjYW4tPnJzX2NidWYpOwoJCQloc2Nhbi0+cnNfY2luZGV4Kys7CgoJCQkvKiBub3RlIHRo YXQgd2UgbGVhdmUgdGhlIGJ1ZmZlciBsb2NrZWQgaGVyZSEgKi8KCQkJcmV0dXJuIHRydWU7 CgkJfQoJfQoKCS8qIE5vdyByZWxlYXNlIHRoZSBsb2NrIGFuZCBwaW4gb24gdGhlIHBhZ2Ug Ki8KCVVubG9ja1JlbGVhc2VCdWZmZXIoaHNjYW4tPnJzX2NidWYpOwoJaHNjYW4tPnJzX2Ni dWYgPSBJbnZhbGlkQnVmZmVyOwoKCS8qIGFsc28gcHJldmVudCBvbGQgc2xvdCBjb250ZW50 cyBmcm9tIGhhdmluZyBwaW4gb24gcGFnZSAqLwoJRXhlY0NsZWFyVHVwbGUoc2xvdCk7CgoJ cmV0dXJuIGZhbHNlOwp9CgpzdGF0aWMgZG91YmxlCmhlYXBhbV9pbmRleF9idWlsZF9yYW5n ZV9zY2FuKFJlbGF0aW9uIGhlYXBSZWxhdGlvbiwKCQkJCQkJCSAgUmVsYXRpb24gaW5kZXhS ZWxhdGlvbiwKCQkJCQkJCSAgSW5kZXhJbmZvICppbmRleEluZm8sCgkJCQkJCQkgIGJvb2wg YWxsb3dfc3luYywKCQkJCQkJCSAgYm9vbCBhbnl2aXNpYmxlLAoJCQkJCQkJICBib29sIHBy b2dyZXNzLAoJCQkJCQkJICBCbG9ja051bWJlciBzdGFydF9ibG9ja25vLAoJCQkJCQkJICBC bG9ja051bWJlciBudW1ibG9ja3MsCgkJCQkJCQkgIEluZGV4QnVpbGRDYWxsYmFjayBjYWxs YmFjaywKCQkJCQkJCSAgdm9pZCAqY2FsbGJhY2tfc3RhdGUsCgkJCQkJCQkgIFRhYmxlU2Nh bkRlc2Mgc2NhbikKewoJSGVhcFNjYW5EZXNjIGhzY2FuOwoJYm9vbAkJaXNfc3lzdGVtX2Nh dGFsb2c7Cglib29sCQljaGVja2luZ191bmlxdWVuZXNzOwoJSGVhcFR1cGxlCWhlYXBUdXBs ZTsKCURhdHVtCQl2YWx1ZXNbSU5ERVhfTUFYX0tFWVNdOwoJYm9vbAkJaXNudWxsW0lOREVY X01BWF9LRVlTXTsKCWRvdWJsZQkJcmVsdHVwbGVzOwoJRXhwclN0YXRlICAqcHJlZGljYXRl RXhwYW5kOwoJVHVwbGVUYWJsZVNsb3QgKnNsb3Q7CglFU3RhdGUJICAgKmVzdGF0ZTsKCUV4 cHJDb250ZXh0ICplY29udGV4dDsKCVNuYXBzaG90CXNuYXBzaG90OwoJYm9vbAkJbmVlZF91 bnJlZ2lzdGVyX3NuYXBzaG90ID0gZmFsc2U7CglUcmFuc2FjdGlvbklkIE9sZGVzdFhtaW47 CglCbG9ja051bWJlciBwcmV2aW91c19ibGtubyA9IEludmFsaWRCbG9ja051bWJlcjsKCUJs b2NrTnVtYmVyIHJvb3RfYmxrbm8gPSBJbnZhbGlkQmxvY2tOdW1iZXI7CglPZmZzZXROdW1i ZXIgcm9vdF9vZmZzZXRzW01heEhlYXBUdXBsZXNQZXJQYWdlXTsKCgkvKgoJICogc2FuaXR5 IGNoZWNrcwoJICovCglBc3NlcnQoT2lkSXNWYWxpZChpbmRleFJlbGF0aW9uLT5yZF9yZWwt PnJlbGFtKSk7CgoJLyogUmVtZW1iZXIgaWYgaXQncyBhIHN5c3RlbSBjYXRhbG9nICovCglp c19zeXN0ZW1fY2F0YWxvZyA9IElzU3lzdGVtUmVsYXRpb24oaGVhcFJlbGF0aW9uKTsKCgkv KiBTZWUgd2hldGhlciB3ZSdyZSB2ZXJpZnlpbmcgdW5pcXVlbmVzcy9leGNsdXNpb24gcHJv cGVydGllcyAqLwoJY2hlY2tpbmdfdW5pcXVlbmVzcyA9IChpbmRleEluZm8tPmlpX1VuaXF1 ZSB8fAoJCQkJCQkgICBpbmRleEluZm8tPmlpX0V4Y2x1c2lvbk9wcyAhPSBOVUxMKTsKCgkv KgoJICogIkFueSB2aXNpYmxlIiBtb2RlIGlzIG5vdCBjb21wYXRpYmxlIHdpdGggdW5pcXVl bmVzcyBjaGVja3M7IG1ha2Ugc3VyZQoJICogb25seSBvbmUgb2YgdGhvc2UgaXMgcmVxdWVz dGVkLgoJICovCglBc3NlcnQoIShhbnl2aXNpYmxlICYmIGNoZWNraW5nX3VuaXF1ZW5lc3Mp KTsKCgkvKgoJICogTmVlZCBhbiBFU3RhdGUgZm9yIGV2YWx1YXRpb24gb2YgaW5kZXggZXhw cmVzc2lvbnMgYW5kIHBhcnRpYWwtaW5kZXgKCSAqIHByZWRpY2F0ZXMuICBBbHNvIGEgc2xv dCB0byBob2xkIHRoZSBjdXJyZW50IHR1cGxlLgoJICovCgllc3RhdGUgPSBDcmVhdGVFeGVj dXRvclN0YXRlKCk7CgllY29udGV4dCA9IEdldFBlclR1cGxlRXhwckNvbnRleHQoZXN0YXRl KTsKCXNsb3QgPSB0YWJsZV9zbG90X2NyZWF0ZShoZWFwUmVsYXRpb24sIE5VTEwpOwoKCS8q IEFycmFuZ2UgZm9yIGVjb250ZXh0J3Mgc2NhbiB0dXBsZSB0byBiZSB0aGUgdHVwbGUgdW5k ZXIgdGVzdCAqLwoJZWNvbnRleHQtPmVjeHRfc2NhbnR1cGxlID0gc2xvdDsKCgkvKiBTZXQg dXAgZXhlY3V0aW9uIHN0YXRlIGZvciBwcmVkaWNhdGUsIGlmIGFueS4gKi8KCXByZWRpY2F0 ZUV4cGFuZCA9IEV4ZWNQcmVwYXJlUXVhbChpbmRleEluZm8tPmlpX1ByZWRpY2F0ZUV4cGFu ZCwgZXN0YXRlKTsKCgkvKgoJICogUHJlcGFyZSBmb3Igc2NhbiBvZiB0aGUgYmFzZSByZWxh dGlvbi4gIEluIGEgbm9ybWFsIGluZGV4IGJ1aWxkLCB3ZSB1c2UKCSAqIFNuYXBzaG90QW55 IGJlY2F1c2Ugd2UgbXVzdCByZXRyaWV2ZSBhbGwgdHVwbGVzIGFuZCBkbyBvdXIgb3duIHRp bWUKCSAqIHF1YWwgY2hlY2tzIChiZWNhdXNlIHdlIGhhdmUgdG8gaW5kZXggUkVDRU5UTFlf REVBRCB0dXBsZXMpLiBJbiBhCgkgKiBjb25jdXJyZW50IGJ1aWxkLCBvciBkdXJpbmcgYm9v dHN0cmFwLCB3ZSB0YWtlIGEgcmVndWxhciBNVkNDIHNuYXBzaG90CgkgKiBhbmQgaW5kZXgg d2hhdGV2ZXIncyBsaXZlIGFjY29yZGluZyB0byB0aGF0LgoJICovCglPbGRlc3RYbWluID0g SW52YWxpZFRyYW5zYWN0aW9uSWQ7CgoJLyogb2theSB0byBpZ25vcmUgbGF6eSBWQUNVVU1z IGhlcmUgKi8KCWlmICghSXNCb290c3RyYXBQcm9jZXNzaW5nTW9kZSgpICYmICFpbmRleElu Zm8tPmlpX0NvbmN1cnJlbnQpCgkJT2xkZXN0WG1pbiA9IEdldE9sZGVzdE5vblJlbW92YWJs ZVRyYW5zYWN0aW9uSWQoaGVhcFJlbGF0aW9uKTsKCglpZiAoIXNjYW4pCgl7CgkJLyoKCQkg KiBTZXJpYWwgaW5kZXggYnVpbGQuCgkJICoKCQkgKiBNdXN0IGJlZ2luIG91ciBvd24gaGVh cCBzY2FuIGluIHRoaXMgY2FzZS4gIFdlIG1heSBhbHNvIG5lZWQgdG8KCQkgKiByZWdpc3Rl ciBhIHNuYXBzaG90IHdob3NlIGxpZmV0aW1lIGlzIHVuZGVyIG91ciBkaXJlY3QgY29udHJv bC4KCQkgKi8KCQlpZiAoIVRyYW5zYWN0aW9uSWRJc1ZhbGlkKE9sZGVzdFhtaW4pKQoJCXsK CQkJc25hcHNob3QgPSBSZWdpc3RlclNuYXBzaG90KEdldFRyYW5zYWN0aW9uU25hcHNob3Qo KSk7CgkJCW5lZWRfdW5yZWdpc3Rlcl9zbmFwc2hvdCA9IHRydWU7CgkJfQoJCWVsc2UKCQkJ c25hcHNob3QgPSBTbmFwc2hvdEFueTsKCgkJc2NhbiA9IHRhYmxlX2JlZ2luc2Nhbl9zdHJh dChoZWFwUmVsYXRpb24sCS8qIHJlbGF0aW9uICovCgkJCQkJCQkJCSBzbmFwc2hvdCwJLyog c25hcHNob3QgKi8KCQkJCQkJCQkJIDAsIC8qIG51bWJlciBvZiBrZXlzICovCgkJCQkJCQkJ CSBOVUxMLAkvKiBzY2FuIGtleSAqLwoJCQkJCQkJCQkgdHJ1ZSwJLyogYnVmZmVyIGFjY2Vz cyBzdHJhdGVneSBPSyAqLwoJCQkJCQkJCQkgYWxsb3dfc3luYyk7CS8qIHN5bmNzY2FuIE9L PyAqLwoJfQoJZWxzZQoJewoJCS8qCgkJICogUGFyYWxsZWwgaW5kZXggYnVpbGQuCgkJICoK CQkgKiBQYXJhbGxlbCBjYXNlIG5ldmVyIHJlZ2lzdGVycy91bnJlZ2lzdGVycyBvd24gc25h cHNob3QuICBTbmFwc2hvdAoJCSAqIGlzIHRha2VuIGZyb20gcGFyYWxsZWwgaGVhcCBzY2Fu LCBhbmQgaXMgU25hcHNob3RBbnkgb3IgYW4gTVZDQwoJCSAqIHNuYXBzaG90LCBiYXNlZCBv biBzYW1lIGNyaXRlcmlhIGFzIHNlcmlhbCBjYXNlLgoJCSAqLwoJCUFzc2VydCghSXNCb290 c3RyYXBQcm9jZXNzaW5nTW9kZSgpKTsKCQlBc3NlcnQoYWxsb3dfc3luYyk7CgkJc25hcHNo b3QgPSBzY2FuLT5yc19zbmFwc2hvdDsKCX0KCgloc2NhbiA9IChIZWFwU2NhbkRlc2MpIHNj YW47CgoJLyoKCSAqIE11c3QgaGF2ZSBjYWxsZWQgR2V0T2xkZXN0Tm9uUmVtb3ZhYmxlVHJh bnNhY3Rpb25JZCgpIGlmIHVzaW5nCgkgKiBTbmFwc2hvdEFueS4gIFNob3VsZG4ndCBoYXZl IGZvciBhbiBNVkNDIHNuYXBzaG90LiAoSXQncyBlc3BlY2lhbGx5CgkgKiB3b3J0aCBjaGVj a2luZyB0aGlzIGZvciBwYXJhbGxlbCBidWlsZHMsIHNpbmNlIGFtYnVpbGQgcm91dGluZXMg dGhhdAoJICogc3VwcG9ydCBwYXJhbGxlbCBidWlsZHMgbXVzdCB3b3JrIHRoZXNlIGRldGFp bHMgb3V0IGZvciB0aGVtc2VsdmVzLikKCSAqLwoJQXNzZXJ0KHNuYXBzaG90ID09IFNuYXBz aG90QW55IHx8IElzTVZDQ1NuYXBzaG90KHNuYXBzaG90KSk7CglBc3NlcnQoc25hcHNob3Qg PT0gU25hcHNob3RBbnkgPyBUcmFuc2FjdGlvbklkSXNWYWxpZChPbGRlc3RYbWluKSA6CgkJ ICAgIVRyYW5zYWN0aW9uSWRJc1ZhbGlkKE9sZGVzdFhtaW4pKTsKCUFzc2VydChzbmFwc2hv dCA9PSBTbmFwc2hvdEFueSB8fCAhYW55dmlzaWJsZSk7CgoJLyogUHVibGlzaCBudW1iZXIg b2YgYmxvY2tzIHRvIHNjYW4gKi8KCWlmIChwcm9ncmVzcykKCXsKCQlCbG9ja051bWJlciBu YmxvY2tzOwoKCQlpZiAoaHNjYW4tPnJzX2Jhc2UucnNfcGFyYWxsZWwgIT0gTlVMTCkKCQl7 CgkJCVBhcmFsbGVsQmxvY2tUYWJsZVNjYW5EZXNjIHBic2NhbjsKCgkJCXBic2NhbiA9IChQ YXJhbGxlbEJsb2NrVGFibGVTY2FuRGVzYykgaHNjYW4tPnJzX2Jhc2UucnNfcGFyYWxsZWw7 CgkJCW5ibG9ja3MgPSBwYnNjYW4tPnBoc19uYmxvY2tzOwoJCX0KCQllbHNlCgkJCW5ibG9j a3MgPSBoc2Nhbi0+cnNfbmJsb2NrczsKCgkJcGdzdGF0X3Byb2dyZXNzX3VwZGF0ZV9wYXJh bShQUk9HUkVTU19TQ0FOX0JMT0NLU19UT1RBTCwKCQkJCQkJCQkJIG5ibG9ja3MpOwoJfQoK CS8qIHNldCBvdXIgc2NhbiBlbmRwb2ludHMgKi8KCWlmICghYWxsb3dfc3luYykKCQloZWFw X3NldHNjYW5saW1pdHMoc2Nhbiwgc3RhcnRfYmxvY2tubywgbnVtYmxvY2tzKTsKCWVsc2UK CXsKCQkvKiBzeW5jc2NhbiBjYW4gb25seSBiZSByZXF1ZXN0ZWQgb24gd2hvbGUgcmVsYXRp b24gKi8KCQlBc3NlcnQoc3RhcnRfYmxvY2tubyA9PSAwKTsKCQlBc3NlcnQobnVtYmxvY2tz ID09IEludmFsaWRCbG9ja051bWJlcik7Cgl9CgoJcmVsdHVwbGVzID0gMDsKCgkvKgoJICog U2NhbiBhbGwgdHVwbGVzIGluIHRoZSBiYXNlIHJlbGF0aW9uLgoJICovCgl3aGlsZSAoKGhl YXBUdXBsZSA9IGhlYXBfZ2V0bmV4dChzY2FuLCBGb3J3YXJkU2NhbkRpcmVjdGlvbikpICE9 IE5VTEwpCgl7CgkJYm9vbAkJdHVwbGVJc0FsaXZlOwoKCQlDSEVDS19GT1JfSU5URVJSVVBU UygpOwoKCQkvKiBSZXBvcnQgc2NhbiBwcm9ncmVzcywgaWYgYXNrZWQgdG8uICovCgkJaWYg KHByb2dyZXNzKQoJCXsKCQkJQmxvY2tOdW1iZXIgYmxvY2tzX2RvbmUgPSBoZWFwYW1fc2Nh bl9nZXRfYmxvY2tzX2RvbmUoaHNjYW4pOwoKCQkJaWYgKGJsb2Nrc19kb25lICE9IHByZXZp b3VzX2Jsa25vKQoJCQl7CgkJCQlwZ3N0YXRfcHJvZ3Jlc3NfdXBkYXRlX3BhcmFtKFBST0dS RVNTX1NDQU5fQkxPQ0tTX0RPTkUsCgkJCQkJCQkJCQkJIGJsb2Nrc19kb25lKTsKCQkJCXBy ZXZpb3VzX2Jsa25vID0gYmxvY2tzX2RvbmU7CgkJCX0KCQl9CgoJCS8qCgkJICogV2hlbiBk ZWFsaW5nIHdpdGggYSBIT1QtY2hhaW4gb2YgdXBkYXRlZCB0dXBsZXMsIHdlIHdhbnQgdG8g aW5kZXgKCQkgKiB0aGUgdmFsdWVzIG9mIHRoZSBsaXZlIHR1cGxlIChpZiBhbnkpLCBidXQg aW5kZXggaXQgdW5kZXIgdGhlIFRJRAoJCSAqIG9mIHRoZSBjaGFpbidzIHJvb3QgdHVwbGUu ICBUaGlzIGFwcHJvYWNoIGlzIG5lY2Vzc2FyeSB0byBwcmVzZXJ2ZQoJCSAqIHRoZSBIT1Qt Y2hhaW4gc3RydWN0dXJlIGluIHRoZSBoZWFwLiBTbyB3ZSBuZWVkIHRvIGJlIGFibGUgdG8g ZmluZAoJCSAqIHRoZSByb290IGl0ZW0gb2Zmc2V0IGZvciBldmVyeSB0dXBsZSB0aGF0J3Mg aW4gYSBIT1QtY2hhaW4uICBXaGVuCgkJICogZmlyc3QgcmVhY2hpbmcgYSBuZXcgcGFnZSBv ZiB0aGUgcmVsYXRpb24sIGNhbGwKCQkgKiBoZWFwX2dldF9yb290X3R1cGxlcygpIHRvIGJ1 aWxkIGEgbWFwIG9mIHJvb3QgaXRlbSBvZmZzZXRzIG9uIHRoZQoJCSAqIHBhZ2UuCgkJICoK CQkgKiBJdCBtaWdodCBsb29rIHVuc2FmZSB0byB1c2UgdGhpcyBpbmZvcm1hdGlvbiBhY3Jv c3MgYnVmZmVyCgkJICogbG9jay91bmxvY2suICBIb3dldmVyLCB3ZSBob2xkIFNoYXJlTG9j ayBvbiB0aGUgdGFibGUgc28gbm8KCQkgKiBvcmRpbmFyeSBpbnNlcnQvdXBkYXRlL2RlbGV0 ZSBzaG91bGQgb2NjdXI7IGFuZCB3ZSBob2xkIHBpbiBvbiB0aGUKCQkgKiBidWZmZXIgY29u dGludW91c2x5IHdoaWxlIHZpc2l0aW5nIHRoZSBwYWdlLCBzbyBubyBwcnVuaW5nCgkJICog b3BlcmF0aW9uIGNhbiBvY2N1ciBlaXRoZXIuCgkJICoKCQkgKiBJbiBjYXNlcyB3aXRoIG9u bHkgU2hhcmVVcGRhdGVFeGNsdXNpdmVMb2NrIG9uIHRoZSB0YWJsZSwgaXQncwoJCSAqIHBv c3NpYmxlIGZvciBzb21lIEhPVCB0dXBsZXMgdG8gYXBwZWFyIHRoYXQgd2UgZGlkbid0IGtu b3cgYWJvdXQKCQkgKiB3aGVuIHdlIGZpcnN0IHJlYWQgdGhlIHBhZ2UuICBUbyBoYW5kbGUg dGhhdCBjYXNlLCB3ZSByZS1vYnRhaW4gdGhlCgkJICogbGlzdCBvZiByb290IG9mZnNldHMg d2hlbiBhIEhPVCB0dXBsZSBwb2ludHMgdG8gYSByb290IGl0ZW0gdGhhdCB3ZQoJCSAqIGRv bid0IGtub3cgYWJvdXQuCgkJICoKCQkgKiBBbHNvLCBhbHRob3VnaCBvdXIgb3BpbmlvbnMg YWJvdXQgdHVwbGUgbGl2ZW5lc3MgY291bGQgY2hhbmdlIHdoaWxlCgkJICogd2Ugc2NhbiB0 aGUgcGFnZSAoZHVlIHRvIGNvbmN1cnJlbnQgdHJhbnNhY3Rpb24gY29tbWl0cy9hYm9ydHMp LAoJCSAqIHRoZSBjaGFpbiByb290IGxvY2F0aW9ucyB3b24ndCwgc28gdGhpcyBpbmZvIGRv ZXNuJ3QgbmVlZCB0byBiZQoJCSAqIHJlYnVpbHQgYWZ0ZXIgd2FpdGluZyBmb3IgYW5vdGhl ciB0cmFuc2FjdGlvbi4KCQkgKgoJCSAqIE5vdGUgdGhlIGltcGxpZWQgYXNzdW1wdGlvbiB0 aGF0IHRoZXJlIGlzIG5vIG1vcmUgdGhhbiBvbmUgbGl2ZQoJCSAqIHR1cGxlIHBlciBIT1Qt Y2hhaW4gLS0tIGVsc2Ugd2UgY291bGQgY3JlYXRlIG1vcmUgdGhhbiBvbmUgaW5kZXgKCQkg KiBlbnRyeSBwb2ludGluZyB0byB0aGUgc2FtZSByb290IHR1cGxlLgoJCSAqLwoJCWlmICho c2Nhbi0+cnNfY2Jsb2NrICE9IHJvb3RfYmxrbm8pCgkJewoJCQlQYWdlCQlwYWdlID0gQnVm ZmVyR2V0UGFnZShoc2Nhbi0+cnNfY2J1Zik7CgoJCQlMb2NrQnVmZmVyKGhzY2FuLT5yc19j YnVmLCBCVUZGRVJfTE9DS19TSEFSRSk7CgkJCWhlYXBfZ2V0X3Jvb3RfdHVwbGVzKHBhZ2Us IHJvb3Rfb2Zmc2V0cyk7CgkJCUxvY2tCdWZmZXIoaHNjYW4tPnJzX2NidWYsIEJVRkZFUl9M T0NLX1VOTE9DSyk7CgoJCQlyb290X2Jsa25vID0gaHNjYW4tPnJzX2NibG9jazsKCQl9CgoJ CWlmIChzbmFwc2hvdCA9PSBTbmFwc2hvdEFueSkKCQl7CgkJCS8qIGRvIG91ciBvd24gdGlt ZSBxdWFsIGNoZWNrICovCgkJCWJvb2wJCWluZGV4SXQ7CgkJCVRyYW5zYWN0aW9uSWQgeHdh aXQ7CgoJcmVjaGVjazoKCgkJCS8qCgkJCSAqIFdlIGNvdWxkIHBvc3NpYmx5IGdldCBhd2F5 IHdpdGggbm90IGxvY2tpbmcgdGhlIGJ1ZmZlciBoZXJlLAoJCQkgKiBzaW5jZSBjYWxsZXIg c2hvdWxkIGhvbGQgU2hhcmVMb2NrIG9uIHRoZSByZWxhdGlvbiwgYnV0IGxldCdzCgkJCSAq IGJlIGNvbnNlcnZhdGl2ZSBhYm91dCBpdC4gIChUaGlzIHJlbWFyayBpcyBzdGlsbCBjb3Jy ZWN0IGV2ZW4KCQkJICogd2l0aCBIT1QtcHJ1bmluZzogb3VyIHBpbiBvbiB0aGUgYnVmZmVy IHByZXZlbnRzIHBydW5pbmcuKQoJCQkgKi8KCQkJTG9ja0J1ZmZlcihoc2Nhbi0+cnNfY2J1 ZiwgQlVGRkVSX0xPQ0tfU0hBUkUpOwoKCQkJLyoKCQkJICogVGhlIGNyaXRlcmlhIGZvciBj b3VudGluZyBhIHR1cGxlIGFzIGxpdmUgaW4gdGhpcyBibG9jayBuZWVkIHRvCgkJCSAqIG1h dGNoIHdoYXQgYW5hbHl6ZS5jJ3MgaGVhcGFtX3NjYW5fYW5hbHl6ZV9uZXh0X3R1cGxlKCkg ZG9lcywKCQkJICogb3RoZXJ3aXNlIENSRUFURSBJTkRFWCBhbmQgQU5BTFlaRSBtYXkgcHJv ZHVjZSB3aWxkbHkgZGlmZmVyZW50CgkJCSAqIHJlbHR1cGxlcyB2YWx1ZXMsIGUuZy4gd2hl biB0aGVyZSBhcmUgbWFueSByZWNlbnRseS1kZWFkCgkJCSAqIHR1cGxlcy4KCQkJICovCgkJ CXN3aXRjaCAoSGVhcFR1cGxlU2F0aXNmaWVzVmFjdXVtKGhlYXBUdXBsZSwgT2xkZXN0WG1p biwKCQkJCQkJCQkJCQkgaHNjYW4tPnJzX2NidWYpKQoJCQl7CgkJCQljYXNlIEhFQVBUVVBM RV9ERUFEOgoJCQkJCS8qIERlZmluaXRlbHkgZGVhZCwgd2UgY2FuIGlnbm9yZSBpdCAqLwoJ CQkJCWluZGV4SXQgPSBmYWxzZTsKCQkJCQl0dXBsZUlzQWxpdmUgPSBmYWxzZTsKCQkJCQli cmVhazsKCQkJCWNhc2UgSEVBUFRVUExFX0xJVkU6CgkJCQkJLyogTm9ybWFsIGNhc2UsIGlu ZGV4IGFuZCB1bmlxdWUtY2hlY2sgaXQgKi8KCQkJCQlpbmRleEl0ID0gdHJ1ZTsKCQkJCQl0 dXBsZUlzQWxpdmUgPSB0cnVlOwoJCQkJCS8qIENvdW50IGl0IGFzIGxpdmUsIHRvbyAqLwoJ CQkJCXJlbHR1cGxlcyArPSAxOwoJCQkJCWJyZWFrOwoJCQkJY2FzZSBIRUFQVFVQTEVfUkVD RU5UTFlfREVBRDoKCgkJCQkJLyoKCQkJCQkgKiBJZiB0dXBsZSBpcyByZWNlbnRseSBkZWxl dGVkIHRoZW4gd2UgbXVzdCBpbmRleCBpdAoJCQkJCSAqIGFueXdheSB0byBwcmVzZXJ2ZSBN VkNDIHNlbWFudGljcy4gIChQcmUtZXhpc3RpbmcKCQkJCQkgKiB0cmFuc2FjdGlvbnMgY291 bGQgdHJ5IHRvIHVzZSB0aGUgaW5kZXggYWZ0ZXIgd2UgZmluaXNoCgkJCQkJICogYnVpbGRp bmcgaXQsIGFuZCBtYXkgbmVlZCB0byBzZWUgc3VjaCB0dXBsZXMuKQoJCQkJCSAqCgkJCQkJ ICogSG93ZXZlciwgaWYgaXQgd2FzIEhPVC11cGRhdGVkIHRoZW4gd2UgbXVzdCBvbmx5IGlu ZGV4CgkJCQkJICogdGhlIGxpdmUgdHVwbGUgYXQgdGhlIGVuZCBvZiB0aGUgSE9ULWNoYWlu LiAgU2luY2UgdGhpcwoJCQkJCSAqIGJyZWFrcyBzZW1hbnRpY3MgZm9yIHByZS1leGlzdGlu ZyBzbmFwc2hvdHMsIG1hcmsgdGhlCgkJCQkJICogaW5kZXggYXMgdW51c2FibGUgZm9yIHRo ZW0uCgkJCQkJICoKCQkJCQkgKiBXZSBkb24ndCBjb3VudCByZWNlbnRseS1kZWFkIHR1cGxl cyBpbiByZWx0dXBsZXMsIGV2ZW4KCQkJCQkgKiBpZiB3ZSBpbmRleCB0aGVtOyBzZWUgaGVh cGFtX3NjYW5fYW5hbHl6ZV9uZXh0X3R1cGxlKCkuCgkJCQkJICovCgkJCQkJaWYgKEhlYXBU dXBsZUlzSG90VXBkYXRlZChoZWFwVHVwbGUpKQoJCQkJCXsKCQkJCQkJaW5kZXhJdCA9IGZh bHNlOwoJCQkJCQkvKiBtYXJrIHRoZSBpbmRleCBhcyB1bnNhZmUgZm9yIG9sZCBzbmFwc2hv dHMgKi8KCQkJCQkJaW5kZXhJbmZvLT5paV9Ccm9rZW5Ib3RDaGFpbiA9IHRydWU7CgkJCQkJ fQoJCQkJCWVsc2UKCQkJCQkJaW5kZXhJdCA9IHRydWU7CgkJCQkJLyogSW4gYW55IGNhc2Us IGV4Y2x1ZGUgdGhlIHR1cGxlIGZyb20gdW5pcXVlLWNoZWNraW5nICovCgkJCQkJdHVwbGVJ c0FsaXZlID0gZmFsc2U7CgkJCQkJYnJlYWs7CgkJCQljYXNlIEhFQVBUVVBMRV9JTlNFUlRf SU5fUFJPR1JFU1M6CgoJCQkJCS8qCgkJCQkJICogSW4gImFueXZpc2libGUiIG1vZGUsIHRo aXMgdHVwbGUgaXMgdmlzaWJsZSBhbmQgd2UKCQkJCQkgKiBkb24ndCBuZWVkIGFueSBmdXJ0 aGVyIGNoZWNrcy4KCQkJCQkgKi8KCQkJCQlpZiAoYW55dmlzaWJsZSkKCQkJCQl7CgkJCQkJ CWluZGV4SXQgPSB0cnVlOwoJCQkJCQl0dXBsZUlzQWxpdmUgPSB0cnVlOwoJCQkJCQlyZWx0 dXBsZXMgKz0gMTsKCQkJCQkJYnJlYWs7CgkJCQkJfQoKCQkJCQkvKgoJCQkJCSAqIFNpbmNl IGNhbGxlciBzaG91bGQgaG9sZCBTaGFyZUxvY2sgb3IgYmV0dGVyLCBub3JtYWxseQoJCQkJ CSAqIHRoZSBvbmx5IHdheSB0byBzZWUgdGhpcyBpcyBpZiBpdCB3YXMgaW5zZXJ0ZWQgZWFy bGllcgoJCQkJCSAqIGluIG91ciBvd24gdHJhbnNhY3Rpb24uICBIb3dldmVyLCBpdCBjYW4g aGFwcGVuIGluCgkJCQkJICogc3lzdGVtIGNhdGFsb2dzLCBzaW5jZSB3ZSB0ZW5kIHRvIHJl bGVhc2Ugd3JpdGUgbG9jawoJCQkJCSAqIGJlZm9yZSBjb21taXQgdGhlcmUuICBHaXZlIGEg d2FybmluZyBpZiBuZWl0aGVyIGNhc2UKCQkJCQkgKiBhcHBsaWVzLgoJCQkJCSAqLwoJCQkJ CXh3YWl0ID0gSGVhcFR1cGxlSGVhZGVyR2V0WG1pbihoZWFwVHVwbGUtPnRfZGF0YSk7CgkJ CQkJaWYgKCFUcmFuc2FjdGlvbklkSXNDdXJyZW50VHJhbnNhY3Rpb25JZCh4d2FpdCkpCgkJ CQkJewoJCQkJCQlpZiAoIWlzX3N5c3RlbV9jYXRhbG9nKQoJCQkJCQkJZWxvZyhXQVJOSU5H LCAiY29uY3VycmVudCBpbnNlcnQgaW4gcHJvZ3Jlc3Mgd2l0aGluIHRhYmxlIFwiJXNcIiIs CgkJCQkJCQkJIFJlbGF0aW9uR2V0UmVsYXRpb25OYW1lKGhlYXBSZWxhdGlvbikpOwoKCQkJ CQkJLyoKCQkJCQkJICogSWYgd2UgYXJlIHBlcmZvcm1pbmcgdW5pcXVlbmVzcyBjaGVja3Ms IGluZGV4aW5nCgkJCQkJCSAqIHN1Y2ggYSB0dXBsZSBjb3VsZCBsZWFkIHRvIGEgYm9ndXMg dW5pcXVlbmVzcwoJCQkJCQkgKiBmYWlsdXJlLiAgSW4gdGhhdCBjYXNlIHdlIHdhaXQgZm9y IHRoZSBpbnNlcnRpbmcKCQkJCQkJICogdHJhbnNhY3Rpb24gdG8gZmluaXNoIGFuZCBjaGVj ayBhZ2Fpbi4KCQkJCQkJICovCgkJCQkJCWlmIChjaGVja2luZ191bmlxdWVuZXNzKQoJCQkJ CQl7CgkJCQkJCQkvKgoJCQkJCQkJICogTXVzdCBkcm9wIHRoZSBsb2NrIG9uIHRoZSBidWZm ZXIgYmVmb3JlIHdlIHdhaXQKCQkJCQkJCSAqLwoJCQkJCQkJTG9ja0J1ZmZlcihoc2Nhbi0+ cnNfY2J1ZiwgQlVGRkVSX0xPQ0tfVU5MT0NLKTsKCQkJCQkJCVhhY3RMb2NrVGFibGVXYWl0 KHh3YWl0LCBoZWFwUmVsYXRpb24sCgkJCQkJCQkJCQkJICAmaGVhcFR1cGxlLT50X3NlbGYs CgkJCQkJCQkJCQkJICBYTFRXX0luc2VydEluZGV4VW5pcXVlKTsKCQkJCQkJCUNIRUNLX0ZP Ul9JTlRFUlJVUFRTKCk7CgkJCQkJCQlnb3RvIHJlY2hlY2s7CgkJCQkJCX0KCQkJCQl9CgkJ CQkJZWxzZQoJCQkJCXsKCQkJCQkJLyoKCQkJCQkJICogRm9yIGNvbnNpc3RlbmN5IHdpdGgK CQkJCQkJICogaGVhcGFtX3NjYW5fYW5hbHl6ZV9uZXh0X3R1cGxlKCksIGNvdW50CgkJCQkJ CSAqIEhFQVBUVVBMRV9JTlNFUlRfSU5fUFJPR1JFU1MgdHVwbGVzIGFzIGxpdmUgb25seQoJ CQkJCQkgKiB3aGVuIGluc2VydGVkIGJ5IG91ciBvd24gdHJhbnNhY3Rpb24uCgkJCQkJCSAq LwoJCQkJCQlyZWx0dXBsZXMgKz0gMTsKCQkJCQl9CgoJCQkJCS8qCgkJCQkJICogV2UgbXVz dCBpbmRleCBzdWNoIHR1cGxlcywgc2luY2UgaWYgdGhlIGluZGV4IGJ1aWxkCgkJCQkJICog Y29tbWl0cyB0aGVuIHRoZXkncmUgZ29vZC4KCQkJCQkgKi8KCQkJCQlpbmRleEl0ID0gdHJ1 ZTsKCQkJCQl0dXBsZUlzQWxpdmUgPSB0cnVlOwoJCQkJCWJyZWFrOwoJCQkJY2FzZSBIRUFQ VFVQTEVfREVMRVRFX0lOX1BST0dSRVNTOgoKCQkJCQkvKgoJCQkJCSAqIEFzIHdpdGggSU5T RVJUX0lOX1BST0dSRVNTIGNhc2UsIHRoaXMgaXMgdW5leHBlY3RlZAoJCQkJCSAqIHVubGVz cyBpdCdzIG91ciBvd24gZGVsZXRpb24gb3IgYSBzeXN0ZW0gY2F0YWxvZzsgYnV0CgkJCQkJ ICogaW4gYW55dmlzaWJsZSBtb2RlLCB0aGlzIHR1cGxlIGlzIHZpc2libGUuCgkJCQkJICov CgkJCQkJaWYgKGFueXZpc2libGUpCgkJCQkJewoJCQkJCQlpbmRleEl0ID0gdHJ1ZTsKCQkJ CQkJdHVwbGVJc0FsaXZlID0gZmFsc2U7CgkJCQkJCXJlbHR1cGxlcyArPSAxOwoJCQkJCQli cmVhazsKCQkJCQl9CgoJCQkJCXh3YWl0ID0gSGVhcFR1cGxlSGVhZGVyR2V0VXBkYXRlWGlk KGhlYXBUdXBsZS0+dF9kYXRhKTsKCQkJCQlpZiAoIVRyYW5zYWN0aW9uSWRJc0N1cnJlbnRU cmFuc2FjdGlvbklkKHh3YWl0KSkKCQkJCQl7CgkJCQkJCWlmICghaXNfc3lzdGVtX2NhdGFs b2cpCgkJCQkJCQllbG9nKFdBUk5JTkcsICJjb25jdXJyZW50IGRlbGV0ZSBpbiBwcm9ncmVz cyB3aXRoaW4gdGFibGUgXCIlc1wiIiwKCQkJCQkJCQkgUmVsYXRpb25HZXRSZWxhdGlvbk5h bWUoaGVhcFJlbGF0aW9uKSk7CgoJCQkJCQkvKgoJCQkJCQkgKiBJZiB3ZSBhcmUgcGVyZm9y bWluZyB1bmlxdWVuZXNzIGNoZWNrcywgYXNzdW1pbmcKCQkJCQkJICogdGhlIHR1cGxlIGlz IGRlYWQgY291bGQgbGVhZCB0byBtaXNzaW5nIGEKCQkJCQkJICogdW5pcXVlbmVzcyB2aW9s YXRpb24uICBJbiB0aGF0IGNhc2Ugd2Ugd2FpdCBmb3IgdGhlCgkJCQkJCSAqIGRlbGV0aW5n IHRyYW5zYWN0aW9uIHRvIGZpbmlzaCBhbmQgY2hlY2sgYWdhaW4uCgkJCQkJCSAqCgkJCQkJ CSAqIEFsc28sIGlmIGl0J3MgYSBIT1QtdXBkYXRlZCB0dXBsZSwgd2Ugc2hvdWxkIG5vdAoJ CQkJCQkgKiBpbmRleCBpdCBidXQgcmF0aGVyIHRoZSBsaXZlIHR1cGxlIGF0IHRoZSBlbmQg b2YKCQkJCQkJICogdGhlIEhPVC1jaGFpbi4gIEhvd2V2ZXIsIHRoZSBkZWxldGluZyB0cmFu c2FjdGlvbgoJCQkJCQkgKiBjb3VsZCBhYm9ydCwgcG9zc2libHkgbGVhdmluZyB0aGlzIHR1 cGxlIGFzIGxpdmUKCQkJCQkJICogYWZ0ZXIgYWxsLCBpbiB3aGljaCBjYXNlIGl0IGhhcyB0 byBiZSBpbmRleGVkLiBUaGUKCQkJCQkJICogb25seSB3YXkgdG8ga25vdyB3aGF0IHRvIGRv IGlzIHRvIHdhaXQgZm9yIHRoZQoJCQkJCQkgKiBkZWxldGluZyB0cmFuc2FjdGlvbiB0byBm aW5pc2ggYW5kIGNoZWNrIGFnYWluLgoJCQkJCQkgKi8KCQkJCQkJaWYgKGNoZWNraW5nX3Vu aXF1ZW5lc3MgfHwKCQkJCQkJCUhlYXBUdXBsZUlzSG90VXBkYXRlZChoZWFwVHVwbGUpKQoJ CQkJCQl7CgkJCQkJCQkvKgoJCQkJCQkJICogTXVzdCBkcm9wIHRoZSBsb2NrIG9uIHRoZSBi dWZmZXIgYmVmb3JlIHdlIHdhaXQKCQkJCQkJCSAqLwoJCQkJCQkJTG9ja0J1ZmZlcihoc2Nh bi0+cnNfY2J1ZiwgQlVGRkVSX0xPQ0tfVU5MT0NLKTsKCQkJCQkJCVhhY3RMb2NrVGFibGVX YWl0KHh3YWl0LCBoZWFwUmVsYXRpb24sCgkJCQkJCQkJCQkJICAmaGVhcFR1cGxlLT50X3Nl bGYsCgkJCQkJCQkJCQkJICBYTFRXX0luc2VydEluZGV4VW5pcXVlKTsKCQkJCQkJCUNIRUNL X0ZPUl9JTlRFUlJVUFRTKCk7CgkJCQkJCQlnb3RvIHJlY2hlY2s7CgkJCQkJCX0KCgkJCQkJ CS8qCgkJCQkJCSAqIE90aGVyd2lzZSBpbmRleCBpdCBidXQgZG9uJ3QgY2hlY2sgZm9yIHVu aXF1ZW5lc3MsCgkJCQkJCSAqIHRoZSBzYW1lIGFzIGEgUkVDRU5UTFlfREVBRCB0dXBsZS4K CQkJCQkJICovCgkJCQkJCWluZGV4SXQgPSB0cnVlOwoKCQkJCQkJLyoKCQkJCQkJICogQ291 bnQgSEVBUFRVUExFX0RFTEVURV9JTl9QUk9HUkVTUyB0dXBsZXMgYXMgbGl2ZSwKCQkJCQkJ ICogaWYgdGhleSB3ZXJlIG5vdCBkZWxldGVkIGJ5IHRoZSBjdXJyZW50CgkJCQkJCSAqIHRy YW5zYWN0aW9uLiAgVGhhdCdzIHdoYXQKCQkJCQkJICogaGVhcGFtX3NjYW5fYW5hbHl6ZV9u ZXh0X3R1cGxlKCkgZG9lcywgYW5kIHdlIHdhbnQKCQkJCQkJICogdGhlIGJlaGF2aW9yIHRv IGJlIGNvbnNpc3RlbnQuCgkJCQkJCSAqLwoJCQkJCQlyZWx0dXBsZXMgKz0gMTsKCQkJCQl9 CgkJCQkJZWxzZSBpZiAoSGVhcFR1cGxlSXNIb3RVcGRhdGVkKGhlYXBUdXBsZSkpCgkJCQkJ ewoJCQkJCQkvKgoJCQkJCQkgKiBJdCdzIGEgSE9ULXVwZGF0ZWQgdHVwbGUgZGVsZXRlZCBi eSBvdXIgb3duIHhhY3QuCgkJCQkJCSAqIFdlIGNhbiBhc3N1bWUgdGhlIGRlbGV0aW9uIHdp bGwgY29tbWl0IChlbHNlIHRoZQoJCQkJCQkgKiBpbmRleCBjb250ZW50cyBkb24ndCBtYXR0 ZXIpLCBzbyB0cmVhdCB0aGUgc2FtZSBhcwoJCQkJCQkgKiBSRUNFTlRMWV9ERUFEIEhPVC11 cGRhdGVkIHR1cGxlcy4KCQkJCQkJICovCgkJCQkJCWluZGV4SXQgPSBmYWxzZTsKCQkJCQkJ LyogbWFyayB0aGUgaW5kZXggYXMgdW5zYWZlIGZvciBvbGQgc25hcHNob3RzICovCgkJCQkJ CWluZGV4SW5mby0+aWlfQnJva2VuSG90Q2hhaW4gPSB0cnVlOwoJCQkJCX0KCQkJCQllbHNl CgkJCQkJewoJCQkJCQkvKgoJCQkJCQkgKiBJdCdzIGEgcmVndWxhciB0dXBsZSBkZWxldGVk IGJ5IG91ciBvd24geGFjdC4gSW5kZXgKCQkJCQkJICogaXQsIGJ1dCBkb24ndCBjaGVjayBm b3IgdW5pcXVlbmVzcyBub3IgY291bnQgaW4KCQkJCQkJICogcmVsdHVwbGVzLCB0aGUgc2Ft ZSBhcyBhIFJFQ0VOVExZX0RFQUQgdHVwbGUuCgkJCQkJCSAqLwoJCQkJCQlpbmRleEl0ID0g dHJ1ZTsKCQkJCQl9CgkJCQkJLyogSW4gYW55IGNhc2UsIGV4Y2x1ZGUgdGhlIHR1cGxlIGZy b20gdW5pcXVlLWNoZWNraW5nICovCgkJCQkJdHVwbGVJc0FsaXZlID0gZmFsc2U7CgkJCQkJ YnJlYWs7CgkJCQlkZWZhdWx0OgoJCQkJCWVsb2coRVJST1IsICJ1bmV4cGVjdGVkIEhlYXBU dXBsZVNhdGlzZmllc1ZhY3V1bSByZXN1bHQiKTsKCQkJCQlpbmRleEl0ID0gdHVwbGVJc0Fs aXZlID0gZmFsc2U7IC8qIGtlZXAgY29tcGlsZXIgcXVpZXQgKi8KCQkJCQlicmVhazsKCQkJ fQoKCQkJTG9ja0J1ZmZlcihoc2Nhbi0+cnNfY2J1ZiwgQlVGRkVSX0xPQ0tfVU5MT0NLKTsK CgkJCWlmICghaW5kZXhJdCkKCQkJCWNvbnRpbnVlOwoJCX0KCQllbHNlCgkJewoJCQkvKiBo ZWFwX2dldG5leHQgZGlkIHRoZSB0aW1lIHF1YWwgY2hlY2sgKi8KCQkJdHVwbGVJc0FsaXZl ID0gdHJ1ZTsKCQkJcmVsdHVwbGVzICs9IDE7CgkJfQoKCQlNZW1vcnlDb250ZXh0UmVzZXQo ZWNvbnRleHQtPmVjeHRfcGVyX3R1cGxlX21lbW9yeSk7CgoJCS8qIFNldCB1cCBmb3IgcHJl ZGljYXRlIG9yIGV4cHJlc3Npb24gZXZhbHVhdGlvbiAqLwoJCUV4ZWNTdG9yZUJ1ZmZlckhl YXBUdXBsZShoZWFwVHVwbGUsIHNsb3QsIGhzY2FuLT5yc19jYnVmKTsKCgkJLyoKCQkgKiBJ biBhIHBhcnRpYWwgaW5kZXgsIGRpc2NhcmQgdHVwbGVzIHRoYXQgZG9uJ3Qgc2F0aXNmeSB0 aGUKCQkgKiBwcmVkaWNhdGUuCgkJICovCgkJaWYgKHByZWRpY2F0ZUV4cGFuZCAhPSBOVUxM KQoJCXsKCQkJaWYgKCFFeGVjUXVhbChwcmVkaWNhdGVFeHBhbmQsIGVjb250ZXh0KSkKCQkJ CWNvbnRpbnVlOwoJCX0KCgkJLyoKCQkgKiBGb3IgdGhlIGN1cnJlbnQgaGVhcCB0dXBsZSwg ZXh0cmFjdCBhbGwgdGhlIGF0dHJpYnV0ZXMgd2UgdXNlIGluCgkJICogdGhpcyBpbmRleCwg YW5kIG5vdGUgd2hpY2ggYXJlIG51bGwuICBUaGlzIGFsc28gcGVyZm9ybXMgZXZhbHVhdGlv bgoJCSAqIG9mIGFueSBleHByZXNzaW9ucyBuZWVkZWQuCgkJICovCgkJRm9ybUluZGV4RGF0 dW0oaW5kZXhJbmZvLAoJCQkJCSAgIHNsb3QsCgkJCQkJICAgZXN0YXRlLAoJCQkJCSAgIHZh bHVlcywKCQkJCQkgICBpc251bGwpOwoKCQkvKgoJCSAqIFlvdSdkIHRoaW5rIHdlIHNob3Vs ZCBnbyBhaGVhZCBhbmQgYnVpbGQgdGhlIGluZGV4IHR1cGxlIGhlcmUsIGJ1dAoJCSAqIHNv bWUgaW5kZXggQU1zIHdhbnQgdG8gZG8gZnVydGhlciBwcm9jZXNzaW5nIG9uIHRoZSBkYXRh IGZpcnN0LiAgU28KCQkgKiBwYXNzIHRoZSB2YWx1ZXNbXSBhbmQgaXNudWxsW10gYXJyYXlz LCBpbnN0ZWFkLgoJCSAqLwoKCQlpZiAoSGVhcFR1cGxlSXNIZWFwT25seShoZWFwVHVwbGUp KQoJCXsKCQkJLyoKCQkJICogRm9yIGEgaGVhcC1vbmx5IHR1cGxlLCBwcmV0ZW5kIGl0cyBU SUQgaXMgdGhhdCBvZiB0aGUgcm9vdC4gU2VlCgkJCSAqIHNyYy9iYWNrZW5kL2FjY2Vzcy9o ZWFwL1JFQURNRS5IT1QgZm9yIGRpc2N1c3Npb24uCgkJCSAqLwoJCQlJdGVtUG9pbnRlckRh dGEgdGlkOwoJCQlPZmZzZXROdW1iZXIgb2ZmbnVtOwoKCQkJb2ZmbnVtID0gSXRlbVBvaW50 ZXJHZXRPZmZzZXROdW1iZXIoJmhlYXBUdXBsZS0+dF9zZWxmKTsKCgkJCS8qCgkJCSAqIElm IGEgSE9UIHR1cGxlIHBvaW50cyB0byBhIHJvb3QgdGhhdCB3ZSBkb24ndCBrbm93IGFib3V0 LAoJCQkgKiBvYnRhaW4gcm9vdCBpdGVtcyBhZnJlc2guICBJZiB0aGF0IHN0aWxsIGZhaWxz LCByZXBvcnQgaXQgYXMKCQkJICogY29ycnVwdGlvbi4KCQkJICovCgkJCWlmIChyb290X29m ZnNldHNbb2ZmbnVtIC0gMV0gPT0gSW52YWxpZE9mZnNldE51bWJlcikKCQkJewoJCQkJUGFn ZQkJcGFnZSA9IEJ1ZmZlckdldFBhZ2UoaHNjYW4tPnJzX2NidWYpOwoKCQkJCUxvY2tCdWZm ZXIoaHNjYW4tPnJzX2NidWYsIEJVRkZFUl9MT0NLX1NIQVJFKTsKCQkJCWhlYXBfZ2V0X3Jv b3RfdHVwbGVzKHBhZ2UsIHJvb3Rfb2Zmc2V0cyk7CgkJCQlMb2NrQnVmZmVyKGhzY2FuLT5y c19jYnVmLCBCVUZGRVJfTE9DS19VTkxPQ0spOwoJCQl9CgoJCQlpZiAoIU9mZnNldE51bWJl cklzVmFsaWQocm9vdF9vZmZzZXRzW29mZm51bSAtIDFdKSkKCQkJCWVyZXBvcnQoRVJST1Is CgkJCQkJCShlcnJjb2RlKEVSUkNPREVfREFUQV9DT1JSVVBURUQpLAoJCQkJCQkgZXJybXNn X2ludGVybmFsKCJmYWlsZWQgdG8gZmluZCBwYXJlbnQgdHVwbGUgZm9yIGhlYXAtb25seSB0 dXBsZSBhdCAoJXUsJXUpIGluIHRhYmxlIFwiJXNcIiIsCgkJCQkJCQkJCQkgSXRlbVBvaW50 ZXJHZXRCbG9ja051bWJlcigmaGVhcFR1cGxlLT50X3NlbGYpLAoJCQkJCQkJCQkJIG9mZm51 bSwKCQkJCQkJCQkJCSBSZWxhdGlvbkdldFJlbGF0aW9uTmFtZShoZWFwUmVsYXRpb24pKSkp OwoKCQkJSXRlbVBvaW50ZXJTZXQoJnRpZCwgSXRlbVBvaW50ZXJHZXRCbG9ja051bWJlcigm aGVhcFR1cGxlLT50X3NlbGYpLAoJCQkJCQkgICByb290X29mZnNldHNbb2ZmbnVtIC0gMV0p OwoKCQkJLyogQ2FsbCB0aGUgQU0ncyBjYWxsYmFjayByb3V0aW5lIHRvIHByb2Nlc3MgdGhl IHR1cGxlICovCgkJCWNhbGxiYWNrKGluZGV4UmVsYXRpb24sICZ0aWQsIHZhbHVlcywgaXNu dWxsLCB0dXBsZUlzQWxpdmUsCgkJCQkJIGNhbGxiYWNrX3N0YXRlKTsKCQl9CgkJZWxzZQoJ CXsKCQkJLyogQ2FsbCB0aGUgQU0ncyBjYWxsYmFjayByb3V0aW5lIHRvIHByb2Nlc3MgdGhl IHR1cGxlICovCgkJCWNhbGxiYWNrKGluZGV4UmVsYXRpb24sICZoZWFwVHVwbGUtPnRfc2Vs ZiwgdmFsdWVzLCBpc251bGwsCgkJCQkJIHR1cGxlSXNBbGl2ZSwgY2FsbGJhY2tfc3RhdGUp OwoJCX0KCX0KCgkvKiBSZXBvcnQgc2NhbiBwcm9ncmVzcyBvbmUgbGFzdCB0aW1lLiAqLwoJ aWYgKHByb2dyZXNzKQoJewoJCUJsb2NrTnVtYmVyIGJsa3NfZG9uZTsKCgkJaWYgKGhzY2Fu LT5yc19iYXNlLnJzX3BhcmFsbGVsICE9IE5VTEwpCgkJewoJCQlQYXJhbGxlbEJsb2NrVGFi bGVTY2FuRGVzYyBwYnNjYW47CgoJCQlwYnNjYW4gPSAoUGFyYWxsZWxCbG9ja1RhYmxlU2Nh bkRlc2MpIGhzY2FuLT5yc19iYXNlLnJzX3BhcmFsbGVsOwoJCQlibGtzX2RvbmUgPSBwYnNj YW4tPnBoc19uYmxvY2tzOwoJCX0KCQllbHNlCgkJCWJsa3NfZG9uZSA9IGhzY2FuLT5yc19u YmxvY2tzOwoKCQlwZ3N0YXRfcHJvZ3Jlc3NfdXBkYXRlX3BhcmFtKFBST0dSRVNTX1NDQU5f QkxPQ0tTX0RPTkUsCgkJCQkJCQkJCSBibGtzX2RvbmUpOwoJfQoKCXRhYmxlX2VuZHNjYW4o c2Nhbik7CgoJLyogd2UgY2FuIG5vdyBmb3JnZXQgb3VyIHNuYXBzaG90LCBpZiBzZXQgYW5k IHJlZ2lzdGVyZWQgYnkgdXMgKi8KCWlmIChuZWVkX3VucmVnaXN0ZXJfc25hcHNob3QpCgkJ VW5yZWdpc3RlclNuYXBzaG90KHNuYXBzaG90KTsKCglFeGVjRHJvcFNpbmdsZVR1cGxlVGFi bGVTbG90KHNsb3QpOwoKCUZyZWVFeGVjdXRvclN0YXRlKGVzdGF0ZSk7CgoJLyogVGhlc2Ug bWF5IGhhdmUgYmVlbiBwb2ludGluZyB0byB0aGUgbm93LWdvbmUgZXN0YXRlICovCglpbmRl eEluZm8tPmlpX0V4cHJlc3Npb25zU3RhdGUgPSBOSUw7CglpbmRleEluZm8tPmlpX0V4cHJl c3Npb25zRXhwYW5kU3RhdGUgPSBOSUw7CglpbmRleEluZm8tPmlpX1ByZWRpY2F0ZVN0YXRl ID0gTlVMTDsKCWluZGV4SW5mby0+aWlfUHJlZGljYXRlRXhwYW5kU3RhdGUgPSBOVUxMOwoK CXJldHVybiByZWx0dXBsZXM7Cn0KCnN0YXRpYyB2b2lkCmhlYXBhbV9pbmRleF92YWxpZGF0 ZV9zY2FuKFJlbGF0aW9uIGhlYXBSZWxhdGlvbiwKCQkJCQkJICAgUmVsYXRpb24gaW5kZXhS ZWxhdGlvbiwKCQkJCQkJICAgSW5kZXhJbmZvICppbmRleEluZm8sCgkJCQkJCSAgIFNuYXBz aG90IHNuYXBzaG90LAoJCQkJCQkgICBWYWxpZGF0ZUluZGV4U3RhdGUgKnN0YXRlKQp7CglU YWJsZVNjYW5EZXNjIHNjYW47CglIZWFwU2NhbkRlc2MgaHNjYW47CglIZWFwVHVwbGUJaGVh cFR1cGxlOwoJRGF0dW0JCXZhbHVlc1tJTkRFWF9NQVhfS0VZU107Cglib29sCQlpc251bGxb SU5ERVhfTUFYX0tFWVNdOwoJRXhwclN0YXRlICAqcHJlZGljYXRlRXhwYW5kOwoJVHVwbGVU YWJsZVNsb3QgKnNsb3Q7CglFU3RhdGUJICAgKmVzdGF0ZTsKCUV4cHJDb250ZXh0ICplY29u dGV4dDsKCUJsb2NrTnVtYmVyIHJvb3RfYmxrbm8gPSBJbnZhbGlkQmxvY2tOdW1iZXI7CglP ZmZzZXROdW1iZXIgcm9vdF9vZmZzZXRzW01heEhlYXBUdXBsZXNQZXJQYWdlXTsKCWJvb2wJ CWluX2luZGV4W01heEhlYXBUdXBsZXNQZXJQYWdlXTsKCUJsb2NrTnVtYmVyIHByZXZpb3Vz X2Jsa25vID0gSW52YWxpZEJsb2NrTnVtYmVyOwoKCS8qIHN0YXRlIHZhcmlhYmxlcyBmb3Ig dGhlIG1lcmdlICovCglJdGVtUG9pbnRlciBpbmRleGN1cnNvciA9IE5VTEw7CglJdGVtUG9p bnRlckRhdGEgZGVjb2RlZDsKCWJvb2wJCXR1cGxlc29ydF9lbXB0eSA9IGZhbHNlOwoKCS8q CgkgKiBzYW5pdHkgY2hlY2tzCgkgKi8KCUFzc2VydChPaWRJc1ZhbGlkKGluZGV4UmVsYXRp b24tPnJkX3JlbC0+cmVsYW0pKTsKCgkvKgoJICogTmVlZCBhbiBFU3RhdGUgZm9yIGV2YWx1 YXRpb24gb2YgaW5kZXggZXhwcmVzc2lvbnMgYW5kIHBhcnRpYWwtaW5kZXgKCSAqIHByZWRp Y2F0ZXMuICBBbHNvIGEgc2xvdCB0byBob2xkIHRoZSBjdXJyZW50IHR1cGxlLgoJICovCgll c3RhdGUgPSBDcmVhdGVFeGVjdXRvclN0YXRlKCk7CgllY29udGV4dCA9IEdldFBlclR1cGxl RXhwckNvbnRleHQoZXN0YXRlKTsKCXNsb3QgPSBNYWtlU2luZ2xlVHVwbGVUYWJsZVNsb3Qo UmVsYXRpb25HZXREZXNjcihoZWFwUmVsYXRpb24pLAoJCQkJCQkJCQkmVFRTT3BzSGVhcFR1 cGxlKTsKCgkvKiBBcnJhbmdlIGZvciBlY29udGV4dCdzIHNjYW4gdHVwbGUgdG8gYmUgdGhl IHR1cGxlIHVuZGVyIHRlc3QgKi8KCWVjb250ZXh0LT5lY3h0X3NjYW50dXBsZSA9IHNsb3Q7 CgoJLyogU2V0IHVwIGV4ZWN1dGlvbiBzdGF0ZSBmb3IgcHJlZGljYXRlLCBpZiBhbnkuICov CglwcmVkaWNhdGVFeHBhbmQgPSBFeGVjUHJlcGFyZVF1YWwoaW5kZXhJbmZvLT5paV9QcmVk aWNhdGVFeHBhbmQsIGVzdGF0ZSk7CgoJLyoKCSAqIFByZXBhcmUgZm9yIHNjYW4gb2YgdGhl IGJhc2UgcmVsYXRpb24uICBXZSBuZWVkIGp1c3QgdGhvc2UgdHVwbGVzCgkgKiBzYXRpc2Z5 aW5nIHRoZSBwYXNzZWQtaW4gcmVmZXJlbmNlIHNuYXBzaG90LiAgV2UgbXVzdCBkaXNhYmxl IHN5bmNzY2FuCgkgKiBoZXJlLCBiZWNhdXNlIGl0J3MgY3JpdGljYWwgdGhhdCB3ZSByZWFk IGZyb20gYmxvY2sgemVybyBmb3J3YXJkIHRvCgkgKiBtYXRjaCB0aGUgc29ydGVkIFRJRHMu CgkgKi8KCXNjYW4gPSB0YWJsZV9iZWdpbnNjYW5fc3RyYXQoaGVhcFJlbGF0aW9uLAkvKiBy ZWxhdGlvbiAqLwoJCQkJCQkJCSBzbmFwc2hvdCwJLyogc25hcHNob3QgKi8KCQkJCQkJCQkg MCwgLyogbnVtYmVyIG9mIGtleXMgKi8KCQkJCQkJCQkgTlVMTCwJLyogc2NhbiBrZXkgKi8K CQkJCQkJCQkgdHJ1ZSwJLyogYnVmZmVyIGFjY2VzcyBzdHJhdGVneSBPSyAqLwoJCQkJCQkJ CSBmYWxzZSk7CS8qIHN5bmNzY2FuIG5vdCBPSyAqLwoJaHNjYW4gPSAoSGVhcFNjYW5EZXNj KSBzY2FuOwoKCXBnc3RhdF9wcm9ncmVzc191cGRhdGVfcGFyYW0oUFJPR1JFU1NfU0NBTl9C TE9DS1NfVE9UQUwsCgkJCQkJCQkJIGhzY2FuLT5yc19uYmxvY2tzKTsKCgkvKgoJICogU2Nh biBhbGwgdHVwbGVzIG1hdGNoaW5nIHRoZSBzbmFwc2hvdC4KCSAqLwoJd2hpbGUgKChoZWFw VHVwbGUgPSBoZWFwX2dldG5leHQoc2NhbiwgRm9yd2FyZFNjYW5EaXJlY3Rpb24pKSAhPSBO VUxMKQoJewoJCUl0ZW1Qb2ludGVyIGhlYXBjdXJzb3IgPSAmaGVhcFR1cGxlLT50X3NlbGY7 CgkJSXRlbVBvaW50ZXJEYXRhIHJvb3RUdXBsZTsKCQlPZmZzZXROdW1iZXIgcm9vdF9vZmZu dW07CgoJCUNIRUNLX0ZPUl9JTlRFUlJVUFRTKCk7CgoJCXN0YXRlLT5odHVwcyArPSAxOwoK CQlpZiAoKHByZXZpb3VzX2Jsa25vID09IEludmFsaWRCbG9ja051bWJlcikgfHwKCQkJKGhz Y2FuLT5yc19jYmxvY2sgIT0gcHJldmlvdXNfYmxrbm8pKQoJCXsKCQkJcGdzdGF0X3Byb2dy ZXNzX3VwZGF0ZV9wYXJhbShQUk9HUkVTU19TQ0FOX0JMT0NLU19ET05FLAoJCQkJCQkJCQkJ IGhzY2FuLT5yc19jYmxvY2spOwoJCQlwcmV2aW91c19ibGtubyA9IGhzY2FuLT5yc19jYmxv Y2s7CgkJfQoKCQkvKgoJCSAqIEFzIGNvbW1lbnRlZCBpbiB0YWJsZV9pbmRleF9idWlsZF9z Y2FuLCB3ZSBzaG91bGQgaW5kZXggaGVhcC1vbmx5CgkJICogdHVwbGVzIHVuZGVyIHRoZSBU SURzIG9mIHRoZWlyIHJvb3QgdHVwbGVzOyBzbyB3aGVuIHdlIGFkdmFuY2Ugb250bwoJCSAq IGEgbmV3IGhlYXAgcGFnZSwgYnVpbGQgYSBtYXAgb2Ygcm9vdCBpdGVtIG9mZnNldHMgb24g dGhlIHBhZ2UuCgkJICoKCQkgKiBUaGlzIGNvbXBsaWNhdGVzIG1lcmdpbmcgYWdhaW5zdCB0 aGUgdHVwbGVzb3J0IG91dHB1dDogd2Ugd2lsbAoJCSAqIHZpc2l0IHRoZSBsaXZlIHR1cGxl cyBpbiBvcmRlciBieSB0aGVpciBvZmZzZXRzLCBidXQgdGhlIHJvb3QKCQkgKiBvZmZzZXRz IHRoYXQgd2UgbmVlZCB0byBjb21wYXJlIGFnYWluc3QgdGhlIGluZGV4IGNvbnRlbnRzIG1p Z2h0IGJlCgkJICogb3JkZXJlZCBkaWZmZXJlbnRseS4gIFNvIHdlIG1pZ2h0IGhhdmUgdG8g Imxvb2sgYmFjayIgd2l0aGluIHRoZQoJCSAqIHR1cGxlc29ydCBvdXRwdXQsIGJ1dCBvbmx5 IHdpdGhpbiB0aGUgY3VycmVudCBwYWdlLiAgV2UgaGFuZGxlIHRoYXQKCQkgKiBieSBrZWVw aW5nIGEgYm9vbCBhcnJheSBpbl9pbmRleFtdIHNob3dpbmcgYWxsIHRoZQoJCSAqIGFscmVh ZHktcGFzc2VkLW92ZXIgdHVwbGVzb3J0IG91dHB1dCBUSURzIG9mIHRoZSBjdXJyZW50IHBh Z2UuIFdlCgkJICogY2xlYXIgdGhhdCBhcnJheSBoZXJlLCB3aGVuIGFkdmFuY2luZyBvbnRv IGEgbmV3IGhlYXAgcGFnZS4KCQkgKi8KCQlpZiAoaHNjYW4tPnJzX2NibG9jayAhPSByb290 X2Jsa25vKQoJCXsKCQkJUGFnZQkJcGFnZSA9IEJ1ZmZlckdldFBhZ2UoaHNjYW4tPnJzX2Ni dWYpOwoKCQkJTG9ja0J1ZmZlcihoc2Nhbi0+cnNfY2J1ZiwgQlVGRkVSX0xPQ0tfU0hBUkUp OwoJCQloZWFwX2dldF9yb290X3R1cGxlcyhwYWdlLCByb290X29mZnNldHMpOwoJCQlMb2Nr QnVmZmVyKGhzY2FuLT5yc19jYnVmLCBCVUZGRVJfTE9DS19VTkxPQ0spOwoKCQkJbWVtc2V0 KGluX2luZGV4LCAwLCBzaXplb2YoaW5faW5kZXgpKTsKCgkJCXJvb3RfYmxrbm8gPSBoc2Nh bi0+cnNfY2Jsb2NrOwoJCX0KCgkJLyogQ29udmVydCBhY3R1YWwgdHVwbGUgVElEIHRvIHJv b3QgVElEICovCgkJcm9vdFR1cGxlID0gKmhlYXBjdXJzb3I7CgkJcm9vdF9vZmZudW0gPSBJ dGVtUG9pbnRlckdldE9mZnNldE51bWJlcihoZWFwY3Vyc29yKTsKCgkJaWYgKEhlYXBUdXBs ZUlzSGVhcE9ubHkoaGVhcFR1cGxlKSkKCQl7CgkJCXJvb3Rfb2ZmbnVtID0gcm9vdF9vZmZz ZXRzW3Jvb3Rfb2ZmbnVtIC0gMV07CgkJCWlmICghT2Zmc2V0TnVtYmVySXNWYWxpZChyb290 X29mZm51bSkpCgkJCQllcmVwb3J0KEVSUk9SLAoJCQkJCQkoZXJyY29kZShFUlJDT0RFX0RB VEFfQ09SUlVQVEVEKSwKCQkJCQkJIGVycm1zZ19pbnRlcm5hbCgiZmFpbGVkIHRvIGZpbmQg cGFyZW50IHR1cGxlIGZvciBoZWFwLW9ubHkgdHVwbGUgYXQgKCV1LCV1KSBpbiB0YWJsZSBc IiVzXCIiLAoJCQkJCQkJCQkJIEl0ZW1Qb2ludGVyR2V0QmxvY2tOdW1iZXIoaGVhcGN1cnNv ciksCgkJCQkJCQkJCQkgSXRlbVBvaW50ZXJHZXRPZmZzZXROdW1iZXIoaGVhcGN1cnNvciks CgkJCQkJCQkJCQkgUmVsYXRpb25HZXRSZWxhdGlvbk5hbWUoaGVhcFJlbGF0aW9uKSkpKTsK CQkJSXRlbVBvaW50ZXJTZXRPZmZzZXROdW1iZXIoJnJvb3RUdXBsZSwgcm9vdF9vZmZudW0p OwoJCX0KCgkJLyoKCQkgKiAibWVyZ2UiIGJ5IHNraXBwaW5nIHRocm91Z2ggdGhlIGluZGV4 IHR1cGxlcyB1bnRpbCB3ZSBmaW5kIG9yIHBhc3MKCQkgKiB0aGUgY3VycmVudCByb290IHR1 cGxlLgoJCSAqLwoJCXdoaWxlICghdHVwbGVzb3J0X2VtcHR5ICYmCgkJCSAgICghaW5kZXhj dXJzb3IgfHwKCQkJCUl0ZW1Qb2ludGVyQ29tcGFyZShpbmRleGN1cnNvciwgJnJvb3RUdXBs ZSkgPCAwKSkKCQl7CgkJCURhdHVtCQl0c192YWw7CgkJCWJvb2wJCXRzX2lzbnVsbDsKCgkJ CWlmIChpbmRleGN1cnNvcikKCQkJewoJCQkJLyoKCQkJCSAqIFJlbWVtYmVyIGluZGV4IGl0 ZW1zIHNlZW4gZWFybGllciBvbiB0aGUgY3VycmVudCBoZWFwIHBhZ2UKCQkJCSAqLwoJCQkJ aWYgKEl0ZW1Qb2ludGVyR2V0QmxvY2tOdW1iZXIoaW5kZXhjdXJzb3IpID09IHJvb3RfYmxr bm8pCgkJCQkJaW5faW5kZXhbSXRlbVBvaW50ZXJHZXRPZmZzZXROdW1iZXIoaW5kZXhjdXJz b3IpIC0gMV0gPSB0cnVlOwoJCQl9CgoJCQl0dXBsZXNvcnRfZW1wdHkgPSAhdHVwbGVzb3J0 X2dldGRhdHVtKHN0YXRlLT50dXBsZXNvcnQsIHRydWUsCgkJCQkJCQkJCQkJCSAgZmFsc2Us ICZ0c192YWwsICZ0c19pc251bGwsCgkJCQkJCQkJCQkJCSAgTlVMTCk7CgkJCUFzc2VydCh0 dXBsZXNvcnRfZW1wdHkgfHwgIXRzX2lzbnVsbCk7CgkJCWlmICghdHVwbGVzb3J0X2VtcHR5 KQoJCQl7CgkJCQlpdGVtcHRyX2RlY29kZSgmZGVjb2RlZCwgRGF0dW1HZXRJbnQ2NCh0c192 YWwpKTsKCQkJCWluZGV4Y3Vyc29yID0gJmRlY29kZWQ7CgkJCX0KCQkJZWxzZQoJCQl7CgkJ CQkvKiBCZSB0aWR5ICovCgkJCQlpbmRleGN1cnNvciA9IE5VTEw7CgkJCX0KCQl9CgoJCS8q CgkJICogSWYgdGhlIHR1cGxlc29ydCBoYXMgb3ZlcnNob3QgKmFuZCogd2UgZGlkbid0IHNl ZSBhIG1hdGNoIGVhcmxpZXIsCgkJICogdGhlbiB0aGlzIHR1cGxlIGlzIG1pc3NpbmcgZnJv bSB0aGUgaW5kZXgsIHNvIGluc2VydCBpdC4KCQkgKi8KCQlpZiAoKHR1cGxlc29ydF9lbXB0 eSB8fAoJCQkgSXRlbVBvaW50ZXJDb21wYXJlKGluZGV4Y3Vyc29yLCAmcm9vdFR1cGxlKSA+ IDApICYmCgkJCSFpbl9pbmRleFtyb290X29mZm51bSAtIDFdKQoJCXsKCQkJTWVtb3J5Q29u dGV4dFJlc2V0KGVjb250ZXh0LT5lY3h0X3Blcl90dXBsZV9tZW1vcnkpOwoKCQkJLyogU2V0 IHVwIGZvciBwcmVkaWNhdGUgb3IgZXhwcmVzc2lvbiBldmFsdWF0aW9uICovCgkJCUV4ZWNT dG9yZUhlYXBUdXBsZShoZWFwVHVwbGUsIHNsb3QsIGZhbHNlKTsKCgkJCS8qCgkJCSAqIElu IGEgcGFydGlhbCBpbmRleCwgZGlzY2FyZCB0dXBsZXMgdGhhdCBkb24ndCBzYXRpc2Z5IHRo ZQoJCQkgKiBwcmVkaWNhdGUuCgkJCSAqLwoJCQlpZiAocHJlZGljYXRlRXhwYW5kICE9IE5V TEwpCgkJCXsKCQkJCWlmICghRXhlY1F1YWwocHJlZGljYXRlRXhwYW5kLCBlY29udGV4dCkp CgkJCQkJY29udGludWU7CgkJCX0KCgkJCS8qCgkJCSAqIEZvciB0aGUgY3VycmVudCBoZWFw IHR1cGxlLCBleHRyYWN0IGFsbCB0aGUgYXR0cmlidXRlcyB3ZSB1c2UKCQkJICogaW4gdGhp cyBpbmRleCwgYW5kIG5vdGUgd2hpY2ggYXJlIG51bGwuICBUaGlzIGFsc28gcGVyZm9ybXMK CQkJICogZXZhbHVhdGlvbiBvZiBhbnkgZXhwcmVzc2lvbnMgbmVlZGVkLgoJCQkgKi8KCQkJ Rm9ybUluZGV4RGF0dW0oaW5kZXhJbmZvLAoJCQkJCQkgICBzbG90LAoJCQkJCQkgICBlc3Rh dGUsCgkJCQkJCSAgIHZhbHVlcywKCQkJCQkJICAgaXNudWxsKTsKCgkJCS8qCgkJCSAqIFlv dSdkIHRoaW5rIHdlIHNob3VsZCBnbyBhaGVhZCBhbmQgYnVpbGQgdGhlIGluZGV4IHR1cGxl IGhlcmUsCgkJCSAqIGJ1dCBzb21lIGluZGV4IEFNcyB3YW50IHRvIGRvIGZ1cnRoZXIgcHJv Y2Vzc2luZyBvbiB0aGUgZGF0YQoJCQkgKiBmaXJzdC4gU28gcGFzcyB0aGUgdmFsdWVzW10g YW5kIGlzbnVsbFtdIGFycmF5cywgaW5zdGVhZC4KCQkJICovCgoJCQkvKgoJCQkgKiBJZiB0 aGUgdHVwbGUgaXMgYWxyZWFkeSBjb21taXR0ZWQgZGVhZCwgeW91IG1pZ2h0IHRoaW5rIHdl CgkJCSAqIGNvdWxkIHN1cHByZXNzIHVuaXF1ZW5lc3MgY2hlY2tpbmcsIGJ1dCB0aGlzIGlz IG5vIGxvbmdlciB0cnVlCgkJCSAqIGluIHRoZSBwcmVzZW5jZSBvZiBIT1QsIGJlY2F1c2Ug dGhlIGluc2VydCBpcyBhY3R1YWxseSBhIHByb3h5CgkJCSAqIGZvciBhIHVuaXF1ZW5lc3Mg Y2hlY2sgb24gdGhlIHdob2xlIEhPVC1jaGFpbi4gIFRoYXQgaXMsIHRoZQoJCQkgKiB0dXBs ZSB3ZSBoYXZlIGhlcmUgY291bGQgYmUgZGVhZCBiZWNhdXNlIGl0IHdhcyBhbHJlYWR5CgkJ CSAqIEhPVC11cGRhdGVkLCBhbmQgaWYgc28gdGhlIHVwZGF0aW5nIHRyYW5zYWN0aW9uIHdp bGwgbm90IGhhdmUKCQkJICogdGhvdWdodCBpdCBzaG91bGQgaW5zZXJ0IGluZGV4IGVudHJp ZXMuICBUaGUgaW5kZXggQU0gd2lsbAoJCQkgKiBjaGVjayB0aGUgd2hvbGUgSE9ULWNoYWlu IGFuZCBjb3JyZWN0bHkgZGV0ZWN0IGEgY29uZmxpY3QgaWYKCQkJICogdGhlcmUgaXMgb25l LgoJCQkgKi8KCgkJCWluZGV4X2luc2VydChpbmRleFJlbGF0aW9uLAoJCQkJCQkgdmFsdWVz LAoJCQkJCQkgaXNudWxsLAoJCQkJCQkgJnJvb3RUdXBsZSwKCQkJCQkJIGhlYXBSZWxhdGlv biwKCQkJCQkJIGluZGV4SW5mby0+aWlfVW5pcXVlID8KCQkJCQkJIFVOSVFVRV9DSEVDS19Z RVMgOiBVTklRVUVfQ0hFQ0tfTk8sCgkJCQkJCSBmYWxzZSwKCQkJCQkJIGluZGV4SW5mbyk7 CgoJCQlzdGF0ZS0+dHVwc19pbnNlcnRlZCArPSAxOwoJCX0KCX0KCgl0YWJsZV9lbmRzY2Fu KHNjYW4pOwoKCUV4ZWNEcm9wU2luZ2xlVHVwbGVUYWJsZVNsb3Qoc2xvdCk7CgoJRnJlZUV4 ZWN1dG9yU3RhdGUoZXN0YXRlKTsKCgkvKiBUaGVzZSBtYXkgaGF2ZSBiZWVuIHBvaW50aW5n IHRvIHRoZSBub3ctZ29uZSBlc3RhdGUgKi8KCWluZGV4SW5mby0+aWlfRXhwcmVzc2lvbnNT dGF0ZSA9IE5JTDsKCWluZGV4SW5mby0+aWlfRXhwcmVzc2lvbnNFeHBhbmRTdGF0ZSA9IE5J TDsKCWluZGV4SW5mby0+aWlfUHJlZGljYXRlU3RhdGUgPSBOVUxMOwoJaW5kZXhJbmZvLT5p aV9QcmVkaWNhdGVFeHBhbmRTdGF0ZSA9IE5VTEw7Cn0KCi8qCiAqIFJldHVybiB0aGUgbnVt YmVyIG9mIGJsb2NrcyB0aGF0IGhhdmUgYmVlbiByZWFkIGJ5IHRoaXMgc2NhbiBzaW5jZQog KiBzdGFydGluZy4gIFRoaXMgaXMgbWVhbnQgZm9yIHByb2dyZXNzIHJlcG9ydGluZyByYXRo ZXIgdGhhbiBiZSBmdWxseQogKiBhY2N1cmF0ZTogaW4gYSBwYXJhbGxlbCBzY2FuLCB3b3Jr ZXJzIGNhbiBiZSBjb25jdXJyZW50bHkgcmVhZGluZyBibG9ja3MKICogZnVydGhlciBhaGVh ZCB0aGFuIHdoYXQgd2UgcmVwb3J0LgogKi8Kc3RhdGljIEJsb2NrTnVtYmVyCmhlYXBhbV9z Y2FuX2dldF9ibG9ja3NfZG9uZShIZWFwU2NhbkRlc2MgaHNjYW4pCnsKCVBhcmFsbGVsQmxv Y2tUYWJsZVNjYW5EZXNjIGJwc2NhbiA9IE5VTEw7CglCbG9ja051bWJlciBzdGFydGJsb2Nr OwoJQmxvY2tOdW1iZXIgYmxvY2tzX2RvbmU7CgoJaWYgKGhzY2FuLT5yc19iYXNlLnJzX3Bh cmFsbGVsICE9IE5VTEwpCgl7CgkJYnBzY2FuID0gKFBhcmFsbGVsQmxvY2tUYWJsZVNjYW5E ZXNjKSBoc2Nhbi0+cnNfYmFzZS5yc19wYXJhbGxlbDsKCQlzdGFydGJsb2NrID0gYnBzY2Fu LT5waHNfc3RhcnRibG9jazsKCX0KCWVsc2UKCQlzdGFydGJsb2NrID0gaHNjYW4tPnJzX3N0 YXJ0YmxvY2s7CgoJLyoKCSAqIE1pZ2h0IGhhdmUgd3JhcHBlZCBhcm91bmQgdGhlIGVuZCBv ZiB0aGUgcmVsYXRpb24sIGlmIHN0YXJ0YmxvY2sgd2FzCgkgKiBub3QgemVyby4KCSAqLwoJ aWYgKGhzY2FuLT5yc19jYmxvY2sgPiBzdGFydGJsb2NrKQoJCWJsb2Nrc19kb25lID0gaHNj YW4tPnJzX2NibG9jayAtIHN0YXJ0YmxvY2s7CgllbHNlCgl7CgkJQmxvY2tOdW1iZXIgbmJs b2NrczsKCgkJbmJsb2NrcyA9IGJwc2NhbiAhPSBOVUxMID8gYnBzY2FuLT5waHNfbmJsb2Nr cyA6IGhzY2FuLT5yc19uYmxvY2tzOwoJCWJsb2Nrc19kb25lID0gbmJsb2NrcyAtIHN0YXJ0 YmxvY2sgKwoJCQloc2Nhbi0+cnNfY2Jsb2NrOwoJfQoKCXJldHVybiBibG9ja3NfZG9uZTsK fQoKCi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogKiBNaXNjZWxsYW5lb3VzIGNhbGxiYWNrcyBm b3IgdGhlIGhlYXAgQU0KICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAqLwoKLyoKICogQ2hlY2sg dG8gc2VlIHdoZXRoZXIgdGhlIHRhYmxlIG5lZWRzIGEgVE9BU1QgdGFibGUuICBJdCBkb2Vz IG9ubHkgaWYKICogKDEpIHRoZXJlIGFyZSBhbnkgdG9hc3RhYmxlIGF0dHJpYnV0ZXMsIGFu ZCAoMikgdGhlIG1heGltdW0gbGVuZ3RoCiAqIG9mIGEgdHVwbGUgY291bGQgZXhjZWVkIFRP QVNUX1RVUExFX1RIUkVTSE9MRC4gIChXZSBkb24ndCB3YW50IHRvCiAqIGNyZWF0ZSBhIHRv YXN0IHRhYmxlIGZvciBzb21ldGhpbmcgbGlrZSAiZjEgdmFyY2hhcigyMCkiLikKICovCnN0 YXRpYyBib29sCmhlYXBhbV9yZWxhdGlvbl9uZWVkc190b2FzdF90YWJsZShSZWxhdGlvbiBy ZWwpCnsKCWludDMyCQlkYXRhX2xlbmd0aCA9IDA7Cglib29sCQltYXhsZW5ndGhfdW5rbm93 biA9IGZhbHNlOwoJYm9vbAkJaGFzX3RvYXN0YWJsZV9hdHRycyA9IGZhbHNlOwoJVHVwbGVE ZXNjCXR1cGRlc2MgPSByZWwtPnJkX2F0dDsKCWludDMyCQl0dXBsZV9sZW5ndGg7CglpbnQJ CQlpOwoKCWZvciAoaSA9IDA7IGkgPCB0dXBkZXNjLT5uYXR0czsgaSsrKQoJewoJCUZvcm1f cGdfYXR0cmlidXRlIGF0dCA9IFR1cGxlRGVzY0F0dHIodHVwZGVzYywgaSk7CgoJCWlmIChh dHQtPmF0dGlzZHJvcHBlZCkKCQkJY29udGludWU7CgkJaWYgKGF0dC0+YXR0Z2VuZXJhdGVk ID09IEFUVFJJQlVURV9HRU5FUkFURURfVklSVFVBTCkKCQkJY29udGludWU7CgkJZGF0YV9s ZW5ndGggPSBhdHRfYWxpZ25fbm9taW5hbChkYXRhX2xlbmd0aCwgYXR0LT5hdHRhbGlnbik7 CgkJaWYgKGF0dC0+YXR0bGVuID4gMCkKCQl7CgkJCS8qIEZpeGVkLWxlbmd0aCB0eXBlcyBh cmUgbmV2ZXIgdG9hc3RhYmxlICovCgkJCWRhdGFfbGVuZ3RoICs9IGF0dC0+YXR0bGVuOwoJ CX0KCQllbHNlCgkJewoJCQlpbnQzMgkJbWF4bGVuID0gdHlwZV9tYXhpbXVtX3NpemUoYXR0 LT5hdHR0eXBpZCwKCQkJCQkJCQkJCQkJICAgYXR0LT5hdHR0eXBtb2QpOwoKCQkJaWYgKG1h eGxlbiA8IDApCgkJCQltYXhsZW5ndGhfdW5rbm93biA9IHRydWU7CgkJCWVsc2UKCQkJCWRh dGFfbGVuZ3RoICs9IG1heGxlbjsKCQkJaWYgKGF0dC0+YXR0c3RvcmFnZSAhPSBUWVBTVE9S QUdFX1BMQUlOKQoJCQkJaGFzX3RvYXN0YWJsZV9hdHRycyA9IHRydWU7CgkJfQoJfQoJaWYg KCFoYXNfdG9hc3RhYmxlX2F0dHJzKQoJCXJldHVybiBmYWxzZTsJCQkvKiBub3RoaW5nIHRv IHRvYXN0PyAqLwoJaWYgKG1heGxlbmd0aF91bmtub3duKQoJCXJldHVybiB0cnVlOwkJCS8q IGFueSB1bmxpbWl0ZWQtbGVuZ3RoIGF0dHJzPyAqLwoJdHVwbGVfbGVuZ3RoID0gTUFYQUxJ R04oU2l6ZW9mSGVhcFR1cGxlSGVhZGVyICsKCQkJCQkJCUJJVE1BUExFTih0dXBkZXNjLT5u YXR0cykpICsKCQlNQVhBTElHTihkYXRhX2xlbmd0aCk7CglyZXR1cm4gKHR1cGxlX2xlbmd0 aCA+IFRPQVNUX1RVUExFX1RIUkVTSE9MRCk7Cn0KCi8qCiAqIFRPQVNUIHRhYmxlcyBmb3Ig aGVhcCByZWxhdGlvbnMgYXJlIGp1c3QgaGVhcCByZWxhdGlvbnMuCiAqLwpzdGF0aWMgT2lk CmhlYXBhbV9yZWxhdGlvbl90b2FzdF9hbShSZWxhdGlvbiByZWwpCnsKCXJldHVybiByZWwt PnJkX3JlbC0+cmVsYW07Cn0KCgovKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICogUGxhbm5lciBy ZWxhdGVkIGNhbGxiYWNrcyBmb3IgdGhlIGhlYXAgQU0KICogLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t CiAqLwoKI2RlZmluZSBIRUFQX09WRVJIRUFEX0JZVEVTX1BFUl9UVVBMRSBcCgkoTUFYQUxJ R04oU2l6ZW9mSGVhcFR1cGxlSGVhZGVyKSArIHNpemVvZihJdGVtSWREYXRhKSkKI2RlZmlu ZSBIRUFQX1VTQUJMRV9CWVRFU19QRVJfUEFHRSBcCgkoQkxDS1NaIC0gU2l6ZU9mUGFnZUhl YWRlckRhdGEpCgpzdGF0aWMgdm9pZApoZWFwYW1fZXN0aW1hdGVfcmVsX3NpemUoUmVsYXRp b24gcmVsLCBpbnQzMiAqYXR0cl93aWR0aHMsCgkJCQkJCSBCbG9ja051bWJlciAqcGFnZXMs IGRvdWJsZSAqdHVwbGVzLAoJCQkJCQkgZG91YmxlICphbGx2aXNmcmFjKQp7Cgl0YWJsZV9i bG9ja19yZWxhdGlvbl9lc3RpbWF0ZV9zaXplKHJlbCwgYXR0cl93aWR0aHMsIHBhZ2VzLAoJ CQkJCQkJCQkgICB0dXBsZXMsIGFsbHZpc2ZyYWMsCgkJCQkJCQkJCSAgIEhFQVBfT1ZFUkhF QURfQllURVNfUEVSX1RVUExFLAoJCQkJCQkJCQkgICBIRUFQX1VTQUJMRV9CWVRFU19QRVJf UEFHRSk7Cn0KCgovKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICogRXhlY3V0b3IgcmVsYXRlZCBj YWxsYmFja3MgZm9yIHRoZSBoZWFwIEFNCiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogKi8KCnN0 YXRpYyBib29sCmhlYXBhbV9zY2FuX2JpdG1hcF9uZXh0X3R1cGxlKFRhYmxlU2NhbkRlc2Mg c2NhbiwKCQkJCQkJCSAgVHVwbGVUYWJsZVNsb3QgKnNsb3QsCgkJCQkJCQkgIGJvb2wgKnJl Y2hlY2ssCgkJCQkJCQkgIHVpbnQ2NCAqbG9zc3lfcGFnZXMsCgkJCQkJCQkgIHVpbnQ2NCAq ZXhhY3RfcGFnZXMpCnsKCUJpdG1hcEhlYXBTY2FuRGVzYyBic2NhbiA9IChCaXRtYXBIZWFw U2NhbkRlc2MpIHNjYW47CglIZWFwU2NhbkRlc2MgaHNjYW4gPSAoSGVhcFNjYW5EZXNjKSBi c2NhbjsKCU9mZnNldE51bWJlciB0YXJnb2Zmc2V0OwoJUGFnZQkJcGFnZTsKCUl0ZW1JZAkJ bHA7CgoJLyoKCSAqIE91dCBvZiByYW5nZT8gIElmIHNvLCBub3RoaW5nIG1vcmUgdG8gbG9v ayBhdCBvbiB0aGlzIHBhZ2UKCSAqLwoJd2hpbGUgKGhzY2FuLT5yc19jaW5kZXggPj0gaHNj YW4tPnJzX250dXBsZXMpCgl7CgkJLyoKCQkgKiBSZXR1cm5zIGZhbHNlIGlmIHRoZSBiaXRt YXAgaXMgZXhoYXVzdGVkIGFuZCB0aGVyZSBhcmUgbm8gZnVydGhlcgoJCSAqIGJsb2NrcyB3 ZSBuZWVkIHRvIHNjYW4uCgkJICovCgkJaWYgKCFCaXRtYXBIZWFwU2Nhbk5leHRCbG9jayhz Y2FuLCByZWNoZWNrLCBsb3NzeV9wYWdlcywgZXhhY3RfcGFnZXMpKQoJCQlyZXR1cm4gZmFs c2U7Cgl9CgoJdGFyZ29mZnNldCA9IGhzY2FuLT5yc192aXN0dXBsZXNbaHNjYW4tPnJzX2Np bmRleF07CglwYWdlID0gQnVmZmVyR2V0UGFnZShoc2Nhbi0+cnNfY2J1Zik7CglscCA9IFBh Z2VHZXRJdGVtSWQocGFnZSwgdGFyZ29mZnNldCk7CglBc3NlcnQoSXRlbUlkSXNOb3JtYWwo bHApKTsKCgloc2Nhbi0+cnNfY3R1cC50X2RhdGEgPSAoSGVhcFR1cGxlSGVhZGVyKSBQYWdl R2V0SXRlbShwYWdlLCBscCk7Cgloc2Nhbi0+cnNfY3R1cC50X2xlbiA9IEl0ZW1JZEdldExl bmd0aChscCk7Cgloc2Nhbi0+cnNfY3R1cC50X3RhYmxlT2lkID0gc2Nhbi0+cnNfcmQtPnJk X2lkOwoJSXRlbVBvaW50ZXJTZXQoJmhzY2FuLT5yc19jdHVwLnRfc2VsZiwgaHNjYW4tPnJz X2NibG9jaywgdGFyZ29mZnNldCk7CgoJcGdzdGF0X2NvdW50X2hlYXBfZmV0Y2goc2Nhbi0+ cnNfcmQpOwoKCS8qCgkgKiBTZXQgdXAgdGhlIHJlc3VsdCBzbG90IHRvIHBvaW50IHRvIHRo aXMgdHVwbGUuICBOb3RlIHRoYXQgdGhlIHNsb3QKCSAqIGFjcXVpcmVzIGEgcGluIG9uIHRo ZSBidWZmZXIuCgkgKi8KCUV4ZWNTdG9yZUJ1ZmZlckhlYXBUdXBsZSgmaHNjYW4tPnJzX2N0 dXAsCgkJCQkJCQkgc2xvdCwKCQkJCQkJCSBoc2Nhbi0+cnNfY2J1Zik7CgoJaHNjYW4tPnJz X2NpbmRleCsrOwoKCXJldHVybiB0cnVlOwp9CgpzdGF0aWMgYm9vbApoZWFwYW1fc2Nhbl9z YW1wbGVfbmV4dF9ibG9jayhUYWJsZVNjYW5EZXNjIHNjYW4sIFNhbXBsZVNjYW5TdGF0ZSAq c2NhbnN0YXRlKQp7CglIZWFwU2NhbkRlc2MgaHNjYW4gPSAoSGVhcFNjYW5EZXNjKSBzY2Fu OwoJVHNtUm91dGluZSAqdHNtID0gc2NhbnN0YXRlLT50c21yb3V0aW5lOwoJQmxvY2tOdW1i ZXIgYmxvY2tubzsKCgkvKiByZXR1cm4gZmFsc2UgaW1tZWRpYXRlbHkgaWYgcmVsYXRpb24g aXMgZW1wdHkgKi8KCWlmIChoc2Nhbi0+cnNfbmJsb2NrcyA9PSAwKQoJCXJldHVybiBmYWxz ZTsKCgkvKiByZWxlYXNlIHByZXZpb3VzIHNjYW4gYnVmZmVyLCBpZiBhbnkgKi8KCWlmIChC dWZmZXJJc1ZhbGlkKGhzY2FuLT5yc19jYnVmKSkKCXsKCQlSZWxlYXNlQnVmZmVyKGhzY2Fu LT5yc19jYnVmKTsKCQloc2Nhbi0+cnNfY2J1ZiA9IEludmFsaWRCdWZmZXI7Cgl9CgoJaWYg KHRzbS0+TmV4dFNhbXBsZUJsb2NrKQoJCWJsb2Nrbm8gPSB0c20tPk5leHRTYW1wbGVCbG9j ayhzY2Fuc3RhdGUsIGhzY2FuLT5yc19uYmxvY2tzKTsKCWVsc2UKCXsKCQkvKiBzY2Fubmlu ZyB0YWJsZSBzZXF1ZW50aWFsbHkgKi8KCgkJaWYgKGhzY2FuLT5yc19jYmxvY2sgPT0gSW52 YWxpZEJsb2NrTnVtYmVyKQoJCXsKCQkJQXNzZXJ0KCFoc2Nhbi0+cnNfaW5pdGVkKTsKCQkJ YmxvY2tubyA9IGhzY2FuLT5yc19zdGFydGJsb2NrOwoJCX0KCQllbHNlCgkJewoJCQlBc3Nl cnQoaHNjYW4tPnJzX2luaXRlZCk7CgoJCQlibG9ja25vID0gaHNjYW4tPnJzX2NibG9jayAr IDE7CgoJCQlpZiAoYmxvY2tubyA+PSBoc2Nhbi0+cnNfbmJsb2NrcykKCQkJewoJCQkJLyog d3JhcCB0byBiZWdpbm5pbmcgb2YgcmVsLCBtaWdodCBub3QgaGF2ZSBzdGFydGVkIGF0IDAg Ki8KCQkJCWJsb2Nrbm8gPSAwOwoJCQl9CgoJCQkvKgoJCQkgKiBSZXBvcnQgb3VyIG5ldyBz Y2FuIHBvc2l0aW9uIGZvciBzeW5jaHJvbml6YXRpb24gcHVycG9zZXMuCgkJCSAqCgkJCSAq IE5vdGU6IHdlIGRvIHRoaXMgYmVmb3JlIGNoZWNraW5nIGZvciBlbmQgb2Ygc2NhbiBzbyB0 aGF0IHRoZQoJCQkgKiBmaW5hbCBzdGF0ZSBvZiB0aGUgcG9zaXRpb24gaGludCBpcyBiYWNr IGF0IHRoZSBzdGFydCBvZiB0aGUKCQkJICogcmVsLiAgVGhhdCdzIG5vdCBzdHJpY3RseSBu ZWNlc3NhcnksIGJ1dCBvdGhlcndpc2Ugd2hlbiB5b3UgcnVuCgkJCSAqIHRoZSBzYW1lIHF1 ZXJ5IG11bHRpcGxlIHRpbWVzIHRoZSBzdGFydGluZyBwb3NpdGlvbiB3b3VsZCBzaGlmdAoJ CQkgKiBhIGxpdHRsZSBiaXQgYmFja3dhcmRzIG9uIGV2ZXJ5IGludm9jYXRpb24sIHdoaWNo IGlzIGNvbmZ1c2luZy4KCQkJICogV2UgZG9uJ3QgZ3VhcmFudGVlIGFueSBzcGVjaWZpYyBv cmRlcmluZyBpbiBnZW5lcmFsLCB0aG91Z2guCgkJCSAqLwoJCQlpZiAoc2Nhbi0+cnNfZmxh Z3MgJiBTT19BTExPV19TWU5DKQoJCQkJc3NfcmVwb3J0X2xvY2F0aW9uKHNjYW4tPnJzX3Jk LCBibG9ja25vKTsKCgkJCWlmIChibG9ja25vID09IGhzY2FuLT5yc19zdGFydGJsb2NrKQoJ CQl7CgkJCQlibG9ja25vID0gSW52YWxpZEJsb2NrTnVtYmVyOwoJCQl9CgkJfQoJfQoKCWhz Y2FuLT5yc19jYmxvY2sgPSBibG9ja25vOwoKCWlmICghQmxvY2tOdW1iZXJJc1ZhbGlkKGJs b2Nrbm8pKQoJewoJCWhzY2FuLT5yc19pbml0ZWQgPSBmYWxzZTsKCQlyZXR1cm4gZmFsc2U7 Cgl9CgoJQXNzZXJ0KGhzY2FuLT5yc19jYmxvY2sgPCBoc2Nhbi0+cnNfbmJsb2Nrcyk7CgoJ LyoKCSAqIEJlIHN1cmUgdG8gY2hlY2sgZm9yIGludGVycnVwdHMgYXQgbGVhc3Qgb25jZSBw ZXIgcGFnZS4gIENoZWNrcyBhdAoJICogaGlnaGVyIGNvZGUgbGV2ZWxzIHdvbid0IGJlIGFi bGUgdG8gc3RvcCBhIHNhbXBsZSBzY2FuIHRoYXQgZW5jb3VudGVycwoJICogbWFueSBwYWdl cycgd29ydGggb2YgY29uc2VjdXRpdmUgZGVhZCB0dXBsZXMuCgkgKi8KCUNIRUNLX0ZPUl9J TlRFUlJVUFRTKCk7CgoJLyogUmVhZCBwYWdlIHVzaW5nIHNlbGVjdGVkIHN0cmF0ZWd5ICov Cgloc2Nhbi0+cnNfY2J1ZiA9IFJlYWRCdWZmZXJFeHRlbmRlZChoc2Nhbi0+cnNfYmFzZS5y c19yZCwgTUFJTl9GT1JLTlVNLAoJCQkJCQkJCQkJYmxvY2tubywgUkJNX05PUk1BTCwgaHNj YW4tPnJzX3N0cmF0ZWd5KTsKCgkvKiBpbiBwYWdlbW9kZSwgcHJ1bmUgdGhlIHBhZ2UgYW5k IGRldGVybWluZSB2aXNpYmxlIHR1cGxlIG9mZnNldHMgKi8KCWlmIChoc2Nhbi0+cnNfYmFz ZS5yc19mbGFncyAmIFNPX0FMTE9XX1BBR0VNT0RFKQoJCWhlYXBfcHJlcGFyZV9wYWdlc2Nh bihzY2FuKTsKCgloc2Nhbi0+cnNfaW5pdGVkID0gdHJ1ZTsKCXJldHVybiB0cnVlOwp9Cgpz dGF0aWMgYm9vbApoZWFwYW1fc2Nhbl9zYW1wbGVfbmV4dF90dXBsZShUYWJsZVNjYW5EZXNj IHNjYW4sIFNhbXBsZVNjYW5TdGF0ZSAqc2NhbnN0YXRlLAoJCQkJCQkJICBUdXBsZVRhYmxl U2xvdCAqc2xvdCkKewoJSGVhcFNjYW5EZXNjIGhzY2FuID0gKEhlYXBTY2FuRGVzYykgc2Nh bjsKCVRzbVJvdXRpbmUgKnRzbSA9IHNjYW5zdGF0ZS0+dHNtcm91dGluZTsKCUJsb2NrTnVt YmVyIGJsb2Nrbm8gPSBoc2Nhbi0+cnNfY2Jsb2NrOwoJYm9vbAkJcGFnZW1vZGUgPSAoc2Nh bi0+cnNfZmxhZ3MgJiBTT19BTExPV19QQUdFTU9ERSkgIT0gMDsKCglQYWdlCQlwYWdlOwoJ Ym9vbAkJYWxsX3Zpc2libGU7CglPZmZzZXROdW1iZXIgbWF4b2Zmc2V0OwoKCS8qCgkgKiBX aGVuIG5vdCB1c2luZyBwYWdlbW9kZSwgd2UgbXVzdCBsb2NrIHRoZSBidWZmZXIgZHVyaW5n IHR1cGxlCgkgKiB2aXNpYmlsaXR5IGNoZWNrcy4KCSAqLwoJaWYgKCFwYWdlbW9kZSkKCQlM b2NrQnVmZmVyKGhzY2FuLT5yc19jYnVmLCBCVUZGRVJfTE9DS19TSEFSRSk7CgoJcGFnZSA9 IEJ1ZmZlckdldFBhZ2UoaHNjYW4tPnJzX2NidWYpOwoJYWxsX3Zpc2libGUgPSBQYWdlSXNB bGxWaXNpYmxlKHBhZ2UpICYmCgkJIXNjYW4tPnJzX3NuYXBzaG90LT50YWtlbkR1cmluZ1Jl Y292ZXJ5OwoJbWF4b2Zmc2V0ID0gUGFnZUdldE1heE9mZnNldE51bWJlcihwYWdlKTsKCglm b3IgKDs7KQoJewoJCU9mZnNldE51bWJlciB0dXBvZmZzZXQ7CgoJCUNIRUNLX0ZPUl9JTlRF UlJVUFRTKCk7CgoJCS8qIEFzayB0aGUgdGFibGVzYW1wbGUgbWV0aG9kIHdoaWNoIHR1cGxl cyB0byBjaGVjayBvbiB0aGlzIHBhZ2UuICovCgkJdHVwb2Zmc2V0ID0gdHNtLT5OZXh0U2Ft cGxlVHVwbGUoc2NhbnN0YXRlLAoJCQkJCQkJCQkJIGJsb2Nrbm8sCgkJCQkJCQkJCQkgbWF4 b2Zmc2V0KTsKCgkJaWYgKE9mZnNldE51bWJlcklzVmFsaWQodHVwb2Zmc2V0KSkKCQl7CgkJ CUl0ZW1JZAkJaXRlbWlkOwoJCQlib29sCQl2aXNpYmxlOwoJCQlIZWFwVHVwbGUJdHVwbGUg PSAmKGhzY2FuLT5yc19jdHVwKTsKCgkJCS8qIFNraXAgaW52YWxpZCB0dXBsZSBwb2ludGVy cy4gKi8KCQkJaXRlbWlkID0gUGFnZUdldEl0ZW1JZChwYWdlLCB0dXBvZmZzZXQpOwoJCQlp ZiAoIUl0ZW1JZElzTm9ybWFsKGl0ZW1pZCkpCgkJCQljb250aW51ZTsKCgkJCXR1cGxlLT50 X2RhdGEgPSAoSGVhcFR1cGxlSGVhZGVyKSBQYWdlR2V0SXRlbShwYWdlLCBpdGVtaWQpOwoJ CQl0dXBsZS0+dF9sZW4gPSBJdGVtSWRHZXRMZW5ndGgoaXRlbWlkKTsKCQkJSXRlbVBvaW50 ZXJTZXQoJih0dXBsZS0+dF9zZWxmKSwgYmxvY2tubywgdHVwb2Zmc2V0KTsKCgoJCQlpZiAo YWxsX3Zpc2libGUpCgkJCQl2aXNpYmxlID0gdHJ1ZTsKCQkJZWxzZQoJCQkJdmlzaWJsZSA9 IFNhbXBsZUhlYXBUdXBsZVZpc2libGUoc2NhbiwgaHNjYW4tPnJzX2NidWYsCgkJCQkJCQkJ CQkJCSB0dXBsZSwgdHVwb2Zmc2V0KTsKCgkJCS8qIGluIHBhZ2Vtb2RlLCBoZWFwX3ByZXBh cmVfcGFnZXNjYW4gZGlkIHRoaXMgZm9yIHVzICovCgkJCWlmICghcGFnZW1vZGUpCgkJCQlI ZWFwQ2hlY2tGb3JTZXJpYWxpemFibGVDb25mbGljdE91dCh2aXNpYmxlLCBzY2FuLT5yc19y ZCwgdHVwbGUsCgkJCQkJCQkJCQkJCQloc2Nhbi0+cnNfY2J1Ziwgc2Nhbi0+cnNfc25hcHNo b3QpOwoKCQkJLyogVHJ5IG5leHQgdHVwbGUgZnJvbSBzYW1lIHBhZ2UuICovCgkJCWlmICgh dmlzaWJsZSkKCQkJCWNvbnRpbnVlOwoKCQkJLyogRm91bmQgdmlzaWJsZSB0dXBsZSwgcmV0 dXJuIGl0LiAqLwoJCQlpZiAoIXBhZ2Vtb2RlKQoJCQkJTG9ja0J1ZmZlcihoc2Nhbi0+cnNf Y2J1ZiwgQlVGRkVSX0xPQ0tfVU5MT0NLKTsKCgkJCUV4ZWNTdG9yZUJ1ZmZlckhlYXBUdXBs ZSh0dXBsZSwgc2xvdCwgaHNjYW4tPnJzX2NidWYpOwoKCQkJLyogQ291bnQgc3VjY2Vzc2Z1 bGx5LWZldGNoZWQgdHVwbGVzIGFzIGhlYXAgZmV0Y2hlcyAqLwoJCQlwZ3N0YXRfY291bnRf aGVhcF9nZXRuZXh0KHNjYW4tPnJzX3JkKTsKCgkJCXJldHVybiB0cnVlOwoJCX0KCQllbHNl CgkJewoJCQkvKgoJCQkgKiBJZiB3ZSBnZXQgaGVyZSwgaXQgbWVhbnMgd2UndmUgZXhoYXVz dGVkIHRoZSBpdGVtcyBvbiB0aGlzIHBhZ2UKCQkJICogYW5kIGl0J3MgdGltZSB0byBtb3Zl IHRvIHRoZSBuZXh0LgoJCQkgKi8KCQkJaWYgKCFwYWdlbW9kZSkKCQkJCUxvY2tCdWZmZXIo aHNjYW4tPnJzX2NidWYsIEJVRkZFUl9MT0NLX1VOTE9DSyk7CgoJCQlFeGVjQ2xlYXJUdXBs ZShzbG90KTsKCQkJcmV0dXJuIGZhbHNlOwoJCX0KCX0KCglBc3NlcnQoMCk7Cn0KCgovKiAt LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAqICBIZWxwZXIgZnVuY3Rpb25zIGZvciB0aGUgYWJv dmUuCiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICovCgovKgogKiBSZWNvbnN0cnVjdCBh bmQgcmV3cml0ZSB0aGUgZ2l2ZW4gdHVwbGUKICoKICogV2UgY2Fubm90IHNpbXBseSBjb3B5 IHRoZSB0dXBsZSBhcy1pcywgZm9yIHNldmVyYWwgcmVhc29uczoKICoKICogMS4gV2UnZCBs aWtlIHRvIHNxdWVlemUgb3V0IHRoZSB2YWx1ZXMgb2YgYW55IGRyb3BwZWQgY29sdW1ucywg Ym90aAogKiB0byBzYXZlIHNwYWNlIGFuZCB0byBlbnN1cmUgd2UgaGF2ZSBubyBjb3JuZXIt Y2FzZSBmYWlsdXJlcy4gKEl0J3MKICogcG9zc2libGUgZm9yIGV4YW1wbGUgdGhhdCB0aGUg bmV3IHRhYmxlIGhhc24ndCBnb3QgYSBUT0FTVCB0YWJsZQogKiBhbmQgc28gaXMgdW5hYmxl IHRvIHN0b3JlIGFueSBsYXJnZSB2YWx1ZXMgb2YgZHJvcHBlZCBjb2xzLikKICoKICogMi4g VGhlIHR1cGxlIG1pZ2h0IG5vdCBldmVuIGJlIGxlZ2FsIGZvciB0aGUgbmV3IHRhYmxlOyB0 aGlzIGlzCiAqIGN1cnJlbnRseSBvbmx5IGtub3duIHRvIGhhcHBlbiBhcyBhbiBhZnRlci1l ZmZlY3Qgb2YgQUxURVIgVEFCTEUKICogU0VUIFdJVEhPVVQgT0lEUy4KICoKICogU28sIHdl IG11c3QgcmVjb25zdHJ1Y3QgdGhlIHR1cGxlIGZyb20gY29tcG9uZW50IERhdHVtcy4KICov CnN0YXRpYyB2b2lkCnJlZm9ybV9hbmRfcmV3cml0ZV90dXBsZShIZWFwVHVwbGUgdHVwbGUs CgkJCQkJCSBSZWxhdGlvbiBPbGRIZWFwLCBSZWxhdGlvbiBOZXdIZWFwLAoJCQkJCQkgRGF0 dW0gKnZhbHVlcywgYm9vbCAqaXNudWxsLCBSZXdyaXRlU3RhdGUgcndzdGF0ZSkKewoJSGVh cFR1cGxlCW5ld3R1cGxlOwoKCW5ld3R1cGxlID0gcmVmb3JtX3R1cGxlKHR1cGxlLCBPbGRI ZWFwLCBOZXdIZWFwLCB2YWx1ZXMsIGlzbnVsbCk7CgoJLyogVGhlIGhlYXAgcmV3cml0ZSBt b2R1bGUgZG9lcyB0aGUgcmVzdCAqLwoJcmV3cml0ZV9oZWFwX3R1cGxlKHJ3c3RhdGUsIHR1 cGxlLCBuZXd0dXBsZSk7CgoJaGVhcF9mcmVldHVwbGUobmV3dHVwbGUpOwp9CgovKgogKiBJ bnNlcnQgdHVwbGUgd2hlbiBwcm9jZXNzaW5nIFJFUEFDSyBDT05DVVJSRU5UTFkuCiAqCiAq IHJld3JpdGVoZWFwLmMgaXMgbm90IHVzZWQgaW4gdGhlIENPTkNVUlJFTlRMWSBjYXNlIGJl Y2F1c2UgaXQnZCBiZQogKiBkaWZmaWN1bHQgdG8gZG8gdGhlIHNhbWUgaW4gdGhlIGNhdGNo LXVwIHBoYXNlIChhcyB0aGUgbG9naWNhbAogKiBkZWNvZGluZyBkb2VzIG5vdCBwcm92aWRl IHVzIHdpdGggc3VmZmljaWVudCB2aXNpYmlsaXR5CiAqIGluZm9ybWF0aW9uKS4gVGh1cyB3 ZSBtdXN0IHVzZSBoZWFwX2luc2VydCgpIGJvdGggZHVyaW5nIHRoZQogKiBjYXRjaC11cCBh bmQgaGVyZS4KICoKICogV2UgcGFzcyB0aGUgTk9fTE9HSUNBTCBmbGFnIHRvIGhlYXBfaW5z ZXJ0KCkgaW4gb3JkZXIgdG8gc2tpcCBsb2dpY2FsCiAqIGRlY29kaW5nOiBhcyBzb29uIGFz IFJFUEFDSyBDT05DVVJSRU5UTFkgc3dhcHMgdGhlIHJlbGF0aW9uIGZpbGVzLCBpdCBkcm9w cwogKiB0aGlzIHJlbGF0aW9uLCBzbyBubyBsb2dpY2FsIHJlcGxpY2F0aW9uIHN1YnNjcmlw dGlvbiBzaG91bGQgbmVlZCB0aGUgZGF0YS4KICoKICogQnVsa0luc2VydFN0YXRlIGlzIHVz ZWQgYmVjYXVzZSBtYW55IHR1cGxlcyBhcmUgaW5zZXJ0ZWQgaW4gdGhlIHR5cGljYWwKICog Y2FzZS4KICovCnN0YXRpYyB2b2lkCmhlYXBfaW5zZXJ0X2Zvcl9yZXBhY2soSGVhcFR1cGxl IHR1cGxlLCBSZWxhdGlvbiBPbGRIZWFwLCBSZWxhdGlvbiBOZXdIZWFwLAoJCQkJCSAgIERh dHVtICp2YWx1ZXMsIGJvb2wgKmlzbnVsbCwgQnVsa0luc2VydFN0YXRlIGJpc3RhdGUpCnsK CUhlYXBUdXBsZQluZXd0dXBsZTsKCgluZXd0dXBsZSA9IHJlZm9ybV90dXBsZSh0dXBsZSwg T2xkSGVhcCwgTmV3SGVhcCwgdmFsdWVzLCBpc251bGwpOwoKCWhlYXBfaW5zZXJ0KE5ld0hl YXAsIG5ld3R1cGxlLCBHZXRDdXJyZW50Q29tbWFuZElkKHRydWUpLAoJCQkJSEVBUF9JTlNF UlRfTk9fTE9HSUNBTCwgYmlzdGF0ZSk7CgoJaGVhcF9mcmVldHVwbGUobmV3dHVwbGUpOwp9 CgovKgogKiBTdWJyb3V0aW5lIGZvciByZWZvcm1fYW5kX3Jld3JpdGVfdHVwbGUgYW5kIGhl YXBfaW5zZXJ0X2Zvcl9yZXBhY2suCiAqCiAqIERlZm9ybSB0aGUgZ2l2ZW4gdHVwbGUsIHNl dCB2YWx1ZXMgb2YgZHJvcHBlZCBjb2x1bW5zIHRvIE5VTEwsIGFuZCBmaWxsIGluCiAqIGFu eSB2YWx1ZXMgZnJvbSBhdHRtaXNzaW5ndmFsOyB0aGVuIGZvcm0gYSBuZXcgdHVwbGUgYW5k IHJldHVybiBpdC4gIElmIG5vCiAqIGF0dHJpYnV0ZXMgbmVlZCB0byBiZSBjaGFuZ2VkLCBh IGNvcHkgb2YgdGhlIG9yaWdpbmFsIHR1cGxlIGlzIHJldHVybmVkLgogKiBDYWxsZXIgaXMg cmVzcG9uc2libGUgZm9yIGZyZWVpbmcgdGhlIHJldHVybmVkIHR1cGxlLgogKgogKiBYWFgg dGhpcyBjb2RpbmcgYXNzdW1lcyB0aGF0IGJvdGggcmVsYXRpb25zIGhhdmUgdGhlIHNhbWUg dHVwbGVkZXNjLgogKi8Kc3RhdGljIEhlYXBUdXBsZQpyZWZvcm1fdHVwbGUoSGVhcFR1cGxl IHR1cGxlLCBSZWxhdGlvbiBPbGRIZWFwLCBSZWxhdGlvbiBOZXdIZWFwLAoJCQkgRGF0dW0g KnZhbHVlcywgYm9vbCAqaXNudWxsKQp7CglUdXBsZURlc2MJb2xkVHVwRGVzYyA9IFJlbGF0 aW9uR2V0RGVzY3IoT2xkSGVhcCk7CglUdXBsZURlc2MJbmV3VHVwRGVzYyA9IFJlbGF0aW9u R2V0RGVzY3IoTmV3SGVhcCk7Cglib29sCQluZWVkc19yZWZvcm0gPSBmYWxzZTsKCgkvKgoJ ICogQSBzaG9ydCB0dXBsZSBtaWdodCByZXF1aXJlIHZhbHVlcyBmcm9tIGF0dG1pc3Npbmcg dmFsLCBzbyBhY3RpdmF0ZSB0aGUKCSAqIGNvZGluZyB1bmNvbmRpdGlvbmFsbHkgaW4gdGhh dCBjYXNlLiAgVGhlIHZhbHVlIG1pZ2h0IGxlZ2l0aW1hbGx5IGJlCgkgKiBOVUxMIG90aGVy d2lzZSwgc28gdGhpcyBpcyBzbGlnaHRseSB3YXN0ZWZ1bCwgYnV0IGl0IHByb2JhYmx5IGJl YXRzCgkgKiBoYXZpbmcgdG8gdGVzdCBlYWNoIGF0dHJpYnV0ZSBmb3IgcHJlc2VuY2Ugb2Yg YXR0bWlzc2luZ3ZhbCBlYWNoIHRpbWUuCgkgKi8KCWlmIChIZWFwVHVwbGVIZWFkZXJHZXRO YXR0cyh0dXBsZS0+dF9kYXRhKSA8IG5ld1R1cERlc2MtPm5hdHRzKQoJCW5lZWRzX3JlZm9y bSA9IHRydWU7CgoJLyoKCSAqIElmIHRoZSBjb2x1bW4gaGFzIGJlZW4gZHJvcHBlZCBidXQg YSB2YWx1ZSBpcyBzdGlsbCBwcmVzZW50LCB3ZSBjYW4KCSAqIG9wdGltaXplIHN0b3JhZ2Ug bm93IGJ5IGdldHRpbmcgcmlkIG9mIGl0LgoJICovCglpZiAoIW5lZWRzX3JlZm9ybSkKCXsK CQlmb3IgKGludCBpID0gMDsgaSA8IG5ld1R1cERlc2MtPm5hdHRzOyBpKyspCgkJewoJCQlp ZiAoVHVwbGVEZXNjQ29tcGFjdEF0dHIobmV3VHVwRGVzYywgaSktPmF0dGlzZHJvcHBlZCAm JgoJCQkJIWhlYXBfYXR0aXNudWxsKHR1cGxlLCBpICsgMSwgbmV3VHVwRGVzYykpCgkJCXsK CQkJCW5lZWRzX3JlZm9ybSA9IHRydWU7CgkJCQlicmVhazsKCQkJfQoJCX0KCX0KCgkvKiBT a2lwIHdvcmsgaWYgbm8gY2hhbmdlcyBhcmUgbmVlZGVkICovCglpZiAoIW5lZWRzX3JlZm9y bSkKCQlyZXR1cm4gaGVhcF9jb3B5dHVwbGUodHVwbGUpOwoKCWhlYXBfZGVmb3JtX3R1cGxl KHR1cGxlLCBvbGRUdXBEZXNjLCB2YWx1ZXMsIGlzbnVsbCk7CgoJZm9yIChpbnQgaSA9IDA7 IGkgPCBuZXdUdXBEZXNjLT5uYXR0czsgaSsrKQoJewoJCWlmIChUdXBsZURlc2NDb21wYWN0 QXR0cihuZXdUdXBEZXNjLCBpKS0+YXR0aXNkcm9wcGVkKQoJCQlpc251bGxbaV0gPSB0cnVl OwoJfQoKCXJldHVybiBoZWFwX2Zvcm1fdHVwbGUobmV3VHVwRGVzYywgdmFsdWVzLCBpc251 bGwpOwp9CgovKgogKiBDaGVjayB2aXNpYmlsaXR5IG9mIHRoZSB0dXBsZS4KICovCnN0YXRp YyBib29sClNhbXBsZUhlYXBUdXBsZVZpc2libGUoVGFibGVTY2FuRGVzYyBzY2FuLCBCdWZm ZXIgYnVmZmVyLAoJCQkJCSAgIEhlYXBUdXBsZSB0dXBsZSwKCQkJCQkgICBPZmZzZXROdW1i ZXIgdHVwb2Zmc2V0KQp7CglIZWFwU2NhbkRlc2MgaHNjYW4gPSAoSGVhcFNjYW5EZXNjKSBz Y2FuOwoKCWlmIChzY2FuLT5yc19mbGFncyAmIFNPX0FMTE9XX1BBR0VNT0RFKQoJewoJCXVp bnQzMgkJc3RhcnQgPSAwLAoJCQkJCWVuZCA9IGhzY2FuLT5yc19udHVwbGVzOwoKCQkvKgoJ CSAqIEluIHBhZ2VhdGF0aW1lIG1vZGUsIGhlYXBfcHJlcGFyZV9wYWdlc2NhbigpIGFscmVh ZHkgZGlkIHZpc2liaWxpdHkKCQkgKiBjaGVja3MsIHNvIGp1c3QgbG9vayBhdCB0aGUgaW5m byBpdCBsZWZ0IGluIHJzX3Zpc3R1cGxlc1tdLgoJCSAqCgkJICogV2UgdXNlIGEgYmluYXJ5 IHNlYXJjaCBvdmVyIHRoZSBrbm93bi1zb3J0ZWQgYXJyYXkuICBOb3RlOiB3ZSBjb3VsZAoJ CSAqIHNhdmUgc29tZSBlZmZvcnQgaWYgd2UgaW5zaXN0ZWQgdGhhdCBOZXh0U2FtcGxlVHVw bGUgc2VsZWN0IHR1cGxlcwoJCSAqIGluIGluY3JlYXNpbmcgb3JkZXIsIGJ1dCBpdCdzIG5v dCBjbGVhciB0aGF0IHRoZXJlIHdvdWxkIGJlIGVub3VnaAoJCSAqIGdhaW4gdG8ganVzdGlm eSB0aGUgcmVzdHJpY3Rpb24uCgkJICovCgkJd2hpbGUgKHN0YXJ0IDwgZW5kKQoJCXsKCQkJ dWludDMyCQltaWQgPSBzdGFydCArIChlbmQgLSBzdGFydCkgLyAyOwoJCQlPZmZzZXROdW1i ZXIgY3Vyb2Zmc2V0ID0gaHNjYW4tPnJzX3Zpc3R1cGxlc1ttaWRdOwoKCQkJaWYgKHR1cG9m ZnNldCA9PSBjdXJvZmZzZXQpCgkJCQlyZXR1cm4gdHJ1ZTsKCQkJZWxzZSBpZiAodHVwb2Zm c2V0IDwgY3Vyb2Zmc2V0KQoJCQkJZW5kID0gbWlkOwoJCQllbHNlCgkJCQlzdGFydCA9IG1p ZCArIDE7CgkJfQoKCQlyZXR1cm4gZmFsc2U7Cgl9CgllbHNlCgl7CgkJLyogT3RoZXJ3aXNl LCB3ZSBoYXZlIHRvIGNoZWNrIHRoZSB0dXBsZSBpbmRpdmlkdWFsbHkuICovCgkJcmV0dXJu IEhlYXBUdXBsZVNhdGlzZmllc1Zpc2liaWxpdHkodHVwbGUsIHNjYW4tPnJzX3NuYXBzaG90 LAoJCQkJCQkJCQkJCWJ1ZmZlcik7Cgl9Cn0KCi8qCiAqIEhlbHBlciBmdW5jdGlvbiBnZXQg dGhlIG5leHQgYmxvY2sgb2YgYSBiaXRtYXAgaGVhcCBzY2FuLiBSZXR1cm5zIHRydWUgd2hl bgogKiBpdCBnb3QgdGhlIG5leHQgYmxvY2sgYW5kIHNhdmVkIGl0IGluIHRoZSBzY2FuIGRl c2NyaXB0b3IgYW5kIGZhbHNlIHdoZW4KICogdGhlIGJpdG1hcCBhbmQgb3IgcmVsYXRpb24g YXJlIGV4aGF1c3RlZC4KICovCnN0YXRpYyBib29sCkJpdG1hcEhlYXBTY2FuTmV4dEJsb2Nr KFRhYmxlU2NhbkRlc2Mgc2NhbiwKCQkJCQkJYm9vbCAqcmVjaGVjaywKCQkJCQkJdWludDY0 ICpsb3NzeV9wYWdlcywgdWludDY0ICpleGFjdF9wYWdlcykKewoJQml0bWFwSGVhcFNjYW5E ZXNjIGJzY2FuID0gKEJpdG1hcEhlYXBTY2FuRGVzYykgc2NhbjsKCUhlYXBTY2FuRGVzYyBo c2NhbiA9IChIZWFwU2NhbkRlc2MpIGJzY2FuOwoJQmxvY2tOdW1iZXIgYmxvY2s7Cgl2b2lk CSAgICpwZXJfYnVmZmVyX2RhdGE7CglCdWZmZXIJCWJ1ZmZlcjsKCVNuYXBzaG90CXNuYXBz aG90OwoJaW50CQkJbnR1cDsKCVRCTUl0ZXJhdGVSZXN1bHQgKnRibXJlczsKCU9mZnNldE51 bWJlciBvZmZzZXRzW1RCTV9NQVhfVFVQTEVTX1BFUl9QQUdFXTsKCWludAkJCW5vZmZzZXRz ID0gLTE7CgoJQXNzZXJ0KHNjYW4tPnJzX2ZsYWdzICYgU09fVFlQRV9CSVRNQVBTQ0FOKTsK CUFzc2VydChoc2Nhbi0+cnNfcmVhZF9zdHJlYW0pOwoKCWhzY2FuLT5yc19jaW5kZXggPSAw OwoJaHNjYW4tPnJzX250dXBsZXMgPSAwOwoKCS8qIFJlbGVhc2UgYnVmZmVyIGNvbnRhaW5p bmcgcHJldmlvdXMgYmxvY2suICovCglpZiAoQnVmZmVySXNWYWxpZChoc2Nhbi0+cnNfY2J1 ZikpCgl7CgkJUmVsZWFzZUJ1ZmZlcihoc2Nhbi0+cnNfY2J1Zik7CgkJaHNjYW4tPnJzX2Ni dWYgPSBJbnZhbGlkQnVmZmVyOwoJfQoKCWhzY2FuLT5yc19jYnVmID0gcmVhZF9zdHJlYW1f bmV4dF9idWZmZXIoaHNjYW4tPnJzX3JlYWRfc3RyZWFtLAoJCQkJCQkJCQkJCSAmcGVyX2J1 ZmZlcl9kYXRhKTsKCglpZiAoQnVmZmVySXNJbnZhbGlkKGhzY2FuLT5yc19jYnVmKSkKCXsK CQkvKiB0aGUgYml0bWFwIGlzIGV4aGF1c3RlZCAqLwoJCXJldHVybiBmYWxzZTsKCX0KCglB c3NlcnQocGVyX2J1ZmZlcl9kYXRhKTsKCgl0Ym1yZXMgPSBwZXJfYnVmZmVyX2RhdGE7CgoJ QXNzZXJ0KEJsb2NrTnVtYmVySXNWYWxpZCh0Ym1yZXMtPmJsb2Nrbm8pKTsKCUFzc2VydChC dWZmZXJHZXRCbG9ja051bWJlcihoc2Nhbi0+cnNfY2J1ZikgPT0gdGJtcmVzLT5ibG9ja25v KTsKCgkvKiBFeGFjdCBwYWdlcyBuZWVkIHRoZWlyIHR1cGxlIG9mZnNldHMgZXh0cmFjdGVk LiAqLwoJaWYgKCF0Ym1yZXMtPmxvc3N5KQoJCW5vZmZzZXRzID0gdGJtX2V4dHJhY3RfcGFn ZV90dXBsZSh0Ym1yZXMsIG9mZnNldHMsCgkJCQkJCQkJCQkgIFRCTV9NQVhfVFVQTEVTX1BF Ul9QQUdFKTsKCgkqcmVjaGVjayA9IHRibXJlcy0+cmVjaGVjazsKCglibG9jayA9IGhzY2Fu LT5yc19jYmxvY2sgPSB0Ym1yZXMtPmJsb2Nrbm87CglidWZmZXIgPSBoc2Nhbi0+cnNfY2J1 ZjsKCXNuYXBzaG90ID0gc2Nhbi0+cnNfc25hcHNob3Q7CgoJbnR1cCA9IDA7CgoJLyoKCSAq IFBydW5lIGFuZCByZXBhaXIgZnJhZ21lbnRhdGlvbiBmb3IgdGhlIHdob2xlIHBhZ2UsIGlm IHBvc3NpYmxlLgoJICovCgloZWFwX3BhZ2VfcHJ1bmVfb3B0KHNjYW4tPnJzX3JkLCBidWZm ZXIsICZoc2Nhbi0+cnNfdm1idWZmZXIsCgkJCQkJCXNjYW4tPnJzX2ZsYWdzICYgU09fSElO VF9SRUxfUkVBRF9PTkxZKTsKCgkvKgoJICogV2UgbXVzdCBob2xkIHNoYXJlIGxvY2sgb24g dGhlIGJ1ZmZlciBjb250ZW50IHdoaWxlIGV4YW1pbmluZyB0dXBsZQoJICogdmlzaWJpbGl0 eS4gIEFmdGVyd2FyZHMsIGhvd2V2ZXIsIHRoZSB0dXBsZXMgd2UgaGF2ZSBmb3VuZCB0byBi ZQoJICogdmlzaWJsZSBhcmUgZ3VhcmFudGVlZCBnb29kIGFzIGxvbmcgYXMgd2UgaG9sZCB0 aGUgYnVmZmVyIHBpbi4KCSAqLwoJTG9ja0J1ZmZlcihidWZmZXIsIEJVRkZFUl9MT0NLX1NI QVJFKTsKCgkvKgoJICogV2UgbmVlZCB0d28gc2VwYXJhdGUgc3RyYXRlZ2llcyBmb3IgbG9z c3kgYW5kIG5vbi1sb3NzeSBjYXNlcy4KCSAqLwoJaWYgKCF0Ym1yZXMtPmxvc3N5KQoJewoJ CS8qCgkJICogQml0bWFwIGlzIG5vbi1sb3NzeSwgc28gd2UganVzdCBsb29rIHRocm91Z2gg dGhlIG9mZnNldHMgbGlzdGVkIGluCgkJICogdGJtcmVzOyBidXQgd2UgaGF2ZSB0byBmb2xs b3cgYW55IEhPVCBjaGFpbiBzdGFydGluZyBhdCBlYWNoIHN1Y2gKCQkgKiBvZmZzZXQuCgkJ ICovCgkJaW50CQkJY3Vyc2xvdDsKCgkJLyogV2UgbXVzdCBoYXZlIGV4dHJhY3RlZCB0aGUg dHVwbGUgb2Zmc2V0cyBieSBub3cgKi8KCQlBc3NlcnQobm9mZnNldHMgPiAtMSk7CgoJCWZv ciAoY3Vyc2xvdCA9IDA7IGN1cnNsb3QgPCBub2Zmc2V0czsgY3Vyc2xvdCsrKQoJCXsKCQkJ T2Zmc2V0TnVtYmVyIG9mZm51bSA9IG9mZnNldHNbY3Vyc2xvdF07CgkJCUl0ZW1Qb2ludGVy RGF0YSB0aWQ7CgkJCUhlYXBUdXBsZURhdGEgaGVhcFR1cGxlOwoKCQkJSXRlbVBvaW50ZXJT ZXQoJnRpZCwgYmxvY2ssIG9mZm51bSk7CgkJCWlmIChoZWFwX2hvdF9zZWFyY2hfYnVmZmVy KCZ0aWQsIHNjYW4tPnJzX3JkLCBidWZmZXIsIHNuYXBzaG90LAoJCQkJCQkJCQkgICAmaGVh cFR1cGxlLCBOVUxMLCB0cnVlKSkKCQkJCWhzY2FuLT5yc192aXN0dXBsZXNbbnR1cCsrXSA9 IEl0ZW1Qb2ludGVyR2V0T2Zmc2V0TnVtYmVyKCZ0aWQpOwoJCX0KCX0KCWVsc2UKCXsKCQkv KgoJCSAqIEJpdG1hcCBpcyBsb3NzeSwgc28gd2UgbXVzdCBleGFtaW5lIGVhY2ggbGluZSBw b2ludGVyIG9uIHRoZSBwYWdlLgoJCSAqIEJ1dCB3ZSBjYW4gaWdub3JlIEhPVCBjaGFpbnMs IHNpbmNlIHdlJ2xsIGNoZWNrIGVhY2ggdHVwbGUgYW55d2F5LgoJCSAqLwoJCVBhZ2UJCXBh Z2UgPSBCdWZmZXJHZXRQYWdlKGJ1ZmZlcik7CgkJT2Zmc2V0TnVtYmVyIG1heG9mZiA9IFBh Z2VHZXRNYXhPZmZzZXROdW1iZXIocGFnZSk7CgkJT2Zmc2V0TnVtYmVyIG9mZm51bTsKCgkJ Zm9yIChvZmZudW0gPSBGaXJzdE9mZnNldE51bWJlcjsgb2ZmbnVtIDw9IG1heG9mZjsgb2Zm bnVtID0gT2Zmc2V0TnVtYmVyTmV4dChvZmZudW0pKQoJCXsKCQkJSXRlbUlkCQlscDsKCQkJ SGVhcFR1cGxlRGF0YSBsb2N0dXA7CgkJCWJvb2wJCXZhbGlkOwoKCQkJbHAgPSBQYWdlR2V0 SXRlbUlkKHBhZ2UsIG9mZm51bSk7CgkJCWlmICghSXRlbUlkSXNOb3JtYWwobHApKQoJCQkJ Y29udGludWU7CgkJCWxvY3R1cC50X2RhdGEgPSAoSGVhcFR1cGxlSGVhZGVyKSBQYWdlR2V0 SXRlbShwYWdlLCBscCk7CgkJCWxvY3R1cC50X2xlbiA9IEl0ZW1JZEdldExlbmd0aChscCk7 CgkJCWxvY3R1cC50X3RhYmxlT2lkID0gc2Nhbi0+cnNfcmQtPnJkX2lkOwoJCQlJdGVtUG9p bnRlclNldCgmbG9jdHVwLnRfc2VsZiwgYmxvY2ssIG9mZm51bSk7CgkJCXZhbGlkID0gSGVh cFR1cGxlU2F0aXNmaWVzVmlzaWJpbGl0eSgmbG9jdHVwLCBzbmFwc2hvdCwgYnVmZmVyKTsK CQkJaWYgKHZhbGlkKQoJCQl7CgkJCQloc2Nhbi0+cnNfdmlzdHVwbGVzW250dXArK10gPSBv ZmZudW07CgkJCQlQcmVkaWNhdGVMb2NrVElEKHNjYW4tPnJzX3JkLCAmbG9jdHVwLnRfc2Vs Ziwgc25hcHNob3QsCgkJCQkJCQkJIEhlYXBUdXBsZUhlYWRlckdldFhtaW4obG9jdHVwLnRf ZGF0YSkpOwoJCQl9CgkJCUhlYXBDaGVja0ZvclNlcmlhbGl6YWJsZUNvbmZsaWN0T3V0KHZh bGlkLCBzY2FuLT5yc19yZCwgJmxvY3R1cCwKCQkJCQkJCQkJCQkJYnVmZmVyLCBzbmFwc2hv dCk7CgkJfQoJfQoKCUxvY2tCdWZmZXIoYnVmZmVyLCBCVUZGRVJfTE9DS19VTkxPQ0spOwoK CUFzc2VydChudHVwIDw9IE1heEhlYXBUdXBsZXNQZXJQYWdlKTsKCWhzY2FuLT5yc19udHVw bGVzID0gbnR1cDsKCglpZiAodGJtcmVzLT5sb3NzeSkKCQkoKmxvc3N5X3BhZ2VzKSsrOwoJ ZWxzZQoJCSgqZXhhY3RfcGFnZXMpKys7CgoJLyoKCSAqIFJldHVybiB0cnVlIHRvIGluZGlj YXRlIHRoYXQgYSB2YWxpZCBibG9jayB3YXMgZm91bmQgYW5kIHRoZSBiaXRtYXAgaXMKCSAq IG5vdCBleGhhdXN0ZWQuIElmIHRoZXJlIGFyZSBubyB2aXNpYmxlIHR1cGxlcyBvbiB0aGlz IHBhZ2UsCgkgKiBoc2Nhbi0+cnNfbnR1cGxlcyB3aWxsIGJlIDAgYW5kIGhlYXBhbV9zY2Fu X2JpdG1hcF9uZXh0X3R1cGxlKCkgd2lsbAoJICogcmV0dXJuIGZhbHNlIHJldHVybmluZyBj b250cm9sIHRvIHRoaXMgZnVuY3Rpb24gdG8gYWR2YW5jZSB0byB0aGUgbmV4dAoJICogYmxv Y2sgaW4gdGhlIGJpdG1hcC4KCSAqLwoJcmV0dXJuIHRydWU7Cn0KCi8qIC0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLQogKiBEZWZpbml0aW9uIG9mIHRoZSBoZWFwIHRhYmxlIGFjY2VzcyBtZXRob2Qu CiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogKi8KCnN0YXRpYyBjb25zdCBUYWJsZUFtUm91dGlu ZSBoZWFwYW1fbWV0aG9kcyA9IHsKCS50eXBlID0gVF9UYWJsZUFtUm91dGluZSwKCgkuc2xv dF9jYWxsYmFja3MgPSBoZWFwYW1fc2xvdF9jYWxsYmFja3MsCgoJLnNjYW5fYmVnaW4gPSBo ZWFwX2JlZ2luc2NhbiwKCS5zY2FuX2VuZCA9IGhlYXBfZW5kc2NhbiwKCS5zY2FuX3Jlc2Nh biA9IGhlYXBfcmVzY2FuLAoJLnNjYW5fZ2V0bmV4dHNsb3QgPSBoZWFwX2dldG5leHRzbG90 LAoKCS5zY2FuX3NldF90aWRyYW5nZSA9IGhlYXBfc2V0X3RpZHJhbmdlLAoJLnNjYW5fZ2V0 bmV4dHNsb3RfdGlkcmFuZ2UgPSBoZWFwX2dldG5leHRzbG90X3RpZHJhbmdlLAoKCS5wYXJh bGxlbHNjYW5fZXN0aW1hdGUgPSB0YWJsZV9ibG9ja19wYXJhbGxlbHNjYW5fZXN0aW1hdGUs CgkucGFyYWxsZWxzY2FuX2luaXRpYWxpemUgPSB0YWJsZV9ibG9ja19wYXJhbGxlbHNjYW5f aW5pdGlhbGl6ZSwKCS5wYXJhbGxlbHNjYW5fcmVpbml0aWFsaXplID0gdGFibGVfYmxvY2tf cGFyYWxsZWxzY2FuX3JlaW5pdGlhbGl6ZSwKCgkuaW5kZXhfZmV0Y2hfYmVnaW4gPSBoZWFw YW1faW5kZXhfZmV0Y2hfYmVnaW4sCgkuaW5kZXhfZmV0Y2hfcmVzZXQgPSBoZWFwYW1faW5k ZXhfZmV0Y2hfcmVzZXQsCgkuaW5kZXhfZmV0Y2hfZW5kID0gaGVhcGFtX2luZGV4X2ZldGNo X2VuZCwKCS5pbmRleF9mZXRjaF90dXBsZSA9IGhlYXBhbV9pbmRleF9mZXRjaF90dXBsZSwK CgkudHVwbGVfaW5zZXJ0ID0gaGVhcGFtX3R1cGxlX2luc2VydCwKCS50dXBsZV9pbnNlcnRf c3BlY3VsYXRpdmUgPSBoZWFwYW1fdHVwbGVfaW5zZXJ0X3NwZWN1bGF0aXZlLAoJLnR1cGxl X2NvbXBsZXRlX3NwZWN1bGF0aXZlID0gaGVhcGFtX3R1cGxlX2NvbXBsZXRlX3NwZWN1bGF0 aXZlLAoJLm11bHRpX2luc2VydCA9IGhlYXBfbXVsdGlfaW5zZXJ0LAoJLnR1cGxlX2RlbGV0 ZSA9IGhlYXBhbV90dXBsZV9kZWxldGUsCgkudHVwbGVfdXBkYXRlID0gaGVhcGFtX3R1cGxl X3VwZGF0ZSwKCS50dXBsZV9sb2NrID0gaGVhcGFtX3R1cGxlX2xvY2ssCgoJLnR1cGxlX2Zl dGNoX3Jvd192ZXJzaW9uID0gaGVhcGFtX2ZldGNoX3Jvd192ZXJzaW9uLAoJLnR1cGxlX2dl dF9sYXRlc3RfdGlkID0gaGVhcF9nZXRfbGF0ZXN0X3RpZCwKCS50dXBsZV90aWRfdmFsaWQg PSBoZWFwYW1fdHVwbGVfdGlkX3ZhbGlkLAoJLnR1cGxlX3NhdGlzZmllc19zbmFwc2hvdCA9 IGhlYXBhbV90dXBsZV9zYXRpc2ZpZXNfc25hcHNob3QsCgkuaW5kZXhfZGVsZXRlX3R1cGxl cyA9IGhlYXBfaW5kZXhfZGVsZXRlX3R1cGxlcywKCgkucmVsYXRpb25fc2V0X25ld19maWxl bG9jYXRvciA9IGhlYXBhbV9yZWxhdGlvbl9zZXRfbmV3X2ZpbGVsb2NhdG9yLAoJLnJlbGF0 aW9uX25vbnRyYW5zYWN0aW9uYWxfdHJ1bmNhdGUgPSBoZWFwYW1fcmVsYXRpb25fbm9udHJh bnNhY3Rpb25hbF90cnVuY2F0ZSwKCS5yZWxhdGlvbl9jb3B5X2RhdGEgPSBoZWFwYW1fcmVs YXRpb25fY29weV9kYXRhLAoJLnJlbGF0aW9uX2NvcHlfZm9yX2NsdXN0ZXIgPSBoZWFwYW1f cmVsYXRpb25fY29weV9mb3JfY2x1c3RlciwKCS5yZWxhdGlvbl92YWN1dW0gPSBoZWFwX3Zh Y3V1bV9yZWwsCgkuc2Nhbl9hbmFseXplX25leHRfYmxvY2sgPSBoZWFwYW1fc2Nhbl9hbmFs eXplX25leHRfYmxvY2ssCgkuc2Nhbl9hbmFseXplX25leHRfdHVwbGUgPSBoZWFwYW1fc2Nh bl9hbmFseXplX25leHRfdHVwbGUsCgkuaW5kZXhfYnVpbGRfcmFuZ2Vfc2NhbiA9IGhlYXBh bV9pbmRleF9idWlsZF9yYW5nZV9zY2FuLAoJLmluZGV4X3ZhbGlkYXRlX3NjYW4gPSBoZWFw YW1faW5kZXhfdmFsaWRhdGVfc2NhbiwKCgkucmVsYXRpb25fc2l6ZSA9IHRhYmxlX2Jsb2Nr X3JlbGF0aW9uX3NpemUsCgkucmVsYXRpb25fbmVlZHNfdG9hc3RfdGFibGUgPSBoZWFwYW1f cmVsYXRpb25fbmVlZHNfdG9hc3RfdGFibGUsCgkucmVsYXRpb25fdG9hc3RfYW0gPSBoZWFw YW1fcmVsYXRpb25fdG9hc3RfYW0sCgkucmVsYXRpb25fZmV0Y2hfdG9hc3Rfc2xpY2UgPSBo ZWFwX2ZldGNoX3RvYXN0X3NsaWNlLAoKCS5yZWxhdGlvbl9lc3RpbWF0ZV9zaXplID0gaGVh cGFtX2VzdGltYXRlX3JlbF9zaXplLAoKCS5zY2FuX2JpdG1hcF9uZXh0X3R1cGxlID0gaGVh cGFtX3NjYW5fYml0bWFwX25leHRfdHVwbGUsCgkuc2Nhbl9zYW1wbGVfbmV4dF9ibG9jayA9 IGhlYXBhbV9zY2FuX3NhbXBsZV9uZXh0X2Jsb2NrLAoJLnNjYW5fc2FtcGxlX25leHRfdHVw bGUgPSBoZWFwYW1fc2Nhbl9zYW1wbGVfbmV4dF90dXBsZQp9OwoKCmNvbnN0IFRhYmxlQW1S b3V0aW5lICoKR2V0SGVhcGFtVGFibGVBbVJvdXRpbmUodm9pZCkKewoJcmV0dXJuICZoZWFw YW1fbWV0aG9kczsKfQoKRGF0dW0KaGVhcF90YWJsZWFtX2hhbmRsZXIoUEdfRlVOQ1RJT05f QVJHUykKewoJUEdfUkVUVVJOX1BPSU5URVIoJmhlYXBhbV9tZXRob2RzKTsKfQoAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAuL2luZGV4LmMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAMDAwMDY2NAAwMDAxNzUwADAwMDE3NTAAMDAwMDA0Mjc2MTEAMTUyMjIx MDUzNjMAMDExMTcyACAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAHVzdGFyICAAeG1hbgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB4bWFuAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC8qLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLQogKgogKiBpbmRleC5jCiAqCSAgY29kZSB0byBjcmVhdGUgYW5kIGRl c3Ryb3kgUE9TVEdSRVMgaW5kZXggcmVsYXRpb25zCiAqCiAqIFBvcnRpb25zIENvcHlyaWdo dCAoYykgMTk5Ni0yMDI2LCBQb3N0Z3JlU1FMIEdsb2JhbCBEZXZlbG9wbWVudCBHcm91cAog KiBQb3J0aW9ucyBDb3B5cmlnaHQgKGMpIDE5OTQsIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNp dHkgb2YgQ2FsaWZvcm5pYQogKgogKgogKiBJREVOVElGSUNBVElPTgogKgkgIHNyYy9iYWNr ZW5kL2NhdGFsb2cvaW5kZXguYwogKgogKgogKiBJTlRFUkZBQ0UgUk9VVElORVMKICoJCWlu ZGV4X2NyZWF0ZSgpCQkJLSBDcmVhdGUgYSBjYXRhbG9nZWQgaW5kZXggcmVsYXRpb24KICoJ CWluZGV4X2Ryb3AoKQkJCS0gUmVtb3ZlcyBpbmRleCByZWxhdGlvbiBmcm9tIGNhdGFsb2dz CiAqCQlCdWlsZEluZGV4SW5mbygpCQktIFByZXBhcmUgdG8gaW5zZXJ0IGluZGV4IHR1cGxl cwogKgkJRm9ybUluZGV4RGF0dW0oKQkJLSBDb25zdHJ1Y3QgZGF0dW0gdmVjdG9yIGZvciBv bmUgaW5kZXggdHVwbGUKICoKICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAqLwojaW5jbHVkZSAi cG9zdGdyZXMuaCIKCiNpbmNsdWRlIDx1bmlzdGQuaD4KCiNpbmNsdWRlICJhY2Nlc3MvYW1h cGkuaCIKI2luY2x1ZGUgImFjY2Vzcy9hdHRtYXAuaCIKI2luY2x1ZGUgImFjY2Vzcy9oZWFw YW0uaCIKI2luY2x1ZGUgImFjY2Vzcy9tdWx0aXhhY3QuaCIKI2luY2x1ZGUgImFjY2Vzcy9y ZWxzY2FuLmgiCiNpbmNsdWRlICJhY2Nlc3MvdGFibGVhbS5oIgojaW5jbHVkZSAiYWNjZXNz L3RvYXN0X2NvbXByZXNzaW9uLmgiCiNpbmNsdWRlICJhY2Nlc3MvdHJhbnNhbS5oIgojaW5j bHVkZSAiYWNjZXNzL3Zpc2liaWxpdHltYXAuaCIKI2luY2x1ZGUgImFjY2Vzcy94YWN0Lmgi CiNpbmNsdWRlICJib290c3RyYXAvYm9vdHN0cmFwLmgiCiNpbmNsdWRlICJjYXRhbG9nL2Jp bmFyeV91cGdyYWRlLmgiCiNpbmNsdWRlICJjYXRhbG9nL2NhdGFsb2cuaCIKI2luY2x1ZGUg ImNhdGFsb2cvZGVwZW5kZW5jeS5oIgojaW5jbHVkZSAiY2F0YWxvZy9oZWFwLmgiCiNpbmNs dWRlICJjYXRhbG9nL2luZGV4LmgiCiNpbmNsdWRlICJjYXRhbG9nL29iamVjdGFjY2Vzcy5o IgojaW5jbHVkZSAiY2F0YWxvZy9wYXJ0aXRpb24uaCIKI2luY2x1ZGUgImNhdGFsb2cvcGdf YW0uaCIKI2luY2x1ZGUgImNhdGFsb2cvcGdfY29sbGF0aW9uLmgiCiNpbmNsdWRlICJjYXRh bG9nL3BnX2NvbnN0cmFpbnQuaCIKI2luY2x1ZGUgImNhdGFsb2cvcGdfZGVzY3JpcHRpb24u aCIKI2luY2x1ZGUgImNhdGFsb2cvcGdfaW5oZXJpdHMuaCIKI2luY2x1ZGUgImNhdGFsb2cv cGdfb3BjbGFzcy5oIgojaW5jbHVkZSAiY2F0YWxvZy9wZ19vcGVyYXRvci5oIgojaW5jbHVk ZSAiY2F0YWxvZy9wZ190YWJsZXNwYWNlLmgiCiNpbmNsdWRlICJjYXRhbG9nL3BnX3RyaWdn ZXIuaCIKI2luY2x1ZGUgImNhdGFsb2cvcGdfdHlwZS5oIgojaW5jbHVkZSAiY2F0YWxvZy9z dG9yYWdlLmgiCiNpbmNsdWRlICJjYXRhbG9nL3N0b3JhZ2VfeGxvZy5oIgojaW5jbHVkZSAi Y29tbWFuZHMvZXZlbnRfdHJpZ2dlci5oIgojaW5jbHVkZSAiY29tbWFuZHMvcHJvZ3Jlc3Mu aCIKI2luY2x1ZGUgImNvbW1hbmRzL3RhYmxlY21kcy5oIgojaW5jbHVkZSAiY29tbWFuZHMv dHJpZ2dlci5oIgojaW5jbHVkZSAiZXhlY3V0b3IvZXhlY3V0b3IuaCIKI2luY2x1ZGUgIm1p c2NhZG1pbi5oIgojaW5jbHVkZSAibm9kZXMvbWFrZWZ1bmNzLmgiCiNpbmNsdWRlICJub2Rl cy9ub2RlRnVuY3MuaCIKI2luY2x1ZGUgIm9wdGltaXplci9vcHRpbWl6ZXIuaCIKI2luY2x1 ZGUgInBhcnNlci9wYXJzZXIuaCIKI2luY2x1ZGUgInBnc3RhdC5oIgojaW5jbHVkZSAicG9z dG1hc3Rlci9hdXRvdmFjdXVtLmgiCiNpbmNsdWRlICJyZXdyaXRlL3Jld3JpdGVNYW5pcC5o IgojaW5jbHVkZSAic3RvcmFnZS9idWZtZ3IuaCIKI2luY2x1ZGUgInN0b3JhZ2UvbG1nci5o IgojaW5jbHVkZSAic3RvcmFnZS9wcmVkaWNhdGUuaCIKI2luY2x1ZGUgInN0b3JhZ2Uvc21n ci5oIgojaW5jbHVkZSAidXRpbHMvYnVpbHRpbnMuaCIKI2luY2x1ZGUgInV0aWxzL2ZtZ3Jv aWRzLmgiCiNpbmNsdWRlICJ1dGlscy9ndWMuaCIKI2luY2x1ZGUgInV0aWxzL2ludmFsLmgi CiNpbmNsdWRlICJ1dGlscy9sc3lzY2FjaGUuaCIKI2luY2x1ZGUgInV0aWxzL21lbXV0aWxz LmgiCiNpbmNsdWRlICJ1dGlscy9wZ19ydXNhZ2UuaCIKI2luY2x1ZGUgInV0aWxzL3JlbC5o IgojaW5jbHVkZSAidXRpbHMvc25hcG1nci5oIgojaW5jbHVkZSAidXRpbHMvc3lzY2FjaGUu aCIKI2luY2x1ZGUgInV0aWxzL3R1cGxlc29ydC5oIgoKLyogUG90ZW50aWFsbHkgc2V0IGJ5 IHBnX3VwZ3JhZGVfc3VwcG9ydCBmdW5jdGlvbnMgKi8KT2lkCQkJYmluYXJ5X3VwZ3JhZGVf bmV4dF9pbmRleF9wZ19jbGFzc19vaWQgPSBJbnZhbGlkT2lkOwpSZWxGaWxlTnVtYmVyIGJp bmFyeV91cGdyYWRlX25leHRfaW5kZXhfcGdfY2xhc3NfcmVsZmlsZW51bWJlciA9CkludmFs aWRSZWxGaWxlTnVtYmVyOwoKLyoKICogUG9pbnRlci1mcmVlIHJlcHJlc2VudGF0aW9uIG9m IHZhcmlhYmxlcyB1c2VkIHdoZW4gcmVpbmRleGluZyBzeXN0ZW0KICogY2F0YWxvZ3M7IHdl IHVzZSB0aGlzIHRvIHByb3BhZ2F0ZSB0aG9zZSB2YWx1ZXMgdG8gcGFyYWxsZWwgd29ya2Vy cy4KICovCnR5cGVkZWYgc3RydWN0CnsKCU9pZAkJCWN1cnJlbnRseVJlaW5kZXhlZEhlYXA7 CglPaWQJCQljdXJyZW50bHlSZWluZGV4ZWRJbmRleDsKCWludAkJCW51bVBlbmRpbmdSZWlu ZGV4ZWRJbmRleGVzOwoJT2lkCQkJcGVuZGluZ1JlaW5kZXhlZEluZGV4ZXNbRkxFWElCTEVf QVJSQVlfTUVNQkVSXTsKfSBTZXJpYWxpemVkUmVpbmRleFN0YXRlOwoKLyogbm9uLWV4cG9y dCBmdW5jdGlvbiBwcm90b3R5cGVzICovCnN0YXRpYyBib29sIHJlbGF0aW9uSGFzUHJpbWFy eUtleShSZWxhdGlvbiByZWwpOwpzdGF0aWMgVHVwbGVEZXNjIENvbnN0cnVjdFR1cGxlRGVz Y3JpcHRvcihSZWxhdGlvbiBoZWFwUmVsYXRpb24sCgkJCQkJCQkJCQkgIGNvbnN0IEluZGV4 SW5mbyAqaW5kZXhJbmZvLAoJCQkJCQkJCQkJICBjb25zdCBMaXN0ICppbmRleENvbE5hbWVz LAoJCQkJCQkJCQkJICBPaWQgYWNjZXNzTWV0aG9kSWQsCgkJCQkJCQkJCQkgIGNvbnN0IE9p ZCAqY29sbGF0aW9uSWRzLAoJCQkJCQkJCQkJICBjb25zdCBPaWQgKm9wY2xhc3NJZHMpOwpz dGF0aWMgdm9pZCBJbml0aWFsaXplQXR0cmlidXRlT2lkcyhSZWxhdGlvbiBpbmRleFJlbGF0 aW9uLAoJCQkJCQkJCQlpbnQgbnVtYXR0cywgT2lkIGluZGV4b2lkKTsKc3RhdGljIHZvaWQg QXBwZW5kQXR0cmlidXRlVHVwbGVzKFJlbGF0aW9uIGluZGV4UmVsYXRpb24sIGNvbnN0IERh dHVtICphdHRvcHRzLCBjb25zdCBOdWxsYWJsZURhdHVtICpzdGF0dGFyZ2V0cyk7CnN0YXRp YyB2b2lkIFVwZGF0ZUluZGV4UmVsYXRpb24oT2lkIGluZGV4b2lkLCBPaWQgaGVhcG9pZCwK CQkJCQkJCQlPaWQgcGFyZW50SW5kZXhJZCwKCQkJCQkJCQljb25zdCBJbmRleEluZm8gKmlu ZGV4SW5mbywKCQkJCQkJCQljb25zdCBPaWQgKmNvbGxhdGlvbk9pZHMsCgkJCQkJCQkJY29u c3QgT2lkICpvcGNsYXNzT2lkcywKCQkJCQkJCQljb25zdCBpbnQxNiAqY29sb3B0aW9ucywK CQkJCQkJCQlib29sIHByaW1hcnksCgkJCQkJCQkJYm9vbCBpc2V4Y2x1c2lvbiwKCQkJCQkJ CQlib29sIGltbWVkaWF0ZSwKCQkJCQkJCQlib29sIGlzdmFsaWQsCgkJCQkJCQkJYm9vbCBp c3JlYWR5KTsKc3RhdGljIHZvaWQgaW5kZXhfdXBkYXRlX3N0YXRzKFJlbGF0aW9uIHJlbCwK CQkJCQkJCSAgIGJvb2wgaGFzaW5kZXgsCgkJCQkJCQkgICBkb3VibGUgcmVsdHVwbGVzKTsK c3RhdGljIHZvaWQgSW5kZXhDaGVja0V4Y2x1c2lvbihSZWxhdGlvbiBoZWFwUmVsYXRpb24s CgkJCQkJCQkJUmVsYXRpb24gaW5kZXhSZWxhdGlvbiwKCQkJCQkJCQlJbmRleEluZm8gKmlu ZGV4SW5mbyk7CnN0YXRpYyBib29sIHZhbGlkYXRlX2luZGV4X2NhbGxiYWNrKEl0ZW1Qb2lu dGVyIGl0ZW1wdHIsIHZvaWQgKm9wYXF1ZSk7CnN0YXRpYyBib29sIFJlaW5kZXhJc0N1cnJl bnRseVByb2Nlc3NpbmdJbmRleChPaWQgaW5kZXhPaWQpOwpzdGF0aWMgdm9pZCBTZXRSZWlu ZGV4UHJvY2Vzc2luZyhPaWQgaGVhcE9pZCwgT2lkIGluZGV4T2lkKTsKc3RhdGljIHZvaWQg UmVzZXRSZWluZGV4UHJvY2Vzc2luZyh2b2lkKTsKc3RhdGljIHZvaWQgU2V0UmVpbmRleFBl bmRpbmcoTGlzdCAqaW5kZXhlcyk7CnN0YXRpYyB2b2lkIFJlbW92ZVJlaW5kZXhQZW5kaW5n KE9pZCBpbmRleE9pZCk7CgoKLyoKICogcmVsYXRpb25IYXNQcmltYXJ5S2V5CiAqCQlTZWUg d2hldGhlciBhbiBleGlzdGluZyByZWxhdGlvbiBoYXMgYSBwcmltYXJ5IGtleS4KICoKICog Q2FsbGVyIG11c3QgaGF2ZSBzdWl0YWJsZSBsb2NrIG9uIHRoZSByZWxhdGlvbi4KICoKICog Tm90ZTogd2UgaW50ZW50aW9uYWxseSBkbyBub3QgY2hlY2sgaW5kaXN2YWxpZCBoZXJlOyB0 aGF0J3MgYmVjYXVzZSB0aGlzCiAqIGlzIHVzZWQgdG8gZW5mb3JjZSB0aGUgcnVsZSB0aGF0 IHRoZXJlIGNhbiBiZSBvbmx5IG9uZSBpbmRpc3ByaW1hcnkgaW5kZXgsCiAqIGFuZCB3ZSB3 YW50IHRoYXQgdG8gYmUgdHJ1ZSBldmVuIGlmIHNhaWQgaW5kZXggaXMgaW52YWxpZC4KICov CnN0YXRpYyBib29sCnJlbGF0aW9uSGFzUHJpbWFyeUtleShSZWxhdGlvbiByZWwpCnsKCWJv b2wJCXJlc3VsdCA9IGZhbHNlOwoJTGlzdAkgICAqaW5kZXhvaWRsaXN0OwoJTGlzdENlbGwg ICAqaW5kZXhvaWRzY2FuOwoKCS8qCgkgKiBHZXQgdGhlIGxpc3Qgb2YgaW5kZXggT0lEcyBm b3IgdGhlIHRhYmxlIGZyb20gdGhlIHJlbGNhY2hlLCBhbmQgbG9vayB1cAoJICogZWFjaCBv bmUgaW4gdGhlIHBnX2luZGV4IHN5c2NhY2hlIHVudGlsIHdlIGZpbmQgb25lIG1hcmtlZCBw cmltYXJ5IGtleQoJICogKGhvcGVmdWxseSB0aGVyZSBpc24ndCBtb3JlIHRoYW4gb25lIHN1 Y2gpLgoJICovCglpbmRleG9pZGxpc3QgPSBSZWxhdGlvbkdldEluZGV4TGlzdChyZWwpOwoK CWZvcmVhY2goaW5kZXhvaWRzY2FuLCBpbmRleG9pZGxpc3QpCgl7CgkJT2lkCQkJaW5kZXhv aWQgPSBsZmlyc3Rfb2lkKGluZGV4b2lkc2Nhbik7CgkJSGVhcFR1cGxlCWluZGV4VHVwbGU7 CgoJCWluZGV4VHVwbGUgPSBTZWFyY2hTeXNDYWNoZTEoSU5ERVhSRUxJRCwgT2JqZWN0SWRH ZXREYXR1bShpbmRleG9pZCkpOwoJCWlmICghSGVhcFR1cGxlSXNWYWxpZChpbmRleFR1cGxl KSkJLyogc2hvdWxkIG5vdCBoYXBwZW4gKi8KCQkJZWxvZyhFUlJPUiwgImNhY2hlIGxvb2t1 cCBmYWlsZWQgZm9yIGluZGV4ICV1IiwgaW5kZXhvaWQpOwoJCXJlc3VsdCA9ICgoRm9ybV9w Z19pbmRleCkgR0VUU1RSVUNUKGluZGV4VHVwbGUpKS0+aW5kaXNwcmltYXJ5OwoJCVJlbGVh c2VTeXNDYWNoZShpbmRleFR1cGxlKTsKCQlpZiAocmVzdWx0KQoJCQlicmVhazsKCX0KCgls aXN0X2ZyZWUoaW5kZXhvaWRsaXN0KTsKCglyZXR1cm4gcmVzdWx0Owp9CgovKgogKiBpbmRl eF9jaGVja19wcmltYXJ5X2tleQogKgkJQXBwbHkgc3BlY2lhbCBjaGVja3MgbmVlZGVkIGJl Zm9yZSBjcmVhdGluZyBhIFBSSU1BUlkgS0VZIGluZGV4CiAqCiAqIFRoaXMgcHJvY2Vzc2lu ZyB1c2VkIHRvIGJlIGluIERlZmluZUluZGV4KCksIGJ1dCBoYXMgYmVlbiBzcGxpdCBvdXQK ICogc28gdGhhdCBpdCBjYW4gYmUgYXBwbGllZCBkdXJpbmcgQUxURVIgVEFCTEUgQUREIFBS SU1BUlkgS0VZIFVTSU5HIElOREVYLgogKgogKiBXZSBjaGVjayBmb3IgYSBwcmUtZXhpc3Rp bmcgcHJpbWFyeSBrZXksIGFuZCB0aGF0IGFsbCBjb2x1bW5zIG9mIHRoZSBpbmRleAogKiBh cmUgc2ltcGxlIGNvbHVtbiByZWZlcmVuY2VzIChub3QgZXhwcmVzc2lvbnMpLCBhbmQgdGhh dCBhbGwgdGhvc2UKICogY29sdW1ucyBhcmUgbWFya2VkIE5PVCBOVUxMLiAgSWYgbm90LCBm YWlsLgogKgogKiBXZSB1c2VkIHRvIGF1dG9tYXRpY2FsbHkgY2hhbmdlIHVubWFya2VkIGNv bHVtbnMgdG8gTk9UIE5VTEwgaGVyZSBieSBkb2luZwogKiBvdXIgb3duIGxvY2FsIEFMVEVS IFRBQkxFIGNvbW1hbmQuICBCdXQgdGhhdCBkb2Vzbid0IHdvcmsgd2VsbCBpZiB3ZSdyZQog KiBleGVjdXRpbmcgb25lIHN1YmNvbW1hbmQgb2YgYW4gQUxURVIgVEFCTEU6IHRoZSBvcGVy YXRpb25zIG1heSBub3QgZ2V0CiAqIHBlcmZvcm1lZCBpbiB0aGUgcmlnaHQgb3JkZXIgb3Zl cmFsbC4gIE5vdyB3ZSBleHBlY3QgdGhhdCB0aGUgcGFyc2VyCiAqIGluc2VydGVkIGFueSBy ZXF1aXJlZCBBTFRFUiBUQUJMRSBTRVQgTk9UIE5VTEwgb3BlcmF0aW9ucyBiZWZvcmUgdHJ5 aW5nCiAqIHRvIGNyZWF0ZSBhIHByaW1hcnkta2V5IGluZGV4LgogKgogKiBDYWxsZXIgaGFk IGJldHRlciBoYXZlIGF0IGxlYXN0IFNoYXJlTG9jayBvbiB0aGUgdGFibGUsIGVsc2UgdGhl IG5vdC1udWxsCiAqIGNoZWNraW5nIGlzbid0IHRydXN0d29ydGh5LgogKi8Kdm9pZAppbmRl eF9jaGVja19wcmltYXJ5X2tleShSZWxhdGlvbiBoZWFwUmVsLAoJCQkJCQljb25zdCBJbmRl eEluZm8gKmluZGV4SW5mbywKCQkJCQkJYm9vbCBpc19hbHRlcl90YWJsZSwKCQkJCQkJY29u c3QgSW5kZXhTdG10ICpzdG10KQp7CglpbnQJCQlpOwoKCS8qCgkgKiBJZiBBTFRFUiBUQUJM RSBvciBDUkVBVEUgVEFCTEUgLi4gUEFSVElUSU9OIE9GLCBjaGVjayB0aGF0IHRoZXJlIGlz bid0CgkgKiBhbHJlYWR5IGEgUFJJTUFSWSBLRVkuICBJbiBDUkVBVEUgVEFCTEUgZm9yIGFu IG9yZGluYXJ5IHJlbGF0aW9uLCB3ZQoJICogaGF2ZSBmYWl0aCB0aGF0IHRoZSBwYXJzZXIg cmVqZWN0ZWQgbXVsdGlwbGUgcGtleSBjbGF1c2VzOyBhbmQgQ1JFQVRFCgkgKiBJTkRFWCBk b2Vzbid0IGhhdmUgYSB3YXkgdG8gc2F5IFBSSU1BUlkgS0VZLCBzbyBpdCdzIG5vIHByb2Js ZW0gZWl0aGVyLgoJICovCglpZiAoKGlzX2FsdGVyX3RhYmxlIHx8IGhlYXBSZWwtPnJkX3Jl bC0+cmVsaXNwYXJ0aXRpb24pICYmCgkJcmVsYXRpb25IYXNQcmltYXJ5S2V5KGhlYXBSZWwp KQoJewoJCWVyZXBvcnQoRVJST1IsCgkJCQkoZXJyY29kZShFUlJDT0RFX0lOVkFMSURfVEFC TEVfREVGSU5JVElPTiksCgkJCQkgZXJybXNnKCJtdWx0aXBsZSBwcmltYXJ5IGtleXMgZm9y IHRhYmxlIFwiJXNcIiBhcmUgbm90IGFsbG93ZWQiLAoJCQkJCQlSZWxhdGlvbkdldFJlbGF0 aW9uTmFtZShoZWFwUmVsKSkpKTsKCX0KCgkvKgoJICogSW5kZXhlcyBjcmVhdGVkIHdpdGgg TlVMTFMgTk9UIERJU1RJTkNUIGNhbm5vdCBiZSB1c2VkIGZvciBwcmltYXJ5IGtleQoJICog Y29uc3RyYWludHMuIFdoaWxlIHRoZXJlIGlzIG5vIGRpcmVjdCBzeW50YXggdG8gcmVhY2gg aGVyZSwgaXQgY2FuIGJlCgkgKiBkb25lIGJ5IGNyZWF0aW5nIGEgc2VwYXJhdGUgaW5kZXgg YW5kIGF0dGFjaGluZyBpdCB2aWEgQUxURVIgVEFCTEUgLi4KCSAqIFVTSU5HIElOREVYLgoJ ICovCglpZiAoaW5kZXhJbmZvLT5paV9OdWxsc05vdERpc3RpbmN0KQoJewoJCWVyZXBvcnQo RVJST1IsCgkJCQkoZXJyY29kZShFUlJDT0RFX0lOVkFMSURfVEFCTEVfREVGSU5JVElPTiks CgkJCQkgZXJybXNnKCJwcmltYXJ5IGtleXMgY2Fubm90IHVzZSBOVUxMUyBOT1QgRElTVElO Q1QgaW5kZXhlcyIpKSk7Cgl9CgoJLyoKCSAqIENoZWNrIHRoYXQgYWxsIG9mIHRoZSBhdHRy aWJ1dGVzIGluIGEgcHJpbWFyeSBrZXkgYXJlIG1hcmtlZCBhcyBub3QKCSAqIG51bGwuICAo V2UgZG9uJ3QgcmVhbGx5IGV4cGVjdCB0byBzZWUgdGhhdDsgaXQnZCBtZWFuIHRoZSBwYXJz ZXIgbWVzc2VkCgkgKiB1cC4gIEJ1dCBpdCBzZWVtcyB3aXNlIHRvIGNoZWNrIGFueXdheS4p CgkgKi8KCWZvciAoaSA9IDA7IGkgPCBpbmRleEluZm8tPmlpX051bUluZGV4S2V5QXR0cnM7 IGkrKykKCXsKCQlBdHRyTnVtYmVyCWF0dG51bSA9IGluZGV4SW5mby0+aWlfSW5kZXhBdHRy TnVtYmVyc1tpXTsKCQlIZWFwVHVwbGUJYXR0dHVwbGU7CgkJRm9ybV9wZ19hdHRyaWJ1dGUg YXR0Zm9ybTsKCgkJaWYgKGF0dG51bSA9PSAwKQoJCQllcmVwb3J0KEVSUk9SLAoJCQkJCShl cnJjb2RlKEVSUkNPREVfRkVBVFVSRV9OT1RfU1VQUE9SVEVEKSwKCQkJCQkgZXJybXNnKCJw cmltYXJ5IGtleXMgY2Fubm90IGJlIGV4cHJlc3Npb25zIikpKTsKCgkJLyogU3lzdGVtIGF0 dHJpYnV0ZXMgYXJlIG5ldmVyIG51bGwsIHNvIG5vIG5lZWQgdG8gY2hlY2sgKi8KCQlpZiAo YXR0bnVtIDwgMCkKCQkJY29udGludWU7CgoJCWF0dHR1cGxlID0gU2VhcmNoU3lzQ2FjaGUy KEFUVE5VTSwKCQkJCQkJCQkgICBPYmplY3RJZEdldERhdHVtKFJlbGF0aW9uR2V0UmVsaWQo aGVhcFJlbCkpLAoJCQkJCQkJCSAgIEludDE2R2V0RGF0dW0oYXR0bnVtKSk7CgkJaWYgKCFI ZWFwVHVwbGVJc1ZhbGlkKGF0dHR1cGxlKSkKCQkJZWxvZyhFUlJPUiwgImNhY2hlIGxvb2t1 cCBmYWlsZWQgZm9yIGF0dHJpYnV0ZSAlZCBvZiByZWxhdGlvbiAldSIsCgkJCQkgYXR0bnVt LCBSZWxhdGlvbkdldFJlbGlkKGhlYXBSZWwpKTsKCQlhdHRmb3JtID0gKEZvcm1fcGdfYXR0 cmlidXRlKSBHRVRTVFJVQ1QoYXR0dHVwbGUpOwoKCQlpZiAoIWF0dGZvcm0tPmF0dG5vdG51 bGwpCgkJCWVyZXBvcnQoRVJST1IsCgkJCQkJKGVycmNvZGUoRVJSQ09ERV9JTlZBTElEX1RB QkxFX0RFRklOSVRJT04pLAoJCQkJCSBlcnJtc2coInByaW1hcnkga2V5IGNvbHVtbiBcIiVz XCIgaXMgbm90IG1hcmtlZCBOT1QgTlVMTCIsCgkJCQkJCQlOYW1lU3RyKGF0dGZvcm0tPmF0 dG5hbWUpKSkpOwoKCQlSZWxlYXNlU3lzQ2FjaGUoYXR0dHVwbGUpOwoJfQp9CgovKgogKgkJ Q29uc3RydWN0VHVwbGVEZXNjcmlwdG9yCiAqCiAqIEJ1aWxkIGFuIGluZGV4IHR1cGxlIGRl c2NyaXB0b3IgZm9yIGEgbmV3IGluZGV4CiAqLwpzdGF0aWMgVHVwbGVEZXNjCkNvbnN0cnVj dFR1cGxlRGVzY3JpcHRvcihSZWxhdGlvbiBoZWFwUmVsYXRpb24sCgkJCQkJCSBjb25zdCBJ bmRleEluZm8gKmluZGV4SW5mbywKCQkJCQkJIGNvbnN0IExpc3QgKmluZGV4Q29sTmFtZXMs CgkJCQkJCSBPaWQgYWNjZXNzTWV0aG9kSWQsCgkJCQkJCSBjb25zdCBPaWQgKmNvbGxhdGlv bklkcywKCQkJCQkJIGNvbnN0IE9pZCAqb3BjbGFzc0lkcykKewoJaW50CQkJbnVtYXR0cyA9 IGluZGV4SW5mby0+aWlfTnVtSW5kZXhBdHRyczsKCWludAkJCW51bWtleWF0dHMgPSBpbmRl eEluZm8tPmlpX051bUluZGV4S2V5QXR0cnM7CglMaXN0Q2VsbCAgICpjb2xuYW1lc19pdGVt ID0gbGlzdF9oZWFkKGluZGV4Q29sTmFtZXMpOwoJTGlzdENlbGwgICAqaW5kZXhwcl9pdGVt ID0gbGlzdF9oZWFkKGluZGV4SW5mby0+aWlfRXhwcmVzc2lvbnMpOwoJY29uc3QgSW5kZXhB bVJvdXRpbmUgKmFtcm91dGluZTsKCVR1cGxlRGVzYwloZWFwVHVwRGVzYzsKCVR1cGxlRGVz YwlpbmRleFR1cERlc2M7CglpbnQJCQluYXR0czsJCQkvKiAjYXR0cyBpbiBoZWFwIHJlbCAt LS0gZm9yIGVycm9yIGNoZWNrcyAqLwoJaW50CQkJaTsKCgkvKiBXZSBuZWVkIGFjY2VzcyB0 byB0aGUgaW5kZXggQU0ncyBBUEkgc3RydWN0ICovCglhbXJvdXRpbmUgPSBHZXRJbmRleEFt Um91dGluZUJ5QW1JZChhY2Nlc3NNZXRob2RJZCwgZmFsc2UpOwoKCS8qIC4uLiBhbmQgdG8g dGhlIHRhYmxlJ3MgdHVwbGUgZGVzY3JpcHRvciAqLwoJaGVhcFR1cERlc2MgPSBSZWxhdGlv bkdldERlc2NyKGhlYXBSZWxhdGlvbik7CgluYXR0cyA9IFJlbGF0aW9uR2V0Rm9ybShoZWFw UmVsYXRpb24pLT5yZWxuYXR0czsKCgkvKgoJICogYWxsb2NhdGUgdGhlIG5ldyB0dXBsZSBk ZXNjcmlwdG9yCgkgKi8KCWluZGV4VHVwRGVzYyA9IENyZWF0ZVRlbXBsYXRlVHVwbGVEZXNj KG51bWF0dHMpOwoKCS8qCgkgKiBGaWxsIGluIHRoZSBwZ19hdHRyaWJ1dGUgcm93LgoJICov Cglmb3IgKGkgPSAwOyBpIDwgbnVtYXR0czsgaSsrKQoJewoJCUF0dHJOdW1iZXIJYXRudW0g PSBpbmRleEluZm8tPmlpX0luZGV4QXR0ck51bWJlcnNbaV07CgkJRm9ybV9wZ19hdHRyaWJ1 dGUgdG8gPSBUdXBsZURlc2NBdHRyKGluZGV4VHVwRGVzYywgaSk7CgkJSGVhcFR1cGxlCXR1 cGxlOwoJCUZvcm1fcGdfdHlwZSB0eXBlVHVwOwoJCUZvcm1fcGdfb3BjbGFzcyBvcGNsYXNz VHVwOwoJCU9pZAkJCWtleVR5cGU7CgoJCU1lbVNldCh0bywgMCwgQVRUUklCVVRFX0ZJWEVE X1BBUlRfU0laRSk7CgkJdG8tPmF0dG51bSA9IGkgKyAxOwoJCXRvLT5hdHRpc2xvY2FsID0g dHJ1ZTsKCQl0by0+YXR0Y29sbGF0aW9uID0gKGkgPCBudW1rZXlhdHRzKSA/IGNvbGxhdGlv bklkc1tpXSA6IEludmFsaWRPaWQ7CgoJCS8qCgkJICogU2V0IHRoZSBhdHRyaWJ1dGUgbmFt ZSBhcyBzcGVjaWZpZWQgYnkgY2FsbGVyLgoJCSAqLwoJCWlmIChjb2xuYW1lc19pdGVtID09 IE5VTEwpCS8qIHNob3VsZG4ndCBoYXBwZW4gKi8KCQkJZWxvZyhFUlJPUiwgInRvbyBmZXcg ZW50cmllcyBpbiBjb2xuYW1lcyBsaXN0Iik7CgkJbmFtZXN0cmNweSgmdG8tPmF0dG5hbWUs IChjb25zdCBjaGFyICopIGxmaXJzdChjb2xuYW1lc19pdGVtKSk7CgkJY29sbmFtZXNfaXRl bSA9IGxuZXh0KGluZGV4Q29sTmFtZXMsIGNvbG5hbWVzX2l0ZW0pOwoKCQkvKgoJCSAqIEZv ciBzaW1wbGUgaW5kZXggY29sdW1ucywgd2UgY29weSBzb21lIHBnX2F0dHJpYnV0ZSBmaWVs ZHMgZnJvbSB0aGUKCQkgKiBwYXJlbnQgcmVsYXRpb24uICBGb3IgZXhwcmVzc2lvbnMgd2Ug aGF2ZSB0byBsb29rIGF0IHRoZSBleHByZXNzaW9uCgkJICogcmVzdWx0LgoJCSAqLwoJCWlm IChhdG51bSAhPSAwKQoJCXsKCQkJLyogU2ltcGxlIGluZGV4IGNvbHVtbiAqLwoJCQljb25z dCBGb3JtRGF0YV9wZ19hdHRyaWJ1dGUgKmZyb207CgoJCQlBc3NlcnQoYXRudW0gPiAwKTsJ Lyogc2hvdWxkJ3ZlIGJlZW4gY2F1Z2h0IGFib3ZlICovCgoJCQlpZiAoYXRudW0gPiBuYXR0 cykJLyogc2FmZXR5IGNoZWNrICovCgkJCQllbG9nKEVSUk9SLCAiaW52YWxpZCBjb2x1bW4g bnVtYmVyICVkIiwgYXRudW0pOwoJCQlmcm9tID0gVHVwbGVEZXNjQXR0cihoZWFwVHVwRGVz YywKCQkJCQkJCQkgQXR0ck51bWJlckdldEF0dHJPZmZzZXQoYXRudW0pKTsKCgkJCXRvLT5h dHR0eXBpZCA9IGZyb20tPmF0dHR5cGlkOwoJCQl0by0+YXR0bGVuID0gZnJvbS0+YXR0bGVu OwoJCQl0by0+YXR0bmRpbXMgPSBmcm9tLT5hdHRuZGltczsKCQkJdG8tPmF0dHR5cG1vZCA9 IGZyb20tPmF0dHR5cG1vZDsKCQkJdG8tPmF0dGJ5dmFsID0gZnJvbS0+YXR0Ynl2YWw7CgkJ CXRvLT5hdHRhbGlnbiA9IGZyb20tPmF0dGFsaWduOwoJCQl0by0+YXR0c3RvcmFnZSA9IGZy b20tPmF0dHN0b3JhZ2U7CgkJCXRvLT5hdHRjb21wcmVzc2lvbiA9IGZyb20tPmF0dGNvbXBy ZXNzaW9uOwoJCX0KCQllbHNlCgkJewoJCQkvKiBFeHByZXNzaW9uYWwgaW5kZXggKi8KCQkJ Tm9kZQkgICAqaW5kZXhrZXk7CgoJCQlpZiAoaW5kZXhwcl9pdGVtID09IE5VTEwpCS8qIHNo b3VsZG4ndCBoYXBwZW4gKi8KCQkJCWVsb2coRVJST1IsICJ0b28gZmV3IGVudHJpZXMgaW4g aW5kZXhwcnMgbGlzdCIpOwoJCQlpbmRleGtleSA9IChOb2RlICopIGxmaXJzdChpbmRleHBy X2l0ZW0pOwoJCQlpbmRleHByX2l0ZW0gPSBsbmV4dChpbmRleEluZm8tPmlpX0V4cHJlc3Np b25zLCBpbmRleHByX2l0ZW0pOwoKCQkJLyoKCQkJICogTG9va3VwIHRoZSBleHByZXNzaW9u IHR5cGUgaW4gcGdfdHlwZSBmb3IgdGhlIHR5cGUgbGVuZ3RoIGV0Yy4KCQkJICovCgkJCWtl eVR5cGUgPSBleHByVHlwZShpbmRleGtleSk7CgkJCXR1cGxlID0gU2VhcmNoU3lzQ2FjaGUx KFRZUEVPSUQsIE9iamVjdElkR2V0RGF0dW0oa2V5VHlwZSkpOwoJCQlpZiAoIUhlYXBUdXBs ZUlzVmFsaWQodHVwbGUpKQoJCQkJZWxvZyhFUlJPUiwgImNhY2hlIGxvb2t1cCBmYWlsZWQg Zm9yIHR5cGUgJXUiLCBrZXlUeXBlKTsKCQkJdHlwZVR1cCA9IChGb3JtX3BnX3R5cGUpIEdF VFNUUlVDVCh0dXBsZSk7CgoJCQkvKgoJCQkgKiBBc3NpZ24gc29tZSBvZiB0aGUgYXR0cmli dXRlcyB2YWx1ZXMuIExlYXZlIHRoZSByZXN0LgoJCQkgKi8KCQkJdG8tPmF0dHR5cGlkID0g a2V5VHlwZTsKCQkJdG8tPmF0dGxlbiA9IHR5cGVUdXAtPnR5cGxlbjsKCQkJdG8tPmF0dHR5 cG1vZCA9IGV4cHJUeXBtb2QoaW5kZXhrZXkpOwoJCQl0by0+YXR0Ynl2YWwgPSB0eXBlVHVw LT50eXBieXZhbDsKCQkJdG8tPmF0dGFsaWduID0gdHlwZVR1cC0+dHlwYWxpZ247CgkJCXRv LT5hdHRzdG9yYWdlID0gdHlwZVR1cC0+dHlwc3RvcmFnZTsKCgkJCS8qCgkJCSAqIEZvciBl eHByZXNzaW9uIGNvbHVtbnMsIHNldCBhdHRjb21wcmVzc2lvbiBpbnZhbGlkLCBzaW5jZQoJ CQkgKiB0aGVyZSdzIG5vIHRhYmxlIGNvbHVtbiBmcm9tIHdoaWNoIHRvIGNvcHkgdGhlIHZh bHVlLiBXaGVuZXZlcgoJCQkgKiB3ZSBhY3R1YWxseSBuZWVkIHRvIGNvbXByZXNzIGEgdmFs dWUsIHdlJ2xsIHVzZSB3aGF0ZXZlciB0aGUKCQkJICogY3VycmVudCB2YWx1ZSBvZiBkZWZh dWx0X3RvYXN0X2NvbXByZXNzaW9uIGlzIGF0IHRoYXQgcG9pbnQgaW4KCQkJICogdGltZS4K CQkJICovCgkJCXRvLT5hdHRjb21wcmVzc2lvbiA9IEludmFsaWRDb21wcmVzc2lvbk1ldGhv ZDsKCgkJCVJlbGVhc2VTeXNDYWNoZSh0dXBsZSk7CgoJCQkvKgoJCQkgKiBNYWtlIHN1cmUg dGhlIGV4cHJlc3Npb24geWllbGRzIGEgdHlwZSB0aGF0J3Mgc2FmZSB0byBzdG9yZSBpbgoJ CQkgKiBhbiBpbmRleC4gIFdlIG5lZWQgdGhpcyBkZWZlbnNlIGJlY2F1c2Ugd2UgaGF2ZSBp bmRleCBvcGNsYXNzZXMKCQkJICogZm9yIHBzZXVkby10eXBlcyBzdWNoIGFzICJyZWNvcmQi LCBhbmQgdGhlIGFjdHVhbGx5IHN0b3JlZCB0eXBlCgkJCSAqIGhhZCBiZXR0ZXIgYmUgc2Fm ZTsgZWcsIGEgbmFtZWQgY29tcG9zaXRlIHR5cGUgaXMgb2theSwgYW4KCQkJICogYW5vbnlt b3VzIHJlY29yZCB0eXBlIGlzIG5vdC4gIFRoZSB0ZXN0IGlzIHRoZSBzYW1lIGFzIGZvcgoJ CQkgKiB3aGV0aGVyIGEgdGFibGUgY29sdW1uIGlzIG9mIGEgc2FmZSB0eXBlICh3aGljaCBp cyB3aHkgd2UKCQkJICogbmVlZG4ndCBjaGVjayBmb3IgdGhlIG5vbi1leHByZXNzaW9uIGNh c2UpLgoJCQkgKi8KCQkJQ2hlY2tBdHRyaWJ1dGVUeXBlKE5hbWVTdHIodG8tPmF0dG5hbWUp LAoJCQkJCQkJICAgdG8tPmF0dHR5cGlkLCB0by0+YXR0Y29sbGF0aW9uLAoJCQkJCQkJICAg TklMLCAwKTsKCQl9CgoJCS8qCgkJICogV2UgZG8gbm90IHlldCBoYXZlIHRoZSBjb3JyZWN0 IHJlbGF0aW9uIE9JRCBmb3IgdGhlIGluZGV4LCBzbyBqdXN0CgkJICogc2V0IGl0IGludmFs aWQgZm9yIG5vdy4gIEluaXRpYWxpemVBdHRyaWJ1dGVPaWRzKCkgd2lsbCBmaXggaXQKCQkg KiBsYXRlci4KCQkgKi8KCQl0by0+YXR0cmVsaWQgPSBJbnZhbGlkT2lkOwoKCQkvKgoJCSAq IENoZWNrIHRoZSBvcGNsYXNzIGFuZCBpbmRleCBBTSB0byBzZWUgaWYgZWl0aGVyIHByb3Zp ZGVzIGEga2V5dHlwZQoJCSAqIChvdmVycmlkaW5nIHRoZSBhdHRyaWJ1dGUgdHlwZSkuICBP cGNsYXNzIChpZiBleGlzdHMpIHRha2VzCgkJICogcHJlY2VkZW5jZS4KCQkgKi8KCQlrZXlU eXBlID0gYW1yb3V0aW5lLT5hbWtleXR5cGU7CgoJCWlmIChpIDwgaW5kZXhJbmZvLT5paV9O dW1JbmRleEtleUF0dHJzKQoJCXsKCQkJdHVwbGUgPSBTZWFyY2hTeXNDYWNoZTEoQ0xBT0lE LCBPYmplY3RJZEdldERhdHVtKG9wY2xhc3NJZHNbaV0pKTsKCQkJaWYgKCFIZWFwVHVwbGVJ c1ZhbGlkKHR1cGxlKSkKCQkJCWVsb2coRVJST1IsICJjYWNoZSBsb29rdXAgZmFpbGVkIGZv ciBvcGNsYXNzICV1Iiwgb3BjbGFzc0lkc1tpXSk7CgkJCW9wY2xhc3NUdXAgPSAoRm9ybV9w Z19vcGNsYXNzKSBHRVRTVFJVQ1QodHVwbGUpOwoJCQlpZiAoT2lkSXNWYWxpZChvcGNsYXNz VHVwLT5vcGNrZXl0eXBlKSkKCQkJCWtleVR5cGUgPSBvcGNsYXNzVHVwLT5vcGNrZXl0eXBl OwoKCQkJLyoKCQkJICogSWYga2V5dHlwZSBpcyBzcGVjaWZpZWQgYXMgQU5ZRUxFTUVOVCwg YW5kIG9wY2ludHlwZSBpcwoJCQkgKiBBTllBUlJBWSwgdGhlbiB0aGUgYXR0cmlidXRlIHR5 cGUgbXVzdCBiZSBhbiBhcnJheSAoZWxzZSBpdCdkCgkJCSAqIG5vdCBoYXZlIG1hdGNoZWQg dGhpcyBvcGNsYXNzKTsgdXNlIGl0cyBlbGVtZW50IHR5cGUuCgkJCSAqCgkJCSAqIFdlIGNv dWxkIGFsc28gYWxsb3cgQU5ZQ09NUEFUSUJMRS9BTllDT01QQVRJQkxFQVJSQVkgaGVyZSwg YnV0CgkJCSAqIHRoZXJlIHNlZW1zIG5vIG5lZWQgdG8gZG8gc287IHRoZXJlJ3Mgbm8gcmVh c29uIHRvIGRlY2xhcmUgYW4KCQkJICogb3BjbGFzcyBhcyB0YWtpbmcgQU5ZQ09NUEFUSUJM RUFSUkFZIHJhdGhlciB0aGFuIEFOWUFSUkFZLgoJCQkgKi8KCQkJaWYgKGtleVR5cGUgPT0g QU5ZRUxFTUVOVE9JRCAmJiBvcGNsYXNzVHVwLT5vcGNpbnR5cGUgPT0gQU5ZQVJSQVlPSUQp CgkJCXsKCQkJCWtleVR5cGUgPSBnZXRfYmFzZV9lbGVtZW50X3R5cGUodG8tPmF0dHR5cGlk KTsKCQkJCWlmICghT2lkSXNWYWxpZChrZXlUeXBlKSkKCQkJCQllbG9nKEVSUk9SLCAiY291 bGQgbm90IGdldCBlbGVtZW50IHR5cGUgb2YgYXJyYXkgdHlwZSAldSIsCgkJCQkJCSB0by0+ YXR0dHlwaWQpOwoJCQl9CgoJCQlSZWxlYXNlU3lzQ2FjaGUodHVwbGUpOwoJCX0KCgkJLyoK CQkgKiBJZiBhIGtleSB0eXBlIGRpZmZlcmVudCBmcm9tIHRoZSBoZWFwIHZhbHVlIGlzIHNw ZWNpZmllZCwgdXBkYXRlCgkJICogdGhlIHR5cGUtcmVsYXRlZCBmaWVsZHMgaW4gdGhlIGlu ZGV4IHR1cGRlc2MuCgkJICovCgkJaWYgKE9pZElzVmFsaWQoa2V5VHlwZSkgJiYga2V5VHlw ZSAhPSB0by0+YXR0dHlwaWQpCgkJewoJCQl0dXBsZSA9IFNlYXJjaFN5c0NhY2hlMShUWVBF T0lELCBPYmplY3RJZEdldERhdHVtKGtleVR5cGUpKTsKCQkJaWYgKCFIZWFwVHVwbGVJc1Zh bGlkKHR1cGxlKSkKCQkJCWVsb2coRVJST1IsICJjYWNoZSBsb29rdXAgZmFpbGVkIGZvciB0 eXBlICV1Iiwga2V5VHlwZSk7CgkJCXR5cGVUdXAgPSAoRm9ybV9wZ190eXBlKSBHRVRTVFJV Q1QodHVwbGUpOwoKCQkJdG8tPmF0dHR5cGlkID0ga2V5VHlwZTsKCQkJdG8tPmF0dHR5cG1v ZCA9IC0xOwoJCQl0by0+YXR0bGVuID0gdHlwZVR1cC0+dHlwbGVuOwoJCQl0by0+YXR0Ynl2 YWwgPSB0eXBlVHVwLT50eXBieXZhbDsKCQkJdG8tPmF0dGFsaWduID0gdHlwZVR1cC0+dHlw YWxpZ247CgkJCXRvLT5hdHRzdG9yYWdlID0gdHlwZVR1cC0+dHlwc3RvcmFnZTsKCQkJLyog QXMgYWJvdmUsIHVzZSB0aGUgZGVmYXVsdCBjb21wcmVzc2lvbiBtZXRob2QgaW4gdGhpcyBj YXNlICovCgkJCXRvLT5hdHRjb21wcmVzc2lvbiA9IEludmFsaWRDb21wcmVzc2lvbk1ldGhv ZDsKCgkJCVJlbGVhc2VTeXNDYWNoZSh0dXBsZSk7CgkJfQoKCQlwb3B1bGF0ZV9jb21wYWN0 X2F0dHJpYnV0ZShpbmRleFR1cERlc2MsIGkpOwoJfQoKCVR1cGxlRGVzY0ZpbmFsaXplKGlu ZGV4VHVwRGVzYyk7CgoJcmV0dXJuIGluZGV4VHVwRGVzYzsKfQoKLyogLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQog KgkJSW5pdGlhbGl6ZUF0dHJpYnV0ZU9pZHMKICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogKi8Kc3RhdGljIHZv aWQKSW5pdGlhbGl6ZUF0dHJpYnV0ZU9pZHMoUmVsYXRpb24gaW5kZXhSZWxhdGlvbiwKCQkJ CQkJaW50IG51bWF0dHMsCgkJCQkJCU9pZCBpbmRleG9pZCkKewoJVHVwbGVEZXNjCXR1cGxl RGVzY3JpcHRvcjsKCWludAkJCWk7CgoJdHVwbGVEZXNjcmlwdG9yID0gUmVsYXRpb25HZXRE ZXNjcihpbmRleFJlbGF0aW9uKTsKCglmb3IgKGkgPSAwOyBpIDwgbnVtYXR0czsgaSArPSAx KQoJCVR1cGxlRGVzY0F0dHIodHVwbGVEZXNjcmlwdG9yLCBpKS0+YXR0cmVsaWQgPSBpbmRl eG9pZDsKfQoKLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogKgkJQXBwZW5kQXR0cmlidXRlVHVwbGVzCiAqIC0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0KICovCnN0YXRpYyB2b2lkCkFwcGVuZEF0dHJpYnV0ZVR1cGxlcyhSZWxhdGlv biBpbmRleFJlbGF0aW9uLCBjb25zdCBEYXR1bSAqYXR0b3B0cywgY29uc3QgTnVsbGFibGVE YXR1bSAqc3RhdHRhcmdldHMpCnsKCVJlbGF0aW9uCXBnX2F0dHJpYnV0ZTsKCUNhdGFsb2dJ bmRleFN0YXRlIGluZHN0YXRlOwoJVHVwbGVEZXNjCWluZGV4VHVwRGVzYzsKCUZvcm1FeHRy YURhdGFfcGdfYXR0cmlidXRlICphdHRyc19leHRyYSA9IE5VTEw7CgoJaWYgKGF0dG9wdHMp Cgl7CgkJYXR0cnNfZXh0cmEgPSBwYWxsb2MwX2FycmF5KEZvcm1FeHRyYURhdGFfcGdfYXR0 cmlidXRlLCBpbmRleFJlbGF0aW9uLT5yZF9hdHQtPm5hdHRzKTsKCgkJZm9yIChpbnQgaSA9 IDA7IGkgPCBpbmRleFJlbGF0aW9uLT5yZF9hdHQtPm5hdHRzOyBpKyspCgkJewoJCQlpZiAo YXR0b3B0c1tpXSkKCQkJCWF0dHJzX2V4dHJhW2ldLmF0dG9wdGlvbnMudmFsdWUgPSBhdHRv cHRzW2ldOwoJCQllbHNlCgkJCQlhdHRyc19leHRyYVtpXS5hdHRvcHRpb25zLmlzbnVsbCA9 IHRydWU7CgoJCQlpZiAoc3RhdHRhcmdldHMpCgkJCQlhdHRyc19leHRyYVtpXS5hdHRzdGF0 dGFyZ2V0ID0gc3RhdHRhcmdldHNbaV07CgkJCWVsc2UKCQkJCWF0dHJzX2V4dHJhW2ldLmF0 dHN0YXR0YXJnZXQuaXNudWxsID0gdHJ1ZTsKCQl9Cgl9CgoJLyoKCSAqIG9wZW4gdGhlIGF0 dHJpYnV0ZSByZWxhdGlvbiBhbmQgaXRzIGluZGV4ZXMKCSAqLwoJcGdfYXR0cmlidXRlID0g dGFibGVfb3BlbihBdHRyaWJ1dGVSZWxhdGlvbklkLCBSb3dFeGNsdXNpdmVMb2NrKTsKCglp bmRzdGF0ZSA9IENhdGFsb2dPcGVuSW5kZXhlcyhwZ19hdHRyaWJ1dGUpOwoKCS8qCgkgKiBp bnNlcnQgZGF0YSBmcm9tIG5ldyBpbmRleCdzIHR1cGRlc2MgaW50byBwZ19hdHRyaWJ1dGUK CSAqLwoJaW5kZXhUdXBEZXNjID0gUmVsYXRpb25HZXREZXNjcihpbmRleFJlbGF0aW9uKTsK CglJbnNlcnRQZ0F0dHJpYnV0ZVR1cGxlcyhwZ19hdHRyaWJ1dGUsIGluZGV4VHVwRGVzYywg SW52YWxpZE9pZCwgYXR0cnNfZXh0cmEsIGluZHN0YXRlKTsKCglDYXRhbG9nQ2xvc2VJbmRl eGVzKGluZHN0YXRlKTsKCgl0YWJsZV9jbG9zZShwZ19hdHRyaWJ1dGUsIFJvd0V4Y2x1c2l2 ZUxvY2spOwp9CgovKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAqCQlVcGRhdGVJbmRleFJlbGF0aW9uCiAqCiAq IENvbnN0cnVjdCBhbmQgaW5zZXJ0IGEgbmV3IGVudHJ5IGluIHRoZSBwZ19pbmRleCBjYXRh bG9nCiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0KICovCnN0YXRpYyB2b2lkClVwZGF0ZUluZGV4UmVsYXRpb24o T2lkIGluZGV4b2lkLAoJCQkJCU9pZCBoZWFwb2lkLAoJCQkJCU9pZCBwYXJlbnRJbmRleElk LAoJCQkJCWNvbnN0IEluZGV4SW5mbyAqaW5kZXhJbmZvLAoJCQkJCWNvbnN0IE9pZCAqY29s bGF0aW9uT2lkcywKCQkJCQljb25zdCBPaWQgKm9wY2xhc3NPaWRzLAoJCQkJCWNvbnN0IGlu dDE2ICpjb2xvcHRpb25zLAoJCQkJCWJvb2wgcHJpbWFyeSwKCQkJCQlib29sIGlzZXhjbHVz aW9uLAoJCQkJCWJvb2wgaW1tZWRpYXRlLAoJCQkJCWJvb2wgaXN2YWxpZCwKCQkJCQlib29s IGlzcmVhZHkpCnsKCWludDJ2ZWN0b3IgKmluZGtleTsKCW9pZHZlY3RvciAgKmluZGNvbGxh dGlvbjsKCW9pZHZlY3RvciAgKmluZGNsYXNzOwoJaW50MnZlY3RvciAqaW5kb3B0aW9uOwoJ RGF0dW0JCWV4cHJzRGF0dW07CglEYXR1bQkJcHJlZERhdHVtOwoJRGF0dW0JCXZhbHVlc1tO YXR0c19wZ19pbmRleF07Cglib29sCQludWxsc1tOYXR0c19wZ19pbmRleF0gPSB7MH07CglS ZWxhdGlvbglwZ19pbmRleDsKCUhlYXBUdXBsZQl0dXBsZTsKCWludAkJCWk7CgoJLyoKCSAq IENvcHkgdGhlIGluZGV4IGtleSwgb3BjbGFzcywgYW5kIGluZG9wdGlvbiBpbmZvIGludG8g YXJyYXlzIChzaG91bGQgd2UKCSAqIG1ha2UgdGhlIGNhbGxlciBwYXNzIHRoZW0gbGlrZSB0 aGlzIHRvIHN0YXJ0IHdpdGg/KQoJICovCglpbmRrZXkgPSBidWlsZGludDJ2ZWN0b3IoTlVM TCwgaW5kZXhJbmZvLT5paV9OdW1JbmRleEF0dHJzKTsKCWZvciAoaSA9IDA7IGkgPCBpbmRl eEluZm8tPmlpX051bUluZGV4QXR0cnM7IGkrKykKCQlpbmRrZXktPnZhbHVlc1tpXSA9IGlu ZGV4SW5mby0+aWlfSW5kZXhBdHRyTnVtYmVyc1tpXTsKCWluZGNvbGxhdGlvbiA9IGJ1aWxk b2lkdmVjdG9yKGNvbGxhdGlvbk9pZHMsIGluZGV4SW5mby0+aWlfTnVtSW5kZXhLZXlBdHRy cyk7CglpbmRjbGFzcyA9IGJ1aWxkb2lkdmVjdG9yKG9wY2xhc3NPaWRzLCBpbmRleEluZm8t PmlpX051bUluZGV4S2V5QXR0cnMpOwoJaW5kb3B0aW9uID0gYnVpbGRpbnQydmVjdG9yKGNv bG9wdGlvbnMsIGluZGV4SW5mby0+aWlfTnVtSW5kZXhLZXlBdHRycyk7CgoJLyoKCSAqIENv bnZlcnQgdGhlIGluZGV4IGV4cHJlc3Npb25zIChpZiBhbnkpIHRvIGEgdGV4dCBkYXR1bQoJ ICovCglpZiAoaW5kZXhJbmZvLT5paV9FeHByZXNzaW9ucyAhPSBOSUwpCgl7CgkJY2hhcgkg ICAqZXhwcnNTdHJpbmc7CgoJCWV4cHJzU3RyaW5nID0gbm9kZVRvU3RyaW5nKGluZGV4SW5m by0+aWlfRXhwcmVzc2lvbnMpOwoJCWV4cHJzRGF0dW0gPSBDU3RyaW5nR2V0VGV4dERhdHVt KGV4cHJzU3RyaW5nKTsKCQlwZnJlZShleHByc1N0cmluZyk7Cgl9CgllbHNlCgkJZXhwcnNE YXR1bSA9IChEYXR1bSkgMDsKCgkvKgoJICogQ29udmVydCB0aGUgaW5kZXggcHJlZGljYXRl IChpZiBhbnkpIHRvIGEgdGV4dCBkYXR1bS4gIE5vdGUgd2UgY29udmVydAoJICogaW1wbGlj aXQtQU5EIGZvcm1hdCB0byBub3JtYWwgZXhwbGljaXQtQU5EIGZvciBzdG9yYWdlLgoJICov CglpZiAoaW5kZXhJbmZvLT5paV9QcmVkaWNhdGUgIT0gTklMKQoJewoJCWNoYXIJICAgKnBy ZWRTdHJpbmc7CgoJCXByZWRTdHJpbmcgPSBub2RlVG9TdHJpbmcobWFrZV9hbmRzX2V4cGxp Y2l0KGluZGV4SW5mby0+aWlfUHJlZGljYXRlKSk7CgkJcHJlZERhdHVtID0gQ1N0cmluZ0dl dFRleHREYXR1bShwcmVkU3RyaW5nKTsKCQlwZnJlZShwcmVkU3RyaW5nKTsKCX0KCWVsc2UK CQlwcmVkRGF0dW0gPSAoRGF0dW0pIDA7CgoKCS8qCgkgKiBvcGVuIHRoZSBzeXN0ZW0gY2F0 YWxvZyBpbmRleCByZWxhdGlvbgoJICovCglwZ19pbmRleCA9IHRhYmxlX29wZW4oSW5kZXhS ZWxhdGlvbklkLCBSb3dFeGNsdXNpdmVMb2NrKTsKCgkvKgoJICogQnVpbGQgYSBwZ19pbmRl eCB0dXBsZQoJICovCgl2YWx1ZXNbQW51bV9wZ19pbmRleF9pbmRleHJlbGlkIC0gMV0gPSBP YmplY3RJZEdldERhdHVtKGluZGV4b2lkKTsKCXZhbHVlc1tBbnVtX3BnX2luZGV4X2luZHJl bGlkIC0gMV0gPSBPYmplY3RJZEdldERhdHVtKGhlYXBvaWQpOwoJdmFsdWVzW0FudW1fcGdf aW5kZXhfaW5kbmF0dHMgLSAxXSA9IEludDE2R2V0RGF0dW0oaW5kZXhJbmZvLT5paV9OdW1J bmRleEF0dHJzKTsKCXZhbHVlc1tBbnVtX3BnX2luZGV4X2luZG5rZXlhdHRzIC0gMV0gPSBJ bnQxNkdldERhdHVtKGluZGV4SW5mby0+aWlfTnVtSW5kZXhLZXlBdHRycyk7Cgl2YWx1ZXNb QW51bV9wZ19pbmRleF9pbmRpc3VuaXF1ZSAtIDFdID0gQm9vbEdldERhdHVtKGluZGV4SW5m by0+aWlfVW5pcXVlKTsKCXZhbHVlc1tBbnVtX3BnX2luZGV4X2luZG51bGxzbm90ZGlzdGlu Y3QgLSAxXSA9IEJvb2xHZXREYXR1bShpbmRleEluZm8tPmlpX051bGxzTm90RGlzdGluY3Qp OwoJdmFsdWVzW0FudW1fcGdfaW5kZXhfaW5kaXNwcmltYXJ5IC0gMV0gPSBCb29sR2V0RGF0 dW0ocHJpbWFyeSk7Cgl2YWx1ZXNbQW51bV9wZ19pbmRleF9pbmRpc2V4Y2x1c2lvbiAtIDFd ID0gQm9vbEdldERhdHVtKGlzZXhjbHVzaW9uKTsKCXZhbHVlc1tBbnVtX3BnX2luZGV4X2lu ZGltbWVkaWF0ZSAtIDFdID0gQm9vbEdldERhdHVtKGltbWVkaWF0ZSk7Cgl2YWx1ZXNbQW51 bV9wZ19pbmRleF9pbmRpc2NsdXN0ZXJlZCAtIDFdID0gQm9vbEdldERhdHVtKGZhbHNlKTsK CXZhbHVlc1tBbnVtX3BnX2luZGV4X2luZGlzdmFsaWQgLSAxXSA9IEJvb2xHZXREYXR1bShp c3ZhbGlkKTsKCXZhbHVlc1tBbnVtX3BnX2luZGV4X2luZGNoZWNreG1pbiAtIDFdID0gQm9v bEdldERhdHVtKGZhbHNlKTsKCXZhbHVlc1tBbnVtX3BnX2luZGV4X2luZGlzcmVhZHkgLSAx XSA9IEJvb2xHZXREYXR1bShpc3JlYWR5KTsKCXZhbHVlc1tBbnVtX3BnX2luZGV4X2luZGlz bGl2ZSAtIDFdID0gQm9vbEdldERhdHVtKHRydWUpOwoJdmFsdWVzW0FudW1fcGdfaW5kZXhf aW5kaXNyZXBsaWRlbnQgLSAxXSA9IEJvb2xHZXREYXR1bShmYWxzZSk7Cgl2YWx1ZXNbQW51 bV9wZ19pbmRleF9pbmRrZXkgLSAxXSA9IFBvaW50ZXJHZXREYXR1bShpbmRrZXkpOwoJdmFs dWVzW0FudW1fcGdfaW5kZXhfaW5kY29sbGF0aW9uIC0gMV0gPSBQb2ludGVyR2V0RGF0dW0o aW5kY29sbGF0aW9uKTsKCXZhbHVlc1tBbnVtX3BnX2luZGV4X2luZGNsYXNzIC0gMV0gPSBQ b2ludGVyR2V0RGF0dW0oaW5kY2xhc3MpOwoJdmFsdWVzW0FudW1fcGdfaW5kZXhfaW5kb3B0 aW9uIC0gMV0gPSBQb2ludGVyR2V0RGF0dW0oaW5kb3B0aW9uKTsKCXZhbHVlc1tBbnVtX3Bn X2luZGV4X2luZGV4cHJzIC0gMV0gPSBleHByc0RhdHVtOwoJaWYgKGV4cHJzRGF0dW0gPT0g KERhdHVtKSAwKQoJCW51bGxzW0FudW1fcGdfaW5kZXhfaW5kZXhwcnMgLSAxXSA9IHRydWU7 Cgl2YWx1ZXNbQW51bV9wZ19pbmRleF9pbmRwcmVkIC0gMV0gPSBwcmVkRGF0dW07CglpZiAo cHJlZERhdHVtID09IChEYXR1bSkgMCkKCQludWxsc1tBbnVtX3BnX2luZGV4X2luZHByZWQg LSAxXSA9IHRydWU7CgoJdHVwbGUgPSBoZWFwX2Zvcm1fdHVwbGUoUmVsYXRpb25HZXREZXNj cihwZ19pbmRleCksIHZhbHVlcywgbnVsbHMpOwoKCS8qCgkgKiBpbnNlcnQgdGhlIHR1cGxl IGludG8gdGhlIHBnX2luZGV4IGNhdGFsb2cKCSAqLwoJQ2F0YWxvZ1R1cGxlSW5zZXJ0KHBn X2luZGV4LCB0dXBsZSk7CgoJLyoKCSAqIGNsb3NlIHRoZSByZWxhdGlvbiBhbmQgZnJlZSB0 aGUgdHVwbGUKCSAqLwoJdGFibGVfY2xvc2UocGdfaW5kZXgsIFJvd0V4Y2x1c2l2ZUxvY2sp OwoJaGVhcF9mcmVldHVwbGUodHVwbGUpOwp9CgoKLyoKICogaW5kZXhfY3JlYXRlCiAqCiAq IGhlYXBSZWxhdGlvbjogdGFibGUgdG8gYnVpbGQgaW5kZXggb24gKHN1aXRhYmx5IGxvY2tl ZCBieSBjYWxsZXIpCiAqIGluZGV4UmVsYXRpb25OYW1lOiB3aGF0IGl0IHNheQogKiBpbmRl eFJlbGF0aW9uSWQ6IG5vcm1hbGx5LCBwYXNzIEludmFsaWRPaWQgdG8gbGV0IHRoaXMgcm91 dGluZQogKgkJZ2VuZXJhdGUgYW4gT0lEIGZvciB0aGUgaW5kZXguICBEdXJpbmcgYm9vdHN0 cmFwIHRoaXMgbWF5IGJlCiAqCQlub256ZXJvIHRvIHNwZWNpZnkgYSBwcmVzZWxlY3RlZCBP SUQuCiAqIHBhcmVudEluZGV4UmVsaWQ6IGlmIGNyZWF0aW5nIGFuIGluZGV4IHBhcnRpdGlv biwgdGhlIE9JRCBvZiB0aGUKICoJCXBhcmVudCBpbmRleDsgb3RoZXJ3aXNlIEludmFsaWRP aWQuCiAqIHBhcmVudENvbnN0cmFpbnRJZDogaWYgY3JlYXRpbmcgYSBjb25zdHJhaW50IG9u IGEgcGFydGl0aW9uLCB0aGUgT0lECiAqCQlvZiB0aGUgY29uc3RyYWludCBpbiB0aGUgcGFy ZW50OyBvdGhlcndpc2UgSW52YWxpZE9pZC4KICogcmVsRmlsZU51bWJlcjogbm9ybWFsbHks IHBhc3MgSW52YWxpZFJlbEZpbGVOdW1iZXIgdG8gZ2V0IG5ldyBzdG9yYWdlLgogKgkJTWF5 IGJlIG5vbnplcm8gdG8gYXR0YWNoIGFuIGV4aXN0aW5nIHZhbGlkIGJ1aWxkLgogKiBpbmRl eEluZm86IHNhbWUgaW5mbyBleGVjdXRvciB1c2VzIHRvIGluc2VydCBpbnRvIHRoZSBpbmRl eAogKiBpbmRleENvbE5hbWVzOiBjb2x1bW4gbmFtZXMgdG8gdXNlIGZvciBpbmRleCAoTGlz dCBvZiBjaGFyICopCiAqIGFjY2Vzc01ldGhvZElkOiBPSUQgb2YgaW5kZXggQU0gdG8gdXNl CiAqIHRhYmxlU3BhY2VJZDogT0lEIG9mIHRhYmxlc3BhY2UgdG8gdXNlCiAqIGNvbGxhdGlv bklkczogYXJyYXkgb2YgY29sbGF0aW9uIE9JRHMsIG9uZSBwZXIgaW5kZXggY29sdW1uCiAq IG9wY2xhc3NJZHM6IGFycmF5IG9mIGluZGV4IG9wY2xhc3MgT0lEcywgb25lIHBlciBpbmRl eCBjb2x1bW4KICogY29sb3B0aW9uczogYXJyYXkgb2YgcGVyLWluZGV4LWNvbHVtbiBpbmRv cHRpb24gc2V0dGluZ3MKICogcmVsb3B0aW9uczogQU0tc3BlY2lmaWMgb3B0aW9ucwogKiBm bGFnczogYml0bWFzayB0aGF0IGNhbiBpbmNsdWRlIGFueSBjb21iaW5hdGlvbiBvZiB0aGVz ZSBiaXRzOgogKgkJSU5ERVhfQ1JFQVRFX0lTX1BSSU1BUlkKICoJCQl0aGUgaW5kZXggaXMg YSBwcmltYXJ5IGtleQogKgkJSU5ERVhfQ1JFQVRFX0FERF9DT05TVFJBSU5UOgogKgkJCWlu dm9rZSBpbmRleF9jb25zdHJhaW50X2NyZWF0ZSBhbHNvCiAqCQlJTkRFWF9DUkVBVEVfU0tJ UF9CVUlMRDoKICoJCQlza2lwIHRoZSBpbmRleF9idWlsZCgpIHN0ZXAgZm9yIHRoZSBtb21l bnQ7IGNhbGxlciBtdXN0IGRvIGl0CiAqCQkJbGF0ZXIgKHR5cGljYWxseSB2aWEgcmVpbmRl eF9pbmRleCgpKQogKgkJSU5ERVhfQ1JFQVRFX0NPTkNVUlJFTlQ6CiAqCQkJZG8gbm90IGxv Y2sgdGhlIHRhYmxlIGFnYWluc3Qgd3JpdGVycy4gIFRoZSBpbmRleCB3aWxsIGJlCiAqCQkJ bWFya2VkICJpbnZhbGlkIiBhbmQgdGhlIGNhbGxlciBtdXN0IHRha2UgYWRkaXRpb25hbCBz dGVwcwogKgkJCXRvIGZpeCBpdCB1cC4KICoJCUlOREVYX0NSRUFURV9JRl9OT1RfRVhJU1RT OgogKgkJCWRvIG5vdCB0aHJvdyBhbiBlcnJvciBpZiBhIHJlbGF0aW9uIHdpdGggdGhlIHNh bWUgbmFtZQogKgkJCWFscmVhZHkgZXhpc3RzLgogKgkJSU5ERVhfQ1JFQVRFX1BBUlRJVElP TkVEOgogKgkJCWNyZWF0ZSBhIHBhcnRpdGlvbmVkIGluZGV4ICh0YWJsZSBtdXN0IGJlIHBh cnRpdGlvbmVkKQogKgkJSU5ERVhfQ1JFQVRFX1NVUFBSRVNTX1BST0dSRVNTOgogKgkJCWRv bid0IHJlcG9ydCBwcm9ncmVzcyBkdXJpbmcgdGhlIGluZGV4IGJ1aWxkLgogKgogKiBjb25z dHJfZmxhZ3M6IGZsYWdzIHBhc3NlZCB0byBpbmRleF9jb25zdHJhaW50X2NyZWF0ZQogKgkJ KG9ubHkgaWYgSU5ERVhfQ1JFQVRFX0FERF9DT05TVFJBSU5UIGlzIHNldCkKICogYWxsb3df c3lzdGVtX3RhYmxlX21vZHM6IGFsbG93IHRhYmxlIHRvIGJlIGEgc3lzdGVtIGNhdGFsb2cK ICogaXNfaW50ZXJuYWw6IGlmIHRydWUsIHBvc3QgY3JlYXRpb24gaG9vayBmb3IgbmV3IGlu ZGV4CiAqIGNvbnN0cmFpbnRJZDogaWYgbm90IE5VTEwsIHJlY2VpdmVzIE9JRCBvZiBjcmVh dGVkIGNvbnN0cmFpbnQKICoKICogUmV0dXJucyB0aGUgT0lEIG9mIHRoZSBjcmVhdGVkIGlu ZGV4LgogKi8KT2lkCmluZGV4X2NyZWF0ZShSZWxhdGlvbiBoZWFwUmVsYXRpb24sCgkJCSBj b25zdCBjaGFyICppbmRleFJlbGF0aW9uTmFtZSwKCQkJIE9pZCBpbmRleFJlbGF0aW9uSWQs CgkJCSBPaWQgcGFyZW50SW5kZXhSZWxpZCwKCQkJIE9pZCBwYXJlbnRDb25zdHJhaW50SWQs CgkJCSBSZWxGaWxlTnVtYmVyIHJlbEZpbGVOdW1iZXIsCgkJCSBJbmRleEluZm8gKmluZGV4 SW5mbywKCQkJIGNvbnN0IExpc3QgKmluZGV4Q29sTmFtZXMsCgkJCSBPaWQgYWNjZXNzTWV0 aG9kSWQsCgkJCSBPaWQgdGFibGVTcGFjZUlkLAoJCQkgY29uc3QgT2lkICpjb2xsYXRpb25J ZHMsCgkJCSBjb25zdCBPaWQgKm9wY2xhc3NJZHMsCgkJCSBjb25zdCBEYXR1bSAqb3BjbGFz c09wdGlvbnMsCgkJCSBjb25zdCBpbnQxNiAqY29sb3B0aW9ucywKCQkJIGNvbnN0IE51bGxh YmxlRGF0dW0gKnN0YXR0YXJnZXRzLAoJCQkgRGF0dW0gcmVsb3B0aW9ucywKCQkJIHVpbnQx NiBmbGFncywKCQkJIHVpbnQxNiBjb25zdHJfZmxhZ3MsCgkJCSBib29sIGFsbG93X3N5c3Rl bV90YWJsZV9tb2RzLAoJCQkgYm9vbCBpc19pbnRlcm5hbCwKCQkJIE9pZCAqY29uc3RyYWlu dElkKQp7CglPaWQJCQloZWFwUmVsYXRpb25JZCA9IFJlbGF0aW9uR2V0UmVsaWQoaGVhcFJl bGF0aW9uKTsKCVJlbGF0aW9uCXBnX2NsYXNzOwoJUmVsYXRpb24JaW5kZXhSZWxhdGlvbjsK CVR1cGxlRGVzYwlpbmRleFR1cERlc2M7Cglib29sCQlzaGFyZWRfcmVsYXRpb247Cglib29s CQltYXBwZWRfcmVsYXRpb247Cglib29sCQlpc19leGNsdXNpb247CglPaWQJCQluYW1lc3Bh Y2VJZDsKCWludAkJCWk7CgljaGFyCQlyZWxwZXJzaXN0ZW5jZTsKCWJvb2wJCWlzcHJpbWFy eSA9IChmbGFncyAmIElOREVYX0NSRUFURV9JU19QUklNQVJZKSAhPSAwOwoJYm9vbAkJaW52 YWxpZCA9IChmbGFncyAmIElOREVYX0NSRUFURV9JTlZBTElEKSAhPSAwOwoJYm9vbAkJY29u Y3VycmVudCA9IChmbGFncyAmIElOREVYX0NSRUFURV9DT05DVVJSRU5UKSAhPSAwOwoJYm9v bAkJcGFydGl0aW9uZWQgPSAoZmxhZ3MgJiBJTkRFWF9DUkVBVEVfUEFSVElUSU9ORUQpICE9 IDA7Cglib29sCQlwcm9ncmVzcyA9IChmbGFncyAmIElOREVYX0NSRUFURV9TVVBQUkVTU19Q Uk9HUkVTUykgPT0gMDsKCWNoYXIJCXJlbGtpbmQ7CglUcmFuc2FjdGlvbklkIHJlbGZyb3pl bnhpZDsKCU11bHRpWGFjdElkIHJlbG1pbm14aWQ7Cglib29sCQljcmVhdGVfc3RvcmFnZSA9 ICFSZWxGaWxlTnVtYmVySXNWYWxpZChyZWxGaWxlTnVtYmVyKTsKCgkvKiBjb25zdHJhaW50 IGZsYWdzIGNhbiBvbmx5IGJlIHNldCB3aGVuIGEgY29uc3RyYWludCBpcyByZXF1ZXN0ZWQg Ki8KCUFzc2VydCgoY29uc3RyX2ZsYWdzID09IDApIHx8CgkJICAgKChmbGFncyAmIElOREVY X0NSRUFURV9BRERfQ09OU1RSQUlOVCkgIT0gMCkpOwoJLyogcGFydGl0aW9uZWQgaW5kZXhl cyBtdXN0IG5ldmVyIGJlICJidWlsdCIgYnkgdGhlbXNlbHZlcyAqLwoJQXNzZXJ0KCFwYXJ0 aXRpb25lZCB8fCAoZmxhZ3MgJiBJTkRFWF9DUkVBVEVfU0tJUF9CVUlMRCkpOwoKCXJlbGtp bmQgPSBwYXJ0aXRpb25lZCA/IFJFTEtJTkRfUEFSVElUSU9ORURfSU5ERVggOiBSRUxLSU5E X0lOREVYOwoJaXNfZXhjbHVzaW9uID0gKGluZGV4SW5mby0+aWlfRXhjbHVzaW9uT3BzICE9 IE5VTEwpOwoKCXBnX2NsYXNzID0gdGFibGVfb3BlbihSZWxhdGlvblJlbGF0aW9uSWQsIFJv d0V4Y2x1c2l2ZUxvY2spOwoKCS8qCgkgKiBUaGUgaW5kZXggd2lsbCBiZSBpbiB0aGUgc2Ft ZSBuYW1lc3BhY2UgYXMgaXRzIHBhcmVudCB0YWJsZSwgYW5kIGlzCgkgKiBzaGFyZWQgYWNy b3NzIGRhdGFiYXNlcyBpZiBhbmQgb25seSBpZiB0aGUgcGFyZW50IGlzLiAgTGlrZXdpc2Us IGl0CgkgKiB3aWxsIHVzZSB0aGUgcmVsZmlsZW51bWJlciBtYXAgaWYgYW5kIG9ubHkgaWYg dGhlIHBhcmVudCBkb2VzOyBhbmQgaXQKCSAqIGluaGVyaXRzIHRoZSBwYXJlbnQncyByZWxw ZXJzaXN0ZW5jZS4KCSAqLwoJbmFtZXNwYWNlSWQgPSBSZWxhdGlvbkdldE5hbWVzcGFjZSho ZWFwUmVsYXRpb24pOwoJc2hhcmVkX3JlbGF0aW9uID0gaGVhcFJlbGF0aW9uLT5yZF9yZWwt PnJlbGlzc2hhcmVkOwoJbWFwcGVkX3JlbGF0aW9uID0gUmVsYXRpb25Jc01hcHBlZChoZWFw UmVsYXRpb24pOwoJcmVscGVyc2lzdGVuY2UgPSBoZWFwUmVsYXRpb24tPnJkX3JlbC0+cmVs cGVyc2lzdGVuY2U7CgoJLyoKCSAqIGNoZWNrIHBhcmFtZXRlcnMKCSAqLwoJaWYgKGluZGV4 SW5mby0+aWlfTnVtSW5kZXhBdHRycyA8IDEpCgkJZWxvZyhFUlJPUiwgIm11c3QgaW5kZXgg YXQgbGVhc3Qgb25lIGNvbHVtbiIpOwoKCWlmICghYWxsb3dfc3lzdGVtX3RhYmxlX21vZHMg JiYKCQlJc1N5c3RlbVJlbGF0aW9uKGhlYXBSZWxhdGlvbikgJiYKCQlJc05vcm1hbFByb2Nl c3NpbmdNb2RlKCkpCgkJZXJlcG9ydChFUlJPUiwKCQkJCShlcnJjb2RlKEVSUkNPREVfRkVB VFVSRV9OT1RfU1VQUE9SVEVEKSwKCQkJCSBlcnJtc2coInVzZXItZGVmaW5lZCBpbmRleGVz IG9uIHN5c3RlbSBjYXRhbG9nIHRhYmxlcyBhcmUgbm90IHN1cHBvcnRlZCIpKSk7CgoJLyoK CSAqIEJ0cmVlIHRleHRfcGF0dGVybl9vcHMgdXNlcyB0ZXh0ZXEgYXMgdGhlIGVxdWFsaXR5 IG9wZXJhdG9yLCB3aGljaCBpcwoJICogZmluZSBhcyBsb25nIGFzIHRoZSBjb2xsYXRpb24g aXMgZGV0ZXJtaW5pc3RpYzsgdGV4dGVxIHRoZW4gcmVkdWNlcyB0bwoJICogYml0d2lzZSBl cXVhbGl0eSBhbmQgc28gaXQgaXMgc2VtYW50aWNhbGx5IGNvbXBhdGlibGUgd2l0aCB0aGUg b3RoZXIKCSAqIG9wZXJhdG9ycyBhbmQgZnVuY3Rpb25zIGluIHRoYXQgb3BjbGFzcy4gIEJ1 dCB3aXRoIGEgbm9uZGV0ZXJtaW5pc3RpYwoJICogY29sbGF0aW9uLCB0ZXh0ZXEgY291bGQg eWllbGQgcmVzdWx0cyB0aGF0IGFyZSBpbmNvbXBhdGlibGUgd2l0aCB0aGUKCSAqIGFjdHVh bCBiZWhhdmlvciBvZiB0aGUgaW5kZXggKHdoaWNoIGlzIGRldGVybWluZWQgYnkgdGhlIG9w Y2xhc3MncwoJICogY29tcGFyaXNvbiBmdW5jdGlvbikuICBXZSBwcmV2ZW50IHN1Y2ggcHJv YmxlbXMgYnkgcmVmdXNpbmcgY3JlYXRpb24gb2YKCSAqIGFuIGluZGV4IHdpdGggdGhhdCBv cGNsYXNzIGFuZCBhIG5vbmRldGVybWluaXN0aWMgY29sbGF0aW9uLgoJICoKCSAqIFRoZSBz YW1lIGFwcGxpZXMgdG8gdmFyY2hhcl9wYXR0ZXJuX29wcyBhbmQgYnBjaGFyX3BhdHRlcm5f b3BzLiAgSWYgd2UKCSAqIGZpbmQgbW9yZSBjYXNlcywgd2UgbWlnaHQgZGVjaWRlIHRvIGNy ZWF0ZSBhIHJlYWwgbWVjaGFuaXNtIGZvciBtYXJraW5nCgkgKiBvcGNsYXNzZXMgYXMgaW5j b21wYXRpYmxlIHdpdGggbm9uZGV0ZXJtaW5pc207IGJ1dCBmb3Igbm93LCB0aGlzIHNtYWxs CgkgKiBoYWNrIHN1ZmZpY2VzLgoJICoKCSAqIEFub3RoZXIgc29sdXRpb24gaXMgdG8gdXNl IGEgc3BlY2lhbCBvcGVyYXRvciwgbm90IHRleHRlcSwgYXMgdGhlCgkgKiBlcXVhbGl0eSBv cGNsYXNzIG1lbWJlcjsgYnV0IHRoYXQgaXMgdW5kZXNpcmFibGUgYmVjYXVzZSBpdCB3b3Vs ZAoJICogcHJldmVudCBpbmRleCB1c2FnZSBpbiBtYW55IHF1ZXJpZXMgdGhhdCB3b3JrIGZp bmUgdG9kYXkuCgkgKi8KCWZvciAoaSA9IDA7IGkgPCBpbmRleEluZm8tPmlpX051bUluZGV4 S2V5QXR0cnM7IGkrKykKCXsKCQlPaWQJCQljb2xsYXRpb24gPSBjb2xsYXRpb25JZHNbaV07 CgkJT2lkCQkJb3BjbGFzcyA9IG9wY2xhc3NJZHNbaV07CgoJCWlmIChjb2xsYXRpb24pCgkJ ewoJCQlpZiAoKG9wY2xhc3MgPT0gVEVYVF9CVFJFRV9QQVRURVJOX09QU19PSUQgfHwKCQkJ CSBvcGNsYXNzID09IFZBUkNIQVJfQlRSRUVfUEFUVEVSTl9PUFNfT0lEIHx8CgkJCQkgb3Bj bGFzcyA9PSBCUENIQVJfQlRSRUVfUEFUVEVSTl9PUFNfT0lEKSAmJgoJCQkJIWdldF9jb2xs YXRpb25faXNkZXRlcm1pbmlzdGljKGNvbGxhdGlvbikpCgkJCXsKCQkJCUhlYXBUdXBsZQlj bGFzc3R1cDsKCgkJCQljbGFzc3R1cCA9IFNlYXJjaFN5c0NhY2hlMShDTEFPSUQsIE9iamVj dElkR2V0RGF0dW0ob3BjbGFzcykpOwoJCQkJaWYgKCFIZWFwVHVwbGVJc1ZhbGlkKGNsYXNz dHVwKSkKCQkJCQllbG9nKEVSUk9SLCAiY2FjaGUgbG9va3VwIGZhaWxlZCBmb3Igb3BlcmF0 b3IgY2xhc3MgJXUiLCBvcGNsYXNzKTsKCQkJCWVyZXBvcnQoRVJST1IsCgkJCQkJCShlcnJj b2RlKEVSUkNPREVfRkVBVFVSRV9OT1RfU1VQUE9SVEVEKSwKCQkJCQkJIGVycm1zZygibm9u ZGV0ZXJtaW5pc3RpYyBjb2xsYXRpb25zIGFyZSBub3Qgc3VwcG9ydGVkIGZvciBvcGVyYXRv ciBjbGFzcyBcIiVzXCIiLAoJCQkJCQkJCU5hbWVTdHIoKChGb3JtX3BnX29wY2xhc3MpIEdF VFNUUlVDVChjbGFzc3R1cCkpLT5vcGNuYW1lKSkpKTsKCQkJCVJlbGVhc2VTeXNDYWNoZShj bGFzc3R1cCk7CgkJCX0KCQl9Cgl9CgoJLyoKCSAqIENvbmN1cnJlbnQgaW5kZXggYnVpbGQg b24gYSBzeXN0ZW0gY2F0YWxvZyBpcyB1bnNhZmUgYmVjYXVzZSB3ZSB0ZW5kIHRvCgkgKiBy ZWxlYXNlIGxvY2tzIGJlZm9yZSBjb21taXR0aW5nIGluIGNhdGFsb2dzLgoJICovCglpZiAo Y29uY3VycmVudCAmJgoJCUlzQ2F0YWxvZ1JlbGF0aW9uKGhlYXBSZWxhdGlvbikpCgkJZXJl cG9ydChFUlJPUiwKCQkJCShlcnJjb2RlKEVSUkNPREVfRkVBVFVSRV9OT1RfU1VQUE9SVEVE KSwKCQkJCSBlcnJtc2coImNvbmN1cnJlbnQgaW5kZXggY3JlYXRpb24gb24gc3lzdGVtIGNh dGFsb2cgdGFibGVzIGlzIG5vdCBzdXBwb3J0ZWQiKSkpOwoKCS8qCgkgKiBUaGlzIGNhc2Ug aXMgY3VycmVudGx5IG5vdCBzdXBwb3J0ZWQuICBUaGVyZSdzIG5vIHdheSB0byBhc2sgZm9y IGl0IGluCgkgKiB0aGUgZ3JhbW1hciB3aXRoIENSRUFURSBJTkRFWCwgYnV0IGl0IGNhbiBo YXBwZW4gd2l0aCBSRUlOREVYLgoJICovCglpZiAoY29uY3VycmVudCAmJiBpc19leGNsdXNp b24pCgkJZXJlcG9ydChFUlJPUiwKCQkJCShlcnJjb2RlKEVSUkNPREVfRkVBVFVSRV9OT1Rf U1VQUE9SVEVEKSwKCQkJCSBlcnJtc2coImNvbmN1cnJlbnQgaW5kZXggY3JlYXRpb24gZm9y IGV4Y2x1c2lvbiBjb25zdHJhaW50cyBpcyBub3Qgc3VwcG9ydGVkIikpKTsKCgkvKgoJICog V2UgY2Fubm90IGFsbG93IGluZGV4aW5nIGEgc2hhcmVkIHJlbGF0aW9uIGFmdGVyIGluaXRk YiAoYmVjYXVzZQoJICogdGhlcmUncyBubyB3YXkgdG8gbWFrZSB0aGUgZW50cnkgaW4gb3Ro ZXIgZGF0YWJhc2VzJyBwZ19jbGFzcykuCgkgKi8KCWlmIChzaGFyZWRfcmVsYXRpb24gJiYg IUlzQm9vdHN0cmFwUHJvY2Vzc2luZ01vZGUoKSkKCQllcmVwb3J0KEVSUk9SLAoJCQkJKGVy cmNvZGUoRVJSQ09ERV9PQkpFQ1RfTk9UX0lOX1BSRVJFUVVJU0lURV9TVEFURSksCgkJCQkg ZXJybXNnKCJzaGFyZWQgaW5kZXhlcyBjYW5ub3QgYmUgY3JlYXRlZCBhZnRlciBpbml0ZGIi KSkpOwoKCS8qCgkgKiBTaGFyZWQgcmVsYXRpb25zIG11c3QgYmUgaW4gcGdfZ2xvYmFsLCB0 b28gKGxhc3QtZGl0Y2ggY2hlY2spCgkgKi8KCWlmIChzaGFyZWRfcmVsYXRpb24gJiYgdGFi bGVTcGFjZUlkICE9IEdMT0JBTFRBQkxFU1BBQ0VfT0lEKQoJCWVsb2coRVJST1IsICJzaGFy ZWQgcmVsYXRpb25zIG11c3QgYmUgcGxhY2VkIGluIHBnX2dsb2JhbCB0YWJsZXNwYWNlIik7 CgoJLyoKCSAqIENoZWNrIGZvciBkdXBsaWNhdGUgbmFtZSAoYm90aCBhcyB0byB0aGUgaW5k ZXgsIGFuZCBhcyB0byB0aGUKCSAqIGFzc29jaWF0ZWQgY29uc3RyYWludCBpZiBhbnkpLiAg U3VjaCBjYXNlcyB3b3VsZCBmYWlsIG9uIHRoZSByZWxldmFudAoJICogY2F0YWxvZ3MnIHVu aXF1ZSBpbmRleGVzIGFueXdheSwgYnV0IHdlIHByZWZlciB0byBnaXZlIGEgZnJpZW5kbGll cgoJICogZXJyb3IgbWVzc2FnZS4KCSAqLwoJaWYgKGdldF9yZWxuYW1lX3JlbGlkKGluZGV4 UmVsYXRpb25OYW1lLCBuYW1lc3BhY2VJZCkpCgl7CgkJaWYgKChmbGFncyAmIElOREVYX0NS RUFURV9JRl9OT1RfRVhJU1RTKSAhPSAwKQoJCXsKCQkJZXJlcG9ydChOT1RJQ0UsCgkJCQkJ KGVycmNvZGUoRVJSQ09ERV9EVVBMSUNBVEVfVEFCTEUpLAoJCQkJCSBlcnJtc2coInJlbGF0 aW9uIFwiJXNcIiBhbHJlYWR5IGV4aXN0cywgc2tpcHBpbmciLAoJCQkJCQkJaW5kZXhSZWxh dGlvbk5hbWUpKSk7CgkJCXRhYmxlX2Nsb3NlKHBnX2NsYXNzLCBSb3dFeGNsdXNpdmVMb2Nr KTsKCQkJcmV0dXJuIEludmFsaWRPaWQ7CgkJfQoKCQllcmVwb3J0KEVSUk9SLAoJCQkJKGVy cmNvZGUoRVJSQ09ERV9EVVBMSUNBVEVfVEFCTEUpLAoJCQkJIGVycm1zZygicmVsYXRpb24g XCIlc1wiIGFscmVhZHkgZXhpc3RzIiwKCQkJCQkJaW5kZXhSZWxhdGlvbk5hbWUpKSk7Cgl9 CgoJaWYgKChmbGFncyAmIElOREVYX0NSRUFURV9BRERfQ09OU1RSQUlOVCkgIT0gMCAmJgoJ CUNvbnN0cmFpbnROYW1lSXNVc2VkKENPTlNUUkFJTlRfUkVMQVRJT04sIGhlYXBSZWxhdGlv bklkLAoJCQkJCQkJIGluZGV4UmVsYXRpb25OYW1lKSkKCXsKCQkvKgoJCSAqIElOREVYX0NS RUFURV9JRl9OT1RfRVhJU1RTIGRvZXMgbm90IGFwcGx5IGhlcmUsIHNpbmNlIHRoZQoJCSAq IGNvbmZsaWN0aW5nIGNvbnN0cmFpbnQgaXMgbm90IGFuIGluZGV4LgoJCSAqLwoJCWVyZXBv cnQoRVJST1IsCgkJCQkoZXJyY29kZShFUlJDT0RFX0RVUExJQ0FURV9PQkpFQ1QpLAoJCQkJ IGVycm1zZygiY29uc3RyYWludCBcIiVzXCIgZm9yIHJlbGF0aW9uIFwiJXNcIiBhbHJlYWR5 IGV4aXN0cyIsCgkJCQkJCWluZGV4UmVsYXRpb25OYW1lLCBSZWxhdGlvbkdldFJlbGF0aW9u TmFtZShoZWFwUmVsYXRpb24pKSkpOwoJfQoKCS8qCgkgKiBjb25zdHJ1Y3QgdHVwbGUgZGVz Y3JpcHRvciBmb3IgaW5kZXggdHVwbGVzCgkgKi8KCWluZGV4VHVwRGVzYyA9IENvbnN0cnVj dFR1cGxlRGVzY3JpcHRvcihoZWFwUmVsYXRpb24sCgkJCQkJCQkJCQkJaW5kZXhJbmZvLAoJ CQkJCQkJCQkJCWluZGV4Q29sTmFtZXMsCgkJCQkJCQkJCQkJYWNjZXNzTWV0aG9kSWQsCgkJ CQkJCQkJCQkJY29sbGF0aW9uSWRzLAoJCQkJCQkJCQkJCW9wY2xhc3NJZHMpOwoKCS8qCgkg KiBBbGxvY2F0ZSBhbiBPSUQgZm9yIHRoZSBpbmRleCwgdW5sZXNzIHdlIHdlcmUgdG9sZCB3 aGF0IHRvIHVzZS4KCSAqCgkgKiBUaGUgT0lEIHdpbGwgYmUgdGhlIHJlbGZpbGVudW1iZXIg YXMgd2VsbCwgc28gbWFrZSBzdXJlIGl0IGRvZXNuJ3QKCSAqIGNvbGxpZGUgd2l0aCBlaXRo ZXIgcGdfY2xhc3MgT0lEcyBvciBleGlzdGluZyBwaHlzaWNhbCBmaWxlcy4KCSAqLwoJaWYg KCFPaWRJc1ZhbGlkKGluZGV4UmVsYXRpb25JZCkpCgl7CgkJLyogVXNlIGJpbmFyeS11cGdy YWRlIG92ZXJyaWRlIGZvciBwZ19jbGFzcy5vaWQgYW5kIHJlbGZpbGVudW1iZXIgKi8KCQlp ZiAoSXNCaW5hcnlVcGdyYWRlKQoJCXsKCQkJaWYgKCFPaWRJc1ZhbGlkKGJpbmFyeV91cGdy YWRlX25leHRfaW5kZXhfcGdfY2xhc3Nfb2lkKSkKCQkJCWVyZXBvcnQoRVJST1IsCgkJCQkJ CShlcnJjb2RlKEVSUkNPREVfSU5WQUxJRF9QQVJBTUVURVJfVkFMVUUpLAoJCQkJCQkgZXJy bXNnKCJwZ19jbGFzcyBpbmRleCBPSUQgdmFsdWUgbm90IHNldCB3aGVuIGluIGJpbmFyeSB1 cGdyYWRlIG1vZGUiKSkpOwoKCQkJaW5kZXhSZWxhdGlvbklkID0gYmluYXJ5X3VwZ3JhZGVf bmV4dF9pbmRleF9wZ19jbGFzc19vaWQ7CgkJCWJpbmFyeV91cGdyYWRlX25leHRfaW5kZXhf cGdfY2xhc3Nfb2lkID0gSW52YWxpZE9pZDsKCgkJCS8qIE92ZXJyaWRlIHRoZSBpbmRleCBy ZWxmaWxlbnVtYmVyICovCgkJCWlmICgocmVsa2luZCA9PSBSRUxLSU5EX0lOREVYKSAmJgoJ CQkJKCFSZWxGaWxlTnVtYmVySXNWYWxpZChiaW5hcnlfdXBncmFkZV9uZXh0X2luZGV4X3Bn X2NsYXNzX3JlbGZpbGVudW1iZXIpKSkKCQkJCWVyZXBvcnQoRVJST1IsCgkJCQkJCShlcnJj b2RlKEVSUkNPREVfSU5WQUxJRF9QQVJBTUVURVJfVkFMVUUpLAoJCQkJCQkgZXJybXNnKCJp bmRleCByZWxmaWxlbnVtYmVyIHZhbHVlIG5vdCBzZXQgd2hlbiBpbiBiaW5hcnkgdXBncmFk ZSBtb2RlIikpKTsKCQkJcmVsRmlsZU51bWJlciA9IGJpbmFyeV91cGdyYWRlX25leHRfaW5k ZXhfcGdfY2xhc3NfcmVsZmlsZW51bWJlcjsKCQkJYmluYXJ5X3VwZ3JhZGVfbmV4dF9pbmRl eF9wZ19jbGFzc19yZWxmaWxlbnVtYmVyID0gSW52YWxpZFJlbEZpbGVOdW1iZXI7CgoJCQkv KgoJCQkgKiBOb3RlIHRoYXQgd2Ugd2FudCBjcmVhdGVfc3RvcmFnZSA9IHRydWUgZm9yIGJp bmFyeSB1cGdyYWRlLiBUaGUKCQkJICogc3RvcmFnZSB3ZSBjcmVhdGUgaGVyZSB3aWxsIGJl IHJlcGxhY2VkIGxhdGVyLCBidXQgd2UgbmVlZCB0bwoJCQkgKiBoYXZlIHNvbWV0aGluZyBv biBkaXNrIGluIHRoZSBtZWFud2hpbGUuCgkJCSAqLwoJCQlBc3NlcnQoY3JlYXRlX3N0b3Jh Z2UpOwoJCX0KCQllbHNlCgkJewoJCQlpbmRleFJlbGF0aW9uSWQgPQoJCQkJR2V0TmV3UmVs RmlsZU51bWJlcih0YWJsZVNwYWNlSWQsIHBnX2NsYXNzLCByZWxwZXJzaXN0ZW5jZSk7CgkJ fQoJfQoKCS8qCgkgKiBjcmVhdGUgdGhlIGluZGV4IHJlbGF0aW9uJ3MgcmVsY2FjaGUgZW50 cnkgYW5kLCBpZiBuZWNlc3NhcnksIHRoZQoJICogcGh5c2ljYWwgZGlzayBmaWxlLiAoSWYg d2UgZmFpbCBmdXJ0aGVyIGRvd24sIGl0J3MgdGhlIHNtZ3IncwoJICogcmVzcG9uc2liaWxp dHkgdG8gcmVtb3ZlIHRoZSBkaXNrIGZpbGUgYWdhaW4sIGlmIGFueS4pCgkgKi8KCWluZGV4 UmVsYXRpb24gPSBoZWFwX2NyZWF0ZShpbmRleFJlbGF0aW9uTmFtZSwKCQkJCQkJCQluYW1l c3BhY2VJZCwKCQkJCQkJCQl0YWJsZVNwYWNlSWQsCgkJCQkJCQkJaW5kZXhSZWxhdGlvbklk LAoJCQkJCQkJCXJlbEZpbGVOdW1iZXIsCgkJCQkJCQkJYWNjZXNzTWV0aG9kSWQsCgkJCQkJ CQkJaW5kZXhUdXBEZXNjLAoJCQkJCQkJCXJlbGtpbmQsCgkJCQkJCQkJcmVscGVyc2lzdGVu Y2UsCgkJCQkJCQkJc2hhcmVkX3JlbGF0aW9uLAoJCQkJCQkJCW1hcHBlZF9yZWxhdGlvbiwK CQkJCQkJCQlhbGxvd19zeXN0ZW1fdGFibGVfbW9kcywKCQkJCQkJCQkmcmVsZnJvemVueGlk LAoJCQkJCQkJCSZyZWxtaW5teGlkLAoJCQkJCQkJCWNyZWF0ZV9zdG9yYWdlKTsKCglBc3Nl cnQocmVsZnJvemVueGlkID09IEludmFsaWRUcmFuc2FjdGlvbklkKTsKCUFzc2VydChyZWxt aW5teGlkID09IEludmFsaWRNdWx0aVhhY3RJZCk7CglBc3NlcnQoaW5kZXhSZWxhdGlvbklk ID09IFJlbGF0aW9uR2V0UmVsaWQoaW5kZXhSZWxhdGlvbikpOwoKCS8qCgkgKiBPYnRhaW4g ZXhjbHVzaXZlIGxvY2sgb24gaXQuICBBbHRob3VnaCBubyBvdGhlciB0cmFuc2FjdGlvbnMg Y2FuIHNlZSBpdAoJICogdW50aWwgd2UgY29tbWl0LCB0aGlzIHByZXZlbnRzIGRlYWRsb2Nr LXJpc2sgY29tcGxhaW50cyBmcm9tIGxvY2sKCSAqIG1hbmFnZXIgaW4gY2FzZXMgc3VjaCBh cyBDTFVTVEVSLgoJICovCglMb2NrUmVsYXRpb24oaW5kZXhSZWxhdGlvbiwgQWNjZXNzRXhj bHVzaXZlTG9jayk7CgoJLyoKCSAqIEZpbGwgaW4gZmllbGRzIG9mIHRoZSBpbmRleCdzIHBn X2NsYXNzIGVudHJ5IHRoYXQgYXJlIG5vdCBzZXQgY29ycmVjdGx5CgkgKiBieSBoZWFwX2Ny ZWF0ZS4KCSAqCgkgKiBYWFggc2hvdWxkIGhhdmUgYSBjbGVhbmVyIHdheSB0byBjcmVhdGUg Y2F0YWxvZ2VkIGluZGV4ZXMKCSAqLwoJaW5kZXhSZWxhdGlvbi0+cmRfcmVsLT5yZWxvd25l ciA9IGhlYXBSZWxhdGlvbi0+cmRfcmVsLT5yZWxvd25lcjsKCWluZGV4UmVsYXRpb24tPnJk X3JlbC0+cmVsYW0gPSBhY2Nlc3NNZXRob2RJZDsKCWluZGV4UmVsYXRpb24tPnJkX3JlbC0+ cmVsaXNwYXJ0aXRpb24gPSBPaWRJc1ZhbGlkKHBhcmVudEluZGV4UmVsaWQpOwoKCS8qCgkg KiBzdG9yZSBpbmRleCdzIHBnX2NsYXNzIGVudHJ5CgkgKi8KCUluc2VydFBnQ2xhc3NUdXBs ZShwZ19jbGFzcywgaW5kZXhSZWxhdGlvbiwKCQkJCQkgICBSZWxhdGlvbkdldFJlbGlkKGlu ZGV4UmVsYXRpb24pLAoJCQkJCSAgIChEYXR1bSkgMCwKCQkJCQkgICByZWxvcHRpb25zKTsK CgkvKiBkb25lIHdpdGggcGdfY2xhc3MgKi8KCXRhYmxlX2Nsb3NlKHBnX2NsYXNzLCBSb3dF eGNsdXNpdmVMb2NrKTsKCgkvKgoJICogbm93IHVwZGF0ZSB0aGUgb2JqZWN0IGlkJ3Mgb2Yg YWxsIHRoZSBhdHRyaWJ1dGUgdHVwbGUgZm9ybXMgaW4gdGhlCgkgKiBpbmRleCByZWxhdGlv bidzIHR1cGxlIGRlc2NyaXB0b3IKCSAqLwoJSW5pdGlhbGl6ZUF0dHJpYnV0ZU9pZHMoaW5k ZXhSZWxhdGlvbiwKCQkJCQkJCWluZGV4SW5mby0+aWlfTnVtSW5kZXhBdHRycywKCQkJCQkJ CWluZGV4UmVsYXRpb25JZCk7CgoJLyoKCSAqIGFwcGVuZCBBVFRSSUJVVEUgdHVwbGVzIGZv ciB0aGUgaW5kZXgKCSAqLwoJQXBwZW5kQXR0cmlidXRlVHVwbGVzKGluZGV4UmVsYXRpb24s IG9wY2xhc3NPcHRpb25zLCBzdGF0dGFyZ2V0cyk7CgoJLyogLS0tLS0tLS0tLS0tLS0tLQoJ ICoJICB1cGRhdGUgcGdfaW5kZXgKCSAqCSAgKGFwcGVuZCBJTkRFWCB0dXBsZSkKCSAqCgkg KgkgIE5vdGUgdGhhdCB0aGlzIHN0b3dzIGF3YXkgYSByZXByZXNlbnRhdGlvbiBvZiAicHJl ZGljYXRlIi4KCSAqCSAgKE9yLCBjb3VsZCBkZWZpbmUgYSBydWxlIHRvIG1haW50YWluIHRo ZSBwcmVkaWNhdGUpIC0tTmVscywgRmViICc5MgoJICogLS0tLS0tLS0tLS0tLS0tLQoJICov CglVcGRhdGVJbmRleFJlbGF0aW9uKGluZGV4UmVsYXRpb25JZCwgaGVhcFJlbGF0aW9uSWQs IHBhcmVudEluZGV4UmVsaWQsCgkJCQkJCWluZGV4SW5mbywKCQkJCQkJY29sbGF0aW9uSWRz LCBvcGNsYXNzSWRzLCBjb2xvcHRpb25zLAoJCQkJCQlpc3ByaW1hcnksIGlzX2V4Y2x1c2lv biwKCQkJCQkJKGNvbnN0cl9mbGFncyAmIElOREVYX0NPTlNUUl9DUkVBVEVfREVGRVJSQUJM RSkgPT0gMCwKCQkJCQkJIWNvbmN1cnJlbnQgJiYgIWludmFsaWQsCgkJCQkJCSFjb25jdXJy ZW50KTsKCgkvKgoJICogUmVnaXN0ZXIgcmVsY2FjaGUgaW52YWxpZGF0aW9uIG9uIHRoZSBp bmRleGVzJyBoZWFwIHJlbGF0aW9uLCB0bwoJICogbWFpbnRhaW4gY29uc2lzdGVuY3kgb2Yg aXRzIGluZGV4IGxpc3QKCSAqLwoJQ2FjaGVJbnZhbGlkYXRlUmVsY2FjaGUoaGVhcFJlbGF0 aW9uKTsKCgkvKiB1cGRhdGUgcGdfaW5oZXJpdHMgYW5kIHRoZSBwYXJlbnQncyByZWxoYXNz dWJjbGFzcywgaWYgbmVlZGVkICovCglpZiAoT2lkSXNWYWxpZChwYXJlbnRJbmRleFJlbGlk KSkKCXsKCQlTdG9yZVNpbmdsZUluaGVyaXRhbmNlKGluZGV4UmVsYXRpb25JZCwgcGFyZW50 SW5kZXhSZWxpZCwgMSk7CgkJTG9ja1JlbGF0aW9uT2lkKHBhcmVudEluZGV4UmVsaWQsIFNo YXJlVXBkYXRlRXhjbHVzaXZlTG9jayk7CgkJU2V0UmVsYXRpb25IYXNTdWJjbGFzcyhwYXJl bnRJbmRleFJlbGlkLCB0cnVlKTsKCX0KCgkvKgoJICogUmVnaXN0ZXIgY29uc3RyYWludCBh bmQgZGVwZW5kZW5jaWVzIGZvciB0aGUgaW5kZXguCgkgKgoJICogSWYgdGhlIGluZGV4IGlz IGZyb20gYSBDT05TVFJBSU5UIGNsYXVzZSwgY29uc3RydWN0IGEgcGdfY29uc3RyYWludAoJ ICogZW50cnkuICBUaGUgaW5kZXggd2lsbCBiZSBsaW5rZWQgdG8gdGhlIGNvbnN0cmFpbnQs IHdoaWNoIGluIHR1cm4gaXMKCSAqIGxpbmtlZCB0byB0aGUgdGFibGUuICBJZiBpdCdzIG5v dCBhIENPTlNUUkFJTlQsIHdlIG5lZWQgdG8gbWFrZSBhCgkgKiBkZXBlbmRlbmN5IGRpcmVj dGx5IG9uIHRoZSB0YWJsZS4KCSAqCgkgKiBXZSBkb24ndCBuZWVkIGEgZGVwZW5kZW5jeSBv biB0aGUgbmFtZXNwYWNlLCBiZWNhdXNlIHRoZXJlJ2xsIGJlIGFuCgkgKiBpbmRpcmVjdCBk ZXBlbmRlbmN5IHZpYSBvdXIgcGFyZW50IHRhYmxlLgoJICoKCSAqIER1cmluZyBib290c3Ry YXAgd2UgY2FuJ3QgcmVnaXN0ZXIgYW55IGRlcGVuZGVuY2llcywgYW5kIHdlIGRvbid0IHRy eQoJICogdG8gbWFrZSBhIGNvbnN0cmFpbnQgZWl0aGVyLgoJICovCglpZiAoIUlzQm9vdHN0 cmFwUHJvY2Vzc2luZ01vZGUoKSkKCXsKCQlPYmplY3RBZGRyZXNzIG15c2VsZiwKCQkJCQly ZWZlcmVuY2VkOwoJCU9iamVjdEFkZHJlc3NlcyAqYWRkcnM7CgoJCU9iamVjdEFkZHJlc3NT ZXQobXlzZWxmLCBSZWxhdGlvblJlbGF0aW9uSWQsIGluZGV4UmVsYXRpb25JZCk7CgoJCWlm ICgoZmxhZ3MgJiBJTkRFWF9DUkVBVEVfQUREX0NPTlNUUkFJTlQpICE9IDApCgkJewoJCQlj aGFyCQljb25zdHJhaW50VHlwZTsKCQkJT2JqZWN0QWRkcmVzcyBsb2NhbGFkZHI7CgoJCQlp ZiAoaXNwcmltYXJ5KQoJCQkJY29uc3RyYWludFR5cGUgPSBDT05TVFJBSU5UX1BSSU1BUlk7 CgkJCWVsc2UgaWYgKGluZGV4SW5mby0+aWlfVW5pcXVlKQoJCQkJY29uc3RyYWludFR5cGUg PSBDT05TVFJBSU5UX1VOSVFVRTsKCQkJZWxzZSBpZiAoaXNfZXhjbHVzaW9uKQoJCQkJY29u c3RyYWludFR5cGUgPSBDT05TVFJBSU5UX0VYQ0xVU0lPTjsKCQkJZWxzZQoJCQl7CgkJCQll bG9nKEVSUk9SLCAiY29uc3RyYWludCBtdXN0IGJlIFBSSU1BUlksIFVOSVFVRSBvciBFWENM VURFIik7CgkJCQljb25zdHJhaW50VHlwZSA9IDA7IC8qIGtlZXAgY29tcGlsZXIgcXVpZXQg Ki8KCQkJfQoKCQkJbG9jYWxhZGRyID0gaW5kZXhfY29uc3RyYWludF9jcmVhdGUoaGVhcFJl bGF0aW9uLAoJCQkJCQkJCQkJCQlpbmRleFJlbGF0aW9uSWQsCgkJCQkJCQkJCQkJCXBhcmVu dENvbnN0cmFpbnRJZCwKCQkJCQkJCQkJCQkJaW5kZXhJbmZvLAoJCQkJCQkJCQkJCQlpbmRl eFJlbGF0aW9uTmFtZSwKCQkJCQkJCQkJCQkJY29uc3RyYWludFR5cGUsCgkJCQkJCQkJCQkJ CWNvbnN0cl9mbGFncywKCQkJCQkJCQkJCQkJYWxsb3dfc3lzdGVtX3RhYmxlX21vZHMsCgkJ CQkJCQkJCQkJCWlzX2ludGVybmFsKTsKCQkJaWYgKGNvbnN0cmFpbnRJZCkKCQkJCSpjb25z dHJhaW50SWQgPSBsb2NhbGFkZHIub2JqZWN0SWQ7CgkJfQoJCWVsc2UKCQl7CgkJCWJvb2wJ CWhhdmVfc2ltcGxlX2NvbCA9IGZhbHNlOwoKCQkJYWRkcnMgPSBuZXdfb2JqZWN0X2FkZHJl c3NlcygpOwoKCQkJLyogQ3JlYXRlIGF1dG8gZGVwZW5kZW5jaWVzIG9uIHNpbXBseS1yZWZl cmVuY2VkIGNvbHVtbnMgKi8KCQkJZm9yIChpID0gMDsgaSA8IGluZGV4SW5mby0+aWlfTnVt SW5kZXhBdHRyczsgaSsrKQoJCQl7CgkJCQlpZiAoaW5kZXhJbmZvLT5paV9JbmRleEF0dHJO dW1iZXJzW2ldICE9IDApCgkJCQl7CgkJCQkJT2JqZWN0QWRkcmVzc1N1YlNldChyZWZlcmVu Y2VkLCBSZWxhdGlvblJlbGF0aW9uSWQsCgkJCQkJCQkJCQloZWFwUmVsYXRpb25JZCwKCQkJ CQkJCQkJCWluZGV4SW5mby0+aWlfSW5kZXhBdHRyTnVtYmVyc1tpXSk7CgkJCQkJYWRkX2V4 YWN0X29iamVjdF9hZGRyZXNzKCZyZWZlcmVuY2VkLCBhZGRycyk7CgkJCQkJaGF2ZV9zaW1w bGVfY29sID0gdHJ1ZTsKCQkJCX0KCQkJfQoKCQkJLyoKCQkJICogSWYgdGhlcmUgYXJlIG5v IHNpbXBseS1yZWZlcmVuY2VkIGNvbHVtbnMsIGdpdmUgdGhlIGluZGV4IGFuCgkJCSAqIGF1 dG8gZGVwZW5kZW5jeSBvbiB0aGUgd2hvbGUgdGFibGUuICBJbiBtb3N0IGNhc2VzLCB0aGlz IHdpbGwKCQkJICogYmUgcmVkdW5kYW50LCBidXQgaXQgbWlnaHQgbm90IGJlIGlmIHRoZSBp bmRleCBleHByZXNzaW9ucyBhbmQKCQkJICogcHJlZGljYXRlIGNvbnRhaW4gbm8gVmFycyBv ciBvbmx5IHdob2xlLXJvdyBWYXJzLgoJCQkgKi8KCQkJaWYgKCFoYXZlX3NpbXBsZV9jb2wp CgkJCXsKCQkJCU9iamVjdEFkZHJlc3NTZXQocmVmZXJlbmNlZCwgUmVsYXRpb25SZWxhdGlv bklkLAoJCQkJCQkJCSBoZWFwUmVsYXRpb25JZCk7CgkJCQlhZGRfZXhhY3Rfb2JqZWN0X2Fk ZHJlc3MoJnJlZmVyZW5jZWQsIGFkZHJzKTsKCQkJfQoKCQkJcmVjb3JkX29iamVjdF9hZGRy ZXNzX2RlcGVuZGVuY2llcygmbXlzZWxmLCBhZGRycywgREVQRU5ERU5DWV9BVVRPKTsKCQkJ ZnJlZV9vYmplY3RfYWRkcmVzc2VzKGFkZHJzKTsKCQl9CgoJCS8qCgkJICogSWYgdGhpcyBp cyBhbiBpbmRleCBwYXJ0aXRpb24sIGNyZWF0ZSBwYXJ0aXRpb24gZGVwZW5kZW5jaWVzIG9u CgkJICogYm90aCB0aGUgcGFyZW50IGluZGV4IGFuZCB0aGUgdGFibGUuICAoTm90ZTogdGhl c2UgbXVzdCBiZSAqaW4KCQkgKiBhZGRpdGlvbiB0byosIG5vdCBpbnN0ZWFkIG9mLCBhbGwg b3RoZXIgZGVwZW5kZW5jaWVzLiAgT3RoZXJ3aXNlCgkJICogd2UnbGwgYmUgc2hvcnQgc29t ZSBkZXBlbmRlbmNpZXMgYWZ0ZXIgREVUQUNIIFBBUlRJVElPTi4pCgkJICovCgkJaWYgKE9p ZElzVmFsaWQocGFyZW50SW5kZXhSZWxpZCkpCgkJewoJCQlPYmplY3RBZGRyZXNzU2V0KHJl ZmVyZW5jZWQsIFJlbGF0aW9uUmVsYXRpb25JZCwgcGFyZW50SW5kZXhSZWxpZCk7CgkJCXJl Y29yZERlcGVuZGVuY3lPbigmbXlzZWxmLCAmcmVmZXJlbmNlZCwgREVQRU5ERU5DWV9QQVJU SVRJT05fUFJJKTsKCgkJCU9iamVjdEFkZHJlc3NTZXQocmVmZXJlbmNlZCwgUmVsYXRpb25S ZWxhdGlvbklkLCBoZWFwUmVsYXRpb25JZCk7CgkJCXJlY29yZERlcGVuZGVuY3lPbigmbXlz ZWxmLCAmcmVmZXJlbmNlZCwgREVQRU5ERU5DWV9QQVJUSVRJT05fU0VDKTsKCQl9CgoJCS8q IHBsYWNlaG9sZGVyIGZvciBub3JtYWwgZGVwZW5kZW5jaWVzICovCgkJYWRkcnMgPSBuZXdf b2JqZWN0X2FkZHJlc3NlcygpOwoKCQkvKiBTdG9yZSBkZXBlbmRlbmN5IG9uIGNvbGxhdGlv bnMgKi8KCgkJLyogVGhlIGRlZmF1bHQgY29sbGF0aW9uIGlzIHBpbm5lZCwgc28gZG9uJ3Qg Ym90aGVyIHJlY29yZGluZyBpdCAqLwoJCWZvciAoaSA9IDA7IGkgPCBpbmRleEluZm8tPmlp X051bUluZGV4S2V5QXR0cnM7IGkrKykKCQl7CgkJCWlmIChPaWRJc1ZhbGlkKGNvbGxhdGlv bklkc1tpXSkgJiYgY29sbGF0aW9uSWRzW2ldICE9IERFRkFVTFRfQ09MTEFUSU9OX09JRCkK CQkJewoJCQkJT2JqZWN0QWRkcmVzc1NldChyZWZlcmVuY2VkLCBDb2xsYXRpb25SZWxhdGlv bklkLCBjb2xsYXRpb25JZHNbaV0pOwoJCQkJYWRkX2V4YWN0X29iamVjdF9hZGRyZXNzKCZy ZWZlcmVuY2VkLCBhZGRycyk7CgkJCX0KCQl9CgoJCS8qIFN0b3JlIGRlcGVuZGVuY3kgb24g b3BlcmF0b3IgY2xhc3NlcyAqLwoJCWZvciAoaSA9IDA7IGkgPCBpbmRleEluZm8tPmlpX051 bUluZGV4S2V5QXR0cnM7IGkrKykKCQl7CgkJCU9iamVjdEFkZHJlc3NTZXQocmVmZXJlbmNl ZCwgT3BlcmF0b3JDbGFzc1JlbGF0aW9uSWQsIG9wY2xhc3NJZHNbaV0pOwoJCQlhZGRfZXhh Y3Rfb2JqZWN0X2FkZHJlc3MoJnJlZmVyZW5jZWQsIGFkZHJzKTsKCQl9CgoJCXJlY29yZF9v YmplY3RfYWRkcmVzc19kZXBlbmRlbmNpZXMoJm15c2VsZiwgYWRkcnMsIERFUEVOREVOQ1lf Tk9STUFMKTsKCQlmcmVlX29iamVjdF9hZGRyZXNzZXMoYWRkcnMpOwoKCQkvKiBTdG9yZSBk ZXBlbmRlbmNpZXMgb24gYW55dGhpbmcgbWVudGlvbmVkIGluIGluZGV4IGV4cHJlc3Npb25z ICovCgkJaWYgKGluZGV4SW5mby0+aWlfRXhwcmVzc2lvbnMpCgkJewoJCQlyZWNvcmREZXBl bmRlbmN5T25TaW5nbGVSZWxFeHByKCZteXNlbGYsCgkJCQkJCQkJCQkJKE5vZGUgKikgaW5k ZXhJbmZvLT5paV9FeHByZXNzaW9ucywKCQkJCQkJCQkJCQloZWFwUmVsYXRpb25JZCwKCQkJ CQkJCQkJCQlERVBFTkRFTkNZX05PUk1BTCwKCQkJCQkJCQkJCQlERVBFTkRFTkNZX0FVVE8s IGZhbHNlKTsKCQl9CgoJCS8qIFN0b3JlIGRlcGVuZGVuY2llcyBvbiBhbnl0aGluZyBtZW50 aW9uZWQgaW4gcHJlZGljYXRlICovCgkJaWYgKGluZGV4SW5mby0+aWlfUHJlZGljYXRlKQoJ CXsKCQkJcmVjb3JkRGVwZW5kZW5jeU9uU2luZ2xlUmVsRXhwcigmbXlzZWxmLAoJCQkJCQkJ CQkJCShOb2RlICopIGluZGV4SW5mby0+aWlfUHJlZGljYXRlLAoJCQkJCQkJCQkJCWhlYXBS ZWxhdGlvbklkLAoJCQkJCQkJCQkJCURFUEVOREVOQ1lfTk9STUFMLAoJCQkJCQkJCQkJCURF UEVOREVOQ1lfQVVUTywgZmFsc2UpOwoJCX0KCX0KCWVsc2UKCXsKCQkvKiBCb290c3RyYXAg bW9kZSAtIGFzc2VydCB3ZSB3ZXJlbid0IGFza2VkIGZvciBjb25zdHJhaW50IHN1cHBvcnQg Ki8KCQlBc3NlcnQoKGZsYWdzICYgSU5ERVhfQ1JFQVRFX0FERF9DT05TVFJBSU5UKSA9PSAw KTsKCX0KCgkvKiBQb3N0IGNyZWF0aW9uIGhvb2sgZm9yIG5ldyBpbmRleCAqLwoJSW52b2tl T2JqZWN0UG9zdENyZWF0ZUhvb2tBcmcoUmVsYXRpb25SZWxhdGlvbklkLAoJCQkJCQkJCSAg aW5kZXhSZWxhdGlvbklkLCAwLCBpc19pbnRlcm5hbCk7CgoJLyoKCSAqIEFkdmFuY2UgdGhl IGNvbW1hbmQgY291bnRlciBzbyB0aGF0IHdlIGNhbiBzZWUgdGhlIG5ld2x5LWVudGVyZWQK CSAqIGNhdGFsb2cgdHVwbGVzIGZvciB0aGUgaW5kZXguCgkgKi8KCUNvbW1hbmRDb3VudGVy SW5jcmVtZW50KCk7CgoJLyoKCSAqIEluIGJvb3RzdHJhcCBtb2RlLCB3ZSBoYXZlIHRvIGZp bGwgaW4gdGhlIGluZGV4IHN0cmF0ZWd5IHN0cnVjdHVyZSB3aXRoCgkgKiBpbmZvcm1hdGlv biBmcm9tIHRoZSBjYXRhbG9ncy4gIElmIHdlIGFyZW4ndCBib290c3RyYXBwaW5nLCB0aGVu IHRoZQoJICogcmVsY2FjaGUgZW50cnkgaGFzIGFscmVhZHkgYmVlbiByZWJ1aWx0IHRoYW5r cyB0byBzaW52YWwgdXBkYXRlIGR1cmluZwoJICogQ29tbWFuZENvdW50ZXJJbmNyZW1lbnQu CgkgKi8KCWlmIChJc0Jvb3RzdHJhcFByb2Nlc3NpbmdNb2RlKCkpCgkJUmVsYXRpb25Jbml0 SW5kZXhBY2Nlc3NJbmZvKGluZGV4UmVsYXRpb24pOwoJZWxzZQoJCUFzc2VydChpbmRleFJl bGF0aW9uLT5yZF9pbmRleGN4dCAhPSBOVUxMKTsKCglpbmRleFJlbGF0aW9uLT5yZF9pbmRl eC0+aW5kbmtleWF0dHMgPSBpbmRleEluZm8tPmlpX051bUluZGV4S2V5QXR0cnM7CgoJLyog VmFsaWRhdGUgb3BjbGFzcy1zcGVjaWZpYyBvcHRpb25zICovCglpZiAob3BjbGFzc09wdGlv bnMpCgkJZm9yIChpID0gMDsgaSA8IGluZGV4SW5mby0+aWlfTnVtSW5kZXhLZXlBdHRyczsg aSsrKQoJCQkodm9pZCkgaW5kZXhfb3BjbGFzc19vcHRpb25zKGluZGV4UmVsYXRpb24sIGkg KyAxLAoJCQkJCQkJCQkJIG9wY2xhc3NPcHRpb25zW2ldLAoJCQkJCQkJCQkJIHRydWUpOwoK CS8qCgkgKiBJZiB0aGlzIGlzIGJvb3RzdHJhcCAoaW5pdGRiKSB0aW1lLCB0aGVuIHdlIGRv bid0IGFjdHVhbGx5IGZpbGwgaW4gdGhlCgkgKiBpbmRleCB5ZXQuICBXZSdsbCBiZSBjcmVh dGluZyBtb3JlIGluZGV4ZXMgYW5kIGNsYXNzZXMgbGF0ZXIsIHNvIHdlCgkgKiBkZWxheSBm aWxsaW5nIHRoZW0gaW4gdW50aWwganVzdCBiZWZvcmUgd2UncmUgZG9uZSB3aXRoIGJvb3Rz dHJhcHBpbmcuCgkgKiBTaW1pbGFybHksIGlmIHRoZSBjYWxsZXIgc3BlY2lmaWVkIHRvIHNr aXAgdGhlIGJ1aWxkIHRoZW4gZmlsbGluZyB0aGUKCSAqIGluZGV4IGlzIGRlbGF5ZWQgdGls bCBsYXRlciAoQUxURVIgVEFCTEUgY2FuIHNhdmUgd29yayBpbiBzb21lIGNhc2VzCgkgKiB3 aXRoIHRoaXMpLiAgT3RoZXJ3aXNlLCB3ZSBjYWxsIHRoZSBBTSByb3V0aW5lIHRoYXQgY29u c3RydWN0cyB0aGUKCSAqIGluZGV4LgoJICovCglpZiAoSXNCb290c3RyYXBQcm9jZXNzaW5n TW9kZSgpKQoJewoJCWluZGV4X3JlZ2lzdGVyKGhlYXBSZWxhdGlvbklkLCBpbmRleFJlbGF0 aW9uSWQsIGluZGV4SW5mbyk7Cgl9CgllbHNlIGlmICgoZmxhZ3MgJiBJTkRFWF9DUkVBVEVf U0tJUF9CVUlMRCkgIT0gMCkKCXsKCQkvKgoJCSAqIENhbGxlciBpcyByZXNwb25zaWJsZSBm b3IgZmlsbGluZyB0aGUgaW5kZXggbGF0ZXIgb24uICBIb3dldmVyLAoJCSAqIHdlJ2QgYmV0 dGVyIG1ha2Ugc3VyZSB0aGF0IHRoZSBoZWFwIHJlbGF0aW9uIGlzIGNvcnJlY3RseSBtYXJr ZWQgYXMKCQkgKiBoYXZpbmcgYW4gaW5kZXguCgkJICovCgkJaW5kZXhfdXBkYXRlX3N0YXRz KGhlYXBSZWxhdGlvbiwKCQkJCQkJICAgdHJ1ZSwKCQkJCQkJICAgLTEuMCk7CgkJLyogTWFr ZSB0aGUgYWJvdmUgdXBkYXRlIHZpc2libGUgKi8KCQlDb21tYW5kQ291bnRlckluY3JlbWVu dCgpOwoJfQoJZWxzZQoJewoJCWluZGV4X2J1aWxkKGhlYXBSZWxhdGlvbiwgaW5kZXhSZWxh dGlvbiwgaW5kZXhJbmZvLCBmYWxzZSwgdHJ1ZSwKCQkJCQlwcm9ncmVzcyk7Cgl9CgoJLyoK CSAqIENsb3NlIHRoZSBpbmRleDsgYnV0IHdlIGtlZXAgdGhlIGxvY2sgdGhhdCB3ZSBhY3F1 aXJlZCBhYm92ZSB1bnRpbCBlbmQKCSAqIG9mIHRyYW5zYWN0aW9uLiAgQ2xvc2luZyB0aGUg aGVhcCBpcyBjYWxsZXIncyByZXNwb25zaWJpbGl0eS4KCSAqLwoJaW5kZXhfY2xvc2UoaW5k ZXhSZWxhdGlvbiwgTm9Mb2NrKTsKCglyZXR1cm4gaW5kZXhSZWxhdGlvbklkOwp9CgovKgog KiBpbmRleF9jcmVhdGVfY29weQogKgogKiBDcmVhdGUgYW4gaW5kZXggYmFzZWQgb24gdGhl IGRlZmluaXRpb24gb2YgdGhlIG9uZSBwcm92aWRlZCBieSBjYWxsZXIuICBUaGUKICogaW5k ZXggaXMgaW5zZXJ0ZWQgaW50byBjYXRhbG9ncy4gICdmbGFncycgYXJlIHBhc3NlZCBkaXJl Y3RseSB0bwogKiBpbmRleF9jcmVhdGUuCiAqCiAqICJ0YWJsZXNwYWNlT2lkIiBpcyB0aGUg dGFibGVzcGFjZSB0byB1c2UgZm9yIHRoaXMgaW5kZXguCiAqLwpPaWQKaW5kZXhfY3JlYXRl X2NvcHkoUmVsYXRpb24gaGVhcFJlbGF0aW9uLCB1aW50MTYgZmxhZ3MsCgkJCQkgIE9pZCBv bGRJbmRleElkLCBPaWQgdGFibGVzcGFjZU9pZCwgY29uc3QgY2hhciAqbmV3TmFtZSkKewoJ UmVsYXRpb24JaW5kZXhSZWxhdGlvbjsKCUluZGV4SW5mbyAgKm9sZEluZm8sCgkJCSAgICpu ZXdJbmZvOwoJT2lkCQkJbmV3SW5kZXhJZCA9IEludmFsaWRPaWQ7Cglib29sCQljb25jdXJy ZW50bHkgPSAoZmxhZ3MgJiBJTkRFWF9DUkVBVEVfQ09OQ1VSUkVOVCkgIT0gMDsKCUhlYXBU dXBsZQlpbmRleFR1cGxlLAoJCQkJY2xhc3NUdXBsZTsKCURhdHVtCQlpbmRjbGFzc0RhdHVt LAoJCQkJY29sT3B0aW9uRGF0dW0sCgkJCQlyZWxvcHRpb25zRGF0dW07CglEYXR1bQkgICAq b3BjbGFzc09wdGlvbnM7CglvaWR2ZWN0b3IgICppbmRjbGFzczsKCWludDJ2ZWN0b3IgKmlu ZGNvbG9wdGlvbnM7CglOdWxsYWJsZURhdHVtICpzdGF0dGFyZ2V0czsKCWJvb2wJCWlzbnVs bDsKCUxpc3QJICAgKmluZGV4Q29sTmFtZXMgPSBOSUw7CglMaXN0CSAgICppbmRleEV4cHJz ID0gTklMOwoJTGlzdAkgICAqaW5kZXhQcmVkcyA9IE5JTDsKCglpbmRleFJlbGF0aW9uID0g aW5kZXhfb3BlbihvbGRJbmRleElkLCBSb3dFeGNsdXNpdmVMb2NrKTsKCgkvKiBUaGUgbmV3 IGluZGV4IG5lZWRzIHNvbWUgaW5mb3JtYXRpb24gZnJvbSB0aGUgb2xkIGluZGV4ICovCglv bGRJbmZvID0gQnVpbGRJbmRleEluZm8oaW5kZXhSZWxhdGlvbik7CgoJLyoKCSAqIENvbmN1 cnJlbnQgYnVpbGQgb2YgYW4gaW5kZXggd2l0aCBleGNsdXNpb24gY29uc3RyYWludHMgaXMg bm90CgkgKiBzdXBwb3J0ZWQuCgkgKi8KCWlmIChvbGRJbmZvLT5paV9FeGNsdXNpb25PcHMg IT0gTlVMTCAmJiBjb25jdXJyZW50bHkpCgkJZXJlcG9ydChFUlJPUiwKCQkJCShlcnJjb2Rl KEVSUkNPREVfRkVBVFVSRV9OT1RfU1VQUE9SVEVEKSwKCQkJCSBlcnJtc2coImNvbmN1cnJl bnQgaW5kZXggY3JlYXRpb24gZm9yIGV4Y2x1c2lvbiBjb25zdHJhaW50cyBpcyBub3Qgc3Vw cG9ydGVkIikpKTsKCgkvKiBHZXQgdGhlIGFycmF5IG9mIGNsYXNzIGFuZCBjb2x1bW4gb3B0 aW9ucyBJRHMgZnJvbSBpbmRleCBpbmZvICovCglpbmRleFR1cGxlID0gU2VhcmNoU3lzQ2Fj aGUxKElOREVYUkVMSUQsIE9iamVjdElkR2V0RGF0dW0ob2xkSW5kZXhJZCkpOwoJaWYgKCFI ZWFwVHVwbGVJc1ZhbGlkKGluZGV4VHVwbGUpKQoJCWVsb2coRVJST1IsICJjYWNoZSBsb29r dXAgZmFpbGVkIGZvciBpbmRleCAldSIsIG9sZEluZGV4SWQpOwoJaW5kY2xhc3NEYXR1bSA9 IFN5c0NhY2hlR2V0QXR0ck5vdE51bGwoSU5ERVhSRUxJRCwgaW5kZXhUdXBsZSwKCQkJCQkJ CQkJCSAgIEFudW1fcGdfaW5kZXhfaW5kY2xhc3MpOwoJaW5kY2xhc3MgPSAob2lkdmVjdG9y ICopIERhdHVtR2V0UG9pbnRlcihpbmRjbGFzc0RhdHVtKTsKCgljb2xPcHRpb25EYXR1bSA9 IFN5c0NhY2hlR2V0QXR0ck5vdE51bGwoSU5ERVhSRUxJRCwgaW5kZXhUdXBsZSwKCQkJCQkJ CQkJCQlBbnVtX3BnX2luZGV4X2luZG9wdGlvbik7CglpbmRjb2xvcHRpb25zID0gKGludDJ2 ZWN0b3IgKikgRGF0dW1HZXRQb2ludGVyKGNvbE9wdGlvbkRhdHVtKTsKCgkvKiBGZXRjaCBy ZWxvcHRpb25zIG9mIGluZGV4IGlmIGFueSAqLwoJY2xhc3NUdXBsZSA9IFNlYXJjaFN5c0Nh Y2hlMShSRUxPSUQsIE9iamVjdElkR2V0RGF0dW0ob2xkSW5kZXhJZCkpOwoJaWYgKCFIZWFw VHVwbGVJc1ZhbGlkKGNsYXNzVHVwbGUpKQoJCWVsb2coRVJST1IsICJjYWNoZSBsb29rdXAg ZmFpbGVkIGZvciByZWxhdGlvbiAldSIsIG9sZEluZGV4SWQpOwoJcmVsb3B0aW9uc0RhdHVt ID0gU3lzQ2FjaGVHZXRBdHRyKFJFTE9JRCwgY2xhc3NUdXBsZSwKCQkJCQkJCQkJICBBbnVt X3BnX2NsYXNzX3JlbG9wdGlvbnMsICZpc251bGwpOwoKCS8qCgkgKiBGZXRjaCB0aGUgbGlz dCBvZiBleHByZXNzaW9ucyBhbmQgcHJlZGljYXRlcyBkaXJlY3RseSBmcm9tIHRoZQoJICog Y2F0YWxvZ3MuICBUaGlzIGNhbm5vdCByZWx5IG9uIHRoZSBpbmZvcm1hdGlvbiBmcm9tIElu ZGV4SW5mbyBvZiB0aGUKCSAqIG9sZCBpbmRleCBhcyB0aGVzZSBoYXZlIGJlZW4gZmxhdHRl bmVkIGZvciB0aGUgcGxhbm5lci4KCSAqLwoJaWYgKG9sZEluZm8tPmlpX0V4cHJlc3Npb25z ICE9IE5JTCkKCXsKCQlEYXR1bQkJZXhwckRhdHVtOwoJCWNoYXIJICAgKmV4cHJTdHJpbmc7 CgoJCWV4cHJEYXR1bSA9IFN5c0NhY2hlR2V0QXR0ck5vdE51bGwoSU5ERVhSRUxJRCwgaW5k ZXhUdXBsZSwKCQkJCQkJCQkJCSAgIEFudW1fcGdfaW5kZXhfaW5kZXhwcnMpOwoJCWV4cHJT dHJpbmcgPSBUZXh0RGF0dW1HZXRDU3RyaW5nKGV4cHJEYXR1bSk7CgkJaW5kZXhFeHBycyA9 IChMaXN0ICopIHN0cmluZ1RvTm9kZShleHByU3RyaW5nKTsKCQlwZnJlZShleHByU3RyaW5n KTsKCX0KCWlmIChvbGRJbmZvLT5paV9QcmVkaWNhdGUgIT0gTklMKQoJewoJCURhdHVtCQlw cmVkRGF0dW07CgkJY2hhcgkgICAqcHJlZFN0cmluZzsKCgkJcHJlZERhdHVtID0gU3lzQ2Fj aGVHZXRBdHRyTm90TnVsbChJTkRFWFJFTElELCBpbmRleFR1cGxlLAoJCQkJCQkJCQkJICAg QW51bV9wZ19pbmRleF9pbmRwcmVkKTsKCQlwcmVkU3RyaW5nID0gVGV4dERhdHVtR2V0Q1N0 cmluZyhwcmVkRGF0dW0pOwoJCWluZGV4UHJlZHMgPSAoTGlzdCAqKSBzdHJpbmdUb05vZGUo cHJlZFN0cmluZyk7CgoJCS8qIEFsc28gY29udmVydCB0byBpbXBsaWNpdC1BTkQgZm9ybWF0 ICovCgkJaW5kZXhQcmVkcyA9IG1ha2VfYW5kc19pbXBsaWNpdCgoRXhwciAqKSBpbmRleFBy ZWRzKTsKCQlwZnJlZShwcmVkU3RyaW5nKTsKCX0KCgkvKgoJICogQnVpbGQgdGhlIGluZGV4 IGluZm9ybWF0aW9uIGZvciB0aGUgbmV3IGluZGV4LgoJICovCgluZXdJbmZvID0gbWFrZUlu ZGV4SW5mbyhvbGRJbmZvLT5paV9OdW1JbmRleEF0dHJzLAoJCQkJCQkJb2xkSW5mby0+aWlf TnVtSW5kZXhLZXlBdHRycywKCQkJCQkJCW9sZEluZm8tPmlpX0FtLAoJCQkJCQkJaW5kZXhF eHBycywKCQkJCQkJCWluZGV4UHJlZHMsCgkJCQkJCQlvbGRJbmZvLT5paV9VbmlxdWUsCgkJ CQkJCQlvbGRJbmZvLT5paV9OdWxsc05vdERpc3RpbmN0LAoJCQkJCQkJIWNvbmN1cnJlbnRs eSwJLyogaXNyZWFkeSAqLwoJCQkJCQkJY29uY3VycmVudGx5LAkvKiBjb25jdXJyZW50ICov CgkJCQkJCQlpbmRleFJlbGF0aW9uLT5yZF9pbmRhbS0+YW1zdW1tYXJpemluZywKCQkJCQkJ CW9sZEluZm8tPmlpX1dpdGhvdXRPdmVybGFwcyk7CgluZXdJbmZvLT5paV9FeHByZXNzaW9u c0V4cGFuZCA9CgkJRXhwYW5kVmlydHVhbEdlbmVyYXRlZENvbHVtbnMobmV3SW5mby0+aWlf RXhwcmVzc2lvbnNFeHBhbmQsIGhlYXBSZWxhdGlvbiwgSW52YWxpZE9pZCk7CgluZXdJbmZv LT5paV9QcmVkaWNhdGVFeHBhbmQgPQoJCUV4cGFuZFZpcnR1YWxHZW5lcmF0ZWRDb2x1bW5z KG5ld0luZm8tPmlpX1ByZWRpY2F0ZUV4cGFuZCwgaGVhcFJlbGF0aW9uLCBJbnZhbGlkT2lk KTsKCgkvKiBmZXRjaCBleGNsdXNpb24gY29uc3RyYWludCBpbmZvIGlmIGFueSAqLwoJaWYg KGluZGV4UmVsYXRpb24tPnJkX2luZGV4LT5pbmRpc2V4Y2x1c2lvbikKCXsKCQkvKgoJCSAq IFhYWCBCZXdhcmU6IHdlJ3JlIG1ha2luZyBuZXdJbmZvIHBvaW50IHRvIG9sZEluZm8tb3du ZWQgbWVtb3J5LiAgSXQKCQkgKiB3b3VsZCBiZSBtb3JlIG9ydGhvZG94IHRvIHBhbGxvYytt ZW1jcHksIGJ1dCB3ZSBkb24ndCBuZWVkIHRoYXQKCQkgKiBoZXJlIGF0IHByZXNlbnQuCgkJ ICovCgkJbmV3SW5mby0+aWlfRXhjbHVzaW9uT3BzID0gb2xkSW5mby0+aWlfRXhjbHVzaW9u T3BzOwoJCW5ld0luZm8tPmlpX0V4Y2x1c2lvblByb2NzID0gb2xkSW5mby0+aWlfRXhjbHVz aW9uUHJvY3M7CgkJbmV3SW5mby0+aWlfRXhjbHVzaW9uU3RyYXRzID0gb2xkSW5mby0+aWlf RXhjbHVzaW9uU3RyYXRzOwoJfQoKCS8qCgkgKiBFeHRyYWN0IHRoZSBsaXN0IG9mIGNvbHVt biBuYW1lcyBhbmQgdGhlIGNvbHVtbiBudW1iZXJzIGZvciB0aGUgbmV3CgkgKiBpbmRleCBp bmZvcm1hdGlvbi4gIEFsbCB0aGlzIGluZm9ybWF0aW9uIHdpbGwgYmUgdXNlZCBmb3IgdGhl IGluZGV4CgkgKiBjcmVhdGlvbi4KCSAqLwoJZm9yIChpbnQgaSA9IDA7IGkgPCBvbGRJbmZv LT5paV9OdW1JbmRleEF0dHJzOyBpKyspCgl7CgkJVHVwbGVEZXNjCWluZGV4VHVwRGVzYyA9 IFJlbGF0aW9uR2V0RGVzY3IoaW5kZXhSZWxhdGlvbik7CgkJRm9ybV9wZ19hdHRyaWJ1dGUg YXR0ID0gVHVwbGVEZXNjQXR0cihpbmRleFR1cERlc2MsIGkpOwoKCQlpbmRleENvbE5hbWVz ID0gbGFwcGVuZChpbmRleENvbE5hbWVzLCBOYW1lU3RyKGF0dC0+YXR0bmFtZSkpOwoJCW5l d0luZm8tPmlpX0luZGV4QXR0ck51bWJlcnNbaV0gPSBvbGRJbmZvLT5paV9JbmRleEF0dHJO dW1iZXJzW2ldOwoJfQoKCS8qIEV4dHJhY3Qgb3BjbGFzcyBvcHRpb25zIGZvciBlYWNoIGF0 dHJpYnV0ZSAqLwoJb3BjbGFzc09wdGlvbnMgPSBwYWxsb2MwX2FycmF5KERhdHVtLCBuZXdJ bmZvLT5paV9OdW1JbmRleEF0dHJzKTsKCWZvciAoaW50IGkgPSAwOyBpIDwgbmV3SW5mby0+ aWlfTnVtSW5kZXhBdHRyczsgaSsrKQoJCW9wY2xhc3NPcHRpb25zW2ldID0gZ2V0X2F0dG9w dGlvbnMob2xkSW5kZXhJZCwgaSArIDEpOwoKCS8qIEV4dHJhY3Qgc3RhdGlzdGljIHRhcmdl dHMgZm9yIGVhY2ggYXR0cmlidXRlICovCglzdGF0dGFyZ2V0cyA9IHBhbGxvYzBfYXJyYXko TnVsbGFibGVEYXR1bSwgbmV3SW5mby0+aWlfTnVtSW5kZXhBdHRycyk7Cglmb3IgKGludCBp ID0gMDsgaSA8IG5ld0luZm8tPmlpX051bUluZGV4QXR0cnM7IGkrKykKCXsKCQlIZWFwVHVw bGUJdHA7CgkJRGF0dW0JCWRhdDsKCgkJdHAgPSBTZWFyY2hTeXNDYWNoZTIoQVRUTlVNLCBP YmplY3RJZEdldERhdHVtKG9sZEluZGV4SWQpLCBJbnQxNkdldERhdHVtKGkgKyAxKSk7CgkJ aWYgKCFIZWFwVHVwbGVJc1ZhbGlkKHRwKSkKCQkJZWxvZyhFUlJPUiwgImNhY2hlIGxvb2t1 cCBmYWlsZWQgZm9yIGF0dHJpYnV0ZSAlZCBvZiByZWxhdGlvbiAldSIsCgkJCQkgaSArIDEs IG9sZEluZGV4SWQpOwoJCWRhdCA9IFN5c0NhY2hlR2V0QXR0cihBVFROVU0sIHRwLCBBbnVt X3BnX2F0dHJpYnV0ZV9hdHRzdGF0dGFyZ2V0LCAmaXNudWxsKTsKCQlSZWxlYXNlU3lzQ2Fj aGUodHApOwoJCXN0YXR0YXJnZXRzW2ldLnZhbHVlID0gZGF0OwoJCXN0YXR0YXJnZXRzW2ld LmlzbnVsbCA9IGlzbnVsbDsKCX0KCgkvKgoJICogTm93IGNyZWF0ZSB0aGUgbmV3IGluZGV4 LgoJICoKCSAqIEZvciBhIHBhcnRpdGlvbiBpbmRleCwgd2UgYWRqdXN0IHRoZSBwYXJ0aXRp b24gZGVwZW5kZW5jeSBsYXRlciwgdG8KCSAqIGVuc3VyZSBhIGNvbnNpc3RlbnQgc3RhdGUg YXQgYWxsIHRpbWVzLiAgVGhhdCBpcyB3aHkgcGFyZW50SW5kZXhSZWxpZAoJICogaXMgbm90 IHNldCBoZXJlLgoJICovCgluZXdJbmRleElkID0gaW5kZXhfY3JlYXRlKGhlYXBSZWxhdGlv biwKCQkJCQkJCSAgbmV3TmFtZSwKCQkJCQkJCSAgSW52YWxpZE9pZCwJLyogaW5kZXhSZWxh dGlvbklkICovCgkJCQkJCQkgIEludmFsaWRPaWQsCS8qIHBhcmVudEluZGV4UmVsaWQgKi8K CQkJCQkJCSAgSW52YWxpZE9pZCwJLyogcGFyZW50Q29uc3RyYWludElkICovCgkJCQkJCQkg IEludmFsaWRSZWxGaWxlTnVtYmVyLCAvKiByZWxGaWxlTnVtYmVyICovCgkJCQkJCQkgIG5l d0luZm8sCgkJCQkJCQkgIGluZGV4Q29sTmFtZXMsCgkJCQkJCQkgIGluZGV4UmVsYXRpb24t PnJkX3JlbC0+cmVsYW0sCgkJCQkJCQkgIHRhYmxlc3BhY2VPaWQsCgkJCQkJCQkgIGluZGV4 UmVsYXRpb24tPnJkX2luZGNvbGxhdGlvbiwKCQkJCQkJCSAgaW5kY2xhc3MtPnZhbHVlcywK CQkJCQkJCSAgb3BjbGFzc09wdGlvbnMsCgkJCQkJCQkgIGluZGNvbG9wdGlvbnMtPnZhbHVl cywKCQkJCQkJCSAgc3RhdHRhcmdldHMsCgkJCQkJCQkgIHJlbG9wdGlvbnNEYXR1bSwKCQkJ CQkJCSAgZmxhZ3MsCgkJCQkJCQkgIDAsCgkJCQkJCQkgIHRydWUsIC8qIGFsbG93IHRhYmxl IHRvIGJlIGEgc3lzdGVtIGNhdGFsb2c/ICovCgkJCQkJCQkgIGZhbHNlLAkvKiBpc19pbnRl cm5hbD8gKi8KCQkJCQkJCSAgTlVMTCk7CgoJLyogQ2xvc2UgdGhlIHJlbGF0aW9ucyB1c2Vk IGFuZCBjbGVhbiB1cCAqLwoJaW5kZXhfY2xvc2UoaW5kZXhSZWxhdGlvbiwgTm9Mb2NrKTsK CVJlbGVhc2VTeXNDYWNoZShpbmRleFR1cGxlKTsKCVJlbGVhc2VTeXNDYWNoZShjbGFzc1R1 cGxlKTsKCglyZXR1cm4gbmV3SW5kZXhJZDsKfQoKLyoKICogaW5kZXhfY29uY3VycmVudGx5 X2J1aWxkCiAqCiAqIEJ1aWxkIGluZGV4IGZvciBhIGNvbmN1cnJlbnQgb3BlcmF0aW9uLiAg TG93LWxldmVsIGxvY2tzIGFyZSB0YWtlbiB3aGVuCiAqIHRoaXMgb3BlcmF0aW9uIGlzIHBl cmZvcm1lZCB0byBwcmV2ZW50IG9ubHkgc2NoZW1hIGNoYW5nZXMsIGJ1dCB0aGV5IG5lZWQK ICogdG8gYmUga2VwdCB1bnRpbCB0aGUgZW5kIG9mIHRoZSB0cmFuc2FjdGlvbiBwZXJmb3Jt aW5nIHRoaXMgb3BlcmF0aW9uLgogKiAnaW5kZXhPaWQnIHJlZmVycyB0byBhbiBpbmRleCBy ZWxhdGlvbiBPSUQgYWxyZWFkeSBjcmVhdGVkIGFzIHBhcnQgb2YKICogcHJldmlvdXMgcHJv Y2Vzc2luZywgYW5kICdoZWFwT2lkJyByZWZlcnMgdG8gaXRzIHBhcmVudCBoZWFwIHJlbGF0 aW9uLgogKi8Kdm9pZAppbmRleF9jb25jdXJyZW50bHlfYnVpbGQoT2lkIGhlYXBSZWxhdGlv bklkLAoJCQkJCQkgT2lkIGluZGV4UmVsYXRpb25JZCkKewoJUmVsYXRpb24JaGVhcFJlbDsK CU9pZAkJCXNhdmVfdXNlcmlkOwoJaW50CQkJc2F2ZV9zZWNfY29udGV4dDsKCWludAkJCXNh dmVfbmVzdGxldmVsOwoJUmVsYXRpb24JaW5kZXhSZWxhdGlvbjsKCUluZGV4SW5mbyAgKmlu ZGV4SW5mbzsKCgkvKiBUaGlzIGhhZCBiZXR0ZXIgbWFrZSBzdXJlIHRoYXQgYSBzbmFwc2hv dCBpcyBhY3RpdmUgKi8KCUFzc2VydChBY3RpdmVTbmFwc2hvdFNldCgpKTsKCgkvKiBPcGVu IGFuZCBsb2NrIHRoZSBwYXJlbnQgaGVhcCByZWxhdGlvbiAqLwoJaGVhcFJlbCA9IHRhYmxl X29wZW4oaGVhcFJlbGF0aW9uSWQsIFNoYXJlVXBkYXRlRXhjbHVzaXZlTG9jayk7CgoJLyoK CSAqIFN3aXRjaCB0byB0aGUgdGFibGUgb3duZXIncyB1c2VyaWQsIHNvIHRoYXQgYW55IGlu ZGV4IGZ1bmN0aW9ucyBhcmUgcnVuCgkgKiBhcyB0aGF0IHVzZXIuICBBbHNvIGxvY2sgZG93 biBzZWN1cml0eS1yZXN0cmljdGVkIG9wZXJhdGlvbnMgYW5kCgkgKiBhcnJhbmdlIHRvIG1h a2UgR1VDIHZhcmlhYmxlIGNoYW5nZXMgbG9jYWwgdG8gdGhpcyBjb21tYW5kLgoJICovCglH ZXRVc2VySWRBbmRTZWNDb250ZXh0KCZzYXZlX3VzZXJpZCwgJnNhdmVfc2VjX2NvbnRleHQp OwoJU2V0VXNlcklkQW5kU2VjQ29udGV4dChoZWFwUmVsLT5yZF9yZWwtPnJlbG93bmVyLAoJ CQkJCQkgICBzYXZlX3NlY19jb250ZXh0IHwgU0VDVVJJVFlfUkVTVFJJQ1RFRF9PUEVSQVRJ T04pOwoJc2F2ZV9uZXN0bGV2ZWwgPSBOZXdHVUNOZXN0TGV2ZWwoKTsKCVJlc3RyaWN0U2Vh cmNoUGF0aCgpOwoKCWluZGV4UmVsYXRpb24gPSBpbmRleF9vcGVuKGluZGV4UmVsYXRpb25J ZCwgUm93RXhjbHVzaXZlTG9jayk7CgoJLyoKCSAqIFdlIGhhdmUgdG8gcmUtYnVpbGQgdGhl IEluZGV4SW5mbyBzdHJ1Y3QsIHNpbmNlIGl0IHdhcyBsb3N0IGluIHRoZQoJICogY29tbWl0 IG9mIHRoZSB0cmFuc2FjdGlvbiB3aGVyZSB0aGlzIGNvbmN1cnJlbnQgaW5kZXggd2FzIGNy ZWF0ZWQgYXQKCSAqIHRoZSBjYXRhbG9nIGxldmVsLgoJICovCglpbmRleEluZm8gPSBCdWls ZEluZGV4SW5mbyhpbmRleFJlbGF0aW9uKTsKCUFzc2VydCghaW5kZXhJbmZvLT5paV9SZWFk eUZvckluc2VydHMpOwoJaW5kZXhJbmZvLT5paV9Db25jdXJyZW50ID0gdHJ1ZTsKCWluZGV4 SW5mby0+aWlfQnJva2VuSG90Q2hhaW4gPSBmYWxzZTsKCgkvKiBOb3cgYnVpbGQgdGhlIGlu ZGV4ICovCglpbmRleF9idWlsZChoZWFwUmVsLCBpbmRleFJlbGF0aW9uLCBpbmRleEluZm8s IGZhbHNlLCB0cnVlLCB0cnVlKTsKCgkvKiBSb2xsIGJhY2sgYW55IEdVQyBjaGFuZ2VzIGV4 ZWN1dGVkIGJ5IGluZGV4IGZ1bmN0aW9ucyAqLwoJQXRFT1hhY3RfR1VDKGZhbHNlLCBzYXZl X25lc3RsZXZlbCk7CgoJLyogUmVzdG9yZSB1c2VyaWQgYW5kIHNlY3VyaXR5IGNvbnRleHQg Ki8KCVNldFVzZXJJZEFuZFNlY0NvbnRleHQoc2F2ZV91c2VyaWQsIHNhdmVfc2VjX2NvbnRl eHQpOwoKCS8qIENsb3NlIGJvdGggdGhlIHJlbGF0aW9ucywgYnV0IGtlZXAgdGhlIGxvY2tz ICovCgl0YWJsZV9jbG9zZShoZWFwUmVsLCBOb0xvY2spOwoJaW5kZXhfY2xvc2UoaW5kZXhS ZWxhdGlvbiwgTm9Mb2NrKTsKCgkvKgoJICogVXBkYXRlIHRoZSBwZ19pbmRleCByb3cgdG8g bWFyayB0aGUgaW5kZXggYXMgcmVhZHkgZm9yIGluc2VydHMuIE9uY2Ugd2UKCSAqIGNvbW1p dCB0aGlzIHRyYW5zYWN0aW9uLCBhbnkgbmV3IHRyYW5zYWN0aW9ucyB0aGF0IG9wZW4gdGhl IHRhYmxlIG11c3QKCSAqIGluc2VydCBuZXcgZW50cmllcyBpbnRvIHRoZSBpbmRleCBmb3Ig aW5zZXJ0aW9ucyBhbmQgbm9uLUhPVCB1cGRhdGVzLgoJICovCglpbmRleF9zZXRfc3RhdGVf ZmxhZ3MoaW5kZXhSZWxhdGlvbklkLCBJTkRFWF9DUkVBVEVfU0VUX1JFQURZKTsKfQoKLyoK ICogaW5kZXhfY29uY3VycmVudGx5X3N3YXAKICoKICogU3dhcCBuYW1lLCBkZXBlbmRlbmNp ZXMsIGFuZCBjb25zdHJhaW50cyBvZiB0aGUgb2xkIGluZGV4IG92ZXIgdG8gdGhlIG5ldwog KiBpbmRleCwgd2hpbGUgbWFya2luZyB0aGUgb2xkIGluZGV4IGFzIGludmFsaWQgYW5kIHRo ZSBuZXcgYXMgdmFsaWQuCiAqLwp2b2lkCmluZGV4X2NvbmN1cnJlbnRseV9zd2FwKE9pZCBu ZXdJbmRleElkLCBPaWQgb2xkSW5kZXhJZCwgY29uc3QgY2hhciAqb2xkTmFtZSkKewoJUmVs YXRpb24JcGdfY2xhc3MsCgkJCQlwZ19pbmRleCwKCQkJCXBnX2NvbnN0cmFpbnQsCgkJCQlw Z190cmlnZ2VyOwoJUmVsYXRpb24Jb2xkQ2xhc3NSZWwsCgkJCQluZXdDbGFzc1JlbDsKCUhl YXBUdXBsZQlvbGRDbGFzc1R1cGxlLAoJCQkJbmV3Q2xhc3NUdXBsZTsKCUZvcm1fcGdfY2xh c3Mgb2xkQ2xhc3NGb3JtLAoJCQkJbmV3Q2xhc3NGb3JtOwoJSGVhcFR1cGxlCW9sZEluZGV4 VHVwbGUsCgkJCQluZXdJbmRleFR1cGxlOwoJRm9ybV9wZ19pbmRleCBvbGRJbmRleEZvcm0s CgkJCQluZXdJbmRleEZvcm07Cglib29sCQlpc1BhcnRpdGlvbjsKCU9pZAkJCWluZGV4Q29u c3RyYWludE9pZDsKCUxpc3QJICAgKmNvbnN0cmFpbnRPaWRzID0gTklMOwoJTGlzdENlbGwg ICAqbGM7CgoJLyoKCSAqIFRha2UgYSBuZWNlc3NhcnkgbG9jayBvbiB0aGUgb2xkIGFuZCBu ZXcgaW5kZXggYmVmb3JlIHN3YXBwaW5nIHRoZW0uCgkgKi8KCW9sZENsYXNzUmVsID0gcmVs YXRpb25fb3BlbihvbGRJbmRleElkLCBTaGFyZVVwZGF0ZUV4Y2x1c2l2ZUxvY2spOwoJbmV3 Q2xhc3NSZWwgPSByZWxhdGlvbl9vcGVuKG5ld0luZGV4SWQsIFNoYXJlVXBkYXRlRXhjbHVz aXZlTG9jayk7CgoJLyogTm93IHN3YXAgbmFtZXMgYW5kIGRlcGVuZGVuY2llcyBvZiB0aG9z ZSBpbmRleGVzICovCglwZ19jbGFzcyA9IHRhYmxlX29wZW4oUmVsYXRpb25SZWxhdGlvbklk LCBSb3dFeGNsdXNpdmVMb2NrKTsKCglvbGRDbGFzc1R1cGxlID0gU2VhcmNoU3lzQ2FjaGVD b3B5MShSRUxPSUQsCgkJCQkJCQkJCQlPYmplY3RJZEdldERhdHVtKG9sZEluZGV4SWQpKTsK CWlmICghSGVhcFR1cGxlSXNWYWxpZChvbGRDbGFzc1R1cGxlKSkKCQllbG9nKEVSUk9SLCAi Y291bGQgbm90IGZpbmQgdHVwbGUgZm9yIHJlbGF0aW9uICV1Iiwgb2xkSW5kZXhJZCk7Cglu ZXdDbGFzc1R1cGxlID0gU2VhcmNoU3lzQ2FjaGVDb3B5MShSRUxPSUQsCgkJCQkJCQkJCQlP YmplY3RJZEdldERhdHVtKG5ld0luZGV4SWQpKTsKCWlmICghSGVhcFR1cGxlSXNWYWxpZChu ZXdDbGFzc1R1cGxlKSkKCQllbG9nKEVSUk9SLCAiY291bGQgbm90IGZpbmQgdHVwbGUgZm9y IHJlbGF0aW9uICV1IiwgbmV3SW5kZXhJZCk7CgoJb2xkQ2xhc3NGb3JtID0gKEZvcm1fcGdf Y2xhc3MpIEdFVFNUUlVDVChvbGRDbGFzc1R1cGxlKTsKCW5ld0NsYXNzRm9ybSA9IChGb3Jt X3BnX2NsYXNzKSBHRVRTVFJVQ1QobmV3Q2xhc3NUdXBsZSk7CgoJLyogU3dhcCB0aGUgbmFt ZXMgKi8KCW5hbWVzdHJjcHkoJm5ld0NsYXNzRm9ybS0+cmVsbmFtZSwgTmFtZVN0cihvbGRD bGFzc0Zvcm0tPnJlbG5hbWUpKTsKCW5hbWVzdHJjcHkoJm9sZENsYXNzRm9ybS0+cmVsbmFt ZSwgb2xkTmFtZSk7CgoJLyogU3dhcCB0aGUgcGFydGl0aW9uIGZsYWdzIHRvIHRyYWNrIGlu aGVyaXRhbmNlIHByb3Blcmx5ICovCglpc1BhcnRpdGlvbiA9IG5ld0NsYXNzRm9ybS0+cmVs aXNwYXJ0aXRpb247CgluZXdDbGFzc0Zvcm0tPnJlbGlzcGFydGl0aW9uID0gb2xkQ2xhc3NG b3JtLT5yZWxpc3BhcnRpdGlvbjsKCW9sZENsYXNzRm9ybS0+cmVsaXNwYXJ0aXRpb24gPSBp c1BhcnRpdGlvbjsKCglDYXRhbG9nVHVwbGVVcGRhdGUocGdfY2xhc3MsICZvbGRDbGFzc1R1 cGxlLT50X3NlbGYsIG9sZENsYXNzVHVwbGUpOwoJQ2F0YWxvZ1R1cGxlVXBkYXRlKHBnX2Ns YXNzLCAmbmV3Q2xhc3NUdXBsZS0+dF9zZWxmLCBuZXdDbGFzc1R1cGxlKTsKCgloZWFwX2Zy ZWV0dXBsZShvbGRDbGFzc1R1cGxlKTsKCWhlYXBfZnJlZXR1cGxlKG5ld0NsYXNzVHVwbGUp OwoKCS8qIE5vdyBzd2FwIGluZGV4IGluZm8gKi8KCXBnX2luZGV4ID0gdGFibGVfb3BlbihJ bmRleFJlbGF0aW9uSWQsIFJvd0V4Y2x1c2l2ZUxvY2spOwoKCW9sZEluZGV4VHVwbGUgPSBT ZWFyY2hTeXNDYWNoZUNvcHkxKElOREVYUkVMSUQsCgkJCQkJCQkJCQlPYmplY3RJZEdldERh dHVtKG9sZEluZGV4SWQpKTsKCWlmICghSGVhcFR1cGxlSXNWYWxpZChvbGRJbmRleFR1cGxl KSkKCQllbG9nKEVSUk9SLCAiY291bGQgbm90IGZpbmQgdHVwbGUgZm9yIHJlbGF0aW9uICV1 Iiwgb2xkSW5kZXhJZCk7CgluZXdJbmRleFR1cGxlID0gU2VhcmNoU3lzQ2FjaGVDb3B5MShJ TkRFWFJFTElELAoJCQkJCQkJCQkJT2JqZWN0SWRHZXREYXR1bShuZXdJbmRleElkKSk7Cglp ZiAoIUhlYXBUdXBsZUlzVmFsaWQobmV3SW5kZXhUdXBsZSkpCgkJZWxvZyhFUlJPUiwgImNv dWxkIG5vdCBmaW5kIHR1cGxlIGZvciByZWxhdGlvbiAldSIsIG5ld0luZGV4SWQpOwoKCW9s ZEluZGV4Rm9ybSA9IChGb3JtX3BnX2luZGV4KSBHRVRTVFJVQ1Qob2xkSW5kZXhUdXBsZSk7 CgluZXdJbmRleEZvcm0gPSAoRm9ybV9wZ19pbmRleCkgR0VUU1RSVUNUKG5ld0luZGV4VHVw bGUpOwoKCS8qCgkgKiBDb3B5IGNvbnN0cmFpbnQgZmxhZ3MgZnJvbSB0aGUgb2xkIGluZGV4 LiBUaGlzIGlzIHNhZmUgYmVjYXVzZSB0aGUgb2xkCgkgKiBpbmRleCBndWFyYW50ZWVkIHVu aXF1ZW5lc3MuCgkgKi8KCW5ld0luZGV4Rm9ybS0+aW5kaXNwcmltYXJ5ID0gb2xkSW5kZXhG b3JtLT5pbmRpc3ByaW1hcnk7CglvbGRJbmRleEZvcm0tPmluZGlzcHJpbWFyeSA9IGZhbHNl OwoJbmV3SW5kZXhGb3JtLT5pbmRpc2V4Y2x1c2lvbiA9IG9sZEluZGV4Rm9ybS0+aW5kaXNl eGNsdXNpb247CglvbGRJbmRleEZvcm0tPmluZGlzZXhjbHVzaW9uID0gZmFsc2U7CgluZXdJ bmRleEZvcm0tPmluZGltbWVkaWF0ZSA9IG9sZEluZGV4Rm9ybS0+aW5kaW1tZWRpYXRlOwoJ b2xkSW5kZXhGb3JtLT5pbmRpbW1lZGlhdGUgPSB0cnVlOwoKCS8qIFByZXNlcnZlIGluZGlz cmVwbGlkZW50IGluIHRoZSBuZXcgaW5kZXggKi8KCW5ld0luZGV4Rm9ybS0+aW5kaXNyZXBs aWRlbnQgPSBvbGRJbmRleEZvcm0tPmluZGlzcmVwbGlkZW50OwoKCS8qIFByZXNlcnZlIGlu ZGlzY2x1c3RlcmVkIGluIHRoZSBuZXcgaW5kZXggKi8KCW5ld0luZGV4Rm9ybS0+aW5kaXNj bHVzdGVyZWQgPSBvbGRJbmRleEZvcm0tPmluZGlzY2x1c3RlcmVkOwoKCS8qCgkgKiBNYXJr IHRoZSBuZXcgaW5kZXggYXMgdmFsaWQsIGFuZCB0aGUgb2xkIGluZGV4IGFzIGludmFsaWQg c2ltaWxhcmx5IHRvCgkgKiB3aGF0IGluZGV4X3NldF9zdGF0ZV9mbGFncygpIGRvZXMuCgkg Ki8KCW5ld0luZGV4Rm9ybS0+aW5kaXN2YWxpZCA9IHRydWU7CglvbGRJbmRleEZvcm0tPmlu ZGlzdmFsaWQgPSBmYWxzZTsKCW9sZEluZGV4Rm9ybS0+aW5kaXNjbHVzdGVyZWQgPSBmYWxz ZTsKCW9sZEluZGV4Rm9ybS0+aW5kaXNyZXBsaWRlbnQgPSBmYWxzZTsKCglDYXRhbG9nVHVw bGVVcGRhdGUocGdfaW5kZXgsICZvbGRJbmRleFR1cGxlLT50X3NlbGYsIG9sZEluZGV4VHVw bGUpOwoJQ2F0YWxvZ1R1cGxlVXBkYXRlKHBnX2luZGV4LCAmbmV3SW5kZXhUdXBsZS0+dF9z ZWxmLCBuZXdJbmRleFR1cGxlKTsKCgloZWFwX2ZyZWV0dXBsZShvbGRJbmRleFR1cGxlKTsK CWhlYXBfZnJlZXR1cGxlKG5ld0luZGV4VHVwbGUpOwoKCS8qCgkgKiBNb3ZlIGNvbnN0cmFp bnRzIGFuZCB0cmlnZ2VycyBvdmVyIHRvIHRoZSBuZXcgaW5kZXgKCSAqLwoKCWNvbnN0cmFp bnRPaWRzID0gZ2V0X2luZGV4X3JlZl9jb25zdHJhaW50cyhvbGRJbmRleElkKTsKCglpbmRl eENvbnN0cmFpbnRPaWQgPSBnZXRfaW5kZXhfY29uc3RyYWludChvbGRJbmRleElkKTsKCglp ZiAoT2lkSXNWYWxpZChpbmRleENvbnN0cmFpbnRPaWQpKQoJCWNvbnN0cmFpbnRPaWRzID0g bGFwcGVuZF9vaWQoY29uc3RyYWludE9pZHMsIGluZGV4Q29uc3RyYWludE9pZCk7CgoJcGdf Y29uc3RyYWludCA9IHRhYmxlX29wZW4oQ29uc3RyYWludFJlbGF0aW9uSWQsIFJvd0V4Y2x1 c2l2ZUxvY2spOwoJcGdfdHJpZ2dlciA9IHRhYmxlX29wZW4oVHJpZ2dlclJlbGF0aW9uSWQs IFJvd0V4Y2x1c2l2ZUxvY2spOwoKCWZvcmVhY2gobGMsIGNvbnN0cmFpbnRPaWRzKQoJewoJ CUhlYXBUdXBsZQljb25zdHJhaW50VHVwbGUsCgkJCQkJdHJpZ2dlclR1cGxlOwoJCUZvcm1f cGdfY29uc3RyYWludCBjb25Gb3JtOwoJCVNjYW5LZXlEYXRhIGtleVsxXTsKCQlTeXNTY2Fu RGVzYyBzY2FuOwoJCU9pZAkJCWNvbnN0cmFpbnRPaWQgPSBsZmlyc3Rfb2lkKGxjKTsKCgkJ LyogTW92ZSB0aGUgY29uc3RyYWludCBmcm9tIHRoZSBvbGQgdG8gdGhlIG5ldyBpbmRleCAq LwoJCWNvbnN0cmFpbnRUdXBsZSA9IFNlYXJjaFN5c0NhY2hlQ29weTEoQ09OU1RST0lELAoJ CQkJCQkJCQkJCSAgT2JqZWN0SWRHZXREYXR1bShjb25zdHJhaW50T2lkKSk7CgkJaWYgKCFI ZWFwVHVwbGVJc1ZhbGlkKGNvbnN0cmFpbnRUdXBsZSkpCgkJCWVsb2coRVJST1IsICJjb3Vs ZCBub3QgZmluZCB0dXBsZSBmb3IgY29uc3RyYWludCAldSIsIGNvbnN0cmFpbnRPaWQpOwoK CQljb25Gb3JtID0gKChGb3JtX3BnX2NvbnN0cmFpbnQpIEdFVFNUUlVDVChjb25zdHJhaW50 VHVwbGUpKTsKCgkJaWYgKGNvbkZvcm0tPmNvbmluZGlkID09IG9sZEluZGV4SWQpCgkJewoJ CQljb25Gb3JtLT5jb25pbmRpZCA9IG5ld0luZGV4SWQ7CgoJCQlDYXRhbG9nVHVwbGVVcGRh dGUocGdfY29uc3RyYWludCwgJmNvbnN0cmFpbnRUdXBsZS0+dF9zZWxmLCBjb25zdHJhaW50 VHVwbGUpOwoJCX0KCgkJaGVhcF9mcmVldHVwbGUoY29uc3RyYWludFR1cGxlKTsKCgkJLyog U2VhcmNoIGZvciB0cmlnZ2VyIHJlY29yZHMgKi8KCQlTY2FuS2V5SW5pdCgma2V5WzBdLAoJ CQkJCUFudW1fcGdfdHJpZ2dlcl90Z2NvbnN0cmFpbnQsCgkJCQkJQlRFcXVhbFN0cmF0ZWd5 TnVtYmVyLCBGX09JREVRLAoJCQkJCU9iamVjdElkR2V0RGF0dW0oY29uc3RyYWludE9pZCkp OwoKCQlzY2FuID0gc3lzdGFibGVfYmVnaW5zY2FuKHBnX3RyaWdnZXIsIFRyaWdnZXJDb25z dHJhaW50SW5kZXhJZCwgdHJ1ZSwKCQkJCQkJCQkgIE5VTEwsIDEsIGtleSk7CgoJCXdoaWxl IChIZWFwVHVwbGVJc1ZhbGlkKCh0cmlnZ2VyVHVwbGUgPSBzeXN0YWJsZV9nZXRuZXh0KHNj YW4pKSkpCgkJewoJCQlGb3JtX3BnX3RyaWdnZXIgdGdGb3JtID0gKEZvcm1fcGdfdHJpZ2dl cikgR0VUU1RSVUNUKHRyaWdnZXJUdXBsZSk7CgoJCQlpZiAodGdGb3JtLT50Z2NvbnN0cmlu ZGlkICE9IG9sZEluZGV4SWQpCgkJCQljb250aW51ZTsKCgkJCS8qIE1ha2UgYSBtb2RpZmlh YmxlIGNvcHkgKi8KCQkJdHJpZ2dlclR1cGxlID0gaGVhcF9jb3B5dHVwbGUodHJpZ2dlclR1 cGxlKTsKCQkJdGdGb3JtID0gKEZvcm1fcGdfdHJpZ2dlcikgR0VUU1RSVUNUKHRyaWdnZXJU dXBsZSk7CgoJCQl0Z0Zvcm0tPnRnY29uc3RyaW5kaWQgPSBuZXdJbmRleElkOwoKCQkJQ2F0 YWxvZ1R1cGxlVXBkYXRlKHBnX3RyaWdnZXIsICZ0cmlnZ2VyVHVwbGUtPnRfc2VsZiwgdHJp Z2dlclR1cGxlKTsKCgkJCWhlYXBfZnJlZXR1cGxlKHRyaWdnZXJUdXBsZSk7CgkJfQoKCQlz eXN0YWJsZV9lbmRzY2FuKHNjYW4pOwoJfQoKCS8qCgkgKiBNb3ZlIGNvbW1lbnQgaWYgYW55 CgkgKi8KCXsKCQlSZWxhdGlvbglkZXNjcmlwdGlvbjsKCQlTY2FuS2V5RGF0YSBza2V5WzNd OwoJCVN5c1NjYW5EZXNjIHNkOwoJCUhlYXBUdXBsZQl0dXBsZTsKCQlEYXR1bQkJdmFsdWVz W05hdHRzX3BnX2Rlc2NyaXB0aW9uXSA9IHswfTsKCQlib29sCQludWxsc1tOYXR0c19wZ19k ZXNjcmlwdGlvbl0gPSB7MH07CgkJYm9vbAkJcmVwbGFjZXNbTmF0dHNfcGdfZGVzY3JpcHRp b25dID0gezB9OwoKCQl2YWx1ZXNbQW51bV9wZ19kZXNjcmlwdGlvbl9vYmpvaWQgLSAxXSA9 IE9iamVjdElkR2V0RGF0dW0obmV3SW5kZXhJZCk7CgkJcmVwbGFjZXNbQW51bV9wZ19kZXNj cmlwdGlvbl9vYmpvaWQgLSAxXSA9IHRydWU7CgoJCVNjYW5LZXlJbml0KCZza2V5WzBdLAoJ CQkJCUFudW1fcGdfZGVzY3JpcHRpb25fb2Jqb2lkLAoJCQkJCUJURXF1YWxTdHJhdGVneU51 bWJlciwgRl9PSURFUSwKCQkJCQlPYmplY3RJZEdldERhdHVtKG9sZEluZGV4SWQpKTsKCQlT Y2FuS2V5SW5pdCgmc2tleVsxXSwKCQkJCQlBbnVtX3BnX2Rlc2NyaXB0aW9uX2NsYXNzb2lk LAoJCQkJCUJURXF1YWxTdHJhdGVneU51bWJlciwgRl9PSURFUSwKCQkJCQlPYmplY3RJZEdl dERhdHVtKFJlbGF0aW9uUmVsYXRpb25JZCkpOwoJCVNjYW5LZXlJbml0KCZza2V5WzJdLAoJ CQkJCUFudW1fcGdfZGVzY3JpcHRpb25fb2Jqc3ViaWQsCgkJCQkJQlRFcXVhbFN0cmF0ZWd5 TnVtYmVyLCBGX0lOVDRFUSwKCQkJCQlJbnQzMkdldERhdHVtKDApKTsKCgkJZGVzY3JpcHRp b24gPSB0YWJsZV9vcGVuKERlc2NyaXB0aW9uUmVsYXRpb25JZCwgUm93RXhjbHVzaXZlTG9j ayk7CgoJCXNkID0gc3lzdGFibGVfYmVnaW5zY2FuKGRlc2NyaXB0aW9uLCBEZXNjcmlwdGlv bk9iakluZGV4SWQsIHRydWUsCgkJCQkJCQkJTlVMTCwgMywgc2tleSk7CgoJCXdoaWxlICgo dHVwbGUgPSBzeXN0YWJsZV9nZXRuZXh0KHNkKSkgIT0gTlVMTCkKCQl7CgkJCXR1cGxlID0g aGVhcF9tb2RpZnlfdHVwbGUodHVwbGUsIFJlbGF0aW9uR2V0RGVzY3IoZGVzY3JpcHRpb24p LAoJCQkJCQkJCQkgIHZhbHVlcywgbnVsbHMsIHJlcGxhY2VzKTsKCQkJQ2F0YWxvZ1R1cGxl VXBkYXRlKGRlc2NyaXB0aW9uLCAmdHVwbGUtPnRfc2VsZiwgdHVwbGUpOwoKCQkJYnJlYWs7 CQkJCS8qIEFzc3VtZSB0aGVyZSBjYW4gYmUgb25seSBvbmUgbWF0Y2ggKi8KCQl9CgoJCXN5 c3RhYmxlX2VuZHNjYW4oc2QpOwoJCXRhYmxlX2Nsb3NlKGRlc2NyaXB0aW9uLCBOb0xvY2sp OwoJfQoKCS8qCgkgKiBTd2FwIGluaGVyaXRhbmNlIHJlbGF0aW9uc2hpcCB3aXRoIHBhcmVu dCBpbmRleAoJICovCglpZiAoZ2V0X3JlbF9yZWxpc3BhcnRpdGlvbihvbGRJbmRleElkKSkK CXsKCQlMaXN0CSAgICphbmNlc3RvcnMgPSBnZXRfcGFydGl0aW9uX2FuY2VzdG9ycyhvbGRJ bmRleElkKTsKCQlPaWQJCQlwYXJlbnRJbmRleFJlbGlkID0gbGluaXRpYWxfb2lkKGFuY2Vz dG9ycyk7CgoJCURlbGV0ZUluaGVyaXRzVHVwbGUob2xkSW5kZXhJZCwgcGFyZW50SW5kZXhS ZWxpZCwgZmFsc2UsIE5VTEwpOwoJCVN0b3JlU2luZ2xlSW5oZXJpdGFuY2UobmV3SW5kZXhJ ZCwgcGFyZW50SW5kZXhSZWxpZCwgMSk7CgoJCWxpc3RfZnJlZShhbmNlc3RvcnMpOwoJfQoK CS8qCgkgKiBTd2FwIGFsbCBkZXBlbmRlbmNpZXMgb2YgYW5kIG9uIHRoZSBvbGQgaW5kZXgg dG8gdGhlIG5ldyBvbmUsIGFuZAoJICogdmljZS12ZXJzYS4gIE5vdGUgdGhhdCBhIGNhbGwg dG8gQ29tbWFuZENvdW50ZXJJbmNyZW1lbnQoKSB3b3VsZCBjYXVzZQoJICogZHVwbGljYXRl IGVudHJpZXMgaW4gcGdfZGVwZW5kLCBzbyB0aGlzIHNob3VsZCBub3QgYmUgZG9uZS4KCSAq LwoJY2hhbmdlRGVwZW5kZW5jaWVzT2YoUmVsYXRpb25SZWxhdGlvbklkLCBuZXdJbmRleElk LCBvbGRJbmRleElkKTsKCWNoYW5nZURlcGVuZGVuY2llc09uKFJlbGF0aW9uUmVsYXRpb25J ZCwgbmV3SW5kZXhJZCwgb2xkSW5kZXhJZCk7CgoJY2hhbmdlRGVwZW5kZW5jaWVzT2YoUmVs YXRpb25SZWxhdGlvbklkLCBvbGRJbmRleElkLCBuZXdJbmRleElkKTsKCWNoYW5nZURlcGVu ZGVuY2llc09uKFJlbGF0aW9uUmVsYXRpb25JZCwgb2xkSW5kZXhJZCwgbmV3SW5kZXhJZCk7 CgoJLyogY29weSBvdmVyIHN0YXRpc3RpY3MgZnJvbSBvbGQgdG8gbmV3IGluZGV4ICovCglw Z3N0YXRfY29weV9yZWxhdGlvbl9zdGF0cyhuZXdDbGFzc1JlbCwgb2xkQ2xhc3NSZWwpOwoK CS8qIENvcHkgZGF0YSBvZiBwZ19zdGF0aXN0aWMgZnJvbSB0aGUgb2xkIGluZGV4IHRvIHRo ZSBuZXcgb25lICovCglDb3B5U3RhdGlzdGljcyhvbGRJbmRleElkLCBuZXdJbmRleElkKTsK CgkvKiBDbG9zZSByZWxhdGlvbnMgKi8KCXRhYmxlX2Nsb3NlKHBnX2NsYXNzLCBSb3dFeGNs dXNpdmVMb2NrKTsKCXRhYmxlX2Nsb3NlKHBnX2luZGV4LCBSb3dFeGNsdXNpdmVMb2NrKTsK CXRhYmxlX2Nsb3NlKHBnX2NvbnN0cmFpbnQsIFJvd0V4Y2x1c2l2ZUxvY2spOwoJdGFibGVf Y2xvc2UocGdfdHJpZ2dlciwgUm93RXhjbHVzaXZlTG9jayk7CgoJLyogVGhlIGxvY2sgdGFr ZW4gcHJldmlvdXNseSBpcyBub3QgcmVsZWFzZWQgdW50aWwgdGhlIGVuZCBvZiB0cmFuc2Fj dGlvbiAqLwoJcmVsYXRpb25fY2xvc2Uob2xkQ2xhc3NSZWwsIE5vTG9jayk7CglyZWxhdGlv bl9jbG9zZShuZXdDbGFzc1JlbCwgTm9Mb2NrKTsKfQoKLyoKICogaW5kZXhfY29uY3VycmVu dGx5X3NldF9kZWFkCiAqCiAqIFBlcmZvcm0gdGhlIGxhc3QgaW52YWxpZGF0aW9uIHN0YWdl IG9mIERST1AgSU5ERVggQ09OQ1VSUkVOVExZIG9yIFJFSU5ERVgKICogQ09OQ1VSUkVOVExZ IGJlZm9yZSBhY3R1YWxseSBkcm9wcGluZyB0aGUgaW5kZXguICBBZnRlciBjYWxsaW5nIHRo aXMKICogZnVuY3Rpb24sIHRoZSBpbmRleCBpcyBzZWVuIGJ5IGFsbCB0aGUgYmFja2VuZHMg YXMgZGVhZC4gIExvdy1sZXZlbCBsb2NrcwogKiB0YWtlbiBoZXJlIGFyZSBrZXB0IHVudGls IHRoZSBlbmQgb2YgdGhlIHRyYW5zYWN0aW9uIGNhbGxpbmcgdGhpcyBmdW5jdGlvbi4KICov CnZvaWQKaW5kZXhfY29uY3VycmVudGx5X3NldF9kZWFkKE9pZCBoZWFwSWQsIE9pZCBpbmRl eElkKQp7CglSZWxhdGlvbgl1c2VySGVhcFJlbGF0aW9uOwoJUmVsYXRpb24JdXNlckluZGV4 UmVsYXRpb247CgoJLyoKCSAqIE5vIG1vcmUgcHJlZGljYXRlIGxvY2tzIHdpbGwgYmUgYWNx dWlyZWQgb24gdGhpcyBpbmRleCwgYW5kIHdlJ3JlIGFib3V0CgkgKiB0byBzdG9wIGRvaW5n IGluc2VydHMgaW50byB0aGUgaW5kZXggd2hpY2ggY291bGQgc2hvdyBjb25mbGljdHMgd2l0 aAoJICogZXhpc3RpbmcgcHJlZGljYXRlIGxvY2tzLCBzbyBub3cgaXMgdGhlIHRpbWUgdG8g bW92ZSB0aGVtIHRvIHRoZSBoZWFwCgkgKiByZWxhdGlvbi4KCSAqLwoJdXNlckhlYXBSZWxh dGlvbiA9IHRhYmxlX29wZW4oaGVhcElkLCBTaGFyZVVwZGF0ZUV4Y2x1c2l2ZUxvY2spOwoJ dXNlckluZGV4UmVsYXRpb24gPSBpbmRleF9vcGVuKGluZGV4SWQsIFNoYXJlVXBkYXRlRXhj bHVzaXZlTG9jayk7CglUcmFuc2ZlclByZWRpY2F0ZUxvY2tzVG9IZWFwUmVsYXRpb24odXNl ckluZGV4UmVsYXRpb24pOwoKCS8qCgkgKiBOb3cgd2UgYXJlIHN1cmUgdGhhdCBub2JvZHkg dXNlcyB0aGUgaW5kZXggZm9yIHF1ZXJpZXM7IHRoZXkganVzdCBtaWdodAoJICogaGF2ZSBp dCBvcGVuIGZvciB1cGRhdGluZyBpdC4gIFNvIG5vdyB3ZSBjYW4gdW5zZXQgaW5kaXNyZWFk eSBhbmQKCSAqIGluZGlzbGl2ZSwgdGhlbiB3YWl0IHRpbGwgbm9ib2R5IGNvdWxkIGJlIHVz aW5nIGl0IGF0IGFsbCBhbnltb3JlLgoJICovCglpbmRleF9zZXRfc3RhdGVfZmxhZ3MoaW5k ZXhJZCwgSU5ERVhfRFJPUF9TRVRfREVBRCk7CgoJLyoKCSAqIEludmFsaWRhdGUgdGhlIHJl bGNhY2hlIGZvciB0aGUgdGFibGUsIHNvIHRoYXQgYWZ0ZXIgdGhpcyBjb21taXQgYWxsCgkg KiBzZXNzaW9ucyB3aWxsIHJlZnJlc2ggdGhlIHRhYmxlJ3MgaW5kZXggbGlzdC4gIEZvcmdl dHRpbmcganVzdCB0aGUKCSAqIGluZGV4J3MgcmVsY2FjaGUgZW50cnkgaXMgbm90IGVub3Vn aC4KCSAqLwoJQ2FjaGVJbnZhbGlkYXRlUmVsY2FjaGUodXNlckhlYXBSZWxhdGlvbik7CgoJ LyoKCSAqIENsb3NlIHRoZSByZWxhdGlvbnMgYWdhaW4sIHRob3VnaCBzdGlsbCBob2xkaW5n IHNlc3Npb24gbG9jay4KCSAqLwoJdGFibGVfY2xvc2UodXNlckhlYXBSZWxhdGlvbiwgTm9M b2NrKTsKCWluZGV4X2Nsb3NlKHVzZXJJbmRleFJlbGF0aW9uLCBOb0xvY2spOwp9CgovKgog KiBpbmRleF9jb25zdHJhaW50X2NyZWF0ZQogKgogKiBTZXQgdXAgYSBjb25zdHJhaW50IGFz c29jaWF0ZWQgd2l0aCBhbiBpbmRleC4gIFJldHVybiB0aGUgbmV3IGNvbnN0cmFpbnQncwog KiBhZGRyZXNzLgogKgogKiBoZWFwUmVsYXRpb246IHRhYmxlIG93bmluZyB0aGUgaW5kZXgg KG11c3QgYmUgc3VpdGFibHkgbG9ja2VkIGJ5IGNhbGxlcikKICogaW5kZXhSZWxhdGlvbklk OiBPSUQgb2YgdGhlIGluZGV4CiAqIHBhcmVudENvbnN0cmFpbnRJZDogaWYgY29uc3RyYWlu dCBpcyBvbiBhIHBhcnRpdGlvbiwgdGhlIE9JRCBvZiB0aGUKICoJCWNvbnN0cmFpbnQgaW4g dGhlIHBhcmVudC4KICogaW5kZXhJbmZvOiBzYW1lIGluZm8gZXhlY3V0b3IgdXNlcyB0byBp bnNlcnQgaW50byB0aGUgaW5kZXgKICogY29uc3RyYWludE5hbWU6IHdoYXQgaXQgc2F5IChn ZW5lcmFsbHksIHNob3VsZCBtYXRjaCBuYW1lIG9mIGluZGV4KQogKiBjb25zdHJhaW50VHlw ZTogb25lIG9mIENPTlNUUkFJTlRfUFJJTUFSWSwgQ09OU1RSQUlOVF9VTklRVUUsIG9yCiAq CQlDT05TVFJBSU5UX0VYQ0xVU0lPTgogKiBmbGFnczogYml0bWFzayB0aGF0IGNhbiBpbmNs dWRlIGFueSBjb21iaW5hdGlvbiBvZiB0aGVzZSBiaXRzOgogKgkJSU5ERVhfQ09OU1RSX0NS RUFURV9NQVJLX0FTX1BSSU1BUlk6IGluZGV4IGlzIGEgUFJJTUFSWSBLRVkKICoJCUlOREVY X0NPTlNUUl9DUkVBVEVfREVGRVJSQUJMRTogY29uc3RyYWludCBpcyBERUZFUlJBQkxFCiAq CQlJTkRFWF9DT05TVFJfQ1JFQVRFX0lOSVRfREVGRVJSRUQ6IGNvbnN0cmFpbnQgaXMgSU5J VElBTExZIERFRkVSUkVECiAqCQlJTkRFWF9DT05TVFJfQ1JFQVRFX1VQREFURV9JTkRFWDog dXBkYXRlIHRoZSBwZ19pbmRleCByb3cKICoJCUlOREVYX0NPTlNUUl9DUkVBVEVfUkVNT1ZF X09MRF9ERVBTOiByZW1vdmUgZXhpc3RpbmcgZGVwZW5kZW5jaWVzCiAqCQkJb2YgaW5kZXgg b24gdGFibGUncyBjb2x1bW5zCiAqCQlJTkRFWF9DT05TVFJfQ1JFQVRFX1dJVEhPVVRfT1ZF UkxBUFM6IGNvbnN0cmFpbnQgdXNlcyBXSVRIT1VUIE9WRVJMQVBTCiAqIGFsbG93X3N5c3Rl bV90YWJsZV9tb2RzOiBhbGxvdyB0YWJsZSB0byBiZSBhIHN5c3RlbSBjYXRhbG9nCiAqIGlz X2ludGVybmFsOiBpbmRleCBpcyBjb25zdHJ1Y3RlZCBkdWUgdG8gaW50ZXJuYWwgcHJvY2Vz cwogKi8KT2JqZWN0QWRkcmVzcwppbmRleF9jb25zdHJhaW50X2NyZWF0ZShSZWxhdGlvbiBo ZWFwUmVsYXRpb24sCgkJCQkJCU9pZCBpbmRleFJlbGF0aW9uSWQsCgkJCQkJCU9pZCBwYXJl bnRDb25zdHJhaW50SWQsCgkJCQkJCWNvbnN0IEluZGV4SW5mbyAqaW5kZXhJbmZvLAoJCQkJ CQljb25zdCBjaGFyICpjb25zdHJhaW50TmFtZSwKCQkJCQkJY2hhciBjb25zdHJhaW50VHlw ZSwKCQkJCQkJdWludDE2IGNvbnN0cl9mbGFncywKCQkJCQkJYm9vbCBhbGxvd19zeXN0ZW1f dGFibGVfbW9kcywKCQkJCQkJYm9vbCBpc19pbnRlcm5hbCkKewoJT2lkCQkJbmFtZXNwYWNl SWQgPSBSZWxhdGlvbkdldE5hbWVzcGFjZShoZWFwUmVsYXRpb24pOwoJT2JqZWN0QWRkcmVz cyBteXNlbGYsCgkJCQlpZHhhZGRyOwoJT2lkCQkJY29uT2lkOwoJYm9vbAkJZGVmZXJyYWJs ZTsKCWJvb2wJCWluaXRkZWZlcnJlZDsKCWJvb2wJCW1hcmtfYXNfcHJpbWFyeTsKCWJvb2wJ CWlzbG9jYWw7Cglib29sCQlub2luaGVyaXQ7Cglib29sCQlpc193aXRob3V0X292ZXJsYXBz OwoJaW50MTYJCWluaGNvdW50OwoKCWRlZmVycmFibGUgPSAoY29uc3RyX2ZsYWdzICYgSU5E RVhfQ09OU1RSX0NSRUFURV9ERUZFUlJBQkxFKSAhPSAwOwoJaW5pdGRlZmVycmVkID0gKGNv bnN0cl9mbGFncyAmIElOREVYX0NPTlNUUl9DUkVBVEVfSU5JVF9ERUZFUlJFRCkgIT0gMDsK CW1hcmtfYXNfcHJpbWFyeSA9IChjb25zdHJfZmxhZ3MgJiBJTkRFWF9DT05TVFJfQ1JFQVRF X01BUktfQVNfUFJJTUFSWSkgIT0gMDsKCWlzX3dpdGhvdXRfb3ZlcmxhcHMgPSAoY29uc3Ry X2ZsYWdzICYgSU5ERVhfQ09OU1RSX0NSRUFURV9XSVRIT1VUX09WRVJMQVBTKSAhPSAwOwoK CS8qIGNvbnN0cmFpbnQgY3JlYXRpb24gc3VwcG9ydCBkb2Vzbid0IHdvcmsgd2hpbGUgYm9v dHN0cmFwcGluZyAqLwoJQXNzZXJ0KCFJc0Jvb3RzdHJhcFByb2Nlc3NpbmdNb2RlKCkpOwoK CS8qIGVuZm9yY2Ugc3lzdGVtLXRhYmxlIHJlc3RyaWN0aW9uICovCglpZiAoIWFsbG93X3N5 c3RlbV90YWJsZV9tb2RzICYmCgkJSXNTeXN0ZW1SZWxhdGlvbihoZWFwUmVsYXRpb24pICYm CgkJSXNOb3JtYWxQcm9jZXNzaW5nTW9kZSgpKQoJCWVyZXBvcnQoRVJST1IsCgkJCQkoZXJy Y29kZShFUlJDT0RFX0ZFQVRVUkVfTk9UX1NVUFBPUlRFRCksCgkJCQkgZXJybXNnKCJ1c2Vy LWRlZmluZWQgaW5kZXhlcyBvbiBzeXN0ZW0gY2F0YWxvZyB0YWJsZXMgYXJlIG5vdCBzdXBw b3J0ZWQiKSkpOwoKCS8qIHByaW1hcnkvdW5pcXVlIGNvbnN0cmFpbnRzIHNob3VsZG4ndCBo YXZlIGFueSBleHByZXNzaW9ucyAqLwoJaWYgKGluZGV4SW5mby0+aWlfRXhwcmVzc2lvbnMg JiYKCQljb25zdHJhaW50VHlwZSAhPSBDT05TVFJBSU5UX0VYQ0xVU0lPTikKCQllbG9nKEVS Uk9SLCAiY29uc3RyYWludHMgY2Fubm90IGhhdmUgaW5kZXggZXhwcmVzc2lvbnMiKTsKCgkv KgoJICogSWYgd2UncmUgbWFudWZhY3R1cmluZyBhIGNvbnN0cmFpbnQgZm9yIGEgcHJlLWV4 aXN0aW5nIGluZGV4LCB3ZSBuZWVkCgkgKiB0byBnZXQgcmlkIG9mIHRoZSBleGlzdGluZyBh dXRvIGRlcGVuZGVuY2llcyBmb3IgdGhlIGluZGV4ICh0aGUgb25lcwoJICogdGhhdCBpbmRl eF9jcmVhdGUoKSB3b3VsZCBoYXZlIG1hZGUgaW5zdGVhZCBvZiBjYWxsaW5nIHRoaXMgZnVu Y3Rpb24pLgoJICoKCSAqIE5vdGU6IHRoaXMgY29kZSB3b3VsZCBub3QgbmVjZXNzYXJpbHkg ZG8gdGhlIHJpZ2h0IHRoaW5nIGlmIHRoZSBpbmRleAoJICogaGFzIGFueSBleHByZXNzaW9u cyBvciBwcmVkaWNhdGUsIGJ1dCB3ZSdkIG5ldmVyIGJlIHR1cm5pbmcgc3VjaCBhbgoJICog aW5kZXggaW50byBhIFVOSVFVRSBvciBQUklNQVJZIEtFWSBjb25zdHJhaW50LgoJICovCglp ZiAoY29uc3RyX2ZsYWdzICYgSU5ERVhfQ09OU1RSX0NSRUFURV9SRU1PVkVfT0xEX0RFUFMp CgkJZGVsZXRlRGVwZW5kZW5jeVJlY29yZHNGb3JDbGFzcyhSZWxhdGlvblJlbGF0aW9uSWQs IGluZGV4UmVsYXRpb25JZCwKCQkJCQkJCQkJCVJlbGF0aW9uUmVsYXRpb25JZCwgREVQRU5E RU5DWV9BVVRPKTsKCglpZiAoT2lkSXNWYWxpZChwYXJlbnRDb25zdHJhaW50SWQpKQoJewoJ CWlzbG9jYWwgPSBmYWxzZTsKCQlpbmhjb3VudCA9IDE7CgkJbm9pbmhlcml0ID0gZmFsc2U7 Cgl9CgllbHNlCgl7CgkJaXNsb2NhbCA9IHRydWU7CgkJaW5oY291bnQgPSAwOwoJCW5vaW5o ZXJpdCA9IHRydWU7Cgl9CgoJLyoKCSAqIENvbnN0cnVjdCBhIHBnX2NvbnN0cmFpbnQgZW50 cnkuCgkgKi8KCWNvbk9pZCA9IENyZWF0ZUNvbnN0cmFpbnRFbnRyeShjb25zdHJhaW50TmFt ZSwKCQkJCQkJCQkgICBuYW1lc3BhY2VJZCwKCQkJCQkJCQkgICBjb25zdHJhaW50VHlwZSwK CQkJCQkJCQkgICBkZWZlcnJhYmxlLAoJCQkJCQkJCSAgIGluaXRkZWZlcnJlZCwKCQkJCQkJ CQkgICB0cnVlLAkvKiBJcyBFbmZvcmNlZCAqLwoJCQkJCQkJCSAgIHRydWUsCgkJCQkJCQkJ ICAgcGFyZW50Q29uc3RyYWludElkLAoJCQkJCQkJCSAgIFJlbGF0aW9uR2V0UmVsaWQoaGVh cFJlbGF0aW9uKSwKCQkJCQkJCQkgICBpbmRleEluZm8tPmlpX0luZGV4QXR0ck51bWJlcnMs CgkJCQkJCQkJICAgaW5kZXhJbmZvLT5paV9OdW1JbmRleEtleUF0dHJzLAoJCQkJCQkJCSAg IGluZGV4SW5mby0+aWlfTnVtSW5kZXhBdHRycywKCQkJCQkJCQkgICBJbnZhbGlkT2lkLAkv KiBubyBkb21haW4gKi8KCQkJCQkJCQkgICBpbmRleFJlbGF0aW9uSWQsIC8qIGluZGV4IE9J RCAqLwoJCQkJCQkJCSAgIEludmFsaWRPaWQsCS8qIG5vIGZvcmVpZ24ga2V5ICovCgkJCQkJ CQkJICAgTlVMTCwKCQkJCQkJCQkgICBOVUxMLAoJCQkJCQkJCSAgIE5VTEwsCgkJCQkJCQkJ ICAgTlVMTCwKCQkJCQkJCQkgICAwLAoJCQkJCQkJCSAgICcgJywKCQkJCQkJCQkgICAnICcs CgkJCQkJCQkJICAgTlVMTCwKCQkJCQkJCQkgICAwLAoJCQkJCQkJCSAgICcgJywKCQkJCQkJ CQkgICBpbmRleEluZm8tPmlpX0V4Y2x1c2lvbk9wcywKCQkJCQkJCQkgICBOVUxMLAkvKiBu byBjaGVjayBjb25zdHJhaW50ICovCgkJCQkJCQkJICAgTlVMTCwKCQkJCQkJCQkgICBpc2xv Y2FsLAoJCQkJCQkJCSAgIGluaGNvdW50LAoJCQkJCQkJCSAgIG5vaW5oZXJpdCwKCQkJCQkJ CQkgICBpc193aXRob3V0X292ZXJsYXBzLAoJCQkJCQkJCSAgIGlzX2ludGVybmFsKTsKCgkv KgoJICogUmVnaXN0ZXIgdGhlIGluZGV4IGFzIGludGVybmFsbHkgZGVwZW5kZW50IG9uIHRo ZSBjb25zdHJhaW50LgoJICoKCSAqIE5vdGUgdGhhdCB0aGUgY29uc3RyYWludCBoYXMgYSBk ZXBlbmRlbmN5IG9uIHRoZSB0YWJsZSwgc28gd2UgZG9uJ3QKCSAqIG5lZWQgKG9yIHdhbnQp IGFueSBkaXJlY3QgZGVwZW5kZW5jeSBmcm9tIHRoZSBpbmRleCB0byB0aGUgdGFibGUuCgkg Ki8KCU9iamVjdEFkZHJlc3NTZXQobXlzZWxmLCBDb25zdHJhaW50UmVsYXRpb25JZCwgY29u T2lkKTsKCU9iamVjdEFkZHJlc3NTZXQoaWR4YWRkciwgUmVsYXRpb25SZWxhdGlvbklkLCBp bmRleFJlbGF0aW9uSWQpOwoJcmVjb3JkRGVwZW5kZW5jeU9uKCZpZHhhZGRyLCAmbXlzZWxm LCBERVBFTkRFTkNZX0lOVEVSTkFMKTsKCgkvKgoJICogQWxzbywgaWYgdGhpcyBpcyBhIGNv bnN0cmFpbnQgb24gYSBwYXJ0aXRpb24sIGdpdmUgaXQgcGFydGl0aW9uLXR5cGUKCSAqIGRl cGVuZGVuY2llcyBvbiB0aGUgcGFyZW50IGNvbnN0cmFpbnQgYXMgd2VsbCBhcyB0aGUgdGFi bGUuCgkgKi8KCWlmIChPaWRJc1ZhbGlkKHBhcmVudENvbnN0cmFpbnRJZCkpCgl7CgkJT2Jq ZWN0QWRkcmVzcyByZWZlcmVuY2VkOwoKCQlPYmplY3RBZGRyZXNzU2V0KHJlZmVyZW5jZWQs IENvbnN0cmFpbnRSZWxhdGlvbklkLCBwYXJlbnRDb25zdHJhaW50SWQpOwoJCXJlY29yZERl cGVuZGVuY3lPbigmbXlzZWxmLCAmcmVmZXJlbmNlZCwgREVQRU5ERU5DWV9QQVJUSVRJT05f UFJJKTsKCQlPYmplY3RBZGRyZXNzU2V0KHJlZmVyZW5jZWQsIFJlbGF0aW9uUmVsYXRpb25J ZCwKCQkJCQkJIFJlbGF0aW9uR2V0UmVsaWQoaGVhcFJlbGF0aW9uKSk7CgkJcmVjb3JkRGVw ZW5kZW5jeU9uKCZteXNlbGYsICZyZWZlcmVuY2VkLCBERVBFTkRFTkNZX1BBUlRJVElPTl9T RUMpOwoJfQoKCS8qCgkgKiBJZiB0aGUgY29uc3RyYWludCBpcyBkZWZlcnJhYmxlLCBjcmVh dGUgdGhlIGRlZmVycmVkIHVuaXF1ZW5lc3MKCSAqIGNoZWNraW5nIHRyaWdnZXIuICAoVGhl IHRyaWdnZXIgd2lsbCBiZSBnaXZlbiBhbiBpbnRlcm5hbCBkZXBlbmRlbmN5IG9uCgkgKiB0 aGUgY29uc3RyYWludCBieSBDcmVhdGVUcmlnZ2VyLikKCSAqLwoJaWYgKGRlZmVycmFibGUp Cgl7CgkJQ3JlYXRlVHJpZ1N0bXQgKnRyaWdnZXIgPSBtYWtlTm9kZShDcmVhdGVUcmlnU3Rt dCk7CgoJCXRyaWdnZXItPnJlcGxhY2UgPSBmYWxzZTsKCQl0cmlnZ2VyLT5pc2NvbnN0cmFp bnQgPSB0cnVlOwoJCXRyaWdnZXItPnRyaWduYW1lID0gKGNvbnN0cmFpbnRUeXBlID09IENP TlNUUkFJTlRfUFJJTUFSWSkgPwoJCQkiUEtfQ29uc3RyYWludFRyaWdnZXIiIDoKCQkJIlVu aXF1ZV9Db25zdHJhaW50VHJpZ2dlciI7CgkJdHJpZ2dlci0+cmVsYXRpb24gPSBOVUxMOwoJ CXRyaWdnZXItPmZ1bmNuYW1lID0gU3lzdGVtRnVuY05hbWUoInVuaXF1ZV9rZXlfcmVjaGVj ayIpOwoJCXRyaWdnZXItPmFyZ3MgPSBOSUw7CgkJdHJpZ2dlci0+cm93ID0gdHJ1ZTsKCQl0 cmlnZ2VyLT50aW1pbmcgPSBUUklHR0VSX1RZUEVfQUZURVI7CgkJdHJpZ2dlci0+ZXZlbnRz ID0gVFJJR0dFUl9UWVBFX0lOU0VSVCB8IFRSSUdHRVJfVFlQRV9VUERBVEU7CgkJdHJpZ2dl ci0+Y29sdW1ucyA9IE5JTDsKCQl0cmlnZ2VyLT53aGVuQ2xhdXNlID0gTlVMTDsKCQl0cmln Z2VyLT50cmFuc2l0aW9uUmVscyA9IE5JTDsKCQl0cmlnZ2VyLT5kZWZlcnJhYmxlID0gdHJ1 ZTsKCQl0cmlnZ2VyLT5pbml0ZGVmZXJyZWQgPSBpbml0ZGVmZXJyZWQ7CgkJdHJpZ2dlci0+ Y29uc3RycmVsID0gTlVMTDsKCgkJKHZvaWQpIENyZWF0ZVRyaWdnZXIodHJpZ2dlciwgTlVM TCwgUmVsYXRpb25HZXRSZWxpZChoZWFwUmVsYXRpb24pLAoJCQkJCQkJIEludmFsaWRPaWQs IGNvbk9pZCwgaW5kZXhSZWxhdGlvbklkLCBJbnZhbGlkT2lkLAoJCQkJCQkJIEludmFsaWRP aWQsIE5VTEwsIHRydWUsIGZhbHNlKTsKCX0KCgkvKgoJICogSWYgbmVlZGVkLCBtYXJrIHRo ZSBpbmRleCBhcyBwcmltYXJ5IGFuZC9vciBkZWZlcnJlZCBpbiBwZ19pbmRleC4KCSAqCgkg KiBOb3RlOiBXaGVuIG1ha2luZyBhbiBleGlzdGluZyBpbmRleCBpbnRvIGEgY29uc3RyYWlu dCwgY2FsbGVyIG11c3QgaGF2ZQoJICogYSB0YWJsZSBsb2NrIHRoYXQgcHJldmVudHMgY29u Y3VycmVudCB0YWJsZSB1cGRhdGVzOyBvdGhlcndpc2UsIHRoZXJlCgkgKiBpcyBhIHJpc2sg dGhhdCBjb25jdXJyZW50IHJlYWRlcnMgb2YgdGhlIHRhYmxlIHdpbGwgbWlzcyBzZWVpbmcg dGhpcwoJICogaW5kZXggYXQgYWxsLgoJICovCglpZiAoKGNvbnN0cl9mbGFncyAmIElOREVY X0NPTlNUUl9DUkVBVEVfVVBEQVRFX0lOREVYKSAmJgoJCShtYXJrX2FzX3ByaW1hcnkgfHwg ZGVmZXJyYWJsZSkpCgl7CgkJUmVsYXRpb24JcGdfaW5kZXg7CgkJSGVhcFR1cGxlCWluZGV4 VHVwbGU7CgkJRm9ybV9wZ19pbmRleCBpbmRleEZvcm07CgkJYm9vbAkJZGlydHkgPSBmYWxz ZTsKCQlib29sCQltYXJrZWRfYXNfcHJpbWFyeSA9IGZhbHNlOwoKCQlwZ19pbmRleCA9IHRh YmxlX29wZW4oSW5kZXhSZWxhdGlvbklkLCBSb3dFeGNsdXNpdmVMb2NrKTsKCgkJaW5kZXhU dXBsZSA9IFNlYXJjaFN5c0NhY2hlQ29weTEoSU5ERVhSRUxJRCwKCQkJCQkJCQkJCSBPYmpl Y3RJZEdldERhdHVtKGluZGV4UmVsYXRpb25JZCkpOwoJCWlmICghSGVhcFR1cGxlSXNWYWxp ZChpbmRleFR1cGxlKSkKCQkJZWxvZyhFUlJPUiwgImNhY2hlIGxvb2t1cCBmYWlsZWQgZm9y IGluZGV4ICV1IiwgaW5kZXhSZWxhdGlvbklkKTsKCQlpbmRleEZvcm0gPSAoRm9ybV9wZ19p bmRleCkgR0VUU1RSVUNUKGluZGV4VHVwbGUpOwoKCQlpZiAobWFya19hc19wcmltYXJ5ICYm ICFpbmRleEZvcm0tPmluZGlzcHJpbWFyeSkKCQl7CgkJCWluZGV4Rm9ybS0+aW5kaXNwcmlt YXJ5ID0gdHJ1ZTsKCQkJZGlydHkgPSB0cnVlOwoJCQltYXJrZWRfYXNfcHJpbWFyeSA9IHRy dWU7CgkJfQoKCQlpZiAoZGVmZXJyYWJsZSAmJiBpbmRleEZvcm0tPmluZGltbWVkaWF0ZSkK CQl7CgkJCWluZGV4Rm9ybS0+aW5kaW1tZWRpYXRlID0gZmFsc2U7CgkJCWRpcnR5ID0gdHJ1 ZTsKCQl9CgoJCWlmIChkaXJ0eSkKCQl7CgkJCUNhdGFsb2dUdXBsZVVwZGF0ZShwZ19pbmRl eCwgJmluZGV4VHVwbGUtPnRfc2VsZiwgaW5kZXhUdXBsZSk7CgoJCQkvKgoJCQkgKiBXaGVu IHdlIG1hcmsgYW4gZXhpc3RpbmcgaW5kZXggYXMgcHJpbWFyeSwgZm9yY2UgYSByZWxjYWNo ZQoJCQkgKiBmbHVzaCBvbiBpdHMgcGFyZW50IHRhYmxlLCBzbyB0aGF0IGFsbCBzZXNzaW9u cyB3aWxsIGJlY29tZQoJCQkgKiBhd2FyZSB0aGF0IHRoZSB0YWJsZSBub3cgaGFzIGEgcHJp bWFyeSBrZXkuICBUaGlzIGlzIGltcG9ydGFudAoJCQkgKiBiZWNhdXNlIGl0IGFmZmVjdHMg c29tZSByZXBsaWNhdGlvbiBiZWhhdmlvcnMuCgkJCSAqLwoJCQlpZiAobWFya2VkX2FzX3By aW1hcnkpCgkJCQlDYWNoZUludmFsaWRhdGVSZWxjYWNoZShoZWFwUmVsYXRpb24pOwoKCQkJ SW52b2tlT2JqZWN0UG9zdEFsdGVySG9va0FyZyhJbmRleFJlbGF0aW9uSWQsIGluZGV4UmVs YXRpb25JZCwgMCwKCQkJCQkJCQkJCSBJbnZhbGlkT2lkLCBpc19pbnRlcm5hbCk7CgkJfQoK CQloZWFwX2ZyZWV0dXBsZShpbmRleFR1cGxlKTsKCQl0YWJsZV9jbG9zZShwZ19pbmRleCwg Um93RXhjbHVzaXZlTG9jayk7Cgl9CgoJcmV0dXJuIG15c2VsZjsKfQoKLyoKICoJCWluZGV4 X2Ryb3AKICoKICogTk9URTogdGhpcyByb3V0aW5lIHNob3VsZCBub3cgb25seSBiZSBjYWxs ZWQgdGhyb3VnaCBwZXJmb3JtRGVsZXRpb24oKSwKICogZWxzZSBhc3NvY2lhdGVkIGRlcGVu ZGVuY2llcyB3b24ndCBiZSBjbGVhbmVkIHVwLgogKgogKiBJZiBjb25jdXJyZW50IGlzIHRy dWUsIGRvIGEgRFJPUCBJTkRFWCBDT05DVVJSRU5UTFkuICBJZiBjb25jdXJyZW50IGlzCiAq IGZhbHNlIGJ1dCBjb25jdXJyZW50X2xvY2tfbW9kZSBpcyB0cnVlLCB0aGVuIGRvIGEgbm9y bWFsIERST1AgSU5ERVggYnV0CiAqIHRha2UgYSBsb2NrIGZvciBDT05DVVJSRU5UTFkgcHJv Y2Vzc2luZy4gIFRoYXQgaXMgdXNlZCBhcyBwYXJ0IG9mIFJFSU5ERVgKICogQ09OQ1VSUkVO VExZLgogKi8Kdm9pZAppbmRleF9kcm9wKE9pZCBpbmRleElkLCBib29sIGNvbmN1cnJlbnQs IGJvb2wgY29uY3VycmVudF9sb2NrX21vZGUpCnsKCU9pZAkJCWhlYXBJZDsKCVJlbGF0aW9u CXVzZXJIZWFwUmVsYXRpb247CglSZWxhdGlvbgl1c2VySW5kZXhSZWxhdGlvbjsKCVJlbGF0 aW9uCWluZGV4UmVsYXRpb247CglIZWFwVHVwbGUJdHVwbGU7Cglib29sCQloYXNleHByczsK CUxvY2tSZWxJZAloZWFwcmVsaWQsCgkJCQlpbmRleHJlbGlkOwoJTE9DS1RBRwkJaGVhcGxv Y2t0YWc7CglMT0NLTU9ERQlsb2NrbW9kZTsKCgkvKgoJICogQSB0ZW1wb3JhcnkgcmVsYXRp b24gdXNlcyBhIG5vbi1jb25jdXJyZW50IERST1AuICBPdGhlciBiYWNrZW5kcyBjYW4ndAoJ ICogYWNjZXNzIGEgdGVtcG9yYXJ5IHJlbGF0aW9uLCBzbyB0aGVyZSdzIG5vIGhhcm0gaW4g Z3JhYmJpbmcgYSBzdHJvbmdlcgoJICogbG9jayAoc2VlIGNvbW1lbnRzIGluIFJlbW92ZVJl bGF0aW9ucyksIGFuZCBhIG5vbi1jb25jdXJyZW50IERST1AgaXMKCSAqIG1vcmUgZWZmaWNp ZW50LgoJICovCglBc3NlcnQoZ2V0X3JlbF9wZXJzaXN0ZW5jZShpbmRleElkKSAhPSBSRUxQ RVJTSVNURU5DRV9URU1QIHx8CgkJICAgKCFjb25jdXJyZW50ICYmICFjb25jdXJyZW50X2xv Y2tfbW9kZSkpOwoKCS8qCgkgKiBUbyBkcm9wIGFuIGluZGV4IHNhZmVseSwgd2UgbXVzdCBn cmFiIGV4Y2x1c2l2ZSBsb2NrIG9uIGl0cyBwYXJlbnQKCSAqIHRhYmxlLiAgRXhjbHVzaXZl IGxvY2sgb24gdGhlIGluZGV4IGFsb25lIGlzIGluc3VmZmljaWVudCBiZWNhdXNlCgkgKiBh bm90aGVyIGJhY2tlbmQgbWlnaHQgYmUgYWJvdXQgdG8gZXhlY3V0ZSBhIHF1ZXJ5IG9uIHRo ZSBwYXJlbnQgdGFibGUuCgkgKiBJZiBpdCByZWxpZXMgb24gYSBwcmV2aW91c2x5IGNhY2hl ZCBsaXN0IG9mIGluZGV4IE9JRHMsIHRoZW4gaXQgY291bGQKCSAqIGF0dGVtcHQgdG8gYWNj ZXNzIHRoZSBqdXN0LWRyb3BwZWQgaW5kZXguICBXZSBtdXN0IHRoZXJlZm9yZSB0YWtlIGEK CSAqIHRhYmxlIGxvY2sgc3Ryb25nIGVub3VnaCB0byBwcmV2ZW50IGFsbCBxdWVyaWVzIG9u IHRoZSB0YWJsZSBmcm9tCgkgKiBwcm9jZWVkaW5nIHVudGlsIHdlIGNvbW1pdCBhbmQgc2Vu ZCBvdXQgYSBzaGFyZWQtY2FjaGUtaW52YWwgbm90aWNlCgkgKiB0aGF0IHdpbGwgbWFrZSB0 aGVtIHVwZGF0ZSB0aGVpciBpbmRleCBsaXN0cy4KCSAqCgkgKiBJbiB0aGUgY29uY3VycmVu dCBjYXNlIHdlIGF2b2lkIHRoaXMgcmVxdWlyZW1lbnQgYnkgZGlzYWJsaW5nIGluZGV4IHVz ZQoJICogaW4gbXVsdGlwbGUgc3RlcHMgYW5kIHdhaXRpbmcgb3V0IGFueSB0cmFuc2FjdGlv bnMgdGhhdCBtaWdodCBiZSB1c2luZwoJICogdGhlIGluZGV4LCBzbyB3ZSBkb24ndCBuZWVk IGV4Y2x1c2l2ZSBsb2NrIG9uIHRoZSBwYXJlbnQgdGFibGUuIEluc3RlYWQKCSAqIHdlIHRh a2UgU2hhcmVVcGRhdGVFeGNsdXNpdmVMb2NrLCB0byBlbnN1cmUgdGhhdCB0d28gc2Vzc2lv bnMgYXJlbid0CgkgKiBkb2luZyBDUkVBVEUvRFJPUCBJTkRFWCBDT05DVVJSRU5UTFkgb24g dGhlIHNhbWUgaW5kZXguICAoV2Ugd2lsbCBnZXQKCSAqIEFjY2Vzc0V4Y2x1c2l2ZUxvY2sg b24gdGhlIGluZGV4IGJlbG93LCBvbmNlIHdlJ3JlIHN1cmUgbm9ib2R5IGVsc2UgaXMKCSAq IHVzaW5nIGl0LikKCSAqLwoJaGVhcElkID0gSW5kZXhHZXRSZWxhdGlvbihpbmRleElkLCBm YWxzZSk7Cglsb2NrbW9kZSA9IChjb25jdXJyZW50IHx8IGNvbmN1cnJlbnRfbG9ja19tb2Rl KSA/IFNoYXJlVXBkYXRlRXhjbHVzaXZlTG9jayA6IEFjY2Vzc0V4Y2x1c2l2ZUxvY2s7Cgl1 c2VySGVhcFJlbGF0aW9uID0gdGFibGVfb3BlbihoZWFwSWQsIGxvY2ttb2RlKTsKCXVzZXJJ bmRleFJlbGF0aW9uID0gaW5kZXhfb3BlbihpbmRleElkLCBsb2NrbW9kZSk7CgoJLyoKCSAq IFdlIG1pZ2h0IHN0aWxsIGhhdmUgb3BlbiBxdWVyaWVzIHVzaW5nIGl0IGluIG91ciBvd24g c2Vzc2lvbiwgd2hpY2ggdGhlCgkgKiBhYm92ZSBsb2NraW5nIHdvbid0IHByZXZlbnQsIHNv IHRlc3QgZXhwbGljaXRseS4KCSAqLwoJQ2hlY2tUYWJsZU5vdEluVXNlKHVzZXJJbmRleFJl bGF0aW9uLCAiRFJPUCBJTkRFWCIpOwoKCS8qCgkgKiBEcm9wIEluZGV4IENvbmN1cnJlbnRs eSBpcyBtb3JlIG9yIGxlc3MgdGhlIHJldmVyc2UgcHJvY2VzcyBvZiBDcmVhdGUKCSAqIElu ZGV4IENvbmN1cnJlbnRseS4KCSAqCgkgKiBGaXJzdCB3ZSB1bnNldCBpbmRpc3ZhbGlkIHNv IHF1ZXJpZXMgc3RhcnRpbmcgYWZ0ZXJ3YXJkcyBkb24ndCB1c2UgdGhlCgkgKiBpbmRleCB0 byBhbnN3ZXIgcXVlcmllcyBhbnltb3JlLiAgV2UgaGF2ZSB0byBrZWVwIGluZGlzcmVhZHkg PSB0cnVlIHNvCgkgKiB0cmFuc2FjdGlvbnMgdGhhdCBhcmUgc3RpbGwgc2Nhbm5pbmcgdGhl IGluZGV4IGNhbiBjb250aW51ZSB0byBzZWUKCSAqIHZhbGlkIGluZGV4IGNvbnRlbnRzLiAg Rm9yIGluc3RhbmNlLCBpZiB0aGV5IGFyZSB1c2luZyBSRUFEIENPTU1JVFRFRAoJICogbW9k ZSwgYW5kIGFub3RoZXIgdHJhbnNhY3Rpb24gbWFrZXMgY2hhbmdlcyBhbmQgY29tbWl0cywg dGhleSBuZWVkIHRvCgkgKiBzZWUgdGhvc2UgbmV3IHR1cGxlcyBpbiB0aGUgaW5kZXguCgkg KgoJICogQWZ0ZXIgYWxsIHRyYW5zYWN0aW9ucyB0aGF0IGNvdWxkIHBvc3NpYmx5IGhhdmUg dXNlZCB0aGUgaW5kZXggZm9yCgkgKiBxdWVyaWVzIGVuZCwgd2UgY2FuIHVuc2V0IGluZGlz cmVhZHkgYW5kIGluZGlzbGl2ZSwgdGhlbiB3YWl0IHRpbGwKCSAqIG5vYm9keSBjb3VsZCBi ZSB0b3VjaGluZyBpdCBhbnltb3JlLiAgKE5vdGU6IHdlIG5lZWQgaW5kaXNsaXZlIGJlY2F1 c2UKCSAqIHRoaXMgc3RhdGUgbXVzdCBiZSBkaXN0aW5jdCBmcm9tIHRoZSBpbml0aWFsIHN0 YXRlIGR1cmluZyBDUkVBVEUgSU5ERVgKCSAqIENPTkNVUlJFTlRMWSwgd2hpY2ggaGFzIGlu ZGlzbGl2ZSB0cnVlIHdoaWxlIGluZGlzcmVhZHkgYW5kIGluZGlzdmFsaWQKCSAqIGFyZSBm YWxzZS4gIFRoYXQncyBiZWNhdXNlIGluIHRoYXQgc3RhdGUsIHRyYW5zYWN0aW9ucyBtdXN0 IGV4YW1pbmUgdGhlCgkgKiBpbmRleCBmb3IgSE9ULXNhZmV0eSBkZWNpc2lvbnMsIHdoaWxl IGluIHRoaXMgc3RhdGUgd2UgZG9uJ3Qgd2FudCB0aGVtCgkgKiB0byBvcGVuIGl0IGF0IGFs bC4pCgkgKgoJICogU2luY2UgYWxsIHByZWRpY2F0ZSBsb2NrcyBvbiB0aGUgaW5kZXggYXJl IGFib3V0IHRvIGJlIG1hZGUgaW52YWxpZCwgd2UKCSAqIG11c3QgcHJvbW90ZSB0aGVtIHRv IHByZWRpY2F0ZSBsb2NrcyBvbiB0aGUgaGVhcC4gIEluIHRoZQoJICogbm9uLWNvbmN1cnJl bnQgY2FzZSB3ZSBjYW4ganVzdCBkbyB0aGF0IG5vdy4gIEluIHRoZSBjb25jdXJyZW50IGNh c2UKCSAqIGl0J3MgYSBiaXQgdHJpY2tpZXIuICBUaGUgcHJlZGljYXRlIGxvY2tzIG11c3Qg YmUgbW92ZWQgd2hlbiB0aGVyZSBhcmUKCSAqIG5vIGluZGV4IHNjYW5zIGluIHByb2dyZXNz IG9uIHRoZSBpbmRleCBhbmQgbm8gbW9yZSBjYW4gc3Vic2VxdWVudGx5CgkgKiBzdGFydCwg c28gdGhhdCBubyBuZXcgcHJlZGljYXRlIGxvY2tzIGNhbiBiZSBtYWRlIG9uIHRoZSBpbmRl eC4gIEFsc28sCgkgKiB0aGV5IG11c3QgYmUgbW92ZWQgYmVmb3JlIGhlYXAgaW5zZXJ0cyBz dG9wIG1haW50YWluaW5nIHRoZSBpbmRleCwgZWxzZQoJICogdGhlIGNvbmZsaWN0IHdpdGgg dGhlIHByZWRpY2F0ZSBsb2NrIG9uIHRoZSBpbmRleCBnYXAgY291bGQgYmUgbWlzc2VkCgkg KiBiZWZvcmUgdGhlIGxvY2sgb24gdGhlIGhlYXAgcmVsYXRpb24gaXMgaW4gcGxhY2UgdG8g ZGV0ZWN0IGEgY29uZmxpY3QKCSAqIGJhc2VkIG9uIHRoZSBoZWFwIHR1cGxlIGluc2VydC4K CSAqLwoJaWYgKGNvbmN1cnJlbnQpCgl7CgkJLyoKCQkgKiBXZSBtdXN0IGNvbW1pdCBvdXIg dHJhbnNhY3Rpb24gaW4gb3JkZXIgdG8gbWFrZSB0aGUgZmlyc3QgcGdfaW5kZXgKCQkgKiBz dGF0ZSB1cGRhdGUgdmlzaWJsZSB0byBvdGhlciBzZXNzaW9ucy4gIElmIHRoZSBEUk9QIG1h Y2hpbmVyeSBoYXMKCQkgKiBhbHJlYWR5IHBlcmZvcm1lZCBhbnkgb3RoZXIgYWN0aW9ucyAo cmVtb3ZhbCBvZiBvdGhlciBvYmplY3RzLAoJCSAqIHBnX2RlcGVuZCBlbnRyaWVzLCBldGMp LCB0aGUgY29tbWl0IHdvdWxkIG1ha2UgdGhvc2UgYWN0aW9ucwoJCSAqIHBlcm1hbmVudCwg d2hpY2ggd291bGQgbGVhdmUgdXMgd2l0aCBpbmNvbnNpc3RlbnQgY2F0YWxvZyBzdGF0ZSBp ZgoJCSAqIHdlIGZhaWwgcGFydHdheSB0aHJvdWdoIHRoZSBmb2xsb3dpbmcgc2VxdWVuY2Uu ICBTaW5jZSBEUk9QIElOREVYCgkJICogQ09OQ1VSUkVOVExZIGlzIHJlc3RyaWN0ZWQgdG8g ZHJvcHBpbmcganVzdCBvbmUgaW5kZXggdGhhdCBoYXMgbm8KCQkgKiBkZXBlbmRlbmNpZXMs IHdlIHNob3VsZCBnZXQgaGVyZSBiZWZvcmUgYW55dGhpbmcncyBiZWVuIGRvbmUgLS0tCgkJ ICogYnV0IGxldCdzIGNoZWNrIHRoYXQgdG8gYmUgc3VyZS4gIFdlIGNhbiB2ZXJpZnkgdGhh dCB0aGUgY3VycmVudAoJCSAqIHRyYW5zYWN0aW9uIGhhcyBub3QgZXhlY3V0ZWQgYW55IHRy YW5zYWN0aW9uYWwgdXBkYXRlcyBieSBjaGVja2luZwoJCSAqIHRoYXQgbm8gWElEIGhhcyBi ZWVuIGFzc2lnbmVkLgoJCSAqLwoJCWlmIChHZXRUb3BUcmFuc2FjdGlvbklkSWZBbnkoKSAh PSBJbnZhbGlkVHJhbnNhY3Rpb25JZCkKCQkJZXJlcG9ydChFUlJPUiwKCQkJCQkoZXJyY29k ZShFUlJDT0RFX0ZFQVRVUkVfTk9UX1NVUFBPUlRFRCksCgkJCQkJIGVycm1zZygiRFJPUCBJ TkRFWCBDT05DVVJSRU5UTFkgbXVzdCBiZSBmaXJzdCBhY3Rpb24gaW4gdHJhbnNhY3Rpb24i KSkpOwoKCQkvKgoJCSAqIE1hcmsgaW5kZXggaW52YWxpZCBieSB1cGRhdGluZyBpdHMgcGdf aW5kZXggZW50cnkKCQkgKi8KCQlpbmRleF9zZXRfc3RhdGVfZmxhZ3MoaW5kZXhJZCwgSU5E RVhfRFJPUF9DTEVBUl9WQUxJRCk7CgoJCS8qCgkJICogSW52YWxpZGF0ZSB0aGUgcmVsY2Fj aGUgZm9yIHRoZSB0YWJsZSwgc28gdGhhdCBhZnRlciB0aGlzIGNvbW1pdAoJCSAqIGFsbCBz ZXNzaW9ucyB3aWxsIHJlZnJlc2ggYW55IGNhY2hlZCBwbGFucyB0aGF0IG1pZ2h0IHJlZmVy ZW5jZSB0aGUKCQkgKiBpbmRleC4KCQkgKi8KCQlDYWNoZUludmFsaWRhdGVSZWxjYWNoZSh1 c2VySGVhcFJlbGF0aW9uKTsKCgkJLyogc2F2ZSBsb2NrcmVsaWQgYW5kIGxvY2t0YWcgZm9y IGJlbG93LCB0aGVuIGNsb3NlIGJ1dCBrZWVwIGxvY2tzICovCgkJaGVhcHJlbGlkID0gdXNl ckhlYXBSZWxhdGlvbi0+cmRfbG9ja0luZm8ubG9ja1JlbElkOwoJCVNFVF9MT0NLVEFHX1JF TEFUSU9OKGhlYXBsb2NrdGFnLCBoZWFwcmVsaWQuZGJJZCwgaGVhcHJlbGlkLnJlbElkKTsK CQlpbmRleHJlbGlkID0gdXNlckluZGV4UmVsYXRpb24tPnJkX2xvY2tJbmZvLmxvY2tSZWxJ ZDsKCgkJdGFibGVfY2xvc2UodXNlckhlYXBSZWxhdGlvbiwgTm9Mb2NrKTsKCQlpbmRleF9j bG9zZSh1c2VySW5kZXhSZWxhdGlvbiwgTm9Mb2NrKTsKCgkJLyoKCQkgKiBXZSBtdXN0IGNv bW1pdCBvdXIgY3VycmVudCB0cmFuc2FjdGlvbiBzbyB0aGF0IHRoZSBpbmRpc3ZhbGlkCgkJ ICogdXBkYXRlIGJlY29tZXMgdmlzaWJsZSB0byBvdGhlciB0cmFuc2FjdGlvbnM7IHRoZW4g c3RhcnQgYW5vdGhlci4KCQkgKiBOb3RlIHRoYXQgYW55IHByZXZpb3VzbHktYnVpbHQgZGF0 YSBzdHJ1Y3R1cmVzIGFyZSBsb3N0IGluIHRoZQoJCSAqIGNvbW1pdC4gIFRoZSBvbmx5IGRh dGEgd2Uga2VlcCBwYXN0IGhlcmUgYXJlIHRoZSByZWxhdGlvbiBJRHMuCgkJICoKCQkgKiBC ZWZvcmUgY29tbWl0dGluZywgZ2V0IGEgc2Vzc2lvbi1sZXZlbCBsb2NrIG9uIHRoZSB0YWJs ZSwgdG8gZW5zdXJlCgkJICogdGhhdCBuZWl0aGVyIGl0IG5vciB0aGUgaW5kZXggY2FuIGJl IGRyb3BwZWQgYmVmb3JlIHdlIGZpbmlzaC4gVGhpcwoJCSAqIGNhbm5vdCBibG9jaywgZXZl biBpZiBzb21lb25lIGVsc2UgaXMgd2FpdGluZyBmb3IgYWNjZXNzLCBiZWNhdXNlCgkJICog d2UgYWxyZWFkeSBoYXZlIHRoZSBzYW1lIGxvY2sgd2l0aGluIG91ciB0cmFuc2FjdGlvbi4K CQkgKi8KCQlMb2NrUmVsYXRpb25JZEZvclNlc3Npb24oJmhlYXByZWxpZCwgU2hhcmVVcGRh dGVFeGNsdXNpdmVMb2NrKTsKCQlMb2NrUmVsYXRpb25JZEZvclNlc3Npb24oJmluZGV4cmVs aWQsIFNoYXJlVXBkYXRlRXhjbHVzaXZlTG9jayk7CgoJCVBvcEFjdGl2ZVNuYXBzaG90KCk7 CgkJQ29tbWl0VHJhbnNhY3Rpb25Db21tYW5kKCk7CgkJU3RhcnRUcmFuc2FjdGlvbkNvbW1h bmQoKTsKCgkJLyoKCQkgKiBOb3cgd2UgbXVzdCB3YWl0IHVudGlsIG5vIHJ1bm5pbmcgdHJh bnNhY3Rpb24gY291bGQgYmUgdXNpbmcgdGhlCgkJICogaW5kZXggZm9yIGEgcXVlcnkuICBV c2UgQWNjZXNzRXhjbHVzaXZlTG9jayBoZXJlIHRvIGNoZWNrIGZvcgoJCSAqIHJ1bm5pbmcg dHJhbnNhY3Rpb25zIHRoYXQgaG9sZCBsb2NrcyBvZiBhbnkga2luZCBvbiB0aGUgdGFibGUu IE5vdGUKCQkgKiB3ZSBkbyBub3QgbmVlZCB0byB3b3JyeSBhYm91dCB4YWN0cyB0aGF0IG9w ZW4gdGhlIHRhYmxlIGZvciByZWFkaW5nCgkJICogYWZ0ZXIgdGhpcyBwb2ludDsgdGhleSB3 aWxsIHNlZSB0aGUgaW5kZXggYXMgaW52YWxpZCB3aGVuIHRoZXkgb3BlbgoJCSAqIHRoZSBy ZWxhdGlvbi4KCQkgKgoJCSAqIE5vdGU6IHRoZSByZWFzb24gd2UgdXNlIGFjdHVhbCBsb2Nr IGFjcXVpc2l0aW9uIGhlcmUsIHJhdGhlciB0aGFuCgkJICoganVzdCBjaGVja2luZyB0aGUg UHJvY0FycmF5IGFuZCBzbGVlcGluZywgaXMgdGhhdCBkZWFkbG9jayBpcwoJCSAqIHBvc3Np YmxlIGlmIG9uZSBvZiB0aGUgdHJhbnNhY3Rpb25zIGluIHF1ZXN0aW9uIGlzIGJsb2NrZWQg dHJ5aW5nCgkJICogdG8gYWNxdWlyZSBhbiBleGNsdXNpdmUgbG9jayBvbiBvdXIgdGFibGUu ICBUaGUgbG9jayBjb2RlIHdpbGwKCQkgKiBkZXRlY3QgZGVhZGxvY2sgYW5kIGVycm9yIG91 dCBwcm9wZXJseS4KCQkgKgoJCSAqIE5vdGU6IHdlIHJlcG9ydCBwcm9ncmVzcyB0aHJvdWdo IFdhaXRGb3JMb2NrZXJzKCkgdW5jb25kaXRpb25hbGx5CgkJICogaGVyZSwgZXZlbiB0aG91 Z2ggaXQgd2lsbCBvbmx5IGJlIHVzZWQgd2hlbiB3ZSdyZSBjYWxsZWQgYnkgUkVJTkRFWAoJ CSAqIENPTkNVUlJFTlRMWSBhbmQgbm90IHdoZW4gY2FsbGVkIGJ5IERST1AgSU5ERVggQ09O Q1VSUkVOVExZLgoJCSAqLwoJCVdhaXRGb3JMb2NrZXJzKGhlYXBsb2NrdGFnLCBBY2Nlc3NF eGNsdXNpdmVMb2NrLCB0cnVlKTsKCgkJLyoKCQkgKiBVcGRhdGluZyBwZ19pbmRleCBtaWdo dCBpbnZvbHZlIFRPQVNUIHRhYmxlIGFjY2Vzcywgc28gZW5zdXJlIHdlCgkJICogaGF2ZSBh IHZhbGlkIHNuYXBzaG90LgoJCSAqLwoJCVB1c2hBY3RpdmVTbmFwc2hvdChHZXRUcmFuc2Fj dGlvblNuYXBzaG90KCkpOwoKCQkvKiBGaW5pc2ggaW52YWxpZGF0aW9uIG9mIGluZGV4IGFu ZCBtYXJrIGl0IGFzIGRlYWQgKi8KCQlpbmRleF9jb25jdXJyZW50bHlfc2V0X2RlYWQoaGVh cElkLCBpbmRleElkKTsKCgkJUG9wQWN0aXZlU25hcHNob3QoKTsKCgkJLyoKCQkgKiBBZ2Fp biwgY29tbWl0IHRoZSB0cmFuc2FjdGlvbiB0byBtYWtlIHRoZSBwZ19pbmRleCB1cGRhdGUg dmlzaWJsZQoJCSAqIHRvIG90aGVyIHNlc3Npb25zLgoJCSAqLwoJCUNvbW1pdFRyYW5zYWN0 aW9uQ29tbWFuZCgpOwoJCVN0YXJ0VHJhbnNhY3Rpb25Db21tYW5kKCk7CgoJCS8qCgkJICog V2FpdCB0aWxsIGV2ZXJ5IHRyYW5zYWN0aW9uIHRoYXQgc2F3IHRoZSBvbGQgaW5kZXggc3Rh dGUgaGFzCgkJICogZmluaXNoZWQuICBTZWUgYWJvdmUgYWJvdXQgcHJvZ3Jlc3MgcmVwb3J0 aW5nLgoJCSAqLwoJCVdhaXRGb3JMb2NrZXJzKGhlYXBsb2NrdGFnLCBBY2Nlc3NFeGNsdXNp dmVMb2NrLCB0cnVlKTsKCgkJLyoKCQkgKiBSZS1vcGVuIHJlbGF0aW9ucyB0byBhbGxvdyB1 cyB0byBjb21wbGV0ZSBvdXIgYWN0aW9ucy4KCQkgKgoJCSAqIEF0IHRoaXMgcG9pbnQsIG5v dGhpbmcgc2hvdWxkIGJlIGFjY2Vzc2luZyB0aGUgaW5kZXgsIGJ1dCBsZXRzCgkJICogbGVh dmUgbm90aGluZyB0byBjaGFuY2UgYW5kIGdyYWIgQWNjZXNzRXhjbHVzaXZlTG9jayBvbiB0 aGUgaW5kZXgKCQkgKiBiZWZvcmUgdGhlIHBoeXNpY2FsIGRlbGV0aW9uLgoJCSAqLwoJCXVz ZXJIZWFwUmVsYXRpb24gPSB0YWJsZV9vcGVuKGhlYXBJZCwgU2hhcmVVcGRhdGVFeGNsdXNp dmVMb2NrKTsKCQl1c2VySW5kZXhSZWxhdGlvbiA9IGluZGV4X29wZW4oaW5kZXhJZCwgQWNj ZXNzRXhjbHVzaXZlTG9jayk7Cgl9CgllbHNlCgl7CgkJLyogTm90IGNvbmN1cnJlbnQsIHNv IGp1c3QgdHJhbnNmZXIgcHJlZGljYXRlIGxvY2tzIGFuZCB3ZSdyZSBnb29kICovCgkJVHJh bnNmZXJQcmVkaWNhdGVMb2Nrc1RvSGVhcFJlbGF0aW9uKHVzZXJJbmRleFJlbGF0aW9uKTsK CX0KCgkvKgoJICogU2NoZWR1bGUgcGh5c2ljYWwgcmVtb3ZhbCBvZiB0aGUgZmlsZXMgKGlm IGFueSkKCSAqLwoJaWYgKFJFTEtJTkRfSEFTX1NUT1JBR0UodXNlckluZGV4UmVsYXRpb24t PnJkX3JlbC0+cmVsa2luZCkpCgkJUmVsYXRpb25Ecm9wU3RvcmFnZSh1c2VySW5kZXhSZWxh dGlvbik7CgoJLyogZW5zdXJlIHRoYXQgc3RhdHMgYXJlIGRyb3BwZWQgaWYgdHJhbnNhY3Rp b24gY29tbWl0cyAqLwoJcGdzdGF0X2Ryb3BfcmVsYXRpb24odXNlckluZGV4UmVsYXRpb24p OwoKCS8qCgkgKiBDbG9zZSBhbmQgZmx1c2ggdGhlIGluZGV4J3MgcmVsY2FjaGUgZW50cnks IHRvIGVuc3VyZSByZWxjYWNoZSBkb2Vzbid0CgkgKiB0cnkgdG8gcmVidWlsZCBpdCB3aGls ZSB3ZSdyZSBkZWxldGluZyBjYXRhbG9nIGVudHJpZXMuIFdlIGtlZXAgdGhlCgkgKiBsb2Nr IHRob3VnaC4KCSAqLwoJaW5kZXhfY2xvc2UodXNlckluZGV4UmVsYXRpb24sIE5vTG9jayk7 CgoJUmVsYXRpb25Gb3JnZXRSZWxhdGlvbihpbmRleElkKTsKCgkvKgoJICogVXBkYXRpbmcg cGdfaW5kZXggbWlnaHQgaW52b2x2ZSBUT0FTVCB0YWJsZSBhY2Nlc3MsIHNvIGVuc3VyZSB3 ZSBoYXZlIGEKCSAqIHZhbGlkIHNuYXBzaG90LgoJICovCglQdXNoQWN0aXZlU25hcHNob3Qo R2V0VHJhbnNhY3Rpb25TbmFwc2hvdCgpKTsKCgkvKgoJICogZml4IElOREVYIHJlbGF0aW9u LCBhbmQgY2hlY2sgZm9yIGV4cHJlc3Npb25hbCBpbmRleAoJICovCglpbmRleFJlbGF0aW9u ID0gdGFibGVfb3BlbihJbmRleFJlbGF0aW9uSWQsIFJvd0V4Y2x1c2l2ZUxvY2spOwoKCXR1 cGxlID0gU2VhcmNoU3lzQ2FjaGUxKElOREVYUkVMSUQsIE9iamVjdElkR2V0RGF0dW0oaW5k ZXhJZCkpOwoJaWYgKCFIZWFwVHVwbGVJc1ZhbGlkKHR1cGxlKSkKCQllbG9nKEVSUk9SLCAi Y2FjaGUgbG9va3VwIGZhaWxlZCBmb3IgaW5kZXggJXUiLCBpbmRleElkKTsKCgloYXNleHBy cyA9ICFoZWFwX2F0dGlzbnVsbCh0dXBsZSwgQW51bV9wZ19pbmRleF9pbmRleHBycywKCQkJ CQkJCSAgIFJlbGF0aW9uR2V0RGVzY3IoaW5kZXhSZWxhdGlvbikpOwoKCUNhdGFsb2dUdXBs ZURlbGV0ZShpbmRleFJlbGF0aW9uLCAmdHVwbGUtPnRfc2VsZik7CgoJUmVsZWFzZVN5c0Nh Y2hlKHR1cGxlKTsKCXRhYmxlX2Nsb3NlKGluZGV4UmVsYXRpb24sIFJvd0V4Y2x1c2l2ZUxv Y2spOwoKCVBvcEFjdGl2ZVNuYXBzaG90KCk7CgoJLyoKCSAqIGlmIGl0IGhhcyBhbnkgZXhw cmVzc2lvbiBjb2x1bW5zLCB3ZSBtaWdodCBoYXZlIHN0b3JlZCBzdGF0aXN0aWNzIGFib3V0 CgkgKiB0aGVtLgoJICovCglpZiAoaGFzZXhwcnMpCgkJUmVtb3ZlU3RhdGlzdGljcyhpbmRl eElkLCAwKTsKCgkvKgoJICogZml4IEFUVFJJQlVURSByZWxhdGlvbgoJICovCglEZWxldGVB dHRyaWJ1dGVUdXBsZXMoaW5kZXhJZCk7CgoJLyoKCSAqIGZpeCBSRUxBVElPTiByZWxhdGlv bgoJICovCglEZWxldGVSZWxhdGlvblR1cGxlKGluZGV4SWQpOwoKCS8qCgkgKiBmaXggSU5I RVJJVFMgcmVsYXRpb24KCSAqLwoJRGVsZXRlSW5oZXJpdHNUdXBsZShpbmRleElkLCBJbnZh bGlkT2lkLCBmYWxzZSwgTlVMTCk7CgoJLyoKCSAqIFdlIGFyZSBwcmVzZW50bHkgdG9vIGxh enkgdG8gYXR0ZW1wdCB0byBjb21wdXRlIHRoZSBuZXcgY29ycmVjdCB2YWx1ZQoJICogb2Yg cmVsaGFzaW5kZXggKHRoZSBuZXh0IFZBQ1VVTSB3aWxsIGZpeCBpdCBpZiBuZWNlc3Nhcnkp LiBTbyB0aGVyZSBpcwoJICogbm8gbmVlZCB0byB1cGRhdGUgdGhlIHBnX2NsYXNzIHR1cGxl IGZvciB0aGUgb3duaW5nIHJlbGF0aW9uLiBCdXQgd2UKCSAqIG11c3Qgc2VuZCBvdXQgYSBz aGFyZWQtY2FjaGUtaW52YWwgbm90aWNlIG9uIHRoZSBvd25pbmcgcmVsYXRpb24gdG8KCSAq IGVuc3VyZSBvdGhlciBiYWNrZW5kcyB1cGRhdGUgdGhlaXIgcmVsY2FjaGUgbGlzdHMgb2Yg aW5kZXhlcy4gIChJbiB0aGUKCSAqIGNvbmN1cnJlbnQgY2FzZSwgdGhpcyBpcyByZWR1bmRh bnQgYnV0IGhhcm1sZXNzLikKCSAqLwoJQ2FjaGVJbnZhbGlkYXRlUmVsY2FjaGUodXNlckhl YXBSZWxhdGlvbik7CgoJLyoKCSAqIENsb3NlIG93bmluZyByZWwsIGJ1dCBrZWVwIGxvY2sK CSAqLwoJdGFibGVfY2xvc2UodXNlckhlYXBSZWxhdGlvbiwgTm9Mb2NrKTsKCgkvKgoJICog UmVsZWFzZSB0aGUgc2Vzc2lvbiBsb2NrcyBiZWZvcmUgd2UgZ28uCgkgKi8KCWlmIChjb25j dXJyZW50KQoJewoJCVVubG9ja1JlbGF0aW9uSWRGb3JTZXNzaW9uKCZoZWFwcmVsaWQsIFNo YXJlVXBkYXRlRXhjbHVzaXZlTG9jayk7CgkJVW5sb2NrUmVsYXRpb25JZEZvclNlc3Npb24o JmluZGV4cmVsaWQsIFNoYXJlVXBkYXRlRXhjbHVzaXZlTG9jayk7Cgl9Cn0KCi8qIC0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0KICoJCQkJCQlpbmRleF9idWlsZCBzdXBwb3J0CiAqIC0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICovCgov KiAtLS0tLS0tLS0tLS0tLS0tCiAqCQlCdWlsZEluZGV4SW5mbwogKgkJCUNvbnN0cnVjdCBh biBJbmRleEluZm8gcmVjb3JkIGZvciBhbiBvcGVuIGluZGV4CiAqCiAqIEluZGV4SW5mbyBz dG9yZXMgdGhlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBpbmRleCB0aGF0J3MgbmVlZGVkIGJ5 CiAqIEZvcm1JbmRleERhdHVtLCB3aGljaCBpcyB1c2VkIGZvciBib3RoIGluZGV4X2J1aWxk KCkgYW5kIGxhdGVyIGluc2VydGlvbgogKiBvZiBpbmRpdmlkdWFsIGluZGV4IHR1cGxlcy4g IE5vcm1hbGx5IHdlIGJ1aWxkIGFuIEluZGV4SW5mbyBmb3IgYW4gaW5kZXgKICoganVzdCBv bmNlIHBlciBjb21tYW5kLCBhbmQgdGhlbiB1c2UgaXQgZm9yIChwb3RlbnRpYWxseSkgbWFu eSB0dXBsZXMuCiAqIC0tLS0tLS0tLS0tLS0tLS0KICovCkluZGV4SW5mbyAqCkJ1aWxkSW5k ZXhJbmZvKFJlbGF0aW9uIGluZGV4KQp7CglJbmRleEluZm8gICppaTsKCUZvcm1fcGdfaW5k ZXggaW5kZXhTdHJ1Y3QgPSBpbmRleC0+cmRfaW5kZXg7CglpbnQJCQlpOwoJaW50CQkJbnVt QXR0czsKCgkvKiBjaGVjayB0aGUgbnVtYmVyIG9mIGtleXMsIGFuZCBjb3B5IGF0dHIgbnVt YmVycyBpbnRvIHRoZSBJbmRleEluZm8gKi8KCW51bUF0dHMgPSBpbmRleFN0cnVjdC0+aW5k bmF0dHM7CglpZiAobnVtQXR0cyA8IDEgfHwgbnVtQXR0cyA+IElOREVYX01BWF9LRVlTKQoJ CWVsb2coRVJST1IsICJpbnZhbGlkIGluZG5hdHRzICVkIGZvciBpbmRleCAldSIsCgkJCSBu dW1BdHRzLCBSZWxhdGlvbkdldFJlbGlkKGluZGV4KSk7CgoJLyoKCSAqIENyZWF0ZSB0aGUg bm9kZSwgZmV0Y2hpbmcgYW55IGV4cHJlc3Npb25zIG5lZWRlZCBmb3IgZXhwcmVzc2lvbmFs CgkgKiBpbmRleGVzIGFuZCBpbmRleCBwcmVkaWNhdGUgaWYgYW55LgoJICovCglpaSA9IG1h a2VJbmRleEluZm8oaW5kZXhTdHJ1Y3QtPmluZG5hdHRzLAoJCQkJCSAgIGluZGV4U3RydWN0 LT5pbmRua2V5YXR0cywKCQkJCQkgICBpbmRleC0+cmRfcmVsLT5yZWxhbSwKCQkJCQkgICBS ZWxhdGlvbkdldEluZGV4RXhwcmVzc2lvbnMoaW5kZXgpLAoJCQkJCSAgIFJlbGF0aW9uR2V0 SW5kZXhQcmVkaWNhdGUoaW5kZXgpLAoJCQkJCSAgIGluZGV4U3RydWN0LT5pbmRpc3VuaXF1 ZSwKCQkJCQkgICBpbmRleFN0cnVjdC0+aW5kbnVsbHNub3RkaXN0aW5jdCwKCQkJCQkgICBp bmRleFN0cnVjdC0+aW5kaXNyZWFkeSwKCQkJCQkgICBmYWxzZSwKCQkJCQkgICBpbmRleC0+ cmRfaW5kYW0tPmFtc3VtbWFyaXppbmcsCgkJCQkJICAgaW5kZXhTdHJ1Y3QtPmluZGlzZXhj bHVzaW9uICYmIGluZGV4U3RydWN0LT5pbmRpc3VuaXF1ZSk7CglpaS0+aWlfRXhwcmVzc2lv bnNFeHBhbmQgPSAoTGlzdCAqKVJlbGF0aW9uR2V0SW5kZXhFeHByZXNzaW9uc0V4cGFuZChp bmRleCk7CglpaS0+aWlfUHJlZGljYXRlRXhwYW5kID0gKExpc3QgKilSZWxhdGlvbkdldElu ZGV4UHJlZGljYXRlRXhwYW5kKGluZGV4KTsKCgkvKiBmaWxsIGluIGF0dHJpYnV0ZSBudW1i ZXJzICovCglmb3IgKGkgPSAwOyBpIDwgbnVtQXR0czsgaSsrKQoJCWlpLT5paV9JbmRleEF0 dHJOdW1iZXJzW2ldID0gaW5kZXhTdHJ1Y3QtPmluZGtleS52YWx1ZXNbaV07CgoJLyogZmV0 Y2ggZXhjbHVzaW9uIGNvbnN0cmFpbnQgaW5mbyBpZiBhbnkgKi8KCWlmIChpbmRleFN0cnVj dC0+aW5kaXNleGNsdXNpb24pCgl7CgkJUmVsYXRpb25HZXRFeGNsdXNpb25JbmZvKGluZGV4 LAoJCQkJCQkJCSAmaWktPmlpX0V4Y2x1c2lvbk9wcywKCQkJCQkJCQkgJmlpLT5paV9FeGNs dXNpb25Qcm9jcywKCQkJCQkJCQkgJmlpLT5paV9FeGNsdXNpb25TdHJhdHMpOwoJfQoKCXJl dHVybiBpaTsKfQoKLyogLS0tLS0tLS0tLS0tLS0tLQogKgkJQnVpbGREdW1teUluZGV4SW5m bwogKgkJCUNvbnN0cnVjdCBhIGR1bW15IEluZGV4SW5mbyByZWNvcmQgZm9yIGFuIG9wZW4g aW5kZXgKICoKICogVGhpcyBkaWZmZXJzIGZyb20gdGhlIHJlYWwgQnVpbGRJbmRleEluZm8g aW4gdGhhdCBpdCB3aWxsIG5ldmVyIHJ1biBhbnkKICogdXNlci1kZWZpbmVkIGNvZGUgdGhh dCBtaWdodCBleGlzdCBpbiBpbmRleCBleHByZXNzaW9ucyBvciBwcmVkaWNhdGVzLgogKiBJ bnN0ZWFkIG9mIHRoZSByZWFsIGluZGV4IGV4cHJlc3Npb25zLCB3ZSByZXR1cm4gbnVsbCBj b25zdGFudHMgdGhhdCBoYXZlCiAqIHRoZSByaWdodCB0eXBlcy90eXBtb2RzL2NvbGxhdGlv bnMuICBQcmVkaWNhdGVzIGFuZCBleGNsdXNpb24gY2xhdXNlcyBhcmUKICoganVzdCBpZ25v cmVkLiAgVGhpcyBpcyBzdWZmaWNpZW50IGZvciB0aGUgcHVycG9zZSBvZiB0cnVuY2F0aW5n IGFuIGluZGV4LAogKiBzaW5jZSB3ZSB3aWxsIG5vdCBuZWVkIHRvIGFjdHVhbGx5IGV2YWx1 YXRlIHRoZSBleHByZXNzaW9ucyBvciBwcmVkaWNhdGVzOwogKiB0aGUgb25seSB0aGluZyB0 aGF0J3MgbGlrZWx5IHRvIGJlIGRvbmUgd2l0aCB0aGUgZGF0YSBpcyBjb25zdHJ1Y3Rpb24g b2YKICogYSB0dXBkZXNjIGRlc2NyaWJpbmcgdGhlIGluZGV4J3Mgcm93dHlwZS4KICogLS0t LS0tLS0tLS0tLS0tLQogKi8KSW5kZXhJbmZvICoKQnVpbGREdW1teUluZGV4SW5mbyhSZWxh dGlvbiBpbmRleCkKewoJSW5kZXhJbmZvICAqaWk7CglGb3JtX3BnX2luZGV4IGluZGV4U3Ry dWN0ID0gaW5kZXgtPnJkX2luZGV4OwoJaW50CQkJaTsKCWludAkJCW51bUF0dHM7CgoJLyog Y2hlY2sgdGhlIG51bWJlciBvZiBrZXlzLCBhbmQgY29weSBhdHRyIG51bWJlcnMgaW50byB0 aGUgSW5kZXhJbmZvICovCgludW1BdHRzID0gaW5kZXhTdHJ1Y3QtPmluZG5hdHRzOwoJaWYg KG51bUF0dHMgPCAxIHx8IG51bUF0dHMgPiBJTkRFWF9NQVhfS0VZUykKCQllbG9nKEVSUk9S LCAiaW52YWxpZCBpbmRuYXR0cyAlZCBmb3IgaW5kZXggJXUiLAoJCQkgbnVtQXR0cywgUmVs YXRpb25HZXRSZWxpZChpbmRleCkpOwoKCS8qCgkgKiBDcmVhdGUgdGhlIG5vZGUsIHVzaW5n IGR1bW15IGluZGV4IGV4cHJlc3Npb25zLCBhbmQgcHJldGVuZGluZyB0aGVyZSBpcwoJICog bm8gcHJlZGljYXRlLgoJICovCglpaSA9IG1ha2VJbmRleEluZm8oaW5kZXhTdHJ1Y3QtPmlu ZG5hdHRzLAoJCQkJCSAgIGluZGV4U3RydWN0LT5pbmRua2V5YXR0cywKCQkJCQkgICBpbmRl eC0+cmRfcmVsLT5yZWxhbSwKCQkJCQkgICBSZWxhdGlvbkdldER1bW15SW5kZXhFeHByZXNz aW9ucyhpbmRleCksCgkJCQkJICAgTklMLAoJCQkJCSAgIGluZGV4U3RydWN0LT5pbmRpc3Vu aXF1ZSwKCQkJCQkgICBpbmRleFN0cnVjdC0+aW5kbnVsbHNub3RkaXN0aW5jdCwKCQkJCQkg ICBpbmRleFN0cnVjdC0+aW5kaXNyZWFkeSwKCQkJCQkgICBmYWxzZSwKCQkJCQkgICBpbmRl eC0+cmRfaW5kYW0tPmFtc3VtbWFyaXppbmcsCgkJCQkJICAgaW5kZXhTdHJ1Y3QtPmluZGlz ZXhjbHVzaW9uICYmIGluZGV4U3RydWN0LT5pbmRpc3VuaXF1ZSk7CgoJLyogZmlsbCBpbiBh dHRyaWJ1dGUgbnVtYmVycyAqLwoJZm9yIChpID0gMDsgaSA8IG51bUF0dHM7IGkrKykKCQlp aS0+aWlfSW5kZXhBdHRyTnVtYmVyc1tpXSA9IGluZGV4U3RydWN0LT5pbmRrZXkudmFsdWVz W2ldOwoKCS8qIFdlIGlnbm9yZSB0aGUgZXhjbHVzaW9uIGNvbnN0cmFpbnQgaWYgYW55ICov CgoJcmV0dXJuIGlpOwp9CgovKgogKiBDb21wYXJlSW5kZXhJbmZvCiAqCQlSZXR1cm4gd2hl dGhlciB0aGUgcHJvcGVydGllcyBvZiB0d28gaW5kZXhlcyAoaW4gZGlmZmVyZW50IHRhYmxl cykKICoJCWluZGljYXRlIHRoYXQgdGhleSBoYXZlIHRoZSAic2FtZSIgZGVmaW5pdGlvbnMu CiAqCiAqIE5vdGU6IHBhc3NpbmcgY29sbGF0aW9ucyBhbmQgb3BmYW1pbGllcyBzZXBhcmF0 ZWx5IGlzIGEga2x1ZGdlLiAgQWRkaW5nCiAqIHRoZW0gdG8gSW5kZXhJbmZvIG1heSByZXN1 bHQgaW4gYmV0dGVyIGNvZGluZyBoZXJlIGFuZCBlbHNld2hlcmUuCiAqCiAqIFVzZSBidWls ZF9hdHRybWFwX2J5X25hbWUoaW5kZXgyLCBpbmRleDEpIHRvIGJ1aWxkIHRoZSBhdHRtYXAu CiAqLwpib29sCkNvbXBhcmVJbmRleEluZm8oY29uc3QgSW5kZXhJbmZvICppbmZvMSwgY29u c3QgSW5kZXhJbmZvICppbmZvMiwKCQkJCSBjb25zdCBPaWQgKmNvbGxhdGlvbnMxLCBjb25z dCBPaWQgKmNvbGxhdGlvbnMyLAoJCQkJIGNvbnN0IE9pZCAqb3BmYW1pbGllczEsIGNvbnN0 IE9pZCAqb3BmYW1pbGllczIsCgkJCQkgY29uc3QgQXR0ck1hcCAqYXR0bWFwKQp7CglpbnQJ CQlpOwoKCWlmIChpbmZvMS0+aWlfVW5pcXVlICE9IGluZm8yLT5paV9VbmlxdWUpCgkJcmV0 dXJuIGZhbHNlOwoKCWlmIChpbmZvMS0+aWlfTnVsbHNOb3REaXN0aW5jdCAhPSBpbmZvMi0+ aWlfTnVsbHNOb3REaXN0aW5jdCkKCQlyZXR1cm4gZmFsc2U7CgoJLyogaW5kZXhlcyBhcmUg b25seSBlcXVpdmFsZW50IGlmIHRoZXkgaGF2ZSB0aGUgc2FtZSBhY2Nlc3MgbWV0aG9kICov CglpZiAoaW5mbzEtPmlpX0FtICE9IGluZm8yLT5paV9BbSkKCQlyZXR1cm4gZmFsc2U7CgoJ LyogYW5kIHNhbWUgbnVtYmVyIG9mIGF0dHJpYnV0ZXMgKi8KCWlmIChpbmZvMS0+aWlfTnVt SW5kZXhBdHRycyAhPSBpbmZvMi0+aWlfTnVtSW5kZXhBdHRycykKCQlyZXR1cm4gZmFsc2U7 CgoJLyogYW5kIHNhbWUgbnVtYmVyIG9mIGtleSBhdHRyaWJ1dGVzICovCglpZiAoaW5mbzEt PmlpX051bUluZGV4S2V5QXR0cnMgIT0gaW5mbzItPmlpX051bUluZGV4S2V5QXR0cnMpCgkJ cmV0dXJuIGZhbHNlOwoKCS8qCgkgKiBhbmQgY29sdW1ucyBtYXRjaCB0aHJvdWdoIHRoZSBh dHRyaWJ1dGUgbWFwIChhY3R1YWwgYXR0cmlidXRlIG51bWJlcnMKCSAqIG1pZ2h0IGRpZmZl ciEpICBOb3RlIHRoYXQgdGhpcyBjaGVja3MgdGhhdCBpbmRleCBjb2x1bW5zIHRoYXQgYXJl CgkgKiBleHByZXNzaW9ucyBhcHBlYXIgaW4gdGhlIHNhbWUgcG9zaXRpb25zLiAgV2Ugd2ls bCBuZXh0IGNvbXBhcmUgdGhlCgkgKiBleHByZXNzaW9ucyB0aGVtc2VsdmVzLgoJICovCglm b3IgKGkgPSAwOyBpIDwgaW5mbzEtPmlpX051bUluZGV4QXR0cnM7IGkrKykKCXsKCQlpZiAo YXR0bWFwLT5tYXBsZW4gPCBpbmZvMi0+aWlfSW5kZXhBdHRyTnVtYmVyc1tpXSkKCQkJZWxv ZyhFUlJPUiwgImluY29ycmVjdCBhdHRyaWJ1dGUgbWFwIik7CgoJCS8qIGlnbm9yZSBleHBy ZXNzaW9ucyBmb3Igbm93IChidXQgY2hlY2sgdGhlaXIgY29sbGF0aW9uL29wZmFtaWx5KSAq LwoJCWlmICghKGluZm8xLT5paV9JbmRleEF0dHJOdW1iZXJzW2ldID09IEludmFsaWRBdHRy TnVtYmVyICYmCgkJCSAgaW5mbzItPmlpX0luZGV4QXR0ck51bWJlcnNbaV0gPT0gSW52YWxp ZEF0dHJOdW1iZXIpKQoJCXsKCQkJLyogZmFpbCBpZiBqdXN0IG9uZSBpbmRleCBoYXMgYW4g ZXhwcmVzc2lvbiBpbiB0aGlzIGNvbHVtbiAqLwoJCQlpZiAoaW5mbzEtPmlpX0luZGV4QXR0 ck51bWJlcnNbaV0gPT0gSW52YWxpZEF0dHJOdW1iZXIgfHwKCQkJCWluZm8yLT5paV9JbmRl eEF0dHJOdW1iZXJzW2ldID09IEludmFsaWRBdHRyTnVtYmVyKQoJCQkJcmV0dXJuIGZhbHNl OwoKCQkJLyogYm90aCBhcmUgY29sdW1ucywgc28gY2hlY2sgZm9yIG1hdGNoIGFmdGVyIG1h cHBpbmcgKi8KCQkJaWYgKGF0dG1hcC0+YXR0bnVtc1tpbmZvMi0+aWlfSW5kZXhBdHRyTnVt YmVyc1tpXSAtIDFdICE9CgkJCQlpbmZvMS0+aWlfSW5kZXhBdHRyTnVtYmVyc1tpXSkKCQkJ CXJldHVybiBmYWxzZTsKCQl9CgoJCS8qIGNvbGxhdGlvbiBhbmQgb3BmYW1pbHkgYXJlIG5v dCB2YWxpZCBmb3IgaW5jbHVkZWQgY29sdW1ucyAqLwoJCWlmIChpID49IGluZm8xLT5paV9O dW1JbmRleEtleUF0dHJzKQoJCQljb250aW51ZTsKCgkJaWYgKGNvbGxhdGlvbnMxW2ldICE9 IGNvbGxhdGlvbnMyW2ldKQoJCQlyZXR1cm4gZmFsc2U7CgkJaWYgKG9wZmFtaWxpZXMxW2ld ICE9IG9wZmFtaWxpZXMyW2ldKQoJCQlyZXR1cm4gZmFsc2U7Cgl9CgoJLyoKCSAqIEZvciBl eHByZXNzaW9uIGluZGV4ZXM6IGVpdGhlciBib3RoIGFyZSBleHByZXNzaW9uIGluZGV4ZXMs IG9yIG5laXRoZXIKCSAqIGlzOyBpZiB0aGV5IGFyZSwgbWFrZSBzdXJlIHRoZSBleHByZXNz aW9ucyBtYXRjaC4KCSAqLwoJaWYgKChpbmZvMS0+aWlfRXhwcmVzc2lvbnMgIT0gTklMKSAh PSAoaW5mbzItPmlpX0V4cHJlc3Npb25zICE9IE5JTCkpCgkJcmV0dXJuIGZhbHNlOwoJaWYg KGluZm8xLT5paV9FeHByZXNzaW9ucyAhPSBOSUwpCgl7CgkJYm9vbAkJZm91bmRfd2hvbGVf cm93OwoJCU5vZGUJICAgKm1hcHBlZDsKCgkJbWFwcGVkID0gbWFwX3ZhcmlhYmxlX2F0dG5v cygoTm9kZSAqKSBpbmZvMi0+aWlfRXhwcmVzc2lvbnMsCgkJCQkJCQkJCSAxLCAwLCBhdHRt YXAsCgkJCQkJCQkJCSBJbnZhbGlkT2lkLCAmZm91bmRfd2hvbGVfcm93KTsKCQlpZiAoZm91 bmRfd2hvbGVfcm93KQoJCXsKCQkJLyoKCQkJICogd2UgY291bGQgdGhyb3cgYW4gZXJyb3Ig aGVyZSwgYnV0IHNlZW1zIG91dCBvZiBzY29wZSBmb3IgdGhpcwoJCQkgKiByb3V0aW5lLgoJ CQkgKi8KCQkJcmV0dXJuIGZhbHNlOwoJCX0KCgkJaWYgKCFlcXVhbChpbmZvMS0+aWlfRXhw cmVzc2lvbnMsIG1hcHBlZCkpCgkJCXJldHVybiBmYWxzZTsKCX0KCgkvKiBQYXJ0aWFsIGlu ZGV4IHByZWRpY2F0ZXMgbXVzdCBiZSBpZGVudGljYWwsIGlmIHRoZXkgZXhpc3QgKi8KCWlm ICgoaW5mbzEtPmlpX1ByZWRpY2F0ZSA9PSBOVUxMKSAhPSAoaW5mbzItPmlpX1ByZWRpY2F0 ZSA9PSBOVUxMKSkKCQlyZXR1cm4gZmFsc2U7CglpZiAoaW5mbzEtPmlpX1ByZWRpY2F0ZSAh PSBOVUxMKQoJewoJCWJvb2wJCWZvdW5kX3dob2xlX3JvdzsKCQlOb2RlCSAgICptYXBwZWQ7 CgoJCW1hcHBlZCA9IG1hcF92YXJpYWJsZV9hdHRub3MoKE5vZGUgKikgaW5mbzItPmlpX1By ZWRpY2F0ZSwKCQkJCQkJCQkJIDEsIDAsIGF0dG1hcCwKCQkJCQkJCQkJIEludmFsaWRPaWQs ICZmb3VuZF93aG9sZV9yb3cpOwoJCWlmIChmb3VuZF93aG9sZV9yb3cpCgkJewoJCQkvKgoJ CQkgKiB3ZSBjb3VsZCB0aHJvdyBhbiBlcnJvciBoZXJlLCBidXQgc2VlbXMgb3V0IG9mIHNj b3BlIGZvciB0aGlzCgkJCSAqIHJvdXRpbmUuCgkJCSAqLwoJCQlyZXR1cm4gZmFsc2U7CgkJ fQoJCWlmICghZXF1YWwoaW5mbzEtPmlpX1ByZWRpY2F0ZSwgbWFwcGVkKSkKCQkJcmV0dXJu IGZhbHNlOwoJfQoKCS8qIE5vIHN1cHBvcnQgY3VycmVudGx5IGZvciBjb21wYXJpbmcgZXhj bHVzaW9uIGluZGV4ZXMuICovCglpZiAoaW5mbzEtPmlpX0V4Y2x1c2lvbk9wcyAhPSBOVUxM IHx8IGluZm8yLT5paV9FeGNsdXNpb25PcHMgIT0gTlVMTCkKCQlyZXR1cm4gZmFsc2U7CgoJ cmV0dXJuIHRydWU7Cn0KCi8qIC0tLS0tLS0tLS0tLS0tLS0KICoJCUJ1aWxkU3BlY3VsYXRp dmVJbmRleEluZm8KICoJCQlBZGQgZXh0cmEgc3RhdGUgdG8gSW5kZXhJbmZvIHJlY29yZAog KgogKiBGb3IgdW5pcXVlIGluZGV4ZXMsIHdlIHVzdWFsbHkgZG9uJ3Qgd2FudCB0byBhZGQg aW5mbyB0byB0aGUgSW5kZXhJbmZvIGZvcgogKiBjaGVja2luZyB1bmlxdWVuZXNzLCBzaW5j ZSB0aGUgQi1UcmVlIEFNIGhhbmRsZXMgdGhhdCBkaXJlY3RseS4gIEhvd2V2ZXIsIGluCiAq IHRoZSBjYXNlIG9mIHNwZWN1bGF0aXZlIGluc2VydGlvbiBhbmQgY29uZmxpY3QgZGV0ZWN0 aW9uIGluIGxvZ2ljYWwKICogcmVwbGljYXRpb24sIGFkZGl0aW9uYWwgc3VwcG9ydCBpcyBy ZXF1aXJlZC4KICoKICogRG8gdGhpcyBwcm9jZXNzaW5nIGhlcmUgcmF0aGVyIHRoYW4gaW4g QnVpbGRJbmRleEluZm8oKSB0byBub3QgaW5jdXIgdGhlCiAqIG92ZXJoZWFkIGluIHRoZSBj b21tb24gbm9uLXNwZWN1bGF0aXZlIGNhc2VzLgogKiAtLS0tLS0tLS0tLS0tLS0tCiAqLwp2 b2lkCkJ1aWxkU3BlY3VsYXRpdmVJbmRleEluZm8oUmVsYXRpb24gaW5kZXgsIEluZGV4SW5m byAqaWkpCnsKCWludAkJCWluZG5rZXlhdHRzOwoJaW50CQkJaTsKCglpbmRua2V5YXR0cyA9 IEluZGV4UmVsYXRpb25HZXROdW1iZXJPZktleUF0dHJpYnV0ZXMoaW5kZXgpOwoKCS8qCgkg KiBmZXRjaCBpbmZvIGZvciBjaGVja2luZyB1bmlxdWUgaW5kZXhlcwoJICovCglBc3NlcnQo aWktPmlpX1VuaXF1ZSk7CgoJaWktPmlpX1VuaXF1ZU9wcyA9IHBhbGxvY19hcnJheShPaWQs IGluZG5rZXlhdHRzKTsKCWlpLT5paV9VbmlxdWVQcm9jcyA9IHBhbGxvY19hcnJheShPaWQs IGluZG5rZXlhdHRzKTsKCWlpLT5paV9VbmlxdWVTdHJhdHMgPSBwYWxsb2NfYXJyYXkodWlu dDE2LCBpbmRua2V5YXR0cyk7CgoJLyoKCSAqIFdlIGhhdmUgdG8gbG9vayB1cCB0aGUgb3Bl cmF0b3IncyBzdHJhdGVneSBudW1iZXIuICBUaGlzIHByb3ZpZGVzIGEKCSAqIGNyb3NzLWNo ZWNrIHRoYXQgdGhlIG9wZXJhdG9yIGRvZXMgbWF0Y2ggdGhlIGluZGV4LgoJICovCgkvKiBX ZSBuZWVkIHRoZSBmdW5jIE9JRHMgYW5kIHN0cmF0ZWd5IG51bWJlcnMgdG9vICovCglmb3Ig KGkgPSAwOyBpIDwgaW5kbmtleWF0dHM7IGkrKykKCXsKCQlpaS0+aWlfVW5pcXVlU3RyYXRz W2ldID0KCQkJSW5kZXhBbVRyYW5zbGF0ZUNvbXBhcmVUeXBlKENPTVBBUkVfRVEsCgkJCQkJ CQkJCQlpbmRleC0+cmRfcmVsLT5yZWxhbSwKCQkJCQkJCQkJCWluZGV4LT5yZF9vcGZhbWls eVtpXSwKCQkJCQkJCQkJCWZhbHNlKTsKCQlpaS0+aWlfVW5pcXVlT3BzW2ldID0KCQkJZ2V0 X29wZmFtaWx5X21lbWJlcihpbmRleC0+cmRfb3BmYW1pbHlbaV0sCgkJCQkJCQkJaW5kZXgt PnJkX29wY2ludHlwZVtpXSwKCQkJCQkJCQlpbmRleC0+cmRfb3BjaW50eXBlW2ldLAoJCQkJ CQkJCWlpLT5paV9VbmlxdWVTdHJhdHNbaV0pOwoJCWlmICghT2lkSXNWYWxpZChpaS0+aWlf VW5pcXVlT3BzW2ldKSkKCQkJZWxvZyhFUlJPUiwgIm1pc3Npbmcgb3BlcmF0b3IgJWQoJXUs JXUpIGluIG9wZmFtaWx5ICV1IiwKCQkJCSBpaS0+aWlfVW5pcXVlU3RyYXRzW2ldLCBpbmRl eC0+cmRfb3BjaW50eXBlW2ldLAoJCQkJIGluZGV4LT5yZF9vcGNpbnR5cGVbaV0sIGluZGV4 LT5yZF9vcGZhbWlseVtpXSk7CgkJaWktPmlpX1VuaXF1ZVByb2NzW2ldID0gZ2V0X29wY29k ZShpaS0+aWlfVW5pcXVlT3BzW2ldKTsKCX0KfQoKLyogLS0tLS0tLS0tLS0tLS0tLQogKgkJ Rm9ybUluZGV4RGF0dW0KICoJCQlDb25zdHJ1Y3QgdmFsdWVzW10gYW5kIGlzbnVsbFtdIGFy cmF5cyBmb3IgYSBuZXcgaW5kZXggdHVwbGUuCiAqCiAqCWluZGV4SW5mbwkJSW5mbyBhYm91 dCB0aGUgaW5kZXgKICoJc2xvdAkJCUhlYXAgdHVwbGUgZm9yIHdoaWNoIHdlIG11c3QgcHJl cGFyZSBhbiBpbmRleCBlbnRyeQogKgllc3RhdGUJCQlleGVjdXRvciBzdGF0ZSBmb3IgZXZh bHVhdGluZyBhbnkgaW5kZXggZXhwcmVzc2lvbnMKICoJdmFsdWVzCQkJQXJyYXkgb2YgaW5k ZXggRGF0dW1zIChvdXRwdXQgYXJlYSkKICoJaXNudWxsCQkJQXJyYXkgb2YgaXMtbnVsbCBp bmRpY2F0b3JzIChvdXRwdXQgYXJlYSkKICoKICogV2hlbiB0aGVyZSBhcmUgbm8gaW5kZXgg ZXhwcmVzc2lvbnMsIGVzdGF0ZSBtYXkgYmUgTlVMTC4gIE90aGVyd2lzZSBpdAogKiBtdXN0 IGJlIHN1cHBsaWVkLCAqYW5kKiB0aGUgZWN4dF9zY2FudHVwbGUgc2xvdCBvZiBpdHMgcGVy LXR1cGxlIGV4cHIKICogY29udGV4dCBtdXN0IHBvaW50IHRvIHRoZSBoZWFwIHR1cGxlIHBh c3NlZCBpbi4KICoKICogTm90aWNlIHdlIGRvbid0IGFjdHVhbGx5IGNhbGwgaW5kZXhfZm9y bV90dXBsZSgpIGhlcmU7IHdlIGp1c3QgcHJlcGFyZQogKiBpdHMgaW5wdXQgYXJyYXlzIHZh bHVlc1tdIGFuZCBpc251bGxbXS4gIFRoaXMgaXMgYmVjYXVzZSB0aGUgaW5kZXggQU0KICog bWF5IHdpc2ggdG8gYWx0ZXIgdGhlIGRhdGEgYmVmb3JlIHN0b3JhZ2UuCiAqIC0tLS0tLS0t LS0tLS0tLS0KICovCnZvaWQKRm9ybUluZGV4RGF0dW0oSW5kZXhJbmZvICppbmRleEluZm8s CgkJCSAgIFR1cGxlVGFibGVTbG90ICpzbG90LAoJCQkgICBFU3RhdGUgKmVzdGF0ZSwKCQkJ ICAgRGF0dW0gKnZhbHVlcywKCQkJICAgYm9vbCAqaXNudWxsKQp7CglMaXN0Q2VsbCAgICpp bmRleHByX2l0ZW07CglpbnQJCQlpOwoKCWlmIChpbmRleEluZm8tPmlpX0V4cHJlc3Npb25z ICE9IE5JTCAmJgoJCWluZGV4SW5mby0+aWlfRXhwcmVzc2lvbnNTdGF0ZSA9PSBOSUwpCgl7 CgkJLyogRmlyc3QgdGltZSB0aHJvdWdoLCBzZXQgdXAgZXhwcmVzc2lvbiBldmFsdWF0aW9u IHN0YXRlICovCgkJaW5kZXhJbmZvLT5paV9FeHByZXNzaW9uc1N0YXRlID0KCQkJRXhlY1By ZXBhcmVFeHByTGlzdChpbmRleEluZm8tPmlpX0V4cHJlc3Npb25zLCBlc3RhdGUpOwoJCWlu ZGV4SW5mby0+aWlfRXhwcmVzc2lvbnNFeHBhbmRTdGF0ZSA9CgkJCUV4ZWNQcmVwYXJlRXhw ckxpc3QoaW5kZXhJbmZvLT5paV9FeHByZXNzaW9uc0V4cGFuZCwgZXN0YXRlKTsKCQkvKiBD aGVjayBjYWxsZXIgaGFzIHNldCB1cCBjb250ZXh0IGNvcnJlY3RseSAqLwoJCUFzc2VydChH ZXRQZXJUdXBsZUV4cHJDb250ZXh0KGVzdGF0ZSktPmVjeHRfc2NhbnR1cGxlID09IHNsb3Qp OwoJfQoJaW5kZXhwcl9pdGVtID0gbGlzdF9oZWFkKGluZGV4SW5mby0+aWlfRXhwcmVzc2lv bnNFeHBhbmRTdGF0ZSk7CgoJZm9yIChpID0gMDsgaSA8IGluZGV4SW5mby0+aWlfTnVtSW5k ZXhBdHRyczsgaSsrKQoJewoJCWludAkJCWtleWNvbCA9IGluZGV4SW5mby0+aWlfSW5kZXhB dHRyTnVtYmVyc1tpXTsKCQlEYXR1bQkJaURhdHVtOwoJCWJvb2wJCWlzTnVsbDsKCgkJaWYg KGtleWNvbCA8IDApCgkJCWlEYXR1bSA9IHNsb3RfZ2V0c3lzYXR0cihzbG90LCBrZXljb2ws ICZpc051bGwpOwoJCWVsc2UgaWYgKGtleWNvbCAhPSAwKQoJCXsKCQkJVHVwbGVEZXNjCQkJ dHVwZGVzYyA9IHNsb3QtPnR0c190dXBsZURlc2NyaXB0b3I7CgkJCUZvcm1fcGdfYXR0cmli dXRlIAlhdHQgPSBUdXBsZURlc2NBdHRyKHR1cGRlc2MsIGtleWNvbCAtIDEpOwoKCQkJaWYg KGF0dC0+YXR0Z2VuZXJhdGVkICE9IEFUVFJJQlVURV9HRU5FUkFURURfVklSVFVBTCkKCQkJ ewoJCQkJLyoKCQkJCSAqIFBsYWluIGluZGV4IGNvbHVtbjsgZ2V0IHRoZSB2YWx1ZSB3ZSBu ZWVkIGRpcmVjdGx5IGZyb20gdGhlCgkJCQkgKiBoZWFwIHR1cGxlLgoJCQkJKi8KCQkJCWlE YXR1bSA9IHNsb3RfZ2V0YXR0cihzbG90LCBrZXljb2wsICZpc051bGwpOwoJCQl9CgkJCWVs c2UKCQkJewoJCQkJVHVwbGVDb25zdHIgCSpjb25zdHIgPSB0dXBkZXNjLT5jb25zdHI7CgoJ CQkJZm9yIChpbnQgaiA9IDA7IGogPCBjb25zdHItPm51bV9kZWZ2YWw7IGorKykKCQkJCXsK CQkJCQlBdHRyRGVmYXVsdCAJKmRlZnZhbDsKCQkJCQlFeHByCSAgIAkJKmV4cHIgPSBOVUxM OwoJCQkJCUV4cHJTdGF0ZSAgCQkqZXhwcnN0YXRlOwoKCQkJCQlkZWZ2YWwgPSAmY29uc3Ry LT5kZWZ2YWxbal07CgkJCQkJaWYgKGRlZnZhbC0+YWRudW0gPT0ga2V5Y29sKQoJCQkJCXsK CQkJCQkJZXhwciA9IHN0cmluZ1RvTm9kZShkZWZ2YWwtPmFkYmluKTsKCQkJCQkJZXhwcnN0 YXRlID0gRXhlY1ByZXBhcmVFeHByKGV4cHIsIGVzdGF0ZSk7CgkJCQkJCWlEYXR1bSA9IEV4 ZWNFdmFsRXhwclN3aXRjaENvbnRleHQoZXhwcnN0YXRlLAoJCQkJCQkJCQkJCQkJCSAgIEdl dFBlclR1cGxlRXhwckNvbnRleHQoZXN0YXRlKSwKCQkJCQkJCQkJCQkJCQkgICAmaXNOdWxs KTsKCQkJCQkJYnJlYWs7CgkJCQkJfQoJCQkJCUFzc2VydChqICsgMSA8IGNvbnN0ci0+bnVt X2RlZnZhbCk7CgkJCQl9CgkJCX0KCQl9CgkJZWxzZQoJCXsKCQkJLyoKCQkJICogSW5kZXgg ZXhwcmVzc2lvbiAtLS0gbmVlZCB0byBldmFsdWF0ZSBpdC4KCQkJICovCgkJCWlmIChpbmRl eHByX2l0ZW0gPT0gTlVMTCkKCQkJCWVsb2coRVJST1IsICJ3cm9uZyBudW1iZXIgb2YgaW5k ZXggZXhwcmVzc2lvbnMiKTsKCQkJaURhdHVtID0gRXhlY0V2YWxFeHByU3dpdGNoQ29udGV4 dCgoRXhwclN0YXRlICopIGxmaXJzdChpbmRleHByX2l0ZW0pLAoJCQkJCQkJCQkJCSAgIEdl dFBlclR1cGxlRXhwckNvbnRleHQoZXN0YXRlKSwKCQkJCQkJCQkJCQkgICAmaXNOdWxsKTsK CQkJaW5kZXhwcl9pdGVtID0gbG5leHQoaW5kZXhJbmZvLT5paV9FeHByZXNzaW9uc0V4cGFu ZFN0YXRlLCBpbmRleHByX2l0ZW0pOwoJCX0KCQl2YWx1ZXNbaV0gPSBpRGF0dW07CgkJaXNu dWxsW2ldID0gaXNOdWxsOwoJfQoKCWlmIChpbmRleHByX2l0ZW0gIT0gTlVMTCkKCQllbG9n KEVSUk9SLCAid3JvbmcgbnVtYmVyIG9mIGluZGV4IGV4cHJlc3Npb25zIik7Cn0KCgovKgog KiBpbmRleF91cGRhdGVfc3RhdHMgLS0tIHVwZGF0ZSBwZ19jbGFzcyBlbnRyeSBhZnRlciBD UkVBVEUgSU5ERVggb3IgUkVJTkRFWAogKgogKiBUaGlzIHJvdXRpbmUgdXBkYXRlcyB0aGUg cGdfY2xhc3Mgcm93IG9mIGVpdGhlciBhbiBpbmRleCBvciBpdHMgcGFyZW50CiAqIHJlbGF0 aW9uIGFmdGVyIENSRUFURSBJTkRFWCBvciBSRUlOREVYLiAgSXRzIHJhdGhlciBiaXphcnJl IEFQSSBpcyBkZXNpZ25lZAogKiB0byBlbnN1cmUgd2UgY2FuIGRvIGFsbCB0aGUgbmVjZXNz YXJ5IHdvcmsgaW4ganVzdCBvbmUgdXBkYXRlLgogKgogKiBoYXNpbmRleDogc2V0IHJlbGhh c2luZGV4IHRvIHRoaXMgdmFsdWUKICogcmVsdHVwbGVzOiBpZiA+PSAwLCBzZXQgcmVsdHVw bGVzIHRvIHRoaXMgdmFsdWU7IGVsc2Ugbm8gY2hhbmdlCiAqCiAqIElmIHJlbHR1cGxlcyA+ PSAwLCByZWxwYWdlcywgcmVsYWxsdmlzaWJsZSwgYW5kIHJlbGFsbGZyb3plbiBhcmUgYWxz bwogKiB1cGRhdGVkICh1c2luZyBSZWxhdGlvbkdldE51bWJlck9mQmxvY2tzKCkgYW5kIHZp c2liaWxpdHltYXBfY291bnQoKSkuCiAqCiAqIE5PVEU6IGFuIGltcG9ydGFudCBzaWRlLWVm ZmVjdCBvZiB0aGlzIG9wZXJhdGlvbiBpcyB0aGF0IGFuIFNJIGludmFsaWRhdGlvbgogKiBt ZXNzYWdlIGlzIHNlbnQgb3V0IHRvIGFsbCBiYWNrZW5kcyAtLS0gaW5jbHVkaW5nIG1lIC0t LSBjYXVzaW5nIHJlbGNhY2hlCiAqIGVudHJpZXMgdG8gYmUgZmx1c2hlZCBvciB1cGRhdGVk IHdpdGggdGhlIG5ldyBkYXRhLiAgVGhpcyBtdXN0IGhhcHBlbiBldmVuCiAqIGlmIHdlIGZp bmQgdGhhdCBubyBjaGFuZ2UgaXMgbmVlZGVkIGluIHRoZSBwZ19jbGFzcyByb3cuICBXaGVu IHVwZGF0aW5nCiAqIGEgaGVhcCBlbnRyeSwgdGhpcyBlbnN1cmVzIHRoYXQgb3RoZXIgYmFj a2VuZHMgZmluZCBvdXQgYWJvdXQgdGhlIG5ldwogKiBpbmRleC4gIFdoZW4gdXBkYXRpbmcg YW4gaW5kZXgsIGl0J3MgaW1wb3J0YW50IGJlY2F1c2Ugc29tZSBpbmRleCBBTXMKICogZXhw ZWN0IGEgcmVsY2FjaGUgZmx1c2ggdG8gb2NjdXIgYWZ0ZXIgUkVJTkRFWC4KICovCnN0YXRp YyB2b2lkCmluZGV4X3VwZGF0ZV9zdGF0cyhSZWxhdGlvbiByZWwsCgkJCQkgICBib29sIGhh c2luZGV4LAoJCQkJICAgZG91YmxlIHJlbHR1cGxlcykKewoJYm9vbAkJdXBkYXRlX3N0YXRz OwoJQmxvY2tOdW1iZXIgcmVscGFnZXMgPSAwOwkvKiBrZWVwIGNvbXBpbGVyIHF1aWV0ICov CglCbG9ja051bWJlciByZWxhbGx2aXNpYmxlID0gMDsKCUJsb2NrTnVtYmVyIHJlbGFsbGZy b3plbiA9IDA7CglPaWQJCQlyZWxpZCA9IFJlbGF0aW9uR2V0UmVsaWQocmVsKTsKCVJlbGF0 aW9uCXBnX2NsYXNzOwoJU2NhbktleURhdGEga2V5WzFdOwoJSGVhcFR1cGxlCXR1cGxlOwoJ dm9pZAkgICAqc3RhdGU7CglGb3JtX3BnX2NsYXNzIHJkX3JlbDsKCWJvb2wJCWRpcnR5OwoK CS8qCgkgKiBBcyBhIHNwZWNpYWwgaGFjaywgaWYgd2UgYXJlIGRlYWxpbmcgd2l0aCBhbiBl bXB0eSB0YWJsZSBhbmQgdGhlCgkgKiBleGlzdGluZyByZWx0dXBsZXMgaXMgLTEsIHdlIGxl YXZlIHRoYXQgYWxvbmUuICBUaGlzIGVuc3VyZXMgdGhhdAoJICogY3JlYXRpbmcgYW4gaW5k ZXggYXMgcGFydCBvZiBDUkVBVEUgVEFCTEUgZG9lc24ndCBjYXVzZSB0aGUgdGFibGUgdG8K CSAqIHByZW1hdHVyZWx5IGxvb2sgbGlrZSBpdCdzIGJlZW4gdmFjdXVtZWQuICBUaGUgcmRf cmVsIHdlIG1vZGlmeSBtYXkKCSAqIGRpZmZlciBmcm9tIHJlbC0+cmRfcmVsIGR1ZSB0byBl LmcuIGNvbW1pdCBvZiBjb25jdXJyZW50IEdSQU5ULCBidXQgdGhlCgkgKiBjb21tYW5kcyB0 aGF0IGNoYW5nZSByZWx0dXBsZXMgdGFrZSBsb2NrcyBjb25mbGljdGluZyB3aXRoIG91cnMu ICAoRXZlbgoJICogaWYgYSBjb21tYW5kIGNoYW5nZWQgcmVsdHVwbGVzIHVuZGVyIGEgd2Vh a2VyIGxvY2ssIHRoaXMgYWZmZWN0cyBvbmx5CgkgKiBzdGF0aXN0aWNzIGZvciBhbiBlbXB0 eSB0YWJsZS4pCgkgKi8KCWlmIChyZWx0dXBsZXMgPT0gMCAmJiByZWwtPnJkX3JlbC0+cmVs dHVwbGVzIDwgMCkKCQlyZWx0dXBsZXMgPSAtMTsKCgkvKgoJICogRG9uJ3QgdXBkYXRlIHN0 YXRpc3RpY3MgZHVyaW5nIGJpbmFyeSB1cGdyYWRlLCBiZWNhdXNlIHRoZSBpbmRleGVzIGFy ZQoJICogY3JlYXRlZCBiZWZvcmUgdGhlIGRhdGEgaXMgbW92ZWQgaW50byBwbGFjZS4KCSAq LwoJdXBkYXRlX3N0YXRzID0gcmVsdHVwbGVzID49IDAgJiYgIUlzQmluYXJ5VXBncmFkZTsK CgkvKgoJICogSWYgYXV0b3ZhY3V1bSBpcyBvZmYsIHVzZXIgbWF5IG5vdCBiZSBleHBlY3Rp bmcgdGFibGUgcmVsc3RhdHMgdG8KCSAqIGNoYW5nZS4gIFRoaXMgY2FuIGJlIGltcG9ydGFu dCB3aGVuIHJlc3RvcmluZyBhIGR1bXAgdGhhdCBpbmNsdWRlcwoJICogc3RhdGlzdGljcywg YXMgdGhlIHRhYmxlIHN0YXRpc3RpY3MgbWF5IGJlIHJlc3RvcmVkIGJlZm9yZSB0aGUgaW5k ZXggaXMKCSAqIGNyZWF0ZWQsIGFuZCB3ZSB3YW50IHRvIHByZXNlcnZlIHRoZSByZXN0b3Jl ZCB0YWJsZSBzdGF0aXN0aWNzLgoJICovCglpZiAocmVsLT5yZF9yZWwtPnJlbGtpbmQgPT0g UkVMS0lORF9SRUxBVElPTiB8fAoJCXJlbC0+cmRfcmVsLT5yZWxraW5kID09IFJFTEtJTkRf VE9BU1RWQUxVRSB8fAoJCXJlbC0+cmRfcmVsLT5yZWxraW5kID09IFJFTEtJTkRfTUFUVklF VykKCXsKCQlpZiAoQXV0b1ZhY3V1bWluZ0FjdGl2ZSgpKQoJCXsKCQkJU3RkUmRPcHRpb25z ICpvcHRpb25zID0gKFN0ZFJkT3B0aW9ucyAqKSByZWwtPnJkX29wdGlvbnM7CgoJCQlpZiAo b3B0aW9ucyAhPSBOVUxMICYmICFvcHRpb25zLT5hdXRvdmFjdXVtLmVuYWJsZWQpCgkJCQl1 cGRhdGVfc3RhdHMgPSBmYWxzZTsKCQl9CgkJZWxzZQoJCQl1cGRhdGVfc3RhdHMgPSBmYWxz ZTsKCX0KCgkvKgoJICogRmluaXNoIEkvTyBhbmQgdmlzaWJpbGl0eSBtYXAgYnVmZmVyIGxv Y2tzIGJlZm9yZQoJICogc3lzdGFibGVfaW5wbGFjZV91cGRhdGVfYmVnaW4oKSBsb2NrcyB0 aGUgcGdfY2xhc3MgYnVmZmVyLiAgVGhlIHJkX3JlbAoJICogd2UgbW9kaWZ5IG1heSBkaWZm ZXIgZnJvbSByZWwtPnJkX3JlbCBkdWUgdG8gZS5nLiBjb21taXQgb2YgY29uY3VycmVudAoJ ICogR1JBTlQsIGJ1dCBubyBjb21tYW5kIGNoYW5nZXMgYSByZWxraW5kIGZyb20gbm9uLWlu ZGV4IHRvIGluZGV4LiAgKEV2ZW4KCSAqIGlmIG9uZSBkaWQsIHJlbGFsbHZpc2libGUgZG9l c24ndCBicmVhayBmdW5jdGlvbmFsaXR5LikKCSAqLwoJaWYgKHVwZGF0ZV9zdGF0cykKCXsK CQlyZWxwYWdlcyA9IFJlbGF0aW9uR2V0TnVtYmVyT2ZCbG9ja3MocmVsKTsKCgkJaWYgKHJl bC0+cmRfcmVsLT5yZWxraW5kICE9IFJFTEtJTkRfSU5ERVgpCgkJCXZpc2liaWxpdHltYXBf Y291bnQocmVsLCAmcmVsYWxsdmlzaWJsZSwgJnJlbGFsbGZyb3plbik7Cgl9CgoJLyoKCSAq IFdlIGFsd2F5cyB1cGRhdGUgdGhlIHBnX2NsYXNzIHJvdyB1c2luZyBhIG5vbi10cmFuc2Fj dGlvbmFsLAoJICogb3ZlcndyaXRlLWluLXBsYWNlIHVwZGF0ZS4gIFRoZXJlIGFyZSBzZXZl cmFsIHJlYXNvbnMgZm9yIHRoaXM6CgkgKgoJICogMS4gSW4gYm9vdHN0cmFwIG1vZGUsIHdl IGhhdmUgbm8gY2hvaWNlIC0tLSBVUERBVEUgd291bGRuJ3Qgd29yay4KCSAqCgkgKiAyLiBX ZSBjb3VsZCBiZSByZWluZGV4aW5nIHBnX2NsYXNzIGl0c2VsZiwgaW4gd2hpY2ggY2FzZSB3 ZSBjYW4ndCBtb3ZlCgkgKiBpdHMgcGdfY2xhc3Mgcm93IGJlY2F1c2UgQ2F0YWxvZ1R1cGxl SW5zZXJ0L0NhdGFsb2dUdXBsZVVwZGF0ZSBtaWdodAoJICogbm90IGtub3cgYWJvdXQgYWxs IHRoZSBpbmRleGVzIHlldCAoc2VlIHJlaW5kZXhfcmVsYXRpb24pLgoJICoKCSAqIDMuIEJl Y2F1c2Ugd2UgZXhlY3V0ZSBDUkVBVEUgSU5ERVggd2l0aCBqdXN0IHNoYXJlIGxvY2sgb24g dGhlIHBhcmVudAoJICogcmVsICh0byBhbGxvdyBjb25jdXJyZW50IGluZGV4IGNyZWF0aW9u cyksIGFuIG9yZGluYXJ5IHVwZGF0ZSBjb3VsZAoJICogc3VmZmVyIGEgdHVwbGUtY29uY3Vy cmVudGx5LXVwZGF0ZWQgZmFpbHVyZSBhZ2FpbnN0IGFub3RoZXIgQ1JFQVRFCgkgKiBJTkRF WCBjb21taXR0aW5nIGF0IGFib3V0IHRoZSBzYW1lIHRpbWUuICBXZSBjYW4gYXZvaWQgdGhh dCBieSBoYXZpbmcKCSAqIHRoZW0gYm90aCBkbyBub250cmFuc2FjdGlvbmFsIHVwZGF0ZXMg KHdlIGFzc3VtZSB0aGV5IHdpbGwgYm90aCBiZQoJICogdHJ5aW5nIHRvIGNoYW5nZSB0aGUg cGdfY2xhc3Mgcm93IHRvIHRoZSBzYW1lIHRoaW5nLCBzbyBpdCBkb2Vzbid0CgkgKiBtYXR0 ZXIgd2hpY2ggZ29lcyBmaXJzdCkuCgkgKgoJICogSXQgaXMgc2FmZSB0byB1c2UgYSBub24t dHJhbnNhY3Rpb25hbCB1cGRhdGUgZXZlbiB0aG91Z2ggb3VyCgkgKiB0cmFuc2FjdGlvbiBj b3VsZCBzdGlsbCBmYWlsIGJlZm9yZSBjb21taXR0aW5nLiAgU2V0dGluZyByZWxoYXNpbmRl eAoJICogdHJ1ZSBpcyBzYWZlIGV2ZW4gaWYgdGhlcmUgYXJlIG5vIGluZGV4ZXMgKFZBQ1VV TSB3aWxsIGV2ZW50dWFsbHkgZml4CgkgKiBpdCkuICBBbmQgb2YgY291cnNlIHRoZSBuZXcg cmVscGFnZXMgYW5kIHJlbHR1cGxlcyBjb3VudHMgYXJlIGNvcnJlY3QKCSAqIHJlZ2FyZGxl c3MuICBIb3dldmVyLCB3ZSBkb24ndCB3YW50IHRvIGNoYW5nZSByZWxwYWdlcyAob3IKCSAq IHJlbGFsbHZpc2libGUpIGlmIHRoZSBjYWxsZXIgaXNuJ3QgcHJvdmlkaW5nIGFuIHVwZGF0 ZWQgcmVsdHVwbGVzCgkgKiBjb3VudCwgYmVjYXVzZSB0aGF0IHdvdWxkIGJvbGxpeCB0aGUg cmVsdHVwbGVzL3JlbHBhZ2VzIHJhdGlvIHdoaWNoIGlzCgkgKiB3aGF0J3MgcmVhbGx5IGlt cG9ydGFudC4KCSAqLwoKCXBnX2NsYXNzID0gdGFibGVfb3BlbihSZWxhdGlvblJlbGF0aW9u SWQsIFJvd0V4Y2x1c2l2ZUxvY2spOwoKCVNjYW5LZXlJbml0KCZrZXlbMF0sCgkJCQlBbnVt X3BnX2NsYXNzX29pZCwKCQkJCUJURXF1YWxTdHJhdGVneU51bWJlciwgRl9PSURFUSwKCQkJ CU9iamVjdElkR2V0RGF0dW0ocmVsaWQpKTsKCXN5c3RhYmxlX2lucGxhY2VfdXBkYXRlX2Jl Z2luKHBnX2NsYXNzLCBDbGFzc09pZEluZGV4SWQsIHRydWUsIE5VTEwsCgkJCQkJCQkJICAx LCBrZXksICZ0dXBsZSwgJnN0YXRlKTsKCglpZiAoIUhlYXBUdXBsZUlzVmFsaWQodHVwbGUp KQoJCWVsb2coRVJST1IsICJjb3VsZCBub3QgZmluZCB0dXBsZSBmb3IgcmVsYXRpb24gJXUi LCByZWxpZCk7CglyZF9yZWwgPSAoRm9ybV9wZ19jbGFzcykgR0VUU1RSVUNUKHR1cGxlKTsK CgkvKiBTaG91bGQgdGhpcyBiZSBhIG1vcmUgY29tcHJlaGVuc2l2ZSB0ZXN0PyAqLwoJQXNz ZXJ0KHJkX3JlbC0+cmVsa2luZCAhPSBSRUxLSU5EX1BBUlRJVElPTkVEX0lOREVYKTsKCgkv KiBBcHBseSByZXF1aXJlZCB1cGRhdGVzLCBpZiBhbnksIHRvIGNvcGllZCB0dXBsZSAqLwoK CWRpcnR5ID0gZmFsc2U7CglpZiAocmRfcmVsLT5yZWxoYXNpbmRleCAhPSBoYXNpbmRleCkK CXsKCQlyZF9yZWwtPnJlbGhhc2luZGV4ID0gaGFzaW5kZXg7CgkJZGlydHkgPSB0cnVlOwoJ fQoKCWlmICh1cGRhdGVfc3RhdHMpCgl7CgkJaWYgKHJkX3JlbC0+cmVscGFnZXMgIT0gKGlu dDMyKSByZWxwYWdlcykKCQl7CgkJCXJkX3JlbC0+cmVscGFnZXMgPSAoaW50MzIpIHJlbHBh Z2VzOwoJCQlkaXJ0eSA9IHRydWU7CgkJfQoJCWlmIChyZF9yZWwtPnJlbHR1cGxlcyAhPSAo ZmxvYXQ0KSByZWx0dXBsZXMpCgkJewoJCQlyZF9yZWwtPnJlbHR1cGxlcyA9IChmbG9hdDQp IHJlbHR1cGxlczsKCQkJZGlydHkgPSB0cnVlOwoJCX0KCQlpZiAocmRfcmVsLT5yZWxhbGx2 aXNpYmxlICE9IChpbnQzMikgcmVsYWxsdmlzaWJsZSkKCQl7CgkJCXJkX3JlbC0+cmVsYWxs dmlzaWJsZSA9IChpbnQzMikgcmVsYWxsdmlzaWJsZTsKCQkJZGlydHkgPSB0cnVlOwoJCX0K CQlpZiAocmRfcmVsLT5yZWxhbGxmcm96ZW4gIT0gKGludDMyKSByZWxhbGxmcm96ZW4pCgkJ ewoJCQlyZF9yZWwtPnJlbGFsbGZyb3plbiA9IChpbnQzMikgcmVsYWxsZnJvemVuOwoJCQlk aXJ0eSA9IHRydWU7CgkJfQoJfQoKCS8qCgkgKiBJZiBhbnl0aGluZyBjaGFuZ2VkLCB3cml0 ZSBvdXQgdGhlIHR1cGxlCgkgKi8KCWlmIChkaXJ0eSkKCXsKCQlzeXN0YWJsZV9pbnBsYWNl X3VwZGF0ZV9maW5pc2goc3RhdGUsIHR1cGxlKTsKCQkvKiB0aGUgYWJvdmUgc2VuZHMgdHJh bnNhY3Rpb25hbCBhbmQgaW1tZWRpYXRlIGNhY2hlIGludmFsIG1lc3NhZ2VzICovCgl9Cgll bHNlCgl7CgkJc3lzdGFibGVfaW5wbGFjZV91cGRhdGVfY2FuY2VsKHN0YXRlKTsKCgkJLyoK CQkgKiBXaGlsZSB3ZSBkaWRuJ3QgY2hhbmdlIHJlbGhhc2luZGV4LCBDUkVBVEUgSU5ERVgg bmVlZHMgYQoJCSAqIHRyYW5zYWN0aW9uYWwgaW52YWwgZm9yIHdoZW4gdGhlIG5ldyBpbmRl eCdzIGNhdGFsb2cgcm93cyBiZWNvbWUKCQkgKiB2aXNpYmxlLiAgT3RoZXIgQ1JFQVRFIElO REVYIGFuZCBSRUlOREVYIGNvZGUgaGFwcGVucyB0byBhbHNvIHF1ZXVlCgkJICogdGhpcyBp bnZhbCwgYnV0IGtlZXAgdGhpcyBpbiBjYXNlIHJhcmUgY2FsbGVycyByZWx5IG9uIHRoaXMg cGFydCBvZgoJCSAqIG91ciBBUEkgY29udHJhY3QuCgkJICovCgkJQ2FjaGVJbnZhbGlkYXRl UmVsY2FjaGVCeVR1cGxlKHR1cGxlKTsKCX0KCgloZWFwX2ZyZWV0dXBsZSh0dXBsZSk7CgoJ dGFibGVfY2xvc2UocGdfY2xhc3MsIFJvd0V4Y2x1c2l2ZUxvY2spOwp9CgoKLyoKICogaW5k ZXhfYnVpbGQgLSBpbnZva2UgYWNjZXNzLW1ldGhvZC1zcGVjaWZpYyBpbmRleCBidWlsZCBw cm9jZWR1cmUKICoKICogT24gZW50cnksIHRoZSBpbmRleCdzIGNhdGFsb2cgZW50cmllcyBh cmUgdmFsaWQsIGFuZCBpdHMgcGh5c2ljYWwgZGlzawogKiBmaWxlIGhhcyBiZWVuIGNyZWF0 ZWQgYnV0IGlzIGVtcHR5LiAgV2UgY2FsbCB0aGUgQU0tc3BlY2lmaWMgYnVpbGQKICogcHJv Y2VkdXJlIHRvIGZpbGwgaW4gdGhlIGluZGV4IGNvbnRlbnRzLiAgV2UgdGhlbiB1cGRhdGUg dGhlIHBnX2NsYXNzCiAqIGVudHJpZXMgb2YgdGhlIGluZGV4IGFuZCBoZWFwIHJlbGF0aW9u IGFzIG5lZWRlZCwgdXNpbmcgc3RhdGlzdGljcwogKiByZXR1cm5lZCBieSBhbWJ1aWxkIGFz IHdlbGwgYXMgZGF0YSBwYXNzZWQgYnkgdGhlIGNhbGxlci4KICoKICogaXNyZWluZGV4IGlu ZGljYXRlcyB3ZSBhcmUgcmVjcmVhdGluZyBhIHByZXZpb3VzbHktZXhpc3RpbmcgaW5kZXgu CiAqIHBhcmFsbGVsIGluZGljYXRlcyBpZiBwYXJhbGxlbGlzbSBtYXkgYmUgdXNlZnVsLgog KiBwcm9ncmVzcyBpbmRpY2F0ZXMgaWYgdGhlIGJhY2tlbmQgc2hvdWxkIHVwZGF0ZSBpdHMg cHJvZ3Jlc3MgaW5mby4KICoKICogTm90ZTogYmVmb3JlIFBvc3RncmVzIDguMiwgdGhlIHBh c3NlZC1pbiBoZWFwIGFuZCBpbmRleCBSZWxhdGlvbnMKICogd2VyZSBhdXRvbWF0aWNhbGx5 IGNsb3NlZCBieSB0aGlzIHJvdXRpbmUuICBUaGlzIGlzIG5vIGxvbmdlciB0aGUgY2FzZS4K ICogVGhlIGNhbGxlciBvcGVuZWQgJ2VtLCBhbmQgdGhlIGNhbGxlciBzaG91bGQgY2xvc2Ug J2VtLgogKi8Kdm9pZAppbmRleF9idWlsZChSZWxhdGlvbiBoZWFwUmVsYXRpb24sCgkJCVJl bGF0aW9uIGluZGV4UmVsYXRpb24sCgkJCUluZGV4SW5mbyAqaW5kZXhJbmZvLAoJCQlib29s IGlzcmVpbmRleCwKCQkJYm9vbCBwYXJhbGxlbCwKCQkJYm9vbCBwcm9ncmVzcykKewoJSW5k ZXhCdWlsZFJlc3VsdCAqc3RhdHM7CglPaWQJCQlzYXZlX3VzZXJpZDsKCWludAkJCXNhdmVf c2VjX2NvbnRleHQ7CglpbnQJCQlzYXZlX25lc3RsZXZlbDsKCgkvKgoJICogc2FuaXR5IGNo ZWNrcwoJICovCglBc3NlcnQoUmVsYXRpb25Jc1ZhbGlkKGluZGV4UmVsYXRpb24pKTsKCUFz c2VydChpbmRleFJlbGF0aW9uLT5yZF9pbmRhbSk7CglBc3NlcnQoaW5kZXhSZWxhdGlvbi0+ cmRfaW5kYW0tPmFtYnVpbGQpOwoJQXNzZXJ0KGluZGV4UmVsYXRpb24tPnJkX2luZGFtLT5h bWJ1aWxkZW1wdHkpOwoKCS8qCgkgKiBEZXRlcm1pbmUgd29ya2VyIHByb2Nlc3MgZGV0YWls cyBmb3IgcGFyYWxsZWwgQ1JFQVRFIElOREVYLiAgQ3VycmVudGx5LAoJICogb25seSBidHJl ZSwgR0lOLCBhbmQgQlJJTiBoYXZlIHN1cHBvcnQgZm9yIHBhcmFsbGVsIGJ1aWxkcy4KCSAq CgkgKiBOb3RlIHRoYXQgcGxhbm5lciBjb25zaWRlcnMgcGFyYWxsZWwgc2FmZXR5IGZvciB1 cy4KCSAqLwoJaWYgKHBhcmFsbGVsICYmIElzTm9ybWFsUHJvY2Vzc2luZ01vZGUoKSAmJgoJ CWluZGV4UmVsYXRpb24tPnJkX2luZGFtLT5hbWNhbmJ1aWxkcGFyYWxsZWwpCgkJaW5kZXhJ bmZvLT5paV9QYXJhbGxlbFdvcmtlcnMgPQoJCQlwbGFuX2NyZWF0ZV9pbmRleF93b3JrZXJz KFJlbGF0aW9uR2V0UmVsaWQoaGVhcFJlbGF0aW9uKSwKCQkJCQkJCQkJICBSZWxhdGlvbkdl dFJlbGlkKGluZGV4UmVsYXRpb24pKTsKCglpZiAoaW5kZXhJbmZvLT5paV9QYXJhbGxlbFdv cmtlcnMgPT0gMCkKCQllcmVwb3J0KERFQlVHMSwKCQkJCShlcnJtc2dfaW50ZXJuYWwoImJ1 aWxkaW5nIGluZGV4IFwiJXNcIiBvbiB0YWJsZSBcIiVzXCIgc2VyaWFsbHkiLAoJCQkJCQkJ CSBSZWxhdGlvbkdldFJlbGF0aW9uTmFtZShpbmRleFJlbGF0aW9uKSwKCQkJCQkJCQkgUmVs YXRpb25HZXRSZWxhdGlvbk5hbWUoaGVhcFJlbGF0aW9uKSkpKTsKCWVsc2UKCQllcmVwb3J0 KERFQlVHMSwKCQkJCShlcnJtc2dfaW50ZXJuYWwoImJ1aWxkaW5nIGluZGV4IFwiJXNcIiBv biB0YWJsZSBcIiVzXCIgd2l0aCByZXF1ZXN0IGZvciAlZCBwYXJhbGxlbCB3b3JrZXJzIiwK CQkJCQkJCQkgUmVsYXRpb25HZXRSZWxhdGlvbk5hbWUoaW5kZXhSZWxhdGlvbiksCgkJCQkJ CQkJIFJlbGF0aW9uR2V0UmVsYXRpb25OYW1lKGhlYXBSZWxhdGlvbiksCgkJCQkJCQkJIGlu ZGV4SW5mby0+aWlfUGFyYWxsZWxXb3JrZXJzKSkpOwoKCS8qCgkgKiBTd2l0Y2ggdG8gdGhl IHRhYmxlIG93bmVyJ3MgdXNlcmlkLCBzbyB0aGF0IGFueSBpbmRleCBmdW5jdGlvbnMgYXJl IHJ1bgoJICogYXMgdGhhdCB1c2VyLiAgQWxzbyBsb2NrIGRvd24gc2VjdXJpdHktcmVzdHJp Y3RlZCBvcGVyYXRpb25zIGFuZAoJICogYXJyYW5nZSB0byBtYWtlIEdVQyB2YXJpYWJsZSBj aGFuZ2VzIGxvY2FsIHRvIHRoaXMgY29tbWFuZC4KCSAqLwoJR2V0VXNlcklkQW5kU2VjQ29u dGV4dCgmc2F2ZV91c2VyaWQsICZzYXZlX3NlY19jb250ZXh0KTsKCVNldFVzZXJJZEFuZFNl Y0NvbnRleHQoaGVhcFJlbGF0aW9uLT5yZF9yZWwtPnJlbG93bmVyLAoJCQkJCQkgICBzYXZl X3NlY19jb250ZXh0IHwgU0VDVVJJVFlfUkVTVFJJQ1RFRF9PUEVSQVRJT04pOwoJc2F2ZV9u ZXN0bGV2ZWwgPSBOZXdHVUNOZXN0TGV2ZWwoKTsKCVJlc3RyaWN0U2VhcmNoUGF0aCgpOwoK CS8qIFNldCB1cCBpbml0aWFsIHByb2dyZXNzIHJlcG9ydCBzdGF0dXMgKi8KCWlmIChwcm9n cmVzcykKCXsKCQljb25zdCBpbnQJcHJvZ3Jlc3NfaW5kZXhbXSA9IHsKCQkJUFJPR1JFU1Nf Q1JFQVRFSURYX1BIQVNFLAoJCQlQUk9HUkVTU19DUkVBVEVJRFhfU1VCUEhBU0UsCgkJCVBS T0dSRVNTX0NSRUFURUlEWF9UVVBMRVNfRE9ORSwKCQkJUFJPR1JFU1NfQ1JFQVRFSURYX1RV UExFU19UT1RBTCwKCQkJUFJPR1JFU1NfU0NBTl9CTE9DS1NfRE9ORSwKCQkJUFJPR1JFU1Nf U0NBTl9CTE9DS1NfVE9UQUwKCQl9OwoJCWNvbnN0IGludDY0IHByb2dyZXNzX3ZhbHNbXSA9 IHsKCQkJUFJPR1JFU1NfQ1JFQVRFSURYX1BIQVNFX0JVSUxELAoJCQlQUk9HUkVTU19DUkVB VEVJRFhfU1VCUEhBU0VfSU5JVElBTElaRSwKCQkJMCwgMCwgMCwgMAoJCX07CgoJCXBnc3Rh dF9wcm9ncmVzc191cGRhdGVfbXVsdGlfcGFyYW0oNiwgcHJvZ3Jlc3NfaW5kZXgsIHByb2dy ZXNzX3ZhbHMpOwoJfQoKCS8qCgkgKiBDYWxsIHRoZSBhY2Nlc3MgbWV0aG9kJ3MgYnVpbGQg cHJvY2VkdXJlCgkgKi8KCXN0YXRzID0gaW5kZXhSZWxhdGlvbi0+cmRfaW5kYW0tPmFtYnVp bGQoaGVhcFJlbGF0aW9uLCBpbmRleFJlbGF0aW9uLAoJCQkJCQkJCQkJCSBpbmRleEluZm8p OwoJQXNzZXJ0KHN0YXRzKTsKCgkvKgoJICogSWYgdGhpcyBpcyBhbiB1bmxvZ2dlZCBpbmRl eCwgd2UgbWF5IG5lZWQgdG8gd3JpdGUgb3V0IGFuIGluaXQgZm9yayBmb3IKCSAqIGl0IC0t IGJ1dCB3ZSBtdXN0IGZpcnN0IGNoZWNrIHdoZXRoZXIgb25lIGFscmVhZHkgZXhpc3RzLiAg SWYsIGZvcgoJICogZXhhbXBsZSwgYW4gdW5sb2dnZWQgcmVsYXRpb24gaXMgdHJ1bmNhdGVk IGluIHRoZSB0cmFuc2FjdGlvbiB0aGF0CgkgKiBjcmVhdGVkIGl0LCBvciB0cnVuY2F0ZWQg dHdpY2UgaW4gYSBzdWJzZXF1ZW50IHRyYW5zYWN0aW9uLCB0aGUKCSAqIHJlbGZpbGVudW1i ZXIgd29uJ3QgY2hhbmdlLCBhbmQgbm90aGluZyBuZWVkcyB0byBiZSBkb25lIGhlcmUuCgkg Ki8KCWlmIChpbmRleFJlbGF0aW9uLT5yZF9yZWwtPnJlbHBlcnNpc3RlbmNlID09IFJFTFBF UlNJU1RFTkNFX1VOTE9HR0VEICYmCgkJIXNtZ3JleGlzdHMoUmVsYXRpb25HZXRTbWdyKGlu ZGV4UmVsYXRpb24pLCBJTklUX0ZPUktOVU0pKQoJewoJCXNtZ3JjcmVhdGUoUmVsYXRpb25H ZXRTbWdyKGluZGV4UmVsYXRpb24pLCBJTklUX0ZPUktOVU0sIGZhbHNlKTsKCQlsb2dfc21n cmNyZWF0ZSgmaW5kZXhSZWxhdGlvbi0+cmRfbG9jYXRvciwgSU5JVF9GT1JLTlVNKTsKCQlp bmRleFJlbGF0aW9uLT5yZF9pbmRhbS0+YW1idWlsZGVtcHR5KGluZGV4UmVsYXRpb24pOwoJ fQoKCS8qCgkgKiBJZiB3ZSBmb3VuZCBhbnkgcG90ZW50aWFsbHkgYnJva2VuIEhPVCBjaGFp bnMsIG1hcmsgdGhlIGluZGV4IGFzIG5vdAoJICogYmVpbmcgdXNhYmxlIHVudGlsIHRoZSBj dXJyZW50IHRyYW5zYWN0aW9uIGlzIGJlbG93IHRoZSBldmVudCBob3Jpem9uLgoJICogU2Vl IHNyYy9iYWNrZW5kL2FjY2Vzcy9oZWFwL1JFQURNRS5IT1QgZm9yIGRpc2N1c3Npb24uICBX aGlsZSBpdCBtaWdodAoJICogYmVjb21lIHNhZmUgdG8gdXNlIHRoZSBpbmRleCBlYXJsaWVy IGJhc2VkIG9uIGFjdHVhbCBjbGVhbnVwIGFjdGl2aXR5CgkgKiBhbmQgb3RoZXIgYWN0aXZl IHRyYW5zYWN0aW9ucywgdGhlIHRlc3QgZm9yIHRoYXQgd291bGQgYmUgbXVjaCBtb3JlCgkg KiBjb21wbGV4IGFuZCB3b3VsZCByZXF1aXJlIHNvbWUgZm9ybSBvZiBibG9ja2luZywgc28g a2VlcCBpdCBzaW1wbGUgYW5kCgkgKiBmYXN0IGJ5IGp1c3QgdXNpbmcgdGhlIGN1cnJlbnQg dHJhbnNhY3Rpb24uCgkgKgoJICogSG93ZXZlciwgd2hlbiByZWluZGV4aW5nIGFuIGV4aXN0 aW5nIGluZGV4LCB3ZSBzaG91bGQgZG8gbm90aGluZyBoZXJlLgoJICogQW55IEhPVCBjaGFp bnMgdGhhdCBhcmUgYnJva2VuIHdpdGggcmVzcGVjdCB0byB0aGUgaW5kZXggbXVzdCBwcmVk YXRlCgkgKiB0aGUgaW5kZXgncyBvcmlnaW5hbCBjcmVhdGlvbiwgc28gdGhlcmUgaXMgbm8g bmVlZCB0byBjaGFuZ2UgdGhlCgkgKiBpbmRleCdzIHVzYWJpbGl0eSBob3Jpem9uLiAgTW9y ZW92ZXIsIHdlICptdXN0IG5vdCogdHJ5IHRvIGNoYW5nZSB0aGUKCSAqIGluZGV4J3MgcGdf aW5kZXggZW50cnkgd2hpbGUgcmVpbmRleGluZyBwZ19pbmRleCBpdHNlbGYsIGFuZCB0aGlz CgkgKiBvcHRpbWl6YXRpb24gbmljZWx5IHByZXZlbnRzIHRoYXQuICBUaGUgbW9yZSBjb21w bGV4IHJ1bGVzIG5lZWRlZCBmb3IgYQoJICogcmVpbmRleCBhcmUgaGFuZGxlZCBzZXBhcmF0 ZWx5IGFmdGVyIHRoaXMgZnVuY3Rpb24gcmV0dXJucy4KCSAqCgkgKiBXZSBhbHNvIG5lZWQg bm90IHNldCBpbmRjaGVja3htaW4gZHVyaW5nIGEgY29uY3VycmVudCBpbmRleCBidWlsZCwK CSAqIGJlY2F1c2Ugd2Ugd29uJ3Qgc2V0IGluZGlzdmFsaWQgdHJ1ZSB1bnRpbCBhbGwgdHJh bnNhY3Rpb25zIHRoYXQgY2FyZQoJICogYWJvdXQgdGhlIGJyb2tlbiBIT1QgY2hhaW5zIGFy ZSBnb25lLgoJICoKCSAqIFRoZXJlZm9yZSwgdGhpcyBjb2RlIHBhdGggY2FuIG9ubHkgYmUg dGFrZW4gZHVyaW5nIG5vbi1jb25jdXJyZW50CgkgKiBDUkVBVEUgSU5ERVguICBUaHVzIHRo ZSBmYWN0IHRoYXQgaGVhcF91cGRhdGUgd2lsbCBzZXQgdGhlIHBnX2luZGV4CgkgKiB0dXBs ZSdzIHhtaW4gZG9lc24ndCBtYXR0ZXIsIGJlY2F1c2UgdGhhdCB0dXBsZSB3YXMgY3JlYXRl ZCBpbiB0aGUKCSAqIGN1cnJlbnQgdHJhbnNhY3Rpb24gYW55d2F5LiAgVGhhdCBhbHNvIG1l YW5zIHdlIGRvbid0IG5lZWQgdG8gd29ycnkKCSAqIGFib3V0IGFueSBjb25jdXJyZW50IHJl YWRlcnMgb2YgdGhlIHR1cGxlOyBubyBvdGhlciB0cmFuc2FjdGlvbiBjYW4gc2VlCgkgKiBp dCB5ZXQuCgkgKi8KCWlmIChpbmRleEluZm8tPmlpX0Jyb2tlbkhvdENoYWluICYmCgkJIWlz cmVpbmRleCAmJgoJCSFpbmRleEluZm8tPmlpX0NvbmN1cnJlbnQpCgl7CgkJT2lkCQkJaW5k ZXhJZCA9IFJlbGF0aW9uR2V0UmVsaWQoaW5kZXhSZWxhdGlvbik7CgkJUmVsYXRpb24JcGdf aW5kZXg7CgkJSGVhcFR1cGxlCWluZGV4VHVwbGU7CgkJRm9ybV9wZ19pbmRleCBpbmRleEZv cm07CgoJCXBnX2luZGV4ID0gdGFibGVfb3BlbihJbmRleFJlbGF0aW9uSWQsIFJvd0V4Y2x1 c2l2ZUxvY2spOwoKCQlpbmRleFR1cGxlID0gU2VhcmNoU3lzQ2FjaGVDb3B5MShJTkRFWFJF TElELAoJCQkJCQkJCQkJIE9iamVjdElkR2V0RGF0dW0oaW5kZXhJZCkpOwoJCWlmICghSGVh cFR1cGxlSXNWYWxpZChpbmRleFR1cGxlKSkKCQkJZWxvZyhFUlJPUiwgImNhY2hlIGxvb2t1 cCBmYWlsZWQgZm9yIGluZGV4ICV1IiwgaW5kZXhJZCk7CgkJaW5kZXhGb3JtID0gKEZvcm1f cGdfaW5kZXgpIEdFVFNUUlVDVChpbmRleFR1cGxlKTsKCgkJLyogSWYgaXQncyBhIG5ldyBp bmRleCwgaW5kY2hlY2t4bWluIHNob3VsZG4ndCBiZSBzZXQgLi4uICovCgkJQXNzZXJ0KCFp bmRleEZvcm0tPmluZGNoZWNreG1pbik7CgoJCWluZGV4Rm9ybS0+aW5kY2hlY2t4bWluID0g dHJ1ZTsKCQlDYXRhbG9nVHVwbGVVcGRhdGUocGdfaW5kZXgsICZpbmRleFR1cGxlLT50X3Nl bGYsIGluZGV4VHVwbGUpOwoKCQloZWFwX2ZyZWV0dXBsZShpbmRleFR1cGxlKTsKCQl0YWJs ZV9jbG9zZShwZ19pbmRleCwgUm93RXhjbHVzaXZlTG9jayk7Cgl9CgoJLyoKCSAqIFVwZGF0 ZSBoZWFwIGFuZCBpbmRleCBwZ19jbGFzcyByb3dzCgkgKi8KCWluZGV4X3VwZGF0ZV9zdGF0 cyhoZWFwUmVsYXRpb24sCgkJCQkJICAgdHJ1ZSwKCQkJCQkgICBzdGF0cy0+aGVhcF90dXBs ZXMpOwoKCWluZGV4X3VwZGF0ZV9zdGF0cyhpbmRleFJlbGF0aW9uLAoJCQkJCSAgIGZhbHNl LAoJCQkJCSAgIHN0YXRzLT5pbmRleF90dXBsZXMpOwoKCS8qIE1ha2UgdGhlIHVwZGF0ZWQg Y2F0YWxvZyByb3cgdmVyc2lvbnMgdmlzaWJsZSAqLwoJQ29tbWFuZENvdW50ZXJJbmNyZW1l bnQoKTsKCgkvKgoJICogSWYgaXQncyBmb3IgYW4gZXhjbHVzaW9uIGNvbnN0cmFpbnQsIG1h a2UgYSBzZWNvbmQgcGFzcyBvdmVyIHRoZSBoZWFwCgkgKiB0byB2ZXJpZnkgdGhhdCB0aGUg Y29uc3RyYWludCBpcyBzYXRpc2ZpZWQuICBXZSBtdXN0IG5vdCBkbyB0aGlzIHVudGlsCgkg KiB0aGUgaW5kZXggaXMgZnVsbHkgdmFsaWQuICAoQnJva2VuIEhPVCBjaGFpbnMgc2hvdWxk bid0IG1hdHRlciwgdGhvdWdoOwoJICogc2VlIGNvbW1lbnRzIGZvciBJbmRleENoZWNrRXhj bHVzaW9uLikKCSAqLwoJaWYgKGluZGV4SW5mby0+aWlfRXhjbHVzaW9uT3BzICE9IE5VTEwp CgkJSW5kZXhDaGVja0V4Y2x1c2lvbihoZWFwUmVsYXRpb24sIGluZGV4UmVsYXRpb24sIGlu ZGV4SW5mbyk7CgoJLyogUm9sbCBiYWNrIGFueSBHVUMgY2hhbmdlcyBleGVjdXRlZCBieSBp bmRleCBmdW5jdGlvbnMgKi8KCUF0RU9YYWN0X0dVQyhmYWxzZSwgc2F2ZV9uZXN0bGV2ZWwp OwoKCS8qIFJlc3RvcmUgdXNlcmlkIGFuZCBzZWN1cml0eSBjb250ZXh0ICovCglTZXRVc2Vy SWRBbmRTZWNDb250ZXh0KHNhdmVfdXNlcmlkLCBzYXZlX3NlY19jb250ZXh0KTsKfQoKLyoK ICogSW5kZXhDaGVja0V4Y2x1c2lvbiAtIHZlcmlmeSB0aGF0IGEgbmV3IGV4Y2x1c2lvbiBj b25zdHJhaW50IGlzIHNhdGlzZmllZAogKgogKiBXaGVuIGNyZWF0aW5nIGFuIGV4Y2x1c2lv biBjb25zdHJhaW50LCB3ZSBmaXJzdCBidWlsZCB0aGUgaW5kZXggbm9ybWFsbHkKICogYW5k IHRoZW4gcmVzY2FuIHRoZSBoZWFwIHRvIGNoZWNrIGZvciBjb25mbGljdHMuICBXZSBhc3N1 bWUgdGhhdCB3ZSBvbmx5CiAqIG5lZWQgdG8gdmFsaWRhdGUgdHVwbGVzIHRoYXQgYXJlIGxp dmUgYWNjb3JkaW5nIHRvIGFuIHVwLXRvLWRhdGUgc25hcHNob3QsCiAqIGFuZCB0aGF0IHRo ZXNlIHdlcmUgY29ycmVjdGx5IGluZGV4ZWQgZXZlbiBpbiB0aGUgcHJlc2VuY2Ugb2YgYnJv a2VuIEhPVAogKiBjaGFpbnMuICBUaGlzIHNob3VsZCBiZSBPSyBzaW5jZSB3ZSBhcmUgaG9s ZGluZyBhdCBsZWFzdCBTaGFyZUxvY2sgb24gdGhlCiAqIHRhYmxlLCBtZWFuaW5nIHRoZXJl IGNhbiBiZSBubyB1bmNvbW1pdHRlZCB1cGRhdGVzIGZyb20gb3RoZXIgdHJhbnNhY3Rpb25z LgogKiAoTm90ZTogdGhhdCB3b3VsZG4ndCBuZWNlc3NhcmlseSB3b3JrIGZvciBzeXN0ZW0g Y2F0YWxvZ3MsIHNpbmNlIG1hbnkKICogb3BlcmF0aW9ucyByZWxlYXNlIHdyaXRlIGxvY2sg ZWFybHkgb24gdGhlIHN5c3RlbSBjYXRhbG9ncy4pCiAqLwpzdGF0aWMgdm9pZApJbmRleENo ZWNrRXhjbHVzaW9uKFJlbGF0aW9uIGhlYXBSZWxhdGlvbiwKCQkJCQlSZWxhdGlvbiBpbmRl eFJlbGF0aW9uLAoJCQkJCUluZGV4SW5mbyAqaW5kZXhJbmZvKQp7CglUYWJsZVNjYW5EZXNj IHNjYW47CglEYXR1bQkJdmFsdWVzW0lOREVYX01BWF9LRVlTXTsKCWJvb2wJCWlzbnVsbFtJ TkRFWF9NQVhfS0VZU107CglFeHByU3RhdGUgICpwcmVkaWNhdGVFeHBhbmQ7CglUdXBsZVRh YmxlU2xvdCAqc2xvdDsKCUVTdGF0ZQkgICAqZXN0YXRlOwoJRXhwckNvbnRleHQgKmVjb250 ZXh0OwoJU25hcHNob3QJc25hcHNob3Q7CgoJLyoKCSAqIElmIHdlIGFyZSByZWluZGV4aW5n IHRoZSB0YXJnZXQgaW5kZXgsIG1hcmsgaXQgYXMgbm8gbG9uZ2VyIGJlaW5nCgkgKiByZWlu ZGV4ZWQsIHRvIGZvcmVzdGFsbCBhbiBBc3NlcnQgaW4gaW5kZXhfYmVnaW5zY2FuIHdoZW4g d2UgdHJ5IHRvIHVzZQoJICogdGhlIGluZGV4IGZvciBwcm9iZXMuICBUaGlzIGlzIE9LIGJl Y2F1c2UgdGhlIGluZGV4IGlzIG5vdyBmdWxseSB2YWxpZC4KCSAqLwoJaWYgKFJlaW5kZXhJ c0N1cnJlbnRseVByb2Nlc3NpbmdJbmRleChSZWxhdGlvbkdldFJlbGlkKGluZGV4UmVsYXRp b24pKSkKCQlSZXNldFJlaW5kZXhQcm9jZXNzaW5nKCk7CgoJLyoKCSAqIE5lZWQgYW4gRVN0 YXRlIGZvciBldmFsdWF0aW9uIG9mIGluZGV4IGV4cHJlc3Npb25zIGFuZCBwYXJ0aWFsLWlu ZGV4CgkgKiBwcmVkaWNhdGVzLiAgQWxzbyBhIHNsb3QgdG8gaG9sZCB0aGUgY3VycmVudCB0 dXBsZS4KCSAqLwoJZXN0YXRlID0gQ3JlYXRlRXhlY3V0b3JTdGF0ZSgpOwoJZWNvbnRleHQg PSBHZXRQZXJUdXBsZUV4cHJDb250ZXh0KGVzdGF0ZSk7CglzbG90ID0gdGFibGVfc2xvdF9j cmVhdGUoaGVhcFJlbGF0aW9uLCBOVUxMKTsKCgkvKiBBcnJhbmdlIGZvciBlY29udGV4dCdz IHNjYW4gdHVwbGUgdG8gYmUgdGhlIHR1cGxlIHVuZGVyIHRlc3QgKi8KCWVjb250ZXh0LT5l Y3h0X3NjYW50dXBsZSA9IHNsb3Q7CgoJLyogU2V0IHVwIGV4ZWN1dGlvbiBzdGF0ZSBmb3Ig cHJlZGljYXRlLCBpZiBhbnkuICovCglwcmVkaWNhdGVFeHBhbmQgPSBFeGVjUHJlcGFyZVF1 YWwoaW5kZXhJbmZvLT5paV9QcmVkaWNhdGVFeHBhbmQsIGVzdGF0ZSk7CgoJLyoKCSAqIFNj YW4gYWxsIGxpdmUgdHVwbGVzIGluIHRoZSBiYXNlIHJlbGF0aW9uLgoJICovCglzbmFwc2hv dCA9IFJlZ2lzdGVyU25hcHNob3QoR2V0TGF0ZXN0U25hcHNob3QoKSk7CglzY2FuID0gdGFi bGVfYmVnaW5zY2FuX3N0cmF0KGhlYXBSZWxhdGlvbiwJLyogcmVsYXRpb24gKi8KCQkJCQkJ CQkgc25hcHNob3QsCS8qIHNuYXBzaG90ICovCgkJCQkJCQkJIDAsIC8qIG51bWJlciBvZiBr ZXlzICovCgkJCQkJCQkJIE5VTEwsCS8qIHNjYW4ga2V5ICovCgkJCQkJCQkJIHRydWUsCS8q IGJ1ZmZlciBhY2Nlc3Mgc3RyYXRlZ3kgT0sgKi8KCQkJCQkJCQkgdHJ1ZSk7IC8qIHN5bmNz Y2FuIE9LICovCgoJd2hpbGUgKHRhYmxlX3NjYW5fZ2V0bmV4dHNsb3Qoc2NhbiwgRm9yd2Fy ZFNjYW5EaXJlY3Rpb24sIHNsb3QpKQoJewoJCUNIRUNLX0ZPUl9JTlRFUlJVUFRTKCk7CgoJ CS8qCgkJICogSW4gYSBwYXJ0aWFsIGluZGV4LCBpZ25vcmUgdHVwbGVzIHRoYXQgZG9uJ3Qg c2F0aXNmeSB0aGUgcHJlZGljYXRlLgoJCSAqLwoJCWlmIChwcmVkaWNhdGVFeHBhbmQgIT0g TlVMTCkKCQl7CgkJCWlmICghRXhlY1F1YWwocHJlZGljYXRlRXhwYW5kLCBlY29udGV4dCkp CgkJCQljb250aW51ZTsKCQl9CgoJCS8qCgkJICogRXh0cmFjdCBpbmRleCBjb2x1bW4gdmFs dWVzLCBpbmNsdWRpbmcgY29tcHV0aW5nIGV4cHJlc3Npb25zLgoJCSAqLwoJCUZvcm1JbmRl eERhdHVtKGluZGV4SW5mbywKCQkJCQkgICBzbG90LAoJCQkJCSAgIGVzdGF0ZSwKCQkJCQkg ICB2YWx1ZXMsCgkJCQkJICAgaXNudWxsKTsKCgkJLyoKCQkgKiBDaGVjayB0aGF0IHRoaXMg dHVwbGUgaGFzIG5vIGNvbmZsaWN0cy4KCQkgKi8KCQljaGVja19leGNsdXNpb25fY29uc3Ry YWludChoZWFwUmVsYXRpb24sCgkJCQkJCQkJICAgaW5kZXhSZWxhdGlvbiwgaW5kZXhJbmZv LAoJCQkJCQkJCSAgICYoc2xvdC0+dHRzX3RpZCksIHZhbHVlcywgaXNudWxsLAoJCQkJCQkJ CSAgIGVzdGF0ZSwgdHJ1ZSk7CgoJCU1lbW9yeUNvbnRleHRSZXNldChlY29udGV4dC0+ZWN4 dF9wZXJfdHVwbGVfbWVtb3J5KTsKCX0KCgl0YWJsZV9lbmRzY2FuKHNjYW4pOwoJVW5yZWdp c3RlclNuYXBzaG90KHNuYXBzaG90KTsKCglFeGVjRHJvcFNpbmdsZVR1cGxlVGFibGVTbG90 KHNsb3QpOwoKCUZyZWVFeGVjdXRvclN0YXRlKGVzdGF0ZSk7CgoJLyogVGhlc2UgbWF5IGhh dmUgYmVlbiBwb2ludGluZyB0byB0aGUgbm93LWdvbmUgZXN0YXRlICovCglpbmRleEluZm8t PmlpX0V4cHJlc3Npb25zU3RhdGUgPSBOSUw7CglpbmRleEluZm8tPmlpX0V4cHJlc3Npb25z RXhwYW5kU3RhdGUgPSBOSUw7CglpbmRleEluZm8tPmlpX1ByZWRpY2F0ZVN0YXRlID0gTlVM TDsKCWluZGV4SW5mby0+aWlfUHJlZGljYXRlRXhwYW5kU3RhdGUgPSBOVUxMOwp9CgovKgog KiB2YWxpZGF0ZV9pbmRleCAtIHN1cHBvcnQgY29kZSBmb3IgY29uY3VycmVudCBpbmRleCBi dWlsZHMKICoKICogV2UgZG8gYSBjb25jdXJyZW50IGluZGV4IGJ1aWxkIGJ5IGZpcnN0IGlu c2VydGluZyB0aGUgY2F0YWxvZyBlbnRyeSBmb3IgdGhlCiAqIGluZGV4IHZpYSBpbmRleF9j cmVhdGUoKSwgbWFya2luZyBpdCBub3QgaW5kaXNyZWFkeSBhbmQgbm90IGluZGlzdmFsaWQu CiAqIFRoZW4gd2UgY29tbWl0IG91ciB0cmFuc2FjdGlvbiBhbmQgc3RhcnQgYSBuZXcgb25l LCB0aGVuIHdlIHdhaXQgZm9yIGFsbAogKiB0cmFuc2FjdGlvbnMgdGhhdCBjb3VsZCBoYXZl IGJlZW4gbW9kaWZ5aW5nIHRoZSB0YWJsZSB0byB0ZXJtaW5hdGUuICBOb3cKICogd2Uga25v dyB0aGF0IGFueSBzdWJzZXF1ZW50bHktc3RhcnRlZCB0cmFuc2FjdGlvbnMgd2lsbCBzZWUg dGhlIGluZGV4IGFuZAogKiBob25vciBpdHMgY29uc3RyYWludHMgb24gSE9UIHVwZGF0ZXM7 IHNvIHdoaWxlIGV4aXN0aW5nIEhPVC1jaGFpbnMgbWlnaHQKICogYmUgYnJva2VuIHdpdGgg cmVzcGVjdCB0byB0aGUgaW5kZXgsIG5vIGN1cnJlbnRseSBsaXZlIHR1cGxlIHdpbGwgaGF2 ZSBhbgogKiBpbmNvbXBhdGlibGUgSE9UIHVwZGF0ZSBkb25lIHRvIGl0LiAgV2Ugbm93IGJ1 aWxkIHRoZSBpbmRleCBub3JtYWxseSB2aWEKICogaW5kZXhfYnVpbGQoKSwgd2hpbGUgaG9s ZGluZyBhIHdlYWsgbG9jayB0aGF0IGFsbG93cyBjb25jdXJyZW50CiAqIGluc2VydC91cGRh dGUvZGVsZXRlLiAgQWxzbywgd2UgaW5kZXggb25seSB0dXBsZXMgdGhhdCBhcmUgdmFsaWQK ICogYXMgb2YgdGhlIHN0YXJ0IG9mIHRoZSBzY2FuIChzZWUgdGFibGVfaW5kZXhfYnVpbGRf c2NhbiksIHdoZXJlYXMgYSBub3JtYWwKICogYnVpbGQgdGFrZXMgY2FyZSB0byBpbmNsdWRl IHJlY2VudGx5LWRlYWQgdHVwbGVzLiAgVGhpcyBpcyBPSyBiZWNhdXNlCiAqIHdlIHdvbid0 IG1hcmsgdGhlIGluZGV4IHZhbGlkIHVudGlsIGFsbCB0cmFuc2FjdGlvbnMgdGhhdCBtaWdo dCBiZSBhYmxlCiAqIHRvIHNlZSB0aG9zZSB0dXBsZXMgYXJlIGdvbmUuICBUaGUgcmVhc29u IGZvciBkb2luZyB0aGF0IGlzIHRvIGF2b2lkCiAqIGJvZ3VzIHVuaXF1ZS1pbmRleCBmYWls dXJlcyBkdWUgdG8gY29uY3VycmVudCBVUERBVEVzICh3ZSBtaWdodCBzZWUKICogZGlmZmVy ZW50IHZlcnNpb25zIG9mIHRoZSBzYW1lIHJvdyBhcyBiZWluZyB2YWxpZCB3aGVuIHdlIHBh c3Mgb3ZlciB0aGVtLAogKiBpZiB3ZSB1c2VkIEhlYXBUdXBsZVNhdGlzZmllc1ZhY3V1bSku ICBUaGlzIGxlYXZlcyB1cyB3aXRoIGFuIGluZGV4IHRoYXQKICogZG9lcyBub3QgY29udGFp biBhbnkgdHVwbGVzIGFkZGVkIHRvIHRoZSB0YWJsZSB3aGlsZSB3ZSBidWlsdCB0aGUgaW5k ZXguCiAqCiAqIE5leHQsIHdlIG1hcmsgdGhlIGluZGV4ICJpbmRpc3JlYWR5IiAoYnV0IHN0 aWxsIG5vdCAiaW5kaXN2YWxpZCIpIGFuZAogKiBjb21taXQgdGhlIHNlY29uZCB0cmFuc2Fj dGlvbiBhbmQgc3RhcnQgYSB0aGlyZC4gIEFnYWluIHdlIHdhaXQgZm9yIGFsbAogKiB0cmFu c2FjdGlvbnMgdGhhdCBjb3VsZCBoYXZlIGJlZW4gbW9kaWZ5aW5nIHRoZSB0YWJsZSB0byB0 ZXJtaW5hdGUuICBOb3cKICogd2Uga25vdyB0aGF0IGFueSBzdWJzZXF1ZW50bHktc3RhcnRl ZCB0cmFuc2FjdGlvbnMgd2lsbCBzZWUgdGhlIGluZGV4IGFuZAogKiBpbnNlcnQgdGhlaXIg bmV3IHR1cGxlcyBpbnRvIGl0LiAgV2UgdGhlbiB0YWtlIGEgbmV3IHJlZmVyZW5jZSBzbmFw c2hvdAogKiB3aGljaCBpcyBwYXNzZWQgdG8gdmFsaWRhdGVfaW5kZXgoKS4gIEFueSB0dXBs ZXMgdGhhdCBhcmUgdmFsaWQgYWNjb3JkaW5nCiAqIHRvIHRoaXMgc25hcCwgYnV0IGFyZSBu b3QgaW4gdGhlIGluZGV4LCBtdXN0IGJlIGFkZGVkIHRvIHRoZSBpbmRleC4KICogKEFueSB0 dXBsZXMgY29tbWl0dGVkIGxpdmUgYWZ0ZXIgdGhlIHNuYXAgd2lsbCBiZSBpbnNlcnRlZCBp bnRvIHRoZQogKiBpbmRleCBieSB0aGVpciBvcmlnaW5hdGluZyB0cmFuc2FjdGlvbi4gIEFu eSB0dXBsZXMgY29tbWl0dGVkIGRlYWQgYmVmb3JlCiAqIHRoZSBzbmFwIG5lZWQgbm90IGJl IGluZGV4ZWQsIGJlY2F1c2Ugd2Ugd2lsbCB3YWl0IG91dCBhbGwgdHJhbnNhY3Rpb25zCiAq IHRoYXQgbWlnaHQgY2FyZSBhYm91dCB0aGVtIGJlZm9yZSB3ZSBtYXJrIHRoZSBpbmRleCB2 YWxpZC4pCiAqCiAqIHZhbGlkYXRlX2luZGV4KCkgd29ya3MgYnkgZmlyc3QgZ2F0aGVyaW5n IGFsbCB0aGUgVElEcyBjdXJyZW50bHkgaW4gdGhlCiAqIGluZGV4LCB1c2luZyBhIGJ1bGtk ZWxldGUgY2FsbGJhY2sgdGhhdCBqdXN0IHN0b3JlcyB0aGUgVElEcyBhbmQgZG9lc24ndAog KiBldmVyIHNheSAiZGVsZXRlIGl0Ii4gIChUaGlzIHNob3VsZCBiZSBmYXN0ZXIgdGhhbiBh IHBsYWluIGluZGV4c2NhbjsKICogYWxzbywgbm90IGFsbCBpbmRleCBBTXMgc3VwcG9ydCBm dWxsLWluZGV4IGluZGV4c2Nhbi4pICBUaGVuIHdlIHNvcnQgdGhlCiAqIFRJRHMsIGFuZCBm aW5hbGx5IHNjYW4gdGhlIHRhYmxlIGRvaW5nIGEgIm1lcmdlIGpvaW4iIGFnYWluc3QgdGhl IFRJRCBsaXN0CiAqIHRvIHNlZSB3aGljaCB0dXBsZXMgYXJlIG1pc3NpbmcgZnJvbSB0aGUg aW5kZXguICBUaHVzIHdlIHdpbGwgZW5zdXJlIHRoYXQKICogYWxsIHR1cGxlcyB2YWxpZCBh Y2NvcmRpbmcgdG8gdGhlIHJlZmVyZW5jZSBzbmFwc2hvdCBhcmUgaW4gdGhlIGluZGV4Lgog KgogKiBCdWlsZGluZyBhIHVuaXF1ZSBpbmRleCB0aGlzIHdheSBpcyB0cmlja3k6IHdlIG1p Z2h0IHRyeSB0byBpbnNlcnQgYQogKiB0dXBsZSB0aGF0IGlzIGFscmVhZHkgZGVhZCBvciBp cyBpbiBwcm9jZXNzIG9mIGJlaW5nIGRlbGV0ZWQsIGFuZCB3ZQogKiBtdXN0bid0IGhhdmUg YSB1bmlxdWVuZXNzIGZhaWx1cmUgYWdhaW5zdCBhbiB1cGRhdGVkIHZlcnNpb24gb2YgdGhl IHNhbWUKICogcm93LiAgV2UgY291bGQgdHJ5IHRvIGNoZWNrIHRoZSB0dXBsZSB0byBzZWUg aWYgaXQncyBhbHJlYWR5IGRlYWQgYW5kIHRlbGwKICogaW5kZXhfaW5zZXJ0KCkgbm90IHRv IGRvIHRoZSB1bmlxdWVuZXNzIGNoZWNrLCBidXQgdGhhdCBzdGlsbCBsZWF2ZXMgdXMKICog d2l0aCBhIHJhY2UgY29uZGl0aW9uIGFnYWluc3QgYW4gaW4tcHJvZ3Jlc3MgdXBkYXRlLiAg VG8gaGFuZGxlIHRoYXQsCiAqIHdlIGV4cGVjdCB0aGUgaW5kZXggQU0gdG8gcmVjaGVjayBs aXZlbmVzcyBvZiB0aGUgdG8tYmUtaW5zZXJ0ZWQgdHVwbGUKICogYmVmb3JlIGl0IGRlY2xh cmVzIGEgdW5pcXVlbmVzcyBlcnJvci4KICoKICogQWZ0ZXIgY29tcGxldGluZyB2YWxpZGF0 ZV9pbmRleCgpLCB3ZSB3YWl0IHVudGlsIGFsbCB0cmFuc2FjdGlvbnMgdGhhdAogKiB3ZXJl IGFsaXZlIGF0IHRoZSB0aW1lIG9mIHRoZSByZWZlcmVuY2Ugc25hcHNob3QgYXJlIGdvbmU7 IHRoaXMgaXMKICogbmVjZXNzYXJ5IHRvIGJlIHN1cmUgdGhlcmUgYXJlIG5vbmUgbGVmdCB3 aXRoIGEgdHJhbnNhY3Rpb24gc25hcHNob3QKICogb2xkZXIgdGhhbiB0aGUgcmVmZXJlbmNl IChhbmQgaGVuY2UgcG9zc2libHkgYWJsZSB0byBzZWUgdHVwbGVzIHdlIGRpZAogKiBub3Qg aW5kZXgpLiAgVGhlbiB3ZSBtYXJrIHRoZSBpbmRleCAiaW5kaXN2YWxpZCIgYW5kIGNvbW1p dC4gIFN1YnNlcXVlbnQKICogdHJhbnNhY3Rpb25zIHdpbGwgYmUgYWJsZSB0byB1c2UgaXQg Zm9yIHF1ZXJpZXMuCiAqCiAqIERvaW5nIHR3byBmdWxsIHRhYmxlIHNjYW5zIGlzIGEgYnJ1 dGUtZm9yY2Ugc3RyYXRlZ3kuICBXZSBjb3VsZCB0cnkgdG8gYmUKICogY2xldmVyZXIsIGVn IHN0b3JpbmcgbmV3IHR1cGxlcyBpbiBhIHNwZWNpYWwgYXJlYSBvZiB0aGUgdGFibGUgKHBl cmhhcHMKICogbWFraW5nIHRoZSB0YWJsZSBhcHBlbmQtb25seSBieSBzZXR0aW5nIHVzZV9m c20pLiAgSG93ZXZlciB0aGF0IHdvdWxkCiAqIGFkZCB5ZXQgbW9yZSBsb2NraW5nIGlzc3Vl cy4KICovCnZvaWQKdmFsaWRhdGVfaW5kZXgoT2lkIGhlYXBJZCwgT2lkIGluZGV4SWQsIFNu YXBzaG90IHNuYXBzaG90KQp7CglSZWxhdGlvbgloZWFwUmVsYXRpb24sCgkJCQlpbmRleFJl bGF0aW9uOwoJSW5kZXhJbmZvICAqaW5kZXhJbmZvOwoJSW5kZXhWYWN1dW1JbmZvIGl2aW5m bzsKCVZhbGlkYXRlSW5kZXhTdGF0ZSBzdGF0ZTsKCU9pZAkJCXNhdmVfdXNlcmlkOwoJaW50 CQkJc2F2ZV9zZWNfY29udGV4dDsKCWludAkJCXNhdmVfbmVzdGxldmVsOwoKCXsKCQljb25z dCBpbnQJcHJvZ3Jlc3NfaW5kZXhbXSA9IHsKCQkJUFJPR1JFU1NfQ1JFQVRFSURYX1BIQVNF LAoJCQlQUk9HUkVTU19DUkVBVEVJRFhfVFVQTEVTX0RPTkUsCgkJCVBST0dSRVNTX0NSRUFU RUlEWF9UVVBMRVNfVE9UQUwsCgkJCVBST0dSRVNTX1NDQU5fQkxPQ0tTX0RPTkUsCgkJCVBS T0dSRVNTX1NDQU5fQkxPQ0tTX1RPVEFMCgkJfTsKCQljb25zdCBpbnQ2NCBwcm9ncmVzc192 YWxzW10gPSB7CgkJCVBST0dSRVNTX0NSRUFURUlEWF9QSEFTRV9WQUxJREFURV9JRFhTQ0FO LAoJCQkwLCAwLCAwLCAwCgkJfTsKCgkJcGdzdGF0X3Byb2dyZXNzX3VwZGF0ZV9tdWx0aV9w YXJhbSg1LCBwcm9ncmVzc19pbmRleCwgcHJvZ3Jlc3NfdmFscyk7Cgl9CgoJLyogT3BlbiBh bmQgbG9jayB0aGUgcGFyZW50IGhlYXAgcmVsYXRpb24gKi8KCWhlYXBSZWxhdGlvbiA9IHRh YmxlX29wZW4oaGVhcElkLCBTaGFyZVVwZGF0ZUV4Y2x1c2l2ZUxvY2spOwoKCS8qCgkgKiBT d2l0Y2ggdG8gdGhlIHRhYmxlIG93bmVyJ3MgdXNlcmlkLCBzbyB0aGF0IGFueSBpbmRleCBm dW5jdGlvbnMgYXJlIHJ1bgoJICogYXMgdGhhdCB1c2VyLiAgQWxzbyBsb2NrIGRvd24gc2Vj dXJpdHktcmVzdHJpY3RlZCBvcGVyYXRpb25zIGFuZAoJICogYXJyYW5nZSB0byBtYWtlIEdV QyB2YXJpYWJsZSBjaGFuZ2VzIGxvY2FsIHRvIHRoaXMgY29tbWFuZC4KCSAqLwoJR2V0VXNl cklkQW5kU2VjQ29udGV4dCgmc2F2ZV91c2VyaWQsICZzYXZlX3NlY19jb250ZXh0KTsKCVNl dFVzZXJJZEFuZFNlY0NvbnRleHQoaGVhcFJlbGF0aW9uLT5yZF9yZWwtPnJlbG93bmVyLAoJ CQkJCQkgICBzYXZlX3NlY19jb250ZXh0IHwgU0VDVVJJVFlfUkVTVFJJQ1RFRF9PUEVSQVRJ T04pOwoJc2F2ZV9uZXN0bGV2ZWwgPSBOZXdHVUNOZXN0TGV2ZWwoKTsKCVJlc3RyaWN0U2Vh cmNoUGF0aCgpOwoKCWluZGV4UmVsYXRpb24gPSBpbmRleF9vcGVuKGluZGV4SWQsIFJvd0V4 Y2x1c2l2ZUxvY2spOwoKCS8qCgkgKiBGZXRjaCBpbmZvIG5lZWRlZCBmb3IgaW5kZXhfaW5z ZXJ0LiAgKFlvdSBtaWdodCB0aGluayB0aGlzIHNob3VsZCBiZQoJICogcGFzc2VkIGluIGZy b20gRGVmaW5lSW5kZXgsIGJ1dCBpdHMgY29weSBpcyBsb25nIGdvbmUgZHVlIHRvIGhhdmlu ZwoJICogYmVlbiBidWlsdCBpbiBhIHByZXZpb3VzIHRyYW5zYWN0aW9uLikKCSAqLwoJaW5k ZXhJbmZvID0gQnVpbGRJbmRleEluZm8oaW5kZXhSZWxhdGlvbik7CgoJLyogbWFyayBidWls ZCBpcyBjb25jdXJyZW50IGp1c3QgZm9yIGNvbnNpc3RlbmN5ICovCglpbmRleEluZm8tPmlp X0NvbmN1cnJlbnQgPSB0cnVlOwoKCS8qCgkgKiBTY2FuIHRoZSBpbmRleCBhbmQgZ2F0aGVy IHVwIGFsbCB0aGUgVElEcyBpbnRvIGEgdHVwbGVzb3J0IG9iamVjdC4KCSAqLwoJaXZpbmZv LmluZGV4ID0gaW5kZXhSZWxhdGlvbjsKCWl2aW5mby5oZWFwcmVsID0gaGVhcFJlbGF0aW9u OwoJaXZpbmZvLmFuYWx5emVfb25seSA9IGZhbHNlOwoJaXZpbmZvLnJlcG9ydF9wcm9ncmVz cyA9IHRydWU7CglpdmluZm8uZXN0aW1hdGVkX2NvdW50ID0gdHJ1ZTsKCWl2aW5mby5tZXNz YWdlX2xldmVsID0gREVCVUcyOwoJaXZpbmZvLm51bV9oZWFwX3R1cGxlcyA9IGhlYXBSZWxh dGlvbi0+cmRfcmVsLT5yZWx0dXBsZXM7CglpdmluZm8uc3RyYXRlZ3kgPSBOVUxMOwoKCS8q CgkgKiBFbmNvZGUgVElEcyBhcyBpbnQ4IHZhbHVlcyBmb3IgdGhlIHNvcnQsIHJhdGhlciB0 aGFuIGRpcmVjdGx5IHNvcnRpbmcKCSAqIGl0ZW0gcG9pbnRlcnMuICBUaGlzIGNhbiBiZSBz aWduaWZpY2FudGx5IGZhc3RlciwgcHJpbWFyaWx5IGJlY2F1c2UgVElECgkgKiBpcyBhIHBh c3MtYnktcmVmZXJlbmNlIHR5cGUgb24gYWxsIHBsYXRmb3Jtcywgd2hlcmVhcyBpbnQ4IGlz CgkgKiBwYXNzLWJ5LXZhbHVlIG9uIG1vc3QgcGxhdGZvcm1zLgoJICovCglzdGF0ZS50dXBs ZXNvcnQgPSB0dXBsZXNvcnRfYmVnaW5fZGF0dW0oSU5UOE9JRCwgSW50OExlc3NPcGVyYXRv ciwKCQkJCQkJCQkJCQlJbnZhbGlkT2lkLCBmYWxzZSwKCQkJCQkJCQkJCQltYWludGVuYW5j ZV93b3JrX21lbSwKCQkJCQkJCQkJCQlOVUxMLCBUVVBMRVNPUlRfTk9ORSk7CglzdGF0ZS5o dHVwcyA9IHN0YXRlLml0dXBzID0gc3RhdGUudHVwc19pbnNlcnRlZCA9IDA7CgoJLyogYW1i dWxrZGVsZXRlIHVwZGF0ZXMgcHJvZ3Jlc3MgbWV0cmljcyAqLwoJKHZvaWQpIGluZGV4X2J1 bGtfZGVsZXRlKCZpdmluZm8sIE5VTEwsCgkJCQkJCQkgdmFsaWRhdGVfaW5kZXhfY2FsbGJh Y2ssICZzdGF0ZSk7CgoJLyogRXhlY3V0ZSB0aGUgc29ydCAqLwoJewoJCWNvbnN0IGludAlw cm9ncmVzc19pbmRleFtdID0gewoJCQlQUk9HUkVTU19DUkVBVEVJRFhfUEhBU0UsCgkJCVBS T0dSRVNTX1NDQU5fQkxPQ0tTX0RPTkUsCgkJCVBST0dSRVNTX1NDQU5fQkxPQ0tTX1RPVEFM CgkJfTsKCQljb25zdCBpbnQ2NCBwcm9ncmVzc192YWxzW10gPSB7CgkJCVBST0dSRVNTX0NS RUFURUlEWF9QSEFTRV9WQUxJREFURV9TT1JULAoJCQkwLCAwCgkJfTsKCgkJcGdzdGF0X3By b2dyZXNzX3VwZGF0ZV9tdWx0aV9wYXJhbSgzLCBwcm9ncmVzc19pbmRleCwgcHJvZ3Jlc3Nf dmFscyk7Cgl9Cgl0dXBsZXNvcnRfcGVyZm9ybXNvcnQoc3RhdGUudHVwbGVzb3J0KTsKCgkv KgoJICogTm93IHNjYW4gdGhlIGhlYXAgYW5kICJtZXJnZSIgaXQgd2l0aCB0aGUgaW5kZXgK CSAqLwoJcGdzdGF0X3Byb2dyZXNzX3VwZGF0ZV9wYXJhbShQUk9HUkVTU19DUkVBVEVJRFhf UEhBU0UsCgkJCQkJCQkJIFBST0dSRVNTX0NSRUFURUlEWF9QSEFTRV9WQUxJREFURV9UQUJM RVNDQU4pOwoJdGFibGVfaW5kZXhfdmFsaWRhdGVfc2NhbihoZWFwUmVsYXRpb24sCgkJCQkJ CQkgIGluZGV4UmVsYXRpb24sCgkJCQkJCQkgIGluZGV4SW5mbywKCQkJCQkJCSAgc25hcHNo b3QsCgkJCQkJCQkgICZzdGF0ZSk7CgoJLyogRG9uZSB3aXRoIHR1cGxlc29ydCBvYmplY3Qg Ki8KCXR1cGxlc29ydF9lbmQoc3RhdGUudHVwbGVzb3J0KTsKCgkvKiBNYWtlIHN1cmUgdG8g cmVsZWFzZSByZXNvdXJjZXMgY2FjaGVkIGluIGluZGV4SW5mbyAoaWYgbmVlZGVkKS4gKi8K CWluZGV4X2luc2VydF9jbGVhbnVwKGluZGV4UmVsYXRpb24sIGluZGV4SW5mbyk7CgoJZWxv ZyhERUJVRzIsCgkJICJ2YWxpZGF0ZV9pbmRleCBmb3VuZCAlLjBmIGhlYXAgdHVwbGVzLCAl LjBmIGluZGV4IHR1cGxlczsgaW5zZXJ0ZWQgJS4wZiBtaXNzaW5nIHR1cGxlcyIsCgkJIHN0 YXRlLmh0dXBzLCBzdGF0ZS5pdHVwcywgc3RhdGUudHVwc19pbnNlcnRlZCk7CgoJLyogUm9s bCBiYWNrIGFueSBHVUMgY2hhbmdlcyBleGVjdXRlZCBieSBpbmRleCBmdW5jdGlvbnMgKi8K CUF0RU9YYWN0X0dVQyhmYWxzZSwgc2F2ZV9uZXN0bGV2ZWwpOwoKCS8qIFJlc3RvcmUgdXNl cmlkIGFuZCBzZWN1cml0eSBjb250ZXh0ICovCglTZXRVc2VySWRBbmRTZWNDb250ZXh0KHNh dmVfdXNlcmlkLCBzYXZlX3NlY19jb250ZXh0KTsKCgkvKiBDbG9zZSByZWxzLCBidXQga2Vl cCBsb2NrcyAqLwoJaW5kZXhfY2xvc2UoaW5kZXhSZWxhdGlvbiwgTm9Mb2NrKTsKCXRhYmxl X2Nsb3NlKGhlYXBSZWxhdGlvbiwgTm9Mb2NrKTsKfQoKLyoKICogdmFsaWRhdGVfaW5kZXhf Y2FsbGJhY2sgLSBidWxrZGVsZXRlIGNhbGxiYWNrIHRvIGNvbGxlY3QgdGhlIGluZGV4IFRJ RHMKICovCnN0YXRpYyBib29sCnZhbGlkYXRlX2luZGV4X2NhbGxiYWNrKEl0ZW1Qb2ludGVy IGl0ZW1wdHIsIHZvaWQgKm9wYXF1ZSkKewoJVmFsaWRhdGVJbmRleFN0YXRlICpzdGF0ZSA9 IChWYWxpZGF0ZUluZGV4U3RhdGUgKikgb3BhcXVlOwoJaW50NjQJCWVuY29kZWQgPSBpdGVt cHRyX2VuY29kZShpdGVtcHRyKTsKCgl0dXBsZXNvcnRfcHV0ZGF0dW0oc3RhdGUtPnR1cGxl c29ydCwgSW50NjRHZXREYXR1bShlbmNvZGVkKSwgZmFsc2UpOwoJc3RhdGUtPml0dXBzICs9 IDE7CglyZXR1cm4gZmFsc2U7CQkJCS8qIG5ldmVyIGFjdHVhbGx5IGRlbGV0ZSBhbnl0aGlu ZyAqLwp9CgovKgogKiBpbmRleF9zZXRfc3RhdGVfZmxhZ3MgLSBhZGp1c3QgcGdfaW5kZXgg c3RhdGUgZmxhZ3MKICoKICogVGhpcyBpcyB1c2VkIGR1cmluZyBDUkVBVEUvRFJPUCBJTkRF WCBDT05DVVJSRU5UTFkgdG8gYWRqdXN0IHRoZSBwZ19pbmRleAogKiBmbGFncyB0aGF0IGRl bm90ZSB0aGUgaW5kZXgncyBzdGF0ZS4KICoKICogTm90ZSB0aGF0IENhdGFsb2dUdXBsZVVw ZGF0ZSgpIHNlbmRzIGEgY2FjaGUgaW52YWxpZGF0aW9uIG1lc3NhZ2UgZm9yIHRoZQogKiB0 dXBsZSwgc28gb3RoZXIgc2Vzc2lvbnMgd2lsbCBoZWFyIGFib3V0IHRoZSB1cGRhdGUgYXMg c29vbiBhcyB3ZSBjb21taXQuCiAqLwp2b2lkCmluZGV4X3NldF9zdGF0ZV9mbGFncyhPaWQg aW5kZXhJZCwgSW5kZXhTdGF0ZUZsYWdzQWN0aW9uIGFjdGlvbikKewoJUmVsYXRpb24JcGdf aW5kZXg7CglIZWFwVHVwbGUJaW5kZXhUdXBsZTsKCUZvcm1fcGdfaW5kZXggaW5kZXhGb3Jt OwoKCS8qIE9wZW4gcGdfaW5kZXggYW5kIGZldGNoIGEgd3JpdGFibGUgY29weSBvZiB0aGUg aW5kZXgncyB0dXBsZSAqLwoJcGdfaW5kZXggPSB0YWJsZV9vcGVuKEluZGV4UmVsYXRpb25J ZCwgUm93RXhjbHVzaXZlTG9jayk7CgoJaW5kZXhUdXBsZSA9IFNlYXJjaFN5c0NhY2hlQ29w eTEoSU5ERVhSRUxJRCwKCQkJCQkJCQkJIE9iamVjdElkR2V0RGF0dW0oaW5kZXhJZCkpOwoJ aWYgKCFIZWFwVHVwbGVJc1ZhbGlkKGluZGV4VHVwbGUpKQoJCWVsb2coRVJST1IsICJjYWNo ZSBsb29rdXAgZmFpbGVkIGZvciBpbmRleCAldSIsIGluZGV4SWQpOwoJaW5kZXhGb3JtID0g KEZvcm1fcGdfaW5kZXgpIEdFVFNUUlVDVChpbmRleFR1cGxlKTsKCgkvKiBQZXJmb3JtIHRo ZSByZXF1ZXN0ZWQgc3RhdGUgY2hhbmdlIG9uIHRoZSBjb3B5ICovCglzd2l0Y2ggKGFjdGlv bikKCXsKCQljYXNlIElOREVYX0NSRUFURV9TRVRfUkVBRFk6CgkJCS8qIFNldCBpbmRpc3Jl YWR5IGR1cmluZyBhIENSRUFURSBJTkRFWCBDT05DVVJSRU5UTFkgc2VxdWVuY2UgKi8KCQkJ QXNzZXJ0KGluZGV4Rm9ybS0+aW5kaXNsaXZlKTsKCQkJQXNzZXJ0KCFpbmRleEZvcm0tPmlu ZGlzcmVhZHkpOwoJCQlBc3NlcnQoIWluZGV4Rm9ybS0+aW5kaXN2YWxpZCk7CgkJCWluZGV4 Rm9ybS0+aW5kaXNyZWFkeSA9IHRydWU7CgkJCWJyZWFrOwoJCWNhc2UgSU5ERVhfQ1JFQVRF X1NFVF9WQUxJRDoKCQkJLyogU2V0IGluZGlzdmFsaWQgZHVyaW5nIGEgQ1JFQVRFIElOREVY IENPTkNVUlJFTlRMWSBzZXF1ZW5jZSAqLwoJCQlBc3NlcnQoaW5kZXhGb3JtLT5pbmRpc2xp dmUpOwoJCQlBc3NlcnQoaW5kZXhGb3JtLT5pbmRpc3JlYWR5KTsKCQkJQXNzZXJ0KCFpbmRl eEZvcm0tPmluZGlzdmFsaWQpOwoJCQlpbmRleEZvcm0tPmluZGlzdmFsaWQgPSB0cnVlOwoJ CQlicmVhazsKCQljYXNlIElOREVYX0RST1BfQ0xFQVJfVkFMSUQ6CgoJCQkvKgoJCQkgKiBD bGVhciBpbmRpc3ZhbGlkIGR1cmluZyBhIERST1AgSU5ERVggQ09OQ1VSUkVOVExZIHNlcXVl bmNlCgkJCSAqCgkJCSAqIElmIGluZGlzcmVhZHkgPT0gdHJ1ZSB3ZSBsZWF2ZSBpdCBzZXQg c28gdGhlIGluZGV4IHN0aWxsIGdldHMKCQkJICogbWFpbnRhaW5lZCBieSBhY3RpdmUgdHJh bnNhY3Rpb25zLiAgV2Ugb25seSBuZWVkIHRvIGVuc3VyZSB0aGF0CgkJCSAqIGluZGlzdmFs aWQgaXMgZmFsc2UuICAoV2UgZG9uJ3QgYXNzZXJ0IHRoYXQgZWl0aGVyIGlzIGluaXRpYWxs eQoJCQkgKiB0cnVlLCB0aG91Z2gsIHNpbmNlIHdlIHdhbnQgdG8gYmUgYWJsZSB0byByZXRy eSBhIERST1AgSU5ERVgKCQkJICogQ09OQ1VSUkVOVExZIHRoYXQgZmFpbGVkIHBhcnR3YXkg dGhyb3VnaC4pCgkJCSAqCgkJCSAqIE5vdGU6IHRoZSBDTFVTVEVSIGxvZ2ljIGFzc3VtZXMg dGhhdCBpbmRpc2NsdXN0ZXJlZCBjYW5ub3QgYmUKCQkJICogc2V0IG9uIGFueSBpbnZhbGlk IGluZGV4LCBzbyBjbGVhciB0aGF0IGZsYWcgdG9vLiAgRm9yCgkJCSAqIGNsZWFubGluZXNz LCBhbHNvIGNsZWFyIGluZGlzcmVwbGlkZW50LgoJCQkgKi8KCQkJaW5kZXhGb3JtLT5pbmRp c3ZhbGlkID0gZmFsc2U7CgkJCWluZGV4Rm9ybS0+aW5kaXNjbHVzdGVyZWQgPSBmYWxzZTsK CQkJaW5kZXhGb3JtLT5pbmRpc3JlcGxpZGVudCA9IGZhbHNlOwoJCQlicmVhazsKCQljYXNl IElOREVYX0RST1BfU0VUX0RFQUQ6CgoJCQkvKgoJCQkgKiBDbGVhciBpbmRpc3JlYWR5L2lu ZGlzbGl2ZSBkdXJpbmcgRFJPUCBJTkRFWCBDT05DVVJSRU5UTFkKCQkJICoKCQkJICogV2Ug Y2xlYXIgYm90aCBpbmRpc3JlYWR5IGFuZCBpbmRpc2xpdmUsIGJlY2F1c2Ugd2Ugbm90IG9u bHkKCQkJICogd2FudCB0byBzdG9wIHVwZGF0ZXMsIHdlIHdhbnQgdG8gcHJldmVudCBzZXNz aW9ucyBmcm9tIHRvdWNoaW5nCgkJCSAqIHRoZSBpbmRleCBhdCBhbGwuCgkJCSAqLwoJCQlB c3NlcnQoIWluZGV4Rm9ybS0+aW5kaXN2YWxpZCk7CgkJCUFzc2VydCghaW5kZXhGb3JtLT5p bmRpc2NsdXN0ZXJlZCk7CgkJCUFzc2VydCghaW5kZXhGb3JtLT5pbmRpc3JlcGxpZGVudCk7 CgkJCWluZGV4Rm9ybS0+aW5kaXNyZWFkeSA9IGZhbHNlOwoJCQlpbmRleEZvcm0tPmluZGlz bGl2ZSA9IGZhbHNlOwoJCQlicmVhazsKCX0KCgkvKiAuLi4gYW5kIHVwZGF0ZSBpdCAqLwoJ Q2F0YWxvZ1R1cGxlVXBkYXRlKHBnX2luZGV4LCAmaW5kZXhUdXBsZS0+dF9zZWxmLCBpbmRl eFR1cGxlKTsKCgl0YWJsZV9jbG9zZShwZ19pbmRleCwgUm93RXhjbHVzaXZlTG9jayk7Cn0K CgovKgogKiBJbmRleEdldFJlbGF0aW9uOiBnaXZlbiBhbiBpbmRleCdzIHJlbGF0aW9uIE9J RCwgZ2V0IHRoZSBPSUQgb2YgdGhlCiAqIHJlbGF0aW9uIGl0IGlzIGFuIGluZGV4IG9uLiAg VXNlcyB0aGUgc3lzdGVtIGNhY2hlLgogKi8KT2lkCkluZGV4R2V0UmVsYXRpb24oT2lkIGlu ZGV4SWQsIGJvb2wgbWlzc2luZ19vaykKewoJSGVhcFR1cGxlCXR1cGxlOwoJRm9ybV9wZ19p bmRleCBpbmRleDsKCU9pZAkJCXJlc3VsdDsKCgl0dXBsZSA9IFNlYXJjaFN5c0NhY2hlMShJ TkRFWFJFTElELCBPYmplY3RJZEdldERhdHVtKGluZGV4SWQpKTsKCWlmICghSGVhcFR1cGxl SXNWYWxpZCh0dXBsZSkpCgl7CgkJaWYgKG1pc3Npbmdfb2spCgkJCXJldHVybiBJbnZhbGlk T2lkOwoJCWVsb2coRVJST1IsICJjYWNoZSBsb29rdXAgZmFpbGVkIGZvciBpbmRleCAldSIs IGluZGV4SWQpOwoJfQoJaW5kZXggPSAoRm9ybV9wZ19pbmRleCkgR0VUU1RSVUNUKHR1cGxl KTsKCUFzc2VydChpbmRleC0+aW5kZXhyZWxpZCA9PSBpbmRleElkKTsKCglyZXN1bHQgPSBp bmRleC0+aW5kcmVsaWQ7CglSZWxlYXNlU3lzQ2FjaGUodHVwbGUpOwoJcmV0dXJuIHJlc3Vs dDsKfQoKLyoKICogcmVpbmRleF9pbmRleCAtIFRoaXMgcm91dGluZSBpcyB1c2VkIHRvIHJl Y3JlYXRlIGEgc2luZ2xlIGluZGV4CiAqLwp2b2lkCnJlaW5kZXhfaW5kZXgoY29uc3QgUmVp bmRleFN0bXQgKnN0bXQsIE9pZCBpbmRleElkLAoJCQkgIGJvb2wgc2tpcF9jb25zdHJhaW50 X2NoZWNrcywgY2hhciBwZXJzaXN0ZW5jZSwKCQkJICBjb25zdCBSZWluZGV4UGFyYW1zICpw YXJhbXMpCnsKCVJlbGF0aW9uCWlSZWwsCgkJCQloZWFwUmVsYXRpb247CglPaWQJCQloZWFw SWQ7CglPaWQJCQlzYXZlX3VzZXJpZDsKCWludAkJCXNhdmVfc2VjX2NvbnRleHQ7CglpbnQJ CQlzYXZlX25lc3RsZXZlbDsKCUluZGV4SW5mbyAgKmluZGV4SW5mbzsKCXZvbGF0aWxlIGJv b2wgc2tpcHBlZF9jb25zdHJhaW50ID0gZmFsc2U7CglQR1JVc2FnZQlydTA7Cglib29sCQlw cm9ncmVzcyA9ICgocGFyYW1zLT5vcHRpb25zICYgUkVJTkRFWE9QVF9SRVBPUlRfUFJPR1JF U1MpICE9IDApOwoJYm9vbAkJc2V0X3RhYmxlc3BhY2UgPSBmYWxzZTsKCglwZ19ydXNhZ2Vf aW5pdCgmcnUwKTsKCgkvKgoJICogT3BlbiBhbmQgbG9jayB0aGUgcGFyZW50IGhlYXAgcmVs YXRpb24uICBTaGFyZUxvY2sgaXMgc3VmZmljaWVudCBzaW5jZQoJICogd2Ugb25seSBuZWVk IHRvIGJlIHN1cmUgbm8gc2NoZW1hIG9yIGRhdGEgY2hhbmdlcyBhcmUgZ29pbmcgb24uCgkg Ki8KCWhlYXBJZCA9IEluZGV4R2V0UmVsYXRpb24oaW5kZXhJZCwKCQkJCQkJCSAgKHBhcmFt cy0+b3B0aW9ucyAmIFJFSU5ERVhPUFRfTUlTU0lOR19PSykgIT0gMCk7CgkvKiBpZiByZWxh dGlvbiBpcyBtaXNzaW5nLCBsZWF2ZSAqLwoJaWYgKCFPaWRJc1ZhbGlkKGhlYXBJZCkpCgkJ cmV0dXJuOwoKCWlmICgocGFyYW1zLT5vcHRpb25zICYgUkVJTkRFWE9QVF9NSVNTSU5HX09L KSAhPSAwKQoJCWhlYXBSZWxhdGlvbiA9IHRyeV90YWJsZV9vcGVuKGhlYXBJZCwgU2hhcmVM b2NrKTsKCWVsc2UKCQloZWFwUmVsYXRpb24gPSB0YWJsZV9vcGVuKGhlYXBJZCwgU2hhcmVM b2NrKTsKCgkvKiBpZiByZWxhdGlvbiBpcyBnb25lLCBsZWF2ZSAqLwoJaWYgKCFoZWFwUmVs YXRpb24pCgkJcmV0dXJuOwoKCS8qCgkgKiBTd2l0Y2ggdG8gdGhlIHRhYmxlIG93bmVyJ3Mg dXNlcmlkLCBzbyB0aGF0IGFueSBpbmRleCBmdW5jdGlvbnMgYXJlIHJ1bgoJICogYXMgdGhh dCB1c2VyLiAgQWxzbyBsb2NrIGRvd24gc2VjdXJpdHktcmVzdHJpY3RlZCBvcGVyYXRpb25z IGFuZAoJICogYXJyYW5nZSB0byBtYWtlIEdVQyB2YXJpYWJsZSBjaGFuZ2VzIGxvY2FsIHRv IHRoaXMgY29tbWFuZC4KCSAqLwoJR2V0VXNlcklkQW5kU2VjQ29udGV4dCgmc2F2ZV91c2Vy aWQsICZzYXZlX3NlY19jb250ZXh0KTsKCVNldFVzZXJJZEFuZFNlY0NvbnRleHQoaGVhcFJl bGF0aW9uLT5yZF9yZWwtPnJlbG93bmVyLAoJCQkJCQkgICBzYXZlX3NlY19jb250ZXh0IHwg U0VDVVJJVFlfUkVTVFJJQ1RFRF9PUEVSQVRJT04pOwoJc2F2ZV9uZXN0bGV2ZWwgPSBOZXdH VUNOZXN0TGV2ZWwoKTsKCVJlc3RyaWN0U2VhcmNoUGF0aCgpOwoKCWlmIChwcm9ncmVzcykK CXsKCQljb25zdCBpbnQJcHJvZ3Jlc3NfY29sc1tdID0gewoJCQlQUk9HUkVTU19DUkVBVEVJ RFhfQ09NTUFORCwKCQkJUFJPR1JFU1NfQ1JFQVRFSURYX0lOREVYX09JRAoJCX07CgkJY29u c3QgaW50NjQgcHJvZ3Jlc3NfdmFsc1tdID0gewoJCQlQUk9HUkVTU19DUkVBVEVJRFhfQ09N TUFORF9SRUlOREVYLAoJCQlpbmRleElkCgkJfTsKCgkJcGdzdGF0X3Byb2dyZXNzX3N0YXJ0 X2NvbW1hbmQoUFJPR1JFU1NfQ09NTUFORF9DUkVBVEVfSU5ERVgsCgkJCQkJCQkJCSAgaGVh cElkKTsKCQlwZ3N0YXRfcHJvZ3Jlc3NfdXBkYXRlX211bHRpX3BhcmFtKDIsIHByb2dyZXNz X2NvbHMsIHByb2dyZXNzX3ZhbHMpOwoJfQoKCS8qCgkgKiBPcGVuIHRoZSB0YXJnZXQgaW5k ZXggcmVsYXRpb24gYW5kIGdldCBhbiBleGNsdXNpdmUgbG9jayBvbiBpdCwgdG8KCSAqIGVu c3VyZSB0aGF0IG5vIG9uZSBlbHNlIGlzIHRvdWNoaW5nIHRoaXMgcGFydGljdWxhciBpbmRl eC4KCSAqLwoJaWYgKChwYXJhbXMtPm9wdGlvbnMgJiBSRUlOREVYT1BUX01JU1NJTkdfT0sp ICE9IDApCgkJaVJlbCA9IHRyeV9pbmRleF9vcGVuKGluZGV4SWQsIEFjY2Vzc0V4Y2x1c2l2 ZUxvY2spOwoJZWxzZQoJCWlSZWwgPSBpbmRleF9vcGVuKGluZGV4SWQsIEFjY2Vzc0V4Y2x1 c2l2ZUxvY2spOwoKCS8qIGlmIGluZGV4IHJlbGF0aW9uIGlzIGdvbmUsIGxlYXZlICovCglp ZiAoIWlSZWwpCgl7CgkJLyogUm9sbCBiYWNrIGFueSBHVUMgY2hhbmdlcyAqLwoJCUF0RU9Y YWN0X0dVQyhmYWxzZSwgc2F2ZV9uZXN0bGV2ZWwpOwoKCQkvKiBSZXN0b3JlIHVzZXJpZCBh bmQgc2VjdXJpdHkgY29udGV4dCAqLwoJCVNldFVzZXJJZEFuZFNlY0NvbnRleHQoc2F2ZV91 c2VyaWQsIHNhdmVfc2VjX2NvbnRleHQpOwoKCQkvKiBDbG9zZSBwYXJlbnQgaGVhcCByZWxh dGlvbiwgYnV0IGtlZXAgbG9ja3MgKi8KCQl0YWJsZV9jbG9zZShoZWFwUmVsYXRpb24sIE5v TG9jayk7CgkJcmV0dXJuOwoJfQoKCWlmIChwcm9ncmVzcykKCQlwZ3N0YXRfcHJvZ3Jlc3Nf dXBkYXRlX3BhcmFtKFBST0dSRVNTX0NSRUFURUlEWF9BQ0NFU1NfTUVUSE9EX09JRCwKCQkJ CQkJCQkJIGlSZWwtPnJkX3JlbC0+cmVsYW0pOwoKCS8qCgkgKiBJZiBhIHN0YXRlbWVudCBp cyBhdmFpbGFibGUsIHRlbGxpbmcgdGhhdCB0aGlzIGNvbWVzIGZyb20gYSBSRUlOREVYCgkg KiBjb21tYW5kLCBjb2xsZWN0IHRoZSBpbmRleCBmb3IgZXZlbnQgdHJpZ2dlcnMuCgkgKi8K CWlmIChzdG10KQoJewoJCU9iamVjdEFkZHJlc3MgYWRkcmVzczsKCgkJT2JqZWN0QWRkcmVz c1NldChhZGRyZXNzLCBSZWxhdGlvblJlbGF0aW9uSWQsIGluZGV4SWQpOwoJCUV2ZW50VHJp Z2dlckNvbGxlY3RTaW1wbGVDb21tYW5kKGFkZHJlc3MsCgkJCQkJCQkJCQkgSW52YWxpZE9i amVjdEFkZHJlc3MsCgkJCQkJCQkJCQkgKGNvbnN0IE5vZGUgKikgc3RtdCk7Cgl9CgoJLyoK CSAqIFBhcnRpdGlvbmVkIGluZGV4ZXMgc2hvdWxkIG5ldmVyIGdldCBwcm9jZXNzZWQgaGVy ZSwgYXMgdGhleSBoYXZlIG5vCgkgKiBwaHlzaWNhbCBzdG9yYWdlLgoJICovCglpZiAoaVJl bC0+cmRfcmVsLT5yZWxraW5kID09IFJFTEtJTkRfUEFSVElUSU9ORURfSU5ERVgpCgkJZWxv ZyhFUlJPUiwgImNhbm5vdCByZWluZGV4IHBhcnRpdGlvbmVkIGluZGV4IFwiJXMuJXNcIiIs CgkJCSBnZXRfbmFtZXNwYWNlX25hbWUoUmVsYXRpb25HZXROYW1lc3BhY2UoaVJlbCkpLAoJ CQkgUmVsYXRpb25HZXRSZWxhdGlvbk5hbWUoaVJlbCkpOwoKCS8qCgkgKiBEb24ndCBhbGxv dyByZWluZGV4IG9uIHRlbXAgdGFibGVzIG9mIG90aGVyIGJhY2tlbmRzIC4uLiB0aGVpciBs b2NhbAoJICogYnVmZmVyIG1hbmFnZXIgaXMgbm90IGdvaW5nIHRvIGNvcGUuCgkgKi8KCWlm IChSRUxBVElPTl9JU19PVEhFUl9URU1QKGlSZWwpKQoJCWVyZXBvcnQoRVJST1IsCgkJCQko ZXJyY29kZShFUlJDT0RFX0ZFQVRVUkVfTk9UX1NVUFBPUlRFRCksCgkJCQkgZXJybXNnKCJj YW5ub3QgcmVpbmRleCB0ZW1wb3JhcnkgdGFibGVzIG9mIG90aGVyIHNlc3Npb25zIikpKTsK CgkvKgoJICogRG9uJ3QgYWxsb3cgcmVpbmRleCBvZiBhbiBpbnZhbGlkIGluZGV4IG9uIFRP QVNUIHRhYmxlLiAgVGhpcyBpcyBhCgkgKiBsZWZ0b3ZlciBmcm9tIGEgZmFpbGVkIFJFSU5E RVggQ09OQ1VSUkVOVExZLCBhbmQgaWYgcmVidWlsdCBpdCB3b3VsZAoJICogbm90IGJlIHBv c3NpYmxlIHRvIGRyb3AgaXQgYW55bW9yZS4KCSAqLwoJaWYgKElzVG9hc3ROYW1lc3BhY2Uo UmVsYXRpb25HZXROYW1lc3BhY2UoaVJlbCkpICYmCgkJIWdldF9pbmRleF9pc3ZhbGlkKGlu ZGV4SWQpKQoJCWVyZXBvcnQoRVJST1IsCgkJCQkoZXJyY29kZShFUlJDT0RFX0ZFQVRVUkVf Tk9UX1NVUFBPUlRFRCksCgkJCQkgZXJybXNnKCJjYW5ub3QgcmVpbmRleCBpbnZhbGlkIGlu ZGV4IG9uIFRPQVNUIHRhYmxlIikpKTsKCgkvKgoJICogU3lzdGVtIHJlbGF0aW9ucyBjYW5u b3QgYmUgbW92ZWQgZXZlbiBpZiBhbGxvd19zeXN0ZW1fdGFibGVfbW9kcyBpcwoJICogZW5h YmxlZCB0byBrZWVwIHRoaW5ncyBjb25zaXN0ZW50IHdpdGggdGhlIGNvbmN1cnJlbnQgY2Fz ZSB3aGVyZSBhbGwKCSAqIHRoZSBpbmRleGVzIG9mIGEgcmVsYXRpb24gYXJlIHByb2Nlc3Nl ZCBpbiBzZXJpZXMsIGluY2x1ZGluZyBpbmRleGVzIG9mCgkgKiB0b2FzdCByZWxhdGlvbnMu CgkgKgoJICogTm90ZSB0aGF0IHRoaXMgY2hlY2sgaXMgbm90IHBhcnQgb2YgQ2hlY2tSZWxh dGlvblRhYmxlU3BhY2VNb3ZlKCkgYXMgaXQKCSAqIGdldHMgdXNlZCBmb3IgQUxURVIgVEFC TEUgU0VUIFRBQkxFU1BBQ0UgdGhhdCBjb3VsZCBjYXNjYWRlIGFjcm9zcwoJICogdG9hc3Qg cmVsYXRpb25zLgoJICovCglpZiAoT2lkSXNWYWxpZChwYXJhbXMtPnRhYmxlc3BhY2VPaWQp ICYmCgkJSXNTeXN0ZW1SZWxhdGlvbihpUmVsKSkKCQllcmVwb3J0KEVSUk9SLAoJCQkJKGVy cmNvZGUoRVJSQ09ERV9GRUFUVVJFX05PVF9TVVBQT1JURUQpLAoJCQkJIGVycm1zZygiY2Fu bm90IG1vdmUgc3lzdGVtIHJlbGF0aW9uIFwiJXNcIiIsCgkJCQkJCVJlbGF0aW9uR2V0UmVs YXRpb25OYW1lKGlSZWwpKSkpOwoKCS8qIENoZWNrIGlmIHRoZSB0YWJsZXNwYWNlIG9mIHRo aXMgaW5kZXggbmVlZHMgdG8gYmUgY2hhbmdlZCAqLwoJaWYgKE9pZElzVmFsaWQocGFyYW1z LT50YWJsZXNwYWNlT2lkKSAmJgoJCUNoZWNrUmVsYXRpb25UYWJsZVNwYWNlTW92ZShpUmVs LCBwYXJhbXMtPnRhYmxlc3BhY2VPaWQpKQoJCXNldF90YWJsZXNwYWNlID0gdHJ1ZTsKCgkv KgoJICogQWxzbyBjaGVjayBmb3IgYWN0aXZlIHVzZXMgb2YgdGhlIGluZGV4IGluIHRoZSBj dXJyZW50IHRyYW5zYWN0aW9uOyB3ZQoJICogZG9uJ3Qgd2FudCB0byByZWluZGV4IHVuZGVy bmVhdGggYW4gb3BlbiBpbmRleHNjYW4uCgkgKi8KCUNoZWNrVGFibGVOb3RJblVzZShpUmVs LCAiUkVJTkRFWCBJTkRFWCIpOwoKCS8qIFNldCBuZXcgdGFibGVzcGFjZSwgaWYgcmVxdWVz dGVkICovCglpZiAoc2V0X3RhYmxlc3BhY2UpCgl7CgkJLyogVXBkYXRlIGl0cyBwZ19jbGFz cyByb3cgKi8KCQlTZXRSZWxhdGlvblRhYmxlU3BhY2UoaVJlbCwgcGFyYW1zLT50YWJsZXNw YWNlT2lkLCBJbnZhbGlkT2lkKTsKCgkJLyoKCQkgKiBTY2hlZHVsZSB1bmxpbmtpbmcgb2Yg dGhlIG9sZCBpbmRleCBzdG9yYWdlIGF0IHRyYW5zYWN0aW9uIGNvbW1pdC4KCQkgKi8KCQlS ZWxhdGlvbkRyb3BTdG9yYWdlKGlSZWwpOwoJCVJlbGF0aW9uQXNzdW1lTmV3UmVsZmlsZWxv Y2F0b3IoaVJlbCk7CgoJCS8qIE1ha2Ugc3VyZSB0aGUgcmVsdGFibGVzcGFjZSBjaGFuZ2Ug aXMgdmlzaWJsZSAqLwoJCUNvbW1hbmRDb3VudGVySW5jcmVtZW50KCk7Cgl9CgoJLyoKCSAq IEFsbCBwcmVkaWNhdGUgbG9ja3Mgb24gdGhlIGluZGV4IGFyZSBhYm91dCB0byBiZSBtYWRl IGludmFsaWQuIFByb21vdGUKCSAqIHRoZW0gdG8gcmVsYXRpb24gbG9ja3Mgb24gdGhlIGhl YXAuCgkgKi8KCVRyYW5zZmVyUHJlZGljYXRlTG9ja3NUb0hlYXBSZWxhdGlvbihpUmVsKTsK CgkvKiBGZXRjaCBpbmZvIG5lZWRlZCBmb3IgaW5kZXhfYnVpbGQgKi8KCWluZGV4SW5mbyA9 IEJ1aWxkSW5kZXhJbmZvKGlSZWwpOwoKCS8qIElmIHJlcXVlc3RlZCwgc2tpcCBjaGVja2lu ZyB1bmlxdWVuZXNzL2V4Y2x1c2lvbiBjb25zdHJhaW50cyAqLwoJaWYgKHNraXBfY29uc3Ry YWludF9jaGVja3MpCgl7CgkJaWYgKGluZGV4SW5mby0+aWlfVW5pcXVlIHx8IGluZGV4SW5m by0+aWlfRXhjbHVzaW9uT3BzICE9IE5VTEwpCgkJCXNraXBwZWRfY29uc3RyYWludCA9IHRy dWU7CgkJaW5kZXhJbmZvLT5paV9VbmlxdWUgPSBmYWxzZTsKCQlpbmRleEluZm8tPmlpX0V4 Y2x1c2lvbk9wcyA9IE5VTEw7CgkJaW5kZXhJbmZvLT5paV9FeGNsdXNpb25Qcm9jcyA9IE5V TEw7CgkJaW5kZXhJbmZvLT5paV9FeGNsdXNpb25TdHJhdHMgPSBOVUxMOwoJfQoKCS8qIFN1 cHByZXNzIHVzZSBvZiB0aGUgdGFyZ2V0IGluZGV4IHdoaWxlIHJlYnVpbGRpbmcgaXQgKi8K CVNldFJlaW5kZXhQcm9jZXNzaW5nKGhlYXBJZCwgaW5kZXhJZCk7CgoJLyogQ3JlYXRlIGEg bmV3IHBoeXNpY2FsIHJlbGF0aW9uIGZvciB0aGUgaW5kZXggKi8KCVJlbGF0aW9uU2V0TmV3 UmVsZmlsZW51bWJlcihpUmVsLCBwZXJzaXN0ZW5jZSk7CgoJLyogSW5pdGlhbGl6ZSB0aGUg aW5kZXggYW5kIHJlYnVpbGQgKi8KCS8qIE5vdGU6IHdlIGRvIG5vdCBuZWVkIHRvIHJlLWVz dGFibGlzaCBwa2V5IHNldHRpbmcgKi8KCWluZGV4X2J1aWxkKGhlYXBSZWxhdGlvbiwgaVJl bCwgaW5kZXhJbmZvLCB0cnVlLCB0cnVlLCBwcm9ncmVzcyk7CgoJLyogUmUtYWxsb3cgdXNl IG9mIHRhcmdldCBpbmRleCAqLwoJUmVzZXRSZWluZGV4UHJvY2Vzc2luZygpOwoKCS8qCgkg KiBJZiB0aGUgaW5kZXggaXMgbWFya2VkIGludmFsaWQvbm90LXJlYWR5L2RlYWQgKGllLCBp dCdzIGZyb20gYSBmYWlsZWQKCSAqIENSRUFURSBJTkRFWCBDT05DVVJSRU5UTFksIG9yIGEg RFJPUCBJTkRFWCBDT05DVVJSRU5UTFkgZmFpbGVkIG1pZHdheSksCgkgKiBhbmQgd2UgZGlk bid0IHNraXAgYSB1bmlxdWVuZXNzIGNoZWNrLCB3ZSBjYW4gbm93IG1hcmsgaXQgdmFsaWQu ICBUaGlzCgkgKiBhbGxvd3MgUkVJTkRFWCB0byBiZSB1c2VkIHRvIGNsZWFuIHVwIGluIHN1 Y2ggY2FzZXMuCgkgKgoJICogV2UgY2FuIGFsc28gcmVzZXQgaW5kY2hlY2t4bWluLCBiZWNh dXNlIHdlIGhhdmUgbm93IGRvbmUgYQoJICogbm9uLWNvbmN1cnJlbnQgaW5kZXggYnVpbGQs ICpleGNlcHQqIGluIHRoZSBjYXNlIHdoZXJlIGluZGV4X2J1aWxkCgkgKiBmb3VuZCBzb21l IHN0aWxsLWJyb2tlbiBIT1QgY2hhaW5zLiBJZiBpdCBkaWQsIGFuZCB3ZSBkb24ndCBoYXZl IHRvCgkgKiBjaGFuZ2UgYW55IG9mIHRoZSBvdGhlciBmbGFncywgd2UganVzdCBsZWF2ZSBp bmRjaGVja3htaW4gYWxvbmUgKG5vdGUKCSAqIHRoYXQgaW5kZXhfYnVpbGQgd29uJ3QgaGF2 ZSBjaGFuZ2VkIGl0LCBiZWNhdXNlIHRoaXMgaXMgYSByZWluZGV4KS4KCSAqIFRoaXMgaXMg b2theSBhbmQgZGVzaXJhYmxlIGJlY2F1c2Ugbm90IHVwZGF0aW5nIHRoZSB0dXBsZSBsZWF2 ZXMgdGhlCgkgKiBpbmRleCdzIHVzYWJpbGl0eSBob3Jpem9uIChyZWNvcmRlZCBhcyB0aGUg dHVwbGUncyB4bWluIHZhbHVlKSB0aGUgc2FtZQoJICogYXMgaXQgd2FzLgoJICoKCSAqIEJ1 dCwgaWYgdGhlIGluZGV4IHdhcyBpbnZhbGlkL25vdC1yZWFkeS9kZWFkIGFuZCB0aGVyZSB3 ZXJlIGJyb2tlbiBIT1QKCSAqIGNoYWlucywgd2UgaGFkIGJldHRlciBmb3JjZSBpbmRjaGVj a3htaW4gdHJ1ZSwgYmVjYXVzZSB0aGUgbm9ybWFsCgkgKiBhcmd1bWVudCB0aGF0IHRoZSBI T1QgY2hhaW5zIGNvdWxkbid0IGNvbmZsaWN0IHdpdGggdGhlIGluZGV4IGlzCgkgKiBzdXNw ZWN0IGZvciBhbiBpbnZhbGlkIGluZGV4LiAgKEEgY29uZmxpY3QgaXMgZGVmaW5pdGVseSBw b3NzaWJsZSBpZgoJICogdGhlIGluZGV4IHdhcyBkZWFkLiAgSXQgcHJvYmFibHkgc2hvdWxk bid0IGhhcHBlbiBvdGhlcndpc2UsIGJ1dCBsZXQncwoJICogYmUgY29uc2VydmF0aXZlLikg IEluIHRoaXMgY2FzZSBhZHZhbmNpbmcgdGhlIHVzYWJpbGl0eSBob3Jpem9uIGlzCgkgKiBh cHByb3ByaWF0ZS4KCSAqCgkgKiBBbm90aGVyIHJlYXNvbiBmb3IgYXZvaWRpbmcgdW5uZWNl c3NhcnkgdXBkYXRlcyBoZXJlIGlzIHRoYXQgd2hpbGUKCSAqIHJlaW5kZXhpbmcgcGdfaW5k ZXggaXRzZWxmLCB3ZSBtdXN0IG5vdCB0cnkgdG8gdXBkYXRlIHR1cGxlcyBpbiBpdC4KCSAq IHBnX2luZGV4J3MgaW5kZXhlcyBzaG91bGQgYWx3YXlzIGhhdmUgdGhlc2UgZmxhZ3MgaW4g dGhlaXIgY2xlYW4gc3RhdGUsCgkgKiBzbyB0aGF0IHdvbid0IGhhcHBlbi4KCSAqLwoJaWYg KCFza2lwcGVkX2NvbnN0cmFpbnQpCgl7CgkJUmVsYXRpb24JcGdfaW5kZXg7CgkJSGVhcFR1 cGxlCWluZGV4VHVwbGU7CgkJRm9ybV9wZ19pbmRleCBpbmRleEZvcm07CgkJYm9vbAkJaW5k ZXhfYmFkOwoKCQlwZ19pbmRleCA9IHRhYmxlX29wZW4oSW5kZXhSZWxhdGlvbklkLCBSb3dF eGNsdXNpdmVMb2NrKTsKCgkJaW5kZXhUdXBsZSA9IFNlYXJjaFN5c0NhY2hlQ29weTEoSU5E RVhSRUxJRCwKCQkJCQkJCQkJCSBPYmplY3RJZEdldERhdHVtKGluZGV4SWQpKTsKCQlpZiAo IUhlYXBUdXBsZUlzVmFsaWQoaW5kZXhUdXBsZSkpCgkJCWVsb2coRVJST1IsICJjYWNoZSBs b29rdXAgZmFpbGVkIGZvciBpbmRleCAldSIsIGluZGV4SWQpOwoJCWluZGV4Rm9ybSA9IChG b3JtX3BnX2luZGV4KSBHRVRTVFJVQ1QoaW5kZXhUdXBsZSk7CgoJCWluZGV4X2JhZCA9ICgh aW5kZXhGb3JtLT5pbmRpc3ZhbGlkIHx8CgkJCQkJICFpbmRleEZvcm0tPmluZGlzcmVhZHkg fHwKCQkJCQkgIWluZGV4Rm9ybS0+aW5kaXNsaXZlKTsKCQlpZiAoaW5kZXhfYmFkIHx8CgkJ CShpbmRleEZvcm0tPmluZGNoZWNreG1pbiAmJiAhaW5kZXhJbmZvLT5paV9Ccm9rZW5Ib3RD aGFpbikpCgkJewoJCQlpZiAoIWluZGV4SW5mby0+aWlfQnJva2VuSG90Q2hhaW4pCgkJCQlp bmRleEZvcm0tPmluZGNoZWNreG1pbiA9IGZhbHNlOwoJCQllbHNlIGlmIChpbmRleF9iYWQp CgkJCQlpbmRleEZvcm0tPmluZGNoZWNreG1pbiA9IHRydWU7CgkJCWluZGV4Rm9ybS0+aW5k aXN2YWxpZCA9IHRydWU7CgkJCWluZGV4Rm9ybS0+aW5kaXNyZWFkeSA9IHRydWU7CgkJCWlu ZGV4Rm9ybS0+aW5kaXNsaXZlID0gdHJ1ZTsKCQkJQ2F0YWxvZ1R1cGxlVXBkYXRlKHBnX2lu ZGV4LCAmaW5kZXhUdXBsZS0+dF9zZWxmLCBpbmRleFR1cGxlKTsKCgkJCS8qCgkJCSAqIElu dmFsaWRhdGUgdGhlIHJlbGNhY2hlIGZvciB0aGUgdGFibGUsIHNvIHRoYXQgYWZ0ZXIgd2Ug Y29tbWl0CgkJCSAqIGFsbCBzZXNzaW9ucyB3aWxsIHJlZnJlc2ggdGhlIHRhYmxlJ3MgaW5k ZXggbGlzdC4gIFRoaXMgZW5zdXJlcwoJCQkgKiB0aGF0IGlmIGFueW9uZSBtaXNzZXMgc2Vl aW5nIHRoZSBwZ19pbmRleCByb3cgZHVyaW5nIHRoaXMKCQkJICogdXBkYXRlLCB0aGV5J2xs IHJlZnJlc2ggdGhlaXIgbGlzdCBiZWZvcmUgYXR0ZW1wdGluZyBhbnkgdXBkYXRlCgkJCSAq IG9uIHRoZSB0YWJsZS4KCQkJICovCgkJCUNhY2hlSW52YWxpZGF0ZVJlbGNhY2hlKGhlYXBS ZWxhdGlvbik7CgkJfQoKCQl0YWJsZV9jbG9zZShwZ19pbmRleCwgUm93RXhjbHVzaXZlTG9j ayk7Cgl9CgoJLyogTG9nIHdoYXQgd2UgZGlkICovCglpZiAoKHBhcmFtcy0+b3B0aW9ucyAm IFJFSU5ERVhPUFRfVkVSQk9TRSkgIT0gMCkKCQllcmVwb3J0KElORk8sCgkJCQkoZXJybXNn KCJpbmRleCBcIiVzXCIgd2FzIHJlaW5kZXhlZCIsCgkJCQkJCWdldF9yZWxfbmFtZShpbmRl eElkKSksCgkJCQkgZXJyZGV0YWlsX2ludGVybmFsKCIlcyIsCgkJCQkJCQkJCXBnX3J1c2Fn ZV9zaG93KCZydTApKSkpOwoKCS8qIFJvbGwgYmFjayBhbnkgR1VDIGNoYW5nZXMgZXhlY3V0 ZWQgYnkgaW5kZXggZnVuY3Rpb25zICovCglBdEVPWGFjdF9HVUMoZmFsc2UsIHNhdmVfbmVz dGxldmVsKTsKCgkvKiBSZXN0b3JlIHVzZXJpZCBhbmQgc2VjdXJpdHkgY29udGV4dCAqLwoJ U2V0VXNlcklkQW5kU2VjQ29udGV4dChzYXZlX3VzZXJpZCwgc2F2ZV9zZWNfY29udGV4dCk7 CgoJLyogQ2xvc2UgcmVscywgYnV0IGtlZXAgbG9ja3MgKi8KCWluZGV4X2Nsb3NlKGlSZWws IE5vTG9jayk7Cgl0YWJsZV9jbG9zZShoZWFwUmVsYXRpb24sIE5vTG9jayk7CgoJaWYgKHBy b2dyZXNzKQoJCXBnc3RhdF9wcm9ncmVzc19lbmRfY29tbWFuZCgpOwp9CgovKgogKiByZWlu ZGV4X3JlbGF0aW9uIC0gVGhpcyByb3V0aW5lIGlzIHVzZWQgdG8gcmVjcmVhdGUgYWxsIGlu ZGV4ZXMKICogb2YgYSByZWxhdGlvbiAoYW5kIG9wdGlvbmFsbHkgaXRzIHRvYXN0IHJlbGF0 aW9uIHRvbywgaWYgYW55KS4KICoKICogImZsYWdzIiBpcyBhIGJpdG1hc2sgdGhhdCBjYW4g aW5jbHVkZSBhbnkgY29tYmluYXRpb24gb2YgdGhlc2UgYml0czoKICoKICogUkVJTkRFWF9S RUxfUFJPQ0VTU19UT0FTVDogaWYgdHJ1ZSwgcHJvY2VzcyB0aGUgdG9hc3QgdGFibGUgdG9v IChpZiBhbnkpLgogKgogKiBSRUlOREVYX1JFTF9TVVBQUkVTU19JTkRFWF9VU0U6IGlmIHRy dWUsIHRoZSByZWxhdGlvbiB3YXMganVzdCBjb21wbGV0ZWx5CiAqIHJlYnVpbHQgYnkgYW4g b3BlcmF0aW9uIHN1Y2ggYXMgVkFDVVVNIEZVTEwgb3IgQ0xVU1RFUiwgYW5kIHRoZXJlZm9y ZSBpdHMKICogaW5kZXhlcyBhcmUgaW5jb25zaXN0ZW50IHdpdGggaXQuICBUaGlzIG1ha2Vz IHRoaW5ncyB0cmlja3kgaWYgdGhlIHJlbGF0aW9uCiAqIGlzIGEgc3lzdGVtIGNhdGFsb2cg dGhhdCB3ZSBtaWdodCBjb25zdWx0IGR1cmluZyB0aGUgcmVpbmRleGluZy4gIFRvIGRlYWwK ICogd2l0aCB0aGF0IGNhc2UsIHdlIG1hcmsgYWxsIG9mIHRoZSBpbmRleGVzIGFzIHBlbmRp bmcgcmVidWlsZCBzbyB0aGF0IHRoZXkKICogd29uJ3QgYmUgdHJ1c3RlZCB1bnRpbCByZWJ1 aWx0LiAgVGhlIGNhbGxlciBpcyByZXF1aXJlZCB0byBjYWxsIHVzICp3aXRob3V0KgogKiBo YXZpbmcgbWFkZSB0aGUgcmVidWlsdCB0YWJsZSB2aXNpYmxlIGJ5IGRvaW5nIENvbW1hbmRD b3VudGVySW5jcmVtZW50OwogKiB3ZSdsbCBkbyBDQ0kgYWZ0ZXIgaGF2aW5nIGNvbGxlY3Rl ZCB0aGUgaW5kZXggbGlzdC4gIChUaGlzIHdheSB3ZSBjYW4gc3RpbGwKICogdXNlIGNhdGFs b2cgaW5kZXhlcyB3aGlsZSBjb2xsZWN0aW5nIHRoZSBsaXN0LikKICoKICogUkVJTkRFWF9S RUxfQ0hFQ0tfQ09OU1RSQUlOVFM6IGlmIHRydWUsIHJlY2hlY2sgdW5pcXVlIGFuZCBleGNs dXNpb24KICogY29uc3RyYWludCBjb25kaXRpb25zLCBlbHNlIGRvbid0LiAgVG8gYXZvaWQg ZGVhZGxvY2tzLCBWQUNVVU0gRlVMTCBvcgogKiBDTFVTVEVSIG9uIGEgc3lzdGVtIGNhdGFs b2cgbXVzdCBvbWl0IHRoaXMgZmxhZy4gIFJFSU5ERVggc2hvdWxkIGJlIHVzZWQgdG8KICog cmVidWlsZCBhbiBpbmRleCBpZiBjb25zdHJhaW50IGluY29uc2lzdGVuY3kgaXMgc3VzcGVj dGVkLiAgRm9yIG9wdGltYWwKICogcGVyZm9ybWFuY2UsIG90aGVyIGNhbGxlcnMgc2hvdWxk IGluY2x1ZGUgdGhlIGZsYWcgb25seSBhZnRlciB0cmFuc2Zvcm1pbmcKICogdGhlIGRhdGEg aW4gYSBtYW5uZXIgdGhhdCByaXNrcyBhIGNoYW5nZSBpbiBjb25zdHJhaW50IHZhbGlkaXR5 LgogKgogKiBSRUlOREVYX1JFTF9GT1JDRV9JTkRFWEVTX1VOTE9HR0VEOiBpZiB0cnVlLCBz ZXQgdGhlIHBlcnNpc3RlbmNlIG9mIHRoZQogKiByZWJ1aWx0IGluZGV4ZXMgdG8gdW5sb2dn ZWQuCiAqCiAqIFJFSU5ERVhfUkVMX0ZPUkNFX0lOREVYRVNfUEVSTUFORU5UOiBpZiB0cnVl LCBzZXQgdGhlIHBlcnNpc3RlbmNlIG9mIHRoZQogKiByZWJ1aWx0IGluZGV4ZXMgdG8gcGVy bWFuZW50LgogKgogKiBSZXR1cm5zIHRydWUgaWYgYW55IGluZGV4ZXMgd2VyZSByZWJ1aWx0 IChpbmNsdWRpbmcgdG9hc3QgdGFibGUncyBpbmRleAogKiB3aGVuIHJlbGV2YW50KS4gIE5v dGUgdGhhdCBhIENvbW1hbmRDb3VudGVySW5jcmVtZW50IHdpbGwgb2NjdXIgYWZ0ZXIgZWFj aAogKiBpbmRleCByZWJ1aWxkLgogKi8KYm9vbApyZWluZGV4X3JlbGF0aW9uKGNvbnN0IFJl aW5kZXhTdG10ICpzdG10LCBPaWQgcmVsaWQsIGludCBmbGFncywKCQkJCSBjb25zdCBSZWlu ZGV4UGFyYW1zICpwYXJhbXMpCnsKCVJlbGF0aW9uCXJlbDsKCU9pZAkJCXRvYXN0X3JlbGlk OwoJTGlzdAkgICAqaW5kZXhJZHM7CgljaGFyCQlwZXJzaXN0ZW5jZTsKCWJvb2wJCXJlc3Vs dCA9IGZhbHNlOwoJTGlzdENlbGwgICAqaW5kZXhJZDsKCWludAkJCWk7CgoJLyoKCSAqIE9w ZW4gYW5kIGxvY2sgdGhlIHJlbGF0aW9uLiAgU2hhcmVMb2NrIGlzIHN1ZmZpY2llbnQgc2lu Y2Ugd2Ugb25seSBuZWVkCgkgKiB0byBwcmV2ZW50IHNjaGVtYSBhbmQgZGF0YSBjaGFuZ2Vz IGluIGl0LiAgVGhlIGxvY2sgbGV2ZWwgdXNlZCBoZXJlCgkgKiBzaG91bGQgbWF0Y2ggUmVp bmRleFRhYmxlKCkuCgkgKi8KCWlmICgocGFyYW1zLT5vcHRpb25zICYgUkVJTkRFWE9QVF9N SVNTSU5HX09LKSAhPSAwKQoJCXJlbCA9IHRyeV90YWJsZV9vcGVuKHJlbGlkLCBTaGFyZUxv Y2spOwoJZWxzZQoJCXJlbCA9IHRhYmxlX29wZW4ocmVsaWQsIFNoYXJlTG9jayk7CgoJLyog aWYgcmVsYXRpb24gaXMgZ29uZSwgbGVhdmUgKi8KCWlmICghcmVsKQoJCXJldHVybiBmYWxz ZTsKCgkvKgoJICogUGFydGl0aW9uZWQgdGFibGVzIHNob3VsZCBuZXZlciBnZXQgcHJvY2Vz c2VkIGhlcmUsIGFzIHRoZXkgaGF2ZSBubwoJICogcGh5c2ljYWwgc3RvcmFnZS4KCSAqLwoJ aWYgKHJlbC0+cmRfcmVsLT5yZWxraW5kID09IFJFTEtJTkRfUEFSVElUSU9ORURfVEFCTEUp CgkJZWxvZyhFUlJPUiwgImNhbm5vdCByZWluZGV4IHBhcnRpdGlvbmVkIHRhYmxlIFwiJXMu JXNcIiIsCgkJCSBnZXRfbmFtZXNwYWNlX25hbWUoUmVsYXRpb25HZXROYW1lc3BhY2UocmVs KSksCgkJCSBSZWxhdGlvbkdldFJlbGF0aW9uTmFtZShyZWwpKTsKCgl0b2FzdF9yZWxpZCA9 IHJlbC0+cmRfcmVsLT5yZWx0b2FzdHJlbGlkOwoKCS8qCgkgKiBHZXQgdGhlIGxpc3Qgb2Yg aW5kZXggT0lEcyBmb3IgdGhpcyByZWxhdGlvbi4gIChXZSB0cnVzdCB0aGUgcmVsY2FjaGUK CSAqIHRvIGdldCB0aGlzIHdpdGggYSBzZXF1ZW50aWFsIHNjYW4gaWYgaWdub3Jpbmcgc3lz dGVtIGluZGV4ZXMuKQoJICovCglpbmRleElkcyA9IFJlbGF0aW9uR2V0SW5kZXhMaXN0KHJl bCk7CgoJaWYgKGZsYWdzICYgUkVJTkRFWF9SRUxfU1VQUFJFU1NfSU5ERVhfVVNFKQoJewoJ CS8qIFN1cHByZXNzIHVzZSBvZiBhbGwgdGhlIGluZGV4ZXMgdW50aWwgdGhleSBhcmUgcmVi dWlsdCAqLwoJCVNldFJlaW5kZXhQZW5kaW5nKGluZGV4SWRzKTsKCgkJLyoKCQkgKiBNYWtl IHRoZSBuZXcgaGVhcCBjb250ZW50cyB2aXNpYmxlIC0tLSBub3cgdGhpbmdzIG1pZ2h0IGJl CgkJICogaW5jb25zaXN0ZW50IQoJCSAqLwoJCUNvbW1hbmRDb3VudGVySW5jcmVtZW50KCk7 Cgl9CgoJLyoKCSAqIFJlaW5kZXggdGhlIHRvYXN0IHRhYmxlLCBpZiBhbnksIGJlZm9yZSB0 aGUgbWFpbiB0YWJsZS4KCSAqCgkgKiBUaGlzIGhlbHBzIGluIGNhc2VzIHdoZXJlIGEgY29y cnVwdGlvbiBpbiB0aGUgdG9hc3QgdGFibGUncyBpbmRleCB3b3VsZAoJICogb3RoZXJ3aXNl IGVycm9yIGFuZCBzdG9wIFJFSU5ERVggVEFCTEUgY29tbWFuZCB3aGVuIGl0IHRyaWVzIHRv IGZldGNoIGEKCSAqIHRvYXN0ZWQgZGF0dW0uICBUaGlzIHdheS4gdGhlIHRvYXN0IHRhYmxl J3MgaW5kZXggaXMgcmVidWlsdCBhbmQgZml4ZWQKCSAqIGJlZm9yZSBpdCBpcyB1c2VkIGZv ciByZWluZGV4aW5nIHRoZSBtYWluIHRhYmxlLgoJICoKCSAqIEl0IGlzIGNyaXRpY2FsIHRv IGNhbGwgcmVpbmRleF9yZWxhdGlvbigpICphZnRlciogdGhlIGNhbGwgdG8KCSAqIFJlbGF0 aW9uR2V0SW5kZXhMaXN0KCkgcmV0dXJuaW5nIHRoZSBsaXN0IG9mIGluZGV4ZXMgb24gdGhl IHJlbGF0aW9uLAoJICogYmVjYXVzZSByZWluZGV4X3JlbGF0aW9uKCkgd2lsbCBjYWxsIENv bW1hbmRDb3VudGVySW5jcmVtZW50KCkgYWZ0ZXIKCSAqIGV2ZXJ5IHJlaW5kZXhfaW5kZXgo KS4gIFNlZSBSRUlOREVYX1JFTF9TVVBQUkVTU19JTkRFWF9VU0UgZm9yIG1vcmUKCSAqIGRl dGFpbHMuCgkgKi8KCWlmICgoZmxhZ3MgJiBSRUlOREVYX1JFTF9QUk9DRVNTX1RPQVNUKSAm JiBPaWRJc1ZhbGlkKHRvYXN0X3JlbGlkKSkKCXsKCQkvKgoJCSAqIE5vdGUgdGhhdCB0aGlz IHNob3VsZCBmYWlsIGlmIHRoZSB0b2FzdCByZWxhdGlvbiBpcyBtaXNzaW5nLCBzbwoJCSAq IHJlc2V0IFJFSU5ERVhPUFRfTUlTU0lOR19PSy4gIEV2ZW4gaWYgYSBuZXcgdGFibGVzcGFj ZSBpcyBzZXQgZm9yCgkJICogdGhlIHBhcmVudCByZWxhdGlvbiwgdGhlIGluZGV4ZXMgb24g aXRzIHRvYXN0IHRhYmxlIGFyZSBub3QgbW92ZWQuCgkJICogVGhpcyBydWxlIGlzIGVuZm9y Y2VkIGJ5IHNldHRpbmcgdGFibGVzcGFjZU9pZCB0byBJbnZhbGlkT2lkLgoJCSAqLwoJCVJl aW5kZXhQYXJhbXMgbmV3cGFyYW1zID0gKnBhcmFtczsKCgkJbmV3cGFyYW1zLm9wdGlvbnMg Jj0gfihSRUlOREVYT1BUX01JU1NJTkdfT0spOwoJCW5ld3BhcmFtcy50YWJsZXNwYWNlT2lk ID0gSW52YWxpZE9pZDsKCQlyZXN1bHQgfD0gcmVpbmRleF9yZWxhdGlvbihzdG10LCB0b2Fz dF9yZWxpZCwgZmxhZ3MsICZuZXdwYXJhbXMpOwoJfQoKCS8qCgkgKiBDb21wdXRlIHBlcnNp c3RlbmNlIG9mIGluZGV4ZXM6IHNhbWUgYXMgdGhhdCBvZiBvd25pbmcgcmVsLCB1bmxlc3MK CSAqIGNhbGxlciBzcGVjaWZpZWQgb3RoZXJ3aXNlLgoJICovCglpZiAoZmxhZ3MgJiBSRUlO REVYX1JFTF9GT1JDRV9JTkRFWEVTX1VOTE9HR0VEKQoJCXBlcnNpc3RlbmNlID0gUkVMUEVS U0lTVEVOQ0VfVU5MT0dHRUQ7CgllbHNlIGlmIChmbGFncyAmIFJFSU5ERVhfUkVMX0ZPUkNF X0lOREVYRVNfUEVSTUFORU5UKQoJCXBlcnNpc3RlbmNlID0gUkVMUEVSU0lTVEVOQ0VfUEVS TUFORU5UOwoJZWxzZQoJCXBlcnNpc3RlbmNlID0gcmVsLT5yZF9yZWwtPnJlbHBlcnNpc3Rl bmNlOwoKCS8qIFJlaW5kZXggYWxsIHRoZSBpbmRleGVzLiAqLwoJaSA9IDE7Cglmb3JlYWNo KGluZGV4SWQsIGluZGV4SWRzKQoJewoJCU9pZAkJCWluZGV4T2lkID0gbGZpcnN0X29pZChp bmRleElkKTsKCQlPaWQJCQlpbmRleE5hbWVzcGFjZUlkID0gZ2V0X3JlbF9uYW1lc3BhY2Uo aW5kZXhPaWQpOwoKCQkvKgoJCSAqIFNraXAgYW55IGludmFsaWQgaW5kZXhlcyBvbiBhIFRP QVNUIHRhYmxlLiAgVGhlc2UgY2FuIG9ubHkgYmUKCQkgKiBkdXBsaWNhdGUgbGVmdG92ZXJz IGZyb20gYSBmYWlsZWQgUkVJTkRFWCBDT05DVVJSRU5UTFksIGFuZCBpZgoJCSAqIHJlYnVp bHQgaXQgd291bGQgbm90IGJlIHBvc3NpYmxlIHRvIGRyb3AgdGhlbSBhbnltb3JlLgoJCSAq LwoJCWlmIChJc1RvYXN0TmFtZXNwYWNlKGluZGV4TmFtZXNwYWNlSWQpICYmCgkJCSFnZXRf aW5kZXhfaXN2YWxpZChpbmRleE9pZCkpCgkJewoJCQllcmVwb3J0KFdBUk5JTkcsCgkJCQkJ KGVycmNvZGUoRVJSQ09ERV9GRUFUVVJFX05PVF9TVVBQT1JURUQpLAoJCQkJCSBlcnJtc2co ImNhbm5vdCByZWluZGV4IGludmFsaWQgaW5kZXggXCIlcy4lc1wiIG9uIFRPQVNUIHRhYmxl LCBza2lwcGluZyIsCgkJCQkJCQlnZXRfbmFtZXNwYWNlX25hbWUoaW5kZXhOYW1lc3BhY2VJ ZCksCgkJCQkJCQlnZXRfcmVsX25hbWUoaW5kZXhPaWQpKSkpOwoKCQkJLyoKCQkJICogUmVt b3ZlIHRoaXMgaW52YWxpZCB0b2FzdCBpbmRleCBmcm9tIHRoZSByZWluZGV4IHBlbmRpbmcg bGlzdCwKCQkJICogYXMgaXQgaXMgc2tpcHBlZCBoZXJlIGR1ZSB0byB0aGUgaGFyZCBmYWls dXJlIHRoYXQgd291bGQgaGFwcGVuCgkJCSAqIGluIHJlaW5kZXhfaW5kZXgoKSwgc2hvdWxk IHdlIHRyeSB0byBwcm9jZXNzIGl0LgoJCQkgKi8KCQkJaWYgKGZsYWdzICYgUkVJTkRFWF9S RUxfU1VQUFJFU1NfSU5ERVhfVVNFKQoJCQkJUmVtb3ZlUmVpbmRleFBlbmRpbmcoaW5kZXhP aWQpOwoJCQljb250aW51ZTsKCQl9CgoJCXJlaW5kZXhfaW5kZXgoc3RtdCwgaW5kZXhPaWQs ICEoZmxhZ3MgJiBSRUlOREVYX1JFTF9DSEVDS19DT05TVFJBSU5UUyksCgkJCQkJICBwZXJz aXN0ZW5jZSwgcGFyYW1zKTsKCgkJQ29tbWFuZENvdW50ZXJJbmNyZW1lbnQoKTsKCgkJLyog SW5kZXggc2hvdWxkIG5vIGxvbmdlciBiZSBpbiB0aGUgcGVuZGluZyBsaXN0ICovCgkJQXNz ZXJ0KCFSZWluZGV4SXNQcm9jZXNzaW5nSW5kZXgoaW5kZXhPaWQpKTsKCgkJLyogU2V0IGlu ZGV4IHJlYnVpbGQgY291bnQgKi8KCQlwZ3N0YXRfcHJvZ3Jlc3NfdXBkYXRlX3BhcmFtKFBS T0dSRVNTX1JFUEFDS19JTkRFWF9SRUJVSUxEX0NPVU5ULAoJCQkJCQkJCQkgaSk7CgkJaSsr OwoJfQoKCS8qCgkgKiBDbG9zZSByZWwsIGJ1dCBjb250aW51ZSB0byBob2xkIHRoZSBsb2Nr LgoJICovCgl0YWJsZV9jbG9zZShyZWwsIE5vTG9jayk7CgoJcmVzdWx0IHw9IChpbmRleElk cyAhPSBOSUwpOwoKCXJldHVybiByZXN1bHQ7Cn0KCgovKiAtLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAqCQlTeXN0 ZW0gaW5kZXggcmVpbmRleGluZyBzdXBwb3J0CiAqCiAqIFdoZW4gd2UgYXJlIGJ1c3kgcmVp bmRleGluZyBhIHN5c3RlbSBpbmRleCwgdGhpcyBjb2RlIHByb3ZpZGVzIHN1cHBvcnQKICog Zm9yIHByZXZlbnRpbmcgY2F0YWxvZyBsb29rdXBzIGZyb20gdXNpbmcgdGhhdCBpbmRleC4g IFdlIGFsc28gbWFrZSB1c2UKICogb2YgdGhpcyB0byBjYXRjaCBhdHRlbXB0ZWQgdXNlcyBv ZiB1c2VyIGluZGV4ZXMgZHVyaW5nIHJlaW5kZXhpbmcgb2YKICogdGhvc2UgaW5kZXhlcy4g IFRoaXMgaW5mb3JtYXRpb24gaXMgcHJvcGFnYXRlZCB0byBwYXJhbGxlbCB3b3JrZXJzOwog KiBhdHRlbXB0aW5nIHRvIGNoYW5nZSBpdCBkdXJpbmcgYSBwYXJhbGxlbCBvcGVyYXRpb24g aXMgbm90IHBlcm1pdHRlZC4KICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogKi8KCnN0YXRpYyBPaWQJY3VycmVu dGx5UmVpbmRleGVkSGVhcCA9IEludmFsaWRPaWQ7CnN0YXRpYyBPaWQJY3VycmVudGx5UmVp bmRleGVkSW5kZXggPSBJbnZhbGlkT2lkOwpzdGF0aWMgTGlzdCAqcGVuZGluZ1JlaW5kZXhl ZEluZGV4ZXMgPSBOSUw7CnN0YXRpYyBpbnQJcmVpbmRleGluZ05lc3RMZXZlbCA9IDA7Cgov KgogKiBSZWluZGV4SXNQcm9jZXNzaW5nSGVhcAogKgkJVHJ1ZSBpZiBoZWFwIHNwZWNpZmll ZCBieSBPSUQgaXMgY3VycmVudGx5IGJlaW5nIHJlaW5kZXhlZC4KICovCmJvb2wKUmVpbmRl eElzUHJvY2Vzc2luZ0hlYXAoT2lkIGhlYXBPaWQpCnsKCXJldHVybiBoZWFwT2lkID09IGN1 cnJlbnRseVJlaW5kZXhlZEhlYXA7Cn0KCi8qCiAqIFJlaW5kZXhJc0N1cnJlbnRseVByb2Nl c3NpbmdJbmRleAogKgkJVHJ1ZSBpZiBpbmRleCBzcGVjaWZpZWQgYnkgT0lEIGlzIGN1cnJl bnRseSBiZWluZyByZWluZGV4ZWQuCiAqLwpzdGF0aWMgYm9vbApSZWluZGV4SXNDdXJyZW50 bHlQcm9jZXNzaW5nSW5kZXgoT2lkIGluZGV4T2lkKQp7CglyZXR1cm4gaW5kZXhPaWQgPT0g Y3VycmVudGx5UmVpbmRleGVkSW5kZXg7Cn0KCi8qCiAqIFJlaW5kZXhJc1Byb2Nlc3NpbmdJ bmRleAogKgkJVHJ1ZSBpZiBpbmRleCBzcGVjaWZpZWQgYnkgT0lEIGlzIGN1cnJlbnRseSBi ZWluZyByZWluZGV4ZWQsCiAqCQlvciBzaG91bGQgYmUgdHJlYXRlZCBhcyBpbnZhbGlkIGJl Y2F1c2UgaXQgaXMgYXdhaXRpbmcgcmVpbmRleC4KICovCmJvb2wKUmVpbmRleElzUHJvY2Vz c2luZ0luZGV4KE9pZCBpbmRleE9pZCkKewoJcmV0dXJuIGluZGV4T2lkID09IGN1cnJlbnRs eVJlaW5kZXhlZEluZGV4IHx8CgkJbGlzdF9tZW1iZXJfb2lkKHBlbmRpbmdSZWluZGV4ZWRJ bmRleGVzLCBpbmRleE9pZCk7Cn0KCi8qCiAqIFNldFJlaW5kZXhQcm9jZXNzaW5nCiAqCQlT ZXQgZmxhZyB0aGF0IHNwZWNpZmllZCBoZWFwL2luZGV4IGFyZSBiZWluZyByZWluZGV4ZWQu CiAqLwpzdGF0aWMgdm9pZApTZXRSZWluZGV4UHJvY2Vzc2luZyhPaWQgaGVhcE9pZCwgT2lk IGluZGV4T2lkKQp7CglBc3NlcnQoT2lkSXNWYWxpZChoZWFwT2lkKSAmJiBPaWRJc1ZhbGlk KGluZGV4T2lkKSk7CgkvKiBSZWluZGV4aW5nIGlzIG5vdCByZS1lbnRyYW50LiAqLwoJaWYg KE9pZElzVmFsaWQoY3VycmVudGx5UmVpbmRleGVkSGVhcCkpCgkJZWxvZyhFUlJPUiwgImNh bm5vdCByZWluZGV4IHdoaWxlIHJlaW5kZXhpbmciKTsKCWN1cnJlbnRseVJlaW5kZXhlZEhl YXAgPSBoZWFwT2lkOwoJY3VycmVudGx5UmVpbmRleGVkSW5kZXggPSBpbmRleE9pZDsKCS8q IEluZGV4IGlzIG5vIGxvbmdlciAicGVuZGluZyIgcmVpbmRleC4gKi8KCVJlbW92ZVJlaW5k ZXhQZW5kaW5nKGluZGV4T2lkKTsKCS8qIFRoaXMgbWF5IGhhdmUgYmVlbiBzZXQgYWxyZWFk eSwgYnV0IGluIGNhc2UgaXQgaXNuJ3QsIGRvIHNvIG5vdy4gKi8KCXJlaW5kZXhpbmdOZXN0 TGV2ZWwgPSBHZXRDdXJyZW50VHJhbnNhY3Rpb25OZXN0TGV2ZWwoKTsKfQoKLyoKICogUmVz ZXRSZWluZGV4UHJvY2Vzc2luZwogKgkJVW5zZXQgcmVpbmRleGluZyBzdGF0dXMuCiAqLwpz dGF0aWMgdm9pZApSZXNldFJlaW5kZXhQcm9jZXNzaW5nKHZvaWQpCnsKCWN1cnJlbnRseVJl aW5kZXhlZEhlYXAgPSBJbnZhbGlkT2lkOwoJY3VycmVudGx5UmVpbmRleGVkSW5kZXggPSBJ bnZhbGlkT2lkOwoJLyogcmVpbmRleGluZ05lc3RMZXZlbCByZW1haW5zIHNldCB0aWxsIGVu ZCBvZiAoc3ViKXRyYW5zYWN0aW9uICovCn0KCi8qCiAqIFNldFJlaW5kZXhQZW5kaW5nCiAq CQlNYXJrIHRoZSBnaXZlbiBpbmRleGVzIGFzIHBlbmRpbmcgcmVpbmRleC4KICoKICogTkI6 IHdlIGFzc3VtZSB0aGF0IHRoZSBjdXJyZW50IG1lbW9yeSBjb250ZXh0IHN0YXlzIHZhbGlk IHRocm91Z2hvdXQuCiAqLwpzdGF0aWMgdm9pZApTZXRSZWluZGV4UGVuZGluZyhMaXN0ICpp bmRleGVzKQp7CgkvKiBSZWluZGV4aW5nIGlzIG5vdCByZS1lbnRyYW50LiAqLwoJaWYgKHBl bmRpbmdSZWluZGV4ZWRJbmRleGVzKQoJCWVsb2coRVJST1IsICJjYW5ub3QgcmVpbmRleCB3 aGlsZSByZWluZGV4aW5nIik7CglpZiAoSXNJblBhcmFsbGVsTW9kZSgpKQoJCWVsb2coRVJS T1IsICJjYW5ub3QgbW9kaWZ5IHJlaW5kZXggc3RhdGUgZHVyaW5nIGEgcGFyYWxsZWwgb3Bl cmF0aW9uIik7CglwZW5kaW5nUmVpbmRleGVkSW5kZXhlcyA9IGxpc3RfY29weShpbmRleGVz KTsKCXJlaW5kZXhpbmdOZXN0TGV2ZWwgPSBHZXRDdXJyZW50VHJhbnNhY3Rpb25OZXN0TGV2 ZWwoKTsKfQoKLyoKICogUmVtb3ZlUmVpbmRleFBlbmRpbmcKICoJCVJlbW92ZSB0aGUgZ2l2 ZW4gaW5kZXggZnJvbSB0aGUgcGVuZGluZyBsaXN0LgogKi8Kc3RhdGljIHZvaWQKUmVtb3Zl UmVpbmRleFBlbmRpbmcoT2lkIGluZGV4T2lkKQp7CglpZiAoSXNJblBhcmFsbGVsTW9kZSgp KQoJCWVsb2coRVJST1IsICJjYW5ub3QgbW9kaWZ5IHJlaW5kZXggc3RhdGUgZHVyaW5nIGEg cGFyYWxsZWwgb3BlcmF0aW9uIik7CglwZW5kaW5nUmVpbmRleGVkSW5kZXhlcyA9IGxpc3Rf ZGVsZXRlX29pZChwZW5kaW5nUmVpbmRleGVkSW5kZXhlcywKCQkJCQkJCQkJCQkgIGluZGV4 T2lkKTsKfQoKLyoKICogUmVzZXRSZWluZGV4U3RhdGUKICoJCUNsZWFyIGFsbCByZWluZGV4 aW5nIHN0YXRlIGR1cmluZyAoc3ViKXRyYW5zYWN0aW9uIGFib3J0LgogKi8Kdm9pZApSZXNl dFJlaW5kZXhTdGF0ZShpbnQgbmVzdExldmVsKQp7CgkvKgoJICogQmVjYXVzZSByZWluZGV4 aW5nIGlzIG5vdCByZS1lbnRyYW50LCB3ZSBkb24ndCBuZWVkIHRvIGNvcGUgd2l0aCBuZXN0 ZWQKCSAqIHJlaW5kZXhpbmcgc3RhdGVzLiAgV2UganVzdCBuZWVkIHRvIGF2b2lkIG1lc3Np bmcgdXAgdGhlIG91dGVyLWxldmVsCgkgKiBzdGF0ZSBpbiBjYXNlIGEgc3VidHJhbnNhY3Rp b24gZmFpbHMgd2l0aGluIGEgUkVJTkRFWC4gIFNvIGNoZWNraW5nIHRoZQoJICogY3VycmVu dCBuZXN0IGxldmVsIGFnYWluc3QgdGhhdCBvZiB0aGUgcmVpbmRleCBvcGVyYXRpb24gaXMg c3VmZmljaWVudC4KCSAqLwoJaWYgKHJlaW5kZXhpbmdOZXN0TGV2ZWwgPj0gbmVzdExldmVs KQoJewoJCWN1cnJlbnRseVJlaW5kZXhlZEhlYXAgPSBJbnZhbGlkT2lkOwoJCWN1cnJlbnRs eVJlaW5kZXhlZEluZGV4ID0gSW52YWxpZE9pZDsKCgkJLyoKCQkgKiBXZSBuZWVkbid0IHRy eSB0byByZWxlYXNlIHRoZSBjb250ZW50cyBvZiBwZW5kaW5nUmVpbmRleGVkSW5kZXhlczsK CQkgKiB0aGF0IGxpc3Qgc2hvdWxkIGJlIGluIGEgdHJhbnNhY3Rpb24tbGlmZXNwYW4gY29u dGV4dCwgc28gaXQgd2lsbAoJCSAqIGdvIGF3YXkgYXV0b21hdGljYWxseS4KCQkgKi8KCQlw ZW5kaW5nUmVpbmRleGVkSW5kZXhlcyA9IE5JTDsKCgkJcmVpbmRleGluZ05lc3RMZXZlbCA9 IDA7Cgl9Cn0KCi8qCiAqIEVzdGltYXRlUmVpbmRleFN0YXRlU3BhY2UKICoJCUVzdGltYXRl IHNwYWNlIG5lZWRlZCB0byBwYXNzIHJlaW5kZXggc3RhdGUgdG8gcGFyYWxsZWwgd29ya2Vy cy4KICovClNpemUKRXN0aW1hdGVSZWluZGV4U3RhdGVTcGFjZSh2b2lkKQp7CglyZXR1cm4g b2Zmc2V0b2YoU2VyaWFsaXplZFJlaW5kZXhTdGF0ZSwgcGVuZGluZ1JlaW5kZXhlZEluZGV4 ZXMpCgkJKyBtdWxfc2l6ZShzaXplb2YoT2lkKSwgbGlzdF9sZW5ndGgocGVuZGluZ1JlaW5k ZXhlZEluZGV4ZXMpKTsKfQoKLyoKICogU2VyaWFsaXplUmVpbmRleFN0YXRlCiAqCQlTZXJp YWxpemUgcmVpbmRleCBzdGF0ZSBmb3IgcGFyYWxsZWwgd29ya2Vycy4KICovCnZvaWQKU2Vy aWFsaXplUmVpbmRleFN0YXRlKFNpemUgbWF4c2l6ZSwgY2hhciAqc3RhcnRfYWRkcmVzcykK ewoJU2VyaWFsaXplZFJlaW5kZXhTdGF0ZSAqc2lzdGF0ZSA9IChTZXJpYWxpemVkUmVpbmRl eFN0YXRlICopIHN0YXJ0X2FkZHJlc3M7CglpbnQJCQljID0gMDsKCUxpc3RDZWxsICAgKmxj OwoKCXNpc3RhdGUtPmN1cnJlbnRseVJlaW5kZXhlZEhlYXAgPSBjdXJyZW50bHlSZWluZGV4 ZWRIZWFwOwoJc2lzdGF0ZS0+Y3VycmVudGx5UmVpbmRleGVkSW5kZXggPSBjdXJyZW50bHlS ZWluZGV4ZWRJbmRleDsKCXNpc3RhdGUtPm51bVBlbmRpbmdSZWluZGV4ZWRJbmRleGVzID0g bGlzdF9sZW5ndGgocGVuZGluZ1JlaW5kZXhlZEluZGV4ZXMpOwoJZm9yZWFjaChsYywgcGVu ZGluZ1JlaW5kZXhlZEluZGV4ZXMpCgkJc2lzdGF0ZS0+cGVuZGluZ1JlaW5kZXhlZEluZGV4 ZXNbYysrXSA9IGxmaXJzdF9vaWQobGMpOwp9CgovKgogKiBSZXN0b3JlUmVpbmRleFN0YXRl CiAqCQlSZXN0b3JlIHJlaW5kZXggc3RhdGUgaW4gYSBwYXJhbGxlbCB3b3JrZXIuCiAqLwp2 b2lkClJlc3RvcmVSZWluZGV4U3RhdGUoY29uc3Qgdm9pZCAqcmVpbmRleHN0YXRlKQp7Cglj b25zdCBTZXJpYWxpemVkUmVpbmRleFN0YXRlICpzaXN0YXRlID0gKGNvbnN0IFNlcmlhbGl6 ZWRSZWluZGV4U3RhdGUgKikgcmVpbmRleHN0YXRlOwoJaW50CQkJYyA9IDA7CglNZW1vcnlD b250ZXh0IG9sZGNvbnRleHQ7CgoJY3VycmVudGx5UmVpbmRleGVkSGVhcCA9IHNpc3RhdGUt PmN1cnJlbnRseVJlaW5kZXhlZEhlYXA7CgljdXJyZW50bHlSZWluZGV4ZWRJbmRleCA9IHNp c3RhdGUtPmN1cnJlbnRseVJlaW5kZXhlZEluZGV4OwoKCUFzc2VydChwZW5kaW5nUmVpbmRl eGVkSW5kZXhlcyA9PSBOSUwpOwoJb2xkY29udGV4dCA9IE1lbW9yeUNvbnRleHRTd2l0Y2hU byhUb3BNZW1vcnlDb250ZXh0KTsKCWZvciAoYyA9IDA7IGMgPCBzaXN0YXRlLT5udW1QZW5k aW5nUmVpbmRleGVkSW5kZXhlczsgKytjKQoJCXBlbmRpbmdSZWluZGV4ZWRJbmRleGVzID0K CQkJbGFwcGVuZF9vaWQocGVuZGluZ1JlaW5kZXhlZEluZGV4ZXMsCgkJCQkJCXNpc3RhdGUt PnBlbmRpbmdSZWluZGV4ZWRJbmRleGVzW2NdKTsKCU1lbW9yeUNvbnRleHRTd2l0Y2hUbyhv bGRjb250ZXh0KTsKCgkvKiBOb3RlIHRoZSB3b3JrZXIgaGFzIGl0cyBvd24gdHJhbnNhY3Rp b24gbmVzdGluZyBsZXZlbCAqLwoJcmVpbmRleGluZ05lc3RMZXZlbCA9IEdldEN1cnJlbnRU cmFuc2FjdGlvbk5lc3RMZXZlbCgpOwp9CgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALi9pbmRleGNtZHMuYwAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAwMDA2NjQAMDAwMTc1MAAwMDAxNzUwADAw MDAwNDQwNDAzADE1MjIyMTA1NDc0ADAxMjAzNgAgMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB1c3RhciAgAHhtYW4AAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAeG1hbgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICoKICogaW5kZXhjbWRzLmMKICoJICBQ T1NUR1JFUyBkZWZpbmUgYW5kIHJlbW92ZSBpbmRleCBjb2RlLgogKgogKiBQb3J0aW9ucyBD b3B5cmlnaHQgKGMpIDE5OTYtMjAyNiwgUG9zdGdyZVNRTCBHbG9iYWwgRGV2ZWxvcG1lbnQg R3JvdXAKICogUG9ydGlvbnMgQ29weXJpZ2h0IChjKSAxOTk0LCBSZWdlbnRzIG9mIHRoZSBV bml2ZXJzaXR5IG9mIENhbGlmb3JuaWEKICoKICoKICogSURFTlRJRklDQVRJT04KICoJICBz cmMvYmFja2VuZC9jb21tYW5kcy9pbmRleGNtZHMuYwogKgogKi0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0KICovCgojaW5jbHVkZSAicG9zdGdyZXMuaCIKCiNpbmNsdWRlICJhY2Nlc3MvYW1hcGku aCIKI2luY2x1ZGUgImFjY2Vzcy9hdHRtYXAuaCIKI2luY2x1ZGUgImFjY2Vzcy9naXN0Lmgi CiNpbmNsdWRlICJhY2Nlc3MvaGVhcGFtLmgiCiNpbmNsdWRlICJhY2Nlc3MvaHR1cF9kZXRh aWxzLmgiCiNpbmNsdWRlICJhY2Nlc3MvcmVsb3B0aW9ucy5oIgojaW5jbHVkZSAiYWNjZXNz L3N5c2F0dHIuaCIKI2luY2x1ZGUgImFjY2Vzcy90YWJsZWFtLmgiCiNpbmNsdWRlICJhY2Nl c3MveGFjdC5oIgojaW5jbHVkZSAiY2F0YWxvZy9jYXRhbG9nLmgiCiNpbmNsdWRlICJjYXRh bG9nL2luZGV4LmgiCiNpbmNsdWRlICJjYXRhbG9nL2luZGV4aW5nLmgiCiNpbmNsdWRlICJj YXRhbG9nL25hbWVzcGFjZS5oIgojaW5jbHVkZSAiY2F0YWxvZy9wZ19hbS5oIgojaW5jbHVk ZSAiY2F0YWxvZy9wZ19hdXRoaWQuaCIKI2luY2x1ZGUgImNhdGFsb2cvcGdfY29sbGF0aW9u LmgiCiNpbmNsdWRlICJjYXRhbG9nL3BnX2NvbnN0cmFpbnQuaCIKI2luY2x1ZGUgImNhdGFs b2cvcGdfZGF0YWJhc2UuaCIKI2luY2x1ZGUgImNhdGFsb2cvcGdfaW5oZXJpdHMuaCIKI2lu Y2x1ZGUgImNhdGFsb2cvcGdfbmFtZXNwYWNlLmgiCiNpbmNsdWRlICJjYXRhbG9nL3BnX29w Y2xhc3MuaCIKI2luY2x1ZGUgImNhdGFsb2cvcGdfdGFibGVzcGFjZS5oIgojaW5jbHVkZSAi Y2F0YWxvZy9wZ190eXBlLmgiCiNpbmNsdWRlICJjb21tYW5kcy9jb21tZW50LmgiCiNpbmNs dWRlICJjb21tYW5kcy9kZWZyZW0uaCIKI2luY2x1ZGUgImNvbW1hbmRzL2V2ZW50X3RyaWdn ZXIuaCIKI2luY2x1ZGUgImNvbW1hbmRzL3Byb2dyZXNzLmgiCiNpbmNsdWRlICJjb21tYW5k cy90YWJsZWNtZHMuaCIKI2luY2x1ZGUgImNvbW1hbmRzL3RhYmxlc3BhY2UuaCIKI2luY2x1 ZGUgIm1iL3BnX3djaGFyLmgiCiNpbmNsdWRlICJtaXNjYWRtaW4uaCIKI2luY2x1ZGUgIm5v ZGVzL21ha2VmdW5jcy5oIgojaW5jbHVkZSAibm9kZXMvbm9kZUZ1bmNzLmgiCiNpbmNsdWRl ICJvcHRpbWl6ZXIvb3B0aW1pemVyLmgiCiNpbmNsdWRlICJwYXJzZXIvcGFyc2VfY29lcmNl LmgiCiNpbmNsdWRlICJwYXJzZXIvcGFyc2Vfb3Blci5oIgojaW5jbHVkZSAicGFyc2VyL3Bh cnNlX3V0aWxjbWQuaCIKI2luY2x1ZGUgInBhcnRpdGlvbmluZy9wYXJ0ZGVzYy5oIgojaW5j bHVkZSAicGdzdGF0LmgiCiNpbmNsdWRlICJyZXdyaXRlL3Jld3JpdGVNYW5pcC5oIgojaW5j bHVkZSAic3RvcmFnZS9sbWdyLmgiCiNpbmNsdWRlICJzdG9yYWdlL3Byb2MuaCIKI2luY2x1 ZGUgInN0b3JhZ2UvcHJvY2FycmF5LmgiCiNpbmNsdWRlICJ1dGlscy9hY2wuaCIKI2luY2x1 ZGUgInV0aWxzL2J1aWx0aW5zLmgiCiNpbmNsdWRlICJ1dGlscy9mbWdyb2lkcy5oIgojaW5j bHVkZSAidXRpbHMvZ3VjLmgiCiNpbmNsdWRlICJ1dGlscy9pbmplY3Rpb25fcG9pbnQuaCIK I2luY2x1ZGUgInV0aWxzL2ludmFsLmgiCiNpbmNsdWRlICJ1dGlscy9sc3lzY2FjaGUuaCIK I2luY2x1ZGUgInV0aWxzL21lbXV0aWxzLmgiCiNpbmNsdWRlICJ1dGlscy9wYXJ0Y2FjaGUu aCIKI2luY2x1ZGUgInV0aWxzL3BnX3J1c2FnZS5oIgojaW5jbHVkZSAidXRpbHMvcmVncHJv Yy5oIgojaW5jbHVkZSAidXRpbHMvc25hcG1nci5oIgojaW5jbHVkZSAidXRpbHMvc3lzY2Fj aGUuaCIKCgovKiBub24tZXhwb3J0IGZ1bmN0aW9uIHByb3RvdHlwZXMgKi8Kc3RhdGljIGJv b2wgQ29tcGFyZU9wY2xhc3NPcHRpb25zKGNvbnN0IERhdHVtICpvcHRzMSwgY29uc3QgRGF0 dW0gKm9wdHMyLCBpbnQgbmF0dHMpOwpzdGF0aWMgdm9pZCBDaGVja1ByZWRpY2F0ZShFeHBy ICpwcmVkaWNhdGUpOwpzdGF0aWMgdm9pZCBDb21wdXRlSW5kZXhBdHRycyhQYXJzZVN0YXRl ICpwc3RhdGUsCgkJCQkJCQkgIEluZGV4SW5mbyAqaW5kZXhJbmZvLAoJCQkJCQkJICBPaWQg KnR5cGVPaWRzLAoJCQkJCQkJICBPaWQgKmNvbGxhdGlvbk9pZHMsCgkJCQkJCQkgIE9pZCAq b3BjbGFzc09pZHMsCgkJCQkJCQkgIERhdHVtICpvcGNsYXNzT3B0aW9ucywKCQkJCQkJCSAg aW50MTYgKmNvbE9wdGlvbnMsCgkJCQkJCQkgIGNvbnN0IExpc3QgKmF0dExpc3QsCgkJCQkJ CQkgIGNvbnN0IExpc3QgKmV4Y2x1c2lvbk9wTmFtZXMsCgkJCQkJCQkgIE9pZCByZWxJZCwK CQkJCQkJCSAgY29uc3QgY2hhciAqYWNjZXNzTWV0aG9kTmFtZSwKCQkJCQkJCSAgT2lkIGFj Y2Vzc01ldGhvZElkLAoJCQkJCQkJICBib29sIGFtY2Fub3JkZXIsCgkJCQkJCQkgIGJvb2wg aXNjb25zdHJhaW50LAoJCQkJCQkJICBib29sIGlzd2l0aG91dG92ZXJsYXBzLAoJCQkJCQkJ ICBPaWQgZGRsX3VzZXJpZCwKCQkJCQkJCSAgaW50IGRkbF9zZWNfY29udGV4dCwKCQkJCQkJ CSAgaW50ICpkZGxfc2F2ZV9uZXN0bGV2ZWwpOwpzdGF0aWMgY2hhciAqQ2hvb3NlSW5kZXhO YW1lKGNvbnN0IGNoYXIgKnRhYm5hbWUsIE9pZCBuYW1lc3BhY2VJZCwKCQkJCQkJCSBjb25z dCBMaXN0ICpjb2xuYW1lcywgY29uc3QgTGlzdCAqZXhjbHVzaW9uT3BOYW1lcywKCQkJCQkJ CSBib29sIHByaW1hcnksIGJvb2wgaXNjb25zdHJhaW50KTsKc3RhdGljIGNoYXIgKkNob29z ZUluZGV4TmFtZUFkZGl0aW9uKGNvbnN0IExpc3QgKmNvbG5hbWVzKTsKc3RhdGljIExpc3Qg KkNob29zZUluZGV4Q29sdW1uTmFtZXMoY29uc3QgTGlzdCAqaW5kZXhFbGVtcyk7CnN0YXRp YyB2b2lkIFJlaW5kZXhJbmRleChjb25zdCBSZWluZGV4U3RtdCAqc3RtdCwgY29uc3QgUmVp bmRleFBhcmFtcyAqcGFyYW1zLAoJCQkJCQkgYm9vbCBpc1RvcExldmVsKTsKc3RhdGljIHZv aWQgUmFuZ2VWYXJDYWxsYmFja0ZvclJlaW5kZXhJbmRleChjb25zdCBSYW5nZVZhciAqcmVs YXRpb24sCgkJCQkJCQkJCQkJT2lkIHJlbElkLCBPaWQgb2xkUmVsSWQsIHZvaWQgKmFyZyk7 CnN0YXRpYyBPaWQJUmVpbmRleFRhYmxlKGNvbnN0IFJlaW5kZXhTdG10ICpzdG10LCBjb25z dCBSZWluZGV4UGFyYW1zICpwYXJhbXMsCgkJCQkJCSBib29sIGlzVG9wTGV2ZWwpOwpzdGF0 aWMgdm9pZCBSZWluZGV4TXVsdGlwbGVUYWJsZXMoY29uc3QgUmVpbmRleFN0bXQgKnN0bXQs CgkJCQkJCQkJICBjb25zdCBSZWluZGV4UGFyYW1zICpwYXJhbXMpOwpzdGF0aWMgdm9pZCBy ZWluZGV4X2Vycm9yX2NhbGxiYWNrKHZvaWQgKmFyZyk7CnN0YXRpYyB2b2lkIFJlaW5kZXhQ YXJ0aXRpb25zKGNvbnN0IFJlaW5kZXhTdG10ICpzdG10LCBPaWQgcmVsaWQsCgkJCQkJCQkg IGNvbnN0IFJlaW5kZXhQYXJhbXMgKnBhcmFtcywgYm9vbCBpc1RvcExldmVsKTsKc3RhdGlj IHZvaWQgUmVpbmRleE11bHRpcGxlSW50ZXJuYWwoY29uc3QgUmVpbmRleFN0bXQgKnN0bXQs IGNvbnN0IExpc3QgKnJlbGlkcywKCQkJCQkJCQkJY29uc3QgUmVpbmRleFBhcmFtcyAqcGFy YW1zKTsKc3RhdGljIGJvb2wgUmVpbmRleFJlbGF0aW9uQ29uY3VycmVudGx5KGNvbnN0IFJl aW5kZXhTdG10ICpzdG10LAoJCQkJCQkJCQkJT2lkIHJlbGF0aW9uT2lkLAoJCQkJCQkJCQkJ Y29uc3QgUmVpbmRleFBhcmFtcyAqcGFyYW1zKTsKc3RhdGljIHZvaWQgdXBkYXRlX3JlbGlz cGFydGl0aW9uKE9pZCByZWxhdGlvbklkLCBib29sIG5ld3ZhbCk7CnN0YXRpYyBpbmxpbmUg dm9pZCBzZXRfaW5kZXhzYWZlX3Byb2NmbGFncyh2b2lkKTsKCi8qCiAqIGNhbGxiYWNrIGFy Z3VtZW50IHR5cGUgZm9yIFJhbmdlVmFyQ2FsbGJhY2tGb3JSZWluZGV4SW5kZXgoKQogKi8K c3RydWN0IFJlaW5kZXhJbmRleENhbGxiYWNrU3RhdGUKewoJUmVpbmRleFBhcmFtcyBwYXJh bXM7CQkvKiBvcHRpb25zIGZyb20gc3RhdGVtZW50ICovCglPaWQJCQlsb2NrZWRfdGFibGVf b2lkOwkvKiB0cmFja3MgcHJldmlvdXNseSBsb2NrZWQgdGFibGUgKi8KfTsKCi8qCiAqIGNh bGxiYWNrIGFyZ3VtZW50cyBmb3IgcmVpbmRleF9lcnJvcl9jYWxsYmFjaygpCiAqLwp0eXBl ZGVmIHN0cnVjdCBSZWluZGV4RXJyb3JJbmZvCnsKCWNoYXIJICAgKnJlbG5hbWU7CgljaGFy CSAgICpyZWxuYW1lc3BhY2U7CgljaGFyCQlyZWxraW5kOwp9IFJlaW5kZXhFcnJvckluZm87 CgovKgogKiBDaGVja0luZGV4Q29tcGF0aWJsZQogKgkJRGV0ZXJtaW5lIHdoZXRoZXIgYW4g ZXhpc3RpbmcgaW5kZXggZGVmaW5pdGlvbiBpcyBjb21wYXRpYmxlIHdpdGggYQogKgkJcHJv c3BlY3RpdmUgaW5kZXggZGVmaW5pdGlvbiwgc3VjaCB0aGF0IHRoZSBleGlzdGluZyBpbmRl eCBzdG9yYWdlCiAqCQljb3VsZCBiZWNvbWUgdGhlIHN0b3JhZ2Ugb2YgdGhlIG5ldyBpbmRl eCwgYXZvaWRpbmcgYSByZWJ1aWxkLgogKgogKiAnb2xkSWQnOiB0aGUgT0lEIG9mIHRoZSBl eGlzdGluZyBpbmRleAogKiAnYWNjZXNzTWV0aG9kTmFtZSc6IG5hbWUgb2YgdGhlIEFNIHRv IHVzZS4KICogJ2F0dHJpYnV0ZUxpc3QnOiBhIGxpc3Qgb2YgSW5kZXhFbGVtIHNwZWNpZnlp bmcgY29sdW1ucyBhbmQgZXhwcmVzc2lvbnMKICoJCXRvIGluZGV4IG9uLgogKiAnZXhjbHVz aW9uT3BOYW1lcyc6IGxpc3Qgb2YgbmFtZXMgb2YgZXhjbHVzaW9uLWNvbnN0cmFpbnQgb3Bl cmF0b3JzLAogKgkJb3IgTklMIGlmIG5vdCBhbiBleGNsdXNpb24gY29uc3RyYWludC4KICog J2lzV2l0aG91dE92ZXJsYXBzJzogdHJ1ZSBpZmYgdGhpcyBpbmRleCBoYXMgYSBXSVRIT1VU IE9WRVJMQVBTIGNsYXVzZS4KICoKICogVGhpcyBpcyB0YWlsb3JlZCB0byB0aGUgbmVlZHMg b2YgQUxURVIgVEFCTEUgQUxURVIgVFlQRSwgd2hpY2ggcmVjcmVhdGVzCiAqIGFueSBpbmRl eGVzIHRoYXQgZGVwZW5kZWQgb24gYSBjaGFuZ2luZyBjb2x1bW4gZnJvbSB0aGVpciBwZ19n ZXRfaW5kZXhkZWYKICogb3IgcGdfZ2V0X2NvbnN0cmFpbnRkZWYgZGVmaW5pdGlvbnMuICBX ZSBvbWl0IHNvbWUgb2YgdGhlIHNhbml0eSBjaGVja3Mgb2YKICogRGVmaW5lSW5kZXguICBX ZSBhc3N1bWUgdGhhdCB0aGUgb2xkIGFuZCBuZXcgaW5kZXhlcyBoYXZlIHRoZSBzYW1lIG51 bWJlcgogKiBvZiBjb2x1bW5zIGFuZCB0aGF0IGlmIG9uZSBoYXMgYW4gZXhwcmVzc2lvbiBj b2x1bW4gb3IgcHJlZGljYXRlLCBib3RoIGRvLgogKiBFcnJvcnMgYXJpc2luZyBmcm9tIHRo ZSBhdHRyaWJ1dGUgbGlzdCBzdGlsbCBhcHBseS4KICoKICogTW9zdCBjb2x1bW4gdHlwZSBj aGFuZ2VzIHRoYXQgY2FuIHNraXAgYSB0YWJsZSByZXdyaXRlIGRvIG5vdCBpbnZhbGlkYXRl CiAqIGluZGV4ZXMuICBXZSBhY2tub3dsZWRnZSB0aGlzIHdoZW4gYWxsIG9wZXJhdG9yIGNs YXNzZXMsIGNvbGxhdGlvbnMgYW5kCiAqIGV4Y2x1c2lvbiBvcGVyYXRvcnMgbWF0Y2guICBU aG91Z2ggd2UgY291bGQgZnVydGhlciBwZXJtaXQgaW50cmEtb3BmYW1pbHkKICogY2hhbmdl cyBmb3IgYnRyZWUgYW5kIGhhc2ggaW5kZXhlcywgdGhhdCBhZGRzIHN1YnRsZSBjb21wbGV4 aXR5IHdpdGggbm8KICogY29uY3JldGUgYmVuZWZpdCBmb3IgY29yZSB0eXBlcy4gTm90ZSwg dGhhdCBJTkNMVURFIGNvbHVtbnMgYXJlbid0CiAqIGNoZWNrZWQgYnkgdGhpcyBmdW5jdGlv biwgZm9yIHRoZW0gaXQncyBlbm91Z2ggdGhhdCB0YWJsZSByZXdyaXRlIGlzCiAqIHNraXBw ZWQuCiAqCiAqIFdoZW4gYSBjb21wYXJpc29uIG9yIGV4Y2x1c2lvbiBvcGVyYXRvciBoYXMg YSBwb2x5bW9ycGhpYyBpbnB1dCB0eXBlLCB0aGUKICogYWN0dWFsIGlucHV0IHR5cGVzIG11 c3QgYWxzbyBtYXRjaC4gIFRoaXMgZGVmZW5kcyBhZ2FpbnN0IHRoZSBwb3NzaWJpbGl0eQog KiB0aGF0IG9wZXJhdG9ycyBjb3VsZCB2YXJ5IGJlaGF2aW9yIGluIHJlc3BvbnNlIHRvIGdl dF9mbl9leHByX2FyZ3R5cGUoKS4KICogQXQgcHJlc2VudCwgdGhpcyBoYXphcmQgaXMgdGhl b3JldGljYWw6IGNoZWNrX2V4Y2x1c2lvbl9jb25zdHJhaW50KCkgYW5kCiAqIGFsbCBjb3Jl IGluZGV4IGFjY2VzcyBtZXRob2RzIGRlY2xpbmUgdG8gc2V0IGZuX2V4cHIgZm9yIHN1Y2gg Y2FsbHMuCiAqCiAqIFdlIGRvIG5vdCB5ZXQgaW1wbGVtZW50IGEgdGVzdCB0byB2ZXJpZnkg Y29tcGF0aWJpbGl0eSBvZiBleHByZXNzaW9uCiAqIGNvbHVtbnMgb3IgcHJlZGljYXRlcywg c28gYXNzdW1lIGFueSBzdWNoIGluZGV4IGlzIGluY29tcGF0aWJsZS4KICovCmJvb2wKQ2hl Y2tJbmRleENvbXBhdGlibGUoT2lkIG9sZElkLAoJCQkJCSBjb25zdCBjaGFyICphY2Nlc3NN ZXRob2ROYW1lLAoJCQkJCSBjb25zdCBMaXN0ICphdHRyaWJ1dGVMaXN0LAoJCQkJCSBjb25z dCBMaXN0ICpleGNsdXNpb25PcE5hbWVzLAoJCQkJCSBib29sIGlzV2l0aG91dE92ZXJsYXBz KQp7Cglib29sCQlpc2NvbnN0cmFpbnQ7CglPaWQJCSAgICp0eXBlSWRzOwoJT2lkCQkgICAq Y29sbGF0aW9uSWRzOwoJT2lkCQkgICAqb3BjbGFzc0lkczsKCURhdHVtCSAgICpvcGNsYXNz T3B0aW9uczsKCU9pZAkJCWFjY2Vzc01ldGhvZElkOwoJT2lkCQkJcmVsYXRpb25JZDsKCUhl YXBUdXBsZQl0dXBsZTsKCUZvcm1fcGdfaW5kZXggaW5kZXhGb3JtOwoJRm9ybV9wZ19hbQlh Y2Nlc3NNZXRob2RGb3JtOwoJY29uc3QgSW5kZXhBbVJvdXRpbmUgKmFtUm91dGluZTsKCWJv b2wJCWFtY2Fub3JkZXI7Cglib29sCQlhbXN1bW1hcml6aW5nOwoJaW50MTYJICAgKmNvbG9w dGlvbnM7CglJbmRleEluZm8gICppbmRleEluZm87CglpbnQJCQludW1iZXJPZkF0dHJpYnV0 ZXM7CglpbnQJCQlvbGRfbmF0dHM7Cglib29sCQlyZXQgPSB0cnVlOwoJb2lkdmVjdG9yICAq b2xkX2luZGNsYXNzOwoJb2lkdmVjdG9yICAqb2xkX2luZGNvbGxhdGlvbjsKCVJlbGF0aW9u CWlyZWw7CglpbnQJCQlpOwoJRGF0dW0JCWQ7CgoJLyogQ2FsbGVyIHNob3VsZCBhbHJlYWR5 IGhhdmUgdGhlIHJlbGF0aW9uIGxvY2tlZCBpbiBzb21lIHdheS4gKi8KCXJlbGF0aW9uSWQg PSBJbmRleEdldFJlbGF0aW9uKG9sZElkLCBmYWxzZSk7CgoJLyoKCSAqIFdlIGNhbiBwcmV0 ZW5kIGlzY29uc3RyYWludCA9IGZhbHNlIHVuY29uZGl0aW9uYWxseS4gIEl0IG9ubHkgc2Vy dmVzIHRvCgkgKiBkZWNpZGUgdGhlIHRleHQgb2YgYW4gZXJyb3IgbWVzc2FnZSB0aGF0IHNo b3VsZCBuZXZlciBoYXBwZW4gZm9yIHVzLgoJICovCglpc2NvbnN0cmFpbnQgPSBmYWxzZTsK CgludW1iZXJPZkF0dHJpYnV0ZXMgPSBsaXN0X2xlbmd0aChhdHRyaWJ1dGVMaXN0KTsKCUFz c2VydChudW1iZXJPZkF0dHJpYnV0ZXMgPiAwKTsKCUFzc2VydChudW1iZXJPZkF0dHJpYnV0 ZXMgPD0gSU5ERVhfTUFYX0tFWVMpOwoKCS8qIGxvb2sgdXAgdGhlIGFjY2VzcyBtZXRob2Qg Ki8KCXR1cGxlID0gU2VhcmNoU3lzQ2FjaGUxKEFNTkFNRSwgUG9pbnRlckdldERhdHVtKGFj Y2Vzc01ldGhvZE5hbWUpKTsKCWlmICghSGVhcFR1cGxlSXNWYWxpZCh0dXBsZSkpCgkJZXJl cG9ydChFUlJPUiwKCQkJCShlcnJjb2RlKEVSUkNPREVfVU5ERUZJTkVEX09CSkVDVCksCgkJ CQkgZXJybXNnKCJhY2Nlc3MgbWV0aG9kIFwiJXNcIiBkb2VzIG5vdCBleGlzdCIsCgkJCQkJ CWFjY2Vzc01ldGhvZE5hbWUpKSk7CglhY2Nlc3NNZXRob2RGb3JtID0gKEZvcm1fcGdfYW0p IEdFVFNUUlVDVCh0dXBsZSk7CglhY2Nlc3NNZXRob2RJZCA9IGFjY2Vzc01ldGhvZEZvcm0t Pm9pZDsKCWFtUm91dGluZSA9IEdldEluZGV4QW1Sb3V0aW5lKGFjY2Vzc01ldGhvZEZvcm0t PmFtaGFuZGxlcik7CglSZWxlYXNlU3lzQ2FjaGUodHVwbGUpOwoKCWFtY2Fub3JkZXIgPSBh bVJvdXRpbmUtPmFtY2Fub3JkZXI7CglhbXN1bW1hcml6aW5nID0gYW1Sb3V0aW5lLT5hbXN1 bW1hcml6aW5nOwoKCS8qCgkgKiBDb21wdXRlIHRoZSBvcGVyYXRvciBjbGFzc2VzLCBjb2xs YXRpb25zLCBhbmQgZXhjbHVzaW9uIG9wZXJhdG9ycyBmb3IKCSAqIHRoZSBuZXcgaW5kZXgs IHNvIHdlIGNhbiB0ZXN0IHdoZXRoZXIgaXQncyBjb21wYXRpYmxlIHdpdGggdGhlIGV4aXN0 aW5nCgkgKiBvbmUuICBOb3RlIHRoYXQgQ29tcHV0ZUluZGV4QXR0cnMgbWlnaHQgZmFpbCBo ZXJlLCBidXQgdGhhdCdzIE9LOgoJICogRGVmaW5lSW5kZXggd291bGQgaGF2ZSBmYWlsZWQg bGF0ZXIuICBPdXIgYXR0cmlidXRlTGlzdCBjb250YWlucyBvbmx5CgkgKiBrZXkgYXR0cmli dXRlcywgdGh1cyB3ZSdyZSBmaWxsaW5nIGlpX051bUluZGV4QXR0cnMgYW5kCgkgKiBpaV9O dW1JbmRleEtleUF0dHJzIHdpdGggc2FtZSB2YWx1ZS4KCSAqLwoJaW5kZXhJbmZvID0gbWFr ZUluZGV4SW5mbyhudW1iZXJPZkF0dHJpYnV0ZXMsIG51bWJlck9mQXR0cmlidXRlcywKCQkJ CQkJCSAgYWNjZXNzTWV0aG9kSWQsIE5JTCwgTklMLCBmYWxzZSwgZmFsc2UsCgkJCQkJCQkg IGZhbHNlLCBmYWxzZSwgYW1zdW1tYXJpemluZywgaXNXaXRob3V0T3ZlcmxhcHMpOwoJdHlw ZUlkcyA9IHBhbGxvY19hcnJheShPaWQsIG51bWJlck9mQXR0cmlidXRlcyk7Cgljb2xsYXRp b25JZHMgPSBwYWxsb2NfYXJyYXkoT2lkLCBudW1iZXJPZkF0dHJpYnV0ZXMpOwoJb3BjbGFz c0lkcyA9IHBhbGxvY19hcnJheShPaWQsIG51bWJlck9mQXR0cmlidXRlcyk7CglvcGNsYXNz T3B0aW9ucyA9IHBhbGxvY19hcnJheShEYXR1bSwgbnVtYmVyT2ZBdHRyaWJ1dGVzKTsKCWNv bG9wdGlvbnMgPSBwYWxsb2NfYXJyYXkoaW50MTYsIG51bWJlck9mQXR0cmlidXRlcyk7CglD b21wdXRlSW5kZXhBdHRycyhOVUxMLCBpbmRleEluZm8sCgkJCQkJICB0eXBlSWRzLCBjb2xs YXRpb25JZHMsIG9wY2xhc3NJZHMsIG9wY2xhc3NPcHRpb25zLAoJCQkJCSAgY29sb3B0aW9u cywgYXR0cmlidXRlTGlzdCwKCQkJCQkgIGV4Y2x1c2lvbk9wTmFtZXMsIHJlbGF0aW9uSWQs CgkJCQkJICBhY2Nlc3NNZXRob2ROYW1lLCBhY2Nlc3NNZXRob2RJZCwKCQkJCQkgIGFtY2Fu b3JkZXIsIGlzY29uc3RyYWludCwgaXNXaXRob3V0T3ZlcmxhcHMsIEludmFsaWRPaWQsCgkJ CQkJICAwLCBOVUxMKTsKCgkvKiBHZXQgdGhlIHNvb24tb2Jzb2xldGUgcGdfaW5kZXggdHVw bGUuICovCgl0dXBsZSA9IFNlYXJjaFN5c0NhY2hlMShJTkRFWFJFTElELCBPYmplY3RJZEdl dERhdHVtKG9sZElkKSk7CglpZiAoIUhlYXBUdXBsZUlzVmFsaWQodHVwbGUpKQoJCWVsb2co RVJST1IsICJjYWNoZSBsb29rdXAgZmFpbGVkIGZvciBpbmRleCAldSIsIG9sZElkKTsKCWlu ZGV4Rm9ybSA9IChGb3JtX3BnX2luZGV4KSBHRVRTVFJVQ1QodHVwbGUpOwoKCS8qCgkgKiBX ZSBkb24ndCBhc3Nlc3MgZXhwcmVzc2lvbnMgb3IgcHJlZGljYXRlczsgYXNzdW1lIGluY29t cGF0aWJpbGl0eS4KCSAqIEFsc28sIGlmIHRoZSBpbmRleCBpcyBpbnZhbGlkIGZvciBhbnkg cmVhc29uLCB0cmVhdCBpdCBhcyBpbmNvbXBhdGlibGUuCgkgKi8KCWlmICghKGhlYXBfYXR0 aXNudWxsKHR1cGxlLCBBbnVtX3BnX2luZGV4X2luZHByZWQsIE5VTEwpICYmCgkJICBoZWFw X2F0dGlzbnVsbCh0dXBsZSwgQW51bV9wZ19pbmRleF9pbmRleHBycywgTlVMTCkgJiYKCQkg IGluZGV4Rm9ybS0+aW5kaXN2YWxpZCkpCgl7CgkJUmVsZWFzZVN5c0NhY2hlKHR1cGxlKTsK CQlyZXR1cm4gZmFsc2U7Cgl9CgoJLyogQW55IGNoYW5nZSBpbiBvcGVyYXRvciBjbGFzcyBv ciBjb2xsYXRpb24gYnJlYWtzIGNvbXBhdGliaWxpdHkuICovCglvbGRfbmF0dHMgPSBpbmRl eEZvcm0tPmluZG5rZXlhdHRzOwoJQXNzZXJ0KG9sZF9uYXR0cyA9PSBudW1iZXJPZkF0dHJp YnV0ZXMpOwoKCWQgPSBTeXNDYWNoZUdldEF0dHJOb3ROdWxsKElOREVYUkVMSUQsIHR1cGxl LCBBbnVtX3BnX2luZGV4X2luZGNvbGxhdGlvbik7CglvbGRfaW5kY29sbGF0aW9uID0gKG9p ZHZlY3RvciAqKSBEYXR1bUdldFBvaW50ZXIoZCk7CgoJZCA9IFN5c0NhY2hlR2V0QXR0ck5v dE51bGwoSU5ERVhSRUxJRCwgdHVwbGUsIEFudW1fcGdfaW5kZXhfaW5kY2xhc3MpOwoJb2xk X2luZGNsYXNzID0gKG9pZHZlY3RvciAqKSBEYXR1bUdldFBvaW50ZXIoZCk7CgoJcmV0ID0g KG1lbWNtcChvbGRfaW5kY2xhc3MtPnZhbHVlcywgb3BjbGFzc0lkcywgb2xkX25hdHRzICog c2l6ZW9mKE9pZCkpID09IDAgJiYKCQkgICBtZW1jbXAob2xkX2luZGNvbGxhdGlvbi0+dmFs dWVzLCBjb2xsYXRpb25JZHMsIG9sZF9uYXR0cyAqIHNpemVvZihPaWQpKSA9PSAwKTsKCglS ZWxlYXNlU3lzQ2FjaGUodHVwbGUpOwoKCWlmICghcmV0KQoJCXJldHVybiBmYWxzZTsKCgkv KiBGb3IgcG9seW1vcnBoaWMgb3BjaW50eXBlLCBjb2x1bW4gdHlwZSBjaGFuZ2VzIGJyZWFr IGNvbXBhdGliaWxpdHkuICovCglpcmVsID0gaW5kZXhfb3BlbihvbGRJZCwgQWNjZXNzU2hh cmVMb2NrKTsJLyogY2FsbGVyIHByb2JhYmx5IGhhcyBhIGxvY2sgKi8KCWZvciAoaSA9IDA7 IGkgPCBvbGRfbmF0dHM7IGkrKykKCXsKCQlpZiAoSXNQb2x5bW9ycGhpY1R5cGUoZ2V0X29w Y2xhc3NfaW5wdXRfdHlwZShvcGNsYXNzSWRzW2ldKSkgJiYKCQkJVHVwbGVEZXNjQXR0cihp cmVsLT5yZF9hdHQsIGkpLT5hdHR0eXBpZCAhPSB0eXBlSWRzW2ldKQoJCXsKCQkJcmV0ID0g ZmFsc2U7CgkJCWJyZWFrOwoJCX0KCX0KCgkvKiBBbnkgY2hhbmdlIGluIG9wY2xhc3Mgb3B0 aW9ucyBicmVhayBjb21wYXRpYmlsaXR5LiAqLwoJaWYgKHJldCkKCXsKCQlEYXR1bQkgICAq b2xkT3BjbGFzc09wdGlvbnMgPSBwYWxsb2NfYXJyYXkoRGF0dW0sIG9sZF9uYXR0cyk7CgoJ CWZvciAoaSA9IDA7IGkgPCBvbGRfbmF0dHM7IGkrKykKCQkJb2xkT3BjbGFzc09wdGlvbnNb aV0gPSBnZXRfYXR0b3B0aW9ucyhvbGRJZCwgaSArIDEpOwoKCQlyZXQgPSBDb21wYXJlT3Bj bGFzc09wdGlvbnMob2xkT3BjbGFzc09wdGlvbnMsIG9wY2xhc3NPcHRpb25zLCBvbGRfbmF0 dHMpOwoKCQlwZnJlZShvbGRPcGNsYXNzT3B0aW9ucyk7Cgl9CgoJLyogQW55IGNoYW5nZSBp biBleGNsdXNpb24gb3BlcmF0b3Igc2VsZWN0aW9ucyBicmVha3MgY29tcGF0aWJpbGl0eS4g Ki8KCWlmIChyZXQgJiYgaW5kZXhJbmZvLT5paV9FeGNsdXNpb25PcHMgIT0gTlVMTCkKCXsK CQlPaWQJCSAgICpvbGRfb3BlcmF0b3JzLAoJCQkJICAgKm9sZF9wcm9jczsKCQl1aW50MTYJ ICAgKm9sZF9zdHJhdHM7CgoJCVJlbGF0aW9uR2V0RXhjbHVzaW9uSW5mbyhpcmVsLCAmb2xk X29wZXJhdG9ycywgJm9sZF9wcm9jcywgJm9sZF9zdHJhdHMpOwoJCXJldCA9IG1lbWNtcChv bGRfb3BlcmF0b3JzLCBpbmRleEluZm8tPmlpX0V4Y2x1c2lvbk9wcywKCQkJCQkgb2xkX25h dHRzICogc2l6ZW9mKE9pZCkpID09IDA7CgoJCS8qIFJlcXVpcmUgYW4gZXhhY3QgaW5wdXQg dHlwZSBtYXRjaCBmb3IgcG9seW1vcnBoaWMgb3BlcmF0b3JzLiAqLwoJCWlmIChyZXQpCgkJ ewoJCQlmb3IgKGkgPSAwOyBpIDwgb2xkX25hdHRzICYmIHJldDsgaSsrKQoJCQl7CgkJCQlP aWQJCQlsZWZ0LAoJCQkJCQkJcmlnaHQ7CgoJCQkJb3BfaW5wdXRfdHlwZXMoaW5kZXhJbmZv LT5paV9FeGNsdXNpb25PcHNbaV0sICZsZWZ0LCAmcmlnaHQpOwoJCQkJaWYgKChJc1BvbHlt b3JwaGljVHlwZShsZWZ0KSB8fCBJc1BvbHltb3JwaGljVHlwZShyaWdodCkpICYmCgkJCQkJ VHVwbGVEZXNjQXR0cihpcmVsLT5yZF9hdHQsIGkpLT5hdHR0eXBpZCAhPSB0eXBlSWRzW2ld KQoJCQkJewoJCQkJCXJldCA9IGZhbHNlOwoJCQkJCWJyZWFrOwoJCQkJfQoJCQl9CgkJfQoJ fQoKCWluZGV4X2Nsb3NlKGlyZWwsIE5vTG9jayk7CglyZXR1cm4gcmV0Owp9CgovKgogKiBD b21wYXJlT3BjbGFzc09wdGlvbnMKICoKICogQ29tcGFyZSBwZXItY29sdW1uIG9wY2xhc3Mg b3B0aW9ucyB3aGljaCBhcmUgcmVwcmVzZW50ZWQgYnkgYXJyYXlzIG9mIHRleHRbXQogKiBk YXR1bXMuICBCb3RoIGVsZW1lbnRzIG9mIGFycmF5cyBhbmQgYXJyYXkgdGhlbXNlbHZlcyBj YW4gYmUgTlVMTC4KICovCnN0YXRpYyBib29sCkNvbXBhcmVPcGNsYXNzT3B0aW9ucyhjb25z dCBEYXR1bSAqb3B0czEsIGNvbnN0IERhdHVtICpvcHRzMiwgaW50IG5hdHRzKQp7CglpbnQJ CQlpOwoJRm1nckluZm8JZm07CgoJaWYgKCFvcHRzMSAmJiAhb3B0czIpCgkJcmV0dXJuIHRy dWU7CgoJZm1ncl9pbmZvKEZfQVJSQVlfRVEsICZmbSk7Cglmb3IgKGkgPSAwOyBpIDwgbmF0 dHM7IGkrKykKCXsKCQlEYXR1bQkJb3B0MSA9IG9wdHMxID8gb3B0czFbaV0gOiAoRGF0dW0p IDA7CgkJRGF0dW0JCW9wdDIgPSBvcHRzMiA/IG9wdHMyW2ldIDogKERhdHVtKSAwOwoKCQlp ZiAob3B0MSA9PSAoRGF0dW0pIDApCgkJewoJCQlpZiAob3B0MiA9PSAoRGF0dW0pIDApCgkJ CQljb250aW51ZTsKCQkJZWxzZQoJCQkJcmV0dXJuIGZhbHNlOwoJCX0KCQllbHNlIGlmIChv cHQyID09IChEYXR1bSkgMCkKCQkJcmV0dXJuIGZhbHNlOwoKCQkvKgoJCSAqIENvbXBhcmUg bm9uLU5VTEwgdGV4dFtdIGRhdHVtcy4gIFVzZSBDIGNvbGxhdGlvbiB0byBlbmZvcmNlIGJp bmFyeQoJCSAqIGVxdWl2YWxlbmNlIG9mIHRleHRzLCBiZWNhdXNlIHdlIGRvbid0IGtub3cg YW55dGhpbmcgYWJvdXQgdGhlCgkJICogc2VtYW50aWNzIG9mIG9wY2xhc3Mgb3B0aW9ucy4K CQkgKi8KCQlpZiAoIURhdHVtR2V0Qm9vbChGdW5jdGlvbkNhbGwyQ29sbCgmZm0sIENfQ09M TEFUSU9OX09JRCwgb3B0MSwgb3B0MikpKQoJCQlyZXR1cm4gZmFsc2U7Cgl9CgoJcmV0dXJu IHRydWU7Cn0KCi8qCiAqIFdhaXRGb3JPbGRlclNuYXBzaG90cwogKgogKiBXYWl0IGZvciB0 cmFuc2FjdGlvbnMgdGhhdCBtaWdodCBoYXZlIGFuIG9sZGVyIHNuYXBzaG90IHRoYW4gdGhl IGdpdmVuIHhtaW4KICogbGltaXQsIGJlY2F1c2UgaXQgbWlnaHQgbm90IGNvbnRhaW4gdHVw bGVzIGRlbGV0ZWQganVzdCBiZWZvcmUgaXQgaGFzCiAqIGJlZW4gdGFrZW4uIE9idGFpbiBh IGxpc3Qgb2YgVlhJRHMgb2Ygc3VjaCB0cmFuc2FjdGlvbnMsIGFuZCB3YWl0IGZvciB0aGVt CiAqIGluZGl2aWR1YWxseS4gVGhpcyBpcyB1c2VkIHdoZW4gYnVpbGRpbmcgYW4gaW5kZXgg Y29uY3VycmVudGx5LgogKgogKiBXZSBjYW4gZXhjbHVkZSBhbnkgcnVubmluZyB0cmFuc2Fj dGlvbnMgdGhhdCBoYXZlIHhtaW4gPiB0aGUgeG1pbiBnaXZlbjsKICogdGhlaXIgb2xkZXN0 IHNuYXBzaG90IG11c3QgYmUgbmV3ZXIgdGhhbiBvdXIgeG1pbiBsaW1pdC4KICogV2UgY2Fu IGFsc28gZXhjbHVkZSBhbnkgdHJhbnNhY3Rpb25zIHRoYXQgaGF2ZSB4bWluID0gemVybywg c2luY2UgdGhleQogKiBldmlkZW50bHkgaGF2ZSBubyBsaXZlIHNuYXBzaG90IGF0IGFsbCAo YW5kIGFueSBvbmUgdGhleSBtaWdodCBiZSBpbgogKiBwcm9jZXNzIG9mIHRha2luZyBpcyBj ZXJ0YWlubHkgbmV3ZXIgdGhhbiBvdXJzKS4gIFRyYW5zYWN0aW9ucyBpbiBvdGhlcgogKiBE QnMgY2FuIGJlIGlnbm9yZWQgdG9vLCBzaW5jZSB0aGV5J2xsIG5ldmVyIGV2ZW4gYmUgYWJs ZSB0byBzZWUgdGhlCiAqIGluZGV4IGJlaW5nIHdvcmtlZCBvbi4KICoKICogV2UgY2FuIGFs c28gZXhjbHVkZSBhdXRvdmFjdXVtIHByb2Nlc3NlcyBhbmQgcHJvY2Vzc2VzIHJ1bm5pbmcg bWFudWFsCiAqIGxhenkgVkFDVVVNcywgYmVjYXVzZSB0aGV5IHdvbid0IGJlIGZhemVkIGJ5 IG1pc3NpbmcgaW5kZXggZW50cmllcwogKiBlaXRoZXIuICAoTWFudWFsIEFOQUxZWkVzLCBo b3dldmVyLCBjYW4ndCBiZSBleGNsdWRlZCBiZWNhdXNlIHRoZXkKICogbWlnaHQgYmUgd2l0 aGluIHRyYW5zYWN0aW9ucyB0aGF0IGFyZSBnb2luZyB0byBkbyBhcmJpdHJhcnkgb3BlcmF0 aW9ucwogKiBsYXRlci4pICBQcm9jZXNzZXMgcnVubmluZyBDUkVBVEUgSU5ERVggQ09OQ1VS UkVOVExZIG9yIFJFSU5ERVggQ09OQ1VSUkVOVExZCiAqIG9uIGluZGV4ZXMgdGhhdCBhcmUg bmVpdGhlciBleHByZXNzaW9uYWwgbm9yIHBhcnRpYWwgYXJlIGFsc28gc2FmZSB0bwogKiBp Z25vcmUsIHNpbmNlIHdlIGtub3cgdGhhdCB0aG9zZSBwcm9jZXNzZXMgd29uJ3QgZXhhbWlu ZSBhbnkgZGF0YQogKiBvdXRzaWRlIHRoZSB0YWJsZSB0aGV5J3JlIGluZGV4aW5nLgogKgog KiBBbHNvLCBHZXRDdXJyZW50VmlydHVhbFhJRHMgbmV2ZXIgcmVwb3J0cyBvdXIgb3duIHZ4 aWQsIHNvIHdlIG5lZWQgbm90CiAqIGNoZWNrIGZvciB0aGF0LgogKgogKiBJZiBhIHByb2Nl c3MgZ29lcyBpZGxlLWluLXRyYW5zYWN0aW9uIHdpdGggeG1pbiB6ZXJvLCB3ZSBkbyBub3Qg bmVlZCB0bwogKiB3YWl0IGZvciBpdCBhbnltb3JlLCBwZXIgdGhlIGFib3ZlIGFyZ3VtZW50 LiAgV2UgZG8gbm90IGhhdmUgdGhlCiAqIGluZnJhc3RydWN0dXJlIHJpZ2h0IG5vdyB0byBz dG9wIHdhaXRpbmcgaWYgdGhhdCBoYXBwZW5zLCBidXQgd2UgY2FuIGF0CiAqIGxlYXN0IGF2 b2lkIHRoZSBmb2xseSBvZiB3YWl0aW5nIHdoZW4gaXQgaXMgaWRsZSBhdCB0aGUgdGltZSB3 ZSB3b3VsZAogKiBiZWdpbiB0byB3YWl0LiAgV2UgZG8gdGhpcyBieSByZXBlYXRlZGx5IHJl Y2hlY2tpbmcgdGhlIG91dHB1dCBvZgogKiBHZXRDdXJyZW50VmlydHVhbFhJRHMuICBJZiwg ZHVyaW5nIGFueSBpdGVyYXRpb24sIGEgcGFydGljdWxhciB2eGlkCiAqIGRvZXNuJ3Qgc2hv dyB1cCBpbiB0aGUgb3V0cHV0LCB3ZSBrbm93IHdlIGNhbiBmb3JnZXQgYWJvdXQgaXQuCiAq Lwp2b2lkCldhaXRGb3JPbGRlclNuYXBzaG90cyhUcmFuc2FjdGlvbklkIGxpbWl0WG1pbiwg Ym9vbCBwcm9ncmVzcykKewoJaW50CQkJbl9vbGRfc25hcHNob3RzOwoJaW50CQkJaTsKCVZp cnR1YWxUcmFuc2FjdGlvbklkICpvbGRfc25hcHNob3RzOwoKCW9sZF9zbmFwc2hvdHMgPSBH ZXRDdXJyZW50VmlydHVhbFhJRHMobGltaXRYbWluLCB0cnVlLCBmYWxzZSwKCQkJCQkJCQkJ CSAgUFJPQ19JU19BVVRPVkFDVVVNIHwgUFJPQ19JTl9WQUNVVU0KCQkJCQkJCQkJCSAgfCBQ Uk9DX0lOX1NBRkVfSUMsCgkJCQkJCQkJCQkgICZuX29sZF9zbmFwc2hvdHMpOwoJaWYgKHBy b2dyZXNzKQoJCXBnc3RhdF9wcm9ncmVzc191cGRhdGVfcGFyYW0oUFJPR1JFU1NfV0FJVEZP Ul9UT1RBTCwgbl9vbGRfc25hcHNob3RzKTsKCglmb3IgKGkgPSAwOyBpIDwgbl9vbGRfc25h cHNob3RzOyBpKyspCgl7CgkJaWYgKCFWaXJ0dWFsVHJhbnNhY3Rpb25JZElzVmFsaWQob2xk X3NuYXBzaG90c1tpXSkpCgkJCWNvbnRpbnVlOwkJCS8qIGZvdW5kIHVuaW50ZXJlc3Rpbmcg aW4gcHJldmlvdXMgY3ljbGUgKi8KCgkJaWYgKGkgPiAwKQoJCXsKCQkJLyogc2VlIGlmIGFu eXRoaW5nJ3MgY2hhbmdlZCAuLi4gKi8KCQkJVmlydHVhbFRyYW5zYWN0aW9uSWQgKm5ld2Vy X3NuYXBzaG90czsKCQkJaW50CQkJbl9uZXdlcl9zbmFwc2hvdHM7CgkJCWludAkJCWo7CgkJ CWludAkJCWs7CgoJCQluZXdlcl9zbmFwc2hvdHMgPSBHZXRDdXJyZW50VmlydHVhbFhJRHMo bGltaXRYbWluLAoJCQkJCQkJCQkJCQkJdHJ1ZSwgZmFsc2UsCgkJCQkJCQkJCQkJCQlQUk9D X0lTX0FVVE9WQUNVVU0gfCBQUk9DX0lOX1ZBQ1VVTQoJCQkJCQkJCQkJCQkJfCBQUk9DX0lO X1NBRkVfSUMsCgkJCQkJCQkJCQkJCQkmbl9uZXdlcl9zbmFwc2hvdHMpOwoJCQlmb3IgKGog PSBpOyBqIDwgbl9vbGRfc25hcHNob3RzOyBqKyspCgkJCXsKCQkJCWlmICghVmlydHVhbFRy YW5zYWN0aW9uSWRJc1ZhbGlkKG9sZF9zbmFwc2hvdHNbal0pKQoJCQkJCWNvbnRpbnVlOwkv KiBmb3VuZCB1bmludGVyZXN0aW5nIGluIHByZXZpb3VzIGN5Y2xlICovCgkJCQlmb3IgKGsg PSAwOyBrIDwgbl9uZXdlcl9zbmFwc2hvdHM7IGsrKykKCQkJCXsKCQkJCQlpZiAoVmlydHVh bFRyYW5zYWN0aW9uSWRFcXVhbHMob2xkX3NuYXBzaG90c1tqXSwKCQkJCQkJCQkJCQkJICAg bmV3ZXJfc25hcHNob3RzW2tdKSkKCQkJCQkJYnJlYWs7CgkJCQl9CgkJCQlpZiAoayA+PSBu X25ld2VyX3NuYXBzaG90cykgLyogbm90IHRoZXJlIGFueW1vcmUgKi8KCQkJCQlTZXRJbnZh bGlkVmlydHVhbFRyYW5zYWN0aW9uSWQob2xkX3NuYXBzaG90c1tqXSk7CgkJCX0KCQkJcGZy ZWUobmV3ZXJfc25hcHNob3RzKTsKCQl9CgoJCWlmIChWaXJ0dWFsVHJhbnNhY3Rpb25JZElz VmFsaWQob2xkX3NuYXBzaG90c1tpXSkpCgkJewoJCQkvKiBJZiByZXF1ZXN0ZWQsIHB1Ymxp c2ggd2hvIHdlJ3JlIGdvaW5nIHRvIHdhaXQgZm9yLiAqLwoJCQlpZiAocHJvZ3Jlc3MpCgkJ CXsKCQkJCVBHUFJPQwkgICAqaG9sZGVyID0gUHJvY051bWJlckdldFByb2Mob2xkX3NuYXBz aG90c1tpXS5wcm9jTnVtYmVyKTsKCgkJCQlpZiAoaG9sZGVyKQoJCQkJCXBnc3RhdF9wcm9n cmVzc191cGRhdGVfcGFyYW0oUFJPR1JFU1NfV0FJVEZPUl9DVVJSRU5UX1BJRCwKCQkJCQkJ CQkJCQkJIGhvbGRlci0+cGlkKTsKCQkJfQoJCQlWaXJ0dWFsWGFjdExvY2sob2xkX3NuYXBz aG90c1tpXSwgdHJ1ZSk7CgkJfQoKCQlpZiAocHJvZ3Jlc3MpCgkJCXBnc3RhdF9wcm9ncmVz c191cGRhdGVfcGFyYW0oUFJPR1JFU1NfV0FJVEZPUl9ET05FLCBpICsgMSk7Cgl9Cn0KCgov KgogKiBEZWZpbmVJbmRleAogKgkJQ3JlYXRlcyBhIG5ldyBpbmRleC4KICoKICogVGhpcyBm dW5jdGlvbiBtYW5hZ2VzIHRoZSBjdXJyZW50IHVzZXJpZCBhY2NvcmRpbmcgdG8gdGhlIG5l ZWRzIG9mIHBnX2R1bXAuCiAqIFJlY3JlYXRpbmcgb2xkLWRhdGFiYXNlIGNhdGFsb2cgZW50 cmllcyBpbiBuZXctZGF0YWJhc2UgaXMgZmluZSwgcmVnYXJkbGVzcwogKiBvZiB3aGljaCB1 c2VycyB3b3VsZCBoYXZlIHBlcm1pc3Npb24gdG8gcmVjcmVhdGUgdGhvc2UgZW50cmllcyBu b3cuICBUaGF0J3MKICoganVzdCBwcmVzZXJ2YXRpb24gb2Ygc3RhdGUuICBSdW5uaW5nIG9w YXF1ZSBleHByZXNzaW9ucywgbGlrZSBjYWxsaW5nIGEKICogZnVuY3Rpb24gbmFtZWQgaW4g YSBjYXRhbG9nIGVudHJ5IG9yIGV2YWx1YXRpbmcgYSBwZ19ub2RlX3RyZWUgaW4gYSBjYXRh bG9nCiAqIGVudHJ5LCBhcyBhbnlvbmUgb3RoZXIgdGhhbiB0aGUgb2JqZWN0IG93bmVyLCBp cyBub3QgZmluZS4gIFRvIGFkaGVyZSB0bwogKiB0aG9zZSBwcmluY2lwbGVzIGFuZCB0byBy ZW1haW4gZmFpbC1zYWZlLCB1c2UgdGhlIHRhYmxlIG93bmVyIHVzZXJpZCBmb3IKICogbW9z dCBBQ0wgY2hlY2tzLiAgVXNlIHRoZSBvcmlnaW5hbCB1c2VyaWQgZm9yIEFDTCBjaGVja3Mg cmVhY2hlZCB3aXRob3V0CiAqIHRyYXZlcnNpbmcgb3BhcXVlIGV4cHJlc3Npb25zLiAgKHBn X2R1bXAgY2FuIHByZWRpY3Qgc3VjaCBBQ0wgY2hlY2tzIGZyb20KICogY2F0YWxvZ3MuKSAg T3ZlcmFsbCwgdGhpcyBpcyBhIG1lc3MuICBGdXR1cmUgRERMIGRldmVsb3BtZW50IHNob3Vs ZAogKiBjb25zaWRlciBvZmZlcmluZyBvbmUgRERMIGNvbW1hbmQgZm9yIGNhdGFsb2cgc2V0 dXAgYW5kIGEgc2VwYXJhdGUgRERMCiAqIGNvbW1hbmQgZm9yIHN0ZXBzIHRoYXQgcnVuIG9w YXF1ZSBleHByZXNzaW9ucy4KICoKICogJ3BzdGF0ZSc6IFBhcnNlU3RhdGUgc3RydWN0ICh1 c2VkIG9ubHkgZm9yIGVycm9yIHJlcG9ydHM7IHBhc3MgTlVMTCBpZgogKgkJbm90IGF2YWls YWJsZSkKICogJ3RhYmxlSWQnOiB0aGUgT0lEIG9mIHRoZSB0YWJsZSByZWxhdGlvbiBvbiB3 aGljaCB0aGUgaW5kZXggaXMgdG8gYmUKICoJCWNyZWF0ZWQKICogJ3N0bXQnOiBJbmRleFN0 bXQgZGVzY3JpYmluZyB0aGUgcHJvcGVydGllcyBvZiB0aGUgbmV3IGluZGV4LgogKiAnaW5k ZXhSZWxhdGlvbklkJzogbm9ybWFsbHkgSW52YWxpZE9pZCwgYnV0IGR1cmluZyBib290c3Ry YXAgY2FuIGJlCiAqCQlub256ZXJvIHRvIHNwZWNpZnkgYSBwcmVzZWxlY3RlZCBPSUQgZm9y IHRoZSBpbmRleC4KICogJ3BhcmVudEluZGV4SWQnOiB0aGUgT0lEIG9mIHRoZSBwYXJlbnQg aW5kZXg7IEludmFsaWRPaWQgaWYgbm90IHRoZSBjaGlsZAogKgkJb2YgYSBwYXJ0aXRpb25l ZCBpbmRleC4KICogJ3BhcmVudENvbnN0cmFpbnRJZCc6IHRoZSBPSUQgb2YgdGhlIHBhcmVu dCBjb25zdHJhaW50OyBJbnZhbGlkT2lkIGlmIG5vdAogKgkJdGhlIGNoaWxkIG9mIGEgY29u c3RyYWludCAob25seSB1c2VkIHdoZW4gcmVjdXJzaW5nKQogKiAndG90YWxfcGFydHMnOiB0 b3RhbCBudW1iZXIgb2YgZGlyZWN0IGFuZCBpbmRpcmVjdCBwYXJ0aXRpb25zIG9mIHJlbGF0 aW9uOwogKgkJcGFzcyAtMSBpZiBub3Qga25vd24gb3IgcmVsIGlzIG5vdCBwYXJ0aXRpb25l ZC4KICogJ2lzX2FsdGVyX3RhYmxlJzogdGhpcyBpcyBkdWUgdG8gYW4gQUxURVIgcmF0aGVy IHRoYW4gYSBDUkVBVEUgb3BlcmF0aW9uLgogKiAnY2hlY2tfcmlnaHRzJzogY2hlY2sgZm9y IENSRUFURSByaWdodHMgaW4gbmFtZXNwYWNlIGFuZCB0YWJsZXNwYWNlLiAgKFRoaXMKICoJ CXNob3VsZCBiZSB0cnVlIGV4Y2VwdCB3aGVuIEFMVEVSIGlzIGRlbGV0aW5nL3JlY3JlYXRp bmcgYW4gaW5kZXguKQogKiAnY2hlY2tfbm90X2luX3VzZSc6IGNoZWNrIGZvciB0YWJsZSBu b3QgYWxyZWFkeSBpbiB1c2UgaW4gY3VycmVudCBzZXNzaW9uLgogKgkJVGhpcyBzaG91bGQg YmUgdHJ1ZSB1bmxlc3MgY2FsbGVyIGlzIGhvbGRpbmcgdGhlIHRhYmxlIG9wZW4sIGluIHdo aWNoCiAqCQljYXNlIHRoZSBjYWxsZXIgaGFkIGJldHRlciBoYXZlIGNoZWNrZWQgaXQgZWFy bGllci4KICogJ3NraXBfYnVpbGQnOiBtYWtlIHRoZSBjYXRhbG9nIGVudHJpZXMgYnV0IGRv bid0IGNyZWF0ZSB0aGUgaW5kZXggZmlsZXMKICogJ3F1aWV0Jzogc3VwcHJlc3MgdGhlIE5P VElDRSBjaGF0dGVyIG9yZGluYXJpbHkgcHJvdmlkZWQgZm9yIGNvbnN0cmFpbnRzLgogKgog KiBSZXR1cm5zIHRoZSBvYmplY3QgYWRkcmVzcyBvZiB0aGUgY3JlYXRlZCBpbmRleC4KICov Ck9iamVjdEFkZHJlc3MKRGVmaW5lSW5kZXgoUGFyc2VTdGF0ZSAqcHN0YXRlLAoJCQlPaWQg dGFibGVJZCwKCQkJY29uc3QgSW5kZXhTdG10ICpzdG10LAoJCQlPaWQgaW5kZXhSZWxhdGlv bklkLAoJCQlPaWQgcGFyZW50SW5kZXhJZCwKCQkJT2lkIHBhcmVudENvbnN0cmFpbnRJZCwK CQkJaW50IHRvdGFsX3BhcnRzLAoJCQlib29sIGlzX2FsdGVyX3RhYmxlLAoJCQlib29sIGNo ZWNrX3JpZ2h0cywKCQkJYm9vbCBjaGVja19ub3RfaW5fdXNlLAoJCQlib29sIHNraXBfYnVp bGQsCgkJCWJvb2wgcXVpZXQpCnsKCWJvb2wJCWNvbmN1cnJlbnQ7CgljaGFyCSAgICppbmRl eFJlbGF0aW9uTmFtZTsKCWNoYXIJICAgKmFjY2Vzc01ldGhvZE5hbWU7CglPaWQJCSAgICp0 eXBlSWRzOwoJT2lkCQkgICAqY29sbGF0aW9uSWRzOwoJT2lkCQkgICAqb3BjbGFzc0lkczsK CURhdHVtCSAgICpvcGNsYXNzT3B0aW9uczsKCU9pZAkJCWFjY2Vzc01ldGhvZElkOwoJT2lk CQkJbmFtZXNwYWNlSWQ7CglPaWQJCQl0YWJsZXNwYWNlSWQ7CglPaWQJCQljcmVhdGVkQ29u c3RyYWludElkID0gSW52YWxpZE9pZDsKCUxpc3QJICAgKmluZGV4Q29sTmFtZXM7CglMaXN0 CSAgICphbGxJbmRleFBhcmFtczsKCVJlbGF0aW9uCXJlbDsKCUhlYXBUdXBsZQl0dXBsZTsK CUZvcm1fcGdfYW0JYWNjZXNzTWV0aG9kRm9ybTsKCWNvbnN0IEluZGV4QW1Sb3V0aW5lICph bVJvdXRpbmU7Cglib29sCQlhbWNhbm9yZGVyOwoJYm9vbAkJYW1pc3N1bW1hcml6aW5nOwoJ YW1vcHRpb25zX2Z1bmN0aW9uIGFtb3B0aW9uczsKCWJvb2wJCWV4Y2x1c2lvbjsKCWJvb2wJ CXBhcnRpdGlvbmVkOwoJYm9vbAkJc2FmZV9pbmRleDsKCURhdHVtCQlyZWxvcHRpb25zOwoJ aW50MTYJICAgKmNvbG9wdGlvbnM7CglJbmRleEluZm8gICppbmRleEluZm87Cgl1aW50MTYJ CWZsYWdzOwoJdWludDE2CQljb25zdHJfZmxhZ3M7CglpbnQJCQludW1iZXJPZkF0dHJpYnV0 ZXM7CglpbnQJCQludW1iZXJPZktleUF0dHJpYnV0ZXM7CglUcmFuc2FjdGlvbklkIGxpbWl0 WG1pbjsKCU9iamVjdEFkZHJlc3MgYWRkcmVzczsKCUxvY2tSZWxJZAloZWFwcmVsaWQ7CglM T0NLVEFHCQloZWFwbG9ja3RhZzsKCUxPQ0tNT0RFCWxvY2ttb2RlOwoJU25hcHNob3QJc25h cHNob3Q7CglPaWQJCQlyb290X3NhdmVfdXNlcmlkOwoJaW50CQkJcm9vdF9zYXZlX3NlY19j b250ZXh0OwoJaW50CQkJcm9vdF9zYXZlX25lc3RsZXZlbDsKCglyb290X3NhdmVfbmVzdGxl dmVsID0gTmV3R1VDTmVzdExldmVsKCk7CgoJUmVzdHJpY3RTZWFyY2hQYXRoKCk7CgoJLyoK CSAqIFNvbWUgY2FsbGVycyBuZWVkIHVzIHRvIHJ1biB3aXRoIGFuIGVtcHR5IGRlZmF1bHRf dGFibGVzcGFjZTsgdGhpcyBpcyBhCgkgKiBuZWNlc3NhcnkgaGFjayB0byBiZSBhYmxlIHRv IHJlcHJvZHVjZSBjYXRhbG9nIHN0YXRlIGFjY3VyYXRlbHkgd2hlbgoJICogcmVjcmVhdGlu ZyBpbmRleGVzIGFmdGVyIHRhYmxlLXJld3JpdGluZyBBTFRFUiBUQUJMRS4KCSAqLwoJaWYg KHN0bXQtPnJlc2V0X2RlZmF1bHRfdGJsc3BjKQoJCSh2b2lkKSBzZXRfY29uZmlnX29wdGlv bigiZGVmYXVsdF90YWJsZXNwYWNlIiwgIiIsCgkJCQkJCQkJIFBHQ19VU0VSU0VULCBQR0Nf U19TRVNTSU9OLAoJCQkJCQkJCSBHVUNfQUNUSU9OX1NBVkUsIHRydWUsIDAsIGZhbHNlKTsK CgkvKgoJICogRm9yY2Ugbm9uLWNvbmN1cnJlbnQgYnVpbGQgb24gdGVtcG9yYXJ5IHJlbGF0 aW9ucywgZXZlbiBpZiBDT05DVVJSRU5UTFkKCSAqIHdhcyByZXF1ZXN0ZWQuICBPdGhlciBi YWNrZW5kcyBjYW4ndCBhY2Nlc3MgYSB0ZW1wb3JhcnkgcmVsYXRpb24sIHNvCgkgKiB0aGVy ZSdzIG5vIGhhcm0gaW4gZ3JhYmJpbmcgYSBzdHJvbmdlciBsb2NrLCBhbmQgYSBub24tY29u Y3VycmVudCBEUk9QCgkgKiBpcyBtb3JlIGVmZmljaWVudC4gIERvIHRoaXMgYmVmb3JlIGFu eSB1c2Ugb2YgdGhlIGNvbmN1cnJlbnQgb3B0aW9uIGlzCgkgKiBkb25lLgoJICovCglpZiAo c3RtdC0+Y29uY3VycmVudCAmJiBnZXRfcmVsX3BlcnNpc3RlbmNlKHRhYmxlSWQpICE9IFJF TFBFUlNJU1RFTkNFX1RFTVApCgkJY29uY3VycmVudCA9IHRydWU7CgllbHNlCgkJY29uY3Vy cmVudCA9IGZhbHNlOwoKCS8qCgkgKiBTdGFydCBwcm9ncmVzcyByZXBvcnQuICBJZiB3ZSdy ZSBidWlsZGluZyBhIHBhcnRpdGlvbiwgdGhpcyB3YXMgYWxyZWFkeQoJICogZG9uZS4KCSAq LwoJaWYgKCFPaWRJc1ZhbGlkKHBhcmVudEluZGV4SWQpKQoJewoJCXBnc3RhdF9wcm9ncmVz c19zdGFydF9jb21tYW5kKFBST0dSRVNTX0NPTU1BTkRfQ1JFQVRFX0lOREVYLCB0YWJsZUlk KTsKCQlwZ3N0YXRfcHJvZ3Jlc3NfdXBkYXRlX3BhcmFtKFBST0dSRVNTX0NSRUFURUlEWF9D T01NQU5ELAoJCQkJCQkJCQkgY29uY3VycmVudCA/CgkJCQkJCQkJCSBQUk9HUkVTU19DUkVB VEVJRFhfQ09NTUFORF9DUkVBVEVfQ09OQ1VSUkVOVExZIDoKCQkJCQkJCQkJIFBST0dSRVNT X0NSRUFURUlEWF9DT01NQU5EX0NSRUFURSk7Cgl9CgoJLyoKCSAqIE5vIGluZGV4IE9JRCB0 byByZXBvcnQgeWV0CgkgKi8KCXBnc3RhdF9wcm9ncmVzc191cGRhdGVfcGFyYW0oUFJPR1JF U1NfQ1JFQVRFSURYX0lOREVYX09JRCwKCQkJCQkJCQkgSW52YWxpZE9pZCk7CgoJLyoKCSAq IGNvdW50IGtleSBhdHRyaWJ1dGVzIGluIGluZGV4CgkgKi8KCW51bWJlck9mS2V5QXR0cmli dXRlcyA9IGxpc3RfbGVuZ3RoKHN0bXQtPmluZGV4UGFyYW1zKTsKCgkvKgoJICogQ2FsY3Vs YXRlIHRoZSBuZXcgbGlzdCBvZiBpbmRleCBjb2x1bW5zIGluY2x1ZGluZyBib3RoIGtleSBj b2x1bW5zIGFuZAoJICogSU5DTFVERSBjb2x1bW5zLiAgTGF0ZXIgd2UgY2FuIGRldGVybWlu ZSB3aGljaCBvZiB0aGVzZSBhcmUga2V5CgkgKiBjb2x1bW5zLCBhbmQgd2hpY2ggYXJlIGp1 c3QgcGFydCBvZiB0aGUgSU5DTFVERSBsaXN0IGJ5IGNoZWNraW5nIHRoZQoJICogbGlzdCBw b3NpdGlvbi4gIEEgbGlzdCBpdGVtIGluIGEgcG9zaXRpb24gbGVzcyB0aGFuIGlpX051bUlu ZGV4S2V5QXR0cnMKCSAqIGlzIHBhcnQgb2YgdGhlIGtleSBjb2x1bW5zLCBhbmQgYW55dGhp bmcgZXF1YWwgdG8gYW5kIG92ZXIgaXMgcGFydCBvZgoJICogdGhlIElOQ0xVREUgY29sdW1u cy4KCSAqLwoJYWxsSW5kZXhQYXJhbXMgPSBsaXN0X2NvbmNhdF9jb3B5KHN0bXQtPmluZGV4 UGFyYW1zLAoJCQkJCQkJCQkgIHN0bXQtPmluZGV4SW5jbHVkaW5nUGFyYW1zKTsKCW51bWJl ck9mQXR0cmlidXRlcyA9IGxpc3RfbGVuZ3RoKGFsbEluZGV4UGFyYW1zKTsKCglpZiAobnVt YmVyT2ZLZXlBdHRyaWJ1dGVzIDw9IDApCgkJZXJlcG9ydChFUlJPUiwKCQkJCShlcnJjb2Rl KEVSUkNPREVfSU5WQUxJRF9PQkpFQ1RfREVGSU5JVElPTiksCgkJCQkgZXJybXNnKCJtdXN0 IHNwZWNpZnkgYXQgbGVhc3Qgb25lIGNvbHVtbiIpKSk7CglpZiAobnVtYmVyT2ZBdHRyaWJ1 dGVzID4gSU5ERVhfTUFYX0tFWVMpCgkJZXJlcG9ydChFUlJPUiwKCQkJCShlcnJjb2RlKEVS UkNPREVfVE9PX01BTllfQ09MVU1OUyksCgkJCQkgZXJybXNnKCJjYW5ub3QgdXNlIG1vcmUg dGhhbiAlZCBjb2x1bW5zIGluIGFuIGluZGV4IiwKCQkJCQkJSU5ERVhfTUFYX0tFWVMpKSk7 CgoJLyoKCSAqIE9ubHkgU0VMRUNUIC4uLiBGT1IgVVBEQVRFL1NIQVJFIGFyZSBhbGxvd2Vk IHdoaWxlIGRvaW5nIGEgc3RhbmRhcmQKCSAqIGluZGV4IGJ1aWxkOyBidXQgZm9yIGNvbmN1 cnJlbnQgYnVpbGRzIHdlIGFsbG93IElOU0VSVC9VUERBVEUvREVMRVRFCgkgKiAoYnV0IG5v dCBWQUNVVU0pLgoJICoKCSAqIE5COiBDYWxsZXIgaXMgcmVzcG9uc2libGUgZm9yIG1ha2lu ZyBzdXJlIHRoYXQgdGFibGVJZCByZWZlcnMgdG8gdGhlCgkgKiByZWxhdGlvbiBvbiB3aGlj aCB0aGUgaW5kZXggc2hvdWxkIGJlIGJ1aWx0OyBleGNlcHQgaW4gYm9vdHN0cmFwIG1vZGUs CgkgKiB0aGlzIHdpbGwgdHlwaWNhbGx5IHJlcXVpcmUgdGhlIGNhbGxlciB0byBoYXZlIGFs cmVhZHkgbG9ja2VkIHRoZQoJICogcmVsYXRpb24uICBUbyBhdm9pZCBsb2NrIHVwZ3JhZGUg aGF6YXJkcywgdGhhdCBsb2NrIHNob3VsZCBiZSBhdCBsZWFzdAoJICogYXMgc3Ryb25nIGFz IHRoZSBvbmUgd2UgdGFrZSBoZXJlLgoJICoKCSAqIE5COiBJZiB0aGUgbG9jayBzdHJlbmd0 aCBoZXJlIGV2ZXIgY2hhbmdlcywgY29kZSB0aGF0IGlzIHJ1biBieQoJICogcGFyYWxsZWwg d29ya2VycyB1bmRlciB0aGUgY29udHJvbCBvZiBjZXJ0YWluIHBhcnRpY3VsYXIgYW1idWls ZAoJICogZnVuY3Rpb25zIHdpbGwgbmVlZCB0byBiZSB1cGRhdGVkLCB0b28uCgkgKi8KCWxv Y2ttb2RlID0gY29uY3VycmVudCA/IFNoYXJlVXBkYXRlRXhjbHVzaXZlTG9jayA6IFNoYXJl TG9jazsKCXJlbCA9IHRhYmxlX29wZW4odGFibGVJZCwgbG9ja21vZGUpOwoKCS8qCgkgKiBT d2l0Y2ggdG8gdGhlIHRhYmxlIG93bmVyJ3MgdXNlcmlkLCBzbyB0aGF0IGFueSBpbmRleCBm dW5jdGlvbnMgYXJlIHJ1bgoJICogYXMgdGhhdCB1c2VyLiAgQWxzbyBsb2NrIGRvd24gc2Vj dXJpdHktcmVzdHJpY3RlZCBvcGVyYXRpb25zLiAgV2UKCSAqIGFscmVhZHkgYXJyYW5nZWQg dG8gbWFrZSBHVUMgdmFyaWFibGUgY2hhbmdlcyBsb2NhbCB0byB0aGlzIGNvbW1hbmQuCgkg Ki8KCUdldFVzZXJJZEFuZFNlY0NvbnRleHQoJnJvb3Rfc2F2ZV91c2VyaWQsICZyb290X3Nh dmVfc2VjX2NvbnRleHQpOwoJU2V0VXNlcklkQW5kU2VjQ29udGV4dChyZWwtPnJkX3JlbC0+ cmVsb3duZXIsCgkJCQkJCSAgIHJvb3Rfc2F2ZV9zZWNfY29udGV4dCB8IFNFQ1VSSVRZX1JF U1RSSUNURURfT1BFUkFUSU9OKTsKCgluYW1lc3BhY2VJZCA9IFJlbGF0aW9uR2V0TmFtZXNw YWNlKHJlbCk7CgoJLyoKCSAqIEl0IGhhcyBleGNsdXNpb24gY29uc3RyYWludCBiZWhhdmlv ciBpZiBpdCdzIGFuIEVYQ0xVREUgY29uc3RyYWludCBvciBhCgkgKiB0ZW1wb3JhbCBQUklN QVJZIEtFWS9VTklRVUUgY29uc3RyYWludAoJICovCglleGNsdXNpb24gPSBzdG10LT5leGNs dWRlT3BOYW1lcyB8fCBzdG10LT5pc3dpdGhvdXRvdmVybGFwczsKCgkvKiBFbnN1cmUgdGhh dCBpdCBtYWtlcyBzZW5zZSB0byBpbmRleCB0aGlzIGtpbmQgb2YgcmVsYXRpb24gKi8KCXN3 aXRjaCAocmVsLT5yZF9yZWwtPnJlbGtpbmQpCgl7CgkJY2FzZSBSRUxLSU5EX1JFTEFUSU9O OgoJCWNhc2UgUkVMS0lORF9NQVRWSUVXOgoJCWNhc2UgUkVMS0lORF9QQVJUSVRJT05FRF9U QUJMRToKCQkJLyogT0sgKi8KCQkJYnJlYWs7CgkJZGVmYXVsdDoKCQkJZXJlcG9ydChFUlJP UiwKCQkJCQkoZXJyY29kZShFUlJDT0RFX1dST05HX09CSkVDVF9UWVBFKSwKCQkJCQkgZXJy bXNnKCJjYW5ub3QgY3JlYXRlIGluZGV4IG9uIHJlbGF0aW9uIFwiJXNcIiIsCgkJCQkJCQlS ZWxhdGlvbkdldFJlbGF0aW9uTmFtZShyZWwpKSwKCQkJCQkgZXJyZGV0YWlsX3JlbGtpbmRf bm90X3N1cHBvcnRlZChyZWwtPnJkX3JlbC0+cmVsa2luZCkpKTsKCQkJYnJlYWs7Cgl9CgoJ LyoKCSAqIEVzdGFibGlzaCBiZWhhdmlvciBmb3IgcGFydGl0aW9uZWQgdGFibGVzLCBhbmQg dmVyaWZ5IHNhbml0eSBvZgoJICogcGFyYW1ldGVycy4KCSAqCgkgKiBXZSBkbyBub3QgYnVp bGQgYW4gYWN0dWFsIGluZGV4IGluIHRoaXMgY2FzZTsgd2Ugb25seSBjcmVhdGUgYSBmZXcK CSAqIGNhdGFsb2cgZW50cmllcy4gIFRoZSBhY3R1YWwgaW5kZXhlcyBhcmUgYnVpbHQgYnkg cmVjdXJzaW5nIGZvciBlYWNoCgkgKiBwYXJ0aXRpb24uCgkgKi8KCXBhcnRpdGlvbmVkID0g cmVsLT5yZF9yZWwtPnJlbGtpbmQgPT0gUkVMS0lORF9QQVJUSVRJT05FRF9UQUJMRTsKCWlm IChwYXJ0aXRpb25lZCkKCXsKCQkvKgoJCSAqIE5vdGU6IHdlIGNoZWNrICdzdG10LT5jb25j dXJyZW50JyByYXRoZXIgdGhhbiAnY29uY3VycmVudCcsIHNvIHRoYXQKCQkgKiB0aGUgZXJy b3IgaXMgdGhyb3duIGFsc28gZm9yIHRlbXBvcmFyeSB0YWJsZXMuICBTZWVtcyBiZXR0ZXIg dG8gYmUKCQkgKiBjb25zaXN0ZW50LCBldmVuIHRob3VnaCB3ZSBjb3VsZCBkbyBpdCBvbiB0 ZW1wb3JhcnkgdGFibGUgYmVjYXVzZQoJCSAqIHdlJ3JlIG5vdCBhY3R1YWxseSBkb2luZyBp dCBjb25jdXJyZW50bHkuCgkJICovCgkJaWYgKHN0bXQtPmNvbmN1cnJlbnQpCgkJCWVyZXBv cnQoRVJST1IsCgkJCQkJKGVycmNvZGUoRVJSQ09ERV9GRUFUVVJFX05PVF9TVVBQT1JURUQp LAoJCQkJCSBlcnJtc2coImNhbm5vdCBjcmVhdGUgaW5kZXggb24gcGFydGl0aW9uZWQgdGFi bGUgXCIlc1wiIGNvbmN1cnJlbnRseSIsCgkJCQkJCQlSZWxhdGlvbkdldFJlbGF0aW9uTmFt ZShyZWwpKSkpOwoJfQoKCS8qCgkgKiBEb24ndCB0cnkgdG8gQ1JFQVRFIElOREVYIG9uIHRl bXAgdGFibGVzIG9mIG90aGVyIGJhY2tlbmRzLgoJICovCglpZiAoUkVMQVRJT05fSVNfT1RI RVJfVEVNUChyZWwpKQoJCWVyZXBvcnQoRVJST1IsCgkJCQkoZXJyY29kZShFUlJDT0RFX0ZF QVRVUkVfTk9UX1NVUFBPUlRFRCksCgkJCQkgZXJybXNnKCJjYW5ub3QgY3JlYXRlIGluZGV4 ZXMgb24gdGVtcG9yYXJ5IHRhYmxlcyBvZiBvdGhlciBzZXNzaW9ucyIpKSk7CgoJLyoKCSAq IFVubGVzcyBvdXIgY2FsbGVyIHZvdWNoZXMgZm9yIGhhdmluZyBjaGVja2VkIHRoaXMgYWxy ZWFkeSwgaW5zaXN0IHRoYXQKCSAqIHRoZSB0YWJsZSBub3QgYmUgaW4gdXNlIGJ5IG91ciBv d24gc2Vzc2lvbiwgZWl0aGVyLiAgT3RoZXJ3aXNlIHdlIG1pZ2h0CgkgKiBmYWlsIHRvIG1h a2UgZW50cmllcyBpbiB0aGUgbmV3IGluZGV4IChmb3IgaW5zdGFuY2UsIGlmIGFuIElOU0VS VCBvcgoJICogVVBEQVRFIGlzIGluIHByb2dyZXNzIGFuZCBoYXMgYWxyZWFkeSBtYWRlIGl0 cyBsaXN0IG9mIHRhcmdldCBpbmRleGVzKS4KCSAqLwoJaWYgKGNoZWNrX25vdF9pbl91c2Up CgkJQ2hlY2tUYWJsZU5vdEluVXNlKHJlbCwgIkNSRUFURSBJTkRFWCIpOwoKCS8qCgkgKiBW ZXJpZnkgd2UgKHN0aWxsKSBoYXZlIENSRUFURSByaWdodHMgaW4gdGhlIHJlbCdzIG5hbWVz cGFjZS4KCSAqIChQcmVzdW1hYmx5IHdlIGRpZCB3aGVuIHRoZSByZWwgd2FzIGNyZWF0ZWQs IGJ1dCBtYXliZSBub3QgYW55bW9yZS4pCgkgKiBTa2lwIGNoZWNrIGlmIGNhbGxlciBkb2Vz bid0IHdhbnQgaXQuICBBbHNvIHNraXAgY2hlY2sgaWYKCSAqIGJvb3RzdHJhcHBpbmcsIHNp bmNlIHBlcm1pc3Npb25zIG1hY2hpbmVyeSBtYXkgbm90IGJlIHdvcmtpbmcgeWV0LgoJICov CglpZiAoY2hlY2tfcmlnaHRzICYmICFJc0Jvb3RzdHJhcFByb2Nlc3NpbmdNb2RlKCkpCgl7 CgkJQWNsUmVzdWx0CWFjbHJlc3VsdDsKCgkJYWNscmVzdWx0ID0gb2JqZWN0X2FjbGNoZWNr KE5hbWVzcGFjZVJlbGF0aW9uSWQsIG5hbWVzcGFjZUlkLCByb290X3NhdmVfdXNlcmlkLAoJ CQkJCQkJCQlBQ0xfQ1JFQVRFKTsKCQlpZiAoYWNscmVzdWx0ICE9IEFDTENIRUNLX09LKQoJ CQlhY2xjaGVja19lcnJvcihhY2xyZXN1bHQsIE9CSkVDVF9TQ0hFTUEsCgkJCQkJCSAgIGdl dF9uYW1lc3BhY2VfbmFtZShuYW1lc3BhY2VJZCkpOwoJfQoKCS8qCgkgKiBTZWxlY3QgdGFi bGVzcGFjZSB0byB1c2UuICBJZiBub3Qgc3BlY2lmaWVkLCB1c2UgZGVmYXVsdCB0YWJsZXNw YWNlCgkgKiAod2hpY2ggbWF5IGluIHR1cm4gZGVmYXVsdCB0byBkYXRhYmFzZSdzIGRlZmF1 bHQpLgoJICovCglpZiAoc3RtdC0+dGFibGVTcGFjZSkKCXsKCQl0YWJsZXNwYWNlSWQgPSBn ZXRfdGFibGVzcGFjZV9vaWQoc3RtdC0+dGFibGVTcGFjZSwgZmFsc2UpOwoJCWlmIChwYXJ0 aXRpb25lZCAmJiB0YWJsZXNwYWNlSWQgPT0gTXlEYXRhYmFzZVRhYmxlU3BhY2UpCgkJCWVy ZXBvcnQoRVJST1IsCgkJCQkJKGVycmNvZGUoRVJSQ09ERV9GRUFUVVJFX05PVF9TVVBQT1JU RUQpLAoJCQkJCSBlcnJtc2coImNhbm5vdCBzcGVjaWZ5IGRlZmF1bHQgdGFibGVzcGFjZSBm b3IgcGFydGl0aW9uZWQgcmVsYXRpb25zIikpKTsKCX0KCWVsc2UKCXsKCQl0YWJsZXNwYWNl SWQgPSBHZXREZWZhdWx0VGFibGVzcGFjZShyZWwtPnJkX3JlbC0+cmVscGVyc2lzdGVuY2Us CgkJCQkJCQkJCQkJcGFydGl0aW9uZWQpOwoJCS8qIG5vdGUgSW52YWxpZE9pZCBpcyBPSyBp biB0aGlzIGNhc2UgKi8KCX0KCgkvKiBDaGVjayB0YWJsZXNwYWNlIHBlcm1pc3Npb25zICov CglpZiAoY2hlY2tfcmlnaHRzICYmCgkJT2lkSXNWYWxpZCh0YWJsZXNwYWNlSWQpICYmIHRh Ymxlc3BhY2VJZCAhPSBNeURhdGFiYXNlVGFibGVTcGFjZSkKCXsKCQlBY2xSZXN1bHQJYWNs cmVzdWx0OwoKCQlhY2xyZXN1bHQgPSBvYmplY3RfYWNsY2hlY2soVGFibGVTcGFjZVJlbGF0 aW9uSWQsIHRhYmxlc3BhY2VJZCwgcm9vdF9zYXZlX3VzZXJpZCwKCQkJCQkJCQkJQUNMX0NS RUFURSk7CgkJaWYgKGFjbHJlc3VsdCAhPSBBQ0xDSEVDS19PSykKCQkJYWNsY2hlY2tfZXJy b3IoYWNscmVzdWx0LCBPQkpFQ1RfVEFCTEVTUEFDRSwKCQkJCQkJICAgZ2V0X3RhYmxlc3Bh Y2VfbmFtZSh0YWJsZXNwYWNlSWQpKTsKCX0KCgkvKgoJICogRm9yY2Ugc2hhcmVkIGluZGV4 ZXMgaW50byB0aGUgcGdfZ2xvYmFsIHRhYmxlc3BhY2UuICBUaGlzIGlzIGEgYml0IG9mIGEK CSAqIGhhY2sgYnV0IHNlZW1zIHNpbXBsZXIgdGhhbiBtYXJraW5nIHRoZW0gaW4gdGhlIEJL SSBjb21tYW5kcy4gIE9uIHRoZQoJICogb3RoZXIgaGFuZCwgaWYgaXQncyBub3Qgc2hhcmVk LCBkb24ndCBhbGxvdyBpdCB0byBiZSBwbGFjZWQgdGhlcmUuCgkgKi8KCWlmIChyZWwtPnJk X3JlbC0+cmVsaXNzaGFyZWQpCgkJdGFibGVzcGFjZUlkID0gR0xPQkFMVEFCTEVTUEFDRV9P SUQ7CgllbHNlIGlmICh0YWJsZXNwYWNlSWQgPT0gR0xPQkFMVEFCTEVTUEFDRV9PSUQpCgkJ ZXJlcG9ydChFUlJPUiwKCQkJCShlcnJjb2RlKEVSUkNPREVfSU5WQUxJRF9QQVJBTUVURVJf VkFMVUUpLAoJCQkJIGVycm1zZygib25seSBzaGFyZWQgcmVsYXRpb25zIGNhbiBiZSBwbGFj ZWQgaW4gcGdfZ2xvYmFsIHRhYmxlc3BhY2UiKSkpOwoKCS8qCgkgKiBDaG9vc2UgdGhlIGlu ZGV4IGNvbHVtbiBuYW1lcy4KCSAqLwoJaW5kZXhDb2xOYW1lcyA9IENob29zZUluZGV4Q29s dW1uTmFtZXMoYWxsSW5kZXhQYXJhbXMpOwoKCS8qCgkgKiBTZWxlY3QgbmFtZSBmb3IgaW5k ZXggaWYgY2FsbGVyIGRpZG4ndCBzcGVjaWZ5CgkgKi8KCWluZGV4UmVsYXRpb25OYW1lID0g c3RtdC0+aWR4bmFtZTsKCWlmIChpbmRleFJlbGF0aW9uTmFtZSA9PSBOVUxMKQoJCWluZGV4 UmVsYXRpb25OYW1lID0gQ2hvb3NlSW5kZXhOYW1lKFJlbGF0aW9uR2V0UmVsYXRpb25OYW1l KHJlbCksCgkJCQkJCQkJCQkJbmFtZXNwYWNlSWQsCgkJCQkJCQkJCQkJaW5kZXhDb2xOYW1l cywKCQkJCQkJCQkJCQlzdG10LT5leGNsdWRlT3BOYW1lcywKCQkJCQkJCQkJCQlzdG10LT5w cmltYXJ5LAoJCQkJCQkJCQkJCXN0bXQtPmlzY29uc3RyYWludCk7CgoJLyoKCSAqIGxvb2sg dXAgdGhlIGFjY2VzcyBtZXRob2QsIHZlcmlmeSBpdCBjYW4gaGFuZGxlIHRoZSByZXF1ZXN0 ZWQgZmVhdHVyZXMKCSAqLwoJYWNjZXNzTWV0aG9kTmFtZSA9IHN0bXQtPmFjY2Vzc01ldGhv ZDsKCXR1cGxlID0gU2VhcmNoU3lzQ2FjaGUxKEFNTkFNRSwgUG9pbnRlckdldERhdHVtKGFj Y2Vzc01ldGhvZE5hbWUpKTsKCWlmICghSGVhcFR1cGxlSXNWYWxpZCh0dXBsZSkpCgl7CgkJ LyoKCQkgKiBIYWNrIHRvIHByb3ZpZGUgbW9yZS1vci1sZXNzLXRyYW5zcGFyZW50IHVwZGF0 aW5nIG9mIG9sZCBSVFJFRQoJCSAqIGluZGV4ZXMgdG8gR2lTVDogaWYgUlRSRUUgaXMgcmVx dWVzdGVkIGFuZCBub3QgZm91bmQsIHVzZSBHSVNULgoJCSAqLwoJCWlmIChzdHJjbXAoYWNj ZXNzTWV0aG9kTmFtZSwgInJ0cmVlIikgPT0gMCkKCQl7CgkJCWVyZXBvcnQoTk9USUNFLAoJ CQkJCShlcnJtc2coInN1YnN0aXR1dGluZyBhY2Nlc3MgbWV0aG9kIFwiZ2lzdFwiIGZvciBv YnNvbGV0ZSBtZXRob2QgXCJydHJlZVwiIikpKTsKCQkJYWNjZXNzTWV0aG9kTmFtZSA9ICJn aXN0IjsKCQkJdHVwbGUgPSBTZWFyY2hTeXNDYWNoZTEoQU1OQU1FLCBQb2ludGVyR2V0RGF0 dW0oYWNjZXNzTWV0aG9kTmFtZSkpOwoJCX0KCgkJaWYgKCFIZWFwVHVwbGVJc1ZhbGlkKHR1 cGxlKSkKCQkJZXJlcG9ydChFUlJPUiwKCQkJCQkoZXJyY29kZShFUlJDT0RFX1VOREVGSU5F RF9PQkpFQ1QpLAoJCQkJCSBlcnJtc2coImFjY2VzcyBtZXRob2QgXCIlc1wiIGRvZXMgbm90 IGV4aXN0IiwKCQkJCQkJCWFjY2Vzc01ldGhvZE5hbWUpKSk7Cgl9CglhY2Nlc3NNZXRob2RG b3JtID0gKEZvcm1fcGdfYW0pIEdFVFNUUlVDVCh0dXBsZSk7CglhY2Nlc3NNZXRob2RJZCA9 IGFjY2Vzc01ldGhvZEZvcm0tPm9pZDsKCWFtUm91dGluZSA9IEdldEluZGV4QW1Sb3V0aW5l KGFjY2Vzc01ldGhvZEZvcm0tPmFtaGFuZGxlcik7CgoJcGdzdGF0X3Byb2dyZXNzX3VwZGF0 ZV9wYXJhbShQUk9HUkVTU19DUkVBVEVJRFhfQUNDRVNTX01FVEhPRF9PSUQsCgkJCQkJCQkJ IGFjY2Vzc01ldGhvZElkKTsKCglpZiAoc3RtdC0+dW5pcXVlICYmICFzdG10LT5pc3dpdGhv dXRvdmVybGFwcyAmJiAhYW1Sb3V0aW5lLT5hbWNhbnVuaXF1ZSkKCQllcmVwb3J0KEVSUk9S LAoJCQkJKGVycmNvZGUoRVJSQ09ERV9GRUFUVVJFX05PVF9TVVBQT1JURUQpLAoJCQkJIGVy cm1zZygiYWNjZXNzIG1ldGhvZCBcIiVzXCIgZG9lcyBub3Qgc3VwcG9ydCB1bmlxdWUgaW5k ZXhlcyIsCgkJCQkJCWFjY2Vzc01ldGhvZE5hbWUpKSk7CglpZiAoc3RtdC0+aW5kZXhJbmNs dWRpbmdQYXJhbXMgIT0gTklMICYmICFhbVJvdXRpbmUtPmFtY2FuaW5jbHVkZSkKCQllcmVw b3J0KEVSUk9SLAoJCQkJKGVycmNvZGUoRVJSQ09ERV9GRUFUVVJFX05PVF9TVVBQT1JURUQp LAoJCQkJIGVycm1zZygiYWNjZXNzIG1ldGhvZCBcIiVzXCIgZG9lcyBub3Qgc3VwcG9ydCBp bmNsdWRlZCBjb2x1bW5zIiwKCQkJCQkJYWNjZXNzTWV0aG9kTmFtZSkpKTsKCWlmIChudW1i ZXJPZktleUF0dHJpYnV0ZXMgPiAxICYmICFhbVJvdXRpbmUtPmFtY2FubXVsdGljb2wpCgkJ ZXJlcG9ydChFUlJPUiwKCQkJCShlcnJjb2RlKEVSUkNPREVfRkVBVFVSRV9OT1RfU1VQUE9S VEVEKSwKCQkJCSBlcnJtc2coImFjY2VzcyBtZXRob2QgXCIlc1wiIGRvZXMgbm90IHN1cHBv cnQgbXVsdGljb2x1bW4gaW5kZXhlcyIsCgkJCQkJCWFjY2Vzc01ldGhvZE5hbWUpKSk7Cglp ZiAoZXhjbHVzaW9uICYmIGFtUm91dGluZS0+YW1nZXR0dXBsZSA9PSBOVUxMKQoJCWVyZXBv cnQoRVJST1IsCgkJCQkoZXJyY29kZShFUlJDT0RFX0ZFQVRVUkVfTk9UX1NVUFBPUlRFRCks CgkJCQkgZXJybXNnKCJhY2Nlc3MgbWV0aG9kIFwiJXNcIiBkb2VzIG5vdCBzdXBwb3J0IGV4 Y2x1c2lvbiBjb25zdHJhaW50cyIsCgkJCQkJCWFjY2Vzc01ldGhvZE5hbWUpKSk7CglpZiAo c3RtdC0+aXN3aXRob3V0b3ZlcmxhcHMgJiYgc3RyY21wKGFjY2Vzc01ldGhvZE5hbWUsICJn aXN0IikgIT0gMCkKCQllcmVwb3J0KEVSUk9SLAoJCQkJKGVycmNvZGUoRVJSQ09ERV9GRUFU VVJFX05PVF9TVVBQT1JURUQpLAoJCQkJIGVycm1zZygiYWNjZXNzIG1ldGhvZCBcIiVzXCIg ZG9lcyBub3Qgc3VwcG9ydCBXSVRIT1VUIE9WRVJMQVBTIGNvbnN0cmFpbnRzIiwKCQkJCQkJ YWNjZXNzTWV0aG9kTmFtZSkpKTsKCglhbWNhbm9yZGVyID0gYW1Sb3V0aW5lLT5hbWNhbm9y ZGVyOwoJYW1vcHRpb25zID0gYW1Sb3V0aW5lLT5hbW9wdGlvbnM7CglhbWlzc3VtbWFyaXpp bmcgPSBhbVJvdXRpbmUtPmFtc3VtbWFyaXppbmc7CgoJUmVsZWFzZVN5c0NhY2hlKHR1cGxl KTsKCgkvKgoJICogVmFsaWRhdGUgcHJlZGljYXRlLCBpZiBnaXZlbgoJICovCglpZiAoc3Rt dC0+d2hlcmVDbGF1c2UpCgkJQ2hlY2tQcmVkaWNhdGUoKEV4cHIgKikgc3RtdC0+d2hlcmVD bGF1c2UpOwoKCS8qCgkgKiBQYXJzZSBBTS1zcGVjaWZpYyBvcHRpb25zLCBjb252ZXJ0IHRv IHRleHQgYXJyYXkgZm9ybSwgdmFsaWRhdGUuCgkgKi8KCXJlbG9wdGlvbnMgPSB0cmFuc2Zv cm1SZWxPcHRpb25zKChEYXR1bSkgMCwgc3RtdC0+b3B0aW9ucywKCQkJCQkJCQkJIE5VTEws IE5VTEwsIGZhbHNlLCBmYWxzZSk7CgoJKHZvaWQpIGluZGV4X3JlbG9wdGlvbnMoYW1vcHRp b25zLCByZWxvcHRpb25zLCB0cnVlKTsKCgkvKgoJICogUHJlcGFyZSBhcmd1bWVudHMgZm9y IGluZGV4X2NyZWF0ZSwgcHJpbWFyaWx5IGFuIEluZGV4SW5mbyBzdHJ1Y3R1cmUuCgkgKiBO b3RlIHRoYXQgcHJlZGljYXRlcyBtdXN0IGJlIGluIGltcGxpY2l0LUFORCBmb3JtYXQuICBJ biBhIGNvbmN1cnJlbnQKCSAqIGJ1aWxkLCBtYXJrIGl0IG5vdC1yZWFkeS1mb3ItaW5zZXJ0 cy4KCSAqLwoJaW5kZXhJbmZvID0gbWFrZUluZGV4SW5mbyhudW1iZXJPZkF0dHJpYnV0ZXMs CgkJCQkJCQkgIG51bWJlck9mS2V5QXR0cmlidXRlcywKCQkJCQkJCSAgYWNjZXNzTWV0aG9k SWQsCgkJCQkJCQkgIE5JTCwJLyogZXhwcmVzc2lvbnMsIE5JTCBmb3Igbm93ICovCgkJCQkJ CQkgIG1ha2VfYW5kc19pbXBsaWNpdCgoRXhwciAqKSBzdG10LT53aGVyZUNsYXVzZSksCgkJ CQkJCQkgIHN0bXQtPnVuaXF1ZSwKCQkJCQkJCSAgc3RtdC0+bnVsbHNfbm90X2Rpc3RpbmN0 LAoJCQkJCQkJICAhY29uY3VycmVudCwKCQkJCQkJCSAgY29uY3VycmVudCwKCQkJCQkJCSAg YW1pc3N1bW1hcml6aW5nLAoJCQkJCQkJICBzdG10LT5pc3dpdGhvdXRvdmVybGFwcyk7Cglp bmRleEluZm8tPmlpX1ByZWRpY2F0ZUV4cGFuZCA9CgkJRXhwYW5kVmlydHVhbEdlbmVyYXRl ZENvbHVtbnMoaW5kZXhJbmZvLT5paV9QcmVkaWNhdGVFeHBhbmQsIHJlbCwgSW52YWxpZE9p ZCk7CgoJdHlwZUlkcyA9IHBhbGxvY19hcnJheShPaWQsIG51bWJlck9mQXR0cmlidXRlcyk7 Cgljb2xsYXRpb25JZHMgPSBwYWxsb2NfYXJyYXkoT2lkLCBudW1iZXJPZkF0dHJpYnV0ZXMp OwoJb3BjbGFzc0lkcyA9IHBhbGxvY19hcnJheShPaWQsIG51bWJlck9mQXR0cmlidXRlcyk7 CglvcGNsYXNzT3B0aW9ucyA9IHBhbGxvY19hcnJheShEYXR1bSwgbnVtYmVyT2ZBdHRyaWJ1 dGVzKTsKCWNvbG9wdGlvbnMgPSBwYWxsb2NfYXJyYXkoaW50MTYsIG51bWJlck9mQXR0cmli dXRlcyk7CglDb21wdXRlSW5kZXhBdHRycyhwc3RhdGUsCgkJCQkJICBpbmRleEluZm8sCgkJ CQkJICB0eXBlSWRzLCBjb2xsYXRpb25JZHMsIG9wY2xhc3NJZHMsIG9wY2xhc3NPcHRpb25z LAoJCQkJCSAgY29sb3B0aW9ucywgYWxsSW5kZXhQYXJhbXMsCgkJCQkJICBzdG10LT5leGNs dWRlT3BOYW1lcywgdGFibGVJZCwKCQkJCQkgIGFjY2Vzc01ldGhvZE5hbWUsIGFjY2Vzc01l dGhvZElkLAoJCQkJCSAgYW1jYW5vcmRlciwgc3RtdC0+aXNjb25zdHJhaW50LCBzdG10LT5p c3dpdGhvdXRvdmVybGFwcywKCQkJCQkgIHJvb3Rfc2F2ZV91c2VyaWQsIHJvb3Rfc2F2ZV9z ZWNfY29udGV4dCwKCQkJCQkgICZyb290X3NhdmVfbmVzdGxldmVsKTsKCglpbmRleEluZm8t PmlpX0V4cHJlc3Npb25zRXhwYW5kID0KCQlFeHBhbmRWaXJ0dWFsR2VuZXJhdGVkQ29sdW1u cyhpbmRleEluZm8tPmlpX0V4cHJlc3Npb25zRXhwYW5kLCByZWwsIEludmFsaWRPaWQpOwoJ LyoKCSAqIEV4dHJhIGNoZWNrcyB3aGVuIGNyZWF0aW5nIGEgUFJJTUFSWSBLRVkgaW5kZXgu CgkgKi8KCWlmIChzdG10LT5wcmltYXJ5KQoJCWluZGV4X2NoZWNrX3ByaW1hcnlfa2V5KHJl bCwgaW5kZXhJbmZvLCBpc19hbHRlcl90YWJsZSwgc3RtdCk7CgoJLyoKCSAqIElmIHRoaXMg dGFibGUgaXMgcGFydGl0aW9uZWQgYW5kIHdlJ3JlIGNyZWF0aW5nIGEgdW5pcXVlIGluZGV4 LCBwcmltYXJ5CgkgKiBrZXksIG9yIGV4Y2x1c2lvbiBjb25zdHJhaW50LCBtYWtlIHN1cmUg dGhhdCB0aGUgcGFydGl0aW9uIGtleSBpcyBhCgkgKiBzdWJzZXQgb2YgdGhlIGluZGV4J3Mg Y29sdW1ucy4gIE90aGVyd2lzZSBpdCB3b3VsZCBiZSBwb3NzaWJsZSB0bwoJICogdmlvbGF0 ZSB1bmlxdWVuZXNzIGJ5IHB1dHRpbmcgdmFsdWVzIHRoYXQgb3VnaHQgdG8gYmUgdW5pcXVl IGluCgkgKiBkaWZmZXJlbnQgcGFydGl0aW9ucy4KCSAqCgkgKiBXZSBjb3VsZCBsaWZ0IHRo aXMgbGltaXRhdGlvbiBpZiB3ZSBoYWQgZ2xvYmFsIGluZGV4ZXMsIGJ1dCB0aG9zZSBoYXZl CgkgKiB0aGVpciBvd24gcHJvYmxlbXMsIHNvIHRoaXMgaXMgYSB1c2VmdWwgZmVhdHVyZSBj b21iaW5hdGlvbi4KCSAqLwoJaWYgKHBhcnRpdGlvbmVkICYmIChzdG10LT51bmlxdWUgfHwg ZXhjbHVzaW9uKSkKCXsKCQlQYXJ0aXRpb25LZXkga2V5ID0gUmVsYXRpb25HZXRQYXJ0aXRp b25LZXkocmVsKTsKCQljb25zdCBjaGFyICpjb25zdHJhaW50X3R5cGU7CgkJaW50CQkJaTsK CgkJaWYgKHN0bXQtPnByaW1hcnkpCgkJCWNvbnN0cmFpbnRfdHlwZSA9ICJQUklNQVJZIEtF WSI7CgkJZWxzZSBpZiAoc3RtdC0+dW5pcXVlKQoJCQljb25zdHJhaW50X3R5cGUgPSAiVU5J UVVFIjsKCQllbHNlIGlmIChzdG10LT5leGNsdWRlT3BOYW1lcykKCQkJY29uc3RyYWludF90 eXBlID0gIkVYQ0xVREUiOwoJCWVsc2UKCQl7CgkJCWVsb2coRVJST1IsICJ1bmtub3duIGNv bnN0cmFpbnQgdHlwZSIpOwoJCQljb25zdHJhaW50X3R5cGUgPSBOVUxMOyAvKiBrZWVwIGNv bXBpbGVyIHF1aWV0ICovCgkJfQoKCQkvKgoJCSAqIFZlcmlmeSB0aGF0IGFsbCB0aGUgY29s dW1ucyBpbiB0aGUgcGFydGl0aW9uIGtleSBhcHBlYXIgaW4gdGhlCgkJICogdW5pcXVlIGtl eSBkZWZpbml0aW9uLCB3aXRoIHRoZSBzYW1lIG5vdGlvbiBvZiBlcXVhbGl0eS4KCQkgKi8K CQlmb3IgKGkgPSAwOyBpIDwga2V5LT5wYXJ0bmF0dHM7IGkrKykKCQl7CgkJCWJvb2wJCWZv dW5kID0gZmFsc2U7CgkJCWludAkJCWVxX3N0cmF0ZWd5OwoJCQlPaWQJCQlwdGtleV9lcW9w OwoJCQlpbnQJCQlqOwoKCQkJLyoKCQkJICogSWRlbnRpZnkgdGhlIGVxdWFsaXR5IG9wZXJh dG9yIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHBhcnRrZXkKCQkJICogY29sdW1uLiAgRm9yIGxp c3QgYW5kIHJhbmdlIHBhcnRpdGlvbmluZywgcGFydGtleXMgdXNlIGJ0cmVlCgkJCSAqIG9w ZXJhdG9yIGNsYXNzZXM7IGhhc2ggcGFydGl0aW9uaW5nIHVzZXMgaGFzaCBvcGVyYXRvciBj bGFzc2VzLgoJCQkgKiAoS2VlcCB0aGlzIGluIHN5bmMgd2l0aCBDb21wdXRlUGFydGl0aW9u QXR0cnMhKQoJCQkgKi8KCQkJaWYgKGtleS0+c3RyYXRlZ3kgPT0gUEFSVElUSU9OX1NUUkFU RUdZX0hBU0gpCgkJCQllcV9zdHJhdGVneSA9IEhURXF1YWxTdHJhdGVneU51bWJlcjsKCQkJ ZWxzZQoJCQkJZXFfc3RyYXRlZ3kgPSBCVEVxdWFsU3RyYXRlZ3lOdW1iZXI7CgoJCQlwdGtl eV9lcW9wID0gZ2V0X29wZmFtaWx5X21lbWJlcihrZXktPnBhcnRvcGZhbWlseVtpXSwKCQkJ CQkJCQkJCQkga2V5LT5wYXJ0b3BjaW50eXBlW2ldLAoJCQkJCQkJCQkJCSBrZXktPnBhcnRv cGNpbnR5cGVbaV0sCgkJCQkJCQkJCQkJIGVxX3N0cmF0ZWd5KTsKCQkJaWYgKCFPaWRJc1Zh bGlkKHB0a2V5X2Vxb3ApKQoJCQkJZWxvZyhFUlJPUiwgIm1pc3Npbmcgb3BlcmF0b3IgJWQo JXUsJXUpIGluIHBhcnRpdGlvbiBvcGZhbWlseSAldSIsCgkJCQkJIGVxX3N0cmF0ZWd5LCBr ZXktPnBhcnRvcGNpbnR5cGVbaV0sIGtleS0+cGFydG9wY2ludHlwZVtpXSwKCQkJCQkga2V5 LT5wYXJ0b3BmYW1pbHlbaV0pOwoKCQkJLyoKCQkJICogSXQgbWF5IGJlIHBvc3NpYmxlIHRv IHN1cHBvcnQgVU5JUVVFIGNvbnN0cmFpbnRzIHdoZW4gcGFydGl0aW9uCgkJCSAqIGtleXMg YXJlIGV4cHJlc3Npb25zLCBidXQgaXMgaXQgd29ydGggaXQ/ICBHaXZlIHVwIGZvciBub3cu CgkJCSAqLwoJCQlpZiAoa2V5LT5wYXJ0YXR0cnNbaV0gPT0gMCkKCQkJCWVyZXBvcnQoRVJS T1IsCgkJCQkJCShlcnJjb2RlKEVSUkNPREVfRkVBVFVSRV9OT1RfU1VQUE9SVEVEKSwKCQkJ CQkJIGVycm1zZygidW5zdXBwb3J0ZWQgJXMgY29uc3RyYWludCB3aXRoIHBhcnRpdGlvbiBr ZXkgZGVmaW5pdGlvbiIsCgkJCQkJCQkJY29uc3RyYWludF90eXBlKSwKCQkJCQkJIGVycmRl dGFpbCgiJXMgY29uc3RyYWludHMgY2Fubm90IGJlIHVzZWQgd2hlbiBwYXJ0aXRpb24ga2V5 cyBpbmNsdWRlIGV4cHJlc3Npb25zLiIsCgkJCQkJCQkJICAgY29uc3RyYWludF90eXBlKSkp OwoKCQkJLyogU2VhcmNoIHRoZSBpbmRleCBjb2x1bW4ocykgZm9yIGEgbWF0Y2ggKi8KCQkJ Zm9yIChqID0gMDsgaiA8IGluZGV4SW5mby0+aWlfTnVtSW5kZXhLZXlBdHRyczsgaisrKQoJ CQl7CgkJCQlpZiAoa2V5LT5wYXJ0YXR0cnNbaV0gPT0gaW5kZXhJbmZvLT5paV9JbmRleEF0 dHJOdW1iZXJzW2pdKQoJCQkJewoJCQkJCS8qCgkJCQkJICogTWF0Y2hlZCB0aGUgY29sdW1u LCBub3cgd2hhdCBhYm91dCB0aGUgY29sbGF0aW9uIGFuZAoJCQkJCSAqIGVxdWFsaXR5IG9w PwoJCQkJCSAqLwoJCQkJCU9pZAkJCWlkeF9vcGZhbWlseTsKCQkJCQlPaWQJCQlpZHhfb3Bj aW50eXBlOwoKCQkJCQlpZiAoa2V5LT5wYXJ0Y29sbGF0aW9uW2ldICE9IGNvbGxhdGlvbklk c1tqXSkKCQkJCQkJY29udGludWU7CgoJCQkJCWlmIChnZXRfb3BjbGFzc19vcGZhbWlseV9h bmRfaW5wdXRfdHlwZShvcGNsYXNzSWRzW2pdLAoJCQkJCQkJCQkJCQkJCQkmaWR4X29wZmFt aWx5LAoJCQkJCQkJCQkJCQkJCQkmaWR4X29wY2ludHlwZSkpCgkJCQkJewoJCQkJCQlPaWQJ CQlpZHhfZXFvcCA9IEludmFsaWRPaWQ7CgoJCQkJCQlpZiAoc3RtdC0+dW5pcXVlICYmICFz dG10LT5pc3dpdGhvdXRvdmVybGFwcykKCQkJCQkJCWlkeF9lcW9wID0gZ2V0X29wZmFtaWx5 X21lbWJlcl9mb3JfY21wdHlwZShpZHhfb3BmYW1pbHksCgkJCQkJCQkJCQkJCQkJCQkJICAg aWR4X29wY2ludHlwZSwKCQkJCQkJCQkJCQkJCQkJCQkgICBpZHhfb3BjaW50eXBlLAoJCQkJ CQkJCQkJCQkJCQkJCSAgIENPTVBBUkVfRVEpOwoJCQkJCQllbHNlIGlmIChleGNsdXNpb24p CgkJCQkJCQlpZHhfZXFvcCA9IGluZGV4SW5mby0+aWlfRXhjbHVzaW9uT3BzW2pdOwoKCQkJ CQkJaWYgKCFpZHhfZXFvcCkKCQkJCQkJCWVyZXBvcnQoRVJST1IsCgkJCQkJCQkJCWVycmNv ZGUoRVJSQ09ERV9VTkRFRklORURfT0JKRUNUKSwKCQkJCQkJCQkJZXJybXNnKCJjb3VsZCBu b3QgaWRlbnRpZnkgYW4gZXF1YWxpdHkgb3BlcmF0b3IgZm9yIHR5cGUgJXMiLCBmb3JtYXRf dHlwZV9iZShpZHhfb3BjaW50eXBlKSksCgkJCQkJCQkJCWVycmRldGFpbCgiVGhlcmUgaXMg bm8gc3VpdGFibGUgb3BlcmF0b3IgaW4gb3BlcmF0b3IgZmFtaWx5IFwiJXNcIiBmb3IgYWNj ZXNzIG1ldGhvZCBcIiVzXCIuIiwKCQkJCQkJCQkJCQkgIGdldF9vcGZhbWlseV9uYW1lKGlk eF9vcGZhbWlseSwgZmFsc2UpLCBnZXRfYW1fbmFtZShnZXRfb3BmYW1pbHlfbWV0aG9kKGlk eF9vcGZhbWlseSkpKSk7CgoJCQkJCQlpZiAocHRrZXlfZXFvcCA9PSBpZHhfZXFvcCkKCQkJ CQkJewoJCQkJCQkJZm91bmQgPSB0cnVlOwoJCQkJCQkJYnJlYWs7CgkJCQkJCX0KCQkJCQkJ ZWxzZSBpZiAoZXhjbHVzaW9uKQoJCQkJCQl7CgkJCQkJCQkvKgoJCQkJCQkJICogV2UgZm91 bmQgYSBtYXRjaCwgYnV0IGl0J3Mgbm90IGFuIGVxdWFsaXR5CgkJCQkJCQkgKiBvcGVyYXRv ci4gSW5zdGVhZCBvZiBmYWlsaW5nIGJlbG93IHdpdGggYW4KCQkJCQkJCSAqIGVycm9yIG1l c3NhZ2UgYWJvdXQgYSBtaXNzaW5nIGNvbHVtbiwgZmFpbCBub3cKCQkJCQkJCSAqIGFuZCBl eHBsYWluIHRoYXQgdGhlIG9wZXJhdG9yIGlzIHdyb25nLgoJCQkJCQkJICovCgkJCQkJCQlG b3JtX3BnX2F0dHJpYnV0ZSBhdHQgPSBUdXBsZURlc2NBdHRyKFJlbGF0aW9uR2V0RGVzY3Io cmVsKSwga2V5LT5wYXJ0YXR0cnNbaV0gLSAxKTsKCgkJCQkJCQllcmVwb3J0KEVSUk9SLAoJ CQkJCQkJCQkoZXJyY29kZShFUlJDT0RFX0ZFQVRVUkVfTk9UX1NVUFBPUlRFRCksCgkJCQkJ CQkJCSBlcnJtc2coImNhbm5vdCBtYXRjaCBwYXJ0aXRpb24ga2V5IHRvIGluZGV4IG9uIGNv bHVtbiBcIiVzXCIgdXNpbmcgbm9uLWVxdWFsIG9wZXJhdG9yIFwiJXNcIiIsCgkJCQkJCQkJ CQkJTmFtZVN0cihhdHQtPmF0dG5hbWUpLAoJCQkJCQkJCQkJCWdldF9vcG5hbWUoaW5kZXhJ bmZvLT5paV9FeGNsdXNpb25PcHNbal0pKSkpOwoJCQkJCQl9CgkJCQkJfQoJCQkJfQoJCQl9 CgoJCQlpZiAoIWZvdW5kKQoJCQl7CgkJCQlGb3JtX3BnX2F0dHJpYnV0ZSBhdHQ7CgoJCQkJ YXR0ID0gVHVwbGVEZXNjQXR0cihSZWxhdGlvbkdldERlc2NyKHJlbCksCgkJCQkJCQkJCWtl eS0+cGFydGF0dHJzW2ldIC0gMSk7CgkJCQllcmVwb3J0KEVSUk9SLAoJCQkJCQkoZXJyY29k ZShFUlJDT0RFX0ZFQVRVUkVfTk9UX1NVUFBPUlRFRCksCgkJCQkvKiB0cmFuc2xhdG9yOiAl cyBpcyBVTklRVUUsIFBSSU1BUlkgS0VZLCBldGMgKi8KCQkJCQkJIGVycm1zZygiJXMgY29u c3RyYWludCBvbiBwYXJ0aXRpb25lZCB0YWJsZSBtdXN0IGluY2x1ZGUgYWxsIHBhcnRpdGlv bmluZyBjb2x1bW5zIiwKCQkJCQkJCQljb25zdHJhaW50X3R5cGUpLAoJCQkJLyogdHJhbnNs YXRvcjogZmlyc3QgJXMgaXMgVU5JUVVFLCBQUklNQVJZIEtFWSwgZXRjICovCgkJCQkJCSBl cnJkZXRhaWwoIiVzIGNvbnN0cmFpbnQgb24gdGFibGUgXCIlc1wiIGxhY2tzIGNvbHVtbiBc IiVzXCIgd2hpY2ggaXMgcGFydCBvZiB0aGUgcGFydGl0aW9uIGtleS4iLAoJCQkJCQkJCSAg IGNvbnN0cmFpbnRfdHlwZSwgUmVsYXRpb25HZXRSZWxhdGlvbk5hbWUocmVsKSwKCQkJCQkJ CQkgICBOYW1lU3RyKGF0dC0+YXR0bmFtZSkpKSk7CgkJCX0KCQl9Cgl9CgoKCS8qCgkgKiBX ZSBkaXNhbGxvdyBpbmRleGVzIG9uIHN5c3RlbSBjb2x1bW5zLiAgVGhleSB3b3VsZCBub3Qg bmVjZXNzYXJpbHkgZ2V0CgkgKiB1cGRhdGVkIGNvcnJlY3RseSwgYW5kIHRoZXkgZG9uJ3Qg c2VlbSB1c2VmdWwgYW55d2F5LgoJICoKCSAqIEFpc2FsbG93IHZpcnR1YWwgZ2VuZXJhdGVk IGNvbHVtbnMgaW4gaW5kZXhlcyAoaW5jbHVkZSB1c2luZyBleHByZXNzaW9uCgkgKiBpbmRl eCBpbnN0ZWFkKS4KCSAqLwoJZm9yIChpbnQgaSA9IDA7IGkgPCBpbmRleEluZm8tPmlpX051 bUluZGV4QXR0cnM7IGkrKykKCXsKCQlBdHRyTnVtYmVyCWF0dG5vID0gaW5kZXhJbmZvLT5p aV9JbmRleEF0dHJOdW1iZXJzW2ldOwoKCQlpZiAoYXR0bm8gPCAwKQoJCQllcmVwb3J0KEVS Uk9SLAoJCQkJCShlcnJjb2RlKEVSUkNPREVfRkVBVFVSRV9OT1RfU1VQUE9SVEVEKSwKCQkJ CQkgZXJybXNnKCJpbmRleCBjcmVhdGlvbiBvbiBzeXN0ZW0gY29sdW1ucyBpcyBub3Qgc3Vw cG9ydGVkIikpKTsKCgoJCS8qaWYgKGF0dG5vID4gMCAmJiBpIDwgbnVtYmVyT2ZLZXlBdHRy aWJ1dGVzICYmCgkJCVR1cGxlRGVzY0F0dHIoUmVsYXRpb25HZXREZXNjcihyZWwpLCBhdHRu byAtIDEpLT5hdHRnZW5lcmF0ZWQgPT0gQVRUUklCVVRFX0dFTkVSQVRFRF9WSVJUVUFMKQoJ CQllcmVwb3J0KEVSUk9SLAoJCQkJCWVycmNvZGUoRVJSQ09ERV9GRUFUVVJFX05PVF9TVVBQ T1JURUQpLAoJCQkJCXN0bXQtPnByaW1hcnkgPwoJCQkJCWVycm1zZygicHJpbWFyeSBrZXlz IG9uIHZpcnR1YWwgZ2VuZXJhdGVkIGNvbHVtbnMgYXJlIG5vdCBzdXBwb3J0ZWQiKSA6CgkJ CQkJc3RtdC0+aXNjb25zdHJhaW50ID8KCQkJCQllcnJtc2coInVuaXF1ZSBjb25zdHJhaW50 cyBvbiB2aXJ0dWFsIGdlbmVyYXRlZCBjb2x1bW5zIGFyZSBub3Qgc3VwcG9ydGVkIikgOgoJ CQkJCWVycm1zZygiaW5kZXhlcyBvbiB2aXJ0dWFsIGdlbmVyYXRlZCBjb2x1bW5zIGFyZSBu b3Qgc3VwcG9ydGVkIikpOyovCgl9CgoJLyoKCSAqIEFsc28gY2hlY2sgZm9yIHN5c3RlbSBj b2x1bW5zIHVzZWQgaW4gZXhwcmVzc2lvbnMgb3IgcHJlZGljYXRlcy4KCSAqLwoJaWYgKGlu ZGV4SW5mby0+aWlfRXhwcmVzc2lvbnMgfHwgaW5kZXhJbmZvLT5paV9QcmVkaWNhdGUpCgl7 CgkJQml0bWFwc2V0ICAqaW5kZXhhdHRycyA9IE5VTEw7CgoJCXB1bGxfdmFyYXR0bm9zKChO b2RlICopIGluZGV4SW5mby0+aWlfRXhwcmVzc2lvbnMsIDEsICZpbmRleGF0dHJzKTsKCQlw dWxsX3ZhcmF0dG5vcygoTm9kZSAqKSBpbmRleEluZm8tPmlpX1ByZWRpY2F0ZSwgMSwgJmlu ZGV4YXR0cnMpOwoKCQlmb3IgKGludCBpID0gRmlyc3RMb3dJbnZhbGlkSGVhcEF0dHJpYnV0 ZU51bWJlciArIDE7IGkgPCAwOyBpKyspCgkJewoJCQlpZiAoYm1zX2lzX21lbWJlcihpIC0g Rmlyc3RMb3dJbnZhbGlkSGVhcEF0dHJpYnV0ZU51bWJlciwKCQkJCQkJCSAgaW5kZXhhdHRy cykpCgkJCQllcmVwb3J0KEVSUk9SLAoJCQkJCQkoZXJyY29kZShFUlJDT0RFX0ZFQVRVUkVf Tk9UX1NVUFBPUlRFRCksCgkJCQkJCSBlcnJtc2coImluZGV4IGNyZWF0aW9uIG9uIHN5c3Rl bSBjb2x1bW5zIGlzIG5vdCBzdXBwb3J0ZWQiKSkpOwoJCX0KCX0KCgkvKiBJcyBpbmRleCBz YWZlIGZvciBvdGhlcnMgdG8gaWdub3JlPyAgU2VlIHNldF9pbmRleHNhZmVfcHJvY2ZsYWdz KCkgKi8KCXNhZmVfaW5kZXggPSBpbmRleEluZm8tPmlpX0V4cHJlc3Npb25zID09IE5JTCAm JgoJCWluZGV4SW5mby0+aWlfUHJlZGljYXRlID09IE5JTDsKCgkvKgoJICogUmVwb3J0IGlu ZGV4IGNyZWF0aW9uIGlmIGFwcHJvcHJpYXRlIChkZWxheSB0aGlzIHRpbGwgYWZ0ZXIgbW9z dCBvZiB0aGUKCSAqIGVycm9yIGNoZWNrcykKCSAqLwoJaWYgKHN0bXQtPmlzY29uc3RyYWlu dCAmJiAhcXVpZXQpCgl7CgkJY29uc3QgY2hhciAqY29uc3RyYWludF90eXBlOwoKCQlpZiAo c3RtdC0+cHJpbWFyeSkKCQkJY29uc3RyYWludF90eXBlID0gIlBSSU1BUlkgS0VZIjsKCQll bHNlIGlmIChzdG10LT51bmlxdWUpCgkJCWNvbnN0cmFpbnRfdHlwZSA9ICJVTklRVUUiOwoJ CWVsc2UgaWYgKHN0bXQtPmV4Y2x1ZGVPcE5hbWVzKQoJCQljb25zdHJhaW50X3R5cGUgPSAi RVhDTFVERSI7CgkJZWxzZQoJCXsKCQkJZWxvZyhFUlJPUiwgInVua25vd24gY29uc3RyYWlu dCB0eXBlIik7CgkJCWNvbnN0cmFpbnRfdHlwZSA9IE5VTEw7IC8qIGtlZXAgY29tcGlsZXIg cXVpZXQgKi8KCQl9CgoJCWVyZXBvcnQoREVCVUcxLAoJCQkJKGVycm1zZ19pbnRlcm5hbCgi JXMgJXMgd2lsbCBjcmVhdGUgaW1wbGljaXQgaW5kZXggXCIlc1wiIGZvciB0YWJsZSBcIiVz XCIiLAoJCQkJCQkJCSBpc19hbHRlcl90YWJsZSA/ICJBTFRFUiBUQUJMRSAvIEFERCIgOiAi Q1JFQVRFIFRBQkxFIC8iLAoJCQkJCQkJCSBjb25zdHJhaW50X3R5cGUsCgkJCQkJCQkJIGlu ZGV4UmVsYXRpb25OYW1lLCBSZWxhdGlvbkdldFJlbGF0aW9uTmFtZShyZWwpKSkpOwoJfQoK CS8qCgkgKiBBIHZhbGlkIHN0bXQtPm9sZE51bWJlciBpbXBsaWVzIHRoYXQgd2UgYWxyZWFk eSBoYXZlIGEgYnVpbHQgZm9ybSBvZgoJICogdGhlIGluZGV4LiAgVGhlIGNhbGxlciBzaG91 bGQgYWxzbyBkZWNsaW5lIGFueSBpbmRleCBidWlsZC4KCSAqLwoJQXNzZXJ0KCFSZWxGaWxl TnVtYmVySXNWYWxpZChzdG10LT5vbGROdW1iZXIpIHx8IChza2lwX2J1aWxkICYmICFjb25j dXJyZW50KSk7CgoJLyoKCSAqIE1ha2UgdGhlIGNhdGFsb2cgZW50cmllcyBmb3IgdGhlIGlu ZGV4LCBpbmNsdWRpbmcgY29uc3RyYWludHMuIFRoaXMKCSAqIHN0ZXAgYWxzbyBhY3R1YWxs eSBidWlsZHMgdGhlIGluZGV4LCBleGNlcHQgaWYgY2FsbGVyIHJlcXVlc3RlZCBub3QgdG8K CSAqIG9yIGluIGNvbmN1cnJlbnQgbW9kZSwgaW4gd2hpY2ggY2FzZSBpdCdsbCBiZSBkb25l IGxhdGVyLCBvciBkb2luZyBhCgkgKiBwYXJ0aXRpb25lZCBpbmRleCAoYmVjYXVzZSB0aG9z ZSBkb24ndCBoYXZlIHN0b3JhZ2UpLgoJICovCglmbGFncyA9IGNvbnN0cl9mbGFncyA9IDA7 CglpZiAoc3RtdC0+aXNjb25zdHJhaW50KQoJCWZsYWdzIHw9IElOREVYX0NSRUFURV9BRERf Q09OU1RSQUlOVDsKCWlmIChza2lwX2J1aWxkIHx8IGNvbmN1cnJlbnQgfHwgcGFydGl0aW9u ZWQpCgkJZmxhZ3MgfD0gSU5ERVhfQ1JFQVRFX1NLSVBfQlVJTEQ7CglpZiAoc3RtdC0+aWZf bm90X2V4aXN0cykKCQlmbGFncyB8PSBJTkRFWF9DUkVBVEVfSUZfTk9UX0VYSVNUUzsKCWlm IChjb25jdXJyZW50KQoJCWZsYWdzIHw9IElOREVYX0NSRUFURV9DT05DVVJSRU5UOwoJaWYg KHBhcnRpdGlvbmVkKQoJCWZsYWdzIHw9IElOREVYX0NSRUFURV9QQVJUSVRJT05FRDsKCWlm IChzdG10LT5wcmltYXJ5KQoJCWZsYWdzIHw9IElOREVYX0NSRUFURV9JU19QUklNQVJZOwoK CS8qCgkgKiBJZiB0aGUgdGFibGUgaXMgcGFydGl0aW9uZWQsIGFuZCByZWN1cnNpb24gd2Fz IGRlY2xpbmVkIGJ1dCBwYXJ0aXRpb25zCgkgKiBleGlzdCwgbWFyayB0aGUgaW5kZXggYXMg aW52YWxpZC4KCSAqLwoJaWYgKHBhcnRpdGlvbmVkICYmIHN0bXQtPnJlbGF0aW9uICYmICFz dG10LT5yZWxhdGlvbi0+aW5oKQoJewoJCVBhcnRpdGlvbkRlc2MgcGQgPSBSZWxhdGlvbkdl dFBhcnRpdGlvbkRlc2MocmVsLCB0cnVlKTsKCgkJaWYgKHBkLT5ucGFydHMgIT0gMCkKCQkJ ZmxhZ3MgfD0gSU5ERVhfQ1JFQVRFX0lOVkFMSUQ7Cgl9CgoJaWYgKHN0bXQtPmRlZmVycmFi bGUpCgkJY29uc3RyX2ZsYWdzIHw9IElOREVYX0NPTlNUUl9DUkVBVEVfREVGRVJSQUJMRTsK CWlmIChzdG10LT5pbml0ZGVmZXJyZWQpCgkJY29uc3RyX2ZsYWdzIHw9IElOREVYX0NPTlNU Ul9DUkVBVEVfSU5JVF9ERUZFUlJFRDsKCWlmIChzdG10LT5pc3dpdGhvdXRvdmVybGFwcykK CQljb25zdHJfZmxhZ3MgfD0gSU5ERVhfQ09OU1RSX0NSRUFURV9XSVRIT1VUX09WRVJMQVBT OwoKCWluZGV4UmVsYXRpb25JZCA9CgkJaW5kZXhfY3JlYXRlKHJlbCwgaW5kZXhSZWxhdGlv bk5hbWUsIGluZGV4UmVsYXRpb25JZCwgcGFyZW50SW5kZXhJZCwKCQkJCQkgcGFyZW50Q29u c3RyYWludElkLAoJCQkJCSBzdG10LT5vbGROdW1iZXIsIGluZGV4SW5mbywgaW5kZXhDb2xO YW1lcywKCQkJCQkgYWNjZXNzTWV0aG9kSWQsIHRhYmxlc3BhY2VJZCwKCQkJCQkgY29sbGF0 aW9uSWRzLCBvcGNsYXNzSWRzLCBvcGNsYXNzT3B0aW9ucywKCQkJCQkgY29sb3B0aW9ucywg TlVMTCwgcmVsb3B0aW9ucywKCQkJCQkgZmxhZ3MsIGNvbnN0cl9mbGFncywKCQkJCQkgYWxs b3dTeXN0ZW1UYWJsZU1vZHMsICFjaGVja19yaWdodHMsCgkJCQkJICZjcmVhdGVkQ29uc3Ry YWludElkKTsKCglPYmplY3RBZGRyZXNzU2V0KGFkZHJlc3MsIFJlbGF0aW9uUmVsYXRpb25J ZCwgaW5kZXhSZWxhdGlvbklkKTsKCglpZiAoIU9pZElzVmFsaWQoaW5kZXhSZWxhdGlvbklk KSkKCXsKCQkvKgoJCSAqIFJvbGwgYmFjayBhbnkgR1VDIGNoYW5nZXMgZXhlY3V0ZWQgYnkg aW5kZXggZnVuY3Rpb25zLiAgQWxzbyByZXZlcnQKCQkgKiB0byBvcmlnaW5hbCBkZWZhdWx0 X3RhYmxlc3BhY2UgaWYgd2UgY2hhbmdlZCBpdCBhYm92ZS4KCQkgKi8KCQlBdEVPWGFjdF9H VUMoZmFsc2UsIHJvb3Rfc2F2ZV9uZXN0bGV2ZWwpOwoKCQkvKiBSZXN0b3JlIHVzZXJpZCBh bmQgc2VjdXJpdHkgY29udGV4dCAqLwoJCVNldFVzZXJJZEFuZFNlY0NvbnRleHQocm9vdF9z YXZlX3VzZXJpZCwgcm9vdF9zYXZlX3NlY19jb250ZXh0KTsKCgkJdGFibGVfY2xvc2UocmVs LCBOb0xvY2spOwoKCQkvKiBJZiB0aGlzIGlzIHRoZSB0b3AtbGV2ZWwgaW5kZXgsIHdlJ3Jl IGRvbmUgKi8KCQlpZiAoIU9pZElzVmFsaWQocGFyZW50SW5kZXhJZCkpCgkJCXBnc3RhdF9w cm9ncmVzc19lbmRfY29tbWFuZCgpOwoKCQlyZXR1cm4gYWRkcmVzczsKCX0KCgkvKgoJICog Um9sbCBiYWNrIGFueSBHVUMgY2hhbmdlcyBleGVjdXRlZCBieSBpbmRleCBmdW5jdGlvbnMs IGFuZCBrZWVwCgkgKiBzdWJzZXF1ZW50IGNoYW5nZXMgbG9jYWwgdG8gdGhpcyBjb21tYW5k LiAgVGhpcyBpcyBlc3NlbnRpYWwgaWYgc29tZQoJICogaW5kZXggZnVuY3Rpb24gY2hhbmdl ZCBhIGJlaGF2aW9yLWFmZmVjdGluZyBHVUMsIGUuZy4gc2VhcmNoX3BhdGguCgkgKi8KCUF0 RU9YYWN0X0dVQyhmYWxzZSwgcm9vdF9zYXZlX25lc3RsZXZlbCk7Cglyb290X3NhdmVfbmVz dGxldmVsID0gTmV3R1VDTmVzdExldmVsKCk7CglSZXN0cmljdFNlYXJjaFBhdGgoKTsKCgkv KiBBZGQgYW55IHJlcXVlc3RlZCBjb21tZW50ICovCglpZiAoc3RtdC0+aWR4Y29tbWVudCAh PSBOVUxMKQoJCUNyZWF0ZUNvbW1lbnRzKGluZGV4UmVsYXRpb25JZCwgUmVsYXRpb25SZWxh dGlvbklkLCAwLAoJCQkJCSAgIHN0bXQtPmlkeGNvbW1lbnQpOwoKCWlmIChwYXJ0aXRpb25l ZCkKCXsKCQlQYXJ0aXRpb25EZXNjIHBhcnRkZXNjOwoKCQkvKgoJCSAqIFVubGVzcyBjYWxs ZXIgc3BlY2lmaWVkIHRvIHNraXAgdGhpcyBzdGVwICh2aWEgT05MWSksIHByb2Nlc3MgZWFj aAoJCSAqIHBhcnRpdGlvbiB0byBtYWtlIHN1cmUgdGhleSBhbGwgY29udGFpbiBhIGNvcnJl c3BvbmRpbmcgaW5kZXguCgkJICoKCQkgKiBJZiB3ZSdyZSBjYWxsZWQgaW50ZXJuYWxseSAo bm8gc3RtdC0+cmVsYXRpb24pLCByZWN1cnNlIGFsd2F5cy4KCQkgKi8KCQlwYXJ0ZGVzYyA9 IFJlbGF0aW9uR2V0UGFydGl0aW9uRGVzYyhyZWwsIHRydWUpOwoJCWlmICgoIXN0bXQtPnJl bGF0aW9uIHx8IHN0bXQtPnJlbGF0aW9uLT5pbmgpICYmIHBhcnRkZXNjLT5ucGFydHMgPiAw KQoJCXsKCQkJaW50CQkJbnBhcnRzID0gcGFydGRlc2MtPm5wYXJ0czsKCQkJT2lkCQkgICAq cGFydF9vaWRzID0gcGFsbG9jX2FycmF5KE9pZCwgbnBhcnRzKTsKCQkJYm9vbAkJaW52YWxp ZGF0ZV9wYXJlbnQgPSBmYWxzZTsKCQkJUmVsYXRpb24JcGFyZW50SW5kZXg7CgkJCVR1cGxl RGVzYwlwYXJlbnREZXNjOwoKCQkJLyoKCQkJICogUmVwb3J0IHRoZSB0b3RhbCBudW1iZXIg b2YgcGFydGl0aW9ucyBhdCB0aGUgc3RhcnQgb2YgdGhlCgkJCSAqIGNvbW1hbmQ7IGRvbid0 IHVwZGF0ZSBpdCB3aGVuIGJlaW5nIGNhbGxlZCByZWN1cnNpdmVseS4KCQkJICovCgkJCWlm ICghT2lkSXNWYWxpZChwYXJlbnRJbmRleElkKSkKCQkJewoJCQkJLyoKCQkJCSAqIFdoZW4g Y2FsbGVkIGJ5IFByb2Nlc3NVdGlsaXR5U2xvdywgdGhlIG51bWJlciBvZiBwYXJ0aXRpb25z CgkJCQkgKiBpcyBwYXNzZWQgaW4gYXMgYW4gb3B0aW1pemF0aW9uOyBidXQgb3RoZXIgY2Fs bGVycyBwYXNzIC0xCgkJCQkgKiBzaW5jZSB0aGV5IGRvbid0IGhhdmUgdGhlIHZhbHVlIGhh bmR5LiAgVGhpcyBzaG91bGQgY291bnQKCQkJCSAqIHBhcnRpdGlvbnMgdGhlIHNhbWUgd2F5 LCBpZSBvbmUgbGVzcyB0aGFuIHRoZSBudW1iZXIgb2YKCQkJCSAqIHJlbGF0aW9ucyBmaW5k X2FsbF9pbmhlcml0b3JzIHJlcG9ydHMuCgkJCQkgKgoJCQkJICogV2UgYXNzdW1lIHdlIG5l ZWRuJ3QgYXNrIGZpbmRfYWxsX2luaGVyaXRvcnMgdG8gdGFrZSBsb2NrcywKCQkJCSAqIGJl Y2F1c2UgdGhhdCBzaG91bGQgaGF2ZSBoYXBwZW5lZCBhbHJlYWR5IGZvciBhbGwgY2FsbGVy cy4KCQkJCSAqIEV2ZW4gaWYgaXQgZGlkIG5vdCwgdGhpcyBpcyBzYWZlIGFzIGxvbmcgYXMg d2UgZG9uJ3QgdHJ5IHRvCgkJCQkgKiB0b3VjaCB0aGUgcGFydGl0aW9ucyBoZXJlOyB0aGUg d29yc3QgY29uc2VxdWVuY2Ugd291bGQgYmUgYQoJCQkJICogYm9ndXMgcHJvZ3Jlc3MtcmVw b3J0aW5nIHRvdGFsLgoJCQkJICovCgkJCQlpZiAodG90YWxfcGFydHMgPCAwKQoJCQkJewoJ CQkJCUxpc3QJICAgKmNoaWxkcmVuID0gZmluZF9hbGxfaW5oZXJpdG9ycyh0YWJsZUlkLCBO b0xvY2ssIE5VTEwpOwoKCQkJCQl0b3RhbF9wYXJ0cyA9IGxpc3RfbGVuZ3RoKGNoaWxkcmVu KSAtIDE7CgkJCQkJbGlzdF9mcmVlKGNoaWxkcmVuKTsKCQkJCX0KCgkJCQlwZ3N0YXRfcHJv Z3Jlc3NfdXBkYXRlX3BhcmFtKFBST0dSRVNTX0NSRUFURUlEWF9QQVJUSVRJT05TX1RPVEFM LAoJCQkJCQkJCQkJCSB0b3RhbF9wYXJ0cyk7CgkJCX0KCgkJCS8qIE1ha2UgYSBsb2NhbCBj b3B5IG9mIHBhcnRkZXNjLT5vaWRzW10sIGp1c3QgZm9yIHNhZmV0eSAqLwoJCQltZW1jcHko cGFydF9vaWRzLCBwYXJ0ZGVzYy0+b2lkcywgc2l6ZW9mKE9pZCkgKiBucGFydHMpOwoKCQkJ LyoKCQkJICogV2UnbGwgbmVlZCBhbiBJbmRleEluZm8gZGVzY3JpYmluZyB0aGUgcGFyZW50 IGluZGV4LiAgVGhlIG9uZQoJCQkgKiBidWlsdCBhYm92ZSBpcyBhbG1vc3QgZ29vZCBlbm91 Z2gsIGJ1dCBub3QgcXVpdGUsIGJlY2F1c2UgKGZvcgoJCQkgKiBleGFtcGxlKSBpdHMgcHJl ZGljYXRlIGV4cHJlc3Npb24gaWYgYW55IGhhc24ndCBiZWVuIHRocm91Z2gKCQkJICogZXhw cmVzc2lvbiBwcmVwcm9jZXNzaW5nLiAgVGhlIG1vc3QgcmVsaWFibGUgd2F5IHRvIGdldCBh bgoJCQkgKiBJbmRleEluZm8gdGhhdCB3aWxsIG1hdGNoIHRob3NlIGZvciBjaGlsZCBpbmRl eGVzIGlzIHRvIGJ1aWxkCgkJCSAqIGl0IHRoZSBzYW1lIHdheSwgdXNpbmcgQnVpbGRJbmRl eEluZm8oKS4KCQkJICovCgkJCXBhcmVudEluZGV4ID0gaW5kZXhfb3BlbihpbmRleFJlbGF0 aW9uSWQsIGxvY2ttb2RlKTsKCQkJaW5kZXhJbmZvID0gQnVpbGRJbmRleEluZm8ocGFyZW50 SW5kZXgpOwoKCQkJcGFyZW50RGVzYyA9IFJlbGF0aW9uR2V0RGVzY3IocmVsKTsKCgkJCS8q CgkJCSAqIEZvciBlYWNoIHBhcnRpdGlvbiwgc2NhbiBhbGwgZXhpc3RpbmcgaW5kZXhlczsg aWYgb25lIG1hdGNoZXMKCQkJICogb3VyIGluZGV4IGRlZmluaXRpb24gYW5kIGlzIG5vdCBh bHJlYWR5IGF0dGFjaGVkIHRvIHNvbWUgb3RoZXIKCQkJICogcGFyZW50IGluZGV4LCBhdHRh Y2ggaXQgdG8gdGhlIG9uZSB3ZSBqdXN0IGNyZWF0ZWQuCgkJCSAqCgkJCSAqIElmIG5vbmUg bWF0Y2hlcywgYnVpbGQgYSBuZXcgaW5kZXggYnkgY2FsbGluZyBvdXJzZWx2ZXMKCQkJICog cmVjdXJzaXZlbHkgd2l0aCB0aGUgc2FtZSBvcHRpb25zIChleGNlcHQgZm9yIHRoZSBpbmRl eCBuYW1lKS4KCQkJICovCgkJCWZvciAoaW50IGkgPSAwOyBpIDwgbnBhcnRzOyBpKyspCgkJ CXsKCQkJCU9pZAkJCWNoaWxkUmVsaWQgPSBwYXJ0X29pZHNbaV07CgkJCQlSZWxhdGlvbglj aGlsZHJlbDsKCQkJCU9pZAkJCWNoaWxkX3NhdmVfdXNlcmlkOwoJCQkJaW50CQkJY2hpbGRf c2F2ZV9zZWNfY29udGV4dDsKCQkJCWludAkJCWNoaWxkX3NhdmVfbmVzdGxldmVsOwoJCQkJ TGlzdAkgICAqY2hpbGRpZHhzOwoJCQkJTGlzdENlbGwgICAqY2VsbDsKCQkJCUF0dHJNYXAg ICAgKmF0dG1hcDsKCQkJCWJvb2wJCWZvdW5kID0gZmFsc2U7CgoJCQkJY2hpbGRyZWwgPSB0 YWJsZV9vcGVuKGNoaWxkUmVsaWQsIGxvY2ttb2RlKTsKCgkJCQlHZXRVc2VySWRBbmRTZWND b250ZXh0KCZjaGlsZF9zYXZlX3VzZXJpZCwKCQkJCQkJCQkJICAgJmNoaWxkX3NhdmVfc2Vj X2NvbnRleHQpOwoJCQkJU2V0VXNlcklkQW5kU2VjQ29udGV4dChjaGlsZHJlbC0+cmRfcmVs LT5yZWxvd25lciwKCQkJCQkJCQkJICAgY2hpbGRfc2F2ZV9zZWNfY29udGV4dCB8IFNFQ1VS SVRZX1JFU1RSSUNURURfT1BFUkFUSU9OKTsKCQkJCWNoaWxkX3NhdmVfbmVzdGxldmVsID0g TmV3R1VDTmVzdExldmVsKCk7CgkJCQlSZXN0cmljdFNlYXJjaFBhdGgoKTsKCgkJCQkvKgoJ CQkJICogRG9uJ3QgdHJ5IHRvIGNyZWF0ZSBpbmRleGVzIG9uIGZvcmVpZ24gdGFibGVzLCB0 aG91Z2guIFNraXAKCQkJCSAqIHRob3NlIGlmIGEgcmVndWxhciBpbmRleCwgb3IgZmFpbCBp ZiB0cnlpbmcgdG8gY3JlYXRlIGEKCQkJCSAqIGNvbnN0cmFpbnQgaW5kZXguCgkJCQkgKi8K CQkJCWlmIChjaGlsZHJlbC0+cmRfcmVsLT5yZWxraW5kID09IFJFTEtJTkRfRk9SRUlHTl9U QUJMRSkKCQkJCXsKCQkJCQlpZiAoc3RtdC0+dW5pcXVlIHx8IHN0bXQtPnByaW1hcnkpCgkJ CQkJCWVyZXBvcnQoRVJST1IsCgkJCQkJCQkJKGVycmNvZGUoRVJSQ09ERV9XUk9OR19PQkpF Q1RfVFlQRSksCgkJCQkJCQkJIGVycm1zZygiY2Fubm90IGNyZWF0ZSB1bmlxdWUgaW5kZXgg b24gcGFydGl0aW9uZWQgdGFibGUgXCIlc1wiIiwKCQkJCQkJCQkJCVJlbGF0aW9uR2V0UmVs YXRpb25OYW1lKHJlbCkpLAoJCQkJCQkJCSBlcnJkZXRhaWwoIlRhYmxlIFwiJXNcIiBjb250 YWlucyBwYXJ0aXRpb25zIHRoYXQgYXJlIGZvcmVpZ24gdGFibGVzLiIsCgkJCQkJCQkJCQkg ICBSZWxhdGlvbkdldFJlbGF0aW9uTmFtZShyZWwpKSkpOwoKCQkJCQlBdEVPWGFjdF9HVUMo ZmFsc2UsIGNoaWxkX3NhdmVfbmVzdGxldmVsKTsKCQkJCQlTZXRVc2VySWRBbmRTZWNDb250 ZXh0KGNoaWxkX3NhdmVfdXNlcmlkLAoJCQkJCQkJCQkJICAgY2hpbGRfc2F2ZV9zZWNfY29u dGV4dCk7CgkJCQkJdGFibGVfY2xvc2UoY2hpbGRyZWwsIGxvY2ttb2RlKTsKCQkJCQljb250 aW51ZTsKCQkJCX0KCgkJCQljaGlsZGlkeHMgPSBSZWxhdGlvbkdldEluZGV4TGlzdChjaGls ZHJlbCk7CgkJCQlhdHRtYXAgPQoJCQkJCWJ1aWxkX2F0dHJtYXBfYnlfbmFtZShSZWxhdGlv bkdldERlc2NyKGNoaWxkcmVsKSwKCQkJCQkJCQkJCSAgcGFyZW50RGVzYywKCQkJCQkJCQkJ CSAgZmFsc2UpOwoKCQkJCWZvcmVhY2goY2VsbCwgY2hpbGRpZHhzKQoJCQkJewoJCQkJCU9p ZAkJCWNsZGlkeGlkID0gbGZpcnN0X29pZChjZWxsKTsKCQkJCQlSZWxhdGlvbgljbGRpZHg7 CgkJCQkJSW5kZXhJbmZvICAqY2xkSWR4SW5mbzsKCgkJCQkJLyogdGhpcyBpbmRleCBpcyBh bHJlYWR5IHBhcnRpdGlvbiBvZiBhbm90aGVyIG9uZSAqLwoJCQkJCWlmIChoYXNfc3VwZXJj bGFzcyhjbGRpZHhpZCkpCgkJCQkJCWNvbnRpbnVlOwoKCQkJCQljbGRpZHggPSBpbmRleF9v cGVuKGNsZGlkeGlkLCBsb2NrbW9kZSk7CgkJCQkJY2xkSWR4SW5mbyA9IEJ1aWxkSW5kZXhJ bmZvKGNsZGlkeCk7CgkJCQkJaWYgKENvbXBhcmVJbmRleEluZm8oY2xkSWR4SW5mbywgaW5k ZXhJbmZvLAoJCQkJCQkJCQkJIGNsZGlkeC0+cmRfaW5kY29sbGF0aW9uLAoJCQkJCQkJCQkJ IHBhcmVudEluZGV4LT5yZF9pbmRjb2xsYXRpb24sCgkJCQkJCQkJCQkgY2xkaWR4LT5yZF9v cGZhbWlseSwKCQkJCQkJCQkJCSBwYXJlbnRJbmRleC0+cmRfb3BmYW1pbHksCgkJCQkJCQkJ CQkgYXR0bWFwKSkKCQkJCQl7CgkJCQkJCU9pZAkJCWNsZENvbnN0ck9pZCA9IEludmFsaWRP aWQ7CgoJCQkJCQkvKgoJCQkJCQkgKiBGb3VuZCBhIG1hdGNoLgoJCQkJCQkgKgoJCQkJCQkg KiBJZiB0aGlzIGluZGV4IGlzIGJlaW5nIGNyZWF0ZWQgaW4gdGhlIHBhcmVudAoJCQkJCQkg KiBiZWNhdXNlIG9mIGEgY29uc3RyYWludCwgdGhlbiB0aGUgY2hpbGQgbmVlZHMgdG8KCQkJ CQkJICogaGF2ZSBhIGNvbnN0cmFpbnQgYWxzbywgc28gbG9vayBmb3Igb25lLiAgSWYgdGhl cmUKCQkJCQkJICogaXMgbm8gc3VjaCBjb25zdHJhaW50LCB0aGlzIGluZGV4IGlzIG5vIGdv b2QsIHNvCgkJCQkJCSAqIGtlZXAgbG9va2luZy4KCQkJCQkJICovCgkJCQkJCWlmIChjcmVh dGVkQ29uc3RyYWludElkICE9IEludmFsaWRPaWQpCgkJCQkJCXsKCQkJCQkJCWNsZENvbnN0 ck9pZCA9CgkJCQkJCQkJZ2V0X3JlbGF0aW9uX2lkeF9jb25zdHJhaW50X29pZChjaGlsZFJl bGlkLAoJCQkJCQkJCQkJCQkJCQkJY2xkaWR4aWQpOwoJCQkJCQkJaWYgKGNsZENvbnN0ck9p ZCA9PSBJbnZhbGlkT2lkKQoJCQkJCQkJewoJCQkJCQkJCWluZGV4X2Nsb3NlKGNsZGlkeCwg bG9ja21vZGUpOwoJCQkJCQkJCWNvbnRpbnVlOwoJCQkJCQkJfQoJCQkJCQl9CgoJCQkJCQkv KiBBdHRhY2ggaW5kZXggdG8gcGFyZW50IGFuZCB3ZSdyZSBkb25lLiAqLwoJCQkJCQlJbmRl eFNldFBhcmVudEluZGV4KGNsZGlkeCwgaW5kZXhSZWxhdGlvbklkKTsKCQkJCQkJaWYgKGNy ZWF0ZWRDb25zdHJhaW50SWQgIT0gSW52YWxpZE9pZCkKCQkJCQkJCUNvbnN0cmFpbnRTZXRQ YXJlbnRDb25zdHJhaW50KGNsZENvbnN0ck9pZCwKCQkJCQkJCQkJCQkJCQkgIGNyZWF0ZWRD b25zdHJhaW50SWQsCgkJCQkJCQkJCQkJCQkJICBjaGlsZFJlbGlkKTsKCgkJCQkJCWlmICgh Y2xkaWR4LT5yZF9pbmRleC0+aW5kaXN2YWxpZCkKCQkJCQkJCWludmFsaWRhdGVfcGFyZW50 ID0gdHJ1ZTsKCgkJCQkJCWZvdW5kID0gdHJ1ZTsKCgkJCQkJCS8qCgkJCQkJCSAqIFJlcG9y dCB0aGlzIHBhcnRpdGlvbiBhcyBwcm9jZXNzZWQuICBOb3RlIHRoYXQgaWYKCQkJCQkJICog dGhlIHBhcnRpdGlvbiBoYXMgY2hpbGRyZW4gaXRzZWxmLCB3ZSdkIGlkZWFsbHkKCQkJCQkJ ICogY291bnQgdGhlIGNoaWxkcmVuIGFuZCB1cGRhdGUgdGhlIHByb2dyZXNzIHJlcG9ydAoJ CQkJCQkgKiBmb3IgYWxsIG9mIHRoZW07IGJ1dCB0aGF0IHNlZW1zIHVuZHVseSBleHBlbnNp dmUuCgkJCQkJCSAqIEluc3RlYWQsIHRoZSBwcm9ncmVzcyByZXBvcnQgd2lsbCBhY3QgbGlr ZSBhbGwgc3VjaAoJCQkJCQkgKiBpbmRpcmVjdCBjaGlsZHJlbiB3ZXJlIHByb2Nlc3NlZCBp biB6ZXJvIHRpbWUgYXQKCQkJCQkJICogdGhlIGVuZCBvZiB0aGUgY29tbWFuZC4KCQkJCQkJ ICovCgkJCQkJCXBnc3RhdF9wcm9ncmVzc19pbmNyX3BhcmFtKFBST0dSRVNTX0NSRUFURUlE WF9QQVJUSVRJT05TX0RPTkUsIDEpOwoKCQkJCQkJLyoga2VlcCBsb2NrIHRpbGwgY29tbWl0 ICovCgkJCQkJCWluZGV4X2Nsb3NlKGNsZGlkeCwgTm9Mb2NrKTsKCQkJCQkJYnJlYWs7CgkJ CQkJfQoKCQkJCQlpbmRleF9jbG9zZShjbGRpZHgsIGxvY2ttb2RlKTsKCQkJCX0KCgkJCQls aXN0X2ZyZWUoY2hpbGRpZHhzKTsKCQkJCUF0RU9YYWN0X0dVQyhmYWxzZSwgY2hpbGRfc2F2 ZV9uZXN0bGV2ZWwpOwoJCQkJU2V0VXNlcklkQW5kU2VjQ29udGV4dChjaGlsZF9zYXZlX3Vz ZXJpZCwKCQkJCQkJCQkJICAgY2hpbGRfc2F2ZV9zZWNfY29udGV4dCk7CgkJCQl0YWJsZV9j bG9zZShjaGlsZHJlbCwgTm9Mb2NrKTsKCgkJCQkvKgoJCQkJICogSWYgbm8gbWF0Y2hpbmcg aW5kZXggd2FzIGZvdW5kLCBjcmVhdGUgb3VyIG93bi4KCQkJCSAqLwoJCQkJaWYgKCFmb3Vu ZCkKCQkJCXsKCQkJCQlJbmRleFN0bXQgICpjaGlsZFN0bXQ7CgkJCQkJT2JqZWN0QWRkcmVz cyBjaGlsZEFkZHI7CgoJCQkJCS8qCgkJCQkJICogQnVpbGQgYW4gSW5kZXhTdG10IGRlc2Ny aWJpbmcgdGhlIGRlc2lyZWQgY2hpbGQgaW5kZXgKCQkJCQkgKiBpbiB0aGUgc2FtZSB3YXkg dGhhdCB3ZSBkbyBkdXJpbmcgQVRUQUNIIFBBUlRJVElPTi4KCQkJCQkgKiBOb3RhYmx5LCB3 ZSByZWx5IG9uIGdlbmVyYXRlQ2xvbmVkSW5kZXhTdG10IHRvIHByb2R1Y2UKCQkJCQkgKiBh IHNlYXJjaC1wYXRoLWluZGVwZW5kZW50IHJlcHJlc2VudGF0aW9uLCB3aGljaCB0aGUKCQkJ CQkgKiBvcmlnaW5hbCBJbmRleFN0bXQgbWlnaHQgbm90IGJlLgoJCQkJCSAqLwoJCQkJCWNo aWxkU3RtdCA9IGdlbmVyYXRlQ2xvbmVkSW5kZXhTdG10KE5VTEwsCgkJCQkJCQkJCQkJCQkJ cGFyZW50SW5kZXgsCgkJCQkJCQkJCQkJCQkJYXR0bWFwLAoJCQkJCQkJCQkJCQkJCU5VTEwp OwoKCQkJCQkvKgoJCQkJCSAqIFJlY3Vyc2UgYXMgdGhlIHN0YXJ0aW5nIHVzZXIgSUQuICBD YWxsZWUgd2lsbCB1c2UgdGhhdAoJCQkJCSAqIGZvciBwZXJtaXNzaW9uIGNoZWNrcywgdGhl biBzd2l0Y2ggYWdhaW4uCgkJCQkJICovCgkJCQkJQXNzZXJ0KEdldFVzZXJJZCgpID09IGNo aWxkX3NhdmVfdXNlcmlkKTsKCQkJCQlTZXRVc2VySWRBbmRTZWNDb250ZXh0KHJvb3Rfc2F2 ZV91c2VyaWQsCgkJCQkJCQkJCQkgICByb290X3NhdmVfc2VjX2NvbnRleHQpOwoJCQkJCWNo aWxkQWRkciA9CgkJCQkJCURlZmluZUluZGV4KE5VTEwsCS8qIG9yaWdpbmFsIHBzdGF0ZSBu b3QgYXBwbGljYWJsZSAqLwoJCQkJCQkJCQljaGlsZFJlbGlkLCBjaGlsZFN0bXQsCgkJCQkJ CQkJCUludmFsaWRPaWQsIC8qIG5vIHByZWRlZmluZWQgT0lEICovCgkJCQkJCQkJCWluZGV4 UmVsYXRpb25JZCwJLyogdGhpcyBpcyBvdXIgY2hpbGQgKi8KCQkJCQkJCQkJY3JlYXRlZENv bnN0cmFpbnRJZCwKCQkJCQkJCQkJLTEsCgkJCQkJCQkJCWlzX2FsdGVyX3RhYmxlLCBjaGVj a19yaWdodHMsCgkJCQkJCQkJCWNoZWNrX25vdF9pbl91c2UsCgkJCQkJCQkJCXNraXBfYnVp bGQsIHF1aWV0KTsKCQkJCQlTZXRVc2VySWRBbmRTZWNDb250ZXh0KGNoaWxkX3NhdmVfdXNl cmlkLAoJCQkJCQkJCQkJICAgY2hpbGRfc2F2ZV9zZWNfY29udGV4dCk7CgoJCQkJCS8qCgkJ CQkJICogQ2hlY2sgaWYgdGhlIGluZGV4IGp1c3QgY3JlYXRlZCBpcyB2YWxpZCBvciBub3Qs IGFzIGl0CgkJCQkJICogY291bGQgYmUgcG9zc2libGUgdGhhdCBpdCBoYXMgYmVlbiBzd2l0 Y2hlZCBhcyBpbnZhbGlkCgkJCQkJICogd2hlbiByZWN1cnNpbmcgYWNyb3NzIG11bHRpcGxl IHBhcnRpdGlvbiBsZXZlbHMuCgkJCQkJICovCgkJCQkJaWYgKCFnZXRfaW5kZXhfaXN2YWxp ZChjaGlsZEFkZHIub2JqZWN0SWQpKQoJCQkJCQlpbnZhbGlkYXRlX3BhcmVudCA9IHRydWU7 CgkJCQl9CgoJCQkJZnJlZV9hdHRybWFwKGF0dG1hcCk7CgkJCX0KCgkJCWluZGV4X2Nsb3Nl KHBhcmVudEluZGV4LCBsb2NrbW9kZSk7CgoJCQkvKgoJCQkgKiBUaGUgcGdfaW5kZXggcm93 IHdlIGluc2VydGVkIGZvciB0aGlzIGluZGV4IHdhcyBtYXJrZWQKCQkJICogaW5kaXN2YWxp ZD10cnVlLiAgQnV0IGlmIHdlIGF0dGFjaGVkIGFuIGV4aXN0aW5nIGluZGV4IHRoYXQgaXMK CQkJICogaW52YWxpZCwgdGhpcyBpcyBpbmNvcnJlY3QsIHNvIHVwZGF0ZSBvdXIgcm93IHRv IGludmFsaWQgdG9vLgoJCQkgKi8KCQkJaWYgKGludmFsaWRhdGVfcGFyZW50KQoJCQl7CgkJ CQlSZWxhdGlvbglwZ19pbmRleCA9IHRhYmxlX29wZW4oSW5kZXhSZWxhdGlvbklkLCBSb3dF eGNsdXNpdmVMb2NrKTsKCQkJCUhlYXBUdXBsZQl0dXAsCgkJCQkJCQluZXd0dXA7CgoJCQkJ dHVwID0gU2VhcmNoU3lzQ2FjaGUxKElOREVYUkVMSUQsCgkJCQkJCQkJCSAgT2JqZWN0SWRH ZXREYXR1bShpbmRleFJlbGF0aW9uSWQpKTsKCQkJCWlmICghSGVhcFR1cGxlSXNWYWxpZCh0 dXApKQoJCQkJCWVsb2coRVJST1IsICJjYWNoZSBsb29rdXAgZmFpbGVkIGZvciBpbmRleCAl dSIsCgkJCQkJCSBpbmRleFJlbGF0aW9uSWQpOwoJCQkJbmV3dHVwID0gaGVhcF9jb3B5dHVw bGUodHVwKTsKCQkJCSgoRm9ybV9wZ19pbmRleCkgR0VUU1RSVUNUKG5ld3R1cCkpLT5pbmRp c3ZhbGlkID0gZmFsc2U7CgkJCQlDYXRhbG9nVHVwbGVVcGRhdGUocGdfaW5kZXgsICZ0dXAt PnRfc2VsZiwgbmV3dHVwKTsKCQkJCVJlbGVhc2VTeXNDYWNoZSh0dXApOwoJCQkJdGFibGVf Y2xvc2UocGdfaW5kZXgsIFJvd0V4Y2x1c2l2ZUxvY2spOwoJCQkJaGVhcF9mcmVldHVwbGUo bmV3dHVwKTsKCgkJCQkvKgoJCQkJICogQ0NJIGhlcmUgdG8gbWFrZSB0aGlzIHVwZGF0ZSB2 aXNpYmxlLCBpbiBjYXNlIHRoaXMgcmVjdXJzZXMKCQkJCSAqIGFjcm9zcyBtdWx0aXBsZSBw YXJ0aXRpb24gbGV2ZWxzLgoJCQkJICovCgkJCQlDb21tYW5kQ291bnRlckluY3JlbWVudCgp OwoJCQl9CgkJfQoKCQkvKgoJCSAqIEluZGV4ZXMgb24gcGFydGl0aW9uZWQgdGFibGVzIGFy ZSBub3QgdGhlbXNlbHZlcyBidWlsdCwgc28gd2UncmUKCQkgKiBkb25lIGhlcmUuCgkJICov CgkJQXRFT1hhY3RfR1VDKGZhbHNlLCByb290X3NhdmVfbmVzdGxldmVsKTsKCQlTZXRVc2Vy SWRBbmRTZWNDb250ZXh0KHJvb3Rfc2F2ZV91c2VyaWQsIHJvb3Rfc2F2ZV9zZWNfY29udGV4 dCk7CgkJdGFibGVfY2xvc2UocmVsLCBOb0xvY2spOwoJCWlmICghT2lkSXNWYWxpZChwYXJl bnRJbmRleElkKSkKCQkJcGdzdGF0X3Byb2dyZXNzX2VuZF9jb21tYW5kKCk7CgkJZWxzZQoJ CXsKCQkJLyogVXBkYXRlIHByb2dyZXNzIGZvciBhbiBpbnRlcm1lZGlhdGUgcGFydGl0aW9u ZWQgaW5kZXggaXRzZWxmICovCgkJCXBnc3RhdF9wcm9ncmVzc19pbmNyX3BhcmFtKFBST0dS RVNTX0NSRUFURUlEWF9QQVJUSVRJT05TX0RPTkUsIDEpOwoJCX0KCgkJcmV0dXJuIGFkZHJl c3M7Cgl9CgoJQXRFT1hhY3RfR1VDKGZhbHNlLCByb290X3NhdmVfbmVzdGxldmVsKTsKCVNl dFVzZXJJZEFuZFNlY0NvbnRleHQocm9vdF9zYXZlX3VzZXJpZCwgcm9vdF9zYXZlX3NlY19j b250ZXh0KTsKCglpZiAoIWNvbmN1cnJlbnQpCgl7CgkJLyogQ2xvc2UgdGhlIGhlYXAgYW5k IHdlJ3JlIGRvbmUsIGluIHRoZSBub24tY29uY3VycmVudCBjYXNlICovCgkJdGFibGVfY2xv c2UocmVsLCBOb0xvY2spOwoKCQkvKgoJCSAqIElmIHRoaXMgaXMgdGhlIHRvcC1sZXZlbCBp bmRleCwgdGhlIGNvbW1hbmQgaXMgZG9uZSBvdmVyYWxsOwoJCSAqIG90aGVyd2lzZSwgaW5j cmVtZW50IHByb2dyZXNzIHRvIHJlcG9ydCBvbmUgY2hpbGQgaW5kZXggaXMgZG9uZS4KCQkg Ki8KCQlpZiAoIU9pZElzVmFsaWQocGFyZW50SW5kZXhJZCkpCgkJCXBnc3RhdF9wcm9ncmVz c19lbmRfY29tbWFuZCgpOwoJCWVsc2UKCQkJcGdzdGF0X3Byb2dyZXNzX2luY3JfcGFyYW0o UFJPR1JFU1NfQ1JFQVRFSURYX1BBUlRJVElPTlNfRE9ORSwgMSk7CgoJCXJldHVybiBhZGRy ZXNzOwoJfQoKCS8qIHNhdmUgbG9ja3JlbGlkIGFuZCBsb2NrdGFnIGZvciBiZWxvdywgdGhl biBjbG9zZSByZWwgKi8KCWhlYXByZWxpZCA9IHJlbC0+cmRfbG9ja0luZm8ubG9ja1JlbElk OwoJU0VUX0xPQ0tUQUdfUkVMQVRJT04oaGVhcGxvY2t0YWcsIGhlYXByZWxpZC5kYklkLCBo ZWFwcmVsaWQucmVsSWQpOwoJdGFibGVfY2xvc2UocmVsLCBOb0xvY2spOwoKCS8qCgkgKiBG b3IgYSBjb25jdXJyZW50IGJ1aWxkLCBpdCdzIGltcG9ydGFudCB0byBtYWtlIHRoZSBjYXRh bG9nIGVudHJpZXMKCSAqIHZpc2libGUgdG8gb3RoZXIgdHJhbnNhY3Rpb25zIGJlZm9yZSB3 ZSBzdGFydCB0byBidWlsZCB0aGUgaW5kZXguIFRoYXQKCSAqIHdpbGwgcHJldmVudCB0aGVt IGZyb20gbWFraW5nIGluY29tcGF0aWJsZSBIT1QgdXBkYXRlcy4gIFRoZSBuZXcgaW5kZXgK CSAqIHdpbGwgYmUgbWFya2VkIG5vdCBpbmRpc3JlYWR5IGFuZCBub3QgaW5kaXN2YWxpZCwg c28gdGhhdCBubyBvbmUgZWxzZQoJICogdHJpZXMgdG8gZWl0aGVyIGluc2VydCBpbnRvIGl0 IG9yIHVzZSBpdCBmb3IgcXVlcmllcy4KCSAqCgkgKiBXZSBtdXN0IGNvbW1pdCBvdXIgY3Vy cmVudCB0cmFuc2FjdGlvbiBzbyB0aGF0IHRoZSBpbmRleCBiZWNvbWVzCgkgKiB2aXNpYmxl OyB0aGVuIHN0YXJ0IGFub3RoZXIuICBOb3RlIHRoYXQgYWxsIHRoZSBkYXRhIHN0cnVjdHVy ZXMgd2UganVzdAoJICogYnVpbHQgYXJlIGxvc3QgaW4gdGhlIGNvbW1pdC4gIFRoZSBvbmx5 IGRhdGEgd2Uga2VlcCBwYXN0IGhlcmUgYXJlIHRoZQoJICogcmVsYXRpb24gSURzLgoJICoK CSAqIEJlZm9yZSBjb21taXR0aW5nLCBnZXQgYSBzZXNzaW9uLWxldmVsIGxvY2sgb24gdGhl IHRhYmxlLCB0byBlbnN1cmUKCSAqIHRoYXQgbmVpdGhlciBpdCBub3IgdGhlIGluZGV4IGNh biBiZSBkcm9wcGVkIGJlZm9yZSB3ZSBmaW5pc2guIFRoaXMKCSAqIGNhbm5vdCBibG9jaywg ZXZlbiBpZiBzb21lb25lIGVsc2UgaXMgd2FpdGluZyBmb3IgYWNjZXNzLCBiZWNhdXNlIHdl CgkgKiBhbHJlYWR5IGhhdmUgdGhlIHNhbWUgbG9jayB3aXRoaW4gb3VyIHRyYW5zYWN0aW9u LgoJICoKCSAqIE5vdGU6IHdlIGRvbid0IGN1cnJlbnRseSBib3RoZXIgd2l0aCBhIHNlc3Np b24gbG9jayBvbiB0aGUgaW5kZXgsCgkgKiBiZWNhdXNlIHRoZXJlIGFyZSBubyBvcGVyYXRp b25zIHRoYXQgY291bGQgY2hhbmdlIGl0cyBzdGF0ZSB3aGlsZSB3ZQoJICogaG9sZCBsb2Nr IG9uIHRoZSBwYXJlbnQgdGFibGUuICBUaGlzIG1pZ2h0IG5lZWQgdG8gY2hhbmdlIGxhdGVy LgoJICovCglMb2NrUmVsYXRpb25JZEZvclNlc3Npb24oJmhlYXByZWxpZCwgU2hhcmVVcGRh dGVFeGNsdXNpdmVMb2NrKTsKCglQb3BBY3RpdmVTbmFwc2hvdCgpOwoJQ29tbWl0VHJhbnNh Y3Rpb25Db21tYW5kKCk7CglTdGFydFRyYW5zYWN0aW9uQ29tbWFuZCgpOwoKCS8qIFRlbGwg Y29uY3VycmVudCBpbmRleCBidWlsZHMgdG8gaWdub3JlIHVzLCBpZiBpbmRleCBxdWFsaWZp ZXMgKi8KCWlmIChzYWZlX2luZGV4KQoJCXNldF9pbmRleHNhZmVfcHJvY2ZsYWdzKCk7CgoJ LyoKCSAqIFRoZSBpbmRleCBpcyBub3cgdmlzaWJsZSwgc28gd2UgY2FuIHJlcG9ydCB0aGUg T0lELiAgV2hpbGUgb24gaXQsCgkgKiBpbmNsdWRlIHRoZSByZXBvcnQgZm9yIHRoZSBiZWdp bm5pbmcgb2YgcGhhc2UgMi4KCSAqLwoJewoJCWNvbnN0IGludAlwcm9ncmVzc19jb2xzW10g PSB7CgkJCVBST0dSRVNTX0NSRUFURUlEWF9JTkRFWF9PSUQsCgkJCVBST0dSRVNTX0NSRUFU RUlEWF9QSEFTRQoJCX07CgkJY29uc3QgaW50NjQgcHJvZ3Jlc3NfdmFsc1tdID0gewoJCQlp bmRleFJlbGF0aW9uSWQsCgkJCVBST0dSRVNTX0NSRUFURUlEWF9QSEFTRV9XQUlUXzEKCQl9 OwoKCQlwZ3N0YXRfcHJvZ3Jlc3NfdXBkYXRlX211bHRpX3BhcmFtKDIsIHByb2dyZXNzX2Nv bHMsIHByb2dyZXNzX3ZhbHMpOwoJfQoKCS8qCgkgKiBQaGFzZSAyIG9mIGNvbmN1cnJlbnQg aW5kZXggYnVpbGQgKHNlZSBjb21tZW50cyBmb3IgdmFsaWRhdGVfaW5kZXgoKQoJICogZm9y IGFuIG92ZXJ2aWV3IG9mIGhvdyB0aGlzIHdvcmtzKQoJICoKCSAqIE5vdyB3ZSBtdXN0IHdh aXQgdW50aWwgbm8gcnVubmluZyB0cmFuc2FjdGlvbiBjb3VsZCBoYXZlIHRoZSB0YWJsZSBv cGVuCgkgKiB3aXRoIHRoZSBvbGQgbGlzdCBvZiBpbmRleGVzLiAgVXNlIFNoYXJlTG9jayB0 byBjb25zaWRlciBydW5uaW5nCgkgKiB0cmFuc2FjdGlvbnMgdGhhdCBob2xkIGxvY2tzIHRo YXQgcGVybWl0IHdyaXRpbmcgdG8gdGhlIHRhYmxlLiAgTm90ZSB3ZQoJICogZG8gbm90IG5l ZWQgdG8gd29ycnkgYWJvdXQgeGFjdHMgdGhhdCBvcGVuIHRoZSB0YWJsZSBmb3Igd3JpdGlu ZyBhZnRlcgoJICogdGhpcyBwb2ludDsgdGhleSB3aWxsIHNlZSB0aGUgbmV3IGluZGV4IHdo ZW4gdGhleSBvcGVuIGl0LgoJICoKCSAqIE5vdGU6IHRoZSByZWFzb24gd2UgdXNlIGFjdHVh bCBsb2NrIGFjcXVpc2l0aW9uIGhlcmUsIHJhdGhlciB0aGFuIGp1c3QKCSAqIGNoZWNraW5n IHRoZSBQcm9jQXJyYXkgYW5kIHNsZWVwaW5nLCBpcyB0aGF0IGRlYWRsb2NrIGlzIHBvc3Np YmxlIGlmCgkgKiBvbmUgb2YgdGhlIHRyYW5zYWN0aW9ucyBpbiBxdWVzdGlvbiBpcyBibG9j a2VkIHRyeWluZyB0byBhY3F1aXJlIGFuCgkgKiBleGNsdXNpdmUgbG9jayBvbiBvdXIgdGFi bGUuICBUaGUgbG9jayBjb2RlIHdpbGwgZGV0ZWN0IGRlYWRsb2NrIGFuZAoJICogZXJyb3Ig b3V0IHByb3Blcmx5LgoJICovCglXYWl0Rm9yTG9ja2VycyhoZWFwbG9ja3RhZywgU2hhcmVM b2NrLCB0cnVlKTsKCgkvKgoJICogQXQgdGhpcyBtb21lbnQgd2UgYXJlIHN1cmUgdGhhdCB0 aGVyZSBhcmUgbm8gdHJhbnNhY3Rpb25zIHdpdGggdGhlCgkgKiB0YWJsZSBvcGVuIGZvciB3 cml0ZSB0aGF0IGRvbid0IGhhdmUgdGhpcyBuZXcgaW5kZXggaW4gdGhlaXIgbGlzdCBvZgoJ ICogaW5kZXhlcy4gIFdlIGhhdmUgd2FpdGVkIG91dCBhbGwgdGhlIGV4aXN0aW5nIHRyYW5z YWN0aW9ucyBhbmQgYW55IG5ldwoJICogdHJhbnNhY3Rpb24gd2lsbCBoYXZlIHRoZSBuZXcg aW5kZXggaW4gaXRzIGxpc3QsIGJ1dCB0aGUgaW5kZXggaXMgc3RpbGwKCSAqIG1hcmtlZCBh cyAibm90LXJlYWR5LWZvci1pbnNlcnRzIi4gIFRoZSBpbmRleCBpcyBjb25zdWx0ZWQgd2hp bGUKCSAqIGRlY2lkaW5nIEhPVC1zYWZldHkgdGhvdWdoLiAgVGhpcyBhcnJhbmdlbWVudCBl bnN1cmVzIHRoYXQgbm8gbmV3IEhPVAoJICogY2hhaW5zIGNhbiBiZSBjcmVhdGVkIHdoZXJl IHRoZSBuZXcgdHVwbGUgYW5kIHRoZSBvbGQgdHVwbGUgaW4gdGhlCgkgKiBjaGFpbiBoYXZl IGRpZmZlcmVudCBpbmRleCBrZXlzLgoJICoKCSAqIFdlIG5vdyB0YWtlIGEgbmV3IHNuYXBz aG90LCBhbmQgYnVpbGQgdGhlIGluZGV4IHVzaW5nIGFsbCB0dXBsZXMgdGhhdAoJICogYXJl IHZpc2libGUgaW4gdGhpcyBzbmFwc2hvdC4gIFdlIGNhbiBiZSBzdXJlIHRoYXQgYW55IEhP VCB1cGRhdGVzIHRvCgkgKiB0aGVzZSB0dXBsZXMgd2lsbCBiZSBjb21wYXRpYmxlIHdpdGgg dGhlIGluZGV4LCBzaW5jZSBhbnkgdXBkYXRlcyBtYWRlCgkgKiBieSB0cmFuc2FjdGlvbnMg dGhhdCBkaWRuJ3Qga25vdyBhYm91dCB0aGUgaW5kZXggYXJlIG5vdyBjb21taXR0ZWQgb3IK CSAqIHJvbGxlZCBiYWNrLiAgVGh1cywgZWFjaCB2aXNpYmxlIHR1cGxlIGlzIGVpdGhlciB0 aGUgZW5kIG9mIGl0cwoJICogSE9ULWNoYWluIG9yIHRoZSBleHRlbnNpb24gb2YgdGhlIGNo YWluIGlzIEhPVC1zYWZlIGZvciB0aGlzIGluZGV4LgoJICovCgoJLyogU2V0IEFjdGl2ZVNu YXBzaG90IHNpbmNlIGZ1bmN0aW9ucyBpbiB0aGUgaW5kZXhlcyBtYXkgbmVlZCBpdCAqLwoJ UHVzaEFjdGl2ZVNuYXBzaG90KEdldFRyYW5zYWN0aW9uU25hcHNob3QoKSk7CgoJLyogUGVy Zm9ybSBjb25jdXJyZW50IGJ1aWxkIG9mIGluZGV4ICovCglpbmRleF9jb25jdXJyZW50bHlf YnVpbGQodGFibGVJZCwgaW5kZXhSZWxhdGlvbklkKTsKCgkvKiB3ZSBjYW4gZG8gYXdheSB3 aXRoIG91ciBzbmFwc2hvdCAqLwoJUG9wQWN0aXZlU25hcHNob3QoKTsKCgkvKgoJICogQ29t bWl0IHRoaXMgdHJhbnNhY3Rpb24gdG8gbWFrZSB0aGUgaW5kaXNyZWFkeSB1cGRhdGUgdmlz aWJsZS4KCSAqLwoJQ29tbWl0VHJhbnNhY3Rpb25Db21tYW5kKCk7CglTdGFydFRyYW5zYWN0 aW9uQ29tbWFuZCgpOwoKCS8qIFRlbGwgY29uY3VycmVudCBpbmRleCBidWlsZHMgdG8gaWdu b3JlIHVzLCBpZiBpbmRleCBxdWFsaWZpZXMgKi8KCWlmIChzYWZlX2luZGV4KQoJCXNldF9p bmRleHNhZmVfcHJvY2ZsYWdzKCk7CgoJLyoKCSAqIFBoYXNlIDMgb2YgY29uY3VycmVudCBp bmRleCBidWlsZAoJICoKCSAqIFdlIG9uY2UgYWdhaW4gd2FpdCB1bnRpbCBubyB0cmFuc2Fj dGlvbiBjYW4gaGF2ZSB0aGUgdGFibGUgb3BlbiB3aXRoCgkgKiB0aGUgaW5kZXggbWFya2Vk IGFzIHJlYWQtb25seSBmb3IgdXBkYXRlcy4KCSAqLwoJcGdzdGF0X3Byb2dyZXNzX3VwZGF0 ZV9wYXJhbShQUk9HUkVTU19DUkVBVEVJRFhfUEhBU0UsCgkJCQkJCQkJIFBST0dSRVNTX0NS RUFURUlEWF9QSEFTRV9XQUlUXzIpOwoJV2FpdEZvckxvY2tlcnMoaGVhcGxvY2t0YWcsIFNo YXJlTG9jaywgdHJ1ZSk7CgoJLyoKCSAqIE5vdyB0YWtlIHRoZSAicmVmZXJlbmNlIHNuYXBz aG90IiB0aGF0IHdpbGwgYmUgdXNlZCBieSB2YWxpZGF0ZV9pbmRleCgpCgkgKiB0byBmaWx0 ZXIgY2FuZGlkYXRlIHR1cGxlcy4gIEJld2FyZSEgIFRoZXJlIG1pZ2h0IHN0aWxsIGJlIHNu YXBzaG90cyBpbgoJICogdXNlIHRoYXQgdHJlYXQgc29tZSB0cmFuc2FjdGlvbiBhcyBpbi1w cm9ncmVzcyB0aGF0IG91ciByZWZlcmVuY2UKCSAqIHNuYXBzaG90IHRyZWF0cyBhcyBjb21t aXR0ZWQuICBJZiBzdWNoIGEgcmVjZW50bHktY29tbWl0dGVkIHRyYW5zYWN0aW9uCgkgKiBk ZWxldGVkIHR1cGxlcyBpbiB0aGUgdGFibGUsIHdlIHdpbGwgbm90IGluY2x1ZGUgdGhlbSBp biB0aGUgaW5kZXg7IHlldAoJICogdGhvc2UgdHJhbnNhY3Rpb25zIHdoaWNoIHNlZSB0aGUg ZGVsZXRpbmcgb25lIGFzIHN0aWxsLWluLXByb2dyZXNzIHdpbGwKCSAqIGV4cGVjdCBzdWNo IHR1cGxlcyB0byBiZSB0aGVyZSBvbmNlIHdlIG1hcmsgdGhlIGluZGV4IGFzIHZhbGlkLgoJ ICoKCSAqIFdlIHNvbHZlIHRoaXMgYnkgd2FpdGluZyBmb3IgYWxsIGVuZGFuZ2VyZWQgdHJh bnNhY3Rpb25zIHRvIGV4aXQgYmVmb3JlCgkgKiB3ZSBtYXJrIHRoZSBpbmRleCBhcyB2YWxp ZC4KCSAqCgkgKiBXZSBhbHNvIHNldCBBY3RpdmVTbmFwc2hvdCB0byB0aGlzIHNuYXAsIHNp bmNlIGZ1bmN0aW9ucyBpbiBpbmRleGVzIG1heQoJICogbmVlZCBhIHNuYXBzaG90LgoJICov CglzbmFwc2hvdCA9IFJlZ2lzdGVyU25hcHNob3QoR2V0VHJhbnNhY3Rpb25TbmFwc2hvdCgp KTsKCVB1c2hBY3RpdmVTbmFwc2hvdChzbmFwc2hvdCk7CgoJLyoKCSAqIFNjYW4gdGhlIGlu ZGV4IGFuZCB0aGUgaGVhcCwgaW5zZXJ0IGFueSBtaXNzaW5nIGluZGV4IGVudHJpZXMuCgkg Ki8KCXZhbGlkYXRlX2luZGV4KHRhYmxlSWQsIGluZGV4UmVsYXRpb25JZCwgc25hcHNob3Qp OwoKCS8qCgkgKiBEcm9wIHRoZSByZWZlcmVuY2Ugc25hcHNob3QuICBXZSBtdXN0IGRvIHRo aXMgYmVmb3JlIHdhaXRpbmcgb3V0IG90aGVyCgkgKiBzbmFwc2hvdCBob2xkZXJzLCBlbHNl IHdlIHdpbGwgZGVhZGxvY2sgYWdhaW5zdCBvdGhlciBwcm9jZXNzZXMgYWxzbwoJICogZG9p bmcgQ1JFQVRFIElOREVYIENPTkNVUlJFTlRMWSwgd2hpY2ggd291bGQgc2VlIG91ciBzbmFw c2hvdCBhcyBvbmUKCSAqIHRoZXkgbXVzdCB3YWl0IGZvci4gIEJ1dCBmaXJzdCwgc2F2ZSB0 aGUgc25hcHNob3QncyB4bWluIHRvIHVzZSBhcwoJICogbGltaXRYbWluIGZvciBHZXRDdXJy ZW50VmlydHVhbFhJRHMoKS4KCSAqLwoJbGltaXRYbWluID0gc25hcHNob3QtPnhtaW47CgoJ UG9wQWN0aXZlU25hcHNob3QoKTsKCVVucmVnaXN0ZXJTbmFwc2hvdChzbmFwc2hvdCk7CgoJ LyoKCSAqIFRoZSBzbmFwc2hvdCBzdWJzeXN0ZW0gY291bGQgc3RpbGwgY29udGFpbiByZWdp c3RlcmVkIHNuYXBzaG90cyB0aGF0CgkgKiBhcmUgaG9sZGluZyBiYWNrIG91ciBwcm9jZXNz J3MgYWR2ZXJ0aXNlZCB4bWluOyBpbiBwYXJ0aWN1bGFyLCBpZgoJICogZGVmYXVsdF90cmFu c2FjdGlvbl9pc29sYXRpb24gPSBzZXJpYWxpemFibGUsIHRoZXJlIGlzIGEgdHJhbnNhY3Rp b24KCSAqIHNuYXBzaG90IHRoYXQgaXMgc3RpbGwgYWN0aXZlLiAgVGhlIENhdGFsb2dTbmFw c2hvdCBpcyBsaWtld2lzZSBhCgkgKiBoYXphcmQuICBUbyBlbnN1cmUgbm8gZGVhZGxvY2tz LCB3ZSBtdXN0IGNvbW1pdCBhbmQgc3RhcnQgeWV0IGFub3RoZXIKCSAqIHRyYW5zYWN0aW9u LCBhbmQgZG8gb3VyIHdhaXQgYmVmb3JlIGFueSBzbmFwc2hvdCBoYXMgYmVlbiB0YWtlbiBp biBpdC4KCSAqLwoJQ29tbWl0VHJhbnNhY3Rpb25Db21tYW5kKCk7CglTdGFydFRyYW5zYWN0 aW9uQ29tbWFuZCgpOwoKCS8qIFRlbGwgY29uY3VycmVudCBpbmRleCBidWlsZHMgdG8gaWdu b3JlIHVzLCBpZiBpbmRleCBxdWFsaWZpZXMgKi8KCWlmIChzYWZlX2luZGV4KQoJCXNldF9p bmRleHNhZmVfcHJvY2ZsYWdzKCk7CgoJLyogV2Ugc2hvdWxkIG5vdyBkZWZpbml0ZWx5IG5v dCBiZSBhZHZlcnRpc2luZyBhbnkgeG1pbi4gKi8KCUFzc2VydChNeVByb2MtPnhtaW4gPT0g SW52YWxpZFRyYW5zYWN0aW9uSWQpOwoKCS8qCgkgKiBUaGUgaW5kZXggaXMgbm93IHZhbGlk IGluIHRoZSBzZW5zZSB0aGF0IGl0IGNvbnRhaW5zIGFsbCBjdXJyZW50bHkKCSAqIGludGVy ZXN0aW5nIHR1cGxlcy4gIEJ1dCBzaW5jZSBpdCBtaWdodCBub3QgY29udGFpbiB0dXBsZXMg ZGVsZXRlZCBqdXN0CgkgKiBiZWZvcmUgdGhlIHJlZmVyZW5jZSBzbmFwIHdhcyB0YWtlbiwg d2UgaGF2ZSB0byB3YWl0IG91dCBhbnkKCSAqIHRyYW5zYWN0aW9ucyB0aGF0IG1pZ2h0IGhh dmUgb2xkZXIgc25hcHNob3RzLgoJICovCglJTkpFQ1RJT05fUE9JTlQoImRlZmluZS1pbmRl eC1iZWZvcmUtc2V0LXZhbGlkIiwgTlVMTCk7CglwZ3N0YXRfcHJvZ3Jlc3NfdXBkYXRlX3Bh cmFtKFBST0dSRVNTX0NSRUFURUlEWF9QSEFTRSwKCQkJCQkJCQkgUFJPR1JFU1NfQ1JFQVRF SURYX1BIQVNFX1dBSVRfMyk7CglXYWl0Rm9yT2xkZXJTbmFwc2hvdHMobGltaXRYbWluLCB0 cnVlKTsKCgkvKgoJICogVXBkYXRpbmcgcGdfaW5kZXggbWlnaHQgaW52b2x2ZSBUT0FTVCB0 YWJsZSBhY2Nlc3MsIHNvIGVuc3VyZSB3ZSBoYXZlIGEKCSAqIHZhbGlkIHNuYXBzaG90LgoJ ICovCglQdXNoQWN0aXZlU25hcHNob3QoR2V0VHJhbnNhY3Rpb25TbmFwc2hvdCgpKTsKCgkv KgoJICogSW5kZXggY2FuIG5vdyBiZSBtYXJrZWQgdmFsaWQgLS0gdXBkYXRlIGl0cyBwZ19p bmRleCBlbnRyeQoJICovCglpbmRleF9zZXRfc3RhdGVfZmxhZ3MoaW5kZXhSZWxhdGlvbklk LCBJTkRFWF9DUkVBVEVfU0VUX1ZBTElEKTsKCglQb3BBY3RpdmVTbmFwc2hvdCgpOwoKCS8q CgkgKiBUaGUgcGdfaW5kZXggdXBkYXRlIHdpbGwgY2F1c2UgYmFja2VuZHMgKGluY2x1ZGlu ZyB0aGlzIG9uZSkgdG8gdXBkYXRlCgkgKiByZWxjYWNoZSBlbnRyaWVzIGZvciB0aGUgaW5k ZXggaXRzZWxmLCBidXQgd2Ugc2hvdWxkIGFsc28gc2VuZCBhCgkgKiByZWxjYWNoZSBpbnZh bCBvbiB0aGUgcGFyZW50IHRhYmxlIHRvIGZvcmNlIHJlcGxhbm5pbmcgb2YgY2FjaGVkIHBs YW5zLgoJICogT3RoZXJ3aXNlIGV4aXN0aW5nIHNlc3Npb25zIG1pZ2h0IGZhaWwgdG8gdXNl IHRoZSBuZXcgaW5kZXggd2hlcmUgaXQKCSAqIHdvdWxkIGJlIHVzZWZ1bC4gIChOb3RlIHRo YXQgb3VyIGVhcmxpZXIgY29tbWl0cyBkaWQgbm90IGNyZWF0ZSByZWFzb25zCgkgKiB0byBy ZXBsYW47IHNvIHJlbGNhY2hlIGZsdXNoIG9uIHRoZSBpbmRleCBpdHNlbGYgd2FzIHN1ZmZp Y2llbnQuKQoJICovCglDYWNoZUludmFsaWRhdGVSZWxjYWNoZUJ5UmVsaWQoaGVhcHJlbGlk LnJlbElkKTsKCgkvKgoJICogTGFzdCB0aGluZyB0byBkbyBpcyByZWxlYXNlIHRoZSBzZXNz aW9uLWxldmVsIGxvY2sgb24gdGhlIHBhcmVudCB0YWJsZS4KCSAqLwoJVW5sb2NrUmVsYXRp b25JZEZvclNlc3Npb24oJmhlYXByZWxpZCwgU2hhcmVVcGRhdGVFeGNsdXNpdmVMb2NrKTsK CglwZ3N0YXRfcHJvZ3Jlc3NfZW5kX2NvbW1hbmQoKTsKCglyZXR1cm4gYWRkcmVzczsKfQoK Ci8qCiAqIENoZWNrUHJlZGljYXRlCiAqCQlDaGVja3MgdGhhdCB0aGUgZ2l2ZW4gcGFydGlh bC1pbmRleCBwcmVkaWNhdGUgaXMgdmFsaWQuCiAqCiAqIFRoaXMgdXNlZCB0byBhbHNvIGNv bnN0cmFpbiB0aGUgZm9ybSBvZiB0aGUgcHJlZGljYXRlIHRvIGZvcm1zIHRoYXQKICogaW5k eHBhdGguYyBjb3VsZCBkbyBzb21ldGhpbmcgd2l0aC4gIEhvd2V2ZXIsIHRoYXQgc2VlbXMg b3Zlcmx5CiAqIHJlc3RyaWN0aXZlLiAgT25lIHVzZWZ1bCBhcHBsaWNhdGlvbiBvZiBwYXJ0 aWFsIGluZGV4ZXMgaXMgdG8gYXBwbHkKICogYSBVTklRVUUgY29uc3RyYWludCBhY3Jvc3Mg YSBzdWJzZXQgb2YgYSB0YWJsZSwgYW5kIGluIHRoYXQgc2NlbmFyaW8KICogYW55IGV2YWx1 YWJsZSBwcmVkaWNhdGUgd2lsbCB3b3JrLiAgU28gYWNjZXB0IGFueSBwcmVkaWNhdGUgaGVy ZQogKiAoZXhjZXB0IG9uZXMgcmVxdWlyaW5nIGEgcGxhbiksIGFuZCBsZXQgaW5keHBhdGgu YyBmZW5kIGZvciBpdHNlbGYuCiAqLwpzdGF0aWMgdm9pZApDaGVja1ByZWRpY2F0ZShFeHBy ICpwcmVkaWNhdGUpCnsKCS8qCgkgKiB0cmFuc2Zvcm1FeHByKCkgc2hvdWxkIGhhdmUgYWxy ZWFkeSByZWplY3RlZCBzdWJxdWVyaWVzLCBhZ2dyZWdhdGVzLAoJICogYW5kIHdpbmRvdyBm dW5jdGlvbnMsIGJhc2VkIG9uIHRoZSBFWFBSX0tJTkRfIGZvciBhIHByZWRpY2F0ZS4KCSAq LwoKCS8qCgkgKiBBIHByZWRpY2F0ZSB1c2luZyBtdXRhYmxlIGZ1bmN0aW9ucyBpcyBwcm9i YWJseSB3cm9uZywgZm9yIHRoZSBzYW1lCgkgKiByZWFzb25zIHRoYXQgd2UgZG9uJ3QgYWxs b3cgYW4gaW5kZXggZXhwcmVzc2lvbiB0byB1c2Ugb25lLgoJICovCglpZiAoY29udGFpbl9t dXRhYmxlX2Z1bmN0aW9uc19hZnRlcl9wbGFubmluZyhwcmVkaWNhdGUpKQoJCWVyZXBvcnQo RVJST1IsCgkJCQkoZXJyY29kZShFUlJDT0RFX0lOVkFMSURfT0JKRUNUX0RFRklOSVRJT04p LAoJCQkJIGVycm1zZygiZnVuY3Rpb25zIGluIGluZGV4IHByZWRpY2F0ZSBtdXN0IGJlIG1h cmtlZCBJTU1VVEFCTEUiKSkpOwp9CgovKgogKiBDb21wdXRlIHBlci1pbmRleC1jb2x1bW4g aW5mb3JtYXRpb24sIGluY2x1ZGluZyBpbmRleGVkIGNvbHVtbiBudW1iZXJzCiAqIG9yIGlu ZGV4IGV4cHJlc3Npb25zLCBvcGNsYXNzZXMgYW5kIHRoZWlyIG9wdGlvbnMuIE5vdGUsIGFs bCBvdXRwdXQgdmVjdG9ycwogKiBzaG91bGQgYmUgYWxsb2NhdGVkIGZvciBhbGwgY29sdW1u cywgaW5jbHVkaW5nICJpbmNsdWRpbmciIG9uZXMuCiAqCiAqIElmIHRoZSBjYWxsZXIgc3dp dGNoZWQgdG8gdGhlIHRhYmxlIG93bmVyLCBkZGxfdXNlcmlkIGlzIHRoZSByb2xlIGZvciBB Q0wKICogY2hlY2tzIHJlYWNoZWQgd2l0aG91dCB0cmF2ZXJzaW5nIG9wYXF1ZSBleHByZXNz aW9ucy4gIE90aGVyd2lzZSwgaXQncwogKiBJbnZhbGlkT2lkLCBhbmQgb3RoZXIgZGRsXyog YXJndW1lbnRzIGFyZSB1bmRlZmluZWQuCiAqCiAqIFVwb24gcmV0dXJuaW5nIGZyb20gdGhp cyBmdW5jdGlvbiwgY2FsbGVycyBtdXN0IGFwcGx5CiAqIEV4cGFuZFZpcnR1YWxHZW5lcmF0 ZWRDb2x1bW5zKCkgdG8gaWlfRXhwcmVzc2lvbnNFeHBhbmQKICogd2hlbiBuZWNlc3Nhcnkg Zm9yIGFjdHVhbCBleHBhbnNpb24gaWYgaWlfRXhwcmVzc2lvbnNFeHBhbmQKICogaXMgbm90 IE5JTCBvciBkdW1teS4KICovCnN0YXRpYyB2b2lkCkNvbXB1dGVJbmRleEF0dHJzKFBhcnNl U3RhdGUgKnBzdGF0ZSwKCQkJCSAgSW5kZXhJbmZvICppbmRleEluZm8sCgkJCQkgIE9pZCAq dHlwZU9pZHMsCgkJCQkgIE9pZCAqY29sbGF0aW9uT2lkcywKCQkJCSAgT2lkICpvcGNsYXNz T2lkcywKCQkJCSAgRGF0dW0gKm9wY2xhc3NPcHRpb25zLAoJCQkJICBpbnQxNiAqY29sT3B0 aW9ucywKCQkJCSAgY29uc3QgTGlzdCAqYXR0TGlzdCwJLyogbGlzdCBvZiBJbmRleEVsZW0n cyAqLwoJCQkJICBjb25zdCBMaXN0ICpleGNsdXNpb25PcE5hbWVzLAoJCQkJICBPaWQgcmVs SWQsCgkJCQkgIGNvbnN0IGNoYXIgKmFjY2Vzc01ldGhvZE5hbWUsCgkJCQkgIE9pZCBhY2Nl c3NNZXRob2RJZCwKCQkJCSAgYm9vbCBhbWNhbm9yZGVyLAoJCQkJICBib29sIGlzY29uc3Ry YWludCwKCQkJCSAgYm9vbCBpc3dpdGhvdXRvdmVybGFwcywKCQkJCSAgT2lkIGRkbF91c2Vy aWQsCgkJCQkgIGludCBkZGxfc2VjX2NvbnRleHQsCgkJCQkgIGludCAqZGRsX3NhdmVfbmVz dGxldmVsKQp7CglMaXN0Q2VsbCAgICpuZXh0RXhjbE9wOwoJTGlzdENlbGwgICAqbGM7Cglp bnQJCQlhdHRuOwoJaW50CQkJbmtleWNvbHMgPSBpbmRleEluZm8tPmlpX051bUluZGV4S2V5 QXR0cnM7CglPaWQJCQlzYXZlX3VzZXJpZDsKCWludAkJCXNhdmVfc2VjX2NvbnRleHQ7CgoJ LyogQWxsb2NhdGUgc3BhY2UgZm9yIGV4Y2x1c2lvbiBvcGVyYXRvciBpbmZvLCBpZiBuZWVk ZWQgKi8KCWlmIChleGNsdXNpb25PcE5hbWVzKQoJewoJCUFzc2VydChsaXN0X2xlbmd0aChl eGNsdXNpb25PcE5hbWVzKSA9PSBua2V5Y29scyk7CgkJaW5kZXhJbmZvLT5paV9FeGNsdXNp b25PcHMgPSBwYWxsb2NfYXJyYXkoT2lkLCBua2V5Y29scyk7CgkJaW5kZXhJbmZvLT5paV9F eGNsdXNpb25Qcm9jcyA9IHBhbGxvY19hcnJheShPaWQsIG5rZXljb2xzKTsKCQlpbmRleElu Zm8tPmlpX0V4Y2x1c2lvblN0cmF0cyA9IHBhbGxvY19hcnJheSh1aW50MTYsIG5rZXljb2xz KTsKCQluZXh0RXhjbE9wID0gbGlzdF9oZWFkKGV4Y2x1c2lvbk9wTmFtZXMpOwoJfQoJZWxz ZQoJCW5leHRFeGNsT3AgPSBOVUxMOwoKCS8qCgkgKiBJZiB0aGlzIGlzIGEgV0lUSE9VVCBP VkVSTEFQUyBjb25zdHJhaW50LCB3ZSBuZWVkIHNwYWNlIGZvciBleGNsdXNpb24KCSAqIG9w cywgYnV0IHdlIGRvbid0IG5lZWQgdG8gcGFyc2UgYW55dGhpbmcsIHNvIHdlIGNhbiBsZXQg bmV4dEV4Y2xPcCBiZQoJICogTlVMTC4gTm90ZSB0aGF0IGZvciBwYXJ0aXRpb25zL2luaGVy aXRpbmcvTElLRSwgZXhjbHVzaW9uT3BOYW1lcyB3aWxsCgkgKiBiZSBzZXQsIHNvIHdlIGFs cmVhZHkgYWxsb2NhdGVkIGFib3ZlLgoJICovCglpZiAoaXN3aXRob3V0b3ZlcmxhcHMpCgl7 CgkJaWYgKGV4Y2x1c2lvbk9wTmFtZXMgPT0gTklMKQoJCXsKCQkJaW5kZXhJbmZvLT5paV9F eGNsdXNpb25PcHMgPSBwYWxsb2NfYXJyYXkoT2lkLCBua2V5Y29scyk7CgkJCWluZGV4SW5m by0+aWlfRXhjbHVzaW9uUHJvY3MgPSBwYWxsb2NfYXJyYXkoT2lkLCBua2V5Y29scyk7CgkJ CWluZGV4SW5mby0+aWlfRXhjbHVzaW9uU3RyYXRzID0gcGFsbG9jX2FycmF5KHVpbnQxNiwg bmtleWNvbHMpOwoJCX0KCQluZXh0RXhjbE9wID0gTlVMTDsKCX0KCglpZiAoT2lkSXNWYWxp ZChkZGxfdXNlcmlkKSkKCQlHZXRVc2VySWRBbmRTZWNDb250ZXh0KCZzYXZlX3VzZXJpZCwg JnNhdmVfc2VjX2NvbnRleHQpOwoKCS8qCgkgKiBwcm9jZXNzIGF0dHJpYnV0ZUxpc3QKCSAq LwoJYXR0biA9IDA7Cglmb3JlYWNoKGxjLCBhdHRMaXN0KQoJewoJCUluZGV4RWxlbSAgKmF0 dHJpYnV0ZSA9IChJbmRleEVsZW0gKikgbGZpcnN0KGxjKTsKCQlPaWQJCQlhdHR0eXBlOwoJ CU9pZAkJCWF0dGNvbGxhdGlvbjsKCgkJLyoKCQkgKiBQcm9jZXNzIHRoZSBjb2x1bW4tb3It ZXhwcmVzc2lvbiB0byBiZSBpbmRleGVkLgoJCSAqLwoJCWlmIChhdHRyaWJ1dGUtPm5hbWUg IT0gTlVMTCkKCQl7CgkJCS8qIFNpbXBsZSBpbmRleCBhdHRyaWJ1dGUgKi8KCQkJSGVhcFR1 cGxlCWF0dHR1cGxlOwoJCQlGb3JtX3BnX2F0dHJpYnV0ZSBhdHRmb3JtOwoKCQkJQXNzZXJ0 KGF0dHJpYnV0ZS0+ZXhwciA9PSBOVUxMKTsKCQkJYXR0dHVwbGUgPSBTZWFyY2hTeXNDYWNo ZUF0dE5hbWUocmVsSWQsIGF0dHJpYnV0ZS0+bmFtZSk7CgkJCWlmICghSGVhcFR1cGxlSXNW YWxpZChhdHR0dXBsZSkpCgkJCXsKCQkJCS8qIGRpZmZlcmVuY2UgaW4gZXJyb3IgbWVzc2Fn ZSBzcGVsbGluZ3MgaXMgaGlzdG9yaWNhbCAqLwoJCQkJaWYgKGlzY29uc3RyYWludCkKCQkJ CQllcmVwb3J0KEVSUk9SLAoJCQkJCQkJKGVycmNvZGUoRVJSQ09ERV9VTkRFRklORURfQ09M VU1OKSwKCQkJCQkJCSBlcnJtc2coImNvbHVtbiBcIiVzXCIgbmFtZWQgaW4ga2V5IGRvZXMg bm90IGV4aXN0IiwKCQkJCQkJCQkJYXR0cmlidXRlLT5uYW1lKSwKCQkJCQkJCSBwYXJzZXJf ZXJycG9zaXRpb24ocHN0YXRlLCBhdHRyaWJ1dGUtPmxvY2F0aW9uKSkpOwoJCQkJZWxzZQoJ CQkJCWVyZXBvcnQoRVJST1IsCgkJCQkJCQkoZXJyY29kZShFUlJDT0RFX1VOREVGSU5FRF9D T0xVTU4pLAoJCQkJCQkJIGVycm1zZygiY29sdW1uIFwiJXNcIiBkb2VzIG5vdCBleGlzdCIs CgkJCQkJCQkJCWF0dHJpYnV0ZS0+bmFtZSksCgkJCQkJCQkgcGFyc2VyX2VycnBvc2l0aW9u KHBzdGF0ZSwgYXR0cmlidXRlLT5sb2NhdGlvbikpKTsKCQkJfQoJCQlhdHRmb3JtID0gKEZv cm1fcGdfYXR0cmlidXRlKSBHRVRTVFJVQ1QoYXR0dHVwbGUpOwoJCQlpbmRleEluZm8tPmlp X0luZGV4QXR0ck51bWJlcnNbYXR0bl0gPSBhdHRmb3JtLT5hdHRudW07CgkJCWF0dHR5cGUg PSBhdHRmb3JtLT5hdHR0eXBpZDsKCQkJYXR0Y29sbGF0aW9uID0gYXR0Zm9ybS0+YXR0Y29s bGF0aW9uOwoJCQlSZWxlYXNlU3lzQ2FjaGUoYXR0dHVwbGUpOwoJCX0KCQllbHNlCgkJewoJ CQkvKiBJbmRleCBleHByZXNzaW9uICovCgkJCU5vZGUJICAgKmV4cHIgPSBhdHRyaWJ1dGUt PmV4cHI7CgoJCQlBc3NlcnQoZXhwciAhPSBOVUxMKTsKCgkJCWlmIChhdHRuID49IG5rZXlj b2xzKQoJCQkJZXJlcG9ydChFUlJPUiwKCQkJCQkJKGVycmNvZGUoRVJSQ09ERV9GRUFUVVJF X05PVF9TVVBQT1JURUQpLAoJCQkJCQkgZXJybXNnKCJleHByZXNzaW9ucyBhcmUgbm90IHN1 cHBvcnRlZCBpbiBpbmNsdWRlZCBjb2x1bW5zIiksCgkJCQkJCSBwYXJzZXJfZXJycG9zaXRp b24ocHN0YXRlLCBhdHRyaWJ1dGUtPmxvY2F0aW9uKSkpOwoJCQlhdHR0eXBlID0gZXhwclR5 cGUoZXhwcik7CgkJCWF0dGNvbGxhdGlvbiA9IGV4cHJDb2xsYXRpb24oZXhwcik7CgoJCQkv KgoJCQkgKiBTdHJpcCBhbnkgdG9wLWxldmVsIENPTExBVEUgY2xhdXNlLiAgVGhpcyBlbnN1 cmVzIHRoYXQgd2UgdHJlYXQKCQkJICogInggQ09MTEFURSB5IiBhbmQgIih4IENPTExBVEUg eSkiIGFsaWtlLgoJCQkgKi8KCQkJd2hpbGUgKElzQShleHByLCBDb2xsYXRlRXhwcikpCgkJ CQlleHByID0gKE5vZGUgKikgKChDb2xsYXRlRXhwciAqKSBleHByKS0+YXJnOwoKCQkJaWYg KElzQShleHByLCBWYXIpICYmCgkJCQkoKFZhciAqKSBleHByKS0+dmFyYXR0bm8gIT0gSW52 YWxpZEF0dHJOdW1iZXIpCgkJCXsKCQkJCS8qCgkJCQkgKiBVc2VyIHdyb3RlICIoY29sdW1u KSIgb3IgIihjb2x1bW4gQ09MTEFURSBzb21ldGhpbmcpIi4KCQkJCSAqIFRyZWF0IGl0IGxp a2Ugc2ltcGxlIGF0dHJpYnV0ZSBhbnl3YXkuCgkJCQkgKi8KCQkJCWluZGV4SW5mby0+aWlf SW5kZXhBdHRyTnVtYmVyc1thdHRuXSA9ICgoVmFyICopIGV4cHIpLT52YXJhdHRubzsKCQkJ fQoJCQllbHNlCgkJCXsKCQkJCWluZGV4SW5mby0+aWlfSW5kZXhBdHRyTnVtYmVyc1thdHRu XSA9IDA7CS8qIG1hcmtzIGV4cHJlc3Npb24gKi8KCQkJCWluZGV4SW5mby0+aWlfRXhwcmVz c2lvbnMgPSBsYXBwZW5kKGluZGV4SW5mby0+aWlfRXhwcmVzc2lvbnMsCgkJCQkJCQkJCQkJ CQlleHByKTsKCgkJCQkvKgoJCQkJICogdHJhbnNmb3JtRXhwcigpIHNob3VsZCBoYXZlIGFs cmVhZHkgcmVqZWN0ZWQgc3VicXVlcmllcywKCQkJCSAqIGFnZ3JlZ2F0ZXMsIGFuZCB3aW5k b3cgZnVuY3Rpb25zLCBiYXNlZCBvbiB0aGUgRVhQUl9LSU5EXwoJCQkJICogZm9yIGFuIGlu ZGV4IGV4cHJlc3Npb24uCgkJCQkgKi8KCgkJCQkvKgoJCQkJICogQW4gZXhwcmVzc2lvbiB1 c2luZyBtdXRhYmxlIGZ1bmN0aW9ucyBpcyBwcm9iYWJseSB3cm9uZywKCQkJCSAqIHNpbmNl IGlmIHlvdSBhcmVuJ3QgZ29pbmcgdG8gZ2V0IHRoZSBzYW1lIHJlc3VsdCBmb3IgdGhlCgkJ CQkgKiBzYW1lIGRhdGEgZXZlcnkgdGltZSwgaXQncyBub3QgY2xlYXIgd2hhdCB0aGUgaW5k ZXggZW50cmllcwoJCQkJICogbWVhbiBhdCBhbGwuCgkJCQkgKi8KCQkJCWlmIChjb250YWlu X211dGFibGVfZnVuY3Rpb25zX2FmdGVyX3BsYW5uaW5nKChFeHByICopIGV4cHIpKQoJCQkJ CWVyZXBvcnQoRVJST1IsCgkJCQkJCQkoZXJyY29kZShFUlJDT0RFX0lOVkFMSURfT0JKRUNU X0RFRklOSVRJT04pLAoJCQkJCQkJIGVycm1zZygiZnVuY3Rpb25zIGluIGluZGV4IGV4cHJl c3Npb24gbXVzdCBiZSBtYXJrZWQgSU1NVVRBQkxFIiksCgkJCQkJCQkgcGFyc2VyX2VycnBv c2l0aW9uKHBzdGF0ZSwgYXR0cmlidXRlLT5sb2NhdGlvbikpKTsKCQkJfQoJCX0KCgkJdHlw ZU9pZHNbYXR0bl0gPSBhdHR0eXBlOwoKCQkvKgoJCSAqIEluY2x1ZGVkIGNvbHVtbnMgaGF2 ZSBubyBjb2xsYXRpb24sIG5vIG9wY2xhc3MgYW5kIG5vIG9yZGVyaW5nCgkJICogb3B0aW9u cy4KCQkgKi8KCQlpZiAoYXR0biA+PSBua2V5Y29scykKCQl7CgkJCWlmIChhdHRyaWJ1dGUt PmNvbGxhdGlvbikKCQkJCWVyZXBvcnQoRVJST1IsCgkJCQkJCShlcnJjb2RlKEVSUkNPREVf SU5WQUxJRF9PQkpFQ1RfREVGSU5JVElPTiksCgkJCQkJCSBlcnJtc2coImluY2x1ZGluZyBj b2x1bW4gZG9lcyBub3Qgc3VwcG9ydCBhIGNvbGxhdGlvbiIpLAoJCQkJCQkgcGFyc2VyX2Vy cnBvc2l0aW9uKHBzdGF0ZSwgYXR0cmlidXRlLT5sb2NhdGlvbikpKTsKCQkJaWYgKGF0dHJp YnV0ZS0+b3BjbGFzcykKCQkJCWVyZXBvcnQoRVJST1IsCgkJCQkJCShlcnJjb2RlKEVSUkNP REVfSU5WQUxJRF9PQkpFQ1RfREVGSU5JVElPTiksCgkJCQkJCSBlcnJtc2coImluY2x1ZGlu ZyBjb2x1bW4gZG9lcyBub3Qgc3VwcG9ydCBhbiBvcGVyYXRvciBjbGFzcyIpLAoJCQkJCQkg cGFyc2VyX2VycnBvc2l0aW9uKHBzdGF0ZSwgYXR0cmlidXRlLT5sb2NhdGlvbikpKTsKCQkJ aWYgKGF0dHJpYnV0ZS0+b3JkZXJpbmcgIT0gU09SVEJZX0RFRkFVTFQpCgkJCQllcmVwb3J0 KEVSUk9SLAoJCQkJCQkoZXJyY29kZShFUlJDT0RFX0lOVkFMSURfT0JKRUNUX0RFRklOSVRJ T04pLAoJCQkJCQkgZXJybXNnKCJpbmNsdWRpbmcgY29sdW1uIGRvZXMgbm90IHN1cHBvcnQg QVNDL0RFU0Mgb3B0aW9ucyIpLAoJCQkJCQkgcGFyc2VyX2VycnBvc2l0aW9uKHBzdGF0ZSwg YXR0cmlidXRlLT5sb2NhdGlvbikpKTsKCQkJaWYgKGF0dHJpYnV0ZS0+bnVsbHNfb3JkZXJp bmcgIT0gU09SVEJZX05VTExTX0RFRkFVTFQpCgkJCQllcmVwb3J0KEVSUk9SLAoJCQkJCQko ZXJyY29kZShFUlJDT0RFX0lOVkFMSURfT0JKRUNUX0RFRklOSVRJT04pLAoJCQkJCQkgZXJy bXNnKCJpbmNsdWRpbmcgY29sdW1uIGRvZXMgbm90IHN1cHBvcnQgTlVMTFMgRklSU1QvTEFT VCBvcHRpb25zIiksCgkJCQkJCSBwYXJzZXJfZXJycG9zaXRpb24ocHN0YXRlLCBhdHRyaWJ1 dGUtPmxvY2F0aW9uKSkpOwoKCQkJb3BjbGFzc09pZHNbYXR0bl0gPSBJbnZhbGlkT2lkOwoJ CQlvcGNsYXNzT3B0aW9uc1thdHRuXSA9IChEYXR1bSkgMDsKCQkJY29sT3B0aW9uc1thdHRu XSA9IDA7CgkJCWNvbGxhdGlvbk9pZHNbYXR0bl0gPSBJbnZhbGlkT2lkOwoJCQlhdHRuKys7 CgoJCQljb250aW51ZTsKCQl9CgoJCS8qCgkJICogQXBwbHkgY29sbGF0aW9uIG92ZXJyaWRl IGlmIGFueS4gIFVzZSBvZiBkZGxfdXNlcmlkIGlzIG5lY2Vzc2FyeQoJCSAqIGR1ZSB0byBB Q0wgY2hlY2tzIHRoZXJlaW4sIGFuZCBpdCdzIHNhZmUgYmVjYXVzZSBjb2xsYXRpb25zIGRv bid0CgkJICogY29udGFpbiBvcGFxdWUgZXhwcmVzc2lvbnMgKG9yIG5vbi1vcGFxdWUgZXhw cmVzc2lvbnMpLgoJCSAqLwoJCWlmIChhdHRyaWJ1dGUtPmNvbGxhdGlvbikKCQl7CgkJCWlm IChPaWRJc1ZhbGlkKGRkbF91c2VyaWQpKQoJCQl7CgkJCQlBdEVPWGFjdF9HVUMoZmFsc2Us ICpkZGxfc2F2ZV9uZXN0bGV2ZWwpOwoJCQkJU2V0VXNlcklkQW5kU2VjQ29udGV4dChkZGxf dXNlcmlkLCBkZGxfc2VjX2NvbnRleHQpOwoJCQl9CgkJCWF0dGNvbGxhdGlvbiA9IGdldF9j b2xsYXRpb25fb2lkKGF0dHJpYnV0ZS0+Y29sbGF0aW9uLCBmYWxzZSk7CgkJCWlmIChPaWRJ c1ZhbGlkKGRkbF91c2VyaWQpKQoJCQl7CgkJCQlTZXRVc2VySWRBbmRTZWNDb250ZXh0KHNh dmVfdXNlcmlkLCBzYXZlX3NlY19jb250ZXh0KTsKCQkJCSpkZGxfc2F2ZV9uZXN0bGV2ZWwg PSBOZXdHVUNOZXN0TGV2ZWwoKTsKCQkJCVJlc3RyaWN0U2VhcmNoUGF0aCgpOwoJCQl9CgkJ fQoKCQkvKgoJCSAqIENoZWNrIHdlIGhhdmUgYSBjb2xsYXRpb24gaWZmIGl0J3MgYSBjb2xs YXRhYmxlIHR5cGUuICBUaGUgb25seQoJCSAqIGV4cGVjdGVkIGZhaWx1cmVzIGhlcmUgYXJl ICgxKSBDT0xMQVRFIGFwcGxpZWQgdG8gYSBub25jb2xsYXRhYmxlCgkJICogdHlwZSwgb3Ig KDIpIGluZGV4IGV4cHJlc3Npb24gaGFkIGFuIHVucmVzb2x2ZWQgY29sbGF0aW9uLiAgQnV0 IHdlCgkJICogbWlnaHQgYXMgd2VsbCBjb2RlIHRoaXMgdG8gYmUgYSBjb21wbGV0ZSBjb25z aXN0ZW5jeSBjaGVjay4KCQkgKi8KCQlpZiAodHlwZV9pc19jb2xsYXRhYmxlKGF0dHR5cGUp KQoJCXsKCQkJaWYgKCFPaWRJc1ZhbGlkKGF0dGNvbGxhdGlvbikpCgkJCQllcmVwb3J0KEVS Uk9SLAoJCQkJCQkoZXJyY29kZShFUlJDT0RFX0lOREVURVJNSU5BVEVfQ09MTEFUSU9OKSwK CQkJCQkJIGVycm1zZygiY291bGQgbm90IGRldGVybWluZSB3aGljaCBjb2xsYXRpb24gdG8g dXNlIGZvciBpbmRleCBleHByZXNzaW9uIiksCgkJCQkJCSBlcnJoaW50KCJVc2UgdGhlIENP TExBVEUgY2xhdXNlIHRvIHNldCB0aGUgY29sbGF0aW9uIGV4cGxpY2l0bHkuIiksCgkJCQkJ CSBwYXJzZXJfZXJycG9zaXRpb24ocHN0YXRlLCBhdHRyaWJ1dGUtPmxvY2F0aW9uKSkpOwoJ CX0KCQllbHNlCgkJewoJCQlpZiAoT2lkSXNWYWxpZChhdHRjb2xsYXRpb24pKQoJCQkJZXJl cG9ydChFUlJPUiwKCQkJCQkJKGVycmNvZGUoRVJSQ09ERV9EQVRBVFlQRV9NSVNNQVRDSCks CgkJCQkJCSBlcnJtc2coImNvbGxhdGlvbnMgYXJlIG5vdCBzdXBwb3J0ZWQgYnkgdHlwZSAl cyIsCgkJCQkJCQkJZm9ybWF0X3R5cGVfYmUoYXR0dHlwZSkpLAoJCQkJCQkgcGFyc2VyX2Vy cnBvc2l0aW9uKHBzdGF0ZSwgYXR0cmlidXRlLT5sb2NhdGlvbikpKTsKCQl9CgoJCWNvbGxh dGlvbk9pZHNbYXR0bl0gPSBhdHRjb2xsYXRpb247CgoJCS8qCgkJICogSWRlbnRpZnkgdGhl IG9wY2xhc3MgdG8gdXNlLiAgVXNlIG9mIGRkbF91c2VyaWQgaXMgbmVjZXNzYXJ5IGR1ZSB0 bwoJCSAqIEFDTCBjaGVja3MgdGhlcmVpbi4gIFRoaXMgaXMgc2FmZSBkZXNwaXRlIG9wY2xh c3NlcyBjb250YWluaW5nCgkJICogb3BhcXVlIGV4cHJlc3Npb25zIChzcGVjaWZpY2FsbHks IGZ1bmN0aW9ucyksIGJlY2F1c2Ugb25seQoJCSAqIHN1cGVydXNlcnMgY2FuIGRlZmluZSBv cGNsYXNzZXMuCgkJICovCgkJaWYgKE9pZElzVmFsaWQoZGRsX3VzZXJpZCkpCgkJewoJCQlB dEVPWGFjdF9HVUMoZmFsc2UsICpkZGxfc2F2ZV9uZXN0bGV2ZWwpOwoJCQlTZXRVc2VySWRB bmRTZWNDb250ZXh0KGRkbF91c2VyaWQsIGRkbF9zZWNfY29udGV4dCk7CgkJfQoJCW9wY2xh c3NPaWRzW2F0dG5dID0gUmVzb2x2ZU9wQ2xhc3MoYXR0cmlidXRlLT5vcGNsYXNzLAoJCQkJ CQkJCQkJICAgYXR0dHlwZSwKCQkJCQkJCQkJCSAgIGFjY2Vzc01ldGhvZE5hbWUsCgkJCQkJ CQkJCQkgICBhY2Nlc3NNZXRob2RJZCk7CgkJaWYgKE9pZElzVmFsaWQoZGRsX3VzZXJpZCkp CgkJewoJCQlTZXRVc2VySWRBbmRTZWNDb250ZXh0KHNhdmVfdXNlcmlkLCBzYXZlX3NlY19j b250ZXh0KTsKCQkJKmRkbF9zYXZlX25lc3RsZXZlbCA9IE5ld0dVQ05lc3RMZXZlbCgpOwoJ CQlSZXN0cmljdFNlYXJjaFBhdGgoKTsKCQl9CgoJCS8qCgkJICogSWRlbnRpZnkgdGhlIGV4 Y2x1c2lvbiBvcGVyYXRvciwgaWYgYW55LgoJCSAqLwoJCWlmIChuZXh0RXhjbE9wKQoJCXsK CQkJTGlzdAkgICAqb3BuYW1lID0gKExpc3QgKikgbGZpcnN0KG5leHRFeGNsT3ApOwoJCQlP aWQJCQlvcGlkOwoJCQlPaWQJCQlvcGZhbWlseTsKCQkJaW50CQkJc3RyYXQ7CgoJCQkvKgoJ CQkgKiBGaW5kIHRoZSBvcGVyYXRvciAtLS0gaXQgbXVzdCBhY2NlcHQgdGhlIGNvbHVtbiBk YXRhdHlwZQoJCQkgKiB3aXRob3V0IHJ1bnRpbWUgY29lcmNpb24gKGJ1dCBiaW5hcnkgY29t cGF0aWJpbGl0eSBpcyBPSykuCgkJCSAqIE9wZXJhdG9ycyBjb250YWluIG9wYXF1ZSBleHBy ZXNzaW9ucyAoc3BlY2lmaWNhbGx5LCBmdW5jdGlvbnMpLgoJCQkgKiBjb21wYXRpYmxlX29w ZXJfb3BpZCgpIGJvaWxzIGRvd24gdG8gb3BlcigpIGFuZAoJCQkgKiBJc0JpbmFyeUNvZXJj aWJsZSgpLiAgUG9zdGdyZVNRTCB3b3VsZCBoYXZlIHNlY3VyaXR5IHByb2JsZW1zCgkJCSAq IGVsc2V3aGVyZSBpZiBvcGVyKCkgc3RhcnRlZCBjYWxsaW5nIG9wYXF1ZSBleHByZXNzaW9u cy4KCQkJICovCgkJCWlmIChPaWRJc1ZhbGlkKGRkbF91c2VyaWQpKQoJCQl7CgkJCQlBdEVP WGFjdF9HVUMoZmFsc2UsICpkZGxfc2F2ZV9uZXN0bGV2ZWwpOwoJCQkJU2V0VXNlcklkQW5k U2VjQ29udGV4dChkZGxfdXNlcmlkLCBkZGxfc2VjX2NvbnRleHQpOwoJCQl9CgkJCW9waWQg PSBjb21wYXRpYmxlX29wZXJfb3BpZChvcG5hbWUsIGF0dHR5cGUsIGF0dHR5cGUsIGZhbHNl KTsKCQkJaWYgKE9pZElzVmFsaWQoZGRsX3VzZXJpZCkpCgkJCXsKCQkJCVNldFVzZXJJZEFu ZFNlY0NvbnRleHQoc2F2ZV91c2VyaWQsIHNhdmVfc2VjX2NvbnRleHQpOwoJCQkJKmRkbF9z YXZlX25lc3RsZXZlbCA9IE5ld0dVQ05lc3RMZXZlbCgpOwoJCQkJUmVzdHJpY3RTZWFyY2hQ YXRoKCk7CgkJCX0KCgkJCS8qCgkJCSAqIE9ubHkgYWxsb3cgY29tbXV0YXRpdmUgb3BlcmF0 b3JzIHRvIGJlIHVzZWQgaW4gZXhjbHVzaW9uCgkJCSAqIGNvbnN0cmFpbnRzLiBJZiBYIGNv bmZsaWN0cyB3aXRoIFksIGJ1dCBZIGRvZXMgbm90IGNvbmZsaWN0CgkJCSAqIHdpdGggWCwg YmFkIHRoaW5ncyB3aWxsIGhhcHBlbi4KCQkJICovCgkJCWlmIChnZXRfY29tbXV0YXRvcihv cGlkKSAhPSBvcGlkKQoJCQkJZXJlcG9ydChFUlJPUiwKCQkJCQkJKGVycmNvZGUoRVJSQ09E RV9XUk9OR19PQkpFQ1RfVFlQRSksCgkJCQkJCSBlcnJtc2coIm9wZXJhdG9yICVzIGlzIG5v dCBjb21tdXRhdGl2ZSIsCgkJCQkJCQkJZm9ybWF0X29wZXJhdG9yKG9waWQpKSwKCQkJCQkJ IGVycmRldGFpbCgiT25seSBjb21tdXRhdGl2ZSBvcGVyYXRvcnMgY2FuIGJlIHVzZWQgaW4g ZXhjbHVzaW9uIGNvbnN0cmFpbnRzLiIpLAoJCQkJCQkgcGFyc2VyX2VycnBvc2l0aW9uKHBz dGF0ZSwgYXR0cmlidXRlLT5sb2NhdGlvbikpKTsKCgkJCS8qCgkJCSAqIE9wZXJhdG9yIG11 c3QgYmUgYSBtZW1iZXIgb2YgdGhlIHJpZ2h0IG9wZmFtaWx5LCB0b28KCQkJICovCgkJCW9w ZmFtaWx5ID0gZ2V0X29wY2xhc3NfZmFtaWx5KG9wY2xhc3NPaWRzW2F0dG5dKTsKCQkJc3Ry YXQgPSBnZXRfb3Bfb3BmYW1pbHlfc3RyYXRlZ3kob3BpZCwgb3BmYW1pbHkpOwoJCQlpZiAo c3RyYXQgPT0gMCkKCQkJCWVyZXBvcnQoRVJST1IsCgkJCQkJCShlcnJjb2RlKEVSUkNPREVf V1JPTkdfT0JKRUNUX1RZUEUpLAoJCQkJCQkgZXJybXNnKCJvcGVyYXRvciAlcyBpcyBub3Qg YSBtZW1iZXIgb2Ygb3BlcmF0b3IgZmFtaWx5IFwiJXNcIiIsCgkJCQkJCQkJZm9ybWF0X29w ZXJhdG9yKG9waWQpLAoJCQkJCQkJCWdldF9vcGZhbWlseV9uYW1lKG9wZmFtaWx5LCBmYWxz ZSkpLAoJCQkJCQkgZXJyZGV0YWlsKCJUaGUgZXhjbHVzaW9uIG9wZXJhdG9yIG11c3QgYmUg cmVsYXRlZCB0byB0aGUgaW5kZXggb3BlcmF0b3IgY2xhc3MgZm9yIHRoZSBjb25zdHJhaW50 LiIpLAoJCQkJCQkgcGFyc2VyX2VycnBvc2l0aW9uKHBzdGF0ZSwgYXR0cmlidXRlLT5sb2Nh dGlvbikpKTsKCgkJCWluZGV4SW5mby0+aWlfRXhjbHVzaW9uT3BzW2F0dG5dID0gb3BpZDsK CQkJaW5kZXhJbmZvLT5paV9FeGNsdXNpb25Qcm9jc1thdHRuXSA9IGdldF9vcGNvZGUob3Bp ZCk7CgkJCWluZGV4SW5mby0+aWlfRXhjbHVzaW9uU3RyYXRzW2F0dG5dID0gc3RyYXQ7CgkJ CW5leHRFeGNsT3AgPSBsbmV4dChleGNsdXNpb25PcE5hbWVzLCBuZXh0RXhjbE9wKTsKCQl9 CgkJZWxzZSBpZiAoaXN3aXRob3V0b3ZlcmxhcHMpCgkJewoJCQlDb21wYXJlVHlwZSBjbXB0 eXBlOwoJCQlTdHJhdGVneU51bWJlciBzdHJhdDsKCQkJT2lkCQkJb3BpZDsKCgkJCWlmIChh dHRuID09IG5rZXljb2xzIC0gMSkKCQkJCWNtcHR5cGUgPSBDT01QQVJFX09WRVJMQVA7CgkJ CWVsc2UKCQkJCWNtcHR5cGUgPSBDT01QQVJFX0VROwoJCQlHZXRPcGVyYXRvckZyb21Db21w YXJlVHlwZShvcGNsYXNzT2lkc1thdHRuXSwgSW52YWxpZE9pZCwgY21wdHlwZSwgJm9waWQs ICZzdHJhdCk7CgkJCWluZGV4SW5mby0+aWlfRXhjbHVzaW9uT3BzW2F0dG5dID0gb3BpZDsK CQkJaW5kZXhJbmZvLT5paV9FeGNsdXNpb25Qcm9jc1thdHRuXSA9IGdldF9vcGNvZGUob3Bp ZCk7CgkJCWluZGV4SW5mby0+aWlfRXhjbHVzaW9uU3RyYXRzW2F0dG5dID0gc3RyYXQ7CgkJ fQoKCQkvKgoJCSAqIFNldCB1cCB0aGUgcGVyLWNvbHVtbiBvcHRpb25zIChpbmRvcHRpb24g ZmllbGQpLiAgRm9yIG5vdywgdGhpcyBpcwoJCSAqIHplcm8gZm9yIGFueSB1bi1vcmRlcmVk IGluZGV4LCB3aGlsZSBvcmRlcmVkIGluZGV4ZXMgaGF2ZSBERVNDIGFuZAoJCSAqIE5VTExT IEZJUlNUL0xBU1Qgb3B0aW9ucy4KCQkgKi8KCQljb2xPcHRpb25zW2F0dG5dID0gMDsKCQlp ZiAoYW1jYW5vcmRlcikKCQl7CgkJCS8qIGRlZmF1bHQgb3JkZXJpbmcgaXMgQVNDICovCgkJ CWlmIChhdHRyaWJ1dGUtPm9yZGVyaW5nID09IFNPUlRCWV9ERVNDKQoJCQkJY29sT3B0aW9u c1thdHRuXSB8PSBJTkRPUFRJT05fREVTQzsKCQkJLyogZGVmYXVsdCBudWxsIG9yZGVyaW5n IGlzIExBU1QgZm9yIEFTQywgRklSU1QgZm9yIERFU0MgKi8KCQkJaWYgKGF0dHJpYnV0ZS0+ bnVsbHNfb3JkZXJpbmcgPT0gU09SVEJZX05VTExTX0RFRkFVTFQpCgkJCXsKCQkJCWlmIChh dHRyaWJ1dGUtPm9yZGVyaW5nID09IFNPUlRCWV9ERVNDKQoJCQkJCWNvbE9wdGlvbnNbYXR0 bl0gfD0gSU5ET1BUSU9OX05VTExTX0ZJUlNUOwoJCQl9CgkJCWVsc2UgaWYgKGF0dHJpYnV0 ZS0+bnVsbHNfb3JkZXJpbmcgPT0gU09SVEJZX05VTExTX0ZJUlNUKQoJCQkJY29sT3B0aW9u c1thdHRuXSB8PSBJTkRPUFRJT05fTlVMTFNfRklSU1Q7CgkJfQoJCWVsc2UKCQl7CgkJCS8q IGluZGV4IEFNIGRvZXMgbm90IHN1cHBvcnQgb3JkZXJpbmcgKi8KCQkJaWYgKGF0dHJpYnV0 ZS0+b3JkZXJpbmcgIT0gU09SVEJZX0RFRkFVTFQpCgkJCQllcmVwb3J0KEVSUk9SLAoJCQkJ CQkoZXJyY29kZShFUlJDT0RFX0ZFQVRVUkVfTk9UX1NVUFBPUlRFRCksCgkJCQkJCSBlcnJt c2coImFjY2VzcyBtZXRob2QgXCIlc1wiIGRvZXMgbm90IHN1cHBvcnQgQVNDL0RFU0Mgb3B0 aW9ucyIsCgkJCQkJCQkJYWNjZXNzTWV0aG9kTmFtZSksCgkJCQkJCSBwYXJzZXJfZXJycG9z aXRpb24ocHN0YXRlLCBhdHRyaWJ1dGUtPmxvY2F0aW9uKSkpOwoJCQlpZiAoYXR0cmlidXRl LT5udWxsc19vcmRlcmluZyAhPSBTT1JUQllfTlVMTFNfREVGQVVMVCkKCQkJCWVyZXBvcnQo RVJST1IsCgkJCQkJCShlcnJjb2RlKEVSUkNPREVfRkVBVFVSRV9OT1RfU1VQUE9SVEVEKSwK CQkJCQkJIGVycm1zZygiYWNjZXNzIG1ldGhvZCBcIiVzXCIgZG9lcyBub3Qgc3VwcG9ydCBO VUxMUyBGSVJTVC9MQVNUIG9wdGlvbnMiLAoJCQkJCQkJCWFjY2Vzc01ldGhvZE5hbWUpLAoJ CQkJCQkgcGFyc2VyX2VycnBvc2l0aW9uKHBzdGF0ZSwgYXR0cmlidXRlLT5sb2NhdGlvbikp KTsKCQl9CgoJCS8qIFNldCB1cCB0aGUgcGVyLWNvbHVtbiBvcGNsYXNzIG9wdGlvbnMgKGF0 dG9wdGlvbnMgZmllbGQpLiAqLwoJCWlmIChhdHRyaWJ1dGUtPm9wY2xhc3NvcHRzKQoJCXsK CQkJQXNzZXJ0KGF0dG4gPCBua2V5Y29scyk7CgoJCQlvcGNsYXNzT3B0aW9uc1thdHRuXSA9 CgkJCQl0cmFuc2Zvcm1SZWxPcHRpb25zKChEYXR1bSkgMCwgYXR0cmlidXRlLT5vcGNsYXNz b3B0cywKCQkJCQkJCQkJTlVMTCwgTlVMTCwgZmFsc2UsIGZhbHNlKTsKCQl9CgkJZWxzZQoJ CQlvcGNsYXNzT3B0aW9uc1thdHRuXSA9IChEYXR1bSkgMDsKCgkJYXR0bisrOwoJfQoKCWlu ZGV4SW5mby0+aWlfRXhwcmVzc2lvbnNFeHBhbmQgPQoJCUV4cGFuZFZpcnR1YWxHZW5lcmF0 ZWRDb2x1bW5zKGNvcHlPYmplY3QoaW5kZXhJbmZvLT5paV9FeHByZXNzaW9ucyksCgkJCQkJ CQkJCQkJICBOVUxMLCByZWxJZCk7Cn0KCi8qCiAqIFJlc29sdmUgcG9zc2libHktZGVmYXVs dGVkIG9wZXJhdG9yIGNsYXNzIHNwZWNpZmljYXRpb24KICoKICogTm90ZTogVGhpcyBpcyB1 c2VkIHRvIHJlc29sdmUgb3BlcmF0b3IgY2xhc3Mgc3BlY2lmaWNhdGlvbnMgaW4gaW5kZXgg YW5kCiAqIHBhcnRpdGlvbiBrZXkgZGVmaW5pdGlvbnMuCiAqLwpPaWQKUmVzb2x2ZU9wQ2xh c3MoY29uc3QgTGlzdCAqb3BjbGFzcywgT2lkIGF0dHJUeXBlLAoJCQkgICBjb25zdCBjaGFy ICphY2Nlc3NNZXRob2ROYW1lLCBPaWQgYWNjZXNzTWV0aG9kSWQpCnsKCWNoYXIJICAgKnNj aGVtYW5hbWU7CgljaGFyCSAgICpvcGNuYW1lOwoJSGVhcFR1cGxlCXR1cGxlOwoJRm9ybV9w Z19vcGNsYXNzIG9wZm9ybTsKCU9pZAkJCW9wQ2xhc3NJZCwKCQkJCW9wSW5wdXRUeXBlOwoK CWlmIChvcGNsYXNzID09IE5JTCkKCXsKCQkvKiBubyBvcGVyYXRvciBjbGFzcyBzcGVjaWZp ZWQsIHNvIGZpbmQgdGhlIGRlZmF1bHQgKi8KCQlvcENsYXNzSWQgPSBHZXREZWZhdWx0T3BD bGFzcyhhdHRyVHlwZSwgYWNjZXNzTWV0aG9kSWQpOwoJCWlmICghT2lkSXNWYWxpZChvcENs YXNzSWQpKQoJCQllcmVwb3J0KEVSUk9SLAoJCQkJCShlcnJjb2RlKEVSUkNPREVfVU5ERUZJ TkVEX09CSkVDVCksCgkJCQkJIGVycm1zZygiZGF0YSB0eXBlICVzIGhhcyBubyBkZWZhdWx0 IG9wZXJhdG9yIGNsYXNzIGZvciBhY2Nlc3MgbWV0aG9kIFwiJXNcIiIsCgkJCQkJCQlmb3Jt YXRfdHlwZV9iZShhdHRyVHlwZSksIGFjY2Vzc01ldGhvZE5hbWUpLAoJCQkJCSBlcnJoaW50 KCJZb3UgbXVzdCBzcGVjaWZ5IGFuIG9wZXJhdG9yIGNsYXNzIGZvciB0aGUgaW5kZXggb3Ig ZGVmaW5lIGEgZGVmYXVsdCBvcGVyYXRvciBjbGFzcyBmb3IgdGhlIGRhdGEgdHlwZS4iKSkp OwoJCXJldHVybiBvcENsYXNzSWQ7Cgl9CgoJLyoKCSAqIFNwZWNpZmljIG9wY2xhc3MgbmFt ZSBnaXZlbiwgc28gbG9vayB1cCB0aGUgb3BjbGFzcy4KCSAqLwoKCS8qIGRlY29uc3RydWN0 IHRoZSBuYW1lIGxpc3QgKi8KCURlY29uc3RydWN0UXVhbGlmaWVkTmFtZShvcGNsYXNzLCAm c2NoZW1hbmFtZSwgJm9wY25hbWUpOwoKCWlmIChzY2hlbWFuYW1lKQoJewoJCS8qIExvb2sg aW4gc3BlY2lmaWMgc2NoZW1hIG9ubHkgKi8KCQlPaWQJCQluYW1lc3BhY2VJZDsKCgkJbmFt ZXNwYWNlSWQgPSBMb29rdXBFeHBsaWNpdE5hbWVzcGFjZShzY2hlbWFuYW1lLCBmYWxzZSk7 CgkJdHVwbGUgPSBTZWFyY2hTeXNDYWNoZTMoQ0xBQU1OQU1FTlNQLAoJCQkJCQkJCU9iamVj dElkR2V0RGF0dW0oYWNjZXNzTWV0aG9kSWQpLAoJCQkJCQkJCVBvaW50ZXJHZXREYXR1bShv cGNuYW1lKSwKCQkJCQkJCQlPYmplY3RJZEdldERhdHVtKG5hbWVzcGFjZUlkKSk7Cgl9Cgll bHNlCgl7CgkJLyogVW5xdWFsaWZpZWQgb3BjbGFzcyBuYW1lLCBzbyBzZWFyY2ggdGhlIHNl YXJjaCBwYXRoICovCgkJb3BDbGFzc0lkID0gT3BjbGFzc25hbWVHZXRPcGNpZChhY2Nlc3NN ZXRob2RJZCwgb3BjbmFtZSk7CgkJaWYgKCFPaWRJc1ZhbGlkKG9wQ2xhc3NJZCkpCgkJCWVy ZXBvcnQoRVJST1IsCgkJCQkJKGVycmNvZGUoRVJSQ09ERV9VTkRFRklORURfT0JKRUNUKSwK CQkJCQkgZXJybXNnKCJvcGVyYXRvciBjbGFzcyBcIiVzXCIgZG9lcyBub3QgZXhpc3QgZm9y IGFjY2VzcyBtZXRob2QgXCIlc1wiIiwKCQkJCQkJCW9wY25hbWUsIGFjY2Vzc01ldGhvZE5h bWUpKSk7CgkJdHVwbGUgPSBTZWFyY2hTeXNDYWNoZTEoQ0xBT0lELCBPYmplY3RJZEdldERh dHVtKG9wQ2xhc3NJZCkpOwoJfQoKCWlmICghSGVhcFR1cGxlSXNWYWxpZCh0dXBsZSkpCgkJ ZXJlcG9ydChFUlJPUiwKCQkJCShlcnJjb2RlKEVSUkNPREVfVU5ERUZJTkVEX09CSkVDVCks CgkJCQkgZXJybXNnKCJvcGVyYXRvciBjbGFzcyBcIiVzXCIgZG9lcyBub3QgZXhpc3QgZm9y IGFjY2VzcyBtZXRob2QgXCIlc1wiIiwKCQkJCQkJTmFtZUxpc3RUb1N0cmluZyhvcGNsYXNz KSwgYWNjZXNzTWV0aG9kTmFtZSkpKTsKCgkvKgoJICogVmVyaWZ5IHRoYXQgdGhlIGluZGV4 IG9wZXJhdG9yIGNsYXNzIGFjY2VwdHMgdGhpcyBkYXRhdHlwZS4gIE5vdGUgd2UKCSAqIHdp bGwgYWNjZXB0IGJpbmFyeSBjb21wYXRpYmlsaXR5LgoJICovCglvcGZvcm0gPSAoRm9ybV9w Z19vcGNsYXNzKSBHRVRTVFJVQ1QodHVwbGUpOwoJb3BDbGFzc0lkID0gb3Bmb3JtLT5vaWQ7 CglvcElucHV0VHlwZSA9IG9wZm9ybS0+b3BjaW50eXBlOwoKCWlmICghSXNCaW5hcnlDb2Vy Y2libGUoYXR0clR5cGUsIG9wSW5wdXRUeXBlKSkKCQllcmVwb3J0KEVSUk9SLAoJCQkJKGVy cmNvZGUoRVJSQ09ERV9EQVRBVFlQRV9NSVNNQVRDSCksCgkJCQkgZXJybXNnKCJvcGVyYXRv ciBjbGFzcyBcIiVzXCIgZG9lcyBub3QgYWNjZXB0IGRhdGEgdHlwZSAlcyIsCgkJCQkJCU5h bWVMaXN0VG9TdHJpbmcob3BjbGFzcyksIGZvcm1hdF90eXBlX2JlKGF0dHJUeXBlKSkpKTsK CglSZWxlYXNlU3lzQ2FjaGUodHVwbGUpOwoKCXJldHVybiBvcENsYXNzSWQ7Cn0KCi8qCiAq IEdldERlZmF1bHRPcENsYXNzCiAqCiAqIEdpdmVuIHRoZSBPSURzIG9mIGEgZGF0YXR5cGUg YW5kIGFuIGFjY2VzcyBtZXRob2QsIGZpbmQgdGhlIGRlZmF1bHQKICogb3BlcmF0b3IgY2xh c3MsIGlmIGFueS4gIFJldHVybnMgSW52YWxpZE9pZCBpZiB0aGVyZSBpcyBub25lLgogKi8K T2lkCkdldERlZmF1bHRPcENsYXNzKE9pZCB0eXBlX2lkLCBPaWQgYW1faWQpCnsKCU9pZAkJ CXJlc3VsdCA9IEludmFsaWRPaWQ7CglpbnQJCQluZXhhY3QgPSAwOwoJaW50CQkJbmNvbXBh dGlibGUgPSAwOwoJaW50CQkJbmNvbXBhdGlibGVwcmVmZXJyZWQgPSAwOwoJUmVsYXRpb24J cmVsOwoJU2NhbktleURhdGEgc2tleVsxXTsKCVN5c1NjYW5EZXNjIHNjYW47CglIZWFwVHVw bGUJdHVwOwoJVFlQQ0FURUdPUlkgdGNhdGVnb3J5OwoKCS8qIElmIGl0J3MgYSBkb21haW4s IGxvb2sgYXQgdGhlIGJhc2UgdHlwZSBpbnN0ZWFkICovCgl0eXBlX2lkID0gZ2V0QmFzZVR5 cGUodHlwZV9pZCk7CgoJdGNhdGVnb3J5ID0gVHlwZUNhdGVnb3J5KHR5cGVfaWQpOwoKCS8q CgkgKiBXZSBzY2FuIHRocm91Z2ggYWxsIHRoZSBvcGNsYXNzZXMgYXZhaWxhYmxlIGZvciB0 aGUgYWNjZXNzIG1ldGhvZCwKCSAqIGxvb2tpbmcgZm9yIG9uZSB0aGF0IGlzIG1hcmtlZCBk ZWZhdWx0IGFuZCBtYXRjaGVzIHRoZSB0YXJnZXQgdHlwZQoJICogKGVpdGhlciBleGFjdGx5 IG9yIGJpbmFyeS1jb21wYXRpYmx5LCBidXQgcHJlZmVyIGFuIGV4YWN0IG1hdGNoKS4KCSAq CgkgKiBXZSBjb3VsZCBmaW5kIG1vcmUgdGhhbiBvbmUgYmluYXJ5LWNvbXBhdGlibGUgbWF0 Y2guICBJZiBqdXN0IG9uZSBpcwoJICogZm9yIGEgcHJlZmVycmVkIHR5cGUsIHVzZSB0aGF0 IG9uZTsgb3RoZXJ3aXNlIHdlIGZhaWwsIGZvcmNpbmcgdGhlIHVzZXIKCSAqIHRvIHNwZWNp Znkgd2hpY2ggb25lIGhlIHdhbnRzLiAgKFRoZSBwcmVmZXJyZWQtdHlwZSBzcGVjaWFsIGNh c2UgaXMgYQoJICoga2x1Z2UgZm9yIHZhcmNoYXI6IGl0J3MgYmluYXJ5LWNvbXBhdGlibGUg dG8gYm90aCB0ZXh0IGFuZCBicGNoYXIsIHNvCgkgKiB3ZSBuZWVkIGEgdGllYnJlYWtlci4p ICBJZiB3ZSBmaW5kIG1vcmUgdGhhbiBvbmUgZXhhY3QgbWF0Y2gsIHRoZW4KCSAqIHNvbWVv bmUgcHV0IGJvZ3VzIGVudHJpZXMgaW4gcGdfb3BjbGFzcy4KCSAqLwoJcmVsID0gdGFibGVf b3BlbihPcGVyYXRvckNsYXNzUmVsYXRpb25JZCwgQWNjZXNzU2hhcmVMb2NrKTsKCglTY2Fu S2V5SW5pdCgmc2tleVswXSwKCQkJCUFudW1fcGdfb3BjbGFzc19vcGNtZXRob2QsCgkJCQlC VEVxdWFsU3RyYXRlZ3lOdW1iZXIsIEZfT0lERVEsCgkJCQlPYmplY3RJZEdldERhdHVtKGFt X2lkKSk7CgoJc2NhbiA9IHN5c3RhYmxlX2JlZ2luc2NhbihyZWwsIE9wY2xhc3NBbU5hbWVO c3BJbmRleElkLCB0cnVlLAoJCQkJCQkJICBOVUxMLCAxLCBza2V5KTsKCgl3aGlsZSAoSGVh cFR1cGxlSXNWYWxpZCh0dXAgPSBzeXN0YWJsZV9nZXRuZXh0KHNjYW4pKSkKCXsKCQlGb3Jt X3BnX29wY2xhc3Mgb3BjbGFzcyA9IChGb3JtX3BnX29wY2xhc3MpIEdFVFNUUlVDVCh0dXAp OwoKCQkvKiBpZ25vcmUgYWx0b2dldGhlciBpZiBub3QgYSBkZWZhdWx0IG9wY2xhc3MgKi8K CQlpZiAoIW9wY2xhc3MtPm9wY2RlZmF1bHQpCgkJCWNvbnRpbnVlOwoJCWlmIChvcGNsYXNz LT5vcGNpbnR5cGUgPT0gdHlwZV9pZCkKCQl7CgkJCW5leGFjdCsrOwoJCQlyZXN1bHQgPSBv cGNsYXNzLT5vaWQ7CgkJfQoJCWVsc2UgaWYgKG5leGFjdCA9PSAwICYmCgkJCQkgSXNCaW5h cnlDb2VyY2libGUodHlwZV9pZCwgb3BjbGFzcy0+b3BjaW50eXBlKSkKCQl7CgkJCWlmIChJ c1ByZWZlcnJlZFR5cGUodGNhdGVnb3J5LCBvcGNsYXNzLT5vcGNpbnR5cGUpKQoJCQl7CgkJ CQluY29tcGF0aWJsZXByZWZlcnJlZCsrOwoJCQkJcmVzdWx0ID0gb3BjbGFzcy0+b2lkOwoJ CQl9CgkJCWVsc2UgaWYgKG5jb21wYXRpYmxlcHJlZmVycmVkID09IDApCgkJCXsKCQkJCW5j b21wYXRpYmxlKys7CgkJCQlyZXN1bHQgPSBvcGNsYXNzLT5vaWQ7CgkJCX0KCQl9Cgl9CgoJ c3lzdGFibGVfZW5kc2NhbihzY2FuKTsKCgl0YWJsZV9jbG9zZShyZWwsIEFjY2Vzc1NoYXJl TG9jayk7CgoJLyogcmFpc2UgZXJyb3IgaWYgcGdfb3BjbGFzcyBjb250YWlucyBpbmNvbnNp c3RlbnQgZGF0YSAqLwoJaWYgKG5leGFjdCA+IDEpCgkJZXJlcG9ydChFUlJPUiwKCQkJCShl cnJjb2RlKEVSUkNPREVfRFVQTElDQVRFX09CSkVDVCksCgkJCQkgZXJybXNnKCJ0aGVyZSBh cmUgbXVsdGlwbGUgZGVmYXVsdCBvcGVyYXRvciBjbGFzc2VzIGZvciBkYXRhIHR5cGUgJXMi LAoJCQkJCQlmb3JtYXRfdHlwZV9iZSh0eXBlX2lkKSkpKTsKCglpZiAobmV4YWN0ID09IDEg fHwKCQluY29tcGF0aWJsZXByZWZlcnJlZCA9PSAxIHx8CgkJKG5jb21wYXRpYmxlcHJlZmVy cmVkID09IDAgJiYgbmNvbXBhdGlibGUgPT0gMSkpCgkJcmV0dXJuIHJlc3VsdDsKCglyZXR1 cm4gSW52YWxpZE9pZDsKfQoKLyoKICogR2V0T3BlcmF0b3JGcm9tQ29tcGFyZVR5cGUKICoK ICogb3BjbGFzcyAtIHRoZSBvcGNsYXNzIHRvIHVzZQogKiByaHN0eXBlIC0gdGhlIHR5cGUg Zm9yIHRoZSByaWdodC1oYW5kIHNpZGUsIG9yIEludmFsaWRPaWQgdG8gdXNlIHRoZSB0eXBl IG9mIHRoZSBnaXZlbiBvcGNsYXNzLgogKiBjbXB0eXBlIC0ga2luZCBvZiBvcGVyYXRvciB0 byBmaW5kCiAqIG9waWQgLSBob2xkcyB0aGUgb3BlcmF0b3Igd2UgZm91bmQKICogc3RyYXQg LSBob2xkcyB0aGUgb3V0cHV0IHN0cmF0ZWd5IG51bWJlcgogKgogKiBGaW5kcyBhbiBvcGVy YXRvciBmcm9tIGEgQ29tcGFyZVR5cGUuICBUaGlzIGlzIHVzZWQgZm9yIHRlbXBvcmFsIGlu ZGV4CiAqIGNvbnN0cmFpbnRzIChhbmQgb3RoZXIgdGVtcG9yYWwgZmVhdHVyZXMpIHRvIGxv b2sgdXAgZXF1YWxpdHkgYW5kIG92ZXJsYXBzCiAqIG9wZXJhdG9ycy4gIFdlIGFzayBhbiBv cGNsYXNzIHN1cHBvcnQgZnVuY3Rpb24gdG8gdHJhbnNsYXRlIGZyb20gdGhlCiAqIGNvbXBh cmUgdHlwZSB0byB0aGUgaW50ZXJuYWwgc3RyYXRlZ3kgbnVtYmVycy4gIFJhaXNlcyBFUlJP UiBvbiBzZWFyY2gKICogZmFpbHVyZS4KICovCnZvaWQKR2V0T3BlcmF0b3JGcm9tQ29tcGFy ZVR5cGUoT2lkIG9wY2xhc3MsIE9pZCByaHN0eXBlLCBDb21wYXJlVHlwZSBjbXB0eXBlLAoJ CQkJCQkgICBPaWQgKm9waWQsIFN0cmF0ZWd5TnVtYmVyICpzdHJhdCkKewoJT2lkCQkJYW1p ZDsKCU9pZAkJCW9wZmFtaWx5OwoJT2lkCQkJb3BjaW50eXBlOwoKCUFzc2VydChjbXB0eXBl ID09IENPTVBBUkVfRVEgfHwgY21wdHlwZSA9PSBDT01QQVJFX09WRVJMQVAgfHwgY21wdHlw ZSA9PSBDT01QQVJFX0NPTlRBSU5FRF9CWSk7CgoJLyoKCSAqIFVzZSB0aGUgb3BjbGFzcyB0 byBnZXQgdGhlIG9wZmFtaWx5LCBvcGNpbnR5cGUsIGFuZCBhY2Nlc3MgbWV0aG9kLiBJZgoJ ICogYW55IG9mIHRoaXMgZmFpbHMsIHF1aXQgZWFybHkuCgkgKi8KCWlmICghZ2V0X29wY2xh c3Nfb3BmYW1pbHlfYW5kX2lucHV0X3R5cGUob3BjbGFzcywgJm9wZmFtaWx5LCAmb3BjaW50 eXBlKSkKCQllbG9nKEVSUk9SLCAiY2FjaGUgbG9va3VwIGZhaWxlZCBmb3Igb3BjbGFzcyAl dSIsIG9wY2xhc3MpOwoKCWFtaWQgPSBnZXRfb3BjbGFzc19tZXRob2Qob3BjbGFzcyk7CgoJ LyoKCSAqIEFzayB0aGUgaW5kZXggQU0gdG8gdHJhbnNsYXRlIHRvIGl0cyBpbnRlcm5hbCBz dHJhdG51bQoJICovCgkqc3RyYXQgPSBJbmRleEFtVHJhbnNsYXRlQ29tcGFyZVR5cGUoY21w dHlwZSwgYW1pZCwgb3BmYW1pbHksIHRydWUpOwoJaWYgKCpzdHJhdCA9PSBJbnZhbGlkU3Ry YXRlZ3kpCgkJZXJlcG9ydChFUlJPUiwKCQkJCWVycmNvZGUoRVJSQ09ERV9VTkRFRklORURf T0JKRUNUKSwKCQkJCWNtcHR5cGUgPT0gQ09NUEFSRV9FUSA/IGVycm1zZygiY291bGQgbm90 IGlkZW50aWZ5IGFuIGVxdWFsaXR5IG9wZXJhdG9yIGZvciB0eXBlICVzIiwgZm9ybWF0X3R5 cGVfYmUob3BjaW50eXBlKSkgOgoJCQkJY21wdHlwZSA9PSBDT01QQVJFX09WRVJMQVAgPyBl cnJtc2coImNvdWxkIG5vdCBpZGVudGlmeSBhbiBvdmVybGFwcyBvcGVyYXRvciBmb3IgdHlw ZSAlcyIsIGZvcm1hdF90eXBlX2JlKG9wY2ludHlwZSkpIDoKCQkJCWNtcHR5cGUgPT0gQ09N UEFSRV9DT05UQUlORURfQlkgPyBlcnJtc2coImNvdWxkIG5vdCBpZGVudGlmeSBhIGNvbnRh aW5lZC1ieSBvcGVyYXRvciBmb3IgdHlwZSAlcyIsIGZvcm1hdF90eXBlX2JlKG9wY2ludHlw ZSkpIDogMCwKCQkJCWVycmRldGFpbCgiQ291bGQgbm90IHRyYW5zbGF0ZSBjb21wYXJlIHR5 cGUgJWQgZm9yIG9wZXJhdG9yIGZhbWlseSBcIiVzXCIgb2YgYWNjZXNzIG1ldGhvZCBcIiVz XCIuIiwKCQkJCQkJICBjbXB0eXBlLCBnZXRfb3BmYW1pbHlfbmFtZShvcGZhbWlseSwgZmFs c2UpLCBnZXRfYW1fbmFtZShhbWlkKSkpOwoKCS8qCgkgKiBXZSBwYXJhbWV0ZXJpemUgcmhz dHlwZSBzbyBmb3JlaWduIGtleXMgY2FuIGFzayBmb3IgYSA8QCBvcGVyYXRvciB3aG9zZQoJ ICogcmhzIG1hdGNoZXMgdGhlIGFnZ3JlZ2F0ZSBmdW5jdGlvbi4gRm9yIGV4YW1wbGUgcmFu Z2VfYWdnIHJldHVybnMKCSAqIGFueW11bHRpcmFuZ2UuCgkgKi8KCWlmICghT2lkSXNWYWxp ZChyaHN0eXBlKSkKCQlyaHN0eXBlID0gb3BjaW50eXBlOwoJKm9waWQgPSBnZXRfb3BmYW1p bHlfbWVtYmVyKG9wZmFtaWx5LCBvcGNpbnR5cGUsIHJoc3R5cGUsICpzdHJhdCk7CgoJaWYg KCFPaWRJc1ZhbGlkKCpvcGlkKSkKCQllcmVwb3J0KEVSUk9SLAoJCQkJZXJyY29kZShFUlJD T0RFX1VOREVGSU5FRF9PQkpFQ1QpLAoJCQkJY21wdHlwZSA9PSBDT01QQVJFX0VRID8gZXJy bXNnKCJjb3VsZCBub3QgaWRlbnRpZnkgYW4gZXF1YWxpdHkgb3BlcmF0b3IgZm9yIHR5cGUg JXMiLCBmb3JtYXRfdHlwZV9iZShvcGNpbnR5cGUpKSA6CgkJCQljbXB0eXBlID09IENPTVBB UkVfT1ZFUkxBUCA/IGVycm1zZygiY291bGQgbm90IGlkZW50aWZ5IGFuIG92ZXJsYXBzIG9w ZXJhdG9yIGZvciB0eXBlICVzIiwgZm9ybWF0X3R5cGVfYmUob3BjaW50eXBlKSkgOgoJCQkJ Y21wdHlwZSA9PSBDT01QQVJFX0NPTlRBSU5FRF9CWSA/IGVycm1zZygiY291bGQgbm90IGlk ZW50aWZ5IGEgY29udGFpbmVkLWJ5IG9wZXJhdG9yIGZvciB0eXBlICVzIiwgZm9ybWF0X3R5 cGVfYmUob3BjaW50eXBlKSkgOiAwLAoJCQkJZXJyZGV0YWlsKCJUaGVyZSBpcyBubyBzdWl0 YWJsZSBvcGVyYXRvciBpbiBvcGVyYXRvciBmYW1pbHkgXCIlc1wiIGZvciBhY2Nlc3MgbWV0 aG9kIFwiJXNcIi4iLAoJCQkJCQkgIGdldF9vcGZhbWlseV9uYW1lKG9wZmFtaWx5LCBmYWxz ZSksIGdldF9hbV9uYW1lKGFtaWQpKSk7Cn0KCi8qCiAqCW1ha2VPYmplY3ROYW1lKCkKICoK ICoJQ3JlYXRlIGEgbmFtZSBmb3IgYW4gaW1wbGljaXRseSBjcmVhdGVkIGluZGV4LCBzZXF1 ZW5jZSwgY29uc3RyYWludCwKICoJZXh0ZW5kZWQgc3RhdGlzdGljcywgZXRjLgogKgogKglU aGUgcGFyYW1ldGVycyBhcmUgdHlwaWNhbGx5OiB0aGUgb3JpZ2luYWwgdGFibGUgbmFtZSwg dGhlIG9yaWdpbmFsIGZpZWxkCiAqCW5hbWUsIGFuZCBhICJ0eXBlIiBzdHJpbmcgKHN1Y2gg YXMgInNlcSIgb3IgInBrZXkiKS4gICAgVGhlIGZpZWxkIG5hbWUKICoJYW5kL29yIHR5cGUg Y2FuIGJlIE5VTEwgaWYgbm90IHJlbGV2YW50LgogKgogKglUaGUgcmVzdWx0IGlzIGEgcGFs bG9jJ2Qgc3RyaW5nLgogKgogKglUaGUgYmFzaWMgcmVzdWx0IHdlIHdhbnQgaXMgIm5hbWUx X25hbWUyX2xhYmVsIiwgb21pdHRpbmcgIl9uYW1lMiIgb3IKICoJIl9sYWJlbCIgd2hlbiB0 aG9zZSBwYXJhbWV0ZXJzIGFyZSBOVUxMLiAgSG93ZXZlciwgd2UgbXVzdCBnZW5lcmF0ZQog KglhIG5hbWUgd2l0aCBsZXNzIHRoYW4gTkFNRURBVEFMRU4gY2hhcmFjdGVycyEgIFNvLCB3 ZSB0cnVuY2F0ZSBvbmUgb3IKICoJYm90aCBuYW1lcyBpZiBuZWNlc3NhcnkgdG8gbWFrZSBh IHNob3J0LWVub3VnaCBzdHJpbmcuICBUaGUgbGFiZWwgcGFydAogKglpcyBuZXZlciB0cnVu Y2F0ZWQgKHNvIGl0IGhhZCBiZXR0ZXIgYmUgcmVhc29uYWJseSBzaG9ydCkuCiAqCiAqCVRo ZSBjYWxsZXIgaXMgcmVzcG9uc2libGUgZm9yIGNoZWNraW5nIHVuaXF1ZW5lc3Mgb2YgdGhl IGdlbmVyYXRlZAogKgluYW1lIGFuZCByZXRyeWluZyBhcyBuZWVkZWQ7IHJldHJ5aW5nIHdp bGwgYmUgZG9uZSBieSBhbHRlcmluZyB0aGUKICoJImxhYmVsIiBzdHJpbmcgKHdoaWNoIGlz IHdoeSB3ZSBuZXZlciB0cnVuY2F0ZSB0aGF0IHBhcnQpLgogKi8KY2hhciAqCm1ha2VPYmpl Y3ROYW1lKGNvbnN0IGNoYXIgKm5hbWUxLCBjb25zdCBjaGFyICpuYW1lMiwgY29uc3QgY2hh ciAqbGFiZWwpCnsKCWNoYXIJICAgKm5hbWU7CglpbnQJCQlvdmVyaGVhZCA9IDA7CS8qIGNo YXJzIG5lZWRlZCBmb3IgbGFiZWwgYW5kIHVuZGVyc2NvcmVzICovCglpbnQJCQlhdmFpbGNo YXJzOwkJLyogY2hhcnMgYXZhaWxhYmxlIGZvciBuYW1lKHMpICovCglpbnQJCQluYW1lMWNo YXJzOwkJLyogY2hhcnMgYWxsb2NhdGVkIHRvIG5hbWUxICovCglpbnQJCQluYW1lMmNoYXJz OwkJLyogY2hhcnMgYWxsb2NhdGVkIHRvIG5hbWUyICovCglpbnQJCQluZHg7CgoJbmFtZTFj aGFycyA9IHN0cmxlbihuYW1lMSk7CglpZiAobmFtZTIpCgl7CgkJbmFtZTJjaGFycyA9IHN0 cmxlbihuYW1lMik7CgkJb3ZlcmhlYWQrKzsJCQkJLyogYWxsb3cgZm9yIHNlcGFyYXRpbmcg dW5kZXJzY29yZSAqLwoJfQoJZWxzZQoJCW5hbWUyY2hhcnMgPSAwOwoJaWYgKGxhYmVsKQoJ CW92ZXJoZWFkICs9IHN0cmxlbihsYWJlbCkgKyAxOwoKCWF2YWlsY2hhcnMgPSBOQU1FREFU QUxFTiAtIDEgLSBvdmVyaGVhZDsKCUFzc2VydChhdmFpbGNoYXJzID4gMCk7CQkvKiBlbHNl IGNhbGxlciBjaG9zZSBhIGJhZCBsYWJlbCAqLwoKCS8qCgkgKiBJZiB3ZSBtdXN0IHRydW5j YXRlLCBwcmVmZXJlbnRpYWxseSB0cnVuY2F0ZSB0aGUgbG9uZ2VyIG5hbWUuIFRoaXMKCSAq IGxvZ2ljIGNvdWxkIGJlIGV4cHJlc3NlZCB3aXRob3V0IGEgbG9vcCwgYnV0IGl0J3Mgc2lt cGxlIGFuZCBvYnZpb3VzIGFzCgkgKiBhIGxvb3AuCgkgKi8KCXdoaWxlIChuYW1lMWNoYXJz ICsgbmFtZTJjaGFycyA+IGF2YWlsY2hhcnMpCgl7CgkJaWYgKG5hbWUxY2hhcnMgPiBuYW1l MmNoYXJzKQoJCQluYW1lMWNoYXJzLS07CgkJZWxzZQoJCQluYW1lMmNoYXJzLS07Cgl9CgoJ bmFtZTFjaGFycyA9IHBnX21iY2xpcGxlbihuYW1lMSwgbmFtZTFjaGFycywgbmFtZTFjaGFy cyk7CglpZiAobmFtZTIpCgkJbmFtZTJjaGFycyA9IHBnX21iY2xpcGxlbihuYW1lMiwgbmFt ZTJjaGFycywgbmFtZTJjaGFycyk7CgoJLyogTm93IGNvbnN0cnVjdCB0aGUgc3RyaW5nIHVz aW5nIHRoZSBjaG9zZW4gbGVuZ3RocyAqLwoJbmFtZSA9IHBhbGxvYyhuYW1lMWNoYXJzICsg bmFtZTJjaGFycyArIG92ZXJoZWFkICsgMSk7CgltZW1jcHkobmFtZSwgbmFtZTEsIG5hbWUx Y2hhcnMpOwoJbmR4ID0gbmFtZTFjaGFyczsKCWlmIChuYW1lMikKCXsKCQluYW1lW25keCsr XSA9ICdfJzsKCQltZW1jcHkobmFtZSArIG5keCwgbmFtZTIsIG5hbWUyY2hhcnMpOwoJCW5k eCArPSBuYW1lMmNoYXJzOwoJfQoJaWYgKGxhYmVsKQoJewoJCW5hbWVbbmR4KytdID0gJ18n OwoJCXN0cmNweShuYW1lICsgbmR4LCBsYWJlbCk7Cgl9CgllbHNlCgkJbmFtZVtuZHhdID0g J1wwJzsKCglyZXR1cm4gbmFtZTsKfQoKLyoKICogU2VsZWN0IGEgbm9uY29uZmxpY3Rpbmcg bmFtZSBmb3IgYSBuZXcgcmVsYXRpb24uICBUaGlzIGlzIG9yZGluYXJpbHkKICogdXNlZCB0 byBjaG9vc2UgaW5kZXggbmFtZXMgKHdoaWNoIGlzIHdoeSBpdCdzIGhlcmUpIGJ1dCBpdCBj YW4gYWxzbwogKiBiZSB1c2VkIGZvciBzZXF1ZW5jZXMsIG9yIGFueSBhdXRvZ2VuZXJhdGVk IHJlbGF0aW9uIGtpbmQuCiAqCiAqIG5hbWUxLCBuYW1lMiwgYW5kIGxhYmVsIGFyZSB1c2Vk IHRoZSBzYW1lIHdheSBhcyBmb3IgbWFrZU9iamVjdE5hbWUoKSwKICogZXhjZXB0IHRoYXQg dGhlIGxhYmVsIGNhbid0IGJlIE5VTEw7IGRpZ2l0cyB3aWxsIGJlIGFwcGVuZGVkIHRvIHRo ZSBsYWJlbAogKiBpZiBuZWVkZWQgdG8gY3JlYXRlIGEgbmFtZSB0aGF0IGlzIHVuaXF1ZSB3 aXRoaW4gdGhlIHNwZWNpZmllZCBuYW1lc3BhY2UuCiAqCiAqIElmIGlzY29uc3RyYWludCBp cyB0cnVlLCB3ZSBhbHNvIGF2b2lkIGNob29zaW5nIGEgbmFtZSBtYXRjaGluZyBhbnkKICog ZXhpc3RpbmcgY29uc3RyYWludCBpbiB0aGUgc2FtZSBuYW1lc3BhY2UuICAoVGhpcyBpcyBz dHJpY3RlciB0aGFuIHdoYXQKICogUG9zdGdyZXMgaXRzZWxmIHJlcXVpcmVzLCBidXQgdGhl IFNRTCBzdGFuZGFyZCBzYXlzIHRoYXQgY29uc3RyYWludCBuYW1lcwogKiBzaG91bGQgYmUg dW5pcXVlIHdpdGhpbiBzY2hlbWFzLCBzbyB3ZSBmb2xsb3cgdGhhdCBmb3IgYXV0b2dlbmVy YXRlZAogKiBjb25zdHJhaW50IG5hbWVzLikKICoKICogTm90ZTogaXQgaXMgdGhlb3JldGlj YWxseSBwb3NzaWJsZSB0byBnZXQgYSBjb2xsaXNpb24gYW55d2F5LCBpZiBzb21lb25lCiAq IGVsc2UgY2hvb3NlcyB0aGUgc2FtZSBuYW1lIGNvbmN1cnJlbnRseS4gIFdlIHNob3J0ZW4g dGhlIHJhY2UgY29uZGl0aW9uCiAqIHdpbmRvdyBieSBjaGVja2luZyBmb3IgY29uZmxpY3Rp bmcgcmVsYXRpb25zIHVzaW5nIFNuYXBzaG90RGlydHksIGJ1dAogKiB0aGF0IGRvZXNuJ3Qg Y2xvc2UgdGhlIHdpbmRvdyBlbnRpcmVseS4gIFRoaXMgaXMgZmFpcmx5IHVubGlrZWx5IHRv IGJlCiAqIGEgcHJvYmxlbSBpbiBwcmFjdGljZSwgZXNwZWNpYWxseSBpZiBvbmUgaXMgaG9s ZGluZyBhbiBleGNsdXNpdmUgbG9jayBvbgogKiB0aGUgcmVsYXRpb24gaWRlbnRpZmllZCBi eSBuYW1lMS4gIEhvd2V2ZXIsIGlmIGNob29zaW5nIG11bHRpcGxlIG5hbWVzCiAqIHdpdGhp biBhIHNpbmdsZSBjb21tYW5kLCB5b3UnZCBiZXR0ZXIgY3JlYXRlIHRoZSBuZXcgb2JqZWN0 IGFuZCBkbwogKiBDb21tYW5kQ291bnRlckluY3JlbWVudCBiZWZvcmUgY2hvb3NpbmcgdGhl IG5leHQgb25lIQogKgogKiBSZXR1cm5zIGEgcGFsbG9jJ2Qgc3RyaW5nLgogKi8KY2hhciAq CkNob29zZVJlbGF0aW9uTmFtZShjb25zdCBjaGFyICpuYW1lMSwgY29uc3QgY2hhciAqbmFt ZTIsCgkJCQkgICBjb25zdCBjaGFyICpsYWJlbCwgT2lkIG5hbWVzcGFjZWlkLAoJCQkJICAg Ym9vbCBpc2NvbnN0cmFpbnQpCnsKCWludAkJCXBhc3MgPSAwOwoJY2hhcgkgICAqcmVsbmFt ZSA9IE5VTEw7CgljaGFyCQltb2RsYWJlbFtOQU1FREFUQUxFTl07CglTbmFwc2hvdERhdGEg U25hcHNob3REaXJ0eTsKCVJlbGF0aW9uCXBnY2xhc3NyZWw7CgoJLyogcHJlcGFyZSB0byBz ZWFyY2ggcGdfY2xhc3Mgd2l0aCBhIGRpcnR5IHNuYXBzaG90ICovCglJbml0RGlydHlTbmFw c2hvdChTbmFwc2hvdERpcnR5KTsKCXBnY2xhc3NyZWwgPSB0YWJsZV9vcGVuKFJlbGF0aW9u UmVsYXRpb25JZCwgQWNjZXNzU2hhcmVMb2NrKTsKCgkvKiB0cnkgdGhlIHVubW9kaWZpZWQg bGFiZWwgZmlyc3QgKi8KCXN0cmxjcHkobW9kbGFiZWwsIGxhYmVsLCBzaXplb2YobW9kbGFi ZWwpKTsKCglmb3IgKDs7KQoJewoJCVNjYW5LZXlEYXRhIGtleVsyXTsKCQlTeXNTY2FuRGVz YyBzY2FuOwoJCWJvb2wJCWNvbGxpZGVzOwoKCQlyZWxuYW1lID0gbWFrZU9iamVjdE5hbWUo bmFtZTEsIG5hbWUyLCBtb2RsYWJlbCk7CgoJCS8qIGlzIHRoZXJlIGFueSBjb25mbGljdGlu ZyByZWxhdGlvbiBuYW1lPyAqLwoJCVNjYW5LZXlJbml0KCZrZXlbMF0sCgkJCQkJQW51bV9w Z19jbGFzc19yZWxuYW1lLAoJCQkJCUJURXF1YWxTdHJhdGVneU51bWJlciwgRl9OQU1FRVEs CgkJCQkJQ1N0cmluZ0dldERhdHVtKHJlbG5hbWUpKTsKCQlTY2FuS2V5SW5pdCgma2V5WzFd LAoJCQkJCUFudW1fcGdfY2xhc3NfcmVsbmFtZXNwYWNlLAoJCQkJCUJURXF1YWxTdHJhdGVn eU51bWJlciwgRl9PSURFUSwKCQkJCQlPYmplY3RJZEdldERhdHVtKG5hbWVzcGFjZWlkKSk7 CgoJCXNjYW4gPSBzeXN0YWJsZV9iZWdpbnNjYW4ocGdjbGFzc3JlbCwgQ2xhc3NOYW1lTnNw SW5kZXhJZCwKCQkJCQkJCQkgIHRydWUgLyogaW5kZXhPSyAqLyAsCgkJCQkJCQkJICAmU25h cHNob3REaXJ0eSwKCQkJCQkJCQkgIDIsIGtleSk7CgoJCWNvbGxpZGVzID0gSGVhcFR1cGxl SXNWYWxpZChzeXN0YWJsZV9nZXRuZXh0KHNjYW4pKTsKCgkJc3lzdGFibGVfZW5kc2Nhbihz Y2FuKTsKCgkJLyogYnJlYWsgb3V0IG9mIGxvb3AgaWYgbm8gY29uZmxpY3QgKi8KCQlpZiAo IWNvbGxpZGVzKQoJCXsKCQkJaWYgKCFpc2NvbnN0cmFpbnQgfHwKCQkJCSFDb25zdHJhaW50 TmFtZUV4aXN0cyhyZWxuYW1lLCBuYW1lc3BhY2VpZCkpCgkJCQlicmVhazsKCQl9CgoJCS8q IGZvdW5kIGEgY29uZmxpY3QsIHNvIHRyeSBhIG5ldyBuYW1lIGNvbXBvbmVudCAqLwoJCXBm cmVlKHJlbG5hbWUpOwoJCXNucHJpbnRmKG1vZGxhYmVsLCBzaXplb2YobW9kbGFiZWwpLCAi JXMlZCIsIGxhYmVsLCArK3Bhc3MpOwoJfQoKCXRhYmxlX2Nsb3NlKHBnY2xhc3NyZWwsIEFj Y2Vzc1NoYXJlTG9jayk7CgoJcmV0dXJuIHJlbG5hbWU7Cn0KCi8qCiAqIFNlbGVjdCB0aGUg bmFtZSB0byBiZSB1c2VkIGZvciBhbiBpbmRleC4KICoKICogVGhlIGFyZ3VtZW50IGxpc3Qg aXMgcHJldHR5IGFkLWhvYyA6LSgKICovCnN0YXRpYyBjaGFyICoKQ2hvb3NlSW5kZXhOYW1l KGNvbnN0IGNoYXIgKnRhYm5hbWUsIE9pZCBuYW1lc3BhY2VJZCwKCQkJCWNvbnN0IExpc3Qg KmNvbG5hbWVzLCBjb25zdCBMaXN0ICpleGNsdXNpb25PcE5hbWVzLAoJCQkJYm9vbCBwcmlt YXJ5LCBib29sIGlzY29uc3RyYWludCkKewoJY2hhcgkgICAqaW5kZXhuYW1lOwoKCWlmIChw cmltYXJ5KQoJewoJCS8qIHRoZSBwcmltYXJ5IGtleSdzIG5hbWUgZG9lcyBub3QgZGVwZW5k IG9uIHRoZSBzcGVjaWZpYyBjb2x1bW4ocykgKi8KCQlpbmRleG5hbWUgPSBDaG9vc2VSZWxh dGlvbk5hbWUodGFibmFtZSwKCQkJCQkJCQkJICAgTlVMTCwKCQkJCQkJCQkJICAgInBrZXki LAoJCQkJCQkJCQkgICBuYW1lc3BhY2VJZCwKCQkJCQkJCQkJICAgdHJ1ZSk7Cgl9CgllbHNl IGlmIChleGNsdXNpb25PcE5hbWVzICE9IE5JTCkKCXsKCQlpbmRleG5hbWUgPSBDaG9vc2VS ZWxhdGlvbk5hbWUodGFibmFtZSwKCQkJCQkJCQkJICAgQ2hvb3NlSW5kZXhOYW1lQWRkaXRp b24oY29sbmFtZXMpLAoJCQkJCQkJCQkgICAiZXhjbCIsCgkJCQkJCQkJCSAgIG5hbWVzcGFj ZUlkLAoJCQkJCQkJCQkgICB0cnVlKTsKCX0KCWVsc2UgaWYgKGlzY29uc3RyYWludCkKCXsK CQlpbmRleG5hbWUgPSBDaG9vc2VSZWxhdGlvbk5hbWUodGFibmFtZSwKCQkJCQkJCQkJICAg Q2hvb3NlSW5kZXhOYW1lQWRkaXRpb24oY29sbmFtZXMpLAoJCQkJCQkJCQkgICAia2V5IiwK CQkJCQkJCQkJICAgbmFtZXNwYWNlSWQsCgkJCQkJCQkJCSAgIHRydWUpOwoJfQoJZWxzZQoJ ewoJCWluZGV4bmFtZSA9IENob29zZVJlbGF0aW9uTmFtZSh0YWJuYW1lLAoJCQkJCQkJCQkg ICBDaG9vc2VJbmRleE5hbWVBZGRpdGlvbihjb2xuYW1lcyksCgkJCQkJCQkJCSAgICJpZHgi LAoJCQkJCQkJCQkgICBuYW1lc3BhY2VJZCwKCQkJCQkJCQkJICAgZmFsc2UpOwoJfQoKCXJl dHVybiBpbmRleG5hbWU7Cn0KCi8qCiAqIEdlbmVyYXRlICJuYW1lMiIgZm9yIGEgbmV3IGlu ZGV4IGdpdmVuIHRoZSBsaXN0IG9mIGNvbHVtbiBuYW1lcyBmb3IgaXQKICogKGFzIHByb2R1 Y2VkIGJ5IENob29zZUluZGV4Q29sdW1uTmFtZXMpLiAgVGhpcyB3aWxsIGJlIHBhc3NlZCB0 bwogKiBDaG9vc2VSZWxhdGlvbk5hbWUgYWxvbmcgd2l0aCB0aGUgcGFyZW50IHRhYmxlIG5h bWUgYW5kIGEgc3VpdGFibGUgbGFiZWwuCiAqCiAqIFdlIGtub3cgdGhhdCBsZXNzIHRoYW4g TkFNRURBVEFMRU4gY2hhcmFjdGVycyB3aWxsIGFjdHVhbGx5IGJlIHVzZWQsCiAqIHNvIHdl IGNhbiB0cnVuY2F0ZSB0aGUgcmVzdWx0IG9uY2Ugd2UndmUgZ2VuZXJhdGVkIHRoYXQgbWFu eS4KICoKICogWFhYIFNlZSBhbHNvIENob29zZUZvcmVpZ25LZXlDb25zdHJhaW50TmFtZUFk ZGl0aW9uIGFuZAogKiBDaG9vc2VFeHRlbmRlZFN0YXRpc3RpY05hbWVBZGRpdGlvbi4KICov CnN0YXRpYyBjaGFyICoKQ2hvb3NlSW5kZXhOYW1lQWRkaXRpb24oY29uc3QgTGlzdCAqY29s bmFtZXMpCnsKCWNoYXIJCWJ1ZltOQU1FREFUQUxFTiAqIDJdOwoJaW50CQkJYnVmbGVuID0g MDsKCUxpc3RDZWxsICAgKmxjOwoKCWJ1ZlswXSA9ICdcMCc7Cglmb3JlYWNoKGxjLCBjb2xu YW1lcykKCXsKCQljb25zdCBjaGFyICpuYW1lID0gKGNvbnN0IGNoYXIgKikgbGZpcnN0KGxj KTsKCgkJaWYgKGJ1ZmxlbiA+IDApCgkJCWJ1ZltidWZsZW4rK10gPSAnXyc7CS8qIGluc2Vy dCBfIGJldHdlZW4gbmFtZXMgKi8KCgkJLyoKCQkgKiBBdCB0aGlzIHBvaW50IHdlIGhhdmUg YnVmbGVuIDw9IE5BTUVEQVRBTEVOLiAgbmFtZSBzaG91bGQgYmUgbGVzcwoJCSAqIHRoYW4g TkFNRURBVEFMRU4gYWxyZWFkeSwgYnV0IHVzZSBzdHJsY3B5IGZvciBwYXJhbm9pYS4KCQkg Ki8KCQlzdHJsY3B5KGJ1ZiArIGJ1ZmxlbiwgbmFtZSwgTkFNRURBVEFMRU4pOwoJCWJ1Zmxl biArPSBzdHJsZW4oYnVmICsgYnVmbGVuKTsKCQlpZiAoYnVmbGVuID49IE5BTUVEQVRBTEVO KQoJCQlicmVhazsKCX0KCXJldHVybiBwc3RyZHVwKGJ1Zik7Cn0KCi8qCiAqIFNlbGVjdCB0 aGUgYWN0dWFsIG5hbWVzIHRvIGJlIHVzZWQgZm9yIHRoZSBjb2x1bW5zIG9mIGFuIGluZGV4 LCBnaXZlbiB0aGUKICogbGlzdCBvZiBJbmRleEVsZW1zIGZvciB0aGUgY29sdW1ucy4gIFRo aXMgaXMgbW9zdGx5IGFib3V0IGVuc3VyaW5nIHRoZQogKiBuYW1lcyBhcmUgdW5pcXVlIHNv IHdlIGRvbid0IGdldCBhIGNvbmZsaWN0aW5nLWF0dHJpYnV0ZS1uYW1lcyBlcnJvci4KICoK ICogUmV0dXJucyBhIExpc3Qgb2YgcGxhaW4gc3RyaW5ncyAoY2hhciAqLCBub3QgU3RyaW5n IG5vZGVzKS4KICovCnN0YXRpYyBMaXN0ICoKQ2hvb3NlSW5kZXhDb2x1bW5OYW1lcyhjb25z dCBMaXN0ICppbmRleEVsZW1zKQp7CglMaXN0CSAgICpyZXN1bHQgPSBOSUw7CglMaXN0Q2Vs bCAgICpsYzsKCglmb3JlYWNoKGxjLCBpbmRleEVsZW1zKQoJewoJCUluZGV4RWxlbSAgKmll bGVtID0gKEluZGV4RWxlbSAqKSBsZmlyc3QobGMpOwoJCWNvbnN0IGNoYXIgKm9yaWduYW1l OwoJCWNvbnN0IGNoYXIgKmN1cm5hbWU7CgkJaW50CQkJaTsKCQljaGFyCQlidWZbTkFNRURB VEFMRU5dOwoKCQkvKiBHZXQgdGhlIHByZWxpbWluYXJ5IG5hbWUgZnJvbSB0aGUgSW5kZXhF bGVtICovCgkJaWYgKGllbGVtLT5pbmRleGNvbG5hbWUpCgkJCW9yaWduYW1lID0gaWVsZW0t PmluZGV4Y29sbmFtZTsgLyogY2FsbGVyLXNwZWNpZmllZCBuYW1lICovCgkJZWxzZSBpZiAo aWVsZW0tPm5hbWUpCgkJCW9yaWduYW1lID0gaWVsZW0tPm5hbWU7IC8qIHNpbXBsZSBjb2x1 bW4gcmVmZXJlbmNlICovCgkJZWxzZQoJCQlvcmlnbmFtZSA9ICJleHByIjsJLyogZGVmYXVs dCBuYW1lIGZvciBleHByZXNzaW9uICovCgoJCS8qIElmIGl0IGNvbmZsaWN0cyB3aXRoIGFu eSBwcmV2aW91cyBjb2x1bW4sIHR3ZWFrIGl0ICovCgkJY3VybmFtZSA9IG9yaWduYW1lOwoJ CWZvciAoaSA9IDE7OyBpKyspCgkJewoJCQlMaXN0Q2VsbCAgICpsYzI7CgkJCWNoYXIJCW5i dWZbMzJdOwoJCQlpbnQJCQlubGVuOwoKCQkJZm9yZWFjaChsYzIsIHJlc3VsdCkKCQkJewoJ CQkJaWYgKHN0cmNtcChjdXJuYW1lLCAoY2hhciAqKSBsZmlyc3QobGMyKSkgPT0gMCkKCQkJ CQlicmVhazsKCQkJfQoJCQlpZiAobGMyID09IE5VTEwpCgkJCQlicmVhazsJCQkvKiBmb3Vu ZCBub25jb25mbGljdGluZyBuYW1lICovCgoJCQlzcHJpbnRmKG5idWYsICIlZCIsIGkpOwoK CQkJLyogRW5zdXJlIGdlbmVyYXRlZCBuYW1lcyBhcmUgc2hvcnRlciB0aGFuIE5BTUVEQVRB TEVOICovCgkJCW5sZW4gPSBwZ19tYmNsaXBsZW4ob3JpZ25hbWUsIHN0cmxlbihvcmlnbmFt ZSksCgkJCQkJCQkJTkFNRURBVEFMRU4gLSAxIC0gc3RybGVuKG5idWYpKTsKCQkJbWVtY3B5 KGJ1Ziwgb3JpZ25hbWUsIG5sZW4pOwoJCQlzdHJjcHkoYnVmICsgbmxlbiwgbmJ1Zik7CgkJ CWN1cm5hbWUgPSBidWY7CgkJfQoKCQkvKiBBbmQgYXR0YWNoIHRvIHRoZSByZXN1bHQgbGlz dCAqLwoJCXJlc3VsdCA9IGxhcHBlbmQocmVzdWx0LCBwc3RyZHVwKGN1cm5hbWUpKTsKCX0K CXJldHVybiByZXN1bHQ7Cn0KCi8qCiAqIEV4ZWNSZWluZGV4CiAqCiAqIFByaW1hcnkgZW50 cnkgcG9pbnQgZm9yIG1hbnVhbCBSRUlOREVYIGNvbW1hbmRzLiAgVGhpcyBpcyBtYWlubHkg YQogKiBwcmVwYXJhdGlvbiB3cmFwcGVyIGZvciB0aGUgcmVhbCBvcGVyYXRpb25zIHRoYXQg d2lsbCBoYXBwZW4gaW4KICogZWFjaCBzdWJyb3V0aW5lIG9mIFJFSU5ERVguCiAqLwp2b2lk CkV4ZWNSZWluZGV4KFBhcnNlU3RhdGUgKnBzdGF0ZSwgY29uc3QgUmVpbmRleFN0bXQgKnN0 bXQsIGJvb2wgaXNUb3BMZXZlbCkKewoJUmVpbmRleFBhcmFtcyBwYXJhbXMgPSB7MH07CglM aXN0Q2VsbCAgICpsYzsKCWJvb2wJCWNvbmN1cnJlbnRseSA9IGZhbHNlOwoJYm9vbAkJdmVy Ym9zZSA9IGZhbHNlOwoJY2hhcgkgICAqdGFibGVzcGFjZW5hbWUgPSBOVUxMOwoKCS8qIFBh cnNlIG9wdGlvbiBsaXN0ICovCglmb3JlYWNoKGxjLCBzdG10LT5wYXJhbXMpCgl7CgkJRGVm RWxlbSAgICAqb3B0ID0gKERlZkVsZW0gKikgbGZpcnN0KGxjKTsKCgkJaWYgKHN0cmNtcChv cHQtPmRlZm5hbWUsICJ2ZXJib3NlIikgPT0gMCkKCQkJdmVyYm9zZSA9IGRlZkdldEJvb2xl YW4ob3B0KTsKCQllbHNlIGlmIChzdHJjbXAob3B0LT5kZWZuYW1lLCAiY29uY3VycmVudGx5 IikgPT0gMCkKCQkJY29uY3VycmVudGx5ID0gZGVmR2V0Qm9vbGVhbihvcHQpOwoJCWVsc2Ug aWYgKHN0cmNtcChvcHQtPmRlZm5hbWUsICJ0YWJsZXNwYWNlIikgPT0gMCkKCQkJdGFibGVz cGFjZW5hbWUgPSBkZWZHZXRTdHJpbmcob3B0KTsKCQllbHNlCgkJCWVyZXBvcnQoRVJST1Is CgkJCQkJKGVycmNvZGUoRVJSQ09ERV9TWU5UQVhfRVJST1IpLAoJCQkJCSBlcnJtc2coInVu cmVjb2duaXplZCAlcyBvcHRpb24gXCIlc1wiIiwKCQkJCQkJCSJSRUlOREVYIiwgb3B0LT5k ZWZuYW1lKSwKCQkJCQkgcGFyc2VyX2VycnBvc2l0aW9uKHBzdGF0ZSwgb3B0LT5sb2NhdGlv bikpKTsKCX0KCglpZiAoY29uY3VycmVudGx5KQoJCVByZXZlbnRJblRyYW5zYWN0aW9uQmxv Y2soaXNUb3BMZXZlbCwKCQkJCQkJCQkgICJSRUlOREVYIENPTkNVUlJFTlRMWSIpOwoKCXBh cmFtcy5vcHRpb25zID0KCQkodmVyYm9zZSA/IFJFSU5ERVhPUFRfVkVSQk9TRSA6IDApIHwK CQkoY29uY3VycmVudGx5ID8gUkVJTkRFWE9QVF9DT05DVVJSRU5UTFkgOiAwKTsKCgkvKgoJ ICogQXNzaWduIHRoZSB0YWJsZXNwYWNlIE9JRCB0byBtb3ZlIGluZGV4ZXMgdG8sIHdpdGgg SW52YWxpZE9pZCB0byBkbwoJICogbm90aGluZy4KCSAqLwoJaWYgKHRhYmxlc3BhY2VuYW1l ICE9IE5VTEwpCgl7CgkJcGFyYW1zLnRhYmxlc3BhY2VPaWQgPSBnZXRfdGFibGVzcGFjZV9v aWQodGFibGVzcGFjZW5hbWUsIGZhbHNlKTsKCgkJLyogQ2hlY2sgcGVybWlzc2lvbnMgZXhj ZXB0IHdoZW4gbW92aW5nIHRvIGRhdGFiYXNlJ3MgZGVmYXVsdCAqLwoJCWlmIChPaWRJc1Zh bGlkKHBhcmFtcy50YWJsZXNwYWNlT2lkKSAmJgoJCQlwYXJhbXMudGFibGVzcGFjZU9pZCAh PSBNeURhdGFiYXNlVGFibGVTcGFjZSkKCQl7CgkJCUFjbFJlc3VsdAlhY2xyZXN1bHQ7CgoJ CQlhY2xyZXN1bHQgPSBvYmplY3RfYWNsY2hlY2soVGFibGVTcGFjZVJlbGF0aW9uSWQsIHBh cmFtcy50YWJsZXNwYWNlT2lkLAoJCQkJCQkJCQkJR2V0VXNlcklkKCksIEFDTF9DUkVBVEUp OwoJCQlpZiAoYWNscmVzdWx0ICE9IEFDTENIRUNLX09LKQoJCQkJYWNsY2hlY2tfZXJyb3Io YWNscmVzdWx0LCBPQkpFQ1RfVEFCTEVTUEFDRSwKCQkJCQkJCSAgIGdldF90YWJsZXNwYWNl X25hbWUocGFyYW1zLnRhYmxlc3BhY2VPaWQpKTsKCQl9Cgl9CgllbHNlCgkJcGFyYW1zLnRh Ymxlc3BhY2VPaWQgPSBJbnZhbGlkT2lkOwoKCXN3aXRjaCAoc3RtdC0+a2luZCkKCXsKCQlj YXNlIFJFSU5ERVhfT0JKRUNUX0lOREVYOgoJCQlSZWluZGV4SW5kZXgoc3RtdCwgJnBhcmFt cywgaXNUb3BMZXZlbCk7CgkJCWJyZWFrOwoJCWNhc2UgUkVJTkRFWF9PQkpFQ1RfVEFCTEU6 CgkJCVJlaW5kZXhUYWJsZShzdG10LCAmcGFyYW1zLCBpc1RvcExldmVsKTsKCQkJYnJlYWs7 CgkJY2FzZSBSRUlOREVYX09CSkVDVF9TQ0hFTUE6CgkJY2FzZSBSRUlOREVYX09CSkVDVF9T WVNURU06CgkJY2FzZSBSRUlOREVYX09CSkVDVF9EQVRBQkFTRToKCgkJCS8qCgkJCSAqIFRo aXMgY2Fubm90IHJ1biBpbnNpZGUgYSB1c2VyIHRyYW5zYWN0aW9uIGJsb2NrOyBpZiB3ZSB3 ZXJlCgkJCSAqIGluc2lkZSBhIHRyYW5zYWN0aW9uLCB0aGVuIGl0cyBjb21taXQtIGFuZAoJ CQkgKiBzdGFydC10cmFuc2FjdGlvbi1jb21tYW5kIGNhbGxzIHdvdWxkIG5vdCBoYXZlIHRo ZSBpbnRlbmRlZAoJCQkgKiBlZmZlY3QhCgkJCSAqLwoJCQlQcmV2ZW50SW5UcmFuc2FjdGlv bkJsb2NrKGlzVG9wTGV2ZWwsCgkJCQkJCQkJCSAgKHN0bXQtPmtpbmQgPT0gUkVJTkRFWF9P QkpFQ1RfU0NIRU1BKSA/ICJSRUlOREVYIFNDSEVNQSIgOgoJCQkJCQkJCQkgIChzdG10LT5r aW5kID09IFJFSU5ERVhfT0JKRUNUX1NZU1RFTSkgPyAiUkVJTkRFWCBTWVNURU0iIDoKCQkJ CQkJCQkJICAiUkVJTkRFWCBEQVRBQkFTRSIpOwoJCQlSZWluZGV4TXVsdGlwbGVUYWJsZXMo c3RtdCwgJnBhcmFtcyk7CgkJCWJyZWFrOwoJCWRlZmF1bHQ6CgkJCWVsb2coRVJST1IsICJ1 bnJlY29nbml6ZWQgb2JqZWN0IHR5cGU6ICVkIiwKCQkJCSAoaW50KSBzdG10LT5raW5kKTsK CQkJYnJlYWs7Cgl9Cn0KCi8qCiAqIFJlaW5kZXhJbmRleAogKgkJUmVjcmVhdGUgYSBzcGVj aWZpYyBpbmRleC4KICovCnN0YXRpYyB2b2lkClJlaW5kZXhJbmRleChjb25zdCBSZWluZGV4 U3RtdCAqc3RtdCwgY29uc3QgUmVpbmRleFBhcmFtcyAqcGFyYW1zLCBib29sIGlzVG9wTGV2 ZWwpCnsKCWNvbnN0IFJhbmdlVmFyICppbmRleFJlbGF0aW9uID0gc3RtdC0+cmVsYXRpb247 CglzdHJ1Y3QgUmVpbmRleEluZGV4Q2FsbGJhY2tTdGF0ZSBzdGF0ZTsKCU9pZAkJCWluZE9p ZDsKCWNoYXIJCXBlcnNpc3RlbmNlOwoJY2hhcgkJcmVsa2luZDsKCgkvKgoJICogRmluZCBh bmQgbG9jayBpbmRleCwgYW5kIGNoZWNrIHBlcm1pc3Npb25zIG9uIHRhYmxlOyB1c2UgY2Fs bGJhY2sgdG8KCSAqIG9idGFpbiBsb2NrIG9uIHRhYmxlIGZpcnN0LCB0byBhdm9pZCBkZWFk bG9jayBoYXphcmQuICBUaGUgbG9jayBsZXZlbAoJICogdXNlZCBoZXJlIG11c3QgbWF0Y2gg dGhlIGluZGV4IGxvY2sgb2J0YWluZWQgaW4gcmVpbmRleF9pbmRleCgpLgoJICoKCSAqIElm IGl0J3MgYSB0ZW1wb3JhcnkgaW5kZXgsIHdlIHdpbGwgcGVyZm9ybSBhIG5vbi1jb25jdXJy ZW50IHJlaW5kZXgsCgkgKiBldmVuIGlmIENPTkNVUlJFTlRMWSB3YXMgcmVxdWVzdGVkLiAg SW4gdGhhdCBjYXNlLCByZWluZGV4X2luZGV4KCkgd2lsbAoJICogdXBncmFkZSB0aGUgbG9j aywgYnV0IHRoYXQncyBPSywgYmVjYXVzZSBvdGhlciBzZXNzaW9ucyBjYW4ndCBob2xkCgkg KiBsb2NrcyBvbiBvdXIgdGVtcG9yYXJ5IHRhYmxlLgoJICovCglzdGF0ZS5wYXJhbXMgPSAq cGFyYW1zOwoJc3RhdGUubG9ja2VkX3RhYmxlX29pZCA9IEludmFsaWRPaWQ7CglpbmRPaWQg PSBSYW5nZVZhckdldFJlbGlkRXh0ZW5kZWQoaW5kZXhSZWxhdGlvbiwKCQkJCQkJCQkJICAo cGFyYW1zLT5vcHRpb25zICYgUkVJTkRFWE9QVF9DT05DVVJSRU5UTFkpICE9IDAgPwoJCQkJ CQkJCQkgIFNoYXJlVXBkYXRlRXhjbHVzaXZlTG9jayA6IEFjY2Vzc0V4Y2x1c2l2ZUxvY2ss CgkJCQkJCQkJCSAgMCwKCQkJCQkJCQkJICBSYW5nZVZhckNhbGxiYWNrRm9yUmVpbmRleElu ZGV4LAoJCQkJCQkJCQkgICZzdGF0ZSk7CgoJLyoKCSAqIE9idGFpbiB0aGUgY3VycmVudCBw ZXJzaXN0ZW5jZSBhbmQga2luZCBvZiB0aGUgZXhpc3RpbmcgaW5kZXguICBXZQoJICogYWxy ZWFkeSBob2xkIGEgbG9jayBvbiB0aGUgaW5kZXguCgkgKi8KCXBlcnNpc3RlbmNlID0gZ2V0 X3JlbF9wZXJzaXN0ZW5jZShpbmRPaWQpOwoJcmVsa2luZCA9IGdldF9yZWxfcmVsa2luZChp bmRPaWQpOwoKCWlmIChyZWxraW5kID09IFJFTEtJTkRfUEFSVElUSU9ORURfSU5ERVgpCgkJ UmVpbmRleFBhcnRpdGlvbnMoc3RtdCwgaW5kT2lkLCBwYXJhbXMsIGlzVG9wTGV2ZWwpOwoJ ZWxzZSBpZiAoKHBhcmFtcy0+b3B0aW9ucyAmIFJFSU5ERVhPUFRfQ09OQ1VSUkVOVExZKSAh PSAwICYmCgkJCSBwZXJzaXN0ZW5jZSAhPSBSRUxQRVJTSVNURU5DRV9URU1QKQoJCVJlaW5k ZXhSZWxhdGlvbkNvbmN1cnJlbnRseShzdG10LCBpbmRPaWQsIHBhcmFtcyk7CgllbHNlCgl7 CgkJUmVpbmRleFBhcmFtcyBuZXdwYXJhbXMgPSAqcGFyYW1zOwoKCQluZXdwYXJhbXMub3B0 aW9ucyB8PSBSRUlOREVYT1BUX1JFUE9SVF9QUk9HUkVTUzsKCQlyZWluZGV4X2luZGV4KHN0 bXQsIGluZE9pZCwgZmFsc2UsIHBlcnNpc3RlbmNlLCAmbmV3cGFyYW1zKTsKCX0KfQoKLyoK ICogQ2hlY2sgcGVybWlzc2lvbnMgb24gdGFibGUgYmVmb3JlIGFjcXVpcmluZyByZWxhdGlv biBsb2NrOyBhbHNvIGxvY2sKICogdGhlIGhlYXAgYmVmb3JlIHRoZSBSYW5nZVZhckdldFJl bGlkRXh0ZW5kZWQgdGFrZXMgdGhlIGluZGV4IGxvY2ssIHRvIGF2b2lkCiAqIGRlYWRsb2Nr cy4KICovCnN0YXRpYyB2b2lkClJhbmdlVmFyQ2FsbGJhY2tGb3JSZWluZGV4SW5kZXgoY29u c3QgUmFuZ2VWYXIgKnJlbGF0aW9uLAoJCQkJCQkJCU9pZCByZWxJZCwgT2lkIG9sZFJlbElk LCB2b2lkICphcmcpCnsKCWNoYXIJCXJlbGtpbmQ7CglzdHJ1Y3QgUmVpbmRleEluZGV4Q2Fs bGJhY2tTdGF0ZSAqc3RhdGUgPSBhcmc7CglMT0NLTU9ERQl0YWJsZV9sb2NrbW9kZTsKCU9p ZAkJCXRhYmxlX29pZDsKCUFjbFJlc3VsdAlhY2xyZXN1bHQ7CgoJLyoKCSAqIExvY2sgbGV2 ZWwgaGVyZSBzaG91bGQgbWF0Y2ggdGFibGUgbG9jayBpbiByZWluZGV4X2luZGV4KCkgZm9y CgkgKiBub24tY29uY3VycmVudCBjYXNlIGFuZCB0YWJsZSBsb2NrcyB1c2VkIGJ5IGluZGV4 X2NvbmN1cnJlbnRseV8qKCkgZm9yCgkgKiBjb25jdXJyZW50IGNhc2UuCgkgKi8KCXRhYmxl X2xvY2ttb2RlID0gKHN0YXRlLT5wYXJhbXMub3B0aW9ucyAmIFJFSU5ERVhPUFRfQ09OQ1VS UkVOVExZKSAhPSAwID8KCQlTaGFyZVVwZGF0ZUV4Y2x1c2l2ZUxvY2sgOiBTaGFyZUxvY2s7 CgoJLyoKCSAqIElmIHdlIHByZXZpb3VzbHkgbG9ja2VkIHNvbWUgb3RoZXIgaW5kZXgncyBo ZWFwLCBhbmQgdGhlIG5hbWUgd2UncmUKCSAqIGxvb2tpbmcgdXAgbm8gbG9uZ2VyIHJlZmVy cyB0byB0aGF0IHJlbGF0aW9uLCByZWxlYXNlIHRoZSBub3ctdXNlbGVzcwoJICogbG9jay4K CSAqLwoJaWYgKHJlbElkICE9IG9sZFJlbElkICYmIE9pZElzVmFsaWQob2xkUmVsSWQpKQoJ ewoJCVVubG9ja1JlbGF0aW9uT2lkKHN0YXRlLT5sb2NrZWRfdGFibGVfb2lkLCB0YWJsZV9s b2NrbW9kZSk7CgkJc3RhdGUtPmxvY2tlZF90YWJsZV9vaWQgPSBJbnZhbGlkT2lkOwoJfQoK CS8qIElmIHRoZSByZWxhdGlvbiBkb2VzIG5vdCBleGlzdCwgdGhlcmUncyBub3RoaW5nIG1v cmUgdG8gZG8uICovCglpZiAoIU9pZElzVmFsaWQocmVsSWQpKQoJCXJldHVybjsKCgkvKiBJ ZiB0aGUgcmVsYXRpb24gZG9lcyBleGlzdCwgY2hlY2sgd2hldGhlciBpdCdzIGFuIGluZGV4 LiAqLwoJcmVsa2luZCA9IGdldF9yZWxfcmVsa2luZChyZWxJZCk7CglpZiAocmVsa2luZCAh PSBSRUxLSU5EX0lOREVYICYmCgkJcmVsa2luZCAhPSBSRUxLSU5EX1BBUlRJVElPTkVEX0lO REVYKQoJCWVyZXBvcnQoRVJST1IsCgkJCQkoZXJyY29kZShFUlJDT0RFX1dST05HX09CSkVD VF9UWVBFKSwKCQkJCSBlcnJtc2coIlwiJXNcIiBpcyBub3QgYW4gaW5kZXgiLCByZWxhdGlv bi0+cmVsbmFtZSkpKTsKCgkvKiBMb29rIHVwIHRoZSBpbmRleCdzIHRhYmxlLiAqLwoJdGFi bGVfb2lkID0gSW5kZXhHZXRSZWxhdGlvbihyZWxJZCwgZmFsc2UpOwoKCS8qCgkgKiBJbiB0 aGUgdW5saWtlbHkgZXZlbnQgdGhhdCwgdXBvbiByZXRyeSwgd2UgZ2V0IHRoZSBzYW1lIGlu ZGV4IE9JRCB3aXRoCgkgKiBhIGRpZmZlcmVudCB0YWJsZSBPSUQsIGZhaWwuICBSYW5nZVZh ckdldFJlbGlkRXh0ZW5kZWQoKSB3aWxsIGhhdmUKCSAqIGFscmVhZHkgbG9ja2VkIHRoZSBp bmRleCBpbiB0aGlzIGNhc2UsIGFuZCBpdCB3b24ndCByZXRyeSBhZ2Fpbiwgc28gd2UKCSAq IGNhbid0IGxvY2sgdGhlIG5ld2x5IGRpc2NvdmVyZWQgdGFibGUgT0lEIHdpdGhvdXQgcmlz a2luZyBkZWFkbG9jay4KCSAqIEFsc28sIHdoaWxlIHRoaXMgY29ybmVyIGNhc2UgaXMgaW5k ZWVkIHBvc3NpYmxlLCBpdCBpcyBleHRyZW1lbHkKCSAqIHVubGlrZWx5IHRvIGhhcHBlbiBp biBwcmFjdGljZSwgc28gaXQncyBwcm9iYWJseSBub3Qgd29ydGggYW55IG1vcmUKCSAqIGVm Zm9ydCB0aGFuIHRoaXMuCgkgKi8KCWlmIChyZWxJZCA9PSBvbGRSZWxJZCAmJiB0YWJsZV9v aWQgIT0gc3RhdGUtPmxvY2tlZF90YWJsZV9vaWQpCgkJZXJlcG9ydChFUlJPUiwKCQkJCShl cnJjb2RlKEVSUkNPREVfVU5ERUZJTkVEX09CSkVDVCksCgkJCQkgZXJybXNnKCJpbmRleCBc IiVzXCIgd2FzIGNvbmN1cnJlbnRseSBkcm9wcGVkIiwKCQkJCQkJcmVsYXRpb24tPnJlbG5h bWUpKSk7CgoJLyogQ2hlY2sgcGVybWlzc2lvbnMuICovCglhY2xyZXN1bHQgPSBwZ19jbGFz c19hY2xjaGVjayh0YWJsZV9vaWQsIEdldFVzZXJJZCgpLCBBQ0xfTUFJTlRBSU4pOwoJaWYg KGFjbHJlc3VsdCAhPSBBQ0xDSEVDS19PSykKCQlhY2xjaGVja19lcnJvcihhY2xyZXN1bHQs IE9CSkVDVF9JTkRFWCwgcmVsYXRpb24tPnJlbG5hbWUpOwoKCS8qIExvY2sgaGVhcCBiZWZv cmUgaW5kZXggdG8gYXZvaWQgZGVhZGxvY2suICovCglpZiAocmVsSWQgIT0gb2xkUmVsSWQp Cgl7CgkJTG9ja1JlbGF0aW9uT2lkKHRhYmxlX29pZCwgdGFibGVfbG9ja21vZGUpOwoJCXN0 YXRlLT5sb2NrZWRfdGFibGVfb2lkID0gdGFibGVfb2lkOwoJfQp9CgovKgogKiBSZWluZGV4 VGFibGUKICoJCVJlY3JlYXRlIGFsbCBpbmRleGVzIG9mIGEgdGFibGUgKGFuZCBvZiBpdHMg dG9hc3QgdGFibGUsIGlmIGFueSkKICovCnN0YXRpYyBPaWQKUmVpbmRleFRhYmxlKGNvbnN0 IFJlaW5kZXhTdG10ICpzdG10LCBjb25zdCBSZWluZGV4UGFyYW1zICpwYXJhbXMsIGJvb2wg aXNUb3BMZXZlbCkKewoJT2lkCQkJaGVhcE9pZDsKCWJvb2wJCXJlc3VsdDsKCWNvbnN0IFJh bmdlVmFyICpyZWxhdGlvbiA9IHN0bXQtPnJlbGF0aW9uOwoKCS8qCgkgKiBUaGUgbG9jayBs ZXZlbCB1c2VkIGhlcmUgc2hvdWxkIG1hdGNoIHJlaW5kZXhfcmVsYXRpb24oKS4KCSAqCgkg KiBJZiBpdCdzIGEgdGVtcG9yYXJ5IHRhYmxlLCB3ZSB3aWxsIHBlcmZvcm0gYSBub24tY29u Y3VycmVudCByZWluZGV4LAoJICogZXZlbiBpZiBDT05DVVJSRU5UTFkgd2FzIHJlcXVlc3Rl ZC4gIEluIHRoYXQgY2FzZSwgcmVpbmRleF9yZWxhdGlvbigpCgkgKiB3aWxsIHVwZ3JhZGUg dGhlIGxvY2ssIGJ1dCB0aGF0J3MgT0ssIGJlY2F1c2Ugb3RoZXIgc2Vzc2lvbnMgY2FuJ3Qg aG9sZAoJICogbG9ja3Mgb24gb3VyIHRlbXBvcmFyeSB0YWJsZS4KCSAqLwoJaGVhcE9pZCA9 IFJhbmdlVmFyR2V0UmVsaWRFeHRlbmRlZChyZWxhdGlvbiwKCQkJCQkJCQkJICAgKHBhcmFt cy0+b3B0aW9ucyAmIFJFSU5ERVhPUFRfQ09OQ1VSUkVOVExZKSAhPSAwID8KCQkJCQkJCQkJ ICAgU2hhcmVVcGRhdGVFeGNsdXNpdmVMb2NrIDogU2hhcmVMb2NrLAoJCQkJCQkJCQkgICAw LAoJCQkJCQkJCQkgICBSYW5nZVZhckNhbGxiYWNrTWFpbnRhaW5zVGFibGUsIE5VTEwpOwoK CWlmIChnZXRfcmVsX3JlbGtpbmQoaGVhcE9pZCkgPT0gUkVMS0lORF9QQVJUSVRJT05FRF9U QUJMRSkKCQlSZWluZGV4UGFydGl0aW9ucyhzdG10LCBoZWFwT2lkLCBwYXJhbXMsIGlzVG9w TGV2ZWwpOwoJZWxzZSBpZiAoKHBhcmFtcy0+b3B0aW9ucyAmIFJFSU5ERVhPUFRfQ09OQ1VS UkVOVExZKSAhPSAwICYmCgkJCSBnZXRfcmVsX3BlcnNpc3RlbmNlKGhlYXBPaWQpICE9IFJF TFBFUlNJU1RFTkNFX1RFTVApCgl7CgkJcmVzdWx0ID0gUmVpbmRleFJlbGF0aW9uQ29uY3Vy cmVudGx5KHN0bXQsIGhlYXBPaWQsIHBhcmFtcyk7CgoJCWlmICghcmVzdWx0KQoJCQllcmVw b3J0KE5PVElDRSwKCQkJCQkoZXJybXNnKCJ0YWJsZSBcIiVzXCIgaGFzIG5vIGluZGV4ZXMg dGhhdCBjYW4gYmUgcmVpbmRleGVkIGNvbmN1cnJlbnRseSIsCgkJCQkJCQlyZWxhdGlvbi0+ cmVsbmFtZSkpKTsKCX0KCWVsc2UKCXsKCQlSZWluZGV4UGFyYW1zIG5ld3BhcmFtcyA9ICpw YXJhbXM7CgoJCW5ld3BhcmFtcy5vcHRpb25zIHw9IFJFSU5ERVhPUFRfUkVQT1JUX1BST0dS RVNTOwoJCXJlc3VsdCA9IHJlaW5kZXhfcmVsYXRpb24oc3RtdCwgaGVhcE9pZCwKCQkJCQkJ CQkgIFJFSU5ERVhfUkVMX1BST0NFU1NfVE9BU1QgfAoJCQkJCQkJCSAgUkVJTkRFWF9SRUxf Q0hFQ0tfQ09OU1RSQUlOVFMsCgkJCQkJCQkJICAmbmV3cGFyYW1zKTsKCQlpZiAoIXJlc3Vs dCkKCQkJZXJlcG9ydChOT1RJQ0UsCgkJCQkJKGVycm1zZygidGFibGUgXCIlc1wiIGhhcyBu byBpbmRleGVzIHRvIHJlaW5kZXgiLAoJCQkJCQkJcmVsYXRpb24tPnJlbG5hbWUpKSk7Cgl9 CgoJcmV0dXJuIGhlYXBPaWQ7Cn0KCi8qCiAqIFJlaW5kZXhNdWx0aXBsZVRhYmxlcwogKgkJ UmVjcmVhdGUgaW5kZXhlcyBvZiB0YWJsZXMgc2VsZWN0ZWQgYnkgb2JqZWN0TmFtZS9vYmpl Y3RLaW5kLgogKgogKiBUbyByZWR1Y2UgdGhlIHByb2JhYmlsaXR5IG9mIGRlYWRsb2Nrcywg ZWFjaCB0YWJsZSBpcyByZWluZGV4ZWQgaW4gYQogKiBzZXBhcmF0ZSB0cmFuc2FjdGlvbiwg c28gd2UgY2FuIHJlbGVhc2UgdGhlIGxvY2sgb24gaXQgcmlnaHQgYXdheS4KICogVGhhdCBt ZWFucyB0aGlzIG11c3Qgbm90IGJlIGNhbGxlZCB3aXRoaW4gYSB1c2VyIHRyYW5zYWN0aW9u IGJsb2NrIQogKi8Kc3RhdGljIHZvaWQKUmVpbmRleE11bHRpcGxlVGFibGVzKGNvbnN0IFJl aW5kZXhTdG10ICpzdG10LCBjb25zdCBSZWluZGV4UGFyYW1zICpwYXJhbXMpCnsKCglPaWQJ CQlvYmplY3RPaWQ7CglSZWxhdGlvbglyZWxhdGlvblJlbGF0aW9uOwoJVGFibGVTY2FuRGVz YyBzY2FuOwoJU2NhbktleURhdGEgc2Nhbl9rZXlzWzFdOwoJSGVhcFR1cGxlCXR1cGxlOwoJ TWVtb3J5Q29udGV4dCBwcml2YXRlX2NvbnRleHQ7CglNZW1vcnlDb250ZXh0IG9sZDsKCUxp c3QJICAgKnJlbGlkcyA9IE5JTDsKCWludAkJCW51bV9rZXlzOwoJYm9vbAkJY29uY3VycmVu dF93YXJuaW5nID0gZmFsc2U7Cglib29sCQl0YWJsZXNwYWNlX3dhcm5pbmcgPSBmYWxzZTsK CWNvbnN0IGNoYXIgKm9iamVjdE5hbWUgPSBzdG10LT5uYW1lOwoJY29uc3QgUmVpbmRleE9i amVjdFR5cGUgb2JqZWN0S2luZCA9IHN0bXQtPmtpbmQ7CgoJQXNzZXJ0KG9iamVjdEtpbmQg PT0gUkVJTkRFWF9PQkpFQ1RfU0NIRU1BIHx8CgkJICAgb2JqZWN0S2luZCA9PSBSRUlOREVY X09CSkVDVF9TWVNURU0gfHwKCQkgICBvYmplY3RLaW5kID09IFJFSU5ERVhfT0JKRUNUX0RB VEFCQVNFKTsKCgkvKgoJICogVGhpcyBtYXRjaGVzIHRoZSBvcHRpb25zIGVuZm9yY2VkIGJ5 IHRoZSBncmFtbWFyLCB3aGVyZSB0aGUgb2JqZWN0IG5hbWUKCSAqIGlzIG9wdGlvbmFsIGZv ciBEQVRBQkFTRSBhbmQgU1lTVEVNLgoJICovCglBc3NlcnQob2JqZWN0TmFtZSB8fCBvYmpl Y3RLaW5kICE9IFJFSU5ERVhfT0JKRUNUX1NDSEVNQSk7CgoJaWYgKG9iamVjdEtpbmQgPT0g UkVJTkRFWF9PQkpFQ1RfU1lTVEVNICYmCgkJKHBhcmFtcy0+b3B0aW9ucyAmIFJFSU5ERVhP UFRfQ09OQ1VSUkVOVExZKSAhPSAwKQoJCWVyZXBvcnQoRVJST1IsCgkJCQkoZXJyY29kZShF UlJDT0RFX0ZFQVRVUkVfTk9UX1NVUFBPUlRFRCksCgkJCQkgZXJybXNnKCJjYW5ub3QgcmVp bmRleCBzeXN0ZW0gY2F0YWxvZ3MgY29uY3VycmVudGx5IikpKTsKCgkvKgoJICogR2V0IE9J RCBvZiBvYmplY3QgdG8gcmVpbmRleCwgYmVpbmcgdGhlIGRhdGFiYXNlIGN1cnJlbnRseSBi ZWluZyB1c2VkCgkgKiBieSBzZXNzaW9uIGZvciBhIGRhdGFiYXNlIG9yIGZvciBzeXN0ZW0g Y2F0YWxvZ3MsIG9yIHRoZSBzY2hlbWEgZGVmaW5lZAoJICogYnkgY2FsbGVyLiBBdCB0aGUg c2FtZSB0aW1lIGRvIHBlcm1pc3Npb24gY2hlY2tzIHRoYXQgbmVlZCBkaWZmZXJlbnQKCSAq IHByb2Nlc3NpbmcgZGVwZW5kaW5nIG9uIHRoZSBvYmplY3QgdHlwZS4KCSAqLwoJaWYgKG9i amVjdEtpbmQgPT0gUkVJTkRFWF9PQkpFQ1RfU0NIRU1BKQoJewoJCW9iamVjdE9pZCA9IGdl dF9uYW1lc3BhY2Vfb2lkKG9iamVjdE5hbWUsIGZhbHNlKTsKCgkJaWYgKCFvYmplY3Rfb3du ZXJjaGVjayhOYW1lc3BhY2VSZWxhdGlvbklkLCBvYmplY3RPaWQsIEdldFVzZXJJZCgpKSAm JgoJCQkhaGFzX3ByaXZzX29mX3JvbGUoR2V0VXNlcklkKCksIFJPTEVfUEdfTUFJTlRBSU4p KQoJCQlhY2xjaGVja19lcnJvcihBQ0xDSEVDS19OT1RfT1dORVIsIE9CSkVDVF9TQ0hFTUEs CgkJCQkJCSAgIG9iamVjdE5hbWUpOwoJfQoJZWxzZQoJewoJCW9iamVjdE9pZCA9IE15RGF0 YWJhc2VJZDsKCgkJaWYgKG9iamVjdE5hbWUgJiYgc3RyY21wKG9iamVjdE5hbWUsIGdldF9k YXRhYmFzZV9uYW1lKG9iamVjdE9pZCkpICE9IDApCgkJCWVyZXBvcnQoRVJST1IsCgkJCQkJ KGVycmNvZGUoRVJSQ09ERV9GRUFUVVJFX05PVF9TVVBQT1JURUQpLAoJCQkJCSBlcnJtc2co ImNhbiBvbmx5IHJlaW5kZXggdGhlIGN1cnJlbnRseSBvcGVuIGRhdGFiYXNlIikpKTsKCQlp ZiAoIW9iamVjdF9vd25lcmNoZWNrKERhdGFiYXNlUmVsYXRpb25JZCwgb2JqZWN0T2lkLCBH ZXRVc2VySWQoKSkgJiYKCQkJIWhhc19wcml2c19vZl9yb2xlKEdldFVzZXJJZCgpLCBST0xF X1BHX01BSU5UQUlOKSkKCQkJYWNsY2hlY2tfZXJyb3IoQUNMQ0hFQ0tfTk9UX09XTkVSLCBP QkpFQ1RfREFUQUJBU0UsCgkJCQkJCSAgIGdldF9kYXRhYmFzZV9uYW1lKG9iamVjdE9pZCkp OwoJfQoKCS8qCgkgKiBDcmVhdGUgYSBtZW1vcnkgY29udGV4dCB0aGF0IHdpbGwgc3Vydml2 ZSBmb3JjZWQgdHJhbnNhY3Rpb24gY29tbWl0cyB3ZQoJICogZG8gYmVsb3cuICBTaW5jZSBp dCBpcyBhIGNoaWxkIG9mIFBvcnRhbENvbnRleHQsIGl0IHdpbGwgZ28gYXdheQoJICogZXZl bnR1YWxseSBldmVuIGlmIHdlIHN1ZmZlciBhbiBlcnJvcjsgdGhlcmUncyBubyBuZWVkIGZv ciBzcGVjaWFsCgkgKiBhYm9ydCBjbGVhbnVwIGxvZ2ljLgoJICovCglwcml2YXRlX2NvbnRl eHQgPSBBbGxvY1NldENvbnRleHRDcmVhdGUoUG9ydGFsQ29udGV4dCwKCQkJCQkJCQkJCQki UmVpbmRleE11bHRpcGxlVGFibGVzIiwKCQkJCQkJCQkJCQlBTExPQ1NFVF9TTUFMTF9TSVpF Uyk7CgoJLyoKCSAqIERlZmluZSB0aGUgc2VhcmNoIGtleXMgdG8gZmluZCB0aGUgb2JqZWN0 cyB0byByZWluZGV4LiBGb3IgYSBzY2hlbWEsIHdlCgkgKiBzZWxlY3QgdGFyZ2V0IHJlbGF0 aW9ucyB1c2luZyByZWxuYW1lc3BhY2UsIHNvbWV0aGluZyBub3QgbmVjZXNzYXJ5IGZvcgoJ ICogYSBkYXRhYmFzZS13aWRlIG9wZXJhdGlvbi4KCSAqLwoJaWYgKG9iamVjdEtpbmQgPT0g UkVJTkRFWF9PQkpFQ1RfU0NIRU1BKQoJewoJCW51bV9rZXlzID0gMTsKCQlTY2FuS2V5SW5p dCgmc2Nhbl9rZXlzWzBdLAoJCQkJCUFudW1fcGdfY2xhc3NfcmVsbmFtZXNwYWNlLAoJCQkJ CUJURXF1YWxTdHJhdGVneU51bWJlciwgRl9PSURFUSwKCQkJCQlPYmplY3RJZEdldERhdHVt KG9iamVjdE9pZCkpOwoJfQoJZWxzZQoJCW51bV9rZXlzID0gMDsKCgkvKgoJICogU2NhbiBw Z19jbGFzcyB0byBidWlsZCBhIGxpc3Qgb2YgdGhlIHJlbGF0aW9ucyB3ZSBuZWVkIHRvIHJl aW5kZXguCgkgKgoJICogV2Ugb25seSBjb25zaWRlciBwbGFpbiByZWxhdGlvbnMgYW5kIG1h dGVyaWFsaXplZCB2aWV3cyBoZXJlICh0b2FzdAoJICogcmVscyB3aWxsIGJlIHByb2Nlc3Nl ZCBpbmRpcmVjdGx5IGJ5IHJlaW5kZXhfcmVsYXRpb24pLgoJICovCglyZWxhdGlvblJlbGF0 aW9uID0gdGFibGVfb3BlbihSZWxhdGlvblJlbGF0aW9uSWQsIEFjY2Vzc1NoYXJlTG9jayk7 CglzY2FuID0gdGFibGVfYmVnaW5zY2FuX2NhdGFsb2cocmVsYXRpb25SZWxhdGlvbiwgbnVt X2tleXMsIHNjYW5fa2V5cyk7Cgl3aGlsZSAoKHR1cGxlID0gaGVhcF9nZXRuZXh0KHNjYW4s IEZvcndhcmRTY2FuRGlyZWN0aW9uKSkgIT0gTlVMTCkKCXsKCQlGb3JtX3BnX2NsYXNzIGNs YXNzdHVwbGUgPSAoRm9ybV9wZ19jbGFzcykgR0VUU1RSVUNUKHR1cGxlKTsKCQlPaWQJCQly ZWxpZCA9IGNsYXNzdHVwbGUtPm9pZDsKCgkJLyoKCQkgKiBPbmx5IHJlZ3VsYXIgdGFibGVz IGFuZCBtYXR2aWV3cyBjYW4gaGF2ZSBpbmRleGVzLCBzbyBpZ25vcmUgYW55CgkJICogb3Ro ZXIga2luZCBvZiByZWxhdGlvbi4KCQkgKgoJCSAqIFBhcnRpdGlvbmVkIHRhYmxlcy9pbmRl eGVzIGFyZSBza2lwcGVkIGJ1dCBtYXRjaGluZyBsZWFmIHBhcnRpdGlvbnMKCQkgKiBhcmUg cHJvY2Vzc2VkLgoJCSAqLwoJCWlmIChjbGFzc3R1cGxlLT5yZWxraW5kICE9IFJFTEtJTkRf UkVMQVRJT04gJiYKCQkJY2xhc3N0dXBsZS0+cmVsa2luZCAhPSBSRUxLSU5EX01BVFZJRVcp CgkJCWNvbnRpbnVlOwoKCQkvKiBTa2lwIHRlbXAgdGFibGVzIG9mIG90aGVyIGJhY2tlbmRz OyB3ZSBjYW4ndCByZWluZGV4IHRoZW0gYXQgYWxsICovCgkJaWYgKGNsYXNzdHVwbGUtPnJl bHBlcnNpc3RlbmNlID09IFJFTFBFUlNJU1RFTkNFX1RFTVAgJiYKCQkJIWlzVGVtcE5hbWVz cGFjZShjbGFzc3R1cGxlLT5yZWxuYW1lc3BhY2UpKQoJCQljb250aW51ZTsKCgkJLyoKCQkg KiBDaGVjayB1c2VyL3N5c3RlbSBjbGFzc2lmaWNhdGlvbi4gIFNZU1RFTSBwcm9jZXNzZXMg YWxsIHRoZQoJCSAqIGNhdGFsb2dzLCBhbmQgREFUQUJBU0UgcHJvY2Vzc2VzIGV2ZXJ5dGhp bmcgdGhhdCdzIG5vdCBhIGNhdGFsb2cuCgkJICovCgkJaWYgKG9iamVjdEtpbmQgPT0gUkVJ TkRFWF9PQkpFQ1RfU1lTVEVNICYmCgkJCSFJc0NhdGFsb2dSZWxhdGlvbk9pZChyZWxpZCkp CgkJCWNvbnRpbnVlOwoJCWVsc2UgaWYgKG9iamVjdEtpbmQgPT0gUkVJTkRFWF9PQkpFQ1Rf REFUQUJBU0UgJiYKCQkJCSBJc0NhdGFsb2dSZWxhdGlvbk9pZChyZWxpZCkpCgkJCWNvbnRp bnVlOwoKCQkvKgoJCSAqIFdlIGFscmVhZHkgY2hlY2tlZCBwcml2aWxlZ2VzIG9uIHRoZSBk YXRhYmFzZSBvciBzY2hlbWEsIGJ1dCB3ZQoJCSAqIGZ1cnRoZXIgcmVzdHJpY3QgcmVpbmRl eGluZyBzaGFyZWQgY2F0YWxvZ3MgdG8gcm9sZXMgd2l0aCB0aGUKCQkgKiBNQUlOVEFJTiBw cml2aWxlZ2Ugb24gdGhlIHJlbGF0aW9uLgoJCSAqLwoJCWlmIChjbGFzc3R1cGxlLT5yZWxp c3NoYXJlZCAmJgoJCQlwZ19jbGFzc19hY2xjaGVjayhyZWxpZCwgR2V0VXNlcklkKCksIEFD TF9NQUlOVEFJTikgIT0gQUNMQ0hFQ0tfT0spCgkJCWNvbnRpbnVlOwoKCQkvKgoJCSAqIFNr aXAgc3lzdGVtIHRhYmxlcywgc2luY2UgaW5kZXhfY3JlYXRlKCkgd291bGQgcmVqZWN0IGlu ZGV4aW5nIHRoZW0KCQkgKiBjb25jdXJyZW50bHkgKGFuZCBpdCB3b3VsZCBsaWtlbHkgZmFp bCBpZiB3ZSB0cmllZCkuCgkJICovCgkJaWYgKChwYXJhbXMtPm9wdGlvbnMgJiBSRUlOREVY T1BUX0NPTkNVUlJFTlRMWSkgIT0gMCAmJgoJCQlJc0NhdGFsb2dSZWxhdGlvbk9pZChyZWxp ZCkpCgkJewoJCQlpZiAoIWNvbmN1cnJlbnRfd2FybmluZykKCQkJCWVyZXBvcnQoV0FSTklO RywKCQkJCQkJKGVycmNvZGUoRVJSQ09ERV9GRUFUVVJFX05PVF9TVVBQT1JURUQpLAoJCQkJ CQkgZXJybXNnKCJjYW5ub3QgcmVpbmRleCBzeXN0ZW0gY2F0YWxvZ3MgY29uY3VycmVudGx5 LCBza2lwcGluZyBhbGwiKSkpOwoJCQljb25jdXJyZW50X3dhcm5pbmcgPSB0cnVlOwoJCQlj b250aW51ZTsKCQl9CgoJCS8qCgkJICogSWYgYSBuZXcgdGFibGVzcGFjZSBpcyBzZXQsIGNo ZWNrIGlmIHRoaXMgcmVsYXRpb24gaGFzIHRvIGJlCgkJICogc2tpcHBlZC4KCQkgKi8KCQlp ZiAoT2lkSXNWYWxpZChwYXJhbXMtPnRhYmxlc3BhY2VPaWQpKQoJCXsKCQkJYm9vbAkJc2tp cF9yZWwgPSBmYWxzZTsKCgkJCS8qCgkJCSAqIE1hcHBlZCByZWxhdGlvbnMgY2Fubm90IGJl IG1vdmVkIHRvIGRpZmZlcmVudCB0YWJsZXNwYWNlcyAoaW4KCQkJICogcGFydGljdWxhciB0 aGlzIGVsaW1pbmF0ZXMgYWxsIHNoYXJlZCBjYXRhbG9ncy4pLgoJCQkgKi8KCQkJaWYgKFJF TEtJTkRfSEFTX1NUT1JBR0UoY2xhc3N0dXBsZS0+cmVsa2luZCkgJiYKCQkJCSFSZWxGaWxl TnVtYmVySXNWYWxpZChjbGFzc3R1cGxlLT5yZWxmaWxlbm9kZSkpCgkJCQlza2lwX3JlbCA9 IHRydWU7CgoJCQkvKgoJCQkgKiBBIHN5c3RlbSByZWxhdGlvbiBpcyBhbHdheXMgc2tpcHBl ZCwgZXZlbiB3aXRoCgkJCSAqIGFsbG93X3N5c3RlbV90YWJsZV9tb2RzIGVuYWJsZWQuCgkJ CSAqLwoJCQlpZiAoSXNTeXN0ZW1DbGFzcyhyZWxpZCwgY2xhc3N0dXBsZSkpCgkJCQlza2lw X3JlbCA9IHRydWU7CgoJCQlpZiAoc2tpcF9yZWwpCgkJCXsKCQkJCWlmICghdGFibGVzcGFj ZV93YXJuaW5nKQoJCQkJCWVyZXBvcnQoV0FSTklORywKCQkJCQkJCShlcnJjb2RlKEVSUkNP REVfSU5TVUZGSUNJRU5UX1BSSVZJTEVHRSksCgkJCQkJCQkgZXJybXNnKCJjYW5ub3QgbW92 ZSBzeXN0ZW0gcmVsYXRpb25zLCBza2lwcGluZyBhbGwiKSkpOwoJCQkJdGFibGVzcGFjZV93 YXJuaW5nID0gdHJ1ZTsKCQkJCWNvbnRpbnVlOwoJCQl9CgkJfQoKCQkvKiBTYXZlIHRoZSBs aXN0IG9mIHJlbGF0aW9uIE9JRHMgaW4gcHJpdmF0ZSBjb250ZXh0ICovCgkJb2xkID0gTWVt b3J5Q29udGV4dFN3aXRjaFRvKHByaXZhdGVfY29udGV4dCk7CgoJCS8qCgkJICogV2UgYWx3 YXlzIHdhbnQgdG8gcmVpbmRleCBwZ19jbGFzcyBmaXJzdCBpZiBpdCdzIHNlbGVjdGVkIHRv IGJlCgkJICogcmVpbmRleGVkLiAgVGhpcyBlbnN1cmVzIHRoYXQgaWYgdGhlcmUgaXMgYW55 IGNvcnJ1cHRpb24gaW4KCQkgKiBwZ19jbGFzcycgaW5kZXhlcywgdGhleSB3aWxsIGJlIGZp eGVkIGJlZm9yZSB3ZSBwcm9jZXNzIGFueSBvdGhlcgoJCSAqIHRhYmxlcy4gIFRoaXMgaXMg Y3JpdGljYWwgYmVjYXVzZSByZWluZGV4aW5nIGl0c2VsZiB3aWxsIHRyeSB0bwoJCSAqIHVw ZGF0ZSBwZ19jbGFzcy4KCQkgKi8KCQlpZiAocmVsaWQgPT0gUmVsYXRpb25SZWxhdGlvbklk KQoJCQlyZWxpZHMgPSBsY29uc19vaWQocmVsaWQsIHJlbGlkcyk7CgkJZWxzZQoJCQlyZWxp ZHMgPSBsYXBwZW5kX29pZChyZWxpZHMsIHJlbGlkKTsKCgkJTWVtb3J5Q29udGV4dFN3aXRj aFRvKG9sZCk7Cgl9Cgl0YWJsZV9lbmRzY2FuKHNjYW4pOwoJdGFibGVfY2xvc2UocmVsYXRp b25SZWxhdGlvbiwgQWNjZXNzU2hhcmVMb2NrKTsKCgkvKgoJICogUHJvY2VzcyBlYWNoIHJl bGF0aW9uIGxpc3RlZCBpbiBhIHNlcGFyYXRlIHRyYW5zYWN0aW9uLiAgTm90ZSB0aGF0IHRo aXMKCSAqIGNvbW1pdHMgYW5kIHRoZW4gc3RhcnRzIGEgbmV3IHRyYW5zYWN0aW9uIGltbWVk aWF0ZWx5LgoJICovCglSZWluZGV4TXVsdGlwbGVJbnRlcm5hbChzdG10LCByZWxpZHMsIHBh cmFtcyk7CgoJTWVtb3J5Q29udGV4dERlbGV0ZShwcml2YXRlX2NvbnRleHQpOwp9CgovKgog KiBFcnJvciBjYWxsYmFjayBzcGVjaWZpYyB0byBSZWluZGV4UGFydGl0aW9ucygpLgogKi8K c3RhdGljIHZvaWQKcmVpbmRleF9lcnJvcl9jYWxsYmFjayh2b2lkICphcmcpCnsKCVJlaW5k ZXhFcnJvckluZm8gKmVycmluZm8gPSAoUmVpbmRleEVycm9ySW5mbyAqKSBhcmc7CgoJQXNz ZXJ0KFJFTEtJTkRfSEFTX1BBUlRJVElPTlMoZXJyaW5mby0+cmVsa2luZCkpOwoKCWlmIChl cnJpbmZvLT5yZWxraW5kID09IFJFTEtJTkRfUEFSVElUSU9ORURfVEFCTEUpCgkJZXJyY29u dGV4dCgid2hpbGUgcmVpbmRleGluZyBwYXJ0aXRpb25lZCB0YWJsZSBcIiVzLiVzXCIiLAoJ CQkJICAgZXJyaW5mby0+cmVsbmFtZXNwYWNlLCBlcnJpbmZvLT5yZWxuYW1lKTsKCWVsc2Ug aWYgKGVycmluZm8tPnJlbGtpbmQgPT0gUkVMS0lORF9QQVJUSVRJT05FRF9JTkRFWCkKCQll cnJjb250ZXh0KCJ3aGlsZSByZWluZGV4aW5nIHBhcnRpdGlvbmVkIGluZGV4IFwiJXMuJXNc IiIsCgkJCQkgICBlcnJpbmZvLT5yZWxuYW1lc3BhY2UsIGVycmluZm8tPnJlbG5hbWUpOwp9 CgovKgogKiBSZWluZGV4UGFydGl0aW9ucwogKgogKiBSZWluZGV4IGEgc2V0IG9mIHBhcnRp dGlvbnMsIHBlciB0aGUgcGFydGl0aW9uZWQgaW5kZXggb3IgdGFibGUgZ2l2ZW4KICogYnkg dGhlIGNhbGxlci4KICovCnN0YXRpYyB2b2lkClJlaW5kZXhQYXJ0aXRpb25zKGNvbnN0IFJl aW5kZXhTdG10ICpzdG10LCBPaWQgcmVsaWQsIGNvbnN0IFJlaW5kZXhQYXJhbXMgKnBhcmFt cywgYm9vbCBpc1RvcExldmVsKQp7CglMaXN0CSAgICpwYXJ0aXRpb25zID0gTklMOwoJY2hh cgkJcmVsa2luZCA9IGdldF9yZWxfcmVsa2luZChyZWxpZCk7CgljaGFyCSAgICpyZWxuYW1l ID0gZ2V0X3JlbF9uYW1lKHJlbGlkKTsKCWNoYXIJICAgKnJlbG5hbWVzcGFjZSA9IGdldF9u YW1lc3BhY2VfbmFtZShnZXRfcmVsX25hbWVzcGFjZShyZWxpZCkpOwoJTWVtb3J5Q29udGV4 dCByZWluZGV4X2NvbnRleHQ7CglMaXN0CSAgICppbmhvaWRzOwoJTGlzdENlbGwgICAqbGM7 CglFcnJvckNvbnRleHRDYWxsYmFjayBlcnJjYWxsYmFjazsKCVJlaW5kZXhFcnJvckluZm8g ZXJyaW5mbzsKCglBc3NlcnQoUkVMS0lORF9IQVNfUEFSVElUSU9OUyhyZWxraW5kKSk7CgoJ LyoKCSAqIENoZWNrIGlmIHRoaXMgcnVucyBpbiBhIHRyYW5zYWN0aW9uIGJsb2NrLCB3aXRo IGFuIGVycm9yIGNhbGxiYWNrIHRvCgkgKiBwcm92aWRlIG1vcmUgY29udGV4dCB1bmRlciB3 aGljaCBhIHByb2JsZW0gaGFwcGVucy4KCSAqLwoJZXJyaW5mby5yZWxuYW1lID0gcHN0cmR1 cChyZWxuYW1lKTsKCWVycmluZm8ucmVsbmFtZXNwYWNlID0gcHN0cmR1cChyZWxuYW1lc3Bh Y2UpOwoJZXJyaW5mby5yZWxraW5kID0gcmVsa2luZDsKCWVycmNhbGxiYWNrLmNhbGxiYWNr ID0gcmVpbmRleF9lcnJvcl9jYWxsYmFjazsKCWVycmNhbGxiYWNrLmFyZyA9ICZlcnJpbmZv OwoJZXJyY2FsbGJhY2sucHJldmlvdXMgPSBlcnJvcl9jb250ZXh0X3N0YWNrOwoJZXJyb3Jf Y29udGV4dF9zdGFjayA9ICZlcnJjYWxsYmFjazsKCglQcmV2ZW50SW5UcmFuc2FjdGlvbkJs b2NrKGlzVG9wTGV2ZWwsCgkJCQkJCQkgIHJlbGtpbmQgPT0gUkVMS0lORF9QQVJUSVRJT05F RF9UQUJMRSA/CgkJCQkJCQkgICJSRUlOREVYIFRBQkxFIiA6ICJSRUlOREVYIElOREVYIik7 CgoJLyogUG9wIHRoZSBlcnJvciBjb250ZXh0IHN0YWNrICovCgllcnJvcl9jb250ZXh0X3N0 YWNrID0gZXJyY2FsbGJhY2sucHJldmlvdXM7CgoJLyoKCSAqIENyZWF0ZSBzcGVjaWFsIG1l bW9yeSBjb250ZXh0IGZvciBjcm9zcy10cmFuc2FjdGlvbiBzdG9yYWdlLgoJICoKCSAqIFNp bmNlIGl0IGlzIGEgY2hpbGQgb2YgUG9ydGFsQ29udGV4dCwgaXQgd2lsbCBnbyBhd2F5IGV2 ZW50dWFsbHkgZXZlbgoJICogaWYgd2Ugc3VmZmVyIGFuIGVycm9yIHNvIHRoZXJlIGlzIG5v IG5lZWQgZm9yIHNwZWNpYWwgYWJvcnQgY2xlYW51cAoJICogbG9naWMuCgkgKi8KCXJlaW5k ZXhfY29udGV4dCA9IEFsbG9jU2V0Q29udGV4dENyZWF0ZShQb3J0YWxDb250ZXh0LCAiUmVp bmRleCIsCgkJCQkJCQkJCQkJQUxMT0NTRVRfREVGQVVMVF9TSVpFUyk7CgoJLyogU2hhcmVM b2NrIGlzIGVub3VnaCB0byBwcmV2ZW50IHNjaGVtYSBtb2RpZmljYXRpb25zICovCglpbmhv aWRzID0gZmluZF9hbGxfaW5oZXJpdG9ycyhyZWxpZCwgU2hhcmVMb2NrLCBOVUxMKTsKCgkv KgoJICogVGhlIGxpc3Qgb2YgcmVsYXRpb25zIHRvIHJlaW5kZXggYXJlIHRoZSBwaHlzaWNh bCBwYXJ0aXRpb25zIG9mIHRoZQoJICogdHJlZSBzbyBkaXNjYXJkIGFueSBwYXJ0aXRpb25l ZCB0YWJsZSBvciBpbmRleC4KCSAqLwoJZm9yZWFjaChsYywgaW5ob2lkcykKCXsKCQlPaWQJ CQlwYXJ0b2lkID0gbGZpcnN0X29pZChsYyk7CgkJY2hhcgkJcGFydGtpbmQgPSBnZXRfcmVs X3JlbGtpbmQocGFydG9pZCk7CgkJTWVtb3J5Q29udGV4dCBvbGRfY29udGV4dDsKCgkJLyoK CQkgKiBUaGlzIGRpc2NhcmRzIHBhcnRpdGlvbmVkIHRhYmxlcywgcGFydGl0aW9uZWQgaW5k ZXhlcyBhbmQgZm9yZWlnbgoJCSAqIHRhYmxlcy4KCQkgKi8KCQlpZiAoIVJFTEtJTkRfSEFT X1NUT1JBR0UocGFydGtpbmQpKQoJCQljb250aW51ZTsKCgkJQXNzZXJ0KHBhcnRraW5kID09 IFJFTEtJTkRfSU5ERVggfHwKCQkJICAgcGFydGtpbmQgPT0gUkVMS0lORF9SRUxBVElPTik7 CgoJCS8qIFNhdmUgcGFydGl0aW9uIE9JRCAqLwoJCW9sZF9jb250ZXh0ID0gTWVtb3J5Q29u dGV4dFN3aXRjaFRvKHJlaW5kZXhfY29udGV4dCk7CgkJcGFydGl0aW9ucyA9IGxhcHBlbmRf b2lkKHBhcnRpdGlvbnMsIHBhcnRvaWQpOwoJCU1lbW9yeUNvbnRleHRTd2l0Y2hUbyhvbGRf Y29udGV4dCk7Cgl9CgoJLyoKCSAqIFByb2Nlc3MgZWFjaCBwYXJ0aXRpb24gbGlzdGVkIGlu IGEgc2VwYXJhdGUgdHJhbnNhY3Rpb24uICBOb3RlIHRoYXQKCSAqIHRoaXMgY29tbWl0cyBh bmQgdGhlbiBzdGFydHMgYSBuZXcgdHJhbnNhY3Rpb24gaW1tZWRpYXRlbHkuCgkgKi8KCVJl aW5kZXhNdWx0aXBsZUludGVybmFsKHN0bXQsIHBhcnRpdGlvbnMsIHBhcmFtcyk7CgoJLyoK CSAqIENsZWFuIHVwIHdvcmtpbmcgc3RvcmFnZSAtLS0gbm90ZSB3ZSBtdXN0IGRvIHRoaXMg YWZ0ZXIKCSAqIFN0YXJ0VHJhbnNhY3Rpb25Db21tYW5kLCBlbHNlIHdlIG1pZ2h0IGJlIHRy eWluZyB0byBkZWxldGUgdGhlIGFjdGl2ZQoJICogY29udGV4dCEKCSAqLwoJTWVtb3J5Q29u dGV4dERlbGV0ZShyZWluZGV4X2NvbnRleHQpOwp9CgovKgogKiBSZWluZGV4TXVsdGlwbGVJ bnRlcm5hbAogKgogKiBSZWluZGV4IGEgbGlzdCBvZiByZWxhdGlvbnMsIGVhY2ggb25lIGJl aW5nIHByb2Nlc3NlZCBpbiBpdHMgb3duCiAqIHRyYW5zYWN0aW9uLiAgVGhpcyBjb21taXRz IHRoZSBleGlzdGluZyB0cmFuc2FjdGlvbiBpbW1lZGlhdGVseSwKICogYW5kIHN0YXJ0cyBh IG5ldyB0cmFuc2FjdGlvbiB3aGVuIGZpbmlzaGVkLgogKi8Kc3RhdGljIHZvaWQKUmVpbmRl eE11bHRpcGxlSW50ZXJuYWwoY29uc3QgUmVpbmRleFN0bXQgKnN0bXQsIGNvbnN0IExpc3Qg KnJlbGlkcywgY29uc3QgUmVpbmRleFBhcmFtcyAqcGFyYW1zKQp7CglMaXN0Q2VsbCAgICps OwoKCVBvcEFjdGl2ZVNuYXBzaG90KCk7CglDb21taXRUcmFuc2FjdGlvbkNvbW1hbmQoKTsK Cglmb3JlYWNoKGwsIHJlbGlkcykKCXsKCQlPaWQJCQlyZWxpZCA9IGxmaXJzdF9vaWQobCk7 CgkJY2hhcgkJcmVsa2luZDsKCQljaGFyCQlyZWxwZXJzaXN0ZW5jZTsKCgkJU3RhcnRUcmFu c2FjdGlvbkNvbW1hbmQoKTsKCgkJLyogZnVuY3Rpb25zIGluIGluZGV4ZXMgbWF5IHdhbnQg YSBzbmFwc2hvdCBzZXQgKi8KCQlQdXNoQWN0aXZlU25hcHNob3QoR2V0VHJhbnNhY3Rpb25T bmFwc2hvdCgpKTsKCgkJLyogY2hlY2sgaWYgdGhlIHJlbGF0aW9uIHN0aWxsIGV4aXN0cyAq LwoJCWlmICghU2VhcmNoU3lzQ2FjaGVFeGlzdHMxKFJFTE9JRCwgT2JqZWN0SWRHZXREYXR1 bShyZWxpZCkpKQoJCXsKCQkJUG9wQWN0aXZlU25hcHNob3QoKTsKCQkJQ29tbWl0VHJhbnNh Y3Rpb25Db21tYW5kKCk7CgkJCWNvbnRpbnVlOwoJCX0KCgkJLyoKCQkgKiBDaGVjayBwZXJt aXNzaW9ucyBleGNlcHQgd2hlbiBtb3ZpbmcgdG8gZGF0YWJhc2UncyBkZWZhdWx0IGlmIGEg bmV3CgkJICogdGFibGVzcGFjZSBpcyBjaG9zZW4uICBOb3RlIHRoYXQgdGhpcyBjaGVjayBh bHNvIGhhcHBlbnMgaW4KCQkgKiBFeGVjUmVpbmRleCgpLCBidXQgd2UgZG8gYW4gZXh0cmEg Y2hlY2sgaGVyZSBhcyB0aGlzIHJ1bnMgYWNyb3NzCgkJICogbXVsdGlwbGUgdHJhbnNhY3Rp b25zLgoJCSAqLwoJCWlmIChPaWRJc1ZhbGlkKHBhcmFtcy0+dGFibGVzcGFjZU9pZCkgJiYK CQkJcGFyYW1zLT50YWJsZXNwYWNlT2lkICE9IE15RGF0YWJhc2VUYWJsZVNwYWNlKQoJCXsK CQkJQWNsUmVzdWx0CWFjbHJlc3VsdDsKCgkJCWFjbHJlc3VsdCA9IG9iamVjdF9hY2xjaGVj ayhUYWJsZVNwYWNlUmVsYXRpb25JZCwgcGFyYW1zLT50YWJsZXNwYWNlT2lkLAoJCQkJCQkJ CQkJR2V0VXNlcklkKCksIEFDTF9DUkVBVEUpOwoJCQlpZiAoYWNscmVzdWx0ICE9IEFDTENI RUNLX09LKQoJCQkJYWNsY2hlY2tfZXJyb3IoYWNscmVzdWx0LCBPQkpFQ1RfVEFCTEVTUEFD RSwKCQkJCQkJCSAgIGdldF90YWJsZXNwYWNlX25hbWUocGFyYW1zLT50YWJsZXNwYWNlT2lk KSk7CgkJfQoKCQlyZWxraW5kID0gZ2V0X3JlbF9yZWxraW5kKHJlbGlkKTsKCQlyZWxwZXJz aXN0ZW5jZSA9IGdldF9yZWxfcGVyc2lzdGVuY2UocmVsaWQpOwoKCQkvKgoJCSAqIFBhcnRp dGlvbmVkIHRhYmxlcyBhbmQgaW5kZXhlcyBjYW4gbmV2ZXIgYmUgcHJvY2Vzc2VkIGRpcmVj dGx5LCBhbmQKCQkgKiBhIGxpc3Qgb2YgdGhlaXIgbGVhdmVzIHNob3VsZCBiZSBidWlsdCBm aXJzdC4KCQkgKi8KCQlBc3NlcnQoIVJFTEtJTkRfSEFTX1BBUlRJVElPTlMocmVsa2luZCkp OwoKCQlpZiAoKHBhcmFtcy0+b3B0aW9ucyAmIFJFSU5ERVhPUFRfQ09OQ1VSUkVOVExZKSAh PSAwICYmCgkJCXJlbHBlcnNpc3RlbmNlICE9IFJFTFBFUlNJU1RFTkNFX1RFTVApCgkJewoJ CQlSZWluZGV4UGFyYW1zIG5ld3BhcmFtcyA9ICpwYXJhbXM7CgoJCQluZXdwYXJhbXMub3B0 aW9ucyB8PSBSRUlOREVYT1BUX01JU1NJTkdfT0s7CgkJCSh2b2lkKSBSZWluZGV4UmVsYXRp b25Db25jdXJyZW50bHkoc3RtdCwgcmVsaWQsICZuZXdwYXJhbXMpOwoJCQlpZiAoQWN0aXZl U25hcHNob3RTZXQoKSkKCQkJCVBvcEFjdGl2ZVNuYXBzaG90KCk7CgkJCS8qIFJlaW5kZXhS ZWxhdGlvbkNvbmN1cnJlbnRseSgpIGRvZXMgdGhlIHZlcmJvc2Ugb3V0cHV0ICovCgkJfQoJ CWVsc2UgaWYgKHJlbGtpbmQgPT0gUkVMS0lORF9JTkRFWCkKCQl7CgkJCVJlaW5kZXhQYXJh bXMgbmV3cGFyYW1zID0gKnBhcmFtczsKCgkJCW5ld3BhcmFtcy5vcHRpb25zIHw9CgkJCQlS RUlOREVYT1BUX1JFUE9SVF9QUk9HUkVTUyB8IFJFSU5ERVhPUFRfTUlTU0lOR19PSzsKCQkJ cmVpbmRleF9pbmRleChzdG10LCByZWxpZCwgZmFsc2UsIHJlbHBlcnNpc3RlbmNlLCAmbmV3 cGFyYW1zKTsKCQkJUG9wQWN0aXZlU25hcHNob3QoKTsKCQkJLyogcmVpbmRleF9pbmRleCgp IGRvZXMgdGhlIHZlcmJvc2Ugb3V0cHV0ICovCgkJfQoJCWVsc2UKCQl7CgkJCWJvb2wJCXJl c3VsdDsKCQkJUmVpbmRleFBhcmFtcyBuZXdwYXJhbXMgPSAqcGFyYW1zOwoKCQkJbmV3cGFy YW1zLm9wdGlvbnMgfD0KCQkJCVJFSU5ERVhPUFRfUkVQT1JUX1BST0dSRVNTIHwgUkVJTkRF WE9QVF9NSVNTSU5HX09LOwoJCQlyZXN1bHQgPSByZWluZGV4X3JlbGF0aW9uKHN0bXQsIHJl bGlkLAoJCQkJCQkJCQkgIFJFSU5ERVhfUkVMX1BST0NFU1NfVE9BU1QgfAoJCQkJCQkJCQkg IFJFSU5ERVhfUkVMX0NIRUNLX0NPTlNUUkFJTlRTLAoJCQkJCQkJCQkgICZuZXdwYXJhbXMp OwoKCQkJaWYgKHJlc3VsdCAmJiAocGFyYW1zLT5vcHRpb25zICYgUkVJTkRFWE9QVF9WRVJC T1NFKSAhPSAwKQoJCQkJZXJlcG9ydChJTkZPLAoJCQkJCQkoZXJybXNnKCJ0YWJsZSBcIiVz LiVzXCIgd2FzIHJlaW5kZXhlZCIsCgkJCQkJCQkJZ2V0X25hbWVzcGFjZV9uYW1lKGdldF9y ZWxfbmFtZXNwYWNlKHJlbGlkKSksCgkJCQkJCQkJZ2V0X3JlbF9uYW1lKHJlbGlkKSkpKTsK CgkJCVBvcEFjdGl2ZVNuYXBzaG90KCk7CgkJfQoKCQlDb21taXRUcmFuc2FjdGlvbkNvbW1h bmQoKTsKCX0KCglTdGFydFRyYW5zYWN0aW9uQ29tbWFuZCgpOwp9CgoKLyoKICogUmVpbmRl eFJlbGF0aW9uQ29uY3VycmVudGx5IC0gcHJvY2VzcyBSRUlOREVYIENPTkNVUlJFTlRMWSBm b3IgZ2l2ZW4KICogcmVsYXRpb24gT0lECiAqCiAqICdyZWxhdGlvbk9pZCcgY2FuIGVpdGhl ciBiZWxvbmcgdG8gYW4gaW5kZXgsIGEgdGFibGUgb3IgYSBtYXRlcmlhbGl6ZWQKICogdmll dy4gIEZvciB0YWJsZXMgYW5kIG1hdGVyaWFsaXplZCB2aWV3cywgYWxsIGl0cyBpbmRleGVz IHdpbGwgYmUgcmVidWlsdCwKICogZXhjbHVkaW5nIGludmFsaWQgaW5kZXhlcyBhbmQgYW55 IGluZGV4ZXMgdXNlZCBpbiBleGNsdXNpb24gY29uc3RyYWludHMsCiAqIGJ1dCBpbmNsdWRp bmcgaXRzIGFzc29jaWF0ZWQgdG9hc3QgdGFibGUgaW5kZXhlcy4gIEZvciBpbmRleGVzLCB0 aGUgaW5kZXgKICogaXRzZWxmIHdpbGwgYmUgcmVidWlsdC4KICoKICogVGhlIGxvY2tzIHRh a2VuIG9uIHBhcmVudCB0YWJsZXMgYW5kIGludm9sdmVkIGluZGV4ZXMgYXJlIGtlcHQgdW50 aWwgdGhlCiAqIHRyYW5zYWN0aW9uIGlzIGNvbW1pdHRlZCwgYXQgd2hpY2ggcG9pbnQgYSBz ZXNzaW9uIGxvY2sgaXMgdGFrZW4gb24gZWFjaAogKiByZWxhdGlvbi4gIEJvdGggb2YgdGhl c2UgcHJvdGVjdCBhZ2FpbnN0IGNvbmN1cnJlbnQgc2NoZW1hIGNoYW5nZXMuCiAqCiAqIFJl dHVybnMgdHJ1ZSBpZiBhbnkgaW5kZXhlcyBoYXZlIGJlZW4gcmVidWlsdCAoaW5jbHVkaW5n IHRvYXN0IHRhYmxlJ3MKICogaW5kZXhlcywgd2hlbiByZWxldmFudCksIG90aGVyd2lzZSBy ZXR1cm5zIGZhbHNlLgogKgogKiBOT1RFOiBUaGlzIGNhbm5vdCBiZSB1c2VkIG9uIHRlbXBv cmFyeSByZWxhdGlvbnMuICBBIGNvbmN1cnJlbnQgYnVpbGQgd291bGQKICogY2F1c2UgaXNz dWVzIHdpdGggT04gQ09NTUlUIGFjdGlvbnMgdHJpZ2dlcmVkIGJ5IHRoZSB0cmFuc2FjdGlv bnMgb2YgdGhlCiAqIGNvbmN1cnJlbnQgYnVpbGQuICBUZW1wb3JhcnkgcmVsYXRpb25zIGFy ZSBub3Qgc3ViamVjdCB0byBjb25jdXJyZW50CiAqIGNvbmNlcm5zLCBzbyB0aGVyZSdzIG5v IG5lZWQgZm9yIHRoZSBtb3JlIGNvbXBsaWNhdGVkIGNvbmN1cnJlbnQgYnVpbGQsCiAqIGFu eXdheSwgYW5kIGEgbm9uLWNvbmN1cnJlbnQgcmVpbmRleCBpcyBtb3JlIGVmZmljaWVudC4K ICovCnN0YXRpYyBib29sClJlaW5kZXhSZWxhdGlvbkNvbmN1cnJlbnRseShjb25zdCBSZWlu ZGV4U3RtdCAqc3RtdCwgT2lkIHJlbGF0aW9uT2lkLCBjb25zdCBSZWluZGV4UGFyYW1zICpw YXJhbXMpCnsKCXR5cGVkZWYgc3RydWN0IFJlaW5kZXhJbmRleEluZm8KCXsKCQlPaWQJCQlp bmRleElkOwoJCU9pZAkJCXRhYmxlSWQ7CgkJT2lkCQkJYW1JZDsKCQlib29sCQlzYWZlOwkJ LyogZm9yIHNldF9pbmRleHNhZmVfcHJvY2ZsYWdzICovCgl9IFJlaW5kZXhJbmRleEluZm87 CglMaXN0CSAgICpoZWFwUmVsYXRpb25JZHMgPSBOSUw7CglMaXN0CSAgICppbmRleElkcyA9 IE5JTDsKCUxpc3QJICAgKm5ld0luZGV4SWRzID0gTklMOwoJTGlzdAkgICAqcmVsYXRpb25M b2NrcyA9IE5JTDsKCUxpc3QJICAgKmxvY2tUYWdzID0gTklMOwoJTGlzdENlbGwgICAqbGMs CgkJCSAgICpsYzI7CglNZW1vcnlDb250ZXh0IHByaXZhdGVfY29udGV4dDsKCU1lbW9yeUNv bnRleHQgb2xkY29udGV4dDsKCWNoYXIJCXJlbGtpbmQ7CgljaGFyCSAgICpyZWxhdGlvbk5h bWUgPSBOVUxMOwoJY2hhcgkgICAqcmVsYXRpb25OYW1lc3BhY2UgPSBOVUxMOwoJUEdSVXNh Z2UJcnUwOwoJY29uc3QgaW50CXByb2dyZXNzX2luZGV4W10gPSB7CgkJUFJPR1JFU1NfQ1JF QVRFSURYX0NPTU1BTkQsCgkJUFJPR1JFU1NfQ1JFQVRFSURYX1BIQVNFLAoJCVBST0dSRVNT X0NSRUFURUlEWF9JTkRFWF9PSUQsCgkJUFJPR1JFU1NfQ1JFQVRFSURYX0FDQ0VTU19NRVRI T0RfT0lECgl9OwoJaW50NjQJCXByb2dyZXNzX3ZhbHNbNF07CgoJLyoKCSAqIENyZWF0ZSBh IG1lbW9yeSBjb250ZXh0IHRoYXQgd2lsbCBzdXJ2aXZlIGZvcmNlZCB0cmFuc2FjdGlvbiBj b21taXRzIHdlCgkgKiBkbyBiZWxvdy4gIFNpbmNlIGl0IGlzIGEgY2hpbGQgb2YgUG9ydGFs Q29udGV4dCwgaXQgd2lsbCBnbyBhd2F5CgkgKiBldmVudHVhbGx5IGV2ZW4gaWYgd2Ugc3Vm ZmVyIGFuIGVycm9yOyB0aGVyZSdzIG5vIG5lZWQgZm9yIHNwZWNpYWwKCSAqIGFib3J0IGNs ZWFudXAgbG9naWMuCgkgKi8KCXByaXZhdGVfY29udGV4dCA9IEFsbG9jU2V0Q29udGV4dENy ZWF0ZShQb3J0YWxDb250ZXh0LAoJCQkJCQkJCQkJCSJSZWluZGV4Q29uY3VycmVudCIsCgkJ CQkJCQkJCQkJQUxMT0NTRVRfU01BTExfU0laRVMpOwoKCWlmICgocGFyYW1zLT5vcHRpb25z ICYgUkVJTkRFWE9QVF9WRVJCT1NFKSAhPSAwKQoJewoJCS8qIFNhdmUgZGF0YSBuZWVkZWQg YnkgUkVJTkRFWCBWRVJCT1NFIGluIHByaXZhdGUgY29udGV4dCAqLwoJCW9sZGNvbnRleHQg PSBNZW1vcnlDb250ZXh0U3dpdGNoVG8ocHJpdmF0ZV9jb250ZXh0KTsKCgkJcmVsYXRpb25O YW1lID0gZ2V0X3JlbF9uYW1lKHJlbGF0aW9uT2lkKTsKCQlyZWxhdGlvbk5hbWVzcGFjZSA9 IGdldF9uYW1lc3BhY2VfbmFtZShnZXRfcmVsX25hbWVzcGFjZShyZWxhdGlvbk9pZCkpOwoK CQlwZ19ydXNhZ2VfaW5pdCgmcnUwKTsKCgkJTWVtb3J5Q29udGV4dFN3aXRjaFRvKG9sZGNv bnRleHQpOwoJfQoKCXJlbGtpbmQgPSBnZXRfcmVsX3JlbGtpbmQocmVsYXRpb25PaWQpOwoK CS8qCgkgKiBFeHRyYWN0IHRoZSBsaXN0IG9mIGluZGV4ZXMgdGhhdCBhcmUgZ29pbmcgdG8g YmUgcmVidWlsdCBiYXNlZCBvbiB0aGUKCSAqIHJlbGF0aW9uIE9pZCBnaXZlbiBieSBjYWxs ZXIuCgkgKi8KCXN3aXRjaCAocmVsa2luZCkKCXsKCQljYXNlIFJFTEtJTkRfUkVMQVRJT046 CgkJY2FzZSBSRUxLSU5EX01BVFZJRVc6CgkJY2FzZSBSRUxLSU5EX1RPQVNUVkFMVUU6CgkJ CXsKCQkJCS8qCgkJCQkgKiBJbiB0aGUgY2FzZSBvZiBhIHJlbGF0aW9uLCBmaW5kIGFsbCBp dHMgaW5kZXhlcyBpbmNsdWRpbmcKCQkJCSAqIHRvYXN0IGluZGV4ZXMuCgkJCQkgKi8KCQkJ CVJlbGF0aW9uCWhlYXBSZWxhdGlvbjsKCgkJCQkvKiBTYXZlIHRoZSBsaXN0IG9mIHJlbGF0 aW9uIE9JRHMgaW4gcHJpdmF0ZSBjb250ZXh0ICovCgkJCQlvbGRjb250ZXh0ID0gTWVtb3J5 Q29udGV4dFN3aXRjaFRvKHByaXZhdGVfY29udGV4dCk7CgoJCQkJLyogVHJhY2sgdGhpcyBy ZWxhdGlvbiBmb3Igc2Vzc2lvbiBsb2NrcyAqLwoJCQkJaGVhcFJlbGF0aW9uSWRzID0gbGFw cGVuZF9vaWQoaGVhcFJlbGF0aW9uSWRzLCByZWxhdGlvbk9pZCk7CgoJCQkJTWVtb3J5Q29u dGV4dFN3aXRjaFRvKG9sZGNvbnRleHQpOwoKCQkJCWlmIChJc0NhdGFsb2dSZWxhdGlvbk9p ZChyZWxhdGlvbk9pZCkpCgkJCQkJZXJlcG9ydChFUlJPUiwKCQkJCQkJCShlcnJjb2RlKEVS UkNPREVfRkVBVFVSRV9OT1RfU1VQUE9SVEVEKSwKCQkJCQkJCSBlcnJtc2coImNhbm5vdCBy ZWluZGV4IHN5c3RlbSBjYXRhbG9ncyBjb25jdXJyZW50bHkiKSkpOwoKCQkJCS8qIE9wZW4g cmVsYXRpb24gdG8gZ2V0IGl0cyBpbmRleGVzICovCgkJCQlpZiAoKHBhcmFtcy0+b3B0aW9u cyAmIFJFSU5ERVhPUFRfTUlTU0lOR19PSykgIT0gMCkKCQkJCXsKCQkJCQloZWFwUmVsYXRp b24gPSB0cnlfdGFibGVfb3BlbihyZWxhdGlvbk9pZCwKCQkJCQkJCQkJCQkJICBTaGFyZVVw ZGF0ZUV4Y2x1c2l2ZUxvY2spOwoJCQkJCS8qIGxlYXZlIGlmIHJlbGF0aW9uIGRvZXMgbm90 IGV4aXN0ICovCgkJCQkJaWYgKCFoZWFwUmVsYXRpb24pCgkJCQkJCWJyZWFrOwoJCQkJfQoJ CQkJZWxzZQoJCQkJCWhlYXBSZWxhdGlvbiA9IHRhYmxlX29wZW4ocmVsYXRpb25PaWQsCgkJ CQkJCQkJCQkJICBTaGFyZVVwZGF0ZUV4Y2x1c2l2ZUxvY2spOwoKCQkJCWlmIChPaWRJc1Zh bGlkKHBhcmFtcy0+dGFibGVzcGFjZU9pZCkgJiYKCQkJCQlJc1N5c3RlbVJlbGF0aW9uKGhl YXBSZWxhdGlvbikpCgkJCQkJZXJlcG9ydChFUlJPUiwKCQkJCQkJCShlcnJjb2RlKEVSUkNP REVfRkVBVFVSRV9OT1RfU1VQUE9SVEVEKSwKCQkJCQkJCSBlcnJtc2coImNhbm5vdCBtb3Zl IHN5c3RlbSByZWxhdGlvbiBcIiVzXCIiLAoJCQkJCQkJCQlSZWxhdGlvbkdldFJlbGF0aW9u TmFtZShoZWFwUmVsYXRpb24pKSkpOwoKCQkJCS8qIEFkZCBhbGwgdGhlIHZhbGlkIGluZGV4 ZXMgb2YgcmVsYXRpb24gdG8gbGlzdCAqLwoJCQkJZm9yZWFjaChsYywgUmVsYXRpb25HZXRJ bmRleExpc3QoaGVhcFJlbGF0aW9uKSkKCQkJCXsKCQkJCQlPaWQJCQljZWxsT2lkID0gbGZp cnN0X29pZChsYyk7CgkJCQkJUmVsYXRpb24JaW5kZXhSZWxhdGlvbiA9IGluZGV4X29wZW4o Y2VsbE9pZCwKCQkJCQkJCQkJCQkJCQkgICBTaGFyZVVwZGF0ZUV4Y2x1c2l2ZUxvY2spOwoK CQkJCQlpZiAoIWluZGV4UmVsYXRpb24tPnJkX2luZGV4LT5pbmRpc3ZhbGlkKQoJCQkJCQll cmVwb3J0KFdBUk5JTkcsCgkJCQkJCQkJKGVycmNvZGUoRVJSQ09ERV9PQkpFQ1RfTk9UX0lO X1BSRVJFUVVJU0lURV9TVEFURSksCgkJCQkJCQkJIGVycm1zZygic2tpcHBpbmcgcmVpbmRl eCBvZiBpbnZhbGlkIGluZGV4IFwiJXMuJXNcIiIsCgkJCQkJCQkJCQlnZXRfbmFtZXNwYWNl X25hbWUoZ2V0X3JlbF9uYW1lc3BhY2UoY2VsbE9pZCkpLAoJCQkJCQkJCQkJZ2V0X3JlbF9u YW1lKGNlbGxPaWQpKSwKCQkJCQkJCQkgZXJyaGludCgiVXNlIERST1AgSU5ERVggb3IgUkVJ TkRFWCBJTkRFWC4iKSkpOwoJCQkJCWVsc2UgaWYgKGluZGV4UmVsYXRpb24tPnJkX2luZGV4 LT5pbmRpc2V4Y2x1c2lvbikKCQkJCQkJZXJlcG9ydChXQVJOSU5HLAoJCQkJCQkJCShlcnJj b2RlKEVSUkNPREVfRkVBVFVSRV9OT1RfU1VQUE9SVEVEKSwKCQkJCQkJCQkgZXJybXNnKCJj YW5ub3QgcmVpbmRleCBleGNsdXNpb24gY29uc3RyYWludCBpbmRleCBcIiVzLiVzXCIgY29u Y3VycmVudGx5LCBza2lwcGluZyIsCgkJCQkJCQkJCQlnZXRfbmFtZXNwYWNlX25hbWUoZ2V0 X3JlbF9uYW1lc3BhY2UoY2VsbE9pZCkpLAoJCQkJCQkJCQkJZ2V0X3JlbF9uYW1lKGNlbGxP aWQpKSkpOwoJCQkJCWVsc2UKCQkJCQl7CgkJCQkJCVJlaW5kZXhJbmRleEluZm8gKmlkeDsK CgkJCQkJCS8qIFNhdmUgdGhlIGxpc3Qgb2YgcmVsYXRpb24gT0lEcyBpbiBwcml2YXRlIGNv bnRleHQgKi8KCQkJCQkJb2xkY29udGV4dCA9IE1lbW9yeUNvbnRleHRTd2l0Y2hUbyhwcml2 YXRlX2NvbnRleHQpOwoKCQkJCQkJaWR4ID0gcGFsbG9jX29iamVjdChSZWluZGV4SW5kZXhJ bmZvKTsKCQkJCQkJaWR4LT5pbmRleElkID0gY2VsbE9pZDsKCQkJCQkJLyogb3RoZXIgZmll bGRzIHNldCBsYXRlciAqLwoKCQkJCQkJaW5kZXhJZHMgPSBsYXBwZW5kKGluZGV4SWRzLCBp ZHgpOwoKCQkJCQkJTWVtb3J5Q29udGV4dFN3aXRjaFRvKG9sZGNvbnRleHQpOwoJCQkJCX0K CgkJCQkJaW5kZXhfY2xvc2UoaW5kZXhSZWxhdGlvbiwgTm9Mb2NrKTsKCQkJCX0KCgkJCQkv KiBBbHNvIGFkZCB0aGUgdG9hc3QgaW5kZXhlcyAqLwoJCQkJaWYgKE9pZElzVmFsaWQoaGVh cFJlbGF0aW9uLT5yZF9yZWwtPnJlbHRvYXN0cmVsaWQpKQoJCQkJewoJCQkJCU9pZAkJCXRv YXN0T2lkID0gaGVhcFJlbGF0aW9uLT5yZF9yZWwtPnJlbHRvYXN0cmVsaWQ7CgkJCQkJUmVs YXRpb24JdG9hc3RSZWxhdGlvbiA9IHRhYmxlX29wZW4odG9hc3RPaWQsCgkJCQkJCQkJCQkJ CQkJICAgU2hhcmVVcGRhdGVFeGNsdXNpdmVMb2NrKTsKCgkJCQkJLyogU2F2ZSB0aGUgbGlz dCBvZiByZWxhdGlvbiBPSURzIGluIHByaXZhdGUgY29udGV4dCAqLwoJCQkJCW9sZGNvbnRl eHQgPSBNZW1vcnlDb250ZXh0U3dpdGNoVG8ocHJpdmF0ZV9jb250ZXh0KTsKCgkJCQkJLyog VHJhY2sgdGhpcyByZWxhdGlvbiBmb3Igc2Vzc2lvbiBsb2NrcyAqLwoJCQkJCWhlYXBSZWxh dGlvbklkcyA9IGxhcHBlbmRfb2lkKGhlYXBSZWxhdGlvbklkcywgdG9hc3RPaWQpOwoKCQkJ CQlNZW1vcnlDb250ZXh0U3dpdGNoVG8ob2xkY29udGV4dCk7CgoJCQkJCWZvcmVhY2gobGMy LCBSZWxhdGlvbkdldEluZGV4TGlzdCh0b2FzdFJlbGF0aW9uKSkKCQkJCQl7CgkJCQkJCU9p ZAkJCWNlbGxPaWQgPSBsZmlyc3Rfb2lkKGxjMik7CgkJCQkJCVJlbGF0aW9uCWluZGV4UmVs YXRpb24gPSBpbmRleF9vcGVuKGNlbGxPaWQsCgkJCQkJCQkJCQkJCQkJCSAgIFNoYXJlVXBk YXRlRXhjbHVzaXZlTG9jayk7CgoJCQkJCQlpZiAoIWluZGV4UmVsYXRpb24tPnJkX2luZGV4 LT5pbmRpc3ZhbGlkKQoJCQkJCQkJZXJlcG9ydChXQVJOSU5HLAoJCQkJCQkJCQkoZXJyY29k ZShFUlJDT0RFX09CSkVDVF9OT1RfSU5fUFJFUkVRVUlTSVRFX1NUQVRFKSwKCQkJCQkJCQkJ IGVycm1zZygic2tpcHBpbmcgcmVpbmRleCBvZiBpbnZhbGlkIGluZGV4IFwiJXMuJXNcIiIs CgkJCQkJCQkJCQkJZ2V0X25hbWVzcGFjZV9uYW1lKGdldF9yZWxfbmFtZXNwYWNlKGNlbGxP aWQpKSwKCQkJCQkJCQkJCQlnZXRfcmVsX25hbWUoY2VsbE9pZCkpLAoJCQkJCQkJCQkgZXJy aGludCgiVXNlIERST1AgSU5ERVggb3IgUkVJTkRFWCBJTkRFWC4iKSkpOwoJCQkJCQllbHNl CgkJCQkJCXsKCQkJCQkJCVJlaW5kZXhJbmRleEluZm8gKmlkeDsKCgkJCQkJCQkvKgoJCQkJ CQkJICogU2F2ZSB0aGUgbGlzdCBvZiByZWxhdGlvbiBPSURzIGluIHByaXZhdGUKCQkJCQkJ CSAqIGNvbnRleHQKCQkJCQkJCSAqLwoJCQkJCQkJb2xkY29udGV4dCA9IE1lbW9yeUNvbnRl eHRTd2l0Y2hUbyhwcml2YXRlX2NvbnRleHQpOwoKCQkJCQkJCWlkeCA9IHBhbGxvY19vYmpl Y3QoUmVpbmRleEluZGV4SW5mbyk7CgkJCQkJCQlpZHgtPmluZGV4SWQgPSBjZWxsT2lkOwoJ CQkJCQkJaW5kZXhJZHMgPSBsYXBwZW5kKGluZGV4SWRzLCBpZHgpOwoJCQkJCQkJLyogb3Ro ZXIgZmllbGRzIHNldCBsYXRlciAqLwoKCQkJCQkJCU1lbW9yeUNvbnRleHRTd2l0Y2hUbyhv bGRjb250ZXh0KTsKCQkJCQkJfQoKCQkJCQkJaW5kZXhfY2xvc2UoaW5kZXhSZWxhdGlvbiwg Tm9Mb2NrKTsKCQkJCQl9CgoJCQkJCXRhYmxlX2Nsb3NlKHRvYXN0UmVsYXRpb24sIE5vTG9j ayk7CgkJCQl9CgoJCQkJdGFibGVfY2xvc2UoaGVhcFJlbGF0aW9uLCBOb0xvY2spOwoJCQkJ YnJlYWs7CgkJCX0KCQljYXNlIFJFTEtJTkRfSU5ERVg6CgkJCXsKCQkJCU9pZAkJCWhlYXBJ ZCA9IEluZGV4R2V0UmVsYXRpb24ocmVsYXRpb25PaWQsCgkJCQkJCQkJCQkJCQkgIChwYXJh bXMtPm9wdGlvbnMgJiBSRUlOREVYT1BUX01JU1NJTkdfT0spICE9IDApOwoJCQkJUmVsYXRp b24JaGVhcFJlbGF0aW9uOwoJCQkJUmVpbmRleEluZGV4SW5mbyAqaWR4OwoKCQkJCS8qIGlm IHJlbGF0aW9uIGlzIG1pc3NpbmcsIGxlYXZlICovCgkJCQlpZiAoIU9pZElzVmFsaWQoaGVh cElkKSkKCQkJCQlicmVhazsKCgkJCQlpZiAoSXNDYXRhbG9nUmVsYXRpb25PaWQoaGVhcElk KSkKCQkJCQllcmVwb3J0KEVSUk9SLAoJCQkJCQkJKGVycmNvZGUoRVJSQ09ERV9GRUFUVVJF X05PVF9TVVBQT1JURUQpLAoJCQkJCQkJIGVycm1zZygiY2Fubm90IHJlaW5kZXggc3lzdGVt IGNhdGFsb2dzIGNvbmN1cnJlbnRseSIpKSk7CgoJCQkJLyoKCQkJCSAqIERvbid0IGFsbG93 IHJlaW5kZXggZm9yIGFuIGludmFsaWQgaW5kZXggb24gVE9BU1QgdGFibGUsIGFzCgkJCQkg KiBpZiByZWJ1aWx0IGl0IHdvdWxkIG5vdCBiZSBwb3NzaWJsZSB0byBkcm9wIGl0LiAgTWF0 Y2gKCQkJCSAqIGVycm9yIG1lc3NhZ2UgaW4gcmVpbmRleF9pbmRleCgpLgoJCQkJICovCgkJ CQlpZiAoSXNUb2FzdE5hbWVzcGFjZShnZXRfcmVsX25hbWVzcGFjZShyZWxhdGlvbk9pZCkp ICYmCgkJCQkJIWdldF9pbmRleF9pc3ZhbGlkKHJlbGF0aW9uT2lkKSkKCQkJCQllcmVwb3J0 KEVSUk9SLAoJCQkJCQkJKGVycmNvZGUoRVJSQ09ERV9GRUFUVVJFX05PVF9TVVBQT1JURUQp LAoJCQkJCQkJIGVycm1zZygiY2Fubm90IHJlaW5kZXggaW52YWxpZCBpbmRleCBvbiBUT0FT VCB0YWJsZSIpKSk7CgoJCQkJLyoKCQkJCSAqIENoZWNrIGlmIHBhcmVudCByZWxhdGlvbiBj YW4gYmUgbG9ja2VkIGFuZCBpZiBpdCBleGlzdHMsCgkJCQkgKiB0aGlzIG5lZWRzIHRvIGJl IGRvbmUgYXQgdGhpcyBzdGFnZSBhcyB0aGUgbGlzdCBvZiBpbmRleGVzCgkJCQkgKiB0byBy ZWJ1aWxkIGlzIG5vdCBjb21wbGV0ZSB5ZXQsIGFuZCBSRUlOREVYT1BUX01JU1NJTkdfT0sK CQkJCSAqIHNob3VsZCBub3QgYmUgdXNlZCBvbmNlIGFsbCB0aGUgc2Vzc2lvbiBsb2NrcyBh cmUgdGFrZW4uCgkJCQkgKi8KCQkJCWlmICgocGFyYW1zLT5vcHRpb25zICYgUkVJTkRFWE9Q VF9NSVNTSU5HX09LKSAhPSAwKQoJCQkJewoJCQkJCWhlYXBSZWxhdGlvbiA9IHRyeV90YWJs ZV9vcGVuKGhlYXBJZCwKCQkJCQkJCQkJCQkJICBTaGFyZVVwZGF0ZUV4Y2x1c2l2ZUxvY2sp OwoJCQkJCS8qIGxlYXZlIGlmIHJlbGF0aW9uIGRvZXMgbm90IGV4aXN0ICovCgkJCQkJaWYg KCFoZWFwUmVsYXRpb24pCgkJCQkJCWJyZWFrOwoJCQkJfQoJCQkJZWxzZQoJCQkJCWhlYXBS ZWxhdGlvbiA9IHRhYmxlX29wZW4oaGVhcElkLAoJCQkJCQkJCQkJCSAgU2hhcmVVcGRhdGVF eGNsdXNpdmVMb2NrKTsKCgkJCQlpZiAoT2lkSXNWYWxpZChwYXJhbXMtPnRhYmxlc3BhY2VP aWQpICYmCgkJCQkJSXNTeXN0ZW1SZWxhdGlvbihoZWFwUmVsYXRpb24pKQoJCQkJCWVyZXBv cnQoRVJST1IsCgkJCQkJCQkoZXJyY29kZShFUlJDT0RFX0ZFQVRVUkVfTk9UX1NVUFBPUlRF RCksCgkJCQkJCQkgZXJybXNnKCJjYW5ub3QgbW92ZSBzeXN0ZW0gcmVsYXRpb24gXCIlc1wi IiwKCQkJCQkJCQkJZ2V0X3JlbF9uYW1lKHJlbGF0aW9uT2lkKSkpKTsKCgkJCQl0YWJsZV9j bG9zZShoZWFwUmVsYXRpb24sIE5vTG9jayk7CgoJCQkJLyogU2F2ZSB0aGUgbGlzdCBvZiBy ZWxhdGlvbiBPSURzIGluIHByaXZhdGUgY29udGV4dCAqLwoJCQkJb2xkY29udGV4dCA9IE1l bW9yeUNvbnRleHRTd2l0Y2hUbyhwcml2YXRlX2NvbnRleHQpOwoKCQkJCS8qIFRyYWNrIHRo ZSBoZWFwIHJlbGF0aW9uIG9mIHRoaXMgaW5kZXggZm9yIHNlc3Npb24gbG9ja3MgKi8KCQkJ CWhlYXBSZWxhdGlvbklkcyA9IGxpc3RfbWFrZTFfb2lkKGhlYXBJZCk7CgoJCQkJLyoKCQkJ CSAqIFNhdmUgdGhlIGxpc3Qgb2YgcmVsYXRpb24gT0lEcyBpbiBwcml2YXRlIGNvbnRleHQu ICBOb3RlCgkJCQkgKiB0aGF0IGludmFsaWQgaW5kZXhlcyBhcmUgYWxsb3dlZCBoZXJlLgoJ CQkJICovCgkJCQlpZHggPSBwYWxsb2Nfb2JqZWN0KFJlaW5kZXhJbmRleEluZm8pOwoJCQkJ aWR4LT5pbmRleElkID0gcmVsYXRpb25PaWQ7CgkJCQlpbmRleElkcyA9IGxhcHBlbmQoaW5k ZXhJZHMsIGlkeCk7CgkJCQkvKiBvdGhlciBmaWVsZHMgc2V0IGxhdGVyICovCgoJCQkJTWVt b3J5Q29udGV4dFN3aXRjaFRvKG9sZGNvbnRleHQpOwoJCQkJYnJlYWs7CgkJCX0KCgkJY2Fz ZSBSRUxLSU5EX1BBUlRJVElPTkVEX1RBQkxFOgoJCWNhc2UgUkVMS0lORF9QQVJUSVRJT05F RF9JTkRFWDoKCQlkZWZhdWx0OgoJCQkvKiBSZXR1cm4gZXJyb3IgaWYgdHlwZSBvZiByZWxh dGlvbiBpcyBub3Qgc3VwcG9ydGVkICovCgkJCWVyZXBvcnQoRVJST1IsCgkJCQkJKGVycmNv ZGUoRVJSQ09ERV9XUk9OR19PQkpFQ1RfVFlQRSksCgkJCQkJIGVycm1zZygiY2Fubm90IHJl aW5kZXggdGhpcyB0eXBlIG9mIHJlbGF0aW9uIGNvbmN1cnJlbnRseSIpKSk7CgkJCWJyZWFr OwoJfQoKCS8qCgkgKiBEZWZpbml0ZWx5IG5vIGluZGV4ZXMsIHNvIGxlYXZlLiAgQW55IGNo ZWNrcyBiYXNlZCBvbgoJICogUkVJTkRFWE9QVF9NSVNTSU5HX09LIHNob3VsZCBiZSBkb25l IG9ubHkgd2hpbGUgdGhlIGxpc3Qgb2YgaW5kZXhlcyB0bwoJICogd29yayBvbiBpcyBidWls dCBhcyB0aGUgc2Vzc2lvbiBsb2NrcyB0YWtlbiBiZWZvcmUgdGhpcyB0cmFuc2FjdGlvbgoJ ICogY29tbWl0cyB3aWxsIG1ha2Ugc3VyZSB0aGF0IHRoZXkgY2Fubm90IGJlIGRyb3BwZWQg YnkgYSBjb25jdXJyZW50CgkgKiBzZXNzaW9uIHVudGlsIHRoaXMgb3BlcmF0aW9uIGNvbXBs ZXRlcy4KCSAqLwoJaWYgKGluZGV4SWRzID09IE5JTCkKCQlyZXR1cm4gZmFsc2U7CgoJLyog SXQncyBub3QgYSBzaGFyZWQgY2F0YWxvZywgc28gcmVmdXNlIHRvIG1vdmUgaXQgdG8gc2hh cmVkIHRhYmxlc3BhY2UgKi8KCWlmIChwYXJhbXMtPnRhYmxlc3BhY2VPaWQgPT0gR0xPQkFM VEFCTEVTUEFDRV9PSUQpCgkJZXJlcG9ydChFUlJPUiwKCQkJCShlcnJjb2RlKEVSUkNPREVf RkVBVFVSRV9OT1RfU1VQUE9SVEVEKSwKCQkJCSBlcnJtc2coImNhbm5vdCBtb3ZlIG5vbi1z aGFyZWQgcmVsYXRpb24gdG8gdGFibGVzcGFjZSBcIiVzXCIiLAoJCQkJCQlnZXRfdGFibGVz cGFjZV9uYW1lKHBhcmFtcy0+dGFibGVzcGFjZU9pZCkpKSk7CgoJQXNzZXJ0KGhlYXBSZWxh dGlvbklkcyAhPSBOSUwpOwoKCS8qLS0tLS0KCSAqIE5vdyB3ZSBoYXZlIGFsbCB0aGUgaW5k ZXhlcyB3ZSB3YW50IHRvIHByb2Nlc3MgaW4gaW5kZXhJZHMuCgkgKgoJICogVGhlIHBoYXNl cyBub3cgYXJlOgoJICoKCSAqIDEuIGNyZWF0ZSBuZXcgaW5kZXhlcyBpbiB0aGUgY2F0YWxv ZwoJICogMi4gYnVpbGQgbmV3IGluZGV4ZXMKCSAqIDMuIGxldCBuZXcgaW5kZXhlcyBjYXRj aCB1cCB3aXRoIHR1cGxlcyBpbnNlcnRlZCBpbiB0aGUgbWVhbnRpbWUKCSAqIDQuIHN3YXAg aW5kZXggbmFtZXMKCSAqIDUuIG1hcmsgb2xkIGluZGV4ZXMgYXMgZGVhZAoJICogNi4gZHJv cCBvbGQgaW5kZXhlcwoJICoKCSAqIFdlIHByb2Nlc3MgZWFjaCBwaGFzZSBmb3IgYWxsIGlu ZGV4ZXMgYmVmb3JlIG1vdmluZyB0byB0aGUgbmV4dCBwaGFzZSwKCSAqIGZvciBlZmZpY2ll bmN5LgoJICovCgoJLyoKCSAqIFBoYXNlIDEgb2YgUkVJTkRFWCBDT05DVVJSRU5UTFkKCSAq CgkgKiBDcmVhdGUgYSBuZXcgaW5kZXggd2l0aCB0aGUgc2FtZSBwcm9wZXJ0aWVzIGFzIHRo ZSBvbGQgb25lLCBidXQgaXQgaXMKCSAqIG9ubHkgcmVnaXN0ZXJlZCBpbiBjYXRhbG9ncyBh bmQgd2lsbCBiZSBidWlsdCBsYXRlci4gIFRoZW4gZ2V0IHNlc3Npb24KCSAqIGxvY2tzIG9u IGFsbCBpbnZvbHZlZCB0YWJsZXMuICBTZWUgYW5hbG9nb3VzIGNvZGUgaW4gRGVmaW5lSW5k ZXgoKSBmb3IKCSAqIG1vcmUgZGV0YWlsZWQgY29tbWVudHMuCgkgKi8KCglmb3JlYWNoKGxj LCBpbmRleElkcykKCXsKCQljaGFyCSAgICpjb25jdXJyZW50TmFtZTsKCQlSZWluZGV4SW5k ZXhJbmZvICppZHggPSBsZmlyc3QobGMpOwoJCVJlaW5kZXhJbmRleEluZm8gKm5ld2lkeDsK CQlPaWQJCQluZXdJbmRleElkOwoJCVJlbGF0aW9uCWluZGV4UmVsOwoJCVJlbGF0aW9uCWhl YXBSZWw7CgkJT2lkCQkJc2F2ZV91c2VyaWQ7CgkJaW50CQkJc2F2ZV9zZWNfY29udGV4dDsK CQlpbnQJCQlzYXZlX25lc3RsZXZlbDsKCQlSZWxhdGlvbgluZXdJbmRleFJlbDsKCQlMb2Nr UmVsSWQgICpsb2NrcmVsaWQ7CgkJT2lkCQkJdGFibGVzcGFjZWlkOwoKCQlpbmRleFJlbCA9 IGluZGV4X29wZW4oaWR4LT5pbmRleElkLCBTaGFyZVVwZGF0ZUV4Y2x1c2l2ZUxvY2spOwoJ CWhlYXBSZWwgPSB0YWJsZV9vcGVuKGluZGV4UmVsLT5yZF9pbmRleC0+aW5kcmVsaWQsCgkJ CQkJCQkgU2hhcmVVcGRhdGVFeGNsdXNpdmVMb2NrKTsKCgkJLyoKCQkgKiBTd2l0Y2ggdG8g dGhlIHRhYmxlIG93bmVyJ3MgdXNlcmlkLCBzbyB0aGF0IGFueSBpbmRleCBmdW5jdGlvbnMg YXJlCgkJICogcnVuIGFzIHRoYXQgdXNlci4gIEFsc28gbG9jayBkb3duIHNlY3VyaXR5LXJl c3RyaWN0ZWQgb3BlcmF0aW9ucwoJCSAqIGFuZCBhcnJhbmdlIHRvIG1ha2UgR1VDIHZhcmlh YmxlIGNoYW5nZXMgbG9jYWwgdG8gdGhpcyBjb21tYW5kLgoJCSAqLwoJCUdldFVzZXJJZEFu ZFNlY0NvbnRleHQoJnNhdmVfdXNlcmlkLCAmc2F2ZV9zZWNfY29udGV4dCk7CgkJU2V0VXNl cklkQW5kU2VjQ29udGV4dChoZWFwUmVsLT5yZF9yZWwtPnJlbG93bmVyLAoJCQkJCQkJICAg c2F2ZV9zZWNfY29udGV4dCB8IFNFQ1VSSVRZX1JFU1RSSUNURURfT1BFUkFUSU9OKTsKCQlz YXZlX25lc3RsZXZlbCA9IE5ld0dVQ05lc3RMZXZlbCgpOwoJCVJlc3RyaWN0U2VhcmNoUGF0 aCgpOwoKCQkvKiBkZXRlcm1pbmUgc2FmZXR5IG9mIHRoaXMgaW5kZXggZm9yIHNldF9pbmRl eHNhZmVfcHJvY2ZsYWdzICovCgkJaWR4LT5zYWZlID0gKFJlbGF0aW9uR2V0SW5kZXhFeHBy ZXNzaW9ucyhpbmRleFJlbCkgPT0gTklMICYmCgkJCQkJIFJlbGF0aW9uR2V0SW5kZXhQcmVk aWNhdGUoaW5kZXhSZWwpID09IE5JTCk7CgojaWZkZWYgVVNFX0lOSkVDVElPTl9QT0lOVFMK CQlpZiAoaWR4LT5zYWZlKQoJCQlJTkpFQ1RJT05fUE9JTlQoInJlaW5kZXgtY29uYy1pbmRl eC1zYWZlIiwgTlVMTCk7CgkJZWxzZQoJCQlJTkpFQ1RJT05fUE9JTlQoInJlaW5kZXgtY29u Yy1pbmRleC1ub3Qtc2FmZSIsIE5VTEwpOwojZW5kaWYKCgkJaWR4LT50YWJsZUlkID0gUmVs YXRpb25HZXRSZWxpZChoZWFwUmVsKTsKCQlpZHgtPmFtSWQgPSBpbmRleFJlbC0+cmRfcmVs LT5yZWxhbTsKCgkJLyogVGhpcyBmdW5jdGlvbiBzaG91bGRuJ3QgYmUgY2FsbGVkIGZvciB0 ZW1wb3JhcnkgcmVsYXRpb25zLiAqLwoJCWlmIChpbmRleFJlbC0+cmRfcmVsLT5yZWxwZXJz aXN0ZW5jZSA9PSBSRUxQRVJTSVNURU5DRV9URU1QKQoJCQllbG9nKEVSUk9SLCAiY2Fubm90 IHJlaW5kZXggYSB0ZW1wb3JhcnkgdGFibGUgY29uY3VycmVudGx5Iik7CgoJCXBnc3RhdF9w cm9ncmVzc19zdGFydF9jb21tYW5kKFBST0dSRVNTX0NPTU1BTkRfQ1JFQVRFX0lOREVYLCBp ZHgtPnRhYmxlSWQpOwoKCQlwcm9ncmVzc192YWxzWzBdID0gUFJPR1JFU1NfQ1JFQVRFSURY X0NPTU1BTkRfUkVJTkRFWF9DT05DVVJSRU5UTFk7CgkJcHJvZ3Jlc3NfdmFsc1sxXSA9IDA7 CS8qIGluaXRpYWxpemluZyAqLwoJCXByb2dyZXNzX3ZhbHNbMl0gPSBpZHgtPmluZGV4SWQ7 CgkJcHJvZ3Jlc3NfdmFsc1szXSA9IGlkeC0+YW1JZDsKCQlwZ3N0YXRfcHJvZ3Jlc3NfdXBk YXRlX211bHRpX3BhcmFtKDQsIHByb2dyZXNzX2luZGV4LCBwcm9ncmVzc192YWxzKTsKCgkJ LyogQ2hvb3NlIGEgdGVtcG9yYXJ5IHJlbGF0aW9uIG5hbWUgZm9yIHRoZSBuZXcgaW5kZXgg Ki8KCQljb25jdXJyZW50TmFtZSA9IENob29zZVJlbGF0aW9uTmFtZShnZXRfcmVsX25hbWUo aWR4LT5pbmRleElkKSwKCQkJCQkJCQkJCQlOVUxMLAoJCQkJCQkJCQkJCSJjY25ldyIsCgkJ CQkJCQkJCQkJZ2V0X3JlbF9uYW1lc3BhY2UoaW5kZXhSZWwtPnJkX2luZGV4LT5pbmRyZWxp ZCksCgkJCQkJCQkJCQkJZmFsc2UpOwoKCQkvKiBDaG9vc2UgdGhlIG5ldyB0YWJsZXNwYWNl LCBpbmRleGVzIG9mIHRvYXN0IHRhYmxlcyBhcmUgbm90IG1vdmVkICovCgkJaWYgKE9pZElz VmFsaWQocGFyYW1zLT50YWJsZXNwYWNlT2lkKSAmJgoJCQloZWFwUmVsLT5yZF9yZWwtPnJl bGtpbmQgIT0gUkVMS0lORF9UT0FTVFZBTFVFKQoJCQl0YWJsZXNwYWNlaWQgPSBwYXJhbXMt PnRhYmxlc3BhY2VPaWQ7CgkJZWxzZQoJCQl0YWJsZXNwYWNlaWQgPSBpbmRleFJlbC0+cmRf cmVsLT5yZWx0YWJsZXNwYWNlOwoKCQkvKiBDcmVhdGUgbmV3IGluZGV4IGRlZmluaXRpb24g YmFzZWQgb24gZ2l2ZW4gaW5kZXggKi8KCQluZXdJbmRleElkID0gaW5kZXhfY3JlYXRlX2Nv cHkoaGVhcFJlbCwKCQkJCQkJCQkJICAgSU5ERVhfQ1JFQVRFX0NPTkNVUlJFTlQgfAoJCQkJ CQkJCQkgICBJTkRFWF9DUkVBVEVfU0tJUF9CVUlMRCB8CgkJCQkJCQkJCSAgIElOREVYX0NS RUFURV9TVVBQUkVTU19QUk9HUkVTUywKCQkJCQkJCQkJICAgaWR4LT5pbmRleElkLAoJCQkJ CQkJCQkgICB0YWJsZXNwYWNlaWQsCgkJCQkJCQkJCSAgIGNvbmN1cnJlbnROYW1lKTsKCgkJ LyoKCQkgKiBOb3cgb3BlbiB0aGUgcmVsYXRpb24gb2YgdGhlIG5ldyBpbmRleCwgYSBzZXNz aW9uLWxldmVsIGxvY2sgaXMKCQkgKiBhbHNvIG5lZWRlZCBvbiBpdC4KCQkgKi8KCQluZXdJ bmRleFJlbCA9IGluZGV4X29wZW4obmV3SW5kZXhJZCwgU2hhcmVVcGRhdGVFeGNsdXNpdmVM b2NrKTsKCgkJLyoKCQkgKiBTYXZlIHRoZSBsaXN0IG9mIE9JRHMgYW5kIGxvY2tzIGluIHBy aXZhdGUgY29udGV4dAoJCSAqLwoJCW9sZGNvbnRleHQgPSBNZW1vcnlDb250ZXh0U3dpdGNo VG8ocHJpdmF0ZV9jb250ZXh0KTsKCgkJbmV3aWR4ID0gcGFsbG9jX29iamVjdChSZWluZGV4 SW5kZXhJbmZvKTsKCQluZXdpZHgtPmluZGV4SWQgPSBuZXdJbmRleElkOwoJCW5ld2lkeC0+ c2FmZSA9IGlkeC0+c2FmZTsKCQluZXdpZHgtPnRhYmxlSWQgPSBpZHgtPnRhYmxlSWQ7CgkJ bmV3aWR4LT5hbUlkID0gaWR4LT5hbUlkOwoKCQluZXdJbmRleElkcyA9IGxhcHBlbmQobmV3 SW5kZXhJZHMsIG5ld2lkeCk7CgoJCS8qCgkJICogU2F2ZSBsb2NrcmVsaWQgdG8gcHJvdGVj dCBlYWNoIHJlbGF0aW9uIGZyb20gZHJvcCB0aGVuIGNsb3NlCgkJICogcmVsYXRpb25zLiBU aGUgbG9ja3JlbGlkIG9uIHBhcmVudCByZWxhdGlvbiBpcyBub3QgdGFrZW4gaGVyZSB0bwoJ CSAqIGF2b2lkIG11bHRpcGxlIGxvY2tzIHRha2VuIG9uIHRoZSBzYW1lIHJlbGF0aW9uLCBp bnN0ZWFkIHdlIHJlbHkgb24KCQkgKiBwYXJlbnRSZWxhdGlvbklkcyBidWlsdCBlYXJsaWVy LgoJCSAqLwoJCWxvY2tyZWxpZCA9IHBhbGxvY19vYmplY3QoTG9ja1JlbElkKTsKCQkqbG9j a3JlbGlkID0gaW5kZXhSZWwtPnJkX2xvY2tJbmZvLmxvY2tSZWxJZDsKCQlyZWxhdGlvbkxv Y2tzID0gbGFwcGVuZChyZWxhdGlvbkxvY2tzLCBsb2NrcmVsaWQpOwoJCWxvY2tyZWxpZCA9 IHBhbGxvY19vYmplY3QoTG9ja1JlbElkKTsKCQkqbG9ja3JlbGlkID0gbmV3SW5kZXhSZWwt PnJkX2xvY2tJbmZvLmxvY2tSZWxJZDsKCQlyZWxhdGlvbkxvY2tzID0gbGFwcGVuZChyZWxh dGlvbkxvY2tzLCBsb2NrcmVsaWQpOwoKCQlNZW1vcnlDb250ZXh0U3dpdGNoVG8ob2xkY29u dGV4dCk7CgoJCWluZGV4X2Nsb3NlKGluZGV4UmVsLCBOb0xvY2spOwoJCWluZGV4X2Nsb3Nl KG5ld0luZGV4UmVsLCBOb0xvY2spOwoKCQkvKiBSb2xsIGJhY2sgYW55IEdVQyBjaGFuZ2Vz IGV4ZWN1dGVkIGJ5IGluZGV4IGZ1bmN0aW9ucyAqLwoJCUF0RU9YYWN0X0dVQyhmYWxzZSwg c2F2ZV9uZXN0bGV2ZWwpOwoKCQkvKiBSZXN0b3JlIHVzZXJpZCBhbmQgc2VjdXJpdHkgY29u dGV4dCAqLwoJCVNldFVzZXJJZEFuZFNlY0NvbnRleHQoc2F2ZV91c2VyaWQsIHNhdmVfc2Vj X2NvbnRleHQpOwoKCQl0YWJsZV9jbG9zZShoZWFwUmVsLCBOb0xvY2spOwoKCQkvKgoJCSAq IElmIGEgc3RhdGVtZW50IGlzIGF2YWlsYWJsZSwgdGVsbGluZyB0aGF0IHRoaXMgY29tZXMg ZnJvbSBhIFJFSU5ERVgKCQkgKiBjb21tYW5kLCBjb2xsZWN0IHRoZSBuZXcgaW5kZXggZm9y IGV2ZW50IHRyaWdnZXJzLgoJCSAqLwoJCWlmIChzdG10KQoJCXsKCQkJT2JqZWN0QWRkcmVz cyBhZGRyZXNzOwoKCQkJT2JqZWN0QWRkcmVzc1NldChhZGRyZXNzLCBSZWxhdGlvblJlbGF0 aW9uSWQsIG5ld0luZGV4SWQpOwoJCQlFdmVudFRyaWdnZXJDb2xsZWN0U2ltcGxlQ29tbWFu ZChhZGRyZXNzLAoJCQkJCQkJCQkJCSBJbnZhbGlkT2JqZWN0QWRkcmVzcywKCQkJCQkJCQkJ CQkgKGNvbnN0IE5vZGUgKikgc3RtdCk7CgkJfQoJfQoKCS8qCgkgKiBTYXZlIHRoZSBoZWFw IGxvY2sgZm9yIGZvbGxvd2luZyB2aXNpYmlsaXR5IGNoZWNrcyB3aXRoIG90aGVyIGJhY2tl bmRzCgkgKiBtaWdodCBjb25mbGljdCB3aXRoIHRoaXMgc2Vzc2lvbi4KCSAqLwoJZm9yZWFj aChsYywgaGVhcFJlbGF0aW9uSWRzKQoJewoJCVJlbGF0aW9uCWhlYXBSZWxhdGlvbiA9IHRh YmxlX29wZW4obGZpcnN0X29pZChsYyksIFNoYXJlVXBkYXRlRXhjbHVzaXZlTG9jayk7CgkJ TG9ja1JlbElkICAqbG9ja3JlbGlkOwoJCUxPQ0tUQUcgICAgKmhlYXBsb2NrdGFnOwoKCQkv KiBTYXZlIHRoZSBsaXN0IG9mIGxvY2tzIGluIHByaXZhdGUgY29udGV4dCAqLwoJCW9sZGNv bnRleHQgPSBNZW1vcnlDb250ZXh0U3dpdGNoVG8ocHJpdmF0ZV9jb250ZXh0KTsKCgkJLyog QWRkIGxvY2tyZWxpZCBvZiBoZWFwIHJlbGF0aW9uIHRvIHRoZSBsaXN0IG9mIGxvY2tlZCBy ZWxhdGlvbnMgKi8KCQlsb2NrcmVsaWQgPSBwYWxsb2Nfb2JqZWN0KExvY2tSZWxJZCk7CgkJ KmxvY2tyZWxpZCA9IGhlYXBSZWxhdGlvbi0+cmRfbG9ja0luZm8ubG9ja1JlbElkOwoJCXJl bGF0aW9uTG9ja3MgPSBsYXBwZW5kKHJlbGF0aW9uTG9ja3MsIGxvY2tyZWxpZCk7CgoJCWhl YXBsb2NrdGFnID0gcGFsbG9jX29iamVjdChMT0NLVEFHKTsKCgkJLyogU2F2ZSB0aGUgTE9D S1RBRyBmb3IgdGhpcyBwYXJlbnQgcmVsYXRpb24gZm9yIHRoZSB3YWl0IHBoYXNlICovCgkJ U0VUX0xPQ0tUQUdfUkVMQVRJT04oKmhlYXBsb2NrdGFnLCBsb2NrcmVsaWQtPmRiSWQsIGxv Y2tyZWxpZC0+cmVsSWQpOwoJCWxvY2tUYWdzID0gbGFwcGVuZChsb2NrVGFncywgaGVhcGxv Y2t0YWcpOwoKCQlNZW1vcnlDb250ZXh0U3dpdGNoVG8ob2xkY29udGV4dCk7CgoJCS8qIENs b3NlIGhlYXAgcmVsYXRpb24gKi8KCQl0YWJsZV9jbG9zZShoZWFwUmVsYXRpb24sIE5vTG9j ayk7Cgl9CgoJLyogR2V0IGEgc2Vzc2lvbi1sZXZlbCBsb2NrIG9uIGVhY2ggdGFibGUuICov Cglmb3JlYWNoKGxjLCByZWxhdGlvbkxvY2tzKQoJewoJCUxvY2tSZWxJZCAgKmxvY2tyZWxp ZCA9IChMb2NrUmVsSWQgKikgbGZpcnN0KGxjKTsKCgkJTG9ja1JlbGF0aW9uSWRGb3JTZXNz aW9uKGxvY2tyZWxpZCwgU2hhcmVVcGRhdGVFeGNsdXNpdmVMb2NrKTsKCX0KCglQb3BBY3Rp dmVTbmFwc2hvdCgpOwoJQ29tbWl0VHJhbnNhY3Rpb25Db21tYW5kKCk7CglTdGFydFRyYW5z YWN0aW9uQ29tbWFuZCgpOwoKCS8qCgkgKiBCZWNhdXNlIHdlIGRvbid0IHRha2UgYSBzbmFw c2hvdCBpbiB0aGlzIHRyYW5zYWN0aW9uLCB0aGVyZSdzIG5vIG5lZWQKCSAqIHRvIHNldCB0 aGUgUFJPQ19JTl9TQUZFX0lDIGZsYWcgaGVyZS4KCSAqLwoKCS8qCgkgKiBQaGFzZSAyIG9m IFJFSU5ERVggQ09OQ1VSUkVOVExZCgkgKgoJICogQnVpbGQgdGhlIG5ldyBpbmRleGVzIGlu IGEgc2VwYXJhdGUgdHJhbnNhY3Rpb24gZm9yIGVhY2ggaW5kZXggdG8gYXZvaWQKCSAqIGhh dmluZyBvcGVuIHRyYW5zYWN0aW9ucyBmb3IgYW4gdW5uZWNlc3NhcnkgbG9uZyB0aW1lLiAg QnV0IGJlZm9yZQoJICogZG9pbmcgdGhhdCwgd2FpdCB1bnRpbCBubyBydW5uaW5nIHRyYW5z YWN0aW9ucyBjb3VsZCBoYXZlIHRoZSB0YWJsZSBvZgoJICogdGhlIGluZGV4IG9wZW4gd2l0 aCB0aGUgb2xkIGxpc3Qgb2YgaW5kZXhlcy4gIFNlZSAicGhhc2UgMiIgaW4KCSAqIERlZmlu ZUluZGV4KCkgZm9yIG1vcmUgZGV0YWlscy4KCSAqLwoKCXBnc3RhdF9wcm9ncmVzc191cGRh dGVfcGFyYW0oUFJPR1JFU1NfQ1JFQVRFSURYX1BIQVNFLAoJCQkJCQkJCSBQUk9HUkVTU19D UkVBVEVJRFhfUEhBU0VfV0FJVF8xKTsKCVdhaXRGb3JMb2NrZXJzTXVsdGlwbGUobG9ja1Rh Z3MsIFNoYXJlTG9jaywgdHJ1ZSk7CglDb21taXRUcmFuc2FjdGlvbkNvbW1hbmQoKTsKCglm b3JlYWNoKGxjLCBuZXdJbmRleElkcykKCXsKCQlSZWluZGV4SW5kZXhJbmZvICpuZXdpZHgg PSBsZmlyc3QobGMpOwoKCQkvKiBTdGFydCBuZXcgdHJhbnNhY3Rpb24gZm9yIHRoaXMgaW5k ZXgncyBjb25jdXJyZW50IGJ1aWxkICovCgkJU3RhcnRUcmFuc2FjdGlvbkNvbW1hbmQoKTsK CgkJLyoKCQkgKiBDaGVjayBmb3IgdXNlci1yZXF1ZXN0ZWQgYWJvcnQuICBUaGlzIGlzIGlu c2lkZSBhIHRyYW5zYWN0aW9uIHNvIGFzCgkJICogeGFjdC5jIGRvZXMgbm90IGlzc3VlIGEg dXNlbGVzcyBXQVJOSU5HLCBhbmQgZW5zdXJlcyB0aGF0CgkJICogc2Vzc2lvbi1sZXZlbCBs b2NrcyBhcmUgY2xlYW5lZCB1cCBvbiBhYm9ydC4KCQkgKi8KCQlDSEVDS19GT1JfSU5URVJS VVBUUygpOwoKCQkvKiBUZWxsIGNvbmN1cnJlbnQgaW5kZXhpbmcgdG8gaWdub3JlIHVzLCBp ZiBpbmRleCBxdWFsaWZpZXMgKi8KCQlpZiAobmV3aWR4LT5zYWZlKQoJCQlzZXRfaW5kZXhz YWZlX3Byb2NmbGFncygpOwoKCQkvKiBTZXQgQWN0aXZlU25hcHNob3Qgc2luY2UgZnVuY3Rp b25zIGluIHRoZSBpbmRleGVzIG1heSBuZWVkIGl0ICovCgkJUHVzaEFjdGl2ZVNuYXBzaG90 KEdldFRyYW5zYWN0aW9uU25hcHNob3QoKSk7CgoJCS8qCgkJICogVXBkYXRlIHByb2dyZXNz IGZvciB0aGUgaW5kZXggdG8gYnVpbGQsIHdpdGggdGhlIGNvcnJlY3QgcGFyZW50CgkJICog dGFibGUgaW52b2x2ZWQuCgkJICovCgkJcGdzdGF0X3Byb2dyZXNzX3N0YXJ0X2NvbW1hbmQo UFJPR1JFU1NfQ09NTUFORF9DUkVBVEVfSU5ERVgsIG5ld2lkeC0+dGFibGVJZCk7CgkJcHJv Z3Jlc3NfdmFsc1swXSA9IFBST0dSRVNTX0NSRUFURUlEWF9DT01NQU5EX1JFSU5ERVhfQ09O Q1VSUkVOVExZOwoJCXByb2dyZXNzX3ZhbHNbMV0gPSBQUk9HUkVTU19DUkVBVEVJRFhfUEhB U0VfQlVJTEQ7CgkJcHJvZ3Jlc3NfdmFsc1syXSA9IG5ld2lkeC0+aW5kZXhJZDsKCQlwcm9n cmVzc192YWxzWzNdID0gbmV3aWR4LT5hbUlkOwoJCXBnc3RhdF9wcm9ncmVzc191cGRhdGVf bXVsdGlfcGFyYW0oNCwgcHJvZ3Jlc3NfaW5kZXgsIHByb2dyZXNzX3ZhbHMpOwoKCQkvKiBQ ZXJmb3JtIGNvbmN1cnJlbnQgYnVpbGQgb2YgbmV3IGluZGV4ICovCgkJaW5kZXhfY29uY3Vy cmVudGx5X2J1aWxkKG5ld2lkeC0+dGFibGVJZCwgbmV3aWR4LT5pbmRleElkKTsKCgkJUG9w QWN0aXZlU25hcHNob3QoKTsKCQlDb21taXRUcmFuc2FjdGlvbkNvbW1hbmQoKTsKCX0KCglT dGFydFRyYW5zYWN0aW9uQ29tbWFuZCgpOwoKCS8qCgkgKiBCZWNhdXNlIHdlIGRvbid0IHRh a2UgYSBzbmFwc2hvdCBvciBYaWQgaW4gdGhpcyB0cmFuc2FjdGlvbiwgdGhlcmUncyBubwoJ ICogbmVlZCB0byBzZXQgdGhlIFBST0NfSU5fU0FGRV9JQyBmbGFnIGhlcmUuCgkgKi8KCgkv KgoJICogUGhhc2UgMyBvZiBSRUlOREVYIENPTkNVUlJFTlRMWQoJICoKCSAqIER1cmluZyB0 aGlzIHBoYXNlIHRoZSBvbGQgaW5kZXhlcyBjYXRjaCB1cCB3aXRoIGFueSBuZXcgdHVwbGVz IHRoYXQKCSAqIHdlcmUgY3JlYXRlZCBkdXJpbmcgdGhlIHByZXZpb3VzIHBoYXNlLiAgU2Vl ICJwaGFzZSAzIiBpbiBEZWZpbmVJbmRleCgpCgkgKiBmb3IgbW9yZSBkZXRhaWxzLgoJICov CgoJcGdzdGF0X3Byb2dyZXNzX3VwZGF0ZV9wYXJhbShQUk9HUkVTU19DUkVBVEVJRFhfUEhB U0UsCgkJCQkJCQkJIFBST0dSRVNTX0NSRUFURUlEWF9QSEFTRV9XQUlUXzIpOwoJV2FpdEZv ckxvY2tlcnNNdWx0aXBsZShsb2NrVGFncywgU2hhcmVMb2NrLCB0cnVlKTsKCUNvbW1pdFRy YW5zYWN0aW9uQ29tbWFuZCgpOwoKCWZvcmVhY2gobGMsIG5ld0luZGV4SWRzKQoJewoJCVJl aW5kZXhJbmRleEluZm8gKm5ld2lkeCA9IGxmaXJzdChsYyk7CgkJVHJhbnNhY3Rpb25JZCBs aW1pdFhtaW47CgkJU25hcHNob3QJc25hcHNob3Q7CgoJCVN0YXJ0VHJhbnNhY3Rpb25Db21t YW5kKCk7CgoJCS8qCgkJICogQ2hlY2sgZm9yIHVzZXItcmVxdWVzdGVkIGFib3J0LiAgVGhp cyBpcyBpbnNpZGUgYSB0cmFuc2FjdGlvbiBzbyBhcwoJCSAqIHhhY3QuYyBkb2VzIG5vdCBp c3N1ZSBhIHVzZWxlc3MgV0FSTklORywgYW5kIGVuc3VyZXMgdGhhdAoJCSAqIHNlc3Npb24t bGV2ZWwgbG9ja3MgYXJlIGNsZWFuZWQgdXAgb24gYWJvcnQuCgkJICovCgkJQ0hFQ0tfRk9S X0lOVEVSUlVQVFMoKTsKCgkJLyogVGVsbCBjb25jdXJyZW50IGluZGV4aW5nIHRvIGlnbm9y ZSB1cywgaWYgaW5kZXggcXVhbGlmaWVzICovCgkJaWYgKG5ld2lkeC0+c2FmZSkKCQkJc2V0 X2luZGV4c2FmZV9wcm9jZmxhZ3MoKTsKCgkJLyoKCQkgKiBUYWtlIHRoZSAicmVmZXJlbmNl IHNuYXBzaG90IiB0aGF0IHdpbGwgYmUgdXNlZCBieSB2YWxpZGF0ZV9pbmRleCgpCgkJICog dG8gZmlsdGVyIGNhbmRpZGF0ZSB0dXBsZXMuCgkJICovCgkJc25hcHNob3QgPSBSZWdpc3Rl clNuYXBzaG90KEdldFRyYW5zYWN0aW9uU25hcHNob3QoKSk7CgkJUHVzaEFjdGl2ZVNuYXBz aG90KHNuYXBzaG90KTsKCgkJLyoKCQkgKiBVcGRhdGUgcHJvZ3Jlc3MgZm9yIHRoZSBpbmRl eCB0byBidWlsZCwgd2l0aCB0aGUgY29ycmVjdCBwYXJlbnQKCQkgKiB0YWJsZSBpbnZvbHZl ZC4KCQkgKi8KCQlwZ3N0YXRfcHJvZ3Jlc3Nfc3RhcnRfY29tbWFuZChQUk9HUkVTU19DT01N QU5EX0NSRUFURV9JTkRFWCwgbmV3aWR4LT50YWJsZUlkKTsKCQlwcm9ncmVzc192YWxzWzBd ID0gUFJPR1JFU1NfQ1JFQVRFSURYX0NPTU1BTkRfUkVJTkRFWF9DT05DVVJSRU5UTFk7CgkJ cHJvZ3Jlc3NfdmFsc1sxXSA9IFBST0dSRVNTX0NSRUFURUlEWF9QSEFTRV9WQUxJREFURV9J RFhTQ0FOOwoJCXByb2dyZXNzX3ZhbHNbMl0gPSBuZXdpZHgtPmluZGV4SWQ7CgkJcHJvZ3Jl c3NfdmFsc1szXSA9IG5ld2lkeC0+YW1JZDsKCQlwZ3N0YXRfcHJvZ3Jlc3NfdXBkYXRlX211 bHRpX3BhcmFtKDQsIHByb2dyZXNzX2luZGV4LCBwcm9ncmVzc192YWxzKTsKCgkJdmFsaWRh dGVfaW5kZXgobmV3aWR4LT50YWJsZUlkLCBuZXdpZHgtPmluZGV4SWQsIHNuYXBzaG90KTsK CgkJLyoKCQkgKiBXZSBjYW4gbm93IGRvIGF3YXkgd2l0aCBvdXIgYWN0aXZlIHNuYXBzaG90 LCB3ZSBzdGlsbCBuZWVkIHRvIHNhdmUKCQkgKiB0aGUgeG1pbiBsaW1pdCB0byB3YWl0IGZv ciBvbGRlciBzbmFwc2hvdHMuCgkJICovCgkJbGltaXRYbWluID0gc25hcHNob3QtPnhtaW47 CgoJCVBvcEFjdGl2ZVNuYXBzaG90KCk7CgkJVW5yZWdpc3RlclNuYXBzaG90KHNuYXBzaG90 KTsKCgkJLyoKCQkgKiBUbyBlbnN1cmUgbm8gZGVhZGxvY2tzLCB3ZSBtdXN0IGNvbW1pdCBh bmQgc3RhcnQgeWV0IGFub3RoZXIKCQkgKiB0cmFuc2FjdGlvbiwgYW5kIGRvIG91ciB3YWl0 IGJlZm9yZSBhbnkgc25hcHNob3QgaGFzIGJlZW4gdGFrZW4gaW4KCQkgKiBpdC4KCQkgKi8K CQlDb21taXRUcmFuc2FjdGlvbkNvbW1hbmQoKTsKCQlTdGFydFRyYW5zYWN0aW9uQ29tbWFu ZCgpOwoKCQkvKgoJCSAqIFRoZSBpbmRleCBpcyBub3cgdmFsaWQgaW4gdGhlIHNlbnNlIHRo YXQgaXQgY29udGFpbnMgYWxsIGN1cnJlbnRseQoJCSAqIGludGVyZXN0aW5nIHR1cGxlcy4g IEJ1dCBzaW5jZSBpdCBtaWdodCBub3QgY29udGFpbiB0dXBsZXMgZGVsZXRlZAoJCSAqIGp1 c3QgYmVmb3JlIHRoZSByZWZlcmVuY2Ugc25hcCB3YXMgdGFrZW4sIHdlIGhhdmUgdG8gd2Fp dCBvdXQgYW55CgkJICogdHJhbnNhY3Rpb25zIHRoYXQgbWlnaHQgaGF2ZSBvbGRlciBzbmFw c2hvdHMuCgkJICoKCQkgKiBCZWNhdXNlIHdlIGRvbid0IHRha2UgYSBzbmFwc2hvdCBvciBY aWQgaW4gdGhpcyB0cmFuc2FjdGlvbiwKCQkgKiB0aGVyZSdzIG5vIG5lZWQgdG8gc2V0IHRo ZSBQUk9DX0lOX1NBRkVfSUMgZmxhZyBoZXJlLgoJCSAqLwoJCXBnc3RhdF9wcm9ncmVzc191 cGRhdGVfcGFyYW0oUFJPR1JFU1NfQ1JFQVRFSURYX1BIQVNFLAoJCQkJCQkJCQkgUFJPR1JF U1NfQ1JFQVRFSURYX1BIQVNFX1dBSVRfMyk7CgkJV2FpdEZvck9sZGVyU25hcHNob3RzKGxp bWl0WG1pbiwgdHJ1ZSk7CgoJCUNvbW1pdFRyYW5zYWN0aW9uQ29tbWFuZCgpOwoJfQoKCS8q CgkgKiBQaGFzZSA0IG9mIFJFSU5ERVggQ09OQ1VSUkVOVExZCgkgKgoJICogTm93IHRoYXQg dGhlIG5ldyBpbmRleGVzIGhhdmUgYmVlbiB2YWxpZGF0ZWQsIHN3YXAgZWFjaCBuZXcgaW5k ZXggd2l0aAoJICogaXRzIGNvcnJlc3BvbmRpbmcgb2xkIGluZGV4LgoJICoKCSAqIFdlIG1h cmsgdGhlIG5ldyBpbmRleGVzIGFzIHZhbGlkIGFuZCB0aGUgb2xkIGluZGV4ZXMgYXMgbm90 IHZhbGlkIGF0CgkgKiB0aGUgc2FtZSB0aW1lIHRvIG1ha2Ugc3VyZSB3ZSBvbmx5IGdldCBj b25zdHJhaW50IHZpb2xhdGlvbnMgZnJvbSB0aGUKCSAqIGluZGV4ZXMgd2l0aCB0aGUgY29y cmVjdCBuYW1lcy4KCSAqLwoKCUlOSkVDVElPTl9QT0lOVCgicmVpbmRleC1yZWxhdGlvbi1j b25jdXJyZW50bHktYmVmb3JlLXN3YXAiLCBOVUxMKTsKCVN0YXJ0VHJhbnNhY3Rpb25Db21t YW5kKCk7CgoJLyoKCSAqIEJlY2F1c2UgdGhpcyB0cmFuc2FjdGlvbiBvbmx5IGRvZXMgY2F0 YWxvZyBtYW5pcHVsYXRpb25zIGFuZCBkb2Vzbid0IGRvCgkgKiBhbnkgaW5kZXggb3BlcmF0 aW9ucywgd2UgY2FuIHNldCB0aGUgUFJPQ19JTl9TQUZFX0lDIGZsYWcgaGVyZQoJICogdW5j b25kaXRpb25hbGx5LgoJICovCglzZXRfaW5kZXhzYWZlX3Byb2NmbGFncygpOwoKCWZvcmJv dGgobGMsIGluZGV4SWRzLCBsYzIsIG5ld0luZGV4SWRzKQoJewoJCVJlaW5kZXhJbmRleElu Zm8gKm9sZGlkeCA9IGxmaXJzdChsYyk7CgkJUmVpbmRleEluZGV4SW5mbyAqbmV3aWR4ID0g bGZpcnN0KGxjMik7CgkJY2hhcgkgICAqb2xkTmFtZTsKCgkJLyoKCQkgKiBDaGVjayBmb3Ig dXNlci1yZXF1ZXN0ZWQgYWJvcnQuICBUaGlzIGlzIGluc2lkZSBhIHRyYW5zYWN0aW9uIHNv IGFzCgkJICogeGFjdC5jIGRvZXMgbm90IGlzc3VlIGEgdXNlbGVzcyBXQVJOSU5HLCBhbmQg ZW5zdXJlcyB0aGF0CgkJICogc2Vzc2lvbi1sZXZlbCBsb2NrcyBhcmUgY2xlYW5lZCB1cCBv biBhYm9ydC4KCQkgKi8KCQlDSEVDS19GT1JfSU5URVJSVVBUUygpOwoKCQkvKiBDaG9vc2Ug YSByZWxhdGlvbiBuYW1lIGZvciBvbGQgaW5kZXggKi8KCQlvbGROYW1lID0gQ2hvb3NlUmVs YXRpb25OYW1lKGdldF9yZWxfbmFtZShvbGRpZHgtPmluZGV4SWQpLAoJCQkJCQkJCQkgTlVM TCwKCQkJCQkJCQkJICJjY29sZCIsCgkJCQkJCQkJCSBnZXRfcmVsX25hbWVzcGFjZShvbGRp ZHgtPnRhYmxlSWQpLAoJCQkJCQkJCQkgZmFsc2UpOwoKCQkvKgoJCSAqIFN3YXBwaW5nIHRo ZSBpbmRleGVzIG1pZ2h0IGludm9sdmUgVE9BU1QgdGFibGUgYWNjZXNzLCBzbyBlbnN1cmUg d2UKCQkgKiBoYXZlIGEgdmFsaWQgc25hcHNob3QuCgkJICovCgkJUHVzaEFjdGl2ZVNuYXBz aG90KEdldFRyYW5zYWN0aW9uU25hcHNob3QoKSk7CgoJCS8qCgkJICogU3dhcCBvbGQgaW5k ZXggd2l0aCB0aGUgbmV3IG9uZS4gIFRoaXMgYWxzbyBtYXJrcyB0aGUgbmV3IG9uZSBhcwoJ CSAqIHZhbGlkIGFuZCB0aGUgb2xkIG9uZSBhcyBub3QgdmFsaWQuCgkJICovCgkJaW5kZXhf Y29uY3VycmVudGx5X3N3YXAobmV3aWR4LT5pbmRleElkLCBvbGRpZHgtPmluZGV4SWQsIG9s ZE5hbWUpOwoKCQlQb3BBY3RpdmVTbmFwc2hvdCgpOwoKCQkvKgoJCSAqIEludmFsaWRhdGUg dGhlIHJlbGNhY2hlIGZvciB0aGUgdGFibGUsIHNvIHRoYXQgYWZ0ZXIgdGhpcyBjb21taXQK CQkgKiBhbGwgc2Vzc2lvbnMgd2lsbCByZWZyZXNoIGFueSBjYWNoZWQgcGxhbnMgdGhhdCBt aWdodCByZWZlcmVuY2UgdGhlCgkJICogaW5kZXguCgkJICovCgkJQ2FjaGVJbnZhbGlkYXRl UmVsY2FjaGVCeVJlbGlkKG9sZGlkeC0+dGFibGVJZCk7CgoJCS8qCgkJICogQ0NJIGhlcmUg c28gdGhhdCBzdWJzZXF1ZW50IGl0ZXJhdGlvbnMgc2VlIHRoZSBvbGROYW1lIGluIHRoZQoJ CSAqIGNhdGFsb2cgYW5kIGNhbiBjaG9vc2UgYSBub25jb25mbGljdGluZyBuYW1lIGZvciB0 aGVpciBvbGROYW1lLgoJCSAqIE90aGVyd2lzZSwgdGhpcyBjb3VsZCBsZWFkIHRvIGNvbmZs aWN0cyBpZiBhIHRhYmxlIGhhcyB0d28gaW5kZXhlcwoJCSAqIHdob3NlIG5hbWVzIGFyZSBl cXVhbCBmb3IgdGhlIGZpcnN0IE5BTUVEQVRBTEVOLW1pbnVzLWEtZmV3CgkJICogY2hhcmFj dGVycy4KCQkgKi8KCQlDb21tYW5kQ291bnRlckluY3JlbWVudCgpOwoJfQoKCS8qIENvbW1p dCB0aGlzIHRyYW5zYWN0aW9uIGFuZCBtYWtlIGluZGV4IHN3YXBzIHZpc2libGUgKi8KCUNv bW1pdFRyYW5zYWN0aW9uQ29tbWFuZCgpOwoJU3RhcnRUcmFuc2FjdGlvbkNvbW1hbmQoKTsK CgkvKgoJICogV2hpbGUgd2UgY291bGQgc2V0IFBST0NfSU5fU0FGRV9JQyBpZiBhbGwgaW5k ZXhlcyBxdWFsaWZpZWQsIHRoZXJlJ3Mgbm8KCSAqIHJlYWwgbmVlZCBmb3IgdGhhdCwgYmVj YXVzZSB3ZSBvbmx5IGFjcXVpcmUgYW4gWGlkIGFmdGVyIHRoZSB3YWl0IGlzCgkgKiBkb25l LCBhbmQgdGhhdCBsYXN0cyBmb3IgYSB2ZXJ5IHNob3J0IHBlcmlvZC4KCSAqLwoKCS8qCgkg KiBQaGFzZSA1IG9mIFJFSU5ERVggQ09OQ1VSUkVOVExZCgkgKgoJICogTWFyayB0aGUgb2xk IGluZGV4ZXMgYXMgZGVhZC4gIEZpcnN0IHdlIG11c3Qgd2FpdCB1bnRpbCBubyBydW5uaW5n CgkgKiB0cmFuc2FjdGlvbiBjb3VsZCBiZSB1c2luZyB0aGUgaW5kZXggZm9yIGEgcXVlcnku ICBTZWUgYWxzbwoJICogaW5kZXhfZHJvcCgpIGZvciBtb3JlIGRldGFpbHMuCgkgKi8KCglJ TkpFQ1RJT05fUE9JTlQoInJlaW5kZXgtcmVsYXRpb24tY29uY3VycmVudGx5LWJlZm9yZS1z ZXQtZGVhZCIsIE5VTEwpOwoJcGdzdGF0X3Byb2dyZXNzX3VwZGF0ZV9wYXJhbShQUk9HUkVT U19DUkVBVEVJRFhfUEhBU0UsCgkJCQkJCQkJIFBST0dSRVNTX0NSRUFURUlEWF9QSEFTRV9X QUlUXzQpOwoJV2FpdEZvckxvY2tlcnNNdWx0aXBsZShsb2NrVGFncywgQWNjZXNzRXhjbHVz aXZlTG9jaywgdHJ1ZSk7CgoJZm9yZWFjaChsYywgaW5kZXhJZHMpCgl7CgkJUmVpbmRleElu ZGV4SW5mbyAqb2xkaWR4ID0gbGZpcnN0KGxjKTsKCgkJLyoKCQkgKiBDaGVjayBmb3IgdXNl ci1yZXF1ZXN0ZWQgYWJvcnQuICBUaGlzIGlzIGluc2lkZSBhIHRyYW5zYWN0aW9uIHNvIGFz CgkJICogeGFjdC5jIGRvZXMgbm90IGlzc3VlIGEgdXNlbGVzcyBXQVJOSU5HLCBhbmQgZW5z dXJlcyB0aGF0CgkJICogc2Vzc2lvbi1sZXZlbCBsb2NrcyBhcmUgY2xlYW5lZCB1cCBvbiBh Ym9ydC4KCQkgKi8KCQlDSEVDS19GT1JfSU5URVJSVVBUUygpOwoKCQkvKgoJCSAqIFVwZGF0 aW5nIHBnX2luZGV4IG1pZ2h0IGludm9sdmUgVE9BU1QgdGFibGUgYWNjZXNzLCBzbyBlbnN1 cmUgd2UKCQkgKiBoYXZlIGEgdmFsaWQgc25hcHNob3QuCgkJICovCgkJUHVzaEFjdGl2ZVNu YXBzaG90KEdldFRyYW5zYWN0aW9uU25hcHNob3QoKSk7CgoJCWluZGV4X2NvbmN1cnJlbnRs eV9zZXRfZGVhZChvbGRpZHgtPnRhYmxlSWQsIG9sZGlkeC0+aW5kZXhJZCk7CgoJCVBvcEFj dGl2ZVNuYXBzaG90KCk7Cgl9CgoJLyogQ29tbWl0IHRoaXMgdHJhbnNhY3Rpb24gdG8gbWFr ZSB0aGUgdXBkYXRlcyB2aXNpYmxlLiAqLwoJQ29tbWl0VHJhbnNhY3Rpb25Db21tYW5kKCk7 CglTdGFydFRyYW5zYWN0aW9uQ29tbWFuZCgpOwoKCS8qCgkgKiBXaGlsZSB3ZSBjb3VsZCBz ZXQgUFJPQ19JTl9TQUZFX0lDIGlmIGFsbCBpbmRleGVzIHF1YWxpZmllZCwgdGhlcmUncyBu bwoJICogcmVhbCBuZWVkIGZvciB0aGF0LCBiZWNhdXNlIHdlIG9ubHkgYWNxdWlyZSBhbiBY aWQgYWZ0ZXIgdGhlIHdhaXQgaXMKCSAqIGRvbmUsIGFuZCB0aGF0IGxhc3RzIGZvciBhIHZl cnkgc2hvcnQgcGVyaW9kLgoJICovCgoJLyoKCSAqIFBoYXNlIDYgb2YgUkVJTkRFWCBDT05D VVJSRU5UTFkKCSAqCgkgKiBEcm9wIHRoZSBvbGQgaW5kZXhlcy4KCSAqLwoKCXBnc3RhdF9w cm9ncmVzc191cGRhdGVfcGFyYW0oUFJPR1JFU1NfQ1JFQVRFSURYX1BIQVNFLAoJCQkJCQkJ CSBQUk9HUkVTU19DUkVBVEVJRFhfUEhBU0VfV0FJVF81KTsKCVdhaXRGb3JMb2NrZXJzTXVs dGlwbGUobG9ja1RhZ3MsIEFjY2Vzc0V4Y2x1c2l2ZUxvY2ssIHRydWUpOwoKCVB1c2hBY3Rp dmVTbmFwc2hvdChHZXRUcmFuc2FjdGlvblNuYXBzaG90KCkpOwoKCXsKCQlPYmplY3RBZGRy ZXNzZXMgKm9iamVjdHMgPSBuZXdfb2JqZWN0X2FkZHJlc3NlcygpOwoKCQlmb3JlYWNoKGxj LCBpbmRleElkcykKCQl7CgkJCVJlaW5kZXhJbmRleEluZm8gKmlkeCA9IGxmaXJzdChsYyk7 CgkJCU9iamVjdEFkZHJlc3Mgb2JqZWN0OwoKCQkJb2JqZWN0LmNsYXNzSWQgPSBSZWxhdGlv blJlbGF0aW9uSWQ7CgkJCW9iamVjdC5vYmplY3RJZCA9IGlkeC0+aW5kZXhJZDsKCQkJb2Jq ZWN0Lm9iamVjdFN1YklkID0gMDsKCgkJCWFkZF9leGFjdF9vYmplY3RfYWRkcmVzcygmb2Jq ZWN0LCBvYmplY3RzKTsKCQl9CgoJCS8qCgkJICogVXNlIFBFUkZPUk1fREVMRVRJT05fQ09O Q1VSUkVOVF9MT0NLIHNvIHRoYXQgaW5kZXhfZHJvcCgpIHVzZXMgdGhlCgkJICogcmlnaHQg bG9jayBsZXZlbC4KCQkgKi8KCQlwZXJmb3JtTXVsdGlwbGVEZWxldGlvbnMob2JqZWN0cywg RFJPUF9SRVNUUklDVCwKCQkJCQkJCQkgUEVSRk9STV9ERUxFVElPTl9DT05DVVJSRU5UX0xP Q0sgfCBQRVJGT1JNX0RFTEVUSU9OX0lOVEVSTkFMKTsKCX0KCglQb3BBY3RpdmVTbmFwc2hv dCgpOwoJQ29tbWl0VHJhbnNhY3Rpb25Db21tYW5kKCk7CgoJLyoKCSAqIEZpbmFsbHksIHJl bGVhc2UgdGhlIHNlc3Npb24tbGV2ZWwgbG9jayBvbiB0aGUgdGFibGUuCgkgKi8KCWZvcmVh Y2gobGMsIHJlbGF0aW9uTG9ja3MpCgl7CgkJTG9ja1JlbElkICAqbG9ja3JlbGlkID0gKExv Y2tSZWxJZCAqKSBsZmlyc3QobGMpOwoKCQlVbmxvY2tSZWxhdGlvbklkRm9yU2Vzc2lvbihs b2NrcmVsaWQsIFNoYXJlVXBkYXRlRXhjbHVzaXZlTG9jayk7Cgl9CgoJLyogU3RhcnQgYSBu ZXcgdHJhbnNhY3Rpb24gdG8gZmluaXNoIHByb2Nlc3MgcHJvcGVybHkgKi8KCVN0YXJ0VHJh bnNhY3Rpb25Db21tYW5kKCk7CgoJLyogTG9nIHdoYXQgd2UgZGlkICovCglpZiAoKHBhcmFt cy0+b3B0aW9ucyAmIFJFSU5ERVhPUFRfVkVSQk9TRSkgIT0gMCkKCXsKCQlpZiAocmVsa2lu ZCA9PSBSRUxLSU5EX0lOREVYKQoJCQllcmVwb3J0KElORk8sCgkJCQkJKGVycm1zZygiaW5k ZXggXCIlcy4lc1wiIHdhcyByZWluZGV4ZWQiLAoJCQkJCQkJcmVsYXRpb25OYW1lc3BhY2Us IHJlbGF0aW9uTmFtZSksCgkJCQkJIGVycmRldGFpbCgiJXMuIiwKCQkJCQkJCSAgIHBnX3J1 c2FnZV9zaG93KCZydTApKSkpOwoJCWVsc2UKCQl7CgkJCWZvcmVhY2gobGMsIG5ld0luZGV4 SWRzKQoJCQl7CgkJCQlSZWluZGV4SW5kZXhJbmZvICppZHggPSBsZmlyc3QobGMpOwoJCQkJ T2lkCQkJaW5kT2lkID0gaWR4LT5pbmRleElkOwoKCQkJCWVyZXBvcnQoSU5GTywKCQkJCQkJ KGVycm1zZygiaW5kZXggXCIlcy4lc1wiIHdhcyByZWluZGV4ZWQiLAoJCQkJCQkJCWdldF9u YW1lc3BhY2VfbmFtZShnZXRfcmVsX25hbWVzcGFjZShpbmRPaWQpKSwKCQkJCQkJCQlnZXRf cmVsX25hbWUoaW5kT2lkKSkpKTsKCQkJCS8qIERvbid0IHNob3cgcnVzYWdlIGhlcmUsIHNp bmNlIGl0J3Mgbm90IHBlciBpbmRleC4gKi8KCQkJfQoKCQkJZXJlcG9ydChJTkZPLAoJCQkJ CShlcnJtc2coInRhYmxlIFwiJXMuJXNcIiB3YXMgcmVpbmRleGVkIiwKCQkJCQkJCXJlbGF0 aW9uTmFtZXNwYWNlLCByZWxhdGlvbk5hbWUpLAoJCQkJCSBlcnJkZXRhaWwoIiVzLiIsCgkJ CQkJCQkgICBwZ19ydXNhZ2Vfc2hvdygmcnUwKSkpKTsKCQl9Cgl9CgoJTWVtb3J5Q29udGV4 dERlbGV0ZShwcml2YXRlX2NvbnRleHQpOwoKCXBnc3RhdF9wcm9ncmVzc19lbmRfY29tbWFu ZCgpOwoKCXJldHVybiB0cnVlOwp9CgovKgogKiBJbnNlcnQgb3IgZGVsZXRlIGFuIGFwcHJv cHJpYXRlIHBnX2luaGVyaXRzIHR1cGxlIHRvIG1ha2UgdGhlIGdpdmVuIGluZGV4CiAqIGJl IGEgcGFydGl0aW9uIG9mIHRoZSBpbmRpY2F0ZWQgcGFyZW50IGluZGV4LgogKgogKiBUaGlz IGFsc28gY29ycmVjdHMgdGhlIHBnX2RlcGVuZCBpbmZvcm1hdGlvbiBmb3IgdGhlIGFmZmVj dGVkIGluZGV4LgogKi8Kdm9pZApJbmRleFNldFBhcmVudEluZGV4KFJlbGF0aW9uIHBhcnRp dGlvbklkeCwgT2lkIHBhcmVudE9pZCkKewoJUmVsYXRpb24JcGdfaW5oZXJpdHM7CglTY2Fu S2V5RGF0YSBrZXlbMl07CglTeXNTY2FuRGVzYyBzY2FuOwoJT2lkCQkJcGFydFJlbGlkID0g UmVsYXRpb25HZXRSZWxpZChwYXJ0aXRpb25JZHgpOwoJSGVhcFR1cGxlCXR1cGxlOwoJYm9v bAkJZml4X2RlcGVuZGVuY2llczsKCgkvKiBNYWtlIHN1cmUgdGhpcyBpcyBhbiBpbmRleCAq LwoJQXNzZXJ0KHBhcnRpdGlvbklkeC0+cmRfcmVsLT5yZWxraW5kID09IFJFTEtJTkRfSU5E RVggfHwKCQkgICBwYXJ0aXRpb25JZHgtPnJkX3JlbC0+cmVsa2luZCA9PSBSRUxLSU5EX1BB UlRJVElPTkVEX0lOREVYKTsKCgkvKgoJICogU2NhbiBwZ19pbmhlcml0cyBmb3Igcm93cyBs aW5raW5nIG91ciBpbmRleCB0byBzb21lIHBhcmVudC4KCSAqLwoJcGdfaW5oZXJpdHMgPSBy ZWxhdGlvbl9vcGVuKEluaGVyaXRzUmVsYXRpb25JZCwgUm93RXhjbHVzaXZlTG9jayk7CglT Y2FuS2V5SW5pdCgma2V5WzBdLAoJCQkJQW51bV9wZ19pbmhlcml0c19pbmhyZWxpZCwKCQkJ CUJURXF1YWxTdHJhdGVneU51bWJlciwgRl9PSURFUSwKCQkJCU9iamVjdElkR2V0RGF0dW0o cGFydFJlbGlkKSk7CglTY2FuS2V5SW5pdCgma2V5WzFdLAoJCQkJQW51bV9wZ19pbmhlcml0 c19pbmhzZXFubywKCQkJCUJURXF1YWxTdHJhdGVneU51bWJlciwgRl9JTlQ0RVEsCgkJCQlJ bnQzMkdldERhdHVtKDEpKTsKCXNjYW4gPSBzeXN0YWJsZV9iZWdpbnNjYW4ocGdfaW5oZXJp dHMsIEluaGVyaXRzUmVsaWRTZXFub0luZGV4SWQsIHRydWUsCgkJCQkJCQkgIE5VTEwsIDIs IGtleSk7Cgl0dXBsZSA9IHN5c3RhYmxlX2dldG5leHQoc2Nhbik7CgoJaWYgKCFIZWFwVHVw bGVJc1ZhbGlkKHR1cGxlKSkKCXsKCQlpZiAocGFyZW50T2lkID09IEludmFsaWRPaWQpCgkJ ewoJCQkvKgoJCQkgKiBObyBwZ19pbmhlcml0cyByb3csIGFuZCBubyBwYXJlbnQgd2FudGVk OiBub3RoaW5nIHRvIGRvIGluIHRoaXMKCQkJICogY2FzZS4KCQkJICovCgkJCWZpeF9kZXBl bmRlbmNpZXMgPSBmYWxzZTsKCQl9CgkJZWxzZQoJCXsKCQkJU3RvcmVTaW5nbGVJbmhlcml0 YW5jZShwYXJ0UmVsaWQsIHBhcmVudE9pZCwgMSk7CgkJCWZpeF9kZXBlbmRlbmNpZXMgPSB0 cnVlOwoJCX0KCX0KCWVsc2UKCXsKCQlGb3JtX3BnX2luaGVyaXRzIGluaEZvcm0gPSAoRm9y bV9wZ19pbmhlcml0cykgR0VUU1RSVUNUKHR1cGxlKTsKCgkJaWYgKHBhcmVudE9pZCA9PSBJ bnZhbGlkT2lkKQoJCXsKCQkJLyoKCQkJICogVGhlcmUgZXhpc3RzIGEgcGdfaW5oZXJpdHMg cm93LCB3aGljaCB3ZSB3YW50IHRvIGNsZWFyOyBkbyBzby4KCQkJICovCgkJCUNhdGFsb2dU dXBsZURlbGV0ZShwZ19pbmhlcml0cywgJnR1cGxlLT50X3NlbGYpOwoJCQlmaXhfZGVwZW5k ZW5jaWVzID0gdHJ1ZTsKCQl9CgkJZWxzZQoJCXsKCQkJLyoKCQkJICogQSBwZ19pbmhlcml0 cyByb3cgZXhpc3RzLiAgSWYgaXQncyB0aGUgc2FtZSB3ZSB3YW50LCB0aGVuIHdlJ3JlCgkJ CSAqIGdvb2Q7IGlmIGl0IGRpZmZlcnMsIHRoYXQgYW1vdW50cyB0byBhIGNvcnJ1cHQgY2F0 YWxvZyBhbmQKCQkJICogc2hvdWxkIG5vdCBoYXBwZW4uCgkJCSAqLwoJCQlpZiAoaW5oRm9y bS0+aW5ocGFyZW50ICE9IHBhcmVudE9pZCkKCQkJewoJCQkJLyogdW5leHBlY3RlZDogd2Ug c2hvdWxkIG5vdCBnZXQgY2FsbGVkIGluIHRoaXMgY2FzZSAqLwoJCQkJZWxvZyhFUlJPUiwg ImJvZ3VzIHBnX2luaGVyaXQgcm93OiBpbmhyZWxpZCAldSBpbmhwYXJlbnQgJXUiLAoJCQkJ CSBpbmhGb3JtLT5pbmhyZWxpZCwgaW5oRm9ybS0+aW5ocGFyZW50KTsKCQkJfQoKCQkJLyog YWxyZWFkeSBpbiB0aGUgcmlnaHQgc3RhdGUgKi8KCQkJZml4X2RlcGVuZGVuY2llcyA9IGZh bHNlOwoJCX0KCX0KCgkvKiBkb25lIHdpdGggcGdfaW5oZXJpdHMgKi8KCXN5c3RhYmxlX2Vu ZHNjYW4oc2Nhbik7CglyZWxhdGlvbl9jbG9zZShwZ19pbmhlcml0cywgUm93RXhjbHVzaXZl TG9jayk7CgoJLyogc2V0IHJlbGhhc3N1YmNsYXNzIGlmIGFuIGluZGV4IHBhcnRpdGlvbiBo YXMgYmVlbiBhZGRlZCB0byB0aGUgcGFyZW50ICovCglpZiAoT2lkSXNWYWxpZChwYXJlbnRP aWQpKQoJewoJCUxvY2tSZWxhdGlvbk9pZChwYXJlbnRPaWQsIFNoYXJlVXBkYXRlRXhjbHVz aXZlTG9jayk7CgkJU2V0UmVsYXRpb25IYXNTdWJjbGFzcyhwYXJlbnRPaWQsIHRydWUpOwoJ fQoKCS8qIHNldCByZWxpc3BhcnRpdGlvbiBjb3JyZWN0bHkgb24gdGhlIHBhcnRpdGlvbiAq LwoJdXBkYXRlX3JlbGlzcGFydGl0aW9uKHBhcnRSZWxpZCwgT2lkSXNWYWxpZChwYXJlbnRP aWQpKTsKCglpZiAoZml4X2RlcGVuZGVuY2llcykKCXsKCQkvKgoJCSAqIEluc2VydC9kZWxl dGUgcGdfZGVwZW5kIHJvd3MuICBJZiBzZXR0aW5nIGEgcGFyZW50LCBhZGQgUEFSVElUSU9O CgkJICogZGVwZW5kZW5jaWVzIG9uIHRoZSBwYXJlbnQgaW5kZXggYW5kIHRoZSB0YWJsZTsg aWYgcmVtb3ZpbmcgYQoJCSAqIHBhcmVudCwgZGVsZXRlIFBBUlRJVElPTiBkZXBlbmRlbmNp ZXMuCgkJICovCgkJaWYgKE9pZElzVmFsaWQocGFyZW50T2lkKSkKCQl7CgkJCU9iamVjdEFk ZHJlc3MgcGFydElkeDsKCQkJT2JqZWN0QWRkcmVzcyBwYXJlbnRJZHg7CgkJCU9iamVjdEFk ZHJlc3MgcGFydGl0aW9uVGJsOwoKCQkJT2JqZWN0QWRkcmVzc1NldChwYXJ0SWR4LCBSZWxh dGlvblJlbGF0aW9uSWQsIHBhcnRSZWxpZCk7CgkJCU9iamVjdEFkZHJlc3NTZXQocGFyZW50 SWR4LCBSZWxhdGlvblJlbGF0aW9uSWQsIHBhcmVudE9pZCk7CgkJCU9iamVjdEFkZHJlc3NT ZXQocGFydGl0aW9uVGJsLCBSZWxhdGlvblJlbGF0aW9uSWQsCgkJCQkJCQkgcGFydGl0aW9u SWR4LT5yZF9pbmRleC0+aW5kcmVsaWQpOwoJCQlyZWNvcmREZXBlbmRlbmN5T24oJnBhcnRJ ZHgsICZwYXJlbnRJZHgsCgkJCQkJCQkgICBERVBFTkRFTkNZX1BBUlRJVElPTl9QUkkpOwoJ CQlyZWNvcmREZXBlbmRlbmN5T24oJnBhcnRJZHgsICZwYXJ0aXRpb25UYmwsCgkJCQkJCQkg ICBERVBFTkRFTkNZX1BBUlRJVElPTl9TRUMpOwoJCX0KCQllbHNlCgkJewoJCQlkZWxldGVE ZXBlbmRlbmN5UmVjb3Jkc0ZvckNsYXNzKFJlbGF0aW9uUmVsYXRpb25JZCwgcGFydFJlbGlk LAoJCQkJCQkJCQkJCVJlbGF0aW9uUmVsYXRpb25JZCwKCQkJCQkJCQkJCQlERVBFTkRFTkNZ X1BBUlRJVElPTl9QUkkpOwoJCQlkZWxldGVEZXBlbmRlbmN5UmVjb3Jkc0ZvckNsYXNzKFJl bGF0aW9uUmVsYXRpb25JZCwgcGFydFJlbGlkLAoJCQkJCQkJCQkJCVJlbGF0aW9uUmVsYXRp b25JZCwKCQkJCQkJCQkJCQlERVBFTkRFTkNZX1BBUlRJVElPTl9TRUMpOwoJCX0KCgkJLyog bWFrZSBvdXIgdXBkYXRlcyB2aXNpYmxlICovCgkJQ29tbWFuZENvdW50ZXJJbmNyZW1lbnQo KTsKCX0KfQoKLyoKICogU3Vicm91dGluZSBvZiBJbmRleFNldFBhcmVudEluZGV4IHRvIHVw ZGF0ZSB0aGUgcmVsaXNwYXJ0aXRpb24gZmxhZyBvZiB0aGUKICogZ2l2ZW4gaW5kZXggdG8g dGhlIGdpdmVuIHZhbHVlLgogKi8Kc3RhdGljIHZvaWQKdXBkYXRlX3JlbGlzcGFydGl0aW9u KE9pZCByZWxhdGlvbklkLCBib29sIG5ld3ZhbCkKewoJSGVhcFR1cGxlCXR1cDsKCVJlbGF0 aW9uCWNsYXNzUmVsOwoJSXRlbVBvaW50ZXJEYXRhIG90aWQ7CgoJY2xhc3NSZWwgPSB0YWJs ZV9vcGVuKFJlbGF0aW9uUmVsYXRpb25JZCwgUm93RXhjbHVzaXZlTG9jayk7Cgl0dXAgPSBT ZWFyY2hTeXNDYWNoZUxvY2tlZENvcHkxKFJFTE9JRCwgT2JqZWN0SWRHZXREYXR1bShyZWxh dGlvbklkKSk7CglpZiAoIUhlYXBUdXBsZUlzVmFsaWQodHVwKSkKCQllbG9nKEVSUk9SLCAi Y2FjaGUgbG9va3VwIGZhaWxlZCBmb3IgcmVsYXRpb24gJXUiLCByZWxhdGlvbklkKTsKCW90 aWQgPSB0dXAtPnRfc2VsZjsKCUFzc2VydCgoKEZvcm1fcGdfY2xhc3MpIEdFVFNUUlVDVCh0 dXApKS0+cmVsaXNwYXJ0aXRpb24gIT0gbmV3dmFsKTsKCSgoRm9ybV9wZ19jbGFzcykgR0VU U1RSVUNUKHR1cCkpLT5yZWxpc3BhcnRpdGlvbiA9IG5ld3ZhbDsKCUNhdGFsb2dUdXBsZVVw ZGF0ZShjbGFzc1JlbCwgJm90aWQsIHR1cCk7CglVbmxvY2tUdXBsZShjbGFzc1JlbCwgJm90 aWQsIElucGxhY2VVcGRhdGVUdXBsZUxvY2spOwoJaGVhcF9mcmVldHVwbGUodHVwKTsKCXRh YmxlX2Nsb3NlKGNsYXNzUmVsLCBSb3dFeGNsdXNpdmVMb2NrKTsKfQoKLyoKICogU2V0IHRo ZSBQUk9DX0lOX1NBRkVfSUMgZmxhZyBpbiBNeVByb2MtPnN0YXR1c0ZsYWdzLgogKgogKiBX aGVuIGRvaW5nIGNvbmN1cnJlbnQgaW5kZXggYnVpbGRzLCB3ZSBjYW4gc2V0IHRoaXMgZmxh ZwogKiB0byB0ZWxsIG90aGVyIHByb2Nlc3NlcyBjb25jdXJyZW50bHkgcnVubmluZyBDUkVB VEUKICogSU5ERVggQ09OQ1VSUkVOVExZIG9yIFJFSU5ERVggQ09OQ1VSUkVOVExZIHRvIGln bm9yZSB1cyB3aGVuCiAqIGRvaW5nIHRoZWlyIHdhaXRzIGZvciBjb25jdXJyZW50IHNuYXBz aG90cy4gIE9uIG9uZSBoYW5kIGl0CiAqIGF2b2lkcyBwb2ludGxlc3NseSB3YWl0aW5nIGZv ciBhIHByb2Nlc3MgdGhhdCdzIG5vdCBpbnRlcmVzdGluZwogKiBhbnl3YXk7IGJ1dCBtb3Jl IGltcG9ydGFudGx5IGl0IGF2b2lkcyBkZWFkbG9ja3MgaW4gc29tZSBjYXNlcy4KICoKICog VGhpcyBjYW4gYmUgZG9uZSBzYWZlbHkgb25seSBmb3IgaW5kZXhlcyB0aGF0IGRvbid0IGV4 ZWN1dGUgYW55CiAqIGV4cHJlc3Npb25zIHRoYXQgY291bGQgYWNjZXNzIG90aGVyIHRhYmxl cywgc28gaW5kZXggbXVzdCBub3QgYmUKICogZXhwcmVzc2lvbmFsIG5vciBwYXJ0aWFsLiAg Q2FsbGVyIGlzIHJlc3BvbnNpYmxlIGZvciBvbmx5IGNhbGxpbmcKICogdGhpcyByb3V0aW5l IHdoZW4gdGhhdCBhc3N1bXB0aW9uIGhvbGRzIHRydWUuCiAqCiAqIChUaGUgZmxhZyBpcyBy ZXNldCBhdXRvbWF0aWNhbGx5IGF0IHRyYW5zYWN0aW9uIGVuZCwgc28gaXQgbXVzdCBiZQog KiBzZXQgZm9yIGVhY2ggdHJhbnNhY3Rpb24uKQogKi8Kc3RhdGljIGlubGluZSB2b2lkCnNl dF9pbmRleHNhZmVfcHJvY2ZsYWdzKHZvaWQpCnsKCS8qCgkgKiBUaGlzIHNob3VsZCBvbmx5 IGJlIGNhbGxlZCBiZWZvcmUgaW5zdGFsbGluZyB4aWQgb3IgeG1pbiBpbiBNeVByb2M7Cgkg KiBvdGhlcndpc2UsIGNvbmN1cnJlbnQgcHJvY2Vzc2VzIGNvdWxkIHNlZSBhbiBYbWluIHRo YXQgbW92ZXMgYmFja3dhcmRzLgoJICovCglBc3NlcnQoTXlQcm9jLT54aWQgPT0gSW52YWxp ZFRyYW5zYWN0aW9uSWQgJiYKCQkgICBNeVByb2MtPnhtaW4gPT0gSW52YWxpZFRyYW5zYWN0 aW9uSWQpOwoKCUxXTG9ja0FjcXVpcmUoUHJvY0FycmF5TG9jaywgTFdfRVhDTFVTSVZFKTsK CU15UHJvYy0+c3RhdHVzRmxhZ3MgfD0gUFJPQ19JTl9TQUZFX0lDOwoJUHJvY0dsb2JhbC0+ c3RhdHVzRmxhZ3NbTXlQcm9jLT5wZ3hhY3RvZmZdID0gTXlQcm9jLT5zdGF0dXNGbGFnczsK CUxXTG9ja1JlbGVhc2UoUHJvY0FycmF5TG9jayk7Cn0KAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAC4vaW5kZXhpbmcuYwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAwMDAwNjY0ADAwMDE3NTAAMDAwMTc1MAAwMDAwMDAyNTUxMQAxNTIyMTE0NDY3 MAAwMTE2NjQAIDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAdXN0YXIgIAB4bWFuAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHhtYW4AAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALyotLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tCiAqCiAqIGluZGV4aW5nLmMKICoJICBUaGlzIGZpbGUgY29udGFpbnMgcm91 dGluZXMgdG8gc3VwcG9ydCBpbmRleGVzIGRlZmluZWQgb24gc3lzdGVtCiAqCSAgY2F0YWxv Z3MuCiAqCiAqIFBvcnRpb25zIENvcHlyaWdodCAoYykgMTk5Ni0yMDI2LCBQb3N0Z3JlU1FM IEdsb2JhbCBEZXZlbG9wbWVudCBHcm91cAogKiBQb3J0aW9ucyBDb3B5cmlnaHQgKGMpIDE5 OTQsIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYQogKgogKgogKiBJ REVOVElGSUNBVElPTgogKgkgIHNyYy9iYWNrZW5kL2NhdGFsb2cvaW5kZXhpbmcuYwogKgog Ki0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0KICovCiNpbmNsdWRlICJwb3N0Z3Jlcy5oIgoKI2luY2x1 ZGUgImFjY2Vzcy9nZW5hbS5oIgojaW5jbHVkZSAiYWNjZXNzL2hlYXBhbS5oIgojaW5jbHVk ZSAiYWNjZXNzL2h0dXBfZGV0YWlscy5oIgojaW5jbHVkZSAiYWNjZXNzL3hhY3QuaCIKI2lu Y2x1ZGUgImNhdGFsb2cvaW5kZXguaCIKI2luY2x1ZGUgImNhdGFsb2cvaW5kZXhpbmcuaCIK I2luY2x1ZGUgImV4ZWN1dG9yL2V4ZWN1dG9yLmgiCiNpbmNsdWRlICJ1dGlscy9yZWwuaCIK CgovKgogKiBDYXRhbG9nT3BlbkluZGV4ZXMgLSBvcGVuIHRoZSBpbmRleGVzIG9uIGEgc3lz dGVtIGNhdGFsb2cuCiAqCiAqIFdoZW4gaW5zZXJ0aW5nIG9yIHVwZGF0aW5nIHR1cGxlcyBp biBhIHN5c3RlbSBjYXRhbG9nLCBjYWxsIHRoaXMKICogdG8gcHJlcGFyZSB0byB1cGRhdGUg dGhlIGluZGV4ZXMgZm9yIHRoZSBjYXRhbG9nLgogKgogKiBJbiB0aGUgY3VycmVudCBpbXBs ZW1lbnRhdGlvbiwgd2Ugc2hhcmUgY29kZSBmb3Igb3BlbmluZy9jbG9zaW5nIHRoZQogKiBp bmRleGVzIHdpdGggZXhlY1V0aWxzLmMuICBCdXQgd2UgZG8gbm90IHVzZSBFeGVjSW5zZXJ0 SW5kZXhUdXBsZXMsCiAqIGJlY2F1c2Ugd2UgZG9uJ3Qgd2FudCB0byBjcmVhdGUgYW4gRVN0 YXRlLiAgVGhpcyBpbXBsaWVzIHRoYXQgd2UKICogZG8gbm90IHN1cHBvcnQgcGFydGlhbCBv ciBleHByZXNzaW9uYWwgaW5kZXhlcyBvbiBzeXN0ZW0gY2F0YWxvZ3MsCiAqIG5vciBjYW4g d2Ugc3VwcG9ydCBnZW5lcmFsaXplZCBleGNsdXNpb24gY29uc3RyYWludHMuCiAqIFRoaXMg Y291bGQgYmUgZml4ZWQgd2l0aCBsb2NhbGl6ZWQgY2hhbmdlcyBoZXJlIGlmIHdlIHdhbnRl ZCB0byBwYXkKICogdGhlIGV4dHJhIG92ZXJoZWFkIG9mIGJ1aWxkaW5nIGFuIEVTdGF0ZS4K ICovCkNhdGFsb2dJbmRleFN0YXRlCkNhdGFsb2dPcGVuSW5kZXhlcyhSZWxhdGlvbiBoZWFw UmVsKQp7CglSZXN1bHRSZWxJbmZvICpyZXN1bHRSZWxJbmZvOwoKCXJlc3VsdFJlbEluZm8g PSBtYWtlTm9kZShSZXN1bHRSZWxJbmZvKTsKCXJlc3VsdFJlbEluZm8tPnJpX1JhbmdlVGFi bGVJbmRleCA9IDA7CS8qIGR1bW15ICovCglyZXN1bHRSZWxJbmZvLT5yaV9SZWxhdGlvbkRl c2MgPSBoZWFwUmVsOwoJcmVzdWx0UmVsSW5mby0+cmlfVHJpZ0Rlc2MgPSBOVUxMOwkvKiB3 ZSBkb24ndCBmaXJlIHRyaWdnZXJzICovCgoJRXhlY09wZW5JbmRpY2VzKHJlc3VsdFJlbElu Zm8sIGZhbHNlKTsKCglyZXR1cm4gcmVzdWx0UmVsSW5mbzsKfQoKLyoKICogQ2F0YWxvZ0Ns b3NlSW5kZXhlcyAtIGNsZWFuIHVwIHJlc291cmNlcyBhbGxvY2F0ZWQgYnkgQ2F0YWxvZ09w ZW5JbmRleGVzCiAqLwp2b2lkCkNhdGFsb2dDbG9zZUluZGV4ZXMoQ2F0YWxvZ0luZGV4U3Rh dGUgaW5kc3RhdGUpCnsKCUV4ZWNDbG9zZUluZGljZXMoaW5kc3RhdGUpOwoJcGZyZWUoaW5k c3RhdGUpOwp9CgovKgogKiBDYXRhbG9nSW5kZXhJbnNlcnQgLSBpbnNlcnQgaW5kZXggZW50 cmllcyBmb3Igb25lIGNhdGFsb2cgdHVwbGUKICoKICogVGhpcyBzaG91bGQgYmUgY2FsbGVk IGZvciBlYWNoIGluc2VydGVkIG9yIHVwZGF0ZWQgY2F0YWxvZyB0dXBsZS4KICoKICogVGhp cyBpcyBlZmZlY3RpdmVseSBhIGN1dC1kb3duIHZlcnNpb24gb2YgRXhlY0luc2VydEluZGV4 VHVwbGVzLgogKi8Kc3RhdGljIHZvaWQKQ2F0YWxvZ0luZGV4SW5zZXJ0KENhdGFsb2dJbmRl eFN0YXRlIGluZHN0YXRlLCBIZWFwVHVwbGUgaGVhcFR1cGxlLAoJCQkJICAgVFVfVXBkYXRl SW5kZXhlcyB1cGRhdGVJbmRleGVzKQp7CglpbnQJCQlpOwoJaW50CQkJbnVtSW5kZXhlczsK CVJlbGF0aW9uUHRyIHJlbGF0aW9uRGVzY3M7CglSZWxhdGlvbgloZWFwUmVsYXRpb247CglU dXBsZVRhYmxlU2xvdCAqc2xvdDsKCUluZGV4SW5mbyAqKmluZGV4SW5mb0FycmF5OwoJRGF0 dW0JCXZhbHVlc1tJTkRFWF9NQVhfS0VZU107Cglib29sCQlpc251bGxbSU5ERVhfTUFYX0tF WVNdOwoJYm9vbAkJb25seVN1bW1hcml6ZWQgPSAodXBkYXRlSW5kZXhlcyA9PSBUVV9TdW1t YXJpemluZyk7CgoJLyoKCSAqIEhPVCB1cGRhdGUgZG9lcyBub3QgcmVxdWlyZSBpbmRleCBp bnNlcnRzLiBCdXQgd2l0aCBhc3NlcnRzIGVuYWJsZWQgd2UKCSAqIHdhbnQgdG8gY2hlY2sg dGhhdCBpdCdkIGJlIGxlZ2FsIHRvIGN1cnJlbnRseSBpbnNlcnQgaW50byB0aGUKCSAqIHRh YmxlL2luZGV4LgoJICovCiNpZm5kZWYgVVNFX0FTU0VSVF9DSEVDS0lORwoJaWYgKEhlYXBU dXBsZUlzSGVhcE9ubHkoaGVhcFR1cGxlKSAmJiAhb25seVN1bW1hcml6ZWQpCgkJcmV0dXJu OwojZW5kaWYKCgkvKiBXaGVuIG9ubHkgdXBkYXRpbmcgc3VtbWFyaXplZCBpbmRleGVzLCB0 aGUgdHVwbGUgaGFzIHRvIGJlIEhPVC4gKi8KCUFzc2VydCgoIW9ubHlTdW1tYXJpemVkKSB8 fCBIZWFwVHVwbGVJc0hlYXBPbmx5KGhlYXBUdXBsZSkpOwoKCS8qCgkgKiBHZXQgaW5mb3Jt YXRpb24gZnJvbSB0aGUgc3RhdGUgc3RydWN0dXJlLiAgRmFsbCBvdXQgaWYgbm90aGluZyB0 byBkby4KCSAqLwoJbnVtSW5kZXhlcyA9IGluZHN0YXRlLT5yaV9OdW1JbmRpY2VzOwoJaWYg KG51bUluZGV4ZXMgPT0gMCkKCQlyZXR1cm47CglyZWxhdGlvbkRlc2NzID0gaW5kc3RhdGUt PnJpX0luZGV4UmVsYXRpb25EZXNjczsKCWluZGV4SW5mb0FycmF5ID0gaW5kc3RhdGUtPnJp X0luZGV4UmVsYXRpb25JbmZvOwoJaGVhcFJlbGF0aW9uID0gaW5kc3RhdGUtPnJpX1JlbGF0 aW9uRGVzYzsKCgkvKiBOZWVkIGEgc2xvdCB0byBob2xkIHRoZSB0dXBsZSBiZWluZyBleGFt aW5lZCAqLwoJc2xvdCA9IE1ha2VTaW5nbGVUdXBsZVRhYmxlU2xvdChSZWxhdGlvbkdldERl c2NyKGhlYXBSZWxhdGlvbiksCgkJCQkJCQkJCSZUVFNPcHNIZWFwVHVwbGUpOwoJRXhlY1N0 b3JlSGVhcFR1cGxlKGhlYXBUdXBsZSwgc2xvdCwgZmFsc2UpOwoKCS8qCgkgKiBmb3IgZWFj aCBpbmRleCwgZm9ybSBhbmQgaW5zZXJ0IHRoZSBpbmRleCB0dXBsZQoJICovCglmb3IgKGkg PSAwOyBpIDwgbnVtSW5kZXhlczsgaSsrKQoJewoJCUluZGV4SW5mbyAgKmluZGV4SW5mbzsK CQlSZWxhdGlvbglpbmRleDsKCgkJaW5kZXhJbmZvID0gaW5kZXhJbmZvQXJyYXlbaV07CgkJ aW5kZXggPSByZWxhdGlvbkRlc2NzW2ldOwoKCQkvKiBJZiB0aGUgaW5kZXggaXMgbWFya2Vk IGFzIHJlYWQtb25seSwgaWdub3JlIGl0ICovCgkJaWYgKCFpbmRleEluZm8tPmlpX1JlYWR5 Rm9ySW5zZXJ0cykKCQkJY29udGludWU7CgoJCS8qCgkJICogRXhwcmVzc2lvbmFsIGFuZCBw YXJ0aWFsIGluZGV4ZXMgb24gc3lzdGVtIGNhdGFsb2dzIGFyZSBub3QKCQkgKiBzdXBwb3J0 ZWQsIG5vciBleGNsdXNpb24gY29uc3RyYWludHMsIG5vciBkZWZlcnJlZCB1bmlxdWVuZXNz CgkJICovCgkJQXNzZXJ0KGluZGV4SW5mby0+aWlfRXhwcmVzc2lvbnMgPT0gTklMKTsKCQlB c3NlcnQoaW5kZXhJbmZvLT5paV9FeHByZXNzaW9uc0V4cGFuZCA9PSBOSUwpOwoJCUFzc2Vy dChpbmRleEluZm8tPmlpX1ByZWRpY2F0ZSA9PSBOSUwpOwoJCUFzc2VydChpbmRleEluZm8t PmlpX1ByZWRpY2F0ZUV4cGFuZCA9PSBOSUwpOwoJCUFzc2VydChpbmRleEluZm8tPmlpX0V4 Y2x1c2lvbk9wcyA9PSBOVUxMKTsKCQlBc3NlcnQoaW5kZXgtPnJkX2luZGV4LT5pbmRpbW1l ZGlhdGUpOwoJCUFzc2VydChpbmRleEluZm8tPmlpX051bUluZGV4S2V5QXR0cnMgIT0gMCk7 CgoJCS8qIHNlZSBlYXJsaWVyIGNoZWNrIGFib3ZlICovCiNpZmRlZiBVU0VfQVNTRVJUX0NI RUNLSU5HCgkJaWYgKEhlYXBUdXBsZUlzSGVhcE9ubHkoaGVhcFR1cGxlKSAmJiAhb25seVN1 bW1hcml6ZWQpCgkJewoJCQlBc3NlcnQoIVJlaW5kZXhJc1Byb2Nlc3NpbmdJbmRleChSZWxh dGlvbkdldFJlbGlkKGluZGV4KSkpOwoJCQljb250aW51ZTsKCQl9CiNlbmRpZgkJCQkJCQkv KiBVU0VfQVNTRVJUX0NIRUNLSU5HICovCgoJCS8qCgkJICogU2tpcCBpbnNlcnRpb25zIGlu dG8gbm9uLXN1bW1hcml6aW5nIGluZGV4ZXMgaWYgd2Ugb25seSBuZWVkIHRvCgkJICogdXBk YXRlIHN1bW1hcml6aW5nIGluZGV4ZXMuCgkJICovCgkJaWYgKG9ubHlTdW1tYXJpemVkICYm ICFpbmRleEluZm8tPmlpX1N1bW1hcml6aW5nKQoJCQljb250aW51ZTsKCgkJLyoKCQkgKiBG b3JtSW5kZXhEYXR1bSBmaWxscyBpbiBpdHMgdmFsdWVzIGFuZCBpc251bGwgcGFyYW1ldGVy cyB3aXRoIHRoZQoJCSAqIGFwcHJvcHJpYXRlIHZhbHVlcyBmb3IgdGhlIGNvbHVtbihzKSBv ZiB0aGUgaW5kZXguCgkJICovCgkJRm9ybUluZGV4RGF0dW0oaW5kZXhJbmZvLAoJCQkJCSAg IHNsb3QsCgkJCQkJICAgTlVMTCwJLyogbm8gZXhwcmVzc2lvbiBldmFsIHRvIGRvICovCgkJ CQkJICAgdmFsdWVzLAoJCQkJCSAgIGlzbnVsbCk7CgoJCS8qCgkJICogVGhlIGluZGV4IEFN IGRvZXMgdGhlIHJlc3QuCgkJICovCgkJaW5kZXhfaW5zZXJ0KGluZGV4LAkJLyogaW5kZXgg cmVsYXRpb24gKi8KCQkJCQkgdmFsdWVzLAkvKiBhcnJheSBvZiBpbmRleCBEYXR1bXMgKi8K CQkJCQkgaXNudWxsLAkvKiBpcy1udWxsIGZsYWdzICovCgkJCQkJICYoaGVhcFR1cGxlLT50 X3NlbGYpLAkvKiB0aWQgb2YgaGVhcCB0dXBsZSAqLwoJCQkJCSBoZWFwUmVsYXRpb24sCgkJ CQkJIGluZGV4LT5yZF9pbmRleC0+aW5kaXN1bmlxdWUgPwoJCQkJCSBVTklRVUVfQ0hFQ0tf WUVTIDogVU5JUVVFX0NIRUNLX05PLAoJCQkJCSBmYWxzZSwKCQkJCQkgaW5kZXhJbmZvKTsK CX0KCglFeGVjRHJvcFNpbmdsZVR1cGxlVGFibGVTbG90KHNsb3QpOwp9CgovKgogKiBTdWJy b3V0aW5lIHRvIHZlcmlmeSB0aGF0IGNhdGFsb2cgY29uc3RyYWludHMgYXJlIGhvbm9yZWQu CiAqCiAqIFR1cGxlcyBpbnNlcnRlZCB2aWEgQ2F0YWxvZ1R1cGxlSW5zZXJ0L0NhdGFsb2dU dXBsZVVwZGF0ZSBhcmUgZ2VuZXJhbGx5CiAqICJoYW5kIG1hZGUiLCBzbyB0aGF0IGl0J3Mg cG9zc2libGUgdGhhdCB0aGV5IGZhaWwgdG8gc2F0aXNmeSBjb25zdHJhaW50cwogKiB0aGF0 IHdvdWxkIGJlIGNoZWNrZWQgaWYgdGhleSB3ZXJlIGJlaW5nIGluc2VydGVkIGJ5IHRoZSBl eGVjdXRvci4gIFRoYXQncwogKiBhIGNvZGluZyBlcnJvciwgc28gd2Ugb25seSBib3RoZXIg dG8gY2hlY2sgZm9yIGl0IGluIGFzc2VydC1lbmFibGVkIGJ1aWxkcy4KICovCiNpZmRlZiBV U0VfQVNTRVJUX0NIRUNLSU5HCgpzdGF0aWMgdm9pZApDYXRhbG9nVHVwbGVDaGVja0NvbnN0 cmFpbnRzKFJlbGF0aW9uIGhlYXBSZWwsIEhlYXBUdXBsZSB0dXApCnsKCS8qCgkgKiBDdXJy ZW50bHksIHRoZSBvbmx5IGNvbnN0cmFpbnRzIGltcGxlbWVudGVkIGZvciBzeXN0ZW0gY2F0 YWxvZ3MgYXJlCgkgKiBhdHRub3RudWxsIGNvbnN0cmFpbnRzLgoJICovCglpZiAoSGVhcFR1 cGxlSGFzTnVsbHModHVwKSkKCXsKCQlUdXBsZURlc2MJdHVwZGVzYyA9IFJlbGF0aW9uR2V0 RGVzY3IoaGVhcFJlbCk7CgkJdWludDgJICAgKmJwID0gdHVwLT50X2RhdGEtPnRfYml0czsK CgkJZm9yIChpbnQgYXR0bnVtID0gMDsgYXR0bnVtIDwgdHVwZGVzYy0+bmF0dHM7IGF0dG51 bSsrKQoJCXsKCQkJRm9ybV9wZ19hdHRyaWJ1dGUgdGhpc2F0dCA9IFR1cGxlRGVzY0F0dHIo dHVwZGVzYywgYXR0bnVtKTsKCgkJCUFzc2VydCghKHRoaXNhdHQtPmF0dG5vdG51bGwgJiYg YXR0X2lzbnVsbChhdHRudW0sIGJwKSkpOwoJCX0KCX0KfQoKI2Vsc2UJCQkJCQkJLyogIVVT RV9BU1NFUlRfQ0hFQ0tJTkcgKi8KCiNkZWZpbmUgQ2F0YWxvZ1R1cGxlQ2hlY2tDb25zdHJh aW50cyhoZWFwUmVsLCB0dXApICAoKHZvaWQpIDApCgojZW5kaWYJCQkJCQkJLyogVVNFX0FT U0VSVF9DSEVDS0lORyAqLwoKLyoKICogQ2F0YWxvZ1R1cGxlSW5zZXJ0IC0gZG8gaGVhcCBh bmQgaW5kZXhpbmcgd29yayBmb3IgYSBuZXcgY2F0YWxvZyB0dXBsZQogKgogKiBJbnNlcnQg dGhlIHR1cGxlIGRhdGEgaW4gInR1cCIgaW50byB0aGUgc3BlY2lmaWVkIGNhdGFsb2cgcmVs YXRpb24uCiAqCiAqIFRoaXMgaXMgYSBjb252ZW5pZW5jZSByb3V0aW5lIGZvciB0aGUgY29t bW9uIGNhc2Ugb2YgaW5zZXJ0aW5nIGEgc2luZ2xlCiAqIHR1cGxlIGluIGEgc3lzdGVtIGNh dGFsb2c7IGl0IGluc2VydHMgYSBuZXcgaGVhcCB0dXBsZSwga2VlcGluZyBpbmRleGVzCiAq IGN1cnJlbnQuICBBdm9pZCB1c2luZyBpdCBmb3IgbXVsdGlwbGUgdHVwbGVzLCBzaW5jZSBv cGVuaW5nIHRoZSBpbmRleGVzCiAqIGFuZCBidWlsZGluZyB0aGUgaW5kZXggaW5mbyBzdHJ1 Y3R1cmVzIGlzIG1vZGVyYXRlbHkgZXhwZW5zaXZlLgogKiAoVXNlIENhdGFsb2dUdXBsZUlu c2VydFdpdGhJbmZvIGluIHN1Y2ggY2FzZXMuKQogKi8Kdm9pZApDYXRhbG9nVHVwbGVJbnNl cnQoUmVsYXRpb24gaGVhcFJlbCwgSGVhcFR1cGxlIHR1cCkKewoJQ2F0YWxvZ0luZGV4U3Rh dGUgaW5kc3RhdGU7CgoJQ2F0YWxvZ1R1cGxlQ2hlY2tDb25zdHJhaW50cyhoZWFwUmVsLCB0 dXApOwoKCWluZHN0YXRlID0gQ2F0YWxvZ09wZW5JbmRleGVzKGhlYXBSZWwpOwoKCXNpbXBs ZV9oZWFwX2luc2VydChoZWFwUmVsLCB0dXApOwoKCUNhdGFsb2dJbmRleEluc2VydChpbmRz dGF0ZSwgdHVwLCBUVV9BbGwpOwoJQ2F0YWxvZ0Nsb3NlSW5kZXhlcyhpbmRzdGF0ZSk7Cn0K Ci8qCiAqIENhdGFsb2dUdXBsZUluc2VydFdpdGhJbmZvIC0gYXMgYWJvdmUsIGJ1dCB3aXRo IGNhbGxlci1zdXBwbGllZCBpbmRleCBpbmZvCiAqCiAqIFRoaXMgc2hvdWxkIGJlIHVzZWQg d2hlbiBpdCdzIGltcG9ydGFudCB0byBhbW9ydGl6ZSBDYXRhbG9nT3BlbkluZGV4ZXMvCiAq IENhdGFsb2dDbG9zZUluZGV4ZXMgd29yayBhY3Jvc3MgbXVsdGlwbGUgaW5zZXJ0aW9ucy4g IEF0IHNvbWUgcG9pbnQgd2UKICogbWlnaHQgY2FjaGUgdGhlIENhdGFsb2dJbmRleFN0YXRl IGRhdGEgc29tZXdoZXJlIChwZXJoYXBzIGluIHRoZSByZWxjYWNoZSkKICogc28gdGhhdCBj YWxsZXJzIG5lZWRuJ3QgdHJvdWJsZSBvdmVyIHRoaXMgLi4uIGJ1dCB3ZSBkb24ndCBkbyBz byB0b2RheS4KICovCnZvaWQKQ2F0YWxvZ1R1cGxlSW5zZXJ0V2l0aEluZm8oUmVsYXRpb24g aGVhcFJlbCwgSGVhcFR1cGxlIHR1cCwKCQkJCQkJICAgQ2F0YWxvZ0luZGV4U3RhdGUgaW5k c3RhdGUpCnsKCUNhdGFsb2dUdXBsZUNoZWNrQ29uc3RyYWludHMoaGVhcFJlbCwgdHVwKTsK CglzaW1wbGVfaGVhcF9pbnNlcnQoaGVhcFJlbCwgdHVwKTsKCglDYXRhbG9nSW5kZXhJbnNl cnQoaW5kc3RhdGUsIHR1cCwgVFVfQWxsKTsKfQoKLyoKICogQ2F0YWxvZ1R1cGxlc011bHRp SW5zZXJ0V2l0aEluZm8gLSBhcyBhYm92ZSwgYnV0IGZvciBtdWx0aXBsZSB0dXBsZXMKICoK ICogSW5zZXJ0IG11bHRpcGxlIHR1cGxlcyBpbnRvIHRoZSBnaXZlbiBjYXRhbG9nIHJlbGF0 aW9uIGF0IG9uY2UsIHdpdGggYW4KICogYW1vcnRpemVkIGNvc3Qgb2YgQ2F0YWxvZ09wZW5J bmRleGVzLgogKi8Kdm9pZApDYXRhbG9nVHVwbGVzTXVsdGlJbnNlcnRXaXRoSW5mbyhSZWxh dGlvbiBoZWFwUmVsLCBUdXBsZVRhYmxlU2xvdCAqKnNsb3QsCgkJCQkJCQkJIGludCBudHVw bGVzLCBDYXRhbG9nSW5kZXhTdGF0ZSBpbmRzdGF0ZSkKewoJLyogTm90aGluZyB0byBkbyAq LwoJaWYgKG50dXBsZXMgPD0gMCkKCQlyZXR1cm47CgoJaGVhcF9tdWx0aV9pbnNlcnQoaGVh cFJlbCwgc2xvdCwgbnR1cGxlcywKCQkJCQkgIEdldEN1cnJlbnRDb21tYW5kSWQodHJ1ZSks IDAsIE5VTEwpOwoKCS8qCgkgKiBUaGVyZSBpcyBubyBlcXVpdmFsZW50IHRvIGhlYXBfbXVs dGlfaW5zZXJ0IGZvciB0aGUgY2F0YWxvZyBpbmRleGVzLCBzbwoJICogd2UgbXVzdCBsb29w IG92ZXIgYW5kIGluc2VydCBpbmRpdmlkdWFsbHkuCgkgKi8KCWZvciAoaW50IGkgPSAwOyBp IDwgbnR1cGxlczsgaSsrKQoJewoJCWJvb2wJCXNob3VsZF9mcmVlOwoJCUhlYXBUdXBsZQl0 dXBsZTsKCgkJdHVwbGUgPSBFeGVjRmV0Y2hTbG90SGVhcFR1cGxlKHNsb3RbaV0sIHRydWUs ICZzaG91bGRfZnJlZSk7CgkJdHVwbGUtPnRfdGFibGVPaWQgPSBzbG90W2ldLT50dHNfdGFi bGVPaWQ7CgkJQ2F0YWxvZ0luZGV4SW5zZXJ0KGluZHN0YXRlLCB0dXBsZSwgVFVfQWxsKTsK CgkJaWYgKHNob3VsZF9mcmVlKQoJCQloZWFwX2ZyZWV0dXBsZSh0dXBsZSk7Cgl9Cn0KCi8q CiAqIENhdGFsb2dUdXBsZVVwZGF0ZSAtIGRvIGhlYXAgYW5kIGluZGV4aW5nIHdvcmsgZm9y IHVwZGF0aW5nIGEgY2F0YWxvZyB0dXBsZQogKgogKiBVcGRhdGUgdGhlIHR1cGxlIGlkZW50 aWZpZWQgYnkgIm90aWQiLCByZXBsYWNpbmcgaXQgd2l0aCB0aGUgZGF0YSBpbiAidHVwIi4K ICoKICogVGhpcyBpcyBhIGNvbnZlbmllbmNlIHJvdXRpbmUgZm9yIHRoZSBjb21tb24gY2Fz ZSBvZiB1cGRhdGluZyBhIHNpbmdsZQogKiB0dXBsZSBpbiBhIHN5c3RlbSBjYXRhbG9nOyBp dCB1cGRhdGVzIG9uZSBoZWFwIHR1cGxlLCBrZWVwaW5nIGluZGV4ZXMKICogY3VycmVudC4g IEF2b2lkIHVzaW5nIGl0IGZvciBtdWx0aXBsZSB0dXBsZXMsIHNpbmNlIG9wZW5pbmcgdGhl IGluZGV4ZXMKICogYW5kIGJ1aWxkaW5nIHRoZSBpbmRleCBpbmZvIHN0cnVjdHVyZXMgaXMg bW9kZXJhdGVseSBleHBlbnNpdmUuCiAqIChVc2UgQ2F0YWxvZ1R1cGxlVXBkYXRlV2l0aElu Zm8gaW4gc3VjaCBjYXNlcy4pCiAqLwp2b2lkCkNhdGFsb2dUdXBsZVVwZGF0ZShSZWxhdGlv biBoZWFwUmVsLCBjb25zdCBJdGVtUG9pbnRlckRhdGEgKm90aWQsIEhlYXBUdXBsZSB0dXAp CnsKCUNhdGFsb2dJbmRleFN0YXRlIGluZHN0YXRlOwoJVFVfVXBkYXRlSW5kZXhlcyB1cGRh dGVJbmRleGVzID0gVFVfQWxsOwoKCUNhdGFsb2dUdXBsZUNoZWNrQ29uc3RyYWludHMoaGVh cFJlbCwgdHVwKTsKCglpbmRzdGF0ZSA9IENhdGFsb2dPcGVuSW5kZXhlcyhoZWFwUmVsKTsK CglzaW1wbGVfaGVhcF91cGRhdGUoaGVhcFJlbCwgb3RpZCwgdHVwLCAmdXBkYXRlSW5kZXhl cyk7CgoJQ2F0YWxvZ0luZGV4SW5zZXJ0KGluZHN0YXRlLCB0dXAsIHVwZGF0ZUluZGV4ZXMp OwoJQ2F0YWxvZ0Nsb3NlSW5kZXhlcyhpbmRzdGF0ZSk7Cn0KCi8qCiAqIENhdGFsb2dUdXBs ZVVwZGF0ZVdpdGhJbmZvIC0gYXMgYWJvdmUsIGJ1dCB3aXRoIGNhbGxlci1zdXBwbGllZCBp bmRleCBpbmZvCiAqCiAqIFRoaXMgc2hvdWxkIGJlIHVzZWQgd2hlbiBpdCdzIGltcG9ydGFu dCB0byBhbW9ydGl6ZSBDYXRhbG9nT3BlbkluZGV4ZXMvCiAqIENhdGFsb2dDbG9zZUluZGV4 ZXMgd29yayBhY3Jvc3MgbXVsdGlwbGUgdXBkYXRlcy4gIEF0IHNvbWUgcG9pbnQgd2UKICog bWlnaHQgY2FjaGUgdGhlIENhdGFsb2dJbmRleFN0YXRlIGRhdGEgc29tZXdoZXJlIChwZXJo YXBzIGluIHRoZSByZWxjYWNoZSkKICogc28gdGhhdCBjYWxsZXJzIG5lZWRuJ3QgdHJvdWJs ZSBvdmVyIHRoaXMgLi4uIGJ1dCB3ZSBkb24ndCBkbyBzbyB0b2RheS4KICovCnZvaWQKQ2F0 YWxvZ1R1cGxlVXBkYXRlV2l0aEluZm8oUmVsYXRpb24gaGVhcFJlbCwgY29uc3QgSXRlbVBv aW50ZXJEYXRhICpvdGlkLCBIZWFwVHVwbGUgdHVwLAoJCQkJCQkgICBDYXRhbG9nSW5kZXhT dGF0ZSBpbmRzdGF0ZSkKewoJVFVfVXBkYXRlSW5kZXhlcyB1cGRhdGVJbmRleGVzID0gVFVf QWxsOwoKCUNhdGFsb2dUdXBsZUNoZWNrQ29uc3RyYWludHMoaGVhcFJlbCwgdHVwKTsKCglz aW1wbGVfaGVhcF91cGRhdGUoaGVhcFJlbCwgb3RpZCwgdHVwLCAmdXBkYXRlSW5kZXhlcyk7 CgoJQ2F0YWxvZ0luZGV4SW5zZXJ0KGluZHN0YXRlLCB0dXAsIHVwZGF0ZUluZGV4ZXMpOwp9 CgovKgogKiBDYXRhbG9nVHVwbGVEZWxldGUgLSBkbyBoZWFwIGFuZCBpbmRleGluZyB3b3Jr IGZvciBkZWxldGluZyBhIGNhdGFsb2cgdHVwbGUKICoKICogRGVsZXRlIHRoZSB0dXBsZSBp ZGVudGlmaWVkIGJ5ICJ0aWQiIGluIHRoZSBzcGVjaWZpZWQgY2F0YWxvZy4KICoKICogV2l0 aCBQb3N0Z3JlcyBoZWFwcywgdGhlcmUgaXMgbm8gaW5kZXggd29yayB0byBkbyBhdCBkZWxl dGlvbiB0aW1lOwogKiBjbGVhbnVwIHdpbGwgYmUgZG9uZSBsYXRlciBieSBWQUNVVU0uICBI b3dldmVyLCBjYWxsZXJzIG9mIHRoaXMgZnVuY3Rpb24KICogc2hvdWxkbid0IGhhdmUgdG8g a25vdyB0aGF0OyB3ZSdkIGxpa2UgYSB1bmlmb3JtIGFic3RyYWN0aW9uIGZvciBhbGwKICog Y2F0YWxvZyB0dXBsZSBjaGFuZ2VzLiAgSGVuY2UsIHByb3ZpZGUgdGhpcyBjdXJyZW50bHkt dHJpdmlhbCB3cmFwcGVyLgogKgogKiBUaGUgYWJzdHJhY3Rpb24gaXMgYSBiaXQgbGVha3kg aW4gdGhhdCB3ZSBkb24ndCBwcm92aWRlIGFuIG9wdGltaXplZAogKiBDYXRhbG9nVHVwbGVE ZWxldGVXaXRoSW5mbyB2ZXJzaW9uLCBiZWNhdXNlIHRoZXJlIGlzIGN1cnJlbnRseSBub3Ro aW5nIHRvCiAqIG9wdGltaXplLiAgSWYgd2UgZXZlciBuZWVkIHRoYXQsIHJhdGhlciB0aGFu IHRvdWNoaW5nIGEgbG90IG9mIGNhbGwgc2l0ZXMsCiAqIGl0IG1pZ2h0IGJlIGJldHRlciB0 byBkbyBzb21ldGhpbmcgYWJvdXQgY2FjaGluZyBDYXRhbG9nSW5kZXhTdGF0ZS4KICovCnZv aWQKQ2F0YWxvZ1R1cGxlRGVsZXRlKFJlbGF0aW9uIGhlYXBSZWwsIGNvbnN0IEl0ZW1Qb2lu dGVyRGF0YSAqdGlkKQp7CglzaW1wbGVfaGVhcF9kZWxldGUoaGVhcFJlbCwgdGlkKTsKfQoA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAuL2luZHhwYXRoLmMAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAMDAwMDY2NAAwMDAxNzUwADAwMDE3NTAAMDAwMDA0MjUzNjMAMTUyMjE3 MTQ0NTQAMDExNzEyACAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAHVzdGFyICAAeG1hbgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB4bWFuAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC8qLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLQogKgogKiBpbmR4cGF0aC5jCiAqCSAgUm91dGluZXMgdG8gZGV0ZXJt aW5lIHdoaWNoIGluZGV4ZXMgYXJlIHVzYWJsZSBmb3Igc2Nhbm5pbmcgYQogKgkgIGdpdmVu IHJlbGF0aW9uLCBhbmQgY3JlYXRlIFBhdGhzIGFjY29yZGluZ2x5LgogKgogKiBQb3J0aW9u cyBDb3B5cmlnaHQgKGMpIDE5OTYtMjAyNiwgUG9zdGdyZVNRTCBHbG9iYWwgRGV2ZWxvcG1l bnQgR3JvdXAKICogUG9ydGlvbnMgQ29weXJpZ2h0IChjKSAxOTk0LCBSZWdlbnRzIG9mIHRo ZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEKICoKICoKICogSURFTlRJRklDQVRJT04KICoJ ICBzcmMvYmFja2VuZC9vcHRpbWl6ZXIvcGF0aC9pbmR4cGF0aC5jCiAqCiAqLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLQogKi8KI2luY2x1ZGUgInBvc3RncmVzLmgiCgojaW5jbHVkZSAiYWNjZXNz L3N0cmF0bnVtLmgiCiNpbmNsdWRlICJhY2Nlc3Mvc3lzYXR0ci5oIgojaW5jbHVkZSAiYWNj ZXNzL3RyYW5zYW0uaCIKI2luY2x1ZGUgImNhdGFsb2cvcGdfYW0uaCIKI2luY2x1ZGUgImNh dGFsb2cvcGdfYW1vcC5oIgojaW5jbHVkZSAiY2F0YWxvZy9wZ19vcGVyYXRvci5oIgojaW5j bHVkZSAiY2F0YWxvZy9wZ19vcGZhbWlseS5oIgojaW5jbHVkZSAiY2F0YWxvZy9wZ190eXBl LmgiCiNpbmNsdWRlICJub2Rlcy9tYWtlZnVuY3MuaCIKI2luY2x1ZGUgIm5vZGVzL25vZGVG dW5jcy5oIgojaW5jbHVkZSAibm9kZXMvc3VwcG9ydG5vZGVzLmgiCiNpbmNsdWRlICJvcHRp bWl6ZXIvY29zdC5oIgojaW5jbHVkZSAib3B0aW1pemVyL29wdGltaXplci5oIgojaW5jbHVk ZSAib3B0aW1pemVyL3BhdGhub2RlLmgiCiNpbmNsdWRlICJvcHRpbWl6ZXIvcGF0aHMuaCIK I2luY2x1ZGUgIm9wdGltaXplci9wbGFjZWhvbGRlci5oIgojaW5jbHVkZSAib3B0aW1pemVy L3ByZXAuaCIKI2luY2x1ZGUgIm9wdGltaXplci9yZXN0cmljdGluZm8uaCIKI2luY2x1ZGUg InV0aWxzL2xzeXNjYWNoZS5oIgojaW5jbHVkZSAidXRpbHMvc2VsZnVuY3MuaCIKCgovKiBY WFggc2VlIFBhcnRDb2xsTWF0Y2hlc0V4cHJDb2xsICovCiNkZWZpbmUgSW5kZXhDb2xsTWF0 Y2hlc0V4cHJDb2xsKGlkeGNvbGxhdGlvbiwgZXhwcmNvbGxhdGlvbikgXAoJKChpZHhjb2xs YXRpb24pID09IEludmFsaWRPaWQgfHwgKGlkeGNvbGxhdGlvbikgPT0gKGV4cHJjb2xsYXRp b24pKQoKLyogV2hldGhlciB3ZSBhcmUgbG9va2luZyBmb3IgcGxhaW4gaW5kZXhzY2FuLCBi aXRtYXAgc2Nhbiwgb3IgZWl0aGVyICovCnR5cGVkZWYgZW51bQp7CglTVF9JTkRFWFNDQU4s CQkJCS8qIG11c3Qgc3VwcG9ydCBhbWdldHR1cGxlICovCglTVF9CSVRNQVBTQ0FOLAkJCQkv KiBtdXN0IHN1cHBvcnQgYW1nZXRiaXRtYXAgKi8KCVNUX0FOWVNDQU4sCQkJCQkvKiBlaXRo ZXIgaXMgb2theSAqLwp9IFNjYW5UeXBlQ29udHJvbDsKCi8qIERhdGEgc3RydWN0dXJlIGZv ciBjb2xsZWN0aW5nIHF1YWwgY2xhdXNlcyB0aGF0IG1hdGNoIGFuIGluZGV4ICovCnR5cGVk ZWYgc3RydWN0CnsKCWJvb2wJCW5vbmVtcHR5OwkJLyogVHJ1ZSBpZiBsaXN0cyBhcmUgbm90 IGFsbCBlbXB0eSAqLwoJLyogTGlzdHMgb2YgSW5kZXhDbGF1c2Ugbm9kZXMsIG9uZSBsaXN0 IHBlciBpbmRleCBjb2x1bW4gKi8KCUxpc3QJICAgKmluZGV4Y2xhdXNlc1tJTkRFWF9NQVhf S0VZU107Cn0gSW5kZXhDbGF1c2VTZXQ7CgovKiBQZXItcGF0aCBkYXRhIHVzZWQgd2l0aGlu IGNob29zZV9iaXRtYXBfYW5kKCkgKi8KdHlwZWRlZiBzdHJ1Y3QKewoJUGF0aAkgICAqcGF0 aDsJCQkvKiBJbmRleFBhdGgsIEJpdG1hcEFuZFBhdGgsIG9yIEJpdG1hcE9yUGF0aCAqLwoJ TGlzdAkgICAqcXVhbHM7CQkJLyogdGhlIFdIRVJFIGNsYXVzZXMgaXQgdXNlcyAqLwoJTGlz dAkgICAqcHJlZHM7CQkJLyogcHJlZGljYXRlcyBvZiBpdHMgcGFydGlhbCBpbmRleChlcykg Ki8KCUJpdG1hcHNldCAgKmNsYXVzZWlkczsJCS8qIHF1YWxzK3ByZWRzIHJlcHJlc2VudGVk IGFzIGEgYml0bWFwc2V0ICovCglib29sCQl1bmNsYXNzaWZpYWJsZTsgLyogaGFzIHRvbyBt YW55IHF1YWxzK3ByZWRzIHRvIHByb2Nlc3M/ICovCn0gUGF0aENsYXVzZVVzYWdlOwoKLyog Q2FsbGJhY2sgYXJndW1lbnQgZm9yIGVjX21lbWJlcl9tYXRjaGVzX2luZGV4Y29sICovCnR5 cGVkZWYgc3RydWN0CnsKCUluZGV4T3B0SW5mbyAqaW5kZXg7CQkvKiBpbmRleCB3ZSdyZSBj b25zaWRlcmluZyAqLwoJaW50CQkJaW5kZXhjb2w7CQkvKiBpbmRleCBjb2x1bW4gd2Ugd2Fu dCB0byBtYXRjaCB0byAqLwp9IGVjX21lbWJlcl9tYXRjaGVzX2FyZzsKCgpzdGF0aWMgdm9p ZCBjb25zaWRlcl9pbmRleF9qb2luX2NsYXVzZXMoUGxhbm5lckluZm8gKnJvb3QsIFJlbE9w dEluZm8gKnJlbCwKCQkJCQkJCQkJCUluZGV4T3B0SW5mbyAqaW5kZXgsCgkJCQkJCQkJCQlJ bmRleENsYXVzZVNldCAqcmNsYXVzZXNldCwKCQkJCQkJCQkJCUluZGV4Q2xhdXNlU2V0ICpq Y2xhdXNlc2V0LAoJCQkJCQkJCQkJSW5kZXhDbGF1c2VTZXQgKmVjbGF1c2VzZXQsCgkJCQkJ CQkJCQlMaXN0ICoqYml0aW5kZXhwYXRocyk7CnN0YXRpYyB2b2lkIGNvbnNpZGVyX2luZGV4 X2pvaW5fb3V0ZXJfcmVscyhQbGFubmVySW5mbyAqcm9vdCwgUmVsT3B0SW5mbyAqcmVsLAoJ CQkJCQkJCQkJICAgSW5kZXhPcHRJbmZvICppbmRleCwKCQkJCQkJCQkJCSAgIEluZGV4Q2xh dXNlU2V0ICpyY2xhdXNlc2V0LAoJCQkJCQkJCQkJICAgSW5kZXhDbGF1c2VTZXQgKmpjbGF1 c2VzZXQsCgkJCQkJCQkJCQkgICBJbmRleENsYXVzZVNldCAqZWNsYXVzZXNldCwKCQkJCQkJ CQkJCSAgIExpc3QgKipiaXRpbmRleHBhdGhzLAoJCQkJCQkJCQkJICAgTGlzdCAqaW5kZXhq b2luY2xhdXNlcywKCQkJCQkJCQkJCSAgIGludCBjb25zaWRlcmVkX2NsYXVzZXMsCgkJCQkJ CQkJCQkgICBMaXN0ICoqY29uc2lkZXJlZF9yZWxpZHMpOwpzdGF0aWMgdm9pZCBnZXRfam9p bl9pbmRleF9wYXRocyhQbGFubmVySW5mbyAqcm9vdCwgUmVsT3B0SW5mbyAqcmVsLAoJCQkJ CQkJCSBJbmRleE9wdEluZm8gKmluZGV4LAoJCQkJCQkJCSBJbmRleENsYXVzZVNldCAqcmNs YXVzZXNldCwKCQkJCQkJCQkgSW5kZXhDbGF1c2VTZXQgKmpjbGF1c2VzZXQsCgkJCQkJCQkJ IEluZGV4Q2xhdXNlU2V0ICplY2xhdXNlc2V0LAoJCQkJCQkJCSBMaXN0ICoqYml0aW5kZXhw YXRocywKCQkJCQkJCQkgUmVsaWRzIHJlbGlkcywKCQkJCQkJCQkgTGlzdCAqKmNvbnNpZGVy ZWRfcmVsaWRzKTsKc3RhdGljIGJvb2wgZWNsYXNzX2FscmVhZHlfdXNlZChFcXVpdmFsZW5j ZUNsYXNzICpwYXJlbnRfZWMsIFJlbGlkcyBvbGRyZWxpZHMsCgkJCQkJCQkJTGlzdCAqaW5k ZXhqb2luY2xhdXNlcyk7CnN0YXRpYyB2b2lkIGdldF9pbmRleF9wYXRocyhQbGFubmVySW5m byAqcm9vdCwgUmVsT3B0SW5mbyAqcmVsLAoJCQkJCQkJSW5kZXhPcHRJbmZvICppbmRleCwg SW5kZXhDbGF1c2VTZXQgKmNsYXVzZXMsCgkJCQkJCQlMaXN0ICoqYml0aW5kZXhwYXRocyk7 CnN0YXRpYyBMaXN0ICpidWlsZF9pbmRleF9wYXRocyhQbGFubmVySW5mbyAqcm9vdCwgUmVs T3B0SW5mbyAqcmVsLAoJCQkJCQkJICAgSW5kZXhPcHRJbmZvICppbmRleCwgSW5kZXhDbGF1 c2VTZXQgKmNsYXVzZXMsCgkJCQkJCQkgICBib29sIHVzZWZ1bF9wcmVkaWNhdGUsCgkJCQkJ CQkgICBTY2FuVHlwZUNvbnRyb2wgc2NhbnR5cGUsCgkJCQkJCQkgICBib29sICpza2lwX25v bm5hdGl2ZV9zYW9wKTsKc3RhdGljIExpc3QgKmJ1aWxkX3BhdGhzX2Zvcl9PUihQbGFubmVy SW5mbyAqcm9vdCwgUmVsT3B0SW5mbyAqcmVsLAoJCQkJCQkJCUxpc3QgKmNsYXVzZXMsIExp c3QgKm90aGVyX2NsYXVzZXMpOwpzdGF0aWMgTGlzdCAqZ2VuZXJhdGVfYml0bWFwX29yX3Bh dGhzKFBsYW5uZXJJbmZvICpyb290LCBSZWxPcHRJbmZvICpyZWwsCgkJCQkJCQkJCSAgTGlz dCAqY2xhdXNlcywgTGlzdCAqb3RoZXJfY2xhdXNlcyk7CnN0YXRpYyBQYXRoICpjaG9vc2Vf Yml0bWFwX2FuZChQbGFubmVySW5mbyAqcm9vdCwgUmVsT3B0SW5mbyAqcmVsLAoJCQkJCQkJ ICAgTGlzdCAqcGF0aHMpOwpzdGF0aWMgaW50CXBhdGhfdXNhZ2VfY29tcGFyYXRvcihjb25z dCB2b2lkICphLCBjb25zdCB2b2lkICpiKTsKc3RhdGljIENvc3QgYml0bWFwX3NjYW5fY29z dF9lc3QoUGxhbm5lckluZm8gKnJvb3QsIFJlbE9wdEluZm8gKnJlbCwKCQkJCQkJCQkgUGF0 aCAqaXBhdGgpOwpzdGF0aWMgQ29zdCBiaXRtYXBfYW5kX2Nvc3RfZXN0KFBsYW5uZXJJbmZv ICpyb290LCBSZWxPcHRJbmZvICpyZWwsCgkJCQkJCQkJTGlzdCAqcGF0aHMpOwpzdGF0aWMg UGF0aENsYXVzZVVzYWdlICpjbGFzc2lmeV9pbmRleF9jbGF1c2VfdXNhZ2UoUGF0aCAqcGF0 aCwKCQkJCQkJCQkJCQkJCUxpc3QgKipjbGF1c2VsaXN0KTsKc3RhdGljIHZvaWQgZmluZF9p bmRleHBhdGhfcXVhbHMoUGF0aCAqYml0bWFwcXVhbCwgTGlzdCAqKnF1YWxzLCBMaXN0ICoq cHJlZHMpOwpzdGF0aWMgaW50CWZpbmRfbGlzdF9wb3NpdGlvbihOb2RlICpub2RlLCBMaXN0 ICoqbm9kZWxpc3QpOwpzdGF0aWMgYm9vbCBjaGVja19pbmRleF9vbmx5KFJlbE9wdEluZm8g KnJlbCwgSW5kZXhPcHRJbmZvICppbmRleCk7CnN0YXRpYyBkb3VibGUgZ2V0X2xvb3BfY291 bnQoUGxhbm5lckluZm8gKnJvb3QsIEluZGV4IGN1cl9yZWxpZCwgUmVsaWRzIG91dGVyX3Jl bGlkcyk7CnN0YXRpYyBkb3VibGUgYWRqdXN0X3Jvd2NvdW50X2Zvcl9zZW1pam9pbnMoUGxh bm5lckluZm8gKnJvb3QsCgkJCQkJCQkJCQkJSW5kZXggY3VyX3JlbGlkLAoJCQkJCQkJCQkJ CUluZGV4IG91dGVyX3JlbGlkLAoJCQkJCQkJCQkJCWRvdWJsZSByb3djb3VudCk7CnN0YXRp YyBkb3VibGUgYXBwcm94aW1hdGVfam9pbnJlbF9zaXplKFBsYW5uZXJJbmZvICpyb290LCBS ZWxpZHMgcmVsaWRzKTsKc3RhdGljIHZvaWQgbWF0Y2hfcmVzdHJpY3Rpb25fY2xhdXNlc190 b19pbmRleChQbGFubmVySW5mbyAqcm9vdCwKCQkJCQkJCQkJCQkgICBJbmRleE9wdEluZm8g KmluZGV4LAoJCQkJCQkJCQkJCSAgIEluZGV4Q2xhdXNlU2V0ICpjbGF1c2VzZXQpOwpzdGF0 aWMgdm9pZCBtYXRjaF9qb2luX2NsYXVzZXNfdG9faW5kZXgoUGxhbm5lckluZm8gKnJvb3Qs CgkJCQkJCQkJCQlSZWxPcHRJbmZvICpyZWwsIEluZGV4T3B0SW5mbyAqaW5kZXgsCgkJCQkJ CQkJCQlJbmRleENsYXVzZVNldCAqY2xhdXNlc2V0LAoJCQkJCQkJCQkJTGlzdCAqKmpvaW5v cmNsYXVzZXMpOwpzdGF0aWMgdm9pZCBtYXRjaF9lY2xhc3NfY2xhdXNlc190b19pbmRleChQ bGFubmVySW5mbyAqcm9vdCwKCQkJCQkJCQkJCSAgSW5kZXhPcHRJbmZvICppbmRleCwKCQkJ CQkJCQkJCSAgSW5kZXhDbGF1c2VTZXQgKmNsYXVzZXNldCk7CnN0YXRpYyB2b2lkIG1hdGNo X2NsYXVzZXNfdG9faW5kZXgoUGxhbm5lckluZm8gKnJvb3QsCgkJCQkJCQkJICAgTGlzdCAq Y2xhdXNlcywKCQkJCQkJCQkgICBJbmRleE9wdEluZm8gKmluZGV4LAoJCQkJCQkJCSAgIElu ZGV4Q2xhdXNlU2V0ICpjbGF1c2VzZXQpOwpzdGF0aWMgdm9pZCBtYXRjaF9jbGF1c2VfdG9f aW5kZXgoUGxhbm5lckluZm8gKnJvb3QsCgkJCQkJCQkJICBSZXN0cmljdEluZm8gKnJpbmZv LAoJCQkJCQkJCSAgSW5kZXhPcHRJbmZvICppbmRleCwKCQkJCQkJCQkgIEluZGV4Q2xhdXNl U2V0ICpjbGF1c2VzZXQpOwpzdGF0aWMgSW5kZXhDbGF1c2UgKm1hdGNoX2NsYXVzZV90b19p bmRleGNvbChQbGFubmVySW5mbyAqcm9vdCwKCQkJCQkJCQkJCQkgUmVzdHJpY3RJbmZvICpy aW5mbywKCQkJCQkJCQkJCQkgaW50IGluZGV4Y29sLAoJCQkJCQkJCQkJCSBJbmRleE9wdElu Zm8gKmluZGV4KTsKc3RhdGljIGJvb2wgSXNCb29sZWFuT3BmYW1pbHkoT2lkIG9wZmFtaWx5 KTsKc3RhdGljIEluZGV4Q2xhdXNlICptYXRjaF9ib29sZWFuX2luZGV4X2NsYXVzZShQbGFu bmVySW5mbyAqcm9vdCwKCQkJCQkJCQkJCQkgICBSZXN0cmljdEluZm8gKnJpbmZvLAoJCQkJ CQkJCQkJCSAgIGludCBpbmRleGNvbCwgSW5kZXhPcHRJbmZvICppbmRleCk7CnN0YXRpYyBJ bmRleENsYXVzZSAqbWF0Y2hfb3BjbGF1c2VfdG9faW5kZXhjb2woUGxhbm5lckluZm8gKnJv b3QsCgkJCQkJCQkJCQkJICAgUmVzdHJpY3RJbmZvICpyaW5mbywKCQkJCQkJCQkJCQkgICBp bnQgaW5kZXhjb2wsCgkJCQkJCQkJCQkJICAgSW5kZXhPcHRJbmZvICppbmRleCk7CnN0YXRp YyBJbmRleENsYXVzZSAqbWF0Y2hfZnVuY2NsYXVzZV90b19pbmRleGNvbChQbGFubmVySW5m byAqcm9vdCwKCQkJCQkJCQkJCQkJIFJlc3RyaWN0SW5mbyAqcmluZm8sCgkJCQkJCQkJCQkJ CSBpbnQgaW5kZXhjb2wsCgkJCQkJCQkJCQkJCSBJbmRleE9wdEluZm8gKmluZGV4KTsKc3Rh dGljIEluZGV4Q2xhdXNlICpnZXRfaW5kZXhfY2xhdXNlX2Zyb21fc3VwcG9ydChQbGFubmVy SW5mbyAqcm9vdCwKCQkJCQkJCQkJCQkJICBSZXN0cmljdEluZm8gKnJpbmZvLAoJCQkJCQkJ CQkJCQkgIE9pZCBmdW5jaWQsCgkJCQkJCQkJCQkJCSAgaW50IGluZGV4YXJnLAoJCQkJCQkJ CQkJCQkgIGludCBpbmRleGNvbCwKCQkJCQkJCQkJCQkJICBJbmRleE9wdEluZm8gKmluZGV4 KTsKc3RhdGljIEluZGV4Q2xhdXNlICptYXRjaF9zYW9wY2xhdXNlX3RvX2luZGV4Y29sKFBs YW5uZXJJbmZvICpyb290LAoJCQkJCQkJCQkJCQkgUmVzdHJpY3RJbmZvICpyaW5mbywKCQkJ CQkJCQkJCQkJIGludCBpbmRleGNvbCwKCQkJCQkJCQkJCQkJIEluZGV4T3B0SW5mbyAqaW5k ZXgpOwpzdGF0aWMgSW5kZXhDbGF1c2UgKm1hdGNoX3Jvd2NvbXBhcmVfdG9faW5kZXhjb2wo UGxhbm5lckluZm8gKnJvb3QsCgkJCQkJCQkJCQkJCSBSZXN0cmljdEluZm8gKnJpbmZvLAoJ CQkJCQkJCQkJCQkgaW50IGluZGV4Y29sLAoJCQkJCQkJCQkJCQkgSW5kZXhPcHRJbmZvICpp bmRleCk7CnN0YXRpYyBJbmRleENsYXVzZSAqbWF0Y2hfb3JjbGF1c2VfdG9faW5kZXhjb2wo UGxhbm5lckluZm8gKnJvb3QsCgkJCQkJCQkJCQkJICAgUmVzdHJpY3RJbmZvICpyaW5mbywK CQkJCQkJCQkJCQkgICBpbnQgaW5kZXhjb2wsCgkJCQkJCQkJCQkJICAgSW5kZXhPcHRJbmZv ICppbmRleCk7CnN0YXRpYyBJbmRleENsYXVzZSAqZXhwYW5kX2luZGV4cXVhbF9yb3djb21w YXJlKFBsYW5uZXJJbmZvICpyb290LAoJCQkJCQkJCQkJCQlSZXN0cmljdEluZm8gKnJpbmZv LAoJCQkJCQkJCQkJCQlpbnQgaW5kZXhjb2wsCgkJCQkJCQkJCQkJCUluZGV4T3B0SW5mbyAq aW5kZXgsCgkJCQkJCQkJCQkJCU9pZCBleHByX29wLAoJCQkJCQkJCQkJCQlib29sIHZhcl9v bl9sZWZ0KTsKc3RhdGljIHZvaWQgbWF0Y2hfcGF0aGtleXNfdG9faW5kZXgoSW5kZXhPcHRJ bmZvICppbmRleCwgTGlzdCAqcGF0aGtleXMsCgkJCQkJCQkJCUxpc3QgKipvcmRlcmJ5X2Ns YXVzZXNfcCwKCQkJCQkJCQkJTGlzdCAqKmNsYXVzZV9jb2x1bW5zX3ApOwpzdGF0aWMgRXhw ciAqbWF0Y2hfY2xhdXNlX3RvX29yZGVyaW5nX29wKEluZGV4T3B0SW5mbyAqaW5kZXgsCgkJ CQkJCQkJCQkgaW50IGluZGV4Y29sLCBFeHByICpjbGF1c2UsIE9pZCBwa19vcGZhbWlseSk7 CnN0YXRpYyBib29sIGVjX21lbWJlcl9tYXRjaGVzX2luZGV4Y29sKFBsYW5uZXJJbmZvICpy b290LCBSZWxPcHRJbmZvICpyZWwsCgkJCQkJCQkJCSAgIEVxdWl2YWxlbmNlQ2xhc3MgKmVj LCBFcXVpdmFsZW5jZU1lbWJlciAqZW0sCgkJCQkJCQkJCSAgIHZvaWQgKmFyZyk7CgoKLyoK ICogY3JlYXRlX2luZGV4X3BhdGhzKCkKICoJICBHZW5lcmF0ZSBhbGwgaW50ZXJlc3Rpbmcg aW5kZXggcGF0aHMgZm9yIHRoZSBnaXZlbiByZWxhdGlvbi4KICoJICBDYW5kaWRhdGUgcGF0 aHMgYXJlIGFkZGVkIHRvIHRoZSByZWwncyBwYXRobGlzdCAodXNpbmcgYWRkX3BhdGgpLgog KgogKiBUbyBiZSBjb25zaWRlcmVkIGZvciBhbiBpbmRleCBzY2FuLCBhbiBpbmRleCBtdXN0 IG1hdGNoIG9uZSBvciBtb3JlCiAqIHJlc3RyaWN0aW9uIGNsYXVzZXMgb3Igam9pbiBjbGF1 c2VzIGZyb20gdGhlIHF1ZXJ5J3MgcXVhbCBjb25kaXRpb24sCiAqIG9yIG1hdGNoIHRoZSBx dWVyeSdzIE9SREVSIEJZIGNvbmRpdGlvbiwgb3IgaGF2ZSBhIHByZWRpY2F0ZSB0aGF0CiAq IG1hdGNoZXMgdGhlIHF1ZXJ5J3MgcXVhbCBjb25kaXRpb24uCiAqCiAqIFRoZXJlIGFyZSB0 d28gYmFzaWMga2luZHMgb2YgaW5kZXggc2NhbnMuICBBICJwbGFpbiIgaW5kZXggc2NhbiB1 c2VzCiAqIG9ubHkgcmVzdHJpY3Rpb24gY2xhdXNlcyAocG9zc2libHkgbm9uZSBhdCBhbGwp IGluIGl0cyBpbmRleHF1YWwsCiAqIHNvIGl0IGNhbiBiZSBhcHBsaWVkIGluIGFueSBjb250 ZXh0LiAgQSAicGFyYW1ldGVyaXplZCIgaW5kZXggc2NhbiB1c2VzCiAqIGpvaW4gY2xhdXNl cyAocGx1cyByZXN0cmljdGlvbiBjbGF1c2VzLCBpZiBhdmFpbGFibGUpIGluIGl0cyBpbmRl eHF1YWwuCiAqIFdoZW4gam9pbmluZyBzdWNoIGEgc2NhbiB0byBvbmUgb2YgdGhlIHJlbGF0 aW9ucyBzdXBwbHlpbmcgdGhlIG90aGVyCiAqIHZhcmlhYmxlcyB1c2VkIGluIGl0cyBpbmRl eHF1YWwsIHRoZSBwYXJhbWV0ZXJpemVkIHNjYW4gbXVzdCBhcHBlYXIgYXMKICogdGhlIGlu bmVyIHJlbGF0aW9uIG9mIGEgbmVzdGxvb3Agam9pbjsgaXQgY2FuJ3QgYmUgdXNlZCBvbiB0 aGUgb3V0ZXIgc2lkZSwKICogbm9yIGluIGEgbWVyZ2Ugb3IgaGFzaCBqb2luLiAgSW4gdGhh dCBjb250ZXh0LCB2YWx1ZXMgZm9yIHRoZSBvdGhlciByZWxzJwogKiBhdHRyaWJ1dGVzIGFy ZSBhdmFpbGFibGUgYW5kIGZpeGVkIGR1cmluZyBhbnkgb25lIHNjYW4gb2YgdGhlIGluZGV4 cGF0aC4KICoKICogQW4gSW5kZXhQYXRoIGlzIGdlbmVyYXRlZCBhbmQgc3VibWl0dGVkIHRv IGFkZF9wYXRoKCkgZm9yIGVhY2ggcGxhaW4gb3IKICogcGFyYW1ldGVyaXplZCBpbmRleCBz Y2FuIHRoaXMgcm91dGluZSBkZWVtcyBwb3RlbnRpYWxseSBpbnRlcmVzdGluZyBmb3IKICog dGhlIGN1cnJlbnQgcXVlcnkuCiAqCiAqICdyZWwnIGlzIHRoZSByZWxhdGlvbiBmb3Igd2hp Y2ggd2Ugd2FudCB0byBnZW5lcmF0ZSBpbmRleCBwYXRocwogKgogKiBOb3RlOiBjaGVja19p bmRleF9wcmVkaWNhdGVzKCkgbXVzdCBoYXZlIGJlZW4gcnVuIHByZXZpb3VzbHkgZm9yIHRo aXMgcmVsLgogKgogKiBOb3RlOiBpbiBjYXNlcyBpbnZvbHZpbmcgTEFURVJBTCByZWZlcmVu Y2VzIGluIHRoZSByZWxhdGlvbidzIHRsaXN0LCBpdCdzCiAqIHBvc3NpYmxlIHRoYXQgcmVs LT5sYXRlcmFsX3JlbGlkcyBpcyBub25lbXB0eS4gIEN1cnJlbnRseSwgd2UgaW5jbHVkZQog KiBsYXRlcmFsX3JlbGlkcyBpbnRvIHRoZSBwYXJhbWV0ZXJpemF0aW9uIHJlcG9ydGVkIGZv ciBlYWNoIHBhdGgsIGJ1dCBkb24ndAogKiB0YWtlIGl0IGludG8gYWNjb3VudCBvdGhlcndp c2UuICBUaGUgZmFjdCB0aGF0IGFueSBzdWNoIHJlbHMgKm11c3QqIGJlCiAqIGF2YWlsYWJs ZSBhcyBwYXJhbWV0ZXIgc291cmNlcyBwZXJoYXBzIHNob3VsZCBpbmZsdWVuY2Ugb3VyIGNo b2ljZXMgb2YKICogaW5kZXggcXVhbHMgLi4uIGJ1dCBmb3Igbm93LCBpdCBkb2Vzbid0IHNl ZW0gd29ydGggdHJvdWJsaW5nIG92ZXIuCiAqIEluIHBhcnRpY3VsYXIsIGNvbW1lbnRzIGJl bG93IGFib3V0ICJ1bnBhcmFtZXRlcml6ZWQiIHBhdGhzIHNob3VsZCBiZSByZWFkCiAqIGFz IG1lYW5pbmcgInVucGFyYW1ldGVyaXplZCBzbyBmYXIgYXMgdGhlIGluZGV4cXVhbHMgYXJl IGNvbmNlcm5lZCIuCiAqLwp2b2lkCmNyZWF0ZV9pbmRleF9wYXRocyhQbGFubmVySW5mbyAq cm9vdCwgUmVsT3B0SW5mbyAqcmVsKQp7CglMaXN0CSAgICppbmRleHBhdGhzOwoJTGlzdAkg ICAqYml0aW5kZXhwYXRoczsKCUxpc3QJICAgKmJpdGpvaW5wYXRoczsKCUxpc3QJICAgKmpv aW5vcmNsYXVzZXM7CglJbmRleENsYXVzZVNldCByY2xhdXNlc2V0OwoJSW5kZXhDbGF1c2VT ZXQgamNsYXVzZXNldDsKCUluZGV4Q2xhdXNlU2V0IGVjbGF1c2VzZXQ7CglMaXN0Q2VsbCAg ICpsYzsKCgkvKiBTa2lwIHRoZSB3aG9sZSBtZXNzIGlmIG5vIGluZGV4ZXMgKi8KCWlmIChy ZWwtPmluZGV4bGlzdCA9PSBOSUwpCgkJcmV0dXJuOwoKCS8qIEJpdG1hcCBwYXRocyBhcmUg Y29sbGVjdGVkIGFuZCB0aGVuIGRlYWx0IHdpdGggYXQgdGhlIGVuZCAqLwoJYml0aW5kZXhw YXRocyA9IGJpdGpvaW5wYXRocyA9IGpvaW5vcmNsYXVzZXMgPSBOSUw7CgoJLyogRXhhbWlu ZSBlYWNoIGluZGV4IGluIHR1cm4gKi8KCWZvcmVhY2gobGMsIHJlbC0+aW5kZXhsaXN0KQoJ ewoJCUluZGV4T3B0SW5mbyAqaW5kZXggPSAoSW5kZXhPcHRJbmZvICopIGxmaXJzdChsYyk7 CgoJCS8qIFByb3RlY3QgbGltaXRlZC1zaXplIGFycmF5IGluIEluZGV4Q2xhdXNlU2V0cyAq LwoJCUFzc2VydChpbmRleC0+bmtleWNvbHVtbnMgPD0gSU5ERVhfTUFYX0tFWVMpOwoKCQkv KgoJCSAqIElnbm9yZSBwYXJ0aWFsIGluZGV4ZXMgdGhhdCBkbyBub3QgbWF0Y2ggdGhlIHF1 ZXJ5LgoJCSAqIChnZW5lcmF0ZV9iaXRtYXBfb3JfcGF0aHMoKSBtaWdodCBiZSBhYmxlIHRv IGRvIHNvbWV0aGluZyB3aXRoCgkJICogdGhlbSwgYnV0IHRoYXQncyBvZiBubyBjb25jZXJu IGhlcmUuKQoJCSAqLwoJCWlmIChpbmRleC0+aW5kcHJlZCAhPSBOSUwgJiYgIWluZGV4LT5w cmVkT0spCgkJCWNvbnRpbnVlOwoKCQkvKgoJCSAqIElkZW50aWZ5IHRoZSByZXN0cmljdGlv biBjbGF1c2VzIHRoYXQgY2FuIG1hdGNoIHRoZSBpbmRleC4KCQkgKi8KCQlNZW1TZXQoJnJj bGF1c2VzZXQsIDAsIHNpemVvZihyY2xhdXNlc2V0KSk7CgkJbWF0Y2hfcmVzdHJpY3Rpb25f Y2xhdXNlc190b19pbmRleChyb290LCBpbmRleCwgJnJjbGF1c2VzZXQpOwoKCQkvKgoJCSAq IEJ1aWxkIGluZGV4IHBhdGhzIGZyb20gdGhlIHJlc3RyaWN0aW9uIGNsYXVzZXMuICBUaGVz ZSB3aWxsIGJlCgkJICogbm9uLXBhcmFtZXRlcml6ZWQgcGF0aHMuICBQbGFpbiBwYXRocyBn byBkaXJlY3RseSB0byBhZGRfcGF0aCgpLAoJCSAqIGJpdG1hcCBwYXRocyBhcmUgYWRkZWQg dG8gYml0aW5kZXhwYXRocyB0byBiZSBoYW5kbGVkIGJlbG93LgoJCSAqLwoJCWdldF9pbmRl eF9wYXRocyhyb290LCByZWwsIGluZGV4LCAmcmNsYXVzZXNldCwKCQkJCQkJJmJpdGluZGV4 cGF0aHMpOwoKCQkvKgoJCSAqIElkZW50aWZ5IHRoZSBqb2luIGNsYXVzZXMgdGhhdCBjYW4g bWF0Y2ggdGhlIGluZGV4LiAgRm9yIHRoZSBtb21lbnQKCQkgKiB3ZSBrZWVwIHRoZW0gc2Vw YXJhdGUgZnJvbSB0aGUgcmVzdHJpY3Rpb24gY2xhdXNlcy4gIE5vdGUgdGhhdCB0aGlzCgkJ ICogc3RlcCBmaW5kcyBvbmx5ICJsb29zZSIgam9pbiBjbGF1c2VzIHRoYXQgaGF2ZSBub3Qg YmVlbiBtZXJnZWQgaW50bwoJCSAqIEVxdWl2YWxlbmNlQ2xhc3Nlcy4gIEFsc28sIGNvbGxl Y3Qgam9pbiBPUiBjbGF1c2VzIGZvciBsYXRlci4KCQkgKi8KCQlNZW1TZXQoJmpjbGF1c2Vz ZXQsIDAsIHNpemVvZihqY2xhdXNlc2V0KSk7CgkJbWF0Y2hfam9pbl9jbGF1c2VzX3RvX2lu ZGV4KHJvb3QsIHJlbCwgaW5kZXgsCgkJCQkJCQkJCSZqY2xhdXNlc2V0LCAmam9pbm9yY2xh dXNlcyk7CgoJCS8qCgkJICogTG9vayBmb3IgRXF1aXZhbGVuY2VDbGFzc2VzIHRoYXQgY2Fu IGdlbmVyYXRlIGpvaW5jbGF1c2VzIG1hdGNoaW5nCgkJICogdGhlIGluZGV4LgoJCSAqLwoJ CU1lbVNldCgmZWNsYXVzZXNldCwgMCwgc2l6ZW9mKGVjbGF1c2VzZXQpKTsKCQltYXRjaF9l Y2xhc3NfY2xhdXNlc190b19pbmRleChyb290LCBpbmRleCwKCQkJCQkJCQkJICAmZWNsYXVz ZXNldCk7CgoJCS8qCgkJICogSWYgd2UgZm91bmQgYW55IHBsYWluIG9yIGVjbGFzcyBqb2lu IGNsYXVzZXMsIGJ1aWxkIHBhcmFtZXRlcml6ZWQKCQkgKiBpbmRleCBwYXRocyB1c2luZyB0 aGVtLgoJCSAqLwoJCWlmIChqY2xhdXNlc2V0Lm5vbmVtcHR5IHx8IGVjbGF1c2VzZXQubm9u ZW1wdHkpCgkJCWNvbnNpZGVyX2luZGV4X2pvaW5fY2xhdXNlcyhyb290LCByZWwsIGluZGV4 LAoJCQkJCQkJCQkJJnJjbGF1c2VzZXQsCgkJCQkJCQkJCQkmamNsYXVzZXNldCwKCQkJCQkJ CQkJCSZlY2xhdXNlc2V0LAoJCQkJCQkJCQkJJmJpdGpvaW5wYXRocyk7Cgl9CgoJLyoKCSAq IEdlbmVyYXRlIEJpdG1hcE9yUGF0aHMgZm9yIGFueSBzdWl0YWJsZSBPUi1jbGF1c2VzIHBy ZXNlbnQgaW4gdGhlCgkgKiByZXN0cmljdGlvbiBsaXN0LiAgQWRkIHRoZXNlIHRvIGJpdGlu ZGV4cGF0aHMuCgkgKi8KCWluZGV4cGF0aHMgPSBnZW5lcmF0ZV9iaXRtYXBfb3JfcGF0aHMo cm9vdCwgcmVsLAoJCQkJCQkJCQkJICByZWwtPmJhc2VyZXN0cmljdGluZm8sIE5JTCk7Cgli aXRpbmRleHBhdGhzID0gbGlzdF9jb25jYXQoYml0aW5kZXhwYXRocywgaW5kZXhwYXRocyk7 CgoJLyoKCSAqIExpa2V3aXNlLCBnZW5lcmF0ZSBCaXRtYXBPclBhdGhzIGZvciBhbnkgc3Vp dGFibGUgT1ItY2xhdXNlcyBwcmVzZW50IGluCgkgKiB0aGUgam9pbmNsYXVzZSBsaXN0LiAg QWRkIHRoZXNlIHRvIGJpdGpvaW5wYXRocy4KCSAqLwoJaW5kZXhwYXRocyA9IGdlbmVyYXRl X2JpdG1hcF9vcl9wYXRocyhyb290LCByZWwsCgkJCQkJCQkJCQkgIGpvaW5vcmNsYXVzZXMs IHJlbC0+YmFzZXJlc3RyaWN0aW5mbyk7CgliaXRqb2lucGF0aHMgPSBsaXN0X2NvbmNhdChi aXRqb2lucGF0aHMsIGluZGV4cGF0aHMpOwoKCS8qCgkgKiBJZiB3ZSBmb3VuZCBhbnl0aGlu ZyB1c2FibGUsIGdlbmVyYXRlIGEgQml0bWFwSGVhcFBhdGggZm9yIHRoZSBtb3N0CgkgKiBw cm9taXNpbmcgY29tYmluYXRpb24gb2YgcmVzdHJpY3Rpb24gYml0bWFwIGluZGV4IHBhdGhz LiAgTm90ZSB0aGVyZQoJICogd2lsbCBiZSBvbmx5IG9uZSBzdWNoIHBhdGggbm8gbWF0dGVy IGhvdyBtYW55IGluZGV4ZXMgZXhpc3QuICBUaGlzCgkgKiBzaG91bGQgYmUgc3VmZmljaWVu dCBzaW5jZSB0aGVyZSdzIGJhc2ljYWxseSBvbmx5IG9uZSBmaWd1cmUgb2YgbWVyaXQKCSAq ICh0b3RhbCBjb3N0KSBmb3Igc3VjaCBhIHBhdGguCgkgKi8KCWlmIChiaXRpbmRleHBhdGhz ICE9IE5JTCkKCXsKCQlQYXRoCSAgICpiaXRtYXBxdWFsOwoJCUJpdG1hcEhlYXBQYXRoICpi cGF0aDsKCgkJYml0bWFwcXVhbCA9IGNob29zZV9iaXRtYXBfYW5kKHJvb3QsIHJlbCwgYml0 aW5kZXhwYXRocyk7CgkJYnBhdGggPSBjcmVhdGVfYml0bWFwX2hlYXBfcGF0aChyb290LCBy ZWwsIGJpdG1hcHF1YWwsCgkJCQkJCQkJCQlyZWwtPmxhdGVyYWxfcmVsaWRzLCAxLjAsIDAp OwoJCWFkZF9wYXRoKHJlbCwgKFBhdGggKikgYnBhdGgpOwoKCQkvKiBjcmVhdGUgYSBwYXJ0 aWFsIGJpdG1hcCBoZWFwIHBhdGggKi8KCQlpZiAocmVsLT5jb25zaWRlcl9wYXJhbGxlbCAm JiByZWwtPmxhdGVyYWxfcmVsaWRzID09IE5VTEwpCgkJCWNyZWF0ZV9wYXJ0aWFsX2JpdG1h cF9wYXRocyhyb290LCByZWwsIGJpdG1hcHF1YWwpOwoJfQoKCS8qCgkgKiBMaWtld2lzZSwg aWYgd2UgZm91bmQgYW55dGhpbmcgdXNhYmxlLCBnZW5lcmF0ZSBCaXRtYXBIZWFwUGF0aHMg Zm9yIHRoZQoJICogbW9zdCBwcm9taXNpbmcgY29tYmluYXRpb25zIG9mIGpvaW4gYml0bWFw IGluZGV4IHBhdGhzLiAgT3VyIHN0cmF0ZWd5CgkgKiBpcyB0byBnZW5lcmF0ZSBvbmUgc3Vj aCBwYXRoIGZvciBlYWNoIGRpc3RpbmN0IHBhcmFtZXRlcml6YXRpb24gc2VlbgoJICogYW1v bmcgdGhlIGF2YWlsYWJsZSBiaXRtYXAgaW5kZXggcGF0aHMuICBUaGlzIG1heSBsb29rIHBy ZXR0eQoJICogZXhwZW5zaXZlLCBidXQgdXN1YWxseSB0aGVyZSB3b24ndCBiZSB2ZXJ5IG1h bnkgZGlzdGluY3QKCSAqIHBhcmFtZXRlcml6YXRpb25zLiAgKFRoaXMgbG9naWMgaXMgcXVp dGUgc2ltaWxhciB0byB0aGF0IGluCgkgKiBjb25zaWRlcl9pbmRleF9qb2luX2NsYXVzZXMs IGJ1dCB3ZSdyZSB3b3JraW5nIHdpdGggd2hvbGUgcGF0aHMgbm90CgkgKiBpbmRpdmlkdWFs IGNsYXVzZXMuKQoJICovCglpZiAoYml0am9pbnBhdGhzICE9IE5JTCkKCXsKCQlMaXN0CSAg ICphbGxfcGF0aF9vdXRlcnM7CgoJCS8qIElkZW50aWZ5IGVhY2ggZGlzdGluY3QgcGFyYW1l dGVyaXphdGlvbiBzZWVuIGluIGJpdGpvaW5wYXRocyAqLwoJCWFsbF9wYXRoX291dGVycyA9 IE5JTDsKCQlmb3JlYWNoKGxjLCBiaXRqb2lucGF0aHMpCgkJewoJCQlQYXRoCSAgICpwYXRo ID0gKFBhdGggKikgbGZpcnN0KGxjKTsKCQkJUmVsaWRzCQlyZXF1aXJlZF9vdXRlciA9IFBB VEhfUkVRX09VVEVSKHBhdGgpOwoKCQkJYWxsX3BhdGhfb3V0ZXJzID0gbGlzdF9hcHBlbmRf dW5pcXVlKGFsbF9wYXRoX291dGVycywKCQkJCQkJCQkJCQkJIHJlcXVpcmVkX291dGVyKTsK CQl9CgoJCS8qIE5vdywgZm9yIGVhY2ggZGlzdGluY3QgcGFyYW1ldGVyaXphdGlvbiBzZXQg Li4uICovCgkJZm9yZWFjaChsYywgYWxsX3BhdGhfb3V0ZXJzKQoJCXsKCQkJUmVsaWRzCQlt YXhfb3V0ZXJzID0gKFJlbGlkcykgbGZpcnN0KGxjKTsKCQkJTGlzdAkgICAqdGhpc19wYXRo X3NldDsKCQkJUGF0aAkgICAqYml0bWFwcXVhbDsKCQkJUmVsaWRzCQlyZXF1aXJlZF9vdXRl cjsKCQkJZG91YmxlCQlsb29wX2NvdW50OwoJCQlCaXRtYXBIZWFwUGF0aCAqYnBhdGg7CgkJ CUxpc3RDZWxsICAgKmxjcDsKCgkJCS8qIElkZW50aWZ5IGFsbCB0aGUgYml0bWFwIGpvaW4g cGF0aHMgbmVlZGluZyBubyBtb3JlIHRoYW4gdGhhdCAqLwoJCQl0aGlzX3BhdGhfc2V0ID0g TklMOwoJCQlmb3JlYWNoKGxjcCwgYml0am9pbnBhdGhzKQoJCQl7CgkJCQlQYXRoCSAgICpw YXRoID0gKFBhdGggKikgbGZpcnN0KGxjcCk7CgoJCQkJaWYgKGJtc19pc19zdWJzZXQoUEFU SF9SRVFfT1VURVIocGF0aCksIG1heF9vdXRlcnMpKQoJCQkJCXRoaXNfcGF0aF9zZXQgPSBs YXBwZW5kKHRoaXNfcGF0aF9zZXQsIHBhdGgpOwoJCQl9CgoJCQkvKgoJCQkgKiBBZGQgaW4g cmVzdHJpY3Rpb24gYml0bWFwIHBhdGhzLCBzaW5jZSB0aGV5IGNhbiBiZSB1c2VkCgkJCSAq IHRvZ2V0aGVyIHdpdGggYW55IGpvaW4gcGF0aHMuCgkJCSAqLwoJCQl0aGlzX3BhdGhfc2V0 ID0gbGlzdF9jb25jYXQodGhpc19wYXRoX3NldCwgYml0aW5kZXhwYXRocyk7CgoJCQkvKiBT ZWxlY3QgYmVzdCBBTkQgY29tYmluYXRpb24gZm9yIHRoaXMgcGFyYW1ldGVyaXphdGlvbiAq LwoJCQliaXRtYXBxdWFsID0gY2hvb3NlX2JpdG1hcF9hbmQocm9vdCwgcmVsLCB0aGlzX3Bh dGhfc2V0KTsKCgkJCS8qIEFuZCBwdXNoIHRoYXQgcGF0aCBpbnRvIHRoZSBtaXggKi8KCQkJ cmVxdWlyZWRfb3V0ZXIgPSBQQVRIX1JFUV9PVVRFUihiaXRtYXBxdWFsKTsKCQkJbG9vcF9j b3VudCA9IGdldF9sb29wX2NvdW50KHJvb3QsIHJlbC0+cmVsaWQsIHJlcXVpcmVkX291dGVy KTsKCQkJYnBhdGggPSBjcmVhdGVfYml0bWFwX2hlYXBfcGF0aChyb290LCByZWwsIGJpdG1h cHF1YWwsCgkJCQkJCQkJCQkJcmVxdWlyZWRfb3V0ZXIsIGxvb3BfY291bnQsIDApOwoJCQlh ZGRfcGF0aChyZWwsIChQYXRoICopIGJwYXRoKTsKCQl9Cgl9Cn0KCi8qCiAqIGNvbnNpZGVy X2luZGV4X2pvaW5fY2xhdXNlcwogKgkgIEdpdmVuIHNldHMgb2Ygam9pbiBjbGF1c2VzIGZv ciBhbiBpbmRleCwgZGVjaWRlIHdoaWNoIHBhcmFtZXRlcml6ZWQKICoJICBpbmRleCBwYXRo cyB0byBidWlsZC4KICoKICogUGxhaW4gaW5kZXhwYXRocyBhcmUgc2VudCBkaXJlY3RseSB0 byBhZGRfcGF0aCwgd2hpbGUgcG90ZW50aWFsCiAqIGJpdG1hcCBpbmRleHBhdGhzIGFyZSBh ZGRlZCB0byAqYml0aW5kZXhwYXRocyBmb3IgbGF0ZXIgcHJvY2Vzc2luZy4KICoKICogJ3Jl bCcgaXMgdGhlIGluZGV4J3MgaGVhcCByZWxhdGlvbgogKiAnaW5kZXgnIGlzIHRoZSBpbmRl eCBmb3Igd2hpY2ggd2Ugd2FudCB0byBnZW5lcmF0ZSBwYXRocwogKiAncmNsYXVzZXNldCcg aXMgdGhlIGNvbGxlY3Rpb24gb2YgaW5kZXhhYmxlIHJlc3RyaWN0aW9uIGNsYXVzZXMKICog J2pjbGF1c2VzZXQnIGlzIHRoZSBjb2xsZWN0aW9uIG9mIGluZGV4YWJsZSBzaW1wbGUgam9p biBjbGF1c2VzCiAqICdlY2xhdXNlc2V0JyBpcyB0aGUgY29sbGVjdGlvbiBvZiBpbmRleGFi bGUgY2xhdXNlcyBmcm9tIEVxdWl2YWxlbmNlQ2xhc3NlcwogKiAnKmJpdGluZGV4cGF0aHMn IGlzIHRoZSBsaXN0IHRvIGFkZCBiaXRtYXAgcGF0aHMgdG8KICovCnN0YXRpYyB2b2lkCmNv bnNpZGVyX2luZGV4X2pvaW5fY2xhdXNlcyhQbGFubmVySW5mbyAqcm9vdCwgUmVsT3B0SW5m byAqcmVsLAoJCQkJCQkJSW5kZXhPcHRJbmZvICppbmRleCwKCQkJCQkJCUluZGV4Q2xhdXNl U2V0ICpyY2xhdXNlc2V0LAoJCQkJCQkJSW5kZXhDbGF1c2VTZXQgKmpjbGF1c2VzZXQsCgkJ CQkJCQlJbmRleENsYXVzZVNldCAqZWNsYXVzZXNldCwKCQkJCQkJCUxpc3QgKipiaXRpbmRl eHBhdGhzKQp7CglpbnQJCQljb25zaWRlcmVkX2NsYXVzZXMgPSAwOwoJTGlzdAkgICAqY29u c2lkZXJlZF9yZWxpZHMgPSBOSUw7CglpbnQJCQlpbmRleGNvbDsKCgkvKgoJICogVGhlIHN0 cmF0ZWd5IGhlcmUgaXMgdG8gaWRlbnRpZnkgZXZlcnkgcG90ZW50aWFsbHkgdXNlZnVsIHNl dCBvZiBvdXRlcgoJICogcmVscyB0aGF0IGNhbiBwcm92aWRlIGluZGV4YWJsZSBqb2luIGNs YXVzZXMuICBGb3IgZWFjaCBzdWNoIHNldCwKCSAqIHNlbGVjdCBhbGwgdGhlIGpvaW4gY2xh dXNlcyBhdmFpbGFibGUgZnJvbSB0aG9zZSBvdXRlciByZWxzLCBhZGQgb24gYWxsCgkgKiB0 aGUgaW5kZXhhYmxlIHJlc3RyaWN0aW9uIGNsYXVzZXMsIGFuZCBnZW5lcmF0ZSBwbGFpbiBh bmQvb3IgYml0bWFwCgkgKiBpbmRleCBwYXRocyBmb3IgdGhhdCBzZXQgb2YgY2xhdXNlcy4g IFRoaXMgaXMgYmFzZWQgb24gdGhlIGFzc3VtcHRpb24KCSAqIHRoYXQgaXQncyBhbHdheXMg YmV0dGVyIHRvIGFwcGx5IGEgY2xhdXNlIGFzIGFuIGluZGV4cXVhbCB0aGFuIGFzIGEKCSAq IGZpbHRlciAocXBxdWFsKTsgd2hpY2ggaXMgd2hlcmUgYW4gYXZhaWxhYmxlIGNsYXVzZSB3 b3VsZCBlbmQgdXAgYmVpbmcKCSAqIGFwcGxpZWQgaWYgd2Ugb21pdCBpdCBmcm9tIHRoZSBp bmRleHF1YWxzLgoJICoKCSAqIFRoaXMgbG9va3MgZXhwZW5zaXZlLCBidXQgaW4gbW9zdCBw cmFjdGljYWwgY2FzZXMgdGhlcmUgd29uJ3QgYmUgdmVyeQoJICogbWFueSBkaXN0aW5jdCBz ZXRzIG9mIG91dGVyIHJlbHMgdG8gY29uc2lkZXIuICBBcyBhIHNhZmV0eSB2YWx2ZSB3aGVu CgkgKiB0aGF0J3Mgbm90IHRydWUsIHdlIHVzZSBhIGhldXJpc3RpYzogbGltaXQgdGhlIG51 bWJlciBvZiBvdXRlciByZWwgc2V0cwoJICogY29uc2lkZXJlZCB0byBhIG11bHRpcGxlIG9m IHRoZSBudW1iZXIgb2YgY2xhdXNlcyBjb25zaWRlcmVkLiAgKFdlJ2xsCgkgKiBhbHdheXMg Y29uc2lkZXIgdXNpbmcgZWFjaCBpbmRpdmlkdWFsIGpvaW4gY2xhdXNlLCB0aG91Z2guKQoJ ICoKCSAqIEZvciBzaW1wbGljaXR5IGluIHNlbGVjdGluZyByZWxldmFudCBjbGF1c2VzLCB3 ZSByZXByZXNlbnQgZWFjaCBzZXQgb2YKCSAqIG91dGVyIHJlbHMgYXMgYSBtYXhpbXVtIHNl dCBvZiBjbGF1c2VfcmVsaWRzIC0tLSB0aGF0IGlzLCB0aGUgaW5kZXhlZAoJICogcmVsYXRp b24gaXRzZWxmIGlzIGFsc28gaW5jbHVkZWQgaW4gdGhlIHJlbGlkcyBzZXQuICBjb25zaWRl cmVkX3JlbGlkcwoJICogbGlzdHMgYWxsIHJlbGlkcyBzZXRzIHdlJ3ZlIGFscmVhZHkgdHJp ZWQuCgkgKi8KCWZvciAoaW5kZXhjb2wgPSAwOyBpbmRleGNvbCA8IGluZGV4LT5ua2V5Y29s dW1uczsgaW5kZXhjb2wrKykKCXsKCQkvKiBDb25zaWRlciBlYWNoIGFwcGxpY2FibGUgc2lt cGxlIGpvaW4gY2xhdXNlICovCgkJY29uc2lkZXJlZF9jbGF1c2VzICs9IGxpc3RfbGVuZ3Ro KGpjbGF1c2VzZXQtPmluZGV4Y2xhdXNlc1tpbmRleGNvbF0pOwoJCWNvbnNpZGVyX2luZGV4 X2pvaW5fb3V0ZXJfcmVscyhyb290LCByZWwsIGluZGV4LAoJCQkJCQkJCQkgICByY2xhdXNl c2V0LCBqY2xhdXNlc2V0LCBlY2xhdXNlc2V0LAoJCQkJCQkJCQkgICBiaXRpbmRleHBhdGhz LAoJCQkJCQkJCQkgICBqY2xhdXNlc2V0LT5pbmRleGNsYXVzZXNbaW5kZXhjb2xdLAoJCQkJ CQkJCQkgICBjb25zaWRlcmVkX2NsYXVzZXMsCgkJCQkJCQkJCSAgICZjb25zaWRlcmVkX3Jl bGlkcyk7CgkJLyogQ29uc2lkZXIgZWFjaCBhcHBsaWNhYmxlIGVjbGFzcyBqb2luIGNsYXVz ZSAqLwoJCWNvbnNpZGVyZWRfY2xhdXNlcyArPSBsaXN0X2xlbmd0aChlY2xhdXNlc2V0LT5p bmRleGNsYXVzZXNbaW5kZXhjb2xdKTsKCQljb25zaWRlcl9pbmRleF9qb2luX291dGVyX3Jl bHMocm9vdCwgcmVsLCBpbmRleCwKCQkJCQkJCQkJICAgcmNsYXVzZXNldCwgamNsYXVzZXNl dCwgZWNsYXVzZXNldCwKCQkJCQkJCQkJICAgYml0aW5kZXhwYXRocywKCQkJCQkJCQkJICAg ZWNsYXVzZXNldC0+aW5kZXhjbGF1c2VzW2luZGV4Y29sXSwKCQkJCQkJCQkJICAgY29uc2lk ZXJlZF9jbGF1c2VzLAoJCQkJCQkJCQkgICAmY29uc2lkZXJlZF9yZWxpZHMpOwoJfQp9Cgov KgogKiBjb25zaWRlcl9pbmRleF9qb2luX291dGVyX3JlbHMKICoJICBHZW5lcmF0ZSBwYXJh bWV0ZXJpemVkIHBhdGhzIGJhc2VkIG9uIGNsYXVzZSByZWxpZHMgaW4gdGhlIGNsYXVzZSBs aXN0LgogKgogKiBXb3JraG9yc2UgZm9yIGNvbnNpZGVyX2luZGV4X2pvaW5fY2xhdXNlczsg c2VlIG5vdGVzIHRoZXJlaW4gZm9yIHJhdGlvbmFsZS4KICoKICogJ3JlbCcsICdpbmRleCcs ICdyY2xhdXNlc2V0JywgJ2pjbGF1c2VzZXQnLCAnZWNsYXVzZXNldCcsIGFuZAogKgkJJ2Jp dGluZGV4cGF0aHMnIGFzIGFib3ZlCiAqICdpbmRleGpvaW5jbGF1c2VzJyBpcyBhIGxpc3Qg b2YgSW5kZXhDbGF1c2VzIGZvciBqb2luIGNsYXVzZXMKICogJ2NvbnNpZGVyZWRfY2xhdXNl cycgaXMgdGhlIHRvdGFsIG51bWJlciBvZiBjbGF1c2VzIGNvbnNpZGVyZWQgKHNvIGZhcikK ICogJypjb25zaWRlcmVkX3JlbGlkcycgaXMgYSBsaXN0IG9mIGFsbCByZWxpZHMgc2V0cyBh bHJlYWR5IGNvbnNpZGVyZWQKICovCnN0YXRpYyB2b2lkCmNvbnNpZGVyX2luZGV4X2pvaW5f b3V0ZXJfcmVscyhQbGFubmVySW5mbyAqcm9vdCwgUmVsT3B0SW5mbyAqcmVsLAoJCQkJCQkJ ICAgSW5kZXhPcHRJbmZvICppbmRleCwKCQkJCQkJCSAgIEluZGV4Q2xhdXNlU2V0ICpyY2xh dXNlc2V0LAoJCQkJCQkJICAgSW5kZXhDbGF1c2VTZXQgKmpjbGF1c2VzZXQsCgkJCQkJCQkg ICBJbmRleENsYXVzZVNldCAqZWNsYXVzZXNldCwKCQkJCQkJCSAgIExpc3QgKipiaXRpbmRl eHBhdGhzLAoJCQkJCQkJICAgTGlzdCAqaW5kZXhqb2luY2xhdXNlcywKCQkJCQkJCSAgIGlu dCBjb25zaWRlcmVkX2NsYXVzZXMsCgkJCQkJCQkgICBMaXN0ICoqY29uc2lkZXJlZF9yZWxp ZHMpCnsKCUxpc3RDZWxsICAgKmxjOwoKCS8qIEV4YW1pbmUgcmVsaWRzIG9mIGVhY2ggam9p bmNsYXVzZSBpbiB0aGUgZ2l2ZW4gbGlzdCAqLwoJZm9yZWFjaChsYywgaW5kZXhqb2luY2xh dXNlcykKCXsKCQlJbmRleENsYXVzZSAqaWNsYXVzZSA9IChJbmRleENsYXVzZSAqKSBsZmly c3QobGMpOwoJCVJlbGlkcwkJY2xhdXNlX3JlbGlkcyA9IGljbGF1c2UtPnJpbmZvLT5jbGF1 c2VfcmVsaWRzOwoJCUVxdWl2YWxlbmNlQ2xhc3MgKnBhcmVudF9lYyA9IGljbGF1c2UtPnJp bmZvLT5wYXJlbnRfZWM7CgkJaW50CQkJbnVtX2NvbnNpZGVyZWRfcmVsaWRzOwoKCQkvKiBJ ZiB3ZSBhbHJlYWR5IHRyaWVkIGl0cyByZWxpZHMgc2V0LCBubyBuZWVkIHRvIGRvIHNvIGFn YWluICovCgkJaWYgKGxpc3RfbWVtYmVyKCpjb25zaWRlcmVkX3JlbGlkcywgY2xhdXNlX3Jl bGlkcykpCgkJCWNvbnRpbnVlOwoKCQkvKgoJCSAqIEdlbmVyYXRlIHRoZSB1bmlvbiBvZiB0 aGlzIGNsYXVzZSdzIHJlbGlkcyBzZXQgd2l0aCBlYWNoCgkJICogcHJldmlvdXNseS10cmll ZCBzZXQuICBUaGlzIGVuc3VyZXMgd2UgdHJ5IHRoaXMgY2xhdXNlIGFsb25nIHdpdGgKCQkg KiBldmVyeSBpbnRlcmVzdGluZyBzdWJzZXQgb2YgcHJldmlvdXMgY2xhdXNlcy4gIEhvd2V2 ZXIsIHRvIGF2b2lkCgkJICogZXhwb25lbnRpYWwgZ3Jvd3RoIG9mIHBsYW5uaW5nIHRpbWUg d2hlbiB0aGVyZSBhcmUgbWFueSBjbGF1c2VzLAoJCSAqIGxpbWl0IHRoZSBudW1iZXIgb2Yg cmVsaWQgc2V0cyBhY2NlcHRlZCB0byAxMCAqIGNvbnNpZGVyZWRfY2xhdXNlcy4KCQkgKgoJ CSAqIE5vdGU6IGdldF9qb2luX2luZGV4X3BhdGhzIGFwcGVuZHMgZW50cmllcyB0byAqY29u c2lkZXJlZF9yZWxpZHMsCgkJICogYnV0IHdlIGRvIG5vdCBuZWVkIHRvIHZpc2l0IHN1Y2gg bmV3bHktYWRkZWQgZW50cmllcyB3aXRoaW4gdGhpcwoJCSAqIGxvb3AsIHNvIHdlIGRvbid0 IHVzZSBmb3JlYWNoKCkgaGVyZS4gIE5vIHJlYWwgaGFybSB3b3VsZCBiZSBkb25lCgkJICog aWYgd2UgZGlkIHZpc2l0IHRoZW0sIHNpbmNlIHRoZSBzdWJzZXQgY2hlY2sgd291bGQgcmVq ZWN0IHRoZW07IGJ1dAoJCSAqIGl0IHdvdWxkIHdhc3RlIHNvbWUgY3ljbGVzLgoJCSAqLwoJ CW51bV9jb25zaWRlcmVkX3JlbGlkcyA9IGxpc3RfbGVuZ3RoKCpjb25zaWRlcmVkX3JlbGlk cyk7CgkJZm9yIChpbnQgcG9zID0gMDsgcG9zIDwgbnVtX2NvbnNpZGVyZWRfcmVsaWRzOyBw b3MrKykKCQl7CgkJCVJlbGlkcwkJb2xkcmVsaWRzID0gKFJlbGlkcykgbGlzdF9udGgoKmNv bnNpZGVyZWRfcmVsaWRzLCBwb3MpOwoKCQkJLyoKCQkJICogSWYgZWl0aGVyIGlzIGEgc3Vi c2V0IG9mIHRoZSBvdGhlciwgbm8gbmV3IHNldCBpcyBwb3NzaWJsZS4KCQkJICogVGhpcyBp c24ndCBhIGNvbXBsZXRlIHRlc3QgZm9yIHJlZHVuZGFuY3ksIGJ1dCBpdCdzIGVhc3kgYW5k CgkJCSAqIGNoZWFwLiAgZ2V0X2pvaW5faW5kZXhfcGF0aHMgd2lsbCBjaGVjayBtb3JlIGNh cmVmdWxseSBpZiB3ZQoJCQkgKiBhbHJlYWR5IGdlbmVyYXRlZCB0aGUgc2FtZSByZWxpZHMg c2V0LgoJCQkgKi8KCQkJaWYgKGJtc19zdWJzZXRfY29tcGFyZShjbGF1c2VfcmVsaWRzLCBv bGRyZWxpZHMpICE9IEJNU19ESUZGRVJFTlQpCgkJCQljb250aW51ZTsKCgkJCS8qCgkJCSAq IElmIHRoaXMgY2xhdXNlIHdhcyBkZXJpdmVkIGZyb20gYW4gZXF1aXZhbGVuY2UgY2xhc3Ms IHRoZQoJCQkgKiBjbGF1c2UgbGlzdCBtYXkgY29udGFpbiBvdGhlciBjbGF1c2VzIGRlcml2 ZWQgZnJvbSB0aGUgc2FtZQoJCQkgKiBlY2xhc3MuICBXZSBzaG91bGQgbm90IGNvbnNpZGVy IHRoYXQgY29tYmluaW5nIHRoaXMgY2xhdXNlIHdpdGgKCQkJICogb25lIG9mIHRob3NlIGNs YXVzZXMgZ2VuZXJhdGVzIGEgdXNlZnVsbHkgZGlmZmVyZW50CgkJCSAqIHBhcmFtZXRlcml6 YXRpb247IHNvIHNraXAgaWYgYW55IGNsYXVzZSBkZXJpdmVkIGZyb20gdGhlIHNhbWUKCQkJ ICogZWNsYXNzIHdvdWxkIGFscmVhZHkgaGF2ZSBiZWVuIGluY2x1ZGVkIHdoZW4gdXNpbmcg b2xkcmVsaWRzLgoJCQkgKi8KCQkJaWYgKHBhcmVudF9lYyAmJgoJCQkJZWNsYXNzX2FscmVh ZHlfdXNlZChwYXJlbnRfZWMsIG9sZHJlbGlkcywKCQkJCQkJCQkJaW5kZXhqb2luY2xhdXNl cykpCgkJCQljb250aW51ZTsKCgkJCS8qCgkJCSAqIElmIHRoZSBudW1iZXIgb2YgcmVsaWQg c2V0cyBjb25zaWRlcmVkIGV4Y2VlZHMgb3VyIGhldXJpc3RpYwoJCQkgKiBsaW1pdCwgc3Rv cCBjb25zaWRlcmluZyBjb21iaW5hdGlvbnMgb2YgY2xhdXNlcy4gIFdlJ2xsIHN0aWxsCgkJ CSAqIGNvbnNpZGVyIHRoZSBjdXJyZW50IGNsYXVzZSBhbG9uZSwgdGhvdWdoIChiZWxvdyB0 aGlzIGxvb3ApLgoJCQkgKi8KCQkJaWYgKGxpc3RfbGVuZ3RoKCpjb25zaWRlcmVkX3JlbGlk cykgPj0gMTAgKiBjb25zaWRlcmVkX2NsYXVzZXMpCgkJCQlicmVhazsKCgkJCS8qIE9LLCB0 cnkgdGhlIHVuaW9uIHNldCAqLwoJCQlnZXRfam9pbl9pbmRleF9wYXRocyhyb290LCByZWws IGluZGV4LAoJCQkJCQkJCSByY2xhdXNlc2V0LCBqY2xhdXNlc2V0LCBlY2xhdXNlc2V0LAoJ CQkJCQkJCSBiaXRpbmRleHBhdGhzLAoJCQkJCQkJCSBibXNfdW5pb24oY2xhdXNlX3JlbGlk cywgb2xkcmVsaWRzKSwKCQkJCQkJCQkgY29uc2lkZXJlZF9yZWxpZHMpOwoJCX0KCgkJLyog QWxzbyB0cnkgdGhpcyBzZXQgb2YgcmVsaWRzIGJ5IGl0c2VsZiAqLwoJCWdldF9qb2luX2lu ZGV4X3BhdGhzKHJvb3QsIHJlbCwgaW5kZXgsCgkJCQkJCQkgcmNsYXVzZXNldCwgamNsYXVz ZXNldCwgZWNsYXVzZXNldCwKCQkJCQkJCSBiaXRpbmRleHBhdGhzLAoJCQkJCQkJIGNsYXVz ZV9yZWxpZHMsCgkJCQkJCQkgY29uc2lkZXJlZF9yZWxpZHMpOwoJfQp9CgovKgogKiBnZXRf am9pbl9pbmRleF9wYXRocwogKgkgIEdlbmVyYXRlIGluZGV4IHBhdGhzIHVzaW5nIGNsYXVz ZXMgZnJvbSB0aGUgc3BlY2lmaWVkIG91dGVyIHJlbGF0aW9ucy4KICoJICBJbiBhZGRpdGlv biB0byBnZW5lcmF0aW5nIHBhdGhzLCByZWxpZHMgaXMgYWRkZWQgdG8gKmNvbnNpZGVyZWRf cmVsaWRzCiAqCSAgaWYgbm90IGFscmVhZHkgcHJlc2VudC4KICoKICogV29ya2hvcnNlIGZv ciBjb25zaWRlcl9pbmRleF9qb2luX2NsYXVzZXM7IHNlZSBub3RlcyB0aGVyZWluIGZvciBy YXRpb25hbGUuCiAqCiAqICdyZWwnLCAnaW5kZXgnLCAncmNsYXVzZXNldCcsICdqY2xhdXNl c2V0JywgJ2VjbGF1c2VzZXQnLAogKgkJJ2JpdGluZGV4cGF0aHMnLCAnY29uc2lkZXJlZF9y ZWxpZHMnIGFzIGFib3ZlCiAqICdyZWxpZHMnIGlzIHRoZSBjdXJyZW50IHNldCBvZiByZWxp ZHMgdG8gY29uc2lkZXIgKHRoZSB0YXJnZXQgcmVsIHBsdXMKICoJCW9uZSBvciBtb3JlIG91 dGVyIHJlbHMpCiAqLwpzdGF0aWMgdm9pZApnZXRfam9pbl9pbmRleF9wYXRocyhQbGFubmVy SW5mbyAqcm9vdCwgUmVsT3B0SW5mbyAqcmVsLAoJCQkJCSBJbmRleE9wdEluZm8gKmluZGV4 LAoJCQkJCSBJbmRleENsYXVzZVNldCAqcmNsYXVzZXNldCwKCQkJCQkgSW5kZXhDbGF1c2VT ZXQgKmpjbGF1c2VzZXQsCgkJCQkJIEluZGV4Q2xhdXNlU2V0ICplY2xhdXNlc2V0LAoJCQkJ CSBMaXN0ICoqYml0aW5kZXhwYXRocywKCQkJCQkgUmVsaWRzIHJlbGlkcywKCQkJCQkgTGlz dCAqKmNvbnNpZGVyZWRfcmVsaWRzKQp7CglJbmRleENsYXVzZVNldCBjbGF1c2VzZXQ7Cglp bnQJCQlpbmRleGNvbDsKCgkvKiBJZiB3ZSBhbHJlYWR5IGNvbnNpZGVyZWQgdGhpcyByZWxp ZHMgc2V0LCBkb24ndCByZXBlYXQgdGhlIHdvcmsgKi8KCWlmIChsaXN0X21lbWJlcigqY29u c2lkZXJlZF9yZWxpZHMsIHJlbGlkcykpCgkJcmV0dXJuOwoKCS8qIElkZW50aWZ5IGluZGV4 Y2xhdXNlcyB1c2FibGUgd2l0aCB0aGlzIHJlbGlkcyBzZXQgKi8KCU1lbVNldCgmY2xhdXNl c2V0LCAwLCBzaXplb2YoY2xhdXNlc2V0KSk7CgoJZm9yIChpbmRleGNvbCA9IDA7IGluZGV4 Y29sIDwgaW5kZXgtPm5rZXljb2x1bW5zOyBpbmRleGNvbCsrKQoJewoJCUxpc3RDZWxsICAg KmxjOwoKCQkvKiBGaXJzdCBmaW5kIGFwcGxpY2FibGUgc2ltcGxlIGpvaW4gY2xhdXNlcyAq LwoJCWZvcmVhY2gobGMsIGpjbGF1c2VzZXQtPmluZGV4Y2xhdXNlc1tpbmRleGNvbF0pCgkJ ewoJCQlJbmRleENsYXVzZSAqaWNsYXVzZSA9IChJbmRleENsYXVzZSAqKSBsZmlyc3QobGMp OwoKCQkJaWYgKGJtc19pc19zdWJzZXQoaWNsYXVzZS0+cmluZm8tPmNsYXVzZV9yZWxpZHMs IHJlbGlkcykpCgkJCQljbGF1c2VzZXQuaW5kZXhjbGF1c2VzW2luZGV4Y29sXSA9CgkJCQkJ bGFwcGVuZChjbGF1c2VzZXQuaW5kZXhjbGF1c2VzW2luZGV4Y29sXSwgaWNsYXVzZSk7CgkJ fQoKCQkvKgoJCSAqIEFkZCBhcHBsaWNhYmxlIGVjbGFzcyBqb2luIGNsYXVzZXMuICBUaGUg Y2xhdXNlcyBnZW5lcmF0ZWQgZm9yIGVhY2gKCQkgKiBjb2x1bW4gYXJlIHJlZHVuZGFudCAo Y2YgZ2VuZXJhdGVfaW1wbGllZF9lcXVhbGl0aWVzX2Zvcl9jb2x1bW4pLAoJCSAqIHNvIHdl IG5lZWQgYXQgbW9zdCBvbmUuICBUaGlzIGlzIHRoZSBvbmx5IGV4Y2VwdGlvbiB0byB0aGUg Z2VuZXJhbAoJCSAqIHJ1bGUgb2YgdXNpbmcgYWxsIGF2YWlsYWJsZSBpbmRleCBjbGF1c2Vz LgoJCSAqLwoJCWZvcmVhY2gobGMsIGVjbGF1c2VzZXQtPmluZGV4Y2xhdXNlc1tpbmRleGNv bF0pCgkJewoJCQlJbmRleENsYXVzZSAqaWNsYXVzZSA9IChJbmRleENsYXVzZSAqKSBsZmly c3QobGMpOwoKCQkJaWYgKGJtc19pc19zdWJzZXQoaWNsYXVzZS0+cmluZm8tPmNsYXVzZV9y ZWxpZHMsIHJlbGlkcykpCgkJCXsKCQkJCWNsYXVzZXNldC5pbmRleGNsYXVzZXNbaW5kZXhj b2xdID0KCQkJCQlsYXBwZW5kKGNsYXVzZXNldC5pbmRleGNsYXVzZXNbaW5kZXhjb2xdLCBp Y2xhdXNlKTsKCQkJCWJyZWFrOwoJCQl9CgkJfQoKCQkvKiBBZGQgcmVzdHJpY3Rpb24gY2xh dXNlcyAqLwoJCWNsYXVzZXNldC5pbmRleGNsYXVzZXNbaW5kZXhjb2xdID0KCQkJbGlzdF9j b25jYXQoY2xhdXNlc2V0LmluZGV4Y2xhdXNlc1tpbmRleGNvbF0sCgkJCQkJCXJjbGF1c2Vz ZXQtPmluZGV4Y2xhdXNlc1tpbmRleGNvbF0pOwoKCQlpZiAoY2xhdXNlc2V0LmluZGV4Y2xh dXNlc1tpbmRleGNvbF0gIT0gTklMKQoJCQljbGF1c2VzZXQubm9uZW1wdHkgPSB0cnVlOwoJ fQoKCS8qIFdlIHNob3VsZCBoYXZlIGZvdW5kIHNvbWV0aGluZywgZWxzZSBjYWxsZXIgcGFz c2VkIHNpbGx5IHJlbGlkcyAqLwoJQXNzZXJ0KGNsYXVzZXNldC5ub25lbXB0eSk7CgoJLyog QnVpbGQgaW5kZXggcGF0aChzKSB1c2luZyB0aGUgY29sbGVjdGVkIHNldCBvZiBjbGF1c2Vz ICovCglnZXRfaW5kZXhfcGF0aHMocm9vdCwgcmVsLCBpbmRleCwgJmNsYXVzZXNldCwgYml0 aW5kZXhwYXRocyk7CgoJLyoKCSAqIFJlbWVtYmVyIHdlIGNvbnNpZGVyZWQgcGF0aHMgZm9y IHRoaXMgc2V0IG9mIHJlbGlkcy4KCSAqLwoJKmNvbnNpZGVyZWRfcmVsaWRzID0gbGFwcGVu ZCgqY29uc2lkZXJlZF9yZWxpZHMsIHJlbGlkcyk7Cn0KCi8qCiAqIGVjbGFzc19hbHJlYWR5 X3VzZWQKICoJCVRydWUgaWYgYW55IGpvaW4gY2xhdXNlIHVzYWJsZSB3aXRoIG9sZHJlbGlk cyB3YXMgZ2VuZXJhdGVkIGZyb20KICoJCXRoZSBzcGVjaWZpZWQgZXF1aXZhbGVuY2UgY2xh c3MuCiAqLwpzdGF0aWMgYm9vbAplY2xhc3NfYWxyZWFkeV91c2VkKEVxdWl2YWxlbmNlQ2xh c3MgKnBhcmVudF9lYywgUmVsaWRzIG9sZHJlbGlkcywKCQkJCQlMaXN0ICppbmRleGpvaW5j bGF1c2VzKQp7CglMaXN0Q2VsbCAgICpsYzsKCglmb3JlYWNoKGxjLCBpbmRleGpvaW5jbGF1 c2VzKQoJewoJCUluZGV4Q2xhdXNlICppY2xhdXNlID0gKEluZGV4Q2xhdXNlICopIGxmaXJz dChsYyk7CgkJUmVzdHJpY3RJbmZvICpyaW5mbyA9IGljbGF1c2UtPnJpbmZvOwoKCQlpZiAo cmluZm8tPnBhcmVudF9lYyA9PSBwYXJlbnRfZWMgJiYKCQkJYm1zX2lzX3N1YnNldChyaW5m by0+Y2xhdXNlX3JlbGlkcywgb2xkcmVsaWRzKSkKCQkJcmV0dXJuIHRydWU7Cgl9CglyZXR1 cm4gZmFsc2U7Cn0KCgovKgogKiBnZXRfaW5kZXhfcGF0aHMKICoJICBHaXZlbiBhbiBpbmRl eCBhbmQgYSBzZXQgb2YgaW5kZXggY2xhdXNlcyBmb3IgaXQsIGNvbnN0cnVjdCBJbmRleFBh dGhzLgogKgogKiBQbGFpbiBpbmRleHBhdGhzIGFyZSBzZW50IGRpcmVjdGx5IHRvIGFkZF9w YXRoLCB3aGlsZSBwb3RlbnRpYWwKICogYml0bWFwIGluZGV4cGF0aHMgYXJlIGFkZGVkIHRv ICpiaXRpbmRleHBhdGhzIGZvciBsYXRlciBwcm9jZXNzaW5nLgogKgogKiBUaGlzIGlzIGEg ZmFpcmx5IHNpbXBsZSBmcm9udGVuZCB0byBidWlsZF9pbmRleF9wYXRocygpLiAgSXRzIHJl YXNvbiBmb3IKICogZXhpc3RlbmNlIGlzIG1haW5seSB0byBoYW5kbGUgU2NhbGFyQXJyYXlP cEV4cHIgcXVhbHMgcHJvcGVybHkuICBJZiB0aGUKICogaW5kZXggQU0gc3VwcG9ydHMgdGhl bSBuYXRpdmVseSwgd2Ugc2hvdWxkIGp1c3QgaW5jbHVkZSB0aGVtIGluIHNpbXBsZQogKiBp bmRleCBwYXRocy4gIElmIG5vdCwgd2Ugc2hvdWxkIGV4Y2x1ZGUgdGhlbSB3aGlsZSBidWls ZGluZyBzaW1wbGUgaW5kZXgKICogcGF0aHMsIGFuZCB0aGVuIG1ha2UgYSBzZXBhcmF0ZSBh dHRlbXB0IHRvIGluY2x1ZGUgdGhlbSBpbiBiaXRtYXAgcGF0aHMuCiAqLwpzdGF0aWMgdm9p ZApnZXRfaW5kZXhfcGF0aHMoUGxhbm5lckluZm8gKnJvb3QsIFJlbE9wdEluZm8gKnJlbCwK CQkJCUluZGV4T3B0SW5mbyAqaW5kZXgsIEluZGV4Q2xhdXNlU2V0ICpjbGF1c2VzLAoJCQkJ TGlzdCAqKmJpdGluZGV4cGF0aHMpCnsKCUxpc3QJICAgKmluZGV4cGF0aHM7Cglib29sCQlz a2lwX25vbm5hdGl2ZV9zYW9wID0gZmFsc2U7CglMaXN0Q2VsbCAgICpsYzsKCgkvKgoJICog QnVpbGQgc2ltcGxlIGluZGV4IHBhdGhzIHVzaW5nIHRoZSBjbGF1c2VzLiAgQWxsb3cgU2Nh bGFyQXJyYXlPcEV4cHIKCSAqIGNsYXVzZXMgb25seSBpZiB0aGUgaW5kZXggQU0gc3VwcG9y dHMgdGhlbSBuYXRpdmVseS4KCSAqLwoJaW5kZXhwYXRocyA9IGJ1aWxkX2luZGV4X3BhdGhz KHJvb3QsIHJlbCwKCQkJCQkJCQkgICBpbmRleCwgY2xhdXNlcywKCQkJCQkJCQkgICBpbmRl eC0+cHJlZE9LLAoJCQkJCQkJCSAgIFNUX0FOWVNDQU4sCgkJCQkJCQkJICAgJnNraXBfbm9u bmF0aXZlX3Nhb3ApOwoKCS8qCgkgKiBTdWJtaXQgYWxsIHRoZSBvbmVzIHRoYXQgY2FuIGZv cm0gcGxhaW4gSW5kZXhTY2FuIHBsYW5zIHRvIGFkZF9wYXRoLiAoQQoJICogcGxhaW4gSW5k ZXhQYXRoIGNhbiByZXByZXNlbnQgZWl0aGVyIGEgcGxhaW4gSW5kZXhTY2FuIG9yIGFuCgkg KiBJbmRleE9ubHlTY2FuLCBidXQgZm9yIG91ciBwdXJwb3NlcyBoZXJlIHRoYXQgZGlzdGlu Y3Rpb24gZG9lcyBub3QKCSAqIG1hdHRlci4gIEhvd2V2ZXIsIHNvbWUgb2YgdGhlIGluZGV4 ZXMgbWlnaHQgc3VwcG9ydCBvbmx5IGJpdG1hcCBzY2FucywKCSAqIGFuZCB0aG9zZSB3ZSBt dXN0bid0IHN1Ym1pdCB0byBhZGRfcGF0aCBoZXJlLikKCSAqCgkgKiBBbHNvLCBwaWNrIG91 dCB0aGUgb25lcyB0aGF0IGFyZSB1c2FibGUgYXMgYml0bWFwIHNjYW5zLiAgRm9yIHRoYXQs IHdlCgkgKiBtdXN0IGRpc2NhcmQgaW5kZXhlcyB0aGF0IGRvbid0IHN1cHBvcnQgYml0bWFw IHNjYW5zLCBhbmQgd2UgYWxzbyBhcmUKCSAqIG9ubHkgaW50ZXJlc3RlZCBpbiBwYXRocyB0 aGF0IGhhdmUgc29tZSBzZWxlY3Rpdml0eTsgd2Ugc2hvdWxkIGRpc2NhcmQKCSAqIGFueXRo aW5nIHRoYXQgd2FzIGdlbmVyYXRlZCBzb2xlbHkgZm9yIG9yZGVyaW5nIHB1cnBvc2VzLgoJ ICovCglmb3JlYWNoKGxjLCBpbmRleHBhdGhzKQoJewoJCUluZGV4UGF0aCAgKmlwYXRoID0g KEluZGV4UGF0aCAqKSBsZmlyc3QobGMpOwoKCQlpZiAoaW5kZXgtPmFtaGFzZ2V0dHVwbGUp CgkJCWFkZF9wYXRoKHJlbCwgKFBhdGggKikgaXBhdGgpOwoKCQlpZiAoaW5kZXgtPmFtaGFz Z2V0Yml0bWFwICYmCgkJCShpcGF0aC0+cGF0aC5wYXRoa2V5cyA9PSBOSUwgfHwKCQkJIGlw YXRoLT5pbmRleHNlbGVjdGl2aXR5IDwgMS4wKSkKCQkJKmJpdGluZGV4cGF0aHMgPSBsYXBw ZW5kKCpiaXRpbmRleHBhdGhzLCBpcGF0aCk7Cgl9CgoJLyoKCSAqIElmIHRoZXJlIHdlcmUg U2NhbGFyQXJyYXlPcEV4cHIgY2xhdXNlcyB0aGF0IHRoZSBpbmRleCBjYW4ndCBoYW5kbGUK CSAqIG5hdGl2ZWx5LCBnZW5lcmF0ZSBiaXRtYXAgc2NhbiBwYXRocyByZWx5aW5nIG9uIGV4 ZWN1dG9yLW1hbmFnZWQKCSAqIFNjYWxhckFycmF5T3BFeHByLgoJICovCglpZiAoc2tpcF9u b25uYXRpdmVfc2FvcCkKCXsKCQlpbmRleHBhdGhzID0gYnVpbGRfaW5kZXhfcGF0aHMocm9v dCwgcmVsLAoJCQkJCQkJCQkgICBpbmRleCwgY2xhdXNlcywKCQkJCQkJCQkJICAgZmFsc2Us CgkJCQkJCQkJCSAgIFNUX0JJVE1BUFNDQU4sCgkJCQkJCQkJCSAgIE5VTEwpOwoJCSpiaXRp bmRleHBhdGhzID0gbGlzdF9jb25jYXQoKmJpdGluZGV4cGF0aHMsIGluZGV4cGF0aHMpOwoJ fQp9CgovKgogKiBidWlsZF9pbmRleF9wYXRocwogKgkgIEdpdmVuIGFuIGluZGV4IGFuZCBh IHNldCBvZiBpbmRleCBjbGF1c2VzIGZvciBpdCwgY29uc3RydWN0IHplcm8KICoJICBvciBt b3JlIEluZGV4UGF0aHMuIEl0IGFsc28gY29uc3RydWN0cyB6ZXJvIG9yIG1vcmUgcGFydGlh bCBJbmRleFBhdGhzLgogKgogKiBXZSByZXR1cm4gYSBsaXN0IG9mIHBhdGhzIGJlY2F1c2Ug KDEpIHRoaXMgcm91dGluZSBjaGVja3Mgc29tZSBjYXNlcwogKiB0aGF0IHNob3VsZCBjYXVz ZSB1cyB0byBub3QgZ2VuZXJhdGUgYW55IEluZGV4UGF0aCwgYW5kICgyKSBpbiBzb21lCiAq IGNhc2VzIHdlIHdhbnQgdG8gY29uc2lkZXIgYm90aCBhIGZvcndhcmQgYW5kIGEgYmFja3dh cmQgc2Nhbiwgc28gYXMKICogdG8gb2J0YWluIGJvdGggc29ydCBvcmRlcnMuICBOb3RlIHRo YXQgdGhlIHBhdGhzIGFyZSBqdXN0IHJldHVybmVkCiAqIHRvIHRoZSBjYWxsZXIgYW5kIG5v dCBpbW1lZGlhdGVseSBmZWQgdG8gYWRkX3BhdGgoKS4KICoKICogQXQgdG9wIGxldmVsLCB1 c2VmdWxfcHJlZGljYXRlIHNob3VsZCBiZSBleGFjdGx5IHRoZSBpbmRleCdzIHByZWRPSyBm bGFnCiAqIChpZSwgdHJ1ZSBpZiBpdCBoYXMgYSBwcmVkaWNhdGUgdGhhdCB3YXMgcHJvdmVu IGZyb20gdGhlIHJlc3RyaWN0aW9uCiAqIGNsYXVzZXMpLiAgV2hlbiB3b3JraW5nIG9uIGFu IGFybSBvZiBhbiBPUiBjbGF1c2UsIHVzZWZ1bF9wcmVkaWNhdGUKICogc2hvdWxkIGJlIHRy dWUgaWYgdGhlIHByZWRpY2F0ZSByZXF1aXJlZCB0aGUgY3VycmVudCBPUiBsaXN0IHRvIGJl IHByb3Zlbi4KICogTm90ZSB0aGF0IHRoaXMgcm91dGluZSBzaG91bGQgbmV2ZXIgYmUgY2Fs bGVkIGF0IGFsbCBpZiB0aGUgaW5kZXggaGFzIGFuCiAqIHVucHJvdmFibGUgcHJlZGljYXRl LgogKgogKiBzY2FudHlwZSBpbmRpY2F0ZXMgd2hldGhlciB3ZSB3YW50IHRvIGNyZWF0ZSBw bGFpbiBpbmRleHNjYW5zLCBiaXRtYXAKICogaW5kZXhzY2Fucywgb3IgYm90aC4gIFdoZW4g aXQncyBTVF9CSVRNQVBTQ0FOLCB3ZSB3aWxsIG5vdCBjb25zaWRlcgogKiBpbmRleCBvcmRl cmluZyB3aGlsZSBkZWNpZGluZyBpZiBhIFBhdGggaXMgd29ydGggZ2VuZXJhdGluZy4KICoK ICogSWYgc2tpcF9ub25uYXRpdmVfc2FvcCBpcyBub24tTlVMTCwgd2UgaWdub3JlIFNjYWxh ckFycmF5T3BFeHByIGNsYXVzZXMKICogdW5sZXNzIHRoZSBpbmRleCBBTSBzdXBwb3J0cyB0 aGVtIGRpcmVjdGx5LCBhbmQgd2Ugc2V0ICpza2lwX25vbm5hdGl2ZV9zYW9wCiAqIHRvIHRy dWUgaWYgd2UgZm91bmQgYW55IHN1Y2ggY2xhdXNlcyAoY2FsbGVyIG11c3QgaW5pdGlhbGl6 ZSB0aGUgdmFyaWFibGUKICogdG8gZmFsc2UpLiAgSWYgaXQncyBOVUxMLCB3ZSBkbyBub3Qg aWdub3JlIFNjYWxhckFycmF5T3BFeHByIGNsYXVzZXMuCiAqCiAqICdyZWwnIGlzIHRoZSBp bmRleCdzIGhlYXAgcmVsYXRpb24KICogJ2luZGV4JyBpcyB0aGUgaW5kZXggZm9yIHdoaWNo IHdlIHdhbnQgdG8gZ2VuZXJhdGUgcGF0aHMKICogJ2NsYXVzZXMnIGlzIHRoZSBjb2xsZWN0 aW9uIG9mIGluZGV4YWJsZSBjbGF1c2VzIChJbmRleENsYXVzZSBub2RlcykKICogJ3VzZWZ1 bF9wcmVkaWNhdGUnIGluZGljYXRlcyB3aGV0aGVyIHRoZSBpbmRleCBoYXMgYSB1c2VmdWwg cHJlZGljYXRlCiAqICdzY2FudHlwZScgaW5kaWNhdGVzIHdoZXRoZXIgd2UgbmVlZCBwbGFp biBvciBiaXRtYXAgc2NhbiBzdXBwb3J0CiAqICdza2lwX25vbm5hdGl2ZV9zYW9wJyBpbmRp Y2F0ZXMgd2hldGhlciB0byBhY2NlcHQgU0FPUCBpZiBpbmRleCBBTSBkb2Vzbid0CiAqLwpz dGF0aWMgTGlzdCAqCmJ1aWxkX2luZGV4X3BhdGhzKFBsYW5uZXJJbmZvICpyb290LCBSZWxP cHRJbmZvICpyZWwsCgkJCQkgIEluZGV4T3B0SW5mbyAqaW5kZXgsIEluZGV4Q2xhdXNlU2V0 ICpjbGF1c2VzLAoJCQkJICBib29sIHVzZWZ1bF9wcmVkaWNhdGUsCgkJCQkgIFNjYW5UeXBl Q29udHJvbCBzY2FudHlwZSwKCQkJCSAgYm9vbCAqc2tpcF9ub25uYXRpdmVfc2FvcCkKewoJ TGlzdAkgICAqcmVzdWx0ID0gTklMOwoJSW5kZXhQYXRoICAqaXBhdGg7CglMaXN0CSAgICpp bmRleF9jbGF1c2VzOwoJUmVsaWRzCQlvdXRlcl9yZWxpZHM7Cglkb3VibGUJCWxvb3BfY291 bnQ7CglMaXN0CSAgICpvcmRlcmJ5Y2xhdXNlczsKCUxpc3QJICAgKm9yZGVyYnljbGF1c2Vj b2xzOwoJTGlzdAkgICAqaW5kZXhfcGF0aGtleXM7CglMaXN0CSAgICp1c2VmdWxfcGF0aGtl eXM7Cglib29sCQlwYXRoa2V5c19wb3NzaWJseV91c2VmdWw7Cglib29sCQlpbmRleF9pc19v cmRlcmVkOwoJYm9vbAkJaW5kZXhfb25seV9zY2FuOwoJaW50CQkJaW5kZXhjb2w7CgoJQXNz ZXJ0KHNraXBfbm9ubmF0aXZlX3Nhb3AgIT0gTlVMTCB8fCBzY2FudHlwZSA9PSBTVF9CSVRN QVBTQ0FOKTsKCgkvKgoJICogQ2hlY2sgdGhhdCBpbmRleCBzdXBwb3J0cyB0aGUgZGVzaXJl ZCBzY2FuIHR5cGUocykKCSAqLwoJc3dpdGNoIChzY2FudHlwZSkKCXsKCQljYXNlIFNUX0lO REVYU0NBTjoKCQkJaWYgKCFpbmRleC0+YW1oYXNnZXR0dXBsZSkKCQkJCXJldHVybiBOSUw7 CgkJCWJyZWFrOwoJCWNhc2UgU1RfQklUTUFQU0NBTjoKCQkJaWYgKCFpbmRleC0+YW1oYXNn ZXRiaXRtYXApCgkJCQlyZXR1cm4gTklMOwoJCQlicmVhazsKCQljYXNlIFNUX0FOWVNDQU46 CgkJCS8qIGVpdGhlciBvciBib3RoIGFyZSBPSyAqLwoJCQlicmVhazsKCX0KCgkvKgoJICog MS4gQ29tYmluZSB0aGUgcGVyLWNvbHVtbiBJbmRleENsYXVzZSBsaXN0cyBpbnRvIGFuIG92 ZXJhbGwgbGlzdC4KCSAqCgkgKiBJbiB0aGUgcmVzdWx0aW5nIGxpc3QsIGNsYXVzZXMgYXJl IG9yZGVyZWQgYnkgaW5kZXgga2V5LCBzbyB0aGF0IHRoZQoJICogY29sdW1uIG51bWJlcnMg Zm9ybSBhIG5vbmRlY3JlYXNpbmcgc2VxdWVuY2UuICAoVGhpcyBvcmRlciBpcyBkZXBlbmRl ZAoJICogb24gYnkgYnRyZWUgYW5kIHBvc3NpYmx5IG90aGVyIHBsYWNlcy4pICBUaGUgbGlz dCBjYW4gYmUgZW1wdHksIGlmIHRoZQoJICogaW5kZXggQU0gYWxsb3dzIHRoYXQuCgkgKgoJ ICogV2UgYWxzbyBidWlsZCBhIFJlbGlkcyBzZXQgc2hvd2luZyB3aGljaCBvdXRlciByZWxz IGFyZSByZXF1aXJlZCBieSB0aGUKCSAqIHNlbGVjdGVkIGNsYXVzZXMuICBBbnkgbGF0ZXJh bF9yZWxpZHMgYXJlIGluY2x1ZGVkIGluIHRoYXQsIGJ1dCBub3QKCSAqIG90aGVyd2lzZSBh Y2NvdW50ZWQgZm9yLgoJICovCglpbmRleF9jbGF1c2VzID0gTklMOwoJb3V0ZXJfcmVsaWRz ID0gYm1zX2NvcHkocmVsLT5sYXRlcmFsX3JlbGlkcyk7Cglmb3IgKGluZGV4Y29sID0gMDsg aW5kZXhjb2wgPCBpbmRleC0+bmtleWNvbHVtbnM7IGluZGV4Y29sKyspCgl7CgkJTGlzdENl bGwgICAqbGM7CgoJCWZvcmVhY2gobGMsIGNsYXVzZXMtPmluZGV4Y2xhdXNlc1tpbmRleGNv bF0pCgkJewoJCQlJbmRleENsYXVzZSAqaWNsYXVzZSA9IChJbmRleENsYXVzZSAqKSBsZmly c3QobGMpOwoJCQlSZXN0cmljdEluZm8gKnJpbmZvID0gaWNsYXVzZS0+cmluZm87CgoJCQlp ZiAoc2tpcF9ub25uYXRpdmVfc2FvcCAmJiAhaW5kZXgtPmFtc2VhcmNoYXJyYXkgJiYKCQkJ CUlzQShyaW5mby0+Y2xhdXNlLCBTY2FsYXJBcnJheU9wRXhwcikpCgkJCXsKCQkJCS8qCgkJ CQkgKiBDYWxsZXIgYXNrZWQgdXMgdG8gZ2VuZXJhdGUgSW5kZXhQYXRocyB0aGF0IG9taXQg YW55CgkJCQkgKiBTY2FsYXJBcnJheU9wRXhwciBjbGF1c2VzIHdoZW4gdGhlIHVuZGVybHlp bmcgaW5kZXggQU0KCQkJCSAqIGxhY2tzIG5hdGl2ZSBzdXBwb3J0LgoJCQkJICoKCQkJCSAq IFdlIG11c3Qgb21pdCB0aGlzIGNsYXVzZSAoYW5kIHRlbGwgY2FsbGVyIGFib3V0IGl0KS4K CQkJCSAqLwoJCQkJKnNraXBfbm9ubmF0aXZlX3Nhb3AgPSB0cnVlOwoJCQkJY29udGludWU7 CgkJCX0KCgkJCS8qIE9LIHRvIGluY2x1ZGUgdGhpcyBjbGF1c2UgKi8KCQkJaW5kZXhfY2xh dXNlcyA9IGxhcHBlbmQoaW5kZXhfY2xhdXNlcywgaWNsYXVzZSk7CgkJCW91dGVyX3JlbGlk cyA9IGJtc19hZGRfbWVtYmVycyhvdXRlcl9yZWxpZHMsCgkJCQkJCQkJCQkgICByaW5mby0+ Y2xhdXNlX3JlbGlkcyk7CgkJfQoKCQkvKgoJCSAqIElmIG5vIGNsYXVzZXMgbWF0Y2ggdGhl IGZpcnN0IGluZGV4IGNvbHVtbiwgY2hlY2sgZm9yIGFtb3B0aW9uYWxrZXkKCQkgKiByZXN0 cmljdGlvbi4gIFdlIGNhbid0IGdlbmVyYXRlIGEgc2NhbiBvdmVyIGFuIGluZGV4IHdpdGgK CQkgKiBhbW9wdGlvbmFsa2V5ID0gZmFsc2UgdW5sZXNzIHRoZXJlJ3MgYXQgbGVhc3Qgb25l IGluZGV4IGNsYXVzZS4KCQkgKiAoV2hlbiB3b3JraW5nIG9uIGNvbHVtbnMgYWZ0ZXIgdGhl IGZpcnN0LCB0aGlzIHRlc3QgY2Fubm90IGZhaWwuIEl0CgkJICogaXMgYWx3YXlzIG9rYXkg Zm9yIGNvbHVtbnMgYWZ0ZXIgdGhlIGZpcnN0IHRvIG5vdCBoYXZlIGFueQoJCSAqIGNsYXVz ZXMuKQoJCSAqLwoJCWlmIChpbmRleF9jbGF1c2VzID09IE5JTCAmJiAhaW5kZXgtPmFtb3B0 aW9uYWxrZXkpCgkJCXJldHVybiBOSUw7Cgl9CgoJLyogV2UgZG8gbm90IHdhbnQgdGhlIGlu ZGV4J3MgcmVsIGl0c2VsZiBsaXN0ZWQgaW4gb3V0ZXJfcmVsaWRzICovCglvdXRlcl9yZWxp ZHMgPSBibXNfZGVsX21lbWJlcihvdXRlcl9yZWxpZHMsIHJlbC0+cmVsaWQpOwoKCS8qIENv bXB1dGUgbG9vcF9jb3VudCBmb3IgY29zdCBlc3RpbWF0aW9uIHB1cnBvc2VzICovCglsb29w X2NvdW50ID0gZ2V0X2xvb3BfY291bnQocm9vdCwgcmVsLT5yZWxpZCwgb3V0ZXJfcmVsaWRz KTsKCgkvKgoJICogMi4gQ29tcHV0ZSBwYXRoa2V5cyBkZXNjcmliaW5nIGluZGV4J3Mgb3Jk ZXJpbmcsIGlmIGFueSwgdGhlbiBzZWUgaG93CgkgKiBtYW55IG9mIHRoZW0gYXJlIGFjdHVh bGx5IHVzZWZ1bCBmb3IgdGhpcyBxdWVyeS4gIFRoaXMgaXMgbm90IHJlbGV2YW50CgkgKiBp ZiB3ZSBhcmUgb25seSB0cnlpbmcgdG8gYnVpbGQgYml0bWFwIGluZGV4c2NhbnMuCgkgKi8K CXBhdGhrZXlzX3Bvc3NpYmx5X3VzZWZ1bCA9IChzY2FudHlwZSAhPSBTVF9CSVRNQVBTQ0FO ICYmCgkJCQkJCQkJaGFzX3VzZWZ1bF9wYXRoa2V5cyhyb290LCByZWwpKTsKCWluZGV4X2lz X29yZGVyZWQgPSAoaW5kZXgtPnNvcnRvcGZhbWlseSAhPSBOVUxMKTsKCWlmIChpbmRleF9p c19vcmRlcmVkICYmIHBhdGhrZXlzX3Bvc3NpYmx5X3VzZWZ1bCkKCXsKCQlpbmRleF9wYXRo a2V5cyA9IGJ1aWxkX2luZGV4X3BhdGhrZXlzKHJvb3QsIGluZGV4LAoJCQkJCQkJCQkJCSAg Rm9yd2FyZFNjYW5EaXJlY3Rpb24pOwoJCXVzZWZ1bF9wYXRoa2V5cyA9IHRydW5jYXRlX3Vz ZWxlc3NfcGF0aGtleXMocm9vdCwgcmVsLAoJCQkJCQkJCQkJCQkJaW5kZXhfcGF0aGtleXMp OwoJCW9yZGVyYnljbGF1c2VzID0gTklMOwoJCW9yZGVyYnljbGF1c2Vjb2xzID0gTklMOwoJ fQoJZWxzZSBpZiAoaW5kZXgtPmFtY2Fub3JkZXJieW9wICYmIHBhdGhrZXlzX3Bvc3NpYmx5 X3VzZWZ1bCkKCXsKCQkvKgoJCSAqIFNlZSBpZiB3ZSBjYW4gZ2VuZXJhdGUgb3JkZXJpbmcg b3BlcmF0b3JzIGZvciBxdWVyeV9wYXRoa2V5cyBvciBhdAoJCSAqIGxlYXN0IHNvbWUgcHJl Zml4IHRoZXJlb2YuICBNYXRjaGluZyB0byBqdXN0IGEgcHJlZml4IG9mIHRoZQoJCSAqIHF1 ZXJ5X3BhdGhrZXlzIHdpbGwgYWxsb3cgYW4gaW5jcmVtZW50YWwgc29ydCB0byBiZSBjb25z aWRlcmVkIG9uCgkJICogdGhlIGluZGV4J3MgcGFydGlhbGx5IHNvcnRlZCByZXN1bHRzLgoJ CSAqLwoJCW1hdGNoX3BhdGhrZXlzX3RvX2luZGV4KGluZGV4LCByb290LT5xdWVyeV9wYXRo a2V5cywKCQkJCQkJCQkmb3JkZXJieWNsYXVzZXMsCgkJCQkJCQkJJm9yZGVyYnljbGF1c2Vj b2xzKTsKCQlpZiAobGlzdF9sZW5ndGgocm9vdC0+cXVlcnlfcGF0aGtleXMpID09IGxpc3Rf bGVuZ3RoKG9yZGVyYnljbGF1c2VzKSkKCQkJdXNlZnVsX3BhdGhrZXlzID0gcm9vdC0+cXVl cnlfcGF0aGtleXM7CgkJZWxzZQoJCQl1c2VmdWxfcGF0aGtleXMgPSBsaXN0X2NvcHlfaGVh ZChyb290LT5xdWVyeV9wYXRoa2V5cywKCQkJCQkJCQkJCQkgbGlzdF9sZW5ndGgob3JkZXJi eWNsYXVzZXMpKTsKCX0KCWVsc2UKCXsKCQl1c2VmdWxfcGF0aGtleXMgPSBOSUw7CgkJb3Jk ZXJieWNsYXVzZXMgPSBOSUw7CgkJb3JkZXJieWNsYXVzZWNvbHMgPSBOSUw7Cgl9CgoJLyoK CSAqIDMuIENoZWNrIGlmIGFuIGluZGV4LW9ubHkgc2NhbiBpcyBwb3NzaWJsZS4gIElmIHdl J3JlIG5vdCBidWlsZGluZwoJICogcGxhaW4gaW5kZXhzY2FucywgdGhpcyBpc24ndCByZWxl dmFudCBzaW5jZSBiaXRtYXAgc2NhbnMgZG9uJ3Qgc3VwcG9ydAoJICogaW5kZXggZGF0YSBy ZXRyaWV2YWwgYW55d2F5LgoJICovCglpbmRleF9vbmx5X3NjYW4gPSAoc2NhbnR5cGUgIT0g U1RfQklUTUFQU0NBTiAmJgoJCQkJCSAgIGNoZWNrX2luZGV4X29ubHkocmVsLCBpbmRleCkp OwoKCS8qCgkgKiA0LiBHZW5lcmF0ZSBhbiBpbmRleHNjYW4gcGF0aCBpZiB0aGVyZSBhcmUg cmVsZXZhbnQgcmVzdHJpY3Rpb24gY2xhdXNlcwoJICogaW4gdGhlIGN1cnJlbnQgY2xhdXNl cywgT1IgdGhlIGluZGV4IG9yZGVyaW5nIGlzIHBvdGVudGlhbGx5IHVzZWZ1bCBmb3IKCSAq IGxhdGVyIG1lcmdpbmcgb3IgZmluYWwgb3V0cHV0IG9yZGVyaW5nLCBPUiB0aGUgaW5kZXgg aGFzIGEgdXNlZnVsCgkgKiBwcmVkaWNhdGUsIE9SIGFuIGluZGV4LW9ubHkgc2NhbiBpcyBw b3NzaWJsZS4KCSAqLwoJaWYgKGluZGV4X2NsYXVzZXMgIT0gTklMIHx8IHVzZWZ1bF9wYXRo a2V5cyAhPSBOSUwgfHwgdXNlZnVsX3ByZWRpY2F0ZSB8fAoJCWluZGV4X29ubHlfc2NhbikK CXsKCQlpcGF0aCA9IGNyZWF0ZV9pbmRleF9wYXRoKHJvb3QsIGluZGV4LAoJCQkJCQkJCSAg aW5kZXhfY2xhdXNlcywKCQkJCQkJCQkgIG9yZGVyYnljbGF1c2VzLAoJCQkJCQkJCSAgb3Jk ZXJieWNsYXVzZWNvbHMsCgkJCQkJCQkJICB1c2VmdWxfcGF0aGtleXMsCgkJCQkJCQkJICBG b3J3YXJkU2NhbkRpcmVjdGlvbiwKCQkJCQkJCQkgIGluZGV4X29ubHlfc2NhbiwKCQkJCQkJ CQkgIG91dGVyX3JlbGlkcywKCQkJCQkJCQkgIGxvb3BfY291bnQsCgkJCQkJCQkJICBmYWxz ZSk7CgkJcmVzdWx0ID0gbGFwcGVuZChyZXN1bHQsIGlwYXRoKTsKCgkJLyoKCQkgKiBJZiBh cHByb3ByaWF0ZSwgY29uc2lkZXIgcGFyYWxsZWwgaW5kZXggc2Nhbi4gIFdlIGRvbid0IGFs bG93CgkJICogcGFyYWxsZWwgaW5kZXggc2NhbiBmb3IgYml0bWFwIGluZGV4IHNjYW5zLgoJ CSAqLwoJCWlmIChpbmRleC0+YW1jYW5wYXJhbGxlbCAmJgoJCQlyZWwtPmNvbnNpZGVyX3Bh cmFsbGVsICYmIG91dGVyX3JlbGlkcyA9PSBOVUxMICYmCgkJCXNjYW50eXBlICE9IFNUX0JJ VE1BUFNDQU4pCgkJewoJCQlpcGF0aCA9IGNyZWF0ZV9pbmRleF9wYXRoKHJvb3QsIGluZGV4 LAoJCQkJCQkJCQkgIGluZGV4X2NsYXVzZXMsCgkJCQkJCQkJCSAgb3JkZXJieWNsYXVzZXMs CgkJCQkJCQkJCSAgb3JkZXJieWNsYXVzZWNvbHMsCgkJCQkJCQkJCSAgdXNlZnVsX3BhdGhr ZXlzLAoJCQkJCQkJCQkgIEZvcndhcmRTY2FuRGlyZWN0aW9uLAoJCQkJCQkJCQkgIGluZGV4 X29ubHlfc2NhbiwKCQkJCQkJCQkJICBvdXRlcl9yZWxpZHMsCgkJCQkJCQkJCSAgbG9vcF9j b3VudCwKCQkJCQkJCQkJICB0cnVlKTsKCgkJCS8qCgkJCSAqIGlmLCBhZnRlciBjb3N0aW5n IHRoZSBwYXRoLCB3ZSBmaW5kIHRoYXQgaXQncyBub3Qgd29ydGggdXNpbmcKCQkJICogcGFy YWxsZWwgd29ya2VycywganVzdCBmcmVlIGl0LgoJCQkgKi8KCQkJaWYgKGlwYXRoLT5wYXRo LnBhcmFsbGVsX3dvcmtlcnMgPiAwKQoJCQkJYWRkX3BhcnRpYWxfcGF0aChyZWwsIChQYXRo ICopIGlwYXRoKTsKCQkJZWxzZQoJCQkJcGZyZWUoaXBhdGgpOwoJCX0KCX0KCgkvKgoJICog NS4gSWYgdGhlIGluZGV4IGlzIG9yZGVyZWQsIGEgYmFja3dhcmRzIHNjYW4gbWlnaHQgYmUg aW50ZXJlc3RpbmcuCgkgKi8KCWlmIChpbmRleF9pc19vcmRlcmVkICYmIHBhdGhrZXlzX3Bv c3NpYmx5X3VzZWZ1bCkKCXsKCQlpbmRleF9wYXRoa2V5cyA9IGJ1aWxkX2luZGV4X3BhdGhr ZXlzKHJvb3QsIGluZGV4LAoJCQkJCQkJCQkJCSAgQmFja3dhcmRTY2FuRGlyZWN0aW9uKTsK CQl1c2VmdWxfcGF0aGtleXMgPSB0cnVuY2F0ZV91c2VsZXNzX3BhdGhrZXlzKHJvb3QsIHJl bCwKCQkJCQkJCQkJCQkJCWluZGV4X3BhdGhrZXlzKTsKCQlpZiAodXNlZnVsX3BhdGhrZXlz ICE9IE5JTCkKCQl7CgkJCWlwYXRoID0gY3JlYXRlX2luZGV4X3BhdGgocm9vdCwgaW5kZXgs CgkJCQkJCQkJCSAgaW5kZXhfY2xhdXNlcywKCQkJCQkJCQkJICBOSUwsCgkJCQkJCQkJCSAg TklMLAoJCQkJCQkJCQkgIHVzZWZ1bF9wYXRoa2V5cywKCQkJCQkJCQkJICBCYWNrd2FyZFNj YW5EaXJlY3Rpb24sCgkJCQkJCQkJCSAgaW5kZXhfb25seV9zY2FuLAoJCQkJCQkJCQkgIG91 dGVyX3JlbGlkcywKCQkJCQkJCQkJICBsb29wX2NvdW50LAoJCQkJCQkJCQkgIGZhbHNlKTsK CQkJcmVzdWx0ID0gbGFwcGVuZChyZXN1bHQsIGlwYXRoKTsKCgkJCS8qIElmIGFwcHJvcHJp YXRlLCBjb25zaWRlciBwYXJhbGxlbCBpbmRleCBzY2FuICovCgkJCWlmIChpbmRleC0+YW1j YW5wYXJhbGxlbCAmJgoJCQkJcmVsLT5jb25zaWRlcl9wYXJhbGxlbCAmJiBvdXRlcl9yZWxp ZHMgPT0gTlVMTCAmJgoJCQkJc2NhbnR5cGUgIT0gU1RfQklUTUFQU0NBTikKCQkJewoJCQkJ aXBhdGggPSBjcmVhdGVfaW5kZXhfcGF0aChyb290LCBpbmRleCwKCQkJCQkJCQkJCSAgaW5k ZXhfY2xhdXNlcywKCQkJCQkJCQkJCSAgTklMLAoJCQkJCQkJCQkJICBOSUwsCgkJCQkJCQkJ CQkgIHVzZWZ1bF9wYXRoa2V5cywKCQkJCQkJCQkJCSAgQmFja3dhcmRTY2FuRGlyZWN0aW9u LAoJCQkJCQkJCQkJICBpbmRleF9vbmx5X3NjYW4sCgkJCQkJCQkJCQkgIG91dGVyX3JlbGlk cywKCQkJCQkJCQkJCSAgbG9vcF9jb3VudCwKCQkJCQkJCQkJCSAgdHJ1ZSk7CgoJCQkJLyoK CQkJCSAqIGlmLCBhZnRlciBjb3N0aW5nIHRoZSBwYXRoLCB3ZSBmaW5kIHRoYXQgaXQncyBu b3Qgd29ydGgKCQkJCSAqIHVzaW5nIHBhcmFsbGVsIHdvcmtlcnMsIGp1c3QgZnJlZSBpdC4K CQkJCSAqLwoJCQkJaWYgKGlwYXRoLT5wYXRoLnBhcmFsbGVsX3dvcmtlcnMgPiAwKQoJCQkJ CWFkZF9wYXJ0aWFsX3BhdGgocmVsLCAoUGF0aCAqKSBpcGF0aCk7CgkJCQllbHNlCgkJCQkJ cGZyZWUoaXBhdGgpOwoJCQl9CgkJfQoJfQoKCXJldHVybiByZXN1bHQ7Cn0KCi8qCiAqIGJ1 aWxkX3BhdGhzX2Zvcl9PUgogKgkgIEdpdmVuIGEgbGlzdCBvZiByZXN0cmljdGlvbiBjbGF1 c2VzIGZyb20gb25lIGFybSBvZiBhbiBPUiBjbGF1c2UsCiAqCSAgY29uc3RydWN0IGFsbCBt YXRjaGluZyBJbmRleFBhdGhzIGZvciB0aGUgcmVsYXRpb24uCiAqCiAqIEhlcmUgd2UgbXVz dCBzY2FuIGFsbCBpbmRleGVzIG9mIHRoZSByZWxhdGlvbiwgc2luY2UgYSBiaXRtYXAgT1Ig dHJlZQogKiBjYW4gdXNlIG11bHRpcGxlIGluZGV4ZXMuCiAqCiAqIFRoZSBjYWxsZXIgYWN0 dWFsbHkgc3VwcGxpZXMgdHdvIGxpc3RzIG9mIHJlc3RyaWN0aW9uIGNsYXVzZXM6IHNvbWUK ICogImN1cnJlbnQiIG9uZXMgYW5kIHNvbWUgIm90aGVyIiBvbmVzLiAgQm90aCBsaXN0cyBj YW4gYmUgdXNlZCBmcmVlbHkKICogdG8gbWF0Y2gga2V5cyBvZiB0aGUgaW5kZXgsIGJ1dCBh biBpbmRleCBtdXN0IHVzZSBhdCBsZWFzdCBvbmUgb2YgdGhlCiAqICJjdXJyZW50IiBjbGF1 c2VzIHRvIGJlIGNvbnNpZGVyZWQgdXNhYmxlLiAgVGhlIG1vdGl2YXRpb24gZm9yIHRoaXMg aXMKICogZXhhbXBsZXMgbGlrZQogKgkJV0hFUkUgKHggPSA0MikgQU5EICguLi4gT1IgKHkg PSA1MiBBTkQgeiA9IDc3KSBPUiAuLi4uKQogKiBXaGlsZSB3ZSBhcmUgY29uc2lkZXJpbmcg dGhlIHkveiBzdWJjbGF1c2Ugb2YgdGhlIE9SLCB3ZSBjYW4gdXNlICJ4ID0gNDIiCiAqIGFz IG9uZSBvZiB0aGUgYXZhaWxhYmxlIGluZGV4IGNvbmRpdGlvbnM7IGJ1dCB3ZSBzaG91bGRu J3QgbWF0Y2ggdGhlCiAqIHN1YmNsYXVzZSB0byBhbnkgaW5kZXggb24geCBhbG9uZSwgYmVj YXVzZSBzdWNoIGEgUGF0aCB3b3VsZCBhbHJlYWR5IGhhdmUKICogYmVlbiBnZW5lcmF0ZWQg YXQgdGhlIHVwcGVyIGxldmVsLiAgU28gd2UgY291bGQgdXNlIGFuIGluZGV4IG9uIHgseSx6 CiAqIG9yIGFuIGluZGV4IG9uIHgseSBmb3IgdGhlIE9SIHN1YmNsYXVzZSwgYnV0IG5vdCBh biBpbmRleCBvbiBqdXN0IHguCiAqIFdoZW4gZGVhbGluZyB3aXRoIGEgcGFydGlhbCBpbmRl eCwgYSBtYXRjaCBvZiB0aGUgaW5kZXggcHJlZGljYXRlIHRvCiAqIG9uZSBvZiB0aGUgImN1 cnJlbnQiIGNsYXVzZXMgYWxzbyBtYWtlcyB0aGUgaW5kZXggdXNhYmxlLgogKgogKiAncmVs JyBpcyB0aGUgcmVsYXRpb24gZm9yIHdoaWNoIHdlIHdhbnQgdG8gZ2VuZXJhdGUgaW5kZXgg cGF0aHMKICogJ2NsYXVzZXMnIGlzIHRoZSBjdXJyZW50IGxpc3Qgb2YgY2xhdXNlcyAoUmVz dHJpY3RJbmZvIG5vZGVzKQogKiAnb3RoZXJfY2xhdXNlcycgaXMgdGhlIGxpc3Qgb2YgYWRk aXRpb25hbCB1cHBlci1sZXZlbCBjbGF1c2VzCiAqLwpzdGF0aWMgTGlzdCAqCmJ1aWxkX3Bh dGhzX2Zvcl9PUihQbGFubmVySW5mbyAqcm9vdCwgUmVsT3B0SW5mbyAqcmVsLAoJCQkJICAg TGlzdCAqY2xhdXNlcywgTGlzdCAqb3RoZXJfY2xhdXNlcykKewoJTGlzdAkgICAqcmVzdWx0 ID0gTklMOwoJTGlzdAkgICAqYWxsX2NsYXVzZXMgPSBOSUw7CS8qIG5vdCBjb21wdXRlZCB0 aWxsIG5lZWRlZCAqLwoJTGlzdENlbGwgICAqbGM7CgoJZm9yZWFjaChsYywgcmVsLT5pbmRl eGxpc3QpCgl7CgkJSW5kZXhPcHRJbmZvICppbmRleCA9IChJbmRleE9wdEluZm8gKikgbGZp cnN0KGxjKTsKCQlJbmRleENsYXVzZVNldCBjbGF1c2VzZXQ7CgkJTGlzdAkgICAqaW5kZXhw YXRoczsKCQlib29sCQl1c2VmdWxfcHJlZGljYXRlOwoKCQkvKiBJZ25vcmUgaW5kZXggaWYg aXQgZG9lc24ndCBzdXBwb3J0IGJpdG1hcCBzY2FucyAqLwoJCWlmICghaW5kZXgtPmFtaGFz Z2V0Yml0bWFwKQoJCQljb250aW51ZTsKCgkJLyoKCQkgKiBJZ25vcmUgcGFydGlhbCBpbmRl eGVzIHRoYXQgZG8gbm90IG1hdGNoIHRoZSBxdWVyeS4gIElmIGEgcGFydGlhbAoJCSAqIGlu ZGV4IGlzIG1hcmtlZCBwcmVkT0sgdGhlbiB3ZSBrbm93IGl0J3MgT0suICBPdGhlcndpc2Us IHdlIGhhdmUgdG8KCQkgKiB0ZXN0IHdoZXRoZXIgdGhlIGFkZGVkIGNsYXVzZXMgYXJlIHN1 ZmZpY2llbnQgdG8gaW1wbHkgdGhlCgkJICogcHJlZGljYXRlLiBJZiBzbywgd2UgY2FuIHVz ZSB0aGUgaW5kZXggaW4gdGhlIGN1cnJlbnQgY29udGV4dC4KCQkgKgoJCSAqIFdlIHNldCB1 c2VmdWxfcHJlZGljYXRlIHRvIHRydWUgaWZmIHRoZSBwcmVkaWNhdGUgd2FzIHByb3ZlbiB1 c2luZwoJCSAqIHRoZSBjdXJyZW50IHNldCBvZiBjbGF1c2VzLiAgVGhpcyBpcyBuZWVkZWQg dG8gcHJldmVudCBtYXRjaGluZyBhCgkJICogcHJlZE9LIGluZGV4IHRvIGFuIGFybSBvZiBh biBPUiwgd2hpY2ggd291bGQgYmUgYSBsZWdhbCBidXQKCQkgKiBwb2ludGxlc3NseSBpbmVm ZmljaWVudCBwbGFuLiAgKEEgYmV0dGVyIHBsYW4gd2lsbCBiZSBnZW5lcmF0ZWQgYnkKCQkg KiBqdXN0IHNjYW5uaW5nIHRoZSBwcmVkT0sgaW5kZXggYWxvbmUsIG5vIE9SLikKCQkgKi8K CQl1c2VmdWxfcHJlZGljYXRlID0gZmFsc2U7CgkJaWYgKGluZGV4LT5pbmRwcmVkRXhwYW5k ICE9IE5JTCkKCQl7CgkJCWlmIChpbmRleC0+cHJlZE9LKQoJCQl7CgkJCQkvKiBVc2FibGUs IGJ1dCBkb24ndCBzZXQgdXNlZnVsX3ByZWRpY2F0ZSAqLwoJCQl9CgkJCWVsc2UKCQkJewoJ CQkJLyogRm9ybSBhbGxfY2xhdXNlcyBpZiBub3QgZG9uZSBhbHJlYWR5ICovCgkJCQlpZiAo YWxsX2NsYXVzZXMgPT0gTklMKQoJCQkJCWFsbF9jbGF1c2VzID0gbGlzdF9jb25jYXRfY29w eShjbGF1c2VzLCBvdGhlcl9jbGF1c2VzKTsKCgkJCQlpZiAoIXByZWRpY2F0ZV9pbXBsaWVk X2J5KGluZGV4LT5pbmRwcmVkRXhwYW5kLCBhbGxfY2xhdXNlcywgZmFsc2UpKQoJCQkJCWNv bnRpbnVlOwkvKiBjYW4ndCB1c2UgaXQgYXQgYWxsICovCgoJCQkJaWYgKCFwcmVkaWNhdGVf aW1wbGllZF9ieShpbmRleC0+aW5kcHJlZEV4cGFuZCwgb3RoZXJfY2xhdXNlcywgZmFsc2Up KQoJCQkJCXVzZWZ1bF9wcmVkaWNhdGUgPSB0cnVlOwoJCQl9CgkJfQoKCQkvKgoJCSAqIElk ZW50aWZ5IHRoZSByZXN0cmljdGlvbiBjbGF1c2VzIHRoYXQgY2FuIG1hdGNoIHRoZSBpbmRl eC4KCQkgKi8KCQlNZW1TZXQoJmNsYXVzZXNldCwgMCwgc2l6ZW9mKGNsYXVzZXNldCkpOwoJ CW1hdGNoX2NsYXVzZXNfdG9faW5kZXgocm9vdCwgY2xhdXNlcywgaW5kZXgsICZjbGF1c2Vz ZXQpOwoKCQkvKgoJCSAqIElmIG5vIG1hdGNoZXMgc28gZmFyLCBhbmQgdGhlIGluZGV4IHBy ZWRpY2F0ZSBpc24ndCB1c2VmdWwsIHdlCgkJICogZG9uJ3Qgd2FudCBpdC4KCQkgKi8KCQlp ZiAoIWNsYXVzZXNldC5ub25lbXB0eSAmJiAhdXNlZnVsX3ByZWRpY2F0ZSkKCQkJY29udGlu dWU7CgoJCS8qCgkJICogQWRkICJvdGhlciIgcmVzdHJpY3Rpb24gY2xhdXNlcyB0byB0aGUg Y2xhdXNlc2V0LgoJCSAqLwoJCW1hdGNoX2NsYXVzZXNfdG9faW5kZXgocm9vdCwgb3RoZXJf Y2xhdXNlcywgaW5kZXgsICZjbGF1c2VzZXQpOwoKCQkvKgoJCSAqIENvbnN0cnVjdCBwYXRo cyBpZiBwb3NzaWJsZS4KCQkgKi8KCQlpbmRleHBhdGhzID0gYnVpbGRfaW5kZXhfcGF0aHMo cm9vdCwgcmVsLAoJCQkJCQkJCQkgICBpbmRleCwgJmNsYXVzZXNldCwKCQkJCQkJCQkJICAg dXNlZnVsX3ByZWRpY2F0ZSwKCQkJCQkJCQkJICAgU1RfQklUTUFQU0NBTiwKCQkJCQkJCQkJ ICAgTlVMTCk7CgkJcmVzdWx0ID0gbGlzdF9jb25jYXQocmVzdWx0LCBpbmRleHBhdGhzKTsK CX0KCglyZXR1cm4gcmVzdWx0Owp9CgovKgogKiBVdGlsaXR5IHN0cnVjdHVyZSB1c2VkIHRv IGdyb3VwIHNpbWlsYXIgT1ItY2xhdXNlIGFyZ3VtZW50cyBpbgogKiBncm91cF9zaW1pbGFy X29yX2FyZ3MoKS4gIEl0IHJlcHJlc2VudHMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIE9SLWNs YXVzZQogKiBhcmd1bWVudCBhbmQgaXRzIG1hdGNoaW5nIGluZGV4IGtleS4KICovCnR5cGVk ZWYgc3RydWN0CnsKCWludAkJCWluZGV4bnVtOwkJLyogaW5kZXggb2YgdGhlIG1hdGNoaW5n IGluZGV4LCBvciAtMSBpZiBubwoJCQkJCQkJCSAqIG1hdGNoaW5nIGluZGV4ICovCglpbnQJ CQljb2xudW07CQkJLyogaW5kZXggb2YgdGhlIG1hdGNoaW5nIGNvbHVtbiwgb3IgLTEgaWYg bm8KCQkJCQkJCQkgKiBtYXRjaGluZyBpbmRleCAqLwoJT2lkCQkJb3BubzsJCQkvKiBPSUQg b2YgdGhlIE9wQ2xhdXNlIG9wZXJhdG9yLCBvciBJbnZhbGlkT2lkCgkJCQkJCQkJICogaWYg bm90IGFuIE9wRXhwciAqLwoJT2lkCQkJaW5wdXRjb2xsaWQ7CS8qIE9JRCBvZiB0aGUgT3BD bGF1c2UgaW5wdXQgY29sbGF0aW9uICovCglpbnQJCQlhcmdpbmRleDsJCS8qIGluZGV4IG9m IHRoZSBjbGF1c2UgaW4gdGhlIGxpc3Qgb2YKCQkJCQkJCQkgKiBhcmd1bWVudHMgKi8KCWlu dAkJCWdyb3VwaW5kZXg7CQkvKiB2YWx1ZSBvZiBhcmdpbmRleCBmb3IgdGhlIGZpcnN0IGNs YXVzZSBpbgoJCQkJCQkJCSAqIHRoZSBncm91cCBvZiBzaW1pbGFyIGNsYXVzZXMgKi8KfSBP ckFyZ0luZGV4TWF0Y2g7CgovKgogKiBDb21wYXJpc29uIGZ1bmN0aW9uIGZvciBPckFyZ0lu ZGV4TWF0Y2ggd2hpY2ggcHJvdmlkZXMgc29ydCBvcmRlciBwbGFjaW5nCiAqIHNpbWlsYXIg T1ItY2xhdXNlIGFyZ3VtZW50cyB0b2dldGhlci4KICovCnN0YXRpYyBpbnQKb3JfYXJnX2lu ZGV4X21hdGNoX2NtcChjb25zdCB2b2lkICphLCBjb25zdCB2b2lkICpiKQp7Cgljb25zdCBP ckFyZ0luZGV4TWF0Y2ggKm1hdGNoX2EgPSAoY29uc3QgT3JBcmdJbmRleE1hdGNoICopIGE7 Cgljb25zdCBPckFyZ0luZGV4TWF0Y2ggKm1hdGNoX2IgPSAoY29uc3QgT3JBcmdJbmRleE1h dGNoICopIGI7CgoJaWYgKG1hdGNoX2EtPmluZGV4bnVtIDwgbWF0Y2hfYi0+aW5kZXhudW0p CgkJcmV0dXJuIC0xOwoJZWxzZSBpZiAobWF0Y2hfYS0+aW5kZXhudW0gPiBtYXRjaF9iLT5p bmRleG51bSkKCQlyZXR1cm4gMTsKCglpZiAobWF0Y2hfYS0+Y29sbnVtIDwgbWF0Y2hfYi0+ Y29sbnVtKQoJCXJldHVybiAtMTsKCWVsc2UgaWYgKG1hdGNoX2EtPmNvbG51bSA+IG1hdGNo X2ItPmNvbG51bSkKCQlyZXR1cm4gMTsKCglpZiAobWF0Y2hfYS0+b3BubyA8IG1hdGNoX2It Pm9wbm8pCgkJcmV0dXJuIC0xOwoJZWxzZSBpZiAobWF0Y2hfYS0+b3BubyA+IG1hdGNoX2It Pm9wbm8pCgkJcmV0dXJuIDE7CgoJaWYgKG1hdGNoX2EtPmlucHV0Y29sbGlkIDwgbWF0Y2hf Yi0+aW5wdXRjb2xsaWQpCgkJcmV0dXJuIC0xOwoJZWxzZSBpZiAobWF0Y2hfYS0+aW5wdXRj b2xsaWQgPiBtYXRjaF9iLT5pbnB1dGNvbGxpZCkKCQlyZXR1cm4gMTsKCglpZiAobWF0Y2hf YS0+YXJnaW5kZXggPCBtYXRjaF9iLT5hcmdpbmRleCkKCQlyZXR1cm4gLTE7CgllbHNlIGlm IChtYXRjaF9hLT5hcmdpbmRleCA+IG1hdGNoX2ItPmFyZ2luZGV4KQoJCXJldHVybiAxOwoK CXJldHVybiAwOwp9CgovKgogKiBBbm90aGVyIGNvbXBhcmlzb24gZnVuY3Rpb24gZm9yIE9y QXJnSW5kZXhNYXRjaC4gIEl0IHNvcnRzIGdyb3VwcyB0b2dldGhlcgogKiB1c2luZyBncm91 cGluZGV4LiAgVGhlIGdyb3VwIGl0ZW1zIGFyZSB0aGVuIHNvcnRlZCBieSBhcmdpbmRleC4K ICovCnN0YXRpYyBpbnQKb3JfYXJnX2luZGV4X21hdGNoX2NtcF9ncm91cChjb25zdCB2b2lk ICphLCBjb25zdCB2b2lkICpiKQp7Cgljb25zdCBPckFyZ0luZGV4TWF0Y2ggKm1hdGNoX2Eg PSAoY29uc3QgT3JBcmdJbmRleE1hdGNoICopIGE7Cgljb25zdCBPckFyZ0luZGV4TWF0Y2gg Km1hdGNoX2IgPSAoY29uc3QgT3JBcmdJbmRleE1hdGNoICopIGI7CgoJaWYgKG1hdGNoX2Et Pmdyb3VwaW5kZXggPCBtYXRjaF9iLT5ncm91cGluZGV4KQoJCXJldHVybiAtMTsKCWVsc2Ug aWYgKG1hdGNoX2EtPmdyb3VwaW5kZXggPiBtYXRjaF9iLT5ncm91cGluZGV4KQoJCXJldHVy biAxOwoKCWlmIChtYXRjaF9hLT5hcmdpbmRleCA8IG1hdGNoX2ItPmFyZ2luZGV4KQoJCXJl dHVybiAtMTsKCWVsc2UgaWYgKG1hdGNoX2EtPmFyZ2luZGV4ID4gbWF0Y2hfYi0+YXJnaW5k ZXgpCgkJcmV0dXJuIDE7CgoJcmV0dXJuIDA7Cn0KCi8qCiAqIGdyb3VwX3NpbWlsYXJfb3Jf YXJncwogKgkJVHJhbnNmb3JtIGluY29taW5nIE9SLXJlc3RyaWN0aW5mbyBpbnRvIGEgbGlz dCBvZiBzdWItcmVzdHJpY3RpbmZvcywKICoJCWVhY2ggb2YgdGhlbSBjb250YWluaW5nIGEg c3Vic2V0IG9mIHNpbWlsYXIgT1ItY2xhdXNlIGFyZ3VtZW50cyBmcm9tCiAqCQl0aGUgc291 cmNlIHJpbmZvLgogKgogKiBTaW1pbGFyIE9SLWNsYXVzZSBhcmd1bWVudHMgYXJlIG9mIHRo ZSBmb3JtICJpbmRleGtleSBvcCBjb25zdGFudCIgaGF2aW5nCiAqIHRoZSBzYW1lIGluZGV4 a2V5LCBvcGVyYXRvciwgYW5kIGNvbGxhdGlvbi4gIENvbnN0YW50IG1heSBjb21wcmlzZSBl aXRoZXIKICogQ29uc3Qgb3IgUGFyYW0uICBJdCBtYXkgYmUgZW1wbG95ZWQgbGF0ZXIsIGR1 cmluZyB0aGUKICogbWF0Y2hfY2xhdXNlX3RvX2luZGV4Y29sKCkgdG8gdHJhbnNmb3JtIHRo ZSB3aG9sZSBPUi1zdWItcmluZm8gdG8gYW4gU0FPUAogKiBjbGF1c2UuCiAqCiAqIFJldHVy bnMgdGhlIHByb2Nlc3NlZCBsaXN0IG9mIE9SLWNsYXVzZSBhcmd1bWVudHMuCiAqLwpzdGF0 aWMgTGlzdCAqCmdyb3VwX3NpbWlsYXJfb3JfYXJncyhQbGFubmVySW5mbyAqcm9vdCwgUmVs T3B0SW5mbyAqcmVsLCBSZXN0cmljdEluZm8gKnJpbmZvKQp7CglpbnQJCQluOwoJaW50CQkJ aTsKCWludAkJCWdyb3VwX3N0YXJ0OwoJT3JBcmdJbmRleE1hdGNoICptYXRjaGVzOwoJYm9v bAkJbWF0Y2hlZCA9IGZhbHNlOwoJTGlzdENlbGwgICAqbGM7CglMaXN0Q2VsbCAgICpsYzI7 CglMaXN0CSAgICpvcmFyZ3M7CglMaXN0CSAgICpyZXN1bHQgPSBOSUw7CglJbmRleAkJcmVs aWQgPSByZWwtPnJlbGlkOwoKCUFzc2VydChJc0EocmluZm8tPm9yY2xhdXNlLCBCb29sRXhw cikpOwoJb3JhcmdzID0gKChCb29sRXhwciAqKSByaW5mby0+b3JjbGF1c2UpLT5hcmdzOwoJ biA9IGxpc3RfbGVuZ3RoKG9yYXJncyk7CgoJLyoKCSAqIFRvIGF2b2lkIE5eMiBiZWhhdmlv ciwgdGFrZSB1dGlsaXR5IHBhc3MgYWxvbmcgdGhlIGxpc3Qgb2YgT1ItY2xhdXNlCgkgKiBh cmd1bWVudHMuICBGb3IgZWFjaCBhcmd1bWVudCwgZmlsbCB0aGUgT3JBcmdJbmRleE1hdGNo IHN0cnVjdHVyZSwKCSAqIHdoaWNoIHdpbGwgYmUgdXNlZCB0byBzb3J0IHRoZXNlIGFyZ3Vt ZW50cyBhdCB0aGUgbmV4dCBzdGVwLgoJICovCglpID0gLTE7CgltYXRjaGVzID0gcGFsbG9j X2FycmF5KE9yQXJnSW5kZXhNYXRjaCwgbik7Cglmb3JlYWNoKGxjLCBvcmFyZ3MpCgl7CgkJ Tm9kZQkgICAqYXJnID0gbGZpcnN0KGxjKTsKCQlSZXN0cmljdEluZm8gKmFyZ3JpbmZvOwoJ CU9wRXhwcgkgICAqY2xhdXNlOwoJCU9pZAkJCW9wbm87CgkJTm9kZQkgICAqbGVmdG9wLAoJ CQkJICAgKnJpZ2h0b3A7CgkJTm9kZQkgICAqbm9uQ29uc3RFeHByOwoJCWludAkJCWluZGV4 bnVtOwoJCWludAkJCWNvbG51bTsKCgkJaSsrOwoJCW1hdGNoZXNbaV0uYXJnaW5kZXggPSBp OwoJCW1hdGNoZXNbaV0uZ3JvdXBpbmRleCA9IGk7CgkJbWF0Y2hlc1tpXS5pbmRleG51bSA9 IC0xOwoJCW1hdGNoZXNbaV0uY29sbnVtID0gLTE7CgkJbWF0Y2hlc1tpXS5vcG5vID0gSW52 YWxpZE9pZDsKCQltYXRjaGVzW2ldLmlucHV0Y29sbGlkID0gSW52YWxpZE9pZDsKCgkJaWYg KCFJc0EoYXJnLCBSZXN0cmljdEluZm8pKQoJCQljb250aW51ZTsKCgkJYXJncmluZm8gPSBj YXN0Tm9kZShSZXN0cmljdEluZm8sIGFyZyk7CgoJCS8qIE9ubHkgb3BlcmF0b3IgY2xhdXNl cyBjYW4gbWF0Y2ggICovCgkJaWYgKCFJc0EoYXJncmluZm8tPmNsYXVzZSwgT3BFeHByKSkK CQkJY29udGludWU7CgoJCWNsYXVzZSA9IChPcEV4cHIgKikgYXJncmluZm8tPmNsYXVzZTsK CQlvcG5vID0gY2xhdXNlLT5vcG5vOwoKCQkvKiBPbmx5IGJpbmFyeSBvcGVyYXRvcnMgY2Fu IG1hdGNoICAqLwoJCWlmIChsaXN0X2xlbmd0aChjbGF1c2UtPmFyZ3MpICE9IDIpCgkJCWNv bnRpbnVlOwoKCQkvKgoJCSAqIElnbm9yZSBhbnkgUmVsYWJlbFR5cGUgbm9kZSBhYm92ZSB0 aGUgb3BlcmFuZHMuICBUaGlzIGlzIG5lZWRlZCB0bwoJCSAqIGJlIGFibGUgdG8gYXBwbHkg aW5kZXhzY2FubmluZyBpbiBiaW5hcnktY29tcGF0aWJsZS1vcGVyYXRvciBjYXNlcy4KCQkg KiBOb3RlOiB3ZSBjYW4gYXNzdW1lIHRoZXJlIGlzIGF0IG1vc3Qgb25lIFJlbGFiZWxUeXBl IG5vZGU7CgkJICogZXZhbF9jb25zdF9leHByZXNzaW9ucygpIHdpbGwgaGF2ZSBzaW1wbGlm aWVkIGlmIG1vcmUgdGhhbiBvbmUuCgkJICovCgkJbGVmdG9wID0gZ2V0X2xlZnRvcChjbGF1 c2UpOwoJCWlmIChJc0EobGVmdG9wLCBSZWxhYmVsVHlwZSkpCgkJCWxlZnRvcCA9IChOb2Rl ICopICgoUmVsYWJlbFR5cGUgKikgbGVmdG9wKS0+YXJnOwoKCQlyaWdodG9wID0gZ2V0X3Jp Z2h0b3AoY2xhdXNlKTsKCQlpZiAoSXNBKHJpZ2h0b3AsIFJlbGFiZWxUeXBlKSkKCQkJcmln aHRvcCA9IChOb2RlICopICgoUmVsYWJlbFR5cGUgKikgcmlnaHRvcCktPmFyZzsKCgkJLyoK CQkgKiBDaGVjayBmb3IgY2xhdXNlcyBvZiB0aGUgZm9ybTogKGluZGV4a2V5IG9wZXJhdG9y IGNvbnN0YW50KSBvcgoJCSAqIChjb25zdGFudCBvcGVyYXRvciBpbmRleGtleSkuICBCdXQg d2UgZG9uJ3Qga25vdyBhIHBhcnRpY3VsYXIgaW5kZXgKCQkgKiB5ZXQuICBUaGVyZWZvcmUs IHdlIHRyeSB0byBkaXN0aW5ndWlzaCB0aGUgcG90ZW50aWFsIGluZGV4IGtleSBhbmQKCQkg KiBjb25zdGFudCBmaXJzdCwgdGhlbiBzZWFyY2ggZm9yIGEgbWF0Y2hpbmcgaW5kZXgga2V5 IGFtb25nIGFsbAoJCSAqIGluZGV4ZXMuCgkJICovCgkJaWYgKGJtc19pc19tZW1iZXIocmVs aWQsIGFyZ3JpbmZvLT5yaWdodF9yZWxpZHMpICYmCgkJCSFibXNfaXNfbWVtYmVyKHJlbGlk LCBhcmdyaW5mby0+bGVmdF9yZWxpZHMpICYmCgkJCSFjb250YWluX3ZvbGF0aWxlX2Z1bmN0 aW9ucyhsZWZ0b3ApKQoJCXsKCQkJb3BubyA9IGdldF9jb21tdXRhdG9yKG9wbm8pOwoKCQkJ aWYgKCFPaWRJc1ZhbGlkKG9wbm8pKQoJCQl7CgkJCQkvKiBjb21tdXRhdG9yIGRvZXNuJ3Qg ZXhpc3QsIHdlIGNhbid0IHJldmVyc2UgdGhlIG9yZGVyICovCgkJCQljb250aW51ZTsKCQkJ fQoJCQlub25Db25zdEV4cHIgPSByaWdodG9wOwoJCX0KCQllbHNlIGlmIChibXNfaXNfbWVt YmVyKHJlbGlkLCBhcmdyaW5mby0+bGVmdF9yZWxpZHMpICYmCgkJCQkgIWJtc19pc19tZW1i ZXIocmVsaWQsIGFyZ3JpbmZvLT5yaWdodF9yZWxpZHMpICYmCgkJCQkgIWNvbnRhaW5fdm9s YXRpbGVfZnVuY3Rpb25zKHJpZ2h0b3ApKQoJCXsKCQkJbm9uQ29uc3RFeHByID0gbGVmdG9w OwoJCX0KCQllbHNlCgkJewoJCQljb250aW51ZTsKCQl9CgoJCS8qCgkJICogTWF0Y2ggbm9u LWNvbnN0YW50IHBhcnQgdG8gdGhlIGluZGV4IGtleS4gIEl0J3MgcG9zc2libGUgdGhhdCBh CgkJICogc2luZ2xlIG5vbi1jb25zdGFudCBwYXJ0IG1hdGNoZXMgbXVsdGlwbGUgaW5kZXgg a2V5cy4gIEl0J3MgT0ssIHdlCgkJICoganVzdCBzdG9wIHdpdGggZmlyc3QgbWF0Y2hpbmcg aW5kZXgga2V5LiAgR2l2ZW4gdGhhdCB0aGlzIGNob2ljZSBpcwoJCSAqIGRldGVybWluZWQg dGhlIHNhbWUgZm9yIGV2ZXJ5IGNsYXVzZSwgd2Ugd2lsbCBncm91cCBzaW1pbGFyIGNsYXVz ZXMKCQkgKiB0b2dldGhlciBhbnl3YXkuCgkJICovCgkJaW5kZXhudW0gPSAwOwoJCWZvcmVh Y2gobGMyLCByZWwtPmluZGV4bGlzdCkKCQl7CgkJCUluZGV4T3B0SW5mbyAqaW5kZXggPSAo SW5kZXhPcHRJbmZvICopIGxmaXJzdChsYzIpOwoKCQkJLyoKCQkJICogSWdub3JlIGluZGV4 IGlmIGl0IGRvZXNuJ3Qgc3VwcG9ydCBiaXRtYXAgc2NhbnMgb3IgU0FPUAoJCQkgKiBjbGF1 c2VzLgoJCQkgKi8KCQkJaWYgKCFpbmRleC0+YW1oYXNnZXRiaXRtYXAgfHwgIWluZGV4LT5h bXNlYXJjaGFycmF5KQoJCQkJY29udGludWU7CgoJCQlmb3IgKGNvbG51bSA9IDA7IGNvbG51 bSA8IGluZGV4LT5ua2V5Y29sdW1uczsgY29sbnVtKyspCgkJCXsKCQkJCWlmIChtYXRjaF9p bmRleF90b19vcGVyYW5kKG5vbkNvbnN0RXhwciwgY29sbnVtLCBpbmRleCkpCgkJCQl7CgkJ CQkJbWF0Y2hlc1tpXS5pbmRleG51bSA9IGluZGV4bnVtOwoJCQkJCW1hdGNoZXNbaV0uY29s bnVtID0gY29sbnVtOwoJCQkJCW1hdGNoZXNbaV0ub3BubyA9IG9wbm87CgkJCQkJbWF0Y2hl c1tpXS5pbnB1dGNvbGxpZCA9IGNsYXVzZS0+aW5wdXRjb2xsaWQ7CgkJCQkJbWF0Y2hlZCA9 IHRydWU7CgkJCQkJYnJlYWs7CgkJCQl9CgkJCX0KCgkJCS8qCgkJCSAqIFN0b3AgbG9vcGlu ZyB0aHJvdWdoIHRoZSBpbmRleGVzLCBpZiB3ZSBtYW5hZ2VkIHRvIG1hdGNoCgkJCSAqIG5v bkNvbnN0RXhwciB0byBhbnkgaW5kZXggY29sdW1uLgoJCQkgKi8KCQkJaWYgKG1hdGNoZXNb aV0uaW5kZXhudW0gPj0gMCkKCQkJCWJyZWFrOwoJCQlpbmRleG51bSsrOwoJCX0KCX0KCgkv KgoJICogRmFzdC1wYXRoIGNoZWNrOiBpZiBubyBjbGF1c2UgaXMgbWF0Y2hpbmcgdG8gdGhl IGluZGV4IGNvbHVtbiwgd2UgY2FuCgkgKiBqdXN0IGdpdmUgdXAgYXQgdGhpcyBzdGFnZSBh bmQgcmV0dXJuIHRoZSBjbGF1c2UgbGlzdCBhcy1pcy4KCSAqLwoJaWYgKCFtYXRjaGVkKQoJ ewoJCXBmcmVlKG1hdGNoZXMpOwoJCXJldHVybiBvcmFyZ3M7Cgl9CgoJLyoKCSAqIFNvcnQg Y2xhdXNlcyB0byBtYWtlIHNpbWlsYXIgY2xhdXNlcyBnbyB0b2dldGhlci4gIEJ1dCBhdCB0 aGUgc2FtZQoJICogdGltZSwgd2Ugd291bGQgbGlrZSB0byBjaGFuZ2UgdGhlIG9yZGVyIG9m IGNsYXVzZXMgYXMgbGl0dGxlIGFzCgkgKiBwb3NzaWJsZS4gIFRvIGRvIHNvLCB3ZSByZW9y ZGVyIGVhY2ggZ3JvdXAgb2Ygc2ltaWxhciBjbGF1c2VzIHNvIHRoYXQKCSAqIHRoZSBmaXJz dCBpdGVtIG9mIHRoZSBncm91cCBzdGF5cyBpbiBwbGFjZSwgYW5kIGFsbCB0aGUgb3RoZXIg aXRlbXMgYXJlCgkgKiBtb3ZlZCBhZnRlciBpdC4gIFNvLCBpZiB0aGVyZSBhcmUgbm8gc2lt aWxhciBjbGF1c2VzLCB0aGUgb3JkZXIgb2YKCSAqIGNsYXVzZXMgc3RheXMgdGhlIHNhbWUu ICBXaGVuIHRoZXJlIGFyZSBzb21lIGdyb3VwcywgcmVxdWlyZWQKCSAqIHJlb3JkZXJpbmcg aGFwcGVucyB3aGlsZSB0aGUgcmVzdCBvZiB0aGUgY2xhdXNlcyByZW1haW4gaW4gdGhlaXIK CSAqIHBsYWNlcy4gIFRoYXQgaXMgYWNoaWV2ZWQgYnkgYXNzaWduaW5nIGEgJ2dyb3VwaW5k ZXgnIHRvIGVhY2ggY2xhdXNlOgoJICogdGhlIG51bWJlciBvZiB0aGUgZmlyc3QgaXRlbSBp biB0aGUgZ3JvdXAgaW4gdGhlIG9yaWdpbmFsIGNsYXVzZSBsaXN0LgoJICovCglxc29ydCht YXRjaGVzLCBuLCBzaXplb2YoT3JBcmdJbmRleE1hdGNoKSwgb3JfYXJnX2luZGV4X21hdGNo X2NtcCk7CgoJLyogQXNzaWduIGdyb3VwaW5kZXggdG8gdGhlIHNvcnRlZCBjbGF1c2VzICov Cglmb3IgKGkgPSAxOyBpIDwgbjsgaSsrKQoJewoJCS8qCgkJICogV2hlbiB0d28gY2xhdXNl cyBhcmUgc2ltaWxhciBhbmQgc2hvdWxkIGJlbG9uZyB0byB0aGUgc2FtZSBncm91cCwKCQkg KiBjb3B5IHRoZSAnZ3JvdXBpbmRleCcgZnJvbSB0aGUgcHJldmlvdXMgY2xhdXNlLiAgR2l2 ZW4gd2UgYXJlCgkJICogY29uc2lkZXJpbmcgY2xhdXNlcyBpbiBkaXJlY3Qgb3JkZXIsIGFs bCB0aGUgY2xhdXNlcyB3b3VsZCBoYXZlIGEKCQkgKiAnZ3JvdXBpbmRleCcgZXF1YWwgdG8g dGhlICdncm91cGluZGV4JyBvZiB0aGUgZmlyc3QgY2xhdXNlIGluIHRoZQoJCSAqIGdyb3Vw LgoJCSAqLwoJCWlmIChtYXRjaGVzW2ldLmluZGV4bnVtID09IG1hdGNoZXNbaSAtIDFdLmlu ZGV4bnVtICYmCgkJCW1hdGNoZXNbaV0uY29sbnVtID09IG1hdGNoZXNbaSAtIDFdLmNvbG51 bSAmJgoJCQltYXRjaGVzW2ldLm9wbm8gPT0gbWF0Y2hlc1tpIC0gMV0ub3BubyAmJgoJCQlt YXRjaGVzW2ldLmlucHV0Y29sbGlkID09IG1hdGNoZXNbaSAtIDFdLmlucHV0Y29sbGlkICYm CgkJCW1hdGNoZXNbaV0uaW5kZXhudW0gIT0gLTEpCgkJCW1hdGNoZXNbaV0uZ3JvdXBpbmRl eCA9IG1hdGNoZXNbaSAtIDFdLmdyb3VwaW5kZXg7Cgl9CgoJLyogUmUtc29ydCBjbGF1c2Vz IGZpcnN0IGJ5IGdyb3VwaW5kZXggdGhlbiBieSBhcmdpbmRleCAqLwoJcXNvcnQobWF0Y2hl cywgbiwgc2l6ZW9mKE9yQXJnSW5kZXhNYXRjaCksIG9yX2FyZ19pbmRleF9tYXRjaF9jbXBf Z3JvdXApOwoKCS8qCgkgKiBHcm91cCBzaW1pbGFyIGNsYXVzZXMgaW50byBzaW5nbGUgc3Vi LXJlc3RyaWN0aW5mby4gU2lkZSBlZmZlY3Q6IHRoZQoJICogcmVzdWx0aW5nIGxpc3Qgb2Yg cmVzdHJpY3Rpb25zIHdpbGwgYmUgc29ydGVkIGJ5IGluZGV4bnVtIGFuZCBjb2xudW0uCgkg Ki8KCWdyb3VwX3N0YXJ0ID0gMDsKCWZvciAoaSA9IDE7IGkgPD0gbjsgaSsrKQoJewoJCS8q IENoZWNrIGlmIGl0J3MgYSBncm91cCBib3VuZGFyeSAqLwoJCWlmIChncm91cF9zdGFydCA+ PSAwICYmCgkJCShpID09IG4gfHwKCQkJIG1hdGNoZXNbaV0uaW5kZXhudW0gIT0gbWF0Y2hl c1tncm91cF9zdGFydF0uaW5kZXhudW0gfHwKCQkJIG1hdGNoZXNbaV0uY29sbnVtICE9IG1h dGNoZXNbZ3JvdXBfc3RhcnRdLmNvbG51bSB8fAoJCQkgbWF0Y2hlc1tpXS5vcG5vICE9IG1h dGNoZXNbZ3JvdXBfc3RhcnRdLm9wbm8gfHwKCQkJIG1hdGNoZXNbaV0uaW5wdXRjb2xsaWQg IT0gbWF0Y2hlc1tncm91cF9zdGFydF0uaW5wdXRjb2xsaWQgfHwKCQkJIG1hdGNoZXNbaV0u aW5kZXhudW0gPT0gLTEpKQoJCXsKCQkJLyoKCQkJICogT25lIGNsYXVzZSBpbiBncm91cDog YWRkIGl0ICJhcyBpcyIgdG8gdGhlIHVwcGVyLWxldmVsIE9SLgoJCQkgKi8KCQkJaWYgKGkg LSBncm91cF9zdGFydCA9PSAxKQoJCQl7CgkJCQlyZXN1bHQgPSBsYXBwZW5kKHJlc3VsdCwK CQkJCQkJCQkgbGlzdF9udGgob3JhcmdzLAoJCQkJCQkJCQkJICBtYXRjaGVzW2dyb3VwX3N0 YXJ0XS5hcmdpbmRleCkpOwoJCQl9CgkJCWVsc2UKCQkJewoJCQkJLyoKCQkJCSAqIFR3byBv ciBtb3JlIGNsYXVzZXMgaW4gYSBncm91cDogY3JlYXRlIGEgbmVzdGVkIE9SLgoJCQkJICov CgkJCQlMaXN0CSAgICphcmdzID0gTklMOwoJCQkJTGlzdAkgICAqcmFyZ3MgPSBOSUw7CgkJ CQlSZXN0cmljdEluZm8gKnN1YnJpbmZvOwoJCQkJaW50CQkJajsKCgkJCQlBc3NlcnQoaSAt IGdyb3VwX3N0YXJ0ID49IDIpOwoKCQkJCS8qIENvbnN0cnVjdCB0aGUgbGlzdCBvZiBuZXN0 ZWQgT1IgYXJndW1lbnRzICovCgkJCQlmb3IgKGogPSBncm91cF9zdGFydDsgaiA8IGk7IGor KykKCQkJCXsKCQkJCQlOb2RlCSAgICphcmcgPSBsaXN0X250aChvcmFyZ3MsIG1hdGNoZXNb al0uYXJnaW5kZXgpOwoKCQkJCQlyYXJncyA9IGxhcHBlbmQocmFyZ3MsIGFyZyk7CgkJCQkJ aWYgKElzQShhcmcsIFJlc3RyaWN0SW5mbykpCgkJCQkJCWFyZ3MgPSBsYXBwZW5kKGFyZ3Ms ICgoUmVzdHJpY3RJbmZvICopIGFyZyktPmNsYXVzZSk7CgkJCQkJZWxzZQoJCQkJCQlhcmdz ID0gbGFwcGVuZChhcmdzLCBhcmcpOwoJCQkJfQoKCQkJCS8qIENvbnN0cnVjdCB0aGUgbmVz dGVkIE9SIGFuZCB3cmFwIGl0IHdpdGggUmVzdHJpY3RJbmZvICovCgkJCQlzdWJyaW5mbyA9 IG1ha2VfcGxhaW5fcmVzdHJpY3RpbmZvKHJvb3QsCgkJCQkJCQkJCQkJCSAgIG1ha2Vfb3Jj bGF1c2UoYXJncyksCgkJCQkJCQkJCQkJCSAgIG1ha2Vfb3JjbGF1c2UocmFyZ3MpLAoJCQkJ CQkJCQkJCQkgICByaW5mby0+aXNfcHVzaGVkX2Rvd24sCgkJCQkJCQkJCQkJCSAgIHJpbmZv LT5oYXNfY2xvbmUsCgkJCQkJCQkJCQkJCSAgIHJpbmZvLT5pc19jbG9uZSwKCQkJCQkJCQkJ CQkJICAgcmluZm8tPnBzZXVkb2NvbnN0YW50LAoJCQkJCQkJCQkJCQkgICByaW5mby0+c2Vj dXJpdHlfbGV2ZWwsCgkJCQkJCQkJCQkJCSAgIHJpbmZvLT5yZXF1aXJlZF9yZWxpZHMsCgkJ CQkJCQkJCQkJCSAgIHJpbmZvLT5pbmNvbXBhdGlibGVfcmVsaWRzLAoJCQkJCQkJCQkJCQkg ICByaW5mby0+b3V0ZXJfcmVsaWRzKTsKCQkJCXJlc3VsdCA9IGxhcHBlbmQocmVzdWx0LCBz dWJyaW5mbyk7CgkJCX0KCgkJCWdyb3VwX3N0YXJ0ID0gaTsKCQl9Cgl9CglwZnJlZShtYXRj aGVzKTsKCXJldHVybiByZXN1bHQ7Cn0KCi8qCiAqIG1ha2VfYml0bWFwX3BhdGhzX2Zvcl9v cl9ncm91cAogKgkJR2VuZXJhdGUgYml0bWFwIHBhdGhzIGZvciBhIGdyb3VwIG9mIHNpbWls YXIgT1ItY2xhdXNlIGFyZ3VtZW50cwogKgkJcHJvZHVjZWQgYnkgZ3JvdXBfc2ltaWxhcl9v cl9hcmdzKCkuCiAqCiAqIFRoaXMgZnVuY3Rpb24gY29uc2lkZXJzIHR3byBjYXNlczogKDEp IG1hdGNoaW5nIGEgZ3JvdXAgb2YgY2xhdXNlcyB0bwogKiB0aGUgaW5kZXggYXMgYSB3aG9s ZSwgYW5kICgyKSBtYXRjaGluZyB0aGUgaW5kaXZpZHVhbCBjbGF1c2VzIG9uZS1ieS1vbmUu CiAqICgxKSB0eXBpY2FsbHkgY29tcHJpc2VzIGFuIG9wdGltYWwgc29sdXRpb24uICBJZiBu b3QsICgyKSB0eXBpY2FsbHkKICogY29tcHJpc2VzIGZhaXIgYWx0ZXJuYXRpdmUuCiAqCiAq IElkZWFsbHksIHdlIGNvdWxkIGNvbnNpZGVyIGFsbCBhcmJpdHJhcnkgc3BsaXRzIG9mIGFy Z3VtZW50cyBpbnRvCiAqIHN1Ymdyb3VwcywgYnV0IHRoYXQgY291bGQgbGVhZCB0byB1bmFj Y2VwdGFibGUgY29tcHV0YXRpb25hbCBjb21wbGV4aXR5LgogKiBUaGlzIGlzIHdoeSB3ZSBv bmx5IGNvbnNpZGVyIHR3byBjYXNlcyBvZiBhYm92ZS4KICovCnN0YXRpYyBMaXN0ICoKbWFr ZV9iaXRtYXBfcGF0aHNfZm9yX29yX2dyb3VwKFBsYW5uZXJJbmZvICpyb290LCBSZWxPcHRJ bmZvICpyZWwsCgkJCQkJCQkgICBSZXN0cmljdEluZm8gKnJpLCBMaXN0ICpvdGhlcl9jbGF1 c2VzKQp7CglMaXN0CSAgICpqb2ludGxpc3QgPSBOSUw7CglMaXN0CSAgICpzcGxpdGxpc3Qg PSBOSUw7CglMaXN0Q2VsbCAgICpsYzsKCUxpc3QJICAgKm9yYXJnczsKCUxpc3QJICAgKmFy Z3MgPSAoKEJvb2xFeHByICopIHJpLT5vcmNsYXVzZSktPmFyZ3M7CglDb3N0CQlqb2ludGNv c3QgPSAwLjAsCgkJCQlzcGxpdGNvc3QgPSAwLjA7CglQYXRoCSAgICpiaXRtYXBxdWFsOwoJ TGlzdAkgICAqaW5kbGlzdDsKCgkvKgoJICogRmlyc3QsIHRyeSB0byBtYXRjaCB0aGUgd2hv bGUgZ3JvdXAgdG8gdGhlIG9uZSBpbmRleC4KCSAqLwoJb3JhcmdzID0gbGlzdF9tYWtlMShy aSk7CglpbmRsaXN0ID0gYnVpbGRfcGF0aHNfZm9yX09SKHJvb3QsIHJlbCwKCQkJCQkJCQkg b3JhcmdzLAoJCQkJCQkJCSBvdGhlcl9jbGF1c2VzKTsKCWlmIChpbmRsaXN0ICE9IE5JTCkK CXsKCQliaXRtYXBxdWFsID0gY2hvb3NlX2JpdG1hcF9hbmQocm9vdCwgcmVsLCBpbmRsaXN0 KTsKCQlqb2ludGNvc3QgPSBiaXRtYXBxdWFsLT50b3RhbF9jb3N0OwoJCWpvaW50bGlzdCA9 IGxpc3RfbWFrZTEoYml0bWFwcXVhbCk7Cgl9CgoJLyoKCSAqIElmIHdlIG1hbmFnZSB0byBm aW5kIGEgYml0bWFwIHNjYW4sIHdoaWNoIHVzZXMgdGhlIGdyb3VwIG9mIE9SLWNsYXVzZQoJ ICogYXJndW1lbnRzIGFzIGEgd2hvbGUsIHdlIGNhbiBza2lwIG1hdGNoaW5nIE9SLWNsYXVz ZSBhcmd1bWVudHMKCSAqIG9uZS1ieS1vbmUgYXMgbG9uZyBhcyB0aGVyZSBhcmUgbm8gb3Ro ZXIgY2xhdXNlcywgd2hpY2ggY2FuIGJyaW5nIG1vcmUKCSAqIGVmZmljaWVuY3kgdG8gb25l LWJ5LW9uZSBjYXNlLgoJICovCglpZiAoam9pbnRsaXN0ICE9IE5JTCAmJiBvdGhlcl9jbGF1 c2VzID09IE5JTCkKCQlyZXR1cm4gam9pbnRsaXN0OwoKCS8qCgkgKiBBbHNvIHRyeSB0byBt YXRjaCBhbGwgY29udGFpbmluZyBjbGF1c2VzIG9uZS1ieS1vbmUuCgkgKi8KCWZvcmVhY2go bGMsIGFyZ3MpCgl7CgkJb3JhcmdzID0gbGlzdF9tYWtlMShsZmlyc3QobGMpKTsKCgkJaW5k bGlzdCA9IGJ1aWxkX3BhdGhzX2Zvcl9PUihyb290LCByZWwsCgkJCQkJCQkJCSBvcmFyZ3Ms CgkJCQkJCQkJCSBvdGhlcl9jbGF1c2VzKTsKCgkJaWYgKGluZGxpc3QgPT0gTklMKQoJCXsK CQkJc3BsaXRsaXN0ID0gTklMOwoJCQlicmVhazsKCQl9CgoJCWJpdG1hcHF1YWwgPSBjaG9v c2VfYml0bWFwX2FuZChyb290LCByZWwsIGluZGxpc3QpOwoJCXNwbGl0Y29zdCArPSBiaXRt YXBxdWFsLT50b3RhbF9jb3N0OwoJCXNwbGl0bGlzdCA9IGxhcHBlbmQoc3BsaXRsaXN0LCBi aXRtYXBxdWFsKTsKCX0KCgkvKgoJICogUGljayB0aGUgYmVzdCBvcHRpb24uCgkgKi8KCWlm IChzcGxpdGxpc3QgPT0gTklMKQoJCXJldHVybiBqb2ludGxpc3Q7CgllbHNlIGlmIChqb2lu dGxpc3QgPT0gTklMKQoJCXJldHVybiBzcGxpdGxpc3Q7CgllbHNlCgkJcmV0dXJuIChqb2lu dGNvc3QgPCBzcGxpdGNvc3QpID8gam9pbnRsaXN0IDogc3BsaXRsaXN0Owp9CgoKLyoKICog Z2VuZXJhdGVfYml0bWFwX29yX3BhdGhzCiAqCQlMb29rIHRocm91Z2ggdGhlIGxpc3Qgb2Yg Y2xhdXNlcyB0byBmaW5kIE9SIGNsYXVzZXMsIGFuZCBnZW5lcmF0ZQogKgkJYSBCaXRtYXBP clBhdGggZm9yIGVhY2ggb25lIHdlIGNhbiBoYW5kbGUgdGhhdCB3YXkuICBSZXR1cm4gYSBs aXN0CiAqCQlvZiB0aGUgZ2VuZXJhdGVkIEJpdG1hcE9yUGF0aHMuCiAqCiAqIG90aGVyX2Ns YXVzZXMgaXMgYSBsaXN0IG9mIGFkZGl0aW9uYWwgY2xhdXNlcyB0aGF0IGNhbiBiZSBhc3N1 bWVkIHRydWUKICogZm9yIHRoZSBwdXJwb3NlIG9mIGdlbmVyYXRpbmcgaW5kZXhxdWFscywg YnV0IGFyZSBub3QgdG8gYmUgc2VhcmNoZWQgZm9yCiAqIE9Scy4gIChTZWUgYnVpbGRfcGF0 aHNfZm9yX09SKCkgZm9yIG1vdGl2YXRpb24uKQogKi8Kc3RhdGljIExpc3QgKgpnZW5lcmF0 ZV9iaXRtYXBfb3JfcGF0aHMoUGxhbm5lckluZm8gKnJvb3QsIFJlbE9wdEluZm8gKnJlbCwK CQkJCQkJIExpc3QgKmNsYXVzZXMsIExpc3QgKm90aGVyX2NsYXVzZXMpCnsKCUxpc3QJICAg KnJlc3VsdCA9IE5JTDsKCUxpc3QJICAgKmFsbF9jbGF1c2VzOwoJTGlzdENlbGwgICAqbGM7 CgoJLyoKCSAqIFdlIGNhbiB1c2UgYm90aCB0aGUgY3VycmVudCBhbmQgb3RoZXIgY2xhdXNl cyBhcyBjb250ZXh0IGZvcgoJICogYnVpbGRfcGF0aHNfZm9yX09SOyBubyBuZWVkIHRvIHJl bW92ZSBPUnMgZnJvbSB0aGUgbGlzdHMuCgkgKi8KCWFsbF9jbGF1c2VzID0gbGlzdF9jb25j YXRfY29weShjbGF1c2VzLCBvdGhlcl9jbGF1c2VzKTsKCglmb3JlYWNoKGxjLCBjbGF1c2Vz KQoJewoJCVJlc3RyaWN0SW5mbyAqcmluZm8gPSBsZmlyc3Rfbm9kZShSZXN0cmljdEluZm8s IGxjKTsKCQlMaXN0CSAgICpwYXRobGlzdDsKCQlQYXRoCSAgICpiaXRtYXBxdWFsOwoJCUxp c3RDZWxsICAgKmo7CgkJTGlzdAkgICAqZ3JvdXBlZEFyZ3M7CgkJTGlzdAkgICAqaW5uZXJf b3RoZXJfY2xhdXNlcyA9IE5JTDsKCgkJLyogSWdub3JlIFJlc3RyaWN0SW5mb3MgdGhhdCBh cmVuJ3QgT1JzICovCgkJaWYgKCFyZXN0cmljdGlvbl9pc19vcl9jbGF1c2UocmluZm8pKQoJ CQljb250aW51ZTsKCgkJLyoKCQkgKiBXZSBtdXN0IGJlIGFibGUgdG8gbWF0Y2ggYXQgbGVh c3Qgb25lIGluZGV4IHRvIGVhY2ggb2YgdGhlIGFybXMgb2YKCQkgKiB0aGUgT1IsIGVsc2Ug d2UgY2FuJ3QgdXNlIGl0LgoJCSAqLwoJCXBhdGhsaXN0ID0gTklMOwoKCQkvKgoJCSAqIEdy b3VwIHRoZSBzaW1pbGFyIE9SLWNsYXVzZSBhcmd1bWVudHMgaW50byBkZWRpY2F0ZWQgUmVz dHJpY3RJbmZvcywKCQkgKiBiZWNhdXNlIGVhY2ggb2YgdGhvc2UgUmVzdHJpY3RJbmZvcyBo YXMgYSBjaGFuY2UgdG8gbWF0Y2ggdGhlIGluZGV4CgkJICogYXMgYSB3aG9sZS4KCQkgKi8K CQlncm91cGVkQXJncyA9IGdyb3VwX3NpbWlsYXJfb3JfYXJncyhyb290LCByZWwsIHJpbmZv KTsKCgkJaWYgKGdyb3VwZWRBcmdzICE9ICgoQm9vbEV4cHIgKikgcmluZm8tPm9yY2xhdXNl KS0+YXJncykKCQl7CgkJCS8qCgkJCSAqIFNvbWUgcGFydHMgb2YgdGhlIHJpbmZvIHdlcmUg cHJvYmFibHkgZ3JvdXBlZC4gIEluIHRoaXMgY2FzZSwKCQkJICogd2UgaGF2ZSBhIHNldCBv ZiBzdWItcmluZm9zIHRoYXQgdG9nZXRoZXIgYXJlIGFuIGV4YWN0CgkJCSAqIGR1cGxpY2F0 ZSBvZiByaW5mby4gIFRodXMsIHdlIG5lZWQgdG8gcmVtb3ZlIHRoZSByaW5mbyBmcm9tCgkJ CSAqIG90aGVyIGNsYXVzZXMuIG1hdGNoX2NsYXVzZXNfdG9faW5kZXggZGV0ZWN0cyBkdXBs aWNhdGVkCgkJCSAqIGljbGF1c2VzIGJ5IGNvbXBhcmluZyBwb2ludGVycyB0byBvcmlnaW5h bCByaW5mb3MgdGhhdCB3b3VsZCBiZQoJCQkgKiBkaWZmZXJlbnQuICBTbywgd2UgbXVzdCBk ZWxldGUgcmluZm8gdG8gYXZvaWQgZGUtZmFjdG8KCQkJICogZHVwbGljYXRlZCBjbGF1c2Vz IGluIHRoZSBpbmRleCBjbGF1c2VzIGxpc3QuCgkJCSAqLwoJCQlpbm5lcl9vdGhlcl9jbGF1 c2VzID0gbGlzdF9kZWxldGUobGlzdF9jb3B5KGFsbF9jbGF1c2VzKSwgcmluZm8pOwoJCX0K CgkJZm9yZWFjaChqLCBncm91cGVkQXJncykKCQl7CgkJCU5vZGUJICAgKm9yYXJnID0gKE5v ZGUgKikgbGZpcnN0KGopOwoJCQlMaXN0CSAgICppbmRsaXN0OwoKCQkJLyogT1IgYXJndW1l bnRzIHNob3VsZCBiZSBBTkRzIG9yIHN1Yi1SZXN0cmljdEluZm9zICovCgkJCWlmIChpc19h bmRjbGF1c2Uob3JhcmcpKQoJCQl7CgkJCQlMaXN0CSAgICphbmRhcmdzID0gKChCb29sRXhw ciAqKSBvcmFyZyktPmFyZ3M7CgoJCQkJaW5kbGlzdCA9IGJ1aWxkX3BhdGhzX2Zvcl9PUihy b290LCByZWwsCgkJCQkJCQkJCQkJIGFuZGFyZ3MsCgkJCQkJCQkJCQkJIGFsbF9jbGF1c2Vz KTsKCgkJCQkvKiBSZWN1cnNlIGluIGNhc2UgdGhlcmUgYXJlIHN1Yi1PUnMgKi8KCQkJCWlu ZGxpc3QgPSBsaXN0X2NvbmNhdChpbmRsaXN0LAoJCQkJCQkJCQkgIGdlbmVyYXRlX2JpdG1h cF9vcl9wYXRocyhyb290LCByZWwsCgkJCQkJCQkJCQkJCQkJCSAgIGFuZGFyZ3MsCgkJCQkJ CQkJCQkJCQkJCSAgIGFsbF9jbGF1c2VzKSk7CgkJCX0KCQkJZWxzZSBpZiAocmVzdHJpY3Rp b25faXNfb3JfY2xhdXNlKGNhc3ROb2RlKFJlc3RyaWN0SW5mbywgb3JhcmcpKSkKCQkJewoJ CQkJUmVzdHJpY3RJbmZvICpyaSA9IGNhc3ROb2RlKFJlc3RyaWN0SW5mbywgb3JhcmcpOwoK CQkJCS8qCgkJCQkgKiBHZW5lcmF0ZSBiaXRtYXAgcGF0aHMgZm9yIHRoZSBncm91cCBvZiBz aW1pbGFyIE9SLWNsYXVzZQoJCQkJICogYXJndW1lbnRzLgoJCQkJICovCgkJCQlpbmRsaXN0 ID0gbWFrZV9iaXRtYXBfcGF0aHNfZm9yX29yX2dyb3VwKHJvb3QsCgkJCQkJCQkJCQkJCQkJ IHJlbCwgcmksCgkJCQkJCQkJCQkJCQkJIGlubmVyX290aGVyX2NsYXVzZXMpOwoKCQkJCWlm IChpbmRsaXN0ID09IE5JTCkKCQkJCXsKCQkJCQlwYXRobGlzdCA9IE5JTDsKCQkJCQlicmVh azsKCQkJCX0KCQkJCWVsc2UKCQkJCXsKCQkJCQlwYXRobGlzdCA9IGxpc3RfY29uY2F0KHBh dGhsaXN0LCBpbmRsaXN0KTsKCQkJCQljb250aW51ZTsKCQkJCX0KCQkJfQoJCQllbHNlCgkJ CXsKCQkJCVJlc3RyaWN0SW5mbyAqcmkgPSBjYXN0Tm9kZShSZXN0cmljdEluZm8sIG9yYXJn KTsKCQkJCUxpc3QJICAgKm9yYXJnczsKCgkJCQlvcmFyZ3MgPSBsaXN0X21ha2UxKHJpKTsK CgkJCQlpbmRsaXN0ID0gYnVpbGRfcGF0aHNfZm9yX09SKHJvb3QsIHJlbCwKCQkJCQkJCQkJ CQkgb3JhcmdzLAoJCQkJCQkJCQkJCSBhbGxfY2xhdXNlcyk7CgkJCX0KCgkJCS8qCgkJCSAq IElmIG5vdGhpbmcgbWF0Y2hlZCB0aGlzIGFybSwgd2UgY2FuJ3QgZG8gYW55dGhpbmcgd2l0 aCB0aGlzIE9SCgkJCSAqIGNsYXVzZS4KCQkJICovCgkJCWlmIChpbmRsaXN0ID09IE5JTCkK CQkJewoJCQkJcGF0aGxpc3QgPSBOSUw7CgkJCQlicmVhazsKCQkJfQoKCQkJLyoKCQkJICog T0ssIHBpY2sgdGhlIG1vc3QgcHJvbWlzaW5nIEFORCBjb21iaW5hdGlvbiwgYW5kIGFkZCBp dCB0bwoJCQkgKiBwYXRobGlzdC4KCQkJICovCgkJCWJpdG1hcHF1YWwgPSBjaG9vc2VfYml0 bWFwX2FuZChyb290LCByZWwsIGluZGxpc3QpOwoJCQlwYXRobGlzdCA9IGxhcHBlbmQocGF0 aGxpc3QsIGJpdG1hcHF1YWwpOwoJCX0KCgkJaWYgKGlubmVyX290aGVyX2NsYXVzZXMgIT0g TklMKQoJCQlsaXN0X2ZyZWUoaW5uZXJfb3RoZXJfY2xhdXNlcyk7CgoJCS8qCgkJICogSWYg d2UgaGF2ZSBhIG1hdGNoIGZvciBldmVyeSBhcm0sIHRoZW4gdHVybiB0aGVtIGludG8gYQoJ CSAqIEJpdG1hcE9yUGF0aCwgYW5kIGFkZCB0byByZXN1bHQgbGlzdC4KCQkgKi8KCQlpZiAo cGF0aGxpc3QgIT0gTklMKQoJCXsKCQkJYml0bWFwcXVhbCA9IChQYXRoICopIGNyZWF0ZV9i aXRtYXBfb3JfcGF0aChyb290LCByZWwsIHBhdGhsaXN0KTsKCQkJcmVzdWx0ID0gbGFwcGVu ZChyZXN1bHQsIGJpdG1hcHF1YWwpOwoJCX0KCX0KCglyZXR1cm4gcmVzdWx0Owp9CgoKLyoK ICogY2hvb3NlX2JpdG1hcF9hbmQKICoJCUdpdmVuIGEgbm9uZW1wdHkgbGlzdCBvZiBiaXRt YXAgcGF0aHMsIEFORCB0aGVtIGludG8gb25lIHBhdGguCiAqCiAqIFRoaXMgaXMgYSBub250 cml2aWFsIGRlY2lzaW9uIHNpbmNlIHdlIGNhbiBsZWdhbGx5IHVzZSBhbnkgc3Vic2V0IG9m IHRoZQogKiBnaXZlbiBwYXRoIHNldC4gIFdlIHdhbnQgdG8gY2hvb3NlIGEgZ29vZCB0cmFk ZW9mZiBiZXR3ZWVuIHNlbGVjdGl2aXR5CiAqIGFuZCBjb3N0IG9mIGNvbXB1dGluZyB0aGUg Yml0bWFwLgogKgogKiBUaGUgcmVzdWx0IGlzIGVpdGhlciBhIHNpbmdsZSBvbmUgb2YgdGhl IGlucHV0cywgb3IgYSBCaXRtYXBBbmRQYXRoCiAqIGNvbWJpbmluZyBtdWx0aXBsZSBpbnB1 dHMuCiAqLwpzdGF0aWMgUGF0aCAqCmNob29zZV9iaXRtYXBfYW5kKFBsYW5uZXJJbmZvICpy b290LCBSZWxPcHRJbmZvICpyZWwsIExpc3QgKnBhdGhzKQp7CglpbnQJCQlucGF0aHMgPSBs aXN0X2xlbmd0aChwYXRocyk7CglQYXRoQ2xhdXNlVXNhZ2UgKipwYXRoaW5mb2FycmF5OwoJ UGF0aENsYXVzZVVzYWdlICpwYXRoaW5mbzsKCUxpc3QJICAgKmNsYXVzZWxpc3Q7CglMaXN0 CSAgICpiZXN0cGF0aHMgPSBOSUw7CglDb3N0CQliZXN0Y29zdCA9IDA7CglpbnQJCQlpLAoJ CQkJajsKCUxpc3RDZWxsICAgKmw7CgoJQXNzZXJ0KG5wYXRocyA+IDApOwkJCS8qIGVsc2Ug Y2FsbGVyIGVycm9yICovCglpZiAobnBhdGhzID09IDEpCgkJcmV0dXJuIChQYXRoICopIGxp bml0aWFsKHBhdGhzKTsJLyogZWFzeSBjYXNlICovCgoJLyoKCSAqIEluIHRoZW9yeSB3ZSBz aG91bGQgY29uc2lkZXIgZXZlcnkgbm9uZW1wdHkgc3Vic2V0IG9mIHRoZSBnaXZlbiBwYXRo cy4KCSAqIEluIHByYWN0aWNlIHRoYXQgc2VlbXMgbGlrZSBvdmVya2lsbCwgZ2l2ZW4gdGhl IGNydWRlIG5hdHVyZSBvZiB0aGUKCSAqIGVzdGltYXRlcywgbm90IHRvIG1lbnRpb24gdGhl IHBvc3NpYmxlIGVmZmVjdHMgb2YgaGlnaGVyLWxldmVsIEFORCBhbmQKCSAqIE9SIGNsYXVz ZXMuICBNb3Jlb3ZlciwgaXQncyBjb21wbGV0ZWx5IGltcHJhY3RpY2FsIGlmIHRoZXJlIGFy ZSBhIGxhcmdlCgkgKiBudW1iZXIgb2YgcGF0aHMsIHNpbmNlIHRoZSB3b3JrIHdvdWxkIGdy b3cgYXMgTygyXk4pLgoJICoKCSAqIEFzIGEgaGV1cmlzdGljLCB3ZSBmaXJzdCBjaGVjayBm b3IgcGF0aHMgdXNpbmcgZXhhY3RseSB0aGUgc2FtZSBzZXRzIG9mCgkgKiBXSEVSRSBjbGF1 c2VzICsgaW5kZXggcHJlZGljYXRlIGNvbmRpdGlvbnMsIGFuZCByZWplY3QgYWxsIGJ1dCB0 aGUKCSAqIGNoZWFwZXN0LXRvLXNjYW4gaW4gYW55IHN1Y2ggZ3JvdXAuICBUaGlzIHByaW1h cmlseSBnZXRzIHJpZCBvZiBpbmRleGVzCgkgKiB0aGF0IGluY2x1ZGUgdGhlIGludGVyZXN0 aW5nIGNvbHVtbnMgYnV0IGFsc28gaXJyZWxldmFudCBjb2x1bW5zLiAgKEluCgkgKiBzaXR1 YXRpb25zIHdoZXJlIHRoZSBEQkEgaGFzIGdvbmUgb3ZlcmJvYXJkIG9uIGNyZWF0aW5nIHZh cmlhbnQKCSAqIGluZGV4ZXMsIHRoaXMgY2FuIG1ha2UgZm9yIGEgdmVyeSBsYXJnZSByZWR1 Y3Rpb24gaW4gdGhlIG51bWJlciBvZgoJICogcGF0aHMgY29uc2lkZXJlZCBmdXJ0aGVyLikK CSAqCgkgKiBXZSB0aGVuIHNvcnQgdGhlIHN1cnZpdmluZyBwYXRocyB3aXRoIHRoZSBjaGVh cGVzdC10by1zY2FuIGZpcnN0LCBhbmQKCSAqIGZvciBlYWNoIHBhdGgsIGNvbnNpZGVyIHVz aW5nIHRoYXQgcGF0aCBhbG9uZSBhcyB0aGUgYmFzaXMgZm9yIGEgYml0bWFwCgkgKiBzY2Fu LiAgVGhlbiB3ZSBjb25zaWRlciBiaXRtYXAgQU5EIHNjYW5zIGZvcm1lZCBmcm9tIHRoYXQg cGF0aCBwbHVzCgkgKiBlYWNoIHN1YnNlcXVlbnQgKGhpZ2hlci1jb3N0KSBwYXRoLCBhZGRp bmcgb24gYSBzdWJzZXF1ZW50IHBhdGggaWYgaXQKCSAqIHJlc3VsdHMgaW4gYSByZWR1Y3Rp b24gaW4gdGhlIGVzdGltYXRlZCB0b3RhbCBzY2FuIGNvc3QuIFRoaXMgbWVhbnMgd2UKCSAq IGNvbnNpZGVyIGFib3V0IE8oTl4yKSByYXRoZXIgdGhhbiBPKDJeTikgcGF0aCBjb21iaW5h dGlvbnMsIHdoaWNoIGlzCgkgKiBxdWl0ZSB0b2xlcmFibGUsIGVzcGVjaWFsbHkgZ2l2ZW4g dGhhbiBOIGlzIHVzdWFsbHkgcmVhc29uYWJseSBzbWFsbAoJICogYmVjYXVzZSBvZiB0aGUg cHJlZmlsdGVyaW5nIHN0ZXAuICBUaGUgY2hlYXBlc3Qgb2YgdGhlc2UgaXMgcmV0dXJuZWQu CgkgKgoJICogV2Ugd2lsbCBvbmx5IGNvbnNpZGVyIEFORCBjb21iaW5hdGlvbnMgaW4gd2hp Y2ggbm8gdHdvIGluZGV4ZXMgdXNlIHRoZQoJICogc2FtZSBXSEVSRSBjbGF1c2UuICBUaGlz IGlzIGEgYml0IG9mIGEga2x1Z2U6IGl0J3MgbmVlZGVkIGJlY2F1c2UKCSAqIGNvc3RzaXpl LmMgYW5kIGNsYXVzZXNlbC5jIGFyZW4ndCB2ZXJ5IHNtYXJ0IGFib3V0IHJlZHVuZGFudCBj bGF1c2VzLgoJICogVGhleSB3aWxsIHVzdWFsbHkgZG91YmxlLWNvdW50IHRoZSByZWR1bmRh bnQgY2xhdXNlcywgcHJvZHVjaW5nIGEKCSAqIHRvby1zbWFsbCBzZWxlY3Rpdml0eSB0aGF0 IG1ha2VzIGEgcmVkdW5kYW50IEFORCBzdGVwIGxvb2sgbGlrZSBpdAoJICogcmVkdWNlcyB0 aGUgdG90YWwgY29zdC4gIFBlcmhhcHMgc29tZWRheSB0aGF0IGNvZGUgd2lsbCBiZSBzbWFy dGVyIGFuZAoJICogd2UgY2FuIHJlbW92ZSB0aGlzIGxpbWl0YXRpb24uICAoQnV0IG5vdGUg dGhhdCB0aGlzIGFsc28gZGVmZW5kcwoJICogYWdhaW5zdCBmbGF0LW91dCBkdXBsaWNhdGUg aW5wdXQgcGF0aHMsIHdoaWNoIGNhbiBoYXBwZW4gYmVjYXVzZQoJICogbWF0Y2hfam9pbl9j bGF1c2VzX3RvX2luZGV4IHdpbGwgZmluZCB0aGUgc2FtZSBPUiBqb2luIGNsYXVzZXMgdGhh dAoJICogZXh0cmFjdF9yZXN0cmljdGlvbl9vcl9jbGF1c2VzIGhhcyBwdWxsZWQgT1IgcmVz dHJpY3Rpb24gY2xhdXNlcyBvdXQKCSAqIG9mLikKCSAqCgkgKiBGb3IgdGhlIHNhbWUgcmVh c29uLCB3ZSByZWplY3QgQU5EIGNvbWJpbmF0aW9ucyBpbiB3aGljaCBhbiBpbmRleAoJICog cHJlZGljYXRlIGNsYXVzZSBkdXBsaWNhdGVzIGFub3RoZXIgY2xhdXNlLiAgSGVyZSB3ZSBm aW5kIGl0IG5lY2Vzc2FyeQoJICogdG8gYmUgZXZlbiBzdHJpY3Rlcjogd2UnbGwgcmVqZWN0 IGEgcGFydGlhbCBpbmRleCBpZiBhbnkgb2YgaXRzCgkgKiBwcmVkaWNhdGUgY2xhdXNlcyBh cmUgaW1wbGllZCBieSB0aGUgc2V0IG9mIFdIRVJFIGNsYXVzZXMgYW5kIHByZWRpY2F0ZQoJ ICogY2xhdXNlcyB1c2VkIHNvIGZhci4gIFRoaXMgY292ZXJzIGNhc2VzIHN1Y2ggYXMgYSBj b25kaXRpb24gInggPSA0MiIKCSAqIHVzZWQgd2l0aCBhIHBsYWluIGluZGV4LCBmb2xsb3dl ZCBieSBhIGNsYXVzZWxlc3Mgc2NhbiBvZiBhIHBhcnRpYWwKCSAqIGluZGV4ICJXSEVSRSB4 ID49IDQwIEFORCB4IDwgNTAiLiAgVGhlIHBhcnRpYWwgaW5kZXggaGFzIGJlZW4gYWNjZXB0 ZWQKCSAqIG9ubHkgYmVjYXVzZSAieCA9IDQyIiB3YXMgcHJlc2VudCwgYW5kIHNvIGFsbG93 aW5nIGl0IHdvdWxkIHBhcnRpYWxseQoJICogZG91YmxlLWNvdW50IHNlbGVjdGl2aXR5LiAg KFdlIGNvdWxkIHVzZSBwcmVkaWNhdGVfaW1wbGllZF9ieSBvbgoJICogcmVndWxhciBxdWFs IGNsYXVzZXMgdG9vLCB0byBoYXZlIGEgbW9yZSBpbnRlbGxpZ2VudCwgYnV0IG11Y2ggbW9y ZQoJICogZXhwZW5zaXZlLCBjaGVjayBmb3IgcmVkdW5kYW5jeSAtLS0gYnV0IGluIG1vc3Qg Y2FzZXMgc2ltcGxlIGVxdWFsaXR5CgkgKiBzZWVtcyB0byBzdWZmaWNlLikKCSAqLwoKCS8q CgkgKiBFeHRyYWN0IGNsYXVzZSB1c2FnZSBpbmZvIGFuZCBkZXRlY3QgYW55IHBhdGhzIHRo YXQgdXNlIGV4YWN0bHkgdGhlCgkgKiBzYW1lIHNldCBvZiBjbGF1c2VzOyBrZWVwIG9ubHkg dGhlIGNoZWFwZXN0LXRvLXNjYW4gb2YgYW55IHN1Y2ggZ3JvdXBzLgoJICogVGhlIHN1cnZp dmluZyBwYXRocyBhcmUgcHV0IGludG8gYW4gYXJyYXkgZm9yIHFzb3J0J2luZy4KCSAqLwoJ cGF0aGluZm9hcnJheSA9IHBhbGxvY19hcnJheShQYXRoQ2xhdXNlVXNhZ2UgKiwgbnBhdGhz KTsKCWNsYXVzZWxpc3QgPSBOSUw7CglucGF0aHMgPSAwOwoJZm9yZWFjaChsLCBwYXRocykK CXsKCQlQYXRoCSAgICppcGF0aCA9IChQYXRoICopIGxmaXJzdChsKTsKCgkJcGF0aGluZm8g PSBjbGFzc2lmeV9pbmRleF9jbGF1c2VfdXNhZ2UoaXBhdGgsICZjbGF1c2VsaXN0KTsKCgkJ LyogSWYgaXQncyB1bmNsYXNzaWZpYWJsZSwgdHJlYXQgaXQgYXMgZGlzdGluY3QgZnJvbSBh bGwgb3RoZXJzICovCgkJaWYgKHBhdGhpbmZvLT51bmNsYXNzaWZpYWJsZSkKCQl7CgkJCXBh dGhpbmZvYXJyYXlbbnBhdGhzKytdID0gcGF0aGluZm87CgkJCWNvbnRpbnVlOwoJCX0KCgkJ Zm9yIChpID0gMDsgaSA8IG5wYXRoczsgaSsrKQoJCXsKCQkJaWYgKCFwYXRoaW5mb2FycmF5 W2ldLT51bmNsYXNzaWZpYWJsZSAmJgoJCQkJYm1zX2VxdWFsKHBhdGhpbmZvLT5jbGF1c2Vp ZHMsIHBhdGhpbmZvYXJyYXlbaV0tPmNsYXVzZWlkcykpCgkJCQlicmVhazsKCQl9CgkJaWYg KGkgPCBucGF0aHMpCgkJewoJCQkvKiBkdXBsaWNhdGUgY2xhdXNlaWRzLCBrZWVwIHRoZSBj aGVhcGVyIG9uZSAqLwoJCQlDb3N0CQluY29zdDsKCQkJQ29zdAkJb2Nvc3Q7CgkJCVNlbGVj dGl2aXR5IG5zZWxlYzsKCQkJU2VsZWN0aXZpdHkgb3NlbGVjOwoKCQkJY29zdF9iaXRtYXBf dHJlZV9ub2RlKHBhdGhpbmZvLT5wYXRoLCAmbmNvc3QsICZuc2VsZWMpOwoJCQljb3N0X2Jp dG1hcF90cmVlX25vZGUocGF0aGluZm9hcnJheVtpXS0+cGF0aCwgJm9jb3N0LCAmb3NlbGVj KTsKCQkJaWYgKG5jb3N0IDwgb2Nvc3QpCgkJCQlwYXRoaW5mb2FycmF5W2ldID0gcGF0aGlu Zm87CgkJfQoJCWVsc2UKCQl7CgkJCS8qIG5vdCBkdXBsaWNhdGUgY2xhdXNlaWRzLCBhZGQg dG8gYXJyYXkgKi8KCQkJcGF0aGluZm9hcnJheVtucGF0aHMrK10gPSBwYXRoaW5mbzsKCQl9 Cgl9CgoJLyogSWYgb25seSBvbmUgc3Vydml2aW5nIHBhdGgsIHdlJ3JlIGRvbmUgKi8KCWlm IChucGF0aHMgPT0gMSkKCQlyZXR1cm4gcGF0aGluZm9hcnJheVswXS0+cGF0aDsKCgkvKiBT b3J0IHRoZSBzdXJ2aXZpbmcgcGF0aHMgYnkgaW5kZXggYWNjZXNzIGNvc3QgKi8KCXFzb3J0 KHBhdGhpbmZvYXJyYXksIG5wYXRocywgc2l6ZW9mKFBhdGhDbGF1c2VVc2FnZSAqKSwKCQkg IHBhdGhfdXNhZ2VfY29tcGFyYXRvcik7CgoJLyoKCSAqIEZvciBlYWNoIHN1cnZpdmluZyBp bmRleCwgY29uc2lkZXIgaXQgYXMgYW4gIkFORCBncm91cCBsZWFkZXIiLCBhbmQgc2VlCgkg KiB3aGV0aGVyIGFkZGluZyBvbiBhbnkgb2YgdGhlIGxhdGVyIGluZGV4ZXMgcmVzdWx0cyBp biBhbiBBTkQgcGF0aCB3aXRoCgkgKiBjaGVhcGVyIHRvdGFsIGNvc3QgdGhhbiBiZWZvcmUu ICBUaGVuIHRha2UgdGhlIGNoZWFwZXN0IEFORCBncm91cC4KCSAqCgkgKiBOb3RlOiBwYXRo cyB0aGF0IGFyZSBlaXRoZXIgY2xhdXNlbGVzcyBvciB1bmNsYXNzaWZpYWJsZSB3aWxsIGhh dmUKCSAqIGVtcHR5IGNsYXVzZWlkcywgc28gdGhhdCB0aGV5IHdpbGwgbm90IGJlIHJlamVj dGVkIGJ5IHRoZSBjbGF1c2VpZHMKCSAqIGZpbHRlciBoZXJlLCBub3Igd2lsbCB0aGV5IGNh dXNlIGxhdGVyIHBhdGhzIHRvIGJlIHJlamVjdGVkIGJ5IGl0LgoJICovCglmb3IgKGkgPSAw OyBpIDwgbnBhdGhzOyBpKyspCgl7CgkJQ29zdAkJY29zdHNvZmFyOwoJCUxpc3QJICAgKnF1 YWxzb2ZhcjsKCQlCaXRtYXBzZXQgICpjbGF1c2VpZHNvZmFyOwoKCQlwYXRoaW5mbyA9IHBh dGhpbmZvYXJyYXlbaV07CgkJcGF0aHMgPSBsaXN0X21ha2UxKHBhdGhpbmZvLT5wYXRoKTsK CQljb3N0c29mYXIgPSBiaXRtYXBfc2Nhbl9jb3N0X2VzdChyb290LCByZWwsIHBhdGhpbmZv LT5wYXRoKTsKCQlxdWFsc29mYXIgPSBsaXN0X2NvbmNhdF9jb3B5KHBhdGhpbmZvLT5xdWFs cywgcGF0aGluZm8tPnByZWRzKTsKCQljbGF1c2VpZHNvZmFyID0gYm1zX2NvcHkocGF0aGlu Zm8tPmNsYXVzZWlkcyk7CgoJCWZvciAoaiA9IGkgKyAxOyBqIDwgbnBhdGhzOyBqKyspCgkJ ewoJCQlDb3N0CQluZXdjb3N0OwoKCQkJcGF0aGluZm8gPSBwYXRoaW5mb2FycmF5W2pdOwoJ CQkvKiBDaGVjayBmb3IgcmVkdW5kYW5jeSAqLwoJCQlpZiAoYm1zX292ZXJsYXAocGF0aGlu Zm8tPmNsYXVzZWlkcywgY2xhdXNlaWRzb2ZhcikpCgkJCQljb250aW51ZTsJCS8qIGNvbnNp ZGVyIGl0IHJlZHVuZGFudCAqLwoJCQlpZiAocGF0aGluZm8tPnByZWRzKQoJCQl7CgkJCQli b29sCQlyZWR1bmRhbnQgPSBmYWxzZTsKCgkJCQkvKiB3ZSBjaGVjayBlYWNoIHByZWRpY2F0 ZSBjbGF1c2Ugc2VwYXJhdGVseSAqLwoJCQkJZm9yZWFjaChsLCBwYXRoaW5mby0+cHJlZHMp CgkJCQl7CgkJCQkJTm9kZQkgICAqbnAgPSAoTm9kZSAqKSBsZmlyc3QobCk7CgoJCQkJCWlm IChwcmVkaWNhdGVfaW1wbGllZF9ieShsaXN0X21ha2UxKG5wKSwgcXVhbHNvZmFyLCBmYWxz ZSkpCgkJCQkJewoJCQkJCQlyZWR1bmRhbnQgPSB0cnVlOwoJCQkJCQlicmVhazsJLyogb3V0 IG9mIGlubmVyIGZvcmVhY2ggbG9vcCAqLwoJCQkJCX0KCQkJCX0KCQkJCWlmIChyZWR1bmRh bnQpCgkJCQkJY29udGludWU7CgkJCX0KCQkJLyogdGVudGF0aXZlbHkgYWRkIG5ldyBwYXRo IHRvIHBhdGhzLCBzbyB3ZSBjYW4gZXN0aW1hdGUgY29zdCAqLwoJCQlwYXRocyA9IGxhcHBl bmQocGF0aHMsIHBhdGhpbmZvLT5wYXRoKTsKCQkJbmV3Y29zdCA9IGJpdG1hcF9hbmRfY29z dF9lc3Qocm9vdCwgcmVsLCBwYXRocyk7CgkJCWlmIChuZXdjb3N0IDwgY29zdHNvZmFyKQoJ CQl7CgkJCQkvKiBrZWVwIG5ldyBwYXRoIGluIHBhdGhzLCB1cGRhdGUgc3Vic2lkaWFyeSB2 YXJpYWJsZXMgKi8KCQkJCWNvc3Rzb2ZhciA9IG5ld2Nvc3Q7CgkJCQlxdWFsc29mYXIgPSBs aXN0X2NvbmNhdChxdWFsc29mYXIsIHBhdGhpbmZvLT5xdWFscyk7CgkJCQlxdWFsc29mYXIg PSBsaXN0X2NvbmNhdChxdWFsc29mYXIsIHBhdGhpbmZvLT5wcmVkcyk7CgkJCQljbGF1c2Vp ZHNvZmFyID0gYm1zX2FkZF9tZW1iZXJzKGNsYXVzZWlkc29mYXIsCgkJCQkJCQkJCQkJCXBh dGhpbmZvLT5jbGF1c2VpZHMpOwoJCQl9CgkJCWVsc2UKCQkJewoJCQkJLyogcmVqZWN0IG5l dyBwYXRoLCByZW1vdmUgaXQgZnJvbSBwYXRocyBsaXN0ICovCgkJCQlwYXRocyA9IGxpc3Rf dHJ1bmNhdGUocGF0aHMsIGxpc3RfbGVuZ3RoKHBhdGhzKSAtIDEpOwoJCQl9CgkJfQoKCQkv KiBLZWVwIHRoZSBjaGVhcGVzdCBBTkQtZ3JvdXAgKG9yIHNpbmdsZXRvbikgKi8KCQlpZiAo aSA9PSAwIHx8IGNvc3Rzb2ZhciA8IGJlc3Rjb3N0KQoJCXsKCQkJYmVzdHBhdGhzID0gcGF0 aHM7CgkJCWJlc3Rjb3N0ID0gY29zdHNvZmFyOwoJCX0KCgkJLyogc29tZSBlYXN5IGNsZWFu dXAgKHdlIGRvbid0IHRyeSByZWFsIGhhcmQgdGhvdWdoKSAqLwoJCWxpc3RfZnJlZShxdWFs c29mYXIpOwoJfQoKCWlmIChsaXN0X2xlbmd0aChiZXN0cGF0aHMpID09IDEpCgkJcmV0dXJu IChQYXRoICopIGxpbml0aWFsKGJlc3RwYXRocyk7CS8qIG5vIG5lZWQgZm9yIEFORCAqLwoJ cmV0dXJuIChQYXRoICopIGNyZWF0ZV9iaXRtYXBfYW5kX3BhdGgocm9vdCwgcmVsLCBiZXN0 cGF0aHMpOwp9CgovKiBxc29ydCBjb21wYXJhdG9yIHRvIHNvcnQgaW4gaW5jcmVhc2luZyBp bmRleCBhY2Nlc3MgY29zdCBvcmRlciAqLwpzdGF0aWMgaW50CnBhdGhfdXNhZ2VfY29tcGFy YXRvcihjb25zdCB2b2lkICphLCBjb25zdCB2b2lkICpiKQp7CglQYXRoQ2xhdXNlVXNhZ2Ug KnBhID0gKihQYXRoQ2xhdXNlVXNhZ2UgKmNvbnN0ICopIGE7CglQYXRoQ2xhdXNlVXNhZ2Ug KnBiID0gKihQYXRoQ2xhdXNlVXNhZ2UgKmNvbnN0ICopIGI7CglDb3N0CQlhY29zdDsKCUNv c3QJCWJjb3N0OwoJU2VsZWN0aXZpdHkgYXNlbGVjOwoJU2VsZWN0aXZpdHkgYnNlbGVjOwoK CWNvc3RfYml0bWFwX3RyZWVfbm9kZShwYS0+cGF0aCwgJmFjb3N0LCAmYXNlbGVjKTsKCWNv c3RfYml0bWFwX3RyZWVfbm9kZShwYi0+cGF0aCwgJmJjb3N0LCAmYnNlbGVjKTsKCgkvKgoJ ICogSWYgY29zdHMgYXJlIHRoZSBzYW1lLCBzb3J0IGJ5IHNlbGVjdGl2aXR5LgoJICovCglp ZiAoYWNvc3QgPCBiY29zdCkKCQlyZXR1cm4gLTE7CglpZiAoYWNvc3QgPiBiY29zdCkKCQly ZXR1cm4gMTsKCglpZiAoYXNlbGVjIDwgYnNlbGVjKQoJCXJldHVybiAtMTsKCWlmIChhc2Vs ZWMgPiBic2VsZWMpCgkJcmV0dXJuIDE7CgoJcmV0dXJuIDA7Cn0KCi8qCiAqIEVzdGltYXRl IHRoZSBjb3N0IG9mIGFjdHVhbGx5IGV4ZWN1dGluZyBhIGJpdG1hcCBzY2FuIHdpdGggYSBz aW5nbGUKICogaW5kZXggcGF0aCAod2hpY2ggY291bGQgYmUgYSBCaXRtYXBBbmQgb3IgQml0 bWFwT3Igbm9kZSkuCiAqLwpzdGF0aWMgQ29zdApiaXRtYXBfc2Nhbl9jb3N0X2VzdChQbGFu bmVySW5mbyAqcm9vdCwgUmVsT3B0SW5mbyAqcmVsLCBQYXRoICppcGF0aCkKewoJQml0bWFw SGVhcFBhdGggYnBhdGg7CgoJLyogU2V0IHVwIGEgZHVtbXkgQml0bWFwSGVhcFBhdGggKi8K CWJwYXRoLnBhdGgudHlwZSA9IFRfQml0bWFwSGVhcFBhdGg7CglicGF0aC5wYXRoLnBhdGh0 eXBlID0gVF9CaXRtYXBIZWFwU2NhbjsKCWJwYXRoLnBhdGgucGFyZW50ID0gcmVsOwoJYnBh dGgucGF0aC5wYXRodGFyZ2V0ID0gcmVsLT5yZWx0YXJnZXQ7CglicGF0aC5wYXRoLnBhcmFt X2luZm8gPSBpcGF0aC0+cGFyYW1faW5mbzsKCWJwYXRoLnBhdGgucGF0aGtleXMgPSBOSUw7 CglicGF0aC5iaXRtYXBxdWFsID0gaXBhdGg7CgoJLyoKCSAqIENoZWNrIHRoZSBjb3N0IG9m IHRlbXBvcmFyeSBwYXRoIHdpdGhvdXQgY29uc2lkZXJpbmcgcGFyYWxsZWxpc20uCgkgKiBQ YXJhbGxlbCBiaXRtYXAgaGVhcCBwYXRoIHdpbGwgYmUgY29uc2lkZXJlZCBhdCBsYXRlciBz dGFnZS4KCSAqLwoJYnBhdGgucGF0aC5wYXJhbGxlbF93b3JrZXJzID0gMDsKCgkvKiBOb3cg d2UgY2FuIGRvIGNvc3RfYml0bWFwX2hlYXBfc2NhbiAqLwoJY29zdF9iaXRtYXBfaGVhcF9z Y2FuKCZicGF0aC5wYXRoLCByb290LCByZWwsCgkJCQkJCSAgYnBhdGgucGF0aC5wYXJhbV9p bmZvLAoJCQkJCQkgIGlwYXRoLAoJCQkJCQkgIGdldF9sb29wX2NvdW50KHJvb3QsIHJlbC0+ cmVsaWQsCgkJCQkJCQkJCQkgUEFUSF9SRVFfT1VURVIoaXBhdGgpKSk7CgoJcmV0dXJuIGJw YXRoLnBhdGgudG90YWxfY29zdDsKfQoKLyoKICogRXN0aW1hdGUgdGhlIGNvc3Qgb2YgYWN0 dWFsbHkgZXhlY3V0aW5nIGEgQml0bWFwQW5kIHNjYW4gd2l0aCB0aGUgZ2l2ZW4KICogaW5w dXRzLgogKi8Kc3RhdGljIENvc3QKYml0bWFwX2FuZF9jb3N0X2VzdChQbGFubmVySW5mbyAq cm9vdCwgUmVsT3B0SW5mbyAqcmVsLCBMaXN0ICpwYXRocykKewoJQml0bWFwQW5kUGF0aCAq YXBhdGg7CgoJLyoKCSAqIE1pZ2h0IGFzIHdlbGwgYnVpbGQgYSByZWFsIEJpdG1hcEFuZFBh dGggaGVyZSwgYXMgdGhlIHdvcmsgaXMgc2xpZ2h0bHkKCSAqIHRvbyBjb21wbGljYXRlZCB0 byBiZSB3b3J0aCByZXBlYXRpbmcganVzdCB0byBzYXZlIG9uZSBwYWxsb2MuCgkgKi8KCWFw YXRoID0gY3JlYXRlX2JpdG1hcF9hbmRfcGF0aChyb290LCByZWwsIHBhdGhzKTsKCglyZXR1 cm4gYml0bWFwX3NjYW5fY29zdF9lc3Qocm9vdCwgcmVsLCAoUGF0aCAqKSBhcGF0aCk7Cn0K CgovKgogKiBjbGFzc2lmeV9pbmRleF9jbGF1c2VfdXNhZ2UKICoJCUNvbnN0cnVjdCBhIFBh dGhDbGF1c2VVc2FnZSBzdHJ1Y3QgZGVzY3JpYmluZyB0aGUgV0hFUkUgY2xhdXNlcyBhbmQK ICoJCWluZGV4IHByZWRpY2F0ZSBjbGF1c2VzIHVzZWQgYnkgdGhlIGdpdmVuIGluZGV4c2Nh biBwYXRoLgogKgkJV2UgY29uc2lkZXIgdHdvIGNsYXVzZXMgdGhlIHNhbWUgaWYgdGhleSBh cmUgZXF1YWwoKS4KICoKICogQXQgc29tZSBwb2ludCB3ZSBtaWdodCB3YW50IHRvIG1pZ3Jh dGUgdGhpcyBpbmZvIGludG8gdGhlIFBhdGggZGF0YQogKiBzdHJ1Y3R1cmUgcHJvcGVyLCBi dXQgZm9yIHRoZSBtb21lbnQgaXQncyBvbmx5IG5lZWRlZCB3aXRoaW4KICogY2hvb3NlX2Jp dG1hcF9hbmQoKS4KICoKICogKmNsYXVzZWxpc3QgaXMgdXNlZCBhbmQgZXhwYW5kZWQgYXMg bmVlZGVkIHRvIGlkZW50aWZ5IGFsbCB0aGUgZGlzdGluY3QKICogY2xhdXNlcyBzZWVuIGFj cm9zcyBzdWNjZXNzaXZlIGNhbGxzLiAgQ2FsbGVyIG11c3QgaW5pdGlhbGl6ZSBpdCB0byBO SUwKICogYmVmb3JlIGZpcnN0IGNhbGwgb2YgYSBzZXQuCiAqLwpzdGF0aWMgUGF0aENsYXVz ZVVzYWdlICoKY2xhc3NpZnlfaW5kZXhfY2xhdXNlX3VzYWdlKFBhdGggKnBhdGgsIExpc3Qg KipjbGF1c2VsaXN0KQp7CglQYXRoQ2xhdXNlVXNhZ2UgKnJlc3VsdDsKCUJpdG1hcHNldCAg KmNsYXVzZWlkczsKCUxpc3RDZWxsICAgKmxjOwoKCXJlc3VsdCA9IHBhbGxvY19vYmplY3Qo UGF0aENsYXVzZVVzYWdlKTsKCXJlc3VsdC0+cGF0aCA9IHBhdGg7CgoJLyogUmVjdXJzaXZl bHkgZmluZCB0aGUgcXVhbHMgYW5kIHByZWRzIHVzZWQgYnkgdGhlIHBhdGggKi8KCXJlc3Vs dC0+cXVhbHMgPSBOSUw7CglyZXN1bHQtPnByZWRzID0gTklMOwoJZmluZF9pbmRleHBhdGhf cXVhbHMocGF0aCwgJnJlc3VsdC0+cXVhbHMsICZyZXN1bHQtPnByZWRzKTsKCgkvKgoJICog U29tZSBtYWNoaW5lLWdlbmVyYXRlZCBxdWVyaWVzIGhhdmUgb3V0bGFuZGlzaCBudW1iZXJz IG9mIHF1YWwgY2xhdXNlcy4KCSAqIFRvIGF2b2lkIGdldHRpbmcgaW50byBPKE5eMikgYmVo YXZpb3IgZXZlbiBpbiB0aGlzIHByZWxpbWluYXJ5CgkgKiBjbGFzc2lmaWNhdGlvbiBzdGVw LCB3ZSB3YW50IHRvIGxpbWl0IHRoZSBudW1iZXIgb2YgZW50cmllcyB3ZSBjYW4KCSAqIGFj Y3VtdWxhdGUgaW4gKmNsYXVzZWxpc3QuICBUcmVhdCBhbnkgcGF0aCB3aXRoIG1vcmUgdGhh biAxMDAgcXVhbHMgKwoJICogcHJlZHMgYXMgdW5jbGFzc2lmaWFibGUsIHdoaWNoIHdpbGwg Y2F1c2UgY2FsbGluZyBjb2RlIHRvIGNvbnNpZGVyIGl0CgkgKiBkaXN0aW5jdCBmcm9tIGFs bCBvdGhlciBwYXRocy4KCSAqLwoJaWYgKGxpc3RfbGVuZ3RoKHJlc3VsdC0+cXVhbHMpICsg bGlzdF9sZW5ndGgocmVzdWx0LT5wcmVkcykgPiAxMDApCgl7CgkJcmVzdWx0LT5jbGF1c2Vp ZHMgPSBOVUxMOwoJCXJlc3VsdC0+dW5jbGFzc2lmaWFibGUgPSB0cnVlOwoJCXJldHVybiBy ZXN1bHQ7Cgl9CgoJLyogQnVpbGQgdXAgYSBiaXRtYXBzZXQgcmVwcmVzZW50aW5nIHRoZSBx dWFscyBhbmQgcHJlZHMgKi8KCWNsYXVzZWlkcyA9IE5VTEw7Cglmb3JlYWNoKGxjLCByZXN1 bHQtPnF1YWxzKQoJewoJCU5vZGUJICAgKm5vZGUgPSAoTm9kZSAqKSBsZmlyc3QobGMpOwoK CQljbGF1c2VpZHMgPSBibXNfYWRkX21lbWJlcihjbGF1c2VpZHMsCgkJCQkJCQkJICAgZmlu ZF9saXN0X3Bvc2l0aW9uKG5vZGUsIGNsYXVzZWxpc3QpKTsKCX0KCWZvcmVhY2gobGMsIHJl c3VsdC0+cHJlZHMpCgl7CgkJTm9kZQkgICAqbm9kZSA9IChOb2RlICopIGxmaXJzdChsYyk7 CgoJCWNsYXVzZWlkcyA9IGJtc19hZGRfbWVtYmVyKGNsYXVzZWlkcywKCQkJCQkJCQkgICBm aW5kX2xpc3RfcG9zaXRpb24obm9kZSwgY2xhdXNlbGlzdCkpOwoJfQoJcmVzdWx0LT5jbGF1 c2VpZHMgPSBjbGF1c2VpZHM7CglyZXN1bHQtPnVuY2xhc3NpZmlhYmxlID0gZmFsc2U7CgoJ cmV0dXJuIHJlc3VsdDsKfQoKCi8qCiAqIGZpbmRfaW5kZXhwYXRoX3F1YWxzCiAqCiAqIEdp dmVuIHRoZSBQYXRoIHN0cnVjdHVyZSBmb3IgYSBwbGFpbiBvciBiaXRtYXAgaW5kZXhzY2Fu LCBleHRyYWN0IGxpc3RzCiAqIG9mIGFsbCB0aGUgaW5kZXggY2xhdXNlcyBhbmQgaW5kZXgg cHJlZGljYXRlIGNvbmRpdGlvbnMgdXNlZCBpbiB0aGUgUGF0aC4KICogVGhlc2UgYXJlIGFw cGVuZGVkIHRvIHRoZSBpbml0aWFsIGNvbnRlbnRzIG9mICpxdWFscyBhbmQgKnByZWRzICho ZW5jZQogKiBjYWxsZXIgc2hvdWxkIGluaXRpYWxpemUgdGhvc2UgdG8gTklMKS4KICoKICog Tm90ZSB3ZSBhcmUgbm90IHRyeWluZyB0byBwcm9kdWNlIGFuIGFjY3VyYXRlIHJlcHJlc2Vu dGF0aW9uIG9mIHRoZSBBTkQvT1IKICogc2VtYW50aWNzIG9mIHRoZSBQYXRoLCBidXQganVz dCBmaW5kIG91dCBhbGwgdGhlIGJhc2UgY29uZGl0aW9ucyB1c2VkLgogKgogKiBUaGUgcmVz dWx0IGxpc3RzIGNvbnRhaW4gcG9pbnRlcnMgdG8gdGhlIGV4cHJlc3Npb25zIHVzZWQgaW4g dGhlIFBhdGgsCiAqIGJ1dCBhbGwgdGhlIGxpc3QgY2VsbHMgYXJlIGZyZXNobHkgYnVpbHQs IHNvIGl0J3Mgc2FmZSB0byBkZXN0cnVjdGl2ZWx5CiAqIG1vZGlmeSB0aGUgbGlzdHMgKGVn LCBieSBjb25jYXQnaW5nIHdpdGggb3RoZXIgbGlzdHMpLgogKi8Kc3RhdGljIHZvaWQKZmlu ZF9pbmRleHBhdGhfcXVhbHMoUGF0aCAqYml0bWFwcXVhbCwgTGlzdCAqKnF1YWxzLCBMaXN0 ICoqcHJlZHMpCnsKCWlmIChJc0EoYml0bWFwcXVhbCwgQml0bWFwQW5kUGF0aCkpCgl7CgkJ Qml0bWFwQW5kUGF0aCAqYXBhdGggPSAoQml0bWFwQW5kUGF0aCAqKSBiaXRtYXBxdWFsOwoJ CUxpc3RDZWxsICAgKmw7CgoJCWZvcmVhY2gobCwgYXBhdGgtPmJpdG1hcHF1YWxzKQoJCXsK CQkJZmluZF9pbmRleHBhdGhfcXVhbHMoKFBhdGggKikgbGZpcnN0KGwpLCBxdWFscywgcHJl ZHMpOwoJCX0KCX0KCWVsc2UgaWYgKElzQShiaXRtYXBxdWFsLCBCaXRtYXBPclBhdGgpKQoJ ewoJCUJpdG1hcE9yUGF0aCAqb3BhdGggPSAoQml0bWFwT3JQYXRoICopIGJpdG1hcHF1YWw7 CgkJTGlzdENlbGwgICAqbDsKCgkJZm9yZWFjaChsLCBvcGF0aC0+Yml0bWFwcXVhbHMpCgkJ ewoJCQlmaW5kX2luZGV4cGF0aF9xdWFscygoUGF0aCAqKSBsZmlyc3QobCksIHF1YWxzLCBw cmVkcyk7CgkJfQoJfQoJZWxzZSBpZiAoSXNBKGJpdG1hcHF1YWwsIEluZGV4UGF0aCkpCgl7 CgkJSW5kZXhQYXRoICAqaXBhdGggPSAoSW5kZXhQYXRoICopIGJpdG1hcHF1YWw7CgkJTGlz dENlbGwgICAqbDsKCgkJZm9yZWFjaChsLCBpcGF0aC0+aW5kZXhjbGF1c2VzKQoJCXsKCQkJ SW5kZXhDbGF1c2UgKmljbGF1c2UgPSAoSW5kZXhDbGF1c2UgKikgbGZpcnN0KGwpOwoKCQkJ KnF1YWxzID0gbGFwcGVuZCgqcXVhbHMsIGljbGF1c2UtPnJpbmZvLT5jbGF1c2UpOwoJCX0K CQkqcHJlZHMgPSBsaXN0X2NvbmNhdCgqcHJlZHMsIGlwYXRoLT5pbmRleGluZm8tPmluZHBy ZWRFeHBhbmQpOwoJfQoJZWxzZQoJCWVsb2coRVJST1IsICJ1bnJlY29nbml6ZWQgbm9kZSB0 eXBlOiAlZCIsIG5vZGVUYWcoYml0bWFwcXVhbCkpOwp9CgoKLyoKICogZmluZF9saXN0X3Bv c2l0aW9uCiAqCQlSZXR1cm4gdGhlIGdpdmVuIG5vZGUncyBwb3NpdGlvbiAoY291bnRpbmcg ZnJvbSAwKSBpbiB0aGUgZ2l2ZW4KICoJCWxpc3Qgb2Ygbm9kZXMuICBJZiBpdCdzIG5vdCBl cXVhbCgpIHRvIGFueSBleGlzdGluZyBsaXN0IG1lbWJlciwKICoJCWFkZCBpdCBhdCB0aGUg ZW5kLCBhbmQgcmV0dXJuIHRoYXQgcG9zaXRpb24uCiAqLwpzdGF0aWMgaW50CmZpbmRfbGlz dF9wb3NpdGlvbihOb2RlICpub2RlLCBMaXN0ICoqbm9kZWxpc3QpCnsKCWludAkJCWk7CglM aXN0Q2VsbCAgICpsYzsKCglpID0gMDsKCWZvcmVhY2gobGMsICpub2RlbGlzdCkKCXsKCQlO b2RlCSAgICpvbGRub2RlID0gKE5vZGUgKikgbGZpcnN0KGxjKTsKCgkJaWYgKGVxdWFsKG5v ZGUsIG9sZG5vZGUpKQoJCQlyZXR1cm4gaTsKCQlpKys7Cgl9CgoJKm5vZGVsaXN0ID0gbGFw cGVuZCgqbm9kZWxpc3QsIG5vZGUpOwoKCXJldHVybiBpOwp9CgoKLyoKICogY2hlY2tfaW5k ZXhfb25seQogKgkJRGV0ZXJtaW5lIHdoZXRoZXIgYW4gaW5kZXgtb25seSBzY2FuIGlzIHBv c3NpYmxlIGZvciB0aGlzIGluZGV4LgogKi8Kc3RhdGljIGJvb2wKY2hlY2tfaW5kZXhfb25s eShSZWxPcHRJbmZvICpyZWwsIEluZGV4T3B0SW5mbyAqaW5kZXgpCnsKCWJvb2wJCXJlc3Vs dDsKCUJpdG1hcHNldCAgKmF0dHJzX3VzZWQgPSBOVUxMOwoJQml0bWFwc2V0ICAqaW5kZXhf Y2FucmV0dXJuX2F0dHJzID0gTlVMTDsKCUxpc3RDZWxsICAgKmxjOwoJaW50CQkJaTsKCgkv KiBJZiB3ZSdyZSBub3QgYWxsb3dlZCB0byBjb25zaWRlciBpbmRleC1vbmx5IHNjYW5zLCBn aXZlIHVwIG5vdyAqLwoJaWYgKChyZWwtPnBnc19tYXNrICYgUEdTX0NPTlNJREVSX0lOREVY T05MWSkgPT0gMCkKCQlyZXR1cm4gZmFsc2U7CgoJLyoKCSAqIENoZWNrIHRoYXQgYWxsIG5l ZWRlZCBhdHRyaWJ1dGVzIG9mIHRoZSByZWxhdGlvbiBhcmUgYXZhaWxhYmxlIGZyb20gdGhl CgkgKiBpbmRleC4KCSAqLwoKCS8qCgkgKiBGaXJzdCwgaWRlbnRpZnkgYWxsIHRoZSBhdHRy aWJ1dGVzIG5lZWRlZCBmb3Igam9pbnMgb3IgZmluYWwgb3V0cHV0LgoJICogTm90ZTogd2Ug bXVzdCBsb29rIGF0IHJlbCdzIHRhcmdldGxpc3QsIG5vdCB0aGUgYXR0cl9uZWVkZWQgZGF0 YSwKCSAqIGJlY2F1c2UgYXR0cl9uZWVkZWQgaXNuJ3QgY29tcHV0ZWQgZm9yIGluaGVyaXRh bmNlIGNoaWxkIHJlbHMuCgkgKi8KCXB1bGxfdmFyYXR0bm9zKChOb2RlICopIHJlbC0+cmVs dGFyZ2V0LT5leHBycywgcmVsLT5yZWxpZCwgJmF0dHJzX3VzZWQpOwoKCS8qCgkgKiBBZGQg YWxsIHRoZSBhdHRyaWJ1dGVzIHVzZWQgYnkgcmVzdHJpY3Rpb24gY2xhdXNlczsgYnV0IGNv bnNpZGVyIG9ubHkKCSAqIHRob3NlIGNsYXVzZXMgbm90IGltcGxpZWQgYnkgdGhlIGluZGV4 IHByZWRpY2F0ZSwgc2luY2Ugb25lcyB0aGF0IGFyZQoJICogc28gaW1wbGllZCBkb24ndCBu ZWVkIHRvIGJlIGNoZWNrZWQgZXhwbGljaXRseSBpbiB0aGUgcGxhbi4KCSAqCgkgKiBOb3Rl OiBhdHRyaWJ1dGVzIHVzZWQgb25seSBpbiBpbmRleCBxdWFscyB3b3VsZCBub3QgYmUgbmVl ZGVkIGF0CgkgKiBydW50aW1lIGVpdGhlciwgaWYgd2UgYXJlIGNlcnRhaW4gdGhhdCB0aGUg aW5kZXggaXMgbm90IGxvc3N5LiAgSG93ZXZlcgoJICogaXQnZCBiZSBjb21wbGljYXRlZCB0 byBhY2NvdW50IGZvciB0aGF0IGFjY3VyYXRlbHksIGFuZCBpdCBkb2Vzbid0CgkgKiBtYXR0 ZXIgaW4gbW9zdCBjYXNlcywgc2luY2Ugd2UnZCBjb25jbHVkZSB0aGF0IHN1Y2ggYXR0cmli dXRlcyBhcmUKCSAqIGF2YWlsYWJsZSBmcm9tIHRoZSBpbmRleCBhbnl3YXkuCgkgKi8KCWZv cmVhY2gobGMsIGluZGV4LT5pbmRyZXN0cmljdGluZm8pCgl7CgkJUmVzdHJpY3RJbmZvICpy aW5mbyA9IChSZXN0cmljdEluZm8gKikgbGZpcnN0KGxjKTsKCgkJcHVsbF92YXJhdHRub3Mo KE5vZGUgKikgcmluZm8tPmNsYXVzZSwgcmVsLT5yZWxpZCwgJmF0dHJzX3VzZWQpOwoJfQoK CS8qCgkgKiBDb25zdHJ1Y3QgYSBiaXRtYXBzZXQgb2YgY29sdW1ucyB0aGF0IHRoZSBpbmRl eCBjYW4gcmV0dXJuIGJhY2sgaW4gYW4KCSAqIGluZGV4LW9ubHkgc2Nhbi4KCSAqLwoJZm9y IChpID0gMDsgaSA8IGluZGV4LT5uY29sdW1uczsgaSsrKQoJewoJCWludAkJCWF0dG5vID0g aW5kZXgtPmluZGV4a2V5c1tpXTsKCgkJLyoKCQkgKiBGb3IgdGhlIG1vbWVudCwgd2UganVz dCBpZ25vcmUgaW5kZXggZXhwcmVzc2lvbnMuICBJdCBtaWdodCBiZSBuaWNlCgkJICogdG8g ZG8gc29tZXRoaW5nIHdpdGggdGhlbSwgbGF0ZXIuCgkJICovCgkJaWYgKGF0dG5vID09IDAp CgkJCWNvbnRpbnVlOwoKCQlpZiAoaW5kZXgtPmNhbnJldHVybltpXSkKCQkJaW5kZXhfY2Fu cmV0dXJuX2F0dHJzID0KCQkJCWJtc19hZGRfbWVtYmVyKGluZGV4X2NhbnJldHVybl9hdHRy cywKCQkJCQkJCSAgIGF0dG5vIC0gRmlyc3RMb3dJbnZhbGlkSGVhcEF0dHJpYnV0ZU51bWJl cik7Cgl9CgoJLyogRG8gd2UgaGF2ZSBhbGwgdGhlIG5lY2Vzc2FyeSBhdHRyaWJ1dGVzPyAq LwoJcmVzdWx0ID0gYm1zX2lzX3N1YnNldChhdHRyc191c2VkLCBpbmRleF9jYW5yZXR1cm5f YXR0cnMpOwoKCWJtc19mcmVlKGF0dHJzX3VzZWQpOwoJYm1zX2ZyZWUoaW5kZXhfY2FucmV0 dXJuX2F0dHJzKTsKCglyZXR1cm4gcmVzdWx0Owp9CgovKgogKiBnZXRfbG9vcF9jb3VudAog KgkJQ2hvb3NlIHRoZSBsb29wIGNvdW50IGVzdGltYXRlIHRvIHVzZSBmb3IgY29zdGluZyBh IHBhcmFtZXRlcml6ZWQgcGF0aAogKgkJd2l0aCB0aGUgZ2l2ZW4gc2V0IG9mIG91dGVyIHJl bGlkcy4KICoKICogU2luY2Ugd2UgcHJvZHVjZSBwYXJhbWV0ZXJpemVkIHBhdGhzIGJlZm9y ZSB3ZSd2ZSBiZWd1biB0byBnZW5lcmF0ZSBqb2luCiAqIHJlbGF0aW9ucywgaXQncyBpbXBv c3NpYmxlIHRvIHByZWRpY3QgZXhhY3RseSBob3cgbWFueSB0aW1lcyBhIHBhcmFtZXRlcml6 ZWQKICogcGF0aCB3aWxsIGJlIGl0ZXJhdGVkOyB3ZSBkb24ndCBrbm93IHRoZSBzaXplIG9m IHRoZSByZWxhdGlvbiB0aGF0IHdpbGwgYmUKICogb24gdGhlIG91dHNpZGUgb2YgdGhlIG5l c3Rsb29wLiAgSG93ZXZlciwgd2Ugc2hvdWxkIHRyeSB0byBhY2NvdW50IGZvcgogKiBtdWx0 aXBsZSBpdGVyYXRpb25zIHNvbWVob3cgaW4gY29zdGluZyB0aGUgcGF0aC4gIFRoZSBoZXVy aXN0aWMgZW1ib2RpZWQKICogaGVyZSBpcyB0byB1c2UgdGhlIHJvd2NvdW50IG9mIHRoZSBz bWFsbGVzdCBvdGhlciBiYXNlIHJlbGF0aW9uIG5lZWRlZCBpbgogKiB0aGUgam9pbiBjbGF1 c2VzIHVzZWQgYnkgdGhlIHBhdGguICAoV2UgY291bGQgYWx0ZXJuYXRpdmVseSBjb25zaWRl ciB0aGUKICogbGFyZ2VzdCBvbmUsIGJ1dCB0aGF0IHNlZW1zIHRvbyBvcHRpbWlzdGljLikg IFRoaXMgaXMgb2YgY291cnNlIHRoZSByaWdodAogKiBhbnN3ZXIgZm9yIHNpbmdsZS1vdGhl ci1yZWxhdGlvbiBjYXNlcywgYW5kIGl0IHNlZW1zIGxpa2UgYSByZWFzb25hYmxlCiAqIHpl cm8tb3JkZXIgYXBwcm94aW1hdGlvbiBmb3IgbXVsdGl3YXktam9pbiBjYXNlcy4KICoKICog SW4gYWRkaXRpb24sIHdlIGNoZWNrIHRvIHNlZSBpZiB0aGUgb3RoZXIgc2lkZSBvZiBlYWNo IGpvaW4gY2xhdXNlIGlzIG9uCiAqIHRoZSBpbnNpZGUgb2Ygc29tZSBzZW1pam9pbiB0aGF0 IHRoZSBjdXJyZW50IHJlbGF0aW9uIGlzIG9uIHRoZSBvdXRzaWRlIG9mLgogKiBJZiBzbywg dGhlIG9ubHkgd2F5IHRoYXQgYSBwYXJhbWV0ZXJpemVkIHBhdGggY291bGQgYmUgdXNlZCBp cyBpZiB0aGUKICogc2VtaWpvaW4gUkhTIGhhcyBiZWVuIHVuaXF1ZS1pZmllZCwgc28gd2Ug c2hvdWxkIHVzZSB0aGUgbnVtYmVyIG9mIHVuaXF1ZQogKiBSSFMgcm93cyByYXRoZXIgdGhh biB1c2luZyB0aGUgcmVsYXRpb24ncyByYXcgcm93Y291bnQuCiAqCiAqIE5vdGU6IGZvciB0 aGlzIHRvIHdvcmssIGFsbHBhdGhzLmMgbXVzdCBlc3RhYmxpc2ggYWxsIGJhc2VyZWwgc2l6 ZQogKiBlc3RpbWF0ZXMgYmVmb3JlIGl0IGJlZ2lucyB0byBjb21wdXRlIHBhdGhzLCBvciBh dCBsZWFzdCBiZWZvcmUgaXQKICogY2FsbHMgY3JlYXRlX2luZGV4X3BhdGhzKCkuCiAqLwpz dGF0aWMgZG91YmxlCmdldF9sb29wX2NvdW50KFBsYW5uZXJJbmZvICpyb290LCBJbmRleCBj dXJfcmVsaWQsIFJlbGlkcyBvdXRlcl9yZWxpZHMpCnsKCWRvdWJsZQkJcmVzdWx0OwoJaW50 CQkJb3V0ZXJfcmVsaWQ7CgoJLyogRm9yIGEgbm9uLXBhcmFtZXRlcml6ZWQgcGF0aCwganVz dCByZXR1cm4gMS4wIHF1aWNrbHkgKi8KCWlmIChvdXRlcl9yZWxpZHMgPT0gTlVMTCkKCQly ZXR1cm4gMS4wOwoKCXJlc3VsdCA9IDAuMDsKCW91dGVyX3JlbGlkID0gLTE7Cgl3aGlsZSAo KG91dGVyX3JlbGlkID0gYm1zX25leHRfbWVtYmVyKG91dGVyX3JlbGlkcywgb3V0ZXJfcmVs aWQpKSA+PSAwKQoJewoJCVJlbE9wdEluZm8gKm91dGVyX3JlbDsKCQlkb3VibGUJCXJvd2Nv dW50OwoKCQkvKiBQYXJhbm9pYTogaWdub3JlIGJvZ3VzIHJlbGlkIGluZGV4ZXMgKi8KCQlp ZiAob3V0ZXJfcmVsaWQgPj0gcm9vdC0+c2ltcGxlX3JlbF9hcnJheV9zaXplKQoJCQljb250 aW51ZTsKCQlvdXRlcl9yZWwgPSByb290LT5zaW1wbGVfcmVsX2FycmF5W291dGVyX3JlbGlk XTsKCQlpZiAob3V0ZXJfcmVsID09IE5VTEwpCgkJCWNvbnRpbnVlOwoJCUFzc2VydChvdXRl cl9yZWwtPnJlbGlkID09IG91dGVyX3JlbGlkKTsJLyogc2FuaXR5IGNoZWNrIG9uIGFycmF5 ICovCgoJCS8qIE90aGVyIHJlbGF0aW9uIGNvdWxkIGJlIHByb3ZlbiBlbXB0eSwgaWYgc28g aWdub3JlICovCgkJaWYgKElTX0RVTU1ZX1JFTChvdXRlcl9yZWwpKQoJCQljb250aW51ZTsK CgkJLyogT3RoZXJ3aXNlLCByZWwncyByb3dzIGVzdGltYXRlIHNob3VsZCBiZSB2YWxpZCBi eSBub3cgKi8KCQlBc3NlcnQob3V0ZXJfcmVsLT5yb3dzID4gMCk7CgoJCS8qIENoZWNrIHRv IHNlZSBpZiByZWwgaXMgb24gdGhlIGluc2lkZSBvZiBhbnkgc2VtaWpvaW5zICovCgkJcm93 Y291bnQgPSBhZGp1c3Rfcm93Y291bnRfZm9yX3NlbWlqb2lucyhyb290LAoJCQkJCQkJCQkJ CQkgY3VyX3JlbGlkLAoJCQkJCQkJCQkJCQkgb3V0ZXJfcmVsaWQsCgkJCQkJCQkJCQkJCSBv dXRlcl9yZWwtPnJvd3MpOwoKCQkvKiBSZW1lbWJlciBzbWFsbGVzdCByb3cgY291bnQgZXN0 aW1hdGUgYW1vbmcgdGhlIG91dGVyIHJlbHMgKi8KCQlpZiAocmVzdWx0ID09IDAuMCB8fCBy ZXN1bHQgPiByb3djb3VudCkKCQkJcmVzdWx0ID0gcm93Y291bnQ7Cgl9CgkvKiBSZXR1cm4g MS4wIGlmIHdlIGZvdW5kIG5vIHZhbGlkIHJlbGF0aW9ucyAoc2hvdWxkbid0IGhhcHBlbikg Ki8KCXJldHVybiAocmVzdWx0ID4gMC4wKSA/IHJlc3VsdCA6IDEuMDsKfQoKLyoKICogQ2hl Y2sgdG8gc2VlIGlmIG91dGVyX3JlbGlkIGlzIG9uIHRoZSBpbnNpZGUgb2YgYW55IHNlbWlq b2luIHRoYXQgY3VyX3JlbGlkCiAqIGlzIG9uIHRoZSBvdXRzaWRlIG9mLiAgSWYgc28sIHJl cGxhY2Ugcm93Y291bnQgd2l0aCB0aGUgZXN0aW1hdGVkIG51bWJlciBvZgogKiB1bmlxdWUg cm93cyBmcm9tIHRoZSBzZW1pam9pbiBSSFMgKGFzc3VtaW5nIHRoYXQncyBzbWFsbGVyLCB3 aGljaCBpdCBtaWdodAogKiBub3QgYmUpLiAgVGhlIGVzdGltYXRlIGlzIGNydWRlIGJ1dCBp dCdzIHRoZSBiZXN0IHdlIGNhbiBkbyBhdCB0aGlzIHN0YWdlCiAqIG9mIHRoZSBwcm9jZWVk aW5ncy4KICovCnN0YXRpYyBkb3VibGUKYWRqdXN0X3Jvd2NvdW50X2Zvcl9zZW1pam9pbnMo UGxhbm5lckluZm8gKnJvb3QsCgkJCQkJCQkgIEluZGV4IGN1cl9yZWxpZCwKCQkJCQkJCSAg SW5kZXggb3V0ZXJfcmVsaWQsCgkJCQkJCQkgIGRvdWJsZSByb3djb3VudCkKewoJTGlzdENl bGwgICAqbGM7CgoJZm9yZWFjaChsYywgcm9vdC0+am9pbl9pbmZvX2xpc3QpCgl7CgkJU3Bl Y2lhbEpvaW5JbmZvICpzamluZm8gPSAoU3BlY2lhbEpvaW5JbmZvICopIGxmaXJzdChsYyk7 CgoJCWlmIChzamluZm8tPmpvaW50eXBlID09IEpPSU5fU0VNSSAmJgoJCQlibXNfaXNfbWVt YmVyKGN1cl9yZWxpZCwgc2ppbmZvLT5zeW5fbGVmdGhhbmQpICYmCgkJCWJtc19pc19tZW1i ZXIob3V0ZXJfcmVsaWQsIHNqaW5mby0+c3luX3JpZ2h0aGFuZCkpCgkJewoJCQkvKiBFc3Rp bWF0ZSBudW1iZXIgb2YgdW5pcXVlLWlmaWVkIHJvd3MgKi8KCQkJZG91YmxlCQlucmF3OwoJ CQlkb3VibGUJCW51bmlxdWU7CgoJCQlucmF3ID0gYXBwcm94aW1hdGVfam9pbnJlbF9zaXpl KHJvb3QsIHNqaW5mby0+c3luX3JpZ2h0aGFuZCk7CgkJCW51bmlxdWUgPSBlc3RpbWF0ZV9u dW1fZ3JvdXBzKHJvb3QsCgkJCQkJCQkJCQkgIHNqaW5mby0+c2VtaV9yaHNfZXhwcnMsCgkJ CQkJCQkJCQkgIG5yYXcsCgkJCQkJCQkJCQkgIE5VTEwsCgkJCQkJCQkJCQkgIE5VTEwpOwoJ CQlpZiAocm93Y291bnQgPiBudW5pcXVlKQoJCQkJcm93Y291bnQgPSBudW5pcXVlOwoJCX0K CX0KCXJldHVybiByb3djb3VudDsKfQoKLyoKICogTWFrZSBhbiBhcHByb3hpbWF0ZSBlc3Rp bWF0ZSBvZiB0aGUgc2l6ZSBvZiBhIGpvaW5yZWwuCiAqCiAqIFdlIGRvbid0IGhhdmUgZW5v dWdoIGluZm8gYXQgdGhpcyBwb2ludCB0byBnZXQgYSBnb29kIGVzdGltYXRlLCBzbyB3ZQog KiBqdXN0IG11bHRpcGx5IHRoZSBiYXNlIHJlbGF0aW9uIHNpemVzIHRvZ2V0aGVyLiAgRm9y dHVuYXRlbHksIHRoaXMgaXMKICogdGhlIHJpZ2h0IGFuc3dlciBhbnl3YXkgZm9yIHRoZSBt b3N0IGNvbW1vbiBjYXNlIHdpdGggYSBzaW5nbGUgcmVsYXRpb24KICogb24gdGhlIFJIUyBv ZiBhIHNlbWlqb2luLiAgQWxzbywgZXN0aW1hdGVfbnVtX2dyb3VwcygpIGhhcyBvbmx5IGEg d2VhawogKiBkZXBlbmRlbmN5IG9uIGl0cyBpbnB1dF9yb3dzIGFyZ3VtZW50IChpdCBiYXNp Y2FsbHkgdXNlcyBpdCBhcyBhIGNsYW1wKS4KICogU28gd2UgbWlnaHQgYmUgYWJsZSB0byBn ZXQgYSBmYWlybHkgZGVjZW50IGVuZCByZXN1bHQgZXZlbiB3aXRoIGEgc2V2ZXJlCiAqIG92 ZXJlc3RpbWF0ZSBvZiB0aGUgUkhTJ3MgcmF3IHNpemUuCiAqLwpzdGF0aWMgZG91YmxlCmFw cHJveGltYXRlX2pvaW5yZWxfc2l6ZShQbGFubmVySW5mbyAqcm9vdCwgUmVsaWRzIHJlbGlk cykKewoJZG91YmxlCQlyb3djb3VudCA9IDEuMDsKCWludAkJCXJlbGlkOwoKCXJlbGlkID0g LTE7Cgl3aGlsZSAoKHJlbGlkID0gYm1zX25leHRfbWVtYmVyKHJlbGlkcywgcmVsaWQpKSA+ PSAwKQoJewoJCVJlbE9wdEluZm8gKnJlbDsKCgkJLyogUGFyYW5vaWE6IGlnbm9yZSBib2d1 cyByZWxpZCBpbmRleGVzICovCgkJaWYgKHJlbGlkID49IHJvb3QtPnNpbXBsZV9yZWxfYXJy YXlfc2l6ZSkKCQkJY29udGludWU7CgkJcmVsID0gcm9vdC0+c2ltcGxlX3JlbF9hcnJheVty ZWxpZF07CgkJaWYgKHJlbCA9PSBOVUxMKQoJCQljb250aW51ZTsKCQlBc3NlcnQocmVsLT5y ZWxpZCA9PSByZWxpZCk7CS8qIHNhbml0eSBjaGVjayBvbiBhcnJheSAqLwoKCQkvKiBSZWxh dGlvbiBjb3VsZCBiZSBwcm92ZW4gZW1wdHksIGlmIHNvIGlnbm9yZSAqLwoJCWlmIChJU19E VU1NWV9SRUwocmVsKSkKCQkJY29udGludWU7CgoJCS8qIE90aGVyd2lzZSwgcmVsJ3Mgcm93 cyBlc3RpbWF0ZSBzaG91bGQgYmUgdmFsaWQgYnkgbm93ICovCgkJQXNzZXJ0KHJlbC0+cm93 cyA+IDApOwoKCQkvKiBBY2N1bXVsYXRlIHByb2R1Y3QgKi8KCQlyb3djb3VudCAqPSByZWwt PnJvd3M7Cgl9CglyZXR1cm4gcm93Y291bnQ7Cn0KCgovKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KgogKgkJCQktLS0tICBST1VUSU5FUyBUTyBDSEVDSyBRVUVSWSBDTEFVU0VTICAtLS0tCiAq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqLwoKLyoKICogbWF0Y2hfcmVzdHJpY3Rpb25fY2xhdXNl c190b19pbmRleAogKgkgIElkZW50aWZ5IHJlc3RyaWN0aW9uIGNsYXVzZXMgZm9yIHRoZSBy ZWwgdGhhdCBtYXRjaCB0aGUgaW5kZXguCiAqCSAgTWF0Y2hpbmcgY2xhdXNlcyBhcmUgYWRk ZWQgdG8gKmNsYXVzZXNldC4KICovCnN0YXRpYyB2b2lkCm1hdGNoX3Jlc3RyaWN0aW9uX2Ns YXVzZXNfdG9faW5kZXgoUGxhbm5lckluZm8gKnJvb3QsCgkJCQkJCQkJICAgSW5kZXhPcHRJ bmZvICppbmRleCwKCQkJCQkJCQkgICBJbmRleENsYXVzZVNldCAqY2xhdXNlc2V0KQp7Cgkv KiBXZSBjYW4gaWdub3JlIGNsYXVzZXMgdGhhdCBhcmUgaW1wbGllZCBieSB0aGUgaW5kZXgg cHJlZGljYXRlICovCgltYXRjaF9jbGF1c2VzX3RvX2luZGV4KHJvb3QsIGluZGV4LT5pbmRy ZXN0cmljdGluZm8sIGluZGV4LCBjbGF1c2VzZXQpOwp9CgovKgogKiBtYXRjaF9qb2luX2Ns YXVzZXNfdG9faW5kZXgKICoJICBJZGVudGlmeSBqb2luIGNsYXVzZXMgZm9yIHRoZSByZWwg dGhhdCBtYXRjaCB0aGUgaW5kZXguCiAqCSAgTWF0Y2hpbmcgY2xhdXNlcyBhcmUgYWRkZWQg dG8gKmNsYXVzZXNldC4KICoJICBBbHNvLCBhZGQgYW55IHBvdGVudGlhbGx5IHVzYWJsZSBq b2luIE9SIGNsYXVzZXMgdG8gKmpvaW5vcmNsYXVzZXMuCiAqCSAgVGhleSBhbHNvIG1pZ2h0 IGJlIHByb2Nlc3NlZCBieSBtYXRjaF9jbGF1c2VfdG9faW5kZXgoKSBhcyBhIHdob2xlLgog Ki8Kc3RhdGljIHZvaWQKbWF0Y2hfam9pbl9jbGF1c2VzX3RvX2luZGV4KFBsYW5uZXJJbmZv ICpyb290LAoJCQkJCQkJUmVsT3B0SW5mbyAqcmVsLCBJbmRleE9wdEluZm8gKmluZGV4LAoJ CQkJCQkJSW5kZXhDbGF1c2VTZXQgKmNsYXVzZXNldCwKCQkJCQkJCUxpc3QgKipqb2lub3Jj bGF1c2VzKQp7CglMaXN0Q2VsbCAgICpsYzsKCgkvKiBTY2FuIHRoZSByZWwncyBqb2luIGNs YXVzZXMgKi8KCWZvcmVhY2gobGMsIHJlbC0+am9pbmluZm8pCgl7CgkJUmVzdHJpY3RJbmZv ICpyaW5mbyA9IChSZXN0cmljdEluZm8gKikgbGZpcnN0KGxjKTsKCgkJLyogQ2hlY2sgaWYg Y2xhdXNlIGNhbiBiZSBtb3ZlZCB0byB0aGlzIHJlbCAqLwoJCWlmICgham9pbl9jbGF1c2Vf aXNfbW92YWJsZV90byhyaW5mbywgcmVsKSkKCQkJY29udGludWU7CgoJCS8qCgkJICogUG90 ZW50aWFsbHkgdXNhYmxlLCBzbyBzZWUgaWYgaXQgbWF0Y2hlcyB0aGUgaW5kZXggb3IgaXMg YW4gT1IuIFVzZQoJCSAqIGxpc3RfYXBwZW5kX3VuaXF1ZV9wdHIoKSBoZXJlIHRvIGF2b2lk IHBvc3NpYmxlIGR1cGxpY2F0ZXMgd2hlbgoJCSAqIHByb2Nlc3NpbmcgdGhlIHNhbWUgY2xh dXNlcyB3aXRoIGRpZmZlcmVudCBpbmRleGVzLgoJCSAqLwoJCWlmIChyZXN0cmljdGlvbl9p c19vcl9jbGF1c2UocmluZm8pKQoJCQkqam9pbm9yY2xhdXNlcyA9IGxpc3RfYXBwZW5kX3Vu aXF1ZV9wdHIoKmpvaW5vcmNsYXVzZXMsIHJpbmZvKTsKCgkJbWF0Y2hfY2xhdXNlX3RvX2lu ZGV4KHJvb3QsIHJpbmZvLCBpbmRleCwgY2xhdXNlc2V0KTsKCX0KfQoKLyoKICogbWF0Y2hf ZWNsYXNzX2NsYXVzZXNfdG9faW5kZXgKICoJICBJZGVudGlmeSBFcXVpdmFsZW5jZUNsYXNz IGpvaW4gY2xhdXNlcyBmb3IgdGhlIHJlbCB0aGF0IG1hdGNoIHRoZSBpbmRleC4KICoJICBN YXRjaGluZyBjbGF1c2VzIGFyZSBhZGRlZCB0byAqY2xhdXNlc2V0LgogKi8Kc3RhdGljIHZv aWQKbWF0Y2hfZWNsYXNzX2NsYXVzZXNfdG9faW5kZXgoUGxhbm5lckluZm8gKnJvb3QsIElu ZGV4T3B0SW5mbyAqaW5kZXgsCgkJCQkJCQkgIEluZGV4Q2xhdXNlU2V0ICpjbGF1c2VzZXQp CnsKCWludAkJCWluZGV4Y29sOwoKCS8qIE5vIHdvcmsgaWYgcmVsIGlzIG5vdCBpbiBhbnkg c3VjaCBFQ3MgKi8KCWlmICghaW5kZXgtPnJlbC0+aGFzX2VjbGFzc19qb2lucykKCQlyZXR1 cm47CgoJZm9yIChpbmRleGNvbCA9IDA7IGluZGV4Y29sIDwgaW5kZXgtPm5rZXljb2x1bW5z OyBpbmRleGNvbCsrKQoJewoJCWVjX21lbWJlcl9tYXRjaGVzX2FyZyBhcmc7CgkJTGlzdAkg ICAqY2xhdXNlczsKCgkJLyogR2VuZXJhdGUgY2xhdXNlcywgc2tpcHBpbmcgYW55IHRoYXQg am9pbiB0byBsYXRlcmFsX3JlZmVyZW5jZXJzICovCgkJYXJnLmluZGV4ID0gaW5kZXg7CgkJ YXJnLmluZGV4Y29sID0gaW5kZXhjb2w7CgkJY2xhdXNlcyA9IGdlbmVyYXRlX2ltcGxpZWRf ZXF1YWxpdGllc19mb3JfY29sdW1uKHJvb3QsCgkJCQkJCQkJCQkJCQkJIGluZGV4LT5yZWws CgkJCQkJCQkJCQkJCQkJIGVjX21lbWJlcl9tYXRjaGVzX2luZGV4Y29sLAoJCQkJCQkJCQkJ CQkJCSAmYXJnLAoJCQkJCQkJCQkJCQkJCSBpbmRleC0+cmVsLT5sYXRlcmFsX3JlZmVyZW5j ZXJzKTsKCgkJLyoKCQkgKiBXZSBoYXZlIHRvIGNoZWNrIHdoZXRoZXIgdGhlIHJlc3VsdHMg YWN0dWFsbHkgZG8gbWF0Y2ggdGhlIGluZGV4LAoJCSAqIHNpbmNlIGZvciBub24tYnRyZWUg aW5kZXhlcyB0aGUgRUMncyBlcXVhbGl0eSBvcGVyYXRvcnMgbWlnaHQgbm90CgkJICogYmUg aW4gdGhlIGluZGV4IG9wY2xhc3MgKGNmIGVjX21lbWJlcl9tYXRjaGVzX2luZGV4Y29sKS4K CQkgKi8KCQltYXRjaF9jbGF1c2VzX3RvX2luZGV4KHJvb3QsIGNsYXVzZXMsIGluZGV4LCBj bGF1c2VzZXQpOwoJfQp9CgovKgogKiBtYXRjaF9jbGF1c2VzX3RvX2luZGV4CiAqCSAgUGVy Zm9ybSBtYXRjaF9jbGF1c2VfdG9faW5kZXgoKSBmb3IgZWFjaCBjbGF1c2UgaW4gYSBsaXN0 LgogKgkgIE1hdGNoaW5nIGNsYXVzZXMgYXJlIGFkZGVkIHRvICpjbGF1c2VzZXQuCiAqLwpz dGF0aWMgdm9pZAptYXRjaF9jbGF1c2VzX3RvX2luZGV4KFBsYW5uZXJJbmZvICpyb290LAoJ CQkJCSAgIExpc3QgKmNsYXVzZXMsCgkJCQkJICAgSW5kZXhPcHRJbmZvICppbmRleCwKCQkJ CQkgICBJbmRleENsYXVzZVNldCAqY2xhdXNlc2V0KQp7CglMaXN0Q2VsbCAgICpsYzsKCglm b3JlYWNoKGxjLCBjbGF1c2VzKQoJewoJCVJlc3RyaWN0SW5mbyAqcmluZm8gPSBsZmlyc3Rf bm9kZShSZXN0cmljdEluZm8sIGxjKTsKCgkJbWF0Y2hfY2xhdXNlX3RvX2luZGV4KHJvb3Qs IHJpbmZvLCBpbmRleCwgY2xhdXNlc2V0KTsKCX0KfQoKLyoKICogbWF0Y2hfY2xhdXNlX3Rv X2luZGV4CiAqCSAgVGVzdCB3aGV0aGVyIGEgcXVhbCBjbGF1c2UgY2FuIGJlIHVzZWQgd2l0 aCBhbiBpbmRleC4KICoKICogSWYgdGhlIGNsYXVzZSBpcyB1c2FibGUsIGFkZCBhbiBJbmRl eENsYXVzZSBlbnRyeSBmb3IgaXQgdG8gdGhlIGFwcHJvcHJpYXRlCiAqIGxpc3QgaW4gKmNs YXVzZXNldC4gICgqY2xhdXNlc2V0IG11c3QgYmUgaW5pdGlhbGl6ZWQgdG8gemVyb2VzIGJl Zm9yZSBmaXJzdAogKiBjYWxsLikKICoKICogTm90ZTogaW4gc29tZSBjaXJjdW1zdGFuY2Vz IHdlIG1heSBmaW5kIHRoZSBzYW1lIFJlc3RyaWN0SW5mb3MgY29taW5nIGZyb20KICogbXVs dGlwbGUgcGxhY2VzLiAgRGVmZW5kIGFnYWluc3QgcmVkdW5kYW50IG91dHB1dHMgYnkgcmVm dXNpbmcgdG8gYWRkIGEKICogY2xhdXNlIHR3aWNlIChwb2ludGVyIGVxdWFsaXR5IHNob3Vs ZCBiZSBhIGdvb2QgZW5vdWdoIGNoZWNrIGZvciB0aGlzKS4KICoKICogTm90ZTogaXQncyBw b3NzaWJsZSB0aGF0IGEgYmFkbHktZGVmaW5lZCBpbmRleCBjb3VsZCBoYXZlIG11bHRpcGxl IG1hdGNoaW5nCiAqIGNvbHVtbnMuICBXZSBhbHdheXMgc2VsZWN0IHRoZSBmaXJzdCBtYXRj aCBpZiBzbzsgdGhpcyBhdm9pZHMgc2NlbmFyaW9zCiAqIHdoZXJlaW4gd2UgZ2V0IGFuIGlu ZmxhdGVkIGlkZWEgb2YgdGhlIGluZGV4J3Mgc2VsZWN0aXZpdHkgYnkgdXNpbmcgdGhlCiAq IHNhbWUgY2xhdXNlIG11bHRpcGxlIHRpbWVzIHdpdGggZGlmZmVyZW50IGluZGV4IGNvbHVt bnMuCiAqLwpzdGF0aWMgdm9pZAptYXRjaF9jbGF1c2VfdG9faW5kZXgoUGxhbm5lckluZm8g KnJvb3QsCgkJCQkJICBSZXN0cmljdEluZm8gKnJpbmZvLAoJCQkJCSAgSW5kZXhPcHRJbmZv ICppbmRleCwKCQkJCQkgIEluZGV4Q2xhdXNlU2V0ICpjbGF1c2VzZXQpCnsKCWludAkJCWlu ZGV4Y29sOwoKCS8qCgkgKiBOZXZlciBtYXRjaCBwc2V1ZG9jb25zdGFudHMgdG8gaW5kZXhl cy4gIChOb3JtYWxseSBhIG1hdGNoIGNvdWxkIG5vdAoJICogaGFwcGVuIGFueXdheSwgc2lu Y2UgYSBwc2V1ZG9jb25zdGFudCBjbGF1c2UgY291bGRuJ3QgY29udGFpbiBhIFZhciwKCSAq IGJ1dCB3aGF0IGlmIHNvbWVvbmUgYnVpbGRzIGFuIGV4cHJlc3Npb24gaW5kZXggb24gYSBj b25zdGFudD8gSXQncyBub3QKCSAqIHRvdGFsbHkgdW5yZWFzb25hYmxlIHRvIGRvIHNvIHdp dGggYSBwYXJ0aWFsIGluZGV4LCBlaXRoZXIuKQoJICovCglpZiAocmluZm8tPnBzZXVkb2Nv bnN0YW50KQoJCXJldHVybjsKCgkvKgoJICogSWYgY2xhdXNlIGNhbid0IGJlIHVzZWQgYXMg YW4gaW5kZXhxdWFsIGJlY2F1c2UgaXQgbXVzdCB3YWl0IHRpbGwgYWZ0ZXIKCSAqIHNvbWUg bG93ZXItc2VjdXJpdHktbGV2ZWwgcmVzdHJpY3Rpb24gY2xhdXNlLCByZWplY3QgaXQuCgkg Ki8KCWlmICghcmVzdHJpY3Rpb25faXNfc2VjdXJlbHlfcHJvbW90YWJsZShyaW5mbywgaW5k ZXgtPnJlbCkpCgkJcmV0dXJuOwoKCS8qIE9LLCBjaGVjayBlYWNoIGluZGV4IGtleSBjb2x1 bW4gZm9yIGEgbWF0Y2ggKi8KCWZvciAoaW5kZXhjb2wgPSAwOyBpbmRleGNvbCA8IGluZGV4 LT5ua2V5Y29sdW1uczsgaW5kZXhjb2wrKykKCXsKCQlJbmRleENsYXVzZSAqaWNsYXVzZTsK CQlMaXN0Q2VsbCAgICpsYzsKCgkJLyogSWdub3JlIGR1cGxpY2F0ZXMgKi8KCQlmb3JlYWNo KGxjLCBjbGF1c2VzZXQtPmluZGV4Y2xhdXNlc1tpbmRleGNvbF0pCgkJewoJCQlpY2xhdXNl ID0gKEluZGV4Q2xhdXNlICopIGxmaXJzdChsYyk7CgoJCQlpZiAoaWNsYXVzZS0+cmluZm8g PT0gcmluZm8pCgkJCQlyZXR1cm47CgkJfQoKCQkvKiBPSywgdHJ5IHRvIG1hdGNoIHRoZSBj bGF1c2UgdG8gdGhlIGluZGV4IGNvbHVtbiAqLwoJCWljbGF1c2UgPSBtYXRjaF9jbGF1c2Vf dG9faW5kZXhjb2wocm9vdCwKCQkJCQkJCQkJCSAgIHJpbmZvLAoJCQkJCQkJCQkJICAgaW5k ZXhjb2wsCgkJCQkJCQkJCQkgICBpbmRleCk7CgkJaWYgKGljbGF1c2UpCgkJewoJCQkvKiBT dWNjZXNzLCBzbyByZWNvcmQgaXQgKi8KCQkJY2xhdXNlc2V0LT5pbmRleGNsYXVzZXNbaW5k ZXhjb2xdID0KCQkJCWxhcHBlbmQoY2xhdXNlc2V0LT5pbmRleGNsYXVzZXNbaW5kZXhjb2xd LCBpY2xhdXNlKTsKCQkJY2xhdXNlc2V0LT5ub25lbXB0eSA9IHRydWU7CgkJCXJldHVybjsK CQl9Cgl9Cn0KCi8qCiAqIG1hdGNoX2NsYXVzZV90b19pbmRleGNvbCgpCiAqCSAgRGV0ZXJt aW5lIHdoZXRoZXIgYSByZXN0cmljdGlvbiBjbGF1c2UgbWF0Y2hlcyBhIGNvbHVtbiBvZiBh biBpbmRleCwKICoJICBhbmQgaWYgc28sIGJ1aWxkIGFuIEluZGV4Q2xhdXNlIG5vZGUgZGVz Y3JpYmluZyB0aGUgZGV0YWlscy4KICoKICoJICBUbyBtYXRjaCBhbiBpbmRleCBub3JtYWxs eSwgYW4gb3BlcmF0b3IgY2xhdXNlOgogKgogKgkgICgxKSAgbXVzdCBiZSBpbiB0aGUgZm9y bSAoaW5kZXhrZXkgb3AgY29uc3QpIG9yIChjb25zdCBvcCBpbmRleGtleSk7CiAqCQkgICBh bmQKICoJICAoMikgIG11c3QgY29udGFpbiBhbiBvcGVyYXRvciB3aGljaCBpcyBpbiB0aGUg aW5kZXgncyBvcGVyYXRvciBmYW1pbHkKICoJCSAgIGZvciB0aGlzIGNvbHVtbjsgYW5kCiAq CSAgKDMpICBtdXN0IG1hdGNoIHRoZSBjb2xsYXRpb24gb2YgdGhlIGluZGV4LCBpZiBjb2xs YXRpb24gaXMgcmVsZXZhbnQuCiAqCiAqCSAgT3VyIGRlZmluaXRpb24gb2YgImNvbnN0IiBp cyBleGNlZWRpbmdseSBsaWJlcmFsOiB3ZSBhbGxvdyBhbnl0aGluZyB0aGF0CiAqCSAgZG9l c24ndCBpbnZvbHZlIGEgdm9sYXRpbGUgZnVuY3Rpb24gb3IgYSBWYXIgb2YgdGhlIGluZGV4 J3MgcmVsYXRpb24uCiAqCSAgSW4gcGFydGljdWxhciwgVmFycyBiZWxvbmdpbmcgdG8gb3Ro ZXIgcmVsYXRpb25zIG9mIHRoZSBxdWVyeSBhcmUKICoJICBhY2NlcHRlZCBoZXJlLCBzaW5j ZSBhIGNsYXVzZSBvZiB0aGF0IGZvcm0gY2FuIGJlIHVzZWQgaW4gYQogKgkgIHBhcmFtZXRl cml6ZWQgaW5kZXhzY2FuLiAgSXQncyB0aGUgcmVzcG9uc2liaWxpdHkgb2YgaGlnaGVyIGNv ZGUgbGV2ZWxzCiAqCSAgdG8gbWFuYWdlIHJlc3RyaWN0aW9uIGFuZCBqb2luIGNsYXVzZXMg YXBwcm9wcmlhdGVseS4KICoKICoJICBOb3RlOiB3ZSBkbyBuZWVkIHRvIGNoZWNrIGZvciBW YXJzIG9mIHRoZSBpbmRleCdzIHJlbGF0aW9uIG9uIHRoZQogKgkgICJjb25zdCIgc2lkZSBv ZiB0aGUgY2xhdXNlLCBzaW5jZSBjbGF1c2VzIGxpa2UgKGEuZjEgT1AgKGIuZjIgT1AgYS5m MykpCiAqCSAgYXJlIG5vdCBwcm9jZXNzYWJsZSBieSBhIHBhcmFtZXRlcml6ZWQgaW5kZXhz Y2FuIG9uIGEuZjEsIHdoZXJlYXMKICoJICBzb21ldGhpbmcgbGlrZSAoYS5mMSBPUCAoYi5m MiBPUCBjLmYzKSkgaXMuCiAqCiAqCSAgUHJlc2VudGx5LCB0aGUgZXhlY3V0b3IgY2FuIG9u bHkgZGVhbCB3aXRoIGluZGV4cXVhbHMgdGhhdCBoYXZlIHRoZQogKgkgIGluZGV4a2V5IG9u IHRoZSBsZWZ0LCBzbyB3ZSBjYW4gb25seSB1c2UgY2xhdXNlcyB0aGF0IGhhdmUgdGhlIGlu ZGV4a2V5CiAqCSAgb24gdGhlIHJpZ2h0IGlmIHdlIGNhbiBjb21tdXRlIHRoZSBjbGF1c2Ug dG8gcHV0IHRoZSBrZXkgb24gdGhlIGxlZnQuCiAqCSAgV2UgaGFuZGxlIHRoYXQgYnkgZ2Vu ZXJhdGluZyBhbiBJbmRleENsYXVzZSB3aXRoIHRoZSBjb3JyZWN0bHktY29tbXV0ZWQKICoJ ICBvcGNsYXVzZSBhcyBhIGRlcml2ZWQgaW5kZXhxdWFsLgogKgogKgkgIElmIHRoZSBpbmRl eCBoYXMgYSBjb2xsYXRpb24sIHRoZSBjbGF1c2UgbXVzdCBoYXZlIHRoZSBzYW1lIGNvbGxh dGlvbi4KICoJICBGb3IgY29sbGF0aW9uLWxlc3MgaW5kZXhlcywgd2UgYXNzdW1lIGl0IGRv ZXNuJ3QgbWF0dGVyOyB0aGlzIGlzCiAqCSAgbmVjZXNzYXJ5IGZvciBjYXNlcyBsaWtlICJo c3RvcmUgPyB0ZXh0Iiwgd2hlcmVpbiBoc3RvcmUncyBvcGVyYXRvcnMKICoJICBkb24ndCBj YXJlIGFib3V0IGNvbGxhdGlvbiBidXQgdGhlIGNsYXVzZSB3aWxsIGdldCBtYXJrZWQgd2l0 aCBhCiAqCSAgY29sbGF0aW9uIGFueXdheSBiZWNhdXNlIG9mIHRoZSB0ZXh0IGFyZ3VtZW50 LiAgKFRoaXMgbG9naWMgaXMKICoJICBlbWJvZGllZCBpbiB0aGUgbWFjcm8gSW5kZXhDb2xs TWF0Y2hlc0V4cHJDb2xsLikKICoKICoJICBJdCBpcyBhbHNvIHBvc3NpYmxlIHRvIG1hdGNo IFJvd0NvbXBhcmVFeHByIGNsYXVzZXMgdG8gaW5kZXhlcyAoYnV0CiAqCSAgY3VycmVudGx5 LCBvbmx5IGJ0cmVlIGluZGV4ZXMgaGFuZGxlIHRoaXMpLgogKgogKgkgIEl0IGlzIGFsc28g cG9zc2libGUgdG8gbWF0Y2ggU2NhbGFyQXJyYXlPcEV4cHIgY2xhdXNlcyB0byBpbmRleGVz LCB3aGVuCiAqCSAgdGhlIGNsYXVzZSBpcyBvZiB0aGUgZm9ybSAiaW5kZXhrZXkgb3AgQU5Z IChhcnJheWNvbnN0KSIuCiAqCiAqCSAgSXQgaXMgYWxzbyBwb3NzaWJsZSB0byBtYXRjaCBh IGxpc3Qgb2YgT1IgY2xhdXNlcyBpZiBpdCBtaWdodCBiZQogKgkgIHRyYW5zZm9ybWVkIGlu dG8gYSBzaW5nbGUgU2NhbGFyQXJyYXlPcEV4cHIgY2xhdXNlLiAgT24gc3VjY2VzcywKICoJ ICB0aGUgcmV0dXJuaW5nIGluZGV4IGNsYXVzZSB3aWxsIGNvbnRhaW4gYSB0cmFuc2Zvcm1l ZCBjbGF1c2UuCiAqCiAqCSAgRm9yIGJvb2xlYW4gaW5kZXhlcywgaXQgaXMgYWxzbyBwb3Nz aWJsZSB0byBtYXRjaCB0aGUgY2xhdXNlIGRpcmVjdGx5CiAqCSAgdG8gdGhlIGluZGV4a2V5 OyBvciBwZXJoYXBzIHRoZSBjbGF1c2UgaXMgKE5PVCBpbmRleGtleSkuCiAqCiAqCSAgQW5k LCBsYXN0IGJ1dCBub3QgbGVhc3QsIHNvbWUgb3BlcmF0b3JzIGFuZCBmdW5jdGlvbnMgY2Fu IGJlIHByb2Nlc3NlZAogKgkgIHRvIGRlcml2ZSAodHlwaWNhbGx5IGxvc3N5KSBpbmRleHF1 YWxzIGZyb20gYSBjbGF1c2UgdGhhdCBpc24ndCBpbgogKgkgIGl0c2VsZiBpbmRleGFibGUu ICBJZiB3ZSBzZWUgdGhhdCBhbnkgb3BlcmFuZCBvZiBhbiBPcEV4cHIgb3IgRnVuY0V4cHIK ICoJICBtYXRjaGVzIHRoZSBpbmRleCBrZXksIGFuZCB0aGUgZnVuY3Rpb24gaGFzIGEgcGxh bm5lciBzdXBwb3J0IGZ1bmN0aW9uCiAqCSAgYXR0YWNoZWQgdG8gaXQsIHdlJ2xsIGludm9r ZSB0aGUgc3VwcG9ydCBmdW5jdGlvbiB0byBzZWUgaWYgc3VjaCBhbgogKgkgIGluZGV4cXVh bCBjYW4gYmUgYnVpbHQuCiAqCiAqICdyaW5mbycgaXMgdGhlIGNsYXVzZSB0byBiZSB0ZXN0 ZWQgKGFzIGEgUmVzdHJpY3RJbmZvIG5vZGUpLgogKiAnaW5kZXhjb2wnIGlzIGEgY29sdW1u IG51bWJlciBvZiAnaW5kZXgnIChjb3VudGluZyBmcm9tIDApLgogKiAnaW5kZXgnIGlzIHRo ZSBpbmRleCBvZiBpbnRlcmVzdC4KICoKICogUmV0dXJucyBhbiBJbmRleENsYXVzZSBpZiB0 aGUgY2xhdXNlIGNhbiBiZSB1c2VkIHdpdGggdGhpcyBpbmRleCBrZXksCiAqIG9yIE5VTEwg aWYgbm90LgogKgogKiBOT1RFOiAgVGhpcyByb3V0aW5lIGFsd2F5cyByZXR1cm5zIE5VTEwg aWYgdGhlIGNsYXVzZSBpcyBhbiBBTkQgY2xhdXNlLgogKiBIaWdoZXItbGV2ZWwgcm91dGlu ZXMgZGVhbCB3aXRoIE9SIGFuZCBBTkQgY2xhdXNlcy4gT1IgY2xhdXNlIGNhbiBiZQogKiBt YXRjaGVkIGFzIGEgd2hvbGUgYnkgbWF0Y2hfb3JjbGF1c2VfdG9faW5kZXhjb2woKSB0aG91 Z2guCiAqLwpzdGF0aWMgSW5kZXhDbGF1c2UgKgptYXRjaF9jbGF1c2VfdG9faW5kZXhjb2wo UGxhbm5lckluZm8gKnJvb3QsCgkJCQkJCSBSZXN0cmljdEluZm8gKnJpbmZvLAoJCQkJCQkg aW50IGluZGV4Y29sLAoJCQkJCQkgSW5kZXhPcHRJbmZvICppbmRleCkKewoJSW5kZXhDbGF1 c2UgKmljbGF1c2U7CglFeHByCSAgICpjbGF1c2UgPSByaW5mby0+Y2xhdXNlOwoJT2lkCQkJ b3BmYW1pbHk7CgoJQXNzZXJ0KGluZGV4Y29sIDwgaW5kZXgtPm5rZXljb2x1bW5zKTsKCgkv KgoJICogSGlzdG9yaWNhbGx5IHRoaXMgY29kZSBoYXMgY29wZWQgd2l0aCBOVUxMIGNsYXVz ZXMuICBUaGF0J3MgcHJvYmFibHkKCSAqIG5vdCBwb3NzaWJsZSBhbnltb3JlLCBidXQgd2Ug bWlnaHQgYXMgd2VsbCBjb250aW51ZSB0byBjb3BlLgoJICovCglpZiAoY2xhdXNlID09IE5V TEwpCgkJcmV0dXJuIE5VTEw7CgoJLyogRmlyc3QgY2hlY2sgZm9yIGJvb2xlYW4taW5kZXgg Y2FzZXMuICovCglvcGZhbWlseSA9IGluZGV4LT5vcGZhbWlseVtpbmRleGNvbF07CglpZiAo SXNCb29sZWFuT3BmYW1pbHkob3BmYW1pbHkpKQoJewoJCWljbGF1c2UgPSBtYXRjaF9ib29s ZWFuX2luZGV4X2NsYXVzZShyb290LCByaW5mbywgaW5kZXhjb2wsIGluZGV4KTsKCQlpZiAo aWNsYXVzZSkKCQkJcmV0dXJuIGljbGF1c2U7Cgl9CgoJLyoKCSAqIENsYXVzZSBtdXN0IGJl IGFuIG9wY2xhdXNlLCBmdW5jY2xhdXNlLCBTY2FsYXJBcnJheU9wRXhwciwKCSAqIFJvd0Nv bXBhcmVFeHByLCBvciBPUi1jbGF1c2UgdGhhdCBjb3VsZCBiZSBjb252ZXJ0ZWQgdG8gU0FP UC4gIE9yLCBpZgoJICogdGhlIGluZGV4IHN1cHBvcnRzIGl0LCB3ZSBjYW4gaGFuZGxlIElT IE5VTEwvTk9UIE5VTEwgY2xhdXNlcy4KCSAqLwoJaWYgKElzQShjbGF1c2UsIE9wRXhwcikp Cgl7CgkJcmV0dXJuIG1hdGNoX29wY2xhdXNlX3RvX2luZGV4Y29sKHJvb3QsIHJpbmZvLCBp bmRleGNvbCwgaW5kZXgpOwoJfQoJZWxzZSBpZiAoSXNBKGNsYXVzZSwgRnVuY0V4cHIpKQoJ ewoJCXJldHVybiBtYXRjaF9mdW5jY2xhdXNlX3RvX2luZGV4Y29sKHJvb3QsIHJpbmZvLCBp bmRleGNvbCwgaW5kZXgpOwoJfQoJZWxzZSBpZiAoSXNBKGNsYXVzZSwgU2NhbGFyQXJyYXlP cEV4cHIpKQoJewoJCXJldHVybiBtYXRjaF9zYW9wY2xhdXNlX3RvX2luZGV4Y29sKHJvb3Qs IHJpbmZvLCBpbmRleGNvbCwgaW5kZXgpOwoJfQoJZWxzZSBpZiAoSXNBKGNsYXVzZSwgUm93 Q29tcGFyZUV4cHIpKQoJewoJCXJldHVybiBtYXRjaF9yb3djb21wYXJlX3RvX2luZGV4Y29s KHJvb3QsIHJpbmZvLCBpbmRleGNvbCwgaW5kZXgpOwoJfQoJZWxzZSBpZiAocmVzdHJpY3Rp b25faXNfb3JfY2xhdXNlKHJpbmZvKSkKCXsKCQlyZXR1cm4gbWF0Y2hfb3JjbGF1c2VfdG9f aW5kZXhjb2wocm9vdCwgcmluZm8sIGluZGV4Y29sLCBpbmRleCk7Cgl9CgllbHNlIGlmIChp bmRleC0+YW1zZWFyY2hudWxscyAmJiBJc0EoY2xhdXNlLCBOdWxsVGVzdCkpCgl7CgkJTnVs bFRlc3QgICAqbnQgPSAoTnVsbFRlc3QgKikgY2xhdXNlOwoKCQlpZiAoIW50LT5hcmdpc3Jv dyAmJgoJCQltYXRjaF9pbmRleF90b19vcGVyYW5kKChOb2RlICopIG50LT5hcmcsIGluZGV4 Y29sLCBpbmRleCkpCgkJewoJCQlpY2xhdXNlID0gbWFrZU5vZGUoSW5kZXhDbGF1c2UpOwoJ CQlpY2xhdXNlLT5yaW5mbyA9IHJpbmZvOwoJCQlpY2xhdXNlLT5pbmRleHF1YWxzID0gbGlz dF9tYWtlMShyaW5mbyk7CgkJCWljbGF1c2UtPmxvc3N5ID0gZmFsc2U7CgkJCWljbGF1c2Ut PmluZGV4Y29sID0gaW5kZXhjb2w7CgkJCWljbGF1c2UtPmluZGV4Y29scyA9IE5JTDsKCQkJ cmV0dXJuIGljbGF1c2U7CgkJfQoJfQoKCXJldHVybiBOVUxMOwp9CgovKgogKiBJc0Jvb2xl YW5PcGZhbWlseQogKgkgIERldGVjdCB3aGV0aGVyIGFuIG9wZmFtaWx5IHN1cHBvcnRzIGJv b2xlYW4gZXF1YWxpdHkgYXMgYW4gb3BlcmF0b3IuCiAqCiAqIElmIHRoZSBvcGZhbWlseSBP SUQgaXMgaW4gdGhlIHJhbmdlIG9mIGJ1aWx0LWluIG9iamVjdHMsIHdlIGNhbiByZWx5CiAq IG9uIGhhcmQtd2lyZWQga25vd2xlZGdlIG9mIHdoaWNoIGJ1aWx0LWluIG9wZmFtaWxpZXMg c3VwcG9ydCB0aGlzLgogKiBGb3IgZXh0ZW5zaW9uIG9wZmFtaWxpZXMsIHRoZXJlJ3Mgbm8g Y2hvaWNlIGJ1dCB0byBkbyBhIGNhdGNhY2hlIGxvb2t1cC4KICovCnN0YXRpYyBib29sCklz Qm9vbGVhbk9wZmFtaWx5KE9pZCBvcGZhbWlseSkKewoJaWYgKG9wZmFtaWx5IDwgRmlyc3RO b3JtYWxPYmplY3RJZCkKCQlyZXR1cm4gSXNCdWlsdGluQm9vbGVhbk9wZmFtaWx5KG9wZmFt aWx5KTsKCWVsc2UKCQlyZXR1cm4gb3BfaW5fb3BmYW1pbHkoQm9vbGVhbkVxdWFsT3BlcmF0 b3IsIG9wZmFtaWx5KTsKfQoKLyoKICogbWF0Y2hfYm9vbGVhbl9pbmRleF9jbGF1c2UKICoJ ICBSZWNvZ25pemUgcmVzdHJpY3Rpb24gY2xhdXNlcyB0aGF0IGNhbiBiZSBtYXRjaGVkIHRv IGEgYm9vbGVhbiBpbmRleC4KICoKICogVGhlIGlkZWEgaGVyZSBpcyB0aGF0LCBmb3IgYW4g aW5kZXggb24gYSBib29sZWFuIGNvbHVtbiB0aGF0IHN1cHBvcnRzIHRoZQogKiBCb29sZWFu RXF1YWxPcGVyYXRvciwgd2UgY2FuIHRyYW5zZm9ybSBhIHBsYWluIHJlZmVyZW5jZSB0byB0 aGUgaW5kZXhrZXkKICogaW50byAiaW5kZXhrZXkgPSB0cnVlIiwgb3IgIk5PVCBpbmRleGtl eSIgaW50byAiaW5kZXhrZXkgPSBmYWxzZSIsIGV0YywKICogc28gYXMgdG8gbWFrZSB0aGUg ZXhwcmVzc2lvbiBpbmRleGFibGUgdXNpbmcgdGhlIGluZGV4J3MgIj0iIG9wZXJhdG9yLgog KiBTaW5jZSBQb3N0Z3JlcyA4LjEsIHdlIG11c3QgZG8gdGhpcyBiZWNhdXNlIGNvbnN0YW50 IHNpbXBsaWZpY2F0aW9uIGRvZXMKICogdGhlIHJldmVyc2UgdHJhbnNmb3JtYXRpb247IHdp dGhvdXQgdGhpcyBjb2RlIHRoZXJlJ2QgYmUgbm8gd2F5IHRvIHVzZQogKiBzdWNoIGFuIGlu ZGV4IGF0IGFsbC4KICoKICogVGhpcyBzaG91bGQgYmUgY2FsbGVkIG9ubHkgd2hlbiBJc0Jv b2xlYW5PcGZhbWlseSgpIHJlY29nbml6ZXMgdGhlCiAqIGluZGV4J3Mgb3BlcmF0b3IgZmFt aWx5LiAgV2UgY2hlY2sgdG8gc2VlIGlmIHRoZSBjbGF1c2UgbWF0Y2hlcyB0aGUKICogaW5k ZXgncyBrZXksIGFuZCBpZiBzbywgYnVpbGQgYSBzdWl0YWJsZSBJbmRleENsYXVzZS4KICov CnN0YXRpYyBJbmRleENsYXVzZSAqCm1hdGNoX2Jvb2xlYW5faW5kZXhfY2xhdXNlKFBsYW5u ZXJJbmZvICpyb290LAoJCQkJCQkgICBSZXN0cmljdEluZm8gKnJpbmZvLAoJCQkJCQkgICBp bnQgaW5kZXhjb2wsCgkJCQkJCSAgIEluZGV4T3B0SW5mbyAqaW5kZXgpCnsKCU5vZGUJICAg KmNsYXVzZSA9IChOb2RlICopIHJpbmZvLT5jbGF1c2U7CglFeHByCSAgICpvcCA9IE5VTEw7 CgoJLyogRGlyZWN0IG1hdGNoPyAqLwoJaWYgKG1hdGNoX2luZGV4X3RvX29wZXJhbmQoY2xh dXNlLCBpbmRleGNvbCwgaW5kZXgpKQoJewoJCS8qIGNvbnZlcnQgdG8gaW5kZXhrZXkgPSBU UlVFICovCgkJb3AgPSBtYWtlX29wY2xhdXNlKEJvb2xlYW5FcXVhbE9wZXJhdG9yLCBCT09M T0lELCBmYWxzZSwKCQkJCQkJICAgKEV4cHIgKikgY2xhdXNlLAoJCQkJCQkgICAoRXhwciAq KSBtYWtlQm9vbENvbnN0KHRydWUsIGZhbHNlKSwKCQkJCQkJICAgSW52YWxpZE9pZCwgSW52 YWxpZE9pZCk7Cgl9CgkvKiBOT1QgY2xhdXNlPyAqLwoJZWxzZSBpZiAoaXNfbm90Y2xhdXNl KGNsYXVzZSkpCgl7CgkJTm9kZQkgICAqYXJnID0gKE5vZGUgKikgZ2V0X25vdGNsYXVzZWFy ZygoRXhwciAqKSBjbGF1c2UpOwoKCQlpZiAobWF0Y2hfaW5kZXhfdG9fb3BlcmFuZChhcmcs IGluZGV4Y29sLCBpbmRleCkpCgkJewoJCQkvKiBjb252ZXJ0IHRvIGluZGV4a2V5ID0gRkFM U0UgKi8KCQkJb3AgPSBtYWtlX29wY2xhdXNlKEJvb2xlYW5FcXVhbE9wZXJhdG9yLCBCT09M T0lELCBmYWxzZSwKCQkJCQkJCSAgIChFeHByICopIGFyZywKCQkJCQkJCSAgIChFeHByICop IG1ha2VCb29sQ29uc3QoZmFsc2UsIGZhbHNlKSwKCQkJCQkJCSAgIEludmFsaWRPaWQsIElu dmFsaWRPaWQpOwoJCX0KCX0KCgkvKgoJICogU2luY2Ugd2Ugb25seSBjb25zaWRlciBjbGF1 c2VzIGF0IHRvcCBsZXZlbCBvZiBXSEVSRSwgd2UgY2FuIGNvbnZlcnQKCSAqIGluZGV4a2V5 IElTIFRSVUUgYW5kIGluZGV4a2V5IElTIEZBTFNFIHRvIGluZGV4IHNlYXJjaGVzIGFzIHdl bGwuICBUaGUKCSAqIGRpZmZlcmVudCBtZWFuaW5nIGZvciBOVUxMIGlzbid0IGltcG9ydGFu dC4KCSAqLwoJZWxzZSBpZiAoY2xhdXNlICYmIElzQShjbGF1c2UsIEJvb2xlYW5UZXN0KSkK CXsKCQlCb29sZWFuVGVzdCAqYnRlc3QgPSAoQm9vbGVhblRlc3QgKikgY2xhdXNlOwoJCU5v ZGUJICAgKmFyZyA9IChOb2RlICopIGJ0ZXN0LT5hcmc7CgoJCWlmIChidGVzdC0+Ym9vbHRl c3R0eXBlID09IElTX1RSVUUgJiYKCQkJbWF0Y2hfaW5kZXhfdG9fb3BlcmFuZChhcmcsIGlu ZGV4Y29sLCBpbmRleCkpCgkJewoJCQkvKiBjb252ZXJ0IHRvIGluZGV4a2V5ID0gVFJVRSAq LwoJCQlvcCA9IG1ha2Vfb3BjbGF1c2UoQm9vbGVhbkVxdWFsT3BlcmF0b3IsIEJPT0xPSUQs IGZhbHNlLAoJCQkJCQkJICAgKEV4cHIgKikgYXJnLAoJCQkJCQkJICAgKEV4cHIgKikgbWFr ZUJvb2xDb25zdCh0cnVlLCBmYWxzZSksCgkJCQkJCQkgICBJbnZhbGlkT2lkLCBJbnZhbGlk T2lkKTsKCQl9CgkJZWxzZSBpZiAoYnRlc3QtPmJvb2x0ZXN0dHlwZSA9PSBJU19GQUxTRSAm JgoJCQkJIG1hdGNoX2luZGV4X3RvX29wZXJhbmQoYXJnLCBpbmRleGNvbCwgaW5kZXgpKQoJ CXsKCQkJLyogY29udmVydCB0byBpbmRleGtleSA9IEZBTFNFICovCgkJCW9wID0gbWFrZV9v cGNsYXVzZShCb29sZWFuRXF1YWxPcGVyYXRvciwgQk9PTE9JRCwgZmFsc2UsCgkJCQkJCQkg ICAoRXhwciAqKSBhcmcsCgkJCQkJCQkgICAoRXhwciAqKSBtYWtlQm9vbENvbnN0KGZhbHNl LCBmYWxzZSksCgkJCQkJCQkgICBJbnZhbGlkT2lkLCBJbnZhbGlkT2lkKTsKCQl9Cgl9CgoJ LyoKCSAqIElmIHdlIHN1Y2Nlc3NmdWxseSBtYWRlIGFuIG9wZXJhdG9yIGNsYXVzZSBmcm9t IHRoZSBnaXZlbiBxdWFsLCB3ZSBtdXN0CgkgKiB3cmFwIGl0IGluIGFuIEluZGV4Q2xhdXNl LiAgSXQncyBub3QgbG9zc3kuCgkgKi8KCWlmIChvcCkKCXsKCQlJbmRleENsYXVzZSAqaWNs YXVzZSA9IG1ha2VOb2RlKEluZGV4Q2xhdXNlKTsKCgkJaWNsYXVzZS0+cmluZm8gPSByaW5m bzsKCQlpY2xhdXNlLT5pbmRleHF1YWxzID0gbGlzdF9tYWtlMShtYWtlX3NpbXBsZV9yZXN0 cmljdGluZm8ocm9vdCwgb3ApKTsKCQlpY2xhdXNlLT5sb3NzeSA9IGZhbHNlOwoJCWljbGF1 c2UtPmluZGV4Y29sID0gaW5kZXhjb2w7CgkJaWNsYXVzZS0+aW5kZXhjb2xzID0gTklMOwoJ CXJldHVybiBpY2xhdXNlOwoJfQoKCXJldHVybiBOVUxMOwp9CgovKgogKiBtYXRjaF9vcGNs YXVzZV90b19pbmRleGNvbCgpCiAqCSAgSGFuZGxlcyB0aGUgT3BFeHByIGNhc2UgZm9yIG1h dGNoX2NsYXVzZV90b19pbmRleGNvbCgpLAogKgkgIHdoaWNoIHNlZSBmb3IgY29tbWVudHMu CiAqLwpzdGF0aWMgSW5kZXhDbGF1c2UgKgptYXRjaF9vcGNsYXVzZV90b19pbmRleGNvbChQ bGFubmVySW5mbyAqcm9vdCwKCQkJCQkJICAgUmVzdHJpY3RJbmZvICpyaW5mbywKCQkJCQkJ ICAgaW50IGluZGV4Y29sLAoJCQkJCQkgICBJbmRleE9wdEluZm8gKmluZGV4KQp7CglJbmRl eENsYXVzZSAqaWNsYXVzZTsKCU9wRXhwcgkgICAqY2xhdXNlID0gKE9wRXhwciAqKSByaW5m by0+Y2xhdXNlOwoJTm9kZQkgICAqbGVmdG9wLAoJCQkgICAqcmlnaHRvcDsKCU9pZAkJCWV4 cHJfb3A7CglPaWQJCQlleHByX2NvbGw7CglJbmRleAkJaW5kZXhfcmVsaWQ7CglPaWQJCQlv cGZhbWlseTsKCU9pZAkJCWlkeGNvbGxhdGlvbjsKCgkvKgoJICogT25seSBiaW5hcnkgb3Bl cmF0b3JzIG5lZWQgYXBwbHkuICAoSW4gdGhlb3J5LCBhIHBsYW5uZXIgc3VwcG9ydAoJICog ZnVuY3Rpb24gY291bGQgZG8gc29tZXRoaW5nIHdpdGggYSB1bmFyeSBvcGVyYXRvciwgYnV0 IGl0IHNlZW1zCgkgKiB1bmxpa2VseSB0byBiZSB3b3J0aCB0aGUgY3ljbGVzIHRvIGNoZWNr LikKCSAqLwoJaWYgKGxpc3RfbGVuZ3RoKGNsYXVzZS0+YXJncykgIT0gMikKCQlyZXR1cm4g TlVMTDsKCglsZWZ0b3AgPSAoTm9kZSAqKSBsaW5pdGlhbChjbGF1c2UtPmFyZ3MpOwoJcmln aHRvcCA9IChOb2RlICopIGxzZWNvbmQoY2xhdXNlLT5hcmdzKTsKCWV4cHJfb3AgPSBjbGF1 c2UtPm9wbm87CglleHByX2NvbGwgPSBjbGF1c2UtPmlucHV0Y29sbGlkOwoKCWluZGV4X3Jl bGlkID0gaW5kZXgtPnJlbC0+cmVsaWQ7CglvcGZhbWlseSA9IGluZGV4LT5vcGZhbWlseVtp bmRleGNvbF07CglpZHhjb2xsYXRpb24gPSBpbmRleC0+aW5kZXhjb2xsYXRpb25zW2luZGV4 Y29sXTsKCgkvKgoJICogQ2hlY2sgZm9yIGNsYXVzZXMgb2YgdGhlIGZvcm06IChpbmRleGtl eSBvcGVyYXRvciBjb25zdGFudCkgb3IKCSAqIChjb25zdGFudCBvcGVyYXRvciBpbmRleGtl eSkuICBTZWUgbWF0Y2hfY2xhdXNlX3RvX2luZGV4Y29sJ3Mgbm90ZXMKCSAqIGFib3V0IGNv bnN0LW5lc3MuCgkgKgoJICogTm90ZSB0aGF0IHdlIGRvbid0IGFzayB0aGUgc3VwcG9ydCBm dW5jdGlvbiBhYm91dCBjbGF1c2VzIHRoYXQgZG9uJ3QKCSAqIGhhdmUgb25lIG9mIHRoZXNl IGZvcm1zLiAgQWdhaW4sIGluIHByaW5jaXBsZSBpdCBtaWdodCBiZSBwb3NzaWJsZSB0bwoJ ICogZG8gc29tZXRoaW5nLCBidXQgaXQgc2VlbXMgdW5saWtlbHkgdG8gYmUgd29ydGggdGhl IGN5Y2xlcyB0byBjaGVjay4KCSAqLwoJaWYgKG1hdGNoX2luZGV4X3RvX29wZXJhbmQobGVm dG9wLCBpbmRleGNvbCwgaW5kZXgpICYmCgkJIWJtc19pc19tZW1iZXIoaW5kZXhfcmVsaWQs IHJpbmZvLT5yaWdodF9yZWxpZHMpICYmCgkJIWNvbnRhaW5fdm9sYXRpbGVfZnVuY3Rpb25z KHJpZ2h0b3ApKQoJewoJCWlmIChJbmRleENvbGxNYXRjaGVzRXhwckNvbGwoaWR4Y29sbGF0 aW9uLCBleHByX2NvbGwpICYmCgkJCW9wX2luX29wZmFtaWx5KGV4cHJfb3AsIG9wZmFtaWx5 KSkKCQl7CgkJCWljbGF1c2UgPSBtYWtlTm9kZShJbmRleENsYXVzZSk7CgkJCWljbGF1c2Ut PnJpbmZvID0gcmluZm87CgkJCWljbGF1c2UtPmluZGV4cXVhbHMgPSBsaXN0X21ha2UxKHJp bmZvKTsKCQkJaWNsYXVzZS0+bG9zc3kgPSBmYWxzZTsKCQkJaWNsYXVzZS0+aW5kZXhjb2wg PSBpbmRleGNvbDsKCQkJaWNsYXVzZS0+aW5kZXhjb2xzID0gTklMOwoJCQlyZXR1cm4gaWNs YXVzZTsKCQl9CgoJCS8qCgkJICogSWYgd2UgZGlkbid0IGZpbmQgYSBtZW1iZXIgb2YgdGhl IGluZGV4J3Mgb3BmYW1pbHksIHRyeSB0aGUgc3VwcG9ydAoJCSAqIGZ1bmN0aW9uIGZvciB0 aGUgb3BlcmF0b3IncyB1bmRlcmx5aW5nIGZ1bmN0aW9uLgoJCSAqLwoJCXNldF9vcGZ1bmNp ZChjbGF1c2UpOwkvKiBtYWtlIHN1cmUgd2UgaGF2ZSBvcGZ1bmNpZCAqLwoJCXJldHVybiBn ZXRfaW5kZXhfY2xhdXNlX2Zyb21fc3VwcG9ydChyb290LAoJCQkJCQkJCQkJCSByaW5mbywK CQkJCQkJCQkJCQkgY2xhdXNlLT5vcGZ1bmNpZCwKCQkJCQkJCQkJCQkgMCwgLyogaW5kZXhh cmcgb24gbGVmdCAqLwoJCQkJCQkJCQkJCSBpbmRleGNvbCwKCQkJCQkJCQkJCQkgaW5kZXgp OwoJfQoKCWlmIChtYXRjaF9pbmRleF90b19vcGVyYW5kKHJpZ2h0b3AsIGluZGV4Y29sLCBp bmRleCkgJiYKCQkhYm1zX2lzX21lbWJlcihpbmRleF9yZWxpZCwgcmluZm8tPmxlZnRfcmVs aWRzKSAmJgoJCSFjb250YWluX3ZvbGF0aWxlX2Z1bmN0aW9ucyhsZWZ0b3ApKQoJewoJCWlm IChJbmRleENvbGxNYXRjaGVzRXhwckNvbGwoaWR4Y29sbGF0aW9uLCBleHByX2NvbGwpKQoJ CXsKCQkJT2lkCQkJY29tbV9vcCA9IGdldF9jb21tdXRhdG9yKGV4cHJfb3ApOwoKCQkJaWYg KE9pZElzVmFsaWQoY29tbV9vcCkgJiYKCQkJCW9wX2luX29wZmFtaWx5KGNvbW1fb3AsIG9w ZmFtaWx5KSkKCQkJewoJCQkJUmVzdHJpY3RJbmZvICpjb21tcmluZm87CgoJCQkJLyogQnVp bGQgYSBjb21tdXRlZCBPcEV4cHIgYW5kIFJlc3RyaWN0SW5mbyAqLwoJCQkJY29tbXJpbmZv ID0gY29tbXV0ZV9yZXN0cmljdGluZm8ocmluZm8sIGNvbW1fb3ApOwoKCQkJCS8qIE1ha2Ug YW4gSW5kZXhDbGF1c2Ugc2hvd2luZyB0aGF0IGFzIGEgZGVyaXZlZCBxdWFsICovCgkJCQlp Y2xhdXNlID0gbWFrZU5vZGUoSW5kZXhDbGF1c2UpOwoJCQkJaWNsYXVzZS0+cmluZm8gPSBy aW5mbzsKCQkJCWljbGF1c2UtPmluZGV4cXVhbHMgPSBsaXN0X21ha2UxKGNvbW1yaW5mbyk7 CgkJCQlpY2xhdXNlLT5sb3NzeSA9IGZhbHNlOwoJCQkJaWNsYXVzZS0+aW5kZXhjb2wgPSBp bmRleGNvbDsKCQkJCWljbGF1c2UtPmluZGV4Y29scyA9IE5JTDsKCQkJCXJldHVybiBpY2xh dXNlOwoJCQl9CgkJfQoKCQkvKgoJCSAqIElmIHdlIGRpZG4ndCBmaW5kIGEgbWVtYmVyIG9m IHRoZSBpbmRleCdzIG9wZmFtaWx5LCB0cnkgdGhlIHN1cHBvcnQKCQkgKiBmdW5jdGlvbiBm b3IgdGhlIG9wZXJhdG9yJ3MgdW5kZXJseWluZyBmdW5jdGlvbi4KCQkgKi8KCQlzZXRfb3Bm dW5jaWQoY2xhdXNlKTsJLyogbWFrZSBzdXJlIHdlIGhhdmUgb3BmdW5jaWQgKi8KCQlyZXR1 cm4gZ2V0X2luZGV4X2NsYXVzZV9mcm9tX3N1cHBvcnQocm9vdCwKCQkJCQkJCQkJCQkgcmlu Zm8sCgkJCQkJCQkJCQkJIGNsYXVzZS0+b3BmdW5jaWQsCgkJCQkJCQkJCQkJIDEsIC8qIGlu ZGV4YXJnIG9uIHJpZ2h0ICovCgkJCQkJCQkJCQkJIGluZGV4Y29sLAoJCQkJCQkJCQkJCSBp bmRleCk7Cgl9CgoJcmV0dXJuIE5VTEw7Cn0KCi8qCiAqIG1hdGNoX2Z1bmNjbGF1c2VfdG9f aW5kZXhjb2woKQogKgkgIEhhbmRsZXMgdGhlIEZ1bmNFeHByIGNhc2UgZm9yIG1hdGNoX2Ns YXVzZV90b19pbmRleGNvbCgpLAogKgkgIHdoaWNoIHNlZSBmb3IgY29tbWVudHMuCiAqLwpz dGF0aWMgSW5kZXhDbGF1c2UgKgptYXRjaF9mdW5jY2xhdXNlX3RvX2luZGV4Y29sKFBsYW5u ZXJJbmZvICpyb290LAoJCQkJCQkJIFJlc3RyaWN0SW5mbyAqcmluZm8sCgkJCQkJCQkgaW50 IGluZGV4Y29sLAoJCQkJCQkJIEluZGV4T3B0SW5mbyAqaW5kZXgpCnsKCUZ1bmNFeHByICAg KmNsYXVzZSA9IChGdW5jRXhwciAqKSByaW5mby0+Y2xhdXNlOwoJaW50CQkJaW5kZXhhcmc7 CglMaXN0Q2VsbCAgICpsYzsKCgkvKgoJICogV2UgaGF2ZSBubyBidWlsdC1pbiBpbnRlbGxp Z2VuY2UgYWJvdXQgZnVuY3Rpb24gY2xhdXNlcywgYnV0IGlmIHRoZXJlJ3MKCSAqIGEgcGxh bm5lciBzdXBwb3J0IGZ1bmN0aW9uLCBpdCBtaWdodCBiZSBhYmxlIHRvIGRvIHNvbWV0aGlu Zy4gIEJ1dCwgdG8KCSAqIGN1dCBkb3duIG9uIHdhc3RlZCBwbGFubmluZyBjeWNsZXMsIG9u bHkgY2FsbCB0aGUgc3VwcG9ydCBmdW5jdGlvbiBpZgoJICogYXQgbGVhc3Qgb25lIGFyZ3Vt ZW50IG1hdGNoZXMgdGhlIHRhcmdldCBpbmRleCBjb2x1bW4uCgkgKgoJICogTm90ZSB0aGF0 IHdlIGRvbid0IGluc2lzdCBvbiB0aGUgb3RoZXIgYXJndW1lbnRzIGJlaW5nIHBzZXVkb2Nv bnN0YW50czsKCSAqIHRoZSBzdXBwb3J0IGZ1bmN0aW9uIGhhcyB0byBjaGVjayB0aGF0LiAg VGhpcyBpcyB0byBhbGxvdyBjYXNlcyB3aGVyZQoJICogb25seSBzb21lIG9mIHRoZSBvdGhl ciBhcmd1bWVudHMgbmVlZCB0byBiZSBpbmNsdWRlZCBpbiB0aGUgaW5kZXhxdWFsLgoJICov CglpbmRleGFyZyA9IDA7Cglmb3JlYWNoKGxjLCBjbGF1c2UtPmFyZ3MpCgl7CgkJTm9kZQkg ICAqb3AgPSAoTm9kZSAqKSBsZmlyc3QobGMpOwoKCQlpZiAobWF0Y2hfaW5kZXhfdG9fb3Bl cmFuZChvcCwgaW5kZXhjb2wsIGluZGV4KSkKCQl7CgkJCXJldHVybiBnZXRfaW5kZXhfY2xh dXNlX2Zyb21fc3VwcG9ydChyb290LAoJCQkJCQkJCQkJCQkgcmluZm8sCgkJCQkJCQkJCQkJ CSBjbGF1c2UtPmZ1bmNpZCwKCQkJCQkJCQkJCQkJIGluZGV4YXJnLAoJCQkJCQkJCQkJCQkg aW5kZXhjb2wsCgkJCQkJCQkJCQkJCSBpbmRleCk7CgkJfQoKCQlpbmRleGFyZysrOwoJfQoK CXJldHVybiBOVUxMOwp9CgovKgogKiBnZXRfaW5kZXhfY2xhdXNlX2Zyb21fc3VwcG9ydCgp CiAqCQlJZiB0aGUgZnVuY3Rpb24gaGFzIGEgcGxhbm5lciBzdXBwb3J0IGZ1bmN0aW9uLCB0 cnkgdG8gY29uc3RydWN0CiAqCQlhbiBJbmRleENsYXVzZSB1c2luZyBpbmRleHF1YWxzIGNy ZWF0ZWQgYnkgdGhlIHN1cHBvcnQgZnVuY3Rpb24uCiAqLwpzdGF0aWMgSW5kZXhDbGF1c2Ug KgpnZXRfaW5kZXhfY2xhdXNlX2Zyb21fc3VwcG9ydChQbGFubmVySW5mbyAqcm9vdCwKCQkJ CQkJCSAgUmVzdHJpY3RJbmZvICpyaW5mbywKCQkJCQkJCSAgT2lkIGZ1bmNpZCwKCQkJCQkJ CSAgaW50IGluZGV4YXJnLAoJCQkJCQkJICBpbnQgaW5kZXhjb2wsCgkJCQkJCQkgIEluZGV4 T3B0SW5mbyAqaW5kZXgpCnsKCU9pZAkJCXByb3N1cHBvcnQgPSBnZXRfZnVuY19zdXBwb3J0 KGZ1bmNpZCk7CglTdXBwb3J0UmVxdWVzdEluZGV4Q29uZGl0aW9uIHJlcTsKCUxpc3QJICAg KnNyZXN1bHQ7CgoJaWYgKCFPaWRJc1ZhbGlkKHByb3N1cHBvcnQpKQoJCXJldHVybiBOVUxM OwoKCXJlcS50eXBlID0gVF9TdXBwb3J0UmVxdWVzdEluZGV4Q29uZGl0aW9uOwoJcmVxLnJv b3QgPSByb290OwoJcmVxLmZ1bmNpZCA9IGZ1bmNpZDsKCXJlcS5ub2RlID0gKE5vZGUgKikg cmluZm8tPmNsYXVzZTsKCXJlcS5pbmRleGFyZyA9IGluZGV4YXJnOwoJcmVxLmluZGV4ID0g aW5kZXg7CglyZXEuaW5kZXhjb2wgPSBpbmRleGNvbDsKCXJlcS5vcGZhbWlseSA9IGluZGV4 LT5vcGZhbWlseVtpbmRleGNvbF07CglyZXEuaW5kZXhjb2xsYXRpb24gPSBpbmRleC0+aW5k ZXhjb2xsYXRpb25zW2luZGV4Y29sXTsKCglyZXEubG9zc3kgPSB0cnVlOwkJCS8qIGRlZmF1 bHQgYXNzdW1wdGlvbiAqLwoKCXNyZXN1bHQgPSAoTGlzdCAqKQoJCURhdHVtR2V0UG9pbnRl cihPaWRGdW5jdGlvbkNhbGwxKHByb3N1cHBvcnQsCgkJCQkJCQkJCQkgUG9pbnRlckdldERh dHVtKCZyZXEpKSk7CgoJaWYgKHNyZXN1bHQgIT0gTklMKQoJewoJCUluZGV4Q2xhdXNlICpp Y2xhdXNlID0gbWFrZU5vZGUoSW5kZXhDbGF1c2UpOwoJCUxpc3QJICAgKmluZGV4cXVhbHMg PSBOSUw7CgkJTGlzdENlbGwgICAqbGM7CgoJCS8qCgkJICogVGhlIHN1cHBvcnQgZnVuY3Rp b24gQVBJIHNheXMgaXQgc2hvdWxkIGp1c3QgZ2l2ZSBiYWNrIGJhcmUKCQkgKiBjbGF1c2Vz LCBzbyBoZXJlIHdlIG11c3Qgd3JhcCBlYWNoIG9uZSBpbiBhIFJlc3RyaWN0SW5mby4KCQkg Ki8KCQlmb3JlYWNoKGxjLCBzcmVzdWx0KQoJCXsKCQkJRXhwcgkgICAqY2xhdXNlID0gKEV4 cHIgKikgbGZpcnN0KGxjKTsKCgkJCWluZGV4cXVhbHMgPSBsYXBwZW5kKGluZGV4cXVhbHMs CgkJCQkJCQkJIG1ha2Vfc2ltcGxlX3Jlc3RyaWN0aW5mbyhyb290LCBjbGF1c2UpKTsKCQl9 CgoJCWljbGF1c2UtPnJpbmZvID0gcmluZm87CgkJaWNsYXVzZS0+aW5kZXhxdWFscyA9IGlu ZGV4cXVhbHM7CgkJaWNsYXVzZS0+bG9zc3kgPSByZXEubG9zc3k7CgkJaWNsYXVzZS0+aW5k ZXhjb2wgPSBpbmRleGNvbDsKCQlpY2xhdXNlLT5pbmRleGNvbHMgPSBOSUw7CgoJCXJldHVy biBpY2xhdXNlOwoJfQoKCXJldHVybiBOVUxMOwp9CgovKgogKiBtYXRjaF9zYW9wY2xhdXNl X3RvX2luZGV4Y29sKCkKICoJICBIYW5kbGVzIHRoZSBTY2FsYXJBcnJheU9wRXhwciBjYXNl IGZvciBtYXRjaF9jbGF1c2VfdG9faW5kZXhjb2woKSwKICoJICB3aGljaCBzZWUgZm9yIGNv bW1lbnRzLgogKi8Kc3RhdGljIEluZGV4Q2xhdXNlICoKbWF0Y2hfc2FvcGNsYXVzZV90b19p bmRleGNvbChQbGFubmVySW5mbyAqcm9vdCwKCQkJCQkJCSBSZXN0cmljdEluZm8gKnJpbmZv LAoJCQkJCQkJIGludCBpbmRleGNvbCwKCQkJCQkJCSBJbmRleE9wdEluZm8gKmluZGV4KQp7 CglTY2FsYXJBcnJheU9wRXhwciAqc2FvcCA9IChTY2FsYXJBcnJheU9wRXhwciAqKSByaW5m by0+Y2xhdXNlOwoJTm9kZQkgICAqbGVmdG9wLAoJCQkgICAqcmlnaHRvcDsKCVJlbGlkcwkJ cmlnaHRfcmVsaWRzOwoJT2lkCQkJZXhwcl9vcDsKCU9pZAkJCWV4cHJfY29sbDsKCUluZGV4 CQlpbmRleF9yZWxpZDsKCU9pZAkJCW9wZmFtaWx5OwoJT2lkCQkJaWR4Y29sbGF0aW9uOwoK CS8qIFdlIG9ubHkgYWNjZXB0IEFOWSBjbGF1c2VzLCBub3QgQUxMICovCglpZiAoIXNhb3At PnVzZU9yKQoJCXJldHVybiBOVUxMOwoJbGVmdG9wID0gKE5vZGUgKikgbGluaXRpYWwoc2Fv cC0+YXJncyk7CglyaWdodG9wID0gKE5vZGUgKikgbHNlY29uZChzYW9wLT5hcmdzKTsKCXJp Z2h0X3JlbGlkcyA9IHB1bGxfdmFybm9zKHJvb3QsIHJpZ2h0b3ApOwoJZXhwcl9vcCA9IHNh b3AtPm9wbm87CglleHByX2NvbGwgPSBzYW9wLT5pbnB1dGNvbGxpZDsKCglpbmRleF9yZWxp ZCA9IGluZGV4LT5yZWwtPnJlbGlkOwoJb3BmYW1pbHkgPSBpbmRleC0+b3BmYW1pbHlbaW5k ZXhjb2xdOwoJaWR4Y29sbGF0aW9uID0gaW5kZXgtPmluZGV4Y29sbGF0aW9uc1tpbmRleGNv bF07CgoJLyoKCSAqIFdlIG11c3QgaGF2ZSBpbmRleGtleSBvbiB0aGUgbGVmdCBhbmQgYSBw c2V1ZG8tY29uc3RhbnQgYXJyYXkgYXJndW1lbnQuCgkgKi8KCWlmIChtYXRjaF9pbmRleF90 b19vcGVyYW5kKGxlZnRvcCwgaW5kZXhjb2wsIGluZGV4KSAmJgoJCSFibXNfaXNfbWVtYmVy KGluZGV4X3JlbGlkLCByaWdodF9yZWxpZHMpICYmCgkJIWNvbnRhaW5fdm9sYXRpbGVfZnVu Y3Rpb25zKHJpZ2h0b3ApKQoJewoJCWlmIChJbmRleENvbGxNYXRjaGVzRXhwckNvbGwoaWR4 Y29sbGF0aW9uLCBleHByX2NvbGwpICYmCgkJCW9wX2luX29wZmFtaWx5KGV4cHJfb3AsIG9w ZmFtaWx5KSkKCQl7CgkJCUluZGV4Q2xhdXNlICppY2xhdXNlID0gbWFrZU5vZGUoSW5kZXhD bGF1c2UpOwoKCQkJaWNsYXVzZS0+cmluZm8gPSByaW5mbzsKCQkJaWNsYXVzZS0+aW5kZXhx dWFscyA9IGxpc3RfbWFrZTEocmluZm8pOwoJCQlpY2xhdXNlLT5sb3NzeSA9IGZhbHNlOwoJ CQlpY2xhdXNlLT5pbmRleGNvbCA9IGluZGV4Y29sOwoJCQlpY2xhdXNlLT5pbmRleGNvbHMg PSBOSUw7CgkJCXJldHVybiBpY2xhdXNlOwoJCX0KCgkJLyoKCQkgKiBXZSBkbyBub3QgY3Vy cmVudGx5IGFzayBzdXBwb3J0IGZ1bmN0aW9ucyBhYm91dCBTY2FsYXJBcnJheU9wRXhwcnMs CgkJICogdGhvdWdoIGluIHByaW5jaXBsZSB3ZSBjb3VsZC4KCQkgKi8KCX0KCglyZXR1cm4g TlVMTDsKfQoKLyoKICogbWF0Y2hfcm93Y29tcGFyZV90b19pbmRleGNvbCgpCiAqCSAgSGFu ZGxlcyB0aGUgUm93Q29tcGFyZUV4cHIgY2FzZSBmb3IgbWF0Y2hfY2xhdXNlX3RvX2luZGV4 Y29sKCksCiAqCSAgd2hpY2ggc2VlIGZvciBjb21tZW50cy4KICoKICogSW4gdGhpcyByb3V0 aW5lIHdlIGNoZWNrIHdoZXRoZXIgdGhlIGZpcnN0IGNvbHVtbiBvZiB0aGUgcm93IGNvbXBh cmlzb24KICogbWF0Y2hlcyB0aGUgdGFyZ2V0IGluZGV4IGNvbHVtbi4gIFRoaXMgaXMgc3Vm ZmljaWVudCB0byBndWFyYW50ZWUgdGhhdCBzb21lCiAqIGluZGV4IGNvbmRpdGlvbiBjYW4g YmUgY29uc3RydWN0ZWQgZnJvbSB0aGUgUm93Q29tcGFyZUV4cHIgLS0tIHRoZSByZXN0CiAq IGlzIGhhbmRsZWQgYnkgZXhwYW5kX2luZGV4cXVhbF9yb3djb21wYXJlKCkuCiAqLwpzdGF0 aWMgSW5kZXhDbGF1c2UgKgptYXRjaF9yb3djb21wYXJlX3RvX2luZGV4Y29sKFBsYW5uZXJJ bmZvICpyb290LAoJCQkJCQkJIFJlc3RyaWN0SW5mbyAqcmluZm8sCgkJCQkJCQkgaW50IGlu ZGV4Y29sLAoJCQkJCQkJIEluZGV4T3B0SW5mbyAqaW5kZXgpCnsKCVJvd0NvbXBhcmVFeHBy ICpjbGF1c2UgPSAoUm93Q29tcGFyZUV4cHIgKikgcmluZm8tPmNsYXVzZTsKCUluZGV4CQlp bmRleF9yZWxpZDsKCU9pZAkJCW9wZmFtaWx5OwoJT2lkCQkJaWR4Y29sbGF0aW9uOwoJTm9k ZQkgICAqbGVmdG9wLAoJCQkgICAqcmlnaHRvcDsKCWJvb2wJCXZhcl9vbl9sZWZ0OwoJT2lk CQkJZXhwcl9vcDsKCU9pZAkJCWV4cHJfY29sbDsKCgkvKiBGb3JnZXQgaXQgaWYgd2UncmUg bm90IGRlYWxpbmcgd2l0aCBhIGJ0cmVlIGluZGV4ICovCglpZiAoaW5kZXgtPnJlbGFtICE9 IEJUUkVFX0FNX09JRCkKCQlyZXR1cm4gTlVMTDsKCglpbmRleF9yZWxpZCA9IGluZGV4LT5y ZWwtPnJlbGlkOwoJb3BmYW1pbHkgPSBpbmRleC0+b3BmYW1pbHlbaW5kZXhjb2xdOwoJaWR4 Y29sbGF0aW9uID0gaW5kZXgtPmluZGV4Y29sbGF0aW9uc1tpbmRleGNvbF07CgoJLyoKCSAq IFdlIGNvdWxkIGRvIHRoZSBtYXRjaGluZyBvbiB0aGUgYmFzaXMgb2YgaW5zaXN0aW5nIHRo YXQgdGhlIG9wZmFtaWx5CgkgKiBzaG93biBpbiB0aGUgUm93Q29tcGFyZUV4cHIgYmUgdGhl IHNhbWUgYXMgdGhlIGluZGV4IGNvbHVtbidzIG9wZmFtaWx5LAoJICogYnV0IHRoYXQgY291 bGQgZmFpbCBpbiB0aGUgcHJlc2VuY2Ugb2YgcmV2ZXJzZS1zb3J0IG9wZmFtaWxpZXM6IGl0 J2QgYmUKCSAqIGEgbWF0dGVyIG9mIGNoYW5jZSB3aGV0aGVyIFJvd0NvbXBhcmVFeHByIGhh ZCBwaWNrZWQgdGhlIGZvcndhcmQgb3IKCSAqIHJldmVyc2Utc29ydCBmYW1pbHkuICBTbyBs b29rIG9ubHkgYXQgdGhlIG9wZXJhdG9yLCBhbmQgbWF0Y2ggaWYgaXQgaXMKCSAqIGEgbWVt YmVyIG9mIHRoZSBpbmRleCdzIG9wZmFtaWx5IChhZnRlciBjb21tdXRhdGlvbiwgaWYgdGhl IGluZGV4a2V5IGlzCgkgKiBvbiB0aGUgcmlnaHQpLiAgV2UnbGwgd29ycnkgbGF0ZXIgYWJv dXQgd2hldGhlciBhbnkgYWRkaXRpb25hbAoJICogb3BlcmF0b3JzIGFyZSBtYXRjaGFibGUg dG8gdGhlIGluZGV4LgoJICovCglsZWZ0b3AgPSAoTm9kZSAqKSBsaW5pdGlhbChjbGF1c2Ut PmxhcmdzKTsKCXJpZ2h0b3AgPSAoTm9kZSAqKSBsaW5pdGlhbChjbGF1c2UtPnJhcmdzKTsK CWV4cHJfb3AgPSBsaW5pdGlhbF9vaWQoY2xhdXNlLT5vcG5vcyk7CglleHByX2NvbGwgPSBs aW5pdGlhbF9vaWQoY2xhdXNlLT5pbnB1dGNvbGxpZHMpOwoKCS8qIENvbGxhdGlvbnMgbXVz dCBtYXRjaCwgaWYgcmVsZXZhbnQgKi8KCWlmICghSW5kZXhDb2xsTWF0Y2hlc0V4cHJDb2xs KGlkeGNvbGxhdGlvbiwgZXhwcl9jb2xsKSkKCQlyZXR1cm4gTlVMTDsKCgkvKgoJICogVGhl c2Ugc3ludGFjdGljIHRlc3RzIGFyZSB0aGUgc2FtZSBhcyBpbiBtYXRjaF9vcGNsYXVzZV90 b19pbmRleGNvbCgpCgkgKi8KCWlmIChtYXRjaF9pbmRleF90b19vcGVyYW5kKGxlZnRvcCwg aW5kZXhjb2wsIGluZGV4KSAmJgoJCSFibXNfaXNfbWVtYmVyKGluZGV4X3JlbGlkLCBwdWxs X3Zhcm5vcyhyb290LCByaWdodG9wKSkgJiYKCQkhY29udGFpbl92b2xhdGlsZV9mdW5jdGlv bnMocmlnaHRvcCkpCgl7CgkJLyogT0ssIGluZGV4a2V5IGlzIG9uIGxlZnQgKi8KCQl2YXJf b25fbGVmdCA9IHRydWU7Cgl9CgllbHNlIGlmIChtYXRjaF9pbmRleF90b19vcGVyYW5kKHJp Z2h0b3AsIGluZGV4Y29sLCBpbmRleCkgJiYKCQkJICFibXNfaXNfbWVtYmVyKGluZGV4X3Jl bGlkLCBwdWxsX3Zhcm5vcyhyb290LCBsZWZ0b3ApKSAmJgoJCQkgIWNvbnRhaW5fdm9sYXRp bGVfZnVuY3Rpb25zKGxlZnRvcCkpCgl7CgkJLyogaW5kZXhrZXkgaXMgb24gcmlnaHQsIHNv IGNvbW11dGUgdGhlIG9wZXJhdG9yICovCgkJZXhwcl9vcCA9IGdldF9jb21tdXRhdG9yKGV4 cHJfb3ApOwoJCWlmIChleHByX29wID09IEludmFsaWRPaWQpCgkJCXJldHVybiBOVUxMOwoJ CXZhcl9vbl9sZWZ0ID0gZmFsc2U7Cgl9CgllbHNlCgkJcmV0dXJuIE5VTEw7CgoJLyogV2Un cmUgZ29vZCBpZiB0aGUgb3BlcmF0b3IgaXMgdGhlIHJpZ2h0IHR5cGUgb2Ygb3BmYW1pbHkg bWVtYmVyICovCglzd2l0Y2ggKGdldF9vcF9vcGZhbWlseV9zdHJhdGVneShleHByX29wLCBv cGZhbWlseSkpCgl7CgkJY2FzZSBCVExlc3NTdHJhdGVneU51bWJlcjoKCQljYXNlIEJUTGVz c0VxdWFsU3RyYXRlZ3lOdW1iZXI6CgkJY2FzZSBCVEdyZWF0ZXJFcXVhbFN0cmF0ZWd5TnVt YmVyOgoJCWNhc2UgQlRHcmVhdGVyU3RyYXRlZ3lOdW1iZXI6CgkJCXJldHVybiBleHBhbmRf aW5kZXhxdWFsX3Jvd2NvbXBhcmUocm9vdCwKCQkJCQkJCQkJCQkgICByaW5mbywKCQkJCQkJ CQkJCQkgICBpbmRleGNvbCwKCQkJCQkJCQkJCQkgICBpbmRleCwKCQkJCQkJCQkJCQkgICBl eHByX29wLAoJCQkJCQkJCQkJCSAgIHZhcl9vbl9sZWZ0KTsKCX0KCglyZXR1cm4gTlVMTDsK fQoKLyoKICogbWF0Y2hfb3JjbGF1c2VfdG9faW5kZXhjb2woKQogKgkgIEhhbmRsZXMgdGhl IE9SLWV4cHIgY2FzZSBmb3IgbWF0Y2hfY2xhdXNlX3RvX2luZGV4Y29sKCkgaW4gdGhlIGNh c2UKICoJICB3aGVuIGl0IGNvdWxkIGJlIHRyYW5zZm9ybWVkIHRvIFNjYWxhckFycmF5T3BF eHByLgogKgogKiBJbiB0aGlzIHJvdXRpbmUsIHdlIGF0dGVtcHQgdG8gdHJhbnNmb3JtIGEg bGlzdCBvZiBPUi1jbGF1c2UgYXJncyBpbnRvIGEKICogc2luZ2xlIFNBT1AgZXhwcmVzc2lv biBtYXRjaGluZyB0aGUgdGFyZ2V0IGluZGV4IGNvbHVtbi4gIE9uIHN1Y2Nlc3MsCiAqIHJl dHVybiBhbiBJbmRleENsYXVzZSBjb250YWluaW5nIHRoZSB0cmFuc2Zvcm1lZCBleHByZXNz aW9uLgogKiBSZXR1cm4gTlVMTCBpZiB0aGUgdHJhbnNmb3JtYXRpb24gZmFpbHMuCiAqLwpz dGF0aWMgSW5kZXhDbGF1c2UgKgptYXRjaF9vcmNsYXVzZV90b19pbmRleGNvbChQbGFubmVy SW5mbyAqcm9vdCwKCQkJCQkJICAgUmVzdHJpY3RJbmZvICpyaW5mbywKCQkJCQkJICAgaW50 IGluZGV4Y29sLAoJCQkJCQkgICBJbmRleE9wdEluZm8gKmluZGV4KQp7CglCb29sRXhwciAg ICpvcmNsYXVzZSA9IChCb29sRXhwciAqKSByaW5mby0+b3JjbGF1c2U7CglMaXN0CSAgICpj b25zdHMgPSBOSUw7CglOb2RlCSAgICppbmRleEV4cHIgPSBOVUxMOwoJT2lkCQkJbWF0Y2hP cG5vID0gSW52YWxpZE9pZDsKCU9pZAkJCWNvbnN0dHlwZSA9IEludmFsaWRPaWQ7CglPaWQJ CQlhcnJheXR5cGUgPSBJbnZhbGlkT2lkOwoJT2lkCQkJaW5wdXRjb2xsaWQgPSBJbnZhbGlk T2lkOwoJYm9vbAkJZmlyc3RUaW1lID0gdHJ1ZTsKCWJvb2wJCWhhdmVOb25Db25zdCA9IGZh bHNlOwoJSW5kZXgJCWluZGV4UmVsaWQgPSBpbmRleC0+cmVsLT5yZWxpZDsKCVNjYWxhckFy cmF5T3BFeHByICpzYW9wZXhwcjsKCUluZGV4Q2xhdXNlICppY2xhdXNlOwoJTGlzdENlbGwg ICAqbGM7CgoJLyogRm9yZ2V0IGl0IGlmIGluZGV4IGRvZXNuJ3Qgc3VwcG9ydCBTQU9QIGNs YXVzZXMgKi8KCWlmICghaW5kZXgtPmFtc2VhcmNoYXJyYXkpCgkJcmV0dXJuIE5VTEw7CgoJ LyoKCSAqIFRyeSB0byBjb252ZXJ0IGEgbGlzdCBvZiBPUi1jbGF1c2VzIHRvIGEgc2luZ2xl IFNBT1AgZXhwcmVzc2lvbi4gRWFjaAoJICogT1IgZW50cnkgbXVzdCBiZSBpbiB0aGUgZm9y bTogKGluZGV4a2V5IG9wZXJhdG9yIGNvbnN0YW50KSBvciAoY29uc3RhbnQKCSAqIG9wZXJh dG9yIGluZGV4a2V5KS4gIE9wZXJhdG9ycyBvZiBhbGwgdGhlIGVudHJpZXMgbXVzdCBtYXRj aC4gIE9uCgkgKiBkaXNjb3Zlcnkgb2YgYW55dGhpbmcgdW5zdXBwb3J0ZWQsIHdlIGdpdmUg dXAgYnkgYnJlYWtpbmcgb3V0IG9mIHRoZQoJICogbG9vcCBpbW1lZGlhdGVseSBhbmQgcmV0 dXJuaW5nIE5VTEwuCgkgKi8KCWZvcmVhY2gobGMsIG9yY2xhdXNlLT5hcmdzKQoJewoJCVJl c3RyaWN0SW5mbyAqc3ViUmluZm8gPSAoUmVzdHJpY3RJbmZvICopIGxmaXJzdChsYyk7CgkJ T3BFeHByCSAgICpzdWJDbGF1c2U7CgkJT2lkCQkJb3BubzsKCQlOb2RlCSAgICpsZWZ0b3As CgkJCQkgICAqcmlnaHRvcDsKCQlOb2RlCSAgICpjb25zdEV4cHI7CgoJCS8qIElmIGl0J3Mg bm90IGEgUmVzdHJpY3RJbmZvIChpLmUuIGl0J3MgYSBzdWItQU5EKSwgd2UgY2FuJ3QgdXNl IGl0ICovCgkJaWYgKCFJc0Eoc3ViUmluZm8sIFJlc3RyaWN0SW5mbykpCgkJCWJyZWFrOwoK CQkvKiBPbmx5IG9wZXJhdG9yIGNsYXVzZXMgY2FuIG1hdGNoICovCgkJaWYgKCFJc0Eoc3Vi UmluZm8tPmNsYXVzZSwgT3BFeHByKSkKCQkJYnJlYWs7CgoJCXN1YkNsYXVzZSA9IChPcEV4 cHIgKikgc3ViUmluZm8tPmNsYXVzZTsKCQlvcG5vID0gc3ViQ2xhdXNlLT5vcG5vOwoKCQkv KiBPbmx5IGJpbmFyeSBvcGVyYXRvcnMgY2FuIG1hdGNoICovCgkJaWYgKGxpc3RfbGVuZ3Ro KHN1YkNsYXVzZS0+YXJncykgIT0gMikKCQkJYnJlYWs7CgoJCS8qCgkJICogQ2hlY2sgZm9y IGNsYXVzZXMgb2YgdGhlIGZvcm06IChpbmRleGtleSBvcGVyYXRvciBjb25zdGFudCkgb3IK CQkgKiAoY29uc3RhbnQgb3BlcmF0b3IgaW5kZXhrZXkpLiAgVGhlc2UgdGVzdHMgc2hvdWxk IGFncmVlIHdpdGgKCQkgKiBtYXRjaF9vcGNsYXVzZV90b19pbmRleGNvbC4KCQkgKi8KCQls ZWZ0b3AgPSAoTm9kZSAqKSBsaW5pdGlhbChzdWJDbGF1c2UtPmFyZ3MpOwoJCXJpZ2h0b3Ag PSAoTm9kZSAqKSBsc2Vjb25kKHN1YkNsYXVzZS0+YXJncyk7CgkJaWYgKG1hdGNoX2luZGV4 X3RvX29wZXJhbmQobGVmdG9wLCBpbmRleGNvbCwgaW5kZXgpICYmCgkJCSFibXNfaXNfbWVt YmVyKGluZGV4UmVsaWQsIHN1YlJpbmZvLT5yaWdodF9yZWxpZHMpICYmCgkJCSFjb250YWlu X3ZvbGF0aWxlX2Z1bmN0aW9ucyhyaWdodG9wKSkKCQl7CgkJCWluZGV4RXhwciA9IGxlZnRv cDsKCQkJY29uc3RFeHByID0gcmlnaHRvcDsKCQl9CgkJZWxzZSBpZiAobWF0Y2hfaW5kZXhf dG9fb3BlcmFuZChyaWdodG9wLCBpbmRleGNvbCwgaW5kZXgpICYmCgkJCQkgIWJtc19pc19t ZW1iZXIoaW5kZXhSZWxpZCwgc3ViUmluZm8tPmxlZnRfcmVsaWRzKSAmJgoJCQkJICFjb250 YWluX3ZvbGF0aWxlX2Z1bmN0aW9ucyhsZWZ0b3ApKQoJCXsKCQkJb3BubyA9IGdldF9jb21t dXRhdG9yKG9wbm8pOwoJCQlpZiAoIU9pZElzVmFsaWQob3BubykpCgkJCXsKCQkJCS8qIGNv bW11dGF0b3IgZG9lc24ndCBleGlzdCwgd2UgY2FuJ3QgcmV2ZXJzZSB0aGUgb3JkZXIgKi8K CQkJCWJyZWFrOwoJCQl9CgkJCWluZGV4RXhwciA9IHJpZ2h0b3A7CgkJCWNvbnN0RXhwciA9 IGxlZnRvcDsKCQl9CgkJZWxzZQoJCXsKCQkJYnJlYWs7CgkJfQoKCQkvKgoJCSAqIFNhdmUg aW5mb3JtYXRpb24gYWJvdXQgdGhlIG9wZXJhdG9yLCB0eXBlLCBhbmQgY29sbGF0aW9uIGZv ciB0aGUKCQkgKiBmaXJzdCBtYXRjaGluZyBxdWFsLiAgVGhlbiwgY2hlY2sgdGhhdCBzdWJz ZXF1ZW50IHF1YWxzIG1hdGNoIHRoZQoJCSAqIGZpcnN0LgoJCSAqLwoJCWlmIChmaXJzdFRp bWUpCgkJewoJCQltYXRjaE9wbm8gPSBvcG5vOwoJCQljb25zdHR5cGUgPSBleHByVHlwZShj b25zdEV4cHIpOwoJCQlhcnJheXR5cGUgPSBnZXRfYXJyYXlfdHlwZShjb25zdHR5cGUpOwoJ CQlpbnB1dGNvbGxpZCA9IHN1YkNsYXVzZS0+aW5wdXRjb2xsaWQ7CgoJCQkvKgoJCQkgKiBD aGVjayB0aGF0IHRoZSBvcGVyYXRvciBpcyBwcmVzZW50ZWQgaW4gdGhlIG9wZmFtaWx5IGFu ZCB0aGF0CgkJCSAqIHRoZSBleHByZXNzaW9uIGNvbGxhdGlvbiBtYXRjaGVzIHRoZSBpbmRl eCBjb2xsYXRpb24uICBBbHNvLAoJCQkgKiB0aGVyZSBtdXN0IGJlIGFuIGFycmF5IHR5cGUg dG8gY29uc3RydWN0IGFuIGFycmF5IGxhdGVyLgoJCQkgKi8KCQkJaWYgKCFJbmRleENvbGxN YXRjaGVzRXhwckNvbGwoaW5kZXgtPmluZGV4Y29sbGF0aW9uc1tpbmRleGNvbF0sCgkJCQkJ CQkJCQkgIGlucHV0Y29sbGlkKSB8fAoJCQkJIW9wX2luX29wZmFtaWx5KG1hdGNoT3Bubywg aW5kZXgtPm9wZmFtaWx5W2luZGV4Y29sXSkgfHwKCQkJCSFPaWRJc1ZhbGlkKGFycmF5dHlw ZSkpCgkJCQlicmVhazsKCgkJCS8qCgkJCSAqIERpc2FsbG93IGlmIGVpdGhlciB0eXBlIGlz IFJFQ09SRCwgbWFpbmx5IGJlY2F1c2Ugd2UgY2FuJ3QgYmUKCQkJICogcG9zaXRpdmUgdGhh dCBhbGwgdGhlIFJIUyBleHByZXNzaW9ucyBhcmUgdGhlIHNhbWUgcmVjb3JkIHR5cGUuCgkJ CSAqLwoJCQlpZiAoY29uc3R0eXBlID09IFJFQ09SRE9JRCB8fCBleHByVHlwZShpbmRleEV4 cHIpID09IFJFQ09SRE9JRCkKCQkJCWJyZWFrOwoKCQkJZmlyc3RUaW1lID0gZmFsc2U7CgkJ fQoJCWVsc2UKCQl7CgkJCWlmIChtYXRjaE9wbm8gIT0gb3BubyB8fAoJCQkJaW5wdXRjb2xs aWQgIT0gc3ViQ2xhdXNlLT5pbnB1dGNvbGxpZCB8fAoJCQkJY29uc3R0eXBlICE9IGV4cHJU eXBlKGNvbnN0RXhwcikpCgkJCQlicmVhazsKCQl9CgoJCS8qCgkJICogVGhlIHJpZ2h0aGFu ZCBpbnB1dHMgZG9uJ3QgbmVjZXNzYXJpbHkgaGF2ZSB0byBiZSBwbGFpbiBDb25zdHMsIGJ1 dAoJCSAqIG1ha2VfU0FPUF9leHByIG5lZWRzIHRvIGtub3cgaWYgYW55IGFyZSBub3QuCgkJ ICovCgkJaWYgKCFJc0EoY29uc3RFeHByLCBDb25zdCkpCgkJCWhhdmVOb25Db25zdCA9IHRy dWU7CgoJCWNvbnN0cyA9IGxhcHBlbmQoY29uc3RzLCBjb25zdEV4cHIpOwoJfQoKCS8qCgkg KiBIYW5kbGUgZmFpbGVkIGNvbnZlcnNpb24gZnJvbSBicmVha2luZyBvdXQgb2YgdGhlIGxv b3AgYmVjYXVzZSBvZiBhbgoJICogdW5zdXBwb3J0ZWQgcXVhbC4gIEFsc28gY2hlY2sgdGhh dCB3ZSBoYXZlIGFuIGluZGV4RXhwciwganVzdCBpbiBjYXNlCgkgKiB0aGUgT1IgbGlzdCB3 YXMgc29tZWhvdyBlbXB0eSAoaXQgc2hvdWxkbid0IGJlKS4gIFJldHVybiBOVUxMIHRvCgkg KiBpbmRpY2F0ZSB0aGUgY29udmVyc2lvbiBmYWlsZWQuCgkgKi8KCWlmIChsYyAhPSBOVUxM IHx8IGluZGV4RXhwciA9PSBOVUxMKQoJewoJCWxpc3RfZnJlZShjb25zdHMpOwkJLyogbWln aHQgYXMgd2VsbCAqLwoJCXJldHVybiBOVUxMOwoJfQoKCS8qCgkgKiBCdWlsZCB0aGUgbmV3 IFNBT1Agbm9kZS4gIFdlIHVzZSB0aGUgaW5kZXhFeHByIGZyb20gdGhlIGxhc3QgT1IgYXJt OwoJICogc2luY2UgYWxsIHRoZSBhcm1zIHBhc3NlZCBtYXRjaF9pbmRleF90b19vcGVyYW5k LCBpdCBzaG91bGRuJ3QgbWF0dGVyCgkgKiB3aGljaCBvbmUgd2UgdXNlLiAgQnV0IHVzaW5n ICJpbnB1dGNvbGxpZCIgdHdpY2UgaXMgYSBiaXQgb2YgYSBjaGVhdDoKCSAqIHdlIG1pZ2h0 IGVuZCB1cCB3aXRoIGFuIGFycmF5IENvbnN0IG5vZGUgdGhhdCBpcyBsYWJlbGVkIHdpdGgg YQoJICogY29sbGF0aW9uIGRlc3BpdGUgaXRzIGVsZW1lbnRzIGJlaW5nIG9mIGEgbm9uY29s bGF0YWJsZSB0eXBlLiAgQnV0CgkgKiBub3RoaW5nIGlzIGxpa2VseSB0byBjb21wbGFpbiBh Ym91dCB0aGF0LCBzbyB3ZSBkb24ndCBib3RoZXIgYmVpbmcgbW9yZQoJICogYWNjdXJhdGUu CgkgKi8KCXNhb3BleHByID0gbWFrZV9TQU9QX2V4cHIobWF0Y2hPcG5vLCBpbmRleEV4cHIs IGNvbnN0dHlwZSwgaW5wdXRjb2xsaWQsCgkJCQkJCQkgIGlucHV0Y29sbGlkLCBjb25zdHMs IGhhdmVOb25Db25zdCk7CglBc3NlcnQoc2FvcGV4cHIgIT0gTlVMTCk7CgoJLyoKCSAqIEZp bmFsbHksIGJ1aWxkIGFuIEluZGV4Q2xhdXNlIGJhc2VkIG9uIHRoZSBTQU9QIG5vZGUuICBJ dCdzIG5vdCBsb3NzeS4KCSAqLwoJaWNsYXVzZSA9IG1ha2VOb2RlKEluZGV4Q2xhdXNlKTsK CWljbGF1c2UtPnJpbmZvID0gcmluZm87CglpY2xhdXNlLT5pbmRleHF1YWxzID0gbGlzdF9t YWtlMShtYWtlX3NpbXBsZV9yZXN0cmljdGluZm8ocm9vdCwKCQkJCQkJCQkJCQkJCQkJICAo RXhwciAqKSBzYW9wZXhwcikpOwoJaWNsYXVzZS0+bG9zc3kgPSBmYWxzZTsKCWljbGF1c2Ut PmluZGV4Y29sID0gaW5kZXhjb2w7CglpY2xhdXNlLT5pbmRleGNvbHMgPSBOSUw7CglyZXR1 cm4gaWNsYXVzZTsKfQoKLyoKICogZXhwYW5kX2luZGV4cXVhbF9yb3djb21wYXJlIC0tLSBl eHBhbmQgYSBzaW5nbGUgaW5kZXhxdWFsIGNvbmRpdGlvbgogKgkJdGhhdCBpcyBhIFJvd0Nv bXBhcmVFeHByCiAqCiAqIEl0J3MgYWxyZWFkeSBrbm93biB0aGF0IHRoZSBmaXJzdCBjb2x1 bW4gb2YgdGhlIHJvdyBjb21wYXJpc29uIG1hdGNoZXMKICogdGhlIHNwZWNpZmllZCBjb2x1 bW4gb2YgdGhlIGluZGV4LiAgV2UgY2FuIHVzZSBhZGRpdGlvbmFsIGNvbHVtbnMgb2YgdGhl CiAqIHJvdyBjb21wYXJpc29uIGFzIGluZGV4IHF1YWxpZmljYXRpb25zLCBzbyBsb25nIGFz IHRoZXkgbWF0Y2ggdGhlIGluZGV4CiAqIGluIHRoZSAic2FtZSBkaXJlY3Rpb24iLCBpZSwg dGhlIGluZGV4a2V5cyBhcmUgYWxsIG9uIHRoZSBzYW1lIHNpZGUgb2YgdGhlCiAqIGNsYXVz ZSBhbmQgdGhlIG9wZXJhdG9ycyBhcmUgYWxsIHRoZSBzYW1lLXR5cGUgbWVtYmVycyBvZiB0 aGUgb3BmYW1pbGllcy4KICoKICogSWYgYWxsIHRoZSBjb2x1bW5zIG9mIHRoZSBSb3dDb21w YXJlRXhwciBtYXRjaCBpbiB0aGlzIHdheSwgd2UganVzdCB1c2UgaXQKICogYXMtaXMsIGV4 Y2VwdCBmb3IgcG9zc2libHkgY29tbXV0aW5nIGl0IHRvIHB1dCB0aGUgaW5kZXhrZXlzIG9u IHRoZSBsZWZ0LgogKgogKiBPdGhlcndpc2UsIHdlIGJ1aWxkIGEgc2hvcnRlbmVkIFJvd0Nv bXBhcmVFeHByIChpZiBtb3JlIHRoYW4gb25lCiAqIGNvbHVtbiBtYXRjaGVzKSBvciBhIHNp bXBsZSBPcEV4cHIgKGlmIHRoZSBmaXJzdC1jb2x1bW4gbWF0Y2ggaXMgYWxsCiAqIHRoZXJl IGlzKS4gIEluIHRoZXNlIGNhc2VzIHRoZSBtb2RpZmllZCBjbGF1c2UgaXMgYWx3YXlzICI8 PSIgb3IgIj49IgogKiBldmVuIHdoZW4gdGhlIG9yaWdpbmFsIHdhcyAiPCIgb3IgIj4iIC0t LSB0aGlzIGlzIG5lY2Vzc2FyeSB0byBtYXRjaCBhbGwKICogdGhlIHJvd3MgdGhhdCBjb3Vs ZCBtYXRjaCB0aGUgb3JpZ2luYWwuICAoV2UgYXJlIGJ1aWxkaW5nIGEgbG9zc3kgdmVyc2lv bgogKiBvZiB0aGUgcm93IGNvbXBhcmlzb24gd2hlbiB3ZSBkbyB0aGlzLCBzbyB3ZSBzZXQg bG9zc3kgPSB0cnVlLikKICoKICogTm90ZTogdGhpcyBpcyByZWFsbHkganVzdCB0aGUgbGFz dCBoYWxmIG9mIG1hdGNoX3Jvd2NvbXBhcmVfdG9faW5kZXhjb2wsCiAqIGJ1dCB3ZSBzcGxp dCBpdCBvdXQgZm9yIGNvbXByZWhlbnNpYmlsaXR5LgogKi8Kc3RhdGljIEluZGV4Q2xhdXNl ICoKZXhwYW5kX2luZGV4cXVhbF9yb3djb21wYXJlKFBsYW5uZXJJbmZvICpyb290LAoJCQkJ CQkJUmVzdHJpY3RJbmZvICpyaW5mbywKCQkJCQkJCWludCBpbmRleGNvbCwKCQkJCQkJCUlu ZGV4T3B0SW5mbyAqaW5kZXgsCgkJCQkJCQlPaWQgZXhwcl9vcCwKCQkJCQkJCWJvb2wgdmFy X29uX2xlZnQpCnsKCUluZGV4Q2xhdXNlICppY2xhdXNlID0gbWFrZU5vZGUoSW5kZXhDbGF1 c2UpOwoJUm93Q29tcGFyZUV4cHIgKmNsYXVzZSA9IChSb3dDb21wYXJlRXhwciAqKSByaW5m by0+Y2xhdXNlOwoJaW50CQkJb3Bfc3RyYXRlZ3k7CglPaWQJCQlvcF9sZWZ0dHlwZTsKCU9p ZAkJCW9wX3JpZ2h0dHlwZTsKCWludAkJCW1hdGNoaW5nX2NvbHM7CglMaXN0CSAgICpleHBy X29wczsKCUxpc3QJICAgKm9wZmFtaWxpZXM7CglMaXN0CSAgICpsZWZ0dHlwZXM7CglMaXN0 CSAgICpyaWdodHR5cGVzOwoJTGlzdAkgICAqbmV3X29wczsKCUxpc3QJICAgKnZhcl9hcmdz OwoJTGlzdAkgICAqbm9uX3Zhcl9hcmdzOwoKCWljbGF1c2UtPnJpbmZvID0gcmluZm87Cglp Y2xhdXNlLT5pbmRleGNvbCA9IGluZGV4Y29sOwoKCWlmICh2YXJfb25fbGVmdCkKCXsKCQl2 YXJfYXJncyA9IGNsYXVzZS0+bGFyZ3M7CgkJbm9uX3Zhcl9hcmdzID0gY2xhdXNlLT5yYXJn czsKCX0KCWVsc2UKCXsKCQl2YXJfYXJncyA9IGNsYXVzZS0+cmFyZ3M7CgkJbm9uX3Zhcl9h cmdzID0gY2xhdXNlLT5sYXJnczsKCX0KCglnZXRfb3Bfb3BmYW1pbHlfcHJvcGVydGllcyhl eHByX29wLCBpbmRleC0+b3BmYW1pbHlbaW5kZXhjb2xdLCBmYWxzZSwKCQkJCQkJCSAgICZv cF9zdHJhdGVneSwKCQkJCQkJCSAgICZvcF9sZWZ0dHlwZSwKCQkJCQkJCSAgICZvcF9yaWdo dHR5cGUpOwoKCS8qIEluaXRpYWxpemUgcmV0dXJuZWQgbGlzdCBvZiB3aGljaCBpbmRleCBj b2x1bW5zIGFyZSB1c2VkICovCglpY2xhdXNlLT5pbmRleGNvbHMgPSBsaXN0X21ha2UxX2lu dChpbmRleGNvbCk7CgoJLyogQnVpbGQgbGlzdHMgb2Ygb3BzLCBvcGZhbWlsaWVzIGFuZCBv cGVyYXRvciBkYXRhdHlwZXMgaW4gY2FzZSBuZWVkZWQgKi8KCWV4cHJfb3BzID0gbGlzdF9t YWtlMV9vaWQoZXhwcl9vcCk7CglvcGZhbWlsaWVzID0gbGlzdF9tYWtlMV9vaWQoaW5kZXgt Pm9wZmFtaWx5W2luZGV4Y29sXSk7CglsZWZ0dHlwZXMgPSBsaXN0X21ha2UxX29pZChvcF9s ZWZ0dHlwZSk7CglyaWdodHR5cGVzID0gbGlzdF9tYWtlMV9vaWQob3BfcmlnaHR0eXBlKTsK CgkvKgoJICogU2VlIGhvdyBtYW55IG9mIHRoZSByZW1haW5pbmcgY29sdW1ucyBtYXRjaCBz b21lIGluZGV4IGNvbHVtbiBpbiB0aGUKCSAqIHNhbWUgd2F5LiAgQXMgaW4gbWF0Y2hfY2xh dXNlX3RvX2luZGV4Y29sKCksIHRoZSAib3RoZXIiIHNpZGUgb2YgYW55CgkgKiBwb3RlbnRp YWwgaW5kZXggY29uZGl0aW9uIGlzIE9LIGFzIGxvbmcgYXMgaXQgZG9lc24ndCB1c2UgVmFy cyBmcm9tIHRoZQoJICogaW5kZXhlZCByZWxhdGlvbi4KCSAqLwoJbWF0Y2hpbmdfY29scyA9 IDE7CgoJd2hpbGUgKG1hdGNoaW5nX2NvbHMgPCBsaXN0X2xlbmd0aCh2YXJfYXJncykpCgl7 CgkJTm9kZQkgICAqdmFyb3AgPSAoTm9kZSAqKSBsaXN0X250aCh2YXJfYXJncywgbWF0Y2hp bmdfY29scyk7CgkJTm9kZQkgICAqY29uc3RvcCA9IChOb2RlICopIGxpc3RfbnRoKG5vbl92 YXJfYXJncywgbWF0Y2hpbmdfY29scyk7CgkJaW50CQkJaTsKCgkJZXhwcl9vcCA9IGxpc3Rf bnRoX29pZChjbGF1c2UtPm9wbm9zLCBtYXRjaGluZ19jb2xzKTsKCQlpZiAoIXZhcl9vbl9s ZWZ0KQoJCXsKCQkJLyogaW5kZXhrZXkgaXMgb24gcmlnaHQsIHNvIGNvbW11dGUgdGhlIG9w ZXJhdG9yICovCgkJCWV4cHJfb3AgPSBnZXRfY29tbXV0YXRvcihleHByX29wKTsKCQkJaWYg KGV4cHJfb3AgPT0gSW52YWxpZE9pZCkKCQkJCWJyZWFrOwkJCS8qIG9wZXJhdG9yIGlzIG5v dCB1c2FibGUgKi8KCQl9CgkJaWYgKGJtc19pc19tZW1iZXIoaW5kZXgtPnJlbC0+cmVsaWQs IHB1bGxfdmFybm9zKHJvb3QsIGNvbnN0b3ApKSkKCQkJYnJlYWs7CQkJCS8qIG5vIGdvb2Qs IFZhciBvbiB3cm9uZyBzaWRlICovCgkJaWYgKGNvbnRhaW5fdm9sYXRpbGVfZnVuY3Rpb25z KGNvbnN0b3ApKQoJCQlicmVhazsJCQkJLyogbm8gZ29vZCwgdm9sYXRpbGUgY29tcGFyaXNv biB2YWx1ZSAqLwoKCQkvKgoJCSAqIFRoZSBWYXIgc2lkZSBjYW4gbWF0Y2ggYW55IGtleSBj b2x1bW4gb2YgdGhlIGluZGV4LgoJCSAqLwoJCWZvciAoaSA9IDA7IGkgPCBpbmRleC0+bmtl eWNvbHVtbnM7IGkrKykKCQl7CgkJCWlmIChtYXRjaF9pbmRleF90b19vcGVyYW5kKHZhcm9w LCBpLCBpbmRleCkgJiYKCQkJCWdldF9vcF9vcGZhbWlseV9zdHJhdGVneShleHByX29wLAoJ CQkJCQkJCQkJIGluZGV4LT5vcGZhbWlseVtpXSkgPT0gb3Bfc3RyYXRlZ3kgJiYKCQkJCUlu ZGV4Q29sbE1hdGNoZXNFeHByQ29sbChpbmRleC0+aW5kZXhjb2xsYXRpb25zW2ldLAoJCQkJ CQkJCQkJIGxpc3RfbnRoX29pZChjbGF1c2UtPmlucHV0Y29sbGlkcywKCQkJCQkJCQkJCQkJ CSAgbWF0Y2hpbmdfY29scykpKQoJCQkJYnJlYWs7CgkJfQoJCWlmIChpID49IGluZGV4LT5u a2V5Y29sdW1ucykKCQkJYnJlYWs7CQkJCS8qIG5vIG1hdGNoIGZvdW5kICovCgoJCS8qIEFk ZCBjb2x1bW4gbnVtYmVyIHRvIHJldHVybmVkIGxpc3QgKi8KCQlpY2xhdXNlLT5pbmRleGNv bHMgPSBsYXBwZW5kX2ludChpY2xhdXNlLT5pbmRleGNvbHMsIGkpOwoKCQkvKiBBZGQgb3Bl cmF0b3IgaW5mbyB0byBsaXN0cyAqLwoJCWdldF9vcF9vcGZhbWlseV9wcm9wZXJ0aWVzKGV4 cHJfb3AsIGluZGV4LT5vcGZhbWlseVtpXSwgZmFsc2UsCgkJCQkJCQkJICAgJm9wX3N0cmF0 ZWd5LAoJCQkJCQkJCSAgICZvcF9sZWZ0dHlwZSwKCQkJCQkJCQkgICAmb3BfcmlnaHR0eXBl KTsKCQlleHByX29wcyA9IGxhcHBlbmRfb2lkKGV4cHJfb3BzLCBleHByX29wKTsKCQlvcGZh bWlsaWVzID0gbGFwcGVuZF9vaWQob3BmYW1pbGllcywgaW5kZXgtPm9wZmFtaWx5W2ldKTsK CQlsZWZ0dHlwZXMgPSBsYXBwZW5kX29pZChsZWZ0dHlwZXMsIG9wX2xlZnR0eXBlKTsKCQly aWdodHR5cGVzID0gbGFwcGVuZF9vaWQocmlnaHR0eXBlcywgb3BfcmlnaHR0eXBlKTsKCgkJ LyogVGhpcyBjb2x1bW4gbWF0Y2hlcywga2VlcCBzY2FubmluZyAqLwoJCW1hdGNoaW5nX2Nv bHMrKzsKCX0KCgkvKiBSZXN1bHQgaXMgbm9uLWxvc3N5IGlmIGFsbCBjb2x1bW5zIGFyZSB1 c2FibGUgYXMgaW5kZXggcXVhbHMgKi8KCWljbGF1c2UtPmxvc3N5ID0gKG1hdGNoaW5nX2Nv bHMgIT0gbGlzdF9sZW5ndGgoY2xhdXNlLT5vcG5vcykpOwoKCS8qCgkgKiBXZSBjYW4gdXNl IHJpbmZvLT5jbGF1c2UgYXMtaXMgaWYgd2UgaGF2ZSB2YXIgb24gbGVmdCBhbmQgaXQncyBh bGwKCSAqIHVzYWJsZSBhcyBpbmRleCBxdWFscy4KCSAqLwoJaWYgKHZhcl9vbl9sZWZ0ICYm ICFpY2xhdXNlLT5sb3NzeSkKCQlpY2xhdXNlLT5pbmRleHF1YWxzID0gbGlzdF9tYWtlMShy aW5mbyk7CgllbHNlCgl7CgkJLyoKCQkgKiBXZSBoYXZlIHRvIGdlbmVyYXRlIGEgbW9kaWZp ZWQgcm93Y29tcGFyZSAocG9zc2libHkganVzdCBvbmUKCQkgKiBPcEV4cHIpLiAgVGhlIHBh aW5mdWwgcGFydCBvZiB0aGlzIGlzIGNoYW5naW5nIDwgdG8gPD0gb3IgPiB0byA+PSwKCQkg KiBzbyBkZWFsIHdpdGggdGhhdCBmaXJzdC4KCQkgKi8KCQlpZiAoIWljbGF1c2UtPmxvc3N5 KQoJCXsKCQkJLyogdmVyeSBlYXN5LCBqdXN0IHVzZSB0aGUgY29tbXV0ZWQgb3BlcmF0b3Jz ICovCgkJCW5ld19vcHMgPSBleHByX29wczsKCQl9CgkJZWxzZSBpZiAob3Bfc3RyYXRlZ3kg PT0gQlRMZXNzRXF1YWxTdHJhdGVneU51bWJlciB8fAoJCQkJIG9wX3N0cmF0ZWd5ID09IEJU R3JlYXRlckVxdWFsU3RyYXRlZ3lOdW1iZXIpCgkJewoJCQkvKiBlYXN5LCBqdXN0IHVzZSB0 aGUgc2FtZSAocG9zc2libHkgY29tbXV0ZWQpIG9wZXJhdG9ycyAqLwoJCQluZXdfb3BzID0g bGlzdF90cnVuY2F0ZShleHByX29wcywgbWF0Y2hpbmdfY29scyk7CgkJfQoJCWVsc2UKCQl7 CgkJCUxpc3RDZWxsICAgKm9wZmFtaWxpZXNfY2VsbDsKCQkJTGlzdENlbGwgICAqbGVmdHR5 cGVzX2NlbGw7CgkJCUxpc3RDZWxsICAgKnJpZ2h0dHlwZXNfY2VsbDsKCgkJCWlmIChvcF9z dHJhdGVneSA9PSBCVExlc3NTdHJhdGVneU51bWJlcikKCQkJCW9wX3N0cmF0ZWd5ID0gQlRM ZXNzRXF1YWxTdHJhdGVneU51bWJlcjsKCQkJZWxzZSBpZiAob3Bfc3RyYXRlZ3kgPT0gQlRH cmVhdGVyU3RyYXRlZ3lOdW1iZXIpCgkJCQlvcF9zdHJhdGVneSA9IEJUR3JlYXRlckVxdWFs U3RyYXRlZ3lOdW1iZXI7CgkJCWVsc2UKCQkJCWVsb2coRVJST1IsICJ1bmV4cGVjdGVkIHN0 cmF0ZWd5IG51bWJlciAlZCIsIG9wX3N0cmF0ZWd5KTsKCQkJbmV3X29wcyA9IE5JTDsKCQkJ Zm9ydGhyZWUob3BmYW1pbGllc19jZWxsLCBvcGZhbWlsaWVzLAoJCQkJCSBsZWZ0dHlwZXNf Y2VsbCwgbGVmdHR5cGVzLAoJCQkJCSByaWdodHR5cGVzX2NlbGwsIHJpZ2h0dHlwZXMpCgkJ CXsKCQkJCU9pZAkJCW9wZmFtID0gbGZpcnN0X29pZChvcGZhbWlsaWVzX2NlbGwpOwoJCQkJ T2lkCQkJbGVmdHR5cGUgPSBsZmlyc3Rfb2lkKGxlZnR0eXBlc19jZWxsKTsKCQkJCU9pZAkJ CXJpZ2h0dHlwZSA9IGxmaXJzdF9vaWQocmlnaHR0eXBlc19jZWxsKTsKCgkJCQlleHByX29w ID0gZ2V0X29wZmFtaWx5X21lbWJlcihvcGZhbSwgbGVmdHR5cGUsIHJpZ2h0dHlwZSwKCQkJ CQkJCQkJCQkgIG9wX3N0cmF0ZWd5KTsKCQkJCWlmICghT2lkSXNWYWxpZChleHByX29wKSkJ Lyogc2hvdWxkIG5vdCBoYXBwZW4gKi8KCQkJCQllbG9nKEVSUk9SLCAibWlzc2luZyBvcGVy YXRvciAlZCgldSwldSkgaW4gb3BmYW1pbHkgJXUiLAoJCQkJCQkgb3Bfc3RyYXRlZ3ksIGxl ZnR0eXBlLCByaWdodHR5cGUsIG9wZmFtKTsKCQkJCW5ld19vcHMgPSBsYXBwZW5kX29pZChu ZXdfb3BzLCBleHByX29wKTsKCQkJfQoJCX0KCgkJLyogSWYgd2UgaGF2ZSBtb3JlIHRoYW4g b25lIG1hdGNoaW5nIGNvbCwgY3JlYXRlIGEgc3Vic2V0IHJvd2NvbXBhcmUgKi8KCQlpZiAo bWF0Y2hpbmdfY29scyA+IDEpCgkJewoJCQlSb3dDb21wYXJlRXhwciAqcmMgPSBtYWtlTm9k ZShSb3dDb21wYXJlRXhwcik7CgoJCQlyYy0+Y21wdHlwZSA9IChDb21wYXJlVHlwZSkgb3Bf c3RyYXRlZ3k7CgkJCXJjLT5vcG5vcyA9IG5ld19vcHM7CgkJCXJjLT5vcGZhbWlsaWVzID0g bGlzdF9jb3B5X2hlYWQoY2xhdXNlLT5vcGZhbWlsaWVzLAoJCQkJCQkJCQkJCW1hdGNoaW5n X2NvbHMpOwoJCQlyYy0+aW5wdXRjb2xsaWRzID0gbGlzdF9jb3B5X2hlYWQoY2xhdXNlLT5p bnB1dGNvbGxpZHMsCgkJCQkJCQkJCQkJICBtYXRjaGluZ19jb2xzKTsKCQkJcmMtPmxhcmdz ID0gbGlzdF9jb3B5X2hlYWQodmFyX2FyZ3MsIG1hdGNoaW5nX2NvbHMpOwoJCQlyYy0+cmFy Z3MgPSBsaXN0X2NvcHlfaGVhZChub25fdmFyX2FyZ3MsIG1hdGNoaW5nX2NvbHMpOwoJCQlp Y2xhdXNlLT5pbmRleHF1YWxzID0gbGlzdF9tYWtlMShtYWtlX3NpbXBsZV9yZXN0cmljdGlu Zm8ocm9vdCwKCQkJCQkJCQkJCQkJCQkJCQkgIChFeHByICopIHJjKSk7CgkJfQoJCWVsc2UK CQl7CgkJCUV4cHIJICAgKm9wOwoKCQkJLyogV2UgZG9uJ3QgcmVwb3J0IGFuIGluZGV4IGNv bHVtbiBsaXN0IGluIHRoaXMgY2FzZSAqLwoJCQlpY2xhdXNlLT5pbmRleGNvbHMgPSBOSUw7 CgoJCQlvcCA9IG1ha2Vfb3BjbGF1c2UobGluaXRpYWxfb2lkKG5ld19vcHMpLCBCT09MT0lE LCBmYWxzZSwKCQkJCQkJCSAgIGNvcHlPYmplY3QobGluaXRpYWwodmFyX2FyZ3MpKSwKCQkJ CQkJCSAgIGNvcHlPYmplY3QobGluaXRpYWwobm9uX3Zhcl9hcmdzKSksCgkJCQkJCQkgICBJ bnZhbGlkT2lkLAoJCQkJCQkJICAgbGluaXRpYWxfb2lkKGNsYXVzZS0+aW5wdXRjb2xsaWRz KSk7CgkJCWljbGF1c2UtPmluZGV4cXVhbHMgPSBsaXN0X21ha2UxKG1ha2Vfc2ltcGxlX3Jl c3RyaWN0aW5mbyhyb290LCBvcCkpOwoJCX0KCX0KCglyZXR1cm4gaWNsYXVzZTsKfQoKCi8q KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqCiAqCQkJCS0tLS0gIFJPVVRJTkVTIFRPIENIRUNLIE9S REVSSU5HIE9QRVJBVE9SUwktLS0tCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKLyoKICog bWF0Y2hfcGF0aGtleXNfdG9faW5kZXgKICoJCUZvciB0aGUgZ2l2ZW4gJ2luZGV4JyBhbmQg J3BhdGhrZXlzJywgb3V0cHV0IGEgbGlzdCBvZiBzdWl0YWJsZSBPUkRFUgogKgkJQlkgZXhw cmVzc2lvbnMsIGVhY2ggb2YgdGhlIGZvcm0gImluZGV4ZWRjb2wgb3BlcmF0b3IgcHNldWRv Y29uc3RhbnQiLAogKgkJYWxvbmcgd2l0aCBhbiBpbnRlZ2VyIGxpc3Qgb2YgdGhlIGluZGV4 IGNvbHVtbiBudW1iZXJzICh6ZXJvIGJhc2VkKQogKgkJdGhhdCBlYWNoIGNsYXVzZSB3b3Vs ZCBiZSB1c2VkIHdpdGguCiAqCiAqIFRoaXMgYXR0ZW1wdHMgdG8gZmluZCBhbiBPUkRFUiBC WSBhbmQgaW5kZXggY29sdW1uIG51bWJlciBmb3IgYWxsIGl0ZW1zIGluCiAqIHRoZSBwYXRo a2V5IGxpc3QsIGhvd2V2ZXIsIGlmIHdlJ3JlIHVuYWJsZSB0byBtYXRjaCBhbnkgZ2l2ZW4g cGF0aGtleSB0byBhbgogKiBpbmRleCBjb2x1bW4sIHdlIHJldHVybiBqdXN0IHRoZSBvbmVz IG1hdGNoZWQgYnkgdGhlIGZ1bmN0aW9uIHNvIGZhci4gIFRoaXMKICogYWxsb3dzIGNhbGxl cnMgd2hvIGFyZSBpbnRlcmVzdGVkIGluIHBhcnRpYWwgbWF0Y2hlcyB0byBnZXQgdGhlbS4g IENhbGxlcnMKICogY2FuIGRldGVybWluZSBhIHBhcnRpYWwgbWF0Y2ggdnMgYSBmdWxsIG1h dGNoIGJ5IGNoZWNraW5nIHRoZSBvdXRwdXR0ZWQKICogbGlzdCBsZW5ndGhzLiAgQSBmdWxs IG1hdGNoIHdpbGwgaGF2ZSBvbmUgaXRlbSBpbiB0aGUgb3V0cHV0IGxpc3RzIGZvciBlYWNo CiAqIGl0ZW0gaW4gdGhlIGdpdmVuICdwYXRoa2V5cycgbGlzdC4KICovCnN0YXRpYyB2b2lk Cm1hdGNoX3BhdGhrZXlzX3RvX2luZGV4KEluZGV4T3B0SW5mbyAqaW5kZXgsIExpc3QgKnBh dGhrZXlzLAoJCQkJCQlMaXN0ICoqb3JkZXJieV9jbGF1c2VzX3AsCgkJCQkJCUxpc3QgKipj bGF1c2VfY29sdW1uc19wKQp7CglMaXN0Q2VsbCAgICpsYzE7CgoJKm9yZGVyYnlfY2xhdXNl c19wID0gTklMOwkvKiBzZXQgZGVmYXVsdCByZXN1bHRzICovCgkqY2xhdXNlX2NvbHVtbnNf cCA9IE5JTDsKCgkvKiBPbmx5IGluZGV4ZXMgd2l0aCB0aGUgYW1jYW5vcmRlcmJ5b3AgcHJv cGVydHkgYXJlIGludGVyZXN0aW5nIGhlcmUgKi8KCWlmICghaW5kZXgtPmFtY2Fub3JkZXJi eW9wKQoJCXJldHVybjsKCglmb3JlYWNoKGxjMSwgcGF0aGtleXMpCgl7CgkJUGF0aEtleSAg ICAqcGF0aGtleSA9IChQYXRoS2V5ICopIGxmaXJzdChsYzEpOwoJCWJvb2wJCWZvdW5kID0g ZmFsc2U7CgkJRXF1aXZhbGVuY2VNZW1iZXJJdGVyYXRvciBpdDsKCQlFcXVpdmFsZW5jZU1l bWJlciAqbWVtYmVyOwoKCgkJLyogUGF0aGtleSBtdXN0IHJlcXVlc3QgZGVmYXVsdCBzb3J0 IG9yZGVyIGZvciB0aGUgdGFyZ2V0IG9wZmFtaWx5ICovCgkJaWYgKHBhdGhrZXktPnBrX2Nt cHR5cGUgIT0gQ09NUEFSRV9MVCB8fCBwYXRoa2V5LT5wa19udWxsc19maXJzdCkKCQkJcmV0 dXJuOwoKCQkvKiBJZiBlY2xhc3MgaXMgdm9sYXRpbGUsIG5vIGhvcGUgb2YgdXNpbmcgYW4g aW5kZXhzY2FuICovCgkJaWYgKHBhdGhrZXktPnBrX2VjbGFzcy0+ZWNfaGFzX3ZvbGF0aWxl KQoJCQlyZXR1cm47CgoJCS8qCgkJICogVHJ5IHRvIG1hdGNoIGVjbGFzcyBtZW1iZXIgZXhw cmVzc2lvbihzKSB0byBpbmRleC4gIE5vdGUgdGhhdCBjaGlsZAoJCSAqIEVDIG1lbWJlcnMg YXJlIGNvbnNpZGVyZWQsIGJ1dCBvbmx5IHdoZW4gdGhleSBiZWxvbmcgdG8gdGhlIHRhcmdl dAoJCSAqIHJlbGF0aW9uLiAgKFVubGlrZSByZWd1bGFyIG1lbWJlcnMsIHRoZSBzYW1lIGV4 cHJlc3Npb24gY291bGQgYmUgYQoJCSAqIGNoaWxkIG1lbWJlciBvZiBtb3JlIHRoYW4gb25l IEVDLiAgVGhlcmVmb3JlLCB0aGUgc2FtZSBpbmRleCBjb3VsZAoJCSAqIGJlIGNvbnNpZGVy ZWQgdG8gbWF0Y2ggbW9yZSB0aGFuIG9uZSBwYXRoa2V5IGxpc3QsIHdoaWNoIGlzIE9LCgkJ ICogaGVyZS4gIFNlZSBhbHNvIGdldF9lY2xhc3NfZm9yX3NvcnRfZXhwci4pCgkJICovCgkJ c2V0dXBfZWNsYXNzX21lbWJlcl9pdGVyYXRvcigmaXQsIHBhdGhrZXktPnBrX2VjbGFzcywK CQkJCQkJCQkJIGluZGV4LT5yZWwtPnJlbGlkcyk7CgkJd2hpbGUgKChtZW1iZXIgPSBlY2xh c3NfbWVtYmVyX2l0ZXJhdG9yX25leHQoJml0KSkgIT0gTlVMTCkKCQl7CgkJCWludAkJCWlu ZGV4Y29sOwoKCQkJLyogTm8gcG9zc2liaWxpdHkgb2YgbWF0Y2ggaWYgaXQgcmVmZXJlbmNl cyBvdGhlciByZWxhdGlvbnMgKi8KCQkJaWYgKCFibXNfZXF1YWwobWVtYmVyLT5lbV9yZWxp ZHMsIGluZGV4LT5yZWwtPnJlbGlkcykpCgkJCQljb250aW51ZTsKCgkJCS8qCgkJCSAqIFdl IGFsbG93IGFueSBjb2x1bW4gb2YgdGhlIGluZGV4IHRvIG1hdGNoIGVhY2ggcGF0aGtleTsg dGhleQoJCQkgKiBkb24ndCBoYXZlIHRvIG1hdGNoIGxlZnQtdG8tcmlnaHQgYXMgeW91IG1p Z2h0IGV4cGVjdC4gIFRoaXMgaXMKCQkJICogY29ycmVjdCBmb3IgR2lTVCwgYW5kIGl0IGRv ZXNuJ3QgbWF0dGVyIGZvciBTUC1HaVNUIGJlY2F1c2UKCQkJICogdGhhdCBkb2Vzbid0IGhh bmRsZSBtdWx0aXBsZSBjb2x1bW5zIGFueXdheSwgYW5kIG5vIG90aGVyCgkJCSAqIGV4aXN0 aW5nIEFNcyBzdXBwb3J0IGFtY2Fub3JkZXJieW9wLiAgV2UgbWlnaHQgbmVlZCBkaWZmZXJl bnQKCQkJICogbG9naWMgaW4gZnV0dXJlIGZvciBvdGhlciBpbXBsZW1lbnRhdGlvbnMuCgkJ CSAqLwoJCQlmb3IgKGluZGV4Y29sID0gMDsgaW5kZXhjb2wgPCBpbmRleC0+bmtleWNvbHVt bnM7IGluZGV4Y29sKyspCgkJCXsKCQkJCUV4cHIJICAgKmV4cHI7CgoJCQkJZXhwciA9IG1h dGNoX2NsYXVzZV90b19vcmRlcmluZ19vcChpbmRleCwKCQkJCQkJCQkJCQkJICAgaW5kZXhj b2wsCgkJCQkJCQkJCQkJCSAgIG1lbWJlci0+ZW1fZXhwciwKCQkJCQkJCQkJCQkJICAgcGF0 aGtleS0+cGtfb3BmYW1pbHkpOwoJCQkJaWYgKGV4cHIpCgkJCQl7CgkJCQkJKm9yZGVyYnlf Y2xhdXNlc19wID0gbGFwcGVuZCgqb3JkZXJieV9jbGF1c2VzX3AsIGV4cHIpOwoJCQkJCSpj bGF1c2VfY29sdW1uc19wID0gbGFwcGVuZF9pbnQoKmNsYXVzZV9jb2x1bW5zX3AsIGluZGV4 Y29sKTsKCQkJCQlmb3VuZCA9IHRydWU7CgkJCQkJYnJlYWs7CgkJCQl9CgkJCX0KCgkJCWlm IChmb3VuZCkJCQkvKiBkb24ndCB3YW50IHRvIGxvb2sgYXQgcmVtYWluaW5nIG1lbWJlcnMg Ki8KCQkJCWJyZWFrOwoJCX0KCgkJLyoKCQkgKiBSZXR1cm4gdGhlIG1hdGNoZXMgZm91bmQg c28gZmFyIHdoZW4gdGhpcyBwYXRoa2V5IGNvdWxkbid0IGJlCgkJICogbWF0Y2hlZCB0byB0 aGUgaW5kZXguCgkJICovCgkJaWYgKCFmb3VuZCkKCQkJcmV0dXJuOwoJfQp9CgovKgogKiBt YXRjaF9jbGF1c2VfdG9fb3JkZXJpbmdfb3AKICoJICBEZXRlcm1pbmVzIHdoZXRoZXIgYW4g b3JkZXJpbmcgb3BlcmF0b3IgZXhwcmVzc2lvbiBtYXRjaGVzIGFuCiAqCSAgaW5kZXggY29s dW1uLgogKgogKgkgIFRoaXMgaXMgc2ltaWxhciB0bywgYnV0IHNpbXBsZXIgdGhhbiwgbWF0 Y2hfY2xhdXNlX3RvX2luZGV4Y29sLgogKgkgIFdlIG9ubHkgY2FyZSBhYm91dCBzaW1wbGUg T3BFeHByIGNhc2VzLiAgVGhlIGlucHV0IGlzIGEgYmFyZQogKgkgIGV4cHJlc3Npb24gdGhh dCBpcyBiZWluZyBvcmRlcmVkIGJ5LCB3aGljaCBtdXN0IGJlIG9mIHRoZSBmb3JtCiAqCSAg KGluZGV4a2V5IG9wIGNvbnN0KSBvciAoY29uc3Qgb3AgaW5kZXhrZXkpIHdoZXJlIG9wIGlz IGFuIG9yZGVyaW5nCiAqCSAgb3BlcmF0b3IgZm9yIHRoZSBjb2x1bW4ncyBvcGZhbWlseS4K ICoKICogJ2luZGV4JyBpcyB0aGUgaW5kZXggb2YgaW50ZXJlc3QuCiAqICdpbmRleGNvbCcg aXMgYSBjb2x1bW4gbnVtYmVyIG9mICdpbmRleCcgKGNvdW50aW5nIGZyb20gMCkuCiAqICdj bGF1c2UnIGlzIHRoZSBvcmRlcmluZyBleHByZXNzaW9uIHRvIGJlIHRlc3RlZC4KICogJ3Br X29wZmFtaWx5JyBpcyB0aGUgYnRyZWUgb3BmYW1pbHkgZGVzY3JpYmluZyB0aGUgcmVxdWly ZWQgc29ydCBvcmRlci4KICoKICogTm90ZSB0aGF0IHdlIGN1cnJlbnRseSBkbyBub3QgY29u c2lkZXIgdGhlIGNvbGxhdGlvbiBvZiB0aGUgb3JkZXJpbmcKICogb3BlcmF0b3IncyByZXN1 bHQuICBJbiBwcmFjdGljYWwgY2FzZXMgdGhlIHJlc3VsdCB0eXBlIHdpbGwgYmUgbnVtZXJp YwogKiBhbmQgdGh1cyBoYXZlIG5vIGNvbGxhdGlvbiwgYW5kIGl0J3Mgbm90IHZlcnkgY2xl YXIgd2hhdCB0byBtYXRjaCB0bwogKiBpZiBpdCBkaWQgaGF2ZSBhIGNvbGxhdGlvbi4gIFRo ZSBpbmRleCdzIGNvbGxhdGlvbiBzaG91bGQgbWF0Y2ggdGhlCiAqIG9yZGVyaW5nIG9wZXJh dG9yJ3MgaW5wdXQgY29sbGF0aW9uLCBub3QgaXRzIHJlc3VsdC4KICoKICogSWYgc3VjY2Vz c2Z1bCwgcmV0dXJuICdjbGF1c2UnIGFzLWlzIGlmIHRoZSBpbmRleGtleSBpcyBvbiB0aGUg bGVmdCwKICogb3RoZXJ3aXNlIGEgY29tbXV0ZWQgY29weSBvZiAnY2xhdXNlJy4gIElmIG5v IG1hdGNoLCByZXR1cm4gTlVMTC4KICovCnN0YXRpYyBFeHByICoKbWF0Y2hfY2xhdXNlX3Rv X29yZGVyaW5nX29wKEluZGV4T3B0SW5mbyAqaW5kZXgsCgkJCQkJCQlpbnQgaW5kZXhjb2ws CgkJCQkJCQlFeHByICpjbGF1c2UsCgkJCQkJCQlPaWQgcGtfb3BmYW1pbHkpCnsKCU9pZAkJ CW9wZmFtaWx5OwoJT2lkCQkJaWR4Y29sbGF0aW9uOwoJTm9kZQkgICAqbGVmdG9wLAoJCQkg ICAqcmlnaHRvcDsKCU9pZAkJCWV4cHJfb3A7CglPaWQJCQlleHByX2NvbGw7CglPaWQJCQlz b3J0ZmFtaWx5OwoJYm9vbAkJY29tbXV0ZWQ7CgoJQXNzZXJ0KGluZGV4Y29sIDwgaW5kZXgt Pm5rZXljb2x1bW5zKTsKCglvcGZhbWlseSA9IGluZGV4LT5vcGZhbWlseVtpbmRleGNvbF07 CglpZHhjb2xsYXRpb24gPSBpbmRleC0+aW5kZXhjb2xsYXRpb25zW2luZGV4Y29sXTsKCgkv KgoJICogQ2xhdXNlIG11c3QgYmUgYSBiaW5hcnkgb3BjbGF1c2UuCgkgKi8KCWlmICghaXNf b3BjbGF1c2UoY2xhdXNlKSkKCQlyZXR1cm4gTlVMTDsKCWxlZnRvcCA9IGdldF9sZWZ0b3Ao Y2xhdXNlKTsKCXJpZ2h0b3AgPSBnZXRfcmlnaHRvcChjbGF1c2UpOwoJaWYgKCFsZWZ0b3Ag fHwgIXJpZ2h0b3ApCgkJcmV0dXJuIE5VTEw7CglleHByX29wID0gKChPcEV4cHIgKikgY2xh dXNlKS0+b3BubzsKCWV4cHJfY29sbCA9ICgoT3BFeHByICopIGNsYXVzZSktPmlucHV0Y29s bGlkOwoKCS8qCgkgKiBXZSBjYW4gZm9yZ2V0IHRoZSB3aG9sZSB0aGluZyByaWdodCBhd2F5 IGlmIHdyb25nIGNvbGxhdGlvbi4KCSAqLwoJaWYgKCFJbmRleENvbGxNYXRjaGVzRXhwckNv bGwoaWR4Y29sbGF0aW9uLCBleHByX2NvbGwpKQoJCXJldHVybiBOVUxMOwoKCS8qCgkgKiBD aGVjayBmb3IgY2xhdXNlcyBvZiB0aGUgZm9ybTogKGluZGV4a2V5IG9wZXJhdG9yIGNvbnN0 YW50KSBvcgoJICogKGNvbnN0YW50IG9wZXJhdG9yIGluZGV4a2V5KS4KCSAqLwoJaWYgKG1h dGNoX2luZGV4X3RvX29wZXJhbmQobGVmdG9wLCBpbmRleGNvbCwgaW5kZXgpICYmCgkJIWNv bnRhaW5fdmFyX2NsYXVzZShyaWdodG9wKSAmJgoJCSFjb250YWluX3ZvbGF0aWxlX2Z1bmN0 aW9ucyhyaWdodG9wKSkKCXsKCQljb21tdXRlZCA9IGZhbHNlOwoJfQoJZWxzZSBpZiAobWF0 Y2hfaW5kZXhfdG9fb3BlcmFuZChyaWdodG9wLCBpbmRleGNvbCwgaW5kZXgpICYmCgkJCSAh Y29udGFpbl92YXJfY2xhdXNlKGxlZnRvcCkgJiYKCQkJICFjb250YWluX3ZvbGF0aWxlX2Z1 bmN0aW9ucyhsZWZ0b3ApKQoJewoJCS8qIE1pZ2h0IG1hdGNoLCBidXQgd2UgbmVlZCBhIGNv bW11dGVkIG9wZXJhdG9yICovCgkJZXhwcl9vcCA9IGdldF9jb21tdXRhdG9yKGV4cHJfb3Ap OwoJCWlmIChleHByX29wID09IEludmFsaWRPaWQpCgkJCXJldHVybiBOVUxMOwoJCWNvbW11 dGVkID0gdHJ1ZTsKCX0KCWVsc2UKCQlyZXR1cm4gTlVMTDsKCgkvKgoJICogSXMgdGhlIChj b21tdXRlZCkgb3BlcmF0b3IgYW4gb3JkZXJpbmcgb3BlcmF0b3IgZm9yIHRoZSBvcGZhbWls eT8gQW5kCgkgKiBpZiBzbywgZG9lcyBpdCB5aWVsZCB0aGUgcmlnaHQgc29ydGluZyBzZW1h bnRpY3M/CgkgKi8KCXNvcnRmYW1pbHkgPSBnZXRfb3Bfb3BmYW1pbHlfc29ydGZhbWlseShl eHByX29wLCBvcGZhbWlseSk7CglpZiAoc29ydGZhbWlseSAhPSBwa19vcGZhbWlseSkKCQly ZXR1cm4gTlVMTDsKCgkvKiBXZSBoYXZlIGEgbWF0Y2guICBSZXR1cm4gY2xhdXNlIG9yIGEg Y29tbXV0ZWQgdmVyc2lvbiB0aGVyZW9mLiAqLwoJaWYgKGNvbW11dGVkKQoJewoJCU9wRXhw cgkgICAqbmV3Y2xhdXNlID0gbWFrZU5vZGUoT3BFeHByKTsKCgkJLyogZmxhdC1jb3B5IGFs bCB0aGUgZmllbGRzIG9mIGNsYXVzZSAqLwoJCW1lbWNweShuZXdjbGF1c2UsIGNsYXVzZSwg c2l6ZW9mKE9wRXhwcikpOwoKCQkvKiBjb21tdXRlIGl0ICovCgkJbmV3Y2xhdXNlLT5vcG5v ID0gZXhwcl9vcDsKCQluZXdjbGF1c2UtPm9wZnVuY2lkID0gSW52YWxpZE9pZDsKCQluZXdj bGF1c2UtPmFyZ3MgPSBsaXN0X21ha2UyKHJpZ2h0b3AsIGxlZnRvcCk7CgoJCWNsYXVzZSA9 IChFeHByICopIG5ld2NsYXVzZTsKCX0KCglyZXR1cm4gY2xhdXNlOwp9CgoKLyoqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioKICoJCQkJLS0tLSAgUk9VVElORVMgVE8gRE8gUEFSVElBTCBJTkRF WCBQUkVESUNBVEUgVEVTVFMJLS0tLQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCi8qCiAq IGNoZWNrX2luZGV4X3ByZWRpY2F0ZXMKICoJCVNldCB0aGUgcHJlZGljYXRlLWRlcml2ZWQg SW5kZXhPcHRJbmZvIGZpZWxkcyBmb3IgZWFjaCBpbmRleAogKgkJb2YgdGhlIHNwZWNpZmll ZCByZWxhdGlvbi4KICoKICogcHJlZE9LIGlzIHNldCB0cnVlIGlmIHRoZSBpbmRleCBpcyBw YXJ0aWFsIGFuZCBpdHMgcHJlZGljYXRlIGlzIHNhdGlzZmllZAogKiBmb3IgdGhpcyBxdWVy eSwgaWUgdGhlIHF1ZXJ5J3MgV0hFUkUgY2xhdXNlcyBpbXBseSB0aGUgcHJlZGljYXRlLgog KgogKiBpbmRyZXN0cmljdGluZm8gaXMgc2V0IHRvIHRoZSByZWxhdGlvbidzIGJhc2VyZXN0 cmljdGluZm8gbGlzdCBsZXNzIGFueQogKiBjb25kaXRpb25zIHRoYXQgYXJlIGltcGxpZWQg YnkgdGhlIGluZGV4J3MgcHJlZGljYXRlLiAgKE9idmlvdXNseSwgZm9yIGEKICogbm9uLXBh cnRpYWwgaW5kZXgsIHRoaXMgaXMgdGhlIHNhbWUgYXMgYmFzZXJlc3RyaWN0aW5mby4pICBT dWNoIGNvbmRpdGlvbnMKICogY2FuIGJlIGRyb3BwZWQgZnJvbSB0aGUgcGxhbiB3aGVuIHVz aW5nIHRoZSBpbmRleCwgaW4gY2VydGFpbiBjYXNlcy4KICoKICogQXQgb25lIHRpbWUgaXQg d2FzIHBvc3NpYmxlIGZvciB0aGlzIHRvIGdldCByZS1ydW4gYWZ0ZXIgYWRkaW5nIG1vcmUK ICogcmVzdHJpY3Rpb25zIHRvIHRoZSByZWwsIHRodXMgcG9zc2libHkgbGV0dGluZyB1cyBw cm92ZSBtb3JlIGluZGV4ZXMgT0suCiAqIFRoYXQgZG9lc24ndCBoYXBwZW4gYW55IG1vcmUg KGF0IGxlYXN0IG5vdCBpbiB0aGUgY29yZSBjb2RlJ3MgdXNhZ2UpLAogKiBidXQgdGhpcyBj b2RlIHN0aWxsIHN1cHBvcnRzIGl0IGluIGNhc2UgZXh0ZW5zaW9ucyB3YW50IHRvIG1lc3Mg d2l0aCB0aGUKICogYmFzZXJlc3RyaWN0aW5mbyBsaXN0LiAgV2UgYXNzdW1lIHRoYXQgYWRk aW5nIG1vcmUgcmVzdHJpY3Rpb25zIGNhbid0IG1ha2UKICogYW4gaW5kZXggbm90IHByZWRP Sy4gIFdlIG11c3QgcmVjb21wdXRlIGluZHJlc3RyaWN0aW5mbyBlYWNoIHRpbWUsIHRob3Vn aCwKICogdG8gbWFrZSBzdXJlIGFueSBuZXdseS1hZGRlZCByZXN0cmljdGlvbnMgZ2V0IGlu dG8gaXQgaWYgbmVlZGVkLgogKi8Kdm9pZApjaGVja19pbmRleF9wcmVkaWNhdGVzKFBsYW5u ZXJJbmZvICpyb290LCBSZWxPcHRJbmZvICpyZWwpCnsKCUxpc3QJICAgKmNsYXVzZWxpc3Q7 Cglib29sCQloYXZlX3BhcnRpYWw7Cglib29sCQlpc190YXJnZXRfcmVsOwoJUmVsaWRzCQlv dGhlcnJlbHM7CglMaXN0Q2VsbCAgICpsYzsKCgkvKiBJbmRleGVzIGFyZSBhdmFpbGFibGUg b25seSBvbiBiYXNlIG9yICJvdGhlciIgbWVtYmVyIHJlbGF0aW9ucy4gKi8KCUFzc2VydChJ U19TSU1QTEVfUkVMKHJlbCkpOwoKCS8qCgkgKiBJbml0aWFsaXplIHRoZSBpbmRyZXN0cmlj dGluZm8gbGlzdHMgdG8gYmUgaWRlbnRpY2FsIHRvCgkgKiBiYXNlcmVzdHJpY3RpbmZvLCBh bmQgY2hlY2sgd2hldGhlciB0aGVyZSBhcmUgYW55IHBhcnRpYWwgaW5kZXhlcy4gIElmCgkg KiBub3QsIHRoaXMgaXMgYWxsIHdlIG5lZWQgdG8gZG8uCgkgKi8KCWhhdmVfcGFydGlhbCA9 IGZhbHNlOwoJZm9yZWFjaChsYywgcmVsLT5pbmRleGxpc3QpCgl7CgkJSW5kZXhPcHRJbmZv ICppbmRleCA9IChJbmRleE9wdEluZm8gKikgbGZpcnN0KGxjKTsKCgkJaW5kZXgtPmluZHJl c3RyaWN0aW5mbyA9IHJlbC0+YmFzZXJlc3RyaWN0aW5mbzsKCQlpZiAoaW5kZXgtPmluZHBy ZWQpCgkJCWhhdmVfcGFydGlhbCA9IHRydWU7Cgl9CglpZiAoIWhhdmVfcGFydGlhbCkKCQly ZXR1cm47CgoJLyoKCSAqIENvbnN0cnVjdCBhIGxpc3Qgb2YgY2xhdXNlcyB0aGF0IHdlIGNh biBhc3N1bWUgdHJ1ZSBmb3IgdGhlIHB1cnBvc2Ugb2YKCSAqIHByb3ZpbmcgdGhlIGluZGV4 KGVzKSB1c2FibGUuICBSZXN0cmljdGlvbiBjbGF1c2VzIGZvciB0aGUgcmVsIGFyZQoJICog YWx3YXlzIHVzYWJsZSwgYW5kIHNvIGFyZSBhbnkgam9pbiBjbGF1c2VzIHRoYXQgYXJlICJt b3ZhYmxlIHRvIiB0aGlzCgkgKiByZWwuICBBbHNvLCB3ZSBjYW4gY29uc2lkZXIgYW55IEVD LWRlcml2YWJsZSBqb2luIGNsYXVzZXMgKHdoaWNoIG11c3QKCSAqIGJlICJtb3ZhYmxlIHRv IiB0aGlzIHJlbCwgYnkgZGVmaW5pdGlvbikuCgkgKi8KCWNsYXVzZWxpc3QgPSBsaXN0X2Nv cHkocmVsLT5iYXNlcmVzdHJpY3RpbmZvKTsKCgkvKiBTY2FuIHRoZSByZWwncyBqb2luIGNs YXVzZXMgKi8KCWZvcmVhY2gobGMsIHJlbC0+am9pbmluZm8pCgl7CgkJUmVzdHJpY3RJbmZv ICpyaW5mbyA9IChSZXN0cmljdEluZm8gKikgbGZpcnN0KGxjKTsKCgkJLyogQ2hlY2sgaWYg Y2xhdXNlIGNhbiBiZSBtb3ZlZCB0byB0aGlzIHJlbCAqLwoJCWlmICgham9pbl9jbGF1c2Vf aXNfbW92YWJsZV90byhyaW5mbywgcmVsKSkKCQkJY29udGludWU7CgoJCWNsYXVzZWxpc3Qg PSBsYXBwZW5kKGNsYXVzZWxpc3QsIHJpbmZvKTsKCX0KCgkvKgoJICogQWRkIG9uIGFueSBl cXVpdmFsZW5jZS1kZXJpdmFibGUgam9pbiBjbGF1c2VzLiAgQ29tcHV0aW5nIHRoZSBjb3Jy ZWN0CgkgKiByZWxpZCBzZXRzIGZvciBnZW5lcmF0ZV9qb2luX2ltcGxpZWRfZXF1YWxpdGll cyBpcyBzbGlnaHRseSB0cmlja3kKCSAqIGJlY2F1c2UgdGhlIHJlbCBjb3VsZCBiZSBhIGNo aWxkIHJlbCByYXRoZXIgdGhhbiBhIHRydWUgYmFzZXJlbCwgYW5kIGluCgkgKiB0aGF0IGNh c2Ugd2UgbXVzdCBzdWJ0cmFjdCBpdHMgcGFyZW50cycgcmVsaWQocykgZnJvbSBhbGxfcXVl cnlfcmVscy4KCSAqIEFkZGl0aW9uYWxseSwgd2UgbXVzdG4ndCBjb25zaWRlciBjbGF1c2Vz IHRoYXQgYXJlIG9ubHkgY29tcHV0YWJsZQoJICogYWZ0ZXIgb3V0ZXIgam9pbnMgdGhhdCBj YW4gbnVsbCB0aGUgcmVsLgoJICovCglpZiAocmVsLT5yZWxvcHRraW5kID09IFJFTE9QVF9P VEhFUl9NRU1CRVJfUkVMKQoJCW90aGVycmVscyA9IGJtc19kaWZmZXJlbmNlKHJvb3QtPmFs bF9xdWVyeV9yZWxzLAoJCQkJCQkJCSAgIGZpbmRfY2hpbGRyZWxfcGFyZW50cyhyb290LCBy ZWwpKTsKCWVsc2UKCQlvdGhlcnJlbHMgPSBibXNfZGlmZmVyZW5jZShyb290LT5hbGxfcXVl cnlfcmVscywgcmVsLT5yZWxpZHMpOwoJb3RoZXJyZWxzID0gYm1zX2RlbF9tZW1iZXJzKG90 aGVycmVscywgcmVsLT5udWxsaW5nX3JlbGlkcyk7CgoJaWYgKCFibXNfaXNfZW1wdHkob3Ro ZXJyZWxzKSkKCQljbGF1c2VsaXN0ID0KCQkJbGlzdF9jb25jYXQoY2xhdXNlbGlzdCwKCQkJ CQkJZ2VuZXJhdGVfam9pbl9pbXBsaWVkX2VxdWFsaXRpZXMocm9vdCwKCQkJCQkJCQkJCQkJ CQkgYm1zX3VuaW9uKHJlbC0+cmVsaWRzLAoJCQkJCQkJCQkJCQkJCQkJICAgb3RoZXJyZWxz KSwKCQkJCQkJCQkJCQkJCQkgb3RoZXJyZWxzLAoJCQkJCQkJCQkJCQkJCSByZWwsCgkJCQkJ CQkJCQkJCQkJIE5VTEwpKTsKCgkvKgoJICogTm9ybWFsbHkgd2UgcmVtb3ZlIHF1YWxzIHRo YXQgYXJlIGltcGxpZWQgYnkgYSBwYXJ0aWFsIGluZGV4J3MKCSAqIHByZWRpY2F0ZSBmcm9t IGluZHJlc3RyaWN0aW5mbywgaW5kaWNhdGluZyB0aGF0IHRoZXkgbmVlZCBub3QgYmUKCSAq IGNoZWNrZWQgZXhwbGljaXRseSBieSBhbiBpbmRleHNjYW4gcGxhbiB1c2luZyB0aGlzIGlu ZGV4LiAgSG93ZXZlciwgaWYKCSAqIHRoZSByZWwgaXMgYSB0YXJnZXQgcmVsYXRpb24gb2Yg VVBEQVRFL0RFTEVURS9NRVJHRS9TRUxFQ1QgRk9SIFVQREFURSwKCSAqIHdlIGNhbm5vdCBy ZW1vdmUgc3VjaCBxdWFscyBmcm9tIHRoZSBwbGFuLCBiZWNhdXNlIHRoZXkgbmVlZCB0byBi ZSBpbgoJICogdGhlIHBsYW4gc28gdGhhdCB0aGV5IHdpbGwgYmUgcHJvcGVybHkgcmVjaGVj a2VkIGJ5IEV2YWxQbGFuUXVhbAoJICogdGVzdGluZy4gIFNvbWUgZGF5IHdlIG1pZ2h0IHdh bnQgdG8gcmVtb3ZlIHN1Y2ggcXVhbHMgZnJvbSB0aGUgbWFpbgoJICogcGxhbiBhbnl3YXkg YW5kIHBhc3MgdGhlbSB0aHJvdWdoIHRvIEV2YWxQbGFuUXVhbCB2aWEgYSBzaWRlIGNoYW5u ZWw7CgkgKiBidXQgZm9yIG5vdywgd2UganVzdCBkb24ndCByZW1vdmUgaW1wbGllZCBxdWFs cyBhdCBhbGwgZm9yIHRhcmdldAoJICogcmVsYXRpb25zLgoJICovCglpc190YXJnZXRfcmVs ID0gKGJtc19pc19tZW1iZXIocmVsLT5yZWxpZCwgcm9vdC0+YWxsX3Jlc3VsdF9yZWxpZHMp IHx8CgkJCQkJIGdldF9wbGFuX3Jvd21hcmsocm9vdC0+cm93TWFya3MsIHJlbC0+cmVsaWQp ICE9IE5VTEwpOwoKCS8qCgkgKiBOb3cgdHJ5IHRvIHByb3ZlIGVhY2ggaW5kZXggcHJlZGlj YXRlIHRydWUsIGFuZCBjb21wdXRlIHRoZQoJICogaW5kcmVzdHJpY3RpbmZvIGxpc3RzIGZv ciBwYXJ0aWFsIGluZGV4ZXMuICBOb3RlIHRoYXQgd2UgY29tcHV0ZSB0aGUKCSAqIGluZHJl c3RyaWN0aW5mbyBsaXN0IGV2ZW4gZm9yIG5vbi1wcmVkT0sgaW5kZXhlczsgdGhpcyBtaWdo dCBzZWVtCgkgKiB3YXN0ZWZ1bCwgYnV0IHdlIG1heSBiZSBhYmxlIHRvIHVzZSBzdWNoIGlu ZGV4ZXMgaW4gT1IgY2xhdXNlcywgY2YKCSAqIGdlbmVyYXRlX2JpdG1hcF9vcl9wYXRocygp LgoJICovCglmb3JlYWNoKGxjLCByZWwtPmluZGV4bGlzdCkKCXsKCQlJbmRleE9wdEluZm8g KmluZGV4ID0gKEluZGV4T3B0SW5mbyAqKSBsZmlyc3QobGMpOwoJCUxpc3RDZWxsICAgKmxj cjsKCgkJaWYgKGluZGV4LT5pbmRwcmVkRXhwYW5kID09IE5JTCkKCQkJY29udGludWU7CQkJ LyogaWdub3JlIG5vbi1wYXJ0aWFsIGluZGV4ZXMgaGVyZSAqLwoKCQlpZiAoIWluZGV4LT5w cmVkT0spCQkvKiBkb24ndCByZXBlYXQgd29yayBpZiBhbHJlYWR5IHByb3ZlbiBPSyAqLwoJ CQlpbmRleC0+cHJlZE9LID0gcHJlZGljYXRlX2ltcGxpZWRfYnkoaW5kZXgtPmluZHByZWRF eHBhbmQsIGNsYXVzZWxpc3QsCgkJCQkJCQkJCQkJCSBmYWxzZSk7CgoJCS8qIElmIHJlbCBp cyBhbiB1cGRhdGUgdGFyZ2V0LCBsZWF2ZSBpbmRyZXN0cmljdGluZm8gYXMgc2V0IGFib3Zl ICovCgkJaWYgKGlzX3RhcmdldF9yZWwpCgkJCWNvbnRpbnVlOwoKCQkvKgoJCSAqIElmIGlu ZGV4IGlzICFhbW9wdGlvbmFsa2V5LCBhbHNvIGxlYXZlIGluZHJlc3RyaWN0aW5mbyBhcyBz ZXQKCQkgKiBhYm92ZS4gIE90aGVyd2lzZSB3ZSByaXNrIHJlbW92aW5nIGFsbCBxdWFscyBm b3IgdGhlIGZpcnN0IGluZGV4CgkJICoga2V5IGFuZCB0aGVuIG5vdCBiZWluZyBhYmxlIHRv IGdlbmVyYXRlIGFuIGluZGV4c2NhbiBhdCBhbGwuICBJdAoJCSAqIHdvdWxkIGJlIGJldHRl ciB0byBiZSBtb3JlIHNlbGVjdGl2ZSwgYnV0IHdlJ3ZlIG5vdCB5ZXQgaWRlbnRpZmllZAoJ CSAqIHdoaWNoIGlmIGFueSBvZiB0aGUgcXVhbHMgbWF0Y2ggdGhlIGZpcnN0IGluZGV4IGtl eS4KCQkgKi8KCQlpZiAoIWluZGV4LT5hbW9wdGlvbmFsa2V5KQoJCQljb250aW51ZTsKCgkJ LyogRWxzZSBjb21wdXRlIGluZHJlc3RyaWN0aW5mbyBhcyB0aGUgbm9uLWltcGxpZWQgcXVh bHMgKi8KCQlpbmRleC0+aW5kcmVzdHJpY3RpbmZvID0gTklMOwoJCWZvcmVhY2gobGNyLCBy ZWwtPmJhc2VyZXN0cmljdGluZm8pCgkJewoJCQlSZXN0cmljdEluZm8gKnJpbmZvID0gKFJl c3RyaWN0SW5mbyAqKSBsZmlyc3QobGNyKTsKCgkJCS8qIHByZWRpY2F0ZV9pbXBsaWVkX2J5 KCkgYXNzdW1lcyBmaXJzdCBhcmcgaXMgaW1tdXRhYmxlICovCgkJCWlmIChjb250YWluX211 dGFibGVfZnVuY3Rpb25zKChOb2RlICopIHJpbmZvLT5jbGF1c2UpIHx8CgkJCQkhcHJlZGlj YXRlX2ltcGxpZWRfYnkobGlzdF9tYWtlMShyaW5mby0+Y2xhdXNlKSwKCQkJCQkJCQkJICBp bmRleC0+aW5kcHJlZEV4cGFuZCwgZmFsc2UpKQoJCQkJaW5kZXgtPmluZHJlc3RyaWN0aW5m byA9IGxhcHBlbmQoaW5kZXgtPmluZHJlc3RyaWN0aW5mbywgcmluZm8pOwoJCX0KCX0KfQoK LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioKICoJCQkJLS0tLSAgUk9VVElORVMgVE8gQ0hFQ0sg RVhURVJOQUxMWS1WSVNJQkxFIENPTkRJVElPTlMgIC0tLS0KICoqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKiovCgovKgogKiBlY19tZW1iZXJfbWF0Y2hlc19pbmRleGNvbAogKgkgIFRlc3Qgd2hl dGhlciBhbiBFcXVpdmFsZW5jZUNsYXNzIG1lbWJlciBtYXRjaGVzIGFuIGluZGV4IGNvbHVt bi4KICoKICogVGhpcyBpcyBhIGNhbGxiYWNrIGZvciB1c2UgYnkgZ2VuZXJhdGVfaW1wbGll ZF9lcXVhbGl0aWVzX2Zvcl9jb2x1bW4uCiAqLwpzdGF0aWMgYm9vbAplY19tZW1iZXJfbWF0 Y2hlc19pbmRleGNvbChQbGFubmVySW5mbyAqcm9vdCwgUmVsT3B0SW5mbyAqcmVsLAoJCQkJ CQkgICBFcXVpdmFsZW5jZUNsYXNzICplYywgRXF1aXZhbGVuY2VNZW1iZXIgKmVtLAoJCQkJ CQkgICB2b2lkICphcmcpCnsKCUluZGV4T3B0SW5mbyAqaW5kZXggPSAoKGVjX21lbWJlcl9t YXRjaGVzX2FyZyAqKSBhcmcpLT5pbmRleDsKCWludAkJCWluZGV4Y29sID0gKChlY19tZW1i ZXJfbWF0Y2hlc19hcmcgKikgYXJnKS0+aW5kZXhjb2w7CglPaWQJCQljdXJGYW1pbHk7CglP aWQJCQljdXJDb2xsYXRpb247CgoJQXNzZXJ0KGluZGV4Y29sIDwgaW5kZXgtPm5rZXljb2x1 bW5zKTsKCgljdXJGYW1pbHkgPSBpbmRleC0+b3BmYW1pbHlbaW5kZXhjb2xdOwoJY3VyQ29s bGF0aW9uID0gaW5kZXgtPmluZGV4Y29sbGF0aW9uc1tpbmRleGNvbF07CgoJLyoKCSAqIElm IGl0J3MgYSBidHJlZSBpbmRleCwgd2UgY2FuIHJlamVjdCBpdCBpZiBpdHMgb3BmYW1pbHkg aXNuJ3QKCSAqIGNvbXBhdGlibGUgd2l0aCB0aGUgRUMsIHNpbmNlIG5vIGNsYXVzZSBnZW5l cmF0ZWQgZnJvbSB0aGUgRUMgY291bGQgYmUKCSAqIHVzZWQgd2l0aCB0aGUgaW5kZXguICBG b3Igbm9uLWJ0cmVlIGluZGV4ZXMsIHdlIGNhbid0IGVhc2lseSB0ZWxsCgkgKiB3aGV0aGVy IGNsYXVzZXMgZ2VuZXJhdGVkIGZyb20gdGhlIEVDIGNvdWxkIGJlIHVzZWQgd2l0aCB0aGUg aW5kZXgsIHNvCgkgKiBkb24ndCBjaGVjayB0aGUgb3BmYW1pbHkuICBUaGlzIG1pZ2h0IG1l YW4gd2UgcmV0dXJuICJ0cnVlIiBmb3IgYQoJICogdXNlbGVzcyBFQywgc28gd2UgaGF2ZSB0 byByZWNoZWNrIHRoZSByZXN1bHRzIG9mCgkgKiBnZW5lcmF0ZV9pbXBsaWVkX2VxdWFsaXRp ZXNfZm9yX2NvbHVtbjsgc2VlCgkgKiBtYXRjaF9lY2xhc3NfY2xhdXNlc190b19pbmRleC4K CSAqLwoJaWYgKGluZGV4LT5yZWxhbSA9PSBCVFJFRV9BTV9PSUQgJiYKCQkhbGlzdF9tZW1i ZXJfb2lkKGVjLT5lY19vcGZhbWlsaWVzLCBjdXJGYW1pbHkpKQoJCXJldHVybiBmYWxzZTsK CgkvKiBXZSBpbnNpc3Qgb24gY29sbGF0aW9uIG1hdGNoIGZvciBhbGwgaW5kZXggdHlwZXMs IHRob3VnaCAqLwoJaWYgKCFJbmRleENvbGxNYXRjaGVzRXhwckNvbGwoY3VyQ29sbGF0aW9u LCBlYy0+ZWNfY29sbGF0aW9uKSkKCQlyZXR1cm4gZmFsc2U7CgoJcmV0dXJuIG1hdGNoX2lu ZGV4X3RvX29wZXJhbmQoKE5vZGUgKikgZW0tPmVtX2V4cHIsIGluZGV4Y29sLCBpbmRleCk7 Cn0KCi8qCiAqIHJlbGF0aW9uX2hhc191bmlxdWVfaW5kZXhfZm9yCiAqCSAgRGV0ZXJtaW5l IHdoZXRoZXIgdGhlIHJlbGF0aW9uIHByb3ZhYmx5IGhhcyBhdCBtb3N0IG9uZSByb3cgc2F0 aXNmeWluZwogKgkgIGEgc2V0IG9mIGVxdWFsaXR5IGNvbmRpdGlvbnMsIGJlY2F1c2UgdGhl IGNvbmRpdGlvbnMgY29uc3RyYWluIGFsbAogKgkgIGNvbHVtbnMgb2Ygc29tZSB1bmlxdWUg aW5kZXguCiAqCiAqIFRoZSBjb25kaXRpb25zIGFyZSBwcm92aWRlZCBhcyBhIGxpc3Qgb2Yg UmVzdHJpY3RJbmZvIG5vZGVzLCB3aGVyZSB0aGUKICogY2FsbGVyIGhhcyBhbHJlYWR5IGRl dGVybWluZWQgdGhhdCBlYWNoIGNvbmRpdGlvbiBpcyBhIG1lcmdlam9pbmFibGUKICogZXF1 YWxpdHkgd2l0aCBhbiBleHByZXNzaW9uIGluIHRoaXMgcmVsYXRpb24gb24gb25lIHNpZGUs IGFuZCBhbgogKiBleHByZXNzaW9uIG5vdCBpbnZvbHZpbmcgdGhpcyByZWxhdGlvbiBvbiB0 aGUgb3RoZXIuICBUaGUgdHJhbnNpZW50CiAqIG91dGVyX2lzX2xlZnQgZmxhZyBpcyB1c2Vk IHRvIGlkZW50aWZ5IHdoaWNoIHNpZGUgd2Ugc2hvdWxkIGxvb2sgYXQ6CiAqIGxlZnQgc2lk ZSBpZiBvdXRlcl9pc19sZWZ0IGlzIGZhbHNlLCByaWdodCBzaWRlIGlmIGl0IGlzIHRydWUu CiAqCiAqIFRoZSBjYWxsZXIgbmVlZCBvbmx5IHN1cHBseSBlcXVhbGl0eSBjb25kaXRpb25z IGFyaXNpbmcgZnJvbSBqb2luczsKICogdGhpcyByb3V0aW5lIGF1dG9tYXRpY2FsbHkgYWRk cyBpbiBhbnkgdXNhYmxlIGJhc2VyZXN0cmljdGluZm8gY2xhdXNlcy4KICogKE5vdGUgdGhh dCB0aGUgcGFzc2VkLWluIHJlc3RyaWN0bGlzdCB3aWxsIGJlIGRlc3RydWN0aXZlbHkgbW9k aWZpZWQhKQogKgogKiBJZiBleHRyYV9jbGF1c2VzIGlzbid0IE5VTEwsIHJldHVybiBiYXNl cmVzdHJpY3RpbmZvIGNsYXVzZXMgd2hpY2ggd2VyZSB1c2VkCiAqIHRvIGRlcml2ZSB1bmlx dWVuZXNzLgogKi8KYm9vbApyZWxhdGlvbl9oYXNfdW5pcXVlX2luZGV4X2ZvcihQbGFubmVy SW5mbyAqcm9vdCwgUmVsT3B0SW5mbyAqcmVsLAoJCQkJCQkJICBMaXN0ICpyZXN0cmljdGxp c3QsIExpc3QgKipleHRyYV9jbGF1c2VzKQp7CglMaXN0Q2VsbCAgICppYzsKCgkvKiBTaG9y dC1jaXJjdWl0IGlmIG5vIGluZGV4ZXMuLi4gKi8KCWlmIChyZWwtPmluZGV4bGlzdCA9PSBO SUwpCgkJcmV0dXJuIGZhbHNlOwoKCS8qCgkgKiBFeGFtaW5lIHRoZSByZWwncyByZXN0cmlj dGlvbiBjbGF1c2VzIGZvciB1c2FibGUgdmFyID0gY29uc3QgY2xhdXNlcwoJICogdGhhdCB3 ZSBjYW4gYWRkIHRvIHRoZSByZXN0cmljdGxpc3QuCgkgKi8KCWZvcmVhY2goaWMsIHJlbC0+ YmFzZXJlc3RyaWN0aW5mbykKCXsKCQlSZXN0cmljdEluZm8gKnJlc3RyaWN0aW5mbyA9IChS ZXN0cmljdEluZm8gKikgbGZpcnN0KGljKTsKCgkJLyoKCQkgKiBOb3RlOiBjYW5fam9pbiB3 b24ndCBiZSBzZXQgZm9yIGEgcmVzdHJpY3Rpb24gY2xhdXNlLCBidXQKCQkgKiBtZXJnZW9w ZmFtaWxpZXMgd2lsbCBiZSBpZiBpdCBoYXMgYSBtZXJnZWpvaW5hYmxlIG9wZXJhdG9yIGFu ZAoJCSAqIGRvZXNuJ3QgY29udGFpbiB2b2xhdGlsZSBmdW5jdGlvbnMuCgkJICovCgkJaWYg KHJlc3RyaWN0aW5mby0+bWVyZ2VvcGZhbWlsaWVzID09IE5JTCkKCQkJY29udGludWU7CQkJ Lyogbm90IG1lcmdlam9pbmFibGUgKi8KCgkJLyoKCQkgKiBUaGUgY2xhdXNlIGNlcnRhaW5s eSBkb2Vzbid0IHJlZmVyIHRvIGFueXRoaW5nIGJ1dCB0aGUgZ2l2ZW4gcmVsLgoJCSAqIElm IGVpdGhlciBzaWRlIGlzIHBzZXVkb2NvbnN0YW50IHRoZW4gd2UgY2FuIHVzZSBpdC4KCQkg Ki8KCQlpZiAoYm1zX2lzX2VtcHR5KHJlc3RyaWN0aW5mby0+bGVmdF9yZWxpZHMpKQoJCXsK CQkJLyogcmlnaHRoYW5kIHNpZGUgaXMgaW5uZXIgKi8KCQkJcmVzdHJpY3RpbmZvLT5vdXRl cl9pc19sZWZ0ID0gdHJ1ZTsKCQl9CgkJZWxzZSBpZiAoYm1zX2lzX2VtcHR5KHJlc3RyaWN0 aW5mby0+cmlnaHRfcmVsaWRzKSkKCQl7CgkJCS8qIGxlZnRoYW5kIHNpZGUgaXMgaW5uZXIg Ki8KCQkJcmVzdHJpY3RpbmZvLT5vdXRlcl9pc19sZWZ0ID0gZmFsc2U7CgkJfQoJCWVsc2UK CQkJY29udGludWU7CgoJCS8qIE9LLCBhZGQgdG8gbGlzdCAqLwoJCXJlc3RyaWN0bGlzdCA9 IGxhcHBlbmQocmVzdHJpY3RsaXN0LCByZXN0cmljdGluZm8pOwoJfQoKCS8qIFNob3J0LWNp cmN1aXQgdGhlIGVhc3kgY2FzZSAqLwoJaWYgKHJlc3RyaWN0bGlzdCA9PSBOSUwpCgkJcmV0 dXJuIGZhbHNlOwoKCS8qIEV4YW1pbmUgZWFjaCBpbmRleCBvZiB0aGUgcmVsYXRpb24gLi4u ICovCglmb3JlYWNoKGljLCByZWwtPmluZGV4bGlzdCkKCXsKCQlJbmRleE9wdEluZm8gKmlu ZCA9IChJbmRleE9wdEluZm8gKikgbGZpcnN0KGljKTsKCQlpbnQJCQljOwoJCUxpc3QJICAg KmV4cHJzID0gTklMOwoKCQkvKgoJCSAqIElmIHRoZSBpbmRleCBpcyBub3QgdW5pcXVlLCBv ciBub3QgaW1tZWRpYXRlbHkgZW5mb3JjZWQsIG9yIGlmIGl0J3MKCQkgKiBhIHBhcnRpYWwg aW5kZXgsIGl0J3MgdXNlbGVzcyBoZXJlLiAgV2UncmUgdW5hYmxlIHRvIG1ha2UgdXNlIG9m CgkJICogcHJlZE9LIHBhcnRpYWwgdW5pcXVlIGluZGV4ZXMgZHVlIHRvIHRoZSBmYWN0IHRo YXQKCQkgKiBjaGVja19pbmRleF9wcmVkaWNhdGVzKCkgYWxzbyBtYWtlcyB1c2Ugb2Ygam9p biBwcmVkaWNhdGVzIHRvCgkJICogZGV0ZXJtaW5lIGlmIHRoZSBwYXJ0aWFsIGluZGV4IGlz IHVzYWJsZS4gSGVyZSB3ZSBuZWVkIHByb29mcyB0aGF0CgkJICogaG9sZCB0cnVlIGJlZm9y ZSBhbnkgam9pbnMgYXJlIGV2YWx1YXRlZC4KCQkgKi8KCQlpZiAoIWluZC0+dW5pcXVlIHx8 ICFpbmQtPmltbWVkaWF0ZSB8fCBpbmQtPmluZHByZWQgIT0gTklMKQoJCQljb250aW51ZTsK CgkJLyoKCQkgKiBUcnkgdG8gZmluZCBlYWNoIGluZGV4IGNvbHVtbiBpbiB0aGUgbGlzdCBv ZiBjb25kaXRpb25zLiAgVGhpcyBpcwoJCSAqIE8oTl4yKSBvciB3b3JzZSwgYnV0IHdlIGV4 cGVjdCBhbGwgdGhlIGxpc3RzIHRvIGJlIHNob3J0LgoJCSAqLwoJCWZvciAoYyA9IDA7IGMg PCBpbmQtPm5rZXljb2x1bW5zOyBjKyspCgkJewoJCQlMaXN0Q2VsbCAgICpsYzsKCgkJCWZv cmVhY2gobGMsIHJlc3RyaWN0bGlzdCkKCQkJewoJCQkJUmVzdHJpY3RJbmZvICpyaW5mbyA9 IChSZXN0cmljdEluZm8gKikgbGZpcnN0KGxjKTsKCQkJCU5vZGUJICAgKnJleHByOwoKCQkJ CS8qCgkJCQkgKiBUaGUgY29uZGl0aW9uJ3MgZXF1YWxpdHkgb3BlcmF0b3IgbXVzdCBiZSBh IG1lbWJlciBvZiB0aGUKCQkJCSAqIGluZGV4IG9wZmFtaWx5LCBlbHNlIGl0IGlzIG5vdCBh c3NlcnRpbmcgdGhlIHJpZ2h0IGtpbmQgb2YKCQkJCSAqIGVxdWFsaXR5IGJlaGF2aW9yIGZv ciB0aGlzIGluZGV4LiAgV2UgY2hlY2sgdGhpcyBmaXJzdAoJCQkJICogc2luY2UgaXQncyBw cm9iYWJseSB0aGUgY2hlYXBlc3QgdGVzdC4KCQkJCSAqLwoJCQkJaWYgKCFsaXN0X21lbWJl cl9vaWQocmluZm8tPm1lcmdlb3BmYW1pbGllcywgaW5kLT5vcGZhbWlseVtjXSkpCgkJCQkJ Y29udGludWU7CgoJCQkJLyoKCQkJCSAqIFRoZSBpbmRleCdzIGNvbGxhdGlvbiBtdXN0IGFn cmVlIHdpdGggdGhlIGNsYXVzZSdzIGlucHV0CgkJCQkgKiBjb2xsYXRpb24gb24gZXF1YWxp dHksIGVsc2UgdGhlIGluZGV4J3MgdW5pcXVlbmVzcyBkb2VzIG5vdAoJCQkJICogaW1wbHkg dW5pcXVlbmVzcyB1bmRlciB0aGUgY2xhdXNlJ3MgZXF1YWxpdHkgc2VtYW50aWNzLgoJCQkJ ICovCgkJCQlpZiAoIWNvbGxhdGlvbnNfYWdyZWVfb25fZXF1YWxpdHkoaW5kLT5pbmRleGNv bGxhdGlvbnNbY10sCgkJCQkJCQkJCQkJCSAgZXhwcklucHV0Q29sbGF0aW9uKChOb2RlICop IHJpbmZvLT5jbGF1c2UpKSkKCQkJCQljb250aW51ZTsKCgkJCQkvKiBPSywgc2VlIGlmIHRo ZSBjb25kaXRpb24gb3BlcmFuZCBtYXRjaGVzIHRoZSBpbmRleCBrZXkgKi8KCQkJCWlmIChy aW5mby0+b3V0ZXJfaXNfbGVmdCkKCQkJCQlyZXhwciA9IGdldF9yaWdodG9wKHJpbmZvLT5j bGF1c2UpOwoJCQkJZWxzZQoJCQkJCXJleHByID0gZ2V0X2xlZnRvcChyaW5mby0+Y2xhdXNl KTsKCgkJCQlpZiAobWF0Y2hfaW5kZXhfdG9fb3BlcmFuZChyZXhwciwgYywgaW5kKSkKCQkJ CXsKCQkJCQlpZiAoYm1zX21lbWJlcnNoaXAocmluZm8tPmNsYXVzZV9yZWxpZHMpID09IEJN U19TSU5HTEVUT04pCgkJCQkJewoJCQkJCQlNZW1vcnlDb250ZXh0IG9sZE1lbUN0eCA9CgkJ CQkJCQlNZW1vcnlDb250ZXh0U3dpdGNoVG8ocm9vdC0+cGxhbm5lcl9jeHQpOwoKCQkJCQkJ LyoKCQkJCQkJICogQWRkIGZpbHRlciBjbGF1c2UgaW50byBhIGxpc3QgYWxsb3dpbmcgY2Fs bGVyIHRvCgkJCQkJCSAqIGtub3cgaWYgdW5pcXVlbmVzcyBoYXZlIG1hZGUgbm90IG9ubHkg Ynkgam9pbgoJCQkJCQkgKiBjbGF1c2VzLgoJCQkJCQkgKi8KCQkJCQkJQXNzZXJ0KGJtc19p c19lbXB0eShyaW5mby0+bGVmdF9yZWxpZHMpIHx8CgkJCQkJCQkgICBibXNfaXNfZW1wdHko cmluZm8tPnJpZ2h0X3JlbGlkcykpOwoJCQkJCQlpZiAoZXh0cmFfY2xhdXNlcykKCQkJCQkJ CWV4cHJzID0gbGFwcGVuZChleHBycywgcmluZm8pOwoJCQkJCQlNZW1vcnlDb250ZXh0U3dp dGNoVG8ob2xkTWVtQ3R4KTsKCQkJCQl9CgoJCQkJCWJyZWFrOwkJLyogZm91bmQgYSBtYXRj aDsgY29sdW1uIGlzIHVuaXF1ZSAqLwoJCQkJfQoJCQl9CgoJCQlpZiAobGMgPT0gTlVMTCkK CQkJCWJyZWFrOwkJCS8qIG5vIG1hdGNoOyB0aGlzIGluZGV4IGRvZXNuJ3QgaGVscCB1cyAq LwoJCX0KCgkJLyogTWF0Y2hlZCBhbGwga2V5IGNvbHVtbnMgb2YgdGhpcyBpbmRleD8gKi8K CQlpZiAoYyA9PSBpbmQtPm5rZXljb2x1bW5zKQoJCXsKCQkJaWYgKGV4dHJhX2NsYXVzZXMp CgkJCQkqZXh0cmFfY2xhdXNlcyA9IGV4cHJzOwoJCQlyZXR1cm4gdHJ1ZTsKCQl9Cgl9CgoJ cmV0dXJuIGZhbHNlOwp9CgovKgogKiBpbmRleGNvbF9pc19ib29sX2NvbnN0YW50X2Zvcl9x dWVyeQogKgogKiBJZiBhbiBpbmRleCBjb2x1bW4gaXMgY29uc3RyYWluZWQgdG8gaGF2ZSBh IGNvbnN0YW50IHZhbHVlIGJ5IHRoZSBxdWVyeSdzCiAqIFdIRVJFIGNvbmRpdGlvbnMsIHRo ZW4gaXQncyBpcnJlbGV2YW50IGZvciBzb3J0LW9yZGVyIGNvbnNpZGVyYXRpb25zLgogKiBV c3VhbGx5IHRoYXQgbWVhbnMgd2UgaGF2ZSBhIHJlc3RyaWN0aW9uIGNsYXVzZSBXSEVSRSBp bmRleGNvbCA9IGNvbnN0YW50LAogKiB3aGljaCBnZXRzIHR1cm5lZCBpbnRvIGFuIEVxdWl2 YWxlbmNlQ2xhc3MgY29udGFpbmluZyBhIGNvbnN0YW50LCB3aGljaAogKiBpcyByZWNvZ25p emVkIGFzIHJlZHVuZGFudCBieSBidWlsZF9pbmRleF9wYXRoa2V5cygpLiAgQnV0IGlmIHRo ZSBpbmRleAogKiBjb2x1bW4gaXMgYSBib29sZWFuIHZhcmlhYmxlIChvciBleHByZXNzaW9u KSwgdGhlbiB3ZSBhcmUgbm90IGdvaW5nIHRvCiAqIHNlZSBXSEVSRSBpbmRleGNvbCA9IGNv bnN0YW50LCBiZWNhdXNlIGV4cHJlc3Npb24gcHJlcHJvY2Vzc2luZyB3aWxsIGhhdmUKICog c2ltcGxpZmllZCB0aGF0IHRvICJXSEVSRSBpbmRleGNvbCIgb3IgIldIRVJFIE5PVCBpbmRl eGNvbCIuICBTbyB3ZSBhcmUgbm90CiAqIGdvaW5nIHRvIGhhdmUgYSBtYXRjaGluZyBFcXVp dmFsZW5jZUNsYXNzICh1bmxlc3MgdGhlIHF1ZXJ5IGFsc28gY29udGFpbnMKICogIk9SREVS IEJZIGluZGV4Y29sIikuICBUbyBhbGxvdyBzdWNoIGNhc2VzIHRvIHdvcmsgdGhlIHNhbWUg YXMgdGhleSB3b3VsZAogKiBmb3Igbm9uLWJvb2xlYW4gdmFsdWVzLCB0aGlzIGZ1bmN0aW9u IGlzIHByb3ZpZGVkIHRvIGRldGVjdCB3aGV0aGVyIHRoZQogKiBzcGVjaWZpZWQgaW5kZXgg Y29sdW1uIG1hdGNoZXMgYSBib29sZWFuIHJlc3RyaWN0aW9uIGNsYXVzZS4KICovCmJvb2wK aW5kZXhjb2xfaXNfYm9vbF9jb25zdGFudF9mb3JfcXVlcnkoUGxhbm5lckluZm8gKnJvb3Qs CgkJCQkJCQkJCUluZGV4T3B0SW5mbyAqaW5kZXgsCgkJCQkJCQkJCWludCBpbmRleGNvbCkK ewoJTGlzdENlbGwgICAqbGM7CgoJLyogSWYgdGhlIGluZGV4IGlzbid0IGJvb2xlYW4sIHdl IGNhbid0IHBvc3NpYmx5IGdldCBhIG1hdGNoICovCglpZiAoIUlzQm9vbGVhbk9wZmFtaWx5 KGluZGV4LT5vcGZhbWlseVtpbmRleGNvbF0pKQoJCXJldHVybiBmYWxzZTsKCgkvKiBDaGVj ayBlYWNoIHJlc3RyaWN0aW9uIGNsYXVzZSBmb3IgdGhlIGluZGV4J3MgcmVsICovCglmb3Jl YWNoKGxjLCBpbmRleC0+cmVsLT5iYXNlcmVzdHJpY3RpbmZvKQoJewoJCVJlc3RyaWN0SW5m byAqcmluZm8gPSAoUmVzdHJpY3RJbmZvICopIGxmaXJzdChsYyk7CgoJCS8qCgkJICogQXMg aW4gbWF0Y2hfY2xhdXNlX3RvX2luZGV4Y29sLCBuZXZlciBtYXRjaCBwc2V1ZG9jb25zdGFu dHMgdG8KCQkgKiBpbmRleGVzLiAgKEl0IG1pZ2h0IGJlIHNlbWFudGljYWxseSBva2F5IHRv IGRvIHNvIGhlcmUsIGJ1dCB0aGUKCQkgKiBvZGRzIG9mIGdldHRpbmcgYSBtYXRjaCBhcmUg bmVnbGlnaWJsZSwgc28gZG9uJ3Qgd2FzdGUgdGhlIGN5Y2xlcy4pCgkJICovCgkJaWYgKHJp bmZvLT5wc2V1ZG9jb25zdGFudCkKCQkJY29udGludWU7CgoJCS8qIFNlZSBpZiB3ZSBjYW4g bWF0Y2ggdGhlIGNsYXVzZSdzIGV4cHJlc3Npb24gdG8gdGhlIGluZGV4IGNvbHVtbiAqLwoJ CWlmIChtYXRjaF9ib29sZWFuX2luZGV4X2NsYXVzZShyb290LCByaW5mbywgaW5kZXhjb2ws IGluZGV4KSkKCQkJcmV0dXJuIHRydWU7Cgl9CgoJcmV0dXJuIGZhbHNlOwp9CgoKLyoqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioKICoJCQkJLS0tLSAgUk9VVElORVMgVE8gQ0hFQ0sgT1BFUkFO RFMgIC0tLS0KICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgovKgogKiBtYXRjaF9pbmRleF90 b19vcGVyYW5kKCkKICoJICBHZW5lcmFsaXplZCB0ZXN0IGZvciBhIG1hdGNoIGJldHdlZW4g YW4gaW5kZXgncyBrZXkKICoJICBhbmQgdGhlIG9wZXJhbmQgb24gb25lIHNpZGUgb2YgYSBy ZXN0cmljdGlvbiBvciBqb2luIGNsYXVzZS4KICoKICogb3BlcmFuZDogdGhlIG5vZGV0cmVl IHRvIGJlIGNvbXBhcmVkIHRvIHRoZSBpbmRleAogKiBpbmRleGNvbDogdGhlIGNvbHVtbiBu dW1iZXIgb2YgdGhlIGluZGV4IChjb3VudGluZyBmcm9tIDApCiAqIGluZGV4OiB0aGUgaW5k ZXggb2YgaW50ZXJlc3QKICoKICogTm90ZSB0aGF0IHdlIGFyZW4ndCBpbnRlcmVzdGVkIGlu IGNvbGxhdGlvbnMgaGVyZTsgdGhlIGNhbGxlciBtdXN0IGNoZWNrCiAqIGZvciBhIGNvbGxh dGlvbiBtYXRjaCwgaWYgaXQncyBkZWFsaW5nIHdpdGggYW4gb3BlcmF0b3Igd2hlcmUgdGhh dCBtYXR0ZXJzLgogKgogKiBUaGlzIGlzIGV4cG9ydGVkIGZvciB1c2UgaW4gc2VsZnVuY3Mu Yy4KICovCmJvb2wKbWF0Y2hfaW5kZXhfdG9fb3BlcmFuZChOb2RlICpvcGVyYW5kLAoJCQkJ CSAgIGludCBpbmRleGNvbCwKCQkJCQkgICBJbmRleE9wdEluZm8gKmluZGV4KQp7CglpbnQJ CQlpbmRrZXk7CgoJLyoKCSAqIElnbm9yZSBhbnkgUGxhY2VIb2xkZXJWYXIgbm9kZSBjb250 YWluZWQgaW4gdGhlIG9wZXJhbmQuICBUaGlzIGlzCgkgKiBuZWVkZWQgdG8gYmUgYWJsZSB0 byBhcHBseSBpbmRleHNjYW5uaW5nIGluIGNhc2VzIHdoZXJlIHRoZSBvcGVyYW5kIChvcgoJ ICogYSBzdWJ0cmVlKSBoYXMgYmVlbiB3cmFwcGVkIGluIFBsYWNlSG9sZGVyVmFycyB0byBl bmZvcmNlIHNlcGFyYXRlCgkgKiBpZGVudGl0eSBvciBhcyBhIHJlc3VsdCBvZiBvdXRlciBq b2lucy4KCSAqLwoJb3BlcmFuZCA9IHN0cmlwX25vb3BfcGh2cyhvcGVyYW5kKTsKCgkvKgoJ ICogSWdub3JlIGFueSBSZWxhYmVsVHlwZSBub2RlIGFib3ZlIHRoZSBvcGVyYW5kLiAgVGhp cyBpcyBuZWVkZWQgdG8gYmUKCSAqIGFibGUgdG8gYXBwbHkgaW5kZXhzY2FubmluZyBpbiBi aW5hcnktY29tcGF0aWJsZS1vcGVyYXRvciBjYXNlcy4KCSAqCgkgKiBOb3RlOiB3ZSBtdXN0 IGhhbmRsZSBuZXN0ZWQgUmVsYWJlbFR5cGUgbm9kZXMgaGVyZS4gIFdoaWxlCgkgKiBldmFs X2NvbnN0X2V4cHJlc3Npb25zKCkgd2lsbCBoYXZlIHNpbXBsaWZpZWQgdGhlbSB0byBhdCBt b3N0IG9uZQoJICogbGF5ZXIsIG91ciBwcmlvciBzdHJpcHBpbmcgb2YgUGxhY2VIb2xkZXJW YXJzIG1heSBoYXZlIGJyb3VnaHQgc2VwYXJhdGUKCSAqIFJlbGFiZWxUeXBlcyBpbnRvIGFk amFjZW5jeS4KCSAqLwoJd2hpbGUgKG9wZXJhbmQgJiYgSXNBKG9wZXJhbmQsIFJlbGFiZWxU eXBlKSkKCQlvcGVyYW5kID0gKE5vZGUgKikgKChSZWxhYmVsVHlwZSAqKSBvcGVyYW5kKS0+ YXJnOwoKCWluZGtleSA9IGluZGV4LT5pbmRleGtleXNbaW5kZXhjb2xdOwoJaWYgKGluZGtl eSAhPSAwKQoJewoJCS8qCgkJICogU2ltcGxlIGluZGV4IGNvbHVtbjsgb3BlcmFuZCBtdXN0 IGJlIGEgbWF0Y2hpbmcgVmFyLgoJCSAqLwoJCWlmIChvcGVyYW5kICYmIElzQShvcGVyYW5k LCBWYXIpICYmCgkJCWluZGV4LT5yZWwtPnJlbGlkID09ICgoVmFyICopIG9wZXJhbmQpLT52 YXJubyAmJgoJCQlpbmRrZXkgPT0gKChWYXIgKikgb3BlcmFuZCktPnZhcmF0dG5vICYmCgkJ CSgoVmFyICopIG9wZXJhbmQpLT52YXJudWxsaW5ncmVscyA9PSBOVUxMKQoJCQlyZXR1cm4g dHJ1ZTsKCX0KCWVsc2UKCXsKCQkvKgoJCSAqIEluZGV4IGV4cHJlc3Npb247IGZpbmQgdGhl IGNvcnJlY3QgZXhwcmVzc2lvbi4gIChUaGlzIHNlYXJjaCBjb3VsZAoJCSAqIGJlIGF2b2lk ZWQsIGF0IHRoZSBjb3N0IG9mIGNvbXBsaWNhdGluZyBhbGwgdGhlIGNhbGxlcnMgb2YgdGhp cwoJCSAqIHJvdXRpbmU7IGRvZXNuJ3Qgc2VlbSB3b3J0aCBpdC4pCgkJICovCgkJTGlzdENl bGwgICAqaW5kZXhwcl9pdGVtOwoJCWludAkJCWk7CgkJTm9kZQkgICAqaW5kZXhrZXk7CgoJ CWluZGV4cHJfaXRlbSA9IGxpc3RfaGVhZChpbmRleC0+aW5kZXhwcnNFeHBhbmQpOwoJCWZv ciAoaSA9IDA7IGkgPCBpbmRleGNvbDsgaSsrKQoJCXsKCQkJaWYgKGluZGV4LT5pbmRleGtl eXNbaV0gPT0gMCkKCQkJewoJCQkJaWYgKGluZGV4cHJfaXRlbSA9PSBOVUxMKQoJCQkJCWVs b2coRVJST1IsICJ3cm9uZyBudW1iZXIgb2YgaW5kZXggZXhwcmVzc2lvbnMiKTsKCQkJCWlu ZGV4cHJfaXRlbSA9IGxuZXh0KGluZGV4LT5pbmRleHByc0V4cGFuZCwgaW5kZXhwcl9pdGVt KTsKCQkJfQoJCX0KCQlpZiAoaW5kZXhwcl9pdGVtID09IE5VTEwpCgkJCWVsb2coRVJST1Is ICJ3cm9uZyBudW1iZXIgb2YgaW5kZXggZXhwcmVzc2lvbnMiKTsKCQlpbmRleGtleSA9IChO b2RlICopIGxmaXJzdChpbmRleHByX2l0ZW0pOwoKCQkvKgoJCSAqIERvZXMgaXQgbWF0Y2gg dGhlIG9wZXJhbmQ/ICBBZ2Fpbiwgc3RyaXAgYW55IHJlbGFiZWxpbmcuCgkJICovCgkJaWYg KGluZGV4a2V5ICYmIElzQShpbmRleGtleSwgUmVsYWJlbFR5cGUpKQoJCQlpbmRleGtleSA9 IChOb2RlICopICgoUmVsYWJlbFR5cGUgKikgaW5kZXhrZXkpLT5hcmc7CgoJCWlmIChlcXVh bChpbmRleGtleSwgb3BlcmFuZCkpCgkJCXJldHVybiB0cnVlOwoJfQoKCXJldHVybiBmYWxz ZTsKfQoKLyoKICogaXNfcHNldWRvX2NvbnN0YW50X2Zvcl9pbmRleCgpCiAqCSAgVGVzdCB3 aGV0aGVyIHRoZSBnaXZlbiBleHByZXNzaW9uIGNhbiBiZSB1c2VkIGFzIGFuIGluZGV4c2Nh bgogKgkgIGNvbXBhcmlzb24gdmFsdWUuCiAqCiAqIEFuIGluZGV4c2NhbiBjb21wYXJpc29u IHZhbHVlIG11c3Qgbm90IGNvbnRhaW4gYW55IHZvbGF0aWxlIGZ1bmN0aW9ucywKICogYW5k IGl0IGNhbid0IGNvbnRhaW4gYW55IFZhcnMgb2YgdGhlIGluZGV4J3Mgb3duIHRhYmxlLiAg VmFycyBvZgogKiBvdGhlciB0YWJsZXMgYXJlIG9rYXksIHRob3VnaDsgaW4gdGhhdCBjYXNl IHdlJ2QgYmUgcHJvZHVjaW5nIGFuCiAqIGluZGV4cXVhbCB1c2FibGUgaW4gYSBwYXJhbWV0 ZXJpemVkIGluZGV4c2Nhbi4gIFRoaXMgaXMsIHRoZXJlZm9yZSwKICogYSB3ZWFrZXIgY29u ZGl0aW9uIHRoYW4gaXNfcHNldWRvX2NvbnN0YW50X2NsYXVzZSgpLgogKgogKiBUaGlzIGZ1 bmN0aW9uIGlzIGV4cG9ydGVkIGZvciB1c2UgYnkgcGxhbm5lciBzdXBwb3J0IGZ1bmN0aW9u cywKICogd2hpY2ggd2lsbCBoYXZlIGF2YWlsYWJsZSB0aGUgSW5kZXhPcHRJbmZvLCBidXQg bm90IGFueSBSZXN0cmljdEluZm8KICogaW5mcmFzdHJ1Y3R1cmUuICBJdCBpcyBtYWtpbmcg dGhlIHNhbWUgdGVzdCBtYWRlIGJ5IGZ1bmN0aW9ucyBhYm92ZQogKiBzdWNoIGFzIG1hdGNo X29wY2xhdXNlX3RvX2luZGV4Y29sKCksIGJ1dCB0aG9zZSByZWx5IHdoZXJlIHBvc3NpYmxl CiAqIG9uIFJlc3RyaWN0SW5mbyBpbmZvcm1hdGlvbiBhYm91dCB2YXJpYWJsZSBtZW1iZXJz aGlwLgogKgogKiBleHByOiB0aGUgbm9kZXRyZWUgdG8gYmUgY2hlY2tlZAogKiBpbmRleDog dGhlIGluZGV4IG9mIGludGVyZXN0CiAqLwpib29sCmlzX3BzZXVkb19jb25zdGFudF9mb3Jf aW5kZXgoUGxhbm5lckluZm8gKnJvb3QsIE5vZGUgKmV4cHIsIEluZGV4T3B0SW5mbyAqaW5k ZXgpCnsKCS8qIHB1bGxfdmFybm9zIGlzIGNoZWFwZXIgdGhhbiB2b2xhdGlsaXR5IGNoZWNr LCBzbyBkbyB0aGF0IGZpcnN0ICovCglpZiAoYm1zX2lzX21lbWJlcihpbmRleC0+cmVsLT5y ZWxpZCwgcHVsbF92YXJub3Mocm9vdCwgZXhwcikpKQoJCXJldHVybiBmYWxzZTsJCQkvKiBu byBnb29kLCBjb250YWlucyBWYXIgb2YgdGFibGUgKi8KCWlmIChjb250YWluX3ZvbGF0aWxl X2Z1bmN0aW9ucyhleHByKSkKCQlyZXR1cm4gZmFsc2U7CQkJLyogbm8gZ29vZCwgdm9sYXRp bGUgY29tcGFyaXNvbiB2YWx1ZSAqLwoJcmV0dXJuIHRydWU7Cn0KAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAuL21ha2VmdW5jcy5jAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDAwMDY2NAAwMDAxNzUwADAwMDE3NTAA MDAwMDAwNTcwMTcAMTUyMjE2MTUzNDEAMDEyMDM3ACAwAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHVzdGFyICAAeG1hbgAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAB4bWFuAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogKgogKiBtYWtlZnVuY3MuYwogKgkg IGNyZWF0b3IgZnVuY3Rpb25zIGZvciB2YXJpb3VzIG5vZGVzLiBUaGUgZnVuY3Rpb25zIGhl cmUgYXJlIGZvciB0aGUKICoJICBtb3N0IGZyZXF1ZW50bHkgY3JlYXRlZCBub2Rlcy4KICoK ICogUG9ydGlvbnMgQ29weXJpZ2h0IChjKSAxOTk2LTIwMjYsIFBvc3RncmVTUUwgR2xvYmFs IERldmVsb3BtZW50IEdyb3VwCiAqIFBvcnRpb25zIENvcHlyaWdodCAoYykgMTk5NCwgUmVn ZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhCiAqCiAqCiAqIElERU5USUZJ Q0FUSU9OCiAqCSAgc3JjL2JhY2tlbmQvbm9kZXMvbWFrZWZ1bmNzLmMKICoKICotLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tCiAqLwojaW5jbHVkZSAicG9zdGdyZXMuaCIKCiNpbmNsdWRlICJjYXRh bG9nL3BnX2NsYXNzLmgiCiNpbmNsdWRlICJjYXRhbG9nL3BnX3R5cGUuaCIKI2luY2x1ZGUg Im5vZGVzL21ha2VmdW5jcy5oIgojaW5jbHVkZSAibm9kZXMvbm9kZUZ1bmNzLmgiCiNpbmNs dWRlICJ1dGlscy9sc3lzY2FjaGUuaCIKCgovKgogKiBtYWtlQV9FeHByIC0KICoJCW1ha2Vz IGFuIEFfRXhwciBub2RlCiAqLwpBX0V4cHIgKgptYWtlQV9FeHByKEFfRXhwcl9LaW5kIGtp bmQsIExpc3QgKm5hbWUsCgkJICAgTm9kZSAqbGV4cHIsIE5vZGUgKnJleHByLCBpbnQgbG9j YXRpb24pCnsKCUFfRXhwcgkgICAqYSA9IG1ha2VOb2RlKEFfRXhwcik7CgoJYS0+a2luZCA9 IGtpbmQ7CglhLT5uYW1lID0gbmFtZTsKCWEtPmxleHByID0gbGV4cHI7CglhLT5yZXhwciA9 IHJleHByOwoJYS0+bG9jYXRpb24gPSBsb2NhdGlvbjsKCXJldHVybiBhOwp9CgovKgogKiBt YWtlU2ltcGxlQV9FeHByIC0KICoJCUFzIGFib3ZlLCBnaXZlbiBhIHNpbXBsZSAodW5xdWFs aWZpZWQpIG9wZXJhdG9yIG5hbWUKICovCkFfRXhwciAqCm1ha2VTaW1wbGVBX0V4cHIoQV9F eHByX0tpbmQga2luZCwgY2hhciAqbmFtZSwKCQkJCSBOb2RlICpsZXhwciwgTm9kZSAqcmV4 cHIsIGludCBsb2NhdGlvbikKewoJQV9FeHByCSAgICphID0gbWFrZU5vZGUoQV9FeHByKTsK CglhLT5raW5kID0ga2luZDsKCWEtPm5hbWUgPSBsaXN0X21ha2UxKG1ha2VTdHJpbmcobmFt ZSkpOwoJYS0+bGV4cHIgPSBsZXhwcjsKCWEtPnJleHByID0gcmV4cHI7CglhLT5sb2NhdGlv biA9IGxvY2F0aW9uOwoJcmV0dXJuIGE7Cn0KCi8qCiAqIG1ha2VWYXIgLQogKgkgIGNyZWF0 ZXMgYSBWYXIgbm9kZQogKi8KVmFyICoKbWFrZVZhcihpbnQgdmFybm8sCgkJQXR0ck51bWJl ciB2YXJhdHRubywKCQlPaWQgdmFydHlwZSwKCQlpbnQzMiB2YXJ0eXBtb2QsCgkJT2lkIHZh cmNvbGxpZCwKCQlJbmRleCB2YXJsZXZlbHN1cCkKewoJVmFyCQkgICAqdmFyID0gbWFrZU5v ZGUoVmFyKTsKCgl2YXItPnZhcm5vID0gdmFybm87Cgl2YXItPnZhcmF0dG5vID0gdmFyYXR0 bm87Cgl2YXItPnZhcnR5cGUgPSB2YXJ0eXBlOwoJdmFyLT52YXJ0eXBtb2QgPSB2YXJ0eXBt b2Q7Cgl2YXItPnZhcmNvbGxpZCA9IHZhcmNvbGxpZDsKCXZhci0+dmFybGV2ZWxzdXAgPSB2 YXJsZXZlbHN1cDsKCgkvKgoJICogT25seSBhIGZldyBjYWxsZXJzIG5lZWQgdG8gbWFrZSBW YXIgbm9kZXMgd2l0aCB2YXJyZXR1cm5pbmd0eXBlCgkgKiBkaWZmZXJlbnQgZnJvbSBWQVJf UkVUVVJOSU5HX0RFRkFVTFQsIG5vbi1udWxsIHZhcm51bGxpbmdyZWxzLCBvciB3aXRoCgkg KiB2YXJub3N5bi92YXJhdHRub3N5biBkaWZmZXJlbnQgZnJvbSB2YXJuby92YXJhdHRuby4g IFdlIGRvbid0IHByb3ZpZGUKCSAqIHNlcGFyYXRlIGFyZ3VtZW50cyBmb3IgdGhlbSwgYnV0 IGp1c3QgaW5pdGlhbGl6ZSB0aGVtIHRvIHNlbnNpYmxlCgkgKiBkZWZhdWx0IHZhbHVlcy4g IFRoaXMgcmVkdWNlcyBjb2RlIGNsdXR0ZXIgYW5kIGNoYW5jZSBvZiBlcnJvciBmb3IgbW9z dAoJICogY2FsbGVycy4KCSAqLwoJdmFyLT52YXJyZXR1cm5pbmd0eXBlID0gVkFSX1JFVFVS TklOR19ERUZBVUxUOwoJdmFyLT52YXJudWxsaW5ncmVscyA9IE5VTEw7Cgl2YXItPnZhcm5v c3luID0gKEluZGV4KSB2YXJubzsKCXZhci0+dmFyYXR0bm9zeW4gPSB2YXJhdHRubzsKCgkv KiBMaWtld2lzZSwgd2UganVzdCBzZXQgbG9jYXRpb24gdG8gInVua25vd24iIGhlcmUgKi8K CXZhci0+bG9jYXRpb24gPSAtMTsKCglyZXR1cm4gdmFyOwp9CgovKgogKiBtYWtlVmFyRnJv bVRhcmdldEVudHJ5IC0KICoJCWNvbnZlbmllbmNlIGZ1bmN0aW9uIHRvIGNyZWF0ZSBhIHNh bWUtbGV2ZWwgVmFyIG5vZGUgZnJvbSBhCiAqCQlUYXJnZXRFbnRyeQogKi8KVmFyICoKbWFr ZVZhckZyb21UYXJnZXRFbnRyeShpbnQgdmFybm8sCgkJCQkJICAgVGFyZ2V0RW50cnkgKnRs ZSkKewoJcmV0dXJuIG1ha2VWYXIodmFybm8sCgkJCQkgICB0bGUtPnJlc25vLAoJCQkJICAg ZXhwclR5cGUoKE5vZGUgKikgdGxlLT5leHByKSwKCQkJCSAgIGV4cHJUeXBtb2QoKE5vZGUg KikgdGxlLT5leHByKSwKCQkJCSAgIGV4cHJDb2xsYXRpb24oKE5vZGUgKikgdGxlLT5leHBy KSwKCQkJCSAgIDApOwp9CgovKgogKiBtYWtlV2hvbGVSb3dWYXIgLQogKgkgIGNyZWF0ZXMg YSBWYXIgbm9kZSByZXByZXNlbnRpbmcgYSB3aG9sZSByb3cgb2YgdGhlIHNwZWNpZmllZCBS VEUKICoKICogQSB3aG9sZS1yb3cgcmVmZXJlbmNlIGlzIGEgVmFyIHdpdGggdmFybm8gc2V0 IHRvIHRoZSBjb3JyZWN0IHJhbmdlCiAqIHRhYmxlIGVudHJ5LCBhbmQgdmFyYXR0bm8gPT0g MCB0byBzaWduYWwgdGhhdCBpdCByZWZlcmVuY2VzIHRoZSB3aG9sZQogKiB0dXBsZS4gIChV c2Ugb2YgemVybyBoZXJlIGlzIHVuY2xlYW4sIHNpbmNlIGl0IGNvdWxkIGVhc2lseSBiZSBj b25mdXNlZAogKiB3aXRoIGVycm9yIGNhc2VzLCBidXQgaXQncyBub3Qgd29ydGggY2hhbmdp bmcgbm93LikgIFRoZSB2YXJ0eXBlIGluZGljYXRlcwogKiBhIHJvd3R5cGU7IGVpdGhlciBh IG5hbWVkIGNvbXBvc2l0ZSB0eXBlLCBvciBhIGRvbWFpbiBvdmVyIGEgbmFtZWQKICogY29t cG9zaXRlIHR5cGUgKG9ubHkgcG9zc2libGUgaWYgdGhlIFJURSBpcyBhIGZ1bmN0aW9uIHJl dHVybmluZyB0aGF0KSwKICogb3IgUkVDT1JELiAgVGhpcyBmdW5jdGlvbiBlbmNhcHN1bGF0 ZXMgdGhlIGxvZ2ljIGZvciBkZXRlcm1pbmluZyB0aGUKICogY29ycmVjdCByb3d0eXBlIE9J RCB0byB1c2UuCiAqCiAqIElmIGFsbG93U2NhbGFyIGlzIHRydWUsIHRoZW4gZm9yIHRoZSBj YXNlIHdoZXJlIHRoZSBSVEUgaXMgYSBzaW5nbGUgZnVuY3Rpb24KICogcmV0dXJuaW5nIGEg bm9uLWNvbXBvc2l0ZSByZXN1bHQgdHlwZSwgd2UgcHJvZHVjZSBhIG5vcm1hbCBWYXIgcmVm ZXJlbmNpbmcKICogdGhlIGZ1bmN0aW9uJ3MgcmVzdWx0IGRpcmVjdGx5LCBpbnN0ZWFkIG9m IHRoZSBzaW5nbGUtY29sdW1uIGNvbXBvc2l0ZQogKiB2YWx1ZSB0aGF0IHRoZSB3aG9sZS1y b3cgbm90YXRpb24gbWlnaHQgb3RoZXJ3aXNlIHN1Z2dlc3QuCiAqLwpWYXIgKgptYWtlV2hv bGVSb3dWYXIoUmFuZ2VUYmxFbnRyeSAqcnRlLAoJCQkJaW50IHZhcm5vLAoJCQkJSW5kZXgg dmFybGV2ZWxzdXAsCgkJCQlib29sIGFsbG93U2NhbGFyKQp7CglWYXIJCSAgICpyZXN1bHQ7 CglPaWQJCQl0b2lkOwoJTm9kZQkgICAqZmV4cHI7CgoJc3dpdGNoIChydGUtPnJ0ZWtpbmQp Cgl7CgkJY2FzZSBSVEVfUkVMQVRJT046CgkJCS8qIHJlbGF0aW9uOiB0aGUgcm93dHlwZSBp cyBhIG5hbWVkIGNvbXBvc2l0ZSB0eXBlICovCgkJCXRvaWQgPSBnZXRfcmVsX3R5cGVfaWQo cnRlLT5yZWxpZCk7CgkJCWlmICghT2lkSXNWYWxpZCh0b2lkKSkKCQkJCWVyZXBvcnQoRVJS T1IsCgkJCQkJCShlcnJjb2RlKEVSUkNPREVfV1JPTkdfT0JKRUNUX1RZUEUpLAoJCQkJCQkg ZXJybXNnKCJyZWxhdGlvbiBcIiVzXCIgZG9lcyBub3QgaGF2ZSBhIGNvbXBvc2l0ZSB0eXBl IiwKCQkJCQkJCQlnZXRfcmVsX25hbWUocnRlLT5yZWxpZCkpKSk7CgkJCXJlc3VsdCA9IG1h a2VWYXIodmFybm8sCgkJCQkJCQkgSW52YWxpZEF0dHJOdW1iZXIsCgkJCQkJCQkgdG9pZCwK CQkJCQkJCSAtMSwKCQkJCQkJCSBJbnZhbGlkT2lkLAoJCQkJCQkJIHZhcmxldmVsc3VwKTsK CQkJYnJlYWs7CgoJCWNhc2UgUlRFX1NVQlFVRVJZOgoKCQkJLyoKCQkJICogRm9yIGEgc3Rh bmRhcmQgc3VicXVlcnksIHRoZSBWYXIgc2hvdWxkIGJlIG9mIFJFQ09SRCB0eXBlLgoJCQkg KiBIb3dldmVyLCBpZiB3ZSdyZSBsb29raW5nIGF0IGEgc3VicXVlcnkgdGhhdCB3YXMgZXhw YW5kZWQgZnJvbQoJCQkgKiBhIHZpZXcgb3IgU1JGIChvbmx5IHBvc3NpYmxlIGR1cmluZyBw bGFubmluZyksIHdlIG11c3QgdXNlIHRoZQoJCQkgKiBhcHByb3ByaWF0ZSByb3d0eXBlLCBz byB0aGF0IHRoZSByZXN1bHRpbmcgVmFyIGhhcyB0aGUgc2FtZQoJCQkgKiB0eXBlIHRoYXQg d2Ugd291bGQgaGF2ZSBwcm9kdWNlZCBmcm9tIHRoZSBvcmlnaW5hbCBSVEUuCgkJCSAqLwoJ CQlpZiAoT2lkSXNWYWxpZChydGUtPnJlbGlkKSkKCQkJewoJCQkJLyogU3VicXVlcnkgd2Fz IGV4cGFuZGVkIGZyb20gYSB2aWV3ICovCgkJCQl0b2lkID0gZ2V0X3JlbF90eXBlX2lkKHJ0 ZS0+cmVsaWQpOwoJCQkJaWYgKCFPaWRJc1ZhbGlkKHRvaWQpKQoJCQkJCWVyZXBvcnQoRVJS T1IsCgkJCQkJCQkoZXJyY29kZShFUlJDT0RFX1dST05HX09CSkVDVF9UWVBFKSwKCQkJCQkJ CSBlcnJtc2coInJlbGF0aW9uIFwiJXNcIiBkb2VzIG5vdCBoYXZlIGEgY29tcG9zaXRlIHR5 cGUiLAoJCQkJCQkJCQlnZXRfcmVsX25hbWUocnRlLT5yZWxpZCkpKSk7CgkJCX0KCQkJZWxz ZSBpZiAocnRlLT5mdW5jdGlvbnMpCgkJCXsKCQkJCS8qCgkJCQkgKiBTdWJxdWVyeSB3YXMg ZXhwYW5kZWQgZnJvbSBhIHNldC1yZXR1cm5pbmcgZnVuY3Rpb24uICBUaGF0CgkJCQkgKiB3 b3VsZCBub3QgaGF2ZSBoYXBwZW5lZCBpZiB0aGVyZSdzIG1vcmUgdGhhbiBvbmUgZnVuY3Rp b24KCQkJCSAqIG9yIG9yZGluYWxpdHkgd2FzIHJlcXVlc3RlZC4gIFdlIGFsc28gbmVlZG4n dCB3b3JyeSBhYm91dAoJCQkJICogdGhlIGFsbG93U2NhbGFyIGNhc2UsIHNpbmNlIHRoZSBw bGFubmVyIGRvZXNuJ3QgdXNlIHRoYXQuCgkJCQkgKiBPdGhlcndpc2UgdGhpcyBtdXN0IG1h dGNoIHRoZSBSVEVfRlVOQ1RJT04gY29kZSBiZWxvdy4KCQkJCSAqLwoJCQkJQXNzZXJ0KCFh bGxvd1NjYWxhcik7CgkJCQlmZXhwciA9ICgoUmFuZ2VUYmxGdW5jdGlvbiAqKSBsaW5pdGlh bChydGUtPmZ1bmN0aW9ucykpLT5mdW5jZXhwcjsKCQkJCXRvaWQgPSBleHByVHlwZShmZXhw cik7CgkJCQlpZiAoIXR5cGVfaXNfcm93dHlwZSh0b2lkKSkKCQkJCQl0b2lkID0gUkVDT1JE T0lEOwoJCQl9CgkJCWVsc2UKCQkJewoJCQkJLyogTm9ybWFsIHN1YnF1ZXJ5LWluLUZST00g Ki8KCQkJCXRvaWQgPSBSRUNPUkRPSUQ7CgkJCX0KCQkJcmVzdWx0ID0gbWFrZVZhcih2YXJu bywKCQkJCQkJCSBJbnZhbGlkQXR0ck51bWJlciwKCQkJCQkJCSB0b2lkLAoJCQkJCQkJIC0x LAoJCQkJCQkJIEludmFsaWRPaWQsCgkJCQkJCQkgdmFybGV2ZWxzdXApOwoJCQlicmVhazsK CgkJY2FzZSBSVEVfRlVOQ1RJT046CgoJCQkvKgoJCQkgKiBJZiB0aGVyZSdzIG1vcmUgdGhh biBvbmUgZnVuY3Rpb24sIG9yIG9yZGluYWxpdHkgaXMgcmVxdWVzdGVkLAoJCQkgKiBmb3Jj ZSBhIFJFQ09SRCByZXN1bHQsIHNpbmNlIHRoZXJlJ3MgY2VydGFpbmx5IG1vcmUgdGhhbiBv bmUKCQkJICogY29sdW1uIGludm9sdmVkIGFuZCBpdCBjYW4ndCBiZSBhIGtub3duIG5hbWVk IHR5cGUuCgkJCSAqLwoJCQlpZiAocnRlLT5mdW5jb3JkaW5hbGl0eSB8fCBsaXN0X2xlbmd0 aChydGUtPmZ1bmN0aW9ucykgIT0gMSkKCQkJewoJCQkJLyogYWx3YXlzIHByb2R1Y2VzIGFu IGFub255bW91cyBSRUNPUkQgcmVzdWx0ICovCgkJCQlyZXN1bHQgPSBtYWtlVmFyKHZhcm5v LAoJCQkJCQkJCSBJbnZhbGlkQXR0ck51bWJlciwKCQkJCQkJCQkgUkVDT1JET0lELAoJCQkJ CQkJCSAtMSwKCQkJCQkJCQkgSW52YWxpZE9pZCwKCQkJCQkJCQkgdmFybGV2ZWxzdXApOwoJ CQkJYnJlYWs7CgkJCX0KCgkJCWZleHByID0gKChSYW5nZVRibEZ1bmN0aW9uICopIGxpbml0 aWFsKHJ0ZS0+ZnVuY3Rpb25zKSktPmZ1bmNleHByOwoJCQl0b2lkID0gZXhwclR5cGUoZmV4 cHIpOwoJCQlpZiAodHlwZV9pc19yb3d0eXBlKHRvaWQpKQoJCQl7CgkJCQkvKiBmdW5jIHJl dHVybnMgY29tcG9zaXRlOyBzYW1lIGFzIHJlbGF0aW9uIGNhc2UgKi8KCQkJCXJlc3VsdCA9 IG1ha2VWYXIodmFybm8sCgkJCQkJCQkJIEludmFsaWRBdHRyTnVtYmVyLAoJCQkJCQkJCSB0 b2lkLAoJCQkJCQkJCSAtMSwKCQkJCQkJCQkgSW52YWxpZE9pZCwKCQkJCQkJCQkgdmFybGV2 ZWxzdXApOwoJCQl9CgkJCWVsc2UgaWYgKGFsbG93U2NhbGFyKQoJCQl7CgkJCQkvKiBmdW5j IHJldHVybnMgc2NhbGFyOyBqdXN0IHJldHVybiBpdHMgb3V0cHV0IGFzLWlzICovCgkJCQly ZXN1bHQgPSBtYWtlVmFyKHZhcm5vLAoJCQkJCQkJCSAxLAoJCQkJCQkJCSB0b2lkLAoJCQkJ CQkJCSAtMSwKCQkJCQkJCQkgZXhwckNvbGxhdGlvbihmZXhwciksCgkJCQkJCQkJIHZhcmxl dmVsc3VwKTsKCQkJfQoJCQllbHNlCgkJCXsKCQkJCS8qIGZ1bmMgcmV0dXJucyBzY2FsYXIs IGJ1dCB3ZSB3YW50IGEgY29tcG9zaXRlIHJlc3VsdCAqLwoJCQkJcmVzdWx0ID0gbWFrZVZh cih2YXJubywKCQkJCQkJCQkgSW52YWxpZEF0dHJOdW1iZXIsCgkJCQkJCQkJIFJFQ09SRE9J RCwKCQkJCQkJCQkgLTEsCgkJCQkJCQkJIEludmFsaWRPaWQsCgkJCQkJCQkJIHZhcmxldmVs c3VwKTsKCQkJfQoJCQlicmVhazsKCgkJZGVmYXVsdDoKCgkJCS8qCgkJCSAqIFJURSBpcyBh IGpvaW4sIHRhYmxlZnVuYywgVkFMVUVTLCBDVEUsIGV0Yy4gIFdlIHJlcHJlc2VudCB0aGVz ZQoJCQkgKiBjYXNlcyBhcyBhIHdob2xlLXJvdyBWYXIgb2YgUkVDT1JEIHR5cGUuICAoTm90 ZSB0aGF0IGluIG1vc3QKCQkJICogY2FzZXMgdGhlIFZhciB3aWxsIGJlIGV4cGFuZGVkIHRv IGEgUm93RXhwciBkdXJpbmcgcGxhbm5pbmcsCgkJCSAqIGJ1dCB0aGF0IGlzIG5vdCBvdXIg Y29uY2VybiBoZXJlLikKCQkJICovCgkJCXJlc3VsdCA9IG1ha2VWYXIodmFybm8sCgkJCQkJ CQkgSW52YWxpZEF0dHJOdW1iZXIsCgkJCQkJCQkgUkVDT1JET0lELAoJCQkJCQkJIC0xLAoJ CQkJCQkJIEludmFsaWRPaWQsCgkJCQkJCQkgdmFybGV2ZWxzdXApOwoJCQlicmVhazsKCX0K CglyZXR1cm4gcmVzdWx0Owp9CgovKgogKiBtYWtlVGFyZ2V0RW50cnkgLQogKgkgIGNyZWF0 ZXMgYSBUYXJnZXRFbnRyeSBub2RlCiAqLwpUYXJnZXRFbnRyeSAqCm1ha2VUYXJnZXRFbnRy eShFeHByICpleHByLAoJCQkJQXR0ck51bWJlciByZXNubywKCQkJCWNoYXIgKnJlc25hbWUs CgkJCQlib29sIHJlc2p1bmspCnsKCVRhcmdldEVudHJ5ICp0bGUgPSBtYWtlTm9kZShUYXJn ZXRFbnRyeSk7CgoJdGxlLT5leHByID0gZXhwcjsKCXRsZS0+cmVzbm8gPSByZXNubzsKCXRs ZS0+cmVzbmFtZSA9IHJlc25hbWU7CgoJLyoKCSAqIFdlIGFsd2F5cyBzZXQgdGhlc2UgZmll bGRzIHRvIDAuIElmIHRoZSBjYWxsZXIgd2FudHMgdG8gY2hhbmdlIHRoZW0gaGUKCSAqIG11 c3QgZG8gc28gZXhwbGljaXRseS4gIEZldyBjYWxsZXJzIGRvIHRoYXQsIHNvIG9taXR0aW5n IHRoZXNlCgkgKiBhcmd1bWVudHMgcmVkdWNlcyB0aGUgY2hhbmNlIG9mIGVycm9yLgoJICov Cgl0bGUtPnJlc3NvcnRncm91cHJlZiA9IDA7Cgl0bGUtPnJlc29yaWd0YmwgPSBJbnZhbGlk T2lkOwoJdGxlLT5yZXNvcmlnY29sID0gMDsKCgl0bGUtPnJlc2p1bmsgPSByZXNqdW5rOwoK CXJldHVybiB0bGU7Cn0KCi8qCiAqIGZsYXRDb3B5VGFyZ2V0RW50cnkgLQogKgkgIGR1cGxp Y2F0ZSBhIFRhcmdldEVudHJ5LCBidXQgZG9uJ3QgY29weSBzdWJzdHJ1Y3R1cmUKICoKICog VGhpcyBpcyBjb21tb25seSB1c2VkIHdoZW4gd2UganVzdCB3YW50IHRvIG1vZGlmeSB0aGUg cmVzbm8gb3Igc3Vic3RpdHV0ZQogKiBhIG5ldyBleHByZXNzaW9uLgogKi8KVGFyZ2V0RW50 cnkgKgpmbGF0Q29weVRhcmdldEVudHJ5KFRhcmdldEVudHJ5ICpzcmNfdGxlKQp7CglUYXJn ZXRFbnRyeSAqdGxlID0gbWFrZU5vZGUoVGFyZ2V0RW50cnkpOwoKCUFzc2VydChJc0Eoc3Jj X3RsZSwgVGFyZ2V0RW50cnkpKTsKCW1lbWNweSh0bGUsIHNyY190bGUsIHNpemVvZihUYXJn ZXRFbnRyeSkpOwoJcmV0dXJuIHRsZTsKfQoKLyoKICogbWFrZUZyb21FeHByIC0KICoJICBj cmVhdGVzIGEgRnJvbUV4cHIgbm9kZQogKi8KRnJvbUV4cHIgKgptYWtlRnJvbUV4cHIoTGlz dCAqZnJvbWxpc3QsIE5vZGUgKnF1YWxzKQp7CglGcm9tRXhwciAgICpmID0gbWFrZU5vZGUo RnJvbUV4cHIpOwoKCWYtPmZyb21saXN0ID0gZnJvbWxpc3Q7CglmLT5xdWFscyA9IHF1YWxz OwoJcmV0dXJuIGY7Cn0KCi8qCiAqIG1ha2VDb25zdCAtCiAqCSAgY3JlYXRlcyBhIENvbnN0 IG5vZGUKICovCkNvbnN0ICoKbWFrZUNvbnN0KE9pZCBjb25zdHR5cGUsCgkJICBpbnQzMiBj b25zdHR5cG1vZCwKCQkgIE9pZCBjb25zdGNvbGxpZCwKCQkgIGludCBjb25zdGxlbiwKCQkg IERhdHVtIGNvbnN0dmFsdWUsCgkJICBib29sIGNvbnN0aXNudWxsLAoJCSAgYm9vbCBjb25z dGJ5dmFsKQp7CglDb25zdAkgICAqY25zdCA9IG1ha2VOb2RlKENvbnN0KTsKCgkvKgoJICog SWYgaXQncyBhIHZhcmxlbmEgdmFsdWUsIGZvcmNlIGl0IHRvIGJlIGluIG5vbi1leHBhbmRl ZCAobm9uLXRvYXN0ZWQpCgkgKiBmb3JtYXQ7IHRoaXMgYXZvaWRzIGFueSBwb3NzaWJsZSBk ZXBlbmRlbmN5IG9uIGV4dGVybmFsIHZhbHVlcyBhbmQKCSAqIGltcHJvdmVzIGNvbnNpc3Rl bmN5IG9mIHJlcHJlc2VudGF0aW9uLCB3aGljaCBpcyBpbXBvcnRhbnQgZm9yIGVxdWFsKCku CgkgKi8KCWlmICghY29uc3Rpc251bGwgJiYgY29uc3RsZW4gPT0gLTEpCgkJY29uc3R2YWx1 ZSA9IFBvaW50ZXJHZXREYXR1bShQR19ERVRPQVNUX0RBVFVNKGNvbnN0dmFsdWUpKTsKCglj bnN0LT5jb25zdHR5cGUgPSBjb25zdHR5cGU7CgljbnN0LT5jb25zdHR5cG1vZCA9IGNvbnN0 dHlwbW9kOwoJY25zdC0+Y29uc3Rjb2xsaWQgPSBjb25zdGNvbGxpZDsKCWNuc3QtPmNvbnN0 bGVuID0gY29uc3RsZW47CgljbnN0LT5jb25zdHZhbHVlID0gY29uc3R2YWx1ZTsKCWNuc3Qt PmNvbnN0aXNudWxsID0gY29uc3Rpc251bGw7CgljbnN0LT5jb25zdGJ5dmFsID0gY29uc3Ri eXZhbDsKCWNuc3QtPmxvY2F0aW9uID0gLTE7CQkvKiAidW5rbm93biIgKi8KCglyZXR1cm4g Y25zdDsKfQoKLyoKICogbWFrZU51bGxDb25zdCAtCiAqCSAgY3JlYXRlcyBhIENvbnN0IG5v ZGUgcmVwcmVzZW50aW5nIGEgTlVMTCBvZiB0aGUgc3BlY2lmaWVkIHR5cGUvdHlwbW9kCiAq CiAqIFRoaXMgaXMgYSBjb252ZW5pZW5jZSByb3V0aW5lIHRoYXQganVzdCBzYXZlcyBhIGxv b2t1cCBvZiB0aGUgdHlwZSdzCiAqIHN0b3JhZ2UgcHJvcGVydGllcy4KICovCkNvbnN0ICoK bWFrZU51bGxDb25zdChPaWQgY29uc3R0eXBlLCBpbnQzMiBjb25zdHR5cG1vZCwgT2lkIGNv bnN0Y29sbGlkKQp7CglpbnQxNgkJdHlwTGVuOwoJYm9vbAkJdHlwQnlWYWw7CgoJZ2V0X3R5 cGxlbmJ5dmFsKGNvbnN0dHlwZSwgJnR5cExlbiwgJnR5cEJ5VmFsKTsKCXJldHVybiBtYWtl Q29uc3QoY29uc3R0eXBlLAoJCQkJCSBjb25zdHR5cG1vZCwKCQkJCQkgY29uc3Rjb2xsaWQs CgkJCQkJIChpbnQpIHR5cExlbiwKCQkJCQkgKERhdHVtKSAwLAoJCQkJCSB0cnVlLAoJCQkJ CSB0eXBCeVZhbCk7Cn0KCi8qCiAqIG1ha2VCb29sQ29uc3QgLQogKgkgIGNyZWF0ZXMgYSBD b25zdCBub2RlIHJlcHJlc2VudGluZyBhIGJvb2xlYW4gdmFsdWUgKGNhbiBiZSBOVUxMIHRv bykKICovCk5vZGUgKgptYWtlQm9vbENvbnN0KGJvb2wgdmFsdWUsIGJvb2wgaXNudWxsKQp7 CgkvKiBub3RlIHRoYXQgcGdfdHlwZS5oIGhhcmR3aXJlcyBzaXplIG9mIGJvb2wgYXMgMSAu Li4gZHVwbGljYXRlIGl0ICovCglyZXR1cm4gKE5vZGUgKikgbWFrZUNvbnN0KEJPT0xPSUQs IC0xLCBJbnZhbGlkT2lkLCAxLAoJCQkJCQkJICBCb29sR2V0RGF0dW0odmFsdWUpLCBpc251 bGwsIHRydWUpOwp9CgovKgogKiBtYWtlQm9vbEV4cHIgLQogKgkgIGNyZWF0ZXMgYSBCb29s RXhwciBub2RlCiAqLwpFeHByICoKbWFrZUJvb2xFeHByKEJvb2xFeHByVHlwZSBib29sb3As IExpc3QgKmFyZ3MsIGludCBsb2NhdGlvbikKewoJQm9vbEV4cHIgICAqYiA9IG1ha2VOb2Rl KEJvb2xFeHByKTsKCgliLT5ib29sb3AgPSBib29sb3A7CgliLT5hcmdzID0gYXJnczsKCWIt PmxvY2F0aW9uID0gbG9jYXRpb247CgoJcmV0dXJuIChFeHByICopIGI7Cn0KCi8qCiAqIG1h a2VBbGlhcyAtCiAqCSAgY3JlYXRlcyBhbiBBbGlhcyBub2RlCiAqCiAqIE5PVEU6IHRoZSBn aXZlbiBuYW1lIGlzIGNvcGllZCwgYnV0IHRoZSBjb2xuYW1lcyBsaXN0IChpZiBhbnkpIGlz bid0LgogKi8KQWxpYXMgKgptYWtlQWxpYXMoY29uc3QgY2hhciAqYWxpYXNuYW1lLCBMaXN0 ICpjb2xuYW1lcykKewoJQWxpYXMJICAgKmEgPSBtYWtlTm9kZShBbGlhcyk7CgoJYS0+YWxp YXNuYW1lID0gcHN0cmR1cChhbGlhc25hbWUpOwoJYS0+Y29sbmFtZXMgPSBjb2xuYW1lczsK CglyZXR1cm4gYTsKfQoKLyoKICogbWFrZVJlbGFiZWxUeXBlIC0KICoJICBjcmVhdGVzIGEg UmVsYWJlbFR5cGUgbm9kZQogKi8KUmVsYWJlbFR5cGUgKgptYWtlUmVsYWJlbFR5cGUoRXhw ciAqYXJnLCBPaWQgcnR5cGUsIGludDMyIHJ0eXBtb2QsIE9pZCByY29sbGlkLAoJCQkJQ29l cmNpb25Gb3JtIHJmb3JtYXQpCnsKCVJlbGFiZWxUeXBlICpyID0gbWFrZU5vZGUoUmVsYWJl bFR5cGUpOwoKCXItPmFyZyA9IGFyZzsKCXItPnJlc3VsdHR5cGUgPSBydHlwZTsKCXItPnJl c3VsdHR5cG1vZCA9IHJ0eXBtb2Q7CglyLT5yZXN1bHRjb2xsaWQgPSByY29sbGlkOwoJci0+ cmVsYWJlbGZvcm1hdCA9IHJmb3JtYXQ7CglyLT5sb2NhdGlvbiA9IC0xOwoKCXJldHVybiBy Owp9CgovKgogKiBtYWtlUmFuZ2VWYXIgLQogKgkgIGNyZWF0ZXMgYSBSYW5nZVZhciBub2Rl IChyYXRoZXIgb3ZlcnNpbXBsaWZpZWQgY2FzZSkKICovClJhbmdlVmFyICoKbWFrZVJhbmdl VmFyKGNoYXIgKnNjaGVtYW5hbWUsIGNoYXIgKnJlbG5hbWUsIGludCBsb2NhdGlvbikKewoJ UmFuZ2VWYXIgICAqciA9IG1ha2VOb2RlKFJhbmdlVmFyKTsKCglyLT5jYXRhbG9nbmFtZSA9 IE5VTEw7CglyLT5zY2hlbWFuYW1lID0gc2NoZW1hbmFtZTsKCXItPnJlbG5hbWUgPSByZWxu YW1lOwoJci0+aW5oID0gdHJ1ZTsKCXItPnJlbHBlcnNpc3RlbmNlID0gUkVMUEVSU0lTVEVO Q0VfUEVSTUFORU5UOwoJci0+YWxpYXMgPSBOVUxMOwoJci0+bG9jYXRpb24gPSBsb2NhdGlv bjsKCglyZXR1cm4gcjsKfQoKLyoKICogbWFrZU5vdE51bGxDb25zdHJhaW50IC0KICoJCWNy ZWF0ZXMgYSBDb25zdHJhaW50IG5vZGUgZm9yIE5PVCBOVUxMIGNvbnN0cmFpbnRzCiAqLwpD b25zdHJhaW50ICoKbWFrZU5vdE51bGxDb25zdHJhaW50KFN0cmluZyAqY29sbmFtZSkKewoJ Q29uc3RyYWludCAqbm90bnVsbDsKCglub3RudWxsID0gbWFrZU5vZGUoQ29uc3RyYWludCk7 Cglub3RudWxsLT5jb250eXBlID0gQ09OU1RSX05PVE5VTEw7Cglub3RudWxsLT5jb25uYW1l ID0gTlVMTDsKCW5vdG51bGwtPmlzX25vX2luaGVyaXQgPSBmYWxzZTsKCW5vdG51bGwtPmRl ZmVycmFibGUgPSBmYWxzZTsKCW5vdG51bGwtPmluaXRkZWZlcnJlZCA9IGZhbHNlOwoJbm90 bnVsbC0+bG9jYXRpb24gPSAtMTsKCW5vdG51bGwtPmtleXMgPSBsaXN0X21ha2UxKGNvbG5h bWUpOwoJbm90bnVsbC0+aXNfZW5mb3JjZWQgPSB0cnVlOwoJbm90bnVsbC0+c2tpcF92YWxp ZGF0aW9uID0gZmFsc2U7Cglub3RudWxsLT5pbml0aWFsbHlfdmFsaWQgPSB0cnVlOwoKCXJl dHVybiBub3RudWxsOwp9CgovKgogKiBtYWtlVHlwZU5hbWUgLQogKglidWlsZCBhIFR5cGVO YW1lIG5vZGUgZm9yIGFuIHVucXVhbGlmaWVkIG5hbWUuCiAqCiAqIHR5cG1vZCBpcyBkZWZh dWx0ZWQsIGJ1dCBjYW4gYmUgY2hhbmdlZCBsYXRlciBieSBjYWxsZXIuCiAqLwpUeXBlTmFt ZSAqCm1ha2VUeXBlTmFtZShjaGFyICp0eXBuYW0pCnsKCXJldHVybiBtYWtlVHlwZU5hbWVG cm9tTmFtZUxpc3QobGlzdF9tYWtlMShtYWtlU3RyaW5nKHR5cG5hbSkpKTsKfQoKLyoKICog bWFrZVR5cGVOYW1lRnJvbU5hbWVMaXN0IC0KICoJYnVpbGQgYSBUeXBlTmFtZSBub2RlIGZv ciBhIFN0cmluZyBsaXN0IHJlcHJlc2VudGluZyBhIHF1YWxpZmllZCBuYW1lLgogKgogKiB0 eXBtb2QgaXMgZGVmYXVsdGVkLCBidXQgY2FuIGJlIGNoYW5nZWQgbGF0ZXIgYnkgY2FsbGVy LgogKi8KVHlwZU5hbWUgKgptYWtlVHlwZU5hbWVGcm9tTmFtZUxpc3QoTGlzdCAqbmFtZXMp CnsKCVR5cGVOYW1lICAgKm4gPSBtYWtlTm9kZShUeXBlTmFtZSk7CgoJbi0+bmFtZXMgPSBu YW1lczsKCW4tPnR5cG1vZHMgPSBOSUw7CgluLT50eXBlbW9kID0gLTE7CgluLT5sb2NhdGlv biA9IC0xOwoJcmV0dXJuIG47Cn0KCi8qCiAqIG1ha2VUeXBlTmFtZUZyb21PaWQgLQogKgli dWlsZCBhIFR5cGVOYW1lIG5vZGUgdG8gcmVwcmVzZW50IGEgdHlwZSBhbHJlYWR5IGtub3du IGJ5IE9JRC90eXBtb2QuCiAqLwpUeXBlTmFtZSAqCm1ha2VUeXBlTmFtZUZyb21PaWQoT2lk IHR5cGVPaWQsIGludDMyIHR5cG1vZCkKewoJVHlwZU5hbWUgICAqbiA9IG1ha2VOb2RlKFR5 cGVOYW1lKTsKCgluLT50eXBlT2lkID0gdHlwZU9pZDsKCW4tPnR5cGVtb2QgPSB0eXBtb2Q7 CgluLT5sb2NhdGlvbiA9IC0xOwoJcmV0dXJuIG47Cn0KCi8qCiAqIG1ha2VDb2x1bW5EZWYg LQogKglidWlsZCBhIENvbHVtbkRlZiBub2RlIHRvIHJlcHJlc2VudCBhIHNpbXBsZSBjb2x1 bW4gZGVmaW5pdGlvbi4KICoKICogVHlwZSBhbmQgY29sbGF0aW9uIGFyZSBzcGVjaWZpZWQg YnkgT0lELgogKiBPdGhlciBwcm9wZXJ0aWVzIGFyZSBhbGwgYmFzaWMgdG8gc3RhcnQgd2l0 aC4KICovCkNvbHVtbkRlZiAqCm1ha2VDb2x1bW5EZWYoY29uc3QgY2hhciAqY29sbmFtZSwg T2lkIHR5cGVPaWQsIGludDMyIHR5cG1vZCwgT2lkIGNvbGxPaWQpCnsKCUNvbHVtbkRlZiAg Km4gPSBtYWtlTm9kZShDb2x1bW5EZWYpOwoKCW4tPmNvbG5hbWUgPSBwc3RyZHVwKGNvbG5h bWUpOwoJbi0+dHlwZU5hbWUgPSBtYWtlVHlwZU5hbWVGcm9tT2lkKHR5cGVPaWQsIHR5cG1v ZCk7CgluLT5pbmhjb3VudCA9IDA7CgluLT5pc19sb2NhbCA9IHRydWU7CgluLT5pc19ub3Rf bnVsbCA9IGZhbHNlOwoJbi0+aXNfZnJvbV90eXBlID0gZmFsc2U7CgluLT5zdG9yYWdlID0g MDsKCW4tPnJhd19kZWZhdWx0ID0gTlVMTDsKCW4tPmNvb2tlZF9kZWZhdWx0ID0gTlVMTDsK CW4tPmNvbGxDbGF1c2UgPSBOVUxMOwoJbi0+Y29sbE9pZCA9IGNvbGxPaWQ7CgluLT5jb25z dHJhaW50cyA9IE5JTDsKCW4tPmZkd29wdGlvbnMgPSBOSUw7CgluLT5sb2NhdGlvbiA9IC0x OwoKCXJldHVybiBuOwp9CgovKgogKiBtYWtlRnVuY0V4cHIgLQogKglidWlsZCBhbiBleHBy ZXNzaW9uIHRyZWUgcmVwcmVzZW50aW5nIGEgZnVuY3Rpb24gY2FsbC4KICoKICogVGhlIGFy Z3VtZW50IGV4cHJlc3Npb25zIG11c3QgaGF2ZSBiZWVuIHRyYW5zZm9ybWVkIGFscmVhZHku CiAqLwpGdW5jRXhwciAqCm1ha2VGdW5jRXhwcihPaWQgZnVuY2lkLCBPaWQgcmV0dHlwZSwg TGlzdCAqYXJncywKCQkJIE9pZCBmdW5jY29sbGlkLCBPaWQgaW5wdXRjb2xsaWQsIENvZXJj aW9uRm9ybSBmZm9ybWF0KQp7CglGdW5jRXhwciAgICpmdW5jZXhwcjsKCglmdW5jZXhwciA9 IG1ha2VOb2RlKEZ1bmNFeHByKTsKCWZ1bmNleHByLT5mdW5jaWQgPSBmdW5jaWQ7CglmdW5j ZXhwci0+ZnVuY3Jlc3VsdHR5cGUgPSByZXR0eXBlOwoJZnVuY2V4cHItPmZ1bmNyZXRzZXQg PSBmYWxzZTsJLyogb25seSBhbGxvd2VkIGNhc2UgaGVyZSAqLwoJZnVuY2V4cHItPmZ1bmN2 YXJpYWRpYyA9IGZhbHNlOyAvKiBvbmx5IGFsbG93ZWQgY2FzZSBoZXJlICovCglmdW5jZXhw ci0+ZnVuY2Zvcm1hdCA9IGZmb3JtYXQ7CglmdW5jZXhwci0+ZnVuY2NvbGxpZCA9IGZ1bmNj b2xsaWQ7CglmdW5jZXhwci0+aW5wdXRjb2xsaWQgPSBpbnB1dGNvbGxpZDsKCWZ1bmNleHBy LT5hcmdzID0gYXJnczsKCWZ1bmNleHByLT5sb2NhdGlvbiA9IC0xOwoKCXJldHVybiBmdW5j ZXhwcjsKfQoKLyoKICogbWFrZVN0cmluZ0NvbnN0IC0KICogCWJ1aWxkIGEgQV9Db25zdCBu b2RlIG9mIHR5cGUgVF9TdHJpbmcgZm9yIGdpdmVuIHN0cmluZwogKi8KTm9kZSAqCm1ha2VT dHJpbmdDb25zdChjaGFyICpzdHIsIGludCBsb2NhdGlvbikKewoJQV9Db25zdCAgICAqbiA9 IG1ha2VOb2RlKEFfQ29uc3QpOwoKCW4tPnZhbC5zdmFsLnR5cGUgPSBUX1N0cmluZzsKCW4t PnZhbC5zdmFsLnN2YWwgPSBzdHI7CgluLT5sb2NhdGlvbiA9IGxvY2F0aW9uOwoKCXJldHVy biAoTm9kZSAqKSBuOwp9CgovKgogKiBtYWtlRGVmRWxlbSAtCiAqCWJ1aWxkIGEgRGVmRWxl bSBub2RlCiAqCiAqIFRoaXMgaXMgc3VmZmljaWVudCBmb3IgdGhlICJ0eXBpY2FsIiBjYXNl IHdpdGggYW4gdW5xdWFsaWZpZWQgb3B0aW9uIG5hbWUKICogYW5kIG5vIHNwZWNpYWwgYWN0 aW9uLgogKi8KRGVmRWxlbSAqCm1ha2VEZWZFbGVtKGNoYXIgKm5hbWUsIE5vZGUgKmFyZywg aW50IGxvY2F0aW9uKQp7CglEZWZFbGVtICAgICpyZXMgPSBtYWtlTm9kZShEZWZFbGVtKTsK CglyZXMtPmRlZm5hbWVzcGFjZSA9IE5VTEw7CglyZXMtPmRlZm5hbWUgPSBuYW1lOwoJcmVz LT5hcmcgPSBhcmc7CglyZXMtPmRlZmFjdGlvbiA9IERFRkVMRU1fVU5TUEVDOwoJcmVzLT5s b2NhdGlvbiA9IGxvY2F0aW9uOwoKCXJldHVybiByZXM7Cn0KCi8qCiAqIG1ha2VEZWZFbGVt RXh0ZW5kZWQgLQogKglidWlsZCBhIERlZkVsZW0gbm9kZSB3aXRoIGFsbCBmaWVsZHMgYXZh aWxhYmxlIHRvIGJlIHNwZWNpZmllZAogKi8KRGVmRWxlbSAqCm1ha2VEZWZFbGVtRXh0ZW5k ZWQoY2hhciAqbmFtZVNwYWNlLCBjaGFyICpuYW1lLCBOb2RlICphcmcsCgkJCQkJRGVmRWxl bUFjdGlvbiBkZWZhY3Rpb24sIGludCBsb2NhdGlvbikKewoJRGVmRWxlbSAgICAqcmVzID0g bWFrZU5vZGUoRGVmRWxlbSk7CgoJcmVzLT5kZWZuYW1lc3BhY2UgPSBuYW1lU3BhY2U7Cgly ZXMtPmRlZm5hbWUgPSBuYW1lOwoJcmVzLT5hcmcgPSBhcmc7CglyZXMtPmRlZmFjdGlvbiA9 IGRlZmFjdGlvbjsKCXJlcy0+bG9jYXRpb24gPSBsb2NhdGlvbjsKCglyZXR1cm4gcmVzOwp9 CgovKgogKiBtYWtlRnVuY0NhbGwgLQogKgogKiBJbml0aWFsaXplIGEgRnVuY0NhbGwgc3Ry dWN0IHdpdGggdGhlIGluZm9ybWF0aW9uIGV2ZXJ5IGNhbGxlciBtdXN0CiAqIHN1cHBseS4g IEFueSBub24tZGVmYXVsdCBwYXJhbWV0ZXJzIGhhdmUgdG8gYmUgaW5zZXJ0ZWQgYnkgdGhl IGNhbGxlci4KICovCkZ1bmNDYWxsICoKbWFrZUZ1bmNDYWxsKExpc3QgKm5hbWUsIExpc3Qg KmFyZ3MsIENvZXJjaW9uRm9ybSBmdW5jZm9ybWF0LCBpbnQgbG9jYXRpb24pCnsKCUZ1bmND YWxsICAgKm4gPSBtYWtlTm9kZShGdW5jQ2FsbCk7CgoJbi0+ZnVuY25hbWUgPSBuYW1lOwoJ bi0+YXJncyA9IGFyZ3M7CgluLT5hZ2dfb3JkZXIgPSBOSUw7CgluLT5hZ2dfZmlsdGVyID0g TlVMTDsKCW4tPm92ZXIgPSBOVUxMOwoJbi0+YWdnX3dpdGhpbl9ncm91cCA9IGZhbHNlOwoJ bi0+YWdnX3N0YXIgPSBmYWxzZTsKCW4tPmFnZ19kaXN0aW5jdCA9IGZhbHNlOwoJbi0+ZnVu Y192YXJpYWRpYyA9IGZhbHNlOwoJbi0+ZnVuY2Zvcm1hdCA9IGZ1bmNmb3JtYXQ7CgluLT5s b2NhdGlvbiA9IGxvY2F0aW9uOwoJcmV0dXJuIG47Cn0KCi8qCiAqIG1ha2Vfb3BjbGF1c2UK ICoJICBDcmVhdGVzIGFuIG9wZXJhdG9yIGNsYXVzZSBnaXZlbiBpdHMgb3BlcmF0b3IgaW5m bywgbGVmdCBvcGVyYW5kCiAqCSAgYW5kIHJpZ2h0IG9wZXJhbmQgKHBhc3MgTlVMTCB0byBj cmVhdGUgc2luZ2xlLW9wZXJhbmQgY2xhdXNlKSwKICoJICBhbmQgY29sbGF0aW9uIGluZm8u CiAqLwpFeHByICoKbWFrZV9vcGNsYXVzZShPaWQgb3BubywgT2lkIG9wcmVzdWx0dHlwZSwg Ym9vbCBvcHJldHNldCwKCQkJICBFeHByICpsZWZ0b3AsIEV4cHIgKnJpZ2h0b3AsCgkJCSAg T2lkIG9wY29sbGlkLCBPaWQgaW5wdXRjb2xsaWQpCnsKCU9wRXhwcgkgICAqZXhwciA9IG1h a2VOb2RlKE9wRXhwcik7CgoJZXhwci0+b3BubyA9IG9wbm87CglleHByLT5vcGZ1bmNpZCA9 IEludmFsaWRPaWQ7CglleHByLT5vcHJlc3VsdHR5cGUgPSBvcHJlc3VsdHR5cGU7CglleHBy LT5vcHJldHNldCA9IG9wcmV0c2V0OwoJZXhwci0+b3Bjb2xsaWQgPSBvcGNvbGxpZDsKCWV4 cHItPmlucHV0Y29sbGlkID0gaW5wdXRjb2xsaWQ7CglpZiAocmlnaHRvcCkKCQlleHByLT5h cmdzID0gbGlzdF9tYWtlMihsZWZ0b3AsIHJpZ2h0b3ApOwoJZWxzZQoJCWV4cHItPmFyZ3Mg PSBsaXN0X21ha2UxKGxlZnRvcCk7CglleHByLT5sb2NhdGlvbiA9IC0xOwoJcmV0dXJuIChF eHByICopIGV4cHI7Cn0KCi8qCiAqIG1ha2VfYW5kY2xhdXNlCiAqCiAqIENyZWF0ZXMgYW4g J2FuZCcgY2xhdXNlIGdpdmVuIGEgbGlzdCBvZiBpdHMgc3ViY2xhdXNlcy4KICovCkV4cHIg KgptYWtlX2FuZGNsYXVzZShMaXN0ICphbmRjbGF1c2VzKQp7CglCb29sRXhwciAgICpleHBy ID0gbWFrZU5vZGUoQm9vbEV4cHIpOwoKCWV4cHItPmJvb2xvcCA9IEFORF9FWFBSOwoJZXhw ci0+YXJncyA9IGFuZGNsYXVzZXM7CglleHByLT5sb2NhdGlvbiA9IC0xOwoJcmV0dXJuIChF eHByICopIGV4cHI7Cn0KCi8qCiAqIG1ha2Vfb3JjbGF1c2UKICoKICogQ3JlYXRlcyBhbiAn b3InIGNsYXVzZSBnaXZlbiBhIGxpc3Qgb2YgaXRzIHN1YmNsYXVzZXMuCiAqLwpFeHByICoK bWFrZV9vcmNsYXVzZShMaXN0ICpvcmNsYXVzZXMpCnsKCUJvb2xFeHByICAgKmV4cHIgPSBt YWtlTm9kZShCb29sRXhwcik7CgoJZXhwci0+Ym9vbG9wID0gT1JfRVhQUjsKCWV4cHItPmFy Z3MgPSBvcmNsYXVzZXM7CglleHByLT5sb2NhdGlvbiA9IC0xOwoJcmV0dXJuIChFeHByICop IGV4cHI7Cn0KCi8qCiAqIG1ha2Vfbm90Y2xhdXNlCiAqCiAqIENyZWF0ZSBhICdub3QnIGNs YXVzZSBnaXZlbiB0aGUgZXhwcmVzc2lvbiB0byBiZSBuZWdhdGVkLgogKi8KRXhwciAqCm1h a2Vfbm90Y2xhdXNlKEV4cHIgKm5vdGNsYXVzZSkKewoJQm9vbEV4cHIgICAqZXhwciA9IG1h a2VOb2RlKEJvb2xFeHByKTsKCglleHByLT5ib29sb3AgPSBOT1RfRVhQUjsKCWV4cHItPmFy Z3MgPSBsaXN0X21ha2UxKG5vdGNsYXVzZSk7CglleHByLT5sb2NhdGlvbiA9IC0xOwoJcmV0 dXJuIChFeHByICopIGV4cHI7Cn0KCi8qCiAqIG1ha2VfYW5kX3F1YWwKICoKICogVmFyaWFu dCBvZiBtYWtlX2FuZGNsYXVzZSBmb3IgQU5EaW5nIHR3byBxdWFsIGNvbmRpdGlvbnMgdG9n ZXRoZXIuCiAqIFF1YWwgY29uZGl0aW9ucyBoYXZlIHRoZSBwcm9wZXJ0eSB0aGF0IGEgTlVM TCBub2RldHJlZSBpcyBpbnRlcnByZXRlZAogKiBhcyAndHJ1ZScuCiAqCiAqIE5COiB0aGlz IG1ha2VzIG5vIGF0dGVtcHQgdG8gcHJlc2VydmUgQU5EL09SIGZsYXRuZXNzOyBzbyBpdCBz aG91bGQgbm90CiAqIGJlIHVzZWQgb24gYSBxdWFsIHRoYXQgaGFzIGFscmVhZHkgYmVlbiBy dW4gdGhyb3VnaCBwcmVwcXVhbC5jLgogKi8KTm9kZSAqCm1ha2VfYW5kX3F1YWwoTm9kZSAq cXVhbDEsIE5vZGUgKnF1YWwyKQp7CglpZiAocXVhbDEgPT0gTlVMTCkKCQlyZXR1cm4gcXVh bDI7CglpZiAocXVhbDIgPT0gTlVMTCkKCQlyZXR1cm4gcXVhbDE7CglyZXR1cm4gKE5vZGUg KikgbWFrZV9hbmRjbGF1c2UobGlzdF9tYWtlMihxdWFsMSwgcXVhbDIpKTsKfQoKLyoKICog VGhlIHBsYW5uZXIgYW5kIGV4ZWN1dG9yIHVzdWFsbHkgcmVwcmVzZW50IHF1YWxpZmljYXRp b24gZXhwcmVzc2lvbnMKICogYXMgbGlzdHMgb2YgYm9vbGVhbiBleHByZXNzaW9ucyB3aXRo IGltcGxpY2l0IEFORCBzZW1hbnRpY3MuCiAqCiAqIFRoZXNlIGZ1bmN0aW9ucyBjb252ZXJ0 IGJldHdlZW4gYW4gQU5ELXNlbWFudGljcyBleHByZXNzaW9uIGxpc3QgYW5kIHRoZQogKiBv cmRpbmFyeSByZXByZXNlbnRhdGlvbiBvZiBhIGJvb2xlYW4gZXhwcmVzc2lvbi4KICoKICog Tm90ZSB0aGF0IGFuIGVtcHR5IGxpc3QgaXMgY29uc2lkZXJlZCBlcXVpdmFsZW50IHRvIFRS VUUuCiAqLwpFeHByICoKbWFrZV9hbmRzX2V4cGxpY2l0KExpc3QgKmFuZGNsYXVzZXMpCnsK CWlmIChhbmRjbGF1c2VzID09IE5JTCkKCQlyZXR1cm4gKEV4cHIgKikgbWFrZUJvb2xDb25z dCh0cnVlLCBmYWxzZSk7CgllbHNlIGlmIChsaXN0X2xlbmd0aChhbmRjbGF1c2VzKSA9PSAx KQoJCXJldHVybiAoRXhwciAqKSBsaW5pdGlhbChhbmRjbGF1c2VzKTsKCWVsc2UKCQlyZXR1 cm4gbWFrZV9hbmRjbGF1c2UoYW5kY2xhdXNlcyk7Cn0KCkxpc3QgKgptYWtlX2FuZHNfaW1w bGljaXQoRXhwciAqY2xhdXNlKQp7CgkvKgoJICogTkI6IGJlY2F1c2UgdGhlIHBhcnNlciBz ZXRzIHRoZSBxdWFsIGZpZWxkIHRvIE5VTEwgaW4gYSBxdWVyeSB0aGF0IGhhcwoJICogbm8g V0hFUkUgY2xhdXNlLCB3ZSBtdXN0IGNvbnNpZGVyIGEgTlVMTCBpbnB1dCBjbGF1c2UgYXMg VFJVRSwgZXZlbgoJICogdGhvdWdoIG9uZSBtaWdodCBtb3JlIHJlYXNvbmFibHkgdGhpbmsg aXQgRkFMU0UuCgkgKi8KCWlmIChjbGF1c2UgPT0gTlVMTCkKCQlyZXR1cm4gTklMOwkJCQkv KiBOVUxMIC0+IE5JTCBsaXN0ID09IFRSVUUgKi8KCWVsc2UgaWYgKGlzX2FuZGNsYXVzZShj bGF1c2UpKQoJCXJldHVybiAoKEJvb2xFeHByICopIGNsYXVzZSktPmFyZ3M7CgllbHNlIGlm IChJc0EoY2xhdXNlLCBDb25zdCkgJiYKCQkJICEoKENvbnN0ICopIGNsYXVzZSktPmNvbnN0 aXNudWxsICYmCgkJCSBEYXR1bUdldEJvb2woKChDb25zdCAqKSBjbGF1c2UpLT5jb25zdHZh bHVlKSkKCQlyZXR1cm4gTklMOwkJCQkvKiBjb25zdGFudCBUUlVFIGlucHV0IC0+IE5JTCBs aXN0ICovCgllbHNlCgkJcmV0dXJuIGxpc3RfbWFrZTEoY2xhdXNlKTsKfQoKLyoKICogbWFr ZUluZGV4SW5mbwogKgkgIGNyZWF0ZSBhbiBJbmRleEluZm8gbm9kZS4gIFVwb24gcmV0dXJu aW5nIGZyb20gdGhpcyBmdW5jdGlvbiwKICogY2FsbGVycyBtdXN0IGFwcGx5IEV4cGFuZFZp cnR1YWxHZW5lcmF0ZWRDb2x1bW5zKCkgCiAqIG9yIFJlbGF0aW9uR2V0SW5kZXhFeHByZXNz aW9uc0V4cGFuZCBvciBSZWxhdGlvbkdldEluZGV4UHJlZGljYXRlRXhwYW5kKCkgdG8KICog aWlfRXhwcmVzc2lvbnNFeHBhbmQgYW5kIGlpX1ByZWRpY2F0ZUV4cGFuZCBhcyBuZWVkZWQg Zm9yIGFjdHVhbAogKiBleHBhbnNpb24gd2hlbiB0aGV5IGFyZSBub3QgTklMIG9yIGR1bW15 LgogKi8KSW5kZXhJbmZvICoKbWFrZUluZGV4SW5mbyhpbnQgbnVtYXR0cnMsIGludCBudW1r ZXlhdHRycywgT2lkIGFtb2lkLCBMaXN0ICpleHByZXNzaW9ucywKCQkJICBMaXN0ICpwcmVk aWNhdGVzLCBib29sIHVuaXF1ZSwgYm9vbCBudWxsc19ub3RfZGlzdGluY3QsCgkJCSAgYm9v bCBpc3JlYWR5LCBib29sIGNvbmN1cnJlbnQsIGJvb2wgc3VtbWFyaXppbmcsCgkJCSAgYm9v bCB3aXRob3V0b3ZlcmxhcHMpCnsKCUluZGV4SW5mbyAgKm4gPSBtYWtlTm9kZShJbmRleElu Zm8pOwoKCW4tPmlpX051bUluZGV4QXR0cnMgPSBudW1hdHRyczsKCW4tPmlpX051bUluZGV4 S2V5QXR0cnMgPSBudW1rZXlhdHRyczsKCUFzc2VydChuLT5paV9OdW1JbmRleEtleUF0dHJz ICE9IDApOwoJQXNzZXJ0KG4tPmlpX051bUluZGV4S2V5QXR0cnMgPD0gbi0+aWlfTnVtSW5k ZXhBdHRycyk7CgluLT5paV9VbmlxdWUgPSB1bmlxdWU7CgluLT5paV9OdWxsc05vdERpc3Rp bmN0ID0gbnVsbHNfbm90X2Rpc3RpbmN0OwoJbi0+aWlfUmVhZHlGb3JJbnNlcnRzID0gaXNy ZWFkeTsKCW4tPmlpX0NoZWNrZWRVbmNoYW5nZWQgPSBmYWxzZTsKCW4tPmlpX0luZGV4VW5j aGFuZ2VkID0gZmFsc2U7CgluLT5paV9Db25jdXJyZW50ID0gY29uY3VycmVudDsKCW4tPmlp X1N1bW1hcml6aW5nID0gc3VtbWFyaXppbmc7CgluLT5paV9XaXRob3V0T3ZlcmxhcHMgPSB3 aXRob3V0b3ZlcmxhcHM7CgoJLyogc3VtbWFyaXppbmcgaW5kZXhlcyBjYW5ub3QgY29udGFp biBub24ta2V5IGF0dHJpYnV0ZXMgKi8KCUFzc2VydCghc3VtbWFyaXppbmcgfHwgKG51bWtl eWF0dHJzID09IG51bWF0dHJzKSk7CgoJLyogZXhwcmVzc2lvbnMgKi8KCW4tPmlpX0V4cHJl c3Npb25zID0gZXhwcmVzc2lvbnM7CgluLT5paV9FeHByZXNzaW9uc0V4cGFuZCA9IGNvcHlP YmplY3QoZXhwcmVzc2lvbnMpOwoJbi0+aWlfRXhwcmVzc2lvbnNTdGF0ZSA9IE5JTDsKCW4t PmlpX0V4cHJlc3Npb25zRXhwYW5kU3RhdGUgPSBOSUw7CgoJLyogcHJlZGljYXRlcyAgKi8K CW4tPmlpX1ByZWRpY2F0ZSA9IHByZWRpY2F0ZXM7CgluLT5paV9QcmVkaWNhdGVFeHBhbmQg PSBjb3B5T2JqZWN0KHByZWRpY2F0ZXMpOwoJbi0+aWlfUHJlZGljYXRlU3RhdGUgPSBOVUxM OwoJbi0+aWlfUHJlZGljYXRlRXhwYW5kU3RhdGUgPSBOVUxMOwoKCS8qIGV4Y2x1c2lvbiBj b25zdHJhaW50cyAqLwoJbi0+aWlfRXhjbHVzaW9uT3BzID0gTlVMTDsKCW4tPmlpX0V4Y2x1 c2lvblByb2NzID0gTlVMTDsKCW4tPmlpX0V4Y2x1c2lvblN0cmF0cyA9IE5VTEw7CgoJLyog c3BlY3VsYXRpdmUgaW5zZXJ0cyAqLwoJbi0+aWlfVW5pcXVlT3BzID0gTlVMTDsKCW4tPmlp X1VuaXF1ZVByb2NzID0gTlVMTDsKCW4tPmlpX1VuaXF1ZVN0cmF0cyA9IE5VTEw7CgoJLyog aW5pdGlhbGl6ZSBpbmRleC1idWlsZCBzdGF0ZSB0byBkZWZhdWx0ICovCgluLT5paV9Ccm9r ZW5Ib3RDaGFpbiA9IGZhbHNlOwoJbi0+aWlfUGFyYWxsZWxXb3JrZXJzID0gMDsKCgkvKiBz ZXQgdXAgZm9yIHBvc3NpYmxlIHVzZSBieSBpbmRleCBBTSAqLwoJbi0+aWlfQW0gPSBhbW9p ZDsKCW4tPmlpX0FtQ2FjaGUgPSBOVUxMOwoJbi0+aWlfQ29udGV4dCA9IEN1cnJlbnRNZW1v cnlDb250ZXh0OwoKCXJldHVybiBuOwp9CgovKgogKiBtYWtlR3JvdXBpbmdTZXQKICoKICov Ckdyb3VwaW5nU2V0ICoKbWFrZUdyb3VwaW5nU2V0KEdyb3VwaW5nU2V0S2luZCBraW5kLCBM aXN0ICpjb250ZW50LCBpbnQgbG9jYXRpb24pCnsKCUdyb3VwaW5nU2V0ICpuID0gbWFrZU5v ZGUoR3JvdXBpbmdTZXQpOwoKCW4tPmtpbmQgPSBraW5kOwoJbi0+Y29udGVudCA9IGNvbnRl bnQ7CgluLT5sb2NhdGlvbiA9IGxvY2F0aW9uOwoJcmV0dXJuIG47Cn0KCi8qCiAqIG1ha2VW YWN1dW1SZWxhdGlvbiAtCiAqCSAgY3JlYXRlIGEgVmFjdXVtUmVsYXRpb24gbm9kZQogKi8K VmFjdXVtUmVsYXRpb24gKgptYWtlVmFjdXVtUmVsYXRpb24oUmFuZ2VWYXIgKnJlbGF0aW9u LCBPaWQgb2lkLCBMaXN0ICp2YV9jb2xzKQp7CglWYWN1dW1SZWxhdGlvbiAqdiA9IG1ha2VO b2RlKFZhY3V1bVJlbGF0aW9uKTsKCgl2LT5yZWxhdGlvbiA9IHJlbGF0aW9uOwoJdi0+b2lk ID0gb2lkOwoJdi0+dmFfY29scyA9IHZhX2NvbHM7CglyZXR1cm4gdjsKfQoKLyoKICogbWFr ZUpzb25Gb3JtYXQgLQogKgkgIGNyZWF0ZXMgYSBKc29uRm9ybWF0IG5vZGUKICovCkpzb25G b3JtYXQgKgptYWtlSnNvbkZvcm1hdChKc29uRm9ybWF0VHlwZSB0eXBlLCBKc29uRW5jb2Rp bmcgZW5jb2RpbmcsIGludCBsb2NhdGlvbikKewoJSnNvbkZvcm1hdCAqamYgPSBtYWtlTm9k ZShKc29uRm9ybWF0KTsKCglqZi0+Zm9ybWF0X3R5cGUgPSB0eXBlOwoJamYtPmVuY29kaW5n ID0gZW5jb2Rpbmc7CglqZi0+bG9jYXRpb24gPSBsb2NhdGlvbjsKCglyZXR1cm4gamY7Cn0K Ci8qCiAqIG1ha2VKc29uVmFsdWVFeHByIC0KICoJICBjcmVhdGVzIGEgSnNvblZhbHVlRXhw ciBub2RlCiAqLwpKc29uVmFsdWVFeHByICoKbWFrZUpzb25WYWx1ZUV4cHIoRXhwciAqcmF3 X2V4cHIsIEV4cHIgKmZvcm1hdHRlZF9leHByLAoJCQkJICBKc29uRm9ybWF0ICpmb3JtYXQp CnsKCUpzb25WYWx1ZUV4cHIgKmp2ZSA9IG1ha2VOb2RlKEpzb25WYWx1ZUV4cHIpOwoKCWp2 ZS0+cmF3X2V4cHIgPSByYXdfZXhwcjsKCWp2ZS0+Zm9ybWF0dGVkX2V4cHIgPSBmb3JtYXR0 ZWRfZXhwcjsKCWp2ZS0+Zm9ybWF0ID0gZm9ybWF0OwoKCXJldHVybiBqdmU7Cn0KCi8qCiAq IG1ha2VKc29uQmVoYXZpb3IgLQogKgkgIGNyZWF0ZXMgYSBKc29uQmVoYXZpb3Igbm9kZQog Ki8KSnNvbkJlaGF2aW9yICoKbWFrZUpzb25CZWhhdmlvcihKc29uQmVoYXZpb3JUeXBlIGJ0 eXBlLCBOb2RlICpleHByLCBpbnQgbG9jYXRpb24pCnsKCUpzb25CZWhhdmlvciAqYmVoYXZp b3IgPSBtYWtlTm9kZShKc29uQmVoYXZpb3IpOwoKCWJlaGF2aW9yLT5idHlwZSA9IGJ0eXBl OwoJYmVoYXZpb3ItPmV4cHIgPSBleHByOwoJYmVoYXZpb3ItPmxvY2F0aW9uID0gbG9jYXRp b247CgoJcmV0dXJuIGJlaGF2aW9yOwp9CgovKgogKiBtYWtlSnNvbktleVZhbHVlIC0KICoJ ICBjcmVhdGVzIGEgSnNvbktleVZhbHVlIG5vZGUKICovCk5vZGUgKgptYWtlSnNvbktleVZh bHVlKE5vZGUgKmtleSwgTm9kZSAqdmFsdWUpCnsKCUpzb25LZXlWYWx1ZSAqbiA9IG1ha2VO b2RlKEpzb25LZXlWYWx1ZSk7CgoJbi0+a2V5ID0gKEV4cHIgKikga2V5OwoJbi0+dmFsdWUg PSBjYXN0Tm9kZShKc29uVmFsdWVFeHByLCB2YWx1ZSk7CgoJcmV0dXJuIChOb2RlICopIG47 Cn0KCi8qCiAqIG1ha2VKc29uSXNQcmVkaWNhdGUgLQogKgkgIGNyZWF0ZXMgYSBKc29uSXNQ cmVkaWNhdGUgbm9kZQogKi8KTm9kZSAqCm1ha2VKc29uSXNQcmVkaWNhdGUoTm9kZSAqZXhw ciwgSnNvbkZvcm1hdCAqZm9ybWF0LCBKc29uVmFsdWVUeXBlIGl0ZW1fdHlwZSwKCQkJCQli b29sIHVuaXF1ZV9rZXlzLCBPaWQgZXhwckJhc2VUeXBlLCBpbnQgbG9jYXRpb24pCnsKCUpz b25Jc1ByZWRpY2F0ZSAqbiA9IG1ha2VOb2RlKEpzb25Jc1ByZWRpY2F0ZSk7CgoJQXNzZXJ0 KGV4cHIgIT0gTlVMTCk7CgoJbi0+ZXhwciA9IGV4cHI7CgluLT5mb3JtYXQgPSBmb3JtYXQ7 CgluLT5pdGVtX3R5cGUgPSBpdGVtX3R5cGU7CgluLT51bmlxdWVfa2V5cyA9IHVuaXF1ZV9r ZXlzOwoJbi0+ZXhwckJhc2VUeXBlID0gZXhwckJhc2VUeXBlOwoJbi0+bG9jYXRpb24gPSBs b2NhdGlvbjsKCglyZXR1cm4gKE5vZGUgKikgbjsKfQoKLyoKICogbWFrZUpzb25UYWJsZVBh dGhTcGVjIC0KICoJCU1ha2UgSnNvblRhYmxlUGF0aFNwZWMgbm9kZSBmcm9tIGdpdmVuIHBh dGggc3RyaW5nIGFuZCBuYW1lIChpZiBhbnkpCiAqLwpKc29uVGFibGVQYXRoU3BlYyAqCm1h a2VKc29uVGFibGVQYXRoU3BlYyhjaGFyICpzdHJpbmcsIGNoYXIgKm5hbWUsIGludCBzdHJp bmdfbG9jYXRpb24sCgkJCQkJICBpbnQgbmFtZV9sb2NhdGlvbikKewoJSnNvblRhYmxlUGF0 aFNwZWMgKnBhdGhzcGVjID0gbWFrZU5vZGUoSnNvblRhYmxlUGF0aFNwZWMpOwoKCUFzc2Vy dChzdHJpbmcgIT0gTlVMTCk7CglwYXRoc3BlYy0+c3RyaW5nID0gbWFrZVN0cmluZ0NvbnN0 KHN0cmluZywgc3RyaW5nX2xvY2F0aW9uKTsKCWlmIChuYW1lICE9IE5VTEwpCgkJcGF0aHNw ZWMtPm5hbWUgPSBwc3RyZHVwKG5hbWUpOwoKCXBhdGhzcGVjLT5uYW1lX2xvY2F0aW9uID0g bmFtZV9sb2NhdGlvbjsKCXBhdGhzcGVjLT5sb2NhdGlvbiA9IHN0cmluZ19sb2NhdGlvbjsK CglyZXR1cm4gcGF0aHNwZWM7Cn0KCi8qCiAqIG1ha2VKc29uVGFibGVQYXRoIC0KICoJCU1h a2UgSnNvblRhYmxlUGF0aCBub2RlIGZvciBnaXZlbiBwYXRoIHN0cmluZyBhbmQgbmFtZQog Ki8KSnNvblRhYmxlUGF0aCAqCm1ha2VKc29uVGFibGVQYXRoKENvbnN0ICpwYXRodmFsdWUs IGNoYXIgKnBhdGhuYW1lKQp7CglKc29uVGFibGVQYXRoICpwYXRoID0gbWFrZU5vZGUoSnNv blRhYmxlUGF0aCk7CgoJQXNzZXJ0KElzQShwYXRodmFsdWUsIENvbnN0KSk7CglwYXRoLT52 YWx1ZSA9IHBhdGh2YWx1ZTsKCXBhdGgtPm5hbWUgPSBwYXRobmFtZTsKCglyZXR1cm4gcGF0 aDsKfQoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAC4vcGF0aG5vZGVzLmgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAwMDAwNjY0ADAwMDE3NTAAMDAwMTc1MAAwMDAwMDQ1MTEzMQAxNTIyMTQ2NjQy MQAwMTIwNTMAIDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAdXN0YXIgIAB4bWFuAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHhtYW4AAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALyotLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tCiAqCiAqIHBhdGhub2Rlcy5oCiAqCSAgRGVmaW5pdGlvbnMgZm9yIHBsYW5u ZXIncyBpbnRlcm5hbCBkYXRhIHN0cnVjdHVyZXMsIGVzcGVjaWFsbHkgUGF0aHMuCiAqCiAq IFdlIGRvbid0IHN1cHBvcnQgY29weWluZyBSZWxPcHRJbmZvLCBJbmRleE9wdEluZm8sIG9y IFBhdGggbm9kZXMuCiAqIFRoZXJlIGFyZSBzb21lIHN1YnNpZGlhcnkgc3RydWN0cyB0aGF0 IGFyZSB1c2VmdWwgdG8gY29weSwgdGhvdWdoLgogKgogKiBQb3J0aW9ucyBDb3B5cmlnaHQg KGMpIDE5OTYtMjAyNiwgUG9zdGdyZVNRTCBHbG9iYWwgRGV2ZWxvcG1lbnQgR3JvdXAKICog UG9ydGlvbnMgQ29weXJpZ2h0IChjKSAxOTk0LCBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5 IG9mIENhbGlmb3JuaWEKICoKICogc3JjL2luY2x1ZGUvbm9kZXMvcGF0aG5vZGVzLmgKICoK ICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAqLwojaWZuZGVmIFBBVEhOT0RFU19ICiNkZWZpbmUg UEFUSE5PREVTX0gKCiNpbmNsdWRlICJhY2Nlc3Mvc2Rpci5oIgojaW5jbHVkZSAibGliL3N0 cmluZ2luZm8uaCIKI2luY2x1ZGUgIm5vZGVzL3BhcmFtcy5oIgojaW5jbHVkZSAibm9kZXMv cGFyc2Vub2Rlcy5oIgojaW5jbHVkZSAic3RvcmFnZS9ibG9jay5oIgoKLyoKICogUGF0aCBn ZW5lcmF0aW9uIHN0cmF0ZWdpZXMuCiAqCiAqIFRoZXNlIGNvbnN0YW50cyBhcmUgdXNlZCB0 byBzcGVjaWZ5IHRoZSBzZXQgb2Ygc3RyYXRlZ2llcyB0aGF0IHRoZSBwbGFubmVyCiAqIHNo b3VsZCB1c2UsIGVpdGhlciBmb3IgdGhlIHF1ZXJ5IGFzIGEgd2hvbGUgb3IgZm9yIGEgc3Bl Y2lmaWMgYmFzZXJlbCBvcgogKiBqb2lucmVsLiBUaGUgdmFyaW91cyBwbGFubmVyLXJlbGF0 ZWQgZW5hYmxlXyogR1VDcyBhcmUgdXNlZCB0byBzZXQgdGhlCiAqIFBsYW5uZXJHbG9iYWwn cyBkZWZhdWx0X3Bnc19tYXNrLCBhbmQgdGhhdCBpbiB0dXJuIGlzIHVzZWQgdG8gc2V0IGVh Y2gKICogUmVsT3B0SW5mbydzIHBnc19tYXNrLiBJbiBib3RoIGNhc2VzLCBleHRlbnNpb25z IGNhbiB1c2UgaG9va3MgdG8gbW9kaWZ5IHRoZQogKiBkZWZhdWx0IHZhbHVlLiAgTm90IGV2 ZXJ5IHN0cmF0ZWd5IGxpc3RlZCBoZXJlIGhhcyBhIGNvcnJlc3BvbmRpbmcgZW5hYmxlXyoK ICogR1VDOyB0aG9zZSB0aGF0IGRvbid0IGFyZSBhbHdheXMgYWxsb3dlZCB1bmxlc3MgZGlz YWJsZWQgYnkgYW4gZXh0ZW5zaW9uLgogKiBOb3QgYWxsIHN0cmF0ZWdpZXMgYXJlIHJlbGV2 YW50IGZvciBldmVyeSBSZWxPcHRJbmZvOyBlLmcuIFBHU19TRVFTQ0FOCiAqIGRvZXNuJ3Qg YWZmZWN0IGpvaW5yZWxzIG9uZSB3YXkgb3IgdGhlIG90aGVyLgogKgogKiBJbiBtb3N0IGNh c2VzLCBkaXNhYmxpbmcgYSBwYXRoIGdlbmVyYXRpb24gc3RyYXRlZ3kgbWVyZWx5IG1lYW5z IHRoYXQgYW55CiAqIHBhdGhzIGdlbmVyYXRlZCB1c2luZyB0aGF0IHN0cmF0ZWd5IGFyZSBt YXJrZWQgYXMgZGlzYWJsZWQsIGJ1dCBpbiBzb21lCiAqIGNhc2VzLCBwYXRoIGdlbmVyYXRp b24gaXMgc2tpcHBlZCBhbHRvZ2V0aGVyLiBUaGUgbGF0dGVyIHN0cmF0ZWd5IGlzIG9ubHkK ICogcGVybWlzc2libGUgd2hlbiBpdCBjYW4ndCByZXN1bHQgaW4gcGxhbm5lciBmYWlsdXJl IC0tIGZvciBpbnN0YW5jZSwgd2UKICogY291bGRuJ3QgZG8gdGhpcyBmb3Igc2VxdWVudGlh bCBzY2FucyBvbiBhIHBsYWluIHJlbCwgYmVjYXVzZSB0aGVyZSBtaWdodAogKiBub3QgYmUg YW55IG90aGVyIHBvc3NpYmxlIHBhdGguIE5ldmVydGhlbGVzcywgdGhlIGJlaGF2aW9ycyBp biBlYWNoCiAqIGluZGl2aWR1YWwgY2FzZSBhcmUgdG8gc29tZSBleHRlbnQgdGhlIHJlc3Vs dCBvZiBoaXN0b3JpY2FsIGFjY2lkZW50LAogKiBjaG9zZW4gdG8gbWF0Y2ggdGhlIHByZWV4 aXN0aW5nIGJlaGF2aW9ycyBvZiB0aGUgZW5hYmxlXyogR1VDcy4KICoKICogSW4gYSBmZXcg Y2FzZXMsIHdlIGhhdmUgbW9yZSB0aGFuIG9uZSBiaXQgZm9yIHRoZSBzYW1lIHN0cmF0ZWd5 LCBjb250cm9sbGluZwogKiBkaWZmZXJlbnQgYXNwZWN0cyBvZiB0aGUgcGxhbm5lciBiZWhh dmlvci4gV2hlbiBQR1NfQ09OU0lERVJfSU5ERVhPTkxZIGlzCiAqIHVuc2V0LCB3ZSBkb24n dCBldmVuIGNvbnNpZGVyIGluZGV4LW9ubHkgc2NhbnMsIGFuZCBhbnkgc3VjaCBzY2FucyB0 aGF0CiAqIHdvdWxkIGhhdmUgYmVlbiBnZW5lcmF0ZWQgYmVjb21lIGluZGV4IHNjYW5zIGlu c3RlYWQuIE9uIHRoZSBvdGhlciBoYW5kLAogKiB1bnNldHRpbmcgUEdTX0lOREVYU0NBTiBv ciBQR1NfSU5ERVhPTkxZU0NBTiBjYXVzZXMgZ2VuZXJhdGVkIHBhdGhzIG9mIHRoZQogKiBj b3JyZXNwb25kaW5nIHR5cGVzIHRvIGJlIG1hcmtlZCBhcyBkaXNhYmxlZC4gU2ltaWxhcmx5 LCB1bnNldHRpbmcKICogUEdTX0NPTlNJREVSX1BBUlRJVElPTldJU0UgcHJldmVudHMgYW55 IHNvcnQgb2YgdGhpbmtpbmcgYWJvdXQgcGFydGl0aW9ud2lzZQogKiBqb2lucyBmb3IgdGhl IGN1cnJlbnQgcmVsLCB3aGljaCBpbmNpZGVudGFsbHkgd2lsbCBwcmVjbHVkZSBoaWdoZXIt bGV2ZWwKICogam9pbnJlbHMgZnJvbSBidWlsZGluZyBwYXJ0aXRpb253aXNlIHBhdGhzIHVz aW5nIHBhdGhzIHRha2VuIGZyb20gdGhlCiAqIGN1cnJlbnQgcmVsJ3MgY2hpbGRyZW4uIE9u IHRoZSBvdGhlciBoYW5kLCB1bnNldHRpbmcgUEdTX0FQUEVORCBvcgogKiBQR1NfTUVSR0Vf QVBQRU5EIHdpbGwgb25seSBhcnJhbmdlIHRvIGRpc2FibGUgcGF0aHMgb2YgdGhlIGNvcnJl c3BvbmRpbmcKICogdHlwZXMgaWYgdGhleSBhcmUgZ2VuZXJhdGVkIGF0IHRoZSBsZXZlbCBv ZiB0aGUgY3VycmVudCByZWwuCiAqCiAqIEZpbmFsbHksIHVuc2V0dGluZyBQR1NfQ09OU0lE RVJfTk9OUEFSVElBTCBkaXNhYmxlcyBhbGwgbm9uLXBhcnRpYWwgcGF0aHMKICogZXhjZXB0 IHRob3NlIHRoYXQgdXNlIEdhdGhlciBvciBHYXRoZXIgTWVyZ2UuIEluIG1vc3Qgb3RoZXIg Y2FzZXMsIGEKICogcGx1Z2luIGNhbiBudWRnZSB0aGUgcGxhbm5lciB0b3dhcmQgYSBwYXJ0 aWN1bGFyIHN0cmF0ZWd5IGJ5IGRpc2FibGluZwogKiBhbGwgb2YgdGhlIG90aGVycywgYnV0 IHRoYXQgZG9lc24ndCB3b3JrIGhlcmU6IHVuc2V0dGluZyBQR1NfU0VRU0NBTiwKICogZm9y IGluc3RhbmNlLCB3b3VsZCBkaXNhYmxlIGJvdGggcGFydGlhbCBhbmQgbm9uLXBhcnRpYWwg c2VxdWVudGlhbCBzY2Fucy4KICovCiNkZWZpbmUgUEdTX1NFUVNDQU4JCQkJCTB4MDAwMDAw MDEKI2RlZmluZSBQR1NfSU5ERVhTQ0FOCQkJCTB4MDAwMDAwMDIKI2RlZmluZSBQR1NfSU5E RVhPTkxZU0NBTgkJCTB4MDAwMDAwMDQKI2RlZmluZSBQR1NfQklUTUFQU0NBTgkJCQkweDAw MDAwMDA4CiNkZWZpbmUgUEdTX1RJRFNDQU4JCQkJCTB4MDAwMDAwMTAKI2RlZmluZSBQR1Nf Rk9SRUlHTkpPSU4JCQkJMHgwMDAwMDAyMAojZGVmaW5lIFBHU19NRVJHRUpPSU5fUExBSU4J CQkweDAwMDAwMDQwCiNkZWZpbmUgUEdTX01FUkdFSk9JTl9NQVRFUklBTElaRQkweDAwMDAw MDgwCiNkZWZpbmUgUEdTX05FU1RMT09QX1BMQUlOCQkJMHgwMDAwMDEwMAojZGVmaW5lIFBH U19ORVNUTE9PUF9NQVRFUklBTElaRQkweDAwMDAwMjAwCiNkZWZpbmUgUEdTX05FU1RMT09Q X01FTU9JWkUJCTB4MDAwMDA0MDAKI2RlZmluZSBQR1NfSEFTSEpPSU4JCQkJMHgwMDAwMDgw MAojZGVmaW5lIFBHU19BUFBFTkQJCQkJCTB4MDAwMDEwMDAKI2RlZmluZSBQR1NfTUVSR0Vf QVBQRU5ECQkJMHgwMDAwMjAwMAojZGVmaW5lIFBHU19HQVRIRVIJCQkJCTB4MDAwMDQwMDAK I2RlZmluZSBQR1NfR0FUSEVSX01FUkdFCQkJMHgwMDAwODAwMAojZGVmaW5lIFBHU19DT05T SURFUl9JTkRFWE9OTFkJCTB4MDAwMTAwMDAKI2RlZmluZSBQR1NfQ09OU0lERVJfUEFSVElU SU9OV0lTRQkweDAwMDIwMDAwCiNkZWZpbmUgUEdTX0NPTlNJREVSX05PTlBBUlRJQUwJCTB4 MDAwNDAwMDAKCi8qCiAqIENvbnZlbmllbmNlIG1hY3JvcyBmb3IgdXNlZnVsIGNvbWJpbmF0 aW9uIG9mIHRoZSBiaXRzIGRlZmluZWQgYWJvdmUuCiAqLwojZGVmaW5lIFBHU19TQ0FOX0FO WQkJXAoJKFBHU19TRVFTQ0FOIHwgUEdTX0lOREVYU0NBTiB8IFBHU19JTkRFWE9OTFlTQ0FO IHwgUEdTX0JJVE1BUFNDQU4gfCBcCgkgUEdTX1RJRFNDQU4pCiNkZWZpbmUgUEdTX01FUkdF Sk9JTl9BTlkJXAoJKFBHU19NRVJHRUpPSU5fUExBSU4gfCBQR1NfTUVSR0VKT0lOX01BVEVS SUFMSVpFKQojZGVmaW5lIFBHU19ORVNUTE9PUF9BTlkJXAoJKFBHU19ORVNUTE9PUF9QTEFJ TiB8IFBHU19ORVNUTE9PUF9NQVRFUklBTElaRSB8IFBHU19ORVNUTE9PUF9NRU1PSVpFKQoj ZGVmaW5lIFBHU19KT0lOX0FOWQkJXAoJKFBHU19GT1JFSUdOSk9JTiB8IFBHU19NRVJHRUpP SU5fQU5ZIHwgUEdTX05FU1RMT09QX0FOWSB8IFBHU19IQVNISk9JTikKCi8qCiAqIFJlbGlk cwogKgkJU2V0IG9mIHJlbGF0aW9uIGlkZW50aWZpZXJzIChpbmRleGVzIGludG8gdGhlIHJh bmdldGFibGUpLgogKi8KdHlwZWRlZiBCaXRtYXBzZXQgKlJlbGlkczsKCi8qCiAqIFdoZW4g bG9va2luZyBmb3IgYSAiY2hlYXBlc3QgcGF0aCIsIHRoaXMgZW51bSBzcGVjaWZpZXMgd2hl dGhlciB3ZSB3YW50CiAqIGNoZWFwZXN0IHN0YXJ0dXAgY29zdCBvciBjaGVhcGVzdCB0b3Rh bCBjb3N0LgogKi8KdHlwZWRlZiBlbnVtIENvc3RTZWxlY3Rvcgp7CglTVEFSVFVQX0NPU1Qs IFRPVEFMX0NPU1QKfSBDb3N0U2VsZWN0b3I7CgovKgogKiBUaGUgY29zdCBlc3RpbWF0ZSBw cm9kdWNlZCBieSBjb3N0X3F1YWxfZXZhbCgpIGluY2x1ZGVzIGJvdGggYSBvbmUtdGltZQog KiAoc3RhcnR1cCkgY29zdCwgYW5kIGEgcGVyLXR1cGxlIGNvc3QuCiAqLwp0eXBlZGVmIHN0 cnVjdCBRdWFsQ29zdAp7CglDb3N0CQlzdGFydHVwOwkJLyogb25lLXRpbWUgY29zdCAqLwoJ Q29zdAkJcGVyX3R1cGxlOwkJLyogcGVyLWV2YWx1YXRpb24gY29zdCAqLwp9IFF1YWxDb3N0 OwoKLyoKICogQ29zdGluZyBhZ2dyZWdhdGUgZnVuY3Rpb24gZXhlY3V0aW9uIHJlcXVpcmVz IHRoZXNlIHN0YXRpc3RpY3MgYWJvdXQKICogdGhlIGFnZ3JlZ2F0ZXMgdG8gYmUgZXhlY3V0 ZWQgYnkgYSBnaXZlbiBBZ2cgbm9kZS4gIE5vdGUgdGhhdCB0aGUgY29zdHMKICogaW5jbHVk ZSB0aGUgZXhlY3V0aW9uIGNvc3RzIG9mIHRoZSBhZ2dyZWdhdGVzJyBhcmd1bWVudCBleHBy ZXNzaW9ucyBhcwogKiB3ZWxsIGFzIHRoZSBhZ2dyZWdhdGUgZnVuY3Rpb25zIHRoZW1zZWx2 ZXMuICBBbHNvLCB0aGUgZmllbGRzIG11c3QgYmUKICogZGVmaW5lZCBzbyB0aGF0IGluaXRp YWxpemluZyB0aGUgc3RydWN0IHRvIHplcm9lcyB3aXRoIG1lbXNldCBpcyBjb3JyZWN0Lgog Ki8KdHlwZWRlZiBzdHJ1Y3QgQWdnQ2xhdXNlQ29zdHMKewoJUXVhbENvc3QJdHJhbnNDb3N0 OwkJLyogdG90YWwgcGVyLWlucHV0LXJvdyBleGVjdXRpb24gY29zdHMgKi8KCVF1YWxDb3N0 CWZpbmFsQ29zdDsJCS8qIHRvdGFsIHBlci1hZ2dyZWdhdGVkLXJvdyBjb3N0cyAqLwoJU2l6 ZQkJdHJhbnNpdGlvblNwYWNlOwkvKiBzcGFjZSBmb3IgcGFzcy1ieS1yZWYgdHJhbnNpdGlv biBkYXRhICovCn0gQWdnQ2xhdXNlQ29zdHM7CgovKgogKiBUaGlzIGVudW0gaWRlbnRpZmll cyB0aGUgZGlmZmVyZW50IHR5cGVzIG9mICJ1cHBlciIgKHBvc3Qtc2Nhbi9qb2luKQogKiBy ZWxhdGlvbnMgdGhhdCB3ZSBtaWdodCBkZWFsIHdpdGggZHVyaW5nIHBsYW5uaW5nLgogKi8K dHlwZWRlZiBlbnVtIFVwcGVyUmVsYXRpb25LaW5kCnsKCVVQUEVSUkVMX1NFVE9QLAkJCQkv KiByZXN1bHQgb2YgVU5JT04vSU5URVJTRUNUL0VYQ0VQVCwgaWYgYW55ICovCglVUFBFUlJF TF9QQVJUSUFMX0dST1VQX0FHRywgLyogcmVzdWx0IG9mIHBhcnRpYWwgZ3JvdXBpbmcvYWdn cmVnYXRpb24sIGlmCgkJCQkJCQkJICogYW55ICovCglVUFBFUlJFTF9HUk9VUF9BR0csCQkJ LyogcmVzdWx0IG9mIGdyb3VwaW5nL2FnZ3JlZ2F0aW9uLCBpZiBhbnkgKi8KCVVQUEVSUkVM X1dJTkRPVywJCQkvKiByZXN1bHQgb2Ygd2luZG93IGZ1bmN0aW9ucywgaWYgYW55ICovCglV UFBFUlJFTF9QQVJUSUFMX0RJU1RJTkNULAkvKiByZXN1bHQgb2YgcGFydGlhbCAiU0VMRUNU IERJU1RJTkNUIiwgaWYgYW55ICovCglVUFBFUlJFTF9ESVNUSU5DVCwJCQkvKiByZXN1bHQg b2YgIlNFTEVDVCBESVNUSU5DVCIsIGlmIGFueSAqLwoJVVBQRVJSRUxfT1JERVJFRCwJCQkv KiByZXN1bHQgb2YgT1JERVIgQlksIGlmIGFueSAqLwoJVVBQRVJSRUxfRklOQUwsCQkJCS8q IHJlc3VsdCBvZiBhbnkgcmVtYWluaW5nIHRvcC1sZXZlbCBhY3Rpb25zICovCgkvKiBOQjog VVBQRVJSRUxfRklOQUwgbXVzdCBiZSBsYXN0IGVudW0gZW50cnk7IGl0J3MgdXNlZCB0byBz aXplIGFycmF5cyAqLwp9IFVwcGVyUmVsYXRpb25LaW5kOwoKLyotLS0tLS0tLS0tCiAqIFBs YW5uZXJHbG9iYWwKICoJCUdsb2JhbCBpbmZvcm1hdGlvbiBmb3IgcGxhbm5pbmcvb3B0aW1p emF0aW9uCiAqCiAqIFBsYW5uZXJHbG9iYWwgaG9sZHMgc3RhdGUgZm9yIGFuIGVudGlyZSBw bGFubmVyIGludm9jYXRpb247IHRoaXMgc3RhdGUKICogaXMgc2hhcmVkIGFjcm9zcyBhbGwg bGV2ZWxzIG9mIHN1Yi1RdWVyaWVzIHRoYXQgZXhpc3QgaW4gdGhlIGNvbW1hbmQgYmVpbmcK ICogcGxhbm5lZC4KICoKICogTm90IGFsbCBmaWVsZHMgYXJlIHByaW50ZWQuICAoSW4gc29t ZSBjYXNlcywgdGhlcmUgaXMgbm8gcHJpbnQgc3VwcG9ydCBmb3IKICogdGhlIGZpZWxkIHR5 cGU7IGluIG90aGVycywgZG9pbmcgc28gd291bGQgbGVhZCB0byBpbmZpbml0ZSByZWN1cnNp b24uKQogKi0tLS0tLS0tLS0KICovCnR5cGVkZWYgc3RydWN0IFBsYW5uZXJHbG9iYWwKewoJ cGdfbm9kZV9hdHRyKG5vX2NvcHlfZXF1YWwsIG5vX3JlYWQsIG5vX3F1ZXJ5X2p1bWJsZSkK CglOb2RlVGFnCQl0eXBlOwoKCS8qIFBhcmFtIHZhbHVlcyBwcm92aWRlZCB0byBwbGFubmVy KCkgKi8KCVBhcmFtTGlzdEluZm8gYm91bmRQYXJhbXMgcGdfbm9kZV9hdHRyKHJlYWRfd3Jp dGVfaWdub3JlKTsKCgkvKiBQbGFucyBmb3IgU3ViUGxhbiBub2RlcyAqLwoJTGlzdAkgICAq c3VicGxhbnM7CgoJLyogUGF0aHMgZnJvbSB3aGljaCB0aGUgU3ViUGxhbiBQbGFucyB3ZXJl IG1hZGUgKi8KCUxpc3QJICAgKnN1YnBhdGhzOwoKCS8qIFBsYW5uZXJJbmZvcyBmb3IgU3Vi UGxhbiBub2RlcyAqLwoJTGlzdAkgICAqc3Vicm9vdHMgcGdfbm9kZV9hdHRyKHJlYWRfd3Jp dGVfaWdub3JlKTsKCgkvKiBuYW1lcyBhbHJlYWR5IHVzZWQgZm9yIHN1YnBsYW5zIChsaXN0 IG9mIEMgc3RyaW5ncykgKi8KCUxpc3QJICAgKnN1YnBsYW5OYW1lcyBwZ19ub2RlX2F0dHIo cmVhZF93cml0ZV9pZ25vcmUpOwoKCS8qIGluZGljZXMgb2Ygc3VicGxhbnMgdGhhdCByZXF1 aXJlIFJFV0lORCAqLwoJQml0bWFwc2V0ICAqcmV3aW5kUGxhbklEczsKCgkvKiAiZmxhdCIg cmFuZ2V0YWJsZSBmb3IgZXhlY3V0b3IgKi8KCUxpc3QJICAgKmZpbmFscnRhYmxlOwoKCS8q CgkgKiBSVCBpbmRleGVzIG9mIGFsbCByZWxhdGlvbiBSVEVzIGluIGZpbmFscnRhYmxlIChS VEVfUkVMQVRJT04gYW5kCgkgKiBSVEVfU1VCUVVFUlkgUlRFcyBvZiB2aWV3cykKCSAqLwoJ Qml0bWFwc2V0ICAqYWxsUmVsaWRzOwoKCS8qCgkgKiBSVCBpbmRleGVzIG9mIGFsbCBsZWFm IHBhcnRpdGlvbnMgaW4gbm9kZXMgdGhhdCBzdXBwb3J0IHBydW5pbmcgYW5kIGFyZQoJICog c3ViamVjdCB0byBydW50aW1lIHBydW5pbmcgYXQgcGxhbiBpbml0aWFsaXphdGlvbiB0aW1l ICgiaW5pdGlhbCIKCSAqIHBydW5pbmcpLgoJICovCglCaXRtYXBzZXQgICpwcnVuYWJsZVJl bGlkczsKCgkvKiAiZmxhdCIgbGlzdCBvZiBSVEVQZXJtaXNzaW9uSW5mb3MgKi8KCUxpc3QJ ICAgKmZpbmFscnRlcGVybWluZm9zOwoKCS8qIGxpc3Qgb2YgU3ViUGxhblJUSW5mbyBub2Rl cyAqLwoJTGlzdAkgICAqc3VicnRpbmZvczsKCgkvKiAiZmxhdCIgbGlzdCBvZiBQbGFuUm93 TWFya3MgKi8KCUxpc3QJICAgKmZpbmFscm93bWFya3M7CgoJLyogImZsYXQiIGxpc3Qgb2Yg aW50ZWdlciBSVCBpbmRleGVzICovCglMaXN0CSAgICpyZXN1bHRSZWxhdGlvbnM7CgoJLyog ImZsYXQiIGxpc3Qgb2YgQXBwZW5kUmVsSW5mb3MgKi8KCUxpc3QJICAgKmFwcGVuZFJlbGF0 aW9uczsKCgkvKiAiZmxhdCIgbGlzdCBvZiBQYXJ0aXRpb25QcnVuZUluZm9zICovCglMaXN0 CSAgICpwYXJ0UHJ1bmVJbmZvczsKCgkvKiBPSURzIG9mIHJlbGF0aW9ucyB0aGUgcGxhbiBk ZXBlbmRzIG9uICovCglMaXN0CSAgICpyZWxhdGlvbk9pZHM7CgoJLyogb3RoZXIgZGVwZW5k ZW5jaWVzLCBhcyBQbGFuSW52YWxJdGVtcyAqLwoJTGlzdAkgICAqaW52YWxJdGVtczsKCgkv KiB0eXBlIE9JRHMgZm9yIFBBUkFNX0VYRUMgUGFyYW1zICovCglMaXN0CSAgICpwYXJhbUV4 ZWNUeXBlczsKCgkvKiBpbmZvIGFib3V0IG5vZGVzIGVsaWRlZCBmcm9tIHRoZSBwbGFuIGR1 cmluZyBzZXRyZWZzIHByb2Nlc3NpbmcgKi8KCUxpc3QJICAgKmVsaWRlZE5vZGVzOwoKCS8q IGhpZ2hlc3QgUGxhY2VIb2xkZXJWYXIgSUQgYXNzaWduZWQgKi8KCUluZGV4CQlsYXN0UEhJ ZDsKCgkvKiBoaWdoZXN0IFBsYW5Sb3dNYXJrIElEIGFzc2lnbmVkICovCglJbmRleAkJbGFz dFJvd01hcmtJZDsKCgkvKiBoaWdoZXN0IHBsYW4gbm9kZSBJRCBhc3NpZ25lZCAqLwoJaW50 CQkJbGFzdFBsYW5Ob2RlSWQ7CgoJLyogcmVkbyBwbGFuIHdoZW4gVHJhbnNhY3Rpb25YbWlu IGNoYW5nZXM/ICovCglib29sCQl0cmFuc2llbnRQbGFuOwoKCS8qIGlzIHBsYW4gc3BlY2lm aWMgdG8gY3VycmVudCByb2xlPyAqLwoJYm9vbAkJZGVwZW5kc09uUm9sZTsKCgkvKiBwYXJh bGxlbCBtb2RlIHBvdGVudGlhbGx5IE9LPyAqLwoJYm9vbAkJcGFyYWxsZWxNb2RlT0s7CgoJ LyogcGFyYWxsZWwgbW9kZSBhY3R1YWxseSByZXF1aXJlZD8gKi8KCWJvb2wJCXBhcmFsbGVs TW9kZU5lZWRlZDsKCgkvKiB3b3JzdCBQUk9QQVJBTExFTCBoYXphcmQgbGV2ZWwgKi8KCWNo YXIJCW1heFBhcmFsbGVsSGF6YXJkOwoKCS8qIG1hc2sgb2YgYWxsb3dlZCBwYXRoIGdlbmVy YXRpb24gc3RyYXRlZ2llcyAqLwoJdWludDY0CQlkZWZhdWx0X3Bnc19tYXNrOwoKCS8qIHBh cnRpdGlvbiBkZXNjcmlwdG9ycyAqLwoJUGFydGl0aW9uRGlyZWN0b3J5IHBhcnRpdGlvbl9k aXJlY3RvcnkgcGdfbm9kZV9hdHRyKHJlYWRfd3JpdGVfaWdub3JlKTsKCgkvKiBoYXNoIHRh YmxlIGZvciBOT1QgTlVMTCBhdHRudW1zIG9mIHJlbGF0aW9ucyAqLwoJc3RydWN0IEhUQUIg KnJlbF9ub3RudWxsYXR0c19oYXNoIHBnX25vZGVfYXR0cihyZWFkX3dyaXRlX2lnbm9yZSk7 CgoJLyogZXh0ZW5zaW9uIHN0YXRlICovCgl2b2lkCSAgKipleHRlbnNpb25fc3RhdGUgcGdf bm9kZV9hdHRyKHJlYWRfd3JpdGVfaWdub3JlKTsKCWludAkJCWV4dGVuc2lvbl9zdGF0ZV9h bGxvY2F0ZWQ7Cn0gUGxhbm5lckdsb2JhbDsKCi8qIG1hY3JvIGZvciBmZXRjaGluZyB0aGUg UGxhbiBhc3NvY2lhdGVkIHdpdGggYSBTdWJQbGFuIG5vZGUgKi8KI2RlZmluZSBwbGFubmVy X3N1YnBsYW5fZ2V0X3BsYW4ocm9vdCwgc3VicGxhbikgXAoJKChQbGFuICopIGxpc3RfbnRo KChyb290KS0+Z2xvYi0+c3VicGxhbnMsIChzdWJwbGFuKS0+cGxhbl9pZCAtIDEpKQoKCi8q LS0tLS0tLS0tLQogKiBQbGFubmVySW5mbwogKgkJUGVyLXF1ZXJ5IGluZm9ybWF0aW9uIGZv ciBwbGFubmluZy9vcHRpbWl6YXRpb24KICoKICogVGhpcyBzdHJ1Y3QgaXMgY29udmVudGlv bmFsbHkgY2FsbGVkICJyb290IiBpbiBhbGwgdGhlIHBsYW5uZXIgcm91dGluZXMuCiAqIEl0 IGhvbGRzIGxpbmtzIHRvIGFsbCBvZiB0aGUgcGxhbm5lcidzIHdvcmtpbmcgc3RhdGUsIGlu IGFkZGl0aW9uIHRvIHRoZQogKiBvcmlnaW5hbCBRdWVyeS4gIE5vdGUgdGhhdCBhdCBwcmVz ZW50IHRoZSBwbGFubmVyIGV4dGVuc2l2ZWx5IG1vZGlmaWVzCiAqIHRoZSBwYXNzZWQtaW4g UXVlcnkgZGF0YSBzdHJ1Y3R1cmU7IHNvbWVkYXkgdGhhdCBzaG91bGQgc3RvcC4KICoKICog Tm90IGFsbCBmaWVsZHMgYXJlIHByaW50ZWQuICAoSW4gc29tZSBjYXNlcywgdGhlcmUgaXMg bm8gcHJpbnQgc3VwcG9ydCBmb3IKICogdGhlIGZpZWxkIHR5cGU7IGluIG90aGVycywgZG9p bmcgc28gd291bGQgbGVhZCB0byBpbmZpbml0ZSByZWN1cnNpb24gb3IKICogYmxvYXQgZHVt cCBvdXRwdXQgbW9yZSB0aGFuIHNlZW1zIHVzZWZ1bC4pCiAqCiAqIE5PVEU6IFdoZW4gYWRk aW5nIG5ldyBlbnRyaWVzIGNvbnRhaW5pbmcgcmVsaWRzIGFuZCByZWxpZCBiaXRtYXBzZXRz LAogKiByZW1lbWJlciB0byBjaGVjayB0aGF0IHRoZXkgd2lsbCBiZSBjb3JyZWN0bHkgcHJv Y2Vzc2VkIGJ5CiAqIHRoZSByZW1vdmVfc2VsZl9qb2luX3JlbCBmdW5jdGlvbiAtIHJlbGlk IG9mIHJlbW92aW5nIHJlbGF0aW9uIHdpbGwgYmUKICogY29ycmVjdGx5IHJlcGxhY2VkIHdp dGggdGhlIGtlZXBpbmcgb25lLgogKi0tLS0tLS0tLS0KICovCnR5cGVkZWYgc3RydWN0IFBs YW5uZXJJbmZvIFBsYW5uZXJJbmZvOwoKc3RydWN0IFBsYW5uZXJJbmZvCnsKCXBnX25vZGVf YXR0cihub19jb3B5X2VxdWFsLCBub19yZWFkLCBub19xdWVyeV9qdW1ibGUpCgoJTm9kZVRh ZwkJdHlwZTsKCgkvKiB0aGUgUXVlcnkgYmVpbmcgcGxhbm5lZCAqLwoJUXVlcnkJICAgKnBh cnNlOwoKCS8qIGdsb2JhbCBpbmZvIGZvciBjdXJyZW50IHBsYW5uZXIgcnVuICovCglQbGFu bmVyR2xvYmFsICpnbG9iOwoKCS8qIDEgYXQgdGhlIG91dGVybW9zdCBRdWVyeSAqLwoJSW5k ZXgJCXF1ZXJ5X2xldmVsOwoKCS8qIE5VTEwgYXQgb3V0ZXJtb3N0IFF1ZXJ5ICovCglQbGFu bmVySW5mbyAqcGFyZW50X3Jvb3QgcGdfbm9kZV9hdHRyKHJlYWRfd3JpdGVfaWdub3JlKTsK CgkvKiBTdWJwbGFuIG5hbWUgZm9yIEVYUExBSU4gYW5kIGRlYnVnZ2luZyBwdXJwb3NlcyAo TlVMTCBhdCB0b3AgbGV2ZWwpICovCgljaGFyCSAgICpwbGFuX25hbWU7CgoJLyoKCSAqIElm IHRoaXMgUGxhbm5lckluZm8gZXhpc3RzIHRvIGNvbnNpZGVyIGFuIGFsdGVybmF0aXZlIGlt cGxlbWVudGF0aW9uCgkgKiBzdHJhdGVneSBmb3IgYSBwb3J0aW9uIG9mIHRoZSBxdWVyeSB0 aGF0IGNvdWxkIGFsc28gYmUgaW1wbGVtZW50ZWQgYnkKCSAqIHNvbWUgb3RoZXIgUGxhbm5l ckluZm8sIHRoaXMgaXMgdGhlIHBsYW5fbmFtZSBmb3IgdGhhdCBvdGhlcgoJICogUGxhbm5l ckluZm8uIFdoZW4gd2UgYXJlIGNvbnNpZGVyaW5nIHRoZSBmaXJzdCBvciBvbmx5IGFsdGVy bmF0aXZlLCBpdAoJICogaXMgdGhlIHNhbWUgYXMgcGxhbl9uYW1lLgoJICoKCSAqIEN1cnJl bnRseSwgd2Ugc2V0IHRoaXMgdG8gYSB2YWx1ZSBvdGhlciB0aGFuIHBsYW5fbmFtZSBvbmx5 IHdoZW4KCSAqIGNvbnNpZGVyaW5nIGEgTWluTWF4QWdnUGF0aCBvciBhIGhhc2hlZCBTdWJQ bGFuLgoJICovCgljaGFyCSAgICphbHRlcm5hdGl2ZV9wbGFuX25hbWU7CgoJLyoKCSAqIHBs YW5fcGFyYW1zIGNvbnRhaW5zIHRoZSBleHByZXNzaW9ucyB0aGF0IHRoaXMgcXVlcnkgbGV2 ZWwgbmVlZHMgdG8KCSAqIG1ha2UgYXZhaWxhYmxlIHRvIGEgbG93ZXIgcXVlcnkgbGV2ZWwg dGhhdCBpcyBjdXJyZW50bHkgYmVpbmcgcGxhbm5lZC4KCSAqIG91dGVyX3BhcmFtcyBjb250 YWlucyB0aGUgcGFyYW1JZHMgb2YgUEFSQU1fRVhFQyBQYXJhbXMgdGhhdCBvdXRlcgoJICog cXVlcnkgbGV2ZWxzIHdpbGwgbWFrZSBhdmFpbGFibGUgdG8gdGhpcyBxdWVyeSBsZXZlbC4K CSAqLwoJLyogbGlzdCBvZiBQbGFubmVyUGFyYW1JdGVtcywgc2VlIGJlbG93ICovCglMaXN0 CSAgICpwbGFuX3BhcmFtczsKCUJpdG1hcHNldCAgKm91dGVyX3BhcmFtczsKCgkvKgoJICog c2ltcGxlX3JlbF9hcnJheSBob2xkcyBwb2ludGVycyB0byAiYmFzZSByZWxzIiBhbmQgIm90 aGVyIHJlbHMiIChzZWUKCSAqIGNvbW1lbnRzIGZvciBSZWxPcHRJbmZvIGZvciBtb3JlIGlu Zm8pLiAgSXQgaXMgaW5kZXhlZCBieSByYW5nZXRhYmxlCgkgKiBpbmRleCAoc28gZW50cnkg MCBpcyBhbHdheXMgd2FzdGVkKS4gIEVudHJpZXMgY2FuIGJlIE5VTEwgd2hlbiBhbiBSVEUK CSAqIGRvZXMgbm90IGNvcnJlc3BvbmQgdG8gYSBiYXNlIHJlbGF0aW9uLCBzdWNoIGFzIGEg am9pbiBSVEUgb3IgYW4KCSAqIHVucmVmZXJlbmNlZCB2aWV3IFJURTsgb3IgaWYgdGhlIFJl bE9wdEluZm8gaGFzbid0IGJlZW4gbWFkZSB5ZXQuCgkgKi8KCXN0cnVjdCBSZWxPcHRJbmZv ICoqc2ltcGxlX3JlbF9hcnJheSBwZ19ub2RlX2F0dHIoYXJyYXlfc2l6ZShzaW1wbGVfcmVs X2FycmF5X3NpemUpKTsKCS8qIGFsbG9jYXRlZCBzaXplIG9mIGFycmF5ICovCglpbnQJCQlz aW1wbGVfcmVsX2FycmF5X3NpemU7CgoJLyoKCSAqIHNpbXBsZV9ydGVfYXJyYXkgaXMgdGhl IHNhbWUgbGVuZ3RoIGFzIHNpbXBsZV9yZWxfYXJyYXkgYW5kIGhvbGRzCgkgKiBwb2ludGVy cyB0byB0aGUgYXNzb2NpYXRlZCByYW5nZXRhYmxlIGVudHJpZXMuICBVc2luZyB0aGlzIGlz IGEgc2hhZGUKCSAqIGZhc3RlciB0aGFuIHVzaW5nIHJ0X2ZldGNoKCksIG1vc3RseSBkdWUg dG8gZmV3ZXIgaW5kaXJlY3Rpb25zLiAgKE5vdAoJICogcHJpbnRlZCBiZWNhdXNlIGl0J2Qg YmUgcmVkdW5kYW50IHdpdGggcGFyc2UtPnJ0YWJsZS4pCgkgKi8KCVJhbmdlVGJsRW50cnkg KipzaW1wbGVfcnRlX2FycmF5IHBnX25vZGVfYXR0cihyZWFkX3dyaXRlX2lnbm9yZSk7CgoJ LyoKCSAqIGFwcGVuZF9yZWxfYXJyYXkgaXMgdGhlIHNhbWUgbGVuZ3RoIGFzIHRoZSBhYm92 ZSBhcnJheXMsIGFuZCBob2xkcwoJICogcG9pbnRlcnMgdG8gdGhlIGNvcnJlc3BvbmRpbmcg QXBwZW5kUmVsSW5mbyBlbnRyeSBpbmRleGVkIGJ5CgkgKiBjaGlsZF9yZWxpZCwgb3IgTlVM TCBpZiB0aGUgcmVsIGlzIG5vdCBhbiBhcHBlbmRyZWwgY2hpbGQuICBUaGUgYXJyYXkKCSAq IGl0c2VsZiBpcyBub3QgYWxsb2NhdGVkIGlmIGFwcGVuZF9yZWxfbGlzdCBpcyBlbXB0eS4g IChOb3QgcHJpbnRlZAoJICogYmVjYXVzZSBpdCdkIGJlIHJlZHVuZGFudCB3aXRoIGFwcGVu ZF9yZWxfbGlzdC4pCgkgKi8KCXN0cnVjdCBBcHBlbmRSZWxJbmZvICoqYXBwZW5kX3JlbF9h cnJheSBwZ19ub2RlX2F0dHIocmVhZF93cml0ZV9pZ25vcmUpOwoKCS8qCgkgKiBhbGxfYmFz ZXJlbHMgaXMgYSBSZWxpZHMgc2V0IG9mIGFsbCBiYXNlIHJlbGlkcyAoYnV0IG5vdCBqb2lu cyBvcgoJICogIm90aGVyIiByZWxzKSBpbiB0aGUgcXVlcnkuICBUaGlzIGlzIGNvbXB1dGVk IGluIGRlY29uc3RydWN0X2pvaW50cmVlLgoJICovCglSZWxpZHMJCWFsbF9iYXNlcmVsczsK CgkvKgoJICogb3V0ZXJfam9pbl9yZWxzIGlzIGEgUmVsaWRzIHNldCBvZiBhbGwgb3V0ZXIt am9pbiByZWxpZHMgaW4gdGhlIHF1ZXJ5LgoJICogVGhpcyBpcyBjb21wdXRlZCBpbiBkZWNv bnN0cnVjdF9qb2ludHJlZS4KCSAqLwoJUmVsaWRzCQlvdXRlcl9qb2luX3JlbHM7CgoJLyoK CSAqIGFsbF9xdWVyeV9yZWxzIGlzIGEgUmVsaWRzIHNldCBvZiBhbGwgYmFzZSByZWxpZHMg YW5kIG91dGVyIGpvaW4gcmVsaWRzCgkgKiAoYnV0IG5vdCAib3RoZXIiIHJlbGlkcykgaW4g dGhlIHF1ZXJ5LiAgVGhpcyBpcyB0aGUgUmVsaWRzIGlkZW50aWZpZXIKCSAqIG9mIHRoZSBm aW5hbCBqb2luIHdlIG5lZWQgdG8gZm9ybS4gIFRoaXMgaXMgY29tcHV0ZWQgaW4KCSAqIGRl Y29uc3RydWN0X2pvaW50cmVlLgoJICovCglSZWxpZHMJCWFsbF9xdWVyeV9yZWxzOwoKCS8q CgkgKiBqb2luX3JlbF9saXN0IGlzIGEgbGlzdCBvZiBhbGwgam9pbi1yZWxhdGlvbiBSZWxP cHRJbmZvcyB3ZSBoYXZlCgkgKiBjb25zaWRlcmVkIGluIHRoaXMgcGxhbm5pbmcgcnVuLiAg Rm9yIHNtYWxsIHByb2JsZW1zIHdlIGp1c3Qgc2NhbiB0aGUKCSAqIGxpc3QgdG8gZG8gbG9v a3VwcywgYnV0IHdoZW4gdGhlcmUgYXJlIG1hbnkgam9pbiByZWxhdGlvbnMgd2UgYnVpbGQg YQoJICogaGFzaCB0YWJsZSBmb3IgZmFzdGVyIGxvb2t1cHMuICBUaGUgaGFzaCB0YWJsZSBp cyBwcmVzZW50IGFuZCB2YWxpZAoJICogd2hlbiBqb2luX3JlbF9oYXNoIGlzIG5vdCBOVUxM LiAgTm90ZSB0aGF0IHdlIHN0aWxsIG1haW50YWluIHRoZSBsaXN0CgkgKiBldmVuIHdoZW4g dXNpbmcgdGhlIGhhc2ggdGFibGUgZm9yIGxvb2t1cHM7IHRoaXMgc2ltcGxpZmllcyBsaWZl IGZvcgoJICogR0VRTy4KCSAqLwoJTGlzdAkgICAqam9pbl9yZWxfbGlzdDsKCXN0cnVjdCBI VEFCICpqb2luX3JlbF9oYXNoIHBnX25vZGVfYXR0cihyZWFkX3dyaXRlX2lnbm9yZSk7CgoJ LyoKCSAqIFdoZW4gZG9pbmcgYSBkeW5hbWljLXByb2dyYW1taW5nLXN0eWxlIGpvaW4gc2Vh cmNoLCBqb2luX3JlbF9sZXZlbFtrXQoJICogaXMgYSBsaXN0IG9mIGFsbCBqb2luLXJlbGF0 aW9uIFJlbE9wdEluZm9zIG9mIGxldmVsIGssIGFuZAoJICogam9pbl9jdXJfbGV2ZWwgaXMg dGhlIGN1cnJlbnQgbGV2ZWwuICBOZXcgam9pbi1yZWxhdGlvbiBSZWxPcHRJbmZvcyBhcmUK CSAqIGF1dG9tYXRpY2FsbHkgYWRkZWQgdG8gdGhlIGpvaW5fcmVsX2xldmVsW2pvaW5fY3Vy X2xldmVsXSBsaXN0LgoJICogam9pbl9yZWxfbGV2ZWwgaXMgTlVMTCBpZiBub3QgaW4gdXNl LgoJICoKCSAqIE5vdGU6IHdlJ3ZlIGFscmVhZHkgcHJpbnRlZCBhbGwgYmFzZXJlbCBhbmQg am9pbnJlbCBSZWxPcHRJbmZvcyBhYm92ZSwKCSAqIHNvIHdlIGRvbid0IGR1bXAgam9pbl9y ZWxfbGV2ZWwgb3Igb3RoZXIgbGlzdHMgb2YgUmVsT3B0SW5mb3MuCgkgKi8KCS8qIGxpc3Rz IG9mIGpvaW4tcmVsYXRpb24gUmVsT3B0SW5mb3MgKi8KCUxpc3QJICAqKmpvaW5fcmVsX2xl dmVsIHBnX25vZGVfYXR0cihyZWFkX3dyaXRlX2lnbm9yZSk7CgkvKiBpbmRleCBvZiBsaXN0 IGJlaW5nIGV4dGVuZGVkICovCglpbnQJCQlqb2luX2N1cl9sZXZlbDsKCgkvKiBpbml0IFN1 YlBsYW5zIGZvciBxdWVyeSAqLwoJTGlzdAkgICAqaW5pdF9wbGFuczsKCgkvKgoJICogcGVy LUNURS1pdGVtIGxpc3Qgb2Ygc3VicGxhbiBJRHMgKG9yIC0xIGlmIG5vIHN1YnBsYW4gd2Fz IG1hZGUgZm9yIHRoYXQKCSAqIENURSkKCSAqLwoJTGlzdAkgICAqY3RlX3BsYW5faWRzOwoK CS8qIExpc3Qgb2YgTGlzdHMgb2YgUGFyYW1zIGZvciBNVUxUSUVYUFIgc3VicXVlcnkgb3V0 cHV0cyAqLwoJTGlzdAkgICAqbXVsdGlleHByX3BhcmFtczsKCgkvKiBsaXN0IG9mIEpvaW5E b21haW5zIHVzZWQgaW4gdGhlIHF1ZXJ5IChoaWdoZXIgb25lcyBmaXJzdCkgKi8KCUxpc3QJ ICAgKmpvaW5fZG9tYWluczsKCgkvKiBsaXN0IG9mIGFjdGl2ZSBFcXVpdmFsZW5jZUNsYXNz ZXMgKi8KCUxpc3QJICAgKmVxX2NsYXNzZXM7CgoJLyogc2V0IHRydWUgb25jZSBFQ3MgYXJl IGNhbm9uaWNhbCAqLwoJYm9vbAkJZWNfbWVyZ2luZ19kb25lOwoKCS8qIGxpc3Qgb2YgImNh bm9uaWNhbCIgUGF0aEtleXMgKi8KCUxpc3QJICAgKmNhbm9uX3BhdGhrZXlzOwoKCS8qCgkg KiBsaXN0IG9mIE91dGVySm9pbkNsYXVzZUluZm9zIGZvciBtZXJnZWpvaW5hYmxlIG91dGVy IGpvaW4gY2xhdXNlcwoJICogdy9ub25udWxsYWJsZSB2YXIgb24gbGVmdAoJICovCglMaXN0 CSAgICpsZWZ0X2pvaW5fY2xhdXNlczsKCgkvKgoJICogbGlzdCBvZiBPdXRlckpvaW5DbGF1 c2VJbmZvcyBmb3IgbWVyZ2Vqb2luYWJsZSBvdXRlciBqb2luIGNsYXVzZXMKCSAqIHcvbm9u bnVsbGFibGUgdmFyIG9uIHJpZ2h0CgkgKi8KCUxpc3QJICAgKnJpZ2h0X2pvaW5fY2xhdXNl czsKCgkvKgoJICogbGlzdCBvZiBPdXRlckpvaW5DbGF1c2VJbmZvcyBmb3IgbWVyZ2Vqb2lu YWJsZSBmdWxsIGpvaW4gY2xhdXNlcwoJICovCglMaXN0CSAgICpmdWxsX2pvaW5fY2xhdXNl czsKCgkvKiBsaXN0IG9mIFNwZWNpYWxKb2luSW5mb3MgKi8KCUxpc3QJICAgKmpvaW5faW5m b19saXN0OwoKCS8qIGNvdW50ZXIgZm9yIGFzc2lnbmluZyBSZXN0cmljdEluZm8gc2VyaWFs IG51bWJlcnMgKi8KCWludAkJCWxhc3RfcmluZm9fc2VyaWFsOwoKCS8qCgkgKiBhbGxfcmVz dWx0X3JlbGlkcyBpcyBlbXB0eSBmb3IgU0VMRUNULCBvdGhlcndpc2UgaXQgY29udGFpbnMg YXQgbGVhc3QKCSAqIHBhcnNlLT5yZXN1bHRSZWxhdGlvbi4gIEZvciBVUERBVEUvREVMRVRF L01FUkdFIGFjcm9zcyBhbiBpbmhlcml0YW5jZQoJICogb3IgcGFydGl0aW9uaW5nIHRyZWUs IHRoZSByZXN1bHQgcmVsJ3MgY2hpbGQgcmVsaWRzIGFyZSBhZGRlZC4gIFdoZW4KCSAqIHVz aW5nIG11bHRpLWxldmVsIHBhcnRpdGlvbmluZywgaW50ZXJtZWRpYXRlIHBhcnRpdGlvbmVk IHJlbHMgYXJlCgkgKiBpbmNsdWRlZC4gbGVhZl9yZXN1bHRfcmVsaWRzIGlzIHNpbWlsYXIg ZXhjZXB0IHRoYXQgb25seSBhY3R1YWwgcmVzdWx0CgkgKiB0YWJsZXMsIG5vdCBwYXJ0aXRp b25lZCB0YWJsZXMsIGFyZSBpbmNsdWRlZCBpbiBpdC4KCSAqLwoJLyogc2V0IG9mIGFsbCBy ZXN1bHQgcmVsaWRzICovCglSZWxpZHMJCWFsbF9yZXN1bHRfcmVsaWRzOwoJLyogc2V0IG9m IGFsbCBsZWFmIHJlbGlkcyAqLwoJUmVsaWRzCQlsZWFmX3Jlc3VsdF9yZWxpZHM7CgoJLyoK CSAqIGxpc3Qgb2YgQXBwZW5kUmVsSW5mb3MKCSAqCgkgKiBOb3RlOiBmb3IgQXBwZW5kUmVs SW5mb3MgZGVzY3JpYmluZyBwYXJ0aXRpb25zIG9mIGEgcGFydGl0aW9uZWQgdGFibGUsCgkg KiB3ZSBndWFyYW50ZWUgdGhhdCBwYXJ0aXRpb25zIHRoYXQgY29tZSBlYXJsaWVyIGluIHRo ZSBwYXJ0aXRpb25lZAoJICogdGFibGUncyBQYXJ0aXRpb25EZXNjIHdpbGwgYXBwZWFyIGVh cmxpZXIgaW4gYXBwZW5kX3JlbF9saXN0LgoJICovCglMaXN0CSAgICphcHBlbmRfcmVsX2xp c3Q7CgoJLyogbGlzdCBvZiBSb3dJZGVudGl0eVZhckluZm9zICovCglMaXN0CSAgICpyb3df aWRlbnRpdHlfdmFyczsKCgkvKiBsaXN0IG9mIFBsYW5Sb3dNYXJrcyAqLwoJTGlzdAkgICAq cm93TWFya3M7CgoJLyogbGlzdCBvZiBQbGFjZUhvbGRlckluZm9zICovCglMaXN0CSAgICpw bGFjZWhvbGRlcl9saXN0OwoKCS8qIGxpc3Qgb2YgQWdnQ2xhdXNlSW5mb3MgKi8KCUxpc3QJ ICAgKmFnZ19jbGF1c2VfbGlzdDsKCgkvKiBsaXN0IG9mIEdyb3VwaW5nRXhwckluZm9zICov CglMaXN0CSAgICpncm91cF9leHByX2xpc3Q7CgoJLyogbGlzdCBvZiBwbGFpbiBWYXJzIGNv bnRhaW5lZCBpbiB0YXJnZXRsaXN0IGFuZCBoYXZpbmdRdWFsICovCglMaXN0CSAgICp0bGlz dF92YXJzOwoKCS8qIGFycmF5IG9mIFBsYWNlSG9sZGVySW5mb3MgaW5kZXhlZCBieSBwaGlk ICovCglzdHJ1Y3QgUGxhY2VIb2xkZXJJbmZvICoqcGxhY2Vob2xkZXJfYXJyYXkgcGdfbm9k ZV9hdHRyKHJlYWRfd3JpdGVfaWdub3JlLCBhcnJheV9zaXplKHBsYWNlaG9sZGVyX2FycmF5 X3NpemUpKTsKCS8qIGFsbG9jYXRlZCBzaXplIG9mIGFycmF5ICovCglpbnQJCQlwbGFjZWhv bGRlcl9hcnJheV9zaXplIHBnX25vZGVfYXR0cihyZWFkX3dyaXRlX2lnbm9yZSk7CgoJLyog bGlzdCBvZiBGb3JlaWduS2V5T3B0SW5mb3MgKi8KCUxpc3QJICAgKmZrZXlfbGlzdDsKCgkv KiBkZXNpcmVkIHBhdGhrZXlzIGZvciBxdWVyeV9wbGFubmVyKCkgKi8KCUxpc3QJICAgKnF1 ZXJ5X3BhdGhrZXlzOwoKCS8qIGdyb3VwQ2xhdXNlIHBhdGhrZXlzLCBpZiBhbnkgKi8KCUxp c3QJICAgKmdyb3VwX3BhdGhrZXlzOwoKCS8qCgkgKiBUaGUgbnVtYmVyIG9mIGVsZW1lbnRz IGluIHRoZSBncm91cF9wYXRoa2V5cyBsaXN0IHdoaWNoIGJlbG9uZyB0byB0aGUKCSAqIEdS T1VQIEJZIGNsYXVzZS4gIEFkZGl0aW9uYWwgb25lcyBiZWxvbmcgdG8gT1JERVIgQlkgLyBE SVNUSU5DVAoJICogYWdncmVnYXRlcy4KCSAqLwoJaW50CQkJbnVtX2dyb3VwYnlfcGF0aGtl eXM7CgoJLyogcGF0aGtleXMgb2YgYm90dG9tIHdpbmRvdywgaWYgYW55ICovCglMaXN0CSAg ICp3aW5kb3dfcGF0aGtleXM7CgkvKiBkaXN0aW5jdENsYXVzZSBwYXRoa2V5cywgaWYgYW55 ICovCglMaXN0CSAgICpkaXN0aW5jdF9wYXRoa2V5czsKCS8qIHNvcnRDbGF1c2UgcGF0aGtl eXMsIGlmIGFueSAqLwoJTGlzdAkgICAqc29ydF9wYXRoa2V5czsKCS8qIHNldCBvcGVyYXRv ciBwYXRoa2V5cywgaWYgYW55ICovCglMaXN0CSAgICpzZXRvcF9wYXRoa2V5czsKCgkvKiBD YW5vbmljYWxpc2VkIHBhcnRpdGlvbiBzY2hlbWVzIHVzZWQgaW4gdGhlIHF1ZXJ5LiAqLwoJ TGlzdAkgICAqcGFydF9zY2hlbWVzIHBnX25vZGVfYXR0cihyZWFkX3dyaXRlX2lnbm9yZSk7 CgoJLyogUmVsT3B0SW5mb3Mgd2UgYXJlIG5vdyB0cnlpbmcgdG8gam9pbiAqLwoJTGlzdAkg ICAqaW5pdGlhbF9yZWxzIHBnX25vZGVfYXR0cihyZWFkX3dyaXRlX2lnbm9yZSk7CgoJLyoK CSAqIFVwcGVyLXJlbCBSZWxPcHRJbmZvcy4gVXNlIGZldGNoX3VwcGVyX3JlbCgpIHRvIGdl dCBhbnkgcGFydGljdWxhcgoJICogdXBwZXIgcmVsLgoJICovCglMaXN0CSAgICp1cHBlcl9y ZWxzW1VQUEVSUkVMX0ZJTkFMICsgMV0gcGdfbm9kZV9hdHRyKHJlYWRfd3JpdGVfaWdub3Jl KTsKCgkvKiBSZXN1bHQgdGxpc3RzIGNob3NlbiBieSBncm91cGluZ19wbGFubmVyIGZvciB1 cHBlci1zdGFnZSBwcm9jZXNzaW5nICovCglzdHJ1Y3QgUGF0aFRhcmdldCAqdXBwZXJfdGFy Z2V0c1tVUFBFUlJFTF9GSU5BTCArIDFdIHBnX25vZGVfYXR0cihyZWFkX3dyaXRlX2lnbm9y ZSk7CgoJLyoKCSAqIFRoZSBmdWxseS1wcm9jZXNzZWQgZ3JvdXBDbGF1c2UgaXMga2VwdCBo ZXJlLiAgSXQgZGlmZmVycyBmcm9tCgkgKiBwYXJzZS0+Z3JvdXBDbGF1c2UgaW4gdGhhdCB3 ZSByZW1vdmUgYW55IGl0ZW1zIHRoYXQgd2UgY2FuIHByb3ZlCgkgKiByZWR1bmRhbnQsIHNv IHRoYXQgb25seSB0aGUgY29sdW1ucyBuYW1lZCBoZXJlIGFjdHVhbGx5IG5lZWQgdG8gYmUK CSAqIGNvbXBhcmVkIHRvIGRldGVybWluZSBncm91cGluZy4gIE5vdGUgdGhhdCBpdCdzIHBv c3NpYmxlIGZvciAqYWxsKiB0aGUKCSAqIGl0ZW1zIHRvIGJlIHByb3ZlbiByZWR1bmRhbnQs IGltcGx5aW5nIHRoYXQgdGhlcmUgaXMgb25seSBvbmUgZ3JvdXAKCSAqIGNvbnRhaW5pbmcg YWxsIHRoZSBxdWVyeSdzIHJvd3MuICBIZW5jZSwgaWYgeW91IHdhbnQgdG8gY2hlY2sgd2hl dGhlcgoJICogR1JPVVAgQlkgd2FzIHNwZWNpZmllZCwgdGVzdCBmb3Igbm9uZW1wdHkgcGFy c2UtPmdyb3VwQ2xhdXNlLCBub3QgZm9yCgkgKiBub25lbXB0eSBwcm9jZXNzZWRfZ3JvdXBD bGF1c2UuICBPcHRpbWl6ZXIgY2hvb3NlcyBzcGVjaWZpYyBvcmRlciBvZgoJICogZ3JvdXAt YnkgY2xhdXNlcyBkdXJpbmcgdGhlIHVwcGVyIHBhdGhzIGdlbmVyYXRpb24gcHJvY2Vzcywg YXR0ZW1wdGluZwoJICogdG8gdXNlIGRpZmZlcmVudCBzdHJhdGVnaWVzIHRvIG1pbmltaXpl IG51bWJlciBvZiBzb3J0cyBvciBlbmdhZ2UKCSAqIGluY3JlbWVudGFsIHNvcnQuICBTZWUg cHJlcHJvY2Vzc19ncm91cGNsYXVzZSgpIGFuZAoJICogZ2V0X3VzZWZ1bF9ncm91cF9rZXlz X29yZGVyaW5ncygpIGZvciBkZXRhaWxzLgoJICoKCSAqIEN1cnJlbnRseSwgd2hlbiBncm91 cGluZyBzZXRzIGFyZSBzcGVjaWZpZWQgd2UgZG8gbm90IGF0dGVtcHQgdG8KCSAqIG9wdGlt aXplIHRoZSBncm91cENsYXVzZSwgc28gdGhhdCBwcm9jZXNzZWRfZ3JvdXBDbGF1c2Ugd2ls bCBiZQoJICogaWRlbnRpY2FsIHRvIHBhcnNlLT5ncm91cENsYXVzZS4KCSAqLwoJTGlzdAkg ICAqcHJvY2Vzc2VkX2dyb3VwQ2xhdXNlOwoKCS8qCgkgKiBUaGUgZnVsbHktcHJvY2Vzc2Vk IGRpc3RpbmN0Q2xhdXNlIGlzIGtlcHQgaGVyZS4gIEl0IGRpZmZlcnMgZnJvbQoJICogcGFy c2UtPmRpc3RpbmN0Q2xhdXNlIGluIHRoYXQgd2UgcmVtb3ZlIGFueSBpdGVtcyB0aGF0IHdl IGNhbiBwcm92ZQoJICogcmVkdW5kYW50LCBzbyB0aGF0IG9ubHkgdGhlIGNvbHVtbnMgbmFt ZWQgaGVyZSBhY3R1YWxseSBuZWVkIHRvIGJlCgkgKiBjb21wYXJlZCB0byBkZXRlcm1pbmUg dW5pcXVlbmVzcy4gIE5vdGUgdGhhdCBpdCdzIHBvc3NpYmxlIGZvciAqYWxsKgoJICogdGhl IGl0ZW1zIHRvIGJlIHByb3ZlbiByZWR1bmRhbnQsIGltcGx5aW5nIHRoYXQgdGhlcmUgc2hv dWxkIGJlIG9ubHkKCSAqIG9uZSBvdXRwdXQgcm93LiAgSGVuY2UsIGlmIHlvdSB3YW50IHRv IGNoZWNrIHdoZXRoZXIgRElTVElOQ1Qgd2FzCgkgKiBzcGVjaWZpZWQsIHRlc3QgZm9yIG5v bmVtcHR5IHBhcnNlLT5kaXN0aW5jdENsYXVzZSwgbm90IGZvciBub25lbXB0eQoJICogcHJv Y2Vzc2VkX2Rpc3RpbmN0Q2xhdXNlLgoJICovCglMaXN0CSAgICpwcm9jZXNzZWRfZGlzdGlu Y3RDbGF1c2U7CgoJLyoKCSAqIFRoZSBmdWxseS1wcm9jZXNzZWQgdGFyZ2V0bGlzdCBpcyBr ZXB0IGhlcmUuICBJdCBkaWZmZXJzIGZyb20KCSAqIHBhcnNlLT50YXJnZXRMaXN0IGluIHRo YXQgKGZvciBJTlNFUlQpIGl0J3MgYmVlbiByZW9yZGVyZWQgdG8gbWF0Y2ggdGhlCgkgKiB0 YXJnZXQgdGFibGUsIGFuZCBkZWZhdWx0cyBoYXZlIGJlZW4gZmlsbGVkIGluLiAgQWxzbywg YWRkaXRpb25hbAoJICogcmVzanVuayB0YXJnZXRzIG1heSBiZSBwcmVzZW50LiAgcHJlcHJv Y2Vzc190YXJnZXRsaXN0KCkgZG9lcyBtb3N0IG9mCgkgKiB0aGF0IHdvcmssIGJ1dCBub3Rl IHRoYXQgbW9yZSByZXNqdW5rIHRhcmdldHMgY2FuIGdldCBhZGRlZCBkdXJpbmcKCSAqIGFw cGVuZHJlbCBleHBhbnNpb24uICAoSGVuY2UsIHVwcGVyX3RhcmdldHMgbXVzdG4ndCBnZXQg c2V0IHVwIHRpbGwKCSAqIGFmdGVyIHRoYXQuKQoJICovCglMaXN0CSAgICpwcm9jZXNzZWRf dGxpc3Q7CgoJLyoKCSAqIEZvciBVUERBVEUsIHRoaXMgbGlzdCBjb250YWlucyB0aGUgdGFy Z2V0IHRhYmxlJ3MgYXR0cmlidXRlIG51bWJlcnMgdG8KCSAqIHdoaWNoIHRoZSBmaXJzdCBO IGVudHJpZXMgb2YgcHJvY2Vzc2VkX3RsaXN0IGFyZSB0byBiZSBhc3NpZ25lZC4gIChBbnkK CSAqIGFkZGl0aW9uYWwgZW50cmllcyBpbiBwcm9jZXNzZWRfdGxpc3QgbXVzdCBiZSByZXNq dW5rLikgIERPIE5PVCB1c2UgdGhlCgkgKiByZXNub3MgaW4gcHJvY2Vzc2VkX3RsaXN0IHRv IGlkZW50aWZ5IHRoZSBVUERBVEUgdGFyZ2V0IGNvbHVtbnMuCgkgKi8KCUxpc3QJICAgKnVw ZGF0ZV9jb2xub3M7CgoJLyoKCSAqIEZpZWxkcyBmaWxsZWQgZHVyaW5nIGNyZWF0ZV9wbGFu KCkgZm9yIHVzZSBpbiBzZXRyZWZzLmMKCSAqLwoJLyogZm9yIEdyb3VwaW5nRnVuYyBmaXh1 cCAoY2FuJ3QgcHJpbnQ6IGFycmF5IGxlbmd0aCBub3Qga25vd24gaGVyZSkgKi8KCUF0dHJO dW1iZXIgKmdyb3VwaW5nX21hcCBwZ19ub2RlX2F0dHIocmVhZF93cml0ZV9pZ25vcmUpOwoJ LyogTGlzdCBvZiBNaW5NYXhBZ2dJbmZvcyAqLwoJTGlzdAkgICAqbWlubWF4X2FnZ3M7CgoJ LyogY29udGV4dCBob2xkaW5nIFBsYW5uZXJJbmZvICovCglNZW1vcnlDb250ZXh0IHBsYW5u ZXJfY3h0IHBnX25vZGVfYXR0cihyZWFkX3dyaXRlX2lnbm9yZSk7CgoJLyogIyBvZiBwYWdl cyBpbiBhbGwgbm9uLWR1bW15IHRhYmxlcyBvZiBxdWVyeSAqLwoJQ2FyZGluYWxpdHkgdG90 YWxfdGFibGVfcGFnZXM7CgoJLyogdHVwbGVfZnJhY3Rpb24gcGFzc2VkIHRvIHF1ZXJ5X3Bs YW5uZXIgKi8KCVNlbGVjdGl2aXR5IHR1cGxlX2ZyYWN0aW9uOwoJLyogbGltaXRfdHVwbGVz IHBhc3NlZCB0byBxdWVyeV9wbGFubmVyICovCglDYXJkaW5hbGl0eSBsaW1pdF90dXBsZXM7 CgoJLyoKCSAqIE1pbmltdW0gc2VjdXJpdHlfbGV2ZWwgZm9yIHF1YWxzLiBOb3RlOiBxdWFs X3NlY3VyaXR5X2xldmVsIGlzIHplcm8gaWYKCSAqIHRoZXJlIGFyZSBubyBzZWN1cml0eVF1 YWxzLgoJICovCglJbmRleAkJcXVhbF9zZWN1cml0eV9sZXZlbDsKCgkvKiB0cnVlIGlmIGFu eSBSVEVzIGFyZSBSVEVfSk9JTiBraW5kICovCglib29sCQloYXNKb2luUlRFczsKCS8qIHRy dWUgaWYgYW55IFJURXMgYXJlIG1hcmtlZCBMQVRFUkFMICovCglib29sCQloYXNMYXRlcmFs UlRFczsKCS8qIHRydWUgaWYgaGF2aW5nUXVhbCB3YXMgbm9uLW51bGwgKi8KCWJvb2wJCWhh c0hhdmluZ1F1YWw7CgkvKiB0cnVlIGlmIGFueSBSZXN0cmljdEluZm8gaGFzIHBzZXVkb2Nv bnN0YW50ID0gdHJ1ZSAqLwoJYm9vbAkJaGFzUHNldWRvQ29uc3RhbnRRdWFsczsKCS8qIHRy dWUgaWYgd2UndmUgbWFkZSBhbnkgb2YgdGhvc2UgKi8KCWJvb2wJCWhhc0FsdGVybmF0aXZl U3ViUGxhbnM7CgkvKiB0cnVlIG9uY2Ugd2UncmUgbm8gbG9uZ2VyIGFsbG93ZWQgdG8gYWRk IFBsYWNlSG9sZGVySW5mb3MgKi8KCWJvb2wJCXBsYWNlaG9sZGVyc0Zyb3plbjsKCS8qIHRy dWUgaWYgcGxhbm5pbmcgYSByZWN1cnNpdmUgV0lUSCBpdGVtICovCglib29sCQloYXNSZWN1 cnNpb247CgkvKiB0cnVlIGlmIGEgcGxhbm5lciBleHRlbnNpb24gbWF5IHJlcGxhbiB0aGlz IHN1YnF1ZXJ5ICovCglib29sCQlhc3N1bWVSZXBsYW5uaW5nOwoKCS8qCgkgKiBUaGUgcmFu Z2V0YWJsZSBpbmRleCBmb3IgdGhlIFJURV9HUk9VUCBSVEUsIG9yIDAgaWYgdGhlcmUgaXMg bm8KCSAqIFJURV9HUk9VUCBSVEUuCgkgKi8KCWludAkJCWdyb3VwX3J0aW5kZXg7CgoJLyoK CSAqIEluZm9ybWF0aW9uIGFib3V0IGFnZ3JlZ2F0ZXMuIEZpbGxlZCBieSBwcmVwcm9jZXNz X2FnZ3JlZnMoKS4KCSAqLwoJLyogQWdnSW5mbyBzdHJ1Y3RzICovCglMaXN0CSAgICphZ2dp bmZvczsKCS8qIEFnZ1RyYW5zSW5mbyBzdHJ1Y3RzICovCglMaXN0CSAgICphZ2d0cmFuc2lu Zm9zOwoJLyogbnVtYmVyIG9mIGFnZ3Mgd2l0aCBESVNUSU5DVC9PUkRFUiBCWS9XSVRISU4g R1JPVVAgKi8KCWludAkJCW51bU9yZGVyZWRBZ2dzOwoJLyogZG9lcyBhbnkgYWdnIG5vdCBz dXBwb3J0IHBhcnRpYWwgbW9kZT8gKi8KCWJvb2wJCWhhc05vblBhcnRpYWxBZ2dzOwoJLyog aXMgYW55IHBhcnRpYWwgYWdnIG5vbi1zZXJpYWxpemFibGU/ICovCglib29sCQloYXNOb25T ZXJpYWxBZ2dzOwoKCS8qCgkgKiBUaGVzZSBmaWVsZHMgYXJlIHVzZWQgb25seSB3aGVuIGhh c1JlY3Vyc2lvbiBpcyB0cnVlOgoJICovCgkvKiBQQVJBTV9FWEVDIElEIGZvciB0aGUgd29y ayB0YWJsZSAqLwoJaW50CQkJd3RfcGFyYW1faWQ7CgkvKiBhIHBhdGggZm9yIG5vbi1yZWN1 cnNpdmUgdGVybSAqLwoJc3RydWN0IFBhdGggKm5vbl9yZWN1cnNpdmVfcGF0aDsKCgkvKgoJ ICogVGhlc2UgZmllbGRzIGFyZSB3b3Jrc3BhY2UgZm9yIGNyZWF0ZXBsYW4uYwoJICovCgkv KiBvdXRlciByZWxzIGFib3ZlIGN1cnJlbnQgbm9kZSAqLwoJUmVsaWRzCQljdXJPdXRlclJl bHM7CgkvKiBub3QteWV0LWFzc2lnbmVkIE5lc3RMb29wUGFyYW1zICovCglMaXN0CSAgICpj dXJPdXRlclBhcmFtczsKCgkvKgoJICogVGhlc2UgZmllbGRzIGFyZSB3b3Jrc3BhY2UgZm9y IHNldHJlZnMuYy4gIEVhY2ggaXMgYW4gYXJyYXkKCSAqIGNvcnJlc3BvbmRpbmcgdG8gZ2xv Yi0+c3VicGxhbnMuICAoV2UgY291bGQgcHJvYmFibHkgdGVhY2gKCSAqIGdlbl9ub2RlX3N1 cHBvcnQucGwgaG93IHRvIGRldGVybWluZSB0aGUgYXJyYXkgbGVuZ3RoLCBidXQgaXQgZG9l c24ndAoJICogc2VlbSB3b3J0aCB0aGUgdHJvdWJsZSwgc28ganVzdCBtYXJrIHRoZW0gcmVh ZF93cml0ZV9pZ25vcmUuKQoJICovCglib29sCSAgICppc0FsdFN1YnBsYW4gcGdfbm9kZV9h dHRyKHJlYWRfd3JpdGVfaWdub3JlKTsKCWJvb2wJICAgKmlzVXNlZFN1YnBsYW4gcGdfbm9k ZV9hdHRyKHJlYWRfd3JpdGVfaWdub3JlKTsKCgkvKiBQYXJ0aXRpb25QcnVuZUluZm9zIGFk ZGVkIGluIHRoaXMgcXVlcnkncyBwbGFuLiAqLwoJTGlzdAkgICAqcGFydFBydW5lSW5mb3M7 CgoJLyogZXh0ZW5zaW9uIHN0YXRlICovCgl2b2lkCSAgKipleHRlbnNpb25fc3RhdGUgcGdf bm9kZV9hdHRyKHJlYWRfd3JpdGVfaWdub3JlKTsKCWludAkJCWV4dGVuc2lvbl9zdGF0ZV9h bGxvY2F0ZWQ7Cn07CgoKLyoKICogSW4gcGxhY2VzIHdoZXJlIGl0J3Mga25vd24gdGhhdCBz aW1wbGVfcnRlX2FycmF5W10gbXVzdCBoYXZlIGJlZW4gcHJlcGFyZWQKICogYWxyZWFkeSwg d2UganVzdCBpbmRleCBpbnRvIGl0IHRvIGZldGNoIFJURXMuICBJbiBjb2RlIHRoYXQgbWln aHQgYmUKICogZXhlY3V0ZWQgYmVmb3JlIG9yIGFmdGVyIGVudGVyaW5nIHF1ZXJ5X3BsYW5u ZXIoKSwgdXNlIHRoaXMgbWFjcm8uCiAqLwojZGVmaW5lIHBsYW5uZXJfcnRfZmV0Y2gocnRp LCByb290KSBcCgkoKHJvb3QpLT5zaW1wbGVfcnRlX2FycmF5ID8gKHJvb3QpLT5zaW1wbGVf cnRlX2FycmF5W3J0aV0gOiBcCgkgcnRfZmV0Y2gocnRpLCAocm9vdCktPnBhcnNlLT5ydGFi bGUpKQoKLyoKICogSWYgbXVsdGlwbGUgcmVsYXRpb25zIGFyZSBwYXJ0aXRpb25lZCB0aGUg c2FtZSB3YXksIGFsbCBzdWNoIHBhcnRpdGlvbnMKICogd2lsbCBoYXZlIGEgcG9pbnRlciB0 byB0aGUgc2FtZSBQYXJ0aXRpb25TY2hlbWUuICBBIGxpc3Qgb2YgUGFydGl0aW9uU2NoZW1l CiAqIG9iamVjdHMgaXMgYXR0YWNoZWQgdG8gdGhlIFBsYW5uZXJJbmZvLiAgQnkgZGVzaWdu LCB0aGUgcGFydGl0aW9uIHNjaGVtZQogKiBpbmNvcnBvcmF0ZXMgb25seSB0aGUgZ2VuZXJh bCBwcm9wZXJ0aWVzIG9mIHRoZSBwYXJ0aXRpb24gbWV0aG9kIChMSVNUIHZzLgogKiBSQU5H RSwgbnVtYmVyIG9mIHBhcnRpdGlvbmluZyBjb2x1bW5zIGFuZCB0aGUgdHlwZSBpbmZvcm1h dGlvbiBmb3IgZWFjaCkKICogYW5kIG5vdCB0aGUgc3BlY2lmaWMgYm91bmRzLgogKgogKiBX ZSBzdG9yZSB0aGUgb3BjbGFzcy1kZWNsYXJlZCBpbnB1dCBkYXRhIHR5cGVzIGluc3RlYWQg b2YgdGhlIHBhcnRpdGlvbiBrZXkKICogZGF0YXR5cGVzIHNpbmNlIHRoZSBmb3JtZXIgcmF0 aGVyIHRoYW4gdGhlIGxhdHRlciBhcmUgdXNlZCB0byBjb21wYXJlCiAqIHBhcnRpdGlvbiBi b3VuZHMuIFNpbmNlIHBhcnRpdGlvbiBrZXkgZGF0YSB0eXBlcyBhbmQgdGhlIG9wY2xhc3Mg ZGVjbGFyZWQKICogaW5wdXQgZGF0YSB0eXBlcyBhcmUgZXhwZWN0ZWQgdG8gYmUgYmluYXJ5 IGNvbXBhdGlibGUgKHBlciBSZXNvbHZlT3BDbGFzcyksCiAqIGJvdGggb2YgdGhvc2Ugc2hv dWxkIGhhdmUgc2FtZSBieXZhbCBhbmQgbGVuZ3RoIHByb3BlcnRpZXMuCiAqLwp0eXBlZGVm IHN0cnVjdCBQYXJ0aXRpb25TY2hlbWVEYXRhCnsKCWNoYXIJCXN0cmF0ZWd5OwkJLyogcGFy dGl0aW9uIHN0cmF0ZWd5ICovCglpbnQxNgkJcGFydG5hdHRzOwkJLyogbnVtYmVyIG9mIHBh cnRpdGlvbiBhdHRyaWJ1dGVzICovCglPaWQJCSAgICpwYXJ0b3BmYW1pbHk7CS8qIE9JRHMg b2Ygb3BlcmF0b3IgZmFtaWxpZXMgKi8KCU9pZAkJICAgKnBhcnRvcGNpbnR5cGU7CS8qIE9J RHMgb2Ygb3BjbGFzcyBkZWNsYXJlZCBpbnB1dCBkYXRhIHR5cGVzICovCglPaWQJCSAgICpw YXJ0Y29sbGF0aW9uOwkvKiBPSURzIG9mIHBhcnRpdGlvbmluZyBjb2xsYXRpb25zICovCgoJ LyogQ2FjaGVkIGluZm9ybWF0aW9uIGFib3V0IHBhcnRpdGlvbiBrZXkgZGF0YSB0eXBlcy4g Ki8KCWludDE2CSAgICpwYXJ0dHlwbGVuOwoJYm9vbAkgICAqcGFydHR5cGJ5dmFsOwoKCS8q IENhY2hlZCBpbmZvcm1hdGlvbiBhYm91dCBwYXJ0aXRpb24gY29tcGFyaXNvbiBmdW5jdGlv bnMuICovCglzdHJ1Y3QgRm1nckluZm8gKnBhcnRzdXBmdW5jOwp9IFBhcnRpdGlvblNjaGVt ZURhdGE7Cgp0eXBlZGVmIHN0cnVjdCBQYXJ0aXRpb25TY2hlbWVEYXRhICpQYXJ0aXRpb25T Y2hlbWU7CgovKi0tLS0tLS0tLS0KICogUmVsT3B0SW5mbwogKgkJUGVyLXJlbGF0aW9uIGlu Zm9ybWF0aW9uIGZvciBwbGFubmluZy9vcHRpbWl6YXRpb24KICoKICogRm9yIHBsYW5uaW5n IHB1cnBvc2VzLCBhICJiYXNlIHJlbCIgaXMgZWl0aGVyIGEgcGxhaW4gcmVsYXRpb24gKGEg dGFibGUpCiAqIG9yIHRoZSBvdXRwdXQgb2YgYSBzdWItU0VMRUNUIG9yIGZ1bmN0aW9uIHRo YXQgYXBwZWFycyBpbiB0aGUgcmFuZ2UgdGFibGUuCiAqIEluIGVpdGhlciBjYXNlIGl0IGlz IHVuaXF1ZWx5IGlkZW50aWZpZWQgYnkgYW4gUlQgaW5kZXguICBBICJqb2lucmVsIgogKiBp cyB0aGUgam9pbmluZyBvZiB0d28gb3IgbW9yZSBiYXNlIHJlbHMuICBBIGpvaW5yZWwgaXMg aWRlbnRpZmllZCBieQogKiB0aGUgc2V0IG9mIFJUIGluZGV4ZXMgZm9yIGl0cyBjb21wb25l bnQgYmFzZXJlbHMsIGFsb25nIHdpdGggUlQgaW5kZXhlcwogKiBmb3IgYW55IG91dGVyIGpv aW5zIGl0IGhhcyBjb21wdXRlZC4gIFdlIGNyZWF0ZSBSZWxPcHRJbmZvIG5vZGVzIGZvciBl YWNoCiAqIGJhc2VyZWwgYW5kIGpvaW5yZWwsIGFuZCBzdG9yZSB0aGVtIGluIHRoZSBQbGFu bmVySW5mbydzIHNpbXBsZV9yZWxfYXJyYXkKICogYW5kIGpvaW5fcmVsX2xpc3QgcmVzcGVj dGl2ZWx5LgogKgogKiBOb3RlIHRoYXQgdGhlcmUgaXMgb25seSBvbmUgam9pbnJlbCBmb3Ig YW55IGdpdmVuIHNldCBvZiBjb21wb25lbnQKICogYmFzZXJlbHMsIG5vIG1hdHRlciB3aGF0 IG9yZGVyIHdlIGFzc2VtYmxlIHRoZW0gaW47IHNvIGFuIHVub3JkZXJlZAogKiBzZXQgaXMg dGhlIHJpZ2h0IGRhdGF0eXBlIHRvIGlkZW50aWZ5IGl0IHdpdGguCiAqCiAqIFdlIGFsc28g aGF2ZSAib3RoZXIgcmVscyIsIHdoaWNoIGFyZSBsaWtlIGJhc2UgcmVscyBpbiB0aGF0IHRo ZXkgcmVmZXIgdG8KICogc2luZ2xlIFJUIGluZGV4ZXM7IGJ1dCB0aGV5IGFyZSBub3QgcGFy dCBvZiB0aGUgam9pbiB0cmVlLCBhbmQgYXJlIGdpdmVuCiAqIGEgZGlmZmVyZW50IFJlbE9w dEtpbmQgdG8gaWRlbnRpZnkgdGhlbS4KICogQ3VycmVudGx5IHRoZSBvbmx5IGtpbmQgb2Yg b3RoZXJyZWxzIGFyZSB0aG9zZSBtYWRlIGZvciBtZW1iZXIgcmVsYXRpb25zCiAqIG9mIGFu ICJhcHBlbmQgcmVsYXRpb24iLCB0aGF0IGlzIGFuIGluaGVyaXRhbmNlIHNldCBvciBVTklP TiBBTEwgc3VicXVlcnkuCiAqIEFuIGFwcGVuZCByZWxhdGlvbiBoYXMgYSBwYXJlbnQgUlRF IHRoYXQgaXMgYSBiYXNlIHJlbCwgd2hpY2ggcmVwcmVzZW50cwogKiB0aGUgZW50aXJlIGFw cGVuZCByZWxhdGlvbi4gIFRoZSBtZW1iZXIgUlRFcyBhcmUgb3RoZXJyZWxzLiAgVGhlIHBh cmVudAogKiBpcyBwcmVzZW50IGluIHRoZSBxdWVyeSBqb2luIHRyZWUgYnV0IHRoZSBtZW1i ZXJzIGFyZSBub3QuICBUaGUgbWVtYmVyCiAqIFJURXMgYW5kIG90aGVycmVscyBhcmUgdXNl ZCB0byBwbGFuIHRoZSBzY2FucyBvZiB0aGUgaW5kaXZpZHVhbCB0YWJsZXMgb3IKICogc3Vi cXVlcmllcyBvZiB0aGUgYXBwZW5kIHNldDsgdGhlbiB0aGUgcGFyZW50IGJhc2VyZWwgaXMg Z2l2ZW4gQXBwZW5kCiAqIGFuZC9vciBNZXJnZUFwcGVuZCBwYXRocyBjb21wcmlzaW5nIHRo ZSBiZXN0IHBhdGhzIGZvciB0aGUgaW5kaXZpZHVhbAogKiBtZW1iZXIgcmVscy4gIChTZWUg Y29tbWVudHMgZm9yIEFwcGVuZFJlbEluZm8gZm9yIG1vcmUgaW5mb3JtYXRpb24uKQogKgog KiBBdCBvbmUgdGltZSB3ZSBhbHNvIG1hZGUgb3RoZXJyZWxzIHRvIHJlcHJlc2VudCBqb2lu IFJURXMsIGZvciB1c2UgaW4KICogaGFuZGxpbmcgam9pbiBhbGlhcyBWYXJzLiAgQ3VycmVu dGx5IHRoaXMgaXMgbm90IG5lZWRlZCBiZWNhdXNlIGFsbCBqb2luCiAqIGFsaWFzIFZhcnMg YXJlIGV4cGFuZGVkIHRvIG5vbi1hbGlhc2VkIGZvcm0gZHVyaW5nIHByZXByb2Nlc3NfZXhw cmVzc2lvbi4KICoKICogV2UgYWxzbyBoYXZlIHJlbGF0aW9ucyByZXByZXNlbnRpbmcgam9p bnMgYmV0d2VlbiBjaGlsZCByZWxhdGlvbnMgb2YKICogZGlmZmVyZW50IHBhcnRpdGlvbmVk IHRhYmxlcy4gVGhlc2UgcmVsYXRpb25zIGFyZSBub3QgYWRkZWQgdG8KICogam9pbl9yZWxf bGV2ZWwgbGlzdHMgYXMgdGhleSBhcmUgbm90IGpvaW5lZCBkaXJlY3RseSBieSB0aGUgZHlu YW1pYwogKiBwcm9ncmFtbWluZyBhbGdvcml0aG0uCiAqCiAqIFRoZXJlIGlzIGFsc28gYSBS ZWxPcHRLaW5kIGZvciAidXBwZXIiIHJlbGF0aW9ucywgd2hpY2ggYXJlIFJlbE9wdEluZm9z CiAqIHRoYXQgZGVzY3JpYmUgcG9zdC1zY2FuL2pvaW4gcHJvY2Vzc2luZyBzdGVwcywgc3Vj aCBhcyBhZ2dyZWdhdGlvbi4KICogTWFueSBvZiB0aGUgZmllbGRzIGluIHRoZXNlIFJlbE9w dEluZm9zIGFyZSBtZWFuaW5nbGVzcywgYnV0IHRoZWlyIFBhdGgKICogZmllbGRzIGFsd2F5 cyBob2xkIFBhdGhzIHNob3dpbmcgd2F5cyB0byBkbyB0aGF0IHByb2Nlc3Npbmcgc3RlcC4K ICoKICogUGFydHMgb2YgdGhpcyBkYXRhIHN0cnVjdHVyZSBhcmUgc3BlY2lmaWMgdG8gdmFy aW91cyBzY2FuIGFuZCBqb2luCiAqIG1lY2hhbmlzbXMuICBJdCBkaWRuJ3Qgc2VlbSB3b3J0 aCBjcmVhdGluZyBuZXcgbm9kZSB0eXBlcyBmb3IgdGhlbS4KICoKICoJCXJlbGlkcyAtIFNl dCBvZiByZWxhdGlvbiBpZGVudGlmaWVycyAoUlQgaW5kZXhlcykuICBUaGlzIGlzIGEgYmFz ZQogKgkJCQkgcmVsYXRpb24gaWYgdGhlcmUgaXMganVzdCBvbmUsIGEgam9pbiByZWxhdGlv biBpZiBtb3JlOwogKgkJCQkgaW4gdGhlIGpvaW4gY2FzZSwgUlQgaW5kZXhlcyBvZiBhbnkg b3V0ZXIgam9pbnMgZm9ybWVkCiAqCQkJCSBhdCBvciBiZWxvdyB0aGlzIGpvaW4gYXJlIGlu Y2x1ZGVkIGFsb25nIHdpdGggYmFzZXJlbHMKICoJCXJvd3MgLSBlc3RpbWF0ZWQgbnVtYmVy IG9mIHR1cGxlcyBpbiB0aGUgcmVsYXRpb24gYWZ0ZXIgcmVzdHJpY3Rpb24KICoJCQkgICBj bGF1c2VzIGhhdmUgYmVlbiBhcHBsaWVkIChpZSwgb3V0cHV0IHJvd3Mgb2YgYSBwbGFuIGZv ciBpdCkKICoJCWNvbnNpZGVyX3N0YXJ0dXAgLSB0cnVlIGlmIHRoZXJlIGlzIGFueSB2YWx1 ZSBpbiBrZWVwaW5nIHBsYWluIHBhdGhzIGZvcgogKgkJCQkJCSAgIHRoaXMgcmVsIG9uIHRo ZSBiYXNpcyBvZiBoYXZpbmcgY2hlYXAgc3RhcnR1cCBjb3N0CiAqCQljb25zaWRlcl9wYXJh bV9zdGFydHVwIC0gdGhlIHNhbWUgZm9yIHBhcmFtZXRlcml6ZWQgcGF0aHMKICoJCXJlbHRh cmdldCAtIERlZmF1bHQgUGF0aCBvdXRwdXQgdGxpc3QgZm9yIHRoaXMgcmVsOyBub3JtYWxs eSBjb250YWlucwogKgkJCQkJVmFyIGFuZCBQbGFjZUhvbGRlclZhciBub2RlcyBmb3IgdGhl IHZhbHVlcyB3ZSBuZWVkIHRvCiAqCQkJCQlvdXRwdXQgZnJvbSB0aGlzIHJlbGF0aW9uLgog KgkJCQkJTGlzdCBpcyBpbiBubyBwYXJ0aWN1bGFyIG9yZGVyLCBidXQgYWxsIHJlbHMgb2Yg YW4KICoJCQkJCWFwcGVuZHJlbCBzZXQgbXVzdCB1c2UgY29ycmVzcG9uZGluZyBvcmRlcnMu CiAqCQkJCQlOT1RFOiBpbiBhbiBhcHBlbmRyZWwgY2hpbGQgcmVsYXRpb24sIG1heSBjb250 YWluCiAqCQkJCQlhcmJpdHJhcnkgZXhwcmVzc2lvbnMgcHVsbGVkIHVwIGZyb20gYSBzdWJx dWVyeSEKICoJCXBhdGhsaXN0IC0gTGlzdCBvZiBQYXRoIG5vZGVzLCBvbmUgZm9yIGVhY2gg cG90ZW50aWFsbHkgdXNlZnVsCiAqCQkJCSAgIG1ldGhvZCBvZiBnZW5lcmF0aW5nIHRoZSBy ZWxhdGlvbgogKgkJcHBpbGlzdCAtIFBhcmFtUGF0aEluZm8gbm9kZXMgZm9yIHBhcmFtZXRl cml6ZWQgUGF0aHMsIGlmIGFueQogKgkJY2hlYXBlc3Rfc3RhcnR1cF9wYXRoIC0gdGhlIHBh dGhsaXN0IG1lbWJlciB3aXRoIGxvd2VzdCBzdGFydHVwIGNvc3QKICoJCQkocmVnYXJkbGVz cyBvZiBvcmRlcmluZykgYW1vbmcgdGhlIHVucGFyYW1ldGVyaXplZCBwYXRoczsKICoJCQlv ciBOVUxMIGlmIHRoZXJlIGlzIG5vIHVucGFyYW1ldGVyaXplZCBwYXRoCiAqCQljaGVhcGVz dF90b3RhbF9wYXRoIC0gdGhlIHBhdGhsaXN0IG1lbWJlciB3aXRoIGxvd2VzdCB0b3RhbCBj b3N0CiAqCQkJKHJlZ2FyZGxlc3Mgb2Ygb3JkZXJpbmcpIGFtb25nIHRoZSB1bnBhcmFtZXRl cml6ZWQgcGF0aHM7CiAqCQkJb3IgaWYgdGhlcmUgaXMgbm8gdW5wYXJhbWV0ZXJpemVkIHBh dGgsIHRoZSBwYXRoIHdpdGggbG93ZXN0CiAqCQkJdG90YWwgY29zdCBhbW9uZyB0aGUgcGF0 aHMgd2l0aCBtaW5pbXVtIHBhcmFtZXRlcml6YXRpb24KICoJCWNoZWFwZXN0X3BhcmFtZXRl cml6ZWRfcGF0aHMgLSBiZXN0IHBhdGhzIGZvciB0aGVpciBwYXJhbWV0ZXJpemF0aW9uczsK ICoJCQlhbHdheXMgaW5jbHVkZXMgY2hlYXBlc3RfdG90YWxfcGF0aCwgZXZlbiBpZiB0aGF0 J3MgdW5wYXJhbWV0ZXJpemVkCiAqCQlkaXJlY3RfbGF0ZXJhbF9yZWxpZHMgLSByZWxzIHRo aXMgcmVsIGhhcyBkaXJlY3QgTEFURVJBTCByZWZlcmVuY2VzIHRvCiAqCQlsYXRlcmFsX3Jl bGlkcyAtIHJlcXVpcmVkIG91dGVyIHJlbHMgZm9yIExBVEVSQUwsIGFzIGEgUmVsaWRzIHNl dAogKgkJCShpbmNsdWRlcyBib3RoIGRpcmVjdCBhbmQgaW5kaXJlY3QgbGF0ZXJhbCByZWZl cmVuY2VzKQogKgogKiBJZiB0aGUgcmVsYXRpb24gaXMgYSBiYXNlIHJlbGF0aW9uIGl0IHdp bGwgaGF2ZSB0aGVzZSBmaWVsZHMgc2V0OgogKgogKgkJcmVsaWQgLSBSVEUgaW5kZXggKHRo aXMgaXMgcmVkdW5kYW50IHdpdGggdGhlIHJlbGlkcyBmaWVsZCwgYnV0CiAqCQkJCWlzIHBy b3ZpZGVkIGZvciBjb252ZW5pZW5jZSBvZiBhY2Nlc3MpCiAqCQlydGVraW5kIC0gY29weSBv ZiBSVEUncyBydGVraW5kIGZpZWxkCiAqCQltaW5fYXR0ciwgbWF4X2F0dHIgLSByYW5nZSBv ZiB2YWxpZCBBdHRyTnVtYmVycyBmb3IgcmVsCiAqCQlhdHRyX25lZWRlZCAtIGFycmF5IG9m IGJpdG1hcHNldHMgaW5kaWNhdGluZyB0aGUgaGlnaGVzdCBqb2lucmVsCiAqCQkJCWluIHdo aWNoIGVhY2ggYXR0cmlidXRlIGlzIG5lZWRlZDsgaWYgYml0IDAgaXMgc2V0IHRoZW4KICoJ CQkJdGhlIGF0dHJpYnV0ZSBpcyBuZWVkZWQgYXMgcGFydCBvZiBmaW5hbCB0YXJnZXRsaXN0 CiAqCQlhdHRyX3dpZHRocyAtIGNhY2hlIHNwYWNlIGZvciBwZXItYXR0cmlidXRlIHdpZHRo IGVzdGltYXRlczsKICoJCQkJCSAgemVybyBtZWFucyBub3QgY29tcHV0ZWQgeWV0CiAqCQlu b3RudWxsYXR0bnVtcyAtIHplcm8tYmFzZWQgc2V0IGNvbnRhaW5pbmcgYXR0bnVtcyBvZiBO T1QgTlVMTAogKgkJCQkJCSBjb2x1bW5zIChub3QgcG9wdWxhdGVkIGZvciByZWxzIGNvcnJl c3BvbmRpbmcgdG8KICoJCQkJCQkgbm9uLXBhcnRpdGlvbmVkIGluaD09dHJ1ZSBSVEVzKQog KgkJbnVsbGluZ19yZWxpZHMgLSByZWxpZHMgb2Ygb3V0ZXIgam9pbnMgdGhhdCBjYW4gbnVs bCB0aGlzIHJlbAogKgkJbGF0ZXJhbF92YXJzIC0gbGF0ZXJhbCBjcm9zcy1yZWZlcmVuY2Vz IG9mIHJlbCwgaWYgYW55IChsaXN0IG9mCiAqCQkJCQkgICBWYXJzIGFuZCBQbGFjZUhvbGRl clZhcnMpCiAqCQlsYXRlcmFsX3JlZmVyZW5jZXJzIC0gcmVsaWRzIG9mIHJlbHMgdGhhdCBy ZWZlcmVuY2UgdGhpcyBvbmUgbGF0ZXJhbGx5CiAqCQkJCShpbmNsdWRlcyBib3RoIGRpcmVj dCBhbmQgaW5kaXJlY3QgbGF0ZXJhbCByZWZlcmVuY2VzKQogKgkJaW5kZXhsaXN0IC0gbGlz dCBvZiBJbmRleE9wdEluZm8gbm9kZXMgZm9yIHJlbGF0aW9uJ3MgaW5kZXhlcwogKgkJCQkJ KGFsd2F5cyBOSUwgaWYgaXQncyBub3QgYSB0YWJsZSBvciBwYXJ0aXRpb25lZCB0YWJsZSkK ICoJCXBhZ2VzIC0gbnVtYmVyIG9mIGRpc2sgcGFnZXMgaW4gcmVsYXRpb24gKHplcm8gaWYg bm90IGEgdGFibGUpCiAqCQl0dXBsZXMgLSBudW1iZXIgb2YgdHVwbGVzIGluIHJlbGF0aW9u IChub3QgY29uc2lkZXJpbmcgcmVzdHJpY3Rpb25zKQogKgkJYWxsdmlzZnJhYyAtIGZyYWN0 aW9uIG9mIGRpc2sgcGFnZXMgdGhhdCBhcmUgbWFya2VkIGFsbC12aXNpYmxlCiAqCQllY2xh c3NfaW5kZXhlcyAtIEVxdWl2YWxlbmNlQ2xhc3NlcyB0aGF0IG1lbnRpb24gdGhpcyByZWwg KGZpbGxlZAogKgkJCQkJCSBvbmx5IGFmdGVyIEVDIG1lcmdpbmcgaXMgY29tcGxldGUpCiAq CQlzdWJyb290IC0gUGxhbm5lckluZm8gZm9yIHN1YnF1ZXJ5IChOVUxMIGlmIGl0J3Mgbm90 IGEgc3VicXVlcnkpCiAqCQlzdWJwbGFuX3BhcmFtcyAtIGxpc3Qgb2YgUGxhbm5lclBhcmFt SXRlbXMgdG8gYmUgcGFzc2VkIHRvIHN1YnF1ZXJ5CiAqCiAqCQlOb3RlOiBmb3IgYSBzdWJx dWVyeSwgdHVwbGVzIGFuZCBzdWJyb290IGFyZSBub3Qgc2V0IGltbWVkaWF0ZWx5CiAqCQl1 cG9uIGNyZWF0aW9uIG9mIHRoZSBSZWxPcHRJbmZvIG9iamVjdDsgdGhleSBhcmUgZmlsbGVk IGluIHdoZW4KICoJCXNldF9zdWJxdWVyeV9wYXRobGlzdCBwcm9jZXNzZXMgdGhlIG9iamVj dC4KICoKICoJCUZvciBvdGhlcnJlbHMgdGhhdCBhcmUgYXBwZW5kcmVsIG1lbWJlcnMsIHRo ZXNlIGZpZWxkcyBhcmUgZmlsbGVkCiAqCQlpbiBqdXN0IGFzIGZvciBhIGJhc2VyZWwsIGV4 Y2VwdCB3ZSBkb24ndCBib3RoZXIgd2l0aCBsYXRlcmFsX3ZhcnMuCiAqCiAqIElmIHRoZSBy ZWxhdGlvbiBpcyBlaXRoZXIgYSBmb3JlaWduIHRhYmxlIG9yIGEgam9pbiBvZiBmb3JlaWdu IHRhYmxlcyB0aGF0CiAqIGFsbCBiZWxvbmcgdG8gdGhlIHNhbWUgZm9yZWlnbiBzZXJ2ZXIg YW5kIGFyZSBhc3NpZ25lZCB0byB0aGUgc2FtZSB1c2VyIHRvCiAqIGNoZWNrIGFjY2VzcyBw ZXJtaXNzaW9ucyBhcyAoY2YgY2hlY2tBc1VzZXIpLCB0aGVzZSBmaWVsZHMgd2lsbCBiZSBz ZXQ6CiAqCiAqCQlzZXJ2ZXJpZCAtIE9JRCBvZiBmb3JlaWduIHNlcnZlciwgaWYgZm9yZWln biB0YWJsZSAoZWxzZSBJbnZhbGlkT2lkKQogKgkJdXNlcmlkIC0gT0lEIG9mIHVzZXIgdG8g Y2hlY2sgYWNjZXNzIGFzIChJbnZhbGlkT2lkIG1lYW5zIGN1cnJlbnQgdXNlcikKICoJCXVz ZXJpZGlzY3VycmVudCAtIHdlJ3ZlIGFzc3VtZWQgdGhhdCB1c2VyaWQgZXF1YWxzIGN1cnJl bnQgdXNlcgogKgkJZmR3cm91dGluZSAtIGZ1bmN0aW9uIGhvb2tzIGZvciBGRFcsIGlmIGZv cmVpZ24gdGFibGUgKGVsc2UgTlVMTCkKICoJCWZkd19wcml2YXRlIC0gcHJpdmF0ZSBzdGF0 ZSBmb3IgRkRXLCBpZiBmb3JlaWduIHRhYmxlIChlbHNlIE5VTEwpCiAqCiAqIFR3byBmaWVs ZHMgYXJlIHVzZWQgdG8gY2FjaGUga25vd2xlZGdlIGFjcXVpcmVkIGR1cmluZyB0aGUgam9p biBzZWFyY2gKICogYWJvdXQgd2hldGhlciB0aGlzIHJlbCBpcyBwcm92YWJseSB1bmlxdWUg d2hlbiBiZWluZyBqb2luZWQgdG8gZ2l2ZW4gb3RoZXIKICogcmVsYXRpb24ocyksIGllLCBp dCBjYW4gaGF2ZSBhdCBtb3N0IG9uZSByb3cgbWF0Y2hpbmcgYW55IGdpdmVuIHJvdyBmcm9t CiAqIHRoYXQgam9pbiByZWxhdGlvbi4gIEN1cnJlbnRseSB3ZSBvbmx5IGF0dGVtcHQgc3Vj aCBwcm9vZnMsIGFuZCB0aHVzIG9ubHkKICogcG9wdWxhdGUgdGhlc2UgZmllbGRzLCBmb3Ig YmFzZSByZWxzOyBidXQgc29tZWRheSB0aGV5IG1pZ2h0IGJlIHVzZWQgZm9yCiAqIGpvaW4g cmVscyB0b286CiAqCiAqCQl1bmlxdWVfZm9yX3JlbHMgLSBsaXN0IG9mIFVuaXF1ZVJlbElu Zm8sIGVhY2ggb25lIGJlaW5nIGEgc2V0IG9mIG90aGVyCiAqCQkJCQlyZWxzIGZvciB3aGlj aCB0aGlzIG9uZSBoYXMgYmVlbiBwcm92ZW4gdW5pcXVlCiAqCQlub25fdW5pcXVlX2Zvcl9y ZWxzIC0gbGlzdCBvZiBSZWxpZCBzZXRzLCBlYWNoIG9uZSBiZWluZyBhIHNldCBvZgogKgkJ CQkJb3RoZXIgcmVscyBmb3Igd2hpY2ggd2UgaGF2ZSB0cmllZCBhbmQgZmFpbGVkIHRvIHBy b3ZlCiAqCQkJCQl0aGlzIG9uZSB1bmlxdWUKICoKICogVGhyZWUgZmllbGRzIGFyZSB1c2Vk IHRvIGNhY2hlIGluZm9ybWF0aW9uIGFib3V0IHVuaXF1ZS1pZmljYXRpb24gb2YgdGhpcwog KiByZWxhdGlvbi4gIFRoaXMgaXMgdXNlZCB0byBzdXBwb3J0IHNlbWlqb2lucyB3aGVyZSB0 aGUgcmVsYXRpb24gYXBwZWFycyBvbgogKiB0aGUgUkhTOiB0aGUgcmVsYXRpb24gaXMgZmly c3QgdW5pcXVlLWlmaWVkLCBhbmQgdGhlbiBhIHJlZ3VsYXIgam9pbiBpcwogKiBwZXJmb3Jt ZWQ6CiAqCiAqCQl1bmlxdWVfcmVsIC0gdGhlIHVuaXF1ZS1pZmllZCB2ZXJzaW9uIG9mIHRo ZSByZWxhdGlvbiwgY29udGFpbmluZyBwYXRocwogKgkJCQkJdGhhdCBwcm9kdWNlIHVuaXF1 ZSAobm8gZHVwbGljYXRlcykgb3V0cHV0IGZyb20gcmVsYXRpb247CiAqCQkJCQlOVUxMIGlm IG5vdCB5ZXQgcmVxdWVzdGVkCiAqCQl1bmlxdWVfcGF0aGtleXMgLSBwYXRoa2V5cyB0aGF0 IHJlcHJlc2VudCB0aGUgb3JkZXJpbmcgcmVxdWlyZW1lbnRzIGZvcgogKgkJCQkJdGhlIHJl bGF0aW9uJ3Mgb3V0cHV0IGluIHNvcnQtYmFzZWQgdW5pcXVlLWlmaWNhdGlvbgogKgkJCQkJ aW1wbGVtZW50YXRpb25zCiAqCQl1bmlxdWVfZ3JvdXBjbGF1c2UgLSBhIGxpc3Qgb2YgU29y dEdyb3VwQ2xhdXNlIG5vZGVzIHRoYXQgcmVwcmVzZW50IHRoZQogKgkJCQkJY29sdW1ucyB0 byBiZSBncm91cGVkIG9uIGluIGhhc2gtYmFzZWQgdW5pcXVlLWlmaWNhdGlvbgogKgkJCQkJ aW1wbGVtZW50YXRpb25zCiAqCiAqIFRoZSBwcmVzZW5jZSBvZiB0aGUgZm9sbG93aW5nIGZp ZWxkcyBkZXBlbmRzIG9uIHRoZSByZXN0cmljdGlvbnMKICogYW5kIGpvaW5zIHRoYXQgdGhl IHJlbGF0aW9uIHBhcnRpY2lwYXRlcyBpbjoKICoKICoJCWJhc2VyZXN0cmljdGluZm8gLSBM aXN0IG9mIFJlc3RyaWN0SW5mbyBub2RlcywgY29udGFpbmluZyBpbmZvIGFib3V0CiAqCQkJ CQllYWNoIG5vbi1qb2luIHF1YWxpZmljYXRpb24gY2xhdXNlIGluIHdoaWNoIHRoaXMgcmVs YXRpb24KICoJCQkJCXBhcnRpY2lwYXRlcyAob25seSB1c2VkIGZvciBiYXNlIHJlbHMpCiAq CQliYXNlcmVzdHJpY3Rjb3N0IC0gRXN0aW1hdGVkIGNvc3Qgb2YgZXZhbHVhdGluZyB0aGUg YmFzZXJlc3RyaWN0aW5mbwogKgkJCQkJY2xhdXNlcyBhdCBhIHNpbmdsZSB0dXBsZSAob25s eSB1c2VkIGZvciBiYXNlIHJlbHMpCiAqCQliYXNlcmVzdHJpY3RfbWluX3NlY3VyaXR5IC0g U21hbGxlc3Qgc2VjdXJpdHlfbGV2ZWwgZm91bmQgYW1vbmcKICoJCQkJCWNsYXVzZXMgaW4g YmFzZXJlc3RyaWN0aW5mbwogKgkJam9pbmluZm8gIC0gTGlzdCBvZiBSZXN0cmljdEluZm8g bm9kZXMsIGNvbnRhaW5pbmcgaW5mbyBhYm91dCBlYWNoCiAqCQkJCQlqb2luIGNsYXVzZSBp biB3aGljaCB0aGlzIHJlbGF0aW9uIHBhcnRpY2lwYXRlcyAoYnV0CiAqCQkJCQlub3RlIHRo aXMgZXhjbHVkZXMgY2xhdXNlcyB0aGF0IG1pZ2h0IGJlIGRlcml2YWJsZSBmcm9tCiAqCQkJ CQlFcXVpdmFsZW5jZUNsYXNzZXMpCiAqCQloYXNfZWNsYXNzX2pvaW5zIC0gZmxhZyB0aGF0 IEVxdWl2YWxlbmNlQ2xhc3Mgam9pbnMgYXJlIHBvc3NpYmxlCiAqCiAqIE5vdGU6IEtlZXBp bmcgYSByZXN0cmljdGluZm8gbGlzdCBpbiB0aGUgUmVsT3B0SW5mbyBpcyB1c2VmdWwgb25s eSBmb3IKICogYmFzZSByZWxzLCBiZWNhdXNlIGZvciBhIGpvaW4gcmVsIHRoZSBzZXQgb2Yg Y2xhdXNlcyB0aGF0IGFyZSB0cmVhdGVkIGFzCiAqIHJlc3RyaWN0IGNsYXVzZXMgdmFyaWVz IGRlcGVuZGluZyBvbiB3aGljaCBzdWItcmVsYXRpb25zIHdlIGNob29zZSB0byBqb2luLgog KiAoRm9yIGV4YW1wbGUsIGluIGEgMy1iYXNlLXJlbCBqb2luLCBhIGNsYXVzZSByZWxhdGlu ZyByZWxzIDEgYW5kIDIgbXVzdCBiZQogKiB0cmVhdGVkIGFzIGEgcmVzdHJpY3RjbGF1c2Ug aWYgd2Ugam9pbiB7MX0gYW5kIHsyIDN9IHRvIG1ha2UgezEgMiAzfTsgYnV0CiAqIGlmIHdl IGpvaW4gezEgMn0gYW5kIHszfSB0aGVuIHRoYXQgY2xhdXNlIHdpbGwgYmUgYSByZXN0cmlj dGNsYXVzZSBpbiB7MSAyfQogKiBhbmQgc2hvdWxkIG5vdCBiZSBwcm9jZXNzZWQgYWdhaW4g YXQgdGhlIGxldmVsIG9mIHsxIDIgM30uKQlUaGVyZWZvcmUsCiAqIHRoZSByZXN0cmljdGlu Zm8gbGlzdCBpbiB0aGUgam9pbiBjYXNlIGFwcGVhcnMgaW4gaW5kaXZpZHVhbCBKb2luUGF0 aHMKICogKGZpZWxkIGpvaW5yZXN0cmljdGluZm8pLCBub3QgaW4gdGhlIHBhcmVudCByZWxh dGlvbi4gIEJ1dCBpdCdzIE9LIGZvcgogKiB0aGUgUmVsT3B0SW5mbyB0byBzdG9yZSB0aGUg am9pbmluZm8gbGlzdCwgYmVjYXVzZSB0aGF0IGlzIHRoZSBzYW1lCiAqIGZvciBhIGdpdmVu IHJlbCBubyBtYXR0ZXIgaG93IHdlIGZvcm0gaXQuCiAqCiAqIFdlIHN0b3JlIGJhc2VyZXN0 cmljdGNvc3QgaW4gdGhlIFJlbE9wdEluZm8gKGZvciBiYXNlIHJlbGF0aW9ucykgYmVjYXVz ZQogKiB3ZSBrbm93IHdlIHdpbGwgbmVlZCBpdCBhdCBsZWFzdCBvbmNlICh0byBwcmljZSB0 aGUgc2VxdWVudGlhbCBzY2FuKQogKiBhbmQgbWF5IG5lZWQgaXQgbXVsdGlwbGUgdGltZXMg dG8gcHJpY2UgaW5kZXggc2NhbnMuCiAqCiAqIEEgam9pbiByZWxhdGlvbiBpcyBjb25zaWRl cmVkIHRvIGJlIHBhcnRpdGlvbmVkIGlmIGl0IGlzIGZvcm1lZCBmcm9tIGEKICogam9pbiBv ZiB0d28gcmVsYXRpb25zIHRoYXQgYXJlIHBhcnRpdGlvbmVkLCBoYXZlIG1hdGNoaW5nIHBh cnRpdGlvbmluZwogKiBzY2hlbWVzLCBhbmQgYXJlIGpvaW5lZCBvbiBhbiBlcXVpam9pbiBv ZiB0aGUgcGFydGl0aW9uaW5nIGNvbHVtbnMuCiAqIFVuZGVyIHRob3NlIGNvbmRpdGlvbnMg d2UgY2FuIGNvbnNpZGVyIHRoZSBqb2luIHJlbGF0aW9uIHRvIGJlIHBhcnRpdGlvbmVkCiAq IGJ5IGVpdGhlciByZWxhdGlvbidzIHBhcnRpdGlvbmluZyBrZXlzLCB0aG91Z2ggc29tZSBj YXJlIGlzIG5lZWRlZCBpZgogKiBlaXRoZXIgcmVsYXRpb24gY2FuIGJlIGZvcmNlZCB0byBu dWxsIGJ5IG91dGVyLWpvaW5pbmcuICBGb3IgZXhhbXBsZSwgYW4KICogb3V0ZXIgam9pbiBs aWtlIChBIExFRlQgSk9JTiBCIE9OIEEuYSA9IEIuYikgbWF5IHByb2R1Y2Ugcm93cyB3aXRo IEIuYgogKiBOVUxMLiAgVGhlc2Ugcm93cyBtYXkgbm90IGZpdCB0aGUgcGFydGl0aW9uaW5n IGNvbmRpdGlvbnMgaW1wb3NlZCBvbiBCLgogKiBIZW5jZSwgc3RyaWN0bHkgc3BlYWtpbmcs IHRoZSBqb2luIGlzIG5vdCBwYXJ0aXRpb25lZCBieSBCLmIgYW5kIHRodXMKICogcGFydGl0 aW9uIGtleXMgb2YgYW4gb3V0ZXIgam9pbiBzaG91bGQgaW5jbHVkZSBwYXJ0aXRpb24ga2V5 IGV4cHJlc3Npb25zCiAqIGZyb20gdGhlIG5vbi1udWxsYWJsZSBzaWRlIG9ubHkuICBIb3dl dmVyLCBpZiBhIHN1YnNlcXVlbnQgam9pbiB1c2VzCiAqIHN0cmljdCBjb21wYXJpc29uIG9w ZXJhdG9ycyAoYW5kIGFsbCBjb21tb25seS11c2VkIGVxdWlqb2luIG9wZXJhdG9ycyBhcmUK ICogc3RyaWN0KSwgdGhlIHByZXNlbmNlIG9mIG51bGxzIGRvZXNuJ3QgY2F1c2UgYSBwcm9i bGVtOiBzdWNoIHJvd3MgY291bGRuJ3QKICogbWF0Y2ggYW55dGhpbmcgb24gdGhlIG90aGVy IHNpZGUgYW5kIHRodXMgdGhleSBkb24ndCBjcmVhdGUgYSBuZWVkIHRvIGRvCiAqIGFueSBj cm9zcy1wYXJ0aXRpb24gc3ViLWpvaW5zLiAgSGVuY2Ugd2UgY2FuIHRyZWF0IHN1Y2ggdmFs dWVzIGFzIHN0aWxsCiAqIHBhcnRpdGlvbmluZyB0aGUgam9pbiBvdXRwdXQgZm9yIHRoZSBw dXJwb3NlIG9mIGFkZGl0aW9uYWwgcGFydGl0aW9ud2lzZQogKiBqb2luaW5nLCBzbyBsb25n IGFzIGEgc3RyaWN0IGpvaW4gb3BlcmF0b3IgaXMgdXNlZCBieSB0aGUgbmV4dCBqb2luLgog KgogKiBJZiB0aGUgcmVsYXRpb24gaXMgcGFydGl0aW9uZWQsIHRoZXNlIGZpZWxkcyB3aWxs IGJlIHNldDoKICoKICoJCXBhcnRfc2NoZW1lIC0gUGFydGl0aW9uaW5nIHNjaGVtZSBvZiB0 aGUgcmVsYXRpb24KICoJCW5wYXJ0cyAtIE51bWJlciBvZiBwYXJ0aXRpb25zCiAqCQlib3Vu ZGluZm8gLSBQYXJ0aXRpb24gYm91bmRzCiAqCQlwYXJ0Ym91bmRzX21lcmdlZCAtIHRydWUg aWYgcGFydGl0aW9uIGJvdW5kcyBhcmUgbWVyZ2VkIG9uZXMKICoJCXBhcnRpdGlvbl9xdWFs IC0gUGFydGl0aW9uIGNvbnN0cmFpbnQgaWYgbm90IHRoZSByb290CiAqCQlwYXJ0X3JlbHMg LSBSZWxPcHRJbmZvcyBmb3IgZWFjaCBwYXJ0aXRpb24KICoJCWFsbF9wYXJ0cmVscyAtIFJl bGlkcyBzZXQgb2YgYWxsIHBhcnRpdGlvbiByZWxpZHMKICoJCXBhcnRleHBycywgbnVsbGFi bGVfcGFydGV4cHJzIC0gUGFydGl0aW9uIGtleSBleHByZXNzaW9ucwogKgogKiBUaGUgcGFy dGV4cHJzIGFuZCBudWxsYWJsZV9wYXJ0ZXhwcnMgYXJyYXlzIGVhY2ggY29udGFpbgogKiBw YXJ0X3NjaGVtZS0+cGFydG5hdHRzIGVsZW1lbnRzLiAgRWFjaCBvZiB0aGUgZWxlbWVudHMg aXMgYSBsaXN0IG9mCiAqIHBhcnRpdGlvbiBrZXkgZXhwcmVzc2lvbnMuICBGb3IgcGFydGl0 aW9uZWQgYmFzZSByZWxhdGlvbnMsIHRoZXJlIGlzIG9uZQogKiBleHByZXNzaW9uIGluIGVh Y2ggcGFydGV4cHJzIGVsZW1lbnQsIGFuZCBudWxsYWJsZV9wYXJ0ZXhwcnMgaXMgZW1wdHku CiAqIEZvciBwYXJ0aXRpb25lZCBqb2luIHJlbGF0aW9ucywgZWFjaCBiYXNlIHJlbGF0aW9u IHdpdGhpbiB0aGUgam9pbgogKiBjb250cmlidXRlcyBvbmUgcGFydGl0aW9uIGtleSBleHBy ZXNzaW9uIHBlciBwYXJ0aXRpb25pbmcgY29sdW1uOwogKiB0aGF0IGV4cHJlc3Npb24gZ29l cyBpbiB0aGUgcGFydGV4cHJzW2ldIGxpc3QgaWYgdGhlIGJhc2UgcmVsYXRpb24KICogaXMg bm90IG51bGxhYmxlIGJ5IHRoaXMgam9pbiBvciBhbnkgbG93ZXIgb3V0ZXIgam9pbiwgb3Ig aW4gdGhlCiAqIG51bGxhYmxlX3BhcnRleHByc1tpXSBsaXN0IGlmIHRoZSBiYXNlIHJlbGF0 aW9uIGlzIG51bGxhYmxlLgogKiBGdXJ0aGVybW9yZSwgRlVMTCBKT0lOcyBhZGQgZXh0cmEg bnVsbGFibGVfcGFydGV4cHJzIGV4cHJlc3Npb25zCiAqIGNvcnJlc3BvbmRpbmcgdG8gQ09B TEVTQ0UgZXhwcmVzc2lvbnMgb2YgdGhlIGxlZnQgYW5kIHJpZ2h0IGpvaW4gY29sdW1ucywK ICogdG8gc2ltcGxpZnkgbWF0Y2hpbmcgam9pbiBjbGF1c2VzIHRvIHRob3NlIGxpc3RzLgog KgogKiBOb3QgYWxsIGZpZWxkcyBhcmUgcHJpbnRlZC4gIChJbiBzb21lIGNhc2VzLCB0aGVy ZSBpcyBubyBwcmludCBzdXBwb3J0IGZvcgogKiB0aGUgZmllbGQgdHlwZS4pCiAqLS0tLS0t LS0tLQogKi8KCi8qIEJpdG1hc2sgb2YgZmxhZ3Mgc3VwcG9ydGVkIGJ5IHRhYmxlIEFNcyAq LwojZGVmaW5lIEFNRkxBR19IQVNfVElEX1JBTkdFICgxIDw8IDApCgp0eXBlZGVmIGVudW0g UmVsT3B0S2luZAp7CglSRUxPUFRfQkFTRVJFTCwKCVJFTE9QVF9KT0lOUkVMLAoJUkVMT1BU X09USEVSX01FTUJFUl9SRUwsCglSRUxPUFRfT1RIRVJfSk9JTlJFTCwKCVJFTE9QVF9VUFBF Ul9SRUwsCglSRUxPUFRfT1RIRVJfVVBQRVJfUkVMLAp9IFJlbE9wdEtpbmQ7CgovKgogKiBJ cyB0aGUgZ2l2ZW4gcmVsYXRpb24gYSBzaW1wbGUgcmVsYXRpb24gaS5lIGEgYmFzZSBvciAi b3RoZXIiIG1lbWJlcgogKiByZWxhdGlvbj8KICovCiNkZWZpbmUgSVNfU0lNUExFX1JFTChy ZWwpIFwKCSgocmVsKS0+cmVsb3B0a2luZCA9PSBSRUxPUFRfQkFTRVJFTCB8fCBcCgkgKHJl bCktPnJlbG9wdGtpbmQgPT0gUkVMT1BUX09USEVSX01FTUJFUl9SRUwpCgovKiBJcyB0aGUg Z2l2ZW4gcmVsYXRpb24gYSBqb2luIHJlbGF0aW9uPyAqLwojZGVmaW5lIElTX0pPSU5fUkVM KHJlbCkJXAoJKChyZWwpLT5yZWxvcHRraW5kID09IFJFTE9QVF9KT0lOUkVMIHx8IFwKCSAo cmVsKS0+cmVsb3B0a2luZCA9PSBSRUxPUFRfT1RIRVJfSk9JTlJFTCkKCi8qIElzIHRoZSBn aXZlbiByZWxhdGlvbiBhbiB1cHBlciByZWxhdGlvbj8gKi8KI2RlZmluZSBJU19VUFBFUl9S RUwocmVsKQlcCgkoKHJlbCktPnJlbG9wdGtpbmQgPT0gUkVMT1BUX1VQUEVSX1JFTCB8fCBc CgkgKHJlbCktPnJlbG9wdGtpbmQgPT0gUkVMT1BUX09USEVSX1VQUEVSX1JFTCkKCi8qIElz IHRoZSBnaXZlbiByZWxhdGlvbiBhbiAib3RoZXIiIHJlbGF0aW9uPyAqLwojZGVmaW5lIElT X09USEVSX1JFTChyZWwpIFwKCSgocmVsKS0+cmVsb3B0a2luZCA9PSBSRUxPUFRfT1RIRVJf TUVNQkVSX1JFTCB8fCBcCgkgKHJlbCktPnJlbG9wdGtpbmQgPT0gUkVMT1BUX09USEVSX0pP SU5SRUwgfHwgXAoJIChyZWwpLT5yZWxvcHRraW5kID09IFJFTE9QVF9PVEhFUl9VUFBFUl9S RUwpCgp0eXBlZGVmIHN0cnVjdCBSZWxPcHRJbmZvCnsKCXBnX25vZGVfYXR0cihub19jb3B5 X2VxdWFsLCBub19yZWFkLCBub19xdWVyeV9qdW1ibGUpCgoJTm9kZVRhZwkJdHlwZTsKCglS ZWxPcHRLaW5kCXJlbG9wdGtpbmQ7CgoJLyoKCSAqIGFsbCByZWxhdGlvbnMgaW5jbHVkZWQg aW4gdGhpcyBSZWxPcHRJbmZvOyBzZXQgb2YgYmFzZSArIE9KIHJlbGlkcwoJICogKHJhbmdl dGFibGUgaW5kZXhlcykKCSAqLwoJUmVsaWRzCQlyZWxpZHM7CgoJLyoKCSAqIHNpemUgZXN0 aW1hdGVzIGdlbmVyYXRlZCBieSBwbGFubmVyCgkgKi8KCS8qIGVzdGltYXRlZCBudW1iZXIg b2YgcmVzdWx0IHR1cGxlcyAqLwoJQ2FyZGluYWxpdHkgcm93czsKCgkvKgoJICogcGVyLXJl bGF0aW9uIHBsYW5uZXIgY29udHJvbAoJICovCgkvKiBrZWVwIGNoZWFwLXN0YXJ0dXAtY29z dCBwYXRocz8gKi8KCWJvb2wJCWNvbnNpZGVyX3N0YXJ0dXA7CgkvKiBkaXR0bywgZm9yIHBh cmFtZXRlcml6ZWQgcGF0aHM/ICovCglib29sCQljb25zaWRlcl9wYXJhbV9zdGFydHVwOwoJ LyogY29uc2lkZXIgcGFyYWxsZWwgcGF0aHM/ICovCglib29sCQljb25zaWRlcl9wYXJhbGxl bDsKCS8qIHBhdGggZ2VuZXJhdGlvbiBzdHJhdGVneSBtYXNrICovCgl1aW50NjQJCXBnc19t YXNrOwoKCS8qCgkgKiBkZWZhdWx0IHJlc3VsdCB0YXJnZXRsaXN0IGZvciBQYXRocyBzY2Fu bmluZyB0aGlzIHJlbGF0aW9uOyBsaXN0IG9mCgkgKiBWYXJzL0V4cHJzLCBjb3N0LCB3aWR0 aAoJICovCglzdHJ1Y3QgUGF0aFRhcmdldCAqcmVsdGFyZ2V0OwoKCS8qCgkgKiBtYXRlcmlh bGl6YXRpb24gaW5mb3JtYXRpb24KCSAqLwoJTGlzdAkgICAqcGF0aGxpc3Q7CQkvKiBQYXRo IHN0cnVjdHVyZXMgKi8KCUxpc3QJICAgKnBwaWxpc3Q7CQkvKiBQYXJhbVBhdGhJbmZvcyB1 c2VkIGluIHBhdGhsaXN0ICovCglMaXN0CSAgICpwYXJ0aWFsX3BhdGhsaXN0OwkvKiBwYXJ0 aWFsIFBhdGhzICovCglzdHJ1Y3QgUGF0aCAqY2hlYXBlc3Rfc3RhcnR1cF9wYXRoOwoJc3Ry dWN0IFBhdGggKmNoZWFwZXN0X3RvdGFsX3BhdGg7CglMaXN0CSAgICpjaGVhcGVzdF9wYXJh bWV0ZXJpemVkX3BhdGhzOwoKCS8qCgkgKiBwYXJhbWV0ZXJpemF0aW9uIGluZm9ybWF0aW9u IG5lZWRlZCBmb3IgYm90aCBiYXNlIHJlbHMgYW5kIGpvaW4gcmVscwoJICogKHNlZSBhbHNv IGxhdGVyYWxfdmFycyBhbmQgbGF0ZXJhbF9yZWZlcmVuY2VycykKCSAqLwoJLyogcmVscyBk aXJlY3RseSBsYXRlcmFsbHkgcmVmZXJlbmNlZCAqLwoJUmVsaWRzCQlkaXJlY3RfbGF0ZXJh bF9yZWxpZHM7CgkvKiBtaW5pbXVtIHBhcmFtZXRlcml6YXRpb24gb2YgcmVsICovCglSZWxp ZHMJCWxhdGVyYWxfcmVsaWRzOwoKCS8qCgkgKiBpbmZvcm1hdGlvbiBhYm91dCBhIGJhc2Ug cmVsIChub3Qgc2V0IGZvciBqb2luIHJlbHMhKQoJICovCglJbmRleAkJcmVsaWQ7CgkvKiBj b250YWluaW5nIHRhYmxlc3BhY2UgKi8KCU9pZAkJCXJlbHRhYmxlc3BhY2U7CgkvKiBSRUxB VElPTiwgU1VCUVVFUlksIEZVTkNUSU9OLCBldGMgKi8KCVJURUtpbmQJCXJ0ZWtpbmQ7Cgkv KiBzbWFsbGVzdCBhdHRybm8gb2YgcmVsIChvZnRlbiA8MCkgKi8KCUF0dHJOdW1iZXIJbWlu X2F0dHI7CgkvKiBsYXJnZXN0IGF0dHJubyBvZiByZWwgKi8KCUF0dHJOdW1iZXIJbWF4X2F0 dHI7CgkvKiBhcnJheSBpbmRleGVkIFttaW5fYXR0ciAuLiBtYXhfYXR0cl0gKi8KCVJlbGlk cwkgICAqYXR0cl9uZWVkZWQgcGdfbm9kZV9hdHRyKHJlYWRfd3JpdGVfaWdub3JlKTsKCS8q IGFycmF5IGluZGV4ZWQgW21pbl9hdHRyIC4uIG1heF9hdHRyXSAqLwoJaW50MzIJICAgKmF0 dHJfd2lkdGhzIHBnX25vZGVfYXR0cihyZWFkX3dyaXRlX2lnbm9yZSk7CgkvKiB6ZXJvLWJh c2VkIHNldCBjb250YWluaW5nIGF0dG51bXMgb2YgTk9UIE5VTEwgY29sdW1ucyAqLwoJQml0 bWFwc2V0ICAqbm90bnVsbGF0dG51bXM7CgkvKiByZWxpZHMgb2Ygb3V0ZXIgam9pbnMgdGhh dCBjYW4gbnVsbCB0aGlzIGJhc2VyZWwgKi8KCVJlbGlkcwkJbnVsbGluZ19yZWxpZHM7Cgkv KiBMQVRFUkFMIFZhcnMgYW5kIFBIVnMgcmVmZXJlbmNlZCBieSByZWwgKi8KCUxpc3QJICAg KmxhdGVyYWxfdmFyczsKCS8qIHJlbHMgdGhhdCByZWZlcmVuY2UgdGhpcyBiYXNlcmVsIGxh dGVyYWxseSAqLwoJUmVsaWRzCQlsYXRlcmFsX3JlZmVyZW5jZXJzOwoJLyogbGlzdCBvZiBJ bmRleE9wdEluZm8gKi8KCUxpc3QJICAgKmluZGV4bGlzdDsKCS8qIGxpc3Qgb2YgU3RhdGlz dGljRXh0SW5mbyAqLwoJTGlzdAkgICAqc3RhdGxpc3Q7CgkvKiBzaXplIGVzdGltYXRlcyBk ZXJpdmVkIGZyb20gcGdfY2xhc3MgKi8KCUJsb2NrTnVtYmVyIHBhZ2VzOwoJQ2FyZGluYWxp dHkgdHVwbGVzOwoJZG91YmxlCQlhbGx2aXNmcmFjOwoJLyogaW5kZXhlcyBpbiBQbGFubmVy SW5mbydzIGVxX2NsYXNzZXMgbGlzdCBvZiBFQ3MgdGhhdCBtZW50aW9uIHRoaXMgcmVsICov CglCaXRtYXBzZXQgICplY2xhc3NfaW5kZXhlczsKCVBsYW5uZXJJbmZvICpzdWJyb290OwkJ LyogaWYgc3VicXVlcnkgKi8KCUxpc3QJICAgKnN1YnBsYW5fcGFyYW1zOyAvKiBpZiBzdWJx dWVyeSAqLwoJLyogd2FudGVkIG51bWJlciBvZiBwYXJhbGxlbCB3b3JrZXJzICovCglpbnQJ CQlyZWxfcGFyYWxsZWxfd29ya2VyczsKCS8qIEJpdG1hc2sgb2Ygb3B0aW9uYWwgZmVhdHVy ZXMgc3VwcG9ydGVkIGJ5IHRoZSB0YWJsZSBBTSAqLwoJdWludDMyCQlhbWZsYWdzOwoKCS8q CgkgKiBJbmZvcm1hdGlvbiBhYm91dCBmb3JlaWduIHRhYmxlcyBhbmQgZm9yZWlnbiBqb2lu cwoJICovCgkvKiBpZGVudGlmaWVzIHNlcnZlciBmb3IgdGhlIHRhYmxlIG9yIGpvaW4gKi8K CU9pZAkJCXNlcnZlcmlkOwoJLyogaWRlbnRpZmllcyB1c2VyIHRvIGNoZWNrIGFjY2VzcyBh czsgMCBtZWFucyB0byBjaGVjayBhcyBjdXJyZW50IHVzZXIgKi8KCU9pZAkJCXVzZXJpZDsK CS8qIGpvaW4gaXMgb25seSB2YWxpZCBmb3IgY3VycmVudCB1c2VyICovCglib29sCQl1c2Vy aWRpc2N1cnJlbnQ7CgkvKiB1c2UgInN0cnVjdCBGZHdSb3V0aW5lIiB0byBhdm9pZCBpbmNs dWRpbmcgZmR3YXBpLmggaGVyZSAqLwoJc3RydWN0IEZkd1JvdXRpbmUgKmZkd3JvdXRpbmUg cGdfbm9kZV9hdHRyKHJlYWRfd3JpdGVfaWdub3JlKTsKCXZvaWQJICAgKmZkd19wcml2YXRl IHBnX25vZGVfYXR0cihyZWFkX3dyaXRlX2lnbm9yZSk7CgoJLyoKCSAqIGNhY2hlIHNwYWNl IGZvciByZW1lbWJlcmluZyBpZiB3ZSBoYXZlIHByb3ZlbiB0aGlzIHJlbGF0aW9uIHVuaXF1 ZQoJICovCgkvKiBrbm93biB1bmlxdWUgZm9yIHRoZXNlIG90aGVyIHJlbGlkIHNldChzKSBn aXZlbiBpbiBVbmlxdWVSZWxJbmZvKHMpICovCglMaXN0CSAgICp1bmlxdWVfZm9yX3JlbHM7 CgkvKiBrbm93biBub3QgdW5pcXVlIGZvciB0aGVzZSBzZXQocykgKi8KCUxpc3QJICAgKm5v bl91bmlxdWVfZm9yX3JlbHM7CgoJLyoKCSAqIGluZm9ybWF0aW9uIGFib3V0IHVuaXF1ZS1p ZmljYXRpb24gb2YgdGhpcyByZWxhdGlvbgoJICovCgkvKiB0aGUgdW5pcXVlLWlmaWVkIHZl cnNpb24gb2YgdGhlIHJlbGF0aW9uICovCglzdHJ1Y3QgUmVsT3B0SW5mbyAqdW5pcXVlX3Jl bDsKCS8qIHBhdGhrZXlzIGZvciBzb3J0LWJhc2VkIHVuaXF1ZS1pZmljYXRpb24gaW1wbGVt ZW50YXRpb25zICovCglMaXN0CSAgICp1bmlxdWVfcGF0aGtleXM7CgkvKiBTb3J0R3JvdXBD bGF1c2Ugbm9kZXMgZm9yIGhhc2gtYmFzZWQgdW5pcXVlLWlmaWNhdGlvbiBpbXBsZW1lbnRh dGlvbnMgKi8KCUxpc3QJICAgKnVuaXF1ZV9ncm91cGNsYXVzZTsKCgkvKgoJICogdXNlZCBi eSB2YXJpb3VzIHNjYW5zIGFuZCBqb2luczoKCSAqLwoJLyogUmVzdHJpY3RJbmZvIHN0cnVj dHVyZXMgKGlmIGJhc2UgcmVsKSAqLwoJTGlzdAkgICAqYmFzZXJlc3RyaWN0aW5mbzsKCS8q IGNvc3Qgb2YgZXZhbHVhdGluZyB0aGUgYWJvdmUgKi8KCVF1YWxDb3N0CWJhc2VyZXN0cmlj dGNvc3Q7CgkvKiBtaW4gc2VjdXJpdHlfbGV2ZWwgZm91bmQgaW4gYmFzZXJlc3RyaWN0aW5m byAqLwoJSW5kZXgJCWJhc2VyZXN0cmljdF9taW5fc2VjdXJpdHk7CgkvKiBSZXN0cmljdElu Zm8gc3RydWN0dXJlcyBmb3Igam9pbiBjbGF1c2VzIGludm9sdmluZyB0aGlzIHJlbCAqLwoJ TGlzdAkgICAqam9pbmluZm87CgkvKiBUIG1lYW5zIGpvaW5pbmZvIGlzIGluY29tcGxldGUg Ki8KCWJvb2wJCWhhc19lY2xhc3Nfam9pbnM7CgoJLyoKCSAqIHVzZWQgYnkgcGFydGl0aW9u d2lzZSBqb2luczoKCSAqLwoJLyogY29uc2lkZXIgcGFydGl0aW9ud2lzZSBqb2luIHBhdGhz PyAoaWYgcGFydGl0aW9uZWQgcmVsKSAqLwoJYm9vbAkJY29uc2lkZXJfcGFydGl0aW9ud2lz ZV9qb2luOwoKCS8qCgkgKiB1c2VkIGJ5IGVhZ2VyIGFnZ3JlZ2F0aW9uOgoJICovCgkvKiBp bmZvcm1hdGlvbiBuZWVkZWQgdG8gY3JlYXRlIGdyb3VwZWQgcGF0aHMgKi8KCXN0cnVjdCBS ZWxBZ2dJbmZvICphZ2dfaW5mbzsKCS8qIHRoZSBwYXJ0aWFsbHktYWdncmVnYXRlZCB2ZXJz aW9uIG9mIHRoZSByZWxhdGlvbiAqLwoJc3RydWN0IFJlbE9wdEluZm8gKmdyb3VwZWRfcmVs OwoKCS8qCgkgKiBpbmhlcml0YW5jZSBsaW5rcywgaWYgdGhpcyBpcyBhbiBvdGhlcnJlbCAo b3RoZXJ3aXNlIE5VTEwpOgoJICovCgkvKiBJbW1lZGlhdGUgcGFyZW50IHJlbGF0aW9uIChk dW1waW5nIGl0IHdvdWxkIGJlIHRvbyB2ZXJib3NlKSAqLwoJc3RydWN0IFJlbE9wdEluZm8g KnBhcmVudCBwZ19ub2RlX2F0dHIocmVhZF93cml0ZV9pZ25vcmUpOwoJLyogVG9wbW9zdCBw YXJlbnQgcmVsYXRpb24gKGR1bXBpbmcgaXQgd291bGQgYmUgdG9vIHZlcmJvc2UpICovCglz dHJ1Y3QgUmVsT3B0SW5mbyAqdG9wX3BhcmVudCBwZ19ub2RlX2F0dHIocmVhZF93cml0ZV9p Z25vcmUpOwoJLyogUmVsaWRzIG9mIHRvcG1vc3QgcGFyZW50IChyZWR1bmRhbnQsIGJ1dCBo YW5keSkgKi8KCVJlbGlkcwkJdG9wX3BhcmVudF9yZWxpZHM7CgoJLyoKCSAqIHVzZWQgZm9y IHBhcnRpdGlvbmVkIHJlbGF0aW9uczoKCSAqLwoJLyogUGFydGl0aW9uaW5nIHNjaGVtZSAq LwoJUGFydGl0aW9uU2NoZW1lIHBhcnRfc2NoZW1lIHBnX25vZGVfYXR0cihyZWFkX3dyaXRl X2lnbm9yZSk7CgoJLyoKCSAqIE51bWJlciBvZiBwYXJ0aXRpb25zOyAtMSBpZiBub3QgeWV0 IHNldDsgaW4gY2FzZSBvZiBhIGpvaW4gcmVsYXRpb24gMAoJICogbWVhbnMgaXQncyBjb25z aWRlcmVkIHVucGFydGl0aW9uZWQKCSAqLwoJaW50CQkJbnBhcnRzOwoJLyogUGFydGl0aW9u IGJvdW5kcyAqLwoJc3RydWN0IFBhcnRpdGlvbkJvdW5kSW5mb0RhdGEgKmJvdW5kaW5mbyBw Z19ub2RlX2F0dHIocmVhZF93cml0ZV9pZ25vcmUpOwoJLyogVHJ1ZSBpZiBwYXJ0aXRpb24g Ym91bmRzIHdlcmUgY3JlYXRlZCBieSBwYXJ0aXRpb25fYm91bmRzX21lcmdlKCkgKi8KCWJv b2wJCXBhcnRib3VuZHNfbWVyZ2VkOwoJLyogUGFydGl0aW9uIGNvbnN0cmFpbnQsIGlmIG5v dCB0aGUgcm9vdCAqLwoJTGlzdAkgICAqcGFydGl0aW9uX3F1YWw7CgoJLyoKCSAqIEFycmF5 IG9mIFJlbE9wdEluZm9zIG9mIHBhcnRpdGlvbnMsIHN0b3JlZCBpbiB0aGUgc2FtZSBvcmRl ciBhcyBib3VuZHMKCSAqIChkb24ndCBwcmludCwgdG9vIGJ1bGt5IGFuZCBkdXBsaWNhdGl2 ZSkKCSAqLwoJc3RydWN0IFJlbE9wdEluZm8gKipwYXJ0X3JlbHMgcGdfbm9kZV9hdHRyKHJl YWRfd3JpdGVfaWdub3JlKTsKCgkvKgoJICogQml0bWFwIHdpdGggbWVtYmVycyBhY3Rpbmcg YXMgaW5kZXhlcyBpbnRvIHRoZSBwYXJ0X3JlbHNbXSBhcnJheSB0bwoJICogaW5kaWNhdGUg d2hpY2ggcGFydGl0aW9ucyBzdXJ2aXZlZCBwYXJ0aXRpb24gcHJ1bmluZy4KCSAqLwoJQml0 bWFwc2V0ICAqbGl2ZV9wYXJ0czsKCS8qIFJlbGlkcyBzZXQgb2YgYWxsIHBhcnRpdGlvbiBy ZWxpZHMgKi8KCVJlbGlkcwkJYWxsX3BhcnRyZWxzOwoKCS8qCgkgKiBUaGVzZSBhcnJheXMg YXJlIG9mIGxlbmd0aCBwYXJ0a2V5LT5wYXJ0bmF0dHMsIHdoaWNoIHdlIGRvbid0IGhhdmUg YXQKCSAqIGhhbmQsIHNvIGRvbid0IHRyeSB0byBwcmludAoJICovCgoJLyogTm9uLW51bGxh YmxlIHBhcnRpdGlvbiBrZXkgZXhwcmVzc2lvbnMgKi8KCUxpc3QJICAqKnBhcnRleHBycyBw Z19ub2RlX2F0dHIocmVhZF93cml0ZV9pZ25vcmUpOwoJLyogTnVsbGFibGUgcGFydGl0aW9u IGtleSBleHByZXNzaW9ucyAqLwoJTGlzdAkgICoqbnVsbGFibGVfcGFydGV4cHJzIHBnX25v ZGVfYXR0cihyZWFkX3dyaXRlX2lnbm9yZSk7CgoJLyogZXh0ZW5zaW9uIHN0YXRlICovCgl2 b2lkCSAgKipleHRlbnNpb25fc3RhdGUgcGdfbm9kZV9hdHRyKHJlYWRfd3JpdGVfaWdub3Jl KTsKCWludAkJCWV4dGVuc2lvbl9zdGF0ZV9hbGxvY2F0ZWQ7Cn0gUmVsT3B0SW5mbzsKCi8q CiAqIElzIGdpdmVuIHJlbGF0aW9uIHBhcnRpdGlvbmVkPwogKgogKiBJdCdzIG5vdCBlbm91 Z2ggdG8gdGVzdCB3aGV0aGVyIHJlbC0+cGFydF9zY2hlbWUgaXMgc2V0LCBiZWNhdXNlIGl0 IG1pZ2h0CiAqIGJlIHRoYXQgdGhlIGJhc2ljIHBhcnRpdGlvbmluZyBwcm9wZXJ0aWVzIG9m IHRoZSBpbnB1dCByZWxhdGlvbnMgbWF0Y2hlZAogKiBidXQgdGhlIHBhcnRpdGlvbiBib3Vu ZHMgZGlkIG5vdC4gIEFsc28sIGlmIHdlIGFyZSBhYmxlIHRvIHByb3ZlIGEgcmVsCiAqIGR1 bW15IChlbXB0eSksIHdlIHNob3VsZCBoZW5jZWZvcnRoIHRyZWF0IGl0IGFzIHVucGFydGl0 aW9uZWQuCiAqLwojZGVmaW5lIElTX1BBUlRJVElPTkVEX1JFTChyZWwpIFwKCSgocmVsKS0+ cGFydF9zY2hlbWUgJiYgKHJlbCktPmJvdW5kaW5mbyAmJiAocmVsKS0+bnBhcnRzID4gMCAm JiBcCgkgKHJlbCktPnBhcnRfcmVscyAmJiAhSVNfRFVNTVlfUkVMKHJlbCkpCgovKgogKiBD b252ZW5pZW5jZSBtYWNybyB0byBtYWtlIHN1cmUgdGhhdCBhIHBhcnRpdGlvbmVkIHJlbGF0 aW9uIGhhcyBhbGwgdGhlCiAqIHJlcXVpcmVkIG1lbWJlcnMgc2V0LgogKi8KI2RlZmluZSBS RUxfSEFTX0FMTF9QQVJUX1BST1BTKHJlbCkJXAoJKChyZWwpLT5wYXJ0X3NjaGVtZSAmJiAo cmVsKS0+Ym91bmRpbmZvICYmIChyZWwpLT5ucGFydHMgPiAwICYmIFwKCSAocmVsKS0+cGFy dF9yZWxzICYmIChyZWwpLT5wYXJ0ZXhwcnMgJiYgKHJlbCktPm51bGxhYmxlX3BhcnRleHBy cykKCi8qCiAqIElzIGdpdmVuIHJlbGF0aW9uIHVuaXF1ZS1pZmllZD8KICoKICogV2hlbiB0 aGUgbm9taW5hbCBqb2ludHlwZSBpcyBKT0lOX0lOTkVSLCBzamluZm8tPmpvaW50eXBlIGlz IEpPSU5fU0VNSSwgYW5kCiAqIHRoZSBnaXZlbiByZWwgaXMgZXhhY3RseSB0aGUgUkhTIG9m IHRoZSBzZW1pam9pbiwgaXQgaW5kaWNhdGVzIHRoYXQgdGhlIHJlbAogKiBoYXMgYmVlbiB1 bmlxdWUtaWZpZWQuCiAqLwojZGVmaW5lIFJFTEFUSU9OX1dBU19NQURFX1VOSVFVRShyZWws IHNqaW5mbywgbm9taW5hbF9qb2ludHlwZSkgXAoJKChub21pbmFsX2pvaW50eXBlKSA9PSBK T0lOX0lOTkVSICYmIChzamluZm8pLT5qb2ludHlwZSA9PSBKT0lOX1NFTUkgJiYgXAoJIGJt c19lcXVhbCgoc2ppbmZvKS0+c3luX3JpZ2h0aGFuZCwgKHJlbCktPnJlbGlkcykpCgovKgog KiBJcyB0aGUgZ2l2ZW4gcmVsYXRpb24gYSBncm91cGVkIHJlbGF0aW9uPwogKi8KI2RlZmlu ZSBJU19HUk9VUEVEX1JFTChyZWwpIFwKCSgocmVsKS0+YWdnX2luZm8gIT0gTlVMTCkKCi8q CiAqIFJlbEFnZ0luZm8KICoJCUluZm9ybWF0aW9uIG5lZWRlZCB0byBjcmVhdGUgcGF0aHMg Zm9yIGEgZ3JvdXBlZCByZWxhdGlvbi4KICoKICogInRhcmdldCIgaXMgdGhlIGRlZmF1bHQg cmVzdWx0IHRhcmdldGxpc3QgZm9yIFBhdGhzIHNjYW5uaW5nIHRoaXMgZ3JvdXBlZAogKiBy ZWxhdGlvbjsgbGlzdCBvZiBWYXJzL0V4cHJzLCBjb3N0LCB3aWR0aC4KICoKICogImFnZ19p bnB1dCIgaXMgdGhlIG91dHB1dCB0bGlzdCBmb3IgdGhlIHBhdGhzIHRoYXQgcHJvdmlkZSBp bnB1dCB0byB0aGUKICogZ3JvdXBlZCBwYXRocy4gIE9uZSBkaWZmZXJlbmNlIGZyb20gdGhl IHJlbHRhcmdldCBvZiB0aGUgbm9uLWdyb3VwZWQKICogcmVsYXRpb24gaXMgdGhhdCBhZ2df aW5wdXQgaGFzIGl0cyBzb3J0Z3JvdXByZWZzW10gaW5pdGlhbGl6ZWQuCiAqCiAqICJncm91 cF9jbGF1c2VzIiBhbmQgImdyb3VwX2V4cHJzIiBhcmUgbGlzdHMgb2YgU29ydEdyb3VwQ2xh dXNlcyBhbmQgdGhlCiAqIGNvcnJlc3BvbmRpbmcgZ3JvdXBpbmcgZXhwcmVzc2lvbnMuCiAq CiAqICJhcHBseV9hZ2dfYXQiIHRyYWNrcyB0aGUgc2V0IG9mIHJlbGlkcyBhdCB3aGljaCBw YXJ0aWFsIGFnZ3JlZ2F0aW9uIGlzCiAqIGFwcGxpZWQgaW4gdGhlIHBhdGhzIG9mIHRoaXMg Z3JvdXBlZCByZWxhdGlvbi4KICoKICogImdyb3VwZWRfcm93cyIgaXMgdGhlIGVzdGltYXRl ZCBudW1iZXIgb2YgcmVzdWx0IHR1cGxlcyBvZiB0aGUgZ3JvdXBlZAogKiByZWxhdGlvbi4K ICoKICogImFnZ191c2VmdWwiIGlzIGEgZmxhZyB0byBpbmRpY2F0ZSB3aGV0aGVyIHRoZSBn cm91cGVkIHBhdGhzIGFyZSBjb25zaWRlcmVkCiAqIHVzZWZ1bC4gIEl0IGlzIHNldCB0cnVl IGlmIHRoZSBhdmVyYWdlIHBhcnRpYWwgZ3JvdXAgc2l6ZSBpcyBubyBsZXNzIHRoYW4KICog bWluX2VhZ2VyX2FnZ19ncm91cF9zaXplLCBzdWdnZXN0aW5nIGEgc2lnbmlmaWNhbnQgcm93 IGNvdW50IHJlZHVjdGlvbi4KICovCnR5cGVkZWYgc3RydWN0IFJlbEFnZ0luZm8KewoJcGdf bm9kZV9hdHRyKG5vX2NvcHlfZXF1YWwsIG5vX3JlYWQsIG5vX3F1ZXJ5X2p1bWJsZSkKCglO b2RlVGFnCQl0eXBlOwoKCS8qIHRoZSBvdXRwdXQgdGxpc3QgZm9yIHRoZSBncm91cGVkIHBh dGhzICovCglzdHJ1Y3QgUGF0aFRhcmdldCAqdGFyZ2V0OwoKCS8qIHRoZSBvdXRwdXQgdGxp c3QgZm9yIHRoZSBpbnB1dCBwYXRocyAqLwoJc3RydWN0IFBhdGhUYXJnZXQgKmFnZ19pbnB1 dDsKCgkvKiBhIGxpc3Qgb2YgU29ydEdyb3VwQ2xhdXNlcyAqLwoJTGlzdAkgICAqZ3JvdXBf Y2xhdXNlczsKCS8qIGEgbGlzdCBvZiBncm91cGluZyBleHByZXNzaW9ucyAqLwoJTGlzdAkg ICAqZ3JvdXBfZXhwcnM7CgoJLyogdGhlIHNldCBvZiByZWxpZHMgcGFydGlhbCBhZ2dyZWdh dGlvbiBpcyBhcHBsaWVkIGF0ICovCglSZWxpZHMJCWFwcGx5X2FnZ19hdDsKCgkvKiBlc3Rp bWF0ZWQgbnVtYmVyIG9mIHJlc3VsdCB0dXBsZXMgKi8KCUNhcmRpbmFsaXR5IGdyb3VwZWRf cm93czsKCgkvKiB0aGUgZ3JvdXBlZCBwYXRocyBhcmUgY29uc2lkZXJlZCB1c2VmdWw/ICov Cglib29sCQlhZ2dfdXNlZnVsOwp9IFJlbEFnZ0luZm87CgovKgogKiBJbmRleE9wdEluZm8K ICoJCVBlci1pbmRleCBpbmZvcm1hdGlvbiBmb3IgcGxhbm5pbmcvb3B0aW1pemF0aW9uCiAq CiAqCQlpbmRleGtleXNbXSBhbmQgY2FucmV0dXJuW10gZWFjaCBoYXZlIG5jb2x1bW5zIGVu dHJpZXMuCiAqCiAqCQlpbmRleGNvbGxhdGlvbnNbXSwgb3BmYW1pbHlbXSwgYW5kIG9wY2lu dHlwZVtdIGVhY2ggaGF2ZSBua2V5Y29sdW1ucwogKgkJZW50cmllcy4gIFRoZXNlIGRvbid0 IGNvbnRhaW4gYW55IGluZm9ybWF0aW9uIGFib3V0IElOQ0xVREUgY29sdW1ucy4KICoKICoJ CXNvcnRvcGZhbWlseVtdLCByZXZlcnNlX3NvcnRbXSwgYW5kIG51bGxzX2ZpcnN0W10gaGF2 ZQogKgkJbmtleWNvbHVtbnMgZW50cmllcywgaWYgdGhlIGluZGV4IGlzIG9yZGVyZWQ7IGJ1 dCBpZiBpdCBpcyB1bm9yZGVyZWQsCiAqCQl0aG9zZSBwb2ludGVycyBhcmUgTlVMTC4KICoK ICoJCVplcm9lcyBpbiB0aGUgaW5kZXhrZXlzW10gYXJyYXkgaW5kaWNhdGUgaW5kZXggY29s dW1ucyB0aGF0IGFyZQogKgkJZXhwcmVzc2lvbnM7IHRoZXJlIGlzIG9uZSBlbGVtZW50IGlu IGluZGV4cHJzIGZvciBlYWNoIHN1Y2ggY29sdW1uLgogKgogKgkJRm9yIGFuIG9yZGVyZWQg aW5kZXgsIHJldmVyc2Vfc29ydFtdIGFuZCBudWxsc19maXJzdFtdIGRlc2NyaWJlIHRoZQog KgkJc29ydCBvcmRlcmluZyBvZiBhIGZvcndhcmQgaW5kZXhzY2FuOyB3ZSBjYW4gYWxzbyBj b25zaWRlciBhIGJhY2t3YXJkCiAqCQlpbmRleHNjYW4sIHdoaWNoIHdpbGwgZ2VuZXJhdGUg dGhlIHJldmVyc2Ugb3JkZXJpbmcuCiAqCiAqCQlUaGUgaW5kZXhwcnMgYW5kIGluZHByZWQg ZXhwcmVzc2lvbnMgaGF2ZSBiZWVuIHJ1biB0aHJvdWdoCiAqCQlwcmVwcXVhbC5jIGFuZCBl dmFsX2NvbnN0X2V4cHJlc3Npb25zKCkgZm9yIGVhc2Ugb2YgbWF0Y2hpbmcgdG8KICoJCVdI RVJFIGNsYXVzZXMuIGluZHByZWQgaXMgaW4gaW1wbGljaXQtQU5EIGZvcm0uCiAqCiAqCQlp bmRleHRsaXN0IGlzIGEgVGFyZ2V0RW50cnkgbGlzdCByZXByZXNlbnRpbmcgdGhlIGluZGV4 IGNvbHVtbnMuCiAqCQlJdCBwcm92aWRlcyBhbiBlcXVpdmFsZW50IGJhc2UtcmVsYXRpb24g VmFyIGZvciBlYWNoIHNpbXBsZSBjb2x1bW4sCiAqCQlhbmQgbGlua3MgdG8gdGhlIG1hdGNo aW5nIGluZGV4cHJzIGVsZW1lbnQgZm9yIGVhY2ggZXhwcmVzc2lvbiBjb2x1bW4uCiAqCiAq CQlXaGlsZSBtb3N0IG9mIHRoZXNlIGZpZWxkcyBhcmUgZmlsbGVkIHdoZW4gdGhlIEluZGV4 T3B0SW5mbyBpcyBjcmVhdGVkCiAqCQkoYnkgcGxhbmNhdC5jKSwgaW5kcmVzdHJpY3RpbmZv IGFuZCBwcmVkT0sgYXJlIHNldCBsYXRlciwgaW4KICoJCWNoZWNrX2luZGV4X3ByZWRpY2F0 ZXMoKS4KICovCgpzdHJ1Y3QgSW5kZXhQYXRoOwkJCQkvKiBmb3J3YXJkIGRlY2xhcmF0aW9u ICovCgp0eXBlZGVmIHN0cnVjdCBJbmRleE9wdEluZm8KewoJcGdfbm9kZV9hdHRyKG5vX2Nv cHlfZXF1YWwsIG5vX3JlYWQsIG5vX3F1ZXJ5X2p1bWJsZSkKCglOb2RlVGFnCQl0eXBlOwoK CS8qIE9JRCBvZiB0aGUgaW5kZXggcmVsYXRpb24gKi8KCU9pZAkJCWluZGV4b2lkOwoJLyog dGFibGVzcGFjZSBvZiBpbmRleCAobm90IHRhYmxlKSAqLwoJT2lkCQkJcmVsdGFibGVzcGFj ZTsKCS8qIGJhY2stbGluayB0byBpbmRleCdzIHRhYmxlOyBkb24ndCBwcmludCwgZWxzZSBp bmZpbml0ZSByZWN1cnNpb24gKi8KCVJlbE9wdEluZm8gKnJlbCBwZ19ub2RlX2F0dHIocmVh ZF93cml0ZV9pZ25vcmUpOwoKCS8qCgkgKiBpbmRleC1zaXplIHN0YXRpc3RpY3MgKGZyb20g cGdfY2xhc3MgYW5kIGVsc2V3aGVyZSkKCSAqLwoJLyogbnVtYmVyIG9mIGRpc2sgcGFnZXMg aW4gaW5kZXggKi8KCUJsb2NrTnVtYmVyIHBhZ2VzOwoJLyogbnVtYmVyIG9mIGluZGV4IHR1 cGxlcyBpbiBpbmRleCAqLwoJQ2FyZGluYWxpdHkgdHVwbGVzOwoJLyogaW5kZXggdHJlZSBo ZWlnaHQsIG9yIC0xIGlmIHVua25vd24gKi8KCWludAkJCXRyZWVfaGVpZ2h0OwoKCS8qCgkg KiBpbmRleCBkZXNjcmlwdG9yIGluZm9ybWF0aW9uCgkgKi8KCS8qIG51bWJlciBvZiBjb2x1 bW5zIGluIGluZGV4ICovCglpbnQJCQluY29sdW1uczsKCS8qIG51bWJlciBvZiBrZXkgY29s dW1ucyBpbiBpbmRleCAqLwoJaW50CQkJbmtleWNvbHVtbnM7CgoJLyoKCSAqIHRhYmxlIGNv bHVtbiBudW1iZXJzIG9mIGluZGV4J3MgY29sdW1ucyAoYm90aCBrZXkgYW5kIGluY2x1ZGVk CgkgKiBjb2x1bW5zKSwgb3IgMCBmb3IgZXhwcmVzc2lvbiBjb2x1bW5zCgkgKi8KCWludAkJ ICAgKmluZGV4a2V5cyBwZ19ub2RlX2F0dHIoYXJyYXlfc2l6ZShuY29sdW1ucykpOwoJLyog T0lEcyBvZiBjb2xsYXRpb25zIG9mIGluZGV4IGNvbHVtbnMgKi8KCU9pZAkJICAgKmluZGV4 Y29sbGF0aW9ucyBwZ19ub2RlX2F0dHIoYXJyYXlfc2l6ZShua2V5Y29sdW1ucykpOwoJLyog T0lEcyBvZiBvcGVyYXRvciBmYW1pbGllcyBmb3IgY29sdW1ucyAqLwoJT2lkCQkgICAqb3Bm YW1pbHkgcGdfbm9kZV9hdHRyKGFycmF5X3NpemUobmtleWNvbHVtbnMpKTsKCS8qIE9JRHMg b2Ygb3BjbGFzcyBkZWNsYXJlZCBpbnB1dCBkYXRhIHR5cGVzICovCglPaWQJCSAgICpvcGNp bnR5cGUgcGdfbm9kZV9hdHRyKGFycmF5X3NpemUobmtleWNvbHVtbnMpKTsKCS8qIE9JRHMg b2YgYnRyZWUgb3BmYW1pbGllcywgaWYgb3JkZXJhYmxlLiAgTlVMTCBpZiBwYXJ0aXRpb25l ZCBpbmRleCAqLwoJT2lkCQkgICAqc29ydG9wZmFtaWx5IHBnX25vZGVfYXR0cihhcnJheV9z aXplKG5rZXljb2x1bW5zKSk7CgkvKiBpcyBzb3J0IG9yZGVyIGRlc2NlbmRpbmc/IG9yIE5V TEwgaWYgcGFydGl0aW9uZWQgaW5kZXggKi8KCWJvb2wJICAgKnJldmVyc2Vfc29ydCBwZ19u b2RlX2F0dHIoYXJyYXlfc2l6ZShua2V5Y29sdW1ucykpOwoJLyogZG8gTlVMTHMgY29tZSBm aXJzdCBpbiB0aGUgc29ydCBvcmRlcj8gb3IgTlVMTCBpZiBwYXJ0aXRpb25lZCBpbmRleCAq LwoJYm9vbAkgICAqbnVsbHNfZmlyc3QgcGdfbm9kZV9hdHRyKGFycmF5X3NpemUobmtleWNv bHVtbnMpKTsKCS8qIG9wY2xhc3Mtc3BlY2lmaWMgb3B0aW9ucyBmb3IgY29sdW1ucyAqLwoJ Ynl0ZWEJICAqKm9wY2xhc3NvcHRpb25zIHBnX25vZGVfYXR0cihyZWFkX3dyaXRlX2lnbm9y ZSk7CgkvKiB3aGljaCBpbmRleCBjb2xzIGNhbiBiZSByZXR1cm5lZCBpbiBhbiBpbmRleC1v bmx5IHNjYW4/ICovCglib29sCSAgICpjYW5yZXR1cm4gcGdfbm9kZV9hdHRyKGFycmF5X3Np emUobmNvbHVtbnMpKTsKCS8qIE9JRCBvZiB0aGUgYWNjZXNzIG1ldGhvZCAoaW4gcGdfYW0p ICovCglPaWQJCQlyZWxhbTsKCgkvKgoJICogZXhwcmVzc2lvbnMgZm9yIG5vbi1zaW1wbGUg aW5kZXggY29sdW1uczsgcmVkdW5kYW50IHRvIHByaW50IHNpbmNlIHdlCgkgKiBwcmludCBp bmRleHRsaXN0CgkgKi8KCUxpc3QJICAgKmluZGV4cHJzIHBnX25vZGVfYXR0cihyZWFkX3dy aXRlX2lnbm9yZSk7CglMaXN0CSAgICppbmRleHByc0V4cGFuZCBwZ19ub2RlX2F0dHIocmVh ZF93cml0ZV9pZ25vcmUpOwoJLyogcHJlZGljYXRlIGlmIGEgcGFydGlhbCBpbmRleCwgZWxz ZSBOSUwgKi8KCUxpc3QJICAgKmluZHByZWQ7CglMaXN0CSAgICppbmRwcmVkRXhwYW5kOwoK CS8qIHRhcmdldGxpc3QgcmVwcmVzZW50aW5nIGluZGV4IGNvbHVtbnMgKi8KCUxpc3QJICAg KmluZGV4dGxpc3Q7CgoJLyoKCSAqIHBhcmVudCByZWxhdGlvbidzIGJhc2VyZXN0cmljdGlu Zm8gbGlzdCwgbGVzcyBhbnkgY29uZGl0aW9ucyBpbXBsaWVkIGJ5CgkgKiB0aGUgaW5kZXgn cyBwcmVkaWNhdGUgKHVubGVzcyBpdCdzIGEgdGFyZ2V0IHJlbCwgc2VlIGNvbW1lbnRzIGlu CgkgKiBjaGVja19pbmRleF9wcmVkaWNhdGVzKCkpCgkgKi8KCUxpc3QJICAgKmluZHJlc3Ry aWN0aW5mbzsKCgkvKiB0cnVlIGlmIGluZGV4IHByZWRpY2F0ZSBtYXRjaGVzIHF1ZXJ5ICov Cglib29sCQlwcmVkT0s7CgkvKiB0cnVlIGlmIGEgdW5pcXVlIGluZGV4ICovCglib29sCQl1 bmlxdWU7CgkvKiB0cnVlIGlmIHRoZSBpbmRleCB3YXMgZGVmaW5lZCB3aXRoIE5VTExTIE5P VCBESVNUSU5DVCAqLwoJYm9vbAkJbnVsbHNub3RkaXN0aW5jdDsKCS8qIGlzIHVuaXF1ZW5l c3MgZW5mb3JjZWQgaW1tZWRpYXRlbHk/ICovCglib29sCQlpbW1lZGlhdGU7CgkvKiB0cnVl IGlmIHBhdGhzIHVzaW5nIHRoaXMgaW5kZXggc2hvdWxkIGJlIG1hcmtlZCBkaXNhYmxlZCAq LwoJYm9vbAkJZGlzYWJsZWQ7CgkvKiB0cnVlIGlmIGluZGV4IGRvZXNuJ3QgcmVhbGx5IGV4 aXN0ICovCglib29sCQloeXBvdGhldGljYWw7CgoJLyoKCSAqIFJlbWFpbmluZyBmaWVsZHMg YXJlIGNvcGllZCBmcm9tIHRoZSBpbmRleCBBTSdzIEFQSSBzdHJ1Y3QKCSAqIChJbmRleEFt Um91dGluZSkuICBUaGVzZSBmaWVsZHMgYXJlIG5vdCBzZXQgZm9yIHBhcnRpdGlvbmVkIGlu ZGV4ZXMuCgkgKi8KCWJvb2wJCWFtY2Fub3JkZXJieW9wOwoJYm9vbAkJYW1vcHRpb25hbGtl eTsKCWJvb2wJCWFtc2VhcmNoYXJyYXk7Cglib29sCQlhbXNlYXJjaG51bGxzOwoJLyogZG9l cyBBTSBoYXZlIGFtZ2V0dHVwbGUgaW50ZXJmYWNlPyAqLwoJYm9vbAkJYW1oYXNnZXR0dXBs ZTsKCS8qIGRvZXMgQU0gaGF2ZSBhbWdldGJpdG1hcCBpbnRlcmZhY2U/ICovCglib29sCQlh bWhhc2dldGJpdG1hcDsKCWJvb2wJCWFtY2FucGFyYWxsZWw7CgkvKiBkb2VzIEFNIGhhdmUg YW1tYXJrcG9zIGludGVyZmFjZT8gKi8KCWJvb2wJCWFtY2FubWFya3BvczsKCS8qIEFNJ3Mg Y29zdCBlc3RpbWF0b3IgKi8KCS8qIFJhdGhlciB0aGFuIGluY2x1ZGUgYW1hcGkuaCBoZXJl LCB3ZSBkZWNsYXJlIGFtY29zdGVzdGltYXRlIGxpa2UgdGhpcyAqLwoJdm9pZAkJKCphbWNv c3Rlc3RpbWF0ZSkgKHN0cnVjdCBQbGFubmVySW5mbyAqLCBzdHJ1Y3QgSW5kZXhQYXRoICos IGRvdWJsZSwgQ29zdCAqLCBDb3N0ICosIFNlbGVjdGl2aXR5ICosIGRvdWJsZSAqLCBkb3Vi bGUgKikgcGdfbm9kZV9hdHRyKHJlYWRfd3JpdGVfaWdub3JlKTsKfSBJbmRleE9wdEluZm87 CgovKgogKiBGb3JlaWduS2V5T3B0SW5mbwogKgkJUGVyLWZvcmVpZ24ta2V5IGluZm9ybWF0 aW9uIGZvciBwbGFubmluZy9vcHRpbWl6YXRpb24KICoKICogVGhlIHBlci1GSy1jb2x1bW4g YXJyYXlzIGNhbiBiZSBmaXhlZC1zaXplIGJlY2F1c2Ugd2UgYWxsb3cgYXQgbW9zdAogKiBJ TkRFWF9NQVhfS0VZUyBjb2x1bW5zIGluIGEgZm9yZWlnbiBrZXkgY29uc3RyYWludC4gIEVh Y2ggYXJyYXkgaGFzCiAqIG5rZXlzIHZhbGlkIGVudHJpZXMuCiAqLwp0eXBlZGVmIHN0cnVj dCBGb3JlaWduS2V5T3B0SW5mbwp7CglwZ19ub2RlX2F0dHIoY3VzdG9tX3JlYWRfd3JpdGUs IG5vX2NvcHlfZXF1YWwsIG5vX3JlYWQsIG5vX3F1ZXJ5X2p1bWJsZSkKCglOb2RlVGFnCQl0 eXBlOwoKCS8qCgkgKiBCYXNpYyBkYXRhIGFib3V0IHRoZSBmb3JlaWduIGtleSAoZmV0Y2hl ZCBmcm9tIGNhdGFsb2dzKToKCSAqLwoKCS8qIFJUIGluZGV4IG9mIHRoZSByZWZlcmVuY2lu ZyB0YWJsZSAqLwoJSW5kZXgJCWNvbl9yZWxpZDsKCS8qIFJUIGluZGV4IG9mIHRoZSByZWZl cmVuY2VkIHRhYmxlICovCglJbmRleAkJcmVmX3JlbGlkOwoJLyogbnVtYmVyIG9mIGNvbHVt bnMgaW4gdGhlIGZvcmVpZ24ga2V5ICovCglpbnQJCQlua2V5czsKCS8qIGNvbHMgaW4gcmVm ZXJlbmNpbmcgdGFibGUgKi8KCUF0dHJOdW1iZXIJY29ua2V5W0lOREVYX01BWF9LRVlTXSBw Z19ub2RlX2F0dHIoYXJyYXlfc2l6ZShua2V5cykpOwoJLyogY29scyBpbiByZWZlcmVuY2Vk IHRhYmxlICovCglBdHRyTnVtYmVyCWNvbmZrZXlbSU5ERVhfTUFYX0tFWVNdIHBnX25vZGVf YXR0cihhcnJheV9zaXplKG5rZXlzKSk7CgkvKiBQSyA9IEZLIG9wZXJhdG9yIE9JRHMgKi8K CU9pZAkJCWNvbnBmZXFvcFtJTkRFWF9NQVhfS0VZU10gcGdfbm9kZV9hdHRyKGFycmF5X3Np emUobmtleXMpKTsKCgkvKgoJICogRGVyaXZlZCBpbmZvIGFib3V0IHdoZXRoZXIgRksncyBl cXVhbGl0eSBjb25kaXRpb25zIG1hdGNoIHRoZSBxdWVyeToKCSAqLwoKCS8qICMgb2YgRksg Y29scyBtYXRjaGVkIGJ5IEVDcyAqLwoJaW50CQkJbm1hdGNoZWRfZWM7CgkvKiAjIG9mIHRo ZXNlIEVDcyB0aGF0IGFyZSBlY19oYXNfY29uc3QgKi8KCWludAkJCW5jb25zdF9lYzsKCS8q ICMgb2YgRksgY29scyBtYXRjaGVkIGJ5IG5vbi1FQyByaW5mb3MgKi8KCWludAkJCW5tYXRj aGVkX3Jjb2xzOwoJLyogdG90YWwgIyBvZiBub24tRUMgcmluZm9zIG1hdGNoZWQgdG8gRksg Ki8KCWludAkJCW5tYXRjaGVkX3JpOwoJLyogUG9pbnRlciB0byBlY2xhc3MgbWF0Y2hpbmcg ZWFjaCBjb2x1bW4ncyBjb25kaXRpb24sIGlmIHRoZXJlIGlzIG9uZSAqLwoJc3RydWN0IEVx dWl2YWxlbmNlQ2xhc3MgKmVjbGFzc1tJTkRFWF9NQVhfS0VZU107CgkvKiBQb2ludGVyIHRv IGVjbGFzcyBtZW1iZXIgZm9yIHRoZSByZWZlcmVuY2luZyBWYXIsIGlmIHRoZXJlIGlzIG9u ZSAqLwoJc3RydWN0IEVxdWl2YWxlbmNlTWVtYmVyICpma19lY2xhc3NfbWVtYmVyW0lOREVY X01BWF9LRVlTXTsKCS8qIExpc3Qgb2Ygbm9uLUVDIFJlc3RyaWN0SW5mb3MgbWF0Y2hpbmcg ZWFjaCBjb2x1bW4ncyBjb25kaXRpb24gKi8KCUxpc3QJICAgKnJpbmZvc1tJTkRFWF9NQVhf S0VZU107Cn0gRm9yZWlnbktleU9wdEluZm87CgovKgogKiBTdGF0aXN0aWNFeHRJbmZvCiAq CQlJbmZvcm1hdGlvbiBhYm91dCBleHRlbmRlZCBzdGF0aXN0aWNzIGZvciBwbGFubmluZy9v cHRpbWl6YXRpb24KICoKICogRWFjaCBwZ19zdGF0aXN0aWNfZXh0IHJvdyBpcyByZXByZXNl bnRlZCBieSBvbmUgb3IgbW9yZSBub2RlcyBvZiB0aGlzCiAqIHR5cGUsIG9yIGV2ZW4gemVy byBpZiBBTkFMWVpFIGhhcyBub3QgY29tcHV0ZWQgdGhlbS4KICovCnR5cGVkZWYgc3RydWN0 IFN0YXRpc3RpY0V4dEluZm8KewoJcGdfbm9kZV9hdHRyKG5vX2NvcHlfZXF1YWwsIG5vX3Jl YWQsIG5vX3F1ZXJ5X2p1bWJsZSkKCglOb2RlVGFnCQl0eXBlOwoKCS8qIE9JRCBvZiB0aGUg c3RhdGlzdGljcyByb3cgKi8KCU9pZAkJCXN0YXRPaWQ7CgoJLyogaW5jbHVkZXMgY2hpbGQg cmVsYXRpb25zICovCglib29sCQlpbmhlcml0OwoKCS8qIGJhY2stbGluayB0byBzdGF0aXN0 aWMncyB0YWJsZTsgZG9uJ3QgcHJpbnQsIGVsc2UgaW5maW5pdGUgcmVjdXJzaW9uICovCglS ZWxPcHRJbmZvICpyZWwgcGdfbm9kZV9hdHRyKHJlYWRfd3JpdGVfaWdub3JlKTsKCgkvKiBz dGF0aXN0aWNzIGtpbmQgb2YgdGhpcyBlbnRyeSAqLwoJY2hhcgkJa2luZDsKCgkvKiBhdHRu dW1zIG9mIHRoZSBjb2x1bW5zIGNvdmVyZWQgKi8KCUJpdG1hcHNldCAgKmtleXM7CgoJLyog ZXhwcmVzc2lvbnMgKi8KCUxpc3QJICAgKmV4cHJzOwp9IFN0YXRpc3RpY0V4dEluZm87Cgov KgogKiBKb2luRG9tYWlucwogKgogKiBBICJqb2luIGRvbWFpbiIgZGVmaW5lcyB0aGUgc2Nv cGUgb2YgYXBwbGljYWJpbGl0eSBvZiBkZWR1Y3Rpb25zIG1hZGUgdmlhCiAqIHRoZSBFcXVp dmFsZW5jZUNsYXNzIG1lY2hhbmlzbS4gIFJvdWdobHkgc3BlYWtpbmcsIGEgam9pbiBkb21h aW4gaXMgYSBzZXQKICogb2YgYmFzZStPSiByZWxhdGlvbnMgdGhhdCBhcmUgaW5uZXItam9p bmVkIHRvZ2V0aGVyLiAgTW9yZSBwcmVjaXNlbHksIGl0IGlzCiAqIHRoZSBzZXQgb2YgcmVs YXRpb25zIGF0IHdoaWNoIGVxdWFsaXRpZXMgZGVkdWNlZCBmcm9tIGFuIEVxdWl2YWxlbmNl Q2xhc3MKICogY2FuIGJlIGVuZm9yY2VkIG9yIHNob3VsZCBiZSBleHBlY3RlZCB0byBob2xk LiAgVGhlIHRvcG1vc3QgSm9pbkRvbWFpbgogKiBjb3ZlcnMgdGhlIHdob2xlIHF1ZXJ5IChz byBpdHMgamRfcmVsaWRzIHNob3VsZCBlcXVhbCBhbGxfcXVlcnlfcmVscykuCiAqIEFuIG91 dGVyIGpvaW4gY3JlYXRlcyBhIG5ldyBKb2luRG9tYWluIHRoYXQgaW5jbHVkZXMgYWxsIGJh c2UrT0ogcmVsaWRzCiAqIHdpdGhpbiBpdHMgbnVsbGFibGUgc2lkZSwgYnV0IChieSBjb252 ZW50aW9uKSBub3QgdGhlIE9KJ3Mgb3duIHJlbGlkLgogKiBBIEZVTEwgam9pbiBjcmVhdGVz IHR3byBuZXcgSm9pbkRvbWFpbnMsIG9uZSBmb3IgZWFjaCBzaWRlLgogKgogKiBOb3RpY2Ug dGhhdCBhIHJlbCB0aGF0IGlzIGJlbG93IG91dGVyIGpvaW4ocykgd2lsbCB0aHVzIGFwcGVh ciB0byBiZWxvbmcKICogdG8gbXVsdGlwbGUgam9pbiBkb21haW5zLiAgSG93ZXZlciwgYW55 IG9mIGl0cyBWYXJzIHRoYXQgYXBwZWFyIGluCiAqIEVxdWl2YWxlbmNlQ2xhc3NlcyBiZWxv bmdpbmcgdG8gaGlnaGVyIGpvaW4gZG9tYWlucyB3aWxsIGhhdmUgbnVsbGluZ3JlbAogKiBi aXRzIHByZXZlbnRpbmcgdGhlbSBmcm9tIGJlaW5nIGV2YWx1YXRlZCBhdCB0aGUgcmVsJ3Mg c2NhbiBsZXZlbCwgc28gdGhhdAogKiB3ZSB3aWxsIG5vdCBiZSBhYmxlIHRvIGRlcml2ZSBl bmZvcmNlYWJsZS1hdC10aGUtcmVsLXNjYW4tbGV2ZWwgY2xhdXNlcwogKiBmcm9tIHN1Y2gg RUNzLiAgV2UgZGVmaW5lIHRoZSBqb2luIGRvbWFpbiByZWxpZCBzZXRzIHRoaXMgd2F5IHNv IHRoYXQKICogZG9tYWlucyBjYW4gYmUgc2FpZCB0byBiZSAiaGlnaGVyIiBvciAibG93ZXIi IHdoZW4gb25lIGRvbWFpbiByZWxpZCBzZXQKICogaW5jbHVkZXMgYW5vdGhlci4KICoKICog VGhlIEpvaW5Eb21haW5zIGZvciBhIHF1ZXJ5IGFyZSBjb21wdXRlZCBpbiBkZWNvbnN0cnVj dF9qb2ludHJlZS4KICogV2UgZG8gbm90IGNvcHkgSm9pbkRvbWFpbiBzdHJ1Y3RzIG9uY2Ug bWFkZSwgc28gdGhleSBjYW4gYmUgY29tcGFyZWQKICogZm9yIGVxdWFsaXR5IGJ5IHNpbXBs ZSBwb2ludGVyIGVxdWFsaXR5LgogKi8KdHlwZWRlZiBzdHJ1Y3QgSm9pbkRvbWFpbgp7Cglw Z19ub2RlX2F0dHIobm9fY29weV9lcXVhbCwgbm9fcmVhZCwgbm9fcXVlcnlfanVtYmxlKQoK CU5vZGVUYWcJCXR5cGU7CgoJUmVsaWRzCQlqZF9yZWxpZHM7CQkvKiBhbGwgcmVsaWRzIGNv bnRhaW5lZCB3aXRoaW4gdGhlIGRvbWFpbiAqLwp9IEpvaW5Eb21haW47CgovKgogKiBFcXVp dmFsZW5jZUNsYXNzZXMKICoKICogV2hlbmV2ZXIgd2UgaWRlbnRpZnkgYSBtZXJnZWpvaW5h YmxlIGVxdWFsaXR5IGNsYXVzZSBBID0gQiB0aGF0IGlzCiAqIG5vdCBhbiBvdXRlci1qb2lu IGNsYXVzZSwgd2UgY3JlYXRlIGFuIEVxdWl2YWxlbmNlQ2xhc3MgY29udGFpbmluZwogKiB0 aGUgZXhwcmVzc2lvbnMgQSBhbmQgQiB0byByZWNvcmQgdGhpcyBrbm93bGVkZ2UuICBJZiB3 ZSBsYXRlciBmaW5kIGFub3RoZXIKICogZXF1aXZhbGVuY2UgQiA9IEMsIHdlIGFkZCBDIHRv IHRoZSBleGlzdGluZyBFcXVpdmFsZW5jZUNsYXNzOyB0aGlzIG1heQogKiByZXF1aXJlIG1l cmdpbmcgdHdvIGV4aXN0aW5nIEVxdWl2YWxlbmNlQ2xhc3Nlcy4gIEF0IHRoZSBlbmQgb2Yg dGhlIHF1YWwKICogZGlzdHJpYnV0aW9uIHByb2Nlc3MsIHdlIGhhdmUgc2V0cyBvZiB2YWx1 ZXMgdGhhdCBhcmUga25vd24gYWxsIHRyYW5zaXRpdmVseQogKiBlcXVhbCB0byBlYWNoIG90 aGVyLCB3aGVyZSAiZXF1YWwiIGlzIGFjY29yZGluZyB0byB0aGUgcnVsZXMgb2YgdGhlIGJ0 cmVlCiAqIG9wZXJhdG9yIGZhbWlseShzKSBzaG93biBpbiBlY19vcGZhbWlsaWVzLCBhcyB3 ZWxsIGFzIHRoZSBjb2xsYXRpb24gc2hvd24KICogYnkgZWNfY29sbGF0aW9uLiAgKFdlIHJl c3RyaWN0IGFuIEVDIHRvIGNvbnRhaW4gb25seSBlcXVhbGl0aWVzIHdob3NlCiAqIG9wZXJh dG9ycyBiZWxvbmcgdG8gdGhlIHNhbWUgc2V0IG9mIG9wZmFtaWxpZXMuICBUaGlzIGNvdWxk IHByb2JhYmx5IGJlCiAqIHJlbGF4ZWQsIGJ1dCBmb3Igbm93IGl0J3Mgbm90IHdvcnRoIHRo ZSB0cm91YmxlLCBzaW5jZSBuZWFybHkgYWxsIGVxdWFsaXR5CiAqIG9wZXJhdG9ycyBiZWxv bmcgdG8gb25seSBvbmUgYnRyZWUgb3BjbGFzcyBhbnl3YXkuICBTaW1pbGFybHksIHdlIHN1 cHBvc2UKICogdGhhdCBhbGwgb3Igbm9uZSBvZiB0aGUgaW5wdXQgZGF0YXR5cGVzIGFyZSBj b2xsYXRhYmxlLCBzbyB0aGF0IGEgc2luZ2xlCiAqIGNvbGxhdGlvbiB2YWx1ZSBpcyBzdWZm aWNpZW50LikKICoKICogU3RyaWN0bHkgc3BlYWtpbmcsIGRlZHVjdGlvbnMgZnJvbSBhbiBF cXVpdmFsZW5jZUNsYXNzIGhvbGQgb25seSB3aXRoaW4KICogYSAiam9pbiBkb21haW4iLCB0 aGF0IGlzIGEgc2V0IG9mIHJlbGF0aW9ucyB0aGF0IGFyZSBpbm5lcmpvaW5lZCB0b2dldGhl cgogKiAoc2VlIEpvaW5Eb21haW4gYWJvdmUpLiAgRm9yIHRoZSBtb3N0IHBhcnQgd2UgZG9u J3QgbmVlZCB0byBhY2NvdW50IGZvcgogKiB0aGlzIGV4cGxpY2l0bHksIGJlY2F1c2UgZXF1 YWxpdHkgY2xhdXNlcyBmcm9tIGRpZmZlcmVudCBqb2luIGRvbWFpbnMKICogd2lsbCBjb250 YWluIFZhcnMgdGhhdCBhcmUgbm90IGVxdWFsKCkgYmVjYXVzZSB0aGV5IGhhdmUgZGlmZmVy ZW50CiAqIG51bGxpbmdyZWwgc2V0cywgYW5kIHRodXMgd2Ugd2lsbCBuZXZlciBmYWxzZWx5 IG1lcmdlIEVDcyBmcm9tIGRpZmZlcmVudAogKiBqb2luIGRvbWFpbnMuICBCdXQgVmFyLWZy ZWUgKHBzZXVkb2NvbnN0YW50KSBleHByZXNzaW9ucyBsYWNrIHRoYXQgc2FmZXR5CiAqIGZl YXR1cmUuICBXZSBoYW5kbGUgdGhhdCBieSBtYXJraW5nICJjb25zdCIgRUMgbWVtYmVycyB3 aXRoIHRoZSBKb2luRG9tYWluCiAqIG9mIHRoZSBjbGF1c2UgdGhleSBjYW1lIGZyb207IHR3 byBub21pbmFsbHktZXF1YWwgY29uc3QgbWVtYmVycyB3aWxsIGJlCiAqIGNvbnNpZGVyZWQg ZGlmZmVyZW50IGlmIHRoZXkgY2FtZSBmcm9tIGRpZmZlcmVudCBKb2luRG9tYWlucy4gIFRo aXMgZW5zdXJlcwogKiBubyBmYWxzZSBFcXVpdmFsZW5jZUNsYXNzIG1lcmdlcyB3aWxsIG9j Y3VyLgogKgogKiBXZSBhbHNvIHVzZSBFcXVpdmFsZW5jZUNsYXNzZXMgYXMgdGhlIGJhc2Ug c3RydWN0dXJlIGZvciBQYXRoS2V5cywgbGV0dGluZwogKiB1cyByZXByZXNlbnQga25vd2xl ZGdlIGFib3V0IGRpZmZlcmVudCBzb3J0IG9yZGVyaW5ncyBiZWluZyBlcXVpdmFsZW50Lgog KiBTaW5jZSBldmVyeSBQYXRoS2V5IG11c3QgcmVmZXJlbmNlIGFuIEVxdWl2YWxlbmNlQ2xh c3MsIHdlIHdpbGwgZW5kIHVwCiAqIHdpdGggc2luZ2xlLW1lbWJlciBFcXVpdmFsZW5jZUNs YXNzZXMgd2hlbmV2ZXIgYSBzb3J0IGtleSBleHByZXNzaW9uIGhhcwogKiBub3QgYmVlbiBl cXVpdmFsZW5jZWQgdG8gYW55dGhpbmcgZWxzZS4gIEl0IGlzIGFsc28gcG9zc2libGUgdGhh dCBzdWNoIGFuCiAqIEVxdWl2YWxlbmNlQ2xhc3Mgd2lsbCBjb250YWluIGEgdm9sYXRpbGUg ZXhwcmVzc2lvbiAoIk9SREVSIEJZIHJhbmRvbSgpIiksCiAqIHdoaWNoIGlzIGEgY2FzZSB0 aGF0IGNhbid0IGFyaXNlIG90aGVyd2lzZSBzaW5jZSBjbGF1c2VzIGNvbnRhaW5pbmcKICog dm9sYXRpbGUgZnVuY3Rpb25zIGFyZSBuZXZlciBjb25zaWRlcmVkIG1lcmdlam9pbmFibGUu ICBXZSBtYXJrIHN1Y2gKICogRXF1aXZhbGVuY2VDbGFzc2VzIHNwZWNpYWxseSB0byBwcmV2 ZW50IHRoZW0gZnJvbSBiZWluZyBtZXJnZWQgd2l0aAogKiBvcmRpbmFyeSBFcXVpdmFsZW5j ZUNsYXNzZXMuICBBbHNvLCBmb3Igdm9sYXRpbGUgZXhwcmVzc2lvbnMgd2UgaGF2ZQogKiB0 byBiZSBjYXJlZnVsIHRvIG1hdGNoIHRoZSBFcXVpdmFsZW5jZUNsYXNzIHRvIHRoZSBjb3Jy ZWN0IHRhcmdldGxpc3QKICogZW50cnk6IGNvbnNpZGVyIFNFTEVDVCByYW5kb20oKSBBUyBh LCByYW5kb20oKSBBUyBiIC4uLiBPUkRFUiBCWSBiLGEuCiAqIFNvIHdlIHJlY29yZCB0aGUg U29ydEdyb3VwUmVmIG9mIHRoZSBvcmlnaW5hdGluZyBzb3J0IGNsYXVzZS4KICoKICogRGVy aXZlZCBlcXVhbGl0eSBjbGF1c2VzIGFyZSBzdG9yZWQgaW4gZWNfZGVyaXZlc19saXN0LiBG b3Igc21hbGwgcXVlcmllcywKICogdGhpcyBsaXN0IGlzIHNjYW5uZWQgZGlyZWN0bHkgZHVy aW5nIGxvb2t1cC4gRm9yIGxhcmdlciBxdWVyaWVzIC0tIGUuZy4sCiAqIHdpdGggbWFueSBw YXJ0aXRpb25zIG9yIGpvaW5zIC0tIGEgaGFzaCB0YWJsZSAoZWNfZGVyaXZlc19oYXNoKSBp cyBidWlsdAogKiB3aGVuIHRoZSBsaXN0IGdyb3dzIGJleW9uZCBhIHRocmVzaG9sZCwgZm9y IGZhc3RlciBsb29rdXAuIFdoZW4gcHJlc2VudCwKICogdGhlIGhhc2ggdGFibGUgY29udGFp bnMgdGhlIHNhbWUgUmVzdHJpY3RJbmZvcyBhbmQgaXMgbWFpbnRhaW5lZCBhbG9uZ3NpZGUK ICogdGhlIGxpc3QuIFdlIHJldGFpbiB0aGUgbGlzdCBldmVuIHdoZW4gdGhlIGhhc2ggaXMg dXNlZCB0byBzaW1wbGlmeQogKiBzZXJpYWxpemF0aW9uIChlLmcuLCBpbiBfb3V0RXF1aXZh bGVuY2VDbGFzcygpKSBhbmQgc3VwcG9ydAogKiBFcXVpdmFsZW5jZUNsYXNzIG1lcmdpbmcu CiAqCiAqIEluIGNvbnRyYXN0LCBlY19zb3VyY2VzIGhvbGRzIGVxdWFsaXR5IGNsYXVzZXMg dGhhdCBhcHBlYXIgZGlyZWN0bHkgaW4gdGhlCiAqIHF1ZXJ5LiBUaGVzZSBhcmUgdHlwaWNh bGx5IGZldyBhbmQgZG8gbm90IHJlcXVpcmUgYSBoYXNoIHRhYmxlIGZvciBsb29rdXAuCiAq CiAqICdlY19tZW1iZXJzJyBpcyBhIExpc3Qgb2YgYWxsICFlbV9pc19jaGlsZCBFcXVpdmFs ZW5jZU1lbWJlcnMgaW4gdGhlIGNsYXNzLgogKiBFcXVpdmFsZW5jZU1lbWJlcnMgZm9yIGFu eSBSRUxPUFRfT1RIRVJfTUVNQkVSX1JFTCBhbmQgUkVMT1BUX09USEVSX0pPSU5SRUwKICog cmVsYXRpb25zIGFyZSBzdG9yZWQgaW4gdGhlICdlY19jaGlsZG1lbWJlcnMnIGFycmF5IGlu IHRoZSBpbmRleAogKiBjb3JyZXNwb25kaW5nIHRvIHRoZSByZWxpZCwgb3IgZmlyc3QgY29t cG9uZW50IHJlbGlkIGluIHRoZSBjYXNlIG9mCiAqIFJFTE9QVF9PVEhFUl9KT0lOUkVMcy4g ICdlY19jaGlsZG1lbWJlcnMnIGlzIE5VTEwgaWYgdGhlIGNsYXNzIGhhcyBubyBjaGlsZAog KiBFcXVpdmFsZW5jZU1lbWJlcnMuCiAqCiAqIEZvciBjb2RlIHdpc2hpbmcgdG8gbG9vayBh dCBFcXVpdmFsZW5jZU1lbWJlcnMsIGlmIG9ubHkgcGFyZW50LWxldmVsCiAqIG1lbWJlcnMg YXJlIG5lZWRlZCwgdGhlbiBhIHNpbXBsZSBmb3JlYWNoIGxvb3Agb3ZlciBlY19tZW1iZXJz IGlzCiAqIHN1ZmZpY2llbnQuICBXaGVuIGNoaWxkIG1lbWJlcnMgYXJlIGFsc28gcmVxdWly ZWQsIGl0IGlzIGJlc3QgdG8gdXNlIHRoZQogKiBmdW5jdGlvbmFsaXR5IHByb3ZpZGVkIGJ5 IEVxdWl2YWxlbmNlTWVtYmVySXRlcmF0b3IuICBUaGlzIHZpc2l0cyBhbGwKICogcGFyZW50 IG1lbWJlcnMgYW5kIG9ubHkgdGhlIHJlbGV2YW50IGNoaWxkIG1lbWJlcnMuICBUaGUgcmVh c29uIGZvciB0aGlzCiAqIGlzIHRoYXQgbGFyZ2UgbnVtYmVycyBvZiBjaGlsZCBFcXVpdmFs ZW5jZU1lbWJlcnMgY2FuIGV4aXN0IGluIHF1ZXJpZXMgdG8KICogcGFydGl0aW9uZWQgdGFi bGVzIHdpdGggbWFueSBwYXJ0aXRpb25zLiAgVGhlIGZ1bmN0aW9uYWxpdHkgcHJvdmlkZWQg YnkKICogRXF1aXZhbGVuY2VNZW1iZXJJdGVyYXRvciBhbGxvd3MgZWZmaWNpZW50IGFjY2Vz cyB0byBFcXVpdmFsZW5jZU1lbWJlcnMKICogd2hpY2ggYmVsb25nIHRvIHNwZWNpZmljIGNo aWxkIHJlbGlkcy4gIFNlZSB0aGUgaGVhZGVyIGNvbW1lbnRzIGZvcgogKiBFcXVpdmFsZW5j ZU1lbWJlckl0ZXJhdG9yIGJlbG93IGZvciBmdXJ0aGVyIGRldGFpbHMuCiAqCiAqIE5COiBp ZiBlY19tZXJnZWQgaXNuJ3QgTlVMTCwgdGhpcyBjbGFzcyBoYXMgYmVlbiBtZXJnZWQgaW50 byBhbm90aGVyLCBhbmQKICogc2hvdWxkIGJlIGlnbm9yZWQgaW4gZmF2b3Igb2YgdXNpbmcg dGhlIHBvaW50ZWQtdG8gY2xhc3MuCiAqCiAqIE5COiBFcXVpdmFsZW5jZUNsYXNzZXMgYXJl IG5ldmVyIGNvcGllZCBhZnRlciBjcmVhdGlvbi4gIFRoZXJlZm9yZSwKICogY29weU9iamVj dCgpIGNvcGllcyBwb2ludGVycyB0byB0aGVtIGFzIHBvaW50ZXJzLCBhbmQgZXF1YWwoKSBj b21wYXJlcwogKiBwb2ludGVycyB0byBFcXVpdmFsZW5jZUNsYXNzZXMgdmlhIHBvaW50ZXIg ZXF1YWxpdHkuICBUaGlzIGlzIGltcGxlbWVudGVkCiAqIGJ5IHB1dHRpbmcgY29weV9hc19z Y2FsYXIgYW5kIGVxdWFsX2FzX3NjYWxhciBhdHRyaWJ1dGVzIG9uIGZpZWxkcyB0aGF0CiAq IGFyZSBwb2ludGVycyB0byBFcXVpdmFsZW5jZUNsYXNzZXMuICBUaGUgc2FtZSBnb2VzIGZv ciBFcXVpdmFsZW5jZU1lbWJlcnMuCiAqLwp0eXBlZGVmIHN0cnVjdCBFcXVpdmFsZW5jZUNs YXNzCnsKCXBnX25vZGVfYXR0cihjdXN0b21fcmVhZF93cml0ZSwgbm9fY29weV9lcXVhbCwg bm9fcmVhZCwgbm9fcXVlcnlfanVtYmxlKQoKCU5vZGVUYWcJCXR5cGU7CgoJTGlzdAkgICAq ZWNfb3BmYW1pbGllczsJLyogYnRyZWUgb3BlcmF0b3IgZmFtaWx5IE9JRHMgKi8KCU9pZAkJ CWVjX2NvbGxhdGlvbjsJLyogY29sbGF0aW9uLCBpZiBkYXRhdHlwZXMgYXJlIGNvbGxhdGFi bGUgKi8KCWludAkJCWVjX2NoaWxkbWVtYmVyc19zaXplOwkvKiAjIGVsZW1lbnRzIGluIGVj X2NoaWxkbWVtYmVycyAqLwoJTGlzdAkgICAqZWNfbWVtYmVyczsJCS8qIGxpc3Qgb2YgRXF1 aXZhbGVuY2VNZW1iZXJzICovCglMaXN0CSAgKiplY19jaGlsZG1lbWJlcnM7CS8qIGFycmF5 IG9mIExpc3RzIG9mIGNoaWxkIG1lbWJlcnMgKi8KCUxpc3QJICAgKmVjX3NvdXJjZXM7CQkv KiBsaXN0IG9mIGdlbmVyYXRpbmcgUmVzdHJpY3RJbmZvcyAqLwoJTGlzdAkgICAqZWNfZGVy aXZlc19saXN0OwkvKiBsaXN0IG9mIGRlcml2ZWQgUmVzdHJpY3RJbmZvcyAqLwoJc3RydWN0 IGRlcml2ZXNfaGFzaCAqZWNfZGVyaXZlc19oYXNoOwkvKiBvcHRpb25hbCBoYXNoIHRhYmxl IGZvciBmYXN0CgkJCQkJCQkJCQkJICogbG9va3VwOyBjb250YWlucyBzYW1lCgkJCQkJCQkJ CQkJICogUmVzdHJpY3RJbmZvcyBhcyBsaXN0ICovCglSZWxpZHMJCWVjX3JlbGlkczsJCS8q IGFsbCByZWxpZHMgYXBwZWFyaW5nIGluIGVjX21lbWJlcnMsIGV4Y2VwdAoJCQkJCQkJCSAq IGZvciBjaGlsZCBtZW1iZXJzIChzZWUgYmVsb3cpICovCglib29sCQllY19oYXNfY29uc3Q7 CS8qIGFueSBwc2V1ZG9jb25zdGFudHMgaW4gZWNfbWVtYmVycz8gKi8KCWJvb2wJCWVjX2hh c192b2xhdGlsZTsJLyogdGhlIChzb2xlKSBtZW1iZXIgaXMgYSB2b2xhdGlsZSBleHByICov Cglib29sCQllY19icm9rZW47CQkvKiBmYWlsZWQgdG8gZ2VuZXJhdGUgbmVlZGVkIGNsYXVz ZXM/ICovCglJbmRleAkJZWNfc29ydHJlZjsJCS8qIG9yaWdpbmF0aW5nIHNvcnRjbGF1c2Ug bGFiZWwsIG9yIDAgKi8KCUluZGV4CQllY19taW5fc2VjdXJpdHk7CS8qIG1pbmltdW0gc2Vj dXJpdHlfbGV2ZWwgaW4gZWNfc291cmNlcyAqLwoJSW5kZXgJCWVjX21heF9zZWN1cml0eTsJ LyogbWF4aW11bSBzZWN1cml0eV9sZXZlbCBpbiBlY19zb3VyY2VzICovCglzdHJ1Y3QgRXF1 aXZhbGVuY2VDbGFzcyAqZWNfbWVyZ2VkOyAvKiBzZXQgaWYgbWVyZ2VkIGludG8gYW5vdGhl ciBFQyAqLwp9IEVxdWl2YWxlbmNlQ2xhc3M7CgovKgogKiBJZiBhbiBFQyBjb250YWlucyBh IGNvbnN0YW50LCBhbnkgUGF0aEtleSBkZXBlbmRpbmcgb24gaXQgbXVzdCBiZQogKiByZWR1 bmRhbnQsIHNpbmNlIHRoZXJlJ3Mgb25seSBvbmUgcG9zc2libGUgdmFsdWUgb2YgdGhlIGtl eS4KICovCiNkZWZpbmUgRUNfTVVTVF9CRV9SRURVTkRBTlQoZWNsYXNzKSAgXAoJKChlY2xh c3MpLT5lY19oYXNfY29uc3QpCgovKgogKiBFcXVpdmFsZW5jZU1lbWJlciAtIG9uZSBtZW1i ZXIgZXhwcmVzc2lvbiBvZiBhbiBFcXVpdmFsZW5jZUNsYXNzCiAqCiAqIGVtX2lzX2NoaWxk IHNpZ25pZmllcyB0aGF0IHRoaXMgZWxlbWVudCB3YXMgYnVpbHQgYnkgdHJhbnNwb3Npbmcg YSBtZW1iZXIKICogZm9yIGFuIGFwcGVuZHJlbCBwYXJlbnQgcmVsYXRpb24gdG8gcmVwcmVz ZW50IHRoZSBjb3JyZXNwb25kaW5nIGV4cHJlc3Npb24KICogZm9yIGFuIGFwcGVuZHJlbCBj aGlsZC4gIFRoZXNlIG1lbWJlcnMgYXJlIHVzZWQgZm9yIGRldGVybWluaW5nIHRoZQogKiBw YXRoa2V5cyBvZiBzY2FucyBvbiB0aGUgY2hpbGQgcmVsYXRpb24gYW5kIGZvciBleHBsaWNp dGx5IHNvcnRpbmcgdGhlCiAqIGNoaWxkIHdoZW4gbmVjZXNzYXJ5IHRvIGJ1aWxkIGEgTWVy Z2VBcHBlbmQgcGF0aCBmb3IgdGhlIHdob2xlIGFwcGVuZHJlbAogKiB0cmVlLiAgQW4gZW1f aXNfY2hpbGQgbWVtYmVyIGhhcyBubyBpbXBhY3Qgb24gdGhlIHByb3BlcnRpZXMgb2YgdGhl IEVDIGFzIGEKICogd2hvbGU7IGluIHBhcnRpY3VsYXIgdGhlIEVDJ3MgZWNfcmVsaWRzIGZp ZWxkIGRvZXMgTk9UIGluY2x1ZGUgdGhlIGNoaWxkCiAqIHJlbGF0aW9uLiAgZW1faXNfY2hp bGQgbWVtYmVycyBhcmVuJ3Qgc3RvcmVkIGluIHRoZSBlY19tZW1iZXJzIExpc3Qgb2YgdGhl CiAqIEVDIGFuZCBpbnN0ZWFkIHRoZXkncmUgc3RvcmVkIGFuZCBpbmRleGVkIGJ5IHRoZSBy ZWxpZHMgb2YgdGhlIGNoaWxkCiAqIHJlbGF0aW9uIHRoZXkgcmVwcmVzZW50IGluIGVjX2No aWxkbWVtYmVycy4gIEFuIGVtX2lzX2NoaWxkIG1lbWJlcgogKiBzaG91bGQgbmV2ZXIgYmUg bWFya2VkIGVtX2lzX2NvbnN0IG5vciBjYXVzZSBlY19oYXNfY29uc3Qgb3IKICogZWNfaGFz X3ZvbGF0aWxlIHRvIGJlIHNldCwgZWl0aGVyLiAgVGh1cywgZW1faXNfY2hpbGQgbWVtYmVy cyBhcmUgbm90CiAqIHJlYWxseSBmdWxsLWZsZWRnZWQgbWVtYmVycyBvZiB0aGUgRUMsIGJ1 dCBqdXN0IHJlZmxlY3Rpb25zIG9yCiAqIGRvcHBlbGdhbmdlcnMgb2YgcmVhbCBtZW1iZXJz LiAgTW9zdCBvcGVyYXRpb25zIG9uIEVxdWl2YWxlbmNlQ2xhc3NlcwogKiBzaG91bGQgaWdu b3JlIGVtX2lzX2NoaWxkIG1lbWJlcnMgYnkgb25seSBpbnNwZWN0aW5nIG1lbWJlcnMgaW4g dGhlCiAqIGVjX21lbWJlcnMgbGlzdC4gIENhbGxlcnMgdGhhdCByZXF1aXJlIGluc3BlY3Rp bmcgY2hpbGQgbWVtYmVycyBzaG91bGQgZG8KICogc28gdXNpbmcgYW4gRXF1aXZhbGVuY2VN ZW1iZXJJdGVyYXRvciBhbmQgc2hvdWxkIHRlc3QgZW1fcmVsaWRzIHRvIG1ha2UKICogc3Vy ZSB0aGV5IG9ubHkgY29uc2lkZXIgcmVsZXZhbnQgbWVtYmVycy4KICoKICogZW1fZGF0YXR5 cGUgaXMgdXN1YWxseSB0aGUgc2FtZSBhcyBleHByVHlwZShlbV9leHByKSwgYnV0IGNhbiBi ZQogKiBkaWZmZXJlbnQgd2hlbiBkZWFsaW5nIHdpdGggYSBiaW5hcnktY29tcGF0aWJsZSBv cGZhbWlseTsgaW4gcGFydGljdWxhcgogKiBhbnlhcnJheV9vcHMgd291bGQgbmV2ZXIgd29y ayB3aXRob3V0IHRoaXMuICBVc2UgZW1fZGF0YXR5cGUgd2hlbgogKiBsb29raW5nIHVwIGEg c3BlY2lmaWMgYnRyZWUgb3BlcmF0b3IgdG8gd29yayB3aXRoIHRoaXMgZXhwcmVzc2lvbi4K ICovCnR5cGVkZWYgc3RydWN0IEVxdWl2YWxlbmNlTWVtYmVyCnsKCXBnX25vZGVfYXR0cihu b19jb3B5X2VxdWFsLCBub19yZWFkLCBub19xdWVyeV9qdW1ibGUpCgoJTm9kZVRhZwkJdHlw ZTsKCglFeHByCSAgICplbV9leHByOwkJLyogdGhlIGV4cHJlc3Npb24gcmVwcmVzZW50ZWQg Ki8KCVJlbGlkcwkJZW1fcmVsaWRzOwkJLyogYWxsIHJlbGlkcyBhcHBlYXJpbmcgaW4gZW1f ZXhwciAqLwoJYm9vbAkJZW1faXNfY29uc3Q7CS8qIGV4cHJlc3Npb24gaXMgcHNldWRvY29u c3RhbnQ/ICovCglib29sCQllbV9pc19jaGlsZDsJLyogZGVyaXZlZCB2ZXJzaW9uIGZvciBh IGNoaWxkIHJlbGF0aW9uPyAqLwoJT2lkCQkJZW1fZGF0YXR5cGU7CS8qIHRoZSAibm9taW5h bCB0eXBlIiB1c2VkIGJ5IHRoZSBvcGZhbWlseSAqLwoJSm9pbkRvbWFpbiAqZW1famRvbWFp bjsJCS8qIGpvaW4gZG9tYWluIGNvbnRhaW5pbmcgdGhlIHNvdXJjZSBjbGF1c2UgKi8KCS8q IGlmIGVtX2lzX2NoaWxkIGlzIHRydWUsIHRoaXMgbGlua3MgdG8gY29ycmVzcG9uZGluZyBF TSBmb3IgdG9wIHBhcmVudCAqLwoJc3RydWN0IEVxdWl2YWxlbmNlTWVtYmVyICplbV9wYXJl bnQgcGdfbm9kZV9hdHRyKHJlYWRfd3JpdGVfaWdub3JlKTsKfSBFcXVpdmFsZW5jZU1lbWJl cjsKCi8qCiAqIEVxdWl2YWxlbmNlTWVtYmVySXRlcmF0b3IKICoKICogRXF1aXZhbGVuY2VN ZW1iZXJJdGVyYXRvciBhbGxvd3MgZWZmaWNpZW50IGFjY2VzcyB0byBzZXRzIG9mCiAqIEVx dWl2YWxlbmNlTWVtYmVycyBmb3IgY2FsbGVycyB3aGljaCByZXF1aXJlIGFjY2VzcyB0byBj aGlsZCBtZW1iZXJzLgogKiBCZWNhdXNlIHBhcnRpdGlvbmluZyB3b3JrbG9hZHMgY2FuIHJl c3VsdCBpbiBsYXJnZSBudW1iZXJzIG9mIGNoaWxkCiAqIG1lbWJlcnMsIHRoZSBjaGlsZCBt ZW1iZXJzIGFyZSBub3Qgc3RvcmVkIGluIHRoZSBFcXVpdmFsZW5jZUNsYXNzJ3MKICogZWNf bWVtYmVycyBMaXN0LiAgSW5zdGVhZCwgdGhlc2UgYXJlIHN0b3JlZCBpbiB0aGUgRXF1aXZh bGVuY2VDbGFzcydzCiAqIGVjX2NoaWxkbWVtYmVycyBhcnJheSBvZiBMaXN0cy4gIFRoZSBm dW5jdGlvbmFsaXR5IHByb3ZpZGVkIGJ5CiAqIEVxdWl2YWxlbmNlTWVtYmVySXRlcmF0b3Ig YWltcyB0byBwcm92aWRlIGVmZmljaWVudCBhY2Nlc3MgdG8gcGFyZW50CiAqIG1lbWJlcnMg YW5kIGNoaWxkIG1lbWJlcnMgYmVsb25naW5nIHRvIHNwZWNpZmljIGNoaWxkIHJlbGlkcy4K ICoKICogQ3VycmVudGx5LCB0aGVyZSBpcyBvbmx5IG9uZSB3YXkgdG8gaW5pdGlhbGl6ZSBh bmQgaXRlcmF0ZSBvdmVyIGFuCiAqIEVxdWl2YWxlbmNlTWVtYmVySXRlcmF0b3IgYW5kIHRo YXQgaXMgdmlhIHRoZSBzZXR1cF9lY2xhc3NfbWVtYmVyX2l0ZXJhdG9yCiAqIGFuZCBlY2xh c3NfbWVtYmVyX2l0ZXJhdG9yX25leHQgZnVuY3Rpb25zLiAgVGhlIGl0ZXJhdG9yIG9iamVj dCBpcwogKiBnZW5lcmFsbHkgYSBsb2NhbCB2YXJpYWJsZSB3aGljaCBpcyBwYXNzZWQgYnkg YWRkcmVzcyB0bwogKiBzZXR1cF9lY2xhc3NfbWVtYmVyX2l0ZXJhdG9yLiAgVGhlIGNhbGxp bmcgZnVuY3Rpb24gZGVmaW5lcyB3aGljaAogKiBFcXVpdmFsZW5jZUNsYXNzIHRoZSBpdGVy YXRvciBzaG91bGQgYmUgbG9va2luZyBhdCBhbmQgd2hpY2ggY2hpbGQKICogcmVsaWRzIHRv IGFsc28gcmV0dXJuIG1lbWJlcnMgZm9yLiAgY2hpbGRfcmVsaWRzIGNhbiBiZSBwYXNzZWQg YXMgTlVMTCwgYnV0CiAqIHRoZSBjYWxsZXIgbWF5IGFzIHdlbGwganVzdCBwZXJmb3JtIGEg Zm9yZWFjaCBsb29wIG92ZXIgZWNfbWVtYmVycyBhcyBvbmx5CiAqIHBhcmVudC1sZXZlbCBt ZW1iZXJzIHdpbGwgYmUgcmV0dXJuZWQgaW4gdGhhdCBjYXNlLgogKgogKiBXaGVuIGNhbGxp bmcgdGhlIG5leHQgZnVuY3Rpb24gb24gYW4gRXF1aXZhbGVuY2VNZW1iZXJJdGVyYXRvciwg YWxsCiAqIHBhcmVudC1sZXZlbCBFcXVpdmFsZW5jZU1lbWJlcnMgYXJlIHJldHVybmVkIGZp cnN0LCBmb2xsb3dlZCBieSBhbGwgY2hpbGQKICogbWVtYmVycyBmb3IgdGhlIHNwZWNpZmll ZCAnY2hpbGRfcmVsaWRzJyBmb3IgYWxsIGNoaWxkIG1lbWJlcnMgd2hpY2ggd2VyZQogKiBp bmRleGVkIGJ5IGFueSBvZiB0aGUgc3BlY2lmaWVkICdjaGlsZF9yZWxpZHMnIGluIGFkZF9j aGlsZF9lcV9tZW1iZXIoKS4KICoKICogQ29kZSB1c2luZyB0aGUgaXRlcmF0b3IgbWV0aG9k IG9mIGZpbmRpbmcgRXF1aXZhbGVuY2VNZW1iZXJzIHdpbGwgZ2VuZXJhbGx5CiAqIGFsd2F5 cyB3YW50IHRvIGVuc3VyZSB0aGUgcmV0dXJuZWQgbWVtYmVyIG1hdGNoZXMgdGhlaXIgc2Vh cmNoIGNyaXRlcmlhCiAqIHJhdGhlciB0aGFuIHJlbHlpbmcgb24gdGhlIGZpbHRlcmluZyB0 byBiZSBkb25lIGZvciB0aGVtIGFzIGFsbCBwYXJlbnQKICogbWVtYmVycyBhcmUgcmV0dXJu ZWQgYW5kIGZvciBtZW1iZXJzIGJlbG9uZ2luZyB0byBSRUxPUFRfT1RIRVJfSk9JTlJFTAog KiByZWxzLCB0aGUgbWVtYmVyJ3MgZW1fcmVsaWRzIG1heSBiZSBhIHN1cGVyc2V0IG9mIHRo ZSBzcGVjaWZpZWQKICogJ2NoaWxkX3JlbGlkcycsIHdoaWNoIG1pZ2h0IG5vdCBiZSB3aGF0 IHRoZSBjYWxsZXIgd2FudHMuCiAqCiAqIFRoZSBtb3N0IGNvbW1vbiB3YXkgdG8gdXNlIHRo aXMgaXRlcmF0b3IgaXMgYXMgZm9sbG93czoKICogLS0tLS0KICogRXF1aXZhbGVuY2VNZW1i ZXJJdGVyYXRvcgkJaXQ7CiAqIEVxdWl2YWxlbmNlTWVtYmVyCQkJICAgKmVtOwogKgogKiBz ZXR1cF9lY2xhc3NfbWVtYmVyX2l0ZXJhdG9yKCZpdCwgZWMsIGNoaWxkX3JlbGlkcyk7CiAq IHdoaWxlICgoZW0gPSBlY2xhc3NfbWVtYmVyX2l0ZXJhdG9yX25leHQoJml0KSkgIT0gTlVM TCkKICogewogKgkJLi4uCiAqIH0KICogLS0tLS0KICogSXQgaXMgbm90IHZhbGlkIHRvIGNh bGwgZWNsYXNzX21lbWJlcl9pdGVyYXRvcl9uZXh0KCkgYWZ0ZXIgaXQgaGFzIHJldHVybmVk CiAqIE5VTEwgZm9yIGFueSBnaXZlbiBFcXVpdmFsZW5jZU1lbWJlckl0ZXJhdG9yLiAgSW5k aXZpZHVhbCBmaWVsZHMgd2l0aGluCiAqIHRoZSBFcXVpdmFsZW5jZU1lbWJlckl0ZXJhdG9y IHN0cnVjdCBtdXN0IG5vdCBiZSBhY2Nlc3NlZCBieSBjYWxsZXJzLgogKi8KdHlwZWRlZiBz dHJ1Y3QKewoJRXF1aXZhbGVuY2VDbGFzcyAqZWM7CQkvKiBUaGUgRXF1aXZhbGVuY2VDbGFz cyB0byBpdGVyYXRlIG92ZXIgKi8KCWludAkJCWN1cnJlbnRfcmVsaWQ7CS8qIEN1cnJlbnQg cmVsaWQgcG9zaXRpb24gd2l0aGluICdyZWxpZHMnLiAtMQoJCQkJCQkJCSAqIHdoZW4gc3Rp bGwgbG9vcGluZyBvdmVyIGVjX21lbWJlcnMgYW5kIC0yCgkJCQkJCQkJICogYXQgdGhlIGVu ZCBvZiBpdGVyYXRpb24gKi8KCVJlbGlkcwkJY2hpbGRfcmVsaWRzOwkvKiBSZWxpZHMgb2Yg Y2hpbGQgcmVsYXRpb25zIG9mIGludGVyZXN0LgoJCQkJCQkJCSAqIE5vbi1jaGlsZCByZWxz IGFyZSBpZ25vcmVkICovCglMaXN0Q2VsbCAgICpjdXJyZW50X2NlbGw7CS8qIE5leHQgY2Vs bCB0byByZXR1cm4gd2l0aGluIGN1cnJlbnRfbGlzdCAqLwoJTGlzdAkgICAqY3VycmVudF9s aXN0OwkvKiBDdXJyZW50IGxpc3Qgb2YgbWVtYmVycyBiZWluZyByZXR1cm5lZCAqLwp9IEVx dWl2YWxlbmNlTWVtYmVySXRlcmF0b3I7CgovKgogKiBQYXRoS2V5cwogKgogKiBUaGUgc29y dCBvcmRlcmluZyBvZiBhIHBhdGggaXMgcmVwcmVzZW50ZWQgYnkgYSBsaXN0IG9mIFBhdGhL ZXkgbm9kZXMuCiAqIEFuIGVtcHR5IGxpc3QgaW1wbGllcyBubyBrbm93biBvcmRlcmluZy4g IE90aGVyd2lzZSB0aGUgZmlyc3QgaXRlbQogKiByZXByZXNlbnRzIHRoZSBwcmltYXJ5IHNv cnQga2V5LCB0aGUgc2Vjb25kIHRoZSBmaXJzdCBzZWNvbmRhcnkgc29ydCBrZXksCiAqIGV0 Yy4gIFRoZSB2YWx1ZSBiZWluZyBzb3J0ZWQgaXMgcmVwcmVzZW50ZWQgYnkgbGlua2luZyB0 byBhbgogKiBFcXVpdmFsZW5jZUNsYXNzIGNvbnRhaW5pbmcgdGhhdCB2YWx1ZSBhbmQgaW5j bHVkaW5nIHBrX29wZmFtaWx5IGFtb25nIGl0cwogKiBlY19vcGZhbWlsaWVzLiAgVGhlIEVx dWl2YWxlbmNlQ2xhc3MgdGVsbHMgd2hpY2ggY29sbGF0aW9uIHRvIHVzZSwgdG9vLgogKiBU aGlzIGlzIGEgY29udmVuaWVudCBtZXRob2QgYmVjYXVzZSBpdCBtYWtlcyBpdCB0cml2aWFs IHRvIGRldGVjdAogKiBlcXVpdmFsZW50IGFuZCBjbG9zZWx5LXJlbGF0ZWQgb3JkZXJpbmdz LiAoU2VlIG9wdGltaXplci9SRUFETUUgZm9yIG1vcmUKICogaW5mb3JtYXRpb24uKQogKgog KiBOb3RlOiBwa19jbXB0eXBlIGlzIGVpdGhlciBDT01QQVJFX0xUIChmb3IgQVNDKSBvciBD T01QQVJFX0dUIChmb3IgREVTQykuCiAqLwp0eXBlZGVmIHN0cnVjdCBQYXRoS2V5CnsKCXBn X25vZGVfYXR0cihub19yZWFkLCBub19xdWVyeV9qdW1ibGUpCgoJTm9kZVRhZwkJdHlwZTsK CgkvKiB0aGUgdmFsdWUgdGhhdCBpcyBvcmRlcmVkICovCglFcXVpdmFsZW5jZUNsYXNzICpw a19lY2xhc3MgcGdfbm9kZV9hdHRyKGNvcHlfYXNfc2NhbGFyLCBlcXVhbF9hc19zY2FsYXIp OwoJT2lkCQkJcGtfb3BmYW1pbHk7CS8qIGluZGV4IG9wZmFtaWx5IGRlZmluaW5nIHRoZSBv cmRlcmluZyAqLwoJQ29tcGFyZVR5cGUgcGtfY21wdHlwZTsJCS8qIHNvcnQgZGlyZWN0aW9u IChBU0Mgb3IgREVTQykgKi8KCWJvb2wJCXBrX251bGxzX2ZpcnN0OyAvKiBkbyBOVUxMcyBj b21lIGJlZm9yZSBub3JtYWwgdmFsdWVzPyAqLwp9IFBhdGhLZXk7CgovKgogKiBDb250YWlu cyBhbiBvcmRlciBvZiBncm91cC1ieSBjbGF1c2VzIGFuZCB0aGUgY29ycmVzcG9uZGluZyBs aXN0IG9mCiAqIHBhdGhrZXlzLgogKgogKiBUaGUgZWxlbWVudHMgb2YgJ2NsYXVzZXMnIGxp c3Qgc2hvdWxkIGhhdmUgdGhlIHNhbWUgb3JkZXIgYXMgdGhlIGhlYWQgb2YKICogJ3BhdGhr ZXlzJyBsaXN0LiAgVGhlIHRsZVNvcnRHcm91cFJlZiBvZiB0aGUgY2xhdXNlIHNob3VsZCBi ZSBlcXVhbCB0bwogKiBlY19zb3J0cmVmIG9mIHRoZSBwYXRoa2V5IGVxdWl2YWxlbmNlIGNs YXNzLiAgSWYgdGhlcmUgYXJlIHJlZHVuZGFudAogKiBjbGF1c2VzIHdpdGggdGhlIHNhbWUg dGxlU29ydEdyb3VwUmVmLCB0aGV5IG11c3QgYmUgZ3JvdXBlZCB0b2dldGhlci4KICovCnR5 cGVkZWYgc3RydWN0IEdyb3VwQnlPcmRlcmluZwp7CglOb2RlVGFnCQl0eXBlOwoKCUxpc3QJ ICAgKnBhdGhrZXlzOwoJTGlzdAkgICAqY2xhdXNlczsKfSBHcm91cEJ5T3JkZXJpbmc7Cgov KgogKiBWb2xhdGlsZUZ1bmN0aW9uU3RhdHVzIC0tIGFsbG93cyBub2RlcyB0byBjYWNoZSB0 aGVpcgogKiBjb250YWluX3ZvbGF0aWxlX2Z1bmN0aW9ucyBwcm9wZXJ0aWVzLiBWT0xBVElM SVRZX1VOS05PV04gbWVhbnMgbm90IHlldAogKiBkZXRlcm1pbmVkLgogKi8KdHlwZWRlZiBl bnVtIFZvbGF0aWxlRnVuY3Rpb25TdGF0dXMKewoJVk9MQVRJTElUWV9VTktOT1dOID0gMCwK CVZPTEFUSUxJVFlfVk9MQVRJTEUsCglWT0xBVElMSVRZX05PVk9MQVRJTEUsCn0gVm9sYXRp bGVGdW5jdGlvblN0YXR1czsKCi8qCiAqIFBhdGhUYXJnZXQKICoKICogVGhpcyBzdHJ1Y3Qg Y29udGFpbnMgd2hhdCB3ZSBuZWVkIHRvIGtub3cgZHVyaW5nIHBsYW5uaW5nIGFib3V0IHRo ZQogKiB0YXJnZXRsaXN0IChvdXRwdXQgY29sdW1ucykgdGhhdCBhIFBhdGggd2lsbCBjb21w dXRlLiAgRWFjaCBSZWxPcHRJbmZvCiAqIGluY2x1ZGVzIGEgZGVmYXVsdCBQYXRoVGFyZ2V0 LCB3aGljaCBpdHMgaW5kaXZpZHVhbCBQYXRocyBtYXkgc2ltcGx5CiAqIHJlZmVyZW5jZS4g IEhvd2V2ZXIsIGluIHNvbWUgY2FzZXMgYSBQYXRoIG1heSBjb21wdXRlIG91dHB1dHMgZGlm ZmVyZW50CiAqIGZyb20gb3RoZXIgUGF0aHMsIGFuZCBpbiB0aGF0IGNhc2Ugd2UgbWFrZSBh IGN1c3RvbSBQYXRoVGFyZ2V0IGZvciBpdC4KICogRm9yIGV4YW1wbGUsIGFuIGluZGV4c2Nh biBtaWdodCByZXR1cm4gaW5kZXggZXhwcmVzc2lvbnMgdGhhdCB3b3VsZAogKiBvdGhlcndp c2UgbmVlZCB0byBiZSBleHBsaWNpdGx5IGNhbGN1bGF0ZWQuICAoTm90ZSBhbHNvIHRoYXQg InVwcGVyIgogKiByZWxhdGlvbnMgZ2VuZXJhbGx5IGRvbid0IGhhdmUgdXNlZnVsIGRlZmF1 bHQgUGF0aFRhcmdldHMuKQogKgogKiBleHBycyBjb250YWlucyBiYXJlIGV4cHJlc3Npb25z OyB0aGV5IGRvIG5vdCBoYXZlIFRhcmdldEVudHJ5IG5vZGVzIG9uIHRvcCwKICogdGhvdWdo IHRob3NlIHdpbGwgYXBwZWFyIGluIGZpbmlzaGVkIFBsYW5zLgogKgogKiBzb3J0Z3JvdXBy ZWZzW10gaXMgYW4gYXJyYXkgb2YgdGhlIHNhbWUgbGVuZ3RoIGFzIGV4cHJzLCBjb250YWlu aW5nIHRoZQogKiBjb3JyZXNwb25kaW5nIHNvcnQvZ3JvdXAgcmVmbm9zLCBvciB6ZXJvZXMg Zm9yIGV4cHJlc3Npb25zIG5vdCByZWZlcmVuY2VkCiAqIGJ5IHNvcnQvZ3JvdXAgY2xhdXNl cy4gIElmIHNvcnRncm91cHJlZnMgaXMgTlVMTCAod2hpY2ggaXQgZ2VuZXJhbGx5IGlzIGlu CiAqIFJlbE9wdEluZm8ucmVsdGFyZ2V0IHRhcmdldHM7IG9ubHkgdXBwZXItbGV2ZWwgUGF0 aHMgY29udGFpbiB0aGlzIGluZm8pLAogKiB3ZSBoYXZlIG5vdCBpZGVudGlmaWVkIHNvcnQv Z3JvdXAgY29sdW1ucyBpbiB0aGlzIHRsaXN0LiAgVGhpcyBhbGxvd3MgdXMgdG8KICogZGVh bCB3aXRoIHNvcnQvZ3JvdXAgcmVmbm9zIHdoZW4gbmVlZGVkIHdpdGggbGVzcyBleHBlbnNl IHRoYW4gaW5jbHVkaW5nCiAqIFRhcmdldEVudHJ5IG5vZGVzIGluIHRoZSBleHBycyBsaXN0 LgogKi8KdHlwZWRlZiBzdHJ1Y3QgUGF0aFRhcmdldAp7CglwZ19ub2RlX2F0dHIobm9fY29w eV9lcXVhbCwgbm9fcmVhZCwgbm9fcXVlcnlfanVtYmxlKQoKCU5vZGVUYWcJCXR5cGU7CgoJ LyogbGlzdCBvZiBleHByZXNzaW9ucyB0byBiZSBjb21wdXRlZCAqLwoJTGlzdAkgICAqZXhw cnM7CgoJLyogY29ycmVzcG9uZGluZyBzb3J0L2dyb3VwIHJlZm5vcywgb3IgMCAqLwoJSW5k ZXgJICAgKnNvcnRncm91cHJlZnMgcGdfbm9kZV9hdHRyKGFycmF5X3NpemUoZXhwcnMpKTsK CgkvKiBjb3N0IG9mIGV2YWx1YXRpbmcgdGhlIGV4cHJlc3Npb25zICovCglRdWFsQ29zdAlj b3N0OwoKCS8qIGVzdGltYXRlZCBhdmcgd2lkdGggb2YgcmVzdWx0IHR1cGxlcyAqLwoJaW50 CQkJd2lkdGg7CgoJLyogaW5kaWNhdGVzIGlmIGV4cHJzIGNvbnRhaW4gYW55IHZvbGF0aWxl IGZ1bmN0aW9ucyAqLwoJVm9sYXRpbGVGdW5jdGlvblN0YXR1cyBoYXNfdm9sYXRpbGVfZXhw cjsKfSBQYXRoVGFyZ2V0OwoKLyogQ29udmVuaWVuY2UgbWFjcm8gdG8gZ2V0IGEgc29ydC9n cm91cCByZWZubyBmcm9tIGEgUGF0aFRhcmdldCAqLwojZGVmaW5lIGdldF9wYXRodGFyZ2V0 X3NvcnRncm91cHJlZih0YXJnZXQsIGNvbG5vKSBcCgkoKHRhcmdldCktPnNvcnRncm91cHJl ZnMgPyAodGFyZ2V0KS0+c29ydGdyb3VwcmVmc1tjb2xub10gOiAoSW5kZXgpIDApCgoKLyoK ICogUGFyYW1QYXRoSW5mbwogKgogKiBBbGwgcGFyYW1ldGVyaXplZCBwYXRocyBmb3IgYSBn aXZlbiByZWxhdGlvbiB3aXRoIGdpdmVuIHJlcXVpcmVkIG91dGVyIHJlbHMKICogbGluayB0 byBhIHNpbmdsZSBQYXJhbVBhdGhJbmZvLCB3aGljaCBzdG9yZXMgY29tbW9uIGluZm9ybWF0 aW9uIHN1Y2ggYXMKICogdGhlIGVzdGltYXRlZCByb3djb3VudCBmb3IgdGhpcyBwYXJhbWV0 ZXJpemF0aW9uLiAgV2UgZG8gdGhpcyBwYXJ0bHkgdG8KICogYXZvaWQgcmVjYWxjdWxhdGlv bnMsIGJ1dCBtb3N0bHkgdG8gZW5zdXJlIHRoYXQgdGhlIGVzdGltYXRlZCByb3djb3VudAog KiBpcyBpbiBmYWN0IHRoZSBzYW1lIGZvciBldmVyeSBzdWNoIHBhdGguCiAqCiAqIE5vdGU6 IHBwaV9jbGF1c2VzIGlzIG9ubHkgdXNlZCBpbiBQYXJhbVBhdGhJbmZvcyBmb3IgYmFzZSBy ZWxhdGlvbiBwYXRoczsKICogaW4gam9pbiBjYXNlcyBpdCdzIE5JTCBiZWNhdXNlIHRoZSBz ZXQgb2YgcmVsZXZhbnQgY2xhdXNlcyB2YXJpZXMgZGVwZW5kaW5nCiAqIG9uIGhvdyB0aGUg am9pbiBpcyBmb3JtZWQuICBUaGUgcmVsZXZhbnQgY2xhdXNlcyB3aWxsIGFwcGVhciBpbiBl YWNoCiAqIHBhcmFtZXRlcml6ZWQgam9pbiBwYXRoJ3Mgam9pbnJlc3RyaWN0aW5mbyBsaXN0 LCBpbnN0ZWFkLiAgUGFyYW1QYXRoSW5mb3MKICogZm9yIGFwcGVuZCByZWxhdGlvbnMgZG9u J3QgYm90aGVyIHdpdGggdGhpcywgZWl0aGVyLgogKgogKiBwcGlfc2VyaWFscyBpcyB0aGUg c2V0IG9mIHJpbmZvX3NlcmlhbCBudW1iZXJzIGZvciBxdWFscyB0aGF0IGFyZSBlbmZvcmNl ZAogKiBieSB0aGlzIHBhdGguICBBcyB3aXRoIHBwaV9jbGF1c2VzLCBpdCdzIG9ubHkgbWFp bnRhaW5lZCBmb3IgYmFzZXJlbHMuCiAqIChXZSBjb3VsZCBjb25zdHJ1Y3QgaXQgb24tdGhl LWZseSBmcm9tIHBwaV9jbGF1c2VzLCBidXQgaXQgc2VlbXMgYmV0dGVyCiAqIHRvIG1hdGVy aWFsaXplIGEgY29weS4pCiAqLwp0eXBlZGVmIHN0cnVjdCBQYXJhbVBhdGhJbmZvCnsKCXBn X25vZGVfYXR0cihub19jb3B5X2VxdWFsLCBub19yZWFkLCBub19xdWVyeV9qdW1ibGUpCgoJ Tm9kZVRhZwkJdHlwZTsKCglSZWxpZHMJCXBwaV9yZXFfb3V0ZXI7CS8qIHJlbHMgc3VwcGx5 aW5nIHBhcmFtZXRlcnMgdXNlZCBieSBwYXRoICovCglDYXJkaW5hbGl0eSBwcGlfcm93czsJ CS8qIGVzdGltYXRlZCBudW1iZXIgb2YgcmVzdWx0IHR1cGxlcyAqLwoJTGlzdAkgICAqcHBp X2NsYXVzZXM7CS8qIGpvaW4gY2xhdXNlcyBhdmFpbGFibGUgZnJvbSBvdXRlciByZWxzICov CglCaXRtYXBzZXQgICpwcGlfc2VyaWFsczsJLyogc2V0IG9mIHJpbmZvX3NlcmlhbCBmb3Ig ZW5mb3JjZWQgcXVhbHMgKi8KfSBQYXJhbVBhdGhJbmZvOwoKCi8qCiAqIFR5cGUgIlBhdGgi IGlzIHVzZWQgYXMtaXMgZm9yIHNlcXVlbnRpYWwtc2NhbiBwYXRocywgYXMgd2VsbCBhcyBz b21lIG90aGVyCiAqIHNpbXBsZSBwbGFuIHR5cGVzIHRoYXQgd2UgZG9uJ3QgbmVlZCBhbnkg ZXh0cmEgaW5mb3JtYXRpb24gaW4gdGhlIHBhdGggZm9yLgogKiBGb3Igb3RoZXIgcGF0aCB0 eXBlcyBpdCBpcyB0aGUgZmlyc3QgY29tcG9uZW50IG9mIGEgbGFyZ2VyIHN0cnVjdC4KICoK ICogInBhdGh0eXBlIiBpcyB0aGUgTm9kZVRhZyBvZiB0aGUgUGxhbiBub2RlIHdlIGNvdWxk IGJ1aWxkIGZyb20gdGhpcyBQYXRoLgogKiBJdCBpcyBwYXJ0aWFsbHkgcmVkdW5kYW50IHdp dGggdGhlIFBhdGgncyBOb2RlVGFnLCBidXQgYWxsb3dzIHVzIHRvIHVzZQogKiB0aGUgc2Ft ZSBQYXRoIHR5cGUgZm9yIG11bHRpcGxlIFBsYW4gdHlwZXMgd2hlbiB0aGVyZSBpcyBubyBu ZWVkIHRvCiAqIGRpc3Rpbmd1aXNoIHRoZSBQbGFuIHR5cGUgZHVyaW5nIHBhdGggcHJvY2Vz c2luZy4KICoKICogInBhcmVudCIgaWRlbnRpZmllcyB0aGUgcmVsYXRpb24gdGhpcyBQYXRo IHNjYW5zLCBhbmQgInBhdGh0YXJnZXQiCiAqIGRlc2NyaWJlcyB0aGUgcHJlY2lzZSBzZXQg b2Ygb3V0cHV0IGNvbHVtbnMgdGhlIFBhdGggd291bGQgY29tcHV0ZS4KICogSW4gc2ltcGxl IGNhc2VzIGFsbCBQYXRocyBmb3IgYSBnaXZlbiByZWwgc2hhcmUgdGhlIHNhbWUgdGFyZ2V0 bGlzdCwKICogd2hpY2ggd2UgcmVwcmVzZW50IGJ5IGhhdmluZyBwYXRoLT5wYXRodGFyZ2V0 IGVxdWFsIHRvIHBhcmVudC0+cmVsdGFyZ2V0LgogKgogKiAicGFyYW1faW5mbyIsIGlmIG5v dCBOVUxMLCBsaW5rcyB0byBhIFBhcmFtUGF0aEluZm8gdGhhdCBpZGVudGlmaWVzIG91dGVy CiAqIHJlbGF0aW9uKHMpIHRoYXQgcHJvdmlkZSBwYXJhbWV0ZXIgdmFsdWVzIHRvIGVhY2gg c2NhbiBvZiB0aGlzIHBhdGguCiAqIFRoYXQgbWVhbnMgdGhpcyBwYXRoIGNhbiBvbmx5IGJl IGpvaW5lZCB0byB0aG9zZSByZWxzIGJ5IG1lYW5zIG9mIG5lc3Rsb29wCiAqIGpvaW5zIHdp dGggdGhpcyBwYXRoIG9uIHRoZSBpbnNpZGUuICBBbHNvIG5vdGUgdGhhdCBhIHBhcmFtZXRl cml6ZWQgcGF0aAogKiBpcyByZXNwb25zaWJsZSBmb3IgdGVzdGluZyBhbGwgIm1vdmFibGUi IGpvaW5jbGF1c2VzIGludm9sdmluZyB0aGlzIHJlbAogKiBhbmQgdGhlIHNwZWNpZmllZCBv dXRlciByZWwocykuCiAqCiAqICJyb3dzIiBpcyB0aGUgc2FtZSBhcyBwYXJlbnQtPnJvd3Mg aW4gc2ltcGxlIHBhdGhzLCBidXQgaW4gcGFyYW1ldGVyaXplZAogKiBwYXRocyBpdCBjYW4g YmUgbGVzcyB0aGFuIHBhcmVudC0+cm93cywgcmVmbGVjdGluZyB0aGUgZmFjdCB0aGF0IHdl J3ZlCiAqIGZpbHRlcmVkIGJ5IGV4dHJhIGpvaW4gY29uZGl0aW9ucy4KICoKICogInBhdGhr ZXlzIiBpcyBhIExpc3Qgb2YgUGF0aEtleSBub2RlcyAoc2VlIGFib3ZlKSwgZGVzY3JpYmlu ZyB0aGUgc29ydAogKiBvcmRlcmluZyBvZiB0aGUgcGF0aCdzIG91dHB1dCByb3dzLgogKgog KiBXZSBkbyBub3Qgc3VwcG9ydCBjb3B5aW5nIFBhdGggdHJlZXMsIG1haW5seSBiZWNhdXNl IHRoZSBjaXJjdWxhciBsaW5rYWdlcwogKiBiZXR3ZWVuIFJlbE9wdEluZm8gYW5kIFBhdGgg bm9kZXMgY2FuJ3QgYmUgaGFuZGxlZCBlYXNpbHkgaW4gYSBzaW1wbGUKICogZGVwdGgtZmly c3QgdHJhdmVyc2FsLiAgV2UgYWxzbyBkb24ndCBoYXZlIHJlYWQgc3VwcG9ydCBhdCB0aGUg bW9tZW50LgogKi8KdHlwZWRlZiBzdHJ1Y3QgUGF0aAp7CglwZ19ub2RlX2F0dHIobm9fY29w eV9lcXVhbCwgbm9fcmVhZCwgbm9fcXVlcnlfanVtYmxlKQoKCU5vZGVUYWcJCXR5cGU7CgoJ LyogdGFnIGlkZW50aWZ5aW5nIHNjYW4vam9pbiBtZXRob2QgKi8KCU5vZGVUYWcJCXBhdGh0 eXBlOwoKCS8qCgkgKiB0aGUgcmVsYXRpb24gdGhpcyBwYXRoIGNhbiBidWlsZAoJICoKCSAq IFdlIGRvIE5PVCBwcmludCB0aGUgcGFyZW50LCBlbHNlIHdlJ2QgYmUgaW4gaW5maW5pdGUg cmVjdXJzaW9uLiAgV2UgY2FuCgkgKiBwcmludCB0aGUgcGFyZW50J3MgcmVsaWRzIGZvciBp ZGVudGlmaWNhdGlvbiBwdXJwb3NlcywgdGhvdWdoLgoJICovCglSZWxPcHRJbmZvICpwYXJl bnQgcGdfbm9kZV9hdHRyKHdyaXRlX29ubHlfcmVsaWRzKTsKCgkvKgoJICogbGlzdCBvZiBW YXJzL0V4cHJzLCBjb3N0LCB3aWR0aAoJICoKCSAqIFdlIHByaW50IHRoZSBwYXRodGFyZ2V0 IG9ubHkgaWYgaXQncyBub3QgdGhlIGRlZmF1bHQgb25lIGZvciB0aGUgcmVsLgoJICovCglQ YXRoVGFyZ2V0ICpwYXRodGFyZ2V0IHBnX25vZGVfYXR0cih3cml0ZV9vbmx5X25vbmRlZmF1 bHRfcGF0aHRhcmdldCk7CgoJLyoKCSAqIHBhcmFtZXRlcml6YXRpb24gaW5mbywgb3IgTlVM TCBpZiBub25lCgkgKgoJICogV2UgZG8gbm90IHByaW50IHRoZSB3aG9sZSBvZiBwYXJhbV9p bmZvLCBzaW5jZSBpdCdzIHByaW50ZWQgdmlhCgkgKiBSZWxPcHRJbmZvOyBpdCdzIHN1ZmZp Y2llbnQgYW5kIGxlc3MgY2x1dHRlcmluZyB0byBwcmludCBqdXN0IHRoZQoJICogcmVxdWly ZWQgb3V0ZXIgcmVsaWRzLgoJICovCglQYXJhbVBhdGhJbmZvICpwYXJhbV9pbmZvIHBnX25v ZGVfYXR0cih3cml0ZV9vbmx5X3JlcV9vdXRlcik7CgoJLyogZW5nYWdlIHBhcmFsbGVsLWF3 YXJlIGxvZ2ljPyAqLwoJYm9vbAkJcGFyYWxsZWxfYXdhcmU7CgkvKiBPSyB0byB1c2UgYXMg cGFydCBvZiBwYXJhbGxlbCBwbGFuPyAqLwoJYm9vbAkJcGFyYWxsZWxfc2FmZTsKCS8qIGRl c2lyZWQgIyBvZiB3b3JrZXJzOyAwID0gbm90IHBhcmFsbGVsICovCglpbnQJCQlwYXJhbGxl bF93b3JrZXJzOwoKCS8qIGVzdGltYXRlZCBzaXplL2Nvc3RzIGZvciBwYXRoIChzZWUgY29z dHNpemUuYyBmb3IgbW9yZSBpbmZvKSAqLwoJQ2FyZGluYWxpdHkgcm93czsJCQkvKiBlc3Rp bWF0ZWQgbnVtYmVyIG9mIHJlc3VsdCB0dXBsZXMgKi8KCWludAkJCWRpc2FibGVkX25vZGVz OyAvKiBjb3VudCBvZiBkaXNhYmxlZCBub2RlcyAqLwoJQ29zdAkJc3RhcnR1cF9jb3N0Owkv KiBjb3N0IGV4cGVuZGVkIGJlZm9yZSBmZXRjaGluZyBhbnkgdHVwbGVzICovCglDb3N0CQl0 b3RhbF9jb3N0OwkJLyogdG90YWwgY29zdCAoYXNzdW1pbmcgYWxsIHR1cGxlcyBmZXRjaGVk KSAqLwoKCS8qIHNvcnQgb3JkZXJpbmcgb2YgcGF0aCdzIG91dHB1dDsgYSBMaXN0IG9mIFBh dGhLZXkgbm9kZXM7IHNlZSBhYm92ZSAqLwoJTGlzdAkgICAqcGF0aGtleXM7Cn0gUGF0aDsK Ci8qIE1hY3JvIGZvciBleHRyYWN0aW5nIGEgcGF0aCdzIHBhcmFtZXRlcml6YXRpb24gcmVs aWRzOyBiZXdhcmUgZG91YmxlIGV2YWwgKi8KI2RlZmluZSBQQVRIX1JFUV9PVVRFUihwYXRo KSAgXAoJKChwYXRoKS0+cGFyYW1faW5mbyA/IChwYXRoKS0+cGFyYW1faW5mby0+cHBpX3Jl cV9vdXRlciA6IChSZWxpZHMpIE5VTEwpCgovKi0tLS0tLS0tLS0KICogSW5kZXhQYXRoIHJl cHJlc2VudHMgYW4gaW5kZXggc2NhbiBvdmVyIGEgc2luZ2xlIGluZGV4LgogKgogKiBUaGlz IHN0cnVjdCBpcyB1c2VkIGZvciBib3RoIHJlZ3VsYXIgaW5kZXhzY2FucyBhbmQgaW5kZXgt b25seSBzY2FuczsKICogcGF0aC5wYXRodHlwZSBpcyBUX0luZGV4U2NhbiBvciBUX0luZGV4 T25seVNjYW4gdG8gc2hvdyB3aGljaCBpcyBtZWFudC4KICoKICogJ2luZGV4aW5mbycgaXMg dGhlIGluZGV4IHRvIGJlIHNjYW5uZWQuCiAqCiAqICdpbmRleGNsYXVzZXMnIGlzIGEgbGlz dCBvZiBJbmRleENsYXVzZSBub2RlcywgZWFjaCByZXByZXNlbnRpbmcgb25lCiAqIGluZGV4 LWNoZWNrYWJsZSByZXN0cmljdGlvbiwgd2l0aCBpbXBsaWNpdCBBTkQgc2VtYW50aWNzIGFj cm9zcyB0aGUgbGlzdC4KICogQW4gZW1wdHkgbGlzdCBpbXBsaWVzIGEgZnVsbCBpbmRleCBz Y2FuLgogKgogKiAnaW5kZXhvcmRlcmJ5cycsIGlmIG5vdCBOSUwsIGlzIGEgbGlzdCBvZiBP UkRFUiBCWSBleHByZXNzaW9ucyB0aGF0IGhhdmUKICogYmVlbiBmb3VuZCB0byBiZSB1c2Fi bGUgYXMgb3JkZXJpbmcgb3BlcmF0b3JzIGZvciBhbiBhbWNhbm9yZGVyYnlvcCBpbmRleC4K ICogVGhlIGxpc3QgbXVzdCBtYXRjaCB0aGUgcGF0aCdzIHBhdGhrZXlzLCBpZSwgb25lIGV4 cHJlc3Npb24gcGVyIHBhdGhrZXkKICogaW4gdGhlIHNhbWUgb3JkZXIuICBUaGVzZSBhcmUg bm90IFJlc3RyaWN0SW5mb3MsIGp1c3QgYmFyZSBleHByZXNzaW9ucywKICogc2luY2UgdGhl eSBnZW5lcmFsbHkgd29uJ3QgeWllbGQgYm9vbGVhbnMuICBJdCdzIGd1YXJhbnRlZWQgdGhh dCBlYWNoCiAqIGV4cHJlc3Npb24gaGFzIHRoZSBpbmRleCBrZXkgb24gdGhlIGxlZnQgc2lk ZSBvZiB0aGUgb3BlcmF0b3IuCiAqCiAqICdpbmRleG9yZGVyYnljb2xzJyBpcyBhbiBpbnRl Z2VyIGxpc3Qgb2YgaW5kZXggY29sdW1uIG51bWJlcnMgKHplcm8tYmFzZWQpCiAqIG9mIHRo ZSBzYW1lIGxlbmd0aCBhcyAnaW5kZXhvcmRlcmJ5cycsIHNob3dpbmcgd2hpY2ggaW5kZXgg Y29sdW1uIGVhY2gKICogT1JERVIgQlkgZXhwcmVzc2lvbiBpcyBtZWFudCB0byBiZSB1c2Vk IHdpdGguICAoVGhlcmUgaXMgbm8gcmVzdHJpY3Rpb24KICogb24gd2hpY2ggaW5kZXggY29s dW1uIGVhY2ggT1JERVIgQlkgY2FuIGJlIHVzZWQgd2l0aC4pCiAqCiAqICdpbmRleHNjYW5k aXInIGlzIG9uZSBvZjoKICoJCUZvcndhcmRTY2FuRGlyZWN0aW9uOiBmb3J3YXJkIHNjYW4g b2YgYW4gaW5kZXgKICoJCUJhY2t3YXJkU2NhbkRpcmVjdGlvbjogYmFja3dhcmQgc2NhbiBv ZiBhbiBvcmRlcmVkIGluZGV4CiAqIFVub3JkZXJlZCBpbmRleGVzIHdpbGwgYWx3YXlzIGhh dmUgYW4gaW5kZXhzY2FuZGlyIG9mIEZvcndhcmRTY2FuRGlyZWN0aW9uLgogKgogKiAnaW5k ZXh0b3RhbGNvc3QnIGFuZCAnaW5kZXhzZWxlY3Rpdml0eScgYXJlIHNhdmVkIGluIHRoZSBJ bmRleFBhdGggc28gdGhhdAogKiB3ZSBuZWVkIG5vdCByZWNvbXB1dGUgdGhlbSB3aGVuIGNv bnNpZGVyaW5nIHVzaW5nIHRoZSBzYW1lIGluZGV4IGluIGEKICogYml0bWFwIGluZGV4L2hl YXAgc2NhbiAoc2VlIEJpdG1hcEhlYXBQYXRoKS4gIFRoZSBjb3N0cyBvZiB0aGUgSW5kZXhQ YXRoCiAqIGl0c2VsZiByZXByZXNlbnQgdGhlIGNvc3RzIG9mIGFuIEluZGV4U2NhbiBvciBJ bmRleE9ubHlTY2FuIHBsYW4gdHlwZS4KICotLS0tLS0tLS0tCiAqLwp0eXBlZGVmIHN0cnVj dCBJbmRleFBhdGgKewoJUGF0aAkJcGF0aDsKCUluZGV4T3B0SW5mbyAqaW5kZXhpbmZvOwoJ TGlzdAkgICAqaW5kZXhjbGF1c2VzOwoJTGlzdAkgICAqaW5kZXhvcmRlcmJ5czsKCUxpc3QJ ICAgKmluZGV4b3JkZXJieWNvbHM7CglTY2FuRGlyZWN0aW9uIGluZGV4c2NhbmRpcjsKCUNv c3QJCWluZGV4dG90YWxjb3N0OwoJU2VsZWN0aXZpdHkgaW5kZXhzZWxlY3Rpdml0eTsKfSBJ bmRleFBhdGg7CgovKgogKiBFYWNoIEluZGV4Q2xhdXNlIHJlZmVyZW5jZXMgYSBSZXN0cmlj dEluZm8gbm9kZSBmcm9tIHRoZSBxdWVyeSdzIFdIRVJFCiAqIG9yIEpPSU4gY29uZGl0aW9u cywgYW5kIHNob3dzIGhvdyB0aGF0IHJlc3RyaWN0aW9uIGNhbiBiZSBhcHBsaWVkIHRvCiAq IHRoZSBwYXJ0aWN1bGFyIGluZGV4LiAgV2Ugc3VwcG9ydCBib3RoIGluZGV4Y2xhdXNlcyB0 aGF0IGFyZSBkaXJlY3RseQogKiB1c2FibGUgYnkgdGhlIGluZGV4IG1hY2hpbmVyeSwgd2hp Y2ggYXJlIHR5cGljYWxseSBvZiB0aGUgZm9ybQogKiAiaW5kZXhjb2wgT1AgcHNldWRvY29u c3RhbnQiLCBhbmQgdGhvc2UgZnJvbSB3aGljaCBhbiBpbmRleGFibGUgcXVhbAogKiBjYW4g YmUgZGVyaXZlZC4gIFRoZSBzaW1wbGVzdCBzdWNoIHRyYW5zZm9ybWF0aW9uIGlzIHRoYXQg YSBjbGF1c2UKICogb2YgdGhlIGZvcm0gInBzZXVkb2NvbnN0YW50IE9QIGluZGV4Y29sIiBj YW4gYmUgY29tbXV0ZWQgdG8gcHJvZHVjZSBhbgogKiBpbmRleGFibGUgcXVhbCAodGhlIGlu ZGV4IG1hY2hpbmVyeSBleHBlY3RzIHRoZSBpbmRleGNvbCB0byBiZSBvbiB0aGUKICogbGVm dCBhbHdheXMpLiAgQW5vdGhlciBleGFtcGxlIGlzIHRoYXQgd2UgbWlnaHQgYmUgYWJsZSB0 byBleHRyYWN0IGFuCiAqIGluZGV4YWJsZSByYW5nZSBjb25kaXRpb24gZnJvbSBhIExJS0Ug Y29uZGl0aW9uLCBhcyBpbiAieCBMSUtFICdmb28lYmFyJyIKICogZ2l2aW5nIHJpc2UgdG8g InggPj0gJ2ZvbycgQU5EIHggPCAnZm9wJyIuICBEZXJpdmF0aW9uIG9mIHN1Y2ggbG9zc3kK ICogY29uZGl0aW9ucyBpcyBkb25lIGJ5IGEgcGxhbm5lciBzdXBwb3J0IGZ1bmN0aW9uIGF0 dGFjaGVkIHRvIHRoZQogKiBpbmRleGNsYXVzZSdzIHRvcC1sZXZlbCBmdW5jdGlvbiBvciBv cGVyYXRvci4KICoKICogaW5kZXhxdWFscyBpcyBhIGxpc3Qgb2YgUmVzdHJpY3RJbmZvcyBm b3IgdGhlIGRpcmVjdGx5LXVzYWJsZSBpbmRleAogKiBjb25kaXRpb25zIGFzc29jaWF0ZWQg d2l0aCB0aGlzIEluZGV4Q2xhdXNlLiAgSW4gdGhlIHNpbXBsZXN0IGNhc2UKICogaXQncyBh IG9uZS1lbGVtZW50IGxpc3Qgd2hvc2UgbWVtYmVyIGlzIGljbGF1c2UtPnJpbmZvLiAgT3Ro ZXJ3aXNlLAogKiBpdCBjb250YWlucyBvbmUgb3IgbW9yZSBkaXJlY3RseS11c2FibGUgaW5k ZXhxdWFsIGNvbmRpdGlvbnMgZXh0cmFjdGVkCiAqIGZyb20gdGhlIGdpdmVuIGNsYXVzZS4g IFRoZSAnbG9zc3knIGZsYWcgaW5kaWNhdGVzIHdoZXRoZXIgdGhlCiAqIGluZGV4cXVhbHMg YXJlIHNlbWFudGljYWxseSBlcXVpdmFsZW50IHRvIHRoZSBvcmlnaW5hbCBjbGF1c2UsIG9y CiAqIHJlcHJlc2VudCBhIHdlYWtlciBjb25kaXRpb24uCiAqCiAqIE5vcm1hbGx5LCBpbmRl eGNvbCBpcyB0aGUgaW5kZXggb2YgdGhlIHNpbmdsZSBpbmRleCBjb2x1bW4gdGhlIGNsYXVz ZQogKiB3b3JrcyBvbiwgYW5kIGluZGV4Y29scyBpcyBOSUwuICBCdXQgaWYgdGhlIGNsYXVz ZSBpcyBhIFJvd0NvbXBhcmVFeHByLAogKiBpbmRleGNvbCBpcyB0aGUgaW5kZXggb2YgdGhl IGxlYWRpbmcgY29sdW1uLCBhbmQgaW5kZXhjb2xzIGlzIGEgbGlzdCBvZgogKiBhbGwgdGhl IGFmZmVjdGVkIGNvbHVtbnMuICAoTm90ZSB0aGF0IGluZGV4Y29scyBtYXRjaGVzIHVwIHdp dGggdGhlCiAqIGNvbHVtbnMgb2YgdGhlIGFjdHVhbCBpbmRleGFibGUgUm93Q29tcGFyZUV4 cHIgaW4gaW5kZXhxdWFscywgd2hpY2gKICogbWlnaHQgYmUgZGlmZmVyZW50IGZyb20gdGhl IG9yaWdpbmFsIGluIHJpbmZvLikKICoKICogQW4gSW5kZXhQYXRoJ3MgSW5kZXhDbGF1c2Ug bGlzdCBpcyByZXF1aXJlZCB0byBiZSBvcmRlcmVkIGJ5IGluZGV4CiAqIGNvbHVtbiwgaS5l LiB0aGUgaW5kZXhjb2wgdmFsdWVzIG11c3QgZm9ybSBhIG5vbmRlY3JlYXNpbmcgc2VxdWVu Y2UuCiAqIChUaGUgb3JkZXIgb2YgbXVsdGlwbGUgY2xhdXNlcyBmb3IgdGhlIHNhbWUgaW5k ZXggY29sdW1uIGlzIHVuc3BlY2lmaWVkLikKICovCnR5cGVkZWYgc3RydWN0IEluZGV4Q2xh dXNlCnsKCXBnX25vZGVfYXR0cihub19jb3B5X2VxdWFsLCBub19yZWFkLCBub19xdWVyeV9q dW1ibGUpCgoJTm9kZVRhZwkJdHlwZTsKCXN0cnVjdCBSZXN0cmljdEluZm8gKnJpbmZvOyAv KiBvcmlnaW5hbCByZXN0cmljdGlvbiBvciBqb2luIGNsYXVzZSAqLwoJTGlzdAkgICAqaW5k ZXhxdWFsczsJCS8qIGluZGV4cXVhbChzKSBkZXJpdmVkIGZyb20gaXQgKi8KCWJvb2wJCWxv c3N5OwkJCS8qIGFyZSBpbmRleHF1YWxzIGEgbG9zc3kgdmVyc2lvbiBvZiBjbGF1c2U/ICov CglBdHRyTnVtYmVyCWluZGV4Y29sOwkJLyogaW5kZXggY29sdW1uIHRoZSBjbGF1c2UgdXNl cyAoemVyby1iYXNlZCkgKi8KCUxpc3QJICAgKmluZGV4Y29sczsJCS8qIG11bHRpcGxlIGlu ZGV4IGNvbHVtbnMsIGlmIFJvd0NvbXBhcmUgKi8KfSBJbmRleENsYXVzZTsKCi8qCiAqIEJp dG1hcEhlYXBQYXRoIHJlcHJlc2VudHMgb25lIG9yIG1vcmUgaW5kZXhzY2FucyB0aGF0IGdl bmVyYXRlIFRJRCBiaXRtYXBzCiAqIGluc3RlYWQgb2YgZGlyZWN0bHkgYWNjZXNzaW5nIHRo ZSBoZWFwLCBmb2xsb3dlZCBieSBBTkQvT1IgY29tYmluYXRpb25zCiAqIHRvIHByb2R1Y2Ug YSBzaW5nbGUgYml0bWFwLCBmb2xsb3dlZCBieSBhIGhlYXAgc2NhbiB0aGF0IHVzZXMgdGhl IGJpdG1hcC4KICogTm90ZSB0aGF0IHRoZSBvdXRwdXQgaXMgYWx3YXlzIGNvbnNpZGVyZWQg dW5vcmRlcmVkLCBzaW5jZSBpdCB3aWxsIGNvbWUKICogb3V0IGluIHBoeXNpY2FsIGhlYXAg b3JkZXIgbm8gbWF0dGVyIHdoYXQgdGhlIHVuZGVybHlpbmcgaW5kZXhlcyBkaWQuCiAqCiAq IFRoZSBpbmRpdmlkdWFsIGluZGV4c2NhbnMgYXJlIHJlcHJlc2VudGVkIGJ5IEluZGV4UGF0 aCBub2RlcywgYW5kIGFueQogKiBsb2dpYyBvbiB0b3Agb2YgdGhlbSBpcyByZXByZXNlbnRl ZCBieSBhIHRyZWUgb2YgQml0bWFwQW5kUGF0aCBhbmQKICogQml0bWFwT3JQYXRoIG5vZGVz LiAgTm90aWNlIHRoYXQgd2UgY2FuIHVzZSB0aGUgc2FtZSBJbmRleFBhdGggbm9kZSBib3Ro CiAqIHRvIHJlcHJlc2VudCBhIHJlZ3VsYXIgKG9yIGluZGV4LW9ubHkpIGluZGV4IHNjYW4g cGxhbiwgYW5kIGFzIHRoZSBjaGlsZAogKiBvZiBhIEJpdG1hcEhlYXBQYXRoIHRoYXQgcmVw cmVzZW50cyBzY2FubmluZyB0aGUgc2FtZSBpbmRleCB1c2luZyBhCiAqIEJpdG1hcEluZGV4 U2Nhbi4gIFRoZSBzdGFydHVwX2Nvc3QgYW5kIHRvdGFsX2Nvc3QgZmlndXJlcyBvZiBhbiBJ bmRleFBhdGgKICogYWx3YXlzIHJlcHJlc2VudCB0aGUgY29zdHMgdG8gdXNlIGl0IGFzIGEg cmVndWxhciAob3IgaW5kZXgtb25seSkKICogSW5kZXhTY2FuLiAgVGhlIGNvc3RzIG9mIGEg Qml0bWFwSW5kZXhTY2FuIGNhbiBiZSBjb21wdXRlZCB1c2luZyB0aGUKICogSW5kZXhQYXRo J3MgaW5kZXh0b3RhbGNvc3QgYW5kIGluZGV4c2VsZWN0aXZpdHkuCiAqLwp0eXBlZGVmIHN0 cnVjdCBCaXRtYXBIZWFwUGF0aAp7CglQYXRoCQlwYXRoOwoJUGF0aAkgICAqYml0bWFwcXVh bDsJCS8qIEluZGV4UGF0aCwgQml0bWFwQW5kUGF0aCwgQml0bWFwT3JQYXRoICovCn0gQml0 bWFwSGVhcFBhdGg7CgovKgogKiBCaXRtYXBBbmRQYXRoIHJlcHJlc2VudHMgYSBCaXRtYXBB bmQgcGxhbiBub2RlOyBpdCBjYW4gb25seSBhcHBlYXIgYXMKICogcGFydCBvZiB0aGUgc3Vi c3RydWN0dXJlIG9mIGEgQml0bWFwSGVhcFBhdGguICBUaGUgUGF0aCBzdHJ1Y3R1cmUgaXMK ICogYSBiaXQgbW9yZSBoZWF2eXdlaWdodCB0aGFuIHdlIHJlYWxseSBuZWVkIGZvciB0aGlz LCBidXQgZm9yIHNpbXBsaWNpdHkKICogd2UgbWFrZSBpdCBhIGRlcml2YXRpdmUgb2YgUGF0 aCBhbnl3YXkuCiAqLwp0eXBlZGVmIHN0cnVjdCBCaXRtYXBBbmRQYXRoCnsKCVBhdGgJCXBh dGg7CglMaXN0CSAgICpiaXRtYXBxdWFsczsJLyogSW5kZXhQYXRocyBhbmQgQml0bWFwT3JQ YXRocyAqLwoJU2VsZWN0aXZpdHkgYml0bWFwc2VsZWN0aXZpdHk7Cn0gQml0bWFwQW5kUGF0 aDsKCi8qCiAqIEJpdG1hcE9yUGF0aCByZXByZXNlbnRzIGEgQml0bWFwT3IgcGxhbiBub2Rl OyBpdCBjYW4gb25seSBhcHBlYXIgYXMKICogcGFydCBvZiB0aGUgc3Vic3RydWN0dXJlIG9m IGEgQml0bWFwSGVhcFBhdGguICBUaGUgUGF0aCBzdHJ1Y3R1cmUgaXMKICogYSBiaXQgbW9y ZSBoZWF2eXdlaWdodCB0aGFuIHdlIHJlYWxseSBuZWVkIGZvciB0aGlzLCBidXQgZm9yIHNp bXBsaWNpdHkKICogd2UgbWFrZSBpdCBhIGRlcml2YXRpdmUgb2YgUGF0aCBhbnl3YXkuCiAq Lwp0eXBlZGVmIHN0cnVjdCBCaXRtYXBPclBhdGgKewoJUGF0aAkJcGF0aDsKCUxpc3QJICAg KmJpdG1hcHF1YWxzOwkvKiBJbmRleFBhdGhzIGFuZCBCaXRtYXBBbmRQYXRocyAqLwoJU2Vs ZWN0aXZpdHkgYml0bWFwc2VsZWN0aXZpdHk7Cn0gQml0bWFwT3JQYXRoOwoKLyoKICogVGlk UGF0aCByZXByZXNlbnRzIGEgc2NhbiBieSBUSUQKICoKICogdGlkcXVhbHMgaXMgYW4gaW1w bGljaXRseSBPUidlZCBsaXN0IG9mIHF1YWwgZXhwcmVzc2lvbnMgb2YgdGhlIGZvcm0KICog IkNUSUQgPSBwc2V1ZG9jb25zdGFudCIsIG9yICJDVElEID0gQU5ZKHBzZXVkb2NvbnN0YW50 X2FycmF5KSIsCiAqIG9yIGEgQ3VycmVudE9mRXhwciBmb3IgdGhlIHJlbGF0aW9uLgogKi8K dHlwZWRlZiBzdHJ1Y3QgVGlkUGF0aAp7CglQYXRoCQlwYXRoOwoJTGlzdAkgICAqdGlkcXVh bHM7CQkvKiBxdWFsKHMpIGludm9sdmluZyBDVElEID0gc29tZXRoaW5nICovCn0gVGlkUGF0 aDsKCi8qCiAqIFRpZFJhbmdlUGF0aCByZXByZXNlbnRzIGEgc2NhbiBieSBhIGNvbnRpZ3Vv dXMgcmFuZ2Ugb2YgVElEcwogKgogKiB0aWRyYW5nZXF1YWxzIGlzIGFuIGltcGxpY2l0bHkg QU5EJ2VkIGxpc3Qgb2YgcXVhbCBleHByZXNzaW9ucyBvZiB0aGUgZm9ybQogKiAiQ1RJRCBy ZWxvcCBwc2V1ZG9jb25zdGFudCIsIHdoZXJlIHJlbG9wIGlzIG9uZSBvZiA+LD49LDwsPD0u CiAqLwp0eXBlZGVmIHN0cnVjdCBUaWRSYW5nZVBhdGgKewoJUGF0aAkJcGF0aDsKCUxpc3QJ ICAgKnRpZHJhbmdlcXVhbHM7Cn0gVGlkUmFuZ2VQYXRoOwoKLyoKICogU3VicXVlcnlTY2Fu UGF0aCByZXByZXNlbnRzIGEgc2NhbiBvZiBhbiB1bmZsYXR0ZW5lZCBzdWJxdWVyeS1pbi1G Uk9NCiAqCiAqIE5vdGUgdGhhdCB0aGUgc3VicGF0aCBjb21lcyBmcm9tIGEgZGlmZmVyZW50 IHBsYW5uaW5nIGRvbWFpbjsgZm9yIGV4YW1wbGUKICogUlRFIGluZGV4ZXMgd2l0aGluIGl0 IG1lYW4gc29tZXRoaW5nIGRpZmZlcmVudCBmcm9tIHRob3NlIGtub3duIHRvIHRoZQogKiBT dWJxdWVyeVNjYW5QYXRoLiAgcGF0aC5wYXJlbnQtPnN1YnJvb3QgaXMgdGhlIHBsYW5uaW5n IGNvbnRleHQgbmVlZGVkIHRvCiAqIGludGVycHJldCB0aGUgc3VicGF0aC4KICovCnR5cGVk ZWYgc3RydWN0IFN1YnF1ZXJ5U2NhblBhdGgKewoJUGF0aAkJcGF0aDsKCVBhdGgJICAgKnN1 YnBhdGg7CQkvKiBwYXRoIHJlcHJlc2VudGluZyBzdWJxdWVyeSBleGVjdXRpb24gKi8KfSBT dWJxdWVyeVNjYW5QYXRoOwoKLyoKICogRm9yZWlnblBhdGggcmVwcmVzZW50cyBhIHBvdGVu dGlhbCBzY2FuIG9mIGEgZm9yZWlnbiB0YWJsZSwgZm9yZWlnbiBqb2luCiAqIG9yIGZvcmVp Z24gdXBwZXItcmVsYXRpb24uCiAqCiAqIEluIHRoZSBjYXNlIG9mIGEgZm9yZWlnbiBqb2lu LCBmZHdfcmVzdHJpY3RpbmZvIHN0b3JlcyB0aGUgUmVzdHJpY3RJbmZvcyB0bwogKiBhcHBs eSB0byB0aGUgam9pbiwgd2hpY2ggYXJlIHVzZWQgYnkgY3JlYXRlcGxhbi5jIHRvIGdldCBw c2V1ZG9jb25zdGFudAogKiBjbGF1c2VzIGV2YWx1YXRlZCBhcyBvbmUtdGltZSBxdWFscyBp biBhIGdhdGluZyBSZXN1bHQgcGxhbiBub2RlLgogKgogKiBmZHdfcHJpdmF0ZSBzdG9yZXMg RkRXIHByaXZhdGUgZGF0YSBhYm91dCB0aGUgc2Nhbi4gIFdoaWxlIGZkd19wcml2YXRlIGlz CiAqIG5vdCBhY3R1YWxseSB0b3VjaGVkIGJ5IHRoZSBjb3JlIGNvZGUgZHVyaW5nIG5vcm1h bCBvcGVyYXRpb25zLCBpdCdzCiAqIGdlbmVyYWxseSBhIGdvb2QgaWRlYSB0byB1c2UgYSBy ZXByZXNlbnRhdGlvbiB0aGF0IGNhbiBiZSBkdW1wZWQgYnkKICogbm9kZVRvU3RyaW5nKCks IHNvIHRoYXQgeW91IGNhbiBleGFtaW5lIHRoZSBzdHJ1Y3R1cmUgZHVyaW5nIGRlYnVnZ2lu ZwogKiB3aXRoIHRvb2xzIGxpa2UgcHByaW50KCkuCiAqLwp0eXBlZGVmIHN0cnVjdCBGb3Jl aWduUGF0aAp7CglQYXRoCQlwYXRoOwoJUGF0aAkgICAqZmR3X291dGVycGF0aDsKCUxpc3QJ ICAgKmZkd19yZXN0cmljdGluZm87CglMaXN0CSAgICpmZHdfcHJpdmF0ZTsKfSBGb3JlaWdu UGF0aDsKCi8qCiAqIEN1c3RvbVBhdGggcmVwcmVzZW50cyBhIHRhYmxlIHNjYW4gb3IgYSB0 YWJsZSBqb2luIGRvbmUgYnkgc29tZSBvdXQtb2YtY29yZQogKiBleHRlbnNpb24uCiAqCiAq IFdlIHByb3ZpZGUgYSBzZXQgb2YgaG9va3MgaGVyZSAtIHdoaWNoIHRoZSBwcm92aWRlciBt dXN0IHRha2UgY2FyZSB0byBzZXQKICogdXAgY29ycmVjdGx5IC0gdG8gYWxsb3cgZXh0ZW5z aW9ucyB0byBzdXBwbHkgdGhlaXIgb3duIG1ldGhvZHMgb2Ygc2Nhbm5pbmcKICogYSByZWxh dGlvbiBvciBqb2luIHJlbGF0aW9ucy4gIEZvciBleGFtcGxlLCBhIHByb3ZpZGVyIG1pZ2h0 IHByb3ZpZGUgR1BVCiAqIGFjY2VsZXJhdGlvbiwgYSBjYWNoZS1iYXNlZCBzY2FuLCBvciBz b21lIG90aGVyIGtpbmQgb2YgbG9naWMgd2UgaGF2ZW4ndAogKiBkcmVhbWVkIHVwIHlldC4K ICoKICogQ3VzdG9tUGF0aHMgY2FuIGJlIGluamVjdGVkIGludG8gdGhlIHBsYW5uaW5nIHBy b2Nlc3MgZm9yIGEgYmFzZSBvciBqb2luCiAqIHJlbGF0aW9uIGJ5IHNldF9yZWxfcGF0aGxp c3RfaG9vayBvciBzZXRfam9pbl9wYXRobGlzdF9ob29rIGZ1bmN0aW9ucywKICogcmVzcGVj dGl2ZWx5LgogKgogKiBJbiB0aGUgY2FzZSBvZiBhIHRhYmxlIGpvaW4sIGN1c3RvbV9yZXN0 cmljdGluZm8gc3RvcmVzIHRoZSBSZXN0cmljdEluZm9zCiAqIHRvIGFwcGx5IHRvIHRoZSBq b2luLCB3aGljaCBhcmUgdXNlZCBieSBjcmVhdGVwbGFuLmMgdG8gZ2V0IHBzZXVkb2NvbnN0 YW50CiAqIGNsYXVzZXMgZXZhbHVhdGVkIGFzIG9uZS10aW1lIHF1YWxzIGluIGEgZ2F0aW5n IFJlc3VsdCBwbGFuIG5vZGUuCiAqCiAqIENvcmUgY29kZSBtdXN0IGF2b2lkIGFzc3VtaW5n IHRoYXQgdGhlIEN1c3RvbVBhdGggaXMgb25seSBhcyBsYXJnZSBhcwogKiB0aGUgc3RydWN0 dXJlIGRlY2xhcmVkIGhlcmU7IHByb3ZpZGVycyBhcmUgYWxsb3dlZCB0byBtYWtlIGl0IHRo ZSBmaXJzdAogKiBlbGVtZW50IGluIGEgbGFyZ2VyIHN0cnVjdHVyZS4gIChTaW5jZSB0aGUg cGxhbm5lciBuZXZlciBjb3BpZXMgUGF0aHMsCiAqIHRoaXMgZG9lc24ndCBhZGQgYW55IGNv bXBsaWNhdGlvbi4pICBIb3dldmVyLCBmb3IgY29uc2lzdGVuY3kgd2l0aCB0aGUKICogRkRX IGNhc2UsIHdlIHByb3ZpZGUgYSAiY3VzdG9tX3ByaXZhdGUiIGZpZWxkIGluIEN1c3RvbVBh dGg7IHByb3ZpZGVycwogKiBtYXkgcHJlZmVyIHRvIHVzZSB0aGF0IHJhdGhlciB0aGFuIGRl ZmluZSBhbm90aGVyIHN0cnVjdCB0eXBlLgogKi8KCnN0cnVjdCBDdXN0b21QYXRoTWV0aG9k czsKCnR5cGVkZWYgc3RydWN0IEN1c3RvbVBhdGgKewoJUGF0aAkJcGF0aDsKCXVpbnQzMgkJ ZmxhZ3M7CQkJLyogbWFzayBvZiBDVVNUT01QQVRIXyogZmxhZ3MsIHNlZQoJCQkJCQkJCSAq IG5vZGVzL2V4dGVuc2libGUuaCAqLwoJTGlzdAkgICAqY3VzdG9tX3BhdGhzOwkvKiBsaXN0 IG9mIGNoaWxkIFBhdGggbm9kZXMsIGlmIGFueSAqLwoJTGlzdAkgICAqY3VzdG9tX3Jlc3Ry aWN0aW5mbzsKCUxpc3QJICAgKmN1c3RvbV9wcml2YXRlOwoJY29uc3Qgc3RydWN0IEN1c3Rv bVBhdGhNZXRob2RzICptZXRob2RzOwp9IEN1c3RvbVBhdGg7CgovKgogKiBBcHBlbmRQYXRo IHJlcHJlc2VudHMgYW4gQXBwZW5kIHBsYW4sIGllLCBzdWNjZXNzaXZlIGV4ZWN1dGlvbiBv ZgogKiBzZXZlcmFsIG1lbWJlciBwbGFucy4KICoKICogRm9yIHBhcnRpYWwgQXBwZW5kLCAn c3VicGF0aHMnIGNvbnRhaW5zIG5vbi1wYXJ0aWFsIHN1YnBhdGhzIGZvbGxvd2VkIGJ5CiAq IHBhcnRpYWwgc3VicGF0aHMuCiAqCiAqIFdoZW5ldmVyIGFjY3VtdWxhdGVfYXBwZW5kX3N1 YnBhdGgoKSBhbGxvd3MgdXMgdG8gY29uc29saWRhdGUgbXVsdGlwbGUKICogbGV2ZWxzIG9m IEFwcGVuZCBwYXRocyBkb3duIHRvIG9uZSwgd2Ugc3RvcmUgdGhlIFJUSSBzZXRzIGZvciB0 aGUgb21pdHRlZAogKiBwYXRocyBpbiBjaGlsZF9hcHBlbmRfcmVsaWRfc2V0cy4gVGhpcyBp cyBub3QgbmVjZXNzYXJ5IGZvciBwbGFubmluZyBvcgogKiBleGVjdXRpb247IHdlIGRvIGl0 IGZvciB0aGUgYmVuZWZpdCBvZiBjb2RlIHRoYXQgd2FudHMgdG8gaW5zcGVjdCB0aGUKICog ZmluYWwgcGxhbiBhbmQgdW5kZXJzdGFuZCBob3cgaXQgY2FtZSB0byBiZS4KICoKICogTm90 ZTogaXQgaXMgcG9zc2libGUgZm9yICJzdWJwYXRocyIgdG8gY29udGFpbiBvbmx5IG9uZSwg b3IgZXZlbiBubywKICogZWxlbWVudHMuICBUaGVzZSBjYXNlcyBhcmUgb3B0aW1pemVkIGR1 cmluZyBjcmVhdGVfYXBwZW5kX3BsYW4uCiAqIEluIHBhcnRpY3VsYXIsIGFuIEFwcGVuZFBh dGggd2l0aCBubyBzdWJwYXRocyBpcyBhICJkdW1teSIgcGF0aCB0aGF0CiAqIGlzIGNyZWF0 ZWQgdG8gcmVwcmVzZW50IHRoZSBjYXNlIHRoYXQgYSByZWxhdGlvbiBpcyBwcm92YWJseSBl bXB0eS4KICogKFRoaXMgaXMgYSBjb252ZW5pZW50IHJlcHJlc2VudGF0aW9uIGJlY2F1c2Ug aXQgbWVhbnMgdGhhdCB3aGVuIHdlIGJ1aWxkCiAqIGFuIGFwcGVuZHJlbCBhbmQgZmluZCB0 aGF0IGFsbCBpdHMgY2hpbGRyZW4gaGF2ZSBiZWVuIGV4Y2x1ZGVkLCBubyBleHRyYQogKiBh Y3Rpb24gaXMgbmVlZGVkIHRvIHJlY29nbml6ZSB0aGUgcmVsYXRpb24gYXMgZHVtbXkuKQog Ki8KdHlwZWRlZiBzdHJ1Y3QgQXBwZW5kUGF0aAp7CglQYXRoCQlwYXRoOwoJTGlzdAkgICAq c3VicGF0aHM7CQkvKiBsaXN0IG9mIGNvbXBvbmVudCBQYXRocyAqLwoJLyogSW5kZXggb2Yg Zmlyc3QgcGFydGlhbCBwYXRoIGluIHN1YnBhdGhzOyBsaXN0X2xlbmd0aChzdWJwYXRocykg aWYgbm9uZSAqLwoJaW50CQkJZmlyc3RfcGFydGlhbF9wYXRoOwoJQ2FyZGluYWxpdHkgbGlt aXRfdHVwbGVzOwkvKiBoYXJkIGxpbWl0IG9uIG91dHB1dCB0dXBsZXMsIG9yIC0xICovCglM aXN0CSAgICpjaGlsZF9hcHBlbmRfcmVsaWRfc2V0czsKfSBBcHBlbmRQYXRoOwoKI2RlZmlu ZSBJU19EVU1NWV9BUFBFTkQocCkgXAoJKElzQSgocCksIEFwcGVuZFBhdGgpICYmICgoQXBw ZW5kUGF0aCAqKSAocCkpLT5zdWJwYXRocyA9PSBOSUwpCgovKgogKiBBIHJlbGF0aW9uIHRo YXQncyBiZWVuIHByb3ZlbiBlbXB0eSB3aWxsIGhhdmUgb25lIHBhdGggdGhhdCBpcyBkdW1t eQogKiAoYnV0IG1pZ2h0IGhhdmUgcHJvamVjdGlvbiBwYXRocyBvbiB0b3ApLiAgRm9yIGhp c3RvcmljYWwgcmVhc29ucywKICogdGhpcyBpcyBwcm92aWRlZCBhcyBhIG1hY3JvIHRoYXQg d3JhcHMgaXNfZHVtbXlfcmVsKCkuCiAqLwojZGVmaW5lIElTX0RVTU1ZX1JFTChyKSBpc19k dW1teV9yZWwocikKZXh0ZXJuIGJvb2wgaXNfZHVtbXlfcmVsKFJlbE9wdEluZm8gKnJlbCk7 CgovKgogKiBNZXJnZUFwcGVuZFBhdGggcmVwcmVzZW50cyBhIE1lcmdlQXBwZW5kIHBsYW4s IGllLCB0aGUgbWVyZ2luZyBvZiBzb3J0ZWQKICogcmVzdWx0cyBmcm9tIHNldmVyYWwgbWVt YmVyIHBsYW5zIHRvIHByb2R1Y2Ugc2ltaWxhcmx5LXNvcnRlZCBvdXRwdXQuCiAqCiAqIGNo aWxkX2FwcGVuZF9yZWxpZF9zZXRzIGhhcyB0aGUgc2FtZSBtZWFuaW5nIGhlcmUgYXMgZm9y IEFwcGVuZFBhdGguCiAqLwp0eXBlZGVmIHN0cnVjdCBNZXJnZUFwcGVuZFBhdGgKewoJUGF0 aAkJcGF0aDsKCUxpc3QJICAgKnN1YnBhdGhzOwkJLyogbGlzdCBvZiBjb21wb25lbnQgUGF0 aHMgKi8KCUNhcmRpbmFsaXR5IGxpbWl0X3R1cGxlczsJLyogaGFyZCBsaW1pdCBvbiBvdXRw dXQgdHVwbGVzLCBvciAtMSAqLwoJTGlzdAkgICAqY2hpbGRfYXBwZW5kX3JlbGlkX3NldHM7 Cn0gTWVyZ2VBcHBlbmRQYXRoOwoKLyoKICogR3JvdXBSZXN1bHRQYXRoIHJlcHJlc2VudHMg dXNlIG9mIGEgUmVzdWx0IHBsYW4gbm9kZSB0byBjb21wdXRlIHRoZQogKiBvdXRwdXQgb2Yg YSBkZWdlbmVyYXRlIEdST1VQIEJZIGNhc2UsIHdoZXJlaW4gd2Uga25vdyB3ZSBzaG91bGQg cHJvZHVjZQogKiBleGFjdGx5IG9uZSByb3csIHdoaWNoIG1pZ2h0IHRoZW4gYmUgZmlsdGVy ZWQgYnkgYSBIQVZJTkcgcXVhbC4KICoKICogTm90ZSB0aGF0IHF1YWxzIGlzIGEgbGlzdCBv ZiBiYXJlIGNsYXVzZXMsIG5vdCBSZXN0cmljdEluZm9zLgogKi8KdHlwZWRlZiBzdHJ1Y3Qg R3JvdXBSZXN1bHRQYXRoCnsKCVBhdGgJCXBhdGg7CglMaXN0CSAgICpxdWFsczsKfSBHcm91 cFJlc3VsdFBhdGg7CgovKgogKiBNYXRlcmlhbFBhdGggcmVwcmVzZW50cyB1c2Ugb2YgYSBN YXRlcmlhbCBwbGFuIG5vZGUsIGkuZS4sIGNhY2hpbmcgb2YKICogdGhlIG91dHB1dCBvZiBp dHMgc3VicGF0aC4gIFRoaXMgaXMgdXNlZCB3aGVuIHRoZSBzdWJwYXRoIGlzIGV4cGVuc2l2 ZQogKiBhbmQgbmVlZHMgdG8gYmUgc2Nhbm5lZCByZXBlYXRlZGx5LCBvciB3aGVuIHdlIG5l ZWQgbWFyay9yZXN0b3JlIGFiaWxpdHkKICogYW5kIHRoZSBzdWJwYXRoIGRvZXNuJ3QgaGF2 ZSBpdC4KICovCnR5cGVkZWYgc3RydWN0IE1hdGVyaWFsUGF0aAp7CglQYXRoCQlwYXRoOwoJ UGF0aAkgICAqc3VicGF0aDsKfSBNYXRlcmlhbFBhdGg7CgovKgogKiBNZW1vaXplUGF0aCBy ZXByZXNlbnRzIGEgTWVtb2l6ZSBwbGFuIG5vZGUsIGkuZS4sIGEgY2FjaGUgdGhhdCBjYWNo ZXMKICogdHVwbGVzIGZyb20gcGFyYW1ldGVyaXplZCBwYXRocyB0byBzYXZlIHRoZSB1bmRl cmx5aW5nIG5vZGUgZnJvbSBoYXZpbmcgdG8KICogYmUgcmVzY2FubmVkIGZvciBwYXJhbWV0 ZXIgdmFsdWVzIHdoaWNoIGFyZSBhbHJlYWR5IGNhY2hlZC4KICovCnR5cGVkZWYgc3RydWN0 IE1lbW9pemVQYXRoCnsKCVBhdGgJCXBhdGg7CglQYXRoCSAgICpzdWJwYXRoOwkJLyogb3V0 ZXJwYXRoIHRvIGNhY2hlIHR1cGxlcyBmcm9tICovCglMaXN0CSAgICpoYXNoX29wZXJhdG9y czsgLyogT0lEcyBvZiBoYXNoIGVxdWFsaXR5IG9wcyBmb3IgY2FjaGUga2V5cyAqLwoJTGlz dAkgICAqcGFyYW1fZXhwcnM7CS8qIGV4cHJlc3Npb25zIHRoYXQgYXJlIGNhY2hlIGtleXMg Ki8KCWJvb2wJCXNpbmdsZXJvdzsJCS8qIHRydWUgaWYgdGhlIGNhY2hlIGVudHJ5IGlzIHRv IGJlIG1hcmtlZCBhcwoJCQkJCQkJCSAqIGNvbXBsZXRlIGFmdGVyIGNhY2hpbmcgdGhlIGZp cnN0IHJlY29yZC4gKi8KCWJvb2wJCWJpbmFyeV9tb2RlOwkvKiB0cnVlIHdoZW4gY2FjaGUg a2V5IHNob3VsZCBiZSBjb21wYXJlZCBiaXQKCQkJCQkJCQkgKiBieSBiaXQsIGZhbHNlIHdo ZW4gdXNpbmcgaGFzaCBlcXVhbGl0eSBvcHMgKi8KCXVpbnQzMgkJZXN0X2VudHJpZXM7CS8q IFRoZSBtYXhpbXVtIG51bWJlciBvZiBlbnRyaWVzIHRoYXQgdGhlCgkJCQkJCQkJICogcGxh bm5lciBleHBlY3RzIHdpbGwgZml0IGluIHRoZSBjYWNoZSwgb3IgMAoJCQkJCQkJCSAqIGlm IHVua25vd24gKi8KCUNhcmRpbmFsaXR5IGVzdF9jYWxsczsJCS8qIGV4cGVjdGVkIG51bWJl ciBvZiByZXNjYW5zICovCglDYXJkaW5hbGl0eSBlc3RfdW5pcXVlX2tleXM7CS8qIGVzdGlt YXRlZCB1bmlxdWUga2V5cywgZm9yIEVYUExBSU4gKi8KCWRvdWJsZQkJZXN0X2hpdF9yYXRp bzsJLyogZXN0aW1hdGVkIGNhY2hlIGhpdCByYXRpbywgZm9yIEVYUExBSU4gKi8KfSBNZW1v aXplUGF0aDsKCi8qCiAqIEdhdGhlclBhdGggcnVucyBzZXZlcmFsIGNvcGllcyBvZiBhIHBs YW4gaW4gcGFyYWxsZWwgYW5kIGNvbGxlY3RzIHRoZQogKiByZXN1bHRzLiAgVGhlIHBhcmFs bGVsIGxlYWRlciBtYXkgYWxzbyBleGVjdXRlIHRoZSBwbGFuLCB1bmxlc3MgdGhlCiAqIHNp bmdsZV9jb3B5IGZsYWcgaXMgc2V0LgogKi8KdHlwZWRlZiBzdHJ1Y3QgR2F0aGVyUGF0aAp7 CglQYXRoCQlwYXRoOwoJUGF0aAkgICAqc3VicGF0aDsJCS8qIHBhdGggZm9yIGVhY2ggd29y a2VyICovCglib29sCQlzaW5nbGVfY29weTsJLyogZG9uJ3QgZXhlY3V0ZSBwYXRoIG1vcmUg dGhhbiBvbmNlICovCglpbnQJCQludW1fd29ya2VyczsJLyogbnVtYmVyIG9mIHdvcmtlcnMg c291Z2h0IHRvIGhlbHAgKi8KfSBHYXRoZXJQYXRoOwoKLyoKICogR2F0aGVyTWVyZ2VQYXRo IHJ1bnMgc2V2ZXJhbCBjb3BpZXMgb2YgYSBwbGFuIGluIHBhcmFsbGVsIGFuZCBjb2xsZWN0 cwogKiB0aGUgcmVzdWx0cywgcHJlc2VydmluZyB0aGVpciBjb21tb24gc29ydCBvcmRlci4K ICovCnR5cGVkZWYgc3RydWN0IEdhdGhlck1lcmdlUGF0aAp7CglQYXRoCQlwYXRoOwoJUGF0 aAkgICAqc3VicGF0aDsJCS8qIHBhdGggZm9yIGVhY2ggd29ya2VyICovCglpbnQJCQludW1f d29ya2VyczsJLyogbnVtYmVyIG9mIHdvcmtlcnMgc291Z2h0IHRvIGhlbHAgKi8KfSBHYXRo ZXJNZXJnZVBhdGg7CgoKLyoKICogQWxsIGpvaW4tdHlwZSBwYXRocyBzaGFyZSB0aGVzZSBm aWVsZHMuCiAqLwoKdHlwZWRlZiBzdHJ1Y3QgSm9pblBhdGgKewoJcGdfbm9kZV9hdHRyKGFi c3RyYWN0KQoKCVBhdGgJCXBhdGg7CgoJSm9pblR5cGUJam9pbnR5cGU7CgoJYm9vbAkJaW5u ZXJfdW5pcXVlOwkvKiBlYWNoIG91dGVyIHR1cGxlIHByb3ZhYmx5IG1hdGNoZXMgbm8gbW9y ZQoJCQkJCQkJCSAqIHRoYW4gb25lIGlubmVyIHR1cGxlICovCgoJUGF0aAkgICAqb3V0ZXJq b2lucGF0aDsJLyogcGF0aCBmb3IgdGhlIG91dGVyIHNpZGUgb2YgdGhlIGpvaW4gKi8KCVBh dGgJICAgKmlubmVyam9pbnBhdGg7CS8qIHBhdGggZm9yIHRoZSBpbm5lciBzaWRlIG9mIHRo ZSBqb2luICovCgoJTGlzdAkgICAqam9pbnJlc3RyaWN0aW5mbzsJLyogUmVzdHJpY3RJbmZv cyB0byBhcHBseSB0byBqb2luICovCgoJLyoKCSAqIFNlZSB0aGUgbm90ZXMgZm9yIFJlbE9w dEluZm8gYW5kIFBhcmFtUGF0aEluZm8gdG8gdW5kZXJzdGFuZCB3aHkKCSAqIGpvaW5yZXN0 cmljdGluZm8gaXMgbmVlZGVkIGluIEpvaW5QYXRoLCBhbmQgY2FuJ3QgYmUgbWVyZ2VkIGlu dG8gdGhlCgkgKiBwYXJlbnQgUmVsT3B0SW5mby4KCSAqLwp9IEpvaW5QYXRoOwoKLyoKICog QSBuZXN0ZWQtbG9vcCBwYXRoIG5lZWRzIG5vIHNwZWNpYWwgZmllbGRzLgogKi8KCnR5cGVk ZWYgc3RydWN0IE5lc3RQYXRoCnsKCUpvaW5QYXRoCWpwYXRoOwp9IE5lc3RQYXRoOwoKLyoK ICogQSBtZXJnZWpvaW4gcGF0aCBoYXMgdGhlc2UgZmllbGRzLgogKgogKiBVbmxpa2Ugb3Ro ZXIgcGF0aCB0eXBlcywgYSBNZXJnZVBhdGggbm9kZSBkb2Vzbid0IHJlcHJlc2VudCBqdXN0 IGEgc2luZ2xlCiAqIHJ1bi10aW1lIHBsYW4gbm9kZTogaXQgY2FuIHJlcHJlc2VudCB1cCB0 byBmb3VyLiAgQXNpZGUgZnJvbSB0aGUgTWVyZ2VKb2luCiAqIG5vZGUgaXRzZWxmLCB0aGVy ZSBjYW4gYmUgYSBTb3J0IG5vZGUgZm9yIHRoZSBvdXRlciBpbnB1dCwgYSBTb3J0IG5vZGUK ICogZm9yIHRoZSBpbm5lciBpbnB1dCwgYW5kL29yIGEgTWF0ZXJpYWwgbm9kZSBmb3IgdGhl IGlubmVyIGlucHV0LiAgV2UgY291bGQKICogcmVwcmVzZW50IHRoZXNlIG5vZGVzIGJ5IHNl cGFyYXRlIHBhdGggbm9kZXMsIGJ1dCBjb25zaWRlcmluZyBob3cgbWFueQogKiBkaWZmZXJl bnQgbWVyZ2UgcGF0aHMgYXJlIGludmVzdGlnYXRlZCBkdXJpbmcgYSBjb21wbGV4IGpvaW4g cHJvYmxlbSwKICogaXQgc2VlbXMgYmV0dGVyIHRvIGF2b2lkIHVubmVjZXNzYXJ5IHBhbGxv YyBvdmVyaGVhZC4KICoKICogcGF0aF9tZXJnZWNsYXVzZXMgbGlzdHMgdGhlIGNsYXVzZXMg KGluIHRoZSBmb3JtIG9mIFJlc3RyaWN0SW5mb3MpCiAqIHRoYXQgd2lsbCBiZSB1c2VkIGlu IHRoZSBtZXJnZS4KICoKICogTm90ZSB0aGF0IHRoZSBtZXJnZWNsYXVzZXMgYXJlIGEgc3Vi c2V0IG9mIHRoZSBwYXJlbnQgcmVsYXRpb24ncwogKiByZXN0cmljdGlvbi1jbGF1c2UgbGlz dC4gIEFueSBqb2luIGNsYXVzZXMgdGhhdCBhcmUgbm90IG1lcmdlam9pbmFibGUKICogYXBw ZWFyIG9ubHkgaW4gdGhlIHBhcmVudCdzIHJlc3RyaWN0IGxpc3QsIGFuZCBtdXN0IGJlIGNo ZWNrZWQgYnkgYQogKiBxcHF1YWwgYXQgZXhlY3V0aW9uIHRpbWUuCiAqCiAqIG91dGVyc29y dGtleXMgKHJlc3AuIGlubmVyc29ydGtleXMpIGlzIE5JTCBpZiB0aGUgb3V0ZXIgcGF0aAog KiAocmVzcC4gaW5uZXIgcGF0aCkgaXMgYWxyZWFkeSBvcmRlcmVkIGFwcHJvcHJpYXRlbHkg Zm9yIHRoZQogKiBtZXJnZWpvaW4uICBJZiBpdCBpcyBub3QgTklMIHRoZW4gaXQgaXMgYSBQ YXRoS2V5cyBsaXN0IGRlc2NyaWJpbmcKICogdGhlIG9yZGVyaW5nIHRoYXQgbXVzdCBiZSBj cmVhdGVkIGJ5IGFuIGV4cGxpY2l0IFNvcnQgbm9kZS4KICoKICogb3V0ZXJfcHJlc29ydGVk X2tleXMgaXMgdGhlIG51bWJlciBvZiBwcmVzb3J0ZWQga2V5cyBvZiB0aGUgb3V0ZXIKICog cGF0aCB0aGF0IG1hdGNoIG91dGVyc29ydGtleXMuICBJdCBpcyB1c2VkIHRvIGRldGVybWlu ZSB3aGV0aGVyCiAqIGV4cGxpY2l0IGluY3JlbWVudGFsIHNvcnQgY2FuIGJlIGFwcGxpZWQg d2hlbiBvdXRlcnNvcnRrZXlzIGlzIG5vdAogKiBOSUwuICBXZSBkbyBub3QgdHJhY2sgdGhl IG51bWJlciBvZiBwcmVzb3J0ZWQga2V5cyBvZiB0aGUgaW5uZXIKICogcGF0aCwgYXMgaW5j cmVtZW50YWwgc29ydCBjdXJyZW50bHkgZG9lcyBub3Qgc3VwcG9ydCBtYXJrL3Jlc3RvcmUu CiAqCiAqIHNraXBfbWFya19yZXN0b3JlIGlzIHRydWUgaWYgdGhlIGV4ZWN1dG9yIG5lZWQg bm90IGRvIG1hcmsvcmVzdG9yZSBjYWxscy4KICogTWFyay9yZXN0b3JlIG92ZXJoZWFkIGlz IHVzdWFsbHkgcmVxdWlyZWQsIGJ1dCBjYW4gYmUgc2tpcHBlZCBpZiB3ZSBrbm93CiAqIHRo YXQgdGhlIGV4ZWN1dG9yIG5lZWQgZmluZCBvbmx5IG9uZSBtYXRjaCBwZXIgb3V0ZXIgdHVw bGUsIGFuZCB0aGF0IHRoZQogKiBtZXJnZWNsYXVzZXMgYXJlIHN1ZmZpY2llbnQgdG8gaWRl bnRpZnkgYSBtYXRjaC4gIEluIHN1Y2ggY2FzZXMgdGhlCiAqIGV4ZWN1dG9yIGNhbiBpbW1l ZGlhdGVseSBhZHZhbmNlIHRoZSBvdXRlciByZWxhdGlvbiBhZnRlciBwcm9jZXNzaW5nIGEK ICogbWF0Y2gsIGFuZCB0aGVyZWZvcmUgaXQgbmVlZCBuZXZlciBiYWNrIHVwIHRoZSBpbm5l ciByZWxhdGlvbi4KICoKICogbWF0ZXJpYWxpemVfaW5uZXIgaXMgdHJ1ZSBpZiBhIE1hdGVy aWFsIG5vZGUgc2hvdWxkIGJlIHBsYWNlZCBhdG9wIHRoZQogKiBpbm5lciBpbnB1dC4gIFRo aXMgbWF5IGFwcGVhciB3aXRoIG9yIHdpdGhvdXQgYW4gaW5uZXIgU29ydCBzdGVwLgogKi8K CnR5cGVkZWYgc3RydWN0IE1lcmdlUGF0aAp7CglKb2luUGF0aAlqcGF0aDsKCUxpc3QJICAg KnBhdGhfbWVyZ2VjbGF1c2VzOwkvKiBqb2luIGNsYXVzZXMgdG8gYmUgdXNlZCBmb3IgbWVy Z2UgKi8KCUxpc3QJICAgKm91dGVyc29ydGtleXM7CS8qIGtleXMgZm9yIGV4cGxpY2l0IHNv cnQsIGlmIGFueSAqLwoJTGlzdAkgICAqaW5uZXJzb3J0a2V5czsJLyoga2V5cyBmb3IgZXhw bGljaXQgc29ydCwgaWYgYW55ICovCglpbnQJCQlvdXRlcl9wcmVzb3J0ZWRfa2V5czsJLyog bnVtYmVyIG9mIHByZXNvcnRlZCBrZXlzIG9mIHRoZQoJCQkJCQkJCQkJICogb3V0ZXIgcGF0 aCAqLwoJYm9vbAkJc2tpcF9tYXJrX3Jlc3RvcmU7CS8qIGNhbiBleGVjdXRvciBza2lwIG1h cmsvcmVzdG9yZT8gKi8KCWJvb2wJCW1hdGVyaWFsaXplX2lubmVyOwkvKiBhZGQgTWF0ZXJp YWxpemUgdG8gaW5uZXI/ICovCn0gTWVyZ2VQYXRoOwoKLyoKICogQSBoYXNoam9pbiBwYXRo IGhhcyB0aGVzZSBmaWVsZHMuCiAqCiAqIFRoZSByZW1hcmtzIGFib3ZlIGZvciBtZXJnZWNs YXVzZXMgYXBwbHkgZm9yIGhhc2hjbGF1c2VzIGFzIHdlbGwuCiAqCiAqIEhhc2hqb2luIGRv ZXMgbm90IGNhcmUgd2hhdCBvcmRlciBpdHMgaW5wdXRzIGFwcGVhciBpbiwgc28gd2UgaGF2 ZQogKiBubyBuZWVkIGZvciBzb3J0a2V5cy4KICovCgp0eXBlZGVmIHN0cnVjdCBIYXNoUGF0 aAp7CglKb2luUGF0aAlqcGF0aDsKCUxpc3QJICAgKnBhdGhfaGFzaGNsYXVzZXM7CS8qIGpv aW4gY2xhdXNlcyB1c2VkIGZvciBoYXNoaW5nICovCglpbnQJCQludW1fYmF0Y2hlczsJLyog bnVtYmVyIG9mIGJhdGNoZXMgZXhwZWN0ZWQgKi8KCUNhcmRpbmFsaXR5IGlubmVyX3Jvd3Nf dG90YWw7CS8qIHRvdGFsIGlubmVyIHJvd3MgZXhwZWN0ZWQgKi8KfSBIYXNoUGF0aDsKCi8q CiAqIFByb2plY3Rpb25QYXRoIHJlcHJlc2VudHMgYSBwcm9qZWN0aW9uICh0aGF0IGlzLCB0 YXJnZXRsaXN0IGNvbXB1dGF0aW9uKQogKgogKiBOb21pbmFsbHksIHRoaXMgcGF0aCBub2Rl IHJlcHJlc2VudHMgdXNpbmcgYSBSZXN1bHQgcGxhbiBub2RlIHRvIGRvIGEKICogcHJvamVj dGlvbiBzdGVwLiAgSG93ZXZlciwgaWYgdGhlIGlucHV0IHBsYW4gbm9kZSBzdXBwb3J0cyBw cm9qZWN0aW9uLAogKiB3ZSBjYW4ganVzdCBtb2RpZnkgaXRzIG91dHB1dCB0YXJnZXRsaXN0 IHRvIGRvIHRoZSByZXF1aXJlZCBjYWxjdWxhdGlvbnMKICogZGlyZWN0bHksIGFuZCBub3Qg bmVlZCBhIFJlc3VsdC4gIEluIHNvbWUgcGxhY2VzIGluIHRoZSBwbGFubmVyIHdlIGNhbiBq dXN0CiAqIGphbSB0aGUgZGVzaXJlZCBQYXRoVGFyZ2V0IGludG8gdGhlIGlucHV0IHBhdGgg bm9kZSAoYW5kIGFkanVzdCBpdHMgY29zdAogKiBhY2NvcmRpbmdseSksIHNvIHdlIGRvbid0 IG5lZWQgYSBQcm9qZWN0aW9uUGF0aC4gIEJ1dCBpbiBvdGhlciBwbGFjZXMKICogaXQncyBu ZWNlc3NhcnkgdG8gbm90IG1vZGlmeSB0aGUgaW5wdXQgcGF0aCBub2RlLCBzbyB3ZSBuZWVk IGEgc2VwYXJhdGUKICogUHJvamVjdGlvblBhdGggbm9kZSwgd2hpY2ggaXMgbWFya2VkIGR1 bW15IHRvIGluZGljYXRlIHRoYXQgd2UgaW50ZW5kIHRvCiAqIGFzc2lnbiB0aGUgd29yayB0 byB0aGUgaW5wdXQgcGxhbiBub2RlLiAgVGhlIGVzdGltYXRlZCBjb3N0IGZvciB0aGUKICog UHJvamVjdGlvblBhdGggbm9kZSB3aWxsIGFjY291bnQgZm9yIHdoZXRoZXIgYSBSZXN1bHQg d2lsbCBiZSB1c2VkIG9yIG5vdC4KICovCnR5cGVkZWYgc3RydWN0IFByb2plY3Rpb25QYXRo CnsKCVBhdGgJCXBhdGg7CglQYXRoCSAgICpzdWJwYXRoOwkJLyogcGF0aCByZXByZXNlbnRp bmcgaW5wdXQgc291cmNlICovCglib29sCQlkdW1teXBwOwkJLyogdHJ1ZSBpZiBubyBzZXBh cmF0ZSBSZXN1bHQgaXMgbmVlZGVkICovCn0gUHJvamVjdGlvblBhdGg7CgovKgogKiBQcm9q ZWN0U2V0UGF0aCByZXByZXNlbnRzIGV2YWx1YXRpb24gb2YgYSB0YXJnZXRsaXN0IHRoYXQg aW5jbHVkZXMKICogc2V0LXJldHVybmluZyBmdW5jdGlvbihzKSwgd2hpY2ggd2lsbCBuZWVk IHRvIGJlIGltcGxlbWVudGVkIGJ5IGEKICogUHJvamVjdFNldCBwbGFuIG5vZGUuCiAqLwp0 eXBlZGVmIHN0cnVjdCBQcm9qZWN0U2V0UGF0aAp7CglQYXRoCQlwYXRoOwoJUGF0aAkgICAq c3VicGF0aDsJCS8qIHBhdGggcmVwcmVzZW50aW5nIGlucHV0IHNvdXJjZSAqLwp9IFByb2pl Y3RTZXRQYXRoOwoKLyoKICogU29ydFBhdGggcmVwcmVzZW50cyBhbiBleHBsaWNpdCBzb3J0 IHN0ZXAKICoKICogVGhlIHNvcnQga2V5cyBhcmUsIGJ5IGRlZmluaXRpb24sIHRoZSBzYW1l IGFzIHBhdGgucGF0aGtleXMuCiAqCiAqIE5vdGU6IHRoZSBTb3J0IHBsYW4gbm9kZSBjYW5u b3QgcHJvamVjdCwgc28gcGF0aC5wYXRodGFyZ2V0IG11c3QgYmUgdGhlCiAqIHNhbWUgYXMg dGhlIGlucHV0J3MgcGF0aHRhcmdldC4KICovCnR5cGVkZWYgc3RydWN0IFNvcnRQYXRoCnsK CVBhdGgJCXBhdGg7CglQYXRoCSAgICpzdWJwYXRoOwkJLyogcGF0aCByZXByZXNlbnRpbmcg aW5wdXQgc291cmNlICovCn0gU29ydFBhdGg7CgovKgogKiBJbmNyZW1lbnRhbFNvcnRQYXRo IHJlcHJlc2VudHMgYW4gaW5jcmVtZW50YWwgc29ydCBzdGVwCiAqCiAqIFRoaXMgaXMgbGlr ZSBhIHJlZ3VsYXIgc29ydCwgZXhjZXB0IHNvbWUgbGVhZGluZyBrZXkgY29sdW1ucyBhcmUg YXNzdW1lZAogKiB0byBiZSBvcmRlcmVkIGFscmVhZHkuCiAqLwp0eXBlZGVmIHN0cnVjdCBJ bmNyZW1lbnRhbFNvcnRQYXRoCnsKCVNvcnRQYXRoCXNwYXRoOwoJaW50CQkJblByZXNvcnRl ZENvbHM7IC8qIG51bWJlciBvZiBwcmVzb3J0ZWQgY29sdW1ucyAqLwp9IEluY3JlbWVudGFs U29ydFBhdGg7CgovKgogKiBHcm91cFBhdGggcmVwcmVzZW50cyBncm91cGluZyAob2YgcHJl c29ydGVkIGlucHV0KQogKgogKiBncm91cENsYXVzZSByZXByZXNlbnRzIHRoZSBjb2x1bW5z IHRvIGJlIGdyb3VwZWQgb247IHRoZSBpbnB1dCBwYXRoCiAqIG11c3QgYmUgYXQgbGVhc3Qg dGhhdCB3ZWxsIHNvcnRlZC4KICoKICogV2UgY2FuIGFsc28gYXBwbHkgYSBxdWFsIHRvIHRo ZSBncm91cGVkIHJvd3MgKGVxdWl2YWxlbnQgb2YgSEFWSU5HKQogKi8KdHlwZWRlZiBzdHJ1 Y3QgR3JvdXBQYXRoCnsKCVBhdGgJCXBhdGg7CglQYXRoCSAgICpzdWJwYXRoOwkJLyogcGF0 aCByZXByZXNlbnRpbmcgaW5wdXQgc291cmNlICovCglMaXN0CSAgICpncm91cENsYXVzZTsJ LyogYSBsaXN0IG9mIFNvcnRHcm91cENsYXVzZSdzICovCglMaXN0CSAgICpxdWFsOwkJCS8q IHF1YWxzIChIQVZJTkcgcXVhbHMpLCBpZiBhbnkgKi8KfSBHcm91cFBhdGg7CgovKgogKiBV bmlxdWVQYXRoIHJlcHJlc2VudHMgYWRqYWNlbnQtZHVwbGljYXRlIHJlbW92YWwgKGluIHBy ZXNvcnRlZCBpbnB1dCkKICoKICogVGhlIGNvbHVtbnMgdG8gYmUgY29tcGFyZWQgYXJlIHRo ZSBmaXJzdCBudW1rZXlzIGNvbHVtbnMgb2YgdGhlIHBhdGgncwogKiBwYXRoa2V5cy4gIFRo ZSBpbnB1dCBpcyBwcmVzdW1lZCBhbHJlYWR5IHNvcnRlZCB0aGF0IHdheS4KICovCnR5cGVk ZWYgc3RydWN0IFVuaXF1ZVBhdGgKewoJUGF0aAkJcGF0aDsKCVBhdGgJICAgKnN1YnBhdGg7 CQkvKiBwYXRoIHJlcHJlc2VudGluZyBpbnB1dCBzb3VyY2UgKi8KCWludAkJCW51bWtleXM7 CQkvKiBudW1iZXIgb2YgcGF0aGtleSBjb2x1bW5zIHRvIGNvbXBhcmUgKi8KfSBVbmlxdWVQ YXRoOwoKLyoKICogQWdnUGF0aCByZXByZXNlbnRzIGdlbmVyaWMgY29tcHV0YXRpb24gb2Yg YWdncmVnYXRlIGZ1bmN0aW9ucwogKgogKiBUaGlzIG1heSBpbnZvbHZlIHBsYWluIGdyb3Vw aW5nIChidXQgbm90IGdyb3VwaW5nIHNldHMpLCB1c2luZyBlaXRoZXIKICogc29ydGVkIG9y IGhhc2hlZCBncm91cGluZzsgZm9yIHRoZSBBR0dfU09SVEVEIGNhc2UsIHRoZSBpbnB1dCBt dXN0IGJlCiAqIGFwcHJvcHJpYXRlbHkgcHJlc29ydGVkLgogKi8KdHlwZWRlZiBzdHJ1Y3Qg QWdnUGF0aAp7CglQYXRoCQlwYXRoOwoJUGF0aAkgICAqc3VicGF0aDsJCS8qIHBhdGggcmVw cmVzZW50aW5nIGlucHV0IHNvdXJjZSAqLwoJQWdnU3RyYXRlZ3kgYWdnc3RyYXRlZ3k7CS8q IGJhc2ljIHN0cmF0ZWd5LCBzZWUgbm9kZXMuaCAqLwoJQWdnU3BsaXQJYWdnc3BsaXQ7CQkv KiBhZ2ctc3BsaXR0aW5nIG1vZGUsIHNlZSBub2Rlcy5oICovCglDYXJkaW5hbGl0eSBudW1H cm91cHM7CQkvKiBlc3RpbWF0ZWQgbnVtYmVyIG9mIGdyb3VwcyBpbiBpbnB1dCAqLwoJdWlu dDY0CQl0cmFuc2l0aW9uU3BhY2U7CS8qIGZvciBwYXNzLWJ5LXJlZiB0cmFuc2l0aW9uIGRh dGEgKi8KCUxpc3QJICAgKmdyb3VwQ2xhdXNlOwkvKiBhIGxpc3Qgb2YgU29ydEdyb3VwQ2xh dXNlJ3MgKi8KCUxpc3QJICAgKnF1YWw7CQkJLyogcXVhbHMgKEhBVklORyBxdWFscyksIGlm IGFueSAqLwp9IEFnZ1BhdGg7CgovKgogKiBWYXJpb3VzIGFubm90YXRpb25zIHVzZWQgZm9y IGdyb3VwaW5nIHNldHMgaW4gdGhlIHBsYW5uZXIuCiAqLwoKdHlwZWRlZiBzdHJ1Y3QgR3Jv dXBpbmdTZXREYXRhCnsKCXBnX25vZGVfYXR0cihub19jb3B5X2VxdWFsLCBub19yZWFkLCBu b19xdWVyeV9qdW1ibGUpCgoJTm9kZVRhZwkJdHlwZTsKCUxpc3QJICAgKnNldDsJCQkvKiBn cm91cGluZyBzZXQgYXMgbGlzdCBvZiBzb3J0Z3JvdXByZWZzICovCglDYXJkaW5hbGl0eSBu dW1Hcm91cHM7CQkvKiBlc3QuIG51bWJlciBvZiByZXN1bHQgZ3JvdXBzICovCn0gR3JvdXBp bmdTZXREYXRhOwoKdHlwZWRlZiBzdHJ1Y3QgUm9sbHVwRGF0YQp7CglwZ19ub2RlX2F0dHIo bm9fY29weV9lcXVhbCwgbm9fcmVhZCwgbm9fcXVlcnlfanVtYmxlKQoKCU5vZGVUYWcJCXR5 cGU7CglMaXN0CSAgICpncm91cENsYXVzZTsJLyogYXBwbGljYWJsZSBzdWJzZXQgb2YgcGFy c2UtPmdyb3VwQ2xhdXNlICovCglMaXN0CSAgICpnc2V0czsJCQkvKiBsaXN0cyBvZiBpbnRl Z2VyIGluZGV4ZXMgaW50byBncm91cENsYXVzZSAqLwoJTGlzdAkgICAqZ3NldHNfZGF0YTsJ CS8qIGxpc3Qgb2YgR3JvdXBpbmdTZXREYXRhICovCglDYXJkaW5hbGl0eSBudW1Hcm91cHM7 CQkvKiBlc3QuIG51bWJlciBvZiByZXN1bHQgZ3JvdXBzICovCglib29sCQloYXNoYWJsZTsJ CS8qIGNhbiBiZSBoYXNoZWQgKi8KCWJvb2wJCWlzX2hhc2hlZDsJCS8qIHRvIGJlIGltcGxl bWVudGVkIGFzIGEgaGFzaGFnZyAqLwp9IFJvbGx1cERhdGE7CgovKgogKiBHcm91cGluZ1Nl dHNQYXRoIHJlcHJlc2VudHMgYSBHUk9VUElORyBTRVRTIGFnZ3JlZ2F0aW9uCiAqLwoKdHlw ZWRlZiBzdHJ1Y3QgR3JvdXBpbmdTZXRzUGF0aAp7CglQYXRoCQlwYXRoOwoJUGF0aAkgICAq c3VicGF0aDsJCS8qIHBhdGggcmVwcmVzZW50aW5nIGlucHV0IHNvdXJjZSAqLwoJQWdnU3Ry YXRlZ3kgYWdnc3RyYXRlZ3k7CS8qIGJhc2ljIHN0cmF0ZWd5ICovCglMaXN0CSAgICpyb2xs dXBzOwkJLyogbGlzdCBvZiBSb2xsdXBEYXRhICovCglMaXN0CSAgICpxdWFsOwkJCS8qIHF1 YWxzIChIQVZJTkcgcXVhbHMpLCBpZiBhbnkgKi8KCXVpbnQ2NAkJdHJhbnNpdGlvblNwYWNl OwkvKiBmb3IgcGFzcy1ieS1yZWYgdHJhbnNpdGlvbiBkYXRhICovCn0gR3JvdXBpbmdTZXRz UGF0aDsKCi8qCiAqIE1pbk1heEFnZ1BhdGggcmVwcmVzZW50cyBjb21wdXRhdGlvbiBvZiBN SU4vTUFYIGFnZ3JlZ2F0ZXMgZnJvbSBpbmRleGVzCiAqLwp0eXBlZGVmIHN0cnVjdCBNaW5N YXhBZ2dQYXRoCnsKCVBhdGgJCXBhdGg7CglMaXN0CSAgICptbWFnZ3JlZ2F0ZXM7CS8qIGxp c3Qgb2YgTWluTWF4QWdnSW5mbyAqLwoJTGlzdAkgICAqcXVhbHM7CQkJLyogSEFWSU5HIHF1 YWxzLCBpZiBhbnkgKi8KfSBNaW5NYXhBZ2dQYXRoOwoKLyoKICogV2luZG93QWdnUGF0aCBy ZXByZXNlbnRzIGdlbmVyaWMgY29tcHV0YXRpb24gb2Ygd2luZG93IGZ1bmN0aW9ucwogKi8K dHlwZWRlZiBzdHJ1Y3QgV2luZG93QWdnUGF0aAp7CglQYXRoCQlwYXRoOwoJUGF0aAkgICAq c3VicGF0aDsJCS8qIHBhdGggcmVwcmVzZW50aW5nIGlucHV0IHNvdXJjZSAqLwoJV2luZG93 Q2xhdXNlICp3aW5jbGF1c2U7CS8qIFdpbmRvd0NsYXVzZSB3ZSdsbCBiZSB1c2luZyAqLwoJ TGlzdAkgICAqcXVhbDsJCQkvKiBsb3dlci1sZXZlbCBXaW5kb3dBZ2cgcnVuY29uZGl0aW9u cyAqLwoJTGlzdAkgICAqcnVuQ29uZGl0aW9uOwkvKiBPcEV4cHIgTGlzdCB0byBzaG9ydC1j aXJjdWl0IGV4ZWN1dGlvbiAqLwoJYm9vbAkJdG9wd2luZG93OwkJLyogZmFsc2UgZm9yIGFs bCBhcGFydCBmcm9tIHRoZSBXaW5kb3dBZ2cKCQkJCQkJCQkgKiB0aGF0J3MgY2xvc2VzdCB0 byB0aGUgcm9vdCBvZiB0aGUgcGxhbiAqLwp9IFdpbmRvd0FnZ1BhdGg7CgovKgogKiBTZXRP cFBhdGggcmVwcmVzZW50cyBhIHNldC1vcGVyYXRpb24sIHRoYXQgaXMgSU5URVJTRUNUIG9y IEVYQ0VQVAogKi8KdHlwZWRlZiBzdHJ1Y3QgU2V0T3BQYXRoCnsKCVBhdGgJCXBhdGg7CglQ YXRoCSAgICpsZWZ0cGF0aDsJCS8qIHBhdGhzIHJlcHJlc2VudGluZyBpbnB1dCBzb3VyY2Vz ICovCglQYXRoCSAgICpyaWdodHBhdGg7CglTZXRPcENtZAljbWQ7CQkJLyogd2hhdCB0byBk bywgc2VlIG5vZGVzLmggKi8KCVNldE9wU3RyYXRlZ3kgc3RyYXRlZ3k7CQkvKiBob3cgdG8g ZG8gaXQsIHNlZSBub2Rlcy5oICovCglMaXN0CSAgICpncm91cExpc3Q7CQkvKiBTb3J0R3Jv dXBDbGF1c2VzIGlkZW50aWZ5aW5nIHRhcmdldCBjb2xzICovCglDYXJkaW5hbGl0eSBudW1H cm91cHM7CQkvKiBlc3RpbWF0ZWQgbnVtYmVyIG9mIGdyb3VwcyBpbiBsZWZ0IGlucHV0ICov Cn0gU2V0T3BQYXRoOwoKLyoKICogUmVjdXJzaXZlVW5pb25QYXRoIHJlcHJlc2VudHMgYSBy ZWN1cnNpdmUgVU5JT04gbm9kZQogKi8KdHlwZWRlZiBzdHJ1Y3QgUmVjdXJzaXZlVW5pb25Q YXRoCnsKCVBhdGgJCXBhdGg7CglQYXRoCSAgICpsZWZ0cGF0aDsJCS8qIHBhdGhzIHJlcHJl c2VudGluZyBpbnB1dCBzb3VyY2VzICovCglQYXRoCSAgICpyaWdodHBhdGg7CglMaXN0CSAg ICpkaXN0aW5jdExpc3Q7CS8qIFNvcnRHcm91cENsYXVzZXMgaWRlbnRpZnlpbmcgdGFyZ2V0 IGNvbHMgKi8KCWludAkJCXd0UGFyYW07CQkvKiBJRCBvZiBQYXJhbSByZXByZXNlbnRpbmcg d29yayB0YWJsZSAqLwoJQ2FyZGluYWxpdHkgbnVtR3JvdXBzOwkJLyogZXN0aW1hdGVkIG51 bWJlciBvZiBncm91cHMgaW4gaW5wdXQgKi8KfSBSZWN1cnNpdmVVbmlvblBhdGg7CgovKgog KiBMb2NrUm93c1BhdGggcmVwcmVzZW50cyBhY3F1aXJpbmcgcm93IGxvY2tzIGZvciBTRUxF Q1QgRk9SIFVQREFURS9TSEFSRQogKi8KdHlwZWRlZiBzdHJ1Y3QgTG9ja1Jvd3NQYXRoCnsK CVBhdGgJCXBhdGg7CglQYXRoCSAgICpzdWJwYXRoOwkJLyogcGF0aCByZXByZXNlbnRpbmcg aW5wdXQgc291cmNlICovCglMaXN0CSAgICpyb3dNYXJrczsJCS8qIGEgbGlzdCBvZiBQbGFu Um93TWFyaydzICovCglpbnQJCQllcHFQYXJhbTsJCS8qIElEIG9mIFBhcmFtIGZvciBFdmFs UGxhblF1YWwgcmUtZXZhbCAqLwp9IExvY2tSb3dzUGF0aDsKCi8qCiAqIE1vZGlmeVRhYmxl UGF0aCByZXByZXNlbnRzIHBlcmZvcm1pbmcgSU5TRVJUL1VQREFURS9ERUxFVEUvTUVSR0UK ICoKICogV2UgcmVwcmVzZW50IG1vc3QgdGhpbmdzIHRoYXQgd2lsbCBiZSBpbiB0aGUgTW9k aWZ5VGFibGUgcGxhbiBub2RlCiAqIGxpdGVyYWxseSwgZXhjZXB0IHdlIGhhdmUgYSBjaGls ZCBQYXRoIG5vdCBQbGFuLiAgQnV0IGFuYWx5c2lzIG9mIHRoZQogKiBPbkNvbmZsaWN0RXhw ciBpcyBkZWZlcnJlZCB0byBjcmVhdGVwbGFuLmMsIGFzIGlzIGNvbGxlY3Rpb24gb2YgRkRX IGRhdGEuCiAqLwp0eXBlZGVmIHN0cnVjdCBNb2RpZnlUYWJsZVBhdGgKewoJUGF0aAkJcGF0 aDsKCVBhdGgJICAgKnN1YnBhdGg7CQkvKiBQYXRoIHByb2R1Y2luZyBzb3VyY2UgZGF0YSAq LwoJQ21kVHlwZQkJb3BlcmF0aW9uOwkJLyogSU5TRVJULCBVUERBVEUsIERFTEVURSwgb3Ig TUVSR0UgKi8KCWJvb2wJCWNhblNldFRhZzsJCS8qIGRvIHdlIHNldCB0aGUgY29tbWFuZCB0 YWcvZXNfcHJvY2Vzc2VkPyAqLwoJSW5kZXgJCW5vbWluYWxSZWxhdGlvbjsJLyogUGFyZW50 IFJUIGluZGV4IGZvciB1c2Ugb2YgRVhQTEFJTiAqLwoJSW5kZXgJCXJvb3RSZWxhdGlvbjsJ LyogUm9vdCBSVCBpbmRleCwgaWYgcGFydGl0aW9uZWQvaW5oZXJpdGVkICovCglMaXN0CSAg ICpyZXN1bHRSZWxhdGlvbnM7CS8qIGludGVnZXIgbGlzdCBvZiBSVCBpbmRleGVzICovCglM aXN0CSAgICp1cGRhdGVDb2xub3NMaXN0czsJLyogcGVyLXRhcmdldC10YWJsZSB1cGRhdGVf Y29sbm9zIGxpc3RzICovCglMaXN0CSAgICp3aXRoQ2hlY2tPcHRpb25MaXN0czsJLyogcGVy LXRhcmdldC10YWJsZSBXQ08gbGlzdHMgKi8KCUxpc3QJICAgKnJldHVybmluZ0xpc3RzOyAv KiBwZXItdGFyZ2V0LXRhYmxlIFJFVFVSTklORyB0bGlzdHMgKi8KCUxpc3QJICAgKnJvd01h cmtzOwkJLyogUGxhblJvd01hcmtzIChub24tbG9ja2luZyBvbmx5KSAqLwoJT25Db25mbGlj dEV4cHIgKm9uY29uZmxpY3Q7IC8qIE9OIENPTkZMSUNUIGNsYXVzZSwgb3IgTlVMTCAqLwoJ Rm9yUG9ydGlvbk9mRXhwciAqZm9yUG9ydGlvbk9mOyAvKiBGT1IgUE9SVElPTiBPRiBjbGF1 c2UgZm9yIFVQREFURS9ERUxFVEUgKi8KCWludAkJCWVwcVBhcmFtOwkJLyogSUQgb2YgUGFy YW0gZm9yIEV2YWxQbGFuUXVhbCByZS1ldmFsICovCglMaXN0CSAgICptZXJnZUFjdGlvbkxp c3RzOwkvKiBwZXItdGFyZ2V0LXRhYmxlIGxpc3RzIG9mIGFjdGlvbnMgZm9yCgkJCQkJCQkJ CSAqIE1FUkdFICovCglMaXN0CSAgICptZXJnZUpvaW5Db25kaXRpb25zOwkvKiBwZXItdGFy Z2V0LXRhYmxlIGpvaW4gY29uZGl0aW9ucwoJCQkJCQkJCQkJICogZm9yIE1FUkdFICovCn0g TW9kaWZ5VGFibGVQYXRoOwoKLyoKICogTGltaXRQYXRoIHJlcHJlc2VudHMgYXBwbHlpbmcg TElNSVQvT0ZGU0VUIHJlc3RyaWN0aW9ucwogKi8KdHlwZWRlZiBzdHJ1Y3QgTGltaXRQYXRo CnsKCVBhdGgJCXBhdGg7CglQYXRoCSAgICpzdWJwYXRoOwkJLyogcGF0aCByZXByZXNlbnRp bmcgaW5wdXQgc291cmNlICovCglOb2RlCSAgICpsaW1pdE9mZnNldDsJLyogT0ZGU0VUIHBh cmFtZXRlciwgb3IgTlVMTCBpZiBub25lICovCglOb2RlCSAgICpsaW1pdENvdW50OwkJLyog Q09VTlQgcGFyYW1ldGVyLCBvciBOVUxMIGlmIG5vbmUgKi8KCUxpbWl0T3B0aW9uIGxpbWl0 T3B0aW9uOwkvKiBGRVRDSCBGSVJTVCB3aXRoIHRpZXMgb3IgZXhhY3QgbnVtYmVyICovCn0g TGltaXRQYXRoOwoKCi8qCiAqIFJlc3RyaWN0aW9uIGNsYXVzZSBpbmZvLgogKgogKiBXZSBj cmVhdGUgb25lIG9mIHRoZXNlIGZvciBlYWNoIEFORCBzdWItY2xhdXNlIG9mIGEgcmVzdHJp Y3Rpb24gY29uZGl0aW9uCiAqIChXSEVSRSBvciBKT0lOL09OIGNsYXVzZSkuICBTaW5jZSB0 aGUgcmVzdHJpY3Rpb24gY2xhdXNlcyBhcmUgbG9naWNhbGx5CiAqIEFORGVkLCB3ZSBjYW4g dXNlIGFueSBvbmUgb2YgdGhlbSBvciBhbnkgc3Vic2V0IG9mIHRoZW0gdG8gZmlsdGVyIG91 dAogKiB0dXBsZXMsIHdpdGhvdXQgaGF2aW5nIHRvIGV2YWx1YXRlIHRoZSByZXN0LiAgVGhl IFJlc3RyaWN0SW5mbyBub2RlIGl0c2VsZgogKiBzdG9yZXMgZGF0YSB1c2VkIGJ5IHRoZSBv cHRpbWl6ZXIgd2hpbGUgY2hvb3NpbmcgdGhlIGJlc3QgcXVlcnkgcGxhbi4KICoKICogSWYg YSByZXN0cmljdGlvbiBjbGF1c2UgcmVmZXJlbmNlcyBhIHNpbmdsZSBiYXNlIHJlbGF0aW9u LCBpdCB3aWxsIGFwcGVhcgogKiBpbiB0aGUgYmFzZXJlc3RyaWN0aW5mbyBsaXN0IG9mIHRo ZSBSZWxPcHRJbmZvIGZvciB0aGF0IGJhc2UgcmVsLgogKgogKiBJZiBhIHJlc3RyaWN0aW9u IGNsYXVzZSByZWZlcmVuY2VzIG1vcmUgdGhhbiBvbmUgYmFzZStPSiByZWxhdGlvbiwgaXQg d2lsbAogKiBhcHBlYXIgaW4gdGhlIGpvaW5pbmZvIGxpc3Qgb2YgZXZlcnkgUmVsT3B0SW5m byB0aGF0IGRlc2NyaWJlcyBhIHN0cmljdAogKiBzdWJzZXQgb2YgdGhlIHJlbGF0aW9ucyBt ZW50aW9uZWQgaW4gdGhlIGNsYXVzZS4gIFRoZSBqb2luaW5mbyBsaXN0cyBhcmUKICogdXNl ZCB0byBkcml2ZSBqb2luIHRyZWUgYnVpbGRpbmcgYnkgc2VsZWN0aW5nIHBsYXVzaWJsZSBq b2luIGNhbmRpZGF0ZXMuCiAqIFRoZSBjbGF1c2UgY2Fubm90IGFjdHVhbGx5IGJlIGFwcGxp ZWQgdW50aWwgd2UgaGF2ZSBidWlsdCBhIGpvaW4gcmVsCiAqIGNvbnRhaW5pbmcgYWxsIHRo ZSByZWxhdGlvbnMgaXQgcmVmZXJlbmNlcywgaG93ZXZlci4KICoKICogV2hlbiB3ZSBjb25z dHJ1Y3QgYSBqb2luIHJlbCB0aGF0IGluY2x1ZGVzIGFsbCB0aGUgcmVsYXRpb25zIHJlZmVy ZW5jZWQKICogaW4gYSBtdWx0aS1yZWxhdGlvbiByZXN0cmljdGlvbiBjbGF1c2UsIHdlIHBs YWNlIHRoYXQgY2xhdXNlIGludG8gdGhlCiAqIGpvaW5yZXN0cmljdGluZm8gbGlzdHMgb2Yg cGF0aHMgZm9yIHRoZSBqb2luIHJlbCwgaWYgbmVpdGhlciBsZWZ0IG5vcgogKiByaWdodCBz dWItcGF0aCBpbmNsdWRlcyBhbGwgcmVsYXRpb25zIHJlZmVyZW5jZWQgaW4gdGhlIGNsYXVz ZS4gIFRoZSBjbGF1c2UKICogd2lsbCBiZSBhcHBsaWVkIGF0IHRoYXQgam9pbiBsZXZlbCwg YW5kIHdpbGwgbm90IHByb3BhZ2F0ZSBhbnkgZnVydGhlciB1cAogKiB0aGUgam9pbiB0cmVl LiAgKE5vdGU6IHRoZSAicHJlZGljYXRlIG1pZ3JhdGlvbiIgY29kZSB3YXMgb25jZSBpbnRl bmRlZCB0bwogKiBwdXNoIHJlc3RyaWN0aW9uIGNsYXVzZXMgdXAgYW5kIGRvd24gdGhlIHBs YW4gdHJlZSBiYXNlZCBvbiBldmFsdWF0aW9uCiAqIGNvc3RzLCBidXQgaXQncyBkZWFkIGNv ZGUgYW5kIGlzIHVubGlrZWx5IHRvIGJlIHJlc3VycmVjdGVkIGluIHRoZQogKiBmb3Jlc2Vl YWJsZSBmdXR1cmUuKQogKgogKiBOb3RlIHRoYXQgaW4gdGhlIHByZXNlbmNlIG9mIG1vcmUg dGhhbiB0d28gcmVscywgYSBtdWx0aS1yZWwgcmVzdHJpY3Rpb24KICogbWlnaHQgcmVhY2gg ZGlmZmVyZW50IGhlaWdodHMgaW4gdGhlIGpvaW4gdHJlZSBkZXBlbmRpbmcgb24gdGhlIGpv aW4KICogc2VxdWVuY2Ugd2UgdXNlLiAgU28sIHRoZXNlIGNsYXVzZXMgY2Fubm90IGJlIGFz c29jaWF0ZWQgZGlyZWN0bHkgd2l0aAogKiB0aGUgam9pbiBSZWxPcHRJbmZvLCBidXQgbXVz dCBiZSBrZXB0IHRyYWNrIG9mIG9uIGEgcGVyLWpvaW4tcGF0aCBiYXNpcy4KICoKICogUmVz dHJpY3RJbmZvcyB0aGF0IHJlcHJlc2VudCBlcXVpdmFsZW5jZSBjb25kaXRpb25zIChpLmUu LCBtZXJnZWpvaW5hYmxlCiAqIGVxdWFsaXRpZXMgdGhhdCBhcmUgbm90IG91dGVyam9pbi1k ZWxheWVkKSBhcmUgaGFuZGxlZCBhIGJpdCBkaWZmZXJlbnRseS4KICogSW5pdGlhbGx5IHdl IGF0dGFjaCB0aGVtIHRvIHRoZSBFcXVpdmFsZW5jZUNsYXNzZXMgdGhhdCBhcmUgZGVyaXZl ZCBmcm9tCiAqIHRoZW0uICBXaGVuIHdlIGNvbnN0cnVjdCBhIHNjYW4gb3Igam9pbiBwYXRo LCB3ZSBsb29rIHRocm91Z2ggYWxsIHRoZQogKiBFcXVpdmFsZW5jZUNsYXNzZXMgYW5kIGdl bmVyYXRlIGRlcml2ZWQgUmVzdHJpY3RJbmZvcyByZXByZXNlbnRpbmcgdGhlCiAqIG1pbmlt YWwgc2V0IG9mIGNvbmRpdGlvbnMgdGhhdCBuZWVkIHRvIGJlIGNoZWNrZWQgZm9yIHRoaXMg cGFydGljdWxhciBzY2FuCiAqIG9yIGpvaW4gdG8gZW5mb3JjZSB0aGF0IGFsbCBtZW1iZXJz IG9mIGVhY2ggRXF1aXZhbGVuY2VDbGFzcyBhcmUgaW4gZmFjdAogKiBlcXVhbCBpbiBhbGwg cm93cyBlbWl0dGVkIGJ5IHRoZSBzY2FuIG9yIGpvaW4uCiAqCiAqIFRoZSBjbGF1c2VfcmVs aWRzIGZpZWxkIGxpc3RzIHRoZSBiYXNlIHBsdXMgb3V0ZXItam9pbiBSVCBpbmRleGVzIHRo YXQKICogYWN0dWFsbHkgYXBwZWFyIGluIHRoZSBjbGF1c2UuICByZXF1aXJlZF9yZWxpZHMg bGlzdHMgdGhlIG1pbmltdW0gc2V0IG9mCiAqIHJlbGlkcyBuZWVkZWQgdG8gZXZhbHVhdGUg dGhlIGNsYXVzZTsgd2hpbGUgdGhpcyBpcyBvZnRlbiBlcXVhbCB0bwogKiBjbGF1c2VfcmVs aWRzLCBpdCBjYW4gYmUgbW9yZS4gIFdlIHdpbGwgYWRkIHJlbGlkcyB0byByZXF1aXJlZF9y ZWxpZHMgd2hlbgogKiB3ZSBuZWVkIHRvIGZvcmNlIGFuIG91dGVyIGpvaW4gT04gY2xhdXNl IHRvIGJlIGV2YWx1YXRlZCBleGFjdGx5IGF0IHRoZQogKiBsZXZlbCBvZiB0aGUgb3V0ZXIg am9pbiwgd2hpY2ggaXMgdHJ1ZSBleGNlcHQgd2hlbiBpdCBpcyBhICJkZWdlbmVyYXRlIgog KiBjb25kaXRpb24gdGhhdCByZWZlcmVuY2VzIG9ubHkgVmFycyBmcm9tIHRoZSBudWxsYWJs ZSBzaWRlIG9mIHRoZSBqb2luLgogKgogKiBSZXN0cmljdEluZm8gbm9kZXMgY29udGFpbiBh IGZsYWcgdG8gaW5kaWNhdGUgd2hldGhlciBhIHF1YWwgaGFzIGJlZW4KICogcHVzaGVkIGRv d24gdG8gYSBsb3dlciBsZXZlbCB0aGFuIGl0cyBvcmlnaW5hbCBzeW50YWN0aWMgcGxhY2Vt ZW50IGluIHRoZQogKiBqb2luIHRyZWUgd291bGQgc3VnZ2VzdC4gIElmIGFuIG91dGVyIGpv aW4gcHJldmVudHMgdXMgZnJvbSBwdXNoaW5nIGEgcXVhbAogKiBkb3duIHRvIGl0cyAibmF0 dXJhbCIgc2VtYW50aWMgbGV2ZWwgKHRoZSBsZXZlbCBhc3NvY2lhdGVkIHdpdGgganVzdCB0 aGUKICogYmFzZSByZWxzIHVzZWQgaW4gdGhlIHF1YWwpIHRoZW4gd2UgbWFyayB0aGUgcXVh bCB3aXRoIGEgInJlcXVpcmVkX3JlbGlkcyIKICogdmFsdWUgaW5jbHVkaW5nIG1vcmUgdGhh biBqdXN0IHRoZSBiYXNlIHJlbHMgaXQgYWN0dWFsbHkgdXNlcy4gIEJ5CiAqIHByZXRlbmRp bmcgdGhhdCB0aGUgcXVhbCByZWZlcmVuY2VzIGFsbCB0aGUgcmVscyByZXF1aXJlZCB0byBm b3JtIHRoZSBvdXRlcgogKiBqb2luLCB3ZSBwcmV2ZW50IGl0IGZyb20gYmVpbmcgZXZhbHVh dGVkIGJlbG93IHRoZSBvdXRlciBqb2luJ3Mgam9pbnJlbC4KICogV2hlbiB3ZSBkbyBmb3Jt IHRoZSBvdXRlciBqb2luJ3Mgam9pbnJlbCwgd2Ugc3RpbGwgbmVlZCB0byBkaXN0aW5ndWlz aAogKiB0aG9zZSBxdWFscyB0aGF0IGFyZSBhY3R1YWxseSBpbiB0aGF0IGpvaW4ncyBKT0lO L09OIGNvbmRpdGlvbiBmcm9tIHRob3NlCiAqIHRoYXQgYXBwZWFyZWQgZWxzZXdoZXJlIGlu IHRoZSB0cmVlIGFuZCB3ZXJlIHB1c2hlZCBkb3duIHRvIHRoZSBqb2luIHJlbAogKiBiZWNh dXNlIHRoZXkgdXNlZCBubyBvdGhlciByZWxzLiAgVGhhdCdzIHdoYXQgdGhlIGlzX3B1c2hl ZF9kb3duIGZsYWcgaXMKICogZm9yOyBpdCB0ZWxscyB1cyB0aGF0IGEgcXVhbCBpcyBub3Qg YW4gT1VURVIgSk9JTiBxdWFsIGZvciB0aGUgc2V0IG9mIGJhc2UKICogcmVscyBsaXN0ZWQg aW4gcmVxdWlyZWRfcmVsaWRzLiAgQSBjbGF1c2UgdGhhdCBvcmlnaW5hbGx5IGNhbWUgZnJv bSBXSEVSRQogKiBvciBhbiBJTk5FUiBKT0lOIGNvbmRpdGlvbiB3aWxsICphbHdheXMqIGhh dmUgaXRzIGlzX3B1c2hlZF9kb3duIGZsYWcgc2V0LgogKiBJdCdzIHBvc3NpYmxlIGZvciBh biBPVVRFUiBKT0lOIGNsYXVzZSB0byBiZSBtYXJrZWQgaXNfcHVzaGVkX2Rvd24gdG9vLAog KiBpZiB3ZSBkZWNpZGUgdGhhdCBpdCBjYW4gYmUgcHVzaGVkIGRvd24gaW50byB0aGUgbnVs bGFibGUgc2lkZSBvZiB0aGUgam9pbi4KICogSW4gdGhhdCBjYXNlIGl0IGFjdHMgYXMgYSBw bGFpbiBmaWx0ZXIgcXVhbCBmb3Igd2hlcmV2ZXIgaXQgZ2V0cyBldmFsdWF0ZWQuCiAqIChJ biBzaG9ydCwgaXNfcHVzaGVkX2Rvd24gaXMgb25seSBmYWxzZSBmb3Igbm9uLWRlZ2VuZXJh dGUgb3V0ZXIgam9pbgogKiBjb25kaXRpb25zLiAgUG9zc2libHkgd2Ugc2hvdWxkIHJlbmFt ZSBpdCB0byByZWZsZWN0IHRoYXQgbWVhbmluZz8gIEJ1dAogKiBzZWUgYWxzbyB0aGUgY29t bWVudHMgZm9yIFJJTkZPX0lTX1BVU0hFRF9ET1dOLCBiZWxvdy4pCiAqCiAqIFRoZXJlIGlz IGFsc28gYW4gaW5jb21wYXRpYmxlX3JlbGlkcyBmaWVsZCwgd2hpY2ggaXMgYSBzZXQgb2Yg b3V0ZXItam9pbgogKiByZWxpZHMgYWJvdmUgd2hpY2ggd2UgY2Fubm90IGV2YWx1YXRlIHRo ZSBjbGF1c2UgKGJlY2F1c2UgdGhleSBtaWdodCBudWxsCiAqIFZhcnMgaXQgdXNlcyB0aGF0 IHNob3VsZCBub3QgYmUgbnVsbGVkIHlldCkuICBJbiBwcmluY2lwbGUgdGhpcyBjb3VsZCBi ZQogKiBmaWxsZWQgaW4gYW55IFJlc3RyaWN0SW5mbyBhcyB0aGUgc2V0IG9mIE9KIHJlbGlk cyB0aGF0IGFwcGVhciBhYm92ZSB0aGUKICogY2xhdXNlIGFuZCBudWxsIFZhcnMgdGhhdCBp dCB1c2VzLiAgSW4gcHJhY3RpY2Ugd2Ugb25seSBib3RoZXIgdG8gcG9wdWxhdGUKICogaXQg Zm9yICJjbG9uZSIgY2xhdXNlcywgYXMgaXQncyBjdXJyZW50bHkgb25seSBuZWVkZWQgdG8g cHJldmVudCBtdWx0aXBsZQogKiBjbG9uZXMgb2YgdGhlIHNhbWUgY2xhdXNlIGZyb20gYmVp bmcgYWNjZXB0ZWQgZm9yIGV2YWx1YXRpb24gYXQgdGhlIHNhbWUKICogam9pbiBsZXZlbC4K ICoKICogVGhlcmUgaXMgYWxzbyBhbiBvdXRlcl9yZWxpZHMgZmllbGQsIHdoaWNoIGlzIE5V TEwgZXhjZXB0IGZvciBvdXRlciBqb2luCiAqIGNsYXVzZXM7IGZvciB0aG9zZSwgaXQgaXMg dGhlIHNldCBvZiByZWxpZHMgb24gdGhlIG91dGVyIHNpZGUgb2YgdGhlCiAqIGNsYXVzZSdz IG91dGVyIGpvaW4uICAoVGhlc2UgYXJlIHJlbHMgdGhhdCB0aGUgY2xhdXNlIGNhbm5vdCBi ZSBhcHBsaWVkIHRvCiAqIGluIHBhcmFtZXRlcml6ZWQgc2NhbnMsIHNpbmNlIHB1c2hpbmcg aXQgaW50byB0aGUgam9pbidzIG91dGVyIHNpZGUgd291bGQKICogbGVhZCB0byB3cm9uZyBh bnN3ZXJzLikKICoKICogVG8gaGFuZGxlIHNlY3VyaXR5LWJhcnJpZXIgY29uZGl0aW9ucyBl ZmZpY2llbnRseSwgd2UgbWFyayBSZXN0cmljdEluZm8KICogbm9kZXMgd2l0aCBhIHNlY3Vy aXR5X2xldmVsIGZpZWxkLCBpbiB3aGljaCBoaWdoZXIgdmFsdWVzIGlkZW50aWZ5IGNsYXVz ZXMKICogY29taW5nIGZyb20gbGVzcy10cnVzdGVkIHNvdXJjZXMuICBUaGUgZXhhY3Qgc2Vt YW50aWNzIGFyZSB0aGF0IGEgY2xhdXNlCiAqIGNhbm5vdCBiZSBldmFsdWF0ZWQgYmVmb3Jl IGFub3RoZXIgY2xhdXNlIHdpdGggYSBsb3dlciBzZWN1cml0eV9sZXZlbCB2YWx1ZQogKiB1 bmxlc3MgdGhlIGZpcnN0IGNsYXVzZSBpcyBsZWFrcHJvb2YuICBBcyB3aXRoIG91dGVyLWpv aW4gY2xhdXNlcywgdGhpcwogKiBjcmVhdGVzIGEgcmVhc29uIGZvciBjbGF1c2VzIHRvIHNv bWV0aW1lcyBuZWVkIHRvIGJlIGV2YWx1YXRlZCBoaWdoZXIgaW4KICogdGhlIGpvaW4gdHJl ZSB0aGFuIHRoZWlyIGNvbnRlbnRzIHdvdWxkIHN1Z2dlc3Q7IGFuZCBldmVuIGF0IGEgc2lu Z2xlIHBsYW4KICogbm9kZSwgdGhpcyBydWxlIGNvbnN0cmFpbnMgdGhlIG9yZGVyIG9mIGFw cGxpY2F0aW9uIG9mIGNsYXVzZXMuCiAqCiAqIEluIGdlbmVyYWwsIHRoZSByZWZlcmVuY2Vk IGNsYXVzZSBtaWdodCBiZSBhcmJpdHJhcmlseSBjb21wbGV4LiAgVGhlCiAqIGtpbmRzIG9m IGNsYXVzZXMgd2UgY2FuIGhhbmRsZSBhcyBpbmRleHNjYW4gcXVhbHMsIG1lcmdlam9pbiBj bGF1c2VzLAogKiBvciBoYXNoam9pbiBjbGF1c2VzIGFyZSBsaW1pdGVkIChlLmcuLCBubyB2 b2xhdGlsZSBmdW5jdGlvbnMpLiAgVGhlIGNvZGUKICogZm9yIGVhY2gga2luZCBvZiBwYXRo IGlzIHJlc3BvbnNpYmxlIGZvciBpZGVudGlmeWluZyB0aGUgcmVzdHJpY3QgY2xhdXNlcwog KiBpdCBjYW4gdXNlIGFuZCBpZ25vcmluZyB0aGUgcmVzdC4gIENsYXVzZXMgbm90IGltcGxl bWVudGVkIGJ5IGFuIGluZGV4c2NhbiwKICogbWVyZ2Vqb2luLCBvciBoYXNoam9pbiB3aWxs IGJlIHBsYWNlZCBpbiB0aGUgcGxhbiBxdWFsIG9yIGpvaW5xdWFsIGZpZWxkCiAqIG9mIHRo ZSBmaW5pc2hlZCBQbGFuIG5vZGUsIHdoZXJlIHRoZXkgd2lsbCBiZSBlbmZvcmNlZCBieSBn ZW5lcmFsLXB1cnBvc2UKICogcXVhbC1leHByZXNzaW9uLWV2YWx1YXRpb24gY29kZS4gIChC dXQgd2UgYXJlIHN0aWxsIGVudGl0bGVkIHRvIGNvdW50CiAqIHRoZWlyIHNlbGVjdGl2aXR5 IHdoZW4gZXN0aW1hdGluZyB0aGUgcmVzdWx0IHR1cGxlIGNvdW50LCBpZiB3ZQogKiBjYW4g Z3Vlc3Mgd2hhdCBpdCBpcy4uLikKICoKICogV2hlbiB0aGUgcmVmZXJlbmNlZCBjbGF1c2Ug aXMgYW4gT1IgY2xhdXNlLCB3ZSBnZW5lcmF0ZSBhIG1vZGlmaWVkIGNvcHkKICogaW4gd2hp Y2ggYWRkaXRpb25hbCBSZXN0cmljdEluZm8gbm9kZXMgYXJlIGluc2VydGVkIGJlbG93IHRo ZSB0b3AtbGV2ZWwKICogT1IvQU5EIHN0cnVjdHVyZS4gIFRoaXMgaXMgYSBjb252ZW5pZW5j ZSBmb3IgT1IgaW5kZXhzY2FuIHByb2Nlc3Npbmc6CiAqIGluZGV4cXVhbHMgdGFrZW4gZnJv bSBlaXRoZXIgdGhlIHRvcCBsZXZlbCBvciBhbiBPUiBzdWJjbGF1c2Ugd2lsbCBoYXZlCiAq IGFzc29jaWF0ZWQgUmVzdHJpY3RJbmZvIG5vZGVzLgogKgogKiBUaGUgY2FuX2pvaW4gZmxh ZyBpcyBzZXQgdHJ1ZSBpZiB0aGUgY2xhdXNlIGxvb2tzIHBvdGVudGlhbGx5IHVzZWZ1bCBh cwogKiBhIG1lcmdlIG9yIGhhc2ggam9pbiBjbGF1c2UsIHRoYXQgaXMgaWYgaXQgaXMgYSBi aW5hcnkgb3BjbGF1c2Ugd2l0aAogKiBub25vdmVybGFwcGluZyBzZXRzIG9mIHJlbGlkcyBy ZWZlcmVuY2VkIGluIHRoZSBsZWZ0IGFuZCByaWdodCBzaWRlcy4KICogKFdoZXRoZXIgdGhl IG9wZXJhdG9yIGlzIGFjdHVhbGx5IG1lcmdlIG9yIGhhc2ggam9pbmFibGUgaXNuJ3QgY2hl Y2tlZCwKICogaG93ZXZlci4pCiAqCiAqIFRoZSBwc2V1ZG9jb25zdGFudCBmbGFnIGlzIHNl dCB0cnVlIGlmIHRoZSBjbGF1c2UgY29udGFpbnMgbm8gVmFycyBvZgogKiB0aGUgY3VycmVu dCBxdWVyeSBsZXZlbCBhbmQgbm8gdm9sYXRpbGUgZnVuY3Rpb25zLiAgU3VjaCBhIGNsYXVz ZSBjYW4gYmUKICogcHVsbGVkIG91dCBhbmQgdXNlZCBhcyBhIG9uZS10aW1lIHF1YWwgaW4g YSBnYXRpbmcgUmVzdWx0IG5vZGUuICBXZSBrZWVwCiAqIHBzZXVkb2NvbnN0YW50IGNsYXVz ZXMgaW4gdGhlIHNhbWUgbGlzdHMgYXMgb3RoZXIgUmVzdHJpY3RJbmZvcyBzbyB0aGF0CiAq IHRoZSByZWd1bGFyIGNsYXVzZS1wdXNoaW5nIG1hY2hpbmVyeSBjYW4gYXNzaWduIHRoZW0g dG8gdGhlIGNvcnJlY3Qgam9pbgogKiBsZXZlbCwgYnV0IHRoZXkgbmVlZCB0byBiZSB0cmVh dGVkIHNwZWNpYWxseSBmb3IgY29zdCBhbmQgc2VsZWN0aXZpdHkKICogZXN0aW1hdGVzLiAg Tm90ZSB0aGF0IGEgcHNldWRvY29uc3RhbnQgY2xhdXNlIGNhbiBuZXZlciBiZSBhbiBpbmRl eHF1YWwKICogb3IgbWVyZ2Ugb3IgaGFzaCBqb2luIGNsYXVzZSwgc28gaXQncyBvZiBubyBp bnRlcmVzdCB0byBsYXJnZSBwYXJ0cyBvZgogKiB0aGUgcGxhbm5lci4KICoKICogV2hlbiB3 ZSBnZW5lcmF0ZSBtdWx0aXBsZSB2ZXJzaW9ucyBvZiBhIGNsYXVzZSBzbyBhcyB0byBoYXZl IHZlcnNpb25zCiAqIHRoYXQgd2lsbCB3b3JrIGFmdGVyIGNvbW11dGluZyBzb21lIGxlZnQg am9pbnMgcGVyIG91dGVyIGpvaW4gaWRlbnRpdHkgMywKICogd2UgbWFyayB0aGUgb25lIHdp dGggdGhlIGZld2VzdCBudWxsaW5ncmVscyBiaXRzIHdpdGggaGFzX2Nsb25lID0gdHJ1ZSwK ICogYW5kIHRoZSByZXN0IHdpdGggaXNfY2xvbmUgPSB0cnVlLiAgVGhpcyBhbGxvd3MgcHJv cGVyIGZpbHRlcmluZyBvZgogKiB0aGVzZSByZWR1bmRhbnQgY2xhdXNlcywgc28gdGhhdCB3 ZSBhcHBseSBvbmx5IG9uZSB2ZXJzaW9uIG9mIHRoZW0uCiAqCiAqIFdoZW4gam9pbiBjbGF1 c2VzIGFyZSBnZW5lcmF0ZWQgZnJvbSBFcXVpdmFsZW5jZUNsYXNzZXMsIHRoZXJlIG1heSBi ZQogKiBzZXZlcmFsIGVxdWFsbHkgdmFsaWQgd2F5cyB0byBlbmZvcmNlIGpvaW4gZXF1aXZh bGVuY2UsIG9mIHdoaWNoIHdlIG5lZWQKICogYXBwbHkgb25seSBvbmUuICBXZSBtYXJrIGNs YXVzZXMgb2YgdGhpcyBraW5kIGJ5IHNldHRpbmcgcGFyZW50X2VjIHRvCiAqIHBvaW50IHRv IHRoZSBnZW5lcmF0aW5nIEVxdWl2YWxlbmNlQ2xhc3MuICBNdWx0aXBsZSBjbGF1c2VzIHdp dGggdGhlIHNhbWUKICogcGFyZW50X2VjIGluIHRoZSBzYW1lIGpvaW4gYXJlIHJlZHVuZGFu dC4KICoKICogTW9zdCBmaWVsZHMgYXJlIGlnbm9yZWQgZm9yIGVxdWFsaXR5LCBzaW5jZSB0 aGV5IG1heSBub3QgYmUgc2V0IHlldCwgYW5kCiAqIHNob3VsZCBiZSBkZXJpdmFibGUgZnJv bSB0aGUgY2xhdXNlIGFueXdheS4KICoKICogcGFyZW50X2VjLCBsZWZ0X2VjLCByaWdodF9l YyBhcmUgbm90IHByaW50ZWQsIGxlc3QgaXQgbGVhZCB0byBpbmZpbml0ZQogKiByZWN1cnNp b24gaW4gcGxhbiB0cmVlIGR1bXAuCiAqLwoKdHlwZWRlZiBzdHJ1Y3QgUmVzdHJpY3RJbmZv CnsKCXBnX25vZGVfYXR0cihub19yZWFkLCBub19xdWVyeV9qdW1ibGUpCgoJTm9kZVRhZwkJ dHlwZTsKCgkvKiB0aGUgcmVwcmVzZW50ZWQgY2xhdXNlIG9mIFdIRVJFIG9yIEpPSU4gKi8K CUV4cHIJICAgKmNsYXVzZTsKCgkvKiB0cnVlIGlmIGNsYXVzZSB3YXMgcHVzaGVkIGRvd24g aW4gbGV2ZWwgKi8KCWJvb2wJCWlzX3B1c2hlZF9kb3duOwoKCS8qIHNlZSBjb21tZW50IGFi b3ZlICovCglib29sCQljYW5fam9pbiBwZ19ub2RlX2F0dHIoZXF1YWxfaWdub3JlKTsKCgkv KiBzZWUgY29tbWVudCBhYm92ZSAqLwoJYm9vbAkJcHNldWRvY29uc3RhbnQgcGdfbm9kZV9h dHRyKGVxdWFsX2lnbm9yZSk7CgoJLyogc2VlIGNvbW1lbnQgYWJvdmUgKi8KCWJvb2wJCWhh c19jbG9uZTsKCWJvb2wJCWlzX2Nsb25lOwoKCS8qIHRydWUgaWYga25vd24gdG8gY29udGFp biBubyBsZWFrZWQgVmFycyAqLwoJYm9vbAkJbGVha3Byb29mIHBnX25vZGVfYXR0cihlcXVh bF9pZ25vcmUpOwoKCS8qIGluZGljYXRlcyBpZiBjbGF1c2UgY29udGFpbnMgYW55IHZvbGF0 aWxlIGZ1bmN0aW9ucyAqLwoJVm9sYXRpbGVGdW5jdGlvblN0YXR1cyBoYXNfdm9sYXRpbGUg cGdfbm9kZV9hdHRyKGVxdWFsX2lnbm9yZSk7CgoJLyogc2VlIGNvbW1lbnQgYWJvdmUgKi8K CUluZGV4CQlzZWN1cml0eV9sZXZlbDsKCgkvKiBudW1iZXIgb2YgYmFzZSByZWxzIGluIGNs YXVzZV9yZWxpZHMgKi8KCWludAkJCW51bV9iYXNlX3JlbHMgcGdfbm9kZV9hdHRyKGVxdWFs X2lnbm9yZSk7CgoJLyogVGhlIHJlbGlkcyAodmFybm9zK3Zhcm51bGxpbmdyZWxzKSBhY3R1 YWxseSByZWZlcmVuY2VkIGluIHRoZSBjbGF1c2U6ICovCglSZWxpZHMJCWNsYXVzZV9yZWxp ZHMgcGdfbm9kZV9hdHRyKGVxdWFsX2lnbm9yZSk7CgoJLyogVGhlIHNldCBvZiByZWxpZHMg cmVxdWlyZWQgdG8gZXZhbHVhdGUgdGhlIGNsYXVzZTogKi8KCVJlbGlkcwkJcmVxdWlyZWRf cmVsaWRzOwoKCS8qIFJlbGlkcyBhYm92ZSB3aGljaCB3ZSBjYW5ub3QgZXZhbHVhdGUgdGhl IGNsYXVzZSAoc2VlIGNvbW1lbnQgYWJvdmUpICovCglSZWxpZHMJCWluY29tcGF0aWJsZV9y ZWxpZHM7CgoJLyogSWYgYW4gb3V0ZXItam9pbiBjbGF1c2UsIHRoZSBvdXRlci1zaWRlIHJl bGF0aW9ucywgZWxzZSBOVUxMOiAqLwoJUmVsaWRzCQlvdXRlcl9yZWxpZHM7CgoJLyoKCSAq IFJlbGlkcyBpbiB0aGUgbGVmdC9yaWdodCBzaWRlIG9mIHRoZSBjbGF1c2UuICBUaGVzZSBm aWVsZHMgYXJlIHNldCBmb3IKCSAqIGFueSBiaW5hcnkgb3BjbGF1c2UuCgkgKi8KCVJlbGlk cwkJbGVmdF9yZWxpZHMgcGdfbm9kZV9hdHRyKGVxdWFsX2lnbm9yZSk7CglSZWxpZHMJCXJp Z2h0X3JlbGlkcyBwZ19ub2RlX2F0dHIoZXF1YWxfaWdub3JlKTsKCgkvKgoJICogTW9kaWZp ZWQgY2xhdXNlIHdpdGggUmVzdHJpY3RJbmZvcy4gIFRoaXMgZmllbGQgaXMgTlVMTCB1bmxl c3MgY2xhdXNlCgkgKiBpcyBhbiBPUiBjbGF1c2UuCgkgKi8KCUV4cHIJICAgKm9yY2xhdXNl IHBnX25vZGVfYXR0cihlcXVhbF9pZ25vcmUpOwoKCS8qLS0tLS0tLS0tLQoJICogU2VyaWFs IG51bWJlciBvZiB0aGlzIFJlc3RyaWN0SW5mby4gIFRoaXMgaXMgdW5pcXVlIHdpdGhpbiB0 aGUgY3VycmVudAoJICogUGxhbm5lckluZm8gY29udGV4dCwgd2l0aCBhIGZldyBjcml0aWNh bCBleGNlcHRpb25zOgoJICogMS4gV2hlbiB3ZSBnZW5lcmF0ZSBtdWx0aXBsZSBjbG9uZXMg b2YgdGhlIHNhbWUgcXVhbCBjb25kaXRpb24gdG8KCSAqIGNvcGUgd2l0aCBvdXRlciBqb2lu IGlkZW50aXR5IDMsIGFsbCB0aGUgY2xvbmVzIGdldCB0aGUgc2FtZSBzZXJpYWwKCSAqIG51 bWJlci4gIFRoaXMgcmVmbGVjdHMgdGhhdCB3ZSBvbmx5IHdhbnQgdG8gYXBwbHkgb25lIG9m IHRoZW0gaW4gYW55CgkgKiBnaXZlbiBwbGFuLgoJICogMi4gSWYgd2UgbWFudWZhY3R1cmUg YSBjb21tdXRlZCB2ZXJzaW9uIG9mIGEgcXVhbCB0byB1c2UgYXMgYW4gaW5kZXgKCSAqIGNv bmRpdGlvbiwgaXQgY29waWVzIHRoZSBvcmlnaW5hbCdzIHJpbmZvX3NlcmlhbCwgc2luY2Ug aXQgaXMgaW4KCSAqIHByYWN0aWNlIHRoZSBzYW1lIGNvbmRpdGlvbi4KCSAqIDMuIElmIHdl IHJlZHVjZSBhIHF1YWwgdG8gY29uc3RhbnQtRkFMU0UsIHRoZSBuZXcgY29uc3RhbnQtRkFM U0UgcXVhbAoJICogY29waWVzIHRoZSBvcmlnaW5hbCdzIHJpbmZvX3NlcmlhbCwgc2luY2Ug aXQgaXMgaW4gcHJhY3RpY2UgdGhlIHNhbWUKCSAqIGNvbmRpdGlvbi4KCSAqIDQuIFJlc3Ry aWN0SW5mb3MgbWFkZSBmb3IgYSBjaGlsZCByZWxhdGlvbiBjb3B5IHRoZWlyIHBhcmVudCdz CgkgKiByaW5mb19zZXJpYWwuICBMaWtld2lzZSwgd2hlbiBhbiBFcXVpdmFsZW5jZUNsYXNz IG1ha2VzIGEgZGVyaXZlZAoJICogZXF1YWxpdHkgY2xhdXNlIGZvciBhIGNoaWxkIHJlbGF0 aW9uLCBpdCBjb3BpZXMgdGhlIHJpbmZvX3NlcmlhbCBvZgoJICogdGhlIG1hdGNoaW5nIGVx dWFsaXR5IGNsYXVzZSBmb3IgdGhlIHBhcmVudC4gIFRoaXMgYWxsb3dzIGRldGVjdGlvbgoJ ICogb2YgcmVkdW5kYW50IHB1c2hlZC1kb3duIGVxdWFsaXR5IGNsYXVzZXMuCgkgKi0tLS0t LS0tLS0KCSAqLwoJaW50CQkJcmluZm9fc2VyaWFsOwoKCS8qCgkgKiBHZW5lcmF0aW5nIEVx dWl2YWxlbmNlQ2xhc3MuICBUaGlzIGZpZWxkIGlzIE5VTEwgdW5sZXNzIGNsYXVzZSBpcwoJ ICogcG90ZW50aWFsbHkgcmVkdW5kYW50LgoJICovCglFcXVpdmFsZW5jZUNsYXNzICpwYXJl bnRfZWMgcGdfbm9kZV9hdHRyKGNvcHlfYXNfc2NhbGFyLCBlcXVhbF9pZ25vcmUsIHJlYWRf d3JpdGVfaWdub3JlKTsKCgkvKgoJICogY2FjaGUgc3BhY2UgZm9yIGNvc3QgYW5kIHNlbGVj dGl2aXR5CgkgKi8KCgkvKiBldmFsIGNvc3Qgb2YgY2xhdXNlOyAtMSBpZiBub3QgeWV0IHNl dCAqLwoJUXVhbENvc3QJZXZhbF9jb3N0IHBnX25vZGVfYXR0cihlcXVhbF9pZ25vcmUpOwoK CS8qIHNlbGVjdGl2aXR5IGZvciAibm9ybWFsIiAoSk9JTl9JTk5FUikgc2VtYW50aWNzOyAt MSBpZiBub3QgeWV0IHNldCAqLwoJU2VsZWN0aXZpdHkgbm9ybV9zZWxlYyBwZ19ub2RlX2F0 dHIoZXF1YWxfaWdub3JlKTsKCS8qIHNlbGVjdGl2aXR5IGZvciBvdXRlciBqb2luIHNlbWFu dGljczsgLTEgaWYgbm90IHlldCBzZXQgKi8KCVNlbGVjdGl2aXR5IG91dGVyX3NlbGVjIHBn X25vZGVfYXR0cihlcXVhbF9pZ25vcmUpOwoKCS8qCgkgKiBvcGZhbWlsaWVzIGNvbnRhaW5p bmcgY2xhdXNlIG9wZXJhdG9yOyB2YWxpZCBpZiBjbGF1c2UgaXMKCSAqIG1lcmdlam9pbmFi bGUsIGVsc2UgTklMCgkgKi8KCUxpc3QJICAgKm1lcmdlb3BmYW1pbGllcyBwZ19ub2RlX2F0 dHIoZXF1YWxfaWdub3JlKTsKCgkvKgoJICogY2FjaGUgc3BhY2UgZm9yIG1lcmdlY2xhdXNl IHByb2Nlc3Npbmc7IE5VTEwgaWYgbm90IHlldCBzZXQKCSAqLwoKCS8qIEVxdWl2YWxlbmNl Q2xhc3MgY29udGFpbmluZyBsZWZ0aGFuZCAqLwoJRXF1aXZhbGVuY2VDbGFzcyAqbGVmdF9l YyBwZ19ub2RlX2F0dHIoY29weV9hc19zY2FsYXIsIGVxdWFsX2lnbm9yZSwgcmVhZF93cml0 ZV9pZ25vcmUpOwoJLyogRXF1aXZhbGVuY2VDbGFzcyBjb250YWluaW5nIHJpZ2h0aGFuZCAq LwoJRXF1aXZhbGVuY2VDbGFzcyAqcmlnaHRfZWMgcGdfbm9kZV9hdHRyKGNvcHlfYXNfc2Nh bGFyLCBlcXVhbF9pZ25vcmUsIHJlYWRfd3JpdGVfaWdub3JlKTsKCS8qIEVxdWl2YWxlbmNl TWVtYmVyIGZvciBsZWZ0aGFuZCAqLwoJRXF1aXZhbGVuY2VNZW1iZXIgKmxlZnRfZW0gcGdf bm9kZV9hdHRyKGNvcHlfYXNfc2NhbGFyLCBlcXVhbF9pZ25vcmUpOwoJLyogRXF1aXZhbGVu Y2VNZW1iZXIgZm9yIHJpZ2h0aGFuZCAqLwoJRXF1aXZhbGVuY2VNZW1iZXIgKnJpZ2h0X2Vt IHBnX25vZGVfYXR0cihjb3B5X2FzX3NjYWxhciwgZXF1YWxfaWdub3JlKTsKCgkvKgoJICog TGlzdCBvZiBNZXJnZVNjYW5TZWxDYWNoZSBzdHJ1Y3RzLiAgVGhvc2UgYXJlbid0IE5vZGVz LCBzbyBoYXJkIHRvCgkgKiBjb3B5OyBpbnN0ZWFkIHJlcGxhY2Ugd2l0aCBOSUwuICBUaGF0 IGhhcyB0aGUgZWZmZWN0IHRoYXQgY29weWluZyB3aWxsCgkgKiBqdXN0IHJlc2V0IHRoZSBj YWNoZS4gIExpa2V3aXNlLCBjYW4ndCBjb21wYXJlIG9yIHByaW50IHRoZW0uCgkgKi8KCUxp c3QJICAgKnNjYW5zZWxfY2FjaGUgcGdfbm9kZV9hdHRyKGNvcHlfYXMoTklMKSwgZXF1YWxf aWdub3JlLCByZWFkX3dyaXRlX2lnbm9yZSk7CgoJLyoKCSAqIHRyYW5zaWVudCB3b3Jrc3Bh Y2UgZm9yIHVzZSB3aGlsZSBjb25zaWRlcmluZyBhIHNwZWNpZmljIGpvaW4gcGF0aDsgVCA9 CgkgKiBvdXRlciB2YXIgb24gbGVmdCwgRiA9IG9uIHJpZ2h0CgkgKi8KCWJvb2wJCW91dGVy X2lzX2xlZnQgcGdfbm9kZV9hdHRyKGVxdWFsX2lnbm9yZSk7CgoJLyoKCSAqIGNvcHkgb2Yg Y2xhdXNlIG9wZXJhdG9yOyB2YWxpZCBpZiBjbGF1c2UgaXMgaGFzaGpvaW5hYmxlLCBlbHNl CgkgKiBJbnZhbGlkT2lkCgkgKi8KCU9pZAkJCWhhc2hqb2lub3BlcmF0b3IgcGdfbm9kZV9h dHRyKGVxdWFsX2lnbm9yZSk7CgoJLyoKCSAqIGNhY2hlIHNwYWNlIGZvciBoYXNoY2xhdXNl IHByb2Nlc3Npbmc7IC0xIGlmIG5vdCB5ZXQgc2V0CgkgKi8KCS8qIGF2ZyBidWNrZXRzaXpl IG9mIGxlZnQgc2lkZSAqLwoJU2VsZWN0aXZpdHkgbGVmdF9idWNrZXRzaXplIHBnX25vZGVf YXR0cihlcXVhbF9pZ25vcmUpOwoJLyogYXZnIGJ1Y2tldHNpemUgb2YgcmlnaHQgc2lkZSAq LwoJU2VsZWN0aXZpdHkgcmlnaHRfYnVja2V0c2l6ZSBwZ19ub2RlX2F0dHIoZXF1YWxfaWdu b3JlKTsKCS8qIGxlZnQgc2lkZSdzIG1vc3QgY29tbW9uIHZhbCdzIGZyZXEgKi8KCVNlbGVj dGl2aXR5IGxlZnRfbWN2ZnJlcSBwZ19ub2RlX2F0dHIoZXF1YWxfaWdub3JlKTsKCS8qIHJp Z2h0IHNpZGUncyBtb3N0IGNvbW1vbiB2YWwncyBmcmVxICovCglTZWxlY3Rpdml0eSByaWdo dF9tY3ZmcmVxIHBnX25vZGVfYXR0cihlcXVhbF9pZ25vcmUpOwoKCS8qIGhhc2ggZXF1YWxp dHkgb3BlcmF0b3JzIHVzZWQgZm9yIG1lbW9pemUgbm9kZXMsIGVsc2UgSW52YWxpZE9pZCAq LwoJT2lkCQkJbGVmdF9oYXNoZXFvcGVyYXRvciBwZ19ub2RlX2F0dHIoZXF1YWxfaWdub3Jl KTsKCU9pZAkJCXJpZ2h0X2hhc2hlcW9wZXJhdG9yIHBnX25vZGVfYXR0cihlcXVhbF9pZ25v cmUpOwp9IFJlc3RyaWN0SW5mbzsKCi8qCiAqIFRoaXMgbWFjcm8gZW1ib2RpZXMgdGhlIGNv cnJlY3Qgd2F5IHRvIHRlc3Qgd2hldGhlciBhIFJlc3RyaWN0SW5mbyBpcwogKiAicHVzaGVk IGRvd24iIHRvIGEgZ2l2ZW4gb3V0ZXIgam9pbiwgdGhhdCBpcywgc2hvdWxkIGJlIHRyZWF0 ZWQgYXMgYSBmaWx0ZXIKICogY2xhdXNlIHJhdGhlciB0aGFuIGEgam9pbiBjbGF1c2UgYXQg dGhhdCBvdXRlciBqb2luLiAgVGhpcyBpcyBjZXJ0YWlubHkgc28KICogaWYgaXNfcHVzaGVk X2Rvd24gaXMgdHJ1ZTsgYnV0IGV4YW1pbmluZyB0aGF0IGlzIG5vdCBzdWZmaWNpZW50IGFu eW1vcmUsCiAqIGJlY2F1c2Ugb3V0ZXItam9pbiBjbGF1c2VzIHdpbGwgZ2V0IHB1c2hlZCBk b3duIHRvIGxvd2VyIG91dGVyIGpvaW5zIHdoZW4KICogd2UgZ2VuZXJhdGUgYSBwYXRoIGZv ciB0aGUgbG93ZXIgb3V0ZXIgam9pbiB0aGF0IGlzIHBhcmFtZXRlcml6ZWQgYnkgdGhlCiAq IExIUyBvZiB0aGUgdXBwZXIgb25lLiAgV2UgY2FuIGRldGVjdCBzdWNoIGEgY2xhdXNlIGJ5 IG5vdGluZyB0aGF0IGl0cwogKiByZXF1aXJlZF9yZWxpZHMgZXhjZWVkIHRoZSBzY29wZSBv ZiB0aGUgam9pbi4KICovCiNkZWZpbmUgUklORk9fSVNfUFVTSEVEX0RPV04ocmluZm8sIGpv aW5yZWxpZHMpIFwKCSgocmluZm8pLT5pc19wdXNoZWRfZG93biB8fCBcCgkgIWJtc19pc19z dWJzZXQoKHJpbmZvKS0+cmVxdWlyZWRfcmVsaWRzLCBqb2lucmVsaWRzKSkKCi8qCiAqIFNp bmNlIG1lcmdlam9pbnNjYW5zZWwoKSBpcyBhIHJlbGF0aXZlbHkgZXhwZW5zaXZlIGZ1bmN0 aW9uLCBhbmQgd291bGQKICogb3RoZXJ3aXNlIGJlIGludm9rZWQgbWFueSB0aW1lcyB3aGls ZSBwbGFubmluZyBhIGxhcmdlIGpvaW4gdHJlZSwKICogd2UgZ28gb3V0IG9mIG91ciB3YXkg dG8gY2FjaGUgaXRzIHJlc3VsdHMuICBFYWNoIG1lcmdlam9pbmFibGUKICogUmVzdHJpY3RJ bmZvIGNhcnJpZXMgYSBsaXN0IG9mIHRoZSBzcGVjaWZpYyBzb3J0IG9yZGVyaW5ncyB0aGF0 IGhhdmUKICogYmVlbiBjb25zaWRlcmVkIGZvciB1c2Ugd2l0aCBpdCwgYW5kIHRoZSByZXN1 bHRpbmcgc2VsZWN0aXZpdGllcy4KICovCnR5cGVkZWYgc3RydWN0IE1lcmdlU2NhblNlbENh Y2hlCnsKCS8qIE9yZGVyaW5nIGRldGFpbHMgKGNhY2hlIGxvb2t1cCBrZXkpICovCglPaWQJ CQlvcGZhbWlseTsJCS8qIGluZGV4IG9wZmFtaWx5IGRlZmluaW5nIHRoZSBvcmRlcmluZyAq LwoJT2lkCQkJY29sbGF0aW9uOwkJLyogY29sbGF0aW9uIGZvciB0aGUgb3JkZXJpbmcgKi8K CUNvbXBhcmVUeXBlIGNtcHR5cGU7CQkvKiBzb3J0IGRpcmVjdGlvbiAoQVNDIG9yIERFU0Mp ICovCglib29sCQludWxsc19maXJzdDsJLyogZG8gTlVMTHMgY29tZSBiZWZvcmUgbm9ybWFs IHZhbHVlcz8gKi8KCS8qIFJlc3VsdHMgKi8KCVNlbGVjdGl2aXR5IGxlZnRzdGFydHNlbDsJ LyogZmlyc3Qtam9pbiBmcmFjdGlvbiBmb3IgY2xhdXNlIGxlZnQgc2lkZSAqLwoJU2VsZWN0 aXZpdHkgbGVmdGVuZHNlbDsJCS8qIGxhc3Qtam9pbiBmcmFjdGlvbiBmb3IgY2xhdXNlIGxl ZnQgc2lkZSAqLwoJU2VsZWN0aXZpdHkgcmlnaHRzdGFydHNlbDsJLyogZmlyc3Qtam9pbiBm cmFjdGlvbiBmb3IgY2xhdXNlIHJpZ2h0IHNpZGUgKi8KCVNlbGVjdGl2aXR5IHJpZ2h0ZW5k c2VsOwkvKiBsYXN0LWpvaW4gZnJhY3Rpb24gZm9yIGNsYXVzZSByaWdodCBzaWRlICovCn0g TWVyZ2VTY2FuU2VsQ2FjaGU7CgovKgogKiBQbGFjZWhvbGRlciBub2RlIGZvciBhbiBleHBy ZXNzaW9uIHRvIGJlIGV2YWx1YXRlZCBiZWxvdyB0aGUgdG9wIGxldmVsCiAqIG9mIGEgcGxh biB0cmVlLiAgVGhpcyBpcyB1c2VkIGR1cmluZyBwbGFubmluZyB0byByZXByZXNlbnQgdGhl IGNvbnRhaW5lZAogKiBleHByZXNzaW9uLiAgQXQgdGhlIGVuZCBvZiB0aGUgcGxhbm5pbmcg cHJvY2VzcyBpdCBpcyByZXBsYWNlZCBieSBlaXRoZXIKICogdGhlIGNvbnRhaW5lZCBleHBy ZXNzaW9uIG9yIGEgVmFyIHJlZmVycmluZyB0byBhIGxvd2VyLWxldmVsIGV2YWx1YXRpb24g b2YKICogdGhlIGNvbnRhaW5lZCBleHByZXNzaW9uLiAgR2VuZXJhbGx5IHRoZSBldmFsdWF0 aW9uIG9jY3VycyBiZWxvdyBhbiBvdXRlcgogKiBqb2luLCBhbmQgVmFyIHJlZmVyZW5jZXMg YWJvdmUgdGhlIG91dGVyIGpvaW4gbWlnaHQgdGhlcmVieSB5aWVsZCBOVUxMCiAqIGluc3Rl YWQgb2YgdGhlIGV4cHJlc3Npb24gdmFsdWUuCiAqCiAqIHBocmVscyBhbmQgcGhsZXZlbHN1 cCBjb3JyZXNwb25kIHRvIHRoZSB2YXJuby92YXJsZXZlbHN1cCBmaWVsZHMgb2YgYQogKiBw bGFpbiBWYXIsIGV4Y2VwdCB0aGF0IHBocmVscyBoYXMgdG8gYmUgYSByZWxpZCBzZXQgc2lu Y2UgdGhlIGV2YWx1YXRpb24KICogbGV2ZWwgb2YgYSBQbGFjZUhvbGRlclZhciBtaWdodCBi ZSBhIGpvaW4gcmF0aGVyIHRoYW4gYSBiYXNlIHJlbGF0aW9uLgogKiBMaWtld2lzZSwgcGhu dWxsaW5ncmVscyBjb3JyZXNwb25kcyB0byB2YXJudWxsaW5ncmVscy4KICoKICogQWx0aG91 Z2ggdGhlIHBsYW5uZXIgdHJlYXRzIHRoaXMgYXMgYW4gZXhwcmVzc2lvbiBub2RlIHR5cGUs IGl0IGlzIG5vdAogKiByZWNvZ25pemVkIGJ5IHRoZSBwYXJzZXIgb3IgZXhlY3V0b3IsIHNv IHdlIGRlY2xhcmUgaXQgaGVyZSByYXRoZXIgdGhhbgogKiBpbiBwcmltbm9kZXMuaC4KICoK ICogV2UgaW50ZW50aW9uYWxseSBkbyBub3QgY29tcGFyZSBwaGV4cHIuICBUd28gUGxhY2VI b2xkZXJWYXJzIHdpdGggdGhlCiAqIHNhbWUgSUQgYW5kIGxldmVsc3VwIHNob3VsZCBiZSBj b25zaWRlcmVkIGVxdWFsIGV2ZW4gaWYgdGhlIGNvbnRhaW5lZAogKiBleHByZXNzaW9ucyBo YXZlIG1hbmFnZWQgdG8gbXV0YXRlIHRvIGRpZmZlcmVudCBzdGF0ZXMuICBUaGlzIHdpbGwK ICogaGFwcGVuIGR1cmluZyBmaW5hbCBwbGFuIGNvbnN0cnVjdGlvbiB3aGVuIHRoZXJlIGFy ZSBuZXN0ZWQgUEhWcywgc2luY2UKICogdGhlIGlubmVyIFBIViB3aWxsIGdldCByZXBsYWNl ZCBieSBhIFBhcmFtIGluIHNvbWUgY29waWVzIG9mIHRoZSBvdXRlcgogKiBQSFYuICBBbm90 aGVyIHdheSBpbiB3aGljaCBpdCBjYW4gaGFwcGVuIGlzIHRoYXQgaW5pdHBsYW4gc3VibGlu a3MKICogY291bGQgZ2V0IHJlcGxhY2VkIGJ5IGRpZmZlcmVudGx5LW51bWJlcmVkIFBhcmFt cyB3aGVuIHN1YmxpbmsgZm9sZGluZwogKiBpcyBkb25lLiAgKFRoZSBlbmQgcmVzdWx0IG9m IHN1Y2ggYSBzaXR1YXRpb24gd291bGQgYmUgc29tZQogKiB1bnJlZmVyZW5jZWQgaW5pdHBs YW5zLCB3aGljaCBpcyBhbm5veWluZyBidXQgbm90IHJlYWxseSBhIHByb2JsZW0uKQogKiBP biB0aGUgc2FtZSByZWFzb25pbmcsIHRoZXJlIGlzIG5vIG5lZWQgdG8gZXhhbWluZSBwaHJl bHMuICBCdXQgd2UgZG8KICogbmVlZCB0byBjb21wYXJlIHBobnVsbGluZ3JlbHMsIGFzIHRo YXQgcmVwcmVzZW50cyBlZmZlY3RzIHRoYXQgYXJlCiAqIGV4dGVybmFsIHRvIHRoZSBvcmln aW5hbCB2YWx1ZSBvZiB0aGUgUEhWLgogKi8KCnR5cGVkZWYgc3RydWN0IFBsYWNlSG9sZGVy VmFyCnsKCXBnX25vZGVfYXR0cihub19xdWVyeV9qdW1ibGUpCgoJRXhwcgkJeHByOwoKCS8q IHRoZSByZXByZXNlbnRlZCBleHByZXNzaW9uICovCglFeHByCSAgICpwaGV4cHIgcGdfbm9k ZV9hdHRyKGVxdWFsX2lnbm9yZSk7CgoJLyogYmFzZStPSiByZWxpZHMgc3ludGFjdGljYWxs eSB3aXRoaW4gZXhwciBzcmMgKi8KCVJlbGlkcwkJcGhyZWxzIHBnX25vZGVfYXR0cihlcXVh bF9pZ25vcmUpOwoKCS8qIFJUIGluZGV4ZXMgb2Ygb3V0ZXIgam9pbnMgdGhhdCBjYW4gbnVs bCBQSFYncyB2YWx1ZSAqLwoJUmVsaWRzCQlwaG51bGxpbmdyZWxzOwoKCS8qIElEIGZvciBQ SFYgKHVuaXF1ZSB3aXRoaW4gcGxhbm5lciBydW4pICovCglJbmRleAkJcGhpZDsKCgkvKiA+ IDAgaWYgUEhWIGJlbG9uZ3MgdG8gb3V0ZXIgcXVlcnkgKi8KCUluZGV4CQlwaGxldmVsc3Vw Owp9IFBsYWNlSG9sZGVyVmFyOwoKLyoKICogIlNwZWNpYWwgam9pbiIgaW5mby4KICoKICog T25lLXNpZGVkIG91dGVyIGpvaW5zIGNvbnN0cmFpbiB0aGUgb3JkZXIgb2Ygam9pbmluZyBw YXJ0aWFsbHkgYnV0IG5vdAogKiBjb21wbGV0ZWx5LiAgV2UgZmxhdHRlbiBzdWNoIGpvaW5z IGludG8gdGhlIHBsYW5uZXIncyB0b3AtbGV2ZWwgbGlzdCBvZgogKiByZWxhdGlvbnMgdG8g am9pbiwgYnV0IHJlY29yZCBpbmZvcm1hdGlvbiBhYm91dCBlYWNoIG91dGVyIGpvaW4gaW4g YQogKiBTcGVjaWFsSm9pbkluZm8gc3RydWN0LiAgVGhlc2Ugc3RydWN0cyBhcmUga2VwdCBp biB0aGUgUGxhbm5lckluZm8gbm9kZSdzCiAqIGpvaW5faW5mb19saXN0LgogKgogKiBTaW1p bGFybHksIHNlbWlqb2lucyBhbmQgYW50aWpvaW5zIGNyZWF0ZWQgYnkgZmxhdHRlbmluZyBJ TiAoc3Vic2VsZWN0KQogKiBhbmQgRVhJU1RTKHN1YnNlbGVjdCkgY2xhdXNlcyBjcmVhdGUg cGFydGlhbCBjb25zdHJhaW50cyBvbiBqb2luIG9yZGVyLgogKiBUaGVzZSBhcmUgbGlrZXdp c2UgcmVjb3JkZWQgaW4gU3BlY2lhbEpvaW5JbmZvIHN0cnVjdHMuCiAqCiAqIFdlIG1ha2Ug U3BlY2lhbEpvaW5JbmZvcyBmb3IgRlVMTCBKT0lOcyBldmVuIHRob3VnaCB0aGVyZSBpcyBu byBmbGV4aWJpbGl0eQogKiBvZiBwbGFubmluZyBmb3IgdGhlbSwgYmVjYXVzZSB0aGlzIHNp bXBsaWZpZXMgbWFrZV9qb2luX3JlbCgpJ3MgQVBJLgogKgogKiBtaW5fbGVmdGhhbmQgYW5k IG1pbl9yaWdodGhhbmQgYXJlIHRoZSBzZXRzIG9mIGJhc2UrT0ogcmVsaWRzIHRoYXQgbXVz dCBiZQogKiBhdmFpbGFibGUgb24gZWFjaCBzaWRlIHdoZW4gcGVyZm9ybWluZyB0aGUgc3Bl Y2lhbCBqb2luLgogKiBJdCBpcyBub3QgdmFsaWQgZm9yIGVpdGhlciBtaW5fbGVmdGhhbmQg b3IgbWluX3JpZ2h0aGFuZCB0byBiZSBlbXB0eSBzZXRzOwogKiBpZiB0aGV5IHdlcmUsIHRo aXMgd291bGQgYnJlYWsgdGhlIGxvZ2ljIHRoYXQgZW5mb3JjZXMgam9pbiBvcmRlci4KICoK ICogc3luX2xlZnRoYW5kIGFuZCBzeW5fcmlnaHRoYW5kIGFyZSB0aGUgc2V0cyBvZiBiYXNl K09KIHJlbGlkcyB0aGF0IGFyZQogKiBzeW50YWN0aWNhbGx5IGJlbG93IHRoaXMgc3BlY2lh bCBqb2luLiAgKFRoZXNlIGFyZSBuZWVkZWQgdG8gaGVscCBjb21wdXRlCiAqIG1pbl9sZWZ0 aGFuZCBhbmQgbWluX3JpZ2h0aGFuZCBmb3IgaGlnaGVyIGpvaW5zLikKICoKICogam9pbnR5 cGUgaXMgbmV2ZXIgSk9JTl9SSUdIVDsgYSBSSUdIVCBKT0lOIGlzIGhhbmRsZWQgYnkgc3dp dGNoaW5nCiAqIHRoZSBpbnB1dHMgdG8gbWFrZSBpdCBhIExFRlQgSk9JTi4gIEl0J3MgbmV2 ZXIgSk9JTl9SSUdIVF9TRU1JIG9yCiAqIEpPSU5fUklHSFRfQU5USSBlaXRoZXIuICBTbyB0 aGUgYWxsb3dlZCB2YWx1ZXMgb2Ygam9pbnR5cGUgaW4gYQogKiBqb2luX2luZm9fbGlzdCBt ZW1iZXIgYXJlIG9ubHkgTEVGVCwgRlVMTCwgU0VNSSwgb3IgQU5USS4KICoKICogb2pyZWxp ZCBpcyB0aGUgUlQgaW5kZXggb2YgdGhlIGpvaW4gUlRFIHJlcHJlc2VudGluZyB0aGlzIG91 dGVyIGpvaW4sCiAqIGlmIHRoZXJlIGlzIG9uZS4gIEl0IGlzIHplcm8gd2hlbiBqb2ludHlw ZSBpcyBJTk5FUiBvciBTRU1JLCBhbmQgY2FuIGJlCiAqIHplcm8gZm9yIGpvaW50eXBlIEFO VEkgKGlmIHRoZSBqb2luIHdhcyB0cmFuc2Zvcm1lZCBmcm9tIGEgU0VNSSBqb2luKS4KICog T25lIHVzZSBmb3IgdGhpcyBmaWVsZCBpcyB0aGF0IHdoZW4gY29uc3RydWN0aW5nIHRoZSBv dXRwdXQgdGFyZ2V0bGlzdCBvZiBhCiAqIGpvaW4gcmVsYXRpb24gdGhhdCBpbXBsZW1lbnRz IHRoaXMgT0osIHdlIGFkZCBvanJlbGlkIHRvIHRoZSB2YXJudWxsaW5ncmVscwogKiBhbmQg cGhudWxsaW5ncmVscyBmaWVsZHMgb2YgbnVsbGFibGUgKFJIUykgb3V0cHV0IGNvbHVtbnMs IHNvIHRoYXQgdGhlCiAqIG91dHB1dCBWYXJzIGFuZCBQbGFjZUhvbGRlclZhcnMgY29ycmVj dGx5IHJlZmxlY3QgdGhlIG51bGxpbmcgdGhhdCBoYXMKICogcG90ZW50aWFsbHkgaGFwcGVu ZWQgdG8gdGhlbS4KICoKICogY29tbXV0ZV9hYm92ZV9sIGlzIGZpbGxlZCB3aXRoIHRoZSBy ZWxpZHMgb2Ygc3ludGFjdGljYWxseS1oaWdoZXIgb3V0ZXIKICogam9pbnMgdGhhdCBoYXZl IGJlZW4gZm91bmQgdG8gY29tbXV0ZSB3aXRoIHRoaXMgb25lIHBlciBvdXRlciBqb2luIGlk ZW50aXR5CiAqIDMgKHNlZSBvcHRpbWl6ZXIvUkVBRE1FKSwgd2hlbiB0aGlzIGpvaW4gaXMg aW4gdGhlIExIUyBvZiB0aGUgdXBwZXIgam9pbgogKiAoc28sIHRoaXMgaXMgdGhlIGxvd2Vy IGpvaW4gaW4gdGhlIGZpcnN0IGZvcm0gb2YgdGhlIGlkZW50aXR5KS4KICoKICogY29tbXV0 ZV9hYm92ZV9yIGlzIGZpbGxlZCB3aXRoIHRoZSByZWxpZHMgb2Ygc3ludGFjdGljYWxseS1o aWdoZXIgb3V0ZXIKICogam9pbnMgdGhhdCBoYXZlIGJlZW4gZm91bmQgdG8gY29tbXV0ZSB3 aXRoIHRoaXMgb25lIHBlciBvdXRlciBqb2luIGlkZW50aXR5CiAqIDMsIHdoZW4gdGhpcyBq b2luIGlzIGluIHRoZSBSSFMgb2YgdGhlIHVwcGVyIGpvaW4gKHNvLCB0aGlzIGlzIHRoZSBs b3dlcgogKiBqb2luIGluIHRoZSBzZWNvbmQgZm9ybSBvZiB0aGUgaWRlbnRpdHkpLgogKgog KiBjb21tdXRlX2JlbG93X2wgaXMgZmlsbGVkIHdpdGggdGhlIHJlbGlkcyBvZiBzeW50YWN0 aWNhbGx5LWxvd2VyIG91dGVyCiAqIGpvaW5zIHRoYXQgaGF2ZSBiZWVuIGZvdW5kIHRvIGNv bW11dGUgd2l0aCB0aGlzIG9uZSBwZXIgb3V0ZXIgam9pbiBpZGVudGl0eQogKiAzIGFuZCBh cmUgaW4gdGhlIExIUyBvZiB0aGlzIGpvaW4gKHNvLCB0aGlzIGlzIHRoZSB1cHBlciBqb2lu IGluIHRoZSBmaXJzdAogKiBmb3JtIG9mIHRoZSBpZGVudGl0eSkuCiAqCiAqIGNvbW11dGVf YmVsb3dfciBpcyBmaWxsZWQgd2l0aCB0aGUgcmVsaWRzIG9mIHN5bnRhY3RpY2FsbHktbG93 ZXIgb3V0ZXIKICogam9pbnMgdGhhdCBoYXZlIGJlZW4gZm91bmQgdG8gY29tbXV0ZSB3aXRo IHRoaXMgb25lIHBlciBvdXRlciBqb2luIGlkZW50aXR5CiAqIDMgYW5kIGFyZSBpbiB0aGUg UkhTIG9mIHRoaXMgam9pbiAoc28sIHRoaXMgaXMgdGhlIHVwcGVyIGpvaW4gaW4gdGhlIHNl Y29uZAogKiBmb3JtIG9mIHRoZSBpZGVudGl0eSkuCiAqCiAqIGxoc19zdHJpY3QgaXMgdHJ1 ZSBpZiB0aGUgc3BlY2lhbCBqb2luJ3MgY29uZGl0aW9uIGNhbm5vdCBzdWNjZWVkIHdoZW4g dGhlCiAqIExIUyB2YXJpYWJsZXMgYXJlIGFsbCBOVUxMICh0aGlzIG1lYW5zIHRoYXQgYW4g b3V0ZXIgam9pbiBjYW4gY29tbXV0ZSB3aXRoCiAqIHVwcGVyLWxldmVsIG91dGVyIGpvaW5z IGV2ZW4gaWYgaXQgYXBwZWFycyBpbiB0aGVpciBSSFMpLiAgV2UgZG9uJ3QgYm90aGVyCiAq IHRvIHNldCBsaHNfc3RyaWN0IGZvciBGVUxMIEpPSU5zLCBob3dldmVyLgogKgogKiBGb3Ig YSBzZW1pam9pbiwgd2UgYWxzbyBleHRyYWN0IHRoZSBqb2luIG9wZXJhdG9ycyBhbmQgdGhl aXIgUkhTIGFyZ3VtZW50cwogKiBhbmQgc2V0IHNlbWlfb3BlcmF0b3JzLCBzZW1pX3Joc19l eHBycywgc2VtaV9jYW5fYnRyZWUsIGFuZCBzZW1pX2Nhbl9oYXNoLgogKiBUaGlzIGlzIGRv bmUgaW4gc3VwcG9ydCBvZiBwb3NzaWJseSB1bmlxdWUtaWZ5aW5nIHRoZSBSSFMsIHNvIHdl IGRvbid0CiAqIGJvdGhlciB1bmxlc3MgYXQgbGVhc3Qgb25lIG9mIHNlbWlfY2FuX2J0cmVl IGFuZCBzZW1pX2Nhbl9oYXNoIGNhbiBiZSBzZXQKICogdHJ1ZS4gIChZb3UgbWlnaHQgZXhw ZWN0IHRoYXQgdGhpcyBpbmZvcm1hdGlvbiB3b3VsZCBiZSBjb21wdXRlZCBkdXJpbmcKICog am9pbiBwbGFubmluZzsgYnV0IGl0J3MgaGVscGZ1bCB0byBoYXZlIGl0IGF2YWlsYWJsZSBk dXJpbmcgcGxhbm5pbmcgb2YKICogcGFyYW1ldGVyaXplZCB0YWJsZSBzY2Fucywgc28gd2Ug c3RvcmUgaXQgaW4gdGhlIFNwZWNpYWxKb2luSW5mbyBzdHJ1Y3RzLikKICoKICogRm9yIHB1 cnBvc2VzIG9mIGpvaW4gc2VsZWN0aXZpdHkgZXN0aW1hdGlvbiwgd2UgY3JlYXRlIHRyYW5z aWVudAogKiBTcGVjaWFsSm9pbkluZm8gc3RydWN0dXJlcyBmb3IgcmVndWxhciBpbm5lciBq b2luczsgc28gaXQgaXMgcG9zc2libGUKICogdG8gaGF2ZSBqb2ludHlwZSA9PSBKT0lOX0lO TkVSIGluIHN1Y2ggYSBzdHJ1Y3R1cmUsIGV2ZW4gdGhvdWdoIHRoaXMgaXMKICogbm90IGFs bG93ZWQgd2l0aGluIGpvaW5faW5mb19saXN0LiAgV2UgYWxzbyBjcmVhdGUgdHJhbnNpZW50 CiAqIFNwZWNpYWxKb2luSW5mb3Mgd2l0aCBqb2ludHlwZSA9PSBKT0lOX0lOTkVSIGZvciBv dXRlciBqb2lucywgc2luY2UgZm9yCiAqIGNvc3QgZXN0aW1hdGlvbiBwdXJwb3NlcyBpdCBp cyBzb21ldGltZXMgdXNlZnVsIHRvIGtub3cgdGhlIGpvaW4gc2l6ZSB1bmRlcgogKiBwbGFp biBpbm5lcmpvaW4gc2VtYW50aWNzLiAgTm90ZSB0aGF0IGxoc19zdHJpY3QgYW5kIHRoZSBz ZW1pX3h4eCBmaWVsZHMKICogYXJlIG5vdCBzZXQgbWVhbmluZ2Z1bGx5IHdpdGhpbiBzdWNo IHN0cnVjdHMuCiAqCiAqIFdlIGFsc28gY3JlYXRlIHRyYW5zaWVudCBTcGVjaWFsSm9pbklu Zm9zIGZvciBjaGlsZCBqb2lucyBkdXJpbmcKICogcGFydGl0aW9ud2lzZSBqb2luIHBsYW5u aW5nLCB3aGljaCBhcmUgYWxzbyBub3QgcHJlc2VudCBpbiBqb2luX2luZm9fbGlzdC4KICov CnR5cGVkZWYgc3RydWN0IFNwZWNpYWxKb2luSW5mbwp7CglwZ19ub2RlX2F0dHIobm9fcmVh ZCwgbm9fcXVlcnlfanVtYmxlKQoKCU5vZGVUYWcJCXR5cGU7CglSZWxpZHMJCW1pbl9sZWZ0 aGFuZDsJLyogYmFzZStPSiByZWxpZHMgaW4gbWluaW11bSBMSFMgZm9yIGpvaW4gKi8KCVJl bGlkcwkJbWluX3JpZ2h0aGFuZDsJLyogYmFzZStPSiByZWxpZHMgaW4gbWluaW11bSBSSFMg Zm9yIGpvaW4gKi8KCVJlbGlkcwkJc3luX2xlZnRoYW5kOwkvKiBiYXNlK09KIHJlbGlkcyBz eW50YWN0aWNhbGx5IHdpdGhpbiBMSFMgKi8KCVJlbGlkcwkJc3luX3JpZ2h0aGFuZDsJLyog YmFzZStPSiByZWxpZHMgc3ludGFjdGljYWxseSB3aXRoaW4gUkhTICovCglKb2luVHlwZQlq b2ludHlwZTsJCS8qIGFsd2F5cyBJTk5FUiwgTEVGVCwgRlVMTCwgU0VNSSwgb3IgQU5USSAq LwoJSW5kZXgJCW9qcmVsaWQ7CQkvKiBvdXRlciBqb2luJ3MgUlQgaW5kZXg7IDAgaWYgbm9u ZSAqLwoJUmVsaWRzCQljb21tdXRlX2Fib3ZlX2w7CS8qIGNvbW11dGluZyBPSnMgYWJvdmUg dGhpcyBvbmUsIGlmIExIUyAqLwoJUmVsaWRzCQljb21tdXRlX2Fib3ZlX3I7CS8qIGNvbW11 dGluZyBPSnMgYWJvdmUgdGhpcyBvbmUsIGlmIFJIUyAqLwoJUmVsaWRzCQljb21tdXRlX2Jl bG93X2w7CS8qIGNvbW11dGluZyBPSnMgaW4gdGhpcyBvbmUncyBMSFMgKi8KCVJlbGlkcwkJ Y29tbXV0ZV9iZWxvd19yOwkvKiBjb21tdXRpbmcgT0pzIGluIHRoaXMgb25lJ3MgUkhTICov Cglib29sCQlsaHNfc3RyaWN0OwkJLyogam9pbmNsYXVzZSBpcyBzdHJpY3QgZm9yIHNvbWUg TEhTIHJlbCAqLwoJLyogUmVtYWluaW5nIGZpZWxkcyBhcmUgc2V0IG9ubHkgZm9yIEpPSU5f U0VNSSBqb2ludHlwZTogKi8KCWJvb2wJCXNlbWlfY2FuX2J0cmVlOyAvKiB0cnVlIGlmIHNl bWlfb3BlcmF0b3JzIGFyZSBhbGwgYnRyZWUgKi8KCWJvb2wJCXNlbWlfY2FuX2hhc2g7CS8q IHRydWUgaWYgc2VtaV9vcGVyYXRvcnMgYXJlIGFsbCBoYXNoICovCglMaXN0CSAgICpzZW1p X29wZXJhdG9yczsgLyogT0lEcyBvZiBlcXVhbGl0eSBqb2luIG9wZXJhdG9ycyAqLwoJTGlz dAkgICAqc2VtaV9yaHNfZXhwcnM7IC8qIHJpZ2h0aGFuZC1zaWRlIGV4cHJlc3Npb25zIG9m IHRoZXNlIG9wcyAqLwp9IFNwZWNpYWxKb2luSW5mbzsKCi8qCiAqIFRyYW5zaWVudCBvdXRl ci1qb2luIGNsYXVzZSBpbmZvLgogKgogKiBXZSBzZXQgYXNpZGUgZXZlcnkgb3V0ZXIgam9p biBPTiBjbGF1c2UgdGhhdCBsb29rcyBtZXJnZWpvaW5hYmxlLAogKiBhbmQgcHJvY2VzcyBp dCBzcGVjaWFsbHkgYXQgdGhlIGVuZCBvZiBxdWFsIGRpc3RyaWJ1dGlvbi4KICovCnR5cGVk ZWYgc3RydWN0IE91dGVySm9pbkNsYXVzZUluZm8KewoJcGdfbm9kZV9hdHRyKG5vX2NvcHlf ZXF1YWwsIG5vX3JlYWQsIG5vX3F1ZXJ5X2p1bWJsZSkKCglOb2RlVGFnCQl0eXBlOwoJUmVz dHJpY3RJbmZvICpyaW5mbzsJCS8qIGEgbWVyZ2Vqb2luYWJsZSBvdXRlci1qb2luIGNsYXVz ZSAqLwoJU3BlY2lhbEpvaW5JbmZvICpzamluZm87CS8qIHRoZSBvdXRlciBqb2luJ3MgU3Bl Y2lhbEpvaW5JbmZvICovCn0gT3V0ZXJKb2luQ2xhdXNlSW5mbzsKCi8qCiAqIEFwcGVuZC1y ZWxhdGlvbiBpbmZvLgogKgogKiBXaGVuIHdlIGV4cGFuZCBhbiBpbmhlcml0YWJsZSB0YWJs ZSBvciBhIFVOSU9OLUFMTCBzdWJzZWxlY3QgaW50byBhbgogKiAiYXBwZW5kIHJlbGF0aW9u IiAoZXNzZW50aWFsbHksIGEgbGlzdCBvZiBjaGlsZCBSVEVzKSwgd2UgYnVpbGQgYW4KICog QXBwZW5kUmVsSW5mbyBmb3IgZWFjaCBjaGlsZCBSVEUuICBUaGUgbGlzdCBvZiBBcHBlbmRS ZWxJbmZvcyBpbmRpY2F0ZXMKICogd2hpY2ggY2hpbGQgUlRFcyBtdXN0IGJlIGluY2x1ZGVk IHdoZW4gZXhwYW5kaW5nIHRoZSBwYXJlbnQsIGFuZCBlYWNoIG5vZGUKICogY2FycmllcyBp bmZvcm1hdGlvbiBuZWVkZWQgdG8gdHJhbnNsYXRlIGJldHdlZW4gY29sdW1ucyBvZiB0aGUg cGFyZW50IGFuZAogKiBjb2x1bW5zIG9mIHRoZSBjaGlsZC4KICoKICogVGhlc2Ugc3RydWN0 cyBhcmUga2VwdCBpbiB0aGUgUGxhbm5lckluZm8gbm9kZSdzIGFwcGVuZF9yZWxfbGlzdCwg d2l0aAogKiBhcHBlbmRfcmVsX2FycmF5W10gcHJvdmlkaW5nIGEgY29udmVuaWVudCBsb29r dXAgbWV0aG9kIGZvciB0aGUgc3RydWN0CiAqIGFzc29jaWF0ZWQgd2l0aCBhIHBhcnRpY3Vs YXIgY2hpbGQgcmVsaWQgKHRoZXJlIGNhbiBiZSBvbmx5IG9uZSwgdGhvdWdoCiAqIHBhcmVu dCByZWxzIG1heSBoYXZlIG1hbnkgZW50cmllcyBpbiBhcHBlbmRfcmVsX2xpc3QpLgogKgog KiBOb3RlOiBhZnRlciBjb21wbGV0aW9uIG9mIHRoZSBwbGFubmVyIHByZXAgcGhhc2UsIGFu eSBnaXZlbiBSVEUgaXMgYW4KICogYXBwZW5kIHBhcmVudCBoYXZpbmcgZW50cmllcyBpbiBh cHBlbmRfcmVsX2xpc3QgaWYgYW5kIG9ubHkgaWYgaXRzCiAqICJpbmgiIGZsYWcgaXMgc2V0 LiAgV2UgY2xlYXIgImluaCIgZm9yIHBsYWluIHRhYmxlcyB0aGF0IHR1cm4gb3V0IG5vdAog KiB0byBoYXZlIGluaGVyaXRhbmNlIGNoaWxkcmVuLCBhbmQgKGluIGFuIGFidXNlIG9mIHRo ZSBvcmlnaW5hbCBtZWFuaW5nCiAqIG9mIHRoZSBmbGFnKSB3ZSBzZXQgImluaCIgZm9yIHN1 YnF1ZXJ5IFJURXMgdGhhdCB0dXJuIG91dCB0byBiZQogKiBmbGF0dGVuYWJsZSBVTklPTiBB TEwgcXVlcmllcy4gIFRoaXMgbGV0cyB1cyBhdm9pZCB1c2VsZXNzIHNlYXJjaGVzCiAqIG9m IGFwcGVuZF9yZWxfbGlzdC4KICoKICogTm90ZTogdGhlIGRhdGEgc3RydWN0dXJlIGFzc3Vt ZXMgdGhhdCBhcHBlbmQtcmVsIG1lbWJlcnMgYXJlIHNpbmdsZQogKiBiYXNlcmVscy4gIFRo aXMgaXMgT0sgZm9yIGluaGVyaXRhbmNlLCBidXQgaXQgcHJldmVudHMgdXMgZnJvbSBwdWxs aW5nCiAqIHVwIGEgVU5JT04gQUxMIG1lbWJlciBzdWJxdWVyeSBpZiBpdCBjb250YWlucyBh IGpvaW4uICBXaGlsZSB0aGF0IGNvdWxkCiAqIGJlIGZpeGVkIHdpdGggYSBtb3JlIGNvbXBs ZXggZGF0YSBzdHJ1Y3R1cmUsIGF0IHByZXNlbnQgdGhlcmUncyBub3QgbXVjaAogKiBwb2lu dCBiZWNhdXNlIG5vIGltcHJvdmVtZW50IGluIHRoZSBwbGFuIGNvdWxkIHJlc3VsdC4KICov Cgp0eXBlZGVmIHN0cnVjdCBBcHBlbmRSZWxJbmZvCnsKCXBnX25vZGVfYXR0cihub19xdWVy eV9qdW1ibGUpCgoJTm9kZVRhZwkJdHlwZTsKCgkvKgoJICogVGhlc2UgZmllbGRzIHVuaXF1 ZWx5IGlkZW50aWZ5IHRoaXMgYXBwZW5kIHJlbGF0aW9uc2hpcC4gIFRoZXJlIGNhbiBiZQoJ ICogKGluIGZhY3QsIGFsd2F5cyBzaG91bGQgYmUpIG11bHRpcGxlIEFwcGVuZFJlbEluZm9z IGZvciB0aGUgc2FtZQoJICogcGFyZW50X3JlbGlkLCBidXQgbmV2ZXIgbW9yZSB0aGFuIG9u ZSBwZXIgY2hpbGRfcmVsaWQsIHNpbmNlIGEgZ2l2ZW4KCSAqIFJURSBjYW5ub3QgYmUgYSBj aGlsZCBvZiBtb3JlIHRoYW4gb25lIGFwcGVuZCBwYXJlbnQuCgkgKi8KCUluZGV4CQlwYXJl bnRfcmVsaWQ7CS8qIFJUIGluZGV4IG9mIGFwcGVuZCBwYXJlbnQgcmVsICovCglJbmRleAkJ Y2hpbGRfcmVsaWQ7CS8qIFJUIGluZGV4IG9mIGFwcGVuZCBjaGlsZCByZWwgKi8KCgkvKgoJ ICogRm9yIGFuIGluaGVyaXRhbmNlIGFwcGVuZHJlbCwgdGhlIHBhcmVudCBhbmQgY2hpbGQg YXJlIGJvdGggcmVndWxhcgoJICogcmVsYXRpb25zLCBhbmQgd2Ugc3RvcmUgdGhlaXIgcm93 dHlwZSBPSURzIGhlcmUgZm9yIHVzZSBpbiB0cmFuc2xhdGluZwoJICogd2hvbGUtcm93IFZh cnMuICBGb3IgYSBVTklPTi1BTEwgYXBwZW5kcmVsLCB0aGUgcGFyZW50IGFuZCBjaGlsZCBh cmUKCSAqIGJvdGggc3VicXVlcmllcyB3aXRoIG5vIG5hbWVkIHJvd3R5cGUsIGFuZCB3ZSBz dG9yZSBJbnZhbGlkT2lkIGhlcmUuCgkgKi8KCU9pZAkJCXBhcmVudF9yZWx0eXBlOyAvKiBP SUQgb2YgcGFyZW50J3MgY29tcG9zaXRlIHR5cGUgKi8KCU9pZAkJCWNoaWxkX3JlbHR5cGU7 CS8qIE9JRCBvZiBjaGlsZCdzIGNvbXBvc2l0ZSB0eXBlICovCgoJLyoKCSAqIFRoZSBOJ3Ro IGVsZW1lbnQgb2YgdGhpcyBsaXN0IGlzIGEgVmFyIG9yIGV4cHJlc3Npb24gcmVwcmVzZW50 aW5nIHRoZQoJICogY2hpbGQgY29sdW1uIGNvcnJlc3BvbmRpbmcgdG8gdGhlIE4ndGggY29s dW1uIG9mIHRoZSBwYXJlbnQuIFRoaXMgaXMKCSAqIHVzZWQgdG8gdHJhbnNsYXRlIFZhcnMg cmVmZXJlbmNpbmcgdGhlIHBhcmVudCByZWwgaW50byByZWZlcmVuY2VzIHRvCgkgKiB0aGUg Y2hpbGQuICBBIGxpc3QgZWxlbWVudCBpcyBOVUxMIGlmIGl0IGNvcnJlc3BvbmRzIHRvIGEg ZHJvcHBlZAoJICogY29sdW1uIG9mIHRoZSBwYXJlbnQgKHRoaXMgaXMgb25seSBwb3NzaWJs ZSBmb3IgaW5oZXJpdGFuY2UgY2FzZXMsIG5vdAoJICogVU5JT04gQUxMKS4gIFRoZSBsaXN0 IGVsZW1lbnRzIGFyZSBhbHdheXMgc2ltcGxlIFZhcnMgZm9yIGluaGVyaXRhbmNlCgkgKiBj YXNlcywgYnV0IGNhbiBiZSBhcmJpdHJhcnkgZXhwcmVzc2lvbnMgaW4gVU5JT04gQUxMIGNh c2VzLgoJICoKCSAqIE5vdGljZSB3ZSBvbmx5IHN0b3JlIGVudHJpZXMgZm9yIHVzZXIgY29s dW1ucyAoYXR0bm8gPiAwKS4gIFdob2xlLXJvdwoJICogVmFycyBhcmUgc3BlY2lhbC1jYXNl ZCwgYW5kIHN5c3RlbSBjb2x1bW5zIChhdHRubyA8IDApIG5lZWQgbm8gc3BlY2lhbAoJICog dHJhbnNsYXRpb24gc2luY2UgdGhlaXIgYXR0bm9zIGFyZSB0aGUgc2FtZSBmb3IgYWxsIHRh Ymxlcy4KCSAqCgkgKiBDYXV0aW9uOiB0aGUgVmFycyBoYXZlIHZhcmxldmVsc3VwID0gMC4g IEJlIGNhcmVmdWwgdG8gYWRqdXN0IGFzIG5lZWRlZAoJICogd2hlbiBjb3B5aW5nIGludG8g YSBzdWJxdWVyeS4KCSAqLwoJTGlzdAkgICAqdHJhbnNsYXRlZF92YXJzOwkvKiBFeHByZXNz aW9ucyBpbiB0aGUgY2hpbGQncyBWYXJzICovCgoJLyoKCSAqIFRoaXMgYXJyYXkgc2ltcGxp ZmllcyB0cmFuc2xhdGlvbnMgaW4gdGhlIHJldmVyc2UgZGlyZWN0aW9uLCBmcm9tCgkgKiBj aGlsZCdzIGNvbHVtbiBudW1iZXJzIHRvIHBhcmVudCdzLiAgVGhlIGVudHJ5IGF0IFtjY29s bm8gLSAxXSBpcyB0aGUKCSAqIDEtYmFzZWQgcGFyZW50IGNvbHVtbiBudW1iZXIgZm9yIGNo aWxkIGNvbHVtbiBjY29sbm8sIG9yIHplcm8gaWYgdGhhdAoJICogY2hpbGQgY29sdW1uIGlz IGRyb3BwZWQgb3IgZG9lc24ndCBleGlzdCBpbiB0aGUgcGFyZW50LgoJICovCglpbnQJCQlu dW1fY2hpbGRfY29sczsgLyogbGVuZ3RoIG9mIGFycmF5ICovCglBdHRyTnVtYmVyICpwYXJl bnRfY29sbm9zIHBnX25vZGVfYXR0cihhcnJheV9zaXplKG51bV9jaGlsZF9jb2xzKSk7CgoJ LyoKCSAqIFdlIHN0b3JlIHRoZSBwYXJlbnQgdGFibGUncyBPSUQgaGVyZSBmb3IgaW5oZXJp dGFuY2UsIG9yIEludmFsaWRPaWQgZm9yCgkgKiBVTklPTiBBTEwuICBUaGlzIGlzIG9ubHkg bmVlZGVkIHRvIGhlbHAgaW4gZ2VuZXJhdGluZyBlcnJvciBtZXNzYWdlcyBpZgoJICogYW4g YXR0ZW1wdCBpcyBtYWRlIHRvIHJlZmVyZW5jZSBhIGRyb3BwZWQgcGFyZW50IGNvbHVtbi4K CSAqLwoJT2lkCQkJcGFyZW50X3JlbG9pZDsJLyogT0lEIG9mIHBhcmVudCByZWxhdGlvbiAq Lwp9IEFwcGVuZFJlbEluZm87CgovKgogKiBJbmZvcm1hdGlvbiBhYm91dCBhIHJvdy1pZGVu dGl0eSAicmVzanVuayIgY29sdW1uIGluIFVQREFURS9ERUxFVEUvTUVSR0UuCiAqCiAqIElu IHBhcnRpdGlvbmVkIFVQREFURS9ERUxFVEUvTUVSR0UgaXQncyBpbXBvcnRhbnQgZm9yIGNo aWxkIHBhcnRpdGlvbnMgdG8KICogc2hhcmUgcm93LWlkZW50aXR5IGNvbHVtbnMgd2hlbmV2 ZXIgcG9zc2libGUsIHNvIGFzIG5vdCB0byBjaGV3IHVwIHRvbyBtYW55CiAqIHRhcmdldGxp c3QgY29sdW1ucy4gIFdlIHVzZSB0aGVzZSBzdHJ1Y3RzIHRvIHRyYWNrIHdoaWNoIGlkZW50 aXR5IGNvbHVtbnMKICogaGF2ZSBiZWVuIHJlcXVlc3RlZC4gIEluIHRoZSBmaW5pc2hlZCBw bGFuLCBlYWNoIG9mIHRoZXNlIHdpbGwgZ2l2ZSByaXNlCiAqIHRvIG9uZSByZXNqdW5rIGVu dHJ5IGluIHRoZSB0YXJnZXRsaXN0IG9mIHRoZSBNb2RpZnlUYWJsZSdzIHN1YnBsYW4gbm9k ZS4KICoKICogQWxsIHRoZSBWYXJzIHN0b3JlZCBpbiBSb3dJZGVudGl0eVZhckluZm9zIG11 c3QgaGF2ZSB2YXJubyBST1dJRF9WQVIsIGZvcgogKiBjb252ZW5pZW5jZSBvZiBkZXRlY3Rp bmcgZHVwbGljYXRlIHJlcXVlc3RzLiAgV2UnbGwgcmVwbGFjZSB0aGF0LCBpbiB0aGUKICog ZmluYWwgcGxhbiwgd2l0aCB0aGUgdmFybm8gb2YgdGhlIGdlbmVyYXRpbmcgcmVsLgogKgog KiBPdXRzaWRlIHRoaXMgbGlzdCwgYSBWYXIgd2l0aCB2YXJubyBST1dJRF9WQVIgYW5kIHZh cmF0dG5vIGsgaXMgYSByZWZlcmVuY2UKICogdG8gdGhlIGstdGggZWxlbWVudCBvZiB0aGUg cm93X2lkZW50aXR5X3ZhcnMgbGlzdCAoayBjb3VudGluZyBmcm9tIDEpLgogKiBXZSBhZGQg c3VjaCBhIHJlZmVyZW5jZSB0byByb290LT5wcm9jZXNzZWRfdGxpc3Qgd2hlbiBjcmVhdGlu ZyB0aGUgZW50cnksCiAqIGFuZCBpdCBwcm9wYWdhdGVzIGludG8gdGhlIHBsYW4gdHJlZSBm cm9tIHRoZXJlLgogKi8KdHlwZWRlZiBzdHJ1Y3QgUm93SWRlbnRpdHlWYXJJbmZvCnsKCXBn X25vZGVfYXR0cihub19jb3B5X2VxdWFsLCBub19yZWFkLCBub19xdWVyeV9qdW1ibGUpCgoJ Tm9kZVRhZwkJdHlwZTsKCglWYXIJCSAgICpyb3dpZHZhcjsJCS8qIFZhciB0byBiZSBldmFs dWF0ZWQgKGJ1dCB2YXJubz1ST1dJRF9WQVIpICovCglpbnQzMgkJcm93aWR3aWR0aDsJCS8q IGVzdGltYXRlZCBhdmVyYWdlIHdpZHRoICovCgljaGFyCSAgICpyb3dpZG5hbWU7CQkvKiBu YW1lIG9mIHRoZSByZXNqdW5rIGNvbHVtbiAqLwoJUmVsaWRzCQlyb3dpZHJlbHM7CQkvKiBS VEUgaW5kZXhlcyBvZiB0YXJnZXQgcmVscyB1c2luZyB0aGlzICovCn0gUm93SWRlbnRpdHlW YXJJbmZvOwoKLyoKICogT25lIGVsZW1lbnQgb2YgdGhlIGxpc3QgcGFzc2VkIHRvIHF1ZXJ5 X2lzX2Rpc3RpbmN0X2ZvcigpLiAgRWFjaCBlbnRyeQogKiBuYW1lcyBhIHN1YnF1ZXJ5IG91 dHB1dCBjb2x1bW4gdGhhdCB0aGUgY2FsbGVyIG5lZWRzIHRvIGJlIGRpc3RpbmN0IG92ZXIs CiAqIHBsdXMgdGhlIHVwcGVyLWxldmVsIGVxdWFsaXR5IG9wZXJhdG9yIGFuZCBpdHMgaW5w dXQgY29sbGF0aW9uLCBzbyB0aGF0CiAqIHRoZSBzdWJxdWVyeSdzIG93biBESVNUSU5DVC9H Uk9VUCBCWS9zZXQtb3AgY2xhdXNlcyBjYW4gYmUgY29tcGFyZWQgZm9yCiAqIGNvbXBhdGli aWxpdHkuCiAqLwp0eXBlZGVmIHN0cnVjdCBEaXN0aW5jdENvbEluZm8KewoJaW50CQkJY29s bm87CQkJLyogc3VicXVlcnkgb3V0cHV0IGNvbHVtbiByZXNubyAqLwoJT2lkCQkJb3BpZDsJ CQkvKiB1cHBlci1sZXZlbCBlcXVhbGl0eSBvcGVyYXRvciAqLwoJT2lkCQkJY29sbGlkOwkJ CS8qIGlucHV0IGNvbGxhdGlvbiBvZiBvcGlkICovCn0gRGlzdGluY3RDb2xJbmZvOwoKLyoK ICogRm9yIGVhY2ggZGlzdGluY3QgcGxhY2Vob2xkZXIgZXhwcmVzc2lvbiBnZW5lcmF0ZWQg ZHVyaW5nIHBsYW5uaW5nLCB3ZQogKiBzdG9yZSBhIFBsYWNlSG9sZGVySW5mbyBub2RlIGlu IHRoZSBQbGFubmVySW5mbyBub2RlJ3MgcGxhY2Vob2xkZXJfbGlzdC4KICogVGhpcyBzdG9y ZXMgaW5mbyB0aGF0IGlzIG5lZWRlZCBjZW50cmFsbHkgcmF0aGVyIHRoYW4gaW4gZWFjaCBj b3B5IG9mIHRoZQogKiBQbGFjZUhvbGRlclZhci4gIFRoZSBwaGlkIGZpZWxkcyBpZGVudGlm eSB3aGljaCBQbGFjZUhvbGRlckluZm8gZ29lcyB3aXRoCiAqIGVhY2ggUGxhY2VIb2xkZXJW YXIuICBOb3RlIHRoYXQgcGhpZCBpcyB1bmlxdWUgdGhyb3VnaG91dCBhIHBsYW5uZXIgcnVu LAogKiBub3QganVzdCB3aXRoaW4gYSBxdWVyeSBsZXZlbCAtLS0gdGhpcyBpcyBzbyB0aGF0 IHdlIG5lZWQgbm90IHJlYXNzaWduIElEJ3MKICogd2hlbiBwdWxsaW5nIGEgc3VicXVlcnkg aW50byBpdHMgcGFyZW50LgogKgogKiBUaGUgaWRlYSBpcyB0byBldmFsdWF0ZSB0aGUgZXhw cmVzc2lvbiBhdCAob25seSkgdGhlIHBoX2V2YWxfYXQgam9pbiBsZXZlbCwKICogdGhlbiBh bGxvdyBpdCB0byBidWJibGUgdXAgbGlrZSBhIFZhciB1bnRpbCB0aGUgcGhfbmVlZGVkIGpv aW4gbGV2ZWwuCiAqIHBoX25lZWRlZCBoYXMgdGhlIHNhbWUgZGVmaW5pdGlvbiBhcyBhdHRy X25lZWRlZCBmb3IgYSByZWd1bGFyIFZhci4KICoKICogVGhlIFBsYWNlSG9sZGVyVmFyJ3Mg ZXhwcmVzc2lvbiBtaWdodCBjb250YWluIExBVEVSQUwgcmVmZXJlbmNlcyB0byB2YXJzCiAq IGNvbWluZyBmcm9tIG91dHNpZGUgaXRzIHN5bnRhY3RpYyBzY29wZS4gIElmIHNvLCB0aG9z ZSByZWxzIGFyZSAqbm90KgogKiBpbmNsdWRlZCBpbiBwaF9ldmFsX2F0LCBidXQgdGhleSBh cmUgcmVjb3JkZWQgaW4gcGhfbGF0ZXJhbC4KICoKICogTm90aWNlIHRoYXQgd2hlbiBwaF9l dmFsX2F0IGlzIGEgam9pbiByYXRoZXIgdGhhbiBhIHNpbmdsZSBiYXNlcmVsLCB0aGUKICog UGxhY2VIb2xkZXJJbmZvIG1heSBjcmVhdGUgY29uc3RyYWludHMgb24gam9pbiBvcmRlcjog dGhlIHBoX2V2YWxfYXQgam9pbgogKiBoYXMgdG8gYmUgZm9ybWVkIGJlbG93IGFueSBvdXRl ciBqb2lucyB0aGF0IHNob3VsZCBudWxsIHRoZSBQbGFjZUhvbGRlclZhci4KICoKICogV2Ug Y3JlYXRlIGEgUGxhY2VIb2xkZXJJbmZvIG9ubHkgYWZ0ZXIgZGV0ZXJtaW5pbmcgdGhhdCB0 aGUgUGxhY2VIb2xkZXJWYXIKICogaXMgYWN0dWFsbHkgcmVmZXJlbmNlZCBpbiB0aGUgcGxh biB0cmVlLCBzbyB0aGF0IHVucmVmZXJlbmNlZCBwbGFjZWhvbGRlcnMKICogZG9uJ3QgcmVz dWx0IGluIHVubmVjZXNzYXJ5IGNvbnN0cmFpbnRzIG9uIGpvaW4gb3JkZXIuCiAqLwoKdHlw ZWRlZiBzdHJ1Y3QgUGxhY2VIb2xkZXJJbmZvCnsKCXBnX25vZGVfYXR0cihub19yZWFkLCBu b19xdWVyeV9qdW1ibGUpCgoJTm9kZVRhZwkJdHlwZTsKCgkvKiBJRCBmb3IgUEggKHVuaXF1 ZSB3aXRoaW4gcGxhbm5lciBydW4pICovCglJbmRleAkJcGhpZDsKCgkvKgoJICogY29weSBv ZiBQbGFjZUhvbGRlclZhciB0cmVlIChzaG91bGQgYmUgcmVkdW5kYW50IGZvciBjb21wYXJp c29uLCBjb3VsZAoJICogYmUgaWdub3JlZCkKCSAqLwoJUGxhY2VIb2xkZXJWYXIgKnBoX3Zh cjsKCgkvKiBsb3dlc3QgbGV2ZWwgd2UgY2FuIGV2YWx1YXRlIHZhbHVlIGF0ICovCglSZWxp ZHMJCXBoX2V2YWxfYXQ7CgoJLyogcmVsaWRzIG9mIGNvbnRhaW5lZCBsYXRlcmFsIHJlZnMs IGlmIGFueSAqLwoJUmVsaWRzCQlwaF9sYXRlcmFsOwoKCS8qIGhpZ2hlc3QgbGV2ZWwgdGhl IHZhbHVlIGlzIG5lZWRlZCBhdCAqLwoJUmVsaWRzCQlwaF9uZWVkZWQ7CgoJLyogZXN0aW1h dGVkIGF0dHJpYnV0ZSB3aWR0aCAqLwoJaW50MzIJCXBoX3dpZHRoOwp9IFBsYWNlSG9sZGVy SW5mbzsKCi8qCiAqIFRoaXMgc3RydWN0IGRlc2NyaWJlcyBvbmUgcG90ZW50aWFsbHkgaW5k ZXgtb3B0aW1pemFibGUgTUlOL01BWCBhZ2dyZWdhdGUKICogZnVuY3Rpb24uICBNaW5NYXhB Z2dQYXRoIGNvbnRhaW5zIGEgbGlzdCBvZiB0aGVzZSwgYW5kIGlmIHdlIGFjY2VwdCB0aGF0 CiAqIHBhdGgsIHRoZSBsaXN0IGlzIHN0b3JlZCBpbnRvIHJvb3QtPm1pbm1heF9hZ2dzIGZv ciB1c2UgZHVyaW5nIHNldHJlZnMuYy4KICovCnR5cGVkZWYgc3RydWN0IE1pbk1heEFnZ0lu Zm8KewoJcGdfbm9kZV9hdHRyKG5vX2NvcHlfZXF1YWwsIG5vX3JlYWQsIG5vX3F1ZXJ5X2p1 bWJsZSkKCglOb2RlVGFnCQl0eXBlOwoKCS8qIHBnX3Byb2MgT2lkIG9mIHRoZSBhZ2dyZWdh dGUgKi8KCU9pZAkJCWFnZ2Zub2lkOwoKCS8qIE9pZCBvZiBpdHMgc29ydCBvcGVyYXRvciAq LwoJT2lkCQkJYWdnc29ydG9wOwoKCS8qIGV4cHJlc3Npb24gd2UgYXJlIGFnZ3JlZ2F0aW5n IG9uICovCglFeHByCSAgICp0YXJnZXQ7CgoJLyoKCSAqIG1vZGlmaWVkICJyb290IiBmb3Ig cGxhbm5pbmcgdGhlIHN1YnF1ZXJ5OyBub3QgcHJpbnRlZCwgdG9vIGxhcmdlLCBub3QKCSAq IGludGVyZXN0aW5nIGVub3VnaAoJICovCglQbGFubmVySW5mbyAqc3Vicm9vdCBwZ19ub2Rl X2F0dHIocmVhZF93cml0ZV9pZ25vcmUpOwoKCS8qIGFjY2VzcyBwYXRoIGZvciBzdWJxdWVy eSAqLwoJUGF0aAkgICAqcGF0aDsKCgkvKiBlc3RpbWF0ZWQgY29zdCB0byBmZXRjaCBmaXJz dCByb3cgKi8KCUNvc3QJCXBhdGhjb3N0OwoKCS8qIHBhcmFtIGZvciBzdWJwbGFuJ3Mgb3V0 cHV0ICovCglQYXJhbQkgICAqcGFyYW07Cn0gTWluTWF4QWdnSW5mbzsKCi8qCiAqIEZvciBl YWNoIGRpc3RpbmN0IEFnZ3JlZiBub2RlIHRoYXQgYXBwZWFycyBpbiB0aGUgdGFyZ2V0bGlz dCBhbmQgSEFWSU5HCiAqIGNsYXVzZXMsIHdlIHN0b3JlIGFuIEFnZ0NsYXVzZUluZm8gbm9k ZSBpbiB0aGUgUGxhbm5lckluZm8gbm9kZSdzCiAqIGFnZ19jbGF1c2VfbGlzdC4gIEVhY2gg QWdnQ2xhdXNlSW5mbyByZWNvcmRzIHRoZSBzZXQgb2YgcmVsYXRpb25zIHJlZmVyZW5jZWQK ICogYnkgdGhlIGFnZ3JlZ2F0ZSBleHByZXNzaW9uLiAgVGhpcyBpbmZvcm1hdGlvbiBpcyB1 c2VkIHRvIGRldGVybWluZSBob3cgZmFyCiAqIHRoZSBhZ2dyZWdhdGUgY2FuIGJlIHNhZmVs eSBwdXNoZWQgZG93biBpbiB0aGUgam9pbiB0cmVlLgogKi8KdHlwZWRlZiBzdHJ1Y3QgQWdn Q2xhdXNlSW5mbwp7CglwZ19ub2RlX2F0dHIobm9fcmVhZCwgbm9fcXVlcnlfanVtYmxlKQoK CU5vZGVUYWcJCXR5cGU7CgoJLyogdGhlIEFnZ3JlZiBleHByICovCglBZ2dyZWYJICAgKmFn Z3JlZjsKCgkvKiBsb3dlc3QgbGV2ZWwgd2UgY2FuIGV2YWx1YXRlIHRoaXMgYWdncmVnYXRl IGF0ICovCglSZWxpZHMJCWFnZ19ldmFsX2F0Owp9IEFnZ0NsYXVzZUluZm87CgovKgogKiBG b3IgZWFjaCBncm91cGluZyBleHByZXNzaW9uIHRoYXQgYXBwZWFycyBpbiBncm91cGluZyBj bGF1c2VzLCB3ZSBzdG9yZSBhCiAqIEdyb3VwaW5nRXhwckluZm8gbm9kZSBpbiB0aGUgUGxh bm5lckluZm8gbm9kZSdzIGdyb3VwX2V4cHJfbGlzdC4gIEVhY2gKICogR3JvdXBpbmdFeHBy SW5mbyByZWNvcmRzIHRoZSBleHByZXNzaW9uIGJlaW5nIGdyb3VwZWQgb24sIGl0cyBzb3J0 Z3JvdXByZWYsCiAqIGFuZCB0aGUgRXF1aXZhbGVuY2VDbGFzcyBpdCBiZWxvbmdzIHRvLiAg VGhpcyBpbmZvcm1hdGlvbiBpcyBuZWNlc3NhcnkgdG8KICogcmVwcm9kdWNlIGNvcnJlY3Qg Z3JvdXBpbmcgc2VtYW50aWNzIGF0IGRpZmZlcmVudCBsZXZlbHMgb2YgdGhlIGpvaW4gdHJl ZS4KICovCnR5cGVkZWYgc3RydWN0IEdyb3VwaW5nRXhwckluZm8KewoJcGdfbm9kZV9hdHRy KG5vX3JlYWQsIG5vX3F1ZXJ5X2p1bWJsZSkKCglOb2RlVGFnCQl0eXBlOwoKCS8qIHRoZSBy ZXByZXNlbnRlZCBleHByZXNzaW9uICovCglFeHByCSAgICpleHByOwoKCS8qIHRoZSB0bGVT b3J0R3JvdXBSZWYgb2YgdGhlIGNvcnJlc3BvbmRpbmcgU29ydEdyb3VwQ2xhdXNlICovCglJ bmRleAkJc29ydGdyb3VwcmVmOwoKCS8qIHRoZSBlcXVpdmFsZW5jZSBjbGFzcyB0aGUgZXhw cmVzc2lvbiBiZWxvbmdzIHRvICovCglFcXVpdmFsZW5jZUNsYXNzICplYyBwZ19ub2RlX2F0 dHIoY29weV9hc19zY2FsYXIsIGVxdWFsX2FzX3NjYWxhcik7Cn0gR3JvdXBpbmdFeHBySW5m bzsKCi8qCiAqIEF0IHJ1bnRpbWUsIFBBUkFNX0VYRUMgc2xvdHMgYXJlIHVzZWQgdG8gcGFz cyB2YWx1ZXMgYXJvdW5kIGZyb20gb25lIHBsYW4KICogbm9kZSB0byBhbm90aGVyLiAgVGhl eSBjYW4gYmUgdXNlZCB0byBwYXNzIHZhbHVlcyBkb3duIGludG8gc3VicXVlcmllcyAoZm9y CiAqIG91dGVyIHJlZmVyZW5jZXMgaW4gc3VicXVlcmllcyksIG9yIHVwIG91dCBvZiBzdWJx dWVyaWVzIChmb3IgdGhlIHJlc3VsdHMKICogb2YgYSBzdWJwbGFuKSwgb3IgZnJvbSBhIE5l c3RMb29wIHBsYW4gbm9kZSBpbnRvIGl0cyBpbm5lciByZWxhdGlvbiAod2hlbgogKiB0aGUg aW5uZXIgc2NhbiBpcyBwYXJhbWV0ZXJpemVkIHdpdGggdmFsdWVzIGZyb20gdGhlIG91dGVy IHJlbGF0aW9uKS4KICogVGhlIHBsYW5uZXIgaXMgcmVzcG9uc2libGUgZm9yIGFzc2lnbmlu ZyBub25jb25mbGljdGluZyBQQVJBTV9FWEVDIElEcyB0bwogKiB0aGUgUEFSQU1fRVhFQyBQ YXJhbXMgaXQgZ2VuZXJhdGVzLgogKgogKiBPdXRlciByZWZlcmVuY2VzIGFyZSBtYW5hZ2Vk IHZpYSByb290LT5wbGFuX3BhcmFtcywgd2hpY2ggaXMgYSBsaXN0IG9mCiAqIFBsYW5uZXJQ YXJhbUl0ZW1zLiAgV2hpbGUgcGxhbm5pbmcgYSBzdWJxdWVyeSwgZWFjaCBwYXJlbnQgcXVl cnkgbGV2ZWwncwogKiBwbGFuX3BhcmFtcyBjb250YWlucyB0aGUgdmFsdWVzIHJlcXVpcmVk IGZyb20gaXQgYnkgdGhlIGN1cnJlbnQgc3VicXVlcnkuCiAqIER1cmluZyBjcmVhdGVfcGxh bigpLCB3ZSB1c2UgcGxhbl9wYXJhbXMgdG8gdHJhY2sgdmFsdWVzIHRoYXQgbXVzdCBiZQog KiBwYXNzZWQgZnJvbSBvdXRlciB0byBpbm5lciBzaWRlcyBvZiBOZXN0TG9vcCBwbGFuIG5v ZGVzLgogKgogKiBUaGUgaXRlbSBhIFBsYW5uZXJQYXJhbUl0ZW0gcmVwcmVzZW50cyBjYW4g YmUgb25lIG9mIHRocmVlIGtpbmRzOgogKgogKiBBIFZhcjogdGhlIHNsb3QgcmVwcmVzZW50 cyBhIHZhcmlhYmxlIG9mIHRoaXMgbGV2ZWwgdGhhdCBtdXN0IGJlIHBhc3NlZAogKiBkb3du IGJlY2F1c2Ugc3VicXVlcmllcyBoYXZlIG91dGVyIHJlZmVyZW5jZXMgdG8gaXQsIG9yIG11 c3QgYmUgcGFzc2VkCiAqIGZyb20gYSBOZXN0TG9vcCBub2RlIHRvIGl0cyBpbm5lciBzY2Fu LiAgVGhlIHZhcmxldmVsc3VwIHZhbHVlIGluIHRoZSBWYXIKICogd2lsbCBhbHdheXMgYmUg emVyby4KICoKICogQSBQbGFjZUhvbGRlclZhcjogdGhpcyB3b3JrcyBtdWNoIGxpa2UgdGhl IFZhciBjYXNlLCBleGNlcHQgdGhhdCB0aGUKICogZW50cnkgaXMgYSBQbGFjZUhvbGRlclZh ciBub2RlIHdpdGggYSBjb250YWluZWQgZXhwcmVzc2lvbi4gIFRoZSBQSFYKICogd2lsbCBo YXZlIHBobGV2ZWxzdXAgPSAwLCBhbmQgdGhlIGNvbnRhaW5lZCBleHByZXNzaW9uIGlzIGFk anVzdGVkCiAqIHRvIG1hdGNoIGluIGxldmVsLgogKgogKiBBbiBBZ2dyZWYgKHdpdGggYW4g ZXhwcmVzc2lvbiB0cmVlIHJlcHJlc2VudGluZyBpdHMgYXJndW1lbnQpOiB0aGUgc2xvdAog KiByZXByZXNlbnRzIGFuIGFnZ3JlZ2F0ZSBleHByZXNzaW9uIHRoYXQgaXMgYW4gb3V0ZXIg cmVmZXJlbmNlIGZvciBzb21lCiAqIHN1YnF1ZXJ5LiAgVGhlIEFnZ3JlZiBpdHNlbGYgaGFz IGFnZ2xldmVsc3VwID0gMCwgYW5kIGl0cyBhcmd1bWVudCB0cmVlCiAqIGlzIGFkanVzdGVk IHRvIG1hdGNoIGluIGxldmVsLgogKgogKiBOb3RlOiB3ZSBkZXRlY3QgZHVwbGljYXRlIFZh ciBhbmQgUGxhY2VIb2xkZXJWYXIgcGFyYW1ldGVycyBhbmQgY29hbGVzY2UKICogdGhlbSBp bnRvIG9uZSBzbG90LCBidXQgd2UgZG8gbm90IGJvdGhlciB0byBkbyB0aGF0IGZvciBBZ2dy ZWZzLgogKiBUaGUgc2NvcGUgb2YgZHVwbGljYXRlLWVsaW1pbmF0aW9uIG9ubHkgZXh0ZW5k cyBhY3Jvc3MgdGhlIHNldCBvZgogKiBwYXJhbWV0ZXJzIHBhc3NlZCBmcm9tIG9uZSBxdWVy eSBsZXZlbCBpbnRvIGEgc2luZ2xlIHN1YnF1ZXJ5LCBvciBmb3IKICogbmVzdGxvb3AgcGFy YW1ldGVycyBhY3Jvc3MgdGhlIHNldCBvZiBuZXN0bG9vcCBwYXJhbWV0ZXJzIHVzZWQgaW4g YSBzaW5nbGUKICogcXVlcnkgbGV2ZWwuICBTbyB0aGVyZSBpcyBubyBwb3NzaWJpbGl0eSBv ZiBhIFBBUkFNX0VYRUMgc2xvdCBiZWluZyB1c2VkCiAqIGZvciBjb25mbGljdGluZyBwdXJw b3Nlcy4KICoKICogSW4gYWRkaXRpb24sIFBBUkFNX0VYRUMgc2xvdHMgYXJlIGFzc2lnbmVk IGZvciBQYXJhbXMgcmVwcmVzZW50aW5nIG91dHB1dHMKICogZnJvbSBzdWJwbGFucyAodmFs dWVzIHRoYXQgYXJlIHNldFBhcmFtIGl0ZW1zIGZvciB0aG9zZSBzdWJwbGFucykuICBUaGVz ZQogKiBJRHMgbmVlZCBub3QgYmUgdHJhY2tlZCB2aWEgUGxhbm5lclBhcmFtSXRlbXMsIHNp bmNlIHdlIGRvIG5vdCBuZWVkIGFueQogKiBkdXBsaWNhdGUtZWxpbWluYXRpb24gbm9yIGxh dGVyIHByb2Nlc3Npbmcgb2YgdGhlIHJlcHJlc2VudGVkIGV4cHJlc3Npb25zLgogKiBJbnN0 ZWFkLCB3ZSBqdXN0IHJlY29yZCB0aGUgYXNzaWdubWVudCBvZiB0aGUgc2xvdCBudW1iZXIg YnkgYXBwZW5kaW5nIHRvCiAqIHJvb3QtPmdsb2ItPnBhcmFtRXhlY1R5cGVzLgogKi8KdHlw ZWRlZiBzdHJ1Y3QgUGxhbm5lclBhcmFtSXRlbQp7CglwZ19ub2RlX2F0dHIobm9fY29weV9l cXVhbCwgbm9fcmVhZCwgbm9fcXVlcnlfanVtYmxlKQoKCU5vZGVUYWcJCXR5cGU7CgoJTm9k ZQkgICAqaXRlbTsJCQkvKiB0aGUgVmFyLCBQbGFjZUhvbGRlclZhciwgb3IgQWdncmVmICov CglpbnQJCQlwYXJhbUlkOwkJLyogaXRzIGFzc2lnbmVkIFBBUkFNX0VYRUMgc2xvdCBudW1i ZXIgKi8KfSBQbGFubmVyUGFyYW1JdGVtOwoKLyoKICogV2hlbiBtYWtpbmcgY29zdCBlc3Rp bWF0ZXMgZm9yIGEgU0VNSS9BTlRJL2lubmVyX3VuaXF1ZSBqb2luLCB0aGVyZSBhcmUKICog c29tZSBjb3JyZWN0aW9uIGZhY3RvcnMgdGhhdCBhcmUgbmVlZGVkIGluIGJvdGggbmVzdGxv b3AgYW5kIGhhc2ggam9pbnMKICogdG8gYWNjb3VudCBmb3IgdGhlIGZhY3QgdGhhdCB0aGUg ZXhlY3V0b3IgY2FuIHN0b3Agc2Nhbm5pbmcgaW5uZXIgcm93cwogKiBhcyBzb29uIGFzIGl0 IGZpbmRzIGEgbWF0Y2ggdG8gdGhlIGN1cnJlbnQgb3V0ZXIgcm93LiAgVGhlc2UgbnVtYmVy cwogKiBkZXBlbmQgb25seSBvbiB0aGUgc2VsZWN0ZWQgb3V0ZXIgYW5kIGlubmVyIGpvaW4g cmVsYXRpb25zLCBub3Qgb24gdGhlCiAqIHBhcnRpY3VsYXIgcGF0aHMgdXNlZCBmb3IgdGhl bSwgc28gaXQncyB3b3J0aHdoaWxlIHRvIGNhbGN1bGF0ZSB0aGVtCiAqIGp1c3Qgb25jZSBw ZXIgcmVsYXRpb24gcGFpciBub3Qgb25jZSBwZXIgY29uc2lkZXJlZCBwYXRoLiAgVGhpcyBz dHJ1Y3QKICogaXMgZmlsbGVkIGJ5IGNvbXB1dGVfc2VtaV9hbnRpX2pvaW5fZmFjdG9ycyBh bmQgbXVzdCBiZSBwYXNzZWQgYWxvbmcKICogdG8gdGhlIGpvaW4gY29zdCBlc3RpbWF0aW9u IGZ1bmN0aW9ucy4KICoKICogb3V0ZXJfbWF0Y2hfZnJhYyBpcyB0aGUgZnJhY3Rpb24gb2Yg dGhlIG91dGVyIHR1cGxlcyB0aGF0IGFyZQogKgkJZXhwZWN0ZWQgdG8gaGF2ZSBhdCBsZWFz dCBvbmUgbWF0Y2guCiAqIG1hdGNoX2NvdW50IGlzIHRoZSBhdmVyYWdlIG51bWJlciBvZiBt YXRjaGVzIGV4cGVjdGVkIGZvcgogKgkJb3V0ZXIgdHVwbGVzIHRoYXQgaGF2ZSBhdCBsZWFz dCBvbmUgbWF0Y2guCiAqLwp0eXBlZGVmIHN0cnVjdCBTZW1pQW50aUpvaW5GYWN0b3JzCnsK CVNlbGVjdGl2aXR5IG91dGVyX21hdGNoX2ZyYWM7CglTZWxlY3Rpdml0eSBtYXRjaF9jb3Vu dDsKfSBTZW1pQW50aUpvaW5GYWN0b3JzOwoKLyoKICogU3RydWN0IGZvciBleHRyYSBpbmZv cm1hdGlvbiBwYXNzZWQgdG8gc3Vicm91dGluZXMgb2YgYWRkX3BhdGhzX3RvX2pvaW5yZWwK ICoKICogcmVzdHJpY3RsaXN0IGNvbnRhaW5zIGFsbCBvZiB0aGUgUmVzdHJpY3RJbmZvIG5v ZGVzIGZvciByZXN0cmljdGlvbgogKgkJY2xhdXNlcyB0aGF0IGFwcGx5IHRvIHRoaXMgam9p bgogKiBtZXJnZWNsYXVzZV9saXN0IGlzIGEgbGlzdCBvZiBSZXN0cmljdEluZm8gbm9kZXMg Zm9yIGF2YWlsYWJsZQogKgkJbWVyZ2Vqb2luIGNsYXVzZXMgaW4gdGhpcyBqb2luCiAqIGlu bmVyX3VuaXF1ZSBpcyB0cnVlIGlmIGVhY2ggb3V0ZXIgdHVwbGUgcHJvdmFibHkgbWF0Y2hl cyBubyBtb3JlCiAqCQl0aGFuIG9uZSBpbm5lciB0dXBsZQogKiBzamluZm8gaXMgZXh0cmEg aW5mbyBhYm91dCBzcGVjaWFsIGpvaW5zIGZvciBzZWxlY3Rpdml0eSBlc3RpbWF0aW9uCiAq IHNlbWlmYWN0b3JzIGlzIGFzIHNob3duIGFib3ZlIChvbmx5IHZhbGlkIGZvciBTRU1JL0FO VEkvaW5uZXJfdW5pcXVlIGpvaW5zKQogKiBwYXJhbV9zb3VyY2VfcmVscyBhcmUgT0sgdGFy Z2V0cyBmb3IgcGFyYW1ldGVyaXphdGlvbiBvZiByZXN1bHQgcGF0aHMKICogcGdzX21hc2sg aXMgYSBiaXRtYXNrIG9mIFBHU18qIGNvbnN0YW50cyB0byBsaW1pdCB0aGUgam9pbiBzdHJh dGVneQogKi8KdHlwZWRlZiBzdHJ1Y3QgSm9pblBhdGhFeHRyYURhdGEKewoJTGlzdAkgICAq cmVzdHJpY3RsaXN0OwoJTGlzdAkgICAqbWVyZ2VjbGF1c2VfbGlzdDsKCWJvb2wJCWlubmVy X3VuaXF1ZTsKCVNwZWNpYWxKb2luSW5mbyAqc2ppbmZvOwoJU2VtaUFudGlKb2luRmFjdG9y cyBzZW1pZmFjdG9yczsKCVJlbGlkcwkJcGFyYW1fc291cmNlX3JlbHM7Cgl1aW50NjQJCXBn c19tYXNrOwp9IEpvaW5QYXRoRXh0cmFEYXRhOwoKLyoKICogVmFyaW91cyBmbGFncyBpbmRp Y2F0aW5nIHdoYXQga2luZHMgb2YgZ3JvdXBpbmcgYXJlIHBvc3NpYmxlLgogKgogKiBHUk9V UElOR19DQU5fVVNFX1NPUlQgc2hvdWxkIGJlIHNldCBpZiBpdCdzIHBvc3NpYmxlIHRvIHBl cmZvcm0KICogc29ydC1iYXNlZCBpbXBsZW1lbnRhdGlvbnMgb2YgZ3JvdXBpbmcuICBXaGVu IGdyb3VwaW5nIHNldHMgYXJlIGluIHVzZSwKICogdGhpcyB3aWxsIGJlIHRydWUgaWYgc29y dGluZyBpcyBwb3RlbnRpYWxseSB1c2FibGUgZm9yIGFueSBvZiB0aGUgZ3JvdXBpbmcKICog c2V0cywgZXZlbiBpZiBpdCdzIG5vdCB1c2FibGUgZm9yIGFsbCBvZiB0aGVtLgogKgogKiBH Uk9VUElOR19DQU5fVVNFX0hBU0ggc2hvdWxkIGJlIHNldCBpZiBpdCdzIHBvc3NpYmxlIHRv IHBlcmZvcm0KICogaGFzaC1iYXNlZCBpbXBsZW1lbnRhdGlvbnMgb2YgZ3JvdXBpbmcuCiAq CiAqIEdST1VQSU5HX0NBTl9QQVJUSUFMX0FHRyBzaG91bGQgYmUgc2V0IGlmIHRoZSBhZ2dy ZWdhdGlvbiBpcyBvZiBhIHR5cGUKICogZm9yIHdoaWNoIHdlIHN1cHBvcnQgcGFydGlhbCBh Z2dyZWdhdGlvbiAobm90LCBmb3IgZXhhbXBsZSwgZ3JvdXBpbmcgc2V0cykuCiAqIEl0IHNh eXMgbm90aGluZyBhYm91dCBwYXJhbGxlbC1zYWZldHkgb3IgdGhlIGF2YWlsYWJpbGl0eSBv ZiBzdWl0YWJsZSBwYXRocy4KICovCiNkZWZpbmUgR1JPVVBJTkdfQ0FOX1VTRV9TT1JUICAg ICAgIDB4MDAwMQojZGVmaW5lIEdST1VQSU5HX0NBTl9VU0VfSEFTSCAgICAgICAweDAwMDIK I2RlZmluZSBHUk9VUElOR19DQU5fUEFSVElBTF9BR0cJMHgwMDA0CgovKgogKiBXaGF0IGtp bmQgb2YgcGFydGl0aW9ud2lzZSBhZ2dyZWdhdGlvbiBpcyBpbiB1c2U/CiAqCiAqIFBBUlRJ VElPTldJU0VfQUdHUkVHQVRFX05PTkU6IE5vdCB1c2VkLgogKgogKiBQQVJUSVRJT05XSVNF X0FHR1JFR0FURV9GVUxMOiBBZ2dyZWdhdGUgZWFjaCBwYXJ0aXRpb24gc2VwYXJhdGVseSwg YW5kCiAqIGFwcGVuZCB0aGUgcmVzdWx0cy4KICoKICogUEFSVElUSU9OV0lTRV9BR0dSRUdB VEVfUEFSVElBTDogUGFydGlhbGx5IGFnZ3JlZ2F0ZSBlYWNoIHBhcnRpdGlvbgogKiBzZXBh cmF0ZWx5LCBhcHBlbmQgdGhlIHJlc3VsdHMsIGFuZCB0aGVuIGZpbmFsaXplIGFnZ3JlZ2F0 aW9uLgogKi8KdHlwZWRlZiBlbnVtCnsKCVBBUlRJVElPTldJU0VfQUdHUkVHQVRFX05PTkUs CglQQVJUSVRJT05XSVNFX0FHR1JFR0FURV9GVUxMLAoJUEFSVElUSU9OV0lTRV9BR0dSRUdB VEVfUEFSVElBTCwKfSBQYXJ0aXRpb253aXNlQWdncmVnYXRlVHlwZTsKCi8qCiAqIFN0cnVj dCBmb3IgZXh0cmEgaW5mb3JtYXRpb24gcGFzc2VkIHRvIHN1YnJvdXRpbmVzIG9mIGNyZWF0 ZV9ncm91cGluZ19wYXRocwogKgogKiBmbGFncyBpbmRpY2F0aW5nIHdoYXQga2luZHMgb2Yg Z3JvdXBpbmcgYXJlIHBvc3NpYmxlLgogKiBwYXJ0aWFsX2Nvc3RzX3NldCBpcyB0cnVlIGlm IHRoZSBhZ2dfcGFydGlhbF9jb3N0cyBhbmQgYWdnX2ZpbmFsX2Nvc3RzCiAqIAkJaGF2ZSBi ZWVuIGluaXRpYWxpemVkLgogKiBhZ2dfcGFydGlhbF9jb3N0cyBnaXZlcyBwYXJ0aWFsIGFn Z3JlZ2F0aW9uIGNvc3RzLgogKiBhZ2dfZmluYWxfY29zdHMgZ2l2ZXMgZmluYWxpemF0aW9u IGNvc3RzLgogKiB0YXJnZXRfcGFyYWxsZWxfc2FmZSBpcyB0cnVlIGlmIHRhcmdldCBpcyBw YXJhbGxlbCBzYWZlLgogKiBoYXZpbmdRdWFsIGdpdmVzIGxpc3Qgb2YgcXVhbHMgdG8gYmUg YXBwbGllZCBhZnRlciBhZ2dyZWdhdGlvbi4KICogdGFyZ2V0TGlzdCBnaXZlcyBsaXN0IG9m IGNvbHVtbnMgdG8gYmUgcHJvamVjdGVkLgogKiBwYXR5cGUgaXMgdGhlIHR5cGUgb2YgcGFy dGl0aW9ud2lzZSBhZ2dyZWdhdGlvbiB0aGF0IGlzIGJlaW5nIHBlcmZvcm1lZC4KICovCnR5 cGVkZWYgc3RydWN0CnsKCS8qIERhdGEgd2hpY2ggcmVtYWlucyBjb25zdGFudCBvbmNlIHNl dC4gKi8KCWludAkJCWZsYWdzOwoJYm9vbAkJcGFydGlhbF9jb3N0c19zZXQ7CglBZ2dDbGF1 c2VDb3N0cyBhZ2dfcGFydGlhbF9jb3N0czsKCUFnZ0NsYXVzZUNvc3RzIGFnZ19maW5hbF9j b3N0czsKCgkvKiBEYXRhIHdoaWNoIG1heSBkaWZmZXIgYWNyb3NzIHBhcnRpdGlvbnMuICov Cglib29sCQl0YXJnZXRfcGFyYWxsZWxfc2FmZTsKCU5vZGUJICAgKmhhdmluZ1F1YWw7CglM aXN0CSAgICp0YXJnZXRMaXN0OwoJUGFydGl0aW9ud2lzZUFnZ3JlZ2F0ZVR5cGUgcGF0eXBl Owp9IEdyb3VwUGF0aEV4dHJhRGF0YTsKCi8qCiAqIFN0cnVjdCBmb3IgZXh0cmEgaW5mb3Jt YXRpb24gcGFzc2VkIHRvIHN1YnJvdXRpbmVzIG9mIGdyb3VwaW5nX3BsYW5uZXIKICoKICog bGltaXRfbmVlZGVkIGlzIHRydWUgaWYgd2UgYWN0dWFsbHkgbmVlZCBhIExpbWl0IHBsYW4g bm9kZS4KICogbGltaXRfdHVwbGVzIGlzIGFuIGVzdGltYXRlZCBib3VuZCBvbiB0aGUgbnVt YmVyIG9mIG91dHB1dCB0dXBsZXMsCiAqCQlvciAtMSBpZiBubyBMSU1JVCBvciBjb3VsZG4n dCBlc3RpbWF0ZS4KICogY291bnRfZXN0IGFuZCBvZmZzZXRfZXN0IGFyZSB0aGUgZXN0aW1h dGVkIHZhbHVlcyBvZiB0aGUgTElNSVQgYW5kIE9GRlNFVAogKiAJCWV4cHJlc3Npb25zIGNv bXB1dGVkIGJ5IHByZXByb2Nlc3NfbGltaXQoKSAoc2VlIGNvbW1lbnRzIGZvcgogKiAJCXBy ZXByb2Nlc3NfbGltaXQoKSBmb3IgbW9yZSBpbmZvcm1hdGlvbikuCiAqLwp0eXBlZGVmIHN0 cnVjdAp7Cglib29sCQlsaW1pdF9uZWVkZWQ7CglDYXJkaW5hbGl0eSBsaW1pdF90dXBsZXM7 CglpbnQ2NAkJY291bnRfZXN0OwoJaW50NjQJCW9mZnNldF9lc3Q7Cn0gRmluYWxQYXRoRXh0 cmFEYXRhOwoKLyoKICogRm9yIHNwZWVkIHJlYXNvbnMsIGNvc3QgZXN0aW1hdGlvbiBmb3Ig am9pbiBwYXRocyBpcyBwZXJmb3JtZWQgaW4gdHdvCiAqIHBoYXNlczogdGhlIGZpcnN0IHBo YXNlIHRyaWVzIHRvIHF1aWNrbHkgZGVyaXZlIGEgbG93ZXIgYm91bmQgZm9yIHRoZQogKiBq b2luIGNvc3QsIGFuZCB0aGVuIHdlIGNoZWNrIGlmIHRoYXQncyBzdWZmaWNpZW50IHRvIHJl amVjdCB0aGUgcGF0aC4KICogSWYgbm90LCB3ZSBjb21lIGJhY2sgZm9yIGEgbW9yZSByZWZp bmVkIGNvc3QgZXN0aW1hdGUuICBUaGUgZmlyc3QgcGhhc2UKICogZmlsbHMgYSBKb2luQ29z dFdvcmtzcGFjZSBzdHJ1Y3Qgd2l0aCBpdHMgcHJlbGltaW5hcnkgY29zdCBlc3RpbWF0ZXMK ICogYW5kIHBvc3NpYmx5IGFkZGl0aW9uYWwgaW50ZXJtZWRpYXRlIHZhbHVlcy4gIFRoZSBz ZWNvbmQgcGhhc2UgdGFrZXMKICogdGhlc2UgdmFsdWVzIGFzIGlucHV0cyB0byBhdm9pZCBy ZXBlYXRpbmcgd29yay4KICoKICogKElkZWFsbHkgd2UnZCBkZWNsYXJlIHRoaXMgaW4gY29z dC5oLCBidXQgaXQncyBhbHNvIG5lZWRlZCBpbiBwYXRobm9kZS5oLAogKiBzbyBzZWVtcyBi ZXN0IHRvIHB1dCBpdCBoZXJlLikKICovCnR5cGVkZWYgc3RydWN0IEpvaW5Db3N0V29ya3Nw YWNlCnsKCS8qIFByZWxpbWluYXJ5IGNvc3QgZXN0aW1hdGVzIC0tLSBtdXN0IG5vdCBiZSBs YXJnZXIgdGhhbiBmaW5hbCBvbmVzISAqLwoJaW50CQkJZGlzYWJsZWRfbm9kZXM7CglDb3N0 CQlzdGFydHVwX2Nvc3Q7CS8qIGNvc3QgZXhwZW5kZWQgYmVmb3JlIGZldGNoaW5nIGFueSB0 dXBsZXMgKi8KCUNvc3QJCXRvdGFsX2Nvc3Q7CQkvKiB0b3RhbCBjb3N0IChhc3N1bWluZyBh bGwgdHVwbGVzIGZldGNoZWQpICovCgoJLyogRmllbGRzIGJlbG93IGhlcmUgc2hvdWxkIGJl IHRyZWF0ZWQgYXMgcHJpdmF0ZSB0byBjb3N0c2l6ZS5jICovCglDb3N0CQlydW5fY29zdDsJ CS8qIG5vbi1zdGFydHVwIGNvc3QgY29tcG9uZW50cyAqLwoKCS8qIHByaXZhdGUgZm9yIGNv c3RfbmVzdGxvb3AgY29kZSAqLwoJQ29zdAkJaW5uZXJfcnVuX2Nvc3Q7IC8qIGFsc28gdXNl ZCBieSBjb3N0X21lcmdlam9pbiBjb2RlICovCglDb3N0CQlpbm5lcl9yZXNjYW5fcnVuX2Nv c3Q7CgoJLyogcHJpdmF0ZSBmb3IgY29zdF9tZXJnZWpvaW4gY29kZSAqLwoJQ2FyZGluYWxp dHkgb3V0ZXJfcm93czsKCUNhcmRpbmFsaXR5IGlubmVyX3Jvd3M7CglDYXJkaW5hbGl0eSBv dXRlcl9za2lwX3Jvd3M7CglDYXJkaW5hbGl0eSBpbm5lcl9za2lwX3Jvd3M7CgoJLyogcHJp dmF0ZSBmb3IgY29zdF9oYXNoam9pbiBjb2RlICovCglpbnQJCQludW1idWNrZXRzOwoJaW50 CQkJbnVtYmF0Y2hlczsKCUNhcmRpbmFsaXR5IGlubmVyX3Jvd3NfdG90YWw7Cn0gSm9pbkNv c3RXb3Jrc3BhY2U7CgovKgogKiBBZ2dJbmZvIGhvbGRzIGluZm9ybWF0aW9uIGFib3V0IGFu IGFnZ3JlZ2F0ZSB0aGF0IG5lZWRzIHRvIGJlIGNvbXB1dGVkLgogKiBNdWx0aXBsZSBBZ2dy ZWZzIGluIGEgcXVlcnkgY2FuIHJlZmVyIHRvIHRoZSBzYW1lIEFnZ0luZm8gYnkgaGF2aW5n IHRoZQogKiBzYW1lICdhZ2dubycgdmFsdWUsIHNvIHRoYXQgdGhlIGFnZ3JlZ2F0ZSBpcyBj b21wdXRlZCBvbmx5IG9uY2UuCiAqLwp0eXBlZGVmIHN0cnVjdCBBZ2dJbmZvCnsKCXBnX25v ZGVfYXR0cihub19jb3B5X2VxdWFsLCBub19yZWFkLCBub19xdWVyeV9qdW1ibGUpCgoJTm9k ZVRhZwkJdHlwZTsKCgkvKgoJICogTGlzdCBvZiBBZ2dyZWYgZXhwcnMgdGhhdCB0aGlzIHN0 YXRlIHZhbHVlIGlzIGZvci4KCSAqCgkgKiBUaGVyZSB3aWxsIGFsd2F5cyBiZSBhdCBsZWFz dCBvbmUsIGJ1dCB0aGVyZSBjYW4gYmUgbXVsdGlwbGUgaWRlbnRpY2FsCgkgKiBBZ2dyZWYn cyBzaGFyaW5nIHRoZSBzYW1lIHBlci1hZ2cuCgkgKi8KCUxpc3QJICAgKmFnZ3JlZnM7CgoJ LyogVHJhbnNpdGlvbiBzdGF0ZSBudW1iZXIgZm9yIHRoaXMgYWdncmVnYXRlICovCglpbnQJ CQl0cmFuc25vOwoKCS8qCgkgKiAic2hhcmVhYmxlIiBpcyBmYWxzZSBpZiB0aGlzIGFnZyBj YW5ub3Qgc2hhcmUgc3RhdGUgdmFsdWVzIHdpdGggb3RoZXIKCSAqIGFnZ3JlZ2F0ZXMgYmVj YXVzZSB0aGUgZmluYWwgZnVuY3Rpb24gaXMgcmVhZC13cml0ZS4KCSAqLwoJYm9vbAkJc2hh cmVhYmxlOwoKCS8qIE9pZCBvZiB0aGUgZmluYWwgZnVuY3Rpb24sIG9yIEludmFsaWRPaWQg aWYgbm9uZSAqLwoJT2lkCQkJZmluYWxmbl9vaWQ7Cn0gQWdnSW5mbzsKCi8qCiAqIEFnZ1Ry YW5zSW5mbyBob2xkcyBpbmZvcm1hdGlvbiBhYm91dCB0cmFuc2l0aW9uIHN0YXRlIHRoYXQg aXMgdXNlZCBieSBvbmUKICogb3IgbW9yZSBhZ2dyZWdhdGVzIGluIHRoZSBxdWVyeS4gIE11 bHRpcGxlIGFnZ3JlZ2F0ZXMgY2FuIHNoYXJlIHRoZSBzYW1lCiAqIHRyYW5zaXRpb24gc3Rh dGUsIGlmIHRoZXkgaGF2ZSB0aGUgc2FtZSBpbnB1dHMgYW5kIHRoZSBzYW1lIHRyYW5zaXRp b24KICogZnVuY3Rpb24uICBBZ2dyZWZzIHRoYXQgc2hhcmUgdGhlIHNhbWUgdHJhbnNpdGlv biBpbmZvIGhhdmUgdGhlIHNhbWUKICogJ2FnZ3RyYW5zbm8nIHZhbHVlLgogKi8KdHlwZWRl ZiBzdHJ1Y3QgQWdnVHJhbnNJbmZvCnsKCXBnX25vZGVfYXR0cihub19jb3B5X2VxdWFsLCBu b19yZWFkLCBub19xdWVyeV9qdW1ibGUpCgoJTm9kZVRhZwkJdHlwZTsKCgkvKiBJbnB1dHMg Zm9yIHRoaXMgdHJhbnNpdGlvbiBzdGF0ZSAqLwoJTGlzdAkgICAqYXJnczsKCUV4cHIJICAg KmFnZ2ZpbHRlcjsKCgkvKiBPaWQgb2YgdGhlIHN0YXRlIHRyYW5zaXRpb24gZnVuY3Rpb24g Ki8KCU9pZAkJCXRyYW5zZm5fb2lkOwoKCS8qIE9pZCBvZiB0aGUgc2VyaWFsaXphdGlvbiBm dW5jdGlvbiwgb3IgSW52YWxpZE9pZCBpZiBub25lICovCglPaWQJCQlzZXJpYWxmbl9vaWQ7 CgoJLyogT2lkIG9mIHRoZSBkZXNlcmlhbGl6YXRpb24gZnVuY3Rpb24sIG9yIEludmFsaWRP aWQgaWYgbm9uZSAqLwoJT2lkCQkJZGVzZXJpYWxmbl9vaWQ7CgoJLyogT2lkIG9mIHRoZSBj b21iaW5lIGZ1bmN0aW9uLCBvciBJbnZhbGlkT2lkIGlmIG5vbmUgKi8KCU9pZAkJCWNvbWJp bmVmbl9vaWQ7CgoJLyogT2lkIG9mIHN0YXRlIHZhbHVlJ3MgZGF0YXR5cGUgKi8KCU9pZAkJ CWFnZ3RyYW5zdHlwZTsKCgkvKiBBZGRpdGlvbmFsIGRhdGEgYWJvdXQgdHJhbnN0eXBlICov CglpbnQzMgkJYWdndHJhbnN0eXBtb2Q7CglpbnQJCQl0cmFuc3R5cGVMZW47Cglib29sCQl0 cmFuc3R5cGVCeVZhbDsKCgkvKiBTcGFjZS1jb25zdW1wdGlvbiBlc3RpbWF0ZSAqLwoJaW50 MzIJCWFnZ3RyYW5zc3BhY2U7CgoJLyogSW5pdGlhbCB2YWx1ZSBmcm9tIHBnX2FnZ3JlZ2F0 ZSBlbnRyeSAqLwoJRGF0dW0JCWluaXRWYWx1ZSBwZ19ub2RlX2F0dHIocmVhZF93cml0ZV9p Z25vcmUpOwoJYm9vbAkJaW5pdFZhbHVlSXNOdWxsOwp9IEFnZ1RyYW5zSW5mbzsKCi8qCiAq IFVuaXF1ZVJlbEluZm8gY2FjaGVzIGEgZmFjdCB0aGF0IGEgcmVsYXRpb24gaXMgdW5pcXVl IHdoZW4gYmVpbmcgam9pbmVkCiAqIHRvIG90aGVyIHJlbGF0aW9uKHMpLgogKi8KdHlwZWRl ZiBzdHJ1Y3QgVW5pcXVlUmVsSW5mbwp7CglwZ19ub2RlX2F0dHIobm9fY29weV9lcXVhbCwg bm9fcmVhZCwgbm9fcXVlcnlfanVtYmxlKQoKCU5vZGVUYWcJCXR5cGU7CgoJLyoKCSAqIFRo ZSByZWxhdGlvbiBpbiBjb25zaWRlcmF0aW9uIGlzIHVuaXF1ZSB3aGVuIGJlaW5nIGpvaW5l ZCB3aXRoIHRoaXMgc2V0CgkgKiBvZiBvdGhlciByZWxhdGlvbihzKS4KCSAqLwoJUmVsaWRz CQlvdXRlcnJlbGlkczsKCgkvKgoJICogVGhlIHJlbGF0aW9uIGluIGNvbnNpZGVyYXRpb24g aXMgdW5pcXVlIHdoZW4gY29uc2lkZXJpbmcgb25seSBjbGF1c2VzCgkgKiBzdWl0YWJsZSBm b3Igc2VsZi1qb2luIChwYXNzZWQgc3BsaXRfc2VsZmpvaW5fcXVhbHMoKSkuCgkgKi8KCWJv b2wJCXNlbGZfam9pbjsKCgkvKgoJICogQWRkaXRpb25hbCBjbGF1c2VzIGZyb20gYSBiYXNl cmVzdHJpY3RpbmZvIGxpc3QgdGhhdCB3ZXJlIHVzZWQgdG8gcHJvdmUKCSAqIHRoZSB1bmlx dWVuZXNzLiAgIFdlIGNhY2hlIGl0IGZvciB0aGUgc2VsZi1qb2luIGNoZWNraW5nIHByb2Nl ZHVyZTogYQoJICogc2VsZi1qb2luIGNhbiBiZSByZW1vdmVkIGlmIHRoZSBvdXRlciByZWxh dGlvbiBjb250YWlucyBzdHJpY3RseSB0aGUKCSAqIHNhbWUgc2V0IG9mIGNsYXVzZXMuCgkg Ki8KCUxpc3QJICAgKmV4dHJhX2NsYXVzZXM7Cn0gVW5pcXVlUmVsSW5mbzsKCiNlbmRpZgkJ CQkJCQkvKiBQQVRITk9ERVNfSCAqLwoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAuL3BsYW5jYXQuYwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAMDAwMDY2NAAwMDAxNzUwADAwMDE3NTAAMDAwMDAyNTUxMzIAMTUyMjE1MDU2MTMA MDExNTAzACAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AHVzdGFyICAAeG1hbgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB4bWFuAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC8qLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLQogKgogKiBwbGFuY2F0LmMKICoJICAgcm91dGluZXMgZm9yIGFjY2Vzc2luZyB0 aGUgc3lzdGVtIGNhdGFsb2dzCiAqCiAqCiAqIFBvcnRpb25zIENvcHlyaWdodCAoYykgMTk5 Ni0yMDI2LCBQb3N0Z3JlU1FMIEdsb2JhbCBEZXZlbG9wbWVudCBHcm91cAogKiBQb3J0aW9u cyBDb3B5cmlnaHQgKGMpIDE5OTQsIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2Fs aWZvcm5pYQogKgogKgogKiBJREVOVElGSUNBVElPTgogKgkgIHNyYy9iYWNrZW5kL29wdGlt aXplci91dGlsL3BsYW5jYXQuYwogKgogKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICovCiNpbmNs dWRlICJwb3N0Z3Jlcy5oIgoKI2luY2x1ZGUgPG1hdGguaD4KCiNpbmNsdWRlICJhY2Nlc3Mv Z2VuYW0uaCIKI2luY2x1ZGUgImFjY2Vzcy9odHVwX2RldGFpbHMuaCIKI2luY2x1ZGUgImFj Y2Vzcy9uYnRyZWUuaCIKI2luY2x1ZGUgImFjY2Vzcy9zeXNhdHRyLmgiCiNpbmNsdWRlICJh Y2Nlc3MvdGFibGUuaCIKI2luY2x1ZGUgImFjY2Vzcy90YWJsZWFtLmgiCiNpbmNsdWRlICJh Y2Nlc3MvdHJhbnNhbS5oIgojaW5jbHVkZSAiYWNjZXNzL3hsb2cuaCIKI2luY2x1ZGUgImNh dGFsb2cvY2F0YWxvZy5oIgojaW5jbHVkZSAiY2F0YWxvZy9oZWFwLmgiCiNpbmNsdWRlICJj YXRhbG9nL3BnX2FtLmgiCiNpbmNsdWRlICJjYXRhbG9nL3BnX3Byb2MuaCIKI2luY2x1ZGUg ImNhdGFsb2cvcGdfc3RhdGlzdGljX2V4dC5oIgojaW5jbHVkZSAiY2F0YWxvZy9wZ19zdGF0 aXN0aWNfZXh0X2RhdGEuaCIKI2luY2x1ZGUgImZvcmVpZ24vZmR3YXBpLmgiCiNpbmNsdWRl ICJtaXNjYWRtaW4uaCIKI2luY2x1ZGUgIm5vZGVzL21ha2VmdW5jcy5oIgojaW5jbHVkZSAi bm9kZXMvbm9kZUZ1bmNzLmgiCiNpbmNsdWRlICJub2Rlcy9zdXBwb3J0bm9kZXMuaCIKI2lu Y2x1ZGUgIm9wdGltaXplci9jb3N0LmgiCiNpbmNsdWRlICJvcHRpbWl6ZXIvb3B0aW1pemVy LmgiCiNpbmNsdWRlICJvcHRpbWl6ZXIvcGxhbmNhdC5oIgojaW5jbHVkZSAicGFyc2VyL3Bh cnNlX3JlbGF0aW9uLmgiCiNpbmNsdWRlICJwYXJzZXIvcGFyc2V0cmVlLmgiCiNpbmNsdWRl ICJwYXJ0aXRpb25pbmcvcGFydGRlc2MuaCIKI2luY2x1ZGUgInJld3JpdGUvcmV3cml0ZUhh bmRsZXIuaCIKI2luY2x1ZGUgInJld3JpdGUvcmV3cml0ZU1hbmlwLmgiCiNpbmNsdWRlICJz dGF0aXN0aWNzL3N0YXRpc3RpY3MuaCIKI2luY2x1ZGUgInN0b3JhZ2UvYnVmbWdyLmgiCiNp bmNsdWRlICJ0Y29wL3Rjb3Bwcm90LmgiCiNpbmNsdWRlICJ1dGlscy9idWlsdGlucy5oIgoj aW5jbHVkZSAidXRpbHMvbHN5c2NhY2hlLmgiCiNpbmNsdWRlICJ1dGlscy9wYXJ0Y2FjaGUu aCIKI2luY2x1ZGUgInV0aWxzL3JlbC5oIgojaW5jbHVkZSAidXRpbHMvc25hcG1nci5oIgoj aW5jbHVkZSAidXRpbHMvc3lzY2FjaGUuaCIKCi8qIEdVQyBwYXJhbWV0ZXIgKi8KaW50CQkJ Y29uc3RyYWludF9leGNsdXNpb24gPSBDT05TVFJBSU5UX0VYQ0xVU0lPTl9QQVJUSVRJT047 Cgp0eXBlZGVmIHN0cnVjdCBOb3RudWxsSGFzaEVudHJ5CnsKCU9pZAkJCXJlbGlkOwkJCS8q IE9JRCBvZiB0aGUgcmVsYXRpb24gKi8KCUJpdG1hcHNldCAgKm5vdG51bGxhdHRudW1zOyAv KiBhdHRudW1zIG9mIE5PVCBOVUxMIGNvbHVtbnMgKi8KfSBOb3RudWxsSGFzaEVudHJ5OwoK CnN0YXRpYyB2b2lkIGdldF9yZWxhdGlvbl9mb3JlaWduX2tleXMoUGxhbm5lckluZm8gKnJv b3QsIFJlbE9wdEluZm8gKnJlbCwKCQkJCQkJCQkJICBSZWxhdGlvbiByZWxhdGlvbiwgYm9v bCBpbmhwYXJlbnQpOwpzdGF0aWMgYm9vbCBpbmZlcl9jb2xsYXRpb25fb3BjbGFzc19tYXRj aChJbmZlcmVuY2VFbGVtICplbGVtLCBSZWxhdGlvbiBpZHhSZWwsCgkJCQkJCQkJCQkgIExp c3QgKmlkeEV4cHJzKTsKc3RhdGljIExpc3QgKmdldF9yZWxhdGlvbl9jb25zdHJhaW50cyhQ bGFubmVySW5mbyAqcm9vdCwKCQkJCQkJCQkJICBPaWQgcmVsYXRpb25PYmplY3RJZCwgUmVs T3B0SW5mbyAqcmVsLAoJCQkJCQkJCQkgIGJvb2wgaW5jbHVkZV9ub2luaGVyaXQsCgkJCQkJ CQkJCSAgYm9vbCBpbmNsdWRlX25vdG51bGwsCgkJCQkJCQkJCSAgYm9vbCBpbmNsdWRlX3Bh cnRpdGlvbik7CnN0YXRpYyBMaXN0ICpidWlsZF9pbmRleF90bGlzdChQbGFubmVySW5mbyAq cm9vdCwgSW5kZXhPcHRJbmZvICppbmRleCwKCQkJCQkJCSAgIFJlbGF0aW9uIGhlYXBSZWxh dGlvbik7CnN0YXRpYyBMaXN0ICpnZXRfcmVsYXRpb25fc3RhdGlzdGljcyhQbGFubmVySW5m byAqcm9vdCwgUmVsT3B0SW5mbyAqcmVsLAoJCQkJCQkJCQkgUmVsYXRpb24gcmVsYXRpb24p OwpzdGF0aWMgdm9pZCBzZXRfcmVsYXRpb25fcGFydGl0aW9uX2luZm8oUGxhbm5lckluZm8g KnJvb3QsIFJlbE9wdEluZm8gKnJlbCwKCQkJCQkJCQkJCVJlbGF0aW9uIHJlbGF0aW9uKTsK c3RhdGljIFBhcnRpdGlvblNjaGVtZSBmaW5kX3BhcnRpdGlvbl9zY2hlbWUoUGxhbm5lcklu Zm8gKnJvb3QsCgkJCQkJCQkJCQkJIFJlbGF0aW9uIHJlbGF0aW9uKTsKc3RhdGljIHZvaWQg c2V0X2Jhc2VyZWxfcGFydGl0aW9uX2tleV9leHBycyhSZWxhdGlvbiByZWxhdGlvbiwKCQkJ CQkJCQkJCQlSZWxPcHRJbmZvICpyZWwpOwpzdGF0aWMgdm9pZCBzZXRfYmFzZXJlbF9wYXJ0 aXRpb25fY29uc3RyYWludChSZWxhdGlvbiByZWxhdGlvbiwKCQkJCQkJCQkJCQkgUmVsT3B0 SW5mbyAqcmVsKTsKCgovKgogKiBnZXRfcmVsYXRpb25faW5mbyAtCiAqCSAgUmV0cmlldmVz IGNhdGFsb2cgaW5mb3JtYXRpb24gZm9yIGEgZ2l2ZW4gcmVsYXRpb24uCiAqCiAqIEdpdmVu IHRoZSBPaWQgb2YgdGhlIHJlbGF0aW9uLCByZXR1cm4gdGhlIGZvbGxvd2luZyBpbmZvIGlu dG8gZmllbGRzCiAqIG9mIHRoZSBSZWxPcHRJbmZvIHN0cnVjdDoKICoKICoJbWluX2F0dHIJ bG93ZXN0IHZhbGlkIEF0dHJOdW1iZXIKICoJbWF4X2F0dHIJaGlnaGVzdCB2YWxpZCBBdHRy TnVtYmVyCiAqCWluZGV4bGlzdAlsaXN0IG9mIEluZGV4T3B0SW5mb3MgZm9yIHJlbGF0aW9u J3MgaW5kZXhlcwogKglzdGF0bGlzdAlsaXN0IG9mIFN0YXRpc3RpY0V4dEluZm8gZm9yIHJl bGF0aW9uJ3Mgc3RhdGlzdGljIG9iamVjdHMKICoJc2VydmVyaWQJaWYgaXQncyBhIGZvcmVp Z24gdGFibGUsIHRoZSBzZXJ2ZXIgT0lECiAqCWZkd3JvdXRpbmUJaWYgaXQncyBhIGZvcmVp Z24gdGFibGUsIHRoZSBGRFcgZnVuY3Rpb24gcG9pbnRlcnMKICoJcGFnZXMJCW51bWJlciBv ZiBwYWdlcwogKgl0dXBsZXMJCW51bWJlciBvZiB0dXBsZXMKICoJcmVsX3BhcmFsbGVsX3dv cmtlcnMgdXNlci1kZWZpbmVkIG51bWJlciBvZiBwYXJhbGxlbCB3b3JrZXJzCiAqCiAqIEFs c28sIGFkZCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgcmVsYXRpb24ncyBmb3JlaWduIGtleXMg dG8gcm9vdC0+ZmtleV9saXN0LgogKgogKiBBbHNvLCBpbml0aWFsaXplIHRoZSBhdHRyX25l ZWRlZFtdIGFuZCBhdHRyX3dpZHRoc1tdIGFycmF5cy4gIEluIG1vc3QKICogY2FzZXMgdGhl c2UgYXJlIGxlZnQgYXMgemVyb2VzLCBidXQgc29tZXRpbWVzIHdlIG5lZWQgdG8gY29tcHV0 ZSBhdHRyCiAqIHdpZHRocyBoZXJlLCBhbmQgd2UgbWF5IGFzIHdlbGwgY2FjaGUgdGhlIHJl c3VsdHMgZm9yIGNvc3RzaXplLmMuCiAqCiAqIElmIGluaHBhcmVudCBpcyB0cnVlLCBhbGwg d2UgbmVlZCB0byBkbyBpcyBzZXQgdXAgdGhlIGF0dHIgYXJyYXlzOgogKiB0aGUgUmVsT3B0 SW5mbyBhY3R1YWxseSByZXByZXNlbnRzIHRoZSBhcHBlbmRyZWwgZm9ybWVkIGJ5IGFuIGlu aGVyaXRhbmNlCiAqIHRyZWUsIGFuZCBzbyB0aGUgcGFyZW50IHJlbCdzIHBoeXNpY2FsIHNp emUgYW5kIGluZGV4IGluZm9ybWF0aW9uIGlzbid0CiAqIGltcG9ydGFudCBmb3IgaXQsIGhv d2V2ZXIsIGZvciBwYXJ0aXRpb25lZCB0YWJsZXMsIHdlIGRvIHBvcHVsYXRlIHRoZQogKiBp bmRleGxpc3QgYXMgdGhlIHBsYW5uZXIgdXNlcyB1bmlxdWUgaW5kZXhlcyBhcyB1bmlxdWUg cHJvb2ZzIGZvciBjZXJ0YWluCiAqIG9wdGltaXphdGlvbnMuCiAqLwp2b2lkCmdldF9yZWxh dGlvbl9pbmZvKFBsYW5uZXJJbmZvICpyb290LCBPaWQgcmVsYXRpb25PYmplY3RJZCwgYm9v bCBpbmhwYXJlbnQsCgkJCQkgIFJlbE9wdEluZm8gKnJlbCkKewoJSW5kZXgJCXZhcm5vID0g cmVsLT5yZWxpZDsKCVJlbGF0aW9uCXJlbGF0aW9uOwoJYm9vbAkJaGFzaW5kZXg7CglMaXN0 CSAgICppbmRleGluZm9zID0gTklMOwoKCS8qCgkgKiBXZSBuZWVkIG5vdCBsb2NrIHRoZSBy ZWxhdGlvbiBzaW5jZSBpdCB3YXMgYWxyZWFkeSBsb2NrZWQsIGVpdGhlciBieQoJICogdGhl IHJld3JpdGVyIG9yIHdoZW4gZXhwYW5kX2luaGVyaXRlZF9ydGVudHJ5KCkgYWRkZWQgaXQg dG8gdGhlIHF1ZXJ5J3MKCSAqIHJhbmdldGFibGUuCgkgKi8KCXJlbGF0aW9uID0gdGFibGVf b3BlbihyZWxhdGlvbk9iamVjdElkLCBOb0xvY2spOwoKCS8qCgkgKiBSZWxhdGlvbnMgd2l0 aG91dCBhIHRhYmxlIEFNIGNhbiBiZSB1c2VkIGluIGEgcXVlcnkgb25seSBpZiB0aGV5IGFy ZSBvZgoJICogc3BlY2lhbC1jYXNlZCByZWxraW5kcy4gIFRoaXMgY2hlY2sgcHJldmVudHMg dXMgZnJvbSBjcmFzaGluZyBsYXRlciBpZiwKCSAqIGZvciBleGFtcGxlLCBhIHZpZXcncyBP TiBTRUxFQ1QgcnVsZSBoYXMgZ29uZSBtaXNzaW5nLiAgTm90ZSB0aGF0CgkgKiB0YWJsZV9v cGVuKCkgYWxyZWFkeSByZWplY3RlZCBpbmRleGVzIGFuZCBjb21wb3NpdGUgdHlwZXM7IHNw ZWxsIHRoZQoJICogZXJyb3IgdGhlIHNhbWUgd2F5IGl0IGRvZXMuCgkgKi8KCWlmICghcmVs YXRpb24tPnJkX3RhYmxlYW0pCgl7CgkJaWYgKCEocmVsYXRpb24tPnJkX3JlbC0+cmVsa2lu ZCA9PSBSRUxLSU5EX0ZPUkVJR05fVEFCTEUgfHwKCQkJICByZWxhdGlvbi0+cmRfcmVsLT5y ZWxraW5kID09IFJFTEtJTkRfUEFSVElUSU9ORURfVEFCTEUpKQoJCQllcmVwb3J0KEVSUk9S LAoJCQkJCShlcnJjb2RlKEVSUkNPREVfV1JPTkdfT0JKRUNUX1RZUEUpLAoJCQkJCSBlcnJt c2coImNhbm5vdCBvcGVuIHJlbGF0aW9uIFwiJXNcIiIsCgkJCQkJCQlSZWxhdGlvbkdldFJl bGF0aW9uTmFtZShyZWxhdGlvbikpLAoJCQkJCSBlcnJkZXRhaWxfcmVsa2luZF9ub3Rfc3Vw cG9ydGVkKHJlbGF0aW9uLT5yZF9yZWwtPnJlbGtpbmQpKSk7Cgl9CgoJLyogVGVtcG9yYXJ5 IGFuZCB1bmxvZ2dlZCByZWxhdGlvbnMgYXJlIGluYWNjZXNzaWJsZSBkdXJpbmcgcmVjb3Zl cnkuICovCglpZiAoIVJlbGF0aW9uSXNQZXJtYW5lbnQocmVsYXRpb24pICYmIFJlY292ZXJ5 SW5Qcm9ncmVzcygpKQoJCWVyZXBvcnQoRVJST1IsCgkJCQkoZXJyY29kZShFUlJDT0RFX0ZF QVRVUkVfTk9UX1NVUFBPUlRFRCksCgkJCQkgZXJybXNnKCJjYW5ub3QgYWNjZXNzIHRlbXBv cmFyeSBvciB1bmxvZ2dlZCByZWxhdGlvbnMgZHVyaW5nIHJlY292ZXJ5IikpKTsKCglyZWwt Pm1pbl9hdHRyID0gRmlyc3RMb3dJbnZhbGlkSGVhcEF0dHJpYnV0ZU51bWJlciArIDE7Cgly ZWwtPm1heF9hdHRyID0gUmVsYXRpb25HZXROdW1iZXJPZkF0dHJpYnV0ZXMocmVsYXRpb24p OwoJcmVsLT5yZWx0YWJsZXNwYWNlID0gUmVsYXRpb25HZXRGb3JtKHJlbGF0aW9uKS0+cmVs dGFibGVzcGFjZTsKCglBc3NlcnQocmVsLT5tYXhfYXR0ciA+PSByZWwtPm1pbl9hdHRyKTsK CXJlbC0+YXR0cl9uZWVkZWQgPSAoUmVsaWRzICopCgkJcGFsbG9jMCgocmVsLT5tYXhfYXR0 ciAtIHJlbC0+bWluX2F0dHIgKyAxKSAqIHNpemVvZihSZWxpZHMpKTsKCXJlbC0+YXR0cl93 aWR0aHMgPSAoaW50MzIgKikKCQlwYWxsb2MwKChyZWwtPm1heF9hdHRyIC0gcmVsLT5taW5f YXR0ciArIDEpICogc2l6ZW9mKGludDMyKSk7CgoJLyoKCSAqIFJlY29yZCB3aGljaCBjb2x1 bW5zIGFyZSBkZWZpbmVkIGFzIE5PVCBOVUxMLiAgV2UgbGVhdmUgdGhpcwoJICogdW5wb3B1 bGF0ZWQgZm9yIG5vbi1wYXJ0aXRpb25lZCBpbmhlcml0YW5jZSBwYXJlbnQgcmVsYXRpb25z IGFzIGl0J3MKCSAqIGFtYmlndW91cyBhcyB0byB3aGF0IGl0IG1lYW5zLiAgU29tZSBjaGls ZCB0YWJsZXMgbWF5IGhhdmUgYSBOT1QgTlVMTAoJICogY29uc3RyYWludCBmb3IgYSBjb2x1 bW4gd2hpbGUgb3RoZXJzIG1heSBub3QuICBXZSBjb3VsZCB3b3JrIGhhcmRlciBhbmQKCSAq IGJ1aWxkIGEgdW5pb25lZCBzZXQgb2YgYWxsIGNoaWxkIHJlbGF0aW9ucyBub3RudWxsYXR0 bnVtcywgYnV0IHRoZXJlJ3MKCSAqIGN1cnJlbnRseSBubyBuZWVkLiAgVGhlIFJlbE9wdElu Zm8gY29ycmVzcG9uZGluZyB0byB0aGUgIWluaAoJICogUmFuZ2VUYmxFbnRyeSBkb2VzIGdl dCBwb3B1bGF0ZWQuCgkgKi8KCWlmICghaW5ocGFyZW50IHx8IHJlbGF0aW9uLT5yZF9yZWwt PnJlbGtpbmQgPT0gUkVMS0lORF9QQVJUSVRJT05FRF9UQUJMRSkKCQlyZWwtPm5vdG51bGxh dHRudW1zID0gZmluZF9yZWxhdGlvbl9ub3RudWxsYXR0cyhyb290LCByZWxhdGlvbk9iamVj dElkKTsKCgkvKgoJICogRXN0aW1hdGUgcmVsYXRpb24gc2l6ZSAtLS0gdW5sZXNzIGl0J3Mg YW4gaW5oZXJpdGFuY2UgcGFyZW50LCBpbiB3aGljaAoJICogY2FzZSB0aGUgc2l6ZSB3ZSB3 YW50IGlzIG5vdCB0aGUgcmVsJ3Mgb3duIHNpemUgYnV0IHRoZSBzaXplIG9mIGl0cwoJICog aW5oZXJpdGFuY2UgdHJlZS4gIFRoYXQgd2lsbCBiZSBjb21wdXRlZCBpbiBzZXRfYXBwZW5k X3JlbF9zaXplKCkuCgkgKi8KCWlmICghaW5ocGFyZW50KQoJCWVzdGltYXRlX3JlbF9zaXpl KHJlbGF0aW9uLCByZWwtPmF0dHJfd2lkdGhzIC0gcmVsLT5taW5fYXR0ciwKCQkJCQkJICAm cmVsLT5wYWdlcywgJnJlbC0+dHVwbGVzLCAmcmVsLT5hbGx2aXNmcmFjKTsKCgkvKiBSZXRy aWV2ZSB0aGUgcGFyYWxsZWxfd29ya2VycyByZWxvcHRpb24sIG9yIC0xIGlmIG5vdCBzZXQu ICovCglyZWwtPnJlbF9wYXJhbGxlbF93b3JrZXJzID0gUmVsYXRpb25HZXRQYXJhbGxlbFdv cmtlcnMocmVsYXRpb24sIC0xKTsKCgkvKgoJICogTWFrZSBsaXN0IG9mIGluZGV4ZXMuICBJ Z25vcmUgaW5kZXhlcyBvbiBzeXN0ZW0gY2F0YWxvZ3MgaWYgdG9sZCB0by4KCSAqIERvbid0 IGJvdGhlciB3aXRoIGluZGV4ZXMgZnJvbSB0cmFkaXRpb25hbCBpbmhlcml0YW5jZSBwYXJl bnRzLiAgRm9yCgkgKiBwYXJ0aXRpb25lZCB0YWJsZXMsIHdlIG5lZWQgYSBsaXN0IG9mIGF0 IGxlYXN0IHVuaXF1ZSBpbmRleGVzIGFzIHRoZXNlCgkgKiBzZXJ2ZSBhcyB1bmlxdWUgcHJv b2ZzIGZvciBjZXJ0YWluIHBsYW5uZXIgb3B0aW1pemF0aW9ucy4gIEhvd2V2ZXIsCgkgKiBs ZXQncyBub3QgZGlzY3JpbWluYXRlIGhlcmUgYW5kIGp1c3QgcmVjb3JkIGFsbCBwYXJ0aXRp b25lZCBpbmRleGVzCgkgKiB3aGV0aGVyIHRoZXkncmUgdW5pcXVlIGluZGV4ZXMgb3Igbm90 LgoJICovCglpZiAoKGluaHBhcmVudCAmJiByZWxhdGlvbi0+cmRfcmVsLT5yZWxraW5kICE9 IFJFTEtJTkRfUEFSVElUSU9ORURfVEFCTEUpCgkJfHwgKElnbm9yZVN5c3RlbUluZGV4ZXMg JiYgSXNTeXN0ZW1SZWxhdGlvbihyZWxhdGlvbikpKQoJCWhhc2luZGV4ID0gZmFsc2U7Cgll bHNlCgkJaGFzaW5kZXggPSByZWxhdGlvbi0+cmRfcmVsLT5yZWxoYXNpbmRleDsKCglpZiAo aGFzaW5kZXgpCgl7CgkJTGlzdAkgICAqaW5kZXhvaWRsaXN0OwoJCUxPQ0tNT0RFCWxtb2Rl OwoJCUxpc3RDZWxsICAgKmw7CgoJCWluZGV4b2lkbGlzdCA9IFJlbGF0aW9uR2V0SW5kZXhM aXN0KHJlbGF0aW9uKTsKCgkJLyoKCQkgKiBGb3IgZWFjaCBpbmRleCwgd2UgZ2V0IHRoZSBz YW1lIHR5cGUgb2YgbG9jayB0aGF0IHRoZSBleGVjdXRvciB3aWxsCgkJICogbmVlZCwgYW5k IGRvIG5vdCByZWxlYXNlIGl0LiAgVGhpcyBzYXZlcyBhIGNvdXBsZSBvZiB0cmlwcyB0byB0 aGUKCQkgKiBzaGFyZWQgbG9jayBtYW5hZ2VyIHdoaWxlIG5vdCBjcmVhdGluZyBhbnkgcmVh bCBsb3NzIG9mCgkJICogY29uY3VycmVuY3ksIGJlY2F1c2Ugbm8gc2NoZW1hIGNoYW5nZXMg Y291bGQgYmUgaGFwcGVuaW5nIG9uIHRoZQoJCSAqIGluZGV4IHdoaWxlIHdlIGhvbGQgbG9j ayBvbiB0aGUgcGFyZW50IHJlbCwgYW5kIG5vIGxvY2sgdHlwZSB1c2VkCgkJICogZm9yIHF1 ZXJpZXMgYmxvY2tzIGFueSBvdGhlciBraW5kIG9mIGluZGV4IG9wZXJhdGlvbi4KCQkgKi8K CQlsbW9kZSA9IHJvb3QtPnNpbXBsZV9ydGVfYXJyYXlbdmFybm9dLT5yZWxsb2NrbW9kZTsK CgkJZm9yZWFjaChsLCBpbmRleG9pZGxpc3QpCgkJewoJCQlPaWQJCQlpbmRleG9pZCA9IGxm aXJzdF9vaWQobCk7CgkJCVJlbGF0aW9uCWluZGV4UmVsYXRpb247CgkJCUZvcm1fcGdfaW5k ZXggaW5kZXg7CgkJCWNvbnN0IEluZGV4QW1Sb3V0aW5lICphbXJvdXRpbmUgPSBOVUxMOwoJ CQlJbmRleE9wdEluZm8gKmluZm87CgkJCWludAkJCW5jb2x1bW5zLAoJCQkJCQlua2V5Y29s dW1uczsKCQkJaW50CQkJaTsKCgkJCS8qCgkJCSAqIEV4dHJhY3QgaW5mbyBmcm9tIHRoZSBy ZWxhdGlvbiBkZXNjcmlwdG9yIGZvciB0aGUgaW5kZXguCgkJCSAqLwoJCQlpbmRleFJlbGF0 aW9uID0gaW5kZXhfb3BlbihpbmRleG9pZCwgbG1vZGUpOwoJCQlpbmRleCA9IGluZGV4UmVs YXRpb24tPnJkX2luZGV4OwoKCQkJLyoKCQkJICogSWdub3JlIGludmFsaWQgaW5kZXhlcywg c2luY2UgdGhleSBjYW4ndCBzYWZlbHkgYmUgdXNlZCBmb3IKCQkJICogcXVlcmllcy4gIE5v dGUgdGhhdCB0aGlzIGlzIE9LIGJlY2F1c2UgdGhlIGRhdGEgc3RydWN0dXJlIHdlCgkJCSAq IGFyZSBjb25zdHJ1Y3RpbmcgaXMgb25seSB1c2VkIGJ5IHRoZSBwbGFubmVyIC0tLSB0aGUg ZXhlY3V0b3IKCQkJICogc3RpbGwgbmVlZHMgdG8gaW5zZXJ0IGludG8gImludmFsaWQiIGlu ZGV4ZXMsIGlmIHRoZXkncmUgbWFya2VkCgkJCSAqIGluZGlzcmVhZHkuCgkJCSAqLwoJCQlp ZiAoIWluZGV4LT5pbmRpc3ZhbGlkKQoJCQl7CgkJCQlpbmRleF9jbG9zZShpbmRleFJlbGF0 aW9uLCBOb0xvY2spOwoJCQkJY29udGludWU7CgkJCX0KCgkJCS8qCgkJCSAqIElmIHRoZSBp bmRleCBpcyB2YWxpZCwgYnV0IGNhbm5vdCB5ZXQgYmUgdXNlZCwgaWdub3JlIGl0OyBidXQK CQkJICogbWFyayB0aGUgcGxhbiB3ZSBhcmUgZ2VuZXJhdGluZyBhcyB0cmFuc2llbnQuIFNl ZQoJCQkgKiBzcmMvYmFja2VuZC9hY2Nlc3MvaGVhcC9SRUFETUUuSE9UIGZvciBkaXNjdXNz aW9uLgoJCQkgKi8KCQkJaWYgKGluZGV4LT5pbmRjaGVja3htaW4gJiYKCQkJCSFUcmFuc2Fj dGlvbklkUHJlY2VkZXMoSGVhcFR1cGxlSGVhZGVyR2V0WG1pbihpbmRleFJlbGF0aW9uLT5y ZF9pbmRleHR1cGxlLT50X2RhdGEpLAoJCQkJCQkJCQkgICBUcmFuc2FjdGlvblhtaW4pKQoJ CQl7CgkJCQlyb290LT5nbG9iLT50cmFuc2llbnRQbGFuID0gdHJ1ZTsKCQkJCWluZGV4X2Ns b3NlKGluZGV4UmVsYXRpb24sIE5vTG9jayk7CgkJCQljb250aW51ZTsKCQkJfQoKCQkJaW5m byA9IG1ha2VOb2RlKEluZGV4T3B0SW5mbyk7CgoJCQlpbmZvLT5pbmRleG9pZCA9IGluZGV4 LT5pbmRleHJlbGlkOwoJCQlpbmZvLT5yZWx0YWJsZXNwYWNlID0KCQkJCVJlbGF0aW9uR2V0 Rm9ybShpbmRleFJlbGF0aW9uKS0+cmVsdGFibGVzcGFjZTsKCQkJaW5mby0+cmVsID0gcmVs OwoJCQlpbmZvLT5uY29sdW1ucyA9IG5jb2x1bW5zID0gaW5kZXgtPmluZG5hdHRzOwoJCQlp bmZvLT5ua2V5Y29sdW1ucyA9IG5rZXljb2x1bW5zID0gaW5kZXgtPmluZG5rZXlhdHRzOwoK CQkJaW5mby0+aW5kZXhrZXlzID0gcGFsbG9jX2FycmF5KGludCwgbmNvbHVtbnMpOwoJCQlp bmZvLT5pbmRleGNvbGxhdGlvbnMgPSBwYWxsb2NfYXJyYXkoT2lkLCBua2V5Y29sdW1ucyk7 CgkJCWluZm8tPm9wZmFtaWx5ID0gcGFsbG9jX2FycmF5KE9pZCwgbmtleWNvbHVtbnMpOwoJ CQlpbmZvLT5vcGNpbnR5cGUgPSBwYWxsb2NfYXJyYXkoT2lkLCBua2V5Y29sdW1ucyk7CgkJ CWluZm8tPmNhbnJldHVybiA9IHBhbGxvY19hcnJheShib29sLCBuY29sdW1ucyk7CgoJCQlm b3IgKGkgPSAwOyBpIDwgbmNvbHVtbnM7IGkrKykKCQkJewoJCQkJaW5mby0+aW5kZXhrZXlz W2ldID0gaW5kZXgtPmluZGtleS52YWx1ZXNbaV07CgkJCQlpbmZvLT5jYW5yZXR1cm5baV0g PSBpbmRleF9jYW5fcmV0dXJuKGluZGV4UmVsYXRpb24sIGkgKyAxKTsKCQkJfQoKCQkJZm9y IChpID0gMDsgaSA8IG5rZXljb2x1bW5zOyBpKyspCgkJCXsKCQkJCWluZm8tPm9wZmFtaWx5 W2ldID0gaW5kZXhSZWxhdGlvbi0+cmRfb3BmYW1pbHlbaV07CgkJCQlpbmZvLT5vcGNpbnR5 cGVbaV0gPSBpbmRleFJlbGF0aW9uLT5yZF9vcGNpbnR5cGVbaV07CgkJCQlpbmZvLT5pbmRl eGNvbGxhdGlvbnNbaV0gPSBpbmRleFJlbGF0aW9uLT5yZF9pbmRjb2xsYXRpb25baV07CgkJ CX0KCgkJCWluZm8tPnJlbGFtID0gaW5kZXhSZWxhdGlvbi0+cmRfcmVsLT5yZWxhbTsKCgkJ CS8qCgkJCSAqIFdlIGRvbid0IGhhdmUgYW4gQU0gZm9yIHBhcnRpdGlvbmVkIGluZGV4ZXMs IHNvIHdlJ2xsIGp1c3QKCQkJICogTlVMTGlmeSB0aGUgQU0gcmVsYXRlZCBmaWVsZHMgZm9y IHRob3NlLgoJCQkgKi8KCQkJaWYgKGluZGV4UmVsYXRpb24tPnJkX3JlbC0+cmVsa2luZCAh PSBSRUxLSU5EX1BBUlRJVElPTkVEX0lOREVYKQoJCQl7CgkJCQkvKiBXZSBjb3B5IGp1c3Qg dGhlIGZpZWxkcyB3ZSBuZWVkLCBub3QgYWxsIG9mIHJkX2luZGFtICovCgkJCQlhbXJvdXRp bmUgPSBpbmRleFJlbGF0aW9uLT5yZF9pbmRhbTsKCQkJCWluZm8tPmFtY2Fub3JkZXJieW9w ID0gYW1yb3V0aW5lLT5hbWNhbm9yZGVyYnlvcDsKCQkJCWluZm8tPmFtb3B0aW9uYWxrZXkg PSBhbXJvdXRpbmUtPmFtb3B0aW9uYWxrZXk7CgkJCQlpbmZvLT5hbXNlYXJjaGFycmF5ID0g YW1yb3V0aW5lLT5hbXNlYXJjaGFycmF5OwoJCQkJaW5mby0+YW1zZWFyY2hudWxscyA9IGFt cm91dGluZS0+YW1zZWFyY2hudWxsczsKCQkJCWluZm8tPmFtY2FucGFyYWxsZWwgPSBhbXJv dXRpbmUtPmFtY2FucGFyYWxsZWw7CgkJCQlpbmZvLT5hbWhhc2dldHR1cGxlID0gKGFtcm91 dGluZS0+YW1nZXR0dXBsZSAhPSBOVUxMKTsKCQkJCWluZm8tPmFtaGFzZ2V0Yml0bWFwID0g YW1yb3V0aW5lLT5hbWdldGJpdG1hcCAhPSBOVUxMICYmCgkJCQkJcmVsYXRpb24tPnJkX3Rh YmxlYW0tPnNjYW5fYml0bWFwX25leHRfdHVwbGUgIT0gTlVMTDsKCQkJCWluZm8tPmFtY2Fu bWFya3BvcyA9IChhbXJvdXRpbmUtPmFtbWFya3BvcyAhPSBOVUxMICYmCgkJCQkJCQkJCSAg YW1yb3V0aW5lLT5hbXJlc3RycG9zICE9IE5VTEwpOwoJCQkJaW5mby0+YW1jb3N0ZXN0aW1h dGUgPSBhbXJvdXRpbmUtPmFtY29zdGVzdGltYXRlOwoJCQkJQXNzZXJ0KGluZm8tPmFtY29z dGVzdGltYXRlICE9IE5VTEwpOwoKCQkJCS8qIEZldGNoIGluZGV4IG9wY2xhc3Mgb3B0aW9u cyAqLwoJCQkJaW5mby0+b3BjbGFzc29wdGlvbnMgPSBSZWxhdGlvbkdldEluZGV4QXR0T3B0 aW9ucyhpbmRleFJlbGF0aW9uLCB0cnVlKTsKCgkJCQkvKgoJCQkJICogRmV0Y2ggdGhlIG9y ZGVyaW5nIGluZm9ybWF0aW9uIGZvciB0aGUgaW5kZXgsIGlmIGFueS4KCQkJCSAqLwoJCQkJ aWYgKGluZm8tPnJlbGFtID09IEJUUkVFX0FNX09JRCkKCQkJCXsKCQkJCQkvKgoJCQkJCSAq IElmIGl0J3MgYSBidHJlZSBpbmRleCwgd2UgY2FuIHVzZSBpdHMgb3BmYW1pbHkgT0lEcwoJ CQkJCSAqIGRpcmVjdGx5IGFzIHRoZSBzb3J0IG9yZGVyaW5nIG9wZmFtaWx5IE9JRHMuCgkJ CQkJICovCgkJCQkJQXNzZXJ0KGFtcm91dGluZS0+YW1jYW5vcmRlcik7CgoJCQkJCWluZm8t PnNvcnRvcGZhbWlseSA9IGluZm8tPm9wZmFtaWx5OwoJCQkJCWluZm8tPnJldmVyc2Vfc29y dCA9IHBhbGxvY19hcnJheShib29sLCBua2V5Y29sdW1ucyk7CgkJCQkJaW5mby0+bnVsbHNf Zmlyc3QgPSBwYWxsb2NfYXJyYXkoYm9vbCwgbmtleWNvbHVtbnMpOwoKCQkJCQlmb3IgKGkg PSAwOyBpIDwgbmtleWNvbHVtbnM7IGkrKykKCQkJCQl7CgkJCQkJCWludDE2CQlvcHQgPSBp bmRleFJlbGF0aW9uLT5yZF9pbmRvcHRpb25baV07CgoJCQkJCQlpbmZvLT5yZXZlcnNlX3Nv cnRbaV0gPSAob3B0ICYgSU5ET1BUSU9OX0RFU0MpICE9IDA7CgkJCQkJCWluZm8tPm51bGxz X2ZpcnN0W2ldID0gKG9wdCAmIElORE9QVElPTl9OVUxMU19GSVJTVCkgIT0gMDsKCQkJCQl9 CgkJCQl9CgkJCQllbHNlIGlmIChhbXJvdXRpbmUtPmFtY2Fub3JkZXIpCgkJCQl7CgkJCQkJ LyoKCQkJCQkgKiBPdGhlcndpc2UsIGlkZW50aWZ5IHRoZSBjb3JyZXNwb25kaW5nIGJ0cmVl IG9wZmFtaWxpZXMKCQkJCQkgKiBieSB0cnlpbmcgdG8gbWFwIHRoaXMgaW5kZXgncyAiPCIg b3BlcmF0b3JzIGludG8gYnRyZWUuCgkJCQkJICogU2luY2UgIjwiIHVuaXF1ZWx5IGRlZmlu ZXMgdGhlIGJlaGF2aW9yIG9mIGEgc29ydAoJCQkJCSAqIG9yZGVyLCB0aGlzIGlzIGEgc3Vm ZmljaWVudCB0ZXN0LgoJCQkJCSAqCgkJCQkJICogWFhYIFRoaXMgbWV0aG9kIGlzIHJhdGhl ciBzbG93IGFuZCBjb21wbGljYXRlZC4gIEl0J2QKCQkJCQkgKiBiZSBiZXR0ZXIgdG8gaGF2 ZSBhIHdheSB0byBleHBsaWNpdGx5IGRlY2xhcmUgdGhlCgkJCQkJICogY29ycmVzcG9uZGlu ZyBidHJlZSBvcGZhbWlseSBmb3IgZWFjaCBvcGZhbWlseSBvZiB0aGUKCQkJCQkgKiBvdGhl ciBpbmRleCB0eXBlLgoJCQkJCSAqLwoJCQkJCWluZm8tPnNvcnRvcGZhbWlseSA9IHBhbGxv Y19hcnJheShPaWQsIG5rZXljb2x1bW5zKTsKCQkJCQlpbmZvLT5yZXZlcnNlX3NvcnQgPSBw YWxsb2NfYXJyYXkoYm9vbCwgbmtleWNvbHVtbnMpOwoJCQkJCWluZm8tPm51bGxzX2ZpcnN0 ID0gcGFsbG9jX2FycmF5KGJvb2wsIG5rZXljb2x1bW5zKTsKCgkJCQkJZm9yIChpID0gMDsg aSA8IG5rZXljb2x1bW5zOyBpKyspCgkJCQkJewoJCQkJCQlpbnQxNgkJb3B0ID0gaW5kZXhS ZWxhdGlvbi0+cmRfaW5kb3B0aW9uW2ldOwoJCQkJCQlPaWQJCQlsdG9wcjsKCQkJCQkJT2lk CQkJb3BmYW1pbHk7CgkJCQkJCU9pZAkJCW9wY2ludHlwZTsKCQkJCQkJQ29tcGFyZVR5cGUg Y21wdHlwZTsKCgkJCQkJCWluZm8tPnJldmVyc2Vfc29ydFtpXSA9IChvcHQgJiBJTkRPUFRJ T05fREVTQykgIT0gMDsKCQkJCQkJaW5mby0+bnVsbHNfZmlyc3RbaV0gPSAob3B0ICYgSU5E T1BUSU9OX05VTExTX0ZJUlNUKSAhPSAwOwoKCQkJCQkJbHRvcHIgPSBnZXRfb3BmYW1pbHlf bWVtYmVyX2Zvcl9jbXB0eXBlKGluZm8tPm9wZmFtaWx5W2ldLAoJCQkJCQkJCQkJCQkJCQkJ aW5mby0+b3BjaW50eXBlW2ldLAoJCQkJCQkJCQkJCQkJCQkJaW5mby0+b3BjaW50eXBlW2ld LAoJCQkJCQkJCQkJCQkJCQkJQ09NUEFSRV9MVCk7CgkJCQkJCWlmIChPaWRJc1ZhbGlkKGx0 b3ByKSAmJgoJCQkJCQkJZ2V0X29yZGVyaW5nX29wX3Byb3BlcnRpZXMobHRvcHIsCgkJCQkJ CQkJCQkJCQkgICAmb3BmYW1pbHksCgkJCQkJCQkJCQkJCQkgICAmb3BjaW50eXBlLAoJCQkJ CQkJCQkJCQkJICAgJmNtcHR5cGUpICYmCgkJCQkJCQlvcGNpbnR5cGUgPT0gaW5mby0+b3Bj aW50eXBlW2ldICYmCgkJCQkJCQljbXB0eXBlID09IENPTVBBUkVfTFQpCgkJCQkJCXsKCQkJ CQkJCS8qIFN1Y2Nlc3NmdWwgbWFwcGluZyAqLwoJCQkJCQkJaW5mby0+c29ydG9wZmFtaWx5 W2ldID0gb3BmYW1pbHk7CgkJCQkJCX0KCQkJCQkJZWxzZQoJCQkJCQl7CgkJCQkJCQkvKiBG YWlsIC4uLiBxdWlldGx5IHRyZWF0IGluZGV4IGFzIHVub3JkZXJlZCAqLwoJCQkJCQkJaW5m by0+c29ydG9wZmFtaWx5ID0gTlVMTDsKCQkJCQkJCWluZm8tPnJldmVyc2Vfc29ydCA9IE5V TEw7CgkJCQkJCQlpbmZvLT5udWxsc19maXJzdCA9IE5VTEw7CgkJCQkJCQlicmVhazsKCQkJ CQkJfQoJCQkJCX0KCQkJCX0KCQkJCWVsc2UKCQkJCXsKCQkJCQlpbmZvLT5zb3J0b3BmYW1p bHkgPSBOVUxMOwoJCQkJCWluZm8tPnJldmVyc2Vfc29ydCA9IE5VTEw7CgkJCQkJaW5mby0+ bnVsbHNfZmlyc3QgPSBOVUxMOwoJCQkJfQoJCQl9CgkJCWVsc2UKCQkJewoJCQkJaW5mby0+ YW1jYW5vcmRlcmJ5b3AgPSBmYWxzZTsKCQkJCWluZm8tPmFtb3B0aW9uYWxrZXkgPSBmYWxz ZTsKCQkJCWluZm8tPmFtc2VhcmNoYXJyYXkgPSBmYWxzZTsKCQkJCWluZm8tPmFtc2VhcmNo bnVsbHMgPSBmYWxzZTsKCQkJCWluZm8tPmFtY2FucGFyYWxsZWwgPSBmYWxzZTsKCQkJCWlu Zm8tPmFtaGFzZ2V0dHVwbGUgPSBmYWxzZTsKCQkJCWluZm8tPmFtaGFzZ2V0Yml0bWFwID0g ZmFsc2U7CgkJCQlpbmZvLT5hbWNhbm1hcmtwb3MgPSBmYWxzZTsKCQkJCWluZm8tPmFtY29z dGVzdGltYXRlID0gTlVMTDsKCgkJCQlpbmZvLT5zb3J0b3BmYW1pbHkgPSBOVUxMOwoJCQkJ aW5mby0+cmV2ZXJzZV9zb3J0ID0gTlVMTDsKCQkJCWluZm8tPm51bGxzX2ZpcnN0ID0gTlVM TDsKCQkJfQoKCQkJLyoKCQkJICogRmV0Y2ggdGhlIGluZGV4IGV4cHJlc3Npb25zIGFuZCBw cmVkaWNhdGUsIGlmIGFueS4gIFdlIG11c3QKCQkJICogbW9kaWZ5IHRoZSBjb3BpZXMgd2Ug b2J0YWluIGZyb20gdGhlIHJlbGNhY2hlIHRvIGhhdmUgdGhlCgkJCSAqIGNvcnJlY3QgdmFy bm8gZm9yIHRoZSBwYXJlbnQgcmVsYXRpb24sIHNvIHRoYXQgdGhleSBtYXRjaCB1cAoJCQkg KiBjb3JyZWN0bHkgYWdhaW5zdCBxdWFsIGNsYXVzZXMuCgkJCSAqCgkJCSAqIEFmdGVyIGZp eGluZyB0aGUgdmFybm9zLCB3ZSBuZWVkIHRvIHJ1biB0aGUgaW5kZXggZXhwcmVzc2lvbnMK CQkJICogYW5kIHByZWRpY2F0ZSB0aHJvdWdoIGNvbnN0LXNpbXBsaWZpY2F0aW9uIGFnYWlu LCB1c2luZyBhIHZhbGlkCgkJCSAqICJyb290Ii4gIFRoaXMgZW5zdXJlcyB0aGF0IE51bGxU ZXN0IHF1YWxzIGZvciBWYXJzIGNhbiBiZQoJCQkgKiBwcm9wZXJseSByZWR1Y2VkLgoJCQkg Ki8KCQkJaW5mby0+aW5kZXhwcnMgPSBSZWxhdGlvbkdldEluZGV4RXhwcmVzc2lvbnMoaW5k ZXhSZWxhdGlvbik7CgkJCWluZm8tPmluZGV4cHJzRXhwYW5kID0gUmVsYXRpb25HZXRJbmRl eEV4cHJlc3Npb25zRXhwYW5kKGluZGV4UmVsYXRpb24pOwoJCQlpbmZvLT5pbmRwcmVkID0g UmVsYXRpb25HZXRJbmRleFByZWRpY2F0ZShpbmRleFJlbGF0aW9uKTsKCQkJaW5mby0+aW5k cHJlZEV4cGFuZCA9IFJlbGF0aW9uR2V0SW5kZXhQcmVkaWNhdGVFeHBhbmQoaW5kZXhSZWxh dGlvbik7CgkJCWlmIChpbmZvLT5pbmRleHBycykKCQkJewoJCQkJaWYgKHZhcm5vICE9IDEp CgkJCQl7CgkJCQkJQ2hhbmdlVmFyTm9kZXMoKE5vZGUgKikgaW5mby0+aW5kZXhwcnMsIDEs IHZhcm5vLCAwKTsKCQkJCQlDaGFuZ2VWYXJOb2RlcygoTm9kZSAqKSBpbmZvLT5pbmRleHBy c0V4cGFuZCwgMSwgdmFybm8sIDApOwoJCQkJfQoKCQkJCWluZm8tPmluZGV4cHJzID0gKExp c3QgKikKCQkJCQlldmFsX2NvbnN0X2V4cHJlc3Npb25zKHJvb3QsIChOb2RlICopIGluZm8t PmluZGV4cHJzKTsKCQkJCWluZm8tPmluZGV4cHJzRXhwYW5kID0gKExpc3QgKikKCQkJCQll dmFsX2NvbnN0X2V4cHJlc3Npb25zKHJvb3QsIChOb2RlICopIGluZm8tPmluZGV4cHJzRXhw YW5kKTsKCQkJfQoJCQlpZiAoaW5mby0+aW5kcHJlZCkKCQkJewoJCQkJaWYgKHZhcm5vICE9 IDEpCgkJCQl7CgkJCQkJQ2hhbmdlVmFyTm9kZXMoKE5vZGUgKikgaW5mby0+aW5kcHJlZCwg MSwgdmFybm8sIDApOwoJCQkJCUNoYW5nZVZhck5vZGVzKChOb2RlICopIGluZm8tPmluZHBy ZWRFeHBhbmQsIDEsIHZhcm5vLCAwKTsKCQkJCX0KCgkJCQlpbmZvLT5pbmRwcmVkID0gKExp c3QgKikKCQkJCQlldmFsX2NvbnN0X2V4cHJlc3Npb25zKHJvb3QsCgkJCQkJCQkJCQkgICAo Tm9kZSAqKSBtYWtlX2FuZHNfZXhwbGljaXQoaW5mby0+aW5kcHJlZCkpOwoJCQkJaW5mby0+ aW5kcHJlZEV4cGFuZCA9IChMaXN0ICopCgkJCQkJZXZhbF9jb25zdF9leHByZXNzaW9ucyhy b290LAoJCQkJCQkJCQkJICAgKE5vZGUgKikgbWFrZV9hbmRzX2V4cGxpY2l0KGluZm8tPmlu ZHByZWRFeHBhbmQpKTsKCQkJCWluZm8tPmluZHByZWQgPSBtYWtlX2FuZHNfaW1wbGljaXQo KEV4cHIgKikgaW5mby0+aW5kcHJlZCk7CgkJCQlpbmZvLT5pbmRwcmVkRXhwYW5kID0gbWFr ZV9hbmRzX2ltcGxpY2l0KChFeHByICopIGluZm8tPmluZHByZWRFeHBhbmQpOwoJCQl9CgoJ CQkvKiBCdWlsZCB0YXJnZXRsaXN0IHVzaW5nIHRoZSBjb21wbGV0ZWQgaW5kZXhwcnMgZGF0 YSAqLwoJCQlpbmZvLT5pbmRleHRsaXN0ID0gYnVpbGRfaW5kZXhfdGxpc3Qocm9vdCwgaW5m bywgcmVsYXRpb24pOwoKCQkJaW5mby0+aW5kcmVzdHJpY3RpbmZvID0gTklMOwkvKiBzZXQg bGF0ZXIsIGluIGluZHhwYXRoLmMgKi8KCQkJaW5mby0+cHJlZE9LID0gZmFsc2U7CS8qIHNl dCBsYXRlciwgaW4gaW5keHBhdGguYyAqLwoJCQlpbmZvLT51bmlxdWUgPSBpbmRleC0+aW5k aXN1bmlxdWU7CgkJCWluZm8tPm51bGxzbm90ZGlzdGluY3QgPSBpbmRleC0+aW5kbnVsbHNu b3RkaXN0aW5jdDsKCQkJaW5mby0+aW1tZWRpYXRlID0gaW5kZXgtPmluZGltbWVkaWF0ZTsK CQkJaW5mby0+aHlwb3RoZXRpY2FsID0gZmFsc2U7CgoJCQkvKgoJCQkgKiBFc3RpbWF0ZSB0 aGUgaW5kZXggc2l6ZS4gIElmIGl0J3Mgbm90IGEgcGFydGlhbCBpbmRleCwgd2UgbG9jawoJ CQkgKiB0aGUgbnVtYmVyLW9mLXR1cGxlcyBlc3RpbWF0ZSB0byBlcXVhbCB0aGUgcGFyZW50 IHRhYmxlOyBpZiBpdAoJCQkgKiBpcyBwYXJ0aWFsIHRoZW4gd2UgaGF2ZSB0byB1c2UgdGhl IHNhbWUgbWV0aG9kcyBhcyB3ZSB3b3VsZCBmb3IKCQkJICogYSB0YWJsZSwgZXhjZXB0IHdl IGNhbiBiZSBzdXJlIHRoYXQgdGhlIGluZGV4IGlzIG5vdCBsYXJnZXIKCQkJICogdGhhbiB0 aGUgdGFibGUuICBXZSBtdXN0IGlnbm9yZSBwYXJ0aXRpb25lZCBpbmRleGVzIGhlcmUgYXMK CQkJICogdGhlcmUgYXJlIG5vdCBwaHlzaWNhbCBpbmRleGVzLgoJCQkgKi8KCQkJaWYgKGlu ZGV4UmVsYXRpb24tPnJkX3JlbC0+cmVsa2luZCAhPSBSRUxLSU5EX1BBUlRJVElPTkVEX0lO REVYKQoJCQl7CgkJCQlpZiAoaW5mby0+aW5kcHJlZCA9PSBOSUwpCgkJCQl7CgkJCQkJaW5m by0+cGFnZXMgPSBSZWxhdGlvbkdldE51bWJlck9mQmxvY2tzKGluZGV4UmVsYXRpb24pOwoJ CQkJCWluZm8tPnR1cGxlcyA9IHJlbC0+dHVwbGVzOwoJCQkJfQoJCQkJZWxzZQoJCQkJewoJ CQkJCWRvdWJsZQkJYWxsdmlzZnJhYzsgLyogZHVtbXkgKi8KCgkJCQkJZXN0aW1hdGVfcmVs X3NpemUoaW5kZXhSZWxhdGlvbiwgTlVMTCwKCQkJCQkJCQkJICAmaW5mby0+cGFnZXMsICZp bmZvLT50dXBsZXMsICZhbGx2aXNmcmFjKTsKCQkJCQlpZiAoaW5mby0+dHVwbGVzID4gcmVs LT50dXBsZXMpCgkJCQkJCWluZm8tPnR1cGxlcyA9IHJlbC0+dHVwbGVzOwoJCQkJfQoKCQkJ CS8qCgkJCQkgKiBHZXQgdHJlZSBoZWlnaHQgd2hpbGUgd2UgaGF2ZSB0aGUgaW5kZXggb3Bl bgoJCQkJICovCgkJCQlpZiAoYW1yb3V0aW5lLT5hbWdldHRyZWVoZWlnaHQpCgkJCQl7CgkJ CQkJaW5mby0+dHJlZV9oZWlnaHQgPSBhbXJvdXRpbmUtPmFtZ2V0dHJlZWhlaWdodChpbmRl eFJlbGF0aW9uKTsKCQkJCX0KCQkJCWVsc2UKCQkJCXsKCQkJCQkvKiBGb3Igb3RoZXIgaW5k ZXggdHlwZXMsIGp1c3Qgc2V0IGl0IHRvICJ1bmtub3duIiBmb3Igbm93ICovCgkJCQkJaW5m by0+dHJlZV9oZWlnaHQgPSAtMTsKCQkJCX0KCQkJfQoJCQllbHNlCgkJCXsKCQkJCS8qIFpl cm8gdGhlc2Ugb3V0IGZvciBwYXJ0aXRpb25lZCBpbmRleGVzICovCgkJCQlpbmZvLT5wYWdl cyA9IDA7CgkJCQlpbmZvLT50dXBsZXMgPSAwLjA7CgkJCQlpbmZvLT50cmVlX2hlaWdodCA9 IC0xOwoJCQl9CgoJCQlpbmRleF9jbG9zZShpbmRleFJlbGF0aW9uLCBOb0xvY2spOwoKCQkJ LyoKCQkJICogV2UndmUgaGlzdG9yaWNhbGx5IHVzZWQgbGNvbnMoKSBoZXJlLiAgSXQnZCBt YWtlIG1vcmUgc2Vuc2UgdG8KCQkJICogdXNlIGxhcHBlbmQoKSwgYnV0IHRoYXQgY2F1c2Vz IHRoZSBwbGFubmVyIHRvIGNoYW5nZSBiZWhhdmlvcgoJCQkgKiBpbiBjYXNlcyB3aGVyZSB0 d28gaW5kZXhlcyBzZWVtIGVxdWFsbHkgYXR0cmFjdGl2ZS4gIEZvciBub3csCgkJCSAqIHN0 aWNrIHdpdGggbGNvbnMoKSAtLS0gZmV3IHRhYmxlcyBzaG91bGQgaGF2ZSBzbyBtYW55IGlu ZGV4ZXMKCQkJICogdGhhdCB0aGUgTyhOXjIpIGJlaGF2aW9yIG9mIGxjb25zKCkgaXMgcmVh bGx5IGEgcHJvYmxlbS4KCQkJICovCgkJCWluZGV4aW5mb3MgPSBsY29ucyhpbmZvLCBpbmRl eGluZm9zKTsKCQl9CgoJCWxpc3RfZnJlZShpbmRleG9pZGxpc3QpOwoJfQoKCXJlbC0+aW5k ZXhsaXN0ID0gaW5kZXhpbmZvczsKCglyZWwtPnN0YXRsaXN0ID0gZ2V0X3JlbGF0aW9uX3N0 YXRpc3RpY3Mocm9vdCwgcmVsLCByZWxhdGlvbik7CgoJLyogR3JhYiBmb3JlaWduLXRhYmxl IGluZm8gdXNpbmcgdGhlIHJlbGNhY2hlLCB3aGlsZSB3ZSBoYXZlIGl0ICovCglpZiAocmVs YXRpb24tPnJkX3JlbC0+cmVsa2luZCA9PSBSRUxLSU5EX0ZPUkVJR05fVEFCTEUpCgl7CgkJ LyogQ2hlY2sgaWYgdGhlIGFjY2VzcyB0byBmb3JlaWduIHRhYmxlcyBpcyByZXN0cmljdGVk ICovCgkJaWYgKHVubGlrZWx5KChyZXN0cmljdF9ub25zeXN0ZW1fcmVsYXRpb25fa2luZCAm IFJFU1RSSUNUX1JFTEtJTkRfRk9SRUlHTl9UQUJMRSkgIT0gMCkpCgkJewoJCQkvKiB0aGVy ZSBtdXN0IG5vdCBiZSBidWlsdC1pbiBmb3JlaWduIHRhYmxlcyAqLwoJCQlBc3NlcnQoUmVs YXRpb25HZXRSZWxpZChyZWxhdGlvbikgPj0gRmlyc3ROb3JtYWxPYmplY3RJZCk7CgoJCQll cmVwb3J0KEVSUk9SLAoJCQkJCShlcnJjb2RlKEVSUkNPREVfT0JKRUNUX05PVF9JTl9QUkVS RVFVSVNJVEVfU1RBVEUpLAoJCQkJCSBlcnJtc2coImFjY2VzcyB0byBub24tc3lzdGVtIGZv cmVpZ24gdGFibGUgaXMgcmVzdHJpY3RlZCIpKSk7CgkJfQoKCQlyZWwtPnNlcnZlcmlkID0g R2V0Rm9yZWlnblNlcnZlcklkQnlSZWxJZChSZWxhdGlvbkdldFJlbGlkKHJlbGF0aW9uKSk7 CgkJcmVsLT5mZHdyb3V0aW5lID0gR2V0RmR3Um91dGluZUZvclJlbGF0aW9uKHJlbGF0aW9u LCB0cnVlKTsKCX0KCWVsc2UKCXsKCQlyZWwtPnNlcnZlcmlkID0gSW52YWxpZE9pZDsKCQly ZWwtPmZkd3JvdXRpbmUgPSBOVUxMOwoJfQoKCS8qIENvbGxlY3QgaW5mbyBhYm91dCByZWxh dGlvbidzIGZvcmVpZ24ga2V5cywgaWYgcmVsZXZhbnQgKi8KCWdldF9yZWxhdGlvbl9mb3Jl aWduX2tleXMocm9vdCwgcmVsLCByZWxhdGlvbiwgaW5ocGFyZW50KTsKCgkvKiBDb2xsZWN0 IGluZm8gYWJvdXQgZnVuY3Rpb25zIGltcGxlbWVudGVkIGJ5IHRoZSByZWwncyB0YWJsZSBB TS4gKi8KCWlmIChyZWxhdGlvbi0+cmRfdGFibGVhbSAmJgoJCXJlbGF0aW9uLT5yZF90YWJs ZWFtLT5zY2FuX3NldF90aWRyYW5nZSAhPSBOVUxMICYmCgkJcmVsYXRpb24tPnJkX3RhYmxl YW0tPnNjYW5fZ2V0bmV4dHNsb3RfdGlkcmFuZ2UgIT0gTlVMTCkKCQlyZWwtPmFtZmxhZ3Mg fD0gQU1GTEFHX0hBU19USURfUkFOR0U7CgoJLyoKCSAqIENvbGxlY3QgaW5mbyBhYm91dCBy ZWxhdGlvbidzIHBhcnRpdGlvbmluZyBzY2hlbWUsIGlmIGFueS4gT25seQoJICogaW5oZXJp dGFuY2UgcGFyZW50cyBtYXkgYmUgcGFydGl0aW9uZWQuCgkgKi8KCWlmIChpbmhwYXJlbnQg JiYgcmVsYXRpb24tPnJkX3JlbC0+cmVsa2luZCA9PSBSRUxLSU5EX1BBUlRJVElPTkVEX1RB QkxFKQoJCXNldF9yZWxhdGlvbl9wYXJ0aXRpb25faW5mbyhyb290LCByZWwsIHJlbGF0aW9u KTsKCgl0YWJsZV9jbG9zZShyZWxhdGlvbiwgTm9Mb2NrKTsKfQoKLyoKICogZ2V0X3JlbGF0 aW9uX2ZvcmVpZ25fa2V5cyAtCiAqCSAgUmV0cmlldmVzIGZvcmVpZ24ga2V5IGluZm9ybWF0 aW9uIGZvciBhIGdpdmVuIHJlbGF0aW9uLgogKgogKiBGb3JlaWduS2V5T3B0SW5mb3MgZm9y IHJlbGV2YW50IGZvcmVpZ24ga2V5cyBhcmUgY3JlYXRlZCBhbmQgYWRkZWQgdG8KICogcm9v dC0+ZmtleV9saXN0LiAgV2UgZG8gdGhpcyBub3cgd2hpbGUgd2UgaGF2ZSB0aGUgcmVsY2Fj aGUgZW50cnkgb3Blbi4KICogV2UgY291bGQgc29tZXRpbWVzIGF2b2lkIG1ha2luZyB1c2Vs ZXNzIEZvcmVpZ25LZXlPcHRJbmZvcyBpZiB3ZSB3YWl0ZWQKICogdW50aWwgYWxsIFJlbE9w dEluZm9zIGhhdmUgYmVlbiBidWlsdCwgYnV0IHRoZSBjb3N0IG9mIHJlLW9wZW5pbmcgdGhl CiAqIHJlbGNhY2hlIGVudHJpZXMgd291bGQgcHJvYmFibHkgZXhjZWVkIGFueSBzYXZpbmdz LgogKi8Kc3RhdGljIHZvaWQKZ2V0X3JlbGF0aW9uX2ZvcmVpZ25fa2V5cyhQbGFubmVySW5m byAqcm9vdCwgUmVsT3B0SW5mbyAqcmVsLAoJCQkJCQkgIFJlbGF0aW9uIHJlbGF0aW9uLCBi b29sIGluaHBhcmVudCkKewoJTGlzdAkgICAqcnRhYmxlID0gcm9vdC0+cGFyc2UtPnJ0YWJs ZTsKCUxpc3QJICAgKmNhY2hlZGZrZXlzOwoJTGlzdENlbGwgICAqbGM7CgoJLyoKCSAqIElm IGl0J3Mgbm90IGEgYmFzZXJlbCwgd2UgZG9uJ3QgY2FyZSBhYm91dCBpdHMgRktzLiAgQWxz bywgaWYgdGhlIHF1ZXJ5CgkgKiByZWZlcmVuY2VzIG9ubHkgYSBzaW5nbGUgcmVsYXRpb24s IHdlIGNhbiBza2lwIHRoZSBsb29rdXAgc2luY2Ugbm8gRktzCgkgKiBjb3VsZCBzYXRpc2Z5 IHRoZSByZXF1aXJlbWVudHMgYmVsb3cuCgkgKi8KCWlmIChyZWwtPnJlbG9wdGtpbmQgIT0g UkVMT1BUX0JBU0VSRUwgfHwKCQlsaXN0X2xlbmd0aChydGFibGUpIDwgMikKCQlyZXR1cm47 CgoJLyoKCSAqIElmIGl0J3MgdGhlIHBhcmVudCBvZiBhbiBpbmhlcml0YW5jZSB0cmVlLCBp Z25vcmUgaXRzIEZLcy4gIFdlIGNvdWxkCgkgKiBtYWtlIHVzZWZ1bCBGSy1iYXNlZCBkZWR1 Y3Rpb25zIGlmIHdlIGZvdW5kIHRoYXQgYWxsIG1lbWJlcnMgb2YgdGhlCgkgKiBpbmhlcml0 YW5jZSB0cmVlIGhhdmUgZXF1aXZhbGVudCBGSyBjb25zdHJhaW50cywgYnV0IGRldGVjdGlu ZyB0aGF0CgkgKiB3b3VsZCByZXF1aXJlIGNvZGUgdGhhdCBoYXNuJ3QgYmVlbiB3cml0dGVu LgoJICovCglpZiAoaW5ocGFyZW50KQoJCXJldHVybjsKCgkvKgoJICogRXh0cmFjdCBkYXRh IGFib3V0IHJlbGF0aW9uJ3MgRktzIGZyb20gdGhlIHJlbGNhY2hlLiAgTm90ZSB0aGF0IHRo aXMKCSAqIGxpc3QgYmVsb25ncyB0byB0aGUgcmVsY2FjaGUgYW5kIG1pZ2h0IGRpc2FwcGVh ciBpbiBhIGNhY2hlIGZsdXNoLCBzbwoJICogd2UgbXVzdCBub3QgZG8gYW55IGZ1cnRoZXIg Y2F0YWxvZyBhY2Nlc3Mgd2l0aGluIHRoaXMgZnVuY3Rpb24uCgkgKi8KCWNhY2hlZGZrZXlz ID0gUmVsYXRpb25HZXRGS2V5TGlzdChyZWxhdGlvbik7CgoJLyoKCSAqIEZpZ3VyZSBvdXQg d2hpY2ggRktzIGFyZSBvZiBpbnRlcmVzdCBmb3IgdGhpcyBxdWVyeSwgYW5kIGNyZWF0ZQoJ ICogRm9yZWlnbktleU9wdEluZm9zIGZvciB0aGVtLiAgV2Ugd2FudCBvbmx5IEZLcyB0aGF0 IHJlZmVyZW5jZSBzb21lCgkgKiBvdGhlciBSVEUgb2YgdGhlIGN1cnJlbnQgcXVlcnkuICBJ biBxdWVyaWVzIGNvbnRhaW5pbmcgc2VsZi1qb2lucywKCSAqIHRoZXJlIG1pZ2h0IGJlIG1v cmUgdGhhbiBvbmUgb3RoZXIgUlRFIGZvciBhIHJlZmVyZW5jZWQgdGFibGUsIGFuZCB3ZQoJ ICogc2hvdWxkIG1ha2UgYSBGb3JlaWduS2V5T3B0SW5mbyBmb3IgZWFjaCBvY2N1cnJlbmNl LgoJICoKCSAqIElkZWFsbHksIHdlIHdvdWxkIGlnbm9yZSBSVEVzIHRoYXQgY29ycmVzcG9u ZCB0byBub24tYmFzZXJlbHMsIGJ1dCBpdCdzCgkgKiB0b28gaGFyZCB0byBpZGVudGlmeSB0 aG9zZSBoZXJlLCBzbyB3ZSBtaWdodCBlbmQgdXAgbWFraW5nIHNvbWUgdXNlbGVzcwoJICog Rm9yZWlnbktleU9wdEluZm9zLiAgSWYgc28sIG1hdGNoX2ZvcmVpZ25fa2V5c190b19xdWFs cygpIHdpbGwgcmVtb3ZlCgkgKiB0aGVtIGFnYWluLgoJICovCglmb3JlYWNoKGxjLCBjYWNo ZWRma2V5cykKCXsKCQlGb3JlaWduS2V5Q2FjaGVJbmZvICpjYWNoZWRmayA9IChGb3JlaWdu S2V5Q2FjaGVJbmZvICopIGxmaXJzdChsYyk7CgkJSW5kZXgJCXJ0aTsKCQlMaXN0Q2VsbCAg ICpsYzI7CgoJCS8qIGNvbnJlbGlkIHNob3VsZCBhbHdheXMgYmUgdGhhdCBvZiB0aGUgdGFi bGUgd2UncmUgY29uc2lkZXJpbmcgKi8KCQlBc3NlcnQoY2FjaGVkZmstPmNvbnJlbGlkID09 IFJlbGF0aW9uR2V0UmVsaWQocmVsYXRpb24pKTsKCgkJLyogc2tpcCBjb25zdHJhaW50cyBj dXJyZW50bHkgbm90IGVuZm9yY2VkICovCgkJaWYgKCFjYWNoZWRmay0+Y29uZW5mb3JjZWQp CgkJCWNvbnRpbnVlOwoKCQkvKiBTY2FuIHRvIGZpbmQgb3RoZXIgUlRFcyBtYXRjaGluZyBj b25mcmVsaWQgKi8KCQlydGkgPSAwOwoJCWZvcmVhY2gobGMyLCBydGFibGUpCgkJewoJCQlS YW5nZVRibEVudHJ5ICpydGUgPSAoUmFuZ2VUYmxFbnRyeSAqKSBsZmlyc3QobGMyKTsKCQkJ Rm9yZWlnbktleU9wdEluZm8gKmluZm87CgoJCQlydGkrKzsKCQkJLyogSWdub3JlIGlmIG5v dCB0aGUgY29ycmVjdCB0YWJsZSAqLwoJCQlpZiAocnRlLT5ydGVraW5kICE9IFJURV9SRUxB VElPTiB8fAoJCQkJcnRlLT5yZWxpZCAhPSBjYWNoZWRmay0+Y29uZnJlbGlkKQoJCQkJY29u dGludWU7CgkJCS8qIElnbm9yZSBpZiBpdCdzIGFuIGluaGVyaXRhbmNlIHBhcmVudDsgZG9l c24ndCByZWFsbHkgbWF0Y2ggKi8KCQkJaWYgKHJ0ZS0+aW5oKQoJCQkJY29udGludWU7CgkJ CS8qIElnbm9yZSBzZWxmLXJlZmVyZW50aWFsIEZLczsgd2Ugb25seSBjYXJlIGFib3V0IGpv aW5zICovCgkJCWlmIChydGkgPT0gcmVsLT5yZWxpZCkKCQkJCWNvbnRpbnVlOwoKCQkJLyog T0ssIGxldCdzIG1ha2UgYW4gZW50cnkgKi8KCQkJaW5mbyA9IG1ha2VOb2RlKEZvcmVpZ25L ZXlPcHRJbmZvKTsKCQkJaW5mby0+Y29uX3JlbGlkID0gcmVsLT5yZWxpZDsKCQkJaW5mby0+ cmVmX3JlbGlkID0gcnRpOwoJCQlpbmZvLT5ua2V5cyA9IGNhY2hlZGZrLT5ua2V5czsKCQkJ bWVtY3B5KGluZm8tPmNvbmtleSwgY2FjaGVkZmstPmNvbmtleSwgc2l6ZW9mKGluZm8tPmNv bmtleSkpOwoJCQltZW1jcHkoaW5mby0+Y29uZmtleSwgY2FjaGVkZmstPmNvbmZrZXksIHNp emVvZihpbmZvLT5jb25ma2V5KSk7CgkJCW1lbWNweShpbmZvLT5jb25wZmVxb3AsIGNhY2hl ZGZrLT5jb25wZmVxb3AsIHNpemVvZihpbmZvLT5jb25wZmVxb3ApKTsKCQkJLyogemVybyBv dXQgZmllbGRzIHRvIGJlIGZpbGxlZCBieSBtYXRjaF9mb3JlaWduX2tleXNfdG9fcXVhbHMg Ki8KCQkJaW5mby0+bm1hdGNoZWRfZWMgPSAwOwoJCQlpbmZvLT5uY29uc3RfZWMgPSAwOwoJ CQlpbmZvLT5ubWF0Y2hlZF9yY29scyA9IDA7CgkJCWluZm8tPm5tYXRjaGVkX3JpID0gMDsK CQkJbWVtc2V0KGluZm8tPmVjbGFzcywgMCwgc2l6ZW9mKGluZm8tPmVjbGFzcykpOwoJCQlt ZW1zZXQoaW5mby0+ZmtfZWNsYXNzX21lbWJlciwgMCwgc2l6ZW9mKGluZm8tPmZrX2VjbGFz c19tZW1iZXIpKTsKCQkJbWVtc2V0KGluZm8tPnJpbmZvcywgMCwgc2l6ZW9mKGluZm8tPnJp bmZvcykpOwoKCQkJcm9vdC0+ZmtleV9saXN0ID0gbGFwcGVuZChyb290LT5ma2V5X2xpc3Qs IGluZm8pOwoJCX0KCX0KfQoKLyoKICogZ2V0X3JlbGF0aW9uX25vdG51bGxhdHRzIC0KICoJ ICBSZXRyaWV2ZXMgY29sdW1uIG5vdC1udWxsIGNvbnN0cmFpbnQgaW5mb3JtYXRpb24gZm9y IGEgZ2l2ZW4gcmVsYXRpb24uCiAqCiAqIFdlIGRvIHRoaXMgd2hpbGUgd2UgaGF2ZSB0aGUg cmVsY2FjaGUgZW50cnkgb3BlbiwgYW5kIHN0b3JlIHRoZSBjb2x1bW4KICogbm90LW51bGwg Y29uc3RyYWludCBpbmZvcm1hdGlvbiBpbiBhIGhhc2ggdGFibGUgYmFzZWQgb24gdGhlIHJl bGF0aW9uIE9JRC4KICovCnZvaWQKZ2V0X3JlbGF0aW9uX25vdG51bGxhdHRzKFBsYW5uZXJJ bmZvICpyb290LCBSZWxhdGlvbiByZWxhdGlvbikKewoJT2lkCQkJcmVsaWQgPSBSZWxhdGlv bkdldFJlbGlkKHJlbGF0aW9uKTsKCU5vdG51bGxIYXNoRW50cnkgKmhlbnRyeTsKCWJvb2wJ CWZvdW5kOwoJQml0bWFwc2V0ICAqbm90bnVsbGF0dG51bXMgPSBOVUxMOwoKCS8qIGJhaWwg b3V0IGlmIHRoZSByZWxhdGlvbiBoYXMgbm8gbm90LW51bGwgY29uc3RyYWludHMgKi8KCWlm IChyZWxhdGlvbi0+cmRfYXR0LT5jb25zdHIgPT0gTlVMTCB8fAoJCSFyZWxhdGlvbi0+cmRf YXR0LT5jb25zdHItPmhhc19ub3RfbnVsbCkKCQlyZXR1cm47CgoJLyogY3JlYXRlIHRoZSBo YXNoIHRhYmxlIGlmIGl0IGhhc24ndCBiZWVuIGNyZWF0ZWQgeWV0ICovCglpZiAocm9vdC0+ Z2xvYi0+cmVsX25vdG51bGxhdHRzX2hhc2ggPT0gTlVMTCkKCXsKCQlIVEFCCSAgICpoYXNo dGFiOwoJCUhBU0hDVEwJCWhhc2hfY3RsOwoKCQloYXNoX2N0bC5rZXlzaXplID0gc2l6ZW9m KE9pZCk7CgkJaGFzaF9jdGwuZW50cnlzaXplID0gc2l6ZW9mKE5vdG51bGxIYXNoRW50cnkp OwoJCWhhc2hfY3RsLmhjeHQgPSBDdXJyZW50TWVtb3J5Q29udGV4dDsKCgkJaGFzaHRhYiA9 IGhhc2hfY3JlYXRlKCJSZWxhdGlvbiBOT1QgTlVMTCBhdHRudW1zIiwKCQkJCQkJCSAgNjRM LAkvKiBhcmJpdHJhcnkgaW5pdGlhbCBzaXplICovCgkJCQkJCQkgICZoYXNoX2N0bCwKCQkJ CQkJCSAgSEFTSF9FTEVNIHwgSEFTSF9CTE9CUyB8IEhBU0hfQ09OVEVYVCk7CgoJCXJvb3Qt Pmdsb2ItPnJlbF9ub3RudWxsYXR0c19oYXNoID0gaGFzaHRhYjsKCX0KCgkvKgoJICogQ3Jl YXRlIGEgaGFzaCBlbnRyeSBmb3IgdGhpcyByZWxhdGlvbiBPSUQsIGlmIHdlIGRvbid0IGhh dmUgb25lCgkgKiBhbHJlYWR5LgoJICovCgloZW50cnkgPSAoTm90bnVsbEhhc2hFbnRyeSAq KSBoYXNoX3NlYXJjaChyb290LT5nbG9iLT5yZWxfbm90bnVsbGF0dHNfaGFzaCwKCQkJCQkJ CQkJCQkgICZyZWxpZCwKCQkJCQkJCQkJCQkgIEhBU0hfRU5URVIsCgkJCQkJCQkJCQkJICAm Zm91bmQpOwoKCS8qIGJhaWwgb3V0IGlmIGEgaGFzaCBlbnRyeSBhbHJlYWR5IGV4aXN0cyBm b3IgdGhpcyByZWxhdGlvbiBPSUQgKi8KCWlmIChmb3VuZCkKCQlyZXR1cm47CgoJLyogY29s bGVjdCB0aGUgY29sdW1uIG5vdC1udWxsIGNvbnN0cmFpbnQgaW5mb3JtYXRpb24gZm9yIHRo aXMgcmVsYXRpb24gKi8KCWZvciAoaW50IGkgPSAwOyBpIDwgcmVsYXRpb24tPnJkX2F0dC0+ bmF0dHM7IGkrKykKCXsKCQlDb21wYWN0QXR0cmlidXRlICphdHRyID0gVHVwbGVEZXNjQ29t cGFjdEF0dHIocmVsYXRpb24tPnJkX2F0dCwgaSk7CgoJCUFzc2VydChhdHRyLT5hdHRudWxs YWJpbGl0eSAhPSBBVFROVUxMQUJMRV9VTktOT1dOKTsKCgkJaWYgKGF0dHItPmF0dG51bGxh YmlsaXR5ID09IEFUVE5VTExBQkxFX1ZBTElEKQoJCXsKCQkJbm90bnVsbGF0dG51bXMgPSBi bXNfYWRkX21lbWJlcihub3RudWxsYXR0bnVtcywgaSArIDEpOwoKCQkJLyoKCQkJICogUGVy IFJlbW92ZUF0dHJpYnV0ZUJ5SWQoKSwgZHJvcHBlZCBjb2x1bW5zIHdpbGwgaGF2ZSB0aGVp cgoJCQkgKiBhdHRub3RudWxsIHVuc2V0LCBzbyB3ZSBuZWVkbid0IGNoZWNrIGZvciBkcm9w cGVkIGNvbHVtbnMgaW4KCQkJICogdGhlIGFib3ZlIGNvbmRpdGlvbi4KCQkJICovCgkJCUFz c2VydCghYXR0ci0+YXR0aXNkcm9wcGVkKTsKCQl9Cgl9CgoJLyogLi4uIGFuZCBpbml0aWFs aXplIHRoZSBuZXcgaGFzaCBlbnRyeSAqLwoJaGVudHJ5LT5ub3RudWxsYXR0bnVtcyA9IG5v dG51bGxhdHRudW1zOwp9CgovKgogKiBmaW5kX3JlbGF0aW9uX25vdG51bGxhdHRzIC0KICoJ ICBTZWFyY2hlcyB0aGUgaGFzaCB0YWJsZSBhbmQgcmV0dXJucyB0aGUgY29sdW1uIG5vdC1u dWxsIGNvbnN0cmFpbnQKICoJICBpbmZvcm1hdGlvbiBmb3IgYSBnaXZlbiByZWxhdGlvbi4K ICovCkJpdG1hcHNldCAqCmZpbmRfcmVsYXRpb25fbm90bnVsbGF0dHMoUGxhbm5lckluZm8g KnJvb3QsIE9pZCByZWxpZCkKewoJTm90bnVsbEhhc2hFbnRyeSAqaGVudHJ5OwoJYm9vbAkJ Zm91bmQ7CgoJaWYgKHJvb3QtPmdsb2ItPnJlbF9ub3RudWxsYXR0c19oYXNoID09IE5VTEwp CgkJcmV0dXJuIE5VTEw7CgoJaGVudHJ5ID0gKE5vdG51bGxIYXNoRW50cnkgKikgaGFzaF9z ZWFyY2gocm9vdC0+Z2xvYi0+cmVsX25vdG51bGxhdHRzX2hhc2gsCgkJCQkJCQkJCQkJICAm cmVsaWQsCgkJCQkJCQkJCQkJICBIQVNIX0ZJTkQsCgkJCQkJCQkJCQkJICAmZm91bmQpOwoJ aWYgKCFmb3VuZCkKCQlyZXR1cm4gTlVMTDsKCglyZXR1cm4gaGVudHJ5LT5ub3RudWxsYXR0 bnVtczsKfQoKLyoKICogaW5mZXJfYXJiaXRlcl9pbmRleGVzIC0KICoJICBEZXRlcm1pbmUg dGhlIHVuaXF1ZSBpbmRleGVzIHVzZWQgdG8gYXJiaXRyYXRlIHNwZWN1bGF0aXZlIGluc2Vy dGlvbi4KICoKICogVXNlcyB1c2VyLXN1cHBsaWVkIGluZmVyZW5jZSBjbGF1c2UgZXhwcmVz c2lvbnMgYW5kIHByZWRpY2F0ZSB0byBtYXRjaCBhCiAqIHVuaXF1ZSBpbmRleCBmcm9tIHRo b3NlIGRlZmluZWQgYW5kIHJlYWR5IG9uIHRoZSBoZWFwIHJlbGF0aW9uICh0YXJnZXQpLgog KiBBbiBleGFjdCBtYXRjaCBpcyByZXF1aXJlZCBvbiBjb2x1bW5zL2V4cHJlc3Npb25zIChh bHRob3VnaCB0aGV5IGNhbiBhcHBlYXIKICogaW4gYW55IG9yZGVyKS4gIEhvd2V2ZXIsIHRo ZSBwcmVkaWNhdGUgZ2l2ZW4gYnkgdGhlIHVzZXIgbmVlZCBvbmx5IHJlc3RyaWN0CiAqIGlu c2VydGlvbiB0byBhIHN1YnNldCBvZiBzb21lIHBhcnQgb2YgdGhlIHRhYmxlIGNvdmVyZWQg Ynkgc29tZSBwYXJ0aWN1bGFyCiAqIHVuaXF1ZSBpbmRleCAoaW4gcGFydGljdWxhciwgYSBw YXJ0aWFsIHVuaXF1ZSBpbmRleCkgaW4gb3JkZXIgdG8gYmUKICogaW5mZXJyZWQuCiAqCiAq IFRoZSBpbXBsZW1lbnRhdGlvbiBkb2VzIG5vdCBjb25zaWRlciB3aGljaCBCLVRyZWUgb3Bl cmF0b3IgY2xhc3MgYW55CiAqIHBhcnRpY3VsYXIgYXZhaWxhYmxlIHVuaXF1ZSBpbmRleCBh dHRyaWJ1dGUgdXNlcywgdW5sZXNzIG9uZSB3YXMgc3BlY2lmaWVkCiAqIGluIHRoZSBpbmZl cmVuY2Ugc3BlY2lmaWNhdGlvbi4gVGhlIHNhbWUgaXMgdHJ1ZSBvZiBjb2xsYXRpb25zLiAg SW4KICogcGFydGljdWxhciwgdGhlcmUgaXMgbm8gc3lzdGVtIGRlcGVuZGVuY3kgb24gdGhl IGRlZmF1bHQgb3BlcmF0b3IgY2xhc3MgZm9yCiAqIHRoZSBwdXJwb3NlcyBvZiBpbmZlcmVu Y2UuICBJZiBubyBvcGNsYXNzIChvciBjb2xsYXRpb24pIGlzIHNwZWNpZmllZCwgdGhlbgog KiBhbGwgbWF0Y2hpbmcgaW5kZXhlcyAodGhhdCBtYXkgb3IgbWF5IG5vdCBtYXRjaCB0aGUg ZGVmYXVsdCBpbiB0ZXJtcyBvZgogKiBlYWNoIGF0dHJpYnV0ZSBvcGNsYXNzL2NvbGxhdGlv bikgYXJlIHVzZWQgZm9yIGluZmVyZW5jZS4KICovCkxpc3QgKgppbmZlcl9hcmJpdGVyX2lu ZGV4ZXMoUGxhbm5lckluZm8gKnJvb3QpCnsKCU9uQ29uZmxpY3RFeHByICpvbmNvbmZsaWN0 ID0gcm9vdC0+cGFyc2UtPm9uQ29uZmxpY3Q7CgoJLyogSXRlcmF0aW9uIHN0YXRlICovCglJ bmRleAkJdmFybm87CglSYW5nZVRibEVudHJ5ICpydGU7CglSZWxhdGlvbglyZWxhdGlvbjsK CU9pZAkJCWluZGV4T2lkRnJvbUNvbnN0cmFpbnQgPSBJbnZhbGlkT2lkOwoJTGlzdAkgICAq aW5kZXhMaXN0OwoJTGlzdAkgICAqaW5kZXhSZWxMaXN0ID0gTklMOwoKCS8qCgkgKiBSZXF1 aXJlZCBhdHRyaWJ1dGVzIGFuZCBleHByZXNzaW9ucyB1c2VkIHRvIG1hdGNoIGluZGV4ZXMg dG8gdGhlIGNsYXVzZQoJICogZ2l2ZW4gYnkgdGhlIHVzZXIuICBJbiB0aGUgT04gQ09ORkxJ Q1QgT04gQ09OU1RSQUlOVCBjYXNlLCB3ZSBjb21wdXRlCgkgKiB0aGVzZSBmcm9tIHRoYXQg Y29uc3RyYWludCdzIGluZGV4IHRvIG1hdGNoIGFsbCBvdGhlciBpbmRleGVzLCB0bwoJICog YWNjb3VudCBmb3IgdGhlIGNhc2Ugd2hlcmUgdGhhdCBpbmRleCBpcyBiZWluZyBjb25jdXJy ZW50bHkgcmVpbmRleGVkLgoJICovCglMaXN0CSAgICppbmZlckluZGV4RXhwcnMgPSAoTGlz dCAqKSBvbmNvbmZsaWN0LT5hcmJpdGVyV2hlcmU7CglCaXRtYXBzZXQgICppbmZlckF0dHJz ID0gTlVMTDsKCUxpc3QJICAgKmluZmVyRWxlbXMgPSBOSUw7CgoJLyogUmVzdWx0cyAqLwoJ TGlzdAkgICAqcmVzdWx0cyA9IE5JTDsKCWJvb2wJCWZvdW5kVmFsaWQgPSBmYWxzZTsKCgkv KgoJICogUXVpY2tseSByZXR1cm4gTklMIGZvciBPTiBDT05GTElDVCBETyBOT1RISU5HIHdp dGhvdXQgYW4gaW5mZXJlbmNlCgkgKiBzcGVjaWZpY2F0aW9uIG9yIG5hbWVkIGNvbnN0cmFp bnQuICBPTiBDT05GTElDVCBETyBTRUxFQ1QvVVBEQVRFCgkgKiBzdGF0ZW1lbnRzIG11c3Qg YWx3YXlzIHByb3ZpZGUgb25lIG9yIHRoZSBvdGhlciAoYnV0IHBhcnNlciBvdWdodCB0bwoJ ICogaGF2ZSBjYXVnaHQgdGhhdCBhbHJlYWR5KS4KCSAqLwoJaWYgKG9uY29uZmxpY3QtPmFy Yml0ZXJFbGVtcyA9PSBOSUwgJiYKCQlvbmNvbmZsaWN0LT5jb25zdHJhaW50ID09IEludmFs aWRPaWQpCgkJcmV0dXJuIE5JTDsKCgkvKgoJICogV2UgbmVlZCBub3QgbG9jayB0aGUgcmVs YXRpb24gc2luY2UgaXQgd2FzIGFscmVhZHkgbG9ja2VkLCBlaXRoZXIgYnkKCSAqIHRoZSBy ZXdyaXRlciBvciB3aGVuIGV4cGFuZF9pbmhlcml0ZWRfcnRlbnRyeSgpIGFkZGVkIGl0IHRv IHRoZSBxdWVyeSdzCgkgKiByYW5nZXRhYmxlLgoJICovCgl2YXJubyA9IHJvb3QtPnBhcnNl LT5yZXN1bHRSZWxhdGlvbjsKCXJ0ZSA9IHJ0X2ZldGNoKHZhcm5vLCByb290LT5wYXJzZS0+ cnRhYmxlKTsKCglyZWxhdGlvbiA9IHRhYmxlX29wZW4ocnRlLT5yZWxpZCwgTm9Mb2NrKTsK CgkvKgoJICogQnVpbGQgbm9ybWFsaXplZC9CTVMgcmVwcmVzZW50YXRpb24gb2YgcGxhaW4g aW5kZXhlZCBhdHRyaWJ1dGVzLCBhcwoJICogd2VsbCBhcyBhIHNlcGFyYXRlIGxpc3Qgb2Yg ZXhwcmVzc2lvbiBpdGVtcy4gIFRoaXMgc2ltcGxpZmllcyBtYXRjaGluZwoJICogdGhlIGNh dGFsb2dlZCBkZWZpbml0aW9uIG9mIGluZGV4ZXMuCgkgKi8KCWZvcmVhY2hfcHRyKEluZmVy ZW5jZUVsZW0sIGVsZW0sIG9uY29uZmxpY3QtPmFyYml0ZXJFbGVtcykKCXsKCQlWYXIJCSAg ICp2YXI7CgkJaW50CQkJYXR0bm87CgoJCS8qIHdlIGNhbm5vdCBhbHNvIGhhdmUgYSBjb25z dHJhaW50IG5hbWUsIHBlciBncmFtbWFyICovCgkJQXNzZXJ0KCFPaWRJc1ZhbGlkKG9uY29u ZmxpY3QtPmNvbnN0cmFpbnQpKTsKCgkJaWYgKCFJc0EoZWxlbS0+ZXhwciwgVmFyKSkKCQl7 CgkJCS8qIElmIG5vdCBhIHBsYWluIFZhciwganVzdCBzaG92ZSBpdCBpbiBpbmZlckVsZW1z IGZvciBub3cgKi8KCQkJaW5mZXJFbGVtcyA9IGxhcHBlbmQoaW5mZXJFbGVtcywgZWxlbS0+ ZXhwcik7CgkJCWNvbnRpbnVlOwoJCX0KCgkJdmFyID0gKFZhciAqKSBlbGVtLT5leHByOwoJ CWF0dG5vID0gdmFyLT52YXJhdHRubzsKCgkJaWYgKGF0dG5vID09IDApCgkJCWVyZXBvcnQo RVJST1IsCgkJCQkJKGVycmNvZGUoRVJSQ09ERV9GRUFUVVJFX05PVF9TVVBQT1JURUQpLAoJ CQkJCSBlcnJtc2coIndob2xlIHJvdyB1bmlxdWUgaW5kZXggaW5mZXJlbmNlIHNwZWNpZmlj YXRpb25zIGFyZSBub3Qgc3VwcG9ydGVkIikpKTsKCgkJaW5mZXJBdHRycyA9IGJtc19hZGRf bWVtYmVyKGluZmVyQXR0cnMsCgkJCQkJCQkJCWF0dG5vIC0gRmlyc3RMb3dJbnZhbGlkSGVh cEF0dHJpYnV0ZU51bWJlcik7Cgl9CgoJLyoKCSAqIE5leHQsIG9wZW4gYWxsIHRoZSBpbmRl eGVzLiAgV2UgbmVlZCB0aGlzIGxpc3QgZm9yIHR3byB0aGluZ3M6IGZpcnN0LAoJICogaWYg YW4gT04gQ09OU1RSQUlOVCBjbGF1c2Ugd2FzIGdpdmVuLCBhbmQgdGhhdCBjb25zdHJhaW50 J3MgaW5kZXggaXMKCSAqIHVuZGVyZ29pbmcgUkVJTkRFWCBDT05DVVJSRU5UTFksIHRoZW4g d2UgbmVlZCB0byBjb25zaWRlciBhbGwgbWF0Y2hlcwoJICogZm9yIHRoYXQgaW5kZXguICBT ZWNvbmQsIGlmIGFuIGF0dHJpYnV0ZSBsaXN0IHdhcyBzcGVjaWZpZWQgaW4gdGhlIE9OCgkg KiBDT05GTElDVCBjbGF1c2UsIHdlIHVzZSB0aGUgbGlzdCB0byBmaW5kIHRoZSBpbmRleGVz IHdob3NlIGF0dHJpYnV0ZXMKCSAqIG1hdGNoIHRoYXQgbGlzdC4KCSAqLwoJaW5kZXhMaXN0 ID0gUmVsYXRpb25HZXRJbmRleExpc3QocmVsYXRpb24pOwoJZm9yZWFjaF9vaWQoaW5kZXhv aWQsIGluZGV4TGlzdCkKCXsKCQlSZWxhdGlvbglpZHhSZWw7CgoJCS8qIG9idGFpbiB0aGUg c2FtZSBsb2NrIHR5cGUgdGhhdCB0aGUgZXhlY3V0b3Igd2lsbCB1bHRpbWF0ZWx5IHVzZSAq LwoJCWlkeFJlbCA9IGluZGV4X29wZW4oaW5kZXhvaWQsIHJ0ZS0+cmVsbG9ja21vZGUpOwoJ CWluZGV4UmVsTGlzdCA9IGxhcHBlbmQoaW5kZXhSZWxMaXN0LCBpZHhSZWwpOwoJfQoKCS8q CgkgKiBJZiBhIGNvbnN0cmFpbnQgd2FzIG5hbWVkIGluIHRoZSBjb21tYW5kLCBsb29rIHVw IGl0cyBpbmRleC4gIFdlIGRvbid0CgkgKiByZXR1cm4gaXQgaW1tZWRpYXRlbHkgYmVjYXVz ZSB3ZSBuZWVkIHNvbWUgYWRkaXRpb25hbCBzYW5pdHkgY2hlY2tzLAoJICogYW5kIGFsc28g YmVjYXVzZSB3ZSBuZWVkIHRvIGluY2x1ZGUgb3RoZXIgaW5kZXhlcyBhcyBhcmJpdGVycyB0 bwoJICogYWNjb3VudCBmb3IgUkVJTkRFWCBDT05DVVJSRU5UTFkgcHJvY2Vzc2luZyBpdC4K CSAqLwoJaWYgKG9uY29uZmxpY3QtPmNvbnN0cmFpbnQgIT0gSW52YWxpZE9pZCkKCXsKCQkv KiB3ZSBjYW5ub3QgYWxzbyBoYXZlIGFuIGV4cGxpY2l0IGxpc3Qgb2YgZWxlbWVudHMsIHBl ciBncmFtbWFyICovCgkJQXNzZXJ0KG9uY29uZmxpY3QtPmFyYml0ZXJFbGVtcyA9PSBOSUwp OwoKCQlpbmRleE9pZEZyb21Db25zdHJhaW50ID0gZ2V0X2NvbnN0cmFpbnRfaW5kZXgob25j b25mbGljdC0+Y29uc3RyYWludCk7CgkJaWYgKGluZGV4T2lkRnJvbUNvbnN0cmFpbnQgPT0g SW52YWxpZE9pZCkKCQkJZXJlcG9ydChFUlJPUiwKCQkJCQkoZXJyY29kZShFUlJDT0RFX1dS T05HX09CSkVDVF9UWVBFKSwKCQkJCQkgZXJybXNnKCJjb25zdHJhaW50IGluIE9OIENPTkZM SUNUIGNsYXVzZSBoYXMgbm8gYXNzb2NpYXRlZCBpbmRleCIpKSk7CgoJCS8qCgkJICogRmlu ZCB0aGUgbmFtZWQgY29uc3RyYWludCBpbmRleCB0byBleHRyYWN0IGl0cyBhdHRyaWJ1dGVz IGFuZAoJCSAqIHByZWRpY2F0ZXMuCgkJICovCgkJZm9yZWFjaF9wdHIoUmVsYXRpb25EYXRh LCBpZHhSZWwsIGluZGV4UmVsTGlzdCkKCQl7CgkJCUZvcm1fcGdfaW5kZXggaWR4Rm9ybSA9 IGlkeFJlbC0+cmRfaW5kZXg7CgoJCQlpZiAoaW5kZXhPaWRGcm9tQ29uc3RyYWludCA9PSBp ZHhGb3JtLT5pbmRleHJlbGlkKQoJCQl7CgkJCQkvKiBGb3VuZCBpdC4gKi8KCQkJCUFzc2Vy dChpZHhGb3JtLT5pbmRpc3JlYWR5KTsKCgkJCQkvKgoJCQkJICogU2V0IHVwIGluZmVyRWxl bXMgYW5kIGluZmVySW5kZXhFeHBycyB0byBtYXRjaCB0aGUKCQkJCSAqIGNvbnN0cmFpbnQg aW5kZXgsIHNvIHRoYXQgd2UgY2FuIG1hdGNoIHRoZW0gaW4gdGhlIGxvb3AKCQkJCSAqIGJl bG93LgoJCQkJICovCgkJCQlmb3IgKGludCBuYXR0ID0gMDsgbmF0dCA8IGlkeEZvcm0tPmlu ZG5rZXlhdHRzOyBuYXR0KyspCgkJCQl7CgkJCQkJaW50CQkJYXR0bm87CgoJCQkJCWF0dG5v ID0gaWR4UmVsLT5yZF9pbmRleC0+aW5ka2V5LnZhbHVlc1tuYXR0XTsKCQkJCQlpZiAoYXR0 bm8gIT0gSW52YWxpZEF0dHJOdW1iZXIpCgkJCQkJCWluZmVyQXR0cnMgPQoJCQkJCQkJYm1z X2FkZF9tZW1iZXIoaW5mZXJBdHRycywKCQkJCQkJCQkJCSAgIGF0dG5vIC0gRmlyc3RMb3dJ bnZhbGlkSGVhcEF0dHJpYnV0ZU51bWJlcik7CgkJCQl9CgoJCQkJaW5mZXJFbGVtcyA9IFJl bGF0aW9uR2V0SW5kZXhFeHByZXNzaW9uc0V4cGFuZChpZHhSZWwpOwoJCQkJaW5mZXJJbmRl eEV4cHJzID0gUmVsYXRpb25HZXRJbmRleFByZWRpY2F0ZUV4cGFuZChpZHhSZWwpOwoJCQkJ YnJlYWs7CgkJCX0KCQl9Cgl9CgoJLyoKCSAqIFVzaW5nIHRoYXQgcmVwcmVzZW50YXRpb24s IGl0ZXJhdGUgdGhyb3VnaCB0aGUgbGlzdCBvZiBpbmRleGVzIG9uIHRoZQoJICogdGFyZ2V0 IHJlbGF0aW9uIHRvIGZpbmQgbWF0Y2hlcy4KCSAqLwoJZm9yZWFjaF9wdHIoUmVsYXRpb25E YXRhLCBpZHhSZWwsIGluZGV4UmVsTGlzdCkKCXsKCQlGb3JtX3BnX2luZGV4IGlkeEZvcm07 CgkJQml0bWFwc2V0ICAqaW5kZXhlZEF0dHJzOwoJCUxpc3QJICAgKmlkeEV4cHJzOwoJCUxp c3QJICAgKnByZWRFeHByczsKCQlBdHRyTnVtYmVyCW5hdHQ7CgkJYm9vbAkJbWF0Y2g7CgoJ CS8qCgkJICogRXh0cmFjdCBpbmZvIGZyb20gdGhlIHJlbGF0aW9uIGRlc2NyaXB0b3IgZm9y IHRoZSBpbmRleC4KCQkgKgoJCSAqIExldCBleGVjdXRvciBjb21wbGFpbiBhYm91dCAhaW5k aW1tZWRpYXRlIGNhc2UgZGlyZWN0bHksIGJlY2F1c2UKCQkgKiBlbmZvcmNlbWVudCBuZWVk cyB0byBvY2N1ciB0aGVyZSBhbnl3YXkgd2hlbiBhbiBpbmZlcmVuY2UgY2xhdXNlIGlzCgkJ ICogb21pdHRlZC4KCQkgKi8KCQlpZHhGb3JtID0gaWR4UmVsLT5yZF9pbmRleDsKCgkJLyoK CQkgKiBJZ25vcmUgaW5kZXhlcyB0aGF0IGFyZW4ndCBpbmRpc3JlYWR5LCBiZWNhdXNlIHdl IGNhbm5vdCB0cnVzdAoJCSAqIHRoZWlyIGNhdGFsb2cgc3RydWN0dXJlIHlldC4gIEhvd2V2 ZXIsIGlmIGFueSBpbmRleGVzIGFyZSBtYXJrZWQKCQkgKiBpbmRpc3JlYWR5IGJ1dCBub3Qg eWV0IGluZGlzdmFsaWQsIHdlIHN0aWxsIGNvbnNpZGVyIHRoZW0sIGJlY2F1c2UKCQkgKiB0 aGV5IG1pZ2h0IHR1cm4gdmFsaWQgd2hpbGUgd2UncmUgcnVubmluZy4gIERvaW5nIGl0IHRo aXMgd2F5CgkJICogYWxsb3dzIGEgY29uY3VycmVudCB0cmFuc2FjdGlvbiB3aXRoIGEgc2xp Z2h0bHkgbGF0ZXIgY2F0YWxvZwoJCSAqIHNuYXBzaG90IGluZmVyIHRoZSBzYW1lIHNldCBv ZiBpbmRleGVzLCB3aGljaCBpcyBjcml0aWNhbCB0bwoJCSAqIHByZXZlbnQgc3B1cmlvdXMg J2R1cGxpY2F0ZSBrZXknIGVycm9ycy4KCQkgKgoJCSAqIEhvd2V2ZXIsIGFub3RoZXIgY3Jp dGljYWwgYXNwZWN0IGlzIHRoYXQgYSB1bmlxdWUgaW5kZXggdGhhdCBpc24ndAoJCSAqIHll dCBtYXJrZWQgaW5kaXN2YWxpZD10cnVlIG1pZ2h0IG5vdCBiZSBjb21wbGV0ZSB5ZXQsIG1l YW5pbmcgaXQKCQkgKiB3b3VsZG4ndCBkZXRlY3QgcG9zc2libGUgZHVwbGljYXRlIHJvd3Mu ICBJbiBvcmRlciB0byBwcmV2ZW50IGZhbHNlCgkJICogbmVnYXRpdmVzLCB3ZSByZXF1aXJl IHRoYXQgd2UgaW5jbHVkZSBpbiB0aGUgc2V0IG9mIGluZmVycmVkCgkJICogaW5kZXhlcyBh dCBsZWFzdCBvbmUgaW5kZXggdGhhdCBpcyBtYXJrZWQgdmFsaWQuCgkJICovCgkJaWYgKCFp ZHhGb3JtLT5pbmRpc3JlYWR5KQoJCQljb250aW51ZTsKCgkJLyoKCQkgKiBJZ25vcmUgaW52 YWxpZCBpbmRleGVzIGZvciBwYXJ0aXRpb25lZCB0YWJsZXMuICBJdCdzIHBvc3NpYmxlIHRo YXQKCQkgKiBzb21lIHBhcnRpdGlvbnMgZG9uJ3QgaGF2ZSB0aGUgaW5kZXggKHlldCksIGFu ZCB0aGVuIHdlIHdvdWxkIG5vdAoJCSAqIGZpbmQgYSBtYXRjaCBkdXJpbmcgRXhlY0luaXRQ YXJ0aXRpb25JbmZvLgoJCSAqLwoJCWlmIChyZWxhdGlvbi0+cmRfcmVsLT5yZWxraW5kID09 IFJFTEtJTkRfUEFSVElUSU9ORURfVEFCTEUgJiYKCQkJIWlkeEZvcm0tPmluZGlzdmFsaWQp CgkJCWNvbnRpbnVlOwoKCQkvKgoJCSAqIE5vdGUgdGhhdCB3ZSBkbyBub3QgcGVyZm9ybSBh IGNoZWNrIGFnYWluc3QgaW5kY2hlY2t4bWluIChsaWtlIGUuZy4KCQkgKiBnZXRfcmVsYXRp b25faW5mbygpKSBoZXJlIHRvIGVsaW1pbmF0ZSBjYW5kaWRhdGVzLCBiZWNhdXNlCgkJICog dW5pcXVlbmVzcyBjaGVja2luZyBvbmx5IGNhcmVzIGFib3V0IHRoZSBtb3N0IHJlY2VudGx5 IGNvbW1pdHRlZAoJCSAqIHR1cGxlIHZlcnNpb25zLgoJCSAqLwoKCQkvKgoJCSAqIExvb2sg Zm9yIG1hdGNoIGZvciAiT04gY29uc3RyYWludF9uYW1lIiB2YXJpYW50LCB3aGljaCBtYXkg bm90IGJlIGEKCQkgKiB1bmlxdWUgY29uc3RyYWludC4gIFRoaXMgY2FuIG9ubHkgYmUgYSBj b25zdHJhaW50IG5hbWUuCgkJICovCgkJaWYgKGluZGV4T2lkRnJvbUNvbnN0cmFpbnQgPT0g aWR4Rm9ybS0+aW5kZXhyZWxpZCkKCQl7CgkJCS8qCgkJCSAqIE9OIENPTkZMSUNUIERPIFVQ REFURSBhbmQgT04gQ09ORkxJQ1QgRE8gU0VMRUNUIGFyZSBub3QKCQkJICogc3VwcG9ydGVk IHdpdGggZXhjbHVzaW9uIGNvbnN0cmFpbnRzLgoJCQkgKi8KCQkJaWYgKGlkeEZvcm0tPmlu ZGlzZXhjbHVzaW9uICYmCgkJCQkob25jb25mbGljdC0+YWN0aW9uID09IE9OQ09ORkxJQ1Rf VVBEQVRFIHx8CgkJCQkgb25jb25mbGljdC0+YWN0aW9uID09IE9OQ09ORkxJQ1RfU0VMRUNU KSkKCQkJCWVyZXBvcnQoRVJST1IsCgkJCQkJCWVycmNvZGUoRVJSQ09ERV9XUk9OR19PQkpF Q1RfVFlQRSksCgkJCQkJCWVycm1zZygiT04gQ09ORkxJQ1QgRE8gJXMgbm90IHN1cHBvcnRl ZCB3aXRoIGV4Y2x1c2lvbiBjb25zdHJhaW50cyIsCgkJCQkJCQkgICBvbmNvbmZsaWN0LT5h Y3Rpb24gPT0gT05DT05GTElDVF9VUERBVEUgPyAiVVBEQVRFIiA6ICJTRUxFQ1QiKSk7CgoJ CQkvKiBDb25zaWRlciB0aGlzIG9uZSBhIG1hdGNoIGFscmVhZHkgKi8KCQkJcmVzdWx0cyA9 IGxhcHBlbmRfb2lkKHJlc3VsdHMsIGlkeEZvcm0tPmluZGV4cmVsaWQpOwoJCQlmb3VuZFZh bGlkIHw9IGlkeEZvcm0tPmluZGlzdmFsaWQ7CgkJCWNvbnRpbnVlOwoJCX0KCQllbHNlIGlm IChpbmRleE9pZEZyb21Db25zdHJhaW50ICE9IEludmFsaWRPaWQpCgkJewoJCQkvKgoJCQkg KiBJbiB0aGUgY2FzZSBvZiAiT04gY29uc3RyYWludF9uYW1lIERPIFNFTEVDVC9VUERBVEUi IHdlIG5lZWQgdG8KCQkJICogc2tpcCBub24tdW5pcXVlIGNhbmRpZGF0ZXMuCgkJCSAqLwoJ CQlpZiAoIWlkeEZvcm0tPmluZGlzdW5pcXVlICYmCgkJCQkob25jb25mbGljdC0+YWN0aW9u ID09IE9OQ09ORkxJQ1RfVVBEQVRFIHx8CgkJCQkgb25jb25mbGljdC0+YWN0aW9uID09IE9O Q09ORkxJQ1RfU0VMRUNUKSkKCQkJCWNvbnRpbnVlOwoJCX0KCQllbHNlCgkJewoJCQkvKgoJ CQkgKiBPbmx5IGNvbnNpZGVyaW5nIGNvbnZlbnRpb25hbCBpbmZlcmVuY2UgYXQgdGhpcyBw b2ludCAobm90CgkJCSAqIG5hbWVkIGNvbnN0cmFpbnRzKSwgc28gaW5kZXggdW5kZXIgY29u c2lkZXJhdGlvbiBjYW4gYmUKCQkJICogaW1tZWRpYXRlbHkgc2tpcHBlZCBpZiBpdCdzIG5v dCB1bmlxdWUuCgkJCSAqLwoJCQlpZiAoIWlkeEZvcm0tPmluZGlzdW5pcXVlKQoJCQkJY29u dGludWU7CgkJfQoKCQkvKgoJCSAqIFNvLWNhbGxlZCB1bmlxdWUgY29uc3RyYWludHMgd2l0 aCBXSVRIT1VUIE9WRVJMQVBTIGFyZSByZWFsbHkKCQkgKiBleGNsdXNpb24gY29uc3RyYWlu dHMsIHNvIHNraXAgdGhvc2UgdG9vLgoJCSAqLwoJCWlmIChpZHhGb3JtLT5pbmRpc2V4Y2x1 c2lvbikKCQkJY29udGludWU7CgoJCS8qIEJ1aWxkIEJNUyByZXByZXNlbnRhdGlvbiBvZiBw bGFpbiAobm9uIGV4cHJlc3Npb24pIGluZGV4IGF0dHJzICovCgkJaW5kZXhlZEF0dHJzID0g TlVMTDsKCQlmb3IgKG5hdHQgPSAwOyBuYXR0IDwgaWR4Rm9ybS0+aW5kbmtleWF0dHM7IG5h dHQrKykKCQl7CgkJCWludAkJCWF0dG5vID0gaWR4UmVsLT5yZF9pbmRleC0+aW5ka2V5LnZh bHVlc1tuYXR0XTsKCgkJCWlmIChhdHRubyAhPSAwKQoJCQkJaW5kZXhlZEF0dHJzID0gYm1z X2FkZF9tZW1iZXIoaW5kZXhlZEF0dHJzLAoJCQkJCQkJCQkJCSAgYXR0bm8gLSBGaXJzdExv d0ludmFsaWRIZWFwQXR0cmlidXRlTnVtYmVyKTsKCQl9CgoJCS8qIE5vbi1leHByZXNzaW9u IGF0dHJpYnV0ZXMgKGlmIGFueSkgbXVzdCBtYXRjaCAqLwoJCWlmICghYm1zX2VxdWFsKGlu ZGV4ZWRBdHRycywgaW5mZXJBdHRycykpCgkJCWNvbnRpbnVlOwoKCQkvKiBFeHByZXNzaW9u IGF0dHJpYnV0ZXMgKGlmIGFueSkgbXVzdCBtYXRjaCAqLwoJCWlkeEV4cHJzID0gUmVsYXRp b25HZXRJbmRleEV4cHJlc3Npb25zRXhwYW5kKGlkeFJlbCk7CgkJaWYgKGlkeEV4cHJzKQoJ CXsKCQkJaWYgKHZhcm5vICE9IDEpCgkJCQlDaGFuZ2VWYXJOb2RlcygoTm9kZSAqKSBpZHhF eHBycywgMSwgdmFybm8sIDApOwoKCQkJaWR4RXhwcnMgPSAoTGlzdCAqKSBldmFsX2NvbnN0 X2V4cHJlc3Npb25zKHJvb3QsIChOb2RlICopIGlkeEV4cHJzKTsKCQl9CgoJCS8qCgkJICog SWYgYXJiaXRlckVsZW1zIGFyZSBwcmVzZW50LCBjaGVjayB0aGVtLiAgKE5vdGUgdGhhdCBp ZiBhCgkJICogY29uc3RyYWludCBuYW1lIHdhcyBnaXZlbiBpbiB0aGUgY29tbWFuZCBsaW5l LCB0aGlzIGxpc3QgaXMgTklMLikKCQkgKi8KCQltYXRjaCA9IHRydWU7CgkJZm9yZWFjaF9w dHIoSW5mZXJlbmNlRWxlbSwgZWxlbSwgb25jb25mbGljdC0+YXJiaXRlckVsZW1zKQoJCXsK CQkJLyoKCQkJICogRW5zdXJlIHRoYXQgY29sbGF0aW9uL29wY2xhc3MgYXNwZWN0cyBvZiBp bmZlcmVuY2UgZXhwcmVzc2lvbgoJCQkgKiBlbGVtZW50IG1hdGNoLiAgRXZlbiB0aG91Z2gg dGhpcyBsb29wIGlzIHByaW1hcmlseSBjb25jZXJuZWQKCQkJICogd2l0aCBtYXRjaGluZyBl eHByZXNzaW9ucywgaXQgaXMgYSBjb252ZW5pZW50IHBvaW50IHRvIGNoZWNrCgkJCSAqIHRo aXMgZm9yIGJvdGggZXhwcmVzc2lvbnMgYW5kIG9yZGluYXJ5IChub24tZXhwcmVzc2lvbikK CQkJICogYXR0cmlidXRlcyBhcHBlYXJpbmcgYXMgaW5mZXJlbmNlIGVsZW1lbnRzLgoJCQkg Ki8KCQkJaWYgKCFpbmZlcl9jb2xsYXRpb25fb3BjbGFzc19tYXRjaChlbGVtLCBpZHhSZWws IGlkeEV4cHJzKSkKCQkJewoJCQkJbWF0Y2ggPSBmYWxzZTsKCQkJCWJyZWFrOwoJCQl9CgoJ CQkvKgoJCQkgKiBQbGFpbiBWYXJzIGRvbid0IGZhY3RvciBpbnRvIGNvdW50IG9mIGV4cHJl c3Npb24gZWxlbWVudHMsIGFuZAoJCQkgKiB0aGUgcXVlc3Rpb24gb2Ygd2hldGhlciBvciBu b3QgdGhleSBzYXRpc2Z5IHRoZSBpbmRleAoJCQkgKiBkZWZpbml0aW9uIGhhcyBhbHJlYWR5 IGJlZW4gY29uc2lkZXJlZCAodGhleSBtdXN0KS4KCQkJICovCgkJCWlmIChJc0EoZWxlbS0+ ZXhwciwgVmFyKSkKCQkJCWNvbnRpbnVlOwoKCQkJLyoKCQkJICogTWlnaHQgYXMgd2VsbCBh dm9pZCByZWR1bmRhbnQgY2hlY2sgaW4gdGhlIHJhcmUgY2FzZXMgd2hlcmUKCQkJICogaW5m ZXJfY29sbGF0aW9uX29wY2xhc3NfbWF0Y2goKSBpcyByZXF1aXJlZCB0byBkbyByZWFsIHdv cmsuCgkJCSAqIE90aGVyd2lzZSwgY2hlY2sgdGhhdCBlbGVtZW50IGV4cHJlc3Npb24gYXBw ZWFycyBpbiBjYXRhbG9nZWQKCQkJICogaW5kZXggZGVmaW5pdGlvbi4KCQkJICovCgkJCWlm IChlbGVtLT5pbmZlcmNvbGxpZCAhPSBJbnZhbGlkT2lkIHx8CgkJCQllbGVtLT5pbmZlcm9w Y2xhc3MgIT0gSW52YWxpZE9pZCB8fAoJCQkJbGlzdF9tZW1iZXIoaWR4RXhwcnMsIGVsZW0t PmV4cHIpKQoJCQkJY29udGludWU7CgoJCQltYXRjaCA9IGZhbHNlOwoJCQlicmVhazsKCQl9 CgkJaWYgKCFtYXRjaCkKCQkJY29udGludWU7CgoJCS8qCgkJICogSW4gY2FzZSBvZiBpbmZl cmVuY2UgZnJvbSBhbiBhdHRyaWJ1dGUgbGlzdCwgZW5zdXJlIHRoYXQgdGhlCgkJICogZXhw cmVzc2lvbiBlbGVtZW50cyBmcm9tIGluZmVyZW5jZSBjbGF1c2UgYXJlIG5vdCBtaXNzaW5n IGFueQoJCSAqIGNhdGFsb2dlZCBleHByZXNzaW9ucy4gIFRoaXMgZG9lcyB0aGUgcmlnaHQg dGhpbmcgd2hlbiB1bmlxdWUKCQkgKiBpbmRleGVzIHJlZHVuZGFudGx5IHJlcGVhdCB0aGUg c2FtZSBhdHRyaWJ1dGUsIG9yIGlmIGF0dHJpYnV0ZXMKCQkgKiByZWR1bmRhbnRseSBhcHBl YXIgbXVsdGlwbGUgdGltZXMgd2l0aGluIGFuIGluZmVyZW5jZSBjbGF1c2UuCgkJICoKCQkg KiBJbiBjYXNlIGEgY29uc3RyYWludCB3YXMgbmFtZWQsIGVuc3VyZSB0aGUgY2FuZGlkYXRl IGhhcyBhbiBlcXVhbAoJCSAqIHNldCBvZiBleHByZXNzaW9ucyBhcyB0aGUgbmFtZWQgY29u c3RyYWludCdzIGluZGV4LgoJCSAqLwoJCWlmIChsaXN0X2RpZmZlcmVuY2UoaWR4RXhwcnMs IGluZmVyRWxlbXMpICE9IE5JTCkKCQkJY29udGludWU7CgoJCXByZWRFeHBycyA9IFJlbGF0 aW9uR2V0SW5kZXhQcmVkaWNhdGVFeHBhbmQoaWR4UmVsKTsKCQlpZiAocHJlZEV4cHJzKQoJ CXsKCQkJaWYgKHZhcm5vICE9IDEpCgkJCQlDaGFuZ2VWYXJOb2RlcygoTm9kZSAqKSBwcmVk RXhwcnMsIDEsIHZhcm5vLCAwKTsKCgkJCXByZWRFeHBycyA9IChMaXN0ICopCgkJCQlldmFs X2NvbnN0X2V4cHJlc3Npb25zKHJvb3QsCgkJCQkJCQkJCSAgIChOb2RlICopIG1ha2VfYW5k c19leHBsaWNpdChwcmVkRXhwcnMpKTsKCQkJcHJlZEV4cHJzID0gbWFrZV9hbmRzX2ltcGxp Y2l0KChFeHByICopIHByZWRFeHBycyk7CgkJfQoKCQkvKgoJCSAqIFBhcnRpYWwgaW5kZXhl cyBhZmZlY3QgZWFjaCBmb3JtIG9mIE9OIENPTkZMSUNUIGRpZmZlcmVudGx5OiBpZiBhCgkJ ICogY29uc3RyYWludCB3YXMgbmFtZWQsIHRoZW4gdGhlIHByZWRpY2F0ZXMgbXVzdCBiZSBp ZGVudGljYWwuICBJbgoJCSAqIGNvbnZlbnRpb25hbCBpbmZlcmVuY2UsIHRoZSBpbmRleCdz IHByZWRpY2F0ZSBtdXN0IGJlIGltcGxpZWQgYnkKCQkgKiB0aGUgV0hFUkUgY2xhdXNlLgoJ CSAqLwoJCWlmIChPaWRJc1ZhbGlkKGluZGV4T2lkRnJvbUNvbnN0cmFpbnQpKQoJCXsKCQkJ aWYgKGxpc3RfZGlmZmVyZW5jZShwcmVkRXhwcnMsIGluZmVySW5kZXhFeHBycykgIT0gTklM KQoJCQkJY29udGludWU7CgkJfQoJCWVsc2UKCQl7CgkJCWlmICghcHJlZGljYXRlX2ltcGxp ZWRfYnkocHJlZEV4cHJzLCBpbmZlckluZGV4RXhwcnMsIGZhbHNlKSkKCQkJCWNvbnRpbnVl OwoJCX0KCgkJLyogQWxsIGdvb2QgLS0gY29uc2lkZXIgdGhpcyBpbmRleCBhIG1hdGNoICov CgkJcmVzdWx0cyA9IGxhcHBlbmRfb2lkKHJlc3VsdHMsIGlkeEZvcm0tPmluZGV4cmVsaWQp OwoJCWZvdW5kVmFsaWQgfD0gaWR4Rm9ybS0+aW5kaXN2YWxpZDsKCX0KCgkvKiBDbG9zZSBh bGwgaW5kZXhlcyAqLwoJZm9yZWFjaF9wdHIoUmVsYXRpb25EYXRhLCBpZHhSZWwsIGluZGV4 UmVsTGlzdCkKCXsKCQlpbmRleF9jbG9zZShpZHhSZWwsIE5vTG9jayk7Cgl9CgoJbGlzdF9m cmVlKGluZGV4TGlzdCk7CglsaXN0X2ZyZWUoaW5kZXhSZWxMaXN0KTsKCXRhYmxlX2Nsb3Nl KHJlbGF0aW9uLCBOb0xvY2spOwoKCS8qIFdlIHJlcXVpcmUgYXQgbGVhc3Qgb25lIGluZGlz dmFsaWQgaW5kZXggKi8KCWlmIChyZXN1bHRzID09IE5JTCB8fCAhZm91bmRWYWxpZCkKCQll cmVwb3J0KEVSUk9SLAoJCQkJKGVycmNvZGUoRVJSQ09ERV9JTlZBTElEX0NPTFVNTl9SRUZF UkVOQ0UpLAoJCQkJIGVycm1zZygidGhlcmUgaXMgbm8gdW5pcXVlIG9yIGV4Y2x1c2lvbiBj b25zdHJhaW50IG1hdGNoaW5nIHRoZSBPTiBDT05GTElDVCBzcGVjaWZpY2F0aW9uIikpKTsK CglyZXR1cm4gcmVzdWx0czsKfQoKLyoKICogaW5mZXJfY29sbGF0aW9uX29wY2xhc3NfbWF0 Y2ggLSBlbnN1cmUgaW5mZXIgZWxlbWVudCBvcGNsYXNzL2NvbGxhdGlvbiBtYXRjaAogKgog KiBHaXZlbiB1bmlxdWUgaW5kZXggaW5mZXJlbmNlIGVsZW1lbnQgZnJvbSBpbmZlcmVuY2Ug c3BlY2lmaWNhdGlvbiwgaWYKICogY29sbGF0aW9uIHdhcyBzcGVjaWZpZWQsIG9yIGlmIG9w Y2xhc3Mgd2FzIHNwZWNpZmllZCwgdmVyaWZ5IHRoYXQgdGhlcmUgaXMKICogYXQgbGVhc3Qg b25lIG1hdGNoaW5nIGluZGV4ZWQgYXR0cmlidXRlIChvY2Nhc2lvbmFsbHksIHRoZXJlIG1h eSBiZSBtb3JlKS4KICogU2tpcCB0aGlzIGluIHRoZSBjb21tb24gY2FzZSB3aGVyZSBpbmZl cmVuY2Ugc3BlY2lmaWNhdGlvbiBkb2VzIG5vdCBpbmNsdWRlCiAqIGNvbGxhdGlvbiBvciBv cGNsYXNzIChpbnN0ZWFkIG1hdGNoaW5nIGV2ZXJ5dGhpbmcsIHJlZ2FyZGxlc3Mgb2YgY2F0 YWxvZ2VkCiAqIGNvbGxhdGlvbi9vcGNsYXNzIG9mIGluZGV4ZWQgYXR0cmlidXRlKS4KICoK ICogQXQgbGVhc3QgaGlzdG9yaWNhbGx5LCBQb3N0Z3JlcyBoYXMgbm90IG9mZmVyZWQgY29s bGF0aW9ucyBvciBvcGNsYXNzZXMKICogd2l0aCBhbHRlcm5hdGl2ZS10by1kZWZhdWx0IG5v dGlvbnMgb2YgZXF1YWxpdHksIHNvIHRoZXNlIGFkZGl0aW9uYWwKICogY3JpdGVyaWEgc2hv dWxkIG9ubHkgYmUgcmVxdWlyZWQgaW5mcmVxdWVudGx5LgogKgogKiBEb24ndCBnaXZlIHVw IGltbWVkaWF0ZWx5IHdoZW4gYW4gaW5mZXJlbmNlIGVsZW1lbnQgbWF0Y2hlcyBzb21lIGF0 dHJpYnV0ZQogKiBjYXRhbG9nZWQgYXMgaW5kZXhlZCBidXQgbm90IG1hdGNoaW5nIGFkZGl0 aW9uYWwgb3BjbGFzcy9jb2xsYXRpb24KICogY3JpdGVyaWEuICBUaGlzIGlzIGRvbmUgc28g dGhhdCB0aGUgaW1wbGVtZW50YXRpb24gaXMgYXMgZm9yZ2l2aW5nIGFzCiAqIHBvc3NpYmxl IG9mIHJlZHVuZGFuY3kgd2l0aGluIGNhdGFsb2dlZCBpbmRleCBhdHRyaWJ1dGVzIChvciwg bGVzcwogKiB1c2VmdWxseSwgd2l0aGluIGluZmVyZW5jZSBzcGVjaWZpY2F0aW9uIGVsZW1l bnRzKS4gIElmIGNvbGxhdGlvbnMgYWN0dWFsbHkKICogZGlmZmVyIGJldHdlZW4gYXBwYXJl bnRseSByZWR1bmRhbnRseSBpbmRleGVkIGF0dHJpYnV0ZXMgKHJlZHVuZGFudCB3aXRoaW4K ICogb3IgYWNyb3NzIGluZGV4ZXMpLCB0aGVuIHRoZXJlIHJlYWxseSBpcyBubyByZWR1bmRh bmN5IGFzIHN1Y2guCiAqCiAqIE5vdGUgdGhhdCBpZiBhbiBpbmZlcmVuY2UgZWxlbWVudCBz cGVjaWZpZXMgYW4gb3BjbGFzcyBhbmQgYSBjb2xsYXRpb24gYXQKICogb25jZSwgYm90aCBt dXN0IG1hdGNoIGluIGF0IGxlYXN0IG9uZSBwYXJ0aWN1bGFyIGF0dHJpYnV0ZSB3aXRoaW4g aW5kZXgKICogY2F0YWxvZyBkZWZpbml0aW9uIGluIG9yZGVyIGZvciB0aGF0IGluZmVyZW5j ZSBlbGVtZW50IHRvIGJlIGNvbnNpZGVyZWQKICogaW5mZXJyZWQvc2F0aXNmaWVkLgogKi8K c3RhdGljIGJvb2wKaW5mZXJfY29sbGF0aW9uX29wY2xhc3NfbWF0Y2goSW5mZXJlbmNlRWxl bSAqZWxlbSwgUmVsYXRpb24gaWR4UmVsLAoJCQkJCQkJICBMaXN0ICppZHhFeHBycykKewoJ QXR0ck51bWJlcgluYXR0OwoJT2lkCQkJaW5mZXJvcGZhbWlseSA9IEludmFsaWRPaWQ7IC8q IE9JRCBvZiBvcGNsYXNzIG9wZmFtaWx5ICovCglPaWQJCQlpbmZlcm9wY2lucHV0dHlwZSA9 IEludmFsaWRPaWQ7IC8qIE9JRCBvZiBvcGNsYXNzIGlucHV0IHR5cGUgKi8KCWludAkJCW5w bGFpbiA9IDA7CQkvKiAjIHBsYWluIGF0dHJzIG9ic2VydmVkICovCgoJLyoKCSAqIElmIGlu ZmVyZW5jZSBzcGVjaWZpY2F0aW9uIGVsZW1lbnQgbGFja3MgY29sbGF0aW9uL29wY2xhc3Ms IHRoZW4gbm8KCSAqIG5lZWQgdG8gY2hlY2sgZm9yIGV4YWN0IG1hdGNoLgoJICovCglpZiAo ZWxlbS0+aW5mZXJjb2xsaWQgPT0gSW52YWxpZE9pZCAmJiBlbGVtLT5pbmZlcm9wY2xhc3Mg PT0gSW52YWxpZE9pZCkKCQlyZXR1cm4gdHJ1ZTsKCgkvKgoJICogTG9va3VwIG9wZmFtaWx5 IGFuZCBpbnB1dCB0eXBlLCBmb3IgbWF0Y2hpbmcgaW5kZXhlcwoJICovCglpZiAoZWxlbS0+ aW5mZXJvcGNsYXNzKQoJewoJCWluZmVyb3BmYW1pbHkgPSBnZXRfb3BjbGFzc19mYW1pbHko ZWxlbS0+aW5mZXJvcGNsYXNzKTsKCQlpbmZlcm9wY2lucHV0dHlwZSA9IGdldF9vcGNsYXNz X2lucHV0X3R5cGUoZWxlbS0+aW5mZXJvcGNsYXNzKTsKCX0KCglmb3IgKG5hdHQgPSAxOyBu YXR0IDw9IGlkeFJlbC0+cmRfYXR0LT5uYXR0czsgbmF0dCsrKQoJewoJCU9pZAkJCW9wZmFt aWx5ID0gaWR4UmVsLT5yZF9vcGZhbWlseVtuYXR0IC0gMV07CgkJT2lkCQkJb3BjaW5wdXR0 eXBlID0gaWR4UmVsLT5yZF9vcGNpbnR5cGVbbmF0dCAtIDFdOwoJCU9pZAkJCWNvbGxhdGlv biA9IGlkeFJlbC0+cmRfaW5kY29sbGF0aW9uW25hdHQgLSAxXTsKCQlpbnQJCQlhdHRubyA9 IGlkeFJlbC0+cmRfaW5kZXgtPmluZGtleS52YWx1ZXNbbmF0dCAtIDFdOwoKCQlpZiAoYXR0 bm8gIT0gMCkKCQkJbnBsYWluKys7CgoJCWlmIChlbGVtLT5pbmZlcm9wY2xhc3MgIT0gSW52 YWxpZE9pZCAmJgoJCQkoaW5mZXJvcGZhbWlseSAhPSBvcGZhbWlseSB8fCBpbmZlcm9wY2lu cHV0dHlwZSAhPSBvcGNpbnB1dHR5cGUpKQoJCXsKCQkJLyogQXR0cmlidXRlIG5lZWRlZCB0 byBtYXRjaCBvcGNsYXNzLCBidXQgZGlkbid0ICovCgkJCWNvbnRpbnVlOwoJCX0KCgkJaWYg KGVsZW0tPmluZmVyY29sbGlkICE9IEludmFsaWRPaWQgJiYKCQkJZWxlbS0+aW5mZXJjb2xs aWQgIT0gY29sbGF0aW9uKQoJCXsKCQkJLyogQXR0cmlidXRlIG5lZWRlZCB0byBtYXRjaCBj b2xsYXRpb24sIGJ1dCBkaWRuJ3QgKi8KCQkJY29udGludWU7CgkJfQoKCQkvKiBJZiBvbmUg bWF0Y2hpbmcgaW5kZXggYXR0IGZvdW5kLCBnb29kIGVub3VnaCAtLSByZXR1cm4gdHJ1ZSAq LwoJCWlmIChJc0EoZWxlbS0+ZXhwciwgVmFyKSkKCQl7CgkJCWlmICgoKFZhciAqKSBlbGVt LT5leHByKS0+dmFyYXR0bm8gPT0gYXR0bm8pCgkJCQlyZXR1cm4gdHJ1ZTsKCQl9CgkJZWxz ZSBpZiAoYXR0bm8gPT0gMCkKCQl7CgkJCU5vZGUJICAgKm5hdHRFeHByID0gbGlzdF9udGgo aWR4RXhwcnMsIChuYXR0IC0gMSkgLSBucGxhaW4pOwoKCQkJLyoKCQkJICogTm90ZSB0aGF0 IHVubGlrZSByb3V0aW5lcyBsaWtlIG1hdGNoX2luZGV4X3RvX29wZXJhbmQoKSB3ZQoJCQkg KiBkb24ndCBuZWVkIHRvIGNhcmUgYWJvdXQgUmVsYWJlbFR5cGUuICBOZWl0aGVyIHRoZSBp bmRleAoJCQkgKiBkZWZpbml0aW9uIG5vciB0aGUgaW5mZXJlbmNlIGNsYXVzZSBzaG91bGQg Y29udGFpbiB0aGVtLgoJCQkgKi8KCQkJaWYgKGVxdWFsKGVsZW0tPmV4cHIsIG5hdHRFeHBy KSkKCQkJCXJldHVybiB0cnVlOwoJCX0KCX0KCglyZXR1cm4gZmFsc2U7Cn0KCi8qCiAqIGVz dGltYXRlX3JlbF9zaXplIC0gZXN0aW1hdGUgIyBwYWdlcyBhbmQgIyB0dXBsZXMgaW4gYSB0 YWJsZSBvciBpbmRleAogKgogKiBXZSBhbHNvIGVzdGltYXRlIHRoZSBmcmFjdGlvbiBvZiB0 aGUgcGFnZXMgdGhhdCBhcmUgbWFya2VkIGFsbC12aXNpYmxlIGluCiAqIHRoZSB2aXNpYmls aXR5IG1hcCwgZm9yIHVzZSBpbiBlc3RpbWF0aW9uIG9mIGluZGV4LW9ubHkgc2NhbnMuCiAq CiAqIElmIGF0dHJfd2lkdGhzIGlzbid0IE5VTEwsIGl0IHBvaW50cyB0byB0aGUgemVyby1p bmRleCBlbnRyeSBvZiB0aGUKICogcmVsYXRpb24ncyBhdHRyX3dpZHRoc1tdIGNhY2hlOyB3 ZSBmaWxsIHRoaXMgaW4gaWYgd2UgaGF2ZSBuZWVkIHRvIGNvbXB1dGUKICogdGhlIGF0dHJp YnV0ZSB3aWR0aHMgZm9yIGVzdGltYXRpb24gcHVycG9zZXMuCiAqLwp2b2lkCmVzdGltYXRl X3JlbF9zaXplKFJlbGF0aW9uIHJlbCwgaW50MzIgKmF0dHJfd2lkdGhzLAoJCQkJICBCbG9j a051bWJlciAqcGFnZXMsIGRvdWJsZSAqdHVwbGVzLCBkb3VibGUgKmFsbHZpc2ZyYWMpCnsK CUJsb2NrTnVtYmVyIGN1cnBhZ2VzOwoJQmxvY2tOdW1iZXIgcmVscGFnZXM7Cglkb3VibGUJ CXJlbHR1cGxlczsKCUJsb2NrTnVtYmVyIHJlbGFsbHZpc2libGU7Cglkb3VibGUJCWRlbnNp dHk7CgoJaWYgKFJFTEtJTkRfSEFTX1RBQkxFX0FNKHJlbC0+cmRfcmVsLT5yZWxraW5kKSkK CXsKCQl0YWJsZV9yZWxhdGlvbl9lc3RpbWF0ZV9zaXplKHJlbCwgYXR0cl93aWR0aHMsIHBh Z2VzLCB0dXBsZXMsCgkJCQkJCQkJCSBhbGx2aXNmcmFjKTsKCX0KCWVsc2UgaWYgKHJlbC0+ cmRfcmVsLT5yZWxraW5kID09IFJFTEtJTkRfSU5ERVgpCgl7CgkJLyoKCQkgKiBYWFg6IEl0 J2QgcHJvYmFibHkgYmUgZ29vZCB0byBtb3ZlIHRoaXMgaW50byBhIGNhbGxiYWNrLCBpbmRp dmlkdWFsCgkJICogaW5kZXggdHlwZXMgZS5nLiBrbm93IGlmIHRoZXkgaGF2ZSBhIG1ldGFw YWdlLgoJCSAqLwoKCQkvKiBpdCBoYXMgc3RvcmFnZSwgb2sgdG8gY2FsbCB0aGUgc21nciAq LwoJCWN1cnBhZ2VzID0gUmVsYXRpb25HZXROdW1iZXJPZkJsb2NrcyhyZWwpOwoKCQkvKiBy ZXBvcnQgZXN0aW1hdGVkICMgcGFnZXMgKi8KCQkqcGFnZXMgPSBjdXJwYWdlczsKCQkvKiBx dWljayBleGl0IGlmIHJlbCBpcyBjbGVhcmx5IGVtcHR5ICovCgkJaWYgKGN1cnBhZ2VzID09 IDApCgkJewoJCQkqdHVwbGVzID0gMDsKCQkJKmFsbHZpc2ZyYWMgPSAwOwoJCQlyZXR1cm47 CgkJfQoKCQkvKiBjb2VyY2UgdmFsdWVzIGluIHBnX2NsYXNzIHRvIG1vcmUgZGVzaXJhYmxl IHR5cGVzICovCgkJcmVscGFnZXMgPSAoQmxvY2tOdW1iZXIpIHJlbC0+cmRfcmVsLT5yZWxw YWdlczsKCQlyZWx0dXBsZXMgPSAoZG91YmxlKSByZWwtPnJkX3JlbC0+cmVsdHVwbGVzOwoJ CXJlbGFsbHZpc2libGUgPSAoQmxvY2tOdW1iZXIpIHJlbC0+cmRfcmVsLT5yZWxhbGx2aXNp YmxlOwoKCQkvKgoJCSAqIERpc2NvdW50IHRoZSBtZXRhcGFnZSB3aGlsZSBlc3RpbWF0aW5n IHRoZSBudW1iZXIgb2YgdHVwbGVzLiBUaGlzCgkJICogaXMgYSBrbHVnZSBiZWNhdXNlIGl0 IGFzc3VtZXMgbW9yZSB0aGFuIGl0IG91Z2h0IHRvIGFib3V0IGluZGV4CgkJICogc3RydWN0 dXJlLiAgQ3VycmVudGx5IGl0J3MgT0sgZm9yIGJ0cmVlLCBoYXNoLCBhbmQgR0lOIGluZGV4 ZXMgYnV0CgkJICogc3VzcGVjdCBmb3IgR2lTVCBpbmRleGVzLgoJCSAqLwoJCWlmIChyZWxw YWdlcyA+IDApCgkJewoJCQljdXJwYWdlcy0tOwoJCQlyZWxwYWdlcy0tOwoJCX0KCgkJLyog ZXN0aW1hdGUgbnVtYmVyIG9mIHR1cGxlcyBmcm9tIHByZXZpb3VzIHR1cGxlIGRlbnNpdHkg Ki8KCQlpZiAocmVsdHVwbGVzID49IDAgJiYgcmVscGFnZXMgPiAwKQoJCQlkZW5zaXR5ID0g cmVsdHVwbGVzIC8gKGRvdWJsZSkgcmVscGFnZXM7CgkJZWxzZQoJCXsKCQkJLyoKCQkJICog SWYgd2UgaGF2ZSBubyBkYXRhIGJlY2F1c2UgdGhlIHJlbGF0aW9uIHdhcyBuZXZlciB2YWN1 dW1lZCwKCQkJICogZXN0aW1hdGUgdHVwbGUgd2lkdGggZnJvbSBhdHRyaWJ1dGUgZGF0YXR5 cGVzLiAgV2UgYXNzdW1lIGhlcmUKCQkJICogdGhhdCB0aGUgcGFnZXMgYXJlIGNvbXBsZXRl bHkgZnVsbCwgd2hpY2ggaXMgT0sgZm9yIHRhYmxlcwoJCQkgKiAoc2luY2UgdGhleSd2ZSBw cmVzdW1hYmx5IG5vdCBiZWVuIFZBQ1VVTWVkIHlldCkgYnV0IGlzCgkJCSAqIHByb2JhYmx5 IGFuIG92ZXJlc3RpbWF0ZSBmb3IgaW5kZXhlcy4gIEZvcnR1bmF0ZWx5CgkJCSAqIGdldF9y ZWxhdGlvbl9pbmZvKCkgY2FuIGNsYW1wIHRoZSBvdmVyZXN0aW1hdGUgdG8gdGhlIHBhcmVu dAoJCQkgKiB0YWJsZSdzIHNpemUuCgkJCSAqCgkJCSAqIE5vdGU6IHRoaXMgY29kZSBpbnRl bnRpb25hbGx5IGRpc3JlZ2FyZHMgYWxpZ25tZW50CgkJCSAqIGNvbnNpZGVyYXRpb25zLCBi ZWNhdXNlIChhKSB0aGF0IHdvdWxkIGJlIGdpbGRpbmcgdGhlIGxpbHkKCQkJICogY29uc2lk ZXJpbmcgaG93IGNydWRlIHRoZSBlc3RpbWF0ZSBpcywgYW5kIChiKSBpdCBjcmVhdGVzCgkJ CSAqIHBsYXRmb3JtIGRlcGVuZGVuY2llcyBpbiB0aGUgZGVmYXVsdCBwbGFucyB3aGljaCBh cmUga2luZCBvZiBhCgkJCSAqIGhlYWRhY2hlIGZvciByZWdyZXNzaW9uIHRlc3RpbmcuCgkJ CSAqCgkJCSAqIFhYWDogU2hvdWxkIHRoaXMgbG9naWMgYmUgbW9yZSBpbmRleCBzcGVjaWZp Yz8KCQkJICovCgkJCWludDMyCQl0dXBsZV93aWR0aDsKCgkJCXR1cGxlX3dpZHRoID0gZ2V0 X3JlbF9kYXRhX3dpZHRoKHJlbCwgYXR0cl93aWR0aHMpOwoJCQl0dXBsZV93aWR0aCArPSBN QVhBTElHTihTaXplb2ZIZWFwVHVwbGVIZWFkZXIpOwoJCQl0dXBsZV93aWR0aCArPSBzaXpl b2YoSXRlbUlkRGF0YSk7CgkJCS8qIG5vdGU6IGludGVnZXIgZGl2aXNpb24gaXMgaW50ZW50 aW9uYWwgaGVyZSAqLwoJCQlkZW5zaXR5ID0gKEJMQ0tTWiAtIFNpemVPZlBhZ2VIZWFkZXJE YXRhKSAvIHR1cGxlX3dpZHRoOwoJCX0KCQkqdHVwbGVzID0gcmludChkZW5zaXR5ICogKGRv dWJsZSkgY3VycGFnZXMpOwoKCQkvKgoJCSAqIFdlIHVzZSByZWxhbGx2aXNpYmxlIGFzLWlz LCByYXRoZXIgdGhhbiBzY2FsaW5nIGl0IHVwIGxpa2Ugd2UgZG8KCQkgKiBmb3IgdGhlIHBh Z2VzIGFuZCB0dXBsZXMgY291bnRzLCBvbiB0aGUgdGhlb3J5IHRoYXQgYW55IHBhZ2VzIGFk ZGVkCgkJICogc2luY2UgdGhlIGxhc3QgVkFDVVVNIGFyZSBtb3N0IGxpa2VseSBub3QgbWFy a2VkIGFsbC12aXNpYmxlLiAgQnV0CgkJICogY29zdHNpemUuYyB3YW50cyBpdCBjb252ZXJ0 ZWQgdG8gYSBmcmFjdGlvbi4KCQkgKi8KCQlpZiAocmVsYWxsdmlzaWJsZSA9PSAwIHx8IGN1 cnBhZ2VzIDw9IDApCgkJCSphbGx2aXNmcmFjID0gMDsKCQllbHNlIGlmICgoZG91YmxlKSBy ZWxhbGx2aXNpYmxlID49IGN1cnBhZ2VzKQoJCQkqYWxsdmlzZnJhYyA9IDE7CgkJZWxzZQoJ CQkqYWxsdmlzZnJhYyA9IChkb3VibGUpIHJlbGFsbHZpc2libGUgLyBjdXJwYWdlczsKCX0K CWVsc2UKCXsKCQkvKgoJCSAqIEp1c3QgdXNlIHdoYXRldmVyJ3MgaW4gcGdfY2xhc3MuICBU aGlzIGNvdmVycyBmb3JlaWduIHRhYmxlcywKCQkgKiBzZXF1ZW5jZXMsIGFuZCBhbHNvIHJl bGtpbmRzIHdpdGhvdXQgc3RvcmFnZSAoc2hvdWxkbid0IGdldCBoZXJlPyk7CgkJICogc2Vl IGluaXRpYWxpemF0aW9ucyBpbiBBZGROZXdSZWxhdGlvblR1cGxlKCkuICBOb3RlIHRoYXQg RkRXIG11c3QKCQkgKiBjb3BlIGlmIHJlbHR1cGxlcyBpcyAtMSEKCQkgKi8KCQkqcGFnZXMg PSByZWwtPnJkX3JlbC0+cmVscGFnZXM7CgkJKnR1cGxlcyA9IHJlbC0+cmRfcmVsLT5yZWx0 dXBsZXM7CgkJKmFsbHZpc2ZyYWMgPSAwOwoJfQp9CgoKLyoKICogZ2V0X3JlbF9kYXRhX3dp ZHRoCiAqCiAqIEVzdGltYXRlIHRoZSBhdmVyYWdlIHdpZHRoIG9mICh0aGUgZGF0YSBwYXJ0 IG9mKSB0aGUgcmVsYXRpb24ncyB0dXBsZXMuCiAqCiAqIElmIGF0dHJfd2lkdGhzIGlzbid0 IE5VTEwsIGl0IHBvaW50cyB0byB0aGUgemVyby1pbmRleCBlbnRyeSBvZiB0aGUKICogcmVs YXRpb24ncyBhdHRyX3dpZHRoc1tdIGNhY2hlOyB1c2UgYW5kIHVwZGF0ZSB0aGF0IGNhY2hl IGFzIGFwcHJvcHJpYXRlLgogKgogKiBDdXJyZW50bHkgd2UgaWdub3JlIGRyb3BwZWQgY29s dW1ucy4gIElkZWFsbHkgdGhvc2Ugc2hvdWxkIGJlIGluY2x1ZGVkCiAqIGluIHRoZSByZXN1 bHQsIGJ1dCB3ZSBoYXZlbid0IGdvdCBhbnkgd2F5IHRvIGdldCBpbmZvIGFib3V0IHRoZW07 IGFuZAogKiBzaW5jZSB0aGV5IG1pZ2h0IGJlIG1vc3RseSBOVUxMcywgdHJlYXRpbmcgdGhl bSBhcyB6ZXJvLXdpZHRoIGlzIG5vdAogKiBuZWNlc3NhcmlseSB0aGUgd3JvbmcgdGhpbmcg YW55d2F5LgogKi8KaW50MzIKZ2V0X3JlbF9kYXRhX3dpZHRoKFJlbGF0aW9uIHJlbCwgaW50 MzIgKmF0dHJfd2lkdGhzKQp7CglpbnQ2NAkJdHVwbGVfd2lkdGggPSAwOwoJaW50CQkJaTsK Cglmb3IgKGkgPSAxOyBpIDw9IFJlbGF0aW9uR2V0TnVtYmVyT2ZBdHRyaWJ1dGVzKHJlbCk7 IGkrKykKCXsKCQlGb3JtX3BnX2F0dHJpYnV0ZSBhdHQgPSBUdXBsZURlc2NBdHRyKHJlbC0+ cmRfYXR0LCBpIC0gMSk7CgkJaW50MzIJCWl0ZW1fd2lkdGg7CgoJCWlmIChhdHQtPmF0dGlz ZHJvcHBlZCkKCQkJY29udGludWU7CgoJCS8qIHVzZSBwcmV2aW91c2x5IGNhY2hlZCBkYXRh LCBpZiBhbnkgKi8KCQlpZiAoYXR0cl93aWR0aHMgIT0gTlVMTCAmJiBhdHRyX3dpZHRoc1tp XSA+IDApCgkJewoJCQl0dXBsZV93aWR0aCArPSBhdHRyX3dpZHRoc1tpXTsKCQkJY29udGlu dWU7CgkJfQoKCQkvKiBUaGlzIHNob3VsZCBtYXRjaCBzZXRfcmVsX3dpZHRoKCkgaW4gY29z dHNpemUuYyAqLwoJCWl0ZW1fd2lkdGggPSBnZXRfYXR0YXZnd2lkdGgoUmVsYXRpb25HZXRS ZWxpZChyZWwpLCBpKTsKCQlpZiAoaXRlbV93aWR0aCA8PSAwKQoJCXsKCQkJaXRlbV93aWR0 aCA9IGdldF90eXBhdmd3aWR0aChhdHQtPmF0dHR5cGlkLCBhdHQtPmF0dHR5cG1vZCk7CgkJ CUFzc2VydChpdGVtX3dpZHRoID4gMCk7CgkJfQoJCWlmIChhdHRyX3dpZHRocyAhPSBOVUxM KQoJCQlhdHRyX3dpZHRoc1tpXSA9IGl0ZW1fd2lkdGg7CgkJdHVwbGVfd2lkdGggKz0gaXRl bV93aWR0aDsKCX0KCglyZXR1cm4gY2xhbXBfd2lkdGhfZXN0KHR1cGxlX3dpZHRoKTsKfQoK LyoKICogZ2V0X3JlbGF0aW9uX2RhdGFfd2lkdGgKICoKICogRXh0ZXJuYWwgQVBJIGZvciBn ZXRfcmVsX2RhdGFfd2lkdGg6IHNhbWUgYmVoYXZpb3IgZXhjZXB0IHdlIGhhdmUgdG8KICog b3BlbiB0aGUgcmVsY2FjaGUgZW50cnkuCiAqLwppbnQzMgpnZXRfcmVsYXRpb25fZGF0YV93 aWR0aChPaWQgcmVsaWQsIGludDMyICphdHRyX3dpZHRocykKewoJaW50MzIJCXJlc3VsdDsK CVJlbGF0aW9uCXJlbGF0aW9uOwoKCS8qIEFzIGFib3ZlLCBhc3N1bWUgcmVsYXRpb24gaXMg YWxyZWFkeSBsb2NrZWQgKi8KCXJlbGF0aW9uID0gdGFibGVfb3BlbihyZWxpZCwgTm9Mb2Nr KTsKCglyZXN1bHQgPSBnZXRfcmVsX2RhdGFfd2lkdGgocmVsYXRpb24sIGF0dHJfd2lkdGhz KTsKCgl0YWJsZV9jbG9zZShyZWxhdGlvbiwgTm9Mb2NrKTsKCglyZXR1cm4gcmVzdWx0Owp9 CgoKLyoKICogZ2V0X3JlbGF0aW9uX2NvbnN0cmFpbnRzCiAqCiAqIFJldHJpZXZlIHRoZSBh cHBsaWNhYmxlIGNvbnN0cmFpbnQgZXhwcmVzc2lvbnMgb2YgdGhlIGdpdmVuIHJlbGF0aW9u LgogKiBPbmx5IGNvbnN0cmFpbnRzIHRoYXQgaGF2ZSBiZWVuIHZhbGlkYXRlZCBhcmUgY29u c2lkZXJlZC4KICoKICogUmV0dXJucyBhIExpc3QgKHBvc3NpYmx5IGVtcHR5KSBvZiBjb25z dHJhaW50IGV4cHJlc3Npb25zLiAgRWFjaCBvbmUKICogaGFzIGJlZW4gY2Fub25pY2FsaXpl ZCwgYW5kIGl0cyBWYXJzIGFyZSBjaGFuZ2VkIHRvIGhhdmUgdGhlIHZhcm5vCiAqIGluZGlj YXRlZCBieSByZWwtPnJlbGlkLiAgVGhpcyBhbGxvd3MgdGhlIGV4cHJlc3Npb25zIHRvIGJl IGVhc2lseQogKiBjb21wYXJlZCB0byBleHByZXNzaW9ucyB0YWtlbiBmcm9tIFdIRVJFLgog KgogKiBJZiBpbmNsdWRlX25vaW5oZXJpdCBpcyB0cnVlLCBpdCdzIG9rYXkgdG8gaW5jbHVk ZSBjb25zdHJhaW50cyB0aGF0CiAqIGFyZSBtYXJrZWQgTk8gSU5IRVJJVC4KICoKICogSWYg aW5jbHVkZV9ub3RudWxsIGlzIHRydWUsICJjb2wgSVMgTk9UIE5VTEwiIGV4cHJlc3Npb25z IGFyZSBnZW5lcmF0ZWQKICogYW5kIGFkZGVkIHRvIHRoZSByZXN1bHQgZm9yIGVhY2ggY29s dW1uIHRoYXQncyBtYXJrZWQgYXR0bm90bnVsbC4KICoKICogSWYgaW5jbHVkZV9wYXJ0aXRp b24gaXMgdHJ1ZSwgYW5kIHRoZSByZWxhdGlvbiBpcyBhIHBhcnRpdGlvbiwKICogYWxzbyBp bmNsdWRlIHRoZSBwYXJ0aXRpb25pbmcgY29uc3RyYWludHMuCiAqCiAqIE5vdGU6IGF0IHBy ZXNlbnQgdGhpcyBpcyBpbnZva2VkIGF0IG1vc3Qgb25jZSBwZXIgcmVsYXRpb24gcGVyIHBs YW5uZXIKICogcnVuLCBhbmQgaW4gbWFueSBjYXNlcyBpdCB3b24ndCBiZSBpbnZva2VkIGF0 IGFsbCwgc28gdGhlcmUgc2VlbXMgbm8KICogcG9pbnQgaW4gY2FjaGluZyB0aGUgZGF0YSBp biBSZWxPcHRJbmZvLgogKi8Kc3RhdGljIExpc3QgKgpnZXRfcmVsYXRpb25fY29uc3RyYWlu dHMoUGxhbm5lckluZm8gKnJvb3QsCgkJCQkJCSBPaWQgcmVsYXRpb25PYmplY3RJZCwgUmVs T3B0SW5mbyAqcmVsLAoJCQkJCQkgYm9vbCBpbmNsdWRlX25vaW5oZXJpdCwKCQkJCQkJIGJv b2wgaW5jbHVkZV9ub3RudWxsLAoJCQkJCQkgYm9vbCBpbmNsdWRlX3BhcnRpdGlvbikKewoJ TGlzdAkgICAqcmVzdWx0ID0gTklMOwoJSW5kZXgJCXZhcm5vID0gcmVsLT5yZWxpZDsKCVJl bGF0aW9uCXJlbGF0aW9uOwoJVHVwbGVDb25zdHIgKmNvbnN0cjsKCgkvKgoJICogV2UgYXNz dW1lIHRoZSByZWxhdGlvbiBoYXMgYWxyZWFkeSBiZWVuIHNhZmVseSBsb2NrZWQuCgkgKi8K CXJlbGF0aW9uID0gdGFibGVfb3BlbihyZWxhdGlvbk9iamVjdElkLCBOb0xvY2spOwoKCWNv bnN0ciA9IHJlbGF0aW9uLT5yZF9hdHQtPmNvbnN0cjsKCWlmIChjb25zdHIgIT0gTlVMTCkK CXsKCQlpbnQJCQludW1fY2hlY2sgPSBjb25zdHItPm51bV9jaGVjazsKCQlpbnQJCQlpOwoK CQlmb3IgKGkgPSAwOyBpIDwgbnVtX2NoZWNrOyBpKyspCgkJewoJCQlOb2RlCSAgICpjZXhw cjsKCgkJCS8qCgkJCSAqIElmIHRoaXMgY29uc3RyYWludCBoYXNuJ3QgYmVlbiBmdWxseSB2 YWxpZGF0ZWQgeWV0LCB3ZSBtdXN0CgkJCSAqIGlnbm9yZSBpdCBoZXJlLgoJCQkgKi8KCQkJ aWYgKCFjb25zdHItPmNoZWNrW2ldLmNjdmFsaWQpCgkJCQljb250aW51ZTsKCgkJCS8qCgkJ CSAqIE5PVCBFTkZPUkNFRCBjb25zdHJhaW50cyBhcmUgYWx3YXlzIG1hcmtlZCBhcyBpbnZh bGlkLCB3aGljaAoJCQkgKiBzaG91bGQgaGF2ZSBiZWVuIGlnbm9yZWQuCgkJCSAqLwoJCQlB c3NlcnQoY29uc3RyLT5jaGVja1tpXS5jY2VuZm9yY2VkKTsKCgkJCS8qCgkJCSAqIEFsc28g aWdub3JlIGlmIE5PIElOSEVSSVQgYW5kIHdlIHdlcmVuJ3QgdG9sZCB0aGF0IHRoYXQncyBz YWZlLgoJCQkgKi8KCQkJaWYgKGNvbnN0ci0+Y2hlY2tbaV0uY2Nub2luaGVyaXQgJiYgIWlu Y2x1ZGVfbm9pbmhlcml0KQoJCQkJY29udGludWU7CgoJCQljZXhwciA9IHN0cmluZ1RvTm9k ZShjb25zdHItPmNoZWNrW2ldLmNjYmluKTsKCgkJCS8qCgkJCSAqIEZpeCBWYXJzIHRvIGhh dmUgdGhlIGRlc2lyZWQgdmFybm8uICBUaGlzIG11c3QgYmUgZG9uZSBiZWZvcmUKCQkJICog Y29uc3Qtc2ltcGxpZmljYXRpb24gYmVjYXVzZSBldmFsX2NvbnN0X2V4cHJlc3Npb25zIHJl ZHVjZXMKCQkJICogTnVsbFRlc3QgZm9yIFZhcnMgYmFzZWQgb24gdmFybm8uCgkJCSAqLwoJ CQlpZiAodmFybm8gIT0gMSkKCQkJCUNoYW5nZVZhck5vZGVzKGNleHByLCAxLCB2YXJubywg MCk7CgoJCQkvKgoJCQkgKiBSdW4gZWFjaCBleHByZXNzaW9uIHRocm91Z2ggY29uc3Qtc2lt cGxpZmljYXRpb24gYW5kCgkJCSAqIGNhbm9uaWNhbGl6YXRpb24uICBUaGlzIGlzIG5vdCBq dXN0IGFuIG9wdGltaXphdGlvbiwgYnV0IGlzCgkJCSAqIG5lY2Vzc2FyeSwgYmVjYXVzZSB3 ZSB3aWxsIGJlIGNvbXBhcmluZyBpdCB0bwoJCQkgKiBzaW1pbGFybHktcHJvY2Vzc2VkIHF1 YWwgY2xhdXNlcywgYW5kIG1heSBmYWlsIHRvIGRldGVjdCB2YWxpZAoJCQkgKiBtYXRjaGVz IHdpdGhvdXQgdGhpcy4gIFRoaXMgbXVzdCBtYXRjaCB0aGUgcHJvY2Vzc2luZyBkb25lIHRv CgkJCSAqIHF1YWwgY2xhdXNlcyBpbiBwcmVwcm9jZXNzX2V4cHJlc3Npb24oKSEgIChXZSBj YW4gc2tpcCB0aGUKCQkJICogc3R1ZmYgaW52b2x2aW5nIHN1YnF1ZXJpZXMsIGhvd2V2ZXIs IHNpbmNlIHdlIGRvbid0IGFsbG93IGFueQoJCQkgKiBpbiBjaGVjayBjb25zdHJhaW50cy4p CgkJCSAqLwoJCQljZXhwciA9IGV2YWxfY29uc3RfZXhwcmVzc2lvbnMocm9vdCwgY2V4cHIp OwoKCQkJY2V4cHIgPSAoTm9kZSAqKSBjYW5vbmljYWxpemVfcXVhbCgoRXhwciAqKSBjZXhw ciwgdHJ1ZSk7CgoJCQkvKgoJCQkgKiBGaW5hbGx5LCBjb252ZXJ0IHRvIGltcGxpY2l0LUFO RCBmb3JtYXQgKHRoYXQgaXMsIGEgTGlzdCkgYW5kCgkJCSAqIGFwcGVuZCB0aGUgcmVzdWx0 aW5nIGl0ZW0ocykgdG8gb3VyIG91dHB1dCBsaXN0LgoJCQkgKi8KCQkJcmVzdWx0ID0gbGlz dF9jb25jYXQocmVzdWx0LAoJCQkJCQkJCSBtYWtlX2FuZHNfaW1wbGljaXQoKEV4cHIgKikg Y2V4cHIpKTsKCQl9CgoJCS8qIEFkZCBOT1QgTlVMTCBjb25zdHJhaW50cyBpbiBleHByZXNz aW9uIGZvcm0sIGlmIHJlcXVlc3RlZCAqLwoJCWlmIChpbmNsdWRlX25vdG51bGwgJiYgY29u c3RyLT5oYXNfbm90X251bGwpCgkJewoJCQlpbnQJCQluYXR0cyA9IHJlbGF0aW9uLT5yZF9h dHQtPm5hdHRzOwoKCQkJZm9yIChpID0gMTsgaSA8PSBuYXR0czsgaSsrKQoJCQl7CgkJCQlD b21wYWN0QXR0cmlidXRlICphdHQgPSBUdXBsZURlc2NDb21wYWN0QXR0cihyZWxhdGlvbi0+ cmRfYXR0LCBpIC0gMSk7CgoJCQkJaWYgKGF0dC0+YXR0bnVsbGFiaWxpdHkgPT0gQVRUTlVM TEFCTEVfVkFMSUQgJiYgIWF0dC0+YXR0aXNkcm9wcGVkKQoJCQkJewoJCQkJCUZvcm1fcGdf YXR0cmlidXRlIHdob2xlYXR0ID0gVHVwbGVEZXNjQXR0cihyZWxhdGlvbi0+cmRfYXR0LCBp IC0gMSk7CgkJCQkJTnVsbFRlc3QgICAqbnRlc3QgPSBtYWtlTm9kZShOdWxsVGVzdCk7CgoJ CQkJCW50ZXN0LT5hcmcgPSAoRXhwciAqKSBtYWtlVmFyKHZhcm5vLAoJCQkJCQkJCQkJCQkg IGksCgkJCQkJCQkJCQkJCSAgd2hvbGVhdHQtPmF0dHR5cGlkLAoJCQkJCQkJCQkJCQkgIHdo b2xlYXR0LT5hdHR0eXBtb2QsCgkJCQkJCQkJCQkJCSAgd2hvbGVhdHQtPmF0dGNvbGxhdGlv biwKCQkJCQkJCQkJCQkJICAwKTsKCQkJCQludGVzdC0+bnVsbHRlc3R0eXBlID0gSVNfTk9U X05VTEw7CgoJCQkJCS8qCgkJCQkJICogYXJnaXNyb3c9ZmFsc2UgaXMgY29ycmVjdCBldmVu IGZvciBhIGNvbXBvc2l0ZSBjb2x1bW4sCgkJCQkJICogYmVjYXVzZSBhdHRub3RudWxsIGRv ZXMgbm90IHJlcHJlc2VudCBhIFNRTC1zcGVjIElTIE5PVAoJCQkJCSAqIE5VTEwgdGVzdCBp biBzdWNoIGEgY2FzZSwganVzdCBJUyBESVNUSU5DVCBGUk9NIE5VTEwuCgkJCQkJICovCgkJ CQkJbnRlc3QtPmFyZ2lzcm93ID0gZmFsc2U7CgkJCQkJbnRlc3QtPmxvY2F0aW9uID0gLTE7 CgkJCQkJcmVzdWx0ID0gbGFwcGVuZChyZXN1bHQsIG50ZXN0KTsKCQkJCX0KCQkJfQoJCX0K CX0KCgkvKgoJICogQWRkIHBhcnRpdGlvbmluZyBjb25zdHJhaW50cywgaWYgcmVxdWVzdGVk LgoJICovCglpZiAoaW5jbHVkZV9wYXJ0aXRpb24gJiYgcmVsYXRpb24tPnJkX3JlbC0+cmVs aXNwYXJ0aXRpb24pCgl7CgkJLyogbWFrZSBzdXJlIHJlbC0+cGFydGl0aW9uX3F1YWwgaXMg c2V0ICovCgkJc2V0X2Jhc2VyZWxfcGFydGl0aW9uX2NvbnN0cmFpbnQocmVsYXRpb24sIHJl bCk7CgkJcmVzdWx0ID0gbGlzdF9jb25jYXQocmVzdWx0LCByZWwtPnBhcnRpdGlvbl9xdWFs KTsKCX0KCgkvKgoJICogRXhwYW5kIHZpcnR1YWwgZ2VuZXJhdGVkIGNvbHVtbnMgaW4gdGhl IGNvbnN0cmFpbnQgZXhwcmVzc2lvbnMuCgkgKi8KCWlmIChyZXN1bHQpCgkJcmVzdWx0ID0g KExpc3QgKikgZXhwYW5kX2dlbmVyYXRlZF9jb2x1bW5zX2luX2V4cHIoKE5vZGUgKikgcmVz dWx0LAoJCQkJCQkJCQkJCQkJCSAgIHJlbGF0aW9uLAoJCQkJCQkJCQkJCQkJCSAgIHZhcm5v KTsKCgl0YWJsZV9jbG9zZShyZWxhdGlvbiwgTm9Mb2NrKTsKCglyZXR1cm4gcmVzdWx0Owp9 CgovKgogKiBUcnkgbG9hZGluZyBkYXRhIGZvciB0aGUgc3RhdGlzdGljcyBvYmplY3QuCiAq CiAqIFdlIGRvbid0IGtub3cgaWYgdGhlIGRhdGEgKHNwZWNpZmllZCBieSBzdGF0T2lkIGFu ZCBpbmggdmFsdWUpIGV4aXN0LgogKiBUaGUgcmVzdWx0IGlzIHN0b3JlZCBpbiBzdGFpbmZv cyBsaXN0LgogKi8Kc3RhdGljIHZvaWQKZ2V0X3JlbGF0aW9uX3N0YXRpc3RpY3Nfd29ya2Vy KExpc3QgKipzdGFpbmZvcywgUmVsT3B0SW5mbyAqcmVsLAoJCQkJCQkJICAgT2lkIHN0YXRP aWQsIGJvb2wgaW5oLAoJCQkJCQkJICAgQml0bWFwc2V0ICprZXlzLCBMaXN0ICpleHBycykK ewoJRm9ybV9wZ19zdGF0aXN0aWNfZXh0X2RhdGEgZGF0YUZvcm07CglIZWFwVHVwbGUJZHR1 cDsKCglkdHVwID0gU2VhcmNoU3lzQ2FjaGUyKFNUQVRFWFREQVRBU1RYT0lELAoJCQkJCQkg ICBPYmplY3RJZEdldERhdHVtKHN0YXRPaWQpLCBCb29sR2V0RGF0dW0oaW5oKSk7CglpZiAo IUhlYXBUdXBsZUlzVmFsaWQoZHR1cCkpCgkJcmV0dXJuOwoKCWRhdGFGb3JtID0gKEZvcm1f cGdfc3RhdGlzdGljX2V4dF9kYXRhKSBHRVRTVFJVQ1QoZHR1cCk7CgoJLyogYWRkIG9uZSBT dGF0aXN0aWNFeHRJbmZvIGZvciBlYWNoIGtpbmQgYnVpbHQgKi8KCWlmIChzdGF0ZXh0X2lz X2tpbmRfYnVpbHQoZHR1cCwgU1RBVFNfRVhUX05ESVNUSU5DVCkpCgl7CgkJU3RhdGlzdGlj RXh0SW5mbyAqaW5mbyA9IG1ha2VOb2RlKFN0YXRpc3RpY0V4dEluZm8pOwoKCQlpbmZvLT5z dGF0T2lkID0gc3RhdE9pZDsKCQlpbmZvLT5pbmhlcml0ID0gZGF0YUZvcm0tPnN0eGRpbmhl cml0OwoJCWluZm8tPnJlbCA9IHJlbDsKCQlpbmZvLT5raW5kID0gU1RBVFNfRVhUX05ESVNU SU5DVDsKCQlpbmZvLT5rZXlzID0gYm1zX2NvcHkoa2V5cyk7CgkJaW5mby0+ZXhwcnMgPSBl eHByczsKCgkJKnN0YWluZm9zID0gbGFwcGVuZCgqc3RhaW5mb3MsIGluZm8pOwoJfQoKCWlm IChzdGF0ZXh0X2lzX2tpbmRfYnVpbHQoZHR1cCwgU1RBVFNfRVhUX0RFUEVOREVOQ0lFUykp Cgl7CgkJU3RhdGlzdGljRXh0SW5mbyAqaW5mbyA9IG1ha2VOb2RlKFN0YXRpc3RpY0V4dElu Zm8pOwoKCQlpbmZvLT5zdGF0T2lkID0gc3RhdE9pZDsKCQlpbmZvLT5pbmhlcml0ID0gZGF0 YUZvcm0tPnN0eGRpbmhlcml0OwoJCWluZm8tPnJlbCA9IHJlbDsKCQlpbmZvLT5raW5kID0g U1RBVFNfRVhUX0RFUEVOREVOQ0lFUzsKCQlpbmZvLT5rZXlzID0gYm1zX2NvcHkoa2V5cyk7 CgkJaW5mby0+ZXhwcnMgPSBleHByczsKCgkJKnN0YWluZm9zID0gbGFwcGVuZCgqc3RhaW5m b3MsIGluZm8pOwoJfQoKCWlmIChzdGF0ZXh0X2lzX2tpbmRfYnVpbHQoZHR1cCwgU1RBVFNf RVhUX01DVikpCgl7CgkJU3RhdGlzdGljRXh0SW5mbyAqaW5mbyA9IG1ha2VOb2RlKFN0YXRp c3RpY0V4dEluZm8pOwoKCQlpbmZvLT5zdGF0T2lkID0gc3RhdE9pZDsKCQlpbmZvLT5pbmhl cml0ID0gZGF0YUZvcm0tPnN0eGRpbmhlcml0OwoJCWluZm8tPnJlbCA9IHJlbDsKCQlpbmZv LT5raW5kID0gU1RBVFNfRVhUX01DVjsKCQlpbmZvLT5rZXlzID0gYm1zX2NvcHkoa2V5cyk7 CgkJaW5mby0+ZXhwcnMgPSBleHByczsKCgkJKnN0YWluZm9zID0gbGFwcGVuZCgqc3RhaW5m b3MsIGluZm8pOwoJfQoKCWlmIChzdGF0ZXh0X2lzX2tpbmRfYnVpbHQoZHR1cCwgU1RBVFNf RVhUX0VYUFJFU1NJT05TKSkKCXsKCQlTdGF0aXN0aWNFeHRJbmZvICppbmZvID0gbWFrZU5v ZGUoU3RhdGlzdGljRXh0SW5mbyk7CgoJCWluZm8tPnN0YXRPaWQgPSBzdGF0T2lkOwoJCWlu Zm8tPmluaGVyaXQgPSBkYXRhRm9ybS0+c3R4ZGluaGVyaXQ7CgkJaW5mby0+cmVsID0gcmVs OwoJCWluZm8tPmtpbmQgPSBTVEFUU19FWFRfRVhQUkVTU0lPTlM7CgkJaW5mby0+a2V5cyA9 IGJtc19jb3B5KGtleXMpOwoJCWluZm8tPmV4cHJzID0gZXhwcnM7CgoJCSpzdGFpbmZvcyA9 IGxhcHBlbmQoKnN0YWluZm9zLCBpbmZvKTsKCX0KCglSZWxlYXNlU3lzQ2FjaGUoZHR1cCk7 Cn0KCi8qCiAqIGdldF9yZWxhdGlvbl9zdGF0aXN0aWNzCiAqCQlSZXRyaWV2ZSBleHRlbmRl ZCBzdGF0aXN0aWNzIGRlZmluZWQgb24gdGhlIHRhYmxlLgogKgogKiBSZXR1cm5zIGEgTGlz dCAocG9zc2libHkgZW1wdHkpIG9mIFN0YXRpc3RpY0V4dEluZm8gb2JqZWN0cyBkZXNjcmli aW5nCiAqIHRoZSBzdGF0aXN0aWNzLiAgTm90ZSB0aGF0IHRoaXMgZG9lc24ndCBsb2FkIHRo ZSBhY3R1YWwgc3RhdGlzdGljcyBkYXRhLAogKiBqdXN0IHRoZSBpZGVudGlmeWluZyBtZXRh ZGF0YS4gIE9ubHkgc3RhdHMgYWN0dWFsbHkgYnVpbHQgYXJlIGNvbnNpZGVyZWQuCiAqLwpz dGF0aWMgTGlzdCAqCmdldF9yZWxhdGlvbl9zdGF0aXN0aWNzKFBsYW5uZXJJbmZvICpyb290 LCBSZWxPcHRJbmZvICpyZWwsCgkJCQkJCVJlbGF0aW9uIHJlbGF0aW9uKQp7CglJbmRleAkJ dmFybm8gPSByZWwtPnJlbGlkOwoJTGlzdAkgICAqc3RhdG9pZGxpc3Q7CglMaXN0CSAgICpz dGFpbmZvcyA9IE5JTDsKCUxpc3RDZWxsICAgKmw7CgoJc3RhdG9pZGxpc3QgPSBSZWxhdGlv bkdldFN0YXRFeHRMaXN0KHJlbGF0aW9uKTsKCglmb3JlYWNoKGwsIHN0YXRvaWRsaXN0KQoJ ewoJCU9pZAkJCXN0YXRPaWQgPSBsZmlyc3Rfb2lkKGwpOwoJCUZvcm1fcGdfc3RhdGlzdGlj X2V4dCBzdGFGb3JtOwoJCUhlYXBUdXBsZQlodHVwOwoJCUJpdG1hcHNldCAgKmtleXMgPSBO VUxMOwoJCUxpc3QJICAgKmV4cHJzID0gTklMOwoJCWludAkJCWk7CgoJCWh0dXAgPSBTZWFy Y2hTeXNDYWNoZTEoU1RBVEVYVE9JRCwgT2JqZWN0SWRHZXREYXR1bShzdGF0T2lkKSk7CgkJ aWYgKCFIZWFwVHVwbGVJc1ZhbGlkKGh0dXApKQoJCQllbG9nKEVSUk9SLCAiY2FjaGUgbG9v a3VwIGZhaWxlZCBmb3Igc3RhdGlzdGljcyBvYmplY3QgJXUiLCBzdGF0T2lkKTsKCQlzdGFG b3JtID0gKEZvcm1fcGdfc3RhdGlzdGljX2V4dCkgR0VUU1RSVUNUKGh0dXApOwoKCQkvKgoJ CSAqIEZpcnN0LCBidWlsZCB0aGUgYXJyYXkgb2YgY29sdW1ucyBjb3ZlcmVkLiAgVGhpcyBp cyB1bHRpbWF0ZWx5CgkJICogd2FzdGVkIGlmIG5vIHN0YXRzIHdpdGhpbiB0aGUgb2JqZWN0 IGhhdmUgYWN0dWFsbHkgYmVlbiBidWlsdCwgYnV0CgkJICogaXQgZG9lc24ndCBzZWVtIHdv cnRoIHRyb3VibGluZyBvdmVyIHRoYXQgY2FzZS4KCQkgKi8KCQlmb3IgKGkgPSAwOyBpIDwg c3RhRm9ybS0+c3R4a2V5cy5kaW0xOyBpKyspCgkJCWtleXMgPSBibXNfYWRkX21lbWJlcihr ZXlzLCBzdGFGb3JtLT5zdHhrZXlzLnZhbHVlc1tpXSk7CgoJCS8qCgkJICogUHJlcHJvY2Vz cyBleHByZXNzaW9ucyAoaWYgYW55KS4gV2UgcmVhZCB0aGUgZXhwcmVzc2lvbnMsIGZpeCB0 aGUKCQkgKiB2YXJub3MsIGFuZCBydW4gdGhlbSB0aHJvdWdoIGV2YWxfY29uc3RfZXhwcmVz c2lvbnMuCgkJICoKCQkgKiBYWFggV2UgZG9uJ3Qga25vdyB5ZXQgaWYgdGhlcmUgYXJlIGFu eSBkYXRhIGZvciB0aGlzIHN0YXRzIG9iamVjdCwKCQkgKiB3aXRoIGVpdGhlciBzdHhkaW5o ZXJpdCB2YWx1ZS4gQnV0IGl0J3MgcmVhc29uYWJsZSB0byBhc3N1bWUgdGhlcmUKCQkgKiBp cyBhdCBsZWFzdCBvbmUgb2YgdGhvc2UsIHBvc3NpYmx5IGJvdGguIFNvIGl0J3MgYmV0dGVy IHRvIHByb2Nlc3MKCQkgKiBrZXlzIGFuZCBleHByZXNzaW9ucyBoZXJlLgoJCSAqLwoJCXsK CQkJYm9vbAkJaXNudWxsOwoJCQlEYXR1bQkJZGF0dW07CgoJCQkvKiBkZWNvZGUgZXhwcmVz c2lvbiAoaWYgYW55KSAqLwoJCQlkYXR1bSA9IFN5c0NhY2hlR2V0QXR0cihTVEFURVhUT0lE LCBodHVwLAoJCQkJCQkJCQlBbnVtX3BnX3N0YXRpc3RpY19leHRfc3R4ZXhwcnMsICZpc251 bGwpOwoKCQkJaWYgKCFpc251bGwpCgkJCXsKCQkJCWNoYXIJICAgKmV4cHJzU3RyaW5nOwoK CQkJCWV4cHJzU3RyaW5nID0gVGV4dERhdHVtR2V0Q1N0cmluZyhkYXR1bSk7CgkJCQlleHBy cyA9IChMaXN0ICopIHN0cmluZ1RvTm9kZShleHByc1N0cmluZyk7CgkJCQlwZnJlZShleHBy c1N0cmluZyk7CgoJCQkJLyogRXhwYW5kIHZpcnR1YWwgZ2VuZXJhdGVkIGNvbHVtbnMgaW4g dGhlIGV4cHJlc3Npb25zICovCgkJCQlleHBycyA9IChMaXN0ICopIGV4cGFuZF9nZW5lcmF0 ZWRfY29sdW1uc19pbl9leHByKChOb2RlICopIGV4cHJzLCByZWxhdGlvbiwgMSk7CgoJCQkJ LyoKCQkJCSAqIE1vZGlmeSB0aGUgY29waWVzIHdlIG9idGFpbiBmcm9tIHRoZSByZWxjYWNo ZSB0byBoYXZlIHRoZQoJCQkJICogY29ycmVjdCB2YXJubyBmb3IgdGhlIHBhcmVudCByZWxh dGlvbiwgc28gdGhhdCB0aGV5IG1hdGNoCgkJCQkgKiB1cCBjb3JyZWN0bHkgYWdhaW5zdCBx dWFsIGNsYXVzZXMuCgkJCQkgKgoJCQkJICogVGhpcyBtdXN0IGJlIGRvbmUgYmVmb3JlIGNv bnN0LXNpbXBsaWZpY2F0aW9uIGJlY2F1c2UKCQkJCSAqIGV2YWxfY29uc3RfZXhwcmVzc2lv bnMgcmVkdWNlcyBOdWxsVGVzdCBmb3IgVmFycyBiYXNlZCBvbgoJCQkJICogdmFybm8uCgkJ CQkgKi8KCQkJCWlmICh2YXJubyAhPSAxKQoJCQkJCUNoYW5nZVZhck5vZGVzKChOb2RlICop IGV4cHJzLCAxLCB2YXJubywgMCk7CgoJCQkJLyoKCQkJCSAqIFJ1biB0aGUgZXhwcmVzc2lv bnMgdGhyb3VnaCBldmFsX2NvbnN0X2V4cHJlc3Npb25zLiBUaGlzIGlzCgkJCQkgKiBub3Qg anVzdCBhbiBvcHRpbWl6YXRpb24sIGJ1dCBpcyBuZWNlc3NhcnksIGJlY2F1c2UgdGhlCgkJ CQkgKiBwbGFubmVyIHdpbGwgYmUgY29tcGFyaW5nIHRoZW0gdG8gc2ltaWxhcmx5LXByb2Nl c3NlZCBxdWFsCgkJCQkgKiBjbGF1c2VzLCBhbmQgbWF5IGZhaWwgdG8gZGV0ZWN0IHZhbGlk IG1hdGNoZXMgd2l0aG91dCB0aGlzLgoJCQkJICogV2UgbXVzdCBub3QgdXNlIGNhbm9uaWNh bGl6ZV9xdWFsLCBob3dldmVyLCBzaW5jZSB0aGVzZQoJCQkJICogYXJlbid0IHF1YWwgZXhw cmVzc2lvbnMuCgkJCQkgKi8KCQkJCWV4cHJzID0gKExpc3QgKikgZXZhbF9jb25zdF9leHBy ZXNzaW9ucyhyb290LCAoTm9kZSAqKSBleHBycyk7CgoJCQkJLyogTWF5IGFzIHdlbGwgZml4 IG9wZnVuY2lkcyB0b28gKi8KCQkJCWZpeF9vcGZ1bmNpZHMoKE5vZGUgKikgZXhwcnMpOwoJ CQl9CgkJfQoKCQkvKiBleHRyYWN0IHN0YXRpc3RpY3MgZm9yIHBvc3NpYmxlIHZhbHVlcyBv ZiBzdHhkaW5oZXJpdCBmbGFnICovCgoJCWdldF9yZWxhdGlvbl9zdGF0aXN0aWNzX3dvcmtl cigmc3RhaW5mb3MsIHJlbCwgc3RhdE9pZCwgdHJ1ZSwga2V5cywgZXhwcnMpOwoKCQlnZXRf cmVsYXRpb25fc3RhdGlzdGljc193b3JrZXIoJnN0YWluZm9zLCByZWwsIHN0YXRPaWQsIGZh bHNlLCBrZXlzLCBleHBycyk7CgoJCVJlbGVhc2VTeXNDYWNoZShodHVwKTsKCQlibXNfZnJl ZShrZXlzKTsKCX0KCglsaXN0X2ZyZWUoc3RhdG9pZGxpc3QpOwoKCXJldHVybiBzdGFpbmZv czsKfQoKLyoKICogcmVsYXRpb25fZXhjbHVkZWRfYnlfY29uc3RyYWludHMKICoKICogRGV0 ZWN0IHdoZXRoZXIgdGhlIHJlbGF0aW9uIG5lZWQgbm90IGJlIHNjYW5uZWQgYmVjYXVzZSBp dCBoYXMgZWl0aGVyCiAqIHNlbGYtaW5jb25zaXN0ZW50IHJlc3RyaWN0aW9ucywgb3IgcmVz dHJpY3Rpb25zIGluY29uc2lzdGVudCB3aXRoIHRoZQogKiByZWxhdGlvbidzIGFwcGxpY2Fi bGUgY29uc3RyYWludHMuCiAqCiAqIE5vdGU6IHRoaXMgZXhhbWluZXMgb25seSByZWwtPnJl bGlkLCByZWwtPnJlbG9wdGtpbmQsIGFuZAogKiByZWwtPmJhc2VyZXN0cmljdGluZm87IHRo ZXJlZm9yZSBpdCBjYW4gYmUgY2FsbGVkIGJlZm9yZSBmaWxsaW5nIGluCiAqIG90aGVyIGZp ZWxkcyBvZiB0aGUgUmVsT3B0SW5mby4KICovCmJvb2wKcmVsYXRpb25fZXhjbHVkZWRfYnlf Y29uc3RyYWludHMoUGxhbm5lckluZm8gKnJvb3QsCgkJCQkJCQkJIFJlbE9wdEluZm8gKnJl bCwgUmFuZ2VUYmxFbnRyeSAqcnRlKQp7Cglib29sCQlpbmNsdWRlX25vaW5oZXJpdDsKCWJv b2wJCWluY2x1ZGVfbm90bnVsbDsKCWJvb2wJCWluY2x1ZGVfcGFydGl0aW9uID0gZmFsc2U7 CglMaXN0CSAgICpzYWZlX3Jlc3RyaWN0aW9uczsKCUxpc3QJICAgKmNvbnN0cmFpbnRfcHJl ZDsKCUxpc3QJICAgKnNhZmVfY29uc3RyYWludHM7CglMaXN0Q2VsbCAgICpsYzsKCgkvKiBB cyBvZiBub3csIGNvbnN0cmFpbnQgZXhjbHVzaW9uIHdvcmtzIG9ubHkgd2l0aCBzaW1wbGUg cmVsYXRpb25zLiAqLwoJQXNzZXJ0KElTX1NJTVBMRV9SRUwocmVsKSk7CgoJLyoKCSAqIElm IHRoZXJlIGFyZSBubyBiYXNlIHJlc3RyaWN0aW9uIGNsYXVzZXMsIHdlIGhhdmUgbm8gaG9w ZSBvZiBwcm92aW5nCgkgKiBhbnl0aGluZyBiZWxvdywgc28gZmFsbCBvdXQgcXVpY2tseS4K CSAqLwoJaWYgKHJlbC0+YmFzZXJlc3RyaWN0aW5mbyA9PSBOSUwpCgkJcmV0dXJuIGZhbHNl OwoKCS8qCgkgKiBSZWdhcmRsZXNzIG9mIHRoZSBzZXR0aW5nIG9mIGNvbnN0cmFpbnRfZXhj bHVzaW9uLCBkZXRlY3QKCSAqIGNvbnN0YW50LUZBTFNFLW9yLU5VTEwgcmVzdHJpY3Rpb24g Y2xhdXNlcy4gIEFsdGhvdWdoIGNvbnN0LWZvbGRpbmcKCSAqIHdpbGwgcmVkdWNlICJhbnl0 aGluZyBBTkQgRkFMU0UiIHRvIGp1c3QgIkZBTFNFIiwgdGhlIGJhc2VyZXN0cmljdGluZm8K CSAqIGxpc3QgY2FuIHN0aWxsIGhhdmUgb3RoZXIgbWVtYmVycyBiZXNpZGVzIHRoZSBGQUxT RSBjb25zdGFudCwgZHVlIHRvCgkgKiBxdWFsIHB1c2hkb3duIGFuZCBvdGhlciBtZWNoYW5p c21zOyBzbyBjaGVjayB0aGVtIGFsbC4gIFRoaXMgZG9lc24ndAoJICogZmlyZSB2ZXJ5IG9m dGVuLCBidXQgaXQgc2VlbXMgY2hlYXAgZW5vdWdoIHRvIGJlIHdvcnRoIGRvaW5nIGFueXdh eS4KCSAqIChXaXRob3V0IHRoaXMsIHdlJ2QgbWlzcyBzb21lIG9wdGltaXphdGlvbnMgdGhh dCA5LjUgYW5kIGVhcmxpZXIgZm91bmQKCSAqIHZpYSBtdWNoIG1vcmUgcm91bmRhYm91dCBt ZXRob2RzLikKCSAqLwoJZm9yZWFjaChsYywgcmVsLT5iYXNlcmVzdHJpY3RpbmZvKQoJewoJ CVJlc3RyaWN0SW5mbyAqcmluZm8gPSAoUmVzdHJpY3RJbmZvICopIGxmaXJzdChsYyk7CgkJ RXhwcgkgICAqY2xhdXNlID0gcmluZm8tPmNsYXVzZTsKCgkJaWYgKGNsYXVzZSAmJiBJc0Eo Y2xhdXNlLCBDb25zdCkgJiYKCQkJKCgoQ29uc3QgKikgY2xhdXNlKS0+Y29uc3Rpc251bGwg fHwKCQkJICFEYXR1bUdldEJvb2woKChDb25zdCAqKSBjbGF1c2UpLT5jb25zdHZhbHVlKSkp CgkJCXJldHVybiB0cnVlOwoJfQoKCS8qCgkgKiBTa2lwIGZ1cnRoZXIgdGVzdHMsIGRlcGVu ZGluZyBvbiBjb25zdHJhaW50X2V4Y2x1c2lvbi4KCSAqLwoJc3dpdGNoIChjb25zdHJhaW50 X2V4Y2x1c2lvbikKCXsKCQljYXNlIENPTlNUUkFJTlRfRVhDTFVTSU9OX09GRjoKCQkJLyog SW4gJ29mZicgbW9kZSwgbmV2ZXIgbWFrZSBhbnkgZnVydGhlciB0ZXN0cyAqLwoJCQlyZXR1 cm4gZmFsc2U7CgoJCWNhc2UgQ09OU1RSQUlOVF9FWENMVVNJT05fUEFSVElUSU9OOgoKCQkJ LyoKCQkJICogV2hlbiBjb25zdHJhaW50X2V4Y2x1c2lvbiBpcyBzZXQgdG8gJ3BhcnRpdGlv bicgd2Ugb25seSBoYW5kbGUKCQkJICogYXBwZW5kcmVsIG1lbWJlcnMuICBQYXJ0aXRpb24g cHJ1bmluZyBoYXMgYWxyZWFkeSBiZWVuIGFwcGxpZWQsCgkJCSAqIHNvIHRoZXJlIGlzIG5v IG5lZWQgdG8gY29uc2lkZXIgdGhlIHJlbCdzIHBhcnRpdGlvbiBjb25zdHJhaW50cwoJCQkg KiBoZXJlLgoJCQkgKi8KCQkJaWYgKHJlbC0+cmVsb3B0a2luZCA9PSBSRUxPUFRfT1RIRVJf TUVNQkVSX1JFTCkKCQkJCWJyZWFrOwkJCS8qIGFwcGVuZHJlbCBtZW1iZXIsIHNvIHByb2Nl c3MgaXQgKi8KCQkJcmV0dXJuIGZhbHNlOwoKCQljYXNlIENPTlNUUkFJTlRfRVhDTFVTSU9O X09OOgoKCQkJLyoKCQkJICogSW4gJ29uJyBtb2RlLCBhbHdheXMgYXBwbHkgY29uc3RyYWlu dCBleGNsdXNpb24uICBJZiB3ZSBhcmUKCQkJICogY29uc2lkZXJpbmcgYSBiYXNlcmVsIHRo YXQgaXMgYSBwYXJ0aXRpb24gKGkuZS4sIGl0IHdhcwoJCQkgKiBkaXJlY3RseSBuYW1lZCBy YXRoZXIgdGhhbiBleHBhbmRlZCBmcm9tIGEgcGFyZW50IHRhYmxlKSwgdGhlbgoJCQkgKiBp dHMgcGFydGl0aW9uIGNvbnN0cmFpbnRzIGhhdmVuJ3QgYmVlbiBjb25zaWRlcmVkIHlldCwg c28KCQkJICogaW5jbHVkZSB0aGVtIGluIHRoZSBwcm9jZXNzaW5nIGhlcmUuCgkJCSAqLwoJ CQlpZiAocmVsLT5yZWxvcHRraW5kID09IFJFTE9QVF9CQVNFUkVMKQoJCQkJaW5jbHVkZV9w YXJ0aXRpb24gPSB0cnVlOwoJCQlicmVhazsJCQkJLyogYWx3YXlzIHRyeSB0byBleGNsdWRl ICovCgl9CgoJLyoKCSAqIENoZWNrIGZvciBzZWxmLWNvbnRyYWRpY3RvcnkgcmVzdHJpY3Rp b24gY2xhdXNlcy4gIFdlIGRhcmUgbm90IG1ha2UKCSAqIGRlZHVjdGlvbnMgd2l0aCBub24t aW1tdXRhYmxlIGZ1bmN0aW9ucywgYnV0IGFueSBpbW11dGFibGUgY2xhdXNlcyB0aGF0Cgkg KiBhcmUgc2VsZi1jb250cmFkaWN0b3J5IGFsbG93IHVzIHRvIGNvbmNsdWRlIHRoZSBzY2Fu IGlzIHVubmVjZXNzYXJ5LgoJICoKCSAqIE5vdGU6IHN0cmlwIG9mZiBSZXN0cmljdEluZm8g YmVjYXVzZSBwcmVkaWNhdGVfcmVmdXRlZF9ieSgpIGlzbid0CgkgKiBleHBlY3RpbmcgdG8g c2VlIGFueSBpbiBpdHMgcHJlZGljYXRlIGFyZ3VtZW50LgoJICovCglzYWZlX3Jlc3RyaWN0 aW9ucyA9IE5JTDsKCWZvcmVhY2gobGMsIHJlbC0+YmFzZXJlc3RyaWN0aW5mbykKCXsKCQlS ZXN0cmljdEluZm8gKnJpbmZvID0gKFJlc3RyaWN0SW5mbyAqKSBsZmlyc3QobGMpOwoKCQlp ZiAoIWNvbnRhaW5fbXV0YWJsZV9mdW5jdGlvbnMoKE5vZGUgKikgcmluZm8tPmNsYXVzZSkp CgkJCXNhZmVfcmVzdHJpY3Rpb25zID0gbGFwcGVuZChzYWZlX3Jlc3RyaWN0aW9ucywgcmlu Zm8tPmNsYXVzZSk7Cgl9CgoJLyoKCSAqIFdlIGNhbiB1c2Ugd2VhayByZWZ1dGF0aW9uIGhl cmUsIHNpbmNlIHdlJ3JlIGNvbXBhcmluZyByZXN0cmljdGlvbgoJICogY2xhdXNlcyB3aXRo IHJlc3RyaWN0aW9uIGNsYXVzZXMuCgkgKi8KCWlmIChwcmVkaWNhdGVfcmVmdXRlZF9ieShz YWZlX3Jlc3RyaWN0aW9ucywgc2FmZV9yZXN0cmljdGlvbnMsIHRydWUpKQoJCXJldHVybiB0 cnVlOwoKCS8qCgkgKiBPbmx5IHBsYWluIHJlbGF0aW9ucyBoYXZlIGNvbnN0cmFpbnRzLCBz byBzdG9wIGhlcmUgZm9yIG90aGVyIHJ0ZWtpbmRzLgoJICovCglpZiAocnRlLT5ydGVraW5k ICE9IFJURV9SRUxBVElPTikKCQlyZXR1cm4gZmFsc2U7CgoJLyoKCSAqIElmIHdlIGFyZSBz Y2FubmluZyBqdXN0IHRoaXMgdGFibGUsIHdlIGNhbiB1c2UgTk8gSU5IRVJJVCBjb25zdHJh aW50cywKCSAqIGJ1dCBub3QgaWYgd2UncmUgc2Nhbm5pbmcgaXRzIGNoaWxkcmVuIHRvby4g IChOb3RlIHRoYXQgcGFydGl0aW9uZWQKCSAqIHRhYmxlcyBzaG91bGQgbmV2ZXIgaGF2ZSBO TyBJTkhFUklUIGNvbnN0cmFpbnRzOyBidXQgaXQncyBub3QgbmVjZXNzYXJ5CgkgKiBmb3Ig dXMgdG8gYXNzdW1lIHRoYXQgaGVyZS4pCgkgKi8KCWluY2x1ZGVfbm9pbmhlcml0ID0gIXJ0 ZS0+aW5oOwoKCS8qCgkgKiBDdXJyZW50bHksIGF0dG5vdG51bGwgY29uc3RyYWludHMgbXVz dCBiZSB0cmVhdGVkIGFzIE5PIElOSEVSSVQgdW5sZXNzCgkgKiB0aGlzIGlzIGEgcGFydGl0 aW9uZWQgdGFibGUuICBJbiBmdXR1cmUgd2UgbWlnaHQgdHJhY2sgdGhlaXIKCSAqIGluaGVy aXRhbmNlIHN0YXR1cyBtb3JlIGFjY3VyYXRlbHksIGFsbG93aW5nIHRoaXMgdG8gYmUgcmVm aW5lZC4KCSAqCgkgKiBYWFggZG8gd2UgbmVlZC93YW50IHRvIGNoYW5nZSB0aGlzPwoJICov CglpbmNsdWRlX25vdG51bGwgPSAoIXJ0ZS0+aW5oIHx8IHJ0ZS0+cmVsa2luZCA9PSBSRUxL SU5EX1BBUlRJVElPTkVEX1RBQkxFKTsKCgkvKgoJICogRmV0Y2ggdGhlIGFwcHJvcHJpYXRl IHNldCBvZiBjb25zdHJhaW50IGV4cHJlc3Npb25zLgoJICovCgljb25zdHJhaW50X3ByZWQg PSBnZXRfcmVsYXRpb25fY29uc3RyYWludHMocm9vdCwgcnRlLT5yZWxpZCwgcmVsLAoJCQkJ CQkJCQkJCSAgIGluY2x1ZGVfbm9pbmhlcml0LAoJCQkJCQkJCQkJCSAgIGluY2x1ZGVfbm90 bnVsbCwKCQkJCQkJCQkJCQkgICBpbmNsdWRlX3BhcnRpdGlvbik7CgoJLyoKCSAqIFdlIGRv IG5vdCBjdXJyZW50bHkgZW5mb3JjZSB0aGF0IENIRUNLIGNvbnN0cmFpbnRzIGNvbnRhaW4g b25seQoJICogaW1tdXRhYmxlIGZ1bmN0aW9ucywgc28gaXQncyBuZWNlc3NhcnkgdG8gY2hl Y2sgaGVyZS4gV2UgZGFyZW4ndCBkcmF3CgkgKiBjb25jbHVzaW9ucyBmcm9tIHBsYW4tdGlt ZSBldmFsdWF0aW9uIG9mIG5vbi1pbW11dGFibGUgZnVuY3Rpb25zLiBTaW5jZQoJICogdGhl eSdyZSBBTkRlZCwgd2UgY2FuIGp1c3QgaWdub3JlIGFueSBtdXRhYmxlIGNvbnN0cmFpbnRz IGluIHRoZSBsaXN0LAoJICogYW5kIHJlYXNvbiBhYm91dCB0aGUgcmVzdC4KCSAqLwoJc2Fm ZV9jb25zdHJhaW50cyA9IE5JTDsKCWZvcmVhY2gobGMsIGNvbnN0cmFpbnRfcHJlZCkKCXsK CQlOb2RlCSAgICpwcmVkID0gKE5vZGUgKikgbGZpcnN0KGxjKTsKCgkJaWYgKCFjb250YWlu X211dGFibGVfZnVuY3Rpb25zKHByZWQpKQoJCQlzYWZlX2NvbnN0cmFpbnRzID0gbGFwcGVu ZChzYWZlX2NvbnN0cmFpbnRzLCBwcmVkKTsKCX0KCgkvKgoJICogVGhlIGNvbnN0cmFpbnRz IGFyZSBlZmZlY3RpdmVseSBBTkRlZCB0b2dldGhlciwgc28gd2UgY2FuIGp1c3QgdHJ5IHRv CgkgKiByZWZ1dGUgdGhlIGVudGlyZSBjb2xsZWN0aW9uIGF0IG9uY2UuICBUaGlzIG1heSBh bGxvdyB1cyB0byBtYWtlIHByb29mcwoJICogdGhhdCB3b3VsZCBmYWlsIGlmIHdlIHRvb2sg dGhlbSBpbmRpdmlkdWFsbHkuCgkgKgoJICogTm90ZTogd2UgdXNlIHJlbC0+YmFzZXJlc3Ry aWN0aW5mbywgbm90IHNhZmVfcmVzdHJpY3Rpb25zIGFzIG1pZ2h0IHNlZW0KCSAqIGFuIG9i dmlvdXMgb3B0aW1pemF0aW9uLiAgU29tZSBvZiB0aGUgY2xhdXNlcyBtaWdodCBiZSBPUiBj bGF1c2VzIHRoYXQKCSAqIGhhdmUgdm9sYXRpbGUgYW5kIG5vbnZvbGF0aWxlIHN1YmNsYXVz ZXMsIGFuZCBpdCdzIE9LIHRvIG1ha2UKCSAqIGRlZHVjdGlvbnMgd2l0aCB0aGUgbm9udm9s YXRpbGUgcGFydHMuCgkgKgoJICogV2UgbmVlZCBzdHJvbmcgcmVmdXRhdGlvbiBiZWNhdXNl IHdlIGhhdmUgdG8gcHJvdmUgdGhhdCB0aGUgY29uc3RyYWludHMKCSAqIHdvdWxkIHlpZWxk IGZhbHNlLCBub3QganVzdCBOVUxMLgoJICovCglpZiAocHJlZGljYXRlX3JlZnV0ZWRfYnko c2FmZV9jb25zdHJhaW50cywgcmVsLT5iYXNlcmVzdHJpY3RpbmZvLCBmYWxzZSkpCgkJcmV0 dXJuIHRydWU7CgoJcmV0dXJuIGZhbHNlOwp9CgoKLyoKICogYnVpbGRfcGh5c2ljYWxfdGxp c3QKICoKICogQnVpbGQgYSB0YXJnZXRsaXN0IGNvbnNpc3Rpbmcgb2YgZXhhY3RseSB0aGUg cmVsYXRpb24ncyB1c2VyIGF0dHJpYnV0ZXMsCiAqIGluIG9yZGVyLiAgVGhlIGV4ZWN1dG9y IGNhbiBzcGVjaWFsLWNhc2Ugc3VjaCB0bGlzdHMgdG8gYXZvaWQgYSBwcm9qZWN0aW9uCiAq IHN0ZXAgYXQgcnVudGltZSwgc28gd2UgdXNlIHN1Y2ggdGxpc3RzIHByZWZlcmVudGlhbGx5 IGZvciBzY2FuIG5vZGVzLgogKgogKiBFeGNlcHRpb246IGlmIHRoZXJlIGFyZSBhbnkgZHJv cHBlZCBvciBtaXNzaW5nIGNvbHVtbnMsIHdlIHB1bnQgYW5kIHJldHVybgogKiBOSUwuICBJ ZGVhbGx5IHdlIHdvdWxkIGxpa2UgdG8gaGFuZGxlIHRoZXNlIGNhc2VzIHRvby4gIEhvd2V2 ZXIgdGhpcwogKiBjcmVhdGVzIHByb2JsZW1zIGZvciBFeGVjVHlwZUZyb21UTCwgd2hpY2gg bWF5IGJlIGFza2VkIHRvIGJ1aWxkIGEgdHVwZGVzYwogKiBmb3IgYSB0bGlzdCB0aGF0IGlu Y2x1ZGVzIHZhcnMgb2Ygbm8tbG9uZ2VyLWV4aXN0ZW50IHR5cGVzLiAgSW4gdGhlb3J5IHdl CiAqIGNvdWxkIGRpZyBvdXQgdGhlIHJlcXVpcmVkIGluZm8gZnJvbSB0aGUgcGdfYXR0cmli dXRlIGVudHJpZXMgb2YgdGhlCiAqIHJlbGF0aW9uLCBidXQgdGhhdCBkYXRhIGlzIG5vdCBy ZWFkaWx5IGF2YWlsYWJsZSB0byBFeGVjVHlwZUZyb21UTC4KICogRm9yIG5vdywgd2UgZG9u J3QgYXBwbHkgdGhlIHBoeXNpY2FsLXRsaXN0IG9wdGltaXphdGlvbiB3aGVuIHRoZXJlIGFy ZQogKiBkcm9wcGVkIGNvbHMuCiAqCiAqIFdlIGFsc28gc3VwcG9ydCBidWlsZGluZyBhICJw aHlzaWNhbCIgdGxpc3QgZm9yIHN1YnF1ZXJpZXMsIGZ1bmN0aW9ucywKICogdmFsdWVzIGxp c3RzLCB0YWJsZSBleHByZXNzaW9ucywgYW5kIENURXMsIHNpbmNlIHRoZSBzYW1lIG9wdGlt aXphdGlvbiBjYW4KICogb2NjdXIgaW4gU3VicXVlcnlTY2FuLCBGdW5jdGlvblNjYW4sIFZh bHVlc1NjYW4sIEN0ZVNjYW4sIFRhYmxlRnVuYywKICogTmFtZWRUdXBsZXN0b3JlU2Nhbiwg YW5kIFdvcmtUYWJsZVNjYW4gbm9kZXMuCiAqLwpMaXN0ICoKYnVpbGRfcGh5c2ljYWxfdGxp c3QoUGxhbm5lckluZm8gKnJvb3QsIFJlbE9wdEluZm8gKnJlbCkKewoJTGlzdAkgICAqdGxp c3QgPSBOSUw7CglJbmRleAkJdmFybm8gPSByZWwtPnJlbGlkOwoJUmFuZ2VUYmxFbnRyeSAq cnRlID0gcGxhbm5lcl9ydF9mZXRjaCh2YXJubywgcm9vdCk7CglSZWxhdGlvbglyZWxhdGlv bjsKCVF1ZXJ5CSAgICpzdWJxdWVyeTsKCVZhcgkJICAgKnZhcjsKCUxpc3RDZWxsICAgKmw7 CglpbnQJCQlhdHRybm8sCgkJCQludW1hdHRyczsKCUxpc3QJICAgKmNvbHZhcnM7CgoJc3dp dGNoIChydGUtPnJ0ZWtpbmQpCgl7CgkJY2FzZSBSVEVfUkVMQVRJT046CgkJCS8qIEFzc3Vt ZSB3ZSBhbHJlYWR5IGhhdmUgYWRlcXVhdGUgbG9jayAqLwoJCQlyZWxhdGlvbiA9IHRhYmxl X29wZW4ocnRlLT5yZWxpZCwgTm9Mb2NrKTsKCgkJCW51bWF0dHJzID0gUmVsYXRpb25HZXRO dW1iZXJPZkF0dHJpYnV0ZXMocmVsYXRpb24pOwoJCQlmb3IgKGF0dHJubyA9IDE7IGF0dHJu byA8PSBudW1hdHRyczsgYXR0cm5vKyspCgkJCXsKCQkJCUZvcm1fcGdfYXR0cmlidXRlIGF0 dF90dXAgPSBUdXBsZURlc2NBdHRyKHJlbGF0aW9uLT5yZF9hdHQsCgkJCQkJCQkJCQkJCQkJ ICBhdHRybm8gLSAxKTsKCgkJCQlpZiAoYXR0X3R1cC0+YXR0aXNkcm9wcGVkIHx8IGF0dF90 dXAtPmF0dGhhc21pc3NpbmcpCgkJCQl7CgkJCQkJLyogZm91bmQgYSBkcm9wcGVkIG9yIG1p c3NpbmcgY29sLCBzbyBwdW50ICovCgkJCQkJdGxpc3QgPSBOSUw7CgkJCQkJYnJlYWs7CgkJ CQl9CgoJCQkJdmFyID0gbWFrZVZhcih2YXJubywKCQkJCQkJCSAgYXR0cm5vLAoJCQkJCQkJ ICBhdHRfdHVwLT5hdHR0eXBpZCwKCQkJCQkJCSAgYXR0X3R1cC0+YXR0dHlwbW9kLAoJCQkJ CQkJICBhdHRfdHVwLT5hdHRjb2xsYXRpb24sCgkJCQkJCQkgIDApOwoKCQkJCXRsaXN0ID0g bGFwcGVuZCh0bGlzdCwKCQkJCQkJCQltYWtlVGFyZ2V0RW50cnkoKEV4cHIgKikgdmFyLAoJ CQkJCQkJCQkJCQlhdHRybm8sCgkJCQkJCQkJCQkJCU5VTEwsCgkJCQkJCQkJCQkJCWZhbHNl KSk7CgkJCX0KCgkJCXRhYmxlX2Nsb3NlKHJlbGF0aW9uLCBOb0xvY2spOwoJCQlicmVhazsK CgkJY2FzZSBSVEVfU1VCUVVFUlk6CgkJCXN1YnF1ZXJ5ID0gcnRlLT5zdWJxdWVyeTsKCQkJ Zm9yZWFjaChsLCBzdWJxdWVyeS0+dGFyZ2V0TGlzdCkKCQkJewoJCQkJVGFyZ2V0RW50cnkg KnRsZSA9IChUYXJnZXRFbnRyeSAqKSBsZmlyc3QobCk7CgoJCQkJLyoKCQkJCSAqIEEgcmVz anVuayBjb2x1bW4gb2YgdGhlIHN1YnF1ZXJ5IGNhbiBiZSByZWZsZWN0ZWQgYXMKCQkJCSAq IHJlc2p1bmsgaW4gdGhlIHBoeXNpY2FsIHRsaXN0OyB3ZSBuZWVkIG5vdCBwdW50LgoJCQkJ ICovCgkJCQl2YXIgPSBtYWtlVmFyRnJvbVRhcmdldEVudHJ5KHZhcm5vLCB0bGUpOwoKCQkJ CXRsaXN0ID0gbGFwcGVuZCh0bGlzdCwKCQkJCQkJCQltYWtlVGFyZ2V0RW50cnkoKEV4cHIg KikgdmFyLAoJCQkJCQkJCQkJCQl0bGUtPnJlc25vLAoJCQkJCQkJCQkJCQlOVUxMLAoJCQkJ CQkJCQkJCQl0bGUtPnJlc2p1bmspKTsKCQkJfQoJCQlicmVhazsKCgkJY2FzZSBSVEVfRlVO Q1RJT046CgkJY2FzZSBSVEVfVEFCTEVGVU5DOgoJCWNhc2UgUlRFX1ZBTFVFUzoKCQljYXNl IFJURV9DVEU6CgkJY2FzZSBSVEVfTkFNRURUVVBMRVNUT1JFOgoJCWNhc2UgUlRFX1JFU1VM VDoKCQkJLyogTm90IGFsbCBvZiB0aGVzZSBjYW4gaGF2ZSBkcm9wcGVkIGNvbHMsIGJ1dCBz aGFyZSBjb2RlIGFueXdheSAqLwoJCQlleHBhbmRSVEUocnRlLCB2YXJubywgMCwgVkFSX1JF VFVSTklOR19ERUZBVUxULCAtMSwKCQkJCQkgIHRydWUgLyogaW5jbHVkZSBkcm9wcGVkICov ICwgTlVMTCwgJmNvbHZhcnMpOwoJCQlmb3JlYWNoKGwsIGNvbHZhcnMpCgkJCXsKCQkJCXZh ciA9IChWYXIgKikgbGZpcnN0KGwpOwoKCQkJCS8qCgkJCQkgKiBBIG5vbi1WYXIgaW4gZXhw YW5kUlRFJ3Mgb3V0cHV0IG1lYW5zIGEgZHJvcHBlZCBjb2x1bW47CgkJCQkgKiBtdXN0IHB1 bnQuCgkJCQkgKi8KCQkJCWlmICghSXNBKHZhciwgVmFyKSkKCQkJCXsKCQkJCQl0bGlzdCA9 IE5JTDsKCQkJCQlicmVhazsKCQkJCX0KCgkJCQl0bGlzdCA9IGxhcHBlbmQodGxpc3QsCgkJ CQkJCQkJbWFrZVRhcmdldEVudHJ5KChFeHByICopIHZhciwKCQkJCQkJCQkJCQkJdmFyLT52 YXJhdHRubywKCQkJCQkJCQkJCQkJTlVMTCwKCQkJCQkJCQkJCQkJZmFsc2UpKTsKCQkJfQoJ CQlicmVhazsKCgkJZGVmYXVsdDoKCQkJLyogY2FsbGVyIGVycm9yICovCgkJCWVsb2coRVJS T1IsICJ1bnN1cHBvcnRlZCBSVEUga2luZCAlZCBpbiBidWlsZF9waHlzaWNhbF90bGlzdCIs CgkJCQkgKGludCkgcnRlLT5ydGVraW5kKTsKCQkJYnJlYWs7Cgl9CgoJcmV0dXJuIHRsaXN0 Owp9CgovKgogKiBidWlsZF9pbmRleF90bGlzdAogKgogKiBCdWlsZCBhIHRhcmdldGxpc3Qg cmVwcmVzZW50aW5nIHRoZSBjb2x1bW5zIG9mIHRoZSBzcGVjaWZpZWQgaW5kZXguCiAqIEVh Y2ggY29sdW1uIGlzIHJlcHJlc2VudGVkIGJ5IGEgVmFyIGZvciB0aGUgY29ycmVzcG9uZGlu ZyBiYXNlLXJlbGF0aW9uCiAqIGNvbHVtbiwgb3IgYW4gZXhwcmVzc2lvbiBpbiBiYXNlLXJl bGF0aW9uIFZhcnMsIGFzIGFwcHJvcHJpYXRlLgogKgogKiBUaGVyZSBhcmUgbmV2ZXIgYW55 IGRyb3BwZWQgY29sdW1ucyBpbiBpbmRleGVzLCBzbyB1bmxpa2UKICogYnVpbGRfcGh5c2lj YWxfdGxpc3QsIHdlIG5lZWQgbm8gZmFpbHVyZSBjYXNlLgogKi8Kc3RhdGljIExpc3QgKgpi dWlsZF9pbmRleF90bGlzdChQbGFubmVySW5mbyAqcm9vdCwgSW5kZXhPcHRJbmZvICppbmRl eCwKCQkJCSAgUmVsYXRpb24gaGVhcFJlbGF0aW9uKQp7CglMaXN0CSAgICp0bGlzdCA9IE5J TDsKCUluZGV4CQl2YXJubyA9IGluZGV4LT5yZWwtPnJlbGlkOwoJTGlzdENlbGwgICAqaW5k ZXhwcl9pdGVtOwoJaW50CQkJaTsKCglpbmRleHByX2l0ZW0gPSBsaXN0X2hlYWQoaW5kZXgt PmluZGV4cHJzKTsKCWZvciAoaSA9IDA7IGkgPCBpbmRleC0+bmNvbHVtbnM7IGkrKykKCXsK CQlpbnQJCQlpbmRleGtleSA9IGluZGV4LT5pbmRleGtleXNbaV07CgkJRXhwcgkgICAqaW5k ZXh2YXI7CgoJCWlmIChpbmRleGtleSAhPSAwKQoJCXsKCQkJLyogc2ltcGxlIGNvbHVtbiAq LwoJCQljb25zdCBGb3JtRGF0YV9wZ19hdHRyaWJ1dGUgKmF0dF90dXA7CgoJCQlpZiAoaW5k ZXhrZXkgPCAwKQoJCQkJYXR0X3R1cCA9IFN5c3RlbUF0dHJpYnV0ZURlZmluaXRpb24oaW5k ZXhrZXkpOwoJCQllbHNlCgkJCQlhdHRfdHVwID0gVHVwbGVEZXNjQXR0cihoZWFwUmVsYXRp b24tPnJkX2F0dCwgaW5kZXhrZXkgLSAxKTsKCgkJCWluZGV4dmFyID0gKEV4cHIgKikgbWFr ZVZhcih2YXJubywKCQkJCQkJCQkJCWluZGV4a2V5LAoJCQkJCQkJCQkJYXR0X3R1cC0+YXR0 dHlwaWQsCgkJCQkJCQkJCQlhdHRfdHVwLT5hdHR0eXBtb2QsCgkJCQkJCQkJCQlhdHRfdHVw LT5hdHRjb2xsYXRpb24sCgkJCQkJCQkJCQkwKTsKCQl9CgkJZWxzZQoJCXsKCQkJLyogZXhw cmVzc2lvbiBjb2x1bW4gKi8KCQkJaWYgKGluZGV4cHJfaXRlbSA9PSBOVUxMKQoJCQkJZWxv ZyhFUlJPUiwgIndyb25nIG51bWJlciBvZiBpbmRleCBleHByZXNzaW9ucyIpOwoJCQlpbmRl eHZhciA9IChFeHByICopIGxmaXJzdChpbmRleHByX2l0ZW0pOwoJCQlpbmRleHByX2l0ZW0g PSBsbmV4dChpbmRleC0+aW5kZXhwcnMsIGluZGV4cHJfaXRlbSk7CgkJfQoKCQl0bGlzdCA9 IGxhcHBlbmQodGxpc3QsCgkJCQkJCW1ha2VUYXJnZXRFbnRyeShpbmRleHZhciwKCQkJCQkJ CQkJCWkgKyAxLAoJCQkJCQkJCQkJTlVMTCwKCQkJCQkJCQkJCWZhbHNlKSk7Cgl9CglpZiAo aW5kZXhwcl9pdGVtICE9IE5VTEwpCgkJZWxvZyhFUlJPUiwgIndyb25nIG51bWJlciBvZiBp bmRleCBleHByZXNzaW9ucyIpOwoKCXJldHVybiB0bGlzdDsKfQoKLyoKICogcmVzdHJpY3Rp b25fc2VsZWN0aXZpdHkKICoKICogUmV0dXJucyB0aGUgc2VsZWN0aXZpdHkgb2YgYSBzcGVj aWZpZWQgcmVzdHJpY3Rpb24gb3BlcmF0b3IgY2xhdXNlLgogKiBUaGlzIGNvZGUgZXhlY3V0 ZXMgcmVnaXN0ZXJlZCBwcm9jZWR1cmVzIHN0b3JlZCBpbiB0aGUKICogb3BlcmF0b3IgcmVs YXRpb24sIGJ5IGNhbGxpbmcgdGhlIGZ1bmN0aW9uIG1hbmFnZXIuCiAqCiAqIFNlZSBjbGF1 c2Vfc2VsZWN0aXZpdHkoKSBmb3IgdGhlIG1lYW5pbmcgb2YgdGhlIGFkZGl0aW9uYWwgcGFy YW1ldGVycy4KICovClNlbGVjdGl2aXR5CnJlc3RyaWN0aW9uX3NlbGVjdGl2aXR5KFBsYW5u ZXJJbmZvICpyb290LAoJCQkJCQlPaWQgb3BlcmF0b3JpZCwKCQkJCQkJTGlzdCAqYXJncywK CQkJCQkJT2lkIGlucHV0Y29sbGlkLAoJCQkJCQlpbnQgdmFyUmVsaWQpCnsKCVJlZ1Byb2Nl ZHVyZSBvcHJyZXN0ID0gZ2V0X29wcnJlc3Qob3BlcmF0b3JpZCk7CglmbG9hdDgJCXJlc3Vs dDsKCgkvKgoJICogaWYgdGhlIG9wcnJlc3QgcHJvY2VkdXJlIGlzIG1pc3NpbmcgZm9yIHdo YXRldmVyIHJlYXNvbiwgdXNlIGEKCSAqIHNlbGVjdGl2aXR5IG9mIDAuNQoJICovCglpZiAo IW9wcnJlc3QpCgkJcmV0dXJuIChTZWxlY3Rpdml0eSkgMC41OwoKCXJlc3VsdCA9IERhdHVt R2V0RmxvYXQ4KE9pZEZ1bmN0aW9uQ2FsbDRDb2xsKG9wcnJlc3QsCgkJCQkJCQkJCQkJCSBp bnB1dGNvbGxpZCwKCQkJCQkJCQkJCQkJIFBvaW50ZXJHZXREYXR1bShyb290KSwKCQkJCQkJ CQkJCQkJIE9iamVjdElkR2V0RGF0dW0ob3BlcmF0b3JpZCksCgkJCQkJCQkJCQkJCSBQb2lu dGVyR2V0RGF0dW0oYXJncyksCgkJCQkJCQkJCQkJCSBJbnQzMkdldERhdHVtKHZhclJlbGlk KSkpOwoKCWlmIChyZXN1bHQgPCAwLjAgfHwgcmVzdWx0ID4gMS4wKQoJCWVsb2coRVJST1Is ICJpbnZhbGlkIHJlc3RyaWN0aW9uIHNlbGVjdGl2aXR5OiAlZiIsIHJlc3VsdCk7CgoJcmV0 dXJuIChTZWxlY3Rpdml0eSkgcmVzdWx0Owp9CgovKgogKiBqb2luX3NlbGVjdGl2aXR5CiAq CiAqIFJldHVybnMgdGhlIHNlbGVjdGl2aXR5IG9mIGEgc3BlY2lmaWVkIGpvaW4gb3BlcmF0 b3IgY2xhdXNlLgogKiBUaGlzIGNvZGUgZXhlY3V0ZXMgcmVnaXN0ZXJlZCBwcm9jZWR1cmVz IHN0b3JlZCBpbiB0aGUKICogb3BlcmF0b3IgcmVsYXRpb24sIGJ5IGNhbGxpbmcgdGhlIGZ1 bmN0aW9uIG1hbmFnZXIuCiAqCiAqIFNlZSBjbGF1c2Vfc2VsZWN0aXZpdHkoKSBmb3IgdGhl IG1lYW5pbmcgb2YgdGhlIGFkZGl0aW9uYWwgcGFyYW1ldGVycy4KICovClNlbGVjdGl2aXR5 CmpvaW5fc2VsZWN0aXZpdHkoUGxhbm5lckluZm8gKnJvb3QsCgkJCQkgT2lkIG9wZXJhdG9y aWQsCgkJCQkgTGlzdCAqYXJncywKCQkJCSBPaWQgaW5wdXRjb2xsaWQsCgkJCQkgSm9pblR5 cGUgam9pbnR5cGUsCgkJCQkgU3BlY2lhbEpvaW5JbmZvICpzamluZm8pCnsKCVJlZ1Byb2Nl ZHVyZSBvcHJqb2luID0gZ2V0X29wcmpvaW4ob3BlcmF0b3JpZCk7CglmbG9hdDgJCXJlc3Vs dDsKCgkvKgoJICogaWYgdGhlIG9wcmpvaW4gcHJvY2VkdXJlIGlzIG1pc3NpbmcgZm9yIHdo YXRldmVyIHJlYXNvbiwgdXNlIGEKCSAqIHNlbGVjdGl2aXR5IG9mIDAuNQoJICovCglpZiAo IW9wcmpvaW4pCgkJcmV0dXJuIChTZWxlY3Rpdml0eSkgMC41OwoKCXJlc3VsdCA9IERhdHVt R2V0RmxvYXQ4KE9pZEZ1bmN0aW9uQ2FsbDVDb2xsKG9wcmpvaW4sCgkJCQkJCQkJCQkJCSBp bnB1dGNvbGxpZCwKCQkJCQkJCQkJCQkJIFBvaW50ZXJHZXREYXR1bShyb290KSwKCQkJCQkJ CQkJCQkJIE9iamVjdElkR2V0RGF0dW0ob3BlcmF0b3JpZCksCgkJCQkJCQkJCQkJCSBQb2lu dGVyR2V0RGF0dW0oYXJncyksCgkJCQkJCQkJCQkJCSBJbnQxNkdldERhdHVtKGpvaW50eXBl KSwKCQkJCQkJCQkJCQkJIFBvaW50ZXJHZXREYXR1bShzamluZm8pKSk7CgoJaWYgKHJlc3Vs dCA8IDAuMCB8fCByZXN1bHQgPiAxLjApCgkJZWxvZyhFUlJPUiwgImludmFsaWQgam9pbiBz ZWxlY3Rpdml0eTogJWYiLCByZXN1bHQpOwoKCXJldHVybiAoU2VsZWN0aXZpdHkpIHJlc3Vs dDsKfQoKLyoKICogZnVuY3Rpb25fc2VsZWN0aXZpdHkKICoKICogQXR0ZW1wdCB0byBlc3Rp bWF0ZSB0aGUgc2VsZWN0aXZpdHkgb2YgYSBzcGVjaWZpZWQgYm9vbGVhbiBmdW5jdGlvbiBj bGF1c2UKICogYnkgYXNraW5nIGl0cyBzdXBwb3J0IGZ1bmN0aW9uLiAgSWYgdGhlIGZ1bmN0 aW9uIGxhY2tzIHN1cHBvcnQsIHJldHVybiAtMS4KICoKICogU2VlIGNsYXVzZV9zZWxlY3Rp dml0eSgpIGZvciB0aGUgbWVhbmluZyBvZiB0aGUgYWRkaXRpb25hbCBwYXJhbWV0ZXJzLgog Ki8KU2VsZWN0aXZpdHkKZnVuY3Rpb25fc2VsZWN0aXZpdHkoUGxhbm5lckluZm8gKnJvb3Qs CgkJCQkJIE9pZCBmdW5jaWQsCgkJCQkJIExpc3QgKmFyZ3MsCgkJCQkJIE9pZCBpbnB1dGNv bGxpZCwKCQkJCQkgYm9vbCBpc19qb2luLAoJCQkJCSBpbnQgdmFyUmVsaWQsCgkJCQkJIEpv aW5UeXBlIGpvaW50eXBlLAoJCQkJCSBTcGVjaWFsSm9pbkluZm8gKnNqaW5mbykKewoJUmVn UHJvY2VkdXJlIHByb3N1cHBvcnQgPSBnZXRfZnVuY19zdXBwb3J0KGZ1bmNpZCk7CglTdXBw b3J0UmVxdWVzdFNlbGVjdGl2aXR5IHJlcTsKCVN1cHBvcnRSZXF1ZXN0U2VsZWN0aXZpdHkg KnNyZXN1bHQ7CgoJaWYgKCFwcm9zdXBwb3J0KQoJCXJldHVybiAoU2VsZWN0aXZpdHkpIC0x OwkvKiBubyBzdXBwb3J0IGZ1bmN0aW9uICovCgoJcmVxLnR5cGUgPSBUX1N1cHBvcnRSZXF1 ZXN0U2VsZWN0aXZpdHk7CglyZXEucm9vdCA9IHJvb3Q7CglyZXEuZnVuY2lkID0gZnVuY2lk OwoJcmVxLmFyZ3MgPSBhcmdzOwoJcmVxLmlucHV0Y29sbGlkID0gaW5wdXRjb2xsaWQ7Cgly ZXEuaXNfam9pbiA9IGlzX2pvaW47CglyZXEudmFyUmVsaWQgPSB2YXJSZWxpZDsKCXJlcS5q b2ludHlwZSA9IGpvaW50eXBlOwoJcmVxLnNqaW5mbyA9IHNqaW5mbzsKCXJlcS5zZWxlY3Rp dml0eSA9IC0xOwkJLyogdG8gY2F0Y2ggZmFpbHVyZSB0byBzZXQgdGhlIHZhbHVlICovCgoJ c3Jlc3VsdCA9IChTdXBwb3J0UmVxdWVzdFNlbGVjdGl2aXR5ICopCgkJRGF0dW1HZXRQb2lu dGVyKE9pZEZ1bmN0aW9uQ2FsbDEocHJvc3VwcG9ydCwKCQkJCQkJCQkJCSBQb2ludGVyR2V0 RGF0dW0oJnJlcSkpKTsKCglpZiAoc3Jlc3VsdCAhPSAmcmVxKQoJCXJldHVybiAoU2VsZWN0 aXZpdHkpIC0xOwkvKiBmdW5jdGlvbiBkaWQgbm90IGhvbm9yIHJlcXVlc3QgKi8KCglpZiAo cmVxLnNlbGVjdGl2aXR5IDwgMC4wIHx8IHJlcS5zZWxlY3Rpdml0eSA+IDEuMCkKCQllbG9n KEVSUk9SLCAiaW52YWxpZCBmdW5jdGlvbiBzZWxlY3Rpdml0eTogJWYiLCByZXEuc2VsZWN0 aXZpdHkpOwoKCXJldHVybiAoU2VsZWN0aXZpdHkpIHJlcS5zZWxlY3Rpdml0eTsKfQoKLyoK ICogYWRkX2Z1bmN0aW9uX2Nvc3QKICoKICogR2V0IGFuIGVzdGltYXRlIG9mIHRoZSBleGVj dXRpb24gY29zdCBvZiBhIGZ1bmN0aW9uLCBhbmQgKmFkZCogaXQgdG8KICogdGhlIGNvbnRl bnRzIG9mICpjb3N0LiAgVGhlIGVzdGltYXRlIG1heSBpbmNsdWRlIGJvdGggb25lLXRpbWUg YW5kCiAqIHBlci10dXBsZSBjb21wb25lbnRzLCBzaW5jZSBRdWFsQ29zdCBkb2VzLgogKgog KiBUaGUgZnVuY2lkIG11c3QgYWx3YXlzIGJlIHN1cHBsaWVkLiAgSWYgaXQgaXMgYmVpbmcg Y2FsbGVkIGFzIHRoZQogKiBpbXBsZW1lbnRhdGlvbiBvZiBhIHNwZWNpZmljIHBhcnNldHJl ZSBub2RlIChGdW5jRXhwciwgT3BFeHByLAogKiBXaW5kb3dGdW5jLCBldGMpLCBwYXNzIHRo YXQgYXMgIm5vZGUiLCBlbHNlIHBhc3MgTlVMTC4KICoKICogSW4gc29tZSB1c2FnZXMgcm9v dCBtaWdodCBiZSBOVUxMLCB0b28uCiAqLwp2b2lkCmFkZF9mdW5jdGlvbl9jb3N0KFBsYW5u ZXJJbmZvICpyb290LCBPaWQgZnVuY2lkLCBOb2RlICpub2RlLAoJCQkJICBRdWFsQ29zdCAq Y29zdCkKewoJSGVhcFR1cGxlCXByb2N0dXA7CglGb3JtX3BnX3Byb2MgcHJvY2Zvcm07CgoJ cHJvY3R1cCA9IFNlYXJjaFN5c0NhY2hlMShQUk9DT0lELCBPYmplY3RJZEdldERhdHVtKGZ1 bmNpZCkpOwoJaWYgKCFIZWFwVHVwbGVJc1ZhbGlkKHByb2N0dXApKQoJCWVsb2coRVJST1Is ICJjYWNoZSBsb29rdXAgZmFpbGVkIGZvciBmdW5jdGlvbiAldSIsIGZ1bmNpZCk7Cglwcm9j Zm9ybSA9IChGb3JtX3BnX3Byb2MpIEdFVFNUUlVDVChwcm9jdHVwKTsKCglpZiAoT2lkSXNW YWxpZChwcm9jZm9ybS0+cHJvc3VwcG9ydCkpCgl7CgkJU3VwcG9ydFJlcXVlc3RDb3N0IHJl cTsKCQlTdXBwb3J0UmVxdWVzdENvc3QgKnNyZXN1bHQ7CgoJCXJlcS50eXBlID0gVF9TdXBw b3J0UmVxdWVzdENvc3Q7CgkJcmVxLnJvb3QgPSByb290OwoJCXJlcS5mdW5jaWQgPSBmdW5j aWQ7CgkJcmVxLm5vZGUgPSBub2RlOwoKCQkvKiBJbml0aWFsaXplIGNvc3QgZmllbGRzIHNv IHRoYXQgc3VwcG9ydCBmdW5jdGlvbiBkb2Vzbid0IGhhdmUgdG8gKi8KCQlyZXEuc3RhcnR1 cCA9IDA7CgkJcmVxLnBlcl90dXBsZSA9IDA7CgoJCXNyZXN1bHQgPSAoU3VwcG9ydFJlcXVl c3RDb3N0ICopCgkJCURhdHVtR2V0UG9pbnRlcihPaWRGdW5jdGlvbkNhbGwxKHByb2Nmb3Jt LT5wcm9zdXBwb3J0LAoJCQkJCQkJCQkJCSBQb2ludGVyR2V0RGF0dW0oJnJlcSkpKTsKCgkJ aWYgKHNyZXN1bHQgPT0gJnJlcSkKCQl7CgkJCS8qIFN1Y2Nlc3MsIHNvIGFjY3VtdWxhdGUg c3VwcG9ydCBmdW5jdGlvbidzIGVzdGltYXRlIGludG8gKmNvc3QgKi8KCQkJY29zdC0+c3Rh cnR1cCArPSByZXEuc3RhcnR1cDsKCQkJY29zdC0+cGVyX3R1cGxlICs9IHJlcS5wZXJfdHVw bGU7CgkJCVJlbGVhc2VTeXNDYWNoZShwcm9jdHVwKTsKCQkJcmV0dXJuOwoJCX0KCX0KCgkv KiBObyBzdXBwb3J0IGZ1bmN0aW9uLCBvciBpdCBmYWlsZWQsIHNvIHJlbHkgb24gcHJvY29z dCAqLwoJY29zdC0+cGVyX3R1cGxlICs9IHByb2Nmb3JtLT5wcm9jb3N0ICogY3B1X29wZXJh dG9yX2Nvc3Q7CgoJUmVsZWFzZVN5c0NhY2hlKHByb2N0dXApOwp9CgovKgogKiBnZXRfZnVu Y3Rpb25fcm93cwogKgogKiBHZXQgYW4gZXN0aW1hdGUgb2YgdGhlIG51bWJlciBvZiByb3dz IHJldHVybmVkIGJ5IGEgc2V0LXJldHVybmluZyBmdW5jdGlvbi4KICoKICogVGhlIGZ1bmNp ZCBtdXN0IGFsd2F5cyBiZSBzdXBwbGllZC4gIEluIGN1cnJlbnQgdXNhZ2UsIHRoZSBjYWxs aW5nIG5vZGUKICogd2lsbCBhbHdheXMgYmUgc3VwcGxpZWQsIGFuZCB3aWxsIGJlIGVpdGhl ciBhIEZ1bmNFeHByIG9yIE9wRXhwci4KICogQnV0IGl0J3MgYSBnb29kIGlkZWEgdG8gbm90 IGZhaWwgaWYgaXQncyBOVUxMLgogKgogKiBJbiBzb21lIHVzYWdlcyByb290IG1pZ2h0IGJl IE5VTEwsIHRvby4KICoKICogTm90ZTogdGhpcyByZXR1cm5zIHRoZSB1bmZpbHRlcmVkIHJl c3VsdCBvZiB0aGUgc3VwcG9ydCBmdW5jdGlvbiwgaWYgYW55LgogKiBJdCdzIHVzdWFsbHkg YSBnb29kIGlkZWEgdG8gYXBwbHkgY2xhbXBfcm93X2VzdCgpIHRvIHRoZSByZXN1bHQsIGJ1 dCB3ZQogKiBsZWF2ZSBpdCB0byB0aGUgY2FsbGVyIHRvIGRvIHNvLgogKi8KZG91YmxlCmdl dF9mdW5jdGlvbl9yb3dzKFBsYW5uZXJJbmZvICpyb290LCBPaWQgZnVuY2lkLCBOb2RlICpu b2RlKQp7CglIZWFwVHVwbGUJcHJvY3R1cDsKCUZvcm1fcGdfcHJvYyBwcm9jZm9ybTsKCWRv dWJsZQkJcmVzdWx0OwoKCXByb2N0dXAgPSBTZWFyY2hTeXNDYWNoZTEoUFJPQ09JRCwgT2Jq ZWN0SWRHZXREYXR1bShmdW5jaWQpKTsKCWlmICghSGVhcFR1cGxlSXNWYWxpZChwcm9jdHVw KSkKCQllbG9nKEVSUk9SLCAiY2FjaGUgbG9va3VwIGZhaWxlZCBmb3IgZnVuY3Rpb24gJXUi LCBmdW5jaWQpOwoJcHJvY2Zvcm0gPSAoRm9ybV9wZ19wcm9jKSBHRVRTVFJVQ1QocHJvY3R1 cCk7CgoJQXNzZXJ0KHByb2Nmb3JtLT5wcm9yZXRzZXQpOwkvKiBlbHNlIGNhbGxlciBlcnJv ciAqLwoKCWlmIChPaWRJc1ZhbGlkKHByb2Nmb3JtLT5wcm9zdXBwb3J0KSkKCXsKCQlTdXBw b3J0UmVxdWVzdFJvd3MgcmVxOwoJCVN1cHBvcnRSZXF1ZXN0Um93cyAqc3Jlc3VsdDsKCgkJ cmVxLnR5cGUgPSBUX1N1cHBvcnRSZXF1ZXN0Um93czsKCQlyZXEucm9vdCA9IHJvb3Q7CgkJ cmVxLmZ1bmNpZCA9IGZ1bmNpZDsKCQlyZXEubm9kZSA9IG5vZGU7CgoJCXJlcS5yb3dzID0g MDsJCQkvKiBqdXN0IGZvciBzYW5pdHkgKi8KCgkJc3Jlc3VsdCA9IChTdXBwb3J0UmVxdWVz dFJvd3MgKikKCQkJRGF0dW1HZXRQb2ludGVyKE9pZEZ1bmN0aW9uQ2FsbDEocHJvY2Zvcm0t PnByb3N1cHBvcnQsCgkJCQkJCQkJCQkJIFBvaW50ZXJHZXREYXR1bSgmcmVxKSkpOwoKCQlp ZiAoc3Jlc3VsdCA9PSAmcmVxKQoJCXsKCQkJLyogU3VjY2VzcyAqLwoJCQlSZWxlYXNlU3lz Q2FjaGUocHJvY3R1cCk7CgkJCXJldHVybiByZXEucm93czsKCQl9Cgl9CgoJLyogTm8gc3Vw cG9ydCBmdW5jdGlvbiwgb3IgaXQgZmFpbGVkLCBzbyByZWx5IG9uIHByb3Jvd3MgKi8KCXJl c3VsdCA9IHByb2Nmb3JtLT5wcm9yb3dzOwoKCVJlbGVhc2VTeXNDYWNoZShwcm9jdHVwKTsK CglyZXR1cm4gcmVzdWx0Owp9CgovKgogKiBoYXNfdW5pcXVlX2luZGV4CiAqCiAqIERldGVj dCB3aGV0aGVyIHRoZXJlIGlzIGEgdW5pcXVlIGluZGV4IG9uIHRoZSBzcGVjaWZpZWQgYXR0 cmlidXRlCiAqIG9mIHRoZSBzcGVjaWZpZWQgcmVsYXRpb24sIHRodXMgYWxsb3dpbmcgdXMg dG8gY29uY2x1ZGUgdGhhdCBhbGwKICogdGhlIChub24tbnVsbCkgdmFsdWVzIG9mIHRoZSBh dHRyaWJ1dGUgYXJlIGRpc3RpbmN0LgogKgogKiBUaGlzIGZ1bmN0aW9uIGRvZXMgbm90IGNo ZWNrIHRoZSBpbmRleCdzIGluZGltbWVkaWF0ZSBwcm9wZXJ0eSwgd2hpY2gKICogbWVhbnMg dGhhdCB1bmlxdWVuZXNzIG1heSB0cmFuc2llbnRseSBmYWlsIHRvIGhvbGQgaW50cmEtdHJh bnNhY3Rpb24uCiAqIFRoYXQncyBhcHByb3ByaWF0ZSB3aGVuIHdlIGFyZSBtYWtpbmcgc3Rh dGlzdGljYWwgZXN0aW1hdGVzLCBidXQgYmV3YXJlCiAqIG9mIHVzaW5nIHRoaXMgZm9yIGFu eSBjb3JyZWN0bmVzcyBwcm9vZnMuCiAqLwpib29sCmhhc191bmlxdWVfaW5kZXgoUmVsT3B0 SW5mbyAqcmVsLCBBdHRyTnVtYmVyIGF0dG5vKQp7CglMaXN0Q2VsbCAgICppbGlzdDsKCglm b3JlYWNoKGlsaXN0LCByZWwtPmluZGV4bGlzdCkKCXsKCQlJbmRleE9wdEluZm8gKmluZGV4 ID0gKEluZGV4T3B0SW5mbyAqKSBsZmlyc3QoaWxpc3QpOwoKCQkvKgoJCSAqIE5vdGU6IGln bm9yZSBwYXJ0aWFsIGluZGV4ZXMsIHNpbmNlIHRoZXkgZG9uJ3QgYWxsb3cgdXMgdG8gY29u Y2x1ZGUKCQkgKiB0aGF0IGFsbCBhdHRyIHZhbHVlcyBhcmUgZGlzdGluY3QsICp1bmxlc3Mq IHRoZXkgYXJlIG1hcmtlZCBwcmVkT0sKCQkgKiB3aGljaCBtZWFucyB3ZSBrbm93IHRoZSBp bmRleCdzIHByZWRpY2F0ZSBpcyBzYXRpc2ZpZWQgYnkgdGhlCgkJICogcXVlcnkuIFdlIGRv bid0IHRha2UgYW55IGludGVyZXN0IGluIGV4cHJlc3Npb25hbCBpbmRleGVzIGVpdGhlci4K CQkgKiBBbHNvLCBhIG11bHRpY29sdW1uIHVuaXF1ZSBpbmRleCBkb2Vzbid0IGFsbG93IHVz IHRvIGNvbmNsdWRlIHRoYXQKCQkgKiBqdXN0IHRoZSBzcGVjaWZpZWQgYXR0ciBpcyB1bmlx dWUuCgkJICovCgkJaWYgKGluZGV4LT51bmlxdWUgJiYKCQkJaW5kZXgtPm5rZXljb2x1bW5z ID09IDEgJiYKCQkJaW5kZXgtPmluZGV4a2V5c1swXSA9PSBhdHRubyAmJgoJCQkoaW5kZXgt PmluZHByZWQgPT0gTklMIHx8IGluZGV4LT5wcmVkT0spKQoJCQlyZXR1cm4gdHJ1ZTsKCX0K CXJldHVybiBmYWxzZTsKfQoKCi8qCiAqIGhhc19yb3dfdHJpZ2dlcnMKICoKICogRGV0ZWN0 IHdoZXRoZXIgdGhlIHNwZWNpZmllZCByZWxhdGlvbiBoYXMgYW55IHJvdy1sZXZlbCB0cmln Z2VycyBmb3IgZXZlbnQuCiAqLwpib29sCmhhc19yb3dfdHJpZ2dlcnMoUGxhbm5lckluZm8g KnJvb3QsIEluZGV4IHJ0aSwgQ21kVHlwZSBldmVudCkKewoJUmFuZ2VUYmxFbnRyeSAqcnRl ID0gcGxhbm5lcl9ydF9mZXRjaChydGksIHJvb3QpOwoJUmVsYXRpb24JcmVsYXRpb247CglU cmlnZ2VyRGVzYyAqdHJpZ0Rlc2M7Cglib29sCQlyZXN1bHQgPSBmYWxzZTsKCgkvKiBBc3N1 bWUgd2UgYWxyZWFkeSBoYXZlIGFkZXF1YXRlIGxvY2sgKi8KCXJlbGF0aW9uID0gdGFibGVf b3BlbihydGUtPnJlbGlkLCBOb0xvY2spOwoKCXRyaWdEZXNjID0gcmVsYXRpb24tPnRyaWdk ZXNjOwoJc3dpdGNoIChldmVudCkKCXsKCQljYXNlIENNRF9JTlNFUlQ6CgkJCWlmICh0cmln RGVzYyAmJgoJCQkJKHRyaWdEZXNjLT50cmlnX2luc2VydF9hZnRlcl9yb3cgfHwKCQkJCSB0 cmlnRGVzYy0+dHJpZ19pbnNlcnRfYmVmb3JlX3JvdykpCgkJCQlyZXN1bHQgPSB0cnVlOwoJ CQlicmVhazsKCQljYXNlIENNRF9VUERBVEU6CgkJCWlmICh0cmlnRGVzYyAmJgoJCQkJKHRy aWdEZXNjLT50cmlnX3VwZGF0ZV9hZnRlcl9yb3cgfHwKCQkJCSB0cmlnRGVzYy0+dHJpZ191 cGRhdGVfYmVmb3JlX3JvdykpCgkJCQlyZXN1bHQgPSB0cnVlOwoJCQlicmVhazsKCQljYXNl IENNRF9ERUxFVEU6CgkJCWlmICh0cmlnRGVzYyAmJgoJCQkJKHRyaWdEZXNjLT50cmlnX2Rl bGV0ZV9hZnRlcl9yb3cgfHwKCQkJCSB0cmlnRGVzYy0+dHJpZ19kZWxldGVfYmVmb3JlX3Jv dykpCgkJCQlyZXN1bHQgPSB0cnVlOwoJCQlicmVhazsKCQkJLyogVGhlcmUgaXMgbm8gc2Vw YXJhdGUgZXZlbnQgZm9yIE1FUkdFLCBvbmx5IElOU0VSVC9VUERBVEUvREVMRVRFICovCgkJ Y2FzZSBDTURfTUVSR0U6CgkJCXJlc3VsdCA9IGZhbHNlOwoJCQlicmVhazsKCQlkZWZhdWx0 OgoJCQllbG9nKEVSUk9SLCAidW5yZWNvZ25pemVkIENtZFR5cGU6ICVkIiwgKGludCkgZXZl bnQpOwoJCQlicmVhazsKCX0KCgl0YWJsZV9jbG9zZShyZWxhdGlvbiwgTm9Mb2NrKTsKCXJl dHVybiByZXN1bHQ7Cn0KCi8qCiAqIGhhc190cmFuc2l0aW9uX3RhYmxlcwogKgogKiBEZXRl Y3Qgd2hldGhlciB0aGUgc3BlY2lmaWVkIHJlbGF0aW9uIGhhcyBhbnkgdHJhbnNpdGlvbiB0 YWJsZXMgZm9yIGV2ZW50LgogKi8KYm9vbApoYXNfdHJhbnNpdGlvbl90YWJsZXMoUGxhbm5l ckluZm8gKnJvb3QsIEluZGV4IHJ0aSwgQ21kVHlwZSBldmVudCkKewoJUmFuZ2VUYmxFbnRy eSAqcnRlID0gcGxhbm5lcl9ydF9mZXRjaChydGksIHJvb3QpOwoJUmVsYXRpb24JcmVsYXRp b247CglUcmlnZ2VyRGVzYyAqdHJpZ0Rlc2M7Cglib29sCQlyZXN1bHQgPSBmYWxzZTsKCglB c3NlcnQocnRlLT5ydGVraW5kID09IFJURV9SRUxBVElPTik7CgoJLyogQ3VycmVudGx5IGZv cmVpZ24gdGFibGVzIGNhbm5vdCBoYXZlIHRyYW5zaXRpb24gdGFibGVzICovCglpZiAocnRl LT5yZWxraW5kID09IFJFTEtJTkRfRk9SRUlHTl9UQUJMRSkKCQlyZXR1cm4gcmVzdWx0OwoK CS8qIEFzc3VtZSB3ZSBhbHJlYWR5IGhhdmUgYWRlcXVhdGUgbG9jayAqLwoJcmVsYXRpb24g PSB0YWJsZV9vcGVuKHJ0ZS0+cmVsaWQsIE5vTG9jayk7CgoJdHJpZ0Rlc2MgPSByZWxhdGlv bi0+dHJpZ2Rlc2M7Cglzd2l0Y2ggKGV2ZW50KQoJewoJCWNhc2UgQ01EX0lOU0VSVDoKCQkJ aWYgKHRyaWdEZXNjICYmCgkJCQl0cmlnRGVzYy0+dHJpZ19pbnNlcnRfbmV3X3RhYmxlKQoJ CQkJcmVzdWx0ID0gdHJ1ZTsKCQkJYnJlYWs7CgkJY2FzZSBDTURfVVBEQVRFOgoJCQlpZiAo dHJpZ0Rlc2MgJiYKCQkJCSh0cmlnRGVzYy0+dHJpZ191cGRhdGVfb2xkX3RhYmxlIHx8CgkJ CQkgdHJpZ0Rlc2MtPnRyaWdfdXBkYXRlX25ld190YWJsZSkpCgkJCQlyZXN1bHQgPSB0cnVl OwoJCQlicmVhazsKCQljYXNlIENNRF9ERUxFVEU6CgkJCWlmICh0cmlnRGVzYyAmJgoJCQkJ dHJpZ0Rlc2MtPnRyaWdfZGVsZXRlX29sZF90YWJsZSkKCQkJCXJlc3VsdCA9IHRydWU7CgkJ CWJyZWFrOwoJCQkvKiBUaGVyZSBpcyBubyBzZXBhcmF0ZSBldmVudCBmb3IgTUVSR0UsIG9u bHkgSU5TRVJUL1VQREFURS9ERUxFVEUgKi8KCQljYXNlIENNRF9NRVJHRToKCQkJcmVzdWx0 ID0gZmFsc2U7CgkJCWJyZWFrOwoJCWRlZmF1bHQ6CgkJCWVsb2coRVJST1IsICJ1bnJlY29n bml6ZWQgQ21kVHlwZTogJWQiLCAoaW50KSBldmVudCk7CgkJCWJyZWFrOwoJfQoKCXRhYmxl X2Nsb3NlKHJlbGF0aW9uLCBOb0xvY2spOwoJcmV0dXJuIHJlc3VsdDsKfQoKLyoKICogaGFz X3N0b3JlZF9nZW5lcmF0ZWRfY29sdW1ucwogKgogKiBEb2VzIHRhYmxlIGlkZW50aWZpZWQg YnkgUlRJIGhhdmUgYW55IFNUT1JFRCBHRU5FUkFURUQgY29sdW1ucz8KICovCmJvb2wKaGFz X3N0b3JlZF9nZW5lcmF0ZWRfY29sdW1ucyhQbGFubmVySW5mbyAqcm9vdCwgSW5kZXggcnRp KQp7CglSYW5nZVRibEVudHJ5ICpydGUgPSBwbGFubmVyX3J0X2ZldGNoKHJ0aSwgcm9vdCk7 CglSZWxhdGlvbglyZWxhdGlvbjsKCVR1cGxlRGVzYwl0dXBkZXNjOwoJYm9vbAkJcmVzdWx0 ID0gZmFsc2U7CgoJLyogQXNzdW1lIHdlIGFscmVhZHkgaGF2ZSBhZGVxdWF0ZSBsb2NrICov CglyZWxhdGlvbiA9IHRhYmxlX29wZW4ocnRlLT5yZWxpZCwgTm9Mb2NrKTsKCgl0dXBkZXNj ID0gUmVsYXRpb25HZXREZXNjcihyZWxhdGlvbik7CglyZXN1bHQgPSB0dXBkZXNjLT5jb25z dHIgJiYgdHVwZGVzYy0+Y29uc3RyLT5oYXNfZ2VuZXJhdGVkX3N0b3JlZDsKCgl0YWJsZV9j bG9zZShyZWxhdGlvbiwgTm9Mb2NrKTsKCglyZXR1cm4gcmVzdWx0Owp9CgovKgogKiBnZXRf ZGVwZW5kZW50X2dlbmVyYXRlZF9jb2x1bW5zCiAqCiAqIEdldCB0aGUgY29sdW1uIG51bWJl cnMgb2YgYW55IFNUT1JFRCBHRU5FUkFURUQgY29sdW1ucyBvZiB0aGUgcmVsYXRpb24KICog dGhhdCBkZXBlbmQgb24gYW55IGNvbHVtbiBsaXN0ZWQgaW4gdGFyZ2V0X2NvbHMuICBCb3Ro IHRoZSBpbnB1dCBhbmQKICogcmVzdWx0IGJpdG1hcHNldHMgY29udGFpbiBjb2x1bW4gbnVt YmVycyBvZmZzZXQgYnkKICogRmlyc3RMb3dJbnZhbGlkSGVhcEF0dHJpYnV0ZU51bWJlci4K ICovCkJpdG1hcHNldCAqCmdldF9kZXBlbmRlbnRfZ2VuZXJhdGVkX2NvbHVtbnMoUGxhbm5l ckluZm8gKnJvb3QsIEluZGV4IHJ0aSwKCQkJCQkJCQlCaXRtYXBzZXQgKnRhcmdldF9jb2xz KQp7CglCaXRtYXBzZXQgICpkZXBlbmRlbnRDb2xzID0gTlVMTDsKCVJhbmdlVGJsRW50cnkg KnJ0ZSA9IHBsYW5uZXJfcnRfZmV0Y2gocnRpLCByb290KTsKCVJlbGF0aW9uCXJlbGF0aW9u OwoJVHVwbGVEZXNjCXR1cGRlc2M7CglUdXBsZUNvbnN0ciAqY29uc3RyOwoKCS8qIEFzc3Vt ZSB3ZSBhbHJlYWR5IGhhdmUgYWRlcXVhdGUgbG9jayAqLwoJcmVsYXRpb24gPSB0YWJsZV9v cGVuKHJ0ZS0+cmVsaWQsIE5vTG9jayk7CgoJdHVwZGVzYyA9IFJlbGF0aW9uR2V0RGVzY3Io cmVsYXRpb24pOwoJY29uc3RyID0gdHVwZGVzYy0+Y29uc3RyOwoKCWlmIChjb25zdHIgJiYg Y29uc3RyLT5oYXNfZ2VuZXJhdGVkX3N0b3JlZCkKCXsKCQlmb3IgKGludCBpID0gMDsgaSA8 IGNvbnN0ci0+bnVtX2RlZnZhbDsgaSsrKQoJCXsKCQkJQXR0ckRlZmF1bHQgKmRlZnZhbCA9 ICZjb25zdHItPmRlZnZhbFtpXTsKCQkJTm9kZQkgICAqZXhwcjsKCQkJQml0bWFwc2V0ICAq YXR0cnNfdXNlZCA9IE5VTEw7CgoJCQkvKiBza2lwIGlmIG5vdCBnZW5lcmF0ZWQgY29sdW1u ICovCgkJCWlmICghVHVwbGVEZXNjQ29tcGFjdEF0dHIodHVwZGVzYywgZGVmdmFsLT5hZG51 bSAtIDEpLT5hdHRnZW5lcmF0ZWQpCgkJCQljb250aW51ZTsKCgkJCS8qIGlkZW50aWZ5IGNv bHVtbnMgdGhpcyBnZW5lcmF0ZWQgY29sdW1uIGRlcGVuZHMgb24gKi8KCQkJZXhwciA9IHN0 cmluZ1RvTm9kZShkZWZ2YWwtPmFkYmluKTsKCQkJcHVsbF92YXJhdHRub3MoZXhwciwgMSwg JmF0dHJzX3VzZWQpOwoKCQkJaWYgKGJtc19vdmVybGFwKHRhcmdldF9jb2xzLCBhdHRyc191 c2VkKSkKCQkJCWRlcGVuZGVudENvbHMgPSBibXNfYWRkX21lbWJlcihkZXBlbmRlbnRDb2xz LAoJCQkJCQkJCQkJCSAgIGRlZnZhbC0+YWRudW0gLSBGaXJzdExvd0ludmFsaWRIZWFwQXR0 cmlidXRlTnVtYmVyKTsKCQl9Cgl9CgoJdGFibGVfY2xvc2UocmVsYXRpb24sIE5vTG9jayk7 CgoJcmV0dXJuIGRlcGVuZGVudENvbHM7Cn0KCi8qCiAqIHNldF9yZWxhdGlvbl9wYXJ0aXRp b25faW5mbwogKgogKiBTZXQgcGFydGl0aW9uaW5nIHNjaGVtZSBhbmQgcmVsYXRlZCBpbmZv cm1hdGlvbiBmb3IgYSBwYXJ0aXRpb25lZCB0YWJsZS4KICovCnN0YXRpYyB2b2lkCnNldF9y ZWxhdGlvbl9wYXJ0aXRpb25faW5mbyhQbGFubmVySW5mbyAqcm9vdCwgUmVsT3B0SW5mbyAq cmVsLAoJCQkJCQkJUmVsYXRpb24gcmVsYXRpb24pCnsKCVBhcnRpdGlvbkRlc2MgcGFydGRl c2M7CgoJLyoKCSAqIENyZWF0ZSB0aGUgUGFydGl0aW9uRGlyZWN0b3J5IGluZnJhc3RydWN0 dXJlIGlmIHdlIGRpZG4ndCBhbHJlYWR5LgoJICovCglpZiAocm9vdC0+Z2xvYi0+cGFydGl0 aW9uX2RpcmVjdG9yeSA9PSBOVUxMKQoJewoJCXJvb3QtPmdsb2ItPnBhcnRpdGlvbl9kaXJl Y3RvcnkgPQoJCQlDcmVhdGVQYXJ0aXRpb25EaXJlY3RvcnkoQ3VycmVudE1lbW9yeUNvbnRl eHQsIHRydWUpOwoJfQoKCXBhcnRkZXNjID0gUGFydGl0aW9uRGlyZWN0b3J5TG9va3VwKHJv b3QtPmdsb2ItPnBhcnRpdGlvbl9kaXJlY3RvcnksCgkJCQkJCQkJCQlyZWxhdGlvbik7Cgly ZWwtPnBhcnRfc2NoZW1lID0gZmluZF9wYXJ0aXRpb25fc2NoZW1lKHJvb3QsIHJlbGF0aW9u KTsKCUFzc2VydChwYXJ0ZGVzYyAhPSBOVUxMICYmIHJlbC0+cGFydF9zY2hlbWUgIT0gTlVM TCk7CglyZWwtPmJvdW5kaW5mbyA9IHBhcnRkZXNjLT5ib3VuZGluZm87CglyZWwtPm5wYXJ0 cyA9IHBhcnRkZXNjLT5ucGFydHM7CglzZXRfYmFzZXJlbF9wYXJ0aXRpb25fa2V5X2V4cHJz KHJlbGF0aW9uLCByZWwpOwoJc2V0X2Jhc2VyZWxfcGFydGl0aW9uX2NvbnN0cmFpbnQocmVs YXRpb24sIHJlbCk7Cn0KCi8qCiAqIGZpbmRfcGFydGl0aW9uX3NjaGVtZQogKgogKiBGaW5k IG9yIGNyZWF0ZSBhIFBhcnRpdGlvblNjaGVtZSBmb3IgdGhpcyBSZWxhdGlvbi4KICovCnN0 YXRpYyBQYXJ0aXRpb25TY2hlbWUKZmluZF9wYXJ0aXRpb25fc2NoZW1lKFBsYW5uZXJJbmZv ICpyb290LCBSZWxhdGlvbiByZWxhdGlvbikKewoJUGFydGl0aW9uS2V5IHBhcnRrZXkgPSBS ZWxhdGlvbkdldFBhcnRpdGlvbktleShyZWxhdGlvbik7CglMaXN0Q2VsbCAgICpsYzsKCWlu dAkJCXBhcnRuYXR0cywKCQkJCWk7CglQYXJ0aXRpb25TY2hlbWUgcGFydF9zY2hlbWU7CgoJ LyogQSBwYXJ0aXRpb25lZCB0YWJsZSBzaG91bGQgaGF2ZSBhIHBhcnRpdGlvbiBrZXkuICov CglBc3NlcnQocGFydGtleSAhPSBOVUxMKTsKCglwYXJ0bmF0dHMgPSBwYXJ0a2V5LT5wYXJ0 bmF0dHM7CgoJLyogU2VhcmNoIGZvciBhIG1hdGNoaW5nIHBhcnRpdGlvbiBzY2hlbWUgYW5k IHJldHVybiBpZiBmb3VuZCBvbmUuICovCglmb3JlYWNoKGxjLCByb290LT5wYXJ0X3NjaGVt ZXMpCgl7CgkJcGFydF9zY2hlbWUgPSBsZmlyc3QobGMpOwoKCQkvKiBNYXRjaCBwYXJ0aXRp b25pbmcgc3RyYXRlZ3kgYW5kIG51bWJlciBvZiBrZXlzLiAqLwoJCWlmIChwYXJ0a2V5LT5z dHJhdGVneSAhPSBwYXJ0X3NjaGVtZS0+c3RyYXRlZ3kgfHwKCQkJcGFydG5hdHRzICE9IHBh cnRfc2NoZW1lLT5wYXJ0bmF0dHMpCgkJCWNvbnRpbnVlOwoKCQkvKiBNYXRjaCBwYXJ0aXRp b24ga2V5IHR5cGUgcHJvcGVydGllcy4gKi8KCQlpZiAobWVtY21wKHBhcnRrZXktPnBhcnRv cGZhbWlseSwgcGFydF9zY2hlbWUtPnBhcnRvcGZhbWlseSwKCQkJCSAgIHNpemVvZihPaWQp ICogcGFydG5hdHRzKSAhPSAwIHx8CgkJCW1lbWNtcChwYXJ0a2V5LT5wYXJ0b3BjaW50eXBl LCBwYXJ0X3NjaGVtZS0+cGFydG9wY2ludHlwZSwKCQkJCSAgIHNpemVvZihPaWQpICogcGFy dG5hdHRzKSAhPSAwIHx8CgkJCW1lbWNtcChwYXJ0a2V5LT5wYXJ0Y29sbGF0aW9uLCBwYXJ0 X3NjaGVtZS0+cGFydGNvbGxhdGlvbiwKCQkJCSAgIHNpemVvZihPaWQpICogcGFydG5hdHRz KSAhPSAwKQoJCQljb250aW51ZTsKCgkJLyoKCQkgKiBMZW5ndGggYW5kIGJ5dmFsIGluZm9y bWF0aW9uIHNob3VsZCBtYXRjaCB3aGVuIHBhcnRvcGNpbnR5cGUKCQkgKiBtYXRjaGVzLgoJ CSAqLwoJCUFzc2VydChtZW1jbXAocGFydGtleS0+cGFydHR5cGxlbiwgcGFydF9zY2hlbWUt PnBhcnR0eXBsZW4sCgkJCQkJICBzaXplb2YoaW50MTYpICogcGFydG5hdHRzKSA9PSAwKTsK CQlBc3NlcnQobWVtY21wKHBhcnRrZXktPnBhcnR0eXBieXZhbCwgcGFydF9zY2hlbWUtPnBh cnR0eXBieXZhbCwKCQkJCQkgIHNpemVvZihib29sKSAqIHBhcnRuYXR0cykgPT0gMCk7CgoJ CS8qCgkJICogSWYgcGFydG9wZmFtaWx5IGFuZCBwYXJ0b3BjaW50eXBlIG1hdGNoZWQsIG11 c3QgaGF2ZSB0aGUgc2FtZQoJCSAqIHBhcnRpdGlvbiBjb21wYXJpc29uIGZ1bmN0aW9ucy4g IE5vdGUgdGhhdCB3ZSBjYW5ub3QgcmVsaWFibHkKCQkgKiBBc3NlcnQgdGhlIGVxdWFsaXR5 IG9mIGZ1bmN0aW9uIHN0cnVjdHMgdGhlbXNlbHZlcyBmb3IgdGhleSBtaWdodAoJCSAqIGJl IGRpZmZlcmVudCBhY3Jvc3MgUGFydGl0aW9uS2V5J3MsIHNvIGp1c3QgQXNzZXJ0IGZvciB0 aGUgZnVuY3Rpb24KCQkgKiBPSURzLgoJCSAqLwojaWZkZWYgVVNFX0FTU0VSVF9DSEVDS0lO RwoJCWZvciAoaSA9IDA7IGkgPCBwYXJ0a2V5LT5wYXJ0bmF0dHM7IGkrKykKCQkJQXNzZXJ0 KHBhcnRrZXktPnBhcnRzdXBmdW5jW2ldLmZuX29pZCA9PQoJCQkJICAgcGFydF9zY2hlbWUt PnBhcnRzdXBmdW5jW2ldLmZuX29pZCk7CiNlbmRpZgoKCQkvKiBGb3VuZCBtYXRjaGluZyBw YXJ0aXRpb24gc2NoZW1lLiAqLwoJCXJldHVybiBwYXJ0X3NjaGVtZTsKCX0KCgkvKgoJICog RGlkIG5vdCBmaW5kIG1hdGNoaW5nIHBhcnRpdGlvbiBzY2hlbWUuIENyZWF0ZSBvbmUgY29w eWluZyByZWxldmFudAoJICogaW5mb3JtYXRpb24gZnJvbSB0aGUgcmVsY2FjaGUuIFdlIG5l ZWQgdG8gY29weSB0aGUgY29udGVudHMgb2YgdGhlCgkgKiBhcnJheSBzaW5jZSB0aGUgcmVs Y2FjaGUgZW50cnkgbWF5IG5vdCBzdXJ2aXZlIGFmdGVyIHdlIGhhdmUgY2xvc2VkIHRoZQoJ ICogcmVsYXRpb24uCgkgKi8KCXBhcnRfc2NoZW1lID0gcGFsbG9jMF9vYmplY3QoUGFydGl0 aW9uU2NoZW1lRGF0YSk7CglwYXJ0X3NjaGVtZS0+c3RyYXRlZ3kgPSBwYXJ0a2V5LT5zdHJh dGVneTsKCXBhcnRfc2NoZW1lLT5wYXJ0bmF0dHMgPSBwYXJ0a2V5LT5wYXJ0bmF0dHM7CgoJ cGFydF9zY2hlbWUtPnBhcnRvcGZhbWlseSA9IHBhbGxvY19hcnJheShPaWQsIHBhcnRuYXR0 cyk7CgltZW1jcHkocGFydF9zY2hlbWUtPnBhcnRvcGZhbWlseSwgcGFydGtleS0+cGFydG9w ZmFtaWx5LAoJCSAgIHNpemVvZihPaWQpICogcGFydG5hdHRzKTsKCglwYXJ0X3NjaGVtZS0+ cGFydG9wY2ludHlwZSA9IHBhbGxvY19hcnJheShPaWQsIHBhcnRuYXR0cyk7CgltZW1jcHko cGFydF9zY2hlbWUtPnBhcnRvcGNpbnR5cGUsIHBhcnRrZXktPnBhcnRvcGNpbnR5cGUsCgkJ ICAgc2l6ZW9mKE9pZCkgKiBwYXJ0bmF0dHMpOwoKCXBhcnRfc2NoZW1lLT5wYXJ0Y29sbGF0 aW9uID0gcGFsbG9jX2FycmF5KE9pZCwgcGFydG5hdHRzKTsKCW1lbWNweShwYXJ0X3NjaGVt ZS0+cGFydGNvbGxhdGlvbiwgcGFydGtleS0+cGFydGNvbGxhdGlvbiwKCQkgICBzaXplb2Yo T2lkKSAqIHBhcnRuYXR0cyk7CgoJcGFydF9zY2hlbWUtPnBhcnR0eXBsZW4gPSBwYWxsb2Nf YXJyYXkoaW50MTYsIHBhcnRuYXR0cyk7CgltZW1jcHkocGFydF9zY2hlbWUtPnBhcnR0eXBs ZW4sIHBhcnRrZXktPnBhcnR0eXBsZW4sCgkJICAgc2l6ZW9mKGludDE2KSAqIHBhcnRuYXR0 cyk7CgoJcGFydF9zY2hlbWUtPnBhcnR0eXBieXZhbCA9IHBhbGxvY19hcnJheShib29sLCBw YXJ0bmF0dHMpOwoJbWVtY3B5KHBhcnRfc2NoZW1lLT5wYXJ0dHlwYnl2YWwsIHBhcnRrZXkt PnBhcnR0eXBieXZhbCwKCQkgICBzaXplb2YoYm9vbCkgKiBwYXJ0bmF0dHMpOwoKCXBhcnRf c2NoZW1lLT5wYXJ0c3VwZnVuYyA9IHBhbGxvY19hcnJheShGbWdySW5mbywgcGFydG5hdHRz KTsKCWZvciAoaSA9IDA7IGkgPCBwYXJ0bmF0dHM7IGkrKykKCQlmbWdyX2luZm9fY29weSgm cGFydF9zY2hlbWUtPnBhcnRzdXBmdW5jW2ldLCAmcGFydGtleS0+cGFydHN1cGZ1bmNbaV0s CgkJCQkJICAgQ3VycmVudE1lbW9yeUNvbnRleHQpOwoKCS8qIEFkZCB0aGUgcGFydGl0aW9u aW5nIHNjaGVtZSB0byBQbGFubmVySW5mby4gKi8KCXJvb3QtPnBhcnRfc2NoZW1lcyA9IGxh cHBlbmQocm9vdC0+cGFydF9zY2hlbWVzLCBwYXJ0X3NjaGVtZSk7CgoJcmV0dXJuIHBhcnRf c2NoZW1lOwp9CgovKgogKiBzZXRfYmFzZXJlbF9wYXJ0aXRpb25fa2V5X2V4cHJzCiAqCiAq IEJ1aWxkcyBwYXJ0aXRpb24ga2V5IGV4cHJlc3Npb25zIGZvciB0aGUgZ2l2ZW4gYmFzZSBy ZWxhdGlvbiBhbmQgZmlsbHMKICogcmVsLT5wYXJ0ZXhwcnMuCiAqLwpzdGF0aWMgdm9pZApz ZXRfYmFzZXJlbF9wYXJ0aXRpb25fa2V5X2V4cHJzKFJlbGF0aW9uIHJlbGF0aW9uLAoJCQkJ CQkJCVJlbE9wdEluZm8gKnJlbCkKewoJUGFydGl0aW9uS2V5IHBhcnRrZXkgPSBSZWxhdGlv bkdldFBhcnRpdGlvbktleShyZWxhdGlvbik7CglpbnQJCQlwYXJ0bmF0dHM7CglpbnQJCQlj bnQ7CglMaXN0CSAgKipwYXJ0ZXhwcnM7CglMaXN0Q2VsbCAgICpsYzsKCUluZGV4CQl2YXJu byA9IHJlbC0+cmVsaWQ7CgoJQXNzZXJ0KElTX1NJTVBMRV9SRUwocmVsKSAmJiByZWwtPnJl bGlkID4gMCk7CgoJLyogQSBwYXJ0aXRpb25lZCB0YWJsZSBzaG91bGQgaGF2ZSBhIHBhcnRp dGlvbiBrZXkuICovCglBc3NlcnQocGFydGtleSAhPSBOVUxMKTsKCglwYXJ0bmF0dHMgPSBw YXJ0a2V5LT5wYXJ0bmF0dHM7CglwYXJ0ZXhwcnMgPSBwYWxsb2NfYXJyYXkoTGlzdCAqLCBw YXJ0bmF0dHMpOwoJbGMgPSBsaXN0X2hlYWQocGFydGtleS0+cGFydGV4cHJzKTsKCglmb3Ig KGNudCA9IDA7IGNudCA8IHBhcnRuYXR0czsgY250KyspCgl7CgkJRXhwcgkgICAqcGFydGV4 cHI7CgkJQXR0ck51bWJlcglhdHRubyA9IHBhcnRrZXktPnBhcnRhdHRyc1tjbnRdOwoKCQlp ZiAoYXR0bm8gIT0gSW52YWxpZEF0dHJOdW1iZXIpCgkJewoJCQkvKiBTaW5nbGUgY29sdW1u IHBhcnRpdGlvbiBrZXkgaXMgc3RvcmVkIGFzIGEgVmFyIG5vZGUuICovCgkJCUFzc2VydChh dHRubyA+IDApOwoKCQkJcGFydGV4cHIgPSAoRXhwciAqKSBtYWtlVmFyKHZhcm5vLCBhdHRu bywKCQkJCQkJCQkJCXBhcnRrZXktPnBhcnR0eXBpZFtjbnRdLAoJCQkJCQkJCQkJcGFydGtl eS0+cGFydHR5cG1vZFtjbnRdLAoJCQkJCQkJCQkJcGFydGtleS0+cGFydHR5cGNvbGxbY250 XSwgMCk7CgkJfQoJCWVsc2UKCQl7CgkJCWlmIChsYyA9PSBOVUxMKQoJCQkJZWxvZyhFUlJP UiwgIndyb25nIG51bWJlciBvZiBwYXJ0aXRpb24ga2V5IGV4cHJlc3Npb25zIik7CgoJCQkv KiBSZS1zdGFtcCB0aGUgZXhwcmVzc2lvbiB3aXRoIGdpdmVuIHZhcm5vLiAqLwoJCQlwYXJ0 ZXhwciA9IChFeHByICopIGNvcHlPYmplY3QobGZpcnN0KGxjKSk7CgkJCUNoYW5nZVZhck5v ZGVzKChOb2RlICopIHBhcnRleHByLCAxLCB2YXJubywgMCk7CgkJCWxjID0gbG5leHQocGFy dGtleS0+cGFydGV4cHJzLCBsYyk7CgkJfQoKCQkvKiBCYXNlIHJlbGF0aW9ucyBoYXZlIGEg c2luZ2xlIGV4cHJlc3Npb24gcGVyIGtleS4gKi8KCQlwYXJ0ZXhwcnNbY250XSA9IGxpc3Rf bWFrZTEocGFydGV4cHIpOwoJfQoKCXJlbC0+cGFydGV4cHJzID0gcGFydGV4cHJzOwoKCS8q CgkgKiBBIGJhc2UgcmVsYXRpb24gZG9lcyBub3QgaGF2ZSBudWxsYWJsZSBwYXJ0aXRpb24g a2V5IGV4cHJlc3Npb25zLCBzaW5jZQoJICogbm8gb3V0ZXIgam9pbiBpcyBpbnZvbHZlZC4g IFdlIHN0aWxsIGFsbG9jYXRlIGFuIGFycmF5IG9mIGVtcHR5CgkgKiBleHByZXNzaW9uIGxp c3RzIHRvIGtlZXAgcGFydGl0aW9uIGtleSBleHByZXNzaW9uIGhhbmRsaW5nIGNvZGUgc2lt cGxlLgoJICogU2VlIGJ1aWxkX2pvaW5yZWxfcGFydGl0aW9uX2luZm8oKSBhbmQgbWF0Y2hf ZXhwcl90b19wYXJ0aXRpb25fa2V5cygpLgoJICovCglyZWwtPm51bGxhYmxlX3BhcnRleHBy cyA9IHBhbGxvYzBfYXJyYXkoTGlzdCAqLCBwYXJ0bmF0dHMpOwp9CgovKgogKiBzZXRfYmFz ZXJlbF9wYXJ0aXRpb25fY29uc3RyYWludAogKgogKiBCdWlsZHMgdGhlIHBhcnRpdGlvbiBj b25zdHJhaW50IGZvciB0aGUgZ2l2ZW4gYmFzZSByZWxhdGlvbiBhbmQgc2V0cyBpdAogKiBp biB0aGUgZ2l2ZW4gUmVsT3B0SW5mby4gIEFsbCBWYXIgbm9kZXMgYXJlIHJlc3RhbXBlZCB3 aXRoIHRoZSByZWxpZCBvZiB0aGUKICogZ2l2ZW4gcmVsYXRpb24uCiAqLwpzdGF0aWMgdm9p ZApzZXRfYmFzZXJlbF9wYXJ0aXRpb25fY29uc3RyYWludChSZWxhdGlvbiByZWxhdGlvbiwg UmVsT3B0SW5mbyAqcmVsKQp7CglMaXN0CSAgICpwYXJ0Y29uc3RyOwoKCWlmIChyZWwtPnBh cnRpdGlvbl9xdWFsKQkvKiBhbHJlYWR5IGRvbmUgKi8KCQlyZXR1cm47CgoJLyoKCSAqIFJ1 biB0aGUgcGFydGl0aW9uIHF1YWxzIHRocm91Z2ggY29uc3Qtc2ltcGxpZmljYXRpb24gc2lt aWxhciB0byBjaGVjawoJICogY29uc3RyYWludHMuICBXZSBza2lwIGNhbm9uaWNhbGl6ZV9x dWFsLCB0aG91Z2gsIGJlY2F1c2UgcGFydGl0aW9uCgkgKiBxdWFscyBzaG91bGQgYmUgaW4g Y2Fub25pY2FsIGZvcm0gYWxyZWFkeTsgYWxzbywgc2luY2UgdGhlIHF1YWwgaXMgaW4KCSAq IGltcGxpY2l0LUFORCBmb3JtYXQsIHdlJ2QgaGF2ZSB0byBleHBsaWNpdGx5IGNvbnZlcnQg aXQgdG8gZXhwbGljaXQtQU5ECgkgKiBmb3JtYXQgYW5kIGJhY2sgYWdhaW4uCgkgKi8KCXBh cnRjb25zdHIgPSBSZWxhdGlvbkdldFBhcnRpdGlvblF1YWwocmVsYXRpb24pOwoJaWYgKHBh cnRjb25zdHIpCgl7CgkJcGFydGNvbnN0ciA9IChMaXN0ICopIGV4cHJlc3Npb25fcGxhbm5l cigoRXhwciAqKSBwYXJ0Y29uc3RyKTsKCQlpZiAocmVsLT5yZWxpZCAhPSAxKQoJCQlDaGFu Z2VWYXJOb2RlcygoTm9kZSAqKSBwYXJ0Y29uc3RyLCAxLCByZWwtPnJlbGlkLCAwKTsKCQly ZWwtPnBhcnRpdGlvbl9xdWFsID0gcGFydGNvbnN0cjsKCX0KfQoAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC4vcmVsLmgAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAwMDAwNjY0ADAwMDE3NTAAMDAwMTc1MAAwMDAwMDA2MjU2 NwAxNTIyMTE2NjI0NwAwMTA2NjYAIDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAdXN0YXIgIAB4bWFuAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AHhtYW4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA LyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAqCiAqIHJlbC5oCiAqCSAgUE9TVEdSRVMgcmVsYXRp b24gZGVzY3JpcHRvciAoYS9rL2EgcmVsY2FjaGUgZW50cnkpIGRlZmluaXRpb25zLgogKgog KgogKiBQb3J0aW9ucyBDb3B5cmlnaHQgKGMpIDE5OTYtMjAyNiwgUG9zdGdyZVNRTCBHbG9i YWwgRGV2ZWxvcG1lbnQgR3JvdXAKICogUG9ydGlvbnMgQ29weXJpZ2h0IChjKSAxOTk0LCBS ZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEKICoKICogc3JjL2luY2x1 ZGUvdXRpbHMvcmVsLmgKICoKICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAqLwojaWZuZGVmIFJF TF9ICiNkZWZpbmUgUkVMX0gKCiNpbmNsdWRlICJhY2Nlc3MvdHVwZGVzYy5oIgojaW5jbHVk ZSAiYWNjZXNzL3hsb2cuaCIKI2luY2x1ZGUgImNhdGFsb2cvY2F0YWxvZy5oIgojaW5jbHVk ZSAiY2F0YWxvZy9wZ19jbGFzcy5oIgojaW5jbHVkZSAiY2F0YWxvZy9wZ19pbmRleC5oIgoj aW5jbHVkZSAiY2F0YWxvZy9wZ19wdWJsaWNhdGlvbi5oIgojaW5jbHVkZSAibm9kZXMvYml0 bWFwc2V0LmgiCiNpbmNsdWRlICJwYXJ0aXRpb25pbmcvcGFydGRlZnMuaCIKI2luY2x1ZGUg InJld3JpdGUvcHJzMmxvY2suaCIKI2luY2x1ZGUgInN0b3JhZ2UvYmxvY2suaCIKI2luY2x1 ZGUgInN0b3JhZ2UvcmVsZmlsZWxvY2F0b3IuaCIKI2luY2x1ZGUgInN0b3JhZ2Uvc21nci5o IgojaW5jbHVkZSAidXRpbHMvcmVsY2FjaGUuaCIKI2luY2x1ZGUgInV0aWxzL3JlbHRyaWdn ZXIuaCIKCgovKgogKiBMb2NrUmVsSWQgYW5kIExvY2tJbmZvIHJlYWxseSBiZWxvbmcgdG8g bG1nci5oLCBidXQgaXQncyBtb3JlIGNvbnZlbmllbnQKICogdG8gZGVjbGFyZSB0aGVtIGhl cmUgc28gd2UgY2FuIGhhdmUgYSBMb2NrSW5mb0RhdGEgZmllbGQgaW4gYSBSZWxhdGlvbi4K ICovCgp0eXBlZGVmIHN0cnVjdCBMb2NrUmVsSWQKewoJT2lkCQkJcmVsSWQ7CQkJLyogYSBy ZWxhdGlvbiBpZGVudGlmaWVyICovCglPaWQJCQlkYklkOwkJCS8qIGEgZGF0YWJhc2UgaWRl bnRpZmllciAqLwp9IExvY2tSZWxJZDsKCnR5cGVkZWYgc3RydWN0IExvY2tJbmZvRGF0YQp7 CglMb2NrUmVsSWQJbG9ja1JlbElkOwp9IExvY2tJbmZvRGF0YTsKCnR5cGVkZWYgTG9ja0lu Zm9EYXRhICpMb2NrSW5mbzsKCi8qCiAqIEhlcmUgYXJlIHRoZSBjb250ZW50cyBvZiBhIHJl bGF0aW9uIGNhY2hlIGVudHJ5LgogKi8KCnR5cGVkZWYgc3RydWN0IFJlbGF0aW9uRGF0YQp7 CglSZWxGaWxlTG9jYXRvciByZF9sb2NhdG9yOwkvKiByZWxhdGlvbiBwaHlzaWNhbCBpZGVu dGlmaWVyICovCglTTWdyUmVsYXRpb24gcmRfc21ncjsJCS8qIGNhY2hlZCBmaWxlIGhhbmRs ZSwgb3IgTlVMTCAqLwoJaW50CQkJcmRfcmVmY250OwkJLyogcmVmZXJlbmNlIGNvdW50ICov CglQcm9jTnVtYmVyCXJkX2JhY2tlbmQ7CQkvKiBvd25pbmcgYmFja2VuZCdzIHByb2MgbnVt YmVyLCBpZiB0ZW1wIHJlbCAqLwoJYm9vbAkJcmRfaXNsb2NhbHRlbXA7IC8qIHJlbCBpcyBh IHRlbXAgcmVsIG9mIHRoaXMgc2Vzc2lvbiAqLwoJYm9vbAkJcmRfaXNuYWlsZWQ7CS8qIHJl bCBpcyBuYWlsZWQgaW4gY2FjaGUgKi8KCWJvb2wJCXJkX2lzdmFsaWQ7CQkvKiByZWxjYWNo ZSBlbnRyeSBpcyB2YWxpZCAqLwoJYm9vbAkJcmRfaW5kZXh2YWxpZDsJLyogaXMgcmRfaW5k ZXhsaXN0IHZhbGlkPyAoYWxzbyByZF9wa2luZGV4IGFuZAoJCQkJCQkJCSAqIHJkX3JlcGxp ZGluZGV4KSAqLwoJYm9vbAkJcmRfc3RhdHZhbGlkOwkvKiBpcyByZF9zdGF0bGlzdCB2YWxp ZD8gKi8KCgkvKi0tLS0tLS0tLS0KCSAqIHJkX2NyZWF0ZVN1YmlkIGlzIHRoZSBJRCBvZiB0 aGUgaGlnaGVzdCBzdWJ0cmFuc2FjdGlvbiB0aGUgcmVsIGhhcwoJICogc3Vydml2ZWQgaW50 byBvciB6ZXJvIGlmIHRoZSByZWwgb3IgaXRzIHN0b3JhZ2Ugd2FzIGNyZWF0ZWQgYmVmb3Jl IHRoZQoJICogY3VycmVudCB0b3AgdHJhbnNhY3Rpb24uICAoSW5kZXhTdG10Lm9sZE51bWJl ciBsZWFkcyB0byB0aGUgY2FzZSBvZiBhIG5ldwoJICogcmVsIHdpdGggYW4gb2xkIHJkX2xv Y2F0b3IuKSAgcmRfZmlyc3RSZWxmaWxlbG9jYXRvclN1YmlkIGlzIHRoZSBJRCBvZiB0aGUK CSAqIGhpZ2hlc3Qgc3VidHJhbnNhY3Rpb24gYW4gcmRfbG9jYXRvciBjaGFuZ2UgaGFzIHN1 cnZpdmVkIGludG8gb3IgemVybyBpZgoJICogcmRfbG9jYXRvciBtYXRjaGVzIHRoZSB2YWx1 ZSBpdCBoYWQgYXQgdGhlIHN0YXJ0IG9mIHRoZSBjdXJyZW50IHRvcAoJICogdHJhbnNhY3Rp b24uICAoUm9sbGluZyBiYWNrIHRoZSBzdWJ0cmFuc2FjdGlvbiB0aGF0CgkgKiByZF9maXJz dFJlbGZpbGVsb2NhdG9yU3ViaWQgZGVub3RlcyB3b3VsZCByZXN0b3JlIHJkX2xvY2F0b3Ig dG8gdGhlIHZhbHVlIGl0CgkgKiBoYWQgYXQgdGhlIHN0YXJ0IG9mIHRoZSBjdXJyZW50IHRv cCB0cmFuc2FjdGlvbi4gIFJvbGxpbmcgYmFjayBhbnkKCSAqIGxvd2VyIHN1YnRyYW5zYWN0 aW9uIHdvdWxkIG5vdC4pICBUaGVpciBhY2N1cmFjeSBpcyBjcml0aWNhbCB0bwoJICogUmVs YXRpb25OZWVkc1dBTCgpLgoJICoKCSAqIHJkX25ld1JlbGZpbGVsb2NhdG9yU3ViaWQgaXMg dGhlIElEIG9mIHRoZSBoaWdoZXN0IHN1YnRyYW5zYWN0aW9uIHRoZQoJICogbW9zdC1yZWNl bnQgcmVsZmlsZW51bWJlciBjaGFuZ2UgaGFzIHN1cnZpdmVkIGludG8gb3IgemVybyBpZiBu b3QgY2hhbmdlZAoJICogaW4gdGhlIGN1cnJlbnQgdHJhbnNhY3Rpb24gKG9yIHdlIGhhdmUg Zm9yZ290dGVuIGNoYW5naW5nIGl0KS4gIFRoaXMKCSAqIGZpZWxkIGlzIGFjY3VyYXRlIHdo ZW4gbm9uLXplcm8sIGJ1dCBpdCBjYW4gYmUgemVybyB3aGVuIGEgcmVsYXRpb24gaGFzCgkg KiBtdWx0aXBsZSBuZXcgcmVsZmlsZW51bWJlcnMgd2l0aGluIGEgc2luZ2xlIHRyYW5zYWN0 aW9uLCB3aXRoIG9uZSBvZiB0aGVtCgkgKiBvY2N1cnJpbmcgaW4gYSBzdWJzZXF1ZW50bHkg YWJvcnRlZCBzdWJ0cmFuc2FjdGlvbiwgZS5nLgoJICoJCUJFR0lOOwoJICoJCVRSVU5DQVRF IHQ7CgkgKgkJU0FWRVBPSU5UIHNhdmU7CgkgKgkJVFJVTkNBVEUgdDsKCSAqCQlST0xMQkFD SyBUTyBzYXZlOwoJICoJCS0tIHJkX25ld1JlbGZpbGVsb2NhdG9yU3ViaWQgaXMgbm93IGZv cmdvdHRlbgoJICoKCSAqIElmIGV2ZXJ5IHJkXypTdWJpZCBmaWVsZCBpcyB6ZXJvLCB0aGV5 IGFyZSByZWFkLW9ubHkgb3V0c2lkZQoJICogcmVsY2FjaGUuYy4gIEZpbGVzIHRoYXQgdHJp Z2dlciByZF9sb2NhdG9yIGNoYW5nZXMgYnkgdXBkYXRpbmcKCSAqIHBnX2NsYXNzLnJlbHRh Ymxlc3BhY2UgYW5kL29yIHBnX2NsYXNzLnJlbGZpbGVub2RlIGNhbGwKCSAqIFJlbGF0aW9u QXNzdW1lTmV3UmVsZmlsZWxvY2F0b3IoKSB0byB1cGRhdGUgcmRfKlN1YmlkLgoJICoKCSAq IHJkX2Ryb3BwZWRTdWJpZCBpcyB0aGUgSUQgb2YgdGhlIGhpZ2hlc3Qgc3VidHJhbnNhY3Rp b24gdGhhdCBhIGRyb3Agb2YKCSAqIHRoZSByZWwgaGFzIHN1cnZpdmVkIGludG8uICBJbiBl bnRyaWVzIHZpc2libGUgb3V0c2lkZSByZWxjYWNoZS5jLCB0aGlzCgkgKiBpcyBhbHdheXMg emVyby4KCSAqLwoJU3ViVHJhbnNhY3Rpb25JZCByZF9jcmVhdGVTdWJpZDsJLyogcmVsIHdh cyBjcmVhdGVkIGluIGN1cnJlbnQgeGFjdCAqLwoJU3ViVHJhbnNhY3Rpb25JZCByZF9uZXdS ZWxmaWxlbG9jYXRvclN1YmlkOyAvKiBoaWdoZXN0IHN1YnhhY3QgY2hhbmdpbmcKCQkJCQkJ CQkJCQkJICogcmRfbG9jYXRvciB0byBjdXJyZW50IHZhbHVlICovCglTdWJUcmFuc2FjdGlv bklkIHJkX2ZpcnN0UmVsZmlsZWxvY2F0b3JTdWJpZDsJLyogaGlnaGVzdCBzdWJ4YWN0CgkJ CQkJCQkJCQkJCQkgKiBjaGFuZ2luZyByZF9sb2NhdG9yIHRvCgkJCQkJCQkJCQkJCQkgKiBh bnkgdmFsdWUgKi8KCVN1YlRyYW5zYWN0aW9uSWQgcmRfZHJvcHBlZFN1YmlkOwkvKiBkcm9w cGVkIHdpdGggYW5vdGhlciBTdWJpZCBzZXQgKi8KCglGb3JtX3BnX2NsYXNzIHJkX3JlbDsJ CS8qIFJFTEFUSU9OIHR1cGxlICovCglUdXBsZURlc2MJcmRfYXR0OwkJCS8qIHR1cGxlIGRl c2NyaXB0b3IgKi8KCU9pZAkJCXJkX2lkOwkJCS8qIHJlbGF0aW9uJ3Mgb2JqZWN0IGlkICov CglMb2NrSW5mb0RhdGEgcmRfbG9ja0luZm87CS8qIGxvY2sgbWdyJ3MgaW5mbyBmb3IgbG9j a2luZyByZWxhdGlvbiAqLwoJUnVsZUxvY2sgICAqcmRfcnVsZXM7CQkvKiByZXdyaXRlIHJ1 bGVzICovCglNZW1vcnlDb250ZXh0IHJkX3J1bGVzY3h0OwkvKiBwcml2YXRlIG1lbW9yeSBj eHQgZm9yIHJkX3J1bGVzLCBpZiBhbnkgKi8KCVRyaWdnZXJEZXNjICp0cmlnZGVzYzsJCS8q IFRyaWdnZXIgaW5mbywgb3IgTlVMTCBpZiByZWwgaGFzIG5vbmUgKi8KCS8qIHVzZSAic3Ry dWN0IiBoZXJlIHRvIGF2b2lkIG5lZWRpbmcgdG8gaW5jbHVkZSByb3dzZWN1cml0eS5oOiAq LwoJc3RydWN0IFJvd1NlY3VyaXR5RGVzYyAqcmRfcnNkZXNjOwkvKiByb3cgc2VjdXJpdHkg cG9saWNpZXMsIG9yIE5VTEwgKi8KCgkvKiBkYXRhIG1hbmFnZWQgYnkgUmVsYXRpb25HZXRG S2V5TGlzdDogKi8KCUxpc3QJICAgKnJkX2ZrZXlsaXN0OwkvKiBsaXN0IG9mIEZvcmVpZ25L ZXlDYWNoZUluZm8gKHNlZSBiZWxvdykgKi8KCWJvb2wJCXJkX2ZrZXl2YWxpZDsJLyogdHJ1 ZSBpZiBsaXN0IGhhcyBiZWVuIGNvbXB1dGVkICovCgoJLyogZGF0YSBtYW5hZ2VkIGJ5IFJl bGF0aW9uR2V0UGFydGl0aW9uS2V5OiAqLwoJUGFydGl0aW9uS2V5IHJkX3BhcnRrZXk7CS8q IHBhcnRpdGlvbiBrZXksIG9yIE5VTEwgKi8KCU1lbW9yeUNvbnRleHQgcmRfcGFydGtleWN4 dDsJLyogcHJpdmF0ZSBjb250ZXh0IGZvciByZF9wYXJ0a2V5LCBpZiBhbnkgKi8KCgkvKiBk YXRhIG1hbmFnZWQgYnkgUmVsYXRpb25HZXRQYXJ0aXRpb25EZXNjOiAqLwoJUGFydGl0aW9u RGVzYyByZF9wYXJ0ZGVzYzsJLyogcGFydGl0aW9uIGRlc2NyaXB0b3IsIG9yIE5VTEwgKi8K CU1lbW9yeUNvbnRleHQgcmRfcGRjeHQ7CQkvKiBwcml2YXRlIGNvbnRleHQgZm9yIHJkX3Bh cnRkZXNjLCBpZiBhbnkgKi8KCgkvKiBTYW1lIGFzIGFib3ZlLCBmb3IgcGFydGRlc2NzIHRo YXQgb21pdCBkZXRhY2hlZCBwYXJ0aXRpb25zICovCglQYXJ0aXRpb25EZXNjIHJkX3BhcnRk ZXNjX25vZGV0YWNoZWQ7CS8qIHBhcnRkZXNjIHcvbyBkZXRhY2hlZCBwYXJ0cyAqLwoJTWVt b3J5Q29udGV4dCByZF9wZGRjeHQ7CS8qIGZvciByZF9wYXJ0ZGVzY19ub2RldGFjaGVkLCBp ZiBhbnkgKi8KCgkvKgoJICogcGdfaW5oZXJpdHMueG1pbiBvZiB0aGUgcGFydGl0aW9uIHRo YXQgd2FzIGV4Y2x1ZGVkIGluCgkgKiByZF9wYXJ0ZGVzY19ub2RldGFjaGVkLiAgVGhpcyBp bmZvcm1zIGEgZnV0dXJlIHVzZXIgb2YgdGhhdCBwYXJ0ZGVzYzoKCSAqIGlmIHRoaXMgdmFs dWUgaXMgbm90IGluIHByb2dyZXNzIGZvciB0aGUgYWN0aXZlIHNuYXBzaG90LCB0aGVuIHRo ZQoJICogcGFydGRlc2MgY2FuIGJlIHVzZWQsIG90aGVyd2lzZSB0aGV5IGhhdmUgdG8gYnVp bGQgYSBuZXcgb25lLiAgKFRoaXMKCSAqIG1hdGNoZXMgd2hhdCBmaW5kX2luaGVyaXRhbmNl X2NoaWxkcmVuX2V4dGVuZGVkIHdvdWxkIGRvKS4KCSAqLwoJVHJhbnNhY3Rpb25JZCByZF9w YXJ0ZGVzY19ub2RldGFjaGVkX3htaW47CgoJLyogZGF0YSBtYW5hZ2VkIGJ5IFJlbGF0aW9u R2V0UGFydGl0aW9uUXVhbDogKi8KCUxpc3QJICAgKnJkX3BhcnRjaGVjazsJLyogcGFydGl0 aW9uIENIRUNLIHF1YWxzICovCglib29sCQlyZF9wYXJ0Y2hlY2t2YWxpZDsJLyogdHJ1ZSBp ZiBsaXN0IGhhcyBiZWVuIGNvbXB1dGVkICovCglNZW1vcnlDb250ZXh0IHJkX3BhcnRjaGVj a2N4dDsJLyogcHJpdmF0ZSBjeHQgZm9yIHJkX3BhcnRjaGVjaywgaWYgYW55ICovCgoJLyog ZGF0YSBtYW5hZ2VkIGJ5IFJlbGF0aW9uR2V0SW5kZXhMaXN0OiAqLwoJTGlzdAkgICAqcmRf aW5kZXhsaXN0OwkvKiBsaXN0IG9mIE9JRHMgb2YgaW5kZXhlcyBvbiByZWxhdGlvbiAqLwoJ T2lkCQkJcmRfcGtpbmRleDsJCS8qIE9JRCBvZiAoZGVmZXJyYWJsZT8pIHByaW1hcnkga2V5 LCBpZiBhbnkgKi8KCWJvb2wJCXJkX2lzcGtkZWZlcnJhYmxlOwkvKiBpcyByZF9wa2luZGV4 IGEgZGVmZXJyYWJsZSBQSz8gKi8KCU9pZAkJCXJkX3JlcGxpZGluZGV4OyAvKiBPSUQgb2Yg cmVwbGljYSBpZGVudGl0eSBpbmRleCwgaWYgYW55ICovCgoJLyogZGF0YSBtYW5hZ2VkIGJ5 IFJlbGF0aW9uR2V0U3RhdEV4dExpc3Q6ICovCglMaXN0CSAgICpyZF9zdGF0bGlzdDsJLyog bGlzdCBvZiBPSURzIG9mIGV4dGVuZGVkIHN0YXRzICovCgoJLyogZGF0YSBtYW5hZ2VkIGJ5 IFJlbGF0aW9uR2V0SW5kZXhBdHRyQml0bWFwOiAqLwoJYm9vbAkJcmRfYXR0cnN2YWxpZDsJ LyogYXJlIGJpdG1hcHMgb2YgYXR0cnMgdmFsaWQ/ICovCglCaXRtYXBzZXQgICpyZF9rZXlh dHRyOwkJLyogY29scyB0aGF0IGNhbiBiZSByZWYnZCBieSBmb3JlaWduIGtleXMgKi8KCUJp dG1hcHNldCAgKnJkX3BrYXR0cjsJCS8qIGNvbHMgaW5jbHVkZWQgaW4gcHJpbWFyeSBrZXkg Ki8KCUJpdG1hcHNldCAgKnJkX2lkYXR0cjsJCS8qIGluY2x1ZGVkIGluIHJlcGxpY2EgaWRl bnRpdHkgaW5kZXggKi8KCUJpdG1hcHNldCAgKnJkX2hvdGJsb2NraW5nYXR0cjsgLyogY29s cyBibG9ja2luZyBIT1QgdXBkYXRlICovCglCaXRtYXBzZXQgICpyZF9zdW1tYXJpemVkYXR0 cjsJLyogY29scyBpbmRleGVkIGJ5IHN1bW1hcml6aW5nIGluZGV4ZXMgKi8KCglQdWJsaWNh dGlvbkRlc2MgKnJkX3B1YmRlc2M7CS8qIHB1YmxpY2F0aW9uIGRlc2NyaXB0b3IsIG9yIE5V TEwgKi8KCgkvKgoJICogcmRfb3B0aW9ucyBpcyBzZXQgd2hlbmV2ZXIgcmRfcmVsIGlzIGxv YWRlZCBpbnRvIHRoZSByZWxjYWNoZSBlbnRyeS4KCSAqIE5vdGUgdGhhdCB5b3UgY2FuIE5P VCBsb29rIGludG8gcmRfcmVsIGZvciB0aGlzIGRhdGEuICBOVUxMIG1lYW5zICJ1c2UKCSAq IGRlZmF1bHRzIi4KCSAqLwoJYnl0ZWEJICAgKnJkX29wdGlvbnM7CQkvKiBwYXJzZWQgcGdf Y2xhc3MucmVsb3B0aW9ucyAqLwoKCS8qCgkgKiBPaWQgb2YgdGhlIGhhbmRsZXIgZm9yIHRo aXMgcmVsYXRpb24uIEZvciBhbiBpbmRleCB0aGlzIGlzIGEgZnVuY3Rpb24KCSAqIHJldHVy bmluZyBJbmRleEFtUm91dGluZSwgZm9yIHRhYmxlIGxpa2UgcmVsYXRpb25zIGEgZnVuY3Rp b24gcmV0dXJuaW5nCgkgKiBUYWJsZUFtUm91dGluZS4gIFRoaXMgaXMgc3RvcmVkIHNlcGFy YXRlbHkgZnJvbSByZF9pbmRhbSwgcmRfdGFibGVhbSBhcwoJICogaXRzIGxvb2t1cCByZXF1 aXJlcyBzeXNjYWNoZSBhY2Nlc3MsIGJ1dCBkdXJpbmcgcmVsY2FjaGUgYm9vdHN0cmFwIHdl CgkgKiBuZWVkIHRvIGJlIGFibGUgdG8gaW5pdGlhbGl6ZSByZF90YWJsZWFtIHdpdGhvdXQg c3lzY2FjaGUgbG9va3Vwcy4KCSAqLwoJT2lkCQkJcmRfYW1oYW5kbGVyOwkvKiBPSUQgb2Yg aW5kZXggQU0ncyBoYW5kbGVyIGZ1bmN0aW9uICovCgoJLyoKCSAqIFRhYmxlIGFjY2VzcyBt ZXRob2QuCgkgKi8KCWNvbnN0IHN0cnVjdCBUYWJsZUFtUm91dGluZSAqcmRfdGFibGVhbTsK CgkvKiBUaGVzZSBhcmUgbm9uLU5VTEwgb25seSBmb3IgYW4gaW5kZXggcmVsYXRpb246ICov CglGb3JtX3BnX2luZGV4IHJkX2luZGV4OwkJLyogcGdfaW5kZXggdHVwbGUgZGVzY3JpYmlu ZyB0aGlzIGluZGV4ICovCgkvKiB1c2UgInN0cnVjdCIgaGVyZSB0byBhdm9pZCBuZWVkaW5n IHRvIGluY2x1ZGUgaHR1cC5oOiAqLwoJc3RydWN0IEhlYXBUdXBsZURhdGEgKnJkX2luZGV4 dHVwbGU7CS8qIGFsbCBvZiBwZ19pbmRleCB0dXBsZSAqLwoKCS8qCgkgKiBpbmRleCBhY2Nl c3Mgc3VwcG9ydCBpbmZvICh1c2VkIG9ubHkgZm9yIGFuIGluZGV4IHJlbGF0aW9uKQoJICoK CSAqIE5vdGU6IG9ubHkgZGVmYXVsdCBzdXBwb3J0IHByb2NzIGZvciBlYWNoIG9wY2xhc3Mg YXJlIGNhY2hlZCwgbmFtZWx5CgkgKiB0aG9zZSB3aXRoIGxlZnR0eXBlIGFuZCByaWdodHR5 cGUgZXF1YWwgdG8gdGhlIG9wY2xhc3MncyBvcGNpbnR5cGUuIFRoZQoJICogYXJyYXlzIGFy ZSBpbmRleGVkIGJ5IHN1cHBvcnQgZnVuY3Rpb24gbnVtYmVyLCB3aGljaCBpcyBhIHN1ZmZp Y2llbnQKCSAqIGlkZW50aWZpZXIgZ2l2ZW4gdGhhdCByZXN0cmljdGlvbi4KCSAqLwoJTWVt b3J5Q29udGV4dCByZF9pbmRleGN4dDsJLyogcHJpdmF0ZSBtZW1vcnkgY3h0IGZvciB0aGlz IHN0dWZmICovCgkvKiB1c2UgInN0cnVjdCIgaGVyZSB0byBhdm9pZCBuZWVkaW5nIHRvIGlu Y2x1ZGUgYW1hcGkuaDogKi8KCWNvbnN0IHN0cnVjdCBJbmRleEFtUm91dGluZSAqcmRfaW5k YW07CS8qIGluZGV4IEFNJ3MgQVBJIHN0cnVjdCAqLwoJT2lkCQkgICAqcmRfb3BmYW1pbHk7 CS8qIE9JRHMgb2Ygb3AgZmFtaWxpZXMgZm9yIGVhY2ggaW5kZXggY29sICovCglPaWQJCSAg ICpyZF9vcGNpbnR5cGU7CS8qIE9JRHMgb2Ygb3BjbGFzcyBkZWNsYXJlZCBpbnB1dCBkYXRh IHR5cGVzICovCglSZWdQcm9jZWR1cmUgKnJkX3N1cHBvcnQ7CS8qIE9JRHMgb2Ygc3VwcG9y dCBwcm9jZWR1cmVzICovCglzdHJ1Y3QgRm1nckluZm8gKnJkX3N1cHBvcnRpbmZvOwkvKiBs b29rdXAgaW5mbyBmb3Igc3VwcG9ydCBwcm9jZWR1cmVzICovCglpbnQxNgkgICAqcmRfaW5k b3B0aW9uOwkvKiBwZXItY29sdW1uIEFNLXNwZWNpZmljIGZsYWdzICovCglMaXN0CSAgICpy ZF9pbmRleHByczsJLyogaW5kZXggZXhwcmVzc2lvbiB0cmVlcywgaWYgYW55ICovCglMaXN0 CSAgICpyZF9pbmRleHByc0V4cGFuZDsJLyogZXhwYW5kZWQgaW5kZXggZXhwcmVzc2lvbiB0 cmVlcywgaWYgYW55ICovCglMaXN0CSAgICpyZF9pbmRwcmVkOwkJLyogaW5kZXggcHJlZGlj YXRlIHRyZWUsIGlmIGFueSAqLwoJTGlzdAkgICAqcmRfaW5kcHJlZEV4cGFuZDsJCS8qIGV4 cGFuZGVkIGluZGV4IHByZWRpY2F0ZSB0cmVlLCBpZiBhbnkgKi8KCU9pZAkJICAgKnJkX2V4 Y2xvcHM7CQkvKiBPSURzIG9mIGV4Y2x1c2lvbiBvcGVyYXRvcnMsIGlmIGFueSAqLwoJT2lk CQkgICAqcmRfZXhjbHByb2NzOwkvKiBPSURzIG9mIGV4Y2x1c2lvbiBvcHMnIHByb2NzLCBp ZiBhbnkgKi8KCXVpbnQxNgkgICAqcmRfZXhjbHN0cmF0czsJLyogZXhjbHVzaW9uIG9wcycg c3RyYXRlZ3kgbnVtYmVycywgaWYgYW55ICovCglPaWQJCSAgICpyZF9pbmRjb2xsYXRpb247 CS8qIE9JRHMgb2YgaW5kZXggY29sbGF0aW9ucyAqLwoJYnl0ZWEJICAqKnJkX29wY29wdGlv bnM7CS8qIHBhcnNlZCBvcGNsYXNzLXNwZWNpZmljIG9wdGlvbnMgKi8KCgkvKgoJICogcmRf YW1jYWNoZSBpcyBhdmFpbGFibGUgZm9yIGluZGV4IGFuZCB0YWJsZSBBTXMgdG8gY2FjaGUg cHJpdmF0ZSBkYXRhCgkgKiBhYm91dCB0aGUgcmVsYXRpb24uICBUaGlzIG11c3QgYmUganVz dCBhIGNhY2hlIHNpbmNlIGl0IG1heSBnZXQgcmVzZXQKCSAqIGF0IGFueSB0aW1lIChpbiBw YXJ0aWN1bGFyLCBpdCB3aWxsIGdldCByZXNldCBieSBhIHJlbGNhY2hlIGludmFsCgkgKiBt ZXNzYWdlIGZvciB0aGUgcmVsYXRpb24pLiAgSWYgdXNlZCwgaXQgbXVzdCBwb2ludCB0byBh IHNpbmdsZSBtZW1vcnkKCSAqIGNodW5rIHBhbGxvYydkIGluIENhY2hlTWVtb3J5Q29udGV4 dCwgb3IgaW4gcmRfaW5kZXhjeHQgZm9yIGFuIGluZGV4CgkgKiByZWxhdGlvbi4gIEEgcmVs Y2FjaGUgcmVzZXQgd2lsbCBpbmNsdWRlIGZyZWVpbmcgdGhhdCBjaHVuayBhbmQgc2V0dGlu ZwoJICogcmRfYW1jYWNoZSA9IE5VTEwuCgkgKi8KCXZvaWQJICAgKnJkX2FtY2FjaGU7CQkv KiBhdmFpbGFibGUgZm9yIHVzZSBieSBpbmRleC90YWJsZSBBTSAqLwoKCS8qCgkgKiBmb3Jl aWduLXRhYmxlIHN1cHBvcnQKCSAqCgkgKiByZF9mZHdyb3V0aW5lIG11c3QgcG9pbnQgdG8g YSBzaW5nbGUgbWVtb3J5IGNodW5rIHBhbGxvYydkIGluCgkgKiBDYWNoZU1lbW9yeUNvbnRl eHQuICBJdCB3aWxsIGJlIGZyZWVkIGFuZCByZXNldCB0byBOVUxMIG9uIGEgcmVsY2FjaGUK CSAqIHJlc2V0LgoJICovCgoJLyogdXNlICJzdHJ1Y3QiIGhlcmUgdG8gYXZvaWQgbmVlZGlu ZyB0byBpbmNsdWRlIGZkd2FwaS5oOiAqLwoJc3RydWN0IEZkd1JvdXRpbmUgKnJkX2Zkd3Jv dXRpbmU7CS8qIGNhY2hlZCBmdW5jdGlvbiBwb2ludGVycywgb3IgTlVMTCAqLwoKCS8qCgkg KiBIYWNrIGZvciBDTFVTVEVSLCByZXdyaXRpbmcgQUxURVIgVEFCTEUsIGV0Yzogd2hlbiB3 cml0aW5nIGEgbmV3CgkgKiB2ZXJzaW9uIG9mIGEgdGFibGUsIHdlIG5lZWQgdG8gbWFrZSBh bnkgdG9hc3QgcG9pbnRlcnMgaW5zZXJ0ZWQgaW50byBpdAoJICogaGF2ZSB0aGUgZXhpc3Rp bmcgdG9hc3QgdGFibGUncyBPSUQsIG5vdCB0aGUgT0lEIG9mIHRoZSB0cmFuc2llbnQgdG9h c3QKCSAqIHRhYmxlLiAgSWYgcmRfdG9hc3RvaWQgaXNuJ3QgSW52YWxpZE9pZCwgaXQgaXMg dGhlIE9JRCB0byBwbGFjZSBpbgoJICogdG9hc3QgcG9pbnRlcnMgaW5zZXJ0ZWQgaW50byB0 aGlzIHJlbC4gIChOb3RlIGl0J3Mgc2V0IG9uIHRoZSBuZXcKCSAqIHZlcnNpb24gb2YgdGhl IG1haW4gaGVhcCwgbm90IHRoZSB0b2FzdCB0YWJsZSBpdHNlbGYuKSAgVGhpcyBhbHNvCgkg KiBjYXVzZXMgdG9hc3Rfc2F2ZV9kYXR1bSgpIHRvIHRyeSB0byBwcmVzZXJ2ZSB0b2FzdCB2 YWx1ZSBPSURzLgoJICovCglPaWQJCQlyZF90b2FzdG9pZDsJLyogUmVhbCBUT0FTVCB0YWJs ZSdzIE9JRCwgb3IgSW52YWxpZE9pZCAqLwoKCWJvb2wJCXBnc3RhdF9lbmFibGVkOyAvKiBz aG91bGQgcmVsYXRpb24gc3RhdHMgYmUgY291bnRlZCAqLwoJLyogdXNlICJzdHJ1Y3QiIGhl cmUgdG8gYXZvaWQgbmVlZGluZyB0byBpbmNsdWRlIHBnc3RhdC5oOiAqLwoJc3RydWN0IFBn U3RhdF9UYWJsZVN0YXR1cyAqcGdzdGF0X2luZm87IC8qIHN0YXRpc3RpY3MgY29sbGVjdGlv biBhcmVhICovCn0gUmVsYXRpb25EYXRhOwoKCi8qCiAqIEZvcmVpZ25LZXlDYWNoZUluZm8K ICoJCUluZm9ybWF0aW9uIHRoZSByZWxjYWNoZSBjYW4gY2FjaGUgYWJvdXQgZm9yZWlnbiBr ZXkgY29uc3RyYWludHMKICoKICogVGhpcyBpcyBiYXNpY2FsbHkganVzdCBhbiBpbWFnZSBv ZiByZWxldmFudCBjb2x1bW5zIGZyb20gcGdfY29uc3RyYWludC4KICogV2UgbWFrZSBpdCBh IHN1YmNsYXNzIG9mIE5vZGUgc28gdGhhdCBjb3B5T2JqZWN0KCkgY2FuIGJlIHVzZWQgb24g YSBsaXN0CiAqIG9mIHRoZXNlLCBidXQgd2UgYWxzbyBlbnN1cmUgaXQgaXMgYSAiZmxhdCIg b2JqZWN0IHdpdGhvdXQgc3Vic3RydWN0dXJlLAogKiBzbyB0aGF0IGxpc3RfZnJlZV9kZWVw KCkgaXMgc3VmZmljaWVudCB0byBmcmVlIHN1Y2ggYSBsaXN0LgogKiBUaGUgcGVyLUZLLWNv bHVtbiBhcnJheXMgY2FuIGJlIGZpeGVkLXNpemUgYmVjYXVzZSB3ZSBhbGxvdyBhdCBtb3N0 CiAqIElOREVYX01BWF9LRVlTIGNvbHVtbnMgaW4gYSBmb3JlaWduIGtleSBjb25zdHJhaW50 LgogKgogKiBDdXJyZW50bHksIHdlIG1vc3RseSBjYWNoZSBmaWVsZHMgb2YgaW50ZXJlc3Qg dG8gdGhlIHBsYW5uZXIsIGJ1dCB0aGUgc2V0CiAqIG9mIGZpZWxkcyBoYXMgYWxyZWFkeSBn cm93biB0aGUgY29uc3RyYWludCBPSUQgZm9yIG90aGVyIHVzZXMuCiAqLwp0eXBlZGVmIHN0 cnVjdCBGb3JlaWduS2V5Q2FjaGVJbmZvCnsKCXBnX25vZGVfYXR0cihub19lcXVhbCwgbm9f cmVhZCwgbm9fcXVlcnlfanVtYmxlKQoKCU5vZGVUYWcJCXR5cGU7CgkvKiBvaWQgb2YgdGhl IGNvbnN0cmFpbnQgaXRzZWxmICovCglPaWQJCQljb25vaWQ7CgkvKiByZWxhdGlvbiBjb25z dHJhaW5lZCBieSB0aGUgZm9yZWlnbiBrZXkgKi8KCU9pZAkJCWNvbnJlbGlkOwoJLyogcmVs YXRpb24gcmVmZXJlbmNlZCBieSB0aGUgZm9yZWlnbiBrZXkgKi8KCU9pZAkJCWNvbmZyZWxp ZDsKCS8qIG51bWJlciBvZiBjb2x1bW5zIGluIHRoZSBmb3JlaWduIGtleSAqLwoJaW50CQkJ bmtleXM7CgoJLyogSXMgZW5mb3JjZWQgPyAqLwoJYm9vbAkJY29uZW5mb3JjZWQ7CgoJLyoK CSAqIHRoZXNlIGFycmF5cyBlYWNoIGhhdmUgbmtleXMgdmFsaWQgZW50cmllczoKCSAqLwoJ LyogY29scyBpbiByZWZlcmVuY2luZyB0YWJsZSAqLwoJQXR0ck51bWJlcgljb25rZXlbSU5E RVhfTUFYX0tFWVNdIHBnX25vZGVfYXR0cihhcnJheV9zaXplKG5rZXlzKSk7CgkvKiBjb2xz IGluIHJlZmVyZW5jZWQgdGFibGUgKi8KCUF0dHJOdW1iZXIJY29uZmtleVtJTkRFWF9NQVhf S0VZU10gcGdfbm9kZV9hdHRyKGFycmF5X3NpemUobmtleXMpKTsKCS8qIFBLID0gRksgb3Bl cmF0b3IgT0lEcyAqLwoJT2lkCQkJY29ucGZlcW9wW0lOREVYX01BWF9LRVlTXSBwZ19ub2Rl X2F0dHIoYXJyYXlfc2l6ZShua2V5cykpOwp9IEZvcmVpZ25LZXlDYWNoZUluZm87CgoKLyoK ICogU3RkUmRPcHRpb25zCiAqCQlTdGFuZGFyZCBjb250ZW50cyBvZiByZF9vcHRpb25zIGZv ciBoZWFwcy4KICoKICogUmVsYXRpb25HZXRGaWxsRmFjdG9yKCkgYW5kIFJlbGF0aW9uR2V0 VGFyZ2V0UGFnZUZyZWVTcGFjZSgpIGNhbiBvbmx5CiAqIGJlIGFwcGxpZWQgdG8gcmVsYXRp b25zIHRoYXQgdXNlIHRoaXMgZm9ybWF0IG9yIGEgc3VwZXJzZXQgZm9yCiAqIHByaXZhdGUg b3B0aW9ucyBkYXRhLgogKi8KIC8qIGF1dG92YWN1dW0tcmVsYXRlZCByZWxvcHRpb25zLiAq Lwp0eXBlZGVmIHN0cnVjdCBBdXRvVmFjT3B0cwp7Cglib29sCQllbmFibGVkOwoKCWludAkJ CWF1dG92YWN1dW1fcGFyYWxsZWxfd29ya2VyczsKCWludAkJCXZhY3V1bV90aHJlc2hvbGQ7 CglpbnQJCQl2YWN1dW1fbWF4X3RocmVzaG9sZDsKCWludAkJCXZhY3V1bV9pbnNfdGhyZXNo b2xkOwoJaW50CQkJYW5hbHl6ZV90aHJlc2hvbGQ7CglpbnQJCQl2YWN1dW1fY29zdF9saW1p dDsKCWludAkJCWZyZWV6ZV9taW5fYWdlOwoJaW50CQkJZnJlZXplX21heF9hZ2U7CglpbnQJ CQlmcmVlemVfdGFibGVfYWdlOwoJaW50CQkJbXVsdGl4YWN0X2ZyZWV6ZV9taW5fYWdlOwoJ aW50CQkJbXVsdGl4YWN0X2ZyZWV6ZV9tYXhfYWdlOwoJaW50CQkJbXVsdGl4YWN0X2ZyZWV6 ZV90YWJsZV9hZ2U7CglpbnQJCQlsb2dfdmFjdXVtX21pbl9kdXJhdGlvbjsKCWludAkJCWxv Z19hbmFseXplX21pbl9kdXJhdGlvbjsKCWZsb2F0OAkJdmFjdXVtX2Nvc3RfZGVsYXk7Cglm bG9hdDgJCXZhY3V1bV9zY2FsZV9mYWN0b3I7CglmbG9hdDgJCXZhY3V1bV9pbnNfc2NhbGVf ZmFjdG9yOwoJZmxvYXQ4CQlhbmFseXplX3NjYWxlX2ZhY3RvcjsKfSBBdXRvVmFjT3B0czsK Ci8qIFN0ZFJkT3B0aW9ucy0+dmFjdXVtX2luZGV4X2NsZWFudXAgdmFsdWVzICovCnR5cGVk ZWYgZW51bSBTdGRSZE9wdEluZGV4Q2xlYW51cAp7CglTVERSRF9PUFRJT05fVkFDVVVNX0lO REVYX0NMRUFOVVBfQVVUTyA9IDAsCglTVERSRF9PUFRJT05fVkFDVVVNX0lOREVYX0NMRUFO VVBfT0ZGLAoJU1REUkRfT1BUSU9OX1ZBQ1VVTV9JTkRFWF9DTEVBTlVQX09OLAp9IFN0ZFJk T3B0SW5kZXhDbGVhbnVwOwoKdHlwZWRlZiBzdHJ1Y3QgU3RkUmRPcHRpb25zCnsKCWludDMy CQl2bF9sZW5fOwkJLyogdmFybGVuYSBoZWFkZXIgKGRvIG5vdCB0b3VjaCBkaXJlY3RseSEp ICovCglpbnQJCQlmaWxsZmFjdG9yOwkJLyogcGFnZSBmaWxsIGZhY3RvciBpbiBwZXJjZW50 ICgwLi4xMDApICovCglpbnQJCQl0b2FzdF90dXBsZV90YXJnZXQ7IC8qIHRhcmdldCBmb3Ig dHVwbGUgdG9hc3RpbmcgKi8KCUF1dG9WYWNPcHRzIGF1dG92YWN1dW07CQkvKiBhdXRvdmFj dXVtLXJlbGF0ZWQgb3B0aW9ucyAqLwoJYm9vbAkJdXNlcl9jYXRhbG9nX3RhYmxlOyAvKiB1 c2UgYXMgYW4gYWRkaXRpb25hbCBjYXRhbG9nIHJlbGF0aW9uICovCglpbnQJCQlwYXJhbGxl bF93b3JrZXJzOwkvKiBtYXggbnVtYmVyIG9mIHBhcmFsbGVsIHdvcmtlcnMgKi8KCVN0ZFJk T3B0SW5kZXhDbGVhbnVwIHZhY3V1bV9pbmRleF9jbGVhbnVwOwkvKiBjb250cm9scyBpbmRl eCB2YWN1dW1pbmcgKi8KCXBnX3Rlcm5hcnkJdmFjdXVtX3RydW5jYXRlOwkvKiBlbmFibGVz IHZhY3V1bSB0byB0cnVuY2F0ZSBhIHJlbGF0aW9uICovCgoJLyoKCSAqIEZyYWN0aW9uIG9m IHBhZ2VzIGluIGEgcmVsYXRpb24gdGhhdCB2YWN1dW0gY2FuIGVhZ2VybHkgc2NhbiBhbmQg ZmFpbAoJICogdG8gZnJlZXplLiAwIGlmIGRpc2FibGVkLCAtMSBpZiB1bnNwZWNpZmllZC4K CSAqLwoJZG91YmxlCQl2YWN1dW1fbWF4X2VhZ2VyX2ZyZWV6ZV9mYWlsdXJlX3JhdGU7Cn0g U3RkUmRPcHRpb25zOwoKI2RlZmluZSBIRUFQX01JTl9GSUxMRkFDVE9SCQkJMTAKI2RlZmlu ZSBIRUFQX0RFRkFVTFRfRklMTEZBQ1RPUgkJMTAwCgovKgogKiBSZWxhdGlvbkdldFRvYXN0 VHVwbGVUYXJnZXQKICoJCVJldHVybnMgdGhlIHJlbGF0aW9uJ3MgdG9hc3RfdHVwbGVfdGFy Z2V0LiAgTm90ZSBtdWx0aXBsZSBldmFsIG9mIGFyZ3VtZW50IQogKi8KI2RlZmluZSBSZWxh dGlvbkdldFRvYXN0VHVwbGVUYXJnZXQocmVsYXRpb24sIGRlZmF1bHR0YXJnKSBcCgkoKHJl bGF0aW9uKS0+cmRfb3B0aW9ucyA/IFwKCSAoKFN0ZFJkT3B0aW9ucyAqKSAocmVsYXRpb24p LT5yZF9vcHRpb25zKS0+dG9hc3RfdHVwbGVfdGFyZ2V0IDogKGRlZmF1bHR0YXJnKSkKCi8q CiAqIFJlbGF0aW9uR2V0RmlsbEZhY3RvcgogKgkJUmV0dXJucyB0aGUgcmVsYXRpb24ncyBm aWxsZmFjdG9yLiAgTm90ZSBtdWx0aXBsZSBldmFsIG9mIGFyZ3VtZW50IQogKi8KI2RlZmlu ZSBSZWxhdGlvbkdldEZpbGxGYWN0b3IocmVsYXRpb24sIGRlZmF1bHRmZikgXAoJKChyZWxh dGlvbiktPnJkX29wdGlvbnMgPyBcCgkgKChTdGRSZE9wdGlvbnMgKikgKHJlbGF0aW9uKS0+ cmRfb3B0aW9ucyktPmZpbGxmYWN0b3IgOiAoZGVmYXVsdGZmKSkKCi8qCiAqIFJlbGF0aW9u R2V0VGFyZ2V0UGFnZVVzYWdlCiAqCQlSZXR1cm5zIHRoZSByZWxhdGlvbidzIGRlc2lyZWQg c3BhY2UgdXNhZ2UgcGVyIHBhZ2UgaW4gYnl0ZXMuCiAqLwojZGVmaW5lIFJlbGF0aW9uR2V0 VGFyZ2V0UGFnZVVzYWdlKHJlbGF0aW9uLCBkZWZhdWx0ZmYpIFwKCShCTENLU1ogKiBSZWxh dGlvbkdldEZpbGxGYWN0b3IocmVsYXRpb24sIGRlZmF1bHRmZikgLyAxMDApCgovKgogKiBS ZWxhdGlvbkdldFRhcmdldFBhZ2VGcmVlU3BhY2UKICoJCVJldHVybnMgdGhlIHJlbGF0aW9u J3MgZGVzaXJlZCBmcmVlc3BhY2UgcGVyIHBhZ2UgaW4gYnl0ZXMuCiAqLwojZGVmaW5lIFJl bGF0aW9uR2V0VGFyZ2V0UGFnZUZyZWVTcGFjZShyZWxhdGlvbiwgZGVmYXVsdGZmKSBcCgko QkxDS1NaICogKDEwMCAtIFJlbGF0aW9uR2V0RmlsbEZhY3RvcihyZWxhdGlvbiwgZGVmYXVs dGZmKSkgLyAxMDApCgovKgogKiBSZWxhdGlvbklzVXNlZEFzQ2F0YWxvZ1RhYmxlCiAqCQlS ZXR1cm5zIHdoZXRoZXIgdGhlIHJlbGF0aW9uIHNob3VsZCBiZSB0cmVhdGVkIGFzIGEgY2F0 YWxvZyB0YWJsZQogKgkJZnJvbSB0aGUgcG92IG9mIGxvZ2ljYWwgZGVjb2RpbmcuICBOb3Rl IG11bHRpcGxlIGV2YWwgb2YgYXJndW1lbnQhCiAqLwojZGVmaW5lIFJlbGF0aW9uSXNVc2Vk QXNDYXRhbG9nVGFibGUocmVsYXRpb24pCVwKCSgocmVsYXRpb24pLT5yZF9vcHRpb25zICYm IFwKCSAoKHJlbGF0aW9uKS0+cmRfcmVsLT5yZWxraW5kID09IFJFTEtJTkRfUkVMQVRJT04g fHwgXAoJICAocmVsYXRpb24pLT5yZF9yZWwtPnJlbGtpbmQgPT0gUkVMS0lORF9NQVRWSUVX KSA/IFwKCSAoKFN0ZFJkT3B0aW9ucyAqKSAocmVsYXRpb24pLT5yZF9vcHRpb25zKS0+dXNl cl9jYXRhbG9nX3RhYmxlIDogZmFsc2UpCgovKgogKiBSZWxhdGlvbkdldFBhcmFsbGVsV29y a2VycwogKgkJUmV0dXJucyB0aGUgcmVsYXRpb24ncyBwYXJhbGxlbF93b3JrZXJzIHJlbG9w dGlvbiBzZXR0aW5nLgogKgkJTm90ZSBtdWx0aXBsZSBldmFsIG9mIGFyZ3VtZW50IQogKi8K I2RlZmluZSBSZWxhdGlvbkdldFBhcmFsbGVsV29ya2VycyhyZWxhdGlvbiwgZGVmYXVsdHB3 KSBcCgkoKHJlbGF0aW9uKS0+cmRfb3B0aW9ucyA/IFwKCSAoKFN0ZFJkT3B0aW9ucyAqKSAo cmVsYXRpb24pLT5yZF9vcHRpb25zKS0+cGFyYWxsZWxfd29ya2VycyA6IChkZWZhdWx0cHcp KQoKLyogVmlld09wdGlvbnMtPmNoZWNrX29wdGlvbiB2YWx1ZXMgKi8KdHlwZWRlZiBlbnVt IFZpZXdPcHRDaGVja09wdGlvbgp7CglWSUVXX09QVElPTl9DSEVDS19PUFRJT05fTk9UX1NF VCwKCVZJRVdfT1BUSU9OX0NIRUNLX09QVElPTl9MT0NBTCwKCVZJRVdfT1BUSU9OX0NIRUNL X09QVElPTl9DQVNDQURFRCwKfSBWaWV3T3B0Q2hlY2tPcHRpb247CgovKgogKiBWaWV3T3B0 aW9ucwogKgkJQ29udGVudHMgb2YgcmRfb3B0aW9ucyBmb3Igdmlld3MKICovCnR5cGVkZWYg c3RydWN0IFZpZXdPcHRpb25zCnsKCWludDMyCQl2bF9sZW5fOwkJLyogdmFybGVuYSBoZWFk ZXIgKGRvIG5vdCB0b3VjaCBkaXJlY3RseSEpICovCglib29sCQlzZWN1cml0eV9iYXJyaWVy OwoJYm9vbAkJc2VjdXJpdHlfaW52b2tlcjsKCVZpZXdPcHRDaGVja09wdGlvbiBjaGVja19v cHRpb247Cn0gVmlld09wdGlvbnM7CgovKgogKiBSZWxhdGlvbklzU2VjdXJpdHlWaWV3CiAq CQlSZXR1cm5zIHdoZXRoZXIgdGhlIHJlbGF0aW9uIGlzIHNlY3VyaXR5IHZpZXcsIG9yIG5v dC4gIE5vdGUgbXVsdGlwbGUKICoJCWV2YWwgb2YgYXJndW1lbnQhCiAqLwojZGVmaW5lIFJl bGF0aW9uSXNTZWN1cml0eVZpZXcocmVsYXRpb24pCQkJCQkJCQkJXAoJKEFzc2VydE1hY3Jv KHJlbGF0aW9uLT5yZF9yZWwtPnJlbGtpbmQgPT0gUkVMS0lORF9WSUVXKSwJCQkJXAoJIChy ZWxhdGlvbiktPnJkX29wdGlvbnMgPwkJCQkJCQkJCQkJCVwKCSAgKChWaWV3T3B0aW9ucyAq KSAocmVsYXRpb24pLT5yZF9vcHRpb25zKS0+c2VjdXJpdHlfYmFycmllciA6IGZhbHNlKQoK LyoKICogUmVsYXRpb25IYXNTZWN1cml0eUludm9rZXIKICoJCVJldHVybnMgdHJ1ZSBpZiB0 aGUgcmVsYXRpb24gaGFzIHRoZSBzZWN1cml0eV9pbnZva2VyIHByb3BlcnR5IHNldC4KICoJ CU5vdGUgbXVsdGlwbGUgZXZhbCBvZiBhcmd1bWVudCEKICovCiNkZWZpbmUgUmVsYXRpb25I YXNTZWN1cml0eUludm9rZXIocmVsYXRpb24pCQkJCQkJCQlcCgkoQXNzZXJ0TWFjcm8ocmVs YXRpb24tPnJkX3JlbC0+cmVsa2luZCA9PSBSRUxLSU5EX1ZJRVcpLAkJCQlcCgkgKHJlbGF0 aW9uKS0+cmRfb3B0aW9ucyA/CQkJCQkJCQkJCQkJXAoJICAoKFZpZXdPcHRpb25zICopIChy ZWxhdGlvbiktPnJkX29wdGlvbnMpLT5zZWN1cml0eV9pbnZva2VyIDogZmFsc2UpCgovKgog KiBSZWxhdGlvbkhhc0NoZWNrT3B0aW9uCiAqCQlSZXR1cm5zIHRydWUgaWYgdGhlIHJlbGF0 aW9uIGlzIGEgdmlldyBkZWZpbmVkIHdpdGggZWl0aGVyIHRoZSBsb2NhbAogKgkJb3IgdGhl IGNhc2NhZGVkIGNoZWNrIG9wdGlvbi4gIE5vdGUgbXVsdGlwbGUgZXZhbCBvZiBhcmd1bWVu dCEKICovCiNkZWZpbmUgUmVsYXRpb25IYXNDaGVja09wdGlvbihyZWxhdGlvbikJCQkJCQkJ CQlcCgkoQXNzZXJ0TWFjcm8ocmVsYXRpb24tPnJkX3JlbC0+cmVsa2luZCA9PSBSRUxLSU5E X1ZJRVcpLAkJCQlcCgkgKHJlbGF0aW9uKS0+cmRfb3B0aW9ucyAmJgkJCQkJCQkJCQkJCVwK CSAoKFZpZXdPcHRpb25zICopIChyZWxhdGlvbiktPnJkX29wdGlvbnMpLT5jaGVja19vcHRp b24gIT0JCQkJXAoJIFZJRVdfT1BUSU9OX0NIRUNLX09QVElPTl9OT1RfU0VUKQoKLyoKICog UmVsYXRpb25IYXNMb2NhbENoZWNrT3B0aW9uCiAqCQlSZXR1cm5zIHRydWUgaWYgdGhlIHJl bGF0aW9uIGlzIGEgdmlldyBkZWZpbmVkIHdpdGggdGhlIGxvY2FsIGNoZWNrCiAqCQlvcHRp b24uICBOb3RlIG11bHRpcGxlIGV2YWwgb2YgYXJndW1lbnQhCiAqLwojZGVmaW5lIFJlbGF0 aW9uSGFzTG9jYWxDaGVja09wdGlvbihyZWxhdGlvbikJCQkJCQkJCVwKCShBc3NlcnRNYWNy byhyZWxhdGlvbi0+cmRfcmVsLT5yZWxraW5kID09IFJFTEtJTkRfVklFVyksCQkJCVwKCSAo cmVsYXRpb24pLT5yZF9vcHRpb25zICYmCQkJCQkJCQkJCQkJXAoJICgoVmlld09wdGlvbnMg KikgKHJlbGF0aW9uKS0+cmRfb3B0aW9ucyktPmNoZWNrX29wdGlvbiA9PQkJCQlcCgkgVklF V19PUFRJT05fQ0hFQ0tfT1BUSU9OX0xPQ0FMKQoKLyoKICogUmVsYXRpb25IYXNDYXNjYWRl ZENoZWNrT3B0aW9uCiAqCQlSZXR1cm5zIHRydWUgaWYgdGhlIHJlbGF0aW9uIGlzIGEgdmll dyBkZWZpbmVkIHdpdGggdGhlIGNhc2NhZGVkIGNoZWNrCiAqCQlvcHRpb24uICBOb3RlIG11 bHRpcGxlIGV2YWwgb2YgYXJndW1lbnQhCiAqLwojZGVmaW5lIFJlbGF0aW9uSGFzQ2FzY2Fk ZWRDaGVja09wdGlvbihyZWxhdGlvbikJCQkJCQkJXAoJKEFzc2VydE1hY3JvKHJlbGF0aW9u LT5yZF9yZWwtPnJlbGtpbmQgPT0gUkVMS0lORF9WSUVXKSwJCQkJXAoJIChyZWxhdGlvbikt PnJkX29wdGlvbnMgJiYJCQkJCQkJCQkJCQlcCgkgKChWaWV3T3B0aW9ucyAqKSAocmVsYXRp b24pLT5yZF9vcHRpb25zKS0+Y2hlY2tfb3B0aW9uID09CQkJCVwKCSAgVklFV19PUFRJT05f Q0hFQ0tfT1BUSU9OX0NBU0NBREVEKQoKLyoKICogUmVsYXRpb25Jc1ZhbGlkCiAqCQlUcnVl IGlmZiByZWxhdGlvbiBkZXNjcmlwdG9yIGlzIHZhbGlkLgogKi8KI2RlZmluZSBSZWxhdGlv bklzVmFsaWQocmVsYXRpb24pICgocmVsYXRpb24pICE9IE5VTEwpCgovKgogKiBSZWxhdGlv bkhhc1JlZmVyZW5jZUNvdW50WmVybwogKgkJVHJ1ZSBpZmYgcmVsYXRpb24gcmVmZXJlbmNl IGNvdW50IGlzIHplcm8uCiAqCiAqIE5vdGU6CiAqCQlBc3N1bWVzIHJlbGF0aW9uIGRlc2Ny aXB0b3IgaXMgdmFsaWQuCiAqLwojZGVmaW5lIFJlbGF0aW9uSGFzUmVmZXJlbmNlQ291bnRa ZXJvKHJlbGF0aW9uKSBcCgkJKChib29sKSgocmVsYXRpb24pLT5yZF9yZWZjbnQgPT0gMCkp CgovKgogKiBSZWxhdGlvbkdldEZvcm0KICoJCVJldHVybnMgcGdfY2xhc3MgdHVwbGUgZm9y IGEgcmVsYXRpb24uCiAqCiAqIE5vdGU6CiAqCQlBc3N1bWVzIHJlbGF0aW9uIGRlc2NyaXB0 b3IgaXMgdmFsaWQuCiAqLwojZGVmaW5lIFJlbGF0aW9uR2V0Rm9ybShyZWxhdGlvbikgKChy ZWxhdGlvbiktPnJkX3JlbCkKCi8qCiAqIFJlbGF0aW9uR2V0UmVsaWQKICoJCVJldHVybnMg dGhlIE9JRCBvZiB0aGUgcmVsYXRpb24KICovCiNkZWZpbmUgUmVsYXRpb25HZXRSZWxpZChy ZWxhdGlvbikgKChyZWxhdGlvbiktPnJkX2lkKQoKLyoKICogUmVsYXRpb25HZXROdW1iZXJP ZkF0dHJpYnV0ZXMKICoJCVJldHVybnMgdGhlIHRvdGFsIG51bWJlciBvZiBhdHRyaWJ1dGVz IGluIGEgcmVsYXRpb24uCiAqLwojZGVmaW5lIFJlbGF0aW9uR2V0TnVtYmVyT2ZBdHRyaWJ1 dGVzKHJlbGF0aW9uKSAoKHJlbGF0aW9uKS0+cmRfcmVsLT5yZWxuYXR0cykKCi8qCiAqIElu ZGV4UmVsYXRpb25HZXROdW1iZXJPZkF0dHJpYnV0ZXMKICoJCVJldHVybnMgdGhlIG51bWJl ciBvZiBhdHRyaWJ1dGVzIGluIGFuIGluZGV4LgogKi8KI2RlZmluZSBJbmRleFJlbGF0aW9u R2V0TnVtYmVyT2ZBdHRyaWJ1dGVzKHJlbGF0aW9uKSBcCgkJKChyZWxhdGlvbiktPnJkX2lu ZGV4LT5pbmRuYXR0cykKCi8qCiAqIEluZGV4UmVsYXRpb25HZXROdW1iZXJPZktleUF0dHJp YnV0ZXMKICoJCVJldHVybnMgdGhlIG51bWJlciBvZiBrZXkgYXR0cmlidXRlcyBpbiBhbiBp bmRleC4KICovCiNkZWZpbmUgSW5kZXhSZWxhdGlvbkdldE51bWJlck9mS2V5QXR0cmlidXRl cyhyZWxhdGlvbikgXAoJCSgocmVsYXRpb24pLT5yZF9pbmRleC0+aW5kbmtleWF0dHMpCgov KgogKiBSZWxhdGlvbkdldERlc2NyCiAqCQlSZXR1cm5zIHR1cGxlIGRlc2NyaXB0b3IgZm9y IGEgcmVsYXRpb24uCiAqLwojZGVmaW5lIFJlbGF0aW9uR2V0RGVzY3IocmVsYXRpb24pICgo cmVsYXRpb24pLT5yZF9hdHQpCgovKgogKiBSZWxhdGlvbkdldFJlbGF0aW9uTmFtZQogKgkJ UmV0dXJucyB0aGUgcmVsJ3MgbmFtZS4KICoKICogTm90ZSB0aGF0IHRoZSBuYW1lIGlzIG9u bHkgdW5pcXVlIHdpdGhpbiB0aGUgY29udGFpbmluZyBuYW1lc3BhY2UuCiAqLwojZGVmaW5l IFJlbGF0aW9uR2V0UmVsYXRpb25OYW1lKHJlbGF0aW9uKSBcCgkoTmFtZVN0cigocmVsYXRp b24pLT5yZF9yZWwtPnJlbG5hbWUpKQoKLyoKICogUmVsYXRpb25HZXROYW1lc3BhY2UKICoJ CVJldHVybnMgdGhlIHJlbCdzIG5hbWVzcGFjZSBPSUQuCiAqLwojZGVmaW5lIFJlbGF0aW9u R2V0TmFtZXNwYWNlKHJlbGF0aW9uKSBcCgkoKHJlbGF0aW9uKS0+cmRfcmVsLT5yZWxuYW1l c3BhY2UpCgovKgogKiBSZWxhdGlvbklzTWFwcGVkCiAqCQlUcnVlIGlmIHRoZSByZWxhdGlv biB1c2VzIHRoZSByZWxmaWxlbnVtYmVyIG1hcC4gIE5vdGUgbXVsdGlwbGUgZXZhbAogKgkJ b2YgYXJndW1lbnQhCiAqLwojZGVmaW5lIFJlbGF0aW9uSXNNYXBwZWQocmVsYXRpb24pIFwK CShSRUxLSU5EX0hBU19TVE9SQUdFKChyZWxhdGlvbiktPnJkX3JlbC0+cmVsa2luZCkgJiYg XAoJICgocmVsYXRpb24pLT5yZF9yZWwtPnJlbGZpbGVub2RlID09IEludmFsaWRSZWxGaWxl TnVtYmVyKSkKCiNpZm5kZWYgRlJPTlRFTkQKLyoKICogUmVsYXRpb25HZXRTbWdyCiAqCQlS ZXR1cm5zIHNtZ3IgZmlsZSBoYW5kbGUgZm9yIGEgcmVsYXRpb24sIG9wZW5pbmcgaXQgaWYg bmVlZGVkLgogKgogKiBWZXJ5IGxpdHRsZSBjb2RlIGlzIGF1dGhvcml6ZWQgdG8gdG91Y2gg cmVsLT5yZF9zbWdyIGRpcmVjdGx5LiAgSW5zdGVhZAogKiB1c2UgdGhpcyBmdW5jdGlvbiB0 byBmZXRjaCBpdHMgdmFsdWUuCiAqLwpzdGF0aWMgaW5saW5lIFNNZ3JSZWxhdGlvbgpSZWxh dGlvbkdldFNtZ3IoUmVsYXRpb24gcmVsKQp7CglpZiAodW5saWtlbHkocmVsLT5yZF9zbWdy ID09IE5VTEwpKQoJewoJCXJlbC0+cmRfc21nciA9IHNtZ3JvcGVuKHJlbC0+cmRfbG9jYXRv ciwgcmVsLT5yZF9iYWNrZW5kKTsKCQlzbWdycGluKHJlbC0+cmRfc21ncik7Cgl9CglyZXR1 cm4gcmVsLT5yZF9zbWdyOwp9CgovKgogKiBSZWxhdGlvbkNsb3NlU21ncgogKgkJQ2xvc2Ug dGhlIHJlbGF0aW9uIGF0IHRoZSBzbWdyIGxldmVsLCBpZiBub3QgYWxyZWFkeSBkb25lLgog Ki8Kc3RhdGljIGlubGluZSB2b2lkClJlbGF0aW9uQ2xvc2VTbWdyKFJlbGF0aW9uIHJlbGF0 aW9uKQp7CglpZiAocmVsYXRpb24tPnJkX3NtZ3IgIT0gTlVMTCkKCXsKCQlzbWdydW5waW4o cmVsYXRpb24tPnJkX3NtZ3IpOwoJCXNtZ3JjbG9zZShyZWxhdGlvbi0+cmRfc21ncik7CgkJ cmVsYXRpb24tPnJkX3NtZ3IgPSBOVUxMOwoJfQp9CiNlbmRpZgkJCQkJCQkvKiAhRlJPTlRF TkQgKi8KCi8qCiAqIFJlbGF0aW9uR2V0VGFyZ2V0QmxvY2sKICoJCUZldGNoIHJlbGF0aW9u J3MgY3VycmVudCBpbnNlcnRpb24gdGFyZ2V0IGJsb2NrLgogKgogKiBSZXR1cm5zIEludmFs aWRCbG9ja051bWJlciBpZiB0aGVyZSBpcyBubyBjdXJyZW50IHRhcmdldCBibG9jay4gIE5v dGUKICogdGhhdCB0aGUgdGFyZ2V0IGJsb2NrIHN0YXR1cyBpcyBkaXNjYXJkZWQgb24gYW55 IHNtZ3ItbGV2ZWwgaW52YWxpZGF0aW9uLAogKiBzbyB0aGVyZSdzIG5vIG5lZWQgdG8gcmUt b3BlbiB0aGUgc21nciBoYW5kbGUgaWYgaXQncyBub3QgY3VycmVudGx5IG9wZW4uCiAqLwoj ZGVmaW5lIFJlbGF0aW9uR2V0VGFyZ2V0QmxvY2socmVsYXRpb24pIFwKCSggKHJlbGF0aW9u KS0+cmRfc21nciAhPSBOVUxMID8gKHJlbGF0aW9uKS0+cmRfc21nci0+c21ncl90YXJnYmxv Y2sgOiBJbnZhbGlkQmxvY2tOdW1iZXIgKQoKLyoKICogUmVsYXRpb25TZXRUYXJnZXRCbG9j awogKgkJU2V0IHJlbGF0aW9uJ3MgY3VycmVudCBpbnNlcnRpb24gdGFyZ2V0IGJsb2NrLgog Ki8KI2RlZmluZSBSZWxhdGlvblNldFRhcmdldEJsb2NrKHJlbGF0aW9uLCB0YXJnYmxvY2sp IFwKCWRvIHsgXAoJCVJlbGF0aW9uR2V0U21ncihyZWxhdGlvbiktPnNtZ3JfdGFyZ2Jsb2Nr ID0gKHRhcmdibG9jayk7IFwKCX0gd2hpbGUgKDApCgovKgogKiBSZWxhdGlvbklzUGVybWFu ZW50CiAqCQlUcnVlIGlmIHJlbGF0aW9uIGlzIHBlcm1hbmVudC4KICovCiNkZWZpbmUgUmVs YXRpb25Jc1Blcm1hbmVudChyZWxhdGlvbikgXAoJKChyZWxhdGlvbiktPnJkX3JlbC0+cmVs cGVyc2lzdGVuY2UgPT0gUkVMUEVSU0lTVEVOQ0VfUEVSTUFORU5UKQoKLyoKICogUmVsYXRp b25OZWVkc1dBTAogKgkJVHJ1ZSBpZiByZWxhdGlvbiBuZWVkcyBXQUwuCiAqCiAqIFJldHVy bnMgZmFsc2UgaWYgd2FsX2xldmVsID0gbWluaW1hbCBhbmQgdGhpcyByZWxhdGlvbiBpcyBj cmVhdGVkIG9yCiAqIHRydW5jYXRlZCBpbiB0aGUgY3VycmVudCB0cmFuc2FjdGlvbi4gIFNl ZSAiU2tpcHBpbmcgV0FMIGZvciBOZXcKICogUmVsRmlsZUxvY2F0b3IiIGluIHNyYy9iYWNr ZW5kL2FjY2Vzcy90cmFuc2FtL1JFQURNRS4KICovCiNkZWZpbmUgUmVsYXRpb25OZWVkc1dB TChyZWxhdGlvbikJCQkJCQkJCQkJXAoJKFJlbGF0aW9uSXNQZXJtYW5lbnQocmVsYXRpb24p ICYmIChYTG9nSXNOZWVkZWQoKSB8fAkJCQlcCgkgIChyZWxhdGlvbi0+cmRfY3JlYXRlU3Vi aWQgPT0gSW52YWxpZFN1YlRyYW5zYWN0aW9uSWQgJiYJCQlcCgkgICByZWxhdGlvbi0+cmRf Zmlyc3RSZWxmaWxlbG9jYXRvclN1YmlkID09IEludmFsaWRTdWJUcmFuc2FjdGlvbklkKSkp CgovKgogKiBSZWxhdGlvblVzZXNMb2NhbEJ1ZmZlcnMKICoJCVRydWUgaWYgcmVsYXRpb24n cyBwYWdlcyBhcmUgc3RvcmVkIGluIGxvY2FsIGJ1ZmZlcnMuCiAqLwojZGVmaW5lIFJlbGF0 aW9uVXNlc0xvY2FsQnVmZmVycyhyZWxhdGlvbikgXAoJKChyZWxhdGlvbiktPnJkX3JlbC0+ cmVscGVyc2lzdGVuY2UgPT0gUkVMUEVSU0lTVEVOQ0VfVEVNUCkKCi8qCiAqIFJFTEFUSU9O X0lTX0xPQ0FMCiAqCQlJZiBhIHJlbCBpcyBlaXRoZXIgdGVtcCBvciBuZXdseSBjcmVhdGVk IGluIHRoZSBjdXJyZW50IHRyYW5zYWN0aW9uLAogKgkJaXQgY2FuIGJlIGFzc3VtZWQgdG8g YmUgYWNjZXNzaWJsZSBvbmx5IHRvIHRoZSBjdXJyZW50IGJhY2tlbmQuCiAqCQlUaGlzIGlz IHR5cGljYWxseSB1c2VkIHRvIGRlY2lkZSB0aGF0IHdlIGNhbiBza2lwIGFjcXVpcmluZyBs b2Nrcy4KICoKICogQmV3YXJlIG9mIG11bHRpcGxlIGV2YWwgb2YgYXJndW1lbnQKICovCiNk ZWZpbmUgUkVMQVRJT05fSVNfTE9DQUwocmVsYXRpb24pIFwKCSgocmVsYXRpb24pLT5yZF9p c2xvY2FsdGVtcCB8fCBcCgkgKHJlbGF0aW9uKS0+cmRfY3JlYXRlU3ViaWQgIT0gSW52YWxp ZFN1YlRyYW5zYWN0aW9uSWQpCgovKgogKiBSRUxBVElPTl9JU19PVEhFUl9URU1QCiAqCQlU ZXN0IGZvciBhIHRlbXBvcmFyeSByZWxhdGlvbiB0aGF0IGJlbG9uZ3MgdG8gc29tZSBvdGhl ciBzZXNzaW9uLgogKgogKiBSZWFkaW5nIGFub3RoZXIgc2Vzc2lvbidzIHRlbXAtdGFibGUg ZGF0YSB0aHJvdWdoIG5ldmVyIHdvcmtzIHJpZ2h0OgogKiB0aGUgb3duaW5nIHNlc3Npb24g a2VlcHMgdGhlIGRhdGEgaW4gaXRzIHByaXZhdGUgbG9jYWwgYnVmZmVyIHBvb2wsCiAqIHdo aWNoIHdlIGNhbm5vdCBhY2Nlc3MuICBFeGlzdGluZyBidWZmZXItbWFuYWdlciBlbnRyeSBw b2ludHMKICogKFJlYWRCdWZmZXJfY29tbW9uKCksIFN0YXJ0UmVhZEJ1ZmZlcnNJbXBsKCks IHJlYWRfc3RyZWFtX2JlZ2luX2ltcGwoKSwKICogYW5kIFByZWZldGNoQnVmZmVyKCkpIGFs cmVhZHkgZW5mb3JjZSB0aGlzOyBhbnkgbmV3IGJ1ZmZlci1hY2Nlc3MgZW50cnkKICogcG9p bnRzIG11c3QgZG8gdGhlIHNhbWUuICBDb21tYW5kLWxldmVsIGNvZGUgKFRSVU5DQVRFLCBB TFRFUiBUQUJMRSwKICogVkFDVVVNLCBDTFVTVEVSLCBSRUlOREVYLCAuLi4pIGFkZGl0aW9u YWxseSB1c2VzIHRoaXMgbWFjcm8gZm9yCiAqIGNvbW1hbmQtc3BlY2lmaWMgZXJyb3IgbWVz c2FnZXMuCiAqCiAqIEJld2FyZSBvZiBtdWx0aXBsZSBldmFsIG9mIGFyZ3VtZW50CiAqLwoj ZGVmaW5lIFJFTEFUSU9OX0lTX09USEVSX1RFTVAocmVsYXRpb24pIFwKCSgocmVsYXRpb24p LT5yZF9yZWwtPnJlbHBlcnNpc3RlbmNlID09IFJFTFBFUlNJU1RFTkNFX1RFTVAgJiYgXAoJ ICEocmVsYXRpb24pLT5yZF9pc2xvY2FsdGVtcCkKCgovKgogKiBSZWxhdGlvbklzU2Nhbm5h YmxlCiAqCQlDdXJyZW50bHkgY2FuIG9ubHkgYmUgZmFsc2UgZm9yIGEgbWF0ZXJpYWxpemVk IHZpZXcgd2hpY2ggaGFzIG5vdCBiZWVuCiAqCQlwb3B1bGF0ZWQgYnkgaXRzIHF1ZXJ5LiAg VGhpcyBpcyBsaWtlbHkgdG8gZ2V0IG1vcmUgY29tcGxpY2F0ZWQgbGF0ZXIsCiAqCQlzbyB1 c2UgYSBtYWNybyB3aGljaCBsb29rcyBsaWtlIGEgZnVuY3Rpb24uCiAqLwojZGVmaW5lIFJl bGF0aW9uSXNTY2FubmFibGUocmVsYXRpb24pICgocmVsYXRpb24pLT5yZF9yZWwtPnJlbGlz cG9wdWxhdGVkKQoKLyoKICogUmVsYXRpb25Jc1BvcHVsYXRlZAogKgkJQ3VycmVudGx5LCB3 ZSBkb24ndCBwaHlzaWNhbGx5IGRpc3Rpbmd1aXNoIHRoZSAicG9wdWxhdGVkIiBhbmQKICoJ CSJzY2FubmFibGUiIHByb3BlcnRpZXMgb2YgbWF0dmlld3MsIGJ1dCB0aGF0IG1heSBjaGFu Z2UgbGF0ZXIuCiAqCQlIZW5jZSwgdXNlIHRoZSBhcHByb3ByaWF0ZSBvbmUgb2YgdGhlc2Ug bWFjcm9zIGluIGNvZGUgdGVzdHMuCiAqLwojZGVmaW5lIFJlbGF0aW9uSXNQb3B1bGF0ZWQo cmVsYXRpb24pICgocmVsYXRpb24pLT5yZF9yZWwtPnJlbGlzcG9wdWxhdGVkKQoKLyoKICog UmVsYXRpb25Jc0FjY2Vzc2libGVJbkxvZ2ljYWxEZWNvZGluZwogKgkJVHJ1ZSBpZiB3ZSBu ZWVkIHRvIGxvZyBlbm91Z2ggaW5mb3JtYXRpb24gdG8gaGF2ZSBhY2Nlc3MgdmlhCiAqCQlk ZWNvZGluZyBzbmFwc2hvdC4KICovCiNkZWZpbmUgUmVsYXRpb25Jc0FjY2Vzc2libGVJbkxv Z2ljYWxEZWNvZGluZyhyZWxhdGlvbikgXAoJKFhMb2dMb2dpY2FsSW5mb0FjdGl2ZSgpICYm IFwKCSBSZWxhdGlvbk5lZWRzV0FMKHJlbGF0aW9uKSAmJiBcCgkgKElzQ2F0YWxvZ1JlbGF0 aW9uKHJlbGF0aW9uKSB8fCBSZWxhdGlvbklzVXNlZEFzQ2F0YWxvZ1RhYmxlKHJlbGF0aW9u KSkpCgovKgogKiBSZWxhdGlvbklzTG9naWNhbGx5TG9nZ2VkCiAqCQlUcnVlIGlmIHdlIG5l ZWQgdG8gbG9nIGVub3VnaCBpbmZvcm1hdGlvbiB0byBleHRyYWN0IHRoZSBkYXRhIGZyb20g dGhlCiAqCQlXQUwgc3RyZWFtLgogKgogKiBXZSBkb24ndCBsb2cgaW5mb3JtYXRpb24gZm9y IHVubG9nZ2VkIHRhYmxlcyAoc2luY2UgdGhleSBkb24ndCBXQUwgbG9nCiAqIGFueXdheSks IGZvciBmb3JlaWduIHRhYmxlcyAoc2luY2UgdGhleSBkb24ndCBXQUwgbG9nLCBlaXRoZXIp LAogKiBhbmQgZm9yIHN5c3RlbSB0YWJsZXMgKHRoZWlyIGNvbnRlbnQgaXMgaGFyZCB0byBt YWtlIHNlbnNlIG9mLCBhbmQKICogaXQgd291bGQgY29tcGxpY2F0ZSBkZWNvZGluZyBzbGln aHRseSBmb3IgbGl0dGxlIGdhaW4pLiBOb3RlIHRoYXQgd2UgKmRvKgogKiBsb2cgaW5mb3Jt YXRpb24gZm9yIHVzZXIgZGVmaW5lZCBjYXRhbG9nIHRhYmxlcyBzaW5jZSB0aGV5IHByZXN1 bWFibHkgYXJlCiAqIGludGVyZXN0aW5nIHRvIHRoZSB1c2VyLi4uCiAqLwojZGVmaW5lIFJl bGF0aW9uSXNMb2dpY2FsbHlMb2dnZWQocmVsYXRpb24pIFwKCShYTG9nTG9naWNhbEluZm9B Y3RpdmUoKSAmJiBcCgkgUmVsYXRpb25OZWVkc1dBTChyZWxhdGlvbikgJiYgXAoJIChyZWxh dGlvbiktPnJkX3JlbC0+cmVsa2luZCAhPSBSRUxLSU5EX0ZPUkVJR05fVEFCTEUgJiYJXAoJ ICFJc0NhdGFsb2dSZWxhdGlvbihyZWxhdGlvbikpCgovKiByb3V0aW5lcyBpbiB1dGlscy9j YWNoZS9yZWxjYWNoZS5jICovCmV4dGVybiB2b2lkIFJlbGF0aW9uSW5jcmVtZW50UmVmZXJl bmNlQ291bnQoUmVsYXRpb24gcmVsKTsKZXh0ZXJuIHZvaWQgUmVsYXRpb25EZWNyZW1lbnRS ZWZlcmVuY2VDb3VudChSZWxhdGlvbiByZWwpOwoKI2VuZGlmCQkJCQkJCS8qIFJFTF9IICov CgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALi9yZWxjYWNoZS5jAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAADAwMDA2NjQAMDAwMTc1MAAwMDAxNzUwADAwMDAwNjcx NDc0ADE1MjIyMTUwMDI1ADAxMTYzNAAgMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAB1c3RhciAgAHhtYW4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAeG1hbgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICoKICogcmVsY2FjaGUuYwogKgkgIFBPU1RHUkVT IHJlbGF0aW9uIGRlc2NyaXB0b3IgY2FjaGUgY29kZQogKgogKiBQb3J0aW9ucyBDb3B5cmln aHQgKGMpIDE5OTYtMjAyNiwgUG9zdGdyZVNRTCBHbG9iYWwgRGV2ZWxvcG1lbnQgR3JvdXAK ICogUG9ydGlvbnMgQ29weXJpZ2h0IChjKSAxOTk0LCBSZWdlbnRzIG9mIHRoZSBVbml2ZXJz aXR5IG9mIENhbGlmb3JuaWEKICoKICoKICogSURFTlRJRklDQVRJT04KICoJICBzcmMvYmFj a2VuZC91dGlscy9jYWNoZS9yZWxjYWNoZS5jCiAqCiAqLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQog Ki8KLyoKICogSU5URVJGQUNFIFJPVVRJTkVTCiAqCQlSZWxhdGlvbkNhY2hlSW5pdGlhbGl6 ZQkJCS0gaW5pdGlhbGl6ZSByZWxjYWNoZSAodG8gZW1wdHkpCiAqCQlSZWxhdGlvbkNhY2hl SW5pdGlhbGl6ZVBoYXNlMgktIGluaXRpYWxpemUgc2hhcmVkLWNhdGFsb2cgZW50cmllcwog KgkJUmVsYXRpb25DYWNoZUluaXRpYWxpemVQaGFzZTMJLSBmaW5pc2ggaW5pdGlhbGl6aW5n IHJlbGNhY2hlCiAqCQlSZWxhdGlvbklkR2V0UmVsYXRpb24JCQktIGdldCBhIHJlbGRlc2Mg YnkgcmVsYXRpb24gaWQKICoJCVJlbGF0aW9uQ2xvc2UJCQkJCS0gY2xvc2UgYW4gb3BlbiBy ZWxhdGlvbgogKgogKiBOT1RFUwogKgkJVGhlIGZvbGxvd2luZyBjb2RlIGNvbnRhaW5zIG1h bnkgdW5kb2N1bWVudGVkIGhhY2tzLiAgUGxlYXNlIGJlCiAqCQljYXJlZnVsLi4uLgogKi8K I2luY2x1ZGUgInBvc3RncmVzLmgiCgojaW5jbHVkZSA8c3lzL2ZpbGUuaD4KI2luY2x1ZGUg PGZjbnRsLmg+CiNpbmNsdWRlIDx1bmlzdGQuaD4KCiNpbmNsdWRlICJhY2Nlc3MvaHR1cF9k ZXRhaWxzLmgiCiNpbmNsdWRlICJhY2Nlc3MvbXVsdGl4YWN0LmgiCiNpbmNsdWRlICJhY2Nl c3MvcGFyYWxsZWwuaCIKI2luY2x1ZGUgImFjY2Vzcy9yZWxvcHRpb25zLmgiCiNpbmNsdWRl ICJhY2Nlc3Mvc3lzYXR0ci5oIgojaW5jbHVkZSAiYWNjZXNzL3RhYmxlLmgiCiNpbmNsdWRl ICJhY2Nlc3MvdGFibGVhbS5oIgojaW5jbHVkZSAiYWNjZXNzL3R1cGRlc2NfZGV0YWlscy5o IgojaW5jbHVkZSAiYWNjZXNzL3hhY3QuaCIKI2luY2x1ZGUgImNhdGFsb2cvYmluYXJ5X3Vw Z3JhZGUuaCIKI2luY2x1ZGUgImNhdGFsb2cvY2F0YWxvZy5oIgojaW5jbHVkZSAiY2F0YWxv Zy9pbmRleGluZy5oIgojaW5jbHVkZSAiY2F0YWxvZy9uYW1lc3BhY2UuaCIKI2luY2x1ZGUg ImNhdGFsb2cvcGFydGl0aW9uLmgiCiNpbmNsdWRlICJjYXRhbG9nL3BnX2FtLmgiCiNpbmNs dWRlICJjYXRhbG9nL3BnX2FtcHJvYy5oIgojaW5jbHVkZSAiY2F0YWxvZy9wZ19hdHRyZGVm LmgiCiNpbmNsdWRlICJjYXRhbG9nL3BnX2F1dGhfbWVtYmVycy5oIgojaW5jbHVkZSAiY2F0 YWxvZy9wZ19hdXRoaWQuaCIKI2luY2x1ZGUgImNhdGFsb2cvcGdfY29uc3RyYWludC5oIgoj aW5jbHVkZSAiY2F0YWxvZy9wZ19kYXRhYmFzZS5oIgojaW5jbHVkZSAiY2F0YWxvZy9wZ19u YW1lc3BhY2UuaCIKI2luY2x1ZGUgImNhdGFsb2cvcGdfb3BjbGFzcy5oIgojaW5jbHVkZSAi Y2F0YWxvZy9wZ19wcm9jLmgiCiNpbmNsdWRlICJjYXRhbG9nL3BnX3B1YmxpY2F0aW9uLmgi CiNpbmNsdWRlICJjYXRhbG9nL3BnX3Jld3JpdGUuaCIKI2luY2x1ZGUgImNhdGFsb2cvcGdf c2hzZWNsYWJlbC5oIgojaW5jbHVkZSAiY2F0YWxvZy9wZ19zdGF0aXN0aWNfZXh0LmgiCiNp bmNsdWRlICJjYXRhbG9nL3BnX3N1YnNjcmlwdGlvbi5oIgojaW5jbHVkZSAiY2F0YWxvZy9w Z190YWJsZXNwYWNlLmgiCiNpbmNsdWRlICJjYXRhbG9nL3BnX3RyaWdnZXIuaCIKI2luY2x1 ZGUgImNhdGFsb2cvcGdfdHlwZS5oIgojaW5jbHVkZSAiY2F0YWxvZy9zY2hlbWFwZy5oIgoj aW5jbHVkZSAiY2F0YWxvZy9zdG9yYWdlLmgiCiNpbmNsdWRlICJjb21tYW5kcy9wb2xpY3ku aCIKI2luY2x1ZGUgImNvbW1hbmRzL3B1YmxpY2F0aW9uY21kcy5oIgojaW5jbHVkZSAiY29t bWFuZHMvdHJpZ2dlci5oIgojaW5jbHVkZSAiY29tbW9uL2ludC5oIgojaW5jbHVkZSAibWlz Y2FkbWluLmgiCiNpbmNsdWRlICJub2Rlcy9tYWtlZnVuY3MuaCIKI2luY2x1ZGUgIm5vZGVz L25vZGVGdW5jcy5oIgojaW5jbHVkZSAib3B0aW1pemVyL29wdGltaXplci5oIgojaW5jbHVk ZSAicGdzdGF0LmgiCiNpbmNsdWRlICJyZXdyaXRlL3Jld3JpdGVEZWZpbmUuaCIKI2luY2x1 ZGUgInJld3JpdGUvcm93c2VjdXJpdHkuaCIKI2luY2x1ZGUgInN0b3JhZ2UvZmQuaCIKI2lu Y2x1ZGUgInN0b3JhZ2UvbG1nci5oIgojaW5jbHVkZSAic3RvcmFnZS9sb2NrLmgiCiNpbmNs dWRlICJzdG9yYWdlL3NtZ3IuaCIKI2luY2x1ZGUgInV0aWxzL2FycmF5LmgiCiNpbmNsdWRl ICJ1dGlscy9idWlsdGlucy5oIgojaW5jbHVkZSAidXRpbHMvY2F0Y2FjaGUuaCIKI2luY2x1 ZGUgInV0aWxzL2RhdHVtLmgiCiNpbmNsdWRlICJ1dGlscy9mbWdyb2lkcy5oIgojaW5jbHVk ZSAidXRpbHMvaW52YWwuaCIKI2luY2x1ZGUgInV0aWxzL2xzeXNjYWNoZS5oIgojaW5jbHVk ZSAidXRpbHMvbWVtdXRpbHMuaCIKI2luY2x1ZGUgInV0aWxzL3JlbG1hcHBlci5oIgojaW5j bHVkZSAidXRpbHMvcmVzb3duZXIuaCIKI2luY2x1ZGUgInV0aWxzL3NuYXBtZ3IuaCIKI2lu Y2x1ZGUgInV0aWxzL3N5c2NhY2hlLmgiCiNpbmNsdWRlICJyZXdyaXRlL3Jld3JpdGVIYW5k bGVyLmgiCgojZGVmaW5lIFJFTENBQ0hFX0lOSVRfRklMRU1BR0lDCQkweDU3MzI2NgkvKiB2 ZXJzaW9uIElEIHZhbHVlICovCgovKgogKiBXaGV0aGVyIHRvIGJvdGhlciBjaGVja2luZyBp ZiByZWxhdGlvbiBjYWNoZSBtZW1vcnkgbmVlZHMgdG8gYmUgZnJlZWQKICogZWFnZXJseS4g IFNlZSBhbHNvIFJlbGF0aW9uQnVpbGREZXNjKCkgYW5kIHBnX2NvbmZpZ19tYW51YWwuaC4K ICovCiNpZiBkZWZpbmVkKFJFQ09WRVJfUkVMQVRJT05fQlVJTERfTUVNT1JZKSAmJiAoUkVD T1ZFUl9SRUxBVElPTl9CVUlMRF9NRU1PUlkgIT0gMCkKI2RlZmluZSBNQVlCRV9SRUNPVkVS X1JFTEFUSU9OX0JVSUxEX01FTU9SWSAxCiNlbHNlCiNkZWZpbmUgUkVDT1ZFUl9SRUxBVElP Tl9CVUlMRF9NRU1PUlkgMAojaWZkZWYgRElTQ0FSRF9DQUNIRVNfRU5BQkxFRAojZGVmaW5l IE1BWUJFX1JFQ09WRVJfUkVMQVRJT05fQlVJTERfTUVNT1JZIDEKI2VuZGlmCiNlbmRpZgoK LyoKICoJCWhhcmRjb2RlZCB0dXBsZSBkZXNjcmlwdG9ycywgY29udGVudHMgZ2VuZXJhdGVk IGJ5IGdlbmJraS5wbAogKi8Kc3RhdGljIGNvbnN0IEZvcm1EYXRhX3BnX2F0dHJpYnV0ZSBE ZXNjX3BnX2NsYXNzW05hdHRzX3BnX2NsYXNzXSA9IHtTY2hlbWFfcGdfY2xhc3N9OwpzdGF0 aWMgY29uc3QgRm9ybURhdGFfcGdfYXR0cmlidXRlIERlc2NfcGdfYXR0cmlidXRlW05hdHRz X3BnX2F0dHJpYnV0ZV0gPSB7U2NoZW1hX3BnX2F0dHJpYnV0ZX07CnN0YXRpYyBjb25zdCBG b3JtRGF0YV9wZ19hdHRyaWJ1dGUgRGVzY19wZ19wcm9jW05hdHRzX3BnX3Byb2NdID0ge1Nj aGVtYV9wZ19wcm9jfTsKc3RhdGljIGNvbnN0IEZvcm1EYXRhX3BnX2F0dHJpYnV0ZSBEZXNj X3BnX3R5cGVbTmF0dHNfcGdfdHlwZV0gPSB7U2NoZW1hX3BnX3R5cGV9OwpzdGF0aWMgY29u c3QgRm9ybURhdGFfcGdfYXR0cmlidXRlIERlc2NfcGdfZGF0YWJhc2VbTmF0dHNfcGdfZGF0 YWJhc2VdID0ge1NjaGVtYV9wZ19kYXRhYmFzZX07CnN0YXRpYyBjb25zdCBGb3JtRGF0YV9w Z19hdHRyaWJ1dGUgRGVzY19wZ19hdXRoaWRbTmF0dHNfcGdfYXV0aGlkXSA9IHtTY2hlbWFf cGdfYXV0aGlkfTsKc3RhdGljIGNvbnN0IEZvcm1EYXRhX3BnX2F0dHJpYnV0ZSBEZXNjX3Bn X2F1dGhfbWVtYmVyc1tOYXR0c19wZ19hdXRoX21lbWJlcnNdID0ge1NjaGVtYV9wZ19hdXRo X21lbWJlcnN9OwpzdGF0aWMgY29uc3QgRm9ybURhdGFfcGdfYXR0cmlidXRlIERlc2NfcGdf aW5kZXhbTmF0dHNfcGdfaW5kZXhdID0ge1NjaGVtYV9wZ19pbmRleH07CnN0YXRpYyBjb25z dCBGb3JtRGF0YV9wZ19hdHRyaWJ1dGUgRGVzY19wZ19zaHNlY2xhYmVsW05hdHRzX3BnX3No c2VjbGFiZWxdID0ge1NjaGVtYV9wZ19zaHNlY2xhYmVsfTsKc3RhdGljIGNvbnN0IEZvcm1E YXRhX3BnX2F0dHJpYnV0ZSBEZXNjX3BnX3N1YnNjcmlwdGlvbltOYXR0c19wZ19zdWJzY3Jp cHRpb25dID0ge1NjaGVtYV9wZ19zdWJzY3JpcHRpb259OwoKLyoKICoJCUhhc2ggdGFibGVz IHRoYXQgaW5kZXggdGhlIHJlbGF0aW9uIGNhY2hlCiAqCiAqCQlXZSB1c2VkIHRvIGluZGV4 IHRoZSBjYWNoZSBieSBib3RoIG5hbWUgYW5kIE9JRCwgYnV0IG5vdyB0aGVyZQogKgkJaXMg b25seSBhbiBpbmRleCBieSBPSUQuCiAqLwp0eXBlZGVmIHN0cnVjdCByZWxpZGNhY2hlZW50 CnsKCU9pZAkJCXJlbG9pZDsKCVJlbGF0aW9uCXJlbGRlc2M7Cn0gUmVsSWRDYWNoZUVudDsK CnN0YXRpYyBIVEFCICpSZWxhdGlvbklkQ2FjaGU7CgovKgogKiBUaGlzIGZsYWcgaXMgZmFs c2UgdW50aWwgd2UgaGF2ZSBwcmVwYXJlZCB0aGUgY3JpdGljYWwgcmVsY2FjaGUgZW50cmll cwogKiB0aGF0IGFyZSBuZWVkZWQgdG8gZG8gaW5kZXhzY2FucyBvbiB0aGUgdGFibGVzIHJl YWQgYnkgcmVsY2FjaGUgYnVpbGRpbmcuCiAqLwpib29sCQljcml0aWNhbFJlbGNhY2hlc0J1 aWx0ID0gZmFsc2U7CgovKgogKiBUaGlzIGZsYWcgaXMgZmFsc2UgdW50aWwgd2UgaGF2ZSBw cmVwYXJlZCB0aGUgY3JpdGljYWwgcmVsY2FjaGUgZW50cmllcwogKiBmb3Igc2hhcmVkIGNh dGFsb2dzICh3aGljaCBhcmUgdGhlIHRhYmxlcyBuZWVkZWQgZm9yIGxvZ2luKS4KICovCmJv b2wJCWNyaXRpY2FsU2hhcmVkUmVsY2FjaGVzQnVpbHQgPSBmYWxzZTsKCi8qCiAqIFRoaXMg Y291bnRlciBjb3VudHMgcmVsY2FjaGUgaW52YWwgZXZlbnRzIHJlY2VpdmVkIHNpbmNlIGJh Y2tlbmQgc3RhcnR1cAogKiAoYnV0IG9ubHkgZm9yIHJlbHMgdGhhdCBhcmUgYWN0dWFsbHkg aW4gY2FjaGUpLiAgUHJlc2VudGx5LCB3ZSB1c2UgaXQgb25seQogKiB0byBkZXRlY3Qgd2hl dGhlciBkYXRhIGFib3V0IHRvIGJlIHdyaXR0ZW4gYnkgd3JpdGVfcmVsY2FjaGVfaW5pdF9m aWxlKCkKICogbWlnaHQgYWxyZWFkeSBiZSBvYnNvbGV0ZS4KICovCnN0YXRpYyBsb25nIHJl bGNhY2hlSW52YWxzUmVjZWl2ZWQgPSAwTDsKCi8qCiAqIGluX3Byb2dyZXNzX2xpc3QgaXMg YSBzdGFjayBvZiBvbmdvaW5nIFJlbGF0aW9uQnVpbGREZXNjKCkgY2FsbHMuICBDUkVBVEUK ICogSU5ERVggQ09OQ1VSUkVOVExZIG1ha2VzIGNhdGFsb2cgY2hhbmdlcyB1bmRlciBTaGFy ZVVwZGF0ZUV4Y2x1c2l2ZUxvY2suCiAqIEl0IGNyaXRpY2FsbHkgcmVsaWVzIG9uIGVhY2gg YmFja2VuZCBhYnNvcmJpbmcgdGhvc2UgY2hhbmdlcyBubyBsYXRlciB0aGFuCiAqIG5leHQg dHJhbnNhY3Rpb24gc3RhcnQuICBIZW5jZSwgUmVsYXRpb25CdWlsZERlc2MoKSBsb29wcyB1 bnRpbCBpdCBmaW5pc2hlcwogKiB3aXRob3V0IGFjY2VwdGluZyBhIHJlbGV2YW50IGludmFs aWRhdGlvbi4gIChNb3N0IGludmFsaWRhdGlvbiBjb25zdW1lcnMKICogZG9uJ3QgZG8gdGhp cy4pCiAqLwp0eXBlZGVmIHN0cnVjdCBpbnByb2dyZXNzZW50CnsKCU9pZAkJCXJlbG9pZDsJ CQkvKiBPSUQgb2YgcmVsYXRpb24gYmVpbmcgYnVpbHQgKi8KCWJvb2wJCWludmFsaWRhdGVk OwkvKiB3aGV0aGVyIGFuIGludmFsaWRhdGlvbiBhcnJpdmVkIGZvciBpdCAqLwp9IEluUHJv Z3Jlc3NFbnQ7CgpzdGF0aWMgSW5Qcm9ncmVzc0VudCAqaW5fcHJvZ3Jlc3NfbGlzdDsKc3Rh dGljIGludAlpbl9wcm9ncmVzc19saXN0X2xlbjsKc3RhdGljIGludAlpbl9wcm9ncmVzc19s aXN0X21heGxlbjsKCi8qCiAqIGVveGFjdF9saXN0W10gc3RvcmVzIHRoZSBPSURzIG9mIHJl bGF0aW9ucyB0aGF0IChtaWdodCkgbmVlZCBBdEVPWGFjdAogKiBjbGVhbnVwIHdvcmsuICBU aGlzIGxpc3QgaW50ZW50aW9uYWxseSBoYXMgbGltaXRlZCBzaXplOyBpZiBpdCBvdmVyZmxv d3MsCiAqIHdlIGZhbGwgYmFjayB0byBzY2FubmluZyB0aGUgd2hvbGUgaGFzaHRhYmxlLiAg VGhlcmUgaXMgbm8gdmFsdWUgaW4gYSB2ZXJ5CiAqIGxhcmdlIGxpc3QgYmVjYXVzZSAoMSkg YXQgc29tZSBwb2ludCwgYSBoYXNoX3NlcV9zZWFyY2ggc2NhbiBpcyBmYXN0ZXIgdGhhbgog KiByZXRhaWwgbG9va3VwcywgYW5kICgyKSB0aGUgdmFsdWUgb2YgdGhpcyBpcyB0byByZWR1 Y2UgRU9YYWN0IHdvcmsgZm9yCiAqIHNob3J0IHRyYW5zYWN0aW9ucywgd2hpY2ggY2FuJ3Qg aGF2ZSBkaXJ0aWVkIGFsbCB0aGF0IG1hbnkgdGFibGVzIGFueXdheS4KICogRU9YYWN0TGlz dEFkZCgpIGRvZXMgbm90IGJvdGhlciB0byBwcmV2ZW50IGR1cGxpY2F0ZSBsaXN0IGVudHJp ZXMsIHNvIHRoZQogKiBjbGVhbnVwIHByb2Nlc3NpbmcgbXVzdCBiZSBpZGVtcG90ZW50Lgog Ki8KI2RlZmluZSBNQVhfRU9YQUNUX0xJU1QgMzIKc3RhdGljIE9pZAllb3hhY3RfbGlzdFtN QVhfRU9YQUNUX0xJU1RdOwpzdGF0aWMgaW50CWVveGFjdF9saXN0X2xlbiA9IDA7CnN0YXRp YyBib29sIGVveGFjdF9saXN0X292ZXJmbG93ZWQgPSBmYWxzZTsKCiNkZWZpbmUgRU9YYWN0 TGlzdEFkZChyZWwpIFwKCWRvIHsgXAoJCWlmIChlb3hhY3RfbGlzdF9sZW4gPCBNQVhfRU9Y QUNUX0xJU1QpIFwKCQkJZW94YWN0X2xpc3RbZW94YWN0X2xpc3RfbGVuKytdID0gKHJlbCkt PnJkX2lkOyBcCgkJZWxzZSBcCgkJCWVveGFjdF9saXN0X292ZXJmbG93ZWQgPSB0cnVlOyBc Cgl9IHdoaWxlICgwKQoKLyoKICogRU9YYWN0VHVwbGVEZXNjQXJyYXkgc3RvcmVzIFR1cGxl RGVzY3MgdGhhdCAobWlnaHQpIG5lZWQgQXRFT1hhY3QKICogY2xlYW51cCB3b3JrLiAgVGhl IGFycmF5IGV4cGFuZHMgYXMgbmVlZGVkOyB0aGVyZSBpcyBubyBoYXNodGFibGUgYmVjYXVz ZQogKiB3ZSBkb24ndCBuZWVkIHRvIGFjY2VzcyBpbmRpdmlkdWFsIGl0ZW1zIGV4Y2VwdCBh dCBFT1hhY3QuCiAqLwpzdGF0aWMgVHVwbGVEZXNjICpFT1hhY3RUdXBsZURlc2NBcnJheTsK c3RhdGljIGludAlOZXh0RU9YYWN0VHVwbGVEZXNjTnVtID0gMDsKc3RhdGljIGludAlFT1hh Y3RUdXBsZURlc2NBcnJheUxlbiA9IDA7CgovKgogKgkJbWFjcm9zIHRvIG1hbmlwdWxhdGUg dGhlIGxvb2t1cCBoYXNodGFibGUKICovCiNkZWZpbmUgUmVsYXRpb25DYWNoZUluc2VydChS RUxBVElPTiwgcmVwbGFjZV9hbGxvd2VkKQlcCmRvIHsgXAoJUmVsSWRDYWNoZUVudCAqaGVu dHJ5OyBib29sIGZvdW5kOyBcCgloZW50cnkgPSAoUmVsSWRDYWNoZUVudCAqKSBoYXNoX3Nl YXJjaChSZWxhdGlvbklkQ2FjaGUsIFwKCQkJCQkJCQkJCSAgICYoKFJFTEFUSU9OKS0+cmRf aWQpLCBcCgkJCQkJCQkJCQkgICBIQVNIX0VOVEVSLCAmZm91bmQpOyBcCglpZiAoZm91bmQp IFwKCXsgXAoJCS8qIHNlZSBjb21tZW50cyBpbiBSZWxhdGlvbkJ1aWxkRGVzYyBhbmQgUmVs YXRpb25CdWlsZExvY2FsUmVsYXRpb24gKi8gXAoJCVJlbGF0aW9uIF9vbGRfcmVsID0gaGVu dHJ5LT5yZWxkZXNjOyBcCgkJQXNzZXJ0KHJlcGxhY2VfYWxsb3dlZCk7IFwKCQloZW50cnkt PnJlbGRlc2MgPSAoUkVMQVRJT04pOyBcCgkJaWYgKFJlbGF0aW9uSGFzUmVmZXJlbmNlQ291 bnRaZXJvKF9vbGRfcmVsKSkgXAoJCQlSZWxhdGlvbkRlc3Ryb3lSZWxhdGlvbihfb2xkX3Jl bCwgZmFsc2UpOyBcCgkJZWxzZSBpZiAoIUlzQm9vdHN0cmFwUHJvY2Vzc2luZ01vZGUoKSkg XAoJCQllbG9nKFdBUk5JTkcsICJsZWFraW5nIHN0aWxsLXJlZmVyZW5jZWQgcmVsY2FjaGUg ZW50cnkgZm9yIFwiJXNcIiIsIFwKCQkJCSBSZWxhdGlvbkdldFJlbGF0aW9uTmFtZShfb2xk X3JlbCkpOyBcCgl9IFwKCWVsc2UgXAoJCWhlbnRyeS0+cmVsZGVzYyA9IChSRUxBVElPTik7 IFwKfSB3aGlsZSgwKQoKI2RlZmluZSBSZWxhdGlvbklkQ2FjaGVMb29rdXAoSUQsIFJFTEFU SU9OKSBcCmRvIHsgXAoJUmVsSWRDYWNoZUVudCAqaGVudHJ5OyBcCgloZW50cnkgPSAoUmVs SWRDYWNoZUVudCAqKSBoYXNoX3NlYXJjaChSZWxhdGlvbklkQ2FjaGUsIFwKCQkJCQkJCQkJ CSAgICYoSUQpLCBcCgkJCQkJCQkJCQkgICBIQVNIX0ZJTkQsIE5VTEwpOyBcCglpZiAoaGVu dHJ5KSBcCgkJUkVMQVRJT04gPSBoZW50cnktPnJlbGRlc2M7IFwKCWVsc2UgXAoJCVJFTEFU SU9OID0gTlVMTDsgXAp9IHdoaWxlKDApCgojZGVmaW5lIFJlbGF0aW9uQ2FjaGVEZWxldGUo UkVMQVRJT04pIFwKZG8geyBcCglSZWxJZENhY2hlRW50ICpoZW50cnk7IFwKCWhlbnRyeSA9 IChSZWxJZENhY2hlRW50ICopIGhhc2hfc2VhcmNoKFJlbGF0aW9uSWRDYWNoZSwgXAoJCQkJ CQkJCQkJICAgJigoUkVMQVRJT04pLT5yZF9pZCksIFwKCQkJCQkJCQkJCSAgIEhBU0hfUkVN T1ZFLCBOVUxMKTsgXAoJaWYgKGhlbnRyeSA9PSBOVUxMKSBcCgkJZWxvZyhXQVJOSU5HLCAi ZmFpbGVkIHRvIGRlbGV0ZSByZWxjYWNoZSBlbnRyeSBmb3IgT0lEICV1IiwgXAoJCQkgKFJF TEFUSU9OKS0+cmRfaWQpOyBcCn0gd2hpbGUoMCkKCgovKgogKiBTcGVjaWFsIGNhY2hlIGZv ciBvcGNsYXNzLXJlbGF0ZWQgaW5mb3JtYXRpb24KICoKICogTm90ZTogb25seSBkZWZhdWx0 IHN1cHBvcnQgcHJvY3MgZ2V0IGNhY2hlZCwgaWUsIHRob3NlIHdpdGgKICogbGVmdHR5cGUg PSByaWdodHR5cGUgPSBvcGNpbnR5cGUuCiAqLwp0eXBlZGVmIHN0cnVjdCBvcGNsYXNzY2Fj aGVlbnQKewoJT2lkCQkJb3BjbGFzc29pZDsJCS8qIGxvb2t1cCBrZXk6IE9JRCBvZiBvcGNs YXNzICovCglib29sCQl2YWxpZDsJCQkvKiBzZXQgdHJ1ZSBhZnRlciBzdWNjZXNzZnVsIGZp bGwtaW4gKi8KCVN0cmF0ZWd5TnVtYmVyIG51bVN1cHBvcnQ7CS8qIG1heCAjIG9mIHN1cHBv cnQgcHJvY3MgKGZyb20gcGdfYW0pICovCglPaWQJCQlvcGNmYW1pbHk7CQkvKiBPSUQgb2Yg b3BjbGFzcydzIGZhbWlseSAqLwoJT2lkCQkJb3BjaW50eXBlOwkJLyogT0lEIG9mIG9wY2xh c3MncyBkZWNsYXJlZCBpbnB1dCB0eXBlICovCglSZWdQcm9jZWR1cmUgKnN1cHBvcnRQcm9j czsgLyogT0lEcyBvZiBzdXBwb3J0IHByb2NlZHVyZXMgKi8KfSBPcENsYXNzQ2FjaGVFbnQ7 CgpzdGF0aWMgSFRBQiAqT3BDbGFzc0NhY2hlID0gTlVMTDsKCgovKiBub24tZXhwb3J0IGZ1 bmN0aW9uIHByb3RvdHlwZXMgKi8KCnN0YXRpYyB2b2lkIFJlbGF0aW9uQ2xvc2VDbGVhbnVw KFJlbGF0aW9uIHJlbGF0aW9uKTsKc3RhdGljIHZvaWQgUmVsYXRpb25EZXN0cm95UmVsYXRp b24oUmVsYXRpb24gcmVsYXRpb24sIGJvb2wgcmVtZW1iZXJfdHVwZGVzYyk7CnN0YXRpYyB2 b2lkIFJlbGF0aW9uSW52YWxpZGF0ZVJlbGF0aW9uKFJlbGF0aW9uIHJlbGF0aW9uKTsKc3Rh dGljIHZvaWQgUmVsYXRpb25DbGVhclJlbGF0aW9uKFJlbGF0aW9uIHJlbGF0aW9uKTsKc3Rh dGljIHZvaWQgUmVsYXRpb25SZWJ1aWxkUmVsYXRpb24oUmVsYXRpb24gcmVsYXRpb24pOwoK c3RhdGljIHZvaWQgUmVsYXRpb25SZWxvYWRJbmRleEluZm8oUmVsYXRpb24gcmVsYXRpb24p OwpzdGF0aWMgdm9pZCBSZWxhdGlvblJlbG9hZE5haWxlZChSZWxhdGlvbiByZWxhdGlvbik7 CnN0YXRpYyB2b2lkIFJlbGF0aW9uRmx1c2hSZWxhdGlvbihSZWxhdGlvbiByZWxhdGlvbik7 CnN0YXRpYyB2b2lkIFJlbWVtYmVyVG9GcmVlVHVwbGVEZXNjQXRFT1goVHVwbGVEZXNjIHRk KTsKI2lmZGVmIFVTRV9BU1NFUlRfQ0hFQ0tJTkcKc3RhdGljIHZvaWQgQXNzZXJ0UGVuZGlu Z1N5bmNDb25zaXN0ZW5jeShSZWxhdGlvbiByZWxhdGlvbik7CiNlbmRpZgpzdGF0aWMgdm9p ZCBBdEVPWGFjdF9jbGVhbnVwKFJlbGF0aW9uIHJlbGF0aW9uLCBib29sIGlzQ29tbWl0KTsK c3RhdGljIHZvaWQgQXRFT1N1YlhhY3RfY2xlYW51cChSZWxhdGlvbiByZWxhdGlvbiwgYm9v bCBpc0NvbW1pdCwKCQkJCQkJCQlTdWJUcmFuc2FjdGlvbklkIG15U3ViaWQsIFN1YlRyYW5z YWN0aW9uSWQgcGFyZW50U3ViaWQpOwpzdGF0aWMgYm9vbCBsb2FkX3JlbGNhY2hlX2luaXRf ZmlsZShib29sIHNoYXJlZCk7CnN0YXRpYyB2b2lkIHdyaXRlX3JlbGNhY2hlX2luaXRfZmls ZShib29sIHNoYXJlZCk7CnN0YXRpYyB2b2lkIHdyaXRlX2l0ZW0oY29uc3Qgdm9pZCAqZGF0 YSwgU2l6ZSBsZW4sIEZJTEUgKmZwKTsKCnN0YXRpYyB2b2lkIGZvcm1yZGVzYyhjb25zdCBj aGFyICpyZWxhdGlvbk5hbWUsIE9pZCByZWxhdGlvblJlbHR5cGUsCgkJCQkJICBib29sIGlz c2hhcmVkLCBpbnQgbmF0dHMsIGNvbnN0IEZvcm1EYXRhX3BnX2F0dHJpYnV0ZSAqYXR0cnMp OwoKc3RhdGljIEhlYXBUdXBsZSBTY2FuUGdSZWxhdGlvbihPaWQgdGFyZ2V0UmVsSWQsIGJv b2wgaW5kZXhPSywgYm9vbCBmb3JjZV9ub25faGlzdG9yaWMpOwpzdGF0aWMgUmVsYXRpb24g QWxsb2NhdGVSZWxhdGlvbkRlc2MoRm9ybV9wZ19jbGFzcyByZWxwKTsKc3RhdGljIHZvaWQg UmVsYXRpb25QYXJzZVJlbE9wdGlvbnMoUmVsYXRpb24gcmVsYXRpb24sIEhlYXBUdXBsZSB0 dXBsZSk7CnN0YXRpYyB2b2lkIFJlbGF0aW9uQnVpbGRUdXBsZURlc2MoUmVsYXRpb24gcmVs YXRpb24pOwpzdGF0aWMgUmVsYXRpb24gUmVsYXRpb25CdWlsZERlc2MoT2lkIHRhcmdldFJl bElkLCBib29sIGluc2VydEl0KTsKc3RhdGljIHZvaWQgUmVsYXRpb25Jbml0UGh5c2ljYWxB ZGRyKFJlbGF0aW9uIHJlbGF0aW9uKTsKc3RhdGljIHZvaWQgbG9hZF9jcml0aWNhbF9pbmRl eChPaWQgaW5kZXhvaWQsIE9pZCBoZWFwb2lkKTsKc3RhdGljIFR1cGxlRGVzYyBHZXRQZ0Ns YXNzRGVzY3JpcHRvcih2b2lkKTsKc3RhdGljIFR1cGxlRGVzYyBHZXRQZ0luZGV4RGVzY3Jp cHRvcih2b2lkKTsKc3RhdGljIHZvaWQgQXR0ckRlZmF1bHRGZXRjaChSZWxhdGlvbiByZWxh dGlvbiwgaW50IG5kZWYpOwpzdGF0aWMgaW50CUF0dHJEZWZhdWx0Q21wKGNvbnN0IHZvaWQg KmEsIGNvbnN0IHZvaWQgKmIpOwpzdGF0aWMgdm9pZCBDaGVja05OQ29uc3RyYWludEZldGNo KFJlbGF0aW9uIHJlbGF0aW9uKTsKc3RhdGljIGludAlDaGVja0NvbnN0cmFpbnRDbXAoY29u c3Qgdm9pZCAqYSwgY29uc3Qgdm9pZCAqYik7CnN0YXRpYyB2b2lkIEluaXRJbmRleEFtUm91 dGluZShSZWxhdGlvbiByZWxhdGlvbik7CnN0YXRpYyB2b2lkIEluZGV4U3VwcG9ydEluaXRp YWxpemUob2lkdmVjdG9yICppbmRjbGFzcywKCQkJCQkJCQkgICBSZWdQcm9jZWR1cmUgKmlu ZGV4U3VwcG9ydCwKCQkJCQkJCQkgICBPaWQgKm9wRmFtaWx5LAoJCQkJCQkJCSAgIE9pZCAq b3BjSW5UeXBlLAoJCQkJCQkJCSAgIFN0cmF0ZWd5TnVtYmVyIG1heFN1cHBvcnROdW1iZXIs CgkJCQkJCQkJICAgQXR0ck51bWJlciBtYXhBdHRyaWJ1dGVOdW1iZXIpOwpzdGF0aWMgT3BD bGFzc0NhY2hlRW50ICpMb29rdXBPcGNsYXNzSW5mbyhPaWQgb3BlcmF0b3JDbGFzc09pZCwK CQkJCQkJCQkJCSAgU3RyYXRlZ3lOdW1iZXIgbnVtU3VwcG9ydCk7CnN0YXRpYyB2b2lkIFJl bGF0aW9uQ2FjaGVJbml0RmlsZVJlbW92ZUluRGlyKGNvbnN0IGNoYXIgKnRibHNwY3BhdGgp OwpzdGF0aWMgdm9pZCB1bmxpbmtfaW5pdGZpbGUoY29uc3QgY2hhciAqaW5pdGZpbGVuYW1l LCBpbnQgZWxldmVsKTsKCgovKgogKgkJU2NhblBnUmVsYXRpb24KICoKICoJCVRoaXMgaXMg dXNlZCBieSBSZWxhdGlvbkJ1aWxkRGVzYyB0byBmaW5kIGEgcGdfY2xhc3MKICoJCXR1cGxl IG1hdGNoaW5nIHRhcmdldFJlbElkLiAgVGhlIGNhbGxlciBtdXN0IGhvbGQgYXQgbGVhc3QK ICoJCUFjY2Vzc1NoYXJlTG9jayBvbiB0aGUgdGFyZ2V0IHJlbGlkIHRvIHByZXZlbnQgY29u Y3VycmVudC11cGRhdGUKICoJCXNjZW5hcmlvczsgaXQgaXNuJ3QgZ3VhcmFudGVlZCB0aGF0 IGFsbCBzY2FucyB1c2VkIHRvIGJ1aWxkIHRoZQogKgkJcmVsY2FjaGUgZW50cnkgd2lsbCB1 c2UgdGhlIHNhbWUgc25hcHNob3QuICBJZiwgZm9yIGV4YW1wbGUsCiAqCQlhbiBhdHRyaWJ1 dGUgd2VyZSB0byBiZSBhZGRlZCBhZnRlciBzY2FubmluZyBwZ19jbGFzcyBhbmQgYmVmb3Jl CiAqCQlzY2FubmluZyBwZ19hdHRyaWJ1dGUsIHJlbG5hdHRzIHdvdWxkbid0IG1hdGNoLgog KgogKgkJTkI6IHRoZSByZXR1cm5lZCB0dXBsZSBoYXMgYmVlbiBjb3BpZWQgaW50byBwYWxs b2MnZCBzdG9yYWdlCiAqCQlhbmQgbXVzdCBldmVudHVhbGx5IGJlIGZyZWVkIHdpdGggaGVh cF9mcmVldHVwbGUuCiAqLwpzdGF0aWMgSGVhcFR1cGxlClNjYW5QZ1JlbGF0aW9uKE9pZCB0 YXJnZXRSZWxJZCwgYm9vbCBpbmRleE9LLCBib29sIGZvcmNlX25vbl9oaXN0b3JpYykKewoJ SGVhcFR1cGxlCXBnX2NsYXNzX3R1cGxlOwoJUmVsYXRpb24JcGdfY2xhc3NfZGVzYzsKCVN5 c1NjYW5EZXNjIHBnX2NsYXNzX3NjYW47CglTY2FuS2V5RGF0YSBrZXlbMV07CglTbmFwc2hv dAlzbmFwc2hvdCA9IE5VTEw7CgoJLyoKCSAqIElmIHNvbWV0aGluZyBnb2VzIHdyb25nIGR1 cmluZyBiYWNrZW5kIHN0YXJ0dXAsIHdlIG1pZ2h0IGZpbmQgb3Vyc2VsdmVzCgkgKiB0cnlp bmcgdG8gcmVhZCBwZ19jbGFzcyBiZWZvcmUgd2UndmUgc2VsZWN0ZWQgYSBkYXRhYmFzZS4g IFRoYXQgYWluJ3QKCSAqIGdvbm5hIHdvcmssIHNvIGJhaWwgb3V0IHdpdGggYSB1c2VmdWwg ZXJyb3IgbWVzc2FnZS4gIElmIHRoaXMgaGFwcGVucywKCSAqIGl0IHByb2JhYmx5IG1lYW5z IGEgcmVsY2FjaGUgZW50cnkgdGhhdCBuZWVkcyB0byBiZSBuYWlsZWQgaXNuJ3QuCgkgKi8K CWlmICghT2lkSXNWYWxpZChNeURhdGFiYXNlSWQpKQoJCWVsb2coRkFUQUwsICJjYW5ub3Qg cmVhZCBwZ19jbGFzcyB3aXRob3V0IGhhdmluZyBzZWxlY3RlZCBhIGRhdGFiYXNlIik7CgoJ LyoKCSAqIGZvcm0gYSBzY2FuIGtleQoJICovCglTY2FuS2V5SW5pdCgma2V5WzBdLAoJCQkJ QW51bV9wZ19jbGFzc19vaWQsCgkJCQlCVEVxdWFsU3RyYXRlZ3lOdW1iZXIsIEZfT0lERVEs CgkJCQlPYmplY3RJZEdldERhdHVtKHRhcmdldFJlbElkKSk7CgoJLyoKCSAqIE9wZW4gcGdf Y2xhc3MgYW5kIGZldGNoIGEgdHVwbGUuICBGb3JjZSBoZWFwIHNjYW4gaWYgd2UgaGF2ZW4n dCB5ZXQKCSAqIGJ1aWx0IHRoZSBjcml0aWNhbCByZWxjYWNoZSBlbnRyaWVzICh0aGlzIGlu Y2x1ZGVzIGluaXRkYiBhbmQgc3RhcnR1cAoJICogd2l0aG91dCBhIHBnX2ludGVybmFsLmlu aXQgZmlsZSkuICBUaGUgY2FsbGVyIGNhbiBhbHNvIGZvcmNlIGEgaGVhcAoJICogc2NhbiBi eSBzZXR0aW5nIGluZGV4T0sgPT0gZmFsc2UuCgkgKi8KCXBnX2NsYXNzX2Rlc2MgPSB0YWJs ZV9vcGVuKFJlbGF0aW9uUmVsYXRpb25JZCwgQWNjZXNzU2hhcmVMb2NrKTsKCgkvKgoJICog VGhlIGNhbGxlciBtaWdodCBuZWVkIGEgdHVwbGUgdGhhdCdzIG5ld2VyIHRoYW4gd2hhdCdz IHZpc2libGUgdG8gdGhlCgkgKiBoaXN0b3JpYyBzbmFwc2hvdDsgY3VycmVudGx5IHRoZSBv bmx5IGNhc2UgcmVxdWlyaW5nIHRvIGRvIHNvIGlzCgkgKiBsb29raW5nIHVwIHRoZSByZWxm aWxlbnVtYmVyIG9mIG5vbiBtYXBwZWQgc3lzdGVtIHJlbGF0aW9ucyBkdXJpbmcKCSAqIGRl Y29kaW5nLgoJICovCglpZiAoZm9yY2Vfbm9uX2hpc3RvcmljKQoJCXNuYXBzaG90ID0gUmVn aXN0ZXJTbmFwc2hvdChHZXROb25IaXN0b3JpY0NhdGFsb2dTbmFwc2hvdChSZWxhdGlvblJl bGF0aW9uSWQpKTsKCglwZ19jbGFzc19zY2FuID0gc3lzdGFibGVfYmVnaW5zY2FuKHBnX2Ns YXNzX2Rlc2MsIENsYXNzT2lkSW5kZXhJZCwKCQkJCQkJCQkJICAgaW5kZXhPSyAmJiBjcml0 aWNhbFJlbGNhY2hlc0J1aWx0LAoJCQkJCQkJCQkgICBzbmFwc2hvdCwKCQkJCQkJCQkJICAg MSwga2V5KTsKCglwZ19jbGFzc190dXBsZSA9IHN5c3RhYmxlX2dldG5leHQocGdfY2xhc3Nf c2Nhbik7CgoJLyoKCSAqIE11c3QgY29weSB0dXBsZSBiZWZvcmUgcmVsZWFzaW5nIGJ1ZmZl ci4KCSAqLwoJaWYgKEhlYXBUdXBsZUlzVmFsaWQocGdfY2xhc3NfdHVwbGUpKQoJCXBnX2Ns YXNzX3R1cGxlID0gaGVhcF9jb3B5dHVwbGUocGdfY2xhc3NfdHVwbGUpOwoKCS8qIGFsbCBk b25lICovCglzeXN0YWJsZV9lbmRzY2FuKHBnX2NsYXNzX3NjYW4pOwoKCWlmIChzbmFwc2hv dCkKCQlVbnJlZ2lzdGVyU25hcHNob3Qoc25hcHNob3QpOwoKCXRhYmxlX2Nsb3NlKHBnX2Ns YXNzX2Rlc2MsIEFjY2Vzc1NoYXJlTG9jayk7CgoJcmV0dXJuIHBnX2NsYXNzX3R1cGxlOwp9 CgovKgogKgkJQWxsb2NhdGVSZWxhdGlvbkRlc2MKICoKICoJCVRoaXMgaXMgdXNlZCB0byBh bGxvY2F0ZSBtZW1vcnkgZm9yIGEgbmV3IHJlbGF0aW9uIGRlc2NyaXB0b3IKICoJCWFuZCBp bml0aWFsaXplIHRoZSByZF9yZWwgZmllbGQgZnJvbSB0aGUgZ2l2ZW4gcGdfY2xhc3MgdHVw bGUuCiAqLwpzdGF0aWMgUmVsYXRpb24KQWxsb2NhdGVSZWxhdGlvbkRlc2MoRm9ybV9wZ19j bGFzcyByZWxwKQp7CglSZWxhdGlvbglyZWxhdGlvbjsKCU1lbW9yeUNvbnRleHQgb2xkY3h0 OwoJRm9ybV9wZ19jbGFzcyByZWxhdGlvbkZvcm07CgoJLyogUmVsY2FjaGUgZW50cmllcyBt dXN0IGxpdmUgaW4gQ2FjaGVNZW1vcnlDb250ZXh0ICovCglvbGRjeHQgPSBNZW1vcnlDb250 ZXh0U3dpdGNoVG8oQ2FjaGVNZW1vcnlDb250ZXh0KTsKCgkvKgoJICogYWxsb2NhdGUgYW5k IHplcm8gc3BhY2UgZm9yIG5ldyByZWxhdGlvbiBkZXNjcmlwdG9yCgkgKi8KCXJlbGF0aW9u ID0gcGFsbG9jMF9vYmplY3QoUmVsYXRpb25EYXRhKTsKCgkvKiBtYWtlIHN1cmUgcmVsYXRp b24gaXMgbWFya2VkIGFzIGhhdmluZyBubyBvcGVuIGZpbGUgeWV0ICovCglyZWxhdGlvbi0+ cmRfc21nciA9IE5VTEw7CgoJLyoKCSAqIENvcHkgdGhlIHJlbGF0aW9uIHR1cGxlIGZvcm0K CSAqCgkgKiBXZSBvbmx5IGFsbG9jYXRlIHNwYWNlIGZvciB0aGUgZml4ZWQgZmllbGRzLCBp ZSwgQ0xBU1NfVFVQTEVfU0laRS4gVGhlCgkgKiB2YXJpYWJsZS1sZW5ndGggZmllbGRzIChy ZWxhY2wsIHJlbG9wdGlvbnMpIGFyZSBOT1Qgc3RvcmVkIGluIHRoZQoJICogcmVsY2FjaGUg LS0tIHRoZXJlJ2QgYmUgbGl0dGxlIHBvaW50IGluIGl0LCBzaW5jZSB3ZSBkb24ndCBjb3B5 IHRoZQoJICogdHVwbGUncyBudWxscyBiaXRtYXAgYW5kIGhlbmNlIHdvdWxkbid0IGtub3cg aWYgdGhlIHZhbHVlcyBhcmUgdmFsaWQuCgkgKiBCb3R0b20gbGluZSBpcyB0aGF0IHJlbGFj bCAqY2Fubm90KiBiZSByZXRyaWV2ZWQgZnJvbSB0aGUgcmVsY2FjaGUuIEdldAoJICogaXQg ZnJvbSB0aGUgc3lzY2FjaGUgaWYgeW91IG5lZWQgaXQuICBUaGUgc2FtZSBnb2VzIGZvciB0 aGUgb3JpZ2luYWwKCSAqIGZvcm0gb2YgcmVsb3B0aW9ucyAoaG93ZXZlciwgd2UgZG8gc3Rv cmUgdGhlIHBhcnNlZCBmb3JtIG9mIHJlbG9wdGlvbnMKCSAqIGluIHJkX29wdGlvbnMpLgoJ ICovCglyZWxhdGlvbkZvcm0gPSAoRm9ybV9wZ19jbGFzcykgcGFsbG9jKENMQVNTX1RVUExF X1NJWkUpOwoKCW1lbWNweShyZWxhdGlvbkZvcm0sIHJlbHAsIENMQVNTX1RVUExFX1NJWkUp OwoKCS8qIGluaXRpYWxpemUgcmVsYXRpb24gdHVwbGUgZm9ybSAqLwoJcmVsYXRpb24tPnJk X3JlbCA9IHJlbGF0aW9uRm9ybTsKCgkvKiBhbmQgYWxsb2NhdGUgYXR0cmlidXRlIHR1cGxl IGZvcm0gc3RvcmFnZSAqLwoJcmVsYXRpb24tPnJkX2F0dCA9IENyZWF0ZVRlbXBsYXRlVHVw bGVEZXNjKHJlbGF0aW9uRm9ybS0+cmVsbmF0dHMpOwoJLyogd2hpY2ggd2UgbWFyayBhcyBh IHJlZmVyZW5jZS1jb3VudGVkIHR1cGRlc2MgKi8KCXJlbGF0aW9uLT5yZF9hdHQtPnRkcmVm Y291bnQgPSAxOwoKCU1lbW9yeUNvbnRleHRTd2l0Y2hUbyhvbGRjeHQpOwoKCXJldHVybiBy ZWxhdGlvbjsKfQoKLyoKICogUmVsYXRpb25QYXJzZVJlbE9wdGlvbnMKICoJCUNvbnZlcnQg cGdfY2xhc3MucmVsb3B0aW9ucyBpbnRvIHByZS1wYXJzZWQgcmRfb3B0aW9ucwogKgogKiB0 dXBsZSBpcyB0aGUgcmVhbCBwZ19jbGFzcyB0dXBsZSAobm90IHJkX3JlbCEpIGZvciByZWxh dGlvbgogKgogKiBOb3RlOiByZF9yZWwgYW5kIChpZiBhbiBpbmRleCkgcmRfaW5kYW0gbXVz dCBiZSB2YWxpZCBhbHJlYWR5CiAqLwpzdGF0aWMgdm9pZApSZWxhdGlvblBhcnNlUmVsT3B0 aW9ucyhSZWxhdGlvbiByZWxhdGlvbiwgSGVhcFR1cGxlIHR1cGxlKQp7CglieXRlYQkgICAq b3B0aW9uczsKCWFtb3B0aW9uc19mdW5jdGlvbiBhbW9wdHNmbjsKCglyZWxhdGlvbi0+cmRf b3B0aW9ucyA9IE5VTEw7CgoJLyoKCSAqIExvb2sgdXAgYW55IEFNLXNwZWNpZmljIHBhcnNl IGZ1bmN0aW9uOyBmYWxsIG91dCBpZiByZWxraW5kIHNob3VsZCBub3QKCSAqIGhhdmUgb3B0 aW9ucy4KCSAqLwoJc3dpdGNoIChyZWxhdGlvbi0+cmRfcmVsLT5yZWxraW5kKQoJewoJCWNh c2UgUkVMS0lORF9SRUxBVElPTjoKCQljYXNlIFJFTEtJTkRfVE9BU1RWQUxVRToKCQljYXNl IFJFTEtJTkRfVklFVzoKCQljYXNlIFJFTEtJTkRfTUFUVklFVzoKCQljYXNlIFJFTEtJTkRf UEFSVElUSU9ORURfVEFCTEU6CgkJCWFtb3B0c2ZuID0gTlVMTDsKCQkJYnJlYWs7CgkJY2Fz ZSBSRUxLSU5EX0lOREVYOgoJCWNhc2UgUkVMS0lORF9QQVJUSVRJT05FRF9JTkRFWDoKCQkJ YW1vcHRzZm4gPSByZWxhdGlvbi0+cmRfaW5kYW0tPmFtb3B0aW9uczsKCQkJYnJlYWs7CgkJ ZGVmYXVsdDoKCQkJcmV0dXJuOwoJfQoKCS8qCgkgKiBGZXRjaCByZWxvcHRpb25zIGZyb20g dHVwbGU7IGhhdmUgdG8gdXNlIGEgaGFyZHdpcmVkIGRlc2NyaXB0b3IgYmVjYXVzZQoJICog d2UgbWlnaHQgbm90IGhhdmUgYW55IG90aGVyIGZvciBwZ19jbGFzcyB5ZXQgKGNvbnNpZGVy IGV4ZWN1dGluZyB0aGlzCgkgKiBjb2RlIGZvciBwZ19jbGFzcyBpdHNlbGYpCgkgKi8KCW9w dGlvbnMgPSBleHRyYWN0UmVsT3B0aW9ucyh0dXBsZSwgR2V0UGdDbGFzc0Rlc2NyaXB0b3Io KSwgYW1vcHRzZm4pOwoKCS8qCgkgKiBDb3B5IHBhcnNlZCBkYXRhIGludG8gQ2FjaGVNZW1v cnlDb250ZXh0LiAgVG8gZ3VhcmQgYWdhaW5zdCB0aGUKCSAqIHBvc3NpYmlsaXR5IG9mIGxl YWtzIGluIHRoZSByZWxvcHRpb25zIGNvZGUsIHdlIHdhbnQgdG8gZG8gdGhlIGFjdHVhbAoJ ICogcGFyc2luZyBpbiB0aGUgY2FsbGVyJ3MgbWVtb3J5IGNvbnRleHQgYW5kIGNvcHkgdGhl IHJlc3VsdHMgaW50bwoJICogQ2FjaGVNZW1vcnlDb250ZXh0IGFmdGVyIHRoZSBmYWN0LgoJ ICovCglpZiAob3B0aW9ucykKCXsKCQlyZWxhdGlvbi0+cmRfb3B0aW9ucyA9IE1lbW9yeUNv bnRleHRBbGxvYyhDYWNoZU1lbW9yeUNvbnRleHQsCgkJCQkJCQkJCQkJCSAgVkFSU0laRShv cHRpb25zKSk7CgkJbWVtY3B5KHJlbGF0aW9uLT5yZF9vcHRpb25zLCBvcHRpb25zLCBWQVJT SVpFKG9wdGlvbnMpKTsKCQlwZnJlZShvcHRpb25zKTsKCX0KfQoKLyoKICoJCVJlbGF0aW9u QnVpbGRUdXBsZURlc2MKICoKICoJCUZvcm0gdGhlIHJlbGF0aW9uJ3MgdHVwbGUgZGVzY3Jp cHRvciBmcm9tIGluZm9ybWF0aW9uIGluCiAqCQl0aGUgcGdfYXR0cmlidXRlLCBwZ19hdHRy ZGVmICYgcGdfY29uc3RyYWludCBzeXN0ZW0gY2F0YWxvZ3MuCiAqLwpzdGF0aWMgdm9pZApS ZWxhdGlvbkJ1aWxkVHVwbGVEZXNjKFJlbGF0aW9uIHJlbGF0aW9uKQp7CglIZWFwVHVwbGUJ cGdfYXR0cmlidXRlX3R1cGxlOwoJUmVsYXRpb24JcGdfYXR0cmlidXRlX2Rlc2M7CglTeXNT Y2FuRGVzYyBwZ19hdHRyaWJ1dGVfc2NhbjsKCVNjYW5LZXlEYXRhIHNrZXlbMl07CglpbnQJ CQluZWVkOwoJVHVwbGVDb25zdHIgKmNvbnN0cjsKCUF0dHJNaXNzaW5nICphdHRybWlzcyA9 IE5VTEw7CglpbnQJCQluZGVmID0gMDsKCgkvKiBmaWxsIHJkX2F0dCdzIHR5cGUgSUQgZmll bGRzIChjb21wYXJlIGhlYXAuYydzIEFkZE5ld1JlbGF0aW9uVHVwbGUpICovCglyZWxhdGlv bi0+cmRfYXR0LT50ZHR5cGVpZCA9CgkJcmVsYXRpb24tPnJkX3JlbC0+cmVsdHlwZSA/IHJl bGF0aW9uLT5yZF9yZWwtPnJlbHR5cGUgOiBSRUNPUkRPSUQ7CglyZWxhdGlvbi0+cmRfYXR0 LT50ZHR5cG1vZCA9IC0xOwkvKiBqdXN0IHRvIGJlIHN1cmUgKi8KCgljb25zdHIgPSAoVHVw bGVDb25zdHIgKikgTWVtb3J5Q29udGV4dEFsbG9jWmVybyhDYWNoZU1lbW9yeUNvbnRleHQs CgkJCQkJCQkJCQkJCQlzaXplb2YoVHVwbGVDb25zdHIpKTsKCgkvKgoJICogRm9ybSBhIHNj YW4ga2V5IHRoYXQgc2VsZWN0cyBvbmx5IHVzZXIgYXR0cmlidXRlcyAoYXR0bnVtID4gMCku CgkgKiAoRWxpbWluYXRpbmcgc3lzdGVtIGF0dHJpYnV0ZSByb3dzIGF0IHRoZSBpbmRleCBs ZXZlbCBpcyBsb3RzIGZhc3RlcgoJICogdGhhbiBmZXRjaGluZyB0aGVtLikKCSAqLwoJU2Nh bktleUluaXQoJnNrZXlbMF0sCgkJCQlBbnVtX3BnX2F0dHJpYnV0ZV9hdHRyZWxpZCwKCQkJ CUJURXF1YWxTdHJhdGVneU51bWJlciwgRl9PSURFUSwKCQkJCU9iamVjdElkR2V0RGF0dW0o UmVsYXRpb25HZXRSZWxpZChyZWxhdGlvbikpKTsKCVNjYW5LZXlJbml0KCZza2V5WzFdLAoJ CQkJQW51bV9wZ19hdHRyaWJ1dGVfYXR0bnVtLAoJCQkJQlRHcmVhdGVyU3RyYXRlZ3lOdW1i ZXIsIEZfSU5UMkdULAoJCQkJSW50MTZHZXREYXR1bSgwKSk7CgoJLyoKCSAqIE9wZW4gcGdf YXR0cmlidXRlIGFuZCBiZWdpbiBhIHNjYW4uICBGb3JjZSBoZWFwIHNjYW4gaWYgd2UgaGF2 ZW4ndCB5ZXQKCSAqIGJ1aWx0IHRoZSBjcml0aWNhbCByZWxjYWNoZSBlbnRyaWVzICh0aGlz IGluY2x1ZGVzIGluaXRkYiBhbmQgc3RhcnR1cAoJICogd2l0aG91dCBhIHBnX2ludGVybmFs LmluaXQgZmlsZSkuCgkgKi8KCXBnX2F0dHJpYnV0ZV9kZXNjID0gdGFibGVfb3BlbihBdHRy aWJ1dGVSZWxhdGlvbklkLCBBY2Nlc3NTaGFyZUxvY2spOwoJcGdfYXR0cmlidXRlX3NjYW4g PSBzeXN0YWJsZV9iZWdpbnNjYW4ocGdfYXR0cmlidXRlX2Rlc2MsCgkJCQkJCQkJCQkgICBB dHRyaWJ1dGVSZWxpZE51bUluZGV4SWQsCgkJCQkJCQkJCQkgICBjcml0aWNhbFJlbGNhY2hl c0J1aWx0LAoJCQkJCQkJCQkJICAgTlVMTCwKCQkJCQkJCQkJCSAgIDIsIHNrZXkpOwoKCS8q CgkgKiBhZGQgYXR0cmlidXRlIGRhdGEgdG8gcmVsYXRpb24tPnJkX2F0dAoJICovCgluZWVk ID0gUmVsYXRpb25HZXROdW1iZXJPZkF0dHJpYnV0ZXMocmVsYXRpb24pOwoKCXdoaWxlIChI ZWFwVHVwbGVJc1ZhbGlkKHBnX2F0dHJpYnV0ZV90dXBsZSA9IHN5c3RhYmxlX2dldG5leHQo cGdfYXR0cmlidXRlX3NjYW4pKSkKCXsKCQlGb3JtX3BnX2F0dHJpYnV0ZSBhdHRwOwoJCWlu dAkJCWF0dG51bTsKCgkJYXR0cCA9IChGb3JtX3BnX2F0dHJpYnV0ZSkgR0VUU1RSVUNUKHBn X2F0dHJpYnV0ZV90dXBsZSk7CgoJCWF0dG51bSA9IGF0dHAtPmF0dG51bTsKCQlpZiAoYXR0 bnVtIDw9IDAgfHwgYXR0bnVtID4gUmVsYXRpb25HZXROdW1iZXJPZkF0dHJpYnV0ZXMocmVs YXRpb24pKQoJCQllbG9nKEVSUk9SLCAiaW52YWxpZCBhdHRyaWJ1dGUgbnVtYmVyICVkIGZv ciByZWxhdGlvbiBcIiVzXCIiLAoJCQkJIGF0dHAtPmF0dG51bSwgUmVsYXRpb25HZXRSZWxh dGlvbk5hbWUocmVsYXRpb24pKTsKCgkJbWVtY3B5KFR1cGxlRGVzY0F0dHIocmVsYXRpb24t PnJkX2F0dCwgYXR0bnVtIC0gMSksCgkJCSAgIGF0dHAsCgkJCSAgIEFUVFJJQlVURV9GSVhF RF9QQVJUX1NJWkUpOwoKCQlwb3B1bGF0ZV9jb21wYWN0X2F0dHJpYnV0ZShyZWxhdGlvbi0+ cmRfYXR0LCBhdHRudW0gLSAxKTsKCgkJLyogVXBkYXRlIGNvbnN0cmFpbnQvZGVmYXVsdCBp bmZvICovCgkJaWYgKGF0dHAtPmF0dG5vdG51bGwpCgkJCWNvbnN0ci0+aGFzX25vdF9udWxs ID0gdHJ1ZTsKCQlpZiAoYXR0cC0+YXR0Z2VuZXJhdGVkID09IEFUVFJJQlVURV9HRU5FUkFU RURfU1RPUkVEKQoJCQljb25zdHItPmhhc19nZW5lcmF0ZWRfc3RvcmVkID0gdHJ1ZTsKCQlp ZiAoYXR0cC0+YXR0Z2VuZXJhdGVkID09IEFUVFJJQlVURV9HRU5FUkFURURfVklSVFVBTCkK CQkJY29uc3RyLT5oYXNfZ2VuZXJhdGVkX3ZpcnR1YWwgPSB0cnVlOwoJCWlmIChhdHRwLT5h dHRoYXNkZWYpCgkJCW5kZWYrKzsKCgkJLyogSWYgdGhlIGNvbHVtbiBoYXMgYSAibWlzc2lu ZyIgdmFsdWUsIHB1dCBpdCBpbiB0aGUgYXR0cm1pc3MgYXJyYXkgKi8KCQlpZiAoYXR0cC0+ YXR0aGFzbWlzc2luZykKCQl7CgkJCURhdHVtCQltaXNzaW5ndmFsOwoJCQlib29sCQltaXNz aW5nTnVsbDsKCgkJCS8qIERvIHdlIGhhdmUgYSBtaXNzaW5nIHZhbHVlPyAqLwoJCQltaXNz aW5ndmFsID0gaGVhcF9nZXRhdHRyKHBnX2F0dHJpYnV0ZV90dXBsZSwKCQkJCQkJCQkJICBB bnVtX3BnX2F0dHJpYnV0ZV9hdHRtaXNzaW5ndmFsLAoJCQkJCQkJCQkgIHBnX2F0dHJpYnV0 ZV9kZXNjLT5yZF9hdHQsCgkJCQkJCQkJCSAgJm1pc3NpbmdOdWxsKTsKCQkJaWYgKCFtaXNz aW5nTnVsbCkKCQkJewoJCQkJLyogWWVzLCBmZXRjaCBmcm9tIHRoZSBhcnJheSAqLwoJCQkJ TWVtb3J5Q29udGV4dCBvbGRjeHQ7CgkJCQlib29sCQlpc19udWxsOwoJCQkJaW50CQkJb25l ID0gMTsKCQkJCURhdHVtCQltaXNzdmFsOwoKCQkJCWlmIChhdHRybWlzcyA9PSBOVUxMKQoJ CQkJCWF0dHJtaXNzID0gKEF0dHJNaXNzaW5nICopCgkJCQkJCU1lbW9yeUNvbnRleHRBbGxv Y1plcm8oQ2FjaGVNZW1vcnlDb250ZXh0LAoJCQkJCQkJCQkJCSAgIHJlbGF0aW9uLT5yZF9y ZWwtPnJlbG5hdHRzICoKCQkJCQkJCQkJCQkgICBzaXplb2YoQXR0ck1pc3NpbmcpKTsKCgkJ CQltaXNzdmFsID0gYXJyYXlfZ2V0X2VsZW1lbnQobWlzc2luZ3ZhbCwKCQkJCQkJCQkJCQkx LAoJCQkJCQkJCQkJCSZvbmUsCgkJCQkJCQkJCQkJLTEsCgkJCQkJCQkJCQkJYXR0cC0+YXR0 bGVuLAoJCQkJCQkJCQkJCWF0dHAtPmF0dGJ5dmFsLAoJCQkJCQkJCQkJCWF0dHAtPmF0dGFs aWduLAoJCQkJCQkJCQkJCSZpc19udWxsKTsKCQkJCUFzc2VydCghaXNfbnVsbCk7CgkJCQlp ZiAoYXR0cC0+YXR0Ynl2YWwpCgkJCQl7CgkJCQkJLyogZm9yIGNvcHkgYnkgdmFsIGp1c3Qg Y29weSB0aGUgZGF0dW0gZGlyZWN0ICovCgkJCQkJYXR0cm1pc3NbYXR0bnVtIC0gMV0uYW1f dmFsdWUgPSBtaXNzdmFsOwoJCQkJfQoJCQkJZWxzZQoJCQkJewoJCQkJCS8qIG90aGVyd2lz ZSBjb3B5IGluIHRoZSBjb3JyZWN0IGNvbnRleHQgKi8KCQkJCQlvbGRjeHQgPSBNZW1vcnlD b250ZXh0U3dpdGNoVG8oQ2FjaGVNZW1vcnlDb250ZXh0KTsKCQkJCQlhdHRybWlzc1thdHRu dW0gLSAxXS5hbV92YWx1ZSA9IGRhdHVtQ29weShtaXNzdmFsLAoJCQkJCQkJCQkJCQkJCQkg IGF0dHAtPmF0dGJ5dmFsLAoJCQkJCQkJCQkJCQkJCQkgIGF0dHAtPmF0dGxlbik7CgkJCQkJ TWVtb3J5Q29udGV4dFN3aXRjaFRvKG9sZGN4dCk7CgkJCQl9CgkJCQlhdHRybWlzc1thdHRu dW0gLSAxXS5hbV9wcmVzZW50ID0gdHJ1ZTsKCQkJfQoJCX0KCQluZWVkLS07CgkJaWYgKG5l ZWQgPT0gMCkKCQkJYnJlYWs7Cgl9CgoJLyoKCSAqIGVuZCB0aGUgc2NhbiBhbmQgY2xvc2Ug dGhlIGF0dHJpYnV0ZSByZWxhdGlvbgoJICovCglzeXN0YWJsZV9lbmRzY2FuKHBnX2F0dHJp YnV0ZV9zY2FuKTsKCXRhYmxlX2Nsb3NlKHBnX2F0dHJpYnV0ZV9kZXNjLCBBY2Nlc3NTaGFy ZUxvY2spOwoKCWlmIChuZWVkICE9IDApCgkJZWxvZyhFUlJPUiwgInBnX2F0dHJpYnV0ZSBj YXRhbG9nIGlzIG1pc3NpbmcgJWQgYXR0cmlidXRlKHMpIGZvciByZWxhdGlvbiBPSUQgJXUi LAoJCQkgbmVlZCwgUmVsYXRpb25HZXRSZWxpZChyZWxhdGlvbikpOwoKCS8qCgkgKiBTZXQg dXAgY29uc3RyYWludC9kZWZhdWx0IGluZm8KCSAqLwoJaWYgKGNvbnN0ci0+aGFzX25vdF9u dWxsIHx8CgkJY29uc3RyLT5oYXNfZ2VuZXJhdGVkX3N0b3JlZCB8fAoJCWNvbnN0ci0+aGFz X2dlbmVyYXRlZF92aXJ0dWFsIHx8CgkJbmRlZiA+IDAgfHwKCQlhdHRybWlzcyB8fAoJCXJl bGF0aW9uLT5yZF9yZWwtPnJlbGNoZWNrcyA+IDApCgl7CgkJYm9vbAkJaXNfY2F0YWxvZyA9 IElzQ2F0YWxvZ1JlbGF0aW9uKHJlbGF0aW9uKTsKCgkJcmVsYXRpb24tPnJkX2F0dC0+Y29u c3RyID0gY29uc3RyOwoKCQlpZiAobmRlZiA+IDApCQkJLyogREVGQVVMVHMgKi8KCQkJQXR0 ckRlZmF1bHRGZXRjaChyZWxhdGlvbiwgbmRlZik7CgkJZWxzZQoJCQljb25zdHItPm51bV9k ZWZ2YWwgPSAwOwoKCQljb25zdHItPm1pc3NpbmcgPSBhdHRybWlzczsKCgkJLyogQ0hFQ0sg YW5kIE5PVCBOVUxMcyAqLwoJCWlmIChyZWxhdGlvbi0+cmRfcmVsLT5yZWxjaGVja3MgPiAw IHx8CgkJCSghaXNfY2F0YWxvZyAmJiBjb25zdHItPmhhc19ub3RfbnVsbCkpCgkJCUNoZWNr Tk5Db25zdHJhaW50RmV0Y2gocmVsYXRpb24pOwoKCQkvKgoJCSAqIEFueSBub3QtbnVsbCBj b25zdHJhaW50IHRoYXQgd2Fzbid0IG1hcmtlZCBpbnZhbGlkIGJ5CgkJICogQ2hlY2tOTkNv bnN0cmFpbnRGZXRjaCBtdXN0IG5lY2Vzc2FyaWx5IGJlIHZhbGlkOyBtYWtlIGl0IHNvIGlu IHRoZQoJCSAqIENvbXBhY3RBdHRyaWJ1dGUgYXJyYXkuCgkJICovCgkJaWYgKCFpc19jYXRh bG9nKQoJCXsKCQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWxhdGlvbi0+cmRfcmVsLT5yZWxu YXR0czsgaSsrKQoJCQl7CgkJCQlDb21wYWN0QXR0cmlidXRlICphdHRyOwoKCQkJCWF0dHIg PSBUdXBsZURlc2NDb21wYWN0QXR0cihyZWxhdGlvbi0+cmRfYXR0LCBpKTsKCgkJCQlpZiAo YXR0ci0+YXR0bnVsbGFiaWxpdHkgPT0gQVRUTlVMTEFCTEVfVU5LTk9XTikKCQkJCQlhdHRy LT5hdHRudWxsYWJpbGl0eSA9IEFUVE5VTExBQkxFX1ZBTElEOwoJCQkJZWxzZQoJCQkJCUFz c2VydChhdHRyLT5hdHRudWxsYWJpbGl0eSA9PSBBVFROVUxMQUJMRV9JTlZBTElEIHx8CgkJ CQkJCSAgIGF0dHItPmF0dG51bGxhYmlsaXR5ID09IEFUVE5VTExBQkxFX1VOUkVTVFJJQ1RF RCk7CgkJCX0KCQl9CgoJCWlmIChyZWxhdGlvbi0+cmRfcmVsLT5yZWxjaGVja3MgPT0gMCkK CQkJY29uc3RyLT5udW1fY2hlY2sgPSAwOwoJfQoJZWxzZQoJewoJCXBmcmVlKGNvbnN0cik7 CgkJcmVsYXRpb24tPnJkX2F0dC0+Y29uc3RyID0gTlVMTDsKCX0KCglUdXBsZURlc2NGaW5h bGl6ZShyZWxhdGlvbi0+cmRfYXR0KTsKfQoKLyoKICoJCVJlbGF0aW9uQnVpbGRSdWxlTG9j awogKgogKgkJRm9ybSB0aGUgcmVsYXRpb24ncyByZXdyaXRlIHJ1bGVzIGZyb20gaW5mb3Jt YXRpb24gaW4KICoJCXRoZSBwZ19yZXdyaXRlIHN5c3RlbSBjYXRhbG9nLgogKgogKiBOb3Rl OiBUaGUgcnVsZSBwYXJzZXRyZWVzIGFyZSBwb3RlbnRpYWxseSB2ZXJ5IGNvbXBsZXggbm9k ZSBzdHJ1Y3R1cmVzLgogKiBUbyBhbGxvdyB0aGVzZSB0cmVlcyB0byBiZSBmcmVlZCB3aGVu IHRoZSByZWxjYWNoZSBlbnRyeSBpcyBmbHVzaGVkLAogKiB3ZSBtYWtlIGEgcHJpdmF0ZSBt ZW1vcnkgY29udGV4dCB0byBob2xkIHRoZSBSdWxlTG9jayBpbmZvcm1hdGlvbiBmb3IKICog ZWFjaCByZWxjYWNoZSBlbnRyeSB0aGF0IGhhcyBhc3NvY2lhdGVkIHJ1bGVzLiAgVGhlIGNv bnRleHQgaXMgdXNlZAogKiBqdXN0IGZvciBydWxlIGluZm8sIG5vdCBmb3IgYW55IG90aGVy IHN1YnNpZGlhcnkgZGF0YSBvZiB0aGUgcmVsY2FjaGUKICogZW50cnksIGJlY2F1c2UgdGhh dCBrZWVwcyB0aGUgdXBkYXRlIGxvZ2ljIGluIFJlbGF0aW9uUmVidWlsZFJlbGF0aW9uKCkK ICogbWFuYWdlYWJsZS4gIFRoZSBvdGhlciBzdWJzaWRpYXJ5IGRhdGEgc3RydWN0dXJlcyBh cmUgc2ltcGxlIGVub3VnaAogKiB0byBiZSBlYXN5IHRvIGZyZWUgZXhwbGljaXRseSwgYW55 d2F5LgogKgogKiBOb3RlOiBUaGUgcmVsYXRpb24ncyByZWxvcHRpb25zIG11c3QgaGF2ZSBi ZWVuIGV4dHJhY3RlZCBmaXJzdC4KICovCnN0YXRpYyB2b2lkClJlbGF0aW9uQnVpbGRSdWxl TG9jayhSZWxhdGlvbiByZWxhdGlvbikKewoJTWVtb3J5Q29udGV4dCBydWxlc2N4dDsKCU1l bW9yeUNvbnRleHQgb2xkY3h0OwoJSGVhcFR1cGxlCXJld3JpdGVfdHVwbGU7CglSZWxhdGlv bglyZXdyaXRlX2Rlc2M7CglUdXBsZURlc2MJcmV3cml0ZV90dXBkZXNjOwoJU3lzU2NhbkRl c2MgcmV3cml0ZV9zY2FuOwoJU2NhbktleURhdGEga2V5OwoJUnVsZUxvY2sgICAqcnVsZWxv Y2s7CglpbnQJCQludW1sb2NrczsKCVJld3JpdGVSdWxlICoqcnVsZXM7CglpbnQJCQltYXhs b2NrczsKCgkvKgoJICogTWFrZSB0aGUgcHJpdmF0ZSBjb250ZXh0LiAgQXNzdW1lIGl0J2xs IG5vdCBjb250YWluIG11Y2ggZGF0YS4KCSAqLwoJcnVsZXNjeHQgPSBBbGxvY1NldENvbnRl eHRDcmVhdGUoQ2FjaGVNZW1vcnlDb250ZXh0LAoJCQkJCQkJCQkgInJlbGF0aW9uIHJ1bGVz IiwKCQkJCQkJCQkJIEFMTE9DU0VUX1NNQUxMX1NJWkVTKTsKCXJlbGF0aW9uLT5yZF9ydWxl c2N4dCA9IHJ1bGVzY3h0OwoJTWVtb3J5Q29udGV4dENvcHlBbmRTZXRJZGVudGlmaWVyKHJ1 bGVzY3h0LAoJCQkJCQkJCQkgIFJlbGF0aW9uR2V0UmVsYXRpb25OYW1lKHJlbGF0aW9uKSk7 CgoJLyoKCSAqIGFsbG9jYXRlIGFuIGFycmF5IHRvIGhvbGQgdGhlIHJld3JpdGUgcnVsZXMg KHRoZSBhcnJheSBpcyBleHRlbmRlZCBpZgoJICogbmVjZXNzYXJ5KQoJICovCgltYXhsb2Nr cyA9IDQ7CglydWxlcyA9IChSZXdyaXRlUnVsZSAqKikKCQlNZW1vcnlDb250ZXh0QWxsb2Mo cnVsZXNjeHQsIHNpemVvZihSZXdyaXRlUnVsZSAqKSAqIG1heGxvY2tzKTsKCW51bWxvY2tz ID0gMDsKCgkvKgoJICogZm9ybSBhIHNjYW4ga2V5CgkgKi8KCVNjYW5LZXlJbml0KCZrZXks CgkJCQlBbnVtX3BnX3Jld3JpdGVfZXZfY2xhc3MsCgkJCQlCVEVxdWFsU3RyYXRlZ3lOdW1i ZXIsIEZfT0lERVEsCgkJCQlPYmplY3RJZEdldERhdHVtKFJlbGF0aW9uR2V0UmVsaWQocmVs YXRpb24pKSk7CgoJLyoKCSAqIG9wZW4gcGdfcmV3cml0ZSBhbmQgYmVnaW4gYSBzY2FuCgkg KgoJICogTm90ZTogc2luY2Ugd2Ugc2NhbiB0aGUgcnVsZXMgdXNpbmcgUmV3cml0ZVJlbFJ1 bGVuYW1lSW5kZXhJZCwgd2Ugd2lsbAoJICogYmUgcmVhZGluZyB0aGUgcnVsZXMgaW4gbmFt ZSBvcmRlciwgZXhjZXB0IHBvc3NpYmx5IGR1cmluZwoJICogZW1lcmdlbmN5LXJlY292ZXJ5 IG9wZXJhdGlvbnMgKGllLCBJZ25vcmVTeXN0ZW1JbmRleGVzKS4gVGhpcyBpbiB0dXJuCgkg KiBlbnN1cmVzIHRoYXQgcnVsZXMgd2lsbCBiZSBmaXJlZCBpbiBuYW1lIG9yZGVyLgoJICov CglyZXdyaXRlX2Rlc2MgPSB0YWJsZV9vcGVuKFJld3JpdGVSZWxhdGlvbklkLCBBY2Nlc3NT aGFyZUxvY2spOwoJcmV3cml0ZV90dXBkZXNjID0gUmVsYXRpb25HZXREZXNjcihyZXdyaXRl X2Rlc2MpOwoJcmV3cml0ZV9zY2FuID0gc3lzdGFibGVfYmVnaW5zY2FuKHJld3JpdGVfZGVz YywKCQkJCQkJCQkJICBSZXdyaXRlUmVsUnVsZW5hbWVJbmRleElkLAoJCQkJCQkJCQkgIHRy dWUsIE5VTEwsCgkJCQkJCQkJCSAgMSwgJmtleSk7CgoJd2hpbGUgKEhlYXBUdXBsZUlzVmFs aWQocmV3cml0ZV90dXBsZSA9IHN5c3RhYmxlX2dldG5leHQocmV3cml0ZV9zY2FuKSkpCgl7 CgkJRm9ybV9wZ19yZXdyaXRlIHJld3JpdGVfZm9ybSA9IChGb3JtX3BnX3Jld3JpdGUpIEdF VFNUUlVDVChyZXdyaXRlX3R1cGxlKTsKCQlib29sCQlpc251bGw7CgkJRGF0dW0JCXJ1bGVf ZGF0dW07CgkJY2hhcgkgICAqcnVsZV9zdHI7CgkJUmV3cml0ZVJ1bGUgKnJ1bGU7CgkJT2lk CQkJY2hlY2tfYXNfdXNlcjsKCgkJcnVsZSA9IChSZXdyaXRlUnVsZSAqKSBNZW1vcnlDb250 ZXh0QWxsb2MocnVsZXNjeHQsCgkJCQkJCQkJCQkJCSAgc2l6ZW9mKFJld3JpdGVSdWxlKSk7 CgoJCXJ1bGUtPnJ1bGVJZCA9IHJld3JpdGVfZm9ybS0+b2lkOwoKCQlydWxlLT5ldmVudCA9 IHJld3JpdGVfZm9ybS0+ZXZfdHlwZSAtICcwJzsKCQlydWxlLT5lbmFibGVkID0gcmV3cml0 ZV9mb3JtLT5ldl9lbmFibGVkOwoJCXJ1bGUtPmlzSW5zdGVhZCA9IHJld3JpdGVfZm9ybS0+ aXNfaW5zdGVhZDsKCgkJLyoKCQkgKiBNdXN0IHVzZSBoZWFwX2dldGF0dHIgdG8gZmV0Y2gg ZXZfYWN0aW9uIGFuZCBldl9xdWFsLiAgQWxzbywgdGhlCgkJICogcnVsZSBzdHJpbmdzIGFy ZSBvZnRlbiBsYXJnZSBlbm91Z2ggdG8gYmUgdG9hc3RlZC4gIFRvIGF2b2lkCgkJICogbGVh a2luZyBtZW1vcnkgaW4gdGhlIGNhbGxlcidzIGNvbnRleHQsIGRvIHRoZSBkZXRvYXN0aW5n IGhlcmUgc28KCQkgKiB3ZSBjYW4gZnJlZSB0aGUgZGV0b2FzdGVkIHZlcnNpb24uCgkJICov CgkJcnVsZV9kYXR1bSA9IGhlYXBfZ2V0YXR0cihyZXdyaXRlX3R1cGxlLAoJCQkJCQkJCSAg QW51bV9wZ19yZXdyaXRlX2V2X2FjdGlvbiwKCQkJCQkJCQkgIHJld3JpdGVfdHVwZGVzYywK CQkJCQkJCQkgICZpc251bGwpOwoJCUFzc2VydCghaXNudWxsKTsKCQlydWxlX3N0ciA9IFRl eHREYXR1bUdldENTdHJpbmcocnVsZV9kYXR1bSk7CgkJb2xkY3h0ID0gTWVtb3J5Q29udGV4 dFN3aXRjaFRvKHJ1bGVzY3h0KTsKCQlydWxlLT5hY3Rpb25zID0gKExpc3QgKikgc3RyaW5n VG9Ob2RlKHJ1bGVfc3RyKTsKCQlNZW1vcnlDb250ZXh0U3dpdGNoVG8ob2xkY3h0KTsKCQlw ZnJlZShydWxlX3N0cik7CgoJCXJ1bGVfZGF0dW0gPSBoZWFwX2dldGF0dHIocmV3cml0ZV90 dXBsZSwKCQkJCQkJCQkgIEFudW1fcGdfcmV3cml0ZV9ldl9xdWFsLAoJCQkJCQkJCSAgcmV3 cml0ZV90dXBkZXNjLAoJCQkJCQkJCSAgJmlzbnVsbCk7CgkJQXNzZXJ0KCFpc251bGwpOwoJ CXJ1bGVfc3RyID0gVGV4dERhdHVtR2V0Q1N0cmluZyhydWxlX2RhdHVtKTsKCQlvbGRjeHQg PSBNZW1vcnlDb250ZXh0U3dpdGNoVG8ocnVsZXNjeHQpOwoJCXJ1bGUtPnF1YWwgPSAoTm9k ZSAqKSBzdHJpbmdUb05vZGUocnVsZV9zdHIpOwoJCU1lbW9yeUNvbnRleHRTd2l0Y2hUbyhv bGRjeHQpOwoJCXBmcmVlKHJ1bGVfc3RyKTsKCgkJLyoKCQkgKiBJZiB0aGlzIGlzIGEgU0VM RUNUIHJ1bGUgZGVmaW5pbmcgYSB2aWV3LCBhbmQgdGhlIHZpZXcgaGFzCgkJICogInNlY3Vy aXR5X2ludm9rZXIiIHNldCwgd2UgbXVzdCBwZXJmb3JtIGFsbCBwZXJtaXNzaW9ucyBjaGVj a3Mgb24KCQkgKiByZWxhdGlvbnMgcmVmZXJyZWQgdG8gYnkgdGhlIHJ1bGUgYXMgdGhlIGlu dm9raW5nIHVzZXIuCgkJICoKCQkgKiBJbiBhbGwgb3RoZXIgY2FzZXMgKGluY2x1ZGluZyBu b24tU0VMRUNUIHJ1bGVzIG9uIHNlY3VyaXR5IGludm9rZXIKCQkgKiB2aWV3cyksIHBlcmZv cm0gdGhlIHBlcm1pc3Npb25zIGNoZWNrcyBhcyB0aGUgcmVsYXRpb24gb3duZXIuCgkJICov CgkJaWYgKHJ1bGUtPmV2ZW50ID09IENNRF9TRUxFQ1QgJiYKCQkJcmVsYXRpb24tPnJkX3Jl bC0+cmVsa2luZCA9PSBSRUxLSU5EX1ZJRVcgJiYKCQkJUmVsYXRpb25IYXNTZWN1cml0eUlu dm9rZXIocmVsYXRpb24pKQoJCQljaGVja19hc191c2VyID0gSW52YWxpZE9pZDsKCQllbHNl CgkJCWNoZWNrX2FzX3VzZXIgPSByZWxhdGlvbi0+cmRfcmVsLT5yZWxvd25lcjsKCgkJLyoK CQkgKiBTY2FuIHRocm91Z2ggdGhlIHJ1bGUncyBhY3Rpb25zIGFuZCBzZXQgdGhlIGNoZWNr QXNVc2VyIGZpZWxkIG9uCgkJICogYWxsIFJURVBlcm1pc3Npb25JbmZvcy4gV2UgaGF2ZSB0 byBsb29rIGF0IHRoZSBxdWFsIGFzIHdlbGwsIGluCgkJICogY2FzZSBpdCBjb250YWlucyBz dWJsaW5rcy4KCQkgKgoJCSAqIFRoZSByZWFzb24gZm9yIGRvaW5nIHRoaXMgd2hlbiB0aGUg cnVsZSBpcyBsb2FkZWQsIHJhdGhlciB0aGFuIHdoZW4KCQkgKiBpdCBpcyBzdG9yZWQsIGlz IHRoYXQgb3RoZXJ3aXNlIEFMVEVSIFRBQkxFIE9XTkVSIHdvdWxkIGhhdmUgdG8KCQkgKiBn cm92ZWwgdGhyb3VnaCBzdG9yZWQgcnVsZXMgdG8gdXBkYXRlIGNoZWNrQXNVc2VyIGZpZWxk cy4gU2Nhbm5pbmcKCQkgKiB0aGUgcnVsZSB0cmVlIGR1cmluZyBsb2FkIGlzIHJlbGF0aXZl bHkgY2hlYXAgKGNvbXBhcmVkIHRvCgkJICogY29uc3RydWN0aW5nIGl0IGluIHRoZSBmaXJz dCBwbGFjZSksIHNvIHdlIGRvIGl0IGhlcmUuCgkJICovCgkJc2V0UnVsZUNoZWNrQXNVc2Vy KChOb2RlICopIHJ1bGUtPmFjdGlvbnMsIGNoZWNrX2FzX3VzZXIpOwoJCXNldFJ1bGVDaGVj a0FzVXNlcihydWxlLT5xdWFsLCBjaGVja19hc191c2VyKTsKCgkJaWYgKG51bWxvY2tzID49 IG1heGxvY2tzKQoJCXsKCQkJbWF4bG9ja3MgKj0gMjsKCQkJcnVsZXMgPSAoUmV3cml0ZVJ1 bGUgKiopCgkJCQlyZXBhbGxvYyhydWxlcywgc2l6ZW9mKFJld3JpdGVSdWxlICopICogbWF4 bG9ja3MpOwoJCX0KCQlydWxlc1tudW1sb2NrcysrXSA9IHJ1bGU7Cgl9CgoJLyoKCSAqIGVu ZCB0aGUgc2NhbiBhbmQgY2xvc2UgdGhlIGF0dHJpYnV0ZSByZWxhdGlvbgoJICovCglzeXN0 YWJsZV9lbmRzY2FuKHJld3JpdGVfc2Nhbik7Cgl0YWJsZV9jbG9zZShyZXdyaXRlX2Rlc2Ms IEFjY2Vzc1NoYXJlTG9jayk7CgoJLyoKCSAqIHRoZXJlIG1pZ2h0IG5vdCBiZSBhbnkgcnVs ZXMgKGlmIHJlbGhhc3J1bGVzIGlzIG91dC1vZi1kYXRlKQoJICovCglpZiAobnVtbG9ja3Mg PT0gMCkKCXsKCQlyZWxhdGlvbi0+cmRfcnVsZXMgPSBOVUxMOwoJCXJlbGF0aW9uLT5yZF9y dWxlc2N4dCA9IE5VTEw7CgkJTWVtb3J5Q29udGV4dERlbGV0ZShydWxlc2N4dCk7CgkJcmV0 dXJuOwoJfQoKCS8qCgkgKiBmb3JtIGEgUnVsZUxvY2sgYW5kIGluc2VydCBpbnRvIHJlbGF0 aW9uCgkgKi8KCXJ1bGVsb2NrID0gKFJ1bGVMb2NrICopIE1lbW9yeUNvbnRleHRBbGxvYyhy dWxlc2N4dCwgc2l6ZW9mKFJ1bGVMb2NrKSk7CglydWxlbG9jay0+bnVtTG9ja3MgPSBudW1s b2NrczsKCXJ1bGVsb2NrLT5ydWxlcyA9IHJ1bGVzOwoKCXJlbGF0aW9uLT5yZF9ydWxlcyA9 IHJ1bGVsb2NrOwp9CgovKgogKgkJZXF1YWxSdWxlTG9ja3MKICoKICoJCURldGVybWluZSB3 aGV0aGVyIHR3byBSdWxlTG9ja3MgYXJlIGVxdWl2YWxlbnQKICoKICoJCVByb2JhYmx5IHRo aXMgc2hvdWxkIGJlIGluIHRoZSBydWxlcyBjb2RlIHNvbWVwbGFjZS4uLgogKi8Kc3RhdGlj IGJvb2wKZXF1YWxSdWxlTG9ja3MoUnVsZUxvY2sgKnJsb2NrMSwgUnVsZUxvY2sgKnJsb2Nr MikKewoJaW50CQkJaTsKCgkvKgoJICogQXMgb2YgNy4zIHdlIGFzc3VtZSB0aGUgcnVsZSBv cmRlcmluZyBpcyByZXBlYXRhYmxlLCBiZWNhdXNlCgkgKiBSZWxhdGlvbkJ1aWxkUnVsZUxv Y2sgc2hvdWxkIHJlYWQgJ2VtIGluIGEgY29uc2lzdGVudCBvcmRlci4gIFNvIGp1c3QKCSAq IGNvbXBhcmUgY29ycmVzcG9uZGluZyBzbG90cy4KCSAqLwoJaWYgKHJsb2NrMSAhPSBOVUxM KQoJewoJCWlmIChybG9jazIgPT0gTlVMTCkKCQkJcmV0dXJuIGZhbHNlOwoJCWlmIChybG9j azEtPm51bUxvY2tzICE9IHJsb2NrMi0+bnVtTG9ja3MpCgkJCXJldHVybiBmYWxzZTsKCQlm b3IgKGkgPSAwOyBpIDwgcmxvY2sxLT5udW1Mb2NrczsgaSsrKQoJCXsKCQkJUmV3cml0ZVJ1 bGUgKnJ1bGUxID0gcmxvY2sxLT5ydWxlc1tpXTsKCQkJUmV3cml0ZVJ1bGUgKnJ1bGUyID0g cmxvY2syLT5ydWxlc1tpXTsKCgkJCWlmIChydWxlMS0+cnVsZUlkICE9IHJ1bGUyLT5ydWxl SWQpCgkJCQlyZXR1cm4gZmFsc2U7CgkJCWlmIChydWxlMS0+ZXZlbnQgIT0gcnVsZTItPmV2 ZW50KQoJCQkJcmV0dXJuIGZhbHNlOwoJCQlpZiAocnVsZTEtPmVuYWJsZWQgIT0gcnVsZTIt PmVuYWJsZWQpCgkJCQlyZXR1cm4gZmFsc2U7CgkJCWlmIChydWxlMS0+aXNJbnN0ZWFkICE9 IHJ1bGUyLT5pc0luc3RlYWQpCgkJCQlyZXR1cm4gZmFsc2U7CgkJCWlmICghZXF1YWwocnVs ZTEtPnF1YWwsIHJ1bGUyLT5xdWFsKSkKCQkJCXJldHVybiBmYWxzZTsKCQkJaWYgKCFlcXVh bChydWxlMS0+YWN0aW9ucywgcnVsZTItPmFjdGlvbnMpKQoJCQkJcmV0dXJuIGZhbHNlOwoJ CX0KCX0KCWVsc2UgaWYgKHJsb2NrMiAhPSBOVUxMKQoJCXJldHVybiBmYWxzZTsKCXJldHVy biB0cnVlOwp9CgovKgogKgkJZXF1YWxQb2xpY3kKICoKICoJCURldGVybWluZSB3aGV0aGVy IHR3byBwb2xpY2llcyBhcmUgZXF1aXZhbGVudAogKi8Kc3RhdGljIGJvb2wKZXF1YWxQb2xp Y3koUm93U2VjdXJpdHlQb2xpY3kgKnBvbGljeTEsIFJvd1NlY3VyaXR5UG9saWN5ICpwb2xp Y3kyKQp7CglpbnQJCQlpOwoJT2lkCQkgICAqcjEsCgkJCSAgICpyMjsKCglpZiAocG9saWN5 MSAhPSBOVUxMKQoJewoJCWlmIChwb2xpY3kyID09IE5VTEwpCgkJCXJldHVybiBmYWxzZTsK CgkJaWYgKHBvbGljeTEtPnBvbGNtZCAhPSBwb2xpY3kyLT5wb2xjbWQpCgkJCXJldHVybiBm YWxzZTsKCQlpZiAocG9saWN5MS0+aGFzc3VibGlua3MgIT0gcG9saWN5Mi0+aGFzc3VibGlu a3MpCgkJCXJldHVybiBmYWxzZTsKCQlpZiAoc3RyY21wKHBvbGljeTEtPnBvbGljeV9uYW1l LCBwb2xpY3kyLT5wb2xpY3lfbmFtZSkgIT0gMCkKCQkJcmV0dXJuIGZhbHNlOwoJCWlmIChB UlJfRElNUyhwb2xpY3kxLT5yb2xlcylbMF0gIT0gQVJSX0RJTVMocG9saWN5Mi0+cm9sZXMp WzBdKQoJCQlyZXR1cm4gZmFsc2U7CgoJCXIxID0gKE9pZCAqKSBBUlJfREFUQV9QVFIocG9s aWN5MS0+cm9sZXMpOwoJCXIyID0gKE9pZCAqKSBBUlJfREFUQV9QVFIocG9saWN5Mi0+cm9s ZXMpOwoKCQlmb3IgKGkgPSAwOyBpIDwgQVJSX0RJTVMocG9saWN5MS0+cm9sZXMpWzBdOyBp KyspCgkJewoJCQlpZiAocjFbaV0gIT0gcjJbaV0pCgkJCQlyZXR1cm4gZmFsc2U7CgkJfQoK CQlpZiAoIWVxdWFsKHBvbGljeTEtPnF1YWwsIHBvbGljeTItPnF1YWwpKQoJCQlyZXR1cm4g ZmFsc2U7CgkJaWYgKCFlcXVhbChwb2xpY3kxLT53aXRoX2NoZWNrX3F1YWwsIHBvbGljeTIt PndpdGhfY2hlY2tfcXVhbCkpCgkJCXJldHVybiBmYWxzZTsKCX0KCWVsc2UgaWYgKHBvbGlj eTIgIT0gTlVMTCkKCQlyZXR1cm4gZmFsc2U7CgoJcmV0dXJuIHRydWU7Cn0KCi8qCiAqCQll cXVhbFJTRGVzYwogKgogKgkJRGV0ZXJtaW5lIHdoZXRoZXIgdHdvIFJvd1NlY3VyaXR5RGVz YydzIGFyZSBlcXVpdmFsZW50CiAqLwpzdGF0aWMgYm9vbAplcXVhbFJTRGVzYyhSb3dTZWN1 cml0eURlc2MgKnJzZGVzYzEsIFJvd1NlY3VyaXR5RGVzYyAqcnNkZXNjMikKewoJTGlzdENl bGwgICAqbGMsCgkJCSAgICpyYzsKCglpZiAocnNkZXNjMSA9PSBOVUxMICYmIHJzZGVzYzIg PT0gTlVMTCkKCQlyZXR1cm4gdHJ1ZTsKCglpZiAoKHJzZGVzYzEgIT0gTlVMTCAmJiByc2Rl c2MyID09IE5VTEwpIHx8CgkJKHJzZGVzYzEgPT0gTlVMTCAmJiByc2Rlc2MyICE9IE5VTEwp KQoJCXJldHVybiBmYWxzZTsKCglpZiAobGlzdF9sZW5ndGgocnNkZXNjMS0+cG9saWNpZXMp ICE9IGxpc3RfbGVuZ3RoKHJzZGVzYzItPnBvbGljaWVzKSkKCQlyZXR1cm4gZmFsc2U7CgoJ LyogUmVsYXRpb25CdWlsZFJvd1NlY3VyaXR5IHNob3VsZCBidWlsZCBwb2xpY2llcyBpbiBv cmRlciAqLwoJZm9yYm90aChsYywgcnNkZXNjMS0+cG9saWNpZXMsIHJjLCByc2Rlc2MyLT5w b2xpY2llcykKCXsKCQlSb3dTZWN1cml0eVBvbGljeSAqbCA9IChSb3dTZWN1cml0eVBvbGlj eSAqKSBsZmlyc3QobGMpOwoJCVJvd1NlY3VyaXR5UG9saWN5ICpyID0gKFJvd1NlY3VyaXR5 UG9saWN5ICopIGxmaXJzdChyYyk7CgoJCWlmICghZXF1YWxQb2xpY3kobCwgcikpCgkJCXJl dHVybiBmYWxzZTsKCX0KCglyZXR1cm4gdHJ1ZTsKfQoKLyoKICoJCVJlbGF0aW9uQnVpbGRE ZXNjCiAqCiAqCQlCdWlsZCBhIHJlbGF0aW9uIGRlc2NyaXB0b3IuICBUaGUgY2FsbGVyIG11 c3QgaG9sZCBhdCBsZWFzdAogKgkJQWNjZXNzU2hhcmVMb2NrIG9uIHRoZSB0YXJnZXQgcmVs aWQuCiAqCiAqCQlUaGUgbmV3IGRlc2NyaXB0b3IgaXMgaW5zZXJ0ZWQgaW50byB0aGUgaGFz aCB0YWJsZSBpZiBpbnNlcnRJdCBpcyB0cnVlLgogKgogKgkJUmV0dXJucyBOVUxMIGlmIG5v IHBnX2NsYXNzIHJvdyBjb3VsZCBiZSBmb3VuZCBmb3IgdGhlIGdpdmVuIHJlbGlkCiAqCQko c3VnZ2VzdGluZyB3ZSBhcmUgdHJ5aW5nIHRvIGFjY2VzcyBhIGp1c3QtZGVsZXRlZCByZWxh dGlvbikuCiAqCQlBbnkgb3RoZXIgZXJyb3IgaXMgcmVwb3J0ZWQgdmlhIGVsb2cuCiAqLwpz dGF0aWMgUmVsYXRpb24KUmVsYXRpb25CdWlsZERlc2MoT2lkIHRhcmdldFJlbElkLCBib29s IGluc2VydEl0KQp7CglpbnQJCQlpbl9wcm9ncmVzc19vZmZzZXQ7CglSZWxhdGlvbglyZWxh dGlvbjsKCU9pZAkJCXJlbGlkOwoJSGVhcFR1cGxlCXBnX2NsYXNzX3R1cGxlOwoJRm9ybV9w Z19jbGFzcyByZWxwOwoKCS8qCgkgKiBUaGlzIGZ1bmN0aW9uIGFuZCBpdHMgc3Vicm91dGlu ZXMgY2FuIGFsbG9jYXRlIGEgZ29vZCBkZWFsIG9mIHRyYW5zaWVudAoJICogZGF0YSBpbiBD dXJyZW50TWVtb3J5Q29udGV4dC4gIFRyYWRpdGlvbmFsbHkgd2UndmUganVzdCBsZWFrZWQg dGhhdAoJICogZGF0YSwgcmVhc29uaW5nIHRoYXQgdGhlIGNhbGxlcidzIGNvbnRleHQgaXMg YXQgd29yc3Qgb2YgdHJhbnNhY3Rpb24KCSAqIHNjb3BlLCBhbmQgcmVsY2FjaGUgbG9hZHMg c2hvdWxkbid0IGhhcHBlbiBzbyBvZnRlbiB0aGF0IGl0J3MgZXNzZW50aWFsCgkgKiB0byBy ZWNvdmVyIHRyYW5zaWVudCBkYXRhIGJlZm9yZSBlbmQgb2Ygc3RhdGVtZW50L3RyYW5zYWN0 aW9uLiAgSG93ZXZlcgoJICogdGhhdCdzIGRlZmluaXRlbHkgbm90IHRydWUgd2hlbiBkZWJ1 Z19kaXNjYXJkX2NhY2hlcyBpcyBhY3RpdmUsIGFuZAoJICogcGVyaGFwcyBpdCdzIG5vdCB0 cnVlIGluIG90aGVyIGNhc2VzLgoJICoKCSAqIFdoZW4gZGVidWdfZGlzY2FyZF9jYWNoZXMg aXMgYWN0aXZlIG9yIHdoZW4gZm9yY2VkIHRvIGJ5CgkgKiBSRUNPVkVSX1JFTEFUSU9OX0JV SUxEX01FTU9SWT0xLCBhcnJhbmdlIHRvIGFsbG9jYXRlIHRoZSBqdW5rIGluIGEKCSAqIHRl bXBvcmFyeSBjb250ZXh0IHRoYXQgd2UnbGwgZnJlZSBiZWZvcmUgcmV0dXJuaW5nLiAgTWFr ZSBpdCBhIGNoaWxkIG9mCgkgKiBjYWxsZXIncyBjb250ZXh0IHNvIHRoYXQgaXQgd2lsbCBn ZXQgY2xlYW5lZCB1cCBhcHByb3ByaWF0ZWx5IGlmIHdlCgkgKiBlcnJvciBvdXQgcGFydHdh eSB0aHJvdWdoLgoJICovCiNpZmRlZiBNQVlCRV9SRUNPVkVSX1JFTEFUSU9OX0JVSUxEX01F TU9SWQoJTWVtb3J5Q29udGV4dCB0bXBjeHQgPSBOVUxMOwoJTWVtb3J5Q29udGV4dCBvbGRj eHQgPSBOVUxMOwoKCWlmIChSRUNPVkVSX1JFTEFUSU9OX0JVSUxEX01FTU9SWSB8fCBkZWJ1 Z19kaXNjYXJkX2NhY2hlcyA+IDApCgl7CgkJdG1wY3h0ID0gQWxsb2NTZXRDb250ZXh0Q3Jl YXRlKEN1cnJlbnRNZW1vcnlDb250ZXh0LAoJCQkJCQkJCQkgICAiUmVsYXRpb25CdWlsZERl c2Mgd29ya3NwYWNlIiwKCQkJCQkJCQkJICAgQUxMT0NTRVRfREVGQVVMVF9TSVpFUyk7CgkJ b2xkY3h0ID0gTWVtb3J5Q29udGV4dFN3aXRjaFRvKHRtcGN4dCk7Cgl9CiNlbmRpZgoKCS8q IFJlZ2lzdGVyIHRvIGNhdGNoIGludmFsaWRhdGlvbiBtZXNzYWdlcyAqLwoJaWYgKGluX3By b2dyZXNzX2xpc3RfbGVuID49IGluX3Byb2dyZXNzX2xpc3RfbWF4bGVuKQoJewoJCWludAkJ CWFsbG9jc2l6ZTsKCgkJYWxsb2NzaXplID0gaW5fcHJvZ3Jlc3NfbGlzdF9tYXhsZW4gKiAy OwoJCWluX3Byb2dyZXNzX2xpc3QgPSByZXBhbGxvYyhpbl9wcm9ncmVzc19saXN0LAoJCQkJ CQkJCQlhbGxvY3NpemUgKiBzaXplb2YoKmluX3Byb2dyZXNzX2xpc3QpKTsKCQlpbl9wcm9n cmVzc19saXN0X21heGxlbiA9IGFsbG9jc2l6ZTsKCX0KCWluX3Byb2dyZXNzX29mZnNldCA9 IGluX3Byb2dyZXNzX2xpc3RfbGVuKys7Cglpbl9wcm9ncmVzc19saXN0W2luX3Byb2dyZXNz X29mZnNldF0ucmVsb2lkID0gdGFyZ2V0UmVsSWQ7CnJldHJ5OgoJaW5fcHJvZ3Jlc3NfbGlz dFtpbl9wcm9ncmVzc19vZmZzZXRdLmludmFsaWRhdGVkID0gZmFsc2U7CgoJLyoKCSAqIGZp bmQgdGhlIHR1cGxlIGluIHBnX2NsYXNzIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmVuIHJl bGF0aW9uIGlkCgkgKi8KCXBnX2NsYXNzX3R1cGxlID0gU2NhblBnUmVsYXRpb24odGFyZ2V0 UmVsSWQsIHRydWUsIGZhbHNlKTsKCgkvKgoJICogaWYgbm8gc3VjaCB0dXBsZSBleGlzdHMs IHJldHVybiBOVUxMCgkgKi8KCWlmICghSGVhcFR1cGxlSXNWYWxpZChwZ19jbGFzc190dXBs ZSkpCgl7CiNpZmRlZiBNQVlCRV9SRUNPVkVSX1JFTEFUSU9OX0JVSUxEX01FTU9SWQoJCWlm ICh0bXBjeHQpCgkJewoJCQkvKiBSZXR1cm4gdG8gY2FsbGVyJ3MgY29udGV4dCwgYW5kIGJs b3cgYXdheSB0aGUgdGVtcG9yYXJ5IGNvbnRleHQgKi8KCQkJTWVtb3J5Q29udGV4dFN3aXRj aFRvKG9sZGN4dCk7CgkJCU1lbW9yeUNvbnRleHREZWxldGUodG1wY3h0KTsKCQl9CiNlbmRp ZgoJCUFzc2VydChpbl9wcm9ncmVzc19vZmZzZXQgKyAxID09IGluX3Byb2dyZXNzX2xpc3Rf bGVuKTsKCQlpbl9wcm9ncmVzc19saXN0X2xlbi0tOwoJCXJldHVybiBOVUxMOwoJfQoKCS8q CgkgKiBnZXQgaW5mb3JtYXRpb24gZnJvbSB0aGUgcGdfY2xhc3NfdHVwbGUKCSAqLwoJcmVs cCA9IChGb3JtX3BnX2NsYXNzKSBHRVRTVFJVQ1QocGdfY2xhc3NfdHVwbGUpOwoJcmVsaWQg PSByZWxwLT5vaWQ7CglBc3NlcnQocmVsaWQgPT0gdGFyZ2V0UmVsSWQpOwoKCS8qCgkgKiBh bGxvY2F0ZSBzdG9yYWdlIGZvciB0aGUgcmVsYXRpb24gZGVzY3JpcHRvciwgYW5kIGNvcHkg cGdfY2xhc3NfdHVwbGUKCSAqIHRvIHJlbGF0aW9uLT5yZF9yZWwuCgkgKi8KCXJlbGF0aW9u ID0gQWxsb2NhdGVSZWxhdGlvbkRlc2MocmVscCk7CgoJLyoKCSAqIGluaXRpYWxpemUgdGhl IHJlbGF0aW9uJ3MgcmVsYXRpb24gaWQgKHJlbGF0aW9uLT5yZF9pZCkKCSAqLwoJUmVsYXRp b25HZXRSZWxpZChyZWxhdGlvbikgPSByZWxpZDsKCgkvKgoJICogTm9ybWFsIHJlbGF0aW9u cyBhcmUgbm90IG5haWxlZCBpbnRvIHRoZSBjYWNoZS4gIFNpbmNlIHdlIGRvbid0IGZsdXNo CgkgKiBuZXcgcmVsYXRpb25zLCBpdCB3b24ndCBiZSBuZXcuICBJdCBjb3VsZCBiZSB0ZW1w IHRob3VnaC4KCSAqLwoJcmVsYXRpb24tPnJkX3JlZmNudCA9IDA7CglyZWxhdGlvbi0+cmRf aXNuYWlsZWQgPSBmYWxzZTsKCXJlbGF0aW9uLT5yZF9jcmVhdGVTdWJpZCA9IEludmFsaWRT dWJUcmFuc2FjdGlvbklkOwoJcmVsYXRpb24tPnJkX25ld1JlbGZpbGVsb2NhdG9yU3ViaWQg PSBJbnZhbGlkU3ViVHJhbnNhY3Rpb25JZDsKCXJlbGF0aW9uLT5yZF9maXJzdFJlbGZpbGVs b2NhdG9yU3ViaWQgPSBJbnZhbGlkU3ViVHJhbnNhY3Rpb25JZDsKCXJlbGF0aW9uLT5yZF9k cm9wcGVkU3ViaWQgPSBJbnZhbGlkU3ViVHJhbnNhY3Rpb25JZDsKCXN3aXRjaCAocmVsYXRp b24tPnJkX3JlbC0+cmVscGVyc2lzdGVuY2UpCgl7CgkJY2FzZSBSRUxQRVJTSVNURU5DRV9V TkxPR0dFRDoKCQljYXNlIFJFTFBFUlNJU1RFTkNFX1BFUk1BTkVOVDoKCQkJcmVsYXRpb24t PnJkX2JhY2tlbmQgPSBJTlZBTElEX1BST0NfTlVNQkVSOwoJCQlyZWxhdGlvbi0+cmRfaXNs b2NhbHRlbXAgPSBmYWxzZTsKCQkJYnJlYWs7CgkJY2FzZSBSRUxQRVJTSVNURU5DRV9URU1Q OgoJCQlpZiAoaXNUZW1wT3JUZW1wVG9hc3ROYW1lc3BhY2UocmVsYXRpb24tPnJkX3JlbC0+ cmVsbmFtZXNwYWNlKSkKCQkJewoJCQkJcmVsYXRpb24tPnJkX2JhY2tlbmQgPSBQcm9jTnVt YmVyRm9yVGVtcFJlbGF0aW9ucygpOwoJCQkJcmVsYXRpb24tPnJkX2lzbG9jYWx0ZW1wID0g dHJ1ZTsKCQkJfQoJCQllbHNlCgkJCXsKCQkJCS8qCgkJCQkgKiBJZiBpdCdzIGEgdGVtcCB0 YWJsZSwgYnV0IG5vdCBvbmUgb2Ygb3Vycywgd2UgaGF2ZSB0byB1c2UKCQkJCSAqIHRoZSBz bG93LCBncm90dHkgbWV0aG9kIHRvIGZpZ3VyZSBvdXQgdGhlIG93bmluZyBiYWNrZW5kLgoJ CQkJICoKCQkJCSAqIE5vdGU6IGl0J3MgcG9zc2libGUgdGhhdCByZF9iYWNrZW5kIGdldHMg c2V0IHRvCgkJCQkgKiBNeVByb2NOdW1iZXIgaGVyZSwgaW4gY2FzZSB3ZSBhcmUgbG9va2lu ZyBhdCBhIHBnX2NsYXNzCgkJCQkgKiBlbnRyeSBsZWZ0IG92ZXIgZnJvbSBhIGNyYXNoZWQg YmFja2VuZCB0aGF0IGNvaW5jaWRlbnRhbGx5CgkJCQkgKiBoYWQgdGhlIHNhbWUgUHJvY051 bWJlciB3ZSdyZSB1c2luZy4gIFdlIHNob3VsZCAqbm90KgoJCQkJICogY29uc2lkZXIgc3Vj aCBhIHRhYmxlIHRvIGJlICJvdXJzIjsgdGhpcyBpcyB3aHkgd2UgbmVlZCB0aGUKCQkJCSAq IHNlcGFyYXRlIHJkX2lzbG9jYWx0ZW1wIGZsYWcuICBUaGUgcGdfY2xhc3MgZW50cnkgd2ls bCBnZXQKCQkJCSAqIGZsdXNoZWQgaWYvd2hlbiB3ZSBjbGVhbiBvdXQgdGhlIGNvcnJlc3Bv bmRpbmcgdGVtcCB0YWJsZQoJCQkJICogbmFtZXNwYWNlIGluIHByZXBhcmF0aW9uIGZvciB1 c2luZyBpdC4KCQkJCSAqLwoJCQkJcmVsYXRpb24tPnJkX2JhY2tlbmQgPQoJCQkJCUdldFRl bXBOYW1lc3BhY2VQcm9jTnVtYmVyKHJlbGF0aW9uLT5yZF9yZWwtPnJlbG5hbWVzcGFjZSk7 CgkJCQlBc3NlcnQocmVsYXRpb24tPnJkX2JhY2tlbmQgIT0gSU5WQUxJRF9QUk9DX05VTUJF Uik7CgkJCQlyZWxhdGlvbi0+cmRfaXNsb2NhbHRlbXAgPSBmYWxzZTsKCQkJfQoJCQlicmVh azsKCQlkZWZhdWx0OgoJCQllbG9nKEVSUk9SLCAiaW52YWxpZCByZWxwZXJzaXN0ZW5jZTog JWMiLAoJCQkJIHJlbGF0aW9uLT5yZF9yZWwtPnJlbHBlcnNpc3RlbmNlKTsKCQkJYnJlYWs7 Cgl9CgoJLyoKCSAqIGluaXRpYWxpemUgdGhlIHR1cGxlIGRlc2NyaXB0b3IgKHJlbGF0aW9u LT5yZF9hdHQpLgoJICovCglSZWxhdGlvbkJ1aWxkVHVwbGVEZXNjKHJlbGF0aW9uKTsKCgkv KiBmb3JlaWduIGtleSBkYXRhIGlzIG5vdCBsb2FkZWQgdGlsbCBhc2tlZCBmb3IgKi8KCXJl bGF0aW9uLT5yZF9ma2V5bGlzdCA9IE5JTDsKCXJlbGF0aW9uLT5yZF9ma2V5dmFsaWQgPSBm YWxzZTsKCgkvKiBwYXJ0aXRpb25pbmcgZGF0YSBpcyBub3QgbG9hZGVkIHRpbGwgYXNrZWQg Zm9yICovCglyZWxhdGlvbi0+cmRfcGFydGtleSA9IE5VTEw7CglyZWxhdGlvbi0+cmRfcGFy dGtleWN4dCA9IE5VTEw7CglyZWxhdGlvbi0+cmRfcGFydGRlc2MgPSBOVUxMOwoJcmVsYXRp b24tPnJkX3BhcnRkZXNjX25vZGV0YWNoZWQgPSBOVUxMOwoJcmVsYXRpb24tPnJkX3BhcnRk ZXNjX25vZGV0YWNoZWRfeG1pbiA9IEludmFsaWRUcmFuc2FjdGlvbklkOwoJcmVsYXRpb24t PnJkX3BkY3h0ID0gTlVMTDsKCXJlbGF0aW9uLT5yZF9wZGRjeHQgPSBOVUxMOwoJcmVsYXRp b24tPnJkX3BhcnRjaGVjayA9IE5JTDsKCXJlbGF0aW9uLT5yZF9wYXJ0Y2hlY2t2YWxpZCA9 IGZhbHNlOwoJcmVsYXRpb24tPnJkX3BhcnRjaGVja2N4dCA9IE5VTEw7CgoJLyoKCSAqIGlu aXRpYWxpemUgYWNjZXNzIG1ldGhvZCBpbmZvcm1hdGlvbgoJICovCglpZiAocmVsYXRpb24t PnJkX3JlbC0+cmVsa2luZCA9PSBSRUxLSU5EX0lOREVYIHx8CgkJcmVsYXRpb24tPnJkX3Jl bC0+cmVsa2luZCA9PSBSRUxLSU5EX1BBUlRJVElPTkVEX0lOREVYKQoJCVJlbGF0aW9uSW5p dEluZGV4QWNjZXNzSW5mbyhyZWxhdGlvbik7CgllbHNlIGlmIChSRUxLSU5EX0hBU19UQUJM RV9BTShyZWxhdGlvbi0+cmRfcmVsLT5yZWxraW5kKSB8fAoJCQkgcmVsYXRpb24tPnJkX3Jl bC0+cmVsa2luZCA9PSBSRUxLSU5EX1NFUVVFTkNFKQoJCVJlbGF0aW9uSW5pdFRhYmxlQWNj ZXNzTWV0aG9kKHJlbGF0aW9uKTsKCWVsc2UgaWYgKHJlbGF0aW9uLT5yZF9yZWwtPnJlbGtp bmQgPT0gUkVMS0lORF9QQVJUSVRJT05FRF9UQUJMRSkKCXsKCQkvKgoJCSAqIERvIG5vdGhp bmc6IGFjY2VzcyBtZXRob2RzIGFyZSBhIHNldHRpbmcgdGhhdCBwYXJ0aXRpb25zIGNhbgoJ CSAqIGluaGVyaXQuCgkJICovCgl9CgllbHNlCgkJQXNzZXJ0KHJlbGF0aW9uLT5yZF9yZWwt PnJlbGFtID09IEludmFsaWRPaWQpOwoKCS8qIGV4dHJhY3QgcmVsb3B0aW9ucyBpZiBhbnkg Ki8KCVJlbGF0aW9uUGFyc2VSZWxPcHRpb25zKHJlbGF0aW9uLCBwZ19jbGFzc190dXBsZSk7 CgoJLyoKCSAqIEZldGNoIHJ1bGVzIGFuZCB0cmlnZ2VycyB0aGF0IGFmZmVjdCB0aGlzIHJl bGF0aW9uLgoJICoKCSAqIE5vdGUgdGhhdCBSZWxhdGlvbkJ1aWxkUnVsZUxvY2soKSByZWxp ZXMgb24gdGhpcyBiZWluZyBkb25lIGFmdGVyCgkgKiBleHRyYWN0aW5nIHRoZSByZWxhdGlv bidzIHJlbG9wdGlvbnMuCgkgKi8KCWlmIChyZWxhdGlvbi0+cmRfcmVsLT5yZWxoYXNydWxl cykKCQlSZWxhdGlvbkJ1aWxkUnVsZUxvY2socmVsYXRpb24pOwoJZWxzZQoJewoJCXJlbGF0 aW9uLT5yZF9ydWxlcyA9IE5VTEw7CgkJcmVsYXRpb24tPnJkX3J1bGVzY3h0ID0gTlVMTDsK CX0KCglpZiAocmVsYXRpb24tPnJkX3JlbC0+cmVsaGFzdHJpZ2dlcnMpCgkJUmVsYXRpb25C dWlsZFRyaWdnZXJzKHJlbGF0aW9uKTsKCWVsc2UKCQlyZWxhdGlvbi0+dHJpZ2Rlc2MgPSBO VUxMOwoKCWlmIChyZWxhdGlvbi0+cmRfcmVsLT5yZWxyb3dzZWN1cml0eSkKCQlSZWxhdGlv bkJ1aWxkUm93U2VjdXJpdHkocmVsYXRpb24pOwoJZWxzZQoJCXJlbGF0aW9uLT5yZF9yc2Rl c2MgPSBOVUxMOwoKCS8qCgkgKiBpbml0aWFsaXplIHRoZSByZWxhdGlvbiBsb2NrIG1hbmFn ZXIgaW5mb3JtYXRpb24KCSAqLwoJUmVsYXRpb25Jbml0TG9ja0luZm8ocmVsYXRpb24pOyAv KiBzZWUgbG1nci5jICovCgoJLyoKCSAqIGluaXRpYWxpemUgcGh5c2ljYWwgYWRkcmVzc2lu ZyBpbmZvcm1hdGlvbiBmb3IgdGhlIHJlbGF0aW9uCgkgKi8KCVJlbGF0aW9uSW5pdFBoeXNp Y2FsQWRkcihyZWxhdGlvbik7CgoJLyogbWFrZSBzdXJlIHJlbGF0aW9uIGlzIG1hcmtlZCBh cyBoYXZpbmcgbm8gb3BlbiBmaWxlIHlldCAqLwoJcmVsYXRpb24tPnJkX3NtZ3IgPSBOVUxM OwoKCS8qCgkgKiBub3cgd2UgY2FuIGZyZWUgdGhlIG1lbW9yeSBhbGxvY2F0ZWQgZm9yIHBn X2NsYXNzX3R1cGxlCgkgKi8KCWhlYXBfZnJlZXR1cGxlKHBnX2NsYXNzX3R1cGxlKTsKCgkv KgoJICogSWYgYW4gaW52YWxpZGF0aW9uIGFycml2ZWQgbWlkLWJ1aWxkLCBzdGFydCBvdmVy LiAgQmV0d2VlbiBoZXJlIGFuZCB0aGUKCSAqIGVuZCBvZiB0aGlzIGZ1bmN0aW9uLCBkb24n dCBhZGQgY29kZSB0aGF0IGRvZXMgb3IgcmVhc29uYWJseSBjb3VsZCByZWFkCgkgKiBzeXN0 ZW0gY2F0YWxvZ3MuICBUaGF0IHJhbmdlIG11c3QgYmUgZnJlZSBmcm9tIGludmFsaWRhdGlv biBwcm9jZXNzaW5nCgkgKiBmb3IgdGhlICFpbnNlcnRJdCBjYXNlLiAgRm9yIHRoZSBpbnNl cnRJdCBjYXNlLCBSZWxhdGlvbkNhY2hlSW5zZXJ0KCkKCSAqIHdpbGwgZW5yb2xsIHRoaXMg cmVsYXRpb24gaW4gb3JkaW5hcnkgcmVsY2FjaGUgaW52YWxpZGF0aW9uIHByb2Nlc3Npbmcs CgkgKi8KCWlmIChpbl9wcm9ncmVzc19saXN0W2luX3Byb2dyZXNzX29mZnNldF0uaW52YWxp ZGF0ZWQpCgl7CgkJUmVsYXRpb25EZXN0cm95UmVsYXRpb24ocmVsYXRpb24sIGZhbHNlKTsK CQlnb3RvIHJldHJ5OwoJfQoJQXNzZXJ0KGluX3Byb2dyZXNzX29mZnNldCArIDEgPT0gaW5f cHJvZ3Jlc3NfbGlzdF9sZW4pOwoJaW5fcHJvZ3Jlc3NfbGlzdF9sZW4tLTsKCgkvKgoJICog SW5zZXJ0IG5ld2x5IGNyZWF0ZWQgcmVsYXRpb24gaW50byByZWxjYWNoZSBoYXNoIHRhYmxl LCBpZiByZXF1ZXN0ZWQuCgkgKgoJICogVGhlcmUgaXMgb25lIHNjZW5hcmlvIGluIHdoaWNo IHdlIG1pZ2h0IGZpbmQgYSBoYXNodGFibGUgZW50cnkgYWxyZWFkeQoJICogcHJlc2VudCwg ZXZlbiB0aG91Z2ggb3VyIGNhbGxlciBmYWlsZWQgdG8gZmluZCBpdDogaWYgdGhlIHJlbGF0 aW9uIGlzIGEKCSAqIHN5c3RlbSBjYXRhbG9nIG9yIGluZGV4IHRoYXQncyB1c2VkIGR1cmlu ZyByZWxjYWNoZSBsb2FkLCB3ZSBtaWdodCBoYXZlCgkgKiByZWN1cnNpdmVseSBjcmVhdGVk IHRoZSBzYW1lIHJlbGNhY2hlIGVudHJ5IGR1cmluZyB0aGUgcHJlY2VkaW5nIHN0ZXBzLgoJ ICogU28gYWxsb3cgUmVsYXRpb25DYWNoZUluc2VydCB0byBkZWxldGUgYW55IGFscmVhZHkt cHJlc2VudCByZWxjYWNoZQoJICogZW50cnkgZm9yIHRoZSBzYW1lIE9JRC4gIFRoZSBhbHJl YWR5LXByZXNlbnQgZW50cnkgc2hvdWxkIGhhdmUgcmVmY291bnQKCSAqIHplcm8gKGVsc2Ug c29tZWJvZHkgZm9yZ290IHRvIGNsb3NlIGl0KTsgaW4gdGhlIGV2ZW50IHRoYXQgaXQgZG9l c24ndCwKCSAqIHdlJ2xsIGVsb2cgYSBXQVJOSU5HIGFuZCBsZWFrIHRoZSBhbHJlYWR5LXBy ZXNlbnQgZW50cnkuCgkgKi8KCWlmIChpbnNlcnRJdCkKCQlSZWxhdGlvbkNhY2hlSW5zZXJ0 KHJlbGF0aW9uLCB0cnVlKTsKCgkvKiBJdCdzIGZ1bGx5IHZhbGlkICovCglyZWxhdGlvbi0+ cmRfaXN2YWxpZCA9IHRydWU7CgojaWZkZWYgTUFZQkVfUkVDT1ZFUl9SRUxBVElPTl9CVUlM RF9NRU1PUlkKCWlmICh0bXBjeHQpCgl7CgkJLyogUmV0dXJuIHRvIGNhbGxlcidzIGNvbnRl eHQsIGFuZCBibG93IGF3YXkgdGhlIHRlbXBvcmFyeSBjb250ZXh0ICovCgkJTWVtb3J5Q29u dGV4dFN3aXRjaFRvKG9sZGN4dCk7CgkJTWVtb3J5Q29udGV4dERlbGV0ZSh0bXBjeHQpOwoJ fQojZW5kaWYKCglyZXR1cm4gcmVsYXRpb247Cn0KCi8qCiAqIEluaXRpYWxpemUgdGhlIHBo eXNpY2FsIGFkZHJlc3NpbmcgaW5mbyAoUmVsRmlsZUxvY2F0b3IpIGZvciBhIHJlbGNhY2hl IGVudHJ5CiAqCiAqIE5vdGU6IGF0IHRoZSBwaHlzaWNhbCBsZXZlbCwgcmVsYXRpb25zIGlu IHRoZSBwZ19nbG9iYWwgdGFibGVzcGFjZSBtdXN0CiAqIGJlIHRyZWF0ZWQgYXMgc2hhcmVk LCBldmVuIGlmIHJlbGlzc2hhcmVkIGlzbid0IHNldC4gIEhlbmNlIHdlIGRvIG5vdAogKiBs b29rIGF0IHJlbGlzc2hhcmVkIGhlcmUuCiAqLwpzdGF0aWMgdm9pZApSZWxhdGlvbkluaXRQ aHlzaWNhbEFkZHIoUmVsYXRpb24gcmVsYXRpb24pCnsKCVJlbEZpbGVOdW1iZXIgb2xkbnVt YmVyID0gcmVsYXRpb24tPnJkX2xvY2F0b3IucmVsTnVtYmVyOwoKCS8qIHRoZXNlIHJlbGF0 aW9ucyBraW5kcyBuZXZlciBoYXZlIHN0b3JhZ2UgKi8KCWlmICghUkVMS0lORF9IQVNfU1RP UkFHRShyZWxhdGlvbi0+cmRfcmVsLT5yZWxraW5kKSkKCQlyZXR1cm47CgoJaWYgKHJlbGF0 aW9uLT5yZF9yZWwtPnJlbHRhYmxlc3BhY2UpCgkJcmVsYXRpb24tPnJkX2xvY2F0b3Iuc3Bj T2lkID0gcmVsYXRpb24tPnJkX3JlbC0+cmVsdGFibGVzcGFjZTsKCWVsc2UKCQlyZWxhdGlv bi0+cmRfbG9jYXRvci5zcGNPaWQgPSBNeURhdGFiYXNlVGFibGVTcGFjZTsKCWlmIChyZWxh dGlvbi0+cmRfbG9jYXRvci5zcGNPaWQgPT0gR0xPQkFMVEFCTEVTUEFDRV9PSUQpCgkJcmVs YXRpb24tPnJkX2xvY2F0b3IuZGJPaWQgPSBJbnZhbGlkT2lkOwoJZWxzZQoJCXJlbGF0aW9u LT5yZF9sb2NhdG9yLmRiT2lkID0gTXlEYXRhYmFzZUlkOwoKCWlmIChyZWxhdGlvbi0+cmRf cmVsLT5yZWxmaWxlbm9kZSkKCXsKCQkvKgoJCSAqIEV2ZW4gaWYgd2UgYXJlIHVzaW5nIGEg ZGVjb2Rpbmcgc25hcHNob3QgdGhhdCBkb2Vzbid0IHJlcHJlc2VudCB0aGUKCQkgKiBjdXJy ZW50IHN0YXRlIG9mIHRoZSBjYXRhbG9nIHdlIG5lZWQgdG8gbWFrZSBzdXJlIHRoZSBmaWxl bm9kZQoJCSAqIHBvaW50cyB0byB0aGUgY3VycmVudCBmaWxlIHNpbmNlIHRoZSBvbGRlciBm aWxlIHdpbGwgYmUgZ29uZSAob3IKCQkgKiB0cnVuY2F0ZWQpLiBUaGUgbmV3IGZpbGUgd2ls bCBzdGlsbCBjb250YWluIG9sZGVyIHJvd3Mgc28gbG9va3VwcwoJCSAqIGluIHRoZW0gd2ls bCB3b3JrIGNvcnJlY3RseS4gVGhpcyB3b3VsZG4ndCB3b3JrIGNvcnJlY3RseSBpZgoJCSAq IHJld3JpdGVzIHdlcmUgYWxsb3dlZCB0byBjaGFuZ2UgdGhlIHNjaGVtYSBpbiBhbiBpbmNv bXBhdGlibGUgd2F5LAoJCSAqIGJ1dCB0aG9zZSBhcmUgcHJldmVudGVkIGJvdGggb24gY2F0 YWxvZyB0YWJsZXMgYW5kIG9uIHVzZXIgdGFibGVzCgkJICogZGVjbGFyZWQgYXMgYWRkaXRp b25hbCBjYXRhbG9nIHRhYmxlcy4KCQkgKi8KCQlpZiAoSGlzdG9yaWNTbmFwc2hvdEFjdGl2 ZSgpCgkJCSYmIFJlbGF0aW9uSXNBY2Nlc3NpYmxlSW5Mb2dpY2FsRGVjb2RpbmcocmVsYXRp b24pCgkJCSYmIElzVHJhbnNhY3Rpb25TdGF0ZSgpKQoJCXsKCQkJSGVhcFR1cGxlCXBoeXNf dHVwbGU7CgkJCUZvcm1fcGdfY2xhc3MgcGh5c3JlbDsKCgkJCXBoeXNfdHVwbGUgPSBTY2Fu UGdSZWxhdGlvbihSZWxhdGlvbkdldFJlbGlkKHJlbGF0aW9uKSwKCQkJCQkJCQkJCVJlbGF0 aW9uR2V0UmVsaWQocmVsYXRpb24pICE9IENsYXNzT2lkSW5kZXhJZCwKCQkJCQkJCQkJCXRy dWUpOwoJCQlpZiAoIUhlYXBUdXBsZUlzVmFsaWQocGh5c190dXBsZSkpCgkJCQllbG9nKEVS Uk9SLCAiY291bGQgbm90IGZpbmQgcGdfY2xhc3MgZW50cnkgZm9yICV1IiwKCQkJCQkgUmVs YXRpb25HZXRSZWxpZChyZWxhdGlvbikpOwoJCQlwaHlzcmVsID0gKEZvcm1fcGdfY2xhc3Mp IEdFVFNUUlVDVChwaHlzX3R1cGxlKTsKCgkJCXJlbGF0aW9uLT5yZF9yZWwtPnJlbHRhYmxl c3BhY2UgPSBwaHlzcmVsLT5yZWx0YWJsZXNwYWNlOwoJCQlyZWxhdGlvbi0+cmRfcmVsLT5y ZWxmaWxlbm9kZSA9IHBoeXNyZWwtPnJlbGZpbGVub2RlOwoJCQloZWFwX2ZyZWV0dXBsZShw aHlzX3R1cGxlKTsKCQl9CgoJCXJlbGF0aW9uLT5yZF9sb2NhdG9yLnJlbE51bWJlciA9IHJl bGF0aW9uLT5yZF9yZWwtPnJlbGZpbGVub2RlOwoJfQoJZWxzZQoJewoJCS8qIENvbnN1bHQg dGhlIHJlbGF0aW9uIG1hcHBlciAqLwoJCXJlbGF0aW9uLT5yZF9sb2NhdG9yLnJlbE51bWJl ciA9CgkJCVJlbGF0aW9uTWFwT2lkVG9GaWxlbnVtYmVyKHJlbGF0aW9uLT5yZF9pZCwKCQkJ CQkJCQkJICAgcmVsYXRpb24tPnJkX3JlbC0+cmVsaXNzaGFyZWQpOwoJCWlmICghUmVsRmls ZU51bWJlcklzVmFsaWQocmVsYXRpb24tPnJkX2xvY2F0b3IucmVsTnVtYmVyKSkKCQkJZWxv ZyhFUlJPUiwgImNvdWxkIG5vdCBmaW5kIHJlbGF0aW9uIG1hcHBpbmcgZm9yIHJlbGF0aW9u IFwiJXNcIiwgT0lEICV1IiwKCQkJCSBSZWxhdGlvbkdldFJlbGF0aW9uTmFtZShyZWxhdGlv biksIHJlbGF0aW9uLT5yZF9pZCk7Cgl9CgoJLyoKCSAqIEZvciBSZWxhdGlvbk5lZWRzV0FM KCkgdG8gYW5zd2VyIGNvcnJlY3RseSBvbiBwYXJhbGxlbCB3b3JrZXJzLCByZXN0b3JlCgkg KiByZF9maXJzdFJlbGZpbGVsb2NhdG9yU3ViaWQuICBObyBzdWJ0cmFuc2FjdGlvbnMgc3Rh cnQgb3IgZW5kIHdoaWxlIGluCgkgKiBwYXJhbGxlbCBtb2RlLCBzbyB0aGUgc3BlY2lmaWMg U3ViVHJhbnNhY3Rpb25JZCBkb2VzIG5vdCBtYXR0ZXIuCgkgKi8KCWlmIChJc1BhcmFsbGVs V29ya2VyKCkgJiYgb2xkbnVtYmVyICE9IHJlbGF0aW9uLT5yZF9sb2NhdG9yLnJlbE51bWJl cikKCXsKCQlpZiAoUmVsRmlsZUxvY2F0b3JTa2lwcGluZ1dBTChyZWxhdGlvbi0+cmRfbG9j YXRvcikpCgkJCXJlbGF0aW9uLT5yZF9maXJzdFJlbGZpbGVsb2NhdG9yU3ViaWQgPSBUb3BT dWJUcmFuc2FjdGlvbklkOwoJCWVsc2UKCQkJcmVsYXRpb24tPnJkX2ZpcnN0UmVsZmlsZWxv Y2F0b3JTdWJpZCA9IEludmFsaWRTdWJUcmFuc2FjdGlvbklkOwoJfQp9CgovKgogKiBGaWxs IGluIHRoZSBJbmRleEFtUm91dGluZSBmb3IgYW4gaW5kZXggcmVsYXRpb24uCiAqCiAqIHJl bGF0aW9uJ3MgcmRfYW1oYW5kbGVyIGFuZCByZF9pbmRleGN4dCBtdXN0IGJlIHZhbGlkIGFs cmVhZHkuCiAqLwpzdGF0aWMgdm9pZApJbml0SW5kZXhBbVJvdXRpbmUoUmVsYXRpb24gcmVs YXRpb24pCnsKCU1lbW9yeUNvbnRleHQgb2xkY3R4OwoKCS8qCgkgKiBXZSBmb3JtZXJseSBz cGVjaWZpZWQgdGhhdCB0aGUgYW1oYW5kbGVyIHNob3VsZCByZXR1cm4gYSBwYWxsb2MnZAoJ ICogc3RydWN0LiAgVGhhdCdzIG5vdyBkZXByZWNhdGVkIGluIGZhdm9yIG9mIHJldHVybmlu ZyBhIHBvaW50ZXIgdG8gYQoJICogc3RhdGljIHN0cnVjdCwgYnV0IHRvIGF2b2lkIGNvbXBs ZXRlbHkgYnJlYWtpbmcgb2xkIGV4dGVybmFsIEFNcywgcnVuCgkgKiB0aGUgYW1oYW5kbGVy IGluIHRoZSByZWxhdGlvbidzIHJkX2luZGV4Y3h0LgoJICovCglvbGRjdHggPSBNZW1vcnlD b250ZXh0U3dpdGNoVG8ocmVsYXRpb24tPnJkX2luZGV4Y3h0KTsKCXJlbGF0aW9uLT5yZF9p bmRhbSA9IEdldEluZGV4QW1Sb3V0aW5lKHJlbGF0aW9uLT5yZF9hbWhhbmRsZXIpOwoJTWVt b3J5Q29udGV4dFN3aXRjaFRvKG9sZGN0eCk7Cn0KCi8qCiAqIEluaXRpYWxpemUgaW5kZXgt YWNjZXNzLW1ldGhvZCBzdXBwb3J0IGRhdGEgZm9yIGFuIGluZGV4IHJlbGF0aW9uCiAqLwp2 b2lkClJlbGF0aW9uSW5pdEluZGV4QWNjZXNzSW5mbyhSZWxhdGlvbiByZWxhdGlvbikKewoJ SGVhcFR1cGxlCXR1cGxlOwoJRm9ybV9wZ19hbQlhZm9ybTsKCURhdHVtCQlpbmRjb2xsRGF0 dW07CglEYXR1bQkJaW5kY2xhc3NEYXR1bTsKCURhdHVtCQlpbmRvcHRpb25EYXR1bTsKCWJv b2wJCWlzbnVsbDsKCW9pZHZlY3RvciAgKmluZGNvbGw7CglvaWR2ZWN0b3IgICppbmRjbGFz czsKCWludDJ2ZWN0b3IgKmluZG9wdGlvbjsKCU1lbW9yeUNvbnRleHQgaW5kZXhjeHQ7CglN ZW1vcnlDb250ZXh0IG9sZGNvbnRleHQ7CglpbnQJCQlpbmRuYXR0czsKCWludAkJCWluZG5r ZXlhdHRzOwoJdWludDE2CQlhbXN1cHBvcnQ7CgoJLyoKCSAqIE1ha2UgYSBjb3B5IG9mIHRo ZSBwZ19pbmRleCBlbnRyeSBmb3IgdGhlIGluZGV4LiAgU2luY2UgcGdfaW5kZXgKCSAqIGNv bnRhaW5zIHZhcmlhYmxlLWxlbmd0aCBhbmQgcG9zc2libHktbnVsbCBmaWVsZHMsIHdlIGhh dmUgdG8gZG8gdGhpcwoJICogaG9uZXN0bHkgcmF0aGVyIHRoYW4ganVzdCB0cmVhdGluZyBp dCBhcyBhIEZvcm1fcGdfaW5kZXggc3RydWN0LgoJICovCgl0dXBsZSA9IFNlYXJjaFN5c0Nh Y2hlMShJTkRFWFJFTElELAoJCQkJCQkJT2JqZWN0SWRHZXREYXR1bShSZWxhdGlvbkdldFJl bGlkKHJlbGF0aW9uKSkpOwoJaWYgKCFIZWFwVHVwbGVJc1ZhbGlkKHR1cGxlKSkKCQllbG9n KEVSUk9SLCAiY2FjaGUgbG9va3VwIGZhaWxlZCBmb3IgaW5kZXggJXUiLAoJCQkgUmVsYXRp b25HZXRSZWxpZChyZWxhdGlvbikpOwoJb2xkY29udGV4dCA9IE1lbW9yeUNvbnRleHRTd2l0 Y2hUbyhDYWNoZU1lbW9yeUNvbnRleHQpOwoJcmVsYXRpb24tPnJkX2luZGV4dHVwbGUgPSBo ZWFwX2NvcHl0dXBsZSh0dXBsZSk7CglyZWxhdGlvbi0+cmRfaW5kZXggPSAoRm9ybV9wZ19p bmRleCkgR0VUU1RSVUNUKHJlbGF0aW9uLT5yZF9pbmRleHR1cGxlKTsKCU1lbW9yeUNvbnRl eHRTd2l0Y2hUbyhvbGRjb250ZXh0KTsKCVJlbGVhc2VTeXNDYWNoZSh0dXBsZSk7CgoJLyoK CSAqIExvb2sgdXAgdGhlIGluZGV4J3MgYWNjZXNzIG1ldGhvZCwgc2F2ZSB0aGUgT0lEIG9m IGl0cyBoYW5kbGVyIGZ1bmN0aW9uCgkgKi8KCUFzc2VydChyZWxhdGlvbi0+cmRfcmVsLT5y ZWxhbSAhPSBJbnZhbGlkT2lkKTsKCXR1cGxlID0gU2VhcmNoU3lzQ2FjaGUxKEFNT0lELCBP YmplY3RJZEdldERhdHVtKHJlbGF0aW9uLT5yZF9yZWwtPnJlbGFtKSk7CglpZiAoIUhlYXBU dXBsZUlzVmFsaWQodHVwbGUpKQoJCWVsb2coRVJST1IsICJjYWNoZSBsb29rdXAgZmFpbGVk IGZvciBhY2Nlc3MgbWV0aG9kICV1IiwKCQkJIHJlbGF0aW9uLT5yZF9yZWwtPnJlbGFtKTsK CWFmb3JtID0gKEZvcm1fcGdfYW0pIEdFVFNUUlVDVCh0dXBsZSk7CglyZWxhdGlvbi0+cmRf YW1oYW5kbGVyID0gYWZvcm0tPmFtaGFuZGxlcjsKCVJlbGVhc2VTeXNDYWNoZSh0dXBsZSk7 CgoJaW5kbmF0dHMgPSBSZWxhdGlvbkdldE51bWJlck9mQXR0cmlidXRlcyhyZWxhdGlvbik7 CglpZiAoaW5kbmF0dHMgIT0gSW5kZXhSZWxhdGlvbkdldE51bWJlck9mQXR0cmlidXRlcyhy ZWxhdGlvbikpCgkJZWxvZyhFUlJPUiwgInJlbG5hdHRzIGRpc2FncmVlcyB3aXRoIGluZG5h dHRzIGZvciBpbmRleCAldSIsCgkJCSBSZWxhdGlvbkdldFJlbGlkKHJlbGF0aW9uKSk7Cglp bmRua2V5YXR0cyA9IEluZGV4UmVsYXRpb25HZXROdW1iZXJPZktleUF0dHJpYnV0ZXMocmVs YXRpb24pOwoKCS8qCgkgKiBNYWtlIHRoZSBwcml2YXRlIGNvbnRleHQgdG8gaG9sZCBpbmRl eCBhY2Nlc3MgaW5mby4gIFRoZSByZWFzb24gd2UgbmVlZAoJICogYSBjb250ZXh0LCBhbmQg bm90IGp1c3QgYSBjb3VwbGUgb2YgcGFsbG9jcywgaXMgc28gdGhhdCB3ZSB3b24ndCBsZWFr CgkgKiBhbnkgc3Vic2lkaWFyeSBpbmZvIGF0dGFjaGVkIHRvIGZtZ3IgbG9va3VwIHJlY29y ZHMuCgkgKi8KCWluZGV4Y3h0ID0gQWxsb2NTZXRDb250ZXh0Q3JlYXRlKENhY2hlTWVtb3J5 Q29udGV4dCwKCQkJCQkJCQkJICJpbmRleCBpbmZvIiwKCQkJCQkJCQkJIEFMTE9DU0VUX1NN QUxMX1NJWkVTKTsKCXJlbGF0aW9uLT5yZF9pbmRleGN4dCA9IGluZGV4Y3h0OwoJTWVtb3J5 Q29udGV4dENvcHlBbmRTZXRJZGVudGlmaWVyKGluZGV4Y3h0LAoJCQkJCQkJCQkgIFJlbGF0 aW9uR2V0UmVsYXRpb25OYW1lKHJlbGF0aW9uKSk7CgoJLyoKCSAqIE5vdyB3ZSBjYW4gZmV0 Y2ggdGhlIGluZGV4IEFNJ3MgQVBJIHN0cnVjdAoJICovCglJbml0SW5kZXhBbVJvdXRpbmUo cmVsYXRpb24pOwoKCS8qCgkgKiBBbGxvY2F0ZSBhcnJheXMgdG8gaG9sZCBkYXRhLiBPcGNs YXNzZXMgYXJlIG5vdCB1c2VkIGZvciBpbmNsdWRlZAoJICogY29sdW1ucywgc28gYWxsb2Nh dGUgdGhlbSBmb3IgaW5kbmtleWF0dHMgb25seS4KCSAqLwoJcmVsYXRpb24tPnJkX29wZmFt aWx5ID0gKE9pZCAqKQoJCU1lbW9yeUNvbnRleHRBbGxvY1plcm8oaW5kZXhjeHQsIGluZG5r ZXlhdHRzICogc2l6ZW9mKE9pZCkpOwoJcmVsYXRpb24tPnJkX29wY2ludHlwZSA9IChPaWQg KikKCQlNZW1vcnlDb250ZXh0QWxsb2NaZXJvKGluZGV4Y3h0LCBpbmRua2V5YXR0cyAqIHNp emVvZihPaWQpKTsKCglhbXN1cHBvcnQgPSByZWxhdGlvbi0+cmRfaW5kYW0tPmFtc3VwcG9y dDsKCWlmIChhbXN1cHBvcnQgPiAwKQoJewoJCWludAkJCW5zdXBwb3J0ID0gaW5kbmF0dHMg KiBhbXN1cHBvcnQ7CgoJCXJlbGF0aW9uLT5yZF9zdXBwb3J0ID0gKFJlZ1Byb2NlZHVyZSAq KQoJCQlNZW1vcnlDb250ZXh0QWxsb2NaZXJvKGluZGV4Y3h0LCBuc3VwcG9ydCAqIHNpemVv ZihSZWdQcm9jZWR1cmUpKTsKCQlyZWxhdGlvbi0+cmRfc3VwcG9ydGluZm8gPSAoRm1ncklu Zm8gKikKCQkJTWVtb3J5Q29udGV4dEFsbG9jWmVybyhpbmRleGN4dCwgbnN1cHBvcnQgKiBz aXplb2YoRm1nckluZm8pKTsKCX0KCWVsc2UKCXsKCQlyZWxhdGlvbi0+cmRfc3VwcG9ydCA9 IE5VTEw7CgkJcmVsYXRpb24tPnJkX3N1cHBvcnRpbmZvID0gTlVMTDsKCX0KCglyZWxhdGlv bi0+cmRfaW5kY29sbGF0aW9uID0gKE9pZCAqKQoJCU1lbW9yeUNvbnRleHRBbGxvY1plcm8o aW5kZXhjeHQsIGluZG5rZXlhdHRzICogc2l6ZW9mKE9pZCkpOwoKCXJlbGF0aW9uLT5yZF9p bmRvcHRpb24gPSAoaW50MTYgKikKCQlNZW1vcnlDb250ZXh0QWxsb2NaZXJvKGluZGV4Y3h0 LCBpbmRua2V5YXR0cyAqIHNpemVvZihpbnQxNikpOwoKCS8qCgkgKiBpbmRjb2xsYXRpb24g Y2Fubm90IGJlIHJlZmVyZW5jZWQgZGlyZWN0bHkgdGhyb3VnaCB0aGUgQyBzdHJ1Y3QsCgkg KiBiZWNhdXNlIGl0IGNvbWVzIGFmdGVyIHRoZSB2YXJpYWJsZS13aWR0aCBpbmRrZXkgZmll bGQuICBNdXN0IGV4dHJhY3QKCSAqIHRoZSBkYXR1bSB0aGUgaGFyZCB3YXkuLi4KCSAqLwoJ aW5kY29sbERhdHVtID0gZmFzdGdldGF0dHIocmVsYXRpb24tPnJkX2luZGV4dHVwbGUsCgkJ CQkJCQkgICBBbnVtX3BnX2luZGV4X2luZGNvbGxhdGlvbiwKCQkJCQkJCSAgIEdldFBnSW5k ZXhEZXNjcmlwdG9yKCksCgkJCQkJCQkgICAmaXNudWxsKTsKCUFzc2VydCghaXNudWxsKTsK CWluZGNvbGwgPSAob2lkdmVjdG9yICopIERhdHVtR2V0UG9pbnRlcihpbmRjb2xsRGF0dW0p OwoJbWVtY3B5KHJlbGF0aW9uLT5yZF9pbmRjb2xsYXRpb24sIGluZGNvbGwtPnZhbHVlcywg aW5kbmtleWF0dHMgKiBzaXplb2YoT2lkKSk7CgoJLyoKCSAqIGluZGNsYXNzIGNhbm5vdCBi ZSByZWZlcmVuY2VkIGRpcmVjdGx5IHRocm91Z2ggdGhlIEMgc3RydWN0LCBiZWNhdXNlIGl0 CgkgKiBjb21lcyBhZnRlciB0aGUgdmFyaWFibGUtd2lkdGggaW5ka2V5IGZpZWxkLiAgTXVz dCBleHRyYWN0IHRoZSBkYXR1bQoJICogdGhlIGhhcmQgd2F5Li4uCgkgKi8KCWluZGNsYXNz RGF0dW0gPSBmYXN0Z2V0YXR0cihyZWxhdGlvbi0+cmRfaW5kZXh0dXBsZSwKCQkJCQkJCQlB bnVtX3BnX2luZGV4X2luZGNsYXNzLAoJCQkJCQkJCUdldFBnSW5kZXhEZXNjcmlwdG9yKCks CgkJCQkJCQkJJmlzbnVsbCk7CglBc3NlcnQoIWlzbnVsbCk7CglpbmRjbGFzcyA9IChvaWR2 ZWN0b3IgKikgRGF0dW1HZXRQb2ludGVyKGluZGNsYXNzRGF0dW0pOwoKCS8qCgkgKiBGaWxs IHRoZSBzdXBwb3J0IHByb2NlZHVyZSBPSUQgYXJyYXksIGFzIHdlbGwgYXMgdGhlIGluZm8g YWJvdXQKCSAqIG9wZmFtaWxpZXMgYW5kIG9wY2xhc3MgaW5wdXQgdHlwZXMuICAoYW1pbmZv IGFuZCBzdXBwb3J0aW5mbyBhcmUgbGVmdAoJICogYXMgemVyb2VzLCBhbmQgYXJlIGZpbGxl ZCBvbi10aGUtZmx5IHdoZW4gdXNlZCkKCSAqLwoJSW5kZXhTdXBwb3J0SW5pdGlhbGl6ZShp bmRjbGFzcywgcmVsYXRpb24tPnJkX3N1cHBvcnQsCgkJCQkJCSAgIHJlbGF0aW9uLT5yZF9v cGZhbWlseSwgcmVsYXRpb24tPnJkX29wY2ludHlwZSwKCQkJCQkJICAgYW1zdXBwb3J0LCBp bmRua2V5YXR0cyk7CgoJLyoKCSAqIFNpbWlsYXJseSBleHRyYWN0IGluZG9wdGlvbiBhbmQg Y29weSBpdCB0byB0aGUgY2FjaGUgZW50cnkKCSAqLwoJaW5kb3B0aW9uRGF0dW0gPSBmYXN0 Z2V0YXR0cihyZWxhdGlvbi0+cmRfaW5kZXh0dXBsZSwKCQkJCQkJCQkgQW51bV9wZ19pbmRl eF9pbmRvcHRpb24sCgkJCQkJCQkJIEdldFBnSW5kZXhEZXNjcmlwdG9yKCksCgkJCQkJCQkJ ICZpc251bGwpOwoJQXNzZXJ0KCFpc251bGwpOwoJaW5kb3B0aW9uID0gKGludDJ2ZWN0b3Ig KikgRGF0dW1HZXRQb2ludGVyKGluZG9wdGlvbkRhdHVtKTsKCW1lbWNweShyZWxhdGlvbi0+ cmRfaW5kb3B0aW9uLCBpbmRvcHRpb24tPnZhbHVlcywgaW5kbmtleWF0dHMgKiBzaXplb2Yo aW50MTYpKTsKCgkodm9pZCkgUmVsYXRpb25HZXRJbmRleEF0dE9wdGlvbnMocmVsYXRpb24s IGZhbHNlKTsKCgkvKgoJICogZXhwcmVzc2lvbnMsIHByZWRpY2F0ZSwgZXhjbHVzaW9uIGNh Y2hlcyB3aWxsIGJlIGZpbGxlZCBsYXRlcgoJICovCglyZWxhdGlvbi0+cmRfaW5kZXhwcnMg PSBOSUw7CglyZWxhdGlvbi0+cmRfaW5kZXhwcnNFeHBhbmQgPSBOSUw7CglyZWxhdGlvbi0+ cmRfaW5kcHJlZCA9IE5JTDsKCXJlbGF0aW9uLT5yZF9pbmRwcmVkRXhwYW5kID0gTklMOwoJ cmVsYXRpb24tPnJkX2V4Y2xvcHMgPSBOVUxMOwoJcmVsYXRpb24tPnJkX2V4Y2xwcm9jcyA9 IE5VTEw7CglyZWxhdGlvbi0+cmRfZXhjbHN0cmF0cyA9IE5VTEw7CglyZWxhdGlvbi0+cmRf YW1jYWNoZSA9IE5VTEw7Cn0KCi8qCiAqIEluZGV4U3VwcG9ydEluaXRpYWxpemUKICoJCUlu aXRpYWxpemVzIGFuIGluZGV4J3MgY2FjaGVkIG9wY2xhc3MgaW5mb3JtYXRpb24sCiAqCQln aXZlbiB0aGUgaW5kZXgncyBwZ19pbmRleC5pbmRjbGFzcyBlbnRyeS4KICoKICogRGF0YSBp cyByZXR1cm5lZCBpbnRvICppbmRleFN1cHBvcnQsICpvcEZhbWlseSwgYW5kICpvcGNJblR5 cGUsCiAqIHdoaWNoIGFyZSBhcnJheXMgYWxsb2NhdGVkIGJ5IHRoZSBjYWxsZXIuCiAqCiAq IFRoZSBjYWxsZXIgYWxzbyBwYXNzZXMgbWF4U3VwcG9ydE51bWJlciBhbmQgbWF4QXR0cmli dXRlTnVtYmVyLCBzaW5jZSB0aGVzZQogKiBpbmRpY2F0ZSB0aGUgc2l6ZSBvZiB0aGUgYXJy YXlzIGl0IGhhcyBhbGxvY2F0ZWQgLS0tIGJ1dCBpbiBwcmFjdGljZSB0aGVzZQogKiBudW1i ZXJzIG11c3QgYWx3YXlzIG1hdGNoIHRob3NlIG9idGFpbmFibGUgZnJvbSB0aGUgc3lzdGVt IGNhdGFsb2cgZW50cmllcwogKiBmb3IgdGhlIGluZGV4IGFuZCBhY2Nlc3MgbWV0aG9kLgog Ki8Kc3RhdGljIHZvaWQKSW5kZXhTdXBwb3J0SW5pdGlhbGl6ZShvaWR2ZWN0b3IgKmluZGNs YXNzLAoJCQkJCSAgIFJlZ1Byb2NlZHVyZSAqaW5kZXhTdXBwb3J0LAoJCQkJCSAgIE9pZCAq b3BGYW1pbHksCgkJCQkJICAgT2lkICpvcGNJblR5cGUsCgkJCQkJICAgU3RyYXRlZ3lOdW1i ZXIgbWF4U3VwcG9ydE51bWJlciwKCQkJCQkgICBBdHRyTnVtYmVyIG1heEF0dHJpYnV0ZU51 bWJlcikKewoJaW50CQkJYXR0SW5kZXg7CgoJZm9yIChhdHRJbmRleCA9IDA7IGF0dEluZGV4 IDwgbWF4QXR0cmlidXRlTnVtYmVyOyBhdHRJbmRleCsrKQoJewoJCU9wQ2xhc3NDYWNoZUVu dCAqb3BjZW50cnk7CgoJCWlmICghT2lkSXNWYWxpZChpbmRjbGFzcy0+dmFsdWVzW2F0dElu ZGV4XSkpCgkJCWVsb2coRVJST1IsICJib2d1cyBwZ19pbmRleCB0dXBsZSIpOwoKCQkvKiBs b29rIHVwIHRoZSBpbmZvIGZvciB0aGlzIG9wY2xhc3MsIHVzaW5nIGEgY2FjaGUgKi8KCQlv cGNlbnRyeSA9IExvb2t1cE9wY2xhc3NJbmZvKGluZGNsYXNzLT52YWx1ZXNbYXR0SW5kZXhd LAoJCQkJCQkJCQkgbWF4U3VwcG9ydE51bWJlcik7CgoJCS8qIGNvcHkgY2FjaGVkIGRhdGEg aW50byByZWxjYWNoZSBlbnRyeSAqLwoJCW9wRmFtaWx5W2F0dEluZGV4XSA9IG9wY2VudHJ5 LT5vcGNmYW1pbHk7CgkJb3BjSW5UeXBlW2F0dEluZGV4XSA9IG9wY2VudHJ5LT5vcGNpbnR5 cGU7CgkJaWYgKG1heFN1cHBvcnROdW1iZXIgPiAwKQoJCQltZW1jcHkoJmluZGV4U3VwcG9y dFthdHRJbmRleCAqIG1heFN1cHBvcnROdW1iZXJdLAoJCQkJICAgb3BjZW50cnktPnN1cHBv cnRQcm9jcywKCQkJCSAgIG1heFN1cHBvcnROdW1iZXIgKiBzaXplb2YoUmVnUHJvY2VkdXJl KSk7Cgl9Cn0KCi8qCiAqIExvb2t1cE9wY2xhc3NJbmZvCiAqCiAqIFRoaXMgcm91dGluZSBt YWludGFpbnMgYSBwZXItb3BjbGFzcyBjYWNoZSBvZiB0aGUgaW5mb3JtYXRpb24gbmVlZGVk CiAqIGJ5IEluZGV4U3VwcG9ydEluaXRpYWxpemUoKS4gIFRoaXMgaXMgbW9yZSBlZmZpY2ll bnQgdGhhbiByZWx5aW5nIG9uCiAqIHRoZSBjYXRhbG9nIGNhY2hlLCBiZWNhdXNlIHdlIGNh biBsb2FkIGFsbCB0aGUgaW5mbyBhYm91dCBhIHBhcnRpY3VsYXIKICogb3BjbGFzcyBpbiBh IHNpbmdsZSBpbmRleHNjYW4gb2YgcGdfYW1wcm9jLgogKgogKiBUaGUgaW5mb3JtYXRpb24g ZnJvbSBwZ19hbSBhYm91dCBleHBlY3RlZCByYW5nZSBvZiBzdXBwb3J0IGZ1bmN0aW9uCiAq IG51bWJlcnMgaXMgcGFzc2VkIGluLCByYXRoZXIgdGhhbiBiZWluZyBsb29rZWQgdXAsIG1h aW5seSBiZWNhdXNlIHRoZQogKiBjYWxsZXIgd2lsbCBoYXZlIGl0IGFscmVhZHkuCiAqCiAq IE5vdGUgdGhlcmUgaXMgbm8gcHJvdmlzaW9uIGZvciBmbHVzaGluZyB0aGUgY2FjaGUuICBU aGlzIGlzIE9LIGF0IHRoZQogKiBtb21lbnQgYmVjYXVzZSB0aGVyZSBpcyBubyB3YXkgdG8g QUxURVIgYW55IGludGVyZXN0aW5nIHByb3BlcnRpZXMgb2YgYW4KICogZXhpc3Rpbmcgb3Bj bGFzcyAtLS0gYWxsIHlvdSBjYW4gZG8gaXMgZHJvcCBpdCwgd2hpY2ggd2lsbCByZXN1bHQg aW4KICogYSB1c2VsZXNzIGJ1dCBoYXJtbGVzcyBkZWFkIGVudHJ5IGluIHRoZSBjYWNoZS4g IFRvIHN1cHBvcnQgYWx0ZXJpbmcKICogb3BjbGFzcyBtZW1iZXJzaGlwIChub3QgdGhlIHNh bWUgYXMgb3BmYW1pbHkgbWVtYmVyc2hpcCEpLCB3ZSdkIG5lZWQgdG8KICogYmUgYWJsZSB0 byBmbHVzaCB0aGlzIGNhY2hlIGFzIHdlbGwgYXMgdGhlIGNvbnRlbnRzIG9mIHJlbGNhY2hl IGVudHJpZXMKICogZm9yIGluZGV4ZXMuCiAqLwpzdGF0aWMgT3BDbGFzc0NhY2hlRW50ICoK TG9va3VwT3BjbGFzc0luZm8oT2lkIG9wZXJhdG9yQ2xhc3NPaWQsCgkJCQkgIFN0cmF0ZWd5 TnVtYmVyIG51bVN1cHBvcnQpCnsKCU9wQ2xhc3NDYWNoZUVudCAqb3BjZW50cnk7Cglib29s CQlmb3VuZDsKCVJlbGF0aW9uCXJlbDsKCVN5c1NjYW5EZXNjIHNjYW47CglTY2FuS2V5RGF0 YSBza2V5WzNdOwoJSGVhcFR1cGxlCWh0dXA7Cglib29sCQlpbmRleE9LOwoKCWlmIChPcENs YXNzQ2FjaGUgPT0gTlVMTCkKCXsKCQkvKiBGaXJzdCB0aW1lIHRocm91Z2g6IGluaXRpYWxp emUgdGhlIG9wY2xhc3MgY2FjaGUgKi8KCQlIQVNIQ1RMCQljdGw7CgoJCS8qIEFsc28gbWFr ZSBzdXJlIENhY2hlTWVtb3J5Q29udGV4dCBleGlzdHMgKi8KCQlpZiAoIUNhY2hlTWVtb3J5 Q29udGV4dCkKCQkJQ3JlYXRlQ2FjaGVNZW1vcnlDb250ZXh0KCk7CgoJCWN0bC5rZXlzaXpl ID0gc2l6ZW9mKE9pZCk7CgkJY3RsLmVudHJ5c2l6ZSA9IHNpemVvZihPcENsYXNzQ2FjaGVF bnQpOwoJCU9wQ2xhc3NDYWNoZSA9IGhhc2hfY3JlYXRlKCJPcGVyYXRvciBjbGFzcyBjYWNo ZSIsIDY0LAoJCQkJCQkJCSAgICZjdGwsIEhBU0hfRUxFTSB8IEhBU0hfQkxPQlMpOwoJfQoK CW9wY2VudHJ5ID0gKE9wQ2xhc3NDYWNoZUVudCAqKSBoYXNoX3NlYXJjaChPcENsYXNzQ2Fj aGUsCgkJCQkJCQkJCQkJICAgJm9wZXJhdG9yQ2xhc3NPaWQsCgkJCQkJCQkJCQkJICAgSEFT SF9FTlRFUiwgJmZvdW5kKTsKCglpZiAoIWZvdW5kKQoJewoJCS8qIEluaXRpYWxpemUgbmV3 IGVudHJ5ICovCgkJb3BjZW50cnktPnZhbGlkID0gZmFsc2U7CS8qIHVudGlsIGtub3duIE9L ICovCgkJb3BjZW50cnktPm51bVN1cHBvcnQgPSBudW1TdXBwb3J0OwoJCW9wY2VudHJ5LT5z dXBwb3J0UHJvY3MgPSBOVUxMOwkvKiBmaWxsZWQgYmVsb3cgKi8KCX0KCWVsc2UKCXsKCQlB c3NlcnQobnVtU3VwcG9ydCA9PSBvcGNlbnRyeS0+bnVtU3VwcG9ydCk7Cgl9CgoJLyoKCSAq IFdoZW4gYWdncmVzc2l2ZWx5IHRlc3RpbmcgY2FjaGUtZmx1c2ggaGF6YXJkcywgd2UgZGlz YWJsZSB0aGUgb3BlcmF0b3IKCSAqIGNsYXNzIGNhY2hlIGFuZCBmb3JjZSByZWxvYWRpbmcg b2YgdGhlIGluZm8gb24gZWFjaCBjYWxsLiAgVGhpcyBtb2RlbHMKCSAqIG5vIHJlYWwtd29y bGQgYmVoYXZpb3IsIHNpbmNlIHRoZSBjYWNoZSBlbnRyaWVzIGFyZSBuZXZlciBpbnZhbGlk YXRlZAoJICogb3RoZXJ3aXNlLiAgSG93ZXZlciBpdCBjYW4gYmUgaGVscGZ1bCBmb3IgZGV0 ZWN0aW5nIGJ1Z3MgaW4gdGhlIGNhY2hlCgkgKiBsb2FkaW5nIGxvZ2ljIGl0c2VsZiwgc3Vj aCBhcyByZWxpYW5jZSBvbiBhIG5vbi1uYWlsZWQgaW5kZXguICBHaXZlbgoJICogdGhlIGxp bWl0ZWQgdXNlLWNhc2UgYW5kIHRoZSBmYWN0IHRoYXQgdGhpcyBhZGRzIGEgZ3JlYXQgZGVh bCBvZgoJICogZXhwZW5zZSwgd2UgZW5hYmxlIGl0IG9ubHkgZm9yIGhpZ2ggdmFsdWVzIG9m IGRlYnVnX2Rpc2NhcmRfY2FjaGVzLgoJICovCiNpZmRlZiBESVNDQVJEX0NBQ0hFU19FTkFC TEVECglpZiAoZGVidWdfZGlzY2FyZF9jYWNoZXMgPiAyKQoJCW9wY2VudHJ5LT52YWxpZCA9 IGZhbHNlOwojZW5kaWYKCglpZiAob3BjZW50cnktPnZhbGlkKQoJCXJldHVybiBvcGNlbnRy eTsKCgkvKgoJICogTmVlZCB0byBmaWxsIGluIG5ldyBlbnRyeS4gIEZpcnN0IGFsbG9jYXRl IHNwYWNlLCB1bmxlc3Mgd2UgYWxyZWFkeSBkaWQKCSAqIHNvIGluIHNvbWUgcHJldmlvdXMg YXR0ZW1wdC4KCSAqLwoJaWYgKG9wY2VudHJ5LT5zdXBwb3J0UHJvY3MgPT0gTlVMTCAmJiBu dW1TdXBwb3J0ID4gMCkKCQlvcGNlbnRyeS0+c3VwcG9ydFByb2NzID0gKFJlZ1Byb2NlZHVy ZSAqKQoJCQlNZW1vcnlDb250ZXh0QWxsb2NaZXJvKENhY2hlTWVtb3J5Q29udGV4dCwKCQkJ CQkJCQkgICBudW1TdXBwb3J0ICogc2l6ZW9mKFJlZ1Byb2NlZHVyZSkpOwoKCS8qCgkgKiBU byBhdm9pZCBpbmZpbml0ZSByZWN1cnNpb24gZHVyaW5nIHN0YXJ0dXAsIGZvcmNlIGhlYXAg c2NhbnMgaWYgd2UncmUKCSAqIGxvb2tpbmcgdXAgaW5mbyBmb3IgdGhlIG9wY2xhc3NlcyB1 c2VkIGJ5IHRoZSBpbmRleGVzIHdlIHdvdWxkIGxpa2UgdG8KCSAqIHJlZmVyZW5jZSBoZXJl LgoJICovCglpbmRleE9LID0gY3JpdGljYWxSZWxjYWNoZXNCdWlsdCB8fAoJCShvcGVyYXRv ckNsYXNzT2lkICE9IE9JRF9CVFJFRV9PUFNfT0lEICYmCgkJIG9wZXJhdG9yQ2xhc3NPaWQg IT0gSU5UMl9CVFJFRV9PUFNfT0lEKTsKCgkvKgoJICogV2UgaGF2ZSB0byBmZXRjaCB0aGUg cGdfb3BjbGFzcyByb3cgdG8gZGV0ZXJtaW5lIGl0cyBvcGZhbWlseSBhbmQKCSAqIG9wY2lu dHlwZSwgd2hpY2ggYXJlIG5lZWRlZCB0byBsb29rIHVwIHJlbGF0ZWQgb3BlcmF0b3JzIGFu ZCBmdW5jdGlvbnMuCgkgKiBJdCdkIGJlIGNvbnZlbmllbnQgdG8gdXNlIHRoZSBzeXNjYWNo ZSBoZXJlLCBidXQgdGhhdCBwcm9iYWJseSBkb2Vzbid0CgkgKiB3b3JrIHdoaWxlIGJvb3Rz dHJhcHBpbmcuCgkgKi8KCVNjYW5LZXlJbml0KCZza2V5WzBdLAoJCQkJQW51bV9wZ19vcGNs YXNzX29pZCwKCQkJCUJURXF1YWxTdHJhdGVneU51bWJlciwgRl9PSURFUSwKCQkJCU9iamVj dElkR2V0RGF0dW0ob3BlcmF0b3JDbGFzc09pZCkpOwoJcmVsID0gdGFibGVfb3BlbihPcGVy YXRvckNsYXNzUmVsYXRpb25JZCwgQWNjZXNzU2hhcmVMb2NrKTsKCXNjYW4gPSBzeXN0YWJs ZV9iZWdpbnNjYW4ocmVsLCBPcGNsYXNzT2lkSW5kZXhJZCwgaW5kZXhPSywKCQkJCQkJCSAg TlVMTCwgMSwgc2tleSk7CgoJaWYgKEhlYXBUdXBsZUlzVmFsaWQoaHR1cCA9IHN5c3RhYmxl X2dldG5leHQoc2NhbikpKQoJewoJCUZvcm1fcGdfb3BjbGFzcyBvcGNsYXNzZm9ybSA9IChG b3JtX3BnX29wY2xhc3MpIEdFVFNUUlVDVChodHVwKTsKCgkJb3BjZW50cnktPm9wY2ZhbWls eSA9IG9wY2xhc3Nmb3JtLT5vcGNmYW1pbHk7CgkJb3BjZW50cnktPm9wY2ludHlwZSA9IG9w Y2xhc3Nmb3JtLT5vcGNpbnR5cGU7Cgl9CgllbHNlCgkJZWxvZyhFUlJPUiwgImNvdWxkIG5v dCBmaW5kIHR1cGxlIGZvciBvcGNsYXNzICV1Iiwgb3BlcmF0b3JDbGFzc09pZCk7CgoJc3lz dGFibGVfZW5kc2NhbihzY2FuKTsKCXRhYmxlX2Nsb3NlKHJlbCwgQWNjZXNzU2hhcmVMb2Nr KTsKCgkvKgoJICogU2NhbiBwZ19hbXByb2MgdG8gb2J0YWluIHN1cHBvcnQgcHJvY3MgZm9y IHRoZSBvcGNsYXNzLiAgV2Ugb25seSBmZXRjaAoJICogdGhlIGRlZmF1bHQgb25lcyAodGhv c2Ugd2l0aCBsZWZ0dHlwZSA9IHJpZ2h0dHlwZSA9IG9wY2ludHlwZSkuCgkgKi8KCWlmIChu dW1TdXBwb3J0ID4gMCkKCXsKCQlTY2FuS2V5SW5pdCgmc2tleVswXSwKCQkJCQlBbnVtX3Bn X2FtcHJvY19hbXByb2NmYW1pbHksCgkJCQkJQlRFcXVhbFN0cmF0ZWd5TnVtYmVyLCBGX09J REVRLAoJCQkJCU9iamVjdElkR2V0RGF0dW0ob3BjZW50cnktPm9wY2ZhbWlseSkpOwoJCVNj YW5LZXlJbml0KCZza2V5WzFdLAoJCQkJCUFudW1fcGdfYW1wcm9jX2FtcHJvY2xlZnR0eXBl LAoJCQkJCUJURXF1YWxTdHJhdGVneU51bWJlciwgRl9PSURFUSwKCQkJCQlPYmplY3RJZEdl dERhdHVtKG9wY2VudHJ5LT5vcGNpbnR5cGUpKTsKCQlTY2FuS2V5SW5pdCgmc2tleVsyXSwK CQkJCQlBbnVtX3BnX2FtcHJvY19hbXByb2NyaWdodHR5cGUsCgkJCQkJQlRFcXVhbFN0cmF0 ZWd5TnVtYmVyLCBGX09JREVRLAoJCQkJCU9iamVjdElkR2V0RGF0dW0ob3BjZW50cnktPm9w Y2ludHlwZSkpOwoJCXJlbCA9IHRhYmxlX29wZW4oQWNjZXNzTWV0aG9kUHJvY2VkdXJlUmVs YXRpb25JZCwgQWNjZXNzU2hhcmVMb2NrKTsKCQlzY2FuID0gc3lzdGFibGVfYmVnaW5zY2Fu KHJlbCwgQWNjZXNzTWV0aG9kUHJvY2VkdXJlSW5kZXhJZCwgaW5kZXhPSywKCQkJCQkJCQkg IE5VTEwsIDMsIHNrZXkpOwoKCQl3aGlsZSAoSGVhcFR1cGxlSXNWYWxpZChodHVwID0gc3lz dGFibGVfZ2V0bmV4dChzY2FuKSkpCgkJewoJCQlGb3JtX3BnX2FtcHJvYyBhbXByb2Nmb3Jt ID0gKEZvcm1fcGdfYW1wcm9jKSBHRVRTVFJVQ1QoaHR1cCk7CgoJCQlpZiAoYW1wcm9jZm9y bS0+YW1wcm9jbnVtIDw9IDAgfHwKCQkJCShTdHJhdGVneU51bWJlcikgYW1wcm9jZm9ybS0+ YW1wcm9jbnVtID4gbnVtU3VwcG9ydCkKCQkJCWVsb2coRVJST1IsICJpbnZhbGlkIGFtcHJv YyBudW1iZXIgJWQgZm9yIG9wY2xhc3MgJXUiLAoJCQkJCSBhbXByb2Nmb3JtLT5hbXByb2Nu dW0sIG9wZXJhdG9yQ2xhc3NPaWQpOwoKCQkJb3BjZW50cnktPnN1cHBvcnRQcm9jc1thbXBy b2Nmb3JtLT5hbXByb2NudW0gLSAxXSA9CgkJCQlhbXByb2Nmb3JtLT5hbXByb2M7CgkJfQoK CQlzeXN0YWJsZV9lbmRzY2FuKHNjYW4pOwoJCXRhYmxlX2Nsb3NlKHJlbCwgQWNjZXNzU2hh cmVMb2NrKTsKCX0KCglvcGNlbnRyeS0+dmFsaWQgPSB0cnVlOwoJcmV0dXJuIG9wY2VudHJ5 Owp9CgovKgogKiBGaWxsIGluIHRoZSBUYWJsZUFtUm91dGluZSBmb3IgYSByZWxhdGlvbgog KgogKiByZWxhdGlvbidzIHJkX2FtaGFuZGxlciBtdXN0IGJlIHZhbGlkIGFscmVhZHkuCiAq LwpzdGF0aWMgdm9pZApJbml0VGFibGVBbVJvdXRpbmUoUmVsYXRpb24gcmVsYXRpb24pCnsK CXJlbGF0aW9uLT5yZF90YWJsZWFtID0gR2V0VGFibGVBbVJvdXRpbmUocmVsYXRpb24tPnJk X2FtaGFuZGxlcik7Cn0KCi8qCiAqIEluaXRpYWxpemUgdGFibGUgYWNjZXNzIG1ldGhvZCBz dXBwb3J0IGZvciBhIHRhYmxlIGxpa2UgcmVsYXRpb24KICovCnZvaWQKUmVsYXRpb25Jbml0 VGFibGVBY2Nlc3NNZXRob2QoUmVsYXRpb24gcmVsYXRpb24pCnsKCUhlYXBUdXBsZQl0dXBs ZTsKCUZvcm1fcGdfYW0JYWZvcm07CgoJaWYgKHJlbGF0aW9uLT5yZF9yZWwtPnJlbGtpbmQg PT0gUkVMS0lORF9TRVFVRU5DRSkKCXsKCQkvKgoJCSAqIFNlcXVlbmNlcyBhcmUgY3VycmVu dGx5IGFjY2Vzc2VkIGxpa2UgaGVhcCB0YWJsZXMsIGJ1dCBpdCBkb2Vzbid0CgkJICogc2Vl bSBwcnVkZW50IHRvIHNob3cgdGhhdCBpbiB0aGUgY2F0YWxvZy4gU28ganVzdCBvdmVyd3Jp dGUgaXQKCQkgKiBoZXJlLgoJCSAqLwoJCUFzc2VydChyZWxhdGlvbi0+cmRfcmVsLT5yZWxh bSA9PSBJbnZhbGlkT2lkKTsKCQlyZWxhdGlvbi0+cmRfYW1oYW5kbGVyID0gRl9IRUFQX1RB QkxFQU1fSEFORExFUjsKCX0KCWVsc2UgaWYgKElzQ2F0YWxvZ1JlbGF0aW9uKHJlbGF0aW9u KSkKCXsKCQkvKgoJCSAqIEF2b2lkIGRvaW5nIGEgc3lzY2FjaGUgbG9va3VwIGZvciBjYXRh bG9nIHRhYmxlcy4KCQkgKi8KCQlBc3NlcnQocmVsYXRpb24tPnJkX3JlbC0+cmVsYW0gPT0g SEVBUF9UQUJMRV9BTV9PSUQpOwoJCXJlbGF0aW9uLT5yZF9hbWhhbmRsZXIgPSBGX0hFQVBf VEFCTEVBTV9IQU5ETEVSOwoJfQoJZWxzZQoJewoJCS8qCgkJICogTG9vayB1cCB0aGUgdGFi bGUgYWNjZXNzIG1ldGhvZCwgc2F2ZSB0aGUgT0lEIG9mIGl0cyBoYW5kbGVyCgkJICogZnVu Y3Rpb24uCgkJICovCgkJQXNzZXJ0KHJlbGF0aW9uLT5yZF9yZWwtPnJlbGFtICE9IEludmFs aWRPaWQpOwoJCXR1cGxlID0gU2VhcmNoU3lzQ2FjaGUxKEFNT0lELAoJCQkJCQkJCU9iamVj dElkR2V0RGF0dW0ocmVsYXRpb24tPnJkX3JlbC0+cmVsYW0pKTsKCQlpZiAoIUhlYXBUdXBs ZUlzVmFsaWQodHVwbGUpKQoJCQllbG9nKEVSUk9SLCAiY2FjaGUgbG9va3VwIGZhaWxlZCBm b3IgYWNjZXNzIG1ldGhvZCAldSIsCgkJCQkgcmVsYXRpb24tPnJkX3JlbC0+cmVsYW0pOwoJ CWFmb3JtID0gKEZvcm1fcGdfYW0pIEdFVFNUUlVDVCh0dXBsZSk7CgkJcmVsYXRpb24tPnJk X2FtaGFuZGxlciA9IGFmb3JtLT5hbWhhbmRsZXI7CgkJUmVsZWFzZVN5c0NhY2hlKHR1cGxl KTsKCX0KCgkvKgoJICogTm93IHdlIGNhbiBmZXRjaCB0aGUgdGFibGUgQU0ncyBBUEkgc3Ry dWN0CgkgKi8KCUluaXRUYWJsZUFtUm91dGluZShyZWxhdGlvbik7Cn0KCi8qCiAqCQlmb3Jt cmRlc2MKICoKICoJCVRoaXMgaXMgYSBzcGVjaWFsIGN1dC1kb3duIHZlcnNpb24gb2YgUmVs YXRpb25CdWlsZERlc2MoKSwKICoJCXVzZWQgd2hpbGUgaW5pdGlhbGl6aW5nIHRoZSByZWxj YWNoZS4KICoJCVRoZSByZWxhdGlvbiBkZXNjcmlwdG9yIGlzIGJ1aWx0IGp1c3QgZnJvbSB0 aGUgc3VwcGxpZWQgcGFyYW1ldGVycywKICoJCXdpdGhvdXQgYWN0dWFsbHkgbG9va2luZyBh dCBhbnkgc3lzdGVtIHRhYmxlIGVudHJpZXMuICBXZSBjaGVhdAogKgkJcXVpdGUgYSBsb3Qg c2luY2Ugd2Ugb25seSBuZWVkIHRvIHdvcmsgZm9yIGEgZmV3IGJhc2ljIHN5c3RlbQogKgkJ Y2F0YWxvZ3MuCiAqCiAqIFRoZSBjYXRhbG9ncyB0aGlzIGlzIHVzZWQgZm9yIGNhbid0IGhh dmUgY29uc3RyYWludHMgKGV4Y2VwdCBhdHRub3RudWxsKSwKICogZGVmYXVsdCB2YWx1ZXMs IHJ1bGVzLCBvciB0cmlnZ2Vycywgc2luY2Ugd2UgZG9uJ3QgY29wZSB3aXRoIGFueSBvZiB0 aGF0LgogKiAoV2VsbCwgYWN0dWFsbHksIHRoaXMgb25seSBtYXR0ZXJzIGZvciBwcm9wZXJ0 aWVzIHRoYXQgbmVlZCB0byBiZSB2YWxpZAogKiBkdXJpbmcgYm9vdHN0cmFwIG9yIGJlZm9y ZSBSZWxhdGlvbkNhY2hlSW5pdGlhbGl6ZVBoYXNlMyBydW5zLCBhbmQgbm9uZSBvZgogKiB0 aGVzZSBwcm9wZXJ0aWVzIG1hdHRlciB0aGVuLi4uKQogKgogKiBOT1RFOiB3ZSBhc3N1bWUg d2UgYXJlIGFscmVhZHkgc3dpdGNoZWQgaW50byBDYWNoZU1lbW9yeUNvbnRleHQuCiAqLwpz dGF0aWMgdm9pZApmb3JtcmRlc2MoY29uc3QgY2hhciAqcmVsYXRpb25OYW1lLCBPaWQgcmVs YXRpb25SZWx0eXBlLAoJCSAgYm9vbCBpc3NoYXJlZCwKCQkgIGludCBuYXR0cywgY29uc3Qg Rm9ybURhdGFfcGdfYXR0cmlidXRlICphdHRycykKewoJUmVsYXRpb24JcmVsYXRpb247Cglp bnQJCQlpOwoJYm9vbAkJaGFzX25vdF9udWxsOwoKCS8qCgkgKiBhbGxvY2F0ZSBuZXcgcmVs YXRpb24gZGVzYywgY2xlYXIgYWxsIGZpZWxkcyBvZiByZWxkZXNjCgkgKi8KCXJlbGF0aW9u ID0gcGFsbG9jMF9vYmplY3QoUmVsYXRpb25EYXRhKTsKCgkvKiBtYWtlIHN1cmUgcmVsYXRp b24gaXMgbWFya2VkIGFzIGhhdmluZyBubyBvcGVuIGZpbGUgeWV0ICovCglyZWxhdGlvbi0+ cmRfc21nciA9IE5VTEw7CgoJLyoKCSAqIGluaXRpYWxpemUgcmVmZXJlbmNlIGNvdW50OiAx IGJlY2F1c2UgaXQgaXMgbmFpbGVkIGluIGNhY2hlCgkgKi8KCXJlbGF0aW9uLT5yZF9yZWZj bnQgPSAxOwoKCS8qCgkgKiBhbGwgZW50cmllcyBidWlsdCB3aXRoIHRoaXMgcm91dGluZSBh cmUgbmFpbGVkLWluLWNhY2hlOyBub25lIGFyZSBmb3IKCSAqIG5ldyBvciB0ZW1wIHJlbGF0 aW9ucy4KCSAqLwoJcmVsYXRpb24tPnJkX2lzbmFpbGVkID0gdHJ1ZTsKCXJlbGF0aW9uLT5y ZF9jcmVhdGVTdWJpZCA9IEludmFsaWRTdWJUcmFuc2FjdGlvbklkOwoJcmVsYXRpb24tPnJk X25ld1JlbGZpbGVsb2NhdG9yU3ViaWQgPSBJbnZhbGlkU3ViVHJhbnNhY3Rpb25JZDsKCXJl bGF0aW9uLT5yZF9maXJzdFJlbGZpbGVsb2NhdG9yU3ViaWQgPSBJbnZhbGlkU3ViVHJhbnNh Y3Rpb25JZDsKCXJlbGF0aW9uLT5yZF9kcm9wcGVkU3ViaWQgPSBJbnZhbGlkU3ViVHJhbnNh Y3Rpb25JZDsKCXJlbGF0aW9uLT5yZF9iYWNrZW5kID0gSU5WQUxJRF9QUk9DX05VTUJFUjsK CXJlbGF0aW9uLT5yZF9pc2xvY2FsdGVtcCA9IGZhbHNlOwoKCS8qCgkgKiBpbml0aWFsaXpl IHJlbGF0aW9uIHR1cGxlIGZvcm0KCSAqCgkgKiBUaGUgZGF0YSB3ZSBpbnNlcnQgaGVyZSBp cyBwcmV0dHkgaW5jb21wbGV0ZS9ib2d1cywgYnV0IGl0J2xsIHNlcnZlIHRvCgkgKiBnZXQg dXMgbGF1bmNoZWQuICBSZWxhdGlvbkNhY2hlSW5pdGlhbGl6ZVBoYXNlMygpIHdpbGwgcmVh ZCB0aGUgcmVhbAoJICogZGF0YSBmcm9tIHBnX2NsYXNzIGFuZCByZXBsYWNlIHdoYXQgd2Un dmUgZG9uZSBoZXJlLiAgTm90ZSBpbgoJICogcGFydGljdWxhciB0aGF0IHJlbG93bmVyIGlz IGxlZnQgYXMgemVybzsgdGhpcyBjdWVzCgkgKiBSZWxhdGlvbkNhY2hlSW5pdGlhbGl6ZVBo YXNlMyB0aGF0IHRoZSByZWFsIGRhdGEgaXNuJ3QgdGhlcmUgeWV0LgoJICovCglyZWxhdGlv bi0+cmRfcmVsID0gKEZvcm1fcGdfY2xhc3MpIHBhbGxvYzAoQ0xBU1NfVFVQTEVfU0laRSk7 CgoJbmFtZXN0cmNweSgmcmVsYXRpb24tPnJkX3JlbC0+cmVsbmFtZSwgcmVsYXRpb25OYW1l KTsKCXJlbGF0aW9uLT5yZF9yZWwtPnJlbG5hbWVzcGFjZSA9IFBHX0NBVEFMT0dfTkFNRVNQ QUNFOwoJcmVsYXRpb24tPnJkX3JlbC0+cmVsdHlwZSA9IHJlbGF0aW9uUmVsdHlwZTsKCgkv KgoJICogSXQncyBpbXBvcnRhbnQgdG8gZGlzdGluZ3Vpc2ggYmV0d2VlbiBzaGFyZWQgYW5k IG5vbi1zaGFyZWQgcmVsYXRpb25zLAoJICogZXZlbiBhdCBib290c3RyYXAgdGltZSwgdG8g bWFrZSBzdXJlIHdlIGtub3cgd2hlcmUgdGhleSBhcmUgc3RvcmVkLgoJICovCglyZWxhdGlv bi0+cmRfcmVsLT5yZWxpc3NoYXJlZCA9IGlzc2hhcmVkOwoJaWYgKGlzc2hhcmVkKQoJCXJl bGF0aW9uLT5yZF9yZWwtPnJlbHRhYmxlc3BhY2UgPSBHTE9CQUxUQUJMRVNQQUNFX09JRDsK CgkvKiBmb3JtcmRlc2MgaXMgdXNlZCBvbmx5IGZvciBwZXJtYW5lbnQgcmVsYXRpb25zICov CglyZWxhdGlvbi0+cmRfcmVsLT5yZWxwZXJzaXN0ZW5jZSA9IFJFTFBFUlNJU1RFTkNFX1BF Uk1BTkVOVDsKCgkvKiAuLi4gYW5kIHRoZXkncmUgYWx3YXlzIHBvcHVsYXRlZCwgdG9vICov CglyZWxhdGlvbi0+cmRfcmVsLT5yZWxpc3BvcHVsYXRlZCA9IHRydWU7CgoJcmVsYXRpb24t PnJkX3JlbC0+cmVscmVwbGlkZW50ID0gUkVQTElDQV9JREVOVElUWV9OT1RISU5HOwoJcmVs YXRpb24tPnJkX3JlbC0+cmVscGFnZXMgPSAwOwoJcmVsYXRpb24tPnJkX3JlbC0+cmVsdHVw bGVzID0gLTE7CglyZWxhdGlvbi0+cmRfcmVsLT5yZWxhbGx2aXNpYmxlID0gMDsKCXJlbGF0 aW9uLT5yZF9yZWwtPnJlbGFsbGZyb3plbiA9IDA7CglyZWxhdGlvbi0+cmRfcmVsLT5yZWxr aW5kID0gUkVMS0lORF9SRUxBVElPTjsKCXJlbGF0aW9uLT5yZF9yZWwtPnJlbG5hdHRzID0g KGludDE2KSBuYXR0czsKCgkvKgoJICogaW5pdGlhbGl6ZSBhdHRyaWJ1dGUgdHVwbGUgZm9y bQoJICoKCSAqIFVubGlrZSB0aGUgY2FzZSB3aXRoIHRoZSByZWxhdGlvbiB0dXBsZSwgdGhp cyBkYXRhIGhhZCBiZXR0ZXIgYmUgcmlnaHQKCSAqIGJlY2F1c2UgaXQgd2lsbCBuZXZlciBi ZSByZXBsYWNlZC4gIFRoZSBkYXRhIGNvbWVzIGZyb20KCSAqIHNyYy9pbmNsdWRlL2NhdGFs b2cvIGhlYWRlcnMgdmlhIGdlbmJraS5wbC4KCSAqLwoJcmVsYXRpb24tPnJkX2F0dCA9IENy ZWF0ZVRlbXBsYXRlVHVwbGVEZXNjKG5hdHRzKTsKCXJlbGF0aW9uLT5yZF9hdHQtPnRkcmVm Y291bnQgPSAxOwkvKiBtYXJrIGFzIHJlZmNvdW50ZWQgKi8KCglyZWxhdGlvbi0+cmRfYXR0 LT50ZHR5cGVpZCA9IHJlbGF0aW9uUmVsdHlwZTsKCXJlbGF0aW9uLT5yZF9hdHQtPnRkdHlw bW9kID0gLTE7CS8qIGp1c3QgdG8gYmUgc3VyZSAqLwoKCS8qCgkgKiBpbml0aWFsaXplIHR1 cGxlIGRlc2MgaW5mbwoJICovCgloYXNfbm90X251bGwgPSBmYWxzZTsKCWZvciAoaSA9IDA7 IGkgPCBuYXR0czsgaSsrKQoJewoJCW1lbWNweShUdXBsZURlc2NBdHRyKHJlbGF0aW9uLT5y ZF9hdHQsIGkpLAoJCQkgICAmYXR0cnNbaV0sCgkJCSAgIEFUVFJJQlVURV9GSVhFRF9QQVJU X1NJWkUpOwoJCWhhc19ub3RfbnVsbCB8PSBhdHRyc1tpXS5hdHRub3RudWxsOwoKCQlwb3B1 bGF0ZV9jb21wYWN0X2F0dHJpYnV0ZShyZWxhdGlvbi0+cmRfYXR0LCBpKTsKCX0KCglUdXBs ZURlc2NGaW5hbGl6ZShyZWxhdGlvbi0+cmRfYXR0KTsKCgkvKiBtYXJrIG5vdC1udWxsIHN0 YXR1cyAqLwoJaWYgKGhhc19ub3RfbnVsbCkKCXsKCQlUdXBsZUNvbnN0ciAqY29uc3RyID0g cGFsbG9jMF9vYmplY3QoVHVwbGVDb25zdHIpOwoKCQljb25zdHItPmhhc19ub3RfbnVsbCA9 IHRydWU7CgkJcmVsYXRpb24tPnJkX2F0dC0+Y29uc3RyID0gY29uc3RyOwoJfQoKCS8qCgkg KiBpbml0aWFsaXplIHJlbGF0aW9uIGlkIGZyb20gaW5mbyBpbiBhdHQgYXJyYXkgKG15LCB0 aGlzIGlzIHVnbHkpCgkgKi8KCVJlbGF0aW9uR2V0UmVsaWQocmVsYXRpb24pID0gVHVwbGVE ZXNjQXR0cihyZWxhdGlvbi0+cmRfYXR0LCAwKS0+YXR0cmVsaWQ7CgoJLyoKCSAqIEFsbCBy ZWxhdGlvbnMgbWFkZSB3aXRoIGZvcm1yZGVzYyBhcmUgbWFwcGVkLiAgVGhpcyBpcyBuZWNl c3NhcmlseSBzbwoJICogYmVjYXVzZSB0aGVyZSBpcyBubyBvdGhlciB3YXkgdG8ga25vdyB3 aGF0IGZpbGVudW1iZXIgdGhleSBjdXJyZW50bHkKCSAqIGhhdmUuICBJbiBib290c3RyYXAg bW9kZSwgYWRkIHRoZW0gdG8gdGhlIGluaXRpYWwgcmVsYXRpb24gbWFwcGVyIGRhdGEsCgkg KiBzcGVjaWZ5aW5nIHRoYXQgdGhlIGluaXRpYWwgZmlsZW51bWJlciBpcyB0aGUgc2FtZSBh cyB0aGUgT0lELgoJICovCglyZWxhdGlvbi0+cmRfcmVsLT5yZWxmaWxlbm9kZSA9IEludmFs aWRSZWxGaWxlTnVtYmVyOwoJaWYgKElzQm9vdHN0cmFwUHJvY2Vzc2luZ01vZGUoKSkKCQlS ZWxhdGlvbk1hcFVwZGF0ZU1hcChSZWxhdGlvbkdldFJlbGlkKHJlbGF0aW9uKSwKCQkJCQkJ CSBSZWxhdGlvbkdldFJlbGlkKHJlbGF0aW9uKSwKCQkJCQkJCSBpc3NoYXJlZCwgdHJ1ZSk7 CgoJLyoKCSAqIGluaXRpYWxpemUgdGhlIHJlbGF0aW9uIGxvY2sgbWFuYWdlciBpbmZvcm1h dGlvbgoJICovCglSZWxhdGlvbkluaXRMb2NrSW5mbyhyZWxhdGlvbik7IC8qIHNlZSBsbWdy LmMgKi8KCgkvKgoJICogaW5pdGlhbGl6ZSBwaHlzaWNhbCBhZGRyZXNzaW5nIGluZm9ybWF0 aW9uIGZvciB0aGUgcmVsYXRpb24KCSAqLwoJUmVsYXRpb25Jbml0UGh5c2ljYWxBZGRyKHJl bGF0aW9uKTsKCgkvKgoJICogaW5pdGlhbGl6ZSB0aGUgdGFibGUgYW0gaGFuZGxlcgoJICov CglyZWxhdGlvbi0+cmRfcmVsLT5yZWxhbSA9IEhFQVBfVEFCTEVfQU1fT0lEOwoJcmVsYXRp b24tPnJkX3RhYmxlYW0gPSBHZXRIZWFwYW1UYWJsZUFtUm91dGluZSgpOwoKCS8qCgkgKiBp bml0aWFsaXplIHRoZSByZWwtaGFzLWluZGV4IGZsYWcsIHVzaW5nIGhhcmR3aXJlZCBrbm93 bGVkZ2UKCSAqLwoJaWYgKElzQm9vdHN0cmFwUHJvY2Vzc2luZ01vZGUoKSkKCXsKCQkvKiBJ biBib290c3RyYXAgbW9kZSwgd2UgaGF2ZSBubyBpbmRleGVzICovCgkJcmVsYXRpb24tPnJk X3JlbC0+cmVsaGFzaW5kZXggPSBmYWxzZTsKCX0KCWVsc2UKCXsKCQkvKiBPdGhlcndpc2Us IGFsbCB0aGUgcmVscyBmb3JtcmRlc2MgaXMgdXNlZCBmb3IgaGF2ZSBpbmRleGVzICovCgkJ cmVsYXRpb24tPnJkX3JlbC0+cmVsaGFzaW5kZXggPSB0cnVlOwoJfQoKCS8qCgkgKiBhZGQg bmV3IHJlbGRlc2MgdG8gcmVsY2FjaGUKCSAqLwoJUmVsYXRpb25DYWNoZUluc2VydChyZWxh dGlvbiwgZmFsc2UpOwoKCS8qIEl0J3MgZnVsbHkgdmFsaWQgKi8KCXJlbGF0aW9uLT5yZF9p c3ZhbGlkID0gdHJ1ZTsKfQoKI2lmZGVmIFVTRV9BU1NFUlRfQ0hFQ0tJTkcKLyoKICoJCUFz c2VydENvdWxkR2V0UmVsYXRpb24KICoKICoJCUNoZWNrIHNhZmV0eSBvZiBjYWxsaW5nIFJl bGF0aW9uSWRHZXRSZWxhdGlvbigpLgogKgogKgkJSW4gY29kZSB0aGF0IHJlYWRzIGNhdGFs b2dzIGluIHRoZSBldmVudCBvZiBhIGNhY2hlIG1pc3MsIGNhbGwgdGhpcwogKgkJYmVmb3Jl IGNoZWNraW5nIHRoZSBjYWNoZS4KICovCnZvaWQKQXNzZXJ0Q291bGRHZXRSZWxhdGlvbih2 b2lkKQp7CglBc3NlcnQoSXNUcmFuc2FjdGlvblN0YXRlKCkpOwoJQXNzZXJ0QnVmZmVyTG9j a3NQZXJtaXRDYXRhbG9nUmVhZCgpOwp9CiNlbmRpZgoKCi8qIC0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICoJCQkJ IFJlbGF0aW9uIERlc2NyaXB0b3IgTG9va3VwIEludGVyZmFjZQogKiAtLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAq LwoKLyoKICoJCVJlbGF0aW9uSWRHZXRSZWxhdGlvbgogKgogKgkJTG9va3VwIGEgcmVsZGVz YyBieSBPSUQ7IG1ha2Ugb25lIGlmIG5vdCBhbHJlYWR5IGluIGNhY2hlLgogKgogKgkJUmV0 dXJucyBOVUxMIGlmIG5vIHBnX2NsYXNzIHJvdyBjb3VsZCBiZSBmb3VuZCBmb3IgdGhlIGdp dmVuIHJlbGlkCiAqCQkoc3VnZ2VzdGluZyB3ZSBhcmUgdHJ5aW5nIHRvIGFjY2VzcyBhIGp1 c3QtZGVsZXRlZCByZWxhdGlvbikuCiAqCQlBbnkgb3RoZXIgZXJyb3IgaXMgcmVwb3J0ZWQg dmlhIGVsb2cuCiAqCiAqCQlOQjogY2FsbGVyIHNob3VsZCBhbHJlYWR5IGhhdmUgYXQgbGVh c3QgQWNjZXNzU2hhcmVMb2NrIG9uIHRoZQogKgkJcmVsYXRpb24gSUQsIGVsc2UgdGhlcmUg YXJlIG5hc3R5IHJhY2UgY29uZGl0aW9ucy4KICoKICoJCU5COiByZWxhdGlvbiByZWYgY291 bnQgaXMgaW5jcmVtZW50ZWQsIG9yIHNldCB0byAxIGlmIG5ldyBlbnRyeS4KICoJCUNhbGxl ciBzaG91bGQgZXZlbnR1YWxseSBkZWNyZW1lbnQgY291bnQuICAoVXN1YWxseSwKICoJCXRo YXQgaGFwcGVucyBieSBjYWxsaW5nIFJlbGF0aW9uQ2xvc2UoKS4pCiAqLwpSZWxhdGlvbgpS ZWxhdGlvbklkR2V0UmVsYXRpb24oT2lkIHJlbGF0aW9uSWQpCnsKCVJlbGF0aW9uCXJkOwoK CUFzc2VydENvdWxkR2V0UmVsYXRpb24oKTsKCgkvKgoJICogZmlyc3QgdHJ5IHRvIGZpbmQg cmVsZGVzYyBpbiB0aGUgY2FjaGUKCSAqLwoJUmVsYXRpb25JZENhY2hlTG9va3VwKHJlbGF0 aW9uSWQsIHJkKTsKCglpZiAoUmVsYXRpb25Jc1ZhbGlkKHJkKSkKCXsKCQkvKiByZXR1cm4g TlVMTCBmb3IgZHJvcHBlZCByZWxhdGlvbnMgKi8KCQlpZiAocmQtPnJkX2Ryb3BwZWRTdWJp ZCAhPSBJbnZhbGlkU3ViVHJhbnNhY3Rpb25JZCkKCQl7CgkJCUFzc2VydCghcmQtPnJkX2lz dmFsaWQpOwoJCQlyZXR1cm4gTlVMTDsKCQl9CgoJCVJlbGF0aW9uSW5jcmVtZW50UmVmZXJl bmNlQ291bnQocmQpOwoJCS8qIHJldmFsaWRhdGUgY2FjaGUgZW50cnkgaWYgbmVjZXNzYXJ5 ICovCgkJaWYgKCFyZC0+cmRfaXN2YWxpZCkKCQl7CgkJCVJlbGF0aW9uUmVidWlsZFJlbGF0 aW9uKHJkKTsKCgkJCS8qCgkJCSAqIE5vcm1hbGx5IGVudHJpZXMgbmVlZCB0byBiZSB2YWxp ZCBoZXJlLCBidXQgYmVmb3JlIHRoZSByZWxjYWNoZQoJCQkgKiBoYXMgYmVlbiBpbml0aWFs aXplZCwgbm90IGVub3VnaCBpbmZyYXN0cnVjdHVyZSBleGlzdHMgdG8KCQkJICogcGVyZm9y bSBwZ19jbGFzcyBsb29rdXBzLiBUaGUgc3RydWN0dXJlIG9mIHN1Y2ggZW50cmllcyBkb2Vz bid0CgkJCSAqIGNoYW5nZSwgYnV0IHdlIHN0aWxsIHdhbnQgdG8gdXBkYXRlIHRoZSByZF9y ZWwgZW50cnkuIFNvCgkJCSAqIHJkX2lzdmFsaWQgPSBmYWxzZSBpcyBsZWZ0IGluIHBsYWNl IGZvciBhIGxhdGVyIGxvb2t1cC4KCQkJICovCgkJCUFzc2VydChyZC0+cmRfaXN2YWxpZCB8 fAoJCQkJICAgKHJkLT5yZF9pc25haWxlZCAmJiAhY3JpdGljYWxSZWxjYWNoZXNCdWlsdCkp OwoJCX0KCQlyZXR1cm4gcmQ7Cgl9CgoJLyoKCSAqIG5vIHJlbGRlc2MgaW4gdGhlIGNhY2hl LCBzbyBoYXZlIFJlbGF0aW9uQnVpbGREZXNjKCkgYnVpbGQgb25lIGFuZCBhZGQKCSAqIGl0 LgoJICovCglyZCA9IFJlbGF0aW9uQnVpbGREZXNjKHJlbGF0aW9uSWQsIHRydWUpOwoJaWYg KFJlbGF0aW9uSXNWYWxpZChyZCkpCgkJUmVsYXRpb25JbmNyZW1lbnRSZWZlcmVuY2VDb3Vu dChyZCk7CglyZXR1cm4gcmQ7Cn0KCi8qCiAqIFJldHVybnMgYSBzY2hlbWEtcXVhbGlmaWVk IG5hbWUgb2YgdGhlIHJlbGF0aW9uLgogKi8KY2hhciAqClJlbGF0aW9uR2V0UXVhbGlmaWVk UmVsYXRpb25OYW1lKFJlbGF0aW9uIHJlbCkKewoJcmV0dXJuIGdldF9xdWFsaWZpZWRfb2Jq bmFtZShSZWxhdGlvbkdldE5hbWVzcGFjZShyZWwpLAoJCQkJCQkJCSBSZWxhdGlvbkdldFJl bGF0aW9uTmFtZShyZWwpKTsKfQoKLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogKgkJCQljYWNoZSBpbnZhbGlk YXRpb24gc3VwcG9ydCByb3V0aW5lcwogKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAqLwoKLyogUmVzb3VyY2VP d25lciBjYWxsYmFja3MgdG8gdHJhY2sgcmVsY2FjaGUgcmVmZXJlbmNlcyAqLwpzdGF0aWMg dm9pZCBSZXNPd25lclJlbGVhc2VSZWxhdGlvbihEYXR1bSByZXMpOwpzdGF0aWMgY2hhciAq UmVzT3duZXJQcmludFJlbENhY2hlKERhdHVtIHJlcyk7CgpzdGF0aWMgY29uc3QgUmVzb3Vy Y2VPd25lckRlc2MgcmVscmVmX3Jlc293bmVyX2Rlc2MgPQp7CgkubmFtZSA9ICJyZWxjYWNo ZSByZWZlcmVuY2UiLAoJLnJlbGVhc2VfcGhhc2UgPSBSRVNPVVJDRV9SRUxFQVNFX0JFRk9S RV9MT0NLUywKCS5yZWxlYXNlX3ByaW9yaXR5ID0gUkVMRUFTRV9QUklPX1JFTENBQ0hFX1JF RlMsCgkuUmVsZWFzZVJlc291cmNlID0gUmVzT3duZXJSZWxlYXNlUmVsYXRpb24sCgkuRGVi dWdQcmludCA9IFJlc093bmVyUHJpbnRSZWxDYWNoZQp9OwoKLyogQ29udmVuaWVuY2Ugd3Jh cHBlcnMgb3ZlciBSZXNvdXJjZU93bmVyUmVtZW1iZXIvRm9yZ2V0ICovCnN0YXRpYyBpbmxp bmUgdm9pZApSZXNvdXJjZU93bmVyUmVtZW1iZXJSZWxhdGlvblJlZihSZXNvdXJjZU93bmVy IG93bmVyLCBSZWxhdGlvbiByZWwpCnsKCVJlc291cmNlT3duZXJSZW1lbWJlcihvd25lciwg UG9pbnRlckdldERhdHVtKHJlbCksICZyZWxyZWZfcmVzb3duZXJfZGVzYyk7Cn0Kc3RhdGlj IGlubGluZSB2b2lkClJlc291cmNlT3duZXJGb3JnZXRSZWxhdGlvblJlZihSZXNvdXJjZU93 bmVyIG93bmVyLCBSZWxhdGlvbiByZWwpCnsKCVJlc291cmNlT3duZXJGb3JnZXQob3duZXIs IFBvaW50ZXJHZXREYXR1bShyZWwpLCAmcmVscmVmX3Jlc293bmVyX2Rlc2MpOwp9CgovKgog KiBSZWxhdGlvbkluY3JlbWVudFJlZmVyZW5jZUNvdW50CiAqCQlJbmNyZW1lbnRzIHJlbGF0 aW9uIHJlZmVyZW5jZSBjb3VudC4KICoKICogTm90ZTogYm9vdHN0cmFwIG1vZGUgaGFzIGl0 cyBvd24gd2VpcmQgaWRlYXMgYWJvdXQgcmVsYXRpb24gcmVmY291bnQKICogYmVoYXZpb3I7 IHdlIG91Z2h0IHRvIGZpeCBpdCBzb21lZGF5LCBidXQgZm9yIG5vdywganVzdCBkaXNhYmxl CiAqIHJlZmVyZW5jZSBjb3VudCBvd25lcnNoaXAgdHJhY2tpbmcgaW4gYm9vdHN0cmFwIG1v ZGUuCiAqLwp2b2lkClJlbGF0aW9uSW5jcmVtZW50UmVmZXJlbmNlQ291bnQoUmVsYXRpb24g cmVsKQp7CglSZXNvdXJjZU93bmVyRW5sYXJnZShDdXJyZW50UmVzb3VyY2VPd25lcik7Cgly ZWwtPnJkX3JlZmNudCArPSAxOwoJaWYgKCFJc0Jvb3RzdHJhcFByb2Nlc3NpbmdNb2RlKCkp CgkJUmVzb3VyY2VPd25lclJlbWVtYmVyUmVsYXRpb25SZWYoQ3VycmVudFJlc291cmNlT3du ZXIsIHJlbCk7Cn0KCi8qCiAqIFJlbGF0aW9uRGVjcmVtZW50UmVmZXJlbmNlQ291bnQKICoJ CURlY3JlbWVudHMgcmVsYXRpb24gcmVmZXJlbmNlIGNvdW50LgogKi8Kdm9pZApSZWxhdGlv bkRlY3JlbWVudFJlZmVyZW5jZUNvdW50KFJlbGF0aW9uIHJlbCkKewoJQXNzZXJ0KHJlbC0+ cmRfcmVmY250ID4gMCk7CglyZWwtPnJkX3JlZmNudCAtPSAxOwoJaWYgKCFJc0Jvb3RzdHJh cFByb2Nlc3NpbmdNb2RlKCkpCgkJUmVzb3VyY2VPd25lckZvcmdldFJlbGF0aW9uUmVmKEN1 cnJlbnRSZXNvdXJjZU93bmVyLCByZWwpOwp9CgovKgogKiBSZWxhdGlvbkNsb3NlIC0gY2xv c2UgYW4gb3BlbiByZWxhdGlvbgogKgogKglBY3R1YWxseSwgd2UganVzdCBkZWNyZW1lbnQg dGhlIHJlZmNvdW50LgogKgogKglOT1RFOiBpZiBjb21waWxlZCB3aXRoIC1EUkVMQ0FDSEVf Rk9SQ0VfUkVMRUFTRSB0aGVuIHJlbGNhY2hlIGVudHJpZXMKICoJd2lsbCBiZSBmcmVlZCBh cyBzb29uIGFzIHRoZWlyIHJlZmNvdW50IGdvZXMgdG8gemVyby4gIEluIGNvbWJpbmF0aW9u CiAqCXdpdGggYXNldC5jJ3MgQ0xPQkJFUl9GUkVFRF9NRU1PUlkgb3B0aW9uLCB0aGlzIHBy b3ZpZGVzIGEgZ29vZCB0ZXN0CiAqCXRvIGNhdGNoIHJlZmVyZW5jZXMgdG8gYWxyZWFkeS1y ZWxlYXNlZCByZWxjYWNoZSBlbnRyaWVzLiAgSXQgc2xvd3MKICoJdGhpbmdzIGRvd24gcXVp dGUgYSBiaXQsIGhvd2V2ZXIuCiAqLwp2b2lkClJlbGF0aW9uQ2xvc2UoUmVsYXRpb24gcmVs YXRpb24pCnsKCS8qIE5vdGU6IG5vIGxvY2tpbmcgbWFuaXB1bGF0aW9ucyBuZWVkZWQgKi8K CVJlbGF0aW9uRGVjcmVtZW50UmVmZXJlbmNlQ291bnQocmVsYXRpb24pOwoKCVJlbGF0aW9u Q2xvc2VDbGVhbnVwKHJlbGF0aW9uKTsKfQoKc3RhdGljIHZvaWQKUmVsYXRpb25DbG9zZUNs ZWFudXAoUmVsYXRpb24gcmVsYXRpb24pCnsKCS8qCgkgKiBJZiB0aGUgcmVsYXRpb24gaXMg bm8gbG9uZ2VyIG9wZW4gaW4gdGhpcyBzZXNzaW9uLCB3ZSBjYW4gY2xlYW4gdXAgYW55Cgkg KiBzdGFsZSBwYXJ0aXRpb24gZGVzY3JpcHRvcnMgaXQgaGFzLiAgVGhpcyBpcyB1bmxpa2Vs eSwgc28gY2hlY2sgdG8gc2VlCgkgKiBpZiB0aGVyZSBhcmUgY2hpbGQgY29udGV4dHMgYmVm b3JlIGV4cGVuZGluZyBhIGNhbGwgdG8gbWN4dC5jLgoJICovCglpZiAoUmVsYXRpb25IYXNS ZWZlcmVuY2VDb3VudFplcm8ocmVsYXRpb24pKQoJewoJCWlmIChyZWxhdGlvbi0+cmRfcGRj eHQgIT0gTlVMTCAmJgoJCQlyZWxhdGlvbi0+cmRfcGRjeHQtPmZpcnN0Y2hpbGQgIT0gTlVM TCkKCQkJTWVtb3J5Q29udGV4dERlbGV0ZUNoaWxkcmVuKHJlbGF0aW9uLT5yZF9wZGN4dCk7 CgoJCWlmIChyZWxhdGlvbi0+cmRfcGRkY3h0ICE9IE5VTEwgJiYKCQkJcmVsYXRpb24tPnJk X3BkZGN4dC0+Zmlyc3RjaGlsZCAhPSBOVUxMKQoJCQlNZW1vcnlDb250ZXh0RGVsZXRlQ2hp bGRyZW4ocmVsYXRpb24tPnJkX3BkZGN4dCk7Cgl9CgojaWZkZWYgUkVMQ0FDSEVfRk9SQ0Vf UkVMRUFTRQoJaWYgKFJlbGF0aW9uSGFzUmVmZXJlbmNlQ291bnRaZXJvKHJlbGF0aW9uKSAm JgoJCXJlbGF0aW9uLT5yZF9jcmVhdGVTdWJpZCA9PSBJbnZhbGlkU3ViVHJhbnNhY3Rpb25J ZCAmJgoJCXJlbGF0aW9uLT5yZF9maXJzdFJlbGZpbGVsb2NhdG9yU3ViaWQgPT0gSW52YWxp ZFN1YlRyYW5zYWN0aW9uSWQpCgkJUmVsYXRpb25DbGVhclJlbGF0aW9uKHJlbGF0aW9uKTsK I2VuZGlmCn0KCi8qCiAqIFJlbGF0aW9uUmVsb2FkSW5kZXhJbmZvIC0gcmVsb2FkIG1pbmlt YWwgaW5mb3JtYXRpb24gZm9yIGFuIG9wZW4gaW5kZXgKICoKICoJVGhpcyBmdW5jdGlvbiBp cyB1c2VkIG9ubHkgZm9yIGluZGV4ZXMuICBBIHJlbGNhY2hlIGludmFsIG9uIGFuIGluZGV4 CiAqCWNhbiBtZWFuIHRoYXQgaXRzIHBnX2NsYXNzIG9yIHBnX2luZGV4IHJvdyBjaGFuZ2Vk LiAgVGhlcmUgYXJlIG9ubHkKICoJdmVyeSBsaW1pdGVkIGNoYW5nZXMgdGhhdCBhcmUgYWxs b3dlZCB0byBhbiBleGlzdGluZyBpbmRleCdzIHNjaGVtYSwKICoJc28gd2UgY2FuIHVwZGF0 ZSB0aGUgcmVsY2FjaGUgZW50cnkgd2l0aG91dCBhIGNvbXBsZXRlIHJlYnVpbGQ7IHdoaWNo CiAqCWlzIGZvcnR1bmF0ZSBiZWNhdXNlIHdlIGNhbid0IHJlYnVpbGQgYW4gaW5kZXggZW50 cnkgdGhhdCBpcyAibmFpbGVkIgogKglhbmQvb3IgaW4gYWN0aXZlIHVzZS4gIFdlIHN1cHBv cnQgZnVsbCByZXBsYWNlbWVudCBvZiB0aGUgcGdfY2xhc3Mgcm93LAogKglhcyB3ZWxsIGFz IHVwZGF0ZXMgb2YgYSBmZXcgc2ltcGxlIGZpZWxkcyBvZiB0aGUgcGdfaW5kZXggcm93Lgog KgogKglXZSBhc3N1bWUgdGhhdCBhdCB0aGUgdGltZSB3ZSBhcmUgY2FsbGVkLCB3ZSBoYXZl IGF0IGxlYXN0IEFjY2Vzc1NoYXJlTG9jawogKglvbiB0aGUgdGFyZ2V0IGluZGV4LgogKgog KglJZiB0aGUgdGFyZ2V0IGluZGV4IGlzIGFuIGluZGV4IG9uIHBnX2NsYXNzIG9yIHBnX2lu ZGV4LCB3ZSdkIGJldHRlciBoYXZlCiAqCXByZXZpb3VzbHkgZ290dGVuIGF0IGxlYXN0IEFj Y2Vzc1NoYXJlTG9jayBvbiBpdHMgdW5kZXJseWluZyBjYXRhbG9nLAogKgllbHNlIHdlIGFy ZSBhdCByaXNrIG9mIGRlYWRsb2NrIGFnYWluc3Qgc29tZW9uZSB0cnlpbmcgdG8gZXhjbHVz aXZlLWxvY2sKICoJdGhlIGhlYXAgYW5kIGluZGV4IGluIHRoYXQgb3JkZXIuICBUaGlzIGlz IGVuc3VyZWQgaW4gY3VycmVudCB1c2FnZSBieQogKglvbmx5IGFwcGx5aW5nIHRoaXMgdG8g aW5kZXhlcyBiZWluZyBvcGVuZWQgb3IgaGF2aW5nIHBvc2l0aXZlIHJlZmNvdW50LgogKi8K c3RhdGljIHZvaWQKUmVsYXRpb25SZWxvYWRJbmRleEluZm8oUmVsYXRpb24gcmVsYXRpb24p CnsKCWJvb2wJCWluZGV4T0s7CglIZWFwVHVwbGUJcGdfY2xhc3NfdHVwbGU7CglGb3JtX3Bn X2NsYXNzIHJlbHA7CgoJLyogU2hvdWxkIGJlIGNhbGxlZCBvbmx5IGZvciBpbnZhbGlkYXRl ZCwgbGl2ZSBpbmRleGVzICovCglBc3NlcnQoKHJlbGF0aW9uLT5yZF9yZWwtPnJlbGtpbmQg PT0gUkVMS0lORF9JTkRFWCB8fAoJCQlyZWxhdGlvbi0+cmRfcmVsLT5yZWxraW5kID09IFJF TEtJTkRfUEFSVElUSU9ORURfSU5ERVgpICYmCgkJICAgIXJlbGF0aW9uLT5yZF9pc3ZhbGlk ICYmCgkJICAgcmVsYXRpb24tPnJkX2Ryb3BwZWRTdWJpZCA9PSBJbnZhbGlkU3ViVHJhbnNh Y3Rpb25JZCk7CgoJLyoKCSAqIElmIGl0J3MgYSBzaGFyZWQgaW5kZXgsIHdlIG1pZ2h0IGJl IGNhbGxlZCBiZWZvcmUgYmFja2VuZCBzdGFydHVwIGhhcwoJICogZmluaXNoZWQgc2VsZWN0 aW5nIGEgZGF0YWJhc2UsIGluIHdoaWNoIGNhc2Ugd2UgaGF2ZSBubyB3YXkgdG8gcmVhZAoJ ICogcGdfY2xhc3MgeWV0LiAgSG93ZXZlciwgYSBzaGFyZWQgaW5kZXggY2FuIG5ldmVyIGhh dmUgYW55IHNpZ25pZmljYW50CgkgKiBzY2hlbWEgdXBkYXRlcywgc28gaXQncyBva2F5IHRv IG1vc3RseSBpZ25vcmUgdGhlIGludmFsaWRhdGlvbiBzaWduYWwuCgkgKiBJdHMgcGh5c2lj YWwgcmVsZmlsZW51bWJlciBtaWdodCd2ZSBjaGFuZ2VkLCBidXQgdGhhdCdzIGFsbC4gIFVw ZGF0ZQoJICogdGhlIHBoeXNpY2FsIHJlbGZpbGVudW1iZXIsIG1hcmsgaXQgdmFsaWQgYW5k IHJldHVybiB3aXRob3V0IGRvaW5nCgkgKiBhbnl0aGluZyBtb3JlLgoJICovCglpZiAocmVs YXRpb24tPnJkX3JlbC0+cmVsaXNzaGFyZWQgJiYgIWNyaXRpY2FsUmVsY2FjaGVzQnVpbHQp Cgl7CgkJUmVsYXRpb25Jbml0UGh5c2ljYWxBZGRyKHJlbGF0aW9uKTsKCQlyZWxhdGlvbi0+ cmRfaXN2YWxpZCA9IHRydWU7CgkJcmV0dXJuOwoJfQoKCS8qCgkgKiBSZWFkIHRoZSBwZ19j bGFzcyByb3cKCSAqCgkgKiBEb24ndCB0cnkgdG8gdXNlIGFuIGluZGV4c2NhbiBvZiBwZ19j bGFzc19vaWRfaW5kZXggdG8gcmVsb2FkIHRoZSBpbmZvCgkgKiBmb3IgcGdfY2xhc3Nfb2lk X2luZGV4IC4uLgoJICovCglpbmRleE9LID0gKFJlbGF0aW9uR2V0UmVsaWQocmVsYXRpb24p ICE9IENsYXNzT2lkSW5kZXhJZCk7CglwZ19jbGFzc190dXBsZSA9IFNjYW5QZ1JlbGF0aW9u KFJlbGF0aW9uR2V0UmVsaWQocmVsYXRpb24pLCBpbmRleE9LLCBmYWxzZSk7CglpZiAoIUhl YXBUdXBsZUlzVmFsaWQocGdfY2xhc3NfdHVwbGUpKQoJCWVsb2coRVJST1IsICJjb3VsZCBu b3QgZmluZCBwZ19jbGFzcyB0dXBsZSBmb3IgaW5kZXggJXUiLAoJCQkgUmVsYXRpb25HZXRS ZWxpZChyZWxhdGlvbikpOwoJcmVscCA9IChGb3JtX3BnX2NsYXNzKSBHRVRTVFJVQ1QocGdf Y2xhc3NfdHVwbGUpOwoJbWVtY3B5KHJlbGF0aW9uLT5yZF9yZWwsIHJlbHAsIENMQVNTX1RV UExFX1NJWkUpOwoJLyogUmVsb2FkIHJlbG9wdGlvbnMgaW4gY2FzZSB0aGV5IGNoYW5nZWQg Ki8KCWlmIChyZWxhdGlvbi0+cmRfb3B0aW9ucykKCQlwZnJlZShyZWxhdGlvbi0+cmRfb3B0 aW9ucyk7CglSZWxhdGlvblBhcnNlUmVsT3B0aW9ucyhyZWxhdGlvbiwgcGdfY2xhc3NfdHVw bGUpOwoJLyogZG9uZSB3aXRoIHBnX2NsYXNzIHR1cGxlICovCgloZWFwX2ZyZWV0dXBsZShw Z19jbGFzc190dXBsZSk7CgkvKiBXZSBtdXN0IHJlY2FsY3VsYXRlIHBoeXNpY2FsIGFkZHJl c3MgaW4gY2FzZSBpdCBjaGFuZ2VkICovCglSZWxhdGlvbkluaXRQaHlzaWNhbEFkZHIocmVs YXRpb24pOwoKCS8qCgkgKiBGb3IgYSBub24tc3lzdGVtIGluZGV4LCB0aGVyZSBhcmUgZmll bGRzIG9mIHRoZSBwZ19pbmRleCByb3cgdGhhdCBhcmUKCSAqIGFsbG93ZWQgdG8gY2hhbmdl LCBzbyByZS1yZWFkIHRoYXQgcm93IGFuZCB1cGRhdGUgdGhlIHJlbGNhY2hlIGVudHJ5LgoJ ICogTW9zdCBvZiB0aGUgaW5mbyBkZXJpdmVkIGZyb20gcGdfaW5kZXggKHN1Y2ggYXMgc3Vw cG9ydCBmdW5jdGlvbiBsb29rdXAKCSAqIGluZm8pIGNhbm5vdCBjaGFuZ2UsIGFuZCBpbmRl ZWQgdGhlIHdob2xlIHBvaW50IG9mIHRoaXMgcm91dGluZSBpcyB0bwoJICogdXBkYXRlIHRo ZSByZWxjYWNoZSBlbnRyeSB3aXRob3V0IGNsb2JiZXJpbmcgdGhhdCBkYXRhOyBzbyB3aG9s ZXNhbGUKCSAqIHJlcGxhY2VtZW50IGlzIG5vdCBhcHByb3ByaWF0ZS4KCSAqLwoJaWYgKCFJ c1N5c3RlbVJlbGF0aW9uKHJlbGF0aW9uKSkKCXsKCQlIZWFwVHVwbGUJdHVwbGU7CgkJRm9y bV9wZ19pbmRleCBpbmRleDsKCgkJdHVwbGUgPSBTZWFyY2hTeXNDYWNoZTEoSU5ERVhSRUxJ RCwKCQkJCQkJCQlPYmplY3RJZEdldERhdHVtKFJlbGF0aW9uR2V0UmVsaWQocmVsYXRpb24p KSk7CgkJaWYgKCFIZWFwVHVwbGVJc1ZhbGlkKHR1cGxlKSkKCQkJZWxvZyhFUlJPUiwgImNh Y2hlIGxvb2t1cCBmYWlsZWQgZm9yIGluZGV4ICV1IiwKCQkJCSBSZWxhdGlvbkdldFJlbGlk KHJlbGF0aW9uKSk7CgkJaW5kZXggPSAoRm9ybV9wZ19pbmRleCkgR0VUU1RSVUNUKHR1cGxl KTsKCgkJLyoKCQkgKiBCYXNpY2FsbHksIGxldCdzIGp1c3QgY29weSBhbGwgdGhlIGJvb2wg ZmllbGRzLiAgVGhlcmUgYXJlIG9uZSBvcgoJCSAqIHR3byBvZiB0aGVzZSB0aGF0IGNhbid0 IGFjdHVhbGx5IGNoYW5nZSBpbiB0aGUgY3VycmVudCBjb2RlLCBidXQKCQkgKiBpdCdzIG5v dCB3b3J0aCBpdCB0byB0cmFjayBleGFjdGx5IHdoaWNoIG9uZXMgdGhleSBhcmUuICBOb25l IG9mCgkJICogdGhlIGFycmF5IGZpZWxkcyBhcmUgYWxsb3dlZCB0byBjaGFuZ2UsIHRob3Vn aC4KCQkgKi8KCQlyZWxhdGlvbi0+cmRfaW5kZXgtPmluZGlzdW5pcXVlID0gaW5kZXgtPmlu ZGlzdW5pcXVlOwoJCXJlbGF0aW9uLT5yZF9pbmRleC0+aW5kbnVsbHNub3RkaXN0aW5jdCA9 IGluZGV4LT5pbmRudWxsc25vdGRpc3RpbmN0OwoJCXJlbGF0aW9uLT5yZF9pbmRleC0+aW5k aXNwcmltYXJ5ID0gaW5kZXgtPmluZGlzcHJpbWFyeTsKCQlyZWxhdGlvbi0+cmRfaW5kZXgt PmluZGlzZXhjbHVzaW9uID0gaW5kZXgtPmluZGlzZXhjbHVzaW9uOwoJCXJlbGF0aW9uLT5y ZF9pbmRleC0+aW5kaW1tZWRpYXRlID0gaW5kZXgtPmluZGltbWVkaWF0ZTsKCQlyZWxhdGlv bi0+cmRfaW5kZXgtPmluZGlzY2x1c3RlcmVkID0gaW5kZXgtPmluZGlzY2x1c3RlcmVkOwoJ CXJlbGF0aW9uLT5yZF9pbmRleC0+aW5kaXN2YWxpZCA9IGluZGV4LT5pbmRpc3ZhbGlkOwoJ CXJlbGF0aW9uLT5yZF9pbmRleC0+aW5kY2hlY2t4bWluID0gaW5kZXgtPmluZGNoZWNreG1p bjsKCQlyZWxhdGlvbi0+cmRfaW5kZXgtPmluZGlzcmVhZHkgPSBpbmRleC0+aW5kaXNyZWFk eTsKCQlyZWxhdGlvbi0+cmRfaW5kZXgtPmluZGlzbGl2ZSA9IGluZGV4LT5pbmRpc2xpdmU7 CgkJcmVsYXRpb24tPnJkX2luZGV4LT5pbmRpc3JlcGxpZGVudCA9IGluZGV4LT5pbmRpc3Jl cGxpZGVudDsKCgkJLyogQ29weSB4bWluIHRvbywgYXMgdGhhdCBpcyBuZWVkZWQgdG8gbWFr ZSBzZW5zZSBvZiBpbmRjaGVja3htaW4gKi8KCQlIZWFwVHVwbGVIZWFkZXJTZXRYbWluKHJl bGF0aW9uLT5yZF9pbmRleHR1cGxlLT50X2RhdGEsCgkJCQkJCQkgICBIZWFwVHVwbGVIZWFk ZXJHZXRYbWluKHR1cGxlLT50X2RhdGEpKTsKCgkJUmVsZWFzZVN5c0NhY2hlKHR1cGxlKTsK CX0KCgkvKiBPa2F5LCBub3cgaXQncyB2YWxpZCBhZ2FpbiAqLwoJcmVsYXRpb24tPnJkX2lz dmFsaWQgPSB0cnVlOwp9CgovKgogKiBSZWxhdGlvblJlbG9hZE5haWxlZCAtIHJlbG9hZCBt aW5pbWFsIGluZm9ybWF0aW9uIGZvciBuYWlsZWQgcmVsYXRpb25zLgogKgogKiBUaGUgc3Ry dWN0dXJlIG9mIGEgbmFpbGVkIHJlbGF0aW9uIGNhbiBuZXZlciBjaGFuZ2UgKHdoaWNoIGlz IGdvb2QsIGJlY2F1c2UKICogd2UgcmVseSBvbiBrbm93aW5nIHRoZWlyIHN0cnVjdHVyZSB0 byBiZSBhYmxlIHRvIHJlYWQgY2F0YWxvZyBjb250ZW50KS4gQnV0CiAqIHNvbWUgcGFydHMs IGUuZy4gcGdfY2xhc3MucmVsZnJvemVueGlkLCBhcmUgc3RpbGwgaW1wb3J0YW50IHRvIGhh dmUKICogYWNjdXJhdGUgY29udGVudCBmb3IuIFRoZXJlZm9yZSB0aG9zZSBuZWVkIHRvIGJl IHJlbG9hZGVkIGFmdGVyIHRoZSBhcnJpdmFsCiAqIG9mIGludmFsaWRhdGlvbnMuCiAqLwpz dGF0aWMgdm9pZApSZWxhdGlvblJlbG9hZE5haWxlZChSZWxhdGlvbiByZWxhdGlvbikKewoJ LyogU2hvdWxkIGJlIGNhbGxlZCBvbmx5IGZvciBpbnZhbGlkYXRlZCwgbmFpbGVkIHJlbGF0 aW9ucyAqLwoJQXNzZXJ0KCFyZWxhdGlvbi0+cmRfaXN2YWxpZCk7CglBc3NlcnQocmVsYXRp b24tPnJkX2lzbmFpbGVkKTsKCS8qIG5haWxlZCBpbmRleGVzIGFyZSBoYW5kbGVkIGJ5IFJl bGF0aW9uUmVsb2FkSW5kZXhJbmZvKCkgKi8KCUFzc2VydChyZWxhdGlvbi0+cmRfcmVsLT5y ZWxraW5kID09IFJFTEtJTkRfUkVMQVRJT04pOwoJQXNzZXJ0Q291bGRHZXRSZWxhdGlvbigp OwoKCS8qCgkgKiBSZWRvIFJlbGF0aW9uSW5pdFBoeXNpY2FsQWRkciBpbiBjYXNlIGl0IGlz IGEgbWFwcGVkIHJlbGF0aW9uIHdob3NlCgkgKiBtYXBwaW5nIGNoYW5nZWQuCgkgKi8KCVJl bGF0aW9uSW5pdFBoeXNpY2FsQWRkcihyZWxhdGlvbik7CgoJLyoKCSAqIFJlbG9hZCBhIG5v bi1pbmRleCBlbnRyeS4gIFdlIGNhbid0IGVhc2lseSBkbyBzbyBpZiByZWxjYWNoZXMgYXJl bid0CgkgKiB5ZXQgYnVpbHQsIGJ1dCB0aGF0J3MgZmluZSBiZWNhdXNlIGF0IHRoYXQgc3Rh Z2UgdGhlIGF0dHJpYnV0ZXMgdGhhdAoJICogbmVlZCB0byBiZSBjdXJyZW50IChsaWtlIHJl bGZyb3plbnhpZCkgYXJlbid0IHlldCBhY2Nlc3NlZC4gIFRvIGVuc3VyZQoJICogdGhlIGVu dHJ5IHdpbGwgbGF0ZXIgYmUgcmV2YWxpZGF0ZWQsIHdlIGxlYXZlIGl0IGluIGludmFsaWQg c3RhdGUsIGJ1dAoJICogYWxsb3cgdXNlIChjZi4gUmVsYXRpb25JZEdldFJlbGF0aW9uKCkp LgoJICovCglpZiAoY3JpdGljYWxSZWxjYWNoZXNCdWlsdCkKCXsKCQlIZWFwVHVwbGUJcGdf Y2xhc3NfdHVwbGU7CgkJRm9ybV9wZ19jbGFzcyByZWxwOwoKCQkvKgoJCSAqIE5COiBNYXJr IHRoZSBlbnRyeSBhcyB2YWxpZCBiZWZvcmUgc3RhcnRpbmcgdG8gc2NhbiwgdG8gYXZvaWQK CQkgKiBzZWxmLXJlY3Vyc2lvbiB3aGVuIHJlLWJ1aWxkaW5nIHBnX2NsYXNzLgoJCSAqLwoJ CXJlbGF0aW9uLT5yZF9pc3ZhbGlkID0gdHJ1ZTsKCgkJcGdfY2xhc3NfdHVwbGUgPSBTY2Fu UGdSZWxhdGlvbihSZWxhdGlvbkdldFJlbGlkKHJlbGF0aW9uKSwKCQkJCQkJCQkJCXRydWUs IGZhbHNlKTsKCQlyZWxwID0gKEZvcm1fcGdfY2xhc3MpIEdFVFNUUlVDVChwZ19jbGFzc190 dXBsZSk7CgkJbWVtY3B5KHJlbGF0aW9uLT5yZF9yZWwsIHJlbHAsIENMQVNTX1RVUExFX1NJ WkUpOwoJCWhlYXBfZnJlZXR1cGxlKHBnX2NsYXNzX3R1cGxlKTsKCgkJLyoKCQkgKiBBZ2Fp biBtYXJrIGFzIHZhbGlkLCB0byBwcm90ZWN0IGFnYWluc3QgY29uY3VycmVudGx5IGFycml2 aW5nCgkJICogaW52YWxpZGF0aW9ucy4KCQkgKi8KCQlyZWxhdGlvbi0+cmRfaXN2YWxpZCA9 IHRydWU7Cgl9Cn0KCi8qCiAqIFJlbGF0aW9uRGVzdHJveVJlbGF0aW9uCiAqCiAqCVBoeXNp Y2FsbHkgZGVsZXRlIGEgcmVsYXRpb24gY2FjaGUgZW50cnkgYW5kIGFsbCBzdWJzaWRpYXJ5 IGRhdGEuCiAqCUNhbGxlciBtdXN0IGFscmVhZHkgaGF2ZSB1bmhvb2tlZCB0aGUgZW50cnkg ZnJvbSB0aGUgaGFzaCB0YWJsZS4KICovCnN0YXRpYyB2b2lkClJlbGF0aW9uRGVzdHJveVJl bGF0aW9uKFJlbGF0aW9uIHJlbGF0aW9uLCBib29sIHJlbWVtYmVyX3R1cGRlc2MpCnsKCUFz c2VydChSZWxhdGlvbkhhc1JlZmVyZW5jZUNvdW50WmVybyhyZWxhdGlvbikpOwoKCS8qCgkg KiBNYWtlIHN1cmUgc21nciBhbmQgbG93ZXIgbGV2ZWxzIGNsb3NlIHRoZSByZWxhdGlvbidz IGZpbGVzLCBpZiB0aGV5CgkgKiB3ZXJlbid0IGNsb3NlZCBhbHJlYWR5LiAgKFRoaXMgd2Fz IHByb2JhYmx5IGRvbmUgYnkgY2FsbGVyLCBidXQgbGV0J3MKCSAqIGp1c3QgYmUgcmVhbCBz dXJlLikKCSAqLwoJUmVsYXRpb25DbG9zZVNtZ3IocmVsYXRpb24pOwoKCS8qIGJyZWFrIG11 dHVhbCBsaW5rIHdpdGggc3RhdHMgZW50cnkgKi8KCXBnc3RhdF91bmxpbmtfcmVsYXRpb24o cmVsYXRpb24pOwoKCS8qCgkgKiBGcmVlIGFsbCB0aGUgc3Vic2lkaWFyeSBkYXRhIHN0cnVj dHVyZXMgb2YgdGhlIHJlbGNhY2hlIGVudHJ5LCB0aGVuIHRoZQoJICogZW50cnkgaXRzZWxm LgoJICovCglpZiAocmVsYXRpb24tPnJkX3JlbCkKCQlwZnJlZShyZWxhdGlvbi0+cmRfcmVs KTsKCS8qIGNhbid0IHVzZSBEZWNyVHVwbGVEZXNjUmVmQ291bnQgaGVyZSAqLwoJQXNzZXJ0 KHJlbGF0aW9uLT5yZF9hdHQtPnRkcmVmY291bnQgPiAwKTsKCWlmICgtLXJlbGF0aW9uLT5y ZF9hdHQtPnRkcmVmY291bnQgPT0gMCkKCXsKCQkvKgoJCSAqIElmIHdlIFJlYnVpbHQgYSBy ZWxjYWNoZSBlbnRyeSBkdXJpbmcgYSB0cmFuc2FjdGlvbiB0aGVuIGl0cwoJCSAqIHBvc3Np YmxlIHdlIGRpZCB0aGF0IGJlY2F1c2UgdGhlIFR1cERlc2MgY2hhbmdlZCBhcyB0aGUgcmVz dWx0IG9mCgkJICogYW4gQUxURVIgVEFCTEUgdGhhdCByYW4gYXQgbGVzcyB0aGFuIEFjY2Vz c0V4Y2x1c2l2ZUxvY2suIEl0J3MKCQkgKiBwb3NzaWJsZSBzb21lb25lIGNvcGllZCB0aGF0 IFR1cERlc2MsIGluIHdoaWNoIGNhc2UgdGhlIGNvcHkgd291bGQKCQkgKiBwb2ludCB0byBm cmVlJ2QgbWVtb3J5LiBTbyBpZiB3ZSByZWJ1aWxkIGFuIGVudHJ5IHdlIGtlZXAgdGhlCgkJ ICogVHVwRGVzYyBhcm91bmQgdW50aWwgZW5kIG9mIHRyYW5zYWN0aW9uLCB0byBiZSBzYWZl LgoJCSAqLwoJCWlmIChyZW1lbWJlcl90dXBkZXNjKQoJCQlSZW1lbWJlclRvRnJlZVR1cGxl RGVzY0F0RU9YKHJlbGF0aW9uLT5yZF9hdHQpOwoJCWVsc2UKCQkJRnJlZVR1cGxlRGVzYyhy ZWxhdGlvbi0+cmRfYXR0KTsKCX0KCUZyZWVUcmlnZ2VyRGVzYyhyZWxhdGlvbi0+dHJpZ2Rl c2MpOwoJbGlzdF9mcmVlX2RlZXAocmVsYXRpb24tPnJkX2ZrZXlsaXN0KTsKCWxpc3RfZnJl ZShyZWxhdGlvbi0+cmRfaW5kZXhsaXN0KTsKCWxpc3RfZnJlZShyZWxhdGlvbi0+cmRfc3Rh dGxpc3QpOwoJYm1zX2ZyZWUocmVsYXRpb24tPnJkX2tleWF0dHIpOwoJYm1zX2ZyZWUocmVs YXRpb24tPnJkX3BrYXR0cik7CglibXNfZnJlZShyZWxhdGlvbi0+cmRfaWRhdHRyKTsKCWJt c19mcmVlKHJlbGF0aW9uLT5yZF9ob3RibG9ja2luZ2F0dHIpOwoJYm1zX2ZyZWUocmVsYXRp b24tPnJkX3N1bW1hcml6ZWRhdHRyKTsKCWlmIChyZWxhdGlvbi0+cmRfcHViZGVzYykKCQlw ZnJlZShyZWxhdGlvbi0+cmRfcHViZGVzYyk7CglpZiAocmVsYXRpb24tPnJkX29wdGlvbnMp CgkJcGZyZWUocmVsYXRpb24tPnJkX29wdGlvbnMpOwoJaWYgKHJlbGF0aW9uLT5yZF9pbmRl eHR1cGxlKQoJCXBmcmVlKHJlbGF0aW9uLT5yZF9pbmRleHR1cGxlKTsKCWlmIChyZWxhdGlv bi0+cmRfYW1jYWNoZSkKCQlwZnJlZShyZWxhdGlvbi0+cmRfYW1jYWNoZSk7CglpZiAocmVs YXRpb24tPnJkX2Zkd3JvdXRpbmUpCgkJcGZyZWUocmVsYXRpb24tPnJkX2Zkd3JvdXRpbmUp OwoJaWYgKHJlbGF0aW9uLT5yZF9pbmRleGN4dCkKCQlNZW1vcnlDb250ZXh0RGVsZXRlKHJl bGF0aW9uLT5yZF9pbmRleGN4dCk7CglpZiAocmVsYXRpb24tPnJkX3J1bGVzY3h0KQoJCU1l bW9yeUNvbnRleHREZWxldGUocmVsYXRpb24tPnJkX3J1bGVzY3h0KTsKCWlmIChyZWxhdGlv bi0+cmRfcnNkZXNjKQoJCU1lbW9yeUNvbnRleHREZWxldGUocmVsYXRpb24tPnJkX3JzZGVz Yy0+cnNjeHQpOwoJaWYgKHJlbGF0aW9uLT5yZF9wYXJ0a2V5Y3h0KQoJCU1lbW9yeUNvbnRl eHREZWxldGUocmVsYXRpb24tPnJkX3BhcnRrZXljeHQpOwoJaWYgKHJlbGF0aW9uLT5yZF9w ZGN4dCkKCQlNZW1vcnlDb250ZXh0RGVsZXRlKHJlbGF0aW9uLT5yZF9wZGN4dCk7CglpZiAo cmVsYXRpb24tPnJkX3BkZGN4dCkKCQlNZW1vcnlDb250ZXh0RGVsZXRlKHJlbGF0aW9uLT5y ZF9wZGRjeHQpOwoJaWYgKHJlbGF0aW9uLT5yZF9wYXJ0Y2hlY2tjeHQpCgkJTWVtb3J5Q29u dGV4dERlbGV0ZShyZWxhdGlvbi0+cmRfcGFydGNoZWNrY3h0KTsKCXBmcmVlKHJlbGF0aW9u KTsKfQoKLyoKICogUmVsYXRpb25JbnZhbGlkYXRlUmVsYXRpb24gLSBtYXJrIGEgcmVsYXRp b24gY2FjaGUgZW50cnkgYXMgaW52YWxpZAogKgogKiBBbiBlbnRyeSB0aGF0J3MgbWFya2Vk IGFzIGludmFsaWQgd2lsbCBiZSByZWxvYWRlZCBvbiBuZXh0IGFjY2Vzcy4KICovCnN0YXRp YyB2b2lkClJlbGF0aW9uSW52YWxpZGF0ZVJlbGF0aW9uKFJlbGF0aW9uIHJlbGF0aW9uKQp7 CgkvKgoJICogTWFrZSBzdXJlIHNtZ3IgYW5kIGxvd2VyIGxldmVscyBjbG9zZSB0aGUgcmVs YXRpb24ncyBmaWxlcywgaWYgdGhleQoJICogd2VyZW4ndCBjbG9zZWQgYWxyZWFkeS4gIElm IHRoZSByZWxhdGlvbiBpcyBub3QgZ2V0dGluZyBkZWxldGVkLCB0aGUKCSAqIG5leHQgc21n ciBhY2Nlc3Mgc2hvdWxkIHJlb3BlbiB0aGUgZmlsZXMgYXV0b21hdGljYWxseS4gIFRoaXMg ZW5zdXJlcwoJICogdGhhdCB0aGUgbG93LWxldmVsIGZpbGUgYWNjZXNzIHN0YXRlIGlzIHVw ZGF0ZWQgYWZ0ZXIsIHNheSwgYSB2YWN1dW0KCSAqIHRydW5jYXRpb24uCgkgKi8KCVJlbGF0 aW9uQ2xvc2VTbWdyKHJlbGF0aW9uKTsKCgkvKiBGcmVlIEFNIGNhY2hlZCBkYXRhLCBpZiBh bnkgKi8KCWlmIChyZWxhdGlvbi0+cmRfYW1jYWNoZSkKCQlwZnJlZShyZWxhdGlvbi0+cmRf YW1jYWNoZSk7CglyZWxhdGlvbi0+cmRfYW1jYWNoZSA9IE5VTEw7CgoJcmVsYXRpb24tPnJk X2lzdmFsaWQgPSBmYWxzZTsKfQoKLyoKICogUmVsYXRpb25DbGVhclJlbGF0aW9uIC0gcGh5 c2ljYWxseSBibG93IGF3YXkgYSByZWxhdGlvbiBjYWNoZSBlbnRyeQogKgogKiBUaGUgY2Fs bGVyIG11c3QgZW5zdXJlIHRoYXQgdGhlIGVudHJ5IGlzIG5vIGxvbmdlciBuZWVkZWQsIGku ZS4gaXRzCiAqIHJlZmVyZW5jZSBjb3VudCBpcyB6ZXJvLiAgQWxzbywgdGhlIHJlbCBvciBp dHMgc3RvcmFnZSBtdXN0IG5vdCBiZSBjcmVhdGVkCiAqIGluIHRoZSBjdXJyZW50IHRyYW5z YWN0aW9uIChyZF9jcmVhdGVTdWJpZCBhbmQgcmRfZmlyc3RSZWxmaWxlbG9jYXRvclN1Ymlk CiAqIG11c3Qgbm90IGJlIHNldCkuCiAqLwpzdGF0aWMgdm9pZApSZWxhdGlvbkNsZWFyUmVs YXRpb24oUmVsYXRpb24gcmVsYXRpb24pCnsKCUFzc2VydChSZWxhdGlvbkhhc1JlZmVyZW5j ZUNvdW50WmVybyhyZWxhdGlvbikpOwoJQXNzZXJ0KCFyZWxhdGlvbi0+cmRfaXNuYWlsZWQp OwoKCS8qCgkgKiBSZWxhdGlvbnMgY3JlYXRlZCBpbiB0aGUgc2FtZSB0cmFuc2FjdGlvbiBt dXN0IG5ldmVyIGJlIHJlbW92ZWQsIHNlZQoJICogUmVsYXRpb25GbHVzaFJlbGF0aW9uLgoJ ICovCglBc3NlcnQocmVsYXRpb24tPnJkX2NyZWF0ZVN1YmlkID09IEludmFsaWRTdWJUcmFu c2FjdGlvbklkKTsKCUFzc2VydChyZWxhdGlvbi0+cmRfZmlyc3RSZWxmaWxlbG9jYXRvclN1 YmlkID09IEludmFsaWRTdWJUcmFuc2FjdGlvbklkKTsKCUFzc2VydChyZWxhdGlvbi0+cmRf ZHJvcHBlZFN1YmlkID09IEludmFsaWRTdWJUcmFuc2FjdGlvbklkKTsKCgkvKiBmaXJzdCBt YXJrIGl0IGFzIGludmFsaWQgKi8KCVJlbGF0aW9uSW52YWxpZGF0ZVJlbGF0aW9uKHJlbGF0 aW9uKTsKCgkvKiBSZW1vdmUgaXQgZnJvbSB0aGUgaGFzaCB0YWJsZSAqLwoJUmVsYXRpb25D YWNoZURlbGV0ZShyZWxhdGlvbik7CgoJLyogQW5kIHJlbGVhc2Ugc3RvcmFnZSAqLwoJUmVs YXRpb25EZXN0cm95UmVsYXRpb24ocmVsYXRpb24sIGZhbHNlKTsKfQoKLyoKICogUmVsYXRp b25SZWJ1aWxkUmVsYXRpb24gLSByZWJ1aWxkIGEgcmVsYXRpb24gY2FjaGUgZW50cnkgaW4g cGxhY2UKICoKICogUmVzZXQgYW5kIHJlYnVpbGQgYSByZWxhdGlvbiBjYWNoZSBlbnRyeSBm cm9tIHNjcmF0Y2ggKHRoYXQgaXMsIGZyb20KICogY2F0YWxvZyBlbnRyaWVzKS4gIFRoaXMg aXMgdXNlZCB3aGVuIHdlIGFyZSBub3RpZmllZCBvZiBhIGNoYW5nZSB0byBhbiBvcGVuCiAq IHJlbGF0aW9uIChvbmUgd2l0aCByZWZjb3VudCA+IDApLiAgVGhlIGVudHJ5IGlzIHJlY29u c3RydWN0ZWQgd2l0aG91dAogKiBtb3ZpbmcgdGhlIHBoeXNpY2FsIFJlbGF0aW9uRGF0YSBy ZWNvcmQsIHNvIHRoYXQgdGhlIHJlZmNvdW50IGhvbGRlcidzCiAqIHBvaW50ZXIgaXMgc3Rp bGwgdmFsaWQuCiAqCiAqIE5COiB3aGVuIHJlYnVpbGRpbmcsIHdlJ2QgYmV0dGVyIGhvbGQg c29tZSBsb2NrIG9uIHRoZSByZWxhdGlvbiwgZWxzZSB0aGUKICogY2F0YWxvZyBkYXRhIHdl IG5lZWQgdG8gcmVhZCBjb3VsZCBiZSBjaGFuZ2luZyB1bmRlciB1cy4gIEFsc28sIGEgcmVs IHRvIGJlCiAqIHJlYnVpbHQgaGFkIGJldHRlciBoYXZlIHJlZmNudCA+IDAuICBUaGlzIGlz IGJlY2F1c2UgYSBzaW52YWwgcmVzZXQgY291bGQKICogaGFwcGVuIHdoaWxlIHdlJ3JlIGFj Y2Vzc2luZyB0aGUgY2F0YWxvZ3MsIGFuZCB0aGUgcmVsIHdvdWxkIGdldCBibG93biBhd2F5 CiAqIHVuZGVybmVhdGggdXMgYnkgUmVsYXRpb25DYWNoZUludmFsaWRhdGUgaWYgaXQgaGFz IHplcm8gcmVmY250LgogKi8Kc3RhdGljIHZvaWQKUmVsYXRpb25SZWJ1aWxkUmVsYXRpb24o UmVsYXRpb24gcmVsYXRpb24pCnsKCUFzc2VydCghUmVsYXRpb25IYXNSZWZlcmVuY2VDb3Vu dFplcm8ocmVsYXRpb24pKTsKCUFzc2VydENvdWxkR2V0UmVsYXRpb24oKTsKCS8qIHRoZXJl IGlzIG5vIHJlYXNvbiB0byBldmVyIHJlYnVpbGQgYSBkcm9wcGVkIHJlbGF0aW9uICovCglB c3NlcnQocmVsYXRpb24tPnJkX2Ryb3BwZWRTdWJpZCA9PSBJbnZhbGlkU3ViVHJhbnNhY3Rp b25JZCk7CgoJLyogQ2xvc2UgYW5kIG1hcmsgaXQgYXMgaW52YWxpZCB1bnRpbCB3ZSd2ZSBm aW5pc2hlZCB0aGUgcmVidWlsZCAqLwoJUmVsYXRpb25JbnZhbGlkYXRlUmVsYXRpb24ocmVs YXRpb24pOwoKCS8qCgkgKiBJbmRleGVzIG9ubHkgaGF2ZSBhIGxpbWl0ZWQgbnVtYmVyIG9m IHBvc3NpYmxlIHNjaGVtYSBjaGFuZ2VzLCBhbmQgd2UKCSAqIGRvbid0IHdhbnQgdG8gdXNl IHRoZSBmdWxsLWJsb3duIHByb2NlZHVyZSBiZWNhdXNlIGl0J3MgYSBoZWFkYWNoZSBmb3IK CSAqIGluZGV4ZXMgdGhhdCByZWxvYWQgaXRzZWxmIGRlcGVuZHMgb24uCgkgKgoJICogQXMg YW4gZXhjZXB0aW9uLCB1c2UgdGhlIGZ1bGwgcHJvY2VkdXJlIGlmIHRoZSBpbmRleCBhY2Nl c3MgaW5mbyBoYXNuJ3QKCSAqIGJlZW4gaW5pdGlhbGl6ZWQgeWV0LiAgSW5kZXggY3JlYXRp b24gcmVsaWVzIG9uIHRoYXQ6IGl0IGZpcnN0IGJ1aWxkcwoJICogdGhlIHJlbGNhY2hlIGVu dHJ5IHdpdGggUmVsYXRpb25CdWlsZExvY2FsUmVsYXRpb24oKSwgY3JlYXRlcyB0aGUKCSAq IHBnX2luZGV4IHR1cGxlIG9ubHkgYWZ0ZXIgdGhhdCwgYW5kIHRoZW4gcmVsaWVzIG9uCgkg KiBDb21tYW5kQ291bnRlckluY3JlbWVudCB0byBsb2FkIHRoZSBwZ19pbmRleCBjb250ZW50 cy4KCSAqLwoJaWYgKChyZWxhdGlvbi0+cmRfcmVsLT5yZWxraW5kID09IFJFTEtJTkRfSU5E RVggfHwKCQkgcmVsYXRpb24tPnJkX3JlbC0+cmVsa2luZCA9PSBSRUxLSU5EX1BBUlRJVElP TkVEX0lOREVYKSAmJgoJCXJlbGF0aW9uLT5yZF9pbmRleGN4dCAhPSBOVUxMKQoJewoJCVJl bGF0aW9uUmVsb2FkSW5kZXhJbmZvKHJlbGF0aW9uKTsKCQlyZXR1cm47Cgl9CgkvKiBOYWls ZWQgcmVsYXRpb25zIGFyZSBoYW5kbGVkIHNlcGFyYXRlbHkuICovCgllbHNlIGlmIChyZWxh dGlvbi0+cmRfaXNuYWlsZWQpCgl7CgkJUmVsYXRpb25SZWxvYWROYWlsZWQocmVsYXRpb24p OwoJCXJldHVybjsKCX0KCWVsc2UKCXsKCQkvKgoJCSAqIE91ciBzdHJhdGVneSBmb3IgcmVi dWlsZGluZyBhbiBvcGVuIHJlbGNhY2hlIGVudHJ5IGlzIHRvIGJ1aWxkIGEKCQkgKiBuZXcg ZW50cnkgZnJvbSBzY3JhdGNoLCBzd2FwIGl0cyBjb250ZW50cyB3aXRoIHRoZSBvbGQgZW50 cnksIGFuZAoJCSAqIGZpbmFsbHkgZGVsZXRlIHRoZSBuZXcgZW50cnkgKGFsb25nIHdpdGgg YW55IGluZnJhc3RydWN0dXJlIHN3YXBwZWQKCQkgKiBvdmVyIGZyb20gdGhlIG9sZCBlbnRy eSkuICBUaGlzIGlzIHRvIGF2b2lkIHRyb3VibGUgaW4gY2FzZSBhbgoJCSAqIGVycm9yIGNh dXNlcyB1cyB0byBsb3NlIGNvbnRyb2wgcGFydHdheSB0aHJvdWdoLiAgVGhlIG9sZCBlbnRy eQoJCSAqIHdpbGwgc3RpbGwgYmUgbWFya2VkICFyZF9pc3ZhbGlkLCBzbyB3ZSdsbCB0cnkg dG8gcmVidWlsZCBpdCBhZ2FpbgoJCSAqIG9uIG5leHQgYWNjZXNzLiAgTWVhbndoaWxlIGl0 J3Mgbm90IGFueSBsZXNzIHZhbGlkIHRoYW4gaXQgd2FzCgkJICogYmVmb3JlLCBzbyBhbnkg Y29kZSB0aGF0IG1pZ2h0IGV4cGVjdCB0byBjb250aW51ZSBhY2Nlc3NpbmcgaXQKCQkgKiBp c24ndCBodXJ0IGJ5IHRoZSByZWJ1aWxkIGZhaWx1cmUuICAoQ29uc2lkZXIgZm9yIGV4YW1w bGUgYQoJCSAqIHN1YnRyYW5zYWN0aW9uIHRoYXQgQUxURVJzIGEgdGFibGUgYW5kIHRoZW4g Z2V0cyBjYW5jZWxlZCBwYXJ0d2F5CgkJICogdGhyb3VnaCB0aGUgY2FjaGUgZW50cnkgcmVi dWlsZC4gIFRoZSBvdXRlciB0cmFuc2FjdGlvbiBzaG91bGQKCQkgKiBzdGlsbCBzZWUgdGhl IG5vdC1tb2RpZmllZCBjYWNoZSBlbnRyeSBhcyB2YWxpZC4pICBUaGUgd29yc3QKCQkgKiBj b25zZXF1ZW5jZSBvZiBhbiBlcnJvciBpcyBsZWFraW5nIHRoZSBuZWNlc3NhcmlseS11bnJl ZmVyZW5jZWQgbmV3CgkJICogZW50cnksIGFuZCB0aGlzIHNob3VsZG4ndCBoYXBwZW4gb2Z0 ZW4gZW5vdWdoIGZvciB0aGF0IHRvIGJlIGEgYmlnCgkJICogcHJvYmxlbS4KCQkgKgoJCSAq IFdoZW4gcmVidWlsZGluZyBhbiBvcGVuIHJlbGNhY2hlIGVudHJ5LCB3ZSBtdXN0IHByZXNl cnZlIHJlZiBjb3VudCwKCQkgKiByZF8qU3ViaWQsIGFuZCByZF90b2FzdG9pZCBzdGF0ZS4g IEFsc28gYXR0ZW1wdCB0byBwcmVzZXJ2ZSB0aGUKCQkgKiBwZ19jbGFzcyBlbnRyeSAocmRf cmVsKSwgdHVwbGVkZXNjLCByZXdyaXRlLXJ1bGUsIHBhcnRpdGlvbiBrZXksCgkJICogYW5k IHBhcnRpdGlvbiBkZXNjcmlwdG9yIHN1YnN0cnVjdHVyZXMgaW4gcGxhY2UsIGJlY2F1c2Ug dmFyaW91cwoJCSAqIHBsYWNlcyBhc3N1bWUgdGhhdCB0aGVzZSBzdHJ1Y3R1cmVzIHdvbid0 IG1vdmUgd2hpbGUgdGhleSBhcmUKCQkgKiB3b3JraW5nIHdpdGggYW4gb3BlbiByZWxjYWNo ZSBlbnRyeS4gIChOb3RlOiAgdGhlIHJlZmNvdW50CgkJICogbWVjaGFuaXNtIGZvciB0dXBs ZWRlc2NzIG1pZ2h0IHNvbWVkYXkgYWxsb3cgdXMgdG8gcmVtb3ZlIHRoaXMgaGFjawoJCSAq IGZvciB0aGUgdHVwbGVkZXNjLikKCQkgKgoJCSAqIE5vdGUgdGhhdCB0aGlzIHByb2Nlc3Mg ZG9lcyBub3QgdG91Y2ggQ3VycmVudFJlc291cmNlT3duZXI7IHdoaWNoCgkJICogaXMgZ29v ZCBiZWNhdXNlIHdoYXRldmVyIHJlZiBjb3VudHMgdGhlIGVudHJ5IG1heSBoYXZlIGRvIG5v dAoJCSAqIG5lY2Vzc2FyaWx5IGJlbG9uZyB0byB0aGF0IHJlc291cmNlIG93bmVyLgoJCSAq LwoJCVJlbGF0aW9uCW5ld3JlbDsKCQlPaWQJCQlzYXZlX3JlbGlkID0gUmVsYXRpb25HZXRS ZWxpZChyZWxhdGlvbik7CgkJYm9vbAkJa2VlcF90dXBkZXNjOwoJCWJvb2wJCWtlZXBfcnVs ZXM7CgkJYm9vbAkJa2VlcF9wb2xpY2llczsKCQlib29sCQlrZWVwX3BhcnRrZXk7CgoJCS8q IEJ1aWxkIHRlbXBvcmFyeSBlbnRyeSwgYnV0IGRvbid0IGxpbmsgaXQgaW50byBoYXNodGFi bGUgKi8KCQluZXdyZWwgPSBSZWxhdGlvbkJ1aWxkRGVzYyhzYXZlX3JlbGlkLCBmYWxzZSk7 CgoJCS8qCgkJICogQmV0d2VlbiBoZXJlIGFuZCB0aGUgZW5kIG9mIHRoZSBzd2FwLCBkb24n dCBhZGQgY29kZSB0aGF0IGRvZXMgb3IKCQkgKiByZWFzb25hYmx5IGNvdWxkIHJlYWQgc3lz dGVtIGNhdGFsb2dzLiAgVGhhdCByYW5nZSBtdXN0IGJlIGZyZWUKCQkgKiBmcm9tIGludmFs aWRhdGlvbiBwcm9jZXNzaW5nLiAgU2VlIFJlbGF0aW9uQnVpbGREZXNjKCkgbWFuaXB1bGF0 aW9uCgkJICogb2YgaW5fcHJvZ3Jlc3NfbGlzdC4KCQkgKi8KCgkJaWYgKG5ld3JlbCA9PSBO VUxMKQoJCXsKCQkJLyoKCQkJICogV2UgY2FuIHZhbGlkbHkgZ2V0IGhlcmUsIGlmIHdlJ3Jl IHVzaW5nIGEgaGlzdG9yaWMgc25hcHNob3QgaW4KCQkJICogd2hpY2ggYSByZWxhdGlvbiwg YWNjZXNzZWQgZnJvbSBvdXRzaWRlIGxvZ2ljYWwgZGVjb2RpbmcsIGlzCgkJCSAqIHN0aWxs IGludmlzaWJsZS4gSW4gdGhhdCBjYXNlIGl0J3MgZmluZSB0byBqdXN0IG1hcmsgdGhlCgkJ CSAqIHJlbGF0aW9uIGFzIGludmFsaWQgYW5kIHJldHVybiAtIGl0J2xsIGZ1bGx5IGdldCBy ZWxvYWRlZCBieQoJCQkgKiB0aGUgY2FjaGUgcmVzZXQgYXQgdGhlIGVuZCBvZiBsb2dpY2Fs IGRlY29kaW5nIChvciBhdCB0aGUgbmV4dAoJCQkgKiBhY2Nlc3MpLiAgRHVyaW5nIG5vcm1h bCBwcm9jZXNzaW5nIHdlIGRvbid0IHdhbnQgdG8gaWdub3JlIHRoaXMKCQkJICogY2FzZSBh cyBpdCBzaG91bGRuJ3QgaGFwcGVuIHRoZXJlLCBhcyBleHBsYWluZWQgYmVsb3cuCgkJCSAq LwoJCQlpZiAoSGlzdG9yaWNTbmFwc2hvdEFjdGl2ZSgpKQoJCQkJcmV0dXJuOwoKCQkJLyoK CQkJICogVGhpcyBzaG91bGRuJ3QgaGFwcGVuIGFzIGRyb3BwaW5nIGEgcmVsYXRpb24gaXMg aW50ZW5kZWQgdG8gYmUKCQkJICogaW1wb3NzaWJsZSBpZiBzdGlsbCByZWZlcmVuY2VkIChj Zi4gQ2hlY2tUYWJsZU5vdEluVXNlKCkpLiBCdXQKCQkJICogaWYgd2UgZ2V0IGhlcmUgYW55 d2F5LCB3ZSBjYW4ndCBqdXN0IGRlbGV0ZSB0aGUgcmVsY2FjaGUgZW50cnksCgkJCSAqIGFz IGl0IHBvc3NpYmx5IGNvdWxkIGdldCBhY2Nlc3NlZCBsYXRlciAoYXMgZS5nLiB0aGUgZXJy b3IKCQkJICogbWlnaHQgZ2V0IHRyYXBwZWQgYW5kIGhhbmRsZWQgdmlhIGEgc3VidHJhbnNh Y3Rpb24gcm9sbGJhY2spLgoJCQkgKi8KCQkJZWxvZyhFUlJPUiwgInJlbGF0aW9uICV1IGRl bGV0ZWQgd2hpbGUgc3RpbGwgaW4gdXNlIiwgc2F2ZV9yZWxpZCk7CgkJfQoKCQkvKgoJCSAq IElmIHdlIHdlcmUgdG8sIGFnYWluLCBoYXZlIGNhc2VzIG9mIHRoZSByZWxraW5kIG9mIGEg cmVsY2FjaGUgZW50cnkKCQkgKiBjaGFuZ2luZywgd2Ugd291bGQgbmVlZCB0byBlbnN1cmUg dGhhdCBwZ3N0YXRzIGRvZXMgbm90IGdldAoJCSAqIGNvbmZ1c2VkLgoJCSAqLwoJCUFzc2Vy dChyZWxhdGlvbi0+cmRfcmVsLT5yZWxraW5kID09IG5ld3JlbC0+cmRfcmVsLT5yZWxraW5k KTsKCgkJa2VlcF90dXBkZXNjID0gZXF1YWxUdXBsZURlc2NzKHJlbGF0aW9uLT5yZF9hdHQs IG5ld3JlbC0+cmRfYXR0KTsKCQlrZWVwX3J1bGVzID0gZXF1YWxSdWxlTG9ja3MocmVsYXRp b24tPnJkX3J1bGVzLCBuZXdyZWwtPnJkX3J1bGVzKTsKCQlrZWVwX3BvbGljaWVzID0gZXF1 YWxSU0Rlc2MocmVsYXRpb24tPnJkX3JzZGVzYywgbmV3cmVsLT5yZF9yc2Rlc2MpOwoJCS8q IHBhcnRrZXkgaXMgaW1tdXRhYmxlIG9uY2Ugc2V0IHVwLCBzbyB3ZSBjYW4gYWx3YXlzIGtl ZXAgaXQgKi8KCQlrZWVwX3BhcnRrZXkgPSAocmVsYXRpb24tPnJkX3BhcnRrZXkgIT0gTlVM TCk7CgoJCS8qCgkJICogUGVyZm9ybSBzd2FwcGluZyBvZiB0aGUgcmVsY2FjaGUgZW50cnkg Y29udGVudHMuICBXaXRoaW4gdGhpcwoJCSAqIHByb2Nlc3MgdGhlIG9sZCBlbnRyeSBpcyBt b21lbnRhcmlseSBpbnZhbGlkLCBzbyB0aGVyZSAqbXVzdCogYmUgbm8KCQkgKiBwb3NzaWJp bGl0eSBvZiBDSEVDS19GT1JfSU5URVJSVVBUUyB3aXRoaW4gdGhpcyBzZXF1ZW5jZS4gRG8g aXQgaW4KCQkgKiBhbGwtaW4tbGluZSBjb2RlIGZvciBzYWZldHkuCgkJICoKCQkgKiBTaW5j ZSB0aGUgdmFzdCBtYWpvcml0eSBvZiBmaWVsZHMgc2hvdWxkIGJlIHN3YXBwZWQsIG91ciBt ZXRob2QgaXMKCQkgKiB0byBzd2FwIHRoZSB3aG9sZSBzdHJ1Y3R1cmVzIGFuZCB0aGVuIHJl LXN3YXAgdGhvc2UgZmV3IGZpZWxkcyB3ZQoJCSAqIGRpZG4ndCB3YW50IHN3YXBwZWQuCgkJ ICovCiNkZWZpbmUgU1dBUEZJRUxEKGZsZHR5cGUsIGZsZG5hbWUpIFwKCQlkbyB7IFwKCQkJ ZmxkdHlwZSBfdG1wID0gbmV3cmVsLT5mbGRuYW1lOyBcCgkJCW5ld3JlbC0+ZmxkbmFtZSA9 IHJlbGF0aW9uLT5mbGRuYW1lOyBcCgkJCXJlbGF0aW9uLT5mbGRuYW1lID0gX3RtcDsgXAoJ CX0gd2hpbGUgKDApCgoJCS8qIHN3YXAgYWxsIFJlbGF0aW9uIHN0cnVjdCBmaWVsZHMgKi8K CQl7CgkJCVJlbGF0aW9uRGF0YSB0bXBzdHJ1Y3Q7CgoJCQltZW1jcHkoJnRtcHN0cnVjdCwg bmV3cmVsLCBzaXplb2YoUmVsYXRpb25EYXRhKSk7CgkJCW1lbWNweShuZXdyZWwsIHJlbGF0 aW9uLCBzaXplb2YoUmVsYXRpb25EYXRhKSk7CgkJCW1lbWNweShyZWxhdGlvbiwgJnRtcHN0 cnVjdCwgc2l6ZW9mKFJlbGF0aW9uRGF0YSkpOwoJCX0KCgkJLyogcmRfc21nciBtdXN0IG5v dCBiZSBzd2FwcGVkLCBkdWUgdG8gYmFjay1saW5rcyBmcm9tIHNtZ3IgbGV2ZWwgKi8KCQlT V0FQRklFTEQoU01nclJlbGF0aW9uLCByZF9zbWdyKTsKCQkvKiByZF9yZWZjbnQgbXVzdCBi ZSBwcmVzZXJ2ZWQgKi8KCQlTV0FQRklFTEQoaW50LCByZF9yZWZjbnQpOwoJCS8qIGlzbmFp bGVkIHNob3VsZG4ndCBjaGFuZ2UgKi8KCQlBc3NlcnQobmV3cmVsLT5yZF9pc25haWxlZCA9 PSByZWxhdGlvbi0+cmRfaXNuYWlsZWQpOwoJCS8qIGNyZWF0aW9uIHN1Yi1YSURzIG11c3Qg YmUgcHJlc2VydmVkICovCgkJU1dBUEZJRUxEKFN1YlRyYW5zYWN0aW9uSWQsIHJkX2NyZWF0 ZVN1YmlkKTsKCQlTV0FQRklFTEQoU3ViVHJhbnNhY3Rpb25JZCwgcmRfbmV3UmVsZmlsZWxv Y2F0b3JTdWJpZCk7CgkJU1dBUEZJRUxEKFN1YlRyYW5zYWN0aW9uSWQsIHJkX2ZpcnN0UmVs ZmlsZWxvY2F0b3JTdWJpZCk7CgkJU1dBUEZJRUxEKFN1YlRyYW5zYWN0aW9uSWQsIHJkX2Ry b3BwZWRTdWJpZCk7CgkJLyogdW4tc3dhcCByZF9yZWwgcG9pbnRlcnMsIHN3YXAgY29udGVu dHMgaW5zdGVhZCAqLwoJCVNXQVBGSUVMRChGb3JtX3BnX2NsYXNzLCByZF9yZWwpOwoJCS8q IC4uLiBidXQgYWN0dWFsbHksIHdlIGRvbid0IGhhdmUgdG8gdXBkYXRlIG5ld3JlbC0+cmRf cmVsICovCgkJbWVtY3B5KHJlbGF0aW9uLT5yZF9yZWwsIG5ld3JlbC0+cmRfcmVsLCBDTEFT U19UVVBMRV9TSVpFKTsKCQkvKiBwcmVzZXJ2ZSBvbGQgdHVwbGVkZXNjLCBydWxlcywgcG9s aWNpZXMgaWYgbm8gbG9naWNhbCBjaGFuZ2UgKi8KCQlpZiAoa2VlcF90dXBkZXNjKQoJCQlT V0FQRklFTEQoVHVwbGVEZXNjLCByZF9hdHQpOwoJCWlmIChrZWVwX3J1bGVzKQoJCXsKCQkJ U1dBUEZJRUxEKFJ1bGVMb2NrICosIHJkX3J1bGVzKTsKCQkJU1dBUEZJRUxEKE1lbW9yeUNv bnRleHQsIHJkX3J1bGVzY3h0KTsKCQl9CgkJaWYgKGtlZXBfcG9saWNpZXMpCgkJCVNXQVBG SUVMRChSb3dTZWN1cml0eURlc2MgKiwgcmRfcnNkZXNjKTsKCQkvKiB0b2FzdCBPSUQgb3Zl cnJpZGUgbXVzdCBiZSBwcmVzZXJ2ZWQgKi8KCQlTV0FQRklFTEQoT2lkLCByZF90b2FzdG9p ZCk7CgkJLyogcGdzdGF0X2luZm8gLyBlbmFibGVkIG11c3QgYmUgcHJlc2VydmVkICovCgkJ U1dBUEZJRUxEKHN0cnVjdCBQZ1N0YXRfVGFibGVTdGF0dXMgKiwgcGdzdGF0X2luZm8pOwoJ CVNXQVBGSUVMRChib29sLCBwZ3N0YXRfZW5hYmxlZCk7CgkJLyogcHJlc2VydmUgb2xkIHBh cnRpdGlvbiBrZXkgaWYgd2UgaGF2ZSBvbmUgKi8KCQlpZiAoa2VlcF9wYXJ0a2V5KQoJCXsK CQkJU1dBUEZJRUxEKFBhcnRpdGlvbktleSwgcmRfcGFydGtleSk7CgkJCVNXQVBGSUVMRChN ZW1vcnlDb250ZXh0LCByZF9wYXJ0a2V5Y3h0KTsKCQl9CgkJaWYgKG5ld3JlbC0+cmRfcGRj eHQgIT0gTlVMTCB8fCBuZXdyZWwtPnJkX3BkZGN4dCAhPSBOVUxMKQoJCXsKCQkJLyoKCQkJ ICogV2UgYXJlIHJlYnVpbGRpbmcgYSBwYXJ0aXRpb25lZCByZWxhdGlvbiB3aXRoIGEgbm9u LXplcm8KCQkJICogcmVmZXJlbmNlIGNvdW50LCBzbyB3ZSBtdXN0IGtlZXAgdGhlIG9sZCBw YXJ0aXRpb24gZGVzY3JpcHRvcgoJCQkgKiBhcm91bmQsIGluIGNhc2UgdGhlcmUncyBhIFBh cnRpdGlvbkRpcmVjdG9yeSB3aXRoIGEgcG9pbnRlciB0bwoJCQkgKiBpdC4gIFRoaXMgbWVh bnMgd2UgY2FuJ3QgZnJlZSB0aGUgb2xkIHJkX3BkY3h0IHlldC4gIChUaGlzIGlzCgkJCSAq IG5lY2Vzc2FyeSBiZWNhdXNlIFJlbGF0aW9uR2V0UGFydGl0aW9uRGVzYyBoYW5kcyBvdXQg ZGlyZWN0CgkJCSAqIHBvaW50ZXJzIHRvIHRoZSByZWxjYWNoZSdzIGRhdGEgc3RydWN0dXJl LCB1bmxpa2Ugb3VyIHVzdWFsCgkJCSAqIHByYWN0aWNlIHdoaWNoIGlzIHRvIGhhbmQgb3V0 IGNvcGllcy4gIFdlJ2QgaGF2ZSB0aGUgc2FtZQoJCQkgKiBwcm9ibGVtIHdpdGggcmRfcGFy dGtleSwgZXhjZXB0IHRoYXQgd2UgYWx3YXlzIHByZXNlcnZlIHRoYXQKCQkJICogb25jZSBj cmVhdGVkLikKCQkJICoKCQkJICogVG8gZW5zdXJlIHRoYXQgaXQncyBub3QgbGVha2VkIGNv bXBsZXRlbHksIHJlLWF0dGFjaCBpdCB0byB0aGUKCQkJICogbmV3IHJlbGRlc2MsIG9yIG1h a2UgaXQgYSBjaGlsZCBvZiB0aGUgbmV3IHJlbGRlc2MncyByZF9wZGN4dAoJCQkgKiBpbiB0 aGUgdW5saWtlbHkgZXZlbnQgdGhhdCB0aGVyZSBpcyBvbmUgYWxyZWFkeS4gIChDb21wYXJl IGhhY2sKCQkJICogaW4gUmVsYXRpb25CdWlsZFBhcnRpdGlvbkRlc2MuKSAgUmVsYXRpb25D bG9zZSB3aWxsIGNsZWFuIHVwCgkJCSAqIGFueSBzdWNoIGNvbnRleHRzIG9uY2UgdGhlIHJl ZmVyZW5jZSBjb3VudCByZWFjaGVzIHplcm8uCgkJCSAqCgkJCSAqIEluIHRoZSBjYXNlIHdo ZXJlIHRoZSByZWZlcmVuY2UgY291bnQgaXMgemVybywgdGhpcyBjb2RlIGlzIG5vdAoJCQkg KiByZWFjaGVkLCB3aGljaCBzaG91bGQgYmUgT0sgYmVjYXVzZSBpbiB0aGF0IGNhc2UgdGhl cmUgc2hvdWxkCgkJCSAqIGJlIG5vIFBhcnRpdGlvbkRpcmVjdG9yeSB3aXRoIGEgcG9pbnRl ciB0byB0aGUgb2xkIGVudHJ5LgoJCQkgKgoJCQkgKiBOb3RlIHRoYXQgbmV3cmVsIGFuZCBy ZWxhdGlvbiBoYXZlIGFscmVhZHkgYmVlbiBzd2FwcGVkLCBzbyB0aGUKCQkJICogIm9sZCIg cGFydGl0aW9uIGRlc2NyaXB0b3IgaXMgYWN0dWFsbHkgdGhlIG9uZSBoYW5naW5nIG9mZiBv ZgoJCQkgKiBuZXdyZWwuCgkJCSAqLwoJCQlyZWxhdGlvbi0+cmRfcGFydGRlc2MgPSBOVUxM OwkvKiBlbnN1cmUgcmRfcGFydGRlc2MgaXMgaW52YWxpZCAqLwoJCQlyZWxhdGlvbi0+cmRf cGFydGRlc2Nfbm9kZXRhY2hlZCA9IE5VTEw7CgkJCXJlbGF0aW9uLT5yZF9wYXJ0ZGVzY19u b2RldGFjaGVkX3htaW4gPSBJbnZhbGlkVHJhbnNhY3Rpb25JZDsKCQkJaWYgKHJlbGF0aW9u LT5yZF9wZGN4dCAhPSBOVUxMKSAvKiBwcm9iYWJseSBuZXZlciBoYXBwZW5zICovCgkJCQlN ZW1vcnlDb250ZXh0U2V0UGFyZW50KG5ld3JlbC0+cmRfcGRjeHQsIHJlbGF0aW9uLT5yZF9w ZGN4dCk7CgkJCWVsc2UKCQkJCXJlbGF0aW9uLT5yZF9wZGN4dCA9IG5ld3JlbC0+cmRfcGRj eHQ7CgkJCWlmIChyZWxhdGlvbi0+cmRfcGRkY3h0ICE9IE5VTEwpCgkJCQlNZW1vcnlDb250 ZXh0U2V0UGFyZW50KG5ld3JlbC0+cmRfcGRkY3h0LCByZWxhdGlvbi0+cmRfcGRkY3h0KTsK CQkJZWxzZQoJCQkJcmVsYXRpb24tPnJkX3BkZGN4dCA9IG5ld3JlbC0+cmRfcGRkY3h0OwoJ CQkvKiBkcm9wIG5ld3JlbCdzIHBvaW50ZXJzIHNvIHdlIGRvbid0IGRlc3Ryb3kgaXQgYmVs b3cgKi8KCQkJbmV3cmVsLT5yZF9wYXJ0ZGVzYyA9IE5VTEw7CgkJCW5ld3JlbC0+cmRfcGFy dGRlc2Nfbm9kZXRhY2hlZCA9IE5VTEw7CgkJCW5ld3JlbC0+cmRfcGFydGRlc2Nfbm9kZXRh Y2hlZF94bWluID0gSW52YWxpZFRyYW5zYWN0aW9uSWQ7CgkJCW5ld3JlbC0+cmRfcGRjeHQg PSBOVUxMOwoJCQluZXdyZWwtPnJkX3BkZGN4dCA9IE5VTEw7CgkJfQoKI3VuZGVmIFNXQVBG SUVMRAoKCQkvKiBBbmQgbm93IHdlIGNhbiB0aHJvdyBhd2F5IHRoZSB0ZW1wb3JhcnkgZW50 cnkgKi8KCQlSZWxhdGlvbkRlc3Ryb3lSZWxhdGlvbihuZXdyZWwsICFrZWVwX3R1cGRlc2Mp OwoJfQp9CgovKgogKiBSZWxhdGlvbkZsdXNoUmVsYXRpb24KICoKICoJIFJlYnVpbGQgdGhl IHJlbGF0aW9uIGlmIGl0IGlzIG9wZW4gKHJlZmNvdW50ID4gMCksIGVsc2UgYmxvdyBpdCBh d2F5LgogKgkgVGhpcyBpcyB1c2VkIHdoZW4gd2UgcmVjZWl2ZSBhIGNhY2hlIGludmFsaWRh dGlvbiBldmVudCBmb3IgdGhlIHJlbC4KICovCnN0YXRpYyB2b2lkClJlbGF0aW9uRmx1c2hS ZWxhdGlvbihSZWxhdGlvbiByZWxhdGlvbikKewoJaWYgKHJlbGF0aW9uLT5yZF9jcmVhdGVT dWJpZCAhPSBJbnZhbGlkU3ViVHJhbnNhY3Rpb25JZCB8fAoJCXJlbGF0aW9uLT5yZF9maXJz dFJlbGZpbGVsb2NhdG9yU3ViaWQgIT0gSW52YWxpZFN1YlRyYW5zYWN0aW9uSWQpCgl7CgkJ LyoKCQkgKiBOZXcgcmVsY2FjaGUgZW50cmllcyBhcmUgYWx3YXlzIHJlYnVpbHQsIG5vdCBm bHVzaGVkOyBlbHNlIHdlJ2QKCQkgKiBmb3JnZXQgdGhlICJuZXciIHN0YXR1cyBvZiB0aGUg cmVsYXRpb24uICBEaXR0byBmb3IgdGhlCgkJICogbmV3LXJlbGZpbGVudW1iZXIgc3RhdHVz LgoJCSAqLwoJCWlmIChJc1RyYW5zYWN0aW9uU3RhdGUoKSAmJiByZWxhdGlvbi0+cmRfZHJv cHBlZFN1YmlkID09IEludmFsaWRTdWJUcmFuc2FjdGlvbklkKQoJCXsKCQkJLyoKCQkJICog VGhlIHJlbCBjb3VsZCBoYXZlIHplcm8gcmVmY250IGhlcmUsIHNvIHRlbXBvcmFyaWx5IGlu Y3JlbWVudAoJCQkgKiB0aGUgcmVmY250IHRvIGVuc3VyZSBpdCdzIHNhZmUgdG8gcmVidWls ZCBpdC4gIFdlIGNhbiBhc3N1bWUKCQkJICogdGhhdCB0aGUgY3VycmVudCB0cmFuc2FjdGlv biBoYXMgc29tZSBsb2NrIG9uIHRoZSByZWwgYWxyZWFkeS4KCQkJICovCgkJCVJlbGF0aW9u SW5jcmVtZW50UmVmZXJlbmNlQ291bnQocmVsYXRpb24pOwoJCQlSZWxhdGlvblJlYnVpbGRS ZWxhdGlvbihyZWxhdGlvbik7CgkJCVJlbGF0aW9uRGVjcmVtZW50UmVmZXJlbmNlQ291bnQo cmVsYXRpb24pOwoJCX0KCQllbHNlCgkJCVJlbGF0aW9uSW52YWxpZGF0ZVJlbGF0aW9uKHJl bGF0aW9uKTsKCX0KCWVsc2UKCXsKCQkvKgoJCSAqIFByZS1leGlzdGluZyByZWxzIGNhbiBi ZSBkcm9wcGVkIGZyb20gdGhlIHJlbGNhY2hlIGlmIG5vdCBvcGVuLgoJCSAqCgkJICogSWYg dGhlIGVudHJ5IGlzIGluIHVzZSwgcmVidWlsZCBpdCBpZiBwb3NzaWJsZS4gIElmIHdlJ3Jl IG5vdAoJCSAqIGluc2lkZSBhIHZhbGlkIHRyYW5zYWN0aW9uLCB3ZSBjYW4ndCBkbyBhbnkg Y2F0YWxvZyBhY2Nlc3Mgc28gaXQncwoJCSAqIG5vdCBwb3NzaWJsZSB0byByZWJ1aWxkIHll dC4gIEp1c3QgbWFyayBpdCBhcyBpbnZhbGlkIGluIHRoYXQgY2FzZSwKCQkgKiBzbyB0aGF0 IHRoZSByZWJ1aWxkIHdpbGwgb2NjdXIgd2hlbiB0aGUgZW50cnkgaXMgbmV4dCBvcGVuZWQu CgkJICoKCQkgKiBOb3RlOiBpdCdzIHBvc3NpYmxlIHRoYXQgd2UgY29tZSBoZXJlIGR1cmlu ZyBzdWJ0cmFuc2FjdGlvbiBhYm9ydCwKCQkgKiBhbmQgdGhlIHJlYXNvbiBmb3Igd2FudGlu ZyB0byByZWJ1aWxkIGlzIHRoYXQgdGhlIHJlbCBpcyBvcGVuIGluCgkJICogdGhlIG91dGVy IHRyYW5zYWN0aW9uLiAgSW4gdGhhdCBjYXNlIGl0IG1pZ2h0IHNlZW0gdW5zYWZlIHRvIG5v dAoJCSAqIHJlYnVpbGQgaW1tZWRpYXRlbHksIHNpbmNlIHdoYXRldmVyIGNvZGUgaGFzIHRo ZSByZWwgYWxyZWFkeSBvcGVuCgkJICogd2lsbCBrZWVwIG9uIHVzaW5nIHRoZSByZWxjYWNo ZSBlbnRyeSBhcy1pcy4gIEhvd2V2ZXIsIGluIHN1Y2ggYQoJCSAqIGNhc2UgdGhlIG91dGVy IHRyYW5zYWN0aW9uIHNob3VsZCBiZSBob2xkaW5nIGEgbG9jayB0aGF0J3MKCQkgKiBzdWZm aWNpZW50IHRvIHByZXZlbnQgYW55IHNpZ25pZmljYW50IGNoYW5nZSBpbiB0aGUgcmVsJ3Mg c2NoZW1hLAoJCSAqIHNvIHRoZSBleGlzdGluZyBlbnRyeSBjb250ZW50cyBzaG91bGQgYmUg Z29vZCBlbm91Z2ggZm9yIGl0cwoJCSAqIHB1cnBvc2VzOyBhdCB3b3JzdCB3ZSBtaWdodCBi ZSBiZWhpbmQgb24gc3RhdGlzdGljcyB1cGRhdGVzIG9yIHRoZQoJCSAqIGxpa2UuICAoU2Vl IGFsc28gQ2hlY2tUYWJsZU5vdEluVXNlKCkgYW5kIGl0cyBjYWxsZXJzLikKCQkgKi8KCQlp ZiAoUmVsYXRpb25IYXNSZWZlcmVuY2VDb3VudFplcm8ocmVsYXRpb24pKQoJCQlSZWxhdGlv bkNsZWFyUmVsYXRpb24ocmVsYXRpb24pOwoJCWVsc2UgaWYgKCFJc1RyYW5zYWN0aW9uU3Rh dGUoKSkKCQkJUmVsYXRpb25JbnZhbGlkYXRlUmVsYXRpb24ocmVsYXRpb24pOwoJCWVsc2Ug aWYgKHJlbGF0aW9uLT5yZF9pc25haWxlZCAmJiByZWxhdGlvbi0+cmRfcmVmY250ID09IDEp CgkJewoJCQkvKgoJCQkgKiBBIG5haWxlZCByZWxhdGlvbiB3aXRoIHJlZmNudCA9PSAxIGlz IHVudXNlZC4gIFdlIGNhbm5vdCBjbGVhcgoJCQkgKiBpdCwgYnV0IHRoZXJlJ3MgYWxzbyBu byBuZWVkIG5vIG5lZWQgdG8gcmVidWlsZCBpdCBpbW1lZGlhdGVseS4KCQkJICovCgkJCVJl bGF0aW9uSW52YWxpZGF0ZVJlbGF0aW9uKHJlbGF0aW9uKTsKCQl9CgkJZWxzZQoJCQlSZWxh dGlvblJlYnVpbGRSZWxhdGlvbihyZWxhdGlvbik7Cgl9Cn0KCi8qCiAqIFJlbGF0aW9uRm9y Z2V0UmVsYXRpb24gLSBjYWxsZXIgcmVwb3J0cyB0aGF0IGl0IGRyb3BwZWQgdGhlIHJlbGF0 aW9uCiAqLwp2b2lkClJlbGF0aW9uRm9yZ2V0UmVsYXRpb24oT2lkIHJpZCkKewoJUmVsYXRp b24JcmVsYXRpb247CgoJUmVsYXRpb25JZENhY2hlTG9va3VwKHJpZCwgcmVsYXRpb24pOwoK CWlmICghcmVsYXRpb24pCgkJcmV0dXJuOwkJCQkJLyogbm90IGluIGNhY2hlLCBub3RoaW5n IHRvIGRvICovCgoJaWYgKCFSZWxhdGlvbkhhc1JlZmVyZW5jZUNvdW50WmVybyhyZWxhdGlv bikpCgkJZWxvZyhFUlJPUiwgInJlbGF0aW9uICV1IGlzIHN0aWxsIG9wZW4iLCByaWQpOwoK CUFzc2VydChyZWxhdGlvbi0+cmRfZHJvcHBlZFN1YmlkID09IEludmFsaWRTdWJUcmFuc2Fj dGlvbklkKTsKCWlmIChyZWxhdGlvbi0+cmRfY3JlYXRlU3ViaWQgIT0gSW52YWxpZFN1YlRy YW5zYWN0aW9uSWQgfHwKCQlyZWxhdGlvbi0+cmRfZmlyc3RSZWxmaWxlbG9jYXRvclN1Ymlk ICE9IEludmFsaWRTdWJUcmFuc2FjdGlvbklkKQoJewoJCS8qCgkJICogSW4gdGhlIGV2ZW50 IG9mIHN1YnRyYW5zYWN0aW9uIHJvbGxiYWNrLCB3ZSBtdXN0IG5vdCBmb3JnZXQKCQkgKiBy ZF8qU3ViaWQuICBNYXJrIHRoZSBlbnRyeSAiZHJvcHBlZCIgYW5kIGludmFsaWRhdGUgaXQs IGluc3RlYWQgb2YKCQkgKiBkZXN0cm95aW5nIGl0IHJpZ2h0IGF3YXkuICAoSWYgd2UncmUg aW4gYSB0b3AgdHJhbnNhY3Rpb24sIHdlIGNvdWxkCgkJICogb3B0IHRvIGRlc3Ryb3kgdGhl IGVudHJ5LikKCQkgKi8KCQlyZWxhdGlvbi0+cmRfZHJvcHBlZFN1YmlkID0gR2V0Q3VycmVu dFN1YlRyYW5zYWN0aW9uSWQoKTsKCQlSZWxhdGlvbkludmFsaWRhdGVSZWxhdGlvbihyZWxh dGlvbik7Cgl9CgllbHNlCgkJUmVsYXRpb25DbGVhclJlbGF0aW9uKHJlbGF0aW9uKTsKfQoK LyoKICoJCVJlbGF0aW9uQ2FjaGVJbnZhbGlkYXRlRW50cnkKICoKICoJCVRoaXMgcm91dGlu ZSBpcyBpbnZva2VkIGZvciBTSSBjYWNoZSBmbHVzaCBtZXNzYWdlcy4KICoKICogQW55IHJl bGNhY2hlIGVudHJ5IG1hdGNoaW5nIHRoZSByZWxpZCBtdXN0IGJlIGZsdXNoZWQuICAoTm90 ZTogY2FsbGVyIGhhcwogKiBhbHJlYWR5IGRldGVybWluZWQgdGhhdCB0aGUgcmVsaWQgYmVs b25ncyB0byBvdXIgZGF0YWJhc2Ugb3IgaXMgYSBzaGFyZWQKICogcmVsYXRpb24uKQogKgog KiBXZSB1c2VkIHRvIHNraXAgbG9jYWwgcmVsYXRpb25zLCBvbiB0aGUgZ3JvdW5kcyB0aGF0 IHRoZXkgY291bGQKICogbm90IGJlIHRhcmdldHMgb2YgY3Jvc3MtYmFja2VuZCBTSSB1cGRh dGUgbWVzc2FnZXM7IGJ1dCBpdCBzZWVtcwogKiBzYWZlciB0byBwcm9jZXNzIHRoZW0sIHNv IHRoYXQgb3VyICpvd24qIFNJIHVwZGF0ZSBtZXNzYWdlcyB3aWxsCiAqIGhhdmUgdGhlIHNh bWUgZWZmZWN0cyBkdXJpbmcgQ29tbWFuZENvdW50ZXJJbmNyZW1lbnQgZm9yIGJvdGgKICog bG9jYWwgYW5kIG5vbmxvY2FsIHJlbGF0aW9ucy4KICovCnZvaWQKUmVsYXRpb25DYWNoZUlu dmFsaWRhdGVFbnRyeShPaWQgcmVsYXRpb25JZCkKewoJUmVsYXRpb24JcmVsYXRpb247CgoJ UmVsYXRpb25JZENhY2hlTG9va3VwKHJlbGF0aW9uSWQsIHJlbGF0aW9uKTsKCglpZiAocmVs YXRpb24pCgl7CgkJcmVsY2FjaGVJbnZhbHNSZWNlaXZlZCsrOwoJCVJlbGF0aW9uRmx1c2hS ZWxhdGlvbihyZWxhdGlvbik7Cgl9CgllbHNlCgl7CgkJaW50CQkJaTsKCgkJZm9yIChpID0g MDsgaSA8IGluX3Byb2dyZXNzX2xpc3RfbGVuOyBpKyspCgkJCWlmIChpbl9wcm9ncmVzc19s aXN0W2ldLnJlbG9pZCA9PSByZWxhdGlvbklkKQoJCQkJaW5fcHJvZ3Jlc3NfbGlzdFtpXS5p bnZhbGlkYXRlZCA9IHRydWU7Cgl9Cn0KCi8qCiAqIFJlbGF0aW9uQ2FjaGVJbnZhbGlkYXRl CiAqCSBCbG93IGF3YXkgY2FjaGVkIHJlbGF0aW9uIGRlc2NyaXB0b3JzIHRoYXQgaGF2ZSB6 ZXJvIHJlZmVyZW5jZSBjb3VudHMsCiAqCSBhbmQgcmVidWlsZCB0aG9zZSB3aXRoIHBvc2l0 aXZlIHJlZmVyZW5jZSBjb3VudHMuICBBbHNvIHJlc2V0IHRoZSBzbWdyCiAqCSByZWxhdGlv biBjYWNoZSBhbmQgcmUtcmVhZCByZWxhdGlvbiBtYXBwaW5nIGRhdGEuCiAqCiAqCSBBcGFy dCBmcm9tIGRlYnVnX2Rpc2NhcmRfY2FjaGVzLCB0aGlzIGlzIGN1cnJlbnRseSB1c2VkIG9u bHkgdG8gcmVjb3ZlcgogKgkgZnJvbSBTSSBtZXNzYWdlIGJ1ZmZlciBvdmVyZmxvdywgc28g d2UgZG8gbm90IHRvdWNoIHJlbGF0aW9ucyBoYXZpbmcKICoJIG5ldy1pbi10cmFuc2FjdGlv biByZWxmaWxlbnVtYmVyczsgdGhleSBjYW5ub3QgYmUgdGFyZ2V0cyBvZiBjcm9zcy1iYWNr ZW5kCiAqCSBTSSB1cGRhdGVzIChhbmQgb3VyIG93biB1cGRhdGVzIG5vdyBnbyB0aHJvdWdo IGEgc2VwYXJhdGUgbGlua2VkIGxpc3QKICoJIHRoYXQgaXNuJ3QgbGltaXRlZCBieSB0aGUg U0kgbWVzc2FnZSBidWZmZXIgc2l6ZSkuCiAqCiAqCSBXZSBkbyB0aGlzIGluIHR3byBwaGFz ZXM6IHRoZSBmaXJzdCBwYXNzIGRlbGV0ZXMgZGVsZXRhYmxlIGl0ZW1zLCBhbmQKICoJIHRo ZSBzZWNvbmQgb25lIHJlYnVpbGRzIHRoZSByZWJ1aWxkYWJsZSBpdGVtcy4gIFRoaXMgaXMg ZXNzZW50aWFsIGZvcgogKgkgc2FmZXR5LCBiZWNhdXNlIGhhc2hfc2VxX3NlYXJjaCBvbmx5 IGNvcGVzIHdpdGggY29uY3VycmVudCBkZWxldGlvbiBvZgogKgkgdGhlIGVsZW1lbnQgaXQg aXMgY3VycmVudGx5IHZpc2l0aW5nLiAgSWYgYSBzZWNvbmQgU0kgb3ZlcmZsb3cgd2VyZSB0 bwogKgkgb2NjdXIgd2hpbGUgd2UgYXJlIHdhbGtpbmcgdGhlIHRhYmxlLCByZXN1bHRpbmcg aW4gcmVjdXJzaXZlIGVudHJ5IHRvCiAqCSB0aGlzIHJvdXRpbmUsIHdlIGNvdWxkIGNyYXNo IGJlY2F1c2UgdGhlIGlubmVyIGludm9jYXRpb24gYmxvd3MgYXdheQogKgkgdGhlIGVudHJ5 IG5leHQgdG8gYmUgdmlzaXRlZCBieSB0aGUgb3V0ZXIgc2Nhbi4gIEJ1dCB0aGlzIHdheSBp cyBPSywKICoJIGJlY2F1c2UgKGEpIGR1cmluZyB0aGUgZmlyc3QgcGFzcyB3ZSB3b24ndCBw cm9jZXNzIGFueSBtb3JlIFNJIG1lc3NhZ2VzLAogKgkgc28gaGFzaF9zZXFfc2VhcmNoIHdp bGwgY29tcGxldGUgc2FmZWx5OyAoYikgZHVyaW5nIHRoZSBzZWNvbmQgcGFzcyB3ZQogKgkg b25seSBob2xkIG9udG8gcG9pbnRlcnMgdG8gbm9uZGVsZXRhYmxlIGVudHJpZXMuCiAqCiAq CSBUaGUgdHdvLXBoYXNlIGFwcHJvYWNoIGFsc28gbWFrZXMgaXQgZWFzeSB0byB1cGRhdGUg cmVsZmlsZW51bWJlcnMgZm9yCiAqCSBtYXBwZWQgcmVsYXRpb25zIGJlZm9yZSB3ZSBkbyBh bnl0aGluZyBlbHNlLCBhbmQgdG8gZW5zdXJlIHRoYXQgdGhlCiAqCSBzZWNvbmQgcGFzcyBw cm9jZXNzZXMgbmFpbGVkLWluLWNhY2hlIGl0ZW1zIGJlZm9yZSBvdGhlciBub25kZWxldGFi bGUKICoJIGl0ZW1zLiAgVGhpcyBzaG91bGQgZW5zdXJlIHRoYXQgc3lzdGVtIGNhdGFsb2dz IGFyZSB1cCB0byBkYXRlIGJlZm9yZQogKgkgd2UgYXR0ZW1wdCB0byB1c2UgdGhlbSB0byBy ZWxvYWQgaW5mb3JtYXRpb24gYWJvdXQgb3RoZXIgb3BlbiByZWxhdGlvbnMuCiAqCiAqCSBB ZnRlciB0aG9zZSB0d28gcGhhc2VzIG9mIHdvcmsgaGF2aW5nIGltbWVkaWF0ZSBlZmZlY3Rz LCB3ZSBub3JtYWxseQogKgkgc2lnbmFsIGFueSBSZWxhdGlvbkJ1aWxkRGVzYygpIG9uIHRo ZSBzdGFjayB0byBzdGFydCBvdmVyLiAgSG93ZXZlciwgd2UKICoJIGRvbid0IGRvIHRoaXMg aWYgY2FsbGVkIGFzIHBhcnQgb2YgZGVidWdfZGlzY2FyZF9jYWNoZXMuICBPdGhlcndpc2Us CiAqCSBSZWxhdGlvbkJ1aWxkRGVzYygpIHdvdWxkIGJlY29tZSBhbiBpbmZpbml0ZSBsb29w LgogKi8Kdm9pZApSZWxhdGlvbkNhY2hlSW52YWxpZGF0ZShib29sIGRlYnVnX2Rpc2NhcmQp CnsKCUhBU0hfU0VRX1NUQVRVUyBzdGF0dXM7CglSZWxJZENhY2hlRW50ICppZGhlbnRyeTsK CVJlbGF0aW9uCXJlbGF0aW9uOwoJTGlzdAkgICAqcmVidWlsZEZpcnN0TGlzdCA9IE5JTDsK CUxpc3QJICAgKnJlYnVpbGRMaXN0ID0gTklMOwoJTGlzdENlbGwgICAqbDsKCWludAkJCWk7 CgoJLyoKCSAqIFJlbG9hZCByZWxhdGlvbiBtYXBwaW5nIGRhdGEgYmVmb3JlIHN0YXJ0aW5n IHRvIHJlY29uc3RydWN0IGNhY2hlLgoJICovCglSZWxhdGlvbk1hcEludmFsaWRhdGVBbGwo KTsKCgkvKiBQaGFzZSAxICovCgloYXNoX3NlcV9pbml0KCZzdGF0dXMsIFJlbGF0aW9uSWRD YWNoZSk7CgoJd2hpbGUgKChpZGhlbnRyeSA9IChSZWxJZENhY2hlRW50ICopIGhhc2hfc2Vx X3NlYXJjaCgmc3RhdHVzKSkgIT0gTlVMTCkKCXsKCQlyZWxhdGlvbiA9IGlkaGVudHJ5LT5y ZWxkZXNjOwoKCQkvKgoJCSAqIElnbm9yZSBuZXcgcmVsYXRpb25zOyBubyBvdGhlciBiYWNr ZW5kIHdpbGwgbWFuaXB1bGF0ZSB0aGVtIGJlZm9yZQoJCSAqIHdlIGNvbW1pdC4gIExpa2V3 aXNlLCBiZWZvcmUgcmVwbGFjaW5nIGEgcmVsYXRpb24ncyByZWxmaWxlbG9jYXRvciwKCQkg KiB3ZSBzaGFsbCBoYXZlIGFjcXVpcmVkIEFjY2Vzc0V4Y2x1c2l2ZUxvY2sgYW5kIGRyYWlu ZWQgYW55CgkJICogYXBwbGljYWJsZSBwZW5kaW5nIGludmFsaWRhdGlvbnMuCgkJICovCgkJ aWYgKHJlbGF0aW9uLT5yZF9jcmVhdGVTdWJpZCAhPSBJbnZhbGlkU3ViVHJhbnNhY3Rpb25J ZCB8fAoJCQlyZWxhdGlvbi0+cmRfZmlyc3RSZWxmaWxlbG9jYXRvclN1YmlkICE9IEludmFs aWRTdWJUcmFuc2FjdGlvbklkKQoJCQljb250aW51ZTsKCgkJcmVsY2FjaGVJbnZhbHNSZWNl aXZlZCsrOwoKCQlpZiAoUmVsYXRpb25IYXNSZWZlcmVuY2VDb3VudFplcm8ocmVsYXRpb24p KQoJCXsKCQkJLyogRGVsZXRlIHRoaXMgZW50cnkgaW1tZWRpYXRlbHkgKi8KCQkJUmVsYXRp b25DbGVhclJlbGF0aW9uKHJlbGF0aW9uKTsKCQl9CgkJZWxzZQoJCXsKCQkJLyoKCQkJICog SWYgaXQncyBhIG1hcHBlZCByZWxhdGlvbiwgaW1tZWRpYXRlbHkgdXBkYXRlIGl0cyByZF9s b2NhdG9yIGluCgkJCSAqIGNhc2UgaXRzIHJlbGZpbGVudW1iZXIgY2hhbmdlZC4gIFdlIG11 c3QgZG8gdGhpcyBkdXJpbmcgcGhhc2UgMQoJCQkgKiBpbiBjYXNlIHRoZSByZWxhdGlvbiBp cyBjb25zdWx0ZWQgZHVyaW5nIHJlYnVpbGQgb2Ygb3RoZXIKCQkJICogcmVsY2FjaGUgZW50 cmllcyBpbiBwaGFzZSAyLiAgSXQncyBzYWZlIHNpbmNlIGNvbnN1bHRpbmcgdGhlCgkJCSAq IG1hcCBkb2Vzbid0IGludm9sdmUgYW55IGFjY2VzcyB0byByZWxjYWNoZSBlbnRyaWVzLgoJ CQkgKi8KCQkJaWYgKFJlbGF0aW9uSXNNYXBwZWQocmVsYXRpb24pKQoJCQl7CgkJCQlSZWxh dGlvbkNsb3NlU21ncihyZWxhdGlvbik7CgkJCQlSZWxhdGlvbkluaXRQaHlzaWNhbEFkZHIo cmVsYXRpb24pOwoJCQl9CgoJCQkvKgoJCQkgKiBBZGQgdGhpcyBlbnRyeSB0byBsaXN0IG9m IHN0dWZmIHRvIHJlYnVpbGQgaW4gc2Vjb25kIHBhc3MuCgkJCSAqIHBnX2NsYXNzIGdvZXMg dG8gdGhlIGZyb250IG9mIHJlYnVpbGRGaXJzdExpc3Qgd2hpbGUKCQkJICogcGdfY2xhc3Nf b2lkX2luZGV4IGdvZXMgdG8gdGhlIGJhY2sgb2YgcmVidWlsZEZpcnN0TGlzdCwgc28KCQkJ ICogdGhleSBhcmUgZG9uZSBmaXJzdCBhbmQgc2Vjb25kIHJlc3BlY3RpdmVseS4gIE90aGVy IG5haWxlZAoJCQkgKiByZWxhdGlvbnMgZ28gdG8gdGhlIGZyb250IG9mIHJlYnVpbGRMaXN0 LCBzbyB0aGV5J2xsIGJlIGRvbmUKCQkJICogbmV4dCBpbiBubyBwYXJ0aWN1bGFyIG9yZGVy OyBhbmQgZXZlcnl0aGluZyBlbHNlIGdvZXMgdG8gdGhlCgkJCSAqIGJhY2sgb2YgcmVidWls ZExpc3QuCgkJCSAqLwoJCQlpZiAoUmVsYXRpb25HZXRSZWxpZChyZWxhdGlvbikgPT0gUmVs YXRpb25SZWxhdGlvbklkKQoJCQkJcmVidWlsZEZpcnN0TGlzdCA9IGxjb25zKHJlbGF0aW9u LCByZWJ1aWxkRmlyc3RMaXN0KTsKCQkJZWxzZSBpZiAoUmVsYXRpb25HZXRSZWxpZChyZWxh dGlvbikgPT0gQ2xhc3NPaWRJbmRleElkKQoJCQkJcmVidWlsZEZpcnN0TGlzdCA9IGxhcHBl bmQocmVidWlsZEZpcnN0TGlzdCwgcmVsYXRpb24pOwoJCQllbHNlIGlmIChyZWxhdGlvbi0+ cmRfaXNuYWlsZWQpCgkJCQlyZWJ1aWxkTGlzdCA9IGxjb25zKHJlbGF0aW9uLCByZWJ1aWxk TGlzdCk7CgkJCWVsc2UKCQkJCXJlYnVpbGRMaXN0ID0gbGFwcGVuZChyZWJ1aWxkTGlzdCwg cmVsYXRpb24pOwoJCX0KCX0KCgkvKgoJICogV2UgY2Fubm90IGRlc3Ryb3kgdGhlIFNNZ3JS ZWxhdGlvbnMgYXMgdGhlcmUgbWlnaHQgc3RpbGwgYmUgcmVmZXJlbmNlcwoJICogdG8gdGhl bSwgYnV0IGNsb3NlIHRoZSB1bmRlcmx5aW5nIGZpbGUgZGVzY3JpcHRvcnMuCgkgKi8KCXNt Z3JyZWxlYXNlYWxsKCk7CgoJLyoKCSAqIFBoYXNlIDI6IHJlYnVpbGQgKG9yIGludmFsaWRh dGUpIHRoZSBpdGVtcyBmb3VuZCB0byBuZWVkIHJlYnVpbGQgaW4KCSAqIHBoYXNlIDEKCSAq LwoJZm9yZWFjaChsLCByZWJ1aWxkRmlyc3RMaXN0KQoJewoJCXJlbGF0aW9uID0gKFJlbGF0 aW9uKSBsZmlyc3QobCk7CgkJaWYgKCFJc1RyYW5zYWN0aW9uU3RhdGUoKSB8fCAocmVsYXRp b24tPnJkX2lzbmFpbGVkICYmIHJlbGF0aW9uLT5yZF9yZWZjbnQgPT0gMSkpCgkJCVJlbGF0 aW9uSW52YWxpZGF0ZVJlbGF0aW9uKHJlbGF0aW9uKTsKCQllbHNlCgkJCVJlbGF0aW9uUmVi dWlsZFJlbGF0aW9uKHJlbGF0aW9uKTsKCX0KCWxpc3RfZnJlZShyZWJ1aWxkRmlyc3RMaXN0 KTsKCWZvcmVhY2gobCwgcmVidWlsZExpc3QpCgl7CgkJcmVsYXRpb24gPSAoUmVsYXRpb24p IGxmaXJzdChsKTsKCQlpZiAoIUlzVHJhbnNhY3Rpb25TdGF0ZSgpIHx8IChyZWxhdGlvbi0+ cmRfaXNuYWlsZWQgJiYgcmVsYXRpb24tPnJkX3JlZmNudCA9PSAxKSkKCQkJUmVsYXRpb25J bnZhbGlkYXRlUmVsYXRpb24ocmVsYXRpb24pOwoJCWVsc2UKCQkJUmVsYXRpb25SZWJ1aWxk UmVsYXRpb24ocmVsYXRpb24pOwoJfQoJbGlzdF9mcmVlKHJlYnVpbGRMaXN0KTsKCglpZiAo IWRlYnVnX2Rpc2NhcmQpCgkJLyogQW55IFJlbGF0aW9uQnVpbGREZXNjKCkgb24gdGhlIHN0 YWNrIG11c3Qgc3RhcnQgb3Zlci4gKi8KCQlmb3IgKGkgPSAwOyBpIDwgaW5fcHJvZ3Jlc3Nf bGlzdF9sZW47IGkrKykKCQkJaW5fcHJvZ3Jlc3NfbGlzdFtpXS5pbnZhbGlkYXRlZCA9IHRy dWU7Cn0KCnN0YXRpYyB2b2lkClJlbWVtYmVyVG9GcmVlVHVwbGVEZXNjQXRFT1goVHVwbGVE ZXNjIHRkKQp7CglpZiAoRU9YYWN0VHVwbGVEZXNjQXJyYXkgPT0gTlVMTCkKCXsKCQlNZW1v cnlDb250ZXh0IG9sZGN4dDsKCgkJb2xkY3h0ID0gTWVtb3J5Q29udGV4dFN3aXRjaFRvKENh Y2hlTWVtb3J5Q29udGV4dCk7CgoJCUVPWGFjdFR1cGxlRGVzY0FycmF5ID0gKFR1cGxlRGVz YyAqKSBwYWxsb2MoMTYgKiBzaXplb2YoVHVwbGVEZXNjKSk7CgkJRU9YYWN0VHVwbGVEZXNj QXJyYXlMZW4gPSAxNjsKCQlOZXh0RU9YYWN0VHVwbGVEZXNjTnVtID0gMDsKCQlNZW1vcnlD b250ZXh0U3dpdGNoVG8ob2xkY3h0KTsKCX0KCWVsc2UgaWYgKE5leHRFT1hhY3RUdXBsZURl c2NOdW0gPj0gRU9YYWN0VHVwbGVEZXNjQXJyYXlMZW4pCgl7CgkJaW50MzIJCW5ld2xlbiA9 IEVPWGFjdFR1cGxlRGVzY0FycmF5TGVuICogMjsKCgkJQXNzZXJ0KEVPWGFjdFR1cGxlRGVz Y0FycmF5TGVuID4gMCk7CgoJCUVPWGFjdFR1cGxlRGVzY0FycmF5ID0gKFR1cGxlRGVzYyAq KSByZXBhbGxvYyhFT1hhY3RUdXBsZURlc2NBcnJheSwKCQkJCQkJCQkJCQkJCSAgbmV3bGVu ICogc2l6ZW9mKFR1cGxlRGVzYykpOwoJCUVPWGFjdFR1cGxlRGVzY0FycmF5TGVuID0gbmV3 bGVuOwoJfQoKCUVPWGFjdFR1cGxlRGVzY0FycmF5W05leHRFT1hhY3RUdXBsZURlc2NOdW0r K10gPSB0ZDsKfQoKI2lmZGVmIFVTRV9BU1NFUlRfQ0hFQ0tJTkcKc3RhdGljIHZvaWQKQXNz ZXJ0UGVuZGluZ1N5bmNDb25zaXN0ZW5jeShSZWxhdGlvbiByZWxhdGlvbikKewoJYm9vbAkJ cmVsY2FjaGVfdmVyZGljdCA9CgkJUmVsYXRpb25Jc1Blcm1hbmVudChyZWxhdGlvbikgJiYK CQkoKHJlbGF0aW9uLT5yZF9jcmVhdGVTdWJpZCAhPSBJbnZhbGlkU3ViVHJhbnNhY3Rpb25J ZCAmJgoJCSAgUkVMS0lORF9IQVNfU1RPUkFHRShyZWxhdGlvbi0+cmRfcmVsLT5yZWxraW5k KSkgfHwKCQkgcmVsYXRpb24tPnJkX2ZpcnN0UmVsZmlsZWxvY2F0b3JTdWJpZCAhPSBJbnZh bGlkU3ViVHJhbnNhY3Rpb25JZCk7CgoJQXNzZXJ0KHJlbGNhY2hlX3ZlcmRpY3QgPT0gUmVs RmlsZUxvY2F0b3JTa2lwcGluZ1dBTChyZWxhdGlvbi0+cmRfbG9jYXRvcikpOwoKCWlmIChy ZWxhdGlvbi0+cmRfZHJvcHBlZFN1YmlkICE9IEludmFsaWRTdWJUcmFuc2FjdGlvbklkKQoJ CUFzc2VydCghcmVsYXRpb24tPnJkX2lzdmFsaWQgJiYKCQkJICAgKHJlbGF0aW9uLT5yZF9j cmVhdGVTdWJpZCAhPSBJbnZhbGlkU3ViVHJhbnNhY3Rpb25JZCB8fAoJCQkJcmVsYXRpb24t PnJkX2ZpcnN0UmVsZmlsZWxvY2F0b3JTdWJpZCAhPSBJbnZhbGlkU3ViVHJhbnNhY3Rpb25J ZCkpOwp9CgovKgogKiBBc3NlcnRQZW5kaW5nU3luY3NfUmVsYXRpb25DYWNoZQogKgogKglB c3NlcnQgdGhhdCByZWxjYWNoZS5jIGFuZCBzdG9yYWdlLmMgYWdyZWUgb24gd2hldGhlciB0 byBza2lwIFdBTC4KICovCnZvaWQKQXNzZXJ0UGVuZGluZ1N5bmNzX1JlbGF0aW9uQ2FjaGUo dm9pZCkKewoJSEFTSF9TRVFfU1RBVFVTIHN0YXR1czsKCUxPQ0FMTE9DSyAgKmxvY2FsbG9j azsKCVJlbGF0aW9uICAgKnJlbHM7CglpbnQJCQltYXhyZWxzOwoJaW50CQkJbnJlbHM7CglS ZWxJZENhY2hlRW50ICppZGhlbnRyeTsKCWludAkJCWk7CgoJLyoKCSAqIE9wZW4gZXZlcnkg cmVsYXRpb24gdGhhdCB0aGlzIHRyYW5zYWN0aW9uIGhhcyBsb2NrZWQuICBJZiwgZm9yIHNv bWUKCSAqIHJlbGF0aW9uLCBzdG9yYWdlLmMgaXMgc2tpcHBpbmcgV0FMIGFuZCByZWxjYWNo ZS5jIGlzIG5vdCBza2lwcGluZyBXQUwsCgkgKiBhIENvbW1hbmRDb3VudGVySW5jcmVtZW50 KCkgdHlwaWNhbGx5IHlpZWxkcyBhIGxvY2FsIGludmFsaWRhdGlvbgoJICogbWVzc2FnZSB0 aGF0IGRlc3Ryb3lzIHRoZSByZWxjYWNoZSBlbnRyeS4gIEJ5IHJlY3JlYXRpbmcgc3VjaCBl bnRyaWVzCgkgKiBoZXJlLCB3ZSBkZXRlY3QgdGhlIHByb2JsZW0uCgkgKi8KCVB1c2hBY3Rp dmVTbmFwc2hvdChHZXRUcmFuc2FjdGlvblNuYXBzaG90KCkpOwoJbWF4cmVscyA9IDE7Cgly ZWxzID0gcGFsbG9jKG1heHJlbHMgKiBzaXplb2YoKnJlbHMpKTsKCW5yZWxzID0gMDsKCWhh c2hfc2VxX2luaXQoJnN0YXR1cywgR2V0TG9ja01ldGhvZExvY2FsSGFzaCgpKTsKCXdoaWxl ICgobG9jYWxsb2NrID0gKExPQ0FMTE9DSyAqKSBoYXNoX3NlcV9zZWFyY2goJnN0YXR1cykp ICE9IE5VTEwpCgl7CgkJT2lkCQkJcmVsaWQ7CgkJUmVsYXRpb24JcjsKCgkJaWYgKGxvY2Fs bG9jay0+bkxvY2tzIDw9IDApCgkJCWNvbnRpbnVlOwoJCWlmICgoTG9ja1RhZ1R5cGUpIGxv Y2FsbG9jay0+dGFnLmxvY2subG9ja3RhZ190eXBlICE9CgkJCUxPQ0tUQUdfUkVMQVRJT04p CgkJCWNvbnRpbnVlOwoJCXJlbGlkID0gbG9jYWxsb2NrLT50YWcubG9jay5sb2NrdGFnX2Zp ZWxkMjsKCQlyID0gUmVsYXRpb25JZEdldFJlbGF0aW9uKHJlbGlkKTsKCQlpZiAoIVJlbGF0 aW9uSXNWYWxpZChyKSkKCQkJY29udGludWU7CgkJaWYgKG5yZWxzID49IG1heHJlbHMpCgkJ ewoJCQltYXhyZWxzICo9IDI7CgkJCXJlbHMgPSByZXBhbGxvYyhyZWxzLCBtYXhyZWxzICog c2l6ZW9mKCpyZWxzKSk7CgkJfQoJCXJlbHNbbnJlbHMrK10gPSByOwoJfQoKCWhhc2hfc2Vx X2luaXQoJnN0YXR1cywgUmVsYXRpb25JZENhY2hlKTsKCXdoaWxlICgoaWRoZW50cnkgPSAo UmVsSWRDYWNoZUVudCAqKSBoYXNoX3NlcV9zZWFyY2goJnN0YXR1cykpICE9IE5VTEwpCgkJ QXNzZXJ0UGVuZGluZ1N5bmNDb25zaXN0ZW5jeShpZGhlbnRyeS0+cmVsZGVzYyk7CgoJZm9y IChpID0gMDsgaSA8IG5yZWxzOyBpKyspCgkJUmVsYXRpb25DbG9zZShyZWxzW2ldKTsKCVBv cEFjdGl2ZVNuYXBzaG90KCk7Cn0KI2VuZGlmCgovKgogKiBBdEVPWGFjdF9SZWxhdGlvbkNh Y2hlCiAqCiAqCUNsZWFuIHVwIHRoZSByZWxjYWNoZSBhdCBtYWluLXRyYW5zYWN0aW9uIGNv bW1pdCBvciBhYm9ydC4KICoKICogTm90ZTogdGhpcyBtdXN0IGJlIGNhbGxlZCAqYmVmb3Jl KiBwcm9jZXNzaW5nIGludmFsaWRhdGlvbiBtZXNzYWdlcy4KICogSW4gdGhlIGNhc2Ugb2Yg YWJvcnQsIHdlIGRvbid0IHdhbnQgdG8gdHJ5IHRvIHJlYnVpbGQgYW55IGludmFsaWRhdGVk CiAqIGNhY2hlIGVudHJpZXMgKHNpbmNlIHdlIGNhbid0IHNhZmVseSBkbyBkYXRhYmFzZSBh Y2Nlc3NlcykuICBUaGVyZWZvcmUKICogd2UgbXVzdCByZXNldCByZWZjbnRzIGJlZm9yZSBo YW5kbGluZyBwZW5kaW5nIGludmFsaWRhdGlvbnMuCiAqCiAqIEFzIG9mIFBvc3RncmVTUUwg OC4xLCByZWxjYWNoZSByZWZjbnRzIHNob3VsZCBnZXQgcmVsZWFzZWQgYnkgdGhlCiAqIFJl c291cmNlT3duZXIgbWVjaGFuaXNtLiAgVGhpcyByb3V0aW5lIGp1c3QgZG9lcyBhIGRlYnVn Z2luZwogKiBjcm9zcy1jaGVjayB0aGF0IG5vIHBpbnMgcmVtYWluLiAgSG93ZXZlciwgd2Ug YWxzbyBuZWVkIHRvIGRvIHNwZWNpYWwKICogY2xlYW51cCB3aGVuIHRoZSBjdXJyZW50IHRy YW5zYWN0aW9uIGNyZWF0ZWQgYW55IHJlbGF0aW9ucyBvciBtYWRlIHVzZQogKiBvZiBmb3Jj ZWQgaW5kZXggbGlzdHMuCiAqLwp2b2lkCkF0RU9YYWN0X1JlbGF0aW9uQ2FjaGUoYm9vbCBp c0NvbW1pdCkKewoJSEFTSF9TRVFfU1RBVFVTIHN0YXR1czsKCVJlbElkQ2FjaGVFbnQgKmlk aGVudHJ5OwoJaW50CQkJaTsKCgkvKgoJICogRm9yZ2V0IGluX3Byb2dyZXNzX2xpc3QuICBU aGlzIGlzIHJlbGV2YW50IHdoZW4gd2UncmUgYWJvcnRpbmcgZHVlIHRvCgkgKiBhbiBlcnJv ciBkdXJpbmcgUmVsYXRpb25CdWlsZERlc2MoKS4KCSAqLwoJQXNzZXJ0KGluX3Byb2dyZXNz X2xpc3RfbGVuID09IDAgfHwgIWlzQ29tbWl0KTsKCWluX3Byb2dyZXNzX2xpc3RfbGVuID0g MDsKCgkvKgoJICogVW5sZXNzIHRoZSBlb3hhY3RfbGlzdFtdIG92ZXJmbG93ZWQsIHdlIG9u bHkgbmVlZCB0byBleGFtaW5lIHRoZSByZWxzCgkgKiBsaXN0ZWQgaW4gaXQuICBPdGhlcndp c2UgZmFsbCBiYWNrIG9uIGEgaGFzaF9zZXFfc2VhcmNoIHNjYW4uCgkgKgoJICogRm9yIHNp bXBsaWNpdHksIGVveGFjdF9saXN0W10gZW50cmllcyBhcmUgbm90IGRlbGV0ZWQgdGlsbCBl bmQgb2YKCSAqIHRvcC1sZXZlbCB0cmFuc2FjdGlvbiwgZXZlbiB0aG91Z2ggd2UgY291bGQg cmVtb3ZlIHRoZW0gYXQKCSAqIHN1YnRyYW5zYWN0aW9uIGVuZCBpbiBzb21lIGNhc2VzLCBv ciByZW1vdmUgcmVsYXRpb25zIGZyb20gdGhlIGxpc3QgaWYKCSAqIHRoZXkgYXJlIGNsZWFy ZWQgZm9yIG90aGVyIHJlYXNvbnMuICBUaGVyZWZvcmUgd2Ugc2hvdWxkIGV4cGVjdCB0aGUK CSAqIGNhc2UgdGhhdCBsaXN0IGVudHJpZXMgYXJlIG5vdCBmb3VuZCBpbiB0aGUgaGFzaHRh YmxlOyBpZiBub3QsIHRoZXJlJ3MKCSAqIG5vdGhpbmcgdG8gZG8gZm9yIHRoZW0uCgkgKi8K CWlmIChlb3hhY3RfbGlzdF9vdmVyZmxvd2VkKQoJewoJCWhhc2hfc2VxX2luaXQoJnN0YXR1 cywgUmVsYXRpb25JZENhY2hlKTsKCQl3aGlsZSAoKGlkaGVudHJ5ID0gKFJlbElkQ2FjaGVF bnQgKikgaGFzaF9zZXFfc2VhcmNoKCZzdGF0dXMpKSAhPSBOVUxMKQoJCXsKCQkJQXRFT1hh Y3RfY2xlYW51cChpZGhlbnRyeS0+cmVsZGVzYywgaXNDb21taXQpOwoJCX0KCX0KCWVsc2UK CXsKCQlmb3IgKGkgPSAwOyBpIDwgZW94YWN0X2xpc3RfbGVuOyBpKyspCgkJewoJCQlpZGhl bnRyeSA9IChSZWxJZENhY2hlRW50ICopIGhhc2hfc2VhcmNoKFJlbGF0aW9uSWRDYWNoZSwK CQkJCQkJCQkJCQkJCSAmZW94YWN0X2xpc3RbaV0sCgkJCQkJCQkJCQkJCQkgSEFTSF9GSU5E LAoJCQkJCQkJCQkJCQkJIE5VTEwpOwoJCQlpZiAoaWRoZW50cnkgIT0gTlVMTCkKCQkJCUF0 RU9YYWN0X2NsZWFudXAoaWRoZW50cnktPnJlbGRlc2MsIGlzQ29tbWl0KTsKCQl9Cgl9CgoJ aWYgKEVPWGFjdFR1cGxlRGVzY0FycmF5TGVuID4gMCkKCXsKCQlBc3NlcnQoRU9YYWN0VHVw bGVEZXNjQXJyYXkgIT0gTlVMTCk7CgkJZm9yIChpID0gMDsgaSA8IE5leHRFT1hhY3RUdXBs ZURlc2NOdW07IGkrKykKCQkJRnJlZVR1cGxlRGVzYyhFT1hhY3RUdXBsZURlc2NBcnJheVtp XSk7CgkJcGZyZWUoRU9YYWN0VHVwbGVEZXNjQXJyYXkpOwoJCUVPWGFjdFR1cGxlRGVzY0Fy cmF5ID0gTlVMTDsKCX0KCgkvKiBOb3cgd2UncmUgb3V0IG9mIHRoZSB0cmFuc2FjdGlvbiBh bmQgY2FuIGNsZWFyIHRoZSBsaXN0cyAqLwoJZW94YWN0X2xpc3RfbGVuID0gMDsKCWVveGFj dF9saXN0X292ZXJmbG93ZWQgPSBmYWxzZTsKCU5leHRFT1hhY3RUdXBsZURlc2NOdW0gPSAw OwoJRU9YYWN0VHVwbGVEZXNjQXJyYXlMZW4gPSAwOwp9CgovKgogKiBBdEVPWGFjdF9jbGVh bnVwCiAqCiAqCUNsZWFuIHVwIGEgc2luZ2xlIHJlbCBhdCBtYWluLXRyYW5zYWN0aW9uIGNv bW1pdCBvciBhYm9ydAogKgogKiBOQjogdGhpcyBwcm9jZXNzaW5nIG11c3QgYmUgaWRlbXBv dGVudCwgYmVjYXVzZSBFT1hhY3RMaXN0QWRkKCkgZG9lc24ndAogKiBib3RoZXIgdG8gcHJl dmVudCBkdXBsaWNhdGUgZW50cmllcyBpbiBlb3hhY3RfbGlzdFtdLgogKi8Kc3RhdGljIHZv aWQKQXRFT1hhY3RfY2xlYW51cChSZWxhdGlvbiByZWxhdGlvbiwgYm9vbCBpc0NvbW1pdCkK ewoJYm9vbAkJY2xlYXJfcmVsY2FjaGUgPSBmYWxzZTsKCgkvKgoJICogVGhlIHJlbGNhY2hl IGVudHJ5J3MgcmVmIGNvdW50IHNob3VsZCBiZSBiYWNrIHRvIGl0cyBub3JtYWwKCSAqIG5v dC1pbi1hLXRyYW5zYWN0aW9uIHN0YXRlOiAwIHVubGVzcyBpdCdzIG5haWxlZCBpbiBjYWNo ZS4KCSAqCgkgKiBJbiBib290c3RyYXAgbW9kZSwgdGhpcyBpcyBOT1QgdHJ1ZSwgc28gZG9u J3QgY2hlY2sgaXQgLS0tIHRoZQoJICogYm9vdHN0cmFwIGNvZGUgZXhwZWN0cyByZWxhdGlv bnMgdG8gc3RheSBvcGVuIGFjcm9zcyBzdGFydC9jb21taXQKCSAqIHRyYW5zYWN0aW9uIGNh bGxzLiAgKFRoYXQgc2VlbXMgYm9ndXMsIGJ1dCBpdCdzIG5vdCB3b3J0aCBmaXhpbmcuKQoJ ICoKCSAqIE5vdGU6IGlkZWFsbHkgdGhpcyBjaGVjayB3b3VsZCBiZSBhcHBsaWVkIHRvIGV2 ZXJ5IHJlbGNhY2hlIGVudHJ5LCBub3QKCSAqIGp1c3QgdGhvc2UgdGhhdCBoYXZlIGVveGFj dCB3b3JrIHRvIGRvLiAgQnV0IGl0J3Mgbm90IHdvcnRoIGZvcmNpbmcgYQoJICogc2NhbiBv ZiB0aGUgd2hvbGUgcmVsY2FjaGUganVzdCBmb3IgdGhpcy4gIChNb3Jlb3ZlciwgZG9pbmcg c28gd291bGQKCSAqIG1lYW4gdGhhdCBhc3NlcnQtZW5hYmxlZCB0ZXN0aW5nIG5ldmVyIHRl c3RzIHRoZSBoYXNoX3NlYXJjaCBjb2RlIHBhdGgKCSAqIGFib3ZlLCB3aGljaCBzZWVtcyBh IGJhZCBpZGVhLikKCSAqLwojaWZkZWYgVVNFX0FTU0VSVF9DSEVDS0lORwoJaWYgKCFJc0Jv b3RzdHJhcFByb2Nlc3NpbmdNb2RlKCkpCgl7CgkJaW50CQkJZXhwZWN0ZWRfcmVmY250OwoK CQlleHBlY3RlZF9yZWZjbnQgPSByZWxhdGlvbi0+cmRfaXNuYWlsZWQgPyAxIDogMDsKCQlB c3NlcnQocmVsYXRpb24tPnJkX3JlZmNudCA9PSBleHBlY3RlZF9yZWZjbnQpOwoJfQojZW5k aWYKCgkvKgoJICogSXMgdGhlIHJlbGF0aW9uIGxpdmUgYWZ0ZXIgdGhpcyB0cmFuc2FjdGlv biBlbmRzPwoJICoKCSAqIER1cmluZyBjb21taXQsIGNsZWFyIHRoZSByZWxjYWNoZSBlbnRy eSBpZiBpdCBpcyBwcmVzZXJ2ZWQgYWZ0ZXIKCSAqIHJlbGF0aW9uIGRyb3AsIGluIG9yZGVy IG5vdCB0byBvcnBoYW4gdGhlIGVudHJ5LiAgRHVyaW5nIHJvbGxiYWNrLAoJICogY2xlYXIg dGhlIHJlbGNhY2hlIGVudHJ5IGlmIHRoZSByZWxhdGlvbiBpcyBjcmVhdGVkIGluIHRoZSBj dXJyZW50CgkgKiB0cmFuc2FjdGlvbiBzaW5jZSBpdCBpc24ndCBpbnRlcmVzdGluZyBhbnkg bG9uZ2VyIG9uY2Ugd2UgYXJlIG91dCBvZgoJICogdGhlIHRyYW5zYWN0aW9uLgoJICovCglj bGVhcl9yZWxjYWNoZSA9CgkJKGlzQ29tbWl0ID8KCQkgcmVsYXRpb24tPnJkX2Ryb3BwZWRT dWJpZCAhPSBJbnZhbGlkU3ViVHJhbnNhY3Rpb25JZCA6CgkJIHJlbGF0aW9uLT5yZF9jcmVh dGVTdWJpZCAhPSBJbnZhbGlkU3ViVHJhbnNhY3Rpb25JZCk7CgoJLyoKCSAqIFNpbmNlIHdl IGFyZSBub3cgb3V0IG9mIHRoZSB0cmFuc2FjdGlvbiwgcmVzZXQgdGhlIHN1YmlkcyB0byB6 ZXJvLiBUaGF0CgkgKiBhbHNvIGxldHMgUmVsYXRpb25DbGVhclJlbGF0aW9uKCkgZHJvcCB0 aGUgcmVsY2FjaGUgZW50cnkuCgkgKi8KCXJlbGF0aW9uLT5yZF9jcmVhdGVTdWJpZCA9IElu dmFsaWRTdWJUcmFuc2FjdGlvbklkOwoJcmVsYXRpb24tPnJkX25ld1JlbGZpbGVsb2NhdG9y U3ViaWQgPSBJbnZhbGlkU3ViVHJhbnNhY3Rpb25JZDsKCXJlbGF0aW9uLT5yZF9maXJzdFJl bGZpbGVsb2NhdG9yU3ViaWQgPSBJbnZhbGlkU3ViVHJhbnNhY3Rpb25JZDsKCXJlbGF0aW9u LT5yZF9kcm9wcGVkU3ViaWQgPSBJbnZhbGlkU3ViVHJhbnNhY3Rpb25JZDsKCglpZiAoY2xl YXJfcmVsY2FjaGUpCgl7CgkJaWYgKFJlbGF0aW9uSGFzUmVmZXJlbmNlQ291bnRaZXJvKHJl bGF0aW9uKSkKCQl7CgkJCVJlbGF0aW9uQ2xlYXJSZWxhdGlvbihyZWxhdGlvbik7CgkJCXJl dHVybjsKCQl9CgkJZWxzZQoJCXsKCQkJLyoKCQkJICogSG1tLCBzb21ld2hlcmUgdGhlcmUn cyBhIChsZWFrZWQ/KSByZWZlcmVuY2UgdG8gdGhlIHJlbGF0aW9uLgoJCQkgKiBXZSBkYXJl bid0IHJlbW92ZSB0aGUgZW50cnkgZm9yIGZlYXIgb2YgZGVyZWZlcmVuY2luZyBhCgkJCSAq IGRhbmdsaW5nIHBvaW50ZXIgbGF0ZXIuICBCbGVhdCwgYW5kIG1hcmsgaXQgYXMgbm90IGJl bG9uZ2luZyB0bwoJCQkgKiB0aGUgY3VycmVudCB0cmFuc2FjdGlvbi4gIEhvcGVmdWxseSBp dCdsbCBnZXQgY2xlYW5lZCB1cAoJCQkgKiBldmVudHVhbGx5LiAgVGhpcyBtdXN0IGJlIGp1 c3QgYSBXQVJOSU5HIHRvIGF2b2lkCgkJCSAqIGVycm9yLWR1cmluZy1lcnJvci1yZWNvdmVy eSBsb29wcy4KCQkJICovCgkJCWVsb2coV0FSTklORywgImNhbm5vdCByZW1vdmUgcmVsY2Fj aGUgZW50cnkgZm9yIFwiJXNcIiBiZWNhdXNlIGl0IGhhcyBub256ZXJvIHJlZmNvdW50IiwK CQkJCSBSZWxhdGlvbkdldFJlbGF0aW9uTmFtZShyZWxhdGlvbikpOwoJCX0KCX0KfQoKLyoK ICogQXRFT1N1YlhhY3RfUmVsYXRpb25DYWNoZQogKgogKglDbGVhbiB1cCB0aGUgcmVsY2Fj aGUgYXQgc3ViLXRyYW5zYWN0aW9uIGNvbW1pdCBvciBhYm9ydC4KICoKICogTm90ZTogdGhp cyBtdXN0IGJlIGNhbGxlZCAqYmVmb3JlKiBwcm9jZXNzaW5nIGludmFsaWRhdGlvbiBtZXNz YWdlcy4KICovCnZvaWQKQXRFT1N1YlhhY3RfUmVsYXRpb25DYWNoZShib29sIGlzQ29tbWl0 LCBTdWJUcmFuc2FjdGlvbklkIG15U3ViaWQsCgkJCQkJCSAgU3ViVHJhbnNhY3Rpb25JZCBw YXJlbnRTdWJpZCkKewoJSEFTSF9TRVFfU1RBVFVTIHN0YXR1czsKCVJlbElkQ2FjaGVFbnQg KmlkaGVudHJ5OwoJaW50CQkJaTsKCgkvKgoJICogRm9yZ2V0IGluX3Byb2dyZXNzX2xpc3Qu ICBUaGlzIGlzIHJlbGV2YW50IHdoZW4gd2UncmUgYWJvcnRpbmcgZHVlIHRvCgkgKiBhbiBl cnJvciBkdXJpbmcgUmVsYXRpb25CdWlsZERlc2MoKS4gIFdlIGRvbid0IGNvbW1pdCBzdWJ0 cmFuc2FjdGlvbnMKCSAqIGR1cmluZyBSZWxhdGlvbkJ1aWxkRGVzYygpLgoJICovCglBc3Nl cnQoaW5fcHJvZ3Jlc3NfbGlzdF9sZW4gPT0gMCB8fCAhaXNDb21taXQpOwoJaW5fcHJvZ3Jl c3NfbGlzdF9sZW4gPSAwOwoKCS8qCgkgKiBVbmxlc3MgdGhlIGVveGFjdF9saXN0W10gb3Zl cmZsb3dlZCwgd2Ugb25seSBuZWVkIHRvIGV4YW1pbmUgdGhlIHJlbHMKCSAqIGxpc3RlZCBp biBpdC4gIE90aGVyd2lzZSBmYWxsIGJhY2sgb24gYSBoYXNoX3NlcV9zZWFyY2ggc2Nhbi4g IFNhbWUKCSAqIGxvZ2ljIGFzIGluIEF0RU9YYWN0X1JlbGF0aW9uQ2FjaGUuCgkgKi8KCWlm IChlb3hhY3RfbGlzdF9vdmVyZmxvd2VkKQoJewoJCWhhc2hfc2VxX2luaXQoJnN0YXR1cywg UmVsYXRpb25JZENhY2hlKTsKCQl3aGlsZSAoKGlkaGVudHJ5ID0gKFJlbElkQ2FjaGVFbnQg KikgaGFzaF9zZXFfc2VhcmNoKCZzdGF0dXMpKSAhPSBOVUxMKQoJCXsKCQkJQXRFT1N1Ylhh Y3RfY2xlYW51cChpZGhlbnRyeS0+cmVsZGVzYywgaXNDb21taXQsCgkJCQkJCQkJbXlTdWJp ZCwgcGFyZW50U3ViaWQpOwoJCX0KCX0KCWVsc2UKCXsKCQlmb3IgKGkgPSAwOyBpIDwgZW94 YWN0X2xpc3RfbGVuOyBpKyspCgkJewoJCQlpZGhlbnRyeSA9IChSZWxJZENhY2hlRW50ICop IGhhc2hfc2VhcmNoKFJlbGF0aW9uSWRDYWNoZSwKCQkJCQkJCQkJCQkJCSAmZW94YWN0X2xp c3RbaV0sCgkJCQkJCQkJCQkJCQkgSEFTSF9GSU5ELAoJCQkJCQkJCQkJCQkJIE5VTEwpOwoJ CQlpZiAoaWRoZW50cnkgIT0gTlVMTCkKCQkJCUF0RU9TdWJYYWN0X2NsZWFudXAoaWRoZW50 cnktPnJlbGRlc2MsIGlzQ29tbWl0LAoJCQkJCQkJCQlteVN1YmlkLCBwYXJlbnRTdWJpZCk7 CgkJfQoJfQoKCS8qIERvbid0IHJlc2V0IHRoZSBsaXN0OyB3ZSBzdGlsbCBuZWVkIG1vcmUg Y2xlYW51cCBsYXRlciAqLwp9CgovKgogKiBBdEVPU3ViWGFjdF9jbGVhbnVwCiAqCiAqCUNs ZWFuIHVwIGEgc2luZ2xlIHJlbCBhdCBzdWJ0cmFuc2FjdGlvbiBjb21taXQgb3IgYWJvcnQK ICoKICogTkI6IHRoaXMgcHJvY2Vzc2luZyBtdXN0IGJlIGlkZW1wb3RlbnQsIGJlY2F1c2Ug RU9YYWN0TGlzdEFkZCgpIGRvZXNuJ3QKICogYm90aGVyIHRvIHByZXZlbnQgZHVwbGljYXRl IGVudHJpZXMgaW4gZW94YWN0X2xpc3RbXS4KICovCnN0YXRpYyB2b2lkCkF0RU9TdWJYYWN0 X2NsZWFudXAoUmVsYXRpb24gcmVsYXRpb24sIGJvb2wgaXNDb21taXQsCgkJCQkJU3ViVHJh bnNhY3Rpb25JZCBteVN1YmlkLCBTdWJUcmFuc2FjdGlvbklkIHBhcmVudFN1YmlkKQp7Cgkv KgoJICogSXMgaXQgYSByZWxhdGlvbiBjcmVhdGVkIGluIHRoZSBjdXJyZW50IHN1YnRyYW5z YWN0aW9uPwoJICoKCSAqIER1cmluZyBzdWJjb21taXQsIG1hcmsgaXQgYXMgYmVsb25naW5n IHRvIHRoZSBwYXJlbnQsIGluc3RlYWQsIGFzIGxvbmcKCSAqIGFzIGl0IGhhcyBub3QgYmVl biBkcm9wcGVkLiBPdGhlcndpc2Ugc2ltcGx5IGRlbGV0ZSB0aGUgcmVsY2FjaGUgZW50cnku CgkgKiAtLS0gaXQgaXNuJ3QgaW50ZXJlc3RpbmcgYW55IGxvbmdlci4KCSAqLwoJaWYgKHJl bGF0aW9uLT5yZF9jcmVhdGVTdWJpZCA9PSBteVN1YmlkKQoJewoJCS8qCgkJICogVmFsaWQg cmRfZHJvcHBlZFN1YmlkIG1lYW5zIHRoZSBjb3JyZXNwb25kaW5nIHJlbGF0aW9uIGlzIGRy b3BwZWQKCQkgKiBidXQgdGhlIHJlbGNhY2hlIGVudHJ5IGlzIHByZXNlcnZlZCBmb3IgYXQt Y29tbWl0IHBlbmRpbmcgc3luYy4gV2UKCQkgKiBuZWVkIHRvIGRyb3AgaXQgZXhwbGljaXRs eSBoZXJlIG5vdCB0byBtYWtlIHRoZSBlbnRyeSBvcnBoYW4uCgkJICovCgkJQXNzZXJ0KHJl bGF0aW9uLT5yZF9kcm9wcGVkU3ViaWQgPT0gbXlTdWJpZCB8fAoJCQkgICByZWxhdGlvbi0+ cmRfZHJvcHBlZFN1YmlkID09IEludmFsaWRTdWJUcmFuc2FjdGlvbklkKTsKCQlpZiAoaXND b21taXQgJiYgcmVsYXRpb24tPnJkX2Ryb3BwZWRTdWJpZCA9PSBJbnZhbGlkU3ViVHJhbnNh Y3Rpb25JZCkKCQkJcmVsYXRpb24tPnJkX2NyZWF0ZVN1YmlkID0gcGFyZW50U3ViaWQ7CgkJ ZWxzZSBpZiAoUmVsYXRpb25IYXNSZWZlcmVuY2VDb3VudFplcm8ocmVsYXRpb24pKQoJCXsK CQkJLyogYWxsb3cgdGhlIGVudHJ5IHRvIGJlIHJlbW92ZWQgKi8KCQkJcmVsYXRpb24tPnJk X2NyZWF0ZVN1YmlkID0gSW52YWxpZFN1YlRyYW5zYWN0aW9uSWQ7CgkJCXJlbGF0aW9uLT5y ZF9uZXdSZWxmaWxlbG9jYXRvclN1YmlkID0gSW52YWxpZFN1YlRyYW5zYWN0aW9uSWQ7CgkJ CXJlbGF0aW9uLT5yZF9maXJzdFJlbGZpbGVsb2NhdG9yU3ViaWQgPSBJbnZhbGlkU3ViVHJh bnNhY3Rpb25JZDsKCQkJcmVsYXRpb24tPnJkX2Ryb3BwZWRTdWJpZCA9IEludmFsaWRTdWJU cmFuc2FjdGlvbklkOwoJCQlSZWxhdGlvbkNsZWFyUmVsYXRpb24ocmVsYXRpb24pOwoJCQly ZXR1cm47CgkJfQoJCWVsc2UKCQl7CgkJCS8qCgkJCSAqIEhtbSwgc29tZXdoZXJlIHRoZXJl J3MgYSAobGVha2VkPykgcmVmZXJlbmNlIHRvIHRoZSByZWxhdGlvbi4KCQkJICogV2UgZGFy ZW4ndCByZW1vdmUgdGhlIGVudHJ5IGZvciBmZWFyIG9mIGRlcmVmZXJlbmNpbmcgYQoJCQkg KiBkYW5nbGluZyBwb2ludGVyIGxhdGVyLiAgQmxlYXQsIGFuZCB0cmFuc2ZlciBpdCB0byB0 aGUgcGFyZW50CgkJCSAqIHN1YnRyYW5zYWN0aW9uIHNvIHdlIGNhbiB0cnkgYWdhaW4gbGF0 ZXIuICBUaGlzIG11c3QgYmUganVzdCBhCgkJCSAqIFdBUk5JTkcgdG8gYXZvaWQgZXJyb3It ZHVyaW5nLWVycm9yLXJlY292ZXJ5IGxvb3BzLgoJCQkgKi8KCQkJcmVsYXRpb24tPnJkX2Ny ZWF0ZVN1YmlkID0gcGFyZW50U3ViaWQ7CgkJCWVsb2coV0FSTklORywgImNhbm5vdCByZW1v dmUgcmVsY2FjaGUgZW50cnkgZm9yIFwiJXNcIiBiZWNhdXNlIGl0IGhhcyBub256ZXJvIHJl ZmNvdW50IiwKCQkJCSBSZWxhdGlvbkdldFJlbGF0aW9uTmFtZShyZWxhdGlvbikpOwoJCX0K CX0KCgkvKgoJICogTGlrZXdpc2UsIHVwZGF0ZSBvciBkcm9wIGFueSBuZXctcmVsZmlsZW51 bWJlci1pbi1zdWJ0cmFuc2FjdGlvbiByZWNvcmQKCSAqIG9yIGRyb3AgcmVjb3JkLgoJICov CglpZiAocmVsYXRpb24tPnJkX25ld1JlbGZpbGVsb2NhdG9yU3ViaWQgPT0gbXlTdWJpZCkK CXsKCQlpZiAoaXNDb21taXQpCgkJCXJlbGF0aW9uLT5yZF9uZXdSZWxmaWxlbG9jYXRvclN1 YmlkID0gcGFyZW50U3ViaWQ7CgkJZWxzZQoJCQlyZWxhdGlvbi0+cmRfbmV3UmVsZmlsZWxv Y2F0b3JTdWJpZCA9IEludmFsaWRTdWJUcmFuc2FjdGlvbklkOwoJfQoKCWlmIChyZWxhdGlv bi0+cmRfZmlyc3RSZWxmaWxlbG9jYXRvclN1YmlkID09IG15U3ViaWQpCgl7CgkJaWYgKGlz Q29tbWl0KQoJCQlyZWxhdGlvbi0+cmRfZmlyc3RSZWxmaWxlbG9jYXRvclN1YmlkID0gcGFy ZW50U3ViaWQ7CgkJZWxzZQoJCQlyZWxhdGlvbi0+cmRfZmlyc3RSZWxmaWxlbG9jYXRvclN1 YmlkID0gSW52YWxpZFN1YlRyYW5zYWN0aW9uSWQ7Cgl9CgoJaWYgKHJlbGF0aW9uLT5yZF9k cm9wcGVkU3ViaWQgPT0gbXlTdWJpZCkKCXsKCQlpZiAoaXNDb21taXQpCgkJCXJlbGF0aW9u LT5yZF9kcm9wcGVkU3ViaWQgPSBwYXJlbnRTdWJpZDsKCQllbHNlCgkJCXJlbGF0aW9uLT5y ZF9kcm9wcGVkU3ViaWQgPSBJbnZhbGlkU3ViVHJhbnNhY3Rpb25JZDsKCX0KfQoKCi8qCiAq CQlSZWxhdGlvbkJ1aWxkTG9jYWxSZWxhdGlvbgogKgkJCUJ1aWxkIGEgcmVsY2FjaGUgZW50 cnkgZm9yIGFuIGFib3V0LXRvLWJlLWNyZWF0ZWQgcmVsYXRpb24sCiAqCQkJYW5kIGVudGVy IGl0IGludG8gdGhlIHJlbGNhY2hlLgogKi8KUmVsYXRpb24KUmVsYXRpb25CdWlsZExvY2Fs UmVsYXRpb24oY29uc3QgY2hhciAqcmVsbmFtZSwKCQkJCQkJICAgT2lkIHJlbG5hbWVzcGFj ZSwKCQkJCQkJICAgVHVwbGVEZXNjIHR1cERlc2MsCgkJCQkJCSAgIE9pZCByZWxpZCwKCQkJ CQkJICAgT2lkIGFjY2Vzc210ZCwKCQkJCQkJICAgUmVsRmlsZU51bWJlciByZWxmaWxlbnVt YmVyLAoJCQkJCQkgICBPaWQgcmVsdGFibGVzcGFjZSwKCQkJCQkJICAgYm9vbCBzaGFyZWRf cmVsYXRpb24sCgkJCQkJCSAgIGJvb2wgbWFwcGVkX3JlbGF0aW9uLAoJCQkJCQkgICBjaGFy IHJlbHBlcnNpc3RlbmNlLAoJCQkJCQkgICBjaGFyIHJlbGtpbmQpCnsKCVJlbGF0aW9uCXJl bDsKCU1lbW9yeUNvbnRleHQgb2xkY3h0OwoJaW50CQkJbmF0dHMgPSB0dXBEZXNjLT5uYXR0 czsKCWludAkJCWk7Cglib29sCQloYXNfbm90X251bGw7Cglib29sCQluYWlsaXQ7CgoJQXNz ZXJ0KG5hdHRzID49IDApOwoKCS8qCgkgKiBjaGVjayBmb3IgY3JlYXRpb24gb2YgYSByZWwg dGhhdCBtdXN0IGJlIG5haWxlZCBpbiBjYWNoZS4KCSAqCgkgKiBYWFggdGhpcyBsaXN0IGhh ZCBiZXR0ZXIgbWF0Y2ggdGhlIHJlbGF0aW9ucyBzcGVjaWFsbHkgaGFuZGxlZCBpbgoJICog UmVsYXRpb25DYWNoZUluaXRpYWxpemVQaGFzZTIvMy4KCSAqLwoJc3dpdGNoIChyZWxpZCkK CXsKCQljYXNlIERhdGFiYXNlUmVsYXRpb25JZDoKCQljYXNlIEF1dGhJZFJlbGF0aW9uSWQ6 CgkJY2FzZSBBdXRoTWVtUmVsYXRpb25JZDoKCQljYXNlIFJlbGF0aW9uUmVsYXRpb25JZDoK CQljYXNlIEF0dHJpYnV0ZVJlbGF0aW9uSWQ6CgkJY2FzZSBQcm9jZWR1cmVSZWxhdGlvbklk OgoJCWNhc2UgVHlwZVJlbGF0aW9uSWQ6CgkJCW5haWxpdCA9IHRydWU7CgkJCWJyZWFrOwoJ CWRlZmF1bHQ6CgkJCW5haWxpdCA9IGZhbHNlOwoJCQlicmVhazsKCX0KCgkvKgoJICogY2hl Y2sgdGhhdCBoYXJkd2lyZWQgbGlzdCBvZiBzaGFyZWQgcmVscyBtYXRjaGVzIHdoYXQncyBp biB0aGUKCSAqIGJvb3RzdHJhcCAuYmtpIGZpbGUuICBJZiB5b3UgZ2V0IGEgZmFpbHVyZSBo ZXJlIGR1cmluZyBpbml0ZGIsIHlvdQoJICogcHJvYmFibHkgbmVlZCB0byBmaXggSXNTaGFy ZWRSZWxhdGlvbigpIHRvIG1hdGNoIHdoYXRldmVyIHlvdSd2ZSBkb25lCgkgKiB0byB0aGUg c2V0IG9mIHNoYXJlZCByZWxhdGlvbnMuCgkgKi8KCWlmIChzaGFyZWRfcmVsYXRpb24gIT0g SXNTaGFyZWRSZWxhdGlvbihyZWxpZCkpCgkJZWxvZyhFUlJPUiwgInNoYXJlZF9yZWxhdGlv biBmbGFnIGZvciBcIiVzXCIgZG9lcyBub3QgbWF0Y2ggSXNTaGFyZWRSZWxhdGlvbigldSki LAoJCQkgcmVsbmFtZSwgcmVsaWQpOwoKCS8qIFNoYXJlZCByZWxhdGlvbnMgaGFkIGJldHRl ciBiZSBtYXBwZWQsIHRvbyAqLwoJQXNzZXJ0KG1hcHBlZF9yZWxhdGlvbiB8fCAhc2hhcmVk X3JlbGF0aW9uKTsKCgkvKgoJICogc3dpdGNoIHRvIHRoZSBjYWNoZSBjb250ZXh0IHRvIGNy ZWF0ZSB0aGUgcmVsY2FjaGUgZW50cnkuCgkgKi8KCWlmICghQ2FjaGVNZW1vcnlDb250ZXh0 KQoJCUNyZWF0ZUNhY2hlTWVtb3J5Q29udGV4dCgpOwoKCW9sZGN4dCA9IE1lbW9yeUNvbnRl eHRTd2l0Y2hUbyhDYWNoZU1lbW9yeUNvbnRleHQpOwoKCS8qCgkgKiBhbGxvY2F0ZSBhIG5l dyByZWxhdGlvbiBkZXNjcmlwdG9yIGFuZCBmaWxsIGluIGJhc2ljIHN0YXRlIGZpZWxkcy4K CSAqLwoJcmVsID0gcGFsbG9jMF9vYmplY3QoUmVsYXRpb25EYXRhKTsKCgkvKiBtYWtlIHN1 cmUgcmVsYXRpb24gaXMgbWFya2VkIGFzIGhhdmluZyBubyBvcGVuIGZpbGUgeWV0ICovCgly ZWwtPnJkX3NtZ3IgPSBOVUxMOwoKCS8qIG1hcmsgaXQgbmFpbGVkIGlmIGFwcHJvcHJpYXRl ICovCglyZWwtPnJkX2lzbmFpbGVkID0gbmFpbGl0OwoKCXJlbC0+cmRfcmVmY250ID0gbmFp bGl0ID8gMSA6IDA7CgoJLyogaXQncyBiZWluZyBjcmVhdGVkIGluIHRoaXMgdHJhbnNhY3Rp b24gKi8KCXJlbC0+cmRfY3JlYXRlU3ViaWQgPSBHZXRDdXJyZW50U3ViVHJhbnNhY3Rpb25J ZCgpOwoJcmVsLT5yZF9uZXdSZWxmaWxlbG9jYXRvclN1YmlkID0gSW52YWxpZFN1YlRyYW5z YWN0aW9uSWQ7CglyZWwtPnJkX2ZpcnN0UmVsZmlsZWxvY2F0b3JTdWJpZCA9IEludmFsaWRT dWJUcmFuc2FjdGlvbklkOwoJcmVsLT5yZF9kcm9wcGVkU3ViaWQgPSBJbnZhbGlkU3ViVHJh bnNhY3Rpb25JZDsKCgkvKgoJICogY3JlYXRlIGEgbmV3IHR1cGxlIGRlc2NyaXB0b3IgZnJv bSB0aGUgb25lIHBhc3NlZCBpbi4gIFdlIGRvIHRoaXMKCSAqIHBhcnRseSB0byBjb3B5IGl0 IGludG8gdGhlIGNhY2hlIGNvbnRleHQsIGFuZCBwYXJ0bHkgYmVjYXVzZSB0aGUgbmV3Cgkg KiByZWxhdGlvbiBjYW4ndCBoYXZlIGFueSBkZWZhdWx0cyBvciBjb25zdHJhaW50cyB5ZXQ7 IHRoZXkgaGF2ZSB0byBiZQoJICogYWRkZWQgaW4gbGF0ZXIgc3RlcHMsIGJlY2F1c2UgdGhl eSByZXF1aXJlIGFkZGl0aW9ucyB0byBtdWx0aXBsZSBzeXN0ZW0KCSAqIGNhdGFsb2dzLiAg V2UgY2FuIGNvcHkgYXR0bm90bnVsbCBjb25zdHJhaW50cyBoZXJlLCBob3dldmVyLgoJICov CglyZWwtPnJkX2F0dCA9IENyZWF0ZVR1cGxlRGVzY0NvcHkodHVwRGVzYyk7CglyZWwtPnJk X2F0dC0+dGRyZWZjb3VudCA9IDE7CS8qIG1hcmsgYXMgcmVmY291bnRlZCAqLwoJaGFzX25v dF9udWxsID0gZmFsc2U7Cglmb3IgKGkgPSAwOyBpIDwgbmF0dHM7IGkrKykKCXsKCQlGb3Jt X3BnX2F0dHJpYnV0ZSBzYXR0ID0gVHVwbGVEZXNjQXR0cih0dXBEZXNjLCBpKTsKCQlGb3Jt X3BnX2F0dHJpYnV0ZSBkYXR0ID0gVHVwbGVEZXNjQXR0cihyZWwtPnJkX2F0dCwgaSk7CgoJ CWRhdHQtPmF0dGlkZW50aXR5ID0gc2F0dC0+YXR0aWRlbnRpdHk7CgkJZGF0dC0+YXR0Z2Vu ZXJhdGVkID0gc2F0dC0+YXR0Z2VuZXJhdGVkOwoJCWRhdHQtPmF0dG5vdG51bGwgPSBzYXR0 LT5hdHRub3RudWxsOwoJCWhhc19ub3RfbnVsbCB8PSBzYXR0LT5hdHRub3RudWxsOwoJCXBv cHVsYXRlX2NvbXBhY3RfYXR0cmlidXRlKHJlbC0+cmRfYXR0LCBpKTsKCgkJaWYgKHNhdHQt PmF0dG5vdG51bGwpCgkJewoJCQlDb21wYWN0QXR0cmlidXRlICpzY2F0dCA9IFR1cGxlRGVz Y0NvbXBhY3RBdHRyKHR1cERlc2MsIGkpOwoJCQlDb21wYWN0QXR0cmlidXRlICpkY2F0dCA9 IFR1cGxlRGVzY0NvbXBhY3RBdHRyKHJlbC0+cmRfYXR0LCBpKTsKCgkJCWRjYXR0LT5hdHRu dWxsYWJpbGl0eSA9IHNjYXR0LT5hdHRudWxsYWJpbGl0eTsKCQl9Cgl9CgoJaWYgKGhhc19u b3RfbnVsbCkKCXsKCQlUdXBsZUNvbnN0ciAqY29uc3RyID0gcGFsbG9jMF9vYmplY3QoVHVw bGVDb25zdHIpOwoKCQljb25zdHItPmhhc19ub3RfbnVsbCA9IHRydWU7CgkJcmVsLT5yZF9h dHQtPmNvbnN0ciA9IGNvbnN0cjsKCX0KCgkvKgoJICogaW5pdGlhbGl6ZSByZWxhdGlvbiB0 dXBsZSBmb3JtIChjYWxsZXIgbWF5IGFkZC9vdmVycmlkZSBkYXRhIGxhdGVyKQoJICovCgly ZWwtPnJkX3JlbCA9IChGb3JtX3BnX2NsYXNzKSBwYWxsb2MwKENMQVNTX1RVUExFX1NJWkUp OwoKCW5hbWVzdHJjcHkoJnJlbC0+cmRfcmVsLT5yZWxuYW1lLCByZWxuYW1lKTsKCXJlbC0+ cmRfcmVsLT5yZWxuYW1lc3BhY2UgPSByZWxuYW1lc3BhY2U7CgoJcmVsLT5yZF9yZWwtPnJl bGtpbmQgPSByZWxraW5kOwoJcmVsLT5yZF9yZWwtPnJlbG5hdHRzID0gbmF0dHM7CglyZWwt PnJkX3JlbC0+cmVsdHlwZSA9IEludmFsaWRPaWQ7CgkvKiBuZWVkZWQgd2hlbiBib290c3Ry YXBwaW5nOiAqLwoJcmVsLT5yZF9yZWwtPnJlbG93bmVyID0gQk9PVFNUUkFQX1NVUEVSVVNF UklEOwoKCS8qIHNldCB1cCBwZXJzaXN0ZW5jZSBhbmQgcmVsY2FjaGUgZmllbGRzIGRlcGVu ZGVudCBvbiBpdCAqLwoJcmVsLT5yZF9yZWwtPnJlbHBlcnNpc3RlbmNlID0gcmVscGVyc2lz dGVuY2U7Cglzd2l0Y2ggKHJlbHBlcnNpc3RlbmNlKQoJewoJCWNhc2UgUkVMUEVSU0lTVEVO Q0VfVU5MT0dHRUQ6CgkJY2FzZSBSRUxQRVJTSVNURU5DRV9QRVJNQU5FTlQ6CgkJCXJlbC0+ cmRfYmFja2VuZCA9IElOVkFMSURfUFJPQ19OVU1CRVI7CgkJCXJlbC0+cmRfaXNsb2NhbHRl bXAgPSBmYWxzZTsKCQkJYnJlYWs7CgkJY2FzZSBSRUxQRVJTSVNURU5DRV9URU1QOgoJCQlB c3NlcnQoaXNUZW1wT3JUZW1wVG9hc3ROYW1lc3BhY2UocmVsbmFtZXNwYWNlKSk7CgkJCXJl bC0+cmRfYmFja2VuZCA9IFByb2NOdW1iZXJGb3JUZW1wUmVsYXRpb25zKCk7CgkJCXJlbC0+ cmRfaXNsb2NhbHRlbXAgPSB0cnVlOwoJCQlicmVhazsKCQlkZWZhdWx0OgoJCQllbG9nKEVS Uk9SLCAiaW52YWxpZCByZWxwZXJzaXN0ZW5jZTogJWMiLCByZWxwZXJzaXN0ZW5jZSk7CgkJ CWJyZWFrOwoJfQoKCS8qIGlmIGl0J3MgYSBtYXRlcmlhbGl6ZWQgdmlldywgaXQncyBub3Qg cG9wdWxhdGVkIGluaXRpYWxseSAqLwoJaWYgKHJlbGtpbmQgPT0gUkVMS0lORF9NQVRWSUVX KQoJCXJlbC0+cmRfcmVsLT5yZWxpc3BvcHVsYXRlZCA9IGZhbHNlOwoJZWxzZQoJCXJlbC0+ cmRfcmVsLT5yZWxpc3BvcHVsYXRlZCA9IHRydWU7CgoJLyogc2V0IHJlcGxpY2EgaWRlbnRp dHkgLS0gc3lzdGVtIGNhdGFsb2dzIGFuZCBub24tdGFibGVzIGRvbid0IGhhdmUgb25lICov CglpZiAoIUlzQ2F0YWxvZ05hbWVzcGFjZShyZWxuYW1lc3BhY2UpICYmCgkJKHJlbGtpbmQg PT0gUkVMS0lORF9SRUxBVElPTiB8fAoJCSByZWxraW5kID09IFJFTEtJTkRfTUFUVklFVyB8 fAoJCSByZWxraW5kID09IFJFTEtJTkRfUEFSVElUSU9ORURfVEFCTEUpKQoJCXJlbC0+cmRf cmVsLT5yZWxyZXBsaWRlbnQgPSBSRVBMSUNBX0lERU5USVRZX0RFRkFVTFQ7CgllbHNlCgkJ cmVsLT5yZF9yZWwtPnJlbHJlcGxpZGVudCA9IFJFUExJQ0FfSURFTlRJVFlfTk9USElORzsK CgkvKgoJICogSW5zZXJ0IHJlbGF0aW9uIHBoeXNpY2FsIGFuZCBsb2dpY2FsIGlkZW50aWZp ZXJzIChPSURzKSBpbnRvIHRoZSByaWdodAoJICogcGxhY2VzLiAgRm9yIGEgbWFwcGVkIHJl bGF0aW9uLCB3ZSBzZXQgcmVsZmlsZW51bWJlciB0byB6ZXJvIGFuZCByZWx5CgkgKiBvbiBS ZWxhdGlvbkluaXRQaHlzaWNhbEFkZHIgdG8gY29uc3VsdCB0aGUgbWFwLgoJICovCglyZWwt PnJkX3JlbC0+cmVsaXNzaGFyZWQgPSBzaGFyZWRfcmVsYXRpb247CgoJUmVsYXRpb25HZXRS ZWxpZChyZWwpID0gcmVsaWQ7CgoJZm9yIChpID0gMDsgaSA8IG5hdHRzOyBpKyspCgkJVHVw bGVEZXNjQXR0cihyZWwtPnJkX2F0dCwgaSktPmF0dHJlbGlkID0gcmVsaWQ7CgoJVHVwbGVE ZXNjRmluYWxpemUocmVsLT5yZF9hdHQpOwoKCXJlbC0+cmRfcmVsLT5yZWx0YWJsZXNwYWNl ID0gcmVsdGFibGVzcGFjZTsKCglpZiAobWFwcGVkX3JlbGF0aW9uKQoJewoJCXJlbC0+cmRf cmVsLT5yZWxmaWxlbm9kZSA9IEludmFsaWRSZWxGaWxlTnVtYmVyOwoJCS8qIEFkZCBpdCB0 byB0aGUgYWN0aXZlIG1hcHBpbmcgaW5mb3JtYXRpb24gKi8KCQlSZWxhdGlvbk1hcFVwZGF0 ZU1hcChyZWxpZCwgcmVsZmlsZW51bWJlciwgc2hhcmVkX3JlbGF0aW9uLCB0cnVlKTsKCX0K CWVsc2UKCQlyZWwtPnJkX3JlbC0+cmVsZmlsZW5vZGUgPSByZWxmaWxlbnVtYmVyOwoKCVJl bGF0aW9uSW5pdExvY2tJbmZvKHJlbCk7CS8qIHNlZSBsbWdyLmMgKi8KCglSZWxhdGlvbklu aXRQaHlzaWNhbEFkZHIocmVsKTsKCglyZWwtPnJkX3JlbC0+cmVsYW0gPSBhY2Nlc3NtdGQ7 CgoJLyoKCSAqIFJlbGF0aW9uSW5pdFRhYmxlQWNjZXNzTWV0aG9kIHdpbGwgZG8gc3lzY2Fj aGUgbG9va3Vwcywgc28gd2UgbXVzdG4ndAoJICogcnVuIGl0IGluIENhY2hlTWVtb3J5Q29u dGV4dC4gIEZvcnR1bmF0ZWx5LCB0aGUgcmVtYWluaW5nIHN0ZXBzIGRvbid0CgkgKiByZXF1 aXJlIGEgbG9uZy1saXZlZCBjdXJyZW50IGNvbnRleHQuCgkgKi8KCU1lbW9yeUNvbnRleHRT d2l0Y2hUbyhvbGRjeHQpOwoKCWlmIChSRUxLSU5EX0hBU19UQUJMRV9BTShyZWxraW5kKSB8 fCByZWxraW5kID09IFJFTEtJTkRfU0VRVUVOQ0UpCgkJUmVsYXRpb25Jbml0VGFibGVBY2Nl c3NNZXRob2QocmVsKTsKCgkvKgoJICogTGVhdmUgaW5kZXggYWNjZXNzIG1ldGhvZCB1bmlu aXRpYWxpemVkLCBiZWNhdXNlIHRoZSBwZ19pbmRleCByb3cgaGFzCgkgKiBub3QgYmVlbiBp bnNlcnRlZCBhdCB0aGlzIHN0YWdlIG9mIGluZGV4IGNyZWF0aW9uIHlldC4gIFRoZSBjYWNo ZQoJICogaW52YWxpZGF0aW9uIGFmdGVyIHBnX2luZGV4IHJvdyBoYXMgYmVlbiBpbnNlcnRl ZCB3aWxsIGluaXRpYWxpemUgaXQuCgkgKi8KCgkvKgoJICogT2theSB0byBpbnNlcnQgaW50 byB0aGUgcmVsY2FjaGUgaGFzaCB0YWJsZS4KCSAqCgkgKiBPcmRpbmFyaWx5LCB0aGVyZSBz aG91bGQgY2VydGFpbmx5IG5vdCBiZSBhbiBleGlzdGluZyBoYXNoIGVudHJ5IGZvcgoJICog dGhlIHNhbWUgT0lEOyBidXQgZHVyaW5nIGJvb3RzdHJhcCwgd2hlbiB3ZSBjcmVhdGUgYSAi cmVhbCIgcmVsY2FjaGUKCSAqIGVudHJ5IGZvciBvbmUgb2YgdGhlIGJvb3RzdHJhcCByZWxh dGlvbnMsIHdlJ2xsIGJlIG92ZXJ3cml0aW5nIHRoZQoJICogcGhvbnkgb25lIGNyZWF0ZWQg d2l0aCBmb3JtcmRlc2MuICBTbyBhbGxvdyB0aGF0IHRvIGhhcHBlbiBmb3IgbmFpbGVkCgkg KiByZWxzLgoJICovCglSZWxhdGlvbkNhY2hlSW5zZXJ0KHJlbCwgbmFpbGl0KTsKCgkvKgoJ ICogRmxhZyByZWxhdGlvbiBhcyBuZWVkaW5nIGVveGFjdCBjbGVhbnVwICh0byBjbGVhciBy ZF9jcmVhdGVTdWJpZCkuIFdlCgkgKiBjYW4ndCBkbyB0aGlzIGJlZm9yZSBzdG9yaW5nIHJl bGlkIGluIGl0LgoJICovCglFT1hhY3RMaXN0QWRkKHJlbCk7CgoJLyogSXQncyBmdWxseSB2 YWxpZCAqLwoJcmVsLT5yZF9pc3ZhbGlkID0gdHJ1ZTsKCgkvKgoJICogQ2FsbGVyIGV4cGVj dHMgdXMgdG8gcGluIHRoZSByZXR1cm5lZCBlbnRyeS4KCSAqLwoJUmVsYXRpb25JbmNyZW1l bnRSZWZlcmVuY2VDb3VudChyZWwpOwoKCXJldHVybiByZWw7Cn0KCgovKgogKiBSZWxhdGlv blNldE5ld1JlbGZpbGVudW1iZXIKICoKICogQXNzaWduIGEgbmV3IHJlbGZpbGVudW1iZXIg KHBoeXNpY2FsIGZpbGUgbmFtZSksIGFuZCBwb3NzaWJseSBhIG5ldwogKiBwZXJzaXN0ZW5j ZSBzZXR0aW5nLCB0byB0aGUgcmVsYXRpb24uCiAqCiAqIFRoaXMgYWxsb3dzIGEgZnVsbCBy ZXdyaXRlIG9mIHRoZSByZWxhdGlvbiB0byBiZSBkb25lIHdpdGggdHJhbnNhY3Rpb25hbAog KiBzYWZldHkgKHNpbmNlIHRoZSBmaWxlbnVtYmVyIGFzc2lnbm1lbnQgY2FuIGJlIHJvbGxl ZCBiYWNrKS4gIE5vdGUgaG93ZXZlcgogKiB0aGF0IHRoZXJlIGlzIG5vIHNpbXBsZSB3YXkg dG8gYWNjZXNzIHRoZSByZWxhdGlvbidzIG9sZCBkYXRhIGZvciB0aGUKICogcmVtYWluZGVy IG9mIHRoZSBjdXJyZW50IHRyYW5zYWN0aW9uLiAgVGhpcyBsaW1pdHMgdGhlIHVzZWZ1bG5l c3MgdG8gY2FzZXMKICogc3VjaCBhcyBUUlVOQ0FURSBvciByZWJ1aWxkaW5nIGFuIGluZGV4 IGZyb20gc2NyYXRjaC4KICoKICogQ2FsbGVyIG11c3QgYWxyZWFkeSBob2xkIGV4Y2x1c2l2 ZSBsb2NrIG9uIHRoZSByZWxhdGlvbi4KICovCnZvaWQKUmVsYXRpb25TZXROZXdSZWxmaWxl bnVtYmVyKFJlbGF0aW9uIHJlbGF0aW9uLCBjaGFyIHBlcnNpc3RlbmNlKQp7CglSZWxGaWxl TnVtYmVyIG5ld3JlbGZpbGVudW1iZXI7CglSZWxhdGlvbglwZ19jbGFzczsKCUl0ZW1Qb2lu dGVyRGF0YSBvdGlkOwoJSGVhcFR1cGxlCXR1cGxlOwoJRm9ybV9wZ19jbGFzcyBjbGFzc2Zv cm07CglNdWx0aVhhY3RJZCBtaW5tdWx0aSA9IEludmFsaWRNdWx0aVhhY3RJZDsKCVRyYW5z YWN0aW9uSWQgZnJlZXplWGlkID0gSW52YWxpZFRyYW5zYWN0aW9uSWQ7CglSZWxGaWxlTG9j YXRvciBuZXdybG9jYXRvcjsKCglpZiAoIUlzQmluYXJ5VXBncmFkZSkKCXsKCQkvKiBBbGxv Y2F0ZSBhIG5ldyByZWxmaWxlbnVtYmVyICovCgkJbmV3cmVsZmlsZW51bWJlciA9IEdldE5l d1JlbEZpbGVOdW1iZXIocmVsYXRpb24tPnJkX3JlbC0+cmVsdGFibGVzcGFjZSwKCQkJCQkJ CQkJCQkgICBOVUxMLCBwZXJzaXN0ZW5jZSk7Cgl9CgllbHNlIGlmIChyZWxhdGlvbi0+cmRf cmVsLT5yZWxraW5kID09IFJFTEtJTkRfSU5ERVgpCgl7CgkJaWYgKCFPaWRJc1ZhbGlkKGJp bmFyeV91cGdyYWRlX25leHRfaW5kZXhfcGdfY2xhc3NfcmVsZmlsZW51bWJlcikpCgkJCWVy ZXBvcnQoRVJST1IsCgkJCQkJKGVycmNvZGUoRVJSQ09ERV9JTlZBTElEX1BBUkFNRVRFUl9W QUxVRSksCgkJCQkJIGVycm1zZygiaW5kZXggcmVsZmlsZW51bWJlciB2YWx1ZSBub3Qgc2V0 IHdoZW4gaW4gYmluYXJ5IHVwZ3JhZGUgbW9kZSIpKSk7CgoJCW5ld3JlbGZpbGVudW1iZXIg PSBiaW5hcnlfdXBncmFkZV9uZXh0X2luZGV4X3BnX2NsYXNzX3JlbGZpbGVudW1iZXI7CgkJ YmluYXJ5X3VwZ3JhZGVfbmV4dF9pbmRleF9wZ19jbGFzc19yZWxmaWxlbnVtYmVyID0gSW52 YWxpZE9pZDsKCX0KCWVsc2UgaWYgKHJlbGF0aW9uLT5yZF9yZWwtPnJlbGtpbmQgPT0gUkVM S0lORF9SRUxBVElPTikKCXsKCQlpZiAoIU9pZElzVmFsaWQoYmluYXJ5X3VwZ3JhZGVfbmV4 dF9oZWFwX3BnX2NsYXNzX3JlbGZpbGVudW1iZXIpKQoJCQllcmVwb3J0KEVSUk9SLAoJCQkJ CShlcnJjb2RlKEVSUkNPREVfSU5WQUxJRF9QQVJBTUVURVJfVkFMVUUpLAoJCQkJCSBlcnJt c2coImhlYXAgcmVsZmlsZW51bWJlciB2YWx1ZSBub3Qgc2V0IHdoZW4gaW4gYmluYXJ5IHVw Z3JhZGUgbW9kZSIpKSk7CgoJCW5ld3JlbGZpbGVudW1iZXIgPSBiaW5hcnlfdXBncmFkZV9u ZXh0X2hlYXBfcGdfY2xhc3NfcmVsZmlsZW51bWJlcjsKCQliaW5hcnlfdXBncmFkZV9uZXh0 X2hlYXBfcGdfY2xhc3NfcmVsZmlsZW51bWJlciA9IEludmFsaWRPaWQ7Cgl9CgllbHNlCgkJ ZXJlcG9ydChFUlJPUiwKCQkJCShlcnJjb2RlKEVSUkNPREVfSU5WQUxJRF9QQVJBTUVURVJf VkFMVUUpLAoJCQkJIGVycm1zZygidW5leHBlY3RlZCByZXF1ZXN0IGZvciBuZXcgcmVsZmls ZW51bWJlciBpbiBiaW5hcnkgdXBncmFkZSBtb2RlIikpKTsKCgkvKgoJICogR2V0IGEgd3Jp dGFibGUgY29weSBvZiB0aGUgcGdfY2xhc3MgdHVwbGUgZm9yIHRoZSBnaXZlbiByZWxhdGlv bi4KCSAqLwoJcGdfY2xhc3MgPSB0YWJsZV9vcGVuKFJlbGF0aW9uUmVsYXRpb25JZCwgUm93 RXhjbHVzaXZlTG9jayk7CgoJdHVwbGUgPSBTZWFyY2hTeXNDYWNoZUxvY2tlZENvcHkxKFJF TE9JRCwKCQkJCQkJCQkJICBPYmplY3RJZEdldERhdHVtKFJlbGF0aW9uR2V0UmVsaWQocmVs YXRpb24pKSk7CglpZiAoIUhlYXBUdXBsZUlzVmFsaWQodHVwbGUpKQoJCWVsb2coRVJST1Is ICJjb3VsZCBub3QgZmluZCB0dXBsZSBmb3IgcmVsYXRpb24gJXUiLAoJCQkgUmVsYXRpb25H ZXRSZWxpZChyZWxhdGlvbikpOwoJb3RpZCA9IHR1cGxlLT50X3NlbGY7CgljbGFzc2Zvcm0g PSAoRm9ybV9wZ19jbGFzcykgR0VUU1RSVUNUKHR1cGxlKTsKCgkvKgoJICogU2NoZWR1bGUg dW5saW5raW5nIG9mIHRoZSBvbGQgc3RvcmFnZSBhdCB0cmFuc2FjdGlvbiBjb21taXQsIGV4 Y2VwdAoJICogd2hlbiBwZXJmb3JtaW5nIGEgYmluYXJ5IHVwZ3JhZGUsIHdoZW4gd2UgbXVz dCBkbyBpdCBpbW1lZGlhdGVseS4KCSAqLwoJaWYgKElzQmluYXJ5VXBncmFkZSkKCXsKCQlT TWdyUmVsYXRpb24gc3JlbDsKCgkJLyoKCQkgKiBEdXJpbmcgYSBiaW5hcnkgdXBncmFkZSwg d2UgdXNlIHRoaXMgY29kZSBwYXRoIHRvIGVuc3VyZSB0aGF0CgkJICogcGdfbGFyZ2VvYmpl Y3QgYW5kIGl0cyBpbmRleCBoYXZlIHRoZSBzYW1lIHJlbGZpbGVudW1iZXJzIGFzIGluIHRo ZQoJCSAqIG9sZCBjbHVzdGVyLiBUaGlzIGlzIG5lY2Vzc2FyeSBiZWNhdXNlIHBnX3VwZ3Jh ZGUgdHJlYXRzCgkJICogcGdfbGFyZ2VvYmplY3QgbGlrZSBhIHVzZXIgdGFibGUsIG5vdCBh IHN5c3RlbSB0YWJsZS4gSXQgaXMgaG93ZXZlcgoJCSAqIHBvc3NpYmxlIHRoYXQgYSB0YWJs ZSBvciBpbmRleCBtYXkgbmVlZCB0byBlbmQgdXAgd2l0aCB0aGUgc2FtZQoJCSAqIHJlbGZp bGVudW1iZXIgaW4gdGhlIG5ldyBjbHVzdGVyIGFzIHdoYXQgaXQgaGFkIGluIHRoZSBvbGQg Y2x1c3Rlci4KCQkgKiBIZW5jZSwgd2UgY2FuJ3Qgd2FpdCB1bnRpbCBjb21taXQgdGltZSB0 byByZW1vdmUgdGhlIG9sZCBzdG9yYWdlLgoJCSAqCgkJICogSW4gZ2VuZXJhbCwgdGhpcyBm dW5jdGlvbiBuZWVkcyB0byBoYXZlIHRyYW5zYWN0aW9uYWwgc2VtYW50aWNzLAoJCSAqIGFu ZCByZW1vdmluZyB0aGUgb2xkIHN0b3JhZ2UgYmVmb3JlIGNvbW1pdCB0aW1lIHN1cmVseSBp c24ndC4KCQkgKiBIb3dldmVyLCBpdCBkb2Vzbid0IHJlYWxseSBtYXR0ZXIsIGJlY2F1c2Ug aWYgYSBiaW5hcnkgdXBncmFkZQoJCSAqIGZhaWxzIGF0IHRoaXMgc3RhZ2UsIHRoZSBuZXcg Y2x1c3RlciB3aWxsIG5lZWQgdG8gYmUgcmVjcmVhdGVkCgkJICogYW55d2F5LgoJCSAqLwoJ CXNyZWwgPSBzbWdyb3BlbihyZWxhdGlvbi0+cmRfbG9jYXRvciwgcmVsYXRpb24tPnJkX2Jh Y2tlbmQpOwoJCXNtZ3Jkb3VubGlua2FsbCgmc3JlbCwgMSwgZmFsc2UpOwoJCXNtZ3JjbG9z ZShzcmVsKTsKCX0KCWVsc2UKCXsKCQkvKiBOb3QgYSBiaW5hcnkgdXBncmFkZSwgc28ganVz dCBzY2hlZHVsZSBpdCB0byBoYXBwZW4gbGF0ZXIuICovCgkJUmVsYXRpb25Ecm9wU3RvcmFn ZShyZWxhdGlvbik7Cgl9CgoJLyoKCSAqIENyZWF0ZSBzdG9yYWdlIGZvciB0aGUgbWFpbiBm b3JrIG9mIHRoZSBuZXcgcmVsZmlsZW51bWJlci4gIElmIGl0J3MgYQoJICogdGFibGUtbGlr ZSBvYmplY3QsIGNhbGwgaW50byB0aGUgdGFibGUgQU0gdG8gZG8gc28sIHdoaWNoJ2xsIGFs c28KCSAqIGNyZWF0ZSB0aGUgdGFibGUncyBpbml0IGZvcmsgaWYgbmVlZGVkLgoJICoKCSAq IE5PVEU6IElmIHJlbGV2YW50IGZvciB0aGUgQU0sIGFueSBjb25mbGljdCBpbiByZWxmaWxl bnVtYmVyIHZhbHVlIHdpbGwKCSAqIGJlIGNhdWdodCBoZXJlLCBpZiBHZXROZXdSZWxGaWxl TnVtYmVyIG1lc3NlcyB1cCBmb3IgYW55IHJlYXNvbi4KCSAqLwoJbmV3cmxvY2F0b3IgPSBy ZWxhdGlvbi0+cmRfbG9jYXRvcjsKCW5ld3Jsb2NhdG9yLnJlbE51bWJlciA9IG5ld3JlbGZp bGVudW1iZXI7CgoJaWYgKFJFTEtJTkRfSEFTX1RBQkxFX0FNKHJlbGF0aW9uLT5yZF9yZWwt PnJlbGtpbmQpKQoJewoJCXRhYmxlX3JlbGF0aW9uX3NldF9uZXdfZmlsZWxvY2F0b3IocmVs YXRpb24sICZuZXdybG9jYXRvciwKCQkJCQkJCQkJCSAgIHBlcnNpc3RlbmNlLAoJCQkJCQkJ CQkJICAgJmZyZWV6ZVhpZCwgJm1pbm11bHRpKTsKCX0KCWVsc2UgaWYgKFJFTEtJTkRfSEFT X1NUT1JBR0UocmVsYXRpb24tPnJkX3JlbC0+cmVsa2luZCkpCgl7CgkJLyogaGFuZGxlIHRo ZXNlIGRpcmVjdGx5LCBhdCBsZWFzdCBmb3Igbm93ICovCgkJU01nclJlbGF0aW9uIHNyZWw7 CgoJCXNyZWwgPSBSZWxhdGlvbkNyZWF0ZVN0b3JhZ2UobmV3cmxvY2F0b3IsIHBlcnNpc3Rl bmNlLCB0cnVlKTsKCQlzbWdyY2xvc2Uoc3JlbCk7Cgl9CgllbHNlCgl7CgkJLyogd2Ugc2hv dWxkbid0IGJlIGNhbGxlZCBmb3IgYW55dGhpbmcgZWxzZSAqLwoJCWVsb2coRVJST1IsICJy ZWxhdGlvbiBcIiVzXCIgZG9lcyBub3QgaGF2ZSBzdG9yYWdlIiwKCQkJIFJlbGF0aW9uR2V0 UmVsYXRpb25OYW1lKHJlbGF0aW9uKSk7Cgl9CgoJLyoKCSAqIElmIHdlJ3JlIGRlYWxpbmcg d2l0aCBhIG1hcHBlZCBpbmRleCwgcGdfY2xhc3MucmVsZmlsZW5vZGUgZG9lc24ndAoJICog Y2hhbmdlOyBpbnN0ZWFkIHdlIGhhdmUgdG8gc2VuZCB0aGUgdXBkYXRlIHRvIHRoZSByZWxh dGlvbiBtYXBwZXIuCgkgKgoJICogRm9yIG1hcHBlZCBpbmRleGVzLCB3ZSBkb24ndCBhY3R1 YWxseSBjaGFuZ2UgdGhlIHBnX2NsYXNzIGVudHJ5IGF0IGFsbDsKCSAqIHRoaXMgaXMgZXNz ZW50aWFsIHdoZW4gcmVpbmRleGluZyBwZ19jbGFzcyBpdHNlbGYuICBUaGF0IGxlYXZlcyB1 cyB3aXRoCgkgKiBwb3NzaWJseS1pbmFjY3VyYXRlIHZhbHVlcyBvZiByZWxwYWdlcyBldGMs IGJ1dCB0aG9zZSB3aWxsIGJlIGZpeGVkIHVwCgkgKiBsYXRlci4KCSAqLwoJaWYgKFJlbGF0 aW9uSXNNYXBwZWQocmVsYXRpb24pKQoJewoJCS8qIFRoaXMgY2FzZSBpcyBvbmx5IHN1cHBv cnRlZCBmb3IgaW5kZXhlcyAqLwoJCUFzc2VydChyZWxhdGlvbi0+cmRfcmVsLT5yZWxraW5k ID09IFJFTEtJTkRfSU5ERVgpOwoKCQkvKiBTaW5jZSB3ZSdyZSBub3QgdXBkYXRpbmcgcGdf Y2xhc3MsIHRoZXNlIGhhZCBiZXR0ZXIgbm90IGNoYW5nZSAqLwoJCUFzc2VydChjbGFzc2Zv cm0tPnJlbGZyb3plbnhpZCA9PSBmcmVlemVYaWQpOwoJCUFzc2VydChjbGFzc2Zvcm0tPnJl bG1pbm14aWQgPT0gbWlubXVsdGkpOwoJCUFzc2VydChjbGFzc2Zvcm0tPnJlbHBlcnNpc3Rl bmNlID09IHBlcnNpc3RlbmNlKTsKCgkJLyoKCQkgKiBJbiBzb21lIGNvZGUgcGF0aHMgaXQn cyBwb3NzaWJsZSB0aGF0IHRoZSB0dXBsZSB1cGRhdGUgd2UnZAoJCSAqIG90aGVyd2lzZSBk byBoZXJlIGlzIHRoZSBvbmx5IHRoaW5nIHRoYXQgd291bGQgYXNzaWduIGFuIFhJRCBmb3IK CQkgKiB0aGUgY3VycmVudCB0cmFuc2FjdGlvbi4gIEhvd2V2ZXIsIHdlIG11c3QgaGF2ZSBh biBYSUQgdG8gZGVsZXRlCgkJICogZmlsZXMsIHNvIG1ha2Ugc3VyZSBvbmUgaXMgYXNzaWdu ZWQuCgkJICovCgkJKHZvaWQpIEdldEN1cnJlbnRUcmFuc2FjdGlvbklkKCk7CgoJCS8qIERv IHRoZSBkZWVkICovCgkJUmVsYXRpb25NYXBVcGRhdGVNYXAoUmVsYXRpb25HZXRSZWxpZChy ZWxhdGlvbiksCgkJCQkJCQkgbmV3cmVsZmlsZW51bWJlciwKCQkJCQkJCSByZWxhdGlvbi0+ cmRfcmVsLT5yZWxpc3NoYXJlZCwKCQkJCQkJCSBmYWxzZSk7CgoJCS8qIFNpbmNlIHdlJ3Jl IG5vdCB1cGRhdGluZyBwZ19jbGFzcywgbXVzdCB0cmlnZ2VyIGludmFsIG1hbnVhbGx5ICov CgkJQ2FjaGVJbnZhbGlkYXRlUmVsY2FjaGUocmVsYXRpb24pOwoJfQoJZWxzZQoJewoJCS8q IE5vcm1hbCBjYXNlLCB1cGRhdGUgdGhlIHBnX2NsYXNzIGVudHJ5ICovCgkJY2xhc3Nmb3Jt LT5yZWxmaWxlbm9kZSA9IG5ld3JlbGZpbGVudW1iZXI7CgoJCS8qIHJlbHBhZ2VzIGV0Yy4g bmV2ZXIgY2hhbmdlIGZvciBzZXF1ZW5jZXMgKi8KCQlpZiAocmVsYXRpb24tPnJkX3JlbC0+ cmVsa2luZCAhPSBSRUxLSU5EX1NFUVVFTkNFKQoJCXsKCQkJY2xhc3Nmb3JtLT5yZWxwYWdl cyA9IDA7CS8qIGl0J3MgZW1wdHkgdW50aWwgZnVydGhlciBub3RpY2UgKi8KCQkJY2xhc3Nm b3JtLT5yZWx0dXBsZXMgPSAtMTsKCQkJY2xhc3Nmb3JtLT5yZWxhbGx2aXNpYmxlID0gMDsK CQkJY2xhc3Nmb3JtLT5yZWxhbGxmcm96ZW4gPSAwOwoJCX0KCQljbGFzc2Zvcm0tPnJlbGZy b3plbnhpZCA9IGZyZWV6ZVhpZDsKCQljbGFzc2Zvcm0tPnJlbG1pbm14aWQgPSBtaW5tdWx0 aTsKCQljbGFzc2Zvcm0tPnJlbHBlcnNpc3RlbmNlID0gcGVyc2lzdGVuY2U7CgoJCUNhdGFs b2dUdXBsZVVwZGF0ZShwZ19jbGFzcywgJm90aWQsIHR1cGxlKTsKCX0KCglVbmxvY2tUdXBs ZShwZ19jbGFzcywgJm90aWQsIElucGxhY2VVcGRhdGVUdXBsZUxvY2spOwoJaGVhcF9mcmVl dHVwbGUodHVwbGUpOwoKCXRhYmxlX2Nsb3NlKHBnX2NsYXNzLCBSb3dFeGNsdXNpdmVMb2Nr KTsKCgkvKgoJICogTWFrZSB0aGUgcGdfY2xhc3Mgcm93IGNoYW5nZSBvciByZWxhdGlvbiBt YXAgY2hhbmdlIHZpc2libGUuICBUaGlzIHdpbGwKCSAqIGNhdXNlIHRoZSByZWxjYWNoZSBl bnRyeSB0byBnZXQgdXBkYXRlZCwgdG9vLgoJICovCglDb21tYW5kQ291bnRlckluY3JlbWVu dCgpOwoKCVJlbGF0aW9uQXNzdW1lTmV3UmVsZmlsZWxvY2F0b3IocmVsYXRpb24pOwp9Cgov KgogKiBSZWxhdGlvbkFzc3VtZU5ld1JlbGZpbGVsb2NhdG9yCiAqCiAqIENvZGUgdGhhdCBt b2RpZmllcyBwZ19jbGFzcy5yZWx0YWJsZXNwYWNlIG9yIHBnX2NsYXNzLnJlbGZpbGVub2Rl IG11c3QgY2FsbAogKiB0aGlzLiAgVGhlIGNhbGwgc2hhbGwgcHJlY2VkZSBhbnkgY29kZSB0 aGF0IG1pZ2h0IGluc2VydCBXQUwgcmVjb3JkcyB3aG9zZQogKiByZXBsYXkgd291bGQgbW9k aWZ5IGJ5dGVzIGluIHRoZSBuZXcgUmVsRmlsZUxvY2F0b3IsIGFuZCB0aGUgY2FsbCBzaGFs bCBmb2xsb3cKICogYW55IFdBTCBtb2RpZnlpbmcgYnl0ZXMgaW4gdGhlIHByaW9yIFJlbEZp bGVMb2NhdG9yLiAgU2VlIHN0cnVjdCBSZWxhdGlvbkRhdGEuCiAqIElkZWFsbHksIGNhbGwg dGhpcyBhcyBuZWFyIGFzIHBvc3NpYmxlIHRvIHRoZSBDb21tYW5kQ291bnRlckluY3JlbWVu dCgpCiAqIHRoYXQgbWFrZXMgdGhlIHBnX2NsYXNzIGNoYW5nZSB2aXNpYmxlIChiZWZvcmUg aXQgb3IgYWZ0ZXIgaXQpOyB0aGF0CiAqIG1pbmltaXplcyB0aGUgY2hhbmNlIG9mIGZ1dHVy ZSBkZXZlbG9wbWVudCBhZGRpbmcgYSBmb3JiaWRkZW4gV0FMIGluc2VydGlvbgogKiBiZXR3 ZWVuIFJlbGF0aW9uQXNzdW1lTmV3UmVsZmlsZWxvY2F0b3IoKSBhbmQgQ29tbWFuZENvdW50 ZXJJbmNyZW1lbnQoKS4KICovCnZvaWQKUmVsYXRpb25Bc3N1bWVOZXdSZWxmaWxlbG9jYXRv cihSZWxhdGlvbiByZWxhdGlvbikKewoJcmVsYXRpb24tPnJkX25ld1JlbGZpbGVsb2NhdG9y U3ViaWQgPSBHZXRDdXJyZW50U3ViVHJhbnNhY3Rpb25JZCgpOwoJaWYgKHJlbGF0aW9uLT5y ZF9maXJzdFJlbGZpbGVsb2NhdG9yU3ViaWQgPT0gSW52YWxpZFN1YlRyYW5zYWN0aW9uSWQp CgkJcmVsYXRpb24tPnJkX2ZpcnN0UmVsZmlsZWxvY2F0b3JTdWJpZCA9IHJlbGF0aW9uLT5y ZF9uZXdSZWxmaWxlbG9jYXRvclN1YmlkOwoKCS8qIEZsYWcgcmVsYXRpb24gYXMgbmVlZGlu ZyBlb3hhY3QgY2xlYW51cCAodG8gY2xlYXIgdGhlc2UgZmllbGRzKSAqLwoJRU9YYWN0TGlz dEFkZChyZWxhdGlvbik7Cn0KCgovKgogKgkJUmVsYXRpb25DYWNoZUluaXRpYWxpemUKICoK ICoJCVRoaXMgaW5pdGlhbGl6ZXMgdGhlIHJlbGF0aW9uIGRlc2NyaXB0b3IgY2FjaGUuICBB dCB0aGUgdGltZQogKgkJdGhhdCB0aGlzIGlzIGludm9rZWQsIHdlIGNhbid0IGRvIGRhdGFi YXNlIGFjY2VzcyB5ZXQgKG1haW5seQogKgkJYmVjYXVzZSB0aGUgdHJhbnNhY3Rpb24gc3Vi c3lzdGVtIGlzIG5vdCB1cCk7IGFsbCB3ZSBhcmUgZG9pbmcKICoJCWlzIG1ha2luZyBhbiBl bXB0eSBjYWNoZSBoYXNodGFibGUuICBUaGlzIG11c3QgYmUgZG9uZSBiZWZvcmUKICoJCXN0 YXJ0aW5nIHRoZSBpbml0aWFsaXphdGlvbiB0cmFuc2FjdGlvbiwgYmVjYXVzZSBvdGhlcndp c2UKICoJCUF0RU9YYWN0X1JlbGF0aW9uQ2FjaGUgd291bGQgY3Jhc2ggaWYgdGhhdCB0cmFu c2FjdGlvbiBhYm9ydHMKICoJCWJlZm9yZSB3ZSBjYW4gZ2V0IHRoZSByZWxjYWNoZSBzZXQg dXAuCiAqLwoKI2RlZmluZSBJTklUUkVMQ0FDSEVTSVpFCQk0MDAKCnZvaWQKUmVsYXRpb25D YWNoZUluaXRpYWxpemUodm9pZCkKewoJSEFTSENUTAkJY3RsOwoJaW50CQkJYWxsb2NzaXpl OwoKCS8qCgkgKiBtYWtlIHN1cmUgY2FjaGUgbWVtb3J5IGNvbnRleHQgZXhpc3RzCgkgKi8K CWlmICghQ2FjaGVNZW1vcnlDb250ZXh0KQoJCUNyZWF0ZUNhY2hlTWVtb3J5Q29udGV4dCgp OwoKCS8qCgkgKiBjcmVhdGUgaGFzaHRhYmxlIHRoYXQgaW5kZXhlcyB0aGUgcmVsY2FjaGUK CSAqLwoJY3RsLmtleXNpemUgPSBzaXplb2YoT2lkKTsKCWN0bC5lbnRyeXNpemUgPSBzaXpl b2YoUmVsSWRDYWNoZUVudCk7CglSZWxhdGlvbklkQ2FjaGUgPSBoYXNoX2NyZWF0ZSgiUmVs Y2FjaGUgYnkgT0lEIiwgSU5JVFJFTENBQ0hFU0laRSwKCQkJCQkJCQkgICZjdGwsIEhBU0hf RUxFTSB8IEhBU0hfQkxPQlMpOwoKCS8qCgkgKiByZXNlcnZlIGVub3VnaCBpbl9wcm9ncmVz c19saXN0IHNsb3RzIGZvciBtYW55IGNhc2VzCgkgKi8KCWFsbG9jc2l6ZSA9IDQ7Cglpbl9w cm9ncmVzc19saXN0ID0KCQlNZW1vcnlDb250ZXh0QWxsb2MoQ2FjaGVNZW1vcnlDb250ZXh0 LAoJCQkJCQkgICBhbGxvY3NpemUgKiBzaXplb2YoKmluX3Byb2dyZXNzX2xpc3QpKTsKCWlu X3Byb2dyZXNzX2xpc3RfbWF4bGVuID0gYWxsb2NzaXplOwoKCS8qCgkgKiByZWxhdGlvbiBt YXBwZXIgbmVlZHMgdG8gYmUgaW5pdGlhbGl6ZWQgdG9vCgkgKi8KCVJlbGF0aW9uTWFwSW5p dGlhbGl6ZSgpOwp9CgovKgogKgkJUmVsYXRpb25DYWNoZUluaXRpYWxpemVQaGFzZTIKICoK ICoJCVRoaXMgaXMgY2FsbGVkIHRvIHByZXBhcmUgZm9yIGFjY2VzcyB0byBzaGFyZWQgY2F0 YWxvZ3MgZHVyaW5nIHN0YXJ0dXAuCiAqCQlXZSBtdXN0IGF0IGxlYXN0IHNldCB1cCBuYWls ZWQgcmVsZGVzY3MgZm9yIHBnX2RhdGFiYXNlLCBwZ19hdXRoaWQsCiAqCQlwZ19hdXRoX21l bWJlcnMsIGFuZCBwZ19zaHNlY2xhYmVsLiBJZGVhbGx5IHdlJ2QgbGlrZSB0byBoYXZlIHJl bGRlc2NzCiAqCQlmb3IgdGhlaXIgaW5kZXhlcywgdG9vLiAgV2UgYXR0ZW1wdCB0byBsb2Fk IHRoaXMgaW5mb3JtYXRpb24gZnJvbSB0aGUKICoJCXNoYXJlZCByZWxjYWNoZSBpbml0IGZp bGUuICBJZiB0aGF0J3MgbWlzc2luZyBvciBicm9rZW4sIGp1c3QgbWFrZQogKgkJcGhvbnkg ZW50cmllcyBmb3IgdGhlIGNhdGFsb2dzIHRoZW1zZWx2ZXMuCiAqCQlSZWxhdGlvbkNhY2hl SW5pdGlhbGl6ZVBoYXNlMyB3aWxsIGNsZWFuIHVwIGFzIG5lZWRlZC4KICovCnZvaWQKUmVs YXRpb25DYWNoZUluaXRpYWxpemVQaGFzZTIodm9pZCkKewoJTWVtb3J5Q29udGV4dCBvbGRj eHQ7CgoJLyoKCSAqIHJlbGF0aW9uIG1hcHBlciBuZWVkcyBpbml0aWFsaXplZCB0b28KCSAq LwoJUmVsYXRpb25NYXBJbml0aWFsaXplUGhhc2UyKCk7CgoJLyoKCSAqIEluIGJvb3RzdHJh cCBtb2RlLCB0aGUgc2hhcmVkIGNhdGFsb2dzIGFyZW4ndCB0aGVyZSB5ZXQgYW55d2F5LCBz byBkbwoJICogbm90aGluZy4KCSAqLwoJaWYgKElzQm9vdHN0cmFwUHJvY2Vzc2luZ01vZGUo KSkKCQlyZXR1cm47CgoJLyoKCSAqIHN3aXRjaCB0byBjYWNoZSBtZW1vcnkgY29udGV4dAoJ ICovCglvbGRjeHQgPSBNZW1vcnlDb250ZXh0U3dpdGNoVG8oQ2FjaGVNZW1vcnlDb250ZXh0 KTsKCgkvKgoJICogVHJ5IHRvIGxvYWQgdGhlIHNoYXJlZCByZWxjYWNoZSBjYWNoZSBmaWxl LiAgSWYgdW5zdWNjZXNzZnVsLCBib290c3RyYXAKCSAqIHRoZSBjYWNoZSB3aXRoIHByZS1t YWRlIGRlc2NyaXB0b3JzIGZvciB0aGUgY3JpdGljYWwgc2hhcmVkIGNhdGFsb2dzLgoJICov CglpZiAoIWxvYWRfcmVsY2FjaGVfaW5pdF9maWxlKHRydWUpKQoJewoJCWZvcm1yZGVzYygi cGdfZGF0YWJhc2UiLCBEYXRhYmFzZVJlbGF0aW9uX1Jvd3R5cGVfSWQsIHRydWUsCgkJCQkg IE5hdHRzX3BnX2RhdGFiYXNlLCBEZXNjX3BnX2RhdGFiYXNlKTsKCQlmb3JtcmRlc2MoInBn X2F1dGhpZCIsIEF1dGhJZFJlbGF0aW9uX1Jvd3R5cGVfSWQsIHRydWUsCgkJCQkgIE5hdHRz X3BnX2F1dGhpZCwgRGVzY19wZ19hdXRoaWQpOwoJCWZvcm1yZGVzYygicGdfYXV0aF9tZW1i ZXJzIiwgQXV0aE1lbVJlbGF0aW9uX1Jvd3R5cGVfSWQsIHRydWUsCgkJCQkgIE5hdHRzX3Bn X2F1dGhfbWVtYmVycywgRGVzY19wZ19hdXRoX21lbWJlcnMpOwoJCWZvcm1yZGVzYygicGdf c2hzZWNsYWJlbCIsIFNoYXJlZFNlY0xhYmVsUmVsYXRpb25fUm93dHlwZV9JZCwgdHJ1ZSwK CQkJCSAgTmF0dHNfcGdfc2hzZWNsYWJlbCwgRGVzY19wZ19zaHNlY2xhYmVsKTsKCQlmb3Jt cmRlc2MoInBnX3N1YnNjcmlwdGlvbiIsIFN1YnNjcmlwdGlvblJlbGF0aW9uX1Jvd3R5cGVf SWQsIHRydWUsCgkJCQkgIE5hdHRzX3BnX3N1YnNjcmlwdGlvbiwgRGVzY19wZ19zdWJzY3Jp cHRpb24pOwoKI2RlZmluZSBOVU1fQ1JJVElDQUxfU0hBUkVEX1JFTFMJNQkvKiBmaXggaWYg eW91IGNoYW5nZSBsaXN0IGFib3ZlICovCgl9CgoJTWVtb3J5Q29udGV4dFN3aXRjaFRvKG9s ZGN4dCk7Cn0KCi8qCiAqCQlSZWxhdGlvbkNhY2hlSW5pdGlhbGl6ZVBoYXNlMwogKgogKgkJ VGhpcyBpcyBjYWxsZWQgYXMgc29vbiBhcyB0aGUgY2F0Y2FjaGUgYW5kIHRyYW5zYWN0aW9u IHN5c3RlbQogKgkJYXJlIGZ1bmN0aW9uYWwgYW5kIHdlIGhhdmUgZGV0ZXJtaW5lZCBNeURh dGFiYXNlSWQuICBBdCB0aGlzIHBvaW50CiAqCQl3ZSBjYW4gYWN0dWFsbHkgcmVhZCBkYXRh IGZyb20gdGhlIGRhdGFiYXNlJ3Mgc3lzdGVtIGNhdGFsb2dzLgogKgkJV2UgZmlyc3QgdHJ5 IHRvIHJlYWQgcHJlLWNvbXB1dGVkIHJlbGNhY2hlIGVudHJpZXMgZnJvbSB0aGUgbG9jYWwK ICoJCXJlbGNhY2hlIGluaXQgZmlsZS4gIElmIHRoYXQncyBtaXNzaW5nIG9yIGJyb2tlbiwg bWFrZSBwaG9ueSBlbnRyaWVzCiAqCQlmb3IgdGhlIG1pbmltdW0gc2V0IG9mIG5haWxlZC1p bi1jYWNoZSByZWxhdGlvbnMuICBUaGVuICh1bmxlc3MKICoJCWJvb3RzdHJhcHBpbmcpIG1h a2Ugc3VyZSB3ZSBoYXZlIGVudHJpZXMgZm9yIHRoZSBjcml0aWNhbCBzeXN0ZW0KICoJCWlu ZGV4ZXMuICBPbmNlIHdlJ3ZlIGRvbmUgYWxsIHRoaXMsIHdlIGhhdmUgZW5vdWdoIGluZnJh c3RydWN0dXJlIHRvCiAqCQlvcGVuIGFueSBzeXN0ZW0gY2F0YWxvZyBvciB1c2UgYW55IGNh dGNhY2hlLiAgVGhlIGxhc3Qgc3RlcCBpcyB0bwogKgkJcmV3cml0ZSB0aGUgY2FjaGUgZmls ZXMgaWYgbmVlZGVkLgogKi8Kdm9pZApSZWxhdGlvbkNhY2hlSW5pdGlhbGl6ZVBoYXNlMyh2 b2lkKQp7CglIQVNIX1NFUV9TVEFUVVMgc3RhdHVzOwoJUmVsSWRDYWNoZUVudCAqaWRoZW50 cnk7CglNZW1vcnlDb250ZXh0IG9sZGN4dDsKCWJvb2wJCW5lZWROZXdDYWNoZUZpbGUgPSAh Y3JpdGljYWxTaGFyZWRSZWxjYWNoZXNCdWlsdDsKCgkvKgoJICogcmVsYXRpb24gbWFwcGVy IG5lZWRzIGluaXRpYWxpemVkIHRvbwoJICovCglSZWxhdGlvbk1hcEluaXRpYWxpemVQaGFz ZTMoKTsKCgkvKgoJICogc3dpdGNoIHRvIGNhY2hlIG1lbW9yeSBjb250ZXh0CgkgKi8KCW9s ZGN4dCA9IE1lbW9yeUNvbnRleHRTd2l0Y2hUbyhDYWNoZU1lbW9yeUNvbnRleHQpOwoKCS8q CgkgKiBUcnkgdG8gbG9hZCB0aGUgbG9jYWwgcmVsY2FjaGUgY2FjaGUgZmlsZS4gIElmIHVu c3VjY2Vzc2Z1bCwgYm9vdHN0cmFwCgkgKiB0aGUgY2FjaGUgd2l0aCBwcmUtbWFkZSBkZXNj cmlwdG9ycyBmb3IgdGhlIGNyaXRpY2FsICJuYWlsZWQtaW4iIHN5c3RlbQoJICogY2F0YWxv Z3MuCgkgKi8KCWlmIChJc0Jvb3RzdHJhcFByb2Nlc3NpbmdNb2RlKCkgfHwKCQkhbG9hZF9y ZWxjYWNoZV9pbml0X2ZpbGUoZmFsc2UpKQoJewoJCW5lZWROZXdDYWNoZUZpbGUgPSB0cnVl OwoKCQlmb3JtcmRlc2MoInBnX2NsYXNzIiwgUmVsYXRpb25SZWxhdGlvbl9Sb3d0eXBlX0lk LCBmYWxzZSwKCQkJCSAgTmF0dHNfcGdfY2xhc3MsIERlc2NfcGdfY2xhc3MpOwoJCWZvcm1y ZGVzYygicGdfYXR0cmlidXRlIiwgQXR0cmlidXRlUmVsYXRpb25fUm93dHlwZV9JZCwgZmFs c2UsCgkJCQkgIE5hdHRzX3BnX2F0dHJpYnV0ZSwgRGVzY19wZ19hdHRyaWJ1dGUpOwoJCWZv cm1yZGVzYygicGdfcHJvYyIsIFByb2NlZHVyZVJlbGF0aW9uX1Jvd3R5cGVfSWQsIGZhbHNl LAoJCQkJICBOYXR0c19wZ19wcm9jLCBEZXNjX3BnX3Byb2MpOwoJCWZvcm1yZGVzYygicGdf dHlwZSIsIFR5cGVSZWxhdGlvbl9Sb3d0eXBlX0lkLCBmYWxzZSwKCQkJCSAgTmF0dHNfcGdf dHlwZSwgRGVzY19wZ190eXBlKTsKCiNkZWZpbmUgTlVNX0NSSVRJQ0FMX0xPQ0FMX1JFTFMg NAkvKiBmaXggaWYgeW91IGNoYW5nZSBsaXN0IGFib3ZlICovCgl9CgoJTWVtb3J5Q29udGV4 dFN3aXRjaFRvKG9sZGN4dCk7CgoJLyogSW4gYm9vdHN0cmFwIG1vZGUsIHRoZSBmYWtlZC11 cCBmb3JtcmRlc2MgaW5mbyBpcyBhbGwgd2UnbGwgaGF2ZSAqLwoJaWYgKElzQm9vdHN0cmFw UHJvY2Vzc2luZ01vZGUoKSkKCQlyZXR1cm47CgoJLyoKCSAqIElmIHdlIGRpZG4ndCBnZXQg dGhlIGNyaXRpY2FsIHN5c3RlbSBpbmRleGVzIGxvYWRlZCBpbnRvIHJlbGNhY2hlLCBkbwoJ ICogc28gbm93LiAgVGhlc2UgYXJlIGNyaXRpY2FsIGJlY2F1c2UgdGhlIGNhdGNhY2hlIGFu ZC9vciBvcGNsYXNzIGNhY2hlCgkgKiBkZXBlbmQgb24gdGhlbSBmb3IgZmV0Y2hlcyBkb25l IGR1cmluZyByZWxjYWNoZSBsb2FkLiAgVGh1cywgd2UgaGF2ZSBhbgoJICogaW5maW5pdGUt cmVjdXJzaW9uIHByb2JsZW0uICBXZSBjYW4gYnJlYWsgdGhlIHJlY3Vyc2lvbiBieSBkb2lu ZwoJICogaGVhcHNjYW5zIGluc3RlYWQgb2YgaW5kZXhzY2FucyBhdCBjZXJ0YWluIGtleSBz cG90cy4gVG8gYXZvaWQgaG9iYmxpbmcKCSAqIHBlcmZvcm1hbmNlLCB3ZSBvbmx5IHdhbnQg dG8gZG8gdGhhdCB1bnRpbCB3ZSBoYXZlIHRoZSBjcml0aWNhbCBpbmRleGVzCgkgKiBsb2Fk ZWQgaW50byByZWxjYWNoZS4gIFRodXMsIHRoZSBmbGFnIGNyaXRpY2FsUmVsY2FjaGVzQnVp bHQgaXMgdXNlZCB0bwoJICogZGVjaWRlIHdoZXRoZXIgdG8gZG8gaGVhcHNjYW4gb3IgaW5k ZXhzY2FuIGF0IHRoZSBrZXkgc3BvdHMsIGFuZCB3ZSBzZXQKCSAqIGl0IHRydWUgYWZ0ZXIg d2UndmUgbG9hZGVkIHRoZSBjcml0aWNhbCBpbmRleGVzLgoJICoKCSAqIFRoZSBjcml0aWNh bCBpbmRleGVzIGFyZSBtYXJrZWQgYXMgIm5haWxlZCBpbiBjYWNoZSIsIHBhcnRseSB0byBt YWtlIGl0CgkgKiBlYXN5IGZvciBsb2FkX3JlbGNhY2hlX2luaXRfZmlsZSB0byBjb3VudCB0 aGVtLCBidXQgbWFpbmx5IGJlY2F1c2Ugd2UKCSAqIGNhbm5vdCBmbHVzaCBhbmQgcmVidWls ZCB0aGVtIG9uY2Ugd2UndmUgc2V0IGNyaXRpY2FsUmVsY2FjaGVzQnVpbHQgdG8KCSAqIHRy dWUuICAoTk9URTogcGVyaGFwcyBpdCB3b3VsZCBiZSBwb3NzaWJsZSB0byByZWxvYWQgdGhl bSBieQoJICogdGVtcG9yYXJpbHkgc2V0dGluZyBjcml0aWNhbFJlbGNhY2hlc0J1aWx0IHRv IGZhbHNlIGFnYWluLiAgRm9yIG5vdywKCSAqIHRob3VnaCwgd2UganVzdCBuYWlsICdlbSBp bi4pCgkgKgoJICogUmV3cml0ZVJlbFJ1bGVuYW1lSW5kZXhJZCBhbmQgVHJpZ2dlclJlbGlk TmFtZUluZGV4SWQgYXJlIG5vdCBjcml0aWNhbAoJICogaW4gdGhlIHNhbWUgd2F5IGFzIHRo ZSBvdGhlcnMsIGJlY2F1c2UgdGhlIGNyaXRpY2FsIGNhdGFsb2dzIGRvbid0CgkgKiAoY3Vy cmVudGx5KSBoYXZlIGFueSBydWxlcyBvciB0cmlnZ2VycywgYW5kIHNvIHRoZXNlIGluZGV4 ZXMgY2FuIGJlCgkgKiByZWJ1aWx0IHdpdGhvdXQgaW5kdWNpbmcgcmVjdXJzaW9uLiAgSG93 ZXZlciB0aGV5IGFyZSB1c2VkIGR1cmluZwoJICogcmVsY2FjaGUgbG9hZCB3aGVuIGEgcmVs IGRvZXMgaGF2ZSBydWxlcyBvciB0cmlnZ2Vycywgc28gd2UgY2hvb3NlIHRvCgkgKiBuYWls IHRoZW0gZm9yIHBlcmZvcm1hbmNlIHJlYXNvbnMuCgkgKi8KCWlmICghY3JpdGljYWxSZWxj YWNoZXNCdWlsdCkKCXsKCQlsb2FkX2NyaXRpY2FsX2luZGV4KENsYXNzT2lkSW5kZXhJZCwK CQkJCQkJCVJlbGF0aW9uUmVsYXRpb25JZCk7CgkJbG9hZF9jcml0aWNhbF9pbmRleChBdHRy aWJ1dGVSZWxpZE51bUluZGV4SWQsCgkJCQkJCQlBdHRyaWJ1dGVSZWxhdGlvbklkKTsKCQls b2FkX2NyaXRpY2FsX2luZGV4KEluZGV4UmVsaWRJbmRleElkLAoJCQkJCQkJSW5kZXhSZWxh dGlvbklkKTsKCQlsb2FkX2NyaXRpY2FsX2luZGV4KE9wY2xhc3NPaWRJbmRleElkLAoJCQkJ CQkJT3BlcmF0b3JDbGFzc1JlbGF0aW9uSWQpOwoJCWxvYWRfY3JpdGljYWxfaW5kZXgoQWNj ZXNzTWV0aG9kUHJvY2VkdXJlSW5kZXhJZCwKCQkJCQkJCUFjY2Vzc01ldGhvZFByb2NlZHVy ZVJlbGF0aW9uSWQpOwoJCWxvYWRfY3JpdGljYWxfaW5kZXgoUmV3cml0ZVJlbFJ1bGVuYW1l SW5kZXhJZCwKCQkJCQkJCVJld3JpdGVSZWxhdGlvbklkKTsKCQlsb2FkX2NyaXRpY2FsX2lu ZGV4KFRyaWdnZXJSZWxpZE5hbWVJbmRleElkLAoJCQkJCQkJVHJpZ2dlclJlbGF0aW9uSWQp OwoKI2RlZmluZSBOVU1fQ1JJVElDQUxfTE9DQUxfSU5ERVhFUwk3CS8qIGZpeCBpZiB5b3Ug Y2hhbmdlIGxpc3QgYWJvdmUgKi8KCgkJY3JpdGljYWxSZWxjYWNoZXNCdWlsdCA9IHRydWU7 Cgl9CgoJLyoKCSAqIFByb2Nlc3MgY3JpdGljYWwgc2hhcmVkIGluZGV4ZXMgdG9vLgoJICoK CSAqIERhdGFiYXNlTmFtZUluZGV4SWQgaXNuJ3QgY3JpdGljYWwgZm9yIHJlbGNhY2hlIGxv YWRpbmcsIGJ1dCByYXRoZXIgZm9yCgkgKiBpbml0aWFsIGxvb2t1cCBvZiBNeURhdGFiYXNl SWQsIHdpdGhvdXQgd2hpY2ggd2UnbGwgbmV2ZXIgZmluZCBhbnkKCSAqIG5vbi1zaGFyZWQg Y2F0YWxvZ3MgYXQgYWxsLiAgQXV0b3ZhY3V1bSBjYWxscyBJbml0UG9zdGdyZXMgd2l0aCBh CgkgKiBkYXRhYmFzZSBPSUQsIHNvIGl0IGluc3RlYWQgZGVwZW5kcyBvbiBEYXRhYmFzZU9p ZEluZGV4SWQuICBXZSBhbHNvCgkgKiBuZWVkIHRvIG5haWwgdXAgc29tZSBpbmRleGVzIG9u IHBnX2F1dGhpZCBhbmQgcGdfYXV0aF9tZW1iZXJzIGZvciB1c2UKCSAqIGR1cmluZyBjbGll bnQgYXV0aGVudGljYXRpb24uICBTaGFyZWRTZWNMYWJlbE9iamVjdEluZGV4SWQgaXNuJ3QK CSAqIGNyaXRpY2FsIGZvciB0aGUgY29yZSBzeXN0ZW0sIGJ1dCBhdXRoZW50aWNhdGlvbiBo b29rcyBtaWdodCBiZQoJICogaW50ZXJlc3RlZCBpbiBpdC4KCSAqLwoJaWYgKCFjcml0aWNh bFNoYXJlZFJlbGNhY2hlc0J1aWx0KQoJewoJCWxvYWRfY3JpdGljYWxfaW5kZXgoRGF0YWJh c2VOYW1lSW5kZXhJZCwKCQkJCQkJCURhdGFiYXNlUmVsYXRpb25JZCk7CgkJbG9hZF9jcml0 aWNhbF9pbmRleChEYXRhYmFzZU9pZEluZGV4SWQsCgkJCQkJCQlEYXRhYmFzZVJlbGF0aW9u SWQpOwoJCWxvYWRfY3JpdGljYWxfaW5kZXgoQXV0aElkUm9sbmFtZUluZGV4SWQsCgkJCQkJ CQlBdXRoSWRSZWxhdGlvbklkKTsKCQlsb2FkX2NyaXRpY2FsX2luZGV4KEF1dGhJZE9pZElu ZGV4SWQsCgkJCQkJCQlBdXRoSWRSZWxhdGlvbklkKTsKCQlsb2FkX2NyaXRpY2FsX2luZGV4 KEF1dGhNZW1NZW1Sb2xlSW5kZXhJZCwKCQkJCQkJCUF1dGhNZW1SZWxhdGlvbklkKTsKCQls b2FkX2NyaXRpY2FsX2luZGV4KFNoYXJlZFNlY0xhYmVsT2JqZWN0SW5kZXhJZCwKCQkJCQkJ CVNoYXJlZFNlY0xhYmVsUmVsYXRpb25JZCk7CgojZGVmaW5lIE5VTV9DUklUSUNBTF9TSEFS RURfSU5ERVhFUyA2CS8qIGZpeCBpZiB5b3UgY2hhbmdlIGxpc3QgYWJvdmUgKi8KCgkJY3Jp dGljYWxTaGFyZWRSZWxjYWNoZXNCdWlsdCA9IHRydWU7Cgl9CgoJLyoKCSAqIE5vdywgc2Nh biBhbGwgdGhlIHJlbGNhY2hlIGVudHJpZXMgYW5kIHVwZGF0ZSBhbnl0aGluZyB0aGF0IG1p Z2h0IGJlCgkgKiB3cm9uZyBpbiB0aGUgcmVzdWx0cyBmcm9tIGZvcm1yZGVzYyBvciB0aGUg cmVsY2FjaGUgY2FjaGUgZmlsZS4gSWYgd2UKCSAqIGZha2VkIHVwIHJlbGNhY2hlIGVudHJp ZXMgdXNpbmcgZm9ybXJkZXNjLCB0aGVuIHJlYWQgdGhlIHJlYWwgcGdfY2xhc3MKCSAqIHJv d3MgYW5kIHJlcGxhY2UgdGhlIGZha2UgZW50cmllcyB3aXRoIHRoZW0uIEFsc28sIGlmIGFu eSBvZiB0aGUKCSAqIHJlbGNhY2hlIGVudHJpZXMgaGF2ZSBydWxlcywgdHJpZ2dlcnMsIG9y IHNlY3VyaXR5IHBvbGljaWVzLCBsb2FkIHRoYXQKCSAqIGluZm8gdGhlIGhhcmQgd2F5IHNp bmNlIGl0IGlzbid0IHJlY29yZGVkIGluIHRoZSBjYWNoZSBmaWxlLgoJICoKCSAqIFdoZW5l dmVyIHdlIGFjY2VzcyB0aGUgY2F0YWxvZ3MgdG8gcmVhZCBkYXRhLCB0aGVyZSBpcyBhIHBv c3NpYmlsaXR5IG9mCgkgKiBhIHNoYXJlZC1pbnZhbCBjYWNoZSBmbHVzaCBjYXVzaW5nIHJl bGNhY2hlIGVudHJpZXMgdG8gYmUgcmVtb3ZlZC4KCSAqIFNpbmNlIGhhc2hfc2VxX3NlYXJj aCBvbmx5IGd1YXJhbnRlZXMgdG8gc3RpbGwgd29yayBhZnRlciB0aGUgKmN1cnJlbnQqCgkg KiBlbnRyeSBpcyByZW1vdmVkLCBpdCdzIHVuc2FmZSB0byBjb250aW51ZSB0aGUgaGFzaHRh YmxlIHNjYW4gYWZ0ZXJ3YXJkLgoJICogV2UgaGFuZGxlIHRoaXMgYnkgcmVzdGFydGluZyB0 aGUgc2NhbiBmcm9tIHNjcmF0Y2ggYWZ0ZXIgZWFjaCBhY2Nlc3MuCgkgKiBUaGlzIGlzIHRo ZW9yZXRpY2FsbHkgTyhOXjIpLCBidXQgdGhlIG51bWJlciBvZiBlbnRyaWVzIHRoYXQgYWN0 dWFsbHkKCSAqIG5lZWQgdG8gYmUgZml4ZWQgaXMgc21hbGwgZW5vdWdoIHRoYXQgaXQgZG9l c24ndCBtYXR0ZXIuCgkgKi8KCWhhc2hfc2VxX2luaXQoJnN0YXR1cywgUmVsYXRpb25JZENh Y2hlKTsKCgl3aGlsZSAoKGlkaGVudHJ5ID0gKFJlbElkQ2FjaGVFbnQgKikgaGFzaF9zZXFf c2VhcmNoKCZzdGF0dXMpKSAhPSBOVUxMKQoJewoJCVJlbGF0aW9uCXJlbGF0aW9uID0gaWRo ZW50cnktPnJlbGRlc2M7CgkJYm9vbAkJcmVzdGFydCA9IGZhbHNlOwoKCQkvKgoJCSAqIE1h a2Ugc3VyZSAqdGhpcyogZW50cnkgZG9lc24ndCBnZXQgZmx1c2hlZCB3aGlsZSB3ZSB3b3Jr IHdpdGggaXQuCgkJICovCgkJUmVsYXRpb25JbmNyZW1lbnRSZWZlcmVuY2VDb3VudChyZWxh dGlvbik7CgoJCS8qCgkJICogSWYgaXQncyBhIGZha2VkLXVwIGVudHJ5LCByZWFkIHRoZSBy ZWFsIHBnX2NsYXNzIHR1cGxlLgoJCSAqLwoJCWlmIChyZWxhdGlvbi0+cmRfcmVsLT5yZWxv d25lciA9PSBJbnZhbGlkT2lkKQoJCXsKCQkJSGVhcFR1cGxlCWh0dXA7CgkJCUZvcm1fcGdf Y2xhc3MgcmVscDsKCgkJCWh0dXAgPSBTZWFyY2hTeXNDYWNoZTEoUkVMT0lELAoJCQkJCQkJ CSAgIE9iamVjdElkR2V0RGF0dW0oUmVsYXRpb25HZXRSZWxpZChyZWxhdGlvbikpKTsKCQkJ aWYgKCFIZWFwVHVwbGVJc1ZhbGlkKGh0dXApKQoJCQkJZXJlcG9ydChGQVRBTCwKCQkJCQkJ ZXJyY29kZShFUlJDT0RFX1VOREVGSU5FRF9PQkpFQ1QpLAoJCQkJCQllcnJtc2dfaW50ZXJu YWwoImNhY2hlIGxvb2t1cCBmYWlsZWQgZm9yIHJlbGF0aW9uICV1IiwKCQkJCQkJCQkJCVJl bGF0aW9uR2V0UmVsaWQocmVsYXRpb24pKSk7CgkJCXJlbHAgPSAoRm9ybV9wZ19jbGFzcykg R0VUU1RSVUNUKGh0dXApOwoKCQkJLyoKCQkJICogQ29weSB0dXBsZSB0byByZWxhdGlvbi0+ cmRfcmVsLiAoU2VlIG5vdGVzIGluCgkJCSAqIEFsbG9jYXRlUmVsYXRpb25EZXNjKCkpCgkJ CSAqLwoJCQltZW1jcHkoKGNoYXIgKikgcmVsYXRpb24tPnJkX3JlbCwgKGNoYXIgKikgcmVs cCwgQ0xBU1NfVFVQTEVfU0laRSk7CgoJCQkvKiBVcGRhdGUgcmRfb3B0aW9ucyB3aGlsZSB3 ZSBoYXZlIHRoZSB0dXBsZSAqLwoJCQlpZiAocmVsYXRpb24tPnJkX29wdGlvbnMpCgkJCQlw ZnJlZShyZWxhdGlvbi0+cmRfb3B0aW9ucyk7CgkJCVJlbGF0aW9uUGFyc2VSZWxPcHRpb25z KHJlbGF0aW9uLCBodHVwKTsKCgkJCS8qCgkJCSAqIENoZWNrIHRoZSB2YWx1ZXMgaW4gcmRf YXR0IHdlcmUgc2V0IHVwIGNvcnJlY3RseS4gIChXZSBjYW5ub3QKCQkJICoganVzdCBjb3B5 IHRoZW0gb3ZlciBub3c6IGZvcm1yZGVzYyBtdXN0IGhhdmUgc2V0IHVwIHRoZSByZF9hdHQK CQkJICogZGF0YSBjb3JyZWN0bHkgdG8gc3RhcnQgd2l0aCwgYmVjYXVzZSBpdCBtYXkgYWxy ZWFkeSBoYXZlIGJlZW4KCQkJICogY29waWVkIGludG8gb25lIG9yIG1vcmUgY2F0Y2FjaGUg ZW50cmllcy4pCgkJCSAqLwoJCQlBc3NlcnQocmVsYXRpb24tPnJkX2F0dC0+dGR0eXBlaWQg PT0gcmVscC0+cmVsdHlwZSk7CgkJCUFzc2VydChyZWxhdGlvbi0+cmRfYXR0LT50ZHR5cG1v ZCA9PSAtMSk7CgoJCQlSZWxlYXNlU3lzQ2FjaGUoaHR1cCk7CgoJCQkvKiByZWxvd25lciBo YWQgYmV0dGVyIGJlIE9LIG5vdywgZWxzZSB3ZSdsbCBsb29wIGZvcmV2ZXIgKi8KCQkJaWYg KHJlbGF0aW9uLT5yZF9yZWwtPnJlbG93bmVyID09IEludmFsaWRPaWQpCgkJCQllbG9nKEVS Uk9SLCAiaW52YWxpZCByZWxvd25lciBpbiBwZ19jbGFzcyBlbnRyeSBmb3IgXCIlc1wiIiwK CQkJCQkgUmVsYXRpb25HZXRSZWxhdGlvbk5hbWUocmVsYXRpb24pKTsKCgkJCXJlc3RhcnQg PSB0cnVlOwoJCX0KCgkJLyoKCQkgKiBGaXggZGF0YSB0aGF0IGlzbid0IHNhdmVkIGluIHJl bGNhY2hlIGNhY2hlIGZpbGUuCgkJICoKCQkgKiByZWxoYXNydWxlcyBvciByZWxoYXN0cmln Z2VycyBjb3VsZCBwb3NzaWJseSBiZSB3cm9uZyBvciBvdXQgb2YKCQkgKiBkYXRlLiAgSWYg d2UgZG9uJ3QgYWN0dWFsbHkgZmluZCBhbnkgcnVsZXMgb3IgdHJpZ2dlcnMsIGNsZWFyIHRo ZQoJCSAqIGxvY2FsIGNvcHkgb2YgdGhlIGZsYWcgc28gdGhhdCB3ZSBkb24ndCBnZXQgaW50 byBhbiBpbmZpbml0ZSBsb29wCgkJICogaGVyZS4gIFdlIGRvbid0IG1ha2UgYW55IGF0dGVt cHQgdG8gZml4IHRoZSBwZ19jbGFzcyBlbnRyeSwgdGhvdWdoLgoJCSAqLwoJCWlmIChyZWxh dGlvbi0+cmRfcmVsLT5yZWxoYXNydWxlcyAmJiByZWxhdGlvbi0+cmRfcnVsZXMgPT0gTlVM TCkKCQl7CgkJCVJlbGF0aW9uQnVpbGRSdWxlTG9jayhyZWxhdGlvbik7CgkJCWlmIChyZWxh dGlvbi0+cmRfcnVsZXMgPT0gTlVMTCkKCQkJCXJlbGF0aW9uLT5yZF9yZWwtPnJlbGhhc3J1 bGVzID0gZmFsc2U7CgkJCXJlc3RhcnQgPSB0cnVlOwoJCX0KCQlpZiAocmVsYXRpb24tPnJk X3JlbC0+cmVsaGFzdHJpZ2dlcnMgJiYgcmVsYXRpb24tPnRyaWdkZXNjID09IE5VTEwpCgkJ ewoJCQlSZWxhdGlvbkJ1aWxkVHJpZ2dlcnMocmVsYXRpb24pOwoJCQlpZiAocmVsYXRpb24t PnRyaWdkZXNjID09IE5VTEwpCgkJCQlyZWxhdGlvbi0+cmRfcmVsLT5yZWxoYXN0cmlnZ2Vy cyA9IGZhbHNlOwoJCQlyZXN0YXJ0ID0gdHJ1ZTsKCQl9CgoJCS8qCgkJICogUmUtbG9hZCB0 aGUgcm93IHNlY3VyaXR5IHBvbGljaWVzIGlmIHRoZSByZWxhdGlvbiBoYXMgdGhlbSwgc2lu Y2UKCQkgKiB0aGV5IGFyZSBub3QgcHJlc2VydmVkIGluIHRoZSBjYWNoZS4gIE5vdGUgdGhh dCB3ZSBjYW4gbmV2ZXIgTk9UCgkJICogaGF2ZSBhIHBvbGljeSB3aGlsZSByZWxyb3dzZWN1 cml0eSBpcyB0cnVlLAoJCSAqIFJlbGF0aW9uQnVpbGRSb3dTZWN1cml0eSB3aWxsIGNyZWF0 ZSBhIHNpbmdsZSBkZWZhdWx0LWRlbnkgcG9saWN5CgkJICogaWYgdGhlcmUgaXMgbm8gcG9s aWN5IGRlZmluZWQgaW4gcGdfcG9saWN5LgoJCSAqLwoJCWlmIChyZWxhdGlvbi0+cmRfcmVs LT5yZWxyb3dzZWN1cml0eSAmJiByZWxhdGlvbi0+cmRfcnNkZXNjID09IE5VTEwpCgkJewoJ CQlSZWxhdGlvbkJ1aWxkUm93U2VjdXJpdHkocmVsYXRpb24pOwoKCQkJQXNzZXJ0KHJlbGF0 aW9uLT5yZF9yc2Rlc2MgIT0gTlVMTCk7CgkJCXJlc3RhcnQgPSB0cnVlOwoJCX0KCgkJLyog UmVsb2FkIHRhYmxlYW0gZGF0YSBpZiBuZWVkZWQgKi8KCQlpZiAocmVsYXRpb24tPnJkX3Rh YmxlYW0gPT0gTlVMTCAmJgoJCQkoUkVMS0lORF9IQVNfVEFCTEVfQU0ocmVsYXRpb24tPnJk X3JlbC0+cmVsa2luZCkgfHwgcmVsYXRpb24tPnJkX3JlbC0+cmVsa2luZCA9PSBSRUxLSU5E X1NFUVVFTkNFKSkKCQl7CgkJCVJlbGF0aW9uSW5pdFRhYmxlQWNjZXNzTWV0aG9kKHJlbGF0 aW9uKTsKCQkJQXNzZXJ0KHJlbGF0aW9uLT5yZF90YWJsZWFtICE9IE5VTEwpOwoKCQkJcmVz dGFydCA9IHRydWU7CgkJfQoKCQkvKiBSZWxlYXNlIGhvbGQgb24gdGhlIHJlbGF0aW9uICov CgkJUmVsYXRpb25EZWNyZW1lbnRSZWZlcmVuY2VDb3VudChyZWxhdGlvbik7CgoJCS8qIE5v dywgcmVzdGFydCB0aGUgaGFzaHRhYmxlIHNjYW4gaWYgbmVlZGVkICovCgkJaWYgKHJlc3Rh cnQpCgkJewoJCQloYXNoX3NlcV90ZXJtKCZzdGF0dXMpOwoJCQloYXNoX3NlcV9pbml0KCZz dGF0dXMsIFJlbGF0aW9uSWRDYWNoZSk7CgkJfQoJfQoKCS8qCgkgKiBMYXN0bHksIHdyaXRl IG91dCBuZXcgcmVsY2FjaGUgY2FjaGUgZmlsZXMgaWYgbmVlZGVkLiAgV2UgZG9uJ3QgYm90 aGVyCgkgKiB0byBkaXN0aW5ndWlzaCBjYXNlcyB3aGVyZSBvbmx5IG9uZSBvZiB0aGUgdHdv IG5lZWRzIGFuIHVwZGF0ZS4KCSAqLwoJaWYgKG5lZWROZXdDYWNoZUZpbGUpCgl7CgkJLyoK CQkgKiBGb3JjZSBhbGwgdGhlIGNhdGNhY2hlcyB0byBmaW5pc2ggaW5pdGlhbGl6aW5nIGFu ZCB0aGVyZWJ5IG9wZW4gdGhlCgkJICogY2F0YWxvZ3MgYW5kIGluZGV4ZXMgdGhleSB1c2Uu ICBUaGlzIHdpbGwgcHJlbG9hZCB0aGUgcmVsY2FjaGUgd2l0aAoJCSAqIGVudHJpZXMgZm9y IGFsbCB0aGUgbW9zdCBpbXBvcnRhbnQgc3lzdGVtIGNhdGFsb2dzIGFuZCBpbmRleGVzLCBz bwoJCSAqIHRoYXQgdGhlIGluaXQgZmlsZXMgd2lsbCBiZSBtb3N0IHVzZWZ1bCBmb3IgZnV0 dXJlIGJhY2tlbmRzLgoJCSAqLwoJCUluaXRDYXRhbG9nQ2FjaGVQaGFzZTIoKTsKCgkJLyog bm93IHdyaXRlIHRoZSBmaWxlcyAqLwoJCXdyaXRlX3JlbGNhY2hlX2luaXRfZmlsZSh0cnVl KTsKCQl3cml0ZV9yZWxjYWNoZV9pbml0X2ZpbGUoZmFsc2UpOwoJfQp9CgovKgogKiBMb2Fk IG9uZSBjcml0aWNhbCBzeXN0ZW0gaW5kZXggaW50byB0aGUgcmVsY2FjaGUKICoKICogaW5k ZXhvaWQgaXMgdGhlIE9JRCBvZiB0aGUgdGFyZ2V0IGluZGV4LCBoZWFwb2lkIGlzIHRoZSBP SUQgb2YgdGhlIGNhdGFsb2cKICogaXQgYmVsb25ncyB0by4KICovCnN0YXRpYyB2b2lkCmxv YWRfY3JpdGljYWxfaW5kZXgoT2lkIGluZGV4b2lkLCBPaWQgaGVhcG9pZCkKewoJUmVsYXRp b24JaXJkOwoKCS8qCgkgKiBXZSBtdXN0IGxvY2sgdGhlIHVuZGVybHlpbmcgY2F0YWxvZyBi ZWZvcmUgbG9ja2luZyB0aGUgaW5kZXggdG8gYXZvaWQKCSAqIGRlYWRsb2NrLCBzaW5jZSBS ZWxhdGlvbkJ1aWxkRGVzYyBtaWdodCB3ZWxsIG5lZWQgdG8gcmVhZCB0aGUgY2F0YWxvZywK CSAqIGFuZCBpZiBhbnlvbmUgZWxzZSBpcyBleGNsdXNpdmUtbG9ja2luZyB0aGlzIGNhdGFs b2cgYW5kIGluZGV4IHRoZXknbGwKCSAqIGJlIGRvaW5nIGl0IGluIHRoYXQgb3JkZXIuCgkg Ki8KCUxvY2tSZWxhdGlvbk9pZChoZWFwb2lkLCBBY2Nlc3NTaGFyZUxvY2spOwoJTG9ja1Jl bGF0aW9uT2lkKGluZGV4b2lkLCBBY2Nlc3NTaGFyZUxvY2spOwoJaXJkID0gUmVsYXRpb25C dWlsZERlc2MoaW5kZXhvaWQsIHRydWUpOwoJaWYgKGlyZCA9PSBOVUxMKQoJCWVyZXBvcnQo UEFOSUMsCgkJCQllcnJjb2RlKEVSUkNPREVfREFUQV9DT1JSVVBURUQpLAoJCQkJZXJybXNn X2ludGVybmFsKCJjb3VsZCBub3Qgb3BlbiBjcml0aWNhbCBzeXN0ZW0gaW5kZXggJXUiLCBp bmRleG9pZCkpOwoJaXJkLT5yZF9pc25haWxlZCA9IHRydWU7CglpcmQtPnJkX3JlZmNudCA9 IDE7CglVbmxvY2tSZWxhdGlvbk9pZChpbmRleG9pZCwgQWNjZXNzU2hhcmVMb2NrKTsKCVVu bG9ja1JlbGF0aW9uT2lkKGhlYXBvaWQsIEFjY2Vzc1NoYXJlTG9jayk7CgoJKHZvaWQpIFJl bGF0aW9uR2V0SW5kZXhBdHRPcHRpb25zKGlyZCwgZmFsc2UpOwp9CgovKgogKiBHZXRQZ0Ns YXNzRGVzY3JpcHRvciAtLSBnZXQgYSBwcmVkZWZpbmVkIHR1cGxlIGRlc2NyaXB0b3IgZm9y IHBnX2NsYXNzCiAqIEdldFBnSW5kZXhEZXNjcmlwdG9yIC0tIGdldCBhIHByZWRlZmluZWQg dHVwbGUgZGVzY3JpcHRvciBmb3IgcGdfaW5kZXgKICoKICogV2UgbmVlZCB0aGlzIGtsdWdl IGJlY2F1c2Ugd2UgaGF2ZSB0byBiZSBhYmxlIHRvIGFjY2VzcyBub24tZml4ZWQtd2lkdGgK ICogZmllbGRzIG9mIHBnX2NsYXNzIGFuZCBwZ19pbmRleCBiZWZvcmUgd2UgaGF2ZSB0aGUg c3RhbmRhcmQgY2F0YWxvZyBjYWNoZXMKICogYXZhaWxhYmxlLiAgV2UgdXNlIHByZWRlZmlu ZWQgZGF0YSB0aGF0J3Mgc2V0IHVwIGluIGp1c3QgdGhlIHNhbWUgd2F5IGFzCiAqIHRoZSBi b290c3RyYXBwZWQgcmVsZGVzY3MgdXNlZCBieSBmb3JtcmRlc2MoKS4gIFRoZSByZXN1bHRp bmcgdHVwZGVzYyBpcwogKiBub3QgMTAwJSBrb3NoZXI6IGl0IGRvZXMgbm90IGhhdmUgdGhl IGNvcnJlY3Qgcm93dHlwZSBPSUQgaW4gdGR0eXBlaWQsIG5vcgogKiBkb2VzIGl0IGhhdmUg YSBUdXBsZUNvbnN0ciBmaWVsZC4gIEJ1dCBpdCdzIGdvb2QgZW5vdWdoIGZvciB0aGUgcHVy cG9zZSBvZgogKiBleHRyYWN0aW5nIGZpZWxkcy4KICovCnN0YXRpYyBUdXBsZURlc2MKQnVp bGRIYXJkY29kZWREZXNjcmlwdG9yKGludCBuYXR0cywgY29uc3QgRm9ybURhdGFfcGdfYXR0 cmlidXRlICphdHRycykKewoJVHVwbGVEZXNjCXJlc3VsdDsKCU1lbW9yeUNvbnRleHQgb2xk Y3h0OwoJaW50CQkJaTsKCglvbGRjeHQgPSBNZW1vcnlDb250ZXh0U3dpdGNoVG8oQ2FjaGVN ZW1vcnlDb250ZXh0KTsKCglyZXN1bHQgPSBDcmVhdGVUZW1wbGF0ZVR1cGxlRGVzYyhuYXR0 cyk7CglyZXN1bHQtPnRkdHlwZWlkID0gUkVDT1JET0lEOwkvKiBub3QgcmlnaHQsIGJ1dCB3 ZSBkb24ndCBjYXJlICovCglyZXN1bHQtPnRkdHlwbW9kID0gLTE7CgoJZm9yIChpID0gMDsg aSA8IG5hdHRzOyBpKyspCgl7CgkJbWVtY3B5KFR1cGxlRGVzY0F0dHIocmVzdWx0LCBpKSwg JmF0dHJzW2ldLCBBVFRSSUJVVEVfRklYRURfUEFSVF9TSVpFKTsKCgkJcG9wdWxhdGVfY29t cGFjdF9hdHRyaWJ1dGUocmVzdWx0LCBpKTsKCX0KCglUdXBsZURlc2NGaW5hbGl6ZShyZXN1 bHQpOwoKCS8qIE5vdGU6IHdlIGRvbid0IGJvdGhlciB0byBzZXQgdXAgYSBUdXBsZUNvbnN0 ciBlbnRyeSAqLwoKCU1lbW9yeUNvbnRleHRTd2l0Y2hUbyhvbGRjeHQpOwoKCXJldHVybiBy ZXN1bHQ7Cn0KCnN0YXRpYyBUdXBsZURlc2MKR2V0UGdDbGFzc0Rlc2NyaXB0b3Iodm9pZCkK ewoJc3RhdGljIFR1cGxlRGVzYyBwZ2NsYXNzZGVzYyA9IE5VTEw7CgoJLyogQWxyZWFkeSBk b25lPyAqLwoJaWYgKHBnY2xhc3NkZXNjID09IE5VTEwpCgkJcGdjbGFzc2Rlc2MgPSBCdWls ZEhhcmRjb2RlZERlc2NyaXB0b3IoTmF0dHNfcGdfY2xhc3MsCgkJCQkJCQkJCQkJICAgRGVz Y19wZ19jbGFzcyk7CgoJcmV0dXJuIHBnY2xhc3NkZXNjOwp9CgpzdGF0aWMgVHVwbGVEZXNj CkdldFBnSW5kZXhEZXNjcmlwdG9yKHZvaWQpCnsKCXN0YXRpYyBUdXBsZURlc2MgcGdpbmRl eGRlc2MgPSBOVUxMOwoKCS8qIEFscmVhZHkgZG9uZT8gKi8KCWlmIChwZ2luZGV4ZGVzYyA9 PSBOVUxMKQoJCXBnaW5kZXhkZXNjID0gQnVpbGRIYXJkY29kZWREZXNjcmlwdG9yKE5hdHRz X3BnX2luZGV4LAoJCQkJCQkJCQkJCSAgIERlc2NfcGdfaW5kZXgpOwoKCXJldHVybiBwZ2lu ZGV4ZGVzYzsKfQoKLyoKICogTG9hZCBhbnkgZGVmYXVsdCBhdHRyaWJ1dGUgdmFsdWUgZGVm aW5pdGlvbnMgZm9yIHRoZSByZWxhdGlvbi4KICoKICogbmRlZiBpcyB0aGUgbnVtYmVyIG9m IGF0dHJpYnV0ZXMgdGhhdCB3ZXJlIG1hcmtlZCBhdHRoYXNkZWYuCiAqCiAqIE5vdGU6IHdl IGRvbid0IG1ha2UgaXQgYSBoYXJkIGVycm9yIHRvIGJlIG1pc3Npbmcgc29tZSBwZ19hdHRy ZGVmIHJlY29yZHMuCiAqIFdlIGNhbiBsaW1wIGFsb25nIGFzIGxvbmcgYXMgbm90aGluZyBu ZWVkcyB0byB1c2UgdGhlIGRlZmF1bHQgdmFsdWUuICBDb2RlCiAqIHRoYXQgZmFpbHMgdG8g ZmluZCBhbiBleHBlY3RlZCBBdHRyRGVmYXVsdCByZWNvcmQgc2hvdWxkIHRocm93IGFuIGVy cm9yLgogKi8Kc3RhdGljIHZvaWQKQXR0ckRlZmF1bHRGZXRjaChSZWxhdGlvbiByZWxhdGlv biwgaW50IG5kZWYpCnsKCUF0dHJEZWZhdWx0ICphdHRyZGVmOwoJUmVsYXRpb24JYWRyZWw7 CglTeXNTY2FuRGVzYyBhZHNjYW47CglTY2FuS2V5RGF0YSBza2V5OwoJSGVhcFR1cGxlCWh0 dXA7CglpbnQJCQlmb3VuZCA9IDA7CgoJLyogQWxsb2NhdGUgYXJyYXkgd2l0aCByb29tIGZv ciBhcyBtYW55IGVudHJpZXMgYXMgZXhwZWN0ZWQgKi8KCWF0dHJkZWYgPSAoQXR0ckRlZmF1 bHQgKikKCQlNZW1vcnlDb250ZXh0QWxsb2NaZXJvKENhY2hlTWVtb3J5Q29udGV4dCwKCQkJ CQkJCSAgIG5kZWYgKiBzaXplb2YoQXR0ckRlZmF1bHQpKTsKCgkvKiBTZWFyY2ggcGdfYXR0 cmRlZiBmb3IgcmVsZXZhbnQgZW50cmllcyAqLwoJU2NhbktleUluaXQoJnNrZXksCgkJCQlB bnVtX3BnX2F0dHJkZWZfYWRyZWxpZCwKCQkJCUJURXF1YWxTdHJhdGVneU51bWJlciwgRl9P SURFUSwKCQkJCU9iamVjdElkR2V0RGF0dW0oUmVsYXRpb25HZXRSZWxpZChyZWxhdGlvbikp KTsKCglhZHJlbCA9IHRhYmxlX29wZW4oQXR0ckRlZmF1bHRSZWxhdGlvbklkLCBBY2Nlc3NT aGFyZUxvY2spOwoJYWRzY2FuID0gc3lzdGFibGVfYmVnaW5zY2FuKGFkcmVsLCBBdHRyRGVm YXVsdEluZGV4SWQsIHRydWUsCgkJCQkJCQkJTlVMTCwgMSwgJnNrZXkpOwoKCXdoaWxlIChI ZWFwVHVwbGVJc1ZhbGlkKGh0dXAgPSBzeXN0YWJsZV9nZXRuZXh0KGFkc2NhbikpKQoJewoJ CUZvcm1fcGdfYXR0cmRlZiBhZGZvcm0gPSAoRm9ybV9wZ19hdHRyZGVmKSBHRVRTVFJVQ1Qo aHR1cCk7CgkJRGF0dW0JCXZhbDsKCQlib29sCQlpc251bGw7CgoJCS8qIHByb3RlY3QgbGlt aXRlZCBzaXplIG9mIGFycmF5ICovCgkJaWYgKGZvdW5kID49IG5kZWYpCgkJewoJCQllbG9n KFdBUk5JTkcsICJ1bmV4cGVjdGVkIHBnX2F0dHJkZWYgcmVjb3JkIGZvdW5kIGZvciBhdHRy aWJ1dGUgJWQgb2YgcmVsYXRpb24gXCIlc1wiIiwKCQkJCSBhZGZvcm0tPmFkbnVtLCBSZWxh dGlvbkdldFJlbGF0aW9uTmFtZShyZWxhdGlvbikpOwoJCQlicmVhazsKCQl9CgoJCXZhbCA9 IGZhc3RnZXRhdHRyKGh0dXAsCgkJCQkJCSAgQW51bV9wZ19hdHRyZGVmX2FkYmluLAoJCQkJ CQkgIGFkcmVsLT5yZF9hdHQsICZpc251bGwpOwoJCWlmIChpc251bGwpCgkJCWVsb2coV0FS TklORywgIm51bGwgYWRiaW4gZm9yIGF0dHJpYnV0ZSAlZCBvZiByZWxhdGlvbiBcIiVzXCIi LAoJCQkJIGFkZm9ybS0+YWRudW0sIFJlbGF0aW9uR2V0UmVsYXRpb25OYW1lKHJlbGF0aW9u KSk7CgkJZWxzZQoJCXsKCQkJLyogZGV0b2FzdCBhbmQgY29udmVydCB0byBjc3RyaW5nIGlu IGNhbGxlcidzIGNvbnRleHQgKi8KCQkJY2hhcgkgICAqcyA9IFRleHREYXR1bUdldENTdHJp bmcodmFsKTsKCgkJCWF0dHJkZWZbZm91bmRdLmFkbnVtID0gYWRmb3JtLT5hZG51bTsKCQkJ YXR0cmRlZltmb3VuZF0uYWRiaW4gPSBNZW1vcnlDb250ZXh0U3RyZHVwKENhY2hlTWVtb3J5 Q29udGV4dCwgcyk7CgkJCXBmcmVlKHMpOwoJCQlmb3VuZCsrOwoJCX0KCX0KCglzeXN0YWJs ZV9lbmRzY2FuKGFkc2Nhbik7Cgl0YWJsZV9jbG9zZShhZHJlbCwgQWNjZXNzU2hhcmVMb2Nr KTsKCglpZiAoZm91bmQgIT0gbmRlZikKCQllbG9nKFdBUk5JTkcsICIlZCBwZ19hdHRyZGVm IHJlY29yZChzKSBtaXNzaW5nIGZvciByZWxhdGlvbiBcIiVzXCIiLAoJCQkgbmRlZiAtIGZv dW5kLCBSZWxhdGlvbkdldFJlbGF0aW9uTmFtZShyZWxhdGlvbikpOwoKCS8qCgkgKiBTb3J0 IHRoZSBBdHRyRGVmYXVsdCBlbnRyaWVzIGJ5IGFkbnVtLCBmb3IgdGhlIGNvbnZlbmllbmNl IG9mCgkgKiBlcXVhbFR1cGxlRGVzY3MoKS4gIChVc3VhbGx5LCB0aGV5IGFscmVhZHkgd2ls bCBiZSBpbiBvcmRlciwgYnV0IHRoaXMKCSAqIG1pZ2h0IG5vdCBiZSBzbyBpZiBzeXN0YWJs ZV9nZXRuZXh0IGlzbid0IHVzaW5nIGFuIGluZGV4LikKCSAqLwoJaWYgKGZvdW5kID4gMSkK CQlxc29ydChhdHRyZGVmLCBmb3VuZCwgc2l6ZW9mKEF0dHJEZWZhdWx0KSwgQXR0ckRlZmF1 bHRDbXApOwoKCS8qIEluc3RhbGwgYXJyYXkgb25seSBhZnRlciBpdCdzIGZ1bGx5IHZhbGlk ICovCglyZWxhdGlvbi0+cmRfYXR0LT5jb25zdHItPmRlZnZhbCA9IGF0dHJkZWY7CglyZWxh dGlvbi0+cmRfYXR0LT5jb25zdHItPm51bV9kZWZ2YWwgPSBmb3VuZDsKfQoKLyoKICogcXNv cnQgY29tcGFyYXRvciB0byBzb3J0IEF0dHJEZWZhdWx0IGVudHJpZXMgYnkgYWRudW0KICov CnN0YXRpYyBpbnQKQXR0ckRlZmF1bHRDbXAoY29uc3Qgdm9pZCAqYSwgY29uc3Qgdm9pZCAq YikKewoJY29uc3QgQXR0ckRlZmF1bHQgKmFkYSA9IChjb25zdCBBdHRyRGVmYXVsdCAqKSBh OwoJY29uc3QgQXR0ckRlZmF1bHQgKmFkYiA9IChjb25zdCBBdHRyRGVmYXVsdCAqKSBiOwoK CXJldHVybiBwZ19jbXBfczE2KGFkYS0+YWRudW0sIGFkYi0+YWRudW0pOwp9CgovKgogKiBM b2FkIGFueSBjaGVjayBjb25zdHJhaW50cyBmb3IgdGhlIHJlbGF0aW9uLCBhbmQgdXBkYXRl IG5vdC1udWxsIHZhbGlkaXR5CiAqIG9mIGludmFsaWQgY29uc3RyYWludHMuCiAqCiAqIEFz IHdpdGggZGVmYXVsdHMsIGlmIHdlIGRvbid0IGZpbmQgdGhlIGV4cGVjdGVkIG51bWJlciBv ZiB0aGVtLCBqdXN0IHdhcm4KICogaGVyZS4gIFRoZSBleGVjdXRvciBzaG91bGQgdGhyb3cg YW4gZXJyb3IgaWYgYW4gSU5TRVJUL1VQREFURSBpcyBhdHRlbXB0ZWQuCiAqLwpzdGF0aWMg dm9pZApDaGVja05OQ29uc3RyYWludEZldGNoKFJlbGF0aW9uIHJlbGF0aW9uKQp7CglDb25z dHJDaGVjayAqY2hlY2s7CglpbnQJCQluY2hlY2sgPSByZWxhdGlvbi0+cmRfcmVsLT5yZWxj aGVja3M7CglSZWxhdGlvbgljb25yZWw7CglTeXNTY2FuRGVzYyBjb25zY2FuOwoJU2Nhbktl eURhdGEgc2tleVsxXTsKCUhlYXBUdXBsZQlodHVwOwoJaW50CQkJZm91bmQgPSAwOwoKCS8q IEFsbG9jYXRlIGFycmF5IHdpdGggcm9vbSBmb3IgYXMgbWFueSBlbnRyaWVzIGFzIGV4cGVj dGVkLCBpZiBuZWVkZWQgKi8KCWlmIChuY2hlY2sgPiAwKQoJCWNoZWNrID0gKENvbnN0ckNo ZWNrICopCgkJCU1lbW9yeUNvbnRleHRBbGxvY1plcm8oQ2FjaGVNZW1vcnlDb250ZXh0LAoJ CQkJCQkJCSAgIG5jaGVjayAqIHNpemVvZihDb25zdHJDaGVjaykpOwoJZWxzZQoJCWNoZWNr ID0gTlVMTDsKCgkvKiBTZWFyY2ggcGdfY29uc3RyYWludCBmb3IgcmVsZXZhbnQgZW50cmll cyAqLwoJU2NhbktleUluaXQoJnNrZXlbMF0sCgkJCQlBbnVtX3BnX2NvbnN0cmFpbnRfY29u cmVsaWQsCgkJCQlCVEVxdWFsU3RyYXRlZ3lOdW1iZXIsIEZfT0lERVEsCgkJCQlPYmplY3RJ ZEdldERhdHVtKFJlbGF0aW9uR2V0UmVsaWQocmVsYXRpb24pKSk7CgoJY29ucmVsID0gdGFi bGVfb3BlbihDb25zdHJhaW50UmVsYXRpb25JZCwgQWNjZXNzU2hhcmVMb2NrKTsKCWNvbnNj YW4gPSBzeXN0YWJsZV9iZWdpbnNjYW4oY29ucmVsLCBDb25zdHJhaW50UmVsaWRUeXBpZE5h bWVJbmRleElkLCB0cnVlLAoJCQkJCQkJCSBOVUxMLCAxLCBza2V5KTsKCgl3aGlsZSAoSGVh cFR1cGxlSXNWYWxpZChodHVwID0gc3lzdGFibGVfZ2V0bmV4dChjb25zY2FuKSkpCgl7CgkJ Rm9ybV9wZ19jb25zdHJhaW50IGNvbmZvcm0gPSAoRm9ybV9wZ19jb25zdHJhaW50KSBHRVRT VFJVQ1QoaHR1cCk7CgkJRGF0dW0JCXZhbDsKCQlib29sCQlpc251bGw7CgoJCS8qCgkJICog SWYgdGhpcyBpcyBhIG5vdC1udWxsIGNvbnN0cmFpbnQsIHRoZW4gb25seSBsb29rIGF0IGl0 IGlmIGl0J3MKCQkgKiBpbnZhbGlkLCBhbmQgaWYgc28sIG1hcmsgdGhlIFR1cGxlRGVzYyBl bnRyeSBhcyBrbm93biBpbnZhbGlkLgoJCSAqIE90aGVyd2lzZSBtb3ZlIG9uLiAgV2UnbGwg bWFyayBhbnkgcmVtYWluaW5nIGNvbHVtbnMgdGhhdCBhcmUgc3RpbGwKCQkgKiBpbiBVTktO T1dOIHN0YXRlIGFzIGtub3duIHZhbGlkIGxhdGVyLiAgVGhpcyBhbGxvd3MgdXMgbm90IHRv IGhhdmUKCQkgKiB0byBleHRyYWN0IHRoZSBhdHRudW0gZnJvbSB0aGlzIGNvbnN0cmFpbnQg dHVwbGUgaW4gdGhlIHZhc3QKCQkgKiBtYWpvcml0eSBvZiBjYXNlcy4KCQkgKi8KCQlpZiAo Y29uZm9ybS0+Y29udHlwZSA9PSBDT05TVFJBSU5UX05PVE5VTEwpCgkJewoJCQlpZiAoIWNv bmZvcm0tPmNvbnZhbGlkYXRlZCkKCQkJewoJCQkJQXR0ck51bWJlcglhdHRudW07CgoJCQkJ YXR0bnVtID0gZXh0cmFjdE5vdE51bGxDb2x1bW4oaHR1cCk7CgkJCQlBc3NlcnQocmVsYXRp b24tPnJkX2F0dC0+Y29tcGFjdF9hdHRyc1thdHRudW0gLSAxXS5hdHRudWxsYWJpbGl0eSA9 PQoJCQkJCSAgIEFUVE5VTExBQkxFX1VOS05PV04pOwoJCQkJcmVsYXRpb24tPnJkX2F0dC0+ Y29tcGFjdF9hdHRyc1thdHRudW0gLSAxXS5hdHRudWxsYWJpbGl0eSA9CgkJCQkJQVRUTlVM TEFCTEVfSU5WQUxJRDsKCQkJfQoKCQkJY29udGludWU7CgkJfQoKCQkvKiBGb3Igd2hhdCBm b2xsb3dzLCBjb25zaWRlciBjaGVjayBjb25zdHJhaW50cyBvbmx5ICovCgkJaWYgKGNvbmZv cm0tPmNvbnR5cGUgIT0gQ09OU1RSQUlOVF9DSEVDSykKCQkJY29udGludWU7CgoJCS8qIHBy b3RlY3QgbGltaXRlZCBzaXplIG9mIGFycmF5ICovCgkJaWYgKGZvdW5kID49IG5jaGVjaykK CQl7CgkJCWVsb2coV0FSTklORywgInVuZXhwZWN0ZWQgcGdfY29uc3RyYWludCByZWNvcmQg Zm91bmQgZm9yIHJlbGF0aW9uIFwiJXNcIiIsCgkJCQkgUmVsYXRpb25HZXRSZWxhdGlvbk5h bWUocmVsYXRpb24pKTsKCQkJYnJlYWs7CgkJfQoKCQkvKiBHcmFiIGFuZCB0ZXN0IGNvbmJp biBpcyBhY3R1YWxseSBzZXQgKi8KCQl2YWwgPSBmYXN0Z2V0YXR0cihodHVwLAoJCQkJCQkg IEFudW1fcGdfY29uc3RyYWludF9jb25iaW4sCgkJCQkJCSAgY29ucmVsLT5yZF9hdHQsICZp c251bGwpOwoJCWlmIChpc251bGwpCgkJCWVsb2coV0FSTklORywgIm51bGwgY29uYmluIGZv ciByZWxhdGlvbiBcIiVzXCIiLAoJCQkJIFJlbGF0aW9uR2V0UmVsYXRpb25OYW1lKHJlbGF0 aW9uKSk7CgkJZWxzZQoJCXsKCQkJLyogZGV0b2FzdCBhbmQgY29udmVydCB0byBjc3RyaW5n IGluIGNhbGxlcidzIGNvbnRleHQgKi8KCQkJY2hhcgkgICAqcyA9IFRleHREYXR1bUdldENT dHJpbmcodmFsKTsKCgkJCWNoZWNrW2ZvdW5kXS5jY2VuZm9yY2VkID0gY29uZm9ybS0+Y29u ZW5mb3JjZWQ7CgkJCWNoZWNrW2ZvdW5kXS5jY3ZhbGlkID0gY29uZm9ybS0+Y29udmFsaWRh dGVkOwoJCQljaGVja1tmb3VuZF0uY2Nub2luaGVyaXQgPSBjb25mb3JtLT5jb25ub2luaGVy aXQ7CgkJCWNoZWNrW2ZvdW5kXS5jY25hbWUgPSBNZW1vcnlDb250ZXh0U3RyZHVwKENhY2hl TWVtb3J5Q29udGV4dCwKCQkJCQkJCQkJCQkJCSAgTmFtZVN0cihjb25mb3JtLT5jb25uYW1l KSk7CgkJCWNoZWNrW2ZvdW5kXS5jY2JpbiA9IE1lbW9yeUNvbnRleHRTdHJkdXAoQ2FjaGVN ZW1vcnlDb250ZXh0LCBzKTsKCgkJCXBmcmVlKHMpOwoJCQlmb3VuZCsrOwoJCX0KCX0KCglz eXN0YWJsZV9lbmRzY2FuKGNvbnNjYW4pOwoJdGFibGVfY2xvc2UoY29ucmVsLCBBY2Nlc3NT aGFyZUxvY2spOwoKCWlmIChmb3VuZCAhPSBuY2hlY2spCgkJZWxvZyhXQVJOSU5HLCAiJWQg cGdfY29uc3RyYWludCByZWNvcmQocykgbWlzc2luZyBmb3IgcmVsYXRpb24gXCIlc1wiIiwK CQkJIG5jaGVjayAtIGZvdW5kLCBSZWxhdGlvbkdldFJlbGF0aW9uTmFtZShyZWxhdGlvbikp OwoKCS8qCgkgKiBTb3J0IHRoZSByZWNvcmRzIGJ5IG5hbWUuICBUaGlzIGVuc3VyZXMgdGhh dCBDSEVDS3MgYXJlIGFwcGxpZWQgaW4gYQoJICogZGV0ZXJtaW5pc3RpYyBvcmRlciwgYW5k IGl0IGFsc28gbWFrZXMgZXF1YWxUdXBsZURlc2NzKCkgZmFzdGVyLgoJICovCglpZiAoZm91 bmQgPiAxKQoJCXFzb3J0KGNoZWNrLCBmb3VuZCwgc2l6ZW9mKENvbnN0ckNoZWNrKSwgQ2hl Y2tDb25zdHJhaW50Q21wKTsKCgkvKiBJbnN0YWxsIGFycmF5IG9ubHkgYWZ0ZXIgaXQncyBm dWxseSB2YWxpZCAqLwoJcmVsYXRpb24tPnJkX2F0dC0+Y29uc3RyLT5jaGVjayA9IGNoZWNr OwoJcmVsYXRpb24tPnJkX2F0dC0+Y29uc3RyLT5udW1fY2hlY2sgPSBmb3VuZDsKfQoKLyoK ICogcXNvcnQgY29tcGFyYXRvciB0byBzb3J0IENvbnN0ckNoZWNrIGVudHJpZXMgYnkgbmFt ZQogKi8Kc3RhdGljIGludApDaGVja0NvbnN0cmFpbnRDbXAoY29uc3Qgdm9pZCAqYSwgY29u c3Qgdm9pZCAqYikKewoJY29uc3QgQ29uc3RyQ2hlY2sgKmNhID0gKGNvbnN0IENvbnN0ckNo ZWNrICopIGE7Cgljb25zdCBDb25zdHJDaGVjayAqY2IgPSAoY29uc3QgQ29uc3RyQ2hlY2sg KikgYjsKCglyZXR1cm4gc3RyY21wKGNhLT5jY25hbWUsIGNiLT5jY25hbWUpOwp9CgovKgog KiBSZWxhdGlvbkdldEZLZXlMaXN0IC0tIGdldCBhIGxpc3Qgb2YgZm9yZWlnbiBrZXkgaW5m byBmb3IgdGhlIHJlbGF0aW9uCiAqCiAqIFJldHVybnMgYSBsaXN0IG9mIEZvcmVpZ25LZXlD YWNoZUluZm8gc3RydWN0cywgb25lIHBlciBGSyBjb25zdHJhaW5pbmcKICogdGhlIGdpdmVu IHJlbGF0aW9uLiAgVGhpcyBkYXRhIGlzIGEgZGlyZWN0IGNvcHkgb2YgcmVsZXZhbnQgZmll bGRzIGZyb20KICogcGdfY29uc3RyYWludC4gIFRoZSBsaXN0IGl0ZW1zIGFyZSBpbiBubyBw YXJ0aWN1bGFyIG9yZGVyLgogKgogKiBDQVVUSU9OOiB0aGUgcmV0dXJuZWQgbGlzdCBpcyBw YXJ0IG9mIHRoZSByZWxjYWNoZSdzIGRhdGEsIGFuZCBjb3VsZAogKiB2YW5pc2ggaW4gYSBy ZWxjYWNoZSBlbnRyeSByZXNldC4gIENhbGxlcnMgbXVzdCBpbnNwZWN0IG9yIGNvcHkgaXQK ICogYmVmb3JlIGRvaW5nIGFueXRoaW5nIHRoYXQgbWlnaHQgdHJpZ2dlciBhIGNhY2hlIGZs dXNoLCBzdWNoIGFzCiAqIHN5c3RlbSBjYXRhbG9nIGFjY2Vzc2VzLiAgY29weU9iamVjdCgp IGNhbiBiZSB1c2VkIGlmIGRlc2lyZWQuCiAqIChXZSBkZWZpbmUgaXQgdGhpcyB3YXkgYmVj YXVzZSBjdXJyZW50IGNhbGxlcnMgd2FudCB0byBmaWx0ZXIgYW5kCiAqIG1vZGlmeSB0aGUg bGlzdCBlbnRyaWVzIGFueXdheSwgc28gY29weWluZyB3b3VsZCBiZSBhIHdhc3RlIG9mIHRp bWUuKQogKi8KTGlzdCAqClJlbGF0aW9uR2V0RktleUxpc3QoUmVsYXRpb24gcmVsYXRpb24p CnsKCUxpc3QJICAgKnJlc3VsdDsKCVJlbGF0aW9uCWNvbnJlbDsKCVN5c1NjYW5EZXNjIGNv bnNjYW47CglTY2FuS2V5RGF0YSBza2V5OwoJSGVhcFR1cGxlCWh0dXA7CglMaXN0CSAgICpv bGRsaXN0OwoJTWVtb3J5Q29udGV4dCBvbGRjeHQ7CgoJLyogUXVpY2sgZXhpdCBpZiB3ZSBh bHJlYWR5IGNvbXB1dGVkIHRoZSBsaXN0LiAqLwoJaWYgKHJlbGF0aW9uLT5yZF9ma2V5dmFs aWQpCgkJcmV0dXJuIHJlbGF0aW9uLT5yZF9ma2V5bGlzdDsKCgkvKgoJICogV2UgYnVpbGQg dGhlIGxpc3Qgd2UgaW50ZW5kIHRvIHJldHVybiAoaW4gdGhlIGNhbGxlcidzIGNvbnRleHQp IHdoaWxlCgkgKiBkb2luZyB0aGUgc2Nhbi4gIEFmdGVyIHN1Y2Nlc3NmdWxseSBjb21wbGV0 aW5nIHRoZSBzY2FuLCB3ZSBjb3B5IHRoYXQKCSAqIGxpc3QgaW50byB0aGUgcmVsY2FjaGUg ZW50cnkuICBUaGlzIGF2b2lkcyBjYWNoZS1jb250ZXh0IG1lbW9yeSBsZWFrYWdlCgkgKiBp ZiB3ZSBnZXQgc29tZSBzb3J0IG9mIGVycm9yIHBhcnR3YXkgdGhyb3VnaC4KCSAqLwoJcmVz dWx0ID0gTklMOwoKCS8qIFByZXBhcmUgdG8gc2NhbiBwZ19jb25zdHJhaW50IGZvciBlbnRy aWVzIGhhdmluZyBjb25yZWxpZCA9IHRoaXMgcmVsLiAqLwoJU2NhbktleUluaXQoJnNrZXks CgkJCQlBbnVtX3BnX2NvbnN0cmFpbnRfY29ucmVsaWQsCgkJCQlCVEVxdWFsU3RyYXRlZ3lO dW1iZXIsIEZfT0lERVEsCgkJCQlPYmplY3RJZEdldERhdHVtKFJlbGF0aW9uR2V0UmVsaWQo cmVsYXRpb24pKSk7CgoJY29ucmVsID0gdGFibGVfb3BlbihDb25zdHJhaW50UmVsYXRpb25J ZCwgQWNjZXNzU2hhcmVMb2NrKTsKCWNvbnNjYW4gPSBzeXN0YWJsZV9iZWdpbnNjYW4oY29u cmVsLCBDb25zdHJhaW50UmVsaWRUeXBpZE5hbWVJbmRleElkLCB0cnVlLAoJCQkJCQkJCSBO VUxMLCAxLCAmc2tleSk7CgoJd2hpbGUgKEhlYXBUdXBsZUlzVmFsaWQoaHR1cCA9IHN5c3Rh YmxlX2dldG5leHQoY29uc2NhbikpKQoJewoJCUZvcm1fcGdfY29uc3RyYWludCBjb25zdHJh aW50ID0gKEZvcm1fcGdfY29uc3RyYWludCkgR0VUU1RSVUNUKGh0dXApOwoJCUZvcmVpZ25L ZXlDYWNoZUluZm8gKmluZm87CgoJCS8qIGNvbnNpZGVyIG9ubHkgZm9yZWlnbiBrZXlzICov CgkJaWYgKGNvbnN0cmFpbnQtPmNvbnR5cGUgIT0gQ09OU1RSQUlOVF9GT1JFSUdOKQoJCQlj b250aW51ZTsKCgkJaW5mbyA9IG1ha2VOb2RlKEZvcmVpZ25LZXlDYWNoZUluZm8pOwoJCWlu Zm8tPmNvbm9pZCA9IGNvbnN0cmFpbnQtPm9pZDsKCQlpbmZvLT5jb25yZWxpZCA9IGNvbnN0 cmFpbnQtPmNvbnJlbGlkOwoJCWluZm8tPmNvbmZyZWxpZCA9IGNvbnN0cmFpbnQtPmNvbmZy ZWxpZDsKCQlpbmZvLT5jb25lbmZvcmNlZCA9IGNvbnN0cmFpbnQtPmNvbmVuZm9yY2VkOwoK CQlEZWNvbnN0cnVjdEZrQ29uc3RyYWludFJvdyhodHVwLCAmaW5mby0+bmtleXMsCgkJCQkJ CQkJICAgaW5mby0+Y29ua2V5LAoJCQkJCQkJCSAgIGluZm8tPmNvbmZrZXksCgkJCQkJCQkJ ICAgaW5mby0+Y29ucGZlcW9wLAoJCQkJCQkJCSAgIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwp OwoKCQkvKiBBZGQgRksncyBub2RlIHRvIHRoZSByZXN1bHQgbGlzdCAqLwoJCXJlc3VsdCA9 IGxhcHBlbmQocmVzdWx0LCBpbmZvKTsKCX0KCglzeXN0YWJsZV9lbmRzY2FuKGNvbnNjYW4p OwoJdGFibGVfY2xvc2UoY29ucmVsLCBBY2Nlc3NTaGFyZUxvY2spOwoKCS8qIE5vdyBzYXZl IGEgY29weSBvZiB0aGUgY29tcGxldGVkIGxpc3QgaW4gdGhlIHJlbGNhY2hlIGVudHJ5LiAq LwoJb2xkY3h0ID0gTWVtb3J5Q29udGV4dFN3aXRjaFRvKENhY2hlTWVtb3J5Q29udGV4dCk7 CglvbGRsaXN0ID0gcmVsYXRpb24tPnJkX2ZrZXlsaXN0OwoJcmVsYXRpb24tPnJkX2ZrZXls aXN0ID0gY29weU9iamVjdChyZXN1bHQpOwoJcmVsYXRpb24tPnJkX2ZrZXl2YWxpZCA9IHRy dWU7CglNZW1vcnlDb250ZXh0U3dpdGNoVG8ob2xkY3h0KTsKCgkvKiBEb24ndCBsZWFrIHRo ZSBvbGQgbGlzdCwgaWYgdGhlcmUgaXMgb25lICovCglsaXN0X2ZyZWVfZGVlcChvbGRsaXN0 KTsKCglyZXR1cm4gcmVzdWx0Owp9CgovKgogKiBSZWxhdGlvbkdldEluZGV4TGlzdCAtLSBn ZXQgYSBsaXN0IG9mIE9JRHMgb2YgaW5kZXhlcyBvbiB0aGlzIHJlbGF0aW9uCiAqCiAqIFRo ZSBpbmRleCBsaXN0IGlzIGNyZWF0ZWQgb25seSBpZiBzb21lb25lIHJlcXVlc3RzIGl0LiAg V2Ugc2NhbiBwZ19pbmRleAogKiB0byBmaW5kIHJlbGV2YW50IGluZGV4ZXMsIGFuZCBhZGQg dGhlIGxpc3QgdG8gdGhlIHJlbGNhY2hlIGVudHJ5IHNvIHRoYXQKICogd2Ugd29uJ3QgaGF2 ZSB0byBjb21wdXRlIGl0IGFnYWluLiAgTm90ZSB0aGF0IHNoYXJlZCBjYWNoZSBpbnZhbCBv ZiBhCiAqIHJlbGNhY2hlIGVudHJ5IHdpbGwgZGVsZXRlIHRoZSBvbGQgbGlzdCBhbmQgc2V0 IHJkX2luZGV4dmFsaWQgdG8gZmFsc2UsCiAqIHNvIHRoYXQgd2UgbXVzdCByZWNvbXB1dGUg dGhlIGluZGV4IGxpc3Qgb24gbmV4dCByZXF1ZXN0LiAgVGhpcyBoYW5kbGVzCiAqIGNyZWF0 aW9uIG9yIGRlbGV0aW9uIG9mIGFuIGluZGV4LgogKgogKiBJbmRleGVzIHRoYXQgYXJlIG1h cmtlZCBub3QgaW5kaXNsaXZlIGFyZSBvbWl0dGVkIGZyb20gdGhlIHJldHVybmVkIGxpc3Qu CiAqIFN1Y2ggaW5kZXhlcyBhcmUgZXhwZWN0ZWQgdG8gYmUgZHJvcHBlZCBtb21lbnRhcmls eSwgYW5kIHNob3VsZCBub3QgYmUKICogdG91Y2hlZCBhdCBhbGwgYnkgYW55IGNhbGxlciBv ZiB0aGlzIGZ1bmN0aW9uLgogKgogKiBUaGUgcmV0dXJuZWQgbGlzdCBpcyBndWFyYW50ZWVk IHRvIGJlIHNvcnRlZCBpbiBvcmRlciBieSBPSUQuICBUaGlzIGlzCiAqIG5lZWRlZCBieSB0 aGUgZXhlY3V0b3IsIHNpbmNlIGZvciBpbmRleCB0eXBlcyB0aGF0IHdlIG9idGFpbiBleGNs dXNpdmUKICogbG9ja3Mgb24gd2hlbiB1cGRhdGluZyB0aGUgaW5kZXgsIGFsbCBiYWNrZW5k cyBtdXN0IGxvY2sgdGhlIGluZGV4ZXMgaW4KICogdGhlIHNhbWUgb3JkZXIgb3Igd2Ugd2ls bCBnZXQgZGVhZGxvY2tzIChzZWUgRXhlY09wZW5JbmRpY2VzKCkpLiAgQW55CiAqIGNvbnNp c3RlbnQgb3JkZXJpbmcgd291bGQgZG8sIGJ1dCBvcmRlcmluZyBieSBPSUQgaXMgZWFzeS4K ICoKICogU2luY2Ugc2hhcmVkIGNhY2hlIGludmFsIGNhdXNlcyB0aGUgcmVsY2FjaGUncyBj b3B5IG9mIHRoZSBsaXN0IHRvIGdvIGF3YXksCiAqIHdlIHJldHVybiBhIGNvcHkgb2YgdGhl IGxpc3QgcGFsbG9jJ2QgaW4gdGhlIGNhbGxlcidzIGNvbnRleHQuICBUaGUgY2FsbGVyCiAq IG1heSBsaXN0X2ZyZWUoKSB0aGUgcmV0dXJuZWQgbGlzdCBhZnRlciBzY2FubmluZyBpdC4g VGhpcyBpcyBuZWNlc3NhcnkKICogc2luY2UgdGhlIGNhbGxlciB3aWxsIHR5cGljYWxseSBi ZSBkb2luZyBzeXNjYWNoZSBsb29rdXBzIG9uIHRoZSByZWxldmFudAogKiBpbmRleGVzLCBh bmQgc3lzY2FjaGUgbG9va3VwIGNvdWxkIGNhdXNlIFNJIG1lc3NhZ2VzIHRvIGJlIHByb2Nl c3NlZCEKICoKICogSW4gZXhhY3RseSB0aGUgc2FtZSB3YXksIHdlIHVwZGF0ZSByZF9wa2lu ZGV4LCB3aGljaCBpcyB0aGUgT0lEIG9mIHRoZQogKiByZWxhdGlvbidzIHByaW1hcnkga2V5 IGluZGV4IGlmIGFueSwgZWxzZSBJbnZhbGlkT2lkOyBhbmQgcmRfcmVwbGlkaW5kZXgsCiAq IHdoaWNoIGlzIHRoZSBwZ19jbGFzcyBPSUQgb2YgYW4gaW5kZXggdG8gYmUgdXNlZCBhcyB0 aGUgcmVsYXRpb24ncwogKiByZXBsaWNhdGlvbiBpZGVudGl0eSBpbmRleCwgb3IgSW52YWxp ZE9pZCBpZiB0aGVyZSBpcyBubyBzdWNoIGluZGV4LgogKi8KTGlzdCAqClJlbGF0aW9uR2V0 SW5kZXhMaXN0KFJlbGF0aW9uIHJlbGF0aW9uKQp7CglSZWxhdGlvbglpbmRyZWw7CglTeXNT Y2FuRGVzYyBpbmRzY2FuOwoJU2NhbktleURhdGEgc2tleTsKCUhlYXBUdXBsZQlodHVwOwoJ TGlzdAkgICAqcmVzdWx0OwoJTGlzdAkgICAqb2xkbGlzdDsKCWNoYXIJCXJlcGxpZGVudCA9 IHJlbGF0aW9uLT5yZF9yZWwtPnJlbHJlcGxpZGVudDsKCU9pZAkJCXBrZXlJbmRleCA9IElu dmFsaWRPaWQ7CglPaWQJCQljYW5kaWRhdGVJbmRleCA9IEludmFsaWRPaWQ7Cglib29sCQlw a2RlZmVycmFibGUgPSBmYWxzZTsKCU1lbW9yeUNvbnRleHQgb2xkY3h0OwoKCS8qIFF1aWNr IGV4aXQgaWYgd2UgYWxyZWFkeSBjb21wdXRlZCB0aGUgbGlzdC4gKi8KCWlmIChyZWxhdGlv bi0+cmRfaW5kZXh2YWxpZCkKCQlyZXR1cm4gbGlzdF9jb3B5KHJlbGF0aW9uLT5yZF9pbmRl eGxpc3QpOwoKCS8qCgkgKiBXZSBidWlsZCB0aGUgbGlzdCB3ZSBpbnRlbmQgdG8gcmV0dXJu IChpbiB0aGUgY2FsbGVyJ3MgY29udGV4dCkgd2hpbGUKCSAqIGRvaW5nIHRoZSBzY2FuLiAg QWZ0ZXIgc3VjY2Vzc2Z1bGx5IGNvbXBsZXRpbmcgdGhlIHNjYW4sIHdlIGNvcHkgdGhhdAoJ ICogbGlzdCBpbnRvIHRoZSByZWxjYWNoZSBlbnRyeS4gIFRoaXMgYXZvaWRzIGNhY2hlLWNv bnRleHQgbWVtb3J5IGxlYWthZ2UKCSAqIGlmIHdlIGdldCBzb21lIHNvcnQgb2YgZXJyb3Ig cGFydHdheSB0aHJvdWdoLgoJICovCglyZXN1bHQgPSBOSUw7CgoJLyogUHJlcGFyZSB0byBz Y2FuIHBnX2luZGV4IGZvciBlbnRyaWVzIGhhdmluZyBpbmRyZWxpZCA9IHRoaXMgcmVsLiAq LwoJU2NhbktleUluaXQoJnNrZXksCgkJCQlBbnVtX3BnX2luZGV4X2luZHJlbGlkLAoJCQkJ QlRFcXVhbFN0cmF0ZWd5TnVtYmVyLCBGX09JREVRLAoJCQkJT2JqZWN0SWRHZXREYXR1bShS ZWxhdGlvbkdldFJlbGlkKHJlbGF0aW9uKSkpOwoKCWluZHJlbCA9IHRhYmxlX29wZW4oSW5k ZXhSZWxhdGlvbklkLCBBY2Nlc3NTaGFyZUxvY2spOwoJaW5kc2NhbiA9IHN5c3RhYmxlX2Jl Z2luc2NhbihpbmRyZWwsIEluZGV4SW5kcmVsaWRJbmRleElkLCB0cnVlLAoJCQkJCQkJCSBO VUxMLCAxLCAmc2tleSk7CgoJd2hpbGUgKEhlYXBUdXBsZUlzVmFsaWQoaHR1cCA9IHN5c3Rh YmxlX2dldG5leHQoaW5kc2NhbikpKQoJewoJCUZvcm1fcGdfaW5kZXggaW5kZXggPSAoRm9y bV9wZ19pbmRleCkgR0VUU1RSVUNUKGh0dXApOwoKCQkvKgoJCSAqIElnbm9yZSBhbnkgaW5k ZXhlcyB0aGF0IGFyZSBjdXJyZW50bHkgYmVpbmcgZHJvcHBlZC4gIFRoaXMgd2lsbAoJCSAq IHByZXZlbnQgdGhlbSBmcm9tIGJlaW5nIHNlYXJjaGVkLCBpbnNlcnRlZCBpbnRvLCBvciBj b25zaWRlcmVkIGluCgkJICogSE9ULXNhZmV0eSBkZWNpc2lvbnMuICBJdCdzIHVuc2FmZSB0 byB0b3VjaCBzdWNoIGFuIGluZGV4IGF0IGFsbAoJCSAqIHNpbmNlIGl0cyBjYXRhbG9nIGVu dHJpZXMgY291bGQgZGlzYXBwZWFyIGF0IGFueSBpbnN0YW50LgoJCSAqLwoJCWlmICghaW5k ZXgtPmluZGlzbGl2ZSkKCQkJY29udGludWU7CgoJCS8qIGFkZCBpbmRleCdzIE9JRCB0byBy ZXN1bHQgbGlzdCAqLwoJCXJlc3VsdCA9IGxhcHBlbmRfb2lkKHJlc3VsdCwgaW5kZXgtPmlu ZGV4cmVsaWQpOwoKCQkvKgoJCSAqIE5vbi11bmlxdWUgb3IgcHJlZGljYXRlIGluZGV4ZXMg YXJlbid0IGludGVyZXN0aW5nIGZvciBlaXRoZXIgb2lkCgkJICogaW5kZXhlcyBvciByZXBs aWNhdGlvbiBpZGVudGl0eSBpbmRleGVzLCBzbyBkb24ndCBjaGVjayB0aGVtLgoJCSAqIERl ZmVycmVkIG9uZXMgYXJlIG5vdCB1c2VmdWwgZm9yIHJlcGxpY2F0aW9uIGlkZW50aXR5IGVp dGhlcjsgYnV0CgkJICogd2UgZG8gaW5jbHVkZSB0aGVtIGlmIHRoZXkgYXJlIFBLcy4KCQkg Ki8KCQlpZiAoIWluZGV4LT5pbmRpc3VuaXF1ZSB8fAoJCQkhaGVhcF9hdHRpc251bGwoaHR1 cCwgQW51bV9wZ19pbmRleF9pbmRwcmVkLCBOVUxMKSkKCQkJY29udGludWU7CgoJCS8qCgkJ ICogUmVtZW1iZXIgcHJpbWFyeSBrZXkgaW5kZXgsIGlmIGFueS4gIEZvciByZWd1bGFyIHRh YmxlcyB3ZSBkbyB0aGlzCgkJICogb25seSBpZiB0aGUgaW5kZXggaXMgdmFsaWQ7IGJ1dCBm b3IgcGFydGl0aW9uZWQgdGFibGVzLCB0aGVuIHdlIGRvCgkJICogaXQgZXZlbiBpZiBpdCdz IGludmFsaWQuCgkJICoKCQkgKiBUaGUgcmVhc29uIGZvciByZXR1cm5pbmcgaW52YWxpZCBw cmltYXJ5IGtleXMgZm9yIHBhcnRpdGlvbmVkCgkJICogdGFibGVzIGlzIHRoYXQgd2UgbmVl ZCBpdCB0byBwcmV2ZW50IGRyb3Agb2Ygbm90LW51bGwgY29uc3RyYWludHMKCQkgKiB0aGF0 IG1heSB1bmRlcmxpZSBzdWNoIGEgcHJpbWFyeSBrZXksIHdoaWNoIGlzIG9ubHkgYSBwcm9i bGVtIGZvcgoJCSAqIHBhcnRpdGlvbmVkIHRhYmxlcy4KCQkgKi8KCQlpZiAoaW5kZXgtPmlu ZGlzcHJpbWFyeSAmJgoJCQkoaW5kZXgtPmluZGlzdmFsaWQgfHwKCQkJIHJlbGF0aW9uLT5y ZF9yZWwtPnJlbGtpbmQgPT0gUkVMS0lORF9QQVJUSVRJT05FRF9UQUJMRSkpCgkJewoJCQlw a2V5SW5kZXggPSBpbmRleC0+aW5kZXhyZWxpZDsKCQkJcGtkZWZlcnJhYmxlID0gIWluZGV4 LT5pbmRpbW1lZGlhdGU7CgkJfQoKCQlpZiAoIWluZGV4LT5pbmRpbW1lZGlhdGUpCgkJCWNv bnRpbnVlOwoKCQlpZiAoIWluZGV4LT5pbmRpc3ZhbGlkKQoJCQljb250aW51ZTsKCgkJLyog cmVtZW1iZXIgZXhwbGljaXRseSBjaG9zZW4gcmVwbGljYSBpbmRleCAqLwoJCWlmIChpbmRl eC0+aW5kaXNyZXBsaWRlbnQpCgkJCWNhbmRpZGF0ZUluZGV4ID0gaW5kZXgtPmluZGV4cmVs aWQ7Cgl9CgoJc3lzdGFibGVfZW5kc2NhbihpbmRzY2FuKTsKCgl0YWJsZV9jbG9zZShpbmRy ZWwsIEFjY2Vzc1NoYXJlTG9jayk7CgoJLyogU29ydCB0aGUgcmVzdWx0IGxpc3QgaW50byBP SUQgb3JkZXIsIHBlciBBUEkgc3BlYy4gKi8KCWxpc3Rfc29ydChyZXN1bHQsIGxpc3Rfb2lk X2NtcCk7CgoJLyogTm93IHNhdmUgYSBjb3B5IG9mIHRoZSBjb21wbGV0ZWQgbGlzdCBpbiB0 aGUgcmVsY2FjaGUgZW50cnkuICovCglvbGRjeHQgPSBNZW1vcnlDb250ZXh0U3dpdGNoVG8o Q2FjaGVNZW1vcnlDb250ZXh0KTsKCW9sZGxpc3QgPSByZWxhdGlvbi0+cmRfaW5kZXhsaXN0 OwoJcmVsYXRpb24tPnJkX2luZGV4bGlzdCA9IGxpc3RfY29weShyZXN1bHQpOwoJcmVsYXRp b24tPnJkX3BraW5kZXggPSBwa2V5SW5kZXg7CglyZWxhdGlvbi0+cmRfaXNwa2RlZmVycmFi bGUgPSBwa2RlZmVycmFibGU7CglpZiAocmVwbGlkZW50ID09IFJFUExJQ0FfSURFTlRJVFlf REVGQVVMVCAmJiBPaWRJc1ZhbGlkKHBrZXlJbmRleCkgJiYgIXBrZGVmZXJyYWJsZSkKCQly ZWxhdGlvbi0+cmRfcmVwbGlkaW5kZXggPSBwa2V5SW5kZXg7CgllbHNlIGlmIChyZXBsaWRl bnQgPT0gUkVQTElDQV9JREVOVElUWV9JTkRFWCAmJiBPaWRJc1ZhbGlkKGNhbmRpZGF0ZUlu ZGV4KSkKCQlyZWxhdGlvbi0+cmRfcmVwbGlkaW5kZXggPSBjYW5kaWRhdGVJbmRleDsKCWVs c2UKCQlyZWxhdGlvbi0+cmRfcmVwbGlkaW5kZXggPSBJbnZhbGlkT2lkOwoJcmVsYXRpb24t PnJkX2luZGV4dmFsaWQgPSB0cnVlOwoJTWVtb3J5Q29udGV4dFN3aXRjaFRvKG9sZGN4dCk7 CgoJLyogRG9uJ3QgbGVhayB0aGUgb2xkIGxpc3QsIGlmIHRoZXJlIGlzIG9uZSAqLwoJbGlz dF9mcmVlKG9sZGxpc3QpOwoKCXJldHVybiByZXN1bHQ7Cn0KCi8qCiAqIFJlbGF0aW9uR2V0 U3RhdEV4dExpc3QKICoJCWdldCBhIGxpc3Qgb2YgT0lEcyBvZiBzdGF0aXN0aWNzIG9iamVj dHMgb24gdGhpcyByZWxhdGlvbgogKgogKiBUaGUgc3RhdGlzdGljcyBsaXN0IGlzIGNyZWF0 ZWQgb25seSBpZiBzb21lb25lIHJlcXVlc3RzIGl0LCBpbiBhIHdheQogKiBzaW1pbGFyIHRv IFJlbGF0aW9uR2V0SW5kZXhMaXN0KCkuICBXZSBzY2FuIHBnX3N0YXRpc3RpY19leHQgdG8g ZmluZAogKiByZWxldmFudCBzdGF0aXN0aWNzLCBhbmQgYWRkIHRoZSBsaXN0IHRvIHRoZSBy ZWxjYWNoZSBlbnRyeSBzbyB0aGF0IHdlCiAqIHdvbid0IGhhdmUgdG8gY29tcHV0ZSBpdCBh Z2Fpbi4gIE5vdGUgdGhhdCBzaGFyZWQgY2FjaGUgaW52YWwgb2YgYQogKiByZWxjYWNoZSBl bnRyeSB3aWxsIGRlbGV0ZSB0aGUgb2xkIGxpc3QgYW5kIHNldCByZF9zdGF0dmFsaWQgdG8g MCwKICogc28gdGhhdCB3ZSBtdXN0IHJlY29tcHV0ZSB0aGUgc3RhdGlzdGljcyBsaXN0IG9u IG5leHQgcmVxdWVzdC4gIFRoaXMKICogaGFuZGxlcyBjcmVhdGlvbiBvciBkZWxldGlvbiBv ZiBhIHN0YXRpc3RpY3Mgb2JqZWN0LgogKgogKiBUaGUgcmV0dXJuZWQgbGlzdCBpcyBndWFy YW50ZWVkIHRvIGJlIHNvcnRlZCBpbiBvcmRlciBieSBPSUQsIGFsdGhvdWdoCiAqIHRoaXMg aXMgbm90IGN1cnJlbnRseSBuZWVkZWQuCiAqCiAqIFNpbmNlIHNoYXJlZCBjYWNoZSBpbnZh bCBjYXVzZXMgdGhlIHJlbGNhY2hlJ3MgY29weSBvZiB0aGUgbGlzdCB0byBnbyBhd2F5LAog KiB3ZSByZXR1cm4gYSBjb3B5IG9mIHRoZSBsaXN0IHBhbGxvYydkIGluIHRoZSBjYWxsZXIn cyBjb250ZXh0LiAgVGhlIGNhbGxlcgogKiBtYXkgbGlzdF9mcmVlKCkgdGhlIHJldHVybmVk IGxpc3QgYWZ0ZXIgc2Nhbm5pbmcgaXQuIFRoaXMgaXMgbmVjZXNzYXJ5CiAqIHNpbmNlIHRo ZSBjYWxsZXIgd2lsbCB0eXBpY2FsbHkgYmUgZG9pbmcgc3lzY2FjaGUgbG9va3VwcyBvbiB0 aGUgcmVsZXZhbnQKICogc3RhdGlzdGljcywgYW5kIHN5c2NhY2hlIGxvb2t1cCBjb3VsZCBj YXVzZSBTSSBtZXNzYWdlcyB0byBiZSBwcm9jZXNzZWQhCiAqLwpMaXN0ICoKUmVsYXRpb25H ZXRTdGF0RXh0TGlzdChSZWxhdGlvbiByZWxhdGlvbikKewoJUmVsYXRpb24JaW5kcmVsOwoJ U3lzU2NhbkRlc2MgaW5kc2NhbjsKCVNjYW5LZXlEYXRhIHNrZXk7CglIZWFwVHVwbGUJaHR1 cDsKCUxpc3QJICAgKnJlc3VsdDsKCUxpc3QJICAgKm9sZGxpc3Q7CglNZW1vcnlDb250ZXh0 IG9sZGN4dDsKCgkvKiBRdWljayBleGl0IGlmIHdlIGFscmVhZHkgY29tcHV0ZWQgdGhlIGxp c3QuICovCglpZiAocmVsYXRpb24tPnJkX3N0YXR2YWxpZCAhPSAwKQoJCXJldHVybiBsaXN0 X2NvcHkocmVsYXRpb24tPnJkX3N0YXRsaXN0KTsKCgkvKgoJICogV2UgYnVpbGQgdGhlIGxp c3Qgd2UgaW50ZW5kIHRvIHJldHVybiAoaW4gdGhlIGNhbGxlcidzIGNvbnRleHQpIHdoaWxl CgkgKiBkb2luZyB0aGUgc2Nhbi4gIEFmdGVyIHN1Y2Nlc3NmdWxseSBjb21wbGV0aW5nIHRo ZSBzY2FuLCB3ZSBjb3B5IHRoYXQKCSAqIGxpc3QgaW50byB0aGUgcmVsY2FjaGUgZW50cnku ICBUaGlzIGF2b2lkcyBjYWNoZS1jb250ZXh0IG1lbW9yeSBsZWFrYWdlCgkgKiBpZiB3ZSBn ZXQgc29tZSBzb3J0IG9mIGVycm9yIHBhcnR3YXkgdGhyb3VnaC4KCSAqLwoJcmVzdWx0ID0g TklMOwoKCS8qCgkgKiBQcmVwYXJlIHRvIHNjYW4gcGdfc3RhdGlzdGljX2V4dCBmb3IgZW50 cmllcyBoYXZpbmcgc3R4cmVsaWQgPSB0aGlzCgkgKiByZWwuCgkgKi8KCVNjYW5LZXlJbml0 KCZza2V5LAoJCQkJQW51bV9wZ19zdGF0aXN0aWNfZXh0X3N0eHJlbGlkLAoJCQkJQlRFcXVh bFN0cmF0ZWd5TnVtYmVyLCBGX09JREVRLAoJCQkJT2JqZWN0SWRHZXREYXR1bShSZWxhdGlv bkdldFJlbGlkKHJlbGF0aW9uKSkpOwoKCWluZHJlbCA9IHRhYmxlX29wZW4oU3RhdGlzdGlj RXh0UmVsYXRpb25JZCwgQWNjZXNzU2hhcmVMb2NrKTsKCWluZHNjYW4gPSBzeXN0YWJsZV9i ZWdpbnNjYW4oaW5kcmVsLCBTdGF0aXN0aWNFeHRSZWxpZEluZGV4SWQsIHRydWUsCgkJCQkJ CQkJIE5VTEwsIDEsICZza2V5KTsKCgl3aGlsZSAoSGVhcFR1cGxlSXNWYWxpZChodHVwID0g c3lzdGFibGVfZ2V0bmV4dChpbmRzY2FuKSkpCgl7CgkJT2lkCQkJb2lkID0gKChGb3JtX3Bn X3N0YXRpc3RpY19leHQpIEdFVFNUUlVDVChodHVwKSktPm9pZDsKCgkJcmVzdWx0ID0gbGFw cGVuZF9vaWQocmVzdWx0LCBvaWQpOwoJfQoKCXN5c3RhYmxlX2VuZHNjYW4oaW5kc2Nhbik7 CgoJdGFibGVfY2xvc2UoaW5kcmVsLCBBY2Nlc3NTaGFyZUxvY2spOwoKCS8qIFNvcnQgdGhl IHJlc3VsdCBsaXN0IGludG8gT0lEIG9yZGVyLCBwZXIgQVBJIHNwZWMuICovCglsaXN0X3Nv cnQocmVzdWx0LCBsaXN0X29pZF9jbXApOwoKCS8qIE5vdyBzYXZlIGEgY29weSBvZiB0aGUg Y29tcGxldGVkIGxpc3QgaW4gdGhlIHJlbGNhY2hlIGVudHJ5LiAqLwoJb2xkY3h0ID0gTWVt b3J5Q29udGV4dFN3aXRjaFRvKENhY2hlTWVtb3J5Q29udGV4dCk7CglvbGRsaXN0ID0gcmVs YXRpb24tPnJkX3N0YXRsaXN0OwoJcmVsYXRpb24tPnJkX3N0YXRsaXN0ID0gbGlzdF9jb3B5 KHJlc3VsdCk7CgoJcmVsYXRpb24tPnJkX3N0YXR2YWxpZCA9IHRydWU7CglNZW1vcnlDb250 ZXh0U3dpdGNoVG8ob2xkY3h0KTsKCgkvKiBEb24ndCBsZWFrIHRoZSBvbGQgbGlzdCwgaWYg dGhlcmUgaXMgb25lICovCglsaXN0X2ZyZWUob2xkbGlzdCk7CgoJcmV0dXJuIHJlc3VsdDsK fQoKLyoKICogUmVsYXRpb25HZXRQcmltYXJ5S2V5SW5kZXggLS0gZ2V0IE9JRCBvZiB0aGUg cmVsYXRpb24ncyBwcmltYXJ5IGtleSBpbmRleAogKgogKiBSZXR1cm5zIEludmFsaWRPaWQg aWYgdGhlcmUgaXMgbm8gc3VjaCBpbmRleCwgb3IgaWYgdGhlIHByaW1hcnkga2V5IGlzCiAq IERFRkVSUkFCTEUgYW5kIHRoZSBjYWxsZXIgaXNuJ3QgT0sgd2l0aCB0aGF0LgogKi8KT2lk ClJlbGF0aW9uR2V0UHJpbWFyeUtleUluZGV4KFJlbGF0aW9uIHJlbGF0aW9uLCBib29sIGRl ZmVycmFibGVfb2spCnsKCUxpc3QJICAgKmlsaXN0OwoKCWlmICghcmVsYXRpb24tPnJkX2lu ZGV4dmFsaWQpCgl7CgkJLyogUmVsYXRpb25HZXRJbmRleExpc3QgZG9lcyB0aGUgaGVhdnkg bGlmdGluZy4gKi8KCQlpbGlzdCA9IFJlbGF0aW9uR2V0SW5kZXhMaXN0KHJlbGF0aW9uKTsK CQlsaXN0X2ZyZWUoaWxpc3QpOwoJCUFzc2VydChyZWxhdGlvbi0+cmRfaW5kZXh2YWxpZCk7 Cgl9CgoJaWYgKGRlZmVycmFibGVfb2spCgkJcmV0dXJuIHJlbGF0aW9uLT5yZF9wa2luZGV4 OwoJZWxzZSBpZiAocmVsYXRpb24tPnJkX2lzcGtkZWZlcnJhYmxlKQoJCXJldHVybiBJbnZh bGlkT2lkOwoJcmV0dXJuIHJlbGF0aW9uLT5yZF9wa2luZGV4Owp9CgovKgogKiBSZWxhdGlv bkdldFJlcGxpY2FJbmRleCAtLSBnZXQgT0lEIG9mIHRoZSByZWxhdGlvbidzIHJlcGxpY2Eg aWRlbnRpdHkgaW5kZXgKICoKICogUmV0dXJucyBJbnZhbGlkT2lkIGlmIHRoZXJlIGlzIG5v IHN1Y2ggaW5kZXguCiAqLwpPaWQKUmVsYXRpb25HZXRSZXBsaWNhSW5kZXgoUmVsYXRpb24g cmVsYXRpb24pCnsKCUxpc3QJICAgKmlsaXN0OwoKCWlmICghcmVsYXRpb24tPnJkX2luZGV4 dmFsaWQpCgl7CgkJLyogUmVsYXRpb25HZXRJbmRleExpc3QgZG9lcyB0aGUgaGVhdnkgbGlm dGluZy4gKi8KCQlpbGlzdCA9IFJlbGF0aW9uR2V0SW5kZXhMaXN0KHJlbGF0aW9uKTsKCQls aXN0X2ZyZWUoaWxpc3QpOwoJCUFzc2VydChyZWxhdGlvbi0+cmRfaW5kZXh2YWxpZCk7Cgl9 CgoJcmV0dXJuIHJlbGF0aW9uLT5yZF9yZXBsaWRpbmRleDsKfQoKLyoKICogUmVsYXRpb25H ZXRJbmRleEV4cHJlc3Npb25zIC0tIGdldCB0aGUgaW5kZXggZXhwcmVzc2lvbnMgZm9yIGFu IGluZGV4CiAqCiAqIFdlIGNhY2hlIHRoZSByZXN1bHQgb2YgdHJhbnNmb3JtaW5nIHBnX2lu ZGV4LmluZGV4cHJzIGludG8gYSBub2RlIHRyZWUuCiAqIElmIHRoZSByZWwgaXMgbm90IGFu IGluZGV4IG9yIGhhcyBubyBleHByZXNzaW9uYWwgY29sdW1ucywgd2UgcmV0dXJuIE5JTC4K ICogT3RoZXJ3aXNlLCB0aGUgcmV0dXJuZWQgdHJlZSBpcyBjb3BpZWQgaW50byB0aGUgY2Fs bGVyJ3MgbWVtb3J5IGNvbnRleHQuCiAqIChXZSBkb24ndCB3YW50IHRvIHJldHVybiBhIHBv aW50ZXIgdG8gdGhlIHJlbGNhY2hlIGNvcHksIHNpbmNlIGl0IGNvdWxkCiAqIGRpc2FwcGVh ciBkdWUgdG8gcmVsY2FjaGUgaW52YWxpZGF0aW9uLikKICovCkxpc3QgKgpSZWxhdGlvbkdl dEluZGV4RXhwcmVzc2lvbnMoUmVsYXRpb24gcmVsYXRpb24pCnsKCUxpc3QJICAgKnJlc3Vs dDsKCURhdHVtCQlleHByc0RhdHVtOwoJYm9vbAkJaXNudWxsOwoJY2hhcgkgICAqZXhwcnNT dHJpbmc7CglNZW1vcnlDb250ZXh0IG9sZGN4dDsKCgkvKiBRdWljayBleGl0IGlmIHdlIGFs cmVhZHkgY29tcHV0ZWQgdGhlIHJlc3VsdC4gKi8KCWlmIChyZWxhdGlvbi0+cmRfaW5kZXhw cnMpCgkJcmV0dXJuIGNvcHlPYmplY3QocmVsYXRpb24tPnJkX2luZGV4cHJzKTsKCgkvKiBR dWljayBleGl0IGlmIHRoZXJlIGlzIG5vdGhpbmcgdG8gZG8uICovCglpZiAocmVsYXRpb24t PnJkX2luZGV4dHVwbGUgPT0gTlVMTCB8fAoJCWhlYXBfYXR0aXNudWxsKHJlbGF0aW9uLT5y ZF9pbmRleHR1cGxlLCBBbnVtX3BnX2luZGV4X2luZGV4cHJzLCBOVUxMKSkKCQlyZXR1cm4g TklMOwoKCS8qCgkgKiBXZSBidWlsZCB0aGUgdHJlZSB3ZSBpbnRlbmQgdG8gcmV0dXJuIGlu IHRoZSBjYWxsZXIncyBjb250ZXh0LiBBZnRlcgoJICogc3VjY2Vzc2Z1bGx5IGNvbXBsZXRp bmcgdGhlIHdvcmssIHdlIGNvcHkgaXQgaW50byB0aGUgcmVsY2FjaGUgZW50cnkuCgkgKiBU aGlzIGF2b2lkcyBwcm9ibGVtcyBpZiB3ZSBnZXQgc29tZSBzb3J0IG9mIGVycm9yIHBhcnR3 YXkgdGhyb3VnaC4KCSAqLwoJZXhwcnNEYXR1bSA9IGhlYXBfZ2V0YXR0cihyZWxhdGlvbi0+ cmRfaW5kZXh0dXBsZSwKCQkJCQkJCSAgQW51bV9wZ19pbmRleF9pbmRleHBycywKCQkJCQkJ CSAgR2V0UGdJbmRleERlc2NyaXB0b3IoKSwKCQkJCQkJCSAgJmlzbnVsbCk7CglBc3NlcnQo IWlzbnVsbCk7CglleHByc1N0cmluZyA9IFRleHREYXR1bUdldENTdHJpbmcoZXhwcnNEYXR1 bSk7CglyZXN1bHQgPSAoTGlzdCAqKSBzdHJpbmdUb05vZGUoZXhwcnNTdHJpbmcpOwoJcGZy ZWUoZXhwcnNTdHJpbmcpOwoKCS8qCgkgKiBSdW4gdGhlIGV4cHJlc3Npb25zIHRocm91Z2gg ZXZhbF9jb25zdF9leHByZXNzaW9ucy4gVGhpcyBpcyBub3QganVzdCBhbgoJICogb3B0aW1p emF0aW9uLCBidXQgaXMgbmVjZXNzYXJ5LCBiZWNhdXNlIHRoZSBwbGFubmVyIHdpbGwgYmUg Y29tcGFyaW5nCgkgKiB0aGVtIHRvIHNpbWlsYXJseS1wcm9jZXNzZWQgcXVhbCBjbGF1c2Vz LCBhbmQgbWF5IGZhaWwgdG8gZGV0ZWN0IHZhbGlkCgkgKiBtYXRjaGVzIHdpdGhvdXQgdGhp cy4gIFdlIG11c3Qgbm90IHVzZSBjYW5vbmljYWxpemVfcXVhbCwgaG93ZXZlciwKCSAqIHNp bmNlIHRoZXNlIGFyZW4ndCBxdWFsIGV4cHJlc3Npb25zLgoJICovCglyZXN1bHQgPSAoTGlz dCAqKSBldmFsX2NvbnN0X2V4cHJlc3Npb25zKE5VTEwsIChOb2RlICopIHJlc3VsdCk7CgoJ LyogTWF5IGFzIHdlbGwgZml4IG9wZnVuY2lkcyB0b28gKi8KCWZpeF9vcGZ1bmNpZHMoKE5v ZGUgKikgcmVzdWx0KTsKCgkvKiBOb3cgc2F2ZSBhIGNvcHkgb2YgdGhlIGNvbXBsZXRlZCB0 cmVlIGluIHRoZSByZWxjYWNoZSBlbnRyeS4gKi8KCW9sZGN4dCA9IE1lbW9yeUNvbnRleHRT d2l0Y2hUbyhyZWxhdGlvbi0+cmRfaW5kZXhjeHQpOwoJcmVsYXRpb24tPnJkX2luZGV4cHJz ID0gY29weU9iamVjdChyZXN1bHQpOwoJTWVtb3J5Q29udGV4dFN3aXRjaFRvKG9sZGN4dCk7 CgoJcmV0dXJuIHJlc3VsdDsKfQoKTGlzdCAqClJlbGF0aW9uR2V0SW5kZXhFeHByZXNzaW9u c0V4cGFuZChSZWxhdGlvbiByZWxhdGlvbikKewoJTGlzdAkgICAqcmVzdWx0OwoJTWVtb3J5 Q29udGV4dCBvbGRjeHQ7Cglib29sCQlpc251bGw7CglEYXR1bQkJaGVhcFJlbGlkRGF0dW07 CglPaWQgICAgICAgICBoZWFwUmVsaWQ7CgoJLyogUXVpY2sgZXhpdCBpZiB3ZSBhbHJlYWR5 IGNvbXB1dGVkIHRoZSByZXN1bHQuICovCglpZiAocmVsYXRpb24tPnJkX2luZGV4cHJzRXhw YW5kKQoJCXJldHVybiBjb3B5T2JqZWN0KHJlbGF0aW9uLT5yZF9pbmRleHByc0V4cGFuZCk7 CgoJLyogUXVpY2sgZXhpdCBpZiB0aGVyZSBpcyBub3RoaW5nIHRvIGRvLiAqLwoJaWYgKHJl bGF0aW9uLT5yZF9pbmRleHR1cGxlID09IE5VTEwgfHwKCQloZWFwX2F0dGlzbnVsbChyZWxh dGlvbi0+cmRfaW5kZXh0dXBsZSwgQW51bV9wZ19pbmRleF9pbmRleHBycywgTlVMTCkpCgkJ cmV0dXJuIE5JTDsKCglyZXN1bHQgPSBSZWxhdGlvbkdldEluZGV4RXhwcmVzc2lvbnMocmVs YXRpb24pOwoJaWYgKHJlc3VsdCA9PSBOSUwpCgkJcmV0dXJuIE5JTDsKCgloZWFwUmVsaWRE YXR1bSA9IGhlYXBfZ2V0YXR0cihyZWxhdGlvbi0+cmRfaW5kZXh0dXBsZSwKCQkJCQkJCSBB bnVtX3BnX2luZGV4X2luZHJlbGlkLAoJCQkJCQkJIEdldFBnSW5kZXhEZXNjcmlwdG9yKCks CgkJCQkJCQkgJmlzbnVsbCk7CglBc3NlcnQoIWlzbnVsbCk7CgloZWFwUmVsaWQgPSBEYXR1 bUdldE9iamVjdElkKGhlYXBSZWxpZERhdHVtKTsKCglyZXN1bHQgPSBFeHBhbmRWaXJ0dWFs R2VuZXJhdGVkQ29sdW1ucyhyZXN1bHQsIE5VTEwsIGhlYXBSZWxpZCk7CgoJLyogTm93IHNh dmUgYSBjb3B5IG9mIHRoZSBjb21wbGV0ZWQgdHJlZSBpbiB0aGUgcmVsY2FjaGUgZW50cnku ICovCglvbGRjeHQgPSBNZW1vcnlDb250ZXh0U3dpdGNoVG8ocmVsYXRpb24tPnJkX2luZGV4 Y3h0KTsKCXJlbGF0aW9uLT5yZF9pbmRleHByc0V4cGFuZCA9IGNvcHlPYmplY3QocmVzdWx0 KTsKCU1lbW9yeUNvbnRleHRTd2l0Y2hUbyhvbGRjeHQpOwoKCXJldHVybiByZXN1bHQ7Cn0K Ci8qCiAqIFJlbGF0aW9uR2V0RHVtbXlJbmRleEV4cHJlc3Npb25zIC0tIGdldCBkdW1teSBl eHByZXNzaW9ucyBmb3IgYW4gaW5kZXgKICoKICogUmV0dXJuIGEgbGlzdCBvZiBkdW1teSBl eHByZXNzaW9ucyAoanVzdCBDb25zdCBub2Rlcykgd2l0aCB0aGUgc2FtZQogKiB0eXBlcy90 eXBtb2RzL2NvbGxhdGlvbnMgYXMgdGhlIGluZGV4J3MgcmVhbCBleHByZXNzaW9ucy4gIFRo aXMgaXMKICogdXNlZnVsIGluIHNpdHVhdGlvbnMgd2hlcmUgd2UgZG9uJ3Qgd2FudCB0byBy dW4gYW55IHVzZXItZGVmaW5lZCBjb2RlLgogKi8KTGlzdCAqClJlbGF0aW9uR2V0RHVtbXlJ bmRleEV4cHJlc3Npb25zKFJlbGF0aW9uIHJlbGF0aW9uKQp7CglMaXN0CSAgICpyZXN1bHQ7 CglEYXR1bQkJZXhwcnNEYXR1bTsKCWJvb2wJCWlzbnVsbDsKCWNoYXIJICAgKmV4cHJzU3Ry aW5nOwoJTGlzdAkgICAqcmF3RXhwcnM7CglMaXN0Q2VsbCAgICpsYzsKCgkvKiBRdWljayBl eGl0IGlmIHRoZXJlIGlzIG5vdGhpbmcgdG8gZG8uICovCglpZiAocmVsYXRpb24tPnJkX2lu ZGV4dHVwbGUgPT0gTlVMTCB8fAoJCWhlYXBfYXR0aXNudWxsKHJlbGF0aW9uLT5yZF9pbmRl eHR1cGxlLCBBbnVtX3BnX2luZGV4X2luZGV4cHJzLCBOVUxMKSkKCQlyZXR1cm4gTklMOwoK CS8qIEV4dHJhY3QgcmF3IG5vZGUgdHJlZShzKSBmcm9tIGluZGV4IHR1cGxlLiAqLwoJZXhw cnNEYXR1bSA9IGhlYXBfZ2V0YXR0cihyZWxhdGlvbi0+cmRfaW5kZXh0dXBsZSwKCQkJCQkJ CSAgQW51bV9wZ19pbmRleF9pbmRleHBycywKCQkJCQkJCSAgR2V0UGdJbmRleERlc2NyaXB0 b3IoKSwKCQkJCQkJCSAgJmlzbnVsbCk7CglBc3NlcnQoIWlzbnVsbCk7CglleHByc1N0cmlu ZyA9IFRleHREYXR1bUdldENTdHJpbmcoZXhwcnNEYXR1bSk7CglyYXdFeHBycyA9IChMaXN0 ICopIHN0cmluZ1RvTm9kZShleHByc1N0cmluZyk7CglwZnJlZShleHByc1N0cmluZyk7CgoJ LyogQ29uc3RydWN0IG51bGwgQ29uc3RzOyB0aGUgdHlwbGVuIGFuZCB0eXBieXZhbCBhcmUg YXJiaXRyYXJ5LiAqLwoJcmVzdWx0ID0gTklMOwoJZm9yZWFjaChsYywgcmF3RXhwcnMpCgl7 CgkJTm9kZQkgICAqcmF3RXhwciA9IChOb2RlICopIGxmaXJzdChsYyk7CgoJCXJlc3VsdCA9 IGxhcHBlbmQocmVzdWx0LAoJCQkJCQkgbWFrZUNvbnN0KGV4cHJUeXBlKHJhd0V4cHIpLAoJ CQkJCQkJCSAgIGV4cHJUeXBtb2QocmF3RXhwciksCgkJCQkJCQkJICAgZXhwckNvbGxhdGlv bihyYXdFeHByKSwKCQkJCQkJCQkgICAxLAoJCQkJCQkJCSAgIChEYXR1bSkgMCwKCQkJCQkJ CQkgICB0cnVlLAoJCQkJCQkJCSAgIHRydWUpKTsKCX0KCglyZXR1cm4gcmVzdWx0Owp9Cgov KgogKiBSZWxhdGlvbkdldEluZGV4UHJlZGljYXRlIC0tIGdldCB0aGUgaW5kZXggcHJlZGlj YXRlIGZvciBhbiBpbmRleAogKgogKiBXZSBjYWNoZSB0aGUgcmVzdWx0IG9mIHRyYW5zZm9y bWluZyBwZ19pbmRleC5pbmRwcmVkIGludG8gYW4gaW1wbGljaXQtQU5ECiAqIG5vZGUgdHJl ZSAoc3VpdGFibGUgZm9yIHVzZSBpbiBwbGFubmluZykuCiAqIElmIHRoZSByZWwgaXMgbm90 IGFuIGluZGV4IG9yIGhhcyBubyBwcmVkaWNhdGUsIHdlIHJldHVybiBOSUwuCiAqIE90aGVy d2lzZSwgdGhlIHJldHVybmVkIHRyZWUgaXMgY29waWVkIGludG8gdGhlIGNhbGxlcidzIG1l bW9yeSBjb250ZXh0LgogKiAoV2UgZG9uJ3Qgd2FudCB0byByZXR1cm4gYSBwb2ludGVyIHRv IHRoZSByZWxjYWNoZSBjb3B5LCBzaW5jZSBpdCBjb3VsZAogKiBkaXNhcHBlYXIgZHVlIHRv IHJlbGNhY2hlIGludmFsaWRhdGlvbi4pCiAqLwpMaXN0ICoKUmVsYXRpb25HZXRJbmRleFBy ZWRpY2F0ZShSZWxhdGlvbiByZWxhdGlvbikKewoJTGlzdAkgICAqcmVzdWx0OwoJRGF0dW0J CXByZWREYXR1bTsKCWJvb2wJCWlzbnVsbDsKCWNoYXIJICAgKnByZWRTdHJpbmc7CglNZW1v cnlDb250ZXh0IG9sZGN4dDsKCgkvKiBRdWljayBleGl0IGlmIHdlIGFscmVhZHkgY29tcHV0 ZWQgdGhlIHJlc3VsdC4gKi8KCWlmIChyZWxhdGlvbi0+cmRfaW5kcHJlZCkKCQlyZXR1cm4g Y29weU9iamVjdChyZWxhdGlvbi0+cmRfaW5kcHJlZCk7CgoJLyogUXVpY2sgZXhpdCBpZiB0 aGVyZSBpcyBub3RoaW5nIHRvIGRvLiAqLwoJaWYgKHJlbGF0aW9uLT5yZF9pbmRleHR1cGxl ID09IE5VTEwgfHwKCQloZWFwX2F0dGlzbnVsbChyZWxhdGlvbi0+cmRfaW5kZXh0dXBsZSwg QW51bV9wZ19pbmRleF9pbmRwcmVkLCBOVUxMKSkKCQlyZXR1cm4gTklMOwoKCS8qCgkgKiBX ZSBidWlsZCB0aGUgdHJlZSB3ZSBpbnRlbmQgdG8gcmV0dXJuIGluIHRoZSBjYWxsZXIncyBj b250ZXh0LiBBZnRlcgoJICogc3VjY2Vzc2Z1bGx5IGNvbXBsZXRpbmcgdGhlIHdvcmssIHdl IGNvcHkgaXQgaW50byB0aGUgcmVsY2FjaGUgZW50cnkuCgkgKiBUaGlzIGF2b2lkcyBwcm9i bGVtcyBpZiB3ZSBnZXQgc29tZSBzb3J0IG9mIGVycm9yIHBhcnR3YXkgdGhyb3VnaC4KCSAq LwoJcHJlZERhdHVtID0gaGVhcF9nZXRhdHRyKHJlbGF0aW9uLT5yZF9pbmRleHR1cGxlLAoJ CQkJCQkJIEFudW1fcGdfaW5kZXhfaW5kcHJlZCwKCQkJCQkJCSBHZXRQZ0luZGV4RGVzY3Jp cHRvcigpLAoJCQkJCQkJICZpc251bGwpOwoJQXNzZXJ0KCFpc251bGwpOwoJcHJlZFN0cmlu ZyA9IFRleHREYXR1bUdldENTdHJpbmcocHJlZERhdHVtKTsKCXJlc3VsdCA9IChMaXN0ICop IHN0cmluZ1RvTm9kZShwcmVkU3RyaW5nKTsKCXBmcmVlKHByZWRTdHJpbmcpOwoKCS8qCgkg KiBSdW4gdGhlIGV4cHJlc3Npb24gdGhyb3VnaCBjb25zdC1zaW1wbGlmaWNhdGlvbiBhbmQg Y2Fub25pY2FsaXphdGlvbi4KCSAqIFRoaXMgaXMgbm90IGp1c3QgYW4gb3B0aW1pemF0aW9u LCBidXQgaXMgbmVjZXNzYXJ5LCBiZWNhdXNlIHRoZSBwbGFubmVyCgkgKiB3aWxsIGJlIGNv bXBhcmluZyBpdCB0byBzaW1pbGFybHktcHJvY2Vzc2VkIHF1YWwgY2xhdXNlcywgYW5kIG1h eSBmYWlsCgkgKiB0byBkZXRlY3QgdmFsaWQgbWF0Y2hlcyB3aXRob3V0IHRoaXMuICBUaGlz IG11c3QgbWF0Y2ggdGhlIHByb2Nlc3NpbmcKCSAqIGRvbmUgdG8gcXVhbCBjbGF1c2VzIGlu IHByZXByb2Nlc3NfZXhwcmVzc2lvbigpISAgKFdlIGNhbiBza2lwIHRoZQoJICogc3R1ZmYg aW52b2x2aW5nIHN1YnF1ZXJpZXMsIGhvd2V2ZXIsIHNpbmNlIHdlIGRvbid0IGFsbG93IGFu eSBpbiBpbmRleAoJICogcHJlZGljYXRlcy4pCgkgKi8KCXJlc3VsdCA9IChMaXN0ICopIGV2 YWxfY29uc3RfZXhwcmVzc2lvbnMoTlVMTCwgKE5vZGUgKikgcmVzdWx0KTsKCglyZXN1bHQg PSAoTGlzdCAqKSBjYW5vbmljYWxpemVfcXVhbCgoRXhwciAqKSByZXN1bHQsIGZhbHNlKTsK CgkvKiBBbHNvIGNvbnZlcnQgdG8gaW1wbGljaXQtQU5EIGZvcm1hdCAqLwoJcmVzdWx0ID0g bWFrZV9hbmRzX2ltcGxpY2l0KChFeHByICopIHJlc3VsdCk7CgoJLyogTWF5IGFzIHdlbGwg Zml4IG9wZnVuY2lkcyB0b28gKi8KCWZpeF9vcGZ1bmNpZHMoKE5vZGUgKikgcmVzdWx0KTsK CgkvKiBOb3cgc2F2ZSBhIGNvcHkgb2YgdGhlIGNvbXBsZXRlZCB0cmVlIGluIHRoZSByZWxj YWNoZSBlbnRyeS4gKi8KCW9sZGN4dCA9IE1lbW9yeUNvbnRleHRTd2l0Y2hUbyhyZWxhdGlv bi0+cmRfaW5kZXhjeHQpOwoJcmVsYXRpb24tPnJkX2luZHByZWQgPSBjb3B5T2JqZWN0KHJl c3VsdCk7CglNZW1vcnlDb250ZXh0U3dpdGNoVG8ob2xkY3h0KTsKCglyZXR1cm4gcmVzdWx0 Owp9CgpMaXN0ICoKUmVsYXRpb25HZXRJbmRleFByZWRpY2F0ZUV4cGFuZChSZWxhdGlvbiBy ZWxhdGlvbikKewoJTGlzdAkgICAqcmVzdWx0OwoJTWVtb3J5Q29udGV4dCBvbGRjeHQ7Cgli b29sCQlpc251bGw7CglEYXR1bQkJaGVhcFJlbGlkRGF0dW07CglPaWQgICAgICAgICBoZWFw UmVsaWQ7CgoJLyogUXVpY2sgZXhpdCBpZiB3ZSBhbHJlYWR5IGNvbXB1dGVkIHRoZSByZXN1 bHQuICovCglpZiAocmVsYXRpb24tPnJkX2luZHByZWRFeHBhbmQpCgkJcmV0dXJuIGNvcHlP YmplY3QocmVsYXRpb24tPnJkX2luZHByZWRFeHBhbmQpOwoKCS8qIFF1aWNrIGV4aXQgaWYg dGhlcmUgaXMgbm90aGluZyB0byBkby4gKi8KCWlmIChyZWxhdGlvbi0+cmRfaW5kZXh0dXBs ZSA9PSBOVUxMIHx8CgkJaGVhcF9hdHRpc251bGwocmVsYXRpb24tPnJkX2luZGV4dHVwbGUs IEFudW1fcGdfaW5kZXhfaW5kcHJlZCwgTlVMTCkpCgkJcmV0dXJuIE5JTDsKCglyZXN1bHQg PSBSZWxhdGlvbkdldEluZGV4UHJlZGljYXRlKHJlbGF0aW9uKTsKCWlmIChyZXN1bHQgPT0g TklMKQoJCXJldHVybiBOSUw7CgoJaGVhcFJlbGlkRGF0dW0gPSBoZWFwX2dldGF0dHIocmVs YXRpb24tPnJkX2luZGV4dHVwbGUsCgkJCQkJCQkgQW51bV9wZ19pbmRleF9pbmRyZWxpZCwK CQkJCQkJCSBHZXRQZ0luZGV4RGVzY3JpcHRvcigpLAoJCQkJCQkJICZpc251bGwpOwoJQXNz ZXJ0KCFpc251bGwpOwoJaGVhcFJlbGlkID0gRGF0dW1HZXRPYmplY3RJZChoZWFwUmVsaWRE YXR1bSk7CgoJcmVzdWx0ID0gRXhwYW5kVmlydHVhbEdlbmVyYXRlZENvbHVtbnMocmVzdWx0 LCBOVUxMLCBoZWFwUmVsaWQpOwoKCS8qIE5vdyBzYXZlIGEgY29weSBvZiB0aGUgY29tcGxl dGVkIHRyZWUgaW4gdGhlIHJlbGNhY2hlIGVudHJ5LiAqLwoJb2xkY3h0ID0gTWVtb3J5Q29u dGV4dFN3aXRjaFRvKHJlbGF0aW9uLT5yZF9pbmRleGN4dCk7CglyZWxhdGlvbi0+cmRfaW5k cHJlZEV4cGFuZCA9IGNvcHlPYmplY3QocmVzdWx0KTsKCU1lbW9yeUNvbnRleHRTd2l0Y2hU byhvbGRjeHQpOwoKCXJldHVybiByZXN1bHQ7Cn0KCi8qCiAqIFJlbGF0aW9uR2V0SW5kZXhB dHRyQml0bWFwIC0tIGdldCBhIGJpdG1hcCBvZiBpbmRleCBhdHRyaWJ1dGUgbnVtYmVycwog KgogKiBUaGUgcmVzdWx0IGhhcyBhIGJpdCBzZXQgZm9yIGVhY2ggYXR0cmlidXRlIHVzZWQg YW55d2hlcmUgaW4gdGhlIGluZGV4CiAqIGRlZmluaXRpb25zIG9mIGFsbCB0aGUgaW5kZXhl cyBvbiB0aGlzIHJlbGF0aW9uLiAgKFRoaXMgaW5jbHVkZXMgbm90IG9ubHkKICogc2ltcGxl IGluZGV4IGtleXMsIGJ1dCBhdHRyaWJ1dGVzIHVzZWQgaW4gZXhwcmVzc2lvbnMgYW5kIHBh cnRpYWwtaW5kZXgKICogcHJlZGljYXRlcy4pCiAqCiAqIERlcGVuZGluZyBvbiBhdHRyS2lu ZCwgYSBiaXRtYXAgY292ZXJpbmcgYXR0bnVtcyBmb3IgY2VydGFpbiBjb2x1bW5zIGlzCiAq IHJldHVybmVkOgogKglJTkRFWF9BVFRSX0JJVE1BUF9LRVkJCQlDb2x1bW5zIGluIG5vbi1w YXJ0aWFsIHVuaXF1ZSBpbmRleGVzIG5vdAogKgkJCQkJCQkJCWluIGV4cHJlc3Npb25zIChp LmUuLCB1c2FibGUgZm9yIEZLcykKICoJSU5ERVhfQVRUUl9CSVRNQVBfUFJJTUFSWV9LRVkJ Q29sdW1ucyBpbiB0aGUgdGFibGUncyBwcmltYXJ5IGtleQogKgkJCQkJCQkJCShiZXdhcmU6 IGV2ZW4gaWYgUEsgaXMgZGVmZXJyYWJsZSEpCiAqCUlOREVYX0FUVFJfQklUTUFQX0lERU5U SVRZX0tFWQlDb2x1bW5zIGluIHRoZSB0YWJsZSdzIHJlcGxpY2EgaWRlbnRpdHkKICoJCQkJ CQkJCQlpbmRleCAoZW1wdHkgaWYgRlVMTCkKICoJSU5ERVhfQVRUUl9CSVRNQVBfSE9UX0JM T0NLSU5HCUNvbHVtbnMgdGhhdCBibG9jayB1cGRhdGVzIGZyb20gYmVpbmcgSE9UCiAqCUlO REVYX0FUVFJfQklUTUFQX1NVTU1BUklaRUQJQ29sdW1ucyBpbmNsdWRlZCBpbiBzdW1tYXJp emluZyBpbmRleGVzCiAqCiAqIEF0dHJpYnV0ZSBudW1iZXJzIGFyZSBvZmZzZXQgYnkgRmly c3RMb3dJbnZhbGlkSGVhcEF0dHJpYnV0ZU51bWJlciBzbyB0aGF0CiAqIHdlIGNhbiBpbmNs dWRlIHN5c3RlbSBhdHRyaWJ1dGVzIChlLmcuLCBPSUQpIGluIHRoZSBiaXRtYXAgcmVwcmVz ZW50YXRpb24uCiAqCiAqIERlZmVycmVkIGluZGV4ZXMgYXJlIGNvbnNpZGVyZWQgZm9yIHRo ZSBwcmltYXJ5IGtleSwgYnV0IG5vdCBmb3IgcmVwbGljYQogKiBpZGVudGl0eS4KICoKICog Q2FsbGVyIGhhZCBiZXR0ZXIgaG9sZCBhdCBsZWFzdCBSb3dFeGNsdXNpdmVMb2NrIG9uIHRo ZSB0YXJnZXQgcmVsYXRpb24KICogdG8gZW5zdXJlIGl0IGlzIHNhZmUgKGRlYWRsb2NrLWZy ZWUpIGZvciB1cyB0byB0YWtlIGxvY2tzIG9uIHRoZSByZWxhdGlvbidzCiAqIGluZGV4ZXMu ICBOb3RlIHRoYXQgc2luY2UgdGhlIGludHJvZHVjdGlvbiBvZiBDUkVBVEUgSU5ERVggQ09O Q1VSUkVOVExZLAogKiB0aGF0IGxvY2sgbGV2ZWwgZG9lc24ndCBndWFyYW50ZWUgYSBzdGFi bGUgc2V0IG9mIGluZGV4ZXMsIHNvIHdlIGhhdmUgdG8KICogYmUgcHJlcGFyZWQgdG8gcmV0 cnkgaGVyZSBpbiBjYXNlIG9mIGEgY2hhbmdlIGluIHRoZSBzZXQgb2YgaW5kZXhlcy4KICoK ICogVGhlIHJldHVybmVkIHJlc3VsdCBpcyBwYWxsb2MnZCBpbiB0aGUgY2FsbGVyJ3MgbWVt b3J5IGNvbnRleHQgYW5kIHNob3VsZAogKiBiZSBibXNfZnJlZSdkIHdoZW4gbm90IG5lZWRl ZCBhbnltb3JlLgogKi8KQml0bWFwc2V0ICoKUmVsYXRpb25HZXRJbmRleEF0dHJCaXRtYXAo UmVsYXRpb24gcmVsYXRpb24sIEluZGV4QXR0ckJpdG1hcEtpbmQgYXR0cktpbmQpCnsKCUJp dG1hcHNldCAgKnVpbmRleGF0dHJzOwkvKiBjb2x1bW5zIGluIHVuaXF1ZSBpbmRleGVzICov CglCaXRtYXBzZXQgICpwa2luZGV4YXR0cnM7CS8qIGNvbHVtbnMgaW4gdGhlIHByaW1hcnkg aW5kZXggKi8KCUJpdG1hcHNldCAgKmlkaW5kZXhhdHRyczsJLyogY29sdW1ucyBpbiB0aGUg cmVwbGljYSBpZGVudGl0eSAqLwoJQml0bWFwc2V0ICAqaG90YmxvY2tpbmdhdHRyczsJLyog Y29sdW1ucyB3aXRoIEhPVCBibG9ja2luZyBpbmRleGVzICovCglCaXRtYXBzZXQgICpzdW1t YXJpemVkYXR0cnM7CS8qIGNvbHVtbnMgd2l0aCBzdW1tYXJpemluZyBpbmRleGVzICovCglM aXN0CSAgICppbmRleG9pZGxpc3Q7CglMaXN0CSAgICpuZXdpbmRleG9pZGxpc3Q7CglPaWQJ CQlyZWxwa2luZGV4OwoJT2lkCQkJcmVscmVwbGluZGV4OwoJTGlzdENlbGwgICAqbDsKCU1l bW9yeUNvbnRleHQgb2xkY3h0OwoKCS8qIFF1aWNrIGV4aXQgaWYgd2UgYWxyZWFkeSBjb21w dXRlZCB0aGUgcmVzdWx0LiAqLwoJaWYgKHJlbGF0aW9uLT5yZF9hdHRyc3ZhbGlkKQoJewoJ CXN3aXRjaCAoYXR0cktpbmQpCgkJewoJCQljYXNlIElOREVYX0FUVFJfQklUTUFQX0tFWToK CQkJCXJldHVybiBibXNfY29weShyZWxhdGlvbi0+cmRfa2V5YXR0cik7CgkJCWNhc2UgSU5E RVhfQVRUUl9CSVRNQVBfUFJJTUFSWV9LRVk6CgkJCQlyZXR1cm4gYm1zX2NvcHkocmVsYXRp b24tPnJkX3BrYXR0cik7CgkJCWNhc2UgSU5ERVhfQVRUUl9CSVRNQVBfSURFTlRJVFlfS0VZ OgoJCQkJcmV0dXJuIGJtc19jb3B5KHJlbGF0aW9uLT5yZF9pZGF0dHIpOwoJCQljYXNlIElO REVYX0FUVFJfQklUTUFQX0hPVF9CTE9DS0lORzoKCQkJCXJldHVybiBibXNfY29weShyZWxh dGlvbi0+cmRfaG90YmxvY2tpbmdhdHRyKTsKCQkJY2FzZSBJTkRFWF9BVFRSX0JJVE1BUF9T VU1NQVJJWkVEOgoJCQkJcmV0dXJuIGJtc19jb3B5KHJlbGF0aW9uLT5yZF9zdW1tYXJpemVk YXR0cik7CgkJCWRlZmF1bHQ6CgkJCQllbG9nKEVSUk9SLCAidW5rbm93biBhdHRyS2luZCAl dSIsIGF0dHJLaW5kKTsKCQl9Cgl9CgoJLyogRmFzdCBwYXRoIGlmIGRlZmluaXRlbHkgbm8g aW5kZXhlcyAqLwoJaWYgKCFSZWxhdGlvbkdldEZvcm0ocmVsYXRpb24pLT5yZWxoYXNpbmRl eCkKCQlyZXR1cm4gTlVMTDsKCgkvKgoJICogR2V0IGNhY2hlZCBsaXN0IG9mIGluZGV4IE9J RHMuIElmIHdlIGhhdmUgdG8gc3RhcnQgb3Zlciwgd2UgZG8gc28gaGVyZS4KCSAqLwpyZXN0 YXJ0OgoJaW5kZXhvaWRsaXN0ID0gUmVsYXRpb25HZXRJbmRleExpc3QocmVsYXRpb24pOwoK CS8qIEZhbGwgb3V0IGlmIG5vIGluZGV4ZXMgKGJ1dCByZWxoYXNpbmRleCB3YXMgc2V0KSAq LwoJaWYgKGluZGV4b2lkbGlzdCA9PSBOSUwpCgkJcmV0dXJuIE5VTEw7CgoJLyoKCSAqIENv cHkgdGhlIHJkX3BraW5kZXggYW5kIHJkX3JlcGxpZGluZGV4IHZhbHVlcyBjb21wdXRlZCBi eQoJICogUmVsYXRpb25HZXRJbmRleExpc3QgYmVmb3JlIHByb2NlZWRpbmcuICBUaGlzIGlz IG5lZWRlZCBiZWNhdXNlIGEKCSAqIHJlbGNhY2hlIGZsdXNoIGNvdWxkIG9jY3VyIGluc2lk ZSBpbmRleF9vcGVuIGJlbG93LCByZXNldHRpbmcgdGhlCgkgKiBmaWVsZHMgbWFuYWdlZCBi eSBSZWxhdGlvbkdldEluZGV4TGlzdC4gIFdlIG5lZWQgdG8gZG8gdGhlIHdvcmsgd2l0aAoJ ICogc3RhYmxlIHZhbHVlcyBvZiB0aGVzZSBmaWVsZHMuCgkgKi8KCXJlbHBraW5kZXggPSBy ZWxhdGlvbi0+cmRfcGtpbmRleDsKCXJlbHJlcGxpbmRleCA9IHJlbGF0aW9uLT5yZF9yZXBs aWRpbmRleDsKCgkvKgoJICogRm9yIGVhY2ggaW5kZXgsIGFkZCByZWZlcmVuY2VkIGF0dHJp YnV0ZXMgdG8gaW5kZXhhdHRycy4KCSAqCgkgKiBOb3RlOiB3ZSBjb25zaWRlciBhbGwgaW5k ZXhlcyByZXR1cm5lZCBieSBSZWxhdGlvbkdldEluZGV4TGlzdCwgZXZlbiBpZgoJICogdGhl eSBhcmUgbm90IGluZGlzcmVhZHkgb3IgaW5kaXN2YWxpZC4gIFRoaXMgaXMgaW1wb3J0YW50 IGJlY2F1c2UgYW4KCSAqIGluZGV4IGZvciB3aGljaCBDUkVBVEUgSU5ERVggQ09OQ1VSUkVO VExZIGhhcyBqdXN0IHN0YXJ0ZWQgbXVzdCBiZQoJICogaW5jbHVkZWQgaW4gSE9ULXNhZmV0 eSBkZWNpc2lvbnMgKHNlZSBSRUFETUUuSE9UKS4gIElmIGEgRFJPUCBJTkRFWAoJICogQ09O Q1VSUkVOVExZIGlzIGZhciBlbm91Z2ggYWxvbmcgdGhhdCB3ZSBzaG91bGQgaWdub3JlIHRo ZSBpbmRleCwgaXQKCSAqIHdvbid0IGJlIHJldHVybmVkIGF0IGFsbCBieSBSZWxhdGlvbkdl dEluZGV4TGlzdC4KCSAqLwoJdWluZGV4YXR0cnMgPSBOVUxMOwoJcGtpbmRleGF0dHJzID0g TlVMTDsKCWlkaW5kZXhhdHRycyA9IE5VTEw7Cglob3RibG9ja2luZ2F0dHJzID0gTlVMTDsK CXN1bW1hcml6ZWRhdHRycyA9IE5VTEw7Cglmb3JlYWNoKGwsIGluZGV4b2lkbGlzdCkKCXsK CQlPaWQJCQlpbmRleE9pZCA9IGxmaXJzdF9vaWQobCk7CgkJUmVsYXRpb24JaW5kZXhEZXNj OwoJCURhdHVtCQlkYXR1bTsKCQlib29sCQlpc251bGw7CgkJTm9kZQkgICAqaW5kZXhFeHBy ZXNzaW9uczsKCQlOb2RlCSAgICppbmRleFByZWRpY2F0ZTsKCQlpbnQJCQlpOwoJCWJvb2wJ CWlzS2V5OwkJLyogY2FuZGlkYXRlIGtleSAqLwoJCWJvb2wJCWlzUEs7CQkvKiBwcmltYXJ5 IGtleSAqLwoJCWJvb2wJCWlzSURLZXk7CS8qIHJlcGxpY2EgaWRlbnRpdHkgaW5kZXggKi8K CQlCaXRtYXBzZXQgKiphdHRyczsKCgkJaW5kZXhEZXNjID0gaW5kZXhfb3BlbihpbmRleE9p ZCwgQWNjZXNzU2hhcmVMb2NrKTsKCgkJLyoKCQkgKiBFeHRyYWN0IGluZGV4IGV4cHJlc3Np b25zIGFuZCBpbmRleCBwcmVkaWNhdGUuICBOb3RlOiBEb24ndCB1c2UKCQkgKiBSZWxhdGlv bkdldEluZGV4RXhwcmVzc2lvbnMoKS9SZWxhdGlvbkdldEluZGV4UHJlZGljYXRlKCksIGJl Y2F1c2UKCQkgKiB0aG9zZSBtaWdodCBydW4gY29uc3RhbnQgZXhwcmVzc2lvbnMgZXZhbHVh dGlvbiwgd2hpY2ggbmVlZHMgYQoJCSAqIHNuYXBzaG90LCB3aGljaCB3ZSBtaWdodCBub3Qg aGF2ZSBoZXJlLiAgKEFsc28sIGl0J3MgcHJvYmFibHkgbW9yZQoJCSAqIHNvdW5kIHRvIGNv bGxlY3QgdGhlIGJpdG1hcHMgYmVmb3JlIGFueSB0cmFuc2Zvcm1hdGlvbnMgdGhhdCBtaWdo dAoJCSAqIGVsaW1pbmF0ZSBjb2x1bW5zLCBidXQgdGhlIHByYWN0aWNhbCBpbXBhY3Qgb2Yg dGhpcyBpcyBsaW1pdGVkLikKCQkgKi8KCgkJZGF0dW0gPSBoZWFwX2dldGF0dHIoaW5kZXhE ZXNjLT5yZF9pbmRleHR1cGxlLCBBbnVtX3BnX2luZGV4X2luZGV4cHJzLAoJCQkJCQkJIEdl dFBnSW5kZXhEZXNjcmlwdG9yKCksICZpc251bGwpOwoJCWlmICghaXNudWxsKQoJCQlpbmRl eEV4cHJlc3Npb25zID0gc3RyaW5nVG9Ob2RlKFRleHREYXR1bUdldENTdHJpbmcoZGF0dW0p KTsKCQllbHNlCgkJCWluZGV4RXhwcmVzc2lvbnMgPSBOVUxMOwoKCQlkYXR1bSA9IGhlYXBf Z2V0YXR0cihpbmRleERlc2MtPnJkX2luZGV4dHVwbGUsIEFudW1fcGdfaW5kZXhfaW5kcHJl ZCwKCQkJCQkJCSBHZXRQZ0luZGV4RGVzY3JpcHRvcigpLCAmaXNudWxsKTsKCQlpZiAoIWlz bnVsbCkKCQkJaW5kZXhQcmVkaWNhdGUgPSBzdHJpbmdUb05vZGUoVGV4dERhdHVtR2V0Q1N0 cmluZyhkYXR1bSkpOwoJCWVsc2UKCQkJaW5kZXhQcmVkaWNhdGUgPSBOVUxMOwoKCQkvKiBD YW4gdGhpcyBpbmRleCBiZSByZWZlcmVuY2VkIGJ5IGEgZm9yZWlnbiBrZXk/ICovCgkJaXNL ZXkgPSBpbmRleERlc2MtPnJkX2luZGV4LT5pbmRpc3VuaXF1ZSAmJgoJCQlpbmRleEV4cHJl c3Npb25zID09IE5VTEwgJiYKCQkJaW5kZXhQcmVkaWNhdGUgPT0gTlVMTDsKCgkJLyogSXMg dGhpcyBhIHByaW1hcnkga2V5PyAqLwoJCWlzUEsgPSAoaW5kZXhPaWQgPT0gcmVscGtpbmRl eCk7CgoJCS8qIElzIHRoaXMgaW5kZXggdGhlIGNvbmZpZ3VyZWQgKG9yIGRlZmF1bHQpIHJl cGxpY2EgaWRlbnRpdHk/ICovCgkJaXNJREtleSA9IChpbmRleE9pZCA9PSByZWxyZXBsaW5k ZXgpOwoKCQkvKgoJCSAqIElmIHRoZSBpbmRleCBpcyBzdW1tYXJpemluZywgaXQgZG9lc24n dCBibG9jayBIT1QgdXBkYXRlcywgYnV0IHdlCgkJICogbWF5IHN0aWxsIG5lZWQgdG8gdXBk YXRlIGl0IChpZiB0aGUgYXR0cmlidXRlcyB3ZXJlIG1vZGlmaWVkKS4gU28KCQkgKiBkZWNp ZGUgd2hpY2ggYml0bWFwIHdlJ2xsIHVwZGF0ZSBpbiB0aGUgZm9sbG93aW5nIGxvb3AuCgkJ ICovCgkJaWYgKGluZGV4RGVzYy0+cmRfaW5kYW0tPmFtc3VtbWFyaXppbmcpCgkJCWF0dHJz ID0gJnN1bW1hcml6ZWRhdHRyczsKCQllbHNlCgkJCWF0dHJzID0gJmhvdGJsb2NraW5nYXR0 cnM7CgoJCS8qIENvbGxlY3Qgc2ltcGxlIGF0dHJpYnV0ZSByZWZlcmVuY2VzICovCgkJZm9y IChpID0gMDsgaSA8IGluZGV4RGVzYy0+cmRfaW5kZXgtPmluZG5hdHRzOyBpKyspCgkJewoJ CQlpbnQJCQlhdHRybnVtID0gaW5kZXhEZXNjLT5yZF9pbmRleC0+aW5ka2V5LnZhbHVlc1tp XTsKCgkJCS8qCgkJCSAqIFNpbmNlIHdlIGhhdmUgY292ZXJpbmcgaW5kZXhlcyB3aXRoIG5v bi1rZXkgY29sdW1ucywgd2UgbXVzdAoJCQkgKiBoYW5kbGUgdGhlbSBhY2N1cmF0ZWx5IGhl cmUuIG5vbi1rZXkgY29sdW1ucyBtdXN0IGJlIGFkZGVkIGludG8KCQkJICogaG90YmxvY2tp bmdhdHRycyBvciBzdW1tYXJpemVkYXR0cnMsIHNpbmNlIHRoZXkgYXJlIGluIGluZGV4LAoJ CQkgKiBhbmQgdXBkYXRlIHNob3VsZG4ndCBtaXNzIHRoZW0uCgkJCSAqCgkJCSAqIFN1bW1h cml6aW5nIGluZGV4ZXMgZG8gbm90IGJsb2NrIEhPVCwgYnV0IGRvIG5lZWQgdG8gYmUgdXBk YXRlZAoJCQkgKiB3aGVuIHRoZSBjb2x1bW4gdmFsdWUgY2hhbmdlcywgdGh1cyByZXF1aXJl IGEgc2VwYXJhdGUKCQkJICogYXR0cmlidXRlIGJpdG1hcHNldC4KCQkJICoKCQkJICogT2J2 aW91c2x5LCBub24ta2V5IGNvbHVtbnMgY291bGRuJ3QgYmUgcmVmZXJlbmNlZCBieSBmb3Jl aWduCgkJCSAqIGtleSBvciBpZGVudGl0eSBrZXkuIEhlbmNlIHdlIGRvIG5vdCBpbmNsdWRl IHRoZW0gaW50bwoJCQkgKiB1aW5kZXhhdHRycywgcGtpbmRleGF0dHJzIGFuZCBpZGluZGV4 YXR0cnMgYml0bWFwcy4KCQkJICovCgkJCWlmIChhdHRybnVtICE9IDApCgkJCXsKCQkJCSph dHRycyA9IGJtc19hZGRfbWVtYmVyKCphdHRycywKCQkJCQkJCQkJCWF0dHJudW0gLSBGaXJz dExvd0ludmFsaWRIZWFwQXR0cmlidXRlTnVtYmVyKTsKCgkJCQlpZiAoaXNLZXkgJiYgaSA8 IGluZGV4RGVzYy0+cmRfaW5kZXgtPmluZG5rZXlhdHRzKQoJCQkJCXVpbmRleGF0dHJzID0g Ym1zX2FkZF9tZW1iZXIodWluZGV4YXR0cnMsCgkJCQkJCQkJCQkJCSBhdHRybnVtIC0gRmly c3RMb3dJbnZhbGlkSGVhcEF0dHJpYnV0ZU51bWJlcik7CgoJCQkJaWYgKGlzUEsgJiYgaSA8 IGluZGV4RGVzYy0+cmRfaW5kZXgtPmluZG5rZXlhdHRzKQoJCQkJCXBraW5kZXhhdHRycyA9 IGJtc19hZGRfbWVtYmVyKHBraW5kZXhhdHRycywKCQkJCQkJCQkJCQkJICBhdHRybnVtIC0g Rmlyc3RMb3dJbnZhbGlkSGVhcEF0dHJpYnV0ZU51bWJlcik7CgoJCQkJaWYgKGlzSURLZXkg JiYgaSA8IGluZGV4RGVzYy0+cmRfaW5kZXgtPmluZG5rZXlhdHRzKQoJCQkJCWlkaW5kZXhh dHRycyA9IGJtc19hZGRfbWVtYmVyKGlkaW5kZXhhdHRycywKCQkJCQkJCQkJCQkJICBhdHRy bnVtIC0gRmlyc3RMb3dJbnZhbGlkSGVhcEF0dHJpYnV0ZU51bWJlcik7CgkJCX0KCQl9CgoJ CS8qIENvbGxlY3QgYWxsIGF0dHJpYnV0ZXMgdXNlZCBpbiBleHByZXNzaW9ucywgdG9vICov CgkJcHVsbF92YXJhdHRub3MoaW5kZXhFeHByZXNzaW9ucywgMSwgYXR0cnMpOwoKCQkvKiBD b2xsZWN0IGFsbCBhdHRyaWJ1dGVzIGluIHRoZSBpbmRleCBwcmVkaWNhdGUsIHRvbyAqLwoJ CXB1bGxfdmFyYXR0bm9zKGluZGV4UHJlZGljYXRlLCAxLCBhdHRycyk7CgoJCWluZGV4X2Ns b3NlKGluZGV4RGVzYywgQWNjZXNzU2hhcmVMb2NrKTsKCX0KCgkvKgoJICogRHVyaW5nIG9u ZSBvZiB0aGUgaW5kZXhfb3BlbnMgaW4gdGhlIGFib3ZlIGxvb3AsIHdlIG1pZ2h0IGhhdmUg cmVjZWl2ZWQKCSAqIGEgcmVsY2FjaGUgZmx1c2ggZXZlbnQgb24gdGhpcyByZWxjYWNoZSBl bnRyeSwgd2hpY2ggbWlnaHQgaGF2ZSBiZWVuCgkgKiBzaWduYWxpbmcgYSBjaGFuZ2UgaW4g dGhlIHJlbCdzIGluZGV4IGxpc3QuICBJZiBzbywgd2UnZCBiZXR0ZXIgc3RhcnQKCSAqIG92 ZXIgdG8gZW5zdXJlIHdlIGRlbGl2ZXIgdXAtdG8tZGF0ZSBhdHRyaWJ1dGUgYml0bWFwcy4K CSAqLwoJbmV3aW5kZXhvaWRsaXN0ID0gUmVsYXRpb25HZXRJbmRleExpc3QocmVsYXRpb24p OwoJaWYgKGVxdWFsKGluZGV4b2lkbGlzdCwgbmV3aW5kZXhvaWRsaXN0KSAmJgoJCXJlbHBr aW5kZXggPT0gcmVsYXRpb24tPnJkX3BraW5kZXggJiYKCQlyZWxyZXBsaW5kZXggPT0gcmVs YXRpb24tPnJkX3JlcGxpZGluZGV4KQoJewoJCS8qIFN0aWxsIHRoZSBzYW1lIGluZGV4IHNl dCwgc28gcHJvY2VlZCAqLwoJCWxpc3RfZnJlZShuZXdpbmRleG9pZGxpc3QpOwoJCWxpc3Rf ZnJlZShpbmRleG9pZGxpc3QpOwoJfQoJZWxzZQoJewoJCS8qIEdvdHRhIGRvIGl0IG92ZXIg Li4uIG1pZ2h0IGFzIHdlbGwgbm90IGxlYWsgbWVtb3J5ICovCgkJbGlzdF9mcmVlKG5ld2lu ZGV4b2lkbGlzdCk7CgkJbGlzdF9mcmVlKGluZGV4b2lkbGlzdCk7CgkJYm1zX2ZyZWUodWlu ZGV4YXR0cnMpOwoJCWJtc19mcmVlKHBraW5kZXhhdHRycyk7CgkJYm1zX2ZyZWUoaWRpbmRl eGF0dHJzKTsKCQlibXNfZnJlZShob3RibG9ja2luZ2F0dHJzKTsKCQlibXNfZnJlZShzdW1t YXJpemVkYXR0cnMpOwoKCQlnb3RvIHJlc3RhcnQ7Cgl9CgoJLyogRG9uJ3QgbGVhayB0aGUg b2xkIHZhbHVlcyBvZiB0aGVzZSBiaXRtYXBzLCBpZiBhbnkgKi8KCXJlbGF0aW9uLT5yZF9h dHRyc3ZhbGlkID0gZmFsc2U7CglibXNfZnJlZShyZWxhdGlvbi0+cmRfa2V5YXR0cik7Cgly ZWxhdGlvbi0+cmRfa2V5YXR0ciA9IE5VTEw7CglibXNfZnJlZShyZWxhdGlvbi0+cmRfcGth dHRyKTsKCXJlbGF0aW9uLT5yZF9wa2F0dHIgPSBOVUxMOwoJYm1zX2ZyZWUocmVsYXRpb24t PnJkX2lkYXR0cik7CglyZWxhdGlvbi0+cmRfaWRhdHRyID0gTlVMTDsKCWJtc19mcmVlKHJl bGF0aW9uLT5yZF9ob3RibG9ja2luZ2F0dHIpOwoJcmVsYXRpb24tPnJkX2hvdGJsb2NraW5n YXR0ciA9IE5VTEw7CglibXNfZnJlZShyZWxhdGlvbi0+cmRfc3VtbWFyaXplZGF0dHIpOwoJ cmVsYXRpb24tPnJkX3N1bW1hcml6ZWRhdHRyID0gTlVMTDsKCgkvKgoJICogTm93IHNhdmUg Y29waWVzIG9mIHRoZSBiaXRtYXBzIGluIHRoZSByZWxjYWNoZSBlbnRyeS4gIFdlIGludGVu dGlvbmFsbHkKCSAqIHNldCByZF9hdHRyc3ZhbGlkIGxhc3QsIGJlY2F1c2UgdGhhdCdzIHRo ZSBvbmUgdGhhdCBzaWduYWxzIHZhbGlkaXR5IG9mCgkgKiB0aGUgdmFsdWVzOyBpZiB3ZSBy dW4gb3V0IG9mIG1lbW9yeSBiZWZvcmUgbWFraW5nIHRoYXQgY29weSwgd2Ugd29uJ3QKCSAq IGxlYXZlIHRoZSByZWxjYWNoZSBlbnRyeSBsb29raW5nIGxpa2UgdGhlIG90aGVyIG9uZXMg YXJlIHZhbGlkIGJ1dAoJICogZW1wdHkuCgkgKi8KCW9sZGN4dCA9IE1lbW9yeUNvbnRleHRT d2l0Y2hUbyhDYWNoZU1lbW9yeUNvbnRleHQpOwoJcmVsYXRpb24tPnJkX2tleWF0dHIgPSBi bXNfY29weSh1aW5kZXhhdHRycyk7CglyZWxhdGlvbi0+cmRfcGthdHRyID0gYm1zX2NvcHko cGtpbmRleGF0dHJzKTsKCXJlbGF0aW9uLT5yZF9pZGF0dHIgPSBibXNfY29weShpZGluZGV4 YXR0cnMpOwoJcmVsYXRpb24tPnJkX2hvdGJsb2NraW5nYXR0ciA9IGJtc19jb3B5KGhvdGJs b2NraW5nYXR0cnMpOwoJcmVsYXRpb24tPnJkX3N1bW1hcml6ZWRhdHRyID0gYm1zX2NvcHko c3VtbWFyaXplZGF0dHJzKTsKCXJlbGF0aW9uLT5yZF9hdHRyc3ZhbGlkID0gdHJ1ZTsKCU1l bW9yeUNvbnRleHRTd2l0Y2hUbyhvbGRjeHQpOwoKCS8qIFdlIHJldHVybiBvdXIgb3JpZ2lu YWwgd29ya2luZyBjb3B5IGZvciBjYWxsZXIgdG8gcGxheSB3aXRoICovCglzd2l0Y2ggKGF0 dHJLaW5kKQoJewoJCWNhc2UgSU5ERVhfQVRUUl9CSVRNQVBfS0VZOgoJCQlyZXR1cm4gdWlu ZGV4YXR0cnM7CgkJY2FzZSBJTkRFWF9BVFRSX0JJVE1BUF9QUklNQVJZX0tFWToKCQkJcmV0 dXJuIHBraW5kZXhhdHRyczsKCQljYXNlIElOREVYX0FUVFJfQklUTUFQX0lERU5USVRZX0tF WToKCQkJcmV0dXJuIGlkaW5kZXhhdHRyczsKCQljYXNlIElOREVYX0FUVFJfQklUTUFQX0hP VF9CTE9DS0lORzoKCQkJcmV0dXJuIGhvdGJsb2NraW5nYXR0cnM7CgkJY2FzZSBJTkRFWF9B VFRSX0JJVE1BUF9TVU1NQVJJWkVEOgoJCQlyZXR1cm4gc3VtbWFyaXplZGF0dHJzOwoJCWRl ZmF1bHQ6CgkJCWVsb2coRVJST1IsICJ1bmtub3duIGF0dHJLaW5kICV1IiwgYXR0cktpbmQp OwoJCQlyZXR1cm4gTlVMTDsKCX0KfQoKLyoKICogUmVsYXRpb25HZXRJZGVudGl0eUtleUJp dG1hcCAtLSBnZXQgYSBiaXRtYXAgb2YgcmVwbGljYSBpZGVudGl0eSBhdHRyaWJ1dGUKICog bnVtYmVycwogKgogKiBBIGJpdG1hcCBvZiBpbmRleCBhdHRyaWJ1dGUgbnVtYmVycyBmb3Ig dGhlIGNvbmZpZ3VyZWQgcmVwbGljYSBpZGVudGl0eQogKiBpbmRleCBpcyByZXR1cm5lZC4K ICoKICogU2VlIGFsc28gY29tbWVudHMgb2YgUmVsYXRpb25HZXRJbmRleEF0dHJCaXRtYXAo KS4KICoKICogVGhpcyBpcyBhIHNwZWNpYWwgcHVycG9zZSBmdW5jdGlvbiB1c2VkIGR1cmlu ZyBsb2dpY2FsIHJlcGxpY2F0aW9uLiBIZXJlLAogKiB1bmxpa2UgUmVsYXRpb25HZXRJbmRl eEF0dHJCaXRtYXAoKSwgd2UgZG9uJ3QgYWNxdWlyZSBhIGxvY2sgb24gdGhlIHJlcXVpcmVk CiAqIGluZGV4IGFzIHdlIGJ1aWxkIHRoZSBjYWNoZSBlbnRyeSB1c2luZyBhIGhpc3Rvcmlj IHNuYXBzaG90IGFuZCBhbGwgdGhlCiAqIGxhdGVyIGNoYW5nZXMgYXJlIGFic29yYmVkIHdo aWxlIGRlY29kaW5nIFdBTC4gRHVlIHRvIHRoaXMgcmVhc29uLCB3ZSBkb24ndAogKiBuZWVk IHRvIHJldHJ5IGhlcmUgaW4gY2FzZSBvZiBhIGNoYW5nZSBpbiB0aGUgc2V0IG9mIGluZGV4 ZXMuCiAqLwpCaXRtYXBzZXQgKgpSZWxhdGlvbkdldElkZW50aXR5S2V5Qml0bWFwKFJlbGF0 aW9uIHJlbGF0aW9uKQp7CglCaXRtYXBzZXQgICppZGluZGV4YXR0cnMgPSBOVUxMOwkvKiBj b2x1bW5zIGluIHRoZSByZXBsaWNhIGlkZW50aXR5ICovCglSZWxhdGlvbglpbmRleERlc2M7 CglpbnQJCQlpOwoJT2lkCQkJcmVwbGlkaW5kZXg7CglNZW1vcnlDb250ZXh0IG9sZGN4dDsK CgkvKiBRdWljayBleGl0IGlmIHdlIGFscmVhZHkgY29tcHV0ZWQgdGhlIHJlc3VsdCAqLwoJ aWYgKHJlbGF0aW9uLT5yZF9pZGF0dHIgIT0gTlVMTCkKCQlyZXR1cm4gYm1zX2NvcHkocmVs YXRpb24tPnJkX2lkYXR0cik7CgoJLyogRmFzdCBwYXRoIGlmIGRlZmluaXRlbHkgbm8gaW5k ZXhlcyAqLwoJaWYgKCFSZWxhdGlvbkdldEZvcm0ocmVsYXRpb24pLT5yZWxoYXNpbmRleCkK CQlyZXR1cm4gTlVMTDsKCgkvKiBIaXN0b3JpYyBzbmFwc2hvdCBtdXN0IGJlIHNldC4gKi8K CUFzc2VydChIaXN0b3JpY1NuYXBzaG90QWN0aXZlKCkpOwoKCXJlcGxpZGluZGV4ID0gUmVs YXRpb25HZXRSZXBsaWNhSW5kZXgocmVsYXRpb24pOwoKCS8qIEZhbGwgb3V0IGlmIHRoZXJl IGlzIG5vIHJlcGxpY2EgaWRlbnRpdHkgaW5kZXggKi8KCWlmICghT2lkSXNWYWxpZChyZXBs aWRpbmRleCkpCgkJcmV0dXJuIE5VTEw7CgoJLyogTG9vayB1cCB0aGUgZGVzY3JpcHRpb24g Zm9yIHRoZSByZXBsaWNhIGlkZW50aXR5IGluZGV4ICovCglpbmRleERlc2MgPSBSZWxhdGlv bklkR2V0UmVsYXRpb24ocmVwbGlkaW5kZXgpOwoKCWlmICghUmVsYXRpb25Jc1ZhbGlkKGlu ZGV4RGVzYykpCgkJZWxvZyhFUlJPUiwgImNvdWxkIG5vdCBvcGVuIHJlbGF0aW9uIHdpdGgg T0lEICV1IiwKCQkJIHJlbGF0aW9uLT5yZF9yZXBsaWRpbmRleCk7CgoJLyogQWRkIHJlZmVy ZW5jZWQgYXR0cmlidXRlcyB0byBpZGluZGV4YXR0cnMgKi8KCWZvciAoaSA9IDA7IGkgPCBp bmRleERlc2MtPnJkX2luZGV4LT5pbmRuYXR0czsgaSsrKQoJewoJCWludAkJCWF0dHJudW0g PSBpbmRleERlc2MtPnJkX2luZGV4LT5pbmRrZXkudmFsdWVzW2ldOwoKCQkvKgoJCSAqIFdl IGRvbid0IGluY2x1ZGUgbm9uLWtleSBjb2x1bW5zIGludG8gaWRpbmRleGF0dHJzIGJpdG1h cHMuIFNlZQoJCSAqIFJlbGF0aW9uR2V0SW5kZXhBdHRyQml0bWFwLgoJCSAqLwoJCWlmIChh dHRybnVtICE9IDApCgkJewoJCQlpZiAoaSA8IGluZGV4RGVzYy0+cmRfaW5kZXgtPmluZG5r ZXlhdHRzKQoJCQkJaWRpbmRleGF0dHJzID0gYm1zX2FkZF9tZW1iZXIoaWRpbmRleGF0dHJz LAoJCQkJCQkJCQkJCSAgYXR0cm51bSAtIEZpcnN0TG93SW52YWxpZEhlYXBBdHRyaWJ1dGVO dW1iZXIpOwoJCX0KCX0KCglSZWxhdGlvbkNsb3NlKGluZGV4RGVzYyk7CgoJLyogRG9uJ3Qg bGVhayB0aGUgb2xkIHZhbHVlcyBvZiB0aGVzZSBiaXRtYXBzLCBpZiBhbnkgKi8KCWJtc19m cmVlKHJlbGF0aW9uLT5yZF9pZGF0dHIpOwoJcmVsYXRpb24tPnJkX2lkYXR0ciA9IE5VTEw7 CgoJLyogTm93IHNhdmUgY29weSBvZiB0aGUgYml0bWFwIGluIHRoZSByZWxjYWNoZSBlbnRy eSAqLwoJb2xkY3h0ID0gTWVtb3J5Q29udGV4dFN3aXRjaFRvKENhY2hlTWVtb3J5Q29udGV4 dCk7CglyZWxhdGlvbi0+cmRfaWRhdHRyID0gYm1zX2NvcHkoaWRpbmRleGF0dHJzKTsKCU1l bW9yeUNvbnRleHRTd2l0Y2hUbyhvbGRjeHQpOwoKCS8qIFdlIHJldHVybiBvdXIgb3JpZ2lu YWwgd29ya2luZyBjb3B5IGZvciBjYWxsZXIgdG8gcGxheSB3aXRoICovCglyZXR1cm4gaWRp bmRleGF0dHJzOwp9CgovKgogKiBSZWxhdGlvbkdldEV4Y2x1c2lvbkluZm8gLS0gZ2V0IGlu Zm8gYWJvdXQgaW5kZXgncyBleGNsdXNpb24gY29uc3RyYWludAogKgogKiBUaGlzIHNob3Vs ZCBiZSBjYWxsZWQgb25seSBmb3IgYW4gaW5kZXggdGhhdCBpcyBrbm93biB0byBoYXZlIGFu IGFzc29jaWF0ZWQKICogZXhjbHVzaW9uIGNvbnN0cmFpbnQgb3IgcHJpbWFyeSBrZXkvdW5p cXVlIGNvbnN0cmFpbnQgdXNpbmcgV0lUSE9VVAogKiBPVkVSTEFQUy4KICoKICogSXQgcmV0 dXJucyBhcnJheXMgKHBhbGxvYydkIGluIGNhbGxlcidzIGNvbnRleHQpIG9mIHRoZSBleGNs dXNpb24gb3BlcmF0b3IKICogT0lEcywgdGhlaXIgdW5kZXJseWluZyBmdW5jdGlvbnMnIE9J RHMsIGFuZCB0aGVpciBzdHJhdGVneSBudW1iZXJzIGluIHRoZQogKiBpbmRleCdzIG9wY2xh c3Nlcy4gIFdlIGNhY2hlIGFsbCB0aGlzIGluZm9ybWF0aW9uIHNpbmNlIGl0IHJlcXVpcmVz IGEgZmFpcgogKiBhbW91bnQgb2Ygd29yayB0byBnZXQuCiAqLwp2b2lkClJlbGF0aW9uR2V0 RXhjbHVzaW9uSW5mbyhSZWxhdGlvbiBpbmRleFJlbGF0aW9uLAoJCQkJCQkgT2lkICoqb3Bl cmF0b3JzLAoJCQkJCQkgT2lkICoqcHJvY3MsCgkJCQkJCSB1aW50MTYgKipzdHJhdGVnaWVz KQp7CglpbnQJCQlpbmRua2V5YXR0czsKCU9pZAkJICAgKm9wczsKCU9pZAkJICAgKmZ1bmNz OwoJdWludDE2CSAgICpzdHJhdHM7CglSZWxhdGlvbgljb25yZWw7CglTeXNTY2FuRGVzYyBj b25zY2FuOwoJU2NhbktleURhdGEgc2tleVsxXTsKCUhlYXBUdXBsZQlodHVwOwoJYm9vbAkJ Zm91bmQ7CglNZW1vcnlDb250ZXh0IG9sZGN4dDsKCWludAkJCWk7CgoJaW5kbmtleWF0dHMg PSBJbmRleFJlbGF0aW9uR2V0TnVtYmVyT2ZLZXlBdHRyaWJ1dGVzKGluZGV4UmVsYXRpb24p OwoKCS8qIEFsbG9jYXRlIHJlc3VsdCBzcGFjZSBpbiBjYWxsZXIgY29udGV4dCAqLwoJKm9w ZXJhdG9ycyA9IG9wcyA9IHBhbGxvY19hcnJheShPaWQsIGluZG5rZXlhdHRzKTsKCSpwcm9j cyA9IGZ1bmNzID0gcGFsbG9jX2FycmF5KE9pZCwgaW5kbmtleWF0dHMpOwoJKnN0cmF0ZWdp ZXMgPSBzdHJhdHMgPSBwYWxsb2NfYXJyYXkodWludDE2LCBpbmRua2V5YXR0cyk7CgoJLyog UXVpY2sgZXhpdCBpZiB3ZSBoYXZlIHRoZSBkYXRhIGNhY2hlZCBhbHJlYWR5ICovCglpZiAo aW5kZXhSZWxhdGlvbi0+cmRfZXhjbHN0cmF0cyAhPSBOVUxMKQoJewoJCW1lbWNweShvcHMs IGluZGV4UmVsYXRpb24tPnJkX2V4Y2xvcHMsIHNpemVvZihPaWQpICogaW5kbmtleWF0dHMp OwoJCW1lbWNweShmdW5jcywgaW5kZXhSZWxhdGlvbi0+cmRfZXhjbHByb2NzLCBzaXplb2Yo T2lkKSAqIGluZG5rZXlhdHRzKTsKCQltZW1jcHkoc3RyYXRzLCBpbmRleFJlbGF0aW9uLT5y ZF9leGNsc3RyYXRzLCBzaXplb2YodWludDE2KSAqIGluZG5rZXlhdHRzKTsKCQlyZXR1cm47 Cgl9CgoJLyoKCSAqIFNlYXJjaCBwZ19jb25zdHJhaW50IGZvciB0aGUgY29uc3RyYWludCBh c3NvY2lhdGVkIHdpdGggdGhlIGluZGV4LiBUbwoJICogbWFrZSB0aGlzIG5vdCB0b28gcGFp bmZ1bGx5IHNsb3csIHdlIHVzZSB0aGUgaW5kZXggb24gY29ucmVsaWQ7IHRoYXQKCSAqIHdp bGwgaG9sZCB0aGUgcGFyZW50IHJlbGF0aW9uJ3MgT0lEIG5vdCB0aGUgaW5kZXgncyBvd24g T0lELgoJICoKCSAqIE5vdGU6IGlmIHdlIHdhbnRlZCB0byByZWx5IG9uIHRoZSBjb25zdHJh aW50IG5hbWUgbWF0Y2hpbmcgdGhlIGluZGV4J3MKCSAqIG5hbWUsIHdlIGNvdWxkIGp1c3Qg ZG8gYSBkaXJlY3QgbG9va3VwIHVzaW5nIHBnX2NvbnN0cmFpbnQncyB1bmlxdWUKCSAqIGlu ZGV4LiAgRm9yIHRoZSBtb21lbnQgaXQgZG9lc24ndCBzZWVtIHdvcnRoIHJlcXVpcmluZyB0 aGF0LgoJICovCglTY2FuS2V5SW5pdCgmc2tleVswXSwKCQkJCUFudW1fcGdfY29uc3RyYWlu dF9jb25yZWxpZCwKCQkJCUJURXF1YWxTdHJhdGVneU51bWJlciwgRl9PSURFUSwKCQkJCU9i amVjdElkR2V0RGF0dW0oaW5kZXhSZWxhdGlvbi0+cmRfaW5kZXgtPmluZHJlbGlkKSk7CgoJ Y29ucmVsID0gdGFibGVfb3BlbihDb25zdHJhaW50UmVsYXRpb25JZCwgQWNjZXNzU2hhcmVM b2NrKTsKCWNvbnNjYW4gPSBzeXN0YWJsZV9iZWdpbnNjYW4oY29ucmVsLCBDb25zdHJhaW50 UmVsaWRUeXBpZE5hbWVJbmRleElkLCB0cnVlLAoJCQkJCQkJCSBOVUxMLCAxLCBza2V5KTsK CWZvdW5kID0gZmFsc2U7CgoJd2hpbGUgKEhlYXBUdXBsZUlzVmFsaWQoaHR1cCA9IHN5c3Rh YmxlX2dldG5leHQoY29uc2NhbikpKQoJewoJCUZvcm1fcGdfY29uc3RyYWludCBjb25mb3Jt ID0gKEZvcm1fcGdfY29uc3RyYWludCkgR0VUU1RSVUNUKGh0dXApOwoJCURhdHVtCQl2YWw7 CgkJYm9vbAkJaXNudWxsOwoJCUFycmF5VHlwZSAgKmFycjsKCQlpbnQJCQluZWxlbTsKCgkJ LyogV2Ugd2FudCB0aGUgZXhjbHVzaW9uIGNvbnN0cmFpbnQgb3duaW5nIHRoZSBpbmRleCAq LwoJCWlmICgoY29uZm9ybS0+Y29udHlwZSAhPSBDT05TVFJBSU5UX0VYQ0xVU0lPTiAmJgoJ CQkgIShjb25mb3JtLT5jb25wZXJpb2QgJiYgKGNvbmZvcm0tPmNvbnR5cGUgPT0gQ09OU1RS QUlOVF9QUklNQVJZCgkJCQkJCQkJCSAgfHwgY29uZm9ybS0+Y29udHlwZSA9PSBDT05TVFJB SU5UX1VOSVFVRSkpKSB8fAoJCQljb25mb3JtLT5jb25pbmRpZCAhPSBSZWxhdGlvbkdldFJl bGlkKGluZGV4UmVsYXRpb24pKQoJCQljb250aW51ZTsKCgkJLyogVGhlcmUgc2hvdWxkIGJl IG9ubHkgb25lICovCgkJaWYgKGZvdW5kKQoJCQllbG9nKEVSUk9SLCAidW5leHBlY3RlZCBl eGNsdXNpb24gY29uc3RyYWludCByZWNvcmQgZm91bmQgZm9yIHJlbCAlcyIsCgkJCQkgUmVs YXRpb25HZXRSZWxhdGlvbk5hbWUoaW5kZXhSZWxhdGlvbikpOwoJCWZvdW5kID0gdHJ1ZTsK CgkJLyogRXh0cmFjdCB0aGUgb3BlcmF0b3IgT0lEUyBmcm9tIGNvbmV4Y2xvcCAqLwoJCXZh bCA9IGZhc3RnZXRhdHRyKGh0dXAsCgkJCQkJCSAgQW51bV9wZ19jb25zdHJhaW50X2NvbmV4 Y2xvcCwKCQkJCQkJICBjb25yZWwtPnJkX2F0dCwgJmlzbnVsbCk7CgkJaWYgKGlzbnVsbCkK CQkJZWxvZyhFUlJPUiwgIm51bGwgY29uZXhjbG9wIGZvciByZWwgJXMiLAoJCQkJIFJlbGF0 aW9uR2V0UmVsYXRpb25OYW1lKGluZGV4UmVsYXRpb24pKTsKCgkJYXJyID0gRGF0dW1HZXRB cnJheVR5cGVQKHZhbCk7CS8qIGVuc3VyZSBub3QgdG9hc3RlZCAqLwoJCW5lbGVtID0gQVJS X0RJTVMoYXJyKVswXTsKCQlpZiAoQVJSX05ESU0oYXJyKSAhPSAxIHx8CgkJCW5lbGVtICE9 IGluZG5rZXlhdHRzIHx8CgkJCUFSUl9IQVNOVUxMKGFycikgfHwKCQkJQVJSX0VMRU1UWVBF KGFycikgIT0gT0lET0lEKQoJCQllbG9nKEVSUk9SLCAiY29uZXhjbG9wIGlzIG5vdCBhIDEt RCBPaWQgYXJyYXkiKTsKCgkJbWVtY3B5KG9wcywgQVJSX0RBVEFfUFRSKGFyciksIHNpemVv ZihPaWQpICogaW5kbmtleWF0dHMpOwoJfQoKCXN5c3RhYmxlX2VuZHNjYW4oY29uc2Nhbik7 Cgl0YWJsZV9jbG9zZShjb25yZWwsIEFjY2Vzc1NoYXJlTG9jayk7CgoJaWYgKCFmb3VuZCkK CQllbG9nKEVSUk9SLCAiZXhjbHVzaW9uIGNvbnN0cmFpbnQgcmVjb3JkIG1pc3NpbmcgZm9y IHJlbCAlcyIsCgkJCSBSZWxhdGlvbkdldFJlbGF0aW9uTmFtZShpbmRleFJlbGF0aW9uKSk7 CgoJLyogV2UgbmVlZCB0aGUgZnVuYyBPSURzIGFuZCBzdHJhdGVneSBudW1iZXJzIHRvbyAq LwoJZm9yIChpID0gMDsgaSA8IGluZG5rZXlhdHRzOyBpKyspCgl7CgkJZnVuY3NbaV0gPSBn ZXRfb3Bjb2RlKG9wc1tpXSk7CgkJc3RyYXRzW2ldID0gZ2V0X29wX29wZmFtaWx5X3N0cmF0 ZWd5KG9wc1tpXSwKCQkJCQkJCQkJCQkgaW5kZXhSZWxhdGlvbi0+cmRfb3BmYW1pbHlbaV0p OwoJCS8qIHNob3VsZG4ndCBmYWlsLCBzaW5jZSBpdCB3YXMgY2hlY2tlZCBhdCBpbmRleCBj cmVhdGlvbiAqLwoJCWlmIChzdHJhdHNbaV0gPT0gSW52YWxpZFN0cmF0ZWd5KQoJCQllbG9n KEVSUk9SLCAiY291bGQgbm90IGZpbmQgc3RyYXRlZ3kgZm9yIG9wZXJhdG9yICV1IGluIGZh bWlseSAldSIsCgkJCQkgb3BzW2ldLCBpbmRleFJlbGF0aW9uLT5yZF9vcGZhbWlseVtpXSk7 Cgl9CgoJLyogU2F2ZSBhIGNvcHkgb2YgdGhlIHJlc3VsdHMgaW4gdGhlIHJlbGNhY2hlIGVu dHJ5LiAqLwoJb2xkY3h0ID0gTWVtb3J5Q29udGV4dFN3aXRjaFRvKGluZGV4UmVsYXRpb24t PnJkX2luZGV4Y3h0KTsKCWluZGV4UmVsYXRpb24tPnJkX2V4Y2xvcHMgPSBwYWxsb2NfYXJy YXkoT2lkLCBpbmRua2V5YXR0cyk7CglpbmRleFJlbGF0aW9uLT5yZF9leGNscHJvY3MgPSBw YWxsb2NfYXJyYXkoT2lkLCBpbmRua2V5YXR0cyk7CglpbmRleFJlbGF0aW9uLT5yZF9leGNs c3RyYXRzID0gcGFsbG9jX2FycmF5KHVpbnQxNiwgaW5kbmtleWF0dHMpOwoJbWVtY3B5KGlu ZGV4UmVsYXRpb24tPnJkX2V4Y2xvcHMsIG9wcywgc2l6ZW9mKE9pZCkgKiBpbmRua2V5YXR0 cyk7CgltZW1jcHkoaW5kZXhSZWxhdGlvbi0+cmRfZXhjbHByb2NzLCBmdW5jcywgc2l6ZW9m KE9pZCkgKiBpbmRua2V5YXR0cyk7CgltZW1jcHkoaW5kZXhSZWxhdGlvbi0+cmRfZXhjbHN0 cmF0cywgc3RyYXRzLCBzaXplb2YodWludDE2KSAqIGluZG5rZXlhdHRzKTsKCU1lbW9yeUNv bnRleHRTd2l0Y2hUbyhvbGRjeHQpOwp9CgovKgogKiBHZXQgdGhlIHB1YmxpY2F0aW9uIGlu Zm9ybWF0aW9uIGZvciB0aGUgZ2l2ZW4gcmVsYXRpb24uCiAqCiAqIFRyYXZlcnNlIGFsbCB0 aGUgcHVibGljYXRpb25zIHdoaWNoIHRoZSByZWxhdGlvbiBpcyBpbiB0byBnZXQgdGhlCiAq IHB1YmxpY2F0aW9uIGFjdGlvbnMgYW5kIHZhbGlkYXRlOgogKiAxLiBUaGUgcm93IGZpbHRl ciBleHByZXNzaW9ucyBmb3Igc3VjaCBwdWJsaWNhdGlvbnMgaWYgYW55LiBXZSBjb25zaWRl ciB0aGUKICogICAgcm93IGZpbHRlciBleHByZXNzaW9uIGFzIGludmFsaWQgaWYgaXQgcmVm ZXJlbmNlcyBhbnkgY29sdW1uIHdoaWNoIGlzIG5vdAogKiAgICBwYXJ0IG9mIFJFUExJQ0Eg SURFTlRJVFkuCiAqIDIuIFRoZSBjb2x1bW4gbGlzdCBmb3Igc3VjaCBwdWJsaWNhdGlvbiBp ZiBhbnkuIFdlIGNvbnNpZGVyIHRoZSBjb2x1bW4gbGlzdAogKiAJICBpbnZhbGlkIGlmIFJF UExJQ0EgSURFTlRJVFkgY29udGFpbnMgYW55IGNvbHVtbiB0aGF0IGlzIG5vdCBwYXJ0IG9m IGl0LgogKiAzLiBUaGUgZ2VuZXJhdGVkIGNvbHVtbnMgb2YgdGhlIHJlbGF0aW9uIGZvciBz dWNoIHB1YmxpY2F0aW9ucy4gV2UgY29uc2lkZXIKICogICAgYW55IHJlZmVyZW5jZSBvZiBh biB1bnB1Ymxpc2hlZCBnZW5lcmF0ZWQgY29sdW1uIGluIFJFUExJQ0EgSURFTlRJVFkgYXMK ICogICAgaW52YWxpZC4KICoKICogVG8gYXZvaWQgZmV0Y2hpbmcgdGhlIHB1YmxpY2F0aW9u IGluZm9ybWF0aW9uIHJlcGVhdGVkbHksIHdlIGNhY2hlIHRoZQogKiBwdWJsaWNhdGlvbiBh Y3Rpb25zLCByb3cgZmlsdGVyIHZhbGlkYXRpb24gaW5mb3JtYXRpb24sIGNvbHVtbiBsaXN0 CiAqIHZhbGlkYXRpb24gaW5mb3JtYXRpb24sIGFuZCBnZW5lcmF0ZWQgY29sdW1uIHZhbGlk YXRpb24gaW5mb3JtYXRpb24uCiAqLwp2b2lkClJlbGF0aW9uQnVpbGRQdWJsaWNhdGlvbkRl c2MoUmVsYXRpb24gcmVsYXRpb24sIFB1YmxpY2F0aW9uRGVzYyAqcHViZGVzYykKewoJTGlz dAkgICAqcHVib2lkcyA9IE5JTDsKCUxpc3QJICAgKmV4Y2VwdHB1Ym9pZHMgPSBOSUw7CglM aXN0CSAgICphbGx0YWJsZXNwdWJvaWRzOwoJTGlzdENlbGwgICAqbGM7CglNZW1vcnlDb250 ZXh0IG9sZGN4dDsKCU9pZAkJCXNjaGVtYWlkOwoJTGlzdAkgICAqYW5jZXN0b3JzID0gTklM OwoJT2lkCQkJcmVsaWQgPSBSZWxhdGlvbkdldFJlbGlkKHJlbGF0aW9uKTsKCgkvKgoJICog SWYgbm90IHB1Ymxpc2hhYmxlLCBpdCBwdWJsaXNoZXMgbm8gYWN0aW9ucy4gIChwZ291dHB1 dF9jaGFuZ2UoKSB3aWxsCgkgKiBpZ25vcmUgaXQuKQoJICovCglpZiAoIWlzX3B1Ymxpc2hh YmxlX3JlbGF0aW9uKHJlbGF0aW9uKSkKCXsKCQltZW1zZXQocHViZGVzYywgMCwgc2l6ZW9m KFB1YmxpY2F0aW9uRGVzYykpOwoJCXB1YmRlc2MtPnJmX3ZhbGlkX2Zvcl91cGRhdGUgPSB0 cnVlOwoJCXB1YmRlc2MtPnJmX3ZhbGlkX2Zvcl9kZWxldGUgPSB0cnVlOwoJCXB1YmRlc2Mt PmNvbHNfdmFsaWRfZm9yX3VwZGF0ZSA9IHRydWU7CgkJcHViZGVzYy0+Y29sc192YWxpZF9m b3JfZGVsZXRlID0gdHJ1ZTsKCQlwdWJkZXNjLT5nZW5jb2xzX3ZhbGlkX2Zvcl91cGRhdGUg PSB0cnVlOwoJCXB1YmRlc2MtPmdlbmNvbHNfdmFsaWRfZm9yX2RlbGV0ZSA9IHRydWU7CgkJ cmV0dXJuOwoJfQoKCWlmIChyZWxhdGlvbi0+cmRfcHViZGVzYykKCXsKCQltZW1jcHkocHVi ZGVzYywgcmVsYXRpb24tPnJkX3B1YmRlc2MsIHNpemVvZihQdWJsaWNhdGlvbkRlc2MpKTsK CQlyZXR1cm47Cgl9CgoJbWVtc2V0KHB1YmRlc2MsIDAsIHNpemVvZihQdWJsaWNhdGlvbkRl c2MpKTsKCXB1YmRlc2MtPnJmX3ZhbGlkX2Zvcl91cGRhdGUgPSB0cnVlOwoJcHViZGVzYy0+ cmZfdmFsaWRfZm9yX2RlbGV0ZSA9IHRydWU7CglwdWJkZXNjLT5jb2xzX3ZhbGlkX2Zvcl91 cGRhdGUgPSB0cnVlOwoJcHViZGVzYy0+Y29sc192YWxpZF9mb3JfZGVsZXRlID0gdHJ1ZTsK CXB1YmRlc2MtPmdlbmNvbHNfdmFsaWRfZm9yX3VwZGF0ZSA9IHRydWU7CglwdWJkZXNjLT5n ZW5jb2xzX3ZhbGlkX2Zvcl9kZWxldGUgPSB0cnVlOwoKCS8qIEZldGNoIHRoZSBwdWJsaWNh dGlvbiBtZW1iZXJzaGlwIGluZm8uICovCglwdWJvaWRzID0gR2V0UmVsYXRpb25JbmNsdWRl ZFB1YmxpY2F0aW9ucyhyZWxpZCk7CglzY2hlbWFpZCA9IFJlbGF0aW9uR2V0TmFtZXNwYWNl KHJlbGF0aW9uKTsKCXB1Ym9pZHMgPSBsaXN0X2NvbmNhdF91bmlxdWVfb2lkKHB1Ym9pZHMs IEdldFNjaGVtYVB1YmxpY2F0aW9ucyhzY2hlbWFpZCkpOwoKCWlmIChyZWxhdGlvbi0+cmRf cmVsLT5yZWxpc3BhcnRpdGlvbikKCXsKCQlPaWQJCQlsYXN0X2FuY2VzdG9yX3JlbGlkOwoK CQkvKiBBZGQgcHVibGljYXRpb25zIHRoYXQgdGhlIGFuY2VzdG9ycyBhcmUgaW4gdG9vLiAq LwoJCWFuY2VzdG9ycyA9IGdldF9wYXJ0aXRpb25fYW5jZXN0b3JzKHJlbGlkKTsKCQlsYXN0 X2FuY2VzdG9yX3JlbGlkID0gbGxhc3Rfb2lkKGFuY2VzdG9ycyk7CgoJCWZvcmVhY2gobGMs IGFuY2VzdG9ycykKCQl7CgkJCU9pZAkJCWFuY2VzdG9yID0gbGZpcnN0X29pZChsYyk7CgoJ CQlwdWJvaWRzID0gbGlzdF9jb25jYXRfdW5pcXVlX29pZChwdWJvaWRzLAoJCQkJCQkJCQkJ CSBHZXRSZWxhdGlvbkluY2x1ZGVkUHVibGljYXRpb25zKGFuY2VzdG9yKSk7CgkJCXNjaGVt YWlkID0gZ2V0X3JlbF9uYW1lc3BhY2UoYW5jZXN0b3IpOwoJCQlwdWJvaWRzID0gbGlzdF9j b25jYXRfdW5pcXVlX29pZChwdWJvaWRzLAoJCQkJCQkJCQkJCSBHZXRTY2hlbWFQdWJsaWNh dGlvbnMoc2NoZW1haWQpKTsKCQl9CgoJCS8qCgkJICogT25seSB0aGUgdG9wLW1vc3QgYW5j ZXN0b3IgY2FuIGFwcGVhciBpbiB0aGUgRVhDRVBUIGNsYXVzZS4KCQkgKiBUaGVyZWZvcmUs IGZvciBhIHBhcnRpdGlvbiwgZXhjbHVzaW9uIG11c3QgYmUgZXZhbHVhdGVkIGF0IHRoZQoJ CSAqIHRvcC1tb3N0IGFuY2VzdG9yLgoJCSAqLwoJCWV4Y2VwdHB1Ym9pZHMgPSBHZXRSZWxh dGlvbkV4Y2x1ZGVkUHVibGljYXRpb25zKGxhc3RfYW5jZXN0b3JfcmVsaWQpOwoJfQoJZWxz ZQoJewoJCS8qCgkJICogRm9yIGEgcmVndWxhciB0YWJsZSBvciBhIHJvb3QgcGFydGl0aW9u ZWQgdGFibGUsIGNoZWNrIGV4Y2x1c2lvbiBvbgoJCSAqIHRhYmxlIGl0c2VsZi4KCQkgKi8K CQlleGNlcHRwdWJvaWRzID0gR2V0UmVsYXRpb25FeGNsdWRlZFB1YmxpY2F0aW9ucyhyZWxp ZCk7Cgl9CgoJYWxsdGFibGVzcHVib2lkcyA9IEdldEFsbFRhYmxlc1B1YmxpY2F0aW9ucygp OwoJcHVib2lkcyA9IGxpc3RfY29uY2F0X3VuaXF1ZV9vaWQocHVib2lkcywKCQkJCQkJCQkJ IGxpc3RfZGlmZmVyZW5jZV9vaWQoYWxsdGFibGVzcHVib2lkcywKCQkJCQkJCQkJCQkJCQkg ZXhjZXB0cHVib2lkcykpOwoJZm9yZWFjaChsYywgcHVib2lkcykKCXsKCQlPaWQJCQlwdWJp ZCA9IGxmaXJzdF9vaWQobGMpOwoJCUhlYXBUdXBsZQl0dXA7CgkJRm9ybV9wZ19wdWJsaWNh dGlvbiBwdWJmb3JtOwoJCWJvb2wJCWludmFsaWRfY29sdW1uX2xpc3Q7CgkJYm9vbAkJaW52 YWxpZF9nZW5fY29sOwoKCQl0dXAgPSBTZWFyY2hTeXNDYWNoZTEoUFVCTElDQVRJT05PSUQs IE9iamVjdElkR2V0RGF0dW0ocHViaWQpKTsKCgkJaWYgKCFIZWFwVHVwbGVJc1ZhbGlkKHR1 cCkpCgkJCWVsb2coRVJST1IsICJjYWNoZSBsb29rdXAgZmFpbGVkIGZvciBwdWJsaWNhdGlv biAldSIsIHB1YmlkKTsKCgkJcHViZm9ybSA9IChGb3JtX3BnX3B1YmxpY2F0aW9uKSBHRVRT VFJVQ1QodHVwKTsKCgkJcHViZGVzYy0+cHViYWN0aW9ucy5wdWJpbnNlcnQgfD0gcHViZm9y bS0+cHViaW5zZXJ0OwoJCXB1YmRlc2MtPnB1YmFjdGlvbnMucHVidXBkYXRlIHw9IHB1YmZv cm0tPnB1YnVwZGF0ZTsKCQlwdWJkZXNjLT5wdWJhY3Rpb25zLnB1YmRlbGV0ZSB8PSBwdWJm b3JtLT5wdWJkZWxldGU7CgkJcHViZGVzYy0+cHViYWN0aW9ucy5wdWJ0cnVuY2F0ZSB8PSBw dWJmb3JtLT5wdWJ0cnVuY2F0ZTsKCgkJLyoKCQkgKiBDaGVjayBpZiBhbGwgY29sdW1ucyBy ZWZlcmVuY2VkIGluIHRoZSBmaWx0ZXIgZXhwcmVzc2lvbiBhcmUgcGFydAoJCSAqIG9mIHRo ZSBSRVBMSUNBIElERU5USVRZIGluZGV4IG9yIG5vdC4KCQkgKgoJCSAqIElmIHRoZSBwdWJs aWNhdGlvbiBpcyBGT1IgQUxMIFRBQkxFUyB0aGVuIGl0IG1lYW5zIHRoZSB0YWJsZSBoYXMg bm8KCQkgKiByb3cgZmlsdGVycyBhbmQgd2UgY2FuIHNraXAgdGhlIHZhbGlkYXRpb24uCgkJ ICovCgkJaWYgKCFwdWJmb3JtLT5wdWJhbGx0YWJsZXMgJiYKCQkJKHB1YmZvcm0tPnB1YnVw ZGF0ZSB8fCBwdWJmb3JtLT5wdWJkZWxldGUpICYmCgkJCXB1Yl9yZl9jb250YWluc19pbnZh bGlkX2NvbHVtbihwdWJpZCwgcmVsYXRpb24sIGFuY2VzdG9ycywKCQkJCQkJCQkJCSAgIHB1 YmZvcm0tPnB1YnZpYXJvb3QpKQoJCXsKCQkJaWYgKHB1YmZvcm0tPnB1YnVwZGF0ZSkKCQkJ CXB1YmRlc2MtPnJmX3ZhbGlkX2Zvcl91cGRhdGUgPSBmYWxzZTsKCQkJaWYgKHB1YmZvcm0t PnB1YmRlbGV0ZSkKCQkJCXB1YmRlc2MtPnJmX3ZhbGlkX2Zvcl9kZWxldGUgPSBmYWxzZTsK CQl9CgoJCS8qCgkJICogQ2hlY2sgaWYgYWxsIGNvbHVtbnMgYXJlIHBhcnQgb2YgdGhlIFJF UExJQ0EgSURFTlRJVFkgaW5kZXggb3Igbm90LgoJCSAqCgkJICogQ2hlY2sgaWYgYWxsIGdl bmVyYXRlZCBjb2x1bW5zIGluY2x1ZGVkIGluIHRoZSBSRVBMSUNBIElERU5USVRZIGFyZQoJ CSAqIHB1Ymxpc2hlZC4KCQkgKi8KCQlpZiAoKHB1YmZvcm0tPnB1YnVwZGF0ZSB8fCBwdWJm b3JtLT5wdWJkZWxldGUpICYmCgkJCXB1Yl9jb250YWluc19pbnZhbGlkX2NvbHVtbihwdWJp ZCwgcmVsYXRpb24sIGFuY2VzdG9ycywKCQkJCQkJCQkJCXB1YmZvcm0tPnB1YnZpYXJvb3Qs CgkJCQkJCQkJCQlwdWJmb3JtLT5wdWJnZW5jb2xzLAoJCQkJCQkJCQkJJmludmFsaWRfY29s dW1uX2xpc3QsCgkJCQkJCQkJCQkmaW52YWxpZF9nZW5fY29sKSkKCQl7CgkJCWlmIChwdWJm b3JtLT5wdWJ1cGRhdGUpCgkJCXsKCQkJCXB1YmRlc2MtPmNvbHNfdmFsaWRfZm9yX3VwZGF0 ZSA9ICFpbnZhbGlkX2NvbHVtbl9saXN0OwoJCQkJcHViZGVzYy0+Z2VuY29sc192YWxpZF9m b3JfdXBkYXRlID0gIWludmFsaWRfZ2VuX2NvbDsKCQkJfQoKCQkJaWYgKHB1YmZvcm0tPnB1 YmRlbGV0ZSkKCQkJewoJCQkJcHViZGVzYy0+Y29sc192YWxpZF9mb3JfZGVsZXRlID0gIWlu dmFsaWRfY29sdW1uX2xpc3Q7CgkJCQlwdWJkZXNjLT5nZW5jb2xzX3ZhbGlkX2Zvcl9kZWxl dGUgPSAhaW52YWxpZF9nZW5fY29sOwoJCQl9CgkJfQoKCQlSZWxlYXNlU3lzQ2FjaGUodHVw KTsKCgkJLyoKCQkgKiBJZiB3ZSBrbm93IGV2ZXJ5dGhpbmcgaXMgcmVwbGljYXRlZCBhbmQg dGhlIHJvdyBmaWx0ZXIgaXMgaW52YWxpZAoJCSAqIGZvciB1cGRhdGUgYW5kIGRlbGV0ZSwg dGhlcmUgaXMgbm8gcG9pbnQgdG8gY2hlY2sgZm9yIG90aGVyCgkJICogcHVibGljYXRpb25z LgoJCSAqLwoJCWlmIChwdWJkZXNjLT5wdWJhY3Rpb25zLnB1Ymluc2VydCAmJiBwdWJkZXNj LT5wdWJhY3Rpb25zLnB1YnVwZGF0ZSAmJgoJCQlwdWJkZXNjLT5wdWJhY3Rpb25zLnB1YmRl bGV0ZSAmJiBwdWJkZXNjLT5wdWJhY3Rpb25zLnB1YnRydW5jYXRlICYmCgkJCSFwdWJkZXNj LT5yZl92YWxpZF9mb3JfdXBkYXRlICYmICFwdWJkZXNjLT5yZl92YWxpZF9mb3JfZGVsZXRl KQoJCQlicmVhazsKCgkJLyoKCQkgKiBJZiB3ZSBrbm93IGV2ZXJ5dGhpbmcgaXMgcmVwbGlj YXRlZCBhbmQgdGhlIGNvbHVtbiBsaXN0IGlzIGludmFsaWQKCQkgKiBmb3IgdXBkYXRlIGFu ZCBkZWxldGUsIHRoZXJlIGlzIG5vIHBvaW50IHRvIGNoZWNrIGZvciBvdGhlcgoJCSAqIHB1 YmxpY2F0aW9ucy4KCQkgKi8KCQlpZiAocHViZGVzYy0+cHViYWN0aW9ucy5wdWJpbnNlcnQg JiYgcHViZGVzYy0+cHViYWN0aW9ucy5wdWJ1cGRhdGUgJiYKCQkJcHViZGVzYy0+cHViYWN0 aW9ucy5wdWJkZWxldGUgJiYgcHViZGVzYy0+cHViYWN0aW9ucy5wdWJ0cnVuY2F0ZSAmJgoJ CQkhcHViZGVzYy0+Y29sc192YWxpZF9mb3JfdXBkYXRlICYmICFwdWJkZXNjLT5jb2xzX3Zh bGlkX2Zvcl9kZWxldGUpCgkJCWJyZWFrOwoKCQkvKgoJCSAqIElmIHdlIGtub3cgZXZlcnl0 aGluZyBpcyByZXBsaWNhdGVkIGFuZCByZXBsaWNhIGlkZW50aXR5IGhhcyBhbgoJCSAqIHVu cHVibGlzaGVkIGdlbmVyYXRlZCBjb2x1bW4sIHRoZXJlIGlzIG5vIHBvaW50IHRvIGNoZWNr IGZvciBvdGhlcgoJCSAqIHB1YmxpY2F0aW9ucy4KCQkgKi8KCQlpZiAocHViZGVzYy0+cHVi YWN0aW9ucy5wdWJpbnNlcnQgJiYgcHViZGVzYy0+cHViYWN0aW9ucy5wdWJ1cGRhdGUgJiYK CQkJcHViZGVzYy0+cHViYWN0aW9ucy5wdWJkZWxldGUgJiYgcHViZGVzYy0+cHViYWN0aW9u cy5wdWJ0cnVuY2F0ZSAmJgoJCQkhcHViZGVzYy0+Z2VuY29sc192YWxpZF9mb3JfdXBkYXRl ICYmCgkJCSFwdWJkZXNjLT5nZW5jb2xzX3ZhbGlkX2Zvcl9kZWxldGUpCgkJCWJyZWFrOwoJ fQoKCWlmIChyZWxhdGlvbi0+cmRfcHViZGVzYykKCXsKCQlwZnJlZShyZWxhdGlvbi0+cmRf cHViZGVzYyk7CgkJcmVsYXRpb24tPnJkX3B1YmRlc2MgPSBOVUxMOwoJfQoKCS8qIE5vdyBz YXZlIGNvcHkgb2YgdGhlIGRlc2NyaXB0b3IgaW4gdGhlIHJlbGNhY2hlIGVudHJ5LiAqLwoJ b2xkY3h0ID0gTWVtb3J5Q29udGV4dFN3aXRjaFRvKENhY2hlTWVtb3J5Q29udGV4dCk7Cgly ZWxhdGlvbi0+cmRfcHViZGVzYyA9IHBhbGxvY19vYmplY3QoUHVibGljYXRpb25EZXNjKTsK CW1lbWNweShyZWxhdGlvbi0+cmRfcHViZGVzYywgcHViZGVzYywgc2l6ZW9mKFB1YmxpY2F0 aW9uRGVzYykpOwoJTWVtb3J5Q29udGV4dFN3aXRjaFRvKG9sZGN4dCk7Cn0KCnN0YXRpYyBi eXRlYSAqKgpDb3B5SW5kZXhBdHRPcHRpb25zKGJ5dGVhICoqc3Jjb3B0cywgaW50IG5hdHRz KQp7CglieXRlYQkgICoqb3B0cyA9IHBhbGxvY19hcnJheShieXRlYSAqLCBuYXR0cyk7CgoJ Zm9yIChpbnQgaSA9IDA7IGkgPCBuYXR0czsgaSsrKQoJewoJCWJ5dGVhCSAgICpvcHQgPSBz cmNvcHRzW2ldOwoKCQlvcHRzW2ldID0gIW9wdCA/IE5VTEwgOiAoYnl0ZWEgKikKCQkJRGF0 dW1HZXRQb2ludGVyKGRhdHVtQ29weShQb2ludGVyR2V0RGF0dW0ob3B0KSwgZmFsc2UsIC0x KSk7Cgl9CgoJcmV0dXJuIG9wdHM7Cn0KCi8qCiAqIFJlbGF0aW9uR2V0SW5kZXhBdHRPcHRp b25zCiAqCQlnZXQgQU0vb3BjbGFzcy1zcGVjaWZpYyBvcHRpb25zIGZvciBhbiBpbmRleCBw YXJzZWQgaW50byBhIGJpbmFyeSBmb3JtCiAqLwpieXRlYQkgICoqClJlbGF0aW9uR2V0SW5k ZXhBdHRPcHRpb25zKFJlbGF0aW9uIHJlbGF0aW9uLCBib29sIGNvcHkpCnsKCU1lbW9yeUNv bnRleHQgb2xkY3h0OwoJYnl0ZWEJICAqKm9wdHMgPSByZWxhdGlvbi0+cmRfb3Bjb3B0aW9u czsKCU9pZAkJCXJlbGlkID0gUmVsYXRpb25HZXRSZWxpZChyZWxhdGlvbik7CglpbnQJCQlu YXR0cyA9IFJlbGF0aW9uR2V0TnVtYmVyT2ZBdHRyaWJ1dGVzKHJlbGF0aW9uKTsJLyogWFhY CgkJCQkJCQkJCQkJCQkJCQkJICogSW5kZXhSZWxhdGlvbkdldE51bWJlck9mS2V5QXR0cmli dXRlcyAqLwoJaW50CQkJaTsKCgkvKiBUcnkgdG8gY29weSBjYWNoZWQgb3B0aW9ucy4gKi8K CWlmIChvcHRzKQoJCXJldHVybiBjb3B5ID8gQ29weUluZGV4QXR0T3B0aW9ucyhvcHRzLCBu YXR0cykgOiBvcHRzOwoKCS8qIEdldCBhbmQgcGFyc2Ugb3BjbGFzcyBvcHRpb25zLiAqLwoJ b3B0cyA9IHBhbGxvYzBfYXJyYXkoYnl0ZWEgKiwgbmF0dHMpOwoKCWZvciAoaSA9IDA7IGkg PCBuYXR0czsgaSsrKQoJewoJCWlmIChjcml0aWNhbFJlbGNhY2hlc0J1aWx0ICYmIHJlbGlk ICE9IEF0dHJpYnV0ZVJlbGlkTnVtSW5kZXhJZCkKCQl7CgkJCURhdHVtCQlhdHRvcHRpb25z ID0gZ2V0X2F0dG9wdGlvbnMocmVsaWQsIGkgKyAxKTsKCgkJCW9wdHNbaV0gPSBpbmRleF9v cGNsYXNzX29wdGlvbnMocmVsYXRpb24sIGkgKyAxLCBhdHRvcHRpb25zLCBmYWxzZSk7CgoJ CQlpZiAoYXR0b3B0aW9ucyAhPSAoRGF0dW0pIDApCgkJCQlwZnJlZShEYXR1bUdldFBvaW50 ZXIoYXR0b3B0aW9ucykpOwoJCX0KCX0KCgkvKiBDb3B5IHBhcnNlZCBvcHRpb25zIHRvIHRo ZSBjYWNoZS4gKi8KCW9sZGN4dCA9IE1lbW9yeUNvbnRleHRTd2l0Y2hUbyhyZWxhdGlvbi0+ cmRfaW5kZXhjeHQpOwoJcmVsYXRpb24tPnJkX29wY29wdGlvbnMgPSBDb3B5SW5kZXhBdHRP cHRpb25zKG9wdHMsIG5hdHRzKTsKCU1lbW9yeUNvbnRleHRTd2l0Y2hUbyhvbGRjeHQpOwoK CWlmIChjb3B5KQoJCXJldHVybiBvcHRzOwoKCWZvciAoaSA9IDA7IGkgPCBuYXR0czsgaSsr KQoJewoJCWlmIChvcHRzW2ldKQoJCQlwZnJlZShvcHRzW2ldKTsKCX0KCglwZnJlZShvcHRz KTsKCglyZXR1cm4gcmVsYXRpb24tPnJkX29wY29wdGlvbnM7Cn0KCi8qCiAqIFJvdXRpbmVz IHRvIHN1cHBvcnQgZXJlcG9ydCgpIHJlcG9ydHMgb2YgcmVsYXRpb24tcmVsYXRlZCBlcnJv cnMKICoKICogVGhlc2UgY291bGQgaGF2ZSBiZWVuIHB1dCBpbnRvIGVsb2cuYywgYnV0IGl0 IHNlZW1zIGxpa2UgYSBtb2R1bGUgbGF5ZXJpbmcKICogdmlvbGF0aW9uIHRvIGhhdmUgZWxv Zy5jIGNhbGxpbmcgcmVsY2FjaGUgb3Igc3lzY2FjaGUgc3R1ZmYgLS0tIGFuZCB3ZQogKiBk ZWZpbml0ZWx5IGRvbid0IHdhbnQgZWxvZy5oIGluY2x1ZGluZyByZWwuaC4gIFNvIHdlIHB1 dCB0aGVtIGhlcmUuCiAqLwoKLyoKICogZXJydGFibGUgLS0tIHN0b3JlcyBzY2hlbWFfbmFt ZSBhbmQgdGFibGVfbmFtZSBvZiBhIHRhYmxlCiAqIHdpdGhpbiB0aGUgY3VycmVudCBlcnJv cmRhdGEuCiAqLwppbnQKZXJydGFibGUoUmVsYXRpb24gcmVsKQp7CgllcnJfZ2VuZXJpY19z dHJpbmcoUEdfRElBR19TQ0hFTUFfTkFNRSwKCQkJCQkgICBnZXRfbmFtZXNwYWNlX25hbWUo UmVsYXRpb25HZXROYW1lc3BhY2UocmVsKSkpOwoJZXJyX2dlbmVyaWNfc3RyaW5nKFBHX0RJ QUdfVEFCTEVfTkFNRSwgUmVsYXRpb25HZXRSZWxhdGlvbk5hbWUocmVsKSk7CgoJcmV0dXJu IDA7CQkJCQkvKiByZXR1cm4gdmFsdWUgZG9lcyBub3QgbWF0dGVyICovCn0KCi8qCiAqIGVy cnRhYmxlY29sIC0tLSBzdG9yZXMgc2NoZW1hX25hbWUsIHRhYmxlX25hbWUgYW5kIGNvbHVt bl9uYW1lCiAqIG9mIGEgdGFibGUgY29sdW1uIHdpdGhpbiB0aGUgY3VycmVudCBlcnJvcmRh dGEuCiAqCiAqIFRoZSBjb2x1bW4gaXMgc3BlY2lmaWVkIGJ5IGF0dHJpYnV0ZSBudW1iZXIg LS0tIGZvciBtb3N0IGNhbGxlcnMsIHRoaXMgaXMKICogZWFzaWVyIGFuZCBsZXNzIGVycm9y LXByb25lIHRoYW4gZ2V0dGluZyB0aGUgY29sdW1uIG5hbWUgZm9yIHRoZW1zZWx2ZXMuCiAq LwppbnQKZXJydGFibGVjb2woUmVsYXRpb24gcmVsLCBpbnQgYXR0bnVtKQp7CglUdXBsZURl c2MJcmVsZGVzYyA9IFJlbGF0aW9uR2V0RGVzY3IocmVsKTsKCWNvbnN0IGNoYXIgKmNvbG5h bWU7CgoJLyogVXNlIHJlbGRlc2MgaWYgaXQncyBhIHVzZXIgYXR0cmlidXRlLCBlbHNlIGNv bnN1bHQgdGhlIGNhdGFsb2dzICovCglpZiAoYXR0bnVtID4gMCAmJiBhdHRudW0gPD0gcmVs ZGVzYy0+bmF0dHMpCgkJY29sbmFtZSA9IE5hbWVTdHIoVHVwbGVEZXNjQXR0cihyZWxkZXNj LCBhdHRudW0gLSAxKS0+YXR0bmFtZSk7CgllbHNlCgkJY29sbmFtZSA9IGdldF9hdHRuYW1l KFJlbGF0aW9uR2V0UmVsaWQocmVsKSwgYXR0bnVtLCBmYWxzZSk7CgoJcmV0dXJuIGVycnRh YmxlY29sbmFtZShyZWwsIGNvbG5hbWUpOwp9CgovKgogKiBlcnJ0YWJsZWNvbG5hbWUgLS0t IHN0b3JlcyBzY2hlbWFfbmFtZSwgdGFibGVfbmFtZSBhbmQgY29sdW1uX25hbWUKICogb2Yg YSB0YWJsZSBjb2x1bW4gd2l0aGluIHRoZSBjdXJyZW50IGVycm9yZGF0YSwgd2hlcmUgdGhl IGNvbHVtbiBuYW1lIGlzCiAqIGdpdmVuIGRpcmVjdGx5IHJhdGhlciB0aGFuIGV4dHJhY3Rl ZCBmcm9tIHRoZSByZWxhdGlvbidzIGNhdGFsb2cgZGF0YS4KICoKICogRG9uJ3QgdXNlIHRo aXMgZGlyZWN0bHkgdW5sZXNzIGVycnRhYmxlY29sKCkgaXMgaW5jb252ZW5pZW50IGZvciBz b21lCiAqIHJlYXNvbi4gIFRoaXMgbWlnaHQgcG9zc2libHkgYmUgbmVlZGVkIGR1cmluZyBp bnRlcm1lZGlhdGUgc3RhdGVzIGluIEFMVEVSCiAqIFRBQkxFLCBmb3IgaW5zdGFuY2UuCiAq LwppbnQKZXJydGFibGVjb2xuYW1lKFJlbGF0aW9uIHJlbCwgY29uc3QgY2hhciAqY29sbmFt ZSkKewoJZXJydGFibGUocmVsKTsKCWVycl9nZW5lcmljX3N0cmluZyhQR19ESUFHX0NPTFVN Tl9OQU1FLCBjb2xuYW1lKTsKCglyZXR1cm4gMDsJCQkJCS8qIHJldHVybiB2YWx1ZSBkb2Vz IG5vdCBtYXR0ZXIgKi8KfQoKLyoKICogZXJydGFibGVjb25zdHJhaW50IC0tLSBzdG9yZXMg c2NoZW1hX25hbWUsIHRhYmxlX25hbWUgYW5kIGNvbnN0cmFpbnRfbmFtZQogKiBvZiBhIHRh YmxlLXJlbGF0ZWQgY29uc3RyYWludCB3aXRoaW4gdGhlIGN1cnJlbnQgZXJyb3JkYXRhLgog Ki8KaW50CmVycnRhYmxlY29uc3RyYWludChSZWxhdGlvbiByZWwsIGNvbnN0IGNoYXIgKmNv bm5hbWUpCnsKCWVycnRhYmxlKHJlbCk7CgllcnJfZ2VuZXJpY19zdHJpbmcoUEdfRElBR19D T05TVFJBSU5UX05BTUUsIGNvbm5hbWUpOwoKCXJldHVybiAwOwkJCQkJLyogcmV0dXJuIHZh bHVlIGRvZXMgbm90IG1hdHRlciAqLwp9CgoKLyoKICoJbG9hZF9yZWxjYWNoZV9pbml0X2Zp bGUsIHdyaXRlX3JlbGNhY2hlX2luaXRfZmlsZQogKgogKgkJSW4gbGF0ZSAxOTkyLCB3ZSBz dGFydGVkIHJlZ3VsYXJseSBoYXZpbmcgZGF0YWJhc2VzIHdpdGggbW9yZSB0aGFuCiAqCQlh IHRob3VzYW5kIGNsYXNzZXMgaW4gdGhlbS4gIFdpdGggdGhpcyBudW1iZXIgb2YgY2xhc3Nl cywgaXQgYmVjYW1lCiAqCQljcml0aWNhbCB0byBkbyBpbmRleGVkIGxvb2t1cHMgb24gdGhl IHN5c3RlbSBjYXRhbG9ncy4KICoKICoJCUJvb3RzdHJhcHBpbmcgdGhlc2UgbG9va3VwcyBp cyB2ZXJ5IGhhcmQuICBXZSB3YW50IHRvIGJlIGFibGUgdG8KICoJCXVzZSBhbiBpbmRleCBv biBwZ19hdHRyaWJ1dGUsIGZvciBleGFtcGxlLCBidXQgaW4gb3JkZXIgdG8gZG8gc28sCiAq CQl3ZSBtdXN0IGhhdmUgcmVhZCBwZ19hdHRyaWJ1dGUgZm9yIHRoZSBhdHRyaWJ1dGVzIGlu IHRoZSBpbmRleCwKICoJCXdoaWNoIGltcGxpZXMgdGhhdCB3ZSBuZWVkIHRvIHVzZSB0aGUg aW5kZXguCiAqCiAqCQlJbiBvcmRlciB0byBnZXQgYXJvdW5kIHRoZSBwcm9ibGVtLCB3ZSBk byB0aGUgZm9sbG93aW5nOgogKgogKgkJICAgKyAgV2hlbiB0aGUgZGF0YWJhc2Ugc3lzdGVt IGlzIGluaXRpYWxpemVkIChhdCBpbml0ZGIgdGltZSksIHdlCiAqCQkJICBkb24ndCB1c2Ug aW5kZXhlcy4gIFdlIGRvIHNlcXVlbnRpYWwgc2NhbnMuCiAqCiAqCQkgICArICBXaGVuIHRo ZSBiYWNrZW5kIGlzIHN0YXJ0ZWQgdXAgaW4gbm9ybWFsIG1vZGUsIHdlIGxvYWQgYW4gaW1h Z2UKICoJCQkgIG9mIHRoZSBhcHByb3ByaWF0ZSByZWxhdGlvbiBkZXNjcmlwdG9ycywgaW4g aW50ZXJuYWwgZm9ybWF0LAogKgkJCSAgZnJvbSBhbiBpbml0aWFsaXphdGlvbiBmaWxlIGlu IHRoZSBkYXRhL2Jhc2UvLi4uIGRpcmVjdG9yeS4KICoKICoJCSAgICsgIElmIHRoZSBpbml0 aWFsaXphdGlvbiBmaWxlIGlzbid0IHRoZXJlLCB0aGVuIHdlIGNyZWF0ZSB0aGUKICoJCQkg IHJlbGF0aW9uIGRlc2NyaXB0b3JzIHVzaW5nIHNlcXVlbnRpYWwgc2NhbnMgYW5kIHdyaXRl ICdlbSB0bwogKgkJCSAgdGhlIGluaXRpYWxpemF0aW9uIGZpbGUgZm9yIHVzZSBieSBzdWJz ZXF1ZW50IGJhY2tlbmRzLgogKgogKgkJQXMgb2YgUG9zdGdyZXMgOS4wLCB0aGVyZSBpcyBv bmUgbG9jYWwgaW5pdGlhbGl6YXRpb24gZmlsZSBpbiBlYWNoCiAqCQlkYXRhYmFzZSwgcGx1 cyBvbmUgc2hhcmVkIGluaXRpYWxpemF0aW9uIGZpbGUgZm9yIHNoYXJlZCBjYXRhbG9ncy4K ICoKICoJCVdlIGNvdWxkIGRpc3BlbnNlIHdpdGggdGhlIGluaXRpYWxpemF0aW9uIGZpbGVz IGFuZCBqdXN0IGJ1aWxkIHRoZQogKgkJY3JpdGljYWwgcmVsZGVzY3MgdGhlIGhhcmQgd2F5 IG9uIGV2ZXJ5IGJhY2tlbmQgc3RhcnR1cCwgYnV0IHRoYXQKICoJCXNsb3dzIGRvd24gYmFj a2VuZCBzdGFydHVwIG5vdGljZWFibHkuCiAqCiAqCQlXZSBjYW4gaW4gZmFjdCBnbyBmdXJ0 aGVyLCBhbmQgc2F2ZSBtb3JlIHJlbGNhY2hlIGVudHJpZXMgdGhhbgogKgkJanVzdCB0aGUg b25lcyB0aGF0IGFyZSBhYnNvbHV0ZWx5IGNyaXRpY2FsOyB0aGlzIGFsbG93cyB1cyB0byBz cGVlZAogKgkJdXAgYmFja2VuZCBzdGFydHVwIGJ5IG5vdCBoYXZpbmcgdG8gYnVpbGQgc3Vj aCBlbnRyaWVzIHRoZSBoYXJkIHdheS4KICoJCVByZXNlbnRseSwgYWxsIHRoZSBjYXRhbG9n IGFuZCBpbmRleCBlbnRyaWVzIHRoYXQgYXJlIHJlZmVycmVkIHRvCiAqCQlieSBjYXRjYWNo ZXMgYXJlIHN0b3JlZCBpbiB0aGUgaW5pdGlhbGl6YXRpb24gZmlsZXMuCiAqCiAqCQlUaGUg c2FtZSBtZWNoYW5pc20gdGhhdCBkZXRlY3RzIHdoZW4gY2F0Y2FjaGUgYW5kIHJlbGNhY2hl IGVudHJpZXMKICoJCW5lZWQgdG8gYmUgaW52YWxpZGF0ZWQgKGR1ZSB0byBjYXRhbG9nIHVw ZGF0ZXMpIGFsc28gYXJyYW5nZXMgdG8KICoJCXVubGluayB0aGUgaW5pdGlhbGl6YXRpb24g ZmlsZXMgd2hlbiB0aGUgY29udGVudHMgbWF5IGJlIG91dCBvZiBkYXRlLgogKgkJVGhlIGZp bGVzIHdpbGwgdGhlbiBiZSByZWJ1aWx0IGR1cmluZyB0aGUgbmV4dCBiYWNrZW5kIHN0YXJ0 dXAuCiAqLwoKLyoKICogbG9hZF9yZWxjYWNoZV9pbml0X2ZpbGUgLS0gYXR0ZW1wdCB0byBs b2FkIGNhY2hlIGZyb20gdGhlIHNoYXJlZAogKiBvciBsb2NhbCBjYWNoZSBpbml0IGZpbGUK ICoKICogSWYgc3VjY2Vzc2Z1bCwgcmV0dXJuIHRydWUgYW5kIHNldCBjcml0aWNhbFJlbGNh Y2hlc0J1aWx0IG9yCiAqIGNyaXRpY2FsU2hhcmVkUmVsY2FjaGVzQnVpbHQgdG8gdHJ1ZS4K ICogSWYgbm90IHN1Y2Nlc3NmdWwsIHJldHVybiBmYWxzZS4KICoKICogTk9URTogd2UgYXNz dW1lIHdlIGFyZSBhbHJlYWR5IHN3aXRjaGVkIGludG8gQ2FjaGVNZW1vcnlDb250ZXh0Lgog Ki8Kc3RhdGljIGJvb2wKbG9hZF9yZWxjYWNoZV9pbml0X2ZpbGUoYm9vbCBzaGFyZWQpCnsK CUZJTEUJICAgKmZwOwoJY2hhcgkJaW5pdGZpbGVuYW1lW01BWFBHUEFUSF07CglSZWxhdGlv biAgICpyZWxzOwoJaW50CQkJcmVsbm8sCgkJCQludW1fcmVscywKCQkJCW1heF9yZWxzLAoJ CQkJbmFpbGVkX3JlbHMsCgkJCQluYWlsZWRfaW5kZXhlcywKCQkJCW1hZ2ljOwoJaW50CQkJ aTsKCglpZiAoc2hhcmVkKQoJCXNucHJpbnRmKGluaXRmaWxlbmFtZSwgc2l6ZW9mKGluaXRm aWxlbmFtZSksICJnbG9iYWwvJXMiLAoJCQkJIFJFTENBQ0hFX0lOSVRfRklMRU5BTUUpOwoJ ZWxzZQoJCXNucHJpbnRmKGluaXRmaWxlbmFtZSwgc2l6ZW9mKGluaXRmaWxlbmFtZSksICIl cy8lcyIsCgkJCQkgRGF0YWJhc2VQYXRoLCBSRUxDQUNIRV9JTklUX0ZJTEVOQU1FKTsKCglm cCA9IEFsbG9jYXRlRmlsZShpbml0ZmlsZW5hbWUsIFBHX0JJTkFSWV9SKTsKCWlmIChmcCA9 PSBOVUxMKQoJCXJldHVybiBmYWxzZTsKCgkvKgoJICogUmVhZCB0aGUgaW5kZXggcmVsY2Fj aGUgZW50cmllcyBmcm9tIHRoZSBmaWxlLiAgTm90ZSB3ZSB3aWxsIG5vdCBlbnRlcgoJICog YW55IG9mIHRoZW0gaW50byB0aGUgY2FjaGUgaWYgdGhlIHJlYWQgZmFpbHMgcGFydHdheSB0 aHJvdWdoOyB0aGlzCgkgKiBoZWxwcyB0byBndWFyZCBhZ2FpbnN0IGJyb2tlbiBpbml0IGZp bGVzLgoJICovCgltYXhfcmVscyA9IDEwMDsKCXJlbHMgPSAoUmVsYXRpb24gKikgcGFsbG9j KG1heF9yZWxzICogc2l6ZW9mKFJlbGF0aW9uKSk7CgludW1fcmVscyA9IDA7CgluYWlsZWRf cmVscyA9IG5haWxlZF9pbmRleGVzID0gMDsKCgkvKiBjaGVjayBmb3IgY29ycmVjdCBtYWdp YyBudW1iZXIgKGNvbXBhdGlibGUgdmVyc2lvbikgKi8KCWlmIChmcmVhZCgmbWFnaWMsIDEs IHNpemVvZihtYWdpYyksIGZwKSAhPSBzaXplb2YobWFnaWMpKQoJCWdvdG8gcmVhZF9mYWls ZWQ7CglpZiAobWFnaWMgIT0gUkVMQ0FDSEVfSU5JVF9GSUxFTUFHSUMpCgkJZ290byByZWFk X2ZhaWxlZDsKCglmb3IgKHJlbG5vID0gMDs7IHJlbG5vKyspCgl7CgkJU2l6ZQkJbGVuOwoJ CXNpemVfdAkJbnJlYWQ7CgkJUmVsYXRpb24JcmVsOwoJCUZvcm1fcGdfY2xhc3MgcmVsZm9y bTsKCQlib29sCQloYXNfbm90X251bGw7CgoJCS8qIGZpcnN0IHJlYWQgdGhlIHJlbGF0aW9u IGRlc2NyaXB0b3IgbGVuZ3RoICovCgkJbnJlYWQgPSBmcmVhZCgmbGVuLCAxLCBzaXplb2Yo bGVuKSwgZnApOwoJCWlmIChucmVhZCAhPSBzaXplb2YobGVuKSkKCQl7CgkJCWlmIChucmVh ZCA9PSAwKQoJCQkJYnJlYWs7CQkJLyogZW5kIG9mIGZpbGUgKi8KCQkJZ290byByZWFkX2Zh aWxlZDsKCQl9CgoJCS8qIHNhZmV0eSBjaGVjayBmb3IgaW5jb21wYXRpYmxlIHJlbGNhY2hl IGxheW91dCAqLwoJCWlmIChsZW4gIT0gc2l6ZW9mKFJlbGF0aW9uRGF0YSkpCgkJCWdvdG8g cmVhZF9mYWlsZWQ7CgoJCS8qIGFsbG9jYXRlIGFub3RoZXIgcmVsY2FjaGUgaGVhZGVyICov CgkJaWYgKG51bV9yZWxzID49IG1heF9yZWxzKQoJCXsKCQkJbWF4X3JlbHMgKj0gMjsKCQkJ cmVscyA9IChSZWxhdGlvbiAqKSByZXBhbGxvYyhyZWxzLCBtYXhfcmVscyAqIHNpemVvZihS ZWxhdGlvbikpOwoJCX0KCgkJcmVsID0gcmVsc1tudW1fcmVscysrXSA9IChSZWxhdGlvbikg cGFsbG9jKGxlbik7CgoJCS8qIHRoZW4sIHJlYWQgdGhlIFJlbGF0aW9uIHN0cnVjdHVyZSAq LwoJCWlmIChmcmVhZChyZWwsIDEsIGxlbiwgZnApICE9IGxlbikKCQkJZ290byByZWFkX2Zh aWxlZDsKCgkJLyogbmV4dCByZWFkIHRoZSByZWxhdGlvbiB0dXBsZSBmb3JtICovCgkJaWYg KGZyZWFkKCZsZW4sIDEsIHNpemVvZihsZW4pLCBmcCkgIT0gc2l6ZW9mKGxlbikpCgkJCWdv dG8gcmVhZF9mYWlsZWQ7CgoJCXJlbGZvcm0gPSAoRm9ybV9wZ19jbGFzcykgcGFsbG9jKGxl bik7CgkJaWYgKGZyZWFkKHJlbGZvcm0sIDEsIGxlbiwgZnApICE9IGxlbikKCQkJZ290byBy ZWFkX2ZhaWxlZDsKCgkJcmVsLT5yZF9yZWwgPSByZWxmb3JtOwoKCQkvKiBpbml0aWFsaXpl IGF0dHJpYnV0ZSB0dXBsZSBmb3JtcyAqLwoJCXJlbC0+cmRfYXR0ID0gQ3JlYXRlVGVtcGxh dGVUdXBsZURlc2MocmVsZm9ybS0+cmVsbmF0dHMpOwoJCXJlbC0+cmRfYXR0LT50ZHJlZmNv dW50ID0gMTsJLyogbWFyayBhcyByZWZjb3VudGVkICovCgoJCXJlbC0+cmRfYXR0LT50ZHR5 cGVpZCA9IHJlbGZvcm0tPnJlbHR5cGUgPyByZWxmb3JtLT5yZWx0eXBlIDogUkVDT1JET0lE OwoJCXJlbC0+cmRfYXR0LT50ZHR5cG1vZCA9IC0xOyAvKiBqdXN0IHRvIGJlIHN1cmUgKi8K CgkJLyogbmV4dCByZWFkIGFsbCB0aGUgYXR0cmlidXRlIHR1cGxlIGZvcm0gZGF0YSBlbnRy aWVzICovCgkJaGFzX25vdF9udWxsID0gZmFsc2U7CgkJZm9yIChpID0gMDsgaSA8IHJlbGZv cm0tPnJlbG5hdHRzOyBpKyspCgkJewoJCQlGb3JtX3BnX2F0dHJpYnV0ZSBhdHRyID0gVHVw bGVEZXNjQXR0cihyZWwtPnJkX2F0dCwgaSk7CgoJCQlpZiAoZnJlYWQoJmxlbiwgMSwgc2l6 ZW9mKGxlbiksIGZwKSAhPSBzaXplb2YobGVuKSkKCQkJCWdvdG8gcmVhZF9mYWlsZWQ7CgkJ CWlmIChsZW4gIT0gQVRUUklCVVRFX0ZJWEVEX1BBUlRfU0laRSkKCQkJCWdvdG8gcmVhZF9m YWlsZWQ7CgkJCWlmIChmcmVhZChhdHRyLCAxLCBsZW4sIGZwKSAhPSBsZW4pCgkJCQlnb3Rv IHJlYWRfZmFpbGVkOwoKCQkJaGFzX25vdF9udWxsIHw9IGF0dHItPmF0dG5vdG51bGw7CgoJ CQlwb3B1bGF0ZV9jb21wYWN0X2F0dHJpYnV0ZShyZWwtPnJkX2F0dCwgaSk7CgkJfQoKCQlU dXBsZURlc2NGaW5hbGl6ZShyZWwtPnJkX2F0dCk7CgoJCS8qIG5leHQgcmVhZCB0aGUgYWNj ZXNzIG1ldGhvZCBzcGVjaWZpYyBmaWVsZCAqLwoJCWlmIChmcmVhZCgmbGVuLCAxLCBzaXpl b2YobGVuKSwgZnApICE9IHNpemVvZihsZW4pKQoJCQlnb3RvIHJlYWRfZmFpbGVkOwoJCWlm IChsZW4gPiAwKQoJCXsKCQkJcmVsLT5yZF9vcHRpb25zID0gcGFsbG9jKGxlbik7CgkJCWlm IChmcmVhZChyZWwtPnJkX29wdGlvbnMsIDEsIGxlbiwgZnApICE9IGxlbikKCQkJCWdvdG8g cmVhZF9mYWlsZWQ7CgkJCWlmIChsZW4gIT0gVkFSU0laRShyZWwtPnJkX29wdGlvbnMpKQoJ CQkJZ290byByZWFkX2ZhaWxlZDsJLyogc2FuaXR5IGNoZWNrICovCgkJfQoJCWVsc2UKCQl7 CgkJCXJlbC0+cmRfb3B0aW9ucyA9IE5VTEw7CgkJfQoKCQkvKiBtYXJrIG5vdC1udWxsIHN0 YXR1cyAqLwoJCWlmIChoYXNfbm90X251bGwpCgkJewoJCQlUdXBsZUNvbnN0ciAqY29uc3Ry ID0gcGFsbG9jMF9vYmplY3QoVHVwbGVDb25zdHIpOwoKCQkJY29uc3RyLT5oYXNfbm90X251 bGwgPSB0cnVlOwoJCQlyZWwtPnJkX2F0dC0+Y29uc3RyID0gY29uc3RyOwoJCX0KCgkJLyoK CQkgKiBJZiBpdCdzIGFuIGluZGV4LCB0aGVyZSdzIG1vcmUgdG8gZG8uICBOb3RlIHdlIGV4 cGxpY2l0bHkgaWdub3JlCgkJICogcGFydGl0aW9uZWQgaW5kZXhlcyBoZXJlLgoJCSAqLwoJ CWlmIChyZWwtPnJkX3JlbC0+cmVsa2luZCA9PSBSRUxLSU5EX0lOREVYKQoJCXsKCQkJTWVt b3J5Q29udGV4dCBpbmRleGN4dDsKCQkJT2lkCQkgICAqb3BmYW1pbHk7CgkJCU9pZAkJICAg Km9wY2ludHlwZTsKCQkJUmVnUHJvY2VkdXJlICpzdXBwb3J0OwoJCQlpbnQJCQluc3VwcG9y dDsKCQkJaW50MTYJICAgKmluZG9wdGlvbjsKCQkJT2lkCQkgICAqaW5kY29sbGF0aW9uOwoK CQkJLyogQ291bnQgbmFpbGVkIGluZGV4ZXMgdG8gZW5zdXJlIHdlIGhhdmUgJ2VtIGFsbCAq LwoJCQlpZiAocmVsLT5yZF9pc25haWxlZCkKCQkJCW5haWxlZF9pbmRleGVzKys7CgoJCQkv KiByZWFkIHRoZSBwZ19pbmRleCB0dXBsZSAqLwoJCQlpZiAoZnJlYWQoJmxlbiwgMSwgc2l6 ZW9mKGxlbiksIGZwKSAhPSBzaXplb2YobGVuKSkKCQkJCWdvdG8gcmVhZF9mYWlsZWQ7CgoJ CQlyZWwtPnJkX2luZGV4dHVwbGUgPSAoSGVhcFR1cGxlKSBwYWxsb2MobGVuKTsKCQkJaWYg KGZyZWFkKHJlbC0+cmRfaW5kZXh0dXBsZSwgMSwgbGVuLCBmcCkgIT0gbGVuKQoJCQkJZ290 byByZWFkX2ZhaWxlZDsKCgkJCS8qIEZpeCB1cCBpbnRlcm5hbCBwb2ludGVycyBpbiB0aGUg dHVwbGUgLS0gc2VlIGhlYXBfY29weXR1cGxlICovCgkJCXJlbC0+cmRfaW5kZXh0dXBsZS0+ dF9kYXRhID0gKEhlYXBUdXBsZUhlYWRlcikgKChjaGFyICopIHJlbC0+cmRfaW5kZXh0dXBs ZSArIEhFQVBUVVBMRVNJWkUpOwoJCQlyZWwtPnJkX2luZGV4ID0gKEZvcm1fcGdfaW5kZXgp IEdFVFNUUlVDVChyZWwtPnJkX2luZGV4dHVwbGUpOwoKCQkJLyoKCQkJICogcHJlcGFyZSBp bmRleCBpbmZvIGNvbnRleHQgLS0tIHBhcmFtZXRlcnMgc2hvdWxkIG1hdGNoCgkJCSAqIFJl bGF0aW9uSW5pdEluZGV4QWNjZXNzSW5mbwoJCQkgKi8KCQkJaW5kZXhjeHQgPSBBbGxvY1Nl dENvbnRleHRDcmVhdGUoQ2FjaGVNZW1vcnlDb250ZXh0LAoJCQkJCQkJCQkJCSAiaW5kZXgg aW5mbyIsCgkJCQkJCQkJCQkJIEFMTE9DU0VUX1NNQUxMX1NJWkVTKTsKCQkJcmVsLT5yZF9p bmRleGN4dCA9IGluZGV4Y3h0OwoJCQlNZW1vcnlDb250ZXh0Q29weUFuZFNldElkZW50aWZp ZXIoaW5kZXhjeHQsCgkJCQkJCQkJCQkJICBSZWxhdGlvbkdldFJlbGF0aW9uTmFtZShyZWwp KTsKCgkJCS8qCgkJCSAqIE5vdyB3ZSBjYW4gZmV0Y2ggdGhlIGluZGV4IEFNJ3MgQVBJIHN0 cnVjdC4gIChXZSBjYW4ndCBzdG9yZQoJCQkgKiB0aGF0IGluIHRoZSBpbml0IGZpbGUsIHNp bmNlIGl0IGNvbnRhaW5zIGZ1bmN0aW9uIHBvaW50ZXJzIHRoYXQKCQkJICogbWlnaHQgdmFy eSBhY3Jvc3Mgc2VydmVyIGV4ZWN1dGlvbnMuICBGb3J0dW5hdGVseSwgaXQgc2hvdWxkIGJl CgkJCSAqIHNhZmUgdG8gY2FsbCB0aGUgYW1oYW5kbGVyIGV2ZW4gd2hpbGUgYm9vdHN0cmFw cGluZyBpbmRleGVzLikKCQkJICovCgkJCUluaXRJbmRleEFtUm91dGluZShyZWwpOwoKCQkJ LyogcmVhZCB0aGUgdmVjdG9yIG9mIG9wZmFtaWx5IE9JRHMgKi8KCQkJaWYgKGZyZWFkKCZs ZW4sIDEsIHNpemVvZihsZW4pLCBmcCkgIT0gc2l6ZW9mKGxlbikpCgkJCQlnb3RvIHJlYWRf ZmFpbGVkOwoKCQkJb3BmYW1pbHkgPSAoT2lkICopIE1lbW9yeUNvbnRleHRBbGxvYyhpbmRl eGN4dCwgbGVuKTsKCQkJaWYgKGZyZWFkKG9wZmFtaWx5LCAxLCBsZW4sIGZwKSAhPSBsZW4p CgkJCQlnb3RvIHJlYWRfZmFpbGVkOwoKCQkJcmVsLT5yZF9vcGZhbWlseSA9IG9wZmFtaWx5 OwoKCQkJLyogcmVhZCB0aGUgdmVjdG9yIG9mIG9wY2ludHlwZSBPSURzICovCgkJCWlmIChm cmVhZCgmbGVuLCAxLCBzaXplb2YobGVuKSwgZnApICE9IHNpemVvZihsZW4pKQoJCQkJZ290 byByZWFkX2ZhaWxlZDsKCgkJCW9wY2ludHlwZSA9IChPaWQgKikgTWVtb3J5Q29udGV4dEFs bG9jKGluZGV4Y3h0LCBsZW4pOwoJCQlpZiAoZnJlYWQob3BjaW50eXBlLCAxLCBsZW4sIGZw KSAhPSBsZW4pCgkJCQlnb3RvIHJlYWRfZmFpbGVkOwoKCQkJcmVsLT5yZF9vcGNpbnR5cGUg PSBvcGNpbnR5cGU7CgoJCQkvKiByZWFkIHRoZSB2ZWN0b3Igb2Ygc3VwcG9ydCBwcm9jZWR1 cmUgT0lEcyAqLwoJCQlpZiAoZnJlYWQoJmxlbiwgMSwgc2l6ZW9mKGxlbiksIGZwKSAhPSBz aXplb2YobGVuKSkKCQkJCWdvdG8gcmVhZF9mYWlsZWQ7CgkJCXN1cHBvcnQgPSAoUmVnUHJv Y2VkdXJlICopIE1lbW9yeUNvbnRleHRBbGxvYyhpbmRleGN4dCwgbGVuKTsKCQkJaWYgKGZy ZWFkKHN1cHBvcnQsIDEsIGxlbiwgZnApICE9IGxlbikKCQkJCWdvdG8gcmVhZF9mYWlsZWQ7 CgoJCQlyZWwtPnJkX3N1cHBvcnQgPSBzdXBwb3J0OwoKCQkJLyogcmVhZCB0aGUgdmVjdG9y IG9mIGNvbGxhdGlvbiBPSURzICovCgkJCWlmIChmcmVhZCgmbGVuLCAxLCBzaXplb2YobGVu KSwgZnApICE9IHNpemVvZihsZW4pKQoJCQkJZ290byByZWFkX2ZhaWxlZDsKCgkJCWluZGNv bGxhdGlvbiA9IChPaWQgKikgTWVtb3J5Q29udGV4dEFsbG9jKGluZGV4Y3h0LCBsZW4pOwoJ CQlpZiAoZnJlYWQoaW5kY29sbGF0aW9uLCAxLCBsZW4sIGZwKSAhPSBsZW4pCgkJCQlnb3Rv IHJlYWRfZmFpbGVkOwoKCQkJcmVsLT5yZF9pbmRjb2xsYXRpb24gPSBpbmRjb2xsYXRpb247 CgoJCQkvKiByZWFkIHRoZSB2ZWN0b3Igb2YgaW5kb3B0aW9uIHZhbHVlcyAqLwoJCQlpZiAo ZnJlYWQoJmxlbiwgMSwgc2l6ZW9mKGxlbiksIGZwKSAhPSBzaXplb2YobGVuKSkKCQkJCWdv dG8gcmVhZF9mYWlsZWQ7CgoJCQlpbmRvcHRpb24gPSAoaW50MTYgKikgTWVtb3J5Q29udGV4 dEFsbG9jKGluZGV4Y3h0LCBsZW4pOwoJCQlpZiAoZnJlYWQoaW5kb3B0aW9uLCAxLCBsZW4s IGZwKSAhPSBsZW4pCgkJCQlnb3RvIHJlYWRfZmFpbGVkOwoKCQkJcmVsLT5yZF9pbmRvcHRp b24gPSBpbmRvcHRpb247CgoJCQkvKiByZWFkIHRoZSB2ZWN0b3Igb2Ygb3Bjb3B0aW9ucyB2 YWx1ZXMgKi8KCQkJcmVsLT5yZF9vcGNvcHRpb25zID0gKGJ5dGVhICoqKQoJCQkJTWVtb3J5 Q29udGV4dEFsbG9jWmVybyhpbmRleGN4dCwgc2l6ZW9mKCpyZWwtPnJkX29wY29wdGlvbnMp ICogcmVsZm9ybS0+cmVsbmF0dHMpOwoKCQkJZm9yIChpID0gMDsgaSA8IHJlbGZvcm0tPnJl bG5hdHRzOyBpKyspCgkJCXsKCQkJCWlmIChmcmVhZCgmbGVuLCAxLCBzaXplb2YobGVuKSwg ZnApICE9IHNpemVvZihsZW4pKQoJCQkJCWdvdG8gcmVhZF9mYWlsZWQ7CgoJCQkJaWYgKGxl biA+IDApCgkJCQl7CgkJCQkJcmVsLT5yZF9vcGNvcHRpb25zW2ldID0gKGJ5dGVhICopIE1l bW9yeUNvbnRleHRBbGxvYyhpbmRleGN4dCwgbGVuKTsKCQkJCQlpZiAoZnJlYWQocmVsLT5y ZF9vcGNvcHRpb25zW2ldLCAxLCBsZW4sIGZwKSAhPSBsZW4pCgkJCQkJCWdvdG8gcmVhZF9m YWlsZWQ7CgkJCQl9CgkJCX0KCgkJCS8qIHNldCB1cCB6ZXJvZWQgZm1nci1pbmZvIHZlY3Rv ciAqLwoJCQluc3VwcG9ydCA9IHJlbGZvcm0tPnJlbG5hdHRzICogcmVsLT5yZF9pbmRhbS0+ YW1zdXBwb3J0OwoJCQlyZWwtPnJkX3N1cHBvcnRpbmZvID0gKEZtZ3JJbmZvICopCgkJCQlN ZW1vcnlDb250ZXh0QWxsb2NaZXJvKGluZGV4Y3h0LCBuc3VwcG9ydCAqIHNpemVvZihGbWdy SW5mbykpOwoJCX0KCQllbHNlCgkJewoJCQkvKiBDb3VudCBuYWlsZWQgcmVscyB0byBlbnN1 cmUgd2UgaGF2ZSAnZW0gYWxsICovCgkJCWlmIChyZWwtPnJkX2lzbmFpbGVkKQoJCQkJbmFp bGVkX3JlbHMrKzsKCgkJCS8qIExvYWQgdGFibGUgQU0gZGF0YSAqLwoJCQlpZiAoUkVMS0lO RF9IQVNfVEFCTEVfQU0ocmVsLT5yZF9yZWwtPnJlbGtpbmQpIHx8IHJlbC0+cmRfcmVsLT5y ZWxraW5kID09IFJFTEtJTkRfU0VRVUVOQ0UpCgkJCQlSZWxhdGlvbkluaXRUYWJsZUFjY2Vz c01ldGhvZChyZWwpOwoKCQkJQXNzZXJ0KHJlbC0+cmRfaW5kZXggPT0gTlVMTCk7CgkJCUFz c2VydChyZWwtPnJkX2luZGV4dHVwbGUgPT0gTlVMTCk7CgkJCUFzc2VydChyZWwtPnJkX2lu ZGV4Y3h0ID09IE5VTEwpOwoJCQlBc3NlcnQocmVsLT5yZF9pbmRhbSA9PSBOVUxMKTsKCQkJ QXNzZXJ0KHJlbC0+cmRfb3BmYW1pbHkgPT0gTlVMTCk7CgkJCUFzc2VydChyZWwtPnJkX29w Y2ludHlwZSA9PSBOVUxMKTsKCQkJQXNzZXJ0KHJlbC0+cmRfc3VwcG9ydCA9PSBOVUxMKTsK CQkJQXNzZXJ0KHJlbC0+cmRfc3VwcG9ydGluZm8gPT0gTlVMTCk7CgkJCUFzc2VydChyZWwt PnJkX2luZG9wdGlvbiA9PSBOVUxMKTsKCQkJQXNzZXJ0KHJlbC0+cmRfaW5kY29sbGF0aW9u ID09IE5VTEwpOwoJCQlBc3NlcnQocmVsLT5yZF9vcGNvcHRpb25zID09IE5VTEwpOwoJCX0K CgkJLyoKCQkgKiBSdWxlcyBhbmQgdHJpZ2dlcnMgYXJlIG5vdCBzYXZlZCAobWFpbmx5IGJl Y2F1c2UgdGhlIGludGVybmFsCgkJICogZm9ybWF0IGlzIGNvbXBsZXggYW5kIHN1YmplY3Qg dG8gY2hhbmdlKS4gIFRoZXkgbXVzdCBiZSByZWJ1aWx0IGlmCgkJICogbmVlZGVkIGJ5IFJl bGF0aW9uQ2FjaGVJbml0aWFsaXplUGhhc2UzLiAgVGhpcyBpcyBub3QgZXhwZWN0ZWQgdG8K CQkgKiBiZSBhIGJpZyBwZXJmb3JtYW5jZSBoaXQgc2luY2UgZmV3IHN5c3RlbSBjYXRhbG9n cyBoYXZlIHN1Y2guIERpdHRvCgkJICogZm9yIFJMUyBwb2xpY3kgZGF0YSwgcGFydGl0aW9u IGluZm8sIGluZGV4IGV4cHJlc3Npb25zLCBwcmVkaWNhdGVzLAoJCSAqIGV4Y2x1c2lvbiBp bmZvLCBhbmQgRkRXIGluZm8uCgkJICovCgkJcmVsLT5yZF9ydWxlcyA9IE5VTEw7CgkJcmVs LT5yZF9ydWxlc2N4dCA9IE5VTEw7CgkJcmVsLT50cmlnZGVzYyA9IE5VTEw7CgkJcmVsLT5y ZF9yc2Rlc2MgPSBOVUxMOwoJCXJlbC0+cmRfcGFydGtleSA9IE5VTEw7CgkJcmVsLT5yZF9w YXJ0a2V5Y3h0ID0gTlVMTDsKCQlyZWwtPnJkX3BhcnRkZXNjID0gTlVMTDsKCQlyZWwtPnJk X3BhcnRkZXNjX25vZGV0YWNoZWQgPSBOVUxMOwoJCXJlbC0+cmRfcGFydGRlc2Nfbm9kZXRh Y2hlZF94bWluID0gSW52YWxpZFRyYW5zYWN0aW9uSWQ7CgkJcmVsLT5yZF9wZGN4dCA9IE5V TEw7CgkJcmVsLT5yZF9wZGRjeHQgPSBOVUxMOwoJCXJlbC0+cmRfcGFydGNoZWNrID0gTklM OwoJCXJlbC0+cmRfcGFydGNoZWNrdmFsaWQgPSBmYWxzZTsKCQlyZWwtPnJkX3BhcnRjaGVj a2N4dCA9IE5VTEw7CgkJcmVsLT5yZF9pbmRleHBycyA9IE5JTDsKCQlyZWwtPnJkX2luZGV4 cHJzRXhwYW5kID0gTklMOwoJCXJlbC0+cmRfaW5kcHJlZCA9IE5JTDsKCQlyZWwtPnJkX2lu ZHByZWRFeHBhbmQgPSBOSUw7CgkJcmVsLT5yZF9leGNsb3BzID0gTlVMTDsKCQlyZWwtPnJk X2V4Y2xwcm9jcyA9IE5VTEw7CgkJcmVsLT5yZF9leGNsc3RyYXRzID0gTlVMTDsKCQlyZWwt PnJkX2Zkd3JvdXRpbmUgPSBOVUxMOwoKCQkvKgoJCSAqIFJlc2V0IHRyYW5zaWVudC1zdGF0 ZSBmaWVsZHMgaW4gdGhlIHJlbGNhY2hlIGVudHJ5CgkJICovCgkJcmVsLT5yZF9zbWdyID0g TlVMTDsKCQlpZiAocmVsLT5yZF9pc25haWxlZCkKCQkJcmVsLT5yZF9yZWZjbnQgPSAxOwoJ CWVsc2UKCQkJcmVsLT5yZF9yZWZjbnQgPSAwOwoJCXJlbC0+cmRfaW5kZXh2YWxpZCA9IGZh bHNlOwoJCXJlbC0+cmRfaW5kZXhsaXN0ID0gTklMOwoJCXJlbC0+cmRfcGtpbmRleCA9IElu dmFsaWRPaWQ7CgkJcmVsLT5yZF9yZXBsaWRpbmRleCA9IEludmFsaWRPaWQ7CgkJcmVsLT5y ZF9hdHRyc3ZhbGlkID0gZmFsc2U7CgkJcmVsLT5yZF9rZXlhdHRyID0gTlVMTDsKCQlyZWwt PnJkX3BrYXR0ciA9IE5VTEw7CgkJcmVsLT5yZF9pZGF0dHIgPSBOVUxMOwoJCXJlbC0+cmRf cHViZGVzYyA9IE5VTEw7CgkJcmVsLT5yZF9zdGF0dmFsaWQgPSBmYWxzZTsKCQlyZWwtPnJk X3N0YXRsaXN0ID0gTklMOwoJCXJlbC0+cmRfZmtleXZhbGlkID0gZmFsc2U7CgkJcmVsLT5y ZF9ma2V5bGlzdCA9IE5JTDsKCQlyZWwtPnJkX2NyZWF0ZVN1YmlkID0gSW52YWxpZFN1YlRy YW5zYWN0aW9uSWQ7CgkJcmVsLT5yZF9uZXdSZWxmaWxlbG9jYXRvclN1YmlkID0gSW52YWxp ZFN1YlRyYW5zYWN0aW9uSWQ7CgkJcmVsLT5yZF9maXJzdFJlbGZpbGVsb2NhdG9yU3ViaWQg PSBJbnZhbGlkU3ViVHJhbnNhY3Rpb25JZDsKCQlyZWwtPnJkX2Ryb3BwZWRTdWJpZCA9IElu dmFsaWRTdWJUcmFuc2FjdGlvbklkOwoJCXJlbC0+cmRfYW1jYWNoZSA9IE5VTEw7CgkJcmVs LT5wZ3N0YXRfaW5mbyA9IE5VTEw7CgoJCS8qCgkJICogUmVjb21wdXRlIGxvY2sgYW5kIHBo eXNpY2FsIGFkZHJlc3NpbmcgaW5mby4gIFRoaXMgaXMgbmVlZGVkIGluCgkJICogY2FzZSB0 aGUgcGdfaW50ZXJuYWwuaW5pdCBmaWxlIHdhcyBjb3BpZWQgZnJvbSBzb21lIG90aGVyIGRh dGFiYXNlCgkJICogYnkgQ1JFQVRFIERBVEFCQVNFLgoJCSAqLwoJCVJlbGF0aW9uSW5pdExv Y2tJbmZvKHJlbCk7CgkJUmVsYXRpb25Jbml0UGh5c2ljYWxBZGRyKHJlbCk7Cgl9CgoJLyoK CSAqIFdlIHJlYWNoZWQgdGhlIGVuZCBvZiB0aGUgaW5pdCBmaWxlIHdpdGhvdXQgYXBwYXJl bnQgcHJvYmxlbS4gIERpZCB3ZQoJICogZ2V0IHRoZSByaWdodCBudW1iZXIgb2YgbmFpbGVk IGl0ZW1zPyAgVGhpcyBpcyBhIHVzZWZ1bCBjcm9zc2NoZWNrIGluCgkgKiBjYXNlIHRoZSBz ZXQgb2YgY3JpdGljYWwgcmVscyBvciBpbmRleGVzIGNoYW5nZXMuICBIb3dldmVyLCB0aGF0 IHNob3VsZAoJICogbm90IGhhcHBlbiBpbiBhIG5vcm1hbGx5LXJ1bm5pbmcgc3lzdGVtLCBz byBsZXQncyBibGVhdCBpZiBpdCBkb2VzLgoJICoKCSAqIEZvciB0aGUgc2hhcmVkIGluaXQg ZmlsZSwgd2UncmUgY2FsbGVkIGJlZm9yZSBjbGllbnQgYXV0aGVudGljYXRpb24gaXMKCSAq IGRvbmUsIHdoaWNoIG1lYW5zIHRoYXQgZWxvZyhXQVJOSU5HKSB3aWxsIGdvIG9ubHkgdG8g dGhlIHBvc3RtYXN0ZXIKCSAqIGxvZywgd2hlcmUgaXQncyBlYXNpbHkgbWlzc2VkLiAgVG8g ZW5zdXJlIHRoYXQgZGV2ZWxvcGVycyBub3RpY2UgYmFkCgkgKiB2YWx1ZXMgb2YgTlVNX0NS SVRJQ0FMX1NIQVJFRF9SRUxTL05VTV9DUklUSUNBTF9TSEFSRURfSU5ERVhFUywgd2UgcHV0 CgkgKiBhbiBBc3NlcnQoZmFsc2UpIHRoZXJlLgoJICovCglpZiAoc2hhcmVkKQoJewoJCWlm IChuYWlsZWRfcmVscyAhPSBOVU1fQ1JJVElDQUxfU0hBUkVEX1JFTFMgfHwKCQkJbmFpbGVk X2luZGV4ZXMgIT0gTlVNX0NSSVRJQ0FMX1NIQVJFRF9JTkRFWEVTKQoJCXsKCQkJZWxvZyhX QVJOSU5HLCAiZm91bmQgJWQgbmFpbGVkIHNoYXJlZCByZWxzIGFuZCAlZCBuYWlsZWQgc2hh cmVkIGluZGV4ZXMgaW4gaW5pdCBmaWxlLCBidXQgZXhwZWN0ZWQgJWQgYW5kICVkIHJlc3Bl Y3RpdmVseSIsCgkJCQkgbmFpbGVkX3JlbHMsIG5haWxlZF9pbmRleGVzLAoJCQkJIE5VTV9D UklUSUNBTF9TSEFSRURfUkVMUywgTlVNX0NSSVRJQ0FMX1NIQVJFRF9JTkRFWEVTKTsKCQkJ LyogTWFrZSBzdXJlIHdlIGdldCBkZXZlbG9wZXJzJyBhdHRlbnRpb24gYWJvdXQgdGhpcyAq LwoJCQlBc3NlcnQoZmFsc2UpOwoJCQkvKiBJbiBwcm9kdWN0aW9uIGJ1aWxkcywgcmVjb3Zl ciBieSBib290c3RyYXBwaW5nIHRoZSByZWxjYWNoZSAqLwoJCQlnb3RvIHJlYWRfZmFpbGVk OwoJCX0KCX0KCWVsc2UKCXsKCQlpZiAobmFpbGVkX3JlbHMgIT0gTlVNX0NSSVRJQ0FMX0xP Q0FMX1JFTFMgfHwKCQkJbmFpbGVkX2luZGV4ZXMgIT0gTlVNX0NSSVRJQ0FMX0xPQ0FMX0lO REVYRVMpCgkJewoJCQllbG9nKFdBUk5JTkcsICJmb3VuZCAlZCBuYWlsZWQgcmVscyBhbmQg JWQgbmFpbGVkIGluZGV4ZXMgaW4gaW5pdCBmaWxlLCBidXQgZXhwZWN0ZWQgJWQgYW5kICVk IHJlc3BlY3RpdmVseSIsCgkJCQkgbmFpbGVkX3JlbHMsIG5haWxlZF9pbmRleGVzLAoJCQkJ IE5VTV9DUklUSUNBTF9MT0NBTF9SRUxTLCBOVU1fQ1JJVElDQUxfTE9DQUxfSU5ERVhFUyk7 CgkJCS8qIFdlIGRvbid0IG5lZWQgYW4gQXNzZXJ0KCkgaW4gdGhpcyBjYXNlICovCgkJCWdv dG8gcmVhZF9mYWlsZWQ7CgkJfQoJfQoKCS8qCgkgKiBPSywgYWxsIGFwcGVhcnMgd2VsbC4K CSAqCgkgKiBOb3cgaW5zZXJ0IGFsbCB0aGUgbmV3IHJlbGNhY2hlIGVudHJpZXMgaW50byB0 aGUgY2FjaGUuCgkgKi8KCWZvciAocmVsbm8gPSAwOyByZWxubyA8IG51bV9yZWxzOyByZWxu bysrKQoJewoJCVJlbGF0aW9uQ2FjaGVJbnNlcnQocmVsc1tyZWxub10sIGZhbHNlKTsKCX0K CglwZnJlZShyZWxzKTsKCUZyZWVGaWxlKGZwKTsKCglpZiAoc2hhcmVkKQoJCWNyaXRpY2Fs U2hhcmVkUmVsY2FjaGVzQnVpbHQgPSB0cnVlOwoJZWxzZQoJCWNyaXRpY2FsUmVsY2FjaGVz QnVpbHQgPSB0cnVlOwoJcmV0dXJuIHRydWU7CgoJLyoKCSAqIGluaXQgZmlsZSBpcyBicm9r ZW4sIHNvIGRvIGl0IHRoZSBoYXJkIHdheS4gIFdlIGRvbid0IGJvdGhlciB0cnlpbmcgdG8K CSAqIGZyZWUgdGhlIGNsdXR0ZXIgd2UganVzdCBhbGxvY2F0ZWQ7IGl0J3Mgbm90IGluIHRo ZSByZWxjYWNoZSBzbyBpdAoJICogd29uJ3QgaHVydC4KCSAqLwpyZWFkX2ZhaWxlZDoKCXBm cmVlKHJlbHMpOwoJRnJlZUZpbGUoZnApOwoKCXJldHVybiBmYWxzZTsKfQoKLyoKICogV3Jp dGUgb3V0IGEgbmV3IGluaXRpYWxpemF0aW9uIGZpbGUgd2l0aCB0aGUgY3VycmVudCBjb250 ZW50cwogKiBvZiB0aGUgcmVsY2FjaGUgKGVpdGhlciBzaGFyZWQgcmVscyBvciBsb2NhbCBy ZWxzLCBhcyBpbmRpY2F0ZWQpLgogKi8Kc3RhdGljIHZvaWQKd3JpdGVfcmVsY2FjaGVfaW5p dF9maWxlKGJvb2wgc2hhcmVkKQp7CglGSUxFCSAgICpmcDsKCWNoYXIJCXRlbXBmaWxlbmFt ZVtNQVhQR1BBVEhdOwoJY2hhcgkJZmluYWxmaWxlbmFtZVtNQVhQR1BBVEhdOwoJaW50CQkJ bWFnaWM7CglIQVNIX1NFUV9TVEFUVVMgc3RhdHVzOwoJUmVsSWRDYWNoZUVudCAqaWRoZW50 cnk7CglpbnQJCQlpOwoKCS8qCgkgKiBJZiB3ZSBoYXZlIGFscmVhZHkgcmVjZWl2ZWQgYW55 IHJlbGNhY2hlIGludmFsIGV2ZW50cywgdGhlcmUncyBubwoJICogY2hhbmNlIG9mIHN1Y2Nl ZWRpbmcgc28gd2UgbWF5IGFzIHdlbGwgc2tpcCB0aGUgd2hvbGUgdGhpbmcuCgkgKi8KCWlm IChyZWxjYWNoZUludmFsc1JlY2VpdmVkICE9IDBMKQoJCXJldHVybjsKCgkvKgoJICogV2Ug bXVzdCB3cml0ZSBhIHRlbXBvcmFyeSBmaWxlIGFuZCByZW5hbWUgaXQgaW50byBwbGFjZS4g T3RoZXJ3aXNlLAoJICogYW5vdGhlciBiYWNrZW5kIHN0YXJ0aW5nIGF0IGFib3V0IHRoZSBz YW1lIHRpbWUgbWlnaHQgY3Jhc2ggdHJ5aW5nIHRvCgkgKiByZWFkIHRoZSBwYXJ0aWFsbHkt Y29tcGxldGUgZmlsZS4KCSAqLwoJaWYgKHNoYXJlZCkKCXsKCQlzbnByaW50Zih0ZW1wZmls ZW5hbWUsIHNpemVvZih0ZW1wZmlsZW5hbWUpLCAiZ2xvYmFsLyVzLiVkIiwKCQkJCSBSRUxD QUNIRV9JTklUX0ZJTEVOQU1FLCBNeVByb2NQaWQpOwoJCXNucHJpbnRmKGZpbmFsZmlsZW5h bWUsIHNpemVvZihmaW5hbGZpbGVuYW1lKSwgImdsb2JhbC8lcyIsCgkJCQkgUkVMQ0FDSEVf SU5JVF9GSUxFTkFNRSk7Cgl9CgllbHNlCgl7CgkJc25wcmludGYodGVtcGZpbGVuYW1lLCBz aXplb2YodGVtcGZpbGVuYW1lKSwgIiVzLyVzLiVkIiwKCQkJCSBEYXRhYmFzZVBhdGgsIFJF TENBQ0hFX0lOSVRfRklMRU5BTUUsIE15UHJvY1BpZCk7CgkJc25wcmludGYoZmluYWxmaWxl bmFtZSwgc2l6ZW9mKGZpbmFsZmlsZW5hbWUpLCAiJXMvJXMiLAoJCQkJIERhdGFiYXNlUGF0 aCwgUkVMQ0FDSEVfSU5JVF9GSUxFTkFNRSk7Cgl9CgoJdW5saW5rKHRlbXBmaWxlbmFtZSk7 CQkvKiBpbiBjYXNlIGl0IGV4aXN0cyB3L3dyb25nIHBlcm1pc3Npb25zICovCgoJZnAgPSBB bGxvY2F0ZUZpbGUodGVtcGZpbGVuYW1lLCBQR19CSU5BUllfVyk7CglpZiAoZnAgPT0gTlVM TCkKCXsKCQkvKgoJCSAqIFdlIHVzZWQgdG8gY29uc2lkZXIgdGhpcyBhIGZhdGFsIGVycm9y LCBidXQgd2UgbWlnaHQgYXMgd2VsbAoJCSAqIGNvbnRpbnVlIHdpdGggYmFja2VuZCBzdGFy dHVwIC4uLgoJCSAqLwoJCWVyZXBvcnQoV0FSTklORywKCQkJCShlcnJjb2RlX2Zvcl9maWxl X2FjY2VzcygpLAoJCQkJIGVycm1zZygiY291bGQgbm90IGNyZWF0ZSByZWxhdGlvbi1jYWNo ZSBpbml0aWFsaXphdGlvbiBmaWxlIFwiJXNcIjogJW0iLAoJCQkJCQl0ZW1wZmlsZW5hbWUp LAoJCQkJIGVycmRldGFpbCgiQ29udGludWluZyBhbnl3YXksIGJ1dCB0aGVyZSdzIHNvbWV0 aGluZyB3cm9uZy4iKSkpOwoJCXJldHVybjsKCX0KCgkvKgoJICogV3JpdGUgYSBtYWdpYyBu dW1iZXIgdG8gc2VydmUgYXMgYSBmaWxlIHZlcnNpb24gaWRlbnRpZmllci4gIFdlIGNhbgoJ ICogY2hhbmdlIHRoZSBtYWdpYyBudW1iZXIgd2hlbmV2ZXIgdGhlIHJlbGNhY2hlIGxheW91 dCBjaGFuZ2VzLgoJICovCgltYWdpYyA9IFJFTENBQ0hFX0lOSVRfRklMRU1BR0lDOwoJaWYg KGZ3cml0ZSgmbWFnaWMsIDEsIHNpemVvZihtYWdpYyksIGZwKSAhPSBzaXplb2YobWFnaWMp KQoJCWVyZXBvcnQoRkFUQUwsCgkJCQllcnJjb2RlX2Zvcl9maWxlX2FjY2VzcygpLAoJCQkJ ZXJybXNnX2ludGVybmFsKCJjb3VsZCBub3Qgd3JpdGUgaW5pdCBmaWxlOiAlbSIpKTsKCgkv KgoJICogV3JpdGUgYWxsIHRoZSBhcHByb3ByaWF0ZSByZWxkZXNjcyAoaW4gbm8gcGFydGlj dWxhciBvcmRlcikuCgkgKi8KCWhhc2hfc2VxX2luaXQoJnN0YXR1cywgUmVsYXRpb25JZENh Y2hlKTsKCgl3aGlsZSAoKGlkaGVudHJ5ID0gKFJlbElkQ2FjaGVFbnQgKikgaGFzaF9zZXFf c2VhcmNoKCZzdGF0dXMpKSAhPSBOVUxMKQoJewoJCVJlbGF0aW9uCXJlbCA9IGlkaGVudHJ5 LT5yZWxkZXNjOwoJCUZvcm1fcGdfY2xhc3MgcmVsZm9ybSA9IHJlbC0+cmRfcmVsOwoKCQkv KiBpZ25vcmUgaWYgbm90IGNvcnJlY3QgZ3JvdXAgKi8KCQlpZiAocmVsZm9ybS0+cmVsaXNz aGFyZWQgIT0gc2hhcmVkKQoJCQljb250aW51ZTsKCgkJLyoKCQkgKiBJZ25vcmUgaWYgbm90 IHN1cHBvc2VkIHRvIGJlIGluIGluaXQgZmlsZS4gIFdlIGNhbiBhbGxvdyBhbnkgc2hhcmVk CgkJICogcmVsYXRpb24gdGhhdCdzIGJlZW4gbG9hZGVkIHNvIGZhciB0byBiZSBpbiB0aGUg c2hhcmVkIGluaXQgZmlsZSwKCQkgKiBidXQgdW5zaGFyZWQgcmVsYXRpb25zIG11c3QgYmUg b25lcyB0aGF0IHNob3VsZCBiZSBpbiB0aGUgbG9jYWwKCQkgKiBmaWxlIHBlciBSZWxhdGlv bklkSXNJbkluaXRGaWxlLiAgKE5vdGU6IGlmIHlvdSB3YW50IHRvIGNoYW5nZSB0aGUKCQkg KiBjcml0ZXJpb24gZm9yIHJlbHMgdG8gYmUga2VwdCBpbiB0aGUgaW5pdCBmaWxlLCBzZWUg YWxzbyBpbnZhbC5jLgoJCSAqIFRoZSByZWFzb24gZm9yIGZpbHRlcmluZyBoZXJlIGlzIHRv IGJlIHN1cmUgdGhhdCB3ZSBkb24ndCBwdXQKCQkgKiBhbnl0aGluZyBpbnRvIHRoZSBsb2Nh bCBpbml0IGZpbGUgZm9yIHdoaWNoIGEgcmVsY2FjaGUgaW52YWwgd291bGQKCQkgKiBub3Qg Y2F1c2UgaW52YWxpZGF0aW9uIG9mIHRoYXQgaW5pdCBmaWxlLikKCQkgKi8KCQlpZiAoIXNo YXJlZCAmJiAhUmVsYXRpb25JZElzSW5Jbml0RmlsZShSZWxhdGlvbkdldFJlbGlkKHJlbCkp KQoJCXsKCQkJLyogTmFpbGVkIHJlbHMgaGFkIGJldHRlciBnZXQgc3RvcmVkLiAqLwoJCQlB c3NlcnQoIXJlbC0+cmRfaXNuYWlsZWQpOwoJCQljb250aW51ZTsKCQl9CgoJCS8qIGZpcnN0 IHdyaXRlIHRoZSByZWxjYWNoZSBlbnRyeSBwcm9wZXIgKi8KCQl3cml0ZV9pdGVtKHJlbCwg c2l6ZW9mKFJlbGF0aW9uRGF0YSksIGZwKTsKCgkJLyogbmV4dCB3cml0ZSB0aGUgcmVsYXRp b24gdHVwbGUgZm9ybSAqLwoJCXdyaXRlX2l0ZW0ocmVsZm9ybSwgQ0xBU1NfVFVQTEVfU0la RSwgZnApOwoKCQkvKiBuZXh0LCBkbyBhbGwgdGhlIGF0dHJpYnV0ZSB0dXBsZSBmb3JtIGRh dGEgZW50cmllcyAqLwoJCWZvciAoaSA9IDA7IGkgPCByZWxmb3JtLT5yZWxuYXR0czsgaSsr KQoJCXsKCQkJd3JpdGVfaXRlbShUdXBsZURlc2NBdHRyKHJlbC0+cmRfYXR0LCBpKSwKCQkJ CQkgICBBVFRSSUJVVEVfRklYRURfUEFSVF9TSVpFLCBmcCk7CgkJfQoKCQkvKiBuZXh0LCBk byB0aGUgYWNjZXNzIG1ldGhvZCBzcGVjaWZpYyBmaWVsZCAqLwoJCXdyaXRlX2l0ZW0ocmVs LT5yZF9vcHRpb25zLAoJCQkJICAgKHJlbC0+cmRfb3B0aW9ucyA/IFZBUlNJWkUocmVsLT5y ZF9vcHRpb25zKSA6IDApLAoJCQkJICAgZnApOwoKCQkvKgoJCSAqIElmIGl0J3MgYW4gaW5k ZXgsIHRoZXJlJ3MgbW9yZSB0byBkby4gTm90ZSB3ZSBleHBsaWNpdGx5IGlnbm9yZQoJCSAq IHBhcnRpdGlvbmVkIGluZGV4ZXMgaGVyZS4KCQkgKi8KCQlpZiAocmVsLT5yZF9yZWwtPnJl bGtpbmQgPT0gUkVMS0lORF9JTkRFWCkKCQl7CgkJCS8qIHdyaXRlIHRoZSBwZ19pbmRleCB0 dXBsZSAqLwoJCQkvKiB3ZSBhc3N1bWUgdGhpcyB3YXMgY3JlYXRlZCBieSBoZWFwX2NvcHl0 dXBsZSEgKi8KCQkJd3JpdGVfaXRlbShyZWwtPnJkX2luZGV4dHVwbGUsCgkJCQkJICAgSEVB UFRVUExFU0laRSArIHJlbC0+cmRfaW5kZXh0dXBsZS0+dF9sZW4sCgkJCQkJICAgZnApOwoK CQkJLyogd3JpdGUgdGhlIHZlY3RvciBvZiBvcGZhbWlseSBPSURzICovCgkJCXdyaXRlX2l0 ZW0ocmVsLT5yZF9vcGZhbWlseSwKCQkJCQkgICByZWxmb3JtLT5yZWxuYXR0cyAqIHNpemVv ZihPaWQpLAoJCQkJCSAgIGZwKTsKCgkJCS8qIHdyaXRlIHRoZSB2ZWN0b3Igb2Ygb3BjaW50 eXBlIE9JRHMgKi8KCQkJd3JpdGVfaXRlbShyZWwtPnJkX29wY2ludHlwZSwKCQkJCQkgICBy ZWxmb3JtLT5yZWxuYXR0cyAqIHNpemVvZihPaWQpLAoJCQkJCSAgIGZwKTsKCgkJCS8qIHdy aXRlIHRoZSB2ZWN0b3Igb2Ygc3VwcG9ydCBwcm9jZWR1cmUgT0lEcyAqLwoJCQl3cml0ZV9p dGVtKHJlbC0+cmRfc3VwcG9ydCwKCQkJCQkgICByZWxmb3JtLT5yZWxuYXR0cyAqIChyZWwt PnJkX2luZGFtLT5hbXN1cHBvcnQgKiBzaXplb2YoUmVnUHJvY2VkdXJlKSksCgkJCQkJICAg ZnApOwoKCQkJLyogd3JpdGUgdGhlIHZlY3RvciBvZiBjb2xsYXRpb24gT0lEcyAqLwoJCQl3 cml0ZV9pdGVtKHJlbC0+cmRfaW5kY29sbGF0aW9uLAoJCQkJCSAgIHJlbGZvcm0tPnJlbG5h dHRzICogc2l6ZW9mKE9pZCksCgkJCQkJICAgZnApOwoKCQkJLyogd3JpdGUgdGhlIHZlY3Rv ciBvZiBpbmRvcHRpb24gdmFsdWVzICovCgkJCXdyaXRlX2l0ZW0ocmVsLT5yZF9pbmRvcHRp b24sCgkJCQkJICAgcmVsZm9ybS0+cmVsbmF0dHMgKiBzaXplb2YoaW50MTYpLAoJCQkJCSAg IGZwKTsKCgkJCUFzc2VydChyZWwtPnJkX29wY29wdGlvbnMpOwoKCQkJLyogd3JpdGUgdGhl IHZlY3RvciBvZiBvcGNvcHRpb25zIHZhbHVlcyAqLwoJCQlmb3IgKGkgPSAwOyBpIDwgcmVs Zm9ybS0+cmVsbmF0dHM7IGkrKykKCQkJewoJCQkJYnl0ZWEJICAgKm9wdCA9IHJlbC0+cmRf b3Bjb3B0aW9uc1tpXTsKCgkJCQl3cml0ZV9pdGVtKG9wdCwgb3B0ID8gVkFSU0laRShvcHQp IDogMCwgZnApOwoJCQl9CgkJfQoJfQoKCWlmIChGcmVlRmlsZShmcCkpCgkJZXJlcG9ydChG QVRBTCwKCQkJCWVycmNvZGVfZm9yX2ZpbGVfYWNjZXNzKCksCgkJCQllcnJtc2dfaW50ZXJu YWwoImNvdWxkIG5vdCB3cml0ZSBpbml0IGZpbGU6ICVtIikpOwoKCS8qCgkgKiBOb3cgd2Ug aGF2ZSB0byBjaGVjayB3aGV0aGVyIHRoZSBkYXRhIHdlJ3ZlIHNvIHBhaW5zdGFraW5nbHkK CSAqIGFjY3VtdWxhdGVkIGlzIGFscmVhZHkgb2Jzb2xldGUgZHVlIHRvIHNvbWVvbmUgZWxz ZSdzIGp1c3QtY29tbWl0dGVkCgkgKiBjYXRhbG9nIGNoYW5nZXMuICBJZiBzbywgd2UganVz dCBkZWxldGUgdGhlIHRlbXAgZmlsZSBhbmQgbGVhdmUgaXQgdG8KCSAqIHRoZSBuZXh0IGJh Y2tlbmQgdG8gdHJ5IGFnYWluLiAgKE91ciBvd24gcmVsY2FjaGUgZW50cmllcyB3aWxsIGJl CgkgKiB1cGRhdGVkIGJ5IFNJIG1lc3NhZ2UgcHJvY2Vzc2luZywgYnV0IHdlIGNhbid0IGJl IHN1cmUgd2hldGhlciB3aGF0IHdlCgkgKiB3cm90ZSBvdXQgd2FzIHVwLXRvLWRhdGUuKQoJ ICoKCSAqIFRoaXMgbXVzdG4ndCBydW4gY29uY3VycmVudGx5IHdpdGggdGhlIGNvZGUgdGhh dCB1bmxpbmtzIGFuIGluaXQgZmlsZQoJICogYW5kIHNlbmRzIFNJIG1lc3NhZ2VzLCBzbyBn cmFiIGEgc2VyaWFsaXphdGlvbiBsb2NrIGZvciB0aGUgZHVyYXRpb24uCgkgKi8KCUxXTG9j a0FjcXVpcmUoUmVsQ2FjaGVJbml0TG9jaywgTFdfRVhDTFVTSVZFKTsKCgkvKiBNYWtlIHN1 cmUgd2UgaGF2ZSBzZWVuIGFsbCBpbmNvbWluZyBTSSBtZXNzYWdlcyAqLwoJQWNjZXB0SW52 YWxpZGF0aW9uTWVzc2FnZXMoKTsKCgkvKgoJICogSWYgd2UgaGF2ZSByZWNlaXZlZCBhbnkg U0kgcmVsY2FjaGUgaW52YWxzIHNpbmNlIGJhY2tlbmQgc3RhcnQsIGFzc3VtZQoJICogd2Ug bWF5IGhhdmUgd3JpdHRlbiBvdXQtb2YtZGF0ZSBkYXRhLgoJICovCglpZiAocmVsY2FjaGVJ bnZhbHNSZWNlaXZlZCA9PSAwTCkKCXsKCQkvKgoJCSAqIE9LLCByZW5hbWUgdGhlIHRlbXAg ZmlsZSB0byBpdHMgZmluYWwgbmFtZSwgZGVsZXRpbmcgYW55CgkJICogcHJldmlvdXNseS1l eGlzdGluZyBpbml0IGZpbGUuCgkJICoKCQkgKiBOb3RlOiBhIGZhaWx1cmUgaGVyZSBpcyBw b3NzaWJsZSB1bmRlciBDeWd3aW4sIGlmIHNvbWUgb3RoZXIKCQkgKiBiYWNrZW5kIGlzIGhv bGRpbmcgb3BlbiBhbiB1bmxpbmtlZC1idXQtbm90LXlldC1nb25lIGluaXQgZmlsZS4gU28K CQkgKiB0cmVhdCB0aGlzIGFzIGEgbm9uY3JpdGljYWwgZmFpbHVyZTsganVzdCByZW1vdmUg dGhlIHVzZWxlc3MgdGVtcAoJCSAqIGZpbGUgb24gZmFpbHVyZS4KCQkgKi8KCQlpZiAocmVu YW1lKHRlbXBmaWxlbmFtZSwgZmluYWxmaWxlbmFtZSkgPCAwKQoJCQl1bmxpbmsodGVtcGZp bGVuYW1lKTsKCX0KCWVsc2UKCXsKCQkvKiBEZWxldGUgdGhlIGFscmVhZHktb2Jzb2xldGUg dGVtcCBmaWxlICovCgkJdW5saW5rKHRlbXBmaWxlbmFtZSk7Cgl9CgoJTFdMb2NrUmVsZWFz ZShSZWxDYWNoZUluaXRMb2NrKTsKfQoKLyogd3JpdGUgYSBjaHVuayBvZiBkYXRhIHByZWNl ZGVkIGJ5IGl0cyBsZW5ndGggKi8Kc3RhdGljIHZvaWQKd3JpdGVfaXRlbShjb25zdCB2b2lk ICpkYXRhLCBTaXplIGxlbiwgRklMRSAqZnApCnsKCWlmIChmd3JpdGUoJmxlbiwgMSwgc2l6 ZW9mKGxlbiksIGZwKSAhPSBzaXplb2YobGVuKSkKCQllcmVwb3J0KEZBVEFMLAoJCQkJZXJy Y29kZV9mb3JfZmlsZV9hY2Nlc3MoKSwKCQkJCWVycm1zZ19pbnRlcm5hbCgiY291bGQgbm90 IHdyaXRlIGluaXQgZmlsZTogJW0iKSk7CglpZiAobGVuID4gMCAmJiBmd3JpdGUoZGF0YSwg MSwgbGVuLCBmcCkgIT0gbGVuKQoJCWVyZXBvcnQoRkFUQUwsCgkJCQllcnJjb2RlX2Zvcl9m aWxlX2FjY2VzcygpLAoJCQkJZXJybXNnX2ludGVybmFsKCJjb3VsZCBub3Qgd3JpdGUgaW5p dCBmaWxlOiAlbSIpKTsKfQoKLyoKICogRGV0ZXJtaW5lIHdoZXRoZXIgYSBnaXZlbiByZWxh dGlvbiAoaWRlbnRpZmllZCBieSBPSUQpIGlzIG9uZSBvZiB0aGUgb25lcwogKiB3ZSBzaG91 bGQgc3RvcmUgaW4gYSByZWxjYWNoZSBpbml0IGZpbGUuCiAqCiAqIFdlIG11c3QgY2FjaGUg YWxsIG5haWxlZCByZWxzLCBhbmQgZm9yIGVmZmljaWVuY3kgd2Ugc2hvdWxkIGNhY2hlIGV2 ZXJ5IHJlbAogKiB0aGF0IHN1cHBvcnRzIGEgc3lzY2FjaGUuICBUaGUgZm9ybWVyIHNldCBp cyBhbG1vc3QgYnV0IG5vdCBxdWl0ZSBhIHN1YnNldAogKiBvZiB0aGUgbGF0dGVyLiBUaGUg c3BlY2lhbCBjYXNlcyBhcmUgcmVsYXRpb25zIHdoZXJlCiAqIFJlbGF0aW9uQ2FjaGVJbml0 aWFsaXplUGhhc2UyLzMgY2hvb3NlcyB0byBuYWlsIGZvciBlZmZpY2llbmN5IHJlYXNvbnMs IGJ1dAogKiB3aGljaCBkbyBub3Qgc3VwcG9ydCBhbnkgc3lzY2FjaGUuCiAqLwpib29sClJl bGF0aW9uSWRJc0luSW5pdEZpbGUoT2lkIHJlbGF0aW9uSWQpCnsKCWlmIChyZWxhdGlvbklk ID09IFNoYXJlZFNlY0xhYmVsUmVsYXRpb25JZCB8fAoJCXJlbGF0aW9uSWQgPT0gVHJpZ2dl clJlbGlkTmFtZUluZGV4SWQgfHwKCQlyZWxhdGlvbklkID09IERhdGFiYXNlTmFtZUluZGV4 SWQgfHwKCQlyZWxhdGlvbklkID09IFNoYXJlZFNlY0xhYmVsT2JqZWN0SW5kZXhJZCkKCXsK CQkvKgoJCSAqIElmIHRoaXMgQXNzZXJ0IGZhaWxzLCB3ZSBkb24ndCBuZWVkIHRoZSBhcHBs aWNhYmxlIHNwZWNpYWwgY2FzZQoJCSAqIGFueW1vcmUuCgkJICovCgkJQXNzZXJ0KCFSZWxh dGlvblN1cHBvcnRzU3lzQ2FjaGUocmVsYXRpb25JZCkpOwoJCXJldHVybiB0cnVlOwoJfQoJ cmV0dXJuIFJlbGF0aW9uU3VwcG9ydHNTeXNDYWNoZShyZWxhdGlvbklkKTsKfQoKLyoKICog SW52YWxpZGF0ZSAocmVtb3ZlKSB0aGUgaW5pdCBmaWxlIGR1cmluZyBjb21taXQgb2YgYSB0 cmFuc2FjdGlvbiB0aGF0CiAqIGNoYW5nZWQgb25lIG9yIG1vcmUgb2YgdGhlIHJlbGF0aW9u IGNhY2hlIGVudHJpZXMgdGhhdCBhcmUga2VwdCBpbiB0aGUKICogbG9jYWwgaW5pdCBmaWxl LgogKgogKiBUbyBiZSBzYWZlIGFnYWluc3QgY29uY3VycmVudCBpbnNwZWN0aW9uIG9yIHJl d3JpdGluZyBvZiB0aGUgaW5pdCBmaWxlLAogKiB3ZSBtdXN0IHRha2UgUmVsQ2FjaGVJbml0 TG9jaywgdGhlbiByZW1vdmUgdGhlIG9sZCBpbml0IGZpbGUsIHRoZW4gc2VuZAogKiB0aGUg U0kgbWVzc2FnZXMgdGhhdCBpbmNsdWRlIHJlbGNhY2hlIGludmFsIGZvciBzdWNoIHJlbGF0 aW9ucywgYW5kIHRoZW4KICogcmVsZWFzZSBSZWxDYWNoZUluaXRMb2NrLiAgVGhpcyBzZXJp YWxpemVzIHRoZSB3aG9sZSBhZmZhaXIgYWdhaW5zdAogKiB3cml0ZV9yZWxjYWNoZV9pbml0 X2ZpbGUsIHNvIHRoYXQgd2UgY2FuIGJlIHN1cmUgdGhhdCBhbnkgb3RoZXIgcHJvY2Vzcwog KiB0aGF0J3MgY29uY3VycmVudGx5IHRyeWluZyB0byBjcmVhdGUgYSBuZXcgaW5pdCBmaWxl IHdvbid0IG1vdmUgYW4KICogYWxyZWFkeS1zdGFsZSB2ZXJzaW9uIGludG8gcGxhY2UgYWZ0 ZXIgd2UgdW5saW5rLiAgQWxzbywgYmVjYXVzZSB3ZSB1bmxpbmsKICogYmVmb3JlIHNlbmRp bmcgdGhlIFNJIG1lc3NhZ2VzLCBhIGJhY2tlbmQgdGhhdCdzIGN1cnJlbnRseSBzdGFydGlu ZyBjYW5ub3QKICogcmVhZCB0aGUgbm93LW9ic29sZXRlIGluaXQgZmlsZSBhbmQgdGhlbiBt aXNzIHRoZSBTSSBtZXNzYWdlcyB0aGF0IHdpbGwKICogZm9yY2UgaXQgdG8gdXBkYXRlIGl0 cyByZWxjYWNoZSBlbnRyaWVzLiAgKFRoaXMgd29ya3MgYmVjYXVzZSB0aGUgYmFja2VuZAog KiBzdGFydHVwIHNlcXVlbmNlIGdldHMgaW50byB0aGUgc2ludmFsIGFycmF5IGJlZm9yZSB0 cnlpbmcgdG8gbG9hZCB0aGUgaW5pdAogKiBmaWxlLikKICoKICogV2UgdGFrZSB0aGUgbG9j ayBhbmQgZG8gdGhlIHVubGluayBpbiBSZWxhdGlvbkNhY2hlSW5pdEZpbGVQcmVJbnZhbGlk YXRlLAogKiB0aGVuIHJlbGVhc2UgdGhlIGxvY2sgaW4gUmVsYXRpb25DYWNoZUluaXRGaWxl UG9zdEludmFsaWRhdGUuICBDYWxsZXIgbXVzdAogKiBzZW5kIGFueSBwZW5kaW5nIFNJIG1l c3NhZ2VzIGJldHdlZW4gdGhvc2UgY2FsbHMuCiAqLwp2b2lkClJlbGF0aW9uQ2FjaGVJbml0 RmlsZVByZUludmFsaWRhdGUodm9pZCkKewoJY2hhcgkJbG9jYWxpbml0Zm5hbWVbTUFYUEdQ QVRIXTsKCWNoYXIJCXNoYXJlZGluaXRmbmFtZVtNQVhQR1BBVEhdOwoKCWlmIChEYXRhYmFz ZVBhdGgpCgkJc25wcmludGYobG9jYWxpbml0Zm5hbWUsIHNpemVvZihsb2NhbGluaXRmbmFt ZSksICIlcy8lcyIsCgkJCQkgRGF0YWJhc2VQYXRoLCBSRUxDQUNIRV9JTklUX0ZJTEVOQU1F KTsKCXNucHJpbnRmKHNoYXJlZGluaXRmbmFtZSwgc2l6ZW9mKHNoYXJlZGluaXRmbmFtZSks ICJnbG9iYWwvJXMiLAoJCQkgUkVMQ0FDSEVfSU5JVF9GSUxFTkFNRSk7CgoJTFdMb2NrQWNx dWlyZShSZWxDYWNoZUluaXRMb2NrLCBMV19FWENMVVNJVkUpOwoKCS8qCgkgKiBUaGUgZmls ZXMgbWlnaHQgbm90IGJlIHRoZXJlIGlmIG5vIGJhY2tlbmQgaGFzIGJlZW4gc3RhcnRlZCBz aW5jZSB0aGUKCSAqIGxhc3QgcmVtb3ZhbC4gIEJ1dCBjb21wbGFpbiBhYm91dCBmYWlsdXJl cyBvdGhlciB0aGFuIEVOT0VOVCB3aXRoCgkgKiBFUlJPUi4gIEZvcnR1bmF0ZWx5LCBpdCdz IG5vdCB0b28gbGF0ZSB0byBhYm9ydCB0aGUgdHJhbnNhY3Rpb24gaWYgd2UKCSAqIGNhbid0 IGdldCByaWQgb2YgdGhlIHdvdWxkLWJlLW9ic29sZXRlIGluaXQgZmlsZS4KCSAqLwoJaWYg KERhdGFiYXNlUGF0aCkKCQl1bmxpbmtfaW5pdGZpbGUobG9jYWxpbml0Zm5hbWUsIEVSUk9S KTsKCXVubGlua19pbml0ZmlsZShzaGFyZWRpbml0Zm5hbWUsIEVSUk9SKTsKfQoKdm9pZApS ZWxhdGlvbkNhY2hlSW5pdEZpbGVQb3N0SW52YWxpZGF0ZSh2b2lkKQp7CglMV0xvY2tSZWxl YXNlKFJlbENhY2hlSW5pdExvY2spOwp9CgovKgogKiBSZW1vdmUgdGhlIGluaXQgZmlsZXMg ZHVyaW5nIHBvc3RtYXN0ZXIgc3RhcnR1cC4KICoKICogV2UgdXNlZCB0byBrZWVwIHRoZSBp bml0IGZpbGVzIGFjcm9zcyByZXN0YXJ0cywgYnV0IHRoYXQgaXMgdW5zYWZlIGluIFBJVFIK ICogc2NlbmFyaW9zLCBhbmQgZXZlbiBpbiBzaW1wbGUgY3Jhc2gtcmVjb3ZlcnkgY2FzZXMg dGhlcmUgYXJlIHdpbmRvd3MgZm9yCiAqIHRoZSBpbml0IGZpbGVzIHRvIGJlY29tZSBvdXQt b2Ytc3luYyB3aXRoIHRoZSBkYXRhYmFzZS4gIFNvIG5vdyB3ZSBqdXN0CiAqIHJlbW92ZSB0 aGVtIGR1cmluZyBzdGFydHVwIGFuZCBleHBlY3QgdGhlIGZpcnN0IGJhY2tlbmQgbGF1bmNo IHRvIHJlYnVpbGQKICogdGhlbS4gIE9mIGNvdXJzZSwgdGhpcyBoYXMgdG8gaGFwcGVuIGlu IGVhY2ggZGF0YWJhc2Ugb2YgdGhlIGNsdXN0ZXIuCiAqLwp2b2lkClJlbGF0aW9uQ2FjaGVJ bml0RmlsZVJlbW92ZSh2b2lkKQp7Cgljb25zdCBjaGFyICp0YmxzcGNkaXIgPSBQR19UQkxT UENfRElSOwoJRElSCQkgICAqZGlyOwoJc3RydWN0IGRpcmVudCAqZGU7CgljaGFyCQlwYXRo W01BWFBHUEFUSCArIHNpemVvZihQR19UQkxTUENfRElSKSArIHNpemVvZihUQUJMRVNQQUNF X1ZFUlNJT05fRElSRUNUT1JZKV07CgoJc25wcmludGYocGF0aCwgc2l6ZW9mKHBhdGgpLCAi Z2xvYmFsLyVzIiwKCQkJIFJFTENBQ0hFX0lOSVRfRklMRU5BTUUpOwoJdW5saW5rX2luaXRm aWxlKHBhdGgsIExPRyk7CgoJLyogU2NhbiBldmVyeXRoaW5nIGluIHRoZSBkZWZhdWx0IHRh Ymxlc3BhY2UgKi8KCVJlbGF0aW9uQ2FjaGVJbml0RmlsZVJlbW92ZUluRGlyKCJiYXNlIik7 CgoJLyogU2NhbiB0aGUgdGFibGVzcGFjZSBsaW5rIGRpcmVjdG9yeSB0byBmaW5kIG5vbi1k ZWZhdWx0IHRhYmxlc3BhY2VzICovCglkaXIgPSBBbGxvY2F0ZURpcih0YmxzcGNkaXIpOwoK CXdoaWxlICgoZGUgPSBSZWFkRGlyRXh0ZW5kZWQoZGlyLCB0YmxzcGNkaXIsIExPRykpICE9 IE5VTEwpCgl7CgkJaWYgKHN0cnNwbihkZS0+ZF9uYW1lLCAiMDEyMzQ1Njc4OSIpID09IHN0 cmxlbihkZS0+ZF9uYW1lKSkKCQl7CgkJCS8qIFNjYW4gdGhlIHRhYmxlc3BhY2UgZGlyIGZv ciBwZXItZGF0YWJhc2UgZGlycyAqLwoJCQlzbnByaW50ZihwYXRoLCBzaXplb2YocGF0aCks ICIlcy8lcy8lcyIsCgkJCQkJIHRibHNwY2RpciwgZGUtPmRfbmFtZSwgVEFCTEVTUEFDRV9W RVJTSU9OX0RJUkVDVE9SWSk7CgkJCVJlbGF0aW9uQ2FjaGVJbml0RmlsZVJlbW92ZUluRGly KHBhdGgpOwoJCX0KCX0KCglGcmVlRGlyKGRpcik7Cn0KCi8qIFByb2Nlc3Mgb25lIHBlci10 YWJsZXNwYWNlIGRpcmVjdG9yeSBmb3IgUmVsYXRpb25DYWNoZUluaXRGaWxlUmVtb3ZlICov CnN0YXRpYyB2b2lkClJlbGF0aW9uQ2FjaGVJbml0RmlsZVJlbW92ZUluRGlyKGNvbnN0IGNo YXIgKnRibHNwY3BhdGgpCnsKCURJUgkJICAgKmRpcjsKCXN0cnVjdCBkaXJlbnQgKmRlOwoJ Y2hhcgkJaW5pdGZpbGVuYW1lW01BWFBHUEFUSCAqIDJdOwoKCS8qIFNjYW4gdGhlIHRhYmxl c3BhY2UgZGlyZWN0b3J5IHRvIGZpbmQgcGVyLWRhdGFiYXNlIGRpcmVjdG9yaWVzICovCglk aXIgPSBBbGxvY2F0ZURpcih0YmxzcGNwYXRoKTsKCgl3aGlsZSAoKGRlID0gUmVhZERpckV4 dGVuZGVkKGRpciwgdGJsc3BjcGF0aCwgTE9HKSkgIT0gTlVMTCkKCXsKCQlpZiAoc3Ryc3Bu KGRlLT5kX25hbWUsICIwMTIzNDU2Nzg5IikgPT0gc3RybGVuKGRlLT5kX25hbWUpKQoJCXsK CQkJLyogVHJ5IHRvIHJlbW92ZSB0aGUgaW5pdCBmaWxlIGluIGVhY2ggZGF0YWJhc2UgKi8K CQkJc25wcmludGYoaW5pdGZpbGVuYW1lLCBzaXplb2YoaW5pdGZpbGVuYW1lKSwgIiVzLyVz LyVzIiwKCQkJCQkgdGJsc3BjcGF0aCwgZGUtPmRfbmFtZSwgUkVMQ0FDSEVfSU5JVF9GSUxF TkFNRSk7CgkJCXVubGlua19pbml0ZmlsZShpbml0ZmlsZW5hbWUsIExPRyk7CgkJfQoJfQoK CUZyZWVEaXIoZGlyKTsKfQoKc3RhdGljIHZvaWQKdW5saW5rX2luaXRmaWxlKGNvbnN0IGNo YXIgKmluaXRmaWxlbmFtZSwgaW50IGVsZXZlbCkKewoJaWYgKHVubGluayhpbml0ZmlsZW5h bWUpIDwgMCkKCXsKCQkvKiBJdCBtaWdodCBub3QgYmUgdGhlcmUsIGJ1dCBsb2cgYW55IGVy cm9yIG90aGVyIHRoYW4gRU5PRU5UICovCgkJaWYgKGVycm5vICE9IEVOT0VOVCkKCQkJZXJl cG9ydChlbGV2ZWwsCgkJCQkJKGVycmNvZGVfZm9yX2ZpbGVfYWNjZXNzKCksCgkJCQkJIGVy cm1zZygiY291bGQgbm90IHJlbW92ZSBjYWNoZSBmaWxlIFwiJXNcIjogJW0iLAoJCQkJCQkJ aW5pdGZpbGVuYW1lKSkpOwoJfQp9CgovKgogKiBSZXNvdXJjZU93bmVyIGNhbGxiYWNrcwog Ki8Kc3RhdGljIGNoYXIgKgpSZXNPd25lclByaW50UmVsQ2FjaGUoRGF0dW0gcmVzKQp7CglS ZWxhdGlvbglyZWwgPSAoUmVsYXRpb24pIERhdHVtR2V0UG9pbnRlcihyZXMpOwoKCXJldHVy biBwc3ByaW50ZigicmVsYXRpb24gXCIlc1wiIiwgUmVsYXRpb25HZXRSZWxhdGlvbk5hbWUo cmVsKSk7Cn0KCnN0YXRpYyB2b2lkClJlc093bmVyUmVsZWFzZVJlbGF0aW9uKERhdHVtIHJl cykKewoJUmVsYXRpb24JcmVsID0gKFJlbGF0aW9uKSBEYXR1bUdldFBvaW50ZXIocmVzKTsK CgkvKgoJICogVGhpcyByZWZlcmVuY2UgaGFzIGFscmVhZHkgYmVlbiByZW1vdmVkIGZyb20g dGhlIHJlc291cmNlIG93bmVyLCBzbwoJICoganVzdCBkZWNyZW1lbnQgcmVmZXJlbmNlIGNv dW50IHdpdGhvdXQgY2FsbGluZwoJICogUmVzb3VyY2VPd25lckZvcmdldFJlbGF0aW9uUmVm LgoJICovCglBc3NlcnQocmVsLT5yZF9yZWZjbnQgPiAwKTsKCXJlbC0+cmRfcmVmY250IC09 IDE7CgoJUmVsYXRpb25DbG9zZUNsZWFudXAoKFJlbGF0aW9uKSBEYXR1bUdldFBvaW50ZXIo cmVzKSk7Cn0KCkxpc3QgKgpFeHBhbmRWaXJ0dWFsR2VuZXJhdGVkQ29sdW1ucyhMaXN0ICps aXN0LCBSZWxhdGlvbiBoZWFwUmVsYXRpb24sIE9pZCBoZWFwUmVsSWQpCnsKCWJvb2wgCQkJ CSBvcGVuZWRfcmVsYXRpb24gPSBmYWxzZTsKCVR1cGxlRGVzYwkJCSB0dXBkZXNjOwoKCWlm IChsaXN0ID09IE5JTCB8fCAoaGVhcFJlbGF0aW9uID09IE5VTEwgJiYgaGVhcFJlbElkID09 IEludmFsaWRPaWQpKQoJCXJldHVybiBsaXN0OwoKCWlmIChoZWFwUmVsYXRpb24gPT0gTlVM TCkKCXsKCQloZWFwUmVsYXRpb24gPSB0YWJsZV9vcGVuKGhlYXBSZWxJZCwgTm9Mb2NrKTsK CQlvcGVuZWRfcmVsYXRpb24gPSB0cnVlOwoJfQoKCXR1cGRlc2MgPSBSZWxhdGlvbkdldERl c2NyKGhlYXBSZWxhdGlvbik7CglpZiAoKHR1cGRlc2MtPmNvbnN0ciAmJiB0dXBkZXNjLT5j b25zdHItPmhhc19nZW5lcmF0ZWRfdmlydHVhbCkpCgl7CgkJaW50CQkJCSBqOwoJCUJpdG1h cHNldAkJKmluZGV4YXR0cnMgPSBOVUxMOwoKCQlwdWxsX3ZhcmF0dG5vcygoTm9kZSAqKWxp c3QsIDEsICZpbmRleGF0dHJzKTsKCgkJaiA9IC0xOwoJCXdoaWxlICgoaiA9IGJtc19uZXh0 X21lbWJlcihpbmRleGF0dHJzLCBqKSkgPj0gMCkKCQl7CgkJCUF0dHJOdW1iZXIJYXR0bm8g PSBqICsgRmlyc3RMb3dJbnZhbGlkSGVhcEF0dHJpYnV0ZU51bWJlcjsKCgkJCWlmIChhdHRu byA+IDAgJiYKCQkJCVR1cGxlRGVzY0F0dHIodHVwZGVzYywgYXR0bm8gLSAxKS0+YXR0Z2Vu ZXJhdGVkID09IEFUVFJJQlVURV9HRU5FUkFURURfVklSVFVBTCkKCQkJewoJCQkJbGlzdCA9 IChMaXN0ICopZXhwYW5kX2dlbmVyYXRlZF9jb2x1bW5zX2luX2V4cHIoKE5vZGUgKilsaXN0 LCBoZWFwUmVsYXRpb24sIDEpOwoJCQkJYnJlYWs7CgkJCX0KCQl9Cgl9CgoJaWYgKG9wZW5l ZF9yZWxhdGlvbikKCQl0YWJsZV9jbG9zZShoZWFwUmVsYXRpb24sIE5vTG9jayk7CgoJcmV0 dXJuIGxpc3Q7Cn0KAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC4vcmVsY2Fj aGUuaAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwMDAwNjY0ADAwMDE3NTAA MDAwMTc1MAAwMDAwMDAxMjI0NAAxNTIyMjEwMzI0NAAwMTE2MjIAIDAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdXN0YXIgIAB4bWFuAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAHhtYW4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAALyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAqCiAqIHJlbGNhY2hl LmgKICoJICBSZWxhdGlvbiBkZXNjcmlwdG9yIGNhY2hlIGRlZmluaXRpb25zLgogKgogKgog KiBQb3J0aW9ucyBDb3B5cmlnaHQgKGMpIDE5OTYtMjAyNiwgUG9zdGdyZVNRTCBHbG9iYWwg RGV2ZWxvcG1lbnQgR3JvdXAKICogUG9ydGlvbnMgQ29weXJpZ2h0IChjKSAxOTk0LCBSZWdl bnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEKICoKICogc3JjL2luY2x1ZGUv dXRpbHMvcmVsY2FjaGUuaAogKgogKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICovCiNpZm5kZWYg UkVMQ0FDSEVfSAojZGVmaW5lIFJFTENBQ0hFX0gKCiNpbmNsdWRlICJhY2Nlc3MvdHVwZGVz Yy5oIgojaW5jbHVkZSAiY29tbW9uL3JlbHBhdGguaCIKI2luY2x1ZGUgIm5vZGVzL2JpdG1h cHNldC5oIgoKCi8qCiAqIE5hbWUgb2YgcmVsY2FjaGUgaW5pdCBmaWxlKHMpLCB1c2VkIHRv IHNwZWVkIHVwIGJhY2tlbmQgc3RhcnR1cAogKi8KI2RlZmluZSBSRUxDQUNIRV9JTklUX0ZJ TEVOQU1FCSJwZ19pbnRlcm5hbC5pbml0IgoKdHlwZWRlZiBzdHJ1Y3QgUmVsYXRpb25EYXRh ICpSZWxhdGlvbjsKCi8qIC0tLS0tLS0tLS0tLS0tLS0KICoJCVJlbGF0aW9uUHRyIGlzIHVz ZWQgaW4gdGhlIGV4ZWN1dG9yIHRvIHN1cHBvcnQgaW5kZXggc2NhbnMKICoJCXdoZXJlIHdl IGhhdmUgdG8ga2VlcCB0cmFjayBvZiBzZXZlcmFsIGluZGV4IHJlbGF0aW9ucyBpbiBhbgog KgkJYXJyYXkuICAtY2ltIDkvMTAvODkKICogLS0tLS0tLS0tLS0tLS0tLQogKi8KdHlwZWRl ZiBSZWxhdGlvbiAqUmVsYXRpb25QdHI7CgovKgogKiBSb3V0aW5lcyB0byBvcGVuIChsb29r dXApIGFuZCBjbG9zZSBhIHJlbGNhY2hlIGVudHJ5CiAqLwojaWZkZWYgVVNFX0FTU0VSVF9D SEVDS0lORwpleHRlcm4gdm9pZCBBc3NlcnRDb3VsZEdldFJlbGF0aW9uKHZvaWQpOwojZWxz ZQpzdGF0aWMgaW5saW5lIHZvaWQKQXNzZXJ0Q291bGRHZXRSZWxhdGlvbih2b2lkKQp7Cn0K I2VuZGlmCmV4dGVybiBSZWxhdGlvbiBSZWxhdGlvbklkR2V0UmVsYXRpb24oT2lkIHJlbGF0 aW9uSWQpOwpleHRlcm4gY2hhciAqUmVsYXRpb25HZXRRdWFsaWZpZWRSZWxhdGlvbk5hbWUo UmVsYXRpb24gcmVsKTsKZXh0ZXJuIHZvaWQgUmVsYXRpb25DbG9zZShSZWxhdGlvbiByZWxh dGlvbik7CgovKgogKiBSb3V0aW5lcyB0byBjb21wdXRlL3JldHJpZXZlIGFkZGl0aW9uYWwg Y2FjaGVkIGluZm9ybWF0aW9uCiAqLwpleHRlcm4gTGlzdCAqUmVsYXRpb25HZXRGS2V5TGlz dChSZWxhdGlvbiByZWxhdGlvbik7CmV4dGVybiBMaXN0ICpSZWxhdGlvbkdldEluZGV4TGlz dChSZWxhdGlvbiByZWxhdGlvbik7CmV4dGVybiBMaXN0ICpSZWxhdGlvbkdldFN0YXRFeHRM aXN0KFJlbGF0aW9uIHJlbGF0aW9uKTsKZXh0ZXJuIE9pZAlSZWxhdGlvbkdldFByaW1hcnlL ZXlJbmRleChSZWxhdGlvbiByZWxhdGlvbiwgYm9vbCBkZWZlcnJhYmxlX29rKTsKZXh0ZXJu IE9pZAlSZWxhdGlvbkdldFJlcGxpY2FJbmRleChSZWxhdGlvbiByZWxhdGlvbik7CmV4dGVy biBMaXN0ICpSZWxhdGlvbkdldEluZGV4RXhwcmVzc2lvbnMoUmVsYXRpb24gcmVsYXRpb24p OwpleHRlcm4gTGlzdCAqUmVsYXRpb25HZXRJbmRleEV4cHJlc3Npb25zRXhwYW5kKFJlbGF0 aW9uIHJlbGF0aW9uKTsKZXh0ZXJuIExpc3QgKlJlbGF0aW9uR2V0RHVtbXlJbmRleEV4cHJl c3Npb25zKFJlbGF0aW9uIHJlbGF0aW9uKTsKZXh0ZXJuIExpc3QgKlJlbGF0aW9uR2V0SW5k ZXhQcmVkaWNhdGUoUmVsYXRpb24gcmVsYXRpb24pOwpleHRlcm4gTGlzdCAqUmVsYXRpb25H ZXRJbmRleFByZWRpY2F0ZUV4cGFuZChSZWxhdGlvbiByZWxhdGlvbik7CmV4dGVybiBieXRl YSAqKlJlbGF0aW9uR2V0SW5kZXhBdHRPcHRpb25zKFJlbGF0aW9uIHJlbGF0aW9uLCBib29s IGNvcHkpOwoKLyoKICogV2hpY2ggc2V0IG9mIGNvbHVtbnMgdG8gcmV0dXJuIGJ5IFJlbGF0 aW9uR2V0SW5kZXhBdHRyQml0bWFwLgogKi8KdHlwZWRlZiBlbnVtIEluZGV4QXR0ckJpdG1h cEtpbmQKewoJSU5ERVhfQVRUUl9CSVRNQVBfS0VZLAoJSU5ERVhfQVRUUl9CSVRNQVBfUFJJ TUFSWV9LRVksCglJTkRFWF9BVFRSX0JJVE1BUF9JREVOVElUWV9LRVksCglJTkRFWF9BVFRS X0JJVE1BUF9IT1RfQkxPQ0tJTkcsCglJTkRFWF9BVFRSX0JJVE1BUF9TVU1NQVJJWkVELAp9 IEluZGV4QXR0ckJpdG1hcEtpbmQ7CgpleHRlcm4gQml0bWFwc2V0ICpSZWxhdGlvbkdldElu ZGV4QXR0ckJpdG1hcChSZWxhdGlvbiByZWxhdGlvbiwKCQkJCQkJCQkJCQkgSW5kZXhBdHRy Qml0bWFwS2luZCBhdHRyS2luZCk7CgpleHRlcm4gQml0bWFwc2V0ICpSZWxhdGlvbkdldElk ZW50aXR5S2V5Qml0bWFwKFJlbGF0aW9uIHJlbGF0aW9uKTsKCmV4dGVybiB2b2lkIFJlbGF0 aW9uR2V0RXhjbHVzaW9uSW5mbyhSZWxhdGlvbiBpbmRleFJlbGF0aW9uLAoJCQkJCQkJCQkg T2lkICoqb3BlcmF0b3JzLAoJCQkJCQkJCQkgT2lkICoqcHJvY3MsCgkJCQkJCQkJCSB1aW50 MTYgKipzdHJhdGVnaWVzKTsKCmV4dGVybiB2b2lkIFJlbGF0aW9uSW5pdEluZGV4QWNjZXNz SW5mbyhSZWxhdGlvbiByZWxhdGlvbik7CgovKiBjYWxsZXIgbXVzdCBpbmNsdWRlIHBnX3B1 YmxpY2F0aW9uLmggKi8Kc3RydWN0IFB1YmxpY2F0aW9uRGVzYzsKZXh0ZXJuIHZvaWQgUmVs YXRpb25CdWlsZFB1YmxpY2F0aW9uRGVzYyhSZWxhdGlvbiByZWxhdGlvbiwKCQkJCQkJCQkJ CSBzdHJ1Y3QgUHVibGljYXRpb25EZXNjICpwdWJkZXNjKTsKCmV4dGVybiB2b2lkIFJlbGF0 aW9uSW5pdFRhYmxlQWNjZXNzTWV0aG9kKFJlbGF0aW9uIHJlbGF0aW9uKTsKCi8qCiAqIFJv dXRpbmVzIHRvIHN1cHBvcnQgZXJlcG9ydCgpIHJlcG9ydHMgb2YgcmVsYXRpb24tcmVsYXRl ZCBlcnJvcnMKICovCmV4dGVybiBpbnQJZXJydGFibGUoUmVsYXRpb24gcmVsKTsKZXh0ZXJu IGludAllcnJ0YWJsZWNvbChSZWxhdGlvbiByZWwsIGludCBhdHRudW0pOwpleHRlcm4gaW50 CWVycnRhYmxlY29sbmFtZShSZWxhdGlvbiByZWwsIGNvbnN0IGNoYXIgKmNvbG5hbWUpOwpl eHRlcm4gaW50CWVycnRhYmxlY29uc3RyYWludChSZWxhdGlvbiByZWwsIGNvbnN0IGNoYXIg KmNvbm5hbWUpOwoKLyoKICogUm91dGluZXMgZm9yIGJhY2tlbmQgc3RhcnR1cAogKi8KZXh0 ZXJuIHZvaWQgUmVsYXRpb25DYWNoZUluaXRpYWxpemUodm9pZCk7CmV4dGVybiB2b2lkIFJl bGF0aW9uQ2FjaGVJbml0aWFsaXplUGhhc2UyKHZvaWQpOwpleHRlcm4gdm9pZCBSZWxhdGlv bkNhY2hlSW5pdGlhbGl6ZVBoYXNlMyh2b2lkKTsKCi8qCiAqIFJvdXRpbmUgdG8gY3JlYXRl IGEgcmVsY2FjaGUgZW50cnkgZm9yIGFuIGFib3V0LXRvLWJlLWNyZWF0ZWQgcmVsYXRpb24K ICovCmV4dGVybiBSZWxhdGlvbiBSZWxhdGlvbkJ1aWxkTG9jYWxSZWxhdGlvbihjb25zdCBj aGFyICpyZWxuYW1lLAoJCQkJCQkJCQkJICAgT2lkIHJlbG5hbWVzcGFjZSwKCQkJCQkJCQkJ CSAgIFR1cGxlRGVzYyB0dXBEZXNjLAoJCQkJCQkJCQkJICAgT2lkIHJlbGlkLAoJCQkJCQkJ CQkJICAgT2lkIGFjY2Vzc210ZCwKCQkJCQkJCQkJCSAgIFJlbEZpbGVOdW1iZXIgcmVsZmls ZW51bWJlciwKCQkJCQkJCQkJCSAgIE9pZCByZWx0YWJsZXNwYWNlLAoJCQkJCQkJCQkJICAg Ym9vbCBzaGFyZWRfcmVsYXRpb24sCgkJCQkJCQkJCQkgICBib29sIG1hcHBlZF9yZWxhdGlv biwKCQkJCQkJCQkJCSAgIGNoYXIgcmVscGVyc2lzdGVuY2UsCgkJCQkJCQkJCQkgICBjaGFy IHJlbGtpbmQpOwoKLyoKICogUm91dGluZXMgdG8gbWFuYWdlIGFzc2lnbm1lbnQgb2YgbmV3 IHJlbGZpbGVudW1iZXIgdG8gYSByZWxhdGlvbgogKi8KZXh0ZXJuIHZvaWQgUmVsYXRpb25T ZXROZXdSZWxmaWxlbnVtYmVyKFJlbGF0aW9uIHJlbGF0aW9uLCBjaGFyIHBlcnNpc3RlbmNl KTsKZXh0ZXJuIHZvaWQgUmVsYXRpb25Bc3N1bWVOZXdSZWxmaWxlbG9jYXRvcihSZWxhdGlv biByZWxhdGlvbik7CgovKgogKiBSb3V0aW5lcyBmb3IgZmx1c2hpbmcvcmVidWlsZGluZyBy ZWxjYWNoZSBlbnRyaWVzIGluIHZhcmlvdXMgc2NlbmFyaW9zCiAqLwpleHRlcm4gdm9pZCBS ZWxhdGlvbkZvcmdldFJlbGF0aW9uKE9pZCByaWQpOwoKZXh0ZXJuIHZvaWQgUmVsYXRpb25D YWNoZUludmFsaWRhdGVFbnRyeShPaWQgcmVsYXRpb25JZCk7CgpleHRlcm4gdm9pZCBSZWxh dGlvbkNhY2hlSW52YWxpZGF0ZShib29sIGRlYnVnX2Rpc2NhcmQpOwoKI2lmZGVmIFVTRV9B U1NFUlRfQ0hFQ0tJTkcKZXh0ZXJuIHZvaWQgQXNzZXJ0UGVuZGluZ1N5bmNzX1JlbGF0aW9u Q2FjaGUodm9pZCk7CiNlbHNlCiNkZWZpbmUgQXNzZXJ0UGVuZGluZ1N5bmNzX1JlbGF0aW9u Q2FjaGUoKSBkbyB7fSB3aGlsZSAoMCkKI2VuZGlmCmV4dGVybiB2b2lkIEF0RU9YYWN0X1Jl bGF0aW9uQ2FjaGUoYm9vbCBpc0NvbW1pdCk7CmV4dGVybiB2b2lkIEF0RU9TdWJYYWN0X1Jl bGF0aW9uQ2FjaGUoYm9vbCBpc0NvbW1pdCwgU3ViVHJhbnNhY3Rpb25JZCBteVN1YmlkLAoJ CQkJCQkJCQkgIFN1YlRyYW5zYWN0aW9uSWQgcGFyZW50U3ViaWQpOwoKLyoKICogUm91dGlu ZXMgdG8gaGVscCBtYW5hZ2UgcmVidWlsZGluZyBvZiByZWxjYWNoZSBpbml0IGZpbGVzCiAq LwpleHRlcm4gYm9vbCBSZWxhdGlvbklkSXNJbkluaXRGaWxlKE9pZCByZWxhdGlvbklkKTsK ZXh0ZXJuIHZvaWQgUmVsYXRpb25DYWNoZUluaXRGaWxlUHJlSW52YWxpZGF0ZSh2b2lkKTsK ZXh0ZXJuIHZvaWQgUmVsYXRpb25DYWNoZUluaXRGaWxlUG9zdEludmFsaWRhdGUodm9pZCk7 CmV4dGVybiB2b2lkIFJlbGF0aW9uQ2FjaGVJbml0RmlsZVJlbW92ZSh2b2lkKTsKCi8qIHNo b3VsZCBiZSB1c2VkIG9ubHkgYnkgcmVsY2FjaGUuYyBhbmQgY2F0Y2FjaGUuYyAqLwpleHRl cm4gUEdETExJTVBPUlQgYm9vbCBjcml0aWNhbFJlbGNhY2hlc0J1aWx0OwoKLyogc2hvdWxk IGJlIHVzZWQgb25seSBieSByZWxjYWNoZS5jIGFuZCBwb3N0aW5pdC5jICovCmV4dGVybiBQ R0RMTElNUE9SVCBib29sIGNyaXRpY2FsU2hhcmVkUmVsY2FjaGVzQnVpbHQ7CgpleHRlcm4g TGlzdCAqRXhwYW5kVmlydHVhbEdlbmVyYXRlZENvbHVtbnMoTGlzdCAqbGlzdCwgUmVsYXRp b24gaGVhcFJlbGF0aW9uLCBPaWQgaGVhcFJlbElkKTsKCiNlbmRpZgkJCQkJCQkvKiBSRUxD QUNIRV9IICovCgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC4vc2VsZnVuY3MuYwAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwMDAwNjY0ADAwMDE3NTAAMDAwMTc1MAAwMDAw MTA2NTQxMgAxNTIyMTUwMDc0NAAwMTE3MDQAIDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAdXN0YXIgIAB4bWFuAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAHhtYW4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAALyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAqCiAqIHNlbGZ1bmNzLmMKICoJICBTZWxl Y3Rpdml0eSBmdW5jdGlvbnMgYW5kIGluZGV4IGNvc3QgZXN0aW1hdGlvbiBmdW5jdGlvbnMg Zm9yCiAqCSAgc3RhbmRhcmQgb3BlcmF0b3JzIGFuZCBpbmRleCBhY2Nlc3MgbWV0aG9kcy4K ICoKICoJICBTZWxlY3Rpdml0eSByb3V0aW5lcyBhcmUgcmVnaXN0ZXJlZCBpbiB0aGUgcGdf b3BlcmF0b3IgY2F0YWxvZwogKgkgIGluIHRoZSAib3BycmVzdCIgYW5kICJvcHJqb2luIiBh dHRyaWJ1dGVzLgogKgogKgkgIEluZGV4IGNvc3QgZnVuY3Rpb25zIGFyZSBsb2NhdGVkIHZp YSB0aGUgaW5kZXggQU0ncyBBUEkgc3RydWN0LAogKgkgIHdoaWNoIGlzIG9idGFpbmVkIGZy b20gdGhlIGhhbmRsZXIgZnVuY3Rpb24gcmVnaXN0ZXJlZCBpbiBwZ19hbS4KICoKICogUG9y dGlvbnMgQ29weXJpZ2h0IChjKSAxOTk2LTIwMjYsIFBvc3RncmVTUUwgR2xvYmFsIERldmVs b3BtZW50IEdyb3VwCiAqIFBvcnRpb25zIENvcHlyaWdodCAoYykgMTk5NCwgUmVnZW50cyBv ZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhCiAqCiAqCiAqIElERU5USUZJQ0FUSU9O CiAqCSAgc3JjL2JhY2tlbmQvdXRpbHMvYWR0L3NlbGZ1bmNzLmMKICoKICotLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tCiAqLwoKLyotLS0tLS0tLS0tCiAqIE9wZXJhdG9yIHNlbGVjdGl2aXR5IGVz dGltYXRpb24gZnVuY3Rpb25zIGFyZSBjYWxsZWQgdG8gZXN0aW1hdGUgdGhlCiAqIHNlbGVj dGl2aXR5IG9mIFdIRVJFIGNsYXVzZXMgd2hvc2UgdG9wLWxldmVsIG9wZXJhdG9yIGlzIHRo ZWlyIG9wZXJhdG9yLgogKiBXZSBkaXZpZGUgdGhlIHByb2JsZW0gaW50byB0d28gY2FzZXM6 CiAqCQlSZXN0cmljdGlvbiBjbGF1c2UgZXN0aW1hdGlvbjogdGhlIGNsYXVzZSBpbnZvbHZl cyB2YXJzIG9mIGp1c3QKICoJCQlvbmUgcmVsYXRpb24uCiAqCQlKb2luIGNsYXVzZSBlc3Rp bWF0aW9uOiB0aGUgY2xhdXNlIGludm9sdmVzIHZhcnMgb2YgbXVsdGlwbGUgcmVscy4KICog Sm9pbiBzZWxlY3Rpdml0eSBlc3RpbWF0aW9uIGlzIGZhciBtb3JlIGRpZmZpY3VsdCBhbmQg dXN1YWxseSBsZXNzIGFjY3VyYXRlCiAqIHRoYW4gcmVzdHJpY3Rpb24gZXN0aW1hdGlvbi4K ICoKICogV2hlbiBkZWFsaW5nIHdpdGggdGhlIGlubmVyIHNjYW4gb2YgYSBuZXN0bG9vcCBq b2luLCB3ZSBjb25zaWRlciB0aGUKICogam9pbidzIGpvaW5jbGF1c2VzIGFzIHJlc3RyaWN0 aW9uIGNsYXVzZXMgZm9yIHRoZSBpbm5lciByZWxhdGlvbiwgYW5kCiAqIHRyZWF0IHZhcnMg b2YgdGhlIG91dGVyIHJlbGF0aW9uIGFzIHBhcmFtZXRlcnMgKGEvay9hIGNvbnN0YW50cyBv ZiB1bmtub3duCiAqIHZhbHVlcykuICBTbywgcmVzdHJpY3Rpb24gZXN0aW1hdG9ycyBuZWVk IHRvIGJlIGFibGUgdG8gYWNjZXB0IGFuIGFyZ3VtZW50CiAqIHRlbGxpbmcgd2hpY2ggcmVs YXRpb24gaXMgdG8gYmUgdHJlYXRlZCBhcyB0aGUgdmFyaWFibGUuCiAqCiAqIFRoZSBjYWxs IGNvbnZlbnRpb24gZm9yIGEgcmVzdHJpY3Rpb24gZXN0aW1hdG9yIChvcHJyZXN0IGZ1bmN0 aW9uKSBpcwogKgogKgkJU2VsZWN0aXZpdHkgb3BycmVzdCAoUGxhbm5lckluZm8gKnJvb3Qs CiAqCQkJCQkJCSBPaWQgb3BlcmF0b3IsCiAqCQkJCQkJCSBMaXN0ICphcmdzLAogKgkJCQkJ CQkgaW50IHZhclJlbGlkKTsKICoKICogcm9vdDogZ2VuZXJhbCBpbmZvcm1hdGlvbiBhYm91 dCB0aGUgcXVlcnkgKHJ0YWJsZSBhbmQgUmVsT3B0SW5mbyBsaXN0cwogKiBhcmUgcGFydGlj dWxhcmx5IGltcG9ydGFudCBmb3IgdGhlIGVzdGltYXRvcikuCiAqIG9wZXJhdG9yOiBPSUQg b2YgdGhlIHNwZWNpZmljIG9wZXJhdG9yIGluIHF1ZXN0aW9uLgogKiBhcmdzOiBhcmd1bWVu dCBsaXN0IGZyb20gdGhlIG9wZXJhdG9yIGNsYXVzZS4KICogdmFyUmVsaWQ6IGlmIG5vdCB6 ZXJvLCB0aGUgcmVsaWQgKHJ0YWJsZSBpbmRleCkgb2YgdGhlIHJlbGF0aW9uIHRvCiAqIGJl IHRyZWF0ZWQgYXMgdGhlIHZhcmlhYmxlIHJlbGF0aW9uLiAgTWF5IGJlIHplcm8gaWYgdGhl IGFyZ3MgbGlzdAogKiBpcyBrbm93biB0byBjb250YWluIHZhcnMgb2Ygb25seSBvbmUgcmVs YXRpb24uCiAqCiAqIFRoaXMgaXMgcmVwcmVzZW50ZWQgYXQgdGhlIFNRTCBsZXZlbCAoaW4g cGdfcHJvYykgYXMKICoKICoJCWZsb2F0OCBvcHJyZXN0IChpbnRlcm5hbCwgb2lkLCBpbnRl cm5hbCwgaW50NCk7CiAqCiAqIFRoZSByZXN1bHQgaXMgYSBzZWxlY3Rpdml0eSwgdGhhdCBp cywgYSBmcmFjdGlvbiAoMCB0byAxKSBvZiB0aGUgcm93cwogKiBvZiB0aGUgcmVsYXRpb24g dGhhdCBhcmUgZXhwZWN0ZWQgdG8gcHJvZHVjZSBhIFRSVUUgcmVzdWx0IGZvciB0aGUKICog Z2l2ZW4gb3BlcmF0b3IuCiAqCiAqIFRoZSBjYWxsIGNvbnZlbnRpb24gZm9yIGEgam9pbiBl c3RpbWF0b3IgKG9wcmpvaW4gZnVuY3Rpb24pIGlzIHNpbWlsYXIKICogZXhjZXB0IHRoYXQg dmFyUmVsaWQgaXMgbm90IG5lZWRlZCwgYW5kIGluc3RlYWQgam9pbiBpbmZvcm1hdGlvbiBp cwogKiBzdXBwbGllZDoKICoKICoJCVNlbGVjdGl2aXR5IG9wcmpvaW4gKFBsYW5uZXJJbmZv ICpyb290LAogKgkJCQkJCQkgT2lkIG9wZXJhdG9yLAogKgkJCQkJCQkgTGlzdCAqYXJncywK ICoJCQkJCQkJIEpvaW5UeXBlIGpvaW50eXBlLAogKgkJCQkJCQkgU3BlY2lhbEpvaW5JbmZv ICpzamluZm8pOwogKgogKgkJZmxvYXQ4IG9wcmpvaW4gKGludGVybmFsLCBvaWQsIGludGVy bmFsLCBpbnQyLCBpbnRlcm5hbCk7CiAqCiAqIChCZWZvcmUgUG9zdGdyZXMgOC40LCBqb2lu IGVzdGltYXRvcnMgaGFkIG9ubHkgdGhlIGZpcnN0IGZvdXIgb2YgdGhlc2UKICogcGFyYW1l dGVycy4gIFRoYXQgc2lnbmF0dXJlIGlzIHN0aWxsIGFsbG93ZWQsIGJ1dCBkZXByZWNhdGVk LikgIFRoZQogKiByZWxhdGlvbnNoaXAgYmV0d2VlbiBqb2ludHlwZSBhbmQgc2ppbmZvIGlz IGV4cGxhaW5lZCBpbiB0aGUgY29tbWVudHMgZm9yCiAqIGNsYXVzZV9zZWxlY3Rpdml0eSgp IC0tLSB0aGUgc2hvcnQgdmVyc2lvbiBpcyB0aGF0IGpvaW50eXBlIGlzIHVzdWFsbHkKICog YmVzdCBpZ25vcmVkIGluIGZhdm9yIG9mIGV4YW1pbmluZyBzamluZm8uCiAqCiAqIEpvaW4g c2VsZWN0aXZpdHkgZm9yIHJlZ3VsYXIgaW5uZXIgYW5kIG91dGVyIGpvaW5zIGlzIGRlZmlu ZWQgYXMgdGhlCiAqIGZyYWN0aW9uICgwIHRvIDEpIG9mIHRoZSBjcm9zcyBwcm9kdWN0IG9m IHRoZSByZWxhdGlvbnMgdGhhdCBpcyBleHBlY3RlZAogKiB0byBwcm9kdWNlIGEgVFJVRSBy ZXN1bHQgZm9yIHRoZSBnaXZlbiBvcGVyYXRvci4gIEZvciBib3RoIHNlbWkgYW5kIGFudGkK ICogam9pbnMsIGhvd2V2ZXIsIHRoZSBzZWxlY3Rpdml0eSBpcyBkZWZpbmVkIGFzIHRoZSBm cmFjdGlvbiBvZiB0aGUgbGVmdC1oYW5kCiAqIHNpZGUgcmVsYXRpb24ncyByb3dzIHRoYXQg YXJlIGV4cGVjdGVkIHRvIGhhdmUgYSBtYXRjaCAoaWUsIGF0IGxlYXN0IG9uZQogKiByb3cg d2l0aCBhIFRSVUUgcmVzdWx0KSBpbiB0aGUgcmlnaHQtaGFuZCBzaWRlLgogKgogKiBGb3Ig Ym90aCBvcHJyZXN0IGFuZCBvcHJqb2luIGZ1bmN0aW9ucywgdGhlIG9wZXJhdG9yJ3MgaW5w dXQgY29sbGF0aW9uIE9JRAogKiAoaWYgYW55KSBpcyBwYXNzZWQgdXNpbmcgdGhlIHN0YW5k YXJkIGZtZ3IgbWVjaGFuaXNtLCBzbyB0aGF0IHRoZSBlc3RpbWF0b3IKICogZnVuY3Rpb24g Y2FuIGZldGNoIGl0IHdpdGggUEdfR0VUX0NPTExBVElPTigpLiAgTm90ZSwgaG93ZXZlciwg dGhhdCBhbGwKICogc3RhdGlzdGljcyBpbiBwZ19zdGF0aXN0aWMgYXJlIGN1cnJlbnRseSBi dWlsdCB1c2luZyB0aGUgcmVsZXZhbnQgY29sdW1uJ3MKICogY29sbGF0aW9uLgogKi0tLS0t LS0tLS0KICovCgojaW5jbHVkZSAicG9zdGdyZXMuaCIKCiNpbmNsdWRlIDxjdHlwZS5oPgoj aW5jbHVkZSA8bWF0aC5oPgoKI2luY2x1ZGUgImFjY2Vzcy9icmluLmgiCiNpbmNsdWRlICJh Y2Nlc3MvYnJpbl9wYWdlLmgiCiNpbmNsdWRlICJhY2Nlc3MvZ2luLmgiCiNpbmNsdWRlICJh Y2Nlc3MvdGFibGUuaCIKI2luY2x1ZGUgImFjY2Vzcy90YWJsZWFtLmgiCiNpbmNsdWRlICJh Y2Nlc3MvdmlzaWJpbGl0eW1hcC5oIgojaW5jbHVkZSAiY2F0YWxvZy9wZ19jb2xsYXRpb24u aCIKI2luY2x1ZGUgImNhdGFsb2cvcGdfb3BlcmF0b3IuaCIKI2luY2x1ZGUgImNhdGFsb2cv cGdfc3RhdGlzdGljLmgiCiNpbmNsdWRlICJjYXRhbG9nL3BnX3N0YXRpc3RpY19leHQuaCIK I2luY2x1ZGUgImV4ZWN1dG9yL25vZGVBZ2cuaCIKI2luY2x1ZGUgIm1pc2NhZG1pbi5oIgoj aW5jbHVkZSAibm9kZXMvbWFrZWZ1bmNzLmgiCiNpbmNsdWRlICJub2Rlcy9ub2RlRnVuY3Mu aCIKI2luY2x1ZGUgIm9wdGltaXplci9jbGF1c2VzLmgiCiNpbmNsdWRlICJvcHRpbWl6ZXIv Y29zdC5oIgojaW5jbHVkZSAib3B0aW1pemVyL29wdGltaXplci5oIgojaW5jbHVkZSAib3B0 aW1pemVyL3BhdGhub2RlLmgiCiNpbmNsdWRlICJvcHRpbWl6ZXIvcGF0aHMuaCIKI2luY2x1 ZGUgIm9wdGltaXplci9wbGFuY2F0LmgiCiNpbmNsdWRlICJwYXJzZXIvcGFyc2VfY2xhdXNl LmgiCiNpbmNsdWRlICJwYXJzZXIvcGFyc2VfcmVsYXRpb24uaCIKI2luY2x1ZGUgInBhcnNl ci9wYXJzZXRyZWUuaCIKI2luY2x1ZGUgInJld3JpdGUvcmV3cml0ZU1hbmlwLmgiCiNpbmNs dWRlICJzdGF0aXN0aWNzL3N0YXRpc3RpY3MuaCIKI2luY2x1ZGUgInN0b3JhZ2UvYnVmbWdy LmgiCiNpbmNsdWRlICJ1dGlscy9hY2wuaCIKI2luY2x1ZGUgInV0aWxzL2FycmF5LmgiCiNp bmNsdWRlICJ1dGlscy9idWlsdGlucy5oIgojaW5jbHVkZSAidXRpbHMvZGF0ZS5oIgojaW5j bHVkZSAidXRpbHMvZGF0dW0uaCIKI2luY2x1ZGUgInV0aWxzL2ZtZ3JvaWRzLmgiCiNpbmNs dWRlICJ1dGlscy9pbmRleF9zZWxmdW5jcy5oIgojaW5jbHVkZSAidXRpbHMvbHN5c2NhY2hl LmgiCiNpbmNsdWRlICJ1dGlscy9tZW11dGlscy5oIgojaW5jbHVkZSAidXRpbHMvcGdfbG9j YWxlLmgiCiNpbmNsdWRlICJ1dGlscy9yZWwuaCIKI2luY2x1ZGUgInV0aWxzL3NlbGZ1bmNz LmgiCiNpbmNsdWRlICJ1dGlscy9zbmFwbWdyLmgiCiNpbmNsdWRlICJ1dGlscy9zcGNjYWNo ZS5oIgojaW5jbHVkZSAidXRpbHMvc3lzY2FjaGUuaCIKI2luY2x1ZGUgInV0aWxzL3RpbWVz dGFtcC5oIgojaW5jbHVkZSAidXRpbHMvdHlwY2FjaGUuaCIKCiNkZWZpbmUgREVGQVVMVF9Q QUdFX0NQVV9NVUxUSVBMSUVSIDUwLjAKCi8qCiAqIEluIHByb2R1Y3Rpb24gYnVpbGRzLCBz d2l0Y2ggdG8gaGFzaC1iYXNlZCBNQ1YgbWF0Y2hpbmcgd2hlbiB0aGUgbGlzdHMgYXJlCiAq IGxhcmdlIGVub3VnaCB0byBhbW9ydGl6ZSBoYXNoIHNldHVwIGNvc3QuICAoVGhpcyB0aHJl c2hvbGQgaXMgY29tcGFyZWQgdG8KICogdGhlIHN1bSBvZiB0aGUgbGVuZ3RocyBvZiB0aGUg dHdvIE1DViBsaXN0cy4gIFRoaXMgaXMgc2ltcGxpc3RpYyBidXQgc2VlbXMKICogdG8gd29y ayB3ZWxsIGVub3VnaC4pICBJbiBkZWJ1ZyBidWlsZHMsIHdlIHVzZSBhIHNtYWxsZXIgdGhy ZXNob2xkIHNvIHRoYXQKICogdGhlIHJlZ3Jlc3Npb24gdGVzdHMgY292ZXIgYm90aCBwYXRo cyB3ZWxsLgogKi8KI2lmbmRlZiBVU0VfQVNTRVJUX0NIRUNLSU5HCiNkZWZpbmUgRVFKT0lO U0VMX01DVl9IQVNIX1RIUkVTSE9MRCAyMDAKI2Vsc2UKI2RlZmluZSBFUUpPSU5TRUxfTUNW X0hBU0hfVEhSRVNIT0xEIDIwCiNlbmRpZgoKLyogRW50cmllcyBpbiB0aGUgc2ltcGxlaGFz aCBoYXNoIHRhYmxlIHVzZWQgYnkgZXFqb2luc2VsX2ZpbmRfbWF0Y2hlcyAqLwp0eXBlZGVm IHN0cnVjdCBNQ1ZIYXNoRW50cnkKewoJRGF0dW0JCXZhbHVlOwkJCS8qIHRoZSB2YWx1ZSBy ZXByZXNlbnRlZCBieSB0aGlzIGVudHJ5ICovCglpbnQJCQlpbmRleDsJCQkvKiBpdHMgaW5k ZXggaW4gdGhlIHJlbGV2YW50IEF0dFN0YXRzU2xvdCAqLwoJdWludDMyCQloYXNoOwkJCS8q IGhhc2ggY29kZSBmb3IgdGhlIERhdHVtICovCgljaGFyCQlzdGF0dXM7CQkJLyogc3RhdHVz IGNvZGUgdXNlZCBieSBzaW1wbGVoYXNoLmggKi8KfSBNQ1ZIYXNoRW50cnk7CgovKiBwcml2 YXRlX2RhdGEgZm9yIHRoZSBzaW1wbGVoYXNoIGhhc2ggdGFibGUgKi8KdHlwZWRlZiBzdHJ1 Y3QgTUNWSGFzaENvbnRleHQKewoJRnVuY3Rpb25DYWxsSW5mbyBlcXVhbF9mY2luZm87CS8q IHRoZSBlcXVhbGl0eSBqb2luIG9wZXJhdG9yICovCglGdW5jdGlvbkNhbGxJbmZvIGhhc2hf ZmNpbmZvOwkvKiB0aGUgaGFzaCBmdW5jdGlvbiB0byB1c2UgKi8KCWJvb2wJCW9wX2lzX3Jl dmVyc2VkOyAvKiBlcXVhbGl0eSBjb21wYXJlcyBoYXNoIHR5cGUgdG8gcHJvYmUgdHlwZSAq LwoJYm9vbAkJaW5zZXJ0X21vZGU7CS8qIGRvaW5nIGluc2VydHMgb3IgbG9va3Vwcz8gKi8K CWJvb2wJCWhhc2hfdHlwYnl2YWw7CS8qIHR5cGJ5dmFsIG9mIGhhc2hlZCBkYXRhIHR5cGUg Ki8KCWludDE2CQloYXNoX3R5cGxlbjsJLyogdHlwbGVuIG9mIGhhc2hlZCBkYXRhIHR5cGUg Ki8KfSBNQ1ZIYXNoQ29udGV4dDsKCi8qIGZvcndhcmQgcmVmZXJlbmNlICovCnR5cGVkZWYg c3RydWN0IE1DVkhhc2hUYWJsZV9oYXNoIE1DVkhhc2hUYWJsZV9oYXNoOwoKLyogSG9va3Mg Zm9yIHBsdWdpbnMgdG8gZ2V0IGNvbnRyb2wgd2hlbiB3ZSBhc2sgZm9yIHN0YXRzICovCmdl dF9yZWxhdGlvbl9zdGF0c19ob29rX3R5cGUgZ2V0X3JlbGF0aW9uX3N0YXRzX2hvb2sgPSBO VUxMOwpnZXRfaW5kZXhfc3RhdHNfaG9va190eXBlIGdldF9pbmRleF9zdGF0c19ob29rID0g TlVMTDsKCnN0YXRpYyBkb3VibGUgZXFzZWxfaW50ZXJuYWwoUEdfRlVOQ1RJT05fQVJHUywg Ym9vbCBuZWdhdGUpOwpzdGF0aWMgZG91YmxlIGVxam9pbnNlbF9pbm5lcihGbWdySW5mbyAq ZXFwcm9jLCBPaWQgY29sbGF0aW9uLAoJCQkJCQkJICBPaWQgaGFzaExlZnQsIE9pZCBoYXNo UmlnaHQsCgkJCQkJCQkgIFZhcmlhYmxlU3RhdERhdGEgKnZhcmRhdGExLCBWYXJpYWJsZVN0 YXREYXRhICp2YXJkYXRhMiwKCQkJCQkJCSAgZG91YmxlIG5kMSwgZG91YmxlIG5kMiwKCQkJ CQkJCSAgYm9vbCBpc2RlZmF1bHQxLCBib29sIGlzZGVmYXVsdDIsCgkJCQkJCQkgIEF0dFN0 YXRzU2xvdCAqc3Nsb3QxLCBBdHRTdGF0c1Nsb3QgKnNzbG90MiwKCQkJCQkJCSAgRm9ybV9w Z19zdGF0aXN0aWMgc3RhdHMxLCBGb3JtX3BnX3N0YXRpc3RpYyBzdGF0czIsCgkJCQkJCQkg IGJvb2wgaGF2ZV9tY3ZzMSwgYm9vbCBoYXZlX21jdnMyLAoJCQkJCQkJICBib29sICpoYXNt YXRjaDEsIGJvb2wgKmhhc21hdGNoMiwKCQkJCQkJCSAgaW50ICpwX25tYXRjaGVzKTsKc3Rh dGljIGRvdWJsZSBlcWpvaW5zZWxfc2VtaShGbWdySW5mbyAqZXFwcm9jLCBPaWQgY29sbGF0 aW9uLAoJCQkJCQkJIE9pZCBoYXNoTGVmdCwgT2lkIGhhc2hSaWdodCwKCQkJCQkJCSBib29s IG9wX2lzX3JldmVyc2VkLAoJCQkJCQkJIFZhcmlhYmxlU3RhdERhdGEgKnZhcmRhdGExLCBW YXJpYWJsZVN0YXREYXRhICp2YXJkYXRhMiwKCQkJCQkJCSBkb3VibGUgbmQxLCBkb3VibGUg bmQyLAoJCQkJCQkJIGJvb2wgaXNkZWZhdWx0MSwgYm9vbCBpc2RlZmF1bHQyLAoJCQkJCQkJ IEF0dFN0YXRzU2xvdCAqc3Nsb3QxLCBBdHRTdGF0c1Nsb3QgKnNzbG90MiwKCQkJCQkJCSBG b3JtX3BnX3N0YXRpc3RpYyBzdGF0czEsIEZvcm1fcGdfc3RhdGlzdGljIHN0YXRzMiwKCQkJ CQkJCSBib29sIGhhdmVfbWN2czEsIGJvb2wgaGF2ZV9tY3ZzMiwKCQkJCQkJCSBib29sICpo YXNtYXRjaDEsIGJvb2wgKmhhc21hdGNoMiwKCQkJCQkJCSBpbnQgKnBfbm1hdGNoZXMsCgkJ CQkJCQkgUmVsT3B0SW5mbyAqaW5uZXJfcmVsKTsKc3RhdGljIHZvaWQgZXFqb2luc2VsX2Zp bmRfbWF0Y2hlcyhGbWdySW5mbyAqZXFwcm9jLCBPaWQgY29sbGF0aW9uLAoJCQkJCQkJCSAg IE9pZCBoYXNoTGVmdCwgT2lkIGhhc2hSaWdodCwKCQkJCQkJCQkgICBib29sIG9wX2lzX3Jl dmVyc2VkLAoJCQkJCQkJCSAgIEF0dFN0YXRzU2xvdCAqc3Nsb3QxLCBBdHRTdGF0c1Nsb3Qg KnNzbG90MiwKCQkJCQkJCQkgICBpbnQgbnZhbHVlczEsIGludCBudmFsdWVzMiwKCQkJCQkJ CQkgICBib29sICpoYXNtYXRjaDEsIGJvb2wgKmhhc21hdGNoMiwKCQkJCQkJCQkgICBpbnQg KnBfbm1hdGNoZXMsIGRvdWJsZSAqcF9tYXRjaHByb2RmcmVxKTsKc3RhdGljIHVpbnQzMiBo YXNoX21jdihNQ1ZIYXNoVGFibGVfaGFzaCAqdGFiLCBEYXR1bSBrZXkpOwpzdGF0aWMgYm9v bCBtY3ZzX2VxdWFsKE1DVkhhc2hUYWJsZV9oYXNoICp0YWIsIERhdHVtIGtleTAsIERhdHVt IGtleTEpOwpzdGF0aWMgYm9vbCBlc3RpbWF0ZV9tdWx0aXZhcmlhdGVfbmRpc3RpbmN0KFBs YW5uZXJJbmZvICpyb290LAoJCQkJCQkJCQkJCVJlbE9wdEluZm8gKnJlbCwgTGlzdCAqKnZh cmluZm9zLCBkb3VibGUgKm5kaXN0aW5jdCk7CnN0YXRpYyBib29sIGNvbnZlcnRfdG9fc2Nh bGFyKERhdHVtIHZhbHVlLCBPaWQgdmFsdWV0eXBpZCwgT2lkIGNvbGxpZCwKCQkJCQkJCSAg ZG91YmxlICpzY2FsZWR2YWx1ZSwKCQkJCQkJCSAgRGF0dW0gbG9ib3VuZCwgRGF0dW0gaGli b3VuZCwgT2lkIGJvdW5kc3R5cGlkLAoJCQkJCQkJICBkb3VibGUgKnNjYWxlZGxvYm91bmQs IGRvdWJsZSAqc2NhbGVkaGlib3VuZCk7CnN0YXRpYyBkb3VibGUgY29udmVydF9udW1lcmlj X3RvX3NjYWxhcihEYXR1bSB2YWx1ZSwgT2lkIHR5cGlkLCBib29sICpmYWlsdXJlKTsKc3Rh dGljIHZvaWQgY29udmVydF9zdHJpbmdfdG9fc2NhbGFyKGNoYXIgKnZhbHVlLAoJCQkJCQkJ CQkgZG91YmxlICpzY2FsZWR2YWx1ZSwKCQkJCQkJCQkJIGNoYXIgKmxvYm91bmQsCgkJCQkJ CQkJCSBkb3VibGUgKnNjYWxlZGxvYm91bmQsCgkJCQkJCQkJCSBjaGFyICpoaWJvdW5kLAoJ CQkJCQkJCQkgZG91YmxlICpzY2FsZWRoaWJvdW5kKTsKc3RhdGljIHZvaWQgY29udmVydF9i eXRlYV90b19zY2FsYXIoRGF0dW0gdmFsdWUsCgkJCQkJCQkJCWRvdWJsZSAqc2NhbGVkdmFs dWUsCgkJCQkJCQkJCURhdHVtIGxvYm91bmQsCgkJCQkJCQkJCWRvdWJsZSAqc2NhbGVkbG9i b3VuZCwKCQkJCQkJCQkJRGF0dW0gaGlib3VuZCwKCQkJCQkJCQkJZG91YmxlICpzY2FsZWRo aWJvdW5kKTsKc3RhdGljIGRvdWJsZSBjb252ZXJ0X29uZV9zdHJpbmdfdG9fc2NhbGFyKGNo YXIgKnZhbHVlLAoJCQkJCQkJCQkJICAgaW50IHJhbmdlbG8sIGludCByYW5nZWhpKTsKc3Rh dGljIGRvdWJsZSBjb252ZXJ0X29uZV9ieXRlYV90b19zY2FsYXIodW5zaWduZWQgY2hhciAq dmFsdWUsIGludCB2YWx1ZWxlbiwKCQkJCQkJCQkJCSAgaW50IHJhbmdlbG8sIGludCByYW5n ZWhpKTsKc3RhdGljIGNoYXIgKmNvbnZlcnRfc3RyaW5nX2RhdHVtKERhdHVtIHZhbHVlLCBP aWQgdHlwaWQsIE9pZCBjb2xsaWQsCgkJCQkJCQkJICBib29sICpmYWlsdXJlKTsKc3RhdGlj IGRvdWJsZSBjb252ZXJ0X3RpbWV2YWx1ZV90b19zY2FsYXIoRGF0dW0gdmFsdWUsIE9pZCB0 eXBpZCwKCQkJCQkJCQkJCSAgYm9vbCAqZmFpbHVyZSk7CnN0YXRpYyBOb2RlICpzdHJpcF9h bGxfcGh2c19kZWVwKFBsYW5uZXJJbmZvICpyb290LCBOb2RlICpub2RlKTsKc3RhdGljIGJv b2wgY29udGFpbl9wbGFjZWhvbGRlcl93YWxrZXIoTm9kZSAqbm9kZSwgdm9pZCAqY29udGV4 dCk7CnN0YXRpYyBOb2RlICpzdHJpcF9hbGxfcGh2c19tdXRhdG9yKE5vZGUgKm5vZGUsIHZv aWQgKmNvbnRleHQpOwpzdGF0aWMgdm9pZCBleGFtaW5lX3NpbXBsZV92YXJpYWJsZShQbGFu bmVySW5mbyAqcm9vdCwgVmFyICp2YXIsCgkJCQkJCQkJCVZhcmlhYmxlU3RhdERhdGEgKnZh cmRhdGEpOwpzdGF0aWMgdm9pZCBleGFtaW5lX2luZGV4Y29sX3ZhcmlhYmxlKFBsYW5uZXJJ bmZvICpyb290LCBJbmRleE9wdEluZm8gKmluZGV4LAoJCQkJCQkJCQkgIGludCBpbmRleGNv bCwgVmFyaWFibGVTdGF0RGF0YSAqdmFyZGF0YSk7CnN0YXRpYyBib29sIGdldF92YXJpYWJs ZV9yYW5nZShQbGFubmVySW5mbyAqcm9vdCwgVmFyaWFibGVTdGF0RGF0YSAqdmFyZGF0YSwK CQkJCQkJCSAgIE9pZCBzb3J0b3AsIE9pZCBjb2xsYXRpb24sCgkJCQkJCQkgICBEYXR1bSAq bWluLCBEYXR1bSAqbWF4KTsKc3RhdGljIHZvaWQgZ2V0X3N0YXRzX3Nsb3RfcmFuZ2UoQXR0 U3RhdHNTbG90ICpzc2xvdCwKCQkJCQkJCQkgT2lkIG9wZnVuY29pZCwgRm1nckluZm8gKm9w cHJvYywKCQkJCQkJCQkgT2lkIGNvbGxhdGlvbiwgaW50MTYgdHlwTGVuLCBib29sIHR5cEJ5 VmFsLAoJCQkJCQkJCSBEYXR1bSAqbWluLCBEYXR1bSAqbWF4LCBib29sICpwX2hhdmVfZGF0 YSk7CnN0YXRpYyBib29sIGdldF9hY3R1YWxfdmFyaWFibGVfcmFuZ2UoUGxhbm5lckluZm8g KnJvb3QsCgkJCQkJCQkJCSAgVmFyaWFibGVTdGF0RGF0YSAqdmFyZGF0YSwKCQkJCQkJCQkJ ICBPaWQgc29ydG9wLCBPaWQgY29sbGF0aW9uLAoJCQkJCQkJCQkgIERhdHVtICptaW4sIERh dHVtICptYXgpOwpzdGF0aWMgYm9vbCBnZXRfYWN0dWFsX3ZhcmlhYmxlX2VuZHBvaW50KFJl bGF0aW9uIGhlYXBSZWwsCgkJCQkJCQkJCQkgUmVsYXRpb24gaW5kZXhSZWwsCgkJCQkJCQkJ CQkgU2NhbkRpcmVjdGlvbiBpbmRleHNjYW5kaXIsCgkJCQkJCQkJCQkgU2NhbktleSBzY2Fu a2V5cywKCQkJCQkJCQkJCSBpbnQxNiB0eXBMZW4sCgkJCQkJCQkJCQkgYm9vbCB0eXBCeVZh bCwKCQkJCQkJCQkJCSBUdXBsZVRhYmxlU2xvdCAqdGFibGVzbG90LAoJCQkJCQkJCQkJIE1l bW9yeUNvbnRleHQgb3V0ZXJjb250ZXh0LAoJCQkJCQkJCQkJIERhdHVtICplbmRwb2ludERh dHVtKTsKc3RhdGljIFJlbE9wdEluZm8gKmZpbmRfam9pbl9pbnB1dF9yZWwoUGxhbm5lcklu Zm8gKnJvb3QsIFJlbGlkcyByZWxpZHMpOwpzdGF0aWMgZG91YmxlIGJ0Y29zdF9jb3JyZWxh dGlvbihJbmRleE9wdEluZm8gKmluZGV4LAoJCQkJCQkJCSBWYXJpYWJsZVN0YXREYXRhICp2 YXJkYXRhKTsKCi8qIERlZmluZSBzdXBwb3J0IHJvdXRpbmVzIGZvciBNQ1YgaGFzaCB0YWJs ZXMgKi8KI2RlZmluZSBTSF9QUkVGSVgJCQkJTUNWSGFzaFRhYmxlCiNkZWZpbmUgU0hfRUxF TUVOVF9UWVBFCQkJTUNWSGFzaEVudHJ5CiNkZWZpbmUgU0hfS0VZX1RZUEUJCQkJRGF0dW0K I2RlZmluZSBTSF9LRVkJCQkJCXZhbHVlCiNkZWZpbmUgU0hfSEFTSF9LRVkodGFiLGtleSkJ aGFzaF9tY3YodGFiLCBrZXkpCiNkZWZpbmUgU0hfRVFVQUwodGFiLGtleTAsa2V5MSkJbWN2 c19lcXVhbCh0YWIsIGtleTAsIGtleTEpCiNkZWZpbmUgU0hfU0NPUEUJCQkJc3RhdGljIGlu bGluZQojZGVmaW5lIFNIX1NUT1JFX0hBU0gKI2RlZmluZSBTSF9HRVRfSEFTSCh0YWIsZW50 KQkoZW50KS0+aGFzaAojZGVmaW5lIFNIX0RFRklORQojZGVmaW5lIFNIX0RFQ0xBUkUKI2lu Y2x1ZGUgImxpYi9zaW1wbGVoYXNoLmgiCgoKLyoKICoJCWVxc2VsCQkJLSBTZWxlY3Rpdml0 eSBvZiAiPSIgZm9yIGFueSBkYXRhIHR5cGVzLgogKgogKiBOb3RlOiB0aGlzIHJvdXRpbmUg aXMgYWxzbyB1c2VkIHRvIGVzdGltYXRlIHNlbGVjdGl2aXR5IGZvciBzb21lCiAqIG9wZXJh dG9ycyB0aGF0IGFyZSBub3QgIj0iIGJ1dCBoYXZlIGNvbXBhcmFibGUgc2VsZWN0aXZpdHkg YmVoYXZpb3IsCiAqIHN1Y2ggYXMgIn49IiAoZ2VvbWV0cmljIGFwcHJveGltYXRlLW1hdGNo KS4gIEV2ZW4gZm9yICI9Iiwgd2UgbXVzdAogKiBrZWVwIGluIG1pbmQgdGhhdCB0aGUgbGVm dCBhbmQgcmlnaHQgZGF0YXR5cGVzIG1heSBkaWZmZXIuCiAqLwpEYXR1bQplcXNlbChQR19G VU5DVElPTl9BUkdTKQp7CglQR19SRVRVUk5fRkxPQVQ4KChmbG9hdDgpIGVxc2VsX2ludGVy bmFsKGZjaW5mbywgZmFsc2UpKTsKfQoKLyoKICogQ29tbW9uIGNvZGUgZm9yIGVxc2VsKCkg YW5kIG5lcXNlbCgpCiAqLwpzdGF0aWMgZG91YmxlCmVxc2VsX2ludGVybmFsKFBHX0ZVTkNU SU9OX0FSR1MsIGJvb2wgbmVnYXRlKQp7CglQbGFubmVySW5mbyAqcm9vdCA9IChQbGFubmVy SW5mbyAqKSBQR19HRVRBUkdfUE9JTlRFUigwKTsKCU9pZAkJCW9wZXJhdG9yID0gUEdfR0VU QVJHX09JRCgxKTsKCUxpc3QJICAgKmFyZ3MgPSAoTGlzdCAqKSBQR19HRVRBUkdfUE9JTlRF UigyKTsKCWludAkJCXZhclJlbGlkID0gUEdfR0VUQVJHX0lOVDMyKDMpOwoJT2lkCQkJY29s bGF0aW9uID0gUEdfR0VUX0NPTExBVElPTigpOwoJVmFyaWFibGVTdGF0RGF0YSB2YXJkYXRh OwoJTm9kZQkgICAqb3RoZXI7Cglib29sCQl2YXJvbmxlZnQ7Cglkb3VibGUJCXNlbGVjOwoK CS8qCgkgKiBXaGVuIGFza2VkIGFib3V0IDw+LCB3ZSBkbyB0aGUgZXN0aW1hdGlvbiB1c2lu ZyB0aGUgY29ycmVzcG9uZGluZyA9CgkgKiBvcGVyYXRvciwgdGhlbiBjb252ZXJ0IHRvIDw+ IHZpYSAiMS4wIC0gZXFfc2VsZWN0aXZpdHkgLSBudWxsZnJhYyIuCgkgKi8KCWlmIChuZWdh dGUpCgl7CgkJb3BlcmF0b3IgPSBnZXRfbmVnYXRvcihvcGVyYXRvcik7CgkJaWYgKCFPaWRJ c1ZhbGlkKG9wZXJhdG9yKSkKCQl7CgkJCS8qIFVzZSBkZWZhdWx0IHNlbGVjdGl2aXR5IChz aG91bGQgd2UgcmFpc2UgYW4gZXJyb3IgaW5zdGVhZD8pICovCgkJCXJldHVybiAxLjAgLSBE RUZBVUxUX0VRX1NFTDsKCQl9Cgl9CgoJLyoKCSAqIElmIGV4cHJlc3Npb24gaXMgbm90IHZh cmlhYmxlID0gc29tZXRoaW5nIG9yIHNvbWV0aGluZyA9IHZhcmlhYmxlLCB0aGVuCgkgKiBw dW50IGFuZCByZXR1cm4gYSBkZWZhdWx0IGVzdGltYXRlLgoJICovCglpZiAoIWdldF9yZXN0 cmljdGlvbl92YXJpYWJsZShyb290LCBhcmdzLCB2YXJSZWxpZCwKCQkJCQkJCQkgICZ2YXJk YXRhLCAmb3RoZXIsICZ2YXJvbmxlZnQpKQoJCXJldHVybiBuZWdhdGUgPyAoMS4wIC0gREVG QVVMVF9FUV9TRUwpIDogREVGQVVMVF9FUV9TRUw7CgoJLyoKCSAqIFdlIGNhbiBkbyBhIGxv dCBiZXR0ZXIgaWYgdGhlIHNvbWV0aGluZyBpcyBhIGNvbnN0YW50LiAgKE5vdGU6IHRoZQoJ ICogQ29uc3QgbWlnaHQgcmVzdWx0IGZyb20gZXN0aW1hdGlvbiByYXRoZXIgdGhhbiBiZWlu ZyBhIHNpbXBsZSBjb25zdGFudAoJICogaW4gdGhlIHF1ZXJ5LikKCSAqLwoJaWYgKElzQShv dGhlciwgQ29uc3QpKQoJCXNlbGVjID0gdmFyX2VxX2NvbnN0KCZ2YXJkYXRhLCBvcGVyYXRv ciwgY29sbGF0aW9uLAoJCQkJCQkJICgoQ29uc3QgKikgb3RoZXIpLT5jb25zdHZhbHVlLAoJ CQkJCQkJICgoQ29uc3QgKikgb3RoZXIpLT5jb25zdGlzbnVsbCwKCQkJCQkJCSB2YXJvbmxl ZnQsIG5lZ2F0ZSk7CgllbHNlCgkJc2VsZWMgPSB2YXJfZXFfbm9uX2NvbnN0KCZ2YXJkYXRh LCBvcGVyYXRvciwgY29sbGF0aW9uLCBvdGhlciwKCQkJCQkJCQkgdmFyb25sZWZ0LCBuZWdh dGUpOwoKCVJlbGVhc2VWYXJpYWJsZVN0YXRzKHZhcmRhdGEpOwoKCXJldHVybiBzZWxlYzsK fQoKLyoKICogdmFyX2VxX2NvbnN0IC0tLSBlcXNlbCBmb3IgdmFyID0gY29uc3QgY2FzZQog KgogKiBUaGlzIGlzIGV4cG9ydGVkIHNvIHRoYXQgc29tZSBvdGhlciBlc3RpbWF0aW9uIGZ1 bmN0aW9ucyBjYW4gdXNlIGl0LgogKi8KZG91YmxlCnZhcl9lcV9jb25zdChWYXJpYWJsZVN0 YXREYXRhICp2YXJkYXRhLCBPaWQgb3Byb2lkLCBPaWQgY29sbGF0aW9uLAoJCQkgRGF0dW0g Y29uc3R2YWwsIGJvb2wgY29uc3Rpc251bGwsCgkJCSBib29sIHZhcm9ubGVmdCwgYm9vbCBu ZWdhdGUpCnsKCWRvdWJsZQkJc2VsZWM7Cglkb3VibGUJCW51bGxmcmFjID0gMC4wOwoJYm9v bAkJaXNkZWZhdWx0OwoJT2lkCQkJb3BmdW5jb2lkOwoKCS8qCgkgKiBJZiB0aGUgY29uc3Rh bnQgaXMgTlVMTCwgYXNzdW1lIG9wZXJhdG9yIGlzIHN0cmljdCBhbmQgcmV0dXJuIHplcm8s IGllLAoJICogb3BlcmF0b3Igd2lsbCBuZXZlciByZXR1cm4gVFJVRS4gIChJdCdzIHplcm8g ZXZlbiBmb3IgYSBuZWdhdG9yIG9wLikKCSAqLwoJaWYgKGNvbnN0aXNudWxsKQoJCXJldHVy biAwLjA7CgoJLyoKCSAqIEdyYWIgdGhlIG51bGxmcmFjIGZvciB1c2UgYmVsb3cuICBOb3Rl IHdlIGFsbG93IHVzZSBvZiBudWxsZnJhYwoJICogcmVnYXJkbGVzcyBvZiBzZWN1cml0eSBj aGVjay4KCSAqLwoJaWYgKEhlYXBUdXBsZUlzVmFsaWQodmFyZGF0YS0+c3RhdHNUdXBsZSkp Cgl7CgkJRm9ybV9wZ19zdGF0aXN0aWMgc3RhdHM7CgoJCXN0YXRzID0gKEZvcm1fcGdfc3Rh dGlzdGljKSBHRVRTVFJVQ1QodmFyZGF0YS0+c3RhdHNUdXBsZSk7CgkJbnVsbGZyYWMgPSBz dGF0cy0+c3RhbnVsbGZyYWM7Cgl9CgoJLyoKCSAqIElmIHdlIG1hdGNoZWQgdGhlIHZhciB0 byBhIHVuaXF1ZSBpbmRleCwgRElTVElOQ1Qgb3IgR1JPVVAtQlkgY2xhdXNlLAoJICogYXNz dW1lIHRoZXJlIGlzIGV4YWN0bHkgb25lIG1hdGNoIHJlZ2FyZGxlc3Mgb2YgYW55dGhpbmcg ZWxzZS4gIChUaGlzCgkgKiBpcyBzbGlnaHRseSBib2d1cywgc2luY2UgdGhlIGluZGV4IG9y IGNsYXVzZSdzIGVxdWFsaXR5IG9wZXJhdG9yIG1pZ2h0CgkgKiBiZSBkaWZmZXJlbnQgZnJv bSBvdXJzLCBidXQgaXQncyBtdWNoIG1vcmUgbGlrZWx5IHRvIGJlIHJpZ2h0IHRoYW4KCSAq IGlnbm9yaW5nIHRoZSBpbmZvcm1hdGlvbi4pCgkgKi8KCWlmICh2YXJkYXRhLT5pc3VuaXF1 ZSAmJiB2YXJkYXRhLT5yZWwgJiYgdmFyZGF0YS0+cmVsLT50dXBsZXMgPj0gMS4wKQoJewoJ CXNlbGVjID0gMS4wIC8gdmFyZGF0YS0+cmVsLT50dXBsZXM7Cgl9CgllbHNlIGlmIChIZWFw VHVwbGVJc1ZhbGlkKHZhcmRhdGEtPnN0YXRzVHVwbGUpICYmCgkJCSBzdGF0aXN0aWNfcHJv Y19zZWN1cml0eV9jaGVjayh2YXJkYXRhLAoJCQkJCQkJCQkJICAgKG9wZnVuY29pZCA9IGdl dF9vcGNvZGUob3Byb2lkKSkpKQoJewoJCUF0dFN0YXRzU2xvdCBzc2xvdDsKCQlib29sCQlt YXRjaCA9IGZhbHNlOwoJCWludAkJCWk7CgoJCS8qCgkJICogSXMgdGhlIGNvbnN0YW50ICI9 IiB0byBhbnkgb2YgdGhlIGNvbHVtbidzIG1vc3QgY29tbW9uIHZhbHVlcz8KCQkgKiAoQWx0 aG91Z2ggdGhlIGdpdmVuIG9wZXJhdG9yIG1heSBub3QgcmVhbGx5IGJlICI9Iiwgd2Ugd2ls bCBhc3N1bWUKCQkgKiB0aGF0IHNlZWluZyB3aGV0aGVyIGl0IHJldHVybnMgVFJVRSBpcyBh biBhcHByb3ByaWF0ZSB0ZXN0LiAgSWYgeW91CgkJICogZG9uJ3QgbGlrZSB0aGlzLCBtYXli ZSB5b3Ugc2hvdWxkbid0IGJlIHVzaW5nIGVxc2VsIGZvciB5b3VyCgkJICogb3BlcmF0b3Iu Li4pCgkJICovCgkJaWYgKGdldF9hdHRzdGF0c3Nsb3QoJnNzbG90LCB2YXJkYXRhLT5zdGF0 c1R1cGxlLAoJCQkJCQkJIFNUQVRJU1RJQ19LSU5EX01DViwgSW52YWxpZE9pZCwKCQkJCQkJ CSBBVFRTVEFUU1NMT1RfVkFMVUVTIHwgQVRUU1RBVFNTTE9UX05VTUJFUlMpKQoJCXsKCQkJ TE9DQUxfRkNJTkZPKGZjaW5mbywgMik7CgkJCUZtZ3JJbmZvCWVxcHJvYzsKCgkJCWZtZ3Jf aW5mbyhvcGZ1bmNvaWQsICZlcXByb2MpOwoKCQkJLyoKCQkJICogU2F2ZSBhIGZldyBjeWNs ZXMgYnkgc2V0dGluZyB1cCB0aGUgZmNpbmZvIHN0cnVjdCBqdXN0IG9uY2UuCgkJCSAqIFVz aW5nIEZ1bmN0aW9uQ2FsbEludm9rZSBkaXJlY3RseSBhbHNvIGF2b2lkcyBmYWlsdXJlIGlm IHRoZQoJCQkgKiBlcXByb2MgcmV0dXJucyBOVUxMLCB0aG91Z2ggcmVhbGx5IGVxdWFsaXR5 IGZ1bmN0aW9ucyBzaG91bGQKCQkJICogbmV2ZXIgZG8gdGhhdC4KCQkJICovCgkJCUluaXRG dW5jdGlvbkNhbGxJbmZvRGF0YSgqZmNpbmZvLCAmZXFwcm9jLCAyLCBjb2xsYXRpb24sCgkJ CQkJCQkJCSBOVUxMLCBOVUxMKTsKCQkJZmNpbmZvLT5hcmdzWzBdLmlzbnVsbCA9IGZhbHNl OwoJCQlmY2luZm8tPmFyZ3NbMV0uaXNudWxsID0gZmFsc2U7CgkJCS8qIGJlIGNhcmVmdWwg dG8gYXBwbHkgb3BlcmF0b3IgcmlnaHQgd2F5ICdyb3VuZCAqLwoJCQlpZiAodmFyb25sZWZ0 KQoJCQkJZmNpbmZvLT5hcmdzWzFdLnZhbHVlID0gY29uc3R2YWw7CgkJCWVsc2UKCQkJCWZj aW5mby0+YXJnc1swXS52YWx1ZSA9IGNvbnN0dmFsOwoKCQkJZm9yIChpID0gMDsgaSA8IHNz bG90Lm52YWx1ZXM7IGkrKykKCQkJewoJCQkJRGF0dW0JCWZyZXN1bHQ7CgoJCQkJaWYgKHZh cm9ubGVmdCkKCQkJCQlmY2luZm8tPmFyZ3NbMF0udmFsdWUgPSBzc2xvdC52YWx1ZXNbaV07 CgkJCQllbHNlCgkJCQkJZmNpbmZvLT5hcmdzWzFdLnZhbHVlID0gc3Nsb3QudmFsdWVzW2ld OwoJCQkJZmNpbmZvLT5pc251bGwgPSBmYWxzZTsKCQkJCWZyZXN1bHQgPSBGdW5jdGlvbkNh bGxJbnZva2UoZmNpbmZvKTsKCQkJCWlmICghZmNpbmZvLT5pc251bGwgJiYgRGF0dW1HZXRC b29sKGZyZXN1bHQpKQoJCQkJewoJCQkJCW1hdGNoID0gdHJ1ZTsKCQkJCQlicmVhazsKCQkJ CX0KCQkJfQoJCX0KCQllbHNlCgkJewoJCQkvKiBubyBtb3N0LWNvbW1vbi12YWx1ZSBpbmZv IGF2YWlsYWJsZSAqLwoJCQlpID0gMDsJCQkJLyoga2VlcCBjb21waWxlciBxdWlldCAqLwoJ CX0KCgkJaWYgKG1hdGNoKQoJCXsKCQkJLyoKCQkJICogQ29uc3RhbnQgaXMgIj0iIHRvIHRo aXMgY29tbW9uIHZhbHVlLiAgV2Uga25vdyBzZWxlY3Rpdml0eQoJCQkgKiBleGFjdGx5IChv ciBhcyBleGFjdGx5IGFzIEFOQUxZWkUgY291bGQgY2FsY3VsYXRlIGl0LCBhbnl3YXkpLgoJ CQkgKi8KCQkJc2VsZWMgPSBzc2xvdC5udW1iZXJzW2ldOwoJCX0KCQllbHNlCgkJewoJCQkv KgoJCQkgKiBDb21wYXJpc29uIGlzIGFnYWluc3QgYSBjb25zdGFudCB0aGF0IGlzIG5laXRo ZXIgTlVMTCBub3IgYW55CgkJCSAqIG9mIHRoZSBjb21tb24gdmFsdWVzLiAgSXRzIHNlbGVj dGl2aXR5IGNhbm5vdCBiZSBtb3JlIHRoYW4KCQkJICogdGhpczoKCQkJICovCgkJCWRvdWJs ZQkJc3VtY29tbW9uID0gMC4wOwoJCQlkb3VibGUJCW90aGVyZGlzdGluY3Q7CgoJCQlmb3Ig KGkgPSAwOyBpIDwgc3Nsb3Qubm51bWJlcnM7IGkrKykKCQkJCXN1bWNvbW1vbiArPSBzc2xv dC5udW1iZXJzW2ldOwoJCQlzZWxlYyA9IDEuMCAtIHN1bWNvbW1vbiAtIG51bGxmcmFjOwoJ CQlDTEFNUF9QUk9CQUJJTElUWShzZWxlYyk7CgoJCQkvKgoJCQkgKiBhbmQgaW4gZmFjdCBp dCdzIHByb2JhYmx5IGEgZ29vZCBkZWFsIGxlc3MuIFdlIGFwcHJveGltYXRlIHRoYXQKCQkJ ICogYWxsIHRoZSBub3QtY29tbW9uIHZhbHVlcyBzaGFyZSB0aGlzIHJlbWFpbmluZyBmcmFj dGlvbgoJCQkgKiBlcXVhbGx5LCBzbyB3ZSBkaXZpZGUgYnkgdGhlIG51bWJlciBvZiBvdGhl ciBkaXN0aW5jdCB2YWx1ZXMuCgkJCSAqLwoJCQlvdGhlcmRpc3RpbmN0ID0gZ2V0X3Zhcmlh YmxlX251bWRpc3RpbmN0KHZhcmRhdGEsICZpc2RlZmF1bHQpIC0KCQkJCXNzbG90Lm5udW1i ZXJzOwoJCQlpZiAob3RoZXJkaXN0aW5jdCA+IDEpCgkJCQlzZWxlYyAvPSBvdGhlcmRpc3Rp bmN0OwoKCQkJLyoKCQkJICogQW5vdGhlciBjcm9zcy1jaGVjazogc2VsZWN0aXZpdHkgc2hv dWxkbid0IGJlIGVzdGltYXRlZCBhcyBtb3JlCgkJCSAqIHRoYW4gdGhlIGxlYXN0IGNvbW1v biAibW9zdCBjb21tb24gdmFsdWUiLgoJCQkgKi8KCQkJaWYgKHNzbG90Lm5udW1iZXJzID4g MCAmJiBzZWxlYyA+IHNzbG90Lm51bWJlcnNbc3Nsb3Qubm51bWJlcnMgLSAxXSkKCQkJCXNl bGVjID0gc3Nsb3QubnVtYmVyc1tzc2xvdC5ubnVtYmVycyAtIDFdOwoJCX0KCgkJZnJlZV9h dHRzdGF0c3Nsb3QoJnNzbG90KTsKCX0KCWVsc2UKCXsKCQkvKgoJCSAqIE5vIEFOQUxZWkUg c3RhdHMgYXZhaWxhYmxlLCBzbyBtYWtlIGEgZ3Vlc3MgdXNpbmcgZXN0aW1hdGVkIG51bWJl cgoJCSAqIG9mIGRpc3RpbmN0IHZhbHVlcyBhbmQgYXNzdW1pbmcgdGhleSBhcmUgZXF1YWxs eSBjb21tb24uIChUaGUgZ3Vlc3MKCQkgKiBpcyB1bmxpa2VseSB0byBiZSB2ZXJ5IGdvb2Qs IGJ1dCB3ZSBkbyBrbm93IGEgZmV3IHNwZWNpYWwgY2FzZXMuKQoJCSAqLwoJCXNlbGVjID0g MS4wIC8gZ2V0X3ZhcmlhYmxlX251bWRpc3RpbmN0KHZhcmRhdGEsICZpc2RlZmF1bHQpOwoJ fQoKCS8qIG5vdyBhZGp1c3QgaWYgd2Ugd2FudGVkIDw+IHJhdGhlciB0aGFuID0gKi8KCWlm IChuZWdhdGUpCgkJc2VsZWMgPSAxLjAgLSBzZWxlYyAtIG51bGxmcmFjOwoKCS8qIHJlc3Vs dCBzaG91bGQgYmUgaW4gcmFuZ2UsIGJ1dCBtYWtlIHN1cmUuLi4gKi8KCUNMQU1QX1BST0JB QklMSVRZKHNlbGVjKTsKCglyZXR1cm4gc2VsZWM7Cn0KCi8qCiAqIHZhcl9lcV9ub25fY29u c3QgLS0tIGVxc2VsIGZvciB2YXIgPSBzb21ldGhpbmctb3RoZXItdGhhbi1jb25zdCBjYXNl CiAqCiAqIFRoaXMgaXMgZXhwb3J0ZWQgc28gdGhhdCBzb21lIG90aGVyIGVzdGltYXRpb24g ZnVuY3Rpb25zIGNhbiB1c2UgaXQuCiAqLwpkb3VibGUKdmFyX2VxX25vbl9jb25zdChWYXJp YWJsZVN0YXREYXRhICp2YXJkYXRhLCBPaWQgb3Byb2lkLCBPaWQgY29sbGF0aW9uLAoJCQkJ IE5vZGUgKm90aGVyLAoJCQkJIGJvb2wgdmFyb25sZWZ0LCBib29sIG5lZ2F0ZSkKewoJZG91 YmxlCQlzZWxlYzsKCWRvdWJsZQkJbnVsbGZyYWMgPSAwLjA7Cglib29sCQlpc2RlZmF1bHQ7 CgoJLyoKCSAqIEdyYWIgdGhlIG51bGxmcmFjIGZvciB1c2UgYmVsb3cuCgkgKi8KCWlmIChI ZWFwVHVwbGVJc1ZhbGlkKHZhcmRhdGEtPnN0YXRzVHVwbGUpKQoJewoJCUZvcm1fcGdfc3Rh dGlzdGljIHN0YXRzOwoKCQlzdGF0cyA9IChGb3JtX3BnX3N0YXRpc3RpYykgR0VUU1RSVUNU KHZhcmRhdGEtPnN0YXRzVHVwbGUpOwoJCW51bGxmcmFjID0gc3RhdHMtPnN0YW51bGxmcmFj OwoJfQoKCS8qCgkgKiBJZiB3ZSBtYXRjaGVkIHRoZSB2YXIgdG8gYSB1bmlxdWUgaW5kZXgs IERJU1RJTkNUIG9yIEdST1VQLUJZIGNsYXVzZSwKCSAqIGFzc3VtZSB0aGVyZSBpcyBleGFj dGx5IG9uZSBtYXRjaCByZWdhcmRsZXNzIG9mIGFueXRoaW5nIGVsc2UuICAoVGhpcwoJICog aXMgc2xpZ2h0bHkgYm9ndXMsIHNpbmNlIHRoZSBpbmRleCBvciBjbGF1c2UncyBlcXVhbGl0 eSBvcGVyYXRvciBtaWdodAoJICogYmUgZGlmZmVyZW50IGZyb20gb3VycywgYnV0IGl0J3Mg bXVjaCBtb3JlIGxpa2VseSB0byBiZSByaWdodCB0aGFuCgkgKiBpZ25vcmluZyB0aGUgaW5m b3JtYXRpb24uKQoJICovCglpZiAodmFyZGF0YS0+aXN1bmlxdWUgJiYgdmFyZGF0YS0+cmVs ICYmIHZhcmRhdGEtPnJlbC0+dHVwbGVzID49IDEuMCkKCXsKCQlzZWxlYyA9IDEuMCAvIHZh cmRhdGEtPnJlbC0+dHVwbGVzOwoJfQoJZWxzZSBpZiAoSGVhcFR1cGxlSXNWYWxpZCh2YXJk YXRhLT5zdGF0c1R1cGxlKSkKCXsKCQlkb3VibGUJCW5kaXN0aW5jdDsKCQlBdHRTdGF0c1Ns b3Qgc3Nsb3Q7CgoJCS8qCgkJICogU2VhcmNoIGlzIGZvciBhIHZhbHVlIHRoYXQgd2UgZG8g bm90IGtub3cgYSBwcmlvcmksIGJ1dCB3ZSB3aWxsCgkJICogYXNzdW1lIGl0IGlzIG5vdCBO VUxMLiAgRXN0aW1hdGUgdGhlIHNlbGVjdGl2aXR5IGFzIG5vbi1udWxsCgkJICogZnJhY3Rp b24gZGl2aWRlZCBieSBudW1iZXIgb2YgZGlzdGluY3QgdmFsdWVzLCBzbyB0aGF0IHdlIGdl dCBhCgkJICogcmVzdWx0IGF2ZXJhZ2VkIG92ZXIgYWxsIHBvc3NpYmxlIHZhbHVlcyB3aGV0 aGVyIGNvbW1vbiBvcgoJCSAqIHVuY29tbW9uLiAgKEVzc2VudGlhbGx5LCB3ZSBhcmUgYXNz dW1pbmcgdGhhdCB0aGUgbm90LXlldC1rbm93bgoJCSAqIGNvbXBhcmlzb24gdmFsdWUgaXMg ZXF1YWxseSBsaWtlbHkgdG8gYmUgYW55IG9mIHRoZSBwb3NzaWJsZQoJCSAqIHZhbHVlcywg cmVnYXJkbGVzcyBvZiB0aGVpciBmcmVxdWVuY3kgaW4gdGhlIHRhYmxlLiAgSXMgdGhhdCBh IGdvb2QKCQkgKiBpZGVhPykKCQkgKi8KCQlzZWxlYyA9IDEuMCAtIG51bGxmcmFjOwoJCW5k aXN0aW5jdCA9IGdldF92YXJpYWJsZV9udW1kaXN0aW5jdCh2YXJkYXRhLCAmaXNkZWZhdWx0 KTsKCQlpZiAobmRpc3RpbmN0ID4gMSkKCQkJc2VsZWMgLz0gbmRpc3RpbmN0OwoKCQkvKgoJ CSAqIENyb3NzLWNoZWNrOiBzZWxlY3Rpdml0eSBzaG91bGQgbmV2ZXIgYmUgZXN0aW1hdGVk IGFzIG1vcmUgdGhhbiB0aGUKCQkgKiBtb3N0IGNvbW1vbiB2YWx1ZSdzLgoJCSAqLwoJCWlm IChnZXRfYXR0c3RhdHNzbG90KCZzc2xvdCwgdmFyZGF0YS0+c3RhdHNUdXBsZSwKCQkJCQkJ CSBTVEFUSVNUSUNfS0lORF9NQ1YsIEludmFsaWRPaWQsCgkJCQkJCQkgQVRUU1RBVFNTTE9U X05VTUJFUlMpKQoJCXsKCQkJaWYgKHNzbG90Lm5udW1iZXJzID4gMCAmJiBzZWxlYyA+IHNz bG90Lm51bWJlcnNbMF0pCgkJCQlzZWxlYyA9IHNzbG90Lm51bWJlcnNbMF07CgkJCWZyZWVf YXR0c3RhdHNzbG90KCZzc2xvdCk7CgkJfQoJfQoJZWxzZQoJewoJCS8qCgkJICogTm8gQU5B TFlaRSBzdGF0cyBhdmFpbGFibGUsIHNvIG1ha2UgYSBndWVzcyB1c2luZyBlc3RpbWF0ZWQg bnVtYmVyCgkJICogb2YgZGlzdGluY3QgdmFsdWVzIGFuZCBhc3N1bWluZyB0aGV5IGFyZSBl cXVhbGx5IGNvbW1vbi4gKFRoZSBndWVzcwoJCSAqIGlzIHVubGlrZWx5IHRvIGJlIHZlcnkg Z29vZCwgYnV0IHdlIGRvIGtub3cgYSBmZXcgc3BlY2lhbCBjYXNlcy4pCgkJICovCgkJc2Vs ZWMgPSAxLjAgLyBnZXRfdmFyaWFibGVfbnVtZGlzdGluY3QodmFyZGF0YSwgJmlzZGVmYXVs dCk7Cgl9CgoJLyogbm93IGFkanVzdCBpZiB3ZSB3YW50ZWQgPD4gcmF0aGVyIHRoYW4gPSAq LwoJaWYgKG5lZ2F0ZSkKCQlzZWxlYyA9IDEuMCAtIHNlbGVjIC0gbnVsbGZyYWM7CgoJLyog cmVzdWx0IHNob3VsZCBiZSBpbiByYW5nZSwgYnV0IG1ha2Ugc3VyZS4uLiAqLwoJQ0xBTVBf UFJPQkFCSUxJVFkoc2VsZWMpOwoKCXJldHVybiBzZWxlYzsKfQoKLyoKICoJCW5lcXNlbAkJ CS0gU2VsZWN0aXZpdHkgb2YgIiE9IiBmb3IgYW55IGRhdGEgdHlwZXMuCiAqCiAqIFRoaXMg cm91dGluZSBpcyBhbHNvIHVzZWQgZm9yIHNvbWUgb3BlcmF0b3JzIHRoYXQgYXJlIG5vdCAi IT0iCiAqIGJ1dCBoYXZlIGNvbXBhcmFibGUgc2VsZWN0aXZpdHkgYmVoYXZpb3IuICBTZWUg YWJvdmUgY29tbWVudHMKICogZm9yIGVxc2VsKCkuCiAqLwpEYXR1bQpuZXFzZWwoUEdfRlVO Q1RJT05fQVJHUykKewoJUEdfUkVUVVJOX0ZMT0FUOCgoZmxvYXQ4KSBlcXNlbF9pbnRlcm5h bChmY2luZm8sIHRydWUpKTsKfQoKLyoKICoJc2NhbGFyaW5lcXNlbAkJLSBTZWxlY3Rpdml0 eSBvZiAiPCIsICI8PSIsICI+IiwgIj49IiBmb3Igc2NhbGFycy4KICoKICogVGhpcyBpcyB0 aGUgZ3V0cyBvZiBzY2FsYXJsdHNlbC9zY2FsYXJsZXNlbC9zY2FsYXJndHNlbC9zY2FsYXJn ZXNlbC4KICogVGhlIGlzZ3QgYW5kIGlzZXEgZmxhZ3MgZGlzdGluZ3Vpc2ggd2hpY2ggb2Yg dGhlIGZvdXIgY2FzZXMgYXBwbHkuCiAqCiAqIFRoZSBjYWxsZXIgaGFzIGNvbW11dGVkIHRo ZSBjbGF1c2UsIGlmIG5lY2Vzc2FyeSwgc28gdGhhdCB3ZSBjYW4gdHJlYXQKICogdGhlIHZh cmlhYmxlIGFzIGJlaW5nIG9uIHRoZSBsZWZ0LiAgVGhlIGNhbGxlciBtdXN0IGFsc28gbWFr ZSBzdXJlIHRoYXQKICogdGhlIG90aGVyIHNpZGUgb2YgdGhlIGNsYXVzZSBpcyBhIG5vbi1u dWxsIENvbnN0LCBhbmQgZGlzc2VjdCB0aGF0IGludG8KICogYSB2YWx1ZSBhbmQgZGF0YXR5 cGUuICAoVGhpcyBkZWZpbml0aW9uIHNpbXBsaWZpZXMgc29tZSBjYWxsZXJzIHRoYXQKICog d2FudCB0byBlc3RpbWF0ZSBhZ2FpbnN0IGEgY29tcHV0ZWQgdmFsdWUgaW5zdGVhZCBvZiBh IENvbnN0IG5vZGUuKQogKgogKiBUaGlzIHJvdXRpbmUgd29ya3MgZm9yIGFueSBkYXRhdHlw ZSAob3IgcGFpciBvZiBkYXRhdHlwZXMpIGtub3duIHRvCiAqIGNvbnZlcnRfdG9fc2NhbGFy KCkuICBJZiBpdCBpcyBhcHBsaWVkIHRvIHNvbWUgb3RoZXIgZGF0YXR5cGUsCiAqIGl0IHdp bGwgcmV0dXJuIGFuIGFwcHJveGltYXRlIGVzdGltYXRlIGJhc2VkIG9uIGFzc3VtaW5nIHRo YXQgdGhlIGNvbnN0YW50CiAqIHZhbHVlIGZhbGxzIGluIHRoZSBtaWRkbGUgb2YgdGhlIGJp biBpZGVudGlmaWVkIGJ5IGJpbmFyeSBzZWFyY2guCiAqLwpzdGF0aWMgZG91YmxlCnNjYWxh cmluZXFzZWwoUGxhbm5lckluZm8gKnJvb3QsIE9pZCBvcGVyYXRvciwgYm9vbCBpc2d0LCBi b29sIGlzZXEsCgkJCSAgT2lkIGNvbGxhdGlvbiwKCQkJICBWYXJpYWJsZVN0YXREYXRhICp2 YXJkYXRhLCBEYXR1bSBjb25zdHZhbCwgT2lkIGNvbnN0dHlwZSkKewoJRm9ybV9wZ19zdGF0 aXN0aWMgc3RhdHM7CglGbWdySW5mbwlvcHByb2M7Cglkb3VibGUJCW1jdl9zZWxlYywKCQkJ CWhpc3Rfc2VsZWMsCgkJCQlzdW1jb21tb247Cglkb3VibGUJCXNlbGVjOwoKCWlmICghSGVh cFR1cGxlSXNWYWxpZCh2YXJkYXRhLT5zdGF0c1R1cGxlKSkKCXsKCQkvKgoJCSAqIE5vIHN0 YXRzIGFyZSBhdmFpbGFibGUuICBUeXBpY2FsbHkgdGhpcyBtZWFucyB3ZSBoYXZlIHRvIGZh bGwgYmFjawoJCSAqIG9uIHRoZSBkZWZhdWx0IGVzdGltYXRlOyBidXQgaWYgdGhlIHZhcmlh YmxlIGlzIENUSUQgdGhlbiB3ZSBjYW4KCQkgKiBtYWtlIGFuIGVzdGltYXRlIGJhc2VkIG9u IGNvbXBhcmluZyB0aGUgY29uc3RhbnQgdG8gdGhlIHRhYmxlIHNpemUuCgkJICovCgkJaWYg KHZhcmRhdGEtPnZhciAmJiBJc0EodmFyZGF0YS0+dmFyLCBWYXIpICYmCgkJCSgoVmFyICop IHZhcmRhdGEtPnZhciktPnZhcmF0dG5vID09IFNlbGZJdGVtUG9pbnRlckF0dHJpYnV0ZU51 bWJlcikKCQl7CgkJCUl0ZW1Qb2ludGVyIGl0ZW1wdHI7CgkJCWRvdWJsZQkJYmxvY2s7CgkJ CWRvdWJsZQkJZGVuc2l0eTsKCgkJCS8qCgkJCSAqIElmIHRoZSByZWxhdGlvbidzIGVtcHR5 LCB3ZSdyZSBnb2luZyB0byBpbmNsdWRlIGFsbCBvZiBpdC4KCQkJICogKFRoaXMgaXMgbW9z dGx5IHRvIGF2b2lkIGRpdmlkZS1ieS16ZXJvIGJlbG93LikKCQkJICovCgkJCWlmICh2YXJk YXRhLT5yZWwtPnBhZ2VzID09IDApCgkJCQlyZXR1cm4gMS4wOwoKCQkJaXRlbXB0ciA9IChJ dGVtUG9pbnRlcikgRGF0dW1HZXRQb2ludGVyKGNvbnN0dmFsKTsKCQkJYmxvY2sgPSBJdGVt UG9pbnRlckdldEJsb2NrTnVtYmVyTm9DaGVjayhpdGVtcHRyKTsKCgkJCS8qCgkJCSAqIERl dGVybWluZSB0aGUgYXZlcmFnZSBudW1iZXIgb2YgdHVwbGVzIHBlciBwYWdlIChkZW5zaXR5 KS4KCQkJICoKCQkJICogU2luY2UgdGhlIGxhc3QgcGFnZSB3aWxsLCBvbiBhdmVyYWdlLCBi ZSBvbmx5IGhhbGYgZnVsbCwgd2UgY2FuCgkJCSAqIGVzdGltYXRlIGl0IHRvIGhhdmUgaGFs ZiBhcyBtYW55IHR1cGxlcyBhcyBlYXJsaWVyIHBhZ2VzLiAgU28KCQkJICogZ2l2ZSBpdCBo YWxmIHRoZSB3ZWlnaHQgb2YgYSByZWd1bGFyIHBhZ2UuCgkJCSAqLwoJCQlkZW5zaXR5ID0g dmFyZGF0YS0+cmVsLT50dXBsZXMgLyAodmFyZGF0YS0+cmVsLT5wYWdlcyAtIDAuNSk7CgoJ CQkvKiBJZiB0YXJnZXQgaXMgdGhlIGxhc3QgcGFnZSwgdXNlIGhhbGYgdGhlIGRlbnNpdHku ICovCgkJCWlmIChibG9jayA+PSB2YXJkYXRhLT5yZWwtPnBhZ2VzIC0gMSkKCQkJCWRlbnNp dHkgKj0gMC41OwoKCQkJLyoKCQkJICogVXNpbmcgdGhlIGF2ZXJhZ2UgdHVwbGVzIHBlciBw YWdlLCBjYWxjdWxhdGUgaG93IGZhciBpbnRvIHRoZQoJCQkgKiBwYWdlIHRoZSBpdGVtcHRy IGlzIGxpa2VseSB0byBiZSBhbmQgYWRqdXN0IGJsb2NrIGFjY29yZGluZ2x5LAoJCQkgKiBi eSBhZGRpbmcgdGhhdCBmcmFjdGlvbiBvZiBhIHdob2xlIGJsb2NrIChidXQgbmV2ZXIgbW9y ZSB0aGFuIGEKCQkJICogd2hvbGUgYmxvY2ssIG5vIG1hdHRlciBob3cgaGlnaCB0aGUgaXRl bXB0cidzIG9mZnNldCBpcykuICBIZXJlCgkJCSAqIHdlIGFyZSBpZ25vcmluZyB0aGUgcG9z c2liaWxpdHkgb2YgZGVhZC10dXBsZSBsaW5lIHBvaW50ZXJzLAoJCQkgKiB3aGljaCBpcyBm YWlybHkgYm9ndXMsIGJ1dCB3ZSBsYWNrIHRoZSBpbmZvIHRvIGRvIGJldHRlci4KCQkJICov CgkJCWlmIChkZW5zaXR5ID4gMC4wKQoJCQl7CgkJCQlPZmZzZXROdW1iZXIgb2Zmc2V0ID0g SXRlbVBvaW50ZXJHZXRPZmZzZXROdW1iZXJOb0NoZWNrKGl0ZW1wdHIpOwoKCQkJCWJsb2Nr ICs9IE1pbihvZmZzZXQgLyBkZW5zaXR5LCAxLjApOwoJCQl9CgoJCQkvKgoJCQkgKiBDb252 ZXJ0IHJlbGF0aXZlIGJsb2NrIG51bWJlciB0byBzZWxlY3Rpdml0eS4gIEFnYWluLCB0aGUg bGFzdAoJCQkgKiBwYWdlIGhhcyBvbmx5IGhhbGYgd2VpZ2h0LgoJCQkgKi8KCQkJc2VsZWMg PSBibG9jayAvICh2YXJkYXRhLT5yZWwtPnBhZ2VzIC0gMC41KTsKCgkJCS8qCgkJCSAqIFRo ZSBjYWxjdWxhdGlvbiBzbyBmYXIgZ2F2ZSB1cyBhIHNlbGVjdGl2aXR5IGZvciB0aGUgIjw9 IiBjYXNlLgoJCQkgKiBXZSdsbCBoYXZlIG9uZSBmZXdlciB0dXBsZSBmb3IgIjwiIGFuZCBv bmUgYWRkaXRpb25hbCB0dXBsZSBmb3IKCQkJICogIj49IiwgdGhlIGxhdHRlciBvZiB3aGlj aCB3ZSdsbCByZXZlcnNlIHRoZSBzZWxlY3Rpdml0eSBmb3IKCQkJICogYmVsb3csIHNvIHdl IGNhbiBzaW1wbHkgc3VidHJhY3Qgb25lIHR1cGxlIGZvciBib3RoIGNhc2VzLiAgVGhlCgkJ CSAqIGNhc2VzIHRoYXQgbmVlZCB0aGlzIGFkanVzdG1lbnQgY2FuIGJlIGlkZW50aWZpZWQg YnkgaXNlcSBiZWluZwoJCQkgKiBlcXVhbCB0byBpc2d0LgoJCQkgKi8KCQkJaWYgKGlzZXEg PT0gaXNndCAmJiB2YXJkYXRhLT5yZWwtPnR1cGxlcyA+PSAxLjApCgkJCQlzZWxlYyAtPSAo MS4wIC8gdmFyZGF0YS0+cmVsLT50dXBsZXMpOwoKCQkJLyogRmluYWxseSwgcmV2ZXJzZSB0 aGUgc2VsZWN0aXZpdHkgZm9yIHRoZSAiPiIsICI+PSIgY2FzZXMuICovCgkJCWlmIChpc2d0 KQoJCQkJc2VsZWMgPSAxLjAgLSBzZWxlYzsKCgkJCUNMQU1QX1BST0JBQklMSVRZKHNlbGVj KTsKCQkJcmV0dXJuIHNlbGVjOwoJCX0KCgkJLyogbm8gc3RhdHMgYXZhaWxhYmxlLCBzbyBk ZWZhdWx0IHJlc3VsdCAqLwoJCXJldHVybiBERUZBVUxUX0lORVFfU0VMOwoJfQoJc3RhdHMg PSAoRm9ybV9wZ19zdGF0aXN0aWMpIEdFVFNUUlVDVCh2YXJkYXRhLT5zdGF0c1R1cGxlKTsK CglmbWdyX2luZm8oZ2V0X29wY29kZShvcGVyYXRvciksICZvcHByb2MpOwoKCS8qCgkgKiBJ ZiB3ZSBoYXZlIG1vc3QtY29tbW9uLXZhbHVlcyBpbmZvLCBhZGQgdXAgdGhlIGZyYWN0aW9u cyBvZiB0aGUgTUNWCgkgKiBlbnRyaWVzIHRoYXQgc2F0aXNmeSBNQ1YgT1AgQ09OU1QuICBU aGVzZSBmcmFjdGlvbnMgY29udHJpYnV0ZSBkaXJlY3RseQoJICogdG8gdGhlIHJlc3VsdCBz ZWxlY3Rpdml0eS4gIEFsc28gYWRkIHVwIHRoZSB0b3RhbCBmcmFjdGlvbiByZXByZXNlbnRl ZAoJICogYnkgTUNWIGVudHJpZXMuCgkgKi8KCW1jdl9zZWxlYyA9IG1jdl9zZWxlY3Rpdml0 eSh2YXJkYXRhLCAmb3Bwcm9jLCBjb2xsYXRpb24sIGNvbnN0dmFsLCB0cnVlLAoJCQkJCQkJ CSZzdW1jb21tb24pOwoKCS8qCgkgKiBJZiB0aGVyZSBpcyBhIGhpc3RvZ3JhbSwgZGV0ZXJt aW5lIHdoaWNoIGJpbiB0aGUgY29uc3RhbnQgZmFsbHMgaW4sIGFuZAoJICogY29tcHV0ZSB0 aGUgcmVzdWx0aW5nIGNvbnRyaWJ1dGlvbiB0byBzZWxlY3Rpdml0eS4KCSAqLwoJaGlzdF9z ZWxlYyA9IGluZXFfaGlzdG9ncmFtX3NlbGVjdGl2aXR5KHJvb3QsIHZhcmRhdGEsCgkJCQkJ CQkJCQkJb3BlcmF0b3IsICZvcHByb2MsIGlzZ3QsIGlzZXEsCgkJCQkJCQkJCQkJY29sbGF0 aW9uLAoJCQkJCQkJCQkJCWNvbnN0dmFsLCBjb25zdHR5cGUpOwoKCS8qCgkgKiBOb3cgbWVy Z2UgdGhlIHJlc3VsdHMgZnJvbSB0aGUgTUNWIGFuZCBoaXN0b2dyYW0gY2FsY3VsYXRpb25z LAoJICogcmVhbGl6aW5nIHRoYXQgdGhlIGhpc3RvZ3JhbSBjb3ZlcnMgb25seSB0aGUgbm9u LW51bGwgdmFsdWVzIHRoYXQgYXJlCgkgKiBub3QgbGlzdGVkIGluIE1DVi4KCSAqLwoJc2Vs ZWMgPSAxLjAgLSBzdGF0cy0+c3RhbnVsbGZyYWMgLSBzdW1jb21tb247CgoJaWYgKGhpc3Rf c2VsZWMgPj0gMC4wKQoJCXNlbGVjICo9IGhpc3Rfc2VsZWM7CgllbHNlCgl7CgkJLyoKCQkg KiBJZiBubyBoaXN0b2dyYW0gYnV0IHRoZXJlIGFyZSB2YWx1ZXMgbm90IGFjY291bnRlZCBm b3IgYnkgTUNWLAoJCSAqIGFyYml0cmFyaWx5IGFzc3VtZSBoYWxmIG9mIHRoZW0gd2lsbCBt YXRjaC4KCQkgKi8KCQlzZWxlYyAqPSAwLjU7Cgl9CgoJc2VsZWMgKz0gbWN2X3NlbGVjOwoK CS8qIHJlc3VsdCBzaG91bGQgYmUgaW4gcmFuZ2UsIGJ1dCBtYWtlIHN1cmUuLi4gKi8KCUNM QU1QX1BST0JBQklMSVRZKHNlbGVjKTsKCglyZXR1cm4gc2VsZWM7Cn0KCi8qCiAqCW1jdl9z ZWxlY3Rpdml0eQkJCS0gRXhhbWluZSB0aGUgTUNWIGxpc3QgZm9yIHNlbGVjdGl2aXR5IGVz dGltYXRlcwogKgogKiBEZXRlcm1pbmUgdGhlIGZyYWN0aW9uIG9mIHRoZSB2YXJpYWJsZSdz IE1DViBwb3B1bGF0aW9uIHRoYXQgc2F0aXNmaWVzCiAqIHRoZSBwcmVkaWNhdGUgKFZBUiBP UCBDT05TVCksIG9yIChDT05TVCBPUCBWQVIpIGlmICF2YXJvbmxlZnQuICBBbHNvCiAqIGNv bXB1dGUgdGhlIGZyYWN0aW9uIG9mIHRoZSB0b3RhbCBjb2x1bW4gcG9wdWxhdGlvbiByZXBy ZXNlbnRlZCBieSB0aGUgTUNWCiAqIGxpc3QuICBUaGlzIGNvZGUgd2lsbCB3b3JrIGZvciBh bnkgYm9vbGVhbi1yZXR1cm5pbmcgcHJlZGljYXRlIG9wZXJhdG9yLgogKgogKiBUaGUgZnVu Y3Rpb24gcmVzdWx0IGlzIHRoZSBNQ1Ygc2VsZWN0aXZpdHksIGFuZCB0aGUgZnJhY3Rpb24g b2YgdGhlCiAqIHRvdGFsIHBvcHVsYXRpb24gaXMgcmV0dXJuZWQgaW50byAqc3VtY29tbW9u cC4gIFplcm9lcyBhcmUgcmV0dXJuZWQKICogaWYgdGhlcmUgaXMgbm8gTUNWIGxpc3QuCiAq Lwpkb3VibGUKbWN2X3NlbGVjdGl2aXR5KFZhcmlhYmxlU3RhdERhdGEgKnZhcmRhdGEsIEZt Z3JJbmZvICpvcHByb2MsIE9pZCBjb2xsYXRpb24sCgkJCQlEYXR1bSBjb25zdHZhbCwgYm9v bCB2YXJvbmxlZnQsCgkJCQlkb3VibGUgKnN1bWNvbW1vbnApCnsKCWRvdWJsZQkJbWN2X3Nl bGVjLAoJCQkJc3VtY29tbW9uOwoJQXR0U3RhdHNTbG90IHNzbG90OwoJaW50CQkJaTsKCglt Y3Zfc2VsZWMgPSAwLjA7CglzdW1jb21tb24gPSAwLjA7CgoJaWYgKEhlYXBUdXBsZUlzVmFs aWQodmFyZGF0YS0+c3RhdHNUdXBsZSkgJiYKCQlzdGF0aXN0aWNfcHJvY19zZWN1cml0eV9j aGVjayh2YXJkYXRhLCBvcHByb2MtPmZuX29pZCkgJiYKCQlnZXRfYXR0c3RhdHNzbG90KCZz c2xvdCwgdmFyZGF0YS0+c3RhdHNUdXBsZSwKCQkJCQkJIFNUQVRJU1RJQ19LSU5EX01DViwg SW52YWxpZE9pZCwKCQkJCQkJIEFUVFNUQVRTU0xPVF9WQUxVRVMgfCBBVFRTVEFUU1NMT1Rf TlVNQkVSUykpCgl7CgkJTE9DQUxfRkNJTkZPKGZjaW5mbywgMik7CgoJCS8qCgkJICogV2Ug aW52b2tlIHRoZSBvcHByb2MgImJ5IGhhbmQiIHNvIHRoYXQgd2Ugd29uJ3QgZmFpbCBvbiBO VUxMCgkJICogcmVzdWx0cy4gIFN1Y2ggY2FzZXMgd29uJ3QgYXJpc2UgZm9yIG5vcm1hbCBj b21wYXJpc29uIGZ1bmN0aW9ucywKCQkgKiBidXQgZ2VuZXJpY19yZXN0cmljdGlvbl9zZWxl Y3Rpdml0eSBjb3VsZCBwZXJoYXBzIGJlIHVzZWQgd2l0aAoJCSAqIG9wZXJhdG9ycyB0aGF0 IGNhbiByZXR1cm4gTlVMTC4gIEEgc21hbGwgc2lkZSBiZW5lZml0IGlzIHRvIG5vdAoJCSAq IG5lZWQgdG8gcmUtaW5pdGlhbGl6ZSB0aGUgZmNpbmZvIHN0cnVjdCBmcm9tIHNjcmF0Y2gg ZWFjaCB0aW1lLgoJCSAqLwoJCUluaXRGdW5jdGlvbkNhbGxJbmZvRGF0YSgqZmNpbmZvLCBv cHByb2MsIDIsIGNvbGxhdGlvbiwKCQkJCQkJCQkgTlVMTCwgTlVMTCk7CgkJZmNpbmZvLT5h cmdzWzBdLmlzbnVsbCA9IGZhbHNlOwoJCWZjaW5mby0+YXJnc1sxXS5pc251bGwgPSBmYWxz ZTsKCQkvKiBiZSBjYXJlZnVsIHRvIGFwcGx5IG9wZXJhdG9yIHJpZ2h0IHdheSAncm91bmQg Ki8KCQlpZiAodmFyb25sZWZ0KQoJCQlmY2luZm8tPmFyZ3NbMV0udmFsdWUgPSBjb25zdHZh bDsKCQllbHNlCgkJCWZjaW5mby0+YXJnc1swXS52YWx1ZSA9IGNvbnN0dmFsOwoKCQlmb3Ig KGkgPSAwOyBpIDwgc3Nsb3QubnZhbHVlczsgaSsrKQoJCXsKCQkJRGF0dW0JCWZyZXN1bHQ7 CgoJCQlpZiAodmFyb25sZWZ0KQoJCQkJZmNpbmZvLT5hcmdzWzBdLnZhbHVlID0gc3Nsb3Qu dmFsdWVzW2ldOwoJCQllbHNlCgkJCQlmY2luZm8tPmFyZ3NbMV0udmFsdWUgPSBzc2xvdC52 YWx1ZXNbaV07CgkJCWZjaW5mby0+aXNudWxsID0gZmFsc2U7CgkJCWZyZXN1bHQgPSBGdW5j dGlvbkNhbGxJbnZva2UoZmNpbmZvKTsKCQkJaWYgKCFmY2luZm8tPmlzbnVsbCAmJiBEYXR1 bUdldEJvb2woZnJlc3VsdCkpCgkJCQltY3Zfc2VsZWMgKz0gc3Nsb3QubnVtYmVyc1tpXTsK CQkJc3VtY29tbW9uICs9IHNzbG90Lm51bWJlcnNbaV07CgkJfQoJCWZyZWVfYXR0c3RhdHNz bG90KCZzc2xvdCk7Cgl9CgoJKnN1bWNvbW1vbnAgPSBzdW1jb21tb247CglyZXR1cm4gbWN2 X3NlbGVjOwp9CgovKgogKgloaXN0b2dyYW1fc2VsZWN0aXZpdHkJLSBFeGFtaW5lIHRoZSBo aXN0b2dyYW0gZm9yIHNlbGVjdGl2aXR5IGVzdGltYXRlcwogKgogKiBEZXRlcm1pbmUgdGhl IGZyYWN0aW9uIG9mIHRoZSB2YXJpYWJsZSdzIGhpc3RvZ3JhbSBlbnRyaWVzIHRoYXQgc2F0 aXNmeQogKiB0aGUgcHJlZGljYXRlIChWQVIgT1AgQ09OU1QpLCBvciAoQ09OU1QgT1AgVkFS KSBpZiAhdmFyb25sZWZ0LgogKgogKiBUaGlzIGNvZGUgd2lsbCB3b3JrIGZvciBhbnkgYm9v bGVhbi1yZXR1cm5pbmcgcHJlZGljYXRlIG9wZXJhdG9yLCB3aGV0aGVyCiAqIG9yIG5vdCBp dCBoYXMgYW55dGhpbmcgdG8gZG8gd2l0aCB0aGUgaGlzdG9ncmFtIHNvcnQgb3BlcmF0b3Iu ICBXZSBhcmUKICogZXNzZW50aWFsbHkgdXNpbmcgdGhlIGhpc3RvZ3JhbSBqdXN0IGFzIGEg cmVwcmVzZW50YXRpdmUgc2FtcGxlLiAgSG93ZXZlciwKICogc21hbGwgaGlzdG9ncmFtcyBh cmUgdW5saWtlbHkgdG8gYmUgYWxsIHRoYXQgcmVwcmVzZW50YXRpdmUsIHNvIHRoZSBjYWxs ZXIKICogc2hvdWxkIGJlIHByZXBhcmVkIHRvIGZhbGwgYmFjayBvbiBzb21lIG90aGVyIGVz dGltYXRpb24gYXBwcm9hY2ggd2hlbiB0aGUKICogaGlzdG9ncmFtIGlzIG1pc3Npbmcgb3Ig dmVyeSBzbWFsbC4gIEl0IG1heSBhbHNvIGJlIHBydWRlbnQgdG8gY29tYmluZSB0aGlzCiAq IGFwcHJvYWNoIHdpdGggYW5vdGhlciBvbmUgd2hlbiB0aGUgaGlzdG9ncmFtIGlzIHNtYWxs LgogKgogKiBJZiB0aGUgYWN0dWFsIGhpc3RvZ3JhbSBzaXplIGlzIG5vdCBhdCBsZWFzdCBt aW5faGlzdF9zaXplLCB3ZSB3b24ndCBib3RoZXIKICogdG8gZG8gdGhlIGNhbGN1bGF0aW9u IGF0IGFsbC4gIEFsc28sIGlmIHRoZSBuX3NraXAgcGFyYW1ldGVyIGlzID4gMCwgd2UKICog aWdub3JlIHRoZSBmaXJzdCBhbmQgbGFzdCBuX3NraXAgaGlzdG9ncmFtIGVsZW1lbnRzLCBv biB0aGUgZ3JvdW5kcyB0aGF0CiAqIHRoZXkgYXJlIG91dGxpZXJzIGFuZCBoZW5jZSBub3Qg dmVyeSByZXByZXNlbnRhdGl2ZS4gIFR5cGljYWwgdmFsdWVzIGZvcgogKiB0aGVzZSBwYXJh bWV0ZXJzIGFyZSAxMCBhbmQgMS4KICoKICogVGhlIGZ1bmN0aW9uIHJlc3VsdCBpcyB0aGUg c2VsZWN0aXZpdHksIG9yIC0xIGlmIHRoZXJlIGlzIG5vIGhpc3RvZ3JhbQogKiBvciBpdCdz IHNtYWxsZXIgdGhhbiBtaW5faGlzdF9zaXplLgogKgogKiBUaGUgb3V0cHV0IHBhcmFtZXRl ciAqaGlzdF9zaXplIHJlY2VpdmVzIHRoZSBhY3R1YWwgaGlzdG9ncmFtIHNpemUsCiAqIG9y IHplcm8gaWYgbm8gaGlzdG9ncmFtLiAgQ2FsbGVycyBtYXkgdXNlIHRoaXMgbnVtYmVyIHRv IGRlY2lkZSBob3cKICogbXVjaCBmYWl0aCB0byBwdXQgaW4gdGhlIGZ1bmN0aW9uIHJlc3Vs dC4KICoKICogTm90ZSB0aGF0IHRoZSByZXN1bHQgZGlzcmVnYXJkcyBib3RoIHRoZSBtb3N0 LWNvbW1vbi12YWx1ZXMgKGlmIGFueSkgYW5kCiAqIG51bGwgZW50cmllcy4gIFRoZSBjYWxs ZXIgaXMgZXhwZWN0ZWQgdG8gY29tYmluZSB0aGlzIHJlc3VsdCB3aXRoCiAqIHN0YXRpc3Rp Y3MgZm9yIHRob3NlIHBvcnRpb25zIG9mIHRoZSBjb2x1bW4gcG9wdWxhdGlvbi4gIEl0IG1h eSBhbHNvIGJlCiAqIHBydWRlbnQgdG8gY2xhbXAgdGhlIHJlc3VsdCByYW5nZSwgaWUsIGRp c2JlbGlldmUgZXhhY3QgMCBvciAxIG91dHB1dHMuCiAqLwpkb3VibGUKaGlzdG9ncmFtX3Nl bGVjdGl2aXR5KFZhcmlhYmxlU3RhdERhdGEgKnZhcmRhdGEsCgkJCQkJICBGbWdySW5mbyAq b3Bwcm9jLCBPaWQgY29sbGF0aW9uLAoJCQkJCSAgRGF0dW0gY29uc3R2YWwsIGJvb2wgdmFy b25sZWZ0LAoJCQkJCSAgaW50IG1pbl9oaXN0X3NpemUsIGludCBuX3NraXAsCgkJCQkJICBp bnQgKmhpc3Rfc2l6ZSkKewoJZG91YmxlCQlyZXN1bHQ7CglBdHRTdGF0c1Nsb3Qgc3Nsb3Q7 CgoJLyogY2hlY2sgc2FuaXR5IG9mIHBhcmFtZXRlcnMgKi8KCUFzc2VydChuX3NraXAgPj0g MCk7CglBc3NlcnQobWluX2hpc3Rfc2l6ZSA+IDIgKiBuX3NraXApOwoKCWlmIChIZWFwVHVw bGVJc1ZhbGlkKHZhcmRhdGEtPnN0YXRzVHVwbGUpICYmCgkJc3RhdGlzdGljX3Byb2Nfc2Vj dXJpdHlfY2hlY2sodmFyZGF0YSwgb3Bwcm9jLT5mbl9vaWQpICYmCgkJZ2V0X2F0dHN0YXRz c2xvdCgmc3Nsb3QsIHZhcmRhdGEtPnN0YXRzVHVwbGUsCgkJCQkJCSBTVEFUSVNUSUNfS0lO RF9ISVNUT0dSQU0sIEludmFsaWRPaWQsCgkJCQkJCSBBVFRTVEFUU1NMT1RfVkFMVUVTKSkK CXsKCQkqaGlzdF9zaXplID0gc3Nsb3QubnZhbHVlczsKCQlpZiAoc3Nsb3QubnZhbHVlcyA+ PSBtaW5faGlzdF9zaXplKQoJCXsKCQkJTE9DQUxfRkNJTkZPKGZjaW5mbywgMik7CgkJCWlu dAkJCW5tYXRjaCA9IDA7CgkJCWludAkJCWk7CgoJCQkvKgoJCQkgKiBXZSBpbnZva2UgdGhl IG9wcHJvYyAiYnkgaGFuZCIgc28gdGhhdCB3ZSB3b24ndCBmYWlsIG9uIE5VTEwKCQkJICog cmVzdWx0cy4gIFN1Y2ggY2FzZXMgd29uJ3QgYXJpc2UgZm9yIG5vcm1hbCBjb21wYXJpc29u CgkJCSAqIGZ1bmN0aW9ucywgYnV0IGdlbmVyaWNfcmVzdHJpY3Rpb25fc2VsZWN0aXZpdHkg Y291bGQgcGVyaGFwcyBiZQoJCQkgKiB1c2VkIHdpdGggb3BlcmF0b3JzIHRoYXQgY2FuIHJl dHVybiBOVUxMLiAgQSBzbWFsbCBzaWRlIGJlbmVmaXQKCQkJICogaXMgdG8gbm90IG5lZWQg dG8gcmUtaW5pdGlhbGl6ZSB0aGUgZmNpbmZvIHN0cnVjdCBmcm9tIHNjcmF0Y2gKCQkJICog ZWFjaCB0aW1lLgoJCQkgKi8KCQkJSW5pdEZ1bmN0aW9uQ2FsbEluZm9EYXRhKCpmY2luZm8s IG9wcHJvYywgMiwgY29sbGF0aW9uLAoJCQkJCQkJCQkgTlVMTCwgTlVMTCk7CgkJCWZjaW5m by0+YXJnc1swXS5pc251bGwgPSBmYWxzZTsKCQkJZmNpbmZvLT5hcmdzWzFdLmlzbnVsbCA9 IGZhbHNlOwoJCQkvKiBiZSBjYXJlZnVsIHRvIGFwcGx5IG9wZXJhdG9yIHJpZ2h0IHdheSAn cm91bmQgKi8KCQkJaWYgKHZhcm9ubGVmdCkKCQkJCWZjaW5mby0+YXJnc1sxXS52YWx1ZSA9 IGNvbnN0dmFsOwoJCQllbHNlCgkJCQlmY2luZm8tPmFyZ3NbMF0udmFsdWUgPSBjb25zdHZh bDsKCgkJCWZvciAoaSA9IG5fc2tpcDsgaSA8IHNzbG90Lm52YWx1ZXMgLSBuX3NraXA7IGkr KykKCQkJewoJCQkJRGF0dW0JCWZyZXN1bHQ7CgoJCQkJaWYgKHZhcm9ubGVmdCkKCQkJCQlm Y2luZm8tPmFyZ3NbMF0udmFsdWUgPSBzc2xvdC52YWx1ZXNbaV07CgkJCQllbHNlCgkJCQkJ ZmNpbmZvLT5hcmdzWzFdLnZhbHVlID0gc3Nsb3QudmFsdWVzW2ldOwoJCQkJZmNpbmZvLT5p c251bGwgPSBmYWxzZTsKCQkJCWZyZXN1bHQgPSBGdW5jdGlvbkNhbGxJbnZva2UoZmNpbmZv KTsKCQkJCWlmICghZmNpbmZvLT5pc251bGwgJiYgRGF0dW1HZXRCb29sKGZyZXN1bHQpKQoJ CQkJCW5tYXRjaCsrOwoJCQl9CgkJCXJlc3VsdCA9ICgoZG91YmxlKSBubWF0Y2gpIC8gKChk b3VibGUpIChzc2xvdC5udmFsdWVzIC0gMiAqIG5fc2tpcCkpOwoJCX0KCQllbHNlCgkJCXJl c3VsdCA9IC0xOwoJCWZyZWVfYXR0c3RhdHNzbG90KCZzc2xvdCk7Cgl9CgllbHNlCgl7CgkJ Kmhpc3Rfc2l6ZSA9IDA7CgkJcmVzdWx0ID0gLTE7Cgl9CgoJcmV0dXJuIHJlc3VsdDsKfQoK LyoKICoJZ2VuZXJpY19yZXN0cmljdGlvbl9zZWxlY3Rpdml0eQkJLSBTZWxlY3Rpdml0eSBm b3IgYWxtb3N0IGFueXRoaW5nCiAqCiAqIFRoaXMgZnVuY3Rpb24gZXN0aW1hdGVzIHNlbGVj dGl2aXR5IGZvciBvcGVyYXRvcnMgdGhhdCB3ZSBkb24ndCBoYXZlIGFueQogKiBzcGVjaWFs IGtub3dsZWRnZSBhYm91dCwgYnV0IGFyZSBvbiBkYXRhIHR5cGVzIHRoYXQgd2UgY29sbGVj dCBzdGFuZGFyZAogKiBNQ1YgYW5kL29yIGhpc3RvZ3JhbSBzdGF0aXN0aWNzIGZvci4gIChB ZGRpdGlvbmFsIGFzc3VtcHRpb25zIGFyZSB0aGF0CiAqIHRoZSBvcGVyYXRvciBpcyBzdHJp Y3QgYW5kIGltbXV0YWJsZSwgb3IgYXQgbGVhc3Qgc3RhYmxlLikKICoKICogSWYgd2UgaGF2 ZSAiVkFSIE9QIENPTlNUIiBvciAiQ09OU1QgT1AgVkFSIiwgc2VsZWN0aXZpdHkgaXMgZXN0 aW1hdGVkIGJ5CiAqIGFwcGx5aW5nIHRoZSBvcGVyYXRvciB0byBlYWNoIGVsZW1lbnQgb2Yg dGhlIGNvbHVtbidzIE1DViBhbmQvb3IgaGlzdG9ncmFtCiAqIHN0YXRzLCBhbmQgbWVyZ2lu ZyB0aGUgcmVzdWx0cyB1c2luZyB0aGUgYXNzdW1wdGlvbiB0aGF0IHRoZSBoaXN0b2dyYW0g aXMKICogYSByZWFzb25hYmxlIHJhbmRvbSBzYW1wbGUgb2YgdGhlIGNvbHVtbidzIG5vbi1N Q1YgcG9wdWxhdGlvbi4gIE5vdGUgdGhhdAogKiBpZiB0aGUgb3BlcmF0b3IncyBzZW1hbnRp Y3MgYXJlIHJlbGF0ZWQgdG8gdGhlIGhpc3RvZ3JhbSBvcmRlcmluZywgdGhpcwogKiBtaWdo dCBub3QgYmUgc3VjaCBhIGdyZWF0IGFzc3VtcHRpb247IG90aGVyIGZ1bmN0aW9ucyBzdWNo IGFzCiAqIHNjYWxhcmluZXFzZWwoKSBhcmUgcHJvYmFibHkgYSBiZXR0ZXIgbWF0Y2ggaW4g c3VjaCBjYXNlcy4KICoKICogT3RoZXJ3aXNlLCBmYWxsIGJhY2sgdG8gdGhlIGRlZmF1bHQg c2VsZWN0aXZpdHkgcHJvdmlkZWQgYnkgdGhlIGNhbGxlci4KICovCmRvdWJsZQpnZW5lcmlj X3Jlc3RyaWN0aW9uX3NlbGVjdGl2aXR5KFBsYW5uZXJJbmZvICpyb290LCBPaWQgb3Byb2lk LCBPaWQgY29sbGF0aW9uLAoJCQkJCQkJCUxpc3QgKmFyZ3MsIGludCB2YXJSZWxpZCwKCQkJ CQkJCQlkb3VibGUgZGVmYXVsdF9zZWxlY3Rpdml0eSkKewoJZG91YmxlCQlzZWxlYzsKCVZh cmlhYmxlU3RhdERhdGEgdmFyZGF0YTsKCU5vZGUJICAgKm90aGVyOwoJYm9vbAkJdmFyb25s ZWZ0OwoKCS8qCgkgKiBJZiBleHByZXNzaW9uIGlzIG5vdCB2YXJpYWJsZSBPUCBzb21ldGhp bmcgb3Igc29tZXRoaW5nIE9QIHZhcmlhYmxlLAoJICogdGhlbiBwdW50IGFuZCByZXR1cm4g dGhlIGRlZmF1bHQgZXN0aW1hdGUuCgkgKi8KCWlmICghZ2V0X3Jlc3RyaWN0aW9uX3Zhcmlh YmxlKHJvb3QsIGFyZ3MsIHZhclJlbGlkLAoJCQkJCQkJCSAgJnZhcmRhdGEsICZvdGhlciwg JnZhcm9ubGVmdCkpCgkJcmV0dXJuIGRlZmF1bHRfc2VsZWN0aXZpdHk7CgoJLyoKCSAqIElm IHRoZSBzb21ldGhpbmcgaXMgYSBOVUxMIGNvbnN0YW50LCBhc3N1bWUgb3BlcmF0b3IgaXMg c3RyaWN0IGFuZAoJICogcmV0dXJuIHplcm8sIGllLCBvcGVyYXRvciB3aWxsIG5ldmVyIHJl dHVybiBUUlVFLgoJICovCglpZiAoSXNBKG90aGVyLCBDb25zdCkgJiYKCQkoKENvbnN0ICop IG90aGVyKS0+Y29uc3Rpc251bGwpCgl7CgkJUmVsZWFzZVZhcmlhYmxlU3RhdHModmFyZGF0 YSk7CgkJcmV0dXJuIDAuMDsKCX0KCglpZiAoSXNBKG90aGVyLCBDb25zdCkpCgl7CgkJLyog VmFyaWFibGUgaXMgYmVpbmcgY29tcGFyZWQgdG8gYSBrbm93biBub24tbnVsbCBjb25zdGFu dCAqLwoJCURhdHVtCQljb25zdHZhbCA9ICgoQ29uc3QgKikgb3RoZXIpLT5jb25zdHZhbHVl OwoJCUZtZ3JJbmZvCW9wcHJvYzsKCQlkb3VibGUJCW1jdnN1bTsKCQlkb3VibGUJCW1jdnNl bDsKCQlkb3VibGUJCW51bGxmcmFjOwoJCWludAkJCWhpc3Rfc2l6ZTsKCgkJZm1ncl9pbmZv KGdldF9vcGNvZGUob3Byb2lkKSwgJm9wcHJvYyk7CgoJCS8qCgkJICogQ2FsY3VsYXRlIHRo ZSBzZWxlY3Rpdml0eSBmb3IgdGhlIGNvbHVtbidzIG1vc3QgY29tbW9uIHZhbHVlcy4KCQkg Ki8KCQltY3ZzZWwgPSBtY3Zfc2VsZWN0aXZpdHkoJnZhcmRhdGEsICZvcHByb2MsIGNvbGxh dGlvbiwKCQkJCQkJCQkgY29uc3R2YWwsIHZhcm9ubGVmdCwKCQkJCQkJCQkgJm1jdnN1bSk7 CgoJCS8qCgkJICogSWYgdGhlIGhpc3RvZ3JhbSBpcyBsYXJnZSBlbm91Z2gsIHNlZSB3aGF0 IGZyYWN0aW9uIG9mIGl0IG1hdGNoZXMKCQkgKiB0aGUgcXVlcnksIGFuZCBhc3N1bWUgdGhh dCdzIHJlcHJlc2VudGF0aXZlIG9mIHRoZSBub24tTUNWCgkJICogcG9wdWxhdGlvbi4gIE90 aGVyd2lzZSB1c2UgdGhlIGRlZmF1bHQgc2VsZWN0aXZpdHkgZm9yIHRoZSBub24tTUNWCgkJ ICogcG9wdWxhdGlvbi4KCQkgKi8KCQlzZWxlYyA9IGhpc3RvZ3JhbV9zZWxlY3Rpdml0eSgm dmFyZGF0YSwgJm9wcHJvYywgY29sbGF0aW9uLAoJCQkJCQkJCQkgIGNvbnN0dmFsLCB2YXJv bmxlZnQsCgkJCQkJCQkJCSAgMTAsIDEsICZoaXN0X3NpemUpOwoJCWlmIChzZWxlYyA8IDAp CgkJewoJCQkvKiBOb3BlLCBmYWxsIGJhY2sgb24gZGVmYXVsdCAqLwoJCQlzZWxlYyA9IGRl ZmF1bHRfc2VsZWN0aXZpdHk7CgkJfQoJCWVsc2UgaWYgKGhpc3Rfc2l6ZSA8IDEwMCkKCQl7 CgkJCS8qCgkJCSAqIEZvciBoaXN0b2dyYW0gc2l6ZXMgZnJvbSAxMCB0byAxMDAsIHdlIGNv bWJpbmUgdGhlIGhpc3RvZ3JhbQoJCQkgKiBhbmQgZGVmYXVsdCBzZWxlY3Rpdml0aWVzLCBw dXR0aW5nIGluY3JlYXNpbmdseSBtb3JlIHRydXN0IGluCgkJCSAqIHRoZSBoaXN0b2dyYW0g Zm9yIGxhcmdlciBzaXplcy4KCQkJICovCgkJCWRvdWJsZQkJaGlzdF93ZWlnaHQgPSBoaXN0 X3NpemUgLyAxMDAuMDsKCgkJCXNlbGVjID0gc2VsZWMgKiBoaXN0X3dlaWdodCArCgkJCQlk ZWZhdWx0X3NlbGVjdGl2aXR5ICogKDEuMCAtIGhpc3Rfd2VpZ2h0KTsKCQl9CgoJCS8qIElu IGFueSBjYXNlLCBkb24ndCBiZWxpZXZlIGV4dHJlbWVseSBzbWFsbCBvciBsYXJnZSBlc3Rp bWF0ZXMuICovCgkJaWYgKHNlbGVjIDwgMC4wMDAxKQoJCQlzZWxlYyA9IDAuMDAwMTsKCQll bHNlIGlmIChzZWxlYyA+IDAuOTk5OSkKCQkJc2VsZWMgPSAwLjk5OTk7CgoJCS8qIERvbid0 IGZvcmdldCB0byBhY2NvdW50IGZvciBudWxscy4gKi8KCQlpZiAoSGVhcFR1cGxlSXNWYWxp ZCh2YXJkYXRhLnN0YXRzVHVwbGUpKQoJCQludWxsZnJhYyA9ICgoRm9ybV9wZ19zdGF0aXN0 aWMpIEdFVFNUUlVDVCh2YXJkYXRhLnN0YXRzVHVwbGUpKS0+c3RhbnVsbGZyYWM7CgkJZWxz ZQoJCQludWxsZnJhYyA9IDAuMDsKCgkJLyoKCQkgKiBOb3cgbWVyZ2UgdGhlIHJlc3VsdHMg ZnJvbSB0aGUgTUNWIGFuZCBoaXN0b2dyYW0gY2FsY3VsYXRpb25zLAoJCSAqIHJlYWxpemlu ZyB0aGF0IHRoZSBoaXN0b2dyYW0gY292ZXJzIG9ubHkgdGhlIG5vbi1udWxsIHZhbHVlcyB0 aGF0CgkJICogYXJlIG5vdCBsaXN0ZWQgaW4gTUNWLgoJCSAqLwoJCXNlbGVjICo9IDEuMCAt IG51bGxmcmFjIC0gbWN2c3VtOwoJCXNlbGVjICs9IG1jdnNlbDsKCX0KCWVsc2UKCXsKCQkv KiBDb21wYXJpc29uIHZhbHVlIGlzIG5vdCBjb25zdGFudCwgc28gd2UgY2FuJ3QgZG8gYW55 dGhpbmcgKi8KCQlzZWxlYyA9IGRlZmF1bHRfc2VsZWN0aXZpdHk7Cgl9CgoJUmVsZWFzZVZh cmlhYmxlU3RhdHModmFyZGF0YSk7CgoJLyogcmVzdWx0IHNob3VsZCBiZSBpbiByYW5nZSwg YnV0IG1ha2Ugc3VyZS4uLiAqLwoJQ0xBTVBfUFJPQkFCSUxJVFkoc2VsZWMpOwoKCXJldHVy biBzZWxlYzsKfQoKLyoKICoJaW5lcV9oaXN0b2dyYW1fc2VsZWN0aXZpdHkJLSBFeGFtaW5l IHRoZSBoaXN0b2dyYW0gZm9yIHNjYWxhcmluZXFzZWwKICoKICogRGV0ZXJtaW5lIHRoZSBm cmFjdGlvbiBvZiB0aGUgdmFyaWFibGUncyBoaXN0b2dyYW0gcG9wdWxhdGlvbiB0aGF0CiAq IHNhdGlzZmllcyB0aGUgaW5lcXVhbGl0eSBjb25kaXRpb24sIGllLCBWQVIgPCAob3IgPD0s ID4sID49KSBDT05TVC4KICogVGhlIGlzZ3QgYW5kIGlzZXEgZmxhZ3MgZGlzdGluZ3Vpc2gg d2hpY2ggb2YgdGhlIGZvdXIgY2FzZXMgYXBwbHkuCiAqCiAqIFdoaWxlIG9wcHJvYyBjb3Vs ZCBiZSBsb29rZWQgdXAgZnJvbSB0aGUgb3BlcmF0b3IgT0lELCBjb21tb24gY2FsbGVycwog KiBhbHNvIG5lZWQgdG8gY2FsbCBpdCBzZXBhcmF0ZWx5LCBzbyB3ZSBtYWtlIHRoZSBjYWxs ZXIgcGFzcyBib3RoLgogKgogKiBSZXR1cm5zIC0xIGlmIHRoZXJlIGlzIG5vIGhpc3RvZ3Jh bSAodmFsaWQgcmVzdWx0cyB3aWxsIGFsd2F5cyBiZSA+PSAwKS4KICoKICogTm90ZSB0aGF0 IHRoZSByZXN1bHQgZGlzcmVnYXJkcyBib3RoIHRoZSBtb3N0LWNvbW1vbi12YWx1ZXMgKGlm IGFueSkgYW5kCiAqIG51bGwgZW50cmllcy4gIFRoZSBjYWxsZXIgaXMgZXhwZWN0ZWQgdG8g Y29tYmluZSB0aGlzIHJlc3VsdCB3aXRoCiAqIHN0YXRpc3RpY3MgZm9yIHRob3NlIHBvcnRp b25zIG9mIHRoZSBjb2x1bW4gcG9wdWxhdGlvbi4KICoKICogVGhpcyBpcyBleHBvcnRlZCBz byB0aGF0IHNvbWUgb3RoZXIgZXN0aW1hdGlvbiBmdW5jdGlvbnMgY2FuIHVzZSBpdC4KICov CmRvdWJsZQppbmVxX2hpc3RvZ3JhbV9zZWxlY3Rpdml0eShQbGFubmVySW5mbyAqcm9vdCwK CQkJCQkJICAgVmFyaWFibGVTdGF0RGF0YSAqdmFyZGF0YSwKCQkJCQkJICAgT2lkIG9wb2lk LCBGbWdySW5mbyAqb3Bwcm9jLCBib29sIGlzZ3QsIGJvb2wgaXNlcSwKCQkJCQkJICAgT2lk IGNvbGxhdGlvbiwKCQkJCQkJICAgRGF0dW0gY29uc3R2YWwsIE9pZCBjb25zdHR5cGUpCnsK CWRvdWJsZQkJaGlzdF9zZWxlYzsKCUF0dFN0YXRzU2xvdCBzc2xvdDsKCgloaXN0X3NlbGVj ID0gLTEuMDsKCgkvKgoJICogU29tZWRheSwgQU5BTFlaRSBtaWdodCBzdG9yZSBtb3JlIHRo YW4gb25lIGhpc3RvZ3JhbSBwZXIgcmVsL2F0dCwKCSAqIGNvcnJlc3BvbmRpbmcgdG8gbW9y ZSB0aGFuIG9uZSBwb3NzaWJsZSBzb3J0IG9yZGVyaW5nIGRlZmluZWQgZm9yIHRoZQoJICog Y29sdW1uIHR5cGUuICBSaWdodCBub3csIHdlIGtub3cgdGhlcmUgaXMgb25seSBvbmUsIHNv IGp1c3QgZ3JhYiBpdCBhbmQKCSAqIHNlZSBpZiBpdCBtYXRjaGVzIHRoZSBxdWVyeS4KCSAq CgkgKiBOb3RlIHRoYXQgd2UgY2FuJ3QgdXNlIG9wb2lkIGFzIHNlYXJjaCBhcmd1bWVudDsg dGhlIHN0YW9wIGFwcGVhcmluZyBpbgoJICogcGdfc3RhdGlzdGljIHdpbGwgYmUgZm9yIHRo ZSByZWxldmFudCAnPCcgb3BlcmF0b3IsIGJ1dCB3aGF0IHdlIGhhdmUKCSAqIG1pZ2h0IGJl IHNvbWUgb3RoZXIgaW5lcXVhbGl0eSBvcGVyYXRvciBzdWNoIGFzICc+PScuICAoRXZlbiBp ZiBvcG9pZAoJICogaXMgYSAnPCcgb3BlcmF0b3IsIGl0IGNvdWxkIGJlIGNyb3NzLXR5cGUu KSAgSGVuY2Ugd2UgbXVzdCB1c2UKCSAqIGNvbXBhcmlzb25fb3BzX2FyZV9jb21wYXRpYmxl KCkgdG8gc2VlIGlmIHRoZSBvcGVyYXRvcnMgbWF0Y2guCgkgKi8KCWlmIChIZWFwVHVwbGVJ c1ZhbGlkKHZhcmRhdGEtPnN0YXRzVHVwbGUpICYmCgkJc3RhdGlzdGljX3Byb2Nfc2VjdXJp dHlfY2hlY2sodmFyZGF0YSwgb3Bwcm9jLT5mbl9vaWQpICYmCgkJZ2V0X2F0dHN0YXRzc2xv dCgmc3Nsb3QsIHZhcmRhdGEtPnN0YXRzVHVwbGUsCgkJCQkJCSBTVEFUSVNUSUNfS0lORF9I SVNUT0dSQU0sIEludmFsaWRPaWQsCgkJCQkJCSBBVFRTVEFUU1NMT1RfVkFMVUVTKSkKCXsK CQlpZiAoc3Nsb3QubnZhbHVlcyA+IDEgJiYKCQkJc3Nsb3Quc3RhY29sbCA9PSBjb2xsYXRp b24gJiYKCQkJY29tcGFyaXNvbl9vcHNfYXJlX2NvbXBhdGlibGUoc3Nsb3Quc3Rhb3AsIG9w b2lkKSkKCQl7CgkJCS8qCgkJCSAqIFVzZSBiaW5hcnkgc2VhcmNoIHRvIGZpbmQgdGhlIGRl c2lyZWQgbG9jYXRpb24sIG5hbWVseSB0aGUKCQkJICogcmlnaHQgZW5kIG9mIHRoZSBoaXN0 b2dyYW0gYmluIGNvbnRhaW5pbmcgdGhlIGNvbXBhcmlzb24gdmFsdWUsCgkJCSAqIHdoaWNo IGlzIHRoZSBsZWZ0bW9zdCBlbnRyeSBmb3Igd2hpY2ggdGhlIGNvbXBhcmlzb24gb3BlcmF0 b3IKCQkJICogc3VjY2VlZHMgKGlmIGlzZ3QpIG9yIGZhaWxzIChpZiAhaXNndCkuCgkJCSAq CgkJCSAqIEluIHRoaXMgbG9vcCwgd2UgcGF5IG5vIGF0dGVudGlvbiB0byB3aGV0aGVyIHRo ZSBvcGVyYXRvciBpc2VxCgkJCSAqIG9yIG5vdDsgdGhhdCBkZXRhaWwgd2lsbCBiZSBtb3Bw ZWQgdXAgYmVsb3cuICAoV2UgY2Fubm90IHRlbGwsCgkJCSAqIGFueXdheSwgd2hldGhlciB0 aGUgb3BlcmF0b3IgdGhpbmtzIHRoZSB2YWx1ZXMgYXJlIGVxdWFsLikKCQkJICoKCQkJICog SWYgdGhlIGJpbmFyeSBzZWFyY2ggYWNjZXNzZXMgdGhlIGZpcnN0IG9yIGxhc3QgaGlzdG9n cmFtCgkJCSAqIGVudHJ5LCB3ZSB0cnkgdG8gcmVwbGFjZSB0aGF0IGVuZHBvaW50IHdpdGgg dGhlIHRydWUgY29sdW1uIG1pbgoJCQkgKiBvciBtYXggYXMgZm91bmQgYnkgZ2V0X2FjdHVh bF92YXJpYWJsZV9yYW5nZSgpLiAgVGhpcwoJCQkgKiBhbWVsaW9yYXRlcyBtaXNlc3RpbWF0 ZXMgd2hlbiB0aGUgbWluIG9yIG1heCBpcyBtb3ZpbmcgYXMgYQoJCQkgKiByZXN1bHQgb2Yg Y2hhbmdlcyBzaW5jZSB0aGUgbGFzdCBBTkFMWVpFLiAgTm90ZSB0aGF0IHRoaXMgY291bGQK CQkJICogcmVzdWx0IGluIGVmZmVjdGl2ZWx5IGluY2x1ZGluZyBNQ1ZzIGludG8gdGhlIGhp c3RvZ3JhbSB0aGF0CgkJCSAqIHdlcmVuJ3QgdGhlcmUgYmVmb3JlLCBidXQgd2UgZG9uJ3Qg dHJ5IHRvIGNvcnJlY3QgZm9yIHRoYXQuCgkJCSAqLwoJCQlkb3VibGUJCWhpc3RmcmFjOwoJ CQlpbnQJCQlsb2JvdW5kID0gMDsJLyogZmlyc3QgcG9zc2libGUgc2xvdCB0byBzZWFyY2gg Ki8KCQkJaW50CQkJaGlib3VuZCA9IHNzbG90Lm52YWx1ZXM7CS8qIGxhc3QrMSBzbG90IHRv IHNlYXJjaCAqLwoJCQlib29sCQloYXZlX2VuZCA9IGZhbHNlOwoKCQkJLyoKCQkJICogSWYg dGhlcmUgYXJlIG9ubHkgdHdvIGhpc3RvZ3JhbSBlbnRyaWVzLCB3ZSdsbCB3YW50IHVwLXRv LWRhdGUKCQkJICogdmFsdWVzIGZvciBib3RoLiAgKElmIHRoZXJlIGFyZSBtb3JlIHRoYW4g dHdvLCB3ZSBuZWVkIGF0IG1vc3QKCQkJICogb25lIG9mIHRoZW0gdG8gYmUgdXBkYXRlZCwg c28gd2UgZGVhbCB3aXRoIHRoYXQgd2l0aGluIHRoZQoJCQkgKiBsb29wLikKCQkJICovCgkJ CWlmIChzc2xvdC5udmFsdWVzID09IDIpCgkJCQloYXZlX2VuZCA9IGdldF9hY3R1YWxfdmFy aWFibGVfcmFuZ2Uocm9vdCwKCQkJCQkJCQkJCQkJCSB2YXJkYXRhLAoJCQkJCQkJCQkJCQkJ IHNzbG90LnN0YW9wLAoJCQkJCQkJCQkJCQkJIGNvbGxhdGlvbiwKCQkJCQkJCQkJCQkJCSAm c3Nsb3QudmFsdWVzWzBdLAoJCQkJCQkJCQkJCQkJICZzc2xvdC52YWx1ZXNbMV0pOwoKCQkJ d2hpbGUgKGxvYm91bmQgPCBoaWJvdW5kKQoJCQl7CgkJCQlpbnQJCQlwcm9iZSA9IChsb2Jv dW5kICsgaGlib3VuZCkgLyAyOwoJCQkJYm9vbAkJbHRjbXA7CgoJCQkJLyoKCQkJCSAqIElm IHdlIGZpbmQgb3Vyc2VsdmVzIGFib3V0IHRvIGNvbXBhcmUgdG8gdGhlIGZpcnN0IG9yIGxh c3QKCQkJCSAqIGhpc3RvZ3JhbSBlbnRyeSwgZmlyc3QgdHJ5IHRvIHJlcGxhY2UgaXQgd2l0 aCB0aGUgYWN0dWFsCgkJCQkgKiBjdXJyZW50IG1pbiBvciBtYXggKHVubGVzcyB3ZSBhbHJl YWR5IGRpZCBzbyBhYm92ZSkuCgkJCQkgKi8KCQkJCWlmIChwcm9iZSA9PSAwICYmIHNzbG90 Lm52YWx1ZXMgPiAyKQoJCQkJCWhhdmVfZW5kID0gZ2V0X2FjdHVhbF92YXJpYWJsZV9yYW5n ZShyb290LAoJCQkJCQkJCQkJCQkJCSB2YXJkYXRhLAoJCQkJCQkJCQkJCQkJCSBzc2xvdC5z dGFvcCwKCQkJCQkJCQkJCQkJCQkgY29sbGF0aW9uLAoJCQkJCQkJCQkJCQkJCSAmc3Nsb3Qu dmFsdWVzWzBdLAoJCQkJCQkJCQkJCQkJCSBOVUxMKTsKCQkJCWVsc2UgaWYgKHByb2JlID09 IHNzbG90Lm52YWx1ZXMgLSAxICYmIHNzbG90Lm52YWx1ZXMgPiAyKQoJCQkJCWhhdmVfZW5k ID0gZ2V0X2FjdHVhbF92YXJpYWJsZV9yYW5nZShyb290LAoJCQkJCQkJCQkJCQkJCSB2YXJk YXRhLAoJCQkJCQkJCQkJCQkJCSBzc2xvdC5zdGFvcCwKCQkJCQkJCQkJCQkJCQkgY29sbGF0 aW9uLAoJCQkJCQkJCQkJCQkJCSBOVUxMLAoJCQkJCQkJCQkJCQkJCSAmc3Nsb3QudmFsdWVz W3Byb2JlXSk7CgoJCQkJbHRjbXAgPSBEYXR1bUdldEJvb2woRnVuY3Rpb25DYWxsMkNvbGwo b3Bwcm9jLAoJCQkJCQkJCQkJCQkJICAgY29sbGF0aW9uLAoJCQkJCQkJCQkJCQkJICAgc3Ns b3QudmFsdWVzW3Byb2JlXSwKCQkJCQkJCQkJCQkJCSAgIGNvbnN0dmFsKSk7CgkJCQlpZiAo aXNndCkKCQkJCQlsdGNtcCA9ICFsdGNtcDsKCQkJCWlmIChsdGNtcCkKCQkJCQlsb2JvdW5k ID0gcHJvYmUgKyAxOwoJCQkJZWxzZQoJCQkJCWhpYm91bmQgPSBwcm9iZTsKCQkJfQoKCQkJ aWYgKGxvYm91bmQgPD0gMCkKCQkJewoJCQkJLyoKCQkJCSAqIENvbnN0YW50IGlzIGJlbG93 IGxvd2VyIGhpc3RvZ3JhbSBib3VuZGFyeS4gIE1vcmUKCQkJCSAqIHByZWNpc2VseSwgd2Ug aGF2ZSBmb3VuZCB0aGF0IG5vIGVudHJ5IGluIHRoZSBoaXN0b2dyYW0KCQkJCSAqIHNhdGlz ZmllcyB0aGUgaW5lcXVhbGl0eSBjbGF1c2UgKGlmICFpc2d0KSBvciB0aGV5IGFsbCBkbwoJ CQkJICogKGlmIGlzZ3QpLiAgV2UgZXN0aW1hdGUgdGhhdCB0aGF0J3MgdHJ1ZSBvZiB0aGUg ZW50aXJlCgkJCQkgKiB0YWJsZSwgc28gc2V0IGhpc3RmcmFjIHRvIDAuMCAod2hpY2ggd2Un bGwgZmxpcCB0byAxLjAKCQkJCSAqIGJlbG93LCBpZiBpc2d0KS4KCQkJCSAqLwoJCQkJaGlz dGZyYWMgPSAwLjA7CgkJCX0KCQkJZWxzZSBpZiAobG9ib3VuZCA+PSBzc2xvdC5udmFsdWVz KQoJCQl7CgkJCQkvKgoJCQkJICogSW52ZXJzZSBjYXNlOiBjb25zdGFudCBpcyBhYm92ZSB1 cHBlciBoaXN0b2dyYW0gYm91bmRhcnkuCgkJCQkgKi8KCQkJCWhpc3RmcmFjID0gMS4wOwoJ CQl9CgkJCWVsc2UKCQkJewoJCQkJLyogV2UgaGF2ZSB2YWx1ZXNbaS0xXSA8PSBjb25zdGFu dCA8PSB2YWx1ZXNbaV0uICovCgkJCQlpbnQJCQlpID0gbG9ib3VuZDsKCQkJCWRvdWJsZQkJ ZXFfc2VsZWMgPSAwOwoJCQkJZG91YmxlCQl2YWwsCgkJCQkJCQloaWdoLAoJCQkJCQkJbG93 OwoJCQkJZG91YmxlCQliaW5mcmFjOwoKCQkJCS8qCgkJCQkgKiBJbiB0aGUgY2FzZXMgd2hl cmUgd2UnbGwgbmVlZCBpdCBiZWxvdywgb2J0YWluIGFuIGVzdGltYXRlCgkJCQkgKiBvZiB0 aGUgc2VsZWN0aXZpdHkgb2YgInggPSBjb25zdHZhbCIuICBXZSB1c2UgYSBjYWxjdWxhdGlv bgoJCQkJICogc2ltaWxhciB0byB3aGF0IHZhcl9lcV9jb25zdCgpIGRvZXMgZm9yIGEgbm9u LU1DViBjb25zdGFudCwKCQkJCSAqIGllLCBlc3RpbWF0ZSB0aGF0IGFsbCBkaXN0aW5jdCBu b24tTUNWIHZhbHVlcyBvY2N1ciBlcXVhbGx5CgkJCQkgKiBvZnRlbi4gIEJ1dCBtdWx0aXBs aWNhdGlvbiBieSAiMS4wIC0gc3VtY29tbW9uIC0gbnVsbGZyYWMiCgkJCQkgKiB3aWxsIGJl IGRvbmUgYnkgb3VyIGNhbGxlciwgc28gd2Ugc2hvdWxkbid0IGRvIHRoYXQgaGVyZS4KCQkJ CSAqIFRoZXJlZm9yZSB3ZSBjYW4ndCB0cnkgdG8gY2xhbXAgdGhlIGVzdGltYXRlIGJ5IHJl ZmVyZW5jZQoJCQkJICogdG8gdGhlIGxlYXN0IGNvbW1vbiBNQ1Y7IHRoZSByZXN1bHQgd291 bGQgYmUgdG9vIHNtYWxsLgoJCQkJICoKCQkJCSAqIE5vdGU6IHNpbmNlIHRoaXMgaXMgZWZm ZWN0aXZlbHkgYXNzdW1pbmcgdGhhdCBjb25zdHZhbAoJCQkJICogaXNuJ3QgYW4gTUNWLCBp dCdzIGxvZ2ljYWxseSBkdWJpb3VzIGlmIGNvbnN0dmFsIGluIGZhY3QgaXMKCQkJCSAqIG9u ZS4gIEJ1dCB3ZSBoYXZlIHRvIGFwcGx5ICpzb21lKiBjb3JyZWN0aW9uIGZvciBlcXVhbGl0 eSwKCQkJCSAqIGFuZCBhbnl3YXkgd2UgY2Fubm90IHRlbGwgaWYgY29uc3R2YWwgaXMgYW4g TUNWLCBzaW5jZSB3ZQoJCQkJICogZG9uJ3QgaGF2ZSBhIHN1aXRhYmxlIGVxdWFsaXR5IG9w ZXJhdG9yIGF0IGhhbmQuCgkJCQkgKi8KCQkJCWlmIChpID09IDEgfHwgaXNndCA9PSBpc2Vx KQoJCQkJewoJCQkJCWRvdWJsZQkJb3RoZXJkaXN0aW5jdDsKCQkJCQlib29sCQlpc2RlZmF1 bHQ7CgkJCQkJQXR0U3RhdHNTbG90IG1jdnNsb3Q7CgoJCQkJCS8qIEdldCBlc3RpbWF0ZWQg bnVtYmVyIG9mIGRpc3RpbmN0IHZhbHVlcyAqLwoJCQkJCW90aGVyZGlzdGluY3QgPSBnZXRf dmFyaWFibGVfbnVtZGlzdGluY3QodmFyZGF0YSwKCQkJCQkJCQkJCQkJCQkJICZpc2RlZmF1 bHQpOwoKCQkJCQkvKiBTdWJ0cmFjdCBvZmYgdGhlIG51bWJlciBvZiBrbm93biBNQ1ZzICov CgkJCQkJaWYgKGdldF9hdHRzdGF0c3Nsb3QoJm1jdnNsb3QsIHZhcmRhdGEtPnN0YXRzVHVw bGUsCgkJCQkJCQkJCQkgU1RBVElTVElDX0tJTkRfTUNWLCBJbnZhbGlkT2lkLAoJCQkJCQkJ CQkJIEFUVFNUQVRTU0xPVF9OVU1CRVJTKSkKCQkJCQl7CgkJCQkJCW90aGVyZGlzdGluY3Qg LT0gbWN2c2xvdC5ubnVtYmVyczsKCQkJCQkJZnJlZV9hdHRzdGF0c3Nsb3QoJm1jdnNsb3Qp OwoJCQkJCX0KCgkJCQkJLyogSWYgcmVzdWx0IGRvZXNuJ3Qgc2VlbSBzYW5lLCBsZWF2ZSBl cV9zZWxlYyBhdCAwICovCgkJCQkJaWYgKG90aGVyZGlzdGluY3QgPiAxKQoJCQkJCQllcV9z ZWxlYyA9IDEuMCAvIG90aGVyZGlzdGluY3Q7CgkJCQl9CgoJCQkJLyoKCQkJCSAqIENvbnZl cnQgdGhlIGNvbnN0YW50IGFuZCB0aGUgdHdvIG5lYXJlc3QgYmluIGJvdW5kYXJ5CgkJCQkg KiB2YWx1ZXMgdG8gYSB1bmlmb3JtIGNvbXBhcmlzb24gc2NhbGUsIGFuZCBkbyBhIGxpbmVh cgoJCQkJICogaW50ZXJwb2xhdGlvbiB3aXRoaW4gdGhpcyBiaW4uCgkJCQkgKi8KCQkJCWlm IChjb252ZXJ0X3RvX3NjYWxhcihjb25zdHZhbCwgY29uc3R0eXBlLCBjb2xsYXRpb24sCgkJ CQkJCQkJCSAgJnZhbCwKCQkJCQkJCQkJICBzc2xvdC52YWx1ZXNbaSAtIDFdLCBzc2xvdC52 YWx1ZXNbaV0sCgkJCQkJCQkJCSAgdmFyZGF0YS0+dmFydHlwZSwKCQkJCQkJCQkJICAmbG93 LCAmaGlnaCkpCgkJCQl7CgkJCQkJaWYgKGhpZ2ggPD0gbG93KQoJCQkJCXsKCQkJCQkJLyog Y29wZSBpZiBiaW4gYm91bmRhcmllcyBhcHBlYXIgaWRlbnRpY2FsICovCgkJCQkJCWJpbmZy YWMgPSAwLjU7CgkJCQkJfQoJCQkJCWVsc2UgaWYgKHZhbCA8PSBsb3cpCgkJCQkJCWJpbmZy YWMgPSAwLjA7CgkJCQkJZWxzZSBpZiAodmFsID49IGhpZ2gpCgkJCQkJCWJpbmZyYWMgPSAx LjA7CgkJCQkJZWxzZQoJCQkJCXsKCQkJCQkJYmluZnJhYyA9ICh2YWwgLSBsb3cpIC8gKGhp Z2ggLSBsb3cpOwoKCQkJCQkJLyoKCQkJCQkJICogV2F0Y2ggb3V0IGZvciB0aGUgcG9zc2li aWxpdHkgdGhhdCB3ZSBnb3QgYSBOYU4gb3IKCQkJCQkJICogSW5maW5pdHkgZnJvbSB0aGUg ZGl2aXNpb24uICBUaGlzIGNhbiBoYXBwZW4KCQkJCQkJICogZGVzcGl0ZSB0aGUgcHJldmlv dXMgY2hlY2tzLCBpZiBmb3IgZXhhbXBsZSAibG93IgoJCQkJCQkgKiBpcyAtSW5maW5pdHku CgkJCQkJCSAqLwoJCQkJCQlpZiAoaXNuYW4oYmluZnJhYykgfHwKCQkJCQkJCWJpbmZyYWMg PCAwLjAgfHwgYmluZnJhYyA+IDEuMCkKCQkJCQkJCWJpbmZyYWMgPSAwLjU7CgkJCQkJfQoJ CQkJfQoJCQkJZWxzZQoJCQkJewoJCQkJCS8qCgkJCQkJICogSWRlYWxseSB3ZSdkIHByb2R1 Y2UgYW4gZXJyb3IgaGVyZSwgb24gdGhlIGdyb3VuZHMgdGhhdAoJCQkJCSAqIHRoZSBnaXZl biBvcGVyYXRvciBzaG91bGRuJ3QgaGF2ZSBzY2FsYXJYWHNlbAoJCQkJCSAqIHJlZ2lzdGVy ZWQgYXMgaXRzIHNlbGVjdGl2aXR5IGZ1bmMgdW5sZXNzIHdlIGNhbiBkZWFsCgkJCQkJICog d2l0aCBpdHMgb3BlcmFuZCB0eXBlcy4gIEJ1dCBjdXJyZW50bHksIGFsbCBtYW5uZXIgb2YK CQkJCQkgKiBzdHVmZiBpcyBpbnZva2luZyBzY2FsYXJYWHNlbCwgc28gZ2l2ZSBhIGRlZmF1 bHQKCQkJCQkgKiBlc3RpbWF0ZSB1bnRpbCB0aGF0IGNhbiBiZSBmaXhlZC4KCQkJCQkgKi8K CQkJCQliaW5mcmFjID0gMC41OwoJCQkJfQoKCQkJCS8qCgkJCQkgKiBOb3csIGNvbXB1dGUg dGhlIG92ZXJhbGwgc2VsZWN0aXZpdHkgYWNyb3NzIHRoZSB2YWx1ZXMKCQkJCSAqIHJlcHJl c2VudGVkIGJ5IHRoZSBoaXN0b2dyYW0uICBXZSBoYXZlIGktMSBmdWxsIGJpbnMgYW5kCgkJ CQkgKiBiaW5mcmFjIHBhcnRpYWwgYmluIGJlbG93IHRoZSBjb25zdGFudC4KCQkJCSAqLwoJ CQkJaGlzdGZyYWMgPSAoZG91YmxlKSAoaSAtIDEpICsgYmluZnJhYzsKCQkJCWhpc3RmcmFj IC89IChkb3VibGUpIChzc2xvdC5udmFsdWVzIC0gMSk7CgoJCQkJLyoKCQkJCSAqIEF0IHRo aXMgcG9pbnQsIGhpc3RmcmFjIGlzIGFuIGVzdGltYXRlIG9mIHRoZSBmcmFjdGlvbiBvZgoJ CQkJICogdGhlIHBvcHVsYXRpb24gcmVwcmVzZW50ZWQgYnkgdGhlIGhpc3RvZ3JhbSB0aGF0 IHNhdGlzZmllcwoJCQkJICogInggPD0gY29uc3R2YWwiLiAgU29tZXdoYXQgcmVtYXJrYWJs eSwgdGhpcyBzdGF0ZW1lbnQgaXMKCQkJCSAqIHRydWUgcmVnYXJkbGVzcyBvZiB3aGljaCBv cGVyYXRvciB3ZSB3ZXJlIGRvaW5nIHRoZSBwcm9iZXMKCQkJCSAqIHdpdGgsIHNvIGxvbmcg YXMgY29udmVydF90b19zY2FsYXIoKSBkZWxpdmVycyByZWFzb25hYmxlCgkJCQkgKiByZXN1 bHRzLiAgSWYgdGhlIHByb2JlIGNvbnN0YW50IGlzIGVxdWFsIHRvIHNvbWUgaGlzdG9ncmFt CgkJCQkgKiBlbnRyeSwgd2Ugd291bGQgaGF2ZSBjb25zaWRlcmVkIHRoZSBiaW4gdG8gdGhl IGxlZnQgb2YgdGhhdAoJCQkJICogZW50cnkgaWYgcHJvYmluZyB3aXRoICI8IiBvciAiPj0i LCBvciB0aGUgYmluIHRvIHRoZSByaWdodAoJCQkJICogaWYgcHJvYmluZyB3aXRoICI8PSIg b3IgIj4iOyBidXQgYmluZnJhYyB3b3VsZCBoYXZlIGNvbWUKCQkJCSAqIG91dCBhcyAxLjAg aW4gdGhlIGZpcnN0IGNhc2UgYW5kIDAuMCBpbiB0aGUgc2Vjb25kLCBsZWFkaW5nCgkJCQkg KiB0byB0aGUgc2FtZSBoaXN0ZnJhYyBpbiBlaXRoZXIgY2FzZS4gIEZvciBwcm9iZSBjb25z dGFudHMKCQkJCSAqIGJldHdlZW4gaGlzdG9ncmFtIGVudHJpZXMsIHdlIGZpbmQgdGhlIHNh bWUgYmluIGFuZCBnZXQgdGhlCgkJCQkgKiBzYW1lIGVzdGltYXRlIHdpdGggYW55IG9wZXJh dG9yLgoJCQkJICoKCQkJCSAqIFRoZSBmYWN0IHRoYXQgdGhlIGVzdGltYXRlIGNvcnJlc3Bv bmRzIHRvICJ4IDw9IGNvbnN0dmFsIgoJCQkJICogYW5kIG5vdCAieCA8IGNvbnN0dmFsIiBp cyBiZWNhdXNlIG9mIHRoZSB3YXkgdGhhdCBBTkFMWVpFCgkJCQkgKiBjb25zdHJ1Y3RzIHRo ZSBoaXN0b2dyYW06IGVhY2ggZW50cnkgaXMsIGVmZmVjdGl2ZWx5LCB0aGUKCQkJCSAqIHJp Z2h0bW9zdCB2YWx1ZSBpbiBpdHMgc2FtcGxlIGJ1Y2tldC4gIFNvIHNlbGVjdGl2aXR5CgkJ CQkgKiB2YWx1ZXMgdGhhdCBhcmUgZXhhY3QgbXVsdGlwbGVzIG9mIDEvKGhpc3RvZ3JhbV9z aXplLTEpCgkJCQkgKiBzaG91bGQgYmUgdW5kZXJzdG9vZCBhcyBlc3RpbWF0ZXMgaW5jbHVk aW5nIGEgaGlzdG9ncmFtCgkJCQkgKiBlbnRyeSBwbHVzIGV2ZXJ5dGhpbmcgdG8gaXRzIGxl ZnQuCgkJCQkgKgoJCQkJICogSG93ZXZlciwgdGhhdCBicmVha3MgZG93biBmb3IgdGhlIGZp cnN0IGhpc3RvZ3JhbSBlbnRyeSwKCQkJCSAqIHdoaWNoIG5lY2Vzc2FyaWx5IGlzIHRoZSBs ZWZ0bW9zdCB2YWx1ZSBpbiBpdHMgc2FtcGxlCgkJCQkgKiBidWNrZXQuICBUaGF0IG1lYW5z IHRoZSBmaXJzdCBoaXN0b2dyYW0gYmluIGlzIHNsaWdodGx5CgkJCQkgKiBuYXJyb3dlciB0 aGFuIHRoZSByZXN0LCBieSBhbiBhbW91bnQgZXF1YWwgdG8gZXFfc2VsZWMuCgkJCQkgKiBB bm90aGVyIHdheSB0byBzYXkgdGhhdCBpcyB0aGF0IHdlIHdhbnQgInggPD0gbGVmdG1vc3Qi IHRvCgkJCQkgKiBiZSBlc3RpbWF0ZWQgYXMgZXFfc2VsZWMgbm90IHplcm8uICBTbywgaWYg d2UncmUgZGVhbGluZwoJCQkJICogd2l0aCB0aGUgZmlyc3QgYmluIChpPT0xKSwgcmVzY2Fs ZSB0byBtYWtlIHRoYXQgdHJ1ZSB3aGlsZQoJCQkJICogYWRqdXN0aW5nIHRoZSByZXN0IG9m IHRoYXQgYmluIGxpbmVhcmx5LgoJCQkJICovCgkJCQlpZiAoaSA9PSAxKQoJCQkJCWhpc3Rm cmFjICs9IGVxX3NlbGVjICogKDEuMCAtIGJpbmZyYWMpOwoKCQkJCS8qCgkJCQkgKiAieCA8 PSBjb25zdHZhbCIgaXMgZ29vZCBpZiB3ZSB3YW50IGFuIGVzdGltYXRlIGZvciAiPD0iIG9y CgkJCQkgKiAiPiIsIGJ1dCBpZiB3ZSBhcmUgZXN0aW1hdGluZyBmb3IgIjwiIG9yICI+PSIs IHdlIG5vdyBuZWVkCgkJCQkgKiB0byBkZWNyZWFzZSB0aGUgZXN0aW1hdGUgYnkgZXFfc2Vs ZWMuCgkJCQkgKi8KCQkJCWlmIChpc2d0ID09IGlzZXEpCgkJCQkJaGlzdGZyYWMgLT0gZXFf c2VsZWM7CgkJCX0KCgkJCS8qCgkJCSAqIE5vdyB0aGUgZXN0aW1hdGUgaXMgZmluaXNoZWQg Zm9yICI8IiBhbmQgIjw9IiBjYXNlcy4gIElmIHdlIGFyZQoJCQkgKiBlc3RpbWF0aW5nIGZv ciAiPiIgb3IgIj49IiwgZmxpcCBpdC4KCQkJICovCgkJCWhpc3Rfc2VsZWMgPSBpc2d0ID8g KDEuMCAtIGhpc3RmcmFjKSA6IGhpc3RmcmFjOwoKCQkJLyoKCQkJICogVGhlIGhpc3RvZ3Jh bSBib3VuZGFyaWVzIGFyZSBvbmx5IGFwcHJveGltYXRlIHRvIGJlZ2luIHdpdGgsCgkJCSAq IGFuZCBtYXkgd2VsbCBiZSBvdXQgb2YgZGF0ZSBhbnl3YXkuICBUaGVyZWZvcmUsIGRvbid0 IGJlbGlldmUKCQkJICogZXh0cmVtZWx5IHNtYWxsIG9yIGxhcmdlIHNlbGVjdGl2aXR5IGVz dGltYXRlcyAtLS0gdW5sZXNzIHdlCgkJCSAqIGdvdCBhY3R1YWwgY3VycmVudCBlbmRwb2lu dCB2YWx1ZXMgZnJvbSB0aGUgdGFibGUsIGluIHdoaWNoCgkJCSAqIGNhc2UganVzdCBkbyB0 aGUgdXN1YWwgc2FuaXR5IGNsYW1wLiAgU29tZXdoYXQgYXJiaXRyYXJpbHksIHdlCgkJCSAq IHNldCB0aGUgY3V0b2ZmIGZvciBvdGhlciBjYXNlcyBhdCBhIGh1bmRyZWR0aCBvZiB0aGUg aGlzdG9ncmFtCgkJCSAqIHJlc29sdXRpb24uCgkJCSAqLwoJCQlpZiAoaGF2ZV9lbmQpCgkJ CQlDTEFNUF9QUk9CQUJJTElUWShoaXN0X3NlbGVjKTsKCQkJZWxzZQoJCQl7CgkJCQlkb3Vi bGUJCWN1dG9mZiA9IDAuMDEgLyAoZG91YmxlKSAoc3Nsb3QubnZhbHVlcyAtIDEpOwoKCQkJ CWlmIChoaXN0X3NlbGVjIDwgY3V0b2ZmKQoJCQkJCWhpc3Rfc2VsZWMgPSBjdXRvZmY7CgkJ CQllbHNlIGlmIChoaXN0X3NlbGVjID4gMS4wIC0gY3V0b2ZmKQoJCQkJCWhpc3Rfc2VsZWMg PSAxLjAgLSBjdXRvZmY7CgkJCX0KCQl9CgkJZWxzZSBpZiAoc3Nsb3QubnZhbHVlcyA+IDEp CgkJewoJCQkvKgoJCQkgKiBJZiB3ZSBnZXQgaGVyZSwgd2UgaGF2ZSBhIGhpc3RvZ3JhbSBi dXQgaXQncyBub3Qgc29ydGVkIHRoZSB3YXkKCQkJICogd2Ugd2FudC4gIERvIGEgYnJ1dGUt Zm9yY2Ugc2VhcmNoIHRvIHNlZSBob3cgbWFueSBvZiB0aGUKCQkJICogZW50cmllcyBzYXRp c2Z5IHRoZSBjb21wYXJpc29uIGNvbmRpdGlvbiwgYW5kIHRha2UgdGhhdAoJCQkgKiBmcmFj dGlvbiBhcyBvdXIgZXN0aW1hdGUuICAoVGhpcyBpcyBpZGVudGljYWwgdG8gdGhlIGlubmVy IGxvb3AKCQkJICogb2YgaGlzdG9ncmFtX3NlbGVjdGl2aXR5OyBtYXliZSBzaGFyZSBjb2Rl PykKCQkJICovCgkJCUxPQ0FMX0ZDSU5GTyhmY2luZm8sIDIpOwoJCQlpbnQJCQlubWF0Y2gg PSAwOwoKCQkJSW5pdEZ1bmN0aW9uQ2FsbEluZm9EYXRhKCpmY2luZm8sIG9wcHJvYywgMiwg Y29sbGF0aW9uLAoJCQkJCQkJCQkgTlVMTCwgTlVMTCk7CgkJCWZjaW5mby0+YXJnc1swXS5p c251bGwgPSBmYWxzZTsKCQkJZmNpbmZvLT5hcmdzWzFdLmlzbnVsbCA9IGZhbHNlOwoJCQlm Y2luZm8tPmFyZ3NbMV0udmFsdWUgPSBjb25zdHZhbDsKCQkJZm9yIChpbnQgaSA9IDA7IGkg PCBzc2xvdC5udmFsdWVzOyBpKyspCgkJCXsKCQkJCURhdHVtCQlmcmVzdWx0OwoKCQkJCWZj aW5mby0+YXJnc1swXS52YWx1ZSA9IHNzbG90LnZhbHVlc1tpXTsKCQkJCWZjaW5mby0+aXNu dWxsID0gZmFsc2U7CgkJCQlmcmVzdWx0ID0gRnVuY3Rpb25DYWxsSW52b2tlKGZjaW5mbyk7 CgkJCQlpZiAoIWZjaW5mby0+aXNudWxsICYmIERhdHVtR2V0Qm9vbChmcmVzdWx0KSkKCQkJ CQlubWF0Y2grKzsKCQkJfQoJCQloaXN0X3NlbGVjID0gKChkb3VibGUpIG5tYXRjaCkgLyAo KGRvdWJsZSkgc3Nsb3QubnZhbHVlcyk7CgoJCQkvKgoJCQkgKiBBcyBhYm92ZSwgY2xhbXAg dG8gYSBodW5kcmVkdGggb2YgdGhlIGhpc3RvZ3JhbSByZXNvbHV0aW9uLgoJCQkgKiBUaGlz IGNhc2UgaXMgc3VyZWx5IGV2ZW4gbGVzcyB0cnVzdHdvcnRoeSB0aGFuIHRoZSBub3JtYWwg b25lLAoJCQkgKiBzbyB3ZSBzaG91bGRuJ3QgYmVsaWV2ZSBleGFjdCAwIG9yIDEgc2VsZWN0 aXZpdHkuICAoTWF5YmUgdGhlCgkJCSAqIGNsYW1wIHNob3VsZCBiZSBtb3JlIHJlc3RyaWN0 aXZlIGluIHRoaXMgY2FzZT8pCgkJCSAqLwoJCQl7CgkJCQlkb3VibGUJCWN1dG9mZiA9IDAu MDEgLyAoZG91YmxlKSAoc3Nsb3QubnZhbHVlcyAtIDEpOwoKCQkJCWlmIChoaXN0X3NlbGVj IDwgY3V0b2ZmKQoJCQkJCWhpc3Rfc2VsZWMgPSBjdXRvZmY7CgkJCQllbHNlIGlmIChoaXN0 X3NlbGVjID4gMS4wIC0gY3V0b2ZmKQoJCQkJCWhpc3Rfc2VsZWMgPSAxLjAgLSBjdXRvZmY7 CgkJCX0KCQl9CgoJCWZyZWVfYXR0c3RhdHNzbG90KCZzc2xvdCk7Cgl9CgoJcmV0dXJuIGhp c3Rfc2VsZWM7Cn0KCi8qCiAqIENvbW1vbiB3cmFwcGVyIGZ1bmN0aW9uIGZvciB0aGUgc2Vs ZWN0aXZpdHkgZXN0aW1hdG9ycyB0aGF0IHNpbXBseQogKiBpbnZva2Ugc2NhbGFyaW5lcXNl bCgpLgogKi8Kc3RhdGljIERhdHVtCnNjYWxhcmluZXFzZWxfd3JhcHBlcihQR19GVU5DVElP Tl9BUkdTLCBib29sIGlzZ3QsIGJvb2wgaXNlcSkKewoJUGxhbm5lckluZm8gKnJvb3QgPSAo UGxhbm5lckluZm8gKikgUEdfR0VUQVJHX1BPSU5URVIoMCk7CglPaWQJCQlvcGVyYXRvciA9 IFBHX0dFVEFSR19PSUQoMSk7CglMaXN0CSAgICphcmdzID0gKExpc3QgKikgUEdfR0VUQVJH X1BPSU5URVIoMik7CglpbnQJCQl2YXJSZWxpZCA9IFBHX0dFVEFSR19JTlQzMigzKTsKCU9p ZAkJCWNvbGxhdGlvbiA9IFBHX0dFVF9DT0xMQVRJT04oKTsKCVZhcmlhYmxlU3RhdERhdGEg dmFyZGF0YTsKCU5vZGUJICAgKm90aGVyOwoJYm9vbAkJdmFyb25sZWZ0OwoJRGF0dW0JCWNv bnN0dmFsOwoJT2lkCQkJY29uc3R0eXBlOwoJZG91YmxlCQlzZWxlYzsKCgkvKgoJICogSWYg ZXhwcmVzc2lvbiBpcyBub3QgdmFyaWFibGUgb3Agc29tZXRoaW5nIG9yIHNvbWV0aGluZyBv cCB2YXJpYWJsZSwKCSAqIHRoZW4gcHVudCBhbmQgcmV0dXJuIGEgZGVmYXVsdCBlc3RpbWF0 ZS4KCSAqLwoJaWYgKCFnZXRfcmVzdHJpY3Rpb25fdmFyaWFibGUocm9vdCwgYXJncywgdmFy UmVsaWQsCgkJCQkJCQkJICAmdmFyZGF0YSwgJm90aGVyLCAmdmFyb25sZWZ0KSkKCQlQR19S RVRVUk5fRkxPQVQ4KERFRkFVTFRfSU5FUV9TRUwpOwoKCS8qCgkgKiBDYW4ndCBkbyBhbnl0 aGluZyB1c2VmdWwgaWYgdGhlIHNvbWV0aGluZyBpcyBub3QgYSBjb25zdGFudCwgZWl0aGVy LgoJICovCglpZiAoIUlzQShvdGhlciwgQ29uc3QpKQoJewoJCVJlbGVhc2VWYXJpYWJsZVN0 YXRzKHZhcmRhdGEpOwoJCVBHX1JFVFVSTl9GTE9BVDgoREVGQVVMVF9JTkVRX1NFTCk7Cgl9 CgoJLyoKCSAqIElmIHRoZSBjb25zdGFudCBpcyBOVUxMLCBhc3N1bWUgb3BlcmF0b3IgaXMg c3RyaWN0IGFuZCByZXR1cm4gemVybywgaWUsCgkgKiBvcGVyYXRvciB3aWxsIG5ldmVyIHJl dHVybiBUUlVFLgoJICovCglpZiAoKChDb25zdCAqKSBvdGhlciktPmNvbnN0aXNudWxsKQoJ ewoJCVJlbGVhc2VWYXJpYWJsZVN0YXRzKHZhcmRhdGEpOwoJCVBHX1JFVFVSTl9GTE9BVDgo MC4wKTsKCX0KCWNvbnN0dmFsID0gKChDb25zdCAqKSBvdGhlciktPmNvbnN0dmFsdWU7Cglj b25zdHR5cGUgPSAoKENvbnN0ICopIG90aGVyKS0+Y29uc3R0eXBlOwoKCS8qCgkgKiBGb3Jj ZSB0aGUgdmFyIHRvIGJlIG9uIHRoZSBsZWZ0IHRvIHNpbXBsaWZ5IGxvZ2ljIGluIHNjYWxh cmluZXFzZWwuCgkgKi8KCWlmICghdmFyb25sZWZ0KQoJewoJCW9wZXJhdG9yID0gZ2V0X2Nv bW11dGF0b3Iob3BlcmF0b3IpOwoJCWlmICghb3BlcmF0b3IpCgkJewoJCQkvKiBVc2UgZGVm YXVsdCBzZWxlY3Rpdml0eSAoc2hvdWxkIHdlIHJhaXNlIGFuIGVycm9yIGluc3RlYWQ/KSAq LwoJCQlSZWxlYXNlVmFyaWFibGVTdGF0cyh2YXJkYXRhKTsKCQkJUEdfUkVUVVJOX0ZMT0FU OChERUZBVUxUX0lORVFfU0VMKTsKCQl9CgkJaXNndCA9ICFpc2d0OwoJfQoKCS8qIFRoZSBy ZXN0IG9mIHRoZSB3b3JrIGlzIGRvbmUgYnkgc2NhbGFyaW5lcXNlbCgpLiAqLwoJc2VsZWMg PSBzY2FsYXJpbmVxc2VsKHJvb3QsIG9wZXJhdG9yLCBpc2d0LCBpc2VxLCBjb2xsYXRpb24s CgkJCQkJCSAgJnZhcmRhdGEsIGNvbnN0dmFsLCBjb25zdHR5cGUpOwoKCVJlbGVhc2VWYXJp YWJsZVN0YXRzKHZhcmRhdGEpOwoKCVBHX1JFVFVSTl9GTE9BVDgoKGZsb2F0OCkgc2VsZWMp Owp9CgovKgogKgkJc2NhbGFybHRzZWwJCS0gU2VsZWN0aXZpdHkgb2YgIjwiIGZvciBzY2Fs YXJzLgogKi8KRGF0dW0Kc2NhbGFybHRzZWwoUEdfRlVOQ1RJT05fQVJHUykKewoJcmV0dXJu IHNjYWxhcmluZXFzZWxfd3JhcHBlcihmY2luZm8sIGZhbHNlLCBmYWxzZSk7Cn0KCi8qCiAq CQlzY2FsYXJsZXNlbAkJLSBTZWxlY3Rpdml0eSBvZiAiPD0iIGZvciBzY2FsYXJzLgogKi8K RGF0dW0Kc2NhbGFybGVzZWwoUEdfRlVOQ1RJT05fQVJHUykKewoJcmV0dXJuIHNjYWxhcmlu ZXFzZWxfd3JhcHBlcihmY2luZm8sIGZhbHNlLCB0cnVlKTsKfQoKLyoKICoJCXNjYWxhcmd0 c2VsCQktIFNlbGVjdGl2aXR5IG9mICI+IiBmb3Igc2NhbGFycy4KICovCkRhdHVtCnNjYWxh cmd0c2VsKFBHX0ZVTkNUSU9OX0FSR1MpCnsKCXJldHVybiBzY2FsYXJpbmVxc2VsX3dyYXBw ZXIoZmNpbmZvLCB0cnVlLCBmYWxzZSk7Cn0KCi8qCiAqCQlzY2FsYXJnZXNlbAkJLSBTZWxl Y3Rpdml0eSBvZiAiPj0iIGZvciBzY2FsYXJzLgogKi8KRGF0dW0Kc2NhbGFyZ2VzZWwoUEdf RlVOQ1RJT05fQVJHUykKewoJcmV0dXJuIHNjYWxhcmluZXFzZWxfd3JhcHBlcihmY2luZm8s IHRydWUsIHRydWUpOwp9CgovKgogKgkJYm9vbHZhcnNlbAkJLSBTZWxlY3Rpdml0eSBvZiBC b29sZWFuIHZhcmlhYmxlLgogKgogKiBUaGlzIGNhbiBhY3R1YWxseSBiZSBjYWxsZWQgb24g YW55IGJvb2xlYW4tdmFsdWVkIGV4cHJlc3Npb24uICBJZiBpdAogKiBpbnZvbHZlcyBvbmx5 IFZhcnMgb2YgdGhlIHNwZWNpZmllZCByZWxhdGlvbiwgYW5kIGlmIHRoZXJlIGFyZSBzdGF0 aXN0aWNzCiAqIGFib3V0IHRoZSBWYXIgb3IgZXhwcmVzc2lvbiAodGhlIGxhdHRlciBpcyBw b3NzaWJsZSBpZiBpdCdzIGluZGV4ZWQpIHRoZW4KICogd2UnbGwgcHJvZHVjZSBhIHJlYWwg ZXN0aW1hdGU7IG90aGVyd2lzZSBpdCdzIGp1c3QgYSBkZWZhdWx0LgogKi8KU2VsZWN0aXZp dHkKYm9vbHZhcnNlbChQbGFubmVySW5mbyAqcm9vdCwgTm9kZSAqYXJnLCBpbnQgdmFyUmVs aWQpCnsKCVZhcmlhYmxlU3RhdERhdGEgdmFyZGF0YTsKCWRvdWJsZQkJc2VsZWM7CgoJZXhh bWluZV92YXJpYWJsZShyb290LCBhcmcsIHZhclJlbGlkLCAmdmFyZGF0YSk7CglpZiAoSGVh cFR1cGxlSXNWYWxpZCh2YXJkYXRhLnN0YXRzVHVwbGUpKQoJewoJCS8qCgkJICogQSBib29s ZWFuIHZhcmlhYmxlIFYgaXMgZXF1aXZhbGVudCB0byB0aGUgY2xhdXNlIFYgPSAndCcsIHNv IHdlCgkJICogY29tcHV0ZSB0aGUgc2VsZWN0aXZpdHkgYXMgaWYgdGhhdCBpcyB3aGF0IHdl IGhhdmUuCgkJICovCgkJc2VsZWMgPSB2YXJfZXFfY29uc3QoJnZhcmRhdGEsIEJvb2xlYW5F cXVhbE9wZXJhdG9yLCBJbnZhbGlkT2lkLAoJCQkJCQkJIEJvb2xHZXREYXR1bSh0cnVlKSwg ZmFsc2UsIHRydWUsIGZhbHNlKTsKCX0KCWVsc2UgaWYgKGlzX2Z1bmNjbGF1c2UoYXJnKSkK CXsKCQkvKgoJCSAqIElmIHdlIGhhdmUgbm8gc3RhdHMgYW5kIGl0J3MgYSBmdW5jdGlvbiBj YWxsLCBlc3RpbWF0ZSAwLjMzMzMzMzMuCgkJICogVGhpcyBzZWVtcyBhIHByZXR0eSB1bnBy aW5jaXBsZWQgY2hvaWNlLCBidXQgUG9zdGdyZXMgaGFzIGJlZW4KCQkgKiB1c2luZyB0aGF0 IGVzdGltYXRlIGZvciBmdW5jdGlvbiBjYWxscyBzaW5jZSAxOTkyLiAgVGhlIGhvYXJpbmVz cwoJCSAqIG9mIHRoaXMgYmVoYXZpb3Igc3VnZ2VzdHMgdGhhdCB3ZSBzaG91bGQgbm90IGJl IGluIHRvbyBtdWNoIGh1cnJ5CgkJICogdG8gdXNlIGFub3RoZXIgdmFsdWUuCgkJICovCgkJ c2VsZWMgPSAwLjMzMzMzMzM7Cgl9CgllbHNlCgl7CgkJLyogT3RoZXJ3aXNlLCB0aGUgZGVm YXVsdCBlc3RpbWF0ZSBpcyAwLjUgKi8KCQlzZWxlYyA9IDAuNTsKCX0KCVJlbGVhc2VWYXJp YWJsZVN0YXRzKHZhcmRhdGEpOwoJcmV0dXJuIHNlbGVjOwp9CgovKgogKgkJYm9vbHRlc3Rz ZWwJCS0gU2VsZWN0aXZpdHkgb2YgQm9vbGVhblRlc3QgTm9kZS4KICovClNlbGVjdGl2aXR5 CmJvb2x0ZXN0c2VsKFBsYW5uZXJJbmZvICpyb290LCBCb29sVGVzdFR5cGUgYm9vbHRlc3R0 eXBlLCBOb2RlICphcmcsCgkJCWludCB2YXJSZWxpZCwgSm9pblR5cGUgam9pbnR5cGUsIFNw ZWNpYWxKb2luSW5mbyAqc2ppbmZvKQp7CglWYXJpYWJsZVN0YXREYXRhIHZhcmRhdGE7Cglk b3VibGUJCXNlbGVjOwoKCWV4YW1pbmVfdmFyaWFibGUocm9vdCwgYXJnLCB2YXJSZWxpZCwg JnZhcmRhdGEpOwoKCWlmIChIZWFwVHVwbGVJc1ZhbGlkKHZhcmRhdGEuc3RhdHNUdXBsZSkp Cgl7CgkJRm9ybV9wZ19zdGF0aXN0aWMgc3RhdHM7CgkJZG91YmxlCQlmcmVxX251bGw7CgkJ QXR0U3RhdHNTbG90IHNzbG90OwoKCQlzdGF0cyA9IChGb3JtX3BnX3N0YXRpc3RpYykgR0VU U1RSVUNUKHZhcmRhdGEuc3RhdHNUdXBsZSk7CgkJZnJlcV9udWxsID0gc3RhdHMtPnN0YW51 bGxmcmFjOwoKCQlpZiAoZ2V0X2F0dHN0YXRzc2xvdCgmc3Nsb3QsIHZhcmRhdGEuc3RhdHNU dXBsZSwKCQkJCQkJCSBTVEFUSVNUSUNfS0lORF9NQ1YsIEludmFsaWRPaWQsCgkJCQkJCQkg QVRUU1RBVFNTTE9UX1ZBTFVFUyB8IEFUVFNUQVRTU0xPVF9OVU1CRVJTKQoJCQkmJiBzc2xv dC5ubnVtYmVycyA+IDApCgkJewoJCQlkb3VibGUJCWZyZXFfdHJ1ZTsKCQkJZG91YmxlCQlm cmVxX2ZhbHNlOwoKCQkJLyoKCQkJICogR2V0IGZpcnN0IE1DViBmcmVxdWVuY3kgYW5kIGRl cml2ZSBmcmVxdWVuY3kgZm9yIHRydWUuCgkJCSAqLwoJCQlpZiAoRGF0dW1HZXRCb29sKHNz bG90LnZhbHVlc1swXSkpCgkJCQlmcmVxX3RydWUgPSBzc2xvdC5udW1iZXJzWzBdOwoJCQll bHNlCgkJCQlmcmVxX3RydWUgPSAxLjAgLSBzc2xvdC5udW1iZXJzWzBdIC0gZnJlcV9udWxs OwoKCQkJLyoKCQkJICogTmV4dCBkZXJpdmUgZnJlcXVlbmN5IGZvciBmYWxzZS4gVGhlbiB1 c2UgdGhlc2UgYXMgYXBwcm9wcmlhdGUKCQkJICogdG8gZGVyaXZlIGZyZXF1ZW5jeSBmb3Ig ZWFjaCBjYXNlLgoJCQkgKi8KCQkJZnJlcV9mYWxzZSA9IDEuMCAtIGZyZXFfdHJ1ZSAtIGZy ZXFfbnVsbDsKCgkJCXN3aXRjaCAoYm9vbHRlc3R0eXBlKQoJCQl7CgkJCQljYXNlIElTX1VO S05PV046CgkJCQkJLyogc2VsZWN0IG9ubHkgTlVMTCB2YWx1ZXMgKi8KCQkJCQlzZWxlYyA9 IGZyZXFfbnVsbDsKCQkJCQlicmVhazsKCQkJCWNhc2UgSVNfTk9UX1VOS05PV046CgkJCQkJ Lyogc2VsZWN0IG5vbi1OVUxMIHZhbHVlcyAqLwoJCQkJCXNlbGVjID0gMS4wIC0gZnJlcV9u dWxsOwoJCQkJCWJyZWFrOwoJCQkJY2FzZSBJU19UUlVFOgoJCQkJCS8qIHNlbGVjdCBvbmx5 IFRSVUUgdmFsdWVzICovCgkJCQkJc2VsZWMgPSBmcmVxX3RydWU7CgkJCQkJYnJlYWs7CgkJ CQljYXNlIElTX05PVF9UUlVFOgoJCQkJCS8qIHNlbGVjdCBub24tVFJVRSB2YWx1ZXMgKi8K CQkJCQlzZWxlYyA9IDEuMCAtIGZyZXFfdHJ1ZTsKCQkJCQlicmVhazsKCQkJCWNhc2UgSVNf RkFMU0U6CgkJCQkJLyogc2VsZWN0IG9ubHkgRkFMU0UgdmFsdWVzICovCgkJCQkJc2VsZWMg PSBmcmVxX2ZhbHNlOwoJCQkJCWJyZWFrOwoJCQkJY2FzZSBJU19OT1RfRkFMU0U6CgkJCQkJ Lyogc2VsZWN0IG5vbi1GQUxTRSB2YWx1ZXMgKi8KCQkJCQlzZWxlYyA9IDEuMCAtIGZyZXFf ZmFsc2U7CgkJCQkJYnJlYWs7CgkJCQlkZWZhdWx0OgoJCQkJCWVsb2coRVJST1IsICJ1bnJl Y29nbml6ZWQgYm9vbHRlc3R0eXBlOiAlZCIsCgkJCQkJCSAoaW50KSBib29sdGVzdHR5cGUp OwoJCQkJCXNlbGVjID0gMC4wOwkvKiBLZWVwIGNvbXBpbGVyIHF1aWV0ICovCgkJCQkJYnJl YWs7CgkJCX0KCgkJCWZyZWVfYXR0c3RhdHNzbG90KCZzc2xvdCk7CgkJfQoJCWVsc2UKCQl7 CgkJCS8qCgkJCSAqIE5vIG1vc3QtY29tbW9uLXZhbHVlIGluZm8gYXZhaWxhYmxlLiBTdGls bCBoYXZlIG51bGwgZnJhY3Rpb24KCQkJICogaW5mb3JtYXRpb24sIHNvIHVzZSBpdCBmb3Ig SVMgW05PVF0gVU5LTk9XTi4gT3RoZXJ3aXNlIGFkanVzdAoJCQkgKiBmb3IgbnVsbCBmcmFj dGlvbiBhbmQgYXNzdW1lIGEgNTAtNTAgc3BsaXQgb2YgVFJVRSBhbmQgRkFMU0UuCgkJCSAq LwoJCQlzd2l0Y2ggKGJvb2x0ZXN0dHlwZSkKCQkJewoJCQkJY2FzZSBJU19VTktOT1dOOgoJ CQkJCS8qIHNlbGVjdCBvbmx5IE5VTEwgdmFsdWVzICovCgkJCQkJc2VsZWMgPSBmcmVxX251 bGw7CgkJCQkJYnJlYWs7CgkJCQljYXNlIElTX05PVF9VTktOT1dOOgoJCQkJCS8qIHNlbGVj dCBub24tTlVMTCB2YWx1ZXMgKi8KCQkJCQlzZWxlYyA9IDEuMCAtIGZyZXFfbnVsbDsKCQkJ CQlicmVhazsKCQkJCWNhc2UgSVNfVFJVRToKCQkJCWNhc2UgSVNfRkFMU0U6CgkJCQkJLyog QXNzdW1lIHdlIHNlbGVjdCBoYWxmIG9mIHRoZSBub24tTlVMTCB2YWx1ZXMgKi8KCQkJCQlz ZWxlYyA9ICgxLjAgLSBmcmVxX251bGwpIC8gMi4wOwoJCQkJCWJyZWFrOwoJCQkJY2FzZSBJ U19OT1RfVFJVRToKCQkJCWNhc2UgSVNfTk9UX0ZBTFNFOgoJCQkJCS8qIEFzc3VtZSB3ZSBz ZWxlY3QgTlVMTHMgcGx1cyBoYWxmIG9mIHRoZSBub24tTlVMTHMgKi8KCQkJCQkvKiBlcXVp di4gdG8gZnJlcV9udWxsICsgKDEuMCAtIGZyZXFfbnVsbCkgLyAyLjAgKi8KCQkJCQlzZWxl YyA9IChmcmVxX251bGwgKyAxLjApIC8gMi4wOwoJCQkJCWJyZWFrOwoJCQkJZGVmYXVsdDoK CQkJCQllbG9nKEVSUk9SLCAidW5yZWNvZ25pemVkIGJvb2x0ZXN0dHlwZTogJWQiLAoJCQkJ CQkgKGludCkgYm9vbHRlc3R0eXBlKTsKCQkJCQlzZWxlYyA9IDAuMDsJLyogS2VlcCBjb21w aWxlciBxdWlldCAqLwoJCQkJCWJyZWFrOwoJCQl9CgkJfQoJfQoJZWxzZQoJewoJCS8qCgkJ ICogSWYgd2UgY2FuJ3QgZ2V0IHZhcmlhYmxlIHN0YXRpc3RpY3MgZm9yIHRoZSBhcmd1bWVu dCwgcGVyaGFwcwoJCSAqIGNsYXVzZV9zZWxlY3Rpdml0eSBjYW4gZG8gc29tZXRoaW5nIHdp dGggaXQuICBXZSBpZ25vcmUgdGhlCgkJICogcG9zc2liaWxpdHkgb2YgYSBOVUxMIHZhbHVl IHdoZW4gdXNpbmcgY2xhdXNlX3NlbGVjdGl2aXR5LCBhbmQganVzdAoJCSAqIGFzc3VtZSB0 aGUgdmFsdWUgaXMgZWl0aGVyIFRSVUUgb3IgRkFMU0UuCgkJICovCgkJc3dpdGNoIChib29s dGVzdHR5cGUpCgkJewoJCQljYXNlIElTX1VOS05PV046CgkJCQlzZWxlYyA9IERFRkFVTFRf VU5LX1NFTDsKCQkJCWJyZWFrOwoJCQljYXNlIElTX05PVF9VTktOT1dOOgoJCQkJc2VsZWMg PSBERUZBVUxUX05PVF9VTktfU0VMOwoJCQkJYnJlYWs7CgkJCWNhc2UgSVNfVFJVRToKCQkJ Y2FzZSBJU19OT1RfRkFMU0U6CgkJCQlzZWxlYyA9IChkb3VibGUpIGNsYXVzZV9zZWxlY3Rp dml0eShyb290LCBhcmcsCgkJCQkJCQkJCQkJCQl2YXJSZWxpZCwKCQkJCQkJCQkJCQkJCWpv aW50eXBlLCBzamluZm8pOwoJCQkJYnJlYWs7CgkJCWNhc2UgSVNfRkFMU0U6CgkJCWNhc2Ug SVNfTk9UX1RSVUU6CgkJCQlzZWxlYyA9IDEuMCAtIChkb3VibGUpIGNsYXVzZV9zZWxlY3Rp dml0eShyb290LCBhcmcsCgkJCQkJCQkJCQkJCQkJICB2YXJSZWxpZCwKCQkJCQkJCQkJCQkJ CQkgIGpvaW50eXBlLCBzamluZm8pOwoJCQkJYnJlYWs7CgkJCWRlZmF1bHQ6CgkJCQllbG9n KEVSUk9SLCAidW5yZWNvZ25pemVkIGJvb2x0ZXN0dHlwZTogJWQiLAoJCQkJCSAoaW50KSBi b29sdGVzdHR5cGUpOwoJCQkJc2VsZWMgPSAwLjA7CS8qIEtlZXAgY29tcGlsZXIgcXVpZXQg Ki8KCQkJCWJyZWFrOwoJCX0KCX0KCglSZWxlYXNlVmFyaWFibGVTdGF0cyh2YXJkYXRhKTsK CgkvKiByZXN1bHQgc2hvdWxkIGJlIGluIHJhbmdlLCBidXQgbWFrZSBzdXJlLi4uICovCglD TEFNUF9QUk9CQUJJTElUWShzZWxlYyk7CgoJcmV0dXJuIChTZWxlY3Rpdml0eSkgc2VsZWM7 Cn0KCi8qCiAqCQludWxsdGVzdHNlbAkJLSBTZWxlY3Rpdml0eSBvZiBOdWxsVGVzdCBOb2Rl LgogKi8KU2VsZWN0aXZpdHkKbnVsbHRlc3RzZWwoUGxhbm5lckluZm8gKnJvb3QsIE51bGxU ZXN0VHlwZSBudWxsdGVzdHR5cGUsIE5vZGUgKmFyZywKCQkJaW50IHZhclJlbGlkLCBKb2lu VHlwZSBqb2ludHlwZSwgU3BlY2lhbEpvaW5JbmZvICpzamluZm8pCnsKCVZhcmlhYmxlU3Rh dERhdGEgdmFyZGF0YTsKCWRvdWJsZQkJc2VsZWM7CgoJZXhhbWluZV92YXJpYWJsZShyb290 LCBhcmcsIHZhclJlbGlkLCAmdmFyZGF0YSk7CgoJaWYgKEhlYXBUdXBsZUlzVmFsaWQodmFy ZGF0YS5zdGF0c1R1cGxlKSkKCXsKCQlGb3JtX3BnX3N0YXRpc3RpYyBzdGF0czsKCQlkb3Vi bGUJCWZyZXFfbnVsbDsKCgkJc3RhdHMgPSAoRm9ybV9wZ19zdGF0aXN0aWMpIEdFVFNUUlVD VCh2YXJkYXRhLnN0YXRzVHVwbGUpOwoJCWZyZXFfbnVsbCA9IHN0YXRzLT5zdGFudWxsZnJh YzsKCgkJc3dpdGNoIChudWxsdGVzdHR5cGUpCgkJewoJCQljYXNlIElTX05VTEw6CgoJCQkJ LyoKCQkJCSAqIFVzZSBmcmVxX251bGwgZGlyZWN0bHkuCgkJCQkgKi8KCQkJCXNlbGVjID0g ZnJlcV9udWxsOwoJCQkJYnJlYWs7CgkJCWNhc2UgSVNfTk9UX05VTEw6CgoJCQkJLyoKCQkJ CSAqIFNlbGVjdCBub3QgdW5rbm93biAobm90IG51bGwpIHZhbHVlcy4gQ2FsY3VsYXRlIGZy b20KCQkJCSAqIGZyZXFfbnVsbC4KCQkJCSAqLwoJCQkJc2VsZWMgPSAxLjAgLSBmcmVxX251 bGw7CgkJCQlicmVhazsKCQkJZGVmYXVsdDoKCQkJCWVsb2coRVJST1IsICJ1bnJlY29nbml6 ZWQgbnVsbHRlc3R0eXBlOiAlZCIsCgkJCQkJIChpbnQpIG51bGx0ZXN0dHlwZSk7CgkJCQly ZXR1cm4gKFNlbGVjdGl2aXR5KSAwOyAvKiBrZWVwIGNvbXBpbGVyIHF1aWV0ICovCgkJfQoJ fQoJZWxzZSBpZiAodmFyZGF0YS52YXIgJiYgSXNBKHZhcmRhdGEudmFyLCBWYXIpICYmCgkJ CSAoKFZhciAqKSB2YXJkYXRhLnZhciktPnZhcmF0dG5vIDwgMCkKCXsKCQkvKgoJCSAqIFRo ZXJlIGFyZSBubyBzdGF0cyBmb3Igc3lzdGVtIGNvbHVtbnMsIGJ1dCB3ZSBrbm93IHRoZXkg YXJlIG5ldmVyCgkJICogTlVMTC4KCQkgKi8KCQlzZWxlYyA9IChudWxsdGVzdHR5cGUgPT0g SVNfTlVMTCkgPyAwLjAgOiAxLjA7Cgl9CgllbHNlCgl7CgkJLyoKCQkgKiBObyBBTkFMWVpF IHN0YXRzIGF2YWlsYWJsZSwgc28gbWFrZSBhIGd1ZXNzCgkJICovCgkJc3dpdGNoIChudWxs dGVzdHR5cGUpCgkJewoJCQljYXNlIElTX05VTEw6CgkJCQlzZWxlYyA9IERFRkFVTFRfVU5L X1NFTDsKCQkJCWJyZWFrOwoJCQljYXNlIElTX05PVF9OVUxMOgoJCQkJc2VsZWMgPSBERUZB VUxUX05PVF9VTktfU0VMOwoJCQkJYnJlYWs7CgkJCWRlZmF1bHQ6CgkJCQllbG9nKEVSUk9S LCAidW5yZWNvZ25pemVkIG51bGx0ZXN0dHlwZTogJWQiLAoJCQkJCSAoaW50KSBudWxsdGVz dHR5cGUpOwoJCQkJcmV0dXJuIChTZWxlY3Rpdml0eSkgMDsgLyoga2VlcCBjb21waWxlciBx dWlldCAqLwoJCX0KCX0KCglSZWxlYXNlVmFyaWFibGVTdGF0cyh2YXJkYXRhKTsKCgkvKiBy ZXN1bHQgc2hvdWxkIGJlIGluIHJhbmdlLCBidXQgbWFrZSBzdXJlLi4uICovCglDTEFNUF9Q Uk9CQUJJTElUWShzZWxlYyk7CgoJcmV0dXJuIChTZWxlY3Rpdml0eSkgc2VsZWM7Cn0KCi8q CiAqIHN0cmlwX2FycmF5X2NvZXJjaW9uIC0gc3RyaXAgYmluYXJ5LWNvbXBhdGlibGUgcmVs YWJlbGluZyBmcm9tIGFuIGFycmF5IGV4cHIKICoKICogRm9yIGFycmF5IHZhbHVlcywgdGhl IHBhcnNlciBub3JtYWxseSBnZW5lcmF0ZXMgQXJyYXlDb2VyY2VFeHByIGNvbnZlcnNpb25z LAogKiBidXQgaXQgc2VlbXMgcG9zc2libGUgdGhhdCBSZWxhYmVsVHlwZSBtaWdodCBzaG93 IHVwLiAgQWxzbywgdGhlIHBsYW5uZXIKICogaXMgbm90IGN1cnJlbnRseSB0ZW5zZSBhYm91 dCBjb2xsYXBzaW5nIHN0YWNrZWQgQXJyYXlDb2VyY2VFeHByIG5vZGVzLAogKiBzbyB3ZSBu ZWVkIHRvIGJlIHJlYWR5IHRvIGRlYWwgd2l0aCBtb3JlIHRoYW4gb25lIGxldmVsLgogKi8K c3RhdGljIE5vZGUgKgpzdHJpcF9hcnJheV9jb2VyY2lvbihOb2RlICpub2RlKQp7Cglmb3Ig KDs7KQoJewoJCWlmIChub2RlICYmIElzQShub2RlLCBBcnJheUNvZXJjZUV4cHIpKQoJCXsK CQkJQXJyYXlDb2VyY2VFeHByICphY29lcmNlID0gKEFycmF5Q29lcmNlRXhwciAqKSBub2Rl OwoKCQkJLyoKCQkJICogSWYgdGhlIHBlci1lbGVtZW50IGV4cHJlc3Npb24gaXMganVzdCBh IFJlbGFiZWxUeXBlIG9uIHRvcCBvZgoJCQkgKiBDYXNlVGVzdEV4cHIsIHRoZW4gd2Uga25v dyBpdCdzIGEgYmluYXJ5LWNvbXBhdGlibGUgcmVsYWJlbGluZy4KCQkJICovCgkJCWlmIChJ c0EoYWNvZXJjZS0+ZWxlbWV4cHIsIFJlbGFiZWxUeXBlKSAmJgoJCQkJSXNBKCgoUmVsYWJl bFR5cGUgKikgYWNvZXJjZS0+ZWxlbWV4cHIpLT5hcmcsIENhc2VUZXN0RXhwcikpCgkJCQlu b2RlID0gKE5vZGUgKikgYWNvZXJjZS0+YXJnOwoJCQllbHNlCgkJCQlicmVhazsKCQl9CgkJ ZWxzZSBpZiAobm9kZSAmJiBJc0Eobm9kZSwgUmVsYWJlbFR5cGUpKQoJCXsKCQkJLyogV2Ug ZG9uJ3QgcmVhbGx5IGV4cGVjdCB0aGlzIGNhc2UsIGJ1dCBtYXkgYXMgd2VsbCBjb3BlICov CgkJCW5vZGUgPSAoTm9kZSAqKSAoKFJlbGFiZWxUeXBlICopIG5vZGUpLT5hcmc7CgkJfQoJ CWVsc2UKCQkJYnJlYWs7Cgl9CglyZXR1cm4gbm9kZTsKfQoKLyoKICoJCXNjYWxhcmFycmF5 c2VsCQktIFNlbGVjdGl2aXR5IG9mIFNjYWxhckFycmF5T3BFeHByIE5vZGUuCiAqLwpTZWxl Y3Rpdml0eQpzY2FsYXJhcnJheXNlbChQbGFubmVySW5mbyAqcm9vdCwKCQkJICAgU2NhbGFy QXJyYXlPcEV4cHIgKmNsYXVzZSwKCQkJICAgYm9vbCBpc19qb2luX2NsYXVzZSwKCQkJICAg aW50IHZhclJlbGlkLAoJCQkgICBKb2luVHlwZSBqb2ludHlwZSwKCQkJICAgU3BlY2lhbEpv aW5JbmZvICpzamluZm8pCnsKCU9pZAkJCW9wZXJhdG9yID0gY2xhdXNlLT5vcG5vOwoJYm9v bAkJdXNlT3IgPSBjbGF1c2UtPnVzZU9yOwoJYm9vbAkJaXNFcXVhbGl0eSA9IGZhbHNlOwoJ Ym9vbAkJaXNJbmVxdWFsaXR5ID0gZmFsc2U7CglOb2RlCSAgICpsZWZ0b3A7CglOb2RlCSAg ICpyaWdodG9wOwoJT2lkCQkJbm9taW5hbF9lbGVtZW50X3R5cGU7CglPaWQJCQlub21pbmFs X2VsZW1lbnRfY29sbGF0aW9uOwoJVHlwZUNhY2hlRW50cnkgKnR5cGVudHJ5OwoJUmVnUHJv Y2VkdXJlIG9wcnNlbDsKCUZtZ3JJbmZvCW9wcnNlbHByb2M7CglTZWxlY3Rpdml0eSBzMTsK CVNlbGVjdGl2aXR5IHMxZGlzam9pbnQ7CgoJLyogRmlyc3QsIGRlY29uc3RydWN0IHRoZSBl eHByZXNzaW9uICovCglBc3NlcnQobGlzdF9sZW5ndGgoY2xhdXNlLT5hcmdzKSA9PSAyKTsK CWxlZnRvcCA9IChOb2RlICopIGxpbml0aWFsKGNsYXVzZS0+YXJncyk7CglyaWdodG9wID0g KE5vZGUgKikgbHNlY29uZChjbGF1c2UtPmFyZ3MpOwoKCS8qIGFnZ3Jlc3NpdmVseSByZWR1 Y2UgYm90aCBzaWRlcyB0byBjb25zdGFudHMgKi8KCWxlZnRvcCA9IGVzdGltYXRlX2V4cHJl c3Npb25fdmFsdWUocm9vdCwgbGVmdG9wKTsKCXJpZ2h0b3AgPSBlc3RpbWF0ZV9leHByZXNz aW9uX3ZhbHVlKHJvb3QsIHJpZ2h0b3ApOwoKCS8qIGdldCBub21pbmFsIChhZnRlciByZWxh YmVsaW5nKSBlbGVtZW50IHR5cGUgb2YgcmlnaHRvcCAqLwoJbm9taW5hbF9lbGVtZW50X3R5 cGUgPSBnZXRfYmFzZV9lbGVtZW50X3R5cGUoZXhwclR5cGUocmlnaHRvcCkpOwoJaWYgKCFP aWRJc1ZhbGlkKG5vbWluYWxfZWxlbWVudF90eXBlKSkKCQlyZXR1cm4gKFNlbGVjdGl2aXR5 KSAwLjU7CS8qIHByb2JhYmx5IHNob3VsZG4ndCBoYXBwZW4gKi8KCS8qIGdldCBub21pbmFs IGNvbGxhdGlvbiwgdG9vLCBmb3IgZ2VuZXJhdGluZyBjb25zdGFudHMgKi8KCW5vbWluYWxf ZWxlbWVudF9jb2xsYXRpb24gPSBleHByQ29sbGF0aW9uKHJpZ2h0b3ApOwoKCS8qIGxvb2sg dGhyb3VnaCBhbnkgYmluYXJ5LWNvbXBhdGlibGUgcmVsYWJlbGluZyBvZiByaWdodG9wICov CglyaWdodG9wID0gc3RyaXBfYXJyYXlfY29lcmNpb24ocmlnaHRvcCk7CgoJLyoKCSAqIERl dGVjdCB3aGV0aGVyIHRoZSBvcGVyYXRvciBpcyB0aGUgZGVmYXVsdCBlcXVhbGl0eSBvciBp bmVxdWFsaXR5CgkgKiBvcGVyYXRvciBvZiB0aGUgYXJyYXkgZWxlbWVudCB0eXBlLgoJICov Cgl0eXBlbnRyeSA9IGxvb2t1cF90eXBlX2NhY2hlKG5vbWluYWxfZWxlbWVudF90eXBlLCBU WVBFQ0FDSEVfRVFfT1BSKTsKCWlmIChPaWRJc1ZhbGlkKHR5cGVudHJ5LT5lcV9vcHIpKQoJ ewoJCWlmIChvcGVyYXRvciA9PSB0eXBlbnRyeS0+ZXFfb3ByKQoJCQlpc0VxdWFsaXR5ID0g dHJ1ZTsKCQllbHNlIGlmIChnZXRfbmVnYXRvcihvcGVyYXRvcikgPT0gdHlwZW50cnktPmVx X29wcikKCQkJaXNJbmVxdWFsaXR5ID0gdHJ1ZTsKCX0KCgkvKgoJICogSWYgaXQgaXMgZXF1 YWxpdHkgb3IgaW5lcXVhbGl0eSwgd2UgbWlnaHQgYmUgYWJsZSB0byBlc3RpbWF0ZSB0aGlz IGFzIGEKCSAqIGZvcm0gb2YgYXJyYXkgY29udGFpbm1lbnQ7IGZvciBpbnN0YW5jZSAiY29u c3QgPSBBTlkoY29sdW1uKSIgY2FuIGJlCgkgKiB0cmVhdGVkIGFzICJBUlJBWVtjb25zdF0g PEAgY29sdW1uIi4gIHNjYWxhcmFycmF5c2VsX2NvbnRhaW5tZW50IHRyaWVzCgkgKiB0aGF0 LCBhbmQgcmV0dXJucyB0aGUgc2VsZWN0aXZpdHkgZXN0aW1hdGUgaWYgc3VjY2Vzc2Z1bCwg b3IgLTEgaWYgbm90LgoJICovCglpZiAoKGlzRXF1YWxpdHkgfHwgaXNJbmVxdWFsaXR5KSAm JiAhaXNfam9pbl9jbGF1c2UpCgl7CgkJczEgPSBzY2FsYXJhcnJheXNlbF9jb250YWlubWVu dChyb290LCBsZWZ0b3AsIHJpZ2h0b3AsCgkJCQkJCQkJCQlub21pbmFsX2VsZW1lbnRfdHlw ZSwKCQkJCQkJCQkJCWlzRXF1YWxpdHksIHVzZU9yLCB2YXJSZWxpZCk7CgkJaWYgKHMxID49 IDAuMCkKCQkJcmV0dXJuIHMxOwoJfQoKCS8qCgkgKiBMb29rIHVwIHRoZSB1bmRlcmx5aW5n IG9wZXJhdG9yJ3Mgc2VsZWN0aXZpdHkgZXN0aW1hdG9yLiBQdW50IGlmIGl0CgkgKiBoYXNu J3QgZ290IG9uZS4KCSAqLwoJaWYgKGlzX2pvaW5fY2xhdXNlKQoJCW9wcnNlbCA9IGdldF9v cHJqb2luKG9wZXJhdG9yKTsKCWVsc2UKCQlvcHJzZWwgPSBnZXRfb3BycmVzdChvcGVyYXRv cik7CglpZiAoIW9wcnNlbCkKCQlyZXR1cm4gKFNlbGVjdGl2aXR5KSAwLjU7CglmbWdyX2lu Zm8ob3Byc2VsLCAmb3Byc2VscHJvYyk7CgoJLyoKCSAqIEluIHRoZSBhcnJheS1jb250YWlu bWVudCBjaGVjayBhYm92ZSwgd2UgbXVzdCBvbmx5IGJlbGlldmUgdGhhdCBhbgoJICogb3Bl cmF0b3IgaXMgZXF1YWxpdHkgb3IgaW5lcXVhbGl0eSBpZiBpdCBpcyB0aGUgZGVmYXVsdCBi dHJlZSBlcXVhbGl0eQoJICogb3BlcmF0b3IgKG9yIGl0cyBuZWdhdG9yKSBmb3IgdGhlIGVs ZW1lbnQgdHlwZSwgc2luY2UgdGhvc2UgYXJlIHRoZQoJICogb3BlcmF0b3JzIHRoYXQgYXJy YXkgY29udGFpbm1lbnQgd2lsbCB1c2UuICBCdXQgaW4gd2hhdCBmb2xsb3dzLCB3ZSBjYW4K CSAqIGJlIGEgbGl0dGxlIGxheGVyLCBhbmQgYWxzbyBiZWxpZXZlIHRoYXQgYW55IG9wZXJh dG9ycyB1c2luZyBlcXNlbCgpIG9yCgkgKiBuZXFzZWwoKSBhcyBzZWxlY3Rpdml0eSBlc3Rp bWF0b3IgYWN0IGxpa2UgZXF1YWxpdHkgb3IgaW5lcXVhbGl0eS4KCSAqLwoJaWYgKG9wcnNl bCA9PSBGX0VRU0VMIHx8IG9wcnNlbCA9PSBGX0VRSk9JTlNFTCkKCQlpc0VxdWFsaXR5ID0g dHJ1ZTsKCWVsc2UgaWYgKG9wcnNlbCA9PSBGX05FUVNFTCB8fCBvcHJzZWwgPT0gRl9ORVFK T0lOU0VMKQoJCWlzSW5lcXVhbGl0eSA9IHRydWU7CgoJLyoKCSAqIFdlIGNvbnNpZGVyIHRo cmVlIGNhc2VzOgoJICoKCSAqIDEuIHJpZ2h0b3AgaXMgYW4gQXJyYXkgY29uc3RhbnQ6IGRl Y29uc3RydWN0IHRoZSBhcnJheSwgYXBwbHkgdGhlCgkgKiBvcGVyYXRvcidzIHNlbGVjdGl2 aXR5IGZ1bmN0aW9uIGZvciBlYWNoIGFycmF5IGVsZW1lbnQsIGFuZCBtZXJnZSB0aGUKCSAq IHJlc3VsdHMgaW4gdGhlIHNhbWUgd2F5IHRoYXQgY2xhdXNlc2VsLmMgZG9lcyBmb3IgQU5E L09SIGNvbWJpbmF0aW9ucy4KCSAqCgkgKiAyLiByaWdodG9wIGlzIGFuIEFSUkFZW10gY29u c3RydWN0OiBhcHBseSB0aGUgb3BlcmF0b3IncyBzZWxlY3Rpdml0eQoJICogZnVuY3Rpb24g Zm9yIGVhY2ggZWxlbWVudCBvZiB0aGUgQVJSQVlbXSBjb25zdHJ1Y3QsIGFuZCBtZXJnZS4K CSAqCgkgKiAzLiBvdGhlcndpc2UsIG1ha2UgYSBndWVzcyAuLi4KCSAqLwoJaWYgKHJpZ2h0 b3AgJiYgSXNBKHJpZ2h0b3AsIENvbnN0KSkKCXsKCQlEYXR1bQkJYXJyYXlkYXR1bSA9ICgo Q29uc3QgKikgcmlnaHRvcCktPmNvbnN0dmFsdWU7CgkJYm9vbAkJYXJyYXlpc251bGwgPSAo KENvbnN0ICopIHJpZ2h0b3ApLT5jb25zdGlzbnVsbDsKCQlBcnJheVR5cGUgICphcnJheXZh bDsKCQlpbnQxNgkJZWxtbGVuOwoJCWJvb2wJCWVsbWJ5dmFsOwoJCWNoYXIJCWVsbWFsaWdu OwoJCWludAkJCW51bV9lbGVtczsKCQlEYXR1bQkgICAqZWxlbV92YWx1ZXM7CgkJYm9vbAkg ICAqZWxlbV9udWxsczsKCQlpbnQJCQlpOwoKCQlpZiAoYXJyYXlpc251bGwpCQkvKiBxdWFs IGNhbid0IHN1Y2NlZWQgaWYgbnVsbCBhcnJheSAqLwoJCQlyZXR1cm4gKFNlbGVjdGl2aXR5 KSAwLjA7CgkJYXJyYXl2YWwgPSBEYXR1bUdldEFycmF5VHlwZVAoYXJyYXlkYXR1bSk7CgoJ CS8qCgkJICogV2hlbiB0aGUgYXJyYXkgY29udGFpbnMgYSBOVUxMIGNvbnN0YW50LCBzYW1l IGFzIHZhcl9lcV9jb25zdCwgd2UKCQkgKiBhc3N1bWUgdGhlIG9wZXJhdG9yIGlzIHN0cmlj dCBhbmQgbm90aGluZyB3aWxsIG1hdGNoLCB0aHVzIHJldHVybgoJCSAqIDAuMC4KCQkgKi8K CQlpZiAoIXVzZU9yICYmIGFycmF5X2NvbnRhaW5zX251bGxzKGFycmF5dmFsKSkKCQkJcmV0 dXJuIChTZWxlY3Rpdml0eSkgMC4wOwoKCQlnZXRfdHlwbGVuYnl2YWxhbGlnbihBUlJfRUxF TVRZUEUoYXJyYXl2YWwpLAoJCQkJCQkJICZlbG1sZW4sICZlbG1ieXZhbCwgJmVsbWFsaWdu KTsKCQlkZWNvbnN0cnVjdF9hcnJheShhcnJheXZhbCwKCQkJCQkJICBBUlJfRUxFTVRZUEUo YXJyYXl2YWwpLAoJCQkJCQkgIGVsbWxlbiwgZWxtYnl2YWwsIGVsbWFsaWduLAoJCQkJCQkg ICZlbGVtX3ZhbHVlcywgJmVsZW1fbnVsbHMsICZudW1fZWxlbXMpOwoKCQkvKgoJCSAqIEZv ciBnZW5lcmljIG9wZXJhdG9ycywgd2UgYXNzdW1lIHRoZSBwcm9iYWJpbGl0eSBvZiBzdWNj ZXNzIGlzCgkJICogaW5kZXBlbmRlbnQgZm9yIGVhY2ggYXJyYXkgZWxlbWVudC4gIEJ1dCBm b3IgIj0gQU5ZIiBvciAiPD4gQUxMIiwKCQkgKiBpZiB0aGUgYXJyYXkgZWxlbWVudHMgYXJl IGRpc3RpbmN0ICh3aGljaCdkIHR5cGljYWxseSBiZSB0aGUgY2FzZSkKCQkgKiB0aGVuIHRo ZSBwcm9iYWJpbGl0aWVzIGFyZSBkaXNqb2ludCwgYW5kIHdlIHNob3VsZCBqdXN0IHN1bSB0 aGVtLgoJCSAqCgkJICogSWYgd2Ugd2VyZSBiZWluZyByZWFsbHkgdGVuc2Ugd2Ugd291bGQg dHJ5IHRvIGNvbmZpcm0gdGhhdCB0aGUKCQkgKiBlbGVtZW50cyBhcmUgYWxsIGRpc3RpbmN0 LCBidXQgdGhhdCB3b3VsZCBiZSBleHBlbnNpdmUgYW5kIGl0CgkJICogZG9lc24ndCBzZWVt IHRvIGJlIHdvcnRoIHRoZSBjeWNsZXM7IGl0IHdvdWxkIGFtb3VudCB0byBwZW5hbGl6aW5n CgkJICogd2VsbC13cml0dGVuIHF1ZXJpZXMgaW4gZmF2b3Igb2YgcG9vcmx5LXdyaXR0ZW4g b25lcy4gIEhvd2V2ZXIsIHdlCgkJICogZG8gcHJvdGVjdCBvdXJzZWx2ZXMgYSBsaXR0bGUg Yml0IGJ5IGNoZWNraW5nIHdoZXRoZXIgdGhlCgkJICogZGlzam9pbnRuZXNzIGFzc3VtcHRp b24gbGVhZHMgdG8gYW4gaW1wb3NzaWJsZSAob3V0IG9mIHJhbmdlKQoJCSAqIHByb2JhYmls aXR5OyBpZiBzbywgd2UgZmFsbCBiYWNrIHRvIHRoZSBub3JtYWwgY2FsY3VsYXRpb24uCgkJ ICovCgkJczEgPSBzMWRpc2pvaW50ID0gKHVzZU9yID8gMC4wIDogMS4wKTsKCgkJZm9yIChp ID0gMDsgaSA8IG51bV9lbGVtczsgaSsrKQoJCXsKCQkJTGlzdAkgICAqYXJnczsKCQkJU2Vs ZWN0aXZpdHkgczI7CgoJCQlhcmdzID0gbGlzdF9tYWtlMihsZWZ0b3AsCgkJCQkJCQkgIG1h a2VDb25zdChub21pbmFsX2VsZW1lbnRfdHlwZSwKCQkJCQkJCQkJCS0xLAoJCQkJCQkJCQkJ bm9taW5hbF9lbGVtZW50X2NvbGxhdGlvbiwKCQkJCQkJCQkJCWVsbWxlbiwKCQkJCQkJCQkJ CWVsZW1fdmFsdWVzW2ldLAoJCQkJCQkJCQkJZWxlbV9udWxsc1tpXSwKCQkJCQkJCQkJCWVs bWJ5dmFsKSk7CgkJCWlmIChpc19qb2luX2NsYXVzZSkKCQkJCXMyID0gRGF0dW1HZXRGbG9h dDgoRnVuY3Rpb25DYWxsNUNvbGwoJm9wcnNlbHByb2MsCgkJCQkJCQkJCQkJCQkgIGNsYXVz ZS0+aW5wdXRjb2xsaWQsCgkJCQkJCQkJCQkJCQkgIFBvaW50ZXJHZXREYXR1bShyb290KSwK CQkJCQkJCQkJCQkJCSAgT2JqZWN0SWRHZXREYXR1bShvcGVyYXRvciksCgkJCQkJCQkJCQkJ CQkgIFBvaW50ZXJHZXREYXR1bShhcmdzKSwKCQkJCQkJCQkJCQkJCSAgSW50MTZHZXREYXR1 bShqb2ludHlwZSksCgkJCQkJCQkJCQkJCQkgIFBvaW50ZXJHZXREYXR1bShzamluZm8pKSk7 CgkJCWVsc2UKCQkJCXMyID0gRGF0dW1HZXRGbG9hdDgoRnVuY3Rpb25DYWxsNENvbGwoJm9w cnNlbHByb2MsCgkJCQkJCQkJCQkJCQkgIGNsYXVzZS0+aW5wdXRjb2xsaWQsCgkJCQkJCQkJ CQkJCQkgIFBvaW50ZXJHZXREYXR1bShyb290KSwKCQkJCQkJCQkJCQkJCSAgT2JqZWN0SWRH ZXREYXR1bShvcGVyYXRvciksCgkJCQkJCQkJCQkJCQkgIFBvaW50ZXJHZXREYXR1bShhcmdz KSwKCQkJCQkJCQkJCQkJCSAgSW50MzJHZXREYXR1bSh2YXJSZWxpZCkpKTsKCgkJCWlmICh1 c2VPcikKCQkJewoJCQkJczEgPSBzMSArIHMyIC0gczEgKiBzMjsKCQkJCWlmIChpc0VxdWFs aXR5KQoJCQkJCXMxZGlzam9pbnQgKz0gczI7CgkJCX0KCQkJZWxzZQoJCQl7CgkJCQlzMSA9 IHMxICogczI7CgkJCQlpZiAoaXNJbmVxdWFsaXR5KQoJCQkJCXMxZGlzam9pbnQgKz0gczIg LSAxLjA7CgkJCX0KCQl9CgoJCS8qIGFjY2VwdCBkaXNqb2ludC1wcm9iYWJpbGl0eSBlc3Rp bWF0ZSBpZiBpbiByYW5nZSAqLwoJCWlmICgodXNlT3IgPyBpc0VxdWFsaXR5IDogaXNJbmVx dWFsaXR5KSAmJgoJCQlzMWRpc2pvaW50ID49IDAuMCAmJiBzMWRpc2pvaW50IDw9IDEuMCkK CQkJczEgPSBzMWRpc2pvaW50OwoJfQoJZWxzZSBpZiAocmlnaHRvcCAmJiBJc0EocmlnaHRv cCwgQXJyYXlFeHByKSAmJgoJCQkgISgoQXJyYXlFeHByICopIHJpZ2h0b3ApLT5tdWx0aWRp bXMpCgl7CgkJQXJyYXlFeHByICAqYXJyYXlleHByID0gKEFycmF5RXhwciAqKSByaWdodG9w OwoJCWludDE2CQllbG1sZW47CgkJYm9vbAkJZWxtYnl2YWw7CgkJTGlzdENlbGwgICAqbDsK CgkJZ2V0X3R5cGxlbmJ5dmFsKGFycmF5ZXhwci0+ZWxlbWVudF90eXBlaWQsCgkJCQkJCSZl bG1sZW4sICZlbG1ieXZhbCk7CgoJCS8qCgkJICogV2UgdXNlIHRoZSBhc3N1bXB0aW9uIG9m IGRpc2pvaW50IHByb2JhYmlsaXRpZXMgaGVyZSB0b28sIGFsdGhvdWdoCgkJICogdGhlIG9k ZHMgb2YgZXF1YWwgYXJyYXkgZWxlbWVudHMgYXJlIHJhdGhlciBoaWdoZXIgaWYgdGhlIGVs ZW1lbnRzCgkJICogYXJlIG5vdCBhbGwgY29uc3RhbnRzICh3aGljaCB0aGV5IHdvbid0IGJl LCBlbHNlIGNvbnN0YW50IGZvbGRpbmcKCQkgKiB3b3VsZCBoYXZlIHJlZHVjZWQgdGhlIEFy cmF5RXhwciB0byBhIENvbnN0KS4gIEluIHRoaXMgcGF0aCBpdCdzCgkJICogY3JpdGljYWwg dG8gaGF2ZSB0aGUgc2FuaXR5IGNoZWNrIG9uIHRoZSBzMWRpc2pvaW50IGVzdGltYXRlLgoJ CSAqLwoJCXMxID0gczFkaXNqb2ludCA9ICh1c2VPciA/IDAuMCA6IDEuMCk7CgoJCWZvcmVh Y2gobCwgYXJyYXlleHByLT5lbGVtZW50cykKCQl7CgkJCU5vZGUJICAgKmVsZW0gPSAoTm9k ZSAqKSBsZmlyc3QobCk7CgkJCUxpc3QJICAgKmFyZ3M7CgkJCVNlbGVjdGl2aXR5IHMyOwoK CQkJLyoKCQkJICogV2hlbiB0aGUgYXJyYXkgY29udGFpbnMgYSBOVUxMIGNvbnN0YW50LCBz YW1lIGFzIHZhcl9lcV9jb25zdCwKCQkJICogd2UgYXNzdW1lIHRoZSBvcGVyYXRvciBpcyBz dHJpY3QgYW5kIG5vdGhpbmcgd2lsbCBtYXRjaCwgdGh1cwoJCQkgKiByZXR1cm4gMC4wLgoJ CQkgKi8KCQkJaWYgKCF1c2VPciAmJiBJc0EoZWxlbSwgQ29uc3QpICYmICgoQ29uc3QgKikg ZWxlbSktPmNvbnN0aXNudWxsKQoJCQkJcmV0dXJuIChTZWxlY3Rpdml0eSkgMC4wOwoKCQkJ LyoKCQkJICogVGhlb3JldGljYWxseSwgaWYgZWxlbSBpc24ndCBvZiBub21pbmFsX2VsZW1l bnRfdHlwZSB3ZSBzaG91bGQKCQkJICogaW5zZXJ0IGEgUmVsYWJlbFR5cGUsIGJ1dCBpdCBz ZWVtcyB1bmxpa2VseSB0aGF0IGFueSBvcGVyYXRvcgoJCQkgKiBlc3RpbWF0aW9uIGZ1bmN0 aW9uIHdvdWxkIHJlYWxseSBjYXJlIC4uLgoJCQkgKi8KCQkJYXJncyA9IGxpc3RfbWFrZTIo bGVmdG9wLCBlbGVtKTsKCQkJaWYgKGlzX2pvaW5fY2xhdXNlKQoJCQkJczIgPSBEYXR1bUdl dEZsb2F0OChGdW5jdGlvbkNhbGw1Q29sbCgmb3Byc2VscHJvYywKCQkJCQkJCQkJCQkJCSAg Y2xhdXNlLT5pbnB1dGNvbGxpZCwKCQkJCQkJCQkJCQkJCSAgUG9pbnRlckdldERhdHVtKHJv b3QpLAoJCQkJCQkJCQkJCQkJICBPYmplY3RJZEdldERhdHVtKG9wZXJhdG9yKSwKCQkJCQkJ CQkJCQkJCSAgUG9pbnRlckdldERhdHVtKGFyZ3MpLAoJCQkJCQkJCQkJCQkJICBJbnQxNkdl dERhdHVtKGpvaW50eXBlKSwKCQkJCQkJCQkJCQkJCSAgUG9pbnRlckdldERhdHVtKHNqaW5m bykpKTsKCQkJZWxzZQoJCQkJczIgPSBEYXR1bUdldEZsb2F0OChGdW5jdGlvbkNhbGw0Q29s bCgmb3Byc2VscHJvYywKCQkJCQkJCQkJCQkJCSAgY2xhdXNlLT5pbnB1dGNvbGxpZCwKCQkJ CQkJCQkJCQkJCSAgUG9pbnRlckdldERhdHVtKHJvb3QpLAoJCQkJCQkJCQkJCQkJICBPYmpl Y3RJZEdldERhdHVtKG9wZXJhdG9yKSwKCQkJCQkJCQkJCQkJCSAgUG9pbnRlckdldERhdHVt KGFyZ3MpLAoJCQkJCQkJCQkJCQkJICBJbnQzMkdldERhdHVtKHZhclJlbGlkKSkpOwoKCQkJ aWYgKHVzZU9yKQoJCQl7CgkJCQlzMSA9IHMxICsgczIgLSBzMSAqIHMyOwoJCQkJaWYgKGlz RXF1YWxpdHkpCgkJCQkJczFkaXNqb2ludCArPSBzMjsKCQkJfQoJCQllbHNlCgkJCXsKCQkJ CXMxID0gczEgKiBzMjsKCQkJCWlmIChpc0luZXF1YWxpdHkpCgkJCQkJczFkaXNqb2ludCAr PSBzMiAtIDEuMDsKCQkJfQoJCX0KCgkJLyogYWNjZXB0IGRpc2pvaW50LXByb2JhYmlsaXR5 IGVzdGltYXRlIGlmIGluIHJhbmdlICovCgkJaWYgKCh1c2VPciA/IGlzRXF1YWxpdHkgOiBp c0luZXF1YWxpdHkpICYmCgkJCXMxZGlzam9pbnQgPj0gMC4wICYmIHMxZGlzam9pbnQgPD0g MS4wKQoJCQlzMSA9IHMxZGlzam9pbnQ7Cgl9CgllbHNlCgl7CgkJQ2FzZVRlc3RFeHByICpk dW1teWV4cHI7CgkJTGlzdAkgICAqYXJnczsKCQlTZWxlY3Rpdml0eSBzMjsKCQlpbnQJCQlp OwoKCQkvKgoJCSAqIFdlIG5lZWQgYSBkdW1teSByaWdodG9wIHRvIHBhc3MgdG8gdGhlIG9w ZXJhdG9yIHNlbGVjdGl2aXR5CgkJICogcm91dGluZS4gIEl0IGNhbiBiZSBwcmV0dHkgbXVj aCBhbnl0aGluZyB0aGF0IGRvZXNuJ3QgbG9vayBsaWtlIGEKCQkgKiBjb25zdGFudDsgQ2Fz ZVRlc3RFeHByIGlzIGEgY29udmVuaWVudCBjaG9pY2UuCgkJICovCgkJZHVtbXlleHByID0g bWFrZU5vZGUoQ2FzZVRlc3RFeHByKTsKCQlkdW1teWV4cHItPnR5cGVJZCA9IG5vbWluYWxf ZWxlbWVudF90eXBlOwoJCWR1bW15ZXhwci0+dHlwZU1vZCA9IC0xOwoJCWR1bW15ZXhwci0+ Y29sbGF0aW9uID0gY2xhdXNlLT5pbnB1dGNvbGxpZDsKCQlhcmdzID0gbGlzdF9tYWtlMihs ZWZ0b3AsIGR1bW15ZXhwcik7CgkJaWYgKGlzX2pvaW5fY2xhdXNlKQoJCQlzMiA9IERhdHVt R2V0RmxvYXQ4KEZ1bmN0aW9uQ2FsbDVDb2xsKCZvcHJzZWxwcm9jLAoJCQkJCQkJCQkJCQkg IGNsYXVzZS0+aW5wdXRjb2xsaWQsCgkJCQkJCQkJCQkJCSAgUG9pbnRlckdldERhdHVtKHJv b3QpLAoJCQkJCQkJCQkJCQkgIE9iamVjdElkR2V0RGF0dW0ob3BlcmF0b3IpLAoJCQkJCQkJ CQkJCQkgIFBvaW50ZXJHZXREYXR1bShhcmdzKSwKCQkJCQkJCQkJCQkJICBJbnQxNkdldERh dHVtKGpvaW50eXBlKSwKCQkJCQkJCQkJCQkJICBQb2ludGVyR2V0RGF0dW0oc2ppbmZvKSkp OwoJCWVsc2UKCQkJczIgPSBEYXR1bUdldEZsb2F0OChGdW5jdGlvbkNhbGw0Q29sbCgmb3By c2VscHJvYywKCQkJCQkJCQkJCQkJICBjbGF1c2UtPmlucHV0Y29sbGlkLAoJCQkJCQkJCQkJ CQkgIFBvaW50ZXJHZXREYXR1bShyb290KSwKCQkJCQkJCQkJCQkJICBPYmplY3RJZEdldERh dHVtKG9wZXJhdG9yKSwKCQkJCQkJCQkJCQkJICBQb2ludGVyR2V0RGF0dW0oYXJncyksCgkJ CQkJCQkJCQkJCSAgSW50MzJHZXREYXR1bSh2YXJSZWxpZCkpKTsKCQlzMSA9IHVzZU9yID8g MC4wIDogMS4wOwoKCQkvKgoJCSAqIEFyYml0cmFyaWx5IGFzc3VtZSAxMCBlbGVtZW50cyBp biB0aGUgZXZlbnR1YWwgYXJyYXkgdmFsdWUgKHNlZQoJCSAqIGFsc28gZXN0aW1hdGVfYXJy YXlfbGVuZ3RoKS4gIFdlIGRvbid0IHJpc2sgYW4gYXNzdW1wdGlvbiBvZgoJCSAqIGRpc2pv aW50IHByb2JhYmlsaXRpZXMgaGVyZS4KCQkgKi8KCQlmb3IgKGkgPSAwOyBpIDwgMTA7IGkr KykKCQl7CgkJCWlmICh1c2VPcikKCQkJCXMxID0gczEgKyBzMiAtIHMxICogczI7CgkJCWVs c2UKCQkJCXMxID0gczEgKiBzMjsKCQl9Cgl9CgoJLyogcmVzdWx0IHNob3VsZCBiZSBpbiBy YW5nZSwgYnV0IG1ha2Ugc3VyZS4uLiAqLwoJQ0xBTVBfUFJPQkFCSUxJVFkoczEpOwoKCXJl dHVybiBzMTsKfQoKLyoKICogRXN0aW1hdGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBh cnJheSB5aWVsZGVkIGJ5IGFuIGV4cHJlc3Npb24uCiAqCiAqIE5vdGU6IHRoZSByZXN1bHQg aXMgaW50ZWdyYWwsIGJ1dCB3ZSB1c2UgImRvdWJsZSIgdG8gYXZvaWQgb3ZlcmZsb3cKICog Y29uY2VybnMuICBNb3N0IGNhbGxlcnMgd2lsbCB1c2UgaXQgaW4gZG91YmxlLXR5cGUgZXhw cmVzc2lvbnMgYW55d2F5LgogKgogKiBOb3RlOiBpbiBzb21lIGNvZGUgcGF0aHMgcm9vdCBj YW4gYmUgcGFzc2VkIGFzIE5VTEwsIHJlc3VsdGluZyBpbgogKiBzbGlnaHRseSB3b3JzZSBl c3RpbWF0ZXMuCiAqLwpkb3VibGUKZXN0aW1hdGVfYXJyYXlfbGVuZ3RoKFBsYW5uZXJJbmZv ICpyb290LCBOb2RlICphcnJheWV4cHIpCnsKCS8qIGxvb2sgdGhyb3VnaCBhbnkgYmluYXJ5 LWNvbXBhdGlibGUgcmVsYWJlbGluZyBvZiBhcnJheWV4cHIgKi8KCWFycmF5ZXhwciA9IHN0 cmlwX2FycmF5X2NvZXJjaW9uKGFycmF5ZXhwcik7CgoJaWYgKGFycmF5ZXhwciAmJiBJc0Eo YXJyYXlleHByLCBDb25zdCkpCgl7CgkJRGF0dW0JCWFycmF5ZGF0dW0gPSAoKENvbnN0ICop IGFycmF5ZXhwciktPmNvbnN0dmFsdWU7CgkJYm9vbAkJYXJyYXlpc251bGwgPSAoKENvbnN0 ICopIGFycmF5ZXhwciktPmNvbnN0aXNudWxsOwoJCUFycmF5VHlwZSAgKmFycmF5dmFsOwoK CQlpZiAoYXJyYXlpc251bGwpCgkJCXJldHVybiAwOwoJCWFycmF5dmFsID0gRGF0dW1HZXRB cnJheVR5cGVQKGFycmF5ZGF0dW0pOwoJCXJldHVybiBBcnJheUdldE5JdGVtcyhBUlJfTkRJ TShhcnJheXZhbCksIEFSUl9ESU1TKGFycmF5dmFsKSk7Cgl9CgllbHNlIGlmIChhcnJheWV4 cHIgJiYgSXNBKGFycmF5ZXhwciwgQXJyYXlFeHByKSAmJgoJCQkgISgoQXJyYXlFeHByICop IGFycmF5ZXhwciktPm11bHRpZGltcykKCXsKCQlyZXR1cm4gbGlzdF9sZW5ndGgoKChBcnJh eUV4cHIgKikgYXJyYXlleHByKS0+ZWxlbWVudHMpOwoJfQoJZWxzZSBpZiAoYXJyYXlleHBy ICYmIHJvb3QpCgl7CgkJLyogU2VlIGlmIHdlIGNhbiBmaW5kIGFueSBzdGF0aXN0aWNzIGFi b3V0IGl0ICovCgkJVmFyaWFibGVTdGF0RGF0YSB2YXJkYXRhOwoJCUF0dFN0YXRzU2xvdCBz c2xvdDsKCQlkb3VibGUJCW5lbGVtID0gMDsKCgkJLyoKCQkgKiBTa2lwIGNhbGxpbmcgZXhh bWluZV92YXJpYWJsZSBmb3IgVmFyIHdpdGggdmFybm8gMCwgd2hpY2ggaGFzIG5vCgkJICog dmFsaWQgcmVsYXRpb24gZW50cnkgYW5kIHdvdWxkIGVycm9yIGluIGZpbmRfYmFzZV9yZWwu ICBTdWNoIGEgVmFyCgkJICogY2FuIGFwcGVhciB3aGVuIGEgbmVzdGVkIHNldCBvcGVyYXRp b24ncyBvdXRwdXQgdHlwZSBkb2Vzbid0IG1hdGNoCgkJICogdGhlIHBhcmVudCdzIGV4cGVj dGVkIHR5cGUsIGJlY2F1c2UgcmVjdXJzZV9zZXRfb3BlcmF0aW9ucyBidWlsZHMgYQoJCSAq IHByb2plY3Rpb24gdGFyZ2V0IGxpc3QgdXNpbmcgZ2VuZXJhdGVfc2V0b3BfdGxpc3Qgd2l0 aCB2YXJubyAwLCBhbmQKCQkgKiBpZiB0aGUgcmVxdWlyZWQgdHlwZSBjb2VyY2lvbiBpbnZv bHZlcyBhbiBBcnJheUNvZXJjZUV4cHIsIHdlIGNhbgoJCSAqIGJlIGNhbGxlZCBvbiB0aGF0 IFZhci4KCQkgKi8KCQlpZiAoSXNBKGFycmF5ZXhwciwgVmFyKSAmJiAoKFZhciAqKSBhcnJh eWV4cHIpLT52YXJubyA9PSAwKQoJCQlyZXR1cm4gMTA7CQkJLyogZGVmYXVsdCBndWVzcywg c2hvdWxkIG1hdGNoIHNjYWxhcmFycmF5c2VsICovCgoJCWV4YW1pbmVfdmFyaWFibGUocm9v dCwgYXJyYXlleHByLCAwLCAmdmFyZGF0YSk7CgkJaWYgKEhlYXBUdXBsZUlzVmFsaWQodmFy ZGF0YS5zdGF0c1R1cGxlKSkKCQl7CgkJCS8qCgkJCSAqIEZvdW5kIHN0YXRzLCBzbyB1c2Ug dGhlIGF2ZXJhZ2UgZWxlbWVudCBjb3VudCwgd2hpY2ggaXMgc3RvcmVkCgkJCSAqIGluIHRo ZSBsYXN0IHN0YW51bWJlcnMgZWxlbWVudCBvZiB0aGUgREVDSElTVCBzdGF0aXN0aWNzLgoJ CQkgKiBBY3R1YWxseSB0aGF0IGlzIHRoZSBhdmVyYWdlIGNvdW50IG9mICpkaXN0aW5jdCog ZWxlbWVudHM7CgkJCSAqIHBlcmhhcHMgd2Ugc2hvdWxkIHNjYWxlIGl0IHVwIHNvbWV3aGF0 PwoJCQkgKi8KCQkJaWYgKGdldF9hdHRzdGF0c3Nsb3QoJnNzbG90LCB2YXJkYXRhLnN0YXRz VHVwbGUsCgkJCQkJCQkJIFNUQVRJU1RJQ19LSU5EX0RFQ0hJU1QsIEludmFsaWRPaWQsCgkJ CQkJCQkJIEFUVFNUQVRTU0xPVF9OVU1CRVJTKSkKCQkJewoJCQkJaWYgKHNzbG90Lm5udW1i ZXJzID4gMCkKCQkJCQluZWxlbSA9IGNsYW1wX3Jvd19lc3Qoc3Nsb3QubnVtYmVyc1tzc2xv dC5ubnVtYmVycyAtIDFdKTsKCQkJCWZyZWVfYXR0c3RhdHNzbG90KCZzc2xvdCk7CgkJCX0K CQl9CgkJUmVsZWFzZVZhcmlhYmxlU3RhdHModmFyZGF0YSk7CgoJCWlmIChuZWxlbSA+IDAp CgkJCXJldHVybiBuZWxlbTsKCX0KCgkvKiBFbHNlIHVzZSBhIGRlZmF1bHQgZ3Vlc3MgLS0t IHRoaXMgc2hvdWxkIG1hdGNoIHNjYWxhcmFycmF5c2VsICovCglyZXR1cm4gMTA7Cn0KCi8q CiAqCQlyb3djb21wYXJlc2VsCQktIFNlbGVjdGl2aXR5IG9mIFJvd0NvbXBhcmVFeHByIE5v ZGUuCiAqCiAqIFdlIGVzdGltYXRlIFJvd0NvbXBhcmUgc2VsZWN0aXZpdHkgYnkgY29uc2lk ZXJpbmcganVzdCB0aGUgZmlyc3QgKGhpZ2gKICogb3JkZXIpIGNvbHVtbnMsIHdoaWNoIG1h a2VzIGl0IGVxdWl2YWxlbnQgdG8gYW4gb3JkaW5hcnkgT3BFeHByLiAgV2hpbGUKICogdGhp cyBlc3RpbWF0ZSBjb3VsZCBiZSByZWZpbmVkIGJ5IGNvbnNpZGVyaW5nIGFkZGl0aW9uYWwg Y29sdW1ucywgaXQKICogc2VlbXMgdW5saWtlbHkgdGhhdCB3ZSBjb3VsZCBkbyBhIGxvdCBi ZXR0ZXIgd2l0aG91dCBtdWx0aS1jb2x1bW4KICogc3RhdGlzdGljcy4KICovClNlbGVjdGl2 aXR5CnJvd2NvbXBhcmVzZWwoUGxhbm5lckluZm8gKnJvb3QsCgkJCSAgUm93Q29tcGFyZUV4 cHIgKmNsYXVzZSwKCQkJICBpbnQgdmFyUmVsaWQsIEpvaW5UeXBlIGpvaW50eXBlLCBTcGVj aWFsSm9pbkluZm8gKnNqaW5mbykKewoJU2VsZWN0aXZpdHkgczE7CglPaWQJCQlvcG5vID0g bGluaXRpYWxfb2lkKGNsYXVzZS0+b3Bub3MpOwoJT2lkCQkJaW5wdXRjb2xsaWQgPSBsaW5p dGlhbF9vaWQoY2xhdXNlLT5pbnB1dGNvbGxpZHMpOwoJTGlzdAkgICAqb3BhcmdzOwoJYm9v bAkJaXNfam9pbl9jbGF1c2U7CgoJLyogQnVpbGQgZXF1aXZhbGVudCBhcmcgbGlzdCBmb3Ig c2luZ2xlIG9wZXJhdG9yICovCglvcGFyZ3MgPSBsaXN0X21ha2UyKGxpbml0aWFsKGNsYXVz ZS0+bGFyZ3MpLCBsaW5pdGlhbChjbGF1c2UtPnJhcmdzKSk7CgoJLyoKCSAqIERlY2lkZSBp ZiBpdCdzIGEgam9pbiBjbGF1c2UuICBUaGlzIHNob3VsZCBtYXRjaCBjbGF1c2VzZWwuYydz CgkgKiB0cmVhdF9hc19qb2luX2NsYXVzZSgpLCBleGNlcHQgdGhhdCB3ZSBpbnRlbnRpb25h bGx5IGNvbnNpZGVyIG9ubHkgdGhlCgkgKiBsZWFkaW5nIGNvbHVtbnMgYW5kIG5vdCB0aGUg cmVzdCBvZiB0aGUgY2xhdXNlLgoJICovCglpZiAodmFyUmVsaWQgIT0gMCkKCXsKCQkvKgoJ CSAqIENhbGxlciBpcyBmb3JjaW5nIHJlc3RyaWN0aW9uIG1vZGUgKGVnLCBiZWNhdXNlIHdl IGFyZSBleGFtaW5pbmcgYW4KCQkgKiBpbm5lciBpbmRleHNjYW4gcXVhbCkuCgkJICovCgkJ aXNfam9pbl9jbGF1c2UgPSBmYWxzZTsKCX0KCWVsc2UgaWYgKHNqaW5mbyA9PSBOVUxMKQoJ ewoJCS8qCgkJICogSXQgbXVzdCBiZSBhIHJlc3RyaWN0aW9uIGNsYXVzZSwgc2luY2UgaXQn cyBiZWluZyBldmFsdWF0ZWQgYXQgYQoJCSAqIHNjYW4gbm9kZS4KCQkgKi8KCQlpc19qb2lu X2NsYXVzZSA9IGZhbHNlOwoJfQoJZWxzZQoJewoJCS8qCgkJICogT3RoZXJ3aXNlLCBpdCdz IGEgam9pbiBpZiB0aGVyZSdzIG1vcmUgdGhhbiBvbmUgYmFzZSByZWxhdGlvbiB1c2VkLgoJ CSAqLwoJCWlzX2pvaW5fY2xhdXNlID0gKE51bVJlbGlkcyhyb290LCAoTm9kZSAqKSBvcGFy Z3MpID4gMSk7Cgl9CgoJaWYgKGlzX2pvaW5fY2xhdXNlKQoJewoJCS8qIEVzdGltYXRlIHNl bGVjdGl2aXR5IGZvciBhIGpvaW4gY2xhdXNlLiAqLwoJCXMxID0gam9pbl9zZWxlY3Rpdml0 eShyb290LCBvcG5vLAoJCQkJCQkJICBvcGFyZ3MsCgkJCQkJCQkgIGlucHV0Y29sbGlkLAoJ CQkJCQkJICBqb2ludHlwZSwKCQkJCQkJCSAgc2ppbmZvKTsKCX0KCWVsc2UKCXsKCQkvKiBF c3RpbWF0ZSBzZWxlY3Rpdml0eSBmb3IgYSByZXN0cmljdGlvbiBjbGF1c2UuICovCgkJczEg PSByZXN0cmljdGlvbl9zZWxlY3Rpdml0eShyb290LCBvcG5vLAoJCQkJCQkJCQkgb3Bhcmdz LAoJCQkJCQkJCQkgaW5wdXRjb2xsaWQsCgkJCQkJCQkJCSB2YXJSZWxpZCk7Cgl9CgoJcmV0 dXJuIHMxOwp9CgovKgogKgkJZXFqb2luc2VsCQktIEpvaW4gc2VsZWN0aXZpdHkgb2YgIj0i CiAqLwpEYXR1bQplcWpvaW5zZWwoUEdfRlVOQ1RJT05fQVJHUykKewoJUGxhbm5lckluZm8g KnJvb3QgPSAoUGxhbm5lckluZm8gKikgUEdfR0VUQVJHX1BPSU5URVIoMCk7CglPaWQJCQlv cGVyYXRvciA9IFBHX0dFVEFSR19PSUQoMSk7CglMaXN0CSAgICphcmdzID0gKExpc3QgKikg UEdfR0VUQVJHX1BPSU5URVIoMik7CgojaWZkZWYgTk9UX1VTRUQKCUpvaW5UeXBlCWpvaW50 eXBlID0gKEpvaW5UeXBlKSBQR19HRVRBUkdfSU5UMTYoMyk7CiNlbmRpZgoJU3BlY2lhbEpv aW5JbmZvICpzamluZm8gPSAoU3BlY2lhbEpvaW5JbmZvICopIFBHX0dFVEFSR19QT0lOVEVS KDQpOwoJT2lkCQkJY29sbGF0aW9uID0gUEdfR0VUX0NPTExBVElPTigpOwoJZG91YmxlCQlz ZWxlYzsKCWRvdWJsZQkJc2VsZWNfaW5uZXI7CglWYXJpYWJsZVN0YXREYXRhIHZhcmRhdGEx OwoJVmFyaWFibGVTdGF0RGF0YSB2YXJkYXRhMjsKCWRvdWJsZQkJbmQxOwoJZG91YmxlCQlu ZDI7Cglib29sCQlpc2RlZmF1bHQxOwoJYm9vbAkJaXNkZWZhdWx0MjsKCU9pZAkJCW9wZnVu Y29pZDsKCUZtZ3JJbmZvCWVxcHJvYzsKCU9pZAkJCWhhc2hMZWZ0ID0gSW52YWxpZE9pZDsK CU9pZAkJCWhhc2hSaWdodCA9IEludmFsaWRPaWQ7CglBdHRTdGF0c1Nsb3Qgc3Nsb3QxOwoJ QXR0U3RhdHNTbG90IHNzbG90MjsKCUZvcm1fcGdfc3RhdGlzdGljIHN0YXRzMSA9IE5VTEw7 CglGb3JtX3BnX3N0YXRpc3RpYyBzdGF0czIgPSBOVUxMOwoJYm9vbAkJaGF2ZV9tY3ZzMSA9 IGZhbHNlOwoJYm9vbAkJaGF2ZV9tY3ZzMiA9IGZhbHNlOwoJYm9vbAkgICAqaGFzbWF0Y2gx ID0gTlVMTDsKCWJvb2wJICAgKmhhc21hdGNoMiA9IE5VTEw7CglpbnQJCQlubWF0Y2hlcyA9 IDA7Cglib29sCQlnZXRfbWN2X3N0YXRzOwoJYm9vbAkJam9pbl9pc19yZXZlcnNlZDsKCVJl bE9wdEluZm8gKmlubmVyX3JlbDsKCglnZXRfam9pbl92YXJpYWJsZXMocm9vdCwgYXJncywg c2ppbmZvLAoJCQkJCSAgICZ2YXJkYXRhMSwgJnZhcmRhdGEyLCAmam9pbl9pc19yZXZlcnNl ZCk7CgoJbmQxID0gZ2V0X3ZhcmlhYmxlX251bWRpc3RpbmN0KCZ2YXJkYXRhMSwgJmlzZGVm YXVsdDEpOwoJbmQyID0gZ2V0X3ZhcmlhYmxlX251bWRpc3RpbmN0KCZ2YXJkYXRhMiwgJmlz ZGVmYXVsdDIpOwoKCW9wZnVuY29pZCA9IGdldF9vcGNvZGUob3BlcmF0b3IpOwoKCW1lbXNl dCgmc3Nsb3QxLCAwLCBzaXplb2Yoc3Nsb3QxKSk7CgltZW1zZXQoJnNzbG90MiwgMCwgc2l6 ZW9mKHNzbG90MikpOwoKCS8qCgkgKiBUaGVyZSBpcyBubyB1c2UgaW4gZmV0Y2hpbmcgb25l IHNpZGUncyBNQ1ZzIGlmIHdlIGxhY2sgTUNWcyBmb3IgdGhlCgkgKiBvdGhlciBzaWRlLCBz byBkbyBhIHF1aWNrIGNoZWNrIHRvIHZlcmlmeSB0aGF0IGJvdGggc3RhdHMgZXhpc3QuCgkg Ki8KCWdldF9tY3Zfc3RhdHMgPSAoSGVhcFR1cGxlSXNWYWxpZCh2YXJkYXRhMS5zdGF0c1R1 cGxlKSAmJgoJCQkJCSBIZWFwVHVwbGVJc1ZhbGlkKHZhcmRhdGEyLnN0YXRzVHVwbGUpICYm CgkJCQkJIGdldF9hdHRzdGF0c3Nsb3QoJnNzbG90MSwgdmFyZGF0YTEuc3RhdHNUdXBsZSwK CQkJCQkJCQkJICBTVEFUSVNUSUNfS0lORF9NQ1YsIEludmFsaWRPaWQsCgkJCQkJCQkJCSAg MCkgJiYKCQkJCQkgZ2V0X2F0dHN0YXRzc2xvdCgmc3Nsb3QyLCB2YXJkYXRhMi5zdGF0c1R1 cGxlLAoJCQkJCQkJCQkgIFNUQVRJU1RJQ19LSU5EX01DViwgSW52YWxpZE9pZCwKCQkJCQkJ CQkJICAwKSk7CgoJaWYgKEhlYXBUdXBsZUlzVmFsaWQodmFyZGF0YTEuc3RhdHNUdXBsZSkp Cgl7CgkJLyogbm90ZSB3ZSBhbGxvdyB1c2Ugb2YgbnVsbGZyYWMgcmVnYXJkbGVzcyBvZiBz ZWN1cml0eSBjaGVjayAqLwoJCXN0YXRzMSA9IChGb3JtX3BnX3N0YXRpc3RpYykgR0VUU1RS VUNUKHZhcmRhdGExLnN0YXRzVHVwbGUpOwoJCWlmIChnZXRfbWN2X3N0YXRzICYmCgkJCXN0 YXRpc3RpY19wcm9jX3NlY3VyaXR5X2NoZWNrKCZ2YXJkYXRhMSwgb3BmdW5jb2lkKSkKCQkJ aGF2ZV9tY3ZzMSA9IGdldF9hdHRzdGF0c3Nsb3QoJnNzbG90MSwgdmFyZGF0YTEuc3RhdHNU dXBsZSwKCQkJCQkJCQkJCSAgU1RBVElTVElDX0tJTkRfTUNWLCBJbnZhbGlkT2lkLAoJCQkJ CQkJCQkJICBBVFRTVEFUU1NMT1RfVkFMVUVTIHwgQVRUU1RBVFNTTE9UX05VTUJFUlMpOwoJ fQoKCWlmIChIZWFwVHVwbGVJc1ZhbGlkKHZhcmRhdGEyLnN0YXRzVHVwbGUpKQoJewoJCS8q IG5vdGUgd2UgYWxsb3cgdXNlIG9mIG51bGxmcmFjIHJlZ2FyZGxlc3Mgb2Ygc2VjdXJpdHkg Y2hlY2sgKi8KCQlzdGF0czIgPSAoRm9ybV9wZ19zdGF0aXN0aWMpIEdFVFNUUlVDVCh2YXJk YXRhMi5zdGF0c1R1cGxlKTsKCQlpZiAoZ2V0X21jdl9zdGF0cyAmJgoJCQlzdGF0aXN0aWNf cHJvY19zZWN1cml0eV9jaGVjaygmdmFyZGF0YTIsIG9wZnVuY29pZCkpCgkJCWhhdmVfbWN2 czIgPSBnZXRfYXR0c3RhdHNzbG90KCZzc2xvdDIsIHZhcmRhdGEyLnN0YXRzVHVwbGUsCgkJ CQkJCQkJCQkgIFNUQVRJU1RJQ19LSU5EX01DViwgSW52YWxpZE9pZCwKCQkJCQkJCQkJCSAg QVRUU1RBVFNTTE9UX1ZBTFVFUyB8IEFUVFNUQVRTU0xPVF9OVU1CRVJTKTsKCX0KCgkvKiBQ cmVwYXJlIGluZm8gdXNhYmxlIGJ5IGJvdGggZXFqb2luc2VsX2lubmVyIGFuZCBlcWpvaW5z ZWxfc2VtaSAqLwoJaWYgKGhhdmVfbWN2czEgJiYgaGF2ZV9tY3ZzMikKCXsKCQlmbWdyX2lu Zm8ob3BmdW5jb2lkLCAmZXFwcm9jKTsKCQloYXNtYXRjaDEgPSAoYm9vbCAqKSBwYWxsb2Mw KHNzbG90MS5udmFsdWVzICogc2l6ZW9mKGJvb2wpKTsKCQloYXNtYXRjaDIgPSAoYm9vbCAq KSBwYWxsb2MwKHNzbG90Mi5udmFsdWVzICogc2l6ZW9mKGJvb2wpKTsKCgkJLyoKCQkgKiBJ ZiB0aGUgTUNWIGxpc3RzIGFyZSBsb25nIGVub3VnaCB0byBqdXN0aWZ5IGhhc2hpbmcsIHRy eSB0byBsb29rIHVwCgkJICogaGFzaCBmdW5jdGlvbnMgZm9yIHRoZSBqb2luIG9wZXJhdG9y LgoJCSAqLwoJCWlmICgoc3Nsb3QxLm52YWx1ZXMgKyBzc2xvdDIubnZhbHVlcykgPj0gRVFK T0lOU0VMX01DVl9IQVNIX1RIUkVTSE9MRCkKCQkJKHZvaWQpIGdldF9vcF9oYXNoX2Z1bmN0 aW9uc19leHQob3BlcmF0b3IsCgkJCQkJCQkJCQkJIGV4cHJUeXBlKChOb2RlICopIGxpbml0 aWFsKGFyZ3MpKSwKCQkJCQkJCQkJCQkgJmhhc2hMZWZ0LCAmaGFzaFJpZ2h0KTsKCX0KCWVs c2UKCQltZW1zZXQoJmVxcHJvYywgMCwgc2l6ZW9mKGVxcHJvYykpOyAvKiBzaWxlbmNlIHVu aW5pdC12YXIgd2FybmluZ3MgKi8KCgkvKiBXZSBuZWVkIHRvIGNvbXB1dGUgdGhlIGlubmVy LWpvaW4gc2VsZWN0aXZpdHkgaW4gYWxsIGNhc2VzICovCglzZWxlY19pbm5lciA9IGVxam9p bnNlbF9pbm5lcigmZXFwcm9jLCBjb2xsYXRpb24sCgkJCQkJCQkJICBoYXNoTGVmdCwgaGFz aFJpZ2h0LAoJCQkJCQkJCSAgJnZhcmRhdGExLCAmdmFyZGF0YTIsCgkJCQkJCQkJICBuZDEs IG5kMiwKCQkJCQkJCQkgIGlzZGVmYXVsdDEsIGlzZGVmYXVsdDIsCgkJCQkJCQkJICAmc3Ns b3QxLCAmc3Nsb3QyLAoJCQkJCQkJCSAgc3RhdHMxLCBzdGF0czIsCgkJCQkJCQkJICBoYXZl X21jdnMxLCBoYXZlX21jdnMyLAoJCQkJCQkJCSAgaGFzbWF0Y2gxLCBoYXNtYXRjaDIsCgkJ CQkJCQkJICAmbm1hdGNoZXMpOwoKCXN3aXRjaCAoc2ppbmZvLT5qb2ludHlwZSkKCXsKCQlj YXNlIEpPSU5fSU5ORVI6CgkJY2FzZSBKT0lOX0xFRlQ6CgkJY2FzZSBKT0lOX0ZVTEw6CgkJ CXNlbGVjID0gc2VsZWNfaW5uZXI7CgkJCWJyZWFrOwoJCWNhc2UgSk9JTl9TRU1JOgoJCWNh c2UgSk9JTl9BTlRJOgoKCQkJLyoKCQkJICogTG9vayB1cCB0aGUgam9pbidzIGlubmVyIHJl bGF0aW9uLiAgbWluX3JpZ2h0aGFuZCBpcyBzdWZmaWNpZW50CgkJCSAqIGluZm9ybWF0aW9u IGJlY2F1c2UgbmVpdGhlciBTRU1JIG5vciBBTlRJIGpvaW5zIHBlcm1pdCBhbnkKCQkJICog cmVhc3NvY2lhdGlvbiBpbnRvIG9yIG91dCBvZiB0aGVpciBSSFMsIHNvIHRoZSByaWdodGhh bmQgd2lsbAoJCQkgKiBhbHdheXMgYmUgZXhhY3RseSB0aGF0IHNldCBvZiByZWxzLgoJCQkg Ki8KCQkJaW5uZXJfcmVsID0gZmluZF9qb2luX2lucHV0X3JlbChyb290LCBzamluZm8tPm1p bl9yaWdodGhhbmQpOwoKCQkJaWYgKCFqb2luX2lzX3JldmVyc2VkKQoJCQkJc2VsZWMgPSBl cWpvaW5zZWxfc2VtaSgmZXFwcm9jLCBjb2xsYXRpb24sCgkJCQkJCQkJCSAgIGhhc2hMZWZ0 LCBoYXNoUmlnaHQsCgkJCQkJCQkJCSAgIGZhbHNlLAoJCQkJCQkJCQkgICAmdmFyZGF0YTEs ICZ2YXJkYXRhMiwKCQkJCQkJCQkJICAgbmQxLCBuZDIsCgkJCQkJCQkJCSAgIGlzZGVmYXVs dDEsIGlzZGVmYXVsdDIsCgkJCQkJCQkJCSAgICZzc2xvdDEsICZzc2xvdDIsCgkJCQkJCQkJ CSAgIHN0YXRzMSwgc3RhdHMyLAoJCQkJCQkJCQkgICBoYXZlX21jdnMxLCBoYXZlX21jdnMy LAoJCQkJCQkJCQkgICBoYXNtYXRjaDEsIGhhc21hdGNoMiwKCQkJCQkJCQkJICAgJm5tYXRj aGVzLAoJCQkJCQkJCQkgICBpbm5lcl9yZWwpOwoJCQllbHNlCgkJCQlzZWxlYyA9IGVxam9p bnNlbF9zZW1pKCZlcXByb2MsIGNvbGxhdGlvbiwKCQkJCQkJCQkJICAgaGFzaExlZnQsIGhh c2hSaWdodCwKCQkJCQkJCQkJICAgdHJ1ZSwKCQkJCQkJCQkJICAgJnZhcmRhdGEyLCAmdmFy ZGF0YTEsCgkJCQkJCQkJCSAgIG5kMiwgbmQxLAoJCQkJCQkJCQkgICBpc2RlZmF1bHQyLCBp c2RlZmF1bHQxLAoJCQkJCQkJCQkgICAmc3Nsb3QyLCAmc3Nsb3QxLAoJCQkJCQkJCQkgICBz dGF0czIsIHN0YXRzMSwKCQkJCQkJCQkJICAgaGF2ZV9tY3ZzMiwgaGF2ZV9tY3ZzMSwKCQkJ CQkJCQkJICAgaGFzbWF0Y2gyLCBoYXNtYXRjaDEsCgkJCQkJCQkJCSAgICZubWF0Y2hlcywK CQkJCQkJCQkJICAgaW5uZXJfcmVsKTsKCgkJCS8qCgkJCSAqIFdlIHNob3VsZCBuZXZlciBl c3RpbWF0ZSB0aGUgb3V0cHV0IG9mIGEgc2VtaWpvaW4gdG8gYmUgbW9yZQoJCQkgKiByb3dz IHRoYW4gd2UgZXN0aW1hdGUgZm9yIGFuIGlubmVyIGpvaW4gd2l0aCB0aGUgc2FtZSBpbnB1 dAoJCQkgKiByZWxzIGFuZCBqb2luIGNvbmRpdGlvbjsgaXQncyBvYnZpb3VzbHkgaW1wb3Nz aWJsZSBmb3IgdGhhdCB0bwoJCQkgKiBoYXBwZW4uICBUaGUgZm9ybWVyIGVzdGltYXRlIGlz IE4xICogU3NlbWkgd2hpbGUgdGhlIGxhdHRlciBpcwoJCQkgKiBOMSAqIE4yICogU2lubmVy LCBzbyB3ZSBtYXkgY2xhbXAgU3NlbWkgPD0gTjIgKiBTaW5uZXIuICBEb2luZwoJCQkgKiB0 aGlzIGlzIHdvcnRod2hpbGUgYmVjYXVzZSBvZiB0aGUgc2hha2llciBlc3RpbWF0aW9uIHJ1 bGVzIHdlCgkJCSAqIHVzZSBpbiBlcWpvaW5zZWxfc2VtaSwgcGFydGljdWxhcmx5IGluIGNh c2VzIHdoZXJlIGl0IGhhcyB0bwoJCQkgKiBwdW50IGVudGlyZWx5LgoJCQkgKi8KCQkJc2Vs ZWMgPSBNaW4oc2VsZWMsIGlubmVyX3JlbC0+cm93cyAqIHNlbGVjX2lubmVyKTsKCQkJYnJl YWs7CgkJZGVmYXVsdDoKCQkJLyogb3RoZXIgdmFsdWVzIG5vdCBleHBlY3RlZCBoZXJlICov CgkJCWVsb2coRVJST1IsICJ1bnJlY29nbml6ZWQgam9pbiB0eXBlOiAlZCIsCgkJCQkgKGlu dCkgc2ppbmZvLT5qb2ludHlwZSk7CgkJCXNlbGVjID0gMDsJCQkvKiBrZWVwIGNvbXBpbGVy IHF1aWV0ICovCgkJCWJyZWFrOwoJfQoKCWZyZWVfYXR0c3RhdHNzbG90KCZzc2xvdDEpOwoJ ZnJlZV9hdHRzdGF0c3Nsb3QoJnNzbG90Mik7CgoJUmVsZWFzZVZhcmlhYmxlU3RhdHModmFy ZGF0YTEpOwoJUmVsZWFzZVZhcmlhYmxlU3RhdHModmFyZGF0YTIpOwoKCWlmIChoYXNtYXRj aDEpCgkJcGZyZWUoaGFzbWF0Y2gxKTsKCWlmIChoYXNtYXRjaDIpCgkJcGZyZWUoaGFzbWF0 Y2gyKTsKCglDTEFNUF9QUk9CQUJJTElUWShzZWxlYyk7CgoJUEdfUkVUVVJOX0ZMT0FUOCgo ZmxvYXQ4KSBzZWxlYyk7Cn0KCi8qCiAqIGVxam9pbnNlbF9pbm5lciAtLS0gZXFqb2luc2Vs IGZvciBub3JtYWwgaW5uZXIgam9pbgogKgogKiBJbiBhZGRpdGlvbiB0byBjb21wdXRpbmcg dGhlIHNlbGVjdGl2aXR5IGVzdGltYXRlLCB0aGlzIHdpbGwgZmlsbAogKiBoYXNtYXRjaDFb XSwgaGFzbWF0Y2gyW10sIGFuZCAqcF9ubWF0Y2hlcyAoaWYgaGF2ZV9tY3ZzMSAmJiBoYXZl X21jdnMyKS4KICogV2UgbWF5IGJlIGFibGUgdG8gcmUtdXNlIHRoYXQgZGF0YSBpbiBlcWpv aW5zZWxfc2VtaS4KICoKICogV2UgYWxzbyB1c2UgdGhpcyBmb3IgTEVGVC9GVUxMIG91dGVy IGpvaW5zOyBpdCdzIG5vdCBwcmVzZW50bHkgY2xlYXIKICogdGhhdCBpdCdzIHdvcnRoIHRy eWluZyB0byBkaXN0aW5ndWlzaCB0aGVtIGhlcmUuCiAqLwpzdGF0aWMgZG91YmxlCmVxam9p bnNlbF9pbm5lcihGbWdySW5mbyAqZXFwcm9jLCBPaWQgY29sbGF0aW9uLAoJCQkJT2lkIGhh c2hMZWZ0LCBPaWQgaGFzaFJpZ2h0LAoJCQkJVmFyaWFibGVTdGF0RGF0YSAqdmFyZGF0YTEs IFZhcmlhYmxlU3RhdERhdGEgKnZhcmRhdGEyLAoJCQkJZG91YmxlIG5kMSwgZG91YmxlIG5k MiwKCQkJCWJvb2wgaXNkZWZhdWx0MSwgYm9vbCBpc2RlZmF1bHQyLAoJCQkJQXR0U3RhdHNT bG90ICpzc2xvdDEsIEF0dFN0YXRzU2xvdCAqc3Nsb3QyLAoJCQkJRm9ybV9wZ19zdGF0aXN0 aWMgc3RhdHMxLCBGb3JtX3BnX3N0YXRpc3RpYyBzdGF0czIsCgkJCQlib29sIGhhdmVfbWN2 czEsIGJvb2wgaGF2ZV9tY3ZzMiwKCQkJCWJvb2wgKmhhc21hdGNoMSwgYm9vbCAqaGFzbWF0 Y2gyLAoJCQkJaW50ICpwX25tYXRjaGVzKQp7Cglkb3VibGUJCXNlbGVjOwoKCWlmIChoYXZl X21jdnMxICYmIGhhdmVfbWN2czIpCgl7CgkJLyoKCQkgKiBXZSBoYXZlIG1vc3QtY29tbW9u LXZhbHVlIGxpc3RzIGZvciBib3RoIHJlbGF0aW9ucy4gIFJ1biB0aHJvdWdoCgkJICogdGhl IGxpc3RzIHRvIHNlZSB3aGljaCBNQ1ZzIGFjdHVhbGx5IGpvaW4gdG8gZWFjaCBvdGhlciB3 aXRoIHRoZQoJCSAqIGdpdmVuIG9wZXJhdG9yLiAgVGhpcyBhbGxvd3MgdXMgdG8gZGV0ZXJt aW5lIHRoZSBleGFjdCBqb2luCgkJICogc2VsZWN0aXZpdHkgZm9yIHRoZSBwb3J0aW9uIG9m IHRoZSByZWxhdGlvbnMgcmVwcmVzZW50ZWQgYnkgdGhlIE1DVgoJCSAqIGxpc3RzLiAgV2Ug c3RpbGwgaGF2ZSB0byBlc3RpbWF0ZSBmb3IgdGhlIHJlbWFpbmluZyBwb3B1bGF0aW9uLCBi dXQKCQkgKiBpbiBhIHNrZXdlZCBkaXN0cmlidXRpb24gdGhpcyBnaXZlcyB1cyBhIGJpZyBs ZWcgdXAgaW4gYWNjdXJhY3kuCgkJICogRm9yIG1vdGl2YXRpb24gc2VlIHRoZSBhbmFseXNp cyBpbiBZLiBJb2FubmlkaXMgYW5kIFMuCgkJICogQ2hyaXN0b2RvdWxha2lzLCAiT24gdGhl IHByb3BhZ2F0aW9uIG9mIGVycm9ycyBpbiB0aGUgc2l6ZSBvZiBqb2luCgkJICogcmVzdWx0 cyIsIFRlY2huaWNhbCBSZXBvcnQgMTAxOCwgQ29tcHV0ZXIgU2NpZW5jZSBEZXB0LiwgVW5p dmVyc2l0eQoJCSAqIG9mIFdpc2NvbnNpbiwgTWFkaXNvbiwgTWFyY2ggMTk5MSAoYXZhaWxh YmxlIGZyb20gZnRwLmNzLndpc2MuZWR1KS4KCQkgKi8KCQlkb3VibGUJCW51bGxmcmFjMSA9 IHN0YXRzMS0+c3RhbnVsbGZyYWM7CgkJZG91YmxlCQludWxsZnJhYzIgPSBzdGF0czItPnN0 YW51bGxmcmFjOwoJCWRvdWJsZQkJbWF0Y2hwcm9kZnJlcSwKCQkJCQltYXRjaGZyZXExLAoJ CQkJCW1hdGNoZnJlcTIsCgkJCQkJdW5tYXRjaGZyZXExLAoJCQkJCXVubWF0Y2hmcmVxMiwK CQkJCQlvdGhlcmZyZXExLAoJCQkJCW90aGVyZnJlcTIsCgkJCQkJdG90YWxzZWwxLAoJCQkJ CXRvdGFsc2VsMjsKCQlpbnQJCQlpLAoJCQkJCW5tYXRjaGVzOwoKCQkvKiBGaWxsIHRoZSBt YXRjaCBhcnJheXMgKi8KCQllcWpvaW5zZWxfZmluZF9tYXRjaGVzKGVxcHJvYywgY29sbGF0 aW9uLAoJCQkJCQkJICAgaGFzaExlZnQsIGhhc2hSaWdodCwKCQkJCQkJCSAgIGZhbHNlLAoJ CQkJCQkJICAgc3Nsb3QxLCBzc2xvdDIsCgkJCQkJCQkgICBzc2xvdDEtPm52YWx1ZXMsIHNz bG90Mi0+bnZhbHVlcywKCQkJCQkJCSAgIGhhc21hdGNoMSwgaGFzbWF0Y2gyLAoJCQkJCQkJ ICAgcF9ubWF0Y2hlcywgJm1hdGNocHJvZGZyZXEpOwoJCW5tYXRjaGVzID0gKnBfbm1hdGNo ZXM7CgkJQ0xBTVBfUFJPQkFCSUxJVFkobWF0Y2hwcm9kZnJlcSk7CgoJCS8qIFN1bSB1cCBm cmVxdWVuY2llcyBvZiBtYXRjaGVkIGFuZCB1bm1hdGNoZWQgTUNWcyAqLwoJCW1hdGNoZnJl cTEgPSB1bm1hdGNoZnJlcTEgPSAwLjA7CgkJZm9yIChpID0gMDsgaSA8IHNzbG90MS0+bnZh bHVlczsgaSsrKQoJCXsKCQkJaWYgKGhhc21hdGNoMVtpXSkKCQkJCW1hdGNoZnJlcTEgKz0g c3Nsb3QxLT5udW1iZXJzW2ldOwoJCQllbHNlCgkJCQl1bm1hdGNoZnJlcTEgKz0gc3Nsb3Qx LT5udW1iZXJzW2ldOwoJCX0KCQlDTEFNUF9QUk9CQUJJTElUWShtYXRjaGZyZXExKTsKCQlD TEFNUF9QUk9CQUJJTElUWSh1bm1hdGNoZnJlcTEpOwoJCW1hdGNoZnJlcTIgPSB1bm1hdGNo ZnJlcTIgPSAwLjA7CgkJZm9yIChpID0gMDsgaSA8IHNzbG90Mi0+bnZhbHVlczsgaSsrKQoJ CXsKCQkJaWYgKGhhc21hdGNoMltpXSkKCQkJCW1hdGNoZnJlcTIgKz0gc3Nsb3QyLT5udW1i ZXJzW2ldOwoJCQllbHNlCgkJCQl1bm1hdGNoZnJlcTIgKz0gc3Nsb3QyLT5udW1iZXJzW2ld OwoJCX0KCQlDTEFNUF9QUk9CQUJJTElUWShtYXRjaGZyZXEyKTsKCQlDTEFNUF9QUk9CQUJJ TElUWSh1bm1hdGNoZnJlcTIpOwoKCQkvKgoJCSAqIENvbXB1dGUgdG90YWwgZnJlcXVlbmN5 IG9mIG5vbi1udWxsIHZhbHVlcyB0aGF0IGFyZSBub3QgaW4gdGhlIE1DVgoJCSAqIGxpc3Rz LgoJCSAqLwoJCW90aGVyZnJlcTEgPSAxLjAgLSBudWxsZnJhYzEgLSBtYXRjaGZyZXExIC0g dW5tYXRjaGZyZXExOwoJCW90aGVyZnJlcTIgPSAxLjAgLSBudWxsZnJhYzIgLSBtYXRjaGZy ZXEyIC0gdW5tYXRjaGZyZXEyOwoJCUNMQU1QX1BST0JBQklMSVRZKG90aGVyZnJlcTEpOwoJ CUNMQU1QX1BST0JBQklMSVRZKG90aGVyZnJlcTIpOwoKCQkvKgoJCSAqIFdlIGNhbiBlc3Rp bWF0ZSB0aGUgdG90YWwgc2VsZWN0aXZpdHkgZnJvbSB0aGUgcG9pbnQgb2YgdmlldyBvZgoJ CSAqIHJlbGF0aW9uIDEgYXM6IHRoZSBrbm93biBzZWxlY3Rpdml0eSBmb3IgbWF0Y2hlZCBN Q1ZzLCBwbHVzCgkJICogdW5tYXRjaGVkIE1DVnMgdGhhdCBhcmUgYXNzdW1lZCB0byBtYXRj aCBhZ2FpbnN0IHJhbmRvbSBtZW1iZXJzIG9mCgkJICogcmVsYXRpb24gMidzIG5vbi1NQ1Yg cG9wdWxhdGlvbiwgcGx1cyBub24tTUNWIHZhbHVlcyB0aGF0IGFyZQoJCSAqIGFzc3VtZWQg dG8gbWF0Y2ggYWdhaW5zdCByYW5kb20gbWVtYmVycyBvZiByZWxhdGlvbiAyJ3MgdW5tYXRj aGVkCgkJICogTUNWcyBwbHVzIG5vbi1NQ1YgdmFsdWVzLgoJCSAqLwoJCXRvdGFsc2VsMSA9 IG1hdGNocHJvZGZyZXE7CgkJaWYgKG5kMiA+IHNzbG90Mi0+bnZhbHVlcykKCQkJdG90YWxz ZWwxICs9IHVubWF0Y2hmcmVxMSAqIG90aGVyZnJlcTIgLyAobmQyIC0gc3Nsb3QyLT5udmFs dWVzKTsKCQlpZiAobmQyID4gbm1hdGNoZXMpCgkJCXRvdGFsc2VsMSArPSBvdGhlcmZyZXEx ICogKG90aGVyZnJlcTIgKyB1bm1hdGNoZnJlcTIpIC8KCQkJCShuZDIgLSBubWF0Y2hlcyk7 CgkJLyogU2FtZSBlc3RpbWF0ZSBmcm9tIHRoZSBwb2ludCBvZiB2aWV3IG9mIHJlbGF0aW9u IDIuICovCgkJdG90YWxzZWwyID0gbWF0Y2hwcm9kZnJlcTsKCQlpZiAobmQxID4gc3Nsb3Qx LT5udmFsdWVzKQoJCQl0b3RhbHNlbDIgKz0gdW5tYXRjaGZyZXEyICogb3RoZXJmcmVxMSAv IChuZDEgLSBzc2xvdDEtPm52YWx1ZXMpOwoJCWlmIChuZDEgPiBubWF0Y2hlcykKCQkJdG90 YWxzZWwyICs9IG90aGVyZnJlcTIgKiAob3RoZXJmcmVxMSArIHVubWF0Y2hmcmVxMSkgLwoJ CQkJKG5kMSAtIG5tYXRjaGVzKTsKCgkJLyoKCQkgKiBVc2UgdGhlIHNtYWxsZXIgb2YgdGhl IHR3byBlc3RpbWF0ZXMuICBUaGlzIGNhbiBiZSBqdXN0aWZpZWQgaW4KCQkgKiBlc3NlbnRp YWxseSB0aGUgc2FtZSB0ZXJtcyBhcyBnaXZlbiBiZWxvdyBmb3IgdGhlIG5vLXN0YXRzIGNh c2U6IHRvCgkJICogYSBmaXJzdCBhcHByb3hpbWF0aW9uLCB3ZSBhcmUgZXN0aW1hdGluZyBm cm9tIHRoZSBwb2ludCBvZiB2aWV3IG9mCgkJICogdGhlIHJlbGF0aW9uIHdpdGggc21hbGxl ciBuZC4KCQkgKi8KCQlzZWxlYyA9ICh0b3RhbHNlbDEgPCB0b3RhbHNlbDIpID8gdG90YWxz ZWwxIDogdG90YWxzZWwyOwoJfQoJZWxzZQoJewoJCS8qCgkJICogV2UgZG8gbm90IGhhdmUg TUNWIGxpc3RzIGZvciBib3RoIHNpZGVzLiAgRXN0aW1hdGUgdGhlIGpvaW4KCQkgKiBzZWxl Y3Rpdml0eSBhcyBNSU4oMS9uZDEsMS9uZDIpKigxLW51bGxmcmFjMSkqKDEtbnVsbGZyYWMy KS4gVGhpcwoJCSAqIGlzIHBsYXVzaWJsZSBpZiB3ZSBhc3N1bWUgdGhhdCB0aGUgam9pbiBv cGVyYXRvciBpcyBzdHJpY3QgYW5kIHRoZQoJCSAqIG5vbi1udWxsIHZhbHVlcyBhcmUgYWJv dXQgZXF1YWxseSBkaXN0cmlidXRlZDogYSBnaXZlbiBub24tbnVsbAoJCSAqIHR1cGxlIG9m IHJlbDEgd2lsbCBqb2luIHRvIGVpdGhlciB6ZXJvIG9yIE4yKigxLW51bGxmcmFjMikvbmQy IHJvd3MKCQkgKiBvZiByZWwyLCBzbyB0b3RhbCBqb2luIHJvd3MgYXJlIGF0IG1vc3QKCQkg KiBOMSooMS1udWxsZnJhYzEpKk4yKigxLW51bGxmcmFjMikvbmQyIGdpdmluZyBhIGpvaW4g c2VsZWN0aXZpdHkgb2YKCQkgKiBub3QgbW9yZSB0aGFuICgxLW51bGxmcmFjMSkqKDEtbnVs bGZyYWMyKS9uZDIuIEJ5IHRoZSBzYW1lIGxvZ2ljIGl0CgkJICogaXMgbm90IG1vcmUgdGhh biAoMS1udWxsZnJhYzEpKigxLW51bGxmcmFjMikvbmQxLCBzbyB0aGUgZXhwcmVzc2lvbgoJ CSAqIHdpdGggTUlOKCkgaXMgYW4gdXBwZXIgYm91bmQuICBVc2luZyB0aGUgTUlOKCkgbWVh bnMgd2UgZXN0aW1hdGUKCQkgKiBmcm9tIHRoZSBwb2ludCBvZiB2aWV3IG9mIHRoZSByZWxh dGlvbiB3aXRoIHNtYWxsZXIgbmQgKHNpbmNlIHRoZQoJCSAqIGxhcmdlciBuZCBpcyBkZXRl cm1pbmluZyB0aGUgTUlOKS4gIEl0IGlzIHJlYXNvbmFibGUgdG8gYXNzdW1lIHRoYXQKCQkg KiBtb3N0IHR1cGxlcyBpbiB0aGlzIHJlbCB3aWxsIGhhdmUgam9pbiBwYXJ0bmVycywgc28g dGhlIGJvdW5kIGlzCgkJICogcHJvYmFibHkgcmVhc29uYWJseSB0aWdodCBhbmQgc2hvdWxk IGJlIHRha2VuIGFzLWlzLgoJCSAqCgkJICogWFhYIENhbiB3ZSBiZSBzbWFydGVyIGlmIHdl IGhhdmUgYW4gTUNWIGxpc3QgZm9yIGp1c3Qgb25lIHNpZGU/IEl0CgkJICogc2VlbXMgdGhh dCBpZiB3ZSBhc3N1bWUgZXF1YWwgZGlzdHJpYnV0aW9uIGZvciB0aGUgb3RoZXIgc2lkZSwg d2UKCQkgKiBlbmQgdXAgd2l0aCB0aGUgc2FtZSBhbnN3ZXIgYW55d2F5LgoJCSAqLwoJCWRv dWJsZQkJbnVsbGZyYWMxID0gc3RhdHMxID8gc3RhdHMxLT5zdGFudWxsZnJhYyA6IDAuMDsK CQlkb3VibGUJCW51bGxmcmFjMiA9IHN0YXRzMiA/IHN0YXRzMi0+c3RhbnVsbGZyYWMgOiAw LjA7CgoJCXNlbGVjID0gKDEuMCAtIG51bGxmcmFjMSkgKiAoMS4wIC0gbnVsbGZyYWMyKTsK CQlpZiAobmQxID4gbmQyKQoJCQlzZWxlYyAvPSBuZDE7CgkJZWxzZQoJCQlzZWxlYyAvPSBu ZDI7Cgl9CgoJcmV0dXJuIHNlbGVjOwp9CgovKgogKiBlcWpvaW5zZWxfc2VtaSAtLS0gZXFq b2luc2VsIGZvciBzZW1pIGpvaW4KICoKICogKEFsc28gdXNlZCBmb3IgYW50aSBqb2luLCB3 aGljaCB3ZSBhcmUgc3VwcG9zZWQgdG8gZXN0aW1hdGUgdGhlIHNhbWUgd2F5LikKICogQ2Fs bGVyIGhhcyBlbnN1cmVkIHRoYXQgdmFyZGF0YTEgaXMgdGhlIExIUyB2YXJpYWJsZTsgaG93 ZXZlciwgZXFwcm9jCiAqIGlzIGZvciB0aGUgb3JpZ2luYWwgam9pbiBvcGVyYXRvciwgd2hp Y2ggbWlnaHQgbm93IG5lZWQgdG8gaGF2ZSB0aGUgaW5wdXRzCiAqIHN3YXBwZWQgaW4gb3Jk ZXIgdG8gYXBwbHkgY29ycmVjdGx5LiAgQWxzbywgaWYgaGF2ZV9tY3ZzMSAmJiBoYXZlX21j dnMyCiAqIHRoZW4gaGFzbWF0Y2gxW10sIGhhc21hdGNoMltdLCBhbmQgKnBfbm1hdGNoZXMg d2VyZSBmaWxsZWQgYnkKICogZXFqb2luc2VsX2lubmVyLgogKi8Kc3RhdGljIGRvdWJsZQpl cWpvaW5zZWxfc2VtaShGbWdySW5mbyAqZXFwcm9jLCBPaWQgY29sbGF0aW9uLAoJCQkgICBP aWQgaGFzaExlZnQsIE9pZCBoYXNoUmlnaHQsCgkJCSAgIGJvb2wgb3BfaXNfcmV2ZXJzZWQs CgkJCSAgIFZhcmlhYmxlU3RhdERhdGEgKnZhcmRhdGExLCBWYXJpYWJsZVN0YXREYXRhICp2 YXJkYXRhMiwKCQkJICAgZG91YmxlIG5kMSwgZG91YmxlIG5kMiwKCQkJICAgYm9vbCBpc2Rl ZmF1bHQxLCBib29sIGlzZGVmYXVsdDIsCgkJCSAgIEF0dFN0YXRzU2xvdCAqc3Nsb3QxLCBB dHRTdGF0c1Nsb3QgKnNzbG90MiwKCQkJICAgRm9ybV9wZ19zdGF0aXN0aWMgc3RhdHMxLCBG b3JtX3BnX3N0YXRpc3RpYyBzdGF0czIsCgkJCSAgIGJvb2wgaGF2ZV9tY3ZzMSwgYm9vbCBo YXZlX21jdnMyLAoJCQkgICBib29sICpoYXNtYXRjaDEsIGJvb2wgKmhhc21hdGNoMiwKCQkJ ICAgaW50ICpwX25tYXRjaGVzLAoJCQkgICBSZWxPcHRJbmZvICppbm5lcl9yZWwpCnsKCWRv dWJsZQkJc2VsZWM7CgoJLyoKCSAqIFdlIGNsYW1wIG5kMiB0byBiZSBub3QgbW9yZSB0aGFu IHdoYXQgd2UgZXN0aW1hdGUgdGhlIGlubmVyIHJlbGF0aW9uJ3MKCSAqIHNpemUgdG8gYmUu ICBUaGlzIGlzIGludHVpdGl2ZWx5IHNvbWV3aGF0IHJlYXNvbmFibGUgc2luY2Ugb2J2aW91 c2x5CgkgKiB0aGVyZSBjYW4ndCBiZSBtb3JlIHRoYW4gdGhhdCBtYW55IGRpc3RpbmN0IHZh bHVlcyBjb21pbmcgZnJvbSB0aGUKCSAqIGlubmVyIHJlbC4gIFRoZSByZWFzb24gZm9yIHRo ZSBhc3ltbWV0cnkgKGllLCB0aGF0IHdlIGRvbid0IGNsYW1wIG5kMQoJICogbGlrZXdpc2Up IGlzIHRoYXQgdGhpcyBpcyB0aGUgb25seSBwYXRod2F5IGJ5IHdoaWNoIHJlc3RyaWN0aW9u IGNsYXVzZXMKCSAqIGFwcGxpZWQgdG8gdGhlIGlubmVyIHJlbCB3aWxsIGFmZmVjdCB0aGUg am9pbiByZXN1bHQgc2l6ZSBlc3RpbWF0ZSwKCSAqIHNpbmNlIHNldF9qb2lucmVsX3NpemVf ZXN0aW1hdGVzIHdpbGwgbXVsdGlwbHkgU0VNSS9BTlRJIHNlbGVjdGl2aXR5IGJ5CgkgKiBv bmx5IHRoZSBvdXRlciByZWwncyBzaXplLiAgSWYgd2UgY2xhbXBlZCBuZDEgd2UnZCBiZSBk b3VibGUtY291bnRpbmcKCSAqIHRoZSBzZWxlY3Rpdml0eSBvZiBvdXRlci1yZWwgcmVzdHJp Y3Rpb25zLgoJICoKCSAqIFdlIGNhbiBhcHBseSB0aGlzIGNsYW1waW5nIGJvdGggd2l0aCBy ZXNwZWN0IHRvIHRoZSBiYXNlIHJlbGF0aW9uIGZyb20KCSAqIHdoaWNoIHRoZSBqb2luIHZh cmlhYmxlIGNvbWVzIChpZiB0aGVyZSBpcyBqdXN0IG9uZSksIGFuZCB0byB0aGUKCSAqIGlt bWVkaWF0ZSBpbm5lciBpbnB1dCByZWxhdGlvbiBvZiB0aGUgY3VycmVudCBqb2luLgoJICoK CSAqIElmIHdlIGNsYW1wLCB3ZSBjYW4gdHJlYXQgbmQyIGFzIGJlaW5nIGEgbm9uLWRlZmF1 bHQgZXN0aW1hdGU7IGl0J3Mgbm90CgkgKiBncmVhdCwgbWF5YmUsIGJ1dCBpdCBkaWRuJ3Qg Y29tZSBvdXQgb2Ygbm93aGVyZSBlaXRoZXIuICBUaGlzIGlzIG1vc3QKCSAqIGhlbHBmdWwg d2hlbiB0aGUgaW5uZXIgcmVsYXRpb24gaXMgZW1wdHkgYW5kIGNvbnNlcXVlbnRseSBoYXMg bm8gc3RhdHMuCgkgKi8KCWlmICh2YXJkYXRhMi0+cmVsKQoJewoJCWlmIChuZDIgPj0gdmFy ZGF0YTItPnJlbC0+cm93cykKCQl7CgkJCW5kMiA9IHZhcmRhdGEyLT5yZWwtPnJvd3M7CgkJ CWlzZGVmYXVsdDIgPSBmYWxzZTsKCQl9Cgl9CglpZiAobmQyID49IGlubmVyX3JlbC0+cm93 cykKCXsKCQluZDIgPSBpbm5lcl9yZWwtPnJvd3M7CgkJaXNkZWZhdWx0MiA9IGZhbHNlOwoJ fQoKCWlmIChoYXZlX21jdnMxICYmIGhhdmVfbWN2czIpCgl7CgkJLyoKCQkgKiBXZSBoYXZl IG1vc3QtY29tbW9uLXZhbHVlIGxpc3RzIGZvciBib3RoIHJlbGF0aW9ucy4gIFJ1biB0aHJv dWdoCgkJICogdGhlIGxpc3RzIHRvIHNlZSB3aGljaCBNQ1ZzIGFjdHVhbGx5IGpvaW4gdG8g ZWFjaCBvdGhlciB3aXRoIHRoZQoJCSAqIGdpdmVuIG9wZXJhdG9yLiAgVGhpcyBhbGxvd3Mg dXMgdG8gZGV0ZXJtaW5lIHRoZSBleGFjdCBqb2luCgkJICogc2VsZWN0aXZpdHkgZm9yIHRo ZSBwb3J0aW9uIG9mIHRoZSByZWxhdGlvbnMgcmVwcmVzZW50ZWQgYnkgdGhlIE1DVgoJCSAq IGxpc3RzLiAgV2Ugc3RpbGwgaGF2ZSB0byBlc3RpbWF0ZSBmb3IgdGhlIHJlbWFpbmluZyBw b3B1bGF0aW9uLCBidXQKCQkgKiBpbiBhIHNrZXdlZCBkaXN0cmlidXRpb24gdGhpcyBnaXZl cyB1cyBhIGJpZyBsZWcgdXAgaW4gYWNjdXJhY3kuCgkJICovCgkJZG91YmxlCQludWxsZnJh YzEgPSBzdGF0czEtPnN0YW51bGxmcmFjOwoJCWRvdWJsZQkJbWF0Y2hwcm9kZnJlcSwKCQkJ CQltYXRjaGZyZXExLAoJCQkJCXVuY2VydGFpbmZyYWMsCgkJCQkJdW5jZXJ0YWluOwoJCWlu dAkJCWksCgkJCQkJbm1hdGNoZXMsCgkJCQkJY2xhbXBlZF9udmFsdWVzMjsKCgkJLyoKCQkg KiBUaGUgY2xhbXBpbmcgYWJvdmUgY291bGQgaGF2ZSByZXN1bHRlZCBpbiBuZDIgYmVpbmcg bGVzcyB0aGFuCgkJICogc3Nsb3QyLT5udmFsdWVzOyBpbiB3aGljaCBjYXNlLCB3ZSBhc3N1 bWUgdGhhdCBwcmVjaXNlbHkgdGhlIG5kMgoJCSAqIG1vc3QgY29tbW9uIHZhbHVlcyBpbiB0 aGUgcmVsYXRpb24gd2lsbCBhcHBlYXIgaW4gdGhlIGpvaW4gaW5wdXQsCgkJICogYW5kIHNv IGNvbXBhcmUgdG8gb25seSB0aGUgZmlyc3QgbmQyIG1lbWJlcnMgb2YgdGhlIE1DViBsaXN0 LiAgT2YKCQkgKiBjb3Vyc2UgdGhpcyBpcyBmcmVxdWVudGx5IHdyb25nLCBidXQgaXQncyB0 aGUgYmVzdCBiZXQgd2UgY2FuIG1ha2UuCgkJICovCgkJY2xhbXBlZF9udmFsdWVzMiA9IE1p bihzc2xvdDItPm52YWx1ZXMsIG5kMik7CgoJCS8qCgkJICogSWYgd2UgZGlkIG5vdCBzZXQg Y2xhbXBlZF9udmFsdWVzMiB0byBsZXNzIHRoYW4gc3Nsb3QyLT5udmFsdWVzLAoJCSAqIHRo ZW4gdGhlIGhhc21hdGNoMVtdIGFuZCBoYXNtYXRjaDJbXSBtYXRjaCBmbGFncyBjb21wdXRl ZCBieQoJCSAqIGVxam9pbnNlbF9pbm5lciBhcmUgc3RpbGwgcGVyZmVjdGx5IGFwcGxpY2Fi bGUsIHNvIHdlIG5lZWQgbm90CgkJICogcmUtZG8gdGhlIG1hdGNoaW5nIHdvcmsuICBOb3Rl IHRoYXQgaXQgZG9lcyBub3QgbWF0dGVyIGlmCgkJICogb3BfaXNfcmV2ZXJzZWQ6IHdlJ2Qg Z2V0IHRoZSBzYW1lIGFuc3dlcnMuCgkJICoKCQkgKiBJZiB3ZSBkaWQgY2xhbXAsIHRoZW4g YSBkaWZmZXJlbnQgc2V0IG9mIHNzbG90MiB2YWx1ZXMgaXMgdG8gYmUKCQkgKiBjb21wYXJl ZCwgc28gd2UgaGF2ZSB0byByZS1kbyB0aGUgbWF0Y2hpbmcuCgkJICovCgkJaWYgKGNsYW1w ZWRfbnZhbHVlczIgIT0gc3Nsb3QyLT5udmFsdWVzKQoJCXsKCQkJLyogTXVzdCByZS16ZXJv IHRoZSBhcnJheXMgKi8KCQkJbWVtc2V0KGhhc21hdGNoMSwgMCwgc3Nsb3QxLT5udmFsdWVz ICogc2l6ZW9mKGJvb2wpKTsKCQkJbWVtc2V0KGhhc21hdGNoMiwgMCwgY2xhbXBlZF9udmFs dWVzMiAqIHNpemVvZihib29sKSk7CgkJCS8qIFJlLWZpbGwgdGhlIG1hdGNoIGFycmF5cyAq LwoJCQllcWpvaW5zZWxfZmluZF9tYXRjaGVzKGVxcHJvYywgY29sbGF0aW9uLAoJCQkJCQkJ CSAgIGhhc2hMZWZ0LCBoYXNoUmlnaHQsCgkJCQkJCQkJICAgb3BfaXNfcmV2ZXJzZWQsCgkJ CQkJCQkJICAgc3Nsb3QxLCBzc2xvdDIsCgkJCQkJCQkJICAgc3Nsb3QxLT5udmFsdWVzLCBj bGFtcGVkX252YWx1ZXMyLAoJCQkJCQkJCSAgIGhhc21hdGNoMSwgaGFzbWF0Y2gyLAoJCQkJ CQkJCSAgIHBfbm1hdGNoZXMsICZtYXRjaHByb2RmcmVxKTsKCQl9CgkJbm1hdGNoZXMgPSAq cF9ubWF0Y2hlczsKCgkJLyogU3VtIHVwIGZyZXF1ZW5jaWVzIG9mIG1hdGNoZWQgTUNWcyAq LwoJCW1hdGNoZnJlcTEgPSAwLjA7CgkJZm9yIChpID0gMDsgaSA8IHNzbG90MS0+bnZhbHVl czsgaSsrKQoJCXsKCQkJaWYgKGhhc21hdGNoMVtpXSkKCQkJCW1hdGNoZnJlcTEgKz0gc3Ns b3QxLT5udW1iZXJzW2ldOwoJCX0KCQlDTEFNUF9QUk9CQUJJTElUWShtYXRjaGZyZXExKTsK CgkJLyoKCQkgKiBOb3cgd2UgbmVlZCB0byBlc3RpbWF0ZSB0aGUgZnJhY3Rpb24gb2YgcmVs YXRpb24gMSB0aGF0IGhhcyBhdAoJCSAqIGxlYXN0IG9uZSBqb2luIHBhcnRuZXIuICBXZSBr bm93IGZvciBjZXJ0YWluIHRoYXQgdGhlIG1hdGNoZWQgTUNWcwoJCSAqIGRvLCBzbyB0aGF0 IGdpdmVzIHVzIGEgbG93ZXIgYm91bmQsIGJ1dCB3ZSdyZSByZWFsbHkgaW4gdGhlIGRhcmsK CQkgKiBhYm91dCBldmVyeXRoaW5nIGVsc2UuICBPdXIgY3J1ZGUgYXBwcm9hY2ggaXM6IGlm IG5kMSA8PSBuZDIgdGhlbgoJCSAqIGFzc3VtZSBhbGwgbm9uLW51bGwgcmVsMSByb3dzIGhh dmUgam9pbiBwYXJ0bmVycywgZWxzZSBhc3N1bWUgZm9yCgkJICogdGhlIHVuY2VydGFpbiBy b3dzIHRoYXQgYSBmcmFjdGlvbiBuZDIvbmQxIGhhdmUgam9pbiBwYXJ0bmVycy4gV2UKCQkg KiBjYW4gZGlzY291bnQgdGhlIGtub3duLW1hdGNoZWQgTUNWcyBmcm9tIHRoZSBkaXN0aW5j dC12YWx1ZXMgY291bnRzCgkJICogYmVmb3JlIGRvaW5nIHRoZSBkaXZpc2lvbi4KCQkgKgoJ CSAqIENydWRlIGFzIHRoZSBhYm92ZSBpcywgaXQncyBjb21wbGV0ZWx5IHVzZWxlc3MgaWYg d2UgZG9uJ3QgaGF2ZQoJCSAqIHJlbGlhYmxlIG5kaXN0aW5jdCB2YWx1ZXMgZm9yIGJvdGgg c2lkZXMuICBIZW5jZSwgaWYgZWl0aGVyIG5kMSBvcgoJCSAqIG5kMiBpcyBkZWZhdWx0LCBw dW50IGFuZCBhc3N1bWUgaGFsZiBvZiB0aGUgdW5jZXJ0YWluIHJvd3MgaGF2ZQoJCSAqIGpv aW4gcGFydG5lcnMuCgkJICovCgkJaWYgKCFpc2RlZmF1bHQxICYmICFpc2RlZmF1bHQyKQoJ CXsKCQkJbmQxIC09IG5tYXRjaGVzOwoJCQluZDIgLT0gbm1hdGNoZXM7CgkJCWlmIChuZDEg PD0gbmQyIHx8IG5kMiA8IDApCgkJCQl1bmNlcnRhaW5mcmFjID0gMS4wOwoJCQllbHNlCgkJ CQl1bmNlcnRhaW5mcmFjID0gbmQyIC8gbmQxOwoJCX0KCQllbHNlCgkJCXVuY2VydGFpbmZy YWMgPSAwLjU7CgkJdW5jZXJ0YWluID0gMS4wIC0gbWF0Y2hmcmVxMSAtIG51bGxmcmFjMTsK CQlDTEFNUF9QUk9CQUJJTElUWSh1bmNlcnRhaW4pOwoJCXNlbGVjID0gbWF0Y2hmcmVxMSAr IHVuY2VydGFpbmZyYWMgKiB1bmNlcnRhaW47Cgl9CgllbHNlCgl7CgkJLyoKCQkgKiBXaXRo b3V0IE1DViBsaXN0cyBmb3IgYm90aCBzaWRlcywgd2UgY2FuIG9ubHkgdXNlIHRoZSBoZXVy aXN0aWMKCQkgKiBhYm91dCBuZDEgdnMgbmQyLgoJCSAqLwoJCWRvdWJsZQkJbnVsbGZyYWMx ID0gc3RhdHMxID8gc3RhdHMxLT5zdGFudWxsZnJhYyA6IDAuMDsKCgkJaWYgKCFpc2RlZmF1 bHQxICYmICFpc2RlZmF1bHQyKQoJCXsKCQkJaWYgKG5kMSA8PSBuZDIgfHwgbmQyIDwgMCkK CQkJCXNlbGVjID0gMS4wIC0gbnVsbGZyYWMxOwoJCQllbHNlCgkJCQlzZWxlYyA9IChuZDIg LyBuZDEpICogKDEuMCAtIG51bGxmcmFjMSk7CgkJfQoJCWVsc2UKCQkJc2VsZWMgPSAwLjUg KiAoMS4wIC0gbnVsbGZyYWMxKTsKCX0KCglyZXR1cm4gc2VsZWM7Cn0KCi8qCiAqIElkZW50 aWZ5IG1hdGNoaW5nIE1DVnMgZm9yIGVxam9pbnNlbF9pbm5lciBvciBlcWpvaW5zZWxfc2Vt aS4KICoKICogSW5wdXRzOgogKgllcXByb2M6IEZtZ3JJbmZvIGZvciBlcXVhbGl0eSBmdW5j dGlvbiB0byB1c2UgKG1pZ2h0IGJlIHJldmVyc2VkKQogKgljb2xsYXRpb246IE9JRCBvZiBj b2xsYXRpb24gdG8gdXNlCiAqCWhhc2hMZWZ0LCBoYXNoUmlnaHQ6IE9JRHMgb2YgaGFzaCBm dW5jdGlvbnMgYXNzb2NpYXRlZCB3aXRoIGVxdWFsaXR5IG9wLAogKgkJb3IgSW52YWxpZE9p ZCBpZiB3ZSdyZSBub3QgdG8gdXNlIGhhc2hpbmcKICoJb3BfaXNfcmV2ZXJzZWQ6IGluZGlj YXRlcyB0aGF0IGVxcHJvYyBjb21wYXJlcyByaWdodCB0eXBlIHRvIGxlZnQgdHlwZQogKglz c2xvdDEsIHNzbG90MjogTUNWIHZhbHVlcyBmb3IgdGhlIGxlZnRoYW5kIGFuZCByaWdodGhh bmQgaW5wdXRzCiAqCW52YWx1ZXMxLCBudmFsdWVzMjogbnVtYmVyIG9mIHZhbHVlcyB0byBi ZSBjb25zaWRlcmVkIChjYW4gYmUgbGVzcyB0aGFuCiAqCQlzc2xvdE4tPm52YWx1ZXMsIGJ1 dCBub3QgbW9yZSkKICogT3V0cHV0czoKICoJaGFzbWF0Y2gxW10sIGhhc21hdGNoMltdOiBw cmUtemVyb2VkIGFycmF5cyBvZiBsZW5ndGhzIG52YWx1ZXMxLCBudmFsdWVzMjsKICoJCWVu dHJpZXMgYXJlIHNldCB0byB0cnVlIGlmIHRoYXQgTUNWIGhhcyBhIG1hdGNoIG9uIHRoZSBv dGhlciBzaWRlCiAqCSpwX25tYXRjaGVzOiByZWNlaXZlcyBudW1iZXIgb2YgTUNWIHBhaXJz IHRoYXQgbWF0Y2gKICoJKnBfbWF0Y2hwcm9kZnJlcTogcmVjZWl2ZXMgc3VtKHNzbG90MS0+ bnVtYmVyc1tpXSAqIHNzbG90Mi0+bnVtYmVyc1tqXSkKICoJCWZvciBtYXRjaGluZyBNQ1Zz CiAqCiAqIE5vdGUgdGhhdCBoYXNoTGVmdCBpcyBmb3IgdGhlIGVxcHJvYydzIGxlZnQtaGFu ZCBpbnB1dCB0eXBlLCBoYXNoUmlnaHQKICogZm9yIGl0cyByaWdodCwgcmVnYXJkbGVzcyBv ZiBvcF9pc19yZXZlcnNlZC4KICoKICogTm90ZSB3ZSBhc3N1bWUgdGhhdCBlYWNoIE1DViB3 aWxsIG1hdGNoIGF0IG1vc3Qgb25lIG1lbWJlciBvZiB0aGUgb3RoZXIKICogTUNWIGxpc3Qu ICBJZiB0aGUgb3BlcmF0b3IgaXNuJ3QgcmVhbGx5IGVxdWFsaXR5LCB0aGVyZSBjb3VsZCBi ZSBtdWx0aXBsZQogKiBtYXRjaGVzIC0tLSBidXQgd2UgZG9uJ3QgbG9vayBmb3IgdGhlbSwg Ym90aCBmb3Igc3BlZWQgYW5kIGJlY2F1c2UgdGhlCiAqIG1hdGggd291bGRuJ3QgYWRkIHVw Li4uCiAqLwpzdGF0aWMgdm9pZAplcWpvaW5zZWxfZmluZF9tYXRjaGVzKEZtZ3JJbmZvICpl cXByb2MsIE9pZCBjb2xsYXRpb24sCgkJCQkJICAgT2lkIGhhc2hMZWZ0LCBPaWQgaGFzaFJp Z2h0LAoJCQkJCSAgIGJvb2wgb3BfaXNfcmV2ZXJzZWQsCgkJCQkJICAgQXR0U3RhdHNTbG90 ICpzc2xvdDEsIEF0dFN0YXRzU2xvdCAqc3Nsb3QyLAoJCQkJCSAgIGludCBudmFsdWVzMSwg aW50IG52YWx1ZXMyLAoJCQkJCSAgIGJvb2wgKmhhc21hdGNoMSwgYm9vbCAqaGFzbWF0Y2gy LAoJCQkJCSAgIGludCAqcF9ubWF0Y2hlcywgZG91YmxlICpwX21hdGNocHJvZGZyZXEpCnsK CUxPQ0FMX0ZDSU5GTyhmY2luZm8sIDIpOwoJZG91YmxlCQltYXRjaHByb2RmcmVxID0gMC4w OwoJaW50CQkJbm1hdGNoZXMgPSAwOwoKCS8qCgkgKiBTYXZlIGEgZmV3IGN5Y2xlcyBieSBz ZXR0aW5nIHVwIHRoZSBmY2luZm8gc3RydWN0IGp1c3Qgb25jZS4gIFVzaW5nCgkgKiBGdW5j dGlvbkNhbGxJbnZva2UgZGlyZWN0bHkgYWxzbyBhdm9pZHMgZmFpbHVyZSBpZiB0aGUgZXFw cm9jIHJldHVybnMKCSAqIE5VTEwsIHRob3VnaCByZWFsbHkgZXF1YWxpdHkgZnVuY3Rpb25z IHNob3VsZCBuZXZlciBkbyB0aGF0LgoJICovCglJbml0RnVuY3Rpb25DYWxsSW5mb0RhdGEo KmZjaW5mbywgZXFwcm9jLCAyLCBjb2xsYXRpb24sCgkJCQkJCQkgTlVMTCwgTlVMTCk7Cglm Y2luZm8tPmFyZ3NbMF0uaXNudWxsID0gZmFsc2U7CglmY2luZm8tPmFyZ3NbMV0uaXNudWxs ID0gZmFsc2U7CgoJaWYgKE9pZElzVmFsaWQoaGFzaExlZnQpICYmIE9pZElzVmFsaWQoaGFz aFJpZ2h0KSkKCXsKCQkvKiBVc2UgYSBoYXNoIHRhYmxlIHRvIHNwZWVkIHVwIHRoZSBtYXRj aGluZyAqLwoJCUxPQ0FMX0ZDSU5GTyhoYXNoX2ZjaW5mbywgMSk7CgkJRm1nckluZm8JaGFz aF9wcm9jOwoJCU1DVkhhc2hDb250ZXh0IGhhc2hDb250ZXh0OwoJCU1DVkhhc2hUYWJsZV9o YXNoICpoYXNoVGFibGU7CgkJQXR0U3RhdHNTbG90ICpzdGF0c1Byb2JlOwoJCUF0dFN0YXRz U2xvdCAqc3RhdHNIYXNoOwoJCWJvb2wJICAgKmhhc01hdGNoUHJvYmU7CgkJYm9vbAkgICAq aGFzTWF0Y2hIYXNoOwoJCWludAkJCW52YWx1ZXNQcm9iZTsKCQlpbnQJCQludmFsdWVzSGFz aDsKCgkJLyogTWFrZSBzdXJlIHdlIGJ1aWxkIHRoZSBoYXNoIHRhYmxlIG9uIHRoZSBzbWFs bGVyIGFycmF5LiAqLwoJCWlmIChzc2xvdDEtPm52YWx1ZXMgPj0gc3Nsb3QyLT5udmFsdWVz KQoJCXsKCQkJc3RhdHNQcm9iZSA9IHNzbG90MTsKCQkJc3RhdHNIYXNoID0gc3Nsb3QyOwoJ CQloYXNNYXRjaFByb2JlID0gaGFzbWF0Y2gxOwoJCQloYXNNYXRjaEhhc2ggPSBoYXNtYXRj aDI7CgkJCW52YWx1ZXNQcm9iZSA9IG52YWx1ZXMxOwoJCQludmFsdWVzSGFzaCA9IG52YWx1 ZXMyOwoJCX0KCQllbHNlCgkJewoJCQkvKiBXZSdsbCBoYXZlIHRvIHJldmVyc2UgdGhlIGRp cmVjdGlvbiBvZiB1c2Ugb2YgdGhlIG9wZXJhdG9yLiAqLwoJCQlvcF9pc19yZXZlcnNlZCA9 ICFvcF9pc19yZXZlcnNlZDsKCQkJc3RhdHNQcm9iZSA9IHNzbG90MjsKCQkJc3RhdHNIYXNo ID0gc3Nsb3QxOwoJCQloYXNNYXRjaFByb2JlID0gaGFzbWF0Y2gyOwoJCQloYXNNYXRjaEhh c2ggPSBoYXNtYXRjaDE7CgkJCW52YWx1ZXNQcm9iZSA9IG52YWx1ZXMyOwoJCQludmFsdWVz SGFzaCA9IG52YWx1ZXMxOwoJCX0KCgkJLyoKCQkgKiBCdWlsZCB0aGUgaGFzaCB0YWJsZSBv biB0aGUgc21hbGxlciBhcnJheSwgdXNpbmcgdGhlIGFwcHJvcHJpYXRlCgkJICogaGFzaCBm dW5jdGlvbiBmb3IgaXRzIGRhdGEgdHlwZS4KCQkgKi8KCQlmbWdyX2luZm8ob3BfaXNfcmV2 ZXJzZWQgPyBoYXNoTGVmdCA6IGhhc2hSaWdodCwgJmhhc2hfcHJvYyk7CgkJSW5pdEZ1bmN0 aW9uQ2FsbEluZm9EYXRhKCpoYXNoX2ZjaW5mbywgJmhhc2hfcHJvYywgMSwgY29sbGF0aW9u LAoJCQkJCQkJCSBOVUxMLCBOVUxMKTsKCQloYXNoX2ZjaW5mby0+YXJnc1swXS5pc251bGwg PSBmYWxzZTsKCgkJaGFzaENvbnRleHQuZXF1YWxfZmNpbmZvID0gZmNpbmZvOwoJCWhhc2hD b250ZXh0Lmhhc2hfZmNpbmZvID0gaGFzaF9mY2luZm87CgkJaGFzaENvbnRleHQub3BfaXNf cmV2ZXJzZWQgPSBvcF9pc19yZXZlcnNlZDsKCQloYXNoQ29udGV4dC5pbnNlcnRfbW9kZSA9 IHRydWU7CgkJZ2V0X3R5cGxlbmJ5dmFsKHN0YXRzSGFzaC0+dmFsdWV0eXBlLAoJCQkJCQkm aGFzaENvbnRleHQuaGFzaF90eXBsZW4sCgkJCQkJCSZoYXNoQ29udGV4dC5oYXNoX3R5cGJ5 dmFsKTsKCgkJaGFzaFRhYmxlID0gTUNWSGFzaFRhYmxlX2NyZWF0ZShDdXJyZW50TWVtb3J5 Q29udGV4dCwKCQkJCQkJCQkJCW52YWx1ZXNIYXNoLAoJCQkJCQkJCQkJJmhhc2hDb250ZXh0 KTsKCgkJZm9yIChpbnQgaSA9IDA7IGkgPCBudmFsdWVzSGFzaDsgaSsrKQoJCXsKCQkJYm9v bAkJZm91bmQgPSBmYWxzZTsKCQkJTUNWSGFzaEVudHJ5ICplbnRyeSA9IE1DVkhhc2hUYWJs ZV9pbnNlcnQoaGFzaFRhYmxlLAoJCQkJCQkJCQkJCQkJICBzdGF0c0hhc2gtPnZhbHVlc1tp XSwKCQkJCQkJCQkJCQkJCSAgJmZvdW5kKTsKCgkJCS8qCgkJCSAqIE1DVkhhc2hUYWJsZV9p bnNlcnQgd2lsbCBvbmx5IHJlcG9ydCAiZm91bmQiIGlmIHRoZSBuZXcgdmFsdWUKCQkJICog aXMgZXF1YWwgdG8gc29tZSBwcmV2aW91cyBvbmUgcGVyIGRhdHVtX2ltYWdlX2VxKCkuICBU aGF0CgkJCSAqIHByb2JhYmx5IHNob3VsZG4ndCBoYXBwZW4sIHNpbmNlIHdlJ3JlIG5vdCBl eHBlY3RpbmcgZHVwbGljYXRlcwoJCQkgKiBpbiB0aGUgTUNWIGxpc3QuICBJZiB3ZSBkbyBm aW5kIGEgZHVwLCBqdXN0IGlnbm9yZSBpdCwgbGVhdmluZwoJCQkgKiB0aGUgaGFzaCBlbnRy eSdzIGluZGV4IHBvaW50aW5nIGF0IHRoZSBmaXJzdCBvY2N1cnJlbmNlLiAgVGhhdAoJCQkg KiBtYXRjaGVzIHRoZSBiZWhhdmlvciB0aGF0IHRoZSBub24taGFzaGVkIGNvZGUgcGF0aCB3 b3VsZCBoYXZlLgoJCQkgKi8KCQkJaWYgKGxpa2VseSghZm91bmQpKQoJCQkJZW50cnktPmlu ZGV4ID0gaTsKCQl9CgoJCS8qCgkJICogUHJlcGFyZSB0byBwcm9iZSB0aGUgaGFzaCB0YWJs ZS4gIElmIHRoZSBwcm9iZSB2YWx1ZXMgYXJlIG9mIGEKCQkgKiBkaWZmZXJlbnQgZGF0YSB0 eXBlLCB0aGVuIHdlIG5lZWQgdG8gY2hhbmdlIGhhc2ggZnVuY3Rpb25zLiAgKFRoaXMKCQkg KiBjb2RlIHJlbGllcyBvbiB0aGUgYXNzdW1wdGlvbiB0aGF0IHNpbmNlIHdlIGRlZmluZWQg U0hfU1RPUkVfSEFTSCwKCQkgKiBzaW1wbGVoYXNoLmggd2lsbCBuZXZlciBuZWVkIHRvIGNv bXB1dGUgaGFzaCB2YWx1ZXMgZm9yIGV4aXN0aW5nCgkJICogaGFzaCB0YWJsZSBlbnRyaWVz LikKCQkgKi8KCQloYXNoQ29udGV4dC5pbnNlcnRfbW9kZSA9IGZhbHNlOwoJCWlmIChoYXNo TGVmdCAhPSBoYXNoUmlnaHQpCgkJewoJCQlmbWdyX2luZm8ob3BfaXNfcmV2ZXJzZWQgPyBo YXNoUmlnaHQgOiBoYXNoTGVmdCwgJmhhc2hfcHJvYyk7CgkJCS8qIFJlc2V0dGluZyBoYXNo X2ZjaW5mbyBpcyBwcm9iYWJseSB1bm5lY2Vzc2FyeSwgYnV0IGJlIHNhZmUgKi8KCQkJSW5p dEZ1bmN0aW9uQ2FsbEluZm9EYXRhKCpoYXNoX2ZjaW5mbywgJmhhc2hfcHJvYywgMSwgY29s bGF0aW9uLAoJCQkJCQkJCQkgTlVMTCwgTlVMTCk7CgkJCWhhc2hfZmNpbmZvLT5hcmdzWzBd LmlzbnVsbCA9IGZhbHNlOwoJCX0KCgkJLyogTG9vayB1cCBlYWNoIHByb2JlIHZhbHVlIGlu IHR1cm4uICovCgkJZm9yIChpbnQgaSA9IDA7IGkgPCBudmFsdWVzUHJvYmU7IGkrKykKCQl7 CgkJCU1DVkhhc2hFbnRyeSAqZW50cnkgPSBNQ1ZIYXNoVGFibGVfbG9va3VwKGhhc2hUYWJs ZSwKCQkJCQkJCQkJCQkJCSAgc3RhdHNQcm9iZS0+dmFsdWVzW2ldKTsKCgkJCS8qIEFzIGlu IHRoZSBvdGhlciBjb2RlIHBhdGgsIHNraXAgYWxyZWFkeS1tYXRjaGVkIGhhc2ggZW50cmll cyAqLwoJCQlpZiAoZW50cnkgIT0gTlVMTCAmJiAhaGFzTWF0Y2hIYXNoW2VudHJ5LT5pbmRl eF0pCgkJCXsKCQkJCWhhc01hdGNoSGFzaFtlbnRyeS0+aW5kZXhdID0gaGFzTWF0Y2hQcm9i ZVtpXSA9IHRydWU7CgkJCQlubWF0Y2hlcysrOwoJCQkJbWF0Y2hwcm9kZnJlcSArPSBzdGF0 c0hhc2gtPm51bWJlcnNbZW50cnktPmluZGV4XSAqIHN0YXRzUHJvYmUtPm51bWJlcnNbaV07 CgkJCX0KCQl9CgoJCU1DVkhhc2hUYWJsZV9kZXN0cm95KGhhc2hUYWJsZSk7Cgl9CgllbHNl Cgl7CgkJLyogV2UncmUgbm90IHRvIHVzZSBoYXNoaW5nLCBzbyBkbyBpdCB0aGUgTyhOXjIp IHdheSAqLwoJCWludAkJCWluZGV4MSwKCQkJCQlpbmRleDI7CgoJCS8qIFNldCB1cCB0byBz dXBwbHkgdGhlIHZhbHVlcyBpbiB0aGUgb3JkZXIgdGhlIG9wZXJhdG9yIGV4cGVjdHMgKi8K CQlpZiAob3BfaXNfcmV2ZXJzZWQpCgkJewoJCQlpbmRleDEgPSAxOwoJCQlpbmRleDIgPSAw OwoJCX0KCQllbHNlCgkJewoJCQlpbmRleDEgPSAwOwoJCQlpbmRleDIgPSAxOwoJCX0KCgkJ Zm9yIChpbnQgaSA9IDA7IGkgPCBudmFsdWVzMTsgaSsrKQoJCXsKCQkJZmNpbmZvLT5hcmdz W2luZGV4MV0udmFsdWUgPSBzc2xvdDEtPnZhbHVlc1tpXTsKCgkJCWZvciAoaW50IGogPSAw OyBqIDwgbnZhbHVlczI7IGorKykKCQkJewoJCQkJRGF0dW0JCWZyZXN1bHQ7CgoJCQkJaWYg KGhhc21hdGNoMltqXSkKCQkJCQljb250aW51ZTsKCQkJCWZjaW5mby0+YXJnc1tpbmRleDJd LnZhbHVlID0gc3Nsb3QyLT52YWx1ZXNbal07CgkJCQlmY2luZm8tPmlzbnVsbCA9IGZhbHNl OwoJCQkJZnJlc3VsdCA9IEZ1bmN0aW9uQ2FsbEludm9rZShmY2luZm8pOwoJCQkJaWYgKCFm Y2luZm8tPmlzbnVsbCAmJiBEYXR1bUdldEJvb2woZnJlc3VsdCkpCgkJCQl7CgkJCQkJaGFz bWF0Y2gxW2ldID0gaGFzbWF0Y2gyW2pdID0gdHJ1ZTsKCQkJCQltYXRjaHByb2RmcmVxICs9 IHNzbG90MS0+bnVtYmVyc1tpXSAqIHNzbG90Mi0+bnVtYmVyc1tqXTsKCQkJCQlubWF0Y2hl cysrOwoJCQkJCWJyZWFrOwoJCQkJfQoJCQl9CgkJfQoJfQoKCSpwX25tYXRjaGVzID0gbm1h dGNoZXM7CgkqcF9tYXRjaHByb2RmcmVxID0gbWF0Y2hwcm9kZnJlcTsKfQoKLyoKICogU3Vw cG9ydCBmdW5jdGlvbnMgZm9yIHRoZSBoYXNoIHRhYmxlcyB1c2VkIGJ5IGVxam9pbnNlbF9m aW5kX21hdGNoZXMKICovCnN0YXRpYyB1aW50MzIKaGFzaF9tY3YoTUNWSGFzaFRhYmxlX2hh c2ggKnRhYiwgRGF0dW0ga2V5KQp7CglNQ1ZIYXNoQ29udGV4dCAqY29udGV4dCA9IChNQ1ZI YXNoQ29udGV4dCAqKSB0YWItPnByaXZhdGVfZGF0YTsKCUZ1bmN0aW9uQ2FsbEluZm8gZmNp bmZvID0gY29udGV4dC0+aGFzaF9mY2luZm87CglEYXR1bQkJZnJlc3VsdDsKCglmY2luZm8t PmFyZ3NbMF0udmFsdWUgPSBrZXk7CglmY2luZm8tPmlzbnVsbCA9IGZhbHNlOwoJZnJlc3Vs dCA9IEZ1bmN0aW9uQ2FsbEludm9rZShmY2luZm8pOwoJQXNzZXJ0KCFmY2luZm8tPmlzbnVs bCk7CglyZXR1cm4gRGF0dW1HZXRVSW50MzIoZnJlc3VsdCk7Cn0KCnN0YXRpYyBib29sCm1j dnNfZXF1YWwoTUNWSGFzaFRhYmxlX2hhc2ggKnRhYiwgRGF0dW0ga2V5MCwgRGF0dW0ga2V5 MSkKewoJTUNWSGFzaENvbnRleHQgKmNvbnRleHQgPSAoTUNWSGFzaENvbnRleHQgKikgdGFi LT5wcml2YXRlX2RhdGE7CgoJaWYgKGNvbnRleHQtPmluc2VydF9tb2RlKQoJewoJCS8qCgkJ ICogRHVyaW5nIHRoZSBpbnNlcnRpb24gc3RlcCwgYW55IGNvbXBhcmlzb25zIHdpbGwgYmUg YmV0d2VlbiB0d28KCQkgKiBEYXR1bXMgb2YgdGhlIGhhc2ggdGFibGUncyBkYXRhIHR5cGUs IHNvIGlmIHRoZSBnaXZlbiBvcGVyYXRvciBpcwoJCSAqIGNyb3NzLXR5cGUgaXQgd2lsbCBi ZSB0aGUgd3JvbmcgdGhpbmcgdG8gdXNlLiAgRm9ydHVuYXRlbHksIHdlIGNhbgoJCSAqIHVz ZSBkYXR1bV9pbWFnZV9lcSBpbnN0ZWFkLiAgVGhlIE1DViB2YWx1ZXMgc2hvdWxkIGFsbCBi ZSBkaXN0aW5jdAoJCSAqIGFueXdheSwgc28gaXQncyBtb3N0bHkgcHJvLWZvcm1hIHRvIGNv bXBhcmUgdGhlbSBhdCBhbGwuCgkJICovCgkJcmV0dXJuIGRhdHVtX2ltYWdlX2VxKGtleTAs IGtleTEsCgkJCQkJCQkgIGNvbnRleHQtPmhhc2hfdHlwYnl2YWwsIGNvbnRleHQtPmhhc2hf dHlwbGVuKTsKCX0KCWVsc2UKCXsKCQlGdW5jdGlvbkNhbGxJbmZvIGZjaW5mbyA9IGNvbnRl eHQtPmVxdWFsX2ZjaW5mbzsKCQlEYXR1bQkJZnJlc3VsdDsKCgkJLyoKCQkgKiBBcHBseSB0 aGUgb3BlcmF0b3IgdGhlIGNvcnJlY3Qgd2F5IGFyb3VuZC4gIEFsdGhvdWdoIHNpbXBsZWhh c2guaAoJCSAqIGRvZXNuJ3QgZG9jdW1lbnQgdGhpcyBleHBsaWNpdGx5LCBkdXJpbmcgbG9v a3VwcyBrZXkwIGlzIGZyb20gdGhlCgkJICogaGFzaCB0YWJsZSB3aGlsZSBrZXkxIGlzIHRo ZSBwcm9iZSB2YWx1ZSwgc28gd2Ugc2hvdWxkIGNvbXBhcmUgdGhlbQoJCSAqIGluIHRoYXQg b3JkZXIgb25seSBpZiBvcF9pc19yZXZlcnNlZC4KCQkgKi8KCQlpZiAoY29udGV4dC0+b3Bf aXNfcmV2ZXJzZWQpCgkJewoJCQlmY2luZm8tPmFyZ3NbMF0udmFsdWUgPSBrZXkwOwoJCQlm Y2luZm8tPmFyZ3NbMV0udmFsdWUgPSBrZXkxOwoJCX0KCQllbHNlCgkJewoJCQlmY2luZm8t PmFyZ3NbMF0udmFsdWUgPSBrZXkxOwoJCQlmY2luZm8tPmFyZ3NbMV0udmFsdWUgPSBrZXkw OwoJCX0KCQlmY2luZm8tPmlzbnVsbCA9IGZhbHNlOwoJCWZyZXN1bHQgPSBGdW5jdGlvbkNh bGxJbnZva2UoZmNpbmZvKTsKCQlyZXR1cm4gKCFmY2luZm8tPmlzbnVsbCAmJiBEYXR1bUdl dEJvb2woZnJlc3VsdCkpOwoJfQp9CgovKgogKgkJbmVxam9pbnNlbAkJLSBKb2luIHNlbGVj dGl2aXR5IG9mICIhPSIKICovCkRhdHVtCm5lcWpvaW5zZWwoUEdfRlVOQ1RJT05fQVJHUykK ewoJUGxhbm5lckluZm8gKnJvb3QgPSAoUGxhbm5lckluZm8gKikgUEdfR0VUQVJHX1BPSU5U RVIoMCk7CglPaWQJCQlvcGVyYXRvciA9IFBHX0dFVEFSR19PSUQoMSk7CglMaXN0CSAgICph cmdzID0gKExpc3QgKikgUEdfR0VUQVJHX1BPSU5URVIoMik7CglKb2luVHlwZQlqb2ludHlw ZSA9IChKb2luVHlwZSkgUEdfR0VUQVJHX0lOVDE2KDMpOwoJU3BlY2lhbEpvaW5JbmZvICpz amluZm8gPSAoU3BlY2lhbEpvaW5JbmZvICopIFBHX0dFVEFSR19QT0lOVEVSKDQpOwoJT2lk CQkJY29sbGF0aW9uID0gUEdfR0VUX0NPTExBVElPTigpOwoJZmxvYXQ4CQlyZXN1bHQ7CgoJ aWYgKGpvaW50eXBlID09IEpPSU5fU0VNSSB8fCBqb2ludHlwZSA9PSBKT0lOX0FOVEkpCgl7 CgkJLyoKCQkgKiBGb3Igc2VtaS1qb2lucywgaWYgdGhlcmUgaXMgbW9yZSB0aGFuIG9uZSBk aXN0aW5jdCB2YWx1ZSBpbiB0aGUgUkhTCgkJICogcmVsYXRpb24gdGhlbiBldmVyeSBub24t bnVsbCBMSFMgcm93IG11c3QgZmluZCBhIHJvdyB0byBqb2luIHNpbmNlCgkJICogaXQgY2Fu IG9ubHkgYmUgZXF1YWwgdG8gb25lIG9mIHRoZW0uICBXZSdsbCBhc3N1bWUgdGhhdCB0aGVy ZSBpcwoJCSAqIGFsd2F5cyBtb3JlIHRoYW4gb25lIGRpc3RpbmN0IFJIUyB2YWx1ZSBmb3Ig dGhlIHNha2Ugb2Ygc3RhYmlsaXR5LAoJCSAqIHRob3VnaCBpbiB0aGVvcnkgd2UgY291bGQg aGF2ZSBzcGVjaWFsIGNhc2VzIGZvciBlbXB0eSBSSFMKCQkgKiAoc2VsZWN0aXZpdHkgPSAw KSBhbmQgc2luZ2xlLWRpc3RpbmN0LXZhbHVlIFJIUyAoc2VsZWN0aXZpdHkgPQoJCSAqIGZy YWN0aW9uIG9mIExIUyB0aGF0IGhhcyB0aGUgc2FtZSB2YWx1ZSBhcyB0aGUgc2luZ2xlIFJI UyB2YWx1ZSkuCgkJICoKCQkgKiBGb3IgYW50aS1qb2lucywgaWYgd2UgdXNlIHRoZSBzYW1l IGFzc3VtcHRpb24gdGhhdCB0aGVyZSBpcyBtb3JlCgkJICogdGhhbiBvbmUgZGlzdGluY3Qg a2V5IGluIHRoZSBSSFMgcmVsYXRpb24sIHRoZW4gZXZlcnkgbm9uLW51bGwgTEhTCgkJICog cm93IG11c3QgYmUgc3VwcHJlc3NlZCBieSB0aGUgYW50aS1qb2luLgoJCSAqCgkJICogU28g ZWl0aGVyIHdheSwgdGhlIHNlbGVjdGl2aXR5IGVzdGltYXRlIHNob3VsZCBiZSAxIC0gbnVs bGZyYWMuCgkJICovCgkJVmFyaWFibGVTdGF0RGF0YSBsZWZ0dmFyOwoJCVZhcmlhYmxlU3Rh dERhdGEgcmlnaHR2YXI7CgkJYm9vbAkJcmV2ZXJzZWQ7CgkJSGVhcFR1cGxlCXN0YXRzVHVw bGU7CgkJZG91YmxlCQludWxsZnJhYzsKCgkJZ2V0X2pvaW5fdmFyaWFibGVzKHJvb3QsIGFy Z3MsIHNqaW5mbywgJmxlZnR2YXIsICZyaWdodHZhciwgJnJldmVyc2VkKTsKCQlzdGF0c1R1 cGxlID0gcmV2ZXJzZWQgPyByaWdodHZhci5zdGF0c1R1cGxlIDogbGVmdHZhci5zdGF0c1R1 cGxlOwoJCWlmIChIZWFwVHVwbGVJc1ZhbGlkKHN0YXRzVHVwbGUpKQoJCQludWxsZnJhYyA9 ICgoRm9ybV9wZ19zdGF0aXN0aWMpIEdFVFNUUlVDVChzdGF0c1R1cGxlKSktPnN0YW51bGxm cmFjOwoJCWVsc2UKCQkJbnVsbGZyYWMgPSAwLjA7CgkJUmVsZWFzZVZhcmlhYmxlU3RhdHMo bGVmdHZhcik7CgkJUmVsZWFzZVZhcmlhYmxlU3RhdHMocmlnaHR2YXIpOwoKCQlyZXN1bHQg PSAxLjAgLSBudWxsZnJhYzsKCX0KCWVsc2UKCXsKCQkvKgoJCSAqIFdlIHdhbnQgMSAtIGVx am9pbnNlbCgpIHdoZXJlIHRoZSBlcXVhbGl0eSBvcGVyYXRvciBpcyB0aGUgb25lCgkJICog YXNzb2NpYXRlZCB3aXRoIHRoaXMgIT0gb3BlcmF0b3IsIHRoYXQgaXMsIGl0cyBuZWdhdG9y LgoJCSAqLwoJCU9pZAkJCWVxb3AgPSBnZXRfbmVnYXRvcihvcGVyYXRvcik7CgoJCWlmIChl cW9wKQoJCXsKCQkJcmVzdWx0ID0KCQkJCURhdHVtR2V0RmxvYXQ4KERpcmVjdEZ1bmN0aW9u Q2FsbDVDb2xsKGVxam9pbnNlbCwKCQkJCQkJCQkJCQkJCSAgIGNvbGxhdGlvbiwKCQkJCQkJ CQkJCQkJCSAgIFBvaW50ZXJHZXREYXR1bShyb290KSwKCQkJCQkJCQkJCQkJCSAgIE9iamVj dElkR2V0RGF0dW0oZXFvcCksCgkJCQkJCQkJCQkJCQkgICBQb2ludGVyR2V0RGF0dW0oYXJn cyksCgkJCQkJCQkJCQkJCQkgICBJbnQxNkdldERhdHVtKGpvaW50eXBlKSwKCQkJCQkJCQkJ CQkJCSAgIFBvaW50ZXJHZXREYXR1bShzamluZm8pKSk7CgkJfQoJCWVsc2UKCQl7CgkJCS8q IFVzZSBkZWZhdWx0IHNlbGVjdGl2aXR5IChzaG91bGQgd2UgcmFpc2UgYW4gZXJyb3IgaW5z dGVhZD8pICovCgkJCXJlc3VsdCA9IERFRkFVTFRfRVFfU0VMOwoJCX0KCQlyZXN1bHQgPSAx LjAgLSByZXN1bHQ7Cgl9CgoJUEdfUkVUVVJOX0ZMT0FUOChyZXN1bHQpOwp9CgovKgogKgkJ c2NhbGFybHRqb2luc2VsIC0gSm9pbiBzZWxlY3Rpdml0eSBvZiAiPCIgZm9yIHNjYWxhcnMK ICovCkRhdHVtCnNjYWxhcmx0am9pbnNlbChQR19GVU5DVElPTl9BUkdTKQp7CglQR19SRVRV Uk5fRkxPQVQ4KERFRkFVTFRfSU5FUV9TRUwpOwp9CgovKgogKgkJc2NhbGFybGVqb2luc2Vs IC0gSm9pbiBzZWxlY3Rpdml0eSBvZiAiPD0iIGZvciBzY2FsYXJzCiAqLwpEYXR1bQpzY2Fs YXJsZWpvaW5zZWwoUEdfRlVOQ1RJT05fQVJHUykKewoJUEdfUkVUVVJOX0ZMT0FUOChERUZB VUxUX0lORVFfU0VMKTsKfQoKLyoKICoJCXNjYWxhcmd0am9pbnNlbCAtIEpvaW4gc2VsZWN0 aXZpdHkgb2YgIj4iIGZvciBzY2FsYXJzCiAqLwpEYXR1bQpzY2FsYXJndGpvaW5zZWwoUEdf RlVOQ1RJT05fQVJHUykKewoJUEdfUkVUVVJOX0ZMT0FUOChERUZBVUxUX0lORVFfU0VMKTsK fQoKLyoKICoJCXNjYWxhcmdlam9pbnNlbCAtIEpvaW4gc2VsZWN0aXZpdHkgb2YgIj49IiBm b3Igc2NhbGFycwogKi8KRGF0dW0Kc2NhbGFyZ2Vqb2luc2VsKFBHX0ZVTkNUSU9OX0FSR1Mp CnsKCVBHX1JFVFVSTl9GTE9BVDgoREVGQVVMVF9JTkVRX1NFTCk7Cn0KCgovKgogKiBtZXJn ZWpvaW5zY2Fuc2VsCQkJLSBTY2FuIHNlbGVjdGl2aXR5IG9mIG1lcmdlIGpvaW4uCiAqCiAq IEEgbWVyZ2Ugam9pbiB3aWxsIHN0b3AgYXMgc29vbiBhcyBpdCBleGhhdXN0cyBlaXRoZXIg aW5wdXQgc3RyZWFtLgogKiBUaGVyZWZvcmUsIGlmIHdlIGNhbiBlc3RpbWF0ZSB0aGUgcmFu Z2VzIG9mIGJvdGggaW5wdXQgdmFyaWFibGVzLAogKiB3ZSBjYW4gZXN0aW1hdGUgaG93IG11 Y2ggb2YgdGhlIGlucHV0IHdpbGwgYWN0dWFsbHkgYmUgcmVhZC4gIFRoaXMKICogY2FuIGhh dmUgYSBjb25zaWRlcmFibGUgaW1wYWN0IG9uIHRoZSBjb3N0IHdoZW4gdXNpbmcgaW5kZXhz Y2Fucy4KICoKICogQWxzbywgd2UgY2FuIGVzdGltYXRlIGhvdyBtdWNoIG9mIGVhY2ggaW5w dXQgaGFzIHRvIGJlIHJlYWQgYmVmb3JlIHRoZQogKiBmaXJzdCBqb2luIHBhaXIgaXMgZm91 bmQsIHdoaWNoIHdpbGwgYWZmZWN0IHRoZSBqb2luJ3Mgc3RhcnR1cCB0aW1lLgogKgogKiBj bGF1c2Ugc2hvdWxkIGJlIGEgY2xhdXNlIGFscmVhZHkga25vd24gdG8gYmUgbWVyZ2Vqb2lu YWJsZS4gIG9wZmFtaWx5LAogKiBjbXB0eXBlLCBhbmQgbnVsbHNfZmlyc3Qgc3BlY2lmeSB0 aGUgc29ydCBvcmRlcmluZyBiZWluZyB1c2VkLgogKgogKiBUaGUgb3V0cHV0cyBhcmU6CiAq CQkqbGVmdHN0YXJ0IGlzIHNldCB0byB0aGUgZnJhY3Rpb24gb2YgdGhlIGxlZnQtaGFuZCB2 YXJpYWJsZSBleHBlY3RlZAogKgkJIHRvIGJlIHNjYW5uZWQgYmVmb3JlIHRoZSBmaXJzdCBq b2luIHBhaXIgaXMgZm91bmQgKDAgdG8gMSkuCiAqCQkqbGVmdGVuZCBpcyBzZXQgdG8gdGhl IGZyYWN0aW9uIG9mIHRoZSBsZWZ0LWhhbmQgdmFyaWFibGUgZXhwZWN0ZWQKICoJCSB0byBi ZSBzY2FubmVkIGJlZm9yZSB0aGUgam9pbiB0ZXJtaW5hdGVzICgwIHRvIDEpLgogKgkJKnJp Z2h0c3RhcnQsICpyaWdodGVuZCBzaW1pbGFybHkgZm9yIHRoZSByaWdodC1oYW5kIHZhcmlh YmxlLgogKi8Kdm9pZAptZXJnZWpvaW5zY2Fuc2VsKFBsYW5uZXJJbmZvICpyb290LCBOb2Rl ICpjbGF1c2UsCgkJCQkgT2lkIG9wZmFtaWx5LCBDb21wYXJlVHlwZSBjbXB0eXBlLCBib29s IG51bGxzX2ZpcnN0LAoJCQkJIFNlbGVjdGl2aXR5ICpsZWZ0c3RhcnQsIFNlbGVjdGl2aXR5 ICpsZWZ0ZW5kLAoJCQkJIFNlbGVjdGl2aXR5ICpyaWdodHN0YXJ0LCBTZWxlY3Rpdml0eSAq cmlnaHRlbmQpCnsKCU5vZGUJICAgKmxlZnQsCgkJCSAgICpyaWdodDsKCVZhcmlhYmxlU3Rh dERhdGEgbGVmdHZhciwKCQkJCXJpZ2h0dmFyOwoJT2lkCQkJb3BtZXRob2Q7CglpbnQJCQlv cF9zdHJhdGVneTsKCU9pZAkJCW9wX2xlZnR0eXBlOwoJT2lkCQkJb3BfcmlnaHR0eXBlOwoJ T2lkCQkJb3BubywKCQkJCWNvbGxhdGlvbiwKCQkJCWxzb3J0b3AsCgkJCQlyc29ydG9wLAoJ CQkJbHN0YXRvcCwKCQkJCXJzdGF0b3AsCgkJCQlsdG9wLAoJCQkJbGVvcCwKCQkJCXJldmx0 b3AsCgkJCQlyZXZsZW9wOwoJU3RyYXRlZ3lOdW1iZXIgbHRzdHJhdCwKCQkJCWxlc3RyYXQs CgkJCQlndHN0cmF0LAoJCQkJZ2VzdHJhdDsKCWJvb2wJCWlzZ3Q7CglEYXR1bQkJbGVmdG1p biwKCQkJCWxlZnRtYXgsCgkJCQlyaWdodG1pbiwKCQkJCXJpZ2h0bWF4OwoJZG91YmxlCQlz ZWxlYzsKCgkvKiBTZXQgZGVmYXVsdCByZXN1bHRzIGlmIHdlIGNhbid0IGZpZ3VyZSBhbnl0 aGluZyBvdXQuICovCgkvKiBYWFggc2hvdWxkIGRlZmF1bHQgInN0YXJ0IiBmcmFjdGlvbiBi ZSBhIGJpdCBtb3JlIHRoYW4gMD8gKi8KCSpsZWZ0c3RhcnQgPSAqcmlnaHRzdGFydCA9IDAu MDsKCSpsZWZ0ZW5kID0gKnJpZ2h0ZW5kID0gMS4wOwoKCS8qIERlY29uc3RydWN0IHRoZSBt ZXJnZSBjbGF1c2UgKi8KCWlmICghaXNfb3BjbGF1c2UoY2xhdXNlKSkKCQlyZXR1cm47CQkJ CQkvKiBzaG91bGRuJ3QgaGFwcGVuICovCglvcG5vID0gKChPcEV4cHIgKikgY2xhdXNlKS0+ b3BubzsKCWNvbGxhdGlvbiA9ICgoT3BFeHByICopIGNsYXVzZSktPmlucHV0Y29sbGlkOwoJ bGVmdCA9IGdldF9sZWZ0b3AoKEV4cHIgKikgY2xhdXNlKTsKCXJpZ2h0ID0gZ2V0X3JpZ2h0 b3AoKEV4cHIgKikgY2xhdXNlKTsKCWlmICghcmlnaHQpCgkJcmV0dXJuOwkJCQkJLyogc2hv dWxkbid0IGhhcHBlbiAqLwoKCS8qIExvb2sgZm9yIHN0YXRzIGZvciB0aGUgaW5wdXRzICov CglleGFtaW5lX3ZhcmlhYmxlKHJvb3QsIGxlZnQsIDAsICZsZWZ0dmFyKTsKCWV4YW1pbmVf dmFyaWFibGUocm9vdCwgcmlnaHQsIDAsICZyaWdodHZhcik7CgoJb3BtZXRob2QgPSBnZXRf b3BmYW1pbHlfbWV0aG9kKG9wZmFtaWx5KTsKCgkvKiBFeHRyYWN0IHRoZSBvcGVyYXRvcidz IGRlY2xhcmVkIGxlZnQvcmlnaHQgZGF0YXR5cGVzICovCglnZXRfb3Bfb3BmYW1pbHlfcHJv cGVydGllcyhvcG5vLCBvcGZhbWlseSwgZmFsc2UsCgkJCQkJCQkgICAmb3Bfc3RyYXRlZ3ks CgkJCQkJCQkgICAmb3BfbGVmdHR5cGUsCgkJCQkJCQkgICAmb3BfcmlnaHR0eXBlKTsKCUFz c2VydChJbmRleEFtVHJhbnNsYXRlU3RyYXRlZ3kob3Bfc3RyYXRlZ3ksIG9wbWV0aG9kLCBv cGZhbWlseSwgdHJ1ZSkgPT0gQ09NUEFSRV9FUSk7CgoJLyoKCSAqIExvb2sgdXAgdGhlIHZh cmlvdXMgb3BlcmF0b3JzIHdlIG5lZWQuICBJZiB3ZSBkb24ndCBmaW5kIHRoZW0gYWxsLCBp dAoJICogcHJvYmFibHkgbWVhbnMgdGhlIG9wZmFtaWx5IGlzIGJyb2tlbiwgYnV0IHdlIGp1 c3QgZmFpbCBzaWxlbnRseS4KCSAqCgkgKiBOb3RlOiB3ZSBleHBlY3QgdGhhdCBwZ19zdGF0 aXN0aWMgaGlzdG9ncmFtcyB3aWxsIGJlIHNvcnRlZCBieSB0aGUgJzwnCgkgKiBvcGVyYXRv ciwgcmVnYXJkbGVzcyBvZiB3aGljaCBzb3J0IGRpcmVjdGlvbiB3ZSBhcmUgY29uc2lkZXJp bmcuCgkgKi8KCXN3aXRjaCAoY21wdHlwZSkKCXsKCQljYXNlIENPTVBBUkVfTFQ6CgkJCWlz Z3QgPSBmYWxzZTsKCQkJbHRzdHJhdCA9IEluZGV4QW1UcmFuc2xhdGVDb21wYXJlVHlwZShD T01QQVJFX0xULCBvcG1ldGhvZCwgb3BmYW1pbHksIHRydWUpOwoJCQlsZXN0cmF0ID0gSW5k ZXhBbVRyYW5zbGF0ZUNvbXBhcmVUeXBlKENPTVBBUkVfTEUsIG9wbWV0aG9kLCBvcGZhbWls eSwgdHJ1ZSk7CgkJCWlmIChvcF9sZWZ0dHlwZSA9PSBvcF9yaWdodHR5cGUpCgkJCXsKCQkJ CS8qIGVhc3kgY2FzZSAqLwoJCQkJbHRvcCA9IGdldF9vcGZhbWlseV9tZW1iZXIob3BmYW1p bHksCgkJCQkJCQkJCQkgICBvcF9sZWZ0dHlwZSwgb3BfcmlnaHR0eXBlLAoJCQkJCQkJCQkJ ICAgbHRzdHJhdCk7CgkJCQlsZW9wID0gZ2V0X29wZmFtaWx5X21lbWJlcihvcGZhbWlseSwK CQkJCQkJCQkJCSAgIG9wX2xlZnR0eXBlLCBvcF9yaWdodHR5cGUsCgkJCQkJCQkJCQkgICBs ZXN0cmF0KTsKCQkJCWxzb3J0b3AgPSBsdG9wOwoJCQkJcnNvcnRvcCA9IGx0b3A7CgkJCQls c3RhdG9wID0gbHNvcnRvcDsKCQkJCXJzdGF0b3AgPSByc29ydG9wOwoJCQkJcmV2bHRvcCA9 IGx0b3A7CgkJCQlyZXZsZW9wID0gbGVvcDsKCQkJfQoJCQllbHNlCgkJCXsKCQkJCWx0b3Ag PSBnZXRfb3BmYW1pbHlfbWVtYmVyKG9wZmFtaWx5LAoJCQkJCQkJCQkJICAgb3BfbGVmdHR5 cGUsIG9wX3JpZ2h0dHlwZSwKCQkJCQkJCQkJCSAgIGx0c3RyYXQpOwoJCQkJbGVvcCA9IGdl dF9vcGZhbWlseV9tZW1iZXIob3BmYW1pbHksCgkJCQkJCQkJCQkgICBvcF9sZWZ0dHlwZSwg b3BfcmlnaHR0eXBlLAoJCQkJCQkJCQkJICAgbGVzdHJhdCk7CgkJCQlsc29ydG9wID0gZ2V0 X29wZmFtaWx5X21lbWJlcihvcGZhbWlseSwKCQkJCQkJCQkJCQkgIG9wX2xlZnR0eXBlLCBv cF9sZWZ0dHlwZSwKCQkJCQkJCQkJCQkgIGx0c3RyYXQpOwoJCQkJcnNvcnRvcCA9IGdldF9v cGZhbWlseV9tZW1iZXIob3BmYW1pbHksCgkJCQkJCQkJCQkJICBvcF9yaWdodHR5cGUsIG9w X3JpZ2h0dHlwZSwKCQkJCQkJCQkJCQkgIGx0c3RyYXQpOwoJCQkJbHN0YXRvcCA9IGxzb3J0 b3A7CgkJCQlyc3RhdG9wID0gcnNvcnRvcDsKCQkJCXJldmx0b3AgPSBnZXRfb3BmYW1pbHlf bWVtYmVyKG9wZmFtaWx5LAoJCQkJCQkJCQkJCSAgb3BfcmlnaHR0eXBlLCBvcF9sZWZ0dHlw ZSwKCQkJCQkJCQkJCQkgIGx0c3RyYXQpOwoJCQkJcmV2bGVvcCA9IGdldF9vcGZhbWlseV9t ZW1iZXIob3BmYW1pbHksCgkJCQkJCQkJCQkJICBvcF9yaWdodHR5cGUsIG9wX2xlZnR0eXBl LAoJCQkJCQkJCQkJCSAgbGVzdHJhdCk7CgkJCX0KCQkJYnJlYWs7CgkJY2FzZSBDT01QQVJF X0dUOgoJCQkvKiBkZXNjZW5kaW5nLW9yZGVyIGNhc2UgKi8KCQkJaXNndCA9IHRydWU7CgkJ CWx0c3RyYXQgPSBJbmRleEFtVHJhbnNsYXRlQ29tcGFyZVR5cGUoQ09NUEFSRV9MVCwgb3Bt ZXRob2QsIG9wZmFtaWx5LCB0cnVlKTsKCQkJZ3RzdHJhdCA9IEluZGV4QW1UcmFuc2xhdGVD b21wYXJlVHlwZShDT01QQVJFX0dULCBvcG1ldGhvZCwgb3BmYW1pbHksIHRydWUpOwoJCQln ZXN0cmF0ID0gSW5kZXhBbVRyYW5zbGF0ZUNvbXBhcmVUeXBlKENPTVBBUkVfR0UsIG9wbWV0 aG9kLCBvcGZhbWlseSwgdHJ1ZSk7CgkJCWlmIChvcF9sZWZ0dHlwZSA9PSBvcF9yaWdodHR5 cGUpCgkJCXsKCQkJCS8qIGVhc3kgY2FzZSAqLwoJCQkJbHRvcCA9IGdldF9vcGZhbWlseV9t ZW1iZXIob3BmYW1pbHksCgkJCQkJCQkJCQkgICBvcF9sZWZ0dHlwZSwgb3BfcmlnaHR0eXBl LAoJCQkJCQkJCQkJICAgZ3RzdHJhdCk7CgkJCQlsZW9wID0gZ2V0X29wZmFtaWx5X21lbWJl cihvcGZhbWlseSwKCQkJCQkJCQkJCSAgIG9wX2xlZnR0eXBlLCBvcF9yaWdodHR5cGUsCgkJ CQkJCQkJCQkgICBnZXN0cmF0KTsKCQkJCWxzb3J0b3AgPSBsdG9wOwoJCQkJcnNvcnRvcCA9 IGx0b3A7CgkJCQlsc3RhdG9wID0gZ2V0X29wZmFtaWx5X21lbWJlcihvcGZhbWlseSwKCQkJ CQkJCQkJCQkgIG9wX2xlZnR0eXBlLCBvcF9sZWZ0dHlwZSwKCQkJCQkJCQkJCQkgIGx0c3Ry YXQpOwoJCQkJcnN0YXRvcCA9IGxzdGF0b3A7CgkJCQlyZXZsdG9wID0gbHRvcDsKCQkJCXJl dmxlb3AgPSBsZW9wOwoJCQl9CgkJCWVsc2UKCQkJewoJCQkJbHRvcCA9IGdldF9vcGZhbWls eV9tZW1iZXIob3BmYW1pbHksCgkJCQkJCQkJCQkgICBvcF9sZWZ0dHlwZSwgb3BfcmlnaHR0 eXBlLAoJCQkJCQkJCQkJICAgZ3RzdHJhdCk7CgkJCQlsZW9wID0gZ2V0X29wZmFtaWx5X21l bWJlcihvcGZhbWlseSwKCQkJCQkJCQkJCSAgIG9wX2xlZnR0eXBlLCBvcF9yaWdodHR5cGUs CgkJCQkJCQkJCQkgICBnZXN0cmF0KTsKCQkJCWxzb3J0b3AgPSBnZXRfb3BmYW1pbHlfbWVt YmVyKG9wZmFtaWx5LAoJCQkJCQkJCQkJCSAgb3BfbGVmdHR5cGUsIG9wX2xlZnR0eXBlLAoJ CQkJCQkJCQkJCSAgZ3RzdHJhdCk7CgkJCQlyc29ydG9wID0gZ2V0X29wZmFtaWx5X21lbWJl cihvcGZhbWlseSwKCQkJCQkJCQkJCQkgIG9wX3JpZ2h0dHlwZSwgb3BfcmlnaHR0eXBlLAoJ CQkJCQkJCQkJCSAgZ3RzdHJhdCk7CgkJCQlsc3RhdG9wID0gZ2V0X29wZmFtaWx5X21lbWJl cihvcGZhbWlseSwKCQkJCQkJCQkJCQkgIG9wX2xlZnR0eXBlLCBvcF9sZWZ0dHlwZSwKCQkJ CQkJCQkJCQkgIGx0c3RyYXQpOwoJCQkJcnN0YXRvcCA9IGdldF9vcGZhbWlseV9tZW1iZXIo b3BmYW1pbHksCgkJCQkJCQkJCQkJICBvcF9yaWdodHR5cGUsIG9wX3JpZ2h0dHlwZSwKCQkJ CQkJCQkJCQkgIGx0c3RyYXQpOwoJCQkJcmV2bHRvcCA9IGdldF9vcGZhbWlseV9tZW1iZXIo b3BmYW1pbHksCgkJCQkJCQkJCQkJICBvcF9yaWdodHR5cGUsIG9wX2xlZnR0eXBlLAoJCQkJ CQkJCQkJCSAgZ3RzdHJhdCk7CgkJCQlyZXZsZW9wID0gZ2V0X29wZmFtaWx5X21lbWJlcihv cGZhbWlseSwKCQkJCQkJCQkJCQkgIG9wX3JpZ2h0dHlwZSwgb3BfbGVmdHR5cGUsCgkJCQkJ CQkJCQkJICBnZXN0cmF0KTsKCQkJfQoJCQlicmVhazsKCQlkZWZhdWx0OgoJCQlnb3RvIGZh aWw7CQkJLyogc2hvdWxkbid0IGdldCBoZXJlICovCgl9CgoJaWYgKCFPaWRJc1ZhbGlkKGxz b3J0b3ApIHx8CgkJIU9pZElzVmFsaWQocnNvcnRvcCkgfHwKCQkhT2lkSXNWYWxpZChsc3Rh dG9wKSB8fAoJCSFPaWRJc1ZhbGlkKHJzdGF0b3ApIHx8CgkJIU9pZElzVmFsaWQobHRvcCkg fHwKCQkhT2lkSXNWYWxpZChsZW9wKSB8fAoJCSFPaWRJc1ZhbGlkKHJldmx0b3ApIHx8CgkJ IU9pZElzVmFsaWQocmV2bGVvcCkpCgkJZ290byBmYWlsOwkJCQkvKiBpbnN1ZmZpY2llbnQg aW5mbyBpbiBjYXRhbG9ncyAqLwoKCS8qIFRyeSB0byBnZXQgcmFuZ2VzIG9mIGJvdGggaW5w dXRzICovCglpZiAoIWlzZ3QpCgl7CgkJaWYgKCFnZXRfdmFyaWFibGVfcmFuZ2Uocm9vdCwg JmxlZnR2YXIsIGxzdGF0b3AsIGNvbGxhdGlvbiwKCQkJCQkJCQkmbGVmdG1pbiwgJmxlZnRt YXgpKQoJCQlnb3RvIGZhaWw7CQkJLyogbm8gcmFuZ2UgYXZhaWxhYmxlIGZyb20gc3RhdHMg Ki8KCQlpZiAoIWdldF92YXJpYWJsZV9yYW5nZShyb290LCAmcmlnaHR2YXIsIHJzdGF0b3As IGNvbGxhdGlvbiwKCQkJCQkJCQkmcmlnaHRtaW4sICZyaWdodG1heCkpCgkJCWdvdG8gZmFp bDsJCQkvKiBubyByYW5nZSBhdmFpbGFibGUgZnJvbSBzdGF0cyAqLwoJfQoJZWxzZQoJewoJ CS8qIG5lZWQgdG8gc3dhcCB0aGUgbWF4IGFuZCBtaW4gKi8KCQlpZiAoIWdldF92YXJpYWJs ZV9yYW5nZShyb290LCAmbGVmdHZhciwgbHN0YXRvcCwgY29sbGF0aW9uLAoJCQkJCQkJCSZs ZWZ0bWF4LCAmbGVmdG1pbikpCgkJCWdvdG8gZmFpbDsJCQkvKiBubyByYW5nZSBhdmFpbGFi bGUgZnJvbSBzdGF0cyAqLwoJCWlmICghZ2V0X3ZhcmlhYmxlX3JhbmdlKHJvb3QsICZyaWdo dHZhciwgcnN0YXRvcCwgY29sbGF0aW9uLAoJCQkJCQkJCSZyaWdodG1heCwgJnJpZ2h0bWlu KSkKCQkJZ290byBmYWlsOwkJCS8qIG5vIHJhbmdlIGF2YWlsYWJsZSBmcm9tIHN0YXRzICov Cgl9CgoJLyoKCSAqIE5vdywgdGhlIGZyYWN0aW9uIG9mIHRoZSBsZWZ0IHZhcmlhYmxlIHRo YXQgd2lsbCBiZSBzY2FubmVkIGlzIHRoZQoJICogZnJhY3Rpb24gdGhhdCdzIDw9IHRoZSBy aWdodC1zaWRlIG1heGltdW0gdmFsdWUuICBCdXQgb25seSBiZWxpZXZlCgkgKiBub24tZGVm YXVsdCBlc3RpbWF0ZXMsIGVsc2Ugc3RpY2sgd2l0aCBvdXIgMS4wLgoJICovCglzZWxlYyA9 IHNjYWxhcmluZXFzZWwocm9vdCwgbGVvcCwgaXNndCwgdHJ1ZSwgY29sbGF0aW9uLCAmbGVm dHZhciwKCQkJCQkJICByaWdodG1heCwgb3BfcmlnaHR0eXBlKTsKCWlmIChzZWxlYyAhPSBE RUZBVUxUX0lORVFfU0VMKQoJCSpsZWZ0ZW5kID0gc2VsZWM7CgoJLyogQW5kIHNpbWlsYXJs eSBmb3IgdGhlIHJpZ2h0IHZhcmlhYmxlLiAqLwoJc2VsZWMgPSBzY2FsYXJpbmVxc2VsKHJv b3QsIHJldmxlb3AsIGlzZ3QsIHRydWUsIGNvbGxhdGlvbiwgJnJpZ2h0dmFyLAoJCQkJCQkg IGxlZnRtYXgsIG9wX2xlZnR0eXBlKTsKCWlmIChzZWxlYyAhPSBERUZBVUxUX0lORVFfU0VM KQoJCSpyaWdodGVuZCA9IHNlbGVjOwoKCS8qCgkgKiBPbmx5IG9uZSBvZiB0aGUgdHdvICJl bmQiIGZyYWN0aW9ucyBjYW4gcmVhbGx5IGJlIGxlc3MgdGhhbiAxLjA7CgkgKiBiZWxpZXZl IHRoZSBzbWFsbGVyIGVzdGltYXRlIGFuZCByZXNldCB0aGUgb3RoZXIgb25lIHRvIGV4YWN0 bHkgMS4wLiBJZgoJICogd2UgZ2V0IGV4YWN0bHkgZXF1YWwgZXN0aW1hdGVzIChhcyBjYW4g ZWFzaWx5IGhhcHBlbiB3aXRoIHNlbGYtam9pbnMpLAoJICogYmVsaWV2ZSBuZWl0aGVyLgoJ ICovCglpZiAoKmxlZnRlbmQgPiAqcmlnaHRlbmQpCgkJKmxlZnRlbmQgPSAxLjA7CgllbHNl IGlmICgqbGVmdGVuZCA8ICpyaWdodGVuZCkKCQkqcmlnaHRlbmQgPSAxLjA7CgllbHNlCgkJ KmxlZnRlbmQgPSAqcmlnaHRlbmQgPSAxLjA7CgoJLyoKCSAqIEFsc28sIHRoZSBmcmFjdGlv biBvZiB0aGUgbGVmdCB2YXJpYWJsZSB0aGF0IHdpbGwgYmUgc2Nhbm5lZCBiZWZvcmUgdGhl CgkgKiBmaXJzdCBqb2luIHBhaXIgaXMgZm91bmQgaXMgdGhlIGZyYWN0aW9uIHRoYXQncyA8 IHRoZSByaWdodC1zaWRlCgkgKiBtaW5pbXVtIHZhbHVlLiAgQnV0IG9ubHkgYmVsaWV2ZSBu b24tZGVmYXVsdCBlc3RpbWF0ZXMsIGVsc2Ugc3RpY2sgd2l0aAoJICogb3VyIG93biBkZWZh dWx0LgoJICovCglzZWxlYyA9IHNjYWxhcmluZXFzZWwocm9vdCwgbHRvcCwgaXNndCwgZmFs c2UsIGNvbGxhdGlvbiwgJmxlZnR2YXIsCgkJCQkJCSAgcmlnaHRtaW4sIG9wX3JpZ2h0dHlw ZSk7CglpZiAoc2VsZWMgIT0gREVGQVVMVF9JTkVRX1NFTCkKCQkqbGVmdHN0YXJ0ID0gc2Vs ZWM7CgoJLyogQW5kIHNpbWlsYXJseSBmb3IgdGhlIHJpZ2h0IHZhcmlhYmxlLiAqLwoJc2Vs ZWMgPSBzY2FsYXJpbmVxc2VsKHJvb3QsIHJldmx0b3AsIGlzZ3QsIGZhbHNlLCBjb2xsYXRp b24sICZyaWdodHZhciwKCQkJCQkJICBsZWZ0bWluLCBvcF9sZWZ0dHlwZSk7CglpZiAoc2Vs ZWMgIT0gREVGQVVMVF9JTkVRX1NFTCkKCQkqcmlnaHRzdGFydCA9IHNlbGVjOwoKCS8qCgkg KiBPbmx5IG9uZSBvZiB0aGUgdHdvICJzdGFydCIgZnJhY3Rpb25zIGNhbiByZWFsbHkgYmUg bW9yZSB0aGFuIHplcm87CgkgKiBiZWxpZXZlIHRoZSBsYXJnZXIgZXN0aW1hdGUgYW5kIHJl c2V0IHRoZSBvdGhlciBvbmUgdG8gZXhhY3RseSAwLjAuIElmCgkgKiB3ZSBnZXQgZXhhY3Rs eSBlcXVhbCBlc3RpbWF0ZXMgKGFzIGNhbiBlYXNpbHkgaGFwcGVuIHdpdGggc2VsZi1qb2lu cyksCgkgKiBiZWxpZXZlIG5laXRoZXIuCgkgKi8KCWlmICgqbGVmdHN0YXJ0IDwgKnJpZ2h0 c3RhcnQpCgkJKmxlZnRzdGFydCA9IDAuMDsKCWVsc2UgaWYgKCpsZWZ0c3RhcnQgPiAqcmln aHRzdGFydCkKCQkqcmlnaHRzdGFydCA9IDAuMDsKCWVsc2UKCQkqbGVmdHN0YXJ0ID0gKnJp Z2h0c3RhcnQgPSAwLjA7CgoJLyoKCSAqIElmIHRoZSBzb3J0IG9yZGVyIGlzIG51bGxzLWZp cnN0LCB3ZSdyZSBnb2luZyB0byBoYXZlIHRvIHNraXAgb3ZlciBhbnkKCSAqIG51bGxzIHRv by4gIFRoZXNlIHdvdWxkIG5vdCBoYXZlIGJlZW4gY291bnRlZCBieSBzY2FsYXJpbmVxc2Vs LCBhbmQgd2UKCSAqIGNhbiBzYWZlbHkgYWRkIGluIHRoaXMgZnJhY3Rpb24gcmVnYXJkbGVz cyBvZiB3aGV0aGVyIHdlIGJlbGlldmUKCSAqIHNjYWxhcmluZXFzZWwncyByZXN1bHRzIG9y IG5vdC4gIEJ1dCBiZSBzdXJlIHRvIGNsYW1wIHRoZSBzdW0gdG8gMS4wIQoJICovCglpZiAo bnVsbHNfZmlyc3QpCgl7CgkJRm9ybV9wZ19zdGF0aXN0aWMgc3RhdHM7CgoJCWlmIChIZWFw VHVwbGVJc1ZhbGlkKGxlZnR2YXIuc3RhdHNUdXBsZSkpCgkJewoJCQlzdGF0cyA9IChGb3Jt X3BnX3N0YXRpc3RpYykgR0VUU1RSVUNUKGxlZnR2YXIuc3RhdHNUdXBsZSk7CgkJCSpsZWZ0 c3RhcnQgKz0gc3RhdHMtPnN0YW51bGxmcmFjOwoJCQlDTEFNUF9QUk9CQUJJTElUWSgqbGVm dHN0YXJ0KTsKCQkJKmxlZnRlbmQgKz0gc3RhdHMtPnN0YW51bGxmcmFjOwoJCQlDTEFNUF9Q Uk9CQUJJTElUWSgqbGVmdGVuZCk7CgkJfQoJCWlmIChIZWFwVHVwbGVJc1ZhbGlkKHJpZ2h0 dmFyLnN0YXRzVHVwbGUpKQoJCXsKCQkJc3RhdHMgPSAoRm9ybV9wZ19zdGF0aXN0aWMpIEdF VFNUUlVDVChyaWdodHZhci5zdGF0c1R1cGxlKTsKCQkJKnJpZ2h0c3RhcnQgKz0gc3RhdHMt PnN0YW51bGxmcmFjOwoJCQlDTEFNUF9QUk9CQUJJTElUWSgqcmlnaHRzdGFydCk7CgkJCSpy aWdodGVuZCArPSBzdGF0cy0+c3RhbnVsbGZyYWM7CgkJCUNMQU1QX1BST0JBQklMSVRZKCpy aWdodGVuZCk7CgkJfQoJfQoKCS8qIERpc2JlbGlldmUgc3RhcnQgPj0gZW5kLCBqdXN0IGlu IGNhc2UgdGhhdCBjYW4gaGFwcGVuICovCglpZiAoKmxlZnRzdGFydCA+PSAqbGVmdGVuZCkK CXsKCQkqbGVmdHN0YXJ0ID0gMC4wOwoJCSpsZWZ0ZW5kID0gMS4wOwoJfQoJaWYgKCpyaWdo dHN0YXJ0ID49ICpyaWdodGVuZCkKCXsKCQkqcmlnaHRzdGFydCA9IDAuMDsKCQkqcmlnaHRl bmQgPSAxLjA7Cgl9CgpmYWlsOgoJUmVsZWFzZVZhcmlhYmxlU3RhdHMobGVmdHZhcik7CglS ZWxlYXNlVmFyaWFibGVTdGF0cyhyaWdodHZhcik7Cn0KCgovKgogKgltYXRjaGluZ3NlbCAt LSBnZW5lcmljIG1hdGNoaW5nLW9wZXJhdG9yIHNlbGVjdGl2aXR5IHN1cHBvcnQKICoKICog VXNlIHRoZXNlIGZvciBhbnkgb3BlcmF0b3JzIHRoYXQgKGEpIGFyZSBvbiBkYXRhIHR5cGVz IGZvciB3aGljaCB3ZSBjb2xsZWN0CiAqIHN0YW5kYXJkIHN0YXRpc3RpY3MsIGFuZCAoYikg aGF2ZSBiZWhhdmlvciBmb3Igd2hpY2ggdGhlIGRlZmF1bHQgZXN0aW1hdGUKICogKHR3aWNl IERFRkFVTFRfRVFfU0VMKSBpcyBzYW5lLiAgVHlwaWNhbGx5IHRoYXQgaXMgZ29vZCBmb3Ig bWF0Y2gtbGlrZQogKiBvcGVyYXRvcnMuCiAqLwoKRGF0dW0KbWF0Y2hpbmdzZWwoUEdfRlVO Q1RJT05fQVJHUykKewoJUGxhbm5lckluZm8gKnJvb3QgPSAoUGxhbm5lckluZm8gKikgUEdf R0VUQVJHX1BPSU5URVIoMCk7CglPaWQJCQlvcGVyYXRvciA9IFBHX0dFVEFSR19PSUQoMSk7 CglMaXN0CSAgICphcmdzID0gKExpc3QgKikgUEdfR0VUQVJHX1BPSU5URVIoMik7CglpbnQJ CQl2YXJSZWxpZCA9IFBHX0dFVEFSR19JTlQzMigzKTsKCU9pZAkJCWNvbGxhdGlvbiA9IFBH X0dFVF9DT0xMQVRJT04oKTsKCWRvdWJsZQkJc2VsZWM7CgoJLyogVXNlIGdlbmVyaWMgcmVz dHJpY3Rpb24gc2VsZWN0aXZpdHkgbG9naWMuICovCglzZWxlYyA9IGdlbmVyaWNfcmVzdHJp Y3Rpb25fc2VsZWN0aXZpdHkocm9vdCwgb3BlcmF0b3IsIGNvbGxhdGlvbiwKCQkJCQkJCQkJ CQlhcmdzLCB2YXJSZWxpZCwKCQkJCQkJCQkJCQlERUZBVUxUX01BVENISU5HX1NFTCk7CgoJ UEdfUkVUVVJOX0ZMT0FUOCgoZmxvYXQ4KSBzZWxlYyk7Cn0KCkRhdHVtCm1hdGNoaW5nam9p bnNlbChQR19GVU5DVElPTl9BUkdTKQp7CgkvKiBKdXN0IHB1bnQsIGZvciB0aGUgbW9tZW50 LiAqLwoJUEdfUkVUVVJOX0ZMT0FUOChERUZBVUxUX01BVENISU5HX1NFTCk7Cn0KCgovKgog KiBIZWxwZXIgcm91dGluZSBmb3IgZXN0aW1hdGVfbnVtX2dyb3VwczogYWRkIGFuIGl0ZW0g dG8gYSBsaXN0IG9mCiAqIEdyb3VwVmFySW5mb3MsIGJ1dCBvbmx5IGlmIGl0J3Mgbm90IGtu b3duIGVxdWFsIHRvIGFueSBvZiB0aGUgZXhpc3RpbmcKICogZW50cmllcy4KICovCnR5cGVk ZWYgc3RydWN0CnsKCU5vZGUJICAgKnZhcjsJCQkvKiBtaWdodCBiZSBhbiBleHByZXNzaW9u LCBub3QganVzdCBhIFZhciAqLwoJUmVsT3B0SW5mbyAqcmVsOwkJCS8qIHJlbGF0aW9uIGl0 IGJlbG9uZ3MgdG8gKi8KCWRvdWJsZQkJbmRpc3RpbmN0OwkJLyogIyBkaXN0aW5jdCB2YWx1 ZXMgKi8KCWJvb2wJCWlzZGVmYXVsdDsJCS8qIHRydWUgaWYgREVGQVVMVF9OVU1fRElTVElO Q1Qgd2FzIHVzZWQgKi8KfSBHcm91cFZhckluZm87CgpzdGF0aWMgTGlzdCAqCmFkZF91bmlx dWVfZ3JvdXBfdmFyKFBsYW5uZXJJbmZvICpyb290LCBMaXN0ICp2YXJpbmZvcywKCQkJCQkg Tm9kZSAqdmFyLCBWYXJpYWJsZVN0YXREYXRhICp2YXJkYXRhKQp7CglHcm91cFZhckluZm8g KnZhcmluZm87Cglkb3VibGUJCW5kaXN0aW5jdDsKCWJvb2wJCWlzZGVmYXVsdDsKCUxpc3RD ZWxsICAgKmxjOwoKCW5kaXN0aW5jdCA9IGdldF92YXJpYWJsZV9udW1kaXN0aW5jdCh2YXJk YXRhLCAmaXNkZWZhdWx0KTsKCgkvKgoJICogVGhlIG51bGxpbmdyZWxzIGJpdHMgd2l0aGlu IHRoZSB2YXIgY291bGQgY2F1c2UgdGhlIHNhbWUgdmFyIHRvIGJlCgkgKiBjb3VudGVkIG11 bHRpcGxlIHRpbWVzIGlmIGl0J3MgbWFya2VkIHdpdGggZGlmZmVyZW50IG51bGxpbmdyZWxz LiAgVGhleQoJICogY291bGQgYWxzbyBwcmV2ZW50IHVzIGZyb20gbWF0Y2hpbmcgdGhlIHZh ciB0byB0aGUgZXhwcmVzc2lvbnMgaW4KCSAqIGV4dGVuZGVkIHN0YXRpc3RpY3MgKHNlZSBl c3RpbWF0ZV9tdWx0aXZhcmlhdGVfbmRpc3RpbmN0KS4gIFNvIHN0cmlwCgkgKiB0aGVtIG91 dCBmaXJzdC4KCSAqLwoJdmFyID0gcmVtb3ZlX251bGxpbmdfcmVsaWRzKHZhciwgcm9vdC0+ b3V0ZXJfam9pbl9yZWxzLCBOVUxMKTsKCglmb3JlYWNoKGxjLCB2YXJpbmZvcykKCXsKCQl2 YXJpbmZvID0gKEdyb3VwVmFySW5mbyAqKSBsZmlyc3QobGMpOwoKCQkvKiBEcm9wIGV4YWN0 IGR1cGxpY2F0ZXMgKi8KCQlpZiAoZXF1YWwodmFyLCB2YXJpbmZvLT52YXIpKQoJCQlyZXR1 cm4gdmFyaW5mb3M7CgoJCS8qCgkJICogRHJvcCBrbm93bi1lcXVhbCB2YXJzLCBidXQgb25s eSBpZiB0aGV5IGJlbG9uZyB0byBkaWZmZXJlbnQKCQkgKiByZWxhdGlvbnMgKHNlZSBjb21t ZW50cyBmb3IgZXN0aW1hdGVfbnVtX2dyb3VwcykuICBXZSBhcmVuJ3QgdG9vCgkJICogZnVz c3kgYWJvdXQgdGhlIHNlbWFudGljcyBvZiAiZXF1YWwiIGhlcmUuCgkJICovCgkJaWYgKHZh cmRhdGEtPnJlbCAhPSB2YXJpbmZvLT5yZWwgJiYKCQkJZXhwcnNfa25vd25fZXF1YWwocm9v dCwgdmFyLCB2YXJpbmZvLT52YXIsIEludmFsaWRPaWQpKQoJCXsKCQkJaWYgKHZhcmluZm8t Pm5kaXN0aW5jdCA8PSBuZGlzdGluY3QpCgkJCXsKCQkJCS8qIEtlZXAgb2xkZXIgaXRlbSwg Zm9yZ2V0IG5ldyBvbmUgKi8KCQkJCXJldHVybiB2YXJpbmZvczsKCQkJfQoJCQllbHNlCgkJ CXsKCQkJCS8qIERlbGV0ZSB0aGUgb2xkZXIgaXRlbSAqLwoJCQkJdmFyaW5mb3MgPSBmb3Jl YWNoX2RlbGV0ZV9jdXJyZW50KHZhcmluZm9zLCBsYyk7CgkJCX0KCQl9Cgl9CgoJdmFyaW5m byA9IHBhbGxvY19vYmplY3QoR3JvdXBWYXJJbmZvKTsKCgl2YXJpbmZvLT52YXIgPSB2YXI7 Cgl2YXJpbmZvLT5yZWwgPSB2YXJkYXRhLT5yZWw7Cgl2YXJpbmZvLT5uZGlzdGluY3QgPSBu ZGlzdGluY3Q7Cgl2YXJpbmZvLT5pc2RlZmF1bHQgPSBpc2RlZmF1bHQ7Cgl2YXJpbmZvcyA9 IGxhcHBlbmQodmFyaW5mb3MsIHZhcmluZm8pOwoJcmV0dXJuIHZhcmluZm9zOwp9CgovKgog KiBlc3RpbWF0ZV9udW1fZ3JvdXBzCQktIEVzdGltYXRlIG51bWJlciBvZiBncm91cHMgaW4g YSBncm91cGVkIHF1ZXJ5CiAqCiAqIEdpdmVuIGEgcXVlcnkgaGF2aW5nIGEgR1JPVVAgQlkg Y2xhdXNlLCBlc3RpbWF0ZSBob3cgbWFueSBncm91cHMgdGhlcmUKICogd2lsbCBiZSAtLS0g aWUsIHRoZSBudW1iZXIgb2YgZGlzdGluY3QgY29tYmluYXRpb25zIG9mIHRoZSBHUk9VUCBC WQogKiBleHByZXNzaW9ucy4KICoKICogVGhpcyByb3V0aW5lIGlzIGFsc28gdXNlZCB0byBl c3RpbWF0ZSB0aGUgbnVtYmVyIG9mIHJvd3MgZW1pdHRlZCBieQogKiBhIERJU1RJTkNUIGZp bHRlcmluZyBzdGVwOyB0aGF0IGlzIGFuIGlzb21vcnBoaWMgcHJvYmxlbS4gIChOb3RlOgog KiBhY3R1YWxseSwgd2Ugb25seSB1c2UgaXQgZm9yIERJU1RJTkNUIHdoZW4gdGhlcmUncyBu byBncm91cGluZyBvcgogKiBhZ2dyZWdhdGlvbiBhaGVhZCBvZiB0aGUgRElTVElOQ1QuKQog KgogKiBJbnB1dHM6CiAqCXJvb3QgLSB0aGUgcXVlcnkKICoJZ3JvdXBFeHBycyAtIGxpc3Qg b2YgZXhwcmVzc2lvbnMgYmVpbmcgZ3JvdXBlZCBieQogKglpbnB1dF9yb3dzIC0gbnVtYmVy IG9mIHJvd3MgZXN0aW1hdGVkIHRvIGFycml2ZSBhdCB0aGUgZ3JvdXAvdW5pcXVlCiAqCQlm aWx0ZXIgc3RlcAogKglwZ3NldCAtIE5VTEwsIG9yIGEgTGlzdCoqIHBvaW50aW5nIHRvIGEg Z3JvdXBpbmcgc2V0IHRvIGZpbHRlciB0aGUKICoJCWdyb3VwRXhwcnMgYWdhaW5zdAogKgog KiBPdXRwdXRzOgogKgllc3RpbmZvIC0gV2hlbiBwYXNzZWQgYXMgbm9uLU5VTEwsIHRoZSBm dW5jdGlvbiB3aWxsIHNldCBiaXRzIGluIHRoZQogKgkJImZsYWdzIiBmaWVsZCBpbiBvcmRl ciB0byBwcm92aWRlIGNhbGxlcnMgd2l0aCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCiAqCQlh Ym91dCB0aGUgZXN0aW1hdGlvbi4gIEN1cnJlbnRseSwgd2Ugb25seSBzZXQgdGhlIFNFTEZM QUdfVVNFRF9ERUZBVUxUCiAqCQliaXQgaWYgd2UgdXNlZCBhbnkgZGVmYXVsdCB2YWx1ZXMg aW4gdGhlIGVzdGltYXRpb24uCiAqCiAqIEdpdmVuIHRoZSBsYWNrIG9mIGFueSBjcm9zcy1j b3JyZWxhdGlvbiBzdGF0aXN0aWNzIGluIHRoZSBzeXN0ZW0sIGl0J3MKICogaW1wb3NzaWJs ZSB0byBkbyBhbnl0aGluZyByZWFsbHkgdHJ1c3R3b3J0aHkgd2l0aCBHUk9VUCBCWSBjb25k aXRpb25zCiAqIGludm9sdmluZyBtdWx0aXBsZSBWYXJzLiAgV2Ugc2hvdWxkIGhvd2V2ZXIg YXZvaWQgYXNzdW1pbmcgdGhlIHdvcnN0CiAqIGNhc2UgKGFsbCBwb3NzaWJsZSBjcm9zcy1w cm9kdWN0IHRlcm1zIGFjdHVhbGx5IGFwcGVhciBhcyBncm91cHMpIHNpbmNlCiAqIHZlcnkg b2Z0ZW4gdGhlIGdyb3VwZWQtYnkgVmFycyBhcmUgaGlnaGx5IGNvcnJlbGF0ZWQuICBPdXIg Y3VycmVudCBhcHByb2FjaAogKiBpcyBhcyBmb2xsb3dzOgogKgkxLiAgRXhwcmVzc2lvbnMg eWllbGRpbmcgYm9vbGVhbiBhcmUgYXNzdW1lZCB0byBjb250cmlidXRlIHR3byBncm91cHMs CiAqCQlpbmRlcGVuZGVudGx5IG9mIHRoZWlyIGNvbnRlbnQsIGFuZCBhcmUgaWdub3JlZCBp biB0aGUgc3Vic2VxdWVudAogKgkJc3RlcHMuICBUaGlzIGlzIG1haW5seSBiZWNhdXNlIHRl c3RzIGxpa2UgImNvbCBJUyBOVUxMIiBicmVhayB0aGUKICoJCWhldXJpc3RpYyB1c2VkIGlu IHN0ZXAgMiBlc3BlY2lhbGx5IGJhZGx5LgogKgkyLiAgUmVkdWNlIHRoZSBnaXZlbiBleHBy ZXNzaW9ucyB0byBhIGxpc3Qgb2YgdW5pcXVlIFZhcnMgdXNlZC4gIEZvcgogKgkJZXhhbXBs ZSwgR1JPVVAgQlkgYSwgYSArIGIgaXMgdHJlYXRlZCB0aGUgc2FtZSBhcyBHUk9VUCBCWSBh LCBiLgogKgkJSXQgaXMgY2xlYXJseSBjb3JyZWN0IG5vdCB0byBjb3VudCB0aGUgc2FtZSBW YXIgbW9yZSB0aGFuIG9uY2UuCiAqCQlJdCBpcyBhbHNvIHJlYXNvbmFibGUgdG8gdHJlYXQg Zih4KSB0aGUgc2FtZSBhcyB4OiBmKCkgY2Fubm90CiAqCQlpbmNyZWFzZSB0aGUgbnVtYmVy IG9mIGRpc3RpbmN0IHZhbHVlcyAodW5sZXNzIGl0IGlzIHZvbGF0aWxlLAogKgkJd2hpY2gg d2UgY29uc2lkZXIgdW5saWtlbHkgZm9yIGdyb3VwaW5nKSwgYnV0IGl0IHByb2JhYmx5IHdv bid0CiAqCQlyZWR1Y2UgdGhlIG51bWJlciBvZiBkaXN0aW5jdCB2YWx1ZXMgbXVjaCBlaXRo ZXIuCiAqCQlBcyBhIHNwZWNpYWwgY2FzZSwgaWYgYSBHUk9VUCBCWSBleHByZXNzaW9uIGNh biBiZSBtYXRjaGVkIHRvIGFuCiAqCQlleHByZXNzaW9uYWwgaW5kZXggZm9yIHdoaWNoIHdl IGhhdmUgc3RhdGlzdGljcywgdGhlbiB3ZSB0cmVhdCB0aGUKICoJCXdob2xlIGV4cHJlc3Np b24gYXMgdGhvdWdoIGl0IHdlcmUganVzdCBhIFZhci4KICoJMy4gIElmIHRoZSBsaXN0IGNv bnRhaW5zIFZhcnMgb2YgZGlmZmVyZW50IHJlbGF0aW9ucyB0aGF0IGFyZSBrbm93biBlcXVh bAogKgkJZHVlIHRvIGVxdWl2YWxlbmNlIGNsYXNzZXMsIHRoZW4gZHJvcCBhbGwgYnV0IG9u ZSBvZiB0aGUgVmFycyBmcm9tIGVhY2gKICoJCWtub3duLWVxdWFsIHNldCwga2VlcGluZyB0 aGUgb25lIHdpdGggc21hbGxlc3QgZXN0aW1hdGVkICMgb2YgdmFsdWVzCiAqCQkoc2luY2Ug dGhlIGV4dHJhIHZhbHVlcyBvZiB0aGUgb3RoZXJzIGNhbid0IGFwcGVhciBpbiBqb2luZWQg cm93cykuCiAqCQlOb3RlIHRoZSByZWFzb24gd2Ugb25seSBjb25zaWRlciBWYXJzIG9mIGRp ZmZlcmVudCByZWxhdGlvbnMgaXMgdGhhdAogKgkJaWYgd2UgY29uc2lkZXJlZCBvbmVzIG9m IHRoZSBzYW1lIHJlbCwgd2UnZCBiZSBkb3VibGUtY291bnRpbmcgdGhlCiAqCQlyZXN0cmlj dGlvbiBzZWxlY3Rpdml0eSBvZiB0aGUgZXF1YWxpdHkgaW4gdGhlIG5leHQgc3RlcC4KICoJ NC4gIEZvciBWYXJzIHdpdGhpbiBhIHNpbmdsZSBzb3VyY2UgcmVsLCB3ZSBtdWx0aXBseSB0 b2dldGhlciB0aGUgbnVtYmVycwogKgkJb2YgdmFsdWVzLCBjbGFtcCB0byB0aGUgbnVtYmVy IG9mIHJvd3MgaW4gdGhlIHJlbCAoZGl2aWRlZCBieSAxMCBpZgogKgkJbW9yZSB0aGFuIG9u ZSBWYXIpLCBhbmQgdGhlbiBtdWx0aXBseSBieSBhIGZhY3RvciBiYXNlZCBvbiB0aGUKICoJ CXNlbGVjdGl2aXR5IG9mIHRoZSByZXN0cmljdGlvbiBjbGF1c2VzIGZvciB0aGF0IHJlbC4g IFdoZW4gdGhlcmUncwogKgkJbW9yZSB0aGFuIG9uZSBWYXIsIHRoZSBpbml0aWFsIHByb2R1 Y3QgaXMgcHJvYmFibHkgdG9vIGhpZ2ggKGl0J3MgdGhlCiAqCQl3b3JzdCBjYXNlKSBidXQg Y2xhbXBpbmcgdG8gYSBmcmFjdGlvbiBvZiB0aGUgcmVsJ3Mgcm93cyBzZWVtcyB0byBiZSBh CiAqCQloZWxwZnVsIGhldXJpc3RpYyBmb3Igbm90IGxldHRpbmcgdGhlIGVzdGltYXRlIGdl dCBvdXQgb2YgaGFuZC4gIChUaGUKICoJCWZhY3RvciBvZiAxMCBpcyBkZXJpdmVkIGZyb20g cHJlLVBvc3RncmVzLTcuNCBwcmFjdGljZS4pICBUaGUgZmFjdG9yCiAqCQl3ZSBtdWx0aXBs eSBieSB0byBhZGp1c3QgZm9yIHRoZSByZXN0cmljdGlvbiBzZWxlY3Rpdml0eSBhc3N1bWVz IHRoYXQKICoJCXRoZSByZXN0cmljdGlvbiBjbGF1c2VzIGFyZSBpbmRlcGVuZGVudCBvZiB0 aGUgZ3JvdXBpbmcsIHdoaWNoIG1heSBub3QKICoJCWJlIGEgdmFsaWQgYXNzdW1wdGlvbiwg YnV0IGl0J3MgaGFyZCB0byBkbyBiZXR0ZXIuCiAqCTUuICBJZiB0aGVyZSBhcmUgVmFycyBm cm9tIG11bHRpcGxlIHJlbHMsIHdlIHJlcGVhdCBzdGVwIDQgZm9yIGVhY2ggc3VjaAogKgkJ cmVsLCBhbmQgbXVsdGlwbHkgdGhlIHJlc3VsdHMgdG9nZXRoZXIuCiAqIE5vdGUgdGhhdCBy ZWxzIG5vdCBjb250YWluaW5nIGdyb3VwZWQgVmFycyBhcmUgaWdub3JlZCBjb21wbGV0ZWx5 LCBhcyBhcmUKICogam9pbiBjbGF1c2VzLiAgU3VjaCByZWxzIGNhbm5vdCBpbmNyZWFzZSB0 aGUgbnVtYmVyIG9mIGdyb3VwcywgYW5kIHdlCiAqIGFzc3VtZSBzdWNoIGNsYXVzZXMgZG8g bm90IHJlZHVjZSB0aGUgbnVtYmVyIGVpdGhlciAoc29tZXdoYXQgYm9ndXMsCiAqIGJ1dCB3 ZSBkb24ndCBoYXZlIHRoZSBpbmZvIHRvIGRvIGJldHRlcikuCiAqLwpkb3VibGUKZXN0aW1h dGVfbnVtX2dyb3VwcyhQbGFubmVySW5mbyAqcm9vdCwgTGlzdCAqZ3JvdXBFeHBycywgZG91 YmxlIGlucHV0X3Jvd3MsCgkJCQkJTGlzdCAqKnBnc2V0LCBFc3RpbWF0aW9uSW5mbyAqZXN0 aW5mbykKewoJTGlzdAkgICAqdmFyaW5mb3MgPSBOSUw7Cglkb3VibGUJCXNyZl9tdWx0aXBs aWVyID0gMS4wOwoJZG91YmxlCQludW1kaXN0aW5jdDsKCUxpc3RDZWxsICAgKmw7CglpbnQJ CQlpOwoKCS8qIFplcm8gdGhlIGVzdGluZm8gb3V0cHV0IHBhcmFtZXRlciwgaWYgbm9uLU5V TEwgKi8KCWlmIChlc3RpbmZvICE9IE5VTEwpCgkJbWVtc2V0KGVzdGluZm8sIDAsIHNpemVv ZihFc3RpbWF0aW9uSW5mbykpOwoKCS8qCgkgKiBXZSBkb24ndCBldmVyIHdhbnQgdG8gcmV0 dXJuIGFuIGVzdGltYXRlIG9mIHplcm8gZ3JvdXBzLCBhcyB0aGF0IHRlbmRzCgkgKiB0byBs ZWFkIHRvIGRpdmlzaW9uLWJ5LXplcm8gYW5kIG90aGVyIHVucGxlYXNhbnRuZXNzLiAgVGhl IGlucHV0X3Jvd3MKCSAqIGVzdGltYXRlIGlzIHVzdWFsbHkgYWxyZWFkeSBhdCBsZWFzdCAx LCBidXQgY2xhbXAgaXQganVzdCBpbiBjYXNlIGl0CgkgKiBpc24ndC4KCSAqLwoJaW5wdXRf cm93cyA9IGNsYW1wX3Jvd19lc3QoaW5wdXRfcm93cyk7CgoJLyoKCSAqIElmIG5vIGdyb3Vw aW5nIGNvbHVtbnMsIHRoZXJlJ3MgZXhhY3RseSBvbmUgZ3JvdXAuICAoVGhpcyBjYW4ndCBo YXBwZW4KCSAqIGZvciBub3JtYWwgY2FzZXMgd2l0aCBHUk9VUCBCWSBvciBESVNUSU5DVCwg YnV0IGl0IGlzIHBvc3NpYmxlIGZvcgoJICogY29ybmVyIGNhc2VzIHdpdGggc2V0IG9wZXJh dGlvbnMuKQoJICovCglpZiAoZ3JvdXBFeHBycyA9PSBOSUwgfHwgKHBnc2V0ICYmICpwZ3Nl dCA9PSBOSUwpKQoJCXJldHVybiAxLjA7CgoJLyoKCSAqIENvdW50IGdyb3VwcyBkZXJpdmVk IGZyb20gYm9vbGVhbiBncm91cGluZyBleHByZXNzaW9ucy4gIEZvciBvdGhlcgoJICogZXhw cmVzc2lvbnMsIGZpbmQgdGhlIHVuaXF1ZSBWYXJzIHVzZWQsIHRyZWF0aW5nIGFuIGV4cHJl c3Npb24gYXMgYSBWYXIKCSAqIGlmIHdlIGNhbiBmaW5kIHN0YXRzIGZvciBpdC4gIEZvciBl YWNoIG9uZSwgcmVjb3JkIHRoZSBzdGF0aXN0aWNhbAoJICogZXN0aW1hdGUgb2YgbnVtYmVy IG9mIGRpc3RpbmN0IHZhbHVlcyAodG90YWwgaW4gaXRzIHRhYmxlLCB3aXRob3V0CgkgKiBy ZWdhcmQgZm9yIGZpbHRlcmluZykuCgkgKi8KCW51bWRpc3RpbmN0ID0gMS4wOwoKCWkgPSAw OwoJZm9yZWFjaChsLCBncm91cEV4cHJzKQoJewoJCU5vZGUJICAgKmdyb3VwZXhwciA9IChO b2RlICopIGxmaXJzdChsKTsKCQlkb3VibGUJCXRoaXNfc3JmX211bHRpcGxpZXI7CgkJVmFy aWFibGVTdGF0RGF0YSB2YXJkYXRhOwoJCUxpc3QJICAgKnZhcnNoZXJlOwoJCUxpc3RDZWxs ICAgKmwyOwoKCQkvKiBpcyBleHByZXNzaW9uIGluIHRoaXMgZ3JvdXBpbmcgc2V0PyAqLwoJ CWlmIChwZ3NldCAmJiAhbGlzdF9tZW1iZXJfaW50KCpwZ3NldCwgaSsrKSkKCQkJY29udGlu dWU7CgoJCS8qCgkJICogU2V0LXJldHVybmluZyBmdW5jdGlvbnMgaW4gZ3JvdXBpbmcgY29s dW1ucyBhcmUgYSBiaXQgcHJvYmxlbWF0aWMuCgkJICogVGhlIGNvZGUgYmVsb3cgd2lsbCBl ZmZlY3RpdmVseSBpZ25vcmUgdGhlaXIgU1JGIG5hdHVyZSBhbmQgY29tZSB1cAoJCSAqIHdp dGggYSBudW1kaXN0aW5jdCBlc3RpbWF0ZSBhcyB0aG91Z2ggdGhleSB3ZXJlIHNjYWxhciBm dW5jdGlvbnMuCgkJICogV2UgY29tcGVuc2F0ZSBieSBzY2FsaW5nIHVwIHRoZSBlbmQgcmVz dWx0IGJ5IHRoZSBsYXJnZXN0IFNSRgoJCSAqIHJvd2NvdW50IGVzdGltYXRlLiAgKFRoaXMg d2lsbCBiZSBhbiBvdmVyZXN0aW1hdGUgaWYgdGhlIFNSRgoJCSAqIHByb2R1Y2VzIG11bHRp cGxlIGNvcGllcyBvZiBhbnkgb3V0cHV0IHZhbHVlLCBidXQgaXQgc2VlbXMgYmVzdCB0bwoJ CSAqIGFzc3VtZSB0aGUgU1JGJ3Mgb3V0cHV0cyBhcmUgZGlzdGluY3QuICBJbiBhbnkgY2Fz ZSwgaXQncyBwcm9iYWJseQoJCSAqIHBvaW50bGVzcyB0byB3b3JyeSB0b28gbXVjaCBhYm91 dCB0aGlzIHdpdGhvdXQgbXVjaCBiZXR0ZXIKCQkgKiBlc3RpbWF0ZXMgZm9yIFNSRiBvdXRw dXQgcm93Y291bnRzIHRoYW4gd2UgaGF2ZSB0b2RheS4pCgkJICovCgkJdGhpc19zcmZfbXVs dGlwbGllciA9IGV4cHJlc3Npb25fcmV0dXJuc19zZXRfcm93cyhyb290LCBncm91cGV4cHIp OwoJCWlmIChzcmZfbXVsdGlwbGllciA8IHRoaXNfc3JmX211bHRpcGxpZXIpCgkJCXNyZl9t dWx0aXBsaWVyID0gdGhpc19zcmZfbXVsdGlwbGllcjsKCgkJLyogU2hvcnQtY2lyY3VpdCBm b3IgZXhwcmVzc2lvbnMgcmV0dXJuaW5nIGJvb2xlYW4gKi8KCQlpZiAoZXhwclR5cGUoZ3Jv dXBleHByKSA9PSBCT09MT0lEKQoJCXsKCQkJbnVtZGlzdGluY3QgKj0gMi4wOwoJCQljb250 aW51ZTsKCQl9CgoJCS8qCgkJICogSWYgZXhhbWluZV92YXJpYWJsZSBpcyBhYmxlIHRvIGRl ZHVjZSBhbnl0aGluZyBhYm91dCB0aGUgR1JPVVAgQlkKCQkgKiBleHByZXNzaW9uLCB0cmVh dCBpdCBhcyBhIHNpbmdsZSB2YXJpYWJsZSBldmVuIGlmIGl0J3MgcmVhbGx5IG1vcmUKCQkg KiBjb21wbGljYXRlZC4KCQkgKgoJCSAqIFhYWCBUaGlzIGhhcyB0aGUgY29uc2VxdWVuY2Ug dGhhdCBpZiB0aGVyZSdzIGEgc3RhdGlzdGljcyBvYmplY3Qgb24KCQkgKiB0aGUgZXhwcmVz c2lvbiwgd2UgZG9uJ3Qgc3BsaXQgaXQgaW50byBpbmRpdmlkdWFsIFZhcnMuIFRoaXMKCQkg KiBhZmZlY3RzIG91ciBzZWxlY3Rpb24gb2Ygc3RhdGlzdGljcyBpbgoJCSAqIGVzdGltYXRl X211bHRpdmFyaWF0ZV9uZGlzdGluY3QsIGJlY2F1c2UgaXQncyBwcm9iYWJseSBiZXR0ZXIg dG8KCQkgKiB1c2UgbW9yZSBhY2N1cmF0ZSBlc3RpbWF0ZSBmb3IgZWFjaCBleHByZXNzaW9u IGFuZCB0cmVhdCB0aGVtIGFzCgkJICogaW5kZXBlbmRlbnQsIHRoYW4gdG8gY29tYmluZSBl c3RpbWF0ZXMgZm9yIHRoZSBleHRyYWN0ZWQgdmFyaWFibGVzCgkJICogd2hlbiB3ZSBkb24n dCBrbm93IGhvdyB0aGF0IHJlbGF0ZXMgdG8gdGhlIGV4cHJlc3Npb25zLgoJCSAqLwoJCWV4 YW1pbmVfdmFyaWFibGUocm9vdCwgZ3JvdXBleHByLCAwLCAmdmFyZGF0YSk7CgkJaWYgKEhl YXBUdXBsZUlzVmFsaWQodmFyZGF0YS5zdGF0c1R1cGxlKSB8fCB2YXJkYXRhLmlzdW5pcXVl KQoJCXsKCQkJdmFyaW5mb3MgPSBhZGRfdW5pcXVlX2dyb3VwX3Zhcihyb290LCB2YXJpbmZv cywKCQkJCQkJCQkJCQlncm91cGV4cHIsICZ2YXJkYXRhKTsKCQkJUmVsZWFzZVZhcmlhYmxl U3RhdHModmFyZGF0YSk7CgkJCWNvbnRpbnVlOwoJCX0KCQlSZWxlYXNlVmFyaWFibGVTdGF0 cyh2YXJkYXRhKTsKCgkJLyoKCQkgKiBFbHNlIHB1bGwgb3V0IHRoZSBjb21wb25lbnQgVmFy cy4gIEhhbmRsZSBQbGFjZUhvbGRlclZhcnMgYnkKCQkgKiByZWN1cnNpbmcgaW50byB0aGVp ciBhcmd1bWVudHMgKGVmZmVjdGl2ZWx5IGFzc3VtaW5nIHRoYXQgdGhlCgkJICogUGxhY2VI b2xkZXJWYXIgZG9lc24ndCBjaGFuZ2UgdGhlIG51bWJlciBvZiBncm91cHMsIHdoaWNoIGJv aWxzCgkJICogZG93biB0byBpZ25vcmluZyB0aGUgcG9zc2libGUgYWRkaXRpb24gb2YgbnVs bHMgdG8gdGhlIHJlc3VsdCBzZXQpLgoJCSAqLwoJCXZhcnNoZXJlID0gcHVsbF92YXJfY2xh dXNlKGdyb3VwZXhwciwKCQkJCQkJCQkgICBQVkNfUkVDVVJTRV9BR0dSRUdBVEVTIHwKCQkJ CQkJCQkgICBQVkNfUkVDVVJTRV9XSU5ET1dGVU5DUyB8CgkJCQkJCQkJICAgUFZDX1JFQ1VS U0VfUExBQ0VIT0xERVJTKTsKCgkJLyoKCQkgKiBJZiB3ZSBmaW5kIGFueSB2YXJpYWJsZS1m cmVlIEdST1VQIEJZIGl0ZW0sIHRoZW4gZWl0aGVyIGl0IGlzIGEKCQkgKiBjb25zdGFudCAo YW5kIHdlIGNhbiBpZ25vcmUgaXQpIG9yIGl0IGNvbnRhaW5zIGEgdm9sYXRpbGUgZnVuY3Rp b247CgkJICogaW4gdGhlIGxhdHRlciBjYXNlIHdlIHB1bnQgYW5kIGFzc3VtZSB0aGF0IGVh Y2ggaW5wdXQgcm93IHdpbGwKCQkgKiB5aWVsZCBhIGRpc3RpbmN0IGdyb3VwLgoJCSAqLwoJ CWlmICh2YXJzaGVyZSA9PSBOSUwpCgkJewoJCQlpZiAoY29udGFpbl92b2xhdGlsZV9mdW5j dGlvbnMoZ3JvdXBleHByKSkKCQkJCXJldHVybiBpbnB1dF9yb3dzOwoJCQljb250aW51ZTsK CQl9CgoJCS8qCgkJICogRWxzZSBhZGQgdmFyaWFibGVzIHRvIHZhcmluZm9zIGxpc3QKCQkg Ki8KCQlmb3JlYWNoKGwyLCB2YXJzaGVyZSkKCQl7CgkJCU5vZGUJICAgKnZhciA9IChOb2Rl ICopIGxmaXJzdChsMik7CgoJCQlleGFtaW5lX3ZhcmlhYmxlKHJvb3QsIHZhciwgMCwgJnZh cmRhdGEpOwoJCQl2YXJpbmZvcyA9IGFkZF91bmlxdWVfZ3JvdXBfdmFyKHJvb3QsIHZhcmlu Zm9zLCB2YXIsICZ2YXJkYXRhKTsKCQkJUmVsZWFzZVZhcmlhYmxlU3RhdHModmFyZGF0YSk7 CgkJfQoJfQoKCS8qCgkgKiBJZiBub3cgbm8gVmFycywgd2UgbXVzdCBoYXZlIGFuIGFsbC1j b25zdGFudCBvciBhbGwtYm9vbGVhbiBHUk9VUCBCWQoJICogbGlzdC4KCSAqLwoJaWYgKHZh cmluZm9zID09IE5JTCkKCXsKCQkvKiBBcHBseSBTUkYgbXVsdGlwbGllciBhcyB3ZSB3b3Vs ZCBkbyBpbiB0aGUgbG9uZyBwYXRoICovCgkJbnVtZGlzdGluY3QgKj0gc3JmX211bHRpcGxp ZXI7CgkJLyogUm91bmQgb2ZmICovCgkJbnVtZGlzdGluY3QgPSBjZWlsKG51bWRpc3RpbmN0 KTsKCQkvKiBHdWFyZCBhZ2FpbnN0IG91dC1vZi1yYW5nZSBhbnN3ZXJzICovCgkJaWYgKG51 bWRpc3RpbmN0ID4gaW5wdXRfcm93cykKCQkJbnVtZGlzdGluY3QgPSBpbnB1dF9yb3dzOwoJ CWlmIChudW1kaXN0aW5jdCA8IDEuMCkKCQkJbnVtZGlzdGluY3QgPSAxLjA7CgkJcmV0dXJu IG51bWRpc3RpbmN0OwoJfQoKCS8qCgkgKiBHcm91cCBWYXJzIGJ5IHJlbGF0aW9uIGFuZCBl c3RpbWF0ZSB0b3RhbCBudW1kaXN0aW5jdC4KCSAqCgkgKiBGb3IgZWFjaCBpdGVyYXRpb24g b2YgdGhlIG91dGVyIGxvb3AsIHdlIHByb2Nlc3MgdGhlIGZyb250bW9zdCBWYXIgaW4KCSAq IHZhcmluZm9zLCBwbHVzIGFsbCBvdGhlciBWYXJzIGluIHRoZSBzYW1lIHJlbGF0aW9uLiAg V2UgcmVtb3ZlIHRoZXNlCgkgKiBWYXJzIGZyb20gdGhlIG5ld3ZhcmluZm9zIGxpc3QgZm9y IHRoZSBuZXh0IGl0ZXJhdGlvbi4gVGhpcyBpcyB0aGUKCSAqIGVhc2llc3Qgd2F5IHRvIGdy b3VwIFZhcnMgb2Ygc2FtZSByZWwgdG9nZXRoZXIuCgkgKi8KCWRvCgl7CgkJR3JvdXBWYXJJ bmZvICp2YXJpbmZvMSA9IChHcm91cFZhckluZm8gKikgbGluaXRpYWwodmFyaW5mb3MpOwoJ CVJlbE9wdEluZm8gKnJlbCA9IHZhcmluZm8xLT5yZWw7CgkJZG91YmxlCQlyZWxkaXN0aW5j dCA9IDE7CgkJZG91YmxlCQlyZWxtYXhuZGlzdGluY3QgPSByZWxkaXN0aW5jdDsKCQlpbnQJ CQlyZWx2YXJjb3VudCA9IDA7CgkJTGlzdAkgICAqbmV3dmFyaW5mb3MgPSBOSUw7CgkJTGlz dAkgICAqcmVsdmFyaW5mb3MgPSBOSUw7CgoJCS8qCgkJICogU3BsaXQgdGhlIGxpc3Qgb2Yg dmFyaW5mb3MgaW4gdHdvIC0gb25lIGZvciB0aGUgY3VycmVudCByZWwsIG9uZQoJCSAqIGZv ciByZW1haW5pbmcgVmFycyBvbiBvdGhlciByZWxzLgoJCSAqLwoJCXJlbHZhcmluZm9zID0g bGFwcGVuZChyZWx2YXJpbmZvcywgdmFyaW5mbzEpOwoJCWZvcl9lYWNoX2Zyb20obCwgdmFy aW5mb3MsIDEpCgkJewoJCQlHcm91cFZhckluZm8gKnZhcmluZm8yID0gKEdyb3VwVmFySW5m byAqKSBsZmlyc3QobCk7CgoJCQlpZiAodmFyaW5mbzItPnJlbCA9PSB2YXJpbmZvMS0+cmVs KQoJCQl7CgkJCQkvKiB2YXJpbmZvcyBvbiBjdXJyZW50IHJlbCAqLwoJCQkJcmVsdmFyaW5m b3MgPSBsYXBwZW5kKHJlbHZhcmluZm9zLCB2YXJpbmZvMik7CgkJCX0KCQkJZWxzZQoJCQl7 CgkJCQkvKiBub3QgdGltZSB0byBwcm9jZXNzIHZhcmluZm8yIHlldCAqLwoJCQkJbmV3dmFy aW5mb3MgPSBsYXBwZW5kKG5ld3ZhcmluZm9zLCB2YXJpbmZvMik7CgkJCX0KCQl9CgoJCS8q CgkJICogR2V0IHRoZSBudW1kaXN0aW5jdCBlc3RpbWF0ZSBmb3IgdGhlIFZhcnMgb2YgdGhp cyByZWwuICBXZQoJCSAqIGl0ZXJhdGl2ZWx5IHNlYXJjaCBmb3IgbXVsdGl2YXJpYXRlIG4t ZGlzdGluY3Qgd2l0aCBtYXhpbXVtIG51bWJlcgoJCSAqIG9mIHZhcnM7IGFzc3VtaW5nIHRo YXQgZWFjaCB2YXIgZ3JvdXAgaXMgaW5kZXBlbmRlbnQgb2YgdGhlIG90aGVycywKCQkgKiB3 ZSBtdWx0aXBseSB0aGVtIHRvZ2V0aGVyLiAgQW55IHJlbWFpbmluZyByZWx2YXJpbmZvcyBh ZnRlciBubyBtb3JlCgkJICogbXVsdGl2YXJpYXRlIG1hdGNoZXMgYXJlIGZvdW5kIGFyZSBh c3N1bWVkIGluZGVwZW5kZW50IHRvbywgc28KCQkgKiB0aGVpciBpbmRpdmlkdWFsIG5kaXN0 aW5jdCBlc3RpbWF0ZXMgYXJlIG11bHRpcGxpZWQgYWxzby4KCQkgKgoJCSAqIFdoaWxlIGl0 ZXJhdGluZywgY291bnQgaG93IG1hbnkgc2VwYXJhdGUgbnVtZGlzdGluY3QgdmFsdWVzIHdl CgkJICogYXBwbHkuICBXZSBhcHBseSBhIGZ1ZGdlIGZhY3RvciBiZWxvdywgYnV0IG9ubHkg aWYgd2UgbXVsdGlwbGllZAoJCSAqIG1vcmUgdGhhbiBvbmUgc3VjaCB2YWx1ZXMuCgkJICov CgkJd2hpbGUgKHJlbHZhcmluZm9zKQoJCXsKCQkJZG91YmxlCQltdm5kaXN0aW5jdDsKCgkJ CWlmIChlc3RpbWF0ZV9tdWx0aXZhcmlhdGVfbmRpc3RpbmN0KHJvb3QsIHJlbCwgJnJlbHZh cmluZm9zLAoJCQkJCQkJCQkJCQkmbXZuZGlzdGluY3QpKQoJCQl7CgkJCQlyZWxkaXN0aW5j dCAqPSBtdm5kaXN0aW5jdDsKCQkJCWlmIChyZWxtYXhuZGlzdGluY3QgPCBtdm5kaXN0aW5j dCkKCQkJCQlyZWxtYXhuZGlzdGluY3QgPSBtdm5kaXN0aW5jdDsKCQkJCXJlbHZhcmNvdW50 Kys7CgkJCX0KCQkJZWxzZQoJCQl7CgkJCQlmb3JlYWNoKGwsIHJlbHZhcmluZm9zKQoJCQkJ ewoJCQkJCUdyb3VwVmFySW5mbyAqdmFyaW5mbzIgPSAoR3JvdXBWYXJJbmZvICopIGxmaXJz dChsKTsKCgkJCQkJcmVsZGlzdGluY3QgKj0gdmFyaW5mbzItPm5kaXN0aW5jdDsKCQkJCQlp ZiAocmVsbWF4bmRpc3RpbmN0IDwgdmFyaW5mbzItPm5kaXN0aW5jdCkKCQkJCQkJcmVsbWF4 bmRpc3RpbmN0ID0gdmFyaW5mbzItPm5kaXN0aW5jdDsKCQkJCQlyZWx2YXJjb3VudCsrOwoK CQkJCQkvKgoJCQkJCSAqIFdoZW4gdmFyaW5mbzIncyBpc2RlZmF1bHQgaXMgc2V0IHRoZW4g d2UnZCBiZXR0ZXIgc2V0CgkJCQkJICogdGhlIFNFTEZMQUdfVVNFRF9ERUZBVUxUIGJpdCBp biB0aGUgRXN0aW1hdGlvbkluZm8uCgkJCQkJICovCgkJCQkJaWYgKGVzdGluZm8gIT0gTlVM TCAmJiB2YXJpbmZvMi0+aXNkZWZhdWx0KQoJCQkJCQllc3RpbmZvLT5mbGFncyB8PSBTRUxG TEFHX1VTRURfREVGQVVMVDsKCQkJCX0KCgkJCQkvKiB3ZSdyZSBkb25lIHdpdGggdGhpcyBy ZWxhdGlvbiAqLwoJCQkJcmVsdmFyaW5mb3MgPSBOSUw7CgkJCX0KCQl9CgoJCS8qCgkJICog U2FuaXR5IGNoZWNrIC0tLSBkb24ndCBkaXZpZGUgYnkgemVybyBpZiBlbXB0eSByZWxhdGlv bi4KCQkgKi8KCQlBc3NlcnQoSVNfU0lNUExFX1JFTChyZWwpKTsKCQlpZiAocmVsLT50dXBs ZXMgPiAwKQoJCXsKCQkJLyoKCQkJICogQ2xhbXAgdG8gc2l6ZSBvZiByZWwsIG9yIHNpemUg b2YgcmVsIC8gMTAgaWYgbXVsdGlwbGUgVmFycy4gVGhlCgkJCSAqIGZ1ZGdlIGZhY3RvciBp cyBiZWNhdXNlIHRoZSBWYXJzIGFyZSBwcm9iYWJseSBjb3JyZWxhdGVkIGJ1dCB3ZQoJCQkg KiBkb24ndCBrbm93IGJ5IGhvdyBtdWNoLiAgV2Ugc2hvdWxkIG5ldmVyIGNsYW1wIHRvIGxl c3MgdGhhbiB0aGUKCQkJICogbGFyZ2VzdCBuZGlzdGluY3QgdmFsdWUgZm9yIGFueSBvZiB0 aGUgVmFycywgdGhvdWdoLCBzaW5jZQoJCQkgKiB0aGVyZSB3aWxsIHN1cmVseSBiZSBhdCBs ZWFzdCB0aGF0IG1hbnkgZ3JvdXBzLgoJCQkgKi8KCQkJZG91YmxlCQljbGFtcCA9IHJlbC0+ dHVwbGVzOwoKCQkJaWYgKHJlbHZhcmNvdW50ID4gMSkKCQkJewoJCQkJY2xhbXAgKj0gMC4x OwoJCQkJaWYgKGNsYW1wIDwgcmVsbWF4bmRpc3RpbmN0KQoJCQkJewoJCQkJCWNsYW1wID0g cmVsbWF4bmRpc3RpbmN0OwoJCQkJCS8qIGZvciBzYW5pdHkgaW4gY2FzZSBzb21lIG5kaXN0 aW5jdCBpcyB0b28gbGFyZ2U6ICovCgkJCQkJaWYgKGNsYW1wID4gcmVsLT50dXBsZXMpCgkJ CQkJCWNsYW1wID0gcmVsLT50dXBsZXM7CgkJCQl9CgkJCX0KCQkJaWYgKHJlbGRpc3RpbmN0 ID4gY2xhbXApCgkJCQlyZWxkaXN0aW5jdCA9IGNsYW1wOwoKCQkJLyoKCQkJICogVXBkYXRl IHRoZSBlc3RpbWF0ZSBiYXNlZCBvbiB0aGUgcmVzdHJpY3Rpb24gc2VsZWN0aXZpdHksCgkJ CSAqIGd1YXJkaW5nIGFnYWluc3QgZGl2aXNpb24gYnkgemVybyB3aGVuIHJlbGRpc3RpbmN0 IGlzIHplcm8uCgkJCSAqIEFsc28gc2tpcCB0aGlzIGlmIHdlIGtub3cgdGhhdCB3ZSBhcmUg cmV0dXJuaW5nIGFsbCByb3dzLgoJCQkgKi8KCQkJaWYgKHJlbGRpc3RpbmN0ID4gMCAmJiBy ZWwtPnJvd3MgPCByZWwtPnR1cGxlcykKCQkJewoJCQkJLyoKCQkJCSAqIEdpdmVuIGEgdGFi bGUgY29udGFpbmluZyBOIHJvd3Mgd2l0aCBuIGRpc3RpbmN0IHZhbHVlcyBpbiBhCgkJCQkg KiB1bmlmb3JtIGRpc3RyaWJ1dGlvbiwgaWYgd2Ugc2VsZWN0IHAgcm93cyBhdCByYW5kb20g dGhlbgoJCQkJICogdGhlIGV4cGVjdGVkIG51bWJlciBvZiBkaXN0aW5jdCB2YWx1ZXMgc2Vs ZWN0ZWQgaXMKCQkJCSAqCgkJCQkgKiBuICogKDEgLSBwcm9kdWN0KChOLU4vbi1pKS8oTi1p KSwgaT0wLi5wLTEpKQoJCQkJICoKCQkJCSAqID0gbiAqICgxIC0gKE4tTi9uKSEgLyAoTi1O L24tcCkhICogKE4tcCkhIC8gTiEpCgkJCQkgKgoJCQkJICogU2VlICJBcHByb3hpbWF0aW5n IGJsb2NrIGFjY2Vzc2VzIGluIGRhdGFiYXNlCgkJCQkgKiBvcmdhbml6YXRpb25zIiwgUy4g Qi4gWWFvLCBDb21tdW5pY2F0aW9ucyBvZiB0aGUgQUNNLAoJCQkJICogVm9sdW1lIDIwIElz c3VlIDQsIEFwcmlsIDE5NzcgUGFnZXMgMjYwLTI2MS4KCQkJCSAqCgkJCQkgKiBBbHRlcm5h dGl2ZWx5LCByZS1hcnJhbmdpbmcgdGhlIHRlcm1zIGZyb20gdGhlIGZhY3RvcmlhbHMsCgkJ CQkgKiB0aGlzIG1heSBiZSB3cml0dGVuIGFzCgkJCQkgKgoJCQkJICogbiAqICgxIC0gcHJv ZHVjdCgoTi1wLWkpLyhOLWkpLCBpPTAuLk4vbi0xKSkKCQkJCSAqCgkJCQkgKiBUaGlzIGZv cm0gb2YgdGhlIGZvcm11bGEgaXMgbW9yZSBlZmZpY2llbnQgdG8gY29tcHV0ZSBpbgoJCQkJ ICogdGhlIGNvbW1vbiBjYXNlIHdoZXJlIHAgaXMgbGFyZ2VyIHRoYW4gTi9uLiAgQWRkaXRp b25hbGx5LAoJCQkJICogYXMgcG9pbnRlZCBvdXQgYnkgRGVsbCdFcmEsIGlmIGkgPDwgTiBm b3IgYWxsIHRlcm1zIGluIHRoZQoJCQkJICogcHJvZHVjdCwgaXQgY2FuIGJlIGFwcHJveGlt YXRlZCBieQoJCQkJICoKCQkJCSAqIG4gKiAoMSAtICgoTi1wKS9OKV4oTi9uKSkKCQkJCSAq CgkJCQkgKiBTZWUgIkV4cGVjdGVkIGRpc3RpbmN0IHZhbHVlcyB3aGVuIHNlbGVjdGluZyBm cm9tIGEgYmFnCgkJCQkgKiB3aXRob3V0IHJlcGxhY2VtZW50IiwgQWxiZXJ0byBEZWxsJ0Vy YSwKCQkJCSAqIGh0dHA6Ly93d3cuYWRlbGxlcmEuaXQvaW52ZXN0aWdhdGlvbnMvZGlzdGlu Y3RfYmFsbHMvLgoJCQkJICoKCQkJCSAqIFRoZSBjb25kaXRpb24gaSA8PCBOIGlzIGVxdWl2 YWxlbnQgdG8gbiA+PiAxLCBzbyB0aGlzIGlzIGEKCQkJCSAqIGdvb2QgYXBwcm94aW1hdGlv biB3aGVuIHRoZSBudW1iZXIgb2YgZGlzdGluY3QgdmFsdWVzIGluCgkJCQkgKiB0aGUgdGFi bGUgaXMgbGFyZ2UuICBJdCB0dXJucyBvdXQgdGhhdCB0aGlzIGZvcm11bGEgYWxzbwoJCQkJ ICogd29ya3Mgd2VsbCBldmVuIHdoZW4gbiBpcyBzbWFsbC4KCQkJCSAqLwoJCQkJcmVsZGlz dGluY3QgKj0KCQkJCQkoMSAtIHBvdygocmVsLT50dXBsZXMgLSByZWwtPnJvd3MpIC8gcmVs LT50dXBsZXMsCgkJCQkJCQkgcmVsLT50dXBsZXMgLyByZWxkaXN0aW5jdCkpOwoJCQl9CgkJ CXJlbGRpc3RpbmN0ID0gY2xhbXBfcm93X2VzdChyZWxkaXN0aW5jdCk7CgoJCQkvKgoJCQkg KiBVcGRhdGUgZXN0aW1hdGUgb2YgdG90YWwgZGlzdGluY3QgZ3JvdXBzLgoJCQkgKi8KCQkJ bnVtZGlzdGluY3QgKj0gcmVsZGlzdGluY3Q7CgkJfQoKCQl2YXJpbmZvcyA9IG5ld3Zhcmlu Zm9zOwoJfSB3aGlsZSAodmFyaW5mb3MgIT0gTklMKTsKCgkvKiBOb3cgd2UgY2FuIGFjY291 bnQgZm9yIHRoZSBlZmZlY3RzIG9mIGFueSBTUkZzICovCgludW1kaXN0aW5jdCAqPSBzcmZf bXVsdGlwbGllcjsKCgkvKiBSb3VuZCBvZmYgKi8KCW51bWRpc3RpbmN0ID0gY2VpbChudW1k aXN0aW5jdCk7CgoJLyogR3VhcmQgYWdhaW5zdCBvdXQtb2YtcmFuZ2UgYW5zd2VycyAqLwoJ aWYgKG51bWRpc3RpbmN0ID4gaW5wdXRfcm93cykKCQludW1kaXN0aW5jdCA9IGlucHV0X3Jv d3M7CglpZiAobnVtZGlzdGluY3QgPCAxLjApCgkJbnVtZGlzdGluY3QgPSAxLjA7CgoJcmV0 dXJuIG51bWRpc3RpbmN0Owp9CgovKgogKiBUcnkgdG8gZXN0aW1hdGUgdGhlIGJ1Y2tldCBz aXplIG9mIHRoZSBoYXNoIGpvaW4gaW5uZXIgc2lkZSB3aGVuIHRoZSBqb2luCiAqIGNvbmRp dGlvbiBjb250YWlucyB0d28gb3IgbW9yZSBjbGF1c2VzIGJ5IGVtcGxveWluZyBleHRlbmRl ZCBzdGF0aXN0aWNzLgogKgogKiBUaGUgbWFpbiBpZGVhIG9mIHRoaXMgYXBwcm9hY2ggaXMg dGhhdCB0aGUgZGlzdGluY3QgdmFsdWUgZ2VuZXJhdGVkIGJ5CiAqIG11bHRpdmFyaWF0ZSBl c3RpbWF0aW9uIG9uIHR3byBvciBtb3JlIGNvbHVtbnMgd291bGQgcHJvdmlkZSBsZXNzIGJ1 Y2tldCBzaXplCiAqIHRoYW4gZXN0aW1hdGlvbiBvbiBvbmUgc2VwYXJhdGUgY29sdW1uLgog KgogKiBJTVBPUlRBTlQ6IEl0IGlzIGNydWNpYWwgdG8gc3luY2hyb25pemUgdGhlIGFwcHJv YWNoIG9mIGNvbWJpbmluZyBkaWZmZXJlbnQKICogZXN0aW1hdGlvbnMgd2l0aCB0aGUgY2Fs bGVyJ3MgbWV0aG9kLgogKgogKiBSZXR1cm4gYSBsaXN0IG9mIGNsYXVzZXMgdGhhdCBkaWRu J3QgZmV0Y2ggYW55IGV4dGVuZGVkIHN0YXRpc3RpY3MuCiAqLwpMaXN0ICoKZXN0aW1hdGVf bXVsdGl2YXJpYXRlX2J1Y2tldHNpemUoUGxhbm5lckluZm8gKnJvb3QsIFJlbE9wdEluZm8g KmlubmVyLAoJCQkJCQkJCSBMaXN0ICpoYXNoY2xhdXNlcywKCQkJCQkJCQkgU2VsZWN0aXZp dHkgKmlubmVyYnVja2V0c2l6ZSkKewoJTGlzdAkgICAqY2xhdXNlczsKCUxpc3QJICAgKm90 aGVyY2xhdXNlczsKCWRvdWJsZQkJbmRpc3RpbmN0OwoKCWlmIChsaXN0X2xlbmd0aChoYXNo Y2xhdXNlcykgPD0gMSkKCXsKCQkvKgoJCSAqIE5vdGhpbmcgdG8gZG8gZm9yIGEgc2luZ2xl IGNsYXVzZS4gIENvdWxkIHdlIGVtcGxveSB1bml2YXJpYXRlCgkJICogZXh0ZW5kZWQgc3Rh dCBoZXJlPwoJCSAqLwoJCXJldHVybiBoYXNoY2xhdXNlczsKCX0KCgkvKiAiY2xhdXNlcyIg aXMgdGhlIGxpc3Qgb2YgaGFzaGNsYXVzZXMgd2UndmUgbm90IGRlYWx0IHdpdGggeWV0ICov CgljbGF1c2VzID0gbGlzdF9jb3B5KGhhc2hjbGF1c2VzKTsKCS8qICJvdGhlcmNsYXVzZXMi IGhvbGRzIGNsYXVzZXMgd2UgYXJlIGdvaW5nIHRvIHJldHVybiB0byBjYWxsZXIgKi8KCW90 aGVyY2xhdXNlcyA9IE5JTDsKCS8qIGN1cnJlbnQgZXN0aW1hdGUgb2YgbmRpc3RpbmN0ICov CgluZGlzdGluY3QgPSAxLjA7Cgl3aGlsZSAoY2xhdXNlcyAhPSBOSUwpCgl7CgkJTGlzdENl bGwgICAqbGM7CgkJaW50CQkJcmVsaWQgPSAtMTsKCQlMaXN0CSAgICp2YXJpbmZvcyA9IE5J TDsKCQlMaXN0CSAgICpvcmlnaW5fcmluZm9zID0gTklMOwoJCWRvdWJsZQkJbXZuZGlzdGlu Y3Q7CgkJTGlzdAkgICAqb3JpZ2luX3ZhcmluZm9zOwoJCWludAkJCWdyb3VwX3JlbGlkID0g LTE7CgkJUmVsT3B0SW5mbyAqZ3JvdXBfcmVsID0gTlVMTDsKCQlMaXN0Q2VsbCAgICpsYzEs CgkJCQkgICAqbGMyOwoKCQkvKgoJCSAqIEZpbmQgY2xhdXNlcywgcmVmZXJlbmNpbmcgdGhl IHNhbWUgc2luZ2xlIGJhc2UgcmVsYXRpb24gYW5kIHRyeSB0bwoJCSAqIGVzdGltYXRlIHN1 Y2ggYSBncm91cCB3aXRoIGV4dGVuZGVkIHN0YXRpc3RpY3MuICBDcmVhdGUgdmFyaW5mbyBm b3IKCQkgKiBhbiBhcHByb3ZlZCBjbGF1c2UsIHB1c2ggaXQgdG8gb3RoZXJjbGF1c2VzLCBp ZiBpdCBjYW4ndCBiZQoJCSAqIGVzdGltYXRlZCBoZXJlIG9yIGlnbm9yZSB0byBwcm9jZXNz IGF0IHRoZSBuZXh0IGl0ZXJhdGlvbi4KCQkgKi8KCQlmb3JlYWNoKGxjLCBjbGF1c2VzKQoJ CXsKCQkJUmVzdHJpY3RJbmZvICpyaW5mbyA9IGxmaXJzdF9ub2RlKFJlc3RyaWN0SW5mbywg bGMpOwoJCQlOb2RlCSAgICpleHByOwoJCQlSZWxpZHMJCXJlbGlkczsKCQkJR3JvdXBWYXJJ bmZvICp2YXJpbmZvOwoKCQkJLyoKCQkJICogRmluZCB0aGUgaW5uZXIgc2lkZSBvZiB0aGUg am9pbiwgd2hpY2ggd2UgbmVlZCB0byBlc3RpbWF0ZSB0aGUKCQkJICogbnVtYmVyIG9mIGJ1 Y2tldHMuICBVc2Ugb3V0ZXJfaXNfbGVmdCBiZWNhdXNlIHRoZQoJCQkgKiBjbGF1c2Vfc2lk ZXNfbWF0Y2hfam9pbiByb3V0aW5lIGhhcyBjYWxsZWQgb24gaGFzaCBjbGF1c2VzLgoJCQkg Ki8KCQkJcmVsaWRzID0gcmluZm8tPm91dGVyX2lzX2xlZnQgPwoJCQkJcmluZm8tPnJpZ2h0 X3JlbGlkcyA6IHJpbmZvLT5sZWZ0X3JlbGlkczsKCQkJZXhwciA9IHJpbmZvLT5vdXRlcl9p c19sZWZ0ID8KCQkJCWdldF9yaWdodG9wKHJpbmZvLT5jbGF1c2UpIDogZ2V0X2xlZnRvcChy aW5mby0+Y2xhdXNlKTsKCgkJCWlmIChibXNfZ2V0X3NpbmdsZXRvbl9tZW1iZXIocmVsaWRz LCAmcmVsaWQpICYmCgkJCQlyb290LT5zaW1wbGVfcmVsX2FycmF5W3JlbGlkXS0+c3RhdGxp c3QgIT0gTklMKQoJCQl7CgkJCQlib29sCQlpc19kdXBsaWNhdGUgPSBmYWxzZTsKCgkJCQkv KgoJCQkJICogVGhpcyBpbm5lci1zaWRlIGV4cHJlc3Npb24gcmVmZXJlbmNlcyBvbmx5IG9u ZSByZWxhdGlvbi4KCQkJCSAqIEV4dGVuZGVkIHN0YXRpc3RpY3Mgb24gdGhpcyBjbGF1c2Ug Y2FuIGV4aXN0LgoJCQkJICovCgkJCQlpZiAoZ3JvdXBfcmVsaWQgPCAwKQoJCQkJewoJCQkJ CVJhbmdlVGJsRW50cnkgKnJ0ZSA9IHJvb3QtPnNpbXBsZV9ydGVfYXJyYXlbcmVsaWRdOwoK CQkJCQlpZiAoIXJ0ZSB8fCAocnRlLT5yZWxraW5kICE9IFJFTEtJTkRfUkVMQVRJT04gJiYK CQkJCQkJCQkgcnRlLT5yZWxraW5kICE9IFJFTEtJTkRfTUFUVklFVyAmJgoJCQkJCQkJCSBy dGUtPnJlbGtpbmQgIT0gUkVMS0lORF9GT1JFSUdOX1RBQkxFICYmCgkJCQkJCQkJIHJ0ZS0+ cmVsa2luZCAhPSBSRUxLSU5EX1BBUlRJVElPTkVEX1RBQkxFKSkKCQkJCQl7CgkJCQkJCS8q IEV4dGVuZGVkIHN0YXRpc3RpY3MgY2FuJ3QgZXhpc3QgaW4gcHJpbmNpcGxlICovCgkJCQkJ CW90aGVyY2xhdXNlcyA9IGxhcHBlbmQob3RoZXJjbGF1c2VzLCByaW5mbyk7CgkJCQkJCWNs YXVzZXMgPSBmb3JlYWNoX2RlbGV0ZV9jdXJyZW50KGNsYXVzZXMsIGxjKTsKCQkJCQkJY29u dGludWU7CgkJCQkJfQoKCQkJCQlncm91cF9yZWxpZCA9IHJlbGlkOwoJCQkJCWdyb3VwX3Jl bCA9IHJvb3QtPnNpbXBsZV9yZWxfYXJyYXlbcmVsaWRdOwoJCQkJfQoJCQkJZWxzZSBpZiAo Z3JvdXBfcmVsaWQgIT0gcmVsaWQpCgkJCQl7CgkJCQkJLyoKCQkJCQkgKiBCZWluZyBpbiB0 aGUgZ3JvdXAgZm9ybWluZyBzdGF0ZSB3ZSBkb24ndCBuZWVkIG90aGVyCgkJCQkJICogY2xh dXNlcy4KCQkJCQkgKi8KCQkJCQljb250aW51ZTsKCQkJCX0KCgkJCQkvKgoJCQkJICogV2Un cmUgZ29pbmcgdG8gYWRkIHRoZSBuZXcgY2xhdXNlIHRvIHRoZSB2YXJpbmZvcyBsaXN0LiAg V2UKCQkJCSAqIG1pZ2h0IHJlLXVzZSBhZGRfdW5pcXVlX2dyb3VwX3ZhcigpLCBidXQgd2Ug ZG9uJ3QgZG8gc28gZm9yCgkJCQkgKiB0d28gcmVhc29ucy4KCQkJCSAqCgkJCQkgKiAxKSBX ZSBtdXN0IGtlZXAgdGhlIG9yaWdpbl9yaW5mb3MgbGlzdCBvcmRlcmVkIGV4YWN0bHkgdGhl CgkJCQkgKiBzYW1lIHdheSBhcyB2YXJpbmZvcy4KCQkJCSAqCgkJCQkgKiAyKSBhZGRfdW5p cXVlX2dyb3VwX3ZhcigpIGlzIGRlc2lnbmVkIGZvcgoJCQkJICogZXN0aW1hdGVfbnVtX2dy b3VwcygpLCB3aGVyZSBhIGxhcmdlciBudW1iZXIgb2YgZ3JvdXBzIGlzCgkJCQkgKiB3b3Jz ZS4gICBXaGlsZSBlc3RpbWF0aW5nIHRoZSBudW1iZXIgb2YgaGFzaCBidWNrZXRzLCB3ZQoJ CQkJICogaGF2ZSB0aGUgb3Bwb3NpdGU6IGEgbGVzc2VyIG51bWJlciBvZiBncm91cHMgaXMg d29yc2UuCgkJCQkgKiBUaGVyZWZvcmUsIHdlIGRvbid0IGhhdmUgdG8gcmVtb3ZlICJrbm93 biBlcXVhbCIgdmFyczogdGhlCgkJCQkgKiByZW1vdmVkIHZhciBtYXkgdmFsdWFibHkgY29u dHJpYnV0ZSB0byB0aGUgbXVsdGl2YXJpYXRlCgkJCQkgKiBzdGF0aXN0aWNzIHRvIGdyb3cg dGhlIG51bWJlciBvZiBncm91cHMuCgkJCQkgKi8KCgkJCQkvKgoJCQkJICogQ2xlYXIgbnVs bGluZ3JlbHMgdG8gY29ycmVjdGx5IG1hdGNoIGhhc2gga2V5cy4gIFNlZQoJCQkJICogYWRk X3VuaXF1ZV9ncm91cF92YXIoKSdzIGNvbW1lbnQgZm9yIGRldGFpbHMuCgkJCQkgKi8KCQkJ CWV4cHIgPSByZW1vdmVfbnVsbGluZ19yZWxpZHMoZXhwciwgcm9vdC0+b3V0ZXJfam9pbl9y ZWxzLCBOVUxMKTsKCgkJCQkvKgoJCQkJICogRGV0ZWN0IGFuZCBleGNsdWRlIGV4YWN0IGR1 cGxpY2F0ZXMgZnJvbSB0aGUgbGlzdCBvZiBoYXNoCgkJCQkgKiBrZXlzIChsaWtlIGFkZF91 bmlxdWVfZ3JvdXBfdmFyIGRvZXMpLgoJCQkJICovCgkJCQlmb3JlYWNoKGxjMSwgdmFyaW5m b3MpCgkJCQl7CgkJCQkJdmFyaW5mbyA9IChHcm91cFZhckluZm8gKikgbGZpcnN0KGxjMSk7 CgoJCQkJCWlmICghZXF1YWwoZXhwciwgdmFyaW5mby0+dmFyKSkKCQkJCQkJY29udGludWU7 CgoJCQkJCWlzX2R1cGxpY2F0ZSA9IHRydWU7CgkJCQkJYnJlYWs7CgkJCQl9CgoJCQkJaWYg KGlzX2R1cGxpY2F0ZSkKCQkJCXsKCQkJCQkvKgoJCQkJCSAqIFNraXAgZXhhY3QgZHVwbGlj YXRlcy4gQWRkaW5nIHRoZW0gdG8gdGhlIG90aGVyY2xhdXNlcwoJCQkJCSAqIGxpc3QgYWxz byBkb2Vzbid0IG1ha2Ugc2Vuc2UuCgkJCQkJICovCgkJCQkJY29udGludWU7CgkJCQl9CgoJ CQkJLyoKCQkJCSAqIEluaXRpYWxpemUgR3JvdXBWYXJJbmZvLiAgV2Ugb25seSB1c2UgaXQg dG8gY2FsbAoJCQkJICogZXN0aW1hdGVfbXVsdGl2YXJpYXRlX25kaXN0aW5jdCgpLCB3aGlj aCBkb2Vzbid0IGNhcmUgYWJvdXQKCQkJCSAqIG5kaXN0aW5jdCBhbmQgaXNkZWZhdWx0IGZp ZWxkcy4gIFRodXMsIHNraXAgdGhlc2UgZmllbGRzLgoJCQkJICovCgkJCQl2YXJpbmZvID0g cGFsbG9jMF9vYmplY3QoR3JvdXBWYXJJbmZvKTsKCQkJCXZhcmluZm8tPnZhciA9IGV4cHI7 CgkJCQl2YXJpbmZvLT5yZWwgPSByb290LT5zaW1wbGVfcmVsX2FycmF5W3JlbGlkXTsKCQkJ CXZhcmluZm9zID0gbGFwcGVuZCh2YXJpbmZvcywgdmFyaW5mbyk7CgoJCQkJLyoKCQkJCSAq IFJlbWVtYmVyIHRoZSBsaW5rIHRvIFJlc3RyaWN0SW5mbyBmb3IgdGhlIGNhc2UgdGhlIGNs YXVzZQoJCQkJICogaXMgZmFpbGVkIHRvIGJlIGVzdGltYXRlZC4KCQkJCSAqLwoJCQkJb3Jp Z2luX3JpbmZvcyA9IGxhcHBlbmQob3JpZ2luX3JpbmZvcywgcmluZm8pOwoJCQl9CgkJCWVs c2UKCQkJewoJCQkJLyogVGhpcyBjbGF1c2UgY2FuJ3QgYmUgZXN0aW1hdGVkIHdpdGggZXh0 ZW5kZWQgc3RhdGlzdGljcyAqLwoJCQkJb3RoZXJjbGF1c2VzID0gbGFwcGVuZChvdGhlcmNs YXVzZXMsIHJpbmZvKTsKCQkJfQoKCQkJY2xhdXNlcyA9IGZvcmVhY2hfZGVsZXRlX2N1cnJl bnQoY2xhdXNlcywgbGMpOwoJCX0KCgkJaWYgKGxpc3RfbGVuZ3RoKHZhcmluZm9zKSA8IDIp CgkJewoJCQkvKgoJCQkgKiBNdWx0aXZhcmlhdGUgc3RhdGlzdGljcyBkb2Vzbid0IGFwcGx5 IHRvIHNpbmdsZSBjb2x1bW5zIGV4Y2VwdAoJCQkgKiBmb3IgZXhwcmVzc2lvbnMsIGJ1dCBp dCBoYXMgbm90IGJlZW4gaW1wbGVtZW50ZWQgeWV0LgoJCQkgKi8KCQkJb3RoZXJjbGF1c2Vz ID0gbGlzdF9jb25jYXQob3RoZXJjbGF1c2VzLCBvcmlnaW5fcmluZm9zKTsKCQkJbGlzdF9m cmVlX2RlZXAodmFyaW5mb3MpOwoJCQlsaXN0X2ZyZWUob3JpZ2luX3JpbmZvcyk7CgkJCWNv bnRpbnVlOwoJCX0KCgkJQXNzZXJ0KGdyb3VwX3JlbCAhPSBOVUxMKTsKCgkJLyogRW1wbG95 IHRoZSBleHRlbmRlZCBzdGF0aXN0aWNzLiAqLwoJCW9yaWdpbl92YXJpbmZvcyA9IHZhcmlu Zm9zOwoJCWZvciAoOzspCgkJewoJCQlib29sCQllc3RpbWF0ZWQgPSBlc3RpbWF0ZV9tdWx0 aXZhcmlhdGVfbmRpc3RpbmN0KHJvb3QsCgkJCQkJCQkJCQkJCQkJCQkJZ3JvdXBfcmVsLAoJ CQkJCQkJCQkJCQkJCQkJCSZ2YXJpbmZvcywKCQkJCQkJCQkJCQkJCQkJCQkmbXZuZGlzdGlu Y3QpOwoKCQkJaWYgKCFlc3RpbWF0ZWQpCgkJCQlicmVhazsKCgkJCS8qCgkJCSAqIFdlJ3Zl IGdvdCBhbiBlc3RpbWF0aW9uLiAgVXNlIG5kaXN0aW5jdCB2YWx1ZSBpbiBhIGNvbnNpc3Rl bnQKCQkJICogd2F5IC0gYWNjb3JkaW5nIHRvIHRoZSBjYWxsZXIncyBsb2dpYyAoc2VlCgkJ CSAqIGZpbmFsX2Nvc3RfaGFzaGpvaW4pLgoJCQkgKi8KCQkJaWYgKG5kaXN0aW5jdCA8IG12 bmRpc3RpbmN0KQoJCQkJbmRpc3RpbmN0ID0gbXZuZGlzdGluY3Q7CgkJCUFzc2VydChuZGlz dGluY3QgPj0gMS4wKTsKCQl9CgoJCUFzc2VydChsaXN0X2xlbmd0aChvcmlnaW5fdmFyaW5m b3MpID09IGxpc3RfbGVuZ3RoKG9yaWdpbl9yaW5mb3MpKTsKCgkJLyogQ29sbGVjdCB1bm1h dGNoZWQgY2xhdXNlcyBhcyBvdGhlcmNsYXVzZXMuICovCgkJZm9yYm90aChsYzEsIG9yaWdp bl92YXJpbmZvcywgbGMyLCBvcmlnaW5fcmluZm9zKQoJCXsKCQkJR3JvdXBWYXJJbmZvICp2 aW5mbyA9IGxmaXJzdChsYzEpOwoKCQkJaWYgKCFsaXN0X21lbWJlcl9wdHIodmFyaW5mb3Ms IHZpbmZvKSkKCQkJCS8qIEFscmVhZHkgZXN0aW1hdGVkICovCgkJCQljb250aW51ZTsKCgkJ CS8qIENhbid0IGJlIGVzdGltYXRlZCBoZXJlIC0gcHVzaCB0byB0aGUgcmV0dXJuaW5nIGxp c3QgKi8KCQkJb3RoZXJjbGF1c2VzID0gbGFwcGVuZChvdGhlcmNsYXVzZXMsIGxmaXJzdChs YzIpKTsKCQl9Cgl9CgoJKmlubmVyYnVja2V0c2l6ZSA9IDEuMCAvIG5kaXN0aW5jdDsKCXJl dHVybiBvdGhlcmNsYXVzZXM7Cn0KCi8qCiAqIEVzdGltYXRlIGhhc2ggYnVja2V0IHN0YXRp c3RpY3Mgd2hlbiB0aGUgc3BlY2lmaWVkIGV4cHJlc3Npb24gaXMgdXNlZAogKiBhcyBhIGhh c2gga2V5IGZvciB0aGUgZ2l2ZW4gbnVtYmVyIG9mIGJ1Y2tldHMuCiAqCiAqIFRoaXMgYXR0 ZW1wdHMgdG8gZGV0ZXJtaW5lIHR3byB2YWx1ZXM6CiAqCiAqIDEuIFRoZSBmcmVxdWVuY3kg b2YgdGhlIG1vc3QgY29tbW9uIHZhbHVlIG9mIHRoZSBleHByZXNzaW9uIChyZXR1cm5zCiAq IHplcm8gaW50byAqbWN2X2ZyZXEgaWYgd2UgY2FuJ3QgZ2V0IHRoYXQpLiAgVGhpcyB3aWxs IGJlIGZyZXF1ZW5jeQogKiByZWxhdGl2ZSB0byB0aGUgZW50aXJlIHVuZGVybHlpbmcgdGFi bGUuCiAqCiAqIDIuIFRoZSAiYnVja2V0c2l6ZSBmcmFjdGlvbiIsIGllLCBhdmVyYWdlIG51 bWJlciBvZiBlbnRyaWVzIGluIGEgYnVja2V0CiAqIGRpdmlkZWQgYnkgdG90YWwgbnVtYmVy IG9mIHR1cGxlcyB0byBiZSBoYXNoZWQuCiAqCiAqIFhYWCBUaGlzIGlzIHJlYWxseSBwcmV0 dHkgYm9ndXMgc2luY2Ugd2UncmUgZWZmZWN0aXZlbHkgYXNzdW1pbmcgdGhhdCB0aGUKICog ZGlzdHJpYnV0aW9uIG9mIGhhc2gga2V5cyB3aWxsIGJlIHRoZSBzYW1lIGFmdGVyIGFwcGx5 aW5nIHJlc3RyaWN0aW9uCiAqIGNsYXVzZXMgYXMgaXQgd2FzIGluIHRoZSB1bmRlcmx5aW5n IHJlbGF0aW9uLiAgSG93ZXZlciwgd2UgYXJlIG5vdCBuZWFybHkKICogc21hcnQgZW5vdWdo IHRvIGZpZ3VyZSBvdXQgaG93IHRoZSByZXN0cmljdCBjbGF1c2VzIG1pZ2h0IGNoYW5nZSB0 aGUKICogZGlzdHJpYnV0aW9uLCBzbyB0aGlzIHdpbGwgaGF2ZSB0byBkbyBmb3Igbm93Lgog KgogKiBXZSBhcmUgcGFzc2VkIHRoZSBudW1iZXIgb2YgYnVja2V0cyB0aGUgZXhlY3V0b3Ig d2lsbCB1c2UgZm9yIHRoZSBnaXZlbgogKiBpbnB1dCByZWxhdGlvbi4gIElmIHRoZSBkYXRh IHdlcmUgcGVyZmVjdGx5IGRpc3RyaWJ1dGVkLCB3aXRoIHRoZSBzYW1lCiAqIG51bWJlciBv ZiB0dXBsZXMgZ29pbmcgaW50byBlYWNoIGF2YWlsYWJsZSBidWNrZXQsIHRoZW4gdGhlIGJ1 Y2tldHNpemUKICogZnJhY3Rpb24gd291bGQgYmUgMS9uYnVja2V0cy4gIEJ1dCB0aGlzIGhh cHB5IHN0YXRlIG9mIGFmZmFpcnMgd2lsbCBvY2N1cgogKiBvbmx5IGlmIChhKSB0aGVyZSBh cmUgYXQgbGVhc3QgbmJ1Y2tldHMgZGlzdGluY3QgZGF0YSB2YWx1ZXMsIGFuZCAoYikKICog d2UgaGF2ZSBhIG5vdC10b28tc2tld2VkIGRhdGEgZGlzdHJpYnV0aW9uLiAgT3RoZXJ3aXNl IHRoZSBidWNrZXRzIHdpbGwKICogYmUgbm9udW5pZm9ybWx5IG9jY3VwaWVkLiAgSWYgdGhl IG90aGVyIHJlbGF0aW9uIGluIHRoZSBqb2luIGhhcyBhIGtleQogKiBkaXN0cmlidXRpb24g c2ltaWxhciB0byB0aGlzIG9uZSdzLCB0aGVuIHRoZSBtb3N0LWxvYWRlZCBidWNrZXRzIGFy ZQogKiBleGFjdGx5IHRob3NlIHRoYXQgd2lsbCBiZSBwcm9iZWQgbW9zdCBvZnRlbi4gIFRo ZXJlZm9yZSwgdGhlICJhdmVyYWdlIgogKiBidWNrZXQgc2l6ZSBmb3IgY29zdGluZyBwdXJw b3NlcyBzaG91bGQgcmVhbGx5IGJlIHRha2VuIGFzIHNvbWV0aGluZyBjbG9zZQogKiB0byB0 aGUgIndvcnN0IGNhc2UiIGJ1Y2tldCBzaXplLiAgV2UgdHJ5IHRvIGVzdGltYXRlIHRoaXMg YnkgYWRqdXN0aW5nIHRoZQogKiBmcmFjdGlvbiBpZiB0aGVyZSBhcmUgdG9vIGZldyBkaXN0 aW5jdCBkYXRhIHZhbHVlcywgYW5kIHRoZW4gY2xhbXBpbmcgdG8KICogYXQgbGVhc3QgdGhl IGJ1Y2tldCBzaXplIGltcGxpZWQgYnkgdGhlIG1vc3QgY29tbW9uIHZhbHVlJ3MgZnJlcXVl bmN5LgogKgogKiBJZiBubyBzdGF0aXN0aWNzIGFyZSBhdmFpbGFibGUsIHVzZSBhIGRlZmF1 bHQgZXN0aW1hdGUgb2YgMC4xLiAgVGhpcyB3aWxsCiAqIGRpc2NvdXJhZ2UgdXNlIG9mIGEg aGFzaCByYXRoZXIgc3Ryb25nbHkgaWYgdGhlIGlubmVyIHJlbGF0aW9uIGlzIGxhcmdlLAog KiB3aGljaCBpcyB3aGF0IHdlIHdhbnQuICBXZSBkbyBub3Qgd2FudCB0byBoYXNoIHVubGVz cyB3ZSBrbm93IHRoYXQgdGhlCiAqIGlubmVyIHJlbCBpcyB3ZWxsLWRpc3BlcnNlZCAob3Ig dGhlIGFsdGVybmF0aXZlcyBzZWVtIG11Y2ggd29yc2UpLgogKgogKiBUaGUgY2FsbGVyIHNo b3VsZCBhbHNvIGNoZWNrIHRoYXQgdGhlIG1jdl9mcmVxIGlzIG5vdCBzbyBsYXJnZSB0aGF0 IHRoZQogKiBtb3N0IGNvbW1vbiB2YWx1ZSB3b3VsZCBieSBpdHNlbGYgcmVxdWlyZSBhbiBp bXByYWN0aWNhbGx5IGxhcmdlIGJ1Y2tldC4KICogSW4gYSBoYXNoIGpvaW4sIHRoZSBleGVj dXRvciBjYW4gc3BsaXQgYnVja2V0cyBpZiB0aGV5IGdldCB0b28gYmlnLCBidXQKICogb2J2 aW91c2x5IHRoYXQgZG9lc24ndCBoZWxwIGZvciBhIGJ1Y2tldCB0aGF0IGNvbnRhaW5zIG1h bnkgZHVwbGljYXRlcyBvZgogKiB0aGUgc2FtZSB2YWx1ZS4KICovCnZvaWQKZXN0aW1hdGVf aGFzaF9idWNrZXRfc3RhdHMoUGxhbm5lckluZm8gKnJvb3QsIE5vZGUgKmhhc2hrZXksIGRv dWJsZSBuYnVja2V0cywKCQkJCQkJICAgU2VsZWN0aXZpdHkgKm1jdl9mcmVxLAoJCQkJCQkg ICBTZWxlY3Rpdml0eSAqYnVja2V0c2l6ZV9mcmFjKQp7CglWYXJpYWJsZVN0YXREYXRhIHZh cmRhdGE7Cglkb3VibGUJCWVzdGZyYWN0LAoJCQkJbmRpc3RpbmN0OwoJYm9vbAkJaXNkZWZh dWx0OwoJQXR0U3RhdHNTbG90IHNzbG90OwoKCWV4YW1pbmVfdmFyaWFibGUocm9vdCwgaGFz aGtleSwgMCwgJnZhcmRhdGEpOwoKCS8qIEluaXRpYWxpemUgKm1jdl9mcmVxIHRvICJ1bmtu b3duIiAqLwoJKm1jdl9mcmVxID0gMC4wOwoKCS8qIExvb2sgdXAgdGhlIGZyZXF1ZW5jeSBv ZiB0aGUgbW9zdCBjb21tb24gdmFsdWUsIGlmIGF2YWlsYWJsZSAqLwoJaWYgKEhlYXBUdXBs ZUlzVmFsaWQodmFyZGF0YS5zdGF0c1R1cGxlKSkKCXsKCQlpZiAoZ2V0X2F0dHN0YXRzc2xv dCgmc3Nsb3QsIHZhcmRhdGEuc3RhdHNUdXBsZSwKCQkJCQkJCSBTVEFUSVNUSUNfS0lORF9N Q1YsIEludmFsaWRPaWQsCgkJCQkJCQkgQVRUU1RBVFNTTE9UX05VTUJFUlMpKQoJCXsKCQkJ LyoKCQkJICogVGhlIGZpcnN0IE1DViBzdGF0IGlzIGZvciB0aGUgbW9zdCBjb21tb24gdmFs dWUuCgkJCSAqLwoJCQlpZiAoc3Nsb3Qubm51bWJlcnMgPiAwKQoJCQkJKm1jdl9mcmVxID0g c3Nsb3QubnVtYmVyc1swXTsKCQkJZnJlZV9hdHRzdGF0c3Nsb3QoJnNzbG90KTsKCQl9CgkJ ZWxzZSBpZiAoZ2V0X2F0dHN0YXRzc2xvdCgmc3Nsb3QsIHZhcmRhdGEuc3RhdHNUdXBsZSwK CQkJCQkJCQkgIFNUQVRJU1RJQ19LSU5EX0hJU1RPR1JBTSwgSW52YWxpZE9pZCwKCQkJCQkJ CQkgIDApKQoJCXsKCQkJLyoKCQkJICogSWYgdGhlcmUgYXJlIG5vIHJlY29yZGVkIE1DVnMs IGJ1dCB3ZSBkbyBoYXZlIGEgaGlzdG9ncmFtLCB0aGVuCgkJCSAqIGFzc3VtZSB0aGF0IEFO QUxZWkUgZGV0ZXJtaW5lZCB0aGF0IHRoZSBjb2x1bW4gaXMgdW5pcXVlLgoJCQkgKi8KCQkJ aWYgKHZhcmRhdGEucmVsICYmIHZhcmRhdGEucmVsLT50dXBsZXMgPiAwKQoJCQkJKm1jdl9m cmVxID0gMS4wIC8gdmFyZGF0YS5yZWwtPnR1cGxlczsKCQl9Cgl9CgoJLyogR2V0IG51bWJl ciBvZiBkaXN0aW5jdCB2YWx1ZXMgKi8KCW5kaXN0aW5jdCA9IGdldF92YXJpYWJsZV9udW1k aXN0aW5jdCgmdmFyZGF0YSwgJmlzZGVmYXVsdCk7CgoJLyoKCSAqIElmIG5kaXN0aW5jdCBp c24ndCByZWFsLCBwdW50LiAgV2Ugbm9ybWFsbHkgcmV0dXJuIDAuMSwgYnV0IGlmIHRoZQoJ ICogbWN2X2ZyZXEgaXMga25vd24gdG8gYmUgZXZlbiBoaWdoZXIgdGhhbiB0aGF0LCB1c2Ug aXQgaW5zdGVhZC4KCSAqLwoJaWYgKGlzZGVmYXVsdCkKCXsKCQkqYnVja2V0c2l6ZV9mcmFj ID0gKFNlbGVjdGl2aXR5KSBNYXgoMC4xLCAqbWN2X2ZyZXEpOwoJCVJlbGVhc2VWYXJpYWJs ZVN0YXRzKHZhcmRhdGEpOwoJCXJldHVybjsKCX0KCgkvKgoJICogQWRqdXN0IG5kaXN0aW5j dCB0byBhY2NvdW50IGZvciByZXN0cmljdGlvbiBjbGF1c2VzLiAgT2JzZXJ2ZSB3ZSBhcmUK CSAqIGFzc3VtaW5nIHRoYXQgdGhlIGRhdGEgZGlzdHJpYnV0aW9uIGlzIGFmZmVjdGVkIHVu aWZvcm1seSBieSB0aGUKCSAqIHJlc3RyaWN0aW9uIGNsYXVzZXMhCgkgKgoJICogWFhYIFBv c3NpYmx5IGJldHRlciB3YXksIGJ1dCBtdWNoIG1vcmUgZXhwZW5zaXZlOiBtdWx0aXBseSBi eQoJICogc2VsZWN0aXZpdHkgb2YgcmVsJ3MgcmVzdHJpY3Rpb24gY2xhdXNlcyB0aGF0IG1l bnRpb24gdGhlIHRhcmdldCBWYXIuCgkgKi8KCWlmICh2YXJkYXRhLnJlbCAmJiB2YXJkYXRh LnJlbC0+dHVwbGVzID4gMCkKCXsKCQluZGlzdGluY3QgKj0gdmFyZGF0YS5yZWwtPnJvd3Mg LyB2YXJkYXRhLnJlbC0+dHVwbGVzOwoJCW5kaXN0aW5jdCA9IGNsYW1wX3Jvd19lc3QobmRp c3RpbmN0KTsKCX0KCgkvKgoJICogSW5pdGlhbCBlc3RpbWF0ZSBvZiBidWNrZXRzaXplIGZy YWN0aW9uIGlzIDEvbmJ1Y2tldHMgYXMgbG9uZyBhcyB0aGUKCSAqIG51bWJlciBvZiBidWNr ZXRzIGlzIGxlc3MgdGhhbiB0aGUgZXhwZWN0ZWQgbnVtYmVyIG9mIGRpc3RpbmN0IHZhbHVl czsKCSAqIG90aGVyd2lzZSBpdCBpcyAxL25kaXN0aW5jdC4KCSAqLwoJaWYgKG5kaXN0aW5j dCA+IG5idWNrZXRzKQoJCWVzdGZyYWN0ID0gMS4wIC8gbmJ1Y2tldHM7CgllbHNlCgkJZXN0 ZnJhY3QgPSAxLjAgLyBuZGlzdGluY3Q7CgoJLyoKCSAqIENsYW1wIHRoZSBidWNrZXRzaXpl IGZyYWN0aW9uIHRvIGJlIG5vdCBsZXNzIHRoYW4gdGhlIE1DViBmcmVxdWVuY3ksCgkgKiBz aW5jZSB3aGljaGV2ZXIgYnVja2V0IHRoZSBNQ1YgdmFsdWVzIGVuZCB1cCBpbiB3aWxsIGhh dmUgYXQgbGVhc3QgdGhhdAoJICogc2l6ZS4gIFRoaXMgaGFzIG5vIGVmZmVjdCBpZiAqbWN2 X2ZyZXEgaXMgc3RpbGwgemVyby4KCSAqLwoJZXN0ZnJhY3QgPSBNYXgoZXN0ZnJhY3QsICpt Y3ZfZnJlcSk7CgoJKmJ1Y2tldHNpemVfZnJhYyA9IChTZWxlY3Rpdml0eSkgZXN0ZnJhY3Q7 CgoJUmVsZWFzZVZhcmlhYmxlU3RhdHModmFyZGF0YSk7Cn0KCi8qCiAqIGVzdGltYXRlX2hh c2hhZ2dfdGFibGVzaXplCiAqCSAgZXN0aW1hdGUgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0 IGEgaGFzaCBhZ2dyZWdhdGUgaGFzaHRhYmxlIHdpbGwKICoJICByZXF1aXJlIGJhc2VkIG9u IHRoZSBhZ2dfY29zdHMsIHBhdGggd2lkdGggYW5kIG51bWJlciBvZiBncm91cHMuCiAqCiAq IFdlIHJldHVybiB0aGUgcmVzdWx0IGFzICJkb3VibGUiIHRvIGZvcmVzdGFsbCBhbnkgcG9z c2libGUgb3ZlcmZsb3cKICogcHJvYmxlbSBpbiB0aGUgbXVsdGlwbGljYXRpb24gYnkgZE51 bUdyb3Vwcy4KICoKICogWFhYIHRoaXMgbWF5IGJlIG92ZXItZXN0aW1hdGluZyB0aGUgc2l6 ZSBub3cgdGhhdCBoYXNoYWdnIGtub3dzIHRvIG9taXQKICogdW5uZWVkZWQgY29sdW1ucyBm cm9tIHRoZSBoYXNodGFibGUuICBBbHNvIGZvciBtaXhlZC1tb2RlIGdyb3VwaW5nIHNldHMs CiAqIGdyb3VwaW5nIGNvbHVtbnMgbm90IGluIHRoZSBoYXNoZWQgc2V0IGFyZSBjb3VudGVk IGhlcmUgZXZlbiB0aG91Z2ggaGFzaGFnZwogKiB3b24ndCBzdG9yZSB0aGVtLiAgSXMgdGhp cyBhIHByb2JsZW0/CiAqLwpkb3VibGUKZXN0aW1hdGVfaGFzaGFnZ190YWJsZXNpemUoUGxh bm5lckluZm8gKnJvb3QsIFBhdGggKnBhdGgsCgkJCQkJCSAgIGNvbnN0IEFnZ0NsYXVzZUNv c3RzICphZ2dfY29zdHMsIGRvdWJsZSBkTnVtR3JvdXBzKQp7CglTaXplCQloYXNoZW50cnlz aXplOwoKCWhhc2hlbnRyeXNpemUgPSBoYXNoX2FnZ19lbnRyeV9zaXplKGxpc3RfbGVuZ3Ro KHJvb3QtPmFnZ3RyYW5zaW5mb3MpLAoJCQkJCQkJCQkJcGF0aC0+cGF0aHRhcmdldC0+d2lk dGgsCgkJCQkJCQkJCQlhZ2dfY29zdHMtPnRyYW5zaXRpb25TcGFjZSk7CgoJLyoKCSAqIE5v dGUgdGhhdCB0aGlzIGRpc3JlZ2FyZHMgdGhlIGVmZmVjdCBvZiBmaWxsLWZhY3RvciBhbmQg Z3Jvd3RoIHBvbGljeQoJICogb2YgdGhlIGhhc2ggdGFibGUuICBUaGF0J3MgcHJvYmFibHkg b2ssIGdpdmVuIHRoYXQgdGhlIGRlZmF1bHQKCSAqIGZpbGwtZmFjdG9yIGlzIHJlbGF0aXZl bHkgaGlnaC4gIEl0J2QgYmUgaGFyZCB0byBtZWFuaW5nZnVsbHkgZmFjdG9yIGluCgkgKiAi ZG91YmxlLWluLXNpemUiIGdyb3d0aCBwb2xpY2llcyBoZXJlLgoJICovCglyZXR1cm4gaGFz aGVudHJ5c2l6ZSAqIGROdW1Hcm91cHM7Cn0KCgovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICoK ICogU3VwcG9ydCByb3V0aW5lcwogKgogKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICovCgovKgog KiBGaW5kIHRoZSBiZXN0IG1hdGNoaW5nIG5kaXN0aW5jdCBleHRlbmRlZCBzdGF0aXN0aWNz IGZvciB0aGUgZ2l2ZW4gbGlzdCBvZgogKiBHcm91cFZhckluZm9zLgogKgogKiBDYWxsZXJz IG11c3QgZW5zdXJlIHRoYXQgdGhlIGdpdmVuIEdyb3VwVmFySW5mb3MgYWxsIGJlbG9uZyB0 byAncmVsJyBhbmQKICogdGhlIEdyb3VwVmFySW5mb3MgbGlzdCBkb2VzIG5vdCBjb250YWlu IGFueSBkdXBsaWNhdGUgVmFycyBvciBleHByZXNzaW9ucy4KICoKICogV2hlbiBzdGF0aXN0 aWNzIGFyZSBmb3VuZCB0aGF0IG1hdGNoID4gMSBvZiB0aGUgZ2l2ZW4gR3JvdXBWYXJJbmZv LCB0aGUKICogKm5kaXN0aW5jdCBwYXJhbWV0ZXIgaXMgc2V0IGFjY29yZGluZyB0byB0aGUg bmRpc3RpbmN0IGVzdGltYXRlIGFuZCBhIG5ldwogKiBsaXN0IGlzIGJ1aWx0IHdpdGggdGhl IG1hdGNoaW5nIEdyb3VwVmFySW5mb3MgcmVtb3ZlZCwgd2hpY2ggaXMgb3V0cHV0IHZpYQog KiB0aGUgKnZhcmluZm9zIHBhcmFtZXRlciBiZWZvcmUgcmV0dXJuaW5nIHRydWUuICBXaGVu IG5vIG1hdGNoaW5nIHN0YXRzIGFyZQogKiBmb3VuZCwgZmFsc2UgaXMgcmV0dXJuZWQgYW5k IHRoZSAqdmFyaW5mb3MgYW5kICpuZGlzdGluY3QgcGFyYW1ldGVycyBhcmUKICogbGVmdCB1 bnRvdWNoZWQuCiAqLwpzdGF0aWMgYm9vbAplc3RpbWF0ZV9tdWx0aXZhcmlhdGVfbmRpc3Rp bmN0KFBsYW5uZXJJbmZvICpyb290LCBSZWxPcHRJbmZvICpyZWwsCgkJCQkJCQkJTGlzdCAq KnZhcmluZm9zLCBkb3VibGUgKm5kaXN0aW5jdCkKewoJTGlzdENlbGwgICAqbGM7CglpbnQJ CQlubWF0Y2hlc192YXJzOwoJaW50CQkJbm1hdGNoZXNfZXhwcnM7CglPaWQJCQlzdGF0T2lk ID0gSW52YWxpZE9pZDsKCU1WTkRpc3RpbmN0ICpzdGF0czsKCVN0YXRpc3RpY0V4dEluZm8g Km1hdGNoZWRfaW5mbyA9IE5VTEw7CglSYW5nZVRibEVudHJ5ICpydGUgPSBwbGFubmVyX3J0 X2ZldGNoKHJlbC0+cmVsaWQsIHJvb3QpOwoKCS8qIGJhaWwgb3V0IGltbWVkaWF0ZWx5IGlm IHRoZSB0YWJsZSBoYXMgbm8gZXh0ZW5kZWQgc3RhdGlzdGljcyAqLwoJaWYgKCFyZWwtPnN0 YXRsaXN0KQoJCXJldHVybiBmYWxzZTsKCgkvKiBsb29rIGZvciB0aGUgbmRpc3RpbmN0IHN0 YXRpc3RpY3Mgb2JqZWN0IG1hdGNoaW5nIHRoZSBtb3N0IHZhcnMgKi8KCW5tYXRjaGVzX3Zh cnMgPSAwOwkJCS8qIHdlIHJlcXVpcmUgYXQgbGVhc3QgdHdvIG1hdGNoZXMgKi8KCW5tYXRj aGVzX2V4cHJzID0gMDsKCWZvcmVhY2gobGMsIHJlbC0+c3RhdGxpc3QpCgl7CgkJTGlzdENl bGwgICAqbGMyOwoJCVN0YXRpc3RpY0V4dEluZm8gKmluZm8gPSAoU3RhdGlzdGljRXh0SW5m byAqKSBsZmlyc3QobGMpOwoJCWludAkJCW5zaGFyZWRfdmFycyA9IDA7CgkJaW50CQkJbnNo YXJlZF9leHBycyA9IDA7CgoJCS8qIHNraXAgc3RhdGlzdGljcyBvZiBvdGhlciBraW5kcyAq LwoJCWlmIChpbmZvLT5raW5kICE9IFNUQVRTX0VYVF9ORElTVElOQ1QpCgkJCWNvbnRpbnVl OwoKCQkvKiBza2lwIHN0YXRpc3RpY3Mgd2l0aCBtaXNtYXRjaGluZyBzdHhkaW5oZXJpdCB2 YWx1ZSAqLwoJCWlmIChpbmZvLT5pbmhlcml0ICE9IHJ0ZS0+aW5oKQoJCQljb250aW51ZTsK CgkJLyoKCQkgKiBEZXRlcm1pbmUgaG93IG1hbnkgZXhwcmVzc2lvbnMgKGFuZCB2YXJpYWJs ZXMgaW4gbm9uLW1hdGNoZWQKCQkgKiBleHByZXNzaW9ucykgbWF0Y2guIFdlJ2xsIHRoZW4g dXNlIHRoZXNlIG51bWJlcnMgdG8gcGljayB0aGUKCQkgKiBzdGF0aXN0aWNzIG9iamVjdCB0 aGF0IGJlc3QgbWF0Y2hlcyB0aGUgY2xhdXNlcy4KCQkgKi8KCQlmb3JlYWNoKGxjMiwgKnZh cmluZm9zKQoJCXsKCQkJTGlzdENlbGwgICAqbGMzOwoJCQlHcm91cFZhckluZm8gKnZhcmlu Zm8gPSAoR3JvdXBWYXJJbmZvICopIGxmaXJzdChsYzIpOwoJCQlBdHRyTnVtYmVyCWF0dG51 bTsKCgkJCUFzc2VydCh2YXJpbmZvLT5yZWwgPT0gcmVsKTsKCgkJCS8qIHNpbXBsZSBWYXIs IHNlYXJjaCBpbiBzdGF0aXN0aWNzIGtleXMgZGlyZWN0bHkgKi8KCQkJaWYgKElzQSh2YXJp bmZvLT52YXIsIFZhcikpCgkJCXsKCQkJCWF0dG51bSA9ICgoVmFyICopIHZhcmluZm8tPnZh ciktPnZhcmF0dG5vOwoKCQkJCS8qCgkJCQkgKiBJZ25vcmUgc3lzdGVtIGF0dHJpYnV0ZXMg LSB3ZSBkb24ndCBzdXBwb3J0IHN0YXRpc3RpY3Mgb24KCQkJCSAqIHRoZW0sIHNvIGNhbid0 IG1hdGNoIHRoZW0gKGFuZCBpdCdkIGZhaWwgYXMgdGhlIHZhbHVlcyBhcmUKCQkJCSAqIG5l Z2F0aXZlKS4KCQkJCSAqLwoJCQkJaWYgKCFBdHRyTnVtYmVySXNGb3JVc2VyRGVmaW5lZEF0 dHIoYXR0bnVtKSkKCQkJCQljb250aW51ZTsKCgkJCQlpZiAoYm1zX2lzX21lbWJlcihhdHRu dW0sIGluZm8tPmtleXMpKQoJCQkJCW5zaGFyZWRfdmFycysrOwoKCQkJCWNvbnRpbnVlOwoJ CQl9CgoJCQkvKiBleHByZXNzaW9uIC0gc2VlIGlmIGl0J3MgaW4gdGhlIHN0YXRpc3RpY3Mg b2JqZWN0ICovCgkJCWZvcmVhY2gobGMzLCBpbmZvLT5leHBycykKCQkJewoJCQkJTm9kZQkg ICAqZXhwciA9IChOb2RlICopIGxmaXJzdChsYzMpOwoKCQkJCWlmIChlcXVhbCh2YXJpbmZv LT52YXIsIGV4cHIpKQoJCQkJewoJCQkJCW5zaGFyZWRfZXhwcnMrKzsKCQkJCQlicmVhazsK CQkJCX0KCQkJfQoJCX0KCgkJLyoKCQkgKiBUaGUgbmRpc3RpbmN0IGV4dGVuZGVkIHN0YXRp c3RpY3MgY29udGFpbiBlc3RpbWF0ZXMgZm9yIGEgbWluaW11bQoJCSAqIG9mIHBhaXJzIG9m IGNvbHVtbnMgd2hpY2ggdGhlIHN0YXRpc3RpY3MgYXJlIGRlZmluZWQgb24gYW5kCgkJICog Y2VydGFpbmx5IG5vdCBzaW5nbGUgY29sdW1ucy4gIEhlcmUgd2Ugc2tpcCB1bmxlc3Mgd2Ug bWFuYWdlZCB0bwoJCSAqIG1hdGNoIHRvIGF0IGxlYXN0IHR3byBjb2x1bW5zLgoJCSAqLwoJ CWlmIChuc2hhcmVkX3ZhcnMgKyBuc2hhcmVkX2V4cHJzIDwgMikKCQkJY29udGludWU7CgoJ CS8qCgkJICogQ2hlY2sgaWYgdGhlc2Ugc3RhdGlzdGljcyBhcmUgYSBiZXR0ZXIgbWF0Y2gg dGhhbiB0aGUgcHJldmlvdXMgYmVzdAoJCSAqIG1hdGNoIGFuZCBpZiBzbywgdGFrZSBub3Rl IG9mIHRoZSBTdGF0aXN0aWNFeHRJbmZvLgoJCSAqCgkJICogVGhlIHN0YXRzbGlzdCBpcyBz b3J0ZWQgYnkgc3RhdE9pZCwgc28gdGhlIFN0YXRpc3RpY0V4dEluZm8gd2UKCQkgKiBzZWxl Y3QgYXMgdGhlIGJlc3QgbWF0Y2ggaXMgZGV0ZXJtaW5pc3RpYyBldmVuIHdoZW4gbXVsdGlw bGUgc2V0cwoJCSAqIG9mIHN0YXRpc3RpY3MgbWF0Y2ggZXF1YWxseSBhcyB3ZWxsLgoJCSAq LwoJCWlmICgobnNoYXJlZF9leHBycyA+IG5tYXRjaGVzX2V4cHJzKSB8fAoJCQkoKChuc2hh cmVkX2V4cHJzID09IG5tYXRjaGVzX2V4cHJzKSkgJiYgKG5zaGFyZWRfdmFycyA+IG5tYXRj aGVzX3ZhcnMpKSkKCQl7CgkJCXN0YXRPaWQgPSBpbmZvLT5zdGF0T2lkOwoJCQlubWF0Y2hl c192YXJzID0gbnNoYXJlZF92YXJzOwoJCQlubWF0Y2hlc19leHBycyA9IG5zaGFyZWRfZXhw cnM7CgkJCW1hdGNoZWRfaW5mbyA9IGluZm87CgkJfQoJfQoKCS8qIE5vIG1hdGNoPyAqLwoJ aWYgKHN0YXRPaWQgPT0gSW52YWxpZE9pZCkKCQlyZXR1cm4gZmFsc2U7CgoJQXNzZXJ0KG5t YXRjaGVzX3ZhcnMgKyBubWF0Y2hlc19leHBycyA+IDEpOwoKCXN0YXRzID0gc3RhdGV4dF9u ZGlzdGluY3RfbG9hZChzdGF0T2lkLCBydGUtPmluaCk7CgoJLyoKCSAqIElmIHdlIGhhdmUg YSBtYXRjaCwgc2VhcmNoIGl0IGZvciB0aGUgc3BlY2lmaWMgaXRlbSB0aGF0IG1hdGNoZXMg KHRoZXJlCgkgKiBtdXN0IGJlIG9uZSksIGFuZCBjb25zdHJ1Y3QgdGhlIG91dHB1dCB2YWx1 ZXMuCgkgKi8KCWlmIChzdGF0cykKCXsKCQlpbnQJCQlpOwoJCUxpc3QJICAgKm5ld2xpc3Qg PSBOSUw7CgkJTVZORGlzdGluY3RJdGVtICppdGVtID0gTlVMTDsKCQlMaXN0Q2VsbCAgICps YzI7CgkJQml0bWFwc2V0ICAqbWF0Y2hlZCA9IE5VTEw7CgkJQXR0ck51bWJlcglhdHRudW1f b2Zmc2V0OwoKCQkvKgoJCSAqIEhvdyBtdWNoIHdlIG5lZWQgdG8gb2Zmc2V0IHRoZSBhdHRu dW1zPyBJZiB0aGVyZSBhcmUgbm8KCQkgKiBleHByZXNzaW9ucywgbm8gb2Zmc2V0IGlzIG5l ZWRlZC4gT3RoZXJ3aXNlIG9mZnNldCBlbm91Z2ggdG8gbW92ZQoJCSAqIHRoZSBsb3dlc3Qg b25lICh3aGljaCBpcyBlcXVhbCB0byBudW1iZXIgb2YgZXhwcmVzc2lvbnMpIHRvIDEuCgkJ ICovCgkJaWYgKG1hdGNoZWRfaW5mby0+ZXhwcnMpCgkJCWF0dG51bV9vZmZzZXQgPSAobGlz dF9sZW5ndGgobWF0Y2hlZF9pbmZvLT5leHBycykgKyAxKTsKCQllbHNlCgkJCWF0dG51bV9v ZmZzZXQgPSAwOwoKCQkvKiBzZWUgd2hhdCBhY3R1YWxseSBtYXRjaGVkICovCgkJZm9yZWFj aChsYzIsICp2YXJpbmZvcykKCQl7CgkJCUxpc3RDZWxsICAgKmxjMzsKCQkJaW50CQkJaWR4 OwoJCQlib29sCQlmb3VuZCA9IGZhbHNlOwoKCQkJR3JvdXBWYXJJbmZvICp2YXJpbmZvID0g KEdyb3VwVmFySW5mbyAqKSBsZmlyc3QobGMyKTsKCgkJCS8qCgkJCSAqIFByb2Nlc3MgYSBz aW1wbGUgVmFyIGV4cHJlc3Npb24sIGJ5IG1hdGNoaW5nIGl0IHRvIGtleXMKCQkJICogZGly ZWN0bHkuIElmIHRoZXJlJ3MgYSBtYXRjaGluZyBleHByZXNzaW9uLCB3ZSdsbCB0cnkgbWF0 Y2hpbmcKCQkJICogaXQgbGF0ZXIuCgkJCSAqLwoJCQlpZiAoSXNBKHZhcmluZm8tPnZhciwg VmFyKSkKCQkJewoJCQkJQXR0ck51bWJlcglhdHRudW0gPSAoKFZhciAqKSB2YXJpbmZvLT52 YXIpLT52YXJhdHRubzsKCgkJCQkvKgoJCQkJICogSWdub3JlIGV4cHJlc3Npb25zIG9uIHN5 c3RlbSBhdHRyaWJ1dGVzLiBDYW4ndCByZWx5IG9uIHRoZQoJCQkJICogYm1zIGNoZWNrIGZv ciBuZWdhdGl2ZSB2YWx1ZXMuCgkJCQkgKi8KCQkJCWlmICghQXR0ck51bWJlcklzRm9yVXNl ckRlZmluZWRBdHRyKGF0dG51bSkpCgkJCQkJY29udGludWU7CgoJCQkJLyogSXMgdGhlIHZh cmlhYmxlIGNvdmVyZWQgYnkgdGhlIHN0YXRpc3RpY3Mgb2JqZWN0PyAqLwoJCQkJaWYgKCFi bXNfaXNfbWVtYmVyKGF0dG51bSwgbWF0Y2hlZF9pbmZvLT5rZXlzKSkKCQkJCQljb250aW51 ZTsKCgkJCQlhdHRudW0gPSBhdHRudW0gKyBhdHRudW1fb2Zmc2V0OwoKCQkJCS8qIGVuc3Vy ZSBzdWZmaWNpZW50IG9mZnNldCAqLwoJCQkJQXNzZXJ0KEF0dHJOdW1iZXJJc0ZvclVzZXJE ZWZpbmVkQXR0cihhdHRudW0pKTsKCgkJCQltYXRjaGVkID0gYm1zX2FkZF9tZW1iZXIobWF0 Y2hlZCwgYXR0bnVtKTsKCgkJCQlmb3VuZCA9IHRydWU7CgkJCX0KCgkJCS8qCgkJCSAqIFhY WCBNYXliZSB3ZSBzaG91bGQgYWxsb3cgc2VhcmNoaW5nIHRoZSBleHByZXNzaW9ucyBldmVu IGlmIHdlCgkJCSAqIGZvdW5kIGFuIGF0dHJpYnV0ZSBtYXRjaGluZyB0aGUgZXhwcmVzc2lv bj8gVGhhdCB3b3VsZCBoYW5kbGUKCQkJICogdHJpdmlhbCBleHByZXNzaW9ucyBsaWtlICIo YSkiIGJ1dCBpdCBzZWVtcyBmYWlybHkgdXNlbGVzcy4KCQkJICovCgkJCWlmIChmb3VuZCkK CQkJCWNvbnRpbnVlOwoKCQkJLyogZXhwcmVzc2lvbiAtIHNlZSBpZiBpdCdzIGluIHRoZSBz dGF0aXN0aWNzIG9iamVjdCAqLwoJCQlpZHggPSAwOwoJCQlmb3JlYWNoKGxjMywgbWF0Y2hl ZF9pbmZvLT5leHBycykKCQkJewoJCQkJTm9kZQkgICAqZXhwciA9IChOb2RlICopIGxmaXJz dChsYzMpOwoKCQkJCWlmIChlcXVhbCh2YXJpbmZvLT52YXIsIGV4cHIpKQoJCQkJewoJCQkJ CUF0dHJOdW1iZXIJYXR0bnVtID0gLShpZHggKyAxKTsKCgkJCQkJYXR0bnVtID0gYXR0bnVt ICsgYXR0bnVtX29mZnNldDsKCgkJCQkJLyogZW5zdXJlIHN1ZmZpY2llbnQgb2Zmc2V0ICov CgkJCQkJQXNzZXJ0KEF0dHJOdW1iZXJJc0ZvclVzZXJEZWZpbmVkQXR0cihhdHRudW0pKTsK CgkJCQkJbWF0Y2hlZCA9IGJtc19hZGRfbWVtYmVyKG1hdGNoZWQsIGF0dG51bSk7CgoJCQkJ CS8qIHRoZXJlIHNob3VsZCBiZSBqdXN0IG9uZSBtYXRjaGluZyBleHByZXNzaW9uICovCgkJ CQkJYnJlYWs7CgkJCQl9CgoJCQkJaWR4Kys7CgkJCX0KCQl9CgoJCS8qIEZpbmQgdGhlIHNw ZWNpZmljIGl0ZW0gdGhhdCBleGFjdGx5IG1hdGNoZXMgdGhlIGNvbWJpbmF0aW9uICovCgkJ Zm9yIChpID0gMDsgaSA8IHN0YXRzLT5uaXRlbXM7IGkrKykKCQl7CgkJCWludAkJCWo7CgkJ CU1WTkRpc3RpbmN0SXRlbSAqdG1waXRlbSA9ICZzdGF0cy0+aXRlbXNbaV07CgoJCQlpZiAo dG1waXRlbS0+bmF0dHJpYnV0ZXMgIT0gYm1zX251bV9tZW1iZXJzKG1hdGNoZWQpKQoJCQkJ Y29udGludWU7CgoJCQkvKiBhc3N1bWUgaXQncyB0aGUgcmlnaHQgaXRlbSAqLwoJCQlpdGVt ID0gdG1waXRlbTsKCgkJCS8qIGNoZWNrIHRoYXQgYWxsIGl0ZW0gYXR0cmlidXRlcy9leHBy ZXNzaW9ucyBmaXQgdGhlIG1hdGNoICovCgkJCWZvciAoaiA9IDA7IGogPCB0bXBpdGVtLT5u YXR0cmlidXRlczsgaisrKQoJCQl7CgkJCQlBdHRyTnVtYmVyCWF0dG51bSA9IHRtcGl0ZW0t PmF0dHJpYnV0ZXNbal07CgoJCQkJLyoKCQkJCSAqIFRoYW5rcyB0byBob3cgd2UgY29uc3Ry dWN0ZWQgdGhlIG1hdGNoZWQgYml0bWFwIGFib3ZlLCB3ZQoJCQkJICogY2FuIGp1c3Qgb2Zm c2V0IGFsbCBhdHRudW1zIHRoZSBzYW1lIHdheS4KCQkJCSAqLwoJCQkJYXR0bnVtID0gYXR0 bnVtICsgYXR0bnVtX29mZnNldDsKCgkJCQlpZiAoIWJtc19pc19tZW1iZXIoYXR0bnVtLCBt YXRjaGVkKSkKCQkJCXsKCQkJCQkvKiBuYWgsIGl0J3Mgbm90IHRoaXMgaXRlbSAqLwoJCQkJ CWl0ZW0gPSBOVUxMOwoJCQkJCWJyZWFrOwoJCQkJfQoJCQl9CgoJCQkvKgoJCQkgKiBJZiB0 aGUgaXRlbSBoYXMgYWxsIHRoZSBtYXRjaGVkIGF0dHJpYnV0ZXMsIHdlIGtub3cgaXQncyB0 aGUKCQkJICogcmlnaHQgb25lIC0gdGhlcmUgY2FuJ3QgYmUgYSBiZXR0ZXIgb25lLiBtYXRj aGluZyBtb3JlLgoJCQkgKi8KCQkJaWYgKGl0ZW0pCgkJCQlicmVhazsKCQl9CgoJCS8qCgkJ ICogTWFrZSBzdXJlIHdlIGZvdW5kIGFuIGl0ZW0uIFRoZXJlIGhhcyB0byBiZSBvbmUsIGJl Y2F1c2UgbmRpc3RpbmN0CgkJICogc3RhdGlzdGljcyBpbmNsdWRlcyBhbGwgY29tYmluYXRp b25zIG9mIGF0dHJpYnV0ZXMuCgkJICovCgkJaWYgKCFpdGVtKQoJCQllbG9nKEVSUk9SLCAi Y29ycnVwdCBNVk5EaXN0aW5jdCBlbnRyeSIpOwoKCQkvKiBGb3JtIHRoZSBvdXRwdXQgdmFy aW5mbyBsaXN0LCBrZWVwaW5nIG9ubHkgdW5tYXRjaGVkIG9uZXMgKi8KCQlmb3JlYWNoKGxj LCAqdmFyaW5mb3MpCgkJewoJCQlHcm91cFZhckluZm8gKnZhcmluZm8gPSAoR3JvdXBWYXJJ bmZvICopIGxmaXJzdChsYyk7CgkJCUxpc3RDZWxsICAgKmxjMzsKCQkJYm9vbAkJZm91bmQg PSBmYWxzZTsKCgkJCS8qCgkJCSAqIExldCdzIGxvb2sgYXQgcGxhaW4gdmFyaWFibGVzIGZp cnN0LCBiZWNhdXNlIGl0J3MgdGhlIG1vc3QKCQkJICogY29tbW9uIGNhc2UgYW5kIHRoZSBj aGVjayBpcyBxdWl0ZSBjaGVhcC4gV2UgY2FuIHNpbXBseSBnZXQgdGhlCgkJCSAqIGF0dG51 bSBhbmQgY2hlY2sgKHdpdGggYW4gb2Zmc2V0KSBtYXRjaGVkIGJpdG1hcC4KCQkJICovCgkJ CWlmIChJc0EodmFyaW5mby0+dmFyLCBWYXIpKQoJCQl7CgkJCQlBdHRyTnVtYmVyCWF0dG51 bSA9ICgoVmFyICopIHZhcmluZm8tPnZhciktPnZhcmF0dG5vOwoKCQkJCS8qCgkJCQkgKiBJ ZiBpdCdzIGEgc3lzdGVtIGF0dHJpYnV0ZSwgd2UncmUgZG9uZS4gV2UgZG9uJ3Qgc3VwcG9y dAoJCQkJICogZXh0ZW5kZWQgc3RhdGlzdGljcyBvbiBzeXN0ZW0gYXR0cmlidXRlcywgc28g aXQncyBjbGVhcmx5CgkJCQkgKiBub3QgbWF0Y2hlZC4gSnVzdCBrZWVwIHRoZSBleHByZXNz aW9uIGFuZCBjb250aW51ZS4KCQkJCSAqLwoJCQkJaWYgKCFBdHRyTnVtYmVySXNGb3JVc2Vy RGVmaW5lZEF0dHIoYXR0bnVtKSkKCQkJCXsKCQkJCQluZXdsaXN0ID0gbGFwcGVuZChuZXds aXN0LCB2YXJpbmZvKTsKCQkJCQljb250aW51ZTsKCQkJCX0KCgkJCQkvKiBhcHBseSB0aGUg c2FtZSBvZmZzZXQgYXMgYWJvdmUgKi8KCQkJCWF0dG51bSArPSBhdHRudW1fb2Zmc2V0OwoK CQkJCS8qIGlmIGl0J3Mgbm90IG1hdGNoZWQsIGtlZXAgdGhlIHZhcmluZm8gKi8KCQkJCWlm ICghYm1zX2lzX21lbWJlcihhdHRudW0sIG1hdGNoZWQpKQoJCQkJCW5ld2xpc3QgPSBsYXBw ZW5kKG5ld2xpc3QsIHZhcmluZm8pOwoKCQkJCS8qIFRoZSByZXN0IG9mIHRoZSBsb29wIGRl YWxzIHdpdGggY29tcGxleCBleHByZXNzaW9ucy4gKi8KCQkJCWNvbnRpbnVlOwoJCQl9CgoJ CQkvKgoJCQkgKiBQcm9jZXNzIGNvbXBsZXggZXhwcmVzc2lvbnMsIG5vdCBqdXN0IHNpbXBs ZSBWYXJzLgoJCQkgKgoJCQkgKiBGaXJzdCwgd2Ugc2VhcmNoIGZvciBhbiBleGFjdCBtYXRj aCBvZiBhbiBleHByZXNzaW9uLiBJZiB3ZQoJCQkgKiBmaW5kIG9uZSwgd2UgY2FuIGp1c3Qg ZGlzY2FyZCB0aGUgd2hvbGUgR3JvdXBWYXJJbmZvLCB3aXRoIGFsbAoJCQkgKiB0aGUgdmFy aWFibGVzIHdlIGV4dHJhY3RlZCBmcm9tIGl0LgoJCQkgKgoJCQkgKiBPdGhlcndpc2Ugd2Ug aW5zcGVjdCB0aGUgaW5kaXZpZHVhbCB2YXJzLCBhbmQgdHJ5IG1hdGNoaW5nIGl0CgkJCSAq IHRvIHZhcmlhYmxlcyBpbiB0aGUgaXRlbS4KCQkJICovCgkJCWZvcmVhY2gobGMzLCBtYXRj aGVkX2luZm8tPmV4cHJzKQoJCQl7CgkJCQlOb2RlCSAgICpleHByID0gKE5vZGUgKikgbGZp cnN0KGxjMyk7CgoJCQkJaWYgKGVxdWFsKHZhcmluZm8tPnZhciwgZXhwcikpCgkJCQl7CgkJ CQkJZm91bmQgPSB0cnVlOwoJCQkJCWJyZWFrOwoJCQkJfQoJCQl9CgoJCQkvKiBmb3VuZCBl eGFjdCBtYXRjaCwgc2tpcCAqLwoJCQlpZiAoZm91bmQpCgkJCQljb250aW51ZTsKCgkJCW5l d2xpc3QgPSBsYXBwZW5kKG5ld2xpc3QsIHZhcmluZm8pOwoJCX0KCgkJKnZhcmluZm9zID0g bmV3bGlzdDsKCQkqbmRpc3RpbmN0ID0gaXRlbS0+bmRpc3RpbmN0OwoJCXJldHVybiB0cnVl OwoJfQoKCXJldHVybiBmYWxzZTsKfQoKLyoKICogY29udmVydF90b19zY2FsYXIKICoJICBD b252ZXJ0IG5vbi1OVUxMIHZhbHVlcyBvZiB0aGUgaW5kaWNhdGVkIHR5cGVzIHRvIHRoZSBj b21wYXJpc29uCiAqCSAgc2NhbGUgbmVlZGVkIGJ5IHNjYWxhcmluZXFzZWwoKS4KICoJICBS ZXR1cm5zICJ0cnVlIiBpZiBzdWNjZXNzZnVsLgogKgogKiBYWFggdGhpcyByb3V0aW5lIGlz IGEgaGFjazogaWRlYWxseSB3ZSBzaG91bGQgbG9vayB1cCB0aGUgY29udmVyc2lvbgogKiBz dWJyb3V0aW5lcyBpbiBwZ190eXBlLgogKgogKiBBbGwgbnVtZXJpYyBkYXRhdHlwZXMgYXJl IHNpbXBseSBjb252ZXJ0ZWQgdG8gdGhlaXIgZXF1aXZhbGVudAogKiAiZG91YmxlIiB2YWx1 ZXMuICAoTlVNRVJJQyB2YWx1ZXMgdGhhdCBhcmUgb3V0c2lkZSB0aGUgcmFuZ2Ugb2YgImRv dWJsZSIKICogYXJlIGNsYW1wZWQgdG8gKy8tIEhVR0VfVkFMLikKICoKICogU3RyaW5nIGRh dGF0eXBlcyBhcmUgY29udmVydGVkIGJ5IGNvbnZlcnRfc3RyaW5nX3RvX3NjYWxhcigpLAog KiB3aGljaCBpcyBleHBsYWluZWQgYmVsb3cuICBUaGUgcmVhc29uIHdoeSB0aGlzIHJvdXRp bmUgZGVhbHMgd2l0aAogKiB0aHJlZSB2YWx1ZXMgYXQgYSB0aW1lLCBub3QganVzdCBvbmUs IGlzIHRoYXQgd2UgbmVlZCBpdCBmb3Igc3RyaW5ncy4KICoKICogVGhlIGJ5dGVhIGRhdGF0 eXBlIGlzIGp1c3QgZW5vdWdoIGRpZmZlcmVudCBmcm9tIHN0cmluZ3MgdGhhdCBpdCBoYXMK ICogdG8gYmUgdHJlYXRlZCBzZXBhcmF0ZWx5LgogKgogKiBUaGUgc2V2ZXJhbCBkYXRhdHlw ZXMgcmVwcmVzZW50aW5nIGFic29sdXRlIHRpbWVzIGFyZSBhbGwgY29udmVydGVkCiAqIHRv IFRpbWVzdGFtcCwgd2hpY2ggaXMgYWN0dWFsbHkgYW4gaW50NjQsIGFuZCB0aGVuIHdlIHBy b21vdGUgdGhhdCB0bwogKiBhIGRvdWJsZS4gIE5vdGUgdGhpcyB3aWxsIGdpdmUgY29ycmVj dCByZXN1bHRzIGV2ZW4gZm9yIHRoZSAic3BlY2lhbCIKICogdmFsdWVzIG9mIFRpbWVzdGFt cCwgc2luY2UgdGhvc2UgYXJlIGNob3NlbiB0byBjb21wYXJlIGNvcnJlY3RseTsKICogc2Vl IHRpbWVzdGFtcF9jbXAuCiAqCiAqIFRoZSBzZXZlcmFsIGRhdGF0eXBlcyByZXByZXNlbnRp bmcgcmVsYXRpdmUgdGltZXMgKGludGVydmFscykgYXJlIGFsbAogKiBjb252ZXJ0ZWQgdG8g bWVhc3VyZW1lbnRzIGV4cHJlc3NlZCBpbiBzZWNvbmRzLgogKi8Kc3RhdGljIGJvb2wKY29u dmVydF90b19zY2FsYXIoRGF0dW0gdmFsdWUsIE9pZCB2YWx1ZXR5cGlkLCBPaWQgY29sbGlk LCBkb3VibGUgKnNjYWxlZHZhbHVlLAoJCQkJICBEYXR1bSBsb2JvdW5kLCBEYXR1bSBoaWJv dW5kLCBPaWQgYm91bmRzdHlwaWQsCgkJCQkgIGRvdWJsZSAqc2NhbGVkbG9ib3VuZCwgZG91 YmxlICpzY2FsZWRoaWJvdW5kKQp7Cglib29sCQlmYWlsdXJlID0gZmFsc2U7CgoJLyoKCSAq IEJvdGggdGhlIHZhbHVldHlwaWQgYW5kIHRoZSBib3VuZHN0eXBpZCBzaG91bGQgZXhhY3Rs eSBtYXRjaCB0aGUKCSAqIGRlY2xhcmVkIGlucHV0IHR5cGUocykgb2YgdGhlIG9wZXJhdG9y IHdlIGFyZSBpbnZva2VkIGZvci4gIEhvd2V2ZXIsCgkgKiBleHRlbnNpb25zIG1pZ2h0IHRy eSB0byB1c2Ugc2NhbGFyaW5lcXNlbCBhcyBlc3RpbWF0b3IgZm9yIG9wZXJhdG9ycwoJICog d2l0aCBpbnB1dCB0eXBlKHMpIHdlIGRvbid0IGhhbmRsZSBoZXJlOyBpbiBzdWNoIGNhc2Vz LCB3ZSB3YW50IHRvCgkgKiByZXR1cm4gZmFsc2UsIG5vdCBmYWlsLiAgSW4gYW55IGNhc2Us IHdlIG11c3RuJ3QgYXNzdW1lIHRoYXQgdmFsdWV0eXBpZAoJICogYW5kIGJvdW5kc3R5cGlk IGFyZSBpZGVudGljYWwuCgkgKgoJICogWFhYIFRoZSBoaXN0b2dyYW0gd2UgYXJlIGludGVy cG9sYXRpbmcgYmV0d2VlbiBwb2ludHMgb2YgY291bGQgYmVsb25nCgkgKiB0byBhIGNvbHVt biB0aGF0J3Mgb25seSBiaW5hcnktY29tcGF0aWJsZSB3aXRoIHRoZSBkZWNsYXJlZCB0eXBl LiBJbgoJICogZXNzZW5jZSB3ZSBhcmUgYXNzdW1pbmcgdGhhdCB0aGUgc2VtYW50aWNzIG9m IGJpbmFyeS1jb21wYXRpYmxlIHR5cGVzCgkgKiBhcmUgZW5vdWdoIGFsaWtlIHRoYXQgd2Ug Y2FuIHVzZSBhIGhpc3RvZ3JhbSBnZW5lcmF0ZWQgd2l0aCBvbmUgdHlwZSdzCgkgKiBvcGVy YXRvcnMgdG8gZXN0aW1hdGUgc2VsZWN0aXZpdHkgZm9yIHRoZSBvdGhlcidzLiAgVGhpcyBp cyBvdXRyaWdodAoJICogd3JvbmcgaW4gc29tZSBjYXNlcyAtLS0gaW4gcGFydGljdWxhciBz aWduZWQgdmVyc3VzIHVuc2lnbmVkCgkgKiBpbnRlcnByZXRhdGlvbiBjb3VsZCB0cmlwIHVz IHVwLiAgQnV0IGl0J3MgdXNlZnVsIGVub3VnaCBpbiB0aGUKCSAqIG1ham9yaXR5IG9mIGNh c2VzIHRoYXQgd2UgZG8gaXQgYW55d2F5LiAgU2hvdWxkIHRoaW5rIGFib3V0IG1vcmUKCSAq IHJpZ29yb3VzIHdheXMgdG8gZG8gaXQuCgkgKi8KCXN3aXRjaCAodmFsdWV0eXBpZCkKCXsK CQkJLyoKCQkJICogQnVpbHQtaW4gbnVtZXJpYyB0eXBlcwoJCQkgKi8KCQljYXNlIEJPT0xP SUQ6CgkJY2FzZSBJTlQyT0lEOgoJCWNhc2UgSU5UNE9JRDoKCQljYXNlIElOVDhPSUQ6CgkJ Y2FzZSBGTE9BVDRPSUQ6CgkJY2FzZSBGTE9BVDhPSUQ6CgkJY2FzZSBOVU1FUklDT0lEOgoJ CWNhc2UgT0lET0lEOgoJCWNhc2UgUkVHUFJPQ09JRDoKCQljYXNlIFJFR1BST0NFRFVSRU9J RDoKCQljYXNlIFJFR09QRVJPSUQ6CgkJY2FzZSBSRUdPUEVSQVRPUk9JRDoKCQljYXNlIFJF R0NMQVNTT0lEOgoJCWNhc2UgUkVHVFlQRU9JRDoKCQljYXNlIFJFR0NPTExBVElPTk9JRDoK CQljYXNlIFJFR0NPTkZJR09JRDoKCQljYXNlIFJFR0RJQ1RJT05BUllPSUQ6CgkJY2FzZSBS RUdST0xFT0lEOgoJCWNhc2UgUkVHTkFNRVNQQUNFT0lEOgoJCWNhc2UgUkVHREFUQUJBU0VP SUQ6CgkJCSpzY2FsZWR2YWx1ZSA9IGNvbnZlcnRfbnVtZXJpY190b19zY2FsYXIodmFsdWUs IHZhbHVldHlwaWQsCgkJCQkJCQkJCQkJCQkgJmZhaWx1cmUpOwoJCQkqc2NhbGVkbG9ib3Vu ZCA9IGNvbnZlcnRfbnVtZXJpY190b19zY2FsYXIobG9ib3VuZCwgYm91bmRzdHlwaWQsCgkJ CQkJCQkJCQkJCQkgICAmZmFpbHVyZSk7CgkJCSpzY2FsZWRoaWJvdW5kID0gY29udmVydF9u dW1lcmljX3RvX3NjYWxhcihoaWJvdW5kLCBib3VuZHN0eXBpZCwKCQkJCQkJCQkJCQkJCSAg ICZmYWlsdXJlKTsKCQkJcmV0dXJuICFmYWlsdXJlOwoKCQkJLyoKCQkJICogQnVpbHQtaW4g c3RyaW5nIHR5cGVzCgkJCSAqLwoJCWNhc2UgQ0hBUk9JRDoKCQljYXNlIEJQQ0hBUk9JRDoK CQljYXNlIFZBUkNIQVJPSUQ6CgkJY2FzZSBURVhUT0lEOgoJCWNhc2UgTkFNRU9JRDoKCQkJ ewoJCQkJY2hhcgkgICAqdmFsc3RyID0gY29udmVydF9zdHJpbmdfZGF0dW0odmFsdWUsIHZh bHVldHlwaWQsCgkJCQkJCQkJCQkJCQkJICBjb2xsaWQsICZmYWlsdXJlKTsKCQkJCWNoYXIJ ICAgKmxvc3RyID0gY29udmVydF9zdHJpbmdfZGF0dW0obG9ib3VuZCwgYm91bmRzdHlwaWQs CgkJCQkJCQkJCQkJCQkJIGNvbGxpZCwgJmZhaWx1cmUpOwoJCQkJY2hhcgkgICAqaGlzdHIg PSBjb252ZXJ0X3N0cmluZ19kYXR1bShoaWJvdW5kLCBib3VuZHN0eXBpZCwKCQkJCQkJCQkJ CQkJCQkgY29sbGlkLCAmZmFpbHVyZSk7CgoJCQkJLyoKCQkJCSAqIEJhaWwgb3V0IGlmIGFu eSBvZiB0aGUgdmFsdWVzIGlzIG5vdCBvZiBzdHJpbmcgdHlwZS4gIFdlCgkJCQkgKiBtaWdo dCBsZWFrIGNvbnZlcnRlZCBzdHJpbmdzIGZvciB0aGUgb3RoZXIgdmFsdWUocyksIGJ1dAoJ CQkJICogdGhhdCdzIG5vdCB3b3J0aCB0cm91Ymxpbmcgb3Zlci4KCQkJCSAqLwoJCQkJaWYg KGZhaWx1cmUpCgkJCQkJcmV0dXJuIGZhbHNlOwoKCQkJCWNvbnZlcnRfc3RyaW5nX3RvX3Nj YWxhcih2YWxzdHIsIHNjYWxlZHZhbHVlLAoJCQkJCQkJCQkJIGxvc3RyLCBzY2FsZWRsb2Jv dW5kLAoJCQkJCQkJCQkJIGhpc3RyLCBzY2FsZWRoaWJvdW5kKTsKCQkJCXBmcmVlKHZhbHN0 cik7CgkJCQlwZnJlZShsb3N0cik7CgkJCQlwZnJlZShoaXN0cik7CgkJCQlyZXR1cm4gdHJ1 ZTsKCQkJfQoKCQkJLyoKCQkJICogQnVpbHQtaW4gYnl0ZWEgdHlwZQoJCQkgKi8KCQljYXNl IEJZVEVBT0lEOgoJCQl7CgkJCQkvKiBXZSBvbmx5IHN1cHBvcnQgYnl0ZWEgdnMgYnl0ZWEg Y29tcGFyaXNvbiAqLwoJCQkJaWYgKGJvdW5kc3R5cGlkICE9IEJZVEVBT0lEKQoJCQkJCXJl dHVybiBmYWxzZTsKCQkJCWNvbnZlcnRfYnl0ZWFfdG9fc2NhbGFyKHZhbHVlLCBzY2FsZWR2 YWx1ZSwKCQkJCQkJCQkJCWxvYm91bmQsIHNjYWxlZGxvYm91bmQsCgkJCQkJCQkJCQloaWJv dW5kLCBzY2FsZWRoaWJvdW5kKTsKCQkJCXJldHVybiB0cnVlOwoJCQl9CgoJCQkvKgoJCQkg KiBCdWlsdC1pbiB0aW1lIHR5cGVzCgkJCSAqLwoJCWNhc2UgVElNRVNUQU1QT0lEOgoJCWNh c2UgVElNRVNUQU1QVFpPSUQ6CgkJY2FzZSBEQVRFT0lEOgoJCWNhc2UgSU5URVJWQUxPSUQ6 CgkJY2FzZSBUSU1FT0lEOgoJCWNhc2UgVElNRVRaT0lEOgoJCQkqc2NhbGVkdmFsdWUgPSBj b252ZXJ0X3RpbWV2YWx1ZV90b19zY2FsYXIodmFsdWUsIHZhbHVldHlwaWQsCgkJCQkJCQkJ CQkJCQkgICAmZmFpbHVyZSk7CgkJCSpzY2FsZWRsb2JvdW5kID0gY29udmVydF90aW1ldmFs dWVfdG9fc2NhbGFyKGxvYm91bmQsIGJvdW5kc3R5cGlkLAoJCQkJCQkJCQkJCQkJCSAmZmFp bHVyZSk7CgkJCSpzY2FsZWRoaWJvdW5kID0gY29udmVydF90aW1ldmFsdWVfdG9fc2NhbGFy KGhpYm91bmQsIGJvdW5kc3R5cGlkLAoJCQkJCQkJCQkJCQkJCSAmZmFpbHVyZSk7CgkJCXJl dHVybiAhZmFpbHVyZTsKCgkJCS8qCgkJCSAqIEJ1aWx0LWluIG5ldHdvcmsgdHlwZXMKCQkJ ICovCgkJY2FzZSBJTkVUT0lEOgoJCWNhc2UgQ0lEUk9JRDoKCQljYXNlIE1BQ0FERFJPSUQ6 CgkJY2FzZSBNQUNBRERSOE9JRDoKCQkJKnNjYWxlZHZhbHVlID0gY29udmVydF9uZXR3b3Jr X3RvX3NjYWxhcih2YWx1ZSwgdmFsdWV0eXBpZCwKCQkJCQkJCQkJCQkJCSAmZmFpbHVyZSk7 CgkJCSpzY2FsZWRsb2JvdW5kID0gY29udmVydF9uZXR3b3JrX3RvX3NjYWxhcihsb2JvdW5k LCBib3VuZHN0eXBpZCwKCQkJCQkJCQkJCQkJCSAgICZmYWlsdXJlKTsKCQkJKnNjYWxlZGhp Ym91bmQgPSBjb252ZXJ0X25ldHdvcmtfdG9fc2NhbGFyKGhpYm91bmQsIGJvdW5kc3R5cGlk LAoJCQkJCQkJCQkJCQkJICAgJmZhaWx1cmUpOwoJCQlyZXR1cm4gIWZhaWx1cmU7Cgl9Cgkv KiBEb24ndCBrbm93IGhvdyB0byBjb252ZXJ0ICovCgkqc2NhbGVkdmFsdWUgPSAqc2NhbGVk bG9ib3VuZCA9ICpzY2FsZWRoaWJvdW5kID0gMDsKCXJldHVybiBmYWxzZTsKfQoKLyoKICog RG8gY29udmVydF90b19zY2FsYXIoKSdzIHdvcmsgZm9yIGFueSBudW1lcmljIGRhdGEgdHlw ZS4KICoKICogT24gZmFpbHVyZSAoZS5nLiwgdW5zdXBwb3J0ZWQgdHlwaWQpLCBzZXQgKmZh aWx1cmUgdG8gdHJ1ZTsKICogb3RoZXJ3aXNlLCB0aGF0IHZhcmlhYmxlIGlzIG5vdCBjaGFu Z2VkLgogKi8Kc3RhdGljIGRvdWJsZQpjb252ZXJ0X251bWVyaWNfdG9fc2NhbGFyKERhdHVt IHZhbHVlLCBPaWQgdHlwaWQsIGJvb2wgKmZhaWx1cmUpCnsKCXN3aXRjaCAodHlwaWQpCgl7 CgkJY2FzZSBCT09MT0lEOgoJCQlyZXR1cm4gKGRvdWJsZSkgRGF0dW1HZXRCb29sKHZhbHVl KTsKCQljYXNlIElOVDJPSUQ6CgkJCXJldHVybiAoZG91YmxlKSBEYXR1bUdldEludDE2KHZh bHVlKTsKCQljYXNlIElOVDRPSUQ6CgkJCXJldHVybiAoZG91YmxlKSBEYXR1bUdldEludDMy KHZhbHVlKTsKCQljYXNlIElOVDhPSUQ6CgkJCXJldHVybiAoZG91YmxlKSBEYXR1bUdldElu dDY0KHZhbHVlKTsKCQljYXNlIEZMT0FUNE9JRDoKCQkJcmV0dXJuIChkb3VibGUpIERhdHVt R2V0RmxvYXQ0KHZhbHVlKTsKCQljYXNlIEZMT0FUOE9JRDoKCQkJcmV0dXJuIChkb3VibGUp IERhdHVtR2V0RmxvYXQ4KHZhbHVlKTsKCQljYXNlIE5VTUVSSUNPSUQ6CgkJCS8qIE5vdGU6 IG91dC1vZi1yYW5nZSB2YWx1ZXMgd2lsbCBiZSBjbGFtcGVkIHRvICstSFVHRV9WQUwgKi8K CQkJcmV0dXJuIChkb3VibGUpCgkJCQlEYXR1bUdldEZsb2F0OChEaXJlY3RGdW5jdGlvbkNh bGwxKG51bWVyaWNfZmxvYXQ4X25vX292ZXJmbG93LAoJCQkJCQkJCQkJCQkgICB2YWx1ZSkp OwoJCWNhc2UgT0lET0lEOgoJCWNhc2UgUkVHUFJPQ09JRDoKCQljYXNlIFJFR1BST0NFRFVS RU9JRDoKCQljYXNlIFJFR09QRVJPSUQ6CgkJY2FzZSBSRUdPUEVSQVRPUk9JRDoKCQljYXNl IFJFR0NMQVNTT0lEOgoJCWNhc2UgUkVHVFlQRU9JRDoKCQljYXNlIFJFR0NPTExBVElPTk9J RDoKCQljYXNlIFJFR0NPTkZJR09JRDoKCQljYXNlIFJFR0RJQ1RJT05BUllPSUQ6CgkJY2Fz ZSBSRUdST0xFT0lEOgoJCWNhc2UgUkVHTkFNRVNQQUNFT0lEOgoJCWNhc2UgUkVHREFUQUJB U0VPSUQ6CgkJCS8qIHdlIGNhbiB0cmVhdCBPSURzIGFzIGludGVnZXJzLi4uICovCgkJCXJl dHVybiAoZG91YmxlKSBEYXR1bUdldE9iamVjdElkKHZhbHVlKTsKCX0KCgkqZmFpbHVyZSA9 IHRydWU7CglyZXR1cm4gMDsKfQoKLyoKICogRG8gY29udmVydF90b19zY2FsYXIoKSdzIHdv cmsgZm9yIGFueSBjaGFyYWN0ZXItc3RyaW5nIGRhdGEgdHlwZS4KICoKICogU3RyaW5nIGRh dGF0eXBlcyBhcmUgY29udmVydGVkIHRvIGEgc2NhbGUgdGhhdCByYW5nZXMgZnJvbSAwIHRv IDEsCiAqIHdoZXJlIHdlIHZpc3VhbGl6ZSB0aGUgYnl0ZXMgb2YgdGhlIHN0cmluZyBhcyBm cmFjdGlvbmFsIGRpZ2l0cy4KICoKICogV2UgZG8gbm90IHdhbnQgdGhlIGJhc2UgdG8gYmUg MjU2LCBob3dldmVyLCBzaW5jZSB0aGF0IHRlbmRzIHRvCiAqIGdlbmVyYXRlIGluZmxhdGVk IHNlbGVjdGl2aXR5IGVzdGltYXRlczsgZmV3IGRhdGFiYXNlcyB3aWxsIGhhdmUKICogb2Nj dXJyZW5jZXMgb2YgYWxsIDI1NiBwb3NzaWJsZSBieXRlIHZhbHVlcyBhdCBlYWNoIHBvc2l0 aW9uLgogKiBJbnN0ZWFkLCB1c2UgdGhlIHNtYWxsZXN0IGFuZCBsYXJnZXN0IGJ5dGUgdmFs dWVzIHNlZW4gaW4gdGhlIGJvdW5kcwogKiBhcyB0aGUgZXN0aW1hdGVkIHJhbmdlIGZvciBl YWNoIGJ5dGUsIGFmdGVyIHNvbWUgZnVkZ2luZyB0byBkZWFsIHdpdGgKICogdGhlIGZhY3Qg dGhhdCB3ZSBwcm9iYWJseSBhcmVuJ3QgZ29pbmcgdG8gc2VlIHRoZSBmdWxsIHJhbmdlIHRo YXQgd2F5LgogKgogKiBBbiBhZGRpdGlvbmFsIHJlZmluZW1lbnQgaXMgdGhhdCB3ZSBkaXNj YXJkIGFueSBjb21tb24gcHJlZml4IG9mIHRoZQogKiB0aHJlZSBzdHJpbmdzIGJlZm9yZSBj b21wdXRpbmcgdGhlIHNjYWxlZCB2YWx1ZXMuICBUaGlzIGFsbG93cyB1cyB0bwogKiAiem9v bSBpbiIgd2hlbiB3ZSBlbmNvdW50ZXIgYSBuYXJyb3cgZGF0YSByYW5nZS4gIEFuIGV4YW1w bGUgaXMgYSBwaG9uZQogKiBudW1iZXIgZGF0YWJhc2Ugd2hlcmUgYWxsIHRoZSB2YWx1ZXMg YmVnaW4gd2l0aCB0aGUgc2FtZSBhcmVhIGNvZGUuCiAqIChBY3R1YWxseSwgdGhlIGJvdW5k cyB3aWxsIGJlIGFkamFjZW50IGhpc3RvZ3JhbS1iaW4tYm91bmRhcnkgdmFsdWVzLAogKiBz byB0aGlzIGlzIG1vcmUgbGlrZWx5IHRvIGhhcHBlbiB0aGFuIHlvdSBtaWdodCB0aGluay4p CiAqLwpzdGF0aWMgdm9pZApjb252ZXJ0X3N0cmluZ190b19zY2FsYXIoY2hhciAqdmFsdWUs CgkJCQkJCSBkb3VibGUgKnNjYWxlZHZhbHVlLAoJCQkJCQkgY2hhciAqbG9ib3VuZCwKCQkJ CQkJIGRvdWJsZSAqc2NhbGVkbG9ib3VuZCwKCQkJCQkJIGNoYXIgKmhpYm91bmQsCgkJCQkJ CSBkb3VibGUgKnNjYWxlZGhpYm91bmQpCnsKCWludAkJCXJhbmdlbG8sCgkJCQlyYW5nZWhp OwoJY2hhcgkgICAqc3B0cjsKCglyYW5nZWxvID0gcmFuZ2VoaSA9ICh1bnNpZ25lZCBjaGFy KSBoaWJvdW5kWzBdOwoJZm9yIChzcHRyID0gbG9ib3VuZDsgKnNwdHI7IHNwdHIrKykKCXsK CQlpZiAocmFuZ2VsbyA+ICh1bnNpZ25lZCBjaGFyKSAqc3B0cikKCQkJcmFuZ2VsbyA9ICh1 bnNpZ25lZCBjaGFyKSAqc3B0cjsKCQlpZiAocmFuZ2VoaSA8ICh1bnNpZ25lZCBjaGFyKSAq c3B0cikKCQkJcmFuZ2VoaSA9ICh1bnNpZ25lZCBjaGFyKSAqc3B0cjsKCX0KCWZvciAoc3B0 ciA9IGhpYm91bmQ7ICpzcHRyOyBzcHRyKyspCgl7CgkJaWYgKHJhbmdlbG8gPiAodW5zaWdu ZWQgY2hhcikgKnNwdHIpCgkJCXJhbmdlbG8gPSAodW5zaWduZWQgY2hhcikgKnNwdHI7CgkJ aWYgKHJhbmdlaGkgPCAodW5zaWduZWQgY2hhcikgKnNwdHIpCgkJCXJhbmdlaGkgPSAodW5z aWduZWQgY2hhcikgKnNwdHI7Cgl9CgkvKiBJZiByYW5nZSBpbmNsdWRlcyBhbnkgdXBwZXIt Y2FzZSBBU0NJSSBjaGFycywgbWFrZSBpdCBpbmNsdWRlIGFsbCAqLwoJaWYgKHJhbmdlbG8g PD0gJ1onICYmIHJhbmdlaGkgPj0gJ0EnKQoJewoJCWlmIChyYW5nZWxvID4gJ0EnKQoJCQly YW5nZWxvID0gJ0EnOwoJCWlmIChyYW5nZWhpIDwgJ1onKQoJCQlyYW5nZWhpID0gJ1onOwoJ fQoJLyogRGl0dG8gbG93ZXItY2FzZSAqLwoJaWYgKHJhbmdlbG8gPD0gJ3onICYmIHJhbmdl aGkgPj0gJ2EnKQoJewoJCWlmIChyYW5nZWxvID4gJ2EnKQoJCQlyYW5nZWxvID0gJ2EnOwoJ CWlmIChyYW5nZWhpIDwgJ3onKQoJCQlyYW5nZWhpID0gJ3onOwoJfQoJLyogRGl0dG8gZGln aXRzICovCglpZiAocmFuZ2VsbyA8PSAnOScgJiYgcmFuZ2VoaSA+PSAnMCcpCgl7CgkJaWYg KHJhbmdlbG8gPiAnMCcpCgkJCXJhbmdlbG8gPSAnMCc7CgkJaWYgKHJhbmdlaGkgPCAnOScp CgkJCXJhbmdlaGkgPSAnOSc7Cgl9CgoJLyoKCSAqIElmIHJhbmdlIGluY2x1ZGVzIGxlc3Mg dGhhbiAxMCBjaGFycywgYXNzdW1lIHdlIGhhdmUgbm90IGdvdCBlbm91Z2gKCSAqIGRhdGEs IGFuZCBtYWtlIGl0IGluY2x1ZGUgcmVndWxhciBBU0NJSSBzZXQuCgkgKi8KCWlmIChyYW5n ZWhpIC0gcmFuZ2VsbyA8IDkpCgl7CgkJcmFuZ2VsbyA9ICcgJzsKCQlyYW5nZWhpID0gMTI3 OwoJfQoKCS8qCgkgKiBOb3cgc3RyaXAgYW55IGNvbW1vbiBwcmVmaXggb2YgdGhlIHRocmVl IHN0cmluZ3MuCgkgKi8KCXdoaWxlICgqbG9ib3VuZCkKCXsKCQlpZiAoKmxvYm91bmQgIT0g KmhpYm91bmQgfHwgKmxvYm91bmQgIT0gKnZhbHVlKQoJCQlicmVhazsKCQlsb2JvdW5kKyss IGhpYm91bmQrKywgdmFsdWUrKzsKCX0KCgkvKgoJICogTm93IHdlIGNhbiBkbyB0aGUgY29u dmVyc2lvbnMuCgkgKi8KCSpzY2FsZWR2YWx1ZSA9IGNvbnZlcnRfb25lX3N0cmluZ190b19z Y2FsYXIodmFsdWUsIHJhbmdlbG8sIHJhbmdlaGkpOwoJKnNjYWxlZGxvYm91bmQgPSBjb252 ZXJ0X29uZV9zdHJpbmdfdG9fc2NhbGFyKGxvYm91bmQsIHJhbmdlbG8sIHJhbmdlaGkpOwoJ KnNjYWxlZGhpYm91bmQgPSBjb252ZXJ0X29uZV9zdHJpbmdfdG9fc2NhbGFyKGhpYm91bmQs IHJhbmdlbG8sIHJhbmdlaGkpOwp9CgpzdGF0aWMgZG91YmxlCmNvbnZlcnRfb25lX3N0cmlu Z190b19zY2FsYXIoY2hhciAqdmFsdWUsIGludCByYW5nZWxvLCBpbnQgcmFuZ2VoaSkKewoJ aW50CQkJc2xlbiA9IHN0cmxlbih2YWx1ZSk7Cglkb3VibGUJCW51bSwKCQkJCWRlbm9tLAoJ CQkJYmFzZTsKCglpZiAoc2xlbiA8PSAwKQoJCXJldHVybiAwLjA7CQkJCS8qIGVtcHR5IHN0 cmluZyBoYXMgc2NhbGFyIHZhbHVlIDAgKi8KCgkvKgoJICogVGhlcmUgc2VlbXMgbGl0dGxl IHBvaW50IGluIGNvbnNpZGVyaW5nIG1vcmUgdGhhbiBhIGRvemVuIGJ5dGVzIGZyb20KCSAq IHRoZSBzdHJpbmcuICBTaW5jZSBiYXNlIGlzIGF0IGxlYXN0IDEwLCB0aGF0IHdpbGwgZ2l2 ZSB1cyBub21pbmFsCgkgKiByZXNvbHV0aW9uIG9mIGF0IGxlYXN0IDEyIGRlY2ltYWwgZGln aXRzLCB3aGljaCBpcyBzdXJlbHkgZmFyIG1vcmUKCSAqIHByZWNpc2lvbiB0aGFuIHRoaXMg ZXN0aW1hdGlvbiB0ZWNobmlxdWUgaGFzIGdvdCBhbnl3YXkgKGVzcGVjaWFsbHkgaW4KCSAq IG5vbi1DIGxvY2FsZXMpLiAgQWxzbywgZXZlbiB3aXRoIHRoZSBtYXhpbXVtIHBvc3NpYmxl IGJhc2Ugb2YgMjU2LCB0aGlzCgkgKiBlbnN1cmVzIGRlbm9tIGNhbm5vdCBncm93IGxhcmdl ciB0aGFuIDI1Nl4xMyA9IDIuMDNlMzEsIHdoaWNoIHdpbGwgbm90CgkgKiBvdmVyZmxvdyBv biBhbnkga25vd24gbWFjaGluZS4KCSAqLwoJaWYgKHNsZW4gPiAxMikKCQlzbGVuID0gMTI7 CgoJLyogQ29udmVydCBpbml0aWFsIGNoYXJhY3RlcnMgdG8gZnJhY3Rpb24gKi8KCWJhc2Ug PSByYW5nZWhpIC0gcmFuZ2VsbyArIDE7CgludW0gPSAwLjA7CglkZW5vbSA9IGJhc2U7Cgl3 aGlsZSAoc2xlbi0tID4gMCkKCXsKCQlpbnQJCQljaCA9ICh1bnNpZ25lZCBjaGFyKSAqdmFs dWUrKzsKCgkJaWYgKGNoIDwgcmFuZ2VsbykKCQkJY2ggPSByYW5nZWxvIC0gMTsKCQllbHNl IGlmIChjaCA+IHJhbmdlaGkpCgkJCWNoID0gcmFuZ2VoaSArIDE7CgkJbnVtICs9ICgoZG91 YmxlKSAoY2ggLSByYW5nZWxvKSkgLyBkZW5vbTsKCQlkZW5vbSAqPSBiYXNlOwoJfQoKCXJl dHVybiBudW07Cn0KCi8qCiAqIENvbnZlcnQgYSBzdHJpbmctdHlwZSBEYXR1bSBpbnRvIGEg cGFsbG9jJ2QsIG51bGwtdGVybWluYXRlZCBzdHJpbmcuCiAqCiAqIE9uIGZhaWx1cmUgKGUu Zy4sIHVuc3VwcG9ydGVkIHR5cGlkKSwgc2V0ICpmYWlsdXJlIHRvIHRydWU7CiAqIG90aGVy d2lzZSwgdGhhdCB2YXJpYWJsZSBpcyBub3QgY2hhbmdlZC4gIChXZSdsbCByZXR1cm4gTlVM TCBvbiBmYWlsdXJlLikKICoKICogV2hlbiB1c2luZyBhIG5vbi1DIGxvY2FsZSwgd2UgbXVz dCBwYXNzIHRoZSBzdHJpbmcgdGhyb3VnaCBwZ19zdHJ4ZnJtKCkKICogYmVmb3JlIGNvbnRp bnVpbmcsIHNvIGFzIHRvIGdlbmVyYXRlIGNvcnJlY3QgbG9jYWxlLXNwZWNpZmljIHJlc3Vs dHMuCiAqLwpzdGF0aWMgY2hhciAqCmNvbnZlcnRfc3RyaW5nX2RhdHVtKERhdHVtIHZhbHVl LCBPaWQgdHlwaWQsIE9pZCBjb2xsaWQsIGJvb2wgKmZhaWx1cmUpCnsKCWNoYXIJICAgKnZh bDsKCXBnX2xvY2FsZV90IG15bG9jYWxlOwoKCXN3aXRjaCAodHlwaWQpCgl7CgkJY2FzZSBD SEFST0lEOgoJCQl2YWwgPSAoY2hhciAqKSBwYWxsb2MoMik7CgkJCXZhbFswXSA9IERhdHVt R2V0Q2hhcih2YWx1ZSk7CgkJCXZhbFsxXSA9ICdcMCc7CgkJCWJyZWFrOwoJCWNhc2UgQlBD SEFST0lEOgoJCWNhc2UgVkFSQ0hBUk9JRDoKCQljYXNlIFRFWFRPSUQ6CgkJCXZhbCA9IFRl eHREYXR1bUdldENTdHJpbmcodmFsdWUpOwoJCQlicmVhazsKCQljYXNlIE5BTUVPSUQ6CgkJ CXsKCQkJCU5hbWVEYXRhICAgKm5tID0gKE5hbWVEYXRhICopIERhdHVtR2V0UG9pbnRlcih2 YWx1ZSk7CgoJCQkJdmFsID0gcHN0cmR1cChOYW1lU3RyKCpubSkpOwoJCQkJYnJlYWs7CgkJ CX0KCQlkZWZhdWx0OgoJCQkqZmFpbHVyZSA9IHRydWU7CgkJCXJldHVybiBOVUxMOwoJfQoK CW15bG9jYWxlID0gcGdfbmV3bG9jYWxlX2Zyb21fY29sbGF0aW9uKGNvbGxpZCk7CgoJaWYg KCFteWxvY2FsZS0+Y29sbGF0ZV9pc19jKQoJewoJCWNoYXIJICAgKnhmcm1zdHI7CgkJc2l6 ZV90CQl4ZnJtbGVuOwoJCXNpemVfdAkJeGZybWxlbjIgUEdfVVNFRF9GT1JfQVNTRVJUU19P TkxZOwoKCQkvKgoJCSAqIFhYWDogV2UgY291bGQgZ3Vlc3MgYXQgYSBzdWl0YWJsZSBvdXRw dXQgYnVmZmVyIHNpemUgYW5kIG9ubHkgY2FsbAoJCSAqIHBnX3N0cnhmcm0oKSB0d2ljZSBp ZiBvdXIgZ3Vlc3MgaXMgdG9vIHNtYWxsLgoJCSAqCgkJICogWFhYOiBzdHJ4ZnJtIGRvZXNu J3Qgc3VwcG9ydCBVVEYtOCBlbmNvZGluZyBvbiBXaW4zMiwgaXQgY2FuIHJldHVybgoJCSAq IGJvZ3VzIGRhdGEgb3Igc2V0IGFuIGVycm9yLiBUaGlzIGlzIG5vdCByZWFsbHkgYSBwcm9i bGVtIHVubGVzcyBpdAoJCSAqIGNyYXNoZXMgc2luY2UgaXQgd2lsbCBvbmx5IGdpdmUgYW4g ZXN0aW1hdGlvbiBlcnJvciBhbmQgbm90aGluZwoJCSAqIGZhdGFsLgoJCSAqCgkJICogWFhY OiB3ZSBkbyBub3QgY2hlY2sgcGdfc3RyeGZybV9lbmFibGVkKCkuIE9uIHNvbWUgcGxhdGZv cm1zIGFuZCBpbgoJCSAqIHNvbWUgY2FzZXMsIGxpYmMgc3RyeGZybSgpIG1heSByZXR1cm4g dGhlIHdyb25nIHJlc3VsdHMsIGJ1dCB0aGF0CgkJICogd2lsbCBvbmx5IGxlYWQgdG8gYW4g ZXN0aW1hdGlvbiBlcnJvci4KCQkgKi8KCQl4ZnJtbGVuID0gcGdfc3RyeGZybShOVUxMLCB2 YWwsIDAsIG15bG9jYWxlKTsKI2lmZGVmIFdJTjMyCgoJCS8qCgkJICogT24gV2luZG93cywg c3RyeGZybSByZXR1cm5zIElOVF9NQVggd2hlbiBhbiBlcnJvciBvY2N1cnMuIEluc3RlYWQK CQkgKiBvZiB0cnlpbmcgdG8gYWxsb2NhdGUgdGhpcyBtdWNoIG1lbW9yeSAoYW5kIGZhaWwp LCBqdXN0IHJldHVybiB0aGUKCQkgKiBvcmlnaW5hbCBzdHJpbmcgdW5tb2RpZmllZCBhcyBp ZiB3ZSB3ZXJlIGluIHRoZSBDIGxvY2FsZS4KCQkgKi8KCQlpZiAoeGZybWxlbiA9PSBJTlRf TUFYKQoJCQlyZXR1cm4gdmFsOwojZW5kaWYKCQl4ZnJtc3RyID0gKGNoYXIgKikgcGFsbG9j KHhmcm1sZW4gKyAxKTsKCQl4ZnJtbGVuMiA9IHBnX3N0cnhmcm0oeGZybXN0ciwgdmFsLCB4 ZnJtbGVuICsgMSwgbXlsb2NhbGUpOwoKCQkvKgoJCSAqIFNvbWUgc3lzdGVtcyAoZS5nLiwg Z2xpYmMpIGNhbiByZXR1cm4gYSBzbWFsbGVyIHZhbHVlIGZyb20gdGhlCgkJICogc2Vjb25k IGNhbGwgdGhhbiB0aGUgZmlyc3Q7IHRodXMgdGhlIEFzc2VydCBtdXN0IGJlIDw9IG5vdCA9 PS4KCQkgKi8KCQlBc3NlcnQoeGZybWxlbjIgPD0geGZybWxlbik7CgkJcGZyZWUodmFsKTsK CQl2YWwgPSB4ZnJtc3RyOwoJfQoKCXJldHVybiB2YWw7Cn0KCi8qCiAqIERvIGNvbnZlcnRf dG9fc2NhbGFyKCkncyB3b3JrIGZvciBhbnkgYnl0ZWEgZGF0YSB0eXBlLgogKgogKiBWZXJ5 IHNpbWlsYXIgdG8gY29udmVydF9zdHJpbmdfdG9fc2NhbGFyIGV4Y2VwdCB3ZSBjYW4ndCBh c3N1bWUKICogbnVsbC10ZXJtaW5hdGlvbiBhbmQgdGhlcmVmb3JlIHBhc3MgZXhwbGljaXQg bGVuZ3RocyBhcm91bmQuCiAqCiAqIEFsc28sIGFzc3VtcHRpb25zIGFib3V0IGxpa2VseSAi bm9ybWFsIiByYW5nZXMgb2YgY2hhcmFjdGVycyBoYXZlIGJlZW4KICogcmVtb3ZlZCAtIGEg ZGF0YSByYW5nZSBvZiAwLi4yNTUgaXMgYWx3YXlzIHVzZWQsIGZvciBub3cuICAoUGVyaGFw cwogKiBzb21lZGF5IHdlIHdpbGwgYWRkIGluZm9ybWF0aW9uIGFib3V0IGFjdHVhbCBieXRl IGRhdGEgcmFuZ2UgdG8KICogcGdfc3RhdGlzdGljLikKICovCnN0YXRpYyB2b2lkCmNvbnZl cnRfYnl0ZWFfdG9fc2NhbGFyKERhdHVtIHZhbHVlLAoJCQkJCQlkb3VibGUgKnNjYWxlZHZh bHVlLAoJCQkJCQlEYXR1bSBsb2JvdW5kLAoJCQkJCQlkb3VibGUgKnNjYWxlZGxvYm91bmQs CgkJCQkJCURhdHVtIGhpYm91bmQsCgkJCQkJCWRvdWJsZSAqc2NhbGVkaGlib3VuZCkKewoJ Ynl0ZWEJICAgKnZhbHVlcCA9IERhdHVtR2V0Qnl0ZWFQUCh2YWx1ZSk7CglieXRlYQkgICAq bG9ib3VuZHAgPSBEYXR1bUdldEJ5dGVhUFAobG9ib3VuZCk7CglieXRlYQkgICAqaGlib3Vu ZHAgPSBEYXR1bUdldEJ5dGVhUFAoaGlib3VuZCk7CglpbnQJCQlyYW5nZWxvLAoJCQkJcmFu Z2VoaSwKCQkJCXZhbHVlbGVuID0gVkFSU0laRV9BTllfRVhIRFIodmFsdWVwKSwKCQkJCWxv Ym91bmRsZW4gPSBWQVJTSVpFX0FOWV9FWEhEUihsb2JvdW5kcCksCgkJCQloaWJvdW5kbGVu ID0gVkFSU0laRV9BTllfRVhIRFIoaGlib3VuZHApLAoJCQkJaSwKCQkJCW1pbmxlbjsKCXVu c2lnbmVkIGNoYXIgKnZhbHN0ciA9ICh1bnNpZ25lZCBjaGFyICopIFZBUkRBVEFfQU5ZKHZh bHVlcCk7Cgl1bnNpZ25lZCBjaGFyICpsb3N0ciA9ICh1bnNpZ25lZCBjaGFyICopIFZBUkRB VEFfQU5ZKGxvYm91bmRwKTsKCXVuc2lnbmVkIGNoYXIgKmhpc3RyID0gKHVuc2lnbmVkIGNo YXIgKikgVkFSREFUQV9BTlkoaGlib3VuZHApOwoKCS8qCgkgKiBBc3N1bWUgYnl0ZWEgZGF0 YSBpcyB1bmlmb3JtbHkgZGlzdHJpYnV0ZWQgYWNyb3NzIGFsbCBieXRlIHZhbHVlcy4KCSAq LwoJcmFuZ2VsbyA9IDA7CglyYW5nZWhpID0gMjU1OwoKCS8qCgkgKiBOb3cgc3RyaXAgYW55 IGNvbW1vbiBwcmVmaXggb2YgdGhlIHRocmVlIHN0cmluZ3MuCgkgKi8KCW1pbmxlbiA9IE1p bihNaW4odmFsdWVsZW4sIGxvYm91bmRsZW4pLCBoaWJvdW5kbGVuKTsKCWZvciAoaSA9IDA7 IGkgPCBtaW5sZW47IGkrKykKCXsKCQlpZiAoKmxvc3RyICE9ICpoaXN0ciB8fCAqbG9zdHIg IT0gKnZhbHN0cikKCQkJYnJlYWs7CgkJbG9zdHIrKywgaGlzdHIrKywgdmFsc3RyKys7CgkJ bG9ib3VuZGxlbi0tLCBoaWJvdW5kbGVuLS0sIHZhbHVlbGVuLS07Cgl9CgoJLyoKCSAqIE5v dyB3ZSBjYW4gZG8gdGhlIGNvbnZlcnNpb25zLgoJICovCgkqc2NhbGVkdmFsdWUgPSBjb252 ZXJ0X29uZV9ieXRlYV90b19zY2FsYXIodmFsc3RyLCB2YWx1ZWxlbiwgcmFuZ2VsbywgcmFu Z2VoaSk7Cgkqc2NhbGVkbG9ib3VuZCA9IGNvbnZlcnRfb25lX2J5dGVhX3RvX3NjYWxhcihs b3N0ciwgbG9ib3VuZGxlbiwgcmFuZ2VsbywgcmFuZ2VoaSk7Cgkqc2NhbGVkaGlib3VuZCA9 IGNvbnZlcnRfb25lX2J5dGVhX3RvX3NjYWxhcihoaXN0ciwgaGlib3VuZGxlbiwgcmFuZ2Vs bywgcmFuZ2VoaSk7Cn0KCnN0YXRpYyBkb3VibGUKY29udmVydF9vbmVfYnl0ZWFfdG9fc2Nh bGFyKHVuc2lnbmVkIGNoYXIgKnZhbHVlLCBpbnQgdmFsdWVsZW4sCgkJCQkJCQlpbnQgcmFu Z2VsbywgaW50IHJhbmdlaGkpCnsKCWRvdWJsZQkJbnVtLAoJCQkJZGVub20sCgkJCQliYXNl OwoKCWlmICh2YWx1ZWxlbiA8PSAwKQoJCXJldHVybiAwLjA7CQkJCS8qIGVtcHR5IHN0cmlu ZyBoYXMgc2NhbGFyIHZhbHVlIDAgKi8KCgkvKgoJICogU2luY2UgYmFzZSBpcyAyNTYsIG5l ZWQgbm90IGNvbnNpZGVyIG1vcmUgdGhhbiBhYm91dCAxMCBjaGFycyAoZXZlbgoJICogdGhp cyBtYW55IHNlZW1zIGxpa2Ugb3ZlcmtpbGwpCgkgKi8KCWlmICh2YWx1ZWxlbiA+IDEwKQoJ CXZhbHVlbGVuID0gMTA7CgoJLyogQ29udmVydCBpbml0aWFsIGNoYXJhY3RlcnMgdG8gZnJh Y3Rpb24gKi8KCWJhc2UgPSByYW5nZWhpIC0gcmFuZ2VsbyArIDE7CgludW0gPSAwLjA7Cglk ZW5vbSA9IGJhc2U7Cgl3aGlsZSAodmFsdWVsZW4tLSA+IDApCgl7CgkJaW50CQkJY2ggPSAq dmFsdWUrKzsKCgkJaWYgKGNoIDwgcmFuZ2VsbykKCQkJY2ggPSByYW5nZWxvIC0gMTsKCQll bHNlIGlmIChjaCA+IHJhbmdlaGkpCgkJCWNoID0gcmFuZ2VoaSArIDE7CgkJbnVtICs9ICgo ZG91YmxlKSAoY2ggLSByYW5nZWxvKSkgLyBkZW5vbTsKCQlkZW5vbSAqPSBiYXNlOwoJfQoK CXJldHVybiBudW07Cn0KCi8qCiAqIERvIGNvbnZlcnRfdG9fc2NhbGFyKCkncyB3b3JrIGZv ciBhbnkgdGltZXZhbHVlIGRhdGEgdHlwZS4KICoKICogT24gZmFpbHVyZSAoZS5nLiwgdW5z dXBwb3J0ZWQgdHlwaWQpLCBzZXQgKmZhaWx1cmUgdG8gdHJ1ZTsKICogb3RoZXJ3aXNlLCB0 aGF0IHZhcmlhYmxlIGlzIG5vdCBjaGFuZ2VkLgogKi8Kc3RhdGljIGRvdWJsZQpjb252ZXJ0 X3RpbWV2YWx1ZV90b19zY2FsYXIoRGF0dW0gdmFsdWUsIE9pZCB0eXBpZCwgYm9vbCAqZmFp bHVyZSkKewoJc3dpdGNoICh0eXBpZCkKCXsKCQljYXNlIFRJTUVTVEFNUE9JRDoKCQkJcmV0 dXJuIERhdHVtR2V0VGltZXN0YW1wKHZhbHVlKTsKCQljYXNlIFRJTUVTVEFNUFRaT0lEOgoJ CQlyZXR1cm4gRGF0dW1HZXRUaW1lc3RhbXBUeih2YWx1ZSk7CgkJY2FzZSBEQVRFT0lEOgoJ CQlyZXR1cm4gZGF0ZTJ0aW1lc3RhbXBfbm9fb3ZlcmZsb3coRGF0dW1HZXREYXRlQURUKHZh bHVlKSk7CgkJY2FzZSBJTlRFUlZBTE9JRDoKCQkJewoJCQkJSW50ZXJ2YWwgICAqaW50ZXJ2 YWwgPSBEYXR1bUdldEludGVydmFsUCh2YWx1ZSk7CgoJCQkJLyoKCQkJCSAqIENvbnZlcnQg dGhlIG1vbnRoIHBhcnQgb2YgSW50ZXJ2YWwgdG8gZGF5cyB1c2luZyBhc3N1bWVkCgkJCQkg KiBhdmVyYWdlIG1vbnRoIGxlbmd0aCBvZiAzNjUuMjUvMTIuMCBkYXlzLiAgTm90IHRvbwoJ CQkJICogYWNjdXJhdGUsIGJ1dCBwbGVudHkgZ29vZCBlbm91Z2ggZm9yIG91ciBwdXJwb3Nl cy4KCQkJCSAqCgkJCQkgKiBUaGlzIGFsc28gd29ya3MgZm9yIGluZmluaXRlIGludGVydmFs cywgd2hpY2gganVzdCBoYXZlIGFsbAoJCQkJICogZmllbGRzIHNldCB0byBJTlRfTUlOL0lO VF9NQVgsIGFuZCBzbyB3aWxsIHByb2R1Y2UgYSByZXN1bHQKCQkJCSAqIHNtYWxsZXIvbGFy Z2VyIHRoYW4gYW55IGZpbml0ZSBpbnRlcnZhbC4KCQkJCSAqLwoJCQkJcmV0dXJuIGludGVy dmFsLT50aW1lICsgaW50ZXJ2YWwtPmRheSAqIChkb3VibGUpIFVTRUNTX1BFUl9EQVkgKwoJ CQkJCWludGVydmFsLT5tb250aCAqICgoREFZU19QRVJfWUVBUiAvIChkb3VibGUpIE1PTlRI U19QRVJfWUVBUikgKiBVU0VDU19QRVJfREFZKTsKCQkJfQoJCWNhc2UgVElNRU9JRDoKCQkJ cmV0dXJuIERhdHVtR2V0VGltZUFEVCh2YWx1ZSk7CgkJY2FzZSBUSU1FVFpPSUQ6CgkJCXsK CQkJCVRpbWVUekFEVCAgKnRpbWV0eiA9IERhdHVtR2V0VGltZVR6QURUUCh2YWx1ZSk7CgoJ CQkJLyogdXNlIEdNVC1lcXVpdmFsZW50IHRpbWUgKi8KCQkJCXJldHVybiAoZG91YmxlKSAo dGltZXR6LT50aW1lICsgKHRpbWV0ei0+em9uZSAqIDEwMDAwMDAuMCkpOwoJCQl9Cgl9CgoJ KmZhaWx1cmUgPSB0cnVlOwoJcmV0dXJuIDA7Cn0KCgovKgogKiBnZXRfcmVzdHJpY3Rpb25f dmFyaWFibGUKICoJCUV4YW1pbmUgdGhlIGFyZ3Mgb2YgYSByZXN0cmljdGlvbiBjbGF1c2Ug dG8gc2VlIGlmIGl0J3Mgb2YgdGhlCiAqCQlmb3JtICh2YXJpYWJsZSBvcCBwc2V1ZG9jb25z dGFudCkgb3IgKHBzZXVkb2NvbnN0YW50IG9wIHZhcmlhYmxlKSwKICoJCXdoZXJlICJ2YXJp YWJsZSIgY291bGQgYmUgZWl0aGVyIGEgVmFyIG9yIGFuIGV4cHJlc3Npb24gaW4gdmFycyBv ZiBhCiAqCQlzaW5nbGUgcmVsYXRpb24uICBJZiBzbywgZXh0cmFjdCBpbmZvcm1hdGlvbiBh Ym91dCB0aGUgdmFyaWFibGUsCiAqCQlhbmQgYWxzbyBpbmRpY2F0ZSB3aGljaCBzaWRlIGl0 IHdhcyBvbiBhbmQgdGhlIG90aGVyIGFyZ3VtZW50LgogKgogKiBJbnB1dHM6CiAqCXJvb3Q6 IHRoZSBwbGFubmVyIGluZm8KICoJYXJnczogY2xhdXNlIGFyZ3VtZW50IGxpc3QKICoJdmFy UmVsaWQ6IHNlZSBzcGVjcyBmb3IgcmVzdHJpY3Rpb24gc2VsZWN0aXZpdHkgZnVuY3Rpb25z CiAqCiAqIE91dHB1dHM6ICh0aGVzZSBhcmUgdmFsaWQgb25seSBpZiB0cnVlIGlzIHJldHVy bmVkKQogKgkqdmFyZGF0YTogZ2V0cyBpbmZvcm1hdGlvbiBhYm91dCB2YXJpYWJsZSAoc2Vl IGV4YW1pbmVfdmFyaWFibGUpCiAqCSpvdGhlcjogZ2V0cyBvdGhlciBjbGF1c2UgYXJndW1l bnQsIGFnZ3Jlc3NpdmVseSByZWR1Y2VkIHRvIGEgY29uc3RhbnQKICoJKnZhcm9ubGVmdDog c2V0IHRydWUgaWYgdmFyaWFibGUgaXMgb24gdGhlIGxlZnQsIGZhbHNlIGlmIG9uIHRoZSBy aWdodAogKgogKiBSZXR1cm5zIHRydWUgaWYgYSB2YXJpYWJsZSBpcyBpZGVudGlmaWVkLCBv dGhlcndpc2UgZmFsc2UuCiAqCiAqIE5vdGU6IGlmIHRoZXJlIGFyZSBWYXJzIG9uIGJvdGgg c2lkZXMgb2YgdGhlIGNsYXVzZSwgd2UgbXVzdCBmYWlsLCBiZWNhdXNlCiAqIGNhbGxlcnMg YXJlIGV4cGVjdGluZyB0aGF0IHRoZSBvdGhlciBzaWRlIHdpbGwgYWN0IGxpa2UgYSBwc2V1 ZG9jb25zdGFudC4KICovCmJvb2wKZ2V0X3Jlc3RyaWN0aW9uX3ZhcmlhYmxlKFBsYW5uZXJJ bmZvICpyb290LCBMaXN0ICphcmdzLCBpbnQgdmFyUmVsaWQsCgkJCQkJCSBWYXJpYWJsZVN0 YXREYXRhICp2YXJkYXRhLCBOb2RlICoqb3RoZXIsCgkJCQkJCSBib29sICp2YXJvbmxlZnQp CnsKCU5vZGUJICAgKmxlZnQsCgkJCSAgICpyaWdodDsKCVZhcmlhYmxlU3RhdERhdGEgcmRh dGE7CgoJLyogRmFpbCBpZiBub3QgYSBiaW5hcnkgb3BjbGF1c2UgKHByb2JhYmx5IHNob3Vs ZG4ndCBoYXBwZW4pICovCglpZiAobGlzdF9sZW5ndGgoYXJncykgIT0gMikKCQlyZXR1cm4g ZmFsc2U7CgoJbGVmdCA9IChOb2RlICopIGxpbml0aWFsKGFyZ3MpOwoJcmlnaHQgPSAoTm9k ZSAqKSBsc2Vjb25kKGFyZ3MpOwoKCS8qCgkgKiBFeGFtaW5lIGJvdGggc2lkZXMuICBOb3Rl IHRoYXQgd2hlbiB2YXJSZWxpZCBpcyBub256ZXJvLCBWYXJzIG9mIG90aGVyCgkgKiByZWxh dGlvbnMgd2lsbCBiZSB0cmVhdGVkIGFzIHBzZXVkb2NvbnN0YW50cy4KCSAqLwoJZXhhbWlu ZV92YXJpYWJsZShyb290LCBsZWZ0LCB2YXJSZWxpZCwgdmFyZGF0YSk7CglleGFtaW5lX3Zh cmlhYmxlKHJvb3QsIHJpZ2h0LCB2YXJSZWxpZCwgJnJkYXRhKTsKCgkvKgoJICogSWYgb25l IHNpZGUgaXMgYSB2YXJpYWJsZSBhbmQgdGhlIG90aGVyIG5vdCwgd2Ugd2luLgoJICovCglp ZiAodmFyZGF0YS0+cmVsICYmIHJkYXRhLnJlbCA9PSBOVUxMKQoJewoJCSp2YXJvbmxlZnQg PSB0cnVlOwoJCSpvdGhlciA9IGVzdGltYXRlX2V4cHJlc3Npb25fdmFsdWUocm9vdCwgcmRh dGEudmFyKTsKCQkvKiBBc3N1bWUgd2UgbmVlZCBubyBSZWxlYXNlVmFyaWFibGVTdGF0cyhy ZGF0YSkgaGVyZSAqLwoJCXJldHVybiB0cnVlOwoJfQoKCWlmICh2YXJkYXRhLT5yZWwgPT0g TlVMTCAmJiByZGF0YS5yZWwpCgl7CgkJKnZhcm9ubGVmdCA9IGZhbHNlOwoJCSpvdGhlciA9 IGVzdGltYXRlX2V4cHJlc3Npb25fdmFsdWUocm9vdCwgdmFyZGF0YS0+dmFyKTsKCQkvKiBB c3N1bWUgd2UgbmVlZCBubyBSZWxlYXNlVmFyaWFibGVTdGF0cygqdmFyZGF0YSkgaGVyZSAq LwoJCSp2YXJkYXRhID0gcmRhdGE7CgkJcmV0dXJuIHRydWU7Cgl9CgoJLyogT29wcywgY2xh dXNlIGhhcyB3cm9uZyBzdHJ1Y3R1cmUgKHByb2JhYmx5IHZhciBvcCB2YXIpICovCglSZWxl YXNlVmFyaWFibGVTdGF0cygqdmFyZGF0YSk7CglSZWxlYXNlVmFyaWFibGVTdGF0cyhyZGF0 YSk7CgoJcmV0dXJuIGZhbHNlOwp9CgovKgogKiBnZXRfam9pbl92YXJpYWJsZXMKICoJCUFw cGx5IGV4YW1pbmVfdmFyaWFibGUoKSB0byBlYWNoIHNpZGUgb2YgYSBqb2luIGNsYXVzZS4K ICoJCUFsc28sIGF0dGVtcHQgdG8gaWRlbnRpZnkgd2hldGhlciB0aGUgam9pbiBjbGF1c2Ug aGFzIHRoZSBzYW1lCiAqCQlvciByZXZlcnNlZCBzZW5zZSBjb21wYXJlZCB0byB0aGUgU3Bl Y2lhbEpvaW5JbmZvLgogKgogKiBXZSBjb25zaWRlciB0aGUgam9pbiBjbGF1c2UgIm5vcm1h bCIgaWYgaXQgaXMgImxoc192YXIgT1AgcmhzX3ZhciIsCiAqIG9yICJyZXZlcnNlZCIgaWYg aXQgaXMgInJoc192YXIgT1AgbGhzX3ZhciIuICBJbiBjb21wbGljYXRlZCBjYXNlcwogKiB3 aGVyZSB3ZSBjYW4ndCB0ZWxsIGZvciBzdXJlLCB3ZSBkZWZhdWx0IHRvIGFzc3VtaW5nIGl0 J3Mgbm9ybWFsLgogKi8Kdm9pZApnZXRfam9pbl92YXJpYWJsZXMoUGxhbm5lckluZm8gKnJv b3QsIExpc3QgKmFyZ3MsIFNwZWNpYWxKb2luSW5mbyAqc2ppbmZvLAoJCQkJICAgVmFyaWFi bGVTdGF0RGF0YSAqdmFyZGF0YTEsIFZhcmlhYmxlU3RhdERhdGEgKnZhcmRhdGEyLAoJCQkJ ICAgYm9vbCAqam9pbl9pc19yZXZlcnNlZCkKewoJTm9kZQkgICAqbGVmdCwKCQkJICAgKnJp Z2h0OwoKCWlmIChsaXN0X2xlbmd0aChhcmdzKSAhPSAyKQoJCWVsb2coRVJST1IsICJqb2lu IG9wZXJhdG9yIHNob3VsZCB0YWtlIHR3byBhcmd1bWVudHMiKTsKCglsZWZ0ID0gKE5vZGUg KikgbGluaXRpYWwoYXJncyk7CglyaWdodCA9IChOb2RlICopIGxzZWNvbmQoYXJncyk7CgoJ ZXhhbWluZV92YXJpYWJsZShyb290LCBsZWZ0LCAwLCB2YXJkYXRhMSk7CglleGFtaW5lX3Zh cmlhYmxlKHJvb3QsIHJpZ2h0LCAwLCB2YXJkYXRhMik7CgoJaWYgKHZhcmRhdGExLT5yZWwg JiYKCQlibXNfaXNfc3Vic2V0KHZhcmRhdGExLT5yZWwtPnJlbGlkcywgc2ppbmZvLT5zeW5f cmlnaHRoYW5kKSkKCQkqam9pbl9pc19yZXZlcnNlZCA9IHRydWU7CS8qIHZhcjEgaXMgb24g UkhTICovCgllbHNlIGlmICh2YXJkYXRhMi0+cmVsICYmCgkJCSBibXNfaXNfc3Vic2V0KHZh cmRhdGEyLT5yZWwtPnJlbGlkcywgc2ppbmZvLT5zeW5fbGVmdGhhbmQpKQoJCSpqb2luX2lz X3JldmVyc2VkID0gdHJ1ZTsJLyogdmFyMiBpcyBvbiBMSFMgKi8KCWVsc2UKCQkqam9pbl9p c19yZXZlcnNlZCA9IGZhbHNlOwp9CgovKiBzdGF0ZXh0X2V4cHJlc3Npb25zX2xvYWQgY29w aWVzIHRoZSB0dXBsZSwgc28ganVzdCBwZnJlZSBpdC4gKi8Kc3RhdGljIHZvaWQKUmVsZWFz ZUR1bW15KEhlYXBUdXBsZSB0dXBsZSkKewoJcGZyZWUodHVwbGUpOwp9CgovKgogKiBleGFt aW5lX3ZhcmlhYmxlCiAqCQlUcnkgdG8gbG9vayB1cCBzdGF0aXN0aWNhbCBkYXRhIGFib3V0 IGFuIGV4cHJlc3Npb24uCiAqCQlGaWxsIGluIGEgVmFyaWFibGVTdGF0RGF0YSBzdHJ1Y3Qg dG8gZGVzY3JpYmUgdGhlIGV4cHJlc3Npb24uCiAqCiAqIElucHV0czoKICoJcm9vdDogdGhl IHBsYW5uZXIgaW5mbwogKglub2RlOiB0aGUgZXhwcmVzc2lvbiB0cmVlIHRvIGV4YW1pbmUK ICoJdmFyUmVsaWQ6IHNlZSBzcGVjcyBmb3IgcmVzdHJpY3Rpb24gc2VsZWN0aXZpdHkgZnVu Y3Rpb25zCiAqCiAqIE91dHB1dHM6ICp2YXJkYXRhIGlzIGZpbGxlZCBhcyBmb2xsb3dzOgog Kgl2YXI6IHRoZSBpbnB1dCBleHByZXNzaW9uICh3aXRoIGFueSBwaHZzIG9yIGJpbmFyeSBy ZWxhYmVsaW5nIHN0cmlwcGVkLAogKgkJaWYgaXQgaXMgb3IgY29udGFpbnMgYSB2YXJpYWJs ZTsgYnV0IG90aGVyd2lzZSB1bmNoYW5nZWQpCiAqCXJlbDogUmVsT3B0SW5mbyBmb3IgcmVs YXRpb24gY29udGFpbmluZyB2YXJpYWJsZTsgTlVMTCBpZiBleHByZXNzaW9uCiAqCQljb250 YWlucyBubyBWYXJzIChOT1RFIHRoaXMgY291bGQgcG9pbnQgdG8gYSBSZWxPcHRJbmZvIG9m IGEKICoJCXN1YnF1ZXJ5LCBub3Qgb25lIGluIHRoZSBjdXJyZW50IHF1ZXJ5KS4KICoJc3Rh dHNUdXBsZTogdGhlIHBnX3N0YXRpc3RpYyBlbnRyeSBmb3IgdGhlIHZhcmlhYmxlLCBpZiBv bmUgZXhpc3RzOwogKgkJb3RoZXJ3aXNlIE5VTEwuCiAqCWZyZWVmdW5jOiBwb2ludGVyIHRv IGEgZnVuY3Rpb24gdG8gcmVsZWFzZSBzdGF0c1R1cGxlIHdpdGguCiAqCXZhcnR5cGU6IGV4 cG9zZWQgdHlwZSBvZiB0aGUgZXhwcmVzc2lvbjsgdGhpcyBzaG91bGQgYWx3YXlzIG1hdGNo CiAqCQl0aGUgZGVjbGFyZWQgaW5wdXQgdHlwZSBvZiB0aGUgb3BlcmF0b3Igd2UgYXJlIGVz dGltYXRpbmcgZm9yLgogKglhdHR0eXBlLCBhdHR0eXBtb2Q6IGFjdHVhbCB0eXBlL3R5cG1v ZCBvZiB0aGUgInZhciIgZXhwcmVzc2lvbi4gIFRoaXMgaXMKICoJCWNvbW1vbmx5IHRoZSBz YW1lIGFzIHRoZSBleHBvc2VkIHR5cGUgb2YgdGhlIHZhcmlhYmxlIGFyZ3VtZW50LAogKgkJ YnV0IGNhbiBiZSBkaWZmZXJlbnQgaW4gYmluYXJ5LWNvbXBhdGlibGUtdHlwZSBjYXNlcy4K ICoJaXN1bmlxdWU6IHRydWUgaWYgd2Ugd2VyZSBhYmxlIHRvIG1hdGNoIHRoZSB2YXIgdG8g YSB1bmlxdWUgaW5kZXgsIGEKICoJCXNpbmdsZS1jb2x1bW4gRElTVElOQ1Qgb3IgR1JPVVAt QlkgY2xhdXNlLCBpbXBseWluZyBpdHMgdmFsdWVzIGFyZQogKgkJdW5pcXVlIGZvciB0aGlz IHF1ZXJ5LiAgKENhdXRpb246IHRoaXMgc2hvdWxkIGJlIHRydXN0ZWQgZm9yCiAqCQlzdGF0 aXN0aWNhbCBwdXJwb3NlcyBvbmx5LCBzaW5jZSB3ZSBkbyBub3QgY2hlY2sgaW5kaW1tZWRp YXRlIG5vcgogKgkJdmVyaWZ5IHRoYXQgdGhlIGV4YWN0IHNhbWUgZGVmaW5pdGlvbiBvZiBl cXVhbGl0eSBhcHBsaWVzLikKICoJYWNsX29rOiB0cnVlIGlmIGN1cnJlbnQgdXNlciBoYXMg cGVybWlzc2lvbiB0byByZWFkIGFsbCB0YWJsZSByb3dzIGZyb20KICoJCXRoZSBjb2x1bW4o cykgdW5kZXJseWluZyB0aGUgcGdfc3RhdGlzdGljIGVudHJ5LiAgVGhpcyBpcyBjb25zdWx0 ZWQgYnkKICoJCXN0YXRpc3RpY19wcm9jX3NlY3VyaXR5X2NoZWNrKCkuCiAqCiAqIENhbGxl ciBpcyByZXNwb25zaWJsZSBmb3IgZG9pbmcgUmVsZWFzZVZhcmlhYmxlU3RhdHMoKSBiZWZv cmUgZXhpdGluZy4KICovCnZvaWQKZXhhbWluZV92YXJpYWJsZShQbGFubmVySW5mbyAqcm9v dCwgTm9kZSAqbm9kZSwgaW50IHZhclJlbGlkLAoJCQkJIFZhcmlhYmxlU3RhdERhdGEgKnZh cmRhdGEpCnsKCU5vZGUJICAgKmJhc2Vub2RlOwoJUmVsaWRzCQl2YXJub3M7CglSZWxpZHMJ CWJhc2V2YXJub3M7CglSZWxPcHRJbmZvICpvbmVyZWw7CgoJLyogTWFrZSBzdXJlIHdlIGRv bid0IHJldHVybiBkYW5nbGluZyBwb2ludGVycyBpbiB2YXJkYXRhICovCglNZW1TZXQodmFy ZGF0YSwgMCwgc2l6ZW9mKFZhcmlhYmxlU3RhdERhdGEpKTsKCgkvKiBTYXZlIHRoZSBleHBv c2VkIHR5cGUgb2YgdGhlIGV4cHJlc3Npb24gKi8KCXZhcmRhdGEtPnZhcnR5cGUgPSBleHBy VHlwZShub2RlKTsKCgkvKgoJICogUGxhY2VIb2xkZXJWYXJzIGFyZSB0cmFuc3BhcmVudCBm b3IgdGhlIHB1cnBvc2Ugb2Ygc3RhdGlzdGljcyBsb29rdXA7CgkgKiB0aGV5IGRvIG5vdCBh bHRlciB0aGUgdmFsdWUgZGlzdHJpYnV0aW9uIG9mIHRoZSB1bmRlcmx5aW5nIGV4cHJlc3Np b24uCgkgKiBIb3dldmVyLCB0aGV5IGNhbiBvYnNjdXJlIHRoZSBzdHJ1Y3R1cmUsIHByZXZl bnRpbmcgdXMgZnJvbSByZWNvZ25pemluZwoJICogbWF0Y2hlcyB0byBiYXNlIGNvbHVtbnMs IGluZGV4IGV4cHJlc3Npb25zLCBvciBleHRlbmRlZCBzdGF0aXN0aWNzLiAgU28KCSAqIHN0 cmlwIHRoZW0gb3V0IGZpcnN0LgoJICovCgliYXNlbm9kZSA9IHN0cmlwX2FsbF9waHZzX2Rl ZXAocm9vdCwgbm9kZSk7CgoJLyoKCSAqIExvb2sgaW5zaWRlIGFueSBiaW5hcnktY29tcGF0 aWJsZSByZWxhYmVsaW5nLiAgV2UgbmVlZCB0byBoYW5kbGUgbmVzdGVkCgkgKiBSZWxhYmVs VHlwZSBub2RlcyBoZXJlLCBiZWNhdXNlIHRoZSBwcmlvciBzdHJpcHBpbmcgb2YgUGxhY2VI b2xkZXJWYXJzCgkgKiBtYXkgaGF2ZSBicm91Z2h0IHNlcGFyYXRlIFJlbGFiZWxUeXBlcyBp bnRvIGFkamFjZW5jeS4KCSAqLwoJd2hpbGUgKElzQShiYXNlbm9kZSwgUmVsYWJlbFR5cGUp KQoJCWJhc2Vub2RlID0gKE5vZGUgKikgKChSZWxhYmVsVHlwZSAqKSBiYXNlbm9kZSktPmFy ZzsKCgkvKiBGYXN0IHBhdGggZm9yIGEgc2ltcGxlIFZhciAqLwoJaWYgKElzQShiYXNlbm9k ZSwgVmFyKSAmJgoJCSh2YXJSZWxpZCA9PSAwIHx8IHZhclJlbGlkID09ICgoVmFyICopIGJh c2Vub2RlKS0+dmFybm8pKQoJewoJCVZhcgkJICAgKnZhciA9IChWYXIgKikgYmFzZW5vZGU7 CgoJCS8qIFNldCB1cCByZXN1bHQgZmllbGRzIG90aGVyIHRoYW4gdGhlIHN0YXRzIHR1cGxl ICovCgkJdmFyZGF0YS0+dmFyID0gYmFzZW5vZGU7CS8qIHJldHVybiBWYXIgd2l0aG91dCBw aHZzIG9yIHJlbGFiZWxpbmcgKi8KCQl2YXJkYXRhLT5yZWwgPSBmaW5kX2Jhc2VfcmVsKHJv b3QsIHZhci0+dmFybm8pOwoJCXZhcmRhdGEtPmF0dHR5cGUgPSB2YXItPnZhcnR5cGU7CgkJ dmFyZGF0YS0+YXR0dHlwbW9kID0gdmFyLT52YXJ0eXBtb2Q7CgkJdmFyZGF0YS0+aXN1bmlx dWUgPSBoYXNfdW5pcXVlX2luZGV4KHZhcmRhdGEtPnJlbCwgdmFyLT52YXJhdHRubyk7CgoJ CS8qIFRyeSB0byBsb2NhdGUgc29tZSBzdGF0cyAqLwoJCWV4YW1pbmVfc2ltcGxlX3Zhcmlh YmxlKHJvb3QsIHZhciwgdmFyZGF0YSk7CgoJCXJldHVybjsKCX0KCgkvKgoJICogT2theSwg aXQncyBhIG1vcmUgY29tcGxpY2F0ZWQgZXhwcmVzc2lvbi4gIERldGVybWluZSB2YXJpYWJs ZQoJICogbWVtYmVyc2hpcC4gIE5vdGUgdGhhdCB3aGVuIHZhclJlbGlkIGlzbid0IHplcm8s IG9ubHkgdmFycyBvZiB0aGF0CgkgKiByZWxhdGlvbiBhcmUgY29uc2lkZXJlZCAicmVhbCIg dmFycy4KCSAqLwoJdmFybm9zID0gcHVsbF92YXJub3Mocm9vdCwgYmFzZW5vZGUpOwoJYmFz ZXZhcm5vcyA9IGJtc19kaWZmZXJlbmNlKHZhcm5vcywgcm9vdC0+b3V0ZXJfam9pbl9yZWxz KTsKCglvbmVyZWwgPSBOVUxMOwoKCWlmIChibXNfaXNfZW1wdHkoYmFzZXZhcm5vcykpCgl7 CgkJLyogTm8gVmFycyBhdCBhbGwgLi4uIG11c3QgYmUgcHNldWRvLWNvbnN0YW50IGNsYXVz ZSAqLwoJfQoJZWxzZQoJewoJCWludAkJCXJlbGlkOwoKCQkvKiBDaGVjayBpZiB0aGUgZXhw cmVzc2lvbiBpcyBpbiB2YXJzIG9mIGEgc2luZ2xlIGJhc2UgcmVsYXRpb24gKi8KCQlpZiAo Ym1zX2dldF9zaW5nbGV0b25fbWVtYmVyKGJhc2V2YXJub3MsICZyZWxpZCkpCgkJewoJCQlp ZiAodmFyUmVsaWQgPT0gMCB8fCB2YXJSZWxpZCA9PSByZWxpZCkKCQkJewoJCQkJb25lcmVs ID0gZmluZF9iYXNlX3JlbChyb290LCByZWxpZCk7CgkJCQl2YXJkYXRhLT5yZWwgPSBvbmVy ZWw7CgkJCQlub2RlID0gYmFzZW5vZGU7CS8qIHN0cmlwIGFueSBwaHZzIG9yIHJlbGFiZWxp bmcgKi8KCQkJfQoJCQkvKiBlbHNlIHRyZWF0IGl0IGFzIGEgY29uc3RhbnQgKi8KCQl9CgkJ ZWxzZQoJCXsKCQkJLyogdmFybm9zIGhhcyBtdWx0aXBsZSByZWxpZHMgKi8KCQkJaWYgKHZh clJlbGlkID09IDApCgkJCXsKCQkJCS8qIHRyZWF0IGl0IGFzIGEgdmFyaWFibGUgb2YgYSBq b2luIHJlbGF0aW9uICovCgkJCQl2YXJkYXRhLT5yZWwgPSBmaW5kX2pvaW5fcmVsKHJvb3Qs IHZhcm5vcyk7CgkJCQlub2RlID0gYmFzZW5vZGU7CS8qIHN0cmlwIGFueSBwaHZzIG9yIHJl bGFiZWxpbmcgKi8KCQkJfQoJCQllbHNlIGlmIChibXNfaXNfbWVtYmVyKHZhclJlbGlkLCB2 YXJub3MpKQoJCQl7CgkJCQkvKiBpZ25vcmUgdGhlIHZhcnMgYmVsb25naW5nIHRvIG90aGVy IHJlbGF0aW9ucyAqLwoJCQkJdmFyZGF0YS0+cmVsID0gZmluZF9iYXNlX3JlbChyb290LCB2 YXJSZWxpZCk7CgkJCQlub2RlID0gYmFzZW5vZGU7CS8qIHN0cmlwIGFueSBwaHZzIG9yIHJl bGFiZWxpbmcgKi8KCQkJCS8qIG5vdGU6IG5vIHBvaW50IGluIGV4cHJlc3Npb25hbC1pbmRl eCBzZWFyY2ggaGVyZSAqLwoJCQl9CgkJCS8qIGVsc2UgdHJlYXQgaXQgYXMgYSBjb25zdGFu dCAqLwoJCX0KCX0KCglibXNfZnJlZShiYXNldmFybm9zKTsKCgl2YXJkYXRhLT52YXIgPSBu b2RlOwoJdmFyZGF0YS0+YXR0dHlwZSA9IGV4cHJUeXBlKG5vZGUpOwoJdmFyZGF0YS0+YXR0 dHlwbW9kID0gZXhwclR5cG1vZChub2RlKTsKCglpZiAob25lcmVsKQoJewoJCS8qCgkJICog V2UgaGF2ZSBhbiBleHByZXNzaW9uIGluIHZhcnMgb2YgYSBzaW5nbGUgcmVsYXRpb24uICBU cnkgdG8gbWF0Y2gKCQkgKiBpdCB0byBleHByZXNzaW9uYWwgaW5kZXggY29sdW1ucywgaW4g aG9wZXMgb2YgZmluZGluZyBzb21lCgkJICogc3RhdGlzdGljcy4KCQkgKgoJCSAqIE5vdGUg dGhhdCB3ZSBjb25zaWRlciBhbGwgaW5kZXggY29sdW1ucyBpbmNsdWRpbmcgSU5DTFVERSBj b2x1bW5zLAoJCSAqIHNpbmNlIHRoZXJlIGNvdWxkIGJlIHN0YXRzIGZvciBzdWNoIGNvbHVt bnMuICBCdXQgdGhlIHRlc3QgZm9yCgkJICogdW5pcXVlbmVzcyBuZWVkcyB0byBiZSB3YXJp ZXIuCgkJICoKCQkgKiBYWFggaXQncyBjb25jZWl2YWJsZSB0aGF0IHRoZXJlIGFyZSBtdWx0 aXBsZSBtYXRjaGVzIHdpdGggZGlmZmVyZW50CgkJICogaW5kZXggb3BmYW1pbGllczsgaWYg c28sIHdlIG5lZWQgdG8gcGljayBvbmUgdGhhdCBtYXRjaGVzIHRoZQoJCSAqIG9wZXJhdG9y IHdlIGFyZSBlc3RpbWF0aW5nIGZvci4gIEZJWE1FIGxhdGVyLgoJCSAqLwoJCUxpc3RDZWxs ICAgKmlsaXN0OwoJCUxpc3RDZWxsICAgKnNsaXN0OwoKCQkvKgoJCSAqIFRoZSBudWxsaW5n cmVscyBiaXRzIHdpdGhpbiB0aGUgZXhwcmVzc2lvbiBjb3VsZCBwcmV2ZW50IHVzIGZyb20K CQkgKiBtYXRjaGluZyBpdCB0byBleHByZXNzaW9uYWwgaW5kZXggY29sdW1ucyBvciB0byB0 aGUgZXhwcmVzc2lvbnMgaW4KCQkgKiBleHRlbmRlZCBzdGF0aXN0aWNzLiAgU28gc3RyaXAg dGhlbSBvdXQgZmlyc3QuCgkJICovCgkJaWYgKGJtc19vdmVybGFwKHZhcm5vcywgcm9vdC0+ b3V0ZXJfam9pbl9yZWxzKSkKCQkJbm9kZSA9IHJlbW92ZV9udWxsaW5nX3JlbGlkcyhub2Rl LCByb290LT5vdXRlcl9qb2luX3JlbHMsIE5VTEwpOwoKCQlmb3JlYWNoKGlsaXN0LCBvbmVy ZWwtPmluZGV4bGlzdCkKCQl7CgkJCUluZGV4T3B0SW5mbyAqaW5kZXggPSAoSW5kZXhPcHRJ bmZvICopIGxmaXJzdChpbGlzdCk7CgkJCUxpc3RDZWxsICAgKmluZGV4cHJfaXRlbTsKCQkJ aW50CQkJcG9zOwoKCQkJaW5kZXhwcl9pdGVtID0gbGlzdF9oZWFkKGluZGV4LT5pbmRleHBy cyk7CgkJCWlmIChpbmRleHByX2l0ZW0gPT0gTlVMTCkKCQkJCWNvbnRpbnVlOwkJLyogbm8g ZXhwcmVzc2lvbnMgaGVyZS4uLiAqLwoKCQkJZm9yIChwb3MgPSAwOyBwb3MgPCBpbmRleC0+ bmNvbHVtbnM7IHBvcysrKQoJCQl7CgkJCQlpZiAoaW5kZXgtPmluZGV4a2V5c1twb3NdID09 IDApCgkJCQl7CgkJCQkJTm9kZQkgICAqaW5kZXhrZXk7CgoJCQkJCWlmIChpbmRleHByX2l0 ZW0gPT0gTlVMTCkKCQkJCQkJZWxvZyhFUlJPUiwgInRvbyBmZXcgZW50cmllcyBpbiBpbmRl eHBycyBsaXN0Iik7CgkJCQkJaW5kZXhrZXkgPSAoTm9kZSAqKSBsZmlyc3QoaW5kZXhwcl9p dGVtKTsKCQkJCQlpZiAoaW5kZXhrZXkgJiYgSXNBKGluZGV4a2V5LCBSZWxhYmVsVHlwZSkp CgkJCQkJCWluZGV4a2V5ID0gKE5vZGUgKikgKChSZWxhYmVsVHlwZSAqKSBpbmRleGtleSkt PmFyZzsKCQkJCQlpZiAoZXF1YWwobm9kZSwgaW5kZXhrZXkpKQoJCQkJCXsKCQkJCQkJLyoK CQkJCQkJICogRm91bmQgYSBtYXRjaCAuLi4gaXMgaXQgYSB1bmlxdWUgaW5kZXg/IFRlc3Rz IGhlcmUKCQkJCQkJICogc2hvdWxkIG1hdGNoIGhhc191bmlxdWVfaW5kZXgoKS4KCQkJCQkJ ICovCgkJCQkJCWlmIChpbmRleC0+dW5pcXVlICYmCgkJCQkJCQlpbmRleC0+bmtleWNvbHVt bnMgPT0gMSAmJgoJCQkJCQkJcG9zID09IDAgJiYKCQkJCQkJCShpbmRleC0+aW5kcHJlZCA9 PSBOSUwgfHwgaW5kZXgtPnByZWRPSykpCgkJCQkJCQl2YXJkYXRhLT5pc3VuaXF1ZSA9IHRy dWU7CgoJCQkJCQkvKgoJCQkJCQkgKiBIYXMgaXQgZ290IHN0YXRzPyAgV2Ugb25seSBjb25z aWRlciBzdGF0cyBmb3IKCQkJCQkJICogbm9uLXBhcnRpYWwgaW5kZXhlcywgc2luY2UgcGFy dGlhbCBpbmRleGVzIHByb2JhYmx5CgkJCQkJCSAqIGRvbid0IHJlZmxlY3Qgd2hvbGUtcmVs YXRpb24gc3RhdGlzdGljczsgdGhlIGFib3ZlCgkJCQkJCSAqIGNoZWNrIGZvciB1bmlxdWVu ZXNzIGlzIHRoZSBvbmx5IGluZm8gd2UgdGFrZSBmcm9tCgkJCQkJCSAqIGEgcGFydGlhbCBp bmRleC4KCQkJCQkJICoKCQkJCQkJICogQW4gaW5kZXggc3RhdHMgaG9vaywgaG93ZXZlciwg bXVzdCBtYWtlIGl0cyBvd24KCQkJCQkJICogZGVjaXNpb25zIGFib3V0IHdoYXQgdG8gZG8g d2l0aCBwYXJ0aWFsIGluZGV4ZXMuCgkJCQkJCSAqLwoJCQkJCQlpZiAoZ2V0X2luZGV4X3N0 YXRzX2hvb2sgJiYKCQkJCQkJCSgqZ2V0X2luZGV4X3N0YXRzX2hvb2spIChyb290LCBpbmRl eC0+aW5kZXhvaWQsCgkJCQkJCQkJCQkJCQkgcG9zICsgMSwgdmFyZGF0YSkpCgkJCQkJCXsK CQkJCQkJCS8qCgkJCQkJCQkgKiBUaGUgaG9vayB0b29rIGNvbnRyb2wgb2YgYWNxdWlyaW5n IGEgc3RhdHMKCQkJCQkJCSAqIHR1cGxlLiAgSWYgaXQgZGlkIHN1cHBseSBhIHR1cGxlLCBp dCdkIGJldHRlcgoJCQkJCQkJICogaGF2ZSBzdXBwbGllZCBhIGZyZWVmdW5jLgoJCQkJCQkJ ICovCgkJCQkJCQlpZiAoSGVhcFR1cGxlSXNWYWxpZCh2YXJkYXRhLT5zdGF0c1R1cGxlKSAm JgoJCQkJCQkJCSF2YXJkYXRhLT5mcmVlZnVuYykKCQkJCQkJCQllbG9nKEVSUk9SLCAibm8g ZnVuY3Rpb24gcHJvdmlkZWQgdG8gcmVsZWFzZSB2YXJpYWJsZSBzdGF0cyB3aXRoIik7CgkJ CQkJCX0KCQkJCQkJZWxzZSBpZiAoaW5kZXgtPmluZHByZWQgPT0gTklMKQoJCQkJCQl7CgkJ CQkJCQl2YXJkYXRhLT5zdGF0c1R1cGxlID0KCQkJCQkJCQlTZWFyY2hTeXNDYWNoZTMoU1RB VFJFTEFUVElOSCwKCQkJCQkJCQkJCQkJT2JqZWN0SWRHZXREYXR1bShpbmRleC0+aW5kZXhv aWQpLAoJCQkJCQkJCQkJCQlJbnQxNkdldERhdHVtKHBvcyArIDEpLAoJCQkJCQkJCQkJCQlC b29sR2V0RGF0dW0oZmFsc2UpKTsKCQkJCQkJCXZhcmRhdGEtPmZyZWVmdW5jID0gUmVsZWFz ZVN5c0NhY2hlOwoKCQkJCQkJCWlmIChIZWFwVHVwbGVJc1ZhbGlkKHZhcmRhdGEtPnN0YXRz VHVwbGUpKQoJCQkJCQkJewoJCQkJCQkJCS8qCgkJCQkJCQkJICogVGVzdCBpZiB1c2VyIGhh cyBwZXJtaXNzaW9uIHRvIGFjY2VzcyBhbGwKCQkJCQkJCQkgKiByb3dzIGZyb20gdGhlIGlu ZGV4J3MgdGFibGUuCgkJCQkJCQkJICoKCQkJCQkJCQkgKiBGb3Igc2ltcGxpY2l0eSwgd2Ug aW5zaXN0IG9uIHRoZSB3aG9sZQoJCQkJCQkJCSAqIHRhYmxlIGJlaW5nIHNlbGVjdGFibGUs IHJhdGhlciB0aGFuIHRyeWluZwoJCQkJCQkJCSAqIHRvIGlkZW50aWZ5IHdoaWNoIGNvbHVt bihzKSB0aGUgaW5kZXgKCQkJCQkJCQkgKiBkZXBlbmRzIG9uLgoJCQkJCQkJCSAqCgkJCQkJ CQkJICogTm90ZSB0aGF0IGZvciBhbiBpbmhlcml0YW5jZSBjaGlsZCwKCQkJCQkJCQkgKiBw ZXJtaXNzaW9ucyBhcmUgY2hlY2tlZCBvbiB0aGUgaW5oZXJpdGFuY2UKCQkJCQkJCQkgKiBy b290IHBhcmVudCwgYW5kIHdob2xlLXRhYmxlIHNlbGVjdAoJCQkJCQkJCSAqIHByaXZpbGVn ZSBvbiB0aGUgcGFyZW50IGRvZXNuJ3QgcXVpdGUKCQkJCQkJCQkgKiBndWFyYW50ZWUgdGhh dCB0aGUgdXNlciBjb3VsZCByZWFkIGFsbAoJCQkJCQkJCSAqIGNvbHVtbnMgb2YgdGhlIGNo aWxkLiAgQnV0IGluIHByYWN0aWNlIGl0J3MKCQkJCQkJCQkgKiB1bmxpa2VseSB0aGF0IGFu eSBpbnRlcmVzdGluZyBzZWN1cml0eQoJCQkJCQkJCSAqIHZpb2xhdGlvbiBjb3VsZCByZXN1 bHQgZnJvbSBhbGxvd2luZyBhY2Nlc3MKCQkJCQkJCQkgKiB0byB0aGUgZXhwcmVzc2lvbiBp bmRleCdzIHN0YXRzLCBzbyB3ZQoJCQkJCQkJCSAqIGFsbG93IGl0IGFueXdheS4gIFNlZSBz aW1pbGFyIGNvZGUgaW4KCQkJCQkJCQkgKiBleGFtaW5lX3NpbXBsZV92YXJpYWJsZSgpIGZv ciBhZGRpdGlvbmFsCgkJCQkJCQkJICogY29tbWVudHMuCgkJCQkJCQkJICovCgkJCQkJCQkJ dmFyZGF0YS0+YWNsX29rID0KCQkJCQkJCQkJYWxsX3Jvd3Nfc2VsZWN0YWJsZShyb290LAoJ CQkJCQkJCQkJCQkJCWluZGV4LT5yZWwtPnJlbGlkLAoJCQkJCQkJCQkJCQkJCU5VTEwpOwoJ CQkJCQkJfQoJCQkJCQkJZWxzZQoJCQkJCQkJewoJCQkJCQkJCS8qIHN1cHByZXNzIGxlYWtw cm9vZm5lc3MgY2hlY2tzIGxhdGVyICovCgkJCQkJCQkJdmFyZGF0YS0+YWNsX29rID0gdHJ1 ZTsKCQkJCQkJCX0KCQkJCQkJfQoJCQkJCQlpZiAodmFyZGF0YS0+c3RhdHNUdXBsZSkKCQkJ CQkJCWJyZWFrOwoJCQkJCX0KCQkJCQlpbmRleHByX2l0ZW0gPSBsbmV4dChpbmRleC0+aW5k ZXhwcnMsIGluZGV4cHJfaXRlbSk7CgkJCQl9CgkJCX0KCQkJaWYgKHZhcmRhdGEtPnN0YXRz VHVwbGUpCgkJCQlicmVhazsKCQl9CgoJCS8qCgkJICogU2VhcmNoIGV4dGVuZGVkIHN0YXRp c3RpY3MgZm9yIG9uZSB3aXRoIGEgbWF0Y2hpbmcgZXhwcmVzc2lvbi4KCQkgKiBUaGVyZSBt aWdodCBiZSBtdWx0aXBsZSBvbmVzLCBzbyBqdXN0IGdyYWIgdGhlIGZpcnN0IG9uZS4gSW4g dGhlCgkJICogZnV0dXJlLCB3ZSBtaWdodCBjb25zaWRlciB0aGUgc3RhdGlzdGljcyB0YXJn ZXQgKGFuZCBwaWNrIHRoZSBtb3N0CgkJICogYWNjdXJhdGUgc3RhdGlzdGljcykgYW5kIG1h eWJlIHNvbWUgb3RoZXIgcGFyYW1ldGVycy4KCQkgKi8KCQlmb3JlYWNoKHNsaXN0LCBvbmVy ZWwtPnN0YXRsaXN0KQoJCXsKCQkJU3RhdGlzdGljRXh0SW5mbyAqaW5mbyA9IChTdGF0aXN0 aWNFeHRJbmZvICopIGxmaXJzdChzbGlzdCk7CgkJCVJhbmdlVGJsRW50cnkgKnJ0ZSA9IHBs YW5uZXJfcnRfZmV0Y2gob25lcmVsLT5yZWxpZCwgcm9vdCk7CgkJCUxpc3RDZWxsICAgKmV4 cHJfaXRlbTsKCQkJaW50CQkJcG9zOwoKCQkJLyoKCQkJICogU3RvcCBvbmNlIHdlJ3ZlIGZv dW5kIHN0YXRpc3RpY3MgZm9yIHRoZSBleHByZXNzaW9uIChlaXRoZXIKCQkJICogZnJvbSBl eHRlbmRlZCBzdGF0cywgb3IgZm9yIGFuIGluZGV4IGluIHRoZSBwcmVjZWRpbmcgbG9vcCku CgkJCSAqLwoJCQlpZiAodmFyZGF0YS0+c3RhdHNUdXBsZSkKCQkJCWJyZWFrOwoKCQkJLyog c2tpcCBzdGF0cyB3aXRob3V0IHBlci1leHByZXNzaW9uIHN0YXRzICovCgkJCWlmIChpbmZv LT5raW5kICE9IFNUQVRTX0VYVF9FWFBSRVNTSU9OUykKCQkJCWNvbnRpbnVlOwoKCQkJLyog c2tpcCBzdGF0cyB3aXRoIG1pc21hdGNoaW5nIHN0eGRpbmhlcml0IHZhbHVlICovCgkJCWlm IChpbmZvLT5pbmhlcml0ICE9IHJ0ZS0+aW5oKQoJCQkJY29udGludWU7CgoJCQlwb3MgPSAw OwoJCQlmb3JlYWNoKGV4cHJfaXRlbSwgaW5mby0+ZXhwcnMpCgkJCXsKCQkJCU5vZGUJICAg KmV4cHIgPSAoTm9kZSAqKSBsZmlyc3QoZXhwcl9pdGVtKTsKCgkJCQlBc3NlcnQoZXhwcik7 CgoJCQkJLyogc3RyaXAgUmVsYWJlbFR5cGUgYmVmb3JlIGNvbXBhcmluZyBpdCAqLwoJCQkJ aWYgKGV4cHIgJiYgSXNBKGV4cHIsIFJlbGFiZWxUeXBlKSkKCQkJCQlleHByID0gKE5vZGUg KikgKChSZWxhYmVsVHlwZSAqKSBleHByKS0+YXJnOwoKCQkJCS8qIGZvdW5kIGEgbWF0Y2gs IHNlZSBpZiB3ZSBjYW4gZXh0cmFjdCBwZ19zdGF0aXN0aWMgcm93ICovCgkJCQlpZiAoZXF1 YWwobm9kZSwgZXhwcikpCgkJCQl7CgkJCQkJLyoKCQkJCQkgKiBYWFggTm90IHN1cmUgaWYg d2Ugc2hvdWxkIGNhY2hlIHRoZSB0dXBsZSBzb21ld2hlcmUuCgkJCQkJICogTm93IHdlIGp1 c3QgY3JlYXRlIGEgbmV3IGNvcHkgZXZlcnkgdGltZS4KCQkJCQkgKi8KCQkJCQl2YXJkYXRh LT5zdGF0c1R1cGxlID0KCQkJCQkJc3RhdGV4dF9leHByZXNzaW9uc19sb2FkKGluZm8tPnN0 YXRPaWQsIHJ0ZS0+aW5oLCBwb3MpOwoKCQkJCQkvKiBOb3RoaW5nIHRvIHJlbGVhc2UgaWYg bm8gZGF0YSBmb3VuZCAqLwoJCQkJCWlmICh2YXJkYXRhLT5zdGF0c1R1cGxlICE9IE5VTEwp CgkJCQkJewoJCQkJCQl2YXJkYXRhLT5mcmVlZnVuYyA9IFJlbGVhc2VEdW1teTsKCQkJCQl9 CgoJCQkJCS8qCgkJCQkJICogVGVzdCBpZiB1c2VyIGhhcyBwZXJtaXNzaW9uIHRvIGFjY2Vz cyBhbGwgcm93cyBmcm9tIHRoZQoJCQkJCSAqIHRhYmxlLgoJCQkJCSAqCgkJCQkJICogRm9y IHNpbXBsaWNpdHksIHdlIGluc2lzdCBvbiB0aGUgd2hvbGUgdGFibGUgYmVpbmcKCQkJCQkg KiBzZWxlY3RhYmxlLCByYXRoZXIgdGhhbiB0cnlpbmcgdG8gaWRlbnRpZnkgd2hpY2gKCQkJ CQkgKiBjb2x1bW4ocykgdGhlIHN0YXRpc3RpY3Mgb2JqZWN0IGRlcGVuZHMgb24uCgkJCQkJ ICoKCQkJCQkgKiBOb3RlIHRoYXQgZm9yIGFuIGluaGVyaXRhbmNlIGNoaWxkLCBwZXJtaXNz aW9ucyBhcmUKCQkJCQkgKiBjaGVja2VkIG9uIHRoZSBpbmhlcml0YW5jZSByb290IHBhcmVu dCwgYW5kIHdob2xlLXRhYmxlCgkJCQkJICogc2VsZWN0IHByaXZpbGVnZSBvbiB0aGUgcGFy ZW50IGRvZXNuJ3QgcXVpdGUgZ3VhcmFudGVlCgkJCQkJICogdGhhdCB0aGUgdXNlciBjb3Vs ZCByZWFkIGFsbCBjb2x1bW5zIG9mIHRoZSBjaGlsZC4gIEJ1dAoJCQkJCSAqIGluIHByYWN0 aWNlIGl0J3MgdW5saWtlbHkgdGhhdCBhbnkgaW50ZXJlc3Rpbmcgc2VjdXJpdHkKCQkJCQkg KiB2aW9sYXRpb24gY291bGQgcmVzdWx0IGZyb20gYWxsb3dpbmcgYWNjZXNzIHRvIHRoZQoJ CQkJCSAqIGV4cHJlc3Npb24gc3RhdHMsIHNvIHdlIGFsbG93IGl0IGFueXdheS4gIFNlZSBz aW1pbGFyCgkJCQkJICogY29kZSBpbiBleGFtaW5lX3NpbXBsZV92YXJpYWJsZSgpIGZvciBh ZGRpdGlvbmFsCgkJCQkJICogY29tbWVudHMuCgkJCQkJICovCgkJCQkJdmFyZGF0YS0+YWNs X29rID0gYWxsX3Jvd3Nfc2VsZWN0YWJsZShyb290LAoJCQkJCQkJCQkJCQkJCSAgb25lcmVs LT5yZWxpZCwKCQkJCQkJCQkJCQkJCQkgIE5VTEwpOwoKCQkJCQlicmVhazsKCQkJCX0KCgkJ CQlwb3MrKzsKCQkJfQoJCX0KCX0KCglibXNfZnJlZSh2YXJub3MpOwp9CgovKgogKiBzdHJp cF9hbGxfcGh2c19kZWVwCiAqCQlEZWVwbHkgc3RyaXAgYWxsIFBsYWNlSG9sZGVyVmFycyBp biBhbiBleHByZXNzaW9uLgogKgogKiBBcyBhIHBlcmZvcm1hbmNlIG9wdGltaXphdGlvbiwg d2UgZmlyc3QgdXNlIGEgbGlnaHR3ZWlnaHQgd2Fsa2VyIHRvIGNoZWNrCiAqIGZvciB0aGUg cHJlc2VuY2Ugb2YgYW55IFBsYWNlSG9sZGVyVmFycy4gIFRoZSBleHBlbnNpdmUgbXV0YXRv ciBpcyBpbnZva2VkCiAqIG9ubHkgaWYgYSBQbGFjZUhvbGRlclZhciBpcyBmb3VuZCwgYXZv aWRpbmcgdW5uZWNlc3NhcnkgbWVtb3J5IGFsbG9jYXRpb24KICogYW5kIHRyZWUgY29weWlu ZyBpbiB0aGUgY29tbW9uIGNhc2Ugd2hlcmUgbm8gUGxhY2VIb2xkZXJWYXJzIGFyZSBwcmVz ZW50LgogKi8Kc3RhdGljIE5vZGUgKgpzdHJpcF9hbGxfcGh2c19kZWVwKFBsYW5uZXJJbmZv ICpyb290LCBOb2RlICpub2RlKQp7CgkvKiBJZiB0aGVyZSBhcmUgbm8gUEhWcyBhbnl3aGVy ZSwgd2UgbmVlZG4ndCB3b3JrIGhhcmQgKi8KCWlmIChyb290LT5nbG9iLT5sYXN0UEhJZCA9 PSAwKQoJCXJldHVybiBub2RlOwoKCWlmICghY29udGFpbl9wbGFjZWhvbGRlcl93YWxrZXIo bm9kZSwgTlVMTCkpCgkJcmV0dXJuIG5vZGU7CglyZXR1cm4gc3RyaXBfYWxsX3BodnNfbXV0 YXRvcihub2RlLCBOVUxMKTsKfQoKLyoKICogY29udGFpbl9wbGFjZWhvbGRlcl93YWxrZXIK ICoJCUxpZ2h0d2VpZ2h0IHdhbGtlciB0byBjaGVjayBpZiBhbiBleHByZXNzaW9uIGNvbnRh aW5zIGFueQogKgkJUGxhY2VIb2xkZXJWYXJzCiAqLwpzdGF0aWMgYm9vbApjb250YWluX3Bs YWNlaG9sZGVyX3dhbGtlcihOb2RlICpub2RlLCB2b2lkICpjb250ZXh0KQp7CglpZiAobm9k ZSA9PSBOVUxMKQoJCXJldHVybiBmYWxzZTsKCWlmIChJc0Eobm9kZSwgUGxhY2VIb2xkZXJW YXIpKQoJCXJldHVybiB0cnVlOwoKCXJldHVybiBleHByZXNzaW9uX3RyZWVfd2Fsa2VyKG5v ZGUsIGNvbnRhaW5fcGxhY2Vob2xkZXJfd2Fsa2VyLCBjb250ZXh0KTsKfQoKLyoKICogc3Ry aXBfYWxsX3BodnNfbXV0YXRvcgogKgkJTXV0YXRvciB0byBkZWVwbHkgc3RyaXAgYWxsIFBs YWNlSG9sZGVyVmFycwogKi8Kc3RhdGljIE5vZGUgKgpzdHJpcF9hbGxfcGh2c19tdXRhdG9y KE5vZGUgKm5vZGUsIHZvaWQgKmNvbnRleHQpCnsKCWlmIChub2RlID09IE5VTEwpCgkJcmV0 dXJuIE5VTEw7CglpZiAoSXNBKG5vZGUsIFBsYWNlSG9sZGVyVmFyKSkKCXsKCQkvKiBTdHJp cCBpdCBhbmQgcmVjdXJzZSBpbnRvIGl0cyBjb250YWluZWQgZXhwcmVzc2lvbiAqLwoJCVBs YWNlSG9sZGVyVmFyICpwaHYgPSAoUGxhY2VIb2xkZXJWYXIgKikgbm9kZTsKCgkJcmV0dXJu IHN0cmlwX2FsbF9waHZzX211dGF0b3IoKE5vZGUgKikgcGh2LT5waGV4cHIsIGNvbnRleHQp OwoJfQoKCXJldHVybiBleHByZXNzaW9uX3RyZWVfbXV0YXRvcihub2RlLCBzdHJpcF9hbGxf cGh2c19tdXRhdG9yLCBjb250ZXh0KTsKfQoKLyoKICogZXhhbWluZV9zaW1wbGVfdmFyaWFi bGUKICoJCUhhbmRsZSBhIHNpbXBsZSBWYXIgZm9yIGV4YW1pbmVfdmFyaWFibGUKICoKICog VGhpcyBpcyBzcGxpdCBvdXQgYXMgYSBzdWJyb3V0aW5lIHNvIHRoYXQgd2UgY2FuIHJlY3Vy c2UgdG8gZGVhbCB3aXRoCiAqIFZhcnMgcmVmZXJlbmNpbmcgc3VicXVlcmllcyAoZWl0aGVy IHN1Yi1TRUxFQ1QtaW4tRlJPTSBvciBDVEUgc3R5bGUpLgogKgogKiBXZSBhbHJlYWR5IGZp bGxlZCBpbiBhbGwgdGhlIGZpZWxkcyBvZiAqdmFyZGF0YSBleGNlcHQgZm9yIHRoZSBzdGF0 cyB0dXBsZS4KICovCnN0YXRpYyB2b2lkCmV4YW1pbmVfc2ltcGxlX3ZhcmlhYmxlKFBsYW5u ZXJJbmZvICpyb290LCBWYXIgKnZhciwKCQkJCQkJVmFyaWFibGVTdGF0RGF0YSAqdmFyZGF0 YSkKewoJUmFuZ2VUYmxFbnRyeSAqcnRlID0gcm9vdC0+c2ltcGxlX3J0ZV9hcnJheVt2YXIt PnZhcm5vXTsKCglBc3NlcnQoSXNBKHJ0ZSwgUmFuZ2VUYmxFbnRyeSkpOwoKCWlmIChnZXRf cmVsYXRpb25fc3RhdHNfaG9vayAmJgoJCSgqZ2V0X3JlbGF0aW9uX3N0YXRzX2hvb2spIChy b290LCBydGUsIHZhci0+dmFyYXR0bm8sIHZhcmRhdGEpKQoJewoJCS8qCgkJICogVGhlIGhv b2sgdG9vayBjb250cm9sIG9mIGFjcXVpcmluZyBhIHN0YXRzIHR1cGxlLiAgSWYgaXQgZGlk IHN1cHBseQoJCSAqIGEgdHVwbGUsIGl0J2QgYmV0dGVyIGhhdmUgc3VwcGxpZWQgYSBmcmVl ZnVuYy4KCQkgKi8KCQlpZiAoSGVhcFR1cGxlSXNWYWxpZCh2YXJkYXRhLT5zdGF0c1R1cGxl KSAmJgoJCQkhdmFyZGF0YS0+ZnJlZWZ1bmMpCgkJCWVsb2coRVJST1IsICJubyBmdW5jdGlv biBwcm92aWRlZCB0byByZWxlYXNlIHZhcmlhYmxlIHN0YXRzIHdpdGgiKTsKCX0KCWVsc2Ug aWYgKHJ0ZS0+cnRla2luZCA9PSBSVEVfUkVMQVRJT04pCgl7CgkJLyoKCQkgKiBQbGFpbiB0 YWJsZSBvciBwYXJlbnQgb2YgYW4gaW5oZXJpdGFuY2UgYXBwZW5kcmVsLCBzbyBsb29rIHVw IHRoZQoJCSAqIGNvbHVtbiBpbiBwZ19zdGF0aXN0aWMKCQkgKi8KCQl2YXJkYXRhLT5zdGF0 c1R1cGxlID0gU2VhcmNoU3lzQ2FjaGUzKFNUQVRSRUxBVFRJTkgsCgkJCQkJCQkJCQkJICBP YmplY3RJZEdldERhdHVtKHJ0ZS0+cmVsaWQpLAoJCQkJCQkJCQkJCSAgSW50MTZHZXREYXR1 bSh2YXItPnZhcmF0dG5vKSwKCQkJCQkJCQkJCQkgIEJvb2xHZXREYXR1bShydGUtPmluaCkp OwoJCXZhcmRhdGEtPmZyZWVmdW5jID0gUmVsZWFzZVN5c0NhY2hlOwoKCQlpZiAoSGVhcFR1 cGxlSXNWYWxpZCh2YXJkYXRhLT5zdGF0c1R1cGxlKSkKCQl7CgkJCS8qCgkJCSAqIFRlc3Qg aWYgdXNlciBoYXMgcGVybWlzc2lvbiB0byByZWFkIGFsbCByb3dzIGZyb20gdGhpcyBjb2x1 bW4uCgkJCSAqCgkJCSAqIFRoaXMgcmVxdWlyZXMgdGhhdCB0aGUgdXNlciBoYXMgdGhlIGFw cHJvcHJpYXRlIFNFTEVDVAoJCQkgKiBwcml2aWxlZ2VzIGFuZCB0aGF0IHRoZXJlIGFyZSBu byBzZWN1cml0eVF1YWxzIGZyb20gc2VjdXJpdHkKCQkJICogYmFycmllciB2aWV3cyBvciBS TFMgcG9saWNpZXMuICBJZiB0aGF0J3Mgbm90IHRoZSBjYXNlLCB0aGVuIHdlCgkJCSAqIG9u bHkgcGVybWl0IGxlYWtwcm9vZiBmdW5jdGlvbnMgdG8gYmUgcGFzc2VkIHBnX3N0YXRpc3Rp YyBkYXRhCgkJCSAqIGluIHZhcmRhdGEsIG90aGVyd2lzZSB0aGUgZnVuY3Rpb25zIG1pZ2h0 IHJldmVhbCBkYXRhIHRoYXQgdGhlCgkJCSAqIHVzZXIgZG9lc24ndCBoYXZlIHBlcm1pc3Np b24gdG8gc2VlIC0tLSBzZWUKCQkJICogc3RhdGlzdGljX3Byb2Nfc2VjdXJpdHlfY2hlY2so KS4KCQkJICovCgkJCXZhcmRhdGEtPmFjbF9vayA9CgkJCQlhbGxfcm93c19zZWxlY3RhYmxl KHJvb3QsIHZhci0+dmFybm8sCgkJCQkJCQkJCWJtc19tYWtlX3NpbmdsZXRvbih2YXItPnZh cmF0dG5vIC0gRmlyc3RMb3dJbnZhbGlkSGVhcEF0dHJpYnV0ZU51bWJlcikpOwoJCX0KCQll bHNlCgkJewoJCQkvKiBzdXBwcmVzcyBhbnkgcG9zc2libGUgbGVha3Byb29mbmVzcyBjaGVj a3MgbGF0ZXIgKi8KCQkJdmFyZGF0YS0+YWNsX29rID0gdHJ1ZTsKCQl9Cgl9CgllbHNlIGlm ICgocnRlLT5ydGVraW5kID09IFJURV9TVUJRVUVSWSAmJiAhcnRlLT5pbmgpIHx8CgkJCSAo cnRlLT5ydGVraW5kID09IFJURV9DVEUgJiYgIXJ0ZS0+c2VsZl9yZWZlcmVuY2UpKQoJewoJ CS8qCgkJICogUGxhaW4gc3VicXVlcnkgKG5vdCBvbmUgdGhhdCB3YXMgY29udmVydGVkIHRv IGFuIGFwcGVuZHJlbCkgb3IKCQkgKiBub24tcmVjdXJzaXZlIENURS4gIEluIGVpdGhlciBj YXNlLCB3ZSBjYW4gdHJ5IHRvIGZpbmQgb3V0IHdoYXQgdGhlCgkJICogVmFyIHJlZmVycyB0 byB3aXRoaW4gdGhlIHN1YnF1ZXJ5LiAgV2Ugc2tpcCB0aGlzIGZvciBhcHBlbmRyZWwgYW5k CgkJICogcmVjdXJzaXZlLUNURSBjYXNlcyBiZWNhdXNlIGFueSBjb2x1bW4gc3RhdHMgd2Ug ZGlkIGZpbmQgd291bGQKCQkgKiBsaWtlbHkgbm90IGJlIHZlcnkgcmVsZXZhbnQuCgkJICov CgkJUGxhbm5lckluZm8gKnN1YnJvb3Q7CgkJUXVlcnkJICAgKnN1YnF1ZXJ5OwoJCUxpc3QJ ICAgKnN1YnRsaXN0OwoJCVRhcmdldEVudHJ5ICpzdGU7CgoJCS8qCgkJICogUHVudCBpZiBp dCdzIGEgd2hvbGUtcm93IHZhciByYXRoZXIgdGhhbiBhIHBsYWluIGNvbHVtbiByZWZlcmVu Y2UuCgkJICovCgkJaWYgKHZhci0+dmFyYXR0bm8gPT0gSW52YWxpZEF0dHJOdW1iZXIpCgkJ CXJldHVybjsKCgkJLyoKCQkgKiBPdGhlcndpc2UsIGZpbmQgdGhlIHN1YnF1ZXJ5J3MgcGxh bm5lciBzdWJyb290LgoJCSAqLwoJCWlmIChydGUtPnJ0ZWtpbmQgPT0gUlRFX1NVQlFVRVJZ KQoJCXsKCQkJUmVsT3B0SW5mbyAqcmVsOwoKCQkJLyoKCQkJICogRmV0Y2ggUmVsT3B0SW5m byBmb3Igc3VicXVlcnkuICBOb3RlIHRoYXQgd2UgZG9uJ3QgY2hhbmdlIHRoZQoJCQkgKiBy ZWwgcmV0dXJuZWQgaW4gdmFyZGF0YSwgc2luY2UgY2FsbGVyIGV4cGVjdHMgaXQgdG8gYmUg YSByZWwgb2YKCQkJICogdGhlIGNhbGxlcidzIHF1ZXJ5IGxldmVsLiAgQmVjYXVzZSB3ZSBt aWdodCBhbHJlYWR5IGJlCgkJCSAqIHJlY3Vyc2luZywgd2UgY2FuJ3QgdXNlIHRoYXQgcmVs IHBvaW50ZXIgZWl0aGVyLCBidXQgaGF2ZSB0bwoJCQkgKiBsb29rIHVwIHRoZSBWYXIncyBy ZWwgYWZyZXNoLgoJCQkgKi8KCQkJcmVsID0gZmluZF9iYXNlX3JlbChyb290LCB2YXItPnZh cm5vKTsKCgkJCXN1YnJvb3QgPSByZWwtPnN1YnJvb3Q7CgkJfQoJCWVsc2UKCQl7CgkJCS8q IENURSBjYXNlIGlzIG1vcmUgZGlmZmljdWx0ICovCgkJCVBsYW5uZXJJbmZvICpjdGVyb290 OwoJCQlJbmRleAkJbGV2ZWxzdXA7CgkJCWludAkJCW5keDsKCQkJaW50CQkJcGxhbl9pZDsK CQkJTGlzdENlbGwgICAqbGM7CgoJCQkvKgoJCQkgKiBGaW5kIHRoZSByZWZlcmVuY2VkIENU RSwgYW5kIGxvY2F0ZSB0aGUgc3Vicm9vdCBwcmV2aW91c2x5IG1hZGUKCQkJICogZm9yIGl0 LgoJCQkgKi8KCQkJbGV2ZWxzdXAgPSBydGUtPmN0ZWxldmVsc3VwOwoJCQljdGVyb290ID0g cm9vdDsKCQkJd2hpbGUgKGxldmVsc3VwLS0gPiAwKQoJCQl7CgkJCQljdGVyb290ID0gY3Rl cm9vdC0+cGFyZW50X3Jvb3Q7CgkJCQlpZiAoIWN0ZXJvb3QpCS8qIHNob3VsZG4ndCBoYXBw ZW4gKi8KCQkJCQllbG9nKEVSUk9SLCAiYmFkIGxldmVsc3VwIGZvciBDVEUgXCIlc1wiIiwg cnRlLT5jdGVuYW1lKTsKCQkJfQoKCQkJLyoKCQkJICogTm90ZTogY3RlX3BsYW5faWRzIGNh biBiZSBzaG9ydGVyIHRoYW4gY3RlTGlzdCwgaWYgd2UgYXJlIHN0aWxsCgkJCSAqIHdvcmtp bmcgb24gcGxhbm5pbmcgdGhlIENURXMgKGllLCB0aGlzIGlzIGEgc2lkZS1yZWZlcmVuY2Ug ZnJvbQoJCQkgKiBhbm90aGVyIENURSkuICBTbyB3ZSBtdXN0bid0IHVzZSBmb3Jib3RoIGhl cmUuCgkJCSAqLwoJCQluZHggPSAwOwoJCQlmb3JlYWNoKGxjLCBjdGVyb290LT5wYXJzZS0+ Y3RlTGlzdCkKCQkJewoJCQkJQ29tbW9uVGFibGVFeHByICpjdGUgPSAoQ29tbW9uVGFibGVF eHByICopIGxmaXJzdChsYyk7CgoJCQkJaWYgKHN0cmNtcChjdGUtPmN0ZW5hbWUsIHJ0ZS0+ Y3RlbmFtZSkgPT0gMCkKCQkJCQlicmVhazsKCQkJCW5keCsrOwoJCQl9CgkJCWlmIChsYyA9 PSBOVUxMKQkJLyogc2hvdWxkbid0IGhhcHBlbiAqLwoJCQkJZWxvZyhFUlJPUiwgImNvdWxk IG5vdCBmaW5kIENURSBcIiVzXCIiLCBydGUtPmN0ZW5hbWUpOwoJCQlpZiAobmR4ID49IGxp c3RfbGVuZ3RoKGN0ZXJvb3QtPmN0ZV9wbGFuX2lkcykpCgkJCQllbG9nKEVSUk9SLCAiY291 bGQgbm90IGZpbmQgcGxhbiBmb3IgQ1RFIFwiJXNcIiIsIHJ0ZS0+Y3RlbmFtZSk7CgkJCXBs YW5faWQgPSBsaXN0X250aF9pbnQoY3Rlcm9vdC0+Y3RlX3BsYW5faWRzLCBuZHgpOwoJCQlp ZiAocGxhbl9pZCA8PSAwKQoJCQkJZWxvZyhFUlJPUiwgIm5vIHBsYW4gd2FzIG1hZGUgZm9y IENURSBcIiVzXCIiLCBydGUtPmN0ZW5hbWUpOwoJCQlzdWJyb290ID0gbGlzdF9udGgocm9v dC0+Z2xvYi0+c3Vicm9vdHMsIHBsYW5faWQgLSAxKTsKCQl9CgoJCS8qIElmIHRoZSBzdWJx dWVyeSBoYXNuJ3QgYmVlbiBwbGFubmVkIHlldCwgd2UgaGF2ZSB0byBwdW50ICovCgkJaWYg KHN1YnJvb3QgPT0gTlVMTCkKCQkJcmV0dXJuOwoJCUFzc2VydChJc0Eoc3Vicm9vdCwgUGxh bm5lckluZm8pKTsKCgkJLyoKCQkgKiBXZSBtdXN0IHVzZSB0aGUgc3VicXVlcnkgcGFyc2V0 cmVlIGFzIG1hbmdsZWQgYnkgdGhlIHBsYW5uZXIsIG5vdAoJCSAqIHRoZSByYXcgdmVyc2lv biBmcm9tIHRoZSBSVEUsIGJlY2F1c2Ugd2UgbmVlZCBhIFZhciB0aGF0IHdpbGwgcmVmZXIK CQkgKiB0byB0aGUgc3Vicm9vdCdzIGxpdmUgUmVsT3B0SW5mb3MuICBGb3IgaW5zdGFuY2Us IGlmIGFueSBzdWJxdWVyeQoJCSAqIHB1bGx1cCBoYXBwZW5lZCBkdXJpbmcgcGxhbm5pbmcs IFZhcnMgaW4gdGhlIHRhcmdldGxpc3QgbWlnaHQgaGF2ZQoJCSAqIGdvdHRlbiByZXBsYWNl ZCwgYW5kIHdlIG5lZWQgdG8gc2VlIHRoZSByZXBsYWNlbWVudCBleHByZXNzaW9ucy4KCQkg Ki8KCQlzdWJxdWVyeSA9IHN1YnJvb3QtPnBhcnNlOwoJCUFzc2VydChJc0Eoc3VicXVlcnks IFF1ZXJ5KSk7CgoJCS8qCgkJICogUHVudCBpZiBzdWJxdWVyeSB1c2VzIHNldCBvcGVyYXRp b25zIG9yIGdyb3VwaW5nIHNldHMsIGFzIHRoZXNlCgkJICogd2lsbCBtYXNoIHVuZGVybHlp bmcgY29sdW1ucycgc3RhdHMgYmV5b25kIHJlY29nbml0aW9uLiAgKFNldCBvcHMKCQkgKiBh cmUgcGFydGljdWxhcmx5IG5hc3R5OyBpZiB3ZSBmb3JnZWQgYWhlYWQsIHdlIHdvdWxkIHJl dHVybiBzdGF0cwoJCSAqIHJlbGV2YW50IHRvIG9ubHkgdGhlIGxlZnRtb3N0IHN1YnNlbGVj dC4uLikJRElTVElOQ1QgaXMgYWxzbwoJCSAqIHByb2JsZW1hdGljLCBidXQgd2UgY2hlY2sg dGhhdCBsYXRlciBiZWNhdXNlIHRoZXJlIGlzIGEgcG9zc2liaWxpdHkKCQkgKiBvZiBsZWFy bmluZyBzb21ldGhpbmcgZXZlbiB3aXRoIGl0LgoJCSAqLwoJCWlmIChzdWJxdWVyeS0+c2V0 T3BlcmF0aW9ucyB8fAoJCQlzdWJxdWVyeS0+Z3JvdXBpbmdTZXRzKQoJCQlyZXR1cm47CgoJ CS8qIEdldCB0aGUgc3VicXVlcnkgb3V0cHV0IGV4cHJlc3Npb24gcmVmZXJlbmNlZCBieSB0 aGUgdXBwZXIgVmFyICovCgkJaWYgKHN1YnF1ZXJ5LT5yZXR1cm5pbmdMaXN0KQoJCQlzdWJ0 bGlzdCA9IHN1YnF1ZXJ5LT5yZXR1cm5pbmdMaXN0OwoJCWVsc2UKCQkJc3VidGxpc3QgPSBz dWJxdWVyeS0+dGFyZ2V0TGlzdDsKCQlzdGUgPSBnZXRfdGxlX2J5X3Jlc25vKHN1YnRsaXN0 LCB2YXItPnZhcmF0dG5vKTsKCQlpZiAoc3RlID09IE5VTEwgfHwgc3RlLT5yZXNqdW5rKQoJ CQllbG9nKEVSUk9SLCAic3VicXVlcnkgJXMgZG9lcyBub3QgaGF2ZSBhdHRyaWJ1dGUgJWQi LAoJCQkJIHJ0ZS0+ZXJlZi0+YWxpYXNuYW1lLCB2YXItPnZhcmF0dG5vKTsKCQl2YXIgPSAo VmFyICopIHN0ZS0+ZXhwcjsKCgkJLyoKCQkgKiBJZiBzdWJxdWVyeSB1c2VzIERJU1RJTkNU LCB3ZSBjYW4ndCBtYWtlIHVzZSBvZiBhbnkgc3RhdHMgZm9yIHRoZQoJCSAqIHZhcmlhYmxl IC4uLiBidXQsIGlmIGl0J3MgdGhlIG9ubHkgRElTVElOQ1QgY29sdW1uLCB3ZSBhcmUgZW50 aXRsZWQKCQkgKiB0byBjb25zaWRlciBpdCB1bmlxdWUuICBXZSBkbyB0aGUgdGVzdCB0aGlz IHdheSBzbyB0aGF0IGl0IHdvcmtzCgkJICogZm9yIGNhc2VzIGludm9sdmluZyBESVNUSU5D VCBPTi4KCQkgKi8KCQlpZiAoc3VicXVlcnktPmRpc3RpbmN0Q2xhdXNlKQoJCXsKCQkJaWYg KGxpc3RfbGVuZ3RoKHN1YnF1ZXJ5LT5kaXN0aW5jdENsYXVzZSkgPT0gMSAmJgoJCQkJdGFy Z2V0SXNJblNvcnRMaXN0KHN0ZSwgSW52YWxpZE9pZCwgc3VicXVlcnktPmRpc3RpbmN0Q2xh dXNlKSkKCQkJCXZhcmRhdGEtPmlzdW5pcXVlID0gdHJ1ZTsKCQkJLyogY2Fubm90IGdvIGZ1 cnRoZXIgKi8KCQkJcmV0dXJuOwoJCX0KCgkJLyogVGhlIHNhbWUgaWRlYSBhcyB3aXRoIERJ U1RJTkNUIGNsYXVzZSB3b3JrcyBmb3IgYSBHUk9VUC1CWSB0b28gKi8KCQlpZiAoc3VicXVl cnktPmdyb3VwQ2xhdXNlKQoJCXsKCQkJaWYgKGxpc3RfbGVuZ3RoKHN1YnF1ZXJ5LT5ncm91 cENsYXVzZSkgPT0gMSAmJgoJCQkJdGFyZ2V0SXNJblNvcnRMaXN0KHN0ZSwgSW52YWxpZE9p ZCwgc3VicXVlcnktPmdyb3VwQ2xhdXNlKSkKCQkJCXZhcmRhdGEtPmlzdW5pcXVlID0gdHJ1 ZTsKCQkJLyogY2Fubm90IGdvIGZ1cnRoZXIgKi8KCQkJcmV0dXJuOwoJCX0KCgkJLyoKCQkg KiBJZiB0aGUgc3ViLXF1ZXJ5IG9yaWdpbmF0ZWQgZnJvbSBhIHZpZXcgd2l0aCB0aGUgc2Vj dXJpdHlfYmFycmllcgoJCSAqIGF0dHJpYnV0ZSwgd2UgbXVzdCBub3QgbG9vayBhdCB0aGUg dmFyaWFibGUncyBzdGF0aXN0aWNzLCB0aG91Z2ggaXQKCQkgKiBzZWVtcyBhbGwgcmlnaHQg dG8gbm90aWNlIHRoZSBleGlzdGVuY2Ugb2YgYSBESVNUSU5DVCBjbGF1c2UuIFNvCgkJICog c3RvcCBoZXJlLgoJCSAqCgkJICogVGhpcyBpcyBwcm9iYWJseSBhIGhhcnNoZXIgcmVzdHJp Y3Rpb24gdGhhbiBuZWNlc3Nhcnk7IGl0J3MKCQkgKiBjZXJ0YWlubHkgT0sgZm9yIHRoZSBz ZWxlY3Rpdml0eSBlc3RpbWF0b3IgKHdoaWNoIGlzIGEgQyBmdW5jdGlvbiwKCQkgKiBhbmQg dGhlcmVmb3JlIG9tbmlwb3RlbnQgYW55d2F5KSB0byBsb29rIGF0IHRoZSBzdGF0aXN0aWNz LiAgQnV0CgkJICogbWFueSBzZWxlY3Rpdml0eSBlc3RpbWF0b3JzIHdpbGwgaGFwcGlseSAq aW52b2tlIHRoZSBvcGVyYXRvcgoJCSAqIGZ1bmN0aW9uKiB0byB0cnkgdG8gd29yayBvdXQg YSBnb29kIGVzdGltYXRlIC0gYW5kIHRoYXQncyBub3QgT0suCgkJICogU28gZm9yIG5vdywg ZG9uJ3QgZGlnIGRvd24gZm9yIHN0YXRzLgoJCSAqLwoJCWlmIChydGUtPnNlY3VyaXR5X2Jh cnJpZXIpCgkJCXJldHVybjsKCgkJLyogQ2FuIG9ubHkgaGFuZGxlIGEgc2ltcGxlIFZhciBv ZiBzdWJxdWVyeSdzIHF1ZXJ5IGxldmVsICovCgkJaWYgKHZhciAmJiBJc0EodmFyLCBWYXIp ICYmCgkJCXZhci0+dmFybGV2ZWxzdXAgPT0gMCkKCQl7CgkJCS8qCgkJCSAqIE9LLCByZWN1 cnNlIGludG8gdGhlIHN1YnF1ZXJ5LiAgTm90ZSB0aGF0IHRoZSBvcmlnaW5hbCBzZXR0aW5n CgkJCSAqIG9mIHZhcmRhdGEtPmlzdW5pcXVlICh3aGljaCB3aWxsIHN1cmVseSBiZSBmYWxz ZSkgaXMgbGVmdAoJCQkgKiB1bmNoYW5nZWQgaW4gdGhpcyBzaXR1YXRpb24uICBUaGF0J3Mg d2hhdCB3ZSB3YW50LCBzaW5jZSBldmVuCgkJCSAqIGlmIHRoZSB1bmRlcmx5aW5nIGNvbHVt biBpcyB1bmlxdWUsIHRoZSBzdWJxdWVyeSBtYXkgaGF2ZQoJCQkgKiBqb2luZWQgdG8gb3Ro ZXIgdGFibGVzIGluIGEgd2F5IHRoYXQgY3JlYXRlcyBkdXBsaWNhdGVzLgoJCQkgKi8KCQkJ ZXhhbWluZV9zaW1wbGVfdmFyaWFibGUoc3Vicm9vdCwgdmFyLCB2YXJkYXRhKTsKCQl9Cgl9 CgllbHNlCgl7CgkJLyoKCQkgKiBPdGhlcndpc2UsIHRoZSBWYXIgY29tZXMgZnJvbSBhIEZV TkNUSU9OIG9yIFZBTFVFUyBSVEUuICAoV2Ugd29uJ3QKCQkgKiBzZWUgUlRFX0pPSU4gaGVy ZSBiZWNhdXNlIGpvaW4gYWxpYXMgVmFycyBoYXZlIGFscmVhZHkgYmVlbgoJCSAqIGZsYXR0 ZW5lZC4pCVRoZXJlJ3Mgbm90IG11Y2ggd2UgY2FuIGRvIHdpdGggZnVuY3Rpb24gb3V0cHV0 cywgYnV0CgkJICogbWF5YmUgc29tZWRheSB0cnkgdG8gYmUgc21hcnRlciBhYm91dCBWQUxV RVMuCgkJICovCgl9Cn0KCi8qCiAqIGFsbF9yb3dzX3NlbGVjdGFibGUKICoJCVRlc3Qgd2hl dGhlciB0aGUgdXNlciBoYXMgcGVybWlzc2lvbiB0byBzZWxlY3QgYWxsIHJvd3MgZnJvbSBh IGdpdmVuCiAqCQlyZWxhdGlvbi4KICoKICogSW5wdXRzOgogKglyb290OiB0aGUgcGxhbm5l ciBpbmZvCiAqCXZhcm5vOiB0aGUgaW5kZXggb2YgdGhlIHJlbGF0aW9uIChhc3N1bWVkIHRv IGJlIGFuIFJURV9SRUxBVElPTikKICoJdmFyYXR0bm9zOiB0aGUgYXR0cmlidXRlcyBmb3Ig d2hpY2ggcGVybWlzc2lvbiBpcyByZXF1aXJlZCwgb3IgTlVMTCBpZgogKgkJd2hvbGUtdGFi bGUgYWNjZXNzIGlzIHJlcXVpcmVkCiAqCiAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgdXNlciBo YXMgdGhlIHJlcXVpcmVkIHNlbGVjdCBwZXJtaXNzaW9ucywgYW5kIHRoZXJlIGFyZQogKiBu byBzZWN1cml0eVF1YWxzIGZyb20gc2VjdXJpdHkgYmFycmllciB2aWV3cyBvciBSTFMgcG9s aWNpZXMuCiAqCiAqIE5vdGUgdGhhdCBpZiB0aGUgcmVsYXRpb24gaXMgYW4gaW5oZXJpdGFu Y2UgY2hpbGQgcmVsYXRpb24sIHNlY3VyaXR5UXVhbHMKICogYW5kIGFjY2VzcyBwZXJtaXNz aW9ucyBhcmUgY2hlY2tlZCBhZ2FpbnN0IHRoZSBpbmhlcml0YW5jZSByb290IHBhcmVudCAo dGhlCiAqIHJlbGF0aW9uIGFjdHVhbGx5IG1lbnRpb25lZCBpbiB0aGUgcXVlcnkpIC0tLSBz ZWUgdGhlIGNvbW1lbnRzIGluCiAqIGV4cGFuZF9zaW5nbGVfaW5oZXJpdGFuY2VfY2hpbGQo KSBmb3IgYW4gZXhwbGFuYXRpb24gb2Ygd2h5IGl0IGhhcyB0byBiZQogKiBkb25lIHRoaXMg d2F5LgogKgogKiBJZiB2YXJhdHRub3MgaXMgbm9uLU5VTEwsIGl0cyBhdHRyaWJ1dGUgbnVt YmVycyBzaG91bGQgYmUgb2Zmc2V0IGJ5CiAqIEZpcnN0TG93SW52YWxpZEhlYXBBdHRyaWJ1 dGVOdW1iZXIgc28gdGhhdCBzeXN0ZW0gYXR0cmlidXRlcyBjYW4gYmUKICogY2hlY2tlZC4g IElmIHZhcmF0dG5vcyBpcyBOVUxMLCBvbmx5IHRhYmxlLWxldmVsIFNFTEVDVCBwcml2aWxl Z2VzIGFyZQogKiBjaGVja2VkLCBub3QgYW55IGNvbHVtbi1sZXZlbCBwcml2aWxlZ2VzLgog KgogKiBOb3RlOiBpZiB0aGUgcmVsYXRpb24gaXMgYWNjZXNzZWQgdmlhIGEgdmlldywgdGhp cyBmdW5jdGlvbiBhY3R1YWxseSB0ZXN0cwogKiB3aGV0aGVyIHRoZSB2aWV3IG93bmVyIGhh cyBwZXJtaXNzaW9uIHRvIHNlbGVjdCBmcm9tIHRoZSByZWxhdGlvbi4gIFRvCiAqIGVuc3Vy ZSB0aGF0IHRoZSBjdXJyZW50IHVzZXIgaGFzIHBlcm1pc3Npb24sIGl0IGlzIGFsc28gbmVj ZXNzYXJ5IHRvIGNoZWNrCiAqIHRoYXQgdGhlIGN1cnJlbnQgdXNlciBoYXMgcGVybWlzc2lv biB0byBzZWxlY3QgZnJvbSB0aGUgdmlldywgd2hpY2ggd2UgZG8KICogYXQgcGxhbm5lci1z dGFydHVwIC0tLSBzZWUgc3VicXVlcnlfcGxhbm5lcigpLgogKgogKiBUaGlzIGlzIGV4cG9y dGVkIHNvIHRoYXQgb3RoZXIgZXN0aW1hdGlvbiBmdW5jdGlvbnMgY2FuIHVzZSBpdC4KICov CmJvb2wKYWxsX3Jvd3Nfc2VsZWN0YWJsZShQbGFubmVySW5mbyAqcm9vdCwgSW5kZXggdmFy bm8sIEJpdG1hcHNldCAqdmFyYXR0bm9zKQp7CglSZWxPcHRJbmZvICpyZWwgPSBmaW5kX2Jh c2VfcmVsX25vZXJyKHJvb3QsIHZhcm5vKTsKCVJhbmdlVGJsRW50cnkgKnJ0ZSA9IHBsYW5u ZXJfcnRfZmV0Y2godmFybm8sIHJvb3QpOwoJT2lkCQkJdXNlcmlkOwoJaW50CQkJdmFyYXR0 bm87CgoJQXNzZXJ0KHJ0ZS0+cnRla2luZCA9PSBSVEVfUkVMQVRJT04pOwoKCS8qCgkgKiBE ZXRlcm1pbmUgdGhlIHVzZXIgSUQgdG8gdXNlIGZvciBwcml2aWxlZ2UgY2hlY2tzIChlaXRo ZXIgdGhlIGN1cnJlbnQKCSAqIHVzZXIgb3IgdGhlIHZpZXcgb3duZXIsIGlmIHdlJ3JlIGFj Y2Vzc2luZyB0aGUgdGFibGUgdmlhIGEgdmlldykuCgkgKgoJICogTm9ybWFsbHkgdGhlIHJl bGF0aW9uIHdpbGwgaGF2ZSBhbiBhc3NvY2lhdGVkIFJlbE9wdEluZm8gZnJvbSB3aGljaCB3 ZQoJICogY2FuIGZpbmQgdGhlIHVzZXJpZCwgYnV0IGl0IG1pZ2h0IG5vdCBpZiBpdCdzIGEg UkVUVVJOSU5HIFZhciBmb3IgYW4KCSAqIElOU0VSVCB0YXJnZXQgcmVsYXRpb24uICBJbiB0 aGF0IGNhc2UgdXNlIHRoZSBSVEVQZXJtaXNzaW9uSW5mbwoJICogYXNzb2NpYXRlZCB3aXRo IHRoZSBSVEUuCgkgKgoJICogSWYgd2UgbmF2aWdhdGUgdXAgdG8gYSBwYXJlbnQgcmVsYXRp b24sIHdlIGtlZXAgdXNpbmcgdGhlIHNhbWUgdXNlcmlkLAoJICogc2luY2UgaXQncyB0aGUg c2FtZSBpbiBhbGwgcmVsYXRpb25zIG9mIGEgZ2l2ZW4gaW5oZXJpdGFuY2UgdHJlZS4KCSAq LwoJaWYgKHJlbCkKCQl1c2VyaWQgPSByZWwtPnVzZXJpZDsKCWVsc2UKCXsKCQlSVEVQZXJt aXNzaW9uSW5mbyAqcGVybWluZm87CgoJCXBlcm1pbmZvID0gZ2V0UlRFUGVybWlzc2lvbklu Zm8ocm9vdC0+cGFyc2UtPnJ0ZXBlcm1pbmZvcywgcnRlKTsKCQl1c2VyaWQgPSBwZXJtaW5m by0+Y2hlY2tBc1VzZXI7Cgl9CglpZiAoIU9pZElzVmFsaWQodXNlcmlkKSkKCQl1c2VyaWQg PSBHZXRVc2VySWQoKTsKCgkvKgoJICogUGVybWlzc2lvbnMgYW5kIHNlY3VyaXR5UXVhbHMg bXVzdCBiZSBjaGVja2VkIG9uIHRoZSB0YWJsZSBhY3R1YWxseQoJICogbWVudGlvbmVkIGlu IHRoZSBxdWVyeSwgc28gaWYgdGhpcyBpcyBhbiBpbmhlcml0YW5jZSBjaGlsZCwgbmF2aWdh dGUgdXAKCSAqIHRvIHRoZSBpbmhlcml0YW5jZSByb290IHBhcmVudC4gIElmIHRoZSB1c2Vy IGNhbiByZWFkIHRoZSB3aG9sZSB0YWJsZQoJICogb3IgdGhlIHJlcXVpcmVkIGNvbHVtbnMg dGhlcmUsIHRoZW4gdGhleSBjYW4gcmVhZCBmcm9tIHRoZSBjaGlsZCB0YWJsZQoJICogdG9v LiAgRm9yIHBlci1jb2x1bW4gY2hlY2tzLCB3ZSBtdXN0IGZpbmQgb3V0IHdoaWNoIG9mIHRo ZSByb290CgkgKiBwYXJlbnQncyBhdHRyaWJ1dGVzIHRoZSBjaGlsZCByZWxhdGlvbidzIGF0 dHJpYnV0ZXMgY29ycmVzcG9uZCB0by4KCSAqLwoJaWYgKHJvb3QtPmFwcGVuZF9yZWxfYXJy YXkgIT0gTlVMTCkKCXsKCQlBcHBlbmRSZWxJbmZvICphcHBpbmZvOwoKCQlhcHBpbmZvID0g cm9vdC0+YXBwZW5kX3JlbF9hcnJheVt2YXJub107CgoJCS8qCgkJICogUGFydGl0aW9ucyBh cmUgbWFwcGVkIHRvIHRoZWlyIGltbWVkaWF0ZSBwYXJlbnQsIG5vdCB0aGUgcm9vdAoJCSAq IHBhcmVudCwgc28gbXVzdCBiZSByZWFkeSB0byB3YWxrIHVwIG11bHRpcGxlIEFwcGVuZFJl bEluZm9zLiAgQnV0CgkJICogc3RvcCBpZiB3ZSBoaXQgYSBwYXJlbnQgdGhhdCBpcyBub3Qg UlRFX1JFTEFUSU9OIC0tLSB0aGF0J3MgYQoJCSAqIGZsYXR0ZW5lZCBVTklPTiBBTEwgc3Vi cXVlcnksIG5vdCBhbiBpbmhlcml0YW5jZSBwYXJlbnQuCgkJICovCgkJd2hpbGUgKGFwcGlu Zm8gJiYKCQkJICAgcGxhbm5lcl9ydF9mZXRjaChhcHBpbmZvLT5wYXJlbnRfcmVsaWQsCgkJ CQkJCQkJcm9vdCktPnJ0ZWtpbmQgPT0gUlRFX1JFTEFUSU9OKQoJCXsKCQkJQml0bWFwc2V0 ICAqcGFyZW50X3ZhcmF0dG5vcyA9IE5VTEw7CgoJCQkvKgoJCQkgKiBGb3IgZWFjaCBjaGls ZCBhdHRyaWJ1dGUsIGZpbmQgdGhlIGNvcnJlc3BvbmRpbmcgcGFyZW50CgkJCSAqIGF0dHJp YnV0ZS4gIEluIHJhcmUgY2FzZXMsIHRoZSBhdHRyaWJ1dGUgbWF5IGJlIGxvY2FsIHRvIHRo ZQoJCQkgKiBjaGlsZCB0YWJsZSwgaW4gd2hpY2ggY2FzZSwgd2UndmUgZ290IHRvIGxpdmUg d2l0aCBoYXZpbmcgbm8KCQkJICogYWNjZXNzIHRvIHRoaXMgY29sdW1uLgoJCQkgKi8KCQkJ dmFyYXR0bm8gPSAtMTsKCQkJd2hpbGUgKCh2YXJhdHRubyA9IGJtc19uZXh0X21lbWJlcih2 YXJhdHRub3MsIHZhcmF0dG5vKSkgPj0gMCkKCQkJewoJCQkJQXR0ck51bWJlcglhdHRubzsK CQkJCUF0dHJOdW1iZXIJcGFyZW50X2F0dG5vOwoKCQkJCWF0dG5vID0gdmFyYXR0bm8gKyBG aXJzdExvd0ludmFsaWRIZWFwQXR0cmlidXRlTnVtYmVyOwoKCQkJCWlmIChhdHRubyA9PSBJ bnZhbGlkQXR0ck51bWJlcikKCQkJCXsKCQkJCQkvKgoJCQkJCSAqIFdob2xlLXJvdyByZWZl cmVuY2UsIHNvIG11c3QgbWFwIGVhY2ggY29sdW1uIG9mIHRoZQoJCQkJCSAqIGNoaWxkIHRv IHRoZSBwYXJlbnQgdGFibGUuCgkJCQkJICovCgkJCQkJZm9yIChhdHRubyA9IDE7IGF0dG5v IDw9IGFwcGluZm8tPm51bV9jaGlsZF9jb2xzOyBhdHRubysrKQoJCQkJCXsKCQkJCQkJcGFy ZW50X2F0dG5vID0gYXBwaW5mby0+cGFyZW50X2NvbG5vc1thdHRubyAtIDFdOwoJCQkJCQlp ZiAocGFyZW50X2F0dG5vID09IDApCgkJCQkJCQlyZXR1cm4gZmFsc2U7CS8qIGF0dHIgaXMg bG9jYWwgdG8gY2hpbGQgKi8KCQkJCQkJcGFyZW50X3ZhcmF0dG5vcyA9CgkJCQkJCQlibXNf YWRkX21lbWJlcihwYXJlbnRfdmFyYXR0bm9zLAoJCQkJCQkJCQkJICAgcGFyZW50X2F0dG5v IC0gRmlyc3RMb3dJbnZhbGlkSGVhcEF0dHJpYnV0ZU51bWJlcik7CgkJCQkJfQoJCQkJfQoJ CQkJZWxzZQoJCQkJewoJCQkJCWlmIChhdHRubyA8IDApCgkJCQkJewoJCQkJCQkvKiBTeXN0 ZW0gYXR0bm9zIGFyZSB0aGUgc2FtZSBpbiBhbGwgdGFibGVzICovCgkJCQkJCXBhcmVudF9h dHRubyA9IGF0dG5vOwoJCQkJCX0KCQkJCQllbHNlCgkJCQkJewoJCQkJCQlpZiAoYXR0bm8g PiBhcHBpbmZvLT5udW1fY2hpbGRfY29scykKCQkJCQkJCXJldHVybiBmYWxzZTsJLyogc2Fm ZXR5IGNoZWNrICovCgkJCQkJCXBhcmVudF9hdHRubyA9IGFwcGluZm8tPnBhcmVudF9jb2xu b3NbYXR0bm8gLSAxXTsKCQkJCQkJaWYgKHBhcmVudF9hdHRubyA9PSAwKQoJCQkJCQkJcmV0 dXJuIGZhbHNlOwkvKiBhdHRyIGlzIGxvY2FsIHRvIGNoaWxkICovCgkJCQkJfQoJCQkJCXBh cmVudF92YXJhdHRub3MgPQoJCQkJCQlibXNfYWRkX21lbWJlcihwYXJlbnRfdmFyYXR0bm9z LAoJCQkJCQkJCQkgICBwYXJlbnRfYXR0bm8gLSBGaXJzdExvd0ludmFsaWRIZWFwQXR0cmli dXRlTnVtYmVyKTsKCQkJCX0KCQkJfQoKCQkJLyogSWYgdGhlIHBhcmVudCBpcyBpdHNlbGYg YSBjaGlsZCwgY29udGludWUgdXAgKi8KCQkJdmFybm8gPSBhcHBpbmZvLT5wYXJlbnRfcmVs aWQ7CgkJCXZhcmF0dG5vcyA9IHBhcmVudF92YXJhdHRub3M7CgkJCWFwcGluZm8gPSByb290 LT5hcHBlbmRfcmVsX2FycmF5W3Zhcm5vXTsKCQl9CgoJCS8qIFBlcmZvcm0gdGhlIGFjY2Vz cyBjaGVjayBvbiB0aGlzIHBhcmVudCByZWwgKi8KCQlydGUgPSBwbGFubmVyX3J0X2ZldGNo KHZhcm5vLCByb290KTsKCQlBc3NlcnQocnRlLT5ydGVraW5kID09IFJURV9SRUxBVElPTik7 Cgl9CgoJLyoKCSAqIEZvciBhbGwgcm93cyB0byBiZSBhY2Nlc3NpYmxlLCB0aGVyZSBtdXN0 IGJlIG5vIHNlY3VyaXR5UXVhbHMgZnJvbQoJICogc2VjdXJpdHkgYmFycmllciB2aWV3cyBv ciBSTFMgcG9saWNpZXMuCgkgKi8KCWlmIChydGUtPnNlY3VyaXR5UXVhbHMgIT0gTklMKQoJ CXJldHVybiBmYWxzZTsKCgkvKgoJICogVGVzdCBmb3IgdGFibGUtbGV2ZWwgU0VMRUNUIHBy aXZpbGVnZS4KCSAqCgkgKiBJZiB2YXJhdHRub3MgaXMgbm9uLU5VTEwsIHRoaXMgaXMgc3Vm ZmljaWVudCB0byBnaXZlIGFjY2VzcyB0byBhbGwKCSAqIHJlcXVlc3RlZCBhdHRyaWJ1dGVz LCBldmVuIGZvciBhIGNoaWxkIHRhYmxlLCBzaW5jZSB3ZSBoYXZlIHZlcmlmaWVkCgkgKiB0 aGF0IGFsbCByZXF1aXJlZCBjaGlsZCBjb2x1bW5zIGhhdmUgbWF0Y2hpbmcgcGFyZW50IGNv bHVtbnMuCgkgKgoJICogSWYgdmFyYXR0bm9zIGlzIE5VTEwgKHdob2xlLXRhYmxlIGFjY2Vz cyByZXF1ZXN0ZWQpLCB0aGlzIGRvZXNuJ3QKCSAqIG5lY2Vzc2FyaWx5IGd1YXJhbnRlZSB0 aGF0IHRoZSB1c2VyIGNhbiByZWFkIGFsbCBjb2x1bW5zIG9mIGEgY2hpbGQKCSAqIHRhYmxl LCBidXQgd2UgYWxsb3cgaXQgYW55d2F5IChzZWUgY29tbWVudHMgaW4gZXhhbWluZV92YXJp YWJsZSgpKSBhbmQKCSAqIGRvbid0IGJvdGhlciBjaGVja2luZyBhbnkgY29sdW1uIHByaXZp bGVnZXMuCgkgKi8KCWlmIChwZ19jbGFzc19hY2xjaGVjayhydGUtPnJlbGlkLCB1c2VyaWQs IEFDTF9TRUxFQ1QpID09IEFDTENIRUNLX09LKQoJCXJldHVybiB0cnVlOwoKCWlmICh2YXJh dHRub3MgPT0gTlVMTCkKCQlyZXR1cm4gZmFsc2U7CQkJLyogd2hvbGUtdGFibGUgYWNjZXNz IHJlcXVlc3RlZCAqLwoKCS8qCgkgKiBEb24ndCBoYXZlIHRhYmxlLWxldmVsIFNFTEVDVCBw cml2aWxlZ2UsIHNvIGNoZWNrIHBlci1jb2x1bW4KCSAqIHByaXZpbGVnZXMuCgkgKi8KCXZh cmF0dG5vID0gLTE7Cgl3aGlsZSAoKHZhcmF0dG5vID0gYm1zX25leHRfbWVtYmVyKHZhcmF0 dG5vcywgdmFyYXR0bm8pKSA+PSAwKQoJewoJCUF0dHJOdW1iZXIJYXR0bm8gPSB2YXJhdHRu byArIEZpcnN0TG93SW52YWxpZEhlYXBBdHRyaWJ1dGVOdW1iZXI7CgoJCWlmIChhdHRubyA9 PSBJbnZhbGlkQXR0ck51bWJlcikKCQl7CgkJCS8qIFdob2xlLXJvdyByZWZlcmVuY2UsIHNv IG11c3QgaGF2ZSBhY2Nlc3MgdG8gYWxsIGNvbHVtbnMgKi8KCQkJaWYgKHBnX2F0dHJpYnV0 ZV9hY2xjaGVja19hbGwocnRlLT5yZWxpZCwgdXNlcmlkLCBBQ0xfU0VMRUNULAoJCQkJCQkJ CQkJICBBQ0xNQVNLX0FMTCkgIT0gQUNMQ0hFQ0tfT0spCgkJCQlyZXR1cm4gZmFsc2U7CgkJ fQoJCWVsc2UKCQl7CgkJCWlmIChwZ19hdHRyaWJ1dGVfYWNsY2hlY2socnRlLT5yZWxpZCwg YXR0bm8sIHVzZXJpZCwKCQkJCQkJCQkJICBBQ0xfU0VMRUNUKSAhPSBBQ0xDSEVDS19PSykK CQkJCXJldHVybiBmYWxzZTsKCQl9Cgl9CgoJLyogSWYgd2UgcmVhY2ggaGVyZSwgaGF2ZSBh bGwgcmVxdWlyZWQgY29sdW1uIHByaXZpbGVnZXMgKi8KCXJldHVybiB0cnVlOwp9CgovKgog KiBleGFtaW5lX2luZGV4Y29sX3ZhcmlhYmxlCiAqCQlUcnkgdG8gbG9vayB1cCBzdGF0aXN0 aWNhbCBkYXRhIGFib3V0IGFuIGluZGV4IGNvbHVtbi9leHByZXNzaW9uLgogKgkJRmlsbCBp biBhIFZhcmlhYmxlU3RhdERhdGEgc3RydWN0IHRvIGRlc2NyaWJlIHRoZSBjb2x1bW4uCiAq CiAqIElucHV0czoKICoJcm9vdDogdGhlIHBsYW5uZXIgaW5mbwogKglpbmRleDogdGhlIGlu ZGV4IHdob3NlIGNvbHVtbiB3ZSdyZSBpbnRlcmVzdGVkIGluCiAqCWluZGV4Y29sOiAwLWJh c2VkIGluZGV4IGNvbHVtbiBudW1iZXIgKHN1YnNjcmlwdHMgaW5kZXgtPmluZGV4a2V5c1td KQogKgogKiBPdXRwdXRzOiAqdmFyZGF0YSBpcyBmaWxsZWQgYXMgZm9sbG93czoKICoJdmFy OiB0aGUgaW5wdXQgZXhwcmVzc2lvbiAod2l0aCBhbnkgYmluYXJ5IHJlbGFiZWxpbmcgc3Ry aXBwZWQsIGlmCiAqCQlpdCBpcyBvciBjb250YWlucyBhIHZhcmlhYmxlOyBidXQgb3RoZXJ3 aXNlIHRoZSB0eXBlIGlzIHByZXNlcnZlZCkKICoJcmVsOiBSZWxPcHRJbmZvIGZvciB0YWJs ZSByZWxhdGlvbiBjb250YWluaW5nIHZhcmlhYmxlLgogKglzdGF0c1R1cGxlOiB0aGUgcGdf c3RhdGlzdGljIGVudHJ5IGZvciB0aGUgdmFyaWFibGUsIGlmIG9uZSBleGlzdHM7CiAqCQlv dGhlcndpc2UgTlVMTC4KICoJZnJlZWZ1bmM6IHBvaW50ZXIgdG8gYSBmdW5jdGlvbiB0byBy ZWxlYXNlIHN0YXRzVHVwbGUgd2l0aC4KICoKICogQ2FsbGVyIGlzIHJlc3BvbnNpYmxlIGZv ciBkb2luZyBSZWxlYXNlVmFyaWFibGVTdGF0cygpIGJlZm9yZSBleGl0aW5nLgogKi8Kc3Rh dGljIHZvaWQKZXhhbWluZV9pbmRleGNvbF92YXJpYWJsZShQbGFubmVySW5mbyAqcm9vdCwg SW5kZXhPcHRJbmZvICppbmRleCwKCQkJCQkJICBpbnQgaW5kZXhjb2wsIFZhcmlhYmxlU3Rh dERhdGEgKnZhcmRhdGEpCnsKCUF0dHJOdW1iZXIJY29sbnVtOwoJT2lkCQkJcmVsaWQ7CgoJ aWYgKGluZGV4LT5pbmRleGtleXNbaW5kZXhjb2xdICE9IDApCgl7CgkJLyogU2ltcGxlIHZh cmlhYmxlIC0tLSBsb29rIHRvIHN0YXRzIGZvciB0aGUgdW5kZXJseWluZyB0YWJsZSAqLwoJ CVJhbmdlVGJsRW50cnkgKnJ0ZSA9IHBsYW5uZXJfcnRfZmV0Y2goaW5kZXgtPnJlbC0+cmVs aWQsIHJvb3QpOwoKCQlBc3NlcnQocnRlLT5ydGVraW5kID09IFJURV9SRUxBVElPTik7CgkJ cmVsaWQgPSBydGUtPnJlbGlkOwoJCUFzc2VydChyZWxpZCAhPSBJbnZhbGlkT2lkKTsKCQlj b2xudW0gPSBpbmRleC0+aW5kZXhrZXlzW2luZGV4Y29sXTsKCQl2YXJkYXRhLT5yZWwgPSBp bmRleC0+cmVsOwoKCQlpZiAoZ2V0X3JlbGF0aW9uX3N0YXRzX2hvb2sgJiYKCQkJKCpnZXRf cmVsYXRpb25fc3RhdHNfaG9vaykgKHJvb3QsIHJ0ZSwgY29sbnVtLCB2YXJkYXRhKSkKCQl7 CgkJCS8qCgkJCSAqIFRoZSBob29rIHRvb2sgY29udHJvbCBvZiBhY3F1aXJpbmcgYSBzdGF0 cyB0dXBsZS4gIElmIGl0IGRpZAoJCQkgKiBzdXBwbHkgYSB0dXBsZSwgaXQnZCBiZXR0ZXIg aGF2ZSBzdXBwbGllZCBhIGZyZWVmdW5jLgoJCQkgKi8KCQkJaWYgKEhlYXBUdXBsZUlzVmFs aWQodmFyZGF0YS0+c3RhdHNUdXBsZSkgJiYKCQkJCSF2YXJkYXRhLT5mcmVlZnVuYykKCQkJ CWVsb2coRVJST1IsICJubyBmdW5jdGlvbiBwcm92aWRlZCB0byByZWxlYXNlIHZhcmlhYmxl IHN0YXRzIHdpdGgiKTsKCQl9CgkJZWxzZQoJCXsKCQkJdmFyZGF0YS0+c3RhdHNUdXBsZSA9 IFNlYXJjaFN5c0NhY2hlMyhTVEFUUkVMQVRUSU5ILAoJCQkJCQkJCQkJCQkgIE9iamVjdElk R2V0RGF0dW0ocmVsaWQpLAoJCQkJCQkJCQkJCQkgIEludDE2R2V0RGF0dW0oY29sbnVtKSwK CQkJCQkJCQkJCQkJICBCb29sR2V0RGF0dW0ocnRlLT5pbmgpKTsKCQkJdmFyZGF0YS0+ZnJl ZWZ1bmMgPSBSZWxlYXNlU3lzQ2FjaGU7CgkJfQoJfQoJZWxzZQoJewoJCS8qIEV4cHJlc3Np b24gLS0tIG1heWJlIHRoZXJlIGFyZSBzdGF0cyBmb3IgdGhlIGluZGV4IGl0c2VsZiAqLwoJ CXJlbGlkID0gaW5kZXgtPmluZGV4b2lkOwoJCWNvbG51bSA9IGluZGV4Y29sICsgMTsKCgkJ aWYgKGdldF9pbmRleF9zdGF0c19ob29rICYmCgkJCSgqZ2V0X2luZGV4X3N0YXRzX2hvb2sp IChyb290LCByZWxpZCwgY29sbnVtLCB2YXJkYXRhKSkKCQl7CgkJCS8qCgkJCSAqIFRoZSBo b29rIHRvb2sgY29udHJvbCBvZiBhY3F1aXJpbmcgYSBzdGF0cyB0dXBsZS4gIElmIGl0IGRp ZAoJCQkgKiBzdXBwbHkgYSB0dXBsZSwgaXQnZCBiZXR0ZXIgaGF2ZSBzdXBwbGllZCBhIGZy ZWVmdW5jLgoJCQkgKi8KCQkJaWYgKEhlYXBUdXBsZUlzVmFsaWQodmFyZGF0YS0+c3RhdHNU dXBsZSkgJiYKCQkJCSF2YXJkYXRhLT5mcmVlZnVuYykKCQkJCWVsb2coRVJST1IsICJubyBm dW5jdGlvbiBwcm92aWRlZCB0byByZWxlYXNlIHZhcmlhYmxlIHN0YXRzIHdpdGgiKTsKCQl9 CgkJZWxzZQoJCXsKCQkJdmFyZGF0YS0+c3RhdHNUdXBsZSA9IFNlYXJjaFN5c0NhY2hlMyhT VEFUUkVMQVRUSU5ILAoJCQkJCQkJCQkJCQkgIE9iamVjdElkR2V0RGF0dW0ocmVsaWQpLAoJ CQkJCQkJCQkJCQkgIEludDE2R2V0RGF0dW0oY29sbnVtKSwKCQkJCQkJCQkJCQkJICBCb29s R2V0RGF0dW0oZmFsc2UpKTsKCQkJdmFyZGF0YS0+ZnJlZWZ1bmMgPSBSZWxlYXNlU3lzQ2Fj aGU7CgkJfQoJfQp9CgovKgogKiBDaGVjayB3aGV0aGVyIGl0IGlzIHBlcm1pdHRlZCB0byBj YWxsIGZ1bmNfb2lkIHBhc3Npbmcgc29tZSBvZiB0aGUKICogcGdfc3RhdGlzdGljIGRhdGEg aW4gdmFyZGF0YS4gIFdlIGFsbG93IHRoaXMgaWYgZWl0aGVyIG9mIHRoZSBmb2xsb3dpbmcK ICogY29uZGl0aW9ucyBpcyBtZXQ6ICgxKSB0aGUgdXNlciBoYXMgU0VMRUNUIHByaXZpbGVn ZXMgb24gdGhlIHRhYmxlIG9yCiAqIGNvbHVtbiB1bmRlcmx5aW5nIHRoZSBwZ19zdGF0aXN0 aWMgZGF0YSBhbmQgdGhlcmUgYXJlIG5vIHNlY3VyaXR5UXVhbHMgZnJvbQogKiBzZWN1cml0 eSBiYXJyaWVyIHZpZXdzIG9yIFJMUyBwb2xpY2llcywgb3IgKDIpIHRoZSBmdW5jdGlvbiBp cyBtYXJrZWQKICogbGVha3Byb29mLgogKi8KYm9vbApzdGF0aXN0aWNfcHJvY19zZWN1cml0 eV9jaGVjayhWYXJpYWJsZVN0YXREYXRhICp2YXJkYXRhLCBPaWQgZnVuY19vaWQpCnsKCWlm ICh2YXJkYXRhLT5hY2xfb2spCgkJcmV0dXJuIHRydWU7CQkJLyogaGF2ZSBTRUxFQ1QgcHJp dnMgYW5kIG5vIHNlY3VyaXR5UXVhbHMgKi8KCglpZiAoIU9pZElzVmFsaWQoZnVuY19vaWQp KQoJCXJldHVybiBmYWxzZTsKCglpZiAoZ2V0X2Z1bmNfbGVha3Byb29mKGZ1bmNfb2lkKSkK CQlyZXR1cm4gdHJ1ZTsKCgllcmVwb3J0KERFQlVHMiwKCQkJKGVycm1zZ19pbnRlcm5hbCgi bm90IHVzaW5nIHN0YXRpc3RpY3MgYmVjYXVzZSBmdW5jdGlvbiBcIiVzXCIgaXMgbm90IGxl YWtwcm9vZiIsCgkJCQkJCQkgZ2V0X2Z1bmNfbmFtZShmdW5jX29pZCkpKSk7CglyZXR1cm4g ZmFsc2U7Cn0KCi8qCiAqIGdldF92YXJpYWJsZV9udW1kaXN0aW5jdAogKgkgIEVzdGltYXRl IHRoZSBudW1iZXIgb2YgZGlzdGluY3QgdmFsdWVzIG9mIGEgdmFyaWFibGUuCiAqCiAqIHZh cmRhdGE6IHJlc3VsdHMgb2YgZXhhbWluZV92YXJpYWJsZQogKiAqaXNkZWZhdWx0OiBzZXQg dG8gdHJ1ZSBpZiB0aGUgcmVzdWx0IGlzIGEgZGVmYXVsdCByYXRoZXIgdGhhbiBiYXNlZCBv bgogKiBhbnl0aGluZyBtZWFuaW5nZnVsLgogKgogKiBOQjogYmUgY2FyZWZ1bCB0byBwcm9k dWNlIGEgcG9zaXRpdmUgaW50ZWdyYWwgcmVzdWx0LCBzaW5jZSBjYWxsZXJzIG1heQogKiBj b21wYXJlIHRoZSByZXN1bHQgdG8gZXhhY3QgaW50ZWdlciBjb3VudHMsIG9yIG1pZ2h0IGRp dmlkZSBieSBpdC4KICovCmRvdWJsZQpnZXRfdmFyaWFibGVfbnVtZGlzdGluY3QoVmFyaWFi bGVTdGF0RGF0YSAqdmFyZGF0YSwgYm9vbCAqaXNkZWZhdWx0KQp7Cglkb3VibGUJCXN0YWRp c3RpbmN0OwoJZG91YmxlCQlzdGFudWxsZnJhYyA9IDAuMDsKCWRvdWJsZQkJbnR1cGxlczsK CgkqaXNkZWZhdWx0ID0gZmFsc2U7CgoJLyoKCSAqIERldGVybWluZSB0aGUgc3RhZGlzdGlu Y3QgdmFsdWUgdG8gdXNlLiAgVGhlcmUgYXJlIGNhc2VzIHdoZXJlIHdlIGNhbgoJICogZ2V0 IGFuIGVzdGltYXRlIGV2ZW4gd2l0aG91dCBhIHBnX3N0YXRpc3RpYyBlbnRyeSwgb3IgY2Fu IGdldCBhIGJldHRlcgoJICogdmFsdWUgdGhhbiBpcyBpbiBwZ19zdGF0aXN0aWMuICBHcmFi IHN0YW51bGxmcmFjIHRvbyBpZiB3ZSBjYW4gZmluZCBpdAoJICogKG90aGVyd2lzZSwgYXNz dW1lIG5vIG51bGxzLCBmb3IgbGFjayBvZiBhbnkgYmV0dGVyIGlkZWEpLgoJICovCglpZiAo SGVhcFR1cGxlSXNWYWxpZCh2YXJkYXRhLT5zdGF0c1R1cGxlKSkKCXsKCQkvKiBVc2UgdGhl IHBnX3N0YXRpc3RpYyBlbnRyeSAqLwoJCUZvcm1fcGdfc3RhdGlzdGljIHN0YXRzOwoKCQlz dGF0cyA9IChGb3JtX3BnX3N0YXRpc3RpYykgR0VUU1RSVUNUKHZhcmRhdGEtPnN0YXRzVHVw bGUpOwoJCXN0YWRpc3RpbmN0ID0gc3RhdHMtPnN0YWRpc3RpbmN0OwoJCXN0YW51bGxmcmFj ID0gc3RhdHMtPnN0YW51bGxmcmFjOwoJfQoJZWxzZSBpZiAodmFyZGF0YS0+dmFydHlwZSA9 PSBCT09MT0lEKQoJewoJCS8qCgkJICogU3BlY2lhbC1jYXNlIGJvb2xlYW4gY29sdW1uczog cHJlc3VtYWJseSwgdHdvIGRpc3RpbmN0IHZhbHVlcy4KCQkgKgoJCSAqIEFyZSB0aGVyZSBh bnkgb3RoZXIgZGF0YXR5cGVzIHdlIHNob3VsZCB3aXJlIGluIHNwZWNpYWwgZXN0aW1hdGVz CgkJICogZm9yPwoJCSAqLwoJCXN0YWRpc3RpbmN0ID0gMi4wOwoJfQoJZWxzZSBpZiAodmFy ZGF0YS0+cmVsICYmIHZhcmRhdGEtPnJlbC0+cnRla2luZCA9PSBSVEVfVkFMVUVTKQoJewoJ CS8qCgkJICogSWYgdGhlIFZhciByZXByZXNlbnRzIGEgY29sdW1uIG9mIGEgVkFMVUVTIFJU RSwgYXNzdW1lIGl0J3MgdW5pcXVlLgoJCSAqIFRoaXMgY291bGQgb2YgY291cnNlIGJlIHZl cnkgd3JvbmcsIGJ1dCBpdCBzaG91bGQgdGVuZCB0byBiZSB0cnVlCgkJICogaW4gd2VsbC13 cml0dGVuIHF1ZXJpZXMuICBXZSBjb3VsZCBjb25zaWRlciBleGFtaW5pbmcgdGhlIFZBTFVF UycKCQkgKiBjb250ZW50cyB0byBnZXQgc29tZSByZWFsIHN0YXRpc3RpY3M7IGJ1dCB0aGF0 IG9ubHkgd29ya3MgaWYgdGhlCgkJICogZW50cmllcyBhcmUgYWxsIGNvbnN0YW50cywgYW5k IGl0IHdvdWxkIGJlIHByZXR0eSBleHBlbnNpdmUgYW55d2F5LgoJCSAqLwoJCXN0YWRpc3Rp bmN0ID0gLTEuMDsJCS8qIHVuaXF1ZSAoYW5kIGFsbCBub24gbnVsbCkgKi8KCX0KCWVsc2UK CXsKCQkvKgoJCSAqIFdlIGRvbid0IGtlZXAgc3RhdGlzdGljcyBmb3Igc3lzdGVtIGNvbHVt bnMsIGJ1dCBpbiBzb21lIGNhc2VzIHdlCgkJICogY2FuIGluZmVyIGRpc3RpbmN0bmVzcyBh bnl3YXkuCgkJICovCgkJaWYgKHZhcmRhdGEtPnZhciAmJiBJc0EodmFyZGF0YS0+dmFyLCBW YXIpKQoJCXsKCQkJc3dpdGNoICgoKFZhciAqKSB2YXJkYXRhLT52YXIpLT52YXJhdHRubykK CQkJewoJCQkJY2FzZSBTZWxmSXRlbVBvaW50ZXJBdHRyaWJ1dGVOdW1iZXI6CgkJCQkJc3Rh ZGlzdGluY3QgPSAtMS4wOyAvKiB1bmlxdWUgKGFuZCBhbGwgbm9uIG51bGwpICovCgkJCQkJ YnJlYWs7CgkJCQljYXNlIFRhYmxlT2lkQXR0cmlidXRlTnVtYmVyOgoJCQkJCXN0YWRpc3Rp bmN0ID0gMS4wOwkvKiBvbmx5IDEgdmFsdWUgKi8KCQkJCQlicmVhazsKCQkJCWRlZmF1bHQ6 CgkJCQkJc3RhZGlzdGluY3QgPSAwLjA7CS8qIG1lYW5zICJ1bmtub3duIiAqLwoJCQkJCWJy ZWFrOwoJCQl9CgkJfQoJCWVsc2UKCQkJc3RhZGlzdGluY3QgPSAwLjA7CS8qIG1lYW5zICJ1 bmtub3duIiAqLwoKCQkvKgoJCSAqIFhYWCBjb25zaWRlciB1c2luZyBlc3RpbWF0ZV9udW1f Z3JvdXBzIG9uIGV4cHJlc3Npb25zPwoJCSAqLwoJfQoKCS8qCgkgKiBJZiB0aGVyZSBpcyBh IHVuaXF1ZSBpbmRleCwgRElTVElOQ1Qgb3IgR1JPVVAtQlkgY2xhdXNlIGZvciB0aGUKCSAq IHZhcmlhYmxlLCBhc3N1bWUgaXQgaXMgdW5pcXVlIG5vIG1hdHRlciB3aGF0IHBnX3N0YXRp c3RpYyBzYXlzOyB0aGUKCSAqIHN0YXRpc3RpY3MgY291bGQgYmUgb3V0IG9mIGRhdGUsIG9y IHdlIG1pZ2h0IGhhdmUgZm91bmQgYSBwYXJ0aWFsCgkgKiB1bmlxdWUgaW5kZXggdGhhdCBw cm92ZXMgdGhlIHZhciBpcyB1bmlxdWUgZm9yIHRoaXMgcXVlcnkuICBIb3dldmVyLAoJICog d2UnZCBiZXR0ZXIgc3RpbGwgYmVsaWV2ZSB0aGUgbnVsbC1mcmFjdGlvbiBzdGF0aXN0aWMu CgkgKi8KCWlmICh2YXJkYXRhLT5pc3VuaXF1ZSkKCQlzdGFkaXN0aW5jdCA9IC0xLjAgKiAo MS4wIC0gc3RhbnVsbGZyYWMpOwoKCS8qCgkgKiBJZiB3ZSBoYWQgYW4gYWJzb2x1dGUgZXN0 aW1hdGUsIHVzZSB0aGF0LgoJICovCglpZiAoc3RhZGlzdGluY3QgPiAwLjApCgkJcmV0dXJu IGNsYW1wX3Jvd19lc3Qoc3RhZGlzdGluY3QpOwoKCS8qCgkgKiBPdGhlcndpc2Ugd2UgbmVl ZCB0byBnZXQgdGhlIHJlbGF0aW9uIHNpemU7IHB1bnQgaWYgbm90IGF2YWlsYWJsZS4KCSAq LwoJaWYgKHZhcmRhdGEtPnJlbCA9PSBOVUxMKQoJewoJCSppc2RlZmF1bHQgPSB0cnVlOwoJ CXJldHVybiBERUZBVUxUX05VTV9ESVNUSU5DVDsKCX0KCW50dXBsZXMgPSB2YXJkYXRhLT5y ZWwtPnR1cGxlczsKCWlmIChudHVwbGVzIDw9IDAuMCkKCXsKCQkqaXNkZWZhdWx0ID0gdHJ1 ZTsKCQlyZXR1cm4gREVGQVVMVF9OVU1fRElTVElOQ1Q7Cgl9CgoJLyoKCSAqIElmIHdlIGhh ZCBhIHJlbGF0aXZlIGVzdGltYXRlLCB1c2UgdGhhdC4KCSAqLwoJaWYgKHN0YWRpc3RpbmN0 IDwgMC4wKQoJCXJldHVybiBjbGFtcF9yb3dfZXN0KC1zdGFkaXN0aW5jdCAqIG50dXBsZXMp OwoKCS8qCgkgKiBXaXRoIG5vIGRhdGEsIGVzdGltYXRlIG5kaXN0aW5jdCA9IG50dXBsZXMg aWYgdGhlIHRhYmxlIGlzIHNtYWxsLCBlbHNlCgkgKiB1c2UgZGVmYXVsdC4gIFdlIHVzZSBE RUZBVUxUX05VTV9ESVNUSU5DVCBhcyB0aGUgY3V0b2ZmIGZvciAic21hbGwiIHNvCgkgKiB0 aGF0IHRoZSBiZWhhdmlvciBpc24ndCBkaXNjb250aW51b3VzLgoJICovCglpZiAobnR1cGxl cyA8IERFRkFVTFRfTlVNX0RJU1RJTkNUKQoJCXJldHVybiBjbGFtcF9yb3dfZXN0KG50dXBs ZXMpOwoKCSppc2RlZmF1bHQgPSB0cnVlOwoJcmV0dXJuIERFRkFVTFRfTlVNX0RJU1RJTkNU Owp9CgovKgogKiBnZXRfdmFyaWFibGVfcmFuZ2UKICoJCUVzdGltYXRlIHRoZSBtaW5pbXVt IGFuZCBtYXhpbXVtIHZhbHVlIG9mIHRoZSBzcGVjaWZpZWQgdmFyaWFibGUuCiAqCQlJZiBz dWNjZXNzZnVsLCBzdG9yZSB2YWx1ZXMgaW4gKm1pbiBhbmQgKm1heCwgYW5kIHJldHVybiB0 cnVlLgogKgkJSWYgbm8gZGF0YSBhdmFpbGFibGUsIHJldHVybiBmYWxzZS4KICoKICogc29y dG9wIGlzIHRoZSAiPCIgY29tcGFyaXNvbiBvcGVyYXRvciB0byB1c2UuICBUaGlzIHNob3Vs ZCBnZW5lcmFsbHkKICogYmUgIjwiIG5vdCAiPiIsIGFzIG9ubHkgdGhlIGZvcm1lciBpcyBs aWtlbHkgdG8gYmUgZm91bmQgaW4gcGdfc3RhdGlzdGljLgogKiBUaGUgY29sbGF0aW9uIG11 c3QgYmUgc3BlY2lmaWVkIHRvby4KICovCnN0YXRpYyBib29sCmdldF92YXJpYWJsZV9yYW5n ZShQbGFubmVySW5mbyAqcm9vdCwgVmFyaWFibGVTdGF0RGF0YSAqdmFyZGF0YSwKCQkJCSAg IE9pZCBzb3J0b3AsIE9pZCBjb2xsYXRpb24sCgkJCQkgICBEYXR1bSAqbWluLCBEYXR1bSAq bWF4KQp7CglEYXR1bQkJdG1pbiA9IDA7CglEYXR1bQkJdG1heCA9IDA7Cglib29sCQloYXZl X2RhdGEgPSBmYWxzZTsKCWludDE2CQl0eXBMZW47Cglib29sCQl0eXBCeVZhbDsKCU9pZAkJ CW9wZnVuY29pZDsKCUZtZ3JJbmZvCW9wcHJvYzsKCUF0dFN0YXRzU2xvdCBzc2xvdDsKCgkv KgoJICogWFhYIEl0J3MgdmVyeSB0ZW1wdGluZyB0byB0cnkgdG8gdXNlIHRoZSBhY3R1YWwg Y29sdW1uIG1pbiBhbmQgbWF4LCBpZgoJICogd2UgY2FuIGdldCB0aGVtIHJlbGF0aXZlbHkt Y2hlYXBseSB3aXRoIGFuIGluZGV4IHByb2JlLiAgSG93ZXZlciwgc2luY2UKCSAqIHRoaXMg ZnVuY3Rpb24gaXMgY2FsbGVkIG1hbnkgdGltZXMgZHVyaW5nIGpvaW4gcGxhbm5pbmcsIHRo YXQgY291bGQKCSAqIGhhdmUgdW5wbGVhc2FudCBlZmZlY3RzIG9uIHBsYW5uaW5nIHNwZWVk LiAgTmVlZCBtb3JlIGludmVzdGlnYXRpb24KCSAqIGJlZm9yZSBlbmFibGluZyB0aGlzLgoJ ICovCiNpZmRlZiBOT1RfVVNFRAoJaWYgKGdldF9hY3R1YWxfdmFyaWFibGVfcmFuZ2Uocm9v dCwgdmFyZGF0YSwgc29ydG9wLCBjb2xsYXRpb24sIG1pbiwgbWF4KSkKCQlyZXR1cm4gdHJ1 ZTsKI2VuZGlmCgoJaWYgKCFIZWFwVHVwbGVJc1ZhbGlkKHZhcmRhdGEtPnN0YXRzVHVwbGUp KQoJewoJCS8qIG5vIHN0YXRzIGF2YWlsYWJsZSwgc28gZGVmYXVsdCByZXN1bHQgKi8KCQly ZXR1cm4gZmFsc2U7Cgl9CgoJLyoKCSAqIElmIHdlIGNhbid0IGFwcGx5IHRoZSBzb3J0b3Ag dG8gdGhlIHN0YXRzIGRhdGEsIGp1c3QgZmFpbC4gIEluCgkgKiBwcmluY2lwbGUsIGlmIHRo ZXJlJ3MgYSBoaXN0b2dyYW0gYW5kIG5vIE1DVnMsIHdlIGNvdWxkIHJldHVybiB0aGUKCSAq IGhpc3RvZ3JhbSBlbmRwb2ludHMgd2l0aG91dCBldmVyIGFwcGx5aW5nIHRoZSBzb3J0b3Ag Li4uIGJ1dCBpdCdzCgkgKiBwcm9iYWJseSBub3Qgd29ydGggdHJ5aW5nLCBiZWNhdXNlIHdo YXRldmVyIHRoZSBjYWxsZXIgd2FudHMgdG8gZG8gd2l0aAoJICogdGhlIGVuZHBvaW50cyB3 b3VsZCBsaWtlbHkgZmFpbCB0aGUgc2VjdXJpdHkgY2hlY2sgdG9vLgoJICovCglpZiAoIXN0 YXRpc3RpY19wcm9jX3NlY3VyaXR5X2NoZWNrKHZhcmRhdGEsCgkJCQkJCQkJCSAgIChvcGZ1 bmNvaWQgPSBnZXRfb3Bjb2RlKHNvcnRvcCkpKSkKCQlyZXR1cm4gZmFsc2U7CgoJb3Bwcm9j LmZuX29pZCA9IEludmFsaWRPaWQ7IC8qIG1hcmsgdGhpcyBhcyBub3QgbG9va2VkIHVwIHll dCAqLwoKCWdldF90eXBsZW5ieXZhbCh2YXJkYXRhLT5hdHR0eXBlLCAmdHlwTGVuLCAmdHlw QnlWYWwpOwoKCS8qCgkgKiBJZiB0aGVyZSBpcyBhIGhpc3RvZ3JhbSB3aXRoIHRoZSBvcmRl cmluZyB3ZSB3YW50LCBncmFiIHRoZSBmaXJzdCBhbmQKCSAqIGxhc3QgdmFsdWVzLgoJICov CglpZiAoZ2V0X2F0dHN0YXRzc2xvdCgmc3Nsb3QsIHZhcmRhdGEtPnN0YXRzVHVwbGUsCgkJ CQkJCSBTVEFUSVNUSUNfS0lORF9ISVNUT0dSQU0sIHNvcnRvcCwKCQkJCQkJIEFUVFNUQVRT U0xPVF9WQUxVRVMpKQoJewoJCWlmIChzc2xvdC5zdGFjb2xsID09IGNvbGxhdGlvbiAmJiBz c2xvdC5udmFsdWVzID4gMCkKCQl7CgkJCXRtaW4gPSBkYXR1bUNvcHkoc3Nsb3QudmFsdWVz WzBdLCB0eXBCeVZhbCwgdHlwTGVuKTsKCQkJdG1heCA9IGRhdHVtQ29weShzc2xvdC52YWx1 ZXNbc3Nsb3QubnZhbHVlcyAtIDFdLCB0eXBCeVZhbCwgdHlwTGVuKTsKCQkJaGF2ZV9kYXRh ID0gdHJ1ZTsKCQl9CgkJZnJlZV9hdHRzdGF0c3Nsb3QoJnNzbG90KTsKCX0KCgkvKgoJICog T3RoZXJ3aXNlLCBpZiB0aGVyZSBpcyBhIGhpc3RvZ3JhbSB3aXRoIHNvbWUgb3RoZXIgb3Jk ZXJpbmcsIHNjYW4gaXQKCSAqIGFuZCBnZXQgdGhlIG1pbiBhbmQgbWF4IHZhbHVlcyBhY2Nv cmRpbmcgdG8gdGhlIG9yZGVyaW5nIHdlIHdhbnQuICBUaGlzCgkgKiBvZiBjb3Vyc2UgbWF5 IG5vdCBmaW5kIHZhbHVlcyB0aGF0IGFyZSByZWFsbHkgZXh0cmVtYWwgYWNjb3JkaW5nIHRv IG91cgoJICogb3JkZXJpbmcsIGJ1dCBpdCBiZWF0cyBpZ25vcmluZyBhdmFpbGFibGUgZGF0 YS4KCSAqLwoJaWYgKCFoYXZlX2RhdGEgJiYKCQlnZXRfYXR0c3RhdHNzbG90KCZzc2xvdCwg dmFyZGF0YS0+c3RhdHNUdXBsZSwKCQkJCQkJIFNUQVRJU1RJQ19LSU5EX0hJU1RPR1JBTSwg SW52YWxpZE9pZCwKCQkJCQkJIEFUVFNUQVRTU0xPVF9WQUxVRVMpKQoJewoJCWdldF9zdGF0 c19zbG90X3JhbmdlKCZzc2xvdCwgb3BmdW5jb2lkLCAmb3Bwcm9jLAoJCQkJCQkJIGNvbGxh dGlvbiwgdHlwTGVuLCB0eXBCeVZhbCwKCQkJCQkJCSAmdG1pbiwgJnRtYXgsICZoYXZlX2Rh dGEpOwoJCWZyZWVfYXR0c3RhdHNzbG90KCZzc2xvdCk7Cgl9CgoJLyoKCSAqIElmIHdlIGhh dmUgbW9zdC1jb21tb24tdmFsdWVzIGluZm8sIGxvb2sgZm9yIGV4dHJlbWUgTUNWcy4gIFRo aXMgaXMKCSAqIG5lZWRlZCBldmVuIGlmIHdlIGFsc28gaGF2ZSBhIGhpc3RvZ3JhbSwgc2lu Y2UgdGhlIGhpc3RvZ3JhbSBleGNsdWRlcwoJICogdGhlIE1DVnMuICBIb3dldmVyLCBpZiB3 ZSAqb25seSogaGF2ZSBNQ1ZzIGFuZCBubyBoaXN0b2dyYW0sIHdlIHNob3VsZAoJICogYmUg cHJldHR5IHdhcnkgb2YgZGVjaWRpbmcgdGhhdCB0aGF0IGlzIGEgZnVsbCByZXByZXNlbnRh dGlvbiBvZiB0aGUKCSAqIGRhdGEuICBQcm9jZWVkIG9ubHkgaWYgdGhlIE1DVnMgcmVwcmVz ZW50IHRoZSB3aG9sZSB0YWJsZSAodG8gd2l0aGluCgkgKiByb3VuZG9mZiBlcnJvcikuCgkg Ki8KCWlmIChnZXRfYXR0c3RhdHNzbG90KCZzc2xvdCwgdmFyZGF0YS0+c3RhdHNUdXBsZSwK CQkJCQkJIFNUQVRJU1RJQ19LSU5EX01DViwgSW52YWxpZE9pZCwKCQkJCQkJIGhhdmVfZGF0 YSA/IEFUVFNUQVRTU0xPVF9WQUxVRVMgOgoJCQkJCQkgKEFUVFNUQVRTU0xPVF9WQUxVRVMg fCBBVFRTVEFUU1NMT1RfTlVNQkVSUykpKQoJewoJCWJvb2wJCXVzZV9tY3ZzID0gaGF2ZV9k YXRhOwoKCQlpZiAoIWhhdmVfZGF0YSkKCQl7CgkJCWRvdWJsZQkJc3VtY29tbW9uID0gMC4w OwoJCQlkb3VibGUJCW51bGxmcmFjOwoJCQlpbnQJCQlpOwoKCQkJZm9yIChpID0gMDsgaSA8 IHNzbG90Lm5udW1iZXJzOyBpKyspCgkJCQlzdW1jb21tb24gKz0gc3Nsb3QubnVtYmVyc1tp XTsKCQkJbnVsbGZyYWMgPSAoKEZvcm1fcGdfc3RhdGlzdGljKSBHRVRTVFJVQ1QodmFyZGF0 YS0+c3RhdHNUdXBsZSkpLT5zdGFudWxsZnJhYzsKCQkJaWYgKHN1bWNvbW1vbiArIG51bGxm cmFjID4gMC45OTk5OSkKCQkJCXVzZV9tY3ZzID0gdHJ1ZTsKCQl9CgoJCWlmICh1c2VfbWN2 cykKCQkJZ2V0X3N0YXRzX3Nsb3RfcmFuZ2UoJnNzbG90LCBvcGZ1bmNvaWQsICZvcHByb2Ms CgkJCQkJCQkJIGNvbGxhdGlvbiwgdHlwTGVuLCB0eXBCeVZhbCwKCQkJCQkJCQkgJnRtaW4s ICZ0bWF4LCAmaGF2ZV9kYXRhKTsKCQlmcmVlX2F0dHN0YXRzc2xvdCgmc3Nsb3QpOwoJfQoK CSptaW4gPSB0bWluOwoJKm1heCA9IHRtYXg7CglyZXR1cm4gaGF2ZV9kYXRhOwp9CgovKgog KiBnZXRfc3RhdHNfc2xvdF9yYW5nZTogc2NhbiBzc2xvdCBmb3IgbWluL21heCB2YWx1ZXMK ICoKICogU3Vicm91dGluZSBmb3IgZ2V0X3ZhcmlhYmxlX3JhbmdlOiB1cGRhdGUgbWluL21h eC9oYXZlX2RhdGEgYWNjb3JkaW5nCiAqIHRvIHdoYXQgd2UgZmluZCBpbiB0aGUgc3RhdGlz dGljcyBhcnJheS4KICovCnN0YXRpYyB2b2lkCmdldF9zdGF0c19zbG90X3JhbmdlKEF0dFN0 YXRzU2xvdCAqc3Nsb3QsIE9pZCBvcGZ1bmNvaWQsIEZtZ3JJbmZvICpvcHByb2MsCgkJCQkJ IE9pZCBjb2xsYXRpb24sIGludDE2IHR5cExlbiwgYm9vbCB0eXBCeVZhbCwKCQkJCQkgRGF0 dW0gKm1pbiwgRGF0dW0gKm1heCwgYm9vbCAqcF9oYXZlX2RhdGEpCnsKCURhdHVtCQl0bWlu ID0gKm1pbjsKCURhdHVtCQl0bWF4ID0gKm1heDsKCWJvb2wJCWhhdmVfZGF0YSA9ICpwX2hh dmVfZGF0YTsKCWJvb2wJCWZvdW5kX3RtaW4gPSBmYWxzZTsKCWJvb2wJCWZvdW5kX3RtYXgg PSBmYWxzZTsKCgkvKiBMb29rIHVwIHRoZSBjb21wYXJpc29uIGZ1bmN0aW9uLCBpZiB3ZSBk aWRuJ3QgYWxyZWFkeSBkbyBzbyAqLwoJaWYgKG9wcHJvYy0+Zm5fb2lkICE9IG9wZnVuY29p ZCkKCQlmbWdyX2luZm8ob3BmdW5jb2lkLCBvcHByb2MpOwoKCS8qIFNjYW4gYWxsIHRoZSBz bG90J3MgdmFsdWVzICovCglmb3IgKGludCBpID0gMDsgaSA8IHNzbG90LT5udmFsdWVzOyBp KyspCgl7CgkJaWYgKCFoYXZlX2RhdGEpCgkJewoJCQl0bWluID0gdG1heCA9IHNzbG90LT52 YWx1ZXNbaV07CgkJCWZvdW5kX3RtaW4gPSBmb3VuZF90bWF4ID0gdHJ1ZTsKCQkJKnBfaGF2 ZV9kYXRhID0gaGF2ZV9kYXRhID0gdHJ1ZTsKCQkJY29udGludWU7CgkJfQoJCWlmIChEYXR1 bUdldEJvb2woRnVuY3Rpb25DYWxsMkNvbGwob3Bwcm9jLAoJCQkJCQkJCQkJICAgY29sbGF0 aW9uLAoJCQkJCQkJCQkJICAgc3Nsb3QtPnZhbHVlc1tpXSwgdG1pbikpKQoJCXsKCQkJdG1p biA9IHNzbG90LT52YWx1ZXNbaV07CgkJCWZvdW5kX3RtaW4gPSB0cnVlOwoJCX0KCQlpZiAo RGF0dW1HZXRCb29sKEZ1bmN0aW9uQ2FsbDJDb2xsKG9wcHJvYywKCQkJCQkJCQkJCSAgIGNv bGxhdGlvbiwKCQkJCQkJCQkJCSAgIHRtYXgsIHNzbG90LT52YWx1ZXNbaV0pKSkKCQl7CgkJ CXRtYXggPSBzc2xvdC0+dmFsdWVzW2ldOwoJCQlmb3VuZF90bWF4ID0gdHJ1ZTsKCQl9Cgl9 CgoJLyoKCSAqIENvcHkgdGhlIHNsb3QncyB2YWx1ZXMsIGlmIHdlIGZvdW5kIG5ldyBleHRy ZW1lIHZhbHVlcy4KCSAqLwoJaWYgKGZvdW5kX3RtaW4pCgkJKm1pbiA9IGRhdHVtQ29weSh0 bWluLCB0eXBCeVZhbCwgdHlwTGVuKTsKCWlmIChmb3VuZF90bWF4KQoJCSptYXggPSBkYXR1 bUNvcHkodG1heCwgdHlwQnlWYWwsIHR5cExlbik7Cn0KCgovKgogKiBnZXRfYWN0dWFsX3Zh cmlhYmxlX3JhbmdlCiAqCQlBdHRlbXB0IHRvIGlkZW50aWZ5IHRoZSBjdXJyZW50ICphY3R1 YWwqIG1pbmltdW0gYW5kL29yIG1heGltdW0KICoJCW9mIHRoZSBzcGVjaWZpZWQgdmFyaWFi bGUsIGJ5IGxvb2tpbmcgZm9yIGEgc3VpdGFibGUgYnRyZWUgaW5kZXgKICoJCWFuZCBmZXRj aGluZyBpdHMgbG93IGFuZC9vciBoaWdoIHZhbHVlcy4KICoJCUlmIHN1Y2Nlc3NmdWwsIHN0 b3JlIHZhbHVlcyBpbiAqbWluIGFuZCAqbWF4LCBhbmQgcmV0dXJuIHRydWUuCiAqCQkoRWl0 aGVyIHBvaW50ZXIgY2FuIGJlIE5VTEwgaWYgdGhhdCBlbmRwb2ludCBpc24ndCBuZWVkZWQu KQogKgkJSWYgdW5zdWNjZXNzZnVsLCByZXR1cm4gZmFsc2UuCiAqCiAqIHNvcnRvcCBpcyB0 aGUgIjwiIGNvbXBhcmlzb24gb3BlcmF0b3IgdG8gdXNlLgogKiBjb2xsYXRpb24gaXMgdGhl IHJlcXVpcmVkIGNvbGxhdGlvbi4KICovCnN0YXRpYyBib29sCmdldF9hY3R1YWxfdmFyaWFi bGVfcmFuZ2UoUGxhbm5lckluZm8gKnJvb3QsIFZhcmlhYmxlU3RhdERhdGEgKnZhcmRhdGEs CgkJCQkJCSAgT2lkIHNvcnRvcCwgT2lkIGNvbGxhdGlvbiwKCQkJCQkJICBEYXR1bSAqbWlu LCBEYXR1bSAqbWF4KQp7Cglib29sCQloYXZlX2RhdGEgPSBmYWxzZTsKCVJlbE9wdEluZm8g KnJlbCA9IHZhcmRhdGEtPnJlbDsKCVJhbmdlVGJsRW50cnkgKnJ0ZTsKCUxpc3RDZWxsICAg KmxjOwoKCS8qIE5vIGhvcGUgaWYgbm8gcmVsYXRpb24gb3IgaXQgZG9lc24ndCBoYXZlIGlu ZGV4ZXMgKi8KCWlmIChyZWwgPT0gTlVMTCB8fCByZWwtPmluZGV4bGlzdCA9PSBOSUwpCgkJ cmV0dXJuIGZhbHNlOwoJLyogSWYgaXQgaGFzIGluZGV4ZXMgaXQgbXVzdCBiZSBhIHBsYWlu IHJlbGF0aW9uICovCglydGUgPSByb290LT5zaW1wbGVfcnRlX2FycmF5W3JlbC0+cmVsaWRd OwoJQXNzZXJ0KHJ0ZS0+cnRla2luZCA9PSBSVEVfUkVMQVRJT04pOwoKCS8qIGlnbm9yZSBw YXJ0aXRpb25lZCB0YWJsZXMuICBBbnkgaW5kZXhlcyBoZXJlIGFyZSBub3QgcmVhbCBpbmRl eGVzICovCglpZiAocnRlLT5yZWxraW5kID09IFJFTEtJTkRfUEFSVElUSU9ORURfVEFCTEUp CgkJcmV0dXJuIGZhbHNlOwoKCS8qIFNlYXJjaCB0aHJvdWdoIHRoZSBpbmRleGVzIHRvIHNl ZSBpZiBhbnkgbWF0Y2ggb3VyIHByb2JsZW0gKi8KCWZvcmVhY2gobGMsIHJlbC0+aW5kZXhs aXN0KQoJewoJCUluZGV4T3B0SW5mbyAqaW5kZXggPSAoSW5kZXhPcHRJbmZvICopIGxmaXJz dChsYyk7CgkJU2NhbkRpcmVjdGlvbiBpbmRleHNjYW5kaXI7CgkJU3RyYXRlZ3lOdW1iZXIg c3RyYXRlZ3k7CgoJCS8qIElnbm9yZSBub24tb3JkZXJpbmcgaW5kZXhlcyAqLwoJCWlmIChp bmRleC0+c29ydG9wZmFtaWx5ID09IE5VTEwpCgkJCWNvbnRpbnVlOwoKCQkvKgoJCSAqIEln bm9yZSBwYXJ0aWFsIGluZGV4ZXMgLS0tIHdlIG9ubHkgd2FudCBzdGF0cyB0aGF0IGNvdmVy IHRoZSBlbnRpcmUKCQkgKiByZWxhdGlvbi4KCQkgKi8KCQlpZiAoaW5kZXgtPmluZHByZWQg IT0gTklMKQoJCQljb250aW51ZTsKCgkJLyoKCQkgKiBUaGUgaW5kZXggbGlzdCBtaWdodCBp bmNsdWRlIGh5cG90aGV0aWNhbCBpbmRleGVzIGluc2VydGVkIGJ5IGEKCQkgKiBnZXRfcmVs YXRpb25faW5mbyBob29rIC0tLSBkb24ndCB0cnkgdG8gYWNjZXNzIHRoZW0uCgkJICovCgkJ aWYgKGluZGV4LT5oeXBvdGhldGljYWwpCgkJCWNvbnRpbnVlOwoKCQkvKgoJCSAqIGdldF9h Y3R1YWxfdmFyaWFibGVfZW5kcG9pbnQgdXNlcyB0aGUgaW5kZXgtb25seS1zY2FuIG1hY2hp bmVyeSwgc28KCQkgKiBpZ25vcmUgaW5kZXhlcyB0aGF0IGNhbid0IHVzZSBpdCBvbiB0aGVp ciBmaXJzdCBjb2x1bW4uCgkJICovCgkJaWYgKCFpbmRleC0+Y2FucmV0dXJuWzBdKQoJCQlj b250aW51ZTsKCgkJLyoKCQkgKiBUaGUgZmlyc3QgaW5kZXggY29sdW1uIG11c3QgbWF0Y2gg dGhlIGRlc2lyZWQgdmFyaWFibGUsIHNvcnRvcCwgYW5kCgkJICogY29sbGF0aW9uIC0tLSBi dXQgd2UgY2FuIHVzZSBhIGRlc2NlbmRpbmctb3JkZXIgaW5kZXguCgkJICovCgkJaWYgKGNv bGxhdGlvbiAhPSBpbmRleC0+aW5kZXhjb2xsYXRpb25zWzBdKQoJCQljb250aW51ZTsJCQkv KiB0ZXN0IGZpcnN0ICdjYXVzZSBpdCdzIGNoZWFwZXN0ICovCgkJaWYgKCFtYXRjaF9pbmRl eF90b19vcGVyYW5kKHZhcmRhdGEtPnZhciwgMCwgaW5kZXgpKQoJCQljb250aW51ZTsKCQlz dHJhdGVneSA9IGdldF9vcF9vcGZhbWlseV9zdHJhdGVneShzb3J0b3AsIGluZGV4LT5zb3J0 b3BmYW1pbHlbMF0pOwoJCXN3aXRjaCAoSW5kZXhBbVRyYW5zbGF0ZVN0cmF0ZWd5KHN0cmF0 ZWd5LCBpbmRleC0+cmVsYW0sIGluZGV4LT5zb3J0b3BmYW1pbHlbMF0sIHRydWUpKQoJCXsK CQkJY2FzZSBDT01QQVJFX0xUOgoJCQkJaWYgKGluZGV4LT5yZXZlcnNlX3NvcnRbMF0pCgkJ CQkJaW5kZXhzY2FuZGlyID0gQmFja3dhcmRTY2FuRGlyZWN0aW9uOwoJCQkJZWxzZQoJCQkJ CWluZGV4c2NhbmRpciA9IEZvcndhcmRTY2FuRGlyZWN0aW9uOwoJCQkJYnJlYWs7CgkJCWNh c2UgQ09NUEFSRV9HVDoKCQkJCWlmIChpbmRleC0+cmV2ZXJzZV9zb3J0WzBdKQoJCQkJCWlu ZGV4c2NhbmRpciA9IEZvcndhcmRTY2FuRGlyZWN0aW9uOwoJCQkJZWxzZQoJCQkJCWluZGV4 c2NhbmRpciA9IEJhY2t3YXJkU2NhbkRpcmVjdGlvbjsKCQkJCWJyZWFrOwoJCQlkZWZhdWx0 OgoJCQkJLyogaW5kZXggZG9lc24ndCBtYXRjaCB0aGUgc29ydG9wICovCgkJCQljb250aW51 ZTsKCQl9CgoJCS8qCgkJICogRm91bmQgYSBzdWl0YWJsZSBpbmRleCB0byBleHRyYWN0IGRh dGEgZnJvbS4gIFNldCB1cCBzb21lIGRhdGEgdGhhdAoJCSAqIGNhbiBiZSB1c2VkIGJ5IGJv dGggaW52b2NhdGlvbnMgb2YgZ2V0X2FjdHVhbF92YXJpYWJsZV9lbmRwb2ludC4KCQkgKi8K CQl7CgkJCU1lbW9yeUNvbnRleHQgdG1wY29udGV4dDsKCQkJTWVtb3J5Q29udGV4dCBvbGRj b250ZXh0OwoJCQlSZWxhdGlvbgloZWFwUmVsOwoJCQlSZWxhdGlvbglpbmRleFJlbDsKCQkJ VHVwbGVUYWJsZVNsb3QgKnNsb3Q7CgkJCWludDE2CQl0eXBMZW47CgkJCWJvb2wJCXR5cEJ5 VmFsOwoJCQlTY2FuS2V5RGF0YSBzY2Fua2V5c1sxXTsKCgkJCS8qIE1ha2Ugc3VyZSBhbnkg Y3J1ZnQgZ2V0cyByZWN5Y2xlZCB3aGVuIHdlJ3JlIGRvbmUgKi8KCQkJdG1wY29udGV4dCA9 IEFsbG9jU2V0Q29udGV4dENyZWF0ZShDdXJyZW50TWVtb3J5Q29udGV4dCwKCQkJCQkJCQkJ CQkgICAiZ2V0X2FjdHVhbF92YXJpYWJsZV9yYW5nZSB3b3Jrc3BhY2UiLAoJCQkJCQkJCQkJ CSAgIEFMTE9DU0VUX0RFRkFVTFRfU0laRVMpOwoJCQlvbGRjb250ZXh0ID0gTWVtb3J5Q29u dGV4dFN3aXRjaFRvKHRtcGNvbnRleHQpOwoKCQkJLyoKCQkJICogT3BlbiB0aGUgdGFibGUg YW5kIGluZGV4IHNvIHdlIGNhbiByZWFkIGZyb20gdGhlbS4gIFdlIHNob3VsZAoJCQkgKiBh bHJlYWR5IGhhdmUgc29tZSB0eXBlIG9mIGxvY2sgb24gZWFjaC4KCQkJICovCgkJCWhlYXBS ZWwgPSB0YWJsZV9vcGVuKHJ0ZS0+cmVsaWQsIE5vTG9jayk7CgkJCWluZGV4UmVsID0gaW5k ZXhfb3BlbihpbmRleC0+aW5kZXhvaWQsIE5vTG9jayk7CgoJCQkvKiBidWlsZCBzb21lIHN0 dWZmIG5lZWRlZCBmb3IgaW5kZXhzY2FuIGV4ZWN1dGlvbiAqLwoJCQlzbG90ID0gdGFibGVf c2xvdF9jcmVhdGUoaGVhcFJlbCwgTlVMTCk7CgkJCWdldF90eXBsZW5ieXZhbCh2YXJkYXRh LT5hdHR0eXBlLCAmdHlwTGVuLCAmdHlwQnlWYWwpOwoKCQkJLyogc2V0IHVwIGFuIElTIE5P VCBOVUxMIHNjYW4ga2V5IHNvIHRoYXQgd2UgaWdub3JlIG51bGxzICovCgkJCVNjYW5LZXlF bnRyeUluaXRpYWxpemUoJnNjYW5rZXlzWzBdLAoJCQkJCQkJCSAgIFNLX0lTTlVMTCB8IFNL X1NFQVJDSE5PVE5VTEwsCgkJCQkJCQkJICAgMSwJLyogaW5kZXggY29sIHRvIHNjYW4gKi8K CQkJCQkJCQkgICBJbnZhbGlkU3RyYXRlZ3ksIC8qIG5vIHN0cmF0ZWd5ICovCgkJCQkJCQkJ ICAgSW52YWxpZE9pZCwJLyogbm8gc3RyYXRlZ3kgc3VidHlwZSAqLwoJCQkJCQkJCSAgIElu dmFsaWRPaWQsCS8qIG5vIGNvbGxhdGlvbiAqLwoJCQkJCQkJCSAgIEludmFsaWRPaWQsCS8q IG5vIHJlZyBwcm9jIGZvciB0aGlzICovCgkJCQkJCQkJICAgKERhdHVtKSAwKTsJLyogY29u c3RhbnQgKi8KCgkJCS8qIElmIG1pbiBpcyByZXF1ZXN0ZWQgLi4uICovCgkJCWlmIChtaW4p CgkJCXsKCQkJCWhhdmVfZGF0YSA9IGdldF9hY3R1YWxfdmFyaWFibGVfZW5kcG9pbnQoaGVh cFJlbCwKCQkJCQkJCQkJCQkJCQkgaW5kZXhSZWwsCgkJCQkJCQkJCQkJCQkJIGluZGV4c2Nh bmRpciwKCQkJCQkJCQkJCQkJCQkgc2NhbmtleXMsCgkJCQkJCQkJCQkJCQkJIHR5cExlbiwK CQkJCQkJCQkJCQkJCQkgdHlwQnlWYWwsCgkJCQkJCQkJCQkJCQkJIHNsb3QsCgkJCQkJCQkJ CQkJCQkJIG9sZGNvbnRleHQsCgkJCQkJCQkJCQkJCQkJIG1pbik7CgkJCX0KCQkJZWxzZQoJ CQl7CgkJCQkvKiBJZiBtaW4gbm90IHJlcXVlc3RlZCwgc3RpbGwgd2FudCB0byBmZXRjaCBt YXggKi8KCQkJCWhhdmVfZGF0YSA9IHRydWU7CgkJCX0KCgkJCS8qIElmIG1heCBpcyByZXF1 ZXN0ZWQsIGFuZCB3ZSBkaWRuJ3QgYWxyZWFkeSBmYWlsIC4uLiAqLwoJCQlpZiAobWF4ICYm IGhhdmVfZGF0YSkKCQkJewoJCQkJLyogc2NhbiBpbiB0aGUgb3Bwb3NpdGUgZGlyZWN0aW9u OyBhbGwgZWxzZSBpcyB0aGUgc2FtZSAqLwoJCQkJaGF2ZV9kYXRhID0gZ2V0X2FjdHVhbF92 YXJpYWJsZV9lbmRwb2ludChoZWFwUmVsLAoJCQkJCQkJCQkJCQkJCSBpbmRleFJlbCwKCQkJ CQkJCQkJCQkJCQkgLWluZGV4c2NhbmRpciwKCQkJCQkJCQkJCQkJCQkgc2NhbmtleXMsCgkJ CQkJCQkJCQkJCQkJIHR5cExlbiwKCQkJCQkJCQkJCQkJCQkgdHlwQnlWYWwsCgkJCQkJCQkJ CQkJCQkJIHNsb3QsCgkJCQkJCQkJCQkJCQkJIG9sZGNvbnRleHQsCgkJCQkJCQkJCQkJCQkJ IG1heCk7CgkJCX0KCgkJCS8qIENsZWFuIGV2ZXJ5dGhpbmcgdXAgKi8KCQkJRXhlY0Ryb3BT aW5nbGVUdXBsZVRhYmxlU2xvdChzbG90KTsKCgkJCWluZGV4X2Nsb3NlKGluZGV4UmVsLCBO b0xvY2spOwoJCQl0YWJsZV9jbG9zZShoZWFwUmVsLCBOb0xvY2spOwoKCQkJTWVtb3J5Q29u dGV4dFN3aXRjaFRvKG9sZGNvbnRleHQpOwoJCQlNZW1vcnlDb250ZXh0RGVsZXRlKHRtcGNv bnRleHQpOwoKCQkJLyogQW5kIHdlJ3JlIGRvbmUgKi8KCQkJYnJlYWs7CgkJfQoJfQoKCXJl dHVybiBoYXZlX2RhdGE7Cn0KCi8qCiAqIEdldCBvbmUgZW5kcG9pbnQgZGF0dW0gKG1pbiBv ciBtYXggZGVwZW5kaW5nIG9uIGluZGV4c2NhbmRpcikgZnJvbSB0aGUKICogc3BlY2lmaWVk IGluZGV4LiAgUmV0dXJuIHRydWUgaWYgc3VjY2Vzc2Z1bCwgZmFsc2UgaWYgbm90LgogKiBP biBzdWNjZXNzLCBlbmRwb2ludCB2YWx1ZSBpcyBzdG9yZWQgdG8gKmVuZHBvaW50RGF0dW0g KGFuZCBjb3BpZWQgaW50bwogKiBvdXRlcmNvbnRleHQpLgogKgogKiBzY2Fua2V5cyBpcyBh IDEtZWxlbWVudCBzY2Fua2V5IGFycmF5IHNldCB1cCB0byByZWplY3QgbnVsbHMuCiAqIHR5 cExlbi90eXBCeVZhbCBkZXNjcmliZSB0aGUgZGF0YXR5cGUgb2YgdGhlIGluZGV4J3MgZmly c3QgY29sdW1uLgogKiB0YWJsZXNsb3QgaXMgYSBzbG90IHN1aXRhYmxlIHRvIGhvbGQgdGFi bGUgdHVwbGVzLCBpbiBjYXNlIHdlIG5lZWQKICogdG8gcHJvYmUgdGhlIGhlYXAuCiAqIChX ZSBjb3VsZCBjb21wdXRlIHRoZXNlIHZhbHVlcyBsb2NhbGx5LCBidXQgdGhhdCB3b3VsZCBt ZWFuIGNvbXB1dGluZyB0aGVtCiAqIHR3aWNlIHdoZW4gZ2V0X2FjdHVhbF92YXJpYWJsZV9y YW5nZSBuZWVkcyBib3RoIHRoZSBtaW4gYW5kIHRoZSBtYXguKQogKgogKiBGYWlsdXJlIG9j Y3VycyBlaXRoZXIgd2hlbiB0aGUgaW5kZXggaXMgZW1wdHksIG9yIHdlIGRlY2lkZSB0aGF0 IGl0J3MKICogdGFraW5nIHRvbyBsb25nIHRvIGZpbmQgYSBzdWl0YWJsZSB0dXBsZS4KICov CnN0YXRpYyBib29sCmdldF9hY3R1YWxfdmFyaWFibGVfZW5kcG9pbnQoUmVsYXRpb24gaGVh cFJlbCwKCQkJCQkJCSBSZWxhdGlvbiBpbmRleFJlbCwKCQkJCQkJCSBTY2FuRGlyZWN0aW9u IGluZGV4c2NhbmRpciwKCQkJCQkJCSBTY2FuS2V5IHNjYW5rZXlzLAoJCQkJCQkJIGludDE2 IHR5cExlbiwKCQkJCQkJCSBib29sIHR5cEJ5VmFsLAoJCQkJCQkJIFR1cGxlVGFibGVTbG90 ICp0YWJsZXNsb3QsCgkJCQkJCQkgTWVtb3J5Q29udGV4dCBvdXRlcmNvbnRleHQsCgkJCQkJ CQkgRGF0dW0gKmVuZHBvaW50RGF0dW0pCnsKCWJvb2wJCWhhdmVfZGF0YSA9IGZhbHNlOwoJ U25hcHNob3REYXRhIFNuYXBzaG90Tm9uVmFjdXVtYWJsZTsKCUluZGV4U2NhbkRlc2MgaW5k ZXhfc2NhbjsKCUJ1ZmZlcgkJdm1idWZmZXIgPSBJbnZhbGlkQnVmZmVyOwoJQmxvY2tOdW1i ZXIgbGFzdF9oZWFwX2Jsb2NrID0gSW52YWxpZEJsb2NrTnVtYmVyOwoJaW50CQkJbl92aXNp dGVkX2hlYXBfcGFnZXMgPSAwOwoJSXRlbVBvaW50ZXIgdGlkOwoJRGF0dW0JCXZhbHVlc1tJ TkRFWF9NQVhfS0VZU107Cglib29sCQlpc251bGxbSU5ERVhfTUFYX0tFWVNdOwoJTWVtb3J5 Q29udGV4dCBvbGRjb250ZXh0OwoKCS8qCgkgKiBXZSB1c2UgdGhlIGluZGV4LW9ubHktc2Nh biBtYWNoaW5lcnkgZm9yIHRoaXMuICBXaXRoIG1vc3RseS1zdGF0aWMKCSAqIHRhYmxlcyB0 aGF0J3MgYSB3aW4gYmVjYXVzZSBpdCBhdm9pZHMgYSBoZWFwIHZpc2l0LiAgSXQncyBhbHNv IGEgd2luCgkgKiBmb3IgZHluYW1pYyBkYXRhLCBidXQgdGhlIHJlYXNvbiBpcyBsZXNzIG9i dmlvdXM7IHJlYWQgb24gZm9yIGRldGFpbHMuCgkgKgoJICogSW4gcHJpbmNpcGxlLCB3ZSBz aG91bGQgc2NhbiB0aGUgaW5kZXggd2l0aCBvdXIgY3VycmVudCBhY3RpdmUKCSAqIHNuYXBz aG90LCB3aGljaCBpcyB0aGUgYmVzdCBhcHByb3hpbWF0aW9uIHdlJ3ZlIGdvdCB0byB3aGF0 IHRoZSBxdWVyeQoJICogd2lsbCBzZWUgd2hlbiBleGVjdXRlZC4gIEJ1dCB0aGF0IHdvbid0 IGJlIGV4YWN0IGlmIGEgbmV3IHNuYXAgaXMgdGFrZW4KCSAqIGJlZm9yZSBydW5uaW5nIHRo ZSBxdWVyeSwgYW5kIGl0IGNhbiBiZSB2ZXJ5IGV4cGVuc2l2ZSBpZiBhIGxvdCBvZgoJICog cmVjZW50bHktZGVhZCBvciB1bmNvbW1pdHRlZCByb3dzIGV4aXN0IGF0IHRoZSBiZWdpbm5p bmcgb3IgZW5kIG9mIHRoZQoJICogaW5kZXggKGJlY2F1c2Ugd2UnbGwgbGFib3Jpb3VzbHkg ZmV0Y2ggZWFjaCBvbmUgYW5kIHJlamVjdCBpdCkuCgkgKiBJbnN0ZWFkLCB3ZSB1c2UgU25h cHNob3ROb25WYWN1dW1hYmxlLiAgVGhhdCB3aWxsIGFjY2VwdCByZWNlbnRseS1kZWFkCgkg KiBhbmQgdW5jb21taXR0ZWQgcm93cyBhcyB3ZWxsIGFzIG5vcm1hbCB2aXNpYmxlIHJvd3Mu ICBPbiB0aGUgb3RoZXIKCSAqIGhhbmQsIGl0IHdpbGwgcmVqZWN0IGtub3duLWRlYWQgcm93 cywgYW5kIHRodXMgbm90IGdpdmUgYSBib2d1cyBhbnN3ZXIKCSAqIHdoZW4gdGhlIGV4dHJl bWUgdmFsdWUgaGFzIGJlZW4gZGVsZXRlZCAodW5sZXNzIHRoZSBkZWxldGlvbiB3YXMgcXVp dGUKCSAqIHJlY2VudCk7IHRoYXQgY2FzZSBtb3RpdmF0ZXMgbm90IHVzaW5nIFNuYXBzaG90 QW55IGhlcmUuCgkgKgoJICogQSBjcnVjaWFsIHBvaW50IGhlcmUgaXMgdGhhdCBTbmFwc2hv dE5vblZhY3V1bWFibGUsIHdpdGgKCSAqIEdsb2JhbFZpc1Rlc3RGb3IoaGVhcFJlbCkgYXMg aG9yaXpvbiwgeWllbGRzIHRoZSBpbnZlcnNlIG9mIHRoZQoJICogY29uZGl0aW9uIHRoYXQg dGhlIGluZGV4c2NhbiB3aWxsIHVzZSB0byBkZWNpZGUgdGhhdCBpbmRleCBlbnRyaWVzIGFy ZQoJICoga2lsbGFibGUgKHNlZSBoZWFwX2hvdF9zZWFyY2hfYnVmZmVyKCkpLiAgVGhlcmVm b3JlLCBpZiB0aGUgc25hcHNob3QKCSAqIHJlamVjdHMgYSB0dXBsZSAob3IgbW9yZSBwcmVj aXNlbHksIGFsbCB0dXBsZXMgb2YgYSBIT1QgY2hhaW4pIGFuZCB3ZQoJICogaGF2ZSB0byBj b250aW51ZSBzY2FubmluZyBwYXN0IGl0LCB3ZSBrbm93IHRoYXQgdGhlIGluZGV4c2NhbiB3 aWxsIG1hcmsKCSAqIHRoYXQgaW5kZXggZW50cnkga2lsbGVkLiAgVGhhdCBtZWFucyB0aGF0 IHRoZSBuZXh0CgkgKiBnZXRfYWN0dWFsX3ZhcmlhYmxlX2VuZHBvaW50KCkgY2FsbCB3aWxs IG5vdCBoYXZlIHRvIHJlLWNvbnNpZGVyIHRoYXQKCSAqIGluZGV4IGVudHJ5LiAgSW4gdGhp cyB3YXkgd2UgYXZvaWQgcmVwZXRpdGl2ZSB3b3JrIHdoZW4gdGhpcyBmdW5jdGlvbgoJICog aXMgdXNlZCBhIGxvdCBkdXJpbmcgcGxhbm5pbmcuCgkgKgoJICogQnV0IHVzaW5nIFNuYXBz aG90Tm9uVmFjdXVtYWJsZSBjcmVhdGVzIGEgaGF6YXJkIG9mIGl0cyBvd24uICBJbiBhCgkg KiByZWNlbnRseS1jcmVhdGVkIGluZGV4LCBzb21lIGluZGV4IGVudHJpZXMgbWF5IHBvaW50 IGF0ICJicm9rZW4iIEhPVAoJICogY2hhaW5zIGluIHdoaWNoIG5vdCBhbGwgdGhlIHR1cGxl IHZlcnNpb25zIGNvbnRhaW4gZGF0YSBtYXRjaGluZyB0aGUKCSAqIGluZGV4IGVudHJ5LiAg VGhlIGxpdmUgdHVwbGUgdmVyc2lvbihzKSBjZXJ0YWlubHkgZG8gbWF0Y2ggdGhlIGluZGV4 LAoJICogYnV0IFNuYXBzaG90Tm9uVmFjdXVtYWJsZSBjYW4gYWNjZXB0IHJlY2VudGx5LWRl YWQgdHVwbGUgdmVyc2lvbnMgdGhhdAoJICogZG9uJ3QgbWF0Y2guICBIZW5jZSwgaWYgd2Ug dG9vayBkYXRhIGZyb20gdGhlIHNlbGVjdGVkIGhlYXAgdHVwbGUsIHdlCgkgKiBtaWdodCBn ZXQgYSBib2d1cyBhbnN3ZXIgdGhhdCdzIG5vdCBjbG9zZSB0byB0aGUgaW5kZXggZXh0cmVt YWwgdmFsdWUsCgkgKiBvciBjb3VsZCBldmVuIGJlIE5VTEwuICBXZSBhdm9pZCB0aGlzIGhh emFyZCBiZWNhdXNlIHdlIHRha2UgdGhlIGRhdGEKCSAqIGZyb20gdGhlIGluZGV4IGVudHJ5 IG5vdCB0aGUgaGVhcC4KCSAqCgkgKiBEZXNwaXRlIGFsbCB0aGlzIGNhcmUsIHRoZXJlIGFy ZSBzaXR1YXRpb25zIHdoZXJlIHdlIG1pZ2h0IGZpbmQgbWFueQoJICogbm9uLXZpc2libGUg dHVwbGVzIG5lYXIgdGhlIGVuZCBvZiB0aGUgaW5kZXguICBXZSBkb24ndCB3YW50IHRvIGV4 cGVuZAoJICogYSBodWdlIGFtb3VudCBvZiB0aW1lIGhlcmUsIHNvIHdlIGdpdmUgdXAgb25j ZSB3ZSd2ZSByZWFkIHRvbyBtYW55IGhlYXAKCSAqIHBhZ2VzLiAgV2hlbiB3ZSBmYWlsIGZv ciB0aGF0IHJlYXNvbiwgdGhlIGNhbGxlciB3aWxsIGVuZCB1cCB1c2luZwoJICogd2hhdGV2 ZXIgZXh0cmVtYWwgdmFsdWUgaXMgcmVjb3JkZWQgaW4gcGdfc3RhdGlzdGljLgoJICovCglJ bml0Tm9uVmFjdXVtYWJsZVNuYXBzaG90KFNuYXBzaG90Tm9uVmFjdXVtYWJsZSwKCQkJCQkJ CSAgR2xvYmFsVmlzVGVzdEZvcihoZWFwUmVsKSk7CgoJaW5kZXhfc2NhbiA9IGluZGV4X2Jl Z2luc2NhbihoZWFwUmVsLCBpbmRleFJlbCwKCQkJCQkJCQkgJlNuYXBzaG90Tm9uVmFjdXVt YWJsZSwgTlVMTCwKCQkJCQkJCQkgMSwgMCwKCQkJCQkJCQkgU09fTk9ORSk7CgkvKiBTZXQg aXQgdXAgZm9yIGluZGV4LW9ubHkgc2NhbiAqLwoJaW5kZXhfc2Nhbi0+eHNfd2FudF9pdHVw ID0gdHJ1ZTsKCWluZGV4X3Jlc2NhbihpbmRleF9zY2FuLCBzY2Fua2V5cywgMSwgTlVMTCwg MCk7CgoJLyogRmV0Y2ggZmlyc3QvbmV4dCB0dXBsZSBpbiBzcGVjaWZpZWQgZGlyZWN0aW9u ICovCgl3aGlsZSAoKHRpZCA9IGluZGV4X2dldG5leHRfdGlkKGluZGV4X3NjYW4sIGluZGV4 c2NhbmRpcikpICE9IE5VTEwpCgl7CgkJQmxvY2tOdW1iZXIgYmxvY2sgPSBJdGVtUG9pbnRl ckdldEJsb2NrTnVtYmVyKHRpZCk7CgoJCWlmICghVk1fQUxMX1ZJU0lCTEUoaGVhcFJlbCwK CQkJCQkJCWJsb2NrLAoJCQkJCQkJJnZtYnVmZmVyKSkKCQl7CgkJCS8qIFJhdHMsIHdlIGhh dmUgdG8gdmlzaXQgdGhlIGhlYXAgdG8gY2hlY2sgdmlzaWJpbGl0eSAqLwoJCQlpZiAoIWlu ZGV4X2ZldGNoX2hlYXAoaW5kZXhfc2NhbiwgdGFibGVzbG90KSkKCQkJewoJCQkJLyoKCQkJ CSAqIE5vIHZpc2libGUgdHVwbGUgZm9yIHRoaXMgaW5kZXggZW50cnksIHNvIHdlIG5lZWQg dG8KCQkJCSAqIGFkdmFuY2UgdG8gdGhlIG5leHQgZW50cnkuICBCZWZvcmUgZG9pbmcgc28s IGNvdW50IGhlYXAKCQkJCSAqIHBhZ2UgZmV0Y2hlcyBhbmQgZ2l2ZSB1cCBpZiB3ZSd2ZSBk b25lIHRvbyBtYW55LgoJCQkJICoKCQkJCSAqIFdlIGRvbid0IGNoYXJnZSBhIHBhZ2UgZmV0 Y2ggaWYgdGhpcyBpcyB0aGUgc2FtZSBoZWFwIHBhZ2UKCQkJCSAqIGFzIHRoZSBwcmV2aW91 cyB0dXBsZS4gIFRoaXMgaXMgb24gdGhlIGNvbnNlcnZhdGl2ZSBzaWRlLAoJCQkJICogc2lu Y2Ugb3RoZXIgcmVjZW50bHktYWNjZXNzZWQgcGFnZXMgYXJlIHByb2JhYmx5IHN0aWxsIGlu CgkJCQkgKiBidWZmZXJzIHRvbzsgYnV0IGl0J3MgZ29vZCBlbm91Z2ggZm9yIHRoaXMgaGV1 cmlzdGljLgoJCQkJICovCiNkZWZpbmUgVklTSVRFRF9QQUdFU19MSU1JVCAxMDAKCgkJCQlp ZiAoYmxvY2sgIT0gbGFzdF9oZWFwX2Jsb2NrKQoJCQkJewoJCQkJCWxhc3RfaGVhcF9ibG9j ayA9IGJsb2NrOwoJCQkJCW5fdmlzaXRlZF9oZWFwX3BhZ2VzKys7CgkJCQkJaWYgKG5fdmlz aXRlZF9oZWFwX3BhZ2VzID4gVklTSVRFRF9QQUdFU19MSU1JVCkKCQkJCQkJYnJlYWs7CgkJ CQl9CgoJCQkJY29udGludWU7CQkvKiBubyB2aXNpYmxlIHR1cGxlLCB0cnkgbmV4dCBpbmRl eCBlbnRyeSAqLwoJCQl9CgoJCQkvKiBXZSBkb24ndCBhY3R1YWxseSBuZWVkIHRoZSBoZWFw IHR1cGxlIGZvciBhbnl0aGluZyAqLwoJCQlFeGVjQ2xlYXJUdXBsZSh0YWJsZXNsb3QpOwoK CQkJLyoKCQkJICogV2UgZG9uJ3QgY2FyZSB3aGV0aGVyIHRoZXJlJ3MgbW9yZSB0aGFuIG9u ZSB2aXNpYmxlIHR1cGxlIGluCgkJCSAqIHRoZSBIT1QgY2hhaW47IGlmIGFueSBhcmUgdmlz aWJsZSwgdGhhdCdzIGdvb2QgZW5vdWdoLgoJCQkgKi8KCQl9CgoJCS8qCgkJICogV2UgZXhw ZWN0IHRoYXQgdGhlIGluZGV4IHdpbGwgcmV0dXJuIGRhdGEgaW4gSW5kZXhUdXBsZSBub3QK CQkgKiBIZWFwVHVwbGUgZm9ybWF0LgoJCSAqLwoJCWlmICghaW5kZXhfc2Nhbi0+eHNfaXR1 cCkKCQkJZWxvZyhFUlJPUiwgIm5vIGRhdGEgcmV0dXJuZWQgZm9yIGluZGV4LW9ubHkgc2Nh biIpOwoKCQkvKgoJCSAqIFdlIGRvIG5vdCB5ZXQgc3VwcG9ydCByZWNoZWNrIGhlcmUuCgkJ ICovCgkJaWYgKGluZGV4X3NjYW4tPnhzX3JlY2hlY2spCgkJCWJyZWFrOwoKCQkvKiBPSyB0 byBkZWNvbnN0cnVjdCB0aGUgaW5kZXggdHVwbGUgKi8KCQlpbmRleF9kZWZvcm1fdHVwbGUo aW5kZXhfc2Nhbi0+eHNfaXR1cCwKCQkJCQkJICAgaW5kZXhfc2Nhbi0+eHNfaXR1cGRlc2Ms CgkJCQkJCSAgIHZhbHVlcywgaXNudWxsKTsKCgkJLyogU2hvdWxkbid0IGhhdmUgZ290IGEg bnVsbCwgYnV0IGJlIGNhcmVmdWwgKi8KCQlpZiAoaXNudWxsWzBdKQoJCQllbG9nKEVSUk9S LCAiZm91bmQgdW5leHBlY3RlZCBudWxsIHZhbHVlIGluIGluZGV4IFwiJXNcIiIsCgkJCQkg UmVsYXRpb25HZXRSZWxhdGlvbk5hbWUoaW5kZXhSZWwpKTsKCgkJLyogQ29weSB0aGUgaW5k ZXggY29sdW1uIHZhbHVlIG91dCB0byBjYWxsZXIncyBjb250ZXh0ICovCgkJb2xkY29udGV4 dCA9IE1lbW9yeUNvbnRleHRTd2l0Y2hUbyhvdXRlcmNvbnRleHQpOwoJCSplbmRwb2ludERh dHVtID0gZGF0dW1Db3B5KHZhbHVlc1swXSwgdHlwQnlWYWwsIHR5cExlbik7CgkJTWVtb3J5 Q29udGV4dFN3aXRjaFRvKG9sZGNvbnRleHQpOwoJCWhhdmVfZGF0YSA9IHRydWU7CgkJYnJl YWs7Cgl9CgoJaWYgKHZtYnVmZmVyICE9IEludmFsaWRCdWZmZXIpCgkJUmVsZWFzZUJ1ZmZl cih2bWJ1ZmZlcik7CglpbmRleF9lbmRzY2FuKGluZGV4X3NjYW4pOwoKCXJldHVybiBoYXZl X2RhdGE7Cn0KCi8qCiAqIGZpbmRfam9pbl9pbnB1dF9yZWwKICoJCUxvb2sgdXAgdGhlIGlu cHV0IHJlbGF0aW9uIGZvciBhIGpvaW4uCiAqCiAqIFdlIGFzc3VtZSB0aGF0IHRoZSBpbnB1 dCByZWxhdGlvbidzIFJlbE9wdEluZm8gbXVzdCBoYXZlIGJlZW4gY29uc3RydWN0ZWQKICog YWxyZWFkeS4KICovCnN0YXRpYyBSZWxPcHRJbmZvICoKZmluZF9qb2luX2lucHV0X3JlbChQ bGFubmVySW5mbyAqcm9vdCwgUmVsaWRzIHJlbGlkcykKewoJUmVsT3B0SW5mbyAqcmVsID0g TlVMTDsKCglpZiAoIWJtc19pc19lbXB0eShyZWxpZHMpKQoJewoJCWludAkJCXJlbGlkOwoK CQlpZiAoYm1zX2dldF9zaW5nbGV0b25fbWVtYmVyKHJlbGlkcywgJnJlbGlkKSkKCQkJcmVs ID0gZmluZF9iYXNlX3JlbChyb290LCByZWxpZCk7CgkJZWxzZQoJCQlyZWwgPSBmaW5kX2pv aW5fcmVsKHJvb3QsIHJlbGlkcyk7Cgl9CgoJaWYgKHJlbCA9PSBOVUxMKQoJCWVsb2coRVJS T1IsICJjb3VsZCBub3QgZmluZCBSZWxPcHRJbmZvIGZvciBnaXZlbiByZWxpZHMiKTsKCgly ZXR1cm4gcmVsOwp9CgoKLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAqCiAqIEluZGV4IGNvc3Qg ZXN0aW1hdGlvbiBmdW5jdGlvbnMKICoKICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAqLwoKLyoK ICogRXh0cmFjdCB0aGUgYWN0dWFsIGluZGV4cXVhbHMgKGFzIFJlc3RyaWN0SW5mb3MpIGZy b20gYW4gSW5kZXhDbGF1c2UgbGlzdAogKi8KTGlzdCAqCmdldF9xdWFsc19mcm9tX2luZGV4 Y2xhdXNlcyhMaXN0ICppbmRleGNsYXVzZXMpCnsKCUxpc3QJICAgKnJlc3VsdCA9IE5JTDsK CUxpc3RDZWxsICAgKmxjOwoKCWZvcmVhY2gobGMsIGluZGV4Y2xhdXNlcykKCXsKCQlJbmRl eENsYXVzZSAqaWNsYXVzZSA9IGxmaXJzdF9ub2RlKEluZGV4Q2xhdXNlLCBsYyk7CgkJTGlz dENlbGwgICAqbGMyOwoKCQlmb3JlYWNoKGxjMiwgaWNsYXVzZS0+aW5kZXhxdWFscykKCQl7 CgkJCVJlc3RyaWN0SW5mbyAqcmluZm8gPSBsZmlyc3Rfbm9kZShSZXN0cmljdEluZm8sIGxj Mik7CgoJCQlyZXN1bHQgPSBsYXBwZW5kKHJlc3VsdCwgcmluZm8pOwoJCX0KCX0KCXJldHVy biByZXN1bHQ7Cn0KCi8qCiAqIENvbXB1dGUgdGhlIHRvdGFsIGV2YWx1YXRpb24gY29zdCBv ZiB0aGUgY29tcGFyaXNvbiBvcGVyYW5kcyBpbiBhIGxpc3QKICogb2YgaW5kZXggcXVhbCBl eHByZXNzaW9ucy4gIFNpbmNlIHdlIGtub3cgdGhlc2Ugd2lsbCBiZSBldmFsdWF0ZWQganVz dAogKiBvbmNlIHBlciBzY2FuLCB0aGVyZSdzIG5vIG5lZWQgdG8gZGlzdGluZ3Vpc2ggc3Rh cnR1cCBmcm9tIHBlci1yb3cgY29zdC4KICoKICogVGhpcyBjYW4gYmUgdXNlZCBlaXRoZXIg b24gdGhlIHJlc3VsdCBvZiBnZXRfcXVhbHNfZnJvbV9pbmRleGNsYXVzZXMoKSwKICogb3Ig ZGlyZWN0bHkgb24gYW4gaW5kZXhvcmRlcmJ5cyBsaXN0LiAgSW4gYm90aCBjYXNlcywgd2Ug ZXhwZWN0IHRoYXQgdGhlCiAqIGluZGV4IGtleSBleHByZXNzaW9uIGlzIG9uIHRoZSBsZWZ0 IHNpZGUgb2YgYmluYXJ5IGNsYXVzZXMuCiAqLwpDb3N0CmluZGV4X290aGVyX29wZXJhbmRz X2V2YWxfY29zdChQbGFubmVySW5mbyAqcm9vdCwgTGlzdCAqaW5kZXhxdWFscykKewoJQ29z dAkJcXVhbF9hcmdfY29zdCA9IDA7CglMaXN0Q2VsbCAgICpsYzsKCglmb3JlYWNoKGxjLCBp bmRleHF1YWxzKQoJewoJCUV4cHIJICAgKmNsYXVzZSA9IChFeHByICopIGxmaXJzdChsYyk7 CgkJTm9kZQkgICAqb3RoZXJfb3BlcmFuZDsKCQlRdWFsQ29zdAlpbmRleF9xdWFsX2Nvc3Q7 CgoJCS8qCgkJICogSW5kZXggcXVhbHMgd2lsbCBoYXZlIFJlc3RyaWN0SW5mb3MsIGluZGV4 b3JkZXJieXMgd29uJ3QuICBMb29rCgkJICogdGhyb3VnaCBSZXN0cmljdEluZm8gaWYgcHJl c2VudC4KCQkgKi8KCQlpZiAoSXNBKGNsYXVzZSwgUmVzdHJpY3RJbmZvKSkKCQkJY2xhdXNl ID0gKChSZXN0cmljdEluZm8gKikgY2xhdXNlKS0+Y2xhdXNlOwoKCQlpZiAoSXNBKGNsYXVz ZSwgT3BFeHByKSkKCQl7CgkJCU9wRXhwcgkgICAqb3AgPSAoT3BFeHByICopIGNsYXVzZTsK CgkJCW90aGVyX29wZXJhbmQgPSAoTm9kZSAqKSBsc2Vjb25kKG9wLT5hcmdzKTsKCQl9CgkJ ZWxzZSBpZiAoSXNBKGNsYXVzZSwgUm93Q29tcGFyZUV4cHIpKQoJCXsKCQkJUm93Q29tcGFy ZUV4cHIgKnJjID0gKFJvd0NvbXBhcmVFeHByICopIGNsYXVzZTsKCgkJCW90aGVyX29wZXJh bmQgPSAoTm9kZSAqKSByYy0+cmFyZ3M7CgkJfQoJCWVsc2UgaWYgKElzQShjbGF1c2UsIFNj YWxhckFycmF5T3BFeHByKSkKCQl7CgkJCVNjYWxhckFycmF5T3BFeHByICpzYW9wID0gKFNj YWxhckFycmF5T3BFeHByICopIGNsYXVzZTsKCgkJCW90aGVyX29wZXJhbmQgPSAoTm9kZSAq KSBsc2Vjb25kKHNhb3AtPmFyZ3MpOwoJCX0KCQllbHNlIGlmIChJc0EoY2xhdXNlLCBOdWxs VGVzdCkpCgkJewoJCQlvdGhlcl9vcGVyYW5kID0gTlVMTDsKCQl9CgkJZWxzZQoJCXsKCQkJ ZWxvZyhFUlJPUiwgInVuc3VwcG9ydGVkIGluZGV4cXVhbCB0eXBlOiAlZCIsCgkJCQkgKGlu dCkgbm9kZVRhZyhjbGF1c2UpKTsKCQkJb3RoZXJfb3BlcmFuZCA9IE5VTEw7CS8qIGtlZXAg Y29tcGlsZXIgcXVpZXQgKi8KCQl9CgoJCWNvc3RfcXVhbF9ldmFsX25vZGUoJmluZGV4X3F1 YWxfY29zdCwgb3RoZXJfb3BlcmFuZCwgcm9vdCk7CgkJcXVhbF9hcmdfY29zdCArPSBpbmRl eF9xdWFsX2Nvc3Quc3RhcnR1cCArIGluZGV4X3F1YWxfY29zdC5wZXJfdHVwbGU7Cgl9Cgly ZXR1cm4gcXVhbF9hcmdfY29zdDsKfQoKLyoKICogQ29tcHV0ZSBnZW5lcmljIGluZGV4IGFj Y2VzcyBjb3N0IGVzdGltYXRlcy4KICoKICogU2VlIHN0cnVjdCBHZW5lcmljQ29zdHMgaW4g c2VsZnVuY3MuaCBmb3IgbW9yZSBpbmZvLgogKi8Kdm9pZApnZW5lcmljY29zdGVzdGltYXRl KFBsYW5uZXJJbmZvICpyb290LAoJCQkJCUluZGV4UGF0aCAqcGF0aCwKCQkJCQlkb3VibGUg bG9vcF9jb3VudCwKCQkJCQlHZW5lcmljQ29zdHMgKmNvc3RzKQp7CglJbmRleE9wdEluZm8g KmluZGV4ID0gcGF0aC0+aW5kZXhpbmZvOwoJTGlzdAkgICAqaW5kZXhRdWFscyA9IGdldF9x dWFsc19mcm9tX2luZGV4Y2xhdXNlcyhwYXRoLT5pbmRleGNsYXVzZXMpOwoJTGlzdAkgICAq aW5kZXhPcmRlckJ5cyA9IHBhdGgtPmluZGV4b3JkZXJieXM7CglDb3N0CQlpbmRleFN0YXJ0 dXBDb3N0OwoJQ29zdAkJaW5kZXhUb3RhbENvc3Q7CglTZWxlY3Rpdml0eSBpbmRleFNlbGVj dGl2aXR5OwoJZG91YmxlCQlpbmRleENvcnJlbGF0aW9uOwoJZG91YmxlCQludW1JbmRleFBh Z2VzOwoJZG91YmxlCQludW1JbmRleFR1cGxlczsKCWRvdWJsZQkJc3BjX3JhbmRvbV9wYWdl X2Nvc3Q7Cglkb3VibGUJCW51bV9zYV9zY2FuczsKCWRvdWJsZQkJbnVtX291dGVyX3NjYW5z OwoJZG91YmxlCQludW1fc2NhbnM7Cglkb3VibGUJCXF1YWxfb3BfY29zdDsKCWRvdWJsZQkJ cXVhbF9hcmdfY29zdDsKCUxpc3QJICAgKnNlbGVjdGl2aXR5UXVhbHM7CglMaXN0Q2VsbCAg ICpsOwoKCS8qCgkgKiBJZiB0aGUgaW5kZXggaXMgcGFydGlhbCwgQU5EIHRoZSBpbmRleCBw cmVkaWNhdGUgd2l0aCB0aGUgZXhwbGljaXRseQoJICogZ2l2ZW4gaW5kZXhxdWFscyB0byBw cm9kdWNlIGEgbW9yZSBhY2N1cmF0ZSBpZGVhIG9mIHRoZSBpbmRleAoJICogc2VsZWN0aXZp dHkuCgkgKi8KCXNlbGVjdGl2aXR5UXVhbHMgPSBhZGRfcHJlZGljYXRlX3RvX2luZGV4X3F1 YWxzKGluZGV4LCBpbmRleFF1YWxzKTsKCgkvKgoJICogSWYgY2FsbGVyIGRpZG4ndCBnaXZl IHVzIGFuIGVzdGltYXRlIGZvciBTY2FsYXJBcnJheU9wRXhwciBpbmRleCBzY2FucywKCSAq IGp1c3QgYXNzdW1lIHRoYXQgdGhlIG51bWJlciBvZiBpbmRleCBkZXNjZW50cyBpcyB0aGUg bnVtYmVyIG9mIGRpc3RpbmN0CgkgKiBjb21iaW5hdGlvbnMgb2YgYXJyYXkgZWxlbWVudHMg ZnJvbSBhbGwgb2YgdGhlIHNjYW4ncyBTQU9QIGNsYXVzZXMuCgkgKi8KCW51bV9zYV9zY2Fu cyA9IGNvc3RzLT5udW1fc2Ffc2NhbnM7CglpZiAobnVtX3NhX3NjYW5zIDwgMSkKCXsKCQlu dW1fc2Ffc2NhbnMgPSAxOwoJCWZvcmVhY2gobCwgaW5kZXhRdWFscykKCQl7CgkJCVJlc3Ry aWN0SW5mbyAqcmluZm8gPSAoUmVzdHJpY3RJbmZvICopIGxmaXJzdChsKTsKCgkJCWlmIChJ c0EocmluZm8tPmNsYXVzZSwgU2NhbGFyQXJyYXlPcEV4cHIpKQoJCQl7CgkJCQlTY2FsYXJB cnJheU9wRXhwciAqc2FvcCA9IChTY2FsYXJBcnJheU9wRXhwciAqKSByaW5mby0+Y2xhdXNl OwoJCQkJZG91YmxlCQlhbGVuZ3RoID0gZXN0aW1hdGVfYXJyYXlfbGVuZ3RoKHJvb3QsIGxz ZWNvbmQoc2FvcC0+YXJncykpOwoKCQkJCWlmIChhbGVuZ3RoID4gMSkKCQkJCQludW1fc2Ff c2NhbnMgKj0gYWxlbmd0aDsKCQkJfQoJCX0KCX0KCgkvKiBFc3RpbWF0ZSB0aGUgZnJhY3Rp b24gb2YgbWFpbi10YWJsZSB0dXBsZXMgdGhhdCB3aWxsIGJlIHZpc2l0ZWQgKi8KCWluZGV4 U2VsZWN0aXZpdHkgPSBjbGF1c2VsaXN0X3NlbGVjdGl2aXR5KHJvb3QsIHNlbGVjdGl2aXR5 UXVhbHMsCgkJCQkJCQkJCQkJICBpbmRleC0+cmVsLT5yZWxpZCwKCQkJCQkJCQkJCQkgIEpP SU5fSU5ORVIsCgkJCQkJCQkJCQkJICBOVUxMKTsKCgkvKgoJICogSWYgY2FsbGVyIGRpZG4n dCBnaXZlIHVzIGFuIGVzdGltYXRlLCBlc3RpbWF0ZSB0aGUgbnVtYmVyIG9mIGluZGV4Cgkg KiB0dXBsZXMgdGhhdCB3aWxsIGJlIHZpc2l0ZWQuICBXZSBkbyBpdCBpbiB0aGlzIHJhdGhl ciBwZWN1bGlhci1sb29raW5nCgkgKiB3YXkgaW4gb3JkZXIgdG8gZ2V0IHRoZSByaWdodCBh bnN3ZXIgZm9yIHBhcnRpYWwgaW5kZXhlcy4KCSAqLwoJbnVtSW5kZXhUdXBsZXMgPSBjb3N0 cy0+bnVtSW5kZXhUdXBsZXM7CglpZiAobnVtSW5kZXhUdXBsZXMgPD0gMC4wKQoJewoJCW51 bUluZGV4VHVwbGVzID0gaW5kZXhTZWxlY3Rpdml0eSAqIGluZGV4LT5yZWwtPnR1cGxlczsK CgkJLyoKCQkgKiBUaGUgYWJvdmUgY2FsY3VsYXRpb24gY291bnRzIGFsbCB0aGUgdHVwbGVz IHZpc2l0ZWQgYWNyb3NzIGFsbAoJCSAqIHNjYW5zIGluZHVjZWQgYnkgU2NhbGFyQXJyYXlP cEV4cHIgbm9kZXMuICBXZSB3YW50IHRvIGNvbnNpZGVyIHRoZQoJCSAqIGF2ZXJhZ2UgcGVy LWluZGV4c2NhbiBudW1iZXIsIHNvIGFkanVzdC4gIFRoaXMgaXMgYSBoYW5keSBwbGFjZSB0 bwoJCSAqIHJvdW5kIHRvIGludGVnZXIsIHRvby4gIChJZiBjYWxsZXIgc3VwcGxpZWQgdHVw bGUgZXN0aW1hdGUsIGl0J3MKCQkgKiByZXNwb25zaWJsZSBmb3IgaGFuZGxpbmcgdGhlc2Ug Y29uc2lkZXJhdGlvbnMuKQoJCSAqLwoJCW51bUluZGV4VHVwbGVzID0gcmludChudW1JbmRl eFR1cGxlcyAvIG51bV9zYV9zY2Fucyk7Cgl9CgoJLyoKCSAqIFdlIGNhbiBib3VuZCB0aGUg bnVtYmVyIG9mIHR1cGxlcyBieSB0aGUgaW5kZXggc2l6ZSBpbiBhbnkgY2FzZS4gQWxzbywK CSAqIGFsd2F5cyBlc3RpbWF0ZSBhdCBsZWFzdCBvbmUgdHVwbGUgaXMgdG91Y2hlZCwgZXZl biB3aGVuCgkgKiBpbmRleFNlbGVjdGl2aXR5IGVzdGltYXRlIGlzIHRpbnkuCgkgKi8KCWlm IChudW1JbmRleFR1cGxlcyA+IGluZGV4LT50dXBsZXMpCgkJbnVtSW5kZXhUdXBsZXMgPSBp bmRleC0+dHVwbGVzOwoJaWYgKG51bUluZGV4VHVwbGVzIDwgMS4wKQoJCW51bUluZGV4VHVw bGVzID0gMS4wOwoKCS8qCgkgKiBFc3RpbWF0ZSB0aGUgbnVtYmVyIG9mIGluZGV4IHBhZ2Vz IHRoYXQgd2lsbCBiZSByZXRyaWV2ZWQuCgkgKgoJICogV2UgdXNlIHRoZSBzaW1wbGlzdGlj IG1ldGhvZCBvZiB0YWtpbmcgYSBwcm8tcmF0YSBmcmFjdGlvbiBvZiB0aGUgdG90YWwKCSAq IG51bWJlciBvZiBpbmRleCBsZWFmIHBhZ2VzLiAgV2UgZGlzcmVnYXJkIGFueSBvdmVyaGVh ZCBzdWNoIGFzIGluZGV4CgkgKiBtZXRhcGFnZXMgb3IgdXBwZXIgdHJlZSBsZXZlbHMuCgkg KgoJICogSW4gcHJhY3RpY2UgYWNjZXNzIHRvIHVwcGVyIGluZGV4IGxldmVscyBpcyBvZnRl biBuZWFybHkgZnJlZSBiZWNhdXNlCgkgKiB0aG9zZSB0ZW5kIHRvIHN0YXkgaW4gY2FjaGUg dW5kZXIgbG9hZDsgbW9yZW92ZXIsIHRoZSBjb3N0IGludm9sdmVkIGlzCgkgKiBoaWdobHkg ZGVwZW5kZW50IG9uIGluZGV4IHR5cGUuICBXZSB0aGVyZWZvcmUgaWdub3JlIHN1Y2ggY29z dHMgaGVyZQoJICogYW5kIGxlYXZlIGl0IHRvIHRoZSBjYWxsZXIgdG8gYWRkIGEgc3VpdGFi bGUgY2hhcmdlIGlmIG5lZWRlZC4KCSAqLwoJaWYgKGluZGV4LT5wYWdlcyA+IGNvc3RzLT5u dW1Ob25MZWFmUGFnZXMgJiYgaW5kZXgtPnR1cGxlcyA+IDEpCgkJbnVtSW5kZXhQYWdlcyA9 CgkJCWNlaWwobnVtSW5kZXhUdXBsZXMgKiAoaW5kZXgtPnBhZ2VzIC0gY29zdHMtPm51bU5v bkxlYWZQYWdlcykKCQkJCSAvIGluZGV4LT50dXBsZXMpOwoJZWxzZQoJCW51bUluZGV4UGFn ZXMgPSAxLjA7CgoJLyogZmV0Y2ggZXN0aW1hdGVkIHBhZ2UgY29zdCBmb3IgdGFibGVzcGFj ZSBjb250YWluaW5nIGluZGV4ICovCglnZXRfdGFibGVzcGFjZV9wYWdlX2Nvc3RzKGluZGV4 LT5yZWx0YWJsZXNwYWNlLAoJCQkJCQkJICAmc3BjX3JhbmRvbV9wYWdlX2Nvc3QsCgkJCQkJ CQkgIE5VTEwpOwoKCS8qCgkgKiBOb3cgY29tcHV0ZSB0aGUgZGlzayBhY2Nlc3MgY29zdHMu CgkgKgoJICogVGhlIGFib3ZlIGNhbGN1bGF0aW9ucyBhcmUgYWxsIHBlci1pbmRleC1zY2Fu LiAgSG93ZXZlciwgaWYgd2UgYXJlIGluIGEKCSAqIG5lc3Rsb29wIGlubmVyIHNjYW4sIHdl IGNhbiBleHBlY3QgdGhlIHNjYW4gdG8gYmUgcmVwZWF0ZWQgKHdpdGgKCSAqIGRpZmZlcmVu dCBzZWFyY2gga2V5cykgZm9yIGVhY2ggcm93IG9mIHRoZSBvdXRlciByZWxhdGlvbi4gIExp a2V3aXNlLAoJICogU2NhbGFyQXJyYXlPcEV4cHIgcXVhbHMgcmVzdWx0IGluIG11bHRpcGxl IGluZGV4IHNjYW5zLiAgVGhpcyBjcmVhdGVzCgkgKiB0aGUgcG90ZW50aWFsIGZvciBjYWNo ZSBlZmZlY3RzIHRvIHJlZHVjZSB0aGUgbnVtYmVyIG9mIGRpc2sgcGFnZQoJICogZmV0Y2hl cyBuZWVkZWQuICBXZSB3YW50IHRvIGVzdGltYXRlIHRoZSBhdmVyYWdlIHBlci1zY2FuIEkv TyBjb3N0IGluCgkgKiB0aGUgcHJlc2VuY2Ugb2YgY2FjaGluZy4KCSAqCgkgKiBXZSB1c2Ug dGhlIE1hY2tlcnQtTG9obWFuIGZvcm11bGEgKHNlZSBjb3N0c2l6ZS5jIGZvciBkZXRhaWxz KSB0bwoJICogZXN0aW1hdGUgdGhlIHRvdGFsIG51bWJlciBvZiBwYWdlIGZldGNoZXMgdGhh dCBvY2N1ci4gIFdoaWxlIHRoaXMKCSAqIHdhc24ndCB3aGF0IGl0IHdhcyBkZXNpZ25lZCBm b3IsIGl0IHNlZW1zIGEgcmVhc29uYWJsZSBtb2RlbCBhbnl3YXkuCgkgKiBOb3RlIHRoYXQg d2UgYXJlIGNvdW50aW5nIHBhZ2VzIG5vdCB0dXBsZXMgYW55bW9yZSwgc28gd2UgdGFrZSBO ID0gVCA9CgkgKiBpbmRleCBzaXplLCBhcyBpZiB0aGVyZSB3ZXJlIG9uZSAidHVwbGUiIHBl ciBwYWdlLgoJICovCgludW1fb3V0ZXJfc2NhbnMgPSBsb29wX2NvdW50OwoJbnVtX3NjYW5z ID0gbnVtX3NhX3NjYW5zICogbnVtX291dGVyX3NjYW5zOwoKCWlmIChudW1fc2NhbnMgPiAx KQoJewoJCWRvdWJsZQkJcGFnZXNfZmV0Y2hlZDsKCgkJLyogdG90YWwgcGFnZSBmZXRjaGVz IGlnbm9yaW5nIGNhY2hlIGVmZmVjdHMgKi8KCQlwYWdlc19mZXRjaGVkID0gbnVtSW5kZXhQ YWdlcyAqIG51bV9zY2FuczsKCgkJLyogdXNlIE1hY2tlcnQgYW5kIExvaG1hbiBmb3JtdWxh IHRvIGFkanVzdCBmb3IgY2FjaGUgZWZmZWN0cyAqLwoJCXBhZ2VzX2ZldGNoZWQgPSBpbmRl eF9wYWdlc19mZXRjaGVkKHBhZ2VzX2ZldGNoZWQsCgkJCQkJCQkJCQkJaW5kZXgtPnBhZ2Vz LAoJCQkJCQkJCQkJCShkb3VibGUpIGluZGV4LT5wYWdlcywKCQkJCQkJCQkJCQlyb290KTsK CgkJLyoKCQkgKiBOb3cgY29tcHV0ZSB0aGUgdG90YWwgZGlzayBhY2Nlc3MgY29zdCwgYW5k IHRoZW4gcmVwb3J0IGEgcHJvLXJhdGVkCgkJICogc2hhcmUgZm9yIGVhY2ggb3V0ZXIgc2Nh bi4gIChEb24ndCBwcm8tcmF0ZSBmb3IgU2NhbGFyQXJyYXlPcEV4cHIsCgkJICogc2luY2Ug dGhhdCdzIGludGVybmFsIHRvIHRoZSBpbmRleHNjYW4uKQoJCSAqLwoJCWluZGV4VG90YWxD b3N0ID0gKHBhZ2VzX2ZldGNoZWQgKiBzcGNfcmFuZG9tX3BhZ2VfY29zdCkKCQkJLyBudW1f b3V0ZXJfc2NhbnM7Cgl9CgllbHNlCgl7CgkJLyoKCQkgKiBGb3IgYSBzaW5nbGUgaW5kZXgg c2Nhbiwgd2UganVzdCBjaGFyZ2Ugc3BjX3JhbmRvbV9wYWdlX2Nvc3QgcGVyCgkJICogcGFn ZSB0b3VjaGVkLgoJCSAqLwoJCWluZGV4VG90YWxDb3N0ID0gbnVtSW5kZXhQYWdlcyAqIHNw Y19yYW5kb21fcGFnZV9jb3N0OwoJfQoKCS8qCgkgKiBDUFUgY29zdDogYW55IGNvbXBsZXgg ZXhwcmVzc2lvbnMgaW4gdGhlIGluZGV4cXVhbHMgd2lsbCBuZWVkIHRvIGJlCgkgKiBldmFs dWF0ZWQgb25jZSBhdCB0aGUgc3RhcnQgb2YgdGhlIHNjYW4gdG8gcmVkdWNlIHRoZW0gdG8g cnVudGltZSBrZXlzCgkgKiB0byBwYXNzIHRvIHRoZSBpbmRleCBBTSAoc2VlIG5vZGVJbmRl eHNjYW4uYykuICBXZSBtb2RlbCB0aGUgcGVyLXR1cGxlCgkgKiBDUFUgY29zdHMgYXMgY3B1 X2luZGV4X3R1cGxlX2Nvc3QgcGx1cyBvbmUgY3B1X29wZXJhdG9yX2Nvc3QgcGVyCgkgKiBp bmRleHF1YWwgb3BlcmF0b3IuICBCZWNhdXNlIHdlIGhhdmUgbnVtSW5kZXhUdXBsZXMgYXMg YSBwZXItc2NhbgoJICogbnVtYmVyLCB3ZSBoYXZlIHRvIG11bHRpcGx5IGJ5IG51bV9zYV9z Y2FucyB0byBnZXQgdGhlIGNvcnJlY3QgcmVzdWx0CgkgKiBmb3IgU2NhbGFyQXJyYXlPcEV4 cHIgY2FzZXMuICBTaW1pbGFybHkgYWRkIGluIGNvc3RzIGZvciBhbnkgaW5kZXgKCSAqIE9S REVSIEJZIGV4cHJlc3Npb25zLgoJICoKCSAqIE5vdGU6IHRoaXMgbmVnbGVjdHMgdGhlIHBv c3NpYmxlIGNvc3RzIG9mIHJlY2hlY2tpbmcgbG9zc3kgb3BlcmF0b3JzLgoJICogRGV0ZWN0 aW5nIHRoYXQgdGhhdCBtaWdodCBiZSBuZWVkZWQgc2VlbXMgbW9yZSBleHBlbnNpdmUgdGhh biBpdCdzCgkgKiB3b3J0aCwgdGhvdWdoLCBjb25zaWRlcmluZyBhbGwgdGhlIG90aGVyIGlu YWNjdXJhY2llcyBoZXJlIC4uLgoJICovCglxdWFsX2FyZ19jb3N0ID0gaW5kZXhfb3RoZXJf b3BlcmFuZHNfZXZhbF9jb3N0KHJvb3QsIGluZGV4UXVhbHMpICsKCQlpbmRleF9vdGhlcl9v cGVyYW5kc19ldmFsX2Nvc3Qocm9vdCwgaW5kZXhPcmRlckJ5cyk7CglxdWFsX29wX2Nvc3Qg PSBjcHVfb3BlcmF0b3JfY29zdCAqCgkJKGxpc3RfbGVuZ3RoKGluZGV4UXVhbHMpICsgbGlz dF9sZW5ndGgoaW5kZXhPcmRlckJ5cykpOwoKCWluZGV4U3RhcnR1cENvc3QgPSBxdWFsX2Fy Z19jb3N0OwoJaW5kZXhUb3RhbENvc3QgKz0gcXVhbF9hcmdfY29zdDsKCWluZGV4VG90YWxD b3N0ICs9IG51bUluZGV4VHVwbGVzICogbnVtX3NhX3NjYW5zICogKGNwdV9pbmRleF90dXBs ZV9jb3N0ICsgcXVhbF9vcF9jb3N0KTsKCgkvKgoJICogR2VuZXJpYyBhc3N1bXB0aW9uIGFi b3V0IGluZGV4IGNvcnJlbGF0aW9uOiB0aGVyZSBpc24ndCBhbnkuCgkgKi8KCWluZGV4Q29y cmVsYXRpb24gPSAwLjA7CgoJLyoKCSAqIFJldHVybiBldmVyeXRoaW5nIHRvIGNhbGxlci4K CSAqLwoJY29zdHMtPmluZGV4U3RhcnR1cENvc3QgPSBpbmRleFN0YXJ0dXBDb3N0OwoJY29z dHMtPmluZGV4VG90YWxDb3N0ID0gaW5kZXhUb3RhbENvc3Q7Cgljb3N0cy0+aW5kZXhTZWxl Y3Rpdml0eSA9IGluZGV4U2VsZWN0aXZpdHk7Cgljb3N0cy0+aW5kZXhDb3JyZWxhdGlvbiA9 IGluZGV4Q29ycmVsYXRpb247Cgljb3N0cy0+bnVtSW5kZXhQYWdlcyA9IG51bUluZGV4UGFn ZXM7Cgljb3N0cy0+bnVtSW5kZXhUdXBsZXMgPSBudW1JbmRleFR1cGxlczsKCWNvc3RzLT5z cGNfcmFuZG9tX3BhZ2VfY29zdCA9IHNwY19yYW5kb21fcGFnZV9jb3N0OwoJY29zdHMtPm51 bV9zYV9zY2FucyA9IG51bV9zYV9zY2FuczsKfQoKLyoKICogSWYgdGhlIGluZGV4IGlzIHBh cnRpYWwsIGFkZCBpdHMgcHJlZGljYXRlIHRvIHRoZSBnaXZlbiBxdWFsIGxpc3QuCiAqCiAq IEFORGluZyB0aGUgaW5kZXggcHJlZGljYXRlIHdpdGggdGhlIGV4cGxpY2l0bHkgZ2l2ZW4g aW5kZXhxdWFscyBwcm9kdWNlcwogKiBhIG1vcmUgYWNjdXJhdGUgaWRlYSBvZiB0aGUgaW5k ZXgncyBzZWxlY3Rpdml0eS4gIEhvd2V2ZXIsIHdlIG5lZWQgdG8gYmUKICogY2FyZWZ1bCBu b3QgdG8gaW5zZXJ0IHJlZHVuZGFudCBjbGF1c2VzLCBiZWNhdXNlIGNsYXVzZWxpc3Rfc2Vs ZWN0aXZpdHkoKQogKiBpcyBlYXNpbHkgZm9vbGVkIGludG8gY29tcHV0aW5nIGEgdG9vLWxv dyBzZWxlY3Rpdml0eSBlc3RpbWF0ZS4gIE91cgogKiBhcHByb2FjaCBpcyB0byBhZGQgb25s eSB0aGUgcHJlZGljYXRlIGNsYXVzZShzKSB0aGF0IGNhbm5vdCBiZSBwcm92ZW4gdG8KICog YmUgaW1wbGllZCBieSB0aGUgZ2l2ZW4gaW5kZXhxdWFscy4gIFRoaXMgc3VjY2Vzc2Z1bGx5 IGhhbmRsZXMgY2FzZXMgc3VjaAogKiBhcyBhIHF1YWwgInggPSA0MiIgdXNlZCB3aXRoIGEg cGFydGlhbCBpbmRleCAiV0hFUkUgeCA+PSA0MCBBTkQgeCA8IDUwIi4KICogVGhlcmUgYXJl IG1hbnkgb3RoZXIgY2FzZXMgd2hlcmUgd2Ugd29uJ3QgZGV0ZWN0IHJlZHVuZGFuY3ksIGxl YWRpbmcgdG8gYQogKiB0b28tbG93IHNlbGVjdGl2aXR5IGVzdGltYXRlLCB3aGljaCB3aWxs IGJpYXMgdGhlIHN5c3RlbSBpbiBmYXZvciBvZiB1c2luZwogKiBwYXJ0aWFsIGluZGV4ZXMg d2hlcmUgcG9zc2libGUuICBUaGF0IGlzIG5vdCBuZWNlc3NhcmlseSBiYWQgdGhvdWdoLgog KgogKiBOb3RlIHRoYXQgaW5kZXhRdWFscyBjb250YWlucyBSZXN0cmljdEluZm8gbm9kZXMg d2hpbGUgdGhlIGluZHByZWQKICogZG9lcyBub3QsIHNvIHRoZSBvdXRwdXQgbGlzdCB3aWxs IGJlIG1peGVkLiAgVGhpcyBpcyBPSyBmb3IgYm90aAogKiBwcmVkaWNhdGVfaW1wbGllZF9i eSgpIGFuZCBjbGF1c2VsaXN0X3NlbGVjdGl2aXR5KCksIGJ1dCBtaWdodCBiZQogKiBwcm9i bGVtYXRpYyBpZiB0aGUgcmVzdWx0IHdlcmUgcGFzc2VkIHRvIG90aGVyIHRoaW5ncy4KICov Ckxpc3QgKgphZGRfcHJlZGljYXRlX3RvX2luZGV4X3F1YWxzKEluZGV4T3B0SW5mbyAqaW5k ZXgsIExpc3QgKmluZGV4UXVhbHMpCnsKCUxpc3QJICAgKnByZWRFeHRyYVF1YWxzID0gTklM OwoJTGlzdENlbGwgICAqbGM7CgoJaWYgKGluZGV4LT5pbmRwcmVkRXhwYW5kID09IE5JTCkK CQlyZXR1cm4gaW5kZXhRdWFsczsKCglmb3JlYWNoKGxjLCBpbmRleC0+aW5kcHJlZEV4cGFu ZCkKCXsKCQlOb2RlCSAgICpwcmVkUXVhbCA9IChOb2RlICopIGxmaXJzdChsYyk7CgkJTGlz dAkgICAqb25lUXVhbCA9IGxpc3RfbWFrZTEocHJlZFF1YWwpOwoKCQlpZiAoIXByZWRpY2F0 ZV9pbXBsaWVkX2J5KG9uZVF1YWwsIGluZGV4UXVhbHMsIGZhbHNlKSkKCQkJcHJlZEV4dHJh UXVhbHMgPSBsaXN0X2NvbmNhdChwcmVkRXh0cmFRdWFscywgb25lUXVhbCk7Cgl9CglyZXR1 cm4gbGlzdF9jb25jYXQocHJlZEV4dHJhUXVhbHMsIGluZGV4UXVhbHMpOwp9CgovKgogKiBF c3RpbWF0ZSBjb3JyZWxhdGlvbiBvZiBidHJlZSBpbmRleCdzIGZpcnN0IGNvbHVtbi4KICoK ICogSWYgd2UgY2FuIGdldCBhbiBlc3RpbWF0ZSBvZiB0aGUgZmlyc3QgY29sdW1uJ3Mgb3Jk ZXJpbmcgY29ycmVsYXRpb24gQwogKiBmcm9tIHBnX3N0YXRpc3RpYywgZXN0aW1hdGUgdGhl IGluZGV4IGNvcnJlbGF0aW9uIGFzIEMgZm9yIGEgc2luZ2xlLWNvbHVtbgogKiBpbmRleCwg b3IgQyAqIDAuNzUgZm9yIG11bHRpcGxlIGNvbHVtbnMuICBUaGUgaWRlYSBoZXJlIGlzIHRo YXQgbXVsdGlwbGUKICogY29sdW1ucyBkaWx1dGUgdGhlIGltcG9ydGFuY2Ugb2YgdGhlIGZp cnN0IGNvbHVtbidzIG9yZGVyaW5nLCBidXQgZG9uJ3QKICogbmVnYXRlIGl0IGVudGlyZWx5 LgogKgogKiBXZSBhbHJlYWR5IGZpbGxlZCBpbiB0aGUgc3RhdHMgdHVwbGUgZm9yICp2YXJk YXRhIHdoZW4gY2FsbGVkLgogKi8Kc3RhdGljIGRvdWJsZQpidGNvc3RfY29ycmVsYXRpb24o SW5kZXhPcHRJbmZvICppbmRleCwgVmFyaWFibGVTdGF0RGF0YSAqdmFyZGF0YSkKewoJT2lk CQkJc29ydG9wOwoJQXR0U3RhdHNTbG90IHNzbG90OwoJZG91YmxlCQlpbmRleENvcnJlbGF0 aW9uID0gMDsKCglBc3NlcnQoSGVhcFR1cGxlSXNWYWxpZCh2YXJkYXRhLT5zdGF0c1R1cGxl KSk7CgoJc29ydG9wID0gZ2V0X29wZmFtaWx5X21lbWJlcihpbmRleC0+b3BmYW1pbHlbMF0s CgkJCQkJCQkJIGluZGV4LT5vcGNpbnR5cGVbMF0sCgkJCQkJCQkJIGluZGV4LT5vcGNpbnR5 cGVbMF0sCgkJCQkJCQkJIEJUTGVzc1N0cmF0ZWd5TnVtYmVyKTsKCWlmIChPaWRJc1ZhbGlk KHNvcnRvcCkgJiYKCQlnZXRfYXR0c3RhdHNzbG90KCZzc2xvdCwgdmFyZGF0YS0+c3RhdHNU dXBsZSwKCQkJCQkJIFNUQVRJU1RJQ19LSU5EX0NPUlJFTEFUSU9OLCBzb3J0b3AsCgkJCQkJ CSBBVFRTVEFUU1NMT1RfTlVNQkVSUykpCgl7CgkJZG91YmxlCQl2YXJDb3JyZWxhdGlvbjsK CgkJQXNzZXJ0KHNzbG90Lm5udW1iZXJzID09IDEpOwoJCXZhckNvcnJlbGF0aW9uID0gc3Ns b3QubnVtYmVyc1swXTsKCgkJaWYgKGluZGV4LT5yZXZlcnNlX3NvcnRbMF0pCgkJCXZhckNv cnJlbGF0aW9uID0gLXZhckNvcnJlbGF0aW9uOwoKCQlpZiAoaW5kZXgtPm5rZXljb2x1bW5z ID4gMSkKCQkJaW5kZXhDb3JyZWxhdGlvbiA9IHZhckNvcnJlbGF0aW9uICogMC43NTsKCQll bHNlCgkJCWluZGV4Q29ycmVsYXRpb24gPSB2YXJDb3JyZWxhdGlvbjsKCgkJZnJlZV9hdHRz dGF0c3Nsb3QoJnNzbG90KTsKCX0KCglyZXR1cm4gaW5kZXhDb3JyZWxhdGlvbjsKfQoKdm9p ZApidGNvc3Rlc3RpbWF0ZShQbGFubmVySW5mbyAqcm9vdCwgSW5kZXhQYXRoICpwYXRoLCBk b3VibGUgbG9vcF9jb3VudCwKCQkJICAgQ29zdCAqaW5kZXhTdGFydHVwQ29zdCwgQ29zdCAq aW5kZXhUb3RhbENvc3QsCgkJCSAgIFNlbGVjdGl2aXR5ICppbmRleFNlbGVjdGl2aXR5LCBk b3VibGUgKmluZGV4Q29ycmVsYXRpb24sCgkJCSAgIGRvdWJsZSAqaW5kZXhQYWdlcykKewoJ SW5kZXhPcHRJbmZvICppbmRleCA9IHBhdGgtPmluZGV4aW5mbzsKCUdlbmVyaWNDb3N0cyBj b3N0cyA9IHswfTsKCVZhcmlhYmxlU3RhdERhdGEgdmFyZGF0YSA9IHswfTsKCWRvdWJsZQkJ bnVtSW5kZXhUdXBsZXM7CglDb3N0CQlkZXNjZW50Q29zdDsKCUxpc3QJICAgKmluZGV4Qm91 bmRRdWFsczsKCUxpc3QJICAgKmluZGV4U2tpcFF1YWxzOwoJaW50CQkJaW5kZXhjb2w7Cgli b29sCQllcVF1YWxIZXJlOwoJYm9vbAkJZm91bmRfcm93X2NvbXBhcmU7Cglib29sCQlmb3Vu ZF9hcnJheTsKCWJvb2wJCWZvdW5kX2lzX251bGxfb3A7Cglib29sCQloYXZlX2NvcnJlbGF0 aW9uID0gZmFsc2U7Cglkb3VibGUJCW51bV9zYV9zY2FuczsKCWRvdWJsZQkJY29ycmVsYXRp b24gPSAwLjA7CglMaXN0Q2VsbCAgICpsYzsKCgkvKgoJICogRm9yIGEgYnRyZWUgc2Nhbiwg b25seSBsZWFkaW5nICc9JyBxdWFscyBwbHVzIGluZXF1YWxpdHkgcXVhbHMgZm9yIHRoZQoJ ICogaW1tZWRpYXRlbHkgbmV4dCBhdHRyaWJ1dGUgY29udHJpYnV0ZSB0byBpbmRleCBzZWxl Y3Rpdml0eSAodGhlc2UgYXJlCgkgKiB0aGUgImJvdW5kYXJ5IHF1YWxzIiB0aGF0IGRldGVy bWluZSB0aGUgc3RhcnRpbmcgYW5kIHN0b3BwaW5nIHBvaW50cyBvZgoJICogdGhlIGluZGV4 IHNjYW4pLiAgQWRkaXRpb25hbCBxdWFscyBjYW4gc3VwcHJlc3MgdmlzaXRzIHRvIHRoZSBo ZWFwLCBzbwoJICogaXQncyBPSyB0byBjb3VudCB0aGVtIGluIGluZGV4U2VsZWN0aXZpdHks IGJ1dCB0aGV5IHNob3VsZCBub3QgY291bnQKCSAqIGZvciBlc3RpbWF0aW5nIG51bUluZGV4 VHVwbGVzLiAgU28gd2UgbXVzdCBleGFtaW5lIHRoZSBnaXZlbiBpbmRleHF1YWxzCgkgKiB0 byBmaW5kIG91dCB3aGljaCBvbmVzIGNvdW50IGFzIGJvdW5kYXJ5IHF1YWxzLiAgV2UgcmVs eSBvbiB0aGUKCSAqIGtub3dsZWRnZSB0aGF0IHRoZXkgYXJlIGdpdmVuIGluIGluZGV4IGNv bHVtbiBvcmRlci4gIE5vdGUgdGhhdCBuYnRyZWUKCSAqIHByZXByb2Nlc3NpbmcgY2FuIGFk ZCBza2lwIGFycmF5cyB0aGF0IGFjdCBhcyBsZWFkaW5nICc9JyBxdWFscyBpbiB0aGUKCSAq IGFic2VuY2Ugb2Ygb3JkaW5hcnkgaW5wdXQgJz0nIHF1YWxzLCBzbyBpbiBwcmFjdGljZSBf bW9zdF8gaW5wdXQgcXVhbHMKCSAqIGFyZSBhYmxlIHRvIGFjdCBhcyBpbmRleCBib3VuZCBx dWFscyAod2hpY2ggd2UgdGFrZSBpbnRvIGFjY291bnQgaGVyZSkuCgkgKgoJICogRm9yIGEg Um93Q29tcGFyZUV4cHIsIHdlIGNvbnNpZGVyIG9ubHkgdGhlIGZpcnN0IGNvbHVtbiwganVz dCBhcwoJICogcm93Y29tcGFyZXNlbCgpIGRvZXMuCgkgKgoJICogSWYgdGhlcmUncyBhIFNB T1Agb3Igc2tpcCBhcnJheSBpbiB0aGUgcXVhbHMsIHdlJ2xsIGFjdHVhbGx5IHBlcmZvcm0g dXAKCSAqIHRvIE4gaW5kZXggZGVzY2VudHMgKG5vdCBqdXN0IG9uZSksIGJ1dCB0aGUgdW5k ZXJseWluZyBhcnJheSBrZXkncwoJICogb3BlcmF0b3IgY2FuIGJlIGNvbnNpZGVyZWQgdG8g YWN0IHRoZSBzYW1lIGFzIGl0IG5vcm1hbGx5IGRvZXMuCgkgKi8KCWluZGV4Qm91bmRRdWFs cyA9IE5JTDsKCWluZGV4U2tpcFF1YWxzID0gTklMOwoJaW5kZXhjb2wgPSAwOwoJZXFRdWFs SGVyZSA9IGZhbHNlOwoJZm91bmRfcm93X2NvbXBhcmUgPSBmYWxzZTsKCWZvdW5kX2FycmF5 ID0gZmFsc2U7Cglmb3VuZF9pc19udWxsX29wID0gZmFsc2U7CgludW1fc2Ffc2NhbnMgPSAx OwoJZm9yZWFjaChsYywgcGF0aC0+aW5kZXhjbGF1c2VzKQoJewoJCUluZGV4Q2xhdXNlICpp Y2xhdXNlID0gbGZpcnN0X25vZGUoSW5kZXhDbGF1c2UsIGxjKTsKCQlMaXN0Q2VsbCAgICps YzI7CgoJCWlmIChpbmRleGNvbCA8IGljbGF1c2UtPmluZGV4Y29sKQoJCXsKCQkJZG91Ymxl CQludW1fc2Ffc2NhbnNfcHJldl9jb2xzID0gbnVtX3NhX3NjYW5zOwoKCQkJLyoKCQkJICog QmVnaW5uaW5nIG9mIGEgbmV3IGNvbHVtbidzIHF1YWxzLgoJCQkgKgoJCQkgKiBTa2lwIHNj YW5zIHVzZSBza2lwIGFycmF5cywgd2hpY2ggYXJlIFNjYWxhckFycmF5T3Agc3R5bGUKCQkJ ICogYXJyYXlzIHRoYXQgZ2VuZXJhdGUgdGhlaXIgZWxlbWVudHMgcHJvY2VkdXJhbGx5IGFu ZCBvbiBkZW1hbmQuCgkJCSAqIEdpdmVuIGEgbXVsdGktY29sdW1uIGluZGV4IG9uICIoYSwg YikiLCBhbmQgYW4gU1FMIFdIRVJFIGNsYXVzZQoJCQkgKiAiV0hFUkUgYiA9IDQyIiwgYSBz a2lwIHNjYW4gd2lsbCBlZmZlY3RpdmVseSB1c2UgYW4gaW5kZXhxdWFsCgkJCSAqICJXSEVS RSBhID0gQU5ZKCd7ZXZlcnkgY29sIGEgdmFsdWV9JykgQU5EIGIgPSA0MiIuICAoT2J2aW91 c2x5LAoJCQkgKiB0aGUgYXJyYXkgb24gImEiIG11c3QgYWxzbyByZXR1cm4gIklTIE5VTEwi IG1hdGNoZXMsIHNpbmNlIG91cgoJCQkgKiBXSEVSRSBjbGF1c2UgdXNlZCBubyBzdHJpY3Qg b3BlcmF0b3Igb24gImEiKS4KCQkJICoKCQkJICogSGVyZSB3ZSBjb25zaWRlciBob3cgbmJ0 cmVlIHdpbGwgYmFja2ZpbGwgc2tpcCBhcnJheXMgZm9yIGFueQoJCQkgKiBpbmRleCBjb2x1 bW5zIHRoYXQgbGFja2VkIGFuICc9JyBxdWFsLiAgVGhpcyBtYWludGFpbnMgb3VyCgkJCSAq IG51bV9zYV9zY2FucyBlc3RpbWF0ZSwgYW5kIGRldGVybWluZXMgaWYgdGhpcyBuZXcgY29s dW1uICh0aGUKCQkJICogImljbGF1c2UtPmluZGV4Y29sIiBjb2x1bW4sIG5vdCB0aGUgcHJp b3IgImluZGV4Y29sIiBjb2x1bW4pCgkJCSAqIGNhbiBoYXZlIGl0cyBSZXN0cmljdEluZm9z L3F1YWxzIGFkZGVkIHRvIGluZGV4Qm91bmRRdWFscy4KCQkJICoKCQkJICogV2UnbGwgbmVl ZCB0byBoYW5kbGUgY29sdW1ucyB0aGF0IGhhdmUgaW5lcXVhbGl0eSBxdWFscywgd2hlcmUK CQkJICogdGhlIHNraXAgYXJyYXkgZ2VuZXJhdGVzIHZhbHVlcyBmcm9tIGEgcmFuZ2UgY29u c3RyYWluZWQgYnkgdGhlCgkJCSAqIHF1YWxzIChub3QgZXZlcnkgcG9zc2libGUgdmFsdWUp LiAgV2UndmUgYmVlbiBtYWludGFpbmluZwoJCQkgKiBpbmRleFNraXBRdWFscyB0byBoZWxw IHdpdGggdGhpczsgaXQgd2lsbCBub3cgY29udGFpbiBhbGwgb2YKCQkJICogdGhlIHByaW9y IGNvbHVtbidzIHF1YWxzICh0aGF0IGlzLCBpbmRleGNvbCdzIHF1YWxzKSB3aGVuIHRoZXkK CQkJICogbWlnaHQgYmUgdXNlZCBmb3IgdGhpcy4KCQkJICovCgkJCWlmIChmb3VuZF9yb3df Y29tcGFyZSkKCQkJewoJCQkJLyoKCQkJCSAqIFNraXAgYXJyYXlzIGNhbid0IGJlIGFkZGVk IGFmdGVyIGEgUm93Q29tcGFyZSBpbnB1dCBxdWFsCgkJCQkgKiBkdWUgdG8gbGltaXRhdGlv bnMgaW4gbmJ0cmVlCgkJCQkgKi8KCQkJCWJyZWFrOwoJCQl9CgkJCWlmIChlcVF1YWxIZXJl KQoJCQl7CgkJCQkvKgoJCQkJICogRG9uJ3QgbmVlZCB0byBhZGQgYSBza2lwIGFycmF5IGZv ciBhbiBpbmRleGNvbCB0aGF0IGFscmVhZHkKCQkJCSAqIGhhcyBhbiAnPScgcXVhbC9lcXVh bGl0eSBjb25zdHJhaW50CgkJCQkgKi8KCQkJCWluZGV4Y29sKys7CgkJCQlpbmRleFNraXBR dWFscyA9IE5JTDsKCQkJfQoJCQllcVF1YWxIZXJlID0gZmFsc2U7CgoJCQl3aGlsZSAoaW5k ZXhjb2wgPCBpY2xhdXNlLT5pbmRleGNvbCkKCQkJewoJCQkJZG91YmxlCQluZGlzdGluY3Q7 CgkJCQlib29sCQlpc2RlZmF1bHQgPSB0cnVlOwoKCQkJCWZvdW5kX2FycmF5ID0gdHJ1ZTsK CgkJCQkvKgoJCQkJICogQSBza2lwcGVkIGF0dHJpYnV0ZSdzIG5kaXN0aW5jdCBmb3JtcyB0 aGUgYmFzaXMgb2Ygb3VyCgkJCQkgKiBlc3RpbWF0ZSBvZiB0aGUgdG90YWwgbnVtYmVyIG9m ICJhcnJheSBlbGVtZW50cyIgdXNlZCBieQoJCQkJICogaXRzIHNraXAgYXJyYXkgYXQgcnVu dGltZS4gIExvb2sgdGhhdCB1cCBmaXJzdC4KCQkJCSAqLwoJCQkJZXhhbWluZV9pbmRleGNv bF92YXJpYWJsZShyb290LCBpbmRleCwgaW5kZXhjb2wsICZ2YXJkYXRhKTsKCQkJCW5kaXN0 aW5jdCA9IGdldF92YXJpYWJsZV9udW1kaXN0aW5jdCgmdmFyZGF0YSwgJmlzZGVmYXVsdCk7 CgoJCQkJaWYgKGluZGV4Y29sID09IDApCgkJCQl7CgkJCQkJLyoKCQkJCQkgKiBHZXQgYW4g ZXN0aW1hdGUgb2YgdGhlIGxlYWRpbmcgY29sdW1uJ3MgY29ycmVsYXRpb24gaW4KCQkJCQkg KiBwYXNzaW5nIChhdm9pZHMgcmVyZWFkaW5nIHZhcmlhYmxlIHN0YXRzIGJlbG93KQoJCQkJ CSAqLwoJCQkJCWlmIChIZWFwVHVwbGVJc1ZhbGlkKHZhcmRhdGEuc3RhdHNUdXBsZSkpCgkJ CQkJCWNvcnJlbGF0aW9uID0gYnRjb3N0X2NvcnJlbGF0aW9uKGluZGV4LCAmdmFyZGF0YSk7 CgkJCQkJaGF2ZV9jb3JyZWxhdGlvbiA9IHRydWU7CgkJCQl9CgoJCQkJUmVsZWFzZVZhcmlh YmxlU3RhdHModmFyZGF0YSk7CgoJCQkJLyoKCQkJCSAqIElmIG5kaXN0aW5jdCBpcyBhIGRl ZmF1bHQgZXN0aW1hdGUsIGNvbnNlcnZhdGl2ZWx5IGFzc3VtZQoJCQkJICogdGhhdCBubyBz a2lwcGluZyB3aWxsIGhhcHBlbiBhdCBydW50aW1lCgkJCQkgKi8KCQkJCWlmIChpc2RlZmF1 bHQpCgkJCQl7CgkJCQkJbnVtX3NhX3NjYW5zID0gbnVtX3NhX3NjYW5zX3ByZXZfY29sczsK CQkJCQlicmVhazsJCS8qIGRvbmUgYnVpbGRpbmcgaW5kZXhCb3VuZFF1YWxzICovCgkJCQl9 CgoJCQkJLyoKCQkJCSAqIEFwcGx5IGluZGV4Y29sJ3MgaW5kZXhTa2lwUXVhbHMgc2VsZWN0 aXZpdHkgdG8gbmRpc3RpbmN0CgkJCQkgKi8KCQkJCWlmIChpbmRleFNraXBRdWFscyAhPSBO SUwpCgkJCQl7CgkJCQkJTGlzdAkgICAqcGFydGlhbFNraXBRdWFsczsKCQkJCQlTZWxlY3Rp dml0eSBuZGlzdGluY3RmcmFjOwoKCQkJCQkvKgoJCQkJCSAqIElmIHRoZSBpbmRleCBpcyBw YXJ0aWFsLCBBTkQgdGhlIGluZGV4IHByZWRpY2F0ZSB3aXRoCgkJCQkJICogdGhlIGluZGV4 LWJvdW5kIHF1YWxzIHRvIHByb2R1Y2UgYSBtb3JlIGFjY3VyYXRlIGlkZWEKCQkJCQkgKiBv ZiB0aGUgbnVtYmVyIG9mIGRpc3RpbmN0IHZhbHVlcyBmb3IgcHJpb3IgaW5kZXhjb2wKCQkJ CQkgKi8KCQkJCQlwYXJ0aWFsU2tpcFF1YWxzID0gYWRkX3ByZWRpY2F0ZV90b19pbmRleF9x dWFscyhpbmRleCwKCQkJCQkJCQkJCQkJCQkJCQlpbmRleFNraXBRdWFscyk7CgoJCQkJCW5k aXN0aW5jdGZyYWMgPSBjbGF1c2VsaXN0X3NlbGVjdGl2aXR5KHJvb3QsIHBhcnRpYWxTa2lw UXVhbHMsCgkJCQkJCQkJCQkJCQkJICAgaW5kZXgtPnJlbC0+cmVsaWQsCgkJCQkJCQkJCQkJ CQkJICAgSk9JTl9JTk5FUiwKCQkJCQkJCQkJCQkJCQkgICBOVUxMKTsKCgkJCQkJLyoKCQkJ CQkgKiBJZiBuZGlzdGluY3RmcmFjIGlzIHNlbGVjdGl2ZSAob24gaXRzIG93biksIHRoZSBz Y2FuIGlzCgkJCQkJICogdW5saWtlbHkgdG8gYmVuZWZpdCBmcm9tIHJlcG9zaXRpb25pbmcg aXRzZWxmIHVzaW5nCgkJCQkJICogbGF0ZXIgcXVhbHMuICBEbyBub3QgYWxsb3cgaWNsYXVz ZS0+aW5kZXhjb2wncyBxdWFscyB0bwoJCQkJCSAqIGJlIGFkZGVkIHRvIGluZGV4Qm91bmRR dWFscyAoaXQgd291bGQgaW5jcmVhc2UgZGVzY2VudAoJCQkJCSAqIGNvc3RzLCB3aXRob3V0 IGxvd2VyaW5nIG51bUluZGV4VHVwbGVzIGNvc3RzIGJ5IG11Y2gpLgoJCQkJCSAqLwoJCQkJ CWlmIChuZGlzdGluY3RmcmFjIDwgREVGQVVMVF9SQU5HRV9JTkVRX1NFTCkKCQkJCQl7CgkJ CQkJCW51bV9zYV9zY2FucyA9IG51bV9zYV9zY2Fuc19wcmV2X2NvbHM7CgkJCQkJCWJyZWFr OwkvKiBkb25lIGJ1aWxkaW5nIGluZGV4Qm91bmRRdWFscyAqLwoJCQkJCX0KCgkJCQkJLyog QWRqdXN0IG5kaXN0aW5jdCBkb3dud2FyZCAqLwoJCQkJCW5kaXN0aW5jdCA9IHJpbnQobmRp c3RpbmN0ICogbmRpc3RpbmN0ZnJhYyk7CgkJCQkJbmRpc3RpbmN0ID0gTWF4KG5kaXN0aW5j dCwgMSk7CgkJCQl9CgoJCQkJLyoKCQkJCSAqIFdoZW4gdGhlcmUncyBubyBpbmVxdWFsaXR5 IHF1YWxzLCBhY2NvdW50IGZvciB0aGUgbmVlZCB0bwoJCQkJICogZmluZCBhbiBpbml0aWFs IHZhbHVlIGJ5IGNvdW50aW5nIC1pbmYvK2luZiBhcyBhIHZhbHVlLgoJCQkJICoKCQkJCSAq IFdlIGRvbid0IGNoYXJnZSBhbnl0aGluZyBleHRyYSBmb3IgcG9zc2libGUgbmV4dC9wcmlv ciBrZXkKCQkJCSAqIGluZGV4IHByb2Jlcywgd2hpY2ggYXJlIHNvbWV0aW1lcyB1c2VkIHRv IGZpbmQgdGhlIG5leHQKCQkJCSAqIHZhbGlkIHNraXAgYXJyYXkgZWxlbWVudCAoYWhlYWQg b2YgdXNpbmcgdGhlIGxvY2F0ZWQKCQkJCSAqIGVsZW1lbnQgdmFsdWUgdG8gcmVsb2NhdGUg dGhlIHNjYW4gdG8gdGhlIG5leHQgcG9zaXRpb24KCQkJCSAqIHRoYXQgbWlnaHQgY29udGFp biBtYXRjaGluZyB0dXBsZXMpLiAgSXQgc2VlbXMgaGFyZCB0byBkbwoJCQkJICogYmV0dGVy IGhlcmUuICBVc2Ugb2YgdGhlIHNraXAgc3VwcG9ydCBpbmZyYXN0cnVjdHVyZSBvZnRlbgoJ CQkJICogYXZvaWRzIG1vc3QgbmV4dC9wcmlvciBrZXkgcHJvYmVzLiAgQnV0IGV2ZW4gd2hl biBpdCBjYW4ndCwKCQkJCSAqIHRoZXJlJ3MgYSBkZWNlbnQgY2hhbmNlIHRoYXQgbW9zdCBp bmRpdmlkdWFsIG5leHQvcHJpb3Iga2V5CgkJCQkgKiBwcm9iZXMgd2lsbCBsb2NhdGUgYSBs ZWFmIHBhZ2Ugd2hvc2Uga2V5IHNwYWNlIG92ZXJsYXBzIGFsbAoJCQkJICogb2YgdGhlIHNj YW4ncyBrZXlzIChldmVuIHRoZSBsb3dlci1vcmRlciBrZXlzKSAtLSB3aGljaAoJCQkJICog YWxzbyBhdm9pZHMgdGhlIG5lZWQgZm9yIGEgc2VwYXJhdGUsIGV4dHJhIGluZGV4IGRlc2Nl bnQuCgkJCQkgKiBOb3RlIGFsc28gdGhhdCB0aGVzZSBwcm9iZXMgYXJlIG11Y2ggY2hlYXBl ciB0aGFuIG5vbi1wcm9iZQoJCQkJICogcHJpbWl0aXZlIGluZGV4IHNjYW5zOiB0aGV5J3Jl IHJlbGlhYmx5IHZlcnkgc2VsZWN0aXZlLgoJCQkJICovCgkJCQlpZiAoaW5kZXhTa2lwUXVh bHMgPT0gTklMKQoJCQkJCW5kaXN0aW5jdCArPSAxOwoKCQkJCS8qCgkJCQkgKiBVcGRhdGUg bnVtX3NhX3NjYW5zIGVzdGltYXRlIGJ5IG11bHRpcGx5aW5nIGJ5IG5kaXN0aW5jdC4KCQkJ CSAqCgkJCQkgKiBXZSBtYWtlIHRoZSBwZXNzaW1pc3RpYyBhc3N1bXB0aW9uIHRoYXQgdGhl cmUgaXMgbm8KCQkJCSAqIG5hdHVyYWxseSBvY2N1cnJpbmcgY3Jvc3MtY29sdW1uIGNvcnJl bGF0aW9uLiAgVGhpcyBpcwoJCQkJICogb2Z0ZW4gd3JvbmcsIGJ1dCBpdCBzZWVtcyBiZXN0 IHRvIGVyciBvbiB0aGUgc2lkZSBvZiBub3QKCQkJCSAqIGV4cGVjdGluZyBza2lwcGluZyB0 byBiZSBoZWxwZnVsLi4uCgkJCQkgKi8KCQkJCW51bV9zYV9zY2FucyAqPSBuZGlzdGluY3Q7 CgoJCQkJLyoKCQkJCSAqIC4uLmJ1dCBiYWNrIG91dCBvZiBhZGRpbmcgdGhpcyBsYXRlc3Qg Z3JvdXAgb2YgMSBvciBtb3JlCgkJCQkgKiBza2lwIGFycmF5cyB3aGVuIG51bV9zYV9zY2Fu cyBleGNlZWRzIHRoZSB0b3RhbCBudW1iZXIgb2YKCQkJCSAqIGluZGV4IHBhZ2VzIChyZXZl cnQgdG8gbnVtX3NhX3NjYW5zIGZyb20gYmVmb3JlIGluZGV4Y29sKS4KCQkJCSAqIFRoaXMg Y2F1c2VzIGEgc2hhcnAgZGlzY29udGludWl0eSBpbiBjb3N0IChhcyBhIGZ1bmN0aW9uIG9m CgkJCQkgKiB0aGUgaW5kZXhjb2wncyBuZGlzdGluY3QpLCBidXQgdGhhdCBpcyByZXByZXNl bnRhdGl2ZSBvZgoJCQkJICogYWN0dWFsIHJ1bnRpbWUgY29zdHMuCgkJCQkgKgoJCQkJICog Tm90ZSB0aGF0IHNraXBwaW5nIGlzIGhlbHBmdWwgd2hlbiBlYWNoIHByaW1pdGl2ZSBpbmRl eAoJCQkJICogc2NhbiBvbmx5IG1hbmFnZXMgdG8gc2tpcCBvdmVyIDEgb3IgMiBpcnJlbGV2 YW50IGxlYWYgcGFnZXMKCQkJCSAqIG9uIGF2ZXJhZ2UuICBTa2lwIGFycmF5cyBicmluZyBz YXZpbmdzIGluIENQVSBjb3N0cyBkdWUgdG8KCQkJCSAqIHRoZSBzY2FuIG5vdCBuZWVkaW5n IHRvIGV2YWx1YXRlIGluZGV4cXVhbHMgYWdhaW5zdCBldmVyeQoJCQkJICogdHVwbGUsIHdo aWNoIGNhbiBncmVhdGx5IGV4Y2VlZCBhbnkgc2F2aW5ncyBpbiBJL08gY29zdHMuCgkJCQkg KiBUaGlzIHRlc3QgaXMgYSB0ZXN0IG9mIHdoZXRoZXIgbnVtX3NhX3NjYW5zIGltcGxpZXMg dGhhdAoJCQkJICogd2UncmUgcGFzdCB0aGUgcG9pbnQgd2hlcmUgdGhlIGFiaWxpdHkgdG8g c2tpcCBjZWFzZXMgdG8KCQkJCSAqIGxvd2VyIHRoZSBzY2FuJ3MgY29zdHMgKGV2ZW4gcXVh bCBldmFsdWF0aW9uIENQVSBjb3N0cykuCgkJCQkgKi8KCQkJCWlmIChpbmRleC0+cGFnZXMg PCBudW1fc2Ffc2NhbnMpCgkJCQl7CgkJCQkJbnVtX3NhX3NjYW5zID0gbnVtX3NhX3NjYW5z X3ByZXZfY29sczsKCQkJCQlicmVhazsJCS8qIGRvbmUgYnVpbGRpbmcgaW5kZXhCb3VuZFF1 YWxzICovCgkJCQl9CgoJCQkJaW5kZXhjb2wrKzsKCQkJCWluZGV4U2tpcFF1YWxzID0gTklM OwoJCQl9CgoJCQkvKgoJCQkgKiBGaW5pc2hlZCBjb25zaWRlcmluZyB0aGUgbmVlZCB0byBh ZGQgc2tpcCBhcnJheXMgdG8gYnJpZGdlIGFuCgkJCSAqIGluaXRpYWwgZXFRdWFsSGVyZSBn YXAgYmV0d2VlbiB0aGUgb2xkIGFuZCBuZXcgaW5kZXggY29sdW1ucwoJCQkgKiAob3IgdGhl cmUgd2FzIG5vIGluaXRpYWwgZXFRdWFsSGVyZSBnYXAgaW4gdGhlIGZpcnN0IHBsYWNlKS4K CQkJICoKCQkJICogSWYgYW4gaW5pdGlhbCBnYXAgY291bGQgbm90IGJlIGJyaWRnZWQsIHRo ZW4gbmV3IGNvbHVtbidzIHF1YWxzCgkJCSAqIChpLmUuIGljbGF1c2UtPmluZGV4Y29sJ3Mg cXVhbHMpIHdvbid0IGdvIGludG8gaW5kZXhCb3VuZFF1YWxzLAoJCQkgKiBhbmQgc28gd29u J3QgYWZmZWN0IG91ciBmaW5hbCBudW1JbmRleFR1cGxlcyBlc3RpbWF0ZS4KCQkJICovCgkJ CWlmIChpbmRleGNvbCAhPSBpY2xhdXNlLT5pbmRleGNvbCkKCQkJCWJyZWFrOwkJCS8qIGRv bmUgYnVpbGRpbmcgaW5kZXhCb3VuZFF1YWxzICovCgkJfQoKCQlBc3NlcnQoaW5kZXhjb2wg PT0gaWNsYXVzZS0+aW5kZXhjb2wpOwoKCQkvKiBFeGFtaW5lIGVhY2ggaW5kZXhxdWFsIGFz c29jaWF0ZWQgd2l0aCB0aGlzIGluZGV4IGNsYXVzZSAqLwoJCWZvcmVhY2gobGMyLCBpY2xh dXNlLT5pbmRleHF1YWxzKQoJCXsKCQkJUmVzdHJpY3RJbmZvICpyaW5mbyA9IGxmaXJzdF9u b2RlKFJlc3RyaWN0SW5mbywgbGMyKTsKCQkJRXhwcgkgICAqY2xhdXNlID0gcmluZm8tPmNs YXVzZTsKCQkJT2lkCQkJY2xhdXNlX29wID0gSW52YWxpZE9pZDsKCQkJaW50CQkJb3Bfc3Ry YXRlZ3k7CgoJCQlpZiAoSXNBKGNsYXVzZSwgT3BFeHByKSkKCQkJewoJCQkJT3BFeHByCSAg ICpvcCA9IChPcEV4cHIgKikgY2xhdXNlOwoKCQkJCWNsYXVzZV9vcCA9IG9wLT5vcG5vOwoJ CQl9CgkJCWVsc2UgaWYgKElzQShjbGF1c2UsIFJvd0NvbXBhcmVFeHByKSkKCQkJewoJCQkJ Um93Q29tcGFyZUV4cHIgKnJjID0gKFJvd0NvbXBhcmVFeHByICopIGNsYXVzZTsKCgkJCQlj bGF1c2Vfb3AgPSBsaW5pdGlhbF9vaWQocmMtPm9wbm9zKTsKCQkJCWZvdW5kX3Jvd19jb21w YXJlID0gdHJ1ZTsKCQkJfQoJCQllbHNlIGlmIChJc0EoY2xhdXNlLCBTY2FsYXJBcnJheU9w RXhwcikpCgkJCXsKCQkJCVNjYWxhckFycmF5T3BFeHByICpzYW9wID0gKFNjYWxhckFycmF5 T3BFeHByICopIGNsYXVzZTsKCQkJCU5vZGUJICAgKm90aGVyX29wZXJhbmQgPSAoTm9kZSAq KSBsc2Vjb25kKHNhb3AtPmFyZ3MpOwoJCQkJZG91YmxlCQlhbGVuZ3RoID0gZXN0aW1hdGVf YXJyYXlfbGVuZ3RoKHJvb3QsIG90aGVyX29wZXJhbmQpOwoKCQkJCWNsYXVzZV9vcCA9IHNh b3AtPm9wbm87CgkJCQlmb3VuZF9hcnJheSA9IHRydWU7CgkJCQkvKiBlc3RpbWF0ZSBTQSBk ZXNjZW50cyBieSBpbmRleEJvdW5kUXVhbHMgb25seSAqLwoJCQkJaWYgKGFsZW5ndGggPiAx KQoJCQkJCW51bV9zYV9zY2FucyAqPSBhbGVuZ3RoOwoJCQl9CgkJCWVsc2UgaWYgKElzQShj bGF1c2UsIE51bGxUZXN0KSkKCQkJewoJCQkJTnVsbFRlc3QgICAqbnQgPSAoTnVsbFRlc3Qg KikgY2xhdXNlOwoKCQkJCWlmIChudC0+bnVsbHRlc3R0eXBlID09IElTX05VTEwpCgkJCQl7 CgkJCQkJZm91bmRfaXNfbnVsbF9vcCA9IHRydWU7CgkJCQkJLyogSVMgTlVMTCBpcyBsaWtl ID0gZm9yIHNlbGVjdGl2aXR5L3NraXAgc2NhbiBwdXJwb3NlcyAqLwoJCQkJCWVxUXVhbEhl cmUgPSB0cnVlOwoJCQkJfQoJCQl9CgkJCWVsc2UKCQkJCWVsb2coRVJST1IsICJ1bnN1cHBv cnRlZCBpbmRleHF1YWwgdHlwZTogJWQiLAoJCQkJCSAoaW50KSBub2RlVGFnKGNsYXVzZSkp OwoKCQkJLyogY2hlY2sgZm9yIGVxdWFsaXR5IG9wZXJhdG9yICovCgkJCWlmIChPaWRJc1Zh bGlkKGNsYXVzZV9vcCkpCgkJCXsKCQkJCW9wX3N0cmF0ZWd5ID0gZ2V0X29wX29wZmFtaWx5 X3N0cmF0ZWd5KGNsYXVzZV9vcCwKCQkJCQkJCQkJCQkJCSAgIGluZGV4LT5vcGZhbWlseVtp bmRleGNvbF0pOwoJCQkJQXNzZXJ0KG9wX3N0cmF0ZWd5ICE9IDApOwkvKiBub3QgYSBtZW1i ZXIgb2Ygb3BmYW1pbHk/PyAqLwoJCQkJaWYgKG9wX3N0cmF0ZWd5ID09IEJURXF1YWxTdHJh dGVneU51bWJlcikKCQkJCQllcVF1YWxIZXJlID0gdHJ1ZTsKCQkJfQoKCQkJaW5kZXhCb3Vu ZFF1YWxzID0gbGFwcGVuZChpbmRleEJvdW5kUXVhbHMsIHJpbmZvKTsKCgkJCS8qCgkJCSAq IFdlIGFwcGx5IGluZXF1YWxpdHkgc2VsZWN0aXZpdGllcyB0byBlc3RpbWF0ZSBpbmRleCBk ZXNjZW50CgkJCSAqIGNvc3RzIHdpdGggc2NhbnMgdGhhdCB1c2Ugc2tpcCBhcnJheXMuICBT YXZlIHRoaXMgaW5kZXhjb2wncwoJCQkgKiBSZXN0cmljdEluZm9zIGlmIGl0IGxvb2tzIGxp a2UgdGhleSdsbCBiZSBuZWVkZWQgZm9yIHRoYXQuCgkJCSAqLwoJCQlpZiAoIWVxUXVhbEhl cmUgJiYgIWZvdW5kX3Jvd19jb21wYXJlICYmCgkJCQlpbmRleGNvbCA8IGluZGV4LT5ua2V5 Y29sdW1ucyAtIDEpCgkJCQlpbmRleFNraXBRdWFscyA9IGxhcHBlbmQoaW5kZXhTa2lwUXVh bHMsIHJpbmZvKTsKCQl9Cgl9CgoJLyoKCSAqIElmIGluZGV4IGlzIHVuaXF1ZSBhbmQgd2Ug Zm91bmQgYW4gJz0nIGNsYXVzZSBmb3IgZWFjaCBjb2x1bW4sIHdlIGNhbgoJICoganVzdCBh c3N1bWUgbnVtSW5kZXhUdXBsZXMgPSAxIGFuZCBza2lwIHRoZSBleHBlbnNpdmUKCSAqIGNs YXVzZWxpc3Rfc2VsZWN0aXZpdHkgY2FsY3VsYXRpb25zLiAgSG93ZXZlciwgYW4gYXJyYXkg b3IgTnVsbFRlc3QKCSAqIGFsd2F5cyBpbnZhbGlkYXRlcyB0aGF0IHRoZW9yeSAoZXZlbiB3 aGVuIGVxUXVhbEhlcmUgaGFzIGJlZW4gc2V0KS4KCSAqLwoJaWYgKGluZGV4LT51bmlxdWUg JiYKCQlpbmRleGNvbCA9PSBpbmRleC0+bmtleWNvbHVtbnMgLSAxICYmCgkJZXFRdWFsSGVy ZSAmJgoJCSFmb3VuZF9hcnJheSAmJgoJCSFmb3VuZF9pc19udWxsX29wKQoJCW51bUluZGV4 VHVwbGVzID0gMS4wOwoJZWxzZQoJewoJCUxpc3QJICAgKnNlbGVjdGl2aXR5UXVhbHM7CgkJ U2VsZWN0aXZpdHkgYnRyZWVTZWxlY3Rpdml0eTsKCgkJLyoKCQkgKiBJZiB0aGUgaW5kZXgg aXMgcGFydGlhbCwgQU5EIHRoZSBpbmRleCBwcmVkaWNhdGUgd2l0aCB0aGUKCQkgKiBpbmRl eC1ib3VuZCBxdWFscyB0byBwcm9kdWNlIGEgbW9yZSBhY2N1cmF0ZSBpZGVhIG9mIHRoZSBu dW1iZXIgb2YKCQkgKiByb3dzIGNvdmVyZWQgYnkgdGhlIGJvdW5kIGNvbmRpdGlvbnMuCgkJ ICovCgkJc2VsZWN0aXZpdHlRdWFscyA9IGFkZF9wcmVkaWNhdGVfdG9faW5kZXhfcXVhbHMo aW5kZXgsIGluZGV4Qm91bmRRdWFscyk7CgoJCWJ0cmVlU2VsZWN0aXZpdHkgPSBjbGF1c2Vs aXN0X3NlbGVjdGl2aXR5KHJvb3QsIHNlbGVjdGl2aXR5UXVhbHMsCgkJCQkJCQkJCQkJCSAg aW5kZXgtPnJlbC0+cmVsaWQsCgkJCQkJCQkJCQkJCSAgSk9JTl9JTk5FUiwKCQkJCQkJCQkJ CQkJICBOVUxMKTsKCQludW1JbmRleFR1cGxlcyA9IGJ0cmVlU2VsZWN0aXZpdHkgKiBpbmRl eC0+cmVsLT50dXBsZXM7CgoJCS8qCgkJICogYnRyZWUgYXV0b21hdGljYWxseSBjb21iaW5l cyBpbmRpdmlkdWFsIGFycmF5IGVsZW1lbnQgcHJpbWl0aXZlCgkJICogaW5kZXggc2NhbnMg d2hlbmV2ZXIgdGhlIHR1cGxlcyBjb3ZlcmVkIGJ5IHRoZSBuZXh0IHNldCBvZiBhcnJheQoJ CSAqIGtleXMgYXJlIGNsb3NlIHRvIHR1cGxlcyBjb3ZlcmVkIGJ5IHRoZSBjdXJyZW50IHNl dC4gIFRoYXQgcHV0cyBhCgkJICogbmF0dXJhbCBjZWlsaW5nIG9uIHRoZSB3b3JzdCBjYXNl IG51bWJlciBvZiBkZXNjZW50cyAtLSB0aGVyZQoJCSAqIGNhbm5vdCBwb3NzaWJseSBiZSBt b3JlIHRoYW4gb25lIGRlc2NlbnQgcGVyIGxlYWYgcGFnZSBzY2FubmVkLgoJCSAqCgkJICog Q2xhbXAgdGhlIG51bWJlciBvZiBkZXNjZW50cyB0byBhdCBtb3N0IDEvMyB0aGUgbnVtYmVy IG9mIGluZGV4CgkJICogcGFnZXMuICBUaGlzIGF2b2lkcyBpbXBsYXVzaWJseSBoaWdoIGVz dGltYXRlcyB3aXRoIGxvdyBzZWxlY3Rpdml0eQoJCSAqIHBhdGhzLCB3aGVyZSBzY2FucyB1 c3VhbGx5IHJlcXVpcmUgb25seSBvbmUgb3IgdHdvIGRlc2NlbnRzLiAgVGhpcwoJCSAqIGlz IG1vc3QgbGlrZWx5IHRvIGhlbHAgd2hlbiB0aGVyZSBhcmUgc2V2ZXJhbCBTQU9QIGNsYXVz ZXMsIHdoZXJlCgkJICogbmFpdmVseSBhY2NlcHRpbmcgdGhlIHRvdGFsIG51bWJlciBvZiBk aXN0aW5jdCBjb21iaW5hdGlvbnMgb2YKCQkgKiBhcnJheSBlbGVtZW50cyBhcyB0aGUgbnVt YmVyIG9mIGRlc2NlbnRzIHdvdWxkIGZyZXF1ZW50bHkgbGVhZCB0bwoJCSAqIHdpbGQgb3Zl cmVzdGltYXRlcy4KCQkgKgoJCSAqIFdlIHNvbWV3aGF0IGFyYml0cmFyaWx5IGRvbid0IGp1 c3QgbWFrZSB0aGUgY3V0b2ZmIHRoZSB0b3RhbCBudW1iZXIKCQkgKiBvZiBsZWFmIHBhZ2Vz ICh3ZSBtYWtlIGl0IDEvMyB0aGUgdG90YWwgbnVtYmVyIG9mIHBhZ2VzIGluc3RlYWQpIHRv CgkJICogZ2l2ZSB0aGUgYnRyZWUgY29kZSBjcmVkaXQgZm9yIGl0cyBhYmlsaXR5IHRvIGNv bnRpbnVlIG9uIHRoZSBsZWFmCgkJICogbGV2ZWwgd2l0aCBsb3cgc2VsZWN0aXZpdHkgc2Nh bnMuCgkJICoKCQkgKiBOb3RlOiBudW1fc2Ffc2NhbnMgaW5jbHVkZXMgYm90aCBTY2FsYXJB cnJheU9wIGFycmF5IGVsZW1lbnRzIGFuZAoJCSAqIHNraXAgYXJyYXkgZWxlbWVudHMgd2hv c2UgcXVhbCBhZmZlY3RzIG91ciBudW1JbmRleFR1cGxlcyBlc3RpbWF0ZS4KCQkgKi8KCQlu dW1fc2Ffc2NhbnMgPSBNaW4obnVtX3NhX3NjYW5zLCBjZWlsKGluZGV4LT5wYWdlcyAqIDAu MzMzMzMzMykpOwoJCW51bV9zYV9zY2FucyA9IE1heChudW1fc2Ffc2NhbnMsIDEpOwoKCQkv KgoJCSAqIEFzIGluIGdlbmVyaWNjb3N0ZXN0aW1hdGUoKSwgd2UgaGF2ZSB0byBhZGp1c3Qg Zm9yIGFueSBhcnJheSBxdWFscwoJCSAqIGluY2x1ZGVkIGluIGluZGV4Qm91bmRRdWFscywg YW5kIHRoZW4gcm91bmQgdG8gaW50ZWdlci4KCQkgKgoJCSAqIEl0IGlzIHRlbXB0aW5nIHRv IG1ha2UgZ2VuZXJpY2Nvc3Rlc3RpbWF0ZSBiZWhhdmUgYXMgaWYgYXJyYXkKCQkgKiBjbGF1 c2VzIHdvcmsgaW4gYWxtb3N0IHRoZSBzYW1lIHdheSBhcyBzY2FsYXIgb3BlcmF0b3JzIGR1 cmluZwoJCSAqIGJ0cmVlIHNjYW5zLCBtYWtpbmcgdGhlIHRvcC1sZXZlbCBzY2FuIGxvb2sg bGlrZSBhIGNvbnRpbnVvdXMgc2NhbgoJCSAqIChhcyBvcHBvc2VkIHRvIG51bV9zYV9zY2Fu cy1tYW55IHByaW1pdGl2ZSBpbmRleCBzY2FucykuICBBZnRlcgoJCSAqIGFsbCwgYnRyZWUg c2NhbnMgbW9zdGx5IHdvcmsgbGlrZSB0aGF0IGF0IHJ1bnRpbWUuICBIb3dldmVyLCBzdWNo IGEKCQkgKiBzY2hlbWUgd291bGQgYmFkbHkgYmlhcyBnZW5lcmljY29zdGVzdGltYXRlJ3Mg c2ltcGxpc3RpYyBhcHByb2FjaAoJCSAqIHRvIGNhbGN1bGF0aW5nIG51bUluZGV4UGFnZXMg dGhyb3VnaCBwcm9yYXRpbmcuCgkJICoKCQkgKiBTdGljayB3aXRoIHRoZSBhcHByb2FjaCB0 YWtlbiBieSBub24tbmF0aXZlIFNBT1Agc2NhbnMgZm9yIG5vdy4KCQkgKiBnZW5lcmljY29z dGVzdGltYXRlIHdpbGwgdXNlIHRoZSBNYWNrZXJ0LUxvaG1hbiBmb3JtdWxhIHRvCgkJICog Y29tcGVuc2F0ZSBmb3IgcmVwZWF0IHBhZ2UgZmV0Y2hlcywgZXZlbiB0aG91Z2ggdGhhdCBk ZWZpbml0ZWx5CgkJICogd29uJ3QgaGFwcGVuIGR1cmluZyBidHJlZSBzY2FucyAobm90IGZv ciBsZWFmIHBhZ2VzLCBhdCBsZWFzdCkuCgkJICogV2UncmUgdXN1YWxseSB2ZXJ5IHBlc3Np bWlzdGljIGFib3V0IHRoZSBudW1iZXIgb2YgcHJpbWl0aXZlIGluZGV4CgkJICogc2NhbnMg dGhhdCB3aWxsIGJlIHJlcXVpcmVkLCBidXQgaXQncyBub3QgY2xlYXIgaG93IHRvIGRvIGJl dHRlci4KCQkgKi8KCQludW1JbmRleFR1cGxlcyA9IHJpbnQobnVtSW5kZXhUdXBsZXMgLyBu dW1fc2Ffc2NhbnMpOwoJfQoKCS8qCgkgKiBOb3cgZG8gZ2VuZXJpYyBpbmRleCBjb3N0IGVz dGltYXRpb24uCgkgKgoJICogV2hpbGUgd2UgZXhwZW5kZWQgZWZmb3J0IHRvIG1ha2UgcmVh bGlzdGljIGVzdGltYXRlcyBvZiBudW1JbmRleFR1cGxlcwoJICogYW5kIG51bV9zYV9zY2Fu cywgd2UgYXJlIGNvbnRlbnQgdG8gY291bnQgb25seSB0aGUgYnRyZWUgbWV0YXBhZ2UgYXMK CSAqIG5vbi1sZWFmLiAgYnRyZWUgZmFub3V0IGlzIHR5cGljYWxseSBoaWdoIGVub3VnaCB0 aGF0IHVwcGVyIHBhZ2VzIGFyZQoJICogZmV3IHJlbGF0aXZlIHRvIGxlYWYgcGFnZXMsIHNv IGFjY291bnRpbmcgZm9yIHRoZW0gd291bGQgbW92ZSB0aGUKCSAqIGVzdGltYXRlcyBhdCBt b3N0IGEgcGVyY2VudCBvciB0d28uICBHaXZlbiB0aGUgdW5jZXJ0YWludHkgaW4ganVzdCBo b3cKCSAqIG1hbnkgdXBwZXIgcGFnZXMgZXhpc3QgaW4gYSBwYXJ0aWN1bGFyIGluZGV4LCB3 ZSdsbCBza2lwIHRyeWluZyB0bwoJICogaGFuZGxlIHRoYXQuCgkgKi8KCWNvc3RzLm51bUlu ZGV4VHVwbGVzID0gbnVtSW5kZXhUdXBsZXM7Cgljb3N0cy5udW1fc2Ffc2NhbnMgPSBudW1f c2Ffc2NhbnM7Cgljb3N0cy5udW1Ob25MZWFmUGFnZXMgPSAxOwoKCWdlbmVyaWNjb3N0ZXN0 aW1hdGUocm9vdCwgcGF0aCwgbG9vcF9jb3VudCwgJmNvc3RzKTsKCgkvKgoJICogQWRkIGEg Q1BVLWNvc3QgY29tcG9uZW50IHRvIHJlcHJlc2VudCB0aGUgY29zdHMgb2YgaW5pdGlhbCBi dHJlZQoJICogZGVzY2VudC4gIFdlIGRvbid0IGNoYXJnZSBhbnkgSS9PIGNvc3QgZm9yIHRv dWNoaW5nIHVwcGVyIGJ0cmVlIGxldmVscywKCSAqIHNpbmNlIHRoZXkgdGVuZCB0byBzdGF5 IGluIGNhY2hlLCBidXQgd2Ugc3RpbGwgaGF2ZSB0byBkbyBhYm91dCBsb2cyKE4pCgkgKiBj b21wYXJpc29ucyB0byBkZXNjZW5kIGEgYnRyZWUgb2YgTiBsZWFmIHR1cGxlcy4gIFdlIGNo YXJnZSBvbmUKCSAqIGNwdV9vcGVyYXRvcl9jb3N0IHBlciBjb21wYXJpc29uLgoJICoKCSAq IElmIHRoZXJlIGFyZSBTQU9QIG9yIHNraXAgYXJyYXkga2V5cywgY2hhcmdlIHRoaXMgb25j ZSBwZXIgZXN0aW1hdGVkCgkgKiBpbmRleCBkZXNjZW50LiAgVGhlIG9uZXMgYWZ0ZXIgdGhl IGZpcnN0IG9uZSBhcmUgbm90IHN0YXJ0dXAgY29zdCBzbwoJICogZmFyIGFzIHRoZSBvdmVy YWxsIHBsYW4gZ29lcywgc28ganVzdCBhZGQgdGhlbSB0byAidG90YWwiIGNvc3QuCgkgKi8K CWlmIChpbmRleC0+dHVwbGVzID4gMSkJCS8qIGF2b2lkIGNvbXB1dGluZyBsb2coMCkgKi8K CXsKCQlkZXNjZW50Q29zdCA9IGNlaWwobG9nKGluZGV4LT50dXBsZXMpIC8gbG9nKDIuMCkp ICogY3B1X29wZXJhdG9yX2Nvc3Q7CgkJY29zdHMuaW5kZXhTdGFydHVwQ29zdCArPSBkZXNj ZW50Q29zdDsKCQljb3N0cy5pbmRleFRvdGFsQ29zdCArPSBjb3N0cy5udW1fc2Ffc2NhbnMg KiBkZXNjZW50Q29zdDsKCX0KCgkvKgoJICogRXZlbiB0aG91Z2ggd2UncmUgbm90IGNoYXJn aW5nIEkvTyBjb3N0IGZvciB0b3VjaGluZyB1cHBlciBidHJlZSBwYWdlcywKCSAqIGl0J3Mg c3RpbGwgcmVhc29uYWJsZSB0byBjaGFyZ2Ugc29tZSBDUFUgY29zdCBwZXIgcGFnZSBkZXNj ZW5kZWQKCSAqIHRocm91Z2guICBNb3Jlb3ZlciwgaWYgd2UgaGFkIG5vIHN1Y2ggY2hhcmdl IGF0IGFsbCwgYmxvYXRlZCBpbmRleGVzCgkgKiB3b3VsZCBhcHBlYXIgdG8gaGF2ZSB0aGUg c2FtZSBzZWFyY2ggY29zdCBhcyB1bmJsb2F0ZWQgb25lcywgYXQgbGVhc3QKCSAqIGluIGNh c2VzIHdoZXJlIG9ubHkgYSBzaW5nbGUgbGVhZiBwYWdlIGlzIGV4cGVjdGVkIHRvIGJlIHZp c2l0ZWQuICBUaGlzCgkgKiBjb3N0IGlzIHNvbWV3aGF0IGFyYml0cmFyaWx5IHNldCBhdCA1 MHggY3B1X29wZXJhdG9yX2Nvc3QgcGVyIHBhZ2UKCSAqIHRvdWNoZWQuICBUaGUgbnVtYmVy IG9mIHN1Y2ggcGFnZXMgaXMgYnRyZWUgdHJlZSBoZWlnaHQgcGx1cyBvbmUgKGllLAoJICog d2UgY2hhcmdlIGZvciB0aGUgbGVhZiBwYWdlIHRvbykuICBBcyBhYm92ZSwgY2hhcmdlIG9u Y2UgcGVyIGVzdGltYXRlZAoJICogU0FPUC9za2lwIGFycmF5IGRlc2NlbnQuCgkgKi8KCWRl c2NlbnRDb3N0ID0gKGluZGV4LT50cmVlX2hlaWdodCArIDEpICogREVGQVVMVF9QQUdFX0NQ VV9NVUxUSVBMSUVSICogY3B1X29wZXJhdG9yX2Nvc3Q7Cgljb3N0cy5pbmRleFN0YXJ0dXBD b3N0ICs9IGRlc2NlbnRDb3N0OwoJY29zdHMuaW5kZXhUb3RhbENvc3QgKz0gY29zdHMubnVt X3NhX3NjYW5zICogZGVzY2VudENvc3Q7CgoJaWYgKCFoYXZlX2NvcnJlbGF0aW9uKQoJewoJ CWV4YW1pbmVfaW5kZXhjb2xfdmFyaWFibGUocm9vdCwgaW5kZXgsIDAsICZ2YXJkYXRhKTsK CQlpZiAoSGVhcFR1cGxlSXNWYWxpZCh2YXJkYXRhLnN0YXRzVHVwbGUpKQoJCQljb3N0cy5p bmRleENvcnJlbGF0aW9uID0gYnRjb3N0X2NvcnJlbGF0aW9uKGluZGV4LCAmdmFyZGF0YSk7 CgkJUmVsZWFzZVZhcmlhYmxlU3RhdHModmFyZGF0YSk7Cgl9CgllbHNlCgl7CgkJLyogYnRj b3N0X2NvcnJlbGF0aW9uIGFscmVhZHkgY2FsbGVkIGVhcmxpZXIgb24gKi8KCQljb3N0cy5p bmRleENvcnJlbGF0aW9uID0gY29ycmVsYXRpb247Cgl9CgoJKmluZGV4U3RhcnR1cENvc3Qg PSBjb3N0cy5pbmRleFN0YXJ0dXBDb3N0OwoJKmluZGV4VG90YWxDb3N0ID0gY29zdHMuaW5k ZXhUb3RhbENvc3Q7CgkqaW5kZXhTZWxlY3Rpdml0eSA9IGNvc3RzLmluZGV4U2VsZWN0aXZp dHk7CgkqaW5kZXhDb3JyZWxhdGlvbiA9IGNvc3RzLmluZGV4Q29ycmVsYXRpb247CgkqaW5k ZXhQYWdlcyA9IGNvc3RzLm51bUluZGV4UGFnZXM7Cn0KCnZvaWQKaGFzaGNvc3Rlc3RpbWF0 ZShQbGFubmVySW5mbyAqcm9vdCwgSW5kZXhQYXRoICpwYXRoLCBkb3VibGUgbG9vcF9jb3Vu dCwKCQkJCSBDb3N0ICppbmRleFN0YXJ0dXBDb3N0LCBDb3N0ICppbmRleFRvdGFsQ29zdCwK CQkJCSBTZWxlY3Rpdml0eSAqaW5kZXhTZWxlY3Rpdml0eSwgZG91YmxlICppbmRleENvcnJl bGF0aW9uLAoJCQkJIGRvdWJsZSAqaW5kZXhQYWdlcykKewoJR2VuZXJpY0Nvc3RzIGNvc3Rz ID0gezB9OwoKCS8qIEFzIGluIGJ0Y29zdGVzdGltYXRlLCBjb3VudCBvbmx5IHRoZSBtZXRh cGFnZSBhcyBub24tbGVhZiAqLwoJY29zdHMubnVtTm9uTGVhZlBhZ2VzID0gMTsKCglnZW5l cmljY29zdGVzdGltYXRlKHJvb3QsIHBhdGgsIGxvb3BfY291bnQsICZjb3N0cyk7CgoJLyoK CSAqIEEgaGFzaCBpbmRleCBoYXMgbm8gZGVzY2VudCBjb3N0cyBhcyBzdWNoLCBzaW5jZSB0 aGUgaW5kZXggQU0gY2FuIGdvCgkgKiBkaXJlY3RseSB0byB0aGUgdGFyZ2V0IGJ1Y2tldCBh ZnRlciBjb21wdXRpbmcgdGhlIGhhc2ggdmFsdWUuICBUaGVyZQoJICogYXJlIGEgY291cGxl IG9mIG90aGVyIGhhc2gtc3BlY2lmaWMgY29zdHMgdGhhdCB3ZSBjb3VsZCBjb25jZWl2YWJs eSBhZGQKCSAqIGhlcmUsIHRob3VnaDoKCSAqCgkgKiBJZGVhbGx5IHdlJ2QgY2hhcmdlIHNw Y19yYW5kb21fcGFnZV9jb3N0IGZvciBlYWNoIHBhZ2UgaW4gdGhlIHRhcmdldAoJICogYnVj a2V0LCBub3QganVzdCB0aGUgbnVtSW5kZXhQYWdlcyBwYWdlcyB0aGF0IGdlbmVyaWNjb3N0 ZXN0aW1hdGUKCSAqIHRob3VnaHQgd2UnZCB2aXNpdC4gIEhvd2V2ZXIgaW4gbW9zdCBjYXNl cyB3ZSBkb24ndCBrbm93IHdoaWNoIGJ1Y2tldAoJICogdGhhdCB3aWxsIGJlLiAgVGhlcmUn cyBubyBwb2ludCBpbiBjb25zaWRlcmluZyB0aGUgYXZlcmFnZSBidWNrZXQgc2l6ZQoJICog YmVjYXVzZSB0aGUgaGFzaCBBTSBtYWtlcyBzdXJlIHRoYXQncyBhbHdheXMgb25lIHBhZ2Uu CgkgKgoJICogTGlrZXdpc2UsIHdlIGNvdWxkIGNvbnNpZGVyIGNoYXJnaW5nIHNvbWUgQ1BV IGZvciBlYWNoIGluZGV4IHR1cGxlIGluCgkgKiB0aGUgYnVja2V0LCBpZiB3ZSBrbmV3IGhv dyBtYW55IHRoZXJlIHdlcmUuICBCdXQgdGhlIHBlci10dXBsZSBjb3N0IGlzCgkgKiBqdXN0 IGEgaGFzaCB2YWx1ZSBjb21wYXJpc29uLCBub3QgYSBnZW5lcmFsIGRhdGF0eXBlLWRlcGVu ZGVudAoJICogY29tcGFyaXNvbiwgc28gYW55IHN1Y2ggY2hhcmdlIG91Z2h0IHRvIGJlIHF1 aXRlIGEgYml0IGxlc3MgdGhhbgoJICogY3B1X29wZXJhdG9yX2Nvc3Q7IHdoaWNoIG1ha2Vz IGl0IHByb2JhYmx5IG5vdCB3b3J0aCB3b3JyeWluZyBhYm91dC4KCSAqCgkgKiBBIGJpZ2dl ciBpc3N1ZSBpcyB0aGF0IGNoYW5jZSBoYXNoLXZhbHVlIGNvbGxpc2lvbnMgd2lsbCByZXN1 bHQgaW4KCSAqIHdhc3RlZCBwcm9iZXMgaW50byB0aGUgaGVhcC4gIFdlIGRvbid0IGN1cnJl bnRseSBhdHRlbXB0IHRvIG1vZGVsIHRoaXMKCSAqIGNvc3Qgb24gdGhlIGdyb3VuZHMgdGhh dCBpdCdzIHJhcmUsIGJ1dCBtYXliZSBpdCdzIG5vdCByYXJlIGVub3VnaC4KCSAqIChBbnkg Zml4IGZvciB0aGlzIG91Z2h0IHRvIGNvbnNpZGVyIHRoZSBnZW5lcmljIGxvc3N5LW9wZXJh dG9yIHByb2JsZW0sCgkgKiB0aG91Z2g7IGl0J3Mgbm90IGVudGlyZWx5IGhhc2gtc3BlY2lm aWMuKQoJICovCgoJKmluZGV4U3RhcnR1cENvc3QgPSBjb3N0cy5pbmRleFN0YXJ0dXBDb3N0 OwoJKmluZGV4VG90YWxDb3N0ID0gY29zdHMuaW5kZXhUb3RhbENvc3Q7CgkqaW5kZXhTZWxl Y3Rpdml0eSA9IGNvc3RzLmluZGV4U2VsZWN0aXZpdHk7CgkqaW5kZXhDb3JyZWxhdGlvbiA9 IGNvc3RzLmluZGV4Q29ycmVsYXRpb247CgkqaW5kZXhQYWdlcyA9IGNvc3RzLm51bUluZGV4 UGFnZXM7Cn0KCnZvaWQKZ2lzdGNvc3Rlc3RpbWF0ZShQbGFubmVySW5mbyAqcm9vdCwgSW5k ZXhQYXRoICpwYXRoLCBkb3VibGUgbG9vcF9jb3VudCwKCQkJCSBDb3N0ICppbmRleFN0YXJ0 dXBDb3N0LCBDb3N0ICppbmRleFRvdGFsQ29zdCwKCQkJCSBTZWxlY3Rpdml0eSAqaW5kZXhT ZWxlY3Rpdml0eSwgZG91YmxlICppbmRleENvcnJlbGF0aW9uLAoJCQkJIGRvdWJsZSAqaW5k ZXhQYWdlcykKewoJSW5kZXhPcHRJbmZvICppbmRleCA9IHBhdGgtPmluZGV4aW5mbzsKCUdl bmVyaWNDb3N0cyBjb3N0cyA9IHswfTsKCUNvc3QJCWRlc2NlbnRDb3N0OwoKCS8qIEdpU1Qg aGFzIG5vIG1ldGFwYWdlLCBzbyB3ZSB0cmVhdCBhbGwgcGFnZXMgYXMgbGVhZiBwYWdlcyAq LwoKCWdlbmVyaWNjb3N0ZXN0aW1hdGUocm9vdCwgcGF0aCwgbG9vcF9jb3VudCwgJmNvc3Rz KTsKCgkvKgoJICogV2UgbW9kZWwgaW5kZXggZGVzY2VudCBjb3N0cyBzaW1pbGFybHkgdG8g dGhvc2UgZm9yIGJ0cmVlLCBidXQgdG8gZG8KCSAqIHRoYXQgd2UgZmlyc3QgbmVlZCBhbiBp ZGVhIG9mIHRoZSB0cmVlIGhlaWdodC4gIFdlIHNvbWV3aGF0IGFyYml0cmFyaWx5CgkgKiBh c3N1bWUgdGhhdCB0aGUgZmFub3V0IGlzIDEwMCwgbWVhbmluZyB0aGUgdHJlZSBoZWlnaHQg aXMgYXQgbW9zdAoJICogbG9nMTAwKGluZGV4LT5wYWdlcykuCgkgKgoJICogQWx0aG91Z2gg dGhpcyBjb21wdXRhdGlvbiBpc24ndCByZWFsbHkgZXhwZW5zaXZlIGVub3VnaCB0byByZXF1 aXJlCgkgKiBjYWNoaW5nLCB3ZSBtaWdodCBhcyB3ZWxsIHVzZSBpbmRleC0+dHJlZV9oZWln aHQgdG8gY2FjaGUgaXQuCgkgKi8KCWlmIChpbmRleC0+dHJlZV9oZWlnaHQgPCAwKSAvKiB1 bmtub3duPyAqLwoJewoJCWlmIChpbmRleC0+cGFnZXMgPiAxKQkvKiBhdm9pZCBjb21wdXRp bmcgbG9nKDApICovCgkJCWluZGV4LT50cmVlX2hlaWdodCA9IChpbnQpIChsb2coaW5kZXgt PnBhZ2VzKSAvIGxvZygxMDAuMCkpOwoJCWVsc2UKCQkJaW5kZXgtPnRyZWVfaGVpZ2h0ID0g MDsKCX0KCgkvKgoJICogQWRkIGEgQ1BVLWNvc3QgY29tcG9uZW50IHRvIHJlcHJlc2VudCB0 aGUgY29zdHMgb2YgaW5pdGlhbCBkZXNjZW50LiBXZQoJICoganVzdCB1c2UgbG9nKE4pIGhl cmUgbm90IGxvZzIoTikgc2luY2UgdGhlIGJyYW5jaGluZyBmYWN0b3IgaXNuJ3QKCSAqIG5l Y2Vzc2FyaWx5IHR3byBhbnl3YXkuICBBcyBmb3IgYnRyZWUsIGNoYXJnZSBvbmNlIHBlciBT QSBzY2FuLgoJICovCglpZiAoaW5kZXgtPnR1cGxlcyA+IDEpCQkvKiBhdm9pZCBjb21wdXRp bmcgbG9nKDApICovCgl7CgkJZGVzY2VudENvc3QgPSBjZWlsKGxvZyhpbmRleC0+dHVwbGVz KSkgKiBjcHVfb3BlcmF0b3JfY29zdDsKCQljb3N0cy5pbmRleFN0YXJ0dXBDb3N0ICs9IGRl c2NlbnRDb3N0OwoJCWNvc3RzLmluZGV4VG90YWxDb3N0ICs9IGNvc3RzLm51bV9zYV9zY2Fu cyAqIGRlc2NlbnRDb3N0OwoJfQoKCS8qCgkgKiBMaWtld2lzZSBhZGQgYSBwZXItcGFnZSBj aGFyZ2UsIGNhbGN1bGF0ZWQgdGhlIHNhbWUgYXMgZm9yIGJ0cmVlcy4KCSAqLwoJZGVzY2Vu dENvc3QgPSAoaW5kZXgtPnRyZWVfaGVpZ2h0ICsgMSkgKiBERUZBVUxUX1BBR0VfQ1BVX01V TFRJUExJRVIgKiBjcHVfb3BlcmF0b3JfY29zdDsKCWNvc3RzLmluZGV4U3RhcnR1cENvc3Qg Kz0gZGVzY2VudENvc3Q7Cgljb3N0cy5pbmRleFRvdGFsQ29zdCArPSBjb3N0cy5udW1fc2Ff c2NhbnMgKiBkZXNjZW50Q29zdDsKCgkqaW5kZXhTdGFydHVwQ29zdCA9IGNvc3RzLmluZGV4 U3RhcnR1cENvc3Q7CgkqaW5kZXhUb3RhbENvc3QgPSBjb3N0cy5pbmRleFRvdGFsQ29zdDsK CSppbmRleFNlbGVjdGl2aXR5ID0gY29zdHMuaW5kZXhTZWxlY3Rpdml0eTsKCSppbmRleENv cnJlbGF0aW9uID0gY29zdHMuaW5kZXhDb3JyZWxhdGlvbjsKCSppbmRleFBhZ2VzID0gY29z dHMubnVtSW5kZXhQYWdlczsKfQoKdm9pZApzcGdjb3N0ZXN0aW1hdGUoUGxhbm5lckluZm8g KnJvb3QsIEluZGV4UGF0aCAqcGF0aCwgZG91YmxlIGxvb3BfY291bnQsCgkJCQlDb3N0ICpp bmRleFN0YXJ0dXBDb3N0LCBDb3N0ICppbmRleFRvdGFsQ29zdCwKCQkJCVNlbGVjdGl2aXR5 ICppbmRleFNlbGVjdGl2aXR5LCBkb3VibGUgKmluZGV4Q29ycmVsYXRpb24sCgkJCQlkb3Vi bGUgKmluZGV4UGFnZXMpCnsKCUluZGV4T3B0SW5mbyAqaW5kZXggPSBwYXRoLT5pbmRleGlu Zm87CglHZW5lcmljQ29zdHMgY29zdHMgPSB7MH07CglDb3N0CQlkZXNjZW50Q29zdDsKCgkv KiBBcyBpbiBidGNvc3Rlc3RpbWF0ZSwgY291bnQgb25seSB0aGUgbWV0YXBhZ2UgYXMgbm9u LWxlYWYgKi8KCWNvc3RzLm51bU5vbkxlYWZQYWdlcyA9IDE7CgoJZ2VuZXJpY2Nvc3Rlc3Rp bWF0ZShyb290LCBwYXRoLCBsb29wX2NvdW50LCAmY29zdHMpOwoKCS8qCgkgKiBXZSBtb2Rl bCBpbmRleCBkZXNjZW50IGNvc3RzIHNpbWlsYXJseSB0byB0aG9zZSBmb3IgYnRyZWUsIGJ1 dCB0byBkbwoJICogdGhhdCB3ZSBmaXJzdCBuZWVkIGFuIGlkZWEgb2YgdGhlIHRyZWUgaGVp Z2h0LiAgV2Ugc29tZXdoYXQgYXJiaXRyYXJpbHkKCSAqIGFzc3VtZSB0aGF0IHRoZSBmYW5v dXQgaXMgMTAwLCBtZWFuaW5nIHRoZSB0cmVlIGhlaWdodCBpcyBhdCBtb3N0CgkgKiBsb2cx MDAoaW5kZXgtPnBhZ2VzKS4KCSAqCgkgKiBBbHRob3VnaCB0aGlzIGNvbXB1dGF0aW9uIGlz bid0IHJlYWxseSBleHBlbnNpdmUgZW5vdWdoIHRvIHJlcXVpcmUKCSAqIGNhY2hpbmcsIHdl IG1pZ2h0IGFzIHdlbGwgdXNlIGluZGV4LT50cmVlX2hlaWdodCB0byBjYWNoZSBpdC4KCSAq LwoJaWYgKGluZGV4LT50cmVlX2hlaWdodCA8IDApIC8qIHVua25vd24/ICovCgl7CgkJaWYg KGluZGV4LT5wYWdlcyA+IDEpCS8qIGF2b2lkIGNvbXB1dGluZyBsb2coMCkgKi8KCQkJaW5k ZXgtPnRyZWVfaGVpZ2h0ID0gKGludCkgKGxvZyhpbmRleC0+cGFnZXMpIC8gbG9nKDEwMC4w KSk7CgkJZWxzZQoJCQlpbmRleC0+dHJlZV9oZWlnaHQgPSAwOwoJfQoKCS8qCgkgKiBBZGQg YSBDUFUtY29zdCBjb21wb25lbnQgdG8gcmVwcmVzZW50IHRoZSBjb3N0cyBvZiBpbml0aWFs IGRlc2NlbnQuIFdlCgkgKiBqdXN0IHVzZSBsb2coTikgaGVyZSBub3QgbG9nMihOKSBzaW5j ZSB0aGUgYnJhbmNoaW5nIGZhY3RvciBpc24ndAoJICogbmVjZXNzYXJpbHkgdHdvIGFueXdh eS4gIEFzIGZvciBidHJlZSwgY2hhcmdlIG9uY2UgcGVyIFNBIHNjYW4uCgkgKi8KCWlmIChp bmRleC0+dHVwbGVzID4gMSkJCS8qIGF2b2lkIGNvbXB1dGluZyBsb2coMCkgKi8KCXsKCQlk ZXNjZW50Q29zdCA9IGNlaWwobG9nKGluZGV4LT50dXBsZXMpKSAqIGNwdV9vcGVyYXRvcl9j b3N0OwoJCWNvc3RzLmluZGV4U3RhcnR1cENvc3QgKz0gZGVzY2VudENvc3Q7CgkJY29zdHMu aW5kZXhUb3RhbENvc3QgKz0gY29zdHMubnVtX3NhX3NjYW5zICogZGVzY2VudENvc3Q7Cgl9 CgoJLyoKCSAqIExpa2V3aXNlIGFkZCBhIHBlci1wYWdlIGNoYXJnZSwgY2FsY3VsYXRlZCB0 aGUgc2FtZSBhcyBmb3IgYnRyZWVzLgoJICovCglkZXNjZW50Q29zdCA9IChpbmRleC0+dHJl ZV9oZWlnaHQgKyAxKSAqIERFRkFVTFRfUEFHRV9DUFVfTVVMVElQTElFUiAqIGNwdV9vcGVy YXRvcl9jb3N0OwoJY29zdHMuaW5kZXhTdGFydHVwQ29zdCArPSBkZXNjZW50Q29zdDsKCWNv c3RzLmluZGV4VG90YWxDb3N0ICs9IGNvc3RzLm51bV9zYV9zY2FucyAqIGRlc2NlbnRDb3N0 OwoKCSppbmRleFN0YXJ0dXBDb3N0ID0gY29zdHMuaW5kZXhTdGFydHVwQ29zdDsKCSppbmRl eFRvdGFsQ29zdCA9IGNvc3RzLmluZGV4VG90YWxDb3N0OwoJKmluZGV4U2VsZWN0aXZpdHkg PSBjb3N0cy5pbmRleFNlbGVjdGl2aXR5OwoJKmluZGV4Q29ycmVsYXRpb24gPSBjb3N0cy5p bmRleENvcnJlbGF0aW9uOwoJKmluZGV4UGFnZXMgPSBjb3N0cy5udW1JbmRleFBhZ2VzOwp9 CgoKLyoKICogU3VwcG9ydCByb3V0aW5lcyBmb3IgZ2luY29zdGVzdGltYXRlCiAqLwoKdHlw ZWRlZiBzdHJ1Y3QKewoJYm9vbAkJYXR0SGFzRnVsbFNjYW5bSU5ERVhfTUFYX0tFWVNdOwoJ Ym9vbAkJYXR0SGFzTm9ybWFsU2NhbltJTkRFWF9NQVhfS0VZU107Cglkb3VibGUJCXBhcnRp YWxFbnRyaWVzOwoJZG91YmxlCQlleGFjdEVudHJpZXM7Cglkb3VibGUJCXNlYXJjaEVudHJp ZXM7Cglkb3VibGUJCWFycmF5U2NhbnM7Cn0gR2luUXVhbENvdW50czsKCi8qCiAqIEVzdGlt YXRlIHRoZSBudW1iZXIgb2YgaW5kZXggdGVybXMgdGhhdCBuZWVkIHRvIGJlIHNlYXJjaGVk IGZvciB3aGlsZQogKiB0ZXN0aW5nIHRoZSBnaXZlbiBHSU4gcXVlcnksIGFuZCBpbmNyZW1l bnQgdGhlIGNvdW50cyBpbiAqY291bnRzCiAqIGFwcHJvcHJpYXRlbHkuICBJZiB0aGUgcXVl cnkgaXMgdW5zYXRpc2ZpYWJsZSwgcmV0dXJuIGZhbHNlLgogKi8Kc3RhdGljIGJvb2wKZ2lu Y29zdF9wYXR0ZXJuKEluZGV4T3B0SW5mbyAqaW5kZXgsIGludCBpbmRleGNvbCwKCQkJCU9p ZCBjbGF1c2Vfb3AsIERhdHVtIHF1ZXJ5LAoJCQkJR2luUXVhbENvdW50cyAqY291bnRzKQp7 CglGbWdySW5mbwlmbGluZm87CglPaWQJCQlleHRyYWN0UHJvY09pZDsKCU9pZAkJCWNvbGxh dGlvbjsKCWludAkJCXN0cmF0ZWd5X29wOwoJT2lkCQkJbGVmdHR5cGUsCgkJCQlyaWdodHR5 cGU7CglpbnQzMgkJbmVudHJpZXMgPSAwOwoJYm9vbAkgICAqcGFydGlhbF9tYXRjaGVzID0g TlVMTDsKCVBvaW50ZXIgICAgKmV4dHJhX2RhdGEgPSBOVUxMOwoJYm9vbAkgICAqbnVsbEZs YWdzID0gTlVMTDsKCWludDMyCQlzZWFyY2hNb2RlID0gR0lOX1NFQVJDSF9NT0RFX0RFRkFV TFQ7CglpbnQzMgkJaTsKCglBc3NlcnQoaW5kZXhjb2wgPCBpbmRleC0+bmtleWNvbHVtbnMp OwoKCS8qCgkgKiBHZXQgdGhlIG9wZXJhdG9yJ3Mgc3RyYXRlZ3kgbnVtYmVyIGFuZCBkZWNs YXJlZCBpbnB1dCBkYXRhIHR5cGVzIHdpdGhpbgoJICogdGhlIGluZGV4IG9wZmFtaWx5LiAg KFdlIGRvbid0IG5lZWQgdGhlIGxhdHRlciwgYnV0IHdlIHVzZQoJICogZ2V0X29wX29wZmFt aWx5X3Byb3BlcnRpZXMgYmVjYXVzZSBpdCB3aWxsIHRocm93IGVycm9yIGlmIGl0IGZhaWxz IHRvCgkgKiBmaW5kIGEgbWF0Y2hpbmcgcGdfYW1vcCBlbnRyeS4pCgkgKi8KCWdldF9vcF9v cGZhbWlseV9wcm9wZXJ0aWVzKGNsYXVzZV9vcCwgaW5kZXgtPm9wZmFtaWx5W2luZGV4Y29s XSwgZmFsc2UsCgkJCQkJCQkgICAmc3RyYXRlZ3lfb3AsICZsZWZ0dHlwZSwgJnJpZ2h0dHlw ZSk7CgoJLyoKCSAqIEdJTiBhbHdheXMgdXNlcyB0aGUgImRlZmF1bHQiIHN1cHBvcnQgZnVu Y3Rpb25zLCB3aGljaCBhcmUgdGhvc2Ugd2l0aAoJICogbGVmdHR5cGUgPT0gcmlnaHR0eXBl ID09IHRoZSBvcGNsYXNzJyBvcGNpbnR5cGUgKHNlZQoJICogSW5kZXhTdXBwb3J0SW5pdGlh bGl6ZSBpbiByZWxjYWNoZS5jKS4KCSAqLwoJZXh0cmFjdFByb2NPaWQgPSBnZXRfb3BmYW1p bHlfcHJvYyhpbmRleC0+b3BmYW1pbHlbaW5kZXhjb2xdLAoJCQkJCQkJCQkgICBpbmRleC0+ b3BjaW50eXBlW2luZGV4Y29sXSwKCQkJCQkJCQkJICAgaW5kZXgtPm9wY2ludHlwZVtpbmRl eGNvbF0sCgkJCQkJCQkJCSAgIEdJTl9FWFRSQUNUUVVFUllfUFJPQyk7CgoJaWYgKCFPaWRJ c1ZhbGlkKGV4dHJhY3RQcm9jT2lkKSkKCXsKCQkvKiBzaG91bGQgbm90IGhhcHBlbjsgdGhy b3cgc2FtZSBlcnJvciBhcyBpbmRleF9nZXRwcm9jaW5mbyAqLwoJCWVsb2coRVJST1IsICJt aXNzaW5nIHN1cHBvcnQgZnVuY3Rpb24gJWQgZm9yIGF0dHJpYnV0ZSAlZCBvZiBpbmRleCBc IiVzXCIiLAoJCQkgR0lOX0VYVFJBQ1RRVUVSWV9QUk9DLCBpbmRleGNvbCArIDEsCgkJCSBn ZXRfcmVsX25hbWUoaW5kZXgtPmluZGV4b2lkKSk7Cgl9CgoJLyoKCSAqIENob29zZSBjb2xs YXRpb24gdG8gcGFzcyB0byBleHRyYWN0UHJvYyAoc2hvdWxkIG1hdGNoIGluaXRHaW5TdGF0 ZSkuCgkgKi8KCWlmIChPaWRJc1ZhbGlkKGluZGV4LT5pbmRleGNvbGxhdGlvbnNbaW5kZXhj b2xdKSkKCQljb2xsYXRpb24gPSBpbmRleC0+aW5kZXhjb2xsYXRpb25zW2luZGV4Y29sXTsK CWVsc2UKCQljb2xsYXRpb24gPSBERUZBVUxUX0NPTExBVElPTl9PSUQ7CgoJZm1ncl9pbmZv KGV4dHJhY3RQcm9jT2lkLCAmZmxpbmZvKTsKCglzZXRfZm5fb3BjbGFzc19vcHRpb25zKCZm bGluZm8sIGluZGV4LT5vcGNsYXNzb3B0aW9uc1tpbmRleGNvbF0pOwoKCUZ1bmN0aW9uQ2Fs bDdDb2xsKCZmbGluZm8sCgkJCQkJICBjb2xsYXRpb24sCgkJCQkJICBxdWVyeSwKCQkJCQkg IFBvaW50ZXJHZXREYXR1bSgmbmVudHJpZXMpLAoJCQkJCSAgVUludDE2R2V0RGF0dW0oc3Ry YXRlZ3lfb3ApLAoJCQkJCSAgUG9pbnRlckdldERhdHVtKCZwYXJ0aWFsX21hdGNoZXMpLAoJ CQkJCSAgUG9pbnRlckdldERhdHVtKCZleHRyYV9kYXRhKSwKCQkJCQkgIFBvaW50ZXJHZXRE YXR1bSgmbnVsbEZsYWdzKSwKCQkJCQkgIFBvaW50ZXJHZXREYXR1bSgmc2VhcmNoTW9kZSkp OwoKCWlmIChuZW50cmllcyA8PSAwICYmIHNlYXJjaE1vZGUgPT0gR0lOX1NFQVJDSF9NT0RF X0RFRkFVTFQpCgl7CgkJLyogTm8gbWF0Y2ggaXMgcG9zc2libGUgKi8KCQlyZXR1cm4gZmFs c2U7Cgl9CgoJZm9yIChpID0gMDsgaSA8IG5lbnRyaWVzOyBpKyspCgl7CgkJLyoKCQkgKiBG b3IgcGFydGlhbCBtYXRjaCB3ZSBoYXZlbid0IGFueSBpbmZvcm1hdGlvbiB0byBlc3RpbWF0 ZSBudW1iZXIgb2YKCQkgKiBtYXRjaGVkIGVudHJpZXMgaW4gaW5kZXgsIHNvLCB3ZSBqdXN0 IGVzdGltYXRlIGl0IGFzIDEwMAoJCSAqLwoJCWlmIChwYXJ0aWFsX21hdGNoZXMgJiYgcGFy dGlhbF9tYXRjaGVzW2ldKQoJCQljb3VudHMtPnBhcnRpYWxFbnRyaWVzICs9IDEwMDsKCQll bHNlCgkJCWNvdW50cy0+ZXhhY3RFbnRyaWVzKys7CgoJCWNvdW50cy0+c2VhcmNoRW50cmll cysrOwoJfQoKCWlmIChzZWFyY2hNb2RlID09IEdJTl9TRUFSQ0hfTU9ERV9ERUZBVUxUKQoJ ewoJCWNvdW50cy0+YXR0SGFzTm9ybWFsU2NhbltpbmRleGNvbF0gPSB0cnVlOwoJfQoJZWxz ZSBpZiAoc2VhcmNoTW9kZSA9PSBHSU5fU0VBUkNIX01PREVfSU5DTFVERV9FTVBUWSkKCXsK CQkvKiBUcmVhdCAiaW5jbHVkZSBlbXB0eSIgbGlrZSBhbiBleGFjdC1tYXRjaCBpdGVtICov CgkJY291bnRzLT5hdHRIYXNOb3JtYWxTY2FuW2luZGV4Y29sXSA9IHRydWU7CgkJY291bnRz LT5leGFjdEVudHJpZXMrKzsKCQljb3VudHMtPnNlYXJjaEVudHJpZXMrKzsKCX0KCWVsc2UK CXsKCQkvKiBJdCdzIEdJTl9TRUFSQ0hfTU9ERV9BTEwgKi8KCQljb3VudHMtPmF0dEhhc0Z1 bGxTY2FuW2luZGV4Y29sXSA9IHRydWU7Cgl9CgoJcmV0dXJuIHRydWU7Cn0KCi8qCiAqIEVz dGltYXRlIHRoZSBudW1iZXIgb2YgaW5kZXggdGVybXMgdGhhdCBuZWVkIHRvIGJlIHNlYXJj aGVkIGZvciB3aGlsZQogKiB0ZXN0aW5nIHRoZSBnaXZlbiBHSU4gaW5kZXggY2xhdXNlLCBh bmQgaW5jcmVtZW50IHRoZSBjb3VudHMgaW4gKmNvdW50cwogKiBhcHByb3ByaWF0ZWx5LiAg SWYgdGhlIHF1ZXJ5IGlzIHVuc2F0aXNmaWFibGUsIHJldHVybiBmYWxzZS4KICovCnN0YXRp YyBib29sCmdpbmNvc3Rfb3BleHByKFBsYW5uZXJJbmZvICpyb290LAoJCQkgICBJbmRleE9w dEluZm8gKmluZGV4LAoJCQkgICBpbnQgaW5kZXhjb2wsCgkJCSAgIE9wRXhwciAqY2xhdXNl LAoJCQkgICBHaW5RdWFsQ291bnRzICpjb3VudHMpCnsKCU9pZAkJCWNsYXVzZV9vcCA9IGNs YXVzZS0+b3BubzsKCU5vZGUJICAgKm9wZXJhbmQgPSAoTm9kZSAqKSBsc2Vjb25kKGNsYXVz ZS0+YXJncyk7CgoJLyogYWdncmVzc2l2ZWx5IHJlZHVjZSB0byBhIGNvbnN0YW50LCBhbmQg bG9vayB0aHJvdWdoIHJlbGFiZWxpbmcgKi8KCW9wZXJhbmQgPSBlc3RpbWF0ZV9leHByZXNz aW9uX3ZhbHVlKHJvb3QsIG9wZXJhbmQpOwoKCWlmIChJc0Eob3BlcmFuZCwgUmVsYWJlbFR5 cGUpKQoJCW9wZXJhbmQgPSAoTm9kZSAqKSAoKFJlbGFiZWxUeXBlICopIG9wZXJhbmQpLT5h cmc7CgoJLyoKCSAqIEl0J3MgaW1wb3NzaWJsZSB0byBjYWxsIGV4dHJhY3RRdWVyeSBtZXRo b2QgZm9yIHVua25vd24gb3BlcmFuZC4gU28KCSAqIHVubGVzcyBvcGVyYW5kIGlzIGEgQ29u c3Qgd2UgY2FuJ3QgZG8gbXVjaDsganVzdCBhc3N1bWUgdGhlcmUgd2lsbCBiZQoJICogb25l IG9yZGluYXJ5IHNlYXJjaCBlbnRyeSBmcm9tIHRoZSBvcGVyYW5kIGF0IHJ1bnRpbWUuCgkg Ki8KCWlmICghSXNBKG9wZXJhbmQsIENvbnN0KSkKCXsKCQljb3VudHMtPmV4YWN0RW50cmll cysrOwoJCWNvdW50cy0+c2VhcmNoRW50cmllcysrOwoJCXJldHVybiB0cnVlOwoJfQoKCS8q IElmIENvbnN0IGlzIG51bGwsIHRoZXJlIGNhbiBiZSBubyBtYXRjaGVzICovCglpZiAoKChD b25zdCAqKSBvcGVyYW5kKS0+Y29uc3Rpc251bGwpCgkJcmV0dXJuIGZhbHNlOwoKCS8qIE90 aGVyd2lzZSwgYXBwbHkgZXh0cmFjdFF1ZXJ5IGFuZCBnZXQgdGhlIGFjdHVhbCB0ZXJtIGNv dW50cyAqLwoJcmV0dXJuIGdpbmNvc3RfcGF0dGVybihpbmRleCwgaW5kZXhjb2wsIGNsYXVz ZV9vcCwKCQkJCQkJICAgKChDb25zdCAqKSBvcGVyYW5kKS0+Y29uc3R2YWx1ZSwKCQkJCQkJ ICAgY291bnRzKTsKfQoKLyoKICogRXN0aW1hdGUgdGhlIG51bWJlciBvZiBpbmRleCB0ZXJt cyB0aGF0IG5lZWQgdG8gYmUgc2VhcmNoZWQgZm9yIHdoaWxlCiAqIHRlc3RpbmcgdGhlIGdp dmVuIEdJTiBpbmRleCBjbGF1c2UsIGFuZCBpbmNyZW1lbnQgdGhlIGNvdW50cyBpbiAqY291 bnRzCiAqIGFwcHJvcHJpYXRlbHkuICBJZiB0aGUgcXVlcnkgaXMgdW5zYXRpc2ZpYWJsZSwg cmV0dXJuIGZhbHNlLgogKgogKiBBIFNjYWxhckFycmF5T3BFeHByIHdpbGwgZ2l2ZSByaXNl IHRvIE4gc2VwYXJhdGUgaW5kZXhzY2FucyBhdCBydW50aW1lLAogKiBlYWNoIG9mIHdoaWNo IGludm9sdmVzIG9uZSB2YWx1ZSBmcm9tIHRoZSBSSFMgYXJyYXksIHBsdXMgYWxsIHRoZQog KiBub24tYXJyYXkgcXVhbHMgKGlmIGFueSkuICBUbyBtb2RlbCB0aGlzLCB3ZSBhdmVyYWdl IHRoZSBjb3VudHMgYWNyb3NzCiAqIHRoZSBSSFMgZWxlbWVudHMsIGFuZCBhZGQgdGhlIGF2 ZXJhZ2VzIHRvIHRoZSBjb3VudHMgaW4gKmNvdW50cyAod2hpY2gKICogY29ycmVzcG9uZCB0 byBwZXItaW5kZXhzY2FuIGNvc3RzKS4gIFdlIGFsc28gbXVsdGlwbHkgY291bnRzLT5hcnJh eVNjYW5zCiAqIGJ5IE4sIGNhdXNpbmcgZ2luY29zdGVzdGltYXRlIHRvIHNjYWxlIHVwIGl0 cyBlc3RpbWF0ZXMgYWNjb3JkaW5nbHkuCiAqLwpzdGF0aWMgYm9vbApnaW5jb3N0X3NjYWxh cmFycmF5b3BleHByKFBsYW5uZXJJbmZvICpyb290LAoJCQkJCQkgIEluZGV4T3B0SW5mbyAq aW5kZXgsCgkJCQkJCSAgaW50IGluZGV4Y29sLAoJCQkJCQkgIFNjYWxhckFycmF5T3BFeHBy ICpjbGF1c2UsCgkJCQkJCSAgZG91YmxlIG51bUluZGV4RW50cmllcywKCQkJCQkJICBHaW5R dWFsQ291bnRzICpjb3VudHMpCnsKCU9pZAkJCWNsYXVzZV9vcCA9IGNsYXVzZS0+b3BubzsK CU5vZGUJICAgKnJpZ2h0b3AgPSAoTm9kZSAqKSBsc2Vjb25kKGNsYXVzZS0+YXJncyk7CglB cnJheVR5cGUgICphcnJheXZhbDsKCWludDE2CQllbG1sZW47Cglib29sCQllbG1ieXZhbDsK CWNoYXIJCWVsbWFsaWduOwoJaW50CQkJbnVtRWxlbXM7CglEYXR1bQkgICAqZWxlbVZhbHVl czsKCWJvb2wJICAgKmVsZW1OdWxsczsKCUdpblF1YWxDb3VudHMgYXJyYXljb3VudHM7Cglp bnQJCQludW1Qb3NzaWJsZSA9IDA7CglpbnQJCQlpOwoKCUFzc2VydChjbGF1c2UtPnVzZU9y KTsKCgkvKiBhZ2dyZXNzaXZlbHkgcmVkdWNlIHRvIGEgY29uc3RhbnQsIGFuZCBsb29rIHRo cm91Z2ggcmVsYWJlbGluZyAqLwoJcmlnaHRvcCA9IGVzdGltYXRlX2V4cHJlc3Npb25fdmFs dWUocm9vdCwgcmlnaHRvcCk7CgoJaWYgKElzQShyaWdodG9wLCBSZWxhYmVsVHlwZSkpCgkJ cmlnaHRvcCA9IChOb2RlICopICgoUmVsYWJlbFR5cGUgKikgcmlnaHRvcCktPmFyZzsKCgkv KgoJICogSXQncyBpbXBvc3NpYmxlIHRvIGNhbGwgZXh0cmFjdFF1ZXJ5IG1ldGhvZCBmb3Ig dW5rbm93biBvcGVyYW5kLiBTbwoJICogdW5sZXNzIG9wZXJhbmQgaXMgYSBDb25zdCB3ZSBj YW4ndCBkbyBtdWNoOyBqdXN0IGFzc3VtZSB0aGVyZSB3aWxsIGJlCgkgKiBvbmUgb3JkaW5h cnkgc2VhcmNoIGVudHJ5IGZyb20gZWFjaCBhcnJheSBlbnRyeSBhdCBydW50aW1lLCBhbmQg ZmFsbAoJICogYmFjayBvbiBhIHByb2JhYmx5LWJhZCBlc3RpbWF0ZSBvZiB0aGUgbnVtYmVy IG9mIGFycmF5IGVudHJpZXMuCgkgKi8KCWlmICghSXNBKHJpZ2h0b3AsIENvbnN0KSkKCXsK CQljb3VudHMtPmV4YWN0RW50cmllcysrOwoJCWNvdW50cy0+c2VhcmNoRW50cmllcysrOwoJ CWNvdW50cy0+YXJyYXlTY2FucyAqPSBlc3RpbWF0ZV9hcnJheV9sZW5ndGgocm9vdCwgcmln aHRvcCk7CgkJcmV0dXJuIHRydWU7Cgl9CgoJLyogSWYgQ29uc3QgaXMgbnVsbCwgdGhlcmUg Y2FuIGJlIG5vIG1hdGNoZXMgKi8KCWlmICgoKENvbnN0ICopIHJpZ2h0b3ApLT5jb25zdGlz bnVsbCkKCQlyZXR1cm4gZmFsc2U7CgoJLyogT3RoZXJ3aXNlLCBleHRyYWN0IHRoZSBhcnJh eSBlbGVtZW50cyBhbmQgaXRlcmF0ZSBvdmVyIHRoZW0gKi8KCWFycmF5dmFsID0gRGF0dW1H ZXRBcnJheVR5cGVQKCgoQ29uc3QgKikgcmlnaHRvcCktPmNvbnN0dmFsdWUpOwoJZ2V0X3R5 cGxlbmJ5dmFsYWxpZ24oQVJSX0VMRU1UWVBFKGFycmF5dmFsKSwKCQkJCQkJICZlbG1sZW4s ICZlbG1ieXZhbCwgJmVsbWFsaWduKTsKCWRlY29uc3RydWN0X2FycmF5KGFycmF5dmFsLAoJ CQkJCSAgQVJSX0VMRU1UWVBFKGFycmF5dmFsKSwKCQkJCQkgIGVsbWxlbiwgZWxtYnl2YWws IGVsbWFsaWduLAoJCQkJCSAgJmVsZW1WYWx1ZXMsICZlbGVtTnVsbHMsICZudW1FbGVtcyk7 CgoJbWVtc2V0KCZhcnJheWNvdW50cywgMCwgc2l6ZW9mKGFycmF5Y291bnRzKSk7CgoJZm9y IChpID0gMDsgaSA8IG51bUVsZW1zOyBpKyspCgl7CgkJR2luUXVhbENvdW50cyBlbGVtY291 bnRzOwoKCQkvKiBOVUxMIGNhbid0IG1hdGNoIGFueXRoaW5nLCBzbyBpZ25vcmUsIGFzIHRo ZSBleGVjdXRvciB3aWxsICovCgkJaWYgKGVsZW1OdWxsc1tpXSkKCQkJY29udGludWU7CgoJ CS8qIE90aGVyd2lzZSwgYXBwbHkgZXh0cmFjdFF1ZXJ5IGFuZCBnZXQgdGhlIGFjdHVhbCB0 ZXJtIGNvdW50cyAqLwoJCW1lbXNldCgmZWxlbWNvdW50cywgMCwgc2l6ZW9mKGVsZW1jb3Vu dHMpKTsKCgkJaWYgKGdpbmNvc3RfcGF0dGVybihpbmRleCwgaW5kZXhjb2wsIGNsYXVzZV9v cCwgZWxlbVZhbHVlc1tpXSwKCQkJCQkJCSZlbGVtY291bnRzKSkKCQl7CgkJCS8qIFdlIGln bm9yZSBhcnJheSBlbGVtZW50cyB0aGF0IGFyZSB1bnNhdGlzZmlhYmxlIHBhdHRlcm5zICov CgkJCW51bVBvc3NpYmxlKys7CgoJCQlpZiAoZWxlbWNvdW50cy5hdHRIYXNGdWxsU2Nhbltp bmRleGNvbF0gJiYKCQkJCSFlbGVtY291bnRzLmF0dEhhc05vcm1hbFNjYW5baW5kZXhjb2xd KQoJCQl7CgkJCQkvKgoJCQkJICogRnVsbCBpbmRleCBzY2FuIHdpbGwgYmUgcmVxdWlyZWQu ICBXZSB0cmVhdCB0aGlzIGFzIGlmCgkJCQkgKiBldmVyeSBrZXkgaW4gdGhlIGluZGV4IGhh ZCBiZWVuIGxpc3RlZCBpbiB0aGUgcXVlcnk7IGlzCgkJCQkgKiB0aGF0IHJlYXNvbmFibGU/ CgkJCQkgKi8KCQkJCWVsZW1jb3VudHMucGFydGlhbEVudHJpZXMgPSAwOwoJCQkJZWxlbWNv dW50cy5leGFjdEVudHJpZXMgPSBudW1JbmRleEVudHJpZXM7CgkJCQllbGVtY291bnRzLnNl YXJjaEVudHJpZXMgPSBudW1JbmRleEVudHJpZXM7CgkJCX0KCQkJYXJyYXljb3VudHMucGFy dGlhbEVudHJpZXMgKz0gZWxlbWNvdW50cy5wYXJ0aWFsRW50cmllczsKCQkJYXJyYXljb3Vu dHMuZXhhY3RFbnRyaWVzICs9IGVsZW1jb3VudHMuZXhhY3RFbnRyaWVzOwoJCQlhcnJheWNv dW50cy5zZWFyY2hFbnRyaWVzICs9IGVsZW1jb3VudHMuc2VhcmNoRW50cmllczsKCQl9Cgl9 CgoJaWYgKG51bVBvc3NpYmxlID09IDApCgl7CgkJLyogTm8gc2F0aXNmaWFibGUgcGF0dGVy bnMgaW4gdGhlIGFycmF5ICovCgkJcmV0dXJuIGZhbHNlOwoJfQoKCS8qCgkgKiBOb3cgYWRk IHRoZSBhdmVyYWdlcyB0byB0aGUgZ2xvYmFsIGNvdW50cy4gIFRoaXMgd2lsbCBnaXZlIHVz IGFuCgkgKiBlc3RpbWF0ZSBvZiB0aGUgYXZlcmFnZSBudW1iZXIgb2YgdGVybXMgc2VhcmNo ZWQgZm9yIGluIGVhY2ggaW5kZXhzY2FuLAoJICogaW5jbHVkaW5nIGNvbnRyaWJ1dGlvbnMg ZnJvbSBib3RoIGFycmF5IGFuZCBub24tYXJyYXkgcXVhbHMuCgkgKi8KCWNvdW50cy0+cGFy dGlhbEVudHJpZXMgKz0gYXJyYXljb3VudHMucGFydGlhbEVudHJpZXMgLyBudW1Qb3NzaWJs ZTsKCWNvdW50cy0+ZXhhY3RFbnRyaWVzICs9IGFycmF5Y291bnRzLmV4YWN0RW50cmllcyAv IG51bVBvc3NpYmxlOwoJY291bnRzLT5zZWFyY2hFbnRyaWVzICs9IGFycmF5Y291bnRzLnNl YXJjaEVudHJpZXMgLyBudW1Qb3NzaWJsZTsKCgljb3VudHMtPmFycmF5U2NhbnMgKj0gbnVt UG9zc2libGU7CgoJcmV0dXJuIHRydWU7Cn0KCi8qCiAqIEdJTiBoYXMgc2VhcmNoIGJlaGF2 aW9yIGNvbXBsZXRlbHkgZGlmZmVyZW50IGZyb20gb3RoZXIgaW5kZXggdHlwZXMKICovCnZv aWQKZ2luY29zdGVzdGltYXRlKFBsYW5uZXJJbmZvICpyb290LCBJbmRleFBhdGggKnBhdGgs IGRvdWJsZSBsb29wX2NvdW50LAoJCQkJQ29zdCAqaW5kZXhTdGFydHVwQ29zdCwgQ29zdCAq aW5kZXhUb3RhbENvc3QsCgkJCQlTZWxlY3Rpdml0eSAqaW5kZXhTZWxlY3Rpdml0eSwgZG91 YmxlICppbmRleENvcnJlbGF0aW9uLAoJCQkJZG91YmxlICppbmRleFBhZ2VzKQp7CglJbmRl eE9wdEluZm8gKmluZGV4ID0gcGF0aC0+aW5kZXhpbmZvOwoJTGlzdAkgICAqaW5kZXhRdWFs cyA9IGdldF9xdWFsc19mcm9tX2luZGV4Y2xhdXNlcyhwYXRoLT5pbmRleGNsYXVzZXMpOwoJ TGlzdAkgICAqc2VsZWN0aXZpdHlRdWFsczsKCWRvdWJsZQkJbnVtUGFnZXMgPSBpbmRleC0+ cGFnZXMsCgkJCQludW1UdXBsZXMgPSBpbmRleC0+dHVwbGVzOwoJZG91YmxlCQludW1FbnRy eVBhZ2VzLAoJCQkJbnVtRGF0YVBhZ2VzLAoJCQkJbnVtUGVuZGluZ1BhZ2VzLAoJCQkJbnVt RW50cmllczsKCUdpblF1YWxDb3VudHMgY291bnRzOwoJYm9vbAkJbWF0Y2hQb3NzaWJsZTsK CWJvb2wJCWZ1bGxJbmRleFNjYW47Cglkb3VibGUJCXBhcnRpYWxTY2FsZTsKCWRvdWJsZQkJ ZW50cnlQYWdlc0ZldGNoZWQsCgkJCQlkYXRhUGFnZXNGZXRjaGVkLAoJCQkJZGF0YVBhZ2Vz RmV0Y2hlZEJ5U2VsOwoJZG91YmxlCQlxdWFsX29wX2Nvc3QsCgkJCQlxdWFsX2FyZ19jb3N0 LAoJCQkJc3BjX3JhbmRvbV9wYWdlX2Nvc3QsCgkJCQlvdXRlcl9zY2FuczsKCUNvc3QJCWRl c2NlbnRDb3N0OwoJUmVsYXRpb24JaW5kZXhSZWw7CglHaW5TdGF0c0RhdGEgZ2luU3RhdHM7 CglMaXN0Q2VsbCAgICpsYzsKCWludAkJCWk7CgoJLyoKCSAqIE9idGFpbiBzdGF0aXN0aWNh bCBpbmZvcm1hdGlvbiBmcm9tIHRoZSBtZXRhIHBhZ2UsIGlmIHBvc3NpYmxlLiAgRWxzZQoJ ICogc2V0IGdpblN0YXRzIHRvIHplcm9lcywgYW5kIHdlJ2xsIGNvcGUgYmVsb3cuCgkgKi8K CWlmICghaW5kZXgtPmh5cG90aGV0aWNhbCkKCXsKCQkvKiBMb2NrIHNob3VsZCBoYXZlIGFs cmVhZHkgYmVlbiBvYnRhaW5lZCBpbiBwbGFuY2F0LmMgKi8KCQlpbmRleFJlbCA9IGluZGV4 X29wZW4oaW5kZXgtPmluZGV4b2lkLCBOb0xvY2spOwoJCWdpbkdldFN0YXRzKGluZGV4UmVs LCAmZ2luU3RhdHMpOwoJCWluZGV4X2Nsb3NlKGluZGV4UmVsLCBOb0xvY2spOwoJfQoJZWxz ZQoJewoJCW1lbXNldCgmZ2luU3RhdHMsIDAsIHNpemVvZihnaW5TdGF0cykpOwoJfQoKCS8q CgkgKiBBc3N1bWluZyB3ZSBnb3QgdmFsaWQgKG5vbnplcm8pIHN0YXRzIGF0IGFsbCwgblBl bmRpbmdQYWdlcyBjYW4gYmUKCSAqIHRydXN0ZWQsIGJ1dCB0aGUgb3RoZXIgZmllbGRzIGFy ZSBkYXRhIGFzIG9mIHRoZSBsYXN0IFZBQ1VVTS4gIFdlIGNhbgoJICogc2NhbGUgdGhlbSB1 cCB0byBhY2NvdW50IGZvciBncm93dGggc2luY2UgdGhlbiwgYnV0IHRoYXQgbWV0aG9kIG9u bHkKCSAqIGdvZXMgc28gZmFyOyBpbiB0aGUgd29yc3QgY2FzZSwgdGhlIHN0YXRzIG1pZ2h0 IGJlIGZvciBhIGNvbXBsZXRlbHkKCSAqIGVtcHR5IGluZGV4LCBhbmQgc2NhbGluZyB0aGVt IHdpbGwgcHJvZHVjZSBwcmV0dHkgYm9ndXMgbnVtYmVycy4KCSAqIFNvbWV3aGF0IGFyYml0 cmFyaWx5LCBzZXQgdGhlIGN1dG9mZiBmb3IgZG9pbmcgc2NhbGluZyBhdCA0WCBncm93dGg7 IGlmCgkgKiBpdCdzIGdyb3duIG1vcmUgdGhhbiB0aGF0LCBmYWxsIGJhY2sgdG8gZXN0aW1h dGluZyB0aGluZ3Mgb25seSBmcm9tIHRoZQoJICogYXNzdW1lZC1hY2N1cmF0ZSBpbmRleCBz aXplLiAgQnV0IHdlJ2xsIHRydXN0IG5QZW5kaW5nUGFnZXMgaW4gYW55IGNhc2UKCSAqIHNv IGxvbmcgYXMgaXQncyBub3QgY2xlYXJseSBpbnNhbmUsIGllLCBtb3JlIHRoYW4gdGhlIGlu ZGV4IHNpemUuCgkgKi8KCWlmIChnaW5TdGF0cy5uUGVuZGluZ1BhZ2VzIDwgbnVtUGFnZXMp CgkJbnVtUGVuZGluZ1BhZ2VzID0gZ2luU3RhdHMublBlbmRpbmdQYWdlczsKCWVsc2UKCQlu dW1QZW5kaW5nUGFnZXMgPSAwOwoKCWlmIChudW1QYWdlcyA+IDAgJiYgZ2luU3RhdHMublRv dGFsUGFnZXMgPD0gbnVtUGFnZXMgJiYKCQlnaW5TdGF0cy5uVG90YWxQYWdlcyA+IG51bVBh Z2VzIC8gNCAmJgoJCWdpblN0YXRzLm5FbnRyeVBhZ2VzID4gMCAmJiBnaW5TdGF0cy5uRW50 cmllcyA+IDApCgl7CgkJLyoKCQkgKiBPSywgdGhlIHN0YXRzIHNlZW0gY2xvc2UgZW5vdWdo IHRvIHNhbmUgdG8gYmUgdHJ1c3RlZC4gIEJ1dCB3ZQoJCSAqIHN0aWxsIG5lZWQgdG8gc2Nh bGUgdGhlbSBieSB0aGUgcmF0aW8gbnVtUGFnZXMgLyBuVG90YWxQYWdlcyB0bwoJCSAqIGFj Y291bnQgZm9yIGdyb3d0aCBzaW5jZSB0aGUgbGFzdCBWQUNVVU0uCgkJICovCgkJZG91Ymxl CQlzY2FsZSA9IG51bVBhZ2VzIC8gZ2luU3RhdHMublRvdGFsUGFnZXM7CgoJCW51bUVudHJ5 UGFnZXMgPSBjZWlsKGdpblN0YXRzLm5FbnRyeVBhZ2VzICogc2NhbGUpOwoJCW51bURhdGFQ YWdlcyA9IGNlaWwoZ2luU3RhdHMubkRhdGFQYWdlcyAqIHNjYWxlKTsKCQludW1FbnRyaWVz ID0gY2VpbChnaW5TdGF0cy5uRW50cmllcyAqIHNjYWxlKTsKCQkvKiBlbnN1cmUgd2UgZGlk bid0IHJvdW5kIHVwIHRvbyBtdWNoICovCgkJbnVtRW50cnlQYWdlcyA9IE1pbihudW1FbnRy eVBhZ2VzLCBudW1QYWdlcyAtIG51bVBlbmRpbmdQYWdlcyk7CgkJbnVtRGF0YVBhZ2VzID0g TWluKG51bURhdGFQYWdlcywKCQkJCQkJICAgbnVtUGFnZXMgLSBudW1QZW5kaW5nUGFnZXMg LSBudW1FbnRyeVBhZ2VzKTsKCX0KCWVsc2UKCXsKCQkvKgoJCSAqIFdlIG1pZ2h0IGdldCBo ZXJlIGJlY2F1c2UgaXQncyBhIGh5cG90aGV0aWNhbCBpbmRleCwgb3IgYW4gaW5kZXgKCQkg KiBjcmVhdGVkIHByZS05LjEgYW5kIG5ldmVyIHZhY3V1bWVkIHNpbmNlIHVwZ3JhZGluZyAo aW4gd2hpY2ggY2FzZQoJCSAqIGl0cyBzdGF0cyB3b3VsZCByZWFkIGFzIHplcm9lcyksIG9y IGp1c3QgYmVjYXVzZSBpdCdzIGdyb3duIHRvbwoJCSAqIG11Y2ggc2luY2UgdGhlIGxhc3Qg VkFDVVVNIGZvciB1cyB0byBwdXQgb3VyIGZhaXRoIGluIHNjYWxpbmcuCgkJICoKCQkgKiBJ bnZlbnQgc29tZSBwbGF1c2libGUgaW50ZXJuYWwgc3RhdGlzdGljcyBiYXNlZCBvbiB0aGUg aW5kZXggcGFnZQoJCSAqIGNvdW50IChhbmQgY2xhbXAgdGhhdCB0byBhdCBsZWFzdCAxMCBw YWdlcywganVzdCBpbiBjYXNlKS4gIFdlCgkJICogZXN0aW1hdGUgdGhhdCA5MCUgb2YgdGhl IGluZGV4IGlzIGVudHJ5IHBhZ2VzLCBhbmQgdGhlIHJlc3QgaXMgZGF0YQoJCSAqIHBhZ2Vz LiAgRXN0aW1hdGUgMTAwIGVudHJpZXMgcGVyIGVudHJ5IHBhZ2U7IHRoaXMgaXMgcmF0aGVy IGJvZ3VzCgkJICogc2luY2UgaXQnbGwgZGVwZW5kIG9uIHRoZSBzaXplIG9mIHRoZSBrZXlz LCBidXQgaXQncyBtb3JlIHJvYnVzdAoJCSAqIHRoYW4gdHJ5aW5nIHRvIHByZWRpY3QgdGhl IG51bWJlciBvZiBlbnRyaWVzIHBlciBoZWFwIHR1cGxlLgoJCSAqLwoJCW51bVBhZ2VzID0g TWF4KG51bVBhZ2VzLCAxMCk7CgkJbnVtRW50cnlQYWdlcyA9IGZsb29yKChudW1QYWdlcyAt IG51bVBlbmRpbmdQYWdlcykgKiAwLjkwKTsKCQludW1EYXRhUGFnZXMgPSBudW1QYWdlcyAt IG51bVBlbmRpbmdQYWdlcyAtIG51bUVudHJ5UGFnZXM7CgkJbnVtRW50cmllcyA9IGZsb29y KG51bUVudHJ5UGFnZXMgKiAxMDApOwoJfQoKCS8qIEluIGFuIGVtcHR5IGluZGV4LCBudW1F bnRyaWVzIGNvdWxkIGJlIHplcm8uICBBdm9pZCBkaXZpZGUtYnktemVybyAqLwoJaWYgKG51 bUVudHJpZXMgPCAxKQoJCW51bUVudHJpZXMgPSAxOwoKCS8qCgkgKiBJZiB0aGUgaW5kZXgg aXMgcGFydGlhbCwgQU5EIHRoZSBpbmRleCBwcmVkaWNhdGUgd2l0aCB0aGUgaW5kZXgtYm91 bmQKCSAqIHF1YWxzIHRvIHByb2R1Y2UgYSBtb3JlIGFjY3VyYXRlIGlkZWEgb2YgdGhlIG51 bWJlciBvZiByb3dzIGNvdmVyZWQgYnkKCSAqIHRoZSBib3VuZCBjb25kaXRpb25zLgoJICov CglzZWxlY3Rpdml0eVF1YWxzID0gYWRkX3ByZWRpY2F0ZV90b19pbmRleF9xdWFscyhpbmRl eCwgaW5kZXhRdWFscyk7CgoJLyogRXN0aW1hdGUgdGhlIGZyYWN0aW9uIG9mIG1haW4tdGFi bGUgdHVwbGVzIHRoYXQgd2lsbCBiZSB2aXNpdGVkICovCgkqaW5kZXhTZWxlY3Rpdml0eSA9 IGNsYXVzZWxpc3Rfc2VsZWN0aXZpdHkocm9vdCwgc2VsZWN0aXZpdHlRdWFscywKCQkJCQkJ CQkJCQkgICBpbmRleC0+cmVsLT5yZWxpZCwKCQkJCQkJCQkJCQkgICBKT0lOX0lOTkVSLAoJ CQkJCQkJCQkJCSAgIE5VTEwpOwoKCS8qIGZldGNoIGVzdGltYXRlZCBwYWdlIGNvc3QgZm9y IHRhYmxlc3BhY2UgY29udGFpbmluZyBpbmRleCAqLwoJZ2V0X3RhYmxlc3BhY2VfcGFnZV9j b3N0cyhpbmRleC0+cmVsdGFibGVzcGFjZSwKCQkJCQkJCSAgJnNwY19yYW5kb21fcGFnZV9j b3N0LAoJCQkJCQkJICBOVUxMKTsKCgkvKgoJICogR2VuZXJpYyBhc3N1bXB0aW9uIGFib3V0 IGluZGV4IGNvcnJlbGF0aW9uOiB0aGVyZSBpc24ndCBhbnkuCgkgKi8KCSppbmRleENvcnJl bGF0aW9uID0gMC4wOwoKCS8qCgkgKiBFeGFtaW5lIHF1YWxzIHRvIGVzdGltYXRlIG51bWJl ciBvZiBzZWFyY2ggZW50cmllcyAmIHBhcnRpYWwgbWF0Y2hlcwoJICovCgltZW1zZXQoJmNv dW50cywgMCwgc2l6ZW9mKGNvdW50cykpOwoJY291bnRzLmFycmF5U2NhbnMgPSAxOwoJbWF0 Y2hQb3NzaWJsZSA9IHRydWU7CgoJZm9yZWFjaChsYywgcGF0aC0+aW5kZXhjbGF1c2VzKQoJ ewoJCUluZGV4Q2xhdXNlICppY2xhdXNlID0gbGZpcnN0X25vZGUoSW5kZXhDbGF1c2UsIGxj KTsKCQlMaXN0Q2VsbCAgICpsYzI7CgoJCWZvcmVhY2gobGMyLCBpY2xhdXNlLT5pbmRleHF1 YWxzKQoJCXsKCQkJUmVzdHJpY3RJbmZvICpyaW5mbyA9IGxmaXJzdF9ub2RlKFJlc3RyaWN0 SW5mbywgbGMyKTsKCQkJRXhwcgkgICAqY2xhdXNlID0gcmluZm8tPmNsYXVzZTsKCgkJCWlm IChJc0EoY2xhdXNlLCBPcEV4cHIpKQoJCQl7CgkJCQltYXRjaFBvc3NpYmxlID0gZ2luY29z dF9vcGV4cHIocm9vdCwKCQkJCQkJCQkJCQkgICBpbmRleCwKCQkJCQkJCQkJCQkgICBpY2xh dXNlLT5pbmRleGNvbCwKCQkJCQkJCQkJCQkgICAoT3BFeHByICopIGNsYXVzZSwKCQkJCQkJ CQkJCQkgICAmY291bnRzKTsKCQkJCWlmICghbWF0Y2hQb3NzaWJsZSkKCQkJCQlicmVhazsK CQkJfQoJCQllbHNlIGlmIChJc0EoY2xhdXNlLCBTY2FsYXJBcnJheU9wRXhwcikpCgkJCXsK CQkJCW1hdGNoUG9zc2libGUgPSBnaW5jb3N0X3NjYWxhcmFycmF5b3BleHByKHJvb3QsCgkJ CQkJCQkJCQkJCQkJICBpbmRleCwKCQkJCQkJCQkJCQkJCQkgIGljbGF1c2UtPmluZGV4Y29s LAoJCQkJCQkJCQkJCQkJCSAgKFNjYWxhckFycmF5T3BFeHByICopIGNsYXVzZSwKCQkJCQkJ CQkJCQkJCQkgIG51bUVudHJpZXMsCgkJCQkJCQkJCQkJCQkJICAmY291bnRzKTsKCQkJCWlm ICghbWF0Y2hQb3NzaWJsZSkKCQkJCQlicmVhazsKCQkJfQoJCQllbHNlCgkJCXsKCQkJCS8q IHNob3VsZG4ndCBiZSBhbnl0aGluZyBlbHNlIGZvciBhIEdJTiBpbmRleCAqLwoJCQkJZWxv ZyhFUlJPUiwgInVuc3VwcG9ydGVkIEdJTiBpbmRleHF1YWwgdHlwZTogJWQiLAoJCQkJCSAo aW50KSBub2RlVGFnKGNsYXVzZSkpOwoJCQl9CgkJfQoJfQoKCS8qIEZhbGwgb3V0IGlmIHRo ZXJlIHdlcmUgYW55IHByb3ZhYmx5LXVuc2F0aXNmaWFibGUgcXVhbHMgKi8KCWlmICghbWF0 Y2hQb3NzaWJsZSkKCXsKCQkqaW5kZXhTdGFydHVwQ29zdCA9IDA7CgkJKmluZGV4VG90YWxD b3N0ID0gMDsKCQkqaW5kZXhTZWxlY3Rpdml0eSA9IDA7CgkJcmV0dXJuOwoJfQoKCS8qCgkg KiBJZiBhdHRyaWJ1dGUgaGFzIGEgZnVsbCBzY2FuIGFuZCBhdCB0aGUgc2FtZSB0aW1lIGRv ZXNuJ3QgaGF2ZSBub3JtYWwKCSAqIHNjYW4sIHRoZW4gd2UnbGwgaGF2ZSB0byBzY2FuIGFs bCBub24tbnVsbCBlbnRyaWVzIG9mIHRoYXQgYXR0cmlidXRlLgoJICogQ3VycmVudGx5LCB3 ZSBkb24ndCBoYXZlIHBlci1hdHRyaWJ1dGUgc3RhdGlzdGljcyBmb3IgR0lOLiAgVGh1cywg d2UKCSAqIG11c3QgYXNzdW1lIHRoZSB3aG9sZSBHSU4gaW5kZXggaGFzIHRvIGJlIHNjYW5u ZWQgaW4gdGhpcyBjYXNlLgoJICovCglmdWxsSW5kZXhTY2FuID0gZmFsc2U7Cglmb3IgKGkg PSAwOyBpIDwgaW5kZXgtPm5rZXljb2x1bW5zOyBpKyspCgl7CgkJaWYgKGNvdW50cy5hdHRI YXNGdWxsU2NhbltpXSAmJiAhY291bnRzLmF0dEhhc05vcm1hbFNjYW5baV0pCgkJewoJCQlm dWxsSW5kZXhTY2FuID0gdHJ1ZTsKCQkJYnJlYWs7CgkJfQoJfQoKCWlmIChmdWxsSW5kZXhT Y2FuIHx8IGluZGV4UXVhbHMgPT0gTklMKQoJewoJCS8qCgkJICogRnVsbCBpbmRleCBzY2Fu IHdpbGwgYmUgcmVxdWlyZWQuICBXZSB0cmVhdCB0aGlzIGFzIGlmIGV2ZXJ5IGtleSBpbgoJ CSAqIHRoZSBpbmRleCBoYWQgYmVlbiBsaXN0ZWQgaW4gdGhlIHF1ZXJ5OyBpcyB0aGF0IHJl YXNvbmFibGU/CgkJICovCgkJY291bnRzLnBhcnRpYWxFbnRyaWVzID0gMDsKCQljb3VudHMu ZXhhY3RFbnRyaWVzID0gbnVtRW50cmllczsKCQljb3VudHMuc2VhcmNoRW50cmllcyA9IG51 bUVudHJpZXM7Cgl9CgoJLyogV2lsbCB3ZSBoYXZlIG1vcmUgdGhhbiBvbmUgaXRlcmF0aW9u IG9mIGEgbmVzdGxvb3Agc2Nhbj8gKi8KCW91dGVyX3NjYW5zID0gbG9vcF9jb3VudDsKCgkv KgoJICogQ29tcHV0ZSBjb3N0IHRvIGJlZ2luIHNjYW4sIGZpcnN0IG9mIGFsbCwgcGF5IGF0 dGVudGlvbiB0byBwZW5kaW5nCgkgKiBsaXN0LgoJICovCgllbnRyeVBhZ2VzRmV0Y2hlZCA9 IG51bVBlbmRpbmdQYWdlczsKCgkvKgoJICogRXN0aW1hdGUgbnVtYmVyIG9mIGVudHJ5IHBh Z2VzIHJlYWQuICBXZSBuZWVkIHRvIGRvCgkgKiBjb3VudHMuc2VhcmNoRW50cmllcyBzZWFy Y2hlcy4gIFVzZSBhIHBvd2VyIGZ1bmN0aW9uIGFzIGl0IHNob3VsZCBiZSwKCSAqIGJ1dCB0 dXBsZXMgb24gbGVhZiBwYWdlcyB1c3VhbGx5IGlzIG11Y2ggZ3JlYXRlci4gSGVyZSB3ZSBp bmNsdWRlIGFsbAoJICogc2VhcmNoZXMgaW4gZW50cnkgdHJlZSwgaW5jbHVkaW5nIHNlYXJj aCBvZiBmaXJzdCBlbnRyeSBpbiBwYXJ0aWFsCgkgKiBtYXRjaCBhbGdvcml0aG0KCSAqLwoJ ZW50cnlQYWdlc0ZldGNoZWQgKz0gY2VpbChjb3VudHMuc2VhcmNoRW50cmllcyAqIHJpbnQo cG93KG51bUVudHJ5UGFnZXMsIDAuMTUpKSk7CgoJLyoKCSAqIEFkZCBhbiBlc3RpbWF0ZSBv ZiBlbnRyeSBwYWdlcyByZWFkIGJ5IHBhcnRpYWwgbWF0Y2ggYWxnb3JpdGhtLiBJdCdzIGEK CSAqIHNjYW4gb3ZlciBsZWFmIHBhZ2VzIGluIGVudHJ5IHRyZWUuICBXZSBoYXZlbid0IGFu eSB1c2VmdWwgc3RhdHMgaGVyZSwKCSAqIHNvIGVzdGltYXRlIGl0IGFzIHByb3BvcnRpb24u ICBCZWNhdXNlIGNvdW50cy5wYXJ0aWFsRW50cmllcyBpcyByZWFsbHkKCSAqIHByZXR0eSBi b2d1cyAoc2VlIGNvZGUgYWJvdmUpLCBpdCdzIHBvc3NpYmxlIHRoYXQgaXQgaXMgbW9yZSB0 aGFuCgkgKiBudW1FbnRyaWVzOyBjbGFtcCB0aGUgcHJvcG9ydGlvbiB0byBlbnN1cmUgc2Fu aXR5LgoJICovCglwYXJ0aWFsU2NhbGUgPSBjb3VudHMucGFydGlhbEVudHJpZXMgLyBudW1F bnRyaWVzOwoJcGFydGlhbFNjYWxlID0gTWluKHBhcnRpYWxTY2FsZSwgMS4wKTsKCgllbnRy eVBhZ2VzRmV0Y2hlZCArPSBjZWlsKG51bUVudHJ5UGFnZXMgKiBwYXJ0aWFsU2NhbGUpOwoK CS8qCgkgKiBQYXJ0aWFsIG1hdGNoIGFsZ29yaXRobSByZWFkcyBhbGwgZGF0YSBwYWdlcyBi ZWZvcmUgZG9pbmcgYWN0dWFsIHNjYW4sCgkgKiBzbyBpdCdzIGEgc3RhcnR1cCBjb3N0LiAg QWdhaW4sIHdlIGhhdmVuJ3QgYW55IHVzZWZ1bCBzdGF0cyBoZXJlLCBzbwoJICogZXN0aW1h dGUgaXQgYXMgcHJvcG9ydGlvbi4KCSAqLwoJZGF0YVBhZ2VzRmV0Y2hlZCA9IGNlaWwobnVt RGF0YVBhZ2VzICogcGFydGlhbFNjYWxlKTsKCgkqaW5kZXhTdGFydHVwQ29zdCA9IDA7Cgkq aW5kZXhUb3RhbENvc3QgPSAwOwoKCS8qCgkgKiBBZGQgYSBDUFUtY29zdCBjb21wb25lbnQg dG8gcmVwcmVzZW50IHRoZSBjb3N0cyBvZiBpbml0aWFsIGVudHJ5IGJ0cmVlCgkgKiBkZXNj ZW50LiAgV2UgZG9uJ3QgY2hhcmdlIGFueSBJL08gY29zdCBmb3IgdG91Y2hpbmcgdXBwZXIg YnRyZWUgbGV2ZWxzLAoJICogc2luY2UgdGhleSB0ZW5kIHRvIHN0YXkgaW4gY2FjaGUsIGJ1 dCB3ZSBzdGlsbCBoYXZlIHRvIGRvIGFib3V0IGxvZzIoTikKCSAqIGNvbXBhcmlzb25zIHRv IGRlc2NlbmQgYSBidHJlZSBvZiBOIGxlYWYgdHVwbGVzLiAgV2UgY2hhcmdlIG9uZQoJICog Y3B1X29wZXJhdG9yX2Nvc3QgcGVyIGNvbXBhcmlzb24uCgkgKgoJICogSWYgdGhlcmUgYXJl IFNjYWxhckFycmF5T3BFeHBycywgY2hhcmdlIHRoaXMgb25jZSBwZXIgU0Egc2Nhbi4gIFRo ZQoJICogb25lcyBhZnRlciB0aGUgZmlyc3Qgb25lIGFyZSBub3Qgc3RhcnR1cCBjb3N0IHNv IGZhciBhcyB0aGUgb3ZlcmFsbAoJICogcGxhbiBpcyBjb25jZXJuZWQsIHNvIGFkZCB0aGVt IG9ubHkgdG8gInRvdGFsIiBjb3N0LgoJICovCglpZiAobnVtRW50cmllcyA+IDEpCQkJLyog YXZvaWQgY29tcHV0aW5nIGxvZygwKSAqLwoJewoJCWRlc2NlbnRDb3N0ID0gY2VpbChsb2co bnVtRW50cmllcykgLyBsb2coMi4wKSkgKiBjcHVfb3BlcmF0b3JfY29zdDsKCQkqaW5kZXhT dGFydHVwQ29zdCArPSBkZXNjZW50Q29zdCAqIGNvdW50cy5zZWFyY2hFbnRyaWVzOwoJCSpp bmRleFRvdGFsQ29zdCArPSBjb3VudHMuYXJyYXlTY2FucyAqIGRlc2NlbnRDb3N0ICogY291 bnRzLnNlYXJjaEVudHJpZXM7Cgl9CgoJLyoKCSAqIEFkZCBhIGNwdSBjb3N0IHBlciBlbnRy eS1wYWdlIGZldGNoZWQuIFRoaXMgaXMgbm90IGFtb3J0aXplZCBvdmVyIGEKCSAqIGxvb3Au CgkgKi8KCSppbmRleFN0YXJ0dXBDb3N0ICs9IGVudHJ5UGFnZXNGZXRjaGVkICogREVGQVVM VF9QQUdFX0NQVV9NVUxUSVBMSUVSICogY3B1X29wZXJhdG9yX2Nvc3Q7CgkqaW5kZXhUb3Rh bENvc3QgKz0gZW50cnlQYWdlc0ZldGNoZWQgKiBjb3VudHMuYXJyYXlTY2FucyAqIERFRkFV TFRfUEFHRV9DUFVfTVVMVElQTElFUiAqIGNwdV9vcGVyYXRvcl9jb3N0OwoKCS8qCgkgKiBB ZGQgYSBjcHUgY29zdCBwZXIgZGF0YS1wYWdlIGZldGNoZWQuIFRoaXMgaXMgYWxzbyBub3Qg YW1vcnRpemVkIG92ZXIgYQoJICogbG9vcC4gU2luY2UgdGhvc2UgYXJlIHRoZSBkYXRhIHBh Z2VzIGZyb20gdGhlIHBhcnRpYWwgbWF0Y2ggYWxnb3JpdGhtLAoJICogY2hhcmdlIHRoZW0g YXMgc3RhcnR1cCBjb3N0LgoJICovCgkqaW5kZXhTdGFydHVwQ29zdCArPSBERUZBVUxUX1BB R0VfQ1BVX01VTFRJUExJRVIgKiBjcHVfb3BlcmF0b3JfY29zdCAqIGRhdGFQYWdlc0ZldGNo ZWQ7CgoJLyoKCSAqIFNpbmNlIHdlIGFkZCB0aGUgc3RhcnR1cCBjb3N0IHRvIHRoZSB0b3Rh bCBjb3N0IGxhdGVyIG9uLCByZW1vdmUgdGhlCgkgKiBpbml0aWFsIGFycmF5c2NhbiBmcm9t IHRoZSB0b3RhbC4KCSAqLwoJKmluZGV4VG90YWxDb3N0ICs9IGRhdGFQYWdlc0ZldGNoZWQg KiAoY291bnRzLmFycmF5U2NhbnMgLSAxKSAqIERFRkFVTFRfUEFHRV9DUFVfTVVMVElQTElF UiAqIGNwdV9vcGVyYXRvcl9jb3N0OwoKCS8qCgkgKiBDYWxjdWxhdGUgY2FjaGUgZWZmZWN0 cyBpZiBtb3JlIHRoYW4gb25lIHNjYW4gZHVlIHRvIG5lc3Rsb29wcyBvciBhcnJheQoJICog cXVhbHMuICBUaGUgcmVzdWx0IGlzIHByby1yYXRlZCBwZXIgbmVzdGxvb3Agc2NhbiwgYnV0 IHRoZSBhcnJheSBxdWFsCgkgKiBmYWN0b3Igc2hvdWxkbid0IGJlIHByby1yYXRlZCAoY29t cGFyZSBnZW5lcmljY29zdGVzdGltYXRlKS4KCSAqLwoJaWYgKG91dGVyX3NjYW5zID4gMSB8 fCBjb3VudHMuYXJyYXlTY2FucyA+IDEpCgl7CgkJZW50cnlQYWdlc0ZldGNoZWQgKj0gb3V0 ZXJfc2NhbnMgKiBjb3VudHMuYXJyYXlTY2FuczsKCQllbnRyeVBhZ2VzRmV0Y2hlZCA9IGlu ZGV4X3BhZ2VzX2ZldGNoZWQoZW50cnlQYWdlc0ZldGNoZWQsCgkJCQkJCQkJCQkJCShCbG9j a051bWJlcikgbnVtRW50cnlQYWdlcywKCQkJCQkJCQkJCQkJbnVtRW50cnlQYWdlcywgcm9v dCk7CgkJZW50cnlQYWdlc0ZldGNoZWQgLz0gb3V0ZXJfc2NhbnM7CgkJZGF0YVBhZ2VzRmV0 Y2hlZCAqPSBvdXRlcl9zY2FucyAqIGNvdW50cy5hcnJheVNjYW5zOwoJCWRhdGFQYWdlc0Zl dGNoZWQgPSBpbmRleF9wYWdlc19mZXRjaGVkKGRhdGFQYWdlc0ZldGNoZWQsCgkJCQkJCQkJ CQkJICAgKEJsb2NrTnVtYmVyKSBudW1EYXRhUGFnZXMsCgkJCQkJCQkJCQkJICAgbnVtRGF0 YVBhZ2VzLCByb290KTsKCQlkYXRhUGFnZXNGZXRjaGVkIC89IG91dGVyX3NjYW5zOwoJfQoK CS8qCgkgKiBIZXJlIHdlIHVzZSByYW5kb20gcGFnZSBjb3N0IGJlY2F1c2UgbG9naWNhbGx5 LWNsb3NlIHBhZ2VzIGNvdWxkIGJlIGZhcgoJICogYXBhcnQgb24gZGlzay4KCSAqLwoJKmlu ZGV4U3RhcnR1cENvc3QgKz0gKGVudHJ5UGFnZXNGZXRjaGVkICsgZGF0YVBhZ2VzRmV0Y2hl ZCkgKiBzcGNfcmFuZG9tX3BhZ2VfY29zdDsKCgkvKgoJICogTm93IGNvbXB1dGUgdGhlIG51 bWJlciBvZiBkYXRhIHBhZ2VzIGZldGNoZWQgZHVyaW5nIHRoZSBzY2FuLgoJICoKCSAqIFdl IGFzc3VtZSBldmVyeSBlbnRyeSB0byBoYXZlIHRoZSBzYW1lIG51bWJlciBvZiBpdGVtcywg YW5kIHRoYXQgdGhlcmUKCSAqIGlzIG5vIG92ZXJsYXAgYmV0d2VlbiB0aGVtLiAoWFhYOiB0 c3ZlY3RvciBhbmQgYXJyYXkgb3BjbGFzc2VzIGNvbGxlY3QKCSAqIHN0YXRpc3RpY3Mgb24g dGhlIGZyZXF1ZW5jeSBvZiBpbmRpdmlkdWFsIGtleXM7IGl0IHdvdWxkIGJlIG5pY2UgdG8g dXNlCgkgKiB0aG9zZSBoZXJlLikKCSAqLwoJZGF0YVBhZ2VzRmV0Y2hlZCA9IGNlaWwobnVt RGF0YVBhZ2VzICogY291bnRzLmV4YWN0RW50cmllcyAvIG51bUVudHJpZXMpOwoKCS8qCgkg KiBJZiB0aGVyZSBpcyBhIGxvdCBvZiBvdmVybGFwIGFtb25nIHRoZSBlbnRyaWVzLCBpbiBw YXJ0aWN1bGFyIGlmIG9uZSBvZgoJICogdGhlIGVudHJpZXMgaXMgdmVyeSBmcmVxdWVudCwg dGhlIGFib3ZlIGNhbGN1bGF0aW9uIGNhbiBncm9zc2x5CgkgKiB1bmRlci1lc3RpbWF0ZS4g IEFzIGEgc2ltcGxlIGNyb3NzLWNoZWNrLCBjYWxjdWxhdGUgYSBsb3dlciBib3VuZCBiYXNl ZAoJICogb24gdGhlIG92ZXJhbGwgc2VsZWN0aXZpdHkgb2YgdGhlIHF1YWxzLiAgQXQgYSBt aW5pbXVtLCB3ZSBtdXN0IHJlYWQKCSAqIG9uZSBpdGVtIHBvaW50ZXIgZm9yIGVhY2ggbWF0 Y2hpbmcgZW50cnkuCgkgKgoJICogVGhlIHdpZHRoIG9mIGVhY2ggaXRlbSBwb2ludGVyIHZh cmllcywgYmFzZWQgb24gdGhlIGxldmVsIG9mCgkgKiBjb21wcmVzc2lvbi4gIFdlIGRvbid0 IGhhdmUgc3RhdGlzdGljcyBvbiB0aGF0LCBidXQgYW4gYXZlcmFnZSBvZgoJICogYXJvdW5k IDMgYnl0ZXMgcGVyIGl0ZW0gaXMgZmFpcmx5IHR5cGljYWwuCgkgKi8KCWRhdGFQYWdlc0Zl dGNoZWRCeVNlbCA9IGNlaWwoKmluZGV4U2VsZWN0aXZpdHkgKgoJCQkJCQkJCSAobnVtVHVw bGVzIC8gKEJMQ0tTWiAvIDMpKSk7CglpZiAoZGF0YVBhZ2VzRmV0Y2hlZEJ5U2VsID4gZGF0 YVBhZ2VzRmV0Y2hlZCkKCQlkYXRhUGFnZXNGZXRjaGVkID0gZGF0YVBhZ2VzRmV0Y2hlZEJ5 U2VsOwoKCS8qIEFkZCBvbmUgcGFnZSBjcHUtY29zdCB0byB0aGUgc3RhcnR1cCBjb3N0ICov CgkqaW5kZXhTdGFydHVwQ29zdCArPSBERUZBVUxUX1BBR0VfQ1BVX01VTFRJUExJRVIgKiBj cHVfb3BlcmF0b3JfY29zdCAqIGNvdW50cy5zZWFyY2hFbnRyaWVzOwoKCS8qCgkgKiBBZGQg b25jZSBhZ2FpbiBhIENQVS1jb3N0IGZvciB0aG9zZSBkYXRhIHBhZ2VzLCBiZWZvcmUgYW1v cnRpemluZyBmb3IKCSAqIGNhY2hlLgoJICovCgkqaW5kZXhUb3RhbENvc3QgKz0gZGF0YVBh Z2VzRmV0Y2hlZCAqIGNvdW50cy5hcnJheVNjYW5zICogREVGQVVMVF9QQUdFX0NQVV9NVUxU SVBMSUVSICogY3B1X29wZXJhdG9yX2Nvc3Q7CgoJLyogQWNjb3VudCBmb3IgY2FjaGUgZWZm ZWN0cywgdGhlIHNhbWUgYXMgYWJvdmUgKi8KCWlmIChvdXRlcl9zY2FucyA+IDEgfHwgY291 bnRzLmFycmF5U2NhbnMgPiAxKQoJewoJCWRhdGFQYWdlc0ZldGNoZWQgKj0gb3V0ZXJfc2Nh bnMgKiBjb3VudHMuYXJyYXlTY2FuczsKCQlkYXRhUGFnZXNGZXRjaGVkID0gaW5kZXhfcGFn ZXNfZmV0Y2hlZChkYXRhUGFnZXNGZXRjaGVkLAoJCQkJCQkJCQkJCSAgIChCbG9ja051bWJl cikgbnVtRGF0YVBhZ2VzLAoJCQkJCQkJCQkJCSAgIG51bURhdGFQYWdlcywgcm9vdCk7CgkJ ZGF0YVBhZ2VzRmV0Y2hlZCAvPSBvdXRlcl9zY2FuczsKCX0KCgkvKiBBbmQgYXBwbHkgcmFu ZG9tX3BhZ2VfY29zdCBhcyB0aGUgY29zdCBwZXIgcGFnZSAqLwoJKmluZGV4VG90YWxDb3N0 ICs9ICppbmRleFN0YXJ0dXBDb3N0ICsKCQlkYXRhUGFnZXNGZXRjaGVkICogc3BjX3JhbmRv bV9wYWdlX2Nvc3Q7CgoJLyoKCSAqIEFkZCBvbiBpbmRleCBxdWFsIGV2YWwgY29zdHMsIG11 Y2ggYXMgaW4gZ2VuZXJpY2Nvc3Rlc3RpbWF0ZS4gV2UgY2hhcmdlCgkgKiBjcHUgYnV0IHdl IGNhbiBkaXNyZWdhcmQgaW5kZXhvcmRlcmJ5cywgc2luY2UgR0lOIGRvZXNuJ3Qgc3VwcG9y dAoJICogdGhvc2UuCgkgKi8KCXF1YWxfYXJnX2Nvc3QgPSBpbmRleF9vdGhlcl9vcGVyYW5k c19ldmFsX2Nvc3Qocm9vdCwgaW5kZXhRdWFscyk7CglxdWFsX29wX2Nvc3QgPSBjcHVfb3Bl cmF0b3JfY29zdCAqIGxpc3RfbGVuZ3RoKGluZGV4UXVhbHMpOwoKCSppbmRleFN0YXJ0dXBD b3N0ICs9IHF1YWxfYXJnX2Nvc3Q7CgkqaW5kZXhUb3RhbENvc3QgKz0gcXVhbF9hcmdfY29z dDsKCgkvKgoJICogQWRkIGEgY3B1IGNvc3QgcGVyIHNlYXJjaCBlbnRyeSwgY29ycmVzcG9u ZGluZyB0byB0aGUgYWN0dWFsIHZpc2l0ZWQKCSAqIGVudHJpZXMuCgkgKi8KCSppbmRleFRv dGFsQ29zdCArPSAoY291bnRzLnNlYXJjaEVudHJpZXMgKiBjb3VudHMuYXJyYXlTY2Fucykg KiAocXVhbF9vcF9jb3N0KTsKCS8qIE5vdyBhZGQgYSBjcHUgY29zdCBwZXIgdHVwbGUgaW4g dGhlIHBvc3RpbmcgbGlzdHMgLyB0cmVlcyAqLwoJKmluZGV4VG90YWxDb3N0ICs9IChudW1U dXBsZXMgKiAqaW5kZXhTZWxlY3Rpdml0eSkgKiAoY3B1X2luZGV4X3R1cGxlX2Nvc3QpOwoJ KmluZGV4UGFnZXMgPSBkYXRhUGFnZXNGZXRjaGVkOwp9CgovKgogKiBCUklOIGhhcyBzZWFy Y2ggYmVoYXZpb3IgY29tcGxldGVseSBkaWZmZXJlbnQgZnJvbSBvdGhlciBpbmRleCB0eXBl cwogKi8Kdm9pZApicmluY29zdGVzdGltYXRlKFBsYW5uZXJJbmZvICpyb290LCBJbmRleFBh dGggKnBhdGgsIGRvdWJsZSBsb29wX2NvdW50LAoJCQkJIENvc3QgKmluZGV4U3RhcnR1cENv c3QsIENvc3QgKmluZGV4VG90YWxDb3N0LAoJCQkJIFNlbGVjdGl2aXR5ICppbmRleFNlbGVj dGl2aXR5LCBkb3VibGUgKmluZGV4Q29ycmVsYXRpb24sCgkJCQkgZG91YmxlICppbmRleFBh Z2VzKQp7CglJbmRleE9wdEluZm8gKmluZGV4ID0gcGF0aC0+aW5kZXhpbmZvOwoJTGlzdAkg ICAqaW5kZXhRdWFscyA9IGdldF9xdWFsc19mcm9tX2luZGV4Y2xhdXNlcyhwYXRoLT5pbmRl eGNsYXVzZXMpOwoJZG91YmxlCQludW1QYWdlcyA9IGluZGV4LT5wYWdlczsKCVJlbE9wdElu Zm8gKmJhc2VyZWwgPSBpbmRleC0+cmVsOwoJUmFuZ2VUYmxFbnRyeSAqcnRlID0gcGxhbm5l cl9ydF9mZXRjaChiYXNlcmVsLT5yZWxpZCwgcm9vdCk7CglDb3N0CQlzcGNfc2VxX3BhZ2Vf Y29zdDsKCUNvc3QJCXNwY19yYW5kb21fcGFnZV9jb3N0OwoJZG91YmxlCQlxdWFsX2FyZ19j b3N0OwoJZG91YmxlCQlxdWFsU2VsZWN0aXZpdHk7CglCcmluU3RhdHNEYXRhIHN0YXRzRGF0 YTsKCWRvdWJsZQkJaW5kZXhSYW5nZXM7Cglkb3VibGUJCW1pbmltYWxSYW5nZXM7Cglkb3Vi bGUJCWVzdGltYXRlZFJhbmdlczsKCWRvdWJsZQkJc2VsZWM7CglSZWxhdGlvbglpbmRleFJl bDsKCUxpc3RDZWxsICAgKmw7CglWYXJpYWJsZVN0YXREYXRhIHZhcmRhdGE7CgoJQXNzZXJ0 KHJ0ZS0+cnRla2luZCA9PSBSVEVfUkVMQVRJT04pOwoKCS8qIGZldGNoIGVzdGltYXRlZCBw YWdlIGNvc3QgZm9yIHRoZSB0YWJsZXNwYWNlIGNvbnRhaW5pbmcgdGhlIGluZGV4ICovCgln ZXRfdGFibGVzcGFjZV9wYWdlX2Nvc3RzKGluZGV4LT5yZWx0YWJsZXNwYWNlLAoJCQkJCQkJ ICAmc3BjX3JhbmRvbV9wYWdlX2Nvc3QsCgkJCQkJCQkgICZzcGNfc2VxX3BhZ2VfY29zdCk7 CgoJLyoKCSAqIE9idGFpbiBzb21lIGRhdGEgZnJvbSB0aGUgaW5kZXggaXRzZWxmLCBpZiBw b3NzaWJsZS4gIE90aGVyd2lzZSBpbnZlbnQKCSAqIHNvbWUgcGxhdXNpYmxlIGludGVybmFs IHN0YXRpc3RpY3MgYmFzZWQgb24gdGhlIHJlbGF0aW9uIHBhZ2UgY291bnQuCgkgKi8KCWlm ICghaW5kZXgtPmh5cG90aGV0aWNhbCkKCXsKCQkvKgoJCSAqIEEgbG9jayBzaG91bGQgaGF2 ZSBhbHJlYWR5IGJlZW4gb2J0YWluZWQgb24gdGhlIGluZGV4IGluIHBsYW5jYXQuYy4KCQkg Ki8KCQlpbmRleFJlbCA9IGluZGV4X29wZW4oaW5kZXgtPmluZGV4b2lkLCBOb0xvY2spOwoJ CWJyaW5HZXRTdGF0cyhpbmRleFJlbCwgJnN0YXRzRGF0YSk7CgkJaW5kZXhfY2xvc2UoaW5k ZXhSZWwsIE5vTG9jayk7CgoJCS8qIHdvcmsgb3V0IHRoZSBhY3R1YWwgbnVtYmVyIG9mIHJh bmdlcyBpbiB0aGUgaW5kZXggKi8KCQlpbmRleFJhbmdlcyA9IE1heChjZWlsKChkb3VibGUp IGJhc2VyZWwtPnBhZ2VzIC8KCQkJCQkJCSAgIHN0YXRzRGF0YS5wYWdlc1BlclJhbmdlKSwg MS4wKTsKCX0KCWVsc2UKCXsKCQkvKgoJCSAqIEFzc3VtZSBkZWZhdWx0IG51bWJlciBvZiBw YWdlcyBwZXIgcmFuZ2UsIGFuZCBlc3RpbWF0ZSB0aGUgbnVtYmVyCgkJICogb2YgcmFuZ2Vz IGJhc2VkIG9uIHRoYXQuCgkJICovCgkJaW5kZXhSYW5nZXMgPSBNYXgoY2VpbCgoZG91Ymxl KSBiYXNlcmVsLT5wYWdlcyAvCgkJCQkJCQkgICBCUklOX0RFRkFVTFRfUEFHRVNfUEVSX1JB TkdFKSwgMS4wKTsKCgkJc3RhdHNEYXRhLnBhZ2VzUGVyUmFuZ2UgPSBCUklOX0RFRkFVTFRf UEFHRVNfUEVSX1JBTkdFOwoJCXN0YXRzRGF0YS5yZXZtYXBOdW1QYWdlcyA9IChpbmRleFJh bmdlcyAvIFJFVk1BUF9QQUdFX01BWElURU1TKSArIDE7Cgl9CgoJLyoKCSAqIENvbXB1dGUg aW5kZXggY29ycmVsYXRpb24KCSAqCgkgKiBCZWNhdXNlIHdlIGNhbiB1c2UgYWxsIGluZGV4 IHF1YWxzIGVxdWFsbHkgd2hlbiBzY2FubmluZywgd2UgY2FuIHVzZQoJICogdGhlIGxhcmdl c3QgY29ycmVsYXRpb24gKGluIGFic29sdXRlIHZhbHVlKSBhbW9uZyBjb2x1bW5zIHVzZWQg YnkgdGhlCgkgKiBxdWVyeS4gIFN0YXJ0IGF0IHplcm8sIHRoZSB3b3JzdCBwb3NzaWJsZSBj YXNlLiAgSWYgd2UgY2Fubm90IGZpbmQgYW55CgkgKiBjb3JyZWxhdGlvbiBzdGF0aXN0aWNz LCB3ZSB3aWxsIGtlZXAgaXQgYXMgMC4KCSAqLwoJKmluZGV4Q29ycmVsYXRpb24gPSAwOwoK CWZvcmVhY2gobCwgcGF0aC0+aW5kZXhjbGF1c2VzKQoJewoJCUluZGV4Q2xhdXNlICppY2xh dXNlID0gbGZpcnN0X25vZGUoSW5kZXhDbGF1c2UsIGwpOwoJCUF0dHJOdW1iZXIJYXR0bnVt ID0gaW5kZXgtPmluZGV4a2V5c1tpY2xhdXNlLT5pbmRleGNvbF07CgoJCS8qIGF0dGVtcHQg dG8gbG9va3VwIHN0YXRzIGluIHJlbGF0aW9uIGZvciB0aGlzIGluZGV4IGNvbHVtbiAqLwoJ CWlmIChhdHRudW0gIT0gMCkKCQl7CgkJCS8qIFNpbXBsZSB2YXJpYWJsZSAtLSBsb29rIHRv IHN0YXRzIGZvciB0aGUgdW5kZXJseWluZyB0YWJsZSAqLwoJCQlpZiAoZ2V0X3JlbGF0aW9u X3N0YXRzX2hvb2sgJiYKCQkJCSgqZ2V0X3JlbGF0aW9uX3N0YXRzX2hvb2spIChyb290LCBy dGUsIGF0dG51bSwgJnZhcmRhdGEpKQoJCQl7CgkJCQkvKgoJCQkJICogVGhlIGhvb2sgdG9v ayBjb250cm9sIG9mIGFjcXVpcmluZyBhIHN0YXRzIHR1cGxlLiAgSWYgaXQKCQkJCSAqIGRp ZCBzdXBwbHkgYSB0dXBsZSwgaXQnZCBiZXR0ZXIgaGF2ZSBzdXBwbGllZCBhIGZyZWVmdW5j LgoJCQkJICovCgkJCQlpZiAoSGVhcFR1cGxlSXNWYWxpZCh2YXJkYXRhLnN0YXRzVHVwbGUp ICYmICF2YXJkYXRhLmZyZWVmdW5jKQoJCQkJCWVsb2coRVJST1IsCgkJCQkJCSAibm8gZnVu Y3Rpb24gcHJvdmlkZWQgdG8gcmVsZWFzZSB2YXJpYWJsZSBzdGF0cyB3aXRoIik7CgkJCX0K CQkJZWxzZQoJCQl7CgkJCQl2YXJkYXRhLnN0YXRzVHVwbGUgPQoJCQkJCVNlYXJjaFN5c0Nh Y2hlMyhTVEFUUkVMQVRUSU5ILAoJCQkJCQkJCQlPYmplY3RJZEdldERhdHVtKHJ0ZS0+cmVs aWQpLAoJCQkJCQkJCQlJbnQxNkdldERhdHVtKGF0dG51bSksCgkJCQkJCQkJCUJvb2xHZXRE YXR1bShmYWxzZSkpOwoJCQkJdmFyZGF0YS5mcmVlZnVuYyA9IFJlbGVhc2VTeXNDYWNoZTsK CQkJfQoJCX0KCQllbHNlCgkJewoJCQkvKgoJCQkgKiBMb29rcyBsaWtlIHdlJ3ZlIGZvdW5k IGFuIGV4cHJlc3Npb24gY29sdW1uIGluIHRoZSBpbmRleC4gTGV0J3MKCQkJICogc2VlIGlm IHRoZXJlJ3MgYW55IHN0YXRzIGZvciBpdC4KCQkJICovCgoJCQkvKiBnZXQgdGhlIGF0dG51 bSBmcm9tIHRoZSAwLWJhc2VkIGluZGV4LiAqLwoJCQlhdHRudW0gPSBpY2xhdXNlLT5pbmRl eGNvbCArIDE7CgoJCQlpZiAoZ2V0X2luZGV4X3N0YXRzX2hvb2sgJiYKCQkJCSgqZ2V0X2lu ZGV4X3N0YXRzX2hvb2spIChyb290LCBpbmRleC0+aW5kZXhvaWQsIGF0dG51bSwgJnZhcmRh dGEpKQoJCQl7CgkJCQkvKgoJCQkJICogVGhlIGhvb2sgdG9vayBjb250cm9sIG9mIGFjcXVp cmluZyBhIHN0YXRzIHR1cGxlLiAgSWYgaXQKCQkJCSAqIGRpZCBzdXBwbHkgYSB0dXBsZSwg aXQnZCBiZXR0ZXIgaGF2ZSBzdXBwbGllZCBhIGZyZWVmdW5jLgoJCQkJICovCgkJCQlpZiAo SGVhcFR1cGxlSXNWYWxpZCh2YXJkYXRhLnN0YXRzVHVwbGUpICYmCgkJCQkJIXZhcmRhdGEu ZnJlZWZ1bmMpCgkJCQkJZWxvZyhFUlJPUiwgIm5vIGZ1bmN0aW9uIHByb3ZpZGVkIHRvIHJl bGVhc2UgdmFyaWFibGUgc3RhdHMgd2l0aCIpOwoJCQl9CgkJCWVsc2UKCQkJewoJCQkJdmFy ZGF0YS5zdGF0c1R1cGxlID0gU2VhcmNoU3lzQ2FjaGUzKFNUQVRSRUxBVFRJTkgsCgkJCQkJ CQkJCQkJCQkgT2JqZWN0SWRHZXREYXR1bShpbmRleC0+aW5kZXhvaWQpLAoJCQkJCQkJCQkJ CQkJIEludDE2R2V0RGF0dW0oYXR0bnVtKSwKCQkJCQkJCQkJCQkJCSBCb29sR2V0RGF0dW0o ZmFsc2UpKTsKCQkJCXZhcmRhdGEuZnJlZWZ1bmMgPSBSZWxlYXNlU3lzQ2FjaGU7CgkJCX0K CQl9CgoJCWlmIChIZWFwVHVwbGVJc1ZhbGlkKHZhcmRhdGEuc3RhdHNUdXBsZSkpCgkJewoJ CQlBdHRTdGF0c1Nsb3Qgc3Nsb3Q7CgoJCQlpZiAoZ2V0X2F0dHN0YXRzc2xvdCgmc3Nsb3Qs IHZhcmRhdGEuc3RhdHNUdXBsZSwKCQkJCQkJCQkgU1RBVElTVElDX0tJTkRfQ09SUkVMQVRJ T04sIEludmFsaWRPaWQsCgkJCQkJCQkJIEFUVFNUQVRTU0xPVF9OVU1CRVJTKSkKCQkJewoJ CQkJZG91YmxlCQl2YXJDb3JyZWxhdGlvbiA9IDAuMDsKCgkJCQlpZiAoc3Nsb3Qubm51bWJl cnMgPiAwKQoJCQkJCXZhckNvcnJlbGF0aW9uID0gZmFicyhzc2xvdC5udW1iZXJzWzBdKTsK CgkJCQlpZiAodmFyQ29ycmVsYXRpb24gPiAqaW5kZXhDb3JyZWxhdGlvbikKCQkJCQkqaW5k ZXhDb3JyZWxhdGlvbiA9IHZhckNvcnJlbGF0aW9uOwoKCQkJCWZyZWVfYXR0c3RhdHNzbG90 KCZzc2xvdCk7CgkJCX0KCQl9CgoJCVJlbGVhc2VWYXJpYWJsZVN0YXRzKHZhcmRhdGEpOwoJ fQoKCXF1YWxTZWxlY3Rpdml0eSA9IGNsYXVzZWxpc3Rfc2VsZWN0aXZpdHkocm9vdCwgaW5k ZXhRdWFscywKCQkJCQkJCQkJCQkgYmFzZXJlbC0+cmVsaWQsCgkJCQkJCQkJCQkJIEpPSU5f SU5ORVIsIE5VTEwpOwoKCS8qCgkgKiBOb3cgY2FsY3VsYXRlIHRoZSBtaW5pbXVtIHBvc3Np YmxlIHJhbmdlcyB3ZSBjb3VsZCBtYXRjaCB3aXRoIGlmIGFsbCBvZgoJICogdGhlIHJvd3Mg d2VyZSBpbiB0aGUgcGVyZmVjdCBvcmRlciBpbiB0aGUgdGFibGUncyBoZWFwLgoJICovCglt aW5pbWFsUmFuZ2VzID0gY2VpbChpbmRleFJhbmdlcyAqIHF1YWxTZWxlY3Rpdml0eSk7CgoJ LyoKCSAqIE5vdyBlc3RpbWF0ZSB0aGUgbnVtYmVyIG9mIHJhbmdlcyB0aGF0IHdlJ2xsIHRv dWNoIGJ5IHVzaW5nIHRoZQoJICogaW5kZXhDb3JyZWxhdGlvbiBmcm9tIHRoZSBzdGF0cy4g Q2FyZWZ1bCBub3QgdG8gZGl2aWRlIGJ5IHplcm8gKG5vdGUKCSAqIHdlJ3JlIHVzaW5nIHRo ZSBhYnNvbHV0ZSB2YWx1ZSBvZiB0aGUgY29ycmVsYXRpb24pLgoJICovCglpZiAoKmluZGV4 Q29ycmVsYXRpb24gPCAxLjBlLTEwKQoJCWVzdGltYXRlZFJhbmdlcyA9IGluZGV4UmFuZ2Vz OwoJZWxzZQoJCWVzdGltYXRlZFJhbmdlcyA9IE1pbihtaW5pbWFsUmFuZ2VzIC8gKmluZGV4 Q29ycmVsYXRpb24sIGluZGV4UmFuZ2VzKTsKCgkvKiB3ZSBleHBlY3QgdG8gdmlzaXQgdGhp cyBwb3J0aW9uIG9mIHRoZSB0YWJsZSAqLwoJc2VsZWMgPSBlc3RpbWF0ZWRSYW5nZXMgLyBp bmRleFJhbmdlczsKCglDTEFNUF9QUk9CQUJJTElUWShzZWxlYyk7CgoJKmluZGV4U2VsZWN0 aXZpdHkgPSBzZWxlYzsKCgkvKgoJICogQ29tcHV0ZSB0aGUgaW5kZXggcXVhbCBjb3N0cywg bXVjaCBhcyBpbiBnZW5lcmljY29zdGVzdGltYXRlLCB0byBhZGQgdG8KCSAqIHRoZSBpbmRl eCBjb3N0cy4gIFdlIGNhbiBkaXNyZWdhcmQgaW5kZXhvcmRlcmJ5cywgc2luY2UgQlJJTiBk b2Vzbid0CgkgKiBzdXBwb3J0IHRob3NlLgoJICovCglxdWFsX2FyZ19jb3N0ID0gaW5kZXhf b3RoZXJfb3BlcmFuZHNfZXZhbF9jb3N0KHJvb3QsIGluZGV4UXVhbHMpOwoKCS8qCgkgKiBD b21wdXRlIHRoZSBzdGFydHVwIGNvc3QgYXMgdGhlIGNvc3QgdG8gcmVhZCB0aGUgd2hvbGUg cmV2bWFwCgkgKiBzZXF1ZW50aWFsbHksIGluY2x1ZGluZyB0aGUgY29zdCB0byBleGVjdXRl IHRoZSBpbmRleCBxdWFscy4KCSAqLwoJKmluZGV4U3RhcnR1cENvc3QgPQoJCXNwY19zZXFf cGFnZV9jb3N0ICogc3RhdHNEYXRhLnJldm1hcE51bVBhZ2VzICogbG9vcF9jb3VudDsKCSpp bmRleFN0YXJ0dXBDb3N0ICs9IHF1YWxfYXJnX2Nvc3Q7CgoJLyoKCSAqIFRvIHJlYWQgYSBC UklOIGluZGV4IHRoZXJlIG1pZ2h0IGJlIGEgYml0IG9mIGJhY2sgYW5kIGZvcnRoIG92ZXIK CSAqIHJlZ3VsYXIgcGFnZXMsIGFzIHJldm1hcCBtaWdodCBwb2ludCB0byB0aGVtIG91dCBv ZiBzZXF1ZW50aWFsIG9yZGVyOwoJICogY2FsY3VsYXRlIHRoZSB0b3RhbCBjb3N0IGFzIHJl YWRpbmcgdGhlIHdob2xlIGluZGV4IGluIHJhbmRvbSBvcmRlci4KCSAqLwoJKmluZGV4VG90 YWxDb3N0ID0gKmluZGV4U3RhcnR1cENvc3QgKwoJCXNwY19yYW5kb21fcGFnZV9jb3N0ICog KG51bVBhZ2VzIC0gc3RhdHNEYXRhLnJldm1hcE51bVBhZ2VzKSAqIGxvb3BfY291bnQ7CgoJ LyoKCSAqIENoYXJnZSBhIHNtYWxsIGFtb3VudCBwZXIgcmFuZ2UgdHVwbGUgd2hpY2ggd2Ug ZXhwZWN0IHRvIG1hdGNoIHRvLiBUaGlzCgkgKiBpcyBtZWFudCB0byByZWZsZWN0IHRoZSBj b3N0cyBvZiBtYW5pcHVsYXRpbmcgdGhlIGJpdG1hcC4gVGhlIEJSSU4gc2NhbgoJICogd2ls bCBzZXQgYSBiaXQgZm9yIGVhY2ggcGFnZSBpbiB0aGUgcmFuZ2Ugd2hlbiB3ZSBmaW5kIGEg bWF0Y2hpbmcKCSAqIHJhbmdlLCBzbyB3ZSBtdXN0IG11bHRpcGx5IHRoZSBjaGFyZ2UgYnkg dGhlIG51bWJlciBvZiBwYWdlcyBpbiB0aGUKCSAqIHJhbmdlLgoJICovCgkqaW5kZXhUb3Rh bENvc3QgKz0gMC4xICogY3B1X29wZXJhdG9yX2Nvc3QgKiBlc3RpbWF0ZWRSYW5nZXMgKgoJ CXN0YXRzRGF0YS5wYWdlc1BlclJhbmdlOwoKCSppbmRleFBhZ2VzID0gaW5kZXgtPnBhZ2Vz Owp9CgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC4vdG9hc3RpbmcuYwAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwMDAwNjY0ADAwMDE3NTAAMDAwMTc1MAAwMDAw MDAzMTcwNQAxNTIyMTYwMzc1MAAwMTE3MTAAIDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAdXN0YXIgIAB4bWFuAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAHhtYW4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAALyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAqCiAqIHRvYXN0aW5nLmMKICoJICBUaGlz IGZpbGUgY29udGFpbnMgcm91dGluZXMgdG8gc3VwcG9ydCBjcmVhdGlvbiBvZiB0b2FzdCB0 YWJsZXMKICoKICoKICogUG9ydGlvbnMgQ29weXJpZ2h0IChjKSAxOTk2LTIwMjYsIFBvc3Rn cmVTUUwgR2xvYmFsIERldmVsb3BtZW50IEdyb3VwCiAqIFBvcnRpb25zIENvcHlyaWdodCAo YykgMTk5NCwgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhCiAqCiAq IElERU5USUZJQ0FUSU9OCiAqCSAgc3JjL2JhY2tlbmQvY2F0YWxvZy90b2FzdGluZy5jCiAq CiAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogKi8KI2luY2x1ZGUgInBvc3RncmVzLmgiCgojaW5j bHVkZSAiYWNjZXNzL2dlbmFtLmgiCiNpbmNsdWRlICJhY2Nlc3MvaGVhcGFtLmgiCiNpbmNs dWRlICJhY2Nlc3MvdG9hc3RfY29tcHJlc3Npb24uaCIKI2luY2x1ZGUgImFjY2Vzcy94YWN0 LmgiCiNpbmNsdWRlICJjYXRhbG9nL2JpbmFyeV91cGdyYWRlLmgiCiNpbmNsdWRlICJjYXRh bG9nL2NhdGFsb2cuaCIKI2luY2x1ZGUgImNhdGFsb2cvZGVwZW5kZW5jeS5oIgojaW5jbHVk ZSAiY2F0YWxvZy9oZWFwLmgiCiNpbmNsdWRlICJjYXRhbG9nL2luZGV4LmgiCiNpbmNsdWRl ICJjYXRhbG9nL25hbWVzcGFjZS5oIgojaW5jbHVkZSAiY2F0YWxvZy9wZ19hbS5oIgojaW5j bHVkZSAiY2F0YWxvZy9wZ19uYW1lc3BhY2UuaCIKI2luY2x1ZGUgImNhdGFsb2cvcGdfb3Bj bGFzcy5oIgojaW5jbHVkZSAiY2F0YWxvZy90b2FzdGluZy5oIgojaW5jbHVkZSAibWlzY2Fk bWluLmgiCiNpbmNsdWRlICJub2Rlcy9tYWtlZnVuY3MuaCIKI2luY2x1ZGUgInV0aWxzL2Zt Z3JvaWRzLmgiCiNpbmNsdWRlICJ1dGlscy9yZWwuaCIKI2luY2x1ZGUgInV0aWxzL3N5c2Nh Y2hlLmgiCgpzdGF0aWMgdm9pZCBDaGVja0FuZENyZWF0ZVRvYXN0VGFibGUoT2lkIHJlbE9p ZCwgRGF0dW0gcmVsb3B0aW9ucywKCQkJCQkJCQkJIExPQ0tNT0RFIGxvY2ttb2RlLCBib29s IGNoZWNrLAoJCQkJCQkJCQkgT2lkIE9JRE9sZFRvYXN0KTsKc3RhdGljIGJvb2wgY3JlYXRl X3RvYXN0X3RhYmxlKFJlbGF0aW9uIHJlbCwgT2lkIHRvYXN0T2lkLCBPaWQgdG9hc3RJbmRl eE9pZCwKCQkJCQkJCSAgIERhdHVtIHJlbG9wdGlvbnMsIExPQ0tNT0RFIGxvY2ttb2RlLCBi b29sIGNoZWNrLAoJCQkJCQkJICAgT2lkIE9JRE9sZFRvYXN0KTsKc3RhdGljIGJvb2wgbmVl ZHNfdG9hc3RfdGFibGUoUmVsYXRpb24gcmVsKTsKCgovKgogKiBDcmVhdGVUb2FzdFRhYmxl IHZhcmlhbnRzCiAqCQlJZiB0aGUgdGFibGUgbmVlZHMgYSB0b2FzdCB0YWJsZSwgYW5kIGRv ZXNuJ3QgYWxyZWFkeSBoYXZlIG9uZSwKICoJCXRoZW4gY3JlYXRlIGEgdG9hc3QgdGFibGUg Zm9yIGl0LgogKgogKiByZWxvcHRpb25zIGZvciB0aGUgdG9hc3QgdGFibGUgY2FuIGJlIHBh c3NlZCwgdG9vLiAgUGFzcyAoRGF0dW0pIDAKICogZm9yIGRlZmF1bHQgcmVsb3B0aW9ucy4K ICoKICogV2UgZXhwZWN0IHRoZSBjYWxsZXIgdG8gaGF2ZSB2ZXJpZmllZCB0aGF0IHRoZSBy ZWxhdGlvbiBpcyBhIHRhYmxlIGFuZCBoYXZlCiAqIGFscmVhZHkgZG9uZSBhbnkgbmVjZXNz YXJ5IHBlcm1pc3Npb24gY2hlY2tzLiAgQ2FsbGVycyBleHBlY3QgdGhpcyBmdW5jdGlvbgog KiB0byBlbmQgd2l0aCBDb21tYW5kQ291bnRlckluY3JlbWVudCBpZiBpdCBtYWtlcyBhbnkg Y2hhbmdlcy4KICovCnZvaWQKQWx0ZXJUYWJsZUNyZWF0ZVRvYXN0VGFibGUoT2lkIHJlbE9p ZCwgRGF0dW0gcmVsb3B0aW9ucywgTE9DS01PREUgbG9ja21vZGUpCnsKCUNoZWNrQW5kQ3Jl YXRlVG9hc3RUYWJsZShyZWxPaWQsIHJlbG9wdGlvbnMsIGxvY2ttb2RlLCB0cnVlLCBJbnZh bGlkT2lkKTsKfQoKdm9pZApOZXdIZWFwQ3JlYXRlVG9hc3RUYWJsZShPaWQgcmVsT2lkLCBE YXR1bSByZWxvcHRpb25zLCBMT0NLTU9ERSBsb2NrbW9kZSwKCQkJCQkJT2lkIE9JRE9sZFRv YXN0KQp7CglDaGVja0FuZENyZWF0ZVRvYXN0VGFibGUocmVsT2lkLCByZWxvcHRpb25zLCBs b2NrbW9kZSwgZmFsc2UsIE9JRE9sZFRvYXN0KTsKfQoKdm9pZApOZXdSZWxhdGlvbkNyZWF0 ZVRvYXN0VGFibGUoT2lkIHJlbE9pZCwgRGF0dW0gcmVsb3B0aW9ucykKewoJQ2hlY2tBbmRD cmVhdGVUb2FzdFRhYmxlKHJlbE9pZCwgcmVsb3B0aW9ucywgQWNjZXNzRXhjbHVzaXZlTG9j aywgZmFsc2UsCgkJCQkJCQkgSW52YWxpZE9pZCk7Cn0KCnN0YXRpYyB2b2lkCkNoZWNrQW5k Q3JlYXRlVG9hc3RUYWJsZShPaWQgcmVsT2lkLCBEYXR1bSByZWxvcHRpb25zLCBMT0NLTU9E RSBsb2NrbW9kZSwKCQkJCQkJIGJvb2wgY2hlY2ssIE9pZCBPSURPbGRUb2FzdCkKewoJUmVs YXRpb24JcmVsOwoKCXJlbCA9IHRhYmxlX29wZW4ocmVsT2lkLCBsb2NrbW9kZSk7CgoJLyog Y3JlYXRlX3RvYXN0X3RhYmxlIGRvZXMgYWxsIHRoZSB3b3JrICovCgkodm9pZCkgY3JlYXRl X3RvYXN0X3RhYmxlKHJlbCwgSW52YWxpZE9pZCwgSW52YWxpZE9pZCwgcmVsb3B0aW9ucywg bG9ja21vZGUsCgkJCQkJCQkgIGNoZWNrLCBPSURPbGRUb2FzdCk7CgoJdGFibGVfY2xvc2Uo cmVsLCBOb0xvY2spOwp9CgovKgogKiBDcmVhdGUgYSB0b2FzdCB0YWJsZSBkdXJpbmcgYm9v dHN0cmFwCiAqCiAqIEhlcmUgd2UgbmVlZCB0byBwcmVzcGVjaWZ5IHRoZSBPSURzIG9mIHRo ZSB0b2FzdCB0YWJsZSBhbmQgaXRzIGluZGV4CiAqLwp2b2lkCkJvb3RzdHJhcFRvYXN0VGFi bGUoY2hhciAqcmVsTmFtZSwgT2lkIHRvYXN0T2lkLCBPaWQgdG9hc3RJbmRleE9pZCkKewoJ UmVsYXRpb24JcmVsOwoKCXJlbCA9IHRhYmxlX29wZW5ydihtYWtlUmFuZ2VWYXIoTlVMTCwg cmVsTmFtZSwgLTEpLCBBY2Nlc3NFeGNsdXNpdmVMb2NrKTsKCglpZiAocmVsLT5yZF9yZWwt PnJlbGtpbmQgIT0gUkVMS0lORF9SRUxBVElPTiAmJgoJCXJlbC0+cmRfcmVsLT5yZWxraW5k ICE9IFJFTEtJTkRfTUFUVklFVykKCQllbG9nKEVSUk9SLCAiXCIlc1wiIGlzIG5vdCBhIHRh YmxlIG9yIG1hdGVyaWFsaXplZCB2aWV3IiwKCQkJIHJlbE5hbWUpOwoKCS8qIGNyZWF0ZV90 b2FzdF90YWJsZSBkb2VzIGFsbCB0aGUgd29yayAqLwoJaWYgKCFjcmVhdGVfdG9hc3RfdGFi bGUocmVsLCB0b2FzdE9pZCwgdG9hc3RJbmRleE9pZCwgKERhdHVtKSAwLAoJCQkJCQkJQWNj ZXNzRXhjbHVzaXZlTG9jaywgZmFsc2UsIEludmFsaWRPaWQpKQoJCWVsb2coRVJST1IsICJc IiVzXCIgZG9lcyBub3QgcmVxdWlyZSBhIHRvYXN0IHRhYmxlIiwKCQkJIHJlbE5hbWUpOwoK CXRhYmxlX2Nsb3NlKHJlbCwgTm9Mb2NrKTsKfQoKCi8qCiAqIGNyZWF0ZV90b2FzdF90YWJs ZSAtLS0gaW50ZXJuYWwgd29ya2hvcnNlCiAqCiAqIHJlbCBpcyBhbHJlYWR5IG9wZW5lZCBh bmQgbG9ja2VkCiAqIHRvYXN0T2lkIGFuZCB0b2FzdEluZGV4T2lkIGFyZSBub3JtYWxseSBJ bnZhbGlkT2lkLCBidXQgZHVyaW5nCiAqIGJvb3RzdHJhcCB0aGV5IGNhbiBiZSBub256ZXJv IHRvIHNwZWNpZnkgaGFuZC1hc3NpZ25lZCBPSURzCiAqLwpzdGF0aWMgYm9vbApjcmVhdGVf dG9hc3RfdGFibGUoUmVsYXRpb24gcmVsLCBPaWQgdG9hc3RPaWQsIE9pZCB0b2FzdEluZGV4 T2lkLAoJCQkJICAgRGF0dW0gcmVsb3B0aW9ucywgTE9DS01PREUgbG9ja21vZGUsIGJvb2wg Y2hlY2ssCgkJCQkgICBPaWQgT0lET2xkVG9hc3QpCnsKCU9pZAkJCXJlbE9pZCA9IFJlbGF0 aW9uR2V0UmVsaWQocmVsKTsKCUhlYXBUdXBsZQlyZWx0dXA7CglUdXBsZURlc2MJdHVwZGVz YzsKCWJvb2wJCXNoYXJlZF9yZWxhdGlvbjsKCWJvb2wJCW1hcHBlZF9yZWxhdGlvbjsKCVJl bGF0aW9uCXRvYXN0X3JlbDsKCVJlbGF0aW9uCWNsYXNzX3JlbDsKCU9pZAkJCXRvYXN0X3Jl bGlkOwoJT2lkCQkJbmFtZXNwYWNlaWQ7CgljaGFyCQl0b2FzdF9yZWxuYW1lW05BTUVEQVRB TEVOXTsKCWNoYXIJCXRvYXN0X2lkeG5hbWVbTkFNRURBVEFMRU5dOwoJSW5kZXhJbmZvICAq aW5kZXhJbmZvOwoJT2lkCQkJY29sbGF0aW9uSWRzWzJdOwoJT2lkCQkJb3BjbGFzc0lkc1sy XTsKCWludDE2CQljb2xvcHRpb25zWzJdOwoJT2JqZWN0QWRkcmVzcyBiYXNlb2JqZWN0LAoJ CQkJdG9hc3RvYmplY3Q7CgoJLyoKCSAqIElzIGl0IGFscmVhZHkgdG9hc3RlZD8KCSAqLwoJ aWYgKHJlbC0+cmRfcmVsLT5yZWx0b2FzdHJlbGlkICE9IEludmFsaWRPaWQpCgkJcmV0dXJu IGZhbHNlOwoKCS8qCgkgKiBDaGVjayB0byBzZWUgd2hldGhlciB0aGUgdGFibGUgYWN0dWFs bHkgbmVlZHMgYSBUT0FTVCB0YWJsZS4KCSAqLwoJaWYgKCFJc0JpbmFyeVVwZ3JhZGUpCgl7 CgkJLyogTm9ybWFsIG1vZGUsIG5vcm1hbCBjaGVjayAqLwoJCWlmICghbmVlZHNfdG9hc3Rf dGFibGUocmVsKSkKCQkJcmV0dXJuIGZhbHNlOwoJfQoJZWxzZQoJewoJCS8qCgkJICogSW4g YmluYXJ5LXVwZ3JhZGUgbW9kZSwgY3JlYXRlIGEgVE9BU1QgdGFibGUgaWYgYW5kIG9ubHkg aWYKCQkgKiBwZ191cGdyYWRlIHRvbGQgdXMgdG8gKGllLCBhIFRPQVNUIHRhYmxlIE9JRCBo YXMgYmVlbiBwcm92aWRlZCkuCgkJICoKCQkgKiBUaGlzIGluZGljYXRlcyB0aGF0IHRoZSBv bGQgY2x1c3RlciBoYWQgYSBUT0FTVCB0YWJsZSBmb3IgdGhlCgkJICogY3VycmVudCB0YWJs ZS4gIFdlIG11c3QgY3JlYXRlIGEgVE9BU1QgdGFibGUgdG8gcmVjZWl2ZSB0aGUgb2xkCgkJ ICogVE9BU1QgZmlsZSwgZXZlbiBpZiB0aGUgdGFibGUgc2VlbXMgbm90IHRvIG5lZWQgb25l LgoJCSAqCgkJICogQ29udHJhcml3aXNlLCBpZiB0aGUgb2xkIGNsdXN0ZXIgZGlkIG5vdCBo YXZlIGEgVE9BU1QgdGFibGUsIHdlCgkJICogc2hvdWxkIGJlIGFibGUgdG8gZ2V0IGFsb25n IHdpdGhvdXQgb25lIGV2ZW4gaWYgdGhlIG5ldyB2ZXJzaW9uJ3MKCQkgKiBuZWVkc190b2Fz dF90YWJsZSBydWxlcyBzdWdnZXN0IHdlIHNob3VsZCBoYXZlIG9uZS4gIFRoZXJlIGlzIGEg bG90CgkJICogb2YgZGF5bGlnaHQgYmV0d2VlbiB3aGVyZSB3ZSB3aWxsIGNyZWF0ZSBhIFRP QVNUIHRhYmxlIGFuZCB3aGVyZQoJCSAqIG9uZSBpcyByZWFsbHkgbmVjZXNzYXJ5IHRvIGF2 b2lkIGZhaWx1cmVzLCBzbyBzbWFsbCBjcm9zcy12ZXJzaW9uCgkJICogZGlmZmVyZW5jZXMg aW4gdGhlIHdoZW4tdG8tY3JlYXRlIGhldXJpc3RpYyBzaG91bGRuJ3QgYmUgYSBwcm9ibGVt LgoJCSAqIElmIHdlIHRyaWVkIHRvIGNyZWF0ZSBhIFRPQVNUIHRhYmxlIGFueXdheSwgd2Ug d291bGQgaGF2ZSB0aGUKCQkgKiBwcm9ibGVtIHRoYXQgaXQgbWlnaHQgdGFrZSB1cCBhbiBP SUQgdGhhdCB3aWxsIGNvbmZsaWN0IHdpdGggc29tZQoJCSAqIG9sZC1jbHVzdGVyIHRhYmxl IHdlIGhhdmVuJ3Qgc2VlbiB5ZXQuCgkJICovCgkJaWYgKCFPaWRJc1ZhbGlkKGJpbmFyeV91 cGdyYWRlX25leHRfdG9hc3RfcGdfY2xhc3Nfb2lkKSkKCQkJcmV0dXJuIGZhbHNlOwoJfQoK CS8qCgkgKiBJZiByZXF1ZXN0ZWQgY2hlY2sgbG9ja21vZGUgaXMgc3VmZmljaWVudC4gVGhp cyBpcyBhIGNyb3NzIGNoZWNrIGluCgkgKiBjYXNlIG9mIGVycm9ycyBvciBjb25mbGljdGlu ZyBkZWNpc2lvbnMgaW4gZWFybGllciBjb2RlLgoJICovCglpZiAoY2hlY2sgJiYgbG9ja21v ZGUgIT0gQWNjZXNzRXhjbHVzaXZlTG9jaykKCQllbG9nKEVSUk9SLCAiQWNjZXNzRXhjbHVz aXZlTG9jayByZXF1aXJlZCB0byBhZGQgdG9hc3QgdGFibGUuIik7CgoJLyoKCSAqIENyZWF0 ZSB0aGUgdG9hc3QgdGFibGUgYW5kIGl0cyBpbmRleAoJICovCglzbnByaW50Zih0b2FzdF9y ZWxuYW1lLCBzaXplb2YodG9hc3RfcmVsbmFtZSksCgkJCSAicGdfdG9hc3RfJXUiLCByZWxP aWQpOwoJc25wcmludGYodG9hc3RfaWR4bmFtZSwgc2l6ZW9mKHRvYXN0X2lkeG5hbWUpLAoJ CQkgInBnX3RvYXN0XyV1X2luZGV4IiwgcmVsT2lkKTsKCgkvKiB0aGlzIGlzIHByZXR0eSBw YWluZnVsLi4uICBuZWVkIGEgdHVwbGUgZGVzY3JpcHRvciAqLwoJdHVwZGVzYyA9IENyZWF0 ZVRlbXBsYXRlVHVwbGVEZXNjKDMpOwoJVHVwbGVEZXNjSW5pdEVudHJ5KHR1cGRlc2MsIChB dHRyTnVtYmVyKSAxLAoJCQkJCSAgICJjaHVua19pZCIsCgkJCQkJICAgT0lET0lELAoJCQkJ CSAgIC0xLCAwKTsKCVR1cGxlRGVzY0luaXRFbnRyeSh0dXBkZXNjLCAoQXR0ck51bWJlcikg MiwKCQkJCQkgICAiY2h1bmtfc2VxIiwKCQkJCQkgICBJTlQ0T0lELAoJCQkJCSAgIC0xLCAw KTsKCVR1cGxlRGVzY0luaXRFbnRyeSh0dXBkZXNjLCAoQXR0ck51bWJlcikgMywKCQkJCQkg ICAiY2h1bmtfZGF0YSIsCgkJCQkJICAgQllURUFPSUQsCgkJCQkJICAgLTEsIDApOwoKCS8q CgkgKiBFbnN1cmUgdGhhdCB0aGUgdG9hc3QgdGFibGUgZG9lc24ndCBpdHNlbGYgZ2V0IHRv YXN0ZWQsIG9yIHdlJ2xsIGJlCgkgKiB0b2FzdCA6LSguICBUaGlzIGlzIGVzc2VudGlhbCBm b3IgY2h1bmtfZGF0YSBiZWNhdXNlIHR5cGUgYnl0ZWEgaXMKCSAqIHRvYXN0YWJsZTsgaGl0 IHRoZSBvdGhlciB0d28ganVzdCB0byBiZSBzdXJlLgoJICovCglUdXBsZURlc2NBdHRyKHR1 cGRlc2MsIDApLT5hdHRzdG9yYWdlID0gVFlQU1RPUkFHRV9QTEFJTjsKCVR1cGxlRGVzY0F0 dHIodHVwZGVzYywgMSktPmF0dHN0b3JhZ2UgPSBUWVBTVE9SQUdFX1BMQUlOOwoJVHVwbGVE ZXNjQXR0cih0dXBkZXNjLCAyKS0+YXR0c3RvcmFnZSA9IFRZUFNUT1JBR0VfUExBSU47CgoJ LyogVG9hc3QgZmllbGQgc2hvdWxkIG5vdCBiZSBjb21wcmVzc2VkICovCglUdXBsZURlc2NB dHRyKHR1cGRlc2MsIDApLT5hdHRjb21wcmVzc2lvbiA9IEludmFsaWRDb21wcmVzc2lvbk1l dGhvZDsKCVR1cGxlRGVzY0F0dHIodHVwZGVzYywgMSktPmF0dGNvbXByZXNzaW9uID0gSW52 YWxpZENvbXByZXNzaW9uTWV0aG9kOwoJVHVwbGVEZXNjQXR0cih0dXBkZXNjLCAyKS0+YXR0 Y29tcHJlc3Npb24gPSBJbnZhbGlkQ29tcHJlc3Npb25NZXRob2Q7CgoJcG9wdWxhdGVfY29t cGFjdF9hdHRyaWJ1dGUodHVwZGVzYywgMCk7Cglwb3B1bGF0ZV9jb21wYWN0X2F0dHJpYnV0 ZSh0dXBkZXNjLCAxKTsKCXBvcHVsYXRlX2NvbXBhY3RfYXR0cmlidXRlKHR1cGRlc2MsIDIp OwoKCVR1cGxlRGVzY0ZpbmFsaXplKHR1cGRlc2MpOwoKCS8qCgkgKiBUb2FzdCB0YWJsZXMg Zm9yIHJlZ3VsYXIgcmVsYXRpb25zIGdvIGluIHBnX3RvYXN0OyB0aG9zZSBmb3IgdGVtcAoJ ICogcmVsYXRpb25zIGdvIGludG8gdGhlIHBlci1iYWNrZW5kIHRlbXAtdG9hc3QtdGFibGUg bmFtZXNwYWNlLgoJICovCglpZiAoaXNUZW1wT3JUZW1wVG9hc3ROYW1lc3BhY2UocmVsLT5y ZF9yZWwtPnJlbG5hbWVzcGFjZSkpCgkJbmFtZXNwYWNlaWQgPSBHZXRUZW1wVG9hc3ROYW1l c3BhY2UoKTsKCWVsc2UKCQluYW1lc3BhY2VpZCA9IFBHX1RPQVNUX05BTUVTUEFDRTsKCgkv KiBUb2FzdCB0YWJsZSBpcyBzaGFyZWQgaWYgYW5kIG9ubHkgaWYgaXRzIHBhcmVudCBpcy4g Ki8KCXNoYXJlZF9yZWxhdGlvbiA9IHJlbC0+cmRfcmVsLT5yZWxpc3NoYXJlZDsKCgkvKiBJ dCdzIG1hcHBlZCBpZiBhbmQgb25seSBpZiBpdHMgcGFyZW50IGlzLCB0b28gKi8KCW1hcHBl ZF9yZWxhdGlvbiA9IFJlbGF0aW9uSXNNYXBwZWQocmVsKTsKCgl0b2FzdF9yZWxpZCA9IGhl YXBfY3JlYXRlX3dpdGhfY2F0YWxvZyh0b2FzdF9yZWxuYW1lLAoJCQkJCQkJCQkJICAgbmFt ZXNwYWNlaWQsCgkJCQkJCQkJCQkgICByZWwtPnJkX3JlbC0+cmVsdGFibGVzcGFjZSwKCQkJ CQkJCQkJCSAgIHRvYXN0T2lkLAoJCQkJCQkJCQkJICAgSW52YWxpZE9pZCwKCQkJCQkJCQkJ CSAgIEludmFsaWRPaWQsCgkJCQkJCQkJCQkgICByZWwtPnJkX3JlbC0+cmVsb3duZXIsCgkJ CQkJCQkJCQkgICB0YWJsZV9yZWxhdGlvbl90b2FzdF9hbShyZWwpLAoJCQkJCQkJCQkJICAg dHVwZGVzYywKCQkJCQkJCQkJCSAgIE5JTCwKCQkJCQkJCQkJCSAgIFJFTEtJTkRfVE9BU1RW QUxVRSwKCQkJCQkJCQkJCSAgIHJlbC0+cmRfcmVsLT5yZWxwZXJzaXN0ZW5jZSwKCQkJCQkJ CQkJCSAgIHNoYXJlZF9yZWxhdGlvbiwKCQkJCQkJCQkJCSAgIG1hcHBlZF9yZWxhdGlvbiwK CQkJCQkJCQkJCSAgIE9OQ09NTUlUX05PT1AsCgkJCQkJCQkJCQkgICByZWxvcHRpb25zLAoJ CQkJCQkJCQkJICAgZmFsc2UsCgkJCQkJCQkJCQkgICB0cnVlLAoJCQkJCQkJCQkJICAgdHJ1 ZSwKCQkJCQkJCQkJCSAgIE9JRE9sZFRvYXN0LAoJCQkJCQkJCQkJICAgTlVMTCk7CglBc3Nl cnQodG9hc3RfcmVsaWQgIT0gSW52YWxpZE9pZCk7CgoJLyogbWFrZSB0aGUgdG9hc3QgcmVs YXRpb24gdmlzaWJsZSwgZWxzZSB0YWJsZV9vcGVuIHdpbGwgZmFpbCAqLwoJQ29tbWFuZENv dW50ZXJJbmNyZW1lbnQoKTsKCgkvKiBTaGFyZUxvY2sgaXMgbm90IHJlYWxseSBuZWVkZWQg aGVyZSwgYnV0IHRha2UgaXQgYW55d2F5ICovCgl0b2FzdF9yZWwgPSB0YWJsZV9vcGVuKHRv YXN0X3JlbGlkLCBTaGFyZUxvY2spOwoKCS8qCgkgKiBDcmVhdGUgdW5pcXVlIGluZGV4IG9u IGNodW5rX2lkLCBjaHVua19zZXEuCgkgKgoJICogTk9URTogdGhlIG5vcm1hbCBUT0FTVCBh Y2Nlc3Mgcm91dGluZXMgY291bGQgYWN0dWFsbHkgZnVuY3Rpb24gd2l0aCBhCgkgKiBzaW5n bGUtY29sdW1uIGluZGV4IG9uIGNodW5rX2lkIG9ubHkuIEhvd2V2ZXIsIHRoZSBzbGljZSBh Y2Nlc3MKCSAqIHJvdXRpbmVzIHVzZSBib3RoIGNvbHVtbnMgZm9yIGZhc3RlciBhY2Nlc3Mg dG8gYW4gaW5kaXZpZHVhbCBjaHVuay4gSW4KCSAqIGFkZGl0aW9uLCB3ZSB3YW50IGl0IHRv IGJlIHVuaXF1ZSBhcyBhIGNoZWNrIGFnYWluc3QgdGhlIHBvc3NpYmlsaXR5IG9mCgkgKiBk dXBsaWNhdGUgVE9BU1QgY2h1bmsgT0lEcy4gVGhlIGluZGV4IG1pZ2h0IGFsc28gYmUgYSBs aXR0bGUgbW9yZQoJICogZWZmaWNpZW50IHRoaXMgd2F5LCBzaW5jZSBidHJlZSBpc24ndCBh bGwgdGhhdCBoYXBweSB3aXRoIGxhcmdlIG51bWJlcnMKCSAqIG9mIGVxdWFsIGtleXMuCgkg Ki8KCglpbmRleEluZm8gPSBtYWtlTm9kZShJbmRleEluZm8pOwoJaW5kZXhJbmZvLT5paV9O dW1JbmRleEF0dHJzID0gMjsKCWluZGV4SW5mby0+aWlfTnVtSW5kZXhLZXlBdHRycyA9IDI7 CglpbmRleEluZm8tPmlpX0luZGV4QXR0ck51bWJlcnNbMF0gPSAxOwoJaW5kZXhJbmZvLT5p aV9JbmRleEF0dHJOdW1iZXJzWzFdID0gMjsKCWluZGV4SW5mby0+aWlfRXhwcmVzc2lvbnMg PSBOSUw7CglpbmRleEluZm8tPmlpX0V4cHJlc3Npb25zRXhwYW5kID0gTklMOwoJaW5kZXhJ bmZvLT5paV9FeHByZXNzaW9uc1N0YXRlID0gTklMOwoJaW5kZXhJbmZvLT5paV9FeHByZXNz aW9uc0V4cGFuZFN0YXRlID0gTklMOwoJaW5kZXhJbmZvLT5paV9QcmVkaWNhdGUgPSBOSUw7 CglpbmRleEluZm8tPmlpX1ByZWRpY2F0ZUV4cGFuZCA9IE5JTDsKCWluZGV4SW5mby0+aWlf UHJlZGljYXRlU3RhdGUgPSBOVUxMOwoJaW5kZXhJbmZvLT5paV9QcmVkaWNhdGVFeHBhbmRT dGF0ZSA9IE5VTEw7CglpbmRleEluZm8tPmlpX0V4Y2x1c2lvbk9wcyA9IE5VTEw7CglpbmRl eEluZm8tPmlpX0V4Y2x1c2lvblByb2NzID0gTlVMTDsKCWluZGV4SW5mby0+aWlfRXhjbHVz aW9uU3RyYXRzID0gTlVMTDsKCWluZGV4SW5mby0+aWlfVW5pcXVlID0gdHJ1ZTsKCWluZGV4 SW5mby0+aWlfTnVsbHNOb3REaXN0aW5jdCA9IGZhbHNlOwoJaW5kZXhJbmZvLT5paV9SZWFk eUZvckluc2VydHMgPSB0cnVlOwoJaW5kZXhJbmZvLT5paV9DaGVja2VkVW5jaGFuZ2VkID0g ZmFsc2U7CglpbmRleEluZm8tPmlpX0luZGV4VW5jaGFuZ2VkID0gZmFsc2U7CglpbmRleElu Zm8tPmlpX0NvbmN1cnJlbnQgPSBmYWxzZTsKCWluZGV4SW5mby0+aWlfQnJva2VuSG90Q2hh aW4gPSBmYWxzZTsKCWluZGV4SW5mby0+aWlfUGFyYWxsZWxXb3JrZXJzID0gMDsKCWluZGV4 SW5mby0+aWlfQW0gPSBCVFJFRV9BTV9PSUQ7CglpbmRleEluZm8tPmlpX0FtQ2FjaGUgPSBO VUxMOwoJaW5kZXhJbmZvLT5paV9Db250ZXh0ID0gQ3VycmVudE1lbW9yeUNvbnRleHQ7CgoJ Y29sbGF0aW9uSWRzWzBdID0gSW52YWxpZE9pZDsKCWNvbGxhdGlvbklkc1sxXSA9IEludmFs aWRPaWQ7CgoJb3BjbGFzc0lkc1swXSA9IE9JRF9CVFJFRV9PUFNfT0lEOwoJb3BjbGFzc0lk c1sxXSA9IElOVDRfQlRSRUVfT1BTX09JRDsKCgljb2xvcHRpb25zWzBdID0gMDsKCWNvbG9w dGlvbnNbMV0gPSAwOwoKCWluZGV4X2NyZWF0ZSh0b2FzdF9yZWwsIHRvYXN0X2lkeG5hbWUs IHRvYXN0SW5kZXhPaWQsIEludmFsaWRPaWQsCgkJCQkgSW52YWxpZE9pZCwgSW52YWxpZE9p ZCwKCQkJCSBpbmRleEluZm8sCgkJCQkgbGlzdF9tYWtlMigiY2h1bmtfaWQiLCAiY2h1bmtf c2VxIiksCgkJCQkgQlRSRUVfQU1fT0lELAoJCQkJIHJlbC0+cmRfcmVsLT5yZWx0YWJsZXNw YWNlLAoJCQkJIGNvbGxhdGlvbklkcywgb3BjbGFzc0lkcywgTlVMTCwgY29sb3B0aW9ucywg TlVMTCwgKERhdHVtKSAwLAoJCQkJIElOREVYX0NSRUFURV9JU19QUklNQVJZLCAwLCB0cnVl LCB0cnVlLCBOVUxMKTsKCgl0YWJsZV9jbG9zZSh0b2FzdF9yZWwsIE5vTG9jayk7CgoJLyoK CSAqIFN0b3JlIHRoZSB0b2FzdCB0YWJsZSdzIE9JRCBpbiB0aGUgcGFyZW50IHJlbGF0aW9u J3MgcGdfY2xhc3Mgcm93CgkgKi8KCWNsYXNzX3JlbCA9IHRhYmxlX29wZW4oUmVsYXRpb25S ZWxhdGlvbklkLCBSb3dFeGNsdXNpdmVMb2NrKTsKCglpZiAoIUlzQm9vdHN0cmFwUHJvY2Vz c2luZ01vZGUoKSkKCXsKCQkvKiBub3JtYWwgY2FzZSwgdXNlIGEgdHJhbnNhY3Rpb25hbCB1 cGRhdGUgKi8KCQlyZWx0dXAgPSBTZWFyY2hTeXNDYWNoZUNvcHkxKFJFTE9JRCwgT2JqZWN0 SWRHZXREYXR1bShyZWxPaWQpKTsKCQlpZiAoIUhlYXBUdXBsZUlzVmFsaWQocmVsdHVwKSkK CQkJZWxvZyhFUlJPUiwgImNhY2hlIGxvb2t1cCBmYWlsZWQgZm9yIHJlbGF0aW9uICV1Iiwg cmVsT2lkKTsKCgkJKChGb3JtX3BnX2NsYXNzKSBHRVRTVFJVQ1QocmVsdHVwKSktPnJlbHRv YXN0cmVsaWQgPSB0b2FzdF9yZWxpZDsKCgkJQ2F0YWxvZ1R1cGxlVXBkYXRlKGNsYXNzX3Jl bCwgJnJlbHR1cC0+dF9zZWxmLCByZWx0dXApOwoJfQoJZWxzZQoJewoJCS8qIFdoaWxlIGJv b3RzdHJhcHBpbmcsIHdlIGNhbm5vdCBVUERBVEUsIHNvIG92ZXJ3cml0ZSBpbi1wbGFjZSAq LwoKCQlTY2FuS2V5RGF0YSBrZXlbMV07CgkJdm9pZAkgICAqc3RhdGU7CgoJCVNjYW5LZXlJ bml0KCZrZXlbMF0sCgkJCQkJQW51bV9wZ19jbGFzc19vaWQsCgkJCQkJQlRFcXVhbFN0cmF0 ZWd5TnVtYmVyLCBGX09JREVRLAoJCQkJCU9iamVjdElkR2V0RGF0dW0ocmVsT2lkKSk7CgkJ c3lzdGFibGVfaW5wbGFjZV91cGRhdGVfYmVnaW4oY2xhc3NfcmVsLCBDbGFzc09pZEluZGV4 SWQsIHRydWUsCgkJCQkJCQkJCSAgTlVMTCwgMSwga2V5LCAmcmVsdHVwLCAmc3RhdGUpOwoJ CWlmICghSGVhcFR1cGxlSXNWYWxpZChyZWx0dXApKQoJCQllbG9nKEVSUk9SLCAiY2FjaGUg bG9va3VwIGZhaWxlZCBmb3IgcmVsYXRpb24gJXUiLCByZWxPaWQpOwoKCQkoKEZvcm1fcGdf Y2xhc3MpIEdFVFNUUlVDVChyZWx0dXApKS0+cmVsdG9hc3RyZWxpZCA9IHRvYXN0X3JlbGlk OwoKCQlzeXN0YWJsZV9pbnBsYWNlX3VwZGF0ZV9maW5pc2goc3RhdGUsIHJlbHR1cCk7Cgl9 CgoJaGVhcF9mcmVldHVwbGUocmVsdHVwKTsKCgl0YWJsZV9jbG9zZShjbGFzc19yZWwsIFJv d0V4Y2x1c2l2ZUxvY2spOwoKCS8qCgkgKiBSZWdpc3RlciBkZXBlbmRlbmN5IGZyb20gdGhl IHRvYXN0IHRhYmxlIHRvIHRoZSBtYWluLCBzbyB0aGF0IHRoZSB0b2FzdAoJICogdGFibGUg d2lsbCBiZSBkZWxldGVkIGlmIHRoZSBtYWluIGlzLiAgU2tpcCB0aGlzIGluIGJvb3RzdHJh cCBtb2RlLgoJICovCglpZiAoIUlzQm9vdHN0cmFwUHJvY2Vzc2luZ01vZGUoKSkKCXsKCQli YXNlb2JqZWN0LmNsYXNzSWQgPSBSZWxhdGlvblJlbGF0aW9uSWQ7CgkJYmFzZW9iamVjdC5v YmplY3RJZCA9IHJlbE9pZDsKCQliYXNlb2JqZWN0Lm9iamVjdFN1YklkID0gMDsKCQl0b2Fz dG9iamVjdC5jbGFzc0lkID0gUmVsYXRpb25SZWxhdGlvbklkOwoJCXRvYXN0b2JqZWN0Lm9i amVjdElkID0gdG9hc3RfcmVsaWQ7CgkJdG9hc3RvYmplY3Qub2JqZWN0U3ViSWQgPSAwOwoK CQlyZWNvcmREZXBlbmRlbmN5T24oJnRvYXN0b2JqZWN0LCAmYmFzZW9iamVjdCwgREVQRU5E RU5DWV9JTlRFUk5BTCk7Cgl9CgoJLyoKCSAqIE1ha2UgY2hhbmdlcyB2aXNpYmxlCgkgKi8K CUNvbW1hbmRDb3VudGVySW5jcmVtZW50KCk7CgoJcmV0dXJuIHRydWU7Cn0KCi8qCiAqIENo ZWNrIHRvIHNlZSB3aGV0aGVyIHRoZSB0YWJsZSBuZWVkcyBhIFRPQVNUIHRhYmxlLgogKi8K c3RhdGljIGJvb2wKbmVlZHNfdG9hc3RfdGFibGUoUmVsYXRpb24gcmVsKQp7CgkvKgoJICog Tm8gbmVlZCB0byBjcmVhdGUgYSBUT0FTVCB0YWJsZSBmb3IgcGFydGl0aW9uZWQgdGFibGVz LgoJICovCglpZiAocmVsLT5yZF9yZWwtPnJlbGtpbmQgPT0gUkVMS0lORF9QQVJUSVRJT05F RF9UQUJMRSkKCQlyZXR1cm4gZmFsc2U7CgoJLyoKCSAqIFdlIGNhbm5vdCBhbGxvdyB0b2Fz dGluZyBhIHNoYXJlZCByZWxhdGlvbiBhZnRlciBpbml0ZGIgKGJlY2F1c2UKCSAqIHRoZXJl J3Mgbm8gd2F5IHRvIG1hcmsgaXQgdG9hc3RlZCBpbiBvdGhlciBkYXRhYmFzZXMnIHBnX2Ns YXNzKS4KCSAqLwoJaWYgKHJlbC0+cmRfcmVsLT5yZWxpc3NoYXJlZCAmJiAhSXNCb290c3Ry YXBQcm9jZXNzaW5nTW9kZSgpKQoJCXJldHVybiBmYWxzZTsKCgkvKgoJICogSWdub3JlIGF0 dGVtcHRzIHRvIGNyZWF0ZSB0b2FzdCB0YWJsZXMgb24gY2F0YWxvZyB0YWJsZXMgYWZ0ZXIg aW5pdGRiLgoJICogV2hpY2ggY2F0YWxvZ3MgZ2V0IHRvYXN0IHRhYmxlcyBpcyBleHBsaWNp dGx5IGNob3NlbiBpbiBjYXRhbG9nL3BnXyouaC4KCSAqIChXZSBjb3VsZCBnZXQgaGVyZSB2 aWEgc29tZSBBTFRFUiBUQUJMRSBjb21tYW5kIGlmIHRoZSBjYXRhbG9nIGRvZXNuJ3QKCSAq IGhhdmUgYSB0b2FzdCB0YWJsZS4pCgkgKi8KCWlmIChJc0NhdGFsb2dSZWxhdGlvbihyZWwp ICYmICFJc0Jvb3RzdHJhcFByb2Nlc3NpbmdNb2RlKCkpCgkJcmV0dXJuIGZhbHNlOwoKCS8q IE90aGVyd2lzZSwgbGV0IHRoZSBBTSBkZWNpZGUuICovCglyZXR1cm4gdGFibGVfcmVsYXRp b25fbmVlZHNfdG9hc3RfdGFibGUocmVsKTsKfQoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA= ------=_NextPart_6A49C9A9_E0657D40_6AAF3ADB Content-Type: application/octet-stream; charset="utf-8"; name="v2-0001-v2-enhance-index-support-for-virtual-generated-co.patch" Content-Disposition: attachment; filename="v2-0001-v2-enhance-index-support-for-virtual-generated-co.patch" Content-Transfer-Encoding: base64 RnJvbSAxMDk4NDA0YTliN2Y5NjNiOGUxYzY4NWY4MTY2Yjc2ZGQ0YzZjYzgyIE1vbiBTZXAg MTcgMDA6MDA6MDAgMjAwMQpGcm9tOiBaaXpodWFuIExpdSA8NDQ5NzM4NjNAcXEuY29tPgpE YXRlOiBTdW4sIDUgSnVsIDIwMjYgMTA6MzA6NDkgKzA4MDAKU3ViamVjdDogW1BBVENIIHYy XSB2MiBlbmhhbmNlLWluZGV4LXN1cHBvcnQtZm9yLXZpcnR1YWwtZ2VuZXJhdGVkLWNvbHVt bnMKCi0tLQogc3JjL2JhY2tlbmQvYWNjZXNzL2hlYXAvaGVhcGFtX2hhbmRsZXIuYyB8ICAy MCArKy0tCiBzcmMvYmFja2VuZC9ib290c3RyYXAvYm9vdHN0cmFwLmMgICAgICAgIHwgICA2 ICsrCiBzcmMvYmFja2VuZC9jYXRhbG9nL2luZGV4LmMgICAgICAgICAgICAgIHwgIDYxICsr KysrKysrKy0tCiBzcmMvYmFja2VuZC9jYXRhbG9nL2luZGV4aW5nLmMgICAgICAgICAgIHwg ICAyICsKIHNyYy9iYWNrZW5kL2NhdGFsb2cvdG9hc3RpbmcuYyAgICAgICAgICAgfCAgIDQg Kwogc3JjL2JhY2tlbmQvY29tbWFuZHMvYW5hbHl6ZS5jICAgICAgICAgICB8ICAxMCArLQog c3JjL2JhY2tlbmQvY29tbWFuZHMvaW5kZXhjbWRzLmMgICAgICAgICB8ICA0MiArKystLS0t LQogc3JjL2JhY2tlbmQvZXhlY3V0b3IvZXhlY0luZGV4aW5nLmMgICAgICB8ICAxMyArKy0K IHNyYy9iYWNrZW5kL25vZGVzL21ha2VmdW5jcy5jICAgICAgICAgICAgfCAgMTAgKy0KIHNy Yy9iYWNrZW5kL29wdGltaXplci9wYXRoL2luZHhwYXRoLmMgICAgfCAgMTggKystLQogc3Jj L2JhY2tlbmQvb3B0aW1pemVyL3BsYW4vY3JlYXRlcGxhbi5jICB8ICAgNiArLQogc3JjL2Jh Y2tlbmQvb3B0aW1pemVyL3V0aWwvcGxhbmNhdC5jICAgICB8ICAyMiArKystCiBzcmMvYmFj a2VuZC91dGlscy9hZHQvc2VsZnVuY3MuYyAgICAgICAgIHwgICA0ICstCiBzcmMvYmFja2Vu ZC91dGlscy9jYWNoZS9yZWxjYWNoZS5jICAgICAgIHwgMTI2ICsrKysrKysrKysrKysrKysr KysrKysrCiBzcmMvaW5jbHVkZS9ub2Rlcy9leGVjbm9kZXMuaCAgICAgICAgICAgIHwgICA0 ICsKIHNyYy9pbmNsdWRlL25vZGVzL3BhdGhub2Rlcy5oICAgICAgICAgICAgfCAgIDIgKwog c3JjL2luY2x1ZGUvdXRpbHMvcmVsLmggICAgICAgICAgICAgICAgICB8ICAgMiArCiBzcmMv aW5jbHVkZS91dGlscy9yZWxjYWNoZS5oICAgICAgICAgICAgIHwgICA0ICsKIDE4IGZpbGVz IGNoYW5nZWQsIDI4NiBpbnNlcnRpb25zKCspLCA3MCBkZWxldGlvbnMoLSkKCmRpZmYgLS1n aXQgYS9zcmMvYmFja2VuZC9hY2Nlc3MvaGVhcC9oZWFwYW1faGFuZGxlci5jIGIvc3JjL2Jh Y2tlbmQvYWNjZXNzL2hlYXAvaGVhcGFtX2hhbmRsZXIuYwppbmRleCAyMjY4Y2MyNy4uMjJl MDc2MmUgMTAwNjQ0Ci0tLSBhL3NyYy9iYWNrZW5kL2FjY2Vzcy9oZWFwL2hlYXBhbV9oYW5k bGVyLmMKKysrIGIvc3JjL2JhY2tlbmQvYWNjZXNzL2hlYXAvaGVhcGFtX2hhbmRsZXIuYwpA QCAtMTE1OSw3ICsxMTU5LDcgQEAgaGVhcGFtX2luZGV4X2J1aWxkX3JhbmdlX3NjYW4oUmVs YXRpb24gaGVhcFJlbGF0aW9uLAogCURhdHVtCQl2YWx1ZXNbSU5ERVhfTUFYX0tFWVNdOwog CWJvb2wJCWlzbnVsbFtJTkRFWF9NQVhfS0VZU107CiAJZG91YmxlCQlyZWx0dXBsZXM7Ci0J RXhwclN0YXRlICAqcHJlZGljYXRlOworCUV4cHJTdGF0ZSAgKnByZWRpY2F0ZUV4cGFuZDsK IAlUdXBsZVRhYmxlU2xvdCAqc2xvdDsKIAlFU3RhdGUJICAgKmVzdGF0ZTsKIAlFeHByQ29u dGV4dCAqZWNvbnRleHQ7CkBAIC0xMjAwLDcgKzEyMDAsNyBAQCBoZWFwYW1faW5kZXhfYnVp bGRfcmFuZ2Vfc2NhbihSZWxhdGlvbiBoZWFwUmVsYXRpb24sCiAJZWNvbnRleHQtPmVjeHRf c2NhbnR1cGxlID0gc2xvdDsKIAogCS8qIFNldCB1cCBleGVjdXRpb24gc3RhdGUgZm9yIHBy ZWRpY2F0ZSwgaWYgYW55LiAqLwotCXByZWRpY2F0ZSA9IEV4ZWNQcmVwYXJlUXVhbChpbmRl eEluZm8tPmlpX1ByZWRpY2F0ZSwgZXN0YXRlKTsKKwlwcmVkaWNhdGVFeHBhbmQgPSBFeGVj UHJlcGFyZVF1YWwoaW5kZXhJbmZvLT5paV9QcmVkaWNhdGVFeHBhbmQsIGVzdGF0ZSk7CiAK IAkvKgogCSAqIFByZXBhcmUgZm9yIHNjYW4gb2YgdGhlIGJhc2UgcmVsYXRpb24uICBJbiBh IG5vcm1hbCBpbmRleCBidWlsZCwgd2UgdXNlCkBAIC0xNjA3LDkgKzE2MDcsOSBAQCBoZWFw YW1faW5kZXhfYnVpbGRfcmFuZ2Vfc2NhbihSZWxhdGlvbiBoZWFwUmVsYXRpb24sCiAJCSAq IEluIGEgcGFydGlhbCBpbmRleCwgZGlzY2FyZCB0dXBsZXMgdGhhdCBkb24ndCBzYXRpc2Z5 IHRoZQogCQkgKiBwcmVkaWNhdGUuCiAJCSAqLwotCQlpZiAocHJlZGljYXRlICE9IE5VTEwp CisJCWlmIChwcmVkaWNhdGVFeHBhbmQgIT0gTlVMTCkKIAkJewotCQkJaWYgKCFFeGVjUXVh bChwcmVkaWNhdGUsIGVjb250ZXh0KSkKKwkJCWlmICghRXhlY1F1YWwocHJlZGljYXRlRXhw YW5kLCBlY29udGV4dCkpCiAJCQkJY29udGludWU7CiAJCX0KIApAQCAtMTcwOSw3ICsxNzA5 LDkgQEAgaGVhcGFtX2luZGV4X2J1aWxkX3JhbmdlX3NjYW4oUmVsYXRpb24gaGVhcFJlbGF0 aW9uLAogCiAJLyogVGhlc2UgbWF5IGhhdmUgYmVlbiBwb2ludGluZyB0byB0aGUgbm93LWdv bmUgZXN0YXRlICovCiAJaW5kZXhJbmZvLT5paV9FeHByZXNzaW9uc1N0YXRlID0gTklMOwor CWluZGV4SW5mby0+aWlfRXhwcmVzc2lvbnNFeHBhbmRTdGF0ZSA9IE5JTDsKIAlpbmRleElu Zm8tPmlpX1ByZWRpY2F0ZVN0YXRlID0gTlVMTDsKKwlpbmRleEluZm8tPmlpX1ByZWRpY2F0 ZUV4cGFuZFN0YXRlID0gTlVMTDsKIAogCXJldHVybiByZWx0dXBsZXM7CiB9CkBAIC0xNzI2 LDcgKzE3MjgsNyBAQCBoZWFwYW1faW5kZXhfdmFsaWRhdGVfc2NhbihSZWxhdGlvbiBoZWFw UmVsYXRpb24sCiAJSGVhcFR1cGxlCWhlYXBUdXBsZTsKIAlEYXR1bQkJdmFsdWVzW0lOREVY X01BWF9LRVlTXTsKIAlib29sCQlpc251bGxbSU5ERVhfTUFYX0tFWVNdOwotCUV4cHJTdGF0 ZSAgKnByZWRpY2F0ZTsKKwlFeHByU3RhdGUgICpwcmVkaWNhdGVFeHBhbmQ7CiAJVHVwbGVU YWJsZVNsb3QgKnNsb3Q7CiAJRVN0YXRlCSAgICplc3RhdGU7CiAJRXhwckNvbnRleHQgKmVj b250ZXh0OwpAQCAtMTc1OCw3ICsxNzYwLDcgQEAgaGVhcGFtX2luZGV4X3ZhbGlkYXRlX3Nj YW4oUmVsYXRpb24gaGVhcFJlbGF0aW9uLAogCWVjb250ZXh0LT5lY3h0X3NjYW50dXBsZSA9 IHNsb3Q7CiAKIAkvKiBTZXQgdXAgZXhlY3V0aW9uIHN0YXRlIGZvciBwcmVkaWNhdGUsIGlm IGFueS4gKi8KLQlwcmVkaWNhdGUgPSBFeGVjUHJlcGFyZVF1YWwoaW5kZXhJbmZvLT5paV9Q cmVkaWNhdGUsIGVzdGF0ZSk7CisJcHJlZGljYXRlRXhwYW5kID0gRXhlY1ByZXBhcmVRdWFs KGluZGV4SW5mby0+aWlfUHJlZGljYXRlRXhwYW5kLCBlc3RhdGUpOwogCiAJLyoKIAkgKiBQ cmVwYXJlIGZvciBzY2FuIG9mIHRoZSBiYXNlIHJlbGF0aW9uLiAgV2UgbmVlZCBqdXN0IHRo b3NlIHR1cGxlcwpAQCAtMTg5NSw5ICsxODk3LDkgQEAgaGVhcGFtX2luZGV4X3ZhbGlkYXRl X3NjYW4oUmVsYXRpb24gaGVhcFJlbGF0aW9uLAogCQkJICogSW4gYSBwYXJ0aWFsIGluZGV4 LCBkaXNjYXJkIHR1cGxlcyB0aGF0IGRvbid0IHNhdGlzZnkgdGhlCiAJCQkgKiBwcmVkaWNh dGUuCiAJCQkgKi8KLQkJCWlmIChwcmVkaWNhdGUgIT0gTlVMTCkKKwkJCWlmIChwcmVkaWNh dGVFeHBhbmQgIT0gTlVMTCkKIAkJCXsKLQkJCQlpZiAoIUV4ZWNRdWFsKHByZWRpY2F0ZSwg ZWNvbnRleHQpKQorCQkJCWlmICghRXhlY1F1YWwocHJlZGljYXRlRXhwYW5kLCBlY29udGV4 dCkpCiAJCQkJCWNvbnRpbnVlOwogCQkJfQogCkBAIC0xOTUyLDcgKzE5NTQsOSBAQCBoZWFw YW1faW5kZXhfdmFsaWRhdGVfc2NhbihSZWxhdGlvbiBoZWFwUmVsYXRpb24sCiAKIAkvKiBU aGVzZSBtYXkgaGF2ZSBiZWVuIHBvaW50aW5nIHRvIHRoZSBub3ctZ29uZSBlc3RhdGUgKi8K IAlpbmRleEluZm8tPmlpX0V4cHJlc3Npb25zU3RhdGUgPSBOSUw7CisJaW5kZXhJbmZvLT5p aV9FeHByZXNzaW9uc0V4cGFuZFN0YXRlID0gTklMOwogCWluZGV4SW5mby0+aWlfUHJlZGlj YXRlU3RhdGUgPSBOVUxMOworCWluZGV4SW5mby0+aWlfUHJlZGljYXRlRXhwYW5kU3RhdGUg PSBOVUxMOwogfQogCiAvKgpkaWZmIC0tZ2l0IGEvc3JjL2JhY2tlbmQvYm9vdHN0cmFwL2Jv b3RzdHJhcC5jIGIvc3JjL2JhY2tlbmQvYm9vdHN0cmFwL2Jvb3RzdHJhcC5jCmluZGV4IGIw ZGNkOTg3Li44MGJmNGZjNCAxMDA2NDQKLS0tIGEvc3JjL2JhY2tlbmQvYm9vdHN0cmFwL2Jv b3RzdHJhcC5jCisrKyBiL3NyYy9iYWNrZW5kL2Jvb3RzdHJhcC9ib290c3RyYXAuYwpAQCAt MTE1NiwxMSArMTE1NiwxNyBAQCBpbmRleF9yZWdpc3RlcihPaWQgaGVhcCwKIAkvKiBleHBy ZXNzaW9ucyB3aWxsIGxpa2VseSBiZSBudWxsLCBidXQgbWF5IGFzIHdlbGwgY29weSBpdCAq LwogCW5ld2luZC0+aWxfaW5mby0+aWlfRXhwcmVzc2lvbnMgPQogCQljb3B5T2JqZWN0KGlu ZGV4SW5mby0+aWlfRXhwcmVzc2lvbnMpOworCW5ld2luZC0+aWxfaW5mby0+aWlfRXhwcmVz c2lvbnNFeHBhbmQgPQorCQljb3B5T2JqZWN0KGluZGV4SW5mby0+aWlfRXhwcmVzc2lvbnNF eHBhbmQpOwogCW5ld2luZC0+aWxfaW5mby0+aWlfRXhwcmVzc2lvbnNTdGF0ZSA9IE5JTDsK KwluZXdpbmQtPmlsX2luZm8tPmlpX0V4cHJlc3Npb25zRXhwYW5kU3RhdGUgPSBOSUw7CiAJ LyogcHJlZGljYXRlIHdpbGwgbGlrZWx5IGJlIG51bGwsIGJ1dCBtYXkgYXMgd2VsbCBjb3B5 IGl0ICovCiAJbmV3aW5kLT5pbF9pbmZvLT5paV9QcmVkaWNhdGUgPQogCQljb3B5T2JqZWN0 KGluZGV4SW5mby0+aWlfUHJlZGljYXRlKTsKKwluZXdpbmQtPmlsX2luZm8tPmlpX1ByZWRp Y2F0ZUV4cGFuZCA9CisJCWNvcHlPYmplY3QoaW5kZXhJbmZvLT5paV9QcmVkaWNhdGVFeHBh bmQpOwogCW5ld2luZC0+aWxfaW5mby0+aWlfUHJlZGljYXRlU3RhdGUgPSBOVUxMOworCW5l d2luZC0+aWxfaW5mby0+aWlfUHJlZGljYXRlRXhwYW5kU3RhdGUgPSBOVUxMOwogCS8qIG5v IGV4Y2x1c2lvbiBjb25zdHJhaW50cyBhdCBib290c3RyYXAgdGltZSwgc28gbm8gbmVlZCB0 byBjb3B5ICovCiAJQXNzZXJ0KGluZGV4SW5mby0+aWlfRXhjbHVzaW9uT3BzID09IE5VTEwp OwogCUFzc2VydChpbmRleEluZm8tPmlpX0V4Y2x1c2lvblByb2NzID09IE5VTEwpOwpkaWZm IC0tZ2l0IGEvc3JjL2JhY2tlbmQvY2F0YWxvZy9pbmRleC5jIGIvc3JjL2JhY2tlbmQvY2F0 YWxvZy9pbmRleC5jCmluZGV4IDk0MDdjMzU3Li5lZTI2MGZkZSAxMDA2NDQKLS0tIGEvc3Jj L2JhY2tlbmQvY2F0YWxvZy9pbmRleC5jCisrKyBiL3NyYy9iYWNrZW5kL2NhdGFsb2cvaW5k ZXguYwpAQCAtMTQwMyw2ICsxNDAzLDEwIEBAIGluZGV4X2NyZWF0ZV9jb3B5KFJlbGF0aW9u IGhlYXBSZWxhdGlvbiwgdWludDE2IGZsYWdzLAogCQkJCQkJCWNvbmN1cnJlbnRseSwJLyog Y29uY3VycmVudCAqLwogCQkJCQkJCWluZGV4UmVsYXRpb24tPnJkX2luZGFtLT5hbXN1bW1h cml6aW5nLAogCQkJCQkJCW9sZEluZm8tPmlpX1dpdGhvdXRPdmVybGFwcyk7CisJbmV3SW5m by0+aWlfRXhwcmVzc2lvbnNFeHBhbmQgPQorCQlFeHBhbmRWaXJ0dWFsR2VuZXJhdGVkQ29s dW1ucyhuZXdJbmZvLT5paV9FeHByZXNzaW9uc0V4cGFuZCwgaGVhcFJlbGF0aW9uLCBJbnZh bGlkT2lkKTsKKwluZXdJbmZvLT5paV9QcmVkaWNhdGVFeHBhbmQgPQorCQlFeHBhbmRWaXJ0 dWFsR2VuZXJhdGVkQ29sdW1ucyhuZXdJbmZvLT5paV9QcmVkaWNhdGVFeHBhbmQsIGhlYXBS ZWxhdGlvbiwgSW52YWxpZE9pZCk7CiAKIAkvKiBmZXRjaCBleGNsdXNpb24gY29uc3RyYWlu dCBpbmZvIGlmIGFueSAqLwogCWlmIChpbmRleFJlbGF0aW9uLT5yZF9pbmRleC0+aW5kaXNl eGNsdXNpb24pCkBAIC0yNDcxLDYgKzI0NzUsOCBAQCBCdWlsZEluZGV4SW5mbyhSZWxhdGlv biBpbmRleCkKIAkJCQkJICAgZmFsc2UsCiAJCQkJCSAgIGluZGV4LT5yZF9pbmRhbS0+YW1z dW1tYXJpemluZywKIAkJCQkJICAgaW5kZXhTdHJ1Y3QtPmluZGlzZXhjbHVzaW9uICYmIGlu ZGV4U3RydWN0LT5pbmRpc3VuaXF1ZSk7CisJaWktPmlpX0V4cHJlc3Npb25zRXhwYW5kID0g KExpc3QgKilSZWxhdGlvbkdldEluZGV4RXhwcmVzc2lvbnNFeHBhbmQoaW5kZXgpOworCWlp LT5paV9QcmVkaWNhdGVFeHBhbmQgPSAoTGlzdCAqKVJlbGF0aW9uR2V0SW5kZXhQcmVkaWNh dGVFeHBhbmQoaW5kZXgpOwogCiAJLyogZmlsbCBpbiBhdHRyaWJ1dGUgbnVtYmVycyAqLwog CWZvciAoaSA9IDA7IGkgPCBudW1BdHRzOyBpKyspCkBAIC0yNzYwLDEwICsyNzY2LDEyIEBA IEZvcm1JbmRleERhdHVtKEluZGV4SW5mbyAqaW5kZXhJbmZvLAogCQkvKiBGaXJzdCB0aW1l IHRocm91Z2gsIHNldCB1cCBleHByZXNzaW9uIGV2YWx1YXRpb24gc3RhdGUgKi8KIAkJaW5k ZXhJbmZvLT5paV9FeHByZXNzaW9uc1N0YXRlID0KIAkJCUV4ZWNQcmVwYXJlRXhwckxpc3Qo aW5kZXhJbmZvLT5paV9FeHByZXNzaW9ucywgZXN0YXRlKTsKKwkJaW5kZXhJbmZvLT5paV9F eHByZXNzaW9uc0V4cGFuZFN0YXRlID0KKwkJCUV4ZWNQcmVwYXJlRXhwckxpc3QoaW5kZXhJ bmZvLT5paV9FeHByZXNzaW9uc0V4cGFuZCwgZXN0YXRlKTsKIAkJLyogQ2hlY2sgY2FsbGVy IGhhcyBzZXQgdXAgY29udGV4dCBjb3JyZWN0bHkgKi8KIAkJQXNzZXJ0KEdldFBlclR1cGxl RXhwckNvbnRleHQoZXN0YXRlKS0+ZWN4dF9zY2FudHVwbGUgPT0gc2xvdCk7CiAJfQotCWlu ZGV4cHJfaXRlbSA9IGxpc3RfaGVhZChpbmRleEluZm8tPmlpX0V4cHJlc3Npb25zU3RhdGUp OworCWluZGV4cHJfaXRlbSA9IGxpc3RfaGVhZChpbmRleEluZm8tPmlpX0V4cHJlc3Npb25z RXhwYW5kU3RhdGUpOwogCiAJZm9yIChpID0gMDsgaSA8IGluZGV4SW5mby0+aWlfTnVtSW5k ZXhBdHRyczsgaSsrKQogCXsKQEAgLTI3NzUsMTEgKzI3ODMsNDAgQEAgRm9ybUluZGV4RGF0 dW0oSW5kZXhJbmZvICppbmRleEluZm8sCiAJCQlpRGF0dW0gPSBzbG90X2dldHN5c2F0dHIo c2xvdCwga2V5Y29sLCAmaXNOdWxsKTsKIAkJZWxzZSBpZiAoa2V5Y29sICE9IDApCiAJCXsK LQkJCS8qCi0JCQkgKiBQbGFpbiBpbmRleCBjb2x1bW47IGdldCB0aGUgdmFsdWUgd2UgbmVl ZCBkaXJlY3RseSBmcm9tIHRoZQotCQkJICogaGVhcCB0dXBsZS4KLQkJCSAqLwotCQkJaURh dHVtID0gc2xvdF9nZXRhdHRyKHNsb3QsIGtleWNvbCwgJmlzTnVsbCk7CisJCQlUdXBsZURl c2MJCQl0dXBkZXNjID0gc2xvdC0+dHRzX3R1cGxlRGVzY3JpcHRvcjsKKwkJCUZvcm1fcGdf YXR0cmlidXRlIAlhdHQgPSBUdXBsZURlc2NBdHRyKHR1cGRlc2MsIGtleWNvbCAtIDEpOwor CisJCQlpZiAoYXR0LT5hdHRnZW5lcmF0ZWQgIT0gQVRUUklCVVRFX0dFTkVSQVRFRF9WSVJU VUFMKQorCQkJeworCQkJCS8qCisJCQkJICogUGxhaW4gaW5kZXggY29sdW1uOyBnZXQgdGhl IHZhbHVlIHdlIG5lZWQgZGlyZWN0bHkgZnJvbSB0aGUKKwkJCQkgKiBoZWFwIHR1cGxlLgor CQkJCSovCisJCQkJaURhdHVtID0gc2xvdF9nZXRhdHRyKHNsb3QsIGtleWNvbCwgJmlzTnVs bCk7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJVHVwbGVDb25zdHIgCSpjb25zdHIgPSB0 dXBkZXNjLT5jb25zdHI7CisKKwkJCQlmb3IgKGludCBqID0gMDsgaiA8IGNvbnN0ci0+bnVt X2RlZnZhbDsgaisrKQorCQkJCXsKKwkJCQkJQXR0ckRlZmF1bHQgCSpkZWZ2YWw7CisJCQkJ CUV4cHIJICAgCQkqZXhwciA9IE5VTEw7CisJCQkJCUV4cHJTdGF0ZSAgCQkqZXhwcnN0YXRl OworCisJCQkJCWRlZnZhbCA9ICZjb25zdHItPmRlZnZhbFtqXTsKKwkJCQkJaWYgKGRlZnZh bC0+YWRudW0gPT0ga2V5Y29sKQorCQkJCQl7CisJCQkJCQlleHByID0gc3RyaW5nVG9Ob2Rl KGRlZnZhbC0+YWRiaW4pOworCQkJCQkJZXhwcnN0YXRlID0gRXhlY1ByZXBhcmVFeHByKGV4 cHIsIGVzdGF0ZSk7CisJCQkJCQlpRGF0dW0gPSBFeGVjRXZhbEV4cHJTd2l0Y2hDb250ZXh0 KGV4cHJzdGF0ZSwKKwkJCQkJCQkJCQkJCQkJICAgR2V0UGVyVHVwbGVFeHByQ29udGV4dChl c3RhdGUpLAorCQkJCQkJCQkJCQkJCQkgICAmaXNOdWxsKTsKKwkJCQkJCWJyZWFrOworCQkJ CQl9CisJCQkJCUFzc2VydChqICsgMSA8IGNvbnN0ci0+bnVtX2RlZnZhbCk7CisJCQkJfQor CQkJfQogCQl9CiAJCWVsc2UKIAkJewpAQCAtMjc5MSw3ICsyODI4LDcgQEAgRm9ybUluZGV4 RGF0dW0oSW5kZXhJbmZvICppbmRleEluZm8sCiAJCQlpRGF0dW0gPSBFeGVjRXZhbEV4cHJT d2l0Y2hDb250ZXh0KChFeHByU3RhdGUgKikgbGZpcnN0KGluZGV4cHJfaXRlbSksCiAJCQkJ CQkJCQkJCSAgIEdldFBlclR1cGxlRXhwckNvbnRleHQoZXN0YXRlKSwKIAkJCQkJCQkJCQkJ ICAgJmlzTnVsbCk7Ci0JCQlpbmRleHByX2l0ZW0gPSBsbmV4dChpbmRleEluZm8tPmlpX0V4 cHJlc3Npb25zU3RhdGUsIGluZGV4cHJfaXRlbSk7CisJCQlpbmRleHByX2l0ZW0gPSBsbmV4 dChpbmRleEluZm8tPmlpX0V4cHJlc3Npb25zRXhwYW5kU3RhdGUsIGluZGV4cHJfaXRlbSk7 CiAJCX0KIAkJdmFsdWVzW2ldID0gaURhdHVtOwogCQlpc251bGxbaV0gPSBpc051bGw7CkBA IC0zMjIwLDcgKzMyNTcsNyBAQCBJbmRleENoZWNrRXhjbHVzaW9uKFJlbGF0aW9uIGhlYXBS ZWxhdGlvbiwKIAlUYWJsZVNjYW5EZXNjIHNjYW47CiAJRGF0dW0JCXZhbHVlc1tJTkRFWF9N QVhfS0VZU107CiAJYm9vbAkJaXNudWxsW0lOREVYX01BWF9LRVlTXTsKLQlFeHByU3RhdGUg ICpwcmVkaWNhdGU7CisJRXhwclN0YXRlICAqcHJlZGljYXRlRXhwYW5kOwogCVR1cGxlVGFi bGVTbG90ICpzbG90OwogCUVTdGF0ZQkgICAqZXN0YXRlOwogCUV4cHJDb250ZXh0ICplY29u dGV4dDsKQEAgLTMyNDYsNyArMzI4Myw3IEBAIEluZGV4Q2hlY2tFeGNsdXNpb24oUmVsYXRp b24gaGVhcFJlbGF0aW9uLAogCWVjb250ZXh0LT5lY3h0X3NjYW50dXBsZSA9IHNsb3Q7CiAK IAkvKiBTZXQgdXAgZXhlY3V0aW9uIHN0YXRlIGZvciBwcmVkaWNhdGUsIGlmIGFueS4gKi8K LQlwcmVkaWNhdGUgPSBFeGVjUHJlcGFyZVF1YWwoaW5kZXhJbmZvLT5paV9QcmVkaWNhdGUs IGVzdGF0ZSk7CisJcHJlZGljYXRlRXhwYW5kID0gRXhlY1ByZXBhcmVRdWFsKGluZGV4SW5m by0+aWlfUHJlZGljYXRlRXhwYW5kLCBlc3RhdGUpOwogCiAJLyoKIAkgKiBTY2FuIGFsbCBs aXZlIHR1cGxlcyBpbiB0aGUgYmFzZSByZWxhdGlvbi4KQEAgLTMyNjYsOSArMzMwMyw5IEBA IEluZGV4Q2hlY2tFeGNsdXNpb24oUmVsYXRpb24gaGVhcFJlbGF0aW9uLAogCQkvKgogCQkg KiBJbiBhIHBhcnRpYWwgaW5kZXgsIGlnbm9yZSB0dXBsZXMgdGhhdCBkb24ndCBzYXRpc2Z5 IHRoZSBwcmVkaWNhdGUuCiAJCSAqLwotCQlpZiAocHJlZGljYXRlICE9IE5VTEwpCisJCWlm IChwcmVkaWNhdGVFeHBhbmQgIT0gTlVMTCkKIAkJewotCQkJaWYgKCFFeGVjUXVhbChwcmVk aWNhdGUsIGVjb250ZXh0KSkKKwkJCWlmICghRXhlY1F1YWwocHJlZGljYXRlRXhwYW5kLCBl Y29udGV4dCkpCiAJCQkJY29udGludWU7CiAJCX0KIApAQCAtMzMwMSw3ICszMzM4LDkgQEAg SW5kZXhDaGVja0V4Y2x1c2lvbihSZWxhdGlvbiBoZWFwUmVsYXRpb24sCiAKIAkvKiBUaGVz ZSBtYXkgaGF2ZSBiZWVuIHBvaW50aW5nIHRvIHRoZSBub3ctZ29uZSBlc3RhdGUgKi8KIAlp bmRleEluZm8tPmlpX0V4cHJlc3Npb25zU3RhdGUgPSBOSUw7CisJaW5kZXhJbmZvLT5paV9F eHByZXNzaW9uc0V4cGFuZFN0YXRlID0gTklMOwogCWluZGV4SW5mby0+aWlfUHJlZGljYXRl U3RhdGUgPSBOVUxMOworCWluZGV4SW5mby0+aWlfUHJlZGljYXRlRXhwYW5kU3RhdGUgPSBO VUxMOwogfQogCiAvKgpkaWZmIC0tZ2l0IGEvc3JjL2JhY2tlbmQvY2F0YWxvZy9pbmRleGlu Zy5jIGIvc3JjL2JhY2tlbmQvY2F0YWxvZy9pbmRleGluZy5jCmluZGV4IGZkN2QyZWMwLi5k MjdhYWEwOSAxMDA2NDQKLS0tIGEvc3JjL2JhY2tlbmQvY2F0YWxvZy9pbmRleGluZy5jCisr KyBiL3NyYy9iYWNrZW5kL2NhdGFsb2cvaW5kZXhpbmcuYwpAQCAtMTMzLDcgKzEzMyw5IEBA IENhdGFsb2dJbmRleEluc2VydChDYXRhbG9nSW5kZXhTdGF0ZSBpbmRzdGF0ZSwgSGVhcFR1 cGxlIGhlYXBUdXBsZSwKIAkJICogc3VwcG9ydGVkLCBub3IgZXhjbHVzaW9uIGNvbnN0cmFp bnRzLCBub3IgZGVmZXJyZWQgdW5pcXVlbmVzcwogCQkgKi8KIAkJQXNzZXJ0KGluZGV4SW5m by0+aWlfRXhwcmVzc2lvbnMgPT0gTklMKTsKKwkJQXNzZXJ0KGluZGV4SW5mby0+aWlfRXhw cmVzc2lvbnNFeHBhbmQgPT0gTklMKTsKIAkJQXNzZXJ0KGluZGV4SW5mby0+aWlfUHJlZGlj YXRlID09IE5JTCk7CisJCUFzc2VydChpbmRleEluZm8tPmlpX1ByZWRpY2F0ZUV4cGFuZCA9 PSBOSUwpOwogCQlBc3NlcnQoaW5kZXhJbmZvLT5paV9FeGNsdXNpb25PcHMgPT0gTlVMTCk7 CiAJCUFzc2VydChpbmRleC0+cmRfaW5kZXgtPmluZGltbWVkaWF0ZSk7CiAJCUFzc2VydChp bmRleEluZm8tPmlpX051bUluZGV4S2V5QXR0cnMgIT0gMCk7CmRpZmYgLS1naXQgYS9zcmMv YmFja2VuZC9jYXRhbG9nL3RvYXN0aW5nLmMgYi9zcmMvYmFja2VuZC9jYXRhbG9nL3RvYXN0 aW5nLmMKaW5kZXggNGFhNTJhNGIuLmRhZWJmZGExIDEwMDY0NAotLS0gYS9zcmMvYmFja2Vu ZC9jYXRhbG9nL3RvYXN0aW5nLmMKKysrIGIvc3JjL2JhY2tlbmQvY2F0YWxvZy90b2FzdGlu Zy5jCkBAIC0yOTgsOSArMjk4LDEzIEBAIGNyZWF0ZV90b2FzdF90YWJsZShSZWxhdGlvbiBy ZWwsIE9pZCB0b2FzdE9pZCwgT2lkIHRvYXN0SW5kZXhPaWQsCiAJaW5kZXhJbmZvLT5paV9J bmRleEF0dHJOdW1iZXJzWzBdID0gMTsKIAlpbmRleEluZm8tPmlpX0luZGV4QXR0ck51bWJl cnNbMV0gPSAyOwogCWluZGV4SW5mby0+aWlfRXhwcmVzc2lvbnMgPSBOSUw7CisJaW5kZXhJ bmZvLT5paV9FeHByZXNzaW9uc0V4cGFuZCA9IE5JTDsKIAlpbmRleEluZm8tPmlpX0V4cHJl c3Npb25zU3RhdGUgPSBOSUw7CisJaW5kZXhJbmZvLT5paV9FeHByZXNzaW9uc0V4cGFuZFN0 YXRlID0gTklMOwogCWluZGV4SW5mby0+aWlfUHJlZGljYXRlID0gTklMOworCWluZGV4SW5m by0+aWlfUHJlZGljYXRlRXhwYW5kID0gTklMOwogCWluZGV4SW5mby0+aWlfUHJlZGljYXRl U3RhdGUgPSBOVUxMOworCWluZGV4SW5mby0+aWlfUHJlZGljYXRlRXhwYW5kU3RhdGUgPSBO VUxMOwogCWluZGV4SW5mby0+aWlfRXhjbHVzaW9uT3BzID0gTlVMTDsKIAlpbmRleEluZm8t PmlpX0V4Y2x1c2lvblByb2NzID0gTlVMTDsKIAlpbmRleEluZm8tPmlpX0V4Y2x1c2lvblN0 cmF0cyA9IE5VTEw7CmRpZmYgLS1naXQgYS9zcmMvYmFja2VuZC9jb21tYW5kcy9hbmFseXpl LmMgYi9zcmMvYmFja2VuZC9jb21tYW5kcy9hbmFseXplLmMKaW5kZXggZjY2ZTgwYjcuLmZj NjdjMjRhIDEwMDY0NAotLS0gYS9zcmMvYmFja2VuZC9jb21tYW5kcy9hbmFseXplLmMKKysr IGIvc3JjL2JhY2tlbmQvY29tbWFuZHMvYW5hbHl6ZS5jCkBAIC04OTksNyArODk5LDcgQEAg Y29tcHV0ZV9pbmRleF9zdGF0cyhSZWxhdGlvbiBvbmVyZWwsIGRvdWJsZSB0b3RhbHJvd3Ms CiAJCVR1cGxlVGFibGVTbG90ICpzbG90OwogCQlFU3RhdGUJICAgKmVzdGF0ZTsKIAkJRXhw ckNvbnRleHQgKmVjb250ZXh0OwotCQlFeHByU3RhdGUgICpwcmVkaWNhdGU7CisJCUV4cHJT dGF0ZSAgKnByZWRpY2F0ZUV4cGFuZDsKIAkJRGF0dW0JICAgKmV4cHJ2YWxzOwogCQlib29s CSAgICpleHBybnVsbHM7CiAJCWludAkJCW51bWluZGV4cm93cywKQEAgLTkwOCw3ICs5MDgs NyBAQCBjb21wdXRlX2luZGV4X3N0YXRzKFJlbGF0aW9uIG9uZXJlbCwgZG91YmxlIHRvdGFs cm93cywKIAkJZG91YmxlCQl0b3RhbGluZGV4cm93czsKIAogCQkvKiBJZ25vcmUgaW5kZXgg aWYgbm8gY29sdW1ucyB0byBhbmFseXplIGFuZCBub3QgcGFydGlhbCAqLwotCQlpZiAoYXR0 cl9jbnQgPT0gMCAmJiBpbmRleEluZm8tPmlpX1ByZWRpY2F0ZSA9PSBOSUwpCisJCWlmIChh dHRyX2NudCA9PSAwICYmIGluZGV4SW5mby0+aWlfUHJlZGljYXRlRXhwYW5kID09IE5JTCkK IAkJCWNvbnRpbnVlOwogCiAJCS8qCkBAIC05MjYsNyArOTI2LDcgQEAgY29tcHV0ZV9pbmRl eF9zdGF0cyhSZWxhdGlvbiBvbmVyZWwsIGRvdWJsZSB0b3RhbHJvd3MsCiAJCWVjb250ZXh0 LT5lY3h0X3NjYW50dXBsZSA9IHNsb3Q7CiAKIAkJLyogU2V0IHVwIGV4ZWN1dGlvbiBzdGF0 ZSBmb3IgcHJlZGljYXRlLiAqLwotCQlwcmVkaWNhdGUgPSBFeGVjUHJlcGFyZVF1YWwoaW5k ZXhJbmZvLT5paV9QcmVkaWNhdGUsIGVzdGF0ZSk7CisJCXByZWRpY2F0ZUV4cGFuZCA9IEV4 ZWNQcmVwYXJlUXVhbChpbmRleEluZm8tPmlpX1ByZWRpY2F0ZUV4cGFuZCwgZXN0YXRlKTsK IAogCQkvKiBDb21wdXRlIGFuZCBzYXZlIGluZGV4IGV4cHJlc3Npb24gdmFsdWVzICovCiAJ CWV4cHJ2YWxzID0gKERhdHVtICopIHBhbGxvYyhudW1yb3dzICogYXR0cl9jbnQgKiBzaXpl b2YoRGF0dW0pKTsKQEAgLTk0OSw5ICs5NDksOSBAQCBjb21wdXRlX2luZGV4X3N0YXRzKFJl bGF0aW9uIG9uZXJlbCwgZG91YmxlIHRvdGFscm93cywKIAkJCUV4ZWNTdG9yZUhlYXBUdXBs ZShoZWFwVHVwbGUsIHNsb3QsIGZhbHNlKTsKIAogCQkJLyogSWYgaW5kZXggaXMgcGFydGlh bCwgY2hlY2sgcHJlZGljYXRlICovCi0JCQlpZiAocHJlZGljYXRlICE9IE5VTEwpCisJCQlp ZiAocHJlZGljYXRlRXhwYW5kICE9IE5VTEwpCiAJCQl7Ci0JCQkJaWYgKCFFeGVjUXVhbChw cmVkaWNhdGUsIGVjb250ZXh0KSkKKwkJCQlpZiAoIUV4ZWNRdWFsKHByZWRpY2F0ZUV4cGFu ZCwgZWNvbnRleHQpKQogCQkJCQljb250aW51ZTsKIAkJCX0KIAkJCW51bWluZGV4cm93cysr OwpkaWZmIC0tZ2l0IGEvc3JjL2JhY2tlbmQvY29tbWFuZHMvaW5kZXhjbWRzLmMgYi9zcmMv YmFja2VuZC9jb21tYW5kcy9pbmRleGNtZHMuYwppbmRleCA5YWI3NGM4ZC4uOGE2M2VmYzgg MTAwNjQ0Ci0tLSBhL3NyYy9iYWNrZW5kL2NvbW1hbmRzL2luZGV4Y21kcy5jCisrKyBiL3Ny Yy9iYWNrZW5kL2NvbW1hbmRzL2luZGV4Y21kcy5jCkBAIC05MzIsNiArOTMyLDggQEAgRGVm aW5lSW5kZXgoUGFyc2VTdGF0ZSAqcHN0YXRlLAogCQkJCQkJCSAgY29uY3VycmVudCwKIAkJ CQkJCQkgIGFtaXNzdW1tYXJpemluZywKIAkJCQkJCQkgIHN0bXQtPmlzd2l0aG91dG92ZXJs YXBzKTsKKwlpbmRleEluZm8tPmlpX1ByZWRpY2F0ZUV4cGFuZCA9CisJCUV4cGFuZFZpcnR1 YWxHZW5lcmF0ZWRDb2x1bW5zKGluZGV4SW5mby0+aWlfUHJlZGljYXRlRXhwYW5kLCByZWws IEludmFsaWRPaWQpOwogCiAJdHlwZUlkcyA9IHBhbGxvY19hcnJheShPaWQsIG51bWJlck9m QXR0cmlidXRlcyk7CiAJY29sbGF0aW9uSWRzID0gcGFsbG9jX2FycmF5KE9pZCwgbnVtYmVy T2ZBdHRyaWJ1dGVzKTsKQEAgLTk0OCw2ICs5NTAsOCBAQCBEZWZpbmVJbmRleChQYXJzZVN0 YXRlICpwc3RhdGUsCiAJCQkJCSAgcm9vdF9zYXZlX3VzZXJpZCwgcm9vdF9zYXZlX3NlY19j b250ZXh0LAogCQkJCQkgICZyb290X3NhdmVfbmVzdGxldmVsKTsKIAorCWluZGV4SW5mby0+ aWlfRXhwcmVzc2lvbnNFeHBhbmQgPQorCQlFeHBhbmRWaXJ0dWFsR2VuZXJhdGVkQ29sdW1u cyhpbmRleEluZm8tPmlpX0V4cHJlc3Npb25zRXhwYW5kLCByZWwsIEludmFsaWRPaWQpOwog CS8qCiAJICogRXh0cmEgY2hlY2tzIHdoZW4gY3JlYXRpbmcgYSBQUklNQVJZIEtFWSBpbmRl eC4KIAkgKi8KQEAgLTExMTAsNyArMTExNCw3IEBAIERlZmluZUluZGV4KFBhcnNlU3RhdGUg KnBzdGF0ZSwKIAkgKiBXZSBkaXNhbGxvdyBpbmRleGVzIG9uIHN5c3RlbSBjb2x1bW5zLiAg VGhleSB3b3VsZCBub3QgbmVjZXNzYXJpbHkgZ2V0CiAJICogdXBkYXRlZCBjb3JyZWN0bHks IGFuZCB0aGV5IGRvbid0IHNlZW0gdXNlZnVsIGFueXdheS4KIAkgKgotCSAqIEFsc28gZGlz YWxsb3cgdmlydHVhbCBnZW5lcmF0ZWQgY29sdW1ucyBpbiBpbmRleGVzICh1c2UgZXhwcmVz c2lvbgorCSAqIEFpc2FsbG93IHZpcnR1YWwgZ2VuZXJhdGVkIGNvbHVtbnMgaW4gaW5kZXhl cyAoaW5jbHVkZSB1c2luZyBleHByZXNzaW9uCiAJICogaW5kZXggaW5zdGVhZCkuCiAJICov CiAJZm9yIChpbnQgaSA9IDA7IGkgPCBpbmRleEluZm8tPmlpX051bUluZGV4QXR0cnM7IGkr KykKQEAgLTExMjMsNyArMTEyNyw3IEBAIERlZmluZUluZGV4KFBhcnNlU3RhdGUgKnBzdGF0 ZSwKIAkJCQkJIGVycm1zZygiaW5kZXggY3JlYXRpb24gb24gc3lzdGVtIGNvbHVtbnMgaXMg bm90IHN1cHBvcnRlZCIpKSk7CiAKIAotCQlpZiAoYXR0bm8gPiAwICYmCisJCS8qaWYgKGF0 dG5vID4gMCAmJiBpIDwgbnVtYmVyT2ZLZXlBdHRyaWJ1dGVzICYmCiAJCQlUdXBsZURlc2NB dHRyKFJlbGF0aW9uR2V0RGVzY3IocmVsKSwgYXR0bm8gLSAxKS0+YXR0Z2VuZXJhdGVkID09 IEFUVFJJQlVURV9HRU5FUkFURURfVklSVFVBTCkKIAkJCWVyZXBvcnQoRVJST1IsCiAJCQkJ CWVycmNvZGUoRVJSQ09ERV9GRUFUVVJFX05PVF9TVVBQT1JURUQpLApAQCAtMTEzMSwxNyAr MTEzNSwxNSBAQCBEZWZpbmVJbmRleChQYXJzZVN0YXRlICpwc3RhdGUsCiAJCQkJCWVycm1z ZygicHJpbWFyeSBrZXlzIG9uIHZpcnR1YWwgZ2VuZXJhdGVkIGNvbHVtbnMgYXJlIG5vdCBz dXBwb3J0ZWQiKSA6CiAJCQkJCXN0bXQtPmlzY29uc3RyYWludCA/CiAJCQkJCWVycm1zZygi dW5pcXVlIGNvbnN0cmFpbnRzIG9uIHZpcnR1YWwgZ2VuZXJhdGVkIGNvbHVtbnMgYXJlIG5v dCBzdXBwb3J0ZWQiKSA6Ci0JCQkJCWVycm1zZygiaW5kZXhlcyBvbiB2aXJ0dWFsIGdlbmVy YXRlZCBjb2x1bW5zIGFyZSBub3Qgc3VwcG9ydGVkIikpOworCQkJCQllcnJtc2coImluZGV4 ZXMgb24gdmlydHVhbCBnZW5lcmF0ZWQgY29sdW1ucyBhcmUgbm90IHN1cHBvcnRlZCIpKTsq LwogCX0KIAogCS8qCi0JICogQWxzbyBjaGVjayBmb3Igc3lzdGVtIGFuZCBnZW5lcmF0ZWQg Y29sdW1ucyB1c2VkIGluIGV4cHJlc3Npb25zIG9yCi0JICogcHJlZGljYXRlcy4KKwkgKiBB bHNvIGNoZWNrIGZvciBzeXN0ZW0gY29sdW1ucyB1c2VkIGluIGV4cHJlc3Npb25zIG9yIHBy ZWRpY2F0ZXMuCiAJICovCiAJaWYgKGluZGV4SW5mby0+aWlfRXhwcmVzc2lvbnMgfHwgaW5k ZXhJbmZvLT5paV9QcmVkaWNhdGUpCiAJewogCQlCaXRtYXBzZXQgICppbmRleGF0dHJzID0g TlVMTDsKLQkJaW50CQkJajsKIAogCQlwdWxsX3ZhcmF0dG5vcygoTm9kZSAqKSBpbmRleElu Zm8tPmlpX0V4cHJlc3Npb25zLCAxLCAmaW5kZXhhdHRycyk7CiAJCXB1bGxfdmFyYXR0bm9z KChOb2RlICopIGluZGV4SW5mby0+aWlfUHJlZGljYXRlLCAxLCAmaW5kZXhhdHRycyk7CkBA IC0xMTU0LDI1ICsxMTU2LDYgQEAgRGVmaW5lSW5kZXgoUGFyc2VTdGF0ZSAqcHN0YXRlLAog CQkJCQkJKGVycmNvZGUoRVJSQ09ERV9GRUFUVVJFX05PVF9TVVBQT1JURUQpLAogCQkJCQkJ IGVycm1zZygiaW5kZXggY3JlYXRpb24gb24gc3lzdGVtIGNvbHVtbnMgaXMgbm90IHN1cHBv cnRlZCIpKSk7CiAJCX0KLQotCQkvKgotCQkgKiBYWFggVmlydHVhbCBnZW5lcmF0ZWQgY29s dW1ucyBpbiBpbmRleCBleHByZXNzaW9ucyBvciBwcmVkaWNhdGVzCi0JCSAqIGNvdWxkIGJl IHN1cHBvcnRlZCwgYnV0IGl0IG5lZWRzIHN1cHBvcnQgaW4KLQkJICogUmVsYXRpb25HZXRJ bmRleEV4cHJlc3Npb25zKCkgYW5kIFJlbGF0aW9uR2V0SW5kZXhQcmVkaWNhdGUoKS4KLQkJ ICovCi0JCWogPSAtMTsKLQkJd2hpbGUgKChqID0gYm1zX25leHRfbWVtYmVyKGluZGV4YXR0 cnMsIGopKSA+PSAwKQotCQl7Ci0JCQlBdHRyTnVtYmVyCWF0dG5vID0gaiArIEZpcnN0TG93 SW52YWxpZEhlYXBBdHRyaWJ1dGVOdW1iZXI7Ci0KLQkJCWlmIChhdHRubyA+IDAgJiYKLQkJ CQlUdXBsZURlc2NBdHRyKFJlbGF0aW9uR2V0RGVzY3IocmVsKSwgYXR0bm8gLSAxKS0+YXR0 Z2VuZXJhdGVkID09IEFUVFJJQlVURV9HRU5FUkFURURfVklSVFVBTCkKLQkJCQllcmVwb3J0 KEVSUk9SLAotCQkJCQkJKGVycmNvZGUoRVJSQ09ERV9GRUFUVVJFX05PVF9TVVBQT1JURUQp LAotCQkJCQkJIHN0bXQtPmlzY29uc3RyYWludCA/Ci0JCQkJCQkgZXJybXNnKCJ1bmlxdWUg Y29uc3RyYWludHMgb24gdmlydHVhbCBnZW5lcmF0ZWQgY29sdW1ucyBhcmUgbm90IHN1cHBv cnRlZCIpIDoKLQkJCQkJCSBlcnJtc2coImluZGV4ZXMgb24gdmlydHVhbCBnZW5lcmF0ZWQg Y29sdW1ucyBhcmUgbm90IHN1cHBvcnRlZCIpKSk7Ci0JCX0KIAl9CiAKIAkvKiBJcyBpbmRl eCBzYWZlIGZvciBvdGhlcnMgdG8gaWdub3JlPyAgU2VlIHNldF9pbmRleHNhZmVfcHJvY2Zs YWdzKCkgKi8KQEAgLTE4NzYsNiArMTg1OSwxMSBAQCBDaGVja1ByZWRpY2F0ZShFeHByICpw cmVkaWNhdGUpCiAgKiBJZiB0aGUgY2FsbGVyIHN3aXRjaGVkIHRvIHRoZSB0YWJsZSBvd25l ciwgZGRsX3VzZXJpZCBpcyB0aGUgcm9sZSBmb3IgQUNMCiAgKiBjaGVja3MgcmVhY2hlZCB3 aXRob3V0IHRyYXZlcnNpbmcgb3BhcXVlIGV4cHJlc3Npb25zLiAgT3RoZXJ3aXNlLCBpdCdz CiAgKiBJbnZhbGlkT2lkLCBhbmQgb3RoZXIgZGRsXyogYXJndW1lbnRzIGFyZSB1bmRlZmlu ZWQuCisgKgorICogVXBvbiByZXR1cm5pbmcgZnJvbSB0aGlzIGZ1bmN0aW9uLCBjYWxsZXJz IG11c3QgYXBwbHkKKyAqIEV4cGFuZFZpcnR1YWxHZW5lcmF0ZWRDb2x1bW5zKCkgdG8gaWlf RXhwcmVzc2lvbnNFeHBhbmQKKyAqIHdoZW4gbmVjZXNzYXJ5IGZvciBhY3R1YWwgZXhwYW5z aW9uIGlmIGlpX0V4cHJlc3Npb25zRXhwYW5kCisgKiBpcyBub3QgTklMIG9yIGR1bW15Lgog ICovCiBzdGF0aWMgdm9pZAogQ29tcHV0ZUluZGV4QXR0cnMoUGFyc2VTdGF0ZSAqcHN0YXRl LApAQCAtMjI3NCw2ICsyMjYyLDEwIEBAIENvbXB1dGVJbmRleEF0dHJzKFBhcnNlU3RhdGUg KnBzdGF0ZSwKIAogCQlhdHRuKys7CiAJfQorCisJaW5kZXhJbmZvLT5paV9FeHByZXNzaW9u c0V4cGFuZCA9CisJCUV4cGFuZFZpcnR1YWxHZW5lcmF0ZWRDb2x1bW5zKGNvcHlPYmplY3Qo aW5kZXhJbmZvLT5paV9FeHByZXNzaW9ucyksCisJCQkJCQkJCQkJCSAgTlVMTCwgcmVsSWQp OwogfQogCiAvKgpkaWZmIC0tZ2l0IGEvc3JjL2JhY2tlbmQvZXhlY3V0b3IvZXhlY0luZGV4 aW5nLmMgYi9zcmMvYmFja2VuZC9leGVjdXRvci9leGVjSW5kZXhpbmcuYwppbmRleCBlYjM4 MzgxMi4uYjQ3ZGFhZjUgMTAwNjQ0Ci0tLSBhL3NyYy9iYWNrZW5kL2V4ZWN1dG9yL2V4ZWNJ bmRleGluZy5jCisrKyBiL3NyYy9iYWNrZW5kL2V4ZWN1dG9yL2V4ZWNJbmRleGluZy5jCkBA IC0zODAsMjAgKzM4MCwyNCBAQCBFeGVjSW5zZXJ0SW5kZXhUdXBsZXMoUmVzdWx0UmVsSW5m byAqcmVzdWx0UmVsSW5mbywKIAkJaWYgKGluZGV4SW5mby0+aWlfUHJlZGljYXRlICE9IE5J TCkKIAkJewogCQkJRXhwclN0YXRlICAqcHJlZGljYXRlOworCQkJRXhwclN0YXRlICAqcHJl ZGljYXRlRXhwYW5kOwogCiAJCQkvKgogCQkJICogSWYgcHJlZGljYXRlIHN0YXRlIG5vdCBz ZXQgdXAgeWV0LCBjcmVhdGUgaXQgKGluIHRoZSBlc3RhdGUncwogCQkJICogcGVyLXF1ZXJ5 IGNvbnRleHQpCiAJCQkgKi8KIAkJCXByZWRpY2F0ZSA9IGluZGV4SW5mby0+aWlfUHJlZGlj YXRlU3RhdGU7CisJCQlwcmVkaWNhdGVFeHBhbmQgPSBpbmRleEluZm8tPmlpX1ByZWRpY2F0 ZUV4cGFuZFN0YXRlOwogCQkJaWYgKHByZWRpY2F0ZSA9PSBOVUxMKQogCQkJewogCQkJCXBy ZWRpY2F0ZSA9IEV4ZWNQcmVwYXJlUXVhbChpbmRleEluZm8tPmlpX1ByZWRpY2F0ZSwgZXN0 YXRlKTsKKwkJCQlwcmVkaWNhdGVFeHBhbmQgPSBFeGVjUHJlcGFyZVF1YWwoaW5kZXhJbmZv LT5paV9QcmVkaWNhdGVFeHBhbmQsIGVzdGF0ZSk7CiAJCQkJaW5kZXhJbmZvLT5paV9QcmVk aWNhdGVTdGF0ZSA9IHByZWRpY2F0ZTsKKwkJCQlpbmRleEluZm8tPmlpX1ByZWRpY2F0ZUV4 cGFuZFN0YXRlID0gcHJlZGljYXRlRXhwYW5kOwogCQkJfQogCiAJCQkvKiBTa2lwIHRoaXMg aW5kZXgtdXBkYXRlIGlmIHRoZSBwcmVkaWNhdGUgaXNuJ3Qgc2F0aXNmaWVkICovCi0JCQlp ZiAoIUV4ZWNRdWFsKHByZWRpY2F0ZSwgZWNvbnRleHQpKQorCQkJaWYgKCFFeGVjUXVhbChw cmVkaWNhdGVFeHBhbmQsIGVjb250ZXh0KSkKIAkJCQljb250aW51ZTsKIAkJfQogCkBAIC02 MTYsMjAgKzYyMCwyNCBAQCBFeGVjQ2hlY2tJbmRleENvbnN0cmFpbnRzKFJlc3VsdFJlbElu Zm8gKnJlc3VsdFJlbEluZm8sIFR1cGxlVGFibGVTbG90ICpzbG90LAogCQlpZiAoaW5kZXhJ bmZvLT5paV9QcmVkaWNhdGUgIT0gTklMKQogCQl7CiAJCQlFeHByU3RhdGUgICpwcmVkaWNh dGU7CisJCQlFeHByU3RhdGUgICpwcmVkaWNhdGVFeHBhbmQ7CiAKIAkJCS8qCiAJCQkgKiBJ ZiBwcmVkaWNhdGUgc3RhdGUgbm90IHNldCB1cCB5ZXQsIGNyZWF0ZSBpdCAoaW4gdGhlIGVz dGF0ZSdzCiAJCQkgKiBwZXItcXVlcnkgY29udGV4dCkKIAkJCSAqLwogCQkJcHJlZGljYXRl ID0gaW5kZXhJbmZvLT5paV9QcmVkaWNhdGVTdGF0ZTsKKwkJCXByZWRpY2F0ZUV4cGFuZCA9 IGluZGV4SW5mby0+aWlfUHJlZGljYXRlRXhwYW5kU3RhdGU7CiAJCQlpZiAocHJlZGljYXRl ID09IE5VTEwpCiAJCQl7CiAJCQkJcHJlZGljYXRlID0gRXhlY1ByZXBhcmVRdWFsKGluZGV4 SW5mby0+aWlfUHJlZGljYXRlLCBlc3RhdGUpOworCQkJCXByZWRpY2F0ZUV4cGFuZCA9IEV4 ZWNQcmVwYXJlUXVhbChpbmRleEluZm8tPmlpX1ByZWRpY2F0ZUV4cGFuZCwgZXN0YXRlKTsK IAkJCQlpbmRleEluZm8tPmlpX1ByZWRpY2F0ZVN0YXRlID0gcHJlZGljYXRlOworCQkJCWlu ZGV4SW5mby0+aWlfUHJlZGljYXRlRXhwYW5kU3RhdGUgPSBwcmVkaWNhdGVFeHBhbmQ7CiAJ CQl9CiAKIAkJCS8qIFNraXAgdGhpcyBpbmRleC11cGRhdGUgaWYgdGhlIHByZWRpY2F0ZSBp c24ndCBzYXRpc2ZpZWQgKi8KLQkJCWlmICghRXhlY1F1YWwocHJlZGljYXRlLCBlY29udGV4 dCkpCisJCQlpZiAoIUV4ZWNRdWFsKHByZWRpY2F0ZUV4cGFuZCwgZWNvbnRleHQpKQogCQkJ CWNvbnRpbnVlOwogCQl9CiAKQEAgLTExMDIsNiArMTExMCw3IEBAIGluZGV4X3VuY2hhbmdl ZF9ieV91cGRhdGUoUmVzdWx0UmVsSW5mbyAqcmVzdWx0UmVsSW5mbywgRVN0YXRlICplc3Rh dGUsCiAJICogcGFzcyBoaW50LgogCSAqLwogCWlkeEV4cHJzID0gUmVsYXRpb25HZXRJbmRl eEV4cHJlc3Npb25zKGluZGV4UmVsYXRpb24pOworCWlkeEV4cHJzID0gbGlzdF9jb25jYXQo aWR4RXhwcnMsIFJlbGF0aW9uR2V0SW5kZXhFeHByZXNzaW9uc0V4cGFuZChpbmRleFJlbGF0 aW9uKSk7CiAJaGFzZXhwcmVzc2lvbiA9IGluZGV4X2V4cHJlc3Npb25fY2hhbmdlZF93YWxr ZXIoKE5vZGUgKikgaWR4RXhwcnMsCiAJCQkJCQkJCQkJCQkJYWxsVXBkYXRlZENvbHMpOwog CWxpc3RfZnJlZShpZHhFeHBycyk7CmRpZmYgLS1naXQgYS9zcmMvYmFja2VuZC9ub2Rlcy9t YWtlZnVuY3MuYyBiL3NyYy9iYWNrZW5kL25vZGVzL21ha2VmdW5jcy5jCmluZGV4IDQwYjA5 OTU4Li45NDY4OTFiOSAxMDA2NDQKLS0tIGEvc3JjL2JhY2tlbmQvbm9kZXMvbWFrZWZ1bmNz LmMKKysrIGIvc3JjL2JhY2tlbmQvbm9kZXMvbWFrZWZ1bmNzLmMKQEAgLTgyOCw3ICs4Mjgs MTEgQEAgbWFrZV9hbmRzX2ltcGxpY2l0KEV4cHIgKmNsYXVzZSkKIAogLyoKICAqIG1ha2VJ bmRleEluZm8KLSAqCSAgY3JlYXRlIGFuIEluZGV4SW5mbyBub2RlCisgKgkgIGNyZWF0ZSBh biBJbmRleEluZm8gbm9kZS4gIFVwb24gcmV0dXJuaW5nIGZyb20gdGhpcyBmdW5jdGlvbiwK KyAqIGNhbGxlcnMgbXVzdCBhcHBseSBFeHBhbmRWaXJ0dWFsR2VuZXJhdGVkQ29sdW1ucygp IAorICogb3IgUmVsYXRpb25HZXRJbmRleEV4cHJlc3Npb25zRXhwYW5kIG9yIFJlbGF0aW9u R2V0SW5kZXhQcmVkaWNhdGVFeHBhbmQoKSB0bworICogaWlfRXhwcmVzc2lvbnNFeHBhbmQg YW5kIGlpX1ByZWRpY2F0ZUV4cGFuZCBhcyBuZWVkZWQgZm9yIGFjdHVhbAorICogZXhwYW5z aW9uIHdoZW4gdGhleSBhcmUgbm90IE5JTCBvciBkdW1teS4KICAqLwogSW5kZXhJbmZvICoK IG1ha2VJbmRleEluZm8oaW50IG51bWF0dHJzLCBpbnQgbnVta2V5YXR0cnMsIE9pZCBhbW9p ZCwgTGlzdCAqZXhwcmVzc2lvbnMsCkBAIC04NTYsMTEgKzg2MCwxNSBAQCBtYWtlSW5kZXhJ bmZvKGludCBudW1hdHRycywgaW50IG51bWtleWF0dHJzLCBPaWQgYW1vaWQsIExpc3QgKmV4 cHJlc3Npb25zLAogCiAJLyogZXhwcmVzc2lvbnMgKi8KIAluLT5paV9FeHByZXNzaW9ucyA9 IGV4cHJlc3Npb25zOworCW4tPmlpX0V4cHJlc3Npb25zRXhwYW5kID0gY29weU9iamVjdChl eHByZXNzaW9ucyk7CiAJbi0+aWlfRXhwcmVzc2lvbnNTdGF0ZSA9IE5JTDsKKwluLT5paV9F eHByZXNzaW9uc0V4cGFuZFN0YXRlID0gTklMOwogCiAJLyogcHJlZGljYXRlcyAgKi8KIAlu LT5paV9QcmVkaWNhdGUgPSBwcmVkaWNhdGVzOworCW4tPmlpX1ByZWRpY2F0ZUV4cGFuZCA9 IGNvcHlPYmplY3QocHJlZGljYXRlcyk7CiAJbi0+aWlfUHJlZGljYXRlU3RhdGUgPSBOVUxM OworCW4tPmlpX1ByZWRpY2F0ZUV4cGFuZFN0YXRlID0gTlVMTDsKIAogCS8qIGV4Y2x1c2lv biBjb25zdHJhaW50cyAqLwogCW4tPmlpX0V4Y2x1c2lvbk9wcyA9IE5VTEw7CmRpZmYgLS1n aXQgYS9zcmMvYmFja2VuZC9vcHRpbWl6ZXIvcGF0aC9pbmR4cGF0aC5jIGIvc3JjL2JhY2tl bmQvb3B0aW1pemVyL3BhdGgvaW5keHBhdGguYwppbmRleCAzZjVkNGZhMy4uYjcxNmVlOTIg MTAwNjQ0Ci0tLSBhL3NyYy9iYWNrZW5kL29wdGltaXplci9wYXRoL2luZHhwYXRoLmMKKysr IGIvc3JjL2JhY2tlbmQvb3B0aW1pemVyL3BhdGgvaW5keHBhdGguYwpAQCAtMTExOSw3ICsx MTE5LDcgQEAgYnVpbGRfcGF0aHNfZm9yX09SKFBsYW5uZXJJbmZvICpyb290LCBSZWxPcHRJ bmZvICpyZWwsCiAJCSAqIGp1c3Qgc2Nhbm5pbmcgdGhlIHByZWRPSyBpbmRleCBhbG9uZSwg bm8gT1IuKQogCQkgKi8KIAkJdXNlZnVsX3ByZWRpY2F0ZSA9IGZhbHNlOwotCQlpZiAoaW5k ZXgtPmluZHByZWQgIT0gTklMKQorCQlpZiAoaW5kZXgtPmluZHByZWRFeHBhbmQgIT0gTklM KQogCQl7CiAJCQlpZiAoaW5kZXgtPnByZWRPSykKIAkJCXsKQEAgLTExMzEsMTAgKzExMzEs MTAgQEAgYnVpbGRfcGF0aHNfZm9yX09SKFBsYW5uZXJJbmZvICpyb290LCBSZWxPcHRJbmZv ICpyZWwsCiAJCQkJaWYgKGFsbF9jbGF1c2VzID09IE5JTCkKIAkJCQkJYWxsX2NsYXVzZXMg PSBsaXN0X2NvbmNhdF9jb3B5KGNsYXVzZXMsIG90aGVyX2NsYXVzZXMpOwogCi0JCQkJaWYg KCFwcmVkaWNhdGVfaW1wbGllZF9ieShpbmRleC0+aW5kcHJlZCwgYWxsX2NsYXVzZXMsIGZh bHNlKSkKKwkJCQlpZiAoIXByZWRpY2F0ZV9pbXBsaWVkX2J5KGluZGV4LT5pbmRwcmVkRXhw YW5kLCBhbGxfY2xhdXNlcywgZmFsc2UpKQogCQkJCQljb250aW51ZTsJLyogY2FuJ3QgdXNl IGl0IGF0IGFsbCAqLwogCi0JCQkJaWYgKCFwcmVkaWNhdGVfaW1wbGllZF9ieShpbmRleC0+ aW5kcHJlZCwgb3RoZXJfY2xhdXNlcywgZmFsc2UpKQorCQkJCWlmICghcHJlZGljYXRlX2lt cGxpZWRfYnkoaW5kZXgtPmluZHByZWRFeHBhbmQsIG90aGVyX2NsYXVzZXMsIGZhbHNlKSkK IAkJCQkJdXNlZnVsX3ByZWRpY2F0ZSA9IHRydWU7CiAJCQl9CiAJCX0KQEAgLTIxODMsNyAr MjE4Myw3IEBAIGZpbmRfaW5kZXhwYXRoX3F1YWxzKFBhdGggKmJpdG1hcHF1YWwsIExpc3Qg KipxdWFscywgTGlzdCAqKnByZWRzKQogCiAJCQkqcXVhbHMgPSBsYXBwZW5kKCpxdWFscywg aWNsYXVzZS0+cmluZm8tPmNsYXVzZSk7CiAJCX0KLQkJKnByZWRzID0gbGlzdF9jb25jYXQo KnByZWRzLCBpcGF0aC0+aW5kZXhpbmZvLT5pbmRwcmVkKTsKKwkJKnByZWRzID0gbGlzdF9j b25jYXQoKnByZWRzLCBpcGF0aC0+aW5kZXhpbmZvLT5pbmRwcmVkRXhwYW5kKTsKIAl9CiAJ ZWxzZQogCQllbG9nKEVSUk9SLCAidW5yZWNvZ25pemVkIG5vZGUgdHlwZTogJWQiLCBub2Rl VGFnKGJpdG1hcHF1YWwpKTsKQEAgLTQwMzgsMTEgKzQwMzgsMTEgQEAgY2hlY2tfaW5kZXhf cHJlZGljYXRlcyhQbGFubmVySW5mbyAqcm9vdCwgUmVsT3B0SW5mbyAqcmVsKQogCQlJbmRl eE9wdEluZm8gKmluZGV4ID0gKEluZGV4T3B0SW5mbyAqKSBsZmlyc3QobGMpOwogCQlMaXN0 Q2VsbCAgICpsY3I7CiAKLQkJaWYgKGluZGV4LT5pbmRwcmVkID09IE5JTCkKKwkJaWYgKGlu ZGV4LT5pbmRwcmVkRXhwYW5kID09IE5JTCkKIAkJCWNvbnRpbnVlOwkJCS8qIGlnbm9yZSBu b24tcGFydGlhbCBpbmRleGVzIGhlcmUgKi8KIAogCQlpZiAoIWluZGV4LT5wcmVkT0spCQkv KiBkb24ndCByZXBlYXQgd29yayBpZiBhbHJlYWR5IHByb3ZlbiBPSyAqLwotCQkJaW5kZXgt PnByZWRPSyA9IHByZWRpY2F0ZV9pbXBsaWVkX2J5KGluZGV4LT5pbmRwcmVkLCBjbGF1c2Vs aXN0LAorCQkJaW5kZXgtPnByZWRPSyA9IHByZWRpY2F0ZV9pbXBsaWVkX2J5KGluZGV4LT5p bmRwcmVkRXhwYW5kLCBjbGF1c2VsaXN0LAogCQkJCQkJCQkJCQkJIGZhbHNlKTsKIAogCQkv KiBJZiByZWwgaXMgYW4gdXBkYXRlIHRhcmdldCwgbGVhdmUgaW5kcmVzdHJpY3RpbmZvIGFz IHNldCBhYm92ZSAqLwpAQCAtNDA2OCw3ICs0MDY4LDcgQEAgY2hlY2tfaW5kZXhfcHJlZGlj YXRlcyhQbGFubmVySW5mbyAqcm9vdCwgUmVsT3B0SW5mbyAqcmVsKQogCQkJLyogcHJlZGlj YXRlX2ltcGxpZWRfYnkoKSBhc3N1bWVzIGZpcnN0IGFyZyBpcyBpbW11dGFibGUgKi8KIAkJ CWlmIChjb250YWluX211dGFibGVfZnVuY3Rpb25zKChOb2RlICopIHJpbmZvLT5jbGF1c2Up IHx8CiAJCQkJIXByZWRpY2F0ZV9pbXBsaWVkX2J5KGxpc3RfbWFrZTEocmluZm8tPmNsYXVz ZSksCi0JCQkJCQkJCQkgIGluZGV4LT5pbmRwcmVkLCBmYWxzZSkpCisJCQkJCQkJCQkgIGlu ZGV4LT5pbmRwcmVkRXhwYW5kLCBmYWxzZSkpCiAJCQkJaW5kZXgtPmluZHJlc3RyaWN0aW5m byA9IGxhcHBlbmQoaW5kZXgtPmluZHJlc3RyaWN0aW5mbywgcmluZm8pOwogCQl9CiAJfQpA QCAtNDQwMiwxNCArNDQwMiwxNCBAQCBtYXRjaF9pbmRleF90b19vcGVyYW5kKE5vZGUgKm9w ZXJhbmQsCiAJCWludAkJCWk7CiAJCU5vZGUJICAgKmluZGV4a2V5OwogCi0JCWluZGV4cHJf aXRlbSA9IGxpc3RfaGVhZChpbmRleC0+aW5kZXhwcnMpOworCQlpbmRleHByX2l0ZW0gPSBs aXN0X2hlYWQoaW5kZXgtPmluZGV4cHJzRXhwYW5kKTsKIAkJZm9yIChpID0gMDsgaSA8IGlu ZGV4Y29sOyBpKyspCiAJCXsKIAkJCWlmIChpbmRleC0+aW5kZXhrZXlzW2ldID09IDApCiAJ CQl7CiAJCQkJaWYgKGluZGV4cHJfaXRlbSA9PSBOVUxMKQogCQkJCQllbG9nKEVSUk9SLCAi d3JvbmcgbnVtYmVyIG9mIGluZGV4IGV4cHJlc3Npb25zIik7Ci0JCQkJaW5kZXhwcl9pdGVt ID0gbG5leHQoaW5kZXgtPmluZGV4cHJzLCBpbmRleHByX2l0ZW0pOworCQkJCWluZGV4cHJf aXRlbSA9IGxuZXh0KGluZGV4LT5pbmRleHByc0V4cGFuZCwgaW5kZXhwcl9pdGVtKTsKIAkJ CX0KIAkJfQogCQlpZiAoaW5kZXhwcl9pdGVtID09IE5VTEwpCmRpZmYgLS1naXQgYS9zcmMv YmFja2VuZC9vcHRpbWl6ZXIvcGxhbi9jcmVhdGVwbGFuLmMgYi9zcmMvYmFja2VuZC9vcHRp bWl6ZXIvcGxhbi9jcmVhdGVwbGFuLmMKaW5kZXggZGU2YTE4M2QuLjJiZGFkN2JkIDEwMDY0 NAotLS0gYS9zcmMvYmFja2VuZC9vcHRpbWl6ZXIvcGxhbi9jcmVhdGVwbGFuLmMKKysrIGIv c3JjL2JhY2tlbmQvb3B0aW1pemVyL3BsYW4vY3JlYXRlcGxhbi5jCkBAIC0zMzQwLDcgKzMz NDAsNyBAQCBjcmVhdGVfYml0bWFwX3N1YnBsYW4oUGxhbm5lckluZm8gKnJvb3QsIFBhdGgg KmJpdG1hcHF1YWwsCiAJCQkJc3ViaW5kZXhFQ3MgPSBsYXBwZW5kKHN1YmluZGV4RUNzLCBy aW5mby0+cGFyZW50X2VjKTsKIAkJfQogCQkvKiBXZSBjYW4gYWRkIGFueSBpbmRleCBwcmVk aWNhdGUgY29uZGl0aW9ucywgdG9vICovCi0JCWZvcmVhY2gobCwgaXBhdGgtPmluZGV4aW5m by0+aW5kcHJlZCkKKwkJZm9yZWFjaChsLCBpcGF0aC0+aW5kZXhpbmZvLT5pbmRwcmVkRXhw YW5kKQogCQl7CiAJCQlFeHByCSAgICpwcmVkID0gKEV4cHIgKikgbGZpcnN0KGwpOwogCkBA IC01MTQyLDcgKzUxNDIsNyBAQCBmaXhfaW5kZXhxdWFsX29wZXJhbmQoTm9kZSAqbm9kZSwg SW5kZXhPcHRJbmZvICppbmRleCwgaW50IGluZGV4Y29sKQogCX0KIAogCS8qIEl0J3MgYW4g aW5kZXggZXhwcmVzc2lvbiwgc28gZmluZCBhbmQgY3Jvc3MtY2hlY2sgdGhlIGV4cHJlc3Np b24gKi8KLQlpbmRleHByX2l0ZW0gPSBsaXN0X2hlYWQoaW5kZXgtPmluZGV4cHJzKTsKKwlp bmRleHByX2l0ZW0gPSBsaXN0X2hlYWQoaW5kZXgtPmluZGV4cHJzRXhwYW5kKTsKIAlmb3Ig KHBvcyA9IDA7IHBvcyA8IGluZGV4LT5uY29sdW1uczsgcG9zKyspCiAJewogCQlpZiAoaW5k ZXgtPmluZGV4a2V5c1twb3NdID09IDApCkBAIC01MTY3LDcgKzUxNjcsNyBAQCBmaXhfaW5k ZXhxdWFsX29wZXJhbmQoTm9kZSAqbm9kZSwgSW5kZXhPcHRJbmZvICppbmRleCwgaW50IGlu ZGV4Y29sKQogCQkJCWVsc2UKIAkJCQkJZWxvZyhFUlJPUiwgImluZGV4IGtleSBkb2VzIG5v dCBtYXRjaCBleHBlY3RlZCBpbmRleCBjb2x1bW4iKTsKIAkJCX0KLQkJCWluZGV4cHJfaXRl bSA9IGxuZXh0KGluZGV4LT5pbmRleHBycywgaW5kZXhwcl9pdGVtKTsKKwkJCWluZGV4cHJf aXRlbSA9IGxuZXh0KGluZGV4LT5pbmRleHByc0V4cGFuZCwgaW5kZXhwcl9pdGVtKTsKIAkJ fQogCX0KIApkaWZmIC0tZ2l0IGEvc3JjL2JhY2tlbmQvb3B0aW1pemVyL3V0aWwvcGxhbmNh dC5jIGIvc3JjL2JhY2tlbmQvb3B0aW1pemVyL3V0aWwvcGxhbmNhdC5jCmluZGV4IDdjNGJl MTc0Li43Mjg0NmQ5ZSAxMDA2NDQKLS0tIGEvc3JjL2JhY2tlbmQvb3B0aW1pemVyL3V0aWwv cGxhbmNhdC5jCisrKyBiL3NyYy9iYWNrZW5kL29wdGltaXplci91dGlsL3BsYW5jYXQuYwpA QCAtNDMzLDI0ICs0MzMsMzggQEAgZ2V0X3JlbGF0aW9uX2luZm8oUGxhbm5lckluZm8gKnJv b3QsIE9pZCByZWxhdGlvbk9iamVjdElkLCBib29sIGluaHBhcmVudCwKIAkJCSAqIHByb3Bl cmx5IHJlZHVjZWQuCiAJCQkgKi8KIAkJCWluZm8tPmluZGV4cHJzID0gUmVsYXRpb25HZXRJ bmRleEV4cHJlc3Npb25zKGluZGV4UmVsYXRpb24pOworCQkJaW5mby0+aW5kZXhwcnNFeHBh bmQgPSBSZWxhdGlvbkdldEluZGV4RXhwcmVzc2lvbnNFeHBhbmQoaW5kZXhSZWxhdGlvbik7 CiAJCQlpbmZvLT5pbmRwcmVkID0gUmVsYXRpb25HZXRJbmRleFByZWRpY2F0ZShpbmRleFJl bGF0aW9uKTsKKwkJCWluZm8tPmluZHByZWRFeHBhbmQgPSBSZWxhdGlvbkdldEluZGV4UHJl ZGljYXRlRXhwYW5kKGluZGV4UmVsYXRpb24pOwogCQkJaWYgKGluZm8tPmluZGV4cHJzKQog CQkJewogCQkJCWlmICh2YXJubyAhPSAxKQorCQkJCXsKIAkJCQkJQ2hhbmdlVmFyTm9kZXMo KE5vZGUgKikgaW5mby0+aW5kZXhwcnMsIDEsIHZhcm5vLCAwKTsKKwkJCQkJQ2hhbmdlVmFy Tm9kZXMoKE5vZGUgKikgaW5mby0+aW5kZXhwcnNFeHBhbmQsIDEsIHZhcm5vLCAwKTsKKwkJ CQl9CiAKIAkJCQlpbmZvLT5pbmRleHBycyA9IChMaXN0ICopCiAJCQkJCWV2YWxfY29uc3Rf ZXhwcmVzc2lvbnMocm9vdCwgKE5vZGUgKikgaW5mby0+aW5kZXhwcnMpOworCQkJCWluZm8t PmluZGV4cHJzRXhwYW5kID0gKExpc3QgKikKKwkJCQkJZXZhbF9jb25zdF9leHByZXNzaW9u cyhyb290LCAoTm9kZSAqKSBpbmZvLT5pbmRleHByc0V4cGFuZCk7CiAJCQl9CiAJCQlpZiAo aW5mby0+aW5kcHJlZCkKIAkJCXsKIAkJCQlpZiAodmFybm8gIT0gMSkKKwkJCQl7CiAJCQkJ CUNoYW5nZVZhck5vZGVzKChOb2RlICopIGluZm8tPmluZHByZWQsIDEsIHZhcm5vLCAwKTsK KwkJCQkJQ2hhbmdlVmFyTm9kZXMoKE5vZGUgKikgaW5mby0+aW5kcHJlZEV4cGFuZCwgMSwg dmFybm8sIDApOworCQkJCX0KIAogCQkJCWluZm8tPmluZHByZWQgPSAoTGlzdCAqKQogCQkJ CQlldmFsX2NvbnN0X2V4cHJlc3Npb25zKHJvb3QsCiAJCQkJCQkJCQkJICAgKE5vZGUgKikg bWFrZV9hbmRzX2V4cGxpY2l0KGluZm8tPmluZHByZWQpKTsKKwkJCQlpbmZvLT5pbmRwcmVk RXhwYW5kID0gKExpc3QgKikKKwkJCQkJZXZhbF9jb25zdF9leHByZXNzaW9ucyhyb290LAor CQkJCQkJCQkJCSAgIChOb2RlICopIG1ha2VfYW5kc19leHBsaWNpdChpbmZvLT5pbmRwcmVk RXhwYW5kKSk7CiAJCQkJaW5mby0+aW5kcHJlZCA9IG1ha2VfYW5kc19pbXBsaWNpdCgoRXhw ciAqKSBpbmZvLT5pbmRwcmVkKTsKKwkJCQlpbmZvLT5pbmRwcmVkRXhwYW5kID0gbWFrZV9h bmRzX2ltcGxpY2l0KChFeHByICopIGluZm8tPmluZHByZWRFeHBhbmQpOwogCQkJfQogCiAJ CQkvKiBCdWlsZCB0YXJnZXRsaXN0IHVzaW5nIHRoZSBjb21wbGV0ZWQgaW5kZXhwcnMgZGF0 YSAqLwpAQCAtOTQxLDggKzk1NSw4IEBAIGluZmVyX2FyYml0ZXJfaW5kZXhlcyhQbGFubmVy SW5mbyAqcm9vdCkKIAkJCQkJCQkJCQkgICBhdHRubyAtIEZpcnN0TG93SW52YWxpZEhlYXBB dHRyaWJ1dGVOdW1iZXIpOwogCQkJCX0KIAotCQkJCWluZmVyRWxlbXMgPSBSZWxhdGlvbkdl dEluZGV4RXhwcmVzc2lvbnMoaWR4UmVsKTsKLQkJCQlpbmZlckluZGV4RXhwcnMgPSBSZWxh dGlvbkdldEluZGV4UHJlZGljYXRlKGlkeFJlbCk7CisJCQkJaW5mZXJFbGVtcyA9IFJlbGF0 aW9uR2V0SW5kZXhFeHByZXNzaW9uc0V4cGFuZChpZHhSZWwpOworCQkJCWluZmVySW5kZXhF eHBycyA9IFJlbGF0aW9uR2V0SW5kZXhQcmVkaWNhdGVFeHBhbmQoaWR4UmVsKTsKIAkJCQli cmVhazsKIAkJCX0KIAkJfQpAQCAtMTA3Miw3ICsxMDg2LDcgQEAgaW5mZXJfYXJiaXRlcl9p bmRleGVzKFBsYW5uZXJJbmZvICpyb290KQogCQkJY29udGludWU7CiAKIAkJLyogRXhwcmVz c2lvbiBhdHRyaWJ1dGVzIChpZiBhbnkpIG11c3QgbWF0Y2ggKi8KLQkJaWR4RXhwcnMgPSBS ZWxhdGlvbkdldEluZGV4RXhwcmVzc2lvbnMoaWR4UmVsKTsKKwkJaWR4RXhwcnMgPSBSZWxh dGlvbkdldEluZGV4RXhwcmVzc2lvbnNFeHBhbmQoaWR4UmVsKTsKIAkJaWYgKGlkeEV4cHJz KQogCQl7CiAJCQlpZiAodmFybm8gIT0gMSkKQEAgLTExMzksNyArMTE1Myw3IEBAIGluZmVy X2FyYml0ZXJfaW5kZXhlcyhQbGFubmVySW5mbyAqcm9vdCkKIAkJaWYgKGxpc3RfZGlmZmVy ZW5jZShpZHhFeHBycywgaW5mZXJFbGVtcykgIT0gTklMKQogCQkJY29udGludWU7CiAKLQkJ cHJlZEV4cHJzID0gUmVsYXRpb25HZXRJbmRleFByZWRpY2F0ZShpZHhSZWwpOworCQlwcmVk RXhwcnMgPSBSZWxhdGlvbkdldEluZGV4UHJlZGljYXRlRXhwYW5kKGlkeFJlbCk7CiAJCWlm IChwcmVkRXhwcnMpCiAJCXsKIAkJCWlmICh2YXJubyAhPSAxKQpkaWZmIC0tZ2l0IGEvc3Jj L2JhY2tlbmQvdXRpbHMvYWR0L3NlbGZ1bmNzLmMgYi9zcmMvYmFja2VuZC91dGlscy9hZHQv c2VsZnVuY3MuYwppbmRleCBkNmVmZDA3MC4uOThlNzIxNmUgMTAwNjQ0Ci0tLSBhL3NyYy9i YWNrZW5kL3V0aWxzL2FkdC9zZWxmdW5jcy5jCisrKyBiL3NyYy9iYWNrZW5kL3V0aWxzL2Fk dC9zZWxmdW5jcy5jCkBAIC03NjM5LDEwICs3NjM5LDEwIEBAIGFkZF9wcmVkaWNhdGVfdG9f aW5kZXhfcXVhbHMoSW5kZXhPcHRJbmZvICppbmRleCwgTGlzdCAqaW5kZXhRdWFscykKIAlM aXN0CSAgICpwcmVkRXh0cmFRdWFscyA9IE5JTDsKIAlMaXN0Q2VsbCAgICpsYzsKIAotCWlm IChpbmRleC0+aW5kcHJlZCA9PSBOSUwpCisJaWYgKGluZGV4LT5pbmRwcmVkRXhwYW5kID09 IE5JTCkKIAkJcmV0dXJuIGluZGV4UXVhbHM7CiAKLQlmb3JlYWNoKGxjLCBpbmRleC0+aW5k cHJlZCkKKwlmb3JlYWNoKGxjLCBpbmRleC0+aW5kcHJlZEV4cGFuZCkKIAl7CiAJCU5vZGUJ ICAgKnByZWRRdWFsID0gKE5vZGUgKikgbGZpcnN0KGxjKTsKIAkJTGlzdAkgICAqb25lUXVh bCA9IGxpc3RfbWFrZTEocHJlZFF1YWwpOwpkaWZmIC0tZ2l0IGEvc3JjL2JhY2tlbmQvdXRp bHMvY2FjaGUvcmVsY2FjaGUuYyBiL3NyYy9iYWNrZW5kL3V0aWxzL2NhY2hlL3JlbGNhY2hl LmMKaW5kZXggMDU3MmFiNDIuLmU2MDRiYjkxIDEwMDY0NAotLS0gYS9zcmMvYmFja2VuZC91 dGlscy9jYWNoZS9yZWxjYWNoZS5jCisrKyBiL3NyYy9iYWNrZW5kL3V0aWxzL2NhY2hlL3Jl bGNhY2hlLmMKQEAgLTkxLDYgKzkxLDcgQEAKICNpbmNsdWRlICJ1dGlscy9yZXNvd25lci5o IgogI2luY2x1ZGUgInV0aWxzL3NuYXBtZ3IuaCIKICNpbmNsdWRlICJ1dGlscy9zeXNjYWNo ZS5oIgorI2luY2x1ZGUgInJld3JpdGUvcmV3cml0ZUhhbmRsZXIuaCIKIAogI2RlZmluZSBS RUxDQUNIRV9JTklUX0ZJTEVNQUdJQwkJMHg1NzMyNjYJLyogdmVyc2lvbiBJRCB2YWx1ZSAq LwogCkBAIC0xNTgzLDcgKzE1ODQsOSBAQCBSZWxhdGlvbkluaXRJbmRleEFjY2Vzc0luZm8o UmVsYXRpb24gcmVsYXRpb24pCiAJICogZXhwcmVzc2lvbnMsIHByZWRpY2F0ZSwgZXhjbHVz aW9uIGNhY2hlcyB3aWxsIGJlIGZpbGxlZCBsYXRlcgogCSAqLwogCXJlbGF0aW9uLT5yZF9p bmRleHBycyA9IE5JTDsKKwlyZWxhdGlvbi0+cmRfaW5kZXhwcnNFeHBhbmQgPSBOSUw7CiAJ cmVsYXRpb24tPnJkX2luZHByZWQgPSBOSUw7CisJcmVsYXRpb24tPnJkX2luZHByZWRFeHBh bmQgPSBOSUw7CiAJcmVsYXRpb24tPnJkX2V4Y2xvcHMgPSBOVUxMOwogCXJlbGF0aW9uLT5y ZF9leGNscHJvY3MgPSBOVUxMOwogCXJlbGF0aW9uLT5yZF9leGNsc3RyYXRzID0gTlVMTDsK QEAgLTUxNDYsNiArNTE0OSw0NSBAQCBSZWxhdGlvbkdldEluZGV4RXhwcmVzc2lvbnMoUmVs YXRpb24gcmVsYXRpb24pCiAJcmV0dXJuIHJlc3VsdDsKIH0KIAorTGlzdCAqCitSZWxhdGlv bkdldEluZGV4RXhwcmVzc2lvbnNFeHBhbmQoUmVsYXRpb24gcmVsYXRpb24pCit7CisJTGlz dAkgICAqcmVzdWx0OworCU1lbW9yeUNvbnRleHQgb2xkY3h0OworCWJvb2wJCWlzbnVsbDsK KwlEYXR1bQkJaGVhcFJlbGlkRGF0dW07CisJT2lkICAgICAgICAgaGVhcFJlbGlkOworCisJ LyogUXVpY2sgZXhpdCBpZiB3ZSBhbHJlYWR5IGNvbXB1dGVkIHRoZSByZXN1bHQuICovCisJ aWYgKHJlbGF0aW9uLT5yZF9pbmRleHByc0V4cGFuZCkKKwkJcmV0dXJuIGNvcHlPYmplY3Qo cmVsYXRpb24tPnJkX2luZGV4cHJzRXhwYW5kKTsKKworCS8qIFF1aWNrIGV4aXQgaWYgdGhl cmUgaXMgbm90aGluZyB0byBkby4gKi8KKwlpZiAocmVsYXRpb24tPnJkX2luZGV4dHVwbGUg PT0gTlVMTCB8fAorCQloZWFwX2F0dGlzbnVsbChyZWxhdGlvbi0+cmRfaW5kZXh0dXBsZSwg QW51bV9wZ19pbmRleF9pbmRleHBycywgTlVMTCkpCisJCXJldHVybiBOSUw7CisKKwlyZXN1 bHQgPSBSZWxhdGlvbkdldEluZGV4RXhwcmVzc2lvbnMocmVsYXRpb24pOworCWlmIChyZXN1 bHQgPT0gTklMKQorCQlyZXR1cm4gTklMOworCisJaGVhcFJlbGlkRGF0dW0gPSBoZWFwX2dl dGF0dHIocmVsYXRpb24tPnJkX2luZGV4dHVwbGUsCisJCQkJCQkJIEFudW1fcGdfaW5kZXhf aW5kcmVsaWQsCisJCQkJCQkJIEdldFBnSW5kZXhEZXNjcmlwdG9yKCksCisJCQkJCQkJICZp c251bGwpOworCUFzc2VydCghaXNudWxsKTsKKwloZWFwUmVsaWQgPSBEYXR1bUdldE9iamVj dElkKGhlYXBSZWxpZERhdHVtKTsKKworCXJlc3VsdCA9IEV4cGFuZFZpcnR1YWxHZW5lcmF0 ZWRDb2x1bW5zKHJlc3VsdCwgTlVMTCwgaGVhcFJlbGlkKTsKKworCS8qIE5vdyBzYXZlIGEg Y29weSBvZiB0aGUgY29tcGxldGVkIHRyZWUgaW4gdGhlIHJlbGNhY2hlIGVudHJ5LiAqLwor CW9sZGN4dCA9IE1lbW9yeUNvbnRleHRTd2l0Y2hUbyhyZWxhdGlvbi0+cmRfaW5kZXhjeHQp OworCXJlbGF0aW9uLT5yZF9pbmRleHByc0V4cGFuZCA9IGNvcHlPYmplY3QocmVzdWx0KTsK KwlNZW1vcnlDb250ZXh0U3dpdGNoVG8ob2xkY3h0KTsKKworCXJldHVybiByZXN1bHQ7Cit9 CisKIC8qCiAgKiBSZWxhdGlvbkdldER1bW15SW5kZXhFeHByZXNzaW9ucyAtLSBnZXQgZHVt bXkgZXhwcmVzc2lvbnMgZm9yIGFuIGluZGV4CiAgKgpAQCAtNTI2Niw2ICs1MzA4LDQ1IEBA IFJlbGF0aW9uR2V0SW5kZXhQcmVkaWNhdGUoUmVsYXRpb24gcmVsYXRpb24pCiAJcmV0dXJu IHJlc3VsdDsKIH0KIAorTGlzdCAqCitSZWxhdGlvbkdldEluZGV4UHJlZGljYXRlRXhwYW5k KFJlbGF0aW9uIHJlbGF0aW9uKQoreworCUxpc3QJICAgKnJlc3VsdDsKKwlNZW1vcnlDb250 ZXh0IG9sZGN4dDsKKwlib29sCQlpc251bGw7CisJRGF0dW0JCWhlYXBSZWxpZERhdHVtOwor CU9pZCAgICAgICAgIGhlYXBSZWxpZDsKKworCS8qIFF1aWNrIGV4aXQgaWYgd2UgYWxyZWFk eSBjb21wdXRlZCB0aGUgcmVzdWx0LiAqLworCWlmIChyZWxhdGlvbi0+cmRfaW5kcHJlZEV4 cGFuZCkKKwkJcmV0dXJuIGNvcHlPYmplY3QocmVsYXRpb24tPnJkX2luZHByZWRFeHBhbmQp OworCisJLyogUXVpY2sgZXhpdCBpZiB0aGVyZSBpcyBub3RoaW5nIHRvIGRvLiAqLworCWlm IChyZWxhdGlvbi0+cmRfaW5kZXh0dXBsZSA9PSBOVUxMIHx8CisJCWhlYXBfYXR0aXNudWxs KHJlbGF0aW9uLT5yZF9pbmRleHR1cGxlLCBBbnVtX3BnX2luZGV4X2luZHByZWQsIE5VTEwp KQorCQlyZXR1cm4gTklMOworCisJcmVzdWx0ID0gUmVsYXRpb25HZXRJbmRleFByZWRpY2F0 ZShyZWxhdGlvbik7CisJaWYgKHJlc3VsdCA9PSBOSUwpCisJCXJldHVybiBOSUw7CisKKwlo ZWFwUmVsaWREYXR1bSA9IGhlYXBfZ2V0YXR0cihyZWxhdGlvbi0+cmRfaW5kZXh0dXBsZSwK KwkJCQkJCQkgQW51bV9wZ19pbmRleF9pbmRyZWxpZCwKKwkJCQkJCQkgR2V0UGdJbmRleERl c2NyaXB0b3IoKSwKKwkJCQkJCQkgJmlzbnVsbCk7CisJQXNzZXJ0KCFpc251bGwpOworCWhl YXBSZWxpZCA9IERhdHVtR2V0T2JqZWN0SWQoaGVhcFJlbGlkRGF0dW0pOworCisJcmVzdWx0 ID0gRXhwYW5kVmlydHVhbEdlbmVyYXRlZENvbHVtbnMocmVzdWx0LCBOVUxMLCBoZWFwUmVs aWQpOworCisJLyogTm93IHNhdmUgYSBjb3B5IG9mIHRoZSBjb21wbGV0ZWQgdHJlZSBpbiB0 aGUgcmVsY2FjaGUgZW50cnkuICovCisJb2xkY3h0ID0gTWVtb3J5Q29udGV4dFN3aXRjaFRv KHJlbGF0aW9uLT5yZF9pbmRleGN4dCk7CisJcmVsYXRpb24tPnJkX2luZHByZWRFeHBhbmQg PSBjb3B5T2JqZWN0KHJlc3VsdCk7CisJTWVtb3J5Q29udGV4dFN3aXRjaFRvKG9sZGN4dCk7 CisKKwlyZXR1cm4gcmVzdWx0OworfQorCiAvKgogICogUmVsYXRpb25HZXRJbmRleEF0dHJC aXRtYXAgLS0gZ2V0IGEgYml0bWFwIG9mIGluZGV4IGF0dHJpYnV0ZSBudW1iZXJzCiAgKgpA QCAtNjQ5MCw3ICs2NTcxLDkgQEAgbG9hZF9yZWxjYWNoZV9pbml0X2ZpbGUoYm9vbCBzaGFy ZWQpCiAJCXJlbC0+cmRfcGFydGNoZWNrdmFsaWQgPSBmYWxzZTsKIAkJcmVsLT5yZF9wYXJ0 Y2hlY2tjeHQgPSBOVUxMOwogCQlyZWwtPnJkX2luZGV4cHJzID0gTklMOworCQlyZWwtPnJk X2luZGV4cHJzRXhwYW5kID0gTklMOwogCQlyZWwtPnJkX2luZHByZWQgPSBOSUw7CisJCXJl bC0+cmRfaW5kcHJlZEV4cGFuZCA9IE5JTDsKIAkJcmVsLT5yZF9leGNsb3BzID0gTlVMTDsK IAkJcmVsLT5yZF9leGNscHJvY3MgPSBOVUxMOwogCQlyZWwtPnJkX2V4Y2xzdHJhdHMgPSBO VUxMOwpAQCAtNzAxOSwzICs3MTAyLDQ2IEBAIFJlc093bmVyUmVsZWFzZVJlbGF0aW9uKERh dHVtIHJlcykKIAogCVJlbGF0aW9uQ2xvc2VDbGVhbnVwKChSZWxhdGlvbikgRGF0dW1HZXRQ b2ludGVyKHJlcykpOwogfQorCitMaXN0ICoKK0V4cGFuZFZpcnR1YWxHZW5lcmF0ZWRDb2x1 bW5zKExpc3QgKmxpc3QsIFJlbGF0aW9uIGhlYXBSZWxhdGlvbiwgT2lkIGhlYXBSZWxJZCkK K3sKKwlib29sIAkJCQkgb3BlbmVkX3JlbGF0aW9uID0gZmFsc2U7CisJVHVwbGVEZXNjCQkJ IHR1cGRlc2M7CisKKwlpZiAobGlzdCA9PSBOSUwgfHwgKGhlYXBSZWxhdGlvbiA9PSBOVUxM ICYmIGhlYXBSZWxJZCA9PSBJbnZhbGlkT2lkKSkKKwkJcmV0dXJuIGxpc3Q7CisKKwlpZiAo aGVhcFJlbGF0aW9uID09IE5VTEwpCisJeworCQloZWFwUmVsYXRpb24gPSB0YWJsZV9vcGVu KGhlYXBSZWxJZCwgTm9Mb2NrKTsKKwkJb3BlbmVkX3JlbGF0aW9uID0gdHJ1ZTsKKwl9CisK Kwl0dXBkZXNjID0gUmVsYXRpb25HZXREZXNjcihoZWFwUmVsYXRpb24pOworCWlmICgodHVw ZGVzYy0+Y29uc3RyICYmIHR1cGRlc2MtPmNvbnN0ci0+aGFzX2dlbmVyYXRlZF92aXJ0dWFs KSkKKwl7CisJCWludAkJCQkgajsKKwkJQml0bWFwc2V0CQkqaW5kZXhhdHRycyA9IE5VTEw7 CisKKwkJcHVsbF92YXJhdHRub3MoKE5vZGUgKilsaXN0LCAxLCAmaW5kZXhhdHRycyk7CisK KwkJaiA9IC0xOworCQl3aGlsZSAoKGogPSBibXNfbmV4dF9tZW1iZXIoaW5kZXhhdHRycywg aikpID49IDApCisJCXsKKwkJCUF0dHJOdW1iZXIJYXR0bm8gPSBqICsgRmlyc3RMb3dJbnZh bGlkSGVhcEF0dHJpYnV0ZU51bWJlcjsKKworCQkJaWYgKGF0dG5vID4gMCAmJgorCQkJCVR1 cGxlRGVzY0F0dHIodHVwZGVzYywgYXR0bm8gLSAxKS0+YXR0Z2VuZXJhdGVkID09IEFUVFJJ QlVURV9HRU5FUkFURURfVklSVFVBTCkKKwkJCXsKKwkJCQlsaXN0ID0gKExpc3QgKilleHBh bmRfZ2VuZXJhdGVkX2NvbHVtbnNfaW5fZXhwcigoTm9kZSAqKWxpc3QsIGhlYXBSZWxhdGlv biwgMSk7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9CisKKwlpZiAob3BlbmVkX3JlbGF0 aW9uKQorCQl0YWJsZV9jbG9zZShoZWFwUmVsYXRpb24sIE5vTG9jayk7CisKKwlyZXR1cm4g bGlzdDsKK30KZGlmZiAtLWdpdCBhL3NyYy9pbmNsdWRlL25vZGVzL2V4ZWNub2Rlcy5oIGIv c3JjL2luY2x1ZGUvbm9kZXMvZXhlY25vZGVzLmgKaW5kZXggNTNjMTM4MzEuLjIwYTJlNjE4 IDEwMDY0NAotLS0gYS9zcmMvaW5jbHVkZS9ub2Rlcy9leGVjbm9kZXMuaAorKysgYi9zcmMv aW5jbHVkZS9ub2Rlcy9leGVjbm9kZXMuaApAQCAtMTkwLDEzICsxOTAsMTcgQEAgdHlwZWRl ZiBzdHJ1Y3QgSW5kZXhJbmZvCiAKIAkvKiBleHByIHRyZWVzIGZvciBleHByZXNzaW9uIGVu dHJpZXMsIG9yIE5JTCBpZiBub25lICovCiAJTGlzdAkgICAqaWlfRXhwcmVzc2lvbnM7IC8q IGxpc3Qgb2YgRXhwciAqLworCUxpc3QJICAgKmlpX0V4cHJlc3Npb25zRXhwYW5kOyAJLyog bGlzdCBvZiBFeHByICovCiAJLyogZXhlYyBzdGF0ZSBmb3IgZXhwcmVzc2lvbnMsIG9yIE5J TCBpZiBub25lICovCiAJTGlzdAkgICAqaWlfRXhwcmVzc2lvbnNTdGF0ZTsJLyogbGlzdCBv ZiBFeHByU3RhdGUgKi8KKwlMaXN0CSAgICppaV9FeHByZXNzaW9uc0V4cGFuZFN0YXRlOwkv KiBsaXN0IG9mIEV4cHJTdGF0ZSAqLwogCiAJLyogcGFydGlhbC1pbmRleCBwcmVkaWNhdGUs IG9yIE5JTCBpZiBub25lICovCiAJTGlzdAkgICAqaWlfUHJlZGljYXRlOwkvKiBsaXN0IG9m IEV4cHIgKi8KKwlMaXN0CSAgICppaV9QcmVkaWNhdGVFeHBhbmQ7CQkvKiBsaXN0IG9mIEV4 cHIgKi8KIAkvKiBleGVjIHN0YXRlIGZvciBleHByZXNzaW9ucywgb3IgTklMIGlmIG5vbmUg Ki8KIAlFeHByU3RhdGUgICppaV9QcmVkaWNhdGVTdGF0ZTsKKwlFeHByU3RhdGUgICppaV9Q cmVkaWNhdGVFeHBhbmRTdGF0ZTsKIAogCS8qIFBlci1jb2x1bW4gZXhjbHVzaW9uIG9wZXJh dG9ycywgb3IgTlVMTCBpZiBub25lICovCiAJT2lkCQkgICAqaWlfRXhjbHVzaW9uT3BzOwkv KiBhcnJheSB3aXRoIG9uZSBlbnRyeSBwZXIgY29sdW1uICovCmRpZmYgLS1naXQgYS9zcmMv aW5jbHVkZS9ub2Rlcy9wYXRobm9kZXMuaCBiL3NyYy9pbmNsdWRlL25vZGVzL3BhdGhub2Rl cy5oCmluZGV4IDI3YTJjNjgxLi45YzY1ZTEyMyAxMDA2NDQKLS0tIGEvc3JjL2luY2x1ZGUv bm9kZXMvcGF0aG5vZGVzLmgKKysrIGIvc3JjL2luY2x1ZGUvbm9kZXMvcGF0aG5vZGVzLmgK QEAgLTE0MDMsOCArMTQwMywxMCBAQCB0eXBlZGVmIHN0cnVjdCBJbmRleE9wdEluZm8KIAkg KiBwcmludCBpbmRleHRsaXN0CiAJICovCiAJTGlzdAkgICAqaW5kZXhwcnMgcGdfbm9kZV9h dHRyKHJlYWRfd3JpdGVfaWdub3JlKTsKKwlMaXN0CSAgICppbmRleHByc0V4cGFuZCBwZ19u b2RlX2F0dHIocmVhZF93cml0ZV9pZ25vcmUpOwogCS8qIHByZWRpY2F0ZSBpZiBhIHBhcnRp YWwgaW5kZXgsIGVsc2UgTklMICovCiAJTGlzdAkgICAqaW5kcHJlZDsKKwlMaXN0CSAgICpp bmRwcmVkRXhwYW5kOwogCiAJLyogdGFyZ2V0bGlzdCByZXByZXNlbnRpbmcgaW5kZXggY29s dW1ucyAqLwogCUxpc3QJICAgKmluZGV4dGxpc3Q7CmRpZmYgLS1naXQgYS9zcmMvaW5jbHVk ZS91dGlscy9yZWwuaCBiL3NyYy9pbmNsdWRlL3V0aWxzL3JlbC5oCmluZGV4IGZhMDdlYmY4 Li43YmQwMWIzNiAxMDA2NDQKLS0tIGEvc3JjL2luY2x1ZGUvdXRpbHMvcmVsLmgKKysrIGIv c3JjL2luY2x1ZGUvdXRpbHMvcmVsLmgKQEAgLTIxMCw3ICsyMTAsOSBAQCB0eXBlZGVmIHN0 cnVjdCBSZWxhdGlvbkRhdGEKIAlzdHJ1Y3QgRm1nckluZm8gKnJkX3N1cHBvcnRpbmZvOwkv KiBsb29rdXAgaW5mbyBmb3Igc3VwcG9ydCBwcm9jZWR1cmVzICovCiAJaW50MTYJICAgKnJk X2luZG9wdGlvbjsJLyogcGVyLWNvbHVtbiBBTS1zcGVjaWZpYyBmbGFncyAqLwogCUxpc3QJ ICAgKnJkX2luZGV4cHJzOwkvKiBpbmRleCBleHByZXNzaW9uIHRyZWVzLCBpZiBhbnkgKi8K KwlMaXN0CSAgICpyZF9pbmRleHByc0V4cGFuZDsJLyogZXhwYW5kZWQgaW5kZXggZXhwcmVz c2lvbiB0cmVlcywgaWYgYW55ICovCiAJTGlzdAkgICAqcmRfaW5kcHJlZDsJCS8qIGluZGV4 IHByZWRpY2F0ZSB0cmVlLCBpZiBhbnkgKi8KKwlMaXN0CSAgICpyZF9pbmRwcmVkRXhwYW5k OwkJLyogZXhwYW5kZWQgaW5kZXggcHJlZGljYXRlIHRyZWUsIGlmIGFueSAqLwogCU9pZAkJ ICAgKnJkX2V4Y2xvcHM7CQkvKiBPSURzIG9mIGV4Y2x1c2lvbiBvcGVyYXRvcnMsIGlmIGFu eSAqLwogCU9pZAkJICAgKnJkX2V4Y2xwcm9jczsJLyogT0lEcyBvZiBleGNsdXNpb24gb3Bz JyBwcm9jcywgaWYgYW55ICovCiAJdWludDE2CSAgICpyZF9leGNsc3RyYXRzOwkvKiBleGNs dXNpb24gb3BzJyBzdHJhdGVneSBudW1iZXJzLCBpZiBhbnkgKi8KZGlmZiAtLWdpdCBhL3Ny Yy9pbmNsdWRlL3V0aWxzL3JlbGNhY2hlLmggYi9zcmMvaW5jbHVkZS91dGlscy9yZWxjYWNo ZS5oCmluZGV4IDg5YzI3YWExLi43MDUzMWJiOCAxMDA2NDQKLS0tIGEvc3JjL2luY2x1ZGUv dXRpbHMvcmVsY2FjaGUuaAorKysgYi9zcmMvaW5jbHVkZS91dGlscy9yZWxjYWNoZS5oCkBA IC01OCw4ICs1OCwxMCBAQCBleHRlcm4gTGlzdCAqUmVsYXRpb25HZXRTdGF0RXh0TGlzdChS ZWxhdGlvbiByZWxhdGlvbik7CiBleHRlcm4gT2lkCVJlbGF0aW9uR2V0UHJpbWFyeUtleUlu ZGV4KFJlbGF0aW9uIHJlbGF0aW9uLCBib29sIGRlZmVycmFibGVfb2spOwogZXh0ZXJuIE9p ZAlSZWxhdGlvbkdldFJlcGxpY2FJbmRleChSZWxhdGlvbiByZWxhdGlvbik7CiBleHRlcm4g TGlzdCAqUmVsYXRpb25HZXRJbmRleEV4cHJlc3Npb25zKFJlbGF0aW9uIHJlbGF0aW9uKTsK K2V4dGVybiBMaXN0ICpSZWxhdGlvbkdldEluZGV4RXhwcmVzc2lvbnNFeHBhbmQoUmVsYXRp b24gcmVsYXRpb24pOwogZXh0ZXJuIExpc3QgKlJlbGF0aW9uR2V0RHVtbXlJbmRleEV4cHJl c3Npb25zKFJlbGF0aW9uIHJlbGF0aW9uKTsKIGV4dGVybiBMaXN0ICpSZWxhdGlvbkdldElu ZGV4UHJlZGljYXRlKFJlbGF0aW9uIHJlbGF0aW9uKTsKK2V4dGVybiBMaXN0ICpSZWxhdGlv bkdldEluZGV4UHJlZGljYXRlRXhwYW5kKFJlbGF0aW9uIHJlbGF0aW9uKTsKIGV4dGVybiBi eXRlYSAqKlJlbGF0aW9uR2V0SW5kZXhBdHRPcHRpb25zKFJlbGF0aW9uIHJlbGF0aW9uLCBi b29sIGNvcHkpOwogCiAvKgpAQCAtMTYxLDQgKzE2Myw2IEBAIGV4dGVybiBQR0RMTElNUE9S VCBib29sIGNyaXRpY2FsUmVsY2FjaGVzQnVpbHQ7CiAvKiBzaG91bGQgYmUgdXNlZCBvbmx5 IGJ5IHJlbGNhY2hlLmMgYW5kIHBvc3Rpbml0LmMgKi8KIGV4dGVybiBQR0RMTElNUE9SVCBi b29sIGNyaXRpY2FsU2hhcmVkUmVsY2FjaGVzQnVpbHQ7CiAKK2V4dGVybiBMaXN0ICpFeHBh bmRWaXJ0dWFsR2VuZXJhdGVkQ29sdW1ucyhMaXN0ICpsaXN0LCBSZWxhdGlvbiBoZWFwUmVs YXRpb24sIE9pZCBoZWFwUmVsSWQpOworCiAjZW5kaWYJCQkJCQkJLyogUkVMQ0FDSEVfSCAq LwotLSAKMi40My4wCgo= ------=_NextPart_6A49C9A9_E0657D40_6AAF3ADB--