From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from esa2.mentor.iphmx.com (esa2.mentor.iphmx.com [68.232.141.98]) by sourceware.org (Postfix) with ESMTPS id 46B3C3858D33 for ; Tue, 28 Feb 2023 23:01:29 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 46B3C3858D33 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,223,1673942400"; d="scan'208,223";a="99858896" Received: from orw-gwy-02-in.mentorg.com ([192.94.38.167]) by esa2.mentor.iphmx.com with ESMTP; 28 Feb 2023 15:01:26 -0800 IronPort-SDR: GOR4QyOhb9nG1umZ7o9qJkQC6D4/544M14F3216cd6f6etKt4lWICJqI64OmqIOmydAuGwTqQu n7MVADz+ZxO0ALU1DIXosiN8eiqBfjKTaTNJnym8HYymPbKP0K/x02h4exyhLy03sfeU+DZzit n9n47i8yorddqdzeJIZLWeqPLQe+c6bWvtVesYF26B+6CztzFIWLUsIS56ACLr3vE7gBJH49vu jYF7hd6hcdVtd79Ta5S72VMLAROXYorSt+jqsm8kUt95UOe8g9pVyBNn24hIHJ+UcugaRnVBEF 5wQ= Content-Type: multipart/mixed; boundary="------------vfzC6fidkej6Iaqjh0y6IvRX" Message-ID: Date: Tue, 28 Feb 2023 23:01:20 +0000 MIME-Version: 1.0 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:102.0) Gecko/20100101 Thunderbird/102.8.0 From: Kwok Cheung Yeung Subject: [PATCH] amdgcn: Enable SIMD vectorization of math functions To: gcc-patches , X-Originating-IP: [137.202.0.90] X-ClientProxiedBy: svr-ies-mbx-13.mgc.mentorg.com (139.181.222.13) To svr-ies-mbx-12.mgc.mentorg.com (139.181.222.12) X-Spam-Status: No, score=-11.8 required=5.0 tests=BAYES_00,GIT_PATCH_0,HEADER_FROM_DIFFERENT_DOMAINS,KAM_DMARC_STATUS,KAM_SHORT,RCVD_IN_MSPIKE_H2,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: --------------vfzC6fidkej6Iaqjh0y6IvRX Content-Type: text/plain; charset="UTF-8"; format=flowed Content-Transfer-Encoding: 7bit Hello This patch implements the TARGET_VECTORIZE_BUILTIN_VECTORIZED_FUNCTION target hook for the AMD GCN architecture, such that when vectorized, calls to builtin standard math functions such as asinf, exp, pow etc. are converted to calls to the recently added vectorized math functions for GCN in Newlib. The -fno-math-errno flag is required in addition to the usual vectorization optimization flags for this to occur, and some of the math functions (the larger double-precision ones) require a large stack size to function properly. This patch requires the GCN vector math functions in Newlib to function - these were included in the recent 4.3.0.20230120 snapshot. As this was a minimum requirement starting from the patch 'amdgcn, libgomp: Manually allocated stacks', this should not be a problem. I have added new testcases in the testsuite that compare the output of the vectorized math functions against the scalar, passing if they are sufficiently close. With the testcase for standalone GCN (without libgomp) in gcc.target/gcn/, there is a problem since gcn-run currently cannot set the stack size correctly in DejaGnu testing, so I have made it a compile test for now - it is still useful to check that calls to the correct functions are being made. The runtime correctness is still covered by the libgomp test. Okay for trunk? Thanks Kwok --------------vfzC6fidkej6Iaqjh0y6IvRX Content-Type: text/plain; charset="UTF-8"; name="0001-amdgcn-Enable-SIMD-vectorization-of-math-functions.patch" Content-Disposition: attachment; filename*0="0001-amdgcn-Enable-SIMD-vectorization-of-math-functions.patc"; filename*1="h" Content-Transfer-Encoding: base64 RnJvbSA2OWQxM2RjODk4ZmY3YzcwZTgwMjk5YTkyZGM4OTVhODlhOWU2NzliIE1vbiBTZXAg MTcgMDA6MDA6MDAgMjAwMQpGcm9tOiBLd29rIENoZXVuZyBZZXVuZyA8a2N5QGNvZGVzb3Vy Y2VyeS5jb20+CkRhdGU6IFR1ZSwgMjggRmViIDIwMjMgMTQ6MTU6NDcgKzAwMDAKU3ViamVj dDogW1BBVENIXSBhbWRnY246IEVuYWJsZSBTSU1EIHZlY3Rvcml6YXRpb24gb2YgbWF0aCBm dW5jdGlvbnMKCkNhbGxzIHRvIHZlY3Rvcml6ZWQgdmVyc2lvbnMgb2Ygcm91dGluZXMgaW4g dGhlIG1hdGggbGlicmFyeSB3aWxsIG5vdwpiZSBpbnNlcnRlZCB3aGVuIHZlY3Rvcml6aW5n IGNvZGUgY29udGFpbmluZyBzdXBwb3J0ZWQgbWF0aCBmdW5jdGlvbnMuCgoyMDIzLTAyLTI4 ICBLd29rIENoZXVuZyBZZXVuZyAgPGtjeUBjb2Rlc291cmNlcnkuY29tPgoJICAgIFBhdWwt QW50b2luZSBBcnJhcyAgPHBhQGNvZGVzb3VyY2VyeS5jb20+CgoJZ2NjLwoJKiBidWlsdGlu cy5jYyAobWF0aGZuX2J1aWx0X2luX2V4cGxpY2l0KTogTmV3LgoJKiBjb25maWcvZ2NuL2dj bi5jYzogSW5jbHVkZSBjYXNlLWNmbi1tYWNyb3MuaC4KCShtYXRoZm5fYnVpbHRfaW5fZXhw bGljaXQpOiBBZGQgcHJvdG90eXBlLgoJKGdjbl92ZWN0b3JpemVfYnVpbHRpbl92ZWN0b3Jp emVkX2Z1bmN0aW9uKTogTmV3LgoJKGdjbl9saWJjX2hhc19mdW5jdGlvbik6IE5ldy4KCShU QVJHRVRfVkVDVE9SSVpFX0JVSUxUSU5fVkVDVE9SSVpFRF9GVU5DVElPTik6IERlZmluZS4K CShUQVJHRVRfTElCQ19IQVNfRlVOQ1RJT04pOiBEZWZpbmUuCgoJZ2NjL3Rlc3RzdWl0ZS8K CSogZ2NjLnRhcmdldC9nY24vc2ltZC1tYXRoLTEuYzogTmV3IHRlc3RjYXNlLgoKCWxpYmdv bXAvCgkqIHRlc3RzdWl0ZS9saWJnb21wLmMvc2ltZC1tYXRoLTEuYzogTmV3IHRlc3RjYXNl LgotLS0KIGdjYy9idWlsdGlucy5jYyAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAg OCArCiBnY2MvY29uZmlnL2djbi9nY24uY2MgICAgICAgICAgICAgICAgICAgICAgfCAxMTAg KysrKysrKysrKysKIGdjYy90ZXN0c3VpdGUvZ2NjLnRhcmdldC9nY24vc2ltZC1tYXRoLTEu YyB8IDIxMCArKysrKysrKysrKysrKysrKysrKwogbGliZ29tcC90ZXN0c3VpdGUvbGliZ29t cC5jL3NpbWQtbWF0aC0xLmMgIHwgMjE3ICsrKysrKysrKysrKysrKysrKysrKwogNCBmaWxl cyBjaGFuZ2VkLCA1NDUgaW5zZXJ0aW9ucygrKQogY3JlYXRlIG1vZGUgMTAwNjQ0IGdjYy90 ZXN0c3VpdGUvZ2NjLnRhcmdldC9nY24vc2ltZC1tYXRoLTEuYwogY3JlYXRlIG1vZGUgMTAw NjQ0IGxpYmdvbXAvdGVzdHN1aXRlL2xpYmdvbXAuYy9zaW1kLW1hdGgtMS5jCgpkaWZmIC0t Z2l0IGEvZ2NjL2J1aWx0aW5zLmNjIGIvZ2NjL2J1aWx0aW5zLmNjCmluZGV4IDRkNDY3Yzhj NWMxLi4zMDVjNjVjMjliZSAxMDA2NDQKLS0tIGEvZ2NjL2J1aWx0aW5zLmNjCisrKyBiL2dj Yy9idWlsdGlucy5jYwpAQCAtMjA4OSw2ICsyMDg5LDE0IEBAIG1hdGhmbl9idWlsdF9pbiAo dHJlZSB0eXBlLCBjb21iaW5lZF9mbiBmbikKICAgcmV0dXJuIG1hdGhmbl9idWlsdF9pbl8x ICh0eXBlLCBmbiwgLyppbXBsaWNpdD0qLyAxKTsKIH0KIAorLyogTGlrZSBtYXRoZm5fYnVp bHRfaW5fMSwgYnV0IGFsd2F5cyB1c2UgdGhlIGV4cGxpY2l0IGFycmF5LiAgKi8KKwordHJl ZQorbWF0aGZuX2J1aWx0X2luX2V4cGxpY2l0ICh0cmVlIHR5cGUsIGNvbWJpbmVkX2ZuIGZu KQoreworICByZXR1cm4gbWF0aGZuX2J1aWx0X2luXzEgKHR5cGUsIGZuLCAvKmltcGxpY2l0 PSovIDApOworfQorCiAvKiBMaWtlIG1hdGhmbl9idWlsdF9pbl8xLCBidXQgdGFrZSBhIGJ1 aWx0X2luX2Z1bmN0aW9uIGFuZAogICAgYWx3YXlzIHVzZSB0aGUgaW1wbGljaXQgYXJyYXku ICAqLwogCmRpZmYgLS1naXQgYS9nY2MvY29uZmlnL2djbi9nY24uY2MgYi9nY2MvY29uZmln L2djbi9nY24uY2MKaW5kZXggMjNhYjAxZTc1ZDguLmQ5OWJiNjNkNGMwIDEwMDY0NAotLS0g YS9nY2MvY29uZmlnL2djbi9nY24uY2MKKysrIGIvZ2NjL2NvbmZpZy9nY24vZ2NuLmNjCkBA IC01Myw2ICs1Myw3IEBACiAjaW5jbHVkZSAiZHdhcmYyLmgiCiAjaW5jbHVkZSAiZ2ltcGxl LmgiCiAjaW5jbHVkZSAiY2dyYXBoLmgiCisjaW5jbHVkZSAiY2FzZS1jZm4tbWFjcm9zLmgi CiAKIC8qIFRoaXMgZmlsZSBzaG91bGQgYmUgaW5jbHVkZWQgbGFzdC4gICovCiAjaW5jbHVk ZSAidGFyZ2V0LWRlZi5oIgpAQCAtNTI0MCw2ICs1MjQxLDExMCBAQCBnY25fc2ltZF9jbG9u ZV91c2FibGUgKHN0cnVjdCBjZ3JhcGhfbm9kZSAqQVJHX1VOVVNFRCAobm9kZSkpCiAgIHJl dHVybiAwOwogfQogCit0cmVlIG1hdGhmbl9idWlsdF9pbl9leHBsaWNpdCAodHJlZSwgY29t YmluZWRfZm4pOworCisvKiBJbXBsZW1lbnQgVEFSR0VUX1ZFQ1RPUklaRV9CVUlMVElOX1ZF Q1RPUklaRURfRlVOQ1RJT04uCisgICBSZXR1cm4gdGhlIGZ1bmN0aW9uIGRlY2xhcmF0aW9u IG9mIHRoZSB2ZWN0b3JpemVkIHZlcnNpb24gb2YgdGhlIGJ1aWx0aW4KKyAgIGluIHRoZSBt YXRoIGxpYnJhcnkgaWYgYXZhaWxhYmxlLiAgKi8KKwordHJlZQorZ2NuX3ZlY3Rvcml6ZV9i dWlsdGluX3ZlY3Rvcml6ZWRfZnVuY3Rpb24gKHVuc2lnbmVkIGludCBmbiwgdHJlZSB0eXBl X291dCwKKwkJCQkJICAgdHJlZSB0eXBlX2luKQoreworICBpZiAoVFJFRV9DT0RFICh0eXBl X291dCkgIT0gVkVDVE9SX1RZUEUKKyAgICAgIHx8IFRSRUVfQ09ERSAodHlwZV9pbikgIT0g VkVDVE9SX1RZUEUpCisgICAgcmV0dXJuIE5VTExfVFJFRTsKKworICBtYWNoaW5lX21vZGUg b3V0X21vZGUgPSBUWVBFX01PREUgKFRSRUVfVFlQRSAodHlwZV9vdXQpKTsKKyAgaW50IG91 dF9uID0gVFlQRV9WRUNUT1JfU1VCUEFSVFMgKHR5cGVfb3V0KTsKKyAgbWFjaGluZV9tb2Rl IGluX21vZGUgPSBUWVBFX01PREUgKFRSRUVfVFlQRSAodHlwZV9pbikpOworICBpbnQgaW5f biA9IFRZUEVfVkVDVE9SX1NVQlBBUlRTICh0eXBlX2luKTsKKyAgY29tYmluZWRfZm4gY2Zu ID0gY29tYmluZWRfZm4gKGZuKTsKKworICAvKiBLZWVwIHRoaXMgY29uc2lzdGVudCB3aXRo IHRoZSBsaXN0IG9mIHZlY3Rvcml6ZWQgbWF0aCByb3V0aW5lcy4gICovCisgIGludCBpbXBs aWNpdF9wOworICBzd2l0Y2ggKGZuKQorICAgIHsKKyAgICBDQVNFX0NGTl9BQ09TOgorICAg IENBU0VfQ0ZOX0FDT1NIOgorICAgIENBU0VfQ0ZOX0FTSU46CisgICAgQ0FTRV9DRk5fQVNJ Tkg6CisgICAgQ0FTRV9DRk5fQVRBTjoKKyAgICBDQVNFX0NGTl9BVEFOMjoKKyAgICBDQVNF X0NGTl9BVEFOSDoKKyAgICBDQVNFX0NGTl9DT1BZU0lHTjoKKyAgICBDQVNFX0NGTl9DT1M6 CisgICAgQ0FTRV9DRk5fQ09TSDoKKyAgICBDQVNFX0NGTl9FUkY6CisgICAgQ0FTRV9DRk5f RVhQOgorICAgIENBU0VfQ0ZOX0VYUDI6CisgICAgQ0FTRV9DRk5fRklOSVRFOgorICAgIENB U0VfQ0ZOX0ZNT0Q6CisgICAgQ0FTRV9DRk5fR0FNTUE6CisgICAgQ0FTRV9DRk5fSFlQT1Q6 CisgICAgQ0FTRV9DRk5fSVNOQU46CisgICAgQ0FTRV9DRk5fTEdBTU1BOgorICAgIENBU0Vf Q0ZOX0xPRzoKKyAgICBDQVNFX0NGTl9MT0cxMDoKKyAgICBDQVNFX0NGTl9MT0cyOgorICAg IENBU0VfQ0ZOX1BPVzoKKyAgICBDQVNFX0NGTl9SRU1BSU5ERVI6CisgICAgQ0FTRV9DRk5f UklOVDoKKyAgICBDQVNFX0NGTl9TSU46CisgICAgQ0FTRV9DRk5fU0lOSDoKKyAgICBDQVNF X0NGTl9TUVJUOgorICAgIENBU0VfQ0ZOX1RBTjoKKyAgICBDQVNFX0NGTl9UQU5IOgorICAg IENBU0VfQ0ZOX1RHQU1NQToKKyAgICAgIGltcGxpY2l0X3AgPSAxOworICAgICAgYnJlYWs7 CisKKyAgICBDQVNFX0NGTl9TQ0FMQjoKKyAgICBDQVNFX0NGTl9TSUdOSUZJQ0FORDoKKyAg ICAgIGltcGxpY2l0X3AgPSAwOworICAgICAgYnJlYWs7CisKKyAgICBkZWZhdWx0OgorICAg ICAgcmV0dXJuIE5VTExfVFJFRTsKKyAgICB9CisKKyAgdHJlZSBvdXRfdF9ub2RlID0gKG91 dF9tb2RlID09IERGbW9kZSkgPyBkb3VibGVfdHlwZV9ub2RlIDogZmxvYXRfdHlwZV9ub2Rl OworICB0cmVlIGZuZGVjbCA9IGltcGxpY2l0X3AgPyBtYXRoZm5fYnVpbHRfaW4gKG91dF90 X25vZGUsIGNmbikKKwkJCSAgIDogbWF0aGZuX2J1aWx0X2luX2V4cGxpY2l0IChvdXRfdF9u b2RlLCBjZm4pOworCisgIGNvbnN0IGNoYXIgKmJuYW1lID0gSURFTlRJRklFUl9QT0lOVEVS IChERUNMX05BTUUgKGZuZGVjbCkpOworICBjaGFyIG5hbWVbMjBdOworICBzcHJpbnRmIChu YW1lLCBvdXRfbW9kZSA9PSBERm1vZGUgPyAidiVkZGZfJXMiIDogInYlZHNmXyVzIiwKKwkg ICBvdXRfbiwgYm5hbWUgKyAxMCk7CisKKyAgdW5zaWduZWQgYXJpdHkgPSAwOworICBmb3Ig KHRyZWUgYXJncyA9IERFQ0xfQVJHVU1FTlRTIChmbmRlY2wpOyBhcmdzOyBhcmdzID0gVFJF RV9DSEFJTiAoYXJncykpCisgICAgYXJpdHkrKzsKKworICB0cmVlIGZudHlwZSA9IChhcml0 eSA9PSAxKQorCQk/IGJ1aWxkX2Z1bmN0aW9uX3R5cGVfbGlzdCAodHlwZV9vdXQsIHR5cGVf aW4sIE5VTEwpCisJCTogYnVpbGRfZnVuY3Rpb25fdHlwZV9saXN0ICh0eXBlX291dCwgdHlw ZV9pbiwgdHlwZV9pbiwgTlVMTCk7CisKKyAgLyogQnVpbGQgYSBmdW5jdGlvbiBkZWNsYXJh dGlvbiBmb3IgdGhlIHZlY3Rvcml6ZWQgZnVuY3Rpb24uICAqLworICB0cmVlIG5ld19mbmRl Y2wgPSBidWlsZF9kZWNsIChCVUlMVElOU19MT0NBVElPTiwKKwkJCQlGVU5DVElPTl9ERUNM LCBnZXRfaWRlbnRpZmllciAobmFtZSksIGZudHlwZSk7CisgIFRSRUVfUFVCTElDIChuZXdf Zm5kZWNsKSA9IDE7CisgIERFQ0xfRVhURVJOQUwgKG5ld19mbmRlY2wpID0gMTsKKyAgREVD TF9JU19OT1ZPUFMgKG5ld19mbmRlY2wpID0gMTsKKyAgVFJFRV9SRUFET05MWSAobmV3X2Zu ZGVjbCkgPSAxOworCisgIHJldHVybiBuZXdfZm5kZWNsOworfQorCisvKiBJbXBsZW1lbnQg VEFSR0VUX0xJQkNfSEFTX0ZVTkNUSU9OLiAgKi8KKworYm9vbAorZ2NuX2xpYmNfaGFzX2Z1 bmN0aW9uIChlbnVtIGZ1bmN0aW9uX2NsYXNzIGZuX2NsYXNzLAorCQkgICAgICAgdHJlZSB0 eXBlKQoreworICByZXR1cm4gYnNkX2xpYmNfaGFzX2Z1bmN0aW9uIChmbl9jbGFzcywgdHlw ZSk7Cit9CisKIC8qIH19fSAgKi8KIC8qIHt7eyBtZF9yZW9yZyBwYXNzLiAgKi8KIApAQCAt NzMyNCw2ICs3NDI5LDExIEBAIGdjbl9kd2FyZl9yZWdpc3Rlcl9zcGFuIChydHggcnRsKQog ICBnY25fc2ltZF9jbG9uZV9jb21wdXRlX3ZlY3NpemVfYW5kX3NpbWRsZW4KICN1bmRlZiAg VEFSR0VUX1NJTURfQ0xPTkVfVVNBQkxFCiAjZGVmaW5lIFRBUkdFVF9TSU1EX0NMT05FX1VT QUJMRSBnY25fc2ltZF9jbG9uZV91c2FibGUKKyN1bmRlZiBUQVJHRVRfVkVDVE9SSVpFX0JV SUxUSU5fVkVDVE9SSVpFRF9GVU5DVElPTgorI2RlZmluZSBUQVJHRVRfVkVDVE9SSVpFX0JV SUxUSU5fVkVDVE9SSVpFRF9GVU5DVElPTiBcCisgIGdjbl92ZWN0b3JpemVfYnVpbHRpbl92 ZWN0b3JpemVkX2Z1bmN0aW9uCisjdW5kZWYgVEFSR0VUX0xJQkNfSEFTX0ZVTkNUSU9OCisj ZGVmaW5lIFRBUkdFVF9MSUJDX0hBU19GVU5DVElPTiBnY25fbGliY19oYXNfZnVuY3Rpb24K ICN1bmRlZiAgVEFSR0VUX1NNQUxMX1JFR0lTVEVSX0NMQVNTRVNfRk9SX01PREVfUAogI2Rl ZmluZSBUQVJHRVRfU01BTExfUkVHSVNURVJfQ0xBU1NFU19GT1JfTU9ERV9QIFwKICAgZ2Nu X3NtYWxsX3JlZ2lzdGVyX2NsYXNzZXNfZm9yX21vZGVfcApkaWZmIC0tZ2l0IGEvZ2NjL3Rl c3RzdWl0ZS9nY2MudGFyZ2V0L2djbi9zaW1kLW1hdGgtMS5jIGIvZ2NjL3Rlc3RzdWl0ZS9n Y2MudGFyZ2V0L2djbi9zaW1kLW1hdGgtMS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4 IDAwMDAwMDAwMDAwLi41NGU4NzYxZjcyMAotLS0gL2Rldi9udWxsCisrKyBiL2djYy90ZXN0 c3VpdGUvZ2NjLnRhcmdldC9nY24vc2ltZC1tYXRoLTEuYwpAQCAtMCwwICsxLDIxMCBAQAor LyogQ2hlY2sgdGhhdCB0aGUgU0lNRCB2ZXJzaW9ucyBvZiBtYXRoIHJvdXRpbmVzIGdpdmUg dGhlIHNhbWUgKG9yCisgICBzdWZmaWNpZW50bHkgY2xvc2UpIHJlc3VsdHMgYXMgdGhlaXIg c2NhbGFyIGVxdWl2YWxlbnRzLCBhbmQgdGhhdCB0aGUKKyAgIGNhbGxzIHRvIHRoZSB2ZWN0 b3JpemVkIG1hdGggZnVuY3Rpb25zIGFyZSBhY3R1YWxseSBlbWl0dGVkLiAgKi8KKworLyog SWRlYWxseSB0aGlzIHRlc3Qgc2hvdWxkIGJlIHJ1biwgYnV0IHRoZSBtYXRoIHJvdXRpbmVz IHJlcXVpcmUgYSBsYXJnZQorICAgc3RhY2sgYW5kIGdjbi1ydW4gY3VycmVudGx5IGRvZXMg bm90IHJlc3BlY3QgdGhlIHN0YWNrLXNpemUgcGFyYW1ldGVyLiAgKi8KKy8qIHsgZGctZG8g Y29tcGlsZSB9ICovCisvKiB7IGRnLW9wdGlvbnMgIi1PMiAtZnRyZWUtdmVjdG9yaXplIC1m bm8tbWF0aC1lcnJubyAtbXN0YWNrLXNpemU9MzAwMDAwMCAtZmR1bXAtdHJlZS12ZWN0IiB9 ICovCisKKworI3VuZGVmIFBSSU5UX1JFU1VMVAorI2RlZmluZSBWRVJCT1NFIDAKKyNkZWZp bmUgRUFSTFlfRVhJVCAxCisKKyNpbmNsdWRlIDxtYXRoLmg+CisjaW5jbHVkZSA8c3RkbGli Lmg+CisKKyNpZmRlZiBQUklOVF9SRVNVTFQKKyAgI2luY2x1ZGUgPHN0ZGlvLmg+CisgICNk ZWZpbmUgUFJJTlRGIHByaW50ZgorI2Vsc2UKKyAgc3RhdGljIHZvaWQgbnVsbF9wcmludGYg KGNvbnN0IGNoYXIgKmYsIC4uLikgeyB9CisKKyAgI2RlZmluZSBQUklOVEYgbnVsbF9wcmlu dGYKKyNlbmRpZgorCisjZGVmaW5lIE4gNTEyCisjZGVmaW5lIEVQU0lMT05fZmxvYXQgMWUt NQorI2RlZmluZSBFUFNJTE9OX2RvdWJsZSAxZS0xMAorCitzdGF0aWMgaW50IGZhaWxlZCA9 IDA7CisKK2ludCBkZXZpYXRpb25fZmxvYXQgKGZsb2F0IHgsIGZsb2F0IHkpCit7CisgIHVu aW9uIHsKKyAgICBmbG9hdCBmOworICAgIHVuc2lnbmVkIHU7CisgIH0gdSwgdjsKKworICB1 LmYgPSB4OworICB2LmYgPSB5OworCisgIHVuc2lnbmVkIG1hc2sgPSAweDgwMDAwMDAwVTsg CisgIGludCBpOworCisgIGZvciAoaSA9IDMyOyBpID4gMDsgaS0tKQorICAgIGlmICgodS51 IF4gdi51KSAmIG1hc2spCisgICAgICBicmVhazsKKyAgICBlbHNlCisgICAgICBtYXNrID4+ PSAxOworCisgIHJldHVybiBpOworfQorCitpbnQgZGV2aWF0aW9uX2RvdWJsZSAoZG91Ymxl IHgsIGRvdWJsZSB5KQoreworICB1bmlvbiB7CisgICAgZG91YmxlIGQ7CisgICAgdW5zaWdu ZWQgbG9uZyBsb25nIHU7CisgIH0gdSwgdjsKKworICB1LmQgPSB4OworICB2LmQgPSB5Owor CisgIHVuc2lnbmVkIGxvbmcgbG9uZyBtYXNrID0gMHg4MDAwMDAwMDAwMDAwMDAwVUxMOwor ICBpbnQgaTsKKworICBmb3IgKGkgPSA2NDsgaSA+IDA7IGktLSkKKyAgICBpZiAoKHUudSBe IHYudSkgJiBtYXNrKQorICAgICAgYnJlYWs7CisgICAgZWxzZQorICAgICAgbWFzayA+Pj0g MTsKKworICByZXR1cm4gaTsKK30KKworI2RlZmluZSBURVNUX0ZVTihURkxPQVQsIExPVywg SElHSCwgRlVOKSBcCitfX2F0dHJpYnV0ZV9fKChvcHRpbWl6ZSgibm8tdHJlZS12ZWN0b3Jp emUiKSkpIFwKK19fYXR0cmlidXRlX18oKG9wdGltaXplKCJuby11bnNhZmUtbWF0aC1vcHRp bWl6YXRpb25zIikpKSBcCit2b2lkIGNoZWNrXyMjRlVOIChURkxPQVQgcmVzW05dLCBURkxP QVQgYVtOXSkgXAoreyBcCisgIGludCBmYWlsZWQgPSAwOyBcCisgIGZvciAoaW50IGkgPSAw OyBpIDwgTjsgaSsrKSB7IFwKKyAgICBURkxPQVQgZXhwZWN0ZWQgPSBGVU4gKGFbaV0pOyBc CisgICAgVEZMT0FUIGRpZmYgPSBfX2J1aWx0aW5fZmFicyAoZXhwZWN0ZWQgLSByZXNbaV0p OyBcCisgICAgaW50IGRldmlhdGlvbiA9IGRldmlhdGlvbl8jI1RGTE9BVCAoZXhwZWN0ZWQs IHJlc1tpXSk7IFwKKyAgICBpbnQgZmFpbCA9IGlzbmFuIChyZXNbaV0pICE9IGlzbmFuIChl eHBlY3RlZCkgXAorICAgICAgICAgICAgICAgfHwgaXNpbmYgKHJlc1tpXSkgIT0gaXNpbmYg KGV4cGVjdGVkKSBcCisgICAgICAgICAgICAgICB8fCAoZGlmZiA+IEVQU0lMT05fIyNURkxP QVQgJiYgZGV2aWF0aW9uID4gMTApOyBcCisgICAgZmFpbGVkIHw9IGZhaWw7IFwKKyAgICBp ZiAoVkVSQk9TRSB8fCBmYWlsKSBcCisgICAgICBQUklOVEYgKCNGVU4gIiglZikgPSAlZiwg ZXhwZWN0ZWQgPSAlZiwgZGlmZiA9ICVmLCBkZXZpYXRpb24gPSAlZCAlc1xuIiwgXAorICAg ICAgICAgICAgICBhW2ldLCByZXNbaV0sIGV4cGVjdGVkLCBkaWZmLCBkZXZpYXRpb24sIGZh aWwgPyAiKCEpIiA6ICIiKTsgXAorICAgIGlmIChFQVJMWV9FWElUICYmIGZhaWwpIFwKKyAg ICAgIGV4aXQgKDEpOyBcCisgIH0gXAorfSBcCit2b2lkIHRlc3RfIyNGVU4gKHZvaWQpIFwK K3sgXAorICBURkxPQVQgcmVzW05dLCBhW05dOyBcCisgIGZvciAoaW50IGkgPSAwOyBpIDwg TjsgaSsrKSBcCisgICAgYVtpXSA9IExPVyArICgoSElHSCAtIExPVykgLyBOKSAqIGk7IFwK KyAgZm9yIChpbnQgaSA9IDA7IGkgPCBOOyBpKyspIFwKKyAgICByZXNbaV0gPSBGVU4gKGFb aV0pOyBcCisgIGNoZWNrXyMjRlVOIChyZXMsIGEpOyBcCit9XAordGVzdF8jI0ZVTiAoKTsK KworI2RlZmluZSBURVNUX0ZVTjIoVEZMT0FULCBMT1cxLCBISUdIMSwgTE9XMiwgSElHSDIs IEZVTikgXAorX19hdHRyaWJ1dGVfXygob3B0aW1pemUoIm5vLXRyZWUtdmVjdG9yaXplIikp KSBcCitfX2F0dHJpYnV0ZV9fKChvcHRpbWl6ZSgibm8tdW5zYWZlLW1hdGgtb3B0aW1pemF0 aW9ucyIpKSkgXAordm9pZCBjaGVja18jI0ZVTiAoVEZMT0FUIHJlc1tOXSwgVEZMT0FUIGFb Tl0sIFRGTE9BVCBiW05dKSBcCit7IFwKKyAgaW50IGZhaWxlZCA9IDA7IFwKKyAgZm9yIChp bnQgaSA9IDA7IGkgPCBOOyBpKyspIHsgXAorICAgIFRGTE9BVCBleHBlY3RlZCA9IEZVTiAo YVtpXSwgYltpXSk7IFwKKyAgICBURkxPQVQgZGlmZiA9IF9fYnVpbHRpbl9mYWJzIChleHBl Y3RlZCAtIHJlc1tpXSk7IFwKKyAgICBpbnQgZGV2aWF0aW9uID0gZGV2aWF0aW9uXyMjVEZM T0FUIChleHBlY3RlZCwgcmVzW2ldKTsgXAorICAgIGludCBmYWlsID0gaXNuYW4gKHJlc1tp XSkgIT0gaXNuYW4gKGV4cGVjdGVkKSBcCisgICAgICAgICAgICAgICB8fCBpc2luZiAocmVz W2ldKSAhPSBpc2luZiAoZXhwZWN0ZWQpIFwKKyAgICAgICAgICAgICAgIHx8IChkaWZmID4g RVBTSUxPTl8jI1RGTE9BVCAmJiBkZXZpYXRpb24gPiAxMCk7IFwKKyAgICBmYWlsZWQgfD0g ZmFpbDsgXAorICAgIGlmIChWRVJCT1NFIHx8IGZhaWwpIFwKKyAgICAgIFBSSU5URiAoI0ZV TiAiKCVmLCVmKSA9ICVmLCBleHBlY3RlZCA9ICVmLCBkaWZmID0gJWYsIGRldmlhdGlvbiA9 ICVkICVzXG4iLCBcCisgICAgICAgICAgICAgIGFbaV0sIGJbaV0sIHJlc1tpXSwgZXhwZWN0 ZWQsIGRpZmYsIGRldmlhdGlvbiwgZmFpbCA/ICIoISkiIDogIiIpOyBcCisgICAgaWYgKEVB UkxZX0VYSVQgJiYgZmFpbCkgXAorICAgICAgZXhpdCAoMSk7IFwKKyAgfSBcCit9IFwKK3Zv aWQgdGVzdF8jI0ZVTiAodm9pZCkgXAoreyBcCisgIFRGTE9BVCByZXNbTl0sIGFbTl0sIGJb Tl07IFwKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBOOyBpKyspIHsgXAorICAgIGFbaV0gPSBM T1cxICsgKChISUdIMSAtIExPVzEpIC8gTikgKiBpOyBcCisgICAgYltpXSA9IExPVzIgKyAo KEhJR0gyIC0gTE9XMikgLyBOKSAqIGk7IFwKKyAgfSBcCisgIGZvciAoaW50IGkgPSAwOyBp IDwgTjsgaSsrKSBcCisgICAgcmVzW2ldID0gRlVOIChhW2ldLCBiW2ldKTsgXAorICBjaGVj a18jI0ZVTiAocmVzLCBhLCBiKTsgXAorfVwKK3Rlc3RfIyNGVU4gKCk7CisKK2ludCBtYWlu ICh2b2lkKQoreworICBURVNUX0ZVTiAoZmxvYXQsIC0xLjEsIDEuMSwgYWNvc2YpOyAvKiB7 IGRnLWZpbmFsIHsgc2Nhbi10cmVlLWR1bXAgInY2NHNmX2Fjb3NmIiAidmVjdCIgfSB9Ki8K KyAgVEVTVF9GVU4gKGZsb2F0LCAtMTAsIDEwLCBhY29zaGYpOyAvKiB7IGRnLWZpbmFsIHsg c2Nhbi10cmVlLWR1bXAgInY2NHNmX2Fjb3NoZiIgInZlY3QiIH0gfSovCisgIFRFU1RfRlVO IChmbG9hdCwgLTEuMSwgMS4xLCBhc2luZik7IC8qIHsgZGctZmluYWwgeyBzY2FuLXRyZWUt ZHVtcCAidjY0c2ZfYXNpbmYiICJ2ZWN0IiB9IH0qLworICBURVNUX0ZVTiAoZmxvYXQsIC0x MCwgMTAsIGFzaW5oZik7IC8qIHsgZGctZmluYWwgeyBzY2FuLXRyZWUtZHVtcCAidjY0c2Zf YXNpbmhmIiAidmVjdCIgfSB9Ki8KKyAgVEVTVF9GVU4gKGZsb2F0LCAtMS4xLCAxLjEsIGF0 YW5mKTsgLyogeyBkZy1maW5hbCB7IHNjYW4tdHJlZS1kdW1wICJ2NjRzZl9hdGFuZiIgInZl Y3QiIH0gfSovCisgIFRFU1RfRlVOMiAoZmxvYXQsIC0yLjAsIDIuMCwgMi4wLCAtMi4wLCBh dGFuMmYpOyAvKiB7IGRnLWZpbmFsIHsgc2Nhbi10cmVlLWR1bXAgInY2NHNmX2F0YW4yZiIg InZlY3QiIH0gfSovCisgIFRFU1RfRlVOIChmbG9hdCwgLTIuMCwgMi4wLCBhdGFuaGYpOyAv KiB7IGRnLWZpbmFsIHsgc2Nhbi10cmVlLWR1bXAgInY2NHNmX2F0YW5oZiIgInZlY3QiIH0g fSovCisgIFRFU1RfRlVOMiAoZmxvYXQsIC0xMC4wLCAxMC4wLCA1LjAsIC0xNS4wLCBjb3B5 c2lnbmYpOyAvKiB7IGRnLWZpbmFsIHsgc2Nhbi10cmVlLWR1bXAgInY2NHNmX2NvcHlzaWdu ZiIgInZlY3QiIH0gfSovCisgIFRFU1RfRlVOIChmbG9hdCwgLTMuMTQxNTkyNjUzNTksIDMu MTQxNTkyNjUzNTksIGNvc2YpOyAvKiB7IGRnLWZpbmFsIHsgc2Nhbi10cmVlLWR1bXAgInY2 NHNmX2Nvc2YiICJ2ZWN0IiB9IH0qLworICBURVNUX0ZVTiAoZmxvYXQsIC0zLjE0MTU5MjY1 MzU5LCAzLjE0MTU5MjY1MzU5LCBjb3NoZik7IC8qIHsgZGctZmluYWwgeyBzY2FuLXRyZWUt ZHVtcCAidjY0c2ZfY29zaGYiICJ2ZWN0IiB9IH0qLworICBURVNUX0ZVTiAoZmxvYXQsIC0x MC4wLCAxMC4wLCBlcmZmKTsgIC8qIHsgZGctZmluYWwgeyBzY2FuLXRyZWUtZHVtcCAidjY0 c2ZfZXJmZiIgInZlY3QiIH0gfSovCisgIFRFU1RfRlVOIChmbG9hdCwgLTEwLjAsIDEwLjAs IGV4cGYpOyAvKiB7IGRnLWZpbmFsIHsgc2Nhbi10cmVlLWR1bXAgInY2NHNmX2V4cGYiICJ2 ZWN0IiB9IH0qLworICBURVNUX0ZVTiAoZmxvYXQsIC0xMC4wLCAxMC4wLCBleHAyZik7IC8q IHsgZGctZmluYWwgeyBzY2FuLXRyZWUtZHVtcCAidjY0c2ZfZXhwMmYiICJ2ZWN0IiB9IH0q LworICBURVNUX0ZVTjIgKGZsb2F0LCAtMTAuMCwgMTAuMCwgMTAwLjAsIC0yNS4wLCBmbW9k Zik7IC8qIHsgZGctZmluYWwgeyBzY2FuLXRyZWUtZHVtcCAidjY0c2ZfZm1vZGYiICJ2ZWN0 IiB9IH0qLworICBURVNUX0ZVTiAoZmxvYXQsIC0xMC4wLCAxMC4wLCBnYW1tYWYpOyAvKiB7 IGRnLWZpbmFsIHsgc2Nhbi10cmVlLWR1bXAgInY2NHNmX2dhbW1hZiIgInZlY3QiIHsgeGZh aWwgKi0qLSp9IH0gfSovCisgIFRFU1RfRlVOMiAoZmxvYXQsIC0xMC4wLCAxMC4wLCAxNS4w LCAtNS4wLGh5cG90Zik7IC8qIHsgZGctZmluYWwgeyBzY2FuLXRyZWUtZHVtcCAidjY0c2Zf aHlwb3RmIiAidmVjdCIgfSB9Ki8KKyAgVEVTVF9GVU4gKGZsb2F0LCAtMTAuMCwgMTAuMCwg bGdhbW1hZik7IC8qIHsgZGctZmluYWwgeyBzY2FuLXRyZWUtZHVtcCAidjY0c2ZfbGdhbW1h ZiIgInZlY3QiIHsgeGZhaWwgKi0qLSp9IH0gfSovCisgIFRFU1RfRlVOIChmbG9hdCwgLTEu MCwgNTAuMCwgbG9nZik7IC8qIHsgZGctZmluYWwgeyBzY2FuLXRyZWUtZHVtcCAidjY0c2Zf bG9nZiIgInZlY3QiIH0gfSovCisgIFRFU1RfRlVOIChmbG9hdCwgLTEuMCwgNTAwLjAsIGxv ZzEwZik7IC8qIHsgZGctZmluYWwgeyBzY2FuLXRyZWUtZHVtcCAidjY0c2ZfbG9nMTBmIiAi dmVjdCIgfSB9Ki8KKyAgVEVTVF9GVU4gKGZsb2F0LCAtMS4wLCA2NC4wLCBsb2cyZik7IC8q IHsgZGctZmluYWwgeyBzY2FuLXRyZWUtZHVtcCAidjY0c2ZfbG9nMmYiICJ2ZWN0IiB9IH0q LworICBURVNUX0ZVTjIgKGZsb2F0LCAtMTAwLjAsIDEwMC4wLCAxMDAuMCwgLTEwMC4wLCBw b3dmKTsgLyogeyBkZy1maW5hbCB7IHNjYW4tdHJlZS1kdW1wICJ2NjRzZl9wb3dmIiAidmVj dCIgfSB9Ki8KKyAgVEVTVF9GVU4yIChmbG9hdCwgLTUwLjAsIDEwMC4wLCAtMi4wLCA0MC4w LCByZW1haW5kZXJmKTsgLyogeyBkZy1maW5hbCB7IHNjYW4tdHJlZS1kdW1wICJ2NjRzZl9y ZW1haW5kZXJmIiAidmVjdCIgfSB9Ki8KKyAgVEVTVF9GVU4gKGZsb2F0LCAtNTAuMCwgNTAu MCwgcmludGYpOyAgLyogeyBkZy1maW5hbCB7IHNjYW4tdHJlZS1kdW1wICJ2NjRzZl9yaW50 ZiIgInZlY3QiIH0gfSovCisgIFRFU1RfRlVOMiAoZmxvYXQsIC01MC4wLCA1MC4wLCAtMTAu MCwgMzIuMCwgX19idWlsdGluX3NjYWxiZik7IC8qIHsgZGctZmluYWwgeyBzY2FuLXRyZWUt ZHVtcCAidjY0c2Zfc2NhbGJmIiAidmVjdCIgfSB9Ki8KKyAgVEVTVF9GVU4gKGZsb2F0LCAt MTAuMCwgMTAuMCwgX19idWlsdGluX3NpZ25pZmljYW5kZik7IC8qIHsgZGctZmluYWwgeyBz Y2FuLXRyZWUtZHVtcCAidjY0c2Zfc2lnbmlmaWNhbmRmIiAidmVjdCIgfSB9Ki8KKyAgVEVT VF9GVU4gKGZsb2F0LCAtMy4xNDE1OTI2NTM1OSwgMy4xNDE1OTI2NTM1OSwgc2luZik7IC8q IHsgZGctZmluYWwgeyBzY2FuLXRyZWUtZHVtcCAidjY0c2Zfc2luZiIgInZlY3QiIH0gfSov CisgIFRFU1RfRlVOIChmbG9hdCwgLTMuMTQxNTkyNjUzNTksIDMuMTQxNTkyNjUzNTksIHNp bmhmKTsgLyogeyBkZy1maW5hbCB7IHNjYW4tdHJlZS1kdW1wICJ2NjRzZl9zaW5oZiIgInZl Y3QiIH0gfSovCisgIFRFU1RfRlVOIChmbG9hdCwgLTAuMSwgMTAwMDAuMCwgc3FydGYpOyAv KiB7IGRnLWZpbmFsIHsgc2Nhbi10cmVlLWR1bXAgInY2NHNmX3NxcnRmIiAidmVjdCIgfSB9 Ki8KKyAgVEVTVF9GVU4gKGZsb2F0LCAtNS4wLCA1LjAsIHRhbmYpOyAvKiB7IGRnLWZpbmFs IHsgc2Nhbi10cmVlLWR1bXAgInY2NHNmX3RhbmYiICJ2ZWN0IiB9IH0qLworICBURVNUX0ZV TiAoZmxvYXQsIC0zLjE0MTU5MjY1MzU5LCAzLjE0MTU5MjY1MzU5LCB0YW5oZik7IC8qIHsg ZGctZmluYWwgeyBzY2FuLXRyZWUtZHVtcCAidjY0c2ZfdGFuaGYiICJ2ZWN0IiB9IH0qLwor ICBURVNUX0ZVTiAoZmxvYXQsIC0xMC4wLCAxMC4wLCB0Z2FtbWFmKTsgLyogeyBkZy1maW5h bCB7IHNjYW4tdHJlZS1kdW1wICJ2NjRzZl90Z2FtbWFmIiAidmVjdCIgfSB9Ki8KKworICBU RVNUX0ZVTiAoZG91YmxlLCAtMS4xLCAxLjEsIGFjb3MpOyAvKiB7IGRnLWZpbmFsIHsgc2Nh bi10cmVlLWR1bXAgInY2NGRmX2Fjb3MiICJ2ZWN0IiB9IH0qLworICBURVNUX0ZVTiAoZG91 YmxlLCAtMTAsIDEwLCBhY29zaCk7IC8qIHsgZGctZmluYWwgeyBzY2FuLXRyZWUtZHVtcCAi djY0ZGZfYWNvc2giICJ2ZWN0IiB9IH0qLworICBURVNUX0ZVTiAoZG91YmxlLCAtMS4xLCAx LjEsIGFzaW4pOyAvKiB7IGRnLWZpbmFsIHsgc2Nhbi10cmVlLWR1bXAgInY2NGRmX2FzaW4i ICJ2ZWN0IiB9IH0qLworICBURVNUX0ZVTiAoZG91YmxlLCAtMTAsIDEwLCBhc2luaCk7IC8q IHsgZGctZmluYWwgeyBzY2FuLXRyZWUtZHVtcCAidjY0ZGZfYXNpbmgiICJ2ZWN0IiB9IH0q LworICBURVNUX0ZVTiAoZG91YmxlLCAtMS4xLCAxLjEsIGF0YW4pOyAvKiB7IGRnLWZpbmFs IHsgc2Nhbi10cmVlLWR1bXAgInY2NGRmX2F0YW4iICJ2ZWN0IiB9IH0qLworICBURVNUX0ZV TjIgKGRvdWJsZSwgLTIuMCwgMi4wLCAyLjAsIC0yLjAsIGF0YW4yKTsgLyogeyBkZy1maW5h bCB7IHNjYW4tdHJlZS1kdW1wICJ2NjRkZl9hdGFuMiIgInZlY3QiIH0gfSovCisgIFRFU1Rf RlVOIChkb3VibGUsIC0yLjAsIDIuMCwgYXRhbmgpOyAvKiB7IGRnLWZpbmFsIHsgc2Nhbi10 cmVlLWR1bXAgInY2NGRmX2F0YW5oIiAidmVjdCIgfSB9Ki8KKyAgVEVTVF9GVU4yIChkb3Vi bGUsIC0xMC4wLCAxMC4wLCA1LjAsIC0xNS4wLCBjb3B5c2lnbik7IC8qIHsgZGctZmluYWwg eyBzY2FuLXRyZWUtZHVtcCAidjY0ZGZfY29weXNpZ24iICJ2ZWN0IiB9IH0qLworICBURVNU X0ZVTiAoZG91YmxlLCAtMy4xNDE1OTI2NTM1OSwgMy4xNDE1OTI2NTM1OSwgY29zKTsgLyog eyBkZy1maW5hbCB7IHNjYW4tdHJlZS1kdW1wICJ2NjRkZl9jb3MiICJ2ZWN0IiB9IH0qLwor ICBURVNUX0ZVTiAoZG91YmxlLCAtMy4xNDE1OTI2NTM1OSwgMy4xNDE1OTI2NTM1OSwgY29z aCk7IC8qIHsgZGctZmluYWwgeyBzY2FuLXRyZWUtZHVtcCAidjY0ZGZfY29zaCIgInZlY3Qi IH0gfSovCisgIFRFU1RfRlVOIChkb3VibGUsIC0xMC4wLCAxMC4wLCBlcmYpOyAvKiB7IGRn LWZpbmFsIHsgc2Nhbi10cmVlLWR1bXAgInY2NGRmX2VyZiIgInZlY3QiIH0gfSovCisgIFRF U1RfRlVOIChkb3VibGUsIC0xMC4wLCAxMC4wLCBleHApOyAvKiB7IGRnLWZpbmFsIHsgc2Nh bi10cmVlLWR1bXAgInY2NGRmX2V4cCIgInZlY3QiIH0gfSovCisgIFRFU1RfRlVOIChkb3Vi bGUsIC0xMC4wLCAxMC4wLCBleHAyKTsgLyogeyBkZy1maW5hbCB7IHNjYW4tdHJlZS1kdW1w ICJ2NjRkZl9leHAyIiAidmVjdCIgfSB9Ki8KKyAgVEVTVF9GVU4yIChkb3VibGUsIC0xMC4w LCAxMC4wLCAxMDAuMCwgLTI1LjAsIGZtb2QpOyAvKiB7IGRnLWZpbmFsIHsgc2Nhbi10cmVl LWR1bXAgInY2NGRmX2Ztb2QiICJ2ZWN0IiB9IH0qLworICBURVNUX0ZVTiAoZG91YmxlLCAt MTAuMCwgMTAuMCwgZ2FtbWEpOyAvKiB7IGRnLWZpbmFsIHsgc2Nhbi10cmVlLWR1bXAgInY2 NGRmX2dhbW1hIiAidmVjdCIgeyB4ZmFpbCAqLSotKn0gfSB9Ki8KKyAgVEVTVF9GVU4yIChk b3VibGUsIC0xMC4wLCAxMC4wLCAxNS4wLCAtNS4wLCBoeXBvdCk7IC8qIHsgZGctZmluYWwg eyBzY2FuLXRyZWUtZHVtcCAidjY0ZGZfaHlwb3QiICJ2ZWN0IiB9IH0qLworICBURVNUX0ZV TiAoZG91YmxlLCAtMTAuMCwgMTAuMCwgbGdhbW1hKTsgLyogeyBkZy1maW5hbCB7IHNjYW4t dHJlZS1kdW1wICJ2NjRkZl9sZ2FtbWEiICJ2ZWN0IiB7IHhmYWlsICotKi0qfSB9IH0qLwor ICBURVNUX0ZVTiAoZG91YmxlLCAtMS4wLCA1MC4wLCBsb2cpOyAvKiB7IGRnLWZpbmFsIHsg c2Nhbi10cmVlLWR1bXAgInY2NGRmX2xvZyIgInZlY3QiIH0gfSovCisgIFRFU1RfRlVOIChk b3VibGUsIC0xLjAsIDUwMC4wLCBsb2cxMCk7IC8qIHsgZGctZmluYWwgeyBzY2FuLXRyZWUt ZHVtcCAidjY0ZGZfbG9nMTAiICJ2ZWN0IiB9IH0qLworICBURVNUX0ZVTiAoZG91YmxlLCAt MS4wLCA2NC4wLCBsb2cyKTsgLyogeyBkZy1maW5hbCB7IHNjYW4tdHJlZS1kdW1wICJ2NjRk Zl9sb2cyIiAidmVjdCIgeyB4ZmFpbCAqLSotKn0gfSB9Ki8KKyAgVEVTVF9GVU4yIChkb3Vi bGUsIC0xMDAuMCwgMTAwLjAsIDEwMC4wLCAtMTAwLjAsIHBvdyk7IC8qIHsgZGctZmluYWwg eyBzY2FuLXRyZWUtZHVtcCAidjY0ZGZfcG93IiAidmVjdCIgfSB9Ki8KKyAgVEVTVF9GVU4y IChkb3VibGUsIC01MC4wLCAxMDAuMCwgLTIuMCwgNDAuMCwgcmVtYWluZGVyKTsgLyogeyBk Zy1maW5hbCB7IHNjYW4tdHJlZS1kdW1wICJ2NjRkZl9yZW1haW5kZXIiICJ2ZWN0IiB9IH0q LworICBURVNUX0ZVTiAoZG91YmxlLCAtNTAuMCwgNTAuMCwgcmludCk7IC8qIHsgZGctZmlu YWwgeyBzY2FuLXRyZWUtZHVtcCAidjY0ZGZfcmludCIgInZlY3QiIH0gfSovCisgIFRFU1Rf RlVOMiAoZG91YmxlLCAtNTAuMCwgNTAuMCwgLTEwLjAsIDMyLjAsIF9fYnVpbHRpbl9zY2Fs Yik7IC8qIHsgZGctZmluYWwgeyBzY2FuLXRyZWUtZHVtcCAidjY0ZGZfc2NhbGIiICJ2ZWN0 IiB9IH0qLworICBURVNUX0ZVTiAoZG91YmxlLCAtMTAuMCwgMTAuMCwgX19idWlsdGluX3Np Z25pZmljYW5kKTsgLyogeyBkZy1maW5hbCB7IHNjYW4tdHJlZS1kdW1wICJ2NjRkZl9zaWdu aWZpY2FuZCIgInZlY3QiIH0gfSovCisgIFRFU1RfRlVOIChkb3VibGUsIC0zLjE0MTU5MjY1 MzU5LCAzLjE0MTU5MjY1MzU5LCBzaW4pOyAvKiB7IGRnLWZpbmFsIHsgc2Nhbi10cmVlLWR1 bXAgInY2NGRmX3NpbiIgInZlY3QiIH0gfSovCisgIFRFU1RfRlVOIChkb3VibGUsIC0zLjE0 MTU5MjY1MzU5LCAzLjE0MTU5MjY1MzU5LCBzaW5oKTsgLyogeyBkZy1maW5hbCB7IHNjYW4t dHJlZS1kdW1wICJ2NjRkZl9zaW5oIiAidmVjdCIgfSB9Ki8KKyAgVEVTVF9GVU4gKGRvdWJs ZSwgLTAuMSwgMTAwMDAuMCwgc3FydCk7IC8qIHsgZGctZmluYWwgeyBzY2FuLXRyZWUtZHVt cCAidjY0ZGZfc3FydCIgInZlY3QiIH0gfSovCisgIFRFU1RfRlVOIChkb3VibGUsIC01LjAs IDUuMCwgdGFuKTsgLyogeyBkZy1maW5hbCB7IHNjYW4tdHJlZS1kdW1wICJ2NjRkZl90YW4i ICJ2ZWN0IiB9IH0qLworICBURVNUX0ZVTiAoZG91YmxlLCAtMy4xNDE1OTI2NTM1OSwgMy4x NDE1OTI2NTM1OSwgdGFuaCk7IC8qIHsgZGctZmluYWwgeyBzY2FuLXRyZWUtZHVtcCAidjY0 ZGZfdGFuaCIgInZlY3QiIH0gfSovCisgIFRFU1RfRlVOIChkb3VibGUsIC0xMC4wLCAxMC4w LCB0Z2FtbWEpOyAvKiB7IGRnLWZpbmFsIHsgc2Nhbi10cmVlLWR1bXAgInY2NGRmX3RnYW1t YSIgInZlY3QiIH0gfSovCisKKyAgcmV0dXJuIGZhaWxlZDsKK30KZGlmZiAtLWdpdCBhL2xp YmdvbXAvdGVzdHN1aXRlL2xpYmdvbXAuYy9zaW1kLW1hdGgtMS5jIGIvbGliZ29tcC90ZXN0 c3VpdGUvbGliZ29tcC5jL3NpbWQtbWF0aC0xLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5k ZXggMDAwMDAwMDAwMDAuLjk0N2JmNjA2ZTM2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliZ29t cC90ZXN0c3VpdGUvbGliZ29tcC5jL3NpbWQtbWF0aC0xLmMKQEAgLTAsMCArMSwyMTcgQEAK Ky8qIENoZWNrIHRoYXQgdGhlIFNJTUQgdmVyc2lvbnMgb2YgbWF0aCByb3V0aW5lcyBnaXZl IHRoZSBzYW1lIChvcgorICAgc3VmZmljaWVudGx5IGNsb3NlKSByZXN1bHRzIGFzIHRoZWly IHNjYWxhciBlcXVpdmFsZW50cy4gICovCisKKy8qIHsgZGctZG8gcnVuIH0gKi8KKy8qIHsg ZGctb3B0aW9ucyAiLU8yIC1mdHJlZS12ZWN0b3JpemUgLWZuby1tYXRoLWVycm5vIiB9ICov CisvKiB7IGRnLWFkZGl0aW9uYWwtb3B0aW9ucyAtZm9mZmxvYWQtb3B0aW9ucz1hbWRnY24t YW1kaHNhPS1tc3RhY2stc2l6ZT0zMDAwMDAwIHsgdGFyZ2V0IG9mZmxvYWRfdGFyZ2V0X2Ft ZGdjbiB9IH0gKi8KKy8qIHsgZGctYWRkaXRpb25hbC1vcHRpb25zIC1mb2ZmbG9hZC1vcHRp b25zPS1sbSB9ICovCisKKyN1bmRlZiBQUklOVF9SRVNVTFQKKyNkZWZpbmUgVkVSQk9TRSAw CisjZGVmaW5lIEVBUkxZX0VYSVQgMQorCisjaW5jbHVkZSA8bWF0aC5oPgorI2luY2x1ZGUg PHN0ZGxpYi5oPgorCisjaWZkZWYgUFJJTlRfUkVTVUxUCisgICNpbmNsdWRlIDxzdGRpby5o PgorICAjZGVmaW5lIFBSSU5URiBwcmludGYKKyNlbHNlCisgIHN0YXRpYyB2b2lkIG51bGxf cHJpbnRmIChjb25zdCBjaGFyICpmLCAuLi4pIHsgfQorCisgICNkZWZpbmUgUFJJTlRGIG51 bGxfcHJpbnRmCisjZW5kaWYKKworI2RlZmluZSBOIDUxMgorI2RlZmluZSBFUFNJTE9OX2Zs b2F0IDFlLTUKKyNkZWZpbmUgRVBTSUxPTl9kb3VibGUgMWUtMTAKKworc3RhdGljIGludCB4 ZmFpbCA9IDA7CitzdGF0aWMgaW50IGZhaWxlZCA9IDA7CisKK2ludCBkZXZpYXRpb25fZmxv YXQgKGZsb2F0IHgsIGZsb2F0IHkpCit7CisgIHVuaW9uIHsKKyAgICBmbG9hdCBmOworICAg IHVuc2lnbmVkIHU7CisgIH0gdSwgdjsKKworICB1LmYgPSB4OworICB2LmYgPSB5OworCisg IHVuc2lnbmVkIG1hc2sgPSAweDgwMDAwMDAwVTsKKyAgaW50IGk7CisKKyAgZm9yIChpID0g MzI7IGkgPiAwOyBpLS0pCisgICAgaWYgKCh1LnUgXiB2LnUpICYgbWFzaykKKyAgICAgIGJy ZWFrOworICAgIGVsc2UKKyAgICAgIG1hc2sgPj49IDE7CisKKyAgcmV0dXJuIGk7Cit9CisK K2ludCBkZXZpYXRpb25fZG91YmxlIChkb3VibGUgeCwgZG91YmxlIHkpCit7CisgIHVuaW9u IHsKKyAgICBkb3VibGUgZDsKKyAgICB1bnNpZ25lZCBsb25nIGxvbmcgdTsKKyAgfSB1LCB2 OworCisgIHUuZCA9IHg7CisgIHYuZCA9IHk7CisKKyAgdW5zaWduZWQgbG9uZyBsb25nIG1h c2sgPSAweDgwMDAwMDAwMDAwMDAwMDBVTEw7CisgIGludCBpOworCisgIGZvciAoaSA9IDY0 OyBpID4gMDsgaS0tKQorICAgIGlmICgodS51IF4gdi51KSAmIG1hc2spCisgICAgICBicmVh azsKKyAgICBlbHNlCisgICAgICBtYXNrID4+PSAxOworCisgIHJldHVybiBpOworfQorCisj ZGVmaW5lIFRFU1RfRlVOX1hGQUlMKFRGTE9BVCwgTE9XLCBISUdILCBGVU4pIFwKKyAgeGZh aWwgPSAxOyBcCisgIFRFU1RfRlVOIChURkxPQVQsIExPVywgSElHSCwgRlVOKTsgXAorICB4 ZmFpbCA9IDA7CisKKyNkZWZpbmUgVEVTVF9GVU4oVEZMT0FULCBMT1csIEhJR0gsIEZVTikg XAorX19hdHRyaWJ1dGVfXygob3B0aW1pemUoIm5vLXRyZWUtdmVjdG9yaXplIikpKSBcCitf X2F0dHJpYnV0ZV9fKChvcHRpbWl6ZSgibm8tdW5zYWZlLW1hdGgtb3B0aW1pemF0aW9ucyIp KSkgXAordm9pZCBjaGVja18jI0ZVTiAoVEZMT0FUIHJlc1tOXSwgVEZMT0FUIGFbTl0pIFwK K3sgXAorICBmb3IgKGludCBpID0gMDsgaSA8IE47IGkrKykgeyBcCisgICAgVEZMT0FUIGV4 cGVjdGVkID0gRlVOIChhW2ldKTsgXAorICAgIFRGTE9BVCBkaWZmID0gX19idWlsdGluX2Zh YnMgKGV4cGVjdGVkIC0gcmVzW2ldKTsgXAorICAgIGludCBkZXZpYXRpb24gPSBkZXZpYXRp b25fIyNURkxPQVQgKGV4cGVjdGVkLCByZXNbaV0pOyBcCisgICAgaW50IGZhaWwgPSBpc25h biAocmVzW2ldKSAhPSBpc25hbiAoZXhwZWN0ZWQpIFwKKwkgICAgICAgfHwgaXNpbmYgKHJl c1tpXSkgIT0gaXNpbmYgKGV4cGVjdGVkKSBcCisJICAgICAgIHx8IChkaWZmID4gRVBTSUxP Tl8jI1RGTE9BVCAmJiBkZXZpYXRpb24gPiAxMCk7IFwKKyAgICBpZiAoVkVSQk9TRSB8fCBm YWlsKSBcCisgICAgICBQUklOVEYgKCNGVU4gIiglZikgPSAlZiwgZXhwZWN0ZWQgPSAlZiwg ZGlmZiA9ICVmLCBkZXZpYXRpb24gPSAlZCAlc1xuIiwgXAorCSAgICAgIGFbaV0sIHJlc1tp XSwgZXhwZWN0ZWQsIGRpZmYsIGRldmlhdGlvbiwgZmFpbCA/ICIoISkiIDogIiIpOyBcCisg ICAgZmFpbGVkIHw9IChmYWlsICYmICF4ZmFpbCk7IFwKKyAgICBpZiAoRUFSTFlfRVhJVCAm JiBmYWlsZWQpIFwKKyAgICAgIGV4aXQgKDEpOyBcCisgIH0gXAorfSBcCit2b2lkIHRlc3Rf IyNGVU4gKHZvaWQpIFwKK3sgXAorICBURkxPQVQgcmVzW05dLCBhW05dOyBcCisgIGZvciAo aW50IGkgPSAwOyBpIDwgTjsgaSsrKSBcCisgICAgYVtpXSA9IExPVyArICgoSElHSCAtIExP VykgLyBOKSAqIGk7IFwKKyAgX1ByYWdtYSAoIm9tcCB0YXJnZXQgcGFyYWxsZWwgZm9yIHNp bWQgbWFwKHRvOmEpIG1hcChmcm9tOnJlcykiKSBcCisgICAgZm9yIChpbnQgaSA9IDA7IGkg PCBOOyBpKyspIFwKKyAgICAgIHJlc1tpXSA9IEZVTiAoYVtpXSk7IFwKKyAgY2hlY2tfIyNG VU4gKHJlcywgYSk7IFwKK31cCit0ZXN0XyMjRlVOICgpOworCisjZGVmaW5lIFRFU1RfRlVO MihURkxPQVQsIExPVzEsIEhJR0gxLCBMT1cyLCBISUdIMiwgRlVOKSBcCitfX2F0dHJpYnV0 ZV9fKChvcHRpbWl6ZSgibm8tdHJlZS12ZWN0b3JpemUiKSkpIFwKK19fYXR0cmlidXRlX18o KG9wdGltaXplKCJuby11bnNhZmUtbWF0aC1vcHRpbWl6YXRpb25zIikpKSBcCit2b2lkIGNo ZWNrXyMjRlVOIChURkxPQVQgcmVzW05dLCBURkxPQVQgYVtOXSwgVEZMT0FUIGJbTl0pIFwK K3sgXAorICBpbnQgZmFpbGVkID0gMDsgXAorICBmb3IgKGludCBpID0gMDsgaSA8IE47IGkr KykgeyBcCisgICAgVEZMT0FUIGV4cGVjdGVkID0gRlVOIChhW2ldLCBiW2ldKTsgXAorICAg IFRGTE9BVCBkaWZmID0gX19idWlsdGluX2ZhYnMgKGV4cGVjdGVkIC0gcmVzW2ldKTsgXAor ICAgIGludCBkZXZpYXRpb24gPSBkZXZpYXRpb25fIyNURkxPQVQgKGV4cGVjdGVkLCByZXNb aV0pOyBcCisgICAgaW50IGZhaWwgPSBpc25hbiAocmVzW2ldKSAhPSBpc25hbiAoZXhwZWN0 ZWQpIFwKKwkgICAgICAgfHwgaXNpbmYgKHJlc1tpXSkgIT0gaXNpbmYgKGV4cGVjdGVkKSBc CisJICAgICAgIHx8IChkaWZmID4gRVBTSUxPTl8jI1RGTE9BVCAmJiBkZXZpYXRpb24gPiAx MCk7IFwKKyAgICBmYWlsZWQgfD0gZmFpbDsgXAorICAgIGlmIChWRVJCT1NFIHx8IGZhaWwp IFwKKyAgICAgIFBSSU5URiAoI0ZVTiAiKCVmLCVmKSA9ICVmLCBleHBlY3RlZCA9ICVmLCBk aWZmID0gJWYsIGRldmlhdGlvbiA9ICVkICVzXG4iLCBcCisJICAgICAgYVtpXSwgYltpXSwg cmVzW2ldLCBleHBlY3RlZCwgZGlmZiwgZGV2aWF0aW9uLCBmYWlsID8gIighKSIgOiAiIik7 IFwKKyAgICBpZiAoRUFSTFlfRVhJVCAmJiBmYWlsKSBcCisgICAgICBleGl0ICgxKTsgXAor ICB9IFwKK30gXAordm9pZCB0ZXN0XyMjRlVOICh2b2lkKSBcCit7IFwKKyAgVEZMT0FUIHJl c1tOXSwgYVtOXSwgYltOXTsgXAorICBmb3IgKGludCBpID0gMDsgaSA8IE47IGkrKykgeyBc CisgICAgYVtpXSA9IExPVzEgKyAoKEhJR0gxIC0gTE9XMSkgLyBOKSAqIGk7IFwKKyAgICBi W2ldID0gTE9XMiArICgoSElHSDIgLSBMT1cyKSAvIE4pICogaTsgXAorICB9IFwKKyAgX1By YWdtYSAoIm9tcCB0YXJnZXQgcGFyYWxsZWwgZm9yIHNpbWQgbWFwKHRvOmEpIG1hcChmcm9t OnJlcykiKSBcCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBOOyBpKyspIFwKKyAgICAgIHJl c1tpXSA9IEZVTiAoYVtpXSwgYltpXSk7IFwKKyAgY2hlY2tfIyNGVU4gKHJlcywgYSwgYik7 IFwKK31cCit0ZXN0XyMjRlVOICgpOworCitpbnQgbWFpbiAodm9pZCkKK3sKKyAgVEVTVF9G VU4gKGZsb2F0LCAtMS4xLCAxLjEsIGFjb3NmKTsKKyAgVEVTVF9GVU4gKGZsb2F0LCAtMTAs IDEwLCBhY29zaGYpOworICBURVNUX0ZVTiAoZmxvYXQsIC0xLjEsIDEuMSwgYXNpbmYpOwor ICBURVNUX0ZVTiAoZmxvYXQsIC0xMCwgMTAsIGFzaW5oZik7CisgIFRFU1RfRlVOIChmbG9h dCwgLTEuMSwgMS4xLCBhdGFuZik7CisgIFRFU1RfRlVOMiAoZmxvYXQsIC0yLjAsIDIuMCwg Mi4wLCAtMi4wLCBhdGFuMmYpOworICBURVNUX0ZVTiAoZmxvYXQsIC0yLjAsIDIuMCwgYXRh bmhmKTsKKyAgVEVTVF9GVU4yIChmbG9hdCwgLTEwLjAsIDEwLjAsIDUuMCwgLTE1LjAsIGNv cHlzaWduZik7CisgIFRFU1RfRlVOIChmbG9hdCwgLTMuMTQxNTkyNjUzNTksIDMuMTQxNTky NjUzNTksIGNvc2YpOworICBURVNUX0ZVTiAoZmxvYXQsIC0zLjE0MTU5MjY1MzU5LCAzLjE0 MTU5MjY1MzU5LCBjb3NoZik7CisgIFRFU1RfRlVOIChmbG9hdCwgLTEwLjAsIDEwLjAsIGVy ZmYpOworICBURVNUX0ZVTiAoZmxvYXQsIC0xMC4wLCAxMC4wLCBleHBmKTsKKyAgVEVTVF9G VU4gKGZsb2F0LCAtMTAuMCwgMTAuMCwgZXhwMmYpOworICBURVNUX0ZVTjIgKGZsb2F0LCAt MTAuMCwgMTAuMCwgMTAwLjAsIC0yNS4wLCBmbW9kZik7CisgIFRFU1RfRlVOIChmbG9hdCwg LTEwLjAsIDEwLjAsIGdhbW1hZik7CisgIFRFU1RfRlVOMiAoZmxvYXQsIC0xMC4wLCAxMC4w LCAxNS4wLCAtNS4wLGh5cG90Zik7CisgIFRFU1RfRlVOIChmbG9hdCwgLTEwLjAsIDEwLjAs IGxnYW1tYWYpOworICBURVNUX0ZVTiAoZmxvYXQsIC0xLjAsIDUwLjAsIGxvZ2YpOworICBU RVNUX0ZVTiAoZmxvYXQsIC0xLjAsIDUwMC4wLCBsb2cxMGYpOworICBURVNUX0ZVTiAoZmxv YXQsIC0xLjAsIDY0LjAsIGxvZzJmKTsKKyAgVEVTVF9GVU4yIChmbG9hdCwgLTEwMC4wLCAx MDAuMCwgMTAwLjAsIC0xMDAuMCwgcG93Zik7CisgIFRFU1RfRlVOMiAoZmxvYXQsIC01MC4w LCAxMDAuMCwgLTIuMCwgNDAuMCwgcmVtYWluZGVyZik7CisgIFRFU1RfRlVOIChmbG9hdCwg LTUwLjAsIDUwLjAsIHJpbnRmKTsKKyAgVEVTVF9GVU4yIChmbG9hdCwgLTUwLjAsIDUwLjAs IC0xMC4wLCAzMi4wLCBfX2J1aWx0aW5fc2NhbGJmKTsKKyAgVEVTVF9GVU4gKGZsb2F0LCAt MTAuMCwgMTAuMCwgX19idWlsdGluX3NpZ25pZmljYW5kZik7CisgIFRFU1RfRlVOIChmbG9h dCwgLTMuMTQxNTkyNjUzNTksIDMuMTQxNTkyNjUzNTksIHNpbmYpOworICBURVNUX0ZVTiAo ZmxvYXQsIC0zLjE0MTU5MjY1MzU5LCAzLjE0MTU5MjY1MzU5LCBzaW5oZik7CisgIFRFU1Rf RlVOIChmbG9hdCwgLTAuMSwgMTAwMDAuMCwgc3FydGYpOworICBURVNUX0ZVTiAoZmxvYXQs IC01LjAsIDUuMCwgdGFuZik7CisgIFRFU1RfRlVOIChmbG9hdCwgLTMuMTQxNTkyNjUzNTks IDMuMTQxNTkyNjUzNTksIHRhbmhmKTsKKyAgLyogTmV3bGliJ3MgdmVyc2lvbiBvZiB0Z2Ft bWFmIGlzIGtub3duIHRvIGhhdmUgcG9vciBhY2N1cmFjeS4gICovCisgIFRFU1RfRlVOX1hG QUlMIChmbG9hdCwgLTEwLjAsIDEwLjAsIHRnYW1tYWYpOworCisgIFRFU1RfRlVOIChkb3Vi bGUsIC0xLjEsIDEuMSwgYWNvcyk7CisgIFRFU1RfRlVOIChkb3VibGUsIC0xMCwgMTAsIGFj b3NoKTsKKyAgVEVTVF9GVU4gKGRvdWJsZSwgLTEuMSwgMS4xLCBhc2luKTsKKyAgVEVTVF9G VU4gKGRvdWJsZSwgLTEwLCAxMCwgYXNpbmgpOworICBURVNUX0ZVTiAoZG91YmxlLCAtMS4x LCAxLjEsIGF0YW4pOworICBURVNUX0ZVTjIgKGRvdWJsZSwgLTIuMCwgMi4wLCAyLjAsIC0y LjAsIGF0YW4yKTsKKyAgVEVTVF9GVU4gKGRvdWJsZSwgLTIuMCwgMi4wLCBhdGFuaCk7Cisg IFRFU1RfRlVOMiAoZG91YmxlLCAtMTAuMCwgMTAuMCwgNS4wLCAtMTUuMCwgY29weXNpZ24p OworICBURVNUX0ZVTiAoZG91YmxlLCAtMy4xNDE1OTI2NTM1OSwgMy4xNDE1OTI2NTM1OSwg Y29zKTsKKyAgVEVTVF9GVU4gKGRvdWJsZSwgLTMuMTQxNTkyNjUzNTksIDMuMTQxNTkyNjUz NTksIGNvc2gpOworICBURVNUX0ZVTiAoZG91YmxlLCAtMTAuMCwgMTAuMCwgZXJmKTsKKyAg VEVTVF9GVU4gKGRvdWJsZSwgLTEwLjAsIDEwLjAsIGV4cCk7CisgIFRFU1RfRlVOIChkb3Vi bGUsIC0xMC4wLCAxMC4wLCBleHAyKTsKKyAgVEVTVF9GVU4yIChkb3VibGUsIC0xMC4wLCAx MC4wLCAxMDAuMCwgLTI1LjAsIGZtb2QpOworICBURVNUX0ZVTiAoZG91YmxlLCAtMTAuMCwg MTAuMCwgZ2FtbWEpOworICBURVNUX0ZVTjIgKGRvdWJsZSwgLTEwLjAsIDEwLjAsIDE1LjAs IC01LjAsIGh5cG90KTsKKyAgVEVTVF9GVU4gKGRvdWJsZSwgLTEwLjAsIDEwLjAsIGxnYW1t YSk7CisgIFRFU1RfRlVOIChkb3VibGUsIC0xLjAsIDUwLjAsIGxvZyk7CisgIFRFU1RfRlVO IChkb3VibGUsIC0xLjAsIDUwMC4wLCBsb2cxMCk7CisgIFRFU1RfRlVOIChkb3VibGUsIC0x LjAsIDY0LjAsIGxvZzIpOworICBURVNUX0ZVTjIgKGRvdWJsZSwgLTEwMC4wLCAxMDAuMCwg MTAwLjAsIC0xMDAuMCwgcG93KTsKKyAgVEVTVF9GVU4yIChkb3VibGUsIC01MC4wLCAxMDAu MCwgLTIuMCwgNDAuMCwgcmVtYWluZGVyKTsKKyAgVEVTVF9GVU4gKGRvdWJsZSwgLTUwLjAs IDUwLjAsIHJpbnQpOworICBURVNUX0ZVTjIgKGRvdWJsZSwgLTUwLjAsIDUwLjAsIC0xMC4w LCAzMi4wLCBfX2J1aWx0aW5fc2NhbGIpOworICBURVNUX0ZVTiAoZG91YmxlLCAtMTAuMCwg MTAuMCwgX19idWlsdGluX3NpZ25pZmljYW5kKTsKKyAgVEVTVF9GVU4gKGRvdWJsZSwgLTMu MTQxNTkyNjUzNTksIDMuMTQxNTkyNjUzNTksIHNpbik7CisgIFRFU1RfRlVOIChkb3VibGUs IC0zLjE0MTU5MjY1MzU5LCAzLjE0MTU5MjY1MzU5LCBzaW5oKTsKKyAgVEVTVF9GVU4gKGRv dWJsZSwgLTAuMSwgMTAwMDAuMCwgc3FydCk7CisgIFRFU1RfRlVOIChkb3VibGUsIC01LjAs IDUuMCwgdGFuKTsKKyAgVEVTVF9GVU4gKGRvdWJsZSwgLTMuMTQxNTkyNjUzNTksIDMuMTQx NTkyNjUzNTksIHRhbmgpOworICAvKiBOZXdsaWIncyB2ZXJzaW9uIG9mIHRnYW1tYSBpcyBr bm93biB0byBoYXZlIHBvb3IgYWNjdXJhY3kuICAqLworICBURVNUX0ZVTl9YRkFJTCAoZG91 YmxlLCAtMTAuMCwgMTAuMCwgdGdhbW1hKTsKKworICByZXR1cm4gZmFpbGVkOworfQotLSAK Mi4yNS4xCgo= --------------vfzC6fidkej6Iaqjh0y6IvRX--