Received: from malur.postgresql.org ([217.196.149.56]) by arkaria.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.94.2) (envelope-from ) id 1rAWza-0074Ge-KY for pgsql-odbc@arkaria.postgresql.org; Tue, 05 Dec 2023 15:05:47 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.94.2) (envelope-from ) id 1rAWzZ-004YTV-BT for pgsql-odbc@arkaria.postgresql.org; Tue, 05 Dec 2023 15:05:45 +0000 Received: from makus.postgresql.org ([2001:4800:3e1:1::229]) by malur.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.94.2) (envelope-from <527474735@qq.com>) id 1rAUgA-003bmC-DC for pgsql-odbc@lists.postgresql.org; Tue, 05 Dec 2023 12:37:35 +0000 Received: from out203-205-221-202.mail.qq.com ([203.205.221.202]) by makus.postgresql.org with esmtps (TLS1.2) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.94.2) (envelope-from <527474735@qq.com>) id 1rAUg3-008uoz-07 for pgsql-odbc@postgresql.org; Tue, 05 Dec 2023 12:37:33 +0000 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=qq.com; s=s201512; t=1701779840; bh=Tt4yk7/nAn7c7C+4YN6EGYYPQg6OFecGlaI4qcrxIYk=; h=From:To:Subject:Date; b=UiBXYOOqvzMxDszsuzsgvDK9HDkQMvHrLOaPX4FRXRM5MsUD4nTjS7FxUqQweVh/i l10UuzUJ9XRH1REOEMdIoZdq+QdWY1g2daFaCBlSUlDIYnypE1Uf7/nyRjlcl+Cc7Z QaBo9V1+94OkWltC3xVn7AjUdS8rgpuLdJKzYalc= X-QQ-FEAT: oHWrrGTW1dCGJEu1CuC8+nIWkvSYK6n9 X-QQ-SSF: 00000000000000F0000000000000 X-QQ-XMRINFO: MPJ6Tf5t3I/ycC2BItcBVIA= X-QQ-XMAILINFO: N7pVCJF/rxxTrjJMIRDIdd0xQSuAzjYl/z7zmcBwwWx4jO1PMYshRjneqiZasG L6/Ze932/6J3NgcBCdK2djjMRB+Pxz30sClDIDIob/sEQ0eagSRfDtAer1Y1oa9VphBWI4/6sw6G6 kV4gPQ0VhZS4E9iDvwp/uMe1Pg6BnjfFfOAu3vHb+lSQ1gyVbrR2kq3HP39zHkE1jzpsFZMdI2YOK 6yk01O92Ix63xFB6pkEOjr+uDPDQUoK95lrYGrigiGkHPzr2IEt6Oh6WdB54Wn3dVyzEgBOhonL2f 5J311GLgvAgtz2gOJnsSEi74Oj4KfzRp2P8KN9CSHcmWPb0F7UAvscxwNMpmt7omtEZ3MEFWjTCYN eMamxgHa+ULQgaviWTnb5zF4BcOqc1hMs7Re62tiypIllKFV/tTmgYz8w90whDY8AO0P0lcVIt3AU FEKZjxxIUil1GHUklYATZHrRDm+Pf/EDv4lG3ysdooyVDm57gcLOCc+CjWY9BRTT+guYKNpk/7lv0 P56QjzkOMro52YOgkxpt0+B2a0K8jzNj8w2x6ic1H72ExyLAT2AQiVASCUvU3n9yZLb9QAv/sLvXN 6uPk75NX0DSOEMyhUMw4YsUbUEBYhh8fpVjv8mWVGCSwxmjkQZWmlDQXl6TtL4VVzdtb9n7KbOVOf JCOBcHMVQ0TRM88o1VaDnE9//NwGGhTrqDBEuyhYSm2MLCto0o53SigxtZxonv33c6n0HiZReLGis nWecEr7ZjPwEIhK+TOX7z0ba2cFNiH6rBVhz+3mtGi8dZI3vBbx1O8EP2wZgVKuXgTnRNF6bVH7ja I7eRyzbQZDkP+3Fp/Xyvtxc7c4qm8q73A3Wa4y9j2wBgVn7zkkRGBwQlhWz3VPHKi6WJZ0MQHWyeV 1z2g4Udeha8WQxdCmsCihGFCfoz9GM2q76eFsPNq9KJJzMufEaiD6xT+m20TWXZa5B3DhIOHGp1Jv 9YjDJksP8UVuvc+c7/DYVqmvS6XkhnDD4osO4cQp24u+jd2a7v X-HAS-ATTACH: no X-QQ-BUSINESS-ORIGIN: 2 X-Originating-IP: 183.129.38.242 X-QQ-STYLE: 10 X-QQ-mid: webmail437t1701779839t3233444 From: "=?gb18030?B?TGlDaG9uZw==?=" <527474735@qq.com> To: "=?gb18030?B?cGdzcWwtb2RiY0Bwb3N0Z3Jlc3FsLm9yZw==?=" Subject: during call SQLFreeHandle, the connection is broken. client can't be notified. Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="----=_NextPart_656F197F_122624D0_02FC0C47" Content-Transfer-Encoding: 8Bit Date: Tue, 5 Dec 2023 20:37:19 +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 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_656F197F_122624D0_02FC0C47 Content-Type: multipart/alternative; boundary="----=_NextPart_656F197F_122624D0_290A3324"; ------=_NextPart_656F197F_122624D0_290A3324 Content-Type: text/plain; charset="gb18030" Content-Transfer-Encoding: base64 xOO6ww0KDQoNCsrCzvGzob6wz8KjrFNRTEZyZWVIYW5kbGW199PDvfjQ0NbQo6zBrL3Tts+/ qqOstavKx1NRTEZyZWVIYW5kbGW3tbvYU1FMX1NVQ0NFU1Oho9PJ09pTUUxGcmVlSGFuZGxl tffTw8GsvdO2z7+qo6y0pbeiY2Nfb25fYWJvcnSjrL2rysLO8cihz/ujrNTav827p7bL1rTQ 0GNvbW1pdMqxo6zDu9PQ0+u3/s7xtsu9u7ulsqLH0re1u9izybmmo6y1vNbCv827p7bL0tTO qsr9vt3S0czhvbujrLW81sK2qsr9vt2how0KDQoNCkluIGEgdHJhbnNhY3Rpb24gc2NlbmFy aW8sIHRoZSBjb25uZWN0aW9uIGlzIGRpc2Nvbm5lY3RlZCB3aGlsZSB0aGUgU1FMRnJlZUhh bmRsZSBjYWxsIGlzIGluIHByb2dyZXNzLCBidXQgU1FMRnJlZUhhbmRsZSByZXR1cm5zIFNR TF9TVUNDRVNTLiBCZWNhdXNlIHRoZSBjb25uZWN0aW9uIGlzIGRpc2Nvbm5lY3RlZCBieSB0 aGUgU1FMRnJlZUhhbmRsZSBjYWxsLCB0aGUgY2Nfb25fYWJvcnQgaXMgdHJpZ2dlcmVkLCB0 aGUgdHJhbnNhY3Rpb24gaXMgY2FuY2VsZWQsIGFuZCB0aGUgY2xpZW50IHBlcmZvcm1zIGEg Y29tbWl0IHdpdGhvdXQgaW50ZXJhY3Rpbmcgd2l0aCB0aGUgc2VydmVyIGFuZCByZXR1cm5p bmcgc3VjY2VzcywgY2F1c2luZyB0aGUgY2xpZW50IHRvIHRoaW5rIHRoYXQgdGhlIGRhdGEg aGFzIGJlZW4gc3VibWl0dGVkLCByZXN1bHRpbmcgaW4gZGF0YSBsb3NzLg0KDQoNCg0KY2Fs bCBzdGVwOg0KU1FMQWxsb2NIYW5kbGUxDQpzcWwxDQpTUUxGcmVlSGFuZGxlMQ0KU1FMQWxs b2NIYW5kbGUyDQpzcWwyDQpTUUxGcmVlSGFuZGxlMg0KY29tbWl0DQoNCg0KZHVyaW5nJm5i c3A7Y2FsbCBTUUxGcmVlSGFuZGxlMqOsIHRoZSBjb25uZWN0aW9uJm5ic3A7aXMgYnJva2Vu LiBjbGllbnQgY2FuJ3QmbmJzcDtiZSZuYnNwO25vdGlmaWVkLg0Kd2UgbW9kaWZ5IHRoZSBj b2RlLCBpbiBzdGF0ZW1lbnQuYyZuYnNwO1NDX0Rlc3RydWN0b3IgYW5kIFBHQVBJX0ZyZWVT dG10LCZuYnNwOyZuYnNwO0lzIHRoZXJlIGFueSBvdGhlciBiZXR0ZXIgc29sdXRpb24gdG8g dGhpcyBwcm9ibGVtPyBQbGVhc2Ugc2hhcmUgeW91ciB0aG91Z2h0cyBhbmQgc3VnZ2VzdGlv bnMsIHRoYW5rcy4NCg0KDQoNCg0KYmVsb3cgaXMgcHNxbG9kYmMgbG9nLCBkZWJ1Zz0yDQot LS0tLS0tLS0tLS0tLQ0KWzdmNTg0M2EzYTcwMF0mbmJzcDsgJm5ic3A7IGJpbmQuY1tQREFU QV9mcmVlX3BhcmFtc102ODk6IGxlYXZpbmcNCls3ZjU4NDNhM2E3MDBdIHJlc3VsdHMuY1tQ R0FQSV9Nb3JlUmVzdWx0c10yMDM1OiBsZWF2aW5nIDEwMA0KWzdmNTg0M2EzYTcwMF1vZGJj YXBpMzAuW1NRTEZyZWVIYW5kbGVdMjUwOiBFbnRlcmluZw0KWzdmNTg0M2EzYTcwMF1zdGF0 ZW1lbnQuW1BHQVBJX0ZyZWVTdG10XTI0ODogZW50ZXJpbmcuLi5oc3RtdD0weDdmNTgzYzA0 NDYwMCwgZk9wdGlvbj0xDQpbN2Y1ODQzYTNhNzAwXSBxcmVzdWx0LmNbUVJfRGVzdHJ1Y3Rv cl0zNDQ6IGVudGVyaW5nDQpbN2Y1ODQzYTNhNzAwXXN0YXRlbWVudC5bU0NfaW5pdF9SZXN1 bHRdNTM2OiBsZWF2aW5nKDB4N2Y1ODNjMDQ0NjAwKQ0KWzdmNTg0M2EzYTcwMF1zdGF0ZW1l bnQuW1NDX0Rlc3RydWN0b3JdNDgzOiBlbnRlcmluZyBzZWxmPTB4N2Y1ODNjMDQ0NjAwLCBz ZWxmLSZndDtyZXN1bHQ9KG5pbCksIHNlbGYtJmd0O2hkYmM9MHhlMjdjYzANCls3ZjU4NDNh M2E3MDBdY29ubmVjdGlvbltDQ19zZW5kX3F1ZXJ5X2FwcGVuZF0xODA5OiBjb25uPTB4ZTI3 Y2MwLCBxdWVyeT0nREVBTExPQ0FURSAiX1BMQU4weDdmNTgzYzA0NDYwMCInDQpbN2Y1ODQz YTNhNzAwXWNvbm5lY3Rpb25bQ0Nfc2VuZF9xdWVyeV9hcHBlbmRdMTg5MTogcXVlcnlfbGVu PTMyDQpbN2Y1ODQzYTNhNzAwXWNvbm5lY3Rpb25bQ0Nfc2VuZF9xdWVyeV9hcHBlbmRdMTkz NTogW1FMT0ddUFFzZW5kUXVlcnk6IDB4ZGY0OTkwICdTQVZFUE9JTlQgX3Blcl9xdWVyeV9z dnBfO0RFQUxMT0NBVEUgIl9QTEFOMHg3ZjU4M2MwNDQ2MDAiO1JFTEVBU0UgX3Blcl9xdWVy eV9zdnBfJw0KWzdmNTg0M2EzYTcwMF0gcXJlc3VsdC5jW1FSX0NvbnN0cnVjdG9yXTE3Mzog ZW50ZXJpbmcNCls3ZjU4NDNhM2E3MDBdIHFyZXN1bHQuY1tRUl9Db25zdHJ1Y3Rvcl0yNDI6 IGxlYXZpbmcgMHg3ZjU4M2MwMzAzODANCls3ZjU4NDNhM2E3MDBdY29ubmVjdGlvbltoYW5k bGVfcGdyZXNfZXJyb3JdODY0OiBQR19ESUFHX1NFVkVSSVRZX05PTkxPQ0FMSVpFRD0obnVs bCkNCls3ZjU4NDNhM2E3MDBdY29ubmVjdGlvbltoYW5kbGVfcGdyZXNfZXJyb3JdODgzOiBb UUxPR10JKChudWxsKSkgKG51bGwpICcobnVsbCknDQpbN2Y1ODQzYTNhNzAwXWNvbm5lY3Rp b25baGFuZGxlX3BncmVzX2Vycm9yXTk1MDogZXJyb3IgbWVzc2FnZT1zZXJ2ZXIgY2xvc2Vk IHRoZSBjb25uZWN0aW9uIHVuZXhwZWN0ZWRseQ0KCVRoaXMgcHJvYmFibHkgbWVhbnMgdGhl IHNlcnZlciB0ZXJtaW5hdGVkIGFibm9ybWFsbHkNCgliZWZvcmUgb3Igd2hpbGUgcHJvY2Vz c2luZyB0aGUgcmVxdWVzdC4NCigxMzcpDQpbN2Y1ODQzYTNhNzAwXWNvbm5lY3Rpb25bQ0Nf b25fYWJvcnRdMTU4MjogZW50ZXJpbmcgb3B0PTINCls3ZjU4NDNhM2E3MDBdY29ubmVjdGlv bltDQ19vbl9hYm9ydF0xNjA0OiBbUUxPR11QUWZpbmlzaDogMHhkZjQ5OTANCls3ZjU4NDNh M2E3MDBdIHFyZXN1bHQuY1tRUl9EZXN0cnVjdG9yXTM0NDogZW50ZXJpbmcNCls3ZjU4NDNh M2E3MDBdIHFyZXN1bHQuY1tRUl9jbG9zZV9yZXN1bHRdMjU1OiBlbnRlcmluZw0KWzdmNTg0 M2EzYTcwMF0gcXJlc3VsdC5jW1FSX2ZyZWVfbWVtb3J5XTQ3OTogZW50ZXJpbmcgZmNvdW50 PTANCls3ZjU4NDNhM2E3MDBdIHFyZXN1bHQuY1tRUl9mcmVlX21lbW9yeV01Nzc6IGxlYXZp bmcNCls3ZjU4NDNhM2E3MDBdIHFyZXN1bHQuY1tRUl9jbG9zZV9yZXN1bHRdMzE5OiBsZWF2 aW5nDQpbN2Y1ODQzYTNhNzAwXSBxcmVzdWx0LmNbUVJfRGVzdHJ1Y3Rvcl0zNDg6IGxlYXZp bmcNCls3ZjU4NDNhM2E3MDBdJm5ic3A7ICZuYnNwOyBiaW5kLmNbQVBEX2ZyZWVfcGFyYW1z XTY0MzogZW50ZXJpbmcgc2VsZj0weDdmNTgzYzA0NDdlMA0KWzdmNTg0M2EzYTcwMF0mbmJz cDsgJm5ic3A7IGJpbmQuY1tBUERfZnJlZV9wYXJhbXNdNjU1OiBsZWF2aW5nDQpbN2Y1ODQz YTNhNzAwXSZuYnNwOyAmbmJzcDsgYmluZC5jW0lQRF9mcmVlX3BhcmFtc102OTg6IGVudGVy aW5nIHNlbGY9MHg3ZjU4M2MwNDQ4NTANCls3ZjU4NDNhM2E3MDBdJm5ic3A7ICZuYnNwOyBi aW5kLmNbSVBEX2ZyZWVfcGFyYW1zXTcwOTogbGVhdmluZw0KWzdmNTg0M2EzYTcwMF0mbmJz cDsgJm5ic3A7IGJpbmQuY1tQREFUQV9mcmVlX3BhcmFtc102NjM6IGVudGVyaW5nIHNlbGY9 MHg3ZjU4M2MwNDQ5NDgNCls3ZjU4NDNhM2E3MDBdJm5ic3A7ICZuYnNwOyBiaW5kLmNbUERB VEFfZnJlZV9wYXJhbXNdNjg5OiBsZWF2aW5nDQpbN2Y1ODQzYTNhNzAwXXN0YXRlbWVudC5b U0NfRGVzdHJ1Y3Rvcl01MjY6IGxlYXZpbmcNCls3ZjU4NDNhM2E3MDBdb2RiY2FwaTMwLltT UUxFbmRUcmFuXTE3MTogRW50ZXJpbmcNCls3ZjU4NDNhM2E3MDBdIGV4ZWN1dGUuY1tQR0FQ SV9UcmFuc2FjdF0xMjA4OiBlbnRlcmluZyBoZGJjPTB4ZTI3Y2MwLCBoZW52PShuaWwpDQpb N2Y1ODQzYTNhNzAwXW9kYmNhcGkzMC5bU1FMQWxsb2NIYW5kbGVdNDA6IEVudGVyaW5nDQpb N2Y1ODQzYTNhNzAwXXN0YXRlbWVudC5bUEdBUElfQWxsb2NTdG10XTE4OTogZW50ZXJpbmcu Li4NCg0KDQoNCkJlc3QgV2lzaGVzDQoNCg0KTGlDaG9uZw0KNTI3NDc0NzM1QHFxLmNvbQ0K DQoNCg0KJm5ic3A7 ------=_NextPart_656F197F_122624D0_290A3324 Content-Type: text/html; charset="gb18030" Content-Transfer-Encoding: base64 PG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNo YXJzZXQ9R0IxODAzMCI+PGRpdj48ZGl2PsTjusM8L2Rpdj48ZGl2Pjxicj48L2Rpdj48ZGl2 PsrCzvGzob6wz8KjrFNRTEZyZWVIYW5kbGW199PDvfjQ0NbQo6zBrL3Tts+/qqOstavKx1NR TEZyZWVIYW5kbGW3tbvYU1FMX1NVQ0NFU1Oho9PJ09pTUUxGcmVlSGFuZGxltffTw8GsvdO2 z7+qo6y0pbeiY2Nfb25fYWJvcnSjrL2rysLO8cihz/ujrNTav827p7bL1rTQ0GNvbW1pdMqx o6zDu9PQ0+u3/s7xtsu9u7ulsqLH0re1u9izybmmo6y1vNbCv827p7bL0tTOqsr9vt3S0czh vbujrLW81sK2qsr9vt2hozwvZGl2PjxkaXY+PGJyPjwvZGl2PjxkaXY+SW4gYSB0cmFuc2Fj dGlvbiBzY2VuYXJpbywgdGhlIGNvbm5lY3Rpb24gaXMgZGlzY29ubmVjdGVkIHdoaWxlIHRo ZSBTUUxGcmVlSGFuZGxlIGNhbGwgaXMgaW4gcHJvZ3Jlc3MsIGJ1dCBTUUxGcmVlSGFuZGxl IHJldHVybnMgU1FMX1NVQ0NFU1MuIEJlY2F1c2UgdGhlIGNvbm5lY3Rpb24gaXMgZGlzY29u bmVjdGVkIGJ5IHRoZSBTUUxGcmVlSGFuZGxlIGNhbGwsIHRoZSBjY19vbl9hYm9ydCBpcyB0 cmlnZ2VyZWQsIHRoZSB0cmFuc2FjdGlvbiBpcyBjYW5jZWxlZCwgYW5kIHRoZSBjbGllbnQg cGVyZm9ybXMgYSBjb21taXQgd2l0aG91dCBpbnRlcmFjdGluZyB3aXRoIHRoZSBzZXJ2ZXIg YW5kIHJldHVybmluZyBzdWNjZXNzLCBjYXVzaW5nIHRoZSBjbGllbnQgdG8gdGhpbmsgdGhh dCB0aGUgZGF0YSBoYXMgYmVlbiBzdWJtaXR0ZWQsIHJlc3VsdGluZyBpbiBkYXRhIGxvc3Mu PC9kaXY+PC9kaXY+PGRpdj48YnI+PC9kaXY+PGRpdj48c3BhbiBzdHlsZT0iYmFja2dyb3Vu ZC1jb2xvcjogcmdiKDI1NSwgMjA0LCAwKTsiPmNhbGwgc3RlcDo8L3NwYW4+PC9kaXY+PGRp dj5TUUxBbGxvY0hhbmRsZTE8L2Rpdj48ZGl2PnNxbDE8L2Rpdj48ZGl2PlNRTEZyZWVIYW5k bGUxPC9kaXY+PGRpdj5TUUxBbGxvY0hhbmRsZTI8L2Rpdj48ZGl2PnNxbDI8L2Rpdj48ZGl2 PlNRTEZyZWVIYW5kbGUyPC9kaXY+PGRpdj5jb21taXQ8L2Rpdj48ZGl2Pjxicj48L2Rpdj48 ZGl2PmR1cmluZyZuYnNwO2NhbGwgU1FMRnJlZUhhbmRsZTKjrCB0aGUgY29ubmVjdGlvbiZu YnNwO2lzIGJyb2tlbi4gY2xpZW50IGNhbid0Jm5ic3A7YmUmbmJzcDs8c3BhbiBzdHlsZT0i YmFja2dyb3VuZC1jb2xvcjogcmdiKDI1MywgMjUzLCAyNTQpOyBjb2xvcjogcmdiKDUsIDcs IDU5KTsgZm9udC1mYW1pbHk6IC1hcHBsZS1zeXN0ZW0sIEJsaW5rTWFjU3lzdGVtRm9udCwg JnF1b3Q7U2Vnb2UgVUkmcXVvdDssIFJvYm90bywgVWJ1bnR1LCAmcXVvdDtIZWx2ZXRpY2Eg TmV1ZSZxdW90OywgSGVsdmV0aWNhLCBBcmlhbCwgJnF1b3Q7UGluZ0ZhbmcgU0MmcXVvdDss ICZxdW90O0hpcmFnaW5vIFNhbnMgR0ImcXVvdDssICZxdW90O01pY3Jvc29mdCBZYUhlaSBV SSZxdW90OywgJnF1b3Q7TWljcm9zb2Z0IFlhSGVpJnF1b3Q7LCAmcXVvdDtTb3VyY2UgSGFu IFNhbnMgQ04mcXVvdDssIHNhbnMtc2VyaWYsICZxdW90O0FwcGxlIENvbG9yIEVtb2ppJnF1 b3Q7LCAmcXVvdDtTZWdvZSBVSSBFbW9qaSZxdW90OzsgZm9udC1zaXplOiAxNXB4OyI+PC9z cGFuPjxzcGFuIHN0eWxlPSJiYWNrZ3JvdW5kLWNvbG9yOiByZ2IoMjUzLCAyNTMsIDI1NCk7 IGNvbG9yOiByZ2IoNSwgNywgNTkpOyBmb250LWZhbWlseTogLWFwcGxlLXN5c3RlbSwgQmxp bmtNYWNTeXN0ZW1Gb250LCAmcXVvdDtTZWdvZSBVSSZxdW90OywgUm9ib3RvLCBVYnVudHUs ICZxdW90O0hlbHZldGljYSBOZXVlJnF1b3Q7LCBIZWx2ZXRpY2EsIEFyaWFsLCAmcXVvdDtQ aW5nRmFuZyBTQyZxdW90OywgJnF1b3Q7SGlyYWdpbm8gU2FucyBHQiZxdW90OywgJnF1b3Q7 TWljcm9zb2Z0IFlhSGVpIFVJJnF1b3Q7LCAmcXVvdDtNaWNyb3NvZnQgWWFIZWkmcXVvdDss ICZxdW90O1NvdXJjZSBIYW4gU2FucyBDTiZxdW90Oywgc2Fucy1zZXJpZiwgJnF1b3Q7QXBw bGUgQ29sb3IgRW1vamkmcXVvdDssICZxdW90O1NlZ29lIFVJIEVtb2ppJnF1b3Q7OyBmb250 LXNpemU6IDE1cHg7Ij5ub3RpZmllZC48L3NwYW4+PC9kaXY+PGRpdj53ZSBtb2RpZnkgdGhl IGNvZGUsIGluIHN0YXRlbWVudC5jJm5ic3A7U0NfRGVzdHJ1Y3RvciBhbmQgUEdBUElfRnJl ZVN0bXQsJm5ic3A7Jm5ic3A7PHNwYW4gc3R5bGU9ImJhY2tncm91bmQtY29sb3I6IHJnYigy NTMsIDI1MywgMjU0KTsgY29sb3I6IHJnYig1LCA3LCA1OSk7IGZvbnQtZmFtaWx5OiAtYXBw bGUtc3lzdGVtLCBCbGlua01hY1N5c3RlbUZvbnQsICZxdW90O1NlZ29lIFVJJnF1b3Q7LCBS b2JvdG8sIFVidW50dSwgJnF1b3Q7SGVsdmV0aWNhIE5ldWUmcXVvdDssIEhlbHZldGljYSwg QXJpYWwsICZxdW90O1BpbmdGYW5nIFNDJnF1b3Q7LCAmcXVvdDtIaXJhZ2lubyBTYW5zIEdC JnF1b3Q7LCAmcXVvdDtNaWNyb3NvZnQgWWFIZWkgVUkmcXVvdDssICZxdW90O01pY3Jvc29m dCBZYUhlaSZxdW90OywgJnF1b3Q7U291cmNlIEhhbiBTYW5zIENOJnF1b3Q7LCBzYW5zLXNl cmlmLCAmcXVvdDtBcHBsZSBDb2xvciBFbW9qaSZxdW90OywgJnF1b3Q7U2Vnb2UgVUkgRW1v amkmcXVvdDs7IGZvbnQtc2l6ZTogMTVweDsiPklzIHRoZXJlIGFueSBvdGhlciBiZXR0ZXIg c29sdXRpb24gdG8gdGhpcyBwcm9ibGVtPyBQbGVhc2Ugc2hhcmUgeW91ciB0aG91Z2h0cyBh bmQgc3VnZ2VzdGlvbnMsIHRoYW5rcy48L3NwYW4+PC9kaXY+PGRpdj48YnI+PC9kaXY+PGRp dj48YnI+PC9kaXY+PGRpdj48c3BhbiBzdHlsZT0iYmFja2dyb3VuZC1jb2xvcjogcmdiKDI1 NSwgMjA0LCAwKTsiPmJlbG93IGlzIHBzcWxvZGJjIGxvZywgZGVidWc9Mjwvc3Bhbj48L2Rp dj48ZGl2Pi0tLS0tLS0tLS0tLS0tPC9kaXY+PGRpdj48ZGl2Pls3ZjU4NDNhM2E3MDBdJm5i c3A7ICZuYnNwOyBiaW5kLmNbUERBVEFfZnJlZV9wYXJhbXNdNjg5OiBsZWF2aW5nPC9kaXY+ PGRpdj5bN2Y1ODQzYTNhNzAwXSByZXN1bHRzLmNbUEdBUElfTW9yZVJlc3VsdHNdMjAzNTog bGVhdmluZyAxMDA8L2Rpdj48ZGl2Pls3ZjU4NDNhM2E3MDBdb2RiY2FwaTMwLltTUUxGcmVl SGFuZGxlXTI1MDogRW50ZXJpbmc8L2Rpdj48ZGl2Pls3ZjU4NDNhM2E3MDBdc3RhdGVtZW50 LltQR0FQSV9GcmVlU3RtdF0yNDg6IGVudGVyaW5nLi4uaHN0bXQ9MHg3ZjU4M2MwNDQ2MDAs IGZPcHRpb249MTwvZGl2PjxkaXY+WzdmNTg0M2EzYTcwMF0gcXJlc3VsdC5jW1FSX0Rlc3Ry dWN0b3JdMzQ0OiBlbnRlcmluZzwvZGl2PjxkaXY+WzdmNTg0M2EzYTcwMF1zdGF0ZW1lbnQu W1NDX2luaXRfUmVzdWx0XTUzNjogbGVhdmluZygweDdmNTgzYzA0NDYwMCk8L2Rpdj48ZGl2 Pls3ZjU4NDNhM2E3MDBdc3RhdGVtZW50LltTQ19EZXN0cnVjdG9yXTQ4MzogZW50ZXJpbmcg c2VsZj0weDdmNTgzYzA0NDYwMCwgc2VsZi0mZ3Q7cmVzdWx0PShuaWwpLCBzZWxmLSZndDto ZGJjPTB4ZTI3Y2MwPC9kaXY+PGRpdj48Zm9udCBjb2xvcj0iI2ZmMDAwMCI+WzdmNTg0M2Ez YTcwMF1jb25uZWN0aW9uW0NDX3NlbmRfcXVlcnlfYXBwZW5kXTE4MDk6IGNvbm49MHhlMjdj YzAsIHF1ZXJ5PSdERUFMTE9DQVRFICJfUExBTjB4N2Y1ODNjMDQ0NjAwIic8L2ZvbnQ+PC9k aXY+PGRpdj48Zm9udCBjb2xvcj0iI2ZmMDAwMCI+WzdmNTg0M2EzYTcwMF1jb25uZWN0aW9u W0NDX3NlbmRfcXVlcnlfYXBwZW5kXTE4OTE6IHF1ZXJ5X2xlbj0zMjwvZm9udD48L2Rpdj48 ZGl2Pjxmb250IGNvbG9yPSIjZmYwMDAwIj5bN2Y1ODQzYTNhNzAwXWNvbm5lY3Rpb25bQ0Nf c2VuZF9xdWVyeV9hcHBlbmRdMTkzNTogW1FMT0ddUFFzZW5kUXVlcnk6IDB4ZGY0OTkwICdT QVZFUE9JTlQgX3Blcl9xdWVyeV9zdnBfO0RFQUxMT0NBVEUgIl9QTEFOMHg3ZjU4M2MwNDQ2 MDAiO1JFTEVBU0UgX3Blcl9xdWVyeV9zdnBfJzwvZm9udD48L2Rpdj48ZGl2Pjxmb250IGNv bG9yPSIjZmYwMDAwIj5bN2Y1ODQzYTNhNzAwXSBxcmVzdWx0LmNbUVJfQ29uc3RydWN0b3Jd MTczOiBlbnRlcmluZzwvZm9udD48L2Rpdj48ZGl2Pjxmb250IGNvbG9yPSIjZmYwMDAwIj5b N2Y1ODQzYTNhNzAwXSBxcmVzdWx0LmNbUVJfQ29uc3RydWN0b3JdMjQyOiBsZWF2aW5nIDB4 N2Y1ODNjMDMwMzgwPC9mb250PjwvZGl2PjxkaXY+PGZvbnQgY29sb3I9IiNmZjAwMDAiPls3 ZjU4NDNhM2E3MDBdY29ubmVjdGlvbltoYW5kbGVfcGdyZXNfZXJyb3JdODY0OiBQR19ESUFH X1NFVkVSSVRZX05PTkxPQ0FMSVpFRD0obnVsbCk8L2ZvbnQ+PC9kaXY+PGRpdj48Zm9udCBj b2xvcj0iI2ZmMDAwMCI+WzdmNTg0M2EzYTcwMF1jb25uZWN0aW9uW2hhbmRsZV9wZ3Jlc19l cnJvcl04ODM6IFtRTE9HXTxzcGFuIHN0eWxlPSJ3aGl0ZS1zcGFjZTpwcmUiPgk8L3NwYW4+ KChudWxsKSkgKG51bGwpICcobnVsbCknPC9mb250PjwvZGl2PjxkaXY+PGZvbnQgY29sb3I9 IiNmZjAwMDAiPls3ZjU4NDNhM2E3MDBdY29ubmVjdGlvbltoYW5kbGVfcGdyZXNfZXJyb3Jd OTUwOiBlcnJvciBtZXNzYWdlPXNlcnZlciBjbG9zZWQgdGhlIGNvbm5lY3Rpb24gdW5leHBl Y3RlZGx5PC9mb250PjwvZGl2PjxkaXY+PHNwYW4gc3R5bGU9IndoaXRlLXNwYWNlOiBub3Jt YWw7Ij48Zm9udCBjb2xvcj0iI2ZmMDAwMCI+PHNwYW4gc3R5bGU9IndoaXRlLXNwYWNlOnBy ZSI+CTwvc3Bhbj5UaGlzIHByb2JhYmx5IG1lYW5zIHRoZSBzZXJ2ZXIgdGVybWluYXRlZCBh Ym5vcm1hbGx5PC9mb250Pjwvc3Bhbj48L2Rpdj48ZGl2PjxzcGFuIHN0eWxlPSJ3aGl0ZS1z cGFjZTogbm9ybWFsOyI+PGZvbnQgY29sb3I9IiNmZjAwMDAiPjxzcGFuIHN0eWxlPSJ3aGl0 ZS1zcGFjZTpwcmUiPgk8L3NwYW4+YmVmb3JlIG9yIHdoaWxlIHByb2Nlc3NpbmcgdGhlIHJl cXVlc3QuPC9mb250Pjwvc3Bhbj48L2Rpdj48ZGl2Pjxmb250IGNvbG9yPSIjZmYwMDAwIj4o MTM3KTwvZm9udD48L2Rpdj48ZGl2Pjxmb250IGNvbG9yPSIjZmYwMDAwIj5bN2Y1ODQzYTNh NzAwXWNvbm5lY3Rpb25bQ0Nfb25fYWJvcnRdMTU4MjogZW50ZXJpbmcgb3B0PTI8L2ZvbnQ+ PC9kaXY+PGRpdj48Zm9udCBjb2xvcj0iI2ZmMDAwMCI+WzdmNTg0M2EzYTcwMF1jb25uZWN0 aW9uW0NDX29uX2Fib3J0XTE2MDQ6IFtRTE9HXVBRZmluaXNoOiAweGRmNDk5MDwvZm9udD48 L2Rpdj48ZGl2Pls3ZjU4NDNhM2E3MDBdIHFyZXN1bHQuY1tRUl9EZXN0cnVjdG9yXTM0NDog ZW50ZXJpbmc8L2Rpdj48ZGl2Pls3ZjU4NDNhM2E3MDBdIHFyZXN1bHQuY1tRUl9jbG9zZV9y ZXN1bHRdMjU1OiBlbnRlcmluZzwvZGl2PjxkaXY+WzdmNTg0M2EzYTcwMF0gcXJlc3VsdC5j W1FSX2ZyZWVfbWVtb3J5XTQ3OTogZW50ZXJpbmcgZmNvdW50PTA8L2Rpdj48ZGl2Pls3ZjU4 NDNhM2E3MDBdIHFyZXN1bHQuY1tRUl9mcmVlX21lbW9yeV01Nzc6IGxlYXZpbmc8L2Rpdj48 ZGl2Pls3ZjU4NDNhM2E3MDBdIHFyZXN1bHQuY1tRUl9jbG9zZV9yZXN1bHRdMzE5OiBsZWF2 aW5nPC9kaXY+PGRpdj5bN2Y1ODQzYTNhNzAwXSBxcmVzdWx0LmNbUVJfRGVzdHJ1Y3Rvcl0z NDg6IGxlYXZpbmc8L2Rpdj48ZGl2Pls3ZjU4NDNhM2E3MDBdJm5ic3A7ICZuYnNwOyBiaW5k LmNbQVBEX2ZyZWVfcGFyYW1zXTY0MzogZW50ZXJpbmcgc2VsZj0weDdmNTgzYzA0NDdlMDwv ZGl2PjxkaXY+WzdmNTg0M2EzYTcwMF0mbmJzcDsgJm5ic3A7IGJpbmQuY1tBUERfZnJlZV9w YXJhbXNdNjU1OiBsZWF2aW5nPC9kaXY+PGRpdj5bN2Y1ODQzYTNhNzAwXSZuYnNwOyAmbmJz cDsgYmluZC5jW0lQRF9mcmVlX3BhcmFtc102OTg6IGVudGVyaW5nIHNlbGY9MHg3ZjU4M2Mw NDQ4NTA8L2Rpdj48ZGl2Pls3ZjU4NDNhM2E3MDBdJm5ic3A7ICZuYnNwOyBiaW5kLmNbSVBE X2ZyZWVfcGFyYW1zXTcwOTogbGVhdmluZzwvZGl2PjxkaXY+WzdmNTg0M2EzYTcwMF0mbmJz cDsgJm5ic3A7IGJpbmQuY1tQREFUQV9mcmVlX3BhcmFtc102NjM6IGVudGVyaW5nIHNlbGY9 MHg3ZjU4M2MwNDQ5NDg8L2Rpdj48ZGl2Pls3ZjU4NDNhM2E3MDBdJm5ic3A7ICZuYnNwOyBi aW5kLmNbUERBVEFfZnJlZV9wYXJhbXNdNjg5OiBsZWF2aW5nPC9kaXY+PGRpdj5bN2Y1ODQz YTNhNzAwXXN0YXRlbWVudC5bU0NfRGVzdHJ1Y3Rvcl01MjY6IGxlYXZpbmc8L2Rpdj48ZGl2 Pjxmb250IGNvbG9yPSIjZmYwMDAwIj5bN2Y1ODQzYTNhNzAwXW9kYmNhcGkzMC5bU1FMRW5k VHJhbl0xNzE6IEVudGVyaW5nPC9mb250PjwvZGl2PjxkaXY+PGZvbnQgY29sb3I9IiNmZjAw MDAiPls3ZjU4NDNhM2E3MDBdIGV4ZWN1dGUuY1tQR0FQSV9UcmFuc2FjdF0xMjA4OiBlbnRl cmluZyBoZGJjPTB4ZTI3Y2MwLCBoZW52PShuaWwpPC9mb250PjwvZGl2PjxkaXY+WzdmNTg0 M2EzYTcwMF1vZGJjYXBpMzAuW1NRTEFsbG9jSGFuZGxlXTQwOiBFbnRlcmluZzwvZGl2Pjxk aXY+WzdmNTg0M2EzYTcwMF1zdGF0ZW1lbnQuW1BHQVBJX0FsbG9jU3RtdF0xODk6IGVudGVy aW5nLi4uPC9kaXY+PC9kaXY+PGRpdj48YnI+PC9kaXY+PGRpdj5CZXN0IFdpc2hlczwvZGl2 PjxkaXY+PGhyIGFsaWduPSJsZWZ0IiBzdHlsZT0ibWFyZ2luOiAwIDAgMTBweCAwO2JvcmRl cjogMDtib3JkZXItYm90dG9tOjFweCBzb2xpZCAjRTRFNUU2O2hlaWdodDowO2xpbmUtaGVp Z2h0OjA7Zm9udC1zaXplOjA7cGFkZGluZzogMjBweCAwIDAgMDt3aWR0aDogNTBweDsiPjxk aXYgc3R5bGU9ImZvbnQtc2l6ZToxNHB4O2ZvbnQtZmFtaWx5OlZlcmRhbmE7Y29sb3I6IzAw MDsiPjxhIGNsYXNzPSJ4bV93cml0ZV9jYXJkIiBpZD0iaW5fYWxpYXMiIHN0eWxlPSJ3aGl0 ZS1zcGFjZTogbm9ybWFsOyBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7IHRleHQtZGVjb3JhdGlv bjogbm9uZSAhaW1wb3J0YW50O2ZvbnQtZmFtaWx5OiAtYXBwbGUtc3lzdGVtLEJsaW5rTWFj U3lzdGVtRm9udCxQaW5nRmFuZyBTQyxNaWNyb3NvZnQgWWFIZWk7IiBocmVmPSJodHRwczov L3d4Lm1haWwucXEuY29tL2hvbWUvaW5kZXg/dD1yZWFkbWFpbF9idXNpbmVzc2NhcmRfbWlk cGFnZSZhbXA7bm9jaGVjaz10cnVlJmFtcDtuYW1lPUxpQ2hvbmcmYW1wO2ljb249aHR0cCUz QSUyRiUyRnRoaXJkcXEucWxvZ28uY24lMkZnJTNGYiUzRG9pZGIlMjZrJTNEaWJObzI5RzNj dHJaQjRnNkNydUViUFElMjZrdGklM0RaSkZVZlFBQUFBSSUyNnMlM0QxMDAlMjZ0JTNEMTQ5 NTM2MDU0NSZhbXA7bWFpbD01Mjc0NzQ3MzUlNDBxcS5jb20mYW1wO2NvZGU9Y1FnWDNEM1dl RENXUXZtUHRNRlBsTERIVXh1Z2tJVjRaSkwxM0twNkpmWUc3WVJJeG9uVC1JM29YbkRZUzBw YWdWLTVGLV9VV1RXRV9GN0h1VEtRamciIHRhcmdldD0iX2JsYW5rIj48dGFibGUgc3R5bGU9 IndoaXRlLXNwYWNlOiBub3JtYWw7dGFibGUtbGF5b3V0OiBmaXhlZDsgcGFkZGluZy1yaWdo dDogMjBweDsiIGNvbnRlbnRlZGl0YWJsZT0iZmFsc2UiIGNlbGxwYWRkaW5nPSIwIiBjZWxs c3BhY2luZz0iMCI+PHRib2R5Pjx0ciB2YWxpZ249InRvcCI+PHRkIHN0eWxlPSJ3aWR0aDog NDBweDttaW4td2lkdGg6IDQwcHg7IHBhZGRpbmctdG9wOjEwcHgiPjxkaXYgc3R5bGU9Indp ZHRoOiAzOHB4OyBoZWlnaHQ6IDM4cHg7IGJvcmRlcjogMXB4ICNGRkYgc29saWQ7IGJvcmRl ci1yYWRpdXM6NTAlOyBtYXJnaW46IDA7dmVydGljYWwtYWxpZ246IHRvcDtib3gtc2hhZG93 OiAwIDAgMTBweCAwIHJnYmEoMTI3LDE1MiwxNzgsMC4xNCk7Ij48aW1nIHNyYz0iaHR0cDov L3RoaXJkcXEucWxvZ28uY24vZz9iPW9pZGImYW1wO2s9aWJObzI5RzNjdHJaQjRnNkNydUVi UFEmYW1wO2t0aT1aSkZVZlFBQUFBSSZhbXA7cz0xMDAmYW1wO3Q9MTQ5NTM2MDU0NSIgc3R5 bGU9IndpZHRoOjEwMCU7aGVpZ2h0OjEwMCU7Ym9yZGVyLXJhZGl1czo1MCU7cG9pbnRlci1l dmVudHM6IG5vbmU7Ij48L2Rpdj48L3RkPjx0ZCBzdHlsZT0icGFkZGluZzogMTBweCAwIDhw eCAxMHB4OyI+PGRpdiBjbGFzcz0iYnVzaW5lc3NDYXJkX25hbWUiIHN0eWxlPSJmb250LXNp emU6IDE0cHg7Y29sb3I6ICMzMzMxMkU7bGluZS1oZWlnaHQ6IDIwcHg7IHBhZGRpbmctYm90 dG9tOiAycHg7IG1hcmdpbjowO2ZvbnQtd2VpZ2h0OiA1MDA7Ij5MaUNob25nPC9kaXY+PGRp diBjbGFzcz0iYnVzaW5lc3NDYXJkX21haWwiIHN0eWxlPSJmb250LXNpemU6IDEycHg7Y29s b3I6ICM5OTk4OTY7bGluZS1oZWlnaHQ6IDE4cHg7IG1hcmdpbjowOyI+NTI3NDc0NzM1QHFx LmNvbTwvZGl2PjwvdGQ+PC90cj48L3Rib2R5PjwvdGFibGU+PC9hPjwvZGl2PjwvZGl2Pjxk aXY+Jm5ic3A7PC9kaXY+ ------=_NextPart_656F197F_122624D0_290A3324-- ------=_NextPart_656F197F_122624D0_02FC0C47 Content-Type: application/octet-stream; charset="gb18030"; name="statement.c" Content-Disposition: attachment; filename="statement.c" Content-Transfer-Encoding: base64 LyotLS0tLS0KICogTW9kdWxlOgkJCXN0YXRlbWVudC5jCiAqCiAqIERlc2NyaXB0aW9uOgkJ VGhpcyBtb2R1bGUgY29udGFpbnMgZnVuY3Rpb25zIHJlbGF0ZWQgdG8gY3JlYXRpbmcKICoJ CQkJCWFuZCBtYW5pcHVsYXRpbmcgYSBzdGF0ZW1lbnQuCiAqCiAqIENsYXNzZXM6CQkJU3Rh dGVtZW50Q2xhc3MgKEZ1bmN0aW9ucyBwcmVmaXg6ICJTQ18iKQogKgogKiBBUEkgZnVuY3Rp b25zOglTUUxBbGxvY1N0bXQsIFNRTEZyZWVTdG10CiAqCiAqIENvbW1lbnRzOgkJU2VlICJy ZWFkbWUudHh0IiBmb3IgY29weXJpZ2h0IGFuZCBsaWNlbnNlIGluZm9ybWF0aW9uLgogKi0t LS0tLS0KICovCgojaWZkZWYJV0lOX01VTFRJVEhSRUFEX1NVUFBPUlQKI2lmbmRlZglfV0lO MzJfV0lOTlQKI2RlZmluZQlfV0lOMzJfV0lOTlQJMHgwNDAwCiNlbmRpZiAvKiBfV0lOMzJf V0lOTlQgKi8KI2VuZGlmIC8qIFdJTl9NVUxUSVRIUkVBRF9TVVBQT1JUICovCgojaW5jbHVk ZSAic3RhdGVtZW50LmgiCiNpbmNsdWRlICJtaXNjLmgiIC8vIHN0cm5jcHlfbnVsbAoKI2lu Y2x1ZGUgImJpbmQuaCIKI2luY2x1ZGUgImNvbm5lY3Rpb24uaCIKI2luY2x1ZGUgIm11bHRp Ynl0ZS5oIgojaW5jbHVkZSAicXJlc3VsdC5oIgojaW5jbHVkZSAiY29udmVydC5oIgojaW5j bHVkZSAiZW52aXJvbi5oIgojaW5jbHVkZSAibG9hZGxpYi5oIgoKI2luY2x1ZGUgPHN0ZGlv Lmg+CiNpbmNsdWRlIDxzdHJpbmcuaD4KI2luY2x1ZGUgPGN0eXBlLmg+CgojaW5jbHVkZSAi cGdhcGlmdW5jLmgiCgoKLyoJTWFwIHNxbCBjb21tYW5kcyB0byBzdGF0ZW1lbnQgdHlwZXMg Ki8Kc3RhdGljIGNvbnN0IHN0cnVjdAp7CglpbnQJCQl0eXBlOwoJY2hhcgkgICAqczsKfQlT dGF0ZW1lbnRfVHlwZVtdID0KCnsKCXsKCQlTVE1UX1RZUEVfU0VMRUNULCAiU0VMRUNUIgoJ fQoJLHsKCQlTVE1UX1RZUEVfSU5TRVJULCAiSU5TRVJUIgoJfQoJLHsKCQlTVE1UX1RZUEVf VVBEQVRFLCAiVVBEQVRFIgoJfQoJLHsKCQlTVE1UX1RZUEVfREVMRVRFLCAiREVMRVRFIgoJ fQoJLHsKCQlTVE1UX1RZUEVfUFJPQ0NBTEwsICJDQUxMIgoJfQoJLHsKCQlTVE1UX1RZUEVf UFJPQ0NBTEwsICJ7IgoJfQoJLHsKCQlTVE1UX1RZUEVfU0VULCAiU0VUIgoJfQoJLHsKCQlT VE1UX1RZUEVfUkVTRVQsICJSRVNFVCIKCX0KCSx7CgkJU1RNVF9UWVBFX0NSRUFURSwgIkNS RUFURSIKCX0KCSx7CgkJU1RNVF9UWVBFX0RFQ0xBUkUsICJERUNMQVJFIgoJfQoJLHsKCQlT VE1UX1RZUEVfRkVUQ0gsICJGRVRDSCIKCX0KCSx7CgkJU1RNVF9UWVBFX01PVkUsICJNT1ZF IgoJfQoJLHsKCQlTVE1UX1RZUEVfQ0xPU0UsICJDTE9TRSIKCX0KCSx7CgkJU1RNVF9UWVBF X1BSRVBBUkUsICJQUkVQQVJFIgoJfQoJLHsKCQlTVE1UX1RZUEVfRVhFQ1VURSwgIkVYRUNV VEUiCgl9CgksewoJCVNUTVRfVFlQRV9ERUFMTE9DQVRFLCAiREVBTExPQ0FURSIKCX0KCSx7 CgkJU1RNVF9UWVBFX0RST1AsICJEUk9QIgoJfQoJLHsKCQlTVE1UX1RZUEVfU1RBUlQsICJC RUdJTiIKCX0KCSx7CgkJU1RNVF9UWVBFX1NUQVJULCAiU1RBUlQiCgl9CgksewoJCVNUTVRf VFlQRV9UUkFOU0FDVElPTiwgIlNBVkVQT0lOVCIKCX0KCSx7CgkJU1RNVF9UWVBFX1RSQU5T QUNUSU9OLCAiUkVMRUFTRSIKCX0KCSx7CgkJU1RNVF9UWVBFX1RSQU5TQUNUSU9OLCAiQ09N TUlUIgoJfQoJLHsKCQlTVE1UX1RZUEVfVFJBTlNBQ1RJT04sICJFTkQiCgl9CgksewoJCVNU TVRfVFlQRV9UUkFOU0FDVElPTiwgIlJPTExCQUNLIgoJfQoJLHsKCQlTVE1UX1RZUEVfVFJB TlNBQ1RJT04sICJBQk9SVCIKCX0KCSx7CgkJU1RNVF9UWVBFX0xPQ0ssICJMT0NLIgoJfQoJ LHsKCQlTVE1UX1RZUEVfQUxURVIsICJBTFRFUiIKCX0KCSx7CgkJU1RNVF9UWVBFX0dSQU5U LCAiR1JBTlQiCgl9CgksewoJCVNUTVRfVFlQRV9SRVZPS0UsICJSRVZPS0UiCgl9CgksewoJ CVNUTVRfVFlQRV9DT1BZLCAiQ09QWSIKCX0KCSx7CgkJU1RNVF9UWVBFX0FOQUxZWkUsICJB TkFMWVpFIgoJfQoJLHsKCQlTVE1UX1RZUEVfTk9USUZZLCAiTk9USUZZIgoJfQoJLHsKCQlT VE1UX1RZUEVfRVhQTEFJTiwgIkVYUExBSU4iCgl9CgoJLyoKCSAqIFNwZWNpYWwtY29tbWFu ZHMgdGhhdCBjYW5ub3QgYmUgcnVuIGluIGEgdHJhbnNhY3Rpb24gYmxvY2suIFRoaXMgaXNu J3QKCSAqIGFzIGdyYW51bGFyIGFzIGl0IGNvdWxkIGJlLiBWQUNVVU0gY2FuIG5ldmVyIGJl IHJ1biBpbiBhIHRyYW5zYWN0aW9uCgkgKiBibG9jaywgYnV0IHNvbWUgdmFyaWFudHMgb2Yg UkVJTkRFWCBhbmQgQ0xVU1RFUiBjYW4gYmUuIENIRUNLUE9JTlQKCSAqIGRvZXNuJ3QgdGhy b3cgYW4gZXJyb3IgaWYgeW91IGRvLCBidXQgaXQgY2Fubm90IGJlIHJvbGxlZCBiYWNrIHNv CgkgKiB0aGVyZSdzIG5vIHBvaW50IGluIGJlZ2lubmluZyBhIG5ldyB0cmFuc2FjdGlvbiBm b3IgaXQuCgkgKi8KCSx7CgkJU1RNVF9UWVBFX1NQRUNJQUwsICJWQUNVVU0iCgl9CgksewoJ CVNUTVRfVFlQRV9TUEVDSUFMLCAiUkVJTkRFWCIKCX0KCSx7CgkJU1RNVF9UWVBFX1NQRUNJ QUwsICJDTFVTVEVSIgoJfQoJLHsKCQlTVE1UX1RZUEVfU1BFQ0lBTCwgIkNIRUNLUE9JTlQi Cgl9CgoJLHsKCQlTVE1UX1RZUEVfV0lUSCwgIldJVEgiCgl9CgksewoJCTAsIE5VTEwKCX0K fTsKCnN0YXRpYyBRUmVzdWx0Q2xhc3MgKmxpYnBxX2JpbmRfYW5kX2V4ZWMoU3RhdGVtZW50 Q2xhc3MgKnN0bXQpOwpzdGF0aWMgdm9pZCBTQ19zZXRfZXJyb3JpbmZvKFN0YXRlbWVudENs YXNzICpzZWxmLCBRUmVzdWx0Q2xhc3MgKnJlcywgaW50IGVycmtpbmQpOwpzdGF0aWMgdm9p ZCBTQ19zZXRfZXJyb3JfaWZfbm90X3NldChTdGF0ZW1lbnRDbGFzcyAqc2VsZiwgaW50IGVy cm9ybnVtYmVyLCBjb25zdCBjaGFyICplcnJtc2csIGNvbnN0IGNoYXIgKmZ1bmMpOwoKClJF VENPREUJCVNRTF9BUEkKUEdBUElfQWxsb2NTdG10KEhEQkMgaGRiYywKCQkJCUhTVE1UICog cGhzdG10LCBVRFdPUkQgZmxhZykKewoJQ1NUUiBmdW5jID0gIlBHQVBJX0FsbG9jU3RtdCI7 CglDb25uZWN0aW9uQ2xhc3MgKmNvbm4gPSAoQ29ubmVjdGlvbkNsYXNzICopIGhkYmM7CglT dGF0ZW1lbnRDbGFzcyAqc3RtdDsKCUFSREZpZWxkcwkqYXJkb3B0czsKCglNWUxPRygwLCAi ZW50ZXJpbmcuLi5cbiIpOwoKCWlmICghY29ubikKCXsKCQlDQ19sb2dfZXJyb3IoZnVuYywg IiIsIE5VTEwpOwoJCXJldHVybiBTUUxfSU5WQUxJRF9IQU5ETEU7Cgl9CgoJc3RtdCA9IFND X0NvbnN0cnVjdG9yKGNvbm4pOwoKCU1ZTE9HKDAsICIqKioqIDogaGRiYyA9ICVwLCBzdG10 ID0gJXBcbiIsIGhkYmMsIHN0bXQpOwoKCWlmICghc3RtdCkKCXsKCQlDQ19zZXRfZXJyb3Io Y29ubiwgQ09OTl9TVE1UX0FMTE9DX0VSUk9SLCAiTm8gbW9yZSBtZW1vcnkgdG8gYWxsb2Nh dGUgYSBmdXJ0aGVyIFNRTC1zdGF0ZW1lbnQiLCBmdW5jKTsKCQkqcGhzdG10ID0gU1FMX05V TExfSFNUTVQ7CgkJcmV0dXJuIFNRTF9FUlJPUjsKCX0KCglpZiAoIUNDX2FkZF9zdGF0ZW1l bnQoY29ubiwgc3RtdCkpCgl7CgkJQ0Nfc2V0X2Vycm9yKGNvbm4sIENPTk5fU1RNVF9BTExP Q19FUlJPUiwgIk1heGltdW0gbnVtYmVyIG9mIHN0YXRlbWVudHMgZXhjZWVkZWQuIiwgZnVu Yyk7CgkJU0NfRGVzdHJ1Y3RvcihzdG10KTsKCQkqcGhzdG10ID0gU1FMX05VTExfSFNUTVQ7 CgkJcmV0dXJuIFNRTF9FUlJPUjsKCX0KCgkqcGhzdG10ID0gKEhTVE1UKSBzdG10OwoKCXN0 bXQtPmlmbGFnID0gZmxhZzsKCS8qIENvcHkgZGVmYXVsdCBzdGF0ZW1lbnQgb3B0aW9ucyBi YXNlZCBmcm9tIENvbm5lY3Rpb24gb3B0aW9ucyAqLwoJaWYgKDAgIT0gKFBPREJDX0lOSEVS SVRfQ09OTkVDVF9PUFRJT05TICYgZmxhZykpCgl7CgkJc3RtdC0+b3B0aW9ucyA9IHN0bXQt Pm9wdGlvbnNfb3JpZyA9IGNvbm4tPnN0bXRPcHRpb25zOwoJCXN0bXQtPmFyZGkuYXJkZiA9 IGNvbm4tPmFyZE9wdGlvbnM7Cgl9CgllbHNlCgl7CgkJSW5pdGlhbGl6ZVN0YXRlbWVudE9w dGlvbnMoJnN0bXQtPm9wdGlvbnNfb3JpZyk7CgkJc3RtdC0+b3B0aW9ucyA9IHN0bXQtPm9w dGlvbnNfb3JpZzsKCQlJbml0aWFsaXplQVJERmllbGRzKCZzdG10LT5hcmRpLmFyZGYpOwoJ fQoJYXJkb3B0cyA9IFNDX2dldF9BUkRGKHN0bXQpOwoJQVJEX0FsbG9jQm9va21hcmsoYXJk b3B0cyk7CgoJLyogU2F2ZSB0aGUgaGFuZGxlIGZvciBsYXRlciAqLwoJc3RtdC0+cGhzdG10 ID0gcGhzdG10OwoKCXJldHVybiBTUUxfU1VDQ0VTUzsKfQoKClJFVENPREUJCVNRTF9BUEkK UEdBUElfRnJlZVN0bXQoSFNUTVQgaHN0bXQsCgkJCSAgIFNRTFVTTUFMTElOVCBmT3B0aW9u KQp7CglDU1RSIGZ1bmMgPSAiUEdBUElfRnJlZVN0bXQiOwoJU3RhdGVtZW50Q2xhc3MgKnN0 bXQgPSAoU3RhdGVtZW50Q2xhc3MgKikgaHN0bXQ7CgoJTVlMT0coMCwgImVudGVyaW5nLi4u aHN0bXQ9JXAsIGZPcHRpb249JWhpXG4iLCBoc3RtdCwgZk9wdGlvbik7CgoJaWYgKCFzdG10 KQoJewoJCVNDX2xvZ19lcnJvcihmdW5jLCAiIiwgTlVMTCk7CgkJcmV0dXJuIFNRTF9JTlZB TElEX0hBTkRMRTsKCX0KCVNDX2NsZWFyX2Vycm9yKHN0bXQpOwoKCWlmIChmT3B0aW9uID09 IFNRTF9EUk9QKQoJewoJCUNvbm5lY3Rpb25DbGFzcyAqY29ubiA9IHN0bXQtPmhkYmM7CgoJ CS8qIFJlbW92ZSB0aGUgc3RhdGVtZW50IGZyb20gdGhlIGNvbm5lY3Rpb24ncyBzdGF0ZW1l bnQgbGlzdCAqLwoJCWlmIChjb25uKQoJCXsKCQkJUVJlc3VsdENsYXNzCSpyZXM7CgoJCQlp ZiAoU1RNVF9FWEVDVVRJTkcgPT0gc3RtdC0+c3RhdHVzKQoJCQl7CgkJCQlTQ19zZXRfZXJy b3Ioc3RtdCwgU1RNVF9TRVFVRU5DRV9FUlJPUiwgIlN0YXRlbWVudCBpcyBjdXJyZW50bHkg ZXhlY3V0aW5nIGEgdHJhbnNhY3Rpb24uIiwgZnVuYyk7CgkJCQlyZXR1cm4gU1FMX0VSUk9S OyAvKiBzdG10IG1heSBiZSBleGVjdXRpbmcgYSB0cmFuc2FjdGlvbiAqLwoJCQl9CgkJCWlm IChjb25uLT51bm5hbWVkX3ByZXBhcmVkX3N0bXQgPT0gc3RtdCkKCQkJCWNvbm4tPnVubmFt ZWRfcHJlcGFyZWRfc3RtdCA9IE5VTEw7CgoJCQkvKgoJCQkgKiBGcmVlIGFueSBjdXJzb3Jz IGFuZCBkaXNjYXJkIGFueSByZXN1bHQgaW5mby4KCQkJICogRG9uJ3QgZGV0YWNoIHRoZSBz dGF0ZW1lbnQgZnJvbSB0aGUgY29ubmVjdGlvbgoJCQkgKiBiZWZvcmUgZnJlZWluZyB0aGUg YXNzb2NpYXRlZCBjdXJzb3JzLiBPdGhlcndpc2UKCQkJICogQ0NfY3Vyc29yX2NvdW50KCkg d291bGQgZ2V0IHdyb25nIHJlc3VsdHMuCgkJCSAqLwoJCQlyZXMgPSBTQ19nZXRfUmVzdWx0 KHN0bXQpOwoJCQlRUl9EZXN0cnVjdG9yKHJlcyk7CgkJCVNDX2luaXRfUmVzdWx0KHN0bXQp OwoJCQlpZiAoIUNDX3JlbW92ZV9zdGF0ZW1lbnQoY29ubiwgc3RtdCkpCgkJCXsKCQkJCVND X3NldF9lcnJvcihzdG10LCBTVE1UX1NFUVVFTkNFX0VSUk9SLCAiU3RhdGVtZW50IGlzIGN1 cnJlbnRseSBleGVjdXRpbmcgYSB0cmFuc2FjdGlvbi4iLCBmdW5jKTsKCQkJCXJldHVybiBT UUxfRVJST1I7CQkvKiBzdG10IG1heSBiZSBleGVjdXRpbmcgYQoJCQkJCQkJCQkJICogdHJh bnNhY3Rpb24gKi8KCQkJfQoJCX0KCgkJaWYgKHN0bXQtPmV4ZWN1dGVfZGVsZWdhdGUpCgkJ ewoJCQlQR0FQSV9GcmVlU3RtdChzdG10LT5leGVjdXRlX2RlbGVnYXRlLCBTUUxfRFJPUCk7 CgkJCXN0bXQtPmV4ZWN1dGVfZGVsZWdhdGUgPSBOVUxMOwoJCX0KCQlpZiAoc3RtdC0+ZXhl Y3V0ZV9wYXJlbnQpCgkJCXN0bXQtPmV4ZWN1dGVfcGFyZW50LT5leGVjdXRlX2RlbGVnYXRl ID0gTlVMTDsKCQkvKiBEZXN0cm95IHRoZSBzdGF0ZW1lbnQgYW5kIGZyZWUgYW55IHJlc3Vs dHMsIGN1cnNvcnMsIGV0Yy4gKi8KCQkvL1NDX0Rlc3RydWN0b3Ioc3RtdCk7CQkKCQkvKmlm IHRoZSBjb25uZWN0aW9uIHdhcyBnaXZlIHVwLHJldHVybiBTUUxfRVJST1IuKi8KCQlpZihT Q19EZXN0cnVjdG9yKHN0bXQpID09IEZBTFNFKQoJCQlyZXR1cm4gU1FMX0VSUk9SOwoJfQoJ ZWxzZSBpZiAoZk9wdGlvbiA9PSBTUUxfVU5CSU5EKQoJCVNDX3VuYmluZF9jb2xzKHN0bXQp OwoJZWxzZSBpZiAoZk9wdGlvbiA9PSBTUUxfQ0xPU0UpCgl7CgkJLyoKCQkgKiB0aGlzIHNo b3VsZCBkaXNjYXJkIGFsbCB0aGUgcmVzdWx0cywgYnV0IGxlYXZlIHRoZSBzdGF0ZW1lbnQK CQkgKiBpdHNlbGYgaW4gcGxhY2UgKGl0IGNhbiBiZSBleGVjdXRlZCBhZ2FpbikKCQkgKi8K CQlzdG10LT50cmFuc2l0aW9uX3N0YXR1cyA9IFNUTVRfVFJBTlNJVElPTl9BTExPQ0FURUQ7 CgkJaWYgKHN0bXQtPmV4ZWN1dGVfZGVsZWdhdGUpCgkJewoJCQlQR0FQSV9GcmVlU3RtdChz dG10LT5leGVjdXRlX2RlbGVnYXRlLCBTUUxfRFJPUCk7CgkJCXN0bXQtPmV4ZWN1dGVfZGVs ZWdhdGUgPSBOVUxMOwoJCX0KCQlpZiAoIVNDX3JlY3ljbGVfc3RhdGVtZW50KHN0bXQpKQoJ CXsKCQkJcmV0dXJuIFNRTF9FUlJPUjsKCQl9CgkJU0Nfc2V0X0N1cnJlcyhzdG10LCBOVUxM KTsKCX0KCWVsc2UgaWYgKGZPcHRpb24gPT0gU1FMX1JFU0VUX1BBUkFNUykKCQlTQ19mcmVl X3BhcmFtcyhzdG10LCBTVE1UX0ZSRUVfUEFSQU1TX0FMTCk7CgllbHNlCgl7CgkJU0Nfc2V0 X2Vycm9yKHN0bXQsIFNUTVRfT1BUSU9OX09VVF9PRl9SQU5HRV9FUlJPUiwgIkludmFsaWQg b3B0aW9uIHBhc3NlZCB0byBQR0FQSV9GcmVlU3RtdC4iLCBmdW5jKTsKCQlyZXR1cm4gU1FM X0VSUk9SOwoJfQoKCXJldHVybiBTUUxfU1VDQ0VTUzsKfQoKCi8qCiAqIFN0YXRlbWVudENs YXNzIGltcGxlbWVudGF0aW9uCiAqLwp2b2lkCkluaXRpYWxpemVTdGF0ZW1lbnRPcHRpb25z KFN0YXRlbWVudE9wdGlvbnMgKm9wdCkKewoJbWVtc2V0KG9wdCwgMCwgc2l6ZW9mKFN0YXRl bWVudE9wdGlvbnMpKTsKCW9wdC0+c2Nyb2xsX2NvbmN1cnJlbmN5ID0gU1FMX0NPTkNVUl9S RUFEX09OTFk7CglvcHQtPmN1cnNvcl90eXBlID0gU1FMX0NVUlNPUl9GT1JXQVJEX09OTFk7 CglvcHQtPnJldHJpZXZlX2RhdGEgPSBTUUxfUkRfT047CglvcHQtPnVzZV9ib29rbWFya3Mg PSBTUUxfVUJfT0ZGOwoJb3B0LT5tZXRhZGF0YV9pZCA9IFNRTF9GQUxTRTsKfQoKc3RhdGlj IHZvaWQgU0NfY2xlYXJfcGFyc2Vfc3RhdHVzKFN0YXRlbWVudENsYXNzICpzZWxmLCBDb25u ZWN0aW9uQ2xhc3MgKmNvbm4pCnsKCXNlbGYtPnBhcnNlX3N0YXR1cyA9IFNUTVRfUEFSU0Vf Tk9ORTsKfQoKc3RhdGljIHZvaWQgU0NfaW5pdF9kaXNjYXJkX291dHB1dF9wYXJhbXMoU3Rh dGVtZW50Q2xhc3MgKnNlbGYpCnsKCUNvbm5lY3Rpb25DbGFzcwkqY29ubiA9IFNDX2dldF9j b25uKHNlbGYpOwoKCWlmICghY29ubikJcmV0dXJuOwoJc2VsZi0+ZGlzY2FyZF9vdXRwdXRf cGFyYW1zID0gMDsKCWlmICghY29ubi0+Y29ubkluZm8udXNlX3NlcnZlcl9zaWRlX3ByZXBh cmUpCgkJc2VsZi0+ZGlzY2FyZF9vdXRwdXRfcGFyYW1zID0gMTsKfQoKc3RhdGljIHZvaWQg U0NfaW5pdF9wYXJzZV9tZXRob2QoU3RhdGVtZW50Q2xhc3MgKnNlbGYpCnsKCUNvbm5lY3Rp b25DbGFzcwkqY29ubiA9IFNDX2dldF9jb25uKHNlbGYpOwoKCXNlbGYtPnBhcnNlX21ldGhv ZCA9IDA7CglpZiAoIWNvbm4pCXJldHVybjsKCWlmICgwID09IChQT0RCQ19FWFRFUk5BTF9T VEFURU1FTlQgJiBzZWxmLT5pZmxhZykpCXJldHVybjsKCWlmIChzZWxmLT5jYXRhbG9nX3Jl c3VsdCkgcmV0dXJuOwoJaWYgKGNvbm4tPmNvbm5JbmZvLmRyaXZlcnMucGFyc2UpCgkJU0Nf c2V0X3BhcnNlX2ZvcmNlZChzZWxmKTsKfQoKU3RhdGVtZW50Q2xhc3MgKgpTQ19Db25zdHJ1 Y3RvcihDb25uZWN0aW9uQ2xhc3MgKmNvbm4pCnsKCVN0YXRlbWVudENsYXNzICpydjsKCgly diA9IChTdGF0ZW1lbnRDbGFzcyAqKSBtYWxsb2Moc2l6ZW9mKFN0YXRlbWVudENsYXNzKSk7 CglpZiAocnYpCgl7CgkJcnYtPmhkYmMgPSBjb25uOwoJCXJ2LT5waHN0bXQgPSBOVUxMOwoJ CXJ2LT5yaG9sZC5maXJzdCA9IHJ2LT5yaG9sZC5sYXN0ID0gTlVMTDsKCQlydi0+Y3VycmVz ID0gTlVMTDsKCQlydi0+cGFyc2VkID0gTlVMTDsKCQlydi0+Y2F0YWxvZ19yZXN1bHQgPSBG QUxTRTsKCQlydi0+cHJlcGFyZSA9IE5PTl9QUkVQQVJFX1NUQVRFTUVOVDsKCQlydi0+cHJl cGFyZWQgPSBOT1RfWUVUX1BSRVBBUkVEOwoJCXJ2LT5zdGF0dXMgPSBTVE1UX0FMTE9DQVRF RDsKCQlydi0+ZXh0ZXJuYWwgPSBGQUxTRTsKCQlydi0+aWZsYWcgPSAwOwoJCXJ2LT5wbGFu X25hbWUgPSBOVUxMOwoJCXJ2LT50cmFuc2l0aW9uX3N0YXR1cyA9IFNUTVRfVFJBTlNJVElP Tl9VTkFMTE9DQVRFRDsKCQlydi0+bXVsdGlfc3RhdGVtZW50ID0gLTE7IC8qIHVua25vd24g Ki8KCQlydi0+bnVtX3BhcmFtcyA9IC0xOyAvKiB1bmtub3duICovCgkJcnYtPnByb2Nlc3Nl ZF9zdGF0ZW1lbnRzID0gTlVMTDsKCgkJcnYtPl9fZXJyb3JfbWVzc2FnZSA9IE5VTEw7CgkJ cnYtPl9fZXJyb3JfbnVtYmVyID0gMDsKCQlydi0+cGdlcnJvciA9IE5VTEw7CgoJCXJ2LT5z dGF0ZW1lbnQgPSBOVUxMOwoJCXJ2LT5zdG10X3dpdGhfcGFyYW1zID0gTlVMTDsKCQlydi0+ bG9hZF9zdGF0ZW1lbnQgPSBOVUxMOwoJCXJ2LT5zdGF0ZW1lbnRfdHlwZSA9IFNUTVRfVFlQ RV9VTktOT1dOOwoKCQlydi0+Y3VyclR1cGxlID0gLTE7CgkJcnYtPnJvd3NldF9zdGFydCA9 IDA7CgkJU0Nfc2V0X3Jvd3NldF9zdGFydChydiwgLTEsIEZBTFNFKTsKCQlydi0+Y3VycmVu dF9jb2wgPSAtMTsKCQlydi0+YmluZF9yb3cgPSAwOwoJCXJ2LT5mcm9tX3BvcyA9IHJ2LT5s b2FkX2Zyb21fcG9zID0gcnYtPndoZXJlX3BvcyA9IC0xOwoJCXJ2LT5sYXN0X2ZldGNoX2Nv dW50ID0gcnYtPmxhc3RfZmV0Y2hfY291bnRfaW5jbHVkZV9vbW1pdHRlZCA9IDA7CgkJcnYt PnNhdmVfcm93c2V0X3NpemUgPSAtMTsKCgkJcnYtPmRhdGFfYXRfZXhlYyA9IC0xOwoJCXJ2 LT5jdXJyZW50X2V4ZWNfcGFyYW0gPSAtMTsKCQlydi0+ZXhlY19zdGFydF9yb3cgPSAtMTsK CQlydi0+ZXhlY19lbmRfcm93ID0gLTE7CgkJcnYtPmV4ZWNfY3VycmVudF9yb3cgPSAtMTsK CQlydi0+cHV0X2RhdGEgPSBGQUxTRTsKCQlydi0+cmVmX0NDX2Vycm9yID0gRkFMU0U7CgkJ cnYtPmpvaW5faW5mbyA9IDA7CgkJU0NfaW5pdF9wYXJzZV9tZXRob2QocnYpOwoKCQlydi0+ bG9ial9mZCA9IC0xOwoJCUlOSVRfTkFNRShydi0+Y3Vyc29yX25hbWUpOwoKCQkvKiBQYXJz ZSBTdHVmZiAqLwoJCXJ2LT50aSA9IE5VTEw7CgkJcnYtPm50YWIgPSAwOwoJCXJ2LT5udW1f a2V5X2ZpZWxkcyA9IC0xOyAvKiB1bmtub3duICovCgkJU0NfY2xlYXJfcGFyc2Vfc3RhdHVz KHJ2LCBjb25uKTsKCQlydi0+cHJvY19yZXR1cm4gPSAtMTsKCQlTQ19pbml0X2Rpc2NhcmRf b3V0cHV0X3BhcmFtcyhydik7CgkJcnYtPmNhbmNlbF9pbmZvID0gMDsKCgkJLyogQ2xlYXIg U3RhdGVtZW50IE9wdGlvbnMgLS0gZGVmYXVsdHMgd2lsbCBiZSBzZXQgaW4gQWxsb2NTdG10 ICovCgkJbWVtc2V0KCZydi0+b3B0aW9ucywgMCwgc2l6ZW9mKFN0YXRlbWVudE9wdGlvbnMp KTsKCQlJbml0aWFsaXplRW1iZWRkZWREZXNjcmlwdG9yKChEZXNjcmlwdG9yQ2xhc3MgKikm KHJ2LT5hcmRpKSwKCQkJCXJ2LCBTUUxfQVRUUl9BUFBfUk9XX0RFU0MpOwoJCUluaXRpYWxp emVFbWJlZGRlZERlc2NyaXB0b3IoKERlc2NyaXB0b3JDbGFzcyAqKSYocnYtPmFwZGkpLAoJ CQkJcnYsIFNRTF9BVFRSX0FQUF9QQVJBTV9ERVNDKTsKCQlJbml0aWFsaXplRW1iZWRkZWRE ZXNjcmlwdG9yKChEZXNjcmlwdG9yQ2xhc3MgKikmKHJ2LT5pcmRpKSwKCQkJCXJ2LCBTUUxf QVRUUl9JTVBfUk9XX0RFU0MpOwoJCUluaXRpYWxpemVFbWJlZGRlZERlc2NyaXB0b3IoKERl c2NyaXB0b3JDbGFzcyAqKSYocnYtPmlwZGkpLAoJCQkJcnYsIFNRTF9BVFRSX0lNUF9QQVJB TV9ERVNDKTsKCgkJcnYtPm1pc2NpbmZvID0gMDsKCQlydi0+ZXhlY2luZm8gPSAwOwoJCXJ2 LT5yYl9vcl90YyA9IDA7CgkJU0NfcmVzZXRfdXBkYXRhYmxlKHJ2KTsKCQlydi0+ZGlhZ19y b3dfY291bnQgPSAwOwoJCXJ2LT5zdG10X3RpbWUgPSAwOwoJCXJ2LT5leGVjdXRlX2RlbGVn YXRlID0gTlVMTDsKCQlydi0+ZXhlY3V0ZV9wYXJlbnQgPSBOVUxMOwoJCXJ2LT5hbGxvY2F0 ZWRfY2FsbGJhY2tzID0gMDsKCQlydi0+bnVtX2NhbGxiYWNrcyA9IDA7CgkJcnYtPmNhbGxi YWNrcyA9IE5VTEw7CgkJR2V0RGF0YUluZm9Jbml0aWFsaXplKFNDX2dldF9HRFRJKHJ2KSk7 CgkJUHV0RGF0YUluZm9Jbml0aWFsaXplKFNDX2dldF9QRFRJKHJ2KSk7CgkJcnYtPnVzZV9z ZXJ2ZXJfc2lkZV9wcmVwYXJlID0gY29ubi0+Y29ubkluZm8udXNlX3NlcnZlcl9zaWRlX3By ZXBhcmU7CgkJcnYtPmxvY2tfQ0NfZm9yX3JiID0gRkFMU0U7CgkJLy8gZm9yIGJhdGNoIGV4 ZWN1dGlvbgoJCW1lbXNldCgmcnYtPnN0bXRfZGVmZmVyZWQsIDAsIHNpemVvZihydi0+c3Rt dF9kZWZmZXJlZCkpOwoJCWlmICgocnYtPmJhdGNoX3NpemUgPSBjb25uLT5jb25uSW5mby5i YXRjaF9zaXplKSA8IDEpCgkJCXJ2LT5iYXRjaF9zaXplID0gMTsKCQlydi0+ZXhlY190eXBl ID0gRElSRUNUX0VYRUM7CgkJcnYtPmNvdW50X29mX2RlZmZlcmVkID0gMDsKCQlydi0+aGFz X25vdGljZSA9IDA7CgkJSU5JVF9TVE1UX0NTKHJ2KTsKCX0KCXJldHVybiBydjsKfQoKY2hh cgpTQ19EZXN0cnVjdG9yKFN0YXRlbWVudENsYXNzICpzZWxmKQp7CgljaGFyIGNSZXQgPSBU UlVFOwoJQ1NUUiBmdW5jCT0gIlNDX0Rlc3RydWN0b3IiOwoJUVJlc3VsdENsYXNzCSpyZXMg PSBTQ19nZXRfUmVzdWx0KHNlbGYpOwoKCU1ZTE9HKDAsICJlbnRlcmluZyBzZWxmPSVwLCBz ZWxmLT5yZXN1bHQ9JXAsIHNlbGYtPmhkYmM9JXBcbiIsIHNlbGYsIHJlcywgc2VsZi0+aGRi Yyk7CglTQ19jbGVhcl9lcnJvcihzZWxmKTsKCWlmIChTVE1UX0VYRUNVVElORyA9PSBzZWxm LT5zdGF0dXMpCgl7CgkJU0Nfc2V0X2Vycm9yKHNlbGYsIFNUTVRfU0VRVUVOQ0VfRVJST1Is ICJTdGF0ZW1lbnQgaXMgY3VycmVudGx5IGV4ZWN1dGluZyBhIHRyYW5zYWN0aW9uLiIsIGZ1 bmMpOwoJCXJldHVybiBGQUxTRTsKCX0KCglpZiAocmVzKQoJewoJCWlmICghc2VsZi0+aGRi YykKCQkJcmVzLT5jb25uID0gTlVMTDsJLyogcHJldmVudCBhbnkgZGJhc2UgYWN0aXZpdHkg Ki8KCgkJUVJfRGVzdHJ1Y3RvcihyZXMpOwoJfQoKCVNDX2luaXRpYWxpemVfc3RtdHMoc2Vs ZiwgVFJVRSk7CgoJCglpZihzZWxmLT5oZGJjICYmICFzZWxmLT5oZGJjLT5wcWNvbm4pCgl7 CgkJU0Nfc2V0X2Vycm9yKHNlbGYsIFNUTVRfQ09NTVVOSUNBVElPTl9FUlJPUiwgImNvbm5l Y3Rpb24gZXJyb3IuIiwgZnVuYyk7CgkJY1JldCA9IEZBTFNFOwoJfQoKICAgICAgICAvKiBG cmVlIHRoZSBwYXJzZWQgdGFibGUgaW5mb3JtYXRpb24gKi8KCVNDX2luaXRpYWxpemVfY29s c19pbmZvKHNlbGYsIEZBTFNFLCBUUlVFKTsKCglOVUxMX1RIRV9OQU1FKHNlbGYtPmN1cnNv cl9uYW1lKTsKCS8qIEZyZWUgdGhlIHBhcnNlZCBmaWVsZCBpbmZvcm1hdGlvbiAqLwoJRENf RGVzdHJ1Y3RvcigoRGVzY3JpcHRvckNsYXNzICopIFNDX2dldF9BUkRpKHNlbGYpKTsKCURD X0Rlc3RydWN0b3IoKERlc2NyaXB0b3JDbGFzcyAqKSBTQ19nZXRfQVBEaShzZWxmKSk7CglE Q19EZXN0cnVjdG9yKChEZXNjcmlwdG9yQ2xhc3MgKikgU0NfZ2V0X0lSRGkoc2VsZikpOwoJ RENfRGVzdHJ1Y3RvcigoRGVzY3JpcHRvckNsYXNzICopIFNDX2dldF9JUERpKHNlbGYpKTsK CUdEQVRBX3VuYmluZF9jb2xzKFNDX2dldF9HRFRJKHNlbGYpLCBUUlVFKTsKCVBEQVRBX2Zy ZWVfcGFyYW1zKFNDX2dldF9QRFRJKHNlbGYpLCBTVE1UX0ZSRUVfUEFSQU1TX0FMTCk7CgoJ aWYgKHNlbGYtPl9fZXJyb3JfbWVzc2FnZSkKCQlmcmVlKHNlbGYtPl9fZXJyb3JfbWVzc2Fn ZSk7CglpZiAoc2VsZi0+cGdlcnJvcikKCQlFUl9EZXN0cnVjdG9yKHNlbGYtPnBnZXJyb3Ip OwoJY2FuY2VsTmVlZERhdGFTdGF0ZShzZWxmKTsKCWlmIChzZWxmLT5jYWxsYmFja3MpCgkJ ZnJlZShzZWxmLT5jYWxsYmFja3MpOwoJaWYgKCFQUUV4cEJ1ZmZlckRhdGFCcm9rZW4oc2Vs Zi0+c3RtdF9kZWZmZXJlZCkpCgkJdGVybVBRRXhwQnVmZmVyKCZzZWxmLT5zdG10X2RlZmZl cmVkKTsKCglERUxFVEVfU1RNVF9DUyhzZWxmKTsKCWZyZWUoc2VsZik7CgoJTVlMT0coMCwg ImxlYXZpbmdcbiIpOwoJCglyZXR1cm4gY1JldDsKfQoKdm9pZApTQ19pbml0X1Jlc3VsdChT dGF0ZW1lbnRDbGFzcyAqc2VsZikKewoJc2VsZi0+cmhvbGQuZmlyc3QgPSBzZWxmLT5yaG9s ZC5sYXN0ID0gTlVMTDsKCXNlbGYtPmN1cnJlcyA9IE5VTEw7CglNWUxPRygwLCAibGVhdmlu ZyglcClcbiIsIHNlbGYpOwp9Cgp2b2lkClNDX3NldF9SZXN1bHQoU3RhdGVtZW50Q2xhc3Mg KnNlbGYsIFFSZXN1bHRDbGFzcyAqZmlyc3QpCnsKCWlmIChmaXJzdCAhPSBzZWxmLT5yaG9s ZC5maXJzdCkKCXsKCQlRUmVzdWx0Q2xhc3MgKmxhc3QgPSBOVUxMLCAqcmVzOwoKCQlNWUxP RygwLCAiKCVwLCAlcClcbiIsIHNlbGYsIGZpcnN0KTsKCQlRUl9EZXN0cnVjdG9yKHNlbGYt PnBhcnNlZCk7CgkJc2VsZi0+cGFyc2VkID0gTlVMTDsKCQlRUl9EZXN0cnVjdG9yKHNlbGYt PnJob2xkLmZpcnN0KTsKCQlmb3IgKHJlcyA9IGZpcnN0OyByZXM7IHJlcyA9IFFSX25leHRy KHJlcykpCgkJCWxhc3QgPSByZXM7CgkJc2VsZi0+Y3VycmVzID0gZmlyc3Q7CgkJc2VsZi0+ cmhvbGQuZmlyc3QgPSBmaXJzdDsKCQlzZWxmLT5yaG9sZC5sYXN0ID0gbGFzdDsKCX0KfQoK dm9pZApTQ19zZXRfUmVzdWx0SG9sZChTdGF0ZW1lbnRDbGFzcyAqc2VsZiwgUVJlc3VsdEhv bGQgcmhvbGQpCnsKCWlmIChyaG9sZC5maXJzdCAhPSBzZWxmLT5yaG9sZC5maXJzdCkKCXsK CQlNWUxPRygwLCAiKCVwLCB7JXAsICVwfSlcbiIsIHNlbGYsIHJob2xkLmZpcnN0LCByaG9s ZC5sYXN0KTsKCQlRUl9EZXN0cnVjdG9yKHNlbGYtPnBhcnNlZCk7CgkJc2VsZi0+cGFyc2Vk ID0gTlVMTDsKCQlRUl9EZXN0cnVjdG9yKHNlbGYtPnJob2xkLmZpcnN0KTsKCQlzZWxmLT5j dXJyZXMgPSByaG9sZC5maXJzdDsKCQlzZWxmLT5yaG9sZCA9IHJob2xkOwoJfQoJZWxzZSBp ZiAocmhvbGQubGFzdCAhPSBzZWxmLT5yaG9sZC5sYXN0KQoJewoJCXNlbGYtPnJob2xkLmxh c3QgPSByaG9sZC5sYXN0OwoJCWlmIChRUl9uZXh0cihyaG9sZC5sYXN0KSAhPSBOVUxMKQoJ CQlTQ19zZXRfZXJyb3Ioc2VsZiwgU1RNVF9JTlRFUk5BTF9FUlJPUiwgImxhc3QgUmVzdWx0 IGlzIG5vdCB0aGUgbGFzdCByZXN1bHQiLCBfX0ZVTkNUSU9OX18pOwoJfQoKfQoKLyoKICoJ RnJlZSBwYXJhbWV0ZXJzIGFuZCBmcmVlIHRoZSBtZW1vcnkgZnJvbSB0aGUKICoJZGF0YS1h dC1leGVjdXRpb24gcGFyYW1ldGVycyB0aGF0IHdhcyBhbGxvY2F0ZWQgaW4gU1FMUHV0RGF0 YS4KICovCnZvaWQKU0NfZnJlZV9wYXJhbXMoU3RhdGVtZW50Q2xhc3MgKnNlbGYsIGNoYXIg b3B0aW9uKQp7CglpZiAob3B0aW9uICE9IFNUTVRfRlJFRV9QQVJBTVNfREFUQV9BVF9FWEVD X09OTFkpCgl7CgkJQVBEX2ZyZWVfcGFyYW1zKFNDX2dldF9BUERGKHNlbGYpLCBvcHRpb24p OwoJCUlQRF9mcmVlX3BhcmFtcyhTQ19nZXRfSVBERihzZWxmKSwgb3B0aW9uKTsKCX0KCVBE QVRBX2ZyZWVfcGFyYW1zKFNDX2dldF9QRFRJKHNlbGYpLCBvcHRpb24pOwoJc2VsZi0+ZGF0 YV9hdF9leGVjID0gLTE7CglzZWxmLT5jdXJyZW50X2V4ZWNfcGFyYW0gPSAtMTsKCXNlbGYt PnB1dF9kYXRhID0gRkFMU0U7CglpZiAob3B0aW9uID09IFNUTVRfRlJFRV9QQVJBTVNfQUxM KQoJewoJCXNlbGYtPmV4ZWNfc3RhcnRfcm93ID0gLTE7CgkJc2VsZi0+ZXhlY19lbmRfcm93 ID0gLTE7CgkJc2VsZi0+ZXhlY19jdXJyZW50X3JvdyA9IC0xOwoJfQp9CgoKaW50CnN0YXRl bWVudF90eXBlKGNvbnN0IGNoYXIgKnN0YXRlbWVudCkKewoJaW50CQkJaTsKCgkvKiBpZ25v cmUgbGVhZGluZyB3aGl0ZXNwYWNlIGluIHF1ZXJ5IHN0cmluZyAqLwoJd2hpbGUgKCpzdGF0 ZW1lbnQgJiYgKGlzc3BhY2UoKFVDSEFSKSAqc3RhdGVtZW50KSB8fCAqc3RhdGVtZW50ID09 ICcoJykpCgkJc3RhdGVtZW50Kys7CgoJZm9yIChpID0gMDsgU3RhdGVtZW50X1R5cGVbaV0u czsgaSsrKQoJCWlmICghc3RybmljbXAoc3RhdGVtZW50LCBTdGF0ZW1lbnRfVHlwZVtpXS5z LCBzdHJsZW4oU3RhdGVtZW50X1R5cGVbaV0ucykpKQoJCQlyZXR1cm4gU3RhdGVtZW50X1R5 cGVbaV0udHlwZTsKCglyZXR1cm4gU1RNVF9UWVBFX09USEVSOwp9Cgp2b2lkClNDX3NldF9w bGFubmFtZShTdGF0ZW1lbnRDbGFzcyAqc3RtdCwgY29uc3QgY2hhciAqcGxhbl9uYW1lKQp7 CglpZiAoc3RtdC0+cGxhbl9uYW1lKQoJCWZyZWUoc3RtdC0+cGxhbl9uYW1lKTsKCWlmIChw bGFuX25hbWUgJiYgcGxhbl9uYW1lWzBdKQoJCXN0bXQtPnBsYW5fbmFtZSA9IHN0cmR1cChw bGFuX25hbWUpOwoJZWxzZQoJCXN0bXQtPnBsYW5fbmFtZSA9IE5VTEw7Cn0KCnZvaWQKU0Nf c2V0X3Jvd3NldF9zdGFydChTdGF0ZW1lbnRDbGFzcyAqc3RtdCwgU1FMTEVOIHN0YXJ0LCBC T09MIHZhbGlkX2Jhc2UpCnsKCVFSZXN1bHRDbGFzcwkqcmVzID0gU0NfZ2V0X0N1cnJlcyhz dG10KTsKCVNRTExFTgkJaW5jciA9IHN0YXJ0IC0gc3RtdC0+cm93c2V0X3N0YXJ0OwoKTVlM T0coREVUQUlMX0xPR19MRVZFTCwgIiVwLT5TQ19zZXRfcm93c3RhcnQgIiBGT1JNQVRfTEVO ICItPiIgRk9STUFUX0xFTiAiKCVzKSAiLCBzdG10LCBzdG10LT5yb3dzZXRfc3RhcnQsIHN0 YXJ0LCB2YWxpZF9iYXNlID8gInZhbGlkIiA6ICJ1bmtub3duIik7CglpZiAocmVzICE9IE5V TEwpCgl7CgkJQk9PTAl2YWxpZCA9IFFSX2hhc192YWxpZF9iYXNlKHJlcyk7Ck1ZUFJJTlRG KERFVEFJTF9MT0dfTEVWRUwsICI6KCVwKVFSIGlzICVzIiwgcmVzLCBRUl9oYXNfdmFsaWRf YmFzZShyZXMpID8gInZhbGlkIiA6ICJ1bmtub3duIik7CgoJCWlmICh2YWxpZCkKCQl7CgkJ CWlmICh2YWxpZF9iYXNlKQoJCQkJUVJfaW5jX3Jvd3N0YXJ0X2luX2NhY2hlKHJlcywgaW5j cik7CgkJCWVsc2UKCQkJCVFSX3NldF9ub192YWxpZF9iYXNlKHJlcyk7CgkJfQoJCWVsc2Ug aWYgKHZhbGlkX2Jhc2UpCgkJewoJCQlRUl9zZXRfaGFzX3ZhbGlkX2Jhc2UocmVzKTsKCQkJ aWYgKHN0YXJ0IDwgMCkKCQkJCVFSX3NldF9yb3dzdGFydF9pbl9jYWNoZShyZXMsIC0xKTsK CQkJZWxzZQoJCQkJUVJfc2V0X3Jvd3N0YXJ0X2luX2NhY2hlKHJlcywgc3RhcnQpOwoJCX0K CQlpZiAoIVFSX2dldF9jdXJzb3IocmVzKSkKCQkJcmVzLT5rZXlfYmFzZSA9IHN0YXJ0OwpN WVBSSU5URihERVRBSUxfTE9HX0xFVkVMLCAiOiglcClRUiByZXN1bHQ9IiBGT1JNQVRfTEVO ICIoJXMpIiwgcmVzLCBRUl9nZXRfcm93c3RhcnRfaW5fY2FjaGUocmVzKSwgUVJfaGFzX3Zh bGlkX2Jhc2UocmVzKSA/ICJ2YWxpZCIgOiAidW5rbm93biIpOwoJfQoJc3RtdC0+cm93c2V0 X3N0YXJ0ID0gc3RhcnQ7Ck1ZUFJJTlRGKERFVEFJTF9MT0dfTEVWRUwsICI6c3RtdCByZXN1 bHQ9IiBGT1JNQVRfTEVOICJcbiIsIHN0bXQtPnJvd3NldF9zdGFydCk7Cn0Kdm9pZApTQ19p bmNfcm93c2V0X3N0YXJ0KFN0YXRlbWVudENsYXNzICpzdG10LCBTUUxMRU4gaW5jKQp7CglT UUxMRU4Jc3RhcnQgPSBzdG10LT5yb3dzZXRfc3RhcnQgKyBpbmM7CgoJU0Nfc2V0X3Jvd3Nl dF9zdGFydChzdG10LCBzdGFydCwgVFJVRSk7Cn0KaW50ClNDX3NldF9jdXJyZW50X2NvbChT dGF0ZW1lbnRDbGFzcyAqc3RtdCwgaW50IGNvbCkKewoJaWYgKGNvbCA9PSBzdG10LT5jdXJy ZW50X2NvbCkKCQlyZXR1cm4gY29sOwoJaWYgKGNvbCA+PSAwKQoJCXJlc2V0X2FfZ2V0ZGF0 YV9pbmZvKFNDX2dldF9HRFRJKHN0bXQpLCBjb2wgKyAxKTsKCXN0bXQtPmN1cnJlbnRfY29s ID0gY29sOwoKCXJldHVybiBzdG10LT5jdXJyZW50X2NvbDsKfQoKdm9pZApTQ19zZXRfcHJl cGFyZWQoU3RhdGVtZW50Q2xhc3MgKnN0bXQsIGludCBwcmVwYXJlZCkKewoJaWYgKHByZXBh cmVkID09IHN0bXQtPnByZXBhcmVkKQoJCTsKCWVsc2UgaWYgKE5PVF9ZRVRfUFJFUEFSRUQg PT0gcHJlcGFyZWQgJiYgUFJFUEFSRURfUEVSTUFORU5UTFkgPT0gc3RtdC0+cHJlcGFyZWQp Cgl7CgkJQ29ubmVjdGlvbkNsYXNzICpjb25uID0gU0NfZ2V0X2Nvbm4oc3RtdCk7CgoJCWlm IChjb25uKQoJCXsKCQkJRU5URVJfQ09OTl9DUyhjb25uKTsKCQkJaWYgKENPTk5fQ09OTkVD VEVEID09IGNvbm4tPnN0YXR1cykKCQkJewoJCQkJaWYgKENDX2lzX2luX2Vycm9yX3RyYW5z KGNvbm4pKQoJCQkJewoJCQkJCUNDX21hcmtfYV9vYmplY3RfdG9fZGlzY2FyZChjb25uLCAn cycsICBzdG10LT5wbGFuX25hbWUpOwoJCQkJfQoJCQkJZWxzZQoJCQkJewoJCQkJCVFSZXN1 bHRDbGFzcwkqcmVzOwoJCQkJCWNoYXIgZGVhbGxvY19zdG10WzEyOF07CgoJCQkJCVNQUklO VEZfRklYRUQoZGVhbGxvY19zdG10LCAiREVBTExPQ0FURSBcIiVzXCIiLCBzdG10LT5wbGFu X25hbWUpOwoJCQkJCXJlcyA9IENDX3NlbmRfcXVlcnkoY29ubiwgZGVhbGxvY19zdG10LCBO VUxMLCBJR05PUkVfQUJPUlRfT05fQ09OTiB8IFJPTExCQUNLX09OX0VSUk9SLCBOVUxMKTsK CQkJCQlRUl9EZXN0cnVjdG9yKHJlcyk7CgkJCQl9CgkJCX0KCQkJTEVBVkVfQ09OTl9DUyhj b25uKTsKCQl9Cgl9CglpZiAoTk9UX1lFVF9QUkVQQVJFRCA9PSBwcmVwYXJlZCkKCQlTQ19z ZXRfcGxhbm5hbWUoc3RtdCwgTlVMTCk7CglzdG10LT5wcmVwYXJlZCA9IHByZXBhcmVkOwp9 CgovKgogKiBJbml0aWFsaXplIHN0bXRfd2l0aF9wYXJhbXMgYW5kIGxvYWRfc3RhdGVtZW50 IG1lbWJlciBwb2ludGVyCiAqIGRlYWxsb2NhdGluZyBjb3JyZXNwb25kaW5nIHByZXBhcmVk IHBsYW4uIEFsc28gaW5pdGlhbGl6ZQogKiBzdGF0ZW1lbnQgbWVtYmVyIHBvaW50ZXIgaWYg c3BlY2lmaWVkLgogKi8KUkVUQ09ERQpTQ19pbml0aWFsaXplX3N0bXRzKFN0YXRlbWVudENs YXNzICpzZWxmLCBCT09MIGluaXRpYWxpemVPcmlnaW5hbCkKewoJUHJvY2Vzc2VkU3RtdCAq cHN0bXQ7CglQcm9jZXNzZWRTdG10ICpuZXh0X3BzdG10OwoJQ29ubmVjdGlvbkNsYXNzICpj b25uID0gU0NfZ2V0X2Nvbm4oc2VsZik7CgoJaWYgKHNlbGYtPmxvY2tfQ0NfZm9yX3JiKQoJ ewoJCWlmIChjb25uKQoJCQlMRUFWRV9DT05OX0NTKGNvbm4pOwoJCXNlbGYtPmxvY2tfQ0Nf Zm9yX3JiID0gRkFMU0U7Cgl9CglpZiAoaW5pdGlhbGl6ZU9yaWdpbmFsKQoJewoJCWlmIChz ZWxmLT5zdGF0ZW1lbnQpCgkJewoJCQlmcmVlKHNlbGYtPnN0YXRlbWVudCk7CgkJCXNlbGYt PnN0YXRlbWVudCA9IE5VTEw7CgkJfQoKCQlwc3RtdCA9IHNlbGYtPnByb2Nlc3NlZF9zdGF0 ZW1lbnRzOwoJCXdoaWxlIChwc3RtdCkKCQl7CgkJCWlmIChwc3RtdC0+cXVlcnkpCgkJCQlm cmVlKHBzdG10LT5xdWVyeSk7CgkJCW5leHRfcHN0bXQgPSBwc3RtdC0+bmV4dDsKCQkJZnJl ZShwc3RtdCk7CgkJCXBzdG10ID0gbmV4dF9wc3RtdDsKCQl9CgkJc2VsZi0+cHJvY2Vzc2Vk X3N0YXRlbWVudHMgPSBOVUxMOwoKCQlzZWxmLT5wcmVwYXJlID0gTk9OX1BSRVBBUkVfU1RB VEVNRU5UOwoJCVNDX3NldF9wcmVwYXJlZChzZWxmLCBOT1RfWUVUX1BSRVBBUkVEKTsKCQlz ZWxmLT5zdGF0ZW1lbnRfdHlwZSA9IFNUTVRfVFlQRV9VTktOT1dOOyAvKiB1bmtub3duICov CgkJc2VsZi0+bXVsdGlfc3RhdGVtZW50ID0gLTE7IC8qIHVua25vd24gKi8KCQlzZWxmLT5u dW1fcGFyYW1zID0gLTE7IC8qIHVua25vd24gKi8KCQlzZWxmLT5wcm9jX3JldHVybiA9IC0x OyAvKiB1bmtub3duICovCgkJc2VsZi0+am9pbl9pbmZvID0gMDsKCQlTQ19pbml0X3BhcnNl X21ldGhvZChzZWxmKTsKCQlTQ19pbml0X2Rpc2NhcmRfb3V0cHV0X3BhcmFtcyhzZWxmKTsK CQlpZiAoY29ubikKCQkJc2VsZi0+dXNlX3NlcnZlcl9zaWRlX3ByZXBhcmUgPSBjb25uLT5j b25uSW5mby51c2Vfc2VydmVyX3NpZGVfcHJlcGFyZTsKCX0KCWlmIChzZWxmLT5zdG10X3dp dGhfcGFyYW1zKQoJewoJCWZyZWUoc2VsZi0+c3RtdF93aXRoX3BhcmFtcyk7CgkJc2VsZi0+ c3RtdF93aXRoX3BhcmFtcyA9IE5VTEw7Cgl9CglpZiAoc2VsZi0+bG9hZF9zdGF0ZW1lbnQp Cgl7CgkJZnJlZShzZWxmLT5sb2FkX3N0YXRlbWVudCk7CgkJc2VsZi0+bG9hZF9zdGF0ZW1l bnQgPSBOVUxMOwoJfQoJc2VsZi0+aGFzX25vdGljZSA9IDA7CgoJcmV0dXJuIDA7Cn0KCkJP T0wJU0Nfb3BlbmNoZWNrKFN0YXRlbWVudENsYXNzICpzZWxmLCBjb25zdCBjaGFyICpmdW5j KQp7CglRUmVzdWx0Q2xhc3MJKnJlczsKCglpZiAoIXNlbGYpCgkJcmV0dXJuIEZBTFNFOwoJ aWYgKHNlbGYtPnN0YXR1cyA9PSBTVE1UX0VYRUNVVElORykKCXsKCQlTQ19zZXRfZXJyb3Io c2VsZiwgU1RNVF9TRVFVRU5DRV9FUlJPUiwgIlN0YXRlbWVudCBpcyBjdXJyZW50bHkgZXhl Y3V0aW5nIGEgdHJhbnNhY3Rpb24uIiwgZnVuYyk7CgkJcmV0dXJuIFRSVUU7Cgl9CgkvKgoJ ICogV2UgY2FuIGRpc3Bvc2UgdGhlIHJlc3VsdCBvZiBEZXNjcmliZS1vbmx5IGFueSB0aW1l LgoJICovCglpZiAoc2VsZi0+cHJlcGFyZSAmJiBzZWxmLT5zdGF0dXMgPT0gU1RNVF9ERVND UklCRUQpCgl7CgkJTVlMT0coMCwgInNlbGYtPnByZXBhcmUgJiYgc2VsZi0+c3RhdHVzID09 IFNUTVRfREVTQ1JJQkVEXG4iKTsKCQlyZXR1cm4gRkFMU0U7Cgl9CglpZiAocmVzID0gU0Nf Z2V0X0N1cnJlcyhzZWxmKSwgTlVMTCAhPSByZXMpCgl7CgkJaWYgKFFSX2NvbW1hbmRfbWF5 YmVfc3VjY2Vzc2Z1bChyZXMpICYmIHJlcy0+YmFja2VuZF90dXBsZXMpCgkJewoJCQlTQ19z ZXRfZXJyb3Ioc2VsZiwgU1RNVF9TRVFVRU5DRV9FUlJPUiwgIlRoZSBjdXJzb3IgaXMgb3Bl bi4iLCBmdW5jKTsKCQkJcmV0dXJuIFRSVUU7CgkJfQoJfQoKCXJldHVybglGQUxTRTsKfQoK UkVUQ09ERQpTQ19pbml0aWFsaXplX2FuZF9yZWN5Y2xlKFN0YXRlbWVudENsYXNzICpzZWxm KQp7CglTQ19pbml0aWFsaXplX3N0bXRzKHNlbGYsIFRSVUUpOwoJaWYgKCFTQ19yZWN5Y2xl X3N0YXRlbWVudChzZWxmKSkKCQlyZXR1cm4gU1FMX0VSUk9SOwoKCXJldHVybiBTUUxfU1VD Q0VTUzsKfQoKdm9pZApTQ19yZXNldF9yZXN1bHRfZm9yX3JlcnVuKFN0YXRlbWVudENsYXNz ICpzZWxmKQp7CglRUmVzdWx0Q2xhc3MJKnJlczsKCUNvbHVtbkluZm9DbGFzcwkqZmxkczsK CglpZiAoIXNlbGYpCXJldHVybjsKCWlmIChyZXMgPSBTQ19nZXRfUmVzdWx0KHNlbGYpLCBO VUxMID09IHJlcykKCQlyZXR1cm47CglmbGRzID0gUVJfZ2V0X2ZpZWxkcyhyZXMpOwoJaWYg KE5VTEwgPT0gZmxkcyB8fAoJICAgIDAgPT0gQ0lfZ2V0X251bV9maWVsZHMoZmxkcykpCgkJ U0Nfc2V0X1Jlc3VsdChzZWxmLCBOVUxMKTsKCWVsc2UKCXsKCQlRUl9yZXNldF9mb3JfcmVf ZXhlY3V0ZShyZXMpOwoJCVNDX3NldF9DdXJyZXMoc2VsZiwgTlVMTCk7Cgl9Cn0KCi8qCiAq CUNhbGxlZCBmcm9tIFNRTFByZXBhcmUgaWYgU1RNVF9QUkVNQVRVUkUsIG9yCiAqCWZyb20g U1FMRXhlY3V0ZSBpZiBTVE1UX0ZJTklTSEVELCBvcgogKglmcm9tIFNRTEZyZWVTdG10KFNR TF9DTE9TRSkKICovCmNoYXIKU0NfcmVjeWNsZV9zdGF0ZW1lbnQoU3RhdGVtZW50Q2xhc3Mg KnNlbGYpCnsKCUNTVFIJZnVuYyA9ICJTQ19yZWN5Y2xlX3N0YXRlbWVudCI7CglDb25uZWN0 aW9uQ2xhc3MgKmNvbm47CgoJTVlMT0coMCwgImVudGVyaW5nIHNlbGY9JXBcbiIsIHNlbGYp OwoKCVNDX2NsZWFyX2Vycm9yKHNlbGYpOwoJLyogVGhpcyB3b3VsZCBub3QgaGFwcGVuICov CglpZiAoc2VsZi0+c3RhdHVzID09IFNUTVRfRVhFQ1VUSU5HKQoJewoJCVNDX3NldF9lcnJv cihzZWxmLCBTVE1UX1NFUVVFTkNFX0VSUk9SLCAiU3RhdGVtZW50IGlzIGN1cnJlbnRseSBl eGVjdXRpbmcgYSB0cmFuc2FjdGlvbi4iLCBmdW5jKTsKCQlyZXR1cm4gRkFMU0U7Cgl9CgoJ aWYgKFNDX2dldF9jb25uKHNlbGYpLT51bm5hbWVkX3ByZXBhcmVkX3N0bXQgPT0gc2VsZikK CQlTQ19nZXRfY29ubihzZWxmKS0+dW5uYW1lZF9wcmVwYXJlZF9zdG10ID0gTlVMTDsKCglj b25uID0gU0NfZ2V0X2Nvbm4oc2VsZik7Cglzd2l0Y2ggKHNlbGYtPnN0YXR1cykKCXsKCQlj YXNlIFNUTVRfQUxMT0NBVEVEOgoJCQkvKiB0aGlzIHN0YXRlbWVudCBkb2VzIG5vdCBuZWVk IHRvIGJlIHJlY3ljbGVkICovCgkJCXJldHVybiBUUlVFOwoKCQljYXNlIFNUTVRfUkVBRFk6 CgkJCWJyZWFrOwoKCQljYXNlIFNUTVRfREVTQ1JJQkVEOgoJCQlicmVhazsKCgkJY2FzZSBT VE1UX0ZJTklTSEVEOgoJCQlicmVhazsKCgkJZGVmYXVsdDoKCQkJU0Nfc2V0X2Vycm9yKHNl bGYsIFNUTVRfSU5URVJOQUxfRVJST1IsICJBbiBpbnRlcm5hbCBlcnJvciBvY2N1cmVkIHdo aWxlIHJlY3ljbGluZyBzdGF0ZW1lbnRzIiwgZnVuYyk7CgkJCXJldHVybiBGQUxTRTsKCX0K Cglzd2l0Y2ggKHNlbGYtPnByZXBhcmVkKQoJewoJCWNhc2UgTk9UX1lFVF9QUkVQQVJFRDoK CQljYXNlIFBSRVBBUkVEX1RFTVBPUkFSSUxZOgoJCQkvKiBGcmVlIHRoZSBwYXJzZWQgdGFi bGUvZmllbGQgaW5mb3JtYXRpb24gKi8KCQkJU0NfaW5pdGlhbGl6ZV9jb2xzX2luZm8oc2Vs ZiwgVFJVRSwgVFJVRSk7CgpNWUxPRyhERVRBSUxfTE9HX0xFVkVMLCAiU0NfY2xlYXJfcGFy c2Vfc3RhdHVzXG4iKTsKCQkJU0NfY2xlYXJfcGFyc2Vfc3RhdHVzKHNlbGYsIGNvbm4pOwoJ CQlicmVhazsKCX0KCgkvKiBGcmVlIGFueSBjdXJzb3JzICovCglpZiAoU0NfZ2V0X1Jlc3Vs dChzZWxmKSkKCQlTQ19zZXRfUmVzdWx0KHNlbGYsIE5VTEwpOwoJUVJfRGVzdHJ1Y3Rvcihz ZWxmLT5wYXJzZWQpOwoJc2VsZi0+cGFyc2VkID0gTlVMTDsKCXNlbGYtPm1pc2NpbmZvID0g MDsKCXNlbGYtPmV4ZWNpbmZvID0gMDsKCS8qIHNlbGYtPnJib25lcnIgPSAwOyBOZXZlciBj bGVhciB0aGUgYml0cyBoZXJlICovCgoJLyoKCSAqIFJlc2V0IG9ubHkgcGFyYW1ldGVycyB0 aGF0IGhhdmUgYW55dGhpbmcgdG8gZG8gd2l0aCByZXN1bHRzCgkgKi8KCXNlbGYtPnN0YXR1 cyA9IFNUTVRfUkVBRFk7CglzZWxmLT5jYXRhbG9nX3Jlc3VsdCA9IEZBTFNFOwkvKiBub3Qg dmVyeSBpbXBvcnRhbnQgKi8KCglzZWxmLT5jdXJyVHVwbGUgPSAtMTsKCVNDX3NldF9yb3dz ZXRfc3RhcnQoc2VsZiwgLTEsIEZBTFNFKTsKCVNDX3NldF9jdXJyZW50X2NvbChzZWxmLCAt MSk7CglzZWxmLT5iaW5kX3JvdyA9IDA7Ck1ZTE9HKERFVEFJTF9MT0dfTEVWRUwsICJzdGF0 ZW1lbnQ9JXAgb21taXR0ZWQ9MFxuIiwgc2VsZik7CglzZWxmLT5sYXN0X2ZldGNoX2NvdW50 ID0gc2VsZi0+bGFzdF9mZXRjaF9jb3VudF9pbmNsdWRlX29tbWl0dGVkID0gMDsKCglzZWxm LT5fX2Vycm9yX21lc3NhZ2UgPSBOVUxMOwoJc2VsZi0+X19lcnJvcl9udW1iZXIgPSAwOwoK CXNlbGYtPmxvYmpfZmQgPSAtMTsKCglTQ19mcmVlX3BhcmFtcyhzZWxmLCBTVE1UX0ZSRUVf UEFSQU1TX0RBVEFfQVRfRVhFQ19PTkxZKTsKCVNDX2luaXRpYWxpemVfc3RtdHMoc2VsZiwg RkFMU0UpOwoJY2FuY2VsTmVlZERhdGFTdGF0ZShzZWxmKTsKCXNlbGYtPmNhbmNlbF9pbmZv ID0gMDsKCS8qCgkgKglyZXNldCB0aGUgY3VycmVudCBhdHRyIHNldHRpbmcgdG8gdGhlIG9y aWdpbmFsIG9uZS4KCSAqLwoJc2VsZi0+b3B0aW9ucy5zY3JvbGxfY29uY3VycmVuY3kgPSBz ZWxmLT5vcHRpb25zX29yaWcuc2Nyb2xsX2NvbmN1cnJlbmN5OwoJc2VsZi0+b3B0aW9ucy5j dXJzb3JfdHlwZSA9IHNlbGYtPm9wdGlvbnNfb3JpZy5jdXJzb3JfdHlwZTsKCXNlbGYtPm9w dGlvbnMua2V5c2V0X3NpemUgPSBzZWxmLT5vcHRpb25zX29yaWcua2V5c2V0X3NpemU7Cglz ZWxmLT5vcHRpb25zLm1heExlbmd0aCA9IHNlbGYtPm9wdGlvbnNfb3JpZy5tYXhMZW5ndGg7 CglzZWxmLT5vcHRpb25zLm1heFJvd3MgPSBzZWxmLT5vcHRpb25zX29yaWcubWF4Um93czsK CglyZXR1cm4gVFJVRTsKfQoKLyoKICoJU2NhbiB0aGUgcXVlcnkgd2hvbGx5IG9yIHBhcnRp YWxseSAoaWYgdGhlIG5leHRfY21kIHBhcmFtIHNwZWNpZmllZCkuCiAqCUFsc28gY291bnQg dGhlIG51bWJlciBvZiBwYXJhbWV0ZXJzIHJlc3BlY3R2aWVseS4KICovCnZvaWQKU0Nfc2Nh blF1ZXJ5QW5kQ291bnRQYXJhbXMoY29uc3QgY2hhciAqcXVlcnksIGNvbnN0IENvbm5lY3Rp b25DbGFzcyAqY29ubiwKCQlzc2l6ZV90ICpuZXh0X2NtZCwgU1FMU01BTExJTlQgKiBwY3Bh ciwKCQlwb19pbmRfdCAqbXVsdGlfc3QsIHBvX2luZF90ICpwcm9jX3JldHVybikKewoJY29u c3QJY2hhciAqdHN0ciwgKnRhZyA9IE5VTEw7CglzaXplX3QJdGFnbGVuID0gMDsKCWNoYXIJ dGNoYXIsIGJjaGFyLCBlc2NhcGVfaW5fbGl0ZXJhbCA9ICdcMCc7CgljaGFyCWluX2xpdGVy YWwgPSBGQUxTRSwgaW5faWRlbnRfa2V5d29yZCA9IEZBTFNFLAoJCWluX2RxdW90ZV9pZGVu dGlmaWVyID0gRkFMU0UsCgkJaW5fZG9sbGFyX3F1b3RlID0gRkFMU0UsIGluX2VzY2FwZSA9 IEZBTFNFLAoJCWluX2xpbmVfY29tbWVudCA9IEZBTFNFLCBkZWxfZm91bmQgPSBGQUxTRTsK CWludAljb21tZW50X2xldmVsID0gMDsKCXBvX2luZF90IG11bHRpID0gRkFMU0U7CglTUUxT TUFMTElOVAludW1fcDsKCWVuY29kZWRfc3RyCWVuY3N0cjsKCglNWUxPRygwLCAiZW50ZXJp bmcuLi5cbiIpOwoJbnVtX3AgPSAwOwoJaWYgKHByb2NfcmV0dXJuKQoJCSpwcm9jX3JldHVy biA9IDA7CglpZiAobmV4dF9jbWQpCgkJKm5leHRfY21kID0gLTE7Cgl0c3RyID0gcXVlcnk7 CgltYWtlX2VuY29kZWRfc3RyKCZlbmNzdHIsIGNvbm4sIHRzdHIpOwoJZm9yIChiY2hhciA9 ICdcMCcsIHRjaGFyID0gZW5jb2RlZF9uZXh0Y2hhcigmZW5jc3RyKTsgdGNoYXI7IHRjaGFy ID0gZW5jb2RlZF9uZXh0Y2hhcigmZW5jc3RyKSkKCXsKCQlpZiAoTUJDU19OT05fQVNDSUko ZW5jc3RyKSkgLyogbXVsdGlieXRlIGNoYXIgKi8KCQl7CgkJCWlmICgoVUNIQVIpIHRjaGFy ID49IDB4ODApCgkJCQliY2hhciA9IHRjaGFyOwoJCQlpZiAoaW5fZHF1b3RlX2lkZW50aWZp ZXIgfHwKCQkJICAgIGluX2xpdGVyYWwgfHwKCQkJICAgIGluX2RvbGxhcl9xdW90ZSB8fAoJ CQkgICAgaW5fZXNjYXBlIHx8CgkJCSAgICBpbl9saW5lX2NvbW1lbnQgfHwKCQkJICAgIGNv bW1lbnRfbGV2ZWwgPiAwKQoJCQkJOwoJCQllbHNlCgkJCQlpbl9pZGVudF9rZXl3b3JkID0g VFJVRTsKCgkJCWNvbnRpbnVlOwoJCX0KCQlpZiAoIW11bHRpICYmIGRlbF9mb3VuZCkKCQl7 CgkJCWlmIChJU19OT1RfU1BBQ0UodGNoYXIpKQoJCQl7CgkJCQltdWx0aSA9IFRSVUU7CgkJ CQlpZiAobmV4dF9jbWQpCgkJCQkJYnJlYWs7CgkJCX0KCQl9CgkJaWYgKGluX2lkZW50X2tl eXdvcmQpCgkJewoJCQlpZiAoaXNhbG51bSh0Y2hhcikgfHwKCQkJICAgIERPTExBUl9RVU9U RSA9PSB0Y2hhciB8fAoJCQkgICAgJ18nID09IHRjaGFyKQoJCQl7CgkJCQliY2hhciA9IHRj aGFyOwoJCQkJY29udGludWU7CgkJCX0KCQkJaW5faWRlbnRfa2V5d29yZCA9IEZBTFNFOwoJ CX0KCgkJaWYgKGluX2RvbGxhcl9xdW90ZSkKCQl7CgkJCWlmICh0Y2hhciA9PSBET0xMQVJf UVVPVEUpCgkJCXsKCQkJCWlmIChzdHJuY21wKChjb25zdCBjaGFyICopIEVOQ09ERV9QVFIo ZW5jc3RyKSwgdGFnLCB0YWdsZW4pID09IDApCgkJCQl7CgkJCQkJaW5fZG9sbGFyX3F1b3Rl ID0gRkFMU0U7CgkJCQkJdGFnID0gTlVMTDsKCQkJCQllbmNvZGVkX3Bvc2l0aW9uX3NoaWZ0 KCZlbmNzdHIsIHRhZ2xlbiAtIDEpOwoJCQkJfQoJCQl9CgkJfQoJCWVsc2UgaWYgKGluX2xp dGVyYWwpCgkJewoJCQlpZiAoaW5fZXNjYXBlKQoJCQkJaW5fZXNjYXBlID0gRkFMU0U7CgkJ CWVsc2UgaWYgKHRjaGFyID09IGVzY2FwZV9pbl9saXRlcmFsKQoJCQkJaW5fZXNjYXBlID0g VFJVRTsKCQkJZWxzZSBpZiAodGNoYXIgPT0gTElURVJBTF9RVU9URSkKCQkJCWluX2xpdGVy YWwgPSBGQUxTRTsKCQl9CgkJZWxzZSBpZiAoaW5fZHF1b3RlX2lkZW50aWZpZXIpCgkJewoJ CQlpZiAodGNoYXIgPT0gSURFTlRJRklFUl9RVU9URSkKCQkJCWluX2RxdW90ZV9pZGVudGlm aWVyID0gRkFMU0U7CgkJfQoJCWVsc2UgaWYgKGluX2xpbmVfY29tbWVudCkKCQl7CgkJCWlm IChQR19MSU5FRkVFRCA9PSB0Y2hhcikKCQkJCWluX2xpbmVfY29tbWVudCA9IEZBTFNFOwoJ CX0KCQllbHNlIGlmIChjb21tZW50X2xldmVsID4gMCkKCQl7CgkJCWlmICgnLycgPT0gdGNo YXIgJiYgJyonID09IEVOQ09ERV9QVFIoZW5jc3RyKVsxXSkKCQkJewoJCQkJdGNoYXIgPSBl bmNvZGVkX25leHRjaGFyKCZlbmNzdHIpOwoJCQkJY29tbWVudF9sZXZlbCsrOwoJCQl9CgkJ CWVsc2UgaWYgKCcqJyA9PSB0Y2hhciAmJiAnLycgPT0gRU5DT0RFX1BUUihlbmNzdHIpWzFd KQoJCQl7CgkJCQl0Y2hhciA9IGVuY29kZWRfbmV4dGNoYXIoJmVuY3N0cik7CgkJCQljb21t ZW50X2xldmVsLS07CgkJCX0KCQl9CgkJZWxzZSBpZiAoaXNhbG51bSh0Y2hhcikpCgkJCWlu X2lkZW50X2tleXdvcmQgPSBUUlVFOwoJCWVsc2UKCQl7CgkJCWlmICh0Y2hhciA9PSAnPycp CgkJCXsKCQkJCWlmICgwID09IG51bV9wICYmIGJjaGFyID09ICd7JykKCQkJCXsKCQkJCQlp ZiAocHJvY19yZXR1cm4pCgkJCQkJCSpwcm9jX3JldHVybiA9IDE7CgkJCQl9CgkJCQludW1f cCsrOwoJCQl9CgkJCWVsc2UgaWYgKHRjaGFyID09ICc7JykKCQkJewoJCQkJZGVsX2ZvdW5k ID0gVFJVRTsKCQkJCWlmIChuZXh0X2NtZCkKCQkJCQkqbmV4dF9jbWQgPSBlbmNzdHIucG9z OwoJCQl9CgkJCWVsc2UgaWYgKHRjaGFyID09IERPTExBUl9RVU9URSkKCQkJewoJCQkJY29u c3QgY2hhciAqcHRyID0gKGNvbnN0IGNoYXIgKikgRU5DT0RFX1BUUihlbmNzdHIpOwoJCQkJ dGFnbGVuID0gZmluZFRhZyhwdHIsIGVuY3N0ci5jY3NjKTsKCQkJCWlmICh0YWdsZW4gPiAw KQoJCQkJewoJCQkJCWluX2RvbGxhcl9xdW90ZSA9IFRSVUU7CgkJCQkJdGFnID0gcHRyOwoJ CQkJCWVuY29kZWRfcG9zaXRpb25fc2hpZnQoJmVuY3N0ciwgdGFnbGVuIC0gMSk7CgkJCQl9 CgkJCX0KCQkJZWxzZSBpZiAodGNoYXIgPT0gTElURVJBTF9RVU9URSkKCQkJewoJCQkJaW5f bGl0ZXJhbCA9IFRSVUU7CgkJCQllc2NhcGVfaW5fbGl0ZXJhbCA9IENDX2dldF9lc2NhcGUo Y29ubik7CgkJCQlpZiAoIWVzY2FwZV9pbl9saXRlcmFsKQoJCQkJewoJCQkJCWlmIChMSVRF UkFMX0VYVCA9PSBFTkNPREVfUFRSKGVuY3N0cilbLTFdKQoJCQkJCQllc2NhcGVfaW5fbGl0 ZXJhbCA9IEVTQ0FQRV9JTl9MSVRFUkFMOwoJCQkJfQoJCQl9CgkJCWVsc2UgaWYgKHRjaGFy ID09IElERU5USUZJRVJfUVVPVEUpCgkJCQlpbl9kcXVvdGVfaWRlbnRpZmllciA9IFRSVUU7 CgkJCWVsc2UgaWYgKCctJyA9PSB0Y2hhcikKCQkJewoJCQkJaWYgKCctJyA9PSBFTkNPREVf UFRSKGVuY3N0cilbMV0pCgkJCQl7CgkJCQkJdGNoYXIgPSBlbmNvZGVkX25leHRjaGFyKCZl bmNzdHIpOwoJCQkJCWluX2xpbmVfY29tbWVudCA9IFRSVUU7CgkJCQl9CgkJCX0KCQkJZWxz ZSBpZiAoJy8nID09IHRjaGFyKQoJCQl7CgkJCQlpZiAoJyonID09IEVOQ09ERV9QVFIoZW5j c3RyKVsxXSkKCQkJCXsKCQkJCQl0Y2hhciA9IGVuY29kZWRfbmV4dGNoYXIoJmVuY3N0cik7 CgkJCQkJY29tbWVudF9sZXZlbCsrOwoJCQkJfQoJCQl9CgkJCWlmIChJU19OT1RfU1BBQ0Uo dGNoYXIpKQoJCQkJYmNoYXIgPSB0Y2hhcjsKCQl9Cgl9CglpZiAocGNwYXIpCgkJKnBjcGFy ID0gbnVtX3A7CglpZiAobXVsdGlfc3QpCgkJKm11bHRpX3N0ID0gbXVsdGk7CgoJTVlMT0co MCwgImxlYXZpbmcuLi5udW1fcD0lZCBtdWx0aT0lZFxuIiwgbnVtX3AsIG11bHRpKTsKfQoK LyoKICogRGVzY3JpYmUgdGhlIHJlc3VsdCBzZXQgYSBzdGF0ZW1lbnQgd2lsbCBwcm9kdWNl IChmb3IKICogU1FMUHJlcGFyZS9TUUxEZXNjcmliZUNvbCkKICoKICogcmV0dXJucyAjIG9m IGZpZWxkcyBpZiBzdWNjZXNzZnVsLCAtMSBvbiBlcnJvci4KICovCkludDQKU0NfZGVzY3Jp YmUoU3RhdGVtZW50Q2xhc3MgKnNlbGYpCnsKCUludDQJCW51bV9maWVsZHMgPSAtMTsKCVFS ZXN1bHRDbGFzcwkqcmVzOwoJTVlMT0coMCwgImVudGVyaW5nIHN0YXR1cyA9ICVkXG4iLCBz ZWxmLT5zdGF0dXMpOwoKCXJlcyA9IFNDX2dldF9FeGVjZE9yUGFyc2VkKHNlbGYpOwoJaWYg KE5VTEwgIT0gcmVzKQoJewoJCW51bV9maWVsZHMgPSBRUl9OdW1SZXN1bHRDb2xzKHJlcyk7 CgkJaWYgKG51bV9maWVsZHMgPiAwIHx8CgkJICAgIE5VTEwgIT0gUVJfZ2V0X2NvbW1hbmQo cmVzKSkKCQkJcmV0dXJuIG51bV9maWVsZHM7Cgl9CglpZiAoc2VsZi0+c3RhdHVzID09IFNU TVRfUkVBRFkpCgl7Ck1ZTE9HKDAsICIgICAgICAgICAgICAgIHByZXByb2Nlc3M6IHN0YXR1 cyA9IFJFQURZXG4iKTsKCgkJc2VsZi0+bWlzY2luZm8gPSAwOwoJCXNlbGYtPmV4ZWNpbmZv ID0gMDsKCgkJZGVjaWRlSG93VG9QcmVwYXJlKHNlbGYsIEZBTFNFKTsKCQlzd2l0Y2ggKFND X2dldF9wcmVwYXJlX21ldGhvZChzZWxmKSkKCQl7CgkJCWNhc2UgTkFNRURfUEFSU0VfUkVR VUVTVDoKCQkJY2FzZSBQQVJTRV9UT19FWEVDX09OQ0U6CgkJCQlpZiAoU1FMX1NVQ0NFU1Mg IT0gcHJlcGFyZVBhcmFtZXRlcnMoc2VsZiwgRkFMU0UpKQoJCQkJCXJldHVybiBudW1fZmll bGRzOwoJCQkJYnJlYWs7CgkJCWNhc2UgUEFSU0VfUkVRX0ZPUl9JTkZPOgoJCQkJaWYgKFNR TF9TVUNDRVNTICE9IHByZXBhcmVQYXJhbWV0ZXJzKHNlbGYsIEZBTFNFKSkKCQkJCQlyZXR1 cm4gbnVtX2ZpZWxkczsKCQkJCXNlbGYtPnN0YXR1cyA9IFNUTVRfREVTQ1JJQkVEOwoJCQkJ YnJlYWs7CgkJCWRlZmF1bHQ6CgkJCQlpZiAoU1FMX1NVQ0NFU1MgIT0gcHJlcGFyZVBhcmFt ZXRlcnMoc2VsZiwgVFJVRSkpCgkJCQkJcmV0dXJuIG51bV9maWVsZHM7CgkJCQlzZWxmLT5z dGF0dXMgPSBTVE1UX0RFU0NSSUJFRDsKCQkJCWJyZWFrOwoJCX0KCQlpZiAocmVzID0gU0Nf Z2V0X0V4ZWNkT3JQYXJzZWQoc2VsZiksIE5VTEwgIT0gcmVzKQoJCXsKCQkJbnVtX2ZpZWxk cyA9IFFSX051bVJlc3VsdENvbHMocmVzKTsKCQkJcmV0dXJuIG51bV9maWVsZHM7CgkJfQoJ fQoJcmV0dXJuIG51bV9maWVsZHM7Cn0KCgovKiBUaGlzIGlzIG9ubHkgY2FsbGVkIGZyb20g U1FMRnJlZVN0bXQoU1FMX1VOQklORCkgKi8KY2hhcgpTQ191bmJpbmRfY29scyhTdGF0ZW1l bnRDbGFzcyAqc2VsZikKewoJQVJERmllbGRzCSpvcHRzID0gU0NfZ2V0X0FSREYoc2VsZik7 CglHZXREYXRhSW5mbwkqZ2RhdGEgPSBTQ19nZXRfR0RUSShzZWxmKTsKCUJpbmRJbmZvQ2xh c3MJKmJvb2ttYXJrOwoKCUFSRF91bmJpbmRfY29scyhvcHRzLCBGQUxTRSk7CglHREFUQV91 bmJpbmRfY29scyhnZGF0YSwgRkFMU0UpOwoJaWYgKGJvb2ttYXJrID0gb3B0cy0+Ym9va21h cmssIGJvb2ttYXJrICE9IE5VTEwpCgl7CgkJYm9va21hcmstPmJ1ZmZlciA9IE5VTEw7CgkJ Ym9va21hcmstPnVzZWQgPSBOVUxMOwoJfQoKCXJldHVybiAxOwp9CgoKdm9pZApTQ19jbGVh cl9lcnJvcihTdGF0ZW1lbnRDbGFzcyAqc2VsZikKewoJUVJlc3VsdENsYXNzCSpyZXM7CgoJ c2VsZi0+X19lcnJvcl9udW1iZXIgPSAwOwoJaWYgKHNlbGYtPl9fZXJyb3JfbWVzc2FnZSkK CXsKCQlmcmVlKHNlbGYtPl9fZXJyb3JfbWVzc2FnZSk7CgkJc2VsZi0+X19lcnJvcl9tZXNz YWdlID0gTlVMTDsKCX0KCWlmIChzZWxmLT5wZ2Vycm9yKQoJewoJCUVSX0Rlc3RydWN0b3Io c2VsZi0+cGdlcnJvcik7CgkJc2VsZi0+cGdlcnJvciA9IE5VTEw7Cgl9CglzZWxmLT5kaWFn X3Jvd19jb3VudCA9IDA7CglpZiAocmVzID0gU0NfZ2V0X0V4ZWNkT3JQYXJzZWQoc2VsZiks IHJlcykKCXsKCQlRUl9zZXRfbWVzc2FnZShyZXMsIE5VTEwpOwoJCVFSX3NldF9ub3RpY2Uo cmVzLCBOVUxMKTsKCQlyZXMtPnNxbHN0YXRlWzBdID0gJ1wwJzsKCX0KCXNlbGYtPnN0bXRf dGltZSA9IDA7CgltZW1zZXQoJnNlbGYtPmxvY2FsdGltZSwgMCwgc2l6ZW9mKHNlbGYtPmxv Y2FsdGltZSkpOwoJc2VsZi0+bG9jYWx0aW1lLnRtX3NlYyA9IC0xOwoJU0NfdW5yZWZfQ0Nf ZXJyb3Ioc2VsZik7Cn0KCgovKgogKglUaGlzIGZ1bmN0aW9uIGNyZWF0ZXMgYW4gZXJyb3Ig aW5mbyB3aGljaCBpcyB0aGUgY29uY2F0ZW5hdGlvbgogKglvZiB0aGUgcmVzdWx0LCBzdGF0 ZW1lbnQsIGNvbm5lY3Rpb24sIGFuZCBzb2NrZXQgbWVzc2FnZXMuCiAqLwoKLyoJTWFwIHNx bCBjb21tYW5kcyB0byBzdGF0ZW1lbnQgdHlwZXMgKi8Kc3RhdGljIGNvbnN0IHN0cnVjdAp7 CglpbnQJCW51bWJlcjsKCWNvbnN0IGNoYXIgdmVyM3N0cls2XTsKCWNvbnN0IGNoYXIgdmVy MnN0cls2XTsKfQlTdGF0ZW1lbnRfc3Fsc3RhdGVbXSA9Cgp7Cgl7IFNUTVRfRVJST1JfSU5f Uk9XLCAiMDFTMDEiLCAiMDFTMDEiIH0sCgl7IFNUTVRfT1BUSU9OX1ZBTFVFX0NIQU5HRUQs ICIwMVMwMiIsICIwMVMwMiIgfSwKCXsgU1RNVF9ST1dfVkVSU0lPTl9DSEFOR0VELCAgIjAx MDAxIiwgIjAxMDAxIiB9LCAvKiBkYXRhIGNoYW5nZWQgKi8KCXsgU1RNVF9QT1NfQkVGT1JF X1JFQ09SRFNFVCwgIjAxUzA2IiwgIjAxUzA2IiB9LAoJeyBTVE1UX1RSVU5DQVRFRCwgIjAx MDA0IiwgIjAxMDA0IiB9LCAvKiBkYXRhIHRydW5jYXRlZCAqLwoJeyBTVE1UX0lORk9fT05M WSwgIjAwMDAwIiwgIjAwMDAwIiB9LCAvKiBqdXN0IGFuIGluZm9ybWF0aW9uIHRoYXQgaXMg cmV0dXJuZWQsIG5vIGVycm9yICovCgoJeyBTVE1UX09LLCAgIjAwMDAwIiwgIjAwMDAwIiB9 LCAvKiBPSyAqLwoJeyBTVE1UX0VYRUNfRVJST1IsICJIWTAwMCIsICJTMTAwMCIgfSwgLyog YWxzbyBhIGdlbmVyYWwgZXJyb3IgKi8KCXsgU1RNVF9TVEFUVVNfRVJST1IsICJIWTAxMCIs ICJTMTAxMCIgfSwKCXsgU1RNVF9TRVFVRU5DRV9FUlJPUiwgIkhZMDEwIiwgIlMxMDEwIiB9 LCAvKiBGdW5jdGlvbiBzZXF1ZW5jZSBlcnJvciAqLwoJeyBTVE1UX05PX01FTU9SWV9FUlJP UiwgIkhZMDAxIiwgIlMxMDAxIiB9LCAvKiBtZW1vcnkgYWxsb2NhdGlvbiBmYWlsdXJlICov Cgl7IFNUTVRfQ09MTlVNX0VSUk9SLCAiMDcwMDkiLCAiUzEwMDIiIH0sIC8qIGludmFsaWQg Y29sdW1uIG51bWJlciAqLwoJeyBTVE1UX05PX1NUTVRTVFJJTkcsICJIWTAwMSIsICJTMTAw MSIgfSwgLyogaGF2aW5nIG5vIHN0bXRzdHJpbmcgaXMgYWxzbyBhIG1hbGxvYyBwcm9ibGVt ICovCgl7IFNUTVRfRVJST1JfVEFLRU5fRlJPTV9CQUNLRU5ELCAiSFkwMDAiLCAiUzEwMDAi IH0sIC8qIGdlbmVyYWwgZXJyb3IgKi8KCXsgU1RNVF9JTlRFUk5BTF9FUlJPUiwgIkhZMDAw IiwgIlMxMDAwIiB9LCAvKiBnZW5lcmFsIGVycm9yICovCgl7IFNUTVRfU1RJTExfRVhFQ1VU SU5HLCAiSFkwMTAiLCAiUzEwMTAiIH0sCgl7IFNUTVRfTk9UX0lNUExFTUVOVEVEX0VSUk9S LCAiSFlDMDAiLCAiUzFDMDAiIH0sIC8qID09ICdkcml2ZXIgbm90CgkJCQkJCQkgICogY2Fw YWJsZScgKi8KCXsgU1RNVF9CQURfUEFSQU1FVEVSX05VTUJFUl9FUlJPUiwgIjA3MDA5Iiwg IlMxMDkzIiB9LAoJeyBTVE1UX09QVElPTl9PVVRfT0ZfUkFOR0VfRVJST1IsICJIWTA5MiIs ICJTMTA5MiIgfSwKCXsgU1RNVF9JTlZBTElEX0NPTFVNTl9OVU1CRVJfRVJST1IsICIwNzAw OSIsICJTMTAwMiIgfSwKCXsgU1RNVF9SRVNUUklDVEVEX0RBVEFfVFlQRV9FUlJPUiwgIjA3 MDA2IiwgIjA3MDA2IiB9LAoJeyBTVE1UX0lOVkFMSURfQ1VSU09SX1NUQVRFX0VSUk9SLCAi MDcwMDUiLCAiMjQwMDAiIH0sCgl7IFNUTVRfQ1JFQVRFX1RBQkxFX0VSUk9SLCAiNDJTMDEi LCAiUzAwMDEiIH0sIC8qIHRhYmxlIGFscmVhZHkgZXhpc3RzICovCgl7IFNUTVRfTk9fQ1VS U09SX05BTUUsICJTMTAxNSIsICJTMTAxNSIgfSwKCXsgU1RNVF9JTlZBTElEX0NVUlNPUl9O QU1FLCAiMzQwMDAiLCAiMzQwMDAiIH0sCgl7IFNUTVRfSU5WQUxJRF9BUkdVTUVOVF9OTywg IkhZMDI0IiwgIlMxMDA5IiB9LCAvKiBpbnZhbGlkIGFyZ3VtZW50IHZhbHVlICovCgl7IFNU TVRfUk9XX09VVF9PRl9SQU5HRSwgIkhZMTA3IiwgIlMxMTA3IiB9LAoJeyBTVE1UX09QRVJB VElPTl9DQU5DRUxMRUQsICJIWTAwOCIsICJTMTAwOCIgfSwKCXsgU1RNVF9JTlZBTElEX0NV UlNPUl9QT1NJVElPTiwgIkhZMTA5IiwgIlMxMTA5IiB9LAoJeyBTVE1UX1ZBTFVFX09VVF9P Rl9SQU5HRSwgIkhZMDE5IiwgIjIyMDAzIiB9LAoJeyBTVE1UX09QRVJBVElPTl9JTlZBTElE LCAiSFkwMTEiLCAiUzEwMTEiIH0sCgl7IFNUTVRfUFJPR1JBTV9UWVBFX09VVF9PRl9SQU5H RSwgIj8/Pz8/IiwgIj8/Pz8/IiB9LAoJeyBTVE1UX0JBRF9FUlJPUiwgIjA4UzAxIiwgIjA4 UzAxIiB9LCAvKiBjb21tdW5pY2F0aW9uIGxpbmsgZmFpbHVyZSAqLwoJeyBTVE1UX0lOVkFM SURfT1BUSU9OX0lERU5USUZJRVIsICJIWTA5MiIsICJIWTA5MiIgfSwKCXsgU1RNVF9SRVRV Uk5fTlVMTF9XSVRIT1VUX0lORElDQVRPUiwgIjIyMDAyIiwgIjIyMDAyIiB9LAoJeyBTVE1U X0lOVkFMSURfREVTQ1JJUFRPUl9JREVOVElGSUVSLCAiSFkwOTEiLCAiSFkwOTEiIH0sCgl7 IFNUTVRfT1BUSU9OX05PVF9GT1JfVEhFX0RSSVZFUiwgIkhZQzAwIiwgIkhZQzAwIiB9LAoJ eyBTVE1UX0ZFVENIX09VVF9PRl9SQU5HRSwgIkhZMTA2IiwgIlMxMTA2IiB9LAoJeyBTVE1U X0NPVU5UX0ZJRUxEX0lOQ09SUkVDVCwgIjA3MDAyIiwgIjA3MDAyIiB9LAoJeyBTVE1UX0lO VkFMSURfTlVMTF9BUkcsICJIWTAwOSIsICJTMTAwOSIgfSwKCXsgU1RNVF9OT19SRVNQT05T RSwgIjA4UzAxIiwgIjA4UzAxIiB9LAoJeyBTVE1UX0NPTU1VTklDQVRJT05fRVJST1IsICIw OFMwMSIsICIwOFMwMSIgfQp9OwoKc3RhdGljIFBHX0Vycm9ySW5mbyAqClNDX2NyZWF0ZV9l cnJvcmluZm8oY29uc3QgU3RhdGVtZW50Q2xhc3MgKnNlbGYsIFBHX0Vycm9ySW5mbyAqcGdl cnJvcl9mYWlsX3NhZmUpCnsKCVFSZXN1bHRDbGFzcyAqcmVzID0gU0NfZ2V0X0V4ZWNkT3JQ YXJzZWQoc2VsZik7CglDb25uZWN0aW9uQ2xhc3MgKmNvbm4gPSBTQ19nZXRfY29ubihzZWxm KTsKCUludDQJZXJyb3JudW07CglzaXplX3QJCXBvczsKCUJPT0wJCXJlc21zZyA9IEZBTFNF LCBkZXRhaWxtc2cgPSBGQUxTRSwgbXNnZW5kID0gRkFMU0U7CglCT09MCQlsb29wb25jZSwg bG9vcGVuZDsKCWNoYXIJCW1zZ1s0MDk2XSwgKndtc2c7CgljaGFyCQkqZXJtc2cgPSBOVUxM LCAqc3Fsc3RhdGUgPSBOVUxMOwoJUEdfRXJyb3JJbmZvCSpwZ2Vycm9yOwoKCWlmIChzZWxm LT5wZ2Vycm9yKQoJCXJldHVybiBzZWxmLT5wZ2Vycm9yOwoJZXJyb3JudW0gPSBzZWxmLT5f X2Vycm9yX251bWJlcjsKCWlmIChlcnJvcm51bSA9PSAwKQoJCXJldHVybglOVUxMOwoKCWxv b3BvbmNlID0gKFNDX2dldF9SZXN1bHQoc2VsZikgIT0gcmVzKTsKCW1zZ1swXSA9ICdcMCc7 Cglmb3IgKGxvb3BlbmQgPSBGQUxTRTsgKE5VTEwgIT0gcmVzKSAmJiAhbG9vcGVuZDsgcmVz ID0gUVJfbmV4dHIocmVzKSkKCXsKCQlpZiAobG9vcG9uY2UpCgkJCWxvb3BlbmQgPSBUUlVF OwoJCWlmICgnXDAnICE9IHJlcy0+c3Fsc3RhdGVbMF0pCgkJewoJCQlpZiAoTlVMTCAhPSBz cWxzdGF0ZSAmJiBzdHJuaWNtcChyZXMtPnNxbHN0YXRlLCAiMDAiLCAyKSA9PSAwKQoJCQkJ Y29udGludWU7CgkJCXNxbHN0YXRlID0gcmVzLT5zcWxzdGF0ZTsKCQkJaWYgKCFRUl9jb21t YW5kX21heWJlX3N1Y2Nlc3NmdWwocmVzKSkKCQkJCWxvb3BlbmQgPSBUUlVFOwoJCQkvKgoJ CQlpZiAoJzAnICE9IHNxbHN0YXRlWzBdIHx8CgkJCSAgICAnMScgPCBzcWxzdGF0ZVsxXSkK CQkJCWxvb3BlbmQgPSBUUlVFOwoJCQkqLwoJCX0KCQlpZiAoTlVMTCAhPSByZXMtPm1lc3Nh Z2UpCgkJewoJCQlTVFJDUFlfRklYRUQobXNnLCByZXMtPm1lc3NhZ2UpOwoJCQlkZXRhaWxt c2cgPSByZXNtc2cgPSBUUlVFOwoJCX0KCQllbHNlIGlmIChOVUxMICE9IHJlcy0+bWVzc2Fn ZXJlZikKCQl7CgkJCVNUUkNQWV9GSVhFRChtc2csIHJlcy0+bWVzc2FnZXJlZik7CgkJCWRl dGFpbG1zZyA9IHJlc21zZyA9IFRSVUU7CgkJfQoJCWlmIChtc2dbMF0pCgkJCWVybXNnID0g bXNnOwoJCWVsc2UgaWYgKFFSX2dldF9ub3RpY2UocmVzKSkKCQl7CgkJCWNoYXIgKm5vdGlj ZSA9IFFSX2dldF9ub3RpY2UocmVzKTsKCQkJc2l6ZV90CWxlbiA9IHN0cmxlbihub3RpY2Up OwoJCQlpZiAobGVuIDwgc2l6ZW9mKG1zZykpCgkJCXsKCQkJCW1lbWNweShtc2csIG5vdGlj ZSwgbGVuKTsKCQkJCW1zZ1tsZW5dID0gJ1wwJzsKCQkJCWVybXNnID0gbXNnOwoJCQl9CgkJ CWVsc2UKCQkJewoJCQkJZXJtc2cgPSBub3RpY2U7CgkJCQltc2dlbmQgPSBUUlVFOwoJCQl9 CgkJfQoJfQoJaWYgKCFtc2dlbmQgJiYgKHdtc2cgPSBTQ19nZXRfZXJyb3Jtc2coc2VsZikp ICYmIHdtc2dbMF0pCgl7CgkJcG9zID0gc3RybGVuKG1zZyk7CgoJCXNucHJpbnRmKCZtc2db cG9zXSwgc2l6ZW9mKG1zZykgLSBwb3MsICIlcyVzIiwKCQkJCSBkZXRhaWxtc2cgPyAiO1xu IiA6ICIiLAoJCQkJIHdtc2cpOwoJCWVybXNnID0gbXNnOwoJCWRldGFpbG1zZyA9IFRSVUU7 Cgl9CglpZiAoIXNlbGYtPnJlZl9DQ19lcnJvcikKCQltc2dlbmQgPSBUUlVFOwoKCWlmIChj b25uICYmICFtc2dlbmQpCgl7CgkJaWYgKCFyZXNtc2cgJiYgKHdtc2cgPSBDQ19nZXRfZXJy b3Jtc2coY29ubikpICYmIHdtc2dbMF0gIT0gJ1wwJykKCQl7CgkJCXBvcyA9IHN0cmxlbiht c2cpOwoJCQlzbnByaW50ZigmbXNnW3Bvc10sIHNpemVvZihtc2cpIC0gcG9zLAoJCQkJCSAi O1xuJXMiLCBDQ19nZXRfZXJyb3Jtc2coY29ubikpOwoJCX0KCgkJZXJtc2cgPSBtc2c7Cgl9 CglwZ2Vycm9yID0gRVJfQ29uc3RydWN0b3Ioc2VsZi0+X19lcnJvcl9udW1iZXIsIGVybXNn KTsKCWlmICghcGdlcnJvcikKCXsKCQlpZiAocGdlcnJvcl9mYWlsX3NhZmUpCgkJewoJCQlt ZW1zZXQocGdlcnJvcl9mYWlsX3NhZmUsIDAsIHNpemVvZigqcGdlcnJvcl9mYWlsX3NhZmUp KTsKCQkJcGdlcnJvciA9IHBnZXJyb3JfZmFpbF9zYWZlOwoJCQlwZ2Vycm9yLT5zdGF0dXMg PSBzZWxmLT5fX2Vycm9yX251bWJlcjsKCQkJcGdlcnJvci0+ZXJyb3JzaXplID0gc2l6ZW9m KHBnZXJyb3ItPl9fZXJyb3JfbWVzc2FnZSk7CgkJCVNUUkNQWV9GSVhFRChwZ2Vycm9yLT5f X2Vycm9yX21lc3NhZ2UsIGVybXNnKTsgCgkJCXBnZXJyb3ItPnJlY3NpemUgPSAtMTsKCQl9 CgkJZWxzZQoJCQlyZXR1cm4gTlVMTDsKCX0KCWlmIChzcWxzdGF0ZSkKCQlTVFJDUFlfRklY RUQocGdlcnJvci0+c3Fsc3RhdGUsIHNxbHN0YXRlKTsKCWVsc2UgaWYgKGNvbm4pCgl7CgkJ aWYgKCFtc2dlbmQgJiYgY29ubi0+c3Fsc3RhdGVbMF0pCgkJCVNUUkNQWV9GSVhFRChwZ2Vy cm9yLT5zcWxzdGF0ZSwgY29ubi0+c3Fsc3RhdGUpOwoJCWVsc2UKCQl7CgkJCUVudmlyb25t ZW50Q2xhc3MgKmVudiA9IChFbnZpcm9ubWVudENsYXNzICopIENDX2dldF9lbnYoY29ubik7 CgoJCQllcnJvcm51bSAtPSBMT1dFU1RfU1RNVF9FUlJPUjsKCQkJaWYgKGVycm9ybnVtIDwg MCB8fAoJCQkJZXJyb3JudW0gPj0gc2l6ZW9mKFN0YXRlbWVudF9zcWxzdGF0ZSkgLyBzaXpl b2YoU3RhdGVtZW50X3NxbHN0YXRlWzBdKSkKCQkJewoJCQkJZXJyb3JudW0gPSAxIC0gTE9X RVNUX1NUTVRfRVJST1I7CgkJCX0KCQkJU1RSQ1BZX0ZJWEVEKHBnZXJyb3ItPnNxbHN0YXRl LCBFTl9pc19vZGJjMyhlbnYpID8KCQkJCSAgIFN0YXRlbWVudF9zcWxzdGF0ZVtlcnJvcm51 bV0udmVyM3N0ciA6CgkJCQkgICBTdGF0ZW1lbnRfc3Fsc3RhdGVbZXJyb3JudW1dLnZlcjJz dHIpOwoJCX0KCX0KCglyZXR1cm4gcGdlcnJvcjsKfQoKClN0YXRlbWVudENsYXNzICpTQ19n ZXRfYW5jZXN0b3IoU3RhdGVtZW50Q2xhc3MgKnN0bXQpCnsKCVN0YXRlbWVudENsYXNzCSpj aGlsZCA9IHN0bXQsICpwYXJlbnQ7CgpNWUxPRyhERVRBSUxfTE9HX0xFVkVMLCAiZW50ZXJp bmcgc3RtdD0lcFxuIiwgc3RtdCk7Cglmb3IgKGNoaWxkID0gc3RtdCwgcGFyZW50ID0gY2hp bGQtPmV4ZWN1dGVfcGFyZW50OyBwYXJlbnQ7IGNoaWxkID0gcGFyZW50LCBwYXJlbnQgPSBj aGlsZC0+ZXhlY3V0ZV9wYXJlbnQpCgl7CgkJTVlMT0coREVUQUlMX0xPR19MRVZFTCwgInBh cmVudD0lcFxuIiwgcGFyZW50KTsKCX0KCXJldHVybiBjaGlsZDsKfQp2b2lkIFNDX3Jlc2V0 X2RlbGVnYXRlKFJFVENPREUgcmV0Y29kZSwgU3RhdGVtZW50Q2xhc3MgKnN0bXQpCnsKCVN0 YXRlbWVudENsYXNzCSpkZWxlZ2F0ZSA9IHN0bXQtPmV4ZWN1dGVfZGVsZWdhdGU7CgoJaWYg KCFkZWxlZ2F0ZSkKCQlyZXR1cm47CglQR0FQSV9GcmVlU3RtdChkZWxlZ2F0ZSwgU1FMX0RS T1ApOwp9Cgp2b2lkClNDX3NldF9lcnJvcihTdGF0ZW1lbnRDbGFzcyAqc2VsZiwgaW50IG51 bWJlciwgY29uc3QgY2hhciAqbWVzc2FnZSwgY29uc3QgY2hhciAqZnVuYykKewoJaWYgKHNl bGYtPl9fZXJyb3JfbWVzc2FnZSkKCQlmcmVlKHNlbGYtPl9fZXJyb3JfbWVzc2FnZSk7Cglz ZWxmLT5fX2Vycm9yX251bWJlciA9IG51bWJlcjsKCXNlbGYtPl9fZXJyb3JfbWVzc2FnZSA9 IG1lc3NhZ2UgPyBzdHJkdXAobWVzc2FnZSkgOiBOVUxMOwoJaWYgKGZ1bmMgJiYgbnVtYmVy ICE9IFNUTVRfT0sgJiYgbnVtYmVyICE9IFNUTVRfSU5GT19PTkxZKQoJCVNDX2xvZ19lcnJv cihmdW5jLCAiIiwgc2VsZik7Cn0KCgp2b2lkClNDX3NldF9lcnJvcm1zZyhTdGF0ZW1lbnRD bGFzcyAqc2VsZiwgY29uc3QgY2hhciAqbWVzc2FnZSkKewoJaWYgKHNlbGYtPl9fZXJyb3Jf bWVzc2FnZSkKCQlmcmVlKHNlbGYtPl9fZXJyb3JfbWVzc2FnZSk7CglzZWxmLT5fX2Vycm9y X21lc3NhZ2UgPSBtZXNzYWdlID8gc3RyZHVwKG1lc3NhZ2UpIDogTlVMTDsKfQoKCnZvaWQK U0NfcmVwbGFjZV9lcnJvcl93aXRoX3JlcyhTdGF0ZW1lbnRDbGFzcyAqc2VsZiwgaW50IG51 bWJlciwgY29uc3QgY2hhciAqbWVzc2FnZSwgY29uc3QgUVJlc3VsdENsYXNzICpmcm9tX3Jl cywgQk9PTCBjaGVjaykKewoJUVJlc3VsdENsYXNzCSpzZWxmX3JlczsKCUJPT0wJcmVwc3Rh dGU7CgpNWUxPRyhERVRBSUxfTE9HX0xFVkVMLCAiZW50ZXJpbmcgJXAtPiVwIGNoZWNrPSVp XG4iLCBmcm9tX3JlcyAsc2VsZiwgY2hlY2spOwoJaWYgKGNoZWNrKQoJewoJCWlmICgwID09 IG51bWJlcikJCQlyZXR1cm47CgkJaWYgKDAgPiBudW1iZXIgJiYJCS8qIFNRTF9TVUNDRVNT X1dJVEhfSU5GTyAqLwoJCSAgICAwIDwgc2VsZi0+X19lcnJvcl9udW1iZXIpCgkJCXJldHVy bjsKCX0KCWlmICghZnJvbV9yZXMpCgkJcmV0dXJuOwoJc2VsZi0+X19lcnJvcl9udW1iZXIg PSBudW1iZXI7CglpZiAoIWNoZWNrIHx8IG1lc3NhZ2UpCgl7CgkJaWYgKHNlbGYtPl9fZXJy b3JfbWVzc2FnZSkKCQkJZnJlZShzZWxmLT5fX2Vycm9yX21lc3NhZ2UpOwoJCXNlbGYtPl9f ZXJyb3JfbWVzc2FnZSA9IG1lc3NhZ2UgPyBzdHJkdXAobWVzc2FnZSkgOiBOVUxMOwoJfQoJ aWYgKHNlbGYtPnBnZXJyb3IpCgl7CgkJRVJfRGVzdHJ1Y3RvcihzZWxmLT5wZ2Vycm9yKTsK CQlzZWxmLT5wZ2Vycm9yID0gTlVMTDsKCX0KCXNlbGZfcmVzID0gU0NfZ2V0X0V4ZWNkT3JQ YXJzZWQoc2VsZik7CglpZiAoIXNlbGZfcmVzKSByZXR1cm47CglpZiAoc2VsZl9yZXMgPT0g ZnJvbV9yZXMpCXJldHVybjsKCVFSX2FkZF9tZXNzYWdlKHNlbGZfcmVzLCBRUl9nZXRfbWVz c2FnZShmcm9tX3JlcykpOwoJUVJfYWRkX25vdGljZShzZWxmX3JlcywgUVJfZ2V0X25vdGlj ZShmcm9tX3JlcykpOwoJcmVwc3RhdGUgPSBGQUxTRTsKCWlmICghY2hlY2spCgkJcmVwc3Rh dGUgPSBUUlVFOwoJZWxzZSBpZiAoZnJvbV9yZXMtPnNxbHN0YXRlWzBdKQoJewoJCWlmICgh c2VsZl9yZXMtPnNxbHN0YXRlWzBdIHx8IHN0cm5jbXAoc2VsZl9yZXMtPnNxbHN0YXRlLCAi MDAiLCAyKSA9PSAwKQoJCQlyZXBzdGF0ZSA9IFRSVUU7CgkJZWxzZSBpZiAoc3RybmNtcChm cm9tX3Jlcy0+c3Fsc3RhdGUsICIwMSIsIDIpID49IDApCgkJCXJlcHN0YXRlID0gVFJVRTsK CX0KCWlmIChyZXBzdGF0ZSkKCQlTVFJDUFlfRklYRUQoc2VsZl9yZXMtPnNxbHN0YXRlLCBm cm9tX3Jlcy0+c3Fsc3RhdGUpOwp9Cgp2b2lkClNDX2Vycm9yX2NvcHkoU3RhdGVtZW50Q2xh c3MgKnNlbGYsIGNvbnN0IFN0YXRlbWVudENsYXNzICpmcm9tLCBCT09MIGNoZWNrKQp7CglR UmVzdWx0Q2xhc3MJKnNlbGZfcmVzLCAqZnJvbV9yZXM7CglCT09MCXJlcHN0YXRlOwoKTVlM T0coREVUQUlMX0xPR19MRVZFTCwgImVudGVyaW5nICVwLT4lcCBjaGVjaz0laVxuIiwgZnJv bSAsc2VsZiwgY2hlY2spOwoJaWYgKCFmcm9tKQkJcmV0dXJuOwkvKiBmb3Igc2FmZXR5ICov CglpZiAoc2VsZiA9PSBmcm9tKQlyZXR1cm47IC8qIGZvciBzYWZldHkgKi8KCWlmIChjaGVj aykKCXsKCQlpZiAoMCA9PSBmcm9tLT5fX2Vycm9yX251bWJlcikJLyogU1FMX1NVQ0NFU1Mg Ki8KCQkJcmV0dXJuOwoJCWlmICgwID4gZnJvbS0+X19lcnJvcl9udW1iZXIgJiYJLyogU1FM X1NVQ0NFU1NfV0lUSF9JTkZPICovCgkJICAgIDAgPCBzZWxmLT5fX2Vycm9yX251bWJlcikK CQkJcmV0dXJuOwoJfQoJc2VsZi0+X19lcnJvcl9udW1iZXIgPSBmcm9tLT5fX2Vycm9yX251 bWJlcjsKCWlmICghY2hlY2sgfHwgZnJvbS0+X19lcnJvcl9tZXNzYWdlKQoJewoJCWlmIChz ZWxmLT5fX2Vycm9yX21lc3NhZ2UpCgkJCWZyZWUoc2VsZi0+X19lcnJvcl9tZXNzYWdlKTsK CQlzZWxmLT5fX2Vycm9yX21lc3NhZ2UgPSBmcm9tLT5fX2Vycm9yX21lc3NhZ2UgPyBzdHJk dXAoZnJvbS0+X19lcnJvcl9tZXNzYWdlKSA6IE5VTEw7Cgl9CglpZiAoc2VsZi0+cGdlcnJv cikKCXsKCQlFUl9EZXN0cnVjdG9yKHNlbGYtPnBnZXJyb3IpOwoJCXNlbGYtPnBnZXJyb3Ig PSBOVUxMOwoJfQoJc2VsZl9yZXMgPSBTQ19nZXRfRXhlY2RPclBhcnNlZChzZWxmKTsKCWZy b21fcmVzID0gU0NfZ2V0X0V4ZWNkT3JQYXJzZWQoZnJvbSk7CglpZiAoIXNlbGZfcmVzIHx8 ICFmcm9tX3JlcykKCQlyZXR1cm47CglRUl9hZGRfbWVzc2FnZShzZWxmX3JlcywgUVJfZ2V0 X21lc3NhZ2UoZnJvbV9yZXMpKTsKCVFSX2FkZF9ub3RpY2Uoc2VsZl9yZXMsIFFSX2dldF9u b3RpY2UoZnJvbV9yZXMpKTsKCXJlcHN0YXRlID0gRkFMU0U7CglpZiAoIWNoZWNrKQoJCXJl cHN0YXRlID0gVFJVRTsKCWVsc2UgaWYgKGZyb21fcmVzLT5zcWxzdGF0ZVswXSkKCXsKCQlp ZiAoIXNlbGZfcmVzLT5zcWxzdGF0ZVswXSB8fCBzdHJuY21wKHNlbGZfcmVzLT5zcWxzdGF0 ZSwgIjAwIiwgMikgPT0gMCkKCQkJcmVwc3RhdGUgPSBUUlVFOwoJCWVsc2UgaWYgKHN0cm5j bXAoZnJvbV9yZXMtPnNxbHN0YXRlLCAiMDEiLCAyKSA+PSAwKQoJCQlyZXBzdGF0ZSA9IFRS VUU7Cgl9CglpZiAocmVwc3RhdGUpCgkJU1RSQ1BZX0ZJWEVEKHNlbGZfcmVzLT5zcWxzdGF0 ZSwgZnJvbV9yZXMtPnNxbHN0YXRlKTsKfQoKCnZvaWQKU0NfZnVsbF9lcnJvcl9jb3B5KFN0 YXRlbWVudENsYXNzICpzZWxmLCBjb25zdCBTdGF0ZW1lbnRDbGFzcyAqZnJvbSwgQk9PTCBh bGxyZXMpCnsKCVBHX0Vycm9ySW5mbwkJKnBnZXJyb3I7CgpNWUxPRyhERVRBSUxfTE9HX0xF VkVMLCAiZW50ZXJpbmcgJXAtPiVwXG4iLCBmcm9tICxzZWxmKTsKCWlmICghZnJvbSkJCXJl dHVybjsJLyogZm9yIHNhZmV0eSAqLwoJaWYgKHNlbGYgPT0gZnJvbSkJcmV0dXJuOyAvKiBm b3Igc2FmZXR5ICovCglpZiAoc2VsZi0+X19lcnJvcl9tZXNzYWdlKQoJewoJCWZyZWUoc2Vs Zi0+X19lcnJvcl9tZXNzYWdlKTsKCQlzZWxmLT5fX2Vycm9yX21lc3NhZ2UgPSBOVUxMOwoJ fQoJaWYgKGZyb20tPl9fZXJyb3JfbWVzc2FnZSkKCQlzZWxmLT5fX2Vycm9yX21lc3NhZ2Ug PSBzdHJkdXAoZnJvbS0+X19lcnJvcl9tZXNzYWdlKTsKCXNlbGYtPl9fZXJyb3JfbnVtYmVy ID0gZnJvbS0+X19lcnJvcl9udW1iZXI7CglpZiAoZnJvbS0+cGdlcnJvcikKCXsKCQlpZiAo c2VsZi0+cGdlcnJvcikKCQkJRVJfRGVzdHJ1Y3RvcihzZWxmLT5wZ2Vycm9yKTsKCQlzZWxm LT5wZ2Vycm9yID0gRVJfRHVwKGZyb20tPnBnZXJyb3IpOwoJCXJldHVybjsKCX0KCWVsc2Ug aWYgKCFhbGxyZXMpCgkJcmV0dXJuOwoJcGdlcnJvciA9IFNDX2NyZWF0ZV9lcnJvcmluZm8o ZnJvbSwgTlVMTCk7CglpZiAoIXBnZXJyb3IgfHwgIXBnZXJyb3ItPl9fZXJyb3JfbWVzc2Fn ZVswXSkKCXsKCQlFUl9EZXN0cnVjdG9yKHBnZXJyb3IpOwoJCXJldHVybjsKCX0KCWlmIChz ZWxmLT5wZ2Vycm9yKQoJCUVSX0Rlc3RydWN0b3Ioc2VsZi0+cGdlcnJvcik7CglzZWxmLT5w Z2Vycm9yID0gcGdlcnJvcjsKfQoKLyogUmV0dXJucyB0aGUgbmV4dCBTUUwgZXJyb3IgaW5m b3JtYXRpb24uICovClJFVENPREUJCVNRTF9BUEkKUEdBUElfU3RtdEVycm9yKFNRTEhTVE1U CWhzdG10LAoJCQkJU1FMU01BTExJTlQgUmVjTnVtYmVyLAoJCQkJU1FMQ0hBUiAqIHN6U3Fs U3RhdGUsCgkJCQlTUUxJTlRFR0VSICogcGZOYXRpdmVFcnJvciwKCQkJCVNRTENIQVIgKiBz ekVycm9yTXNnLAoJCQkJU1FMU01BTExJTlQgY2JFcnJvck1zZ01heCwKCQkJCVNRTFNNQUxM SU5UICogcGNiRXJyb3JNc2csCgkJCQlVV09SRCBmbGFnKQp7CgkvKiBDQzogcmV0dXJuIGFu IGVycm9yIG9mIGEgaGRlc2MgICovCglQR19FcnJvckluZm8JCSpwZ2Vycm9yLCBlcnJvcjsK CVN0YXRlbWVudENsYXNzICpzdG10ID0gKFN0YXRlbWVudENsYXNzICopIGhzdG10OwoJaW50 IGVycm51bSA9IFNDX2dldF9lcnJvcm51bWJlcihzdG10KTsKCglpZiAocGdlcnJvciA9IFND X2NyZWF0ZV9lcnJvcmluZm8oc3RtdCwgJmVycm9yKSwgTlVMTCA9PSBwZ2Vycm9yKQoJCXJl dHVybiBTUUxfTk9fREFUQV9GT1VORDsKCWlmIChwZ2Vycm9yICE9ICZlcnJvcikKCQlzdG10 LT5wZ2Vycm9yID0gcGdlcnJvcjsKCWlmIChTVE1UX05PX01FTU9SWV9FUlJPUiA9PSBlcnJu dW0gJiYKCSAgICAhcGdlcnJvci0+X19lcnJvcl9tZXNzYWdlWzBdKQoJCVNUUkNQWV9GSVhF RChwZ2Vycm9yLT5fX2Vycm9yX21lc3NhZ2UsICJNZW1vcnkgQWxsb2NhdGlvbiBFcnJvcj8/ Iik7CglyZXR1cm4gRVJfUmV0dXJuRXJyb3IocGdlcnJvciwgUmVjTnVtYmVyLCBzelNxbFN0 YXRlLAoJCQkJCQkgIHBmTmF0aXZlRXJyb3IsIHN6RXJyb3JNc2csIGNiRXJyb3JNc2dNYXgs CgkJCQkJCSAgcGNiRXJyb3JNc2csIGZsYWcpOwp9Cgp0aW1lX3QKU0NfZ2V0X3RpbWUoU3Rh dGVtZW50Q2xhc3MgKnN0bXQpCnsKCWlmICghc3RtdCkKCQlyZXR1cm4gdGltZShOVUxMKTsK CWlmICgwID09IHN0bXQtPnN0bXRfdGltZSkKCQlzdG10LT5zdG10X3RpbWUgPSB0aW1lKE5V TEwpOwoJcmV0dXJuIHN0bXQtPnN0bXRfdGltZTsKfQoKc3RydWN0IHRtICoKU0NfZ2V0X2xv Y2FsdGltZShTdGF0ZW1lbnRDbGFzcyAqc3RtdCkKewojaWZuZGVmIEhBVkVfTE9DQUxUSU1F X1IKCXN0cnVjdCB0bSAqIHRpbTsKI2VuZGlmIC8qIEhBVkVfTE9DQUxUSU1FX1IgKi8KCglp ZiAoc3RtdC0+bG9jYWx0aW1lLnRtX3NlYyA8IDApCgl7CgkJU0NfZ2V0X3RpbWUoc3RtdCk7 CiNpZmRlZiBIQVZFX0xPQ0FMVElNRV9SCgkJbG9jYWx0aW1lX3IoJnN0bXQtPnN0bXRfdGlt ZSwgJihzdG10LT5sb2NhbHRpbWUpKTsKI2Vsc2UKCQl0aW0gPSBsb2NhbHRpbWUoJnN0bXQt PnN0bXRfdGltZSk7CgkJc3RtdC0+bG9jYWx0aW1lID0gKnRpbTsKI2VuZGlmIC8qIEhBVkVf TE9DQUxUSU1FX1IgKi8KCX0KCglyZXR1cm4gJihzdG10LT5sb2NhbHRpbWUpOwp9CgpSRVRD T0RFClNDX2ZldGNoKFN0YXRlbWVudENsYXNzICpzZWxmKQp7CglDU1RSIGZ1bmMgPSAiU0Nf ZmV0Y2giOwoJUVJlc3VsdENsYXNzICpyZXMgPSBTQ19nZXRfQ3VycmVzKHNlbGYpOwoJQVJE RmllbGRzCSpvcHRzOwoJR2V0RGF0YUluZm8JKmdkYXRhOwoJaW50CQlyZXR2YWw7CglSRVRD T0RFCQlyZXN1bHQ7CgoJSW50MgkJbnVtX2NvbHMsCgkJCQlsZjsKCU9JRAkJCXR5cGU7Cglp bnQJCWF0dHR5cG1vZDsKCWNoYXIJICAgKnZhbHVlOwoJQ29sdW1uSW5mb0NsYXNzICpjb2xp OwoJQmluZEluZm9DbGFzcwkqYm9va21hcms7CglCT09MCQl1c2VDdXJzb3I7CglLZXlTZXQJ CSprZXlzZXQgPSBOVUxMOwoKCS8qIFR1cGxlRmllbGQgKnR1cGxlRmllbGQ7ICovCgpNWUxP RyhERVRBSUxfTE9HX0xFVkVMLCAiZW50ZXJpbmcgc3RhdGVtZW50PSVwIHJlcz0lcCBvbW1p dHRlZD0wXG4iLCBzZWxmLCByZXMpOwoJc2VsZi0+bGFzdF9mZXRjaF9jb3VudCA9IHNlbGYt Pmxhc3RfZmV0Y2hfY291bnRfaW5jbHVkZV9vbW1pdHRlZCA9IDA7CglpZiAoIXJlcykKCQly ZXR1cm4gU1FMX0VSUk9SOwoJY29saSA9IFFSX2dldF9maWVsZHMocmVzKTsJLyogdGhlIGNv bHVtbiBpbmZvICovCgoJTVlMT0coMCwgImZldGNoX2N1cnNvcj0lZCwgJXAtPnRvdGFsX3Jl YWQ9IiBGT1JNQVRfTEVOICJcbiIsIFNDX2lzX2ZldGNoY3Vyc29yKHNlbGYpLCByZXMsIHJl cy0+bnVtX3RvdGFsX3JlYWQpOwoKCXVzZUN1cnNvciA9IChTQ19pc19mZXRjaGN1cnNvcihz ZWxmKSAmJiAoTlVMTCAhPSBRUl9nZXRfY3Vyc29yKHJlcykpKTsKCWlmICghdXNlQ3Vyc29y KQoJewoJCWlmIChzZWxmLT5jdXJyVHVwbGUgPj0gKEludDQpIFFSX2dldF9udW1fdG90YWxf dHVwbGVzKHJlcykgLSAxIHx8CgkJCShzZWxmLT5vcHRpb25zLm1heFJvd3MgPiAwICYmIHNl bGYtPmN1cnJUdXBsZSA9PSBzZWxmLT5vcHRpb25zLm1heFJvd3MgLSAxKSkKCQl7CgkJCS8q CgkJCSAqIGlmIGF0IHRoZSBlbmQgb2YgdGhlIHR1cGxlcywgcmV0dXJuICJubyBkYXRhIGZv dW5kIiBhbmQgc2V0CgkJCSAqIHRoZSBjdXJzb3IgcGFzdCB0aGUgZW5kIG9mIHRoZSByZXN1 bHQgc2V0CgkJCSAqLwoJCQlzZWxmLT5jdXJyVHVwbGUgPSBRUl9nZXRfbnVtX3RvdGFsX3R1 cGxlcyhyZXMpOwoJCQlyZXR1cm4gU1FMX05PX0RBVEFfRk9VTkQ7CgkJfQoKCQlNWUxPRygw LCAiKioqKiA6IG5vbi1jdXJzb3JfcmVzdWx0XG4iKTsKCQkoc2VsZi0+Y3VyclR1cGxlKSsr OwoJfQoJZWxzZQoJewoJCS8qIHJlYWQgZnJvbSB0aGUgY2FjaGUgb3IgdGhlIHBoeXNpY2Fs IG5leHQgdHVwbGUgKi8KCQlyZXR2YWwgPSBRUl9uZXh0X3R1cGxlKHJlcywgc2VsZik7CgkJ aWYgKHJldHZhbCA8IDApCgkJewoJCQlNWUxPRygwLCAiKioqKiA6IGVuZF90dXBsZXNcbiIp OwoJCQlpZiAoUVJfZ2V0X2N1cnNvcihyZXMpICYmCgkJCSAgICBTUUxfQ1VSU09SX0ZPUldB UkRfT05MWSA9PSBzZWxmLT5vcHRpb25zLmN1cnNvcl90eXBlICYmCgkJCSAgICBRUl9vbmNl X3JlYWNoZWRfZW9mKHJlcykpCgkJCQlRUl9jbG9zZShyZXMpOwoJCQlyZXR1cm4gU1FMX05P X0RBVEFfRk9VTkQ7CgkJfQoJCWVsc2UgaWYgKHJldHZhbCA+IDApCgkJCShzZWxmLT5jdXJy VHVwbGUpKys7CS8qIGFsbCBpcyB3ZWxsICovCgkJZWxzZQoJCXsKCQkJU0Nfc2V0X2Vycm9y aW5mbyhzZWxmLCByZXMsIDEpOwoJCQlyZXR1cm4gU1FMX0VSUk9SOwoJCX0KCX0KCWlmIChR Ul9oYXNrZXlzZXQocmVzKSkKCXsKCQlTUUxMRU4Ja3Jlc19yaWR4OwoKCQlrcmVzX3JpZHgg PSBHSWR4MktSZXNJZHgoc2VsZi0+Y3VyclR1cGxlLCBzZWxmLCByZXMpOwoJCWlmIChrcmVz X3JpZHggPj0gMCAmJiBrcmVzX3JpZHggPCByZXMtPm51bV9jYWNoZWRfa2V5cykKCQl7CgkJ CVVXT1JECXBzdGF0dXMgPSByZXMtPmtleXNldFtrcmVzX3JpZHhdLnN0YXR1czsKTVlMT0co REVUQUlMX0xPR19MRVZFTCwgIlNDXyBwc3RhdHVzWyIgRk9STUFUX0xFTiAiXT0laHggZmV0 Y2hfY291bnQ9IiBGT1JNQVRfTEVOICJcbiIsIGtyZXNfcmlkeCwgcHN0YXR1cywgc2VsZi0+ bGFzdF9mZXRjaF9jb3VudCk7CgkJCWlmICgwICE9IChwc3RhdHVzICYgKENVUlNfU0VMRl9E RUxFVElORyB8IENVUlNfU0VMRl9ERUxFVEVEKSkpCgkJCQlyZXR1cm4gU1FMX1NVQ0NFU1Nf V0lUSF9JTkZPOwoJCQlpZiAoU1FMX1JPV19ERUxFVEVEICE9IChwc3RhdHVzICYgS0VZU0VU X0lORk9fUFVCTElDKSAmJgoJCQkJMCAhPSAocHN0YXR1cyAmIENVUlNfT1RIRVJfREVMRVRF RCkpCgkJCXsKCQkJCXJldHVybiBTUUxfU1VDQ0VTU19XSVRIX0lORk87CgkJCX0KCQkJaWYg KDAgIT0gKENVUlNfTkVFRFNfUkVSRUFEICYgcHN0YXR1cykpCgkJCXsKCQkJCVVXT1JECXFj b3VudDsKCgkJCQlyZXN1bHQgPSBTQ19wb3NfcmVsb2FkKHNlbGYsIHNlbGYtPmN1cnJUdXBs ZSwgJnFjb3VudCwgMCk7CgkJCQlpZiAoU1FMX0VSUk9SID09IHJlc3VsdCkKCQkJCQlyZXR1 cm4gcmVzdWx0OwoJCQkJcHN0YXR1cyAmPSB+Q1VSU19ORUVEU19SRVJFQUQ7CgkJCX0KCQkJ a2V5c2V0ID0gIHJlcy0+a2V5c2V0ICsga3Jlc19yaWR4OwoJCX0KCX0KCgludW1fY29scyA9 IFFSX051bVB1YmxpY1Jlc3VsdENvbHMocmVzKTsKCglyZXN1bHQgPSBTUUxfU1VDQ0VTUzsK CXNlbGYtPmxhc3RfZmV0Y2hfY291bnQrKzsKTVlMT0coREVUQUlMX0xPR19MRVZFTCwgInN0 bXQ9JXAgb21taXR0ZWQrK1xuIiwgc2VsZik7CglzZWxmLT5sYXN0X2ZldGNoX2NvdW50X2lu Y2x1ZGVfb21taXR0ZWQrKzsKCglvcHRzID0gU0NfZ2V0X0FSREYoc2VsZik7CgkvKgoJICog SWYgdGhlIGJvb2ttYXJrIGNvbHVtbiB3YXMgYm91bmQgdGhlbiByZXR1cm4gYSBib29rbWFy ay4gU2luY2UgdGhpcwoJICogaXMgdXNlZCB3aXRoIFNRTEV4dGVuZGVkRmV0Y2gsIGFuZCB0 aGUgcm93c2V0IHNpemUgbWF5IGJlIGdyZWF0ZXIKCSAqIHRoYW4gMSwgYW5kIGFuIGFwcGxp Y2F0aW9uIGNhbiB1c2Ugcm93IG9yIGNvbHVtbiB3aXNlIGJpbmRpbmcsIHVzZQoJICogdGhl IGNvZGUgaW4gY29weV9hbmRfY29udmVydF9maWVsZCgpIHRvIGhhbmRsZSB0aGF0LgoJICov CglpZiAoKGJvb2ttYXJrID0gb3B0cy0+Ym9va21hcmspICYmIGJvb2ttYXJrLT5idWZmZXIp Cgl7CgkJU0Nfc2V0X2N1cnJlbnRfY29sKHNlbGYsIC0xKTsKCQlTQ19DcmVhdGVfYm9va21h cmsoc2VsZiwgYm9va21hcmssIHNlbGYtPmJpbmRfcm93LCBzZWxmLT5jdXJyVHVwbGUsIGtl eXNldCk7Cgl9CgoJaWYgKHNlbGYtPm9wdGlvbnMucmV0cmlldmVfZGF0YSA9PSBTUUxfUkRf T0ZGKQkJLyogZGF0YSBpc24ndCByZXF1aXJlZCAqLwoJCXJldHVybiBTUUxfU1VDQ0VTUzsK CS8qIFRoZSBmb2xsb3dpbmcgYWRqdXN0bWVudCB3b3VsZCBiZSBuZWVkZWQgYWZ0ZXIgU1FM TW9yZVJlc3VsdHMoKSAqLwoJaWYgKG9wdHMtPmFsbG9jYXRlZCA8IG51bV9jb2xzKQoJCWV4 dGVuZF9jb2x1bW5fYmluZGluZ3Mob3B0cywgbnVtX2NvbHMpOwoJZ2RhdGEgPSBTQ19nZXRf R0RUSShzZWxmKTsKCWlmIChnZGF0YS0+YWxsb2NhdGVkICE9IG9wdHMtPmFsbG9jYXRlZCkK CQlleHRlbmRfZ2V0ZGF0YV9pbmZvKGdkYXRhLCBvcHRzLT5hbGxvY2F0ZWQsIFRSVUUpOwoJ Zm9yIChsZiA9IDA7IGxmIDwgbnVtX2NvbHM7IGxmKyspCgl7CgkJTVlMT0coMCwgImZldGNo OiBjb2xzPSVkLCBsZj0lZCwgb3B0cyA9ICVwLCBvcHRzLT5iaW5kaW5ncyA9ICVwLCBidWZm ZXJbXSA9ICVwXG4iLCBudW1fY29scywgbGYsIG9wdHMsIG9wdHMtPmJpbmRpbmdzLCBvcHRz LT5iaW5kaW5nc1tsZl0uYnVmZmVyKTsKCgkJLyogcmVzZXQgZm9yIFNRTEdldERhdGEgKi8K CQlHRVREQVRBX1JFU0VUKGdkYXRhLT5nZGF0YVtsZl0pOwoKCQlpZiAoTlVMTCA9PSBvcHRz LT5iaW5kaW5ncykKCQkJY29udGludWU7CgkJaWYgKG9wdHMtPmJpbmRpbmdzW2xmXS5idWZm ZXIgIT0gTlVMTCkKCQl7CgkJCS8qIHRoaXMgY29sdW1uIGhhcyBhIGJpbmRpbmcgKi8KCgkJ CS8qIHR5cGUgPSBRUl9nZXRfZmllbGRfdHlwZShyZXMsIGxmKTsgKi8KCQkJdHlwZSA9IENJ X2dldF9vaWQoY29saSwgbGYpOwkJLyogc3BlZWQgdGhpbmdzIHVwICovCgkJCWF0dHR5cG1v ZCA9IENJX2dldF9hdHR0eXBtb2QoY29saSwgbGYpOwkvKiBzcGVlZCB0aGluZ3MgdXAgKi8K CgkJCU1ZTE9HKDAsICJ0eXBlID0gJWQsIGF0dHR5cG1vZCA9ICVkXG4iLCB0eXBlLCBhdHR0 eXBtb2QpOwoKCQkJaWYgKHVzZUN1cnNvcikKCQkJCXZhbHVlID0gUVJfZ2V0X3ZhbHVlX2Jh Y2tlbmQocmVzLCBsZik7CgkJCWVsc2UKCQkJewoJCQkJU1FMTEVOCWN1cnQgPSBHSWR4MkNh Y2hlSWR4KHNlbGYtPmN1cnJUdXBsZSwgc2VsZiwgcmVzKTsKTVlMT0coREVUQUlMX0xPR19M RVZFTCwgIiVwLT5iYXNlPSIgRk9STUFUX0xFTiAiIGN1cnI9IiBGT1JNQVRfTEVOICIgc3Q9 IiBGT1JNQVRfTEVOICIgdmFsaWQ9JWRcbiIsIHJlcywgUVJfZ2V0X3Jvd3N0YXJ0X2luX2Nh Y2hlKHJlcyksIHNlbGYtPmN1cnJUdXBsZSwgU0NfZ2V0X3Jvd3NldF9zdGFydChzZWxmKSwg UVJfaGFzX3ZhbGlkX2Jhc2UocmVzKSk7Ck1ZTE9HKERFVEFJTF9MT0dfTEVWRUwsICJjdXJ0 PSIgRk9STUFUX0xFTiAiXG4iLCBjdXJ0KTsKCQkJCXZhbHVlID0gUVJfZ2V0X3ZhbHVlX2Jh Y2tlbmRfcm93KHJlcywgY3VydCwgbGYpOwoJCQl9CgoJCQlNWUxPRygwLCAidmFsdWUgPSAn JXMnXG4iLCAodmFsdWUgPT0gTlVMTCkgPyAiPE5VTEw+IiA6IHZhbHVlKTsKCgkJCXJldHZh bCA9IGNvcHlfYW5kX2NvbnZlcnRfZmllbGRfYmluZGluZm8oc2VsZiwgdHlwZSwgYXR0dHlw bW9kLCB2YWx1ZSwgbGYpOwoKCQkJTVlMT0coMCwgImNvcHlfYW5kX2NvbnZlcnQ6IHJldHZh bCA9ICVkXG4iLCByZXR2YWwpOwoKCQkJc3dpdGNoIChyZXR2YWwpCgkJCXsKCQkJCWNhc2Ug Q09QWV9PSzoKCQkJCQlicmVhazsJCS8qIE9LLCBkbyBuZXh0IGJvdW5kIGNvbHVtbiAqLwoK CQkJCWNhc2UgQ09QWV9VTlNVUFBPUlRFRF9UWVBFOgoJCQkJCVNDX3NldF9lcnJvcihzZWxm LCBTVE1UX1JFU1RSSUNURURfREFUQV9UWVBFX0VSUk9SLCAiUmVjZWl2ZWQgYW4gdW5zdXBw b3J0ZWQgdHlwZSBmcm9tIFBvc3RncmVzLiIsIGZ1bmMpOwoJCQkJCXJlc3VsdCA9IFNRTF9F UlJPUjsKCQkJCQlicmVhazsKCgkJCQljYXNlIENPUFlfVU5TVVBQT1JURURfQ09OVkVSU0lP TjoKCQkJCQlTQ19zZXRfZXJyb3Ioc2VsZiwgU1RNVF9SRVNUUklDVEVEX0RBVEFfVFlQRV9F UlJPUiwgIkNvdWxkbid0IGhhbmRsZSB0aGUgbmVjZXNzYXJ5IGRhdGEgdHlwZSBjb252ZXJz aW9uLiIsIGZ1bmMpOwoJCQkJCXJlc3VsdCA9IFNRTF9FUlJPUjsKCQkJCQlicmVhazsKCgkJ CQljYXNlIENPUFlfUkVTVUxUX1RSVU5DQVRFRDoKCQkJCQlTQ19zZXRfZXJyb3Ioc2VsZiwg U1RNVF9UUlVOQ0FURUQsICJGZXRjaGVkIGl0ZW0gd2FzIHRydW5jYXRlZC4iLCBmdW5jKTsK CQkJCQlNWUxPRyhERVRBSUxfTE9HX0xFVkVMLCAiVGhlICVkdGggaXRlbSB3YXMgdHJ1bmNh dGVkXG4iLCBsZiArIDEpOwoJCQkJCU1ZTE9HKERFVEFJTF9MT0dfTEVWRUwsICJUaGUgYnVm ZmVyIHNpemUgPSAiIEZPUk1BVF9MRU4sIG9wdHMtPmJpbmRpbmdzW2xmXS5idWZsZW4pOwoJ CQkJCU1ZTE9HKERFVEFJTF9MT0dfTEVWRUwsICIgYW5kIHRoZSB2YWx1ZSBpcyAnJXMnXG4i LCB2YWx1ZSk7CgkJCQkJcmVzdWx0ID0gU1FMX1NVQ0NFU1NfV0lUSF9JTkZPOwoJCQkJCWJy ZWFrOwoKCQkJCWNhc2UgQ09QWV9JTlZBTElEX1NUUklOR19DT05WRVJTSU9OOiAgICAvKiBp bnZhbGlkIHN0cmluZyAqLwoJCQkJCVNDX3NldF9lcnJvcihzZWxmLCBTVE1UX1NUUklOR19D T05WRVJTSU9OX0VSUk9SLCAiaW52YWxpZCBzdHJpbmcgY29udmVyc2lvbiBvY2N1cmVkLiIs IGZ1bmMpOwoJCQkJCXJlc3VsdCA9IFNRTF9FUlJPUjsKCQkJCQlicmVhazsKCgkJCQkJLyog ZXJyb3IgbXNnIGFscmVhZHkgZmlsbGVkIGluICovCgkJCQljYXNlIENPUFlfR0VORVJBTF9F UlJPUjoKCQkJCQlyZXN1bHQgPSBTUUxfRVJST1I7CgkJCQkJYnJlYWs7CgoJCQkJCS8qIFRo aXMgd291bGQgbm90IGJlIG1lYW5pbmdmdWwgaW4gU1FMRmV0Y2guICovCgkJCQljYXNlIENP UFlfTk9fREFUQV9GT1VORDoKCQkJCQlicmVhazsKCgkJCQlkZWZhdWx0OgoJCQkJCVNDX3Nl dF9lcnJvcihzZWxmLCBTVE1UX0lOVEVSTkFMX0VSUk9SLCAiVW5yZWNvZ25pemVkIHJldHVy biB2YWx1ZSBmcm9tIGNvcHlfYW5kX2NvbnZlcnRfZmllbGQuIiwgZnVuYyk7CgkJCQkJcmVz dWx0ID0gU1FMX0VSUk9SOwoJCQkJCWJyZWFrOwoJCQl9CgkJfQoJfQoKCXJldHVybiByZXN1 bHQ7Cn0KCgojaW5jbHVkZSAiZGxnX3NwZWNpZmljLmgiClJFVENPREUKU0NfZXhlY3V0ZShT dGF0ZW1lbnRDbGFzcyAqc2VsZikKewoJQ1NUUiBmdW5jID0gIlNDX2V4ZWN1dGUiOwoJQ29u bmVjdGlvbkNsYXNzICpjb25uOwoJSVBERmllbGRzCSppcGRvcHRzOwoJY2hhcgkJd2FzX29r LCB3YXNfbm9uZmF0YWw7CglJbnQyCQlvbGRzdGF0dXMsCgkJCQludW1jb2xzOwoJUXVlcnlJ bmZvCXFpOwoJQ29ubkluZm8gICAqY2k7Cgl1bnNpZ25lZCBpbnQJcWZsYWcgPSAwOwoJQk9P TAkJaXNfaW5fdHJhbnMsIGlzc3VlX2JlZ2luLCBoYXNfb3V0X3BhcmE7CglCT09MCQl1c2Vf ZXh0ZW5kZWRfcHJvdG9jb2w7CglpbnQJCWZ1bmNfY3NfY291bnQgPSAwLCBpOwoJQk9PTAkJ dXNlQ3Vyc29yLCBpc1NlbGVjdFR5cGU7CglpbnQJCWVycm51bV9zYXYgPSBTVE1UX09LLCBl cnJudW07CgljaGFyCQkqZXJybXNnX3NhdiA9IE5VTEw7CglTUUxVTEVOCQlzdG10X3RpbWVv dXQ7CglRUmVzdWx0SG9sZAlyaG9sZCA9IHswfTsKCgljb25uID0gU0NfZ2V0X2Nvbm4oc2Vs Zik7CgljaSA9ICYoY29ubi0+Y29ubkluZm8pOwoKCWVycm51bV9zYXYgPSBTQ19nZXRfZXJy b3JudW1iZXIoc2VsZik7CgllcnJtc2dfc2F2ID0gU0NfZ2V0X2Vycm9ybXNnKHNlbGYpOwoJ aWYgKE5VTEwgIT0gZXJybXNnX3NhdikKCQllcnJtc2dfc2F2ID0gc3RyZHVwKGVycm1zZ19z YXYpOwoJU0Nfc2V0X2Vycm9yKHNlbGYsIFNUTVRfT0ssIE5VTEwsIF9fRlVOQ1RJT05fXyk7 CgoJLyogQmVnaW4gYSB0cmFuc2FjdGlvbiBpZiBvbmUgaXMgbm90IGFscmVhZHkgaW4gcHJv Z3Jlc3MgKi8KCgkvKgoJICogQmFzaWNhbGx5IHdlIGRvbid0IGhhdmUgdG8gYmVnaW4gYSB0 cmFuc2FjdGlvbiBpbiBhdXRvY29tbWl0IG1vZGUKCSAqIGJlY2F1c2UgUG9zdGdyZXMgYmFj a2VuZCBydW5zIGluIGF1dG9jb21pdCBtb2RlLiBXZSBpc3N1ZSAiQkVHSU4iCgkgKiBpbiB0 aGUgZm9sbG93aW5nIGNhc2VzLiAxKSB3ZSB1c2UgZGVjbGFyZS9mZXRjaCBhbmQgdGhlIHN0 YXRlbWVudAoJICogaXMgU0VMRUNUIChiZWNhdXNlIGRlY2xhcmUvZmV0Y2ggbXVzdCBiZSBj YWxsZWQgaW4gYSB0cmFuc2FjdGlvbikuCgkgKiAyKSB3ZSBhcmUgaW4gYXV0b2NvbW1pdCBv ZmYgc3RhdGUgYW5kIHRoZSBzdGF0ZW1lbnQgaXNuJ3Qgb2YgdHlwZQoJICogT1RIRVIuCgkg Ki8KI2RlZmluZQlyZXR1cm4JRE9OVF9DQUxMX1JFVFVSTl9GUk9NX0hFUkU/Pz8KCUVOVEVS X0lOTkVSX0NPTk5fQ1MoY29ubiwgZnVuY19jc19jb3VudCk7CglvbGRzdGF0dXMgPSBjb25u LT5zdGF0dXM7CglpZiAoQ09OTl9FWEVDVVRJTkcgPT0gY29ubi0+c3RhdHVzKQoJewoJCVND X3NldF9lcnJvcihzZWxmLCBTVE1UX1NFUVVFTkNFX0VSUk9SLCAiQ29ubmVjdGlvbiBpcyBh bHJlYWR5IGluIHVzZS4iLCBmdW5jKTsKCQlNWUxPRygwLCAicHJvYmxlbSB3aXRoIGNvbm5l Y3Rpb25cbiIpOwoJCWdvdG8gY2xlYW51cDsKCX0KCWlzX2luX3RyYW5zID0gQ0NfaXNfaW5f dHJhbnMoY29ubik7CglpZiAoKHVzZUN1cnNvciA9IFNDX2lzX2ZldGNoY3Vyc29yKHNlbGYp KSkKCXsKCQlRUmVzdWx0Q2xhc3MgKmN1cnJlcyA9IFNDX2dldF9DdXJyZXMoc2VsZik7CgoJ CWlmIChOVUxMICE9IGN1cnJlcyAmJgoJCSAgICBjdXJyZXMtPmRhdGFGaWxsZWQpCgkJCXVz ZUN1cnNvciA9IChOVUxMICE9IFFSX2dldF9jdXJzb3IoY3VycmVzKSk7Cgl9CgkvKiBpc3N1 ZSBCRUdJTiA/ICovCglpc3N1ZV9iZWdpbiA9IFRSVUU7CglpZiAoIXNlbGYtPmV4dGVybmFs KQoJCWlzc3VlX2JlZ2luID0gRkFMU0U7CgllbHNlIGlmIChpc19pbl90cmFucykKCXsKCQlp c3N1ZV9iZWdpbiA9IEZBTFNFOwoJCWlmIChTVE1UX1RZUEVfU1RBUlQgPT0gc2VsZi0+c3Rh dGVtZW50X3R5cGUgJiYKCQkgICAgQ0NfZG9lc19hdXRvY29tbWl0KGNvbm4pKQoJCXsKCQkJ Q0NfY29tbWl0KGNvbm4pOwoJCQlpc19pbl90cmFucyA9IENDX2lzX2luX3RyYW5zKGNvbm4p OwoJCX0KCX0KCWVsc2UgaWYgKENDX2RvZXNfYXV0b2NvbW1pdChjb25uKSAmJgoJCSAoIXVz ZUN1cnNvcgoJICAgIC8qIHx8IFNDX2lzX3dpdGhfaG9sZChzZWxmKSB0aGl3IHdvdWxkIGxv c2UgdGhlIHBlcmZvcm1hbmNlICovCgkJICkpCgkJaXNzdWVfYmVnaW4gPSBGQUxTRTsKCWVs c2UgaWYgKHNlbGYtPnN0YXRlbWVudF90eXBlID09IFNUTVRfVFlQRV9TUEVDSUFMKQoJewoJ CS8qCgkJICogU29tZSB1dGlsaXR5IGNvbW1hbmRzIGxpa2UgVkFDVVVNIGNhbm5vdCBiZSBy dW4gaW4gYSB0cmFuc2FjdGlvbgoJCSAqIGJsb2NrLCBzbyBkb24ndCBiZWdpbiBvbmUgZXZl biBpZiBhdXRvLWNvbW1pdCBtb2RlIGlzIGRpc2FibGVkLgoJCSAqCgkJICogQW4gYXBwbGlj YXRpb24gc2hvdWxkIG5ldmVyIGlzc3VlIGFuIGV4cGxpY2l0IEJFR0lOIHdoZW4KCQkgKiBh dXRvLWNvbW1pdCBtb2RlIGlzIGRpc2FibGVkIChwcm9iYWJseSBub3QgZXZlbiB3aGVuIGl0 J3MgZW5hYmxlZCwKCQkgKiBhY3R1YWxseSkuIFdlIHVzZWQgdG8gYWxzbyBzdXBwcmVzcyB0 aGUgaW1wbGljaXQgQkVHSU4gd2hlbiB0aGUKCQkgKiBzdGF0ZW1lbnQgd2FzIG9mIFNUTVRf VFlQRV9TVEFSVCB0eXBlLCBpZS4gaWYgdGhlIGFwcGxpY2F0aW9uCgkJICogaXNzdWVkIGFu IGV4cGxpY2l0IEJFR0lOLCBidXQgdGhhdCBhY3R1YWxseSBzZWVtcyBsaWtlIGEgYmFkIGlk ZWEuCgkJICogRmlyc3Qgb2YgYWxsLCBpZiB5b3UgaXNzdWUgYSBCRUdJTiB0d2ljZSB0aGUg YmFja2VuZCB3aWxsIGdpdmUgYQoJCSAqIHdhcm5pbmcgd2hpY2ggY2FuIGJlIGhlbHBmdWwg dG8gc3BvdCBtaXN0YWtlcyBpbiB0aGUgYXBwbGljYXRpb24KCQkgKiAoYmVjYXVzZSBpdCBz aG91bGRuJ3QgYmUgZG9pbmcgdGhhdCkuCgkJICovCgkJaXNzdWVfYmVnaW4gPSBGQUxTRTsK CX0KCWlmIChpc3N1ZV9iZWdpbikKCXsKCQlNWUxPRygwLCAiICAgYWJvdXQgdG8gYmVnaW4g YSB0cmFuc2FjdGlvbiBvbiBzdGF0ZW1lbnQgPSAlcFxuIiwgc2VsZik7CgkJcWZsYWcgfD0g R09fSU5UT19UUkFOU0FDVElPTjsKCX0KCgkvKgoJICogSWYgdGhlIHNlc3Npb24gcXVlcnkg dGltZW91dCBzZXR0aW5nIGRpZmZlcnMgZnJvbSB0aGUgc3RhdGVtZW50IG9uZSwKCSAqIGNo YW5nZSBpdC4KCSAqLwoJc3RtdF90aW1lb3V0ID0gY29ubi0+Y29ubkluZm8uaWdub3JlX3Rp bWVvdXQgPyAwIDogc2VsZi0+b3B0aW9ucy5zdG10X3RpbWVvdXQ7CglpZiAoY29ubi0+c3Rt dF90aW1lb3V0X2luX2VmZmVjdCAhPSBzdG10X3RpbWVvdXQpCgl7CgkJY2hhciBxdWVyeVs2 NF07CgkJUVJlc3VsdENsYXNzICpyZXM7CgoJCVNQUklOVEZfRklYRUQocXVlcnksICJTRVQg c3RhdGVtZW50X3RpbWVvdXQgPSAlZCIsCgkJCQkgKGludCkgc3RtdF90aW1lb3V0ICogMTAw MCk7CgkJcmVzID0gQ0Nfc2VuZF9xdWVyeShjb25uLCBxdWVyeSwgTlVMTCwgMCwgTlVMTCk7 CgkJaWYgKFFSX2NvbW1hbmRfbWF5YmVfc3VjY2Vzc2Z1bChyZXMpKQoJCQljb25uLT5zdG10 X3RpbWVvdXRfaW5fZWZmZWN0ID0gc3RtdF90aW1lb3V0OwoJCVFSX0Rlc3RydWN0b3IocmVz KTsKCX0KCglpZiAoIVNDX1NldEV4ZWN1dGluZyhzZWxmLCBUUlVFKSkKCXsKCQlTQ19zZXRf ZXJyb3Ioc2VsZiwgU1RNVF9PUEVSQVRJT05fQ0FOQ0VMTEVELCAiQ2FuY2VsIFJldWVzdCBB Y2NlcHRlZCIsIGZ1bmMpOwoJCWdvdG8gY2xlYW51cDsKCX0KCWNvbm4tPnN0YXR1cyA9IENP Tk5fRVhFQ1VUSU5HOwoKCS8qIElmIGl0J3MgYSBTRUxFQ1Qgc3RhdGVtZW50LCB1c2UgYSBj dXJzb3IuICovCgoJLyoKCSAqIE5vdGUgdGhhdCB0aGUgZGVjbGFyZSBjdXJzb3IgaGFzIGFs cmVhZHkgYmVlbiBwcmVwZW5kZWQgdG8gdGhlCgkgKiBzdGF0ZW1lbnQKCSAqLwoJLyogaW4g Y29weV9zdGF0ZW1lbnQuLi4gKi8KCWlmIChzZWxmLT5zdG10X3dpdGhfcGFyYW1zKQoJCXVz ZV9leHRlbmRlZF9wcm90b2NvbCA9IEZBTFNFOwoJZWxzZQoJewoJCXVzZV9leHRlbmRlZF9w cm90b2NvbCA9IFRSVUU7Cgl9Cglpc1NlbGVjdFR5cGUgPSAoU0NfbWF5X3VzZV9jdXJzb3Io c2VsZikgfHwgc2VsZi0+c3RhdGVtZW50X3R5cGUgPT0gU1RNVF9UWVBFX1BST0NDQUxMKTsK CWlmICh1c2VfZXh0ZW5kZWRfcHJvdG9jb2wpCgl7CgkJUVJlc3VsdENsYXNzICpmaXJzdDsK CgkJaWYgKGlzc3VlX2JlZ2luKQoJCQlDQ19iZWdpbihjb25uKTsKCgkJZmlyc3QgPSBsaWJw cV9iaW5kX2FuZF9leGVjKHNlbGYpOwoJCWlmICghZmlyc3QpCgkJewoJCQlpZiAoU0NfZ2V0 X2Vycm9ybnVtYmVyKHNlbGYpIDw9IDApCgkJCXsKCQkJCVNDX3NldF9lcnJvcihzZWxmLCBT VE1UX05PX1JFU1BPTlNFLCAiQ291bGQgbm90IHJlY2VpdmUgdGhlIHJlc3BvbnNlLCBjb21t dW5pY2F0aW9uIGRvd24gPz8iLCBmdW5jKTsKCQkJfQoJCQlnb3RvIGNsZWFudXA7CgkJfQoJ CXJob2xkLmZpcnN0ID0gcmhvbGQubGFzdCA9IGZpcnN0OwoJfQoJZWxzZSBpZiAoaXNTZWxl Y3RUeXBlKQoJewoJCWNoYXIJCWZldGNoWzEyOF07CgkJY29uc3QgY2hhciAqYXBwZW5kcSA9 IE5VTEw7CgkJUXVlcnlJbmZvCSpxcnlpID0gTlVMTDsKCQlRUmVzdWx0Q2xhc3MgKmZpcnN0 OwoKCQlxZmxhZyB8PSAoU1FMX0NPTkNVUl9SRUFEX09OTFkgIT0gc2VsZi0+b3B0aW9ucy5z Y3JvbGxfY29uY3VycmVuY3kgPyBDUkVBVEVfS0VZU0VUIDogMCk7CgkJTVlMT0coMCwgIiAg ICAgICBTZW5kaW5nIFNFTEVDVCBzdGF0ZW1lbnQgb24gc3RtdD0lcCwgY3Vyc29yX25hbWU9 JyVzJyBxZmxhZz0lZCwiIEZPUk1BVF9VSU5URUdFUiAiXG4iLCBzZWxmLCBTQ19jdXJzb3Jf bmFtZShzZWxmKSwgcWZsYWcsIHNlbGYtPm9wdGlvbnMuc2Nyb2xsX2NvbmN1cnJlbmN5KTsK CgkJLyogc2VuZCB0aGUgZGVjbGFyZS9zZWxlY3QgKi8KCQlpZiAodXNlQ3Vyc29yKQoJCXsK CQkJcWkucmVzdWx0X2luID0gTlVMTDsKCQkJcWkuY3Vyc29yID0gU0NfY3Vyc29yX25hbWUo c2VsZik7CgkJCXFpLmZldGNoX3NpemUgPSBxaS5yb3dfc2l6ZSA9IGNpLT5kcml2ZXJzLmZl dGNoX21heDsKCQkJU1BSSU5URl9GSVhFRChmZXRjaCwKCQkJCQkgImZldGNoICIgRk9STUFU X0xFTiAiIGluIFwiJXNcIiIsCgkJCQkJIHFpLmZldGNoX3NpemUsIFNDX2N1cnNvcl9uYW1l KHNlbGYpKTsKCQkJcXJ5aSA9ICZxaTsKCQkJYXBwZW5kcSA9IGZldGNoOwoJCQlxZmxhZyAm PSAoflJFQURfT05MWV9RVUVSWSk7IC8qIG11c3QgYmUgYSBTQVZFUE9JTlQgYWZ0ZXIgREVD TEFSRSAqLwoJCX0KCQlyaG9sZCA9IENDX3NlbmRfcXVlcnlfYXBwZW5kKGNvbm4sIHNlbGYt PnN0bXRfd2l0aF9wYXJhbXMsIHFyeWksIHFmbGFnLCBTQ19nZXRfYW5jZXN0b3Ioc2VsZiks IGFwcGVuZHEpOwoJCWZpcnN0ID0gcmhvbGQuZmlyc3Q7CQoJCWlmICh1c2VDdXJzb3IgJiYg UVJfY29tbWFuZF9tYXliZV9zdWNjZXNzZnVsKGZpcnN0KSkKCQl7CgkJCS8qCgkJCSAqIElm IHdlIHNlbnQgYSBERUNMQVJFIENVUlNPUiArIEZFVENILCB0aHJvdyBhd2F5IHRoZSByZXN1 bHQgb2YKCQkJICogdGhlIERFQ0xBUkUgQ1VSU09SIHN0YXRlbWVudCwgYW5kIG9ubHkgcmV0 dXJuIHRoZSByZXN1bHQgb2YgdGhlCgkJCSAqIEZFVENIIHRvIHRoZSBjYWxsZXIuIEhvd2V2 ZXIsIGlmIHdlIHJlY2VpdmVkIGFueSBOT1RJQ0VzIGFzCgkJCSAqIHBhcnQgb2YgdGhlIERF Q0xBUkUgQ1VSU09SLCBjYXJyeSB0aG9zZSBvdmVyLgoJCQkgKi8KCQkJaWYgKGFwcGVuZHEp CgkJCXsKCQkJCVFSZXN1bHRDbGFzcwkqcXJlcywgKm5yZXM7CgoJCQkJZm9yIChxcmVzID0g Zmlyc3Q7IHFyZXM7KQoJCQkJewoJCQkJCWlmIChxcmVzLT5jb21tYW5kICYmIHN0cm5pY21w KHFyZXMtPmNvbW1hbmQsICJmZXRjaCIsIDUpID09IDApCgkJCQkJewoJCQkJCQlicmVhazsK CQkJCQl9CgkJCQkJbnJlcyA9IFFSX25leHRyKHFyZXMpOwoJCQkJCWlmIChucmVzICYmIFFS X2dldF9ub3RpY2UocXJlcykgIT0gTlVMTCkKCQkJCQl7CgkJCQkJCWlmIChRUl9jb21tYW5k X3N1Y2Nlc3NmdWwobnJlcykgJiYKCQkJCQkJCVFSX2NvbW1hbmRfbm9uZmF0YWwocXJlcykp CgkJCQkJCXsKCQkJCQkJCVFSX3NldF9yc3RhdHVzKG5yZXMsIFBPUkVTX05PTkZBVEFMX0VS Uk9SKTsKCQkJCQkJfQoJCQkJCQlRUl9hZGRfbm90aWNlKG5yZXMsIFFSX2dldF9ub3RpY2Uo cXJlcykpOwoJCQkJCX0KCQkJCQlRUl9kZXRhY2gocXJlcyk7CgkJCQkJUVJfRGVzdHJ1Y3Rv cihxcmVzKTsKCQkJCQlxcmVzID0gbnJlczsKCgkJCQkJLyoKCQkJCQkgKiBJZiB3ZSByZWNl aXZlZCBmZXdlciByb3dzIHRoYW4gcmVxdWVzdGVkLCB0aGVyZSBhcmUgbm8KCQkJCQkgKiBt b3JlIHJvd3MgdG8gZmV0Y2guCgkJCQkJICovCgkJCQkJaWYgKHFyZXMgJiYgcXJlcy0+bnVt X2NhY2hlZF9yb3dzIDwgcWkucm93X3NpemUpIC8qIGNoZWNrIHFyZXMgIT0gTlVMTCBmb3Ig c2FmZXR5ICovCgkJCQkJCVFSX3NldF9yZWFjaGVkX2VvZihxcmVzKTsKCQkJCX0KCQkJCWZp cnN0ID0gcXJlczsKCQkJCXJob2xkLmZpcnN0ID0gZmlyc3Q7CgkJCX0KCQkJaWYgKGZpcnN0 ICYmIFNDX2lzX3dpdGhfaG9sZChzZWxmKSkKCQkJCVFSX3NldF93aXRoaG9sZChmaXJzdCk7 CgkJfQoJCU1ZTE9HKDAsICIgICAgIGRvbmUgc2VuZGluZyB0aGUgcXVlcnk6XG4iKTsKCX0K CWVsc2UKCXsKCQkvKiBub3QgYSBTRUxFQ1Qgc3RhdGVtZW50IHNvIGRvbid0IHVzZSBhIGN1 cnNvciAqLwoJCU1ZTE9HKDAsICIgICAgICBpdCdzIE5PVCBhIHNlbGVjdCBzdGF0ZW1lbnQ6 IHN0bXQ9JXBcbiIsIHNlbGYpOwoJCXJob2xkID0gQ0Nfc2VuZF9xdWVyeV9hcHBlbmQoY29u biwgc2VsZi0+c3RtdF93aXRoX3BhcmFtcywgTlVMTCwgcWZsYWcsIFNDX2dldF9hbmNlc3Rv cihzZWxmKSwgTlVMTCk7Cgl9CgoJaWYgKCFpc1NlbGVjdFR5cGUpCgl7CgkJLyoKCQkgKiBX ZSBzaG91bGRuJ3Qgc2VuZCBDT01NSVQuIFBvc3RncmVzIGJhY2tlbmQgZG9lcyB0aGUgYXV0 b2NvbW1pdAoJCSAqIGlmIG5lY2Nlc3NhcnkuIChab2x0YW4sIDA0LzI2LzIwMDApCgkJICov CgoJCS8qCgkJICogQWJvdmUgc2VlbXMgd3JvbmcuIEV2ZW4gaW4gY2FzZSBvZiBhdXRvY29t bWl0LCBzdGFydGVkCgkJICogdHJhbnNhY3Rpb25zIG11c3QgYmUgY29tbWl0dGVkLiAoSGly b3NoaSwgMDIvMTEvMjAwMSkKCQkgKi8KCQlpZiAoQ0NfaXNfaW5fdHJhbnMoY29ubikpCgkJ ewoJCQlpZiAoIWlzX2luX3RyYW5zKQoJCQkJQ0Nfc2V0X2luX21hbnVhbF90cmFucyhjb25u KTsKCQkJaWYgKHNlbGYtPmV4dGVybmFsICYmIENDX2RvZXNfYXV0b2NvbW1pdChjb25uKSkK CQkJCUNDX2NvbW1pdChjb25uKTsKCQl9Cgl9CgoJaWYgKENPTk5fRE9XTiAhPSBjb25uLT5z dGF0dXMpCgkJY29ubi0+c3RhdHVzID0gb2xkc3RhdHVzOwoJc2VsZi0+c3RhdHVzID0gU1RN VF9GSU5JU0hFRDsKTVlMT0coMCwgInNldCAlcCBTVE1UX0ZJTklTSEVEXG4iLCBzZWxmKTsK CUxFQVZFX0lOTkVSX0NPTk5fQ1MoZnVuY19jc19jb3VudCwgY29ubik7CgoJLyogQ2hlY2sg dGhlIHN0YXR1cyBvZiB0aGUgcmVzdWx0ICovCglpZiAocmhvbGQuZmlyc3QpCgl7CgkJUVJl c3VsdENsYXNzICpmaXJzdCA9IHJob2xkLmZpcnN0OwoKCQl3YXNfb2sgPSBRUl9jb21tYW5k X3N1Y2Nlc3NmdWwoZmlyc3QpOwoJCXdhc19ub25mYXRhbCA9IFFSX2NvbW1hbmRfbm9uZmF0 YWwoZmlyc3QpOwoKCQlpZiAoMCA8IFNDX2dldF9lcnJvcm51bWJlcihzZWxmKSkKCQkJOwoJ CWVsc2UgaWYgKHdhc19vaykKCQl7CgkJCWlmIChzZWxmLT5oYXNfbm90aWNlICYmCgkJCSAg ICAwID09IFNDX2dldF9lcnJvcm51bWJlcihzZWxmKSkKCQkJCVNDX3NldF9lcnJvcm51bWJl cihzZWxmLCBTVE1UX0lORk9fT05MWSk7CgkJfQoJCWVsc2UgaWYgKHdhc19ub25mYXRhbCkK CQl7CgkJCXNlbGYtPmhhc19ub3RpY2UgPSAxOwoJCQlpZiAoMCA9PSBTQ19nZXRfZXJyb3Ju dW1iZXIoc2VsZikpCgkJCQlTQ19zZXRfZXJyb3JudW1iZXIoc2VsZiwgU1RNVF9JTkZPX09O TFkpOwoJCX0KCQllbHNlCgkJCVNDX3NldF9lcnJvcmluZm8oc2VsZiwgZmlyc3QsIDApOwoJ CS8qIHNldCBjdXJzb3IgYmVmb3JlIHRoZSBmaXJzdCB0dXBsZSBpbiB0aGUgbGlzdCAqLwoJ CXNlbGYtPmN1cnJUdXBsZSA9IC0xOwoJCVNDX3NldF9jdXJyZW50X2NvbChzZWxmLCAtMSk7 CgkJU0Nfc2V0X3Jvd3NldF9zdGFydChzZWxmLCAtMSwgRkFMU0UpOwoKCQkvKiBpc3N1ZSAi QUJPUlQiIHdoZW4gcXVlcnkgYWJvcnRlZCAqLwoJCWlmIChRUl9nZXRfYWJvcnRlZChmaXJz dCkpCgkJewoJCX0KCQllbHNlCgkJewoJCQlRUmVzdWx0Q2xhc3MJKnRyZXM7CgoJCQkvKiBz ZWUgaWYgdGhlIHF1ZXJ5IGRpZCByZXR1cm4gYW55IHJlc3VsdCBjb2x1bW5zICovCgkJCWZv ciAodHJlcyA9IGZpcnN0LCBudW1jb2xzID0gMDsgIW51bWNvbHMgJiYgdHJlczsgdHJlcyA9 IFFSX25leHRyKHRyZXMpKQoJCQl7CgkJCQludW1jb2xzID0gUVJfTnVtUmVzdWx0Q29scyh0 cmVzKTsKCQkJfQoJCQkvKiBub3cgYWxsb2NhdGUgdGhlIGFycmF5IHRvIGhvbGQgdGhlIGJp bmRpbmcgaW5mbyAqLwoJCQlpZiAobnVtY29scyA+IDApCgkJCXsKCQkJCUFSREZpZWxkcwkq b3B0cyA9IFNDX2dldF9BUkRGKHNlbGYpOwoJCQkJZXh0ZW5kX2NvbHVtbl9iaW5kaW5ncyhv cHRzLCBudW1jb2xzKTsKCQkJCWlmIChvcHRzLT5iaW5kaW5ncyA9PSBOVUxMKQoJCQkJewoJ CQkJCVFSX0Rlc3RydWN0b3IoZmlyc3QpOwoJCQkJCVNDX3NldF9lcnJvcihzZWxmLCBTVE1U X05PX01FTU9SWV9FUlJPUiwiQ291bGQgbm90IGdldCBlbm91Z2ggZnJlZSBtZW1vcnkgdG8g c3RvcmUgdGhlIGJpbmRpbmcgaW5mb3JtYXRpb24iLCBmdW5jKTsKCQkJCQlnb3RvIGNsZWFu dXA7CgkJCQl9CgkJCX0KCk1ZTE9HKERFVEFJTF9MT0dfTEVWRUwsICIhISVwLT5taXNjaW5m bz0leCByZXM9JXBcbiIsIHNlbGYsIHNlbGYtPm1pc2NpbmZvLCBmaXJzdCk7CgkJCS8qCgkJ CSAqIHNwZWNpYWwgaGFuZGxpbmcgb2YgcmVzdWx0IGZvciBrZXlzZXQgZHJpdmVuIGN1cnNv cnMuCgkJCSAqIFVzZSB0aGUgY29sdW1ucyBpbmZvIG9mIHRoZSAxc3QgcXVlcnkgYW5kCgkJ CSAqIHVzZXIgdGhlIGtleXNldCBpbmZvIG9mIHRoZSAybmQgcXVlcnkuCgkJCSAqLwoJCQlp ZiAoU1FMX0NVUlNPUl9LRVlTRVRfRFJJVkVOID09IHNlbGYtPm9wdGlvbnMuY3Vyc29yX3R5 cGUgJiYKCQkJICAgIFNRTF9DT05DVVJfUkVBRF9PTkxZICE9IHNlbGYtPm9wdGlvbnMuc2Ny b2xsX2NvbmN1cnJlbmN5ICYmCgkJCSAgICAhdXNlQ3Vyc29yKQoJCQl7CgkJCQlpZiAodHJl cyA9IFFSX25leHRyKGZpcnN0KSwgdHJlcykKCQkJCXsKCQkJCQlRUl9zZXRfZmllbGRzKHRy ZXMsIFFSX2dldF9maWVsZHMoZmlyc3QpKTsKCQkJCQlRUl9zZXRfZmllbGRzKGZpcnN0LCAg TlVMTCk7CgkJCQkJdHJlcy0+bnVtX2ZpZWxkcyA9IGZpcnN0LT5udW1fZmllbGRzOwoJCQkJ CVFSX2RldGFjaChmaXJzdCk7CgkJCQkJU0Nfc2V0X1Jlc3VsdChzZWxmLCB0cmVzKTsKCQkJ CQlyaG9sZCA9IHNlbGYtPnJob2xkOwoJCQkJfQoJCQl9CgkJfQoJfQoJZWxzZQoJewoJCS8q IEJhZCBFcnJvciAtLSBUaGUgZXJyb3IgbWVzc2FnZSB3aWxsIGJlIGluIHRoZSBDb25uZWN0 aW9uICovCgkJaWYgKCFjb25uLT5wcWNvbm4pCgkJCVNDX3NldF9lcnJvcihzZWxmLCBTVE1U X0JBRF9FUlJPUiwgQ0NfZ2V0X2Vycm9ybXNnKGNvbm4pLCBmdW5jKTsKCQllbHNlIGlmIChz ZWxmLT5zdGF0ZW1lbnRfdHlwZSA9PSBTVE1UX1RZUEVfQ1JFQVRFKQoJCXsKCQkJU0Nfc2V0 X2Vycm9yKHNlbGYsIFNUTVRfQ1JFQVRFX1RBQkxFX0VSUk9SLCAiRXJyb3IgY3JlYXRpbmcg dGhlIHRhYmxlIiwgZnVuYyk7CgoJCQkvKgoJCQkgKiBUaGlzIHdvdWxkIGFsbG93IHRoZSB0 YWJsZSB0byBhbHJlYWR5IGV4aXN0cywgdGh1cwoJCQkgKiBhcHBlbmRpbmcgcm93cyB0byBp dC4gIEJVVCwgaWYgdGhlIHRhYmxlIGRpZG4ndCBoYXZlIHRoZQoJCQkgKiBzYW1lIGF0dHJp YnV0ZXMsIGl0IHdvdWxkIGZhaWwuIHJldHVybgoJCQkgKiBTUUxfU1VDQ0VTU19XSVRIX0lO Rk87CgkJCSAqLwoJCX0KCQllbHNlCgkJewoJCQlTQ19zZXRfZXJyb3Ioc2VsZiwgU1RNVF9F WEVDX0VSUk9SLCBDQ19nZXRfZXJyb3Jtc2coY29ubiksIGZ1bmMpOwoJCX0KCgl9CglpZiAo IVNDX2dldF9SZXN1bHQoc2VsZikpCgkJU0Nfc2V0X1Jlc3VsdEhvbGQoc2VsZiwgcmhvbGQp OwoJZWxzZQoJewoJCWlmIChzZWxmLT5yaG9sZC5sYXN0ICE9IHJob2xkLmZpcnN0KQoJCQlR Ul9jb25jYXQoc2VsZi0+cmhvbGQubGFzdCwgcmhvbGQuZmlyc3QpOwoJCXNlbGYtPnJob2xk Lmxhc3QgPSByaG9sZC5sYXN0OwoJfQoJaWYgKE5VTEwgPT0gU0NfZ2V0X0N1cnJlcyhzZWxm KSkKCQlTQ19zZXRfQ3VycmVzKHNlbGYsIFNDX2dldF9SZXN1bHQoc2VsZikpOwoKCWlmIChz ZWxmLT5zdGF0ZW1lbnRfdHlwZSA9PSBTVE1UX1RZUEVfUFJPQ0NBTEwgJiYKCQkoU0NfZ2V0 X2Vycm9ybnVtYmVyKHNlbGYpID09IFNUTVRfT0sgfHwKCQkgU0NfZ2V0X2Vycm9ybnVtYmVy KHNlbGYpID09IFNUTVRfSU5GT19PTkxZKSkKCXsKCQlJbnQyCWlvLCBvdXQ7CgkJaGFzX291 dF9wYXJhID0gKENvdW50UGFyYW1ldGVycyhzZWxmLCBOVUxMLCAmaW8sICZvdXQpID4gMCk7 CgkJaWYgKGhhc19vdXRfcGFyYSkKCQl7CS8qIGdldCB0aGUgcmV0dXJuIHZhbHVlIG9mIHRo ZSBwcm9jZWR1cmUgY2FsbCAqLwoJCQlSRVRDT0RFCQlyZXQ7CgkJCUhTVE1UCQloc3RtdCA9 IChIU1RNVCkgc2VsZjsKCgkJCWlwZG9wdHMgPSBTQ19nZXRfSVBERihzZWxmKTsKCQkJc2Vs Zi0+YmluZF9yb3cgPSAwOwoJCQlyZXQgPSBTQ19mZXRjaChoc3RtdCk7Ck1ZTE9HKERFVEFJ TF9MT0dfTEVWRUwsICIhIVNDX2ZldGNoIHJldHVybiA9JWRcbiIsIHJldCk7CgkJCWlmIChT UUxfU1VDQ0VFREVEKHJldCkpCgkJCXsKCQkJCUFQREZpZWxkcwkqYXBkb3B0cyA9IFNDX2dl dF9BUERGKHNlbGYpOwoJCQkJU1FMVUxFTgkJb2Zmc2V0ID0gYXBkb3B0cy0+cGFyYW1fb2Zm c2V0X3B0ciA/ICphcGRvcHRzLT5wYXJhbV9vZmZzZXRfcHRyIDogMDsKCQkJCUFSREZpZWxk cwkqYXJkb3B0cyA9IFNDX2dldF9BUkRGKHNlbGYpOwoJCQkJY29uc3QgUGFyYW1ldGVySW5m b0NsYXNzCSphcGFyYTsKCQkJCWNvbnN0IFBhcmFtZXRlckltcGxDbGFzcwkqaXBhcmE7CgkJ CQlpbnQJc2F2ZV9iaW5kX3NpemUgPSBhcmRvcHRzLT5iaW5kX3NpemUsIGdpZHgsIG51bV9w OwoKCQkJCWFyZG9wdHMtPmJpbmRfc2l6ZSA9IGFwZG9wdHMtPnBhcmFtX2JpbmRfdHlwZTsK CQkJCW51bV9wID0gc2VsZi0+bnVtX3BhcmFtczsKCQkJCWlmIChpcGRvcHRzLT5hbGxvY2F0 ZWQgPCBudW1fcCkKCQkJCQludW1fcCA9IGlwZG9wdHMtPmFsbG9jYXRlZDsKCQkJCWZvciAo aSA9IDAsIGdpZHggPSAwOyBpIDwgbnVtX3A7IGkrKykKCQkJCXsKCQkJCQlpbnQgaWNvbCA9 IGdpZHg7CgkJCQkJaXBhcmEgPSBpcGRvcHRzLT5wYXJhbWV0ZXJzICsgaTsKCQkJCQlpZiAo aXBhcmEtPnBhcmFtVHlwZSA9PSBTUUxfUEFSQU1fT1VUUFVUIHx8CgkJCQkJICAgIGlwYXJh LT5wYXJhbVR5cGUgPT0gU1FMX1BBUkFNX0lOUFVUX09VVFBVVCkKCQkJCQl7CgkJCQkJCWlm IChOQU1FX0lTX1ZBTElEKGlwYXJhLT5wYXJhbU5hbWUpKQoJCQkJCQl7CgkJCQkJCQlpY29s ID0gUVJfc2VhcmNoX2J5X2ZpZWxkbmFtZShyaG9sZC5maXJzdCwgR0VUX05BTUUoaXBhcmEt PnBhcmFtTmFtZSkpOwoJCQkJCQkJaWYgKGljb2wgPCAwKQoJCQkJCQkJewoJCQkJCQkJCVND X3NldF9lcnJvcihzZWxmLCBTVE1UX0VYRUNfRVJST1IsICJOYW1lZCBvdXRwdXQgcGFyYW1l dGVyIGRvZXMgbm90IGV4aXN0LiIsIGZ1bmMpOwoJCQkJCQkJCWJyZWFrOwoJCQkJCQkJfQoJ CQkJCQl9CgkJCQkJCWFwYXJhID0gYXBkb3B0cy0+cGFyYW1ldGVycyArIGk7CgkJCQkJCXJl dCA9IFBHQVBJX0dldERhdGEoaHN0bXQsIGljb2wgKyAxLCBhcGFyYS0+Q1R5cGUsIGFwYXJh LT5idWZmZXIgKyBvZmZzZXQsIGFwYXJhLT5idWZsZW4sIGFwYXJhLT51c2VkID8gTEVOQURE Ul9TSElGVChhcGFyYS0+dXNlZCwgb2Zmc2V0KSA6IE5VTEwpOwoJCQkJCQlpZiAoIVNRTF9T VUNDRUVERUQocmV0KSkKCQkJCQkJewoJCQkJCQkJU0Nfc2V0X2Vycm9yKHNlbGYsIFNUTVRf RVhFQ19FUlJPUiwgIkdldERhdGEgdG8gUHJvY2VkdXJlIHJldHVybiBmYWlsZWQuIiwgZnVu Yyk7CgkJCQkJCQlicmVhazsKCQkJCQkJfQoJCQkJCQlnaWR4Kys7CgkJCQkJfQoJCQkJfQoJ CQkJYXJkb3B0cy0+YmluZF9zaXplID0gc2F2ZV9iaW5kX3NpemU7IC8qIHJlc3RvcmUgKi8K CQkJfQoJCQllbHNlCgkJCXsKCQkJCVNDX3NldF9lcnJvcihzZWxmLCBTVE1UX0VYRUNfRVJS T1IsICJTQ19mZXRjaCB0byBnZXQgYSBQcm9jZWR1cmUgcmV0dXJuIGZhaWxlZC4iLCBmdW5j KTsKCQkJfQoJCX0KCgkJaWYgKGNpLT5mZXRjaF9yZWZjdXJzb3JzKQoJCXsKCQkJY2hhcgkJ CWZldGNoWzEyOF07CgkJCVFSZXN1bHRDbGFzcyAJKmxhc3QgPSBOVUxMLCAqcmVzOwoKCQkJ LyogSXRlcmF0ZSB0aGUgY29sdW1ucyBpbiB0aGUgcmVzdWx0IHRvIGxvb2sgZm9yIHJlZmN1 cnNvcnMgKi8KCQkJbnVtY29scyA9IFFSX051bVJlc3VsdENvbHMocmhvbGQuZmlyc3QpOwoJ CQlmb3IgKGkgPSAwOyBpIDwgbnVtY29sczsgaSsrKQoJCQl7CgkJCQlNWUxPRyhERVRBSUxf TE9HX0xFVkVMLCAiISEhIG51bWZpZWxkPSVkIGZpZWxkX3R5cGU9JXVcbiIsIG51bWNvbHMs IFFSX2dldF9maWVsZF90eXBlKHJob2xkLmZpcnN0LCBpKSk7CgkJCQlpZiAoUEdfVFlQRV9S RUZDVVJTT1IgPT0gUVJfZ2V0X2ZpZWxkX3R5cGUocmhvbGQuZmlyc3QsIGkpKQoJCQkJewoJ CQkJCWlmICghQ0NfaXNfaW5fdHJhbnMoY29ubikpCgkJCQkJewoJCQkJCQlTQ19zZXRfZXJy b3Ioc2VsZiwgU1RNVF9FWEVDX0VSUk9SLCAiUXVlcnkgbXVzdCBiZSBleGVjdXRlZCBpbiBh IHRyYW5zYWN0aW9uIHdoZW4gRmV0Y2hSZWZjdXJzb3JzIHNldHRpbmcgaXMgZW5hYmxlZC4i LCBmdW5jKTsKCQkJCQkJYnJlYWs7CgkJCQkJfQoKCQkJCQlTVFJfVE9fTkFNRShzZWxmLT5j dXJzb3JfbmFtZSwgUVJfZ2V0X3ZhbHVlX2JhY2tlbmRfdGV4dChyaG9sZC5maXJzdCwgMCwg aSkpOwoJCQkJCVNDX3NldF9mZXRjaGN1cnNvcihzZWxmKTsKCQkJCQlxaS5yZXN1bHRfaW4g PSBOVUxMOwoJCQkJCXFpLmN1cnNvciA9IFNDX2N1cnNvcl9uYW1lKHNlbGYpOwoJCQkJCXFp LmZldGNoX3NpemUgPSBxaS5yb3dfc2l6ZSA9IGNpLT5kcml2ZXJzLmZldGNoX21heDsKCQkJ CQlTUFJJTlRGX0ZJWEVEKGZldGNoLCAiZmV0Y2ggIiBGT1JNQVRfTEVOICIgaW4gXCIlc1wi IiwgcWkuZmV0Y2hfc2l6ZSwgU0NfY3Vyc29yX25hbWUoc2VsZikpOwoJCQkJCXJlcyA9IEND X3NlbmRfcXVlcnkoY29ubiwgZmV0Y2gsICZxaSwgcWZsYWcgfCBSRUFEX09OTFlfUVVFUlks IFNDX2dldF9hbmNlc3RvcihzZWxmKSk7CgkJCQkJaWYgKE5VTEwgIT0gcmVzKQoJCQkJCXsK CQkJCQkJaWYgKE5VTEwgPT0gbGFzdCkKCQkJCQkJewoJCQkJCQkJLyogUmVpbml0aWFsaXNl IHdpdGggcmVzdWx0IGZldGNoZWQgZnJvbSBmaXJzdCByZWZjdXJzb3IgKi8KCQkJCQkJCVND X2luaXRfUmVzdWx0KHNlbGYpOwoJCQkJCQkJU0Nfc2V0X1Jlc3VsdChzZWxmLCByZXMpOwoJ CQkJCQl9CgkJCQkJCWVsc2UKCQkJCQkJewoJCQkJCQkJLyogQWRkIGFub3RoZXIgcmVzdWx0 IGZldGNoZWQgZnJvbSB0aGUgbmV4dCByZWZjdXJzb3IgKi8KCQkJCQkJCVFSX2NvbmNhdChs YXN0LCByZXMpOwoJCQkJCQkJc2VsZi0+bXVsdGlfc3RhdGVtZW50ID0gVFJVRTsKCQkJCQkJ fQoJCQkJCQlpZiAoIVFSX2NvbW1hbmRfbWF5YmVfc3VjY2Vzc2Z1bChyZXMpKQoJCQkJCQl7 CgkJCQkJCQlTQ19zZXRfZXJyb3JpbmZvKHNlbGYsIHJlcywgMCk7CgkJCQkJCQlRUl9EZXN0 cnVjdG9yKHJob2xkLmZpcnN0KTsKCQkJCQkJCWJyZWFrOwoJCQkJCQl9CgoJCQkJCQlsYXN0 ID0gcmVzOwoJCQkJCX0KCQkJCX0KCQkJfQoJCQlpZiAobGFzdCkKCQkJCVFSX0Rlc3RydWN0 b3IocmhvbGQuZmlyc3QpOwoJCX0KCX0KY2xlYW51cDoKI3VuZGVmCXJldHVybgoJU0NfU2V0 RXhlY3V0aW5nKHNlbGYsIEZBTFNFKTsKCUNMRUFOVVBfRlVOQ19DT05OX0NTKGZ1bmNfY3Nf Y291bnQsIGNvbm4pOwoJaWYgKENPTk5fRE9XTiAhPSBjb25uLT5zdGF0dXMpCgkJY29ubi0+ c3RhdHVzID0gb2xkc3RhdHVzOwoJLyogc2VsZi0+c3RhdHVzID0gU1RNVF9GSU5JU0hFRDsg Ki8KCWVycm51bSA9IFNDX2dldF9lcnJvcm51bWJlcihzZWxmKTsKCWlmIChlcnJudW1fc2F2 ID4gU1RNVF9PSykKCQlTQ19zZXRfZXJyb3Ioc2VsZiwgZXJybnVtX3NhdiwgZXJybXNnX3Nh diwgTlVMTCk7CgllbHNlIGlmIChlcnJudW0gPiBTVE1UX09LKQoJCTsKCWVsc2UgaWYgKGVy cm51bV9zYXYgPCBTVE1UX09LKQoJCVNDX3NldF9lcnJvcihzZWxmLCBlcnJudW1fc2F2LCBl cnJtc2dfc2F2LCBOVUxMKTsKCWlmIChOVUxMICE9IGVycm1zZ19zYXYpCgkJZnJlZShlcnJt c2dfc2F2KTsKCglpZiAoZXJybnVtID09IFNUTVRfT0spCgkJcmV0dXJuIFNRTF9TVUNDRVNT OwoJZWxzZSBpZiAoZXJybnVtIDwgU1RNVF9PSykKCQlyZXR1cm4gU1FMX1NVQ0NFU1NfV0lU SF9JTkZPOwoJZWxzZQoJewoJCWNoYXIgKmVycm1zZyA9IFNDX2dldF9lcnJvcm1zZyhzZWxm KTsKCQlpZiAoIWVycm1zZyB8fCAhZXJybXNnWzBdKQoJCXsKCQkJaWYgKFNUTVRfTk9fTUVN T1JZX0VSUk9SICE9IGVycm51bSkKCQkJCVNDX3NldF9lcnJvcm1zZyhzZWxmLCAiRXJyb3Ig d2hpbGUgZXhlY3V0aW5nIHRoZSBxdWVyeSIpOwoJCQlTQ19sb2dfZXJyb3IoZnVuYywgTlVM TCwgc2VsZik7CgkJfQoJCXJldHVybiBTUUxfRVJST1I7Cgl9Cn0KCiNkZWZpbmUJQ0FMTEJB Q0tfQUxMT0NfT05DRQk0CmludCBlbnF1ZXVlTmVlZERhdGFDYWxsYmFjayhTdGF0ZW1lbnRD bGFzcyAqc3RtdCwgTmVlZERhdGFDYWxsZnVuYyBmdW5jLCB2b2lkICpkYXRhKQp7CglpZiAo c3RtdC0+bnVtX2NhbGxiYWNrcyA+PSBzdG10LT5hbGxvY2F0ZWRfY2FsbGJhY2tzKQoJewoJ CVNDX1JFQUxMT0NfcmV0dXJuX3dpdGhfZXJyb3Ioc3RtdC0+Y2FsbGJhY2tzLCBOZWVkRGF0 YUNhbGxiYWNrLAoJCQlzaXplb2YoTmVlZERhdGFDYWxsYmFjaykgKiAoc3RtdC0+YWxsb2Nh dGVkX2NhbGxiYWNrcyArCgkJCQlDQUxMQkFDS19BTExPQ19PTkNFKSwgc3RtdCwgIk5lZWRE YXRhQ2FsbGJhY2sgZW5xdWV1ZSBlcnJvciIsIDApOwoJCXN0bXQtPmFsbG9jYXRlZF9jYWxs YmFja3MgKz0gQ0FMTEJBQ0tfQUxMT0NfT05DRTsKCX0KCXN0bXQtPmNhbGxiYWNrc1tzdG10 LT5udW1fY2FsbGJhY2tzXS5mdW5jID0gZnVuYzsKCXN0bXQtPmNhbGxiYWNrc1tzdG10LT5u dW1fY2FsbGJhY2tzXS5kYXRhID0gZGF0YTsKCXN0bXQtPm51bV9jYWxsYmFja3MrKzsKCk1Z TE9HKERFVEFJTF9MT0dfTEVWRUwsICJzdG10PSVwLCBmdW5jPSVwLCBjb3VudD0lZFxuIiwg c3RtdCwgZnVuYywgc3RtdC0+bnVtX2NhbGxiYWNrcyk7CglyZXR1cm4gc3RtdC0+bnVtX2Nh bGxiYWNrczsKfQoKUkVUQ09ERSBkZXF1ZXVlTmVlZERhdGFDYWxsYmFjayhSRVRDT0RFIHJl dGNvZGUsIFN0YXRlbWVudENsYXNzICpzdG10KQp7CglSRVRDT0RFCQkJcmV0OwoJTmVlZERh dGFDYWxsZnVuYwlmdW5jOwoJdm9pZAkJCSpkYXRhOwoJaW50CQkJaSwgY250OwoKCU1ZTE9H KDAsICJlbnRlcmluZyByZXQ9JWQgY291bnQ9JWRcbiIsIHJldGNvZGUsIHN0bXQtPm51bV9j YWxsYmFja3MpOwoJaWYgKFNRTF9ORUVEX0RBVEEgPT0gcmV0Y29kZSkKCQlyZXR1cm4gcmV0 Y29kZTsKCWlmIChzdG10LT5udW1fY2FsbGJhY2tzIDw9IDApCgkJcmV0dXJuIHJldGNvZGU7 CglmdW5jID0gc3RtdC0+Y2FsbGJhY2tzWzBdLmZ1bmM7CglkYXRhID0gc3RtdC0+Y2FsbGJh Y2tzWzBdLmRhdGE7Cglmb3IgKGkgPSAxOyBpIDwgc3RtdC0+bnVtX2NhbGxiYWNrczsgaSsr KQoJCXN0bXQtPmNhbGxiYWNrc1tpIC0gMV0gPSBzdG10LT5jYWxsYmFja3NbaV07CgljbnQg PSAtLXN0bXQtPm51bV9jYWxsYmFja3M7CglyZXQgPSAoKmZ1bmMpKHJldGNvZGUsIGRhdGEp OwoJZnJlZShkYXRhKTsKCWlmIChTUUxfTkVFRF9EQVRBICE9IHJldCAmJiBjbnQgPiAwKQoJ CXJldCA9IGRlcXVldWVOZWVkRGF0YUNhbGxiYWNrKHJldCwgc3RtdCk7CglyZXR1cm4gcmV0 Owp9Cgp2b2lkCWNhbmNlbE5lZWREYXRhU3RhdGUoU3RhdGVtZW50Q2xhc3MgKnN0bXQpCnsK CWludAljbnQgPSBzdG10LT5udW1fY2FsbGJhY2tzLCBpOwoKCXN0bXQtPm51bV9jYWxsYmFj a3MgPSAwOwoJZm9yIChpID0gMDsgaSA8IGNudDsgaSsrKQoJewoJCWlmIChzdG10LT5jYWxs YmFja3NbaV0uZGF0YSkKCQkJZnJlZShzdG10LT5jYWxsYmFja3NbaV0uZGF0YSk7Cgl9CglT Q19yZXNldF9kZWxlZ2F0ZShTUUxfRVJST1IsIHN0bXQpOwp9Cgp2b2lkClNDX2xvZ19lcnJv cihjb25zdCBjaGFyICpmdW5jLCBjb25zdCBjaGFyICpkZXNjLCBjb25zdCBTdGF0ZW1lbnRD bGFzcyAqc2VsZikKewoJY29uc3QJY2hhciAqaGVhZDsKI2RlZmluZSBOVUxMQ0hFQ0soYSkg KGEgPyBhIDogIihOVUxMKSIpCglpZiAoc2VsZikKCXsKCQlRUmVzdWx0Q2xhc3MgKnJlcyA9 IFNDX2dldF9SZXN1bHQoc2VsZik7CgkJY29uc3QgQVJERmllbGRzCSpvcHRzID0gU0NfZ2V0 X0FSREYoc2VsZik7CgkJY29uc3QgQVBERmllbGRzCSphcGRvcHRzID0gU0NfZ2V0X0FQREYo c2VsZik7CgkJU1FMTEVOCXJvd3NldFNpemU7CgkJY29uc3QgaW50IGxldmVsID0gOTsKCgkJ cm93c2V0U2l6ZSA9IChTVE1UX1RSQU5TSVRJT05fRVhURU5ERURfRkVUQ0ggPT0gc2VsZi0+ dHJhbnNpdGlvbl9zdGF0dXMgPyBvcHRzLT5zaXplX29mX3Jvd3NldF9vZGJjMiA6IG9wdHMt PnNpemVfb2Zfcm93c2V0KTsKCQlpZiAoU0NfZ2V0X2Vycm9ybnVtYmVyKHNlbGYpIDw9IDAp CgkJCWhlYWQgPSAiU1RBVEVNRU5UIFdBUk5JTkciOwoJCWVsc2UKCQl7CgkJCWhlYWQgPSAi U1RBVEVNRU5UIEVSUk9SIjsKCQkJUUxPRyhsZXZlbCwgIiVzOiBmdW5jPSVzLCBkZXNjPScl cycsIGVycm51bT0lZCwgZXJybXNnPSclcydcbiIsaGVhZCwgZnVuYywgZGVzYywgc2VsZi0+ X19lcnJvcl9udW1iZXIsIE5VTExDSEVDSyhzZWxmLT5fX2Vycm9yX21lc3NhZ2UpKTsKCQl9 CgkJTVlMT0coMCwgIiVzOiBmdW5jPSVzLCBkZXNjPSclcycsIGVycm51bT0lZCwgZXJybXNn PSclcydcbiIsIGhlYWQsIGZ1bmMsIGRlc2MsIHNlbGYtPl9fZXJyb3JfbnVtYmVyLCBOVUxM Q0hFQ0soc2VsZi0+X19lcnJvcl9tZXNzYWdlKSk7CgkJaWYgKFNDX2dldF9lcnJvcm51bWJl cihzZWxmKSA+IDApCgkJewoJCQlRTE9HKGxldmVsLCAiICAgICAgICAgICAgICAgICAtLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS1cbiIpOwoJCQlRTE9HKGxldmVsLCAiICAgICAgICAgICAgICAgICBoZGJjPSVwLCBzdG10 PSVwLCByZXN1bHQ9JXBcbiIsIHNlbGYtPmhkYmMsIHNlbGYsIHJlcyk7CgkJCVFMT0cobGV2 ZWwsICIgICAgICAgICAgICAgICAgIHByZXBhcmU9JWQsIGV4dGVybmFsPSVkXG4iLCBzZWxm LT5wcmVwYXJlLCBzZWxmLT5leHRlcm5hbCk7CgkJCVFMT0cobGV2ZWwsICIgICAgICAgICAg ICAgICAgIGJpbmRpbmdzPSVwLCBiaW5kaW5nc19hbGxvY2F0ZWQ9JWRcbiIsIG9wdHMtPmJp bmRpbmdzLCBvcHRzLT5hbGxvY2F0ZWQpOwoJCQlRTE9HKGxldmVsLCAiICAgICAgICAgICAg ICAgICBwYXJhbWV0ZXJzPSVwLCBwYXJhbWV0ZXJzX2FsbG9jYXRlZD0lZFxuIiwgYXBkb3B0 cy0+cGFyYW1ldGVycywgYXBkb3B0cy0+YWxsb2NhdGVkKTsKCQkJUUxPRyhsZXZlbCwgIiAg ICAgICAgICAgICAgICAgc3RhdGVtZW50X3R5cGU9JWQsIHN0YXRlbWVudD0nJXMnXG4iLCBz ZWxmLT5zdGF0ZW1lbnRfdHlwZSwgTlVMTENIRUNLKHNlbGYtPnN0YXRlbWVudCkpOwoJCQlR TE9HKGxldmVsLCAiICAgICAgICAgICAgICAgICBzdG10X3dpdGhfcGFyYW1zPSclcydcbiIs IE5VTExDSEVDSyhzZWxmLT5zdG10X3dpdGhfcGFyYW1zKSk7CgkJCVFMT0cobGV2ZWwsICIg ICAgICAgICAgICAgICAgIGRhdGFfYXRfZXhlYz0lZCwgY3VycmVudF9leGVjX3BhcmFtPSVk LCBwdXRfZGF0YT0lZFxuIiwgc2VsZi0+ZGF0YV9hdF9leGVjLCBzZWxmLT5jdXJyZW50X2V4 ZWNfcGFyYW0sIHNlbGYtPnB1dF9kYXRhKTsKCQkJUUxPRyhsZXZlbCwgIiAgICAgICAgICAg ICAgICAgY3VyclR1cGxlPSIgRk9STUFUX0xFTiAiLCBjdXJyZW50X2NvbD0lZCwgbG9ial9m ZD0lZFxuIiwgc2VsZi0+Y3VyclR1cGxlLCBzZWxmLT5jdXJyZW50X2NvbCwgc2VsZi0+bG9i al9mZCk7CgkJCVFMT0cobGV2ZWwsICIgICAgICAgICAgICAgICAgIG1heFJvd3M9IiBGT1JN QVRfTEVOICIsIHJvd3NldF9zaXplPSIgRk9STUFUX0xFTiAiLCBrZXlzZXRfc2l6ZT0iIEZP Uk1BVF9MRU4gIiwgY3Vyc29yX3R5cGU9IiBGT1JNQVRfVUlOVEVHRVIgIiwgc2Nyb2xsX2Nv bmN1cnJlbmN5PSIgRk9STUFUX1VJTlRFR0VSICJcbiIsIHNlbGYtPm9wdGlvbnMubWF4Um93 cywgcm93c2V0U2l6ZSwgc2VsZi0+b3B0aW9ucy5rZXlzZXRfc2l6ZSwgc2VsZi0+b3B0aW9u cy5jdXJzb3JfdHlwZSwgc2VsZi0+b3B0aW9ucy5zY3JvbGxfY29uY3VycmVuY3kpOwoJCQlR TE9HKGxldmVsLCAiICAgICAgICAgICAgICAgICBjdXJzb3JfbmFtZT0nJXMnXG4iLCBTQ19j dXJzb3JfbmFtZShzZWxmKSk7CgoJCQlRTE9HKGxldmVsLCAiICAgICAgICAgICAgICAgICAt LS0tLS0tLS0tLS0tLS0tUVJlc3VsdCBJbmZvIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS1cbiIpOwoKCQkJaWYgKHJlcykKCQkJewoJCQkJUUxPRyhsZXZlbCwgIiAgICAgICAg ICAgICAgICAgZmllbGRzPSVwLCBiYWNrZW5kX3R1cGxlcz0lcCwgdHVwbGVGaWVsZD0lcCwg Y29ubj0lcFxuIiwgUVJfZ2V0X2ZpZWxkcyhyZXMpLCByZXMtPmJhY2tlbmRfdHVwbGVzLCBy ZXMtPnR1cGxlRmllbGQsIHJlcy0+Y29ubik7CgkJCQlRTE9HKGxldmVsLCAiICAgICAgICAg ICAgICAgICBmZXRjaF9jb3VudD0iIEZPUk1BVF9MRU4gIiwgbnVtX3RvdGFsX3Jvd3M9IiBG T1JNQVRfVUxFTiAiLCBudW1fZmllbGRzPSVkLCBjdXJzb3I9JyVzJ1xuIiwgcmVzLT5mZXRj aF9udW1iZXIsIFFSX2dldF9udW1fdG90YWxfdHVwbGVzKHJlcyksIHJlcy0+bnVtX2ZpZWxk cywgTlVMTENIRUNLKFFSX2dldF9jdXJzb3IocmVzKSkpOwoJCQkJUUxPRyhsZXZlbCwgIiAg ICAgICAgICAgICAgICAgbWVzc2FnZT0nJXMnLCBjb21tYW5kPSclcycsIG5vdGljZT0nJXMn XG4iLCBOVUxMQ0hFQ0soUVJfZ2V0X21lc3NhZ2UocmVzKSksIE5VTExDSEVDSyhyZXMtPmNv bW1hbmQpLCBOVUxMQ0hFQ0socmVzLT5ub3RpY2UpKTsKCQkJCVFMT0cobGV2ZWwsICIgICAg ICAgICAgICAgICAgIHN0YXR1cz0lZFxuIiwgUVJfZ2V0X3JzdGF0dXMocmVzKSk7CgkJCX0K CgkJCS8qIExvZyB0aGUgY29ubmVjdGlvbiBlcnJvciBpZiB0aGVyZSBpcyBvbmUgKi8KCQkJ Q0NfbG9nX2Vycm9yKGZ1bmMsIGRlc2MsIHNlbGYtPmhkYmMpOwoJCX0KCX0KCWVsc2UKCXsK CQlNWUxPRygwLCAiSU5WQUxJRCBTVEFURU1FTlQgSEFORExFIEVSUk9SOiBmdW5jPSVzLCBk ZXNjPSclcydcbiIsIGZ1bmMsIGRlc2MpOwoJfQp9CgovKgogKglFeHRlbmRlZCBRdWVyeQog Ki8KCnN0YXRpYyBCT09MClJlcXVlc3RTdGFydChTdGF0ZW1lbnRDbGFzcyAqc3RtdCwgQ29u bmVjdGlvbkNsYXNzICpjb25uLCBjb25zdCBjaGFyICpmdW5jKQp7CglCT09MCXJldCA9IFRS VUU7Cgl1bnNpZ25lZCBpbnQJc3Zwb3B0ID0gMDsKCiNpZmRlZglfSEFORExFX0VOTElTVF9J Tl9EVENfCglpZiAoY29ubi0+YXNkdW0pCgkJQ0FMTF9Jc29sYXRlRHRjQ29ubihjb25uLCBU UlVFKTsKI2VuZGlmIC8qIF9IQU5ETEVfRU5MSVNUX0lOX0RUQ18gKi8KCWlmIChOVUxMID09 IGNvbm4tPnBxY29ubikKICAgICAgICB7CgkJU0Nfc2V0X2Vycm9yKHN0bXQsIFNUTVRfQ09N TVVOSUNBVElPTl9FUlJPUiwgIlRoZSBjb25uZWN0aW9uIGhhcyBiZWVuIGxvc3QiLCBfX0ZV TkNUSU9OX18pOwoJCXJldHVybiBTUUxfRVJST1I7Cgl9CglpZiAoQ0Nfc3RhcnRlZF9yYnBv aW50KGNvbm4pKQoJCXJldHVybiBUUlVFOwoJaWYgKFNDX2lzX3JlYWRvbmx5KHN0bXQpKQoJ CXN2cG9wdCB8PSBTVlBPUFRfUkRPTkxZOwoJaWYgKFNRTF9FUlJPUiA9PSBTZXRTdGF0ZW1l bnRTdnAoc3RtdCwgc3Zwb3B0KSkKCXsKCQljaGFyCWVtc2dbMTI4XTsKCgkJU1BSSU5URl9G SVhFRChlbXNnLCAiaW50ZXJuYWwgc2F2ZXBvaW50IGVycm9yIGluICVzIiwgZnVuYyk7CgkJ U0Nfc2V0X2Vycm9yX2lmX25vdF9zZXQoc3RtdCwgU1RNVF9JTlRFUk5BTF9FUlJPUiwgZW1z ZywgZnVuYyk7CgkJcmV0dXJuIEZBTFNFOwoJfQoKCS8qCgkgKiBJbiBhdXRvLWNvbW1pdCBt b2RlLCBiZWdpbiBhIG5ldyB0cmFuc2FjdGlvbiBpbXBsaWNpdGx5IGlmIG5vCgkgKiB0cmFu c2FjdGlvbiBpcyBpbiBwcm9ncmVzcyB5ZXQuIEhvd2V2ZXIsIHNvbWUgc3BlY2lhbCBzdGF0 ZW1lbnRzIGxpa2UKCSAqIFZBQ1VVTSBhbmQgQ0xVU1RFUiBjYW5ub3QgYmUgcnVuIGluIGEg dHJhbnNhY3Rpb24gYmxvY2suCgkgKi8KCWlmICghQ0NfaXNfaW5fdHJhbnMoY29ubikgJiYg Q0NfbG92ZXNfdmlzaWJsZV90cmFucyhjb25uKSAmJgoJCXN0bXQtPnN0YXRlbWVudF90eXBl ICE9IFNUTVRfVFlQRV9TUEVDSUFMKQoJewoJCXJldCA9IENDX2JlZ2luKGNvbm4pOwoJfQoJ cmV0dXJuIHJldDsKfQoKc3RhdGljIHZvaWQgbG9nX3BhcmFtcyhpbnQgblBhcmFtcywgY29u c3QgT2lkICpwYXJhbVR5cGVzLCBjb25zdCBVQ0hBUiAqIGNvbnN0ICpwYXJhbVZhbHVlcywg Y29uc3QgaW50ICpwYXJhbUxlbmd0aHMsIGNvbnN0IGludCAqcGFyYW1Gb3JtYXRzLCBpbnQg cmVzdWx0Rm9ybWF0KQp7CglpbnQJaSwgajsKCUJPT0wJaXNCaW5hcnk7CgoJZm9yIChpID0g MDsgaSA8IG5QYXJhbXM7IGkrKykKCXsKCQlpc0JpbmFyeSA9IHBhcmFtRm9ybWF0cyA/IHBh cmFtRm9ybWF0c1tpXSA6IEZBTFNFOwoJCWlmICghcGFyYW1WYWx1ZXNbaV0pCgkJCVFMT0co VFVQTEVfTE9HX0xFVkVMLCAiXHQlYyAobnVsbCkgT0lEPSV1XG4iLCBpc0JpbmFyeSA/ICdi JyA6ICd0JywgcGFyYW1UeXBlcyA/IHBhcmFtVHlwZXNbaV0gOiAwKTsKCQllbHNlIGlmIChp c0JpbmFyeSkKCQl7CgkJCVFMT0coVFVQTEVfTE9HX0xFVkVMLCAiXHRiICciKTsKCQkJZm9y IChqID0gMDsgaiA8IHBhcmFtTGVuZ3Roc1tpXTsgaisrKQoJCQkJUVBSSU5URihUVVBMRV9M T0dfTEVWRUwsICIlMDJ4IiwgcGFyYW1WYWx1ZXNbaV1bal0pOwoJCQlRUFJJTlRGKFRVUExF X0xPR19MRVZFTCwgIiBPSUQ9JXVcbiIsIHBhcmFtVHlwZXMgPyBwYXJhbVR5cGVzW2ldIDog MCk7CgkJfQoJCWVsc2UKCQkJUUxPRyhUVVBMRV9MT0dfTEVWRUwsICJcdHQgJyVzJyBPSUQ9 JXVcbiIsIHBhcmFtVmFsdWVzW2ldLCBwYXJhbVR5cGVzID8gcGFyYW1UeXBlc1tpXSA6IDAp OwoJfQp9CgpzdGF0aWMKUVJlc3VsdENsYXNzICphZGRfbGlicHFfbm90aWNlX3JlY2VpdmVy KFN0YXRlbWVudENsYXNzICpzdG10LCBub3RpY2VfcmVjZWl2ZXJfYXJnICpucmFyZykKewoJ UVJlc3VsdENsYXNzICpyZXMgPSBOVUxMLCAqbmV3cmVzID0gTlVMTDsKCgluZXdyZXMgPSBy ZXMgPSBRUl9Db25zdHJ1Y3RvcigpOwoJbnJhcmctPmNvbm4gPSBTQ19nZXRfY29ubihzdG10 KTsKCW5yYXJnLT5jb21tZW50ID0gX19GVU5DVElPTl9fOwoJbnJhcmctPnJlcyA9IHJlczsK CW5yYXJnLT5zdG10ID0gc3RtdDsKCVBRc2V0Tm90aWNlUmVjZWl2ZXIobnJhcmctPmNvbm4t PnBxY29ubiwgcmVjZWl2ZV9saWJwcV9ub3RpY2UsIG5yYXJnKTsKCglyZXR1cm4gbmV3cmVz Owp9CgpzdGF0aWMgUVJlc3VsdENsYXNzICoKbGlicHFfYmluZF9hbmRfZXhlYyhTdGF0ZW1l bnRDbGFzcyAqc3RtdCkKewoJQ1NUUgkJZnVuYyA9ICJsaWJwcV9iaW5kX2FuZF9leGVjIjsK CUNvbm5lY3Rpb25DbGFzcwkqY29ubiA9IFNDX2dldF9jb25uKHN0bXQpOwoJaW50CQkJblBh cmFtczsKCU9pZAkJICAgKnBhcmFtVHlwZXMgPSBOVUxMOwoJY2hhcgkgICoqcGFyYW1WYWx1 ZXMgPSBOVUxMOwoJaW50CQkgICAqcGFyYW1MZW5ndGhzID0gTlVMTDsKCWludAkJICAgKnBh cmFtRm9ybWF0cyA9IE5VTEw7CglpbnQJCQlyZXN1bHRGb3JtYXQ7CglQR3Jlc3VsdCAgICpw Z3JlcyA9IE5VTEw7CglpbnQJCQlwZ3Jlc3N0YXR1czsKCVFSZXN1bHRDbGFzcwkqbmV3cmVz ID0gTlVMTDsKCVFSZXN1bHRDbGFzcyAqcmVzID0gTlVMTDsKCWNoYXIJICAgKmNtZHRhZzsK CWNoYXIJICAgKnJvd2NvdW50OwoJbm90aWNlX3JlY2VpdmVyX2FyZwlucmFyZzsKCglpZiAo IVJlcXVlc3RTdGFydChzdG10LCBjb25uLCBmdW5jKSkKCQlyZXR1cm4gTlVMTDsKCiNpZmRl ZglOT1RfVVNFRAoJaWYgKENDX2lzX2luX3RyYW5zKGNvbm4pICYmICFDQ19zdGFydGVkX3Ji cG9pbnQoY29ubikpCgl7CgkJaWYgKFNRTF9FUlJPUiA9PSBTZXRTdGF0ZW1lbnRTdnAoc3Rt dCwgMCkpCgkJewoJCQlTQ19zZXRfZXJyb3JfaWZfbm90X3NldChzdG10LCBTVE1UX0lOVEVS TkFMX0VSUk9SLCAiaW50ZXJuYWwgc2F2ZXBvaW50IGVycm9yIGluIGJ1aWxkX2xpYnBxX2Jp bmRfcGFyYW1zIiwgZnVuYyk7CgkJCXJldHVybiBOVUxMOwoJCX0KCX0KI2VuZGlmIC8qIE5P VF9VU0VEICovCgoJLyogMS4gQmluZCAqLwoJTVlMT0coMCwgImJpbmQgc3RtdD0lcFxuIiwg c3RtdCk7CglpZiAoIWJ1aWxkX2xpYnBxX2JpbmRfcGFyYW1zKHN0bXQsCgkJCQkJCQkJICZu UGFyYW1zLAoJCQkJCQkJCSAmcGFyYW1UeXBlcywKCQkJCQkJCQkgJnBhcmFtVmFsdWVzLAoJ CQkJCQkJCSAmcGFyYW1MZW5ndGhzLCAmcGFyYW1Gb3JtYXRzLAoJCQkJCQkJCSAmcmVzdWx0 Rm9ybWF0KSkKCXsKCQlpZiAoU0NfZ2V0X2Vycm9ybnVtYmVyKHN0bXQpIDw9IDApCgkJCVND X3NldF9lcnJvcm51bWJlcihzdG10LCBTVE1UX05PX01FTU9SWV9FUlJPUik7CgkJZ290byBj bGVhbnVwOwoJfQoKCS8qIDIuIEV4ZWN1dGUgKi8KCU1ZTE9HKDAsICJleGVjdXRlIHN0bXQ9 JXBcbiIsIHN0bXQpOwoJaWYgKCFTQ19pc19mZXRjaGN1cnNvcihzdG10KSkKCXsKCQlpZiAo c3RtdC0+cHJlcGFyZWQgPT0gTk9UX1lFVF9QUkVQQVJFRCB8fAoJCQkoc3RtdC0+cHJlcGFy ZWQgPT0gUFJFUEFSRURfVEVNUE9SQVJJTFkgJiYgY29ubi0+dW5uYW1lZF9wcmVwYXJlZF9z dG10ICE9IHN0bXQpKQoJCXsKCQkJU0Nfc2V0X2Vycm9yKHN0bXQsIFNUTVRfRVhFQ19FUlJP UiwgImFib3V0IHRvIGV4ZWN1dGUgYSBub24tcHJlcGFyZWQgc3RhdGVtZW50IiwgZnVuYyk7 CgkJCWdvdG8gY2xlYW51cDsKCQl9Cgl9CgoJLyogMi41IFByZXBhcmUgYW5kIERlc2NyaWJl IGlmIG5lZWRlZCAqLwoJaWYgKHN0bXQtPnByZXBhcmVkID09IFBSRVBBUklOR19URU1QT1JB UklMWSB8fAoJCShzdG10LT5wcmVwYXJlZCA9PSBQUkVQQVJFRF9URU1QT1JBUklMWSAmJiBj b25uLT51bm5hbWVkX3ByZXBhcmVkX3N0bXQgIT0gc3RtdCkpCgl7CgkJUHJvY2Vzc2VkU3Rt dCAqcHN0bXQ7CgoJCWlmICghc3RtdC0+cHJvY2Vzc2VkX3N0YXRlbWVudHMpCgkJewoJCQlp ZiAocHJlcGFyZVBhcmFtZXRlcnNOb0Rlc2Moc3RtdCwgRkFMU0UsIEVYRUNfUEFSQU1fQ0FT VCkgPT0gU1FMX0VSUk9SKQoJCQkJZ290byBjbGVhbnVwOwoJCX0KCgkJcHN0bXQgPSBzdG10 LT5wcm9jZXNzZWRfc3RhdGVtZW50czsKCQlRTE9HKDAsICJQUWV4ZWNQYXJhbXM6ICVwICcl cycgblBhcmFtcz0lZFxuIiwgY29ubi0+cHFjb25uLCBwc3RtdC0+cXVlcnksIG5QYXJhbXMp OwoJCWxvZ19wYXJhbXMoblBhcmFtcywgcGFyYW1UeXBlcywgKGNvbnN0IFVDSEFSICogY29u c3QgKikgcGFyYW1WYWx1ZXMsIHBhcmFtTGVuZ3RocywgcGFyYW1Gb3JtYXRzLCByZXN1bHRG b3JtYXQpOwoJCS8qIHNldCBub3RpY2UgcmVjZWl2ZXIgKi8KCQluZXdyZXMgPSBhZGRfbGli cHFfbm90aWNlX3JlY2VpdmVyKHN0bXQsICZucmFyZyk7CgkJcGdyZXMgPSBQUWV4ZWNQYXJh bXMoY29ubi0+cHFjb25uLAoJCQkJCQkJIHBzdG10LT5xdWVyeSwKCQkJCQkJCSBuUGFyYW1z LAoJCQkJCQkJIHBhcmFtVHlwZXMsCgkJCQkJCQkgKGNvbnN0IGNoYXIgKiopIHBhcmFtVmFs dWVzLAoJCQkJCQkJIHBhcmFtTGVuZ3RocywKCQkJCQkJCSBwYXJhbUZvcm1hdHMsCgkJCQkJ CQkgcmVzdWx0Rm9ybWF0KTsKCX0KCWVsc2UKCXsKCQljb25zdCBjaGFyICpwbGFuX25hbWU7 CgoJCWlmIChzdG10LT5wcmVwYXJlZCA9PSBQUkVQQVJJTkdfUEVSTUFORU5UTFkpCgkJewoJ CQlpZiAocHJlcGFyZVBhcmFtZXRlcnMoc3RtdCwgRkFMU0UpID09IFNRTF9FUlJPUikKCQkJ CWdvdG8gY2xlYW51cDsKCQl9CgoJCS8qIHByZXBhcmVQYXJhbWV0ZXJzKCkgc2V0IHBsYW4g bmFtZSwgc28gZG9uJ3QgZmV0Y2ggdGhpcyBlYXJsaWVyICovCgkJcGxhbl9uYW1lID0gc3Rt dC0+cGxhbl9uYW1lID8gc3RtdC0+cGxhbl9uYW1lIDogTlVMTF9TVFJJTkc7CgoJCS8qIGFs cmVhZHkgcHJlcGFyZWQgKi8KCQlRTE9HKDAsICJQUWV4ZWNQcmVwYXJlZDogJXAgcGxhbj0l cyBuUGFyYW1zPSVkXG4iLCBjb25uLT5wcWNvbm4sIHBsYW5fbmFtZSwgblBhcmFtcyk7CgkJ bG9nX3BhcmFtcyhuUGFyYW1zLCBwYXJhbVR5cGVzLCAoY29uc3QgVUNIQVIgKiBjb25zdCAq KSBwYXJhbVZhbHVlcywgcGFyYW1MZW5ndGhzLCBwYXJhbUZvcm1hdHMsIHJlc3VsdEZvcm1h dCk7CgkJLyogc2V0IG5vdGljZSByZWNlaXZlciAqLwoJCW5ld3JlcyA9IGFkZF9saWJwcV9u b3RpY2VfcmVjZWl2ZXIoc3RtdCwgJm5yYXJnKTsKCQlwZ3JlcyA9IFBRZXhlY1ByZXBhcmVk KGNvbm4tPnBxY29ubiwKCQkJCQkJCSAgIHBsYW5fbmFtZSwgCS8qIHBvcnRhbCBuYW1lID09 IHBsYW4gbmFtZSAqLwoJCQkJCQkJICAgblBhcmFtcywKCQkJCQkJCSAgIChjb25zdCBjaGFy ICoqKSBwYXJhbVZhbHVlcywgcGFyYW1MZW5ndGhzLCBwYXJhbUZvcm1hdHMsCgkJCQkJCQkg ICByZXN1bHRGb3JtYXQpOwoJfQoJLyogcmVzZXQgbm90aWNlIHJlY2VpdmVyICovCglQUXNl dE5vdGljZVJlY2VpdmVyKGNvbm4tPnBxY29ubiwgcmVjZWl2ZV9saWJwcV9ub3RpY2UsIE5V TEwpOwoJaWYgKCEocmVzID0gbnJhcmcucmVzKSkKCXsKCQlTQ19zZXRfZXJyb3Ioc3RtdCwg U1RNVF9OT19NRU1PUllfRVJST1IsICJPdXQgb2YgbWVtb3J5IHdoaWxlIGFsbG9jYXRpbmcg cmVzdWx0IHNldCIsIGZ1bmMpOwoJCWdvdG8gY2xlYW51cDsKCX0KCgkvKiAzLiBSZWNlaXZl IHJlc3VsdHMgKi8KTVlMT0coREVUQUlMX0xPR19MRVZFTCwgImdldF9SZXN1bHQ9JXAgJXBc biIsIHJlcywgU0NfZ2V0X1Jlc3VsdChzdG10KSk7CglwZ3Jlc3N0YXR1cyA9IFBRcmVzdWx0 U3RhdHVzKHBncmVzKTsKCXN3aXRjaCAocGdyZXNzdGF0dXMpCgl7CgkJY2FzZSBQR1JFU19D T01NQU5EX09LOgoJCQkvKiBwb3J0YWwgcXVlcnkgY29tbWFuZCwgbm8gdHVwbGVzIHJldHVy bmVkICovCgkJCS8qIHJlYWQgaW4gdGhlIHJldHVybiBtZXNzYWdlIGZyb20gdGhlIGJhY2tl bmQgKi8KCQkJY21kdGFnID0gUFFjbWRTdGF0dXMocGdyZXMpOwoJCQlRTE9HKDAsICJcdG9r OiAtICdDJyAtICVzXG4iLCBjbWR0YWcpOwoJCQlRUl9zZXRfY29tbWFuZChyZXMsIGNtZHRh Zyk7CgkJCWlmIChRUl9jb21tYW5kX3N1Y2Nlc3NmdWwocmVzKSkKCQkJCVFSX3NldF9yc3Rh dHVzKHJlcywgUE9SRVNfQ09NTUFORF9PSyk7CgoJCQkvKiBnZXQgcm93Y291bnQgKi8KCQkJ cm93Y291bnQgPSBQUWNtZFR1cGxlcyhwZ3Jlcyk7CgkJCWlmIChyb3djb3VudCAmJiByb3dj b3VudFswXSkKCQkJCXJlcy0+cmVjZW50X3Byb2Nlc3NlZF9yb3dfY291bnQgPSBhdG9pKHJv d2NvdW50KTsKCQkJZWxzZQoJCQkJcmVzLT5yZWNlbnRfcHJvY2Vzc2VkX3Jvd19jb3VudCA9 IC0xOwoJCQlicmVhazsKCgkJY2FzZSBQR1JFU19FTVBUWV9RVUVSWToKCQkJLyogV2UgcmV0 dXJuIHRoZSBlbXB0eSBxdWVyeSAqLwoJCQlRUl9zZXRfcnN0YXR1cyhyZXMsIFBPUkVTX0VN UFRZX1FVRVJZKTsKCQkJYnJlYWs7CgkJY2FzZSBQR1JFU19OT05GQVRBTF9FUlJPUjoKCQkJ aGFuZGxlX3BncmVzX2Vycm9yKGNvbm4sIHBncmVzLCAibGlicHFfYmluZF9hbmRfZXhlYyIs IHJlcywgRkFMU0UpOwoJCQlicmVhazsKCgkJY2FzZSBQR1JFU19CQURfUkVTUE9OU0U6CgkJ Y2FzZSBQR1JFU19GQVRBTF9FUlJPUjoKCQkJaGFuZGxlX3BncmVzX2Vycm9yKGNvbm4sIHBn cmVzLCAibGlicHFfYmluZF9hbmRfZXhlYyIsIHJlcywgVFJVRSk7CgkJCWJyZWFrOwoJCWNh c2UgUEdSRVNfVFVQTEVTX09LOgoJCQlpZiAoIVFSX2Zyb21fUEdyZXN1bHQocmVzLCBzdG10 LCBjb25uLCBOVUxMLCAmcGdyZXMpKQoJCQkJZ290byBjbGVhbnVwOwoJCQlpZiAocmVzLT5y c3RhdHVzID09IFBPUkVTX1RVUExFU19PSyAmJiByZXMtPm5vdGljZSkKCQkJCVFSX3NldF9y c3RhdHVzKHJlcywgUE9SRVNfTk9ORkFUQUxfRVJST1IpOwoJCQlicmVhazsKCQljYXNlIFBH UkVTX0NPUFlfT1VUOgoJCWNhc2UgUEdSRVNfQ09QWV9JTjoKCQljYXNlIFBHUkVTX0NPUFlf Qk9USDoKCQlkZWZhdWx0OgoJCQkvKiBza2lwIHRoZSB1bmV4cGVjdGVkIHJlc3BvbnNlIGlm IHBvc3NpYmxlICovCgkJCVFSX3NldF9yc3RhdHVzKHJlcywgUE9SRVNfQkFEX1JFU1BPTlNF KTsKCQkJQ0Nfc2V0X2Vycm9yKGNvbm4sIENPTk5FQ1RJT05fQkFDS0VORF9DUkFaWSwgIlVu ZXhwZWN0ZWQgcHJvdG9jb2wgY2hhcmFjdGVyIGZyb20gYmFja2VuZCAoc2VuZF9xdWVyeSki LCBmdW5jKTsKCQkJQ0Nfb25fYWJvcnQoY29ubiwgQ09OTl9ERUFEKTsKCgkJCVFMT0coMCwg IlBRZXhlY1h4eHggZXJyb3I6IC0gKCVkKSAtICVzXG4iLCBwZ3Jlc3N0YXR1cywgQ0NfZ2V0 X2Vycm9ybXNnKGNvbm4pKTsKCQkJYnJlYWs7Cgl9CgoJaWYgKHJlcyAhPSBuZXdyZXMgJiYg TlVMTCAhPSBuZXdyZXMpCgkJUVJfRGVzdHJ1Y3RvcihuZXdyZXMpOwoKY2xlYW51cDoKCWlm IChwZ3JlcykKCQlQUWNsZWFyKHBncmVzKTsKCWlmIChwYXJhbVZhbHVlcykKCXsKCQlpbnQJ CQlpOwoJCWZvciAoaSA9IDA7IGkgPCBuUGFyYW1zOyBpKyspCgkJewoJCQlpZiAocGFyYW1W YWx1ZXNbaV0gIT0gTlVMTCkKCQkJCWZyZWUocGFyYW1WYWx1ZXNbaV0pOwoJCX0KCQlmcmVl KHBhcmFtVmFsdWVzKTsKCX0KCWlmIChwYXJhbVR5cGVzKQoJCWZyZWUocGFyYW1UeXBlcyk7 CglpZiAocGFyYW1MZW5ndGhzKQoJCWZyZWUocGFyYW1MZW5ndGhzKTsKCWlmIChwYXJhbUZv cm1hdHMpCgkJZnJlZShwYXJhbUZvcm1hdHMpOwoKCXJldHVybiByZXM7Cn0KCi8qCiAqIFBh cnNlIGEgcXVlcnkgdXNpbmcgbGlicHEuCiAqCiAqICdyZXMnIGlzIG9ubHkgcGFzc2VkIGhl cmUgZm9yIGVycm9yIHJlcG9ydGluZyBwdXJwb3Nlcy4gSWYgYW4gZXJyb3IgaXMKICogZW5j b3VudGVyZWQsIGl0IGlzIHNldCBpbiAncmVzJywgYW5kIHRoZSBmdW5jdGlvbiByZXR1cm5z IEZBTFNFLgogKi8Kc3RhdGljIEJPT0wKUGFyc2VXaXRoTGlicHEoU3RhdGVtZW50Q2xhc3Mg KnN0bXQsIGNvbnN0IGNoYXIgKnBsYW5fbmFtZSwKCQkJICAgY29uc3QgY2hhciAqcXVlcnks CgkJCSAgIEludDIgbnVtX3BhcmFtcywgY29uc3QgY2hhciAqY29tbWVudCwgUVJlc3VsdENs YXNzICpyZXMpCnsKCUNTVFIJZnVuYyA9ICJQYXJzZVdpdGhMaWJwcSI7CglDb25uZWN0aW9u Q2xhc3MJKmNvbm4gPSBTQ19nZXRfY29ubihzdG10KTsKCUludDQJCXN0YV9waWR4ID0gLTEs IGVuZF9waWR4ID0gLTE7Cgljb25zdCBjaGFyCSpjc3RhdHVzOwoJT2lkCQkgICAqcGFyYW1U eXBlcyA9IE5VTEw7CglCT09MCQlyZXR2YWwgPSBGQUxTRTsKCVBHcmVzdWx0ICAgKnBncmVz ID0gTlVMTDsKCglNWUxPRygwLCAiZW50ZXJpbmcgcGxhbl9uYW1lPSVzIHF1ZXJ5PSVzXG4i LCBwbGFuX25hbWUsIHF1ZXJ5KTsKCWlmICghUmVxdWVzdFN0YXJ0KHN0bXQsIGNvbm4sIGZ1 bmMpKQoJCXJldHVybiBGQUxTRTsKCglpZiAoc3RtdC0+ZGlzY2FyZF9vdXRwdXRfcGFyYW1z KQoJCW51bV9wYXJhbXMgPSAwOwoJZWxzZSBpZiAobnVtX3BhcmFtcyAhPSAwKQoJewojaWZk ZWYJTk9UX1VTRUQKCQlzdGFfcGlkeCArPSBzdG10LT5wcm9jX3JldHVybjsKI2VuZGlmIC8q IE5PVF9VU0VEICovCgkJaW50CXBpZHg7CgoJCXN0YV9waWR4ID0gc3RtdC0+Y3VycmVudF9l eGVjX3BhcmFtOwoJCWlmIChudW1fcGFyYW1zIDwgMCkKCQkJZW5kX3BpZHggPSBzdG10LT5u dW1fcGFyYW1zIC0gMTsKCQllbHNlCgkJCWVuZF9waWR4ID0gc3RhX3BpZHggKyBudW1fcGFy YW1zIC0gMTsKI2lmZGVmCU5PVF9VU0VECgkJbnVtX3BhcmFtcyA9IGVuZF9waWR4IC0gc3Rh X3BpZHggKyAxOwojZW5kaWYgLyogTk9UX1VTRUQgKi8KCQlmb3IgKG51bV9wYXJhbXMgPSAw LCBwaWR4ID0gc3RhX3BpZHggLSAxOzspCgkJewoJCQlTQ19wYXJhbV9uZXh0KHN0bXQsICZw aWR4LCBOVUxMLCBOVUxMKTsKCQkJaWYgKHBpZHggPiBlbmRfcGlkeCkKCQkJCWJyZWFrOwoJ CQllbHNlIGlmIChwaWR4IDwgZW5kX3BpZHgpCgkJCXsKCQkJCWlmICgwID09IG51bV9wYXJh bXMpCgkJCQkJc3RhX3BpZHggPSBwaWR4OwoJCQkJbnVtX3BhcmFtcysrOwoJCQl9CgkJCWVs c2UKCQkJewoJCQkJbnVtX3BhcmFtcysrOwoJCQkJYnJlYWs7CgkJCX0KCQl9Ck1ZTE9HKDAs ICJzdGFfcGlkeD0lZCBlbmRfcGlkeD0lZCBudW1fcD0lZFxuIiwgc3RhX3BpZHgsIGVuZF9w aWR4LCBudW1fcGFyYW1zKTsKCX0KCgkvKgoJICogV2UgbGV0IHRoZSBzZXJ2ZXIgZGVkdWNl IHRoZSByaWdodCBkYXRhdHlwZSBmb3IgdGhlIHBhcmFtZXRlcnMsIGV4Y2VwdAoJICogZm9y IG91dCBwYXJhbWV0ZXJzLCB3aGljaCBhcmUgc2VudCBhcyBWT0lELgoJICovCglpZiAobnVt X3BhcmFtcyA+IDApCgl7CgkJaW50CWk7CgkJaW50IGo7CgkJSVBERmllbGRzCSppcGRvcHRz ID0gU0NfZ2V0X0lQREYoc3RtdCk7CgoJCXBhcmFtVHlwZXMgPSBtYWxsb2Moc2l6ZW9mKE9p ZCkgKiBudW1fcGFyYW1zKTsKCQlpZiAocGFyYW1UeXBlcyA9PSBOVUxMKQoJCXsKCQkJU0Nf c2V0X2Vycm9ybnVtYmVyKHN0bXQsIFNUTVRfTk9fTUVNT1JZX0VSUk9SKTsKCQkJZ290byBj bGVhbnVwOwoJCX0KCgkJTVlMT0coMCwgImlwZG9wdHMtPmFsbG9jYXRlZDogJWRcbiIsIGlw ZG9wdHMtPmFsbG9jYXRlZCk7CgkJaiA9IDA7CgkJZm9yIChpID0gc3RhX3BpZHg7IGkgPD0g ZW5kX3BpZHg7IGkrKykKCQl7CgkJCWlmIChpIDwgaXBkb3B0cy0+YWxsb2NhdGVkKQoJCQl7 CgkJCQlpZiAoU1FMX1BBUkFNX09VVFBVVCA9PSBpcGRvcHRzLT5wYXJhbWV0ZXJzW2ldLnBh cmFtVHlwZSkKCQkJCQlwYXJhbVR5cGVzW2orK10gPSBQR19UWVBFX1ZPSUQ7CgkJCQllbHNl CgkJCQkJcGFyYW1UeXBlc1tqKytdID0gc3FsdHlwZV90b19iaW5kX3BndHlwZShjb25uLAoJ CQkJCQkJCQkJCQkJCQkgaXBkb3B0cy0+cGFyYW1ldGVyc1tpXS5TUUxUeXBlKTsKCQkJfQoJ CQllbHNlCgkJCXsKCQkJCS8qIFVua25vd24gdHlwZSBvZiBwYXJhbWV0ZXIuIExldCB0aGUg c2VydmVyIGRlY2lkZSAqLwoJCQkJcGFyYW1UeXBlc1tqKytdID0gMDsKCQkJfQoJCX0KCX0K CglpZiAocGxhbl9uYW1lID09IE5VTEwgfHwgcGxhbl9uYW1lWzBdID09ICdcMCcpCgkJY29u bi0+dW5uYW1lZF9wcmVwYXJlZF9zdG10ID0gTlVMTDsKCgkvKiBQcmVwYXJlICovCglRTE9H KDAsICJQUXByZXBhcmU6ICVwICclcycgcGxhbj0lcyBuUGFyYW1zPSVkXG4iLCBjb25uLT5w cWNvbm4sIHF1ZXJ5LCBwbGFuX25hbWUsIG51bV9wYXJhbXMpOwoJcGdyZXMgPSBQUXByZXBh cmUoY29ubi0+cHFjb25uLCBwbGFuX25hbWUsIHF1ZXJ5LCBudW1fcGFyYW1zLCBwYXJhbVR5 cGVzKTsKCWlmIChQUXJlc3VsdFN0YXR1cyhwZ3JlcykgIT0gUEdSRVNfQ09NTUFORF9PSykK CXsKCQloYW5kbGVfcGdyZXNfZXJyb3IoY29ubiwgcGdyZXMsICJQYXJzZVdpdGhsaWJwcSIs IHJlcywgVFJVRSk7CgkJZ290byBjbGVhbnVwOwoJfQoJY3N0YXR1cyA9IFBRY21kU3RhdHVz KHBncmVzKTsKCVFMT0coMCwgIlx0b2s6IC0gJ0MnIC0gJXNcbiIsIGNzdGF0dXMpOwoJaWYg KHN0bXQtPnBsYW5fbmFtZSkKCQlTQ19zZXRfcHJlcGFyZWQoc3RtdCwgUFJFUEFSRURfUEVS TUFORU5UTFkpOwoJZWxzZQoJCVNDX3NldF9wcmVwYXJlZChzdG10LCBQUkVQQVJFRF9URU1Q T1JBUklMWSk7CgoJaWYgKHBsYW5fbmFtZSA9PSBOVUxMIHx8IHBsYW5fbmFtZVswXSA9PSAn XDAnKQoJCWNvbm4tPnVubmFtZWRfcHJlcGFyZWRfc3RtdCA9IHN0bXQ7CgoJcmV0dmFsID0g VFJVRTsKCmNsZWFudXA6CglpZiAocGFyYW1UeXBlcykKCQlmcmVlKHBhcmFtVHlwZXMpOwoK CWlmIChwZ3JlcykKCQlQUWNsZWFyKHBncmVzKTsKCglyZXR1cm4gcmV0dmFsOwp9CgoKLyoK ICogUGFyc2UgYW5kIGRlc2NyaWJlIGEgcXVlcnkgdXNpbmcgbGlicHEuCiAqCiAqIFJldHVy bnMgYW4gZW1wdHkgcmVzdWx0IHNldCB0aGF0IGhhcyB0aGUgY29sdW1uIGluZm9ybWF0aW9u LCBvciBlcnJvciBjb2RlCiAqIGFuZCBtZXNzYWdlLCBmaWxsZWQgaW4uIElmICdyZXMnIGlz IG5vdCBOVUxMLCBpdCBpcyB0aGUgcmVzdWx0IHNldAogKiByZXR1cm5lZCwgb3RoZXJ3aXNl IGEgbmV3IG9uZSBpcyBhbGxvY2F0ZWQuCiAqCiAqIE5COiBUaGUgY2FsbGVyIG11c3Qgc2V0 IHN0bXQtPmN1cnJlbnRfZXhlY19wYXJhbSBiZWZvcmUgY2FsbGluZyB0aGlzCiAqIGZ1bmN0 aW9uIQogKi8KUVJlc3VsdENsYXNzICoKUGFyc2VBbmREZXNjcmliZVdpdGhMaWJwcShTdGF0 ZW1lbnRDbGFzcyAqc3RtdCwgY29uc3QgY2hhciAqcGxhbl9uYW1lLAoJCQkJCQkgIGNvbnN0 IGNoYXIgKnF1ZXJ5X3BhcmFtLAoJCQkJCQkgIEludDIgbnVtX3BhcmFtcywgY29uc3QgY2hh ciAqY29tbWVudCwKCQkJCQkJICBRUmVzdWx0Q2xhc3MgKnJlcykKewoJQ1NUUglmdW5jID0g IlBhcnNlQW5kRGVzY3JpYmVXaXRoTGlicHEiOwoJQ29ubmVjdGlvbkNsYXNzCSpjb25uID0g U0NfZ2V0X2Nvbm4oc3RtdCk7CglQR3Jlc3VsdCAgICpwZ3JlcyA9IE5VTEw7CglpbnQJCQlu dW1fcDsKCUludDIJCW51bV9kaXNjYXJkX3BhcmFtczsKCUlQREZpZWxkcwkqaXBkb3B0czsK CWludAkJCXBpZHg7CglpbnQJCQlpOwoJT2lkCQkJb2lkOwoJU1FMU01BTExJTlQgcGFyYW1U eXBlOwoKCU1ZTE9HKDAsICJlbnRlcmluZyBwbGFuX25hbWU9JXMgcXVlcnk9JXNcbiIsIHBs YW5fbmFtZSwgcXVlcnlfcGFyYW0pOwoJaWYgKCFSZXF1ZXN0U3RhcnQoc3RtdCwgY29ubiwg ZnVuYykpCgkJcmV0dXJuIE5VTEw7CgoJaWYgKCFyZXMpCgkJcmVzID0gUVJfQ29uc3RydWN0 b3IoKTsKCWlmICghcmVzKQoJewoJCVNDX3NldF9lcnJvcihzdG10LCBTVE1UX05PX01FTU9S WV9FUlJPUiwgIkNvdWxkbid0IGFsbG9jYXRlIG1lbW9yeSBmb3IgcXVlcnkiLCBmdW5jKTsK CQlyZXR1cm4gTlVMTDsKCX0KCgkvKgoJICogV2UgbmVlZCB0byBkbyBQcmVwYXJlICsgRGVz Y3JpYmUgYXMgdHdvIGRpZmZlcmVudCByb3VuZC10cmlwcyB0byB0aGUKCSAqIHNlcnZlciwg d2hpbGUgYmVmb3JlIHdlIHN3aXRjaGVkIHRvIHVzZSBsaWJwcSwgd2UgdXNlZCB0byBzZW5k IGEgUGFyc2UKCSAqIGFuZCBEZXNjcmliZSBtZXNzYWdlIGZvbGxvd2VkIGJ5IGEgc2luZ2xl IFN5bmMuCgkgKi8KCWlmICghUGFyc2VXaXRoTGlicHEoc3RtdCwgcGxhbl9uYW1lLCBxdWVy eV9wYXJhbSwgbnVtX3BhcmFtcywgY29tbWVudCwgcmVzKSkKCQlnb3RvIGNsZWFudXA7CgoJ LyogRGVzY3JpYmUgKi8KCVFMT0coMCwgIlx0UFFkZXNjcmliZVByZXBhcmVkOiAlcCBwbGFu X25hbWU9JXNcbiIsIGNvbm4tPnBxY29ubiwgcGxhbl9uYW1lKTsKCglwZ3JlcyA9IFBRZGVz Y3JpYmVQcmVwYXJlZChjb25uLT5wcWNvbm4sIHBsYW5fbmFtZSk7Cglzd2l0Y2ggKFBRcmVz dWx0U3RhdHVzKHBncmVzKSkKCXsKCQljYXNlIFBHUkVTX0NPTU1BTkRfT0s6CgkJCVFMT0co MCwgIlx0b2s6IC0gJ0MnIC0gJXNcbiIsIFBRY21kU3RhdHVzKHBncmVzKSk7CgkJCS8qIGV4 cGVjdGVkICovCgkJCWJyZWFrOwoJCWNhc2UgUEdSRVNfTk9ORkFUQUxfRVJST1I6CgkJCWhh bmRsZV9wZ3Jlc19lcnJvcihjb25uLCBwZ3JlcywgIlBhcnNlQW5kRGVzY3JpYmVXaXRoTGli cHEiLCByZXMsIEZBTFNFKTsKCQkJZ290byBjbGVhbnVwOwoJCWNhc2UgUEdSRVNfRkFUQUxf RVJST1I6CgkJCWhhbmRsZV9wZ3Jlc19lcnJvcihjb25uLCBwZ3JlcywgIlBhcnNlQW5kRGVz Y3JpYmVXaXRoTGlicHEiLCByZXMsIFRSVUUpOwoJCQlnb3RvIGNsZWFudXA7CgkJZGVmYXVs dDoKCQkJLyogc2tpcCB0aGUgdW5leHBlY3RlZCByZXNwb25zZSBpZiBwb3NzaWJsZSAqLwoJ CQlDQ19zZXRfZXJyb3IoY29ubiwgQ09OTkVDVElPTl9CQUNLRU5EX0NSQVpZLCAiVW5leHBl Y3RlZCByZXN1bHQgZnJvbSBQUWRlc2NyaWJlUHJlcGFyZWQiLCBmdW5jKTsKCQkJQ0Nfb25f YWJvcnQoY29ubiwgQ09OTl9ERUFEKTsKCgkJCU1ZTE9HKDAsICJQUWRlc2NyaWJlUHJlcGFy ZWQ6IGVycm9yIC0gJXNcbiIsIENDX2dldF9lcnJvcm1zZyhjb25uKSk7CgkJCWdvdG8gY2xl YW51cDsKCX0KCgkvKiBFeHRyYWN0IHBhcmFtZXRlciBpbmZvcm1hdGlvbiBmcm9tIHRoZSBy ZXN1bHQgc2V0ICovCgludW1fcCA9IFBRbnBhcmFtcyhwZ3Jlcyk7Ck1ZTE9HKERFVEFJTF9M T0dfTEVWRUwsICJudW1fcGFyYW1zPSVkIGluZm89JWRcbiIsIHN0bXQtPm51bV9wYXJhbXMs IG51bV9wKTsKCWlmIChnZXRfcWxvZygpID4gMCB8fCBnZXRfbXlsb2coKSA+IDApCgl7CgkJ aW50CWk7CgoJCVFMT0coMCwgIlx0blBhcmFtcz0lZCIsIG51bV9wKTsKCQlmb3IgKGkgPSAw OyBpIDwgbnVtX3A7IGkrKykKCQkJUVBSSU5URigwLCAiICV1IiwgUFFwYXJhbXR5cGUocGdy ZXMsIGkpKTsKCQlRUFJJTlRGKDAsICJcbiIpOwoJfQoJbnVtX2Rpc2NhcmRfcGFyYW1zID0g MDsKCWlmIChzdG10LT5kaXNjYXJkX291dHB1dF9wYXJhbXMpCgkJQ291bnRQYXJhbWV0ZXJz KHN0bXQsIE5VTEwsIE5VTEwsICZudW1fZGlzY2FyZF9wYXJhbXMpOwoJaWYgKG51bV9kaXNj YXJkX3BhcmFtcyA8IHN0bXQtPnByb2NfcmV0dXJuKQoJCW51bV9kaXNjYXJkX3BhcmFtcyA9 IHN0bXQtPnByb2NfcmV0dXJuOwoJaWYgKG51bV9wICsgbnVtX2Rpc2NhcmRfcGFyYW1zICE9 IChpbnQpIHN0bXQtPm51bV9wYXJhbXMpCgl7CgkJTVlMT0coMCwgIlBhcmFtSW5mbyB1bm1h dGNoIG51bV9wYXJhbXMoPSVkKSAhPSBpbmZvKD0lZCkrZGlzY2FyZCg9JWQpXG4iLCBzdG10 LT5udW1fcGFyYW1zLCBudW1fcCwgbnVtX2Rpc2NhcmRfcGFyYW1zKTsKCQkvKiBzdG10LT5u dW1fcGFyYW1zID0gKEludDIpIG51bV9wICsgbnVtX2Rpc2NhcmRfcGFyYW1zOyBpdCdzIHBv c3NpYmxlIGluIGNhc2Ugb2YgbXVsdGkgY29tbWFuZCBxdWVyaWVzICovCgl9CglpcGRvcHRz ID0gU0NfZ2V0X0lQREYoc3RtdCk7CglleHRlbmRfaXBhcmFtZXRlcl9iaW5kaW5ncyhpcGRv cHRzLCBzdG10LT5udW1fcGFyYW1zKTsKCXBpZHggPSBzdG10LT5jdXJyZW50X2V4ZWNfcGFy YW07CglpZiAocGlkeCA+PSAwKQoJCXBpZHgtLTsKCWZvciAoaSA9IDA7IGkgPCBudW1fcDsg aSsrKQoJewoJCVNDX3BhcmFtX25leHQoc3RtdCwgJnBpZHgsIE5VTEwsIE5VTEwpOwoJCWlm IChwaWR4ID49IHN0bXQtPm51bV9wYXJhbXMpCgkJewoJCQlNWUxPRygwLCAiJWR0aCBwYXJh bWV0ZXIncyBwb3NpdGlvbiglZCkgaXMgb3V0IG9mIGJvdW5kWyVkXVxuIiwgaSwgcGlkeCwg c3RtdC0+bnVtX3BhcmFtcyk7CgkJCWJyZWFrOwoJCX0KCQlvaWQgPSBQUXBhcmFtdHlwZShw Z3JlcywgaSk7CgkJcGFyYW1UeXBlID0gaXBkb3B0cy0+cGFyYW1ldGVyc1twaWR4XS5wYXJh bVR5cGU7CgkJaWYgKFNRTF9QQVJBTV9PVVRQVVQgIT0gcGFyYW1UeXBlIHx8CgkJCVBHX1RZ UEVfVk9JRCAhPSBvaWQpCgkJCVBJQ19zZXRfcGd0eXBlKGlwZG9wdHMtPnBhcmFtZXRlcnNb cGlkeF0sIG9pZCk7Cgl9CgoJLyogRXh0cmFjdCBQb3J0YWwgaW5mb3JtYXRpb24gKi8KCVFS X3NldF9jb25uKHJlcywgY29ubik7CgoJaWYgKENJX3JlYWRfZmllbGRzX2Zyb21fcGdyZXMo UVJfZ2V0X2ZpZWxkcyhyZXMpLCBwZ3JlcykpCgl7CgkJSW50MglkdW1teTEsIGR1bW15MjsK CQlpbnQJY2lkeDsKCQlpbnQgbnVtX2lvX3BhcmFtczsKCgkJUVJfc2V0X3JzdGF0dXMocmVz LCBQT1JFU19GSUVMRFNfT0spOwoJCXJlcy0+bnVtX2ZpZWxkcyA9IENJX2dldF9udW1fZmll bGRzKFFSX2dldF9maWVsZHMocmVzKSk7CgkJaWYgKFFSX2hhc2tleXNldChyZXMpKQoJCQly ZXMtPm51bV9maWVsZHMgLT0gcmVzLT5udW1fa2V5X2ZpZWxkczsKCQludW1faW9fcGFyYW1z ID0gQ291bnRQYXJhbWV0ZXJzKHN0bXQsIE5VTEwsICZkdW1teTEsICZkdW1teTIpOwoJCWlm IChzdG10LT5wcm9jX3JldHVybiA+IDAgfHwKCQkJbnVtX2lvX3BhcmFtcyA+IDApCgkJewoJ CQlpcGRvcHRzID0gU0NfZ2V0X0lQREYoc3RtdCk7CgkJCWV4dGVuZF9pcGFyYW1ldGVyX2Jp bmRpbmdzKGlwZG9wdHMsIHN0bXQtPm51bV9wYXJhbXMpOwoJCQlmb3IgKGkgPSAwLCBjaWR4 ID0gMDsgaSA8IHN0bXQtPm51bV9wYXJhbXM7IGkrKykKCQkJewoJCQkJaWYgKGkgPCBzdG10 LT5wcm9jX3JldHVybikKCQkJCQlpcGRvcHRzLT5wYXJhbWV0ZXJzW2ldLnBhcmFtVHlwZSA9 IFNRTF9QQVJBTV9PVVRQVVQ7CgkJCQlwYXJhbVR5cGUgPWlwZG9wdHMtPnBhcmFtZXRlcnNb aV0ucGFyYW1UeXBlOwoJCQkJaWYgKFNRTF9QQVJBTV9PVVRQVVQgPT0gcGFyYW1UeXBlIHx8 CgkJCQkJU1FMX1BBUkFNX0lOUFVUX09VVFBVVCA9PSBwYXJhbVR5cGUpCgkJCQl7CgkJCQkJ TVlMT0coREVUQUlMX0xPR19MRVZFTCwgIiEhWyVkXS5QR1R5cGUgJXUtPiV1XG4iLCBpLCBQ SUNfZ2V0X3BndHlwZShpcGRvcHRzLT5wYXJhbWV0ZXJzW2ldKSwgQ0lfZ2V0X29pZChRUl9n ZXRfZmllbGRzKHJlcyksIGNpZHgpKTsKCQkJCQlQSUNfc2V0X3BndHlwZShpcGRvcHRzLT5w YXJhbWV0ZXJzW2ldLCBDSV9nZXRfb2lkKFFSX2dldF9maWVsZHMocmVzKSwgY2lkeCkpOwoJ CQkJCWNpZHgrKzsKCQkJCX0KCQkJfQoJCX0KCX0KCWVsc2UKCXsKCQlpZiAoTlVMTCA9PSBR Ul9nZXRfZmllbGRzKHJlcyktPmNvbGlfYXJyYXkpCgkJewoJCQlRUl9zZXRfcnN0YXR1cyhy ZXMsIFBPUkVTX05PX01FTU9SWV9FUlJPUik7CgkJCVFSX3NldF9tZXNzYWdlcmVmKHJlcywg Ik91dCBvZiBtZW1vcnkgd2hpbGUgcmVhZGluZyBmaWVsZCBpbmZvcm1hdGlvbiIpOwoJCX0K CQllbHNlCgkJewoJCQlRUl9zZXRfcnN0YXR1cyhyZXMsIFBPUkVTX0JBRF9SRVNQT05TRSk7 CgkJCVFSX3NldF9tZXNzYWdlKHJlcywgIkVycm9yIHJlYWRpbmcgZmllbGQgaW5mb3JtYXRp b24iKTsKCQl9Cgl9CgpjbGVhbnVwOgoJaWYgKHBncmVzKQoJCVBRY2xlYXIocGdyZXMpOwoK CXJldHVybiByZXM7Cn0KCmVudW0gewoJQ2FuY2VsUmVxdWVzdFNldAk9IDFMCgksQ2FuY2Vs UmVxdWVzdEFjY2VwdGVkCT0gKDFMIDw8IDEpCgksQ2FuY2VsQ29tcGxldGVkCT0gKDFMIDw8 IDIpCn07Ci8qCWNvbW1vbmx5IHVzZWQgZm9yIHNob3J0IHRlcm0gbG9jayAqLwojaWYgZGVm aW5lZChXSU5fTVVMVElUSFJFQURfU1VQUE9SVCkKZXh0ZXJuICBDUklUSUNBTF9TRUNUSU9O ICAgICAgICBjb21tb25fY3M7CiNlbGlmIGRlZmluZWQoUE9TSVhfTVVMVElUSFJFQURfU1VQ UE9SVCkKZXh0ZXJuICBwdGhyZWFkX211dGV4X3QgICAgICAgICBjb21tb25fY3M7CiNlbmRp ZiAvKiBXSU5fTVVMVElUSFJFQURfU1VQUE9SVCAqLwpCT09MCVNDX0lzRXhlY3V0aW5nKGNv bnN0IFN0YXRlbWVudENsYXNzICpzZWxmKQp7CglCT09MCXJldDsKCUVOVEVSX0NPTU1PTl9D UzsgLyogc2hvcnQgdGltZSBibG9ja2luZyAqLwoJcmV0ID0gKFNUTVRfRVhFQ1VUSU5HID09 IHNlbGYtPnN0YXR1cyk7CglMRUFWRV9DT01NT05fQ1M7CglyZXR1cm4gcmV0Owp9CkJPT0wJ U0NfU2V0RXhlY3V0aW5nKFN0YXRlbWVudENsYXNzICpzZWxmLCBCT09MIG9uKQp7CglCT09M CWV4ZVNldCA9IEZBTFNFOwoJRU5URVJfQ09NTU9OX0NTOyAvKiBzaG9ydCB0aW1lIGJsb2Nr aW5nICovCglpZiAob24pCgl7CgkJaWYgKDAgPT0gKHNlbGYtPmNhbmNlbF9pbmZvICYgQ2Fu Y2VsUmVxdWVzdFNldCkpCgkJewoJCQlzZWxmLT5zdGF0dXMgPSBTVE1UX0VYRUNVVElORzsK CQkJZXhlU2V0ID0gVFJVRTsKCQl9Cgl9CgllbHNlCgl7CgkJc2VsZi0+Y2FuY2VsX2luZm8g PSAwOwoJCXNlbGYtPnN0YXR1cyA9IFNUTVRfRklOSVNIRUQ7Ck1ZTE9HKDAsICJzZXQgJXAg U1RNVF9GSU5JU0hFRFxuIiwgc2VsZik7CgkJZXhlU2V0ID0gVFJVRTsKCX0KCUxFQVZFX0NP TU1PTl9DUzsKCXJldHVybiBleGVTZXQ7Cn0KCiNpZmRlZglOT1RfVVNFRApCT09MCVNDX1Nl dENhbmNlbFJlcXVlc3QoU3RhdGVtZW50Q2xhc3MgKnNlbGYpCnsKCUJPT0wJZW50ZXJlZENT ID0gRkFMU0U7CgoJRU5URVJfQ09NTU9OX0NTOwoJaWYgKDAgIT0gKHNlbGYtPmNhbmNlbF9p bmZvICYgQ2FuY2VsQ29tcGxldGVkKSkKCQk7CgllbHNlIGlmIChTVE1UX0VYRUNVVElORyA9 PSBzZWxmLT5zdGF0dXMpCgl7CgkJc2VsZi0+Y2FuY2VsX2luZm8gfD0gQ2FuY2VsUmVxdWVz dFNldDsKCX0KCWVsc2UKCXsKCQkvKiB0cnkgdG8gYWNxdWlyZSAqLwoJCWlmIChUUllfRU5U RVJfU1RNVF9DUyhzZWxmKSkKCQkJZW50ZXJlZENTID0gVFJVRTsKCQllbHNlCgkJCXNlbGYt PmNhbmNlbF9pbmZvIHw9IENhbmNlbFJlcXVlc3RTZXQ7Cgl9CglMRUFWRV9DT01NT05fQ1M7 CglyZXR1cm4gZW50ZXJlZENTOwp9CiNlbmRpZiAvKiBOT1RfVVNFRCAqLwoKQk9PTAlTQ19B Y2NlcHRlZENhbmNlbFJlcXVlc3QoY29uc3QgU3RhdGVtZW50Q2xhc3MgKnNlbGYpCnsKCUJP T0wJc2hvdWxkQ2FuY2VsID0gRkFMU0U7CglFTlRFUl9DT01NT05fQ1M7CglpZiAoMCAhPSAo c2VsZi0+Y2FuY2VsX2luZm8gJiAoQ2FuY2VsUmVxdWVzdFNldCB8IENhbmNlbFJlcXVlc3RB Y2NlcHRlZCB8IENhbmNlbENvbXBsZXRlZCkpKQoJCXNob3VsZENhbmNlbCA9IFRSVUU7CglM RUFWRV9DT01NT05fQ1M7CglyZXR1cm4gc2hvdWxkQ2FuY2VsOwp9CgpzdGF0aWMgdm9pZApT Q19zZXRfZXJyb3JfaWZfbm90X3NldChTdGF0ZW1lbnRDbGFzcyAqc2VsZiwgaW50IGVycm9y bnVtYmVyLCBjb25zdCBjaGFyICplcnJtc2csIGNvbnN0IGNoYXIgKmZ1bmMpCnsKCWludAll cnJudW0gPSBTQ19nZXRfZXJyb3JudW1iZXIoc2VsZik7CgoJaWYgKGVycm51bSA8PSAwKQoJ ewoJCWNvbnN0IGNoYXIgKmVtc2cgPSBTQ19nZXRfZXJyb3Jtc2coc2VsZik7CgoJCWlmIChl bXNnICYmIDAgPT0gZXJybnVtKQoJCQlTQ19zZXRfZXJyb3JudW1iZXIoc2VsZiwgZXJyb3Ju dW1iZXIpOwoJCWVsc2UKCQkJU0Nfc2V0X2Vycm9yKHNlbGYsIGVycm9ybnVtYmVyLCBlcnJt c2csIGZ1bmMpOwoJfQp9CgpzdGF0aWMgdm9pZApTQ19zZXRfZXJyb3JpbmZvKFN0YXRlbWVu dENsYXNzICpzZWxmLCBRUmVzdWx0Q2xhc3MgKnJlcywgaW50IGVycmtpbmQpCnsKCUNvbm5l Y3Rpb25DbGFzcyAqY29ubiA9IFNDX2dldF9jb25uKHNlbGYpOwoKCWlmIChDQ19ub3RfY29u bmVjdGVkKGNvbm4pKQoJewoJCVNDX3NldF9lcnJvcl9pZl9ub3Rfc2V0KHNlbGYsIFNUTVRf Q09NTVVOSUNBVElPTl9FUlJPUiwgIlRoZSBjb25uZWN0aW9uIGhhcyBiZWVuIGxvc3QiLCBf X0ZVTkNUSU9OX18pOwoJCXJldHVybjsKCX0KCglzd2l0Y2ggKFFSX2dldF9yc3RhdHVzKHJl cykpCgl7CgkJY2FzZSBQT1JFU19OT19NRU1PUllfRVJST1I6CgkJCVNDX3NldF9lcnJvcl9p Zl9ub3Rfc2V0KHNlbGYsIFNUTVRfTk9fTUVNT1JZX0VSUk9SLCAibWVtb3J5IGFsbG9jYXRp b24gZXJyb3I/Pz8iLCBfX0ZVTkNUSU9OX18pOwoJCQlicmVhazsKCQljYXNlIFBPUkVTX0JB RF9SRVNQT05TRToKCQkJU0Nfc2V0X2Vycm9yX2lmX25vdF9zZXQoc2VsZiwgU1RNVF9DT01N VU5JQ0FUSU9OX0VSUk9SLCAiY29tbXVuaWNhdGlvbiBlcnJvciBvY2N1cmVkIiwgX19GVU5D VElPTl9fKTsKCQkJYnJlYWs7CgkJY2FzZSBQT1JFU19JTlRFUk5BTF9FUlJPUjoKCQkJU0Nf c2V0X2Vycm9yX2lmX25vdF9zZXQoc2VsZiwgU1RNVF9JTlRFUk5BTF9FUlJPUiwgIkludGVy bmFsIGVycm9yIGZldGNoaW5nIG5leHQgcm93IiwgX19GVU5DVElPTl9fKTsKCQkJYnJlYWs7 CgkJZGVmYXVsdDoKCQkJc3dpdGNoIChlcnJraW5kKQoJCQl7CgkJCQljYXNlIDE6CgkJCQkJ U0Nfc2V0X2Vycm9yX2lmX25vdF9zZXQoc2VsZiwgU1RNVF9FWEVDX0VSUk9SLCAiRXJyb3Ig d2hpbGUgZmV0Y2hpbmcgdGhlIG5leHQgcmVzdWx0IiwgX19GVU5DVElPTl9fKTsKCQkJCQli cmVhazsKCQkJCWRlZmF1bHQ6CgkJCQkJU0Nfc2V0X2Vycm9yX2lmX25vdF9zZXQoc2VsZiwg U1RNVF9FWEVDX0VSUk9SLCAiRXJyb3Igd2hpbGUgZXhlY3V0aW5nIHRoZSBxdWVyeSIsIF9f RlVOQ1RJT05fXyk7CgkJCQkJYnJlYWs7CgkJCX0KCQkJYnJlYWs7Cgl9Cn0KCi8qCiAqCUJl Zm9yZSA5LjYsIHRoZSBkcml2ZXIgb2ZmZXJlZCB2ZXJ5IHNpbXBsZSBib29rbWFyayBzdXBw b3J0IC0tIGl0IGlzIGp1c3QKICoJdGhlIGN1cnJlbnQgcm93IG51bWJlci4KICoJTm93IHRo ZSBkcml2ZXIgb2ZmZXJzIG1vcmUgdmVyYm9zZSBib29rbWFya3Mgd2hpY2ggY29udGFpbiBL ZXlTZXQgaW5mb3JtYXRpb25zCiAqCShDVElEICgrIE9JRCkpLiBUaG91Z2ggdGhleSBjb25z dW1lIDEyYnl0ZXMocm93IG51bWJlciArIENUSUQpIG9yIDE2Ynl0ZXMKICoJKHJvdyBudW1i ZXIgKyBDVElEICsgT0lEKSwgdGhleSBhcmUgdXNlZnVsIGluIGRlY2xhcmUvZmV0Y2ggbW9k ZS4KICovCgpQR19CTQlTQ19SZXNvbHZlX2Jvb2ttYXJrKGNvbnN0IEFSREZpZWxkcyAqb3B0 cywgSW50NCBpZHgpCnsKCUJpbmRJbmZvQ2xhc3MJKmJvb2ttYXJrOwoJU1FMTEVOCQkqdXNl ZDsKCVNRTFVMRU4JCW9mZnNldDsKCVNRTFVJTlRFR0VSCWJpbmRfc2l6ZTsKCXNpemVfdAlj cHlsZW4gPSBzaXplb2YoSW50NCk7CglQR19CTQlwZ19ibTsKCglib29rbWFyayA9IG9wdHMt PmJvb2ttYXJrOwoJb2Zmc2V0ID0gb3B0cy0+cm93X29mZnNldF9wdHIgPyAqKG9wdHMtPnJv d19vZmZzZXRfcHRyKSA6IDA7CgliaW5kX3NpemUgPSBvcHRzLT5iaW5kX3NpemU7CgltZW1z ZXQoJnBnX2JtLCAwLCBzaXplb2YocGdfYm0pKTsKCWlmICh1c2VkID0gYm9va21hcmstPnVz ZWQsIHVzZWQgIT0gTlVMTCkKCXsKCQl1c2VkID0gTEVOQUREUl9TSElGVCh1c2VkLCBvZmZz ZXQpOwoJCWlmIChiaW5kX3NpemUgPiAwKQoJCQl1c2VkID0gTEVOQUREUl9TSElGVCh1c2Vk LCBpZHggKiBiaW5kX3NpemUpOwoJCWVsc2UKCQkJdXNlZCA9IExFTkFERFJfU0hJRlQodXNl ZCwgaWR4ICogc2l6ZW9mKFNRTExFTikpOwoJCWlmICgqdXNlZCA+PSBzaXplb2YocGdfYm0p KQoJCQljcHlsZW4gPSBzaXplb2YocGdfYm0pOwoJCWVsc2UgaWYgKCp1c2VkID49IDEyKQoJ CQljcHlsZW4gPSAxMjsKCQlNWUxPRygwLCAidXNlZD0iIEZPUk1BVF9MRU4gIiBjcHlsZW49 IiBGT1JNQVRfU0laRV9UICJcbiIsICp1c2VkLCBjcHlsZW4pOwoJfQoJbWVtY3B5KCZwZ19i bSwgQ0FMQ19CT09LTUFSS19BRERSKGJvb2ttYXJrLCBvZmZzZXQsIGJpbmRfc2l6ZSwgaWR4 KSwgY3B5bGVuKTsKTVlMT0coMCwgImluZGV4PSVkIGJsb2NrPSVkIG9mZj0lZFxuIiwgcGdf Ym0uaW5kZXgsIHBnX2JtLmtleXMuYmxvY2tudW0sIHBnX2JtLmtleXMub2Zmc2V0KTsKCXBn X2JtLmluZGV4ID0gU0NfcmVzb2x2ZV9pbnQ0X2Jvb2ttYXJrKHBnX2JtLmluZGV4KTsKCgly ZXR1cm4gcGdfYm07Cn0KCmludAlTQ19DcmVhdGVfYm9va21hcmsoU3RhdGVtZW50Q2xhc3Mg KnNlbGYsIEJpbmRJbmZvQ2xhc3MgKmJvb2ttYXJrLCBJbnQ0IGJpbmRfcm93LCBJbnQ0IGN1 cnJUdXBsZSwgY29uc3QgS2V5U2V0ICprZXlzZXQpCnsKCUFSREZpZWxkcwkqb3B0cyA9IFND X2dldF9BUkRGKHNlbGYpOwoJU1FMVUlOVEVHRVIJYmluZF9zaXplID0gb3B0cy0+YmluZF9z aXplOwoJU1FMVUxFTgkJb2Zmc2V0ID0gb3B0cy0+cm93X29mZnNldF9wdHIgPyAqb3B0cy0+ cm93X29mZnNldF9wdHIgOiAwOwoJc2l6ZV90CQljdnRsZW4gPSBzaXplb2YoSW50NCk7CglQ R19CTQkJcGdfYm07CgpNWUxPRygwLCAiZW50ZXJpbmcgdHlwZT0lZCBidWZsZW49IiBGT1JN QVRfTEVOICIgYnVmPSVwXG4iLCBib29rbWFyay0+cmV0dXJudHlwZSwgYm9va21hcmstPmJ1 ZmxlbiwgYm9va21hcmstPmJ1ZmZlcik7CgltZW1zZXQoJnBnX2JtLCAwLCBzaXplb2YocGdf Ym0pKTsKCWlmIChTUUxfQ19CT09LTUFSSyA9PSBib29rbWFyay0+cmV0dXJudHlwZSkKCQk7 CgllbHNlIGlmIChib29rbWFyay0+YnVmbGVuID49IHNpemVvZihwZ19ibSkpCgkJY3Z0bGVu ID0gc2l6ZW9mKHBnX2JtKTsKCWVsc2UgaWYgKGJvb2ttYXJrLT5idWZsZW4gPj0gMTIpCgkJ Y3Z0bGVuID0gMTI7CglwZ19ibS5pbmRleCA9IFNDX21ha2VfaW50NF9ib29rbWFyayhjdXJy VHVwbGUpOwoJaWYgKGtleXNldCkKCQlwZ19ibS5rZXlzICA9ICprZXlzZXQ7CgltZW1jcHko Q0FMQ19CT09LTUFSS19BRERSKGJvb2ttYXJrLCBvZmZzZXQsIGJpbmRfc2l6ZSwgYmluZF9y b3cpLCAmcGdfYm0sIGN2dGxlbik7CglpZiAoYm9va21hcmstPnVzZWQpCgl7CgkJU1FMTEVO ICp1c2VkID0gTEVOQUREUl9TSElGVChib29rbWFyay0+dXNlZCwgb2Zmc2V0KTsKCgkJaWYg KGJpbmRfc2l6ZSA+IDApCgkJCXVzZWQgPSBMRU5BRERSX1NISUZUKHVzZWQsIGJpbmRfcm93 ICogYmluZF9zaXplKTsKCQllbHNlCgkJCXVzZWQgPSBMRU5BRERSX1NISUZUKHVzZWQsIGJp bmRfcm93ICogc2l6ZW9mKFNRTExFTikpOwoJCSp1c2VkID0gY3Z0bGVuOwoJfQpNWUxPRygw LCAibGVhdmluZyBjdnRsZW49IiBGT1JNQVRfU0laRV9UICIgaXgoYmwsb2YpPSVkKCVkLCVk KVxuIiwgY3Z0bGVuLCBwZ19ibS5pbmRleCwgcGdfYm0ua2V5cy5ibG9ja251bSwgcGdfYm0u a2V5cy5vZmZzZXQpOwoKCXJldHVybiBDT1BZX09LOwp9Cg== ------=_NextPart_656F197F_122624D0_02FC0C47--