From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-vs1-xe2c.google.com (mail-vs1-xe2c.google.com [IPv6:2607:f8b0:4864:20::e2c]) by sourceware.org (Postfix) with ESMTPS id 5277F393BC3B for ; Tue, 1 Jun 2021 02:20:49 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.3.2 sourceware.org 5277F393BC3B Received: by mail-vs1-xe2c.google.com with SMTP id j15so274162vsf.2 for ; Mon, 31 May 2021 19:20:49 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:references:in-reply-to:from:date :message-id:subject:to:cc; bh=t9kr0YxANtwb/VxPvbs93xE7druDxutozjgMakjNCEE=; b=VlR4xe6st6a/vLOnKhbZcvfXMMHIRpCOYU6pBe+Uzbo45yz0z6DsniNSFyFLNaoJOG iilmP6jLtzI5aN74UCxAANTuxypaDQoOOdDGqo/dSvRrfnPwrfc5ZeXzZaIZb4OFVj3Y TiadzyMzlWFSo4r97MlVfDtxNTOL/3mVoAn3YidJaFfbcuXirXgYjc1JFLEDxxPFKQB4 iNVmTHFiqcGeVPVjEswnTXVsVQWguS31WVGuiVDN/fcMPpYQRRk4FsPHHP9JoBkVIYMU SGbNw4QiopgixhPCbA5fauusoMWFLE+cXS1ck+XQ1lf7E38+EqEa9zNDIfSykFGjDW1U l5sg== X-Gm-Message-State: AOAM530I3E/bgJOhsyLSSjRKi4lPRVHkcD+21+qhjnkwtXtT+aF52ahM N7x+rHzkqentJYPaZOlET4w5Ci8dt79L7cIVAfc= X-Google-Smtp-Source: ABdhPJwLyv7LVfvkveT8iGjwSXQ9XvsmVwL1Z/N5baCONYkSMNLinWFL+g9qmi4754M1zk4qoeOOtdjCqTvu519wqKw= X-Received: by 2002:a67:c904:: with SMTP id w4mr15737177vsk.48.1622514048905; Mon, 31 May 2021 19:20:48 -0700 (PDT) MIME-Version: 1.0 References: <20210513095433.GH1179226@tucnak> <20210513113704.GI1179226@tucnak> In-Reply-To: From: Hongtao Liu Date: Tue, 1 Jun 2021 10:24:30 +0800 Message-ID: Subject: Re: [PATCH] [i386] Fix _mm256_zeroupper to notify LRA that vzeroupper will kill sse registers. [PR target/82735] To: Uros Bizjak Cc: Hongtao Liu via Gcc-patches , Jakub Jelinek , "H. J. Lu" , Richard Sandiford Content-Type: multipart/mixed; boundary="0000000000008750eb05c3aafde7" X-Spam-Status: No, score=-9.7 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, FREEMAIL_FROM, GIT_PATCH_0, RCVD_IN_DNSWL_NONE, SPF_HELO_NONE, SPF_PASS, TXREP autolearn=ham autolearn_force=no version=3.4.2 X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on server2.sourceware.org X-BeenThere: gcc-patches@gcc.gnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Gcc-patches mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 01 Jun 2021 02:20:52 -0000 --0000000000008750eb05c3aafde7 Content-Type: text/plain; charset="UTF-8" On Thu, May 27, 2021 at 3:05 PM Uros Bizjak wrote: > > On Thu, May 27, 2021 at 7:03 AM Hongtao Liu wrote: > > > > Hi: > > This is an updated patch which implements vzeroupper as call_insn > > which has a special vzeroupper ABI, also in this patch i reverted > > r11-7684, r10-6451, r10-3677 which seems to fix the same issue but in > > a different way. > > Bootstrapped and regtested on x86_64-linux-gnux{-m32,} and > > x86_64-linux-gnux{-m32 \-march=cascadelake,-march=cascadelake}. > > Also test the patch on SPEC2017 and eembc, no performance impact as expected. > > Ok for trunk? > > > > gcc/ChangeLog: > > > > PR target/82735 > > * config/i386/i386-expand.c (ix86_expand_builtin): Remove > > assignment of cfun->machine->has_explicit_vzeroupper. > > * config/i386/i386-features.c > > (ix86_add_reg_usage_to_vzerouppers): Delete. > > (ix86_add_reg_usage_to_vzeroupper): Ditto. > > (rest_of_handle_insert_vzeroupper): Remove > > ix86_add_reg_usage_to_vzerouppers, add df_analyze at the end > > of the function. > > (gate): Remove cfun->machine->has_explicit_vzeroupper. > > * config/i386/i386-protos.h (ix86_expand_avx_vzeroupper): > > Declared. > > * config/i386/i386.c (ix86_insn_callee_abi): New function. > > (ix86_initialize_callee_abi): Ditto. > > (ix86_expand_avx_vzeroupper): Ditto. > > (ix86_hard_regno_call_part_clobbered): Adjust for vzeroupper > > ABI. > > (TARGET_INSN_CALLEE_ABI): Define as ix86_insn_callee_abi. > > * config/i386/i386.h (enum i386_insn_callee_abi_index): New. > > (struct GTY(()) machine_function): Delete > > has_explicit_vzeroupper. > > * config/i386/i386.md (enum unspec): New member > > UNSPEC_CALLEE_ABI. > > * config/i386/predicates.md (vzeroupper_pattern): Adjust. > > * config/i386/sse.md (avx_vzeroupper): Call > > ix86_expand_avx_vzeroupper. > > (*avx_vzeroupper): Rename to .. > > (avx_vzeroupper_callee_abi): .. this, and adjust pattern as > > call_insn which has a special vzeroupper ABI. > > (*avx_vzeroupper_1): Deleted. > > * df-scan.c (df_get_call_refs): When call_insn is a fake call, > > it won't use stack pointer reg. > > * final.c (leaf_function_p): When call_insn is a fake call, it > > won't affect caller as a leaf function. > > * reg-stack.c (callee_clobbers_any_stack_reg): New. > > (subst_stack_regs): When call_insn doesn't clobber any stack > > reg, don't clear the arguments. > > * rtl.c (shallow_copy_rtx): Don't clear flag used when orig is > > a insn. > > * shrink-wrap.c (requires_stack_frame_p): No need for stack > > frame for a fake call. > > > > gcc/testsuite/ChangeLog: > > > > PR target/82735 > > * gcc.target/i386/pr82735-1.c: New test. > > * gcc.target/i386/pr82735-2.c: New test. > > * gcc.target/i386/pr82735-3.c: New test. > > * gcc.target/i386/pr82735-4.c: New test. > > * gcc.target/i386/pr82735-5.c: New test. > > Please split the patch to middle-end and target part. The middle-end > should be approved first. > > (define_expand "avx_vzeroupper" > - [(parallel [(unspec_volatile [(const_int 0)] UNSPECV_VZEROUPPER)])] > - "TARGET_AVX") > + [(parallel [(call (mem:QI (unspec_volatile [(const_int 0)] > UNSPECV_VZEROUPPER)) > + (const_int 0)) > + (unspec [(const_int 1)] UNSPEC_CALLEE_ABI)])] > > The call insn doesn't look like a valid RTX. Why not just: > > + [(parallel [(call (mem:QI (const_int 0) > + (const_int 0)) > > for a fake call? Also, UNSPEC_VZEROUPPER can be removed this way since > the const_int 1 of UNSPEC_CALLEE_ABI is now used to detect vzeroupper. > Changed. > Also, you don't need the avx_vzeroupper pattern to just call > ix86_expand_avx_vzeroupper. Just call the function directly from the > call site: > > case AVX_U128: > if (mode == AVX_U128_CLEAN) > emit_insn (gen_avx_vzeroupper ()); > break; > Changed. > + (unspec [(const_int 1)] UNSPEC_CALLEE_ABI)])] > > Can this const_int 1 be somehow more descriptive? Perhaps use > define_constant to define I386_VZEROUPPER ABI and use it in .md as > well as .c files. Changed. > > Uros. Update separate patch for the backend part. gcc/ChangeLog: PR target/82735 * config/i386/i386-expand.c (ix86_expand_builtin): Remove assignment of cfun->machine->has_explicit_vzeroupper. * config/i386/i386-features.c (ix86_add_reg_usage_to_vzerouppers): Delete. (ix86_add_reg_usage_to_vzeroupper): Ditto. (rest_of_handle_insert_vzeroupper): Remove ix86_add_reg_usage_to_vzerouppers, add df_analyze at the end of the function. (gate): Remove cfun->machine->has_explicit_vzeroupper. * config/i386/i386-protos.h (ix86_expand_avx_vzeroupper): Declared. * config/i386/i386.c (ix86_insn_callee_abi): New function. (ix86_initialize_callee_abi): Ditto. (ix86_expand_avx_vzeroupper): Ditto. (ix86_hard_regno_call_part_clobbered): Adjust for vzeroupper ABI. (TARGET_INSN_CALLEE_ABI): Define as ix86_insn_callee_abi. (ix86_emit_mode_set): Call ix86_expand_avx_vzeroupper directly. * config/i386/i386.h (struct GTY(()) machine_function): Delete has_explicit_vzeroupper. * config/i386/i386.md (enum unspec): New member UNSPEC_CALLEE_ABI. (I386_DEFAULT,I386_VZEROUPPER,I386_UNKNOWN): New define_constants for insn callee abi index. * config/i386/predicates.md (vzeroupper_pattern): Adjust. * config/i386/sse.md (UNSPECV_VZEROUPPER): Deleted. (avx_vzeroupper): Call ix86_expand_avx_vzeroupper. (*avx_vzeroupper): Rename to .. (avx_vzeroupper_callee_abi): .. this, and adjust pattern as call_insn which has a special vzeroupper ABI. (*avx_vzeroupper_1): Deleted. gcc/testsuite/ChangeLog: PR target/82735 * gcc.target/i386/pr82735-1.c: New test. * gcc.target/i386/pr82735-2.c: New test. * gcc.target/i386/pr82735-3.c: New test. * gcc.target/i386/pr82735-4.c: New test. * gcc.target/i386/pr82735-5.c: New test. -- BR, Hongtao --0000000000008750eb05c3aafde7 Content-Type: text/x-patch; charset="US-ASCII"; name="0002-Fix-_mm256_zeroupper-by-representing-the-instruction.patch" Content-Disposition: attachment; filename="0002-Fix-_mm256_zeroupper-by-representing-the-instruction.patch" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_kpdf1icq0 RnJvbSBlYzlmMWZhYjliZWJjMDM0MWM2YzdiMDc5YzQzZmU2ODI0MmRlMDY0IE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBsaXVob25ndCA8aG9uZ3Rhby5saXVAaW50ZWwuY29tPgpEYXRl OiBUdWUsIDEgSnVuIDIwMjEgMDk6MDk6NDQgKzA4MDAKU3ViamVjdDogW1BBVENIIDIvMl0gRml4 IF9tbTI1Nl96ZXJvdXBwZXIgYnkgcmVwcmVzZW50aW5nIHRoZSBpbnN0cnVjdGlvbnMgYXMKIGNh bGxfaW5zbnMgaW4gd2hpY2ggdGhlIGNhbGwgaGFzIGEgc3BlY2lhbCB2emVyb3VwcGVyIEFCSS4K CldoZW4gX19idWlsdGluX2lhMzJfdnplcm91cHBlciBpcyBjYWxsZWQgZXhwbGljaXRseSwgdGhl IGNvcnJlc3BvbmRpbmcKdnplcm91cHBlciBwYXR0ZXJuIGRvZXMgbm90IGNhcnJ5IGFueSBDTE9C QkVSUyBvciBTRVRzIGJlZm9yZSBMUkEsCndoaWNoIGxlYWRzIHRvIGluY29ycmVjdCBvcHRpbWl6 YXRpb24gaW4gcGFzc19yZWxvYWQuIEluIG9yZGVyIHRvCnNvbHZlIHRoaXMgcHJvYmxlbSwgdGhp cyBwYXRjaCByZWZpbmUgaW5zdHJ1Y3Rpb25zIGFzIGNhbGxfaW5zbnMgaW4Kd2hpY2ggdGhlIGNh bGwgaGFzIGEgc3BlY2lhbCB2emVyb3VwcGVyIEFCSS4KCmdjYy9DaGFuZ2VMb2c6CgoJUFIgdGFy Z2V0LzgyNzM1CgkqIGNvbmZpZy9pMzg2L2kzODYtZXhwYW5kLmMgKGl4ODZfZXhwYW5kX2J1aWx0 aW4pOiBSZW1vdmUKCWFzc2lnbm1lbnQgb2YgY2Z1bi0+bWFjaGluZS0+aGFzX2V4cGxpY2l0X3Z6 ZXJvdXBwZXIuCgkqIGNvbmZpZy9pMzg2L2kzODYtZmVhdHVyZXMuYwoJKGl4ODZfYWRkX3JlZ191 c2FnZV90b192emVyb3VwcGVycyk6IERlbGV0ZS4KCShpeDg2X2FkZF9yZWdfdXNhZ2VfdG9fdnpl cm91cHBlcik6IERpdHRvLgoJKHJlc3Rfb2ZfaGFuZGxlX2luc2VydF92emVyb3VwcGVyKTogUmVt b3ZlCglpeDg2X2FkZF9yZWdfdXNhZ2VfdG9fdnplcm91cHBlcnMsIGFkZCBkZl9hbmFseXplIGF0 IHRoZSBlbmQKCW9mIHRoZSBmdW5jdGlvbi4KCShnYXRlKTogUmVtb3ZlIGNmdW4tPm1hY2hpbmUt Pmhhc19leHBsaWNpdF92emVyb3VwcGVyLgoJKiBjb25maWcvaTM4Ni9pMzg2LXByb3Rvcy5oIChp eDg2X2V4cGFuZF9hdnhfdnplcm91cHBlcik6CglEZWNsYXJlZC4KCSogY29uZmlnL2kzODYvaTM4 Ni5jIChpeDg2X2luc25fY2FsbGVlX2FiaSk6IE5ldyBmdW5jdGlvbi4KCShpeDg2X2luaXRpYWxp emVfY2FsbGVlX2FiaSk6IERpdHRvLgoJKGl4ODZfZXhwYW5kX2F2eF92emVyb3VwcGVyKTogRGl0 dG8uCgkoaXg4Nl9oYXJkX3JlZ25vX2NhbGxfcGFydF9jbG9iYmVyZWQpOiBBZGp1c3QgZm9yIHZ6 ZXJvdXBwZXIKCUFCSS4KCShUQVJHRVRfSU5TTl9DQUxMRUVfQUJJKTogRGVmaW5lIGFzIGl4ODZf aW5zbl9jYWxsZWVfYWJpLgoJKGl4ODZfZW1pdF9tb2RlX3NldCk6IENhbGwgaXg4Nl9leHBhbmRf YXZ4X3Z6ZXJvdXBwZXIKCWRpcmVjdGx5LgoJKiBjb25maWcvaTM4Ni9pMzg2LmggKHN0cnVjdCBH VFkoKCkpIG1hY2hpbmVfZnVuY3Rpb24pOiBEZWxldGUKCWhhc19leHBsaWNpdF92emVyb3VwcGVy LgoJKiBjb25maWcvaTM4Ni9pMzg2Lm1kIChlbnVtIHVuc3BlYyk6IE5ldyBtZW1iZXIKCVVOU1BF Q19DQUxMRUVfQUJJLgoJKEkzODZfREVGQVVMVCxJMzg2X1ZaRVJPVVBQRVIsSTM4Nl9VTktOT1dO KTogTmV3CglkZWZpbmVfY29uc3RhbnRzIGZvciBpbnNuIGNhbGxlZSBhYmkgaW5kZXguCgkqIGNv bmZpZy9pMzg2L3ByZWRpY2F0ZXMubWQgKHZ6ZXJvdXBwZXJfcGF0dGVybik6IEFkanVzdC4KCSog Y29uZmlnL2kzODYvc3NlLm1kIChVTlNQRUNWX1ZaRVJPVVBQRVIpOiBEZWxldGVkLgoJKGF2eF92 emVyb3VwcGVyKTogQ2FsbCBpeDg2X2V4cGFuZF9hdnhfdnplcm91cHBlci4KCSgqYXZ4X3Z6ZXJv dXBwZXIpOiBSZW5hbWUgdG8gLi4KCShhdnhfdnplcm91cHBlcl9jYWxsZWVfYWJpKTogLi4gdGhp cywgYW5kIGFkanVzdCBwYXR0ZXJuIGFzCgljYWxsX2luc24gd2hpY2ggaGFzIGEgc3BlY2lhbCB2 emVyb3VwcGVyIEFCSS4KCSgqYXZ4X3Z6ZXJvdXBwZXJfMSk6IERlbGV0ZWQuCgpnY2MvdGVzdHN1 aXRlL0NoYW5nZUxvZzoKCglQUiB0YXJnZXQvODI3MzUKCSogZ2NjLnRhcmdldC9pMzg2L3ByODI3 MzUtMS5jOiBOZXcgdGVzdC4KCSogZ2NjLnRhcmdldC9pMzg2L3ByODI3MzUtMi5jOiBOZXcgdGVz dC4KCSogZ2NjLnRhcmdldC9pMzg2L3ByODI3MzUtMy5jOiBOZXcgdGVzdC4KCSogZ2NjLnRhcmdl dC9pMzg2L3ByODI3MzUtNC5jOiBOZXcgdGVzdC4KCSogZ2NjLnRhcmdldC9pMzg2L3ByODI3MzUt NS5jOiBOZXcgdGVzdC4KLS0tCiBnY2MvY29uZmlnL2kzODYvaTM4Ni1leHBhbmQuYyAgICAgICAg ICAgICB8ICA0IC0KIGdjYy9jb25maWcvaTM4Ni9pMzg2LWZlYXR1cmVzLmMgICAgICAgICAgIHwg OTkgKysrLS0tLS0tLS0tLS0tLS0tLS0tLS0KIGdjYy9jb25maWcvaTM4Ni9pMzg2LXByb3Rvcy5o ICAgICAgICAgICAgIHwgIDEgKwogZ2NjL2NvbmZpZy9pMzg2L2kzODYuYyAgICAgICAgICAgICAg ICAgICAgfCA1NSArKysrKysrKysrKystCiBnY2MvY29uZmlnL2kzODYvaTM4Ni5oICAgICAgICAg ICAgICAgICAgICB8ICA0IC0KIGdjYy9jb25maWcvaTM4Ni9pMzg2Lm1kICAgICAgICAgICAgICAg ICAgIHwgMTAgKysrCiBnY2MvY29uZmlnL2kzODYvcHJlZGljYXRlcy5tZCAgICAgICAgICAgICB8 ICA1ICstCiBnY2MvY29uZmlnL2kzODYvc3NlLm1kICAgICAgICAgICAgICAgICAgICB8IDU5ICsr KystLS0tLS0tLS0tCiBnY2MvdGVzdHN1aXRlL2djYy50YXJnZXQvaTM4Ni9wcjgyNzM1LTEuYyB8 IDI5ICsrKysrKysKIGdjYy90ZXN0c3VpdGUvZ2NjLnRhcmdldC9pMzg2L3ByODI3MzUtMi5jIHwg MjIgKysrKysKIGdjYy90ZXN0c3VpdGUvZ2NjLnRhcmdldC9pMzg2L3ByODI3MzUtMy5jIHwgIDUg KysKIGdjYy90ZXN0c3VpdGUvZ2NjLnRhcmdldC9pMzg2L3ByODI3MzUtNC5jIHwgNDggKysrKysr KysrKysKIGdjYy90ZXN0c3VpdGUvZ2NjLnRhcmdldC9pMzg2L3ByODI3MzUtNS5jIHwgNTQgKysr KysrKysrKysrKwogMTMgZmlsZXMgY2hhbmdlZCwgMjUyIGluc2VydGlvbnMoKyksIDE0MyBkZWxl dGlvbnMoLSkKIGNyZWF0ZSBtb2RlIDEwMDY0NCBnY2MvdGVzdHN1aXRlL2djYy50YXJnZXQvaTM4 Ni9wcjgyNzM1LTEuYwogY3JlYXRlIG1vZGUgMTAwNjQ0IGdjYy90ZXN0c3VpdGUvZ2NjLnRhcmdl dC9pMzg2L3ByODI3MzUtMi5jCiBjcmVhdGUgbW9kZSAxMDA2NDQgZ2NjL3Rlc3RzdWl0ZS9nY2Mu dGFyZ2V0L2kzODYvcHI4MjczNS0zLmMKIGNyZWF0ZSBtb2RlIDEwMDY0NCBnY2MvdGVzdHN1aXRl L2djYy50YXJnZXQvaTM4Ni9wcjgyNzM1LTQuYwogY3JlYXRlIG1vZGUgMTAwNjQ0IGdjYy90ZXN0 c3VpdGUvZ2NjLnRhcmdldC9pMzg2L3ByODI3MzUtNS5jCgpkaWZmIC0tZ2l0IGEvZ2NjL2NvbmZp Zy9pMzg2L2kzODYtZXhwYW5kLmMgYi9nY2MvY29uZmlnL2kzODYvaTM4Ni1leHBhbmQuYwppbmRl eCA5ZjNkNDE5NTVhMi4uZDI1ZDU5YWE0ZTcgMTAwNjQ0Ci0tLSBhL2djYy9jb25maWcvaTM4Ni9p Mzg2LWV4cGFuZC5jCisrKyBiL2djYy9jb25maWcvaTM4Ni9pMzg2LWV4cGFuZC5jCkBAIC0xMzI4 MiwxMCArMTMyODIsNiBAQCByZHNlZWRfc3RlcDoKIAogICAgICAgcmV0dXJuIDA7CiAKLSAgICBj YXNlIElYODZfQlVJTFRJTl9WWkVST1VQUEVSOgotICAgICAgY2Z1bi0+bWFjaGluZS0+aGFzX2V4 cGxpY2l0X3Z6ZXJvdXBwZXIgPSB0cnVlOwotICAgICAgYnJlYWs7Ci0KICAgICBkZWZhdWx0Ogog ICAgICAgYnJlYWs7CiAgICAgfQpkaWZmIC0tZ2l0IGEvZ2NjL2NvbmZpZy9pMzg2L2kzODYtZmVh dHVyZXMuYyBiL2djYy9jb25maWcvaTM4Ni9pMzg2LWZlYXR1cmVzLmMKaW5kZXggNzc3ODNhMTU0 YjYuLmEyNTc2OWFlNDc4IDEwMDY0NAotLS0gYS9nY2MvY29uZmlnL2kzODYvaTM4Ni1mZWF0dXJl cy5jCisrKyBiL2djYy9jb25maWcvaTM4Ni9pMzg2LWZlYXR1cmVzLmMKQEAgLTE3NjgsOTIgKzE3 NjgsMjIgQEAgY29udmVydF9zY2FsYXJzX3RvX3ZlY3RvciAoYm9vbCB0aW1vZGVfcCkKICAgcmV0 dXJuIDA7CiB9CiAKLS8qIE1vZGlmeSB0aGUgdnplcm91cHBlciBwYXR0ZXJuIGluIElOU04gc28g dGhhdCBpdCBkZXNjcmliZXMgdGhlIGVmZmVjdAotICAgdGhhdCB0aGUgaW5zdHJ1Y3Rpb24gaGFz IG9uIHRoZSBTU0UgcmVnaXN0ZXJzLiAgTElWRV9SRUdTIGFyZSB0aGUgc2V0Ci0gICBvZiByZWdp c3RlcnMgdGhhdCBhcmUgbGl2ZSBhY3Jvc3MgdGhlIGluc3RydWN0aW9uLgotCi0gICBGb3IgYSBs aXZlIHJlZ2lzdGVyIFIgd2UgdXNlOgotCi0gICAgIChzZXQgKHJlZzpWMkRGIFIpIChyZWc6VjJE RiBSKSkKLQotICAgd2hpY2ggcHJlc2VydmVzIHRoZSBsb3cgMTI4IGJpdHMgYnV0IGNsb2JiZXJz IHRoZSB1cHBlciBiaXRzLiAgKi8KLQotc3RhdGljIHZvaWQKLWl4ODZfYWRkX3JlZ191c2FnZV90 b192emVyb3VwcGVyIChydHhfaW5zbiAqaW5zbiwgYml0bWFwIGxpdmVfcmVncykKLXsKLSAgcnR4 IHBhdHRlcm4gPSBQQVRURVJOIChpbnNuKTsKLSAgdW5zaWduZWQgaW50IG5yZWdzID0gVEFSR0VU XzY0QklUID8gMTYgOiA4OwotICB1bnNpZ25lZCBpbnQgbnBhdHMgPSBucmVnczsKLSAgZm9yICh1 bnNpZ25lZCBpbnQgaSA9IDA7IGkgPCBucmVnczsgKytpKQotICAgIHsKLSAgICAgIHVuc2lnbmVk IGludCByZWdubyA9IEdFVF9TU0VfUkVHTk8gKGkpOwotICAgICAgaWYgKCFiaXRtYXBfYml0X3Ag KGxpdmVfcmVncywgcmVnbm8pKQotCW5wYXRzLS07Ci0gICAgfQotICBpZiAobnBhdHMgPT0gMCkK LSAgICByZXR1cm47Ci0gIHJ0dmVjIHZlYyA9IHJ0dmVjX2FsbG9jIChucGF0cyArIDEpOwotICBS VFZFQ19FTFQgKHZlYywgMCkgPSBYVkVDRVhQIChwYXR0ZXJuLCAwLCAwKTsKLSAgZm9yICh1bnNp Z25lZCBpbnQgaSA9IDAsIGogPSAwOyBpIDwgbnJlZ3M7ICsraSkKLSAgICB7Ci0gICAgICB1bnNp Z25lZCBpbnQgcmVnbm8gPSBHRVRfU1NFX1JFR05PIChpKTsKLSAgICAgIGlmICghYml0bWFwX2Jp dF9wIChsaXZlX3JlZ3MsIHJlZ25vKSkKLQljb250aW51ZTsKLSAgICAgIHJ0eCByZWcgPSBnZW5f cnR4X1JFRyAoVjJESW1vZGUsIHJlZ25vKTsKLSAgICAgICsrajsKLSAgICAgIFJUVkVDX0VMVCAo dmVjLCBqKSA9IGdlbl9ydHhfU0VUIChyZWcsIHJlZyk7Ci0gICAgfQotICBYVkVDIChwYXR0ZXJu LCAwKSA9IHZlYzsKLSAgSU5TTl9DT0RFIChpbnNuKSA9IC0xOwotICBkZl9pbnNuX3Jlc2NhbiAo aW5zbik7Ci19Ci0KLS8qIFdhbGsgdGhlIHZ6ZXJvdXBwZXIgaW5zdHJ1Y3Rpb25zIGluIHRoZSBm dW5jdGlvbiBhbmQgYW5ub3RhdGUgdGhlbQotICAgd2l0aCB0aGUgZWZmZWN0IHRoYXQgdGhleSBo YXZlIG9uIHRoZSBTU0UgcmVnaXN0ZXJzLiAgKi8KLQotc3RhdGljIHZvaWQKLWl4ODZfYWRkX3Jl Z191c2FnZV90b192emVyb3VwcGVycyAodm9pZCkKLXsKLSAgYmFzaWNfYmxvY2sgYmI7Ci0gIHJ0 eF9pbnNuICppbnNuOwotICBhdXRvX2JpdG1hcCBsaXZlX3JlZ3M7Ci0KLSAgZGZfYW5hbHl6ZSAo KTsKLSAgRk9SX0VBQ0hfQkJfRk4gKGJiLCBjZnVuKQotICAgIHsKLSAgICAgIGJpdG1hcF9jb3B5 IChsaXZlX3JlZ3MsIGRmX2dldF9saXZlX291dCAoYmIpKTsKLSAgICAgIGRmX3NpbXVsYXRlX2lu aXRpYWxpemVfYmFja3dhcmRzIChiYiwgbGl2ZV9yZWdzKTsKLSAgICAgIEZPUl9CQl9JTlNOU19S RVZFUlNFIChiYiwgaW5zbikKLQl7Ci0JICBpZiAoIU5PTkRFQlVHX0lOU05fUCAoaW5zbikpCi0J ICAgIGNvbnRpbnVlOwotCSAgaWYgKHZ6ZXJvdXBwZXJfcGF0dGVybiAoUEFUVEVSTiAoaW5zbiks IFZPSURtb2RlKSkKLQkgICAgaXg4Nl9hZGRfcmVnX3VzYWdlX3RvX3Z6ZXJvdXBwZXIgKGluc24s IGxpdmVfcmVncyk7Ci0JICBkZl9zaW11bGF0ZV9vbmVfaW5zbl9iYWNrd2FyZHMgKGJiLCBpbnNu LCBsaXZlX3JlZ3MpOwotCX0KLSAgICB9Ci19Ci0KIHN0YXRpYyB1bnNpZ25lZCBpbnQKIHJlc3Rf b2ZfaGFuZGxlX2luc2VydF92emVyb3VwcGVyICh2b2lkKQogewotICBpZiAoVEFSR0VUX1ZaRVJP VVBQRVIKLSAgICAgICYmIGZsYWdfZXhwZW5zaXZlX29wdGltaXphdGlvbnMKLSAgICAgICYmICFv cHRpbWl6ZV9zaXplKQotICAgIHsKLSAgICAgIC8qIHZ6ZXJvdXBwZXIgaW5zdHJ1Y3Rpb25zIGFy ZSBpbnNlcnRlZCBpbW1lZGlhdGVseSBhZnRlciByZWxvYWQgdG8KLQkgYWNjb3VudCBmb3IgcG9z c2libGUgc3BpbGxzIGZyb20gMjU2Yml0IG9yIDUxMmJpdCByZWdpc3RlcnMuICBUaGUgcGFzcwot CSByZXVzZXMgbW9kZSBzd2l0Y2hpbmcgaW5mcmFzdHJ1Y3R1cmUgYnkgcmUtcnVubmluZyBtb2Rl IGluc2VydGlvbgotCSBwYXNzLCBzbyBkaXNhYmxlIGVudGl0aWVzIHRoYXQgaGF2ZSBhbHJlYWR5 IGJlZW4gcHJvY2Vzc2VkLiAgKi8KLSAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTUFYXzM4Nl9F TlRJVElFUzsgaSsrKQotCWl4ODZfb3B0aW1pemVfbW9kZV9zd2l0Y2hpbmdbaV0gPSAwOworICAv KiB2emVyb3VwcGVyIGluc3RydWN0aW9ucyBhcmUgaW5zZXJ0ZWQgaW1tZWRpYXRlbHkgYWZ0ZXIg cmVsb2FkIHRvCisgICAgIGFjY291bnQgZm9yIHBvc3NpYmxlIHNwaWxscyBmcm9tIDI1NmJpdCBv ciA1MTJiaXQgcmVnaXN0ZXJzLiAgVGhlIHBhc3MKKyAgICAgcmV1c2VzIG1vZGUgc3dpdGNoaW5n IGluZnJhc3RydWN0dXJlIGJ5IHJlLXJ1bm5pbmcgbW9kZSBpbnNlcnRpb24KKyAgICAgcGFzcywg c28gZGlzYWJsZSBlbnRpdGllcyB0aGF0IGhhdmUgYWxyZWFkeSBiZWVuIHByb2Nlc3NlZC4gICov CisgIGZvciAoaW50IGkgPSAwOyBpIDwgTUFYXzM4Nl9FTlRJVElFUzsgaSsrKQorICAgIGl4ODZf b3B0aW1pemVfbW9kZV9zd2l0Y2hpbmdbaV0gPSAwOwogCi0gICAgICBpeDg2X29wdGltaXplX21v ZGVfc3dpdGNoaW5nW0FWWF9VMTI4XSA9IDE7CisgIGl4ODZfb3B0aW1pemVfbW9kZV9zd2l0Y2hp bmdbQVZYX1UxMjhdID0gMTsKIAotICAgICAgLyogQ2FsbCBvcHRpbWl6ZV9tb2RlX3N3aXRjaGlu Zy4gICovCi0gICAgICBnLT5nZXRfcGFzc2VzICgpLT5leGVjdXRlX3Bhc3NfbW9kZV9zd2l0Y2hp bmcgKCk7Ci0gICAgfQotICBpeDg2X2FkZF9yZWdfdXNhZ2VfdG9fdnplcm91cHBlcnMgKCk7Cisg IC8qIENhbGwgb3B0aW1pemVfbW9kZV9zd2l0Y2hpbmcuICAqLworICBnLT5nZXRfcGFzc2VzICgp LT5leGVjdXRlX3Bhc3NfbW9kZV9zd2l0Y2hpbmcgKCk7CisKKyAgZGZfYW5hbHl6ZSAoKTsKICAg cmV0dXJuIDA7CiB9CiAKQEAgLTE4ODIsMTEgKzE4MTIsOCBAQCBwdWJsaWM6CiAgIC8qIG9wdF9w YXNzIG1ldGhvZHM6ICovCiAgIHZpcnR1YWwgYm9vbCBnYXRlIChmdW5jdGlvbiAqKQogICAgIHsK LSAgICAgIHJldHVybiBUQVJHRVRfQVZYCi0JICAgICAmJiAoKFRBUkdFVF9WWkVST1VQUEVSCi0J CSAgJiYgZmxhZ19leHBlbnNpdmVfb3B0aW1pemF0aW9ucwotCQkgICYmICFvcHRpbWl6ZV9zaXpl KQotCQkgfHwgY2Z1bi0+bWFjaGluZS0+aGFzX2V4cGxpY2l0X3Z6ZXJvdXBwZXIpOworICAgICAg cmV0dXJuIFRBUkdFVF9BVlggJiYgVEFSR0VUX1ZaRVJPVVBQRVIKKwkmJiBmbGFnX2V4cGVuc2l2 ZV9vcHRpbWl6YXRpb25zICYmICFvcHRpbWl6ZV9zaXplOwogICAgIH0KIAogICB2aXJ0dWFsIHVu c2lnbmVkIGludCBleGVjdXRlIChmdW5jdGlvbiAqKQpkaWZmIC0tZ2l0IGEvZ2NjL2NvbmZpZy9p Mzg2L2kzODYtcHJvdG9zLmggYi9nY2MvY29uZmlnL2kzODYvaTM4Ni1wcm90b3MuaAppbmRleCA3 NzgyY2YxMTYzZi4uZTZhYzkzOTA3NzcgMTAwNjQ0Ci0tLSBhL2djYy9jb25maWcvaTM4Ni9pMzg2 LXByb3Rvcy5oCisrKyBiL2djYy9jb25maWcvaTM4Ni9pMzg2LXByb3Rvcy5oCkBAIC0yMTYsNiAr MjE2LDcgQEAgZXh0ZXJuIHJ0eCBpeDg2X3NwbGl0X3N0YWNrX2d1YXJkICh2b2lkKTsKIGV4dGVy biB2b2lkIGl4ODZfbW92ZV92ZWN0b3JfaGlnaF9zc2VfdG9fbW14IChydHgpOwogZXh0ZXJuIHZv aWQgaXg4Nl9zcGxpdF9tbXhfcGFjayAocnR4W10sIGVudW0gcnR4X2NvZGUpOwogZXh0ZXJuIHZv aWQgaXg4Nl9zcGxpdF9tbXhfcHVucGNrIChydHhbXSwgYm9vbCk7CitleHRlcm4gdm9pZCBpeDg2 X2V4cGFuZF9hdnhfdnplcm91cHBlciAodm9pZCk7CiAKICNpZmRlZiBUUkVFX0NPREUKIGV4dGVy biB2b2lkIGluaXRfY3VtdWxhdGl2ZV9hcmdzIChDVU1VTEFUSVZFX0FSR1MgKiwgdHJlZSwgcnR4 LCB0cmVlLCBpbnQpOwpkaWZmIC0tZ2l0IGEvZ2NjL2NvbmZpZy9pMzg2L2kzODYuYyBiL2djYy9j b25maWcvaTM4Ni9pMzg2LmMKaW5kZXggNzQzZDhhMjVmZTMuLmYwYjY2ZGQwZDU2IDEwMDY0NAot LS0gYS9nY2MvY29uZmlnL2kzODYvaTM4Ni5jCisrKyBiL2djYy9jb25maWcvaTM4Ni9pMzg2LmMK QEAgLTE0NDI2LDcgKzE0NDI2LDcgQEAgaXg4Nl9lbWl0X21vZGVfc2V0IChpbnQgZW50aXR5LCBp bnQgbW9kZSwgaW50IHByZXZfbW9kZSBBVFRSSUJVVEVfVU5VU0VELAogICAgICAgYnJlYWs7CiAg ICAgY2FzZSBBVlhfVTEyODoKICAgICAgIGlmIChtb2RlID09IEFWWF9VMTI4X0NMRUFOKQotCWVt aXRfaW5zbiAoZ2VuX2F2eF92emVyb3VwcGVyICgpKTsKKwlpeDg2X2V4cGFuZF9hdnhfdnplcm91 cHBlciAoKTsKICAgICAgIGJyZWFrOwogICAgIGNhc2UgSTM4N19ST1VOREVWRU46CiAgICAgY2Fz ZSBJMzg3X1RSVU5DOgpAQCAtMTk0OTQsMTUgKzE5NDk0LDYzIEBAIGl4ODZfaGFyZF9yZWdub19t b2RlX29rICh1bnNpZ25lZCBpbnQgcmVnbm8sIG1hY2hpbmVfbW9kZSBtb2RlKQogICByZXR1cm4g ZmFsc2U7CiB9CiAKKy8qIEltcGxlbWVudCBUQVJHRVRfSU5TTl9DQUxMRUVfQUJJLiAgKi8KKwor Y29uc3QgcHJlZGVmaW5lZF9mdW5jdGlvbl9hYmkgJgoraXg4Nl9pbnNuX2NhbGxlZV9hYmkgKGNv bnN0IHJ0eF9pbnNuICppbnNuKQoreworICB1bnNpZ25lZCBpbnQgYWJpX2lkID0gMDsKKyAgcnR4 IHBhdCA9IFBBVFRFUk4gKGluc24pOworICBpZiAodnplcm91cHBlcl9wYXR0ZXJuIChwYXQsIFZP SURtb2RlKSkKKyAgICBhYmlfaWQgPSBJMzg2X1ZaRVJPVVBQRVI7CisKKyAgcmV0dXJuIGZ1bmN0 aW9uX2FiaXNbYWJpX2lkXTsKK30KKworLyogSW5pdGlhbGl6ZSBmdW5jdGlvbl9hYmlzIHdpdGgg Y29ycmVzcG9uZGluZyBhYmlfaWQsCisgICBjdXJyZW50bHkgb25seSBoYW5kbGUgdnplcm91cHBl ci4gICovCit2b2lkCitpeDg2X2luaXRpYWxpemVfY2FsbGVlX2FiaSAodW5zaWduZWQgaW50IGFi aV9pZCkKK3sKKyAgZ2NjX2Fzc2VydCAoYWJpX2lkID09IEkzODZfVlpFUk9VUFBFUik7CisgIHBy ZWRlZmluZWRfZnVuY3Rpb25fYWJpICZ2emVyb3VwcGVyX2FiaSA9IGZ1bmN0aW9uX2FiaXNbYWJp X2lkXTsKKyAgaWYgKCF2emVyb3VwcGVyX2FiaS5pbml0aWFsaXplZF9wICgpKQorICAgIHsKKyAg ICAgIEhBUkRfUkVHX1NFVCBmdWxsX3JlZ19jbG9iYmVyczsKKyAgICAgIENMRUFSX0hBUkRfUkVH X1NFVCAoZnVsbF9yZWdfY2xvYmJlcnMpOworICAgICAgdnplcm91cHBlcl9hYmkuaW5pdGlhbGl6 ZSAoSTM4Nl9WWkVST1VQUEVSLCBmdWxsX3JlZ19jbG9iYmVycyk7CisgICAgfQorfQorCit2b2lk CitpeDg2X2V4cGFuZF9hdnhfdnplcm91cHBlciAodm9pZCkKK3sKKyAgLyogSW5pdGlhbGl6ZSB2 emVyb3VwcGVyX2FiaSBoZXJlLiAgKi8KKyAgaXg4Nl9pbml0aWFsaXplX2NhbGxlZV9hYmkgKEkz ODZfVlpFUk9VUFBFUik7CisgIHJ0eF9pbnNuICppbnNuID0gZW1pdF9jYWxsX2luc24gKGdlbl9h dnhfdnplcm91cHBlcl9jYWxsZWVfYWJpICgpKTsKKyAgLyogUmV0dXJuIGZhbHNlIGZvciBub24t bG9jYWwgZ290byBpbiBjYW5fbm9ubG9jYWxfZ290by4gICovCisgIG1ha2VfcmVnX2VoX3JlZ2lv bl9ub3RlIChpbnNuLCAwLCBJTlRfTUlOKTsKKyAgLyogRmxhZyB1c2VkIGZvciBjYWxsX2luc24g aW5kaWNhdGVzIGl0J3MgYSBmYWtlIGNhbGwuICAqLworICBSVFhfRkxBRyAoaW5zbiwgdXNlZCkg PSAxOworfQorCisKIC8qIEltcGxlbWVudCBUQVJHRVRfSEFSRF9SRUdOT19DQUxMX1BBUlRfQ0xP QkJFUkVELiAgVGhlIG9ubHkgQUJJIHRoYXQKICAgIHNhdmVzIFNTRSByZWdpc3RlcnMgYWNyb3Nz IGNhbGxzIGlzIFdpbjY0ICh0aHVzIG5vIG5lZWQgdG8gY2hlY2sgdGhlCiAgICBjdXJyZW50IEFC SSBoZXJlKSwgYW5kIHdpdGggQVZYIGVuYWJsZWQgV2luNjQgb25seSBndWFyYW50ZWVzIHRoYXQK ICAgIHRoZSBsb3cgMTYgYnl0ZXMgYXJlIHNhdmVkLiAgKi8KIAogc3RhdGljIGJvb2wKLWl4ODZf aGFyZF9yZWdub19jYWxsX3BhcnRfY2xvYmJlcmVkICh1bnNpZ25lZCBpbnQsIHVuc2lnbmVkIGlu dCByZWdubywKK2l4ODZfaGFyZF9yZWdub19jYWxsX3BhcnRfY2xvYmJlcmVkICh1bnNpZ25lZCBp bnQgYWJpX2lkLCB1bnNpZ25lZCBpbnQgcmVnbm8sCiAJCQkJICAgICBtYWNoaW5lX21vZGUgbW9k ZSkKIHsKKyAgLyogU3BlY2lhbCBBQkkgZm9yIHZ6ZXJvdXBwZXIgd2hpY2ggb25seSBjbG9iYmVy IGhpZ2hlciBwYXJ0IG9mIHNzZSByZWdzLiAgKi8KKyAgaWYgKGFiaV9pZCA9PSBJMzg2X1ZaRVJP VVBQRVIpCisgICAgICByZXR1cm4gKEdFVF9NT0RFX1NJWkUgKG1vZGUpID4gMTYKKwkgICAgICAm JiAoKFRBUkdFVF82NEJJVAorCQkgICAmJiAoSU5fUkFOR0UgKHJlZ25vLCBGSVJTVF9SRVhfU1NF X1JFRywgTEFTVF9SRVhfU1NFX1JFRykpKQorCQkgIHx8IChJTl9SQU5HRSAocmVnbm8sIEZJUlNU X1NTRV9SRUcsIExBU1RfU1NFX1JFRykpKSk7CisKICAgcmV0dXJuIFNTRV9SRUdOT19QIChyZWdu bykgJiYgR0VUX01PREVfU0laRSAobW9kZSkgPiAxNjsKIH0KIApAQCAtMjM5MTYsNiArMjM5NjQs OSBAQCBpeDg2X3J1bl9zZWxmdGVzdHMgKHZvaWQpCiAjZGVmaW5lIFRBUkdFVF9IQVJEX1JFR05P X0NBTExfUEFSVF9DTE9CQkVSRUQgXAogICBpeDg2X2hhcmRfcmVnbm9fY2FsbF9wYXJ0X2Nsb2Ji ZXJlZAogCisjdW5kZWYgVEFSR0VUX0lOU05fQ0FMTEVFX0FCSQorI2RlZmluZSBUQVJHRVRfSU5T Tl9DQUxMRUVfQUJJIGl4ODZfaW5zbl9jYWxsZWVfYWJpCisKICN1bmRlZiBUQVJHRVRfQ0FOX0NI QU5HRV9NT0RFX0NMQVNTCiAjZGVmaW5lIFRBUkdFVF9DQU5fQ0hBTkdFX01PREVfQ0xBU1MgaXg4 Nl9jYW5fY2hhbmdlX21vZGVfY2xhc3MKIApkaWZmIC0tZ2l0IGEvZ2NjL2NvbmZpZy9pMzg2L2kz ODYuaCBiL2djYy9jb25maWcvaTM4Ni9pMzg2LmgKaW5kZXggNTNkNTAzZmM2ZTAuLjkxOWQwYjI0 MThhIDEwMDY0NAotLS0gYS9nY2MvY29uZmlnL2kzODYvaTM4Ni5oCisrKyBiL2djYy9jb25maWcv aTM4Ni9pMzg2LmgKQEAgLTI2NTksMTAgKzI2NTksNiBAQCBzdHJ1Y3QgR1RZKCgpKSBtYWNoaW5l X2Z1bmN0aW9uIHsKICAgLyogVHJ1ZSBpZiB0aGUgZnVuY3Rpb24gbmVlZHMgYSBzdGFjayBmcmFt ZS4gICovCiAgIEJPT0xfQklURklFTEQgc3RhY2tfZnJhbWVfcmVxdWlyZWQgOiAxOwogCi0gIC8q IFRydWUgaWYgX19idWlsdGluX2lhMzJfdnplcm91cHBlciAoKSBoYXMgYmVlbiBleHBhbmRlZCBp biBjdXJyZW50Ci0gICAgIGZ1bmN0aW9uLiAgKi8KLSAgQk9PTF9CSVRGSUVMRCBoYXNfZXhwbGlj aXRfdnplcm91cHBlciA6IDE7Ci0KICAgLyogVHJ1ZSBpZiB3ZSBzaG91bGQgYWN0IHNpbGVudGx5 LCByYXRoZXIgdGhhbiByYWlzZSBhbiBlcnJvciBmb3IKICAgICAgaW52YWxpZCBjYWxscy4gICov CiAgIEJPT0xfQklURklFTEQgc2lsZW50X3AgOiAxOwpkaWZmIC0tZ2l0IGEvZ2NjL2NvbmZpZy9p Mzg2L2kzODYubWQgYi9nY2MvY29uZmlnL2kzODYvaTM4Ni5tZAppbmRleCAyZmM4ZmFlMzBmMy4u NWQ5ZjVhYTM5YWMgMTAwNjQ0Ci0tLSBhL2djYy9jb25maWcvaTM4Ni9pMzg2Lm1kCisrKyBiL2dj Yy9jb25maWcvaTM4Ni9pMzg2Lm1kCkBAIC0xOTEsNiArMTkxLDEwIEBAIChkZWZpbmVfY19lbnVt ICJ1bnNwZWMiIFsKICAgOzsgRm9yIE1PVkRJUkkgYW5kIE1PVkRJUjY0QiBzdXBwb3J0CiAgIFVO U1BFQ19NT1ZESVJJCiAgIFVOU1BFQ19NT1ZESVI2NEIKKworICA7OyBGb3IgaW5zbl9jYWxsZWVf YWJpOgorICBVTlNQRUNfQ0FMTEVFX0FCSQorCiBdKQogCiAoZGVmaW5lX2NfZW51bSAidW5zcGVj diIgWwpAQCAtNDQ3LDYgKzQ1MSwxMiBAQCAoZGVmaW5lX2NvbnN0YW50cwogICAgKEZJUlNUX1BT RVVET19SRUcJCTc2KQogICBdKQogCis7OyBJbnNuIGNhbGxlZSBhYmkgaW5kZXguCisoZGVmaW5l X2NvbnN0YW50cworICBbKEkzODZfREVGQVVMVAkwKQorICAgKEkzODZfVlpFUk9VUFBFUgkxKQor ICAgKEkzODZfVU5LTk9XTgkyKV0pCisKIDs7IEluc25zIHdob3NlIG5hbWVzIGJlZ2luIHdpdGgg Ing4Nl8iIGFyZSBlbWl0dGVkIGJ5IGdlbl9GT08gY2FsbHMKIDs7IGZyb20gaTM4Ni5jLgogCmRp ZmYgLS1naXQgYS9nY2MvY29uZmlnL2kzODYvcHJlZGljYXRlcy5tZCBiL2djYy9jb25maWcvaTM4 Ni9wcmVkaWNhdGVzLm1kCmluZGV4IGFiZDMwN2ViZGI4Li44Yjc4NzU1M2YzMiAxMDA2NDQKLS0t IGEvZ2NjL2NvbmZpZy9pMzg2L3ByZWRpY2F0ZXMubWQKKysrIGIvZ2NjL2NvbmZpZy9pMzg2L3By ZWRpY2F0ZXMubWQKQEAgLTE1OTksOCArMTU5OSw5IEBAIChkZWZpbmVfcHJlZGljYXRlICJ2emVy b2FsbF9wYXR0ZXJuIgogOzsgcmV0dXJuIHRydWUgaWYgT1AgaXMgYSB2emVyb3VwcGVyIHBhdHRl cm4uCiAoZGVmaW5lX3ByZWRpY2F0ZSAidnplcm91cHBlcl9wYXR0ZXJuIgogICAoYW5kIChtYXRj aF9jb2RlICJwYXJhbGxlbCIpCi0gICAgICAgKG1hdGNoX2NvZGUgInVuc3BlY192b2xhdGlsZSIg ImEiKQotICAgICAgIChtYXRjaF90ZXN0ICJYSU5UIChYVkVDRVhQIChvcCwgMCwgMCksIDEpID09 IFVOU1BFQ1ZfVlpFUk9VUFBFUiIpKSkKKyAgICAgICAobWF0Y2hfY29kZSAidW5zcGVjIiAiYiIp CisgICAgICAgKG1hdGNoX3Rlc3QgIlhJTlQgKFhWRUNFWFAgKG9wLCAwLCAxKSwgMSkgPT0gVU5T UEVDX0NBTExFRV9BQkkiKQorICAgICAgIChtYXRjaF90ZXN0ICJJTlRWQUwgKFhWRUNFWFAgKFhW RUNFWFAgKG9wLCAwLCAxKSwgMCwgMCkpID09IEkzODZfVlpFUk9VUFBFUiIpKSkKIAogOzsgUmV0 dXJuIHRydWUgaWYgT1AgaXMgYW4gYWRkc3ViIHZlY19tZXJnZSBvcGVyYXRpb24KIChkZWZpbmVf cHJlZGljYXRlICJhZGRzdWJfdm1fb3BlcmF0b3IiCmRpZmYgLS1naXQgYS9nY2MvY29uZmlnL2kz ODYvc3NlLm1kIGIvZ2NjL2NvbmZpZy9pMzg2L3NzZS5tZAppbmRleCBhNDUwM2RkY2I3My4uOTQ5 MzQ3YTMyNDcgMTAwNjQ0Ci0tLSBhL2djYy9jb25maWcvaTM4Ni9zc2UubWQKKysrIGIvZ2NjL2Nv bmZpZy9pMzg2L3NzZS5tZApAQCAtMjA1LDcgKzIwNSw2IEBAIChkZWZpbmVfY19lbnVtICJ1bnNw ZWN2IiBbCiAgIFVOU1BFQ1ZfTU9OSVRPUgogICBVTlNQRUNWX01XQUlUCiAgIFVOU1BFQ1ZfVlpF Uk9BTEwKLSAgVU5TUEVDVl9WWkVST1VQUEVSCiAKICAgOzsgRm9yIEtFWUxPQ0tFUgogICBVTlNQ RUNWX0xPQURJV0tFWQpAQCAtMjA4NTcsMTQgKzIwODU2LDIyIEBAIChkZWZpbmVfaW5zbiAiKmF2 eF92emVyb2FsbCIKIDs7IGlmIHRoZSB1cHBlciAxMjhiaXRzIGFyZSB1bnVzZWQuICBJbml0aWFs bHkgd2UgZXhwYW5kIHRoZSBpbnN0cnVjdGlvbnMKIDs7IGFzIHRob3VnaCB0aGV5IGhhZCBubyBl ZmZlY3Qgb24gdGhlIFNTRSByZWdpc3RlcnMsIGJ1dCBsYXRlciBhZGQgU0VUcyBhbmQKIDs7IENM T0JCRVJzIHRvIHRoZSBQQVJBTExFTCB0byBtb2RlbCB0aGUgcmVhbCBlZmZlY3QuCisKIChkZWZp bmVfZXhwYW5kICJhdnhfdnplcm91cHBlciIKLSAgWyhwYXJhbGxlbCBbKHVuc3BlY192b2xhdGls ZSBbKGNvbnN0X2ludCAwKV0gVU5TUEVDVl9WWkVST1VQUEVSKV0pXQotICAiVEFSR0VUX0FWWCIp CisgIFsocGFyYWxsZWwgWyhjYWxsIChtZW06UUkgKGNvbnN0X2ludCAwKSkKKwkJICAgIChjb25z dF9pbnQgMCkpCisJICAgICAodW5zcGVjIFsoY29uc3RfaW50IEkzODZfVlpFUk9VUFBFUildIFVO U1BFQ19DQUxMRUVfQUJJKV0pXQorICAiVEFSR0VUX0FWWCIKK3sKKyAgaXg4Nl9leHBhbmRfYXZ4 X3Z6ZXJvdXBwZXIgKCk7CisgIERPTkU7Cit9KQogCi0oZGVmaW5lX2luc24gIiphdnhfdnplcm91 cHBlciIKLSAgWyhtYXRjaF9wYXJhbGxlbCAwICJ2emVyb3VwcGVyX3BhdHRlcm4iCi0gICAgIFso dW5zcGVjX3ZvbGF0aWxlIFsoY29uc3RfaW50IDApXSBVTlNQRUNWX1ZaRVJPVVBQRVIpXSldCi0g ICJUQVJHRVRfQVZYICYmIFhWRUNMRU4gKG9wZXJhbmRzWzBdLCAwKSA9PSAoVEFSR0VUXzY0QklU ID8gMTYgOiA4KSArIDEiCisoZGVmaW5lX2luc24gImF2eF92emVyb3VwcGVyX2NhbGxlZV9hYmki CisgIFsoY2FsbCAobWVtOlFJIChjb25zdF9pbnQgMCkpCisJIChjb25zdF9pbnQgMCkpCisgICAg KHVuc3BlYyBbKGNvbnN0X2ludCBJMzg2X1ZaRVJPVVBQRVIpXSBVTlNQRUNfQ0FMTEVFX0FCSSld CisgICJUQVJHRVRfQVZYIgogICAidnplcm91cHBlciIKICAgWyhzZXRfYXR0ciAidHlwZSIgInNz ZSIpCiAgICAoc2V0X2F0dHIgIm1vZHJtIiAiMCIpCkBAIC0yMDg3Myw0NCArMjA4ODAsNiBAQCAo ZGVmaW5lX2luc24gIiphdnhfdnplcm91cHBlciIKICAgIChzZXRfYXR0ciAiYnR2ZXIyX2RlY29k ZSIgInZlY3RvciIpCiAgICAoc2V0X2F0dHIgIm1vZGUiICJPSSIpXSkKIAotKGRlZmluZV9pbnNu X2FuZF9zcGxpdCAiKmF2eF92emVyb3VwcGVyXzEiCi0gIFsobWF0Y2hfcGFyYWxsZWwgMCAidnpl cm91cHBlcl9wYXR0ZXJuIgotICAgICBbKHVuc3BlY192b2xhdGlsZSBbKGNvbnN0X2ludCAwKV0g VU5TUEVDVl9WWkVST1VQUEVSKV0pXQotICAiVEFSR0VUX0FWWCAmJiBYVkVDTEVOIChvcGVyYW5k c1swXSwgMCkgIT0gKFRBUkdFVF82NEJJVCA/IDE2IDogOCkgKyAxIgotICAiIyIKLSAgIiYmIGVw aWxvZ3VlX2NvbXBsZXRlZCIKLSAgWyhtYXRjaF9kdXAgMCldCi17Ci0gIC8qIEZvciBJUEEtUkEg cHVycG9zZXMsIG1ha2UgaXQgY2xlYXIgdGhlIGluc3RydWN0aW9uIGNsb2JiZXJzCi0gICAgIGV2 ZW4gWE1NIHJlZ2lzdGVycyBub3QgbWVudGlvbmVkIGV4cGxpY2l0bHkgaW4gdGhlIHBhdHRlcm4u ICAqLwotICB1bnNpZ25lZCBpbnQgbnJlZ3MgPSBUQVJHRVRfNjRCSVQgPyAxNiA6IDg7Ci0gIHVu c2lnbmVkIGludCBucGF0cyA9IFhWRUNMRU4gKG9wZXJhbmRzWzBdLCAwKTsKLSAgcnR2ZWMgdmVj ID0gcnR2ZWNfYWxsb2MgKG5yZWdzICsgMSk7Ci0gIFJUVkVDX0VMVCAodmVjLCAwKSA9IFhWRUNF WFAgKG9wZXJhbmRzWzBdLCAwLCAwKTsKLSAgZm9yICh1bnNpZ25lZCBpbnQgaSA9IDAsIGogPSAx OyBpIDwgbnJlZ3M7ICsraSkKLSAgICB7Ci0gICAgICB1bnNpZ25lZCBpbnQgcmVnbm8gPSBHRVRf U1NFX1JFR05PIChpKTsKLSAgICAgIGlmIChqIDwgbnBhdHMKLQkgICYmIFJFR05PIChTRVRfREVT VCAoWFZFQ0VYUCAob3BlcmFuZHNbMF0sIDAsIGopKSkgPT0gcmVnbm8pCi0JewotCSAgUlRWRUNf RUxUICh2ZWMsIGkgKyAxKSA9IFhWRUNFWFAgKG9wZXJhbmRzWzBdLCAwLCBqKTsKLQkgIGorKzsK LQl9Ci0gICAgICBlbHNlCi0JewotCSAgcnR4IHJlZyA9IGdlbl9ydHhfUkVHIChWMkRJbW9kZSwg cmVnbm8pOwotCSAgUlRWRUNfRUxUICh2ZWMsIGkgKyAxKSA9IGdlbl9ydHhfQ0xPQkJFUiAoVk9J RG1vZGUsIHJlZyk7Ci0JfQotICAgIH0KLSAgb3BlcmFuZHNbMF0gPSBnZW5fcnR4X1BBUkFMTEVM IChWT0lEbW9kZSwgdmVjKTsKLX0KLSAgWyhzZXRfYXR0ciAidHlwZSIgInNzZSIpCi0gICAoc2V0 X2F0dHIgIm1vZHJtIiAiMCIpCi0gICAoc2V0X2F0dHIgIm1lbW9yeSIgIm5vbmUiKQotICAgKHNl dF9hdHRyICJwcmVmaXgiICJ2ZXgiKQotICAgKHNldF9hdHRyICJidHZlcjJfZGVjb2RlIiAidmVj dG9yIikKLSAgIChzZXRfYXR0ciAibW9kZSIgIk9JIildKQotCiAoZGVmaW5lX21vZGVfYXR0ciBw YnJvYWRjYXN0X2V2ZXhfaXNhCiAgIFsoVjY0UUkgImF2eDUxMmJ3IikgKFYzMlFJICJhdng1MTJi dyIpIChWMTZRSSAiYXZ4NTEyYnciKQogICAgKFYzMkhJICJhdng1MTJidyIpIChWMTZISSAiYXZ4 NTEyYnciKSAoVjhISSAiYXZ4NTEyYnciKQpkaWZmIC0tZ2l0IGEvZ2NjL3Rlc3RzdWl0ZS9nY2Mu dGFyZ2V0L2kzODYvcHI4MjczNS0xLmMgYi9nY2MvdGVzdHN1aXRlL2djYy50YXJnZXQvaTM4Ni9w cjgyNzM1LTEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMC4uMWE2M2I5 YWU5YzkKLS0tIC9kZXYvbnVsbAorKysgYi9nY2MvdGVzdHN1aXRlL2djYy50YXJnZXQvaTM4Ni9w cjgyNzM1LTEuYwpAQCAtMCwwICsxLDI5IEBACisvKiB7IGRnLWRvIHJ1biB9ICovCisvKiB7IGRn LW9wdGlvbnMgIi1PMiAtbWF2eCIgfSAqLworLyogeyBkZy1yZXF1aXJlLWVmZmVjdGl2ZS10YXJn ZXQgYXZ4IH0gKi8KKworI2luY2x1ZGUgImF2eC1jaGVjay5oIgorCit2b2lkCitfX2F0dHJpYnV0 ZV9fICgobm9pcGEpKQorbXRlc3QoY2hhciAqZGVzdCkKK3sKKyAgX19tMjU2aSB5bW0xID0gX21t MjU2X3NldDFfZXBpOCgoY2hhcikweDEpOworICBfbW0yNTZfc3RvcmV1X3NpMjU2KChfX20yNTZp ICopKGRlc3QgKyAzMiksIHltbTEpOworICBfbW0yNTZfemVyb3VwcGVyKCk7CisgIF9fbTI1Nmkg eW1tMiA9IF9tbTI1Nl9zZXQxX2VwaTgoKGNoYXIpMHgxKTsKKyAgX21tMjU2X3N0b3JldV9zaTI1 NigoX19tMjU2aSAqKWRlc3QsIHltbTIpOworfQorCit2b2lkCithdnhfdGVzdCAoKQoreworICBj aGFyIGJ1Zls2NF07CisgIGZvciAoaW50IGkgPSAwOyBpICE9IDY0OyBpKyspCisgICAgYnVmW2ld ID0gMjsKKyAgbXRlc3QgKGJ1Zik7CisKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCAzMjsgKytpKQor ICAgIGlmIChidWZbaV0gIT0gMSkKKyAgICAgIF9fYnVpbHRpbl9hYm9ydCAoKTsKK30KZGlmZiAt LWdpdCBhL2djYy90ZXN0c3VpdGUvZ2NjLnRhcmdldC9pMzg2L3ByODI3MzUtMi5jIGIvZ2NjL3Rl c3RzdWl0ZS9nY2MudGFyZ2V0L2kzODYvcHI4MjczNS0yLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQK aW5kZXggMDAwMDAwMDAwMDAuLmFjOWQwMDZmNzk0Ci0tLSAvZGV2L251bGwKKysrIGIvZ2NjL3Rl c3RzdWl0ZS9nY2MudGFyZ2V0L2kzODYvcHI4MjczNS0yLmMKQEAgLTAsMCArMSwyMiBAQAorLyog eyBkZy1kbyBjb21waWxlIH0gKi8KKy8qIHsgZGctb3B0aW9ucyAiLW1hdnggLU8yIiB9ICovCisK KyNpbmNsdWRlIDxpbW1pbnRyaW4uaD4KKwordm9pZCB0ZXN0KGNoYXIgKmRlc3QpCit7CisgIC8q IHhtbTEgY2FuIGJlIHByb3BhZ2F0ZWQgdG8geG1tMiBieSBDU0UuICAqLworICBfX20xMjhpIHht bTEgPSBfbW1fc2V0X2VwaTgoMHgxLCAweDIsIDB4MywgMHg0LCAweDUsIDB4NiwgMHg3LCAweDgs CisJCQkgICAgICAweDksIDB4MTAsIDB4MTEsIDB4MTIsIDB4MTMsIDB4MTQsIDB4MTUsIDB4MTYp OworICBfbW1fc3RvcmV1X3NpMTI4KChfX20xMjhpICopKGRlc3QgKyAzMiksIHhtbTEpOworICBf bW0yNTZfemVyb3VwcGVyKCk7CisgIF9tbTI1Nl96ZXJvdXBwZXIoKTsKKyAgX21tMjU2X3plcm91 cHBlcigpOworICBfbW0yNTZfemVyb3VwcGVyKCk7CisgIF9tbTI1Nl96ZXJvdXBwZXIoKTsKKyAg X19tMTI4aSB4bW0yID0geG1tMTsKKyAgX21tX3N0b3JldV9zaTEyOCgoX19tMTI4aSAqKWRlc3Qs IHhtbTIpOworfQorCisvKiBEYXJ3aW4gbG9jYWwgY29uc3RhbnQgc3ltYm9sIGlzICJsQzAiLCBF TEYgdGFyZ2V0cyAiLkxDMCIgKi8KKy8qIHsgZGctZmluYWwgeyBzY2FuLWFzc2VtYmxlci10aW1l cyB7KD9uKXZtb3ZkcWFcdFwuP1tMbF1DMFteLF0qLCAleG1tWzAtOV19IDEgfSB9ICovCmRpZmYg LS1naXQgYS9nY2MvdGVzdHN1aXRlL2djYy50YXJnZXQvaTM4Ni9wcjgyNzM1LTMuYyBiL2djYy90 ZXN0c3VpdGUvZ2NjLnRhcmdldC9pMzg2L3ByODI3MzUtMy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0 CmluZGV4IDAwMDAwMDAwMDAwLi5lM2Y4MDFlNjkyNAotLS0gL2Rldi9udWxsCisrKyBiL2djYy90 ZXN0c3VpdGUvZ2NjLnRhcmdldC9pMzg2L3ByODI3MzUtMy5jCkBAIC0wLDAgKzEsNSBAQAorLyog eyBkZy1kbyBjb21waWxlIH0gKi8KKy8qIHsgZGctb3B0aW9ucyAiLW1hdnggLU8yIC1tYWJpPW1z IiB9ICovCisvKiB7IGRnLWZpbmFsIHsgc2Nhbi1hc3NlbWJsZXItbm90IHsoP24peG1tKFs2LTld fDFbMC01XSl9IH0gfSAqLworCisjaW5jbHVkZSAicHI4MjczNS0yLmMiCmRpZmYgLS1naXQgYS9n Y2MvdGVzdHN1aXRlL2djYy50YXJnZXQvaTM4Ni9wcjgyNzM1LTQuYyBiL2djYy90ZXN0c3VpdGUv Z2NjLnRhcmdldC9pMzg2L3ByODI3MzUtNC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAw MDAwMDAwMDAwLi43OGMwYTZjYjJjOAotLS0gL2Rldi9udWxsCisrKyBiL2djYy90ZXN0c3VpdGUv Z2NjLnRhcmdldC9pMzg2L3ByODI3MzUtNC5jCkBAIC0wLDAgKzEsNDggQEAKKy8qIHsgZGctZG8g Y29tcGlsZSB7IHRhcmdldCB7ICEgaWEzMiB9IH0gfSAgKi8KKy8qIHsgZGctb3B0aW9ucyAiLW1h dnggLU8yIC1tYWJpPW1zIC1tbm8tYXZ4NTEyZiAtbWFzbT1hdHQiIH0gKi8KKy8qIHsgZGctZmlu YWwgeyBzY2FuLWFzc2VtYmxlci10aW1lcyB7KD9uKSg/OnZtb3ZkcWFbMS05XSp8dm1vdmFwW3Nk XSlbXHQgXSoleG1tWzAtOV0rLCBbMC05XSpcKCVyc3BcKX0gMTAgfSB9ICovCisvKiB7IGRnLWZp bmFsIHsgc2Nhbi1hc3NlbWJsZXItdGltZXMgeyg/bikoPzp2bW92ZHFhWzEtOV0qfHZtb3ZhcFtz ZF0pW1x0IF0qWzAtOV0qXCglcnNwXCksICV4bW1bMC05XSt9IDEwIH0gfSAqLworCisjaW5jbHVk ZSA8aW1taW50cmluLmg+CisKK3ZvaWQgdGVzdChjaGFyICpkZXN0KQoreworICBfX20yNTZpIHlt bTAsIHltbTEsIHltbTIsIHltbTMsIHltbTQsIHltbTUsIHltbTYsIHltbTcsIHltbTgsIHltbTks IHltbTEwLCB5bW0xMSwgeW1tMTIsIHltbTEzLCB5bW0xNCwgeW1tMTU7CisgIGFzbSB2b2xhdGls ZSAoInZtb3ZkcWFcdCUleW1tMCwgJTBcblx0IgorCQkidm1vdmRxYVx0JSV5bW0wLCAlMVxuXHQi CisJCSJ2bW92ZHFhXHQlJXltbTAsICUyXG5cdCIKKwkJInZtb3ZkcWFcdCUleW1tMCwgJTNcblx0 IgorCQkidm1vdmRxYVx0JSV5bW0wLCAlNFxuXHQiCisJCSJ2bW92ZHFhXHQlJXltbTAsICU1XG5c dCIKKwkJInZtb3ZkcWFcdCUleW1tMCwgJTZcblx0IgorCQkidm1vdmRxYVx0JSV5bW0wLCAlN1xu XHQiCisJCSJ2bW92ZHFhXHQlJXltbTAsICU4XG5cdCIKKwkJInZtb3ZkcWFcdCUleW1tMCwgJTlc blx0IgorCQkidm1vdmRxYVx0JSV5bW0wLCAlMTBcblx0IgorCQkidm1vdmRxYVx0JSV5bW0wLCAl MTFcblx0IgorCQkidm1vdmRxYVx0JSV5bW0wLCAlMTJcblx0IgorCQkidm1vdmRxYVx0JSV5bW0w LCAlMTNcblx0IgorCQkidm1vdmRxYVx0JSV5bW0wLCAlMTRcblx0IgorCQkidm1vdmRxYVx0JSV5 bW0wLCAlMTVcblx0IgorCQk6ICI9diIgKHltbTEpLCAiPXYiICh5bW0yKSwgIj12Iih5bW0zKSwg Ij12IiAoeW1tNCksICI9diIgKHltbTUpLAorCQkgICI9diIgKHltbTYpLCAiPXYiICh5bW03KSwg Ij12Iih5bW04KSwgIj12IiAoeW1tOSksICI9diIgKHltbTEwKSwKKwkJICAiPXYiICh5bW0xMSks ICI9diIgKHltbTEyKSwgIj12Iih5bW0xMyksICI9diIgKHltbTE0KSwgIj12IiAoeW1tMTUpLAor CQkgICI9diIoeW1tMCkKKwkJOjopOworICBfbW0yNTZfemVyb3VwcGVyKCk7CisgIF9tbTI1Nl9z dG9yZXVfc2kyNTYoKF9fbTI1NmkgKilkZXN0LCB5bW0xKTsKKyAgX21tMjU2X3N0b3JldV9zaTI1 NigoX19tMjU2aSAqKShkZXN0ICsgMzIpLCB5bW0yKTsKKyAgX21tMjU2X3N0b3JldV9zaTI1Nigo X19tMjU2aSAqKShkZXN0ICsgMzIgKiAyKSwgeW1tMyk7CisgIF9tbTI1Nl9zdG9yZXVfc2kyNTYo KF9fbTI1NmkgKikoZGVzdCArIDMyICogMyksIHltbTQpOworICBfbW0yNTZfc3RvcmV1X3NpMjU2 KChfX20yNTZpICopKGRlc3QgKyAzMiAqIDQpLCB5bW01KTsKKyAgX21tMjU2X3N0b3JldV9zaTI1 NigoX19tMjU2aSAqKShkZXN0ICsgMzIgKiA1KSwgeW1tNik7CisgIF9tbTI1Nl9zdG9yZXVfc2ky NTYoKF9fbTI1NmkgKikoZGVzdCArIDMyICogNiksIHltbTcpOworICBfbW0yNTZfc3RvcmV1X3Np MjU2KChfX20yNTZpICopKGRlc3QgKyAzMiAqIDcpLCB5bW04KTsKKyAgX21tMjU2X3N0b3JldV9z aTI1NigoX19tMjU2aSAqKShkZXN0ICsgMzIgKiA4KSwgeW1tOSk7CisgIF9tbTI1Nl9zdG9yZXVf c2kyNTYoKF9fbTI1NmkgKikoZGVzdCArIDMyICogOSksIHltbTEwKTsKKyAgX21tMjU2X3N0b3Jl dV9zaTI1NigoX19tMjU2aSAqKShkZXN0ICsgMzIgKiAxMCksIHltbTExKTsKKyAgX21tMjU2X3N0 b3JldV9zaTI1NigoX19tMjU2aSAqKShkZXN0ICsgMzIgKiAxMSksIHltbTEyKTsKKyAgX21tMjU2 X3N0b3JldV9zaTI1NigoX19tMjU2aSAqKShkZXN0ICsgMzIgKiAxMiksIHltbTEzKTsKKyAgX21t MjU2X3N0b3JldV9zaTI1NigoX19tMjU2aSAqKShkZXN0ICsgMzIgKiAxMyksIHltbTE0KTsKKyAg X21tMjU2X3N0b3JldV9zaTI1NigoX19tMjU2aSAqKShkZXN0ICsgMzIgKiAxNCksIHltbTE1KTsK K30KZGlmZiAtLWdpdCBhL2djYy90ZXN0c3VpdGUvZ2NjLnRhcmdldC9pMzg2L3ByODI3MzUtNS5j IGIvZ2NjL3Rlc3RzdWl0ZS9nY2MudGFyZ2V0L2kzODYvcHI4MjczNS01LmMKbmV3IGZpbGUgbW9k ZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAuLjJhNThjYmU1MmQwCi0tLSAvZGV2L251bGwKKysr IGIvZ2NjL3Rlc3RzdWl0ZS9nY2MudGFyZ2V0L2kzODYvcHI4MjczNS01LmMKQEAgLTAsMCArMSw1 NCBAQAorLyogeyBkZy1kbyBjb21waWxlIHsgdGFyZ2V0IHsgISBpYTMyIH0gfSB9ICAqLworLyog eyBkZy1vcHRpb25zICItbWF2eCAtTzIgLW1hYmk9bXMgLW1uby1hdng1MTJmIC1tYXNtPWF0dCIg fSAqLworLyogeyBkZy1maW5hbCB7IHNjYW4tYXNzZW1ibGVyLXRpbWVzIHsoP24pKD86dm1vdmRx YVsxLTldKnx2bW92YXBbc2RdKVtcdCBdKiV4bW1bMC05XSssIFswLTldKlwoJXJzcFwpfSAxMCB9 IH0gKi8KKy8qIHsgZGctZmluYWwgeyBzY2FuLWFzc2VtYmxlci10aW1lcyB7KD9uKSg/OnZtb3Zk cWFbMS05XSp8dm1vdmFwW3NkXSlbXHQgXSpbMC05XSpcKCVyc3BcKSwgJXhtbVswLTldK30gMTAg fSB9ICovCisKKyNpbmNsdWRlIDxpbW1pbnRyaW4uaD4KKwordm9pZCB0ZXN0KGNoYXIgKmRlc3Qp Cit7CisgIF9fbTI1NmkgeW1tMCwgeW1tMSwgeW1tMiwgeW1tMywgeW1tNCwgeW1tNSwgeW1tNiwg eW1tNywgeW1tOCwgeW1tOSwgeW1tMTAsIHltbTExLCB5bW0xMiwgeW1tMTMsIHltbTE0LCB5bW0x NTsKKyAgYXNtIHZvbGF0aWxlICgidm1vdmRxYVx0JSV5bW0wLCAlMFxuXHQiCisJCSJ2bW92ZHFh XHQlJXltbTAsICUxXG5cdCIKKwkJInZtb3ZkcWFcdCUleW1tMCwgJTJcblx0IgorCQkidm1vdmRx YVx0JSV5bW0wLCAlM1xuXHQiCisJCSJ2bW92ZHFhXHQlJXltbTAsICU0XG5cdCIKKwkJInZtb3Zk cWFcdCUleW1tMCwgJTVcblx0IgorCQkidm1vdmRxYVx0JSV5bW0wLCAlNlxuXHQiCisJCSJ2bW92 ZHFhXHQlJXltbTAsICU3XG5cdCIKKwkJInZtb3ZkcWFcdCUleW1tMCwgJThcblx0IgorCQkidm1v dmRxYVx0JSV5bW0wLCAlOVxuXHQiCisJCSJ2bW92ZHFhXHQlJXltbTAsICUxMFxuXHQiCisJCSJ2 bW92ZHFhXHQlJXltbTAsICUxMVxuXHQiCisJCSJ2bW92ZHFhXHQlJXltbTAsICUxMlxuXHQiCisJ CSJ2bW92ZHFhXHQlJXltbTAsICUxM1xuXHQiCisJCSJ2bW92ZHFhXHQlJXltbTAsICUxNFxuXHQi CisJCSJ2bW92ZHFhXHQlJXltbTAsICUxNVxuXHQiCisJCTogIj12IiAoeW1tMSksICI9diIgKHlt bTIpLCAiPXYiKHltbTMpLCAiPXYiICh5bW00KSwgIj12IiAoeW1tNSksCisJCSAgIj12IiAoeW1t NiksICI9diIgKHltbTcpLCAiPXYiKHltbTgpLCAiPXYiICh5bW05KSwgIj12IiAoeW1tMTApLAor CQkgICI9diIgKHltbTExKSwgIj12IiAoeW1tMTIpLCAiPXYiKHltbTEzKSwgIj12IiAoeW1tMTQp LCAiPXYiICh5bW0xNSksCisJCSAgIj12Iih5bW0wKQorCQk6Oik7CisgIF9tbTI1Nl96ZXJvdXBw ZXIoKTsKKyAgX21tMjU2X3plcm91cHBlcigpOworICBfbW0yNTZfemVyb3VwcGVyKCk7CisgIF9t bTI1Nl96ZXJvdXBwZXIoKTsKKyAgX21tMjU2X3plcm91cHBlcigpOworICBfbW0yNTZfemVyb3Vw cGVyKCk7CisgIF9tbTI1Nl96ZXJvdXBwZXIoKTsKKyAgX21tMjU2X3N0b3JldV9zaTI1NigoX19t MjU2aSAqKWRlc3QsIHltbTEpOworICBfbW0yNTZfc3RvcmV1X3NpMjU2KChfX20yNTZpICopKGRl c3QgKyAzMiksIHltbTIpOworICBfbW0yNTZfc3RvcmV1X3NpMjU2KChfX20yNTZpICopKGRlc3Qg KyAzMiAqIDIpLCB5bW0zKTsKKyAgX21tMjU2X3N0b3JldV9zaTI1NigoX19tMjU2aSAqKShkZXN0 ICsgMzIgKiAzKSwgeW1tNCk7CisgIF9tbTI1Nl9zdG9yZXVfc2kyNTYoKF9fbTI1NmkgKikoZGVz dCArIDMyICogNCksIHltbTUpOworICBfbW0yNTZfc3RvcmV1X3NpMjU2KChfX20yNTZpICopKGRl c3QgKyAzMiAqIDUpLCB5bW02KTsKKyAgX21tMjU2X3N0b3JldV9zaTI1NigoX19tMjU2aSAqKShk ZXN0ICsgMzIgKiA2KSwgeW1tNyk7CisgIF9tbTI1Nl9zdG9yZXVfc2kyNTYoKF9fbTI1NmkgKiko ZGVzdCArIDMyICogNyksIHltbTgpOworICBfbW0yNTZfc3RvcmV1X3NpMjU2KChfX20yNTZpICop KGRlc3QgKyAzMiAqIDgpLCB5bW05KTsKKyAgX21tMjU2X3N0b3JldV9zaTI1NigoX19tMjU2aSAq KShkZXN0ICsgMzIgKiA5KSwgeW1tMTApOworICBfbW0yNTZfc3RvcmV1X3NpMjU2KChfX20yNTZp ICopKGRlc3QgKyAzMiAqIDEwKSwgeW1tMTEpOworICBfbW0yNTZfc3RvcmV1X3NpMjU2KChfX20y NTZpICopKGRlc3QgKyAzMiAqIDExKSwgeW1tMTIpOworICBfbW0yNTZfc3RvcmV1X3NpMjU2KChf X20yNTZpICopKGRlc3QgKyAzMiAqIDEyKSwgeW1tMTMpOworICBfbW0yNTZfc3RvcmV1X3NpMjU2 KChfX20yNTZpICopKGRlc3QgKyAzMiAqIDEzKSwgeW1tMTQpOworICBfbW0yNTZfc3RvcmV1X3Np MjU2KChfX20yNTZpICopKGRlc3QgKyAzMiAqIDE0KSwgeW1tMTUpOworfQotLSAKMi4xOC4xCgo= --0000000000008750eb05c3aafde7--