From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-wr1-x441.google.com (mail-wr1-x441.google.com [IPv6:2a00:1450:4864:20::441]) by sourceware.org (Postfix) with ESMTPS id 171C83857027 for ; Sat, 18 Jul 2020 05:57:57 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.3.2 sourceware.org 171C83857027 Received: by mail-wr1-x441.google.com with SMTP id f7so13193888wrw.1 for ; Fri, 17 Jul 2020 22:57:57 -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=lFcbBfXZlAx/y+vYRg04xOP9I2TL1uksDIjOQMMpmTc=; b=HQLj55kWGgSYcVLZoxGWo/kvH98vdyY5tLirl9uwEKdOnna61NQie2iZoBp05NukRM cjgZGiBxEHaHebL8YJaIADWICzdp/26AF6wTcVXn+mrOKLlsvx5RkRLGO6NMxrkGaZDx Zc6mAVRoqwKX8kgblqV2nNCWP0F9xeWwLvad+dTC/aZuPuL4ZaW6Ofm4aHiHI2xIJoo+ QWjiwuvFVShPsAvWRCySLozTNMehENz6S4lztLtROt0T1KSb/3lRqPPz9k/g9fVctavX NirwMklNuU8jY6PvURBEV5yUMUgeGtOIy3P1dHvgHoIupwtcH1UQDmkt0SysTs2d4jZX M5zw== X-Gm-Message-State: AOAM53333TMSzv+mlLtvDDV6P0QiALXaW2f6Acne2zTwHs1O30f6Mlq+ HzRy9GlnAtsVOoLh7At6lLRv+eHJhfmCPLRBxaM= X-Google-Smtp-Source: ABdhPJxy8OF0ZFXvfshN+tXNTiGcj1yjg/d4aEGWYloS6F7juIqd8EHibHcr0xLWueJnCtq9bliSqDIYIf7baLfKY94= X-Received: by 2002:a5d:688d:: with SMTP id h13mr12973594wru.303.1595051876051; Fri, 17 Jul 2020 22:57:56 -0700 (PDT) MIME-Version: 1.0 References: <20200623152917.1742147-1-skpgkp2@gmail.com> <7c1b0a27-2c43-c17c-feab-5160f076f7b1@redhat.com> In-Reply-To: From: Sunil Pandey Date: Fri, 17 Jul 2020 22:57:44 -0700 Message-ID: Subject: Re: [PATCH] Add TARGET_LOWER_LOCAL_DECL_ALIGNMENT [PR95237] To: Richard Biener Cc: GCC Patches , "H.J. Lu" , Jason Merrill , "Joseph S. Myers" , Sunil K Pandey Content-Type: multipart/mixed; boundary="00000000000078cc0a05aab0f4bd" X-Spam-Status: No, score=-7.2 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, FREEMAIL_ENVFROM_END_DIGIT, FREEMAIL_FROM, GIT_PATCH_0, HK_RANDOM_ENVFROM, HK_RANDOM_FROM, KAM_SHORT, 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: Sat, 18 Jul 2020 05:58:00 -0000 --00000000000078cc0a05aab0f4bd Content-Type: text/plain; charset="UTF-8" On Fri, Jul 17, 2020 at 1:22 AM Richard Biener wrote: > > On Fri, Jul 17, 2020 at 7:15 AM Sunil Pandey wrote: > > > > Any comment on revised patch? At least, in finish_decl, decl global attributes are populated. > > +static void > +ix86_lower_local_decl_alignment (tree decl) > +{ > + unsigned new_align = LOCAL_DECL_ALIGNMENT (decl); > > please use the macro-expanded call here since we want to amend > ix86_local_alignment to _not_ return a lower alignment when > called as LOCAL_DECL_ALIGNMENT (by adding a new parameter > to ix86_local_alignment). Can you also amend the patch in this > way? > > + if (new_align < DECL_ALIGN (decl)) > + SET_DECL_ALIGN (decl, new_align); > > diff --git a/gcc/c/c-decl.c b/gcc/c/c-decl.c > index 81bd2ee94f0..1ae99e30ed1 100644 > --- a/gcc/c/c-decl.c > +++ b/gcc/c/c-decl.c > @@ -5601,6 +5601,8 @@ finish_decl (tree decl, location_t init_loc, tree init, > } > > invoke_plugin_callbacks (PLUGIN_FINISH_DECL, decl); > + /* Lower local decl alignment. */ > + lower_decl_alignment (decl); > } > > should come before plugin hook invocation, likewise for the cp_finish_decl case. > > +/* Lower DECL alignment. */ > + > +void > +lower_decl_alignment (tree decl) > +{ > + if (VAR_P (decl) > + && !is_global_var (decl) > + && !DECL_HARD_REGISTER (decl)) > + targetm.lower_local_decl_alignment (decl); > +} > > please avoid this function, it's name sounds too generic and it's not worth > adding a public API for two calls. > > Alltogether this should avoid the x86 issue leaving left-overs (your identified > inliner case) as missed optimization [for the linux kernel which appearantly > decided that -mpreferred-stack-boundary=2 is a good ABI to use]. > > Richard. > > Revised patch attached. > > On Tue, Jul 14, 2020 at 8:37 AM Sunil Pandey wrote: > >> > >> On Sat, Jul 4, 2020 at 9:11 AM Richard Biener > >> wrote: > >> > > >> > On July 3, 2020 11:16:46 PM GMT+02:00, Jason Merrill wrote: > >> > >On 6/29/20 5:00 AM, Richard Biener wrote: > >> > >> On Fri, Jun 26, 2020 at 10:11 PM H.J. Lu wrote: > >> > >>> > >> > >>> On Thu, Jun 25, 2020 at 1:10 AM Richard Biener > >> > >>> wrote: > >> > >>>> > >> > >>>> On Thu, Jun 25, 2020 at 2:53 AM Sunil Pandey > >> > >wrote: > >> > >>>>> > >> > >>>>> On Wed, Jun 24, 2020 at 12:30 AM Richard Biener > >> > >>>>> wrote: > >> > >>>>>> > >> > >>>>>> On Tue, Jun 23, 2020 at 5:31 PM Sunil K Pandey via Gcc-patches > >> > >>>>>> wrote: > >> > >>>>>>> > >> > >>>>>>> From: Sunil K Pandey > >> > >>>>>>> > >> > >>>>>>> Default for this hook is NOP. For x86, in 32 bit mode, this hook > >> > >>>>>>> sets alignment of long long on stack to 32 bits if preferred > >> > >stack > >> > >>>>>>> boundary is 32 bits. > >> > >>>>>>> > >> > >>>>>>> - This patch fixes > >> > >>>>>>> gcc.target/i386/pr69454-2.c > >> > >>>>>>> gcc.target/i386/stackalign/longlong-1.c > >> > >>>>>>> - Regression test on x86-64, no new fail introduced. > >> > >>>>>> > >> > >>>>>> I think the name is badly chosen, > >> > >TARGET_LOWER_LOCAL_DECL_ALIGNMENT > >> > >>>>> > >> > >>>>> Yes, I can change the target hook name. > >> > >>>>> > >> > >>>>>> would be better suited (and then asks for LOCAL_DECL_ALIGNMENT to > >> > >be > >> > >>>>>> renamed to INCREASE_LOCAL_DECL_ALIGNMENT). > >> > >>>>> > >> > >>>>> It seems like LOCAL_DECL_ALIGNMENT macro documentation is > >> > >incorrect. > >> > >>>>> It increases as well as decreases alignment based on > >> > >condition(-m32 > >> > >>>>> -mpreferred-stack-boundary=2) > >> > >>>>> https://gcc.gnu.org/bugzilla/show_bug.cgi?id=95885 > >> > >>>>> > >> > >>>>>> > >> > >>>>>> You're calling it from do_type_align which IMHO is dangerous > >> > >since that's > >> > >>>>>> invoked from FIELD_DECL layout as well. Instead invoke it from > >> > >>>>>> layout_decl itself where we do > >> > >>>>>> > >> > >>>>>> if (code != FIELD_DECL) > >> > >>>>>> /* For non-fields, update the alignment from the type. */ > >> > >>>>>> do_type_align (type, decl); > >> > >>>>>> > >> > >>>>>> and invoke the hook _after_ do_type_align. Also avoid > >> > >>>>>> invoking the hook on globals or hard regs and only > >> > >>>>>> invoke it on VAR_DECLs, thus only > >> > >>>>>> > >> > >>>>>> if (VAR_P (decl) && !is_global_var (decl) && > >> > >!DECL_HARD_REGISTER (decl)) > >> > >>>>> > >> > >>>>> It seems like decl property is not fully populated at this point > >> > >call > >> > >>>>> to is_global_var (decl) on global variable return false. > >> > >>>>> > >> > >>>>> $ cat foo.c > >> > >>>>> long long x; > >> > >>>>> int main() > >> > >>>>> { > >> > >>>>> if (__alignof__(x) != 8) > >> > >>>>> __builtin_abort(); > >> > >>>>> return 0; > >> > >>>>> } > >> > >>>>> > >> > >>>>> Breakpoint 1, layout_decl (decl=0x7ffff7ffbb40, known_align=0) > >> > >>>>> at /local/skpandey/gccwork/gccwork/gcc/gcc/stor-layout.c:674 > >> > >>>>> 674 do_type_align (type, decl); > >> > >>>>> Missing separate debuginfos, use: dnf debuginfo-install > >> > >>>>> gmp-6.1.2-10.fc31.x86_64 isl-0.16.1-9.fc31.x86_64 > >> > >>>>> libmpc-1.1.0-4.fc31.x86_64 mpfr-3.1.6-5.fc31.x86_64 > >> > >>>>> zlib-1.2.11-20.fc31.x86_64 > >> > >>>>> (gdb) call debug_tree(decl) > >> > >>>>> >> > >>>>> type >> > >>>>> size > >> > >>>>> unit-size > >> > >>>>> align:64 warn_if_not_align:0 symtab:0 alias-set -1 > >> > >>>>> canonical-type 0x7fffea801888 precision:64 min >> > >>>>> 0x7fffea7e8fd8 -9223372036854775808> max >> > >0x7fffea806000 > >> > >>>>> 9223372036854775807> > >> > >>>>> pointer_to_this > > >> > >>>>> DI foo.c:1:11 size unit-size > >> > >>>>> > >> > >>>>> align:1 warn_if_not_align:0> > >> > >>>>> > >> > >>>>> (gdb) p is_global_var(decl) > >> > >>>>> $1 = false > >> > >>>>> (gdb) > >> > >>>>> > >> > >>>>> > >> > >>>>> What about calling hook here > >> > >>>>> > >> > >>>>> 603 do_type_align (tree type, tree decl) > >> > >>>>> 604 { > >> > >>>>> 605 if (TYPE_ALIGN (type) > DECL_ALIGN (decl)) > >> > >>>>> 606 { > >> > >>>>> 607 SET_DECL_ALIGN (decl, TYPE_ALIGN (type)); > >> > >>>>> 608 if (TREE_CODE (decl) == FIELD_DECL) > >> > >>>>> 609 DECL_USER_ALIGN (decl) = TYPE_USER_ALIGN (type); > >> > >>>>> 610 else > >> > >>>>> 611 /* Lower local decl alignment */ > >> > >>>>> 612 if (VAR_P (decl) > >> > >>>>> 613 && !is_global_var (decl) > >> > >>>>> 614 && !DECL_HARD_REGISTER (decl) > >> > >>>>> 615 && cfun != NULL) > >> > >>>>> 616 targetm.lower_local_decl_alignment (decl); > >> > >>>>> 617 } > >> > >>>> > >> > >>>> But that doesn't change anything (obviously). layout_decl > >> > >>>> is called quite early, too early it looks like. > >> > >>>> > >> > >>>> Now there doesn't seem to be any other good place where > >> > >>>> we are sure to catch the decl before we evaluate things > >> > >>>> like __alignof__ > >> > >>>> > >> > >>>> void __attribute__((noipa)) > >> > >>>> foo (__SIZE_TYPE__ align, long long *p) > >> > >>>> { > >> > >>>> if ((__SIZE_TYPE__)p & (align-1)) > >> > >>>> __builtin_abort (); > >> > >>>> } > >> > >>>> int main() > >> > >>>> { > >> > >>>> long long y; > >> > >>>> foo (_Alignof y, &y); > >> > >>>> return 0; > >> > >>>> } > >> > >>>> > >> > >>>> Joseph/Jason - do you have a good recommendation > >> > >>>> how to deal with targets where natural alignment > >> > >>>> is supposed to be lowered for optimization purposes? > >> > >>>> (this case is for i?86 to avoid dynamic stack re-alignment > >> > >>>> to align long long to 8 bytes with -mpreferred-stack-boundary=2) > >> > >>>> > >> > >>>> I note that for -mincoming-stack-boundary=2 we do perform > >> > >>>> dynamic stack re-alignment already. > >> > >>>> > >> > >>>> I can't find a suitable existing target macro/hook for this, > >> > >>>> but my gut feeling is that the default alignment should > >> > >>>> instead be the lower one and instead the alignment for > >> > >>>> globals should be raised as optimization? > >> > >>>> > >> > >>> > >> > >>> Here is the updated patch from Sunil. > >> > >> > >> > >> It does not address the fundamental issue that during > >> > >> do_type_align the is_global_var predicate is not > >> > >> reliable. This means that for > >> > >> > >> > >> int main() > >> > >> { > >> > >> extern long z; > >> > >> } > >> > >> > >> > >> the new hook (with -m32 -mpreferred-stack-boundary=2) > >> > >> will lower the alignment of 'z' which looks wrong. During > >> > >> layout_decl we can unfortunately not distinguish between > >> > >> locals and globals. We need to find another spot to adjust > >> > >> alignment of locals. For C that might be in finish_decl, > >> > >> for C++ there's probably another suitable place. > >> > > > >> > >cp_finish_decl could work, but layout_decl seems like the right spot; > >> > >if > >> > >the problem is that the appropriate flags currently aren't being set in > >> > > > >> > >time, can't we fix that? > >> > > >> > The first and usually only call to layout_decl is from build_decl which gets nothing more than the type... But yes, I also initially thought that's the correct spot but it turns out it isn't. > >> > >> I added a new function lower_decl_alignment and invoked from > >> cp_decl_finish/decl_finish. Attached is revised patch. > >> > > >> > >> Note it needs to be a place before the frontends possibly > >> > >> inspect the alignment of the decl > >> > >> In C++ constexpr evalualtion might also expose alignment > >> > >> "early" so we really need a frontend solution here. > >> > > > >> > >Yes, we need to know the alignment right after the declaration. > >> > > > >> > >Jason > >> > --00000000000078cc0a05aab0f4bd Content-Type: text/plain; charset="US-ASCII"; name="pr95237_v1.patch.txt" Content-Disposition: attachment; filename="pr95237_v1.patch.txt" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_kcr8n5fl0 RnJvbSA0Njc2YjcwOTVjN2Y2MDhiMDM2NDExZGQxNGZkNWJjNzM2MjA4MjkzIE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBTdW5pbCBLIFBhbmRleSA8c2twZ2twMkBnbWFpbC5jb20+CkRh dGU6IEZyaSwgMTcgSnVsIDIwMjAgMTk6NDI6MDkgLTA3MDAKU3ViamVjdDogW1BBVENIXSBBZGQg VEFSR0VUX0xPV0VSX0xPQ0FMX0RFQ0xfQUxJR05NRU5UIFtQUjk1MjM3XQoKRGVmYXVsdCBmb3Ig dGhpcyBob29rIGlzIE5PUC4gRm9yIHg4NiwgaW4gMzIgYml0IG1vZGUsIHRoaXMgaG9vawpzZXRz IGFsaWdubWVudCBvZiBsb25nIGxvbmcgb24gc3RhY2sgdG8gMzIgYml0cyBpZiBwcmVmZXJyZWQg c3RhY2sKYm91bmRhcnkgaXMgMzIgYml0cy4KCiAgLSBUaGlzIHBhdGNoIGZpeGVzCglnY2MudGFy Z2V0L2kzODYvcHI2OTQ1NC0yLmMKCWdjYy50YXJnZXQvaTM4Ni9zdGFja2FsaWduL2xvbmdsb25n LTEuYwogIC0gUmVncmVzc2lvbiB0ZXN0IG9uIHg4Ni02NCwgbm8gbmV3IGZhaWwgaW50cm9kdWNl ZC4KClRlc3RlZCBvbiB4ODYtNjQuCgpnY2MvYy9DaGFuZ2VMb2c6CgoJUFIgdGFyZ2V0Lzk1MjM3 CgkqIGMtZGVjbC5jIChmaW5pc2hfZGVjbCk6IENhbGwgdGFyZ2V0IGhvb2sKCWxvd2VyX2xvY2Fs X2RlY2xfYWxpZ25tZW50IHRvIGxvd2VyIGxvY2FsIGRlY2wgYWxpZ25tZW50LgoKZ2NjL0NoYW5n ZUxvZzoKCglQUiB0YXJnZXQvOTUyMzcKCSogY29uZmlnL2kzODYvaTM4Ni1wcm90b3MuaCAoaXg4 Nl9sb2NhbF9hbGlnbm1lbnQpOiBBZGQKCWFub3RoZXIgZnVuY3Rpb24gcGFyYW1ldGVyLgoJKiBj b25maWcvaTM4Ni9pMzg2LmMgKGl4ODZfbG93ZXJfbG9jYWxfZGVjbF9hbGlnbm1lbnQpOiBOZXcK CWZ1bmN0aW9uLgoJKGl4ODZfbG9jYWxfYWxpZ25tZW50KTogQW1lbmQgaXg4Nl9sb2NhbF9hbGln bm1lbnQgdG8gYWNjZXB0Cglhbm90aGVyIHBhcmFtZXRlciBzZXRhbGlnbi4gSWYgc2V0YWxpZ24g aXMgdHJ1ZSBhbmQgbmV3IGFsaWduCgl2YWx1ZSBpcyBsb3dlciwgaXQgd2lsbCBzZXQgZGVjbCBh bGlnbiB0byBuZXcgdmFsdWUuIE5vCgljaGFuZ2UgaWYgc2V0YWxpZ24gZmFsc2UuCgkoVEFSR0VU X0xPV0VSX0xPQ0FMX0RFQ0xfQUxJR05NRU5UKTogRGVmaW5lLgoJKiBjb25maWcvaTM4Ni9pMzg2 LmggKExPQ0FMX0FMSUdOTUVOVCk6IEFkZCBhbm90aGVyIGZ1bmN0aW9uCglwYXJhbWV0ZXIuCgko U1RBQ0tfU0xPVF9BTElHTk1FTlQpOiBBZGQgYW5vdGhlciBmdW5jdGlvbiBwYXJhbWV0ZXIuCgko TE9DQUxfREVDTF9BTElHTk1FTlQpOiBBZGQgYW5vdGhlciBmdW5jdGlvbiBwYXJhbWV0ZXIuCgkq IGRvYy90bS50ZXhpOiBSZWdlbmVyYXRlLgoJKiBkb2MvdG0udGV4aS5pbiAoVEFSR0VUX0xPV0VS X0xPQ0FMX0RFQ0xfQUxJR05NRU5UKTogTmV3Cglob29rLgoJKiB0YXJnZXQuZGVmIChsb3dlcl9s b2NhbF9kZWNsX2FsaWdubWVudCk6IE5ldyBob29rLgoKZ2NjL2NwL0NoYW5nZUxvZzoKCglQUiB0 YXJnZXQvOTUyMzcKCSogZGVjbC5jIChjcF9maW5pc2hfZGVjbCk6IENhbGwgdGFyZ2V0IGhvb2sK CWxvd2VyX2xvY2FsX2RlY2xfYWxpZ25tZW50IHRvIGxvd2VyIGxvY2FsIGRlY2wgYWxpZ25tZW50 LgoKZ2NjL3Rlc3RzdWl0ZS9DaGFuZ2VMb2c6CgoJUFIgdGFyZ2V0Lzk1MjM3CgkqIGMtYysrLWNv bW1vbi9wcjk1MjM3LTEuYzogTmV3IHRlc3QuCgkqIGMtYysrLWNvbW1vbi9wcjk1MjM3LTIuYzog TmV3IHRlc3QuCgkqIGMtYysrLWNvbW1vbi9wcjk1MjM3LTMuYzogTmV3IHRlc3QuCgkqIGMtYysr LWNvbW1vbi9wcjk1MjM3LTQuYzogTmV3IHRlc3QuCgkqIGMtYysrLWNvbW1vbi9wcjk1MjM3LTUu YzogTmV3IHRlc3QuCgkqIGMtYysrLWNvbW1vbi9wcjk1MjM3LTYuYzogTmV3IHRlc3QuCgkqIGMt YysrLWNvbW1vbi9wcjk1MjM3LTcuYzogTmV3IHRlc3QuCgkqIGMtYysrLWNvbW1vbi9wcjk1MjM3 LTguYzogTmV3IHRlc3QuCgkqIGMtYysrLWNvbW1vbi9wcjk1MjM3LTkuYzogTmV3IHRlc3QuCi0t LQogZ2NjL2MvYy1kZWNsLmMgICAgICAgICAgICAgICAgICAgICAgICAgfCAgNyArKysrKysrCiBn Y2MvY29uZmlnL2kzODYvaTM4Ni1wcm90b3MuaCAgICAgICAgICB8ICAyICstCiBnY2MvY29uZmln L2kzODYvaTM4Ni5jICAgICAgICAgICAgICAgICB8IDE2ICsrKysrKysrKysrKysrKy0KIGdjYy9j b25maWcvaTM4Ni9pMzg2LmggICAgICAgICAgICAgICAgIHwgIDYgKysrLS0tCiBnY2MvY3AvZGVj bC5jICAgICAgICAgICAgICAgICAgICAgICAgICB8ICA3ICsrKysrKysKIGdjYy9kb2MvdG0udGV4 aSAgICAgICAgICAgICAgICAgICAgICAgIHwgIDUgKysrKysKIGdjYy9kb2MvdG0udGV4aS5pbiAg ICAgICAgICAgICAgICAgICAgIHwgIDIgKysKIGdjYy90YXJnZXQuZGVmICAgICAgICAgICAgICAg ICAgICAgICAgIHwgIDcgKysrKysrKwogZ2NjL3Rlc3RzdWl0ZS9jLWMrKy1jb21tb24vcHI5NTIz Ny0xLmMgfCAxNiArKysrKysrKysrKysrKysrCiBnY2MvdGVzdHN1aXRlL2MtYysrLWNvbW1vbi9w cjk1MjM3LTIuYyB8IDEwICsrKysrKysrKysKIGdjYy90ZXN0c3VpdGUvYy1jKystY29tbW9uL3By OTUyMzctMy5jIHwgMTAgKysrKysrKysrKwogZ2NjL3Rlc3RzdWl0ZS9jLWMrKy1jb21tb24vcHI5 NTIzNy00LmMgfCAxMCArKysrKysrKysrCiBnY2MvdGVzdHN1aXRlL2MtYysrLWNvbW1vbi9wcjk1 MjM3LTUuYyB8IDE2ICsrKysrKysrKysrKysrKysKIGdjYy90ZXN0c3VpdGUvYy1jKystY29tbW9u L3ByOTUyMzctNi5jIHwgMjQgKysrKysrKysrKysrKysrKysrKysrKysrCiBnY2MvdGVzdHN1aXRl L2MtYysrLWNvbW1vbi9wcjk1MjM3LTcuYyB8IDE5ICsrKysrKysrKysrKysrKysrKysKIGdjYy90 ZXN0c3VpdGUvYy1jKystY29tbW9uL3ByOTUyMzctOC5jIHwgMTAgKysrKysrKysrKwogZ2NjL3Rl c3RzdWl0ZS9jLWMrKy1jb21tb24vcHI5NTIzNy05LmMgfCAxMCArKysrKysrKysrCiAxNyBmaWxl cyBjaGFuZ2VkLCAxNzIgaW5zZXJ0aW9ucygrKSwgNSBkZWxldGlvbnMoLSkKIGNyZWF0ZSBtb2Rl IDEwMDY0NCBnY2MvdGVzdHN1aXRlL2MtYysrLWNvbW1vbi9wcjk1MjM3LTEuYwogY3JlYXRlIG1v ZGUgMTAwNjQ0IGdjYy90ZXN0c3VpdGUvYy1jKystY29tbW9uL3ByOTUyMzctMi5jCiBjcmVhdGUg bW9kZSAxMDA2NDQgZ2NjL3Rlc3RzdWl0ZS9jLWMrKy1jb21tb24vcHI5NTIzNy0zLmMKIGNyZWF0 ZSBtb2RlIDEwMDY0NCBnY2MvdGVzdHN1aXRlL2MtYysrLWNvbW1vbi9wcjk1MjM3LTQuYwogY3Jl YXRlIG1vZGUgMTAwNjQ0IGdjYy90ZXN0c3VpdGUvYy1jKystY29tbW9uL3ByOTUyMzctNS5jCiBj cmVhdGUgbW9kZSAxMDA2NDQgZ2NjL3Rlc3RzdWl0ZS9jLWMrKy1jb21tb24vcHI5NTIzNy02LmMK IGNyZWF0ZSBtb2RlIDEwMDY0NCBnY2MvdGVzdHN1aXRlL2MtYysrLWNvbW1vbi9wcjk1MjM3LTcu YwogY3JlYXRlIG1vZGUgMTAwNjQ0IGdjYy90ZXN0c3VpdGUvYy1jKystY29tbW9uL3ByOTUyMzct OC5jCiBjcmVhdGUgbW9kZSAxMDA2NDQgZ2NjL3Rlc3RzdWl0ZS9jLWMrKy1jb21tb24vcHI5NTIz Ny05LmMKCmRpZmYgLS1naXQgYS9nY2MvYy9jLWRlY2wuYyBiL2djYy9jL2MtZGVjbC5jCmluZGV4 IDgxYmQyZWU5NGYwLi40ZWU5ZTAyZDM1ZCAxMDA2NDQKLS0tIGEvZ2NjL2MvYy1kZWNsLmMKKysr IGIvZ2NjL2MvYy1kZWNsLmMKQEAgLTU2MDAsNiArNTYwMCwxMyBAQCBmaW5pc2hfZGVjbCAodHJl ZSBkZWNsLCBsb2NhdGlvbl90IGluaXRfbG9jLCB0cmVlIGluaXQsCiAJCSAgICAgICBOVUxMX1RS RUUsIERFQ0xfQVRUUklCVVRFUyAoZGVjbCkpOwogICAgIH0KIAorICAvKiBMb3dlciBsb2NhbCBk ZWNsIGFsaWdubWVudC4gICovCisKKyAgaWYgKFZBUl9QIChkZWNsKQorICAgICAgJiYgIWlzX2ds b2JhbF92YXIgKGRlY2wpCisgICAgICAmJiAhREVDTF9IQVJEX1JFR0lTVEVSIChkZWNsKSkKKyAg ICB0YXJnZXRtLmxvd2VyX2xvY2FsX2RlY2xfYWxpZ25tZW50IChkZWNsKTsKKwogICBpbnZva2Vf cGx1Z2luX2NhbGxiYWNrcyAoUExVR0lOX0ZJTklTSF9ERUNMLCBkZWNsKTsKIH0KIApkaWZmIC0t Z2l0IGEvZ2NjL2NvbmZpZy9pMzg2L2kzODYtcHJvdG9zLmggYi9nY2MvY29uZmlnL2kzODYvaTM4 Ni1wcm90b3MuaAppbmRleCA3YzJjZTYxOGYzZi4uMDM0Mjc2ZWJiOTkgMTAwNjQ0Ci0tLSBhL2dj Yy9jb25maWcvaTM4Ni9pMzg2LXByb3Rvcy5oCisrKyBiL2djYy9jb25maWcvaTM4Ni9pMzg2LXBy b3Rvcy5oCkBAIC0yMjMsNyArMjIzLDcgQEAgZXh0ZXJuIHZvaWQgaW5pdF9jdW11bGF0aXZlX2Fy Z3MgKENVTVVMQVRJVkVfQVJHUyAqLCB0cmVlLCBydHgsIHRyZWUsIGludCk7CiAjaWZkZWYgVFJF RV9DT0RFCiBleHRlcm4gaW50IGl4ODZfZGF0YV9hbGlnbm1lbnQgKHRyZWUsIHVuc2lnbmVkIGlu dCwgYm9vbCk7CiBleHRlcm4gdW5zaWduZWQgaW50IGl4ODZfbG9jYWxfYWxpZ25tZW50ICh0cmVl LCBtYWNoaW5lX21vZGUsCi0JCQkJCSAgdW5zaWduZWQgaW50KTsKKwkJCQkJICB1bnNpZ25lZCBp bnQsIGJvb2wpOwogZXh0ZXJuIHVuc2lnbmVkIGludCBpeDg2X21pbmltdW1fYWxpZ25tZW50ICh0 cmVlLCBtYWNoaW5lX21vZGUsCiAJCQkJCSAgICB1bnNpZ25lZCBpbnQpOwogZXh0ZXJuIHRyZWUg aXg4Nl9oYW5kbGVfc2hhcmVkX2F0dHJpYnV0ZSAodHJlZSAqLCB0cmVlLCB0cmVlLCBpbnQsIGJv b2wgKik7CmRpZmYgLS1naXQgYS9nY2MvY29uZmlnL2kzODYvaTM4Ni5jIGIvZ2NjL2NvbmZpZy9p Mzg2L2kzODYuYwppbmRleCA1YzM3M2MwOTFjZS4uYjkyMTkzZGZhYTggMTAwNjQ0Ci0tLSBhL2dj Yy9jb25maWcvaTM4Ni9pMzg2LmMKKysrIGIvZ2NjL2NvbmZpZy9pMzg2L2kzODYuYwpAQCAtMTY3 NjgsNiArMTY3NjgsMTMgQEAgaXg4Nl9kYXRhX2FsaWdubWVudCAodHJlZSB0eXBlLCB1bnNpZ25l ZCBpbnQgYWxpZ24sIGJvb2wgb3B0KQogICByZXR1cm4gYWxpZ247CiB9CiAKKy8qIEltcGxlbWVt bnQgVEFSR0VUX0xPV0VSX0xPQ0FMX0RFQ0xfQUxJR05NRU5ULiAgKi8KK3N0YXRpYyB2b2lkCitp eDg2X2xvd2VyX2xvY2FsX2RlY2xfYWxpZ25tZW50ICh0cmVlIGRlY2wpCit7CisgIGl4ODZfbG9j YWxfYWxpZ25tZW50IChkZWNsLCBWT0lEbW9kZSwgREVDTF9BTElHTiAoZGVjbCksIHRydWUpOwor fQorCiAvKiBDb21wdXRlIHRoZSBhbGlnbm1lbnQgZm9yIGEgbG9jYWwgdmFyaWFibGUgb3IgYSBz dGFjayBzbG90LiAgRVhQIGlzCiAgICB0aGUgZGF0YSB0eXBlIG9yIGRlY2wgaXRzZWxmLCBNT0RF IGlzIHRoZSB3aWRlc3QgbW9kZSBhdmFpbGFibGUgYW5kCiAgICBBTElHTiBpcyB0aGUgYWxpZ25t ZW50IHRoYXQgdGhlIG9iamVjdCB3b3VsZCBvcmRpbmFyaWx5IGhhdmUuICBUaGUKQEAgLTE2Nzc2 LDcgKzE2NzgzLDcgQEAgaXg4Nl9kYXRhX2FsaWdubWVudCAodHJlZSB0eXBlLCB1bnNpZ25lZCBp bnQgYWxpZ24sIGJvb2wgb3B0KQogCiB1bnNpZ25lZCBpbnQKIGl4ODZfbG9jYWxfYWxpZ25tZW50 ICh0cmVlIGV4cCwgbWFjaGluZV9tb2RlIG1vZGUsCi0JCSAgICAgIHVuc2lnbmVkIGludCBhbGln bikKKwkJICAgICAgdW5zaWduZWQgaW50IGFsaWduLCBib29sIHNldGFsaWduKQogewogICB0cmVl IHR5cGUsIGRlY2w7CiAKQEAgLTE2ODAxLDYgKzE2ODA4LDEwIEBAIGl4ODZfbG9jYWxfYWxpZ25t ZW50ICh0cmVlIGV4cCwgbWFjaGluZV9tb2RlIG1vZGUsCiAgICAgICAmJiAoIWRlY2wgfHwgIURF Q0xfVVNFUl9BTElHTiAoZGVjbCkpKQogICAgIGFsaWduID0gMzI7CiAKKyAgLyogTG93ZXIgZGVj bCBhbGlnbm1lbnQuICAqLworICBpZiAoc2V0YWxpZ24gJiYgYWxpZ24gPCBERUNMX0FMSUdOIChk ZWNsKSkKKyAgICBTRVRfREVDTF9BTElHTiAoZGVjbCwgYWxpZ24pOworCiAgIC8qIElmIFRZUEUg aXMgTlVMTCwgd2UgYXJlIGFsbG9jYXRpbmcgYSBzdGFjayBzbG90IGZvciBjYWxsZXItc2F2ZQog ICAgICByZWdpc3RlciBpbiBNT0RFLiAgV2Ugd2lsbCByZXR1cm4gdGhlIGxhcmdlc3QgYWxpZ25t ZW50IG9mIFhGCiAgICAgIGFuZCBERi4gICovCkBAIC0yMzUyMSw2ICsyMzUzMiw5IEBAIGl4ODZf cnVuX3NlbGZ0ZXN0cyAodm9pZCkKICN1bmRlZiBUQVJHRVRfQ0FOX0NIQU5HRV9NT0RFX0NMQVNT CiAjZGVmaW5lIFRBUkdFVF9DQU5fQ0hBTkdFX01PREVfQ0xBU1MgaXg4Nl9jYW5fY2hhbmdlX21v ZGVfY2xhc3MKIAorI3VuZGVmIFRBUkdFVF9MT1dFUl9MT0NBTF9ERUNMX0FMSUdOTUVOVAorI2Rl ZmluZSBUQVJHRVRfTE9XRVJfTE9DQUxfREVDTF9BTElHTk1FTlQgaXg4Nl9sb3dlcl9sb2NhbF9k ZWNsX2FsaWdubWVudAorCiAjdW5kZWYgVEFSR0VUX1NUQVRJQ19SVFhfQUxJR05NRU5UCiAjZGVm aW5lIFRBUkdFVF9TVEFUSUNfUlRYX0FMSUdOTUVOVCBpeDg2X3N0YXRpY19ydHhfYWxpZ25tZW50 CiAjdW5kZWYgVEFSR0VUX0NPTlNUQU5UX0FMSUdOTUVOVApkaWZmIC0tZ2l0IGEvZ2NjL2NvbmZp Zy9pMzg2L2kzODYuaCBiL2djYy9jb25maWcvaTM4Ni9pMzg2LmgKaW5kZXggZjRhOGYxMzkxZmEu LmE3ZDRmNDEwYTBkIDEwMDY0NAotLS0gYS9nY2MvY29uZmlnL2kzODYvaTM4Ni5oCisrKyBiL2dj Yy9jb25maWcvaTM4Ni9pMzg2LmgKQEAgLTk5NCw3ICs5OTQsNyBAQCBleHRlcm4gY29uc3QgY2hh ciAqaG9zdF9kZXRlY3RfbG9jYWxfY3B1IChpbnQgYXJnYywgY29uc3QgY2hhciAqKmFyZ3YpOwog ICAgZGF0YSB0byBtYWtlIGl0IGFsbCBmaXQgaW4gZmV3ZXIgY2FjaGUgbGluZXMuICAqLwogCiAj ZGVmaW5lIExPQ0FMX0FMSUdOTUVOVChUWVBFLCBBTElHTikgXAotICBpeDg2X2xvY2FsX2FsaWdu bWVudCAoKFRZUEUpLCBWT0lEbW9kZSwgKEFMSUdOKSkKKyAgaXg4Nl9sb2NhbF9hbGlnbm1lbnQg KChUWVBFKSwgVk9JRG1vZGUsIChBTElHTiksIGZhbHNlKQogCiAvKiBJZiBkZWZpbmVkLCBhIEMg ZXhwcmVzc2lvbiB0byBjb21wdXRlIHRoZSBhbGlnbm1lbnQgZm9yIHN0YWNrIHNsb3QuCiAgICBU WVBFIGlzIHRoZSBkYXRhIHR5cGUsIE1PREUgaXMgdGhlIHdpZGVzdCBtb2RlIGF2YWlsYWJsZSwg YW5kIEFMSUdOCkBAIC0xMDA4LDcgKzEwMDgsNyBAQCBleHRlcm4gY29uc3QgY2hhciAqaG9zdF9k ZXRlY3RfbG9jYWxfY3B1IChpbnQgYXJnYywgY29uc3QgY2hhciAqKmFyZ3YpOwogICAgbWF4aW11 bSBhbGlnbm1lbnQgb2YgYWxsIHBvc3NpYmxlIG1vZGVzIHdoaWNoIHRoZSBzbG90IG1heSBoYXZl LiAgKi8KIAogI2RlZmluZSBTVEFDS19TTE9UX0FMSUdOTUVOVChUWVBFLCBNT0RFLCBBTElHTikg XAotICBpeDg2X2xvY2FsX2FsaWdubWVudCAoKFRZUEUpLCAoTU9ERSksIChBTElHTikpCisgIGl4 ODZfbG9jYWxfYWxpZ25tZW50ICgoVFlQRSksIChNT0RFKSwgKEFMSUdOKSwgZmFsc2UpCiAKIC8q IElmIGRlZmluZWQsIGEgQyBleHByZXNzaW9uIHRvIGNvbXB1dGUgdGhlIGFsaWdubWVudCBmb3Ig YSBsb2NhbAogICAgdmFyaWFibGUgREVDTC4KQEAgLTEwMjAsNyArMTAyMCw3IEBAIGV4dGVybiBj b25zdCBjaGFyICpob3N0X2RldGVjdF9sb2NhbF9jcHUgKGludCBhcmdjLCBjb25zdCBjaGFyICoq YXJndik7CiAgICBkYXRhIHRvIG1ha2UgaXQgYWxsIGZpdCBpbiBmZXdlciBjYWNoZSBsaW5lcy4g ICovCiAKICNkZWZpbmUgTE9DQUxfREVDTF9BTElHTk1FTlQoREVDTCkgXAotICBpeDg2X2xvY2Fs X2FsaWdubWVudCAoKERFQ0wpLCBWT0lEbW9kZSwgREVDTF9BTElHTiAoREVDTCkpCisgIGl4ODZf bG9jYWxfYWxpZ25tZW50ICgoREVDTCksIFZPSURtb2RlLCBERUNMX0FMSUdOIChERUNMKSwgZmFs c2UpCiAKIC8qIElmIGRlZmluZWQsIGEgQyBleHByZXNzaW9uIHRvIGNvbXB1dGUgdGhlIG1pbmlt dW0gcmVxdWlyZWQgYWxpZ25tZW50CiAgICBmb3IgZHluYW1pYyBzdGFjayByZWFsaWdubWVudCBw dXJwb3NlcyBmb3IgRVhQIChhIFRZUEUgb3IgREVDTCksCmRpZmYgLS1naXQgYS9nY2MvY3AvZGVj bC5jIGIvZ2NjL2NwL2RlY2wuYwppbmRleCA2ZTRkNTQ2ZDU1ZS4uNjdhYTdiNzYwMmUgMTAwNjQ0 Ci0tLSBhL2djYy9jcC9kZWNsLmMKKysrIGIvZ2NjL2NwL2RlY2wuYwpAQCAtODAxMiw2ICs4MDEy LDEzIEBAIGNwX2ZpbmlzaF9kZWNsICh0cmVlIGRlY2wsIHRyZWUgaW5pdCwgYm9vbCBpbml0X2Nv bnN0X2V4cHJfcCwKIAkJICAgICAgIE5VTExfVFJFRSwgREVDTF9BVFRSSUJVVEVTIChkZWNsKSk7 CiAgICAgfQogCisgIC8qIExvd2VyIGxvY2FsIGRlY2wgYWxpZ25tZW50LiAgKi8KKworICBpZiAo VkFSX1AgKGRlY2wpCisgICAgICAmJiAhaXNfZ2xvYmFsX3ZhciAoZGVjbCkKKyAgICAgICYmICFE RUNMX0hBUkRfUkVHSVNURVIgKGRlY2wpKQorICAgIHRhcmdldG0ubG93ZXJfbG9jYWxfZGVjbF9h bGlnbm1lbnQgKGRlY2wpOworCiAgIGludm9rZV9wbHVnaW5fY2FsbGJhY2tzIChQTFVHSU5fRklO SVNIX0RFQ0wsIGRlY2wpOwogfQogCmRpZmYgLS1naXQgYS9nY2MvZG9jL3RtLnRleGkgYi9nY2Mv ZG9jL3RtLnRleGkKaW5kZXggNmU3ZDlkYzU0YTkuLjEwNTgyMjE4NDJkIDEwMDY0NAotLS0gYS9n Y2MvZG9jL3RtLnRleGkKKysrIGIvZ2NjL2RvYy90bS50ZXhpCkBAIC0xMDg2LDYgKzEwODYsMTEg QEAgT24gMzItYml0IEVMRiB0aGUgbGFyZ2VzdCBzdXBwb3J0ZWQgc2VjdGlvbiBhbGlnbm1lbnQg aW4gYml0cyBpcwogQHNhbXB7KDB4ODAwMDAwMDAgKiA4KX0sIGJ1dCB0aGlzIGlzIG5vdCByZXBy ZXNlbnRhYmxlIG9uIDMyLWJpdCBob3N0cy4KIEBlbmQgZGVmbWFjCiAKK0BkZWZ0eXBlZm4ge1Rh cmdldCBIb29rfSB2b2lkIFRBUkdFVF9MT1dFUl9MT0NBTF9ERUNMX0FMSUdOTUVOVCAodHJlZSBA dmFye2RlY2x9KQorRGVmaW5lIHRoaXMgaG9vayB0byBsb3dlciBhbGlnbm1lbnQgb2YgbG9jYWws IHBhcm0gb3IgcmVzdWx0CitkZWNsIEBzYW1weyhAdmFye2RlY2x9KX0uCitAZW5kIGRlZnR5cGVm bgorCiBAZGVmdHlwZWZuIHtUYXJnZXQgSG9va30gSE9TVF9XSURFX0lOVCBUQVJHRVRfU1RBVElD X1JUWF9BTElHTk1FTlQgKG1hY2hpbmVfbW9kZSBAdmFye21vZGV9KQogVGhpcyBob29rIHJldHVy bnMgdGhlIHByZWZlcnJlZCBhbGlnbm1lbnQgaW4gYml0cyBmb3IgYQogc3RhdGljYWxseS1hbGxv Y2F0ZWQgcnR4LCBzdWNoIGFzIGEgY29uc3RhbnQgcG9vbCBlbnRyeS4gIEB2YXJ7bW9kZX0KZGlm ZiAtLWdpdCBhL2djYy9kb2MvdG0udGV4aS5pbiBiL2djYy9kb2MvdG0udGV4aS5pbgppbmRleCAz YmU5ODRiYmQ1Yy4uZDc2Yzg1ZDU4MDAgMTAwNjQ0Ci0tLSBhL2djYy9kb2MvdG0udGV4aS5pbgor KysgYi9nY2MvZG9jL3RtLnRleGkuaW4KQEAgLTEwMzYsNiArMTAzNiw4IEBAIE9uIDMyLWJpdCBF TEYgdGhlIGxhcmdlc3Qgc3VwcG9ydGVkIHNlY3Rpb24gYWxpZ25tZW50IGluIGJpdHMgaXMKIEBz YW1weygweDgwMDAwMDAwICogOCl9LCBidXQgdGhpcyBpcyBub3QgcmVwcmVzZW50YWJsZSBvbiAz Mi1iaXQgaG9zdHMuCiBAZW5kIGRlZm1hYwogCitAaG9vayBUQVJHRVRfTE9XRVJfTE9DQUxfREVD TF9BTElHTk1FTlQKKwogQGhvb2sgVEFSR0VUX1NUQVRJQ19SVFhfQUxJR05NRU5UCiAKIEBkZWZt YWMgREFUQV9BTElHTk1FTlQgKEB2YXJ7dHlwZX0sIEB2YXJ7YmFzaWMtYWxpZ259KQpkaWZmIC0t Z2l0IGEvZ2NjL3RhcmdldC5kZWYgYi9nY2MvdGFyZ2V0LmRlZgppbmRleCAwNzA1OWE4N2NhZi4u ZTEyMmQzYzMyYzIgMTAwNjQ0Ci0tLSBhL2djYy90YXJnZXQuZGVmCisrKyBiL2djYy90YXJnZXQu ZGVmCkBAIC0zMzQ4LDYgKzMzNDgsMTMgQEAgSE9PS19WRUNUT1JfRU5EIChhZGRyX3NwYWNlKQog I3VuZGVmIEhPT0tfUFJFRklYCiAjZGVmaW5lIEhPT0tfUFJFRklYICJUQVJHRVRfIgogCitERUZI T09LCisobG93ZXJfbG9jYWxfZGVjbF9hbGlnbm1lbnQsCisgIkRlZmluZSB0aGlzIGhvb2sgdG8g bG93ZXIgYWxpZ25tZW50IG9mIGxvY2FsLCBwYXJtIG9yIHJlc3VsdFxuXAorZGVjbCBAc2FtcHso QHZhcntkZWNsfSl9LiIsCisgdm9pZCwgKHRyZWUgZGVjbCksCisgaG9va192b2lkX3RyZWUpCisK IERFRkhPT0sKIChzdGF0aWNfcnR4X2FsaWdubWVudCwKICAiVGhpcyBob29rIHJldHVybnMgdGhl IHByZWZlcnJlZCBhbGlnbm1lbnQgaW4gYml0cyBmb3IgYVxuXApkaWZmIC0tZ2l0IGEvZ2NjL3Rl c3RzdWl0ZS9jLWMrKy1jb21tb24vcHI5NTIzNy0xLmMgYi9nY2MvdGVzdHN1aXRlL2MtYysrLWNv bW1vbi9wcjk1MjM3LTEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMC4u ODk0N2E5ZmVkMjYKLS0tIC9kZXYvbnVsbAorKysgYi9nY2MvdGVzdHN1aXRlL2MtYysrLWNvbW1v bi9wcjk1MjM3LTEuYwpAQCAtMCwwICsxLDE2IEBACisvKiB7IGRnLWRvIHJ1biB9ICovCisvKiB7 IGRnLXJlcXVpcmUtZWZmZWN0aXZlLXRhcmdldCBpYTMyIH0gKi8KKy8qIHsgZGctb3B0aW9ucyAi LW1wcmVmZXJyZWQtc3RhY2stYm91bmRhcnk9MiIgeyB0YXJnZXQgeyBpPzg2LSotKiB4ODZfNjQt Ki0qIH0gfSB9ICovCit0eXBlZGVmIF9fVUlOVFBUUl9UWVBFX18gdWludHB0cl90Owordm9pZCBf X2F0dHJpYnV0ZV9fKChub2lwYSkpIGZvbyAobG9uZyBsb25nICpwLCB1aW50cHRyX3QgYSkKK3sK KyAgaWYgKCh1aW50cHRyX3QpcCAmIChhLTEpKQorICAgICAgX19idWlsdGluX2Fib3J0ICgpOwor fQoraW50IG1haW4oKQoreworCWxvbmcgbG9uZyB4OworCXVpbnRwdHJfdCBhID0gX19hbGlnbm9m X18oeCk7CisJZm9vKCZ4LCBhKTsKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2djYy90ZXN0 c3VpdGUvYy1jKystY29tbW9uL3ByOTUyMzctMi5jIGIvZ2NjL3Rlc3RzdWl0ZS9jLWMrKy1jb21t b24vcHI5NTIzNy0yLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAuLjg3 OTQ5YTllMTIyCi0tLSAvZGV2L251bGwKKysrIGIvZ2NjL3Rlc3RzdWl0ZS9jLWMrKy1jb21tb24v cHI5NTIzNy0yLmMKQEAgLTAsMCArMSwxMCBAQAorLyogeyBkZy1kbyBydW4gfSAqLworLyogeyBk Zy1yZXF1aXJlLWVmZmVjdGl2ZS10YXJnZXQgaWEzMiB9ICovCisvKiB7IGRnLW9wdGlvbnMgIi1t cHJlZmVycmVkLXN0YWNrLWJvdW5kYXJ5PTIiIHsgdGFyZ2V0IHsgaT84Ni0qLSogeDg2XzY0LSot KiB9IH0gfSAqLworbG9uZyBsb25nIHg7CitpbnQgbWFpbigpCit7CisJaWYgKF9fYWxpZ25vZl9f KHgpICE9IDgpCisJICBfX2J1aWx0aW5fYWJvcnQoKTsKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdp dCBhL2djYy90ZXN0c3VpdGUvYy1jKystY29tbW9uL3ByOTUyMzctMy5jIGIvZ2NjL3Rlc3RzdWl0 ZS9jLWMrKy1jb21tb24vcHI5NTIzNy0zLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAw MDAwMDAwMDAuLjY5NDFiNmYxNTRiCi0tLSAvZGV2L251bGwKKysrIGIvZ2NjL3Rlc3RzdWl0ZS9j LWMrKy1jb21tb24vcHI5NTIzNy0zLmMKQEAgLTAsMCArMSwxMCBAQAorLyogeyBkZy1kbyBydW4g fSAqLworLyogeyBkZy1yZXF1aXJlLWVmZmVjdGl2ZS10YXJnZXQgaWEzMiB9ICovCisvKiB7IGRn LW9wdGlvbnMgIi1tcHJlZmVycmVkLXN0YWNrLWJvdW5kYXJ5PTIiIHsgdGFyZ2V0IHsgaT84Ni0q LSogeDg2XzY0LSotKiB9IH0gfSAqLworaW50IG1haW4oKQoreworCWxvbmcgbG9uZyB4OworCWlm IChfX2FsaWdub2ZfXyh4KSAhPSA0KQorCSAgX19idWlsdGluX2Fib3J0KCk7CisJcmV0dXJuIDA7 Cit9CmRpZmYgLS1naXQgYS9nY2MvdGVzdHN1aXRlL2MtYysrLWNvbW1vbi9wcjk1MjM3LTQuYyBi L2djYy90ZXN0c3VpdGUvYy1jKystY29tbW9uL3ByOTUyMzctNC5jCm5ldyBmaWxlIG1vZGUgMTAw NjQ0CmluZGV4IDAwMDAwMDAwMDAwLi5kZWFjZTUzY2MyNgotLS0gL2Rldi9udWxsCisrKyBiL2dj Yy90ZXN0c3VpdGUvYy1jKystY29tbW9uL3ByOTUyMzctNC5jCkBAIC0wLDAgKzEsMTAgQEAKKy8q IHsgZGctZG8gcnVuIH0gKi8KKy8qIHsgZGctcmVxdWlyZS1lZmZlY3RpdmUtdGFyZ2V0IGlhMzIg fSAqLworLyogeyBkZy1vcHRpb25zICItbXByZWZlcnJlZC1zdGFjay1ib3VuZGFyeT00IiB7IHRh cmdldCB7IGk/ODYtKi0qIHg4Nl82NC0qLSogfSB9IH0gKi8KK2ludCBtYWluKCkKK3sKKwlsb25n IGxvbmcgeDsKKwlpZiAoX19hbGlnbm9mX18oeCkgIT0gOCkKKwkgIF9fYnVpbHRpbl9hYm9ydCgp OworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvZ2NjL3Rlc3RzdWl0ZS9jLWMrKy1jb21tb24v cHI5NTIzNy01LmMgYi9nY2MvdGVzdHN1aXRlL2MtYysrLWNvbW1vbi9wcjk1MjM3LTUuYwpuZXcg ZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMC4uOWRjNWNmY2Q3MzkKLS0tIC9kZXYv bnVsbAorKysgYi9nY2MvdGVzdHN1aXRlL2MtYysrLWNvbW1vbi9wcjk1MjM3LTUuYwpAQCAtMCww ICsxLDE2IEBACisvKiB7IGRnLWRvIGNvbXBpbGUgeyB0YXJnZXQgaWEzMiB9IH0gKi8KKy8qIHsg ZGctb3B0aW9ucyAiLW1wcmVmZXJyZWQtc3RhY2stYm91bmRhcnk9MiAtT3MgLXciIHsgdGFyZ2V0 IHsgaT84Ni0qLSogeDg2XzY0LSotKiB9IH0gfSAqLworCitpbnQgYTsKKworbG9uZyBsb25nIF9f YXR0cmlidXRlX18oKG5vaW5saW5lKSkKK2IgKHZvaWQpCit7Cit9CisKK3ZvaWQKK2MgKHZvaWQp Cit7CisgIGlmIChiKCkpCisgICAgYSA9IDE7Cit9CmRpZmYgLS1naXQgYS9nY2MvdGVzdHN1aXRl L2MtYysrLWNvbW1vbi9wcjk1MjM3LTYuYyBiL2djYy90ZXN0c3VpdGUvYy1jKystY29tbW9uL3By OTUyMzctNi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwLi5jZTE1Njhm YTI4MgotLS0gL2Rldi9udWxsCisrKyBiL2djYy90ZXN0c3VpdGUvYy1jKystY29tbW9uL3ByOTUy MzctNi5jCkBAIC0wLDAgKzEsMjQgQEAKKy8qIHsgZGctZG8gcnVuIH0gKi8KKy8qIHsgZGctb3B0 aW9ucyAiLU8yIiB7IHRhcmdldCB7IGk/ODYtKi0qIHg4Nl82NC0qLSogfSB9IH0gKi8KKyNpbmNs dWRlIDxzdGRkZWYuaD4KKyNpZmRlZiAgX194ODZfNjRfXworIyBkZWZpbmUgRVhQX0FMSUdOIDgK KyNlbHNlCisjIGRlZmluZSBFWFBfQUxJR04gNAorI2VuZGlmCisKK3N0cnVjdCB0ZXN0Cit7Cisg IGNoYXIgYTsKKyAgbG9uZyBsb25nIGI7Cit9Oworc3RydWN0IHRlc3QgZ2xvYmFsX3ZhcjsKK2lu dCBtYWluKCkKK3sKKyAgCXN0cnVjdCB0ZXN0IGxvY2FsX3ZhcjsKKwlpZiAoX19hbGlnbm9mX18o Z2xvYmFsX3ZhcikgIT0gRVhQX0FMSUdOCisJICAgIHx8IF9fYWxpZ25vZl9fKGxvY2FsX3Zhcikg IT0gRVhQX0FMSUdOCisJICAgIHx8IG9mZnNldG9mKHN0cnVjdCB0ZXN0LCBiKSAhPSBFWFBfQUxJ R04pCisJICBfX2J1aWx0aW5fYWJvcnQoKTsKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2dj Yy90ZXN0c3VpdGUvYy1jKystY29tbW9uL3ByOTUyMzctNy5jIGIvZ2NjL3Rlc3RzdWl0ZS9jLWMr Ky1jb21tb24vcHI5NTIzNy03LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAw MDAuLjg0MTAwMDlkMDBlCi0tLSAvZGV2L251bGwKKysrIGIvZ2NjL3Rlc3RzdWl0ZS9jLWMrKy1j b21tb24vcHI5NTIzNy03LmMKQEAgLTAsMCArMSwxOSBAQAorLyogeyBkZy1kbyBydW4gfSAqLwor LyogeyBkZy1yZXF1aXJlLWVmZmVjdGl2ZS10YXJnZXQgaWEzMiB9ICovCisvKiB7IGRnLW9wdGlv bnMgIi1tcHJlZmVycmVkLXN0YWNrLWJvdW5kYXJ5PTIiIHsgdGFyZ2V0IHsgaT84Ni0qLSogeDg2 XzY0LSotKiB9IH0gfSAqLworI2luY2x1ZGUgPHN0ZGRlZi5oPgorc3RydWN0IHRlc3QKK3sKKyAg Y2hhciBhOworICBsb25nIGxvbmcgYjsKK307CitzdHJ1Y3QgdGVzdCBnbG9iYWxfdmFyOworaW50 IG1haW4oKQoreworICAJc3RydWN0IHRlc3QgbG9jYWxfdmFyOworCWlmIChfX2FsaWdub2ZfXyhn bG9iYWxfdmFyKSAhPSA0CisJICAgIHx8IF9fYWxpZ25vZl9fKGxvY2FsX3ZhcikgIT0gNAorCSAg ICB8fCBvZmZzZXRvZihzdHJ1Y3QgdGVzdCwgYikgIT0gNCkKKwkgIF9fYnVpbHRpbl9hYm9ydCgp OworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvZ2NjL3Rlc3RzdWl0ZS9jLWMrKy1jb21tb24v cHI5NTIzNy04LmMgYi9nY2MvdGVzdHN1aXRlL2MtYysrLWNvbW1vbi9wcjk1MjM3LTguYwpuZXcg ZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMC4uOGJhOThhYmFmYzkKLS0tIC9kZXYv bnVsbAorKysgYi9nY2MvdGVzdHN1aXRlL2MtYysrLWNvbW1vbi9wcjk1MjM3LTguYwpAQCAtMCww ICsxLDEwIEBACisvKiB7IGRnLWRvIHJ1biB9ICovCisvKiB7IGRnLXJlcXVpcmUtZWZmZWN0aXZl LXRhcmdldCBpYTMyIH0gKi8KKy8qIHsgZGctb3B0aW9ucyAiLW1wcmVmZXJyZWQtc3RhY2stYm91 bmRhcnk9MiIgeyB0YXJnZXQgeyBpPzg2LSotKiB4ODZfNjQtKi0qIH0gfSB9ICovCitpbnQgbWFp bigpCit7CisgIAlleHRlcm4gbG9uZyBsb25nIHg7CisJaWYgKF9fYWxpZ25vZl9fKHgpICE9IDgp CisJICBfX2J1aWx0aW5fYWJvcnQoKTsKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2djYy90 ZXN0c3VpdGUvYy1jKystY29tbW9uL3ByOTUyMzctOS5jIGIvZ2NjL3Rlc3RzdWl0ZS9jLWMrKy1j b21tb24vcHI5NTIzNy05LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAu LjY4NzUxN2NiYzBhCi0tLSAvZGV2L251bGwKKysrIGIvZ2NjL3Rlc3RzdWl0ZS9jLWMrKy1jb21t b24vcHI5NTIzNy05LmMKQEAgLTAsMCArMSwxMCBAQAorLyogeyBkZy1kbyBydW4gfSAqLworLyog eyBkZy1yZXF1aXJlLWVmZmVjdGl2ZS10YXJnZXQgaWEzMiB9ICovCisvKiB7IGRnLW9wdGlvbnMg Ii1tcHJlZmVycmVkLXN0YWNrLWJvdW5kYXJ5PTIiIHsgdGFyZ2V0IHsgaT84Ni0qLSogeDg2XzY0 LSotKiB9IH0gfSAqLworaW50IG1haW4oKQoreworCXN0YXRpYyBsb25nIGxvbmcgeDsKKwlpZiAo X19hbGlnbm9mX18oeCkgIT0gOCkKKwkgIF9fYnVpbHRpbl9hYm9ydCgpOworCXJldHVybiAwOwor fQotLSAKMi4yNS40Cgo= --00000000000078cc0a05aab0f4bd--