From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from esa4.mentor.iphmx.com (esa4.mentor.iphmx.com [68.232.137.252]) by sourceware.org (Postfix) with ESMTPS id 33CB23858D37 for ; Tue, 21 Mar 2023 13:35:32 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 33CB23858D37 Authentication-Results: sourceware.org; dmarc=none (p=none dis=none) header.from=codesourcery.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=mentor.com X-IronPort-AV: E=Sophos;i="5.98,279,1673942400"; d="scan'208";a="101050372" Received: from orw-gwy-02-in.mentorg.com ([192.94.38.167]) by esa4.mentor.iphmx.com with ESMTP; 21 Mar 2023 05:35:22 -0800 IronPort-SDR: AKvDaJsRjbEjsfTNxPh1VkU/Q6/7KqYT1A4VBGszNSQ7HyquZWW/dXJKhKcZ3Nveed3qvSTaca K3Bwh8B8BslJ9/bbSIYG6wcGJvMlRjqfBRbtz4ZtIYbsmkSAaq7ICa49leCwMIHOsznsr/cbNQ 2YlTM8DdiNvsTN6+9JxsnE/a2qUodtdQyeD9dOipOFwSh/b8N5Jgxz4P/t0fWmI3lFM/3pFY9z Y1OHjlYzrBNoXdTt993tKCTGyTjMeLW6wbMkCNfia3QBIamulHVlEu/cUEKWKDIrdYAPZapAkN r/U= Content-Type: multipart/mixed; boundary="------------jVxQq8DbbaAEqJ8gOWZqTcYN" Message-ID: <5568381f-7705-d085-53c2-8cd28d010292@codesourcery.com> Date: Tue, 21 Mar 2023 13:35:12 +0000 MIME-Version: 1.0 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:102.0) Gecko/20100101 Thunderbird/102.7.2 Subject: Re: [PATCH] amdgcn: Add instruction patterns for vector operations on complex numbers Content-Language: en-US To: Andrew Stubbs , GCC Patches References: From: Andrew Jenner In-Reply-To: X-ClientProxiedBy: svr-orw-mbx-11.mgc.mentorg.com (147.34.90.211) To svr-ies-mbx-10.mgc.mentorg.com (139.181.222.10) X-Spam-Status: No, score=-11.5 required=5.0 tests=BAYES_00,GIT_PATCH_0,HEADER_FROM_DIFFERENT_DOMAINS,KAM_DMARC_STATUS,KAM_SHORT,NICE_REPLY_A,SPF_HELO_PASS,SPF_PASS,TXREP autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org List-Id: --------------jVxQq8DbbaAEqJ8gOWZqTcYN Content-Type: text/plain; charset="UTF-8"; format=flowed Content-Transfer-Encoding: 7bit I have updated this patch to incorporate the feedback from Andrew Stubbs. Tested on CDNA2 GFX90a. gcc/ChangeLog: * config/gcn/gcn-protos.h (gcn_expand_dpp_swap_pairs_insn) (gcn_expand_dpp_distribute_even_insn) (gcn_expand_dpp_distribute_odd_insn): Declare. * config/gcn/gcn-valu.md (@dpp_swap_pairs) (@dpp_distribute_even, @dpp_distribute_odd) (cmul3, cml4, vec_addsub3) (cadd3, vec_fmaddsub4, vec_fmsubadd4) (fms4, fms4_negop2, fms4) (fms4_negop2): New patterns. * config/gcn/gcn.cc (gcn_expand_dpp_swap_pairs_insn) (gcn_expand_dpp_distribute_even_insn) (gcn_expand_dpp_distribute_odd_insn): New functions. * config/gcn/gcn.md: Add entries to unspec enum. gcc/testsuite/ChangeLog: * gcc.target/gcn/complex.c: New test. --------------jVxQq8DbbaAEqJ8gOWZqTcYN Content-Type: text/plain; charset="UTF-8"; name="complex2.patch" Content-Disposition: attachment; filename="complex2.patch" Content-Transfer-Encoding: base64 ZGlmZiAtLWdpdCBhL2djYy9jb25maWcvZ2NuL2djbi1wcm90b3MuaCBiL2djYy9jb25maWcv Z2NuL2djbi1wcm90b3MuaAppbmRleCA4NjEwNDRlNzdmMC4uZDc4NjJiMjFhMmEgMTAwNjQ0 Ci0tLSBhL2djYy9jb25maWcvZ2NuL2djbi1wcm90b3MuaAorKysgYi9nY2MvY29uZmlnL2dj bi9nY24tcHJvdG9zLmgKQEAgLTI3LDYgKzI3LDExIEBAIGV4dGVybiB1bnNpZ25lZCBpbnQg Z2NuX2R3YXJmX3JlZ2lzdGVyX251bWJlciAodW5zaWduZWQgaW50IHJlZ25vKTsKIGV4dGVy biBydHggZ2V0X2V4ZWMgKGludDY0X3QpOwogZXh0ZXJuIHJ0eCBnZXRfZXhlYyAobWFjaGlu ZV9tb2RlIG1vZGUpOwogZXh0ZXJuIGNoYXIgKiBnY25fZXhwYW5kX2RwcF9zaHJfaW5zbiAo bWFjaGluZV9tb2RlLCBjb25zdCBjaGFyICosIGludCwgaW50KTsKK2V4dGVybiBjaGFyICog Z2NuX2V4cGFuZF9kcHBfc3dhcF9wYWlyc19pbnNuIChtYWNoaW5lX21vZGUsIGNvbnN0IGNo YXIgKiwgaW50KTsKK2V4dGVybiBjaGFyICogZ2NuX2V4cGFuZF9kcHBfZGlzdHJpYnV0ZV9l dmVuX2luc24gKG1hY2hpbmVfbW9kZSwgY29uc3QgY2hhciAqLAorCQkJCQkJICAgaW50IHVu c3BlYyk7CitleHRlcm4gY2hhciAqIGdjbl9leHBhbmRfZHBwX2Rpc3RyaWJ1dGVfb2RkX2lu c24gKG1hY2hpbmVfbW9kZSwgY29uc3QgY2hhciAqLAorCQkJCQkJICBpbnQgdW5zcGVjKTsK IGV4dGVybiB2b2lkIGdjbl9leHBhbmRfZXBpbG9ndWUgKCk7CiBleHRlcm4gcnR4IGdjbl9l eHBhbmRfc2NhbGVkX29mZnNldHMgKGFkZHJfc3BhY2VfdCBhcywgcnR4IGJhc2UsIHJ0eCBv ZmZzZXRzLAogCQkJCSAgICAgIHJ0eCBzY2FsZSwgYm9vbCB1bnNpZ25lZF9wLCBydHggZXhl Yyk7CmRpZmYgLS1naXQgYS9nY2MvY29uZmlnL2djbi9nY24tdmFsdS5tZCBiL2djYy9jb25m aWcvZ2NuL2djbi12YWx1Lm1kCmluZGV4IDc1ZTlhNTk2MDBiLi43ODdkNzcwOWQwZCAxMDA2 NDQKLS0tIGEvZ2NjL2NvbmZpZy9nY24vZ2NuLXZhbHUubWQKKysrIGIvZ2NjL2NvbmZpZy9n Y24vZ2NuLXZhbHUubWQKQEAgLTEyMjQsNiArMTIyNCw0NSBAQAogICBbKHNldF9hdHRyICJ0 eXBlIiAidm9wX2RwcCIpCiAgICAoc2V0X2F0dHIgImxlbmd0aCIgIjE2IildKQogCisoZGVm aW5lX2luc24gIkBkcHBfc3dhcF9wYWlyczxtb2RlPiIKKyAgWyhzZXQgKG1hdGNoX29wZXJh bmQ6Vl9ub0hJIDAgInJlZ2lzdGVyX29wZXJhbmQiICAgICI9diIpCisJKHVuc3BlYzpWX25v SEkKKwkgIFsobWF0Y2hfb3BlcmFuZDpWX25vSEkgMSAicmVnaXN0ZXJfb3BlcmFuZCIgIiB2 IildCisJICBVTlNQRUNfTU9WX0RQUF9TV0FQX1BBSVJTKSldCisgICIiCisgIHsKKyAgICBy ZXR1cm4gZ2NuX2V4cGFuZF9kcHBfc3dhcF9wYWlyc19pbnNuICg8TU9ERT5tb2RlLCAidl9t b3ZfYjMyIiwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVOU1BFQ19N T1ZfRFBQX1NXQVBfUEFJUlMpOworICB9CisgIFsoc2V0X2F0dHIgInR5cGUiICJ2b3BfZHBw IikKKyAgIChzZXRfYXR0ciAibGVuZ3RoIiAiMTYiKV0pCisKKyhkZWZpbmVfaW5zbiAiQGRw cF9kaXN0cmlidXRlX2V2ZW48bW9kZT4iCisgIFsoc2V0IChtYXRjaF9vcGVyYW5kOlZfbm9I SSAwICJyZWdpc3Rlcl9vcGVyYW5kIiAgICAiPXYiKQorCSh1bnNwZWM6Vl9ub0hJCisJICBb KG1hdGNoX29wZXJhbmQ6Vl9ub0hJIDEgInJlZ2lzdGVyX29wZXJhbmQiICIgdiIpXQorCSAg VU5TUEVDX01PVl9EUFBfRElTVFJJQlVURV9FVkVOKSldCisgICIiCisgIHsKKyAgICByZXR1 cm4gZ2NuX2V4cGFuZF9kcHBfZGlzdHJpYnV0ZV9ldmVuX2luc24gKDxNT0RFPm1vZGUsICJ2 X21vdl9iMzIiLAorCQkJCQkJVU5TUEVDX01PVl9EUFBfRElTVFJJQlVURV9FVkVOKTsKKyAg fQorICBbKHNldF9hdHRyICJ0eXBlIiAidm9wX2RwcCIpCisgICAoc2V0X2F0dHIgImxlbmd0 aCIgIjE2IildKQorCisoZGVmaW5lX2luc24gIkBkcHBfZGlzdHJpYnV0ZV9vZGQ8bW9kZT4i CisgIFsoc2V0IChtYXRjaF9vcGVyYW5kOlZfbm9ISSAwICJyZWdpc3Rlcl9vcGVyYW5kIiAg ICAiPXYiKQorCSh1bnNwZWM6Vl9ub0hJCisJICBbKG1hdGNoX29wZXJhbmQ6Vl9ub0hJIDEg InJlZ2lzdGVyX29wZXJhbmQiICIgdiIpXQorCSAgVU5TUEVDX01PVl9EUFBfRElTVFJJQlVU RV9FVkVOKSldCisgICIiCisgIHsKKyAgICByZXR1cm4gZ2NuX2V4cGFuZF9kcHBfZGlzdHJp YnV0ZV9vZGRfaW5zbiAoPE1PREU+bW9kZSwgInZfbW92X2IzMiIsCisJCQkJCSAgICAgICBV TlNQRUNfTU9WX0RQUF9ESVNUUklCVVRFX09ERCk7CisgIH0KKyAgWyhzZXRfYXR0ciAidHlw ZSIgInZvcF9kcHAiKQorICAgKHNldF9hdHRyICJsZW5ndGgiICIxNiIpXSkKKwogOzsgfX19 CiA7OyB7e3sgQUxVIHNwZWNpYWwgY2FzZTogYWRkL3N1YgogCkBAIC0yMTg1LDYgKzIyMjQs MTgwIEBACiAgICAgRE9ORTsKICAgfSkKIAorKGRlZmluZV9pbnRfaXRlcmF0b3IgVU5TUEVD X0NNVUxfT1AgW1VOU1BFQ19DTVVMIFVOU1BFQ19DTVVMX0NPTkpdKQorKGRlZmluZV9pbnRf YXR0ciBjb25qX29wIFsoVU5TUEVDX0NNVUwgIiIpIChVTlNQRUNfQ01VTF9DT05KICJfY29u aiIpXSkKKyhkZWZpbmVfaW50X2F0dHIgY211bF9zdWJhZGQgWyhVTlNQRUNfQ01VTCAic3Vi IikgKFVOU1BFQ19DTVVMX0NPTkogImFkZCIpXSkKKyhkZWZpbmVfaW50X2F0dHIgY211bF9h ZGRzdWIgWyhVTlNQRUNfQ01VTCAiYWRkIikgKFVOU1BFQ19DTVVMX0NPTkogInN1YiIpXSkK KworKGRlZmluZV9leHBhbmQgImNtdWw8Y29ual9vcD48bW9kZT4zIgorICBbKHNldCAobWF0 Y2hfb3BlcmFuZDpWX25vSEkgMCAicmVnaXN0ZXJfb3BlcmFuZCIgICAgIj0mdiIpCisgICAg ICAgICh1bnNwZWM6Vl9ub0hJCisJICBbKG1hdGNoX29wZXJhbmQ6Vl9ub0hJIDEgInJlZ2lz dGVyX29wZXJhbmQiICJ2IikKKwkgICAobWF0Y2hfb3BlcmFuZDpWX25vSEkgMiAicmVnaXN0 ZXJfb3BlcmFuZCIgInYiKV0KKwkgIFVOU1BFQ19DTVVMX09QKSldCisgICIiCisgIHsKKyAg ICAvLyBvcGVyYW5kc1sxXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgYSAgIGIKKyAgICAvLyBvcGVyYW5kc1syXSAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYyAgIGQKKyAgICBydHggdDEgPSBn ZW5fcmVnX3J0eCAoPE1PREU+bW9kZSk7CisgICAgZW1pdF9pbnNuIChnZW5fbXVsPG1vZGU+ MyAodDEsIG9wZXJhbmRzWzFdLCBvcGVyYW5kc1syXSkpOyAgIC8vIGEqYyBiKmQKKworICAg IHJ0eCBzMl9wZXJtID0gZ2VuX3JlZ19ydHggKDxNT0RFPm1vZGUpOworICAgIGVtaXRfaW5z biAoZ2VuX2RwcF9zd2FwX3BhaXJzPG1vZGU+IChzMl9wZXJtLCBvcGVyYW5kc1syXSkpOyAv LyBkICAgYworCisgICAgcnR4IHQyID0gZ2VuX3JlZ19ydHggKDxNT0RFPm1vZGUpOworICAg IGVtaXRfaW5zbiAoZ2VuX211bDxtb2RlPjMgKHQyLCBvcGVyYW5kc1sxXSwgczJfcGVybSkp OyAgICAgICAvLyBhKmQgYipjCisKKyAgICBydHggdDFfcGVybSA9IGdlbl9yZWdfcnR4ICg8 TU9ERT5tb2RlKTsKKyAgICBlbWl0X2luc24gKGdlbl9kcHBfc3dhcF9wYWlyczxtb2RlPiAo dDFfcGVybSwgdDEpKTsgICAgICAgICAgLy8gYipkIGEqYworCisgICAgcnR4IGV2ZW4gPSBn ZW5fcnR4X1JFRyAoREltb2RlLCBFWEVDX1JFRyk7CisgICAgZW1pdF9tb3ZlX2luc24gKGV2 ZW4sIGdldF9leGVjICgweDU1NTU1NTU1NTU1NTU1NTVVTCkpOworICAgIHJ0eCBkZXN0ID0g b3BlcmFuZHNbMF07CisgICAgZW1pdF9pbnNuIChnZW5fPGNtdWxfc3ViYWRkPjxtb2RlPjNf ZXhlYyAoZGVzdCwgdDEsIHQxX3Blcm0sIGRlc3QsIGV2ZW4pKTsKKyAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhKmMt YipkIDAKKworICAgIHJ0eCB0Ml9wZXJtID0gZ2VuX3JlZ19ydHggKDxNT0RFPm1vZGUpOwor ICAgIGVtaXRfaW5zbiAoZ2VuX2RwcF9zd2FwX3BhaXJzPG1vZGU+ICh0Ml9wZXJtLCB0Mikp OyAgICAgICAgICAvLyBiKmMgYSpkCisKKyAgICBydHggb2RkID0gZ2VuX3J0eF9SRUcgKERJ bW9kZSwgRVhFQ19SRUcpOworICAgIGVtaXRfbW92ZV9pbnNuIChvZGQsIGdldF9leGVjICgw eGFhYWFhYWFhYWFhYWFhYWFVTCkpOworICAgIGVtaXRfaW5zbiAoZ2VuXzxjbXVsX2FkZHN1 Yj48bW9kZT4zX2V4ZWMgKGRlc3QsIHQyLCB0Ml9wZXJtLCBkZXN0LCBvZGQpKTsKKyAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAvLyAwIGEqZCtiKmMKKyAgICBET05FOworICB9KQorCisoZGVmaW5lX2NvZGVf aXRlcmF0b3IgYWRkc3ViIFtwbHVzIG1pbnVzXSkKKyhkZWZpbmVfY29kZV9hdHRyIGFkZHN1 Yl9hcyBbKHBsdXMgImEiKSAobWludXMgInMiKV0pCisKKyhkZWZpbmVfZXhwYW5kICJjbWw8 YWRkc3ViX2FzPjxtb2RlPjQiCisgIFsoc2V0IChtYXRjaF9vcGVyYW5kOlZfRlAgMCAicmVn aXN0ZXJfb3BlcmFuZCIgICAgICAiPSZ2IikKKwkoYWRkc3ViOlZfRlAKKwkgICh1bnNwZWM6 Vl9GUAorCSAgICBbKG1hdGNoX29wZXJhbmQ6Vl9GUCAxICJyZWdpc3Rlcl9vcGVyYW5kIiAi diIpCisJICAgICAobWF0Y2hfb3BlcmFuZDpWX0ZQIDIgInJlZ2lzdGVyX29wZXJhbmQiICJ2 IildCisJICAgIFVOU1BFQ19DTVVMKQorCSAgKG1hdGNoX29wZXJhbmQ6Vl9GUCAzICJyZWdp c3Rlcl9vcGVyYW5kIiAgICAidiIpKSldCisgICIiCisgIHsKKyAgICBydHggYSA9IGdlbl9y ZWdfcnR4ICg8TU9ERT5tb2RlKTsKKyAgICBlbWl0X2luc24gKGdlbl9kcHBfZGlzdHJpYnV0 ZV9ldmVuPG1vZGU+IChhLCBvcGVyYW5kc1sxXSkpOyAgICAvLyBhICAgYQorCisgICAgcnR4 IHQxID0gZ2VuX3JlZ19ydHggKDxNT0RFPm1vZGUpOworICAgIGVtaXRfaW5zbiAoZ2VuX2Zt PGFkZHN1Yl9hcz48bW9kZT40ICh0MSwgYSwgb3BlcmFuZHNbMl0sIG9wZXJhbmRzWzNdKSk7 CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgLy8gYSpjIGEqZAorCisgICAgcnR4IGIgPSBnZW5fcmVnX3J0eCAo PE1PREU+bW9kZSk7CisgICAgZW1pdF9pbnNuIChnZW5fZHBwX2Rpc3RyaWJ1dGVfb2RkPG1v ZGU+IChiLCBvcGVyYW5kc1sxXSkpOyAgICAgLy8gYiAgIGIKKworICAgIHJ0eCB0MiA9IGdl bl9yZWdfcnR4ICg8TU9ERT5tb2RlKTsKKyAgICBlbWl0X2luc24gKGdlbl9tdWw8bW9kZT4z ICh0MiwgYiwgb3BlcmFuZHNbMl0pKTsgICAgICAgICAgICAgICAvLyBiKmMgYipkCisKKyAg ICBydHggdDJfcGVybSA9IGdlbl9yZWdfcnR4ICg8TU9ERT5tb2RlKTsKKyAgICBlbWl0X2lu c24gKGdlbl9kcHBfc3dhcF9wYWlyczxtb2RlPiAodDJfcGVybSwgdDIpKTsgICAgICAgICAg ICAvLyBiKmQgYipjCisKKyAgICBydHggZXZlbiA9IGdlbl9ydHhfUkVHIChESW1vZGUsIEVY RUNfUkVHKTsKKyAgICBlbWl0X21vdmVfaW5zbiAoZXZlbiwgZ2V0X2V4ZWMgKDB4NTU1NTU1 NTU1NTU1NTU1NVVMKSk7CisgICAgcnR4IGRlc3QgPSBvcGVyYW5kc1swXTsKKyAgICBlbWl0 X2luc24gKGdlbl9zdWI8bW9kZT4zX2V4ZWMgKGRlc3QsIHQxLCB0Ml9wZXJtLCBkZXN0LCBl dmVuKSk7CisKKyAgICBydHggb2RkID0gZ2VuX3J0eF9SRUcgKERJbW9kZSwgRVhFQ19SRUcp OworICAgIGVtaXRfbW92ZV9pbnNuIChvZGQsIGdldF9leGVjICgweGFhYWFhYWFhYWFhYWFh YWFVTCkpOworICAgIGVtaXRfaW5zbiAoZ2VuX2FkZDxtb2RlPjNfZXhlYyAoZGVzdCwgdDEs IHQyX3Blcm0sIGRlc3QsIG9kZCkpOworCisgICAgRE9ORTsKKyAgfSkKKworKGRlZmluZV9l eHBhbmQgInZlY19hZGRzdWI8bW9kZT4zIgorICBbKHNldCAobWF0Y2hfb3BlcmFuZDpWX25v SEkgMCAicmVnaXN0ZXJfb3BlcmFuZCIgICAgICI9JnYiKQorICAgICAgICAodmVjX21lcmdl OlZfbm9ISQorICAgICAgICAgIChtaW51czpWX25vSEkKKyAgICAgICAgICAgIChtYXRjaF9v cGVyYW5kOlZfbm9ISSAxICJyZWdpc3Rlcl9vcGVyYW5kIiAidiIpCisgICAgICAgICAgICAo bWF0Y2hfb3BlcmFuZDpWX25vSEkgMiAicmVnaXN0ZXJfb3BlcmFuZCIgInYiKSkKKyAgICAg ICAgICAocGx1czpWX25vSEkgKG1hdGNoX2R1cCAxKSAobWF0Y2hfZHVwIDIpKQorICAgICAg ICAgIChjb25zdF9pbnQgNjE0ODkxNDY5MTIzNjUxNzIwNSkpKV0KKyAgIiIKKyAgeworICAg IHJ0eCBldmVuID0gZ2VuX3J0eF9SRUcgKERJbW9kZSwgRVhFQ19SRUcpOworICAgIGVtaXRf bW92ZV9pbnNuIChldmVuLCBnZXRfZXhlYyAoMHg1NTU1NTU1NTU1NTU1NTU1VUwpKTsKKyAg ICBydHggZGVzdCA9IG9wZXJhbmRzWzBdOworICAgIHJ0eCB4ID0gb3BlcmFuZHNbMV07Cisg ICAgcnR4IHkgPSBvcGVyYW5kc1syXTsKKyAgICBlbWl0X2luc24gKGdlbl9zdWI8bW9kZT4z X2V4ZWMgKGRlc3QsIHgsIHksIGRlc3QsIGV2ZW4pKTsKKyAgICBydHggb2RkID0gZ2VuX3J0 eF9SRUcgKERJbW9kZSwgRVhFQ19SRUcpOworICAgIGVtaXRfbW92ZV9pbnNuIChvZGQsIGdl dF9leGVjICgweGFhYWFhYWFhYWFhYWFhYWFVTCkpOworICAgIGVtaXRfaW5zbiAoZ2VuX2Fk ZDxtb2RlPjNfZXhlYyAoZGVzdCwgeCwgeSwgZGVzdCwgb2RkKSk7CisKKyAgICBET05FOwor ICB9KQorCisoZGVmaW5lX2ludF9pdGVyYXRvciBDQUREIFtVTlNQRUNfQ0FERDkwIFVOU1BF Q19DQUREMjcwXSkKKyhkZWZpbmVfaW50X2F0dHIgcm90IFsoVU5TUEVDX0NBREQ5MCAiOTAi KSAoVU5TUEVDX0NBREQyNzAgIjI3MCIpXSkKKyhkZWZpbmVfaW50X2F0dHIgY2FkZF9zdWJh ZGQgWyhVTlNQRUNfQ0FERDkwICJzdWIiKSAoVU5TUEVDX0NBREQyNzAgImFkZCIpXSkKKyhk ZWZpbmVfaW50X2F0dHIgY2FkZF9hZGRzdWIgWyhVTlNQRUNfQ0FERDkwICJhZGQiKSAoVU5T UEVDX0NBREQyNzAgInN1YiIpXSkKKworKGRlZmluZV9leHBhbmQgImNhZGQ8cm90Pjxtb2Rl PjMiCisgIFsoc2V0IChtYXRjaF9vcGVyYW5kOlZfbm9ISSAwICJyZWdpc3Rlcl9vcGVyYW5k IiAgICAgICAgICAgICAgICAgIj0mdiIpCisgICAgICAgICh1bnNwZWM6Vl9ub0hJIFsobWF0 Y2hfb3BlcmFuZDpWX25vSEkgMSAicmVnaXN0ZXJfb3BlcmFuZCIgInYiKQorICAgICAgICAg ICAgICAgICAgICAgICAgKG1hdGNoX29wZXJhbmQ6Vl9ub0hJIDIgInJlZ2lzdGVyX29wZXJh bmQiICJ2IildCisgICAgICAgICAgICAgICAgICAgICAgICBDQUREKSldCisgICIiCisgIHsK KyAgICBydHggZGVzdCA9IG9wZXJhbmRzWzBdOworICAgIHJ0eCB4ID0gb3BlcmFuZHNbMV07 CisgICAgcnR4IHkgPSBnZW5fcmVnX3J0eCAoPE1PREU+bW9kZSk7CisgICAgZW1pdF9pbnNu IChnZW5fZHBwX3N3YXBfcGFpcnM8bW9kZT4gKHksIG9wZXJhbmRzWzJdKSk7CisKKyAgICBy dHggZXZlbiA9IGdlbl9ydHhfUkVHIChESW1vZGUsIEVYRUNfUkVHKTsKKyAgICBlbWl0X21v dmVfaW5zbiAoZXZlbiwgZ2V0X2V4ZWMgKDB4NTU1NTU1NTU1NTU1NTU1NVVMKSk7CisgICAg ZW1pdF9pbnNuIChnZW5fPGNhZGRfc3ViYWRkPjxtb2RlPjNfZXhlYyAoZGVzdCwgeCwgeSwg ZGVzdCwgZXZlbikpOworICAgIHJ0eCBvZGQgPSBnZW5fcnR4X1JFRyAoREltb2RlLCBFWEVD X1JFRyk7CisgICAgZW1pdF9tb3ZlX2luc24gKG9kZCwgZ2V0X2V4ZWMgKDB4YWFhYWFhYWFh YWFhYWFhYVVMKSk7CisgICAgZW1pdF9pbnNuIChnZW5fPGNhZGRfYWRkc3ViPjxtb2RlPjNf ZXhlYyAoZGVzdCwgeCwgeSwgZGVzdCwgb2RkKSk7CisKKyAgICBET05FOworICB9KQorCiso ZGVmaW5lX2V4cGFuZCAidmVjX2ZtYWRkc3ViPG1vZGU+NCIKKyAgWyhtYXRjaF9vcGVyYW5k OlZfbm9ISSAwICJyZWdpc3Rlcl9vcGVyYW5kIiAiPSZ2IikKKyAgIChtYXRjaF9vcGVyYW5k OlZfbm9ISSAxICJyZWdpc3Rlcl9vcGVyYW5kIiAidiIpCisgICAobWF0Y2hfb3BlcmFuZDpW X25vSEkgMiAicmVnaXN0ZXJfb3BlcmFuZCIgInYiKQorICAgKG1hdGNoX29wZXJhbmQ6Vl9u b0hJIDMgInJlZ2lzdGVyX29wZXJhbmQiICJ2IildCisgICIiCisgIHsKKyAgICBydHggdDEg PSBnZW5fcmVnX3J0eCAoPE1PREU+bW9kZSk7CisgICAgZW1pdF9pbnNuIChnZW5fbXVsPG1v ZGU+MyAodDEsIG9wZXJhbmRzWzFdLCBvcGVyYW5kc1syXSkpOworICAgIHJ0eCBldmVuID0g Z2VuX3J0eF9SRUcgKERJbW9kZSwgRVhFQ19SRUcpOworICAgIGVtaXRfbW92ZV9pbnNuIChl dmVuLCBnZXRfZXhlYyAoMHg1NTU1NTU1NTU1NTU1NTU1VUwpKTsKKyAgICBydHggZGVzdCA9 IG9wZXJhbmRzWzBdOworICAgIGVtaXRfaW5zbiAoZ2VuX3N1Yjxtb2RlPjNfZXhlYyAoZGVz dCwgdDEsIG9wZXJhbmRzWzNdLCBkZXN0LCBldmVuKSk7CisgICAgcnR4IG9kZCA9IGdlbl9y dHhfUkVHIChESW1vZGUsIEVYRUNfUkVHKTsKKyAgICBlbWl0X21vdmVfaW5zbiAob2RkLCBn ZXRfZXhlYyAoMHhhYWFhYWFhYWFhYWFhYWFhVUwpKTsKKyAgICBlbWl0X2luc24gKGdlbl9h ZGQ8bW9kZT4zX2V4ZWMgKGRlc3QsIHQxLCBvcGVyYW5kc1szXSwgZGVzdCwgb2RkKSk7CisK KyAgICBET05FOworICB9KQorCisoZGVmaW5lX2V4cGFuZCAidmVjX2Ztc3ViYWRkPG1vZGU+ NCIKKyAgWyhtYXRjaF9vcGVyYW5kOlZfbm9ISSAwICJyZWdpc3Rlcl9vcGVyYW5kIiAiPSZ2 IikKKyAgIChtYXRjaF9vcGVyYW5kOlZfbm9ISSAxICJyZWdpc3Rlcl9vcGVyYW5kIiAidiIp CisgICAobWF0Y2hfb3BlcmFuZDpWX25vSEkgMiAicmVnaXN0ZXJfb3BlcmFuZCIgInYiKQor ICAgKG1hdGNoX29wZXJhbmQ6Vl9ub0hJIDMgInJlZ2lzdGVyX29wZXJhbmQiICJ2IildCisg ICIiCisgIHsKKyAgICBydHggdDEgPSBnZW5fcmVnX3J0eCAoPE1PREU+bW9kZSk7CisgICAg ZW1pdF9pbnNuIChnZW5fbXVsPG1vZGU+MyAodDEsIG9wZXJhbmRzWzFdLCBvcGVyYW5kc1sy XSkpOworICAgIHJ0eCBldmVuID0gZ2VuX3J0eF9SRUcgKERJbW9kZSwgRVhFQ19SRUcpOwor ICAgIGVtaXRfbW92ZV9pbnNuIChldmVuLCBnZXRfZXhlYyAoMHg1NTU1NTU1NTU1NTU1NTU1 VUwpKTsKKyAgICBydHggZGVzdCA9IG9wZXJhbmRzWzBdOworICAgIGVtaXRfaW5zbiAoZ2Vu X2FkZDxtb2RlPjNfZXhlYyAoZGVzdCwgdDEsIG9wZXJhbmRzWzNdLCBkZXN0LCBldmVuKSk7 CisgICAgcnR4IG9kZCA9IGdlbl9ydHhfUkVHIChESW1vZGUsIEVYRUNfUkVHKTsKKyAgICBl bWl0X21vdmVfaW5zbiAob2RkLCBnZXRfZXhlYyAoMHhhYWFhYWFhYWFhYWFhYWFhVUwpKTsK KyAgICBlbWl0X2luc24gKGdlbl9hZGQ8bW9kZT4zX2V4ZWMgKGRlc3QsIHQxLCBvcGVyYW5k c1szXSwgZGVzdCwgb2RkKSk7CisKKyAgICBET05FOworICB9KQorCiA7OyB9fX0KIDs7IHt7 eyBBTFUgZ2VuZXJpYyBjYXNlCiAKQEAgLTI4NjEsNiArMzA3NCw1NiBAQAogICBbKHNldF9h dHRyICJ0eXBlIiAidm9wM2EiKQogICAgKHNldF9hdHRyICJsZW5ndGgiICI4IildKQogCiso ZGVmaW5lX2luc24gImZtczxtb2RlPjQ8ZXhlYz4iCisgIFsoc2V0IChtYXRjaF9vcGVyYW5k OlZfRlAgMCAicmVnaXN0ZXJfb3BlcmFuZCIgICI9ICB2LCAgIHYiKQorCShmbWE6Vl9GUAor CSAgKG1hdGNoX29wZXJhbmQ6Vl9GUCAxICJnY25fYWx1X29wZXJhbmQiICIlIHZBLCAgdkEi KQorCShtYXRjaF9vcGVyYW5kOlZfRlAgMiAiZ2NuX2FsdV9vcGVyYW5kIiAgICIgIHZBLHZT dkEiKQorCShuZWc6Vl9GUAorCSAgKG1hdGNoX29wZXJhbmQ6Vl9GUCAzICJnY25fYWx1X29w ZXJhbmQiICJ2U3ZBLCAgdkEiKSkpKV0KKyAgIiIKKyAgInZfZm1hJWkwXHQlMCwgJTEsICUy LCAtJTMiCisgIFsoc2V0X2F0dHIgInR5cGUiICJ2b3AzYSIpCisgICAoc2V0X2F0dHIgImxl bmd0aCIgIjgiKV0pCisKKyhkZWZpbmVfaW5zbiAiZm1zPG1vZGU+NF9uZWdvcDI8ZXhlYz4i CisgIFsoc2V0IChtYXRjaF9vcGVyYW5kOlZfRlAgMCAicmVnaXN0ZXJfb3BlcmFuZCIgICAg Ij0gIHYsICAgdiwgICB2IikKKwkoZm1hOlZfRlAKKwkgIChtYXRjaF9vcGVyYW5kOlZfRlAg MSAiZ2NuX2FsdV9vcGVyYW5kIiAgICIgIHZBLCAgdkEsdlN2QSIpCisJICAobmVnOlZfRlAK KwkgICAgKG1hdGNoX29wZXJhbmQ6Vl9GUCAyICJnY25fYWx1X29wZXJhbmQiICIgIHZBLHZT dkEsICB2QSIpKQorCSAgKG5lZzpWX0ZQCisJICAgIChtYXRjaF9vcGVyYW5kOlZfRlAgMyAi Z2NuX2FsdV9vcGVyYW5kIiAidlN2QSwgIHZBLCAgdkEiKSkpKV0KKyAgIiIKKyAgInZfZm1h JWkwXHQlMCwgJTEsIC0lMiwgLSUzIgorICBbKHNldF9hdHRyICJ0eXBlIiAidm9wM2EiKQor ICAgKHNldF9hdHRyICJsZW5ndGgiICI4IildKQorCisoZGVmaW5lX2luc24gImZtczxtb2Rl PjQiCisgIFsoc2V0IChtYXRjaF9vcGVyYW5kOkZQIDAgInJlZ2lzdGVyX29wZXJhbmQiICAg ICI9ICB2LCAgIHYiKQorCShmbWE6RlAKKwkgIChtYXRjaF9vcGVyYW5kOkZQIDEgImdjbl9h bHVfb3BlcmFuZCIgICAiJSB2QSwgIHZBIikKKwkgIChtYXRjaF9vcGVyYW5kOkZQIDIgImdj bl9hbHVfb3BlcmFuZCIgICAiICB2QSx2U3ZBIikKKwkgIChuZWc6RlAKKwkgICAgKG1hdGNo X29wZXJhbmQ6RlAgMyAiZ2NuX2FsdV9vcGVyYW5kIiAidlN2QSwgIHZBIikpKSldCisgICIi CisgICJ2X2ZtYSVpMFx0JTAsICUxLCAlMiwgLSUzIgorICBbKHNldF9hdHRyICJ0eXBlIiAi dm9wM2EiKQorICAgKHNldF9hdHRyICJsZW5ndGgiICI4IildKQorCisoZGVmaW5lX2luc24g ImZtczxtb2RlPjRfbmVnb3AyIgorICBbKHNldCAobWF0Y2hfb3BlcmFuZDpGUCAwICJyZWdp c3Rlcl9vcGVyYW5kIiAgICAiPSAgdiwgICB2LCAgIHYiKQorCShmbWE6RlAKKwkgIChtYXRj aF9vcGVyYW5kOkZQIDEgImdjbl9hbHVfb3BlcmFuZCIgICAiICB2QSwgIHZBLHZTdkEiKQor CSAgKG5lZzpGUAorCSAgICAobWF0Y2hfb3BlcmFuZDpGUCAyICJnY25fYWx1X29wZXJhbmQi ICIgIHZBLHZTdkEsICB2QSIpKQorCSAgKG5lZzpGUAorCSAgICAobWF0Y2hfb3BlcmFuZDpG UCAzICJnY25fYWx1X29wZXJhbmQiICJ2U3ZBLCAgdkEsICB2QSIpKSkpXQorICAiIgorICAi dl9mbWElaTBcdCUwLCAlMSwgLSUyLCAtJTMiCisgIFsoc2V0X2F0dHIgInR5cGUiICJ2b3Az YSIpCisgICAoc2V0X2F0dHIgImxlbmd0aCIgIjgiKV0pCisKIDs7IH19fQogOzsge3t7IEZQ IGRpdmlzaW9uCiAKZGlmZiAtLWdpdCBhL2djYy9jb25maWcvZ2NuL2djbi5jYyBiL2djYy9j b25maWcvZ2NuL2djbi5jYwppbmRleCAzZDcxYzJmNjUyNi4uYWNhMTdhMTlkODQgMTAwNjQ0 Ci0tLSBhL2djYy9jb25maWcvZ2NuL2djbi5jYworKysgYi9nY2MvY29uZmlnL2djbi9nY24u Y2MKQEAgLTUwMTMsNiArNTAxMyw3OSBAQCBnY25fdmVjdG9yX2FsaWdubWVudF9yZWFjaGFi bGUgKGNvbnN0X3RyZWUgQVJHX1VOVVNFRCAodHlwZSksIGJvb2wgaXNfcGFja2VkKQogICBy ZXR1cm4gIWlzX3BhY2tlZDsKIH0KIAorLyogR2VuZXJhdGUgRFBQIHBhaXJ3aXNlIHN3YXAg aW5zdHJ1Y3Rpb24uCisgICBUaGlzIGluc3RydWN0aW9uIHN3YXBzIHRoZSB2YWx1ZXMgaW4g ZWFjaCBldmVuIGxhbmUgd2l0aCB0aGUgdmFsdWUgaW4gdGhlCisgICBuZXh0IG9uZToKKyAg ICAgYSwgYiwgYywgZCAtPiBiLCBhLCBkLCBjLgorICAgVGhlIG9wY29kZSBpcyBnaXZlbiBi eSBJTlNOLiAgKi8KKworY2hhciAqCitnY25fZXhwYW5kX2RwcF9zd2FwX3BhaXJzX2luc24g KG1hY2hpbmVfbW9kZSBtb2RlLCBjb25zdCBjaGFyICppbnNuLAorCQkJCWludCBBUkdfVU5V U0VEICh1bnNwZWMpKQoreworICBzdGF0aWMgY2hhciBidWZbMTI4XTsKKyAgY29uc3QgY2hh ciAqZHBwOworCisgIC8qIEFkZCB0aGUgRFBQIG1vZGlmaWVycy4gICovCisgIGRwcCA9ICJx dWFkX3Blcm06WzEsMCwzLDJdIjsKKworICBpZiAodmdwcl8ycmVnX21vZGVfcCAobW9kZSkp CisgICAgc3ByaW50ZiAoYnVmLCAiJXNcdCUlTDAsICUlTDEgJXNcblx0JXNcdCUlSDAsICUl SDEgJXMiLAorCSAgICAgaW5zbiwgZHBwLCBpbnNuLCBkcHApOworICBlbHNlCisgICAgc3By aW50ZiAoYnVmLCAiJXNcdCUlMCwgJSUxICVzIiwgaW5zbiwgZHBwKTsKKworICByZXR1cm4g YnVmOworfQorCisvKiBHZW5lcmF0ZSBEUFAgZGlzdHJpYnV0ZSBldmVuIGluc3RydWN0aW9u LgorICAgVGhpcyBpbnN0cnVjdGlvbiBjb3BpZXMgdGhlIHZhbHVlIGluIGVhY2ggZXZlbiBs YW5lIHRvIHRoZSBuZXh0IG9uZToKKyAgICAgYSwgYiwgYywgZCAtPiBhLCBhLCBjLCBjLgor ICAgVGhlIG9wY29kZSBpcyBnaXZlbiBieSBJTlNOLiAgKi8KKworY2hhciAqCitnY25fZXhw YW5kX2RwcF9kaXN0cmlidXRlX2V2ZW5faW5zbiAobWFjaGluZV9tb2RlIG1vZGUsIGNvbnN0 IGNoYXIgKmluc24sCisJCQkJICAgICBpbnQgQVJHX1VOVVNFRCAodW5zcGVjKSkKK3sKKyAg c3RhdGljIGNoYXIgYnVmWzEyOF07CisgIGNvbnN0IGNoYXIgKmRwcDsKKworICAvKiBBZGQg dGhlIERQUCBtb2RpZmllcnMuICAqLworICBkcHAgPSAicXVhZF9wZXJtOlswLDAsMiwyXSI7 CisKKyAgaWYgKHZncHJfMnJlZ19tb2RlX3AgKG1vZGUpKQorICAgIHNwcmludGYgKGJ1Ziwg IiVzXHQlJUwwLCAlJUwxICVzXG5cdCVzXHQlJUgwLCAlJUgxICVzIiwKKwkgICAgIGluc24s IGRwcCwgaW5zbiwgZHBwKTsKKyAgZWxzZQorICAgIHNwcmludGYgKGJ1ZiwgIiVzXHQlJTAs ICUlMSAlcyIsIGluc24sIGRwcCk7CisKKyAgcmV0dXJuIGJ1ZjsKK30KKworLyogR2VuZXJh dGUgRFBQIGRpc3RyaWJ1dGUgb2RkIGluc3RydWN0aW9uLgorICAgVGhpcyBpc250cnVjdGlv biBjb3BpZXMgdGhlIHZhbHVlIGluIGVhY2ggb2RkIGxhbmUgdG8gdGhlIHByZXZpb3VzIG9u ZToKKyAgICAgYSwgYiwgYywgZCAtPiBiLCBiLCBkLCBkLgorICAgVGhlIG9wY29kZSBpcyBn aXZlbiBieSBJTlNOLiAgKi8KKworY2hhciAqCitnY25fZXhwYW5kX2RwcF9kaXN0cmlidXRl X29kZF9pbnNuIChtYWNoaW5lX21vZGUgbW9kZSwgY29uc3QgY2hhciAqaW5zbiwKKwkJCQkg ICAgaW50IEFSR19VTlVTRUQgKHVuc3BlYykpCit7CisgIHN0YXRpYyBjaGFyIGJ1ZlsxMjhd OworICBjb25zdCBjaGFyICpkcHA7CisKKyAgLyogQWRkIHRoZSBEUFAgbW9kaWZpZXJzLiAg Ki8KKyAgZHBwID0gInF1YWRfcGVybTpbMSwxLDMsM10iOworCisgIGlmICh2Z3ByXzJyZWdf bW9kZV9wIChtb2RlKSkKKyAgICBzcHJpbnRmIChidWYsICIlc1x0JSVMMCwgJSVMMSAlc1xu XHQlc1x0JSVIMCwgJSVIMSAlcyIsCisJICAgICBpbnNuLCBkcHAsIGluc24sIGRwcCk7Cisg IGVsc2UKKyAgICBzcHJpbnRmIChidWYsICIlc1x0JSUwLCAlJTEgJXMiLCBpbnNuLCBkcHAp OworCisgIHJldHVybiBidWY7Cit9CisKIC8qIEdlbmVyYXRlIERQUCBpbnN0cnVjdGlvbnMg dXNlZCBmb3IgdmVjdG9yIHJlZHVjdGlvbnMuCiAKICAgIFRoZSBvcGNvZGUgaXMgZ2l2ZW4g YnkgSU5TTi4KZGlmZiAtLWdpdCBhL2djYy9jb25maWcvZ2NuL2djbi5tZCBiL2djYy9jb25m aWcvZ2NuL2djbi5tZAppbmRleCAxMGQyYjg3NGNjZS4uYzkwMzAzYzU0YjUgMTAwNjQ0Ci0t LSBhL2djYy9jb25maWcvZ2NuL2djbi5tZAorKysgYi9nY2MvY29uZmlnL2djbi9nY24ubWQK QEAgLTc4LDYgKzc4LDEzIEBACiAgIFVOU1BFQ19QTFVTX0NBUlJZX0RQUF9TSFIgVU5TUEVD X1BMVVNfQ0FSUllfSU5fRFBQX1NIUgogICBVTlNQRUNfQU5EX0RQUF9TSFIgVU5TUEVDX0lP Ul9EUFBfU0hSIFVOU1BFQ19YT1JfRFBQX1NIUgogICBVTlNQRUNfTU9WX0RQUF9TSFIKKyAg VU5TUEVDX01PVl9EUFBfU1dBUF9QQUlSUworICBVTlNQRUNfTU9WX0RQUF9ESVNUUklCVVRF X0VWRU4KKyAgVU5TUEVDX01PVl9EUFBfRElTVFJJQlVURV9PREQKKyAgVU5TUEVDX0NNVUwg VU5TUEVDX0NNVUxfQ09OSgorICBVTlNQRUNfQ01VTF9BREQgVU5TUEVDX0NNVUxfU1VCCisg IFVOU1BFQ19DQUREOTAKKyAgVU5TUEVDX0NBREQyNzAKICAgVU5TUEVDX0dBVEhFUgogICBV TlNQRUNfU0NBVFRFUgogICBVTlNQRUNfUkNQCmRpZmYgLS1naXQgYS9nY2MvdGVzdHN1aXRl L2djYy50YXJnZXQvZ2NuL2NvbXBsZXguYyBiL2djYy90ZXN0c3VpdGUvZ2NjLnRhcmdldC9n Y24vY29tcGxleC5jCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAwMDAwLi4y MzA0Yjk4NmNmNAotLS0gL2Rldi9udWxsCisrKyBiL2djYy90ZXN0c3VpdGUvZ2NjLnRhcmdl dC9nY24vY29tcGxleC5jCkBAIC0wLDAgKzEsNjI3IEBACisvLyB7IGRnLWRvIHJ1biB9Cisv LyB7IGRnLW9wdGlvbnMgIi1zdGQ9Yzk5IC1PMyIgfQorCisjaW5jbHVkZSA8c3RkbGliLmg+ CisjaW5jbHVkZSA8c3RkYm9vbC5oPgorCisjZGVmaW5lIENPVU5UIDEwMDAKKyNkZWZpbmUg TUFYIDEwMDAKKyNkZWZpbmUgQUxJR05NRU5UICgyKjEwMjQqMTAyNCkgLy8gMk1CCisKK19D b21wbGV4IGRvdWJsZSBjb25qKF9Db21wbGV4IGRvdWJsZSk7CitfQ29tcGxleCBmbG9hdCBj b25qZihfQ29tcGxleCBmbG9hdCk7CisKK3Vuc2lnbmVkIGludCBkZXZpY2UgPSAwOworCisv LyBjbXVsCisKK3ZvaWQgY211bEYoZmxvYXQgKnRkLCBmbG9hdCAqdGUsIGZsb2F0ICp0Ziwg ZmxvYXQgKnRnLCBpbnQgdGFzKQoreworICB0eXBlZGVmIF9Db21wbGV4IGZsb2F0IGNvbXBs ZXhUOworICBpbnQgYXJyYXlfc2l6ZSA9IHRhcy8yOworICBjb21wbGV4VCAqZCA9IChjb21w bGV4VCopKHRkKTsKKyAgY29tcGxleFQgKmUgPSAoY29tcGxleFQqKSh0ZSk7CisgIGNvbXBs ZXhUICpmID0gKGNvbXBsZXhUKikodGYpOworICBmb3IgKGludCBpID0gMDsgaSA8IGFycmF5 X3NpemU7IGkrKykKKyAgICB7CisgICAgICBkW2ldID0gZVtpXSAqIGZbaV07CisgICAgfQor fQorCitfX2F0dHJpYnV0ZV9fKChvcHRpbWl6ZSgibm8tdHJlZS12ZWN0b3JpemUiKSkpCiti b29sIGNtdWxGY2hlY2soZmxvYXQgKnRkLCBmbG9hdCAqdGUsIGZsb2F0ICp0ZiwgZmxvYXQg KnRnLCBpbnQgdGFzKQoreworICBmb3IgKGludCBpID0gMDsgaSA8IHRhcy8yOyArK2kpCisg ICAgeworICAgICAgZmxvYXQgYSA9IHRlW2kqMl07CisgICAgICBmbG9hdCBiID0gdGVbaSoy KzFdOworICAgICAgZmxvYXQgYyA9IHRmW2kqMl07CisgICAgICBmbG9hdCBkID0gdGZbaSoy KzFdOworICAgICAgaWYgKHRkW2kqMl0gIT0gYSpjLWIqZCB8fCB0ZFtpKjIrMV0gIT0gYSpk K2IqYykKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgcmV0dXJuIHRydWU7Cit9 CisKK3ZvaWQgY211bEQoZG91YmxlICp0ZCwgZG91YmxlICp0ZSwgZG91YmxlICp0ZiwgZG91 YmxlICp0ZywgaW50IHRhcykKK3sKKyAgdHlwZWRlZiBfQ29tcGxleCBkb3VibGUgY29tcGxl eFQ7CisgIGludCBhcnJheV9zaXplID0gdGFzLzI7CisgIGNvbXBsZXhUICpkID0gKGNvbXBs ZXhUKikodGQpOworICBjb21wbGV4VCAqZSA9IChjb21wbGV4VCopKHRlKTsKKyAgY29tcGxl eFQgKmYgPSAoY29tcGxleFQqKSh0Zik7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgYXJyYXlf c2l6ZTsgaSsrKQorICAgIHsKKyAgICAgIGRbaV0gPSBlW2ldICogZltpXTsKKyAgICB9Cit9 CisKK19fYXR0cmlidXRlX18oKG9wdGltaXplKCJuby10cmVlLXZlY3Rvcml6ZSIpKSkKK2Jv b2wgY211bERjaGVjayhkb3VibGUgKnRkLCBkb3VibGUgKnRlLCBkb3VibGUgKnRmLCBkb3Vi bGUgKnRnLCBpbnQgdGFzKQoreworICBmb3IgKGludCBpID0gMDsgaSA8IHRhcy8yOyArK2kp CisgICAgeworICAgICAgZG91YmxlIGEgPSB0ZVtpKjJdOworICAgICAgZG91YmxlIGIgPSB0 ZVtpKjIrMV07CisgICAgICBkb3VibGUgYyA9IHRmW2kqMl07CisgICAgICBkb3VibGUgZCA9 IHRmW2kqMisxXTsKKyAgICAgIGlmICh0ZFtpKjJdICE9IGEqYy1iKmQgfHwgdGRbaSoyKzFd ICE9IGEqZCtiKmMpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgIHJldHVybiB0 cnVlOworfQorCisKKy8vIGNtdWxfY29uagorCit2b2lkIGNtdWxfY29uakYoZmxvYXQgKnRk LCBmbG9hdCAqdGUsIGZsb2F0ICp0ZiwgZmxvYXQgKnRnLCBpbnQgdGFzKQoreworICB0eXBl ZGVmIF9Db21wbGV4IGZsb2F0IGNvbXBsZXhUOworICBpbnQgYXJyYXlfc2l6ZSA9IHRhcy8y OworICBjb21wbGV4VCAqZCA9IChjb21wbGV4VCopKHRkKTsKKyAgY29tcGxleFQgKmUgPSAo Y29tcGxleFQqKSh0ZSk7CisgIGNvbXBsZXhUICpmID0gKGNvbXBsZXhUKikodGYpOworICBm b3IgKGludCBpID0gMDsgaSA8IGFycmF5X3NpemU7IGkrKykKKyAgICB7CisgICAgICBkW2ld ID0gZVtpXSAqIGNvbmooZltpXSk7CisgICAgfQorfQorCitfX2F0dHJpYnV0ZV9fKChvcHRp bWl6ZSgibm8tdHJlZS12ZWN0b3JpemUiKSkpCitib29sIGNtdWxfY29uakZjaGVjayhmbG9h dCAqdGQsIGZsb2F0ICp0ZSwgZmxvYXQgKnRmLCBmbG9hdCAqdGcsIGludCB0YXMpCit7Cisg IGZvciAoaW50IGkgPSAwOyBpIDwgdGFzLzI7ICsraSkKKyAgICB7CisgICAgICBmbG9hdCBh ID0gdGVbaSoyXTsKKyAgICAgIGZsb2F0IGIgPSB0ZVtpKjIrMV07CisgICAgICBmbG9hdCBj ID0gdGZbaSoyXTsKKyAgICAgIGZsb2F0IGQgPSB0ZltpKjIrMV07CisgICAgICBpZiAodGRb aSoyXSAhPSBhKmMrYipkIHx8IHRkW2kqMisxXSAhPSBiKmMtYSpkKQorICAgICAgICByZXR1 cm4gZmFsc2U7CisgICAgfQorICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBjbXVsX2NvbmpE KGRvdWJsZSAqdGQsIGRvdWJsZSAqdGUsIGRvdWJsZSAqdGYsIGRvdWJsZSAqdGcsIGludCB0 YXMpCit7CisgIHR5cGVkZWYgX0NvbXBsZXggZG91YmxlIGNvbXBsZXhUOworICBpbnQgYXJy YXlfc2l6ZSA9IHRhcy8yOworICBjb21wbGV4VCAqZCA9IChjb21wbGV4VCopKHRkKTsKKyAg Y29tcGxleFQgKmUgPSAoY29tcGxleFQqKSh0ZSk7CisgIGNvbXBsZXhUICpmID0gKGNvbXBs ZXhUKikodGYpOworICBmb3IgKGludCBpID0gMDsgaSA8IGFycmF5X3NpemU7IGkrKykKKyAg ICB7CisgICAgICBkW2ldID0gZVtpXSAqIGNvbmooZltpXSk7CisgICAgfQorfQorCitfX2F0 dHJpYnV0ZV9fKChvcHRpbWl6ZSgibm8tdHJlZS12ZWN0b3JpemUiKSkpCitib29sIGNtdWxf Y29uakRjaGVjayhkb3VibGUgKnRkLCBkb3VibGUgKnRlLCBkb3VibGUgKnRmLCBkb3VibGUg KnRnLCBpbnQgdGFzKQoreworICBmb3IgKGludCBpID0gMDsgaSA8IHRhcy8yOyArK2kpCisg ICAgeworICAgICAgZG91YmxlIGEgPSB0ZVtpKjJdOworICAgICAgZG91YmxlIGIgPSB0ZVtp KjIrMV07CisgICAgICBkb3VibGUgYyA9IHRmW2kqMl07CisgICAgICBkb3VibGUgZCA9IHRm W2kqMisxXTsKKyAgICAgIGlmICh0ZFtpKjJdICE9IGEqYytiKmQgfHwgdGRbaSoyKzFdICE9 IGIqYy1hKmQpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgIHJldHVybiB0cnVl OworfQorCisKKy8vIGFkZHN1YgorCit2b2lkIGFkZHN1YkYoZmxvYXQgKnRkLCBmbG9hdCAq dGUsIGZsb2F0ICp0ZiwgZmxvYXQgKnRnLCBpbnQgdGFzKQoreworICB0eXBlZGVmIF9Db21w bGV4IGZsb2F0IGNvbXBsZXhUOworICBpbnQgYXJyYXlfc2l6ZSA9IHRhcy8yOworICBjb21w bGV4VCAqZCA9IChjb21wbGV4VCopKHRkKTsKKyAgY29tcGxleFQgKmUgPSAoY29tcGxleFQq KSh0ZSk7CisgIGNvbXBsZXhUICpmID0gKGNvbXBsZXhUKikodGYpOworICBmb3IgKGludCBp ID0gMDsgaSA8IGFycmF5X3NpemU7IGkrKykKKyAgICB7CisgICAgICBkW2ldID0gZVtpXSAt IGNvbmpmKGZbaV0pOworICAgIH0KK30KKworX19hdHRyaWJ1dGVfXygob3B0aW1pemUoIm5v LXRyZWUtdmVjdG9yaXplIikpKQorYm9vbCBhZGRzdWJGY2hlY2soZmxvYXQgKnRkLCBmbG9h dCAqdGUsIGZsb2F0ICp0ZiwgZmxvYXQgKnRnLCBpbnQgdGFzKQoreworICBmb3IgKGludCBp ID0gMDsgaSA8IHRhcy8yOyArK2kpCisgICAgeworICAgICAgZmxvYXQgYSA9IHRlW2kqMl07 CisgICAgICBmbG9hdCBiID0gdGVbaSoyKzFdOworICAgICAgZmxvYXQgYyA9IHRmW2kqMl07 CisgICAgICBmbG9hdCBkID0gdGZbaSoyKzFdOworICAgICAgaWYgKHRkW2kqMl0gIT0gYS1j IHx8IHRkW2kqMisxXSAhPSBiK2QpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9Cisg IHJldHVybiB0cnVlOworfQorCit2b2lkIGFkZHN1YkQoZG91YmxlICp0ZCwgZG91YmxlICp0 ZSwgZG91YmxlICp0ZiwgZG91YmxlICp0ZywgaW50IHRhcykKK3sKKyAgdHlwZWRlZiBfQ29t cGxleCBkb3VibGUgY29tcGxleFQ7CisgIGludCBhcnJheV9zaXplID0gdGFzLzI7CisgIGNv bXBsZXhUICpkID0gKGNvbXBsZXhUKikodGQpOworICBjb21wbGV4VCAqZSA9IChjb21wbGV4 VCopKHRlKTsKKyAgY29tcGxleFQgKmYgPSAoY29tcGxleFQqKSh0Zik7CisgIGZvciAoaW50 IGkgPSAwOyBpIDwgYXJyYXlfc2l6ZTsgaSsrKQorICAgIHsKKyAgICAgIGRbaV0gPSBlW2ld IC0gY29uaihmW2ldKTsKKyAgICB9Cit9CisKK19fYXR0cmlidXRlX18oKG9wdGltaXplKCJu by10cmVlLXZlY3Rvcml6ZSIpKSkKK2Jvb2wgYWRkc3ViRGNoZWNrKGRvdWJsZSAqdGQsIGRv dWJsZSAqdGUsIGRvdWJsZSAqdGYsIGRvdWJsZSAqdGcsIGludCB0YXMpCit7CisgIGZvciAo aW50IGkgPSAwOyBpIDwgdGFzLzI7ICsraSkKKyAgICB7CisgICAgICBkb3VibGUgYSA9IHRl W2kqMl07CisgICAgICBkb3VibGUgYiA9IHRlW2kqMisxXTsKKyAgICAgIGRvdWJsZSBjID0g dGZbaSoyXTsKKyAgICAgIGRvdWJsZSBkID0gdGZbaSoyKzFdOworICAgICAgaWYgKHRkW2kq Ml0gIT0gYS1jIHx8IHRkW2kqMisxXSAhPSBiK2QpCisgICAgICAgIHJldHVybiBmYWxzZTsK KyAgICB9CisgIHJldHVybiB0cnVlOworfQorCisKKy8vIGZtYWRkc3ViCisKK3ZvaWQgZm1h ZGRzdWJGKGZsb2F0ICp0ZCwgZmxvYXQgKnRlLCBmbG9hdCAqdGYsIGZsb2F0ICp0ZywgaW50 IHRhcykKK3sKKyAgaW50IGFycmF5X3NpemUgPSB0YXMvMjsKKyAgZm9yIChpbnQgaSA9IDA7 IGkgPCBhcnJheV9zaXplOyBpKyspCisgICAgeworICAgICAgdGRbaSoyXSA9IHRlW2kqMl0q dGZbaSoyXS10Z1tpKjJdOworICAgICAgdGRbaSoyKzFdID0gdGVbaSoyKzFdKnRmW2kqMisx XSt0Z1tpKjIrMV07CisgICAgfQorfQorCitfX2F0dHJpYnV0ZV9fKChvcHRpbWl6ZSgibm8t dHJlZS12ZWN0b3JpemUiKSkpCitib29sIGZtYWRkc3ViRmNoZWNrKGZsb2F0ICp0ZCwgZmxv YXQgKnRlLCBmbG9hdCAqdGYsIGZsb2F0ICp0ZywgaW50IHRhcykKK3sKKyAgZm9yIChpbnQg aSA9IDA7IGkgPCB0YXMvMjsgKytpKQorICAgIHsKKyAgICAgIGZsb2F0IGEgPSB0ZVtpKjJd OworICAgICAgZmxvYXQgYiA9IHRlW2kqMisxXTsKKyAgICAgIGZsb2F0IGMgPSB0ZltpKjJd OworICAgICAgZmxvYXQgZCA9IHRmW2kqMisxXTsKKyAgICAgIGZsb2F0IGUgPSB0Z1tpKjJd OworICAgICAgZmxvYXQgZiA9IHRnW2kqMisxXTsKKyAgICAgIGlmICh0ZFtpKjJdICE9IGEq Yy1lIHx8IHRkW2kqMisxXSAhPSBiKmQrZikKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAg IH0KKyAgcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQgZm1hZGRzdWJEKGRvdWJsZSAqdGQsIGRv dWJsZSAqdGUsIGRvdWJsZSAqdGYsIGRvdWJsZSAqdGcsIGludCB0YXMpCit7CisgIGludCBh cnJheV9zaXplID0gdGFzLzI7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgYXJyYXlfc2l6ZTsg aSsrKQorICAgIHsKKyAgICAgIHRkW2kqMl0gPSB0ZVtpKjJdKnRmW2kqMl0tdGdbaSoyXTsK KyAgICAgIHRkW2kqMisxXSA9IHRlW2kqMisxXSp0ZltpKjIrMV0rdGdbaSoyKzFdOworICAg IH0KK30KKworX19hdHRyaWJ1dGVfXygob3B0aW1pemUoIm5vLXRyZWUtdmVjdG9yaXplIikp KQorYm9vbCBmbWFkZHN1YkRjaGVjayhkb3VibGUgKnRkLCBkb3VibGUgKnRlLCBkb3VibGUg KnRmLCBkb3VibGUgKnRnLCBpbnQgdGFzKQoreworICBmb3IgKGludCBpID0gMDsgaSA8IHRh cy8yOyArK2kpCisgICAgeworICAgICAgZG91YmxlIGEgPSB0ZVtpKjJdOworICAgICAgZG91 YmxlIGIgPSB0ZVtpKjIrMV07CisgICAgICBkb3VibGUgYyA9IHRmW2kqMl07CisgICAgICBk b3VibGUgZCA9IHRmW2kqMisxXTsKKyAgICAgIGRvdWJsZSBlID0gdGdbaSoyXTsKKyAgICAg IGRvdWJsZSBmID0gdGdbaSoyKzFdOworICAgICAgaWYgKHRkW2kqMl0gIT0gYSpjLWUgfHwg dGRbaSoyKzFdICE9IGIqZCtmKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICBy ZXR1cm4gdHJ1ZTsKK30KKworCisvLyBmbXN1YmFkZAorCit2b2lkIGZtc3ViYWRkRihmbG9h dCAqdGQsIGZsb2F0ICp0ZSwgZmxvYXQgKnRmLCBmbG9hdCAqdGcsIGludCB0YXMpCit7Cisg IGludCBhcnJheV9zaXplID0gdGFzLzI7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgYXJyYXlf c2l6ZTsgaSsrKQorICAgIHsKKyAgICAgIHRkW2kqMl0gPSB0ZVtpKjJdKnRmW2kqMl0rdGdb aSoyXTsKKyAgICAgIHRkW2kqMisxXSA9IHRlW2kqMisxXSp0ZltpKjIrMV0tdGdbaSoyKzFd OworICAgIH0KK30KKworX19hdHRyaWJ1dGVfXygob3B0aW1pemUoIm5vLXRyZWUtdmVjdG9y aXplIikpKQorYm9vbCBmbXN1YmFkZEZjaGVjayhmbG9hdCAqdGQsIGZsb2F0ICp0ZSwgZmxv YXQgKnRmLCBmbG9hdCAqdGcsIGludCB0YXMpCit7CisgIGZvciAoaW50IGkgPSAwOyBpIDwg dGFzLzI7ICsraSkKKyAgICB7CisgICAgICBmbG9hdCBhID0gdGVbaSoyXTsKKyAgICAgIGZs b2F0IGIgPSB0ZVtpKjIrMV07CisgICAgICBmbG9hdCBjID0gdGZbaSoyXTsKKyAgICAgIGZs b2F0IGQgPSB0ZltpKjIrMV07CisgICAgICBmbG9hdCBlID0gdGdbaSoyXTsKKyAgICAgIGZs b2F0IGYgPSB0Z1tpKjIrMV07CisgICAgICBpZiAodGRbaSoyXSAhPSBhKmMrZSB8fCB0ZFtp KjIrMV0gIT0gYipkLWYpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgIHJldHVy biB0cnVlOworfQorCit2b2lkIGZtc3ViYWRkRChkb3VibGUgKnRkLCBkb3VibGUgKnRlLCBk b3VibGUgKnRmLCBkb3VibGUgKnRnLCBpbnQgdGFzKQoreworICBpbnQgYXJyYXlfc2l6ZSA9 IHRhcy8yOworICBmb3IgKGludCBpID0gMDsgaSA8IGFycmF5X3NpemU7IGkrKykKKyAgICB7 CisgICAgICB0ZFtpKjJdID0gdGVbaSoyXSp0ZltpKjJdK3RnW2kqMl07CisgICAgICB0ZFtp KjIrMV0gPSB0ZVtpKjIrMV0qdGZbaSoyKzFdLXRnW2kqMisxXTsKKyAgICB9Cit9CisKK19f YXR0cmlidXRlX18oKG9wdGltaXplKCJuby10cmVlLXZlY3Rvcml6ZSIpKSkKK2Jvb2wgZm1z dWJhZGREY2hlY2soZG91YmxlICp0ZCwgZG91YmxlICp0ZSwgZG91YmxlICp0ZiwgZG91Ymxl ICp0ZywgaW50IHRhcykKK3sKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCB0YXMvMjsgKytpKQor ICAgIHsKKyAgICAgIGRvdWJsZSBhID0gdGVbaSoyXTsKKyAgICAgIGRvdWJsZSBiID0gdGVb aSoyKzFdOworICAgICAgZG91YmxlIGMgPSB0ZltpKjJdOworICAgICAgZG91YmxlIGQgPSB0 ZltpKjIrMV07CisgICAgICBkb3VibGUgZSA9IHRnW2kqMl07CisgICAgICBkb3VibGUgZiA9 IHRnW2kqMisxXTsKKyAgICAgIGlmICh0ZFtpKjJdICE9IGEqYytlIHx8IHRkW2kqMisxXSAh PSBiKmQtZikKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgcmV0dXJuIHRydWU7 Cit9CisKKworLy8gY2FkZDkwCisKK3ZvaWQgY2FkZDkwRihmbG9hdCAqdGQsIGZsb2F0ICp0 ZSwgZmxvYXQgKnRmLCBmbG9hdCAqdGcsIGludCB0YXMpCit7CisgIGludCBhcnJheV9zaXpl ID0gdGFzLzI7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgYXJyYXlfc2l6ZTsgaSsrKQorICAg IHsKKyAgICAgIHRkW2kqMl0gPSB0ZVtpKjJdIC0gdGZbaSoyKzFdOworICAgICAgdGRbaSoy KzFdID0gdGVbaSoyKzFdICsgdGZbaSoyXTsKKyAgICB9Cit9CisKK19fYXR0cmlidXRlX18o KG9wdGltaXplKCJuby10cmVlLXZlY3Rvcml6ZSIpKSkKK2Jvb2wgY2FkZDkwRmNoZWNrKGZs b2F0ICp0ZCwgZmxvYXQgKnRlLCBmbG9hdCAqdGYsIGZsb2F0ICp0ZywgaW50IHRhcykKK3sK KyAgZm9yIChpbnQgaSA9IDA7IGkgPCB0YXMvMjsgKytpKQorICAgIHsKKyAgICAgIGZsb2F0 IGEgPSB0ZVtpKjJdOworICAgICAgZmxvYXQgYiA9IHRlW2kqMisxXTsKKyAgICAgIGZsb2F0 IGMgPSB0ZltpKjJdOworICAgICAgZmxvYXQgZCA9IHRmW2kqMisxXTsKKyAgICAgIGlmICh0 ZFtpKjJdICE9IGEtZCB8fCB0ZFtpKjIrMV0gIT0gYitjKQorICAgICAgICByZXR1cm4gZmFs c2U7CisgICAgfQorICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBjYWRkOTBEKGRvdWJsZSAq dGQsIGRvdWJsZSAqdGUsIGRvdWJsZSAqdGYsIGRvdWJsZSAqdGcsIGludCB0YXMpCit7Cisg IGludCBhcnJheV9zaXplID0gdGFzLzI7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgYXJyYXlf c2l6ZTsgaSsrKQorICAgIHsKKyAgICAgIHRkW2kqMl0gPSB0ZVtpKjJdIC0gdGZbaSoyKzFd OworICAgICAgdGRbaSoyKzFdID0gdGVbaSoyKzFdICsgdGZbaSoyXTsKKyAgICB9Cit9CisK K19fYXR0cmlidXRlX18oKG9wdGltaXplKCJuby10cmVlLXZlY3Rvcml6ZSIpKSkKK2Jvb2wg Y2FkZDkwRGNoZWNrKGRvdWJsZSAqdGQsIGRvdWJsZSAqdGUsIGRvdWJsZSAqdGYsIGRvdWJs ZSAqdGcsIGludCB0YXMpCit7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgdGFzLzI7ICsraSkK KyAgICB7CisgICAgICBkb3VibGUgYSA9IHRlW2kqMl07CisgICAgICBkb3VibGUgYiA9IHRl W2kqMisxXTsKKyAgICAgIGRvdWJsZSBjID0gdGZbaSoyXTsKKyAgICAgIGRvdWJsZSBkID0g dGZbaSoyKzFdOworICAgICAgaWYgKHRkW2kqMl0gIT0gYS1kIHx8IHRkW2kqMisxXSAhPSBi K2MpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgIHJldHVybiB0cnVlOworfQor CisvLyBjYWRkMjcwCisKK3ZvaWQgY2FkZDI3MEYoZmxvYXQgKnRkLCBmbG9hdCAqdGUsIGZs b2F0ICp0ZiwgZmxvYXQgKnRnLCBpbnQgdGFzKQoreworICBpbnQgYXJyYXlfc2l6ZSA9IHRh cy8yOworICBmb3IgKGludCBpID0gMDsgaSA8IGFycmF5X3NpemU7IGkrKykKKyAgICB7Cisg ICAgICB0ZFtpKjJdID0gdGVbaSoyXSArIHRmW2kqMisxXTsKKyAgICAgIHRkW2kqMisxXSA9 IHRlW2kqMisxXSAtIHRmW2kqMl07CisgICAgfQorfQorCitfX2F0dHJpYnV0ZV9fKChvcHRp bWl6ZSgibm8tdHJlZS12ZWN0b3JpemUiKSkpCitib29sIGNhZGQyNzBGY2hlY2soZmxvYXQg KnRkLCBmbG9hdCAqdGUsIGZsb2F0ICp0ZiwgZmxvYXQgKnRnLCBpbnQgdGFzKQoreworICBm b3IgKGludCBpID0gMDsgaSA8IHRhcy8yOyArK2kpCisgICAgeworICAgICAgZmxvYXQgYSA9 IHRlW2kqMl07CisgICAgICBmbG9hdCBiID0gdGVbaSoyKzFdOworICAgICAgZmxvYXQgYyA9 IHRmW2kqMl07CisgICAgICBmbG9hdCBkID0gdGZbaSoyKzFdOworICAgICAgaWYgKHRkW2kq Ml0gIT0gYStkIHx8IHRkW2kqMisxXSAhPSBiLWMpCisgICAgICAgIHJldHVybiBmYWxzZTsK KyAgICB9CisgIHJldHVybiB0cnVlOworfQorCit2b2lkIGNhZGQyNzBEKGRvdWJsZSAqdGQs IGRvdWJsZSAqdGUsIGRvdWJsZSAqdGYsIGRvdWJsZSAqdGcsIGludCB0YXMpCit7CisgIGlu dCBhcnJheV9zaXplID0gdGFzLzI7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgYXJyYXlfc2l6 ZTsgaSsrKQorICAgIHsKKyAgICAgIHRkW2kqMl0gPSB0ZVtpKjJdICsgdGZbaSoyKzFdOwor ICAgICAgdGRbaSoyKzFdID0gdGVbaSoyKzFdIC0gdGZbaSoyXTsKKyAgICB9Cit9CisKK19f YXR0cmlidXRlX18oKG9wdGltaXplKCJuby10cmVlLXZlY3Rvcml6ZSIpKSkKK2Jvb2wgY2Fk ZDI3MERjaGVjayhkb3VibGUgKnRkLCBkb3VibGUgKnRlLCBkb3VibGUgKnRmLCBkb3VibGUg KnRnLCBpbnQgdGFzKQoreworICBmb3IgKGludCBpID0gMDsgaSA8IHRhcy8yOyArK2kpCisg ICAgeworICAgICAgZG91YmxlIGEgPSB0ZVtpKjJdOworICAgICAgZG91YmxlIGIgPSB0ZVtp KjIrMV07CisgICAgICBkb3VibGUgYyA9IHRmW2kqMl07CisgICAgICBkb3VibGUgZCA9IHRm W2kqMisxXTsKKyAgICAgIGlmICh0ZFtpKjJdICE9IGErZCB8fCB0ZFtpKjIrMV0gIT0gYi1j KQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICByZXR1cm4gdHJ1ZTsKK30KKwor CisvLyBjbWxhCisKK3ZvaWQgY21sYUYoZmxvYXQgKnRkLCBmbG9hdCAqdGUsIGZsb2F0ICp0 ZiwgZmxvYXQgKnRnLCBpbnQgdGFzKQoreworICB0eXBlZGVmIF9Db21wbGV4IGZsb2F0IGNv bXBsZXhUOworICBpbnQgYXJyYXlfc2l6ZSA9IHRhcy8yOworICBjb21wbGV4VCAqZCA9IChj b21wbGV4VCopKHRkKTsKKyAgY29tcGxleFQgKmUgPSAoY29tcGxleFQqKSh0ZSk7CisgIGNv bXBsZXhUICpmID0gKGNvbXBsZXhUKikodGYpOworICBjb21wbGV4VCAqZyA9IChjb21wbGV4 VCopKHRnKTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBhcnJheV9zaXplOyBpKyspCisgICAg eworICAgICAgZFtpXSA9IGVbaV0gKiBmW2ldICsgZ1tpXTsKKyAgICB9Cit9CisKK19fYXR0 cmlidXRlX18oKG9wdGltaXplKCJuby10cmVlLXZlY3Rvcml6ZSIpKSkKK2Jvb2wgY21sYUZj aGVjayhmbG9hdCAqdGQsIGZsb2F0ICp0ZSwgZmxvYXQgKnRmLCBmbG9hdCAqdGcsIGludCB0 YXMpCit7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgdGFzLzI7ICsraSkKKyAgICB7CisgICAg ICBmbG9hdCBhID0gdGVbaSoyXTsKKyAgICAgIGZsb2F0IGIgPSB0ZVtpKjIrMV07CisgICAg ICBmbG9hdCBjID0gdGZbaSoyXTsKKyAgICAgIGZsb2F0IGQgPSB0ZltpKjIrMV07CisgICAg ICBmbG9hdCBlID0gdGdbaSoyXTsKKyAgICAgIGZsb2F0IGYgPSB0Z1tpKjIrMV07CisgICAg ICBpZiAodGRbaSoyXSAhPSBhKmMtYipkK2UgfHwgdGRbaSoyKzFdICE9IGEqZCtiKmMrZikK KyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgcmV0dXJuIHRydWU7Cit9CisKK3Zv aWQgY21sYUQoZG91YmxlICp0ZCwgZG91YmxlICp0ZSwgZG91YmxlICp0ZiwgZG91YmxlICp0 ZywgaW50IHRhcykKK3sKKyAgdHlwZWRlZiBfQ29tcGxleCBkb3VibGUgY29tcGxleFQ7Cisg IGludCBhcnJheV9zaXplID0gdGFzLzI7CisgIGNvbXBsZXhUICpkID0gKGNvbXBsZXhUKiko dGQpOworICBjb21wbGV4VCAqZSA9IChjb21wbGV4VCopKHRlKTsKKyAgY29tcGxleFQgKmYg PSAoY29tcGxleFQqKSh0Zik7CisgIGNvbXBsZXhUICpnID0gKGNvbXBsZXhUKikodGcpOwor ICBmb3IgKGludCBpID0gMDsgaSA8IGFycmF5X3NpemU7IGkrKykKKyAgICB7CisgICAgICBk W2ldID0gZVtpXSAqIGZbaV0gKyBnW2ldOworICAgIH0KK30KKworX19hdHRyaWJ1dGVfXygo b3B0aW1pemUoIm5vLXRyZWUtdmVjdG9yaXplIikpKQorYm9vbCBjbWxhRGNoZWNrKGRvdWJs ZSAqdGQsIGRvdWJsZSAqdGUsIGRvdWJsZSAqdGYsIGRvdWJsZSAqdGcsIGludCB0YXMpCit7 CisgIGZvciAoaW50IGkgPSAwOyBpIDwgdGFzLzI7ICsraSkKKyAgICB7CisgICAgICBkb3Vi bGUgYSA9IHRlW2kqMl07CisgICAgICBkb3VibGUgYiA9IHRlW2kqMisxXTsKKyAgICAgIGRv dWJsZSBjID0gdGZbaSoyXTsKKyAgICAgIGRvdWJsZSBkID0gdGZbaSoyKzFdOworICAgICAg ZG91YmxlIGUgPSB0Z1tpKjJdOworICAgICAgZG91YmxlIGYgPSB0Z1tpKjIrMV07CisgICAg ICBpZiAodGRbaSoyXSAhPSBhKmMtYipkK2UgfHwgdGRbaSoyKzFdICE9IGEqZCtiKmMrZikK KyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgcmV0dXJuIHRydWU7Cit9CisKKwor Ly8gY21scworCit2b2lkIGNtbHNGKGZsb2F0ICp0ZCwgZmxvYXQgKnRlLCBmbG9hdCAqdGYs IGZsb2F0ICp0ZywgaW50IHRhcykKK3sKKyAgdHlwZWRlZiBfQ29tcGxleCBmbG9hdCBjb21w bGV4VDsKKyAgaW50IGFycmF5X3NpemUgPSB0YXMvMjsKKyAgY29tcGxleFQgKmQgPSAoY29t cGxleFQqKSh0ZCk7CisgIGNvbXBsZXhUICplID0gKGNvbXBsZXhUKikodGUpOworICBjb21w bGV4VCAqZiA9IChjb21wbGV4VCopKHRmKTsKKyAgY29tcGxleFQgKmcgPSAoY29tcGxleFQq KSh0Zyk7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgYXJyYXlfc2l6ZTsgaSsrKQorICAgIHsK KyAgICAgIGRbaV0gPSBlW2ldICogZltpXSAtIGdbaV07CisgICAgfQorfQorCitfX2F0dHJp YnV0ZV9fKChvcHRpbWl6ZSgibm8tdHJlZS12ZWN0b3JpemUiKSkpCitib29sIGNtbHNGY2hl Y2soZmxvYXQgKnRkLCBmbG9hdCAqdGUsIGZsb2F0ICp0ZiwgZmxvYXQgKnRnLCBpbnQgdGFz KQoreworICBmb3IgKGludCBpID0gMDsgaSA8IHRhcy8yOyArK2kpCisgICAgeworICAgICAg ZmxvYXQgYSA9IHRlW2kqMl07CisgICAgICBmbG9hdCBiID0gdGVbaSoyKzFdOworICAgICAg ZmxvYXQgYyA9IHRmW2kqMl07CisgICAgICBmbG9hdCBkID0gdGZbaSoyKzFdOworICAgICAg ZmxvYXQgZSA9IHRnW2kqMl07CisgICAgICBmbG9hdCBmID0gdGdbaSoyKzFdOworICAgICAg aWYgKHRkW2kqMl0gIT0gYSpjLWIqZC1lIHx8IHRkW2kqMisxXSAhPSBhKmQrYipjLWYpCisg ICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgIHJldHVybiB0cnVlOworfQorCit2b2lk IGNtbHNEKGRvdWJsZSAqdGQsIGRvdWJsZSAqdGUsIGRvdWJsZSAqdGYsIGRvdWJsZSAqdGcs IGludCB0YXMpCit7CisgIHR5cGVkZWYgX0NvbXBsZXggZG91YmxlIGNvbXBsZXhUOworICBp bnQgYXJyYXlfc2l6ZSA9IHRhcy8yOworICBjb21wbGV4VCAqZCA9IChjb21wbGV4VCopKHRk KTsKKyAgY29tcGxleFQgKmUgPSAoY29tcGxleFQqKSh0ZSk7CisgIGNvbXBsZXhUICpmID0g KGNvbXBsZXhUKikodGYpOworICBjb21wbGV4VCAqZyA9IChjb21wbGV4VCopKHRnKTsKKyAg Zm9yIChpbnQgaSA9IDA7IGkgPCBhcnJheV9zaXplOyBpKyspCisgICAgeworICAgICAgZFtp XSA9IGVbaV0gKiBmW2ldIC0gZ1tpXTsKKyAgICB9Cit9CisKK19fYXR0cmlidXRlX18oKG9w dGltaXplKCJuby10cmVlLXZlY3Rvcml6ZSIpKSkKK2Jvb2wgY21sc0RjaGVjayhkb3VibGUg KnRkLCBkb3VibGUgKnRlLCBkb3VibGUgKnRmLCBkb3VibGUgKnRnLCBpbnQgdGFzKQorewor ICBmb3IgKGludCBpID0gMDsgaSA8IHRhcy8yOyArK2kpCisgICAgeworICAgICAgZG91Ymxl IGEgPSB0ZVtpKjJdOworICAgICAgZG91YmxlIGIgPSB0ZVtpKjIrMV07CisgICAgICBkb3Vi bGUgYyA9IHRmW2kqMl07CisgICAgICBkb3VibGUgZCA9IHRmW2kqMisxXTsKKyAgICAgIGRv dWJsZSBlID0gdGdbaSoyXTsKKyAgICAgIGRvdWJsZSBmID0gdGdbaSoyKzFdOworICAgICAg aWYgKHRkW2kqMl0gIT0gYSpjLWIqZC1lIHx8IHRkW2kqMisxXSAhPSBhKmQrYipjLWYpCisg ICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgIHJldHVybiB0cnVlOworfQorCisKK3R5 cGVkZWYgdm9pZCgqcnVuRikoZmxvYXQgKnRkLCBmbG9hdCAqdGUsIGZsb2F0ICp0ZiwgZmxv YXQgKnRnLCBpbnQgdGFzKTsKK3R5cGVkZWYgdm9pZCgqcnVuRCkoZG91YmxlICp0ZCwgZG91 YmxlICp0ZSwgZG91YmxlICp0ZiwgZG91YmxlICp0ZywgaW50IHRhcyk7Cit0eXBlZGVmIGJv b2woKmNoZWNrRikoZmxvYXQgKnRkLCBmbG9hdCAqdGUsIGZsb2F0ICp0ZiwgZmxvYXQgKnRn LCBpbnQgdGFzKTsKK3R5cGVkZWYgYm9vbCgqY2hlY2tEKShkb3VibGUgKnRkLCBkb3VibGUg KnRlLCBkb3VibGUgKnRmLCBkb3VibGUgKnRnLCBpbnQgdGFzKTsKKwordHlwZWRlZiBzdHJ1 Y3QKK3sKKyAgcnVuRiByRjsKKyAgcnVuRCByRDsKKyAgY2hlY2tGIGNGOworICBjaGVja0Qg Y0Q7Cit9IG9wZXJhdGlvbjsKKworb3BlcmF0aW9uIG9wc1tdID0geworICB7Y211bEYsIGNt dWxELCBjbXVsRmNoZWNrLCBjbXVsRGNoZWNrfSwKKyAge2NtdWxfY29uakYsIGNtdWxfY29u akQsIGNtdWxfY29uakZjaGVjaywgY211bF9jb25qRGNoZWNrfSwKKyAge2FkZHN1YkYsIGFk ZHN1YkQsIGFkZHN1YkZjaGVjaywgYWRkc3ViRGNoZWNrfSwKKyAge2ZtYWRkc3ViRiwgZm1h ZGRzdWJELCBmbWFkZHN1YkZjaGVjaywgZm1hZGRzdWJEY2hlY2t9LAorICB7Zm1zdWJhZGRG LCBmbXN1YmFkZEQsIGZtc3ViYWRkRmNoZWNrLCBmbXN1YmFkZERjaGVja30sCisgIHtjYWRk OTBGLCBjYWRkOTBELCBjYWRkOTBGY2hlY2ssIGNhZGQ5MERjaGVja30sCisgIHtjYWRkMjcw RiwgY2FkZDI3MEQsIGNhZGQyNzBGY2hlY2ssIGNhZGQyNzBEY2hlY2t9LAorICB7Y21sYUYs IGNtbGFELCBjbWxhRmNoZWNrLCBjbWxhRGNoZWNrfSwKKyAge2NtbHNGLCBjbWxzRCwgY21s c0ZjaGVjaywgY21sc0RjaGVja30KK307CisKK3ZvaWQgdGVzdEYob3BlcmF0aW9uKiBvcCkK K3sKKyAgZmxvYXQqIHRkOworICBmbG9hdCogdGU7CisgIGZsb2F0KiB0ZjsKKyAgZmxvYXQq IHRnOworICBpbnQgYXJyYXlfc2l6ZSA9IENPVU5UOworICB0ZCA9IChmbG9hdCopbWFsbG9j KHNpemVvZihmbG9hdCkqYXJyYXlfc2l6ZSk7CisgIHRlID0gKGZsb2F0KiltYWxsb2Moc2l6 ZW9mKGZsb2F0KSphcnJheV9zaXplKTsKKyAgdGYgPSAoZmxvYXQqKW1hbGxvYyhzaXplb2Yo ZmxvYXQpKmFycmF5X3NpemUpOworICB0ZyA9IChmbG9hdCopbWFsbG9jKHNpemVvZihmbG9h dCkqYXJyYXlfc2l6ZSk7CisgIGZsb2F0KiBkZCA9IHRkOworICBmbG9hdCogZWUgPSB0ZTsK KyAgZmxvYXQqIGZmID0gdGY7CisgIGZsb2F0KiBnZyA9IHRnOworICBmb3IgKGludCBpID0g MDsgaSA8IENPVU5UOyArK2kpCisgICAgeworICAgICAgdGVbaV0gPSAoZmxvYXQpKHJhbmQo KSAlIE1BWCk7CisgICAgICB0ZltpXSA9IChmbG9hdCkocmFuZCgpICUgTUFYKTsKKyAgICAg IHRnW2ldID0gKGZsb2F0KShyYW5kKCkgJSBNQVgpOworICAgIH0KKyAgb3AtPnJGKHRkLCB0 ZSwgdGYsIHRnLCBDT1VOVCk7CisgIGlmICghb3AtPmNGKHRkLCB0ZSwgdGYsIHRnLCBDT1VO VCkpCisgICAgYWJvcnQoKTsKK30KKwordm9pZCB0ZXN0RChvcGVyYXRpb24qIG9wKQorewor ICBkb3VibGUqIHRkOworICBkb3VibGUqIHRlOworICBkb3VibGUqIHRmOworICBkb3VibGUq IHRnOworICBpbnQgYXJyYXlfc2l6ZSA9IENPVU5UOworICB0ZCA9IChkb3VibGUqKW1hbGxv YyhzaXplb2YoZG91YmxlKSphcnJheV9zaXplKTsKKyAgdGUgPSAoZG91YmxlKiltYWxsb2Mo c2l6ZW9mKGRvdWJsZSkqYXJyYXlfc2l6ZSk7CisgIHRmID0gKGRvdWJsZSopbWFsbG9jKHNp emVvZihkb3VibGUpKmFycmF5X3NpemUpOworICB0ZyA9IChkb3VibGUqKW1hbGxvYyhzaXpl b2YoZG91YmxlKSphcnJheV9zaXplKTsKKyAgZG91YmxlKiBkZCA9IHRkOworICBkb3VibGUq IGVlID0gdGU7CisgIGRvdWJsZSogZmYgPSB0ZjsKKyAgZG91YmxlKiBnZyA9IHRnOworICBm b3IgKGludCBpID0gMDsgaSA8IENPVU5UOyArK2kpCisgICAgeworICAgICAgdGVbaV0gPSAo ZG91YmxlKShyYW5kKCkgJSBNQVgpOworICAgICAgdGZbaV0gPSAoZG91YmxlKShyYW5kKCkg JSBNQVgpOworICAgICAgdGdbaV0gPSAoZG91YmxlKShyYW5kKCkgJSBNQVgpOworICAgIH0K KyAgb3AtPnJEKHRkLCB0ZSwgdGYsIHRnLCBDT1VOVCk7CisgIGlmICghb3AtPmNEKHRkLCB0 ZSwgdGYsIHRnLCBDT1VOVCkpCisgICAgYWJvcnQoKTsKK30KKworaW50IG1haW4oKQorewor ICAgZm9yIChpbnQgaSA9IDA7IGkgPCA5OyArK2kpCisgICAgeworICAgICAgdGVzdEYoJm9w c1tpXSk7CisgICAgICB0ZXN0RCgmb3BzW2ldKTsKKyAgICB9Cit9CisK --------------jVxQq8DbbaAEqJ8gOWZqTcYN--