From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 87339 invoked by alias); 27 Aug 2015 11:18:59 -0000 Mailing-List: contact gcc-patches-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Id: List-Archive: List-Post: List-Help: Sender: gcc-patches-owner@gcc.gnu.org Received: (qmail 87262 invoked by uid 89); 27 Aug 2015 11:18:58 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-2.5 required=5.0 tests=AWL,BAYES_00,FREEMAIL_FROM,RCVD_IN_DNSWL_LOW,SPF_PASS autolearn=ham version=3.3.2 X-HELO: mail-vk0-f42.google.com Received: from mail-vk0-f42.google.com (HELO mail-vk0-f42.google.com) (209.85.213.42) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with (AES128-GCM-SHA256 encrypted) ESMTPS; Thu, 27 Aug 2015 11:18:56 +0000 Received: by vkif69 with SMTP id f69so7330697vki.3 for ; Thu, 27 Aug 2015 04:18:54 -0700 (PDT) MIME-Version: 1.0 X-Received: by 10.52.114.161 with SMTP id jh1mr3803276vdb.74.1440674334346; Thu, 27 Aug 2015 04:18:54 -0700 (PDT) Received: by 10.31.10.78 with HTTP; Thu, 27 Aug 2015 04:18:54 -0700 (PDT) Date: Thu, 27 Aug 2015 11:35:00 -0000 Message-ID: Subject: [PATCH] New attribute to create target clones From: Evgeny Stupachenko To: GCC Patches , Jan Hubicka , Jeff Law Content-Type: multipart/mixed; boundary=bcaec548a4d9efaed7051e49213e X-IsSubscribed: yes X-SW-Source: 2015-08/txt/msg01685.txt.bz2 --bcaec548a4d9efaed7051e49213e Content-Type: text/plain; charset=UTF-8 Content-length: 1688 Hi All, Based on RFC: https://gcc.gnu.org/ml/gcc-patches/2015-08/msg01322.html The patch implement an extension to Function Multiversioning that allows to clone a function for multiple targets. __attribute__((target_clones("avx","arch=slm","default"))) int foo () ... Will create 3 clones of foo(). One optimized with -mavx, one optimized with -march=slm, and one with default optimizations. And will create ifunc resolver that calls appropriate clone (same as in Function Multiversioning). Bootstrap and make check for x86 passed. Is it ok for trunk? 2015-08-27 Evgeny Stupachenko gcc/ * Makefile.in (OBJS): Add multiple_target.o. * multiple_target.c (make_attribute): New. (create_dispatcher_calls): Ditto. (expand_target_clones): Ditto. (ipa_target_clone): Ditto. * passes.def (pass_target_clone): New ipa pass. * tree-pass.h (make_pass_target_clone): Ditto. gcc/c-family * c-common.c (handle_target_clones_attribute): New. * (c_common_attribute_table): Add handle_target_clones_attribute. * (handle_always_inline_attribute): Add check on target_clones attribute. * (handle_target_attribute): Ditto. gcc/testsuite * gcc.dg/mvc1.c: New test for multiple targets cloning. * gcc.dg/mvc2.c: Ditto. * gcc.dg/mvc3.c: Ditto. * gcc.dg/mvc4.c: Ditto. * gcc.dg/mvc5.c: Ditto. * gcc.dg/mvc6.c: Ditto. * gcc.dg/mvc7.c: Ditto. * g++.dg/ext/mvc1.C: Ditto. * g++.dg/ext/mvc2.C: Ditto. * g++.dg/ext/mvc3.C: Ditto. gcc/doc * doc/extend.texi (target_clones): New attribute description. --bcaec548a4d9efaed7051e49213e Content-Type: application/octet-stream; name="target_clones.patch" Content-Disposition: attachment; filename="target_clones.patch" Content-Transfer-Encoding: base64 X-Attachment-Id: f_idu49l2z0 Content-length: 27446 ZGlmZiAtLWdpdCBhL2djYy9NYWtlZmlsZS5pbiBiL2djYy9NYWtlZmlsZS5p bgppbmRleCBlMjk4ZWNjLi5mYzEyYWI5IDEwMDY0NAotLS0gYS9nY2MvTWFr ZWZpbGUuaW4KKysrIGIvZ2NjL01ha2VmaWxlLmluCkBAIC0xMzUwLDYgKzEz NTAsNyBAQCBPQkpTID0gXAogCW1jZi5vIFwKIAltb2RlLXN3aXRjaGluZy5v IFwKIAltb2R1bG8tc2NoZWQubyBcCisJbXVsdGlwbGVfdGFyZ2V0Lm8gXAog CW9tcC1sb3cubyBcCiAJb3B0YWJzLm8gXAogCW9wdGlvbnMtc2F2ZS5vIFwK ZGlmZiAtLWdpdCBhL2djYy9jLWZhbWlseS9jLWNvbW1vbi5jIGIvZ2NjL2Mt ZmFtaWx5L2MtY29tbW9uLmMKaW5kZXggNzY5MTAzNS4uMzFiYTMxZiAxMDA2 NDQKLS0tIGEvZ2NjL2MtZmFtaWx5L2MtY29tbW9uLmMKKysrIGIvZ2NjL2Mt ZmFtaWx5L2MtY29tbW9uLmMKQEAgLTM4MSw2ICszODEsNyBAQCBzdGF0aWMg dHJlZSBoYW5kbGVfYWxsb2Nfc2l6ZV9hdHRyaWJ1dGUgKHRyZWUgKiwgdHJl ZSwgdHJlZSwgaW50LCBib29sICopOwogc3RhdGljIHRyZWUgaGFuZGxlX2Fs bG9jX2FsaWduX2F0dHJpYnV0ZSAodHJlZSAqLCB0cmVlLCB0cmVlLCBpbnQs IGJvb2wgKik7CiBzdGF0aWMgdHJlZSBoYW5kbGVfYXNzdW1lX2FsaWduZWRf YXR0cmlidXRlICh0cmVlICosIHRyZWUsIHRyZWUsIGludCwgYm9vbCAqKTsK IHN0YXRpYyB0cmVlIGhhbmRsZV90YXJnZXRfYXR0cmlidXRlICh0cmVlICos IHRyZWUsIHRyZWUsIGludCwgYm9vbCAqKTsKK3N0YXRpYyB0cmVlIGhhbmRs ZV90YXJnZXRfY2xvbmVzX2F0dHJpYnV0ZSAodHJlZSAqLCB0cmVlLCB0cmVl LCBpbnQsIGJvb2wgKik7CiBzdGF0aWMgdHJlZSBoYW5kbGVfb3B0aW1pemVf YXR0cmlidXRlICh0cmVlICosIHRyZWUsIHRyZWUsIGludCwgYm9vbCAqKTsK IHN0YXRpYyB0cmVlIGlnbm9yZV9hdHRyaWJ1dGUgKHRyZWUgKiwgdHJlZSwg dHJlZSwgaW50LCBib29sICopOwogc3RhdGljIHRyZWUgaGFuZGxlX25vX3Nw bGl0X3N0YWNrX2F0dHJpYnV0ZSAodHJlZSAqLCB0cmVlLCB0cmVlLCBpbnQs IGJvb2wgKik7CkBAIC03ODgsNiArNzg5LDggQEAgY29uc3Qgc3RydWN0IGF0 dHJpYnV0ZV9zcGVjIGNfY29tbW9uX2F0dHJpYnV0ZV90YWJsZVtdID0KIAkJ CSAgICAgIGhhbmRsZV9lcnJvcl9hdHRyaWJ1dGUsIGZhbHNlIH0sCiAgIHsg InRhcmdldCIsICAgICAgICAgICAgICAgICAxLCAtMSwgdHJ1ZSwgZmFsc2Us IGZhbHNlLAogCQkJICAgICAgaGFuZGxlX3RhcmdldF9hdHRyaWJ1dGUsIGZh bHNlIH0sCisgIHsgInRhcmdldF9jbG9uZXMiLAkgICAgICAxLCAtMSwgdHJ1 ZSwgZmFsc2UsIGZhbHNlLAorCQkJICAgICAgaGFuZGxlX3RhcmdldF9jbG9u ZXNfYXR0cmlidXRlLCBmYWxzZSB9LAogICB7ICJvcHRpbWl6ZSIsICAgICAg ICAgICAgICAgMSwgLTEsIHRydWUsIGZhbHNlLCBmYWxzZSwKIAkJCSAgICAg IGhhbmRsZV9vcHRpbWl6ZV9hdHRyaWJ1dGUsIGZhbHNlIH0sCiAgIC8qIEZv ciBpbnRlcm5hbCB1c2Ugb25seS4gIFRoZSBsZWFkaW5nICcqJyBib3RoIHBy ZXZlbnRzIGl0cyB1c2FnZSBpbgpAQCAtNzM2Myw2ICs3MzY2LDEzIEBAIGhh bmRsZV9hbHdheXNfaW5saW5lX2F0dHJpYnV0ZSAodHJlZSAqbm9kZSwgdHJl ZSBuYW1lLAogCQkgICAid2l0aCAlcXMgYXR0cmlidXRlIiwgbmFtZSwgIm5v aW5saW5lIik7CiAJICAqbm9fYWRkX2F0dHJzID0gdHJ1ZTsKIAl9CisgICAg ICBlbHNlIGlmIChsb29rdXBfYXR0cmlidXRlICgidGFyZ2V0X2Nsb25lcyIs IERFQ0xfQVRUUklCVVRFUyAoKm5vZGUpKSkKKwl7CisJICB3YXJuaW5nIChP UFRfV2F0dHJpYnV0ZXMsCisJCSAgICIlcUUgYXR0cmlidXRlIGlnbm9yZWQg YXMgaXQgY29uZmxpY3Qgd2l0aCB0YXJnZXRfY2xvbmVzIiwKKwkJICAgbmFt ZSk7CisJICAqbm9fYWRkX2F0dHJzID0gdHJ1ZTsKKwl9CiAgICAgICBlbHNl CiAJLyogU2V0IHRoZSBhdHRyaWJ1dGUgYW5kIG1hcmsgaXQgZm9yIGRpc3Jl Z2FyZGluZyBpbmxpbmUKIAkgICBsaW1pdHMuICAqLwpAQCAtOTc3NCw2ICs5 Nzg0LDEyIEBAIGhhbmRsZV90YXJnZXRfYXR0cmlidXRlICh0cmVlICpub2Rl LCB0cmVlIG5hbWUsIHRyZWUgYXJncywgaW50IGZsYWdzLAogICAgICAgd2Fy bmluZyAoT1BUX1dhdHRyaWJ1dGVzLCAiJXFFIGF0dHJpYnV0ZSBpZ25vcmVk IiwgbmFtZSk7CiAgICAgICAqbm9fYWRkX2F0dHJzID0gdHJ1ZTsKICAgICB9 CisgIGVsc2UgaWYgKGxvb2t1cF9hdHRyaWJ1dGUgKCJ0YXJnZXRfY2xvbmVz IiwgREVDTF9BVFRSSUJVVEVTICgqbm9kZSkpKQorICAgIHsKKyAgICAgIHdh cm5pbmcgKE9QVF9XYXR0cmlidXRlcywKKwkgICAgICAgIiVxRSBhdHRyaWJ1 dGUgaWdub3JlZCBhcyBpdCBjb25mbGljdCB3aXRoIHRhcmdldF9jbG9uZXMi LCBuYW1lKTsKKyAgICAgICpub19hZGRfYXR0cnMgPSB0cnVlOworICAgIH0K ICAgZWxzZSBpZiAoISB0YXJnZXRtLnRhcmdldF9vcHRpb24udmFsaWRfYXR0 cmlidXRlX3AgKCpub2RlLCBuYW1lLCBhcmdzLAogCQkJCQkJICAgICAgZmxh Z3MpKQogICAgICpub19hZGRfYXR0cnMgPSB0cnVlOwpAQCAtOTc4MSw2ICs5 Nzk3LDM5IEBAIGhhbmRsZV90YXJnZXRfYXR0cmlidXRlICh0cmVlICpub2Rl LCB0cmVlIG5hbWUsIHRyZWUgYXJncywgaW50IGZsYWdzLAogICByZXR1cm4g TlVMTF9UUkVFOwogfQogCisvKiBIYW5kbGUgYSAidGFyZ2V0X2Nsb25lcyIg YXR0cmlidXRlLiAgKi8KKworc3RhdGljIHRyZWUKK2hhbmRsZV90YXJnZXRf Y2xvbmVzX2F0dHJpYnV0ZSAodHJlZSAqbm9kZSwgdHJlZSBuYW1lLCB0cmVl IEFSR19VTlVTRUQgKGFyZ3MpLAorCQkJICBpbnQgQVJHX1VOVVNFRCAoZmxh Z3MpLCBib29sICpub19hZGRfYXR0cnMpCit7CisgIC8qIEVuc3VyZSB3ZSBo YXZlIGEgZnVuY3Rpb24gdHlwZS4gICovCisgIGlmIChUUkVFX0NPREUgKCpu b2RlKSA9PSBGVU5DVElPTl9ERUNMKQorICAgIHsKKyAgICAgIGlmIChsb29r dXBfYXR0cmlidXRlICgiYWx3YXlzX2lubGluZSIsIERFQ0xfQVRUUklCVVRF UyAoKm5vZGUpKSkKKwl7CisJICB3YXJuaW5nIChPUFRfV2F0dHJpYnV0ZXMs CisJCSAgICIlcUUgYXR0cmlidXRlIGlnbm9yZWQgYXMgaXQgYXNzdW1lcyBu b2lubGluZSIsIG5hbWUpOworCSAgKm5vX2FkZF9hdHRycyA9IHRydWU7CisJ fQorICAgICAgZWxzZSBpZiAobG9va3VwX2F0dHJpYnV0ZSAoInRhcmdldCIs IERFQ0xfQVRUUklCVVRFUyAoKm5vZGUpKSkKKwl7CisJICB3YXJuaW5nIChP UFRfV2F0dHJpYnV0ZXMsCisJCSAgICIlcUUgYXR0cmlidXRlIGlnbm9yZWQg YXMgaXQgY29uZmxpY3Qgd2l0aCB0YXJnZXQiLCBuYW1lKTsKKwkgICpub19h ZGRfYXR0cnMgPSB0cnVlOworCX0KKyAgICAgIGVsc2UKKyAgICAgIC8qIERv IG5vdCBpbmxpbmUgZnVuY3Rpb25zIHdpdGggbXVsdGlwbGUgY2xvbmUgdGFy Z2V0cy4gICovCisJREVDTF9VTklOTElOQUJMRSAoKm5vZGUpID0gMTsKKyAg ICB9CisgIGVsc2UKKyAgICB7CisgICAgICB3YXJuaW5nIChPUFRfV2F0dHJp YnV0ZXMsICIlcUUgYXR0cmlidXRlIGlnbm9yZWQiLCBuYW1lKTsKKyAgICAg ICpub19hZGRfYXR0cnMgPSB0cnVlOworICAgIH0KKyAgcmV0dXJuIE5VTExf VFJFRTsKK30KKwogLyogQXJndW1lbnRzIGJlaW5nIGNvbGxlY3RlZCBmb3Ig b3B0aW1pemF0aW9uLiAgKi8KIHR5cGVkZWYgY29uc3QgY2hhciAqY29uc3Rf Y2hhcl9wOwkJLyogRm9yIERFRl9WRUNfUC4gICovCiBzdGF0aWMgR1RZKCgp KSB2ZWM8Y29uc3RfY2hhcl9wLCB2YV9nYz4gKm9wdGltaXplX2FyZ3M7CmRp ZmYgLS1naXQgYS9nY2MvZG9jL2V4dGVuZC50ZXhpIGIvZ2NjL2RvYy9leHRl bmQudGV4aQppbmRleCBkYmE4YjQzLi5jMGI1ODc1IDEwMDY0NAotLS0gYS9n Y2MvZG9jL2V4dGVuZC50ZXhpCisrKyBiL2djYy9kb2MvZXh0ZW5kLnRleGkK QEAgLTMwNjYsNiArMzA2NiwxOSBAQCBUaGlzIGZ1bmN0aW9uIGF0dHJpYnV0 ZSBtYWtlIGEgc3RhY2sgcHJvdGVjdGlvbiBvZiB0aGUgZnVuY3Rpb24gaWYK IGZsYWdzIEBvcHRpb257ZnN0YWNrLXByb3RlY3Rvcn0gb3IgQG9wdGlvbntm c3RhY2stcHJvdGVjdG9yLXN0cm9uZ30KIG9yIEBvcHRpb257ZnN0YWNrLXBy b3RlY3Rvci1leHBsaWNpdH0gYXJlIHNldC4KIAorQGl0ZW0gdGFyZ2V0X2Ns b25lcyAoQHZhcntvcHRpb25zfSkKK0BjaW5kZXggQGNvZGV7dGFyZ2V0X2Ns b25lc30gZnVuY3Rpb24gYXR0cmlidXRlCitUaGUgQGNvZGV7dGFyZ2V0X2Ns b25lc30gYXR0cmlidXRlIGlzIHVzZWQgdG8gc3BlY2lmeSB0aGF0IGEgZnVu Y3Rpb24gaXMgdG8KK2JlIGNsb25lZCBpbnRvIG11bHRpcGxlIHZlcnNpb25z IGNvbXBpbGVkIHdpdGggZGlmZmVyZW50IHRhcmdldCBvcHRpb25zCit0aGFu IHNwZWNpZmllZCBvbiB0aGUgY29tbWFuZCBsaW5lLiAgVGhlIHN1cHBvcnRl ZCBvcHRpb25zIGFuZCByZXN0cmljdGlvbnMKK2FyZSB0aGUgc2FtZSBhcyBm b3IgQGNvZGV7dGFyZ2V0fS4KKworRm9yIGluc3RhbmNlIG9uIGFuIHg4Niwg eW91IGNvdWxkIGNvbXBpbGUgYSBmdW5jdGlvbiB3aXRoCitAY29kZXt0YXJn ZXRfY2xvbmVzKCJzc2U0LjEsYXZ4Iil9LiAgSXQgd2lsbCBjcmVhdGUgMiBm dW5jdGlvbiBjbG9uZXMsCitvbmUgY29tcGlsZWQgd2l0aCBAb3B0aW9uey1t c3NlNC4xfSBhbmQgYW5vdGhlciB3aXRoIEBvcHRpb257LW1hdnh9LgorQXQg dGhlIGZ1bmN0aW9uIGNhbGwgaXQgd2lsbCBjcmVhdGUgcmVzb2x2ZXIgQGNv ZGV7aWZ1bmN9LCB0aGF0IHdpbGwKK2R5bmFtaWNhbGx5IGNhbGwgYSBjbG9u ZSBzdWl0YWJsZSBmb3IgY3VycmVudCBhcmNoaXRlY3R1cmUuCisKIEBpdGVt IHRhcmdldCAoQHZhcntvcHRpb25zfSkKIEBjaW5kZXggQGNvZGV7dGFyZ2V0 fSBmdW5jdGlvbiBhdHRyaWJ1dGUKIE11bHRpcGxlIHRhcmdldCBiYWNrIGVu ZHMgaW1wbGVtZW50IHRoZSBAY29kZXt0YXJnZXR9IGF0dHJpYnV0ZQpkaWZm IC0tZ2l0IGEvZ2NjL211bHRpcGxlX3RhcmdldC5jIGIvZ2NjL211bHRpcGxl X3RhcmdldC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAu LjE5NDZkYmEKLS0tIC9kZXYvbnVsbAorKysgYi9nY2MvbXVsdGlwbGVfdGFy Z2V0LmMKQEAgLTAsMCArMSwzMzEgQEAKKy8qIFBhc3MgZm9yIHBhcnNpbmcg ZnVuY3Rpb25zIHdpdGggbXVsdGlwbGUgdGFyZ2V0IGF0dHJpYnV0ZXMuCisK KyAgIENvbnRyaWJ1dGVkIGJ5IEV2Z2VueSBTdHVwYWNoZW5rbyA8ZXZzdHVw YWNAZ21haWwuY29tPgorCisgICBDb3B5cmlnaHQgKEMpIDIwMTUgRnJlZSBT b2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0 IG9mIEdDQy4KKworR0NDIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVk aXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIKK3RoZSB0ZXJt cyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlz aGVkIGJ5IHRoZSBGcmVlCitTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIg dmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgordmVy c2lvbi4KKworR0NDIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQg aXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWQorV0FSUkFOVFk7 IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFO VEFCSUxJVFkgb3IKK0ZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NF LiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorZm9yIG1v cmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29w eSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdp dGggR0NDOyBzZWUgdGhlIGZpbGUgQ09QWUlORzMuICBJZiBub3Qgc2VlCis8 aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAqLworCisjaW5jbHVk ZSAiY29uZmlnLmgiCisjaW5jbHVkZSAic3lzdGVtLmgiCisjaW5jbHVkZSAi Y29yZXR5cGVzLmgiCisjaW5jbHVkZSAiYmFja2VuZC5oIgorI2luY2x1ZGUg InRyZWUuaCIKKyNpbmNsdWRlICJzdHJpbmdwb29sLmgiCisjaW5jbHVkZSAi Z2ltcGxlLmgiCisjaW5jbHVkZSAiZGlhZ25vc3RpYy1jb3JlLmgiCisjaW5j bHVkZSAiZ2ltcGxlLXNzYS5oIgorI2luY2x1ZGUgImNncmFwaC5oIgorI2lu Y2x1ZGUgInRyZWUtcGFzcy5oIgorI2luY2x1ZGUgInRhcmdldC5oIgorI2lu Y2x1ZGUgInByZXR0eS1wcmludC5oIgorCisvKiBNYWtlcyBhIGZ1bmN0aW9u IGF0dHJpYnV0ZSBvZiB0aGUgZm9ybSBOQU1FKEFSR19OQU1FKSBhbmQgY2hh aW5zCisgICBpdCB0byBDSEFJTi4gICovCisKK3N0YXRpYyB0cmVlCittYWtl X2F0dHJpYnV0ZSAoY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqYXJn X25hbWUsIHRyZWUgY2hhaW4pCit7CisgIHRyZWUgYXR0cl9uYW1lOworICB0 cmVlIGF0dHJfYXJnX25hbWU7CisgIHRyZWUgYXR0cl9hcmdzOworICB0cmVl IGF0dHI7CisKKyAgYXR0cl9uYW1lID0gZ2V0X2lkZW50aWZpZXIgKG5hbWUp OworICBhdHRyX2FyZ19uYW1lID0gYnVpbGRfc3RyaW5nIChzdHJsZW4gKGFy Z19uYW1lKSwgYXJnX25hbWUpOworICBhdHRyX2FyZ3MgPSB0cmVlX2NvbnMg KE5VTExfVFJFRSwgYXR0cl9hcmdfbmFtZSwgTlVMTF9UUkVFKTsKKyAgYXR0 ciA9IHRyZWVfY29ucyAoYXR0cl9uYW1lLCBhdHRyX2FyZ3MsIGNoYWluKTsK KyAgcmV0dXJuIGF0dHI7Cit9CisKKy8qIElmIHRoZSBjYWxsIGluIE5PREUg aGFzIG11bHRpcGxlIHRhcmdldCBhdHRyaWJ1dGUgd2l0aCBtdWx0aXBsZSBm aWVsZHMsCisgICByZXBsYWNlIGl0IHdpdGggZGlzcGF0Y2hlciBjYWxsIGFu ZCBjcmVhdGUgZGlzcGF0Y2hlciAob25jZSkuICAqLworCitzdGF0aWMgdm9p ZAorY3JlYXRlX2Rpc3BhdGNoZXJfY2FsbHMgKHN0cnVjdCBjZ3JhcGhfbm9k ZSAqbm9kZSkKK3sKKyAgY2dyYXBoX2VkZ2UgKmU7CisgIGNncmFwaF9lZGdl ICplX25leHQ7CisgIGZvciAoZSA9IG5vZGUtPmNhbGxlcnM7IGUgO2UgPSAo ZSA9PSBOVUxMKSA/IGVfbmV4dCA6IGUtPm5leHRfY2FsbGVyKQorICAgIHsK KyAgICAgIHRyZWUgcmVzb2x2ZXJfZGVjbDsKKyAgICAgIHRyZWUgaWRlY2w7 CisgICAgICB0cmVlIGRlY2w7CisgICAgICBnaW1wbGUgY2FsbCA9IGUtPmNh bGxfc3RtdDsKKyAgICAgIHN0cnVjdCBjZ3JhcGhfbm9kZSAqaW5vZGU7CisK KyAgICAgIC8qIENoZWNraW5nIGlmIGNhbGwgb2YgZnVuY3Rpb24gaXMgY2Fs bCBvZiB2ZXJzaW9uZWQgZnVuY3Rpb24uCisJIFZlcnNpb25lZCBmdW5jdGlv biBhcmUgbm90IGlubGluZWQsIHNvIHRoZXJlIGlzIG5vIG5lZWQgdG8KKwkg Y2hlY2sgZm9yIGlubGluZS4gICovCisgICAgICBpZiAoIWNhbGwKKwkgIHx8 ICEoZGVjbCA9IGdpbXBsZV9jYWxsX2ZuZGVjbCAoY2FsbCkpCisJICB8fCAh REVDTF9GVU5DVElPTl9WRVJTSU9ORUQgKGRlY2wpKQorCWNvbnRpbnVlOwor CisgICAgICBlX25leHQgPSBlLT5uZXh0X2NhbGxlcjsKKyAgICAgIGlkZWNs ID0gdGFyZ2V0bS5nZXRfZnVuY3Rpb25fdmVyc2lvbnNfZGlzcGF0Y2hlciAo ZGVjbCk7CisgICAgICBpZiAoIWlkZWNsKQorCXsKKwkgIGVycm9yX2F0IChn aW1wbGVfbG9jYXRpb24gKGNhbGwpLAorCQkgICAgImRlZmF1bHQgdGFyZ2V0 X2Nsb25lcyBhdHRyaWJ1dGUgd2FzIG5vdCBzZXQiKTsKKwl9CisgICAgICBp bm9kZSA9IGNncmFwaF9ub2RlOjpnZXQgKGlkZWNsKTsKKyAgICAgIGdjY19h c3NlcnQgKGlub2RlKTsKKyAgICAgIHJlc29sdmVyX2RlY2wgPSB0YXJnZXRt LmdlbmVyYXRlX3ZlcnNpb25fZGlzcGF0Y2hlcl9ib2R5IChpbm9kZSk7CisK KyAgICAgIC8qIFVwZGF0ZSBhbGlhc2VzLiAgKi8KKyAgICAgIGlub2RlLT5h bGlhcyA9IHRydWU7CisgICAgICBpbm9kZS0+YWxpYXNfdGFyZ2V0ID0gcmVz b2x2ZXJfZGVjbDsKKyAgICAgIGlmICghaW5vZGUtPmFuYWx5emVkKQorCWlu b2RlLT5yZXNvbHZlX2FsaWFzIChjZ3JhcGhfbm9kZTo6Z2V0IChyZXNvbHZl cl9kZWNsKSk7CisgICAgICBlLT5yZWRpcmVjdF9jYWxsZWUgKGlub2RlKTsK KyAgICAgIGdpbXBsZV9jYWxsX3NldF9mbmRlY2wgKGNhbGwsIGlkZWNsKTsK KyAgICAgIC8qICBGb3JjZSB0byBtb3ZlIHRvIG5leHQgZWRnZSBjYWxsZXIu ICAqLworICAgICAgZSA9IE5VTEw7CisgICAgfQorfQorCisvKiBJZiB0aGUg ZnVuY3Rpb24gaW4gTk9ERSBoYXMgbXVsdGlwbGUgdGFyZ2V0IGF0dHJpYnV0 ZSB3aXRoIG11bHRpcGxlIGZpZWxkcywKKyAgIGNyZWF0ZSB0aGUgYXBwcm9w cmlhdGUgY2xvbmUgZm9yIGVhY2ggZmllbGQuICAqLworCitzdGF0aWMgYm9v bAorZXhwYW5kX3RhcmdldF9jbG9uZXMgKHN0cnVjdCBjZ3JhcGhfbm9kZSAq bm9kZSkKK3sKKyAgdHJlZSBpZDsKKyAgLyogUGFyc2luZyB0YXJnZXQgYXR0 cmlidXRlcyBzZXBhcmF0ZWQgYnkgY29tbWEuICAqLworICB0cmVlIGF0dHJf dGFyZ2V0ID0gbG9va3VwX2F0dHJpYnV0ZSAoInRhcmdldF9jbG9uZXMiLAor CQkJCSAgICAgICBERUNMX0FUVFJJQlVURVMgKG5vZGUtPmRlY2wpKTsKKyAg LyogTm8gdGFyZ2V0cyBzcGVjaWZpZWQuICAqLworICBpZiAoIWF0dHJfdGFy Z2V0KQorICAgIHJldHVybiBmYWxzZTsKKworICB0cmVlIGFyZzsKKyAgdHJl ZSBhcmdsaXN0ID0gVFJFRV9WQUxVRSAoYXR0cl90YXJnZXQpOworICBzaXpl X3Qgc3RyX2xlbl9zdW0gPSAwOworICBjaGFyICoqYXJncyA9IE5VTEw7Cisg IGNoYXIgKmF0dHJfc3RyOworICBjaGFyICphdHRyID0gTlVMTDsKKyAgaW50 IGFyZ251bSA9IDE7CisgIGludCBpOworCisgIGZvciAoYXJnID0gYXJnbGlz dDsgYXJnOyBhcmcgPSBUUkVFX0NIQUlOIChhcmcpKQorICAgIHsKKyAgICAg IHVuc2lnbmVkIGludCBpOworICAgICAgY29uc3QgY2hhciAqc3RyID0gVFJF RV9TVFJJTkdfUE9JTlRFUiAoVFJFRV9WQUxVRSAoYXJnKSk7CisgICAgICBz aXplX3QgbGVuID0gc3RybGVuIChzdHIpOworICAgICAgc3RyX2xlbl9zdW0g Kz0gbGVuICsgMTsKKyAgICAgIGlmIChhcmcgIT0gYXJnbGlzdCkKKwlhcmdu dW0rKzsKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBzdHJsZW4gKHN0cik7IGkr KykKKwlpZiAoc3RyW2ldID09ICcsJykKKwkgIGFyZ251bSsrOworICAgIH0K KworICAvKiBObyBuZWVkIHRvIGNsb25lIGZvciAxIHRhcmdldCBhdHRyaWJ1 dGUuICAqLworICBpZiAoYXJnbnVtID09IDEpCisgICAgeworICAgICAgd2Fy bmluZ19hdCAoREVDTF9TT1VSQ0VfTE9DQVRJT04gKG5vZGUtPmRlY2wpLAor CQkgIDAsCisJCSAgInNpbmdsZSB0YXJnZXRfY2xvbmVzIGF0dHJpYnV0ZSBp cyBpZ25vcmVkIik7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisg IGF0dHJfc3RyID0gWE5FV1ZFQyAoY2hhciwgc3RyX2xlbl9zdW0pOworICBz dHJfbGVuX3N1bSA9IDA7CisgIGZvciAoYXJnID0gYXJnbGlzdDsgYXJnOyBh cmcgPSBUUkVFX0NIQUlOIChhcmcpKQorICAgIHsKKyAgICAgIGNvbnN0IGNo YXIgKnN0ciA9IFRSRUVfU1RSSU5HX1BPSU5URVIgKFRSRUVfVkFMVUUgKGFy ZykpOworICAgICAgc2l6ZV90IGxlbiA9IHN0cmxlbiAoc3RyKTsKKyAgICAg IG1lbWNweSAoYXR0cl9zdHIgKyBzdHJfbGVuX3N1bSwgc3RyLCBsZW4pOwor ICAgICAgYXR0cl9zdHJbc3RyX2xlbl9zdW0gKyBsZW5dID0gVFJFRV9DSEFJ TiAoYXJnKSA/ICcsJyA6ICdcMCc7CisgICAgICBzdHJfbGVuX3N1bSArPSBs ZW4gKyAxOworICAgIH0KKworICBhcmdzID0gWE5FV1ZFQyAoY2hhciAqLCBh cmdudW0pOworICBib29sIGhhc19kZWZhdWx0ID0gZmFsc2U7CisgIGF0dHIg PSBzdHJ0b2sgKGF0dHJfc3RyLCAiLCIpOworICBpID0gMDsKKyAgd2hpbGUg KGF0dHIgIT0gTlVMTCkKKyAgICB7CisgICAgICBpZiAoc3RyY21wIChhdHRy LCAiZGVmYXVsdCIpID09IDApCisJeworCSAgaGFzX2RlZmF1bHQgPSB0cnVl OworCSAgYXR0ciA9IHN0cnRvayAoTlVMTCwgIiwiKTsKKwkgIGNvbnRpbnVl OworCX0KKyAgICAgIGFyZ3NbaV0gPSBhdHRyOworICAgICAgYXR0ciA9IHN0 cnRvayAoTlVMTCwgIiwiKTsKKyAgICAgIGkrKzsKKyAgICB9CisKKyAgaW50 IGFyZ3NfbnVtID0gaTsKKworICBjb25zdCBjaGFyICpvbGRfYXNtX25hbWU7 CisgIG9sZF9hc21fbmFtZSA9IElERU5USUZJRVJfUE9JTlRFUiAoREVDTF9B U1NFTUJMRVJfTkFNRSAobm9kZS0+ZGVjbCkpOworCisgIGNncmFwaF9mdW5j dGlvbl92ZXJzaW9uX2luZm8gKmRlY2wxX3YgPSBOVUxMOworICBjZ3JhcGhf ZnVuY3Rpb25fdmVyc2lvbl9pbmZvICpkZWNsMl92ID0gTlVMTDsKKyAgY2dy YXBoX2Z1bmN0aW9uX3ZlcnNpb25faW5mbyAqYmVmb3JlID0gTlVMTDsKKyAg Y2dyYXBoX2Z1bmN0aW9uX3ZlcnNpb25faW5mbyAqYWZ0ZXIgPSBOVUxMOwor ICB0cmVlIGF0dHJpYnV0ZXMgPSBOVUxMOworICBpZiAoIWhhc19kZWZhdWx0 KQorICAgIGVycm9yX2F0IChERUNMX1NPVVJDRV9MT0NBVElPTiAobm9kZS0+ ZGVjbCksCisJICAgICAgImRlZmF1bHQgdGFyZ2V0IHdhcyBub3Qgc2V0Iik7 CisgIGF0dHJpYnV0ZXMgPSBtYWtlX2F0dHJpYnV0ZSAoInRhcmdldCIsICJk ZWZhdWx0IiwgTlVMTCk7CisgIERFQ0xfQVRUUklCVVRFUyAobm9kZS0+ZGVj bCkgPSBhdHRyaWJ1dGVzOworICB0YXJnZXRtLnRhcmdldF9vcHRpb24udmFs aWRfYXR0cmlidXRlX3AgKG5vZGUtPmRlY2wsIE5VTEwsCisJCQkJCSAgIFRS RUVfVkFMVUUgKGF0dHJpYnV0ZXMpLCAwKTsKKyAgZGVjbDFfdiA9IG5vZGUt PmZ1bmN0aW9uX3ZlcnNpb24gKCk7CisgIGlmIChkZWNsMV92ID09IE5VTEwp CisgICAgZGVjbDFfdiA9IG5vZGUtPmluc2VydF9uZXdfZnVuY3Rpb25fdmVy c2lvbiAoKTsKKyAgYmVmb3JlID0gZGVjbDFfdjsKKyAgREVDTF9GVU5DVElP Tl9WRVJTSU9ORUQgKG5vZGUtPmRlY2wpID0gMTsKKworICAvKiBTZXR0aW5n IG5ldyBhdHRyaWJ1dGUgdG8gaW5pdGlhbCBmdW5jdGlvbi4gICovCisKKyAg Zm9yIChpID0gMDsgaSA8IGFyZ3NfbnVtOyBpKyspCisgICAgeworICAgICAg cHJldHR5X3ByaW50ZXIgcHA7CisgICAgICBhdHRyID0gYXJnc1tpXTsKKyAg ICAgIGNncmFwaF9ub2RlICpuZXdfbm9kZTsKKyAgICAgIHVuc2lnbmVkIGlu dCBqOworCisgICAgICBpZiAobm9kZS0+ZGVmaW5pdGlvbikKKwl7CisJICBp ZiAoIW5vZGUtPmhhc19naW1wbGVfYm9keV9wICgpKQorCSAgICByZXR1cm4g ZmFsc2U7CisJICBub2RlLT5nZXRfYm9keSAoKTsKKworCSAgLyogUmVwbGFj aW5nIGluaXRpYWwgZnVuY3Rpb24gd2l0aCBjbG9uZSBvbmx5IGZvciAxc3Qg dGFyZ2V0LiAgKi8KKwkgIG5ld19ub2RlID0gbm9kZS0+Y3JlYXRlX3ZlcnNp b25fY2xvbmVfd2l0aF9ib2R5ICh2TlVMTCwgTlVMTCwKKwkJCQkJCQkgICBO VUxMLCBmYWxzZSwKKwkJCQkJCQkgICBOVUxMLCBOVUxMLAorCQkJCQkJCSAg ICJ0YXJnZXRfY2xvbmUiKTsKKwkgIG5ld19ub2RlLT5leHRlcm5hbGx5X3Zp c2libGUgPSBub2RlLT5leHRlcm5hbGx5X3Zpc2libGU7CisJICBuZXdfbm9k ZS0+YWRkcmVzc190YWtlbiA9IG5vZGUtPmFkZHJlc3NfdGFrZW47CisJICBu ZXdfbm9kZS0+dGh1bmsgPSBub2RlLT50aHVuazsKKwkgIG5ld19ub2RlLT5h bGlhcyA9IG5vZGUtPmFsaWFzOworCSAgbmV3X25vZGUtPndlYWtyZWYgPSBu b2RlLT53ZWFrcmVmOworCSAgbmV3X25vZGUtPmNwcF9pbXBsaWNpdF9hbGlh cyA9IG5vZGUtPmNwcF9pbXBsaWNpdF9hbGlhczsKKwkgIG5ld19ub2RlLT5s b2NhbC5sb2NhbCA9IG5vZGUtPmxvY2FsLmxvY2FsOworCSAgVFJFRV9QVUJM SUMgKG5ld19ub2RlLT5kZWNsKSA9IFRSRUVfUFVCTElDIChub2RlLT5kZWNs KTsKKwl9CisgICAgICBlbHNlCisJeworCSAgdHJlZSBuZXdfZGVjbCA9IGNv cHlfbm9kZSAobm9kZS0+ZGVjbCk7CisJICBuZXdfbm9kZSA9IGNncmFwaF9u b2RlOjpnZXRfY3JlYXRlIChuZXdfZGVjbCk7CisJfQorCisJY29uc3QgY2hh ciAqbmV3X2FzbV9uYW1lOworCWNoYXIgKm5ld19zdWZmaXg7CisJbmV3X3N1 ZmZpeCA9IFhORVdWRUMgKGNoYXIsIHN0cmxlbiAoYXR0cikgKyAxKTsKKwlt ZW1jcHkgKG5ld19zdWZmaXgsIGF0dHIsIHN0cmxlbiAoYXR0cikgKyAxKTsK KworCS8qIFJlcGxhY2UgYWxsICc9JyBhbmQgJy0nIGluIHRhcmdldCBvcHRp b24gd2l0aCAnXycuICAqLworCWZvciAoaiA9IDA7IGogPCBzdHJsZW4gKG5l d19zdWZmaXgpOyBqKyspCisJICBpZiAobmV3X3N1ZmZpeFtqXSA9PSAnPScg fHwgbmV3X3N1ZmZpeFtqXSA9PSAnLScpCisJICAgIG5ld19zdWZmaXhbal0g PSAnXyc7CisKKwlwcF9zdHJpbmcgKCZwcCwgb2xkX2FzbV9uYW1lKTsKKwlw cF9zdHJpbmcgKCZwcCwgIi4iKTsKKwlwcF9zdHJpbmcgKCZwcCwgbmV3X3N1 ZmZpeCk7CisJbmV3X2FzbV9uYW1lID0gcHBfZm9ybWF0dGVkX3RleHQgKCZw cCk7CisJaWQgPSBnZXRfaWRlbnRpZmllciAobmV3X2FzbV9uYW1lKTsKKwlz eW10YWItPmNoYW5nZV9kZWNsX2Fzc2VtYmxlcl9uYW1lIChuZXdfbm9kZS0+ ZGVjbCwgaWQpOworCVhERUxFVEVWRUMgKG5ld19zdWZmaXgpOworCisJLyog U2V0dGluZyBuZXcgYXR0cmlidXRlIHRvIGNsb25lZCBmdW5jdGlvbi4gICov CisJdHJlZSBhdHRyaWJ1dGVzID0gbWFrZV9hdHRyaWJ1dGUgKCJ0YXJnZXQi LCBhdHRyLCBOVUxMX1RSRUUpOworCURFQ0xfQVRUUklCVVRFUyAobmV3X25v ZGUtPmRlY2wpID0gYXR0cmlidXRlczsKKwl0YXJnZXRtLnRhcmdldF9vcHRp b24udmFsaWRfYXR0cmlidXRlX3AgKG5ld19ub2RlLT5kZWNsLCBOVUxMLAor CQkJCQkJIFRSRUVfVkFMVUUgKGF0dHJpYnV0ZXMpLCAwKTsKKwlkZWNsMl92 ID0gbmV3X25vZGUtPmZ1bmN0aW9uX3ZlcnNpb24gKCk7CisJaWYgKGRlY2wy X3YgIT0gTlVMTCkKKwkgIGNvbnRpbnVlOworCWRlY2wyX3YgPSBuZXdfbm9k ZS0+aW5zZXJ0X25ld19mdW5jdGlvbl92ZXJzaW9uICgpOworCisJLyogQ2hh aW4gZGVjbDJfdiBhbmQgZGVjbDFfdi4gIEFsbCBzZW1hbnRpY2FsbHkgaWRl bnRpY2FsIHZlcnNpb25zCisJICAgd2lsbCBiZSBjaGFpbmVkIHRvZ2V0aGVy LiAgKi8KKworCWFmdGVyID0gZGVjbDJfdjsKKwl3aGlsZSAoYmVmb3JlLT5u ZXh0ICE9IE5VTEwpCisJICBiZWZvcmUgPSBiZWZvcmUtPm5leHQ7CisJd2hp bGUgKGFmdGVyLT5wcmV2ICE9IE5VTEwpCisJICBhZnRlciA9IGFmdGVyLT5w cmV2OworCisJYmVmb3JlLT5uZXh0ID0gYWZ0ZXI7CisJYWZ0ZXItPnByZXYg PSBiZWZvcmU7CisJREVDTF9GVU5DVElPTl9WRVJTSU9ORUQgKG5ld19ub2Rl LT5kZWNsKSA9IDE7CisgICAgfQorICBYREVMRVRFVkVDIChhcmdzKTsKKyAg WERFTEVURVZFQyAoYXR0cl9zdHIpOworICByZXR1cm4gdHJ1ZTsKK30KKwor c3RhdGljIHVuc2lnbmVkIGludAoraXBhX3RhcmdldF9jbG9uZSAodm9pZCkK K3sKKyAgc3RydWN0IGNncmFwaF9ub2RlICpub2RlOworICBib29sIHJlcyA9 IGZhbHNlOworICBGT1JfRUFDSF9GVU5DVElPTiAobm9kZSkKKyAgICByZXMg fD0gZXhwYW5kX3RhcmdldF9jbG9uZXMgKG5vZGUpOworICBpZiAocmVzKQor ICAgIEZPUl9FQUNIX0ZVTkNUSU9OIChub2RlKQorICAgICAgY3JlYXRlX2Rp c3BhdGNoZXJfY2FsbHMgKG5vZGUpOworICByZXR1cm4gMDsKK30KKworbmFt ZXNwYWNlIHsKKworY29uc3QgcGFzc19kYXRhIHBhc3NfZGF0YV90YXJnZXRf Y2xvbmUgPQoreworICBTSU1QTEVfSVBBX1BBU1MsCQkvKiB0eXBlICovCisg ICJ0YXJnZXRjbG9uZSIsCQkvKiBuYW1lICovCisgIE9QVEdST1VQX05PTkUs CQkvKiBvcHRpbmZvX2ZsYWdzICovCisgIFRWX05PTkUsCQkJLyogdHZfaWQg Ki8KKyAgKCBQUk9QX3NzYSB8IFBST1BfY2ZnICksCS8qIHByb3BlcnRpZXNf cmVxdWlyZWQgKi8KKyAgMCwJCQkJLyogcHJvcGVydGllc19wcm92aWRlZCAq LworICAwLAkJCQkvKiBwcm9wZXJ0aWVzX2Rlc3Ryb3llZCAqLworICAwLAkJ CQkvKiB0b2RvX2ZsYWdzX3N0YXJ0ICovCisgIDAsCQkJCS8qIHRvZG9fZmxh Z3NfZmluaXNoICovCit9OworCitjbGFzcyBwYXNzX3RhcmdldF9jbG9uZSA6 IHB1YmxpYyBzaW1wbGVfaXBhX29wdF9wYXNzCit7CitwdWJsaWM6CisgIHBh c3NfdGFyZ2V0X2Nsb25lIChnY2M6OmNvbnRleHQgKmN0eHQpCisgICAgOiBz aW1wbGVfaXBhX29wdF9wYXNzIChwYXNzX2RhdGFfdGFyZ2V0X2Nsb25lLCBj dHh0KQorICB7fQorCisgIC8qIG9wdF9wYXNzIG1ldGhvZHM6ICovCisgIHZp cnR1YWwgYm9vbCBnYXRlIChmdW5jdGlvbiAqKTsKKyAgdmlydHVhbCB1bnNp Z25lZCBpbnQgZXhlY3V0ZSAoZnVuY3Rpb24gKikgeyByZXR1cm4gaXBhX3Rh cmdldF9jbG9uZSAoKTsgfQorfTsKKworYm9vbAorcGFzc190YXJnZXRfY2xv bmU6OmdhdGUgKGZ1bmN0aW9uICopCit7CisgIHJldHVybiB0cnVlOworfQor Cit9IC8vIGFub24gbmFtZXNwYWNlCisKK3NpbXBsZV9pcGFfb3B0X3Bhc3Mg KgorbWFrZV9wYXNzX3RhcmdldF9jbG9uZSAoZ2NjOjpjb250ZXh0ICpjdHh0 KQoreworICByZXR1cm4gbmV3IHBhc3NfdGFyZ2V0X2Nsb25lIChjdHh0KTsK K30KZGlmZiAtLWdpdCBhL2djYy9wYXNzZXMuZGVmIGIvZ2NjL3Bhc3Nlcy5k ZWYKaW5kZXggNjRmYzRkOS4uZmY2YzU1MCAxMDA2NDQKLS0tIGEvZ2NjL3Bh c3Nlcy5kZWYKKysrIGIvZ2NjL3Bhc3Nlcy5kZWYKQEAgLTE0MSw2ICsxNDEs NyBAQCBhbG9uZyB3aXRoIEdDQzsgc2VlIHRoZSBmaWxlIENPUFlJTkczLiAg SWYgbm90IHNlZQogICBJTlNFUlRfUEFTU0VTX0FGVEVSIChhbGxfbGF0ZV9p cGFfcGFzc2VzKQogICBORVhUX1BBU1MgKHBhc3NfaXBhX3B0YSk7CiAgIE5F WFRfUEFTUyAocGFzc19vbXBfc2ltZF9jbG9uZSk7CisgIE5FWFRfUEFTUyAo cGFzc190YXJnZXRfY2xvbmUpOwogICBURVJNSU5BVEVfUEFTU19MSVNUICgp CiAKICAgLyogVGhlc2UgcGFzc2VzIGFyZSBydW4gYWZ0ZXIgSVBBIHBhc3Nl cyBvbiBldmVyeSBmdW5jdGlvbiB0aGF0IGlzIGJlaW5nCmRpZmYgLS1naXQg YS9nY2MvdGVzdHN1aXRlL2djYy5kZy9tdmMxLmMgYi9nY2MvdGVzdHN1aXRl L2djYy5kZy9tdmMxLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAw MDAwMC4uYWIxZTBmNQotLS0gL2Rldi9udWxsCisrKyBiL2djYy90ZXN0c3Vp dGUvZ2NjLmRnL212YzEuYwpAQCAtMCwwICsxLDI3IEBACisvKiB7IGRnLWRv IHJ1biB7IHRhcmdldCBpPzg2LSotKiB4ODZfNjQtKi0qIH0gfSAqLworLyog eyBkZy1vcHRpb25zICItTzIiIH0gKi8KKworX19hdHRyaWJ1dGVfXygodGFy Z2V0X2Nsb25lcygiYXZ4IiwiYXJjaD1zbG0iLCJhcmNoPWNvcmUtYXZ4MiIs ImRlZmF1bHQiKSkpCitpbnQKK2ZvbyAoKQoreworICByZXR1cm4gLTI7Cit9 CisKK2ludAorYmFyICgpCit7CisgIHJldHVybiAyOworfQorCitpbnQKK21h aW4gKCkKK3sKKyAgaW50IHIgPSAwOworICByICs9IGJhciAoKTsKKyAgciAr PSBmb28gKCk7CisgIHIgKz0gYmFyICgpOworICByICs9IGZvbyAoKTsKKyAg ciArPSBiYXIgKCk7CisgIHJldHVybiByIC0gMjsKK30KZGlmZiAtLWdpdCBh L2djYy90ZXN0c3VpdGUvZ2NjLmRnL212YzIuYyBiL2djYy90ZXN0c3VpdGUv Z2NjLmRnL212YzIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAw MDAwLi4xNjVlNjMyCi0tLSAvZGV2L251bGwKKysrIGIvZ2NjL3Rlc3RzdWl0 ZS9nY2MuZGcvbXZjMi5jCkBAIC0wLDAgKzEsNSBAQAorLyogeyBkZy1kbyBj b21waWxlIHsgdGFyZ2V0IGk/ODYtKi0qIHg4Nl82NC0qLSogfSB9ICovCisv KiB7IGRnLW9wdGlvbnMgIi1PMiIgfSAqLworCitfX2F0dHJpYnV0ZV9fKCh0 YXJnZXRfY2xvbmVzKCJhdngiLCJhcmNoPXNsbSIsImFyY2g9Y29yZS1hdngy IikpKQoraW50IGZvbyAoKTsKZGlmZiAtLWdpdCBhL2djYy90ZXN0c3VpdGUv Z2NjLmRnL212YzMuYyBiL2djYy90ZXN0c3VpdGUvZ2NjLmRnL212YzMuYwpu ZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNzQ4MDhhCi0t LSAvZGV2L251bGwKKysrIGIvZ2NjL3Rlc3RzdWl0ZS9nY2MuZGcvbXZjMy5j CkBAIC0wLDAgKzEsMTEgQEAKKy8qIHsgZGctZG8gY29tcGlsZSB7IHRhcmdl dCBpPzg2LSotKiB4ODZfNjQtKi0qIH0gfSAqLworLyogeyBkZy1vcHRpb25z ICIiIH0gKi8KKworX19hdHRyaWJ1dGVfXygodGFyZ2V0X2Nsb25lcygiYXZ4 IiwiYXJjaD1zbG0iLCJhcmNoPWNvcmUtYXZ4MiIpKSkKK2ludCBmb28gKCk7 IC8qIHsgZGctZXJyb3IgImRlZmF1bHQgdGFyZ2V0IHdhcyBub3Qgc2V0IiB9 ICovCisKK2ludAorYmFyICgpCit7CisgIHJldHVybiBmb28oKTsKK30KZGlm ZiAtLWdpdCBhL2djYy90ZXN0c3VpdGUvZ2NjLmRnL212YzQuYyBiL2djYy90 ZXN0c3VpdGUvZ2NjLmRnL212YzQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NApp bmRleCAwMDAwMDAwLi42MTQ3MzY1Ci0tLSAvZGV2L251bGwKKysrIGIvZ2Nj L3Rlc3RzdWl0ZS9nY2MuZGcvbXZjNC5jCkBAIC0wLDAgKzEsMjcgQEAKKy8q IHsgZGctZG8gcnVuIHsgdGFyZ2V0IGk/ODYtKi0qIHg4Nl82NC0qLSogfSB9 ICovCisvKiB7IGRnLW9wdGlvbnMgIi1PMiIgfSAqLworCitfX2F0dHJpYnV0 ZV9fKCh0YXJnZXRfY2xvbmVzKCJkZWZhdWx0IiwiYXZ4IiwiZGVmYXVsdCIp KSkKK2ludAorZm9vICgpCit7CisgIHJldHVybiAtMjsKK30KKworaW50Citi YXIgKCkKK3sKKyAgcmV0dXJuIDI7Cit9CisKK2ludAorbWFpbiAoKQorewor ICBpbnQgciA9IDA7CisgIHIgKz0gYmFyICgpOworICByICs9IGZvbyAoKTsK KyAgciArPSBiYXIgKCk7CisgIHIgKz0gZm9vICgpOworICByICs9IGJhciAo KTsKKyAgcmV0dXJuIHIgLSAyOworfQpkaWZmIC0tZ2l0IGEvZ2NjL3Rlc3Rz dWl0ZS9nY2MuZGcvbXZjNS5jIGIvZ2NjL3Rlc3RzdWl0ZS9nY2MuZGcvbXZj NS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRmZGI3 NjIKLS0tIC9kZXYvbnVsbAorKysgYi9nY2MvdGVzdHN1aXRlL2djYy5kZy9t dmM1LmMKQEAgLTAsMCArMSwxNyBAQAorLyogeyBkZy1kbyBjb21waWxlIHsg dGFyZ2V0IGk/ODYtKi0qIHg4Nl82NC0qLSogfSB9ICovCisvKiB7IGRnLW9w dGlvbnMgIi1PMiAtZm5vLWlubGluZSIgfSAqLworLyogeyBkZy1maW5hbCB7 IHNjYW4tYXNzZW1ibGVyLXRpbWVzICJmb28uaWZ1bmMiIDYgfSB9ICovCisK K19fYXR0cmlidXRlX18oKHRhcmdldF9jbG9uZXMoImRlZmF1bHQiLCJhdngi LCJhdngyIikpKQoraW50Citmb28gKCkKK3sKKyAgcmV0dXJuIDEwOworfQor CitfX2F0dHJpYnV0ZV9fKCh0YXJnZXRfY2xvbmVzKCJkZWZhdWx0IiwiYXZ4 IiwiYXZ4MiIpKSkKK2ludAorYmFyICgpCit7CisgIHJldHVybiAtZm9vICgp OworfQpkaWZmIC0tZ2l0IGEvZ2NjL3Rlc3RzdWl0ZS9nY2MuZGcvbXZjNi5j IGIvZ2NjL3Rlc3RzdWl0ZS9nY2MuZGcvbXZjNi5jCm5ldyBmaWxlIG1vZGUg MTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE2MjE5ODUKLS0tIC9kZXYvbnVsbAor KysgYi9nY2MvdGVzdHN1aXRlL2djYy5kZy9tdmM2LmMKQEAgLTAsMCArMSwx NiBAQAorLyogeyBkZy1kbyBjb21waWxlIHsgdGFyZ2V0IGk/ODYtKi0qIHg4 Nl82NC0qLSogfSB9ICovCisvKiB7IGRnLW9wdGlvbnMgIi1PMyIgfSAqLwor LyogeyBkZy1maW5hbCB7IHNjYW4tYXNzZW1ibGVyICJ2cHNodWZiIiB9IH0g Ki8KKy8qIHsgZGctZmluYWwgeyBzY2FuLWFzc2VtYmxlciAicHVucGNrbGJ3 IiB9IH0gKi8KKworX19hdHRyaWJ1dGVfXygodGFyZ2V0X2Nsb25lcygiYXJj aD1jb3JlLWF2eDIiLCJhcmNoPXNsbSIsImRlZmF1bHQiKSkpCit2b2lkCitm b28oY2hhciAqaW4sIGNoYXIgKm91dCwgaW50IHNpemUpCit7CisgIGludCBp OworICBmb3IoaSA9IDA7IGkgPCBzaXplOyBpKyspCisgICAgeworCW91dFsy ICogaV0gPSBpbltpXTsKKwlvdXRbMiAqIGkgKyAxXSA9IGluW2ldOworICAg IH0KK30KZGlmZiAtLWdpdCBhL2djYy90ZXN0c3VpdGUvZ2NjLmRnL212Yzcu YyBiL2djYy90ZXN0c3VpdGUvZ2NjLmRnL212YzcuYwpuZXcgZmlsZSBtb2Rl IDEwMDY0NAppbmRleCAwMDAwMDAwLi43ODJmOGRjCi0tLSAvZGV2L251bGwK KysrIGIvZ2NjL3Rlc3RzdWl0ZS9nY2MuZGcvbXZjNy5jCkBAIC0wLDAgKzEs MTEgQEAKKy8qIHsgZGctZG8gY29tcGlsZSB7IHRhcmdldCBpPzg2LSotKiB4 ODZfNjQtKi0qIH0gfSAqLworLyogeyBkZy1vcHRpb25zICItTzMiIH0gKi8K Ky8qIHsgZGctZmluYWwgeyBzY2FuLWFzc2VtYmxlci10aW1lcyAiZm9vLmlm dW5jIiA0IH0gfSAqLworCitfX2F0dHJpYnV0ZV9fKCh0YXJnZXRfY2xvbmVz KCJhdngiLCJkZWZhdWx0IiwiYXJjaD1zbG0iLCJhcmNoPWNvcmUtYXZ4MiIp KSkKK2ludCBmb28gKCk7CisKK2ludCBtYWluKCkKK3sKKyAgcmV0dXJuIGZv bygpOworfQpkaWZmIC0tZ2l0IGEvZ2NjL3RyZWUtcGFzcy5oIGIvZ2NjL3Ry ZWUtcGFzcy5oCmluZGV4IDdiNjZhMWMuLmVjNzIzYjggMTAwNjQ0Ci0tLSBh L2djYy90cmVlLXBhc3MuaAorKysgYi9nY2MvdHJlZS1wYXNzLmgKQEAgLTQ4 Myw2ICs0ODMsNyBAQCBleHRlcm4gaXBhX29wdF9wYXNzX2QgKm1ha2VfcGFz c19pcGFfcHVyZV9jb25zdCAoZ2NjOjpjb250ZXh0ICpjdHh0KTsKIGV4dGVy biBzaW1wbGVfaXBhX29wdF9wYXNzICptYWtlX3Bhc3NfaXBhX3B0YSAoZ2Nj Ojpjb250ZXh0ICpjdHh0KTsKIGV4dGVybiBzaW1wbGVfaXBhX29wdF9wYXNz ICptYWtlX3Bhc3NfaXBhX3RtIChnY2M6OmNvbnRleHQgKmN0eHQpOwogZXh0 ZXJuIHNpbXBsZV9pcGFfb3B0X3Bhc3MgKm1ha2VfcGFzc19vbXBfc2ltZF9j bG9uZSAoZ2NjOjpjb250ZXh0ICpjdHh0KTsKK2V4dGVybiBzaW1wbGVfaXBh X29wdF9wYXNzICptYWtlX3Bhc3NfdGFyZ2V0X2Nsb25lIChnY2M6OmNvbnRl eHQgKmN0eHQpOwogZXh0ZXJuIGlwYV9vcHRfcGFzc19kICptYWtlX3Bhc3Nf aXBhX3Byb2ZpbGUgKGdjYzo6Y29udGV4dCAqY3R4dCk7CiBleHRlcm4gaXBh X29wdF9wYXNzX2QgKm1ha2VfcGFzc19pcGFfY2R0b3JfbWVyZ2UgKGdjYzo6 Y29udGV4dCAqY3R4dCk7CiBleHRlcm4gaXBhX29wdF9wYXNzX2QgKm1ha2Vf cGFzc19pcGFfc2luZ2xlX3VzZSAoZ2NjOjpjb250ZXh0ICpjdHh0KTsKZGlm ZiAtLWdpdCBhL3RhcmdldF9jbG9uZXMuQ2hhbmdlTG9nIGIvdGFyZ2V0X2Ns b25lcy5DaGFuZ2VMb2cKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAw MDAwMC4uYjA2ZTcwMgotLS0gL2Rldi9udWxsCisrKyBiL3RhcmdldF9jbG9u ZXMuQ2hhbmdlTG9nCkBAIC0wLDAgKzEsMzIgQEAKKzIwMTUtMDgtMjYgIEV2 Z2VueSBTdHVwYWNoZW5rbyAgPGV2c3R1cGFjQGdtYWlsLmNvbT4KKworZ2Nj LworCSogTWFrZWZpbGUuaW4gKE9CSlMpOiBBZGQgbXVsdGlwbGVfdGFyZ2V0 Lm8uCisJKiBtdWx0aXBsZV90YXJnZXQuYyAobWFrZV9hdHRyaWJ1dGUpOiBO ZXcuCisJKGNyZWF0ZV9kaXNwYXRjaGVyX2NhbGxzKTogRGl0dG8uCisJKGV4 cGFuZF90YXJnZXRfY2xvbmVzKTogRGl0dG8uCisJKGlwYV90YXJnZXRfY2xv bmUpOiBEaXR0by4KKwkqIHBhc3Nlcy5kZWYgKHBhc3NfdGFyZ2V0X2Nsb25l KTogTmV3IGlwYSBwYXNzLgorCSogdHJlZS1wYXNzLmggKG1ha2VfcGFzc190 YXJnZXRfY2xvbmUpOiBEaXR0by4KKworZ2NjL2MtZmFtaWx5CisJKiBjLWNv bW1vbi5jIChoYW5kbGVfdGFyZ2V0X2Nsb25lc19hdHRyaWJ1dGUpOiBOZXcu CisJKiAoY19jb21tb25fYXR0cmlidXRlX3RhYmxlKTogQWRkIGhhbmRsZV90 YXJnZXRfY2xvbmVzX2F0dHJpYnV0ZS4KKwkqIChoYW5kbGVfYWx3YXlzX2lu bGluZV9hdHRyaWJ1dGUpOiBBZGQgY2hlY2sgb24gdGFyZ2V0X2Nsb25lcwor CWF0dHJpYnV0ZS4KKwkqIChoYW5kbGVfdGFyZ2V0X2F0dHJpYnV0ZSk6IERp dHRvLgorCitnY2MvdGVzdHN1aXRlCisJKiBnY2MuZGcvbXZjMS5jOiBOZXcg dGVzdCBmb3IgbXVsdGlwbGUgdGFyZ2V0cyBjbG9uaW5nLgorCSogZ2NjLmRn L212YzIuYzogRGl0dG8uCisJKiBnY2MuZGcvbXZjMy5jOiBEaXR0by4KKwkq IGdjYy5kZy9tdmM0LmM6IERpdHRvLgorCSogZ2NjLmRnL212YzUuYzogRGl0 dG8uCisJKiBnY2MuZGcvbXZjNi5jOiBEaXR0by4KKwkqIGdjYy5kZy9tdmM3 LmM6IERpdHRvLgorCSogZysrLmRnL2V4dC9tdmMxLkM6IERpdHRvLgorCSog ZysrLmRnL2V4dC9tdmMyLkM6IERpdHRvLgorCSogZysrLmRnL2V4dC9tdmMz LkM6IERpdHRvLgorCitnY2MvZG9jCisJKiBkb2MvZXh0ZW5kLnRleGkgKHRh cmdldF9jbG9uZXMpOiBOZXcgYXR0cmlidXRlIGRlc2NyaXB0aW9uLgo= --bcaec548a4d9efaed7051e49213e--