From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from esa1.mentor.iphmx.com (esa1.mentor.iphmx.com [68.232.129.153]) by sourceware.org (Postfix) with ESMTPS id 1121E3858C78 for ; Thu, 2 Mar 2023 15:07:30 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 1121E3858C78 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,228,1673942400"; d="scan'208,223";a="102819516" Received: from orw-gwy-01-in.mentorg.com ([192.94.38.165]) by esa1.mentor.iphmx.com with ESMTP; 02 Mar 2023 07:07:28 -0800 IronPort-SDR: 6mhF/OBQEtfQBEBETmhWlH8HymPknqc93o+Tsi7qDN0d7WjlJJGYHogqOd8R9fMzqHVlo7bpFo pvfxiwozS9xW4LTvSNnkAeZ4iwNVPeLAzmaTuSxQltDnjLFjv0TqeEZuDi/cqsUkII74wPmG/M dnMdZ/n/+DIN47hLwujaA627Kqk/G4lj9pwC7ROih4ZIe7DcmRr4PFWHa0519jFGPunH93fiMI MBrpIEuQpdRQ38Qo20xnUu+XHh5UrecQN9zd8XHckJceFTRlkOmVEf3/NUdTsAXdmoMTv7dOPY Vug= Content-Type: multipart/mixed; boundary="------------TpI8htASLJfFTo0UOB453YTC" Message-ID: Date: Thu, 2 Mar 2023 15:07: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 Subject: Re: [PATCH] amdgcn: Enable SIMD vectorization of math functions To: Andrew Stubbs , gcc-patches References: From: Kwok Cheung Yeung In-Reply-To: X-Originating-IP: [137.202.0.90] X-ClientProxiedBy: svr-ies-mbx-14.mgc.mentorg.com (139.181.222.14) To svr-ies-mbx-12.mgc.mentorg.com (139.181.222.12) X-Spam-Status: No, score=-11.9 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: --------------TpI8htASLJfFTo0UOB453YTC Content-Type: text/plain; charset="UTF-8"; format=flowed Content-Transfer-Encoding: 8bit Hello I've made the suggested changes. Should I hold off on committing this until GCC 13 has been branched off? Kwok On 01/03/2023 10:01 am, Andrew Stubbs wrote: > On 28/02/2023 23:01, Kwok Cheung Yeung wrote: >> 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? > > The main part of the patch is OK, with the small changes below. > > Others have pointed out that "omp declare simd" exists, but you and I > have been all through that verbally, long ago, and as Tobias says the > offload compiler cannot rely on markup in the host compiler's header > files to solve this problem. > >> @@ -7324,6 +7429,11 @@ gcn_dwarf_register_span (rtx rtl) >>    gcn_simd_clone_compute_vecsize_and_simdlen >>  #undef  TARGET_SIMD_CLONE_USABLE >>  #define TARGET_SIMD_CLONE_USABLE gcn_simd_clone_usable >> +#undef TARGET_VECTORIZE_BUILTIN_VECTORIZED_FUNCTION >> +#define TARGET_VECTORIZE_BUILTIN_VECTORIZED_FUNCTION \ >> +  gcn_vectorize_builtin_vectorized_function >> +#undef TARGET_LIBC_HAS_FUNCTION >> +#define TARGET_LIBC_HAS_FUNCTION gcn_libc_has_function >>  #undef  TARGET_SMALL_REGISTER_CLASSES_FOR_MODE_P >>  #define TARGET_SMALL_REGISTER_CLASSES_FOR_MODE_P \ >>    gcn_small_register_classes_for_mode_p > > Please keep these in alphabetical order. > >> +/* Ideally this test should be run, but the math routines require a >> large >> +   stack and gcn-run currently does not respect the stack-size >> parameter.  */ >> +/* { dg-do compile } */ >> +/* { dg-options "-O2 -ftree-vectorize -fno-math-errno >> -mstack-size=3000000 -fdump-tree-vect" } */ > > This isn't ideal. The dg-set-target-env-var directive (I think this is > it?) can set GCN_STACK_SIZE, which gcn-run does honour, but I realise > that doesn't work with remote test targets (like ours). > > I suggest adding an additional test that sets the envvar and #includes > the code from this one; one test to scan the dumps, one test to run it. > Like this .... (untested, syntax uncertain). > > /* { dg-do run } */ > /* { dg-options "-O2 -ftree-vectorize -fno-math-errno" } */ > /* { dg-set-target-env-var "GCN_STACK_SIZE" "3000000" } */ > #include "simd-math-1.c" > > The run test will get skipped in our test environment (and anyone else > using remote), but the libgomp test should make up for that. > > Andrew --------------TpI8htASLJfFTo0UOB453YTC 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 RnJvbSAwYjQzZWYzYzJkNmFmZDRhZWNmYzAzZmQxZDJkZjY3NTYyNmUwMTdiIE1vbiBTZXAg MTcgMDA6MDA6MDAgMjAwMQpGcm9tOiBLd29rIENoZXVuZyBZZXVuZyA8a2N5QGNvZGVzb3Vy Y2VyeS5jb20+CkRhdGU6IFR1ZSwgMjggRmViIDIwMjMgMTQ6MTU6NDcgKzAwMDAKU3ViamVj dDogW1BBVENIXSBhbWRnY246IEVuYWJsZSBTSU1EIHZlY3Rvcml6YXRpb24gb2YgbWF0aCBm dW5jdGlvbnMKCkNhbGxzIHRvIHZlY3Rvcml6ZWQgdmVyc2lvbnMgb2Ygcm91dGluZXMgaW4g dGhlIG1hdGggbGlicmFyeSB3aWxsIG5vdwpiZSBpbnNlcnRlZCB3aGVuIHZlY3Rvcml6aW5n IGNvZGUgY29udGFpbmluZyBzdXBwb3J0ZWQgbWF0aCBmdW5jdGlvbnMuCgoyMDIzLTAyLTI4 ICBLd29rIENoZXVuZyBZZXVuZyAgPGtjeUBjb2Rlc291cmNlcnkuY29tPgoJICAgIFBhdWwt QW50b2luZSBBcnJhcyAgPHBhQGNvZGVzb3VyY2VyeS5jb20+CgoJZ2NjLwoJKiBidWlsdGlu cy5jYyAobWF0aGZuX2J1aWx0X2luX2V4cGxpY2l0KTogTmV3LgoJKiBjb25maWcvZ2NuL2dj bi5jYzogSW5jbHVkZSBjYXNlLWNmbi1tYWNyb3MuaC4KCShtYXRoZm5fYnVpbHRfaW5fZXhw bGljaXQpOiBBZGQgcHJvdG90eXBlLgoJKGdjbl92ZWN0b3JpemVfYnVpbHRpbl92ZWN0b3Jp emVkX2Z1bmN0aW9uKTogTmV3LgoJKGdjbl9saWJjX2hhc19mdW5jdGlvbik6IE5ldy4KCShU QVJHRVRfTElCQ19IQVNfRlVOQ1RJT04pOiBEZWZpbmUuCgkoVEFSR0VUX1ZFQ1RPUklaRV9C VUlMVElOX1ZFQ1RPUklaRURfRlVOQ1RJT04pOiBEZWZpbmUuCgoJZ2NjL3Rlc3RzdWl0ZS8K CSogZ2NjLnRhcmdldC9nY24vc2ltZC1tYXRoLTEuYzogTmV3IHRlc3RjYXNlLgoJKiBnY2Mu dGFyZ2V0L2djbi9zaW1kLW1hdGgtMi5jOiBOZXcgdGVzdGNhc2UuCgoJbGliZ29tcC8KCSog dGVzdHN1aXRlL2xpYmdvbXAuYy9zaW1kLW1hdGgtMS5jOiBOZXcgdGVzdGNhc2UuCi0tLQog Z2NjL2J1aWx0aW5zLmNjICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICA4ICsKIGdj Yy9jb25maWcvZ2NuL2djbi5jYyAgICAgICAgICAgICAgICAgICAgICB8IDExMCArKysrKysr KysrKwogZ2NjL3Rlc3RzdWl0ZS9nY2MudGFyZ2V0L2djbi9zaW1kLW1hdGgtMS5jIHwgMjA2 ICsrKysrKysrKysrKysrKysrKysKIGdjYy90ZXN0c3VpdGUvZ2NjLnRhcmdldC9nY24vc2lt ZC1tYXRoLTIuYyB8ICAgOCArCiBsaWJnb21wL3Rlc3RzdWl0ZS9saWJnb21wLmMvc2ltZC1t YXRoLTEuYyAgfCAyMTcgKysrKysrKysrKysrKysrKysrKysrCiA1IGZpbGVzIGNoYW5nZWQs IDU0OSBpbnNlcnRpb25zKCspCiBjcmVhdGUgbW9kZSAxMDA2NDQgZ2NjL3Rlc3RzdWl0ZS9n Y2MudGFyZ2V0L2djbi9zaW1kLW1hdGgtMS5jCiBjcmVhdGUgbW9kZSAxMDA2NDQgZ2NjL3Rl c3RzdWl0ZS9nY2MudGFyZ2V0L2djbi9zaW1kLW1hdGgtMi5jCiBjcmVhdGUgbW9kZSAxMDA2 NDQgbGliZ29tcC90ZXN0c3VpdGUvbGliZ29tcC5jL3NpbWQtbWF0aC0xLmMKCmRpZmYgLS1n aXQgYS9nY2MvYnVpbHRpbnMuY2MgYi9nY2MvYnVpbHRpbnMuY2MKaW5kZXggNGQ0NjdjOGM1 YzEuLjMwNWM2NWMyOWJlIDEwMDY0NAotLS0gYS9nY2MvYnVpbHRpbnMuY2MKKysrIGIvZ2Nj L2J1aWx0aW5zLmNjCkBAIC0yMDg5LDYgKzIwODksMTQgQEAgbWF0aGZuX2J1aWx0X2luICh0 cmVlIHR5cGUsIGNvbWJpbmVkX2ZuIGZuKQogICByZXR1cm4gbWF0aGZuX2J1aWx0X2luXzEg KHR5cGUsIGZuLCAvKmltcGxpY2l0PSovIDEpOwogfQogCisvKiBMaWtlIG1hdGhmbl9idWls dF9pbl8xLCBidXQgYWx3YXlzIHVzZSB0aGUgZXhwbGljaXQgYXJyYXkuICAqLworCit0cmVl CittYXRoZm5fYnVpbHRfaW5fZXhwbGljaXQgKHRyZWUgdHlwZSwgY29tYmluZWRfZm4gZm4p Cit7CisgIHJldHVybiBtYXRoZm5fYnVpbHRfaW5fMSAodHlwZSwgZm4sIC8qaW1wbGljaXQ9 Ki8gMCk7Cit9CisKIC8qIExpa2UgbWF0aGZuX2J1aWx0X2luXzEsIGJ1dCB0YWtlIGEgYnVp bHRfaW5fZnVuY3Rpb24gYW5kCiAgICBhbHdheXMgdXNlIHRoZSBpbXBsaWNpdCBhcnJheS4g ICovCiAKZGlmZiAtLWdpdCBhL2djYy9jb25maWcvZ2NuL2djbi5jYyBiL2djYy9jb25maWcv Z2NuL2djbi5jYwppbmRleCAyM2FiMDFlNzVkOC4uNmYwYTkwYTQ5MDQgMTAwNjQ0Ci0tLSBh L2djYy9jb25maWcvZ2NuL2djbi5jYworKysgYi9nY2MvY29uZmlnL2djbi9nY24uY2MKQEAg LTUzLDYgKzUzLDcgQEAKICNpbmNsdWRlICJkd2FyZjIuaCIKICNpbmNsdWRlICJnaW1wbGUu aCIKICNpbmNsdWRlICJjZ3JhcGguaCIKKyNpbmNsdWRlICJjYXNlLWNmbi1tYWNyb3MuaCIK IAogLyogVGhpcyBmaWxlIHNob3VsZCBiZSBpbmNsdWRlZCBsYXN0LiAgKi8KICNpbmNsdWRl ICJ0YXJnZXQtZGVmLmgiCkBAIC01MjQwLDYgKzUyNDEsMTEwIEBAIGdjbl9zaW1kX2Nsb25l X3VzYWJsZSAoc3RydWN0IGNncmFwaF9ub2RlICpBUkdfVU5VU0VEIChub2RlKSkKICAgcmV0 dXJuIDA7CiB9CiAKK3RyZWUgbWF0aGZuX2J1aWx0X2luX2V4cGxpY2l0ICh0cmVlLCBjb21i aW5lZF9mbik7CisKKy8qIEltcGxlbWVudCBUQVJHRVRfVkVDVE9SSVpFX0JVSUxUSU5fVkVD VE9SSVpFRF9GVU5DVElPTi4KKyAgIFJldHVybiB0aGUgZnVuY3Rpb24gZGVjbGFyYXRpb24g b2YgdGhlIHZlY3Rvcml6ZWQgdmVyc2lvbiBvZiB0aGUgYnVpbHRpbgorICAgaW4gdGhlIG1h dGggbGlicmFyeSBpZiBhdmFpbGFibGUuICAqLworCit0cmVlCitnY25fdmVjdG9yaXplX2J1 aWx0aW5fdmVjdG9yaXplZF9mdW5jdGlvbiAodW5zaWduZWQgaW50IGZuLCB0cmVlIHR5cGVf b3V0LAorCQkJCQkgICB0cmVlIHR5cGVfaW4pCit7CisgIGlmIChUUkVFX0NPREUgKHR5cGVf b3V0KSAhPSBWRUNUT1JfVFlQRQorICAgICAgfHwgVFJFRV9DT0RFICh0eXBlX2luKSAhPSBW RUNUT1JfVFlQRSkKKyAgICByZXR1cm4gTlVMTF9UUkVFOworCisgIG1hY2hpbmVfbW9kZSBv dXRfbW9kZSA9IFRZUEVfTU9ERSAoVFJFRV9UWVBFICh0eXBlX291dCkpOworICBpbnQgb3V0 X24gPSBUWVBFX1ZFQ1RPUl9TVUJQQVJUUyAodHlwZV9vdXQpOworICBtYWNoaW5lX21vZGUg aW5fbW9kZSA9IFRZUEVfTU9ERSAoVFJFRV9UWVBFICh0eXBlX2luKSk7CisgIGludCBpbl9u ID0gVFlQRV9WRUNUT1JfU1VCUEFSVFMgKHR5cGVfaW4pOworICBjb21iaW5lZF9mbiBjZm4g PSBjb21iaW5lZF9mbiAoZm4pOworCisgIC8qIEtlZXAgdGhpcyBjb25zaXN0ZW50IHdpdGgg dGhlIGxpc3Qgb2YgdmVjdG9yaXplZCBtYXRoIHJvdXRpbmVzLiAgKi8KKyAgaW50IGltcGxp Y2l0X3A7CisgIHN3aXRjaCAoZm4pCisgICAgeworICAgIENBU0VfQ0ZOX0FDT1M6CisgICAg Q0FTRV9DRk5fQUNPU0g6CisgICAgQ0FTRV9DRk5fQVNJTjoKKyAgICBDQVNFX0NGTl9BU0lO SDoKKyAgICBDQVNFX0NGTl9BVEFOOgorICAgIENBU0VfQ0ZOX0FUQU4yOgorICAgIENBU0Vf Q0ZOX0FUQU5IOgorICAgIENBU0VfQ0ZOX0NPUFlTSUdOOgorICAgIENBU0VfQ0ZOX0NPUzoK KyAgICBDQVNFX0NGTl9DT1NIOgorICAgIENBU0VfQ0ZOX0VSRjoKKyAgICBDQVNFX0NGTl9F WFA6CisgICAgQ0FTRV9DRk5fRVhQMjoKKyAgICBDQVNFX0NGTl9GSU5JVEU6CisgICAgQ0FT RV9DRk5fRk1PRDoKKyAgICBDQVNFX0NGTl9HQU1NQToKKyAgICBDQVNFX0NGTl9IWVBPVDoK KyAgICBDQVNFX0NGTl9JU05BTjoKKyAgICBDQVNFX0NGTl9MR0FNTUE6CisgICAgQ0FTRV9D Rk5fTE9HOgorICAgIENBU0VfQ0ZOX0xPRzEwOgorICAgIENBU0VfQ0ZOX0xPRzI6CisgICAg Q0FTRV9DRk5fUE9XOgorICAgIENBU0VfQ0ZOX1JFTUFJTkRFUjoKKyAgICBDQVNFX0NGTl9S SU5UOgorICAgIENBU0VfQ0ZOX1NJTjoKKyAgICBDQVNFX0NGTl9TSU5IOgorICAgIENBU0Vf Q0ZOX1NRUlQ6CisgICAgQ0FTRV9DRk5fVEFOOgorICAgIENBU0VfQ0ZOX1RBTkg6CisgICAg Q0FTRV9DRk5fVEdBTU1BOgorICAgICAgaW1wbGljaXRfcCA9IDE7CisgICAgICBicmVhazsK KworICAgIENBU0VfQ0ZOX1NDQUxCOgorICAgIENBU0VfQ0ZOX1NJR05JRklDQU5EOgorICAg ICAgaW1wbGljaXRfcCA9IDA7CisgICAgICBicmVhazsKKworICAgIGRlZmF1bHQ6CisgICAg ICByZXR1cm4gTlVMTF9UUkVFOworICAgIH0KKworICB0cmVlIG91dF90X25vZGUgPSAob3V0 X21vZGUgPT0gREZtb2RlKSA/IGRvdWJsZV90eXBlX25vZGUgOiBmbG9hdF90eXBlX25vZGU7 CisgIHRyZWUgZm5kZWNsID0gaW1wbGljaXRfcCA/IG1hdGhmbl9idWlsdF9pbiAob3V0X3Rf bm9kZSwgY2ZuKQorCQkJICAgOiBtYXRoZm5fYnVpbHRfaW5fZXhwbGljaXQgKG91dF90X25v ZGUsIGNmbik7CisKKyAgY29uc3QgY2hhciAqYm5hbWUgPSBJREVOVElGSUVSX1BPSU5URVIg KERFQ0xfTkFNRSAoZm5kZWNsKSk7CisgIGNoYXIgbmFtZVsyMF07CisgIHNwcmludGYgKG5h bWUsIG91dF9tb2RlID09IERGbW9kZSA/ICJ2JWRkZl8lcyIgOiAidiVkc2ZfJXMiLAorCSAg IG91dF9uLCBibmFtZSArIDEwKTsKKworICB1bnNpZ25lZCBhcml0eSA9IDA7CisgIGZvciAo dHJlZSBhcmdzID0gREVDTF9BUkdVTUVOVFMgKGZuZGVjbCk7IGFyZ3M7IGFyZ3MgPSBUUkVF X0NIQUlOIChhcmdzKSkKKyAgICBhcml0eSsrOworCisgIHRyZWUgZm50eXBlID0gKGFyaXR5 ID09IDEpCisJCT8gYnVpbGRfZnVuY3Rpb25fdHlwZV9saXN0ICh0eXBlX291dCwgdHlwZV9p biwgTlVMTCkKKwkJOiBidWlsZF9mdW5jdGlvbl90eXBlX2xpc3QgKHR5cGVfb3V0LCB0eXBl X2luLCB0eXBlX2luLCBOVUxMKTsKKworICAvKiBCdWlsZCBhIGZ1bmN0aW9uIGRlY2xhcmF0 aW9uIGZvciB0aGUgdmVjdG9yaXplZCBmdW5jdGlvbi4gICovCisgIHRyZWUgbmV3X2ZuZGVj bCA9IGJ1aWxkX2RlY2wgKEJVSUxUSU5TX0xPQ0FUSU9OLAorCQkJCUZVTkNUSU9OX0RFQ0ws IGdldF9pZGVudGlmaWVyIChuYW1lKSwgZm50eXBlKTsKKyAgVFJFRV9QVUJMSUMgKG5ld19m bmRlY2wpID0gMTsKKyAgREVDTF9FWFRFUk5BTCAobmV3X2ZuZGVjbCkgPSAxOworICBERUNM X0lTX05PVk9QUyAobmV3X2ZuZGVjbCkgPSAxOworICBUUkVFX1JFQURPTkxZIChuZXdfZm5k ZWNsKSA9IDE7CisKKyAgcmV0dXJuIG5ld19mbmRlY2w7Cit9CisKKy8qIEltcGxlbWVudCBU QVJHRVRfTElCQ19IQVNfRlVOQ1RJT04uICAqLworCitib29sCitnY25fbGliY19oYXNfZnVu Y3Rpb24gKGVudW0gZnVuY3Rpb25fY2xhc3MgZm5fY2xhc3MsCisJCSAgICAgICB0cmVlIHR5 cGUpCit7CisgIHJldHVybiBic2RfbGliY19oYXNfZnVuY3Rpb24gKGZuX2NsYXNzLCB0eXBl KTsKK30KKwogLyogfX19ICAqLwogLyoge3t7IG1kX3Jlb3JnIHBhc3MuICAqLwogCkBAIC03 MjkwLDYgKzczOTUsOCBAQCBnY25fZHdhcmZfcmVnaXN0ZXJfc3BhbiAocnR4IHJ0bCkKICAg Z2NuX2lyYV9jaGFuZ2VfcHNldWRvX2FsbG9jbm9fY2xhc3MKICN1bmRlZiAgVEFSR0VUX0xF R0lUSU1BVEVfQ09OU1RBTlRfUAogI2RlZmluZSBUQVJHRVRfTEVHSVRJTUFURV9DT05TVEFO VF9QIGdjbl9sZWdpdGltYXRlX2NvbnN0YW50X3AKKyN1bmRlZiAgVEFSR0VUX0xJQkNfSEFT X0ZVTkNUSU9OCisjZGVmaW5lIFRBUkdFVF9MSUJDX0hBU19GVU5DVElPTiBnY25fbGliY19o YXNfZnVuY3Rpb24KICN1bmRlZiAgVEFSR0VUX0xSQV9QCiAjZGVmaW5lIFRBUkdFVF9MUkFf UCBob29rX2Jvb2xfdm9pZF90cnVlCiAjdW5kZWYgIFRBUkdFVF9NQUNISU5FX0RFUEVOREVO VF9SRU9SRwpAQCAtNzMzNyw2ICs3NDQ0LDkgQEAgZ2NuX2R3YXJmX3JlZ2lzdGVyX3NwYW4g KHJ0eCBydGwpCiAjZGVmaW5lIFRBUkdFVF9UUlVMWV9OT09QX1RSVU5DQVRJT04gZ2NuX3Ry dWx5X25vb3BfdHJ1bmNhdGlvbgogI3VuZGVmICBUQVJHRVRfVkVDVE9SSVpFX0JVSUxUSU5f VkVDVE9SSVpBVElPTl9DT1NUCiAjZGVmaW5lIFRBUkdFVF9WRUNUT1JJWkVfQlVJTFRJTl9W RUNUT1JJWkFUSU9OX0NPU1QgZ2NuX3ZlY3Rvcml6YXRpb25fY29zdAorI3VuZGVmICBUQVJH RVRfVkVDVE9SSVpFX0JVSUxUSU5fVkVDVE9SSVpFRF9GVU5DVElPTgorI2RlZmluZSBUQVJH RVRfVkVDVE9SSVpFX0JVSUxUSU5fVkVDVE9SSVpFRF9GVU5DVElPTiBcCisgIGdjbl92ZWN0 b3JpemVfYnVpbHRpbl92ZWN0b3JpemVkX2Z1bmN0aW9uCiAjdW5kZWYgIFRBUkdFVF9WRUNU T1JJWkVfR0VUX01BU0tfTU9ERQogI2RlZmluZSBUQVJHRVRfVkVDVE9SSVpFX0dFVF9NQVNL X01PREUgZ2NuX3ZlY3Rvcml6ZV9nZXRfbWFza19tb2RlCiAjdW5kZWYgIFRBUkdFVF9WRUNU T1JJWkVfUFJFRkVSUkVEX1NJTURfTU9ERQpkaWZmIC0tZ2l0IGEvZ2NjL3Rlc3RzdWl0ZS9n Y2MudGFyZ2V0L2djbi9zaW1kLW1hdGgtMS5jIGIvZ2NjL3Rlc3RzdWl0ZS9nY2MudGFyZ2V0 L2djbi9zaW1kLW1hdGgtMS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAw MDAwLi42ODY4Y2NiMmM1NAotLS0gL2Rldi9udWxsCisrKyBiL2djYy90ZXN0c3VpdGUvZ2Nj LnRhcmdldC9nY24vc2ltZC1tYXRoLTEuYwpAQCAtMCwwICsxLDIwNiBAQAorLyogQ2hlY2sg dGhhdCBjYWxscyB0byB0aGUgdmVjdG9yaXplZCBtYXRoIGZ1bmN0aW9ucyBhcmUgYWN0dWFs bHkgZW1pdHRlZC4gICovCisKKy8qIHsgZGctZG8gY29tcGlsZSB9ICovCisvKiB7IGRnLW9w dGlvbnMgIi1PMiAtZnRyZWUtdmVjdG9yaXplIC1mbm8tbWF0aC1lcnJubyAtbXN0YWNrLXNp emU9MzAwMDAwMCAtZmR1bXAtdHJlZS12ZWN0IiB9ICovCisKKworI3VuZGVmIFBSSU5UX1JF U1VMVAorI2RlZmluZSBWRVJCT1NFIDAKKyNkZWZpbmUgRUFSTFlfRVhJVCAxCisKKyNpbmNs dWRlIDxtYXRoLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisKKyNpZmRlZiBQUklOVF9SRVNV TFQKKyAgI2luY2x1ZGUgPHN0ZGlvLmg+CisgICNkZWZpbmUgUFJJTlRGIHByaW50ZgorI2Vs c2UKKyAgc3RhdGljIHZvaWQgbnVsbF9wcmludGYgKGNvbnN0IGNoYXIgKmYsIC4uLikgeyB9 CisKKyAgI2RlZmluZSBQUklOVEYgbnVsbF9wcmludGYKKyNlbmRpZgorCisjZGVmaW5lIE4g NTEyCisjZGVmaW5lIEVQU0lMT05fZmxvYXQgMWUtNQorI2RlZmluZSBFUFNJTE9OX2RvdWJs ZSAxZS0xMAorCitzdGF0aWMgaW50IGZhaWxlZCA9IDA7CisKK2ludCBkZXZpYXRpb25fZmxv YXQgKGZsb2F0IHgsIGZsb2F0IHkpCit7CisgIHVuaW9uIHsKKyAgICBmbG9hdCBmOworICAg IHVuc2lnbmVkIHU7CisgIH0gdSwgdjsKKworICB1LmYgPSB4OworICB2LmYgPSB5OworCisg IHVuc2lnbmVkIG1hc2sgPSAweDgwMDAwMDAwVTsgCisgIGludCBpOworCisgIGZvciAoaSA9 IDMyOyBpID4gMDsgaS0tKQorICAgIGlmICgodS51IF4gdi51KSAmIG1hc2spCisgICAgICBi cmVhazsKKyAgICBlbHNlCisgICAgICBtYXNrID4+PSAxOworCisgIHJldHVybiBpOworfQor CitpbnQgZGV2aWF0aW9uX2RvdWJsZSAoZG91YmxlIHgsIGRvdWJsZSB5KQoreworICB1bmlv biB7CisgICAgZG91YmxlIGQ7CisgICAgdW5zaWduZWQgbG9uZyBsb25nIHU7CisgIH0gdSwg djsKKworICB1LmQgPSB4OworICB2LmQgPSB5OworCisgIHVuc2lnbmVkIGxvbmcgbG9uZyBt YXNrID0gMHg4MDAwMDAwMDAwMDAwMDAwVUxMOworICBpbnQgaTsKKworICBmb3IgKGkgPSA2 NDsgaSA+IDA7IGktLSkKKyAgICBpZiAoKHUudSBeIHYudSkgJiBtYXNrKQorICAgICAgYnJl YWs7CisgICAgZWxzZQorICAgICAgbWFzayA+Pj0gMTsKKworICByZXR1cm4gaTsKK30KKwor I2RlZmluZSBURVNUX0ZVTihURkxPQVQsIExPVywgSElHSCwgRlVOKSBcCitfX2F0dHJpYnV0 ZV9fKChvcHRpbWl6ZSgibm8tdHJlZS12ZWN0b3JpemUiKSkpIFwKK19fYXR0cmlidXRlX18o KG9wdGltaXplKCJuby11bnNhZmUtbWF0aC1vcHRpbWl6YXRpb25zIikpKSBcCit2b2lkIGNo ZWNrXyMjRlVOIChURkxPQVQgcmVzW05dLCBURkxPQVQgYVtOXSkgXAoreyBcCisgIGludCBm YWlsZWQgPSAwOyBcCisgIGZvciAoaW50IGkgPSAwOyBpIDwgTjsgaSsrKSB7IFwKKyAgICBU RkxPQVQgZXhwZWN0ZWQgPSBGVU4gKGFbaV0pOyBcCisgICAgVEZMT0FUIGRpZmYgPSBfX2J1 aWx0aW5fZmFicyAoZXhwZWN0ZWQgLSByZXNbaV0pOyBcCisgICAgaW50IGRldmlhdGlvbiA9 IGRldmlhdGlvbl8jI1RGTE9BVCAoZXhwZWN0ZWQsIHJlc1tpXSk7IFwKKyAgICBpbnQgZmFp bCA9IGlzbmFuIChyZXNbaV0pICE9IGlzbmFuIChleHBlY3RlZCkgXAorICAgICAgICAgICAg ICAgfHwgaXNpbmYgKHJlc1tpXSkgIT0gaXNpbmYgKGV4cGVjdGVkKSBcCisgICAgICAgICAg ICAgICB8fCAoZGlmZiA+IEVQU0lMT05fIyNURkxPQVQgJiYgZGV2aWF0aW9uID4gMTApOyBc CisgICAgZmFpbGVkIHw9IGZhaWw7IFwKKyAgICBpZiAoVkVSQk9TRSB8fCBmYWlsKSBcCisg ICAgICBQUklOVEYgKCNGVU4gIiglZikgPSAlZiwgZXhwZWN0ZWQgPSAlZiwgZGlmZiA9ICVm LCBkZXZpYXRpb24gPSAlZCAlc1xuIiwgXAorICAgICAgICAgICAgICBhW2ldLCByZXNbaV0s IGV4cGVjdGVkLCBkaWZmLCBkZXZpYXRpb24sIGZhaWwgPyAiKCEpIiA6ICIiKTsgXAorICAg IGlmIChFQVJMWV9FWElUICYmIGZhaWwpIFwKKyAgICAgIGV4aXQgKDEpOyBcCisgIH0gXAor fSBcCit2b2lkIHRlc3RfIyNGVU4gKHZvaWQpIFwKK3sgXAorICBURkxPQVQgcmVzW05dLCBh W05dOyBcCisgIGZvciAoaW50IGkgPSAwOyBpIDwgTjsgaSsrKSBcCisgICAgYVtpXSA9IExP VyArICgoSElHSCAtIExPVykgLyBOKSAqIGk7IFwKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBO OyBpKyspIFwKKyAgICByZXNbaV0gPSBGVU4gKGFbaV0pOyBcCisgIGNoZWNrXyMjRlVOIChy ZXMsIGEpOyBcCit9XAordGVzdF8jI0ZVTiAoKTsKKworI2RlZmluZSBURVNUX0ZVTjIoVEZM T0FULCBMT1cxLCBISUdIMSwgTE9XMiwgSElHSDIsIEZVTikgXAorX19hdHRyaWJ1dGVfXygo b3B0aW1pemUoIm5vLXRyZWUtdmVjdG9yaXplIikpKSBcCitfX2F0dHJpYnV0ZV9fKChvcHRp bWl6ZSgibm8tdW5zYWZlLW1hdGgtb3B0aW1pemF0aW9ucyIpKSkgXAordm9pZCBjaGVja18j I0ZVTiAoVEZMT0FUIHJlc1tOXSwgVEZMT0FUIGFbTl0sIFRGTE9BVCBiW05dKSBcCit7IFwK KyAgaW50IGZhaWxlZCA9IDA7IFwKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBOOyBpKyspIHsg XAorICAgIFRGTE9BVCBleHBlY3RlZCA9IEZVTiAoYVtpXSwgYltpXSk7IFwKKyAgICBURkxP QVQgZGlmZiA9IF9fYnVpbHRpbl9mYWJzIChleHBlY3RlZCAtIHJlc1tpXSk7IFwKKyAgICBp bnQgZGV2aWF0aW9uID0gZGV2aWF0aW9uXyMjVEZMT0FUIChleHBlY3RlZCwgcmVzW2ldKTsg XAorICAgIGludCBmYWlsID0gaXNuYW4gKHJlc1tpXSkgIT0gaXNuYW4gKGV4cGVjdGVkKSBc CisgICAgICAgICAgICAgICB8fCBpc2luZiAocmVzW2ldKSAhPSBpc2luZiAoZXhwZWN0ZWQp IFwKKyAgICAgICAgICAgICAgIHx8IChkaWZmID4gRVBTSUxPTl8jI1RGTE9BVCAmJiBkZXZp YXRpb24gPiAxMCk7IFwKKyAgICBmYWlsZWQgfD0gZmFpbDsgXAorICAgIGlmIChWRVJCT1NF IHx8IGZhaWwpIFwKKyAgICAgIFBSSU5URiAoI0ZVTiAiKCVmLCVmKSA9ICVmLCBleHBlY3Rl ZCA9ICVmLCBkaWZmID0gJWYsIGRldmlhdGlvbiA9ICVkICVzXG4iLCBcCisgICAgICAgICAg ICAgIGFbaV0sIGJbaV0sIHJlc1tpXSwgZXhwZWN0ZWQsIGRpZmYsIGRldmlhdGlvbiwgZmFp bCA/ICIoISkiIDogIiIpOyBcCisgICAgaWYgKEVBUkxZX0VYSVQgJiYgZmFpbCkgXAorICAg ICAgZXhpdCAoMSk7IFwKKyAgfSBcCit9IFwKK3ZvaWQgdGVzdF8jI0ZVTiAodm9pZCkgXAor eyBcCisgIFRGTE9BVCByZXNbTl0sIGFbTl0sIGJbTl07IFwKKyAgZm9yIChpbnQgaSA9IDA7 IGkgPCBOOyBpKyspIHsgXAorICAgIGFbaV0gPSBMT1cxICsgKChISUdIMSAtIExPVzEpIC8g TikgKiBpOyBcCisgICAgYltpXSA9IExPVzIgKyAoKEhJR0gyIC0gTE9XMikgLyBOKSAqIGk7 IFwKKyAgfSBcCisgIGZvciAoaW50IGkgPSAwOyBpIDwgTjsgaSsrKSBcCisgICAgcmVzW2ld ID0gRlVOIChhW2ldLCBiW2ldKTsgXAorICBjaGVja18jI0ZVTiAocmVzLCBhLCBiKTsgXAor fVwKK3Rlc3RfIyNGVU4gKCk7CisKK2ludCBtYWluICh2b2lkKQoreworICBURVNUX0ZVTiAo ZmxvYXQsIC0xLjEsIDEuMSwgYWNvc2YpOyAvKiB7IGRnLWZpbmFsIHsgc2Nhbi10cmVlLWR1 bXAgInY2NHNmX2Fjb3NmIiAidmVjdCIgfSB9Ki8KKyAgVEVTVF9GVU4gKGZsb2F0LCAtMTAs IDEwLCBhY29zaGYpOyAvKiB7IGRnLWZpbmFsIHsgc2Nhbi10cmVlLWR1bXAgInY2NHNmX2Fj b3NoZiIgInZlY3QiIH0gfSovCisgIFRFU1RfRlVOIChmbG9hdCwgLTEuMSwgMS4xLCBhc2lu Zik7IC8qIHsgZGctZmluYWwgeyBzY2FuLXRyZWUtZHVtcCAidjY0c2ZfYXNpbmYiICJ2ZWN0 IiB9IH0qLworICBURVNUX0ZVTiAoZmxvYXQsIC0xMCwgMTAsIGFzaW5oZik7IC8qIHsgZGct ZmluYWwgeyBzY2FuLXRyZWUtZHVtcCAidjY0c2ZfYXNpbmhmIiAidmVjdCIgfSB9Ki8KKyAg VEVTVF9GVU4gKGZsb2F0LCAtMS4xLCAxLjEsIGF0YW5mKTsgLyogeyBkZy1maW5hbCB7IHNj YW4tdHJlZS1kdW1wICJ2NjRzZl9hdGFuZiIgInZlY3QiIH0gfSovCisgIFRFU1RfRlVOMiAo ZmxvYXQsIC0yLjAsIDIuMCwgMi4wLCAtMi4wLCBhdGFuMmYpOyAvKiB7IGRnLWZpbmFsIHsg c2Nhbi10cmVlLWR1bXAgInY2NHNmX2F0YW4yZiIgInZlY3QiIH0gfSovCisgIFRFU1RfRlVO IChmbG9hdCwgLTIuMCwgMi4wLCBhdGFuaGYpOyAvKiB7IGRnLWZpbmFsIHsgc2Nhbi10cmVl LWR1bXAgInY2NHNmX2F0YW5oZiIgInZlY3QiIH0gfSovCisgIFRFU1RfRlVOMiAoZmxvYXQs IC0xMC4wLCAxMC4wLCA1LjAsIC0xNS4wLCBjb3B5c2lnbmYpOyAvKiB7IGRnLWZpbmFsIHsg c2Nhbi10cmVlLWR1bXAgInY2NHNmX2NvcHlzaWduZiIgInZlY3QiIH0gfSovCisgIFRFU1Rf RlVOIChmbG9hdCwgLTMuMTQxNTkyNjUzNTksIDMuMTQxNTkyNjUzNTksIGNvc2YpOyAvKiB7 IGRnLWZpbmFsIHsgc2Nhbi10cmVlLWR1bXAgInY2NHNmX2Nvc2YiICJ2ZWN0IiB9IH0qLwor ICBURVNUX0ZVTiAoZmxvYXQsIC0zLjE0MTU5MjY1MzU5LCAzLjE0MTU5MjY1MzU5LCBjb3No Zik7IC8qIHsgZGctZmluYWwgeyBzY2FuLXRyZWUtZHVtcCAidjY0c2ZfY29zaGYiICJ2ZWN0 IiB9IH0qLworICBURVNUX0ZVTiAoZmxvYXQsIC0xMC4wLCAxMC4wLCBlcmZmKTsgIC8qIHsg ZGctZmluYWwgeyBzY2FuLXRyZWUtZHVtcCAidjY0c2ZfZXJmZiIgInZlY3QiIH0gfSovCisg IFRFU1RfRlVOIChmbG9hdCwgLTEwLjAsIDEwLjAsIGV4cGYpOyAvKiB7IGRnLWZpbmFsIHsg c2Nhbi10cmVlLWR1bXAgInY2NHNmX2V4cGYiICJ2ZWN0IiB9IH0qLworICBURVNUX0ZVTiAo ZmxvYXQsIC0xMC4wLCAxMC4wLCBleHAyZik7IC8qIHsgZGctZmluYWwgeyBzY2FuLXRyZWUt ZHVtcCAidjY0c2ZfZXhwMmYiICJ2ZWN0IiB9IH0qLworICBURVNUX0ZVTjIgKGZsb2F0LCAt MTAuMCwgMTAuMCwgMTAwLjAsIC0yNS4wLCBmbW9kZik7IC8qIHsgZGctZmluYWwgeyBzY2Fu LXRyZWUtZHVtcCAidjY0c2ZfZm1vZGYiICJ2ZWN0IiB9IH0qLworICBURVNUX0ZVTiAoZmxv YXQsIC0xMC4wLCAxMC4wLCBnYW1tYWYpOyAvKiB7IGRnLWZpbmFsIHsgc2Nhbi10cmVlLWR1 bXAgInY2NHNmX2dhbW1hZiIgInZlY3QiIHsgeGZhaWwgKi0qLSp9IH0gfSovCisgIFRFU1Rf RlVOMiAoZmxvYXQsIC0xMC4wLCAxMC4wLCAxNS4wLCAtNS4wLGh5cG90Zik7IC8qIHsgZGct ZmluYWwgeyBzY2FuLXRyZWUtZHVtcCAidjY0c2ZfaHlwb3RmIiAidmVjdCIgfSB9Ki8KKyAg VEVTVF9GVU4gKGZsb2F0LCAtMTAuMCwgMTAuMCwgbGdhbW1hZik7IC8qIHsgZGctZmluYWwg eyBzY2FuLXRyZWUtZHVtcCAidjY0c2ZfbGdhbW1hZiIgInZlY3QiIHsgeGZhaWwgKi0qLSp9 IH0gfSovCisgIFRFU1RfRlVOIChmbG9hdCwgLTEuMCwgNTAuMCwgbG9nZik7IC8qIHsgZGct ZmluYWwgeyBzY2FuLXRyZWUtZHVtcCAidjY0c2ZfbG9nZiIgInZlY3QiIH0gfSovCisgIFRF U1RfRlVOIChmbG9hdCwgLTEuMCwgNTAwLjAsIGxvZzEwZik7IC8qIHsgZGctZmluYWwgeyBz Y2FuLXRyZWUtZHVtcCAidjY0c2ZfbG9nMTBmIiAidmVjdCIgfSB9Ki8KKyAgVEVTVF9GVU4g KGZsb2F0LCAtMS4wLCA2NC4wLCBsb2cyZik7IC8qIHsgZGctZmluYWwgeyBzY2FuLXRyZWUt ZHVtcCAidjY0c2ZfbG9nMmYiICJ2ZWN0IiB9IH0qLworICBURVNUX0ZVTjIgKGZsb2F0LCAt MTAwLjAsIDEwMC4wLCAxMDAuMCwgLTEwMC4wLCBwb3dmKTsgLyogeyBkZy1maW5hbCB7IHNj YW4tdHJlZS1kdW1wICJ2NjRzZl9wb3dmIiAidmVjdCIgfSB9Ki8KKyAgVEVTVF9GVU4yIChm bG9hdCwgLTUwLjAsIDEwMC4wLCAtMi4wLCA0MC4wLCByZW1haW5kZXJmKTsgLyogeyBkZy1m aW5hbCB7IHNjYW4tdHJlZS1kdW1wICJ2NjRzZl9yZW1haW5kZXJmIiAidmVjdCIgfSB9Ki8K KyAgVEVTVF9GVU4gKGZsb2F0LCAtNTAuMCwgNTAuMCwgcmludGYpOyAgLyogeyBkZy1maW5h bCB7IHNjYW4tdHJlZS1kdW1wICJ2NjRzZl9yaW50ZiIgInZlY3QiIH0gfSovCisgIFRFU1Rf RlVOMiAoZmxvYXQsIC01MC4wLCA1MC4wLCAtMTAuMCwgMzIuMCwgX19idWlsdGluX3NjYWxi Zik7IC8qIHsgZGctZmluYWwgeyBzY2FuLXRyZWUtZHVtcCAidjY0c2Zfc2NhbGJmIiAidmVj dCIgfSB9Ki8KKyAgVEVTVF9GVU4gKGZsb2F0LCAtMTAuMCwgMTAuMCwgX19idWlsdGluX3Np Z25pZmljYW5kZik7IC8qIHsgZGctZmluYWwgeyBzY2FuLXRyZWUtZHVtcCAidjY0c2Zfc2ln bmlmaWNhbmRmIiAidmVjdCIgfSB9Ki8KKyAgVEVTVF9GVU4gKGZsb2F0LCAtMy4xNDE1OTI2 NTM1OSwgMy4xNDE1OTI2NTM1OSwgc2luZik7IC8qIHsgZGctZmluYWwgeyBzY2FuLXRyZWUt ZHVtcCAidjY0c2Zfc2luZiIgInZlY3QiIH0gfSovCisgIFRFU1RfRlVOIChmbG9hdCwgLTMu MTQxNTkyNjUzNTksIDMuMTQxNTkyNjUzNTksIHNpbmhmKTsgLyogeyBkZy1maW5hbCB7IHNj YW4tdHJlZS1kdW1wICJ2NjRzZl9zaW5oZiIgInZlY3QiIH0gfSovCisgIFRFU1RfRlVOIChm bG9hdCwgLTAuMSwgMTAwMDAuMCwgc3FydGYpOyAvKiB7IGRnLWZpbmFsIHsgc2Nhbi10cmVl LWR1bXAgInY2NHNmX3NxcnRmIiAidmVjdCIgfSB9Ki8KKyAgVEVTVF9GVU4gKGZsb2F0LCAt NS4wLCA1LjAsIHRhbmYpOyAvKiB7IGRnLWZpbmFsIHsgc2Nhbi10cmVlLWR1bXAgInY2NHNm X3RhbmYiICJ2ZWN0IiB9IH0qLworICBURVNUX0ZVTiAoZmxvYXQsIC0zLjE0MTU5MjY1MzU5 LCAzLjE0MTU5MjY1MzU5LCB0YW5oZik7IC8qIHsgZGctZmluYWwgeyBzY2FuLXRyZWUtZHVt cCAidjY0c2ZfdGFuaGYiICJ2ZWN0IiB9IH0qLworICBURVNUX0ZVTiAoZmxvYXQsIC0xMC4w LCAxMC4wLCB0Z2FtbWFmKTsgLyogeyBkZy1maW5hbCB7IHNjYW4tdHJlZS1kdW1wICJ2NjRz Zl90Z2FtbWFmIiAidmVjdCIgfSB9Ki8KKworICBURVNUX0ZVTiAoZG91YmxlLCAtMS4xLCAx LjEsIGFjb3MpOyAvKiB7IGRnLWZpbmFsIHsgc2Nhbi10cmVlLWR1bXAgInY2NGRmX2Fjb3Mi ICJ2ZWN0IiB9IH0qLworICBURVNUX0ZVTiAoZG91YmxlLCAtMTAsIDEwLCBhY29zaCk7IC8q IHsgZGctZmluYWwgeyBzY2FuLXRyZWUtZHVtcCAidjY0ZGZfYWNvc2giICJ2ZWN0IiB9IH0q LworICBURVNUX0ZVTiAoZG91YmxlLCAtMS4xLCAxLjEsIGFzaW4pOyAvKiB7IGRnLWZpbmFs IHsgc2Nhbi10cmVlLWR1bXAgInY2NGRmX2FzaW4iICJ2ZWN0IiB9IH0qLworICBURVNUX0ZV TiAoZG91YmxlLCAtMTAsIDEwLCBhc2luaCk7IC8qIHsgZGctZmluYWwgeyBzY2FuLXRyZWUt ZHVtcCAidjY0ZGZfYXNpbmgiICJ2ZWN0IiB9IH0qLworICBURVNUX0ZVTiAoZG91YmxlLCAt MS4xLCAxLjEsIGF0YW4pOyAvKiB7IGRnLWZpbmFsIHsgc2Nhbi10cmVlLWR1bXAgInY2NGRm X2F0YW4iICJ2ZWN0IiB9IH0qLworICBURVNUX0ZVTjIgKGRvdWJsZSwgLTIuMCwgMi4wLCAy LjAsIC0yLjAsIGF0YW4yKTsgLyogeyBkZy1maW5hbCB7IHNjYW4tdHJlZS1kdW1wICJ2NjRk Zl9hdGFuMiIgInZlY3QiIH0gfSovCisgIFRFU1RfRlVOIChkb3VibGUsIC0yLjAsIDIuMCwg YXRhbmgpOyAvKiB7IGRnLWZpbmFsIHsgc2Nhbi10cmVlLWR1bXAgInY2NGRmX2F0YW5oIiAi dmVjdCIgfSB9Ki8KKyAgVEVTVF9GVU4yIChkb3VibGUsIC0xMC4wLCAxMC4wLCA1LjAsIC0x NS4wLCBjb3B5c2lnbik7IC8qIHsgZGctZmluYWwgeyBzY2FuLXRyZWUtZHVtcCAidjY0ZGZf Y29weXNpZ24iICJ2ZWN0IiB9IH0qLworICBURVNUX0ZVTiAoZG91YmxlLCAtMy4xNDE1OTI2 NTM1OSwgMy4xNDE1OTI2NTM1OSwgY29zKTsgLyogeyBkZy1maW5hbCB7IHNjYW4tdHJlZS1k dW1wICJ2NjRkZl9jb3MiICJ2ZWN0IiB9IH0qLworICBURVNUX0ZVTiAoZG91YmxlLCAtMy4x NDE1OTI2NTM1OSwgMy4xNDE1OTI2NTM1OSwgY29zaCk7IC8qIHsgZGctZmluYWwgeyBzY2Fu LXRyZWUtZHVtcCAidjY0ZGZfY29zaCIgInZlY3QiIH0gfSovCisgIFRFU1RfRlVOIChkb3Vi bGUsIC0xMC4wLCAxMC4wLCBlcmYpOyAvKiB7IGRnLWZpbmFsIHsgc2Nhbi10cmVlLWR1bXAg InY2NGRmX2VyZiIgInZlY3QiIH0gfSovCisgIFRFU1RfRlVOIChkb3VibGUsIC0xMC4wLCAx MC4wLCBleHApOyAvKiB7IGRnLWZpbmFsIHsgc2Nhbi10cmVlLWR1bXAgInY2NGRmX2V4cCIg InZlY3QiIH0gfSovCisgIFRFU1RfRlVOIChkb3VibGUsIC0xMC4wLCAxMC4wLCBleHAyKTsg LyogeyBkZy1maW5hbCB7IHNjYW4tdHJlZS1kdW1wICJ2NjRkZl9leHAyIiAidmVjdCIgfSB9 Ki8KKyAgVEVTVF9GVU4yIChkb3VibGUsIC0xMC4wLCAxMC4wLCAxMDAuMCwgLTI1LjAsIGZt b2QpOyAvKiB7IGRnLWZpbmFsIHsgc2Nhbi10cmVlLWR1bXAgInY2NGRmX2Ztb2QiICJ2ZWN0 IiB9IH0qLworICBURVNUX0ZVTiAoZG91YmxlLCAtMTAuMCwgMTAuMCwgZ2FtbWEpOyAvKiB7 IGRnLWZpbmFsIHsgc2Nhbi10cmVlLWR1bXAgInY2NGRmX2dhbW1hIiAidmVjdCIgeyB4ZmFp bCAqLSotKn0gfSB9Ki8KKyAgVEVTVF9GVU4yIChkb3VibGUsIC0xMC4wLCAxMC4wLCAxNS4w LCAtNS4wLCBoeXBvdCk7IC8qIHsgZGctZmluYWwgeyBzY2FuLXRyZWUtZHVtcCAidjY0ZGZf aHlwb3QiICJ2ZWN0IiB9IH0qLworICBURVNUX0ZVTiAoZG91YmxlLCAtMTAuMCwgMTAuMCwg bGdhbW1hKTsgLyogeyBkZy1maW5hbCB7IHNjYW4tdHJlZS1kdW1wICJ2NjRkZl9sZ2FtbWEi ICJ2ZWN0IiB7IHhmYWlsICotKi0qfSB9IH0qLworICBURVNUX0ZVTiAoZG91YmxlLCAtMS4w LCA1MC4wLCBsb2cpOyAvKiB7IGRnLWZpbmFsIHsgc2Nhbi10cmVlLWR1bXAgInY2NGRmX2xv ZyIgInZlY3QiIH0gfSovCisgIFRFU1RfRlVOIChkb3VibGUsIC0xLjAsIDUwMC4wLCBsb2cx MCk7IC8qIHsgZGctZmluYWwgeyBzY2FuLXRyZWUtZHVtcCAidjY0ZGZfbG9nMTAiICJ2ZWN0 IiB9IH0qLworICBURVNUX0ZVTiAoZG91YmxlLCAtMS4wLCA2NC4wLCBsb2cyKTsgLyogeyBk Zy1maW5hbCB7IHNjYW4tdHJlZS1kdW1wICJ2NjRkZl9sb2cyIiAidmVjdCIgeyB4ZmFpbCAq LSotKn0gfSB9Ki8KKyAgVEVTVF9GVU4yIChkb3VibGUsIC0xMDAuMCwgMTAwLjAsIDEwMC4w LCAtMTAwLjAsIHBvdyk7IC8qIHsgZGctZmluYWwgeyBzY2FuLXRyZWUtZHVtcCAidjY0ZGZf cG93IiAidmVjdCIgfSB9Ki8KKyAgVEVTVF9GVU4yIChkb3VibGUsIC01MC4wLCAxMDAuMCwg LTIuMCwgNDAuMCwgcmVtYWluZGVyKTsgLyogeyBkZy1maW5hbCB7IHNjYW4tdHJlZS1kdW1w ICJ2NjRkZl9yZW1haW5kZXIiICJ2ZWN0IiB9IH0qLworICBURVNUX0ZVTiAoZG91YmxlLCAt NTAuMCwgNTAuMCwgcmludCk7IC8qIHsgZGctZmluYWwgeyBzY2FuLXRyZWUtZHVtcCAidjY0 ZGZfcmludCIgInZlY3QiIH0gfSovCisgIFRFU1RfRlVOMiAoZG91YmxlLCAtNTAuMCwgNTAu MCwgLTEwLjAsIDMyLjAsIF9fYnVpbHRpbl9zY2FsYik7IC8qIHsgZGctZmluYWwgeyBzY2Fu LXRyZWUtZHVtcCAidjY0ZGZfc2NhbGIiICJ2ZWN0IiB9IH0qLworICBURVNUX0ZVTiAoZG91 YmxlLCAtMTAuMCwgMTAuMCwgX19idWlsdGluX3NpZ25pZmljYW5kKTsgLyogeyBkZy1maW5h bCB7IHNjYW4tdHJlZS1kdW1wICJ2NjRkZl9zaWduaWZpY2FuZCIgInZlY3QiIH0gfSovCisg IFRFU1RfRlVOIChkb3VibGUsIC0zLjE0MTU5MjY1MzU5LCAzLjE0MTU5MjY1MzU5LCBzaW4p OyAvKiB7IGRnLWZpbmFsIHsgc2Nhbi10cmVlLWR1bXAgInY2NGRmX3NpbiIgInZlY3QiIH0g fSovCisgIFRFU1RfRlVOIChkb3VibGUsIC0zLjE0MTU5MjY1MzU5LCAzLjE0MTU5MjY1MzU5 LCBzaW5oKTsgLyogeyBkZy1maW5hbCB7IHNjYW4tdHJlZS1kdW1wICJ2NjRkZl9zaW5oIiAi dmVjdCIgfSB9Ki8KKyAgVEVTVF9GVU4gKGRvdWJsZSwgLTAuMSwgMTAwMDAuMCwgc3FydCk7 IC8qIHsgZGctZmluYWwgeyBzY2FuLXRyZWUtZHVtcCAidjY0ZGZfc3FydCIgInZlY3QiIH0g fSovCisgIFRFU1RfRlVOIChkb3VibGUsIC01LjAsIDUuMCwgdGFuKTsgLyogeyBkZy1maW5h bCB7IHNjYW4tdHJlZS1kdW1wICJ2NjRkZl90YW4iICJ2ZWN0IiB9IH0qLworICBURVNUX0ZV TiAoZG91YmxlLCAtMy4xNDE1OTI2NTM1OSwgMy4xNDE1OTI2NTM1OSwgdGFuaCk7IC8qIHsg ZGctZmluYWwgeyBzY2FuLXRyZWUtZHVtcCAidjY0ZGZfdGFuaCIgInZlY3QiIH0gfSovCisg IFRFU1RfRlVOIChkb3VibGUsIC0xMC4wLCAxMC4wLCB0Z2FtbWEpOyAvKiB7IGRnLWZpbmFs IHsgc2Nhbi10cmVlLWR1bXAgInY2NGRmX3RnYW1tYSIgInZlY3QiIH0gfSovCisKKyAgcmV0 dXJuIGZhaWxlZDsKK30KZGlmZiAtLWdpdCBhL2djYy90ZXN0c3VpdGUvZ2NjLnRhcmdldC9n Y24vc2ltZC1tYXRoLTIuYyBiL2djYy90ZXN0c3VpdGUvZ2NjLnRhcmdldC9nY24vc2ltZC1t YXRoLTIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMC4uMzc1YTJh ZDkyNjMKLS0tIC9kZXYvbnVsbAorKysgYi9nY2MvdGVzdHN1aXRlL2djYy50YXJnZXQvZ2Nu L3NpbWQtbWF0aC0yLmMKQEAgLTAsMCArMSw4IEBACisvKiBDaGVjayB0aGF0IHRoZSBTSU1E IHZlcnNpb25zIG9mIG1hdGggcm91dGluZXMgZ2l2ZSB0aGUgc2FtZSAob3IKKyAgIHN1ZmZp Y2llbnRseSBjbG9zZSkgcmVzdWx0cyBhcyB0aGVpciBzY2FsYXIgZXF1aXZhbGVudHMuICAq LworCisvKiB7IGRnLWRvIHJ1biB9ICovCisvKiB7IGRnLW9wdGlvbnMgIi1PMiAtZnRyZWUt dmVjdG9yaXplIC1mbm8tbWF0aC1lcnJubyIgfSAqLworLyogeyBkZy1zZXQtdGFyZ2V0LWVu di12YXIgIkdDTl9TVEFDS19TSVpFIiAiMzAwMDAwMCIgfSAqLworCisjaW5jbHVkZSAic2lt ZC1tYXRoLTEuYyIKZGlmZiAtLWdpdCBhL2xpYmdvbXAvdGVzdHN1aXRlL2xpYmdvbXAuYy9z aW1kLW1hdGgtMS5jIGIvbGliZ29tcC90ZXN0c3VpdGUvbGliZ29tcC5jL3NpbWQtbWF0aC0x LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAuLjk0N2JmNjA2ZTM2 Ci0tLSAvZGV2L251bGwKKysrIGIvbGliZ29tcC90ZXN0c3VpdGUvbGliZ29tcC5jL3NpbWQt bWF0aC0xLmMKQEAgLTAsMCArMSwyMTcgQEAKKy8qIENoZWNrIHRoYXQgdGhlIFNJTUQgdmVy c2lvbnMgb2YgbWF0aCByb3V0aW5lcyBnaXZlIHRoZSBzYW1lIChvcgorICAgc3VmZmljaWVu dGx5IGNsb3NlKSByZXN1bHRzIGFzIHRoZWlyIHNjYWxhciBlcXVpdmFsZW50cy4gICovCisK Ky8qIHsgZGctZG8gcnVuIH0gKi8KKy8qIHsgZGctb3B0aW9ucyAiLU8yIC1mdHJlZS12ZWN0 b3JpemUgLWZuby1tYXRoLWVycm5vIiB9ICovCisvKiB7IGRnLWFkZGl0aW9uYWwtb3B0aW9u cyAtZm9mZmxvYWQtb3B0aW9ucz1hbWRnY24tYW1kaHNhPS1tc3RhY2stc2l6ZT0zMDAwMDAw IHsgdGFyZ2V0IG9mZmxvYWRfdGFyZ2V0X2FtZGdjbiB9IH0gKi8KKy8qIHsgZGctYWRkaXRp b25hbC1vcHRpb25zIC1mb2ZmbG9hZC1vcHRpb25zPS1sbSB9ICovCisKKyN1bmRlZiBQUklO VF9SRVNVTFQKKyNkZWZpbmUgVkVSQk9TRSAwCisjZGVmaW5lIEVBUkxZX0VYSVQgMQorCisj aW5jbHVkZSA8bWF0aC5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorCisjaWZkZWYgUFJJTlRf UkVTVUxUCisgICNpbmNsdWRlIDxzdGRpby5oPgorICAjZGVmaW5lIFBSSU5URiBwcmludGYK KyNlbHNlCisgIHN0YXRpYyB2b2lkIG51bGxfcHJpbnRmIChjb25zdCBjaGFyICpmLCAuLi4p IHsgfQorCisgICNkZWZpbmUgUFJJTlRGIG51bGxfcHJpbnRmCisjZW5kaWYKKworI2RlZmlu ZSBOIDUxMgorI2RlZmluZSBFUFNJTE9OX2Zsb2F0IDFlLTUKKyNkZWZpbmUgRVBTSUxPTl9k b3VibGUgMWUtMTAKKworc3RhdGljIGludCB4ZmFpbCA9IDA7CitzdGF0aWMgaW50IGZhaWxl ZCA9IDA7CisKK2ludCBkZXZpYXRpb25fZmxvYXQgKGZsb2F0IHgsIGZsb2F0IHkpCit7Cisg IHVuaW9uIHsKKyAgICBmbG9hdCBmOworICAgIHVuc2lnbmVkIHU7CisgIH0gdSwgdjsKKwor ICB1LmYgPSB4OworICB2LmYgPSB5OworCisgIHVuc2lnbmVkIG1hc2sgPSAweDgwMDAwMDAw VTsKKyAgaW50IGk7CisKKyAgZm9yIChpID0gMzI7IGkgPiAwOyBpLS0pCisgICAgaWYgKCh1 LnUgXiB2LnUpICYgbWFzaykKKyAgICAgIGJyZWFrOworICAgIGVsc2UKKyAgICAgIG1hc2sg Pj49IDE7CisKKyAgcmV0dXJuIGk7Cit9CisKK2ludCBkZXZpYXRpb25fZG91YmxlIChkb3Vi bGUgeCwgZG91YmxlIHkpCit7CisgIHVuaW9uIHsKKyAgICBkb3VibGUgZDsKKyAgICB1bnNp Z25lZCBsb25nIGxvbmcgdTsKKyAgfSB1LCB2OworCisgIHUuZCA9IHg7CisgIHYuZCA9IHk7 CisKKyAgdW5zaWduZWQgbG9uZyBsb25nIG1hc2sgPSAweDgwMDAwMDAwMDAwMDAwMDBVTEw7 CisgIGludCBpOworCisgIGZvciAoaSA9IDY0OyBpID4gMDsgaS0tKQorICAgIGlmICgodS51 IF4gdi51KSAmIG1hc2spCisgICAgICBicmVhazsKKyAgICBlbHNlCisgICAgICBtYXNrID4+ PSAxOworCisgIHJldHVybiBpOworfQorCisjZGVmaW5lIFRFU1RfRlVOX1hGQUlMKFRGTE9B VCwgTE9XLCBISUdILCBGVU4pIFwKKyAgeGZhaWwgPSAxOyBcCisgIFRFU1RfRlVOIChURkxP QVQsIExPVywgSElHSCwgRlVOKTsgXAorICB4ZmFpbCA9IDA7CisKKyNkZWZpbmUgVEVTVF9G VU4oVEZMT0FULCBMT1csIEhJR0gsIEZVTikgXAorX19hdHRyaWJ1dGVfXygob3B0aW1pemUo Im5vLXRyZWUtdmVjdG9yaXplIikpKSBcCitfX2F0dHJpYnV0ZV9fKChvcHRpbWl6ZSgibm8t dW5zYWZlLW1hdGgtb3B0aW1pemF0aW9ucyIpKSkgXAordm9pZCBjaGVja18jI0ZVTiAoVEZM T0FUIHJlc1tOXSwgVEZMT0FUIGFbTl0pIFwKK3sgXAorICBmb3IgKGludCBpID0gMDsgaSA8 IE47IGkrKykgeyBcCisgICAgVEZMT0FUIGV4cGVjdGVkID0gRlVOIChhW2ldKTsgXAorICAg IFRGTE9BVCBkaWZmID0gX19idWlsdGluX2ZhYnMgKGV4cGVjdGVkIC0gcmVzW2ldKTsgXAor ICAgIGludCBkZXZpYXRpb24gPSBkZXZpYXRpb25fIyNURkxPQVQgKGV4cGVjdGVkLCByZXNb aV0pOyBcCisgICAgaW50IGZhaWwgPSBpc25hbiAocmVzW2ldKSAhPSBpc25hbiAoZXhwZWN0 ZWQpIFwKKwkgICAgICAgfHwgaXNpbmYgKHJlc1tpXSkgIT0gaXNpbmYgKGV4cGVjdGVkKSBc CisJICAgICAgIHx8IChkaWZmID4gRVBTSUxPTl8jI1RGTE9BVCAmJiBkZXZpYXRpb24gPiAx MCk7IFwKKyAgICBpZiAoVkVSQk9TRSB8fCBmYWlsKSBcCisgICAgICBQUklOVEYgKCNGVU4g IiglZikgPSAlZiwgZXhwZWN0ZWQgPSAlZiwgZGlmZiA9ICVmLCBkZXZpYXRpb24gPSAlZCAl c1xuIiwgXAorCSAgICAgIGFbaV0sIHJlc1tpXSwgZXhwZWN0ZWQsIGRpZmYsIGRldmlhdGlv biwgZmFpbCA/ICIoISkiIDogIiIpOyBcCisgICAgZmFpbGVkIHw9IChmYWlsICYmICF4ZmFp bCk7IFwKKyAgICBpZiAoRUFSTFlfRVhJVCAmJiBmYWlsZWQpIFwKKyAgICAgIGV4aXQgKDEp OyBcCisgIH0gXAorfSBcCit2b2lkIHRlc3RfIyNGVU4gKHZvaWQpIFwKK3sgXAorICBURkxP QVQgcmVzW05dLCBhW05dOyBcCisgIGZvciAoaW50IGkgPSAwOyBpIDwgTjsgaSsrKSBcCisg ICAgYVtpXSA9IExPVyArICgoSElHSCAtIExPVykgLyBOKSAqIGk7IFwKKyAgX1ByYWdtYSAo Im9tcCB0YXJnZXQgcGFyYWxsZWwgZm9yIHNpbWQgbWFwKHRvOmEpIG1hcChmcm9tOnJlcyki KSBcCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBOOyBpKyspIFwKKyAgICAgIHJlc1tpXSA9 IEZVTiAoYVtpXSk7IFwKKyAgY2hlY2tfIyNGVU4gKHJlcywgYSk7IFwKK31cCit0ZXN0XyMj RlVOICgpOworCisjZGVmaW5lIFRFU1RfRlVOMihURkxPQVQsIExPVzEsIEhJR0gxLCBMT1cy LCBISUdIMiwgRlVOKSBcCitfX2F0dHJpYnV0ZV9fKChvcHRpbWl6ZSgibm8tdHJlZS12ZWN0 b3JpemUiKSkpIFwKK19fYXR0cmlidXRlX18oKG9wdGltaXplKCJuby11bnNhZmUtbWF0aC1v cHRpbWl6YXRpb25zIikpKSBcCit2b2lkIGNoZWNrXyMjRlVOIChURkxPQVQgcmVzW05dLCBU RkxPQVQgYVtOXSwgVEZMT0FUIGJbTl0pIFwKK3sgXAorICBpbnQgZmFpbGVkID0gMDsgXAor ICBmb3IgKGludCBpID0gMDsgaSA8IE47IGkrKykgeyBcCisgICAgVEZMT0FUIGV4cGVjdGVk ID0gRlVOIChhW2ldLCBiW2ldKTsgXAorICAgIFRGTE9BVCBkaWZmID0gX19idWlsdGluX2Zh YnMgKGV4cGVjdGVkIC0gcmVzW2ldKTsgXAorICAgIGludCBkZXZpYXRpb24gPSBkZXZpYXRp b25fIyNURkxPQVQgKGV4cGVjdGVkLCByZXNbaV0pOyBcCisgICAgaW50IGZhaWwgPSBpc25h biAocmVzW2ldKSAhPSBpc25hbiAoZXhwZWN0ZWQpIFwKKwkgICAgICAgfHwgaXNpbmYgKHJl c1tpXSkgIT0gaXNpbmYgKGV4cGVjdGVkKSBcCisJICAgICAgIHx8IChkaWZmID4gRVBTSUxP Tl8jI1RGTE9BVCAmJiBkZXZpYXRpb24gPiAxMCk7IFwKKyAgICBmYWlsZWQgfD0gZmFpbDsg XAorICAgIGlmIChWRVJCT1NFIHx8IGZhaWwpIFwKKyAgICAgIFBSSU5URiAoI0ZVTiAiKCVm LCVmKSA9ICVmLCBleHBlY3RlZCA9ICVmLCBkaWZmID0gJWYsIGRldmlhdGlvbiA9ICVkICVz XG4iLCBcCisJICAgICAgYVtpXSwgYltpXSwgcmVzW2ldLCBleHBlY3RlZCwgZGlmZiwgZGV2 aWF0aW9uLCBmYWlsID8gIighKSIgOiAiIik7IFwKKyAgICBpZiAoRUFSTFlfRVhJVCAmJiBm YWlsKSBcCisgICAgICBleGl0ICgxKTsgXAorICB9IFwKK30gXAordm9pZCB0ZXN0XyMjRlVO ICh2b2lkKSBcCit7IFwKKyAgVEZMT0FUIHJlc1tOXSwgYVtOXSwgYltOXTsgXAorICBmb3Ig KGludCBpID0gMDsgaSA8IE47IGkrKykgeyBcCisgICAgYVtpXSA9IExPVzEgKyAoKEhJR0gx IC0gTE9XMSkgLyBOKSAqIGk7IFwKKyAgICBiW2ldID0gTE9XMiArICgoSElHSDIgLSBMT1cy KSAvIE4pICogaTsgXAorICB9IFwKKyAgX1ByYWdtYSAoIm9tcCB0YXJnZXQgcGFyYWxsZWwg Zm9yIHNpbWQgbWFwKHRvOmEpIG1hcChmcm9tOnJlcykiKSBcCisgICAgZm9yIChpbnQgaSA9 IDA7IGkgPCBOOyBpKyspIFwKKyAgICAgIHJlc1tpXSA9IEZVTiAoYVtpXSwgYltpXSk7IFwK KyAgY2hlY2tfIyNGVU4gKHJlcywgYSwgYik7IFwKK31cCit0ZXN0XyMjRlVOICgpOworCitp bnQgbWFpbiAodm9pZCkKK3sKKyAgVEVTVF9GVU4gKGZsb2F0LCAtMS4xLCAxLjEsIGFjb3Nm KTsKKyAgVEVTVF9GVU4gKGZsb2F0LCAtMTAsIDEwLCBhY29zaGYpOworICBURVNUX0ZVTiAo ZmxvYXQsIC0xLjEsIDEuMSwgYXNpbmYpOworICBURVNUX0ZVTiAoZmxvYXQsIC0xMCwgMTAs IGFzaW5oZik7CisgIFRFU1RfRlVOIChmbG9hdCwgLTEuMSwgMS4xLCBhdGFuZik7CisgIFRF U1RfRlVOMiAoZmxvYXQsIC0yLjAsIDIuMCwgMi4wLCAtMi4wLCBhdGFuMmYpOworICBURVNU X0ZVTiAoZmxvYXQsIC0yLjAsIDIuMCwgYXRhbmhmKTsKKyAgVEVTVF9GVU4yIChmbG9hdCwg LTEwLjAsIDEwLjAsIDUuMCwgLTE1LjAsIGNvcHlzaWduZik7CisgIFRFU1RfRlVOIChmbG9h dCwgLTMuMTQxNTkyNjUzNTksIDMuMTQxNTkyNjUzNTksIGNvc2YpOworICBURVNUX0ZVTiAo ZmxvYXQsIC0zLjE0MTU5MjY1MzU5LCAzLjE0MTU5MjY1MzU5LCBjb3NoZik7CisgIFRFU1Rf RlVOIChmbG9hdCwgLTEwLjAsIDEwLjAsIGVyZmYpOworICBURVNUX0ZVTiAoZmxvYXQsIC0x MC4wLCAxMC4wLCBleHBmKTsKKyAgVEVTVF9GVU4gKGZsb2F0LCAtMTAuMCwgMTAuMCwgZXhw MmYpOworICBURVNUX0ZVTjIgKGZsb2F0LCAtMTAuMCwgMTAuMCwgMTAwLjAsIC0yNS4wLCBm bW9kZik7CisgIFRFU1RfRlVOIChmbG9hdCwgLTEwLjAsIDEwLjAsIGdhbW1hZik7CisgIFRF U1RfRlVOMiAoZmxvYXQsIC0xMC4wLCAxMC4wLCAxNS4wLCAtNS4wLGh5cG90Zik7CisgIFRF U1RfRlVOIChmbG9hdCwgLTEwLjAsIDEwLjAsIGxnYW1tYWYpOworICBURVNUX0ZVTiAoZmxv YXQsIC0xLjAsIDUwLjAsIGxvZ2YpOworICBURVNUX0ZVTiAoZmxvYXQsIC0xLjAsIDUwMC4w LCBsb2cxMGYpOworICBURVNUX0ZVTiAoZmxvYXQsIC0xLjAsIDY0LjAsIGxvZzJmKTsKKyAg VEVTVF9GVU4yIChmbG9hdCwgLTEwMC4wLCAxMDAuMCwgMTAwLjAsIC0xMDAuMCwgcG93Zik7 CisgIFRFU1RfRlVOMiAoZmxvYXQsIC01MC4wLCAxMDAuMCwgLTIuMCwgNDAuMCwgcmVtYWlu ZGVyZik7CisgIFRFU1RfRlVOIChmbG9hdCwgLTUwLjAsIDUwLjAsIHJpbnRmKTsKKyAgVEVT VF9GVU4yIChmbG9hdCwgLTUwLjAsIDUwLjAsIC0xMC4wLCAzMi4wLCBfX2J1aWx0aW5fc2Nh bGJmKTsKKyAgVEVTVF9GVU4gKGZsb2F0LCAtMTAuMCwgMTAuMCwgX19idWlsdGluX3NpZ25p ZmljYW5kZik7CisgIFRFU1RfRlVOIChmbG9hdCwgLTMuMTQxNTkyNjUzNTksIDMuMTQxNTky NjUzNTksIHNpbmYpOworICBURVNUX0ZVTiAoZmxvYXQsIC0zLjE0MTU5MjY1MzU5LCAzLjE0 MTU5MjY1MzU5LCBzaW5oZik7CisgIFRFU1RfRlVOIChmbG9hdCwgLTAuMSwgMTAwMDAuMCwg c3FydGYpOworICBURVNUX0ZVTiAoZmxvYXQsIC01LjAsIDUuMCwgdGFuZik7CisgIFRFU1Rf RlVOIChmbG9hdCwgLTMuMTQxNTkyNjUzNTksIDMuMTQxNTkyNjUzNTksIHRhbmhmKTsKKyAg LyogTmV3bGliJ3MgdmVyc2lvbiBvZiB0Z2FtbWFmIGlzIGtub3duIHRvIGhhdmUgcG9vciBh Y2N1cmFjeS4gICovCisgIFRFU1RfRlVOX1hGQUlMIChmbG9hdCwgLTEwLjAsIDEwLjAsIHRn YW1tYWYpOworCisgIFRFU1RfRlVOIChkb3VibGUsIC0xLjEsIDEuMSwgYWNvcyk7CisgIFRF U1RfRlVOIChkb3VibGUsIC0xMCwgMTAsIGFjb3NoKTsKKyAgVEVTVF9GVU4gKGRvdWJsZSwg LTEuMSwgMS4xLCBhc2luKTsKKyAgVEVTVF9GVU4gKGRvdWJsZSwgLTEwLCAxMCwgYXNpbmgp OworICBURVNUX0ZVTiAoZG91YmxlLCAtMS4xLCAxLjEsIGF0YW4pOworICBURVNUX0ZVTjIg KGRvdWJsZSwgLTIuMCwgMi4wLCAyLjAsIC0yLjAsIGF0YW4yKTsKKyAgVEVTVF9GVU4gKGRv dWJsZSwgLTIuMCwgMi4wLCBhdGFuaCk7CisgIFRFU1RfRlVOMiAoZG91YmxlLCAtMTAuMCwg MTAuMCwgNS4wLCAtMTUuMCwgY29weXNpZ24pOworICBURVNUX0ZVTiAoZG91YmxlLCAtMy4x NDE1OTI2NTM1OSwgMy4xNDE1OTI2NTM1OSwgY29zKTsKKyAgVEVTVF9GVU4gKGRvdWJsZSwg LTMuMTQxNTkyNjUzNTksIDMuMTQxNTkyNjUzNTksIGNvc2gpOworICBURVNUX0ZVTiAoZG91 YmxlLCAtMTAuMCwgMTAuMCwgZXJmKTsKKyAgVEVTVF9GVU4gKGRvdWJsZSwgLTEwLjAsIDEw LjAsIGV4cCk7CisgIFRFU1RfRlVOIChkb3VibGUsIC0xMC4wLCAxMC4wLCBleHAyKTsKKyAg VEVTVF9GVU4yIChkb3VibGUsIC0xMC4wLCAxMC4wLCAxMDAuMCwgLTI1LjAsIGZtb2QpOwor ICBURVNUX0ZVTiAoZG91YmxlLCAtMTAuMCwgMTAuMCwgZ2FtbWEpOworICBURVNUX0ZVTjIg KGRvdWJsZSwgLTEwLjAsIDEwLjAsIDE1LjAsIC01LjAsIGh5cG90KTsKKyAgVEVTVF9GVU4g KGRvdWJsZSwgLTEwLjAsIDEwLjAsIGxnYW1tYSk7CisgIFRFU1RfRlVOIChkb3VibGUsIC0x LjAsIDUwLjAsIGxvZyk7CisgIFRFU1RfRlVOIChkb3VibGUsIC0xLjAsIDUwMC4wLCBsb2cx MCk7CisgIFRFU1RfRlVOIChkb3VibGUsIC0xLjAsIDY0LjAsIGxvZzIpOworICBURVNUX0ZV TjIgKGRvdWJsZSwgLTEwMC4wLCAxMDAuMCwgMTAwLjAsIC0xMDAuMCwgcG93KTsKKyAgVEVT VF9GVU4yIChkb3VibGUsIC01MC4wLCAxMDAuMCwgLTIuMCwgNDAuMCwgcmVtYWluZGVyKTsK KyAgVEVTVF9GVU4gKGRvdWJsZSwgLTUwLjAsIDUwLjAsIHJpbnQpOworICBURVNUX0ZVTjIg KGRvdWJsZSwgLTUwLjAsIDUwLjAsIC0xMC4wLCAzMi4wLCBfX2J1aWx0aW5fc2NhbGIpOwor ICBURVNUX0ZVTiAoZG91YmxlLCAtMTAuMCwgMTAuMCwgX19idWlsdGluX3NpZ25pZmljYW5k KTsKKyAgVEVTVF9GVU4gKGRvdWJsZSwgLTMuMTQxNTkyNjUzNTksIDMuMTQxNTkyNjUzNTks IHNpbik7CisgIFRFU1RfRlVOIChkb3VibGUsIC0zLjE0MTU5MjY1MzU5LCAzLjE0MTU5MjY1 MzU5LCBzaW5oKTsKKyAgVEVTVF9GVU4gKGRvdWJsZSwgLTAuMSwgMTAwMDAuMCwgc3FydCk7 CisgIFRFU1RfRlVOIChkb3VibGUsIC01LjAsIDUuMCwgdGFuKTsKKyAgVEVTVF9GVU4gKGRv dWJsZSwgLTMuMTQxNTkyNjUzNTksIDMuMTQxNTkyNjUzNTksIHRhbmgpOworICAvKiBOZXds aWIncyB2ZXJzaW9uIG9mIHRnYW1tYSBpcyBrbm93biB0byBoYXZlIHBvb3IgYWNjdXJhY3ku ICAqLworICBURVNUX0ZVTl9YRkFJTCAoZG91YmxlLCAtMTAuMCwgMTAuMCwgdGdhbW1hKTsK KworICByZXR1cm4gZmFpbGVkOworfQotLSAKMi4yNS4xCgo= --------------TpI8htASLJfFTo0UOB453YTC--