From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org [79.124.17.100]) by master.gitmailbox.com (Postfix) with ESMTP id 71CDF45958 for ; Fri, 28 Apr 2023 09:55:32 +0000 (UTC) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 6CFEB68BF93; Fri, 28 Apr 2023 12:55:19 +0300 (EEST) Received: from nef.ens.fr (nef2.ens.fr [129.199.96.40]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 699A068BE11 for ; Fri, 28 Apr 2023 12:55:12 +0300 (EEST) X-ENS-nef-client: 129.199.129.80 ( name = phare.normalesup.org ) Received: from phare.normalesup.org (phare.normalesup.org [129.199.129.80]) by nef.ens.fr (8.14.4/1.01.28121999) with ESMTP id 33S9tBuH014773 for ; Fri, 28 Apr 2023 11:55:11 +0200 Received: by phare.normalesup.org (Postfix, from userid 1001) id AB670EB5BF; Fri, 28 Apr 2023 11:55:11 +0200 (CEST) From: Nicolas George To: ffmpeg-devel@ffmpeg.org Date: Fri, 28 Apr 2023 11:55:02 +0200 Message-Id: <20230428095508.221826-2-george@nsup.org> X-Mailer: git-send-email 2.39.2 In-Reply-To: <20230428095508.221826-1-george@nsup.org> References: <20230428095508.221826-1-george@nsup.org> MIME-Version: 1.0 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.4.3 (nef.ens.fr [129.199.96.32]); Fri, 28 Apr 2023 11:55:11 +0200 (CEST) Subject: [FFmpeg-devel] [PATCH 2/8] lavu: new AVWriter API X-BeenThere: ffmpeg-devel@ffmpeg.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: FFmpeg development discussions and patches List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Reply-To: FFmpeg development discussions and patches Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" Archived-At: List-Archive: List-Post: U2lnbmVkLW9mZi1ieTogTmljb2xhcyBHZW9yZ2UgPGdlb3JnZUBuc3VwLm9yZz4KLS0tCiBkb2Mv YXZ3cml0ZXJfaW50cm8ubWQgfCAxODYgKysrKysrKysrKysrKysrKwogbGliYXZ1dGlsL01ha2Vm aWxlICAgIHwgICAyICstCiBsaWJhdnV0aWwvd3JpdGVyLmMgICAgfCA0NTggKysrKysrKysrKysr KysrKysrKysrKysrKysrKysrKysrKysrKysrCiBsaWJhdnV0aWwvd3JpdGVyLmggICAgfCA0ODgg KysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrCiA0IGZpbGVzIGNoYW5n ZWQsIDExMzMgaW5zZXJ0aW9ucygrKSwgMSBkZWxldGlvbigtKQogY3JlYXRlIG1vZGUgMTAwNjQ0 IGRvYy9hdndyaXRlcl9pbnRyby5tZAogY3JlYXRlIG1vZGUgMTAwNjQ0IGxpYmF2dXRpbC93cml0 ZXIuYwogY3JlYXRlIG1vZGUgMTAwNjQ0IGxpYmF2dXRpbC93cml0ZXIuaAoKZGlmZiAtLWdpdCBh L2RvYy9hdndyaXRlcl9pbnRyby5tZCBiL2RvYy9hdndyaXRlcl9pbnRyby5tZApuZXcgZmlsZSBt b2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwLi4wZTA5MjI0NmEyCi0tLSAvZGV2L251bGwKKysr IGIvZG9jL2F2d3JpdGVyX2ludHJvLm1kCkBAIC0wLDAgKzEsMTg2IEBACisjIFF1aWNrIHN0YXJ0 IGd1aWRlIGZvciBBVldyaXRlcgorCitBVldyaXRlciBpcyBhbiBBUEkgdG8gdW5pZnkgZnVuY3Rp b25zIHJldHVybmluZyBzdHJpbmdzIGFuZCB0byBtYWtlIGJ1aWxkaW5nCitzdHJpbmdzIGZyb20g cGFydHMgZWFzaWVyLiBJbiB0aGlzIGRvY3VtZW50LCB5b3Ugd2lsbCBmaW5kIGFuIGludHJvZHVj dGlvbgorb24gaG93IHRvICp1c2UqIEFWV3JpdGVyLCBtb3N0bHkgaW4gdGhlIGZvcm0gb2YgY29k ZSBzbmlwcGV0cyBjb21wYXRpbmcKK21haW5zdHJlYW0gQyBzb2x1dGlvbnMgd2l0aCB0aGVpciBB VldyaXRlciBjb3VudGVycGFydC4KKworKipOb3RlOioqIEFWV3JpdGVyIGlzIDgtYml0IGNsZWFu LCB0aGUgc3RyaW5ncyBpdCBtYW5pcHVsYXRlcyBjYW4gYmUgYnVmZmVycworb2YgYmluYXJ5IGRh dGEuIFRoZSBkb2N1bWVudGF0aW9uIGlzIG1vc3RseSB3cml0dGVuIHVpbmcgdGhlIHZvY2FidWxh cnkgb2YKK3N0cmluZ3MgZm9yIHNpbXBsaWNpdHkuCisKK0luIG1haW5zdHJlYW0gQywgYSBmdW5j dGlvbiB0aGF0IG5lZWRzIHRvIHJldHVybiBhIHN0cmluZyB1c3VhbGx5IGhhdmUgdHdvCitvcHRp b25zOiBlaXRoZXIgdGhleSBhY2NlcHQgcG9pbnRlciB0byBhIGJ1ZmZlciB0aGF0IHRoZXkgZmls bCBvciB0aGV5CithbGxvY2F0ZSB0aGUgYnVmZmVyIHRoZW1zZWx2ZXMgYW5kIHJldHVybiBpdC4g Qm90aCB0aGVzZSBvcHRpb25zIGhhdmUKK2RyYXdiYWNrcywgd2hpY2ggb25lIGlzIGJlc3QgZGVw ZW5kcyBvbiB0aGUgY2lyY3Vtc3RhbmNlcyBvZiB0aGUgY2FsbGVyLgorCitBVldyaXRlciBsZXRz IHRoZSBjYWxsZXIgY2hvb3NlIHRoZSBvcHRpb24gYmVzdCBzdWl0ZWQgdG8gdGhlIGNpcmN1bXN0 YW5jZXMsCithbW9uZyBhIHNtYWxsIHZhcmlldHkgb2YgYnVpbHQtaW4gb3B0aW9ucyBvciBjdXN0 b20gaW1wbGVtZW50YXRpb25zLAoraW5jbHVkaW5nIG9uLXRoZS1mbHkgY29tcHJlc3Npb24gb3Ig ZXNjYXBpbmcgYW5kIGRpcmVjdCB3cml0aW5nIHRvIGEgZmlsZS4KK1RoZSBmaXJzdCBidWlsdC1p biBpbXBsZW1lbnRhdGlvbiwgd2hlcmUgdGhlIHN0cmluZ3MgaXMgc3RvcmVkIGluIGEKK2R5bmFt aWNhbGx5LWFsbG9jYXRlZCBidWZmZXIsIGluY2x1ZGVzIHRoZSBvcHRpbWl6YXRpb24gdGhhdCBz bWFsbCBzdHJpbmdzCithcmUga2VwdCBvbiB0aGUgc3RhY2suCisKK0FWV3JpdGVyIGFsc28gbWFr ZXMgdGhlIHdvcmsgb2YgdGhlIGNhbGxlZCBmdW5jdGlvbiBlYXNpZXIgYnkgcHJvdmlkaW5nCitj b252ZW5pZW50IGZ1bmN0aW9ucyB0byBhcHBlbmQgdG8gdGhlIHN0cmluZyB0aGF0IGNvbXBsZXRl bHkgd3JhcCBlcnJvcgorY2hlY2tzLiBOb3RlIHRoYXQgaXQgb25seSB3b3JrcyBmb3Igc3RyaW5n cyBjcmVhdGVkIGFzIHN0cmVhbXM7IGZ1bmN0aW9ucwordGhhdCBuZWVkIHJhbmRvbSBhY2Nlc3Mg dG8gdGhlIHN0cmluZyBhbHJlYWR5IGJ1aWx0IHN0aWxsIG5lZWQgdG8gbWFuYWdlCit0aGVpciBv d24gYnVmZmVyczsgc29tZSBBVldyaXRlciBpbXBsZW1lbnRhdGlvbnMgY2FuIHN0aWxsIGhlbHAg Zm9yIHRoYXQuCisKKyMjIEkgd2FudCBhIGBjaGFyKmAgYnVmZmVyLCB0aGUgZnVuY3Rpb24gd2Fu dHMgYW4gQVZXcml0ZXIKKworT2xkLXN0eWxlIGNvZGU6CisKK2BgYAorICAgICAgICBjaGFyICpi dWY7CisgICAgICAgIHJldCA9IGF2X3NvbWV0aGluZ190b19zdHJpbmcoJmJ1Ziwgc29tZXRoaW5n KTsKKyAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICBkaWUoIkZhaWxlZCIpOworICAg ICAgICB1c2Vfc3RyaW5nKGJ1Zik7CisgICAgICAgIGF2X2ZyZWVwKCZidWYpOworYGBgCisKK0Vx dWl2YWxlbnQgY29kZSB3aXRoIEFWV3JpdGVyOgorCitgYGAKKyAgICAgICAgQVZXcml0ZXIgd3Ig PSBhdl9keW5idWZfd3JpdGVyKCk7CisgICAgICAgIGF2X3NvbWV0aGluZ193cml0ZSh3ciwgc29t ZXRoaW5nLCAwKTsKKyAgICAgICAgaWYgKGF2X3dyaXRlcl9nZXRfZXJyb3Iod3IsIDApIDwgMCkK KyAgICAgICAgICAgIGRpZSgiRmFpbGVkIik7CisgICAgICAgIHVzZV9zdHJpbmcoYXZfZHluYnVm X3dyaXRlcl9nZXRfZGF0YSh3ciwgTlVMTCkpOworICAgICAgICBhdl9keW5idWZfd3JpdGVyX2Zp bmFsaXplKHdyLCBOVUxMLCBOVUxMKTsKK2BgYAorCitJZiB0aGUgc3RyaW5nIGlzIHNtYWxsIGVu b3VnaCwgbm8gZHluYW1pYyBtZW1vcnkgYWxsb2NhdGlvbiBoYXBwZW5zLgorCitUaGUgTlVMTCB0 byBgYXZfZHluYnVmX3dyaXRlcl9nZXRfZGF0YSgpYCBjYW4gYmUgdXNlZCB0byByZXRyaWV2ZSB0 aGUgc2l6ZQorb2YgdGhlIGRhdGEgaW4gdGhlIGJ1ZmZlci4KKworQ2FsbGluZyBgYXZfd3JpdGVy X2dldF9lcnJvcigpYCBpcyBtYW5kYXRvcnkuCisKKyMjIEkgd2FudCBhICpwZXJzaXN0ZW50KiBg Y2hhcipgIGJ1ZmZlciwgdGhlIGZ1bmN0aW9uIHdhbnRzIGFuIEFWV3JpdGVyCisKK09sZC1zdHls ZSBjb2RlOgorCitgYGAKKyAgICAgICAgY2hhciAqYnVmOworICAgICAgICByZXQgPSBhdl9zb21l dGhpbmdfdG9fc3RyaW5nKCZidWYsIHNvbWV0aGluZyk7CisgICAgICAgIGlmIChyZXQgPCAwKQor ICAgICAgICAgICAgZGllKCJGYWlsZWQiKTsKKyAgICAgICAgY3R4LT5zdHJpbmcgPSBidWY7Citg YGAKKworRXF1aXZhbGVudCBjb2RlIHdpdGggQVZXcml0ZXI6CisKK2BgYAorICAgICAgICBBVldy aXRlciB3ciA9IGF2X2R5bmJ1Zl93cml0ZXIoKTsKKyAgICAgICAgYXZfc29tZXRoaW5nX3dyaXRl KHdyLCBzb21ldGhpbmcsIDApOworICAgICAgICByZXQgPSBhdl9keW5idWZfd3JpdGVyX2ZpbmFs aXplKHdyLCAmY3R4LT5zdHJpbmcsIE5VTEwpOworICAgICAgICBpZiAocmV0IDwgMCkKKyAgICAg ICAgICAgIGRpZSgiRmFpbGVkIik7CitgYGAKKworIyMgSSBoYXZlIGEgYGNoYXJbXWAgYnVmZmVy LCB0aGUgZnVuY3Rpb24gd2FudHMgYW4gQVZXcml0ZXIKKworT2xkLXN0eWxlIGNvZGU6CisKK2Bg YAorICAgICAgICBjaGFyIGJ1ZltCVUZfU0laRV07CisgICAgICAgIGF2X3NvbWV0aGluZ190b19z dHJpbmcoYnVmLCBzaXplb2YoYnVmKSwgc29tZXRoaW5nKTsKKyAgICAgICAgdXNlX3N0cmluZyhi dWYpOworYGBgCisKK0VxdWl2YWxlbnQgY29kZSB3aXRoIEFWV3JpdGVyOgorCitgYGAKKyAgICAg ICAgY2hhciBidWZbQlVGX1NJWkVdOworICAgICAgICBhdl9zb21ldGhpbmdfd3JpdGUoYXZfYnVm X3dyaXRlcihidWYsIHNpemVvZihidWYpKSwgc29tZXRoaW5nLCAwKTsKKyAgICAgICAgdXNlX3N0 cmluZyhidWYpOworYGBgCisKKyMjIEkgbmVlZCB0byBidWlsZCBhIHN0cmluZyBmcm9tIHBhcnRz CisKK09sZC1zdHlsZSBjb2RlOgorCitgYGAKKyAgICAgICAgY2hhciBidWZbMTAyNF07CisgICAg ICAgIGludCBwb3MgPSAwOworICAgICAgICBwb3MgKz0gc25wcmludGYoYnVmICsgcG9zLCBzaXpl b2YoYnVmKSAtIHBvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICJTdHJlYW0gJWQ6ICIsIGkp OworICAgICAgICBhdl9nZXRfY2hhbm5lbF9sYXlvdXRfc3RyaW5nKGJ1ZiArIHBvcywgc2l6ZW9m KGJ1ZikgLSBwb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmIsIGxh eW91dCk7CisgICAgICAgIHBvcyArPSBzdHJsZW4oYnVmICsgcG9zKTsKKyAgICAgICAgcG9zICs9 IHNucHJpbnRmKGJ1ZiArIHBvcywgc2l6ZW9mKGJ1ZikgLSBwb3MsCisgICAgICAgICAgICAgICAg ICAgICAgICAiLCAlcyIsIGF2X2dldF9zYW1wbGVfZm10X25hbWUoZm10KSk7CitgYGAKKworTm90 ZTogdGhpcyBjb2RlIGNvdWxkIG92ZXJmbG93IHRoZSBidWZmZXIuCisKK0VxdWl2YWxlbnQgY29k ZSB3aXRoIEFWV3JpdGVyOgorCitgYGAKKyAgICAgICAgQVZXcml0ZXIgd3IgPSBhdl9keW5idWZf d3JpdGVyKCk7CisgICAgICAgIGF2X3dyaXRlcl9wcmludGYod3IsICJTdHJlYW0gJWQ6ICIsIGkp OworICAgICAgICBhdl9jaGFubmVsX2xheW91dF93cml0ZSh3ciwgbmIsIGxheW91dCwgMCk7Cisg ICAgICAgIGF2X3dyaXRlcl9wcmludGYod3IsICIsICVzIiwgYXZfZ2V0X3NhbXBsZV9mbXRfbmFt ZShmbXQpKTsKK2BgYAorCitTZWUgdGhlIGZpcnN0IGV4YW1wbGUgb24gaG93IHRvIGFjY2VzcyB0 aGUgcmVzdWx0aW5nIHN0cmluZy4KKworTm90ZTogdGhpcyBpcyB2ZXJ5IHNpbWlsYXIgdG8gdXNp bmcgQVZCUHJpbnQ7IGZyb20gdGhpcyBzaWRlLCBBVldyaXRlcgorcmVwbGFjZXMgQVZCUHJpbnQu CisKKyMjIEkgYW0gd3JpdGluZyB0aGUgZnVuY3Rpb24gdGhhdCByZXR1cm5zIGEgc3RyaW5nCisK K09sZC1zdHlsZSBjb2RlOgorCitgYGAKK2ludCBteWZ1bmN0aW9uKGNoYXIgKipidWYsIHNvbWV0 aGluZyBhcmd1bWVudHMpCit7CisgICAgKmJ1ZiA9IG1hbGxvYyhlbm91Z2ggcm9vbSk7CitgYGAK Kworb3I6CisKK2BgYAoraW50IG15ZnVuY3Rpb24oY2hhciAqYnVmLCBzaXplX3QgYnVmX3NpemUs IHNvbWV0aGluZyBhcmd1bWVudHMpCit7CisgICAg4oCmCisgICAgaWYgKGJ1Zl9zaXplIDwgcG9z ICsgbGVuKQorICAgICAgICByZXR1cm4gLTE7CitgYGAKKworRXF1aXZhbGVudCB3aXRoIEFWV3Jp dGVyOgorCitgYGAKK3ZvaWQgbXlmdW5jdGlvbihBVldyaXRlciB3ciwgc29tZXRoaW5nIGFyZ3Vt ZW50cykKK3sKK2BgYAorCivigKYgYW5kIHdyaXRlIG9uIHRoZSBBVldyaXRlciwgc2VlIHRoZSBw cmV2aW91cyBzZWN0aW9uLgorCisjIyBJIHdhbnQgdG8gd3JpdGUgZGlyZWN0bHkgdG8gYSBmaWxl CisKK0lmIHRoZSBmaWxlIGlzIGEgc3RkaW8gYEZJTEUqYDoKKworYGBgCisgICAgICAgIGF2X3Nv bWV0aGluZ193cml0ZShhdl9zdGRpb193cml0ZXIoZmlsZSksIHNvbWV0aGluZywgMCk7CitgYGAK KworKENoZWNraW5nIGZvciBlcnJvciB1c2luZyBgZmVycm9yKClgIGlzIHN0aWxsIHlvdXIgcmVz cG9uc2liaWxpdHkuKQorCitJZiB0aGUgZmlsZSBpcyBhIGxpYmF2Zm9ybWF0IGBBVklPQ29udGV4 dCpgLCB0aGUgaW1wbGVtZW50YXRpb24gaXMgeWV0IHRvCitjb21lLgorCisjIyBJIHdhbnQgdG8g d3JpdGUgaW50byBzb21ldGhpbmcgc3BlY2lmaWMgdG8gbXkgY2FzZQorCistIOKApiBpbnRvIGEg SmF2YS9QZXJsL3doYXRldmVyIHN0cmluZy4KKy0g4oCmIGludG8gYSBHVUkgdGV4dCB3aWRnZXQu CistIOKApiBpbnRvIGEgZGF0YSBzdHJ1Y3R1cmUgcHJvdmlkZWQgYnkgYW5vdGhlciBsaWJyYXJ5 LgorLSDigKYgdG8gY29tcHJlc3Mgb24gdGhlIGZseS4KKy0g4oCmIHRvIGVzY2FwZSBzcGVjaWFs IGNoYXJhY3RlcnMgb24gdGhlIGZseS4KKy0g4oCmIHRvIGhhc2ggdGhlIGRhdGEgb24gdGhlIGZs eSBhbmQgZ2V0IHRoZSBkaWdlc3QgaW4gdGhlIGVuZC4KKworQWxsIHRoZXNlIGFyZSBwb3NzaWJs ZSB3aXRoIEFWV3JpdGVyLiBXaGVuIGRvaW5nIHNvbWV0aGluZyBvbiB0aGUgZmx5LCBpdAord2ls bCB1c3VhbGx5IGludm9sdmUgd3JpdGluZyB0aGUgcmVzdWx0IGludG8gYW5vdGhlciBBVldyaXRl ciwgbGlrZSBhCitmaWx0ZXIuCmRpZmYgLS1naXQgYS9saWJhdnV0aWwvTWFrZWZpbGUgYi9saWJh dnV0aWwvTWFrZWZpbGUKaW5kZXggZGM5MDEyZjlhOC4uZWI4ZGUxZGZiYyAxMDA2NDQKLS0tIGEv bGliYXZ1dGlsL01ha2VmaWxlCisrKyBiL2xpYmF2dXRpbC9NYWtlZmlsZQpAQCAtMTgyLDcgKzE4 Miw3IEBAIE9CSlMgPSBhZGxlcjMyLm8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICB2ZXJzaW9uLm8gICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICB2aWRlb19l bmNfcGFyYW1zLm8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg IFwKICAgICAgICBmaWxtX2dyYWluX3BhcmFtcy5vICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgIFwKLQorICAgICAgIHdyaXRlci5vICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogCiBPQkpTLSQoQ09ORklH X0NVREEpICAgICAgICAgICAgICAgICAgICAgKz0gaHdjb250ZXh0X2N1ZGEubwogT0JKUy0kKENP TkZJR19EM0QxMVZBKSAgICAgICAgICAgICAgICAgICs9IGh3Y29udGV4dF9kM2QxMXZhLm8KZGlm ZiAtLWdpdCBhL2xpYmF2dXRpbC93cml0ZXIuYyBiL2xpYmF2dXRpbC93cml0ZXIuYwpuZXcgZmls ZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwLi4xZDFjYmQ2NTI1Ci0tLSAvZGV2L251bGwK KysrIGIvbGliYXZ1dGlsL3dyaXRlci5jCkBAIC0wLDAgKzEsNDU4IEBACisvKgorICogQ29weXJp Z2h0IChjKSAyMDIzIE5pY29sYXMgR2VvcmdlCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2Yg RkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJp YnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBM ZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVl IFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vu c2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVn IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBi dXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50 eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQ T1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBt b3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0 aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBl ZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5j LiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAx IFVTQQorICovCisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNp bmNsdWRlIDxsaW1pdHMuaD4KKyNpbmNsdWRlICJhdmFzc2VydC5oIgorI2luY2x1ZGUgImVycm9y LmgiCisjaW5jbHVkZSAibG9nLmgiCisjaW5jbHVkZSAid3JpdGVyLmgiCisKKy8qKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioKKyAqIEdlbmVyaWMgQVBJCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5l IEZJRUxET0soc3QsIGYpICgoY2hhciAqKSgmKHN0KS0+ZiArIDEpIDw9IChjaGFyICopKHN0KSAr IChzdCktPnNlbGZfc2l6ZSkKKworI2RlZmluZSBtZXRob2RzX2Fzc2VydF9hYmkobWV0aG9kcykg YXZfYXNzZXJ0MChGSUVMRE9LKG1ldGhvZHMsIGZsdXNoKSkKKworc3RhdGljIHZvaWQgcHJpbnRm X3VuY2hlY2tlZChBVldyaXRlciB3ciwgY29uc3QgY2hhciAqZm10LCAuLi4pCit7CisgICAgdmFf bGlzdCB2YTsKKworICAgIHZhX3N0YXJ0KHZhLCBmbXQpOworICAgIHdyLm1ldGhvZHMtPnZwcmlu dGYod3IsIGZtdCwgdmEpOworICAgIHZhX2VuZCh2YSk7Cit9CisKK3N0YXRpYyB2b2lkIHdyaXRl X29yX2Rpc2NhcmQoQVZXcml0ZXIgd3IsIHNpemVfdCBidWZfc2l6ZSwgc2l6ZV90IHdyaXRlX3Np emUpCit7CisgICAgYXZfYXNzZXJ0MCh3ci5tZXRob2RzLT5hZHZhbmNlX2J1ZmZlcik7CisgICAg d3IubWV0aG9kcy0+YWR2YW5jZV9idWZmZXIod3IsIEZGTUlOKGJ1Zl9zaXplLCB3cml0ZV9zaXpl KSk7CisgICAgaWYgKHdyaXRlX3NpemUgPiBidWZfc2l6ZSAmJiB3ci5tZXRob2RzLT5ub3RpZnlf ZGlzY2FyZCkKKyAgICAgICAgd3IubWV0aG9kcy0+bm90aWZ5X2Rpc2NhcmQod3IsIHdyaXRlX3Np emUgLSBidWZfc2l6ZSk7Cit9CisKK3N0YXRpYyB2b2lkIGF2X3dyaXRlcl9pbXBvc3NpYmxlKEFW V3JpdGVyIHdyLCBjb25zdCBjaGFyICptZXNzYWdlKQoreworICAgIG1ldGhvZHNfYXNzZXJ0X2Fi aSh3ci5tZXRob2RzKTsKKyAgICBpZiAod3IubWV0aG9kcy0+bm90aWZ5X2ltcG9zc2libGUpCisg ICAgICAgIHdyLm1ldGhvZHMtPm5vdGlmeV9pbXBvc3NpYmxlKHdyLCBtZXNzYWdlKTsKKyAgICBl bHNlCisgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRVJST1IsICJPcGVyYXRpb24gaW1wb3Nz aWJsZSB3aXRoICVzOiAlc1xuIiwKKyAgICAgICAgICAgICAgIHdyLm1ldGhvZHMtPm5hbWUsIG1l c3NhZ2UpOworfQorCit2b2lkIGF2X3dyaXRlcl93cml0ZShBVldyaXRlciB3ciwgY29uc3QgY2hh ciAqZGF0YSwgc2l6ZV90IHNpemUpCit7CisgICAgbWV0aG9kc19hc3NlcnRfYWJpKHdyLm1ldGhv ZHMpOworICAgIGlmICh3ci5tZXRob2RzLT53cml0ZSkgeworICAgICAgICB3ci5tZXRob2RzLT53 cml0ZSh3ciwgZGF0YSwgc2l6ZSk7CisgICAgfSBlbHNlIGlmICh3ci5tZXRob2RzLT5nZXRfYnVm ZmVyKSB7CisgICAgICAgIHNpemVfdCBidWZfc2l6ZTsKKyAgICAgICAgY2hhciAqYnVmID0gd3Iu bWV0aG9kcy0+Z2V0X2J1ZmZlcih3ciwgc2l6ZSwgJmJ1Zl9zaXplKTsKKyAgICAgICAgaWYgKGJ1 Zl9zaXplID4gMCkKKyAgICAgICAgICAgIG1lbWNweShidWYsIGRhdGEsIEZGTUlOKHNpemUsIGJ1 Zl9zaXplKSk7CisgICAgICAgIHdyaXRlX29yX2Rpc2NhcmQod3IsIGJ1Zl9zaXplLCBzaXplKTsK KyAgICB9IGVsc2UgaWYgKHdyLm1ldGhvZHMtPnZwcmludGYpIHsKKyAgICAgICAgc2l6ZV90IGk7 CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBzaXplOyBpKyspCisgICAgICAgICAgICBwcmludGZf dW5jaGVja2VkKHdyLCAiJWMiLCBkYXRhW2ldKTsKKyAgICB9IGVsc2UgeworICAgICAgICBhdl93 cml0ZXJfaW1wb3NzaWJsZSh3ciwgImF2X3dyaXRlcl93cml0ZSgpIik7CisgICAgfQorfQorCit2 b2lkIGF2X3dyaXRlcl9wcmludChBVldyaXRlciB3ciwgY29uc3QgY2hhciAqc3RyKQoreworICAg IGF2X3dyaXRlcl93cml0ZSh3ciwgc3RyLCBzdHJsZW4oc3RyKSk7Cit9CisKK3ZvaWQgYXZfd3Jp dGVyX3ByaW50ZihBVldyaXRlciB3ciwgY29uc3QgY2hhciAqZm10LCAuLi4pCit7CisgICAgdmFf bGlzdCB2YTsKKworICAgIHZhX3N0YXJ0KHZhLCBmbXQpOworICAgIGF2X3dyaXRlcl92cHJpbnRm KHdyLCBmbXQsIHZhKTsKKyAgICB2YV9lbmQodmEpOworfQorCit2b2lkIGF2X3dyaXRlcl92cHJp bnRmKEFWV3JpdGVyIHdyLCBjb25zdCBjaGFyICpmbXQsIHZhX2xpc3QgdmEpCit7CisgICAgbWV0 aG9kc19hc3NlcnRfYWJpKHdyLm1ldGhvZHMpOworICAgIGlmICh3ci5tZXRob2RzLT52cHJpbnRm KSB7CisgICAgICAgIHdyLm1ldGhvZHMtPnZwcmludGYod3IsIGZtdCwgdmEpOworICAgIH0gZWxz ZSBpZiAod3IubWV0aG9kcy0+Z2V0X2J1ZmZlcikgeworICAgICAgICBzaXplX3QgYnVmX3NpemU7 CisgICAgICAgIGNoYXIgKmJ1ZiA9IHdyLm1ldGhvZHMtPmdldF9idWZmZXIod3IsIDEyOCwgJmJ1 Zl9zaXplKTsKKyAgICAgICAgdmFfbGlzdCB2YTI7CisgICAgICAgIGludCByZXQ7CisgICAgICAg IHZhX2NvcHkodmEyLCB2YSk7CisgICAgICAgIHJldCA9IHZzbnByaW50ZihidWYsIGJ1Zl9zaXpl LCBmbXQsIHZhMik7CisgICAgICAgIHZhX2VuZCh2YTIpOworICAgICAgICBpZiAocmV0IDwgMCkK KyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgaWYgKChzaXplX3QpcmV0ICsgMSA+IGJ1Zl9z aXplKSB7CisgICAgICAgICAgICBidWYgPSB3ci5tZXRob2RzLT5nZXRfYnVmZmVyKHdyLCByZXQg KyAxLCAmYnVmX3NpemUpOworICAgICAgICAgICAgcmV0ID0gdnNucHJpbnRmKGJ1ZiwgYnVmX3Np emUsIGZtdCwgdmEpOworICAgICAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICAgICAg cmV0dXJuOworICAgICAgICB9CisgICAgICAgIHdyaXRlX29yX2Rpc2NhcmQod3IsIGJ1Zl9zaXpl LCByZXQpOworICAgIH0gZWxzZSBpZiAod3IubWV0aG9kcy0+d3JpdGUpIHsKKyAgICAgICAgQVZC UHJpbnQgYnA7CisgICAgICAgIGF2X2JwcmludF9pbml0KCZicCwgMCwgQVZfQlBSSU5UX1NJWkVf VU5MSU1JVEVEKTsKKyAgICAgICAgYXZfdmJwcmludGYoJmJwLCBmbXQsIHZhKTsKKyAgICAgICAg aWYgKGF2X2JwcmludF9pc19jb21wbGV0ZSgmYnApKSB7CisgICAgICAgICAgICB3ci5tZXRob2Rz LT53cml0ZSh3ciwgYnAuc3RyLCBicC5sZW4pOworICAgICAgICB9IGVsc2UgeworICAgICAgICAg ICAgd3IubWV0aG9kcy0+d3JpdGUod3IsIGJwLnN0ciwgYnAuc2l6ZSAtIDEpOworICAgICAgICAg ICAgaWYgKHdyLm1ldGhvZHMtPm5vdGlmeV9kaXNjYXJkKQorICAgICAgICAgICAgICAgIHdyLm1l dGhvZHMtPm5vdGlmeV9kaXNjYXJkKHdyLCBicC5sZW4gLSBicC5zaXplICsgMSk7CisgICAgICAg IH0KKyAgICAgICAgYXZfYnByaW50X2ZpbmFsaXplKCZicCwgTlVMTCk7CisgICAgfSBlbHNlIHsK KyAgICAgICAgYXZfd3JpdGVyX2ltcG9zc2libGUod3IsICJhdl93cml0ZXJfdnByaW50ZigpIik7 CisgICAgfQorfQorCit2b2lkIGF2X3dyaXRlcl9hZGRfY2hhcnMoQVZXcml0ZXIgd3IsIGNoYXIg Yywgc2l6ZV90IG4pCit7CisgICAgY2hhciBidWZbNTEyXTsKKyAgICBzaXplX3QgbTsKKworICAg IG0gPSBGRk1JTihuLCBzaXplb2YoYnVmKSAtIDEpOworICAgIG1lbXNldChidWYsIGMsIG0pOwor ICAgIHdoaWxlIChuKSB7CisgICAgICAgIGF2X3dyaXRlcl93cml0ZSh3ciwgYnVmLCBtKTsKKyAg ICAgICAgbiAtPSBtOworICAgICAgICBtID0gRkZNSU4obiwgc2l6ZW9mKGJ1ZikgLSAxKTsKKyAg ICB9Cit9CisKK3ZvaWQgYXZfd3JpdGVyX2ZsdXNoKEFWV3JpdGVyIHdyKQoreworICAgIG1ldGhv ZHNfYXNzZXJ0X2FiaSh3ci5tZXRob2RzKTsKKyAgICBpZiAod3IubWV0aG9kcy0+Zmx1c2gpCisg ICAgICAgIHdyLm1ldGhvZHMtPmZsdXNoKHdyKTsKK30KKworaW50IGF2X3dyaXRlcl9nZXRfZXJy b3IoQVZXcml0ZXIgd3IsIGludCBzZWxmX29ubHkpCit7CisgICAgbWV0aG9kc19hc3NlcnRfYWJp KHdyLm1ldGhvZHMpOworICAgIGlmICh3ci5tZXRob2RzLT5nZXRfZXJyb3IpCisgICAgICAgIHJl dHVybiB3ci5tZXRob2RzLT5nZXRfZXJyb3Iod3IsIHNlbGZfb25seSk7CisgICAgcmV0dXJuIDA7 Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEFWQnVmV3JpdGVyIC0gd3JpdGUgdG8gcHJl LWFsbG9jYXRlZCBtZW1vcnkKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgYnVmX3dy aXRlcl9hc3NlcnRfYWJpKGJ3cikgYXZfYXNzZXJ0MChGSUVMRE9LKGJ3ciwgcG9zKSkKKworc3Rh dGljIHNpemVfdCBidWZfd3JpdGVyX3Jvb20oQVZCdWZXcml0ZXIgKmJ3cikKK3sKKyAgICByZXR1 cm4gYndyLT5wb3MgPCBid3ItPnNpemUgPyBid3ItPnNpemUgLSBid3ItPnBvcyAtIDEgOiAwOwor fQorCitzdGF0aWMgdm9pZCBidWZfd3JpdGVyX3dyaXRlKEFWV3JpdGVyIHdyLCBjb25zdCBjaGFy ICpkYXRhLCBzaXplX3Qgc2l6ZSkKK3sKKyAgICBBVkJ1ZldyaXRlciAqYndyID0gd3Iub2JqOwor CisgICAgYXZfYXNzZXJ0MChhdl9idWZfd3JpdGVyX2NoZWNrKHdyKSk7CisgICAgYnVmX3dyaXRl cl9hc3NlcnRfYWJpKGJ3cik7CisgICAgc2l6ZSA9IEZGTUlOKGJ1Zl93cml0ZXJfcm9vbShid3Ip LCBzaXplKTsKKyAgICBtZW1jcHkoYndyLT5idWYgKyBid3ItPnBvcywgZGF0YSwgc2l6ZSk7Cisg ICAgYndyLT5wb3MgKz0gc2l6ZTsKKyAgICBid3ItPmJ1Zltid3ItPnBvc10gPSAwOworfQorCitz dGF0aWMgdm9pZCBidWZfd3JpdGVyX3ZwcmludGYoQVZXcml0ZXIgd3IsIGNvbnN0IGNoYXIgKmZt dCwgdmFfbGlzdCB2YSkKK3sKKyAgICBBVkJ1ZldyaXRlciAqYndyID0gd3Iub2JqOworICAgIGlu dCByZXQ7CisKKyAgICBhdl9hc3NlcnQwKGF2X2J1Zl93cml0ZXJfY2hlY2sod3IpKTsKKyAgICBi dWZfd3JpdGVyX2Fzc2VydF9hYmkoYndyKTsKKyAgICByZXQgPSB2c25wcmludGYoYndyLT5idWYg KyBid3ItPnBvcywgYnVmX3dyaXRlcl9yb29tKGJ3cikgKyAxLCBmbXQsIHZhKTsKKyAgICBpZiAo cmV0ID4gMCkKKyAgICAgICAgYndyLT5wb3MgKz0gcmV0OworfQorCitzdGF0aWMgY2hhciAqYnVm X3dyaXRlcl9nZXRfYnVmZmVyKEFWV3JpdGVyIHdyLCBzaXplX3QgbWluX3NpemUsIHNpemVfdCAq c2l6ZSkKK3sKKyAgICBBVkJ1ZldyaXRlciAqYndyID0gd3Iub2JqOworCisgICAgYXZfYXNzZXJ0 MChhdl9idWZfd3JpdGVyX2NoZWNrKHdyKSk7CisgICAgYnVmX3dyaXRlcl9hc3NlcnRfYWJpKGJ3 cik7CisgICAgKnNpemUgPSBid3ItPnNpemUgLSAxIC0gYndyLT5wb3M7CisgICAgcmV0dXJuIGJ3 ci0+YnVmICsgYndyLT5wb3M7Cit9CisKK3N0YXRpYyB2b2lkIGJ1Zl93cml0ZXJfYWR2YW5jZV9i dWZmZXIoQVZXcml0ZXIgd3IsIHNpemVfdCBzaXplKQoreworICAgIEFWQnVmV3JpdGVyICpid3Ig PSB3ci5vYmo7CisKKyAgICBhdl9hc3NlcnQwKGF2X2J1Zl93cml0ZXJfY2hlY2sod3IpKTsKKyAg ICBidWZfd3JpdGVyX2Fzc2VydF9hYmkoYndyKTsKKyAgICBid3ItPnBvcyArPSBzaXplOworICAg IGJ3ci0+YnVmW2J3ci0+cG9zXSA9IDA7Cit9CisKK0FWX1dSSVRFUl9ERUZJTkVfTUVUSE9EUygv KnB1YmxpYyovLCBBVkJ1ZldyaXRlciwgYXZfYnVmX3dyaXRlcikgeworICAgIC5zZWxmX3NpemUg ICAgICAgID0gc2l6ZW9mKEFWV3JpdGVyTWV0aG9kcyksCisgICAgLm5hbWUgICAgICAgICAgICAg PSAiQVZCdWZXcml0ZXIiLAorICAgIC53cml0ZSAgICAgICAgICAgID0gYnVmX3dyaXRlcl93cml0 ZSwKKyAgICAudnByaW50ZiAgICAgICAgICA9IGJ1Zl93cml0ZXJfdnByaW50ZiwKKyAgICAuZ2V0 X2J1ZmZlciAgICAgICA9IGJ1Zl93cml0ZXJfZ2V0X2J1ZmZlciwKKyAgICAuYWR2YW5jZV9idWZm ZXIgICA9IGJ1Zl93cml0ZXJfYWR2YW5jZV9idWZmZXIsCit9OworCitBVkJ1ZldyaXRlciAqYXZf YnVmX3dyaXRlcl9pbml0KEFWQnVmV3JpdGVyICpid3IsIGNoYXIgKmJ1Ziwgc2l6ZV90IHNpemUp Cit7CisgICAgYnVmX3dyaXRlcl9hc3NlcnRfYWJpKGJ3cik7CisgICAgYndyLT5idWYgICAgICAg PSBidWY7CisgICAgYndyLT5zaXplICAgICAgPSBzaXplOworICAgIGJ3ci0+cG9zICAgICAgID0g MDsKKyAgICBidWZbMF0gPSAwOworICAgIHJldHVybiBid3I7Cit9CisKK0FWV3JpdGVyIGF2X2J1 Zl93cml0ZXJfd3JhcChBVkJ1ZldyaXRlciAqYndyKQoreworICAgIEFWV3JpdGVyIHIgPSB7IGF2 X2J1Zl93cml0ZXJfZ2V0X21ldGhvZHMoKSwgYndyIH07CisgICAgYnVmX3dyaXRlcl9hc3NlcnRf YWJpKGJ3cik7CisgICAgcmV0dXJuIHI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEFW RHluYnVmV3JpdGVyIC0gd3JpdGUgdG8gYSBkeW5hbWljIGJ1ZmZlcgorICoqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKi8KKworI2RlZmluZSBkeW5idWZfd3JpdGVyX2Fzc2VydF9hYmkoZHdyKSBhdl9hc3NlcnQw KEZJRUxET0soZHdyLCBicCkpCisKKyNkZWZpbmUgRFdSX0RJUlRZIDEKKworc3RhdGljIHZvaWQg ZHluYnVmX3dyaXRlcl93cml0ZShBVldyaXRlciB3ciwgY29uc3QgY2hhciAqZGF0YSwgc2l6ZV90 IHNpemUpCit7CisgICAgQVZEeW5idWZXcml0ZXIgKmR3ciA9IHdyLm9iajsKKyAgICB1bnNpZ25l ZCBjaGFyICpidWY7CisgICAgdW5zaWduZWQgYnVmX3NpemU7CisgICAgc2l6ZV90IGNvcHk7CisK KyAgICBhdl9hc3NlcnQwKGF2X2R5bmJ1Zl93cml0ZXJfY2hlY2sod3IpKTsKKyAgICBkeW5idWZf d3JpdGVyX2Fzc2VydF9hYmkoZHdyKTsKKyAgICBhdl9icHJpbnRfZ2V0X2J1ZmZlcigmZHdyLT5i cCwgRkZNSU4oc2l6ZSwgVUlOVF9NQVggLSA1KSwgJmJ1ZiwgJmJ1Zl9zaXplKTsKKyAgICBpZiAo YnVmX3NpemUgPj0gMSkgeworICAgICAgICBjb3B5ID0gRkZNSU4oYnVmX3NpemUgLSAxLCBzaXpl KTsKKyAgICAgICAgbWVtY3B5KGJ1ZiwgZGF0YSwgY29weSk7CisgICAgICAgIGJ1Zltjb3B5XSA9 IDA7CisgICAgfQorICAgIGR3ci0+YnAubGVuICs9IHNpemU7CisgICAgZHdyLT5mbGFncyB8PSBE V1JfRElSVFk7Cit9CisKK3N0YXRpYyB2b2lkIGR5bmJ1Zl93cml0ZXJfdnByaW50ZihBVldyaXRl ciB3ciwgY29uc3QgY2hhciAqZm10LCB2YV9saXN0IHZhKQoreworICAgIEFWRHluYnVmV3JpdGVy ICpkd3IgPSB3ci5vYmo7CisKKyAgICBhdl9hc3NlcnQwKGF2X2R5bmJ1Zl93cml0ZXJfY2hlY2so d3IpKTsKKyAgICBkeW5idWZfd3JpdGVyX2Fzc2VydF9hYmkoZHdyKTsKKyAgICBhdl92YnByaW50 ZigmZHdyLT5icCwgZm10LCB2YSk7CisgICAgZHdyLT5mbGFncyB8PSBEV1JfRElSVFk7Cit9CisK K2NoYXIgKmF2X2R5bmJ1Zl93cml0ZXJfZ2V0X2J1ZmZlcihBVldyaXRlciB3ciwgc2l6ZV90IHNp emUsIHNpemVfdCAqcnNpemUpCit7CisgICAgQVZEeW5idWZXcml0ZXIgKmR3ciA9IHdyLm9iajsK KyAgICB1bnNpZ25lZCBjaGFyICpidWY7CisgICAgdW5zaWduZWQgaXNpemU7CisKKyAgICBhdl9h c3NlcnQwKGF2X2R5bmJ1Zl93cml0ZXJfY2hlY2sod3IpKTsKKyAgICBkeW5idWZfd3JpdGVyX2Fz c2VydF9hYmkoZHdyKTsKKyAgICBhdl9icHJpbnRfZ2V0X2J1ZmZlcigmZHdyLT5icCwgRkZNSU4o c2l6ZSwgVUlOVF9NQVggLSA1KSwgJmJ1ZiwgJmlzaXplKTsKKyAgICAqcnNpemUgPSBpc2l6ZSA/ IGlzaXplIC0gMSA6IDA7CisgICAgcmV0dXJuIGJ1ZjsKK30KKwordm9pZCBhdl9keW5idWZfd3Jp dGVyX2FkdmFuY2VfYnVmZmVyKEFWV3JpdGVyIHdyLCBzaXplX3Qgc2l6ZSkKK3sKKyAgICBBVkR5 bmJ1ZldyaXRlciAqZHdyID0gd3Iub2JqOworCisgICAgYXZfYXNzZXJ0MChhdl9keW5idWZfd3Jp dGVyX2NoZWNrKHdyKSk7CisgICAgZHluYnVmX3dyaXRlcl9hc3NlcnRfYWJpKGR3cik7CisgICAg ZHdyLT5icC5sZW4gKz0gc2l6ZTsKKyAgICBkd3ItPmJwLnN0cltGRk1JTihkd3ItPmJwLmxlbiwg ZHdyLT5icC5zaXplIC0gMSldID0gMDsKKyAgICBkd3ItPmZsYWdzIHw9IERXUl9ESVJUWTsKK30K Kworc3RhdGljIGludCBkeW5idWZfd3JpdGVyX2dldF9lcnJvcihBVldyaXRlciB3ciwgaW50IHNl bGZfb25seSkKK3sKKyAgICBBVkR5bmJ1ZldyaXRlciAqZHdyID0gd3Iub2JqOworCisgICAgYXZf YXNzZXJ0MChhdl9keW5idWZfd3JpdGVyX2NoZWNrKHdyKSk7CisgICAgZHluYnVmX3dyaXRlcl9h c3NlcnRfYWJpKGR3cik7CisgICAgZHdyLT5mbGFncyAmPSB+RFdSX0RJUlRZOworICAgIHJldHVy biBhdl9icHJpbnRfaXNfY29tcGxldGUoJmR3ci0+YnApID8gMCA6IEFWRVJST1IoRU5PTUVNKTsK K30KKworQVZfV1JJVEVSX0RFRklORV9NRVRIT0RTKC8qcHVibGljKi8sIEFWRHluYnVmV3JpdGVy LCBhdl9keW5idWZfd3JpdGVyKSB7CisgICAgLnNlbGZfc2l6ZSAgICAgICAgPSBzaXplb2YoQVZX cml0ZXJNZXRob2RzKSwKKyAgICAubmFtZSAgICAgICAgICAgICA9ICJBVkR5bmJ1ZldyaXRlciIs CisgICAgLndyaXRlICAgICAgICAgICAgPSBkeW5idWZfd3JpdGVyX3dyaXRlLAorICAgIC52cHJp bnRmICAgICAgICAgID0gZHluYnVmX3dyaXRlcl92cHJpbnRmLAorICAgIC5nZXRfYnVmZmVyICAg ICAgID0gYXZfZHluYnVmX3dyaXRlcl9nZXRfYnVmZmVyLAorICAgIC5hZHZhbmNlX2J1ZmZlciAg ID0gYXZfZHluYnVmX3dyaXRlcl9hZHZhbmNlX2J1ZmZlciwKKyAgICAuZ2V0X2Vycm9yICAgICAg ICA9IGR5bmJ1Zl93cml0ZXJfZ2V0X2Vycm9yLAorfTsKKworQVZEeW5idWZXcml0ZXIgKmF2X2R5 bmJ1Zl93cml0ZXJfaW5pdChBVkR5bmJ1ZldyaXRlciAqZHdyKQoreworICAgIGR5bmJ1Zl93cml0 ZXJfYXNzZXJ0X2FiaShkd3IpOworICAgIGF2X2JwcmludF9pbml0KCZkd3ItPmJwLCAwLCBBVl9C UFJJTlRfU0laRV9VTkxJTUlURUQpOworICAgIGR3ci0+ZmxhZ3MgPSAwOworICAgIHJldHVybiBk d3I7Cit9CisKK0FWV3JpdGVyIGF2X2R5bmJ1Zl93cml0ZXJfd3JhcChBVkR5bmJ1ZldyaXRlciAq ZHdyKQoreworICAgIEFWV3JpdGVyIHIgPSB7IGF2X2R5bmJ1Zl93cml0ZXJfZ2V0X21ldGhvZHMo KSwgZHdyIH07CisgICAgZHluYnVmX3dyaXRlcl9hc3NlcnRfYWJpKGR3cik7CisgICAgcmV0dXJu IHI7Cit9CisKK2NoYXIgKmF2X2R5bmJ1Zl93cml0ZXJfZ2V0X2RhdGEoQVZXcml0ZXIgd3IsIHNp emVfdCAqc2l6ZSkKK3sKKyAgICBBVkR5bmJ1ZldyaXRlciAqZHdyID0gd3Iub2JqOworCisgICAg ZHluYnVmX3dyaXRlcl9hc3NlcnRfYWJpKGR3cik7CisgICAgYXZfYXNzZXJ0MCghKGR3ci0+Zmxh Z3MgJiBEV1JfRElSVFkpKTsKKyAgICBhdl9hc3NlcnQwKCFkeW5idWZfd3JpdGVyX2dldF9lcnJv cih3ciwgMCkpOworICAgIHJldHVybiBhdl9keW5idWZfd3JpdGVyX2dldF9kYXRhX3Vuc2FmZSh3 ciwgc2l6ZSk7Cit9CisKK2NoYXIgKmF2X2R5bmJ1Zl93cml0ZXJfZ2V0X2RhdGFfdW5zYWZlKEFW V3JpdGVyIHdyLCBzaXplX3QgKnNpemUpCit7CisgICAgQVZEeW5idWZXcml0ZXIgKmR3ciA9IHdy Lm9iajsKKworICAgIGF2X2Fzc2VydDAoYXZfZHluYnVmX3dyaXRlcl9jaGVjayh3cikpOworICAg IGR5bmJ1Zl93cml0ZXJfYXNzZXJ0X2FiaShkd3IpOworICAgIGlmIChzaXplKQorICAgICAgICAq c2l6ZSA9IGR3ci0+YnAubGVuOworICAgIHJldHVybiBkd3ItPmJwLnN0cjsKK30KKworaW50IGF2 X2R5bmJ1Zl93cml0ZXJfZmluYWxpemUoQVZXcml0ZXIgd3IsIGNoYXIgKipidWYsIHNpemVfdCAq c2l6ZSkKK3sKKyAgICBpbnQgcmV0OworCisgICAgcmV0ID0gZHluYnVmX3dyaXRlcl9nZXRfZXJy b3Iod3IsIDApOworICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgICpidWYgPSBOVUxMOworICAg ICAgICAqc2l6ZSA9IDA7CisgICAgICAgIGF2X2R5bmJ1Zl93cml0ZXJfZmluYWxpemVfdW5zYWZl KHdyLCBOVUxMLCBOVUxMKTsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9IGVsc2UgeworICAg ICAgICByZXR1cm4gYXZfZHluYnVmX3dyaXRlcl9maW5hbGl6ZV91bnNhZmUod3IsIGJ1Ziwgc2l6 ZSk7CisgICAgfQorfQorCitpbnQgYXZfZHluYnVmX3dyaXRlcl9maW5hbGl6ZV91bnNhZmUoQVZX cml0ZXIgd3IsIGNoYXIgKipidWYsIHNpemVfdCAqc2l6ZSkKK3sKKyAgICBBVkR5bmJ1ZldyaXRl ciAqZHdyID0gd3Iub2JqOworCisgICAgYXZfYXNzZXJ0MChhdl9keW5idWZfd3JpdGVyX2NoZWNr KHdyKSk7CisgICAgZHluYnVmX3dyaXRlcl9hc3NlcnRfYWJpKGR3cik7CisgICAgaWYgKHNpemUp CisgICAgICAgICpzaXplID0gZHdyLT5icC5sZW47CisgICAgcmV0dXJuIGF2X2JwcmludF9maW5h bGl6ZSgmZHdyLT5icCwgYnVmKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQVZMb2dX cml0ZXIgLSB3cml0ZSB0byBhdl9sb2coKQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGlj IHZvaWQgbG9nX3dyaXRlcl92cHJpbnRmKEFWV3JpdGVyIHdyLCBjb25zdCBjaGFyICpmbXQsIHZh X2xpc3QgdmEpCit7CisgICAgYXZfYXNzZXJ0MChhdl9sb2dfd3JpdGVyX2NoZWNrKHdyKSk7Cisg ICAgYXZfdmxvZyh3ci5vYmosIEFWX0xPR19JTkZPLCBmbXQsIHZhKTsKK30KKworQVZfV1JJVEVS X0RFRklORV9NRVRIT0RTKC8qcHVibGljKi8sIEFWTG9nV3JpdGVyLCBhdl9sb2dfd3JpdGVyKSB7 CisgICAgLnNlbGZfc2l6ZSAgICAgICAgPSBzaXplb2YoQVZXcml0ZXJNZXRob2RzKSwKKyAgICAu bmFtZSAgICAgICAgICAgICA9ICJBVkxvZ1dyaXRlciIsCisgICAgLnZwcmludGYgICAgICAgICAg PSBsb2dfd3JpdGVyX3ZwcmludGYsCit9OworCitBVldyaXRlciBhdl9sb2dfd3JpdGVyKHZvaWQg Km9iaikKK3sKKyAgICBBVldyaXRlciB3ciA9IHsKKyAgICAgICAgLm1ldGhvZHMgPSBhdl9sb2df d3JpdGVyX2dldF9tZXRob2RzKCksCisgICAgICAgIC5vYmogICAgID0gb2JqLAorICAgIH07Cisg ICAgcmV0dXJuIHdyOworfQorCit2b2lkIGF2X2xvZ193cml0ZXJfbG9nKEFWV3JpdGVyIHdyLCBp bnQgbGV2ZWwsIGNvbnN0IGNoYXIgKmZtdCwgLi4uKQoreworICAgIHZhX2xpc3QgdmE7CisKKyAg ICB2YV9zdGFydCh2YSwgZm10KTsKKyAgICBpZiAoYXZfbG9nX3dyaXRlcl9jaGVjayh3cikpIHsK KyAgICAgICAgYXZfdmxvZyh3ci5vYmosIGxldmVsLCBmbXQsIHZhKTsKKyAgICB9IGVsc2Ugewor ICAgICAgICBhdl93cml0ZXJfdnByaW50Zih3ciwgZm10LCB2YSk7CisgICAgfQorICAgIHZhX2Vu ZCh2YSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEFWU3RkaW9Xcml0ZXIgLSB3cml0 ZSB0byBzdGRpbworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIHZvaWQgc3RkaW9fd3Jp dGVyX3ZwcmludGYoQVZXcml0ZXIgd3IsIGNvbnN0IGNoYXIgKmZtdCwgdmFfbGlzdCB2YSkKK3sK KyAgICBhdl9hc3NlcnQwKGF2X3N0ZGlvX3dyaXRlcl9jaGVjayh3cikpOworICAgIHZmcHJpbnRm KHdyLm9iaiwgZm10LCB2YSk7Cit9CisKK3N0YXRpYyBpbnQgc3RkaW9fd3JpdGVyX2dldF9lcnJv cihBVldyaXRlciB3ciwgaW50IHNlbGZfb25seSkKK3sKKyAgICBhdl9hc3NlcnQwKGF2X3N0ZGlv X3dyaXRlcl9jaGVjayh3cikpOworICAgIHJldHVybiBBVkVSUk9SKGZlcnJvcih3ci5vYmopKTsK K30KKworQVZfV1JJVEVSX0RFRklORV9NRVRIT0RTKC8qcHVibGljKi8sIEFWU3RkaW9Xcml0ZXIs IGF2X3N0ZGlvX3dyaXRlcikgeworICAgIC5zZWxmX3NpemUgICAgICAgID0gc2l6ZW9mKEFWV3Jp dGVyTWV0aG9kcyksCisgICAgLm5hbWUgICAgICAgICAgICAgPSAiQVZTdGRpb1dyaXRlciIsCisg ICAgLnZwcmludGYgICAgICAgICAgPSBzdGRpb193cml0ZXJfdnByaW50ZiwKKyAgICAuZ2V0X2Vy cm9yICAgICAgICA9IHN0ZGlvX3dyaXRlcl9nZXRfZXJyb3IsCit9OworCitBVldyaXRlciBhdl9z dGRpb193cml0ZXIoRklMRSAqb3V0KQoreworICAgIEFWV3JpdGVyIHdyID0geworICAgICAgICAu bWV0aG9kcyA9IGF2X3N0ZGlvX3dyaXRlcl9nZXRfbWV0aG9kcygpLAorICAgICAgICAub2JqICAg ICA9IG91dCwKKyAgICB9OworICAgIHJldHVybiB3cjsKK30KZGlmZiAtLWdpdCBhL2xpYmF2dXRp bC93cml0ZXIuaCBiL2xpYmF2dXRpbC93cml0ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRl eCAwMDAwMDAwMDAwLi5kMTFmYTJmMDFlCi0tLSAvZGV2L251bGwKKysrIGIvbGliYXZ1dGlsL3dy aXRlci5oCkBAIC0wLDAgKzEsNDg4IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDIzIFRoZSBG Rm1wZWcgcHJvamVjdAorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisg KiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29y CisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwg UHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3Vu ZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91 ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRl ZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5Z IFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNI QU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUg R05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgor ICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIg R2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3Jp dGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGlu IFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisj aWZuZGVmIEFWVVRJTF9XUklURVJfSAorI2RlZmluZSBBVlVUSUxfV1JJVEVSX0gKKworI2luY2x1 ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkZGVmLmg+CisjaW5jbHVkZSA8c3RkYXJnLmg+CisK KyNpbmNsdWRlICJleHRlbmRhYmxlLmgiCisjaW5jbHVkZSAiYnByaW50LmgiCisKKy8qKgorICog QGRlZmdyb3VwIGF2X3dyaXRlciBBVldyaXRlcgorICoKKyAqIE9iamVjdC1vcmllbnRlZCBBUEkg dG8gd3JpdGUgc3RyaW5ncyBhbmQgYmluYXJ5IGRhdGEuCisgKgorICogQHsKKyAqLworCit0eXBl ZGVmIHN0cnVjdCBBVldyaXRlck1ldGhvZHMgQVZXcml0ZXJNZXRob2RzOworCisvKioKKyAqIE9w YXF1ZSBvYmplY3QgdG8gd3JpdGUgc3RyaW5ncyBhbmQgYmluYXJ5IGRhdGEuCisgKgorICogQVZX cml0ZXIgaXMgbWVhbnQgdG8gYWxsb3cgdG8gYnVpbGQgYW5kIHJldHVybiBzdHJpbmdzIChhbmQg YmxvY2tzIG9mCisgKiBiaW5hcnkgZGF0YSkgZWZmaWNpZW50bHkgYmV0d2VlbiBmdW5jdGlvbnMu CisgKiBGb3IgZXhhbXBsZSwgYSBmdW5jdGlvbiB0aGF0IHNlcmlhbGl6ZXMgc29tZXRoaW5nIGlu dG8gYSBzdHJpbmcgd2lsbAorICogYWN0dWFsbHkgd3JpdGUgaW50byBhbiBBVldyaXRlciwgYW5k IHRoZSBjYWxsZXIgd2lsbCBjaG9vc2UgdGhlIHdheSB0aGUKKyAqIGRhdGEgd2lsbCBiZSBzdG9y ZWQgb3IgcHJvY2Vzc2VkIG9uIHRoZSBmbHkuCisgKgorICogRm9yIGEgcXVpY2sgaW50cm9kdWN0 aW9uIG9uIGhvdyB0byB1c2UgQVZXcml0ZXIgaW4gc2ltcGxlIGNhc2VzLCBzZWUKKyAqIGRvYy9h dndyaXRlcl9pbnRyby5tZC4KKyAqCisgKiBUaGVyZSBhcmUgdmFyaW91cyBwcmUtZGVmaW5lZCB0 eXBlcyBvZiBBVldyaXRlciwgc2VlIGJlbG93OgorICoKKyAqIC0gYXZfZHluYnVmX3dyaXRlcigp IHdyaXRlcyB0aGUgZGF0YSBpbnRvIGEgYnVmZmVyIHRoYXQgaXMgZ3Jvd24gd2l0aAorICogICBh dl9yZWFsbG9jKCkgaWYgaXQgZG9lcyBub3QgZml0IGluIHRoZSBpbml0aWFsIGJ1ZmZlcjsgaXQg aXMgdGhlCisgKiAgIHJlY29tbWVuZGVkIGNob2ljZS4KKyAqCisgKiAtIGF2X2J1Zl93cml0ZXIo KSB3cml0ZXMgdGhlIGRhdGEgaW50byBhIHByZS1leGlzdGluZyBmaW5pdGUgYnVmZmVyLgorICoK KyAqIC0gYXZfc3RkaW9fd3JpdGVyKCkgd3JpdGVzIHRoZSBkYXRhIGludG8gYSBGSUxFKi4KKyAq CisgKiAtIGF2X2xvZ193cml0ZXIoKSB3cml0ZXMgdGhlIGRhdGEgdG8gYXZfbG9nKCkuCisgKgor ICogQVZXcml0ZXIgb2JqZWN0cyBhcmUgcGFzc2VkIGJ5IHZhbHVlLiBJdCBhbGxvd3MgY3JlYXRp bmcgYSB3cml0ZXIgb24gdGhlCisgKiBmbHksIHdpdGhvdXQgZXh0cmEgdmFyaWFibGUgb3IgZXJy b3IgY2hlY2tpbmcuIFRoZSBzdHJ1Y3R1cmUgY2FuIG5ldmVyCisgKiBjaGFuZ2UuCisgKi8KK3R5 cGVkZWYgc3RydWN0IEFWV3JpdGVyIHsKKyAgICBjb25zdCBBVldyaXRlck1ldGhvZHMgKm1ldGhv ZHM7CisgICAgdm9pZCAqb2JqOworfSBBVldyaXRlcjsKKworLyoqCisgKiBXcml0ZSBhIGRhdGEg YnVmZmVyIHRvIGFuIEFWV3JpdGVyLgorICovCit2b2lkIGF2X3dyaXRlcl93cml0ZShBVldyaXRl ciB3ciwgY29uc3QgY2hhciAqYnVmLCBzaXplX3Qgc2l6ZSk7CisKKy8qKgorICogV3JpdGUgYSAw LXRlcm1pbmF0ZWQgc3RyaW5nIHRvIGFuIEFWV3JpdGVyLgorICovCit2b2lkIGF2X3dyaXRlcl9w cmludChBVldyaXRlciB3ciwgY29uc3QgY2hhciAqc3RyKTsKKworLyoqCisgKiBXcml0ZSBhIGZv cm1hdHRlZCBzdHJpbmcgdG8gYW4gQVZXcml0ZXIuCisgKiBOb3RlOiBkbyBub3QgdXNlIGxpYmMt c3BlY2lmaWMgZXh0ZW5zaW9ucyB0byB0aGUgZm9ybWF0IHN0cmluZy4KKyAqLwordm9pZCBhdl93 cml0ZXJfcHJpbnRmKEFWV3JpdGVyIHdyLCBjb25zdCBjaGFyICpmbXQsIC4uLik7CisKKy8qKgor ICogV3JpdGUgYSBmb3JtYXR0ZWQgdG8gc3RyaW5nIGFuIEFWV3JpdGVyIHVzaW5nIGEgdmFfbGlz dC4KKyAqLwordm9pZCBhdl93cml0ZXJfdnByaW50ZihBVldyaXRlciB3ciwgY29uc3QgY2hhciAq Zm10LCB2YV9saXN0IHZhKTsKKworLyoqCisgKiBXcml0ZSBhIHNlcXVlbmNlIG9mIGlkZW50aWNh bCBjaGFycyB0byBhbiBBVldyaXRlci4KKyAqLwordm9pZCBhdl93cml0ZXJfYWRkX2NoYXJzKEFW V3JpdGVyIHdyLCBjaGFyIGMsIHNpemVfdCBuKTsKKworLyoqCisgKiBGbHVzaCBkYXRhIHRoYXQg bWF5IGJlIGJ1ZmZlcmVkIGluIHRoZSB3cml0ZXIuCisgKi8KK3ZvaWQgYXZfd3JpdGVyX2ZsdXNo KEFWV3JpdGVyIHdyKTsKKworLyoqCisgKiBSZXR1cm4gdGhlIGVycm9yIHN0YXR1cyBvZiB0aGUg d3JpdGVyLCBhbiBBVkVSUk9SIGNvZGUuCisgKgorICogSWYgc2VsZl9vbmx5IGlzIG5vbi16ZXJv LCByZXR1cm4gZXJyb3JzIG9ubHkgb24gdGhpcyB3cml0ZXIgYW5kIG5vdCBvbgorICogcG9zc2li bGUgb3RoZXIgd3JpdGVycyB0aGF0IGl0IGdvdCBmcm9tIHRoZSBjYWxsZXIuIElmIGluIGRvdWJ0 LCB1c2UgMC4KKyAqLworaW50IGF2X3dyaXRlcl9nZXRfZXJyb3IoQVZXcml0ZXIgd3IsIGludCBz ZWxmX29ubHkpOworCisvKioKKyAqIFByaW50IGEgc2FuZSB2YWx1ZSBmb3IgaW52YWxpZCBpbnB1 dC4KKyAqCisgKiBUaGlzIGlzIGEgZmxhZyBmb3IgYWxsIGF2X3NvbWV0aGluZ193cml0ZSgpIGZ1 bmN0aW9uczogd2hlbiBwcmVzZW50ZWQKKyAqIHdpdGggYW4gaW52YWxpZCAic29tZXRoaW5nIiwg aWYgdGhlIGZsYWcgaXMgbm90IHByZXNlbnQgdGhleSBzaG91bGQgbGVhdmUKKyAqIHRoZSB3cml0 ZXIgdW5jaGFuZ2VkOyBpZiB0aGUgZmxhZyBpcyBwcmVzZW50IHRoZXkgc2hvdWxkIHByaW50IGEg c2FuZQorICogZmFsbGJhY2sgc3RyaW5nLgorICovCisjZGVmaW5lIEFWX1dSSVRFUl9GQUxMQkFD SyAweDEwMDAwCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKgorICogQGRlZmdyb3VwIGF2 X2R5bmJ1Zl93cml0ZXIgQVZEeW5idWZXcml0ZXIKKyAqCisgKiBBbiBpbXBsZW1lbnRhdGlvbiBv ZiBBVldyaXRlciB0aGF0IHdyaXRlcyB0byBhIGR5bmFtaWMgYnVmZmVyLgorICoKKyAqIFRoZSBi dWZmZXIgaXMga2VwdCAwLXRlcm1pbmF0ZWQuCisgKgorICogVGhlIGJ1ZmZlciBpcyBpbml0aWFs bHkga2VwdCBpbiB0aGUgQVZXcml0ZXIgZGF0YSBpdHNlbGYsIGl0IHN3aXRjaGVzIHRvCisgKiBo ZWFwIGFsbG9jYXRpb24gaWYgaXQgZ3Jvd3MgdG9vIGxhcmdlLiBJbiB0aGF0IGNhc2UsCisgKiBh dl93cml0ZXJfZ2V0X2Vycm9yKCkgY2FuIHJldHVybiBBVkVSUk9SKEVOT01FTSkgaWYgdGhlIGFs bG9jYXRpb24gZmFpbHMuCisgKgorICogQHsKKyAqLworCisvKioKKyAqIEFuIEFWV3JpdGVyIG9i amVjdCBmb3IgcHJlLWFsbG9jYXRlZCBtZW1vcnkgYnVmZmVycy4KKyAqCisgKiBDYW4gYmUgYWxs b2NhdGVkIG9uIHRoZSBzdGFjay4KKyAqCisgKiBTaG91bGQgYmUgaW5pdGVkIHdpdGggb25lIG9m IHRoZSB1dGlsaXR5IGZ1bmN0aW9ucy4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgQVZEeW5idWZXcml0 ZXIgeworICAgIHNpemVfdCBzZWxmX3NpemU7IC8qKjwgU2l6ZSBvZiB0aGUgc3RydWN0dXJlIGl0 c2VsZiAqLworICAgIHVuc2lnbmVkIGZsYWdzOworICAgIEFWQlByaW50IGJwOworfSBBVkR5bmJ1 ZldyaXRlcjsKKworY29uc3QgQVZXcml0ZXJNZXRob2RzICphdl9keW5idWZfd3JpdGVyX2dldF9t ZXRob2RzKHZvaWQpOworaW50IGF2X2R5bmJ1Zl93cml0ZXJfY2hlY2soQVZXcml0ZXIgd3IpOwor CisvKioKKyAqIEluaXRpYWxpemUgYW4gQVZEeW5idWZXcml0ZXIuCisgKgorICogQHJldHVybiAg ZHdyIGl0c2VsZgorICogZHdyLT5zZWxmX3NpemUgbXVzdCBiZSBzZXQuCisgKi8KK0FWRHluYnVm V3JpdGVyICphdl9keW5idWZfd3JpdGVyX2luaXQoQVZEeW5idWZXcml0ZXIgKmR3cik7CisKKy8q KgorICogQ3JlYXRlIGFuIEFWV3JpdGVyIGZyb20gYW4gQVZEeW5idWZXcml0ZXIgc3RydWN0dXJl LgorICovCitBVldyaXRlciBhdl9keW5idWZfd3JpdGVyX3dyYXAoQVZEeW5idWZXcml0ZXIgKmR3 cik7CisKKy8qKgorICogQ3JlYXRlIGFuIEFWV3JpdGVyIHRvIGEgZHluYW1pYyBidWZmZXIuCisg KgorICogTm90ZTogYXMgaXQgcmVsaWVzIG9uIGEgY29tcG91bmQgc3RhdGVtZW50LCB0aGUgQVZE eW5idWZXcml0ZXIgb2JqZWN0IGhhcworICogYSBzY29wZSBsaW1pdGVkIHRvIHRoZSBibG9jayB3 aGVyZSB0aGlzIG1hY3JvIGlzIGNhbGxlZC4KKyAqLworI2RlZmluZSBhdl9keW5idWZfd3JpdGVy KCkgXAorICAgIGF2X2R5bmJ1Zl93cml0ZXJfd3JhcChhdl9keW5idWZfd3JpdGVyX2luaXQoJkZG X05FV19TWihBVkR5bmJ1ZldyaXRlcikpKQorCisvKioKKyAqIEdldCBhIHBvaW50ZXIgdG8gdGhl IGJ1ZmZlciBkYXRhIG9mIGFuIEFWV3JpdGVyIHRvIGEgZHluYW1pYyBidWZmZXIuCisgKgorICog SWYgbm90IG51bGwsIHNpemUgd2lsbCBiZSBzZXQgdG8gdGhlIHNpemUgb2YgdGhlIGRhdGEgaW4g dGhlIGJ1ZmZlci4KKyAqCisgKiBVbmRlZmluZWQgYmVoYXZpb3IgaWYgY2FsbGVkIHdpdGggYW5v dGhlciB0eXBlIG9mIEFWV3JpdGVyLgorICogVW5kZWZpbmVkIGJlaGF2aW9yIGlmIGNhbGxlZCB3 aXRob3V0IGNoZWNraW5nIGZvciBlcnJvciBmaXJzdC4KKyAqLworY2hhciAqYXZfZHluYnVmX3dy aXRlcl9nZXRfZGF0YShBVldyaXRlciB3ciwgc2l6ZV90ICpzaXplKTsKKworLyoqCisgKiBHZXQg YSBwb2ludGVyIHRvIHRoZSBidWZmZXIgZGF0YSBvZiBhbiBBVldyaXRlciB0byBhIGR5bmFtaWMg YnVmZmVyCisgKiAodW5zYWZlIHZlcnNpb24pLgorICoKKyAqIElmIG5vdCBudWxsLCBzaXplIHdp bGwgYmUgc2V0IHRvIHRoZSBzaXplIG9mIHRoZSBkYXRhIGluIHRoZSBidWZmZXIuCisgKgorICog SWYgdGhlIHdyaXRlciBpcyBpbiBlcnJvciwgdGhlIGRhdGEgbWF5IGJlIHRydW5jYXRlZC4KKyAq CisgKiBVbmRlZmluZWQgYmVoYXZpb3IgaWYgY2FsbGVkIHdpdGggYW5vdGhlciB0eXBlIG9mIEFW V3JpdGVyLgorICovCitjaGFyICphdl9keW5idWZfd3JpdGVyX2dldF9kYXRhX3Vuc2FmZShBVldy aXRlciB3ciwgc2l6ZV90ICpzaXplKTsKKworLyoqCisgKiBGaW5hbGl6ZSBhbiBBVldyaXRlciB0 byBhIGR5bmFtaWMgYnVmZmVyLgorICoKKyAqIEBhcmdbb3V0XSBidWYgICBpZiBub3QgTlVMTCwg dXNlZCB0byByZXR1cm4gdGhlIGJ1ZmZlciBjb250ZW50cworICogQGFyZ1tvdXRdIHNpemUgIGlm IG5vdCBOVUxMLCB1c2VkIHRvIHJldHVybiB0aGUgc2l6ZSBvZiB0aGUgZGF0YQorICogQHJldHVy biAgMCBmb3Igc3VjY2VzcyBvciBlcnJvciBjb2RlIChwcm9iYWJseSBBVkVSUk9SKEVOT01FTSkp CisgKgorICogSW4gY2FzZSBvZiBlcnJvciwgdGhlIGJ1ZmZlciB3aWxsIG5vdCBiZSBkdXBsaWNh dGVkIGJ1dCBzdGlsbCBmcmVlZC4KKyAqIFNhbWUgaWYgdGhlIHdyaXRlciBpcyBhbHJlYWR5IGlu IGVycm9yLgorICoKKyAqIFVuZGVmaW5lZCBiZWhhdmlvciBpZiBjYWxsZWQgd2l0aCBhbm90aGVy IHR5cGUgb2YgQVZXcml0ZXIuCisgKi8KK2ludCBhdl9keW5idWZfd3JpdGVyX2ZpbmFsaXplKEFW V3JpdGVyIHdyLCBjaGFyICoqYnVmLCBzaXplX3QgKnNpemUpOworCisvKioKKyAqIEZpbmFsaXpl IGFuIEFWV3JpdGVyIHRvIGEgZHluYW1pYyBidWZmZXIgKHVuc2FmZSB2ZXJzaW9uKS4KKyAqCisg KiBAYXJnW291dF0gYnVmICAgaWYgbm90IE5VTEwsIHVzZWQgdG8gcmV0dXJuIHRoZSBidWZmZXIg Y29udGVudHMKKyAqIEBhcmdbb3V0XSBzaXplICBpZiBub3QgTlVMTCwgdXNlZCB0byByZXR1cm4g dGhlIHNpemUgb2YgdGhlIGRhdGEKKyAqIEByZXR1cm4gIDAgZm9yIHN1Y2Nlc3Mgb3IgZXJyb3Ig Y29kZSAocHJvYmFibHkgQVZFUlJPUihFTk9NRU0pKQorICoKKyAqIElmIHRoZSB3cml0ZXIgaXMg aW4gZXJyb3IsIHRoZSByZXR1cm5lZCBkYXRhIG1heSBiZSB0cnVuY2F0ZWQuCisgKgorICogSW4g Y2FzZSBvZiBlcnJvciwgdGhlIGJ1ZmZlciB3aWxsIG5vdCBiZSBkdXBsaWNhdGVkIGJ1dCBzdGls bCBmcmVlZC4KKyAqCisgKiBVbmRlZmluZWQgYmVoYXZpb3IgaWYgY2FsbGVkIHdpdGggYW5vdGhl ciB0eXBlIG9mIEFWV3JpdGVyLgorICovCitpbnQgYXZfZHluYnVmX3dyaXRlcl9maW5hbGl6ZV91 bnNhZmUoQVZXcml0ZXIgd3IsIGNoYXIgKipidWYsIHNpemVfdCAqc2l6ZSk7CisKKy8qKgorICog QWxsb2NhdGUgY2hhcnMgaW4gdGhlIGJ1ZmZlciBmb3IgZXh0ZXJuYWwgdXNlLgorICoKKyAqIFVu ZGVmaW5lZCBiZWhhdmlvciBpZiBjYWxsZWQgd2l0aCBhbm90aGVyIHR5cGUgb2YgQVZXcml0ZXIu CisgKi8KK2NoYXIgKmF2X2R5bmJ1Zl93cml0ZXJfZ2V0X2J1ZmZlcihBVldyaXRlciB3ciwgc2l6 ZV90IHNpemUsIHNpemVfdCAqcnNpemUpOworCisvKioKKyAqIEFkdmFuY2UgdGhlIHBvc2l0aW9u IGluIHRoZSBidWZmZXIuCisgKgorICogc2l6ZSBtdXN0IGJlIDw9ICpyc2l6ZSBvbiBhIHByZXZp b3VzIGNhbGwgdG8KKyAqIGF2X2R5bmJ1Zl93cml0ZXJfZ2V0X2J1ZmZlcigpLgorICoKKyAqIFVu ZGVmaW5lZCBiZWhhdmlvciBpZiBjYWxsZWQgd2l0aCBhbm90aGVyIHR5cGUgb2YgQVZXcml0ZXIu CisgKiBVbmRlZmluZWQgYmVoYXZpb3IgaWYgY2FsbGVkIG5vdCBkaXJlY3RseSBhZnRlcgorICog YXZfZHluYnVmX3dyaXRlcl9nZXRfYnVmZmVyKCkuCisgKi8KK3ZvaWQgYXZfZHluYnVmX3dyaXRl cl9hZHZhbmNlX2J1ZmZlcihBVldyaXRlciB3ciwgc2l6ZV90IHNpemUpOworCisvKioKKyAqIEB9 CisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqCisgKiBAZGVmZ3JvdXAgYXZfYnVm X3dyaXRlciBBVkJ1ZldyaXRlcgorICoKKyAqIEFuIGltcGxlbWVudHRpb24gb2YgQVZXcml0ZXIg dGhhdCB3cml0ZXMgaW50byBhbiBhbHJlYWR5LWFsbG9jYXRlZCBidWZmZXIKKyAqIG9mIG1lbW9y eS4KKyAqCisgKiBUaGUgYnVmZmVyIGlzIGtlcHQgMC10ZXJtaW5hdGVkLiBJZiB0aGUgYnVmZmVy IGlzIHRvbyBzbWFsbCwgdGhlIGRhdGEgaXMKKyAqIGRpc2NhcmRlZCwgYnV0IHRoZSB0b3RhbCBz aXplIGlzIGNvbXB1dGVkLgorICoKKyAqIEB7CisgKi8KKworLyoqCisgKiBBbiBBVldyaXRlciBv YmplY3QgZm9yIHByZS1hbGxvY2F0ZWQgbWVtb3J5IGJ1ZmZlcnMuCisgKgorICogQ2FuIGJlIGFs bG9jYXRlZCBvbiB0aGUgc3RhY2suCisgKgorICogU2hvdWxkIGJlIGluaXRlZCB3aXRoIG9uZSBv ZiB0aGUgdXRpbGl0eSBmdW5jdGlvbnMuCisgKi8KK3R5cGVkZWYgc3RydWN0IEFWQnVmV3JpdGVy IHsKKyAgICBzaXplX3Qgc2VsZl9zaXplOyAvKio8IFNpemUgb2YgdGhlIHN0cnVjdHVyZSBpdHNl bGYgKi8KKyAgICBjaGFyICpidWY7IC8qKjwgTWVtb3J5IGJ1ZmZlci4gTXVzdCBub3QgYmUgTlVM TCBub3IgZW1wdHkuICovCisgICAgc2l6ZV90IHNpemU7IC8qKjwgU2l6ZSBvZiB0aGUgbWVtb3J5 IGJ1ZmZlci4gTXVzdCBub3QgYmUgMC4gKi8KKyAgICBzaXplX3QgcG9zOyAvKio8IFBvc2l0aW9u IGluIHRoZSBtZW1vcnkgYnVmZmVyLiAqLworfSBBVkJ1ZldyaXRlcjsKKworY29uc3QgQVZXcml0 ZXJNZXRob2RzICphdl9idWZfd3JpdGVyX2dldF9tZXRob2RzKHZvaWQpOworaW50IGF2X2J1Zl93 cml0ZXJfY2hlY2soQVZXcml0ZXIgd3IpOworCisvKioKKyAqIEluaXRpYWxpemUgYW4gQVZCdWZX cml0ZXIgdG8gYW4gYWxyZWFkeS1hbGxvY2F0ZWQgbWVtb3J5IGJ1ZmZlci4KKyAqCisgKiBAcmV0 dXJuICBid3IgaXRzZWxmCisgKiBid3ItPnNlbGZfc2l6ZSBtdXN0IGJlIHNldC4KKyAqLworQVZC dWZXcml0ZXIgKmF2X2J1Zl93cml0ZXJfaW5pdChBVkJ1ZldyaXRlciAqYndyLCBjaGFyICpidWYs IHNpemVfdCBzaXplKTsKKworLyoqCisgKiBDcmVhdGUgYW4gQVZXcml0ZXIgZnJvbSBhbiBBVkJ1 ZldyaXRlciBzdHJ1Y3R1cmUuCisgKi8KK0FWV3JpdGVyIGF2X2J1Zl93cml0ZXJfd3JhcChBVkJ1 ZldyaXRlciAqYndyKTsKKworLyoqCisgKiBDcmVhdGUgYW4gQVZXcml0ZXIgdG8gYSBidWZmZXIu CisgKgorICogTm90ZTogYXMgaXQgcmVsaWVzIG9uIGEgY29tcG91bmQgc3RhdGVtZW50LCB0aGUg QVZCdWZXcml0ZXIgb2JqZWN0IGhhcworICogYSBzY29wZSBsaW1pdGVkIHRvIHRoZSBibG9jayB3 aGVyZSB0aGlzIG1hY3JvIGlzIGNhbGxlZC4KKyAqLworI2RlZmluZSBhdl9idWZfd3JpdGVyKGJ1 Ziwgc2l6ZSkgXAorICAgIGF2X2J1Zl93cml0ZXJfd3JhcChhdl9idWZfd3JpdGVyX2luaXQoJkZG X05FV19TWihBVkJ1ZldyaXRlciksIChidWYpLCAoc2l6ZSkpKQorCisvKioKKyAqIENyZWF0ZSBh biBBVldyaXRlciB0byBhIGNoYXJbXSBvciBlcXVpdmFsZW50LgorICoKKyAqIE5vdGU6IGFzIGl0 IHJlbGllcyBvbiBhIGNvbXBvdW5kIHN0YXRlbWVudCwgdGhlIEFWQnVmV3JpdGVyIG9iamVjdCBo YXMKKyAqIGEgc2NvcGUgbGltaXRlZCB0byB0aGUgYmxvY2sgd2hlcmUgdGhpcyBtYWNybyBpcyBj YWxsZWQuCisgKi8KKyNkZWZpbmUgYXZfYnVmX3dyaXRlcl9hcnJheShhcnJheSkgXAorICAgIGF2 X2J1Zl93cml0ZXIoYXJyYXksIHNpemVvZiAoYXJyYXkpKQorCisvKioKKyAqIEB9CisgKi8KKwor LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKi8KKworLyoqCisgKiBAZGVmZ3JvdXAgYXZfc3RkaW9fd3JpdGVy IEFWU3RkaW9Xcml0ZXIKKyAqCisgKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiBBVldyaXRlciB0aGF0 IHdyaXRlcyB0byBzdGRpby4KKyAqCisgKiBAeworICovCisKK2NvbnN0IEFWV3JpdGVyTWV0aG9k cyAqYXZfc3RkaW9fd3JpdGVyX2dldF9tZXRob2RzKHZvaWQpOworaW50IGF2X3N0ZGlvX3dyaXRl cl9jaGVjayhBVldyaXRlciB3cik7CisKKy8qKgorICogQ3JlYXRlIGFuIEFWV3JpdGVyIHRoYXQg Z29lcyB0byBhIHN0ZGlvIEZJTEUuCisgKi8KK0FWV3JpdGVyIGF2X3N0ZGlvX3dyaXRlcihGSUxF ICpvdXQpOworCisvKioKKyAqIEB9CisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoq CisgKiBAZGVmZ3JvdXAgYXZfbG9nX3dyaXRlciBBVkxvZ1dyaXRlcgorICoKKyAqIEFuIGltcGxl bWVudGF0aW9uIG9mIEFWV3JpdGVyIHRoYXQgd3JpdGVzIHRvIGF2X2xvZygpLgorICoKKyAqIEB7 CisgKi8KKworY29uc3QgQVZXcml0ZXJNZXRob2RzICphdl9sb2dfd3JpdGVyX2dldF9tZXRob2Rz KHZvaWQpOworaW50IGF2X2xvZ193cml0ZXJfY2hlY2soQVZXcml0ZXIgd3IpOworCisvKioKKyAq IENyZWF0ZSBhbiBBVldyaXRlciB0aGF0IGdvZXMgdG8gYXZfbG9nKG9iaikuCisgKi8KK0FWV3Jp dGVyIGF2X2xvZ193cml0ZXIodm9pZCAqb2JqKTsKKworLyoqCisgKiBMb2cgdG8gYSB3cml0ZXIu CisgKiBJZiB3ciBkb2VzIG5vdCBnbyB0byBhdl9sb2coKSwgbGV2ZWwgaXMgaWdub3JlZC4KKyAq Lwordm9pZCBhdl9sb2dfd3JpdGVyX2xvZyhBVldyaXRlciB3ciwgaW50IGxldmVsLCBjb25zdCBj aGFyICpmbXQsIC4uLik7CisKKy8qKgorICogQH0KKyAqLworCisvKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq LworCisvKioKKyAqIEBkZWZncm91cCBhdl93cml0ZXJfbWV0aG9kcyBBVldyaXRlck1ldGhvZHMK KyAqCisgKiBTdHJ1Y3R1cmVzIGFuZCB1dGlsaXR5IG5lZWRlZCB0byBkZWZpbmUgbmV3IHR5cGVz IG9mIEFWV3JpdGVyLgorICoKKyAqIEB7CisgKi8KKworLyoqCisgKiBTZXQgb2YgbWV0aG9kcyBm b3IgaW1wbGVtZW50aW5nIGFuIEFWV3JpdGVyLgorICoKKyAqIEFwcGxpY2F0aW9ucyB0aGF0IHdh bnQgdG8gaW1wbGVtZW50IG90aGVyIGtpbmRzIG9mIEFWV3JpdGVyCisgKiBuZWVkIHRvIGNyZWF0 ZSBhIHN0cnVjdHVyZSB3aXRoIHNvbWUgb2YgdGhlc2UgbWV0aG9kcyBpbXBsZW1lbnRlZC4KKyAq CisgKiBUaGVzZSBtZXRob2RzIHNob3VsZCBvbmx5IGJlIGNhbGxlZCBkaXJlY3RseSBieSB0aGUg aW1wbGVtZW50YXRpb24gb2YKKyAqIEFWV3JpdGVyLiBUaGVpciBkb2N1bWVudGF0aW9uIGlzIHdy aXR0ZW4gZnJvbSB0aGUgcG9pbnQgb2YgdmlldyBvZgorICogaW1wbGVtZW50aW5nIHRoZW0uCisg KgorICogRXZlcnkgdHlwZSBvZiBBVldyaXRlciBpcyBzdXBwb3NlZCB0byBoYXZlIGEgcGFpciBv ZiBmdW5jdGlvbnM6CisgKiBhdl9zb21ldGhpbmdfd3JpdGVyX2dldF9tZXRob2RzKCkgcmV0dXJu cyB0aGUgbWV0aG9kcyBmb3IgdGhhdCB0eXBlLgorICogYXZfc29tZXRoaW5nX3dyaXRlcl9jaGVj a3MoKSByZXR1cm5zIDEgaWYgdGhlIHdyaXRlciBpcyBvZiB0aGF0IHR5cGUuCisgKgorICogQSBt YWNybyB0byBkZWZpbmUgdGhlIHN0cnVjdHVyZSBhbmQgZnVuY3Rpb25zIGlzIHByb3ZpZGVkIGJl bG93LgorICoKKyAqIFdoZW4gYSB0eXBlIG9mIEFWV3JpdGVyIGRlZmluZXMgc3BlY2lmaWMgZnVu Y3Rpb25zLCBpdCBpcyB1c3VhbGx5IHRoZQorICogcmVzcG9uc2liaWxpdHkgb2YgdGhlIGNhbGxl ciB0byBlbnN1cmUgdGhhdCB0aGV5IGFyZSBjYWxsZWQgb25seSB3aXRoIGEKKyAqIGNvbXBhdGli bGUgQVZXcml0ZXI7IG90aGVyd2lzZSB0aGUgYmVoYXZpb3IgaXMgdW5kZWZpbmVkLgorICovCitz dHJ1Y3QgQVZXcml0ZXJNZXRob2RzIHsKKworICAgIC8qKgorICAgICAqIFNpemUgb2YgdGhlIHN0 cnVjdHVyZSBpdHNlbGYuCisgICAgICogTXVzdCBub3JtYWxseSBiZSBzZXQgdG8gc2l6ZW9mKEFW V3JpdGVyTWV0aG9kcykuCisgICAgICovCisgICAgc2l6ZV90IHNlbGZfc2l6ZTsKKworICAgIC8q KgorICAgICAqIE5hbWUgb2YgdGhlIG9iamVjdCB0eXBlLgorICAgICAqLworICAgIGNvbnN0IGNo YXIgKm5hbWU7CisKKyAgICAvKioKKyAgICAgKiBXYXJuIHRoYXQgYW4gb3BlcmF0aW9uIHdhcyBp bXBvc3NpYmxlIGV2ZW4gd2l0aCBmYWxsYmFja3MuCisgICAgICovCisgICAgdm9pZCAoKm5vdGlm eV9pbXBvc3NpYmxlKShBVldyaXRlciB3ciwgY29uc3QgY2hhciAqbWVzc2FnZSk7CisKKyAgICAv KioKKyAgICAgKiBOb3RpZnkgdGhhdCBzaXplIGNoYXJzIGhhdmUgYmVlbiBkaXNjYXJkZWQKKyAg ICAgKi8KKyAgICB2b2lkICgqbm90aWZ5X2Rpc2NhcmQpKEFWV3JpdGVyIHdyLCBzaXplX3Qgc2l6 ZSk7CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIGVycm9yIHN0YXR1cyBvZiB0aGUgd3JpdGVy CisgICAgICogSWYgc2VsZl9vbmx5IGlzIG5vbi16ZXJvLCByZXR1cm4gZXJyb3JzIG9ubHkgb24g dGhpcyB3cml0ZXIgYW5kIG5vdCBvbgorICAgICAqIHBvc3NpYmxlIG90aGVyIHdyaXRlcnMgdGhh dCBpdCBnb3QgZnJvbSB0aGUgY2FsbGVyLiBFcnJvcnMgZnJvbQorICAgICAqIHdyaXRlcnMgY3Jl YXRlZCBpbnRlcm5hbGx5IHNob3VsZCBhbHdheXMgYmUgY2hlY2tlZC4KKyAgICAgKi8KKyAgICBp bnQgKCpnZXRfZXJyb3IpKEFWV3JpdGVyIHdyLCBpbnQgc2VsZl9vbmx5KTsKKworICAgIC8qKgor ICAgICAqIFdyaXRlIGNoYXJzIGRpcmVjdGx5LgorICAgICAqLworICAgIHZvaWQgKCp3cml0ZSko QVZXcml0ZXIgd3IsIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IHNpemUpOworCisgICAgLyoqCisg ICAgICogV3JpdGUgYSBmb3JtYXR0ZWQgc3RyaW5nLgorICAgICAqLworICAgIHZvaWQgKCp2cHJp bnRmKShBVldyaXRlciB3ciwgY29uc3QgY2hhciAqZm10LCB2YV9saXN0IGFwKTsKKworICAgIC8q KgorICAgICAqIEdldCBhIGJ1ZmZlciB0byB3cml0ZSBkYXRhLgorICAgICAqIElmIHRoZSByZXR1 cm5lZCAqc2l6ZSBpcyA8IG1pbl9zaXplLCBkYXRhIG1heSBnZXQgZGlzY2FyZGVkLgorICAgICAq IEEgd3JpdGVyIHRoYXQgaW1wbGVtZW50cyB0aGlzIG1ldGhvZCBtdXN0IGltcGxlbWVudCBhZHZh bmNlX2J1ZmZlciB0b28uCisgICAgICogSWYgdnByaW50ZiBpcyBub3QgaW1wbGVtZW50ZWQsIGF2 X3dyaXRlX3ByaW50ZigpIHdpbGwgdXNlCisgICAgICogZ2V0X2J1ZmZlcigpIGFuZCB2c25wcmlu dGYoKTogaXQgd2lsbCBuZWVkIGFuIGV4dHJhIGNoYXIgaW4gdGhlCisgICAgICogYnVmZmVyIGZv ciB0aGUgMCB0aGF0IHZzbnByaW50ZigpIGFkZHMuCisgICAgICovCisgICAgY2hhciAqKCpnZXRf YnVmZmVyKShBVldyaXRlciB3ciwgc2l6ZV90IG1pbl9zaXplLCBzaXplX3QgKnNpemUpOworCisg ICAgLyoqCisgICAgICogQWNrbm93bGVkZ2UgY2hhcnMgd3JpdHRlbiBpbiBhIGJ1ZmZlciBvYnRh aW5lZCB3aXRoIGdldF9idWZmZXIoKS4KKyAgICAgKiBzaXplIGlzIGd1YXJhbnRlZWQgPD0gdGhl IHNpemUgdmFsdWUgcmV0dXJuZWQgYnkgZ2V0X2J1ZmZlcigpLgorICAgICAqLworICAgIHZvaWQg KCphZHZhbmNlX2J1ZmZlcikoQVZXcml0ZXIgd3IsIHNpemVfdCBzaXplKTsKKworICAgIC8qKgor ICAgICAqIEZsdXNoIGltbWVkaWF0ZWx5IGRhdGEgdGhhdCBtYXkgYmUgYnVmZmVyZWQgaW4gdGhl IHdyaXRlci4KKyAgICAgKi8KKyAgICB2b2lkICgqZmx1c2gpKEFWV3JpdGVyIHdyKTsKKworfTsK KworLyoqCisgKiBDb252ZW5pZW5jZSBtYWNybyBmb3IgdGhlIGJvaWxlcnBsYXRlIG5lY2Vzc2Fy eSB0byBkZWZpbmUgYSB3cml0ZXIgY2xhc3MuCisgKgorICogQGFyZyBxdWFsICAgIHR5cGUgcXVh bGlmaWVyIGZvciBmb3IgdGhlIHN5bWJvbHMsIGZvciBleGFtcGxlICJzdGF0aWMiCisgKiBAYXJn IHR5cGUgICAgY2xhc3MgbmFtZSBmb3IgdGhlIHR5cGUgb2Ygd3JpdGVyLAorICogICAgICAgICAg ICAgIGZvciBleGFtcGxlICJBVkJ1ZldyaXRlciIgb3IgIk15V3JpdGVyIgorICogQGFyZyBwcmVm aXggIHByZWZpeCBmb3IgdGhlIHN5bWJvbHMsCisgKiAgICAgICAgICAgICAgZm9yIGV4YW1wbGUg ImF2X2J1Zl93cml0ZXIiIG9yICJteV93cml0ZXIiCisgKi8KKyNkZWZpbmUgQVZfV1JJVEVSX0RF RklORV9NRVRIT0RTKHF1YWwsIHR5cGUsIHByZWZpeCkgXAorc3RhdGljIGNvbnN0IEFWV3JpdGVy TWV0aG9kcyBwcmVmaXgjI19tZXRob2RzOyBcCitxdWFsIGNvbnN0IEFWV3JpdGVyTWV0aG9kcyAq cHJlZml4IyNfZ2V0X21ldGhvZHModm9pZCkgeyBcCisgICAgcmV0dXJuICZwcmVmaXgjI19tZXRo b2RzOyBcCit9IFwKK3F1YWwgaW50IHByZWZpeCMjX2NoZWNrKEFWV3JpdGVyIHdyKSB7IFwKKyAg ICByZXR1cm4gd3IubWV0aG9kcyA9PSBwcmVmaXgjI19nZXRfbWV0aG9kcygpOyBcCit9IFwKK3N0 YXRpYyBjb25zdCBBVldyaXRlck1ldGhvZHMgcHJlZml4IyNfbWV0aG9kcyA9CisKKy8qKgorICog QH0KKyAqLworCisvKioKKyAqIEB9CisgKi8KKworI2VuZGlmIC8qIEFWVVRJTF9XUklURVJfSCAq LwotLSAKMi4zOS4yCgpfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fXwpmZm1wZWctZGV2ZWwgbWFpbGluZyBsaXN0CmZmbXBlZy1kZXZlbEBmZm1wZWcub3JnCmh0 dHBzOi8vZmZtcGVnLm9yZy9tYWlsbWFuL2xpc3RpbmZvL2ZmbXBlZy1kZXZlbAoKVG8gdW5zdWJz Y3JpYmUsIHZpc2l0IGxpbmsgYWJvdmUsIG9yIGVtYWlsCmZmbXBlZy1kZXZlbC1yZXF1ZXN0QGZm bXBlZy5vcmcgd2l0aCBzdWJqZWN0ICJ1bnN1YnNjcmliZSIuCg==