From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.133.124]) by sourceware.org (Postfix) with ESMTPS id 2F05E3858C39 for ; Sat, 15 Jan 2022 03:56:25 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org 2F05E3858C39 Received: from mail-qt1-f200.google.com (mail-qt1-f200.google.com [209.85.160.200]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id us-mta-622-rbZuYymyOFypc32PO3taqg-1; Fri, 14 Jan 2022 22:56:23 -0500 X-MC-Unique: rbZuYymyOFypc32PO3taqg-1 Received: by mail-qt1-f200.google.com with SMTP id b7-20020ac85bc7000000b002b65aee118bso9615978qtb.13 for ; Fri, 14 Jan 2022 19:56:23 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:message-id:date:mime-version:user-agent:subject :content-language:to:cc:references:from:in-reply-to; bh=Ys5qWERjzyeKkzCGB99lFvWffDfUG2Q/E2UmPNx7UPY=; b=uRfvkhdKjLJb6CFQj8pxLt7UZSG1NA33AdsFFp3vAWyOQs+dsAFNEVl31OQ1JhTaXe qHef5D425bqwWrcvJvgLl6AqkqUySf4q4uyLjbzgHL8wLAySb9kJH7KxsttdxEPOl9EN 8H6l8ZPmrPACM5IKF9dvCO//zv3RCM8RQmMaWZUjwXaStFbJz2kHssnDBIZX721QLSw6 OmaNuSkHcPLI35WJSNEhTMKWlHLgQlM9ONH4hWwhYNd8vnZuRq2Gce8PM8eK2pZL70Bc 8exFxNosbqg8cuo6c9z6TbxpyhqwDg+h0aWsIPLGfbhEqszAPXJJubcE6v9t0ySno4Us Tx0Q== X-Gm-Message-State: AOAM532zzcxGM3fI9UDL6oMS+p5OEvINb3RJsn0nfV8ilntS8Shm7JJv IzXW/HcYCbPdEmS+qs2GEaA1K/8eW/4IF8EaW5VeA9rPSxKIvNP1CawC+6CsXK8kwd1laLxlZum DUFuP5g1lITwEPRmKIA== X-Received: by 2002:a05:6214:dc3:: with SMTP id 3mr10847964qvt.101.1642218982778; Fri, 14 Jan 2022 19:56:22 -0800 (PST) X-Google-Smtp-Source: ABdhPJxPQwSamNHc5JdyFtOhQM7Rj2imO7/oIvGmlnt+VqXw1KDyG0wp5HJzAIxFKF9DMP7itcTe/Q== X-Received: by 2002:a05:6214:dc3:: with SMTP id 3mr10847947qvt.101.1642218982260; Fri, 14 Jan 2022 19:56:22 -0800 (PST) Received: from [192.168.1.149] (130-44-159-43.s15913.c3-0.arl-cbr1.sbo-arl.ma.cable.rcncustomer.com. [130.44.159.43]) by smtp.gmail.com with ESMTPSA id w17sm3949402qtj.58.2022.01.14.19.56.20 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Fri, 14 Jan 2022 19:56:20 -0800 (PST) Message-ID: <0c78618c-72b5-44ca-9887-f68adf3248a3@redhat.com> Date: Fri, 14 Jan 2022 22:56:19 -0500 MIME-Version: 1.0 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:91.0) Gecko/20100101 Thunderbird/91.4.1 Subject: Re: [PATCH v3 RFC] c++: add color to function decl printing To: David Malcolm , Jonathan Wakely Cc: gcc Patches References: <20211212053942.240160-1-jason@redhat.com> <09a59ea7dac1f605ba3545168c4ef57660212ffd.camel@redhat.com> From: Jason Merrill In-Reply-To: <09a59ea7dac1f605ba3545168c4ef57660212ffd.camel@redhat.com> X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Type: multipart/mixed; boundary="------------SMP4mwa0ylsK0eKyK3X8Zvgv" Content-Language: en-US X-Spam-Status: No, score=-12.2 required=5.0 tests=BAYES_00, DKIMWL_WL_HIGH, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, GIT_PATCH_0, LIKELY_SPAM_BODY, NICE_REPLY_A, RCVD_IN_DNSWL_LOW, RCVD_IN_MSPIKE_H3, RCVD_IN_MSPIKE_WL, SPF_HELO_NONE, SPF_NONE, TXREP autolearn=ham autolearn_force=no version=3.4.4 X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) 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, 15 Jan 2022 03:56:28 -0000 This is a multi-part message in MIME format. --------------SMP4mwa0ylsK0eKyK3X8Zvgv Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 8bit On 1/14/22 16:49, David Malcolm wrote: > On Mon, 2021-12-13 at 09:58 -0500, Jason Merrill via Gcc-patches wrote: >> On 12/13/21 06:02, Jonathan Wakely wrote: >>> On Sun, 12 Dec 2021 at 05:39, Jason Merrill >> > wrote: >>>  > >>>  > In reading C++ diagnostics, it's often hard to find the name of >>> the >>> function >>>  > in the middle of the template header, return type, parameters, and >>> template >>>  > arguments.  So let's colorize it, and maybe the template argument >>> bindings >>>  > while we're at it. > > Thanks for the patch; sorry for not responding before. > > Overall I like that patch, with some reservations... > >>>  > >>>  > I've somewhat arbitrarily chosen bold green for the function name, >>> and >>>  > non-bold magenta for the template arguments.  I'm not at all >>> attached to >>>  > these choices. > > I tried the patch with gnome terminals "light" and "dark" themes, and > the colors seemed readable with both color schemes. > >>>  > >>>  > A side-effect is that when this happens in a quote (i.e. %qD), the >>>  > rest of the quote after the function name is no longer bold.  I >>> think >>> that's >>>  > acceptable; returning to the bold would require maintaining a >>> colorize stack >>>  > instead of the on/off controls we have now. > > I was going to grumble about this, but having tried it on some > examples, I think it's actually an improvement in readability to drop > the emboldening, in that it reduces the "wall of bold text" seen. > > Having tried it on some examples, I think the patch as a whole is a > definite readability win, in that it breaks up long stretches of bold > text into useful colorized parts; the result seems much easier to > decipher at a glance. I wonder to what extent this is a poor-man's > syntax highlighting? I think it definitely is. Going farther in that direction would make sense it future. > Did you try any other variants of the highlighting? This approach > seems to work well, FWIW, I wonder if others might work better, or if > this is a local maxima in terms of readability. Do you have any particular variants in mind? This was motivated by my having trouble finding the name of the function in diagnostic output, so that's the main thing I wanted to highlight. > I'm taking the liberty of attaching a screenshot (137K) showing > before/after the patch for the sake of discussion. > >>>  > >>>  > Any thoughts? > > I was also concerned about how this would interact with the template > type diff printing from f012c8ef4b35dcee9b5a3807868d050812d5b3b9, but I > did a few tests and it seems to work OK. > > I only tested in lightly for a few minutes, so it could do with some > more testing. > >>> >>> I thought I was going to love this ... and it's a nice little >>> improvement, but I didn't love it as much as I expected. >>> >>> Is it intentional that only the last function in the instantiation >>> stack >>> gets colourized? In this example the function on line 390 isn't >>> highlighted: >>> >>> /home/jwakely/gcc/12/include/c++/12.0.0/bits/ranges_base.h:390:12: >>>  required >>> by substitution of 'template  requires >>> (is_bounded_array_v::type>) || >>> (__member_size*<_Tp>) || (__adl_size<_Tp>) || >>> (__sentinel_size<_Tp>) >>> constexpr auto std::ranges::__cust_access::_Size::operator()(_Tp&&) >>> const [with _Tp = adl::Footie (&)[]]*' >> >> Oops, I needed to change subst_to_string as well.  Updated patch >> below. > > Jonathan, did you try the v2 patch? > >> >>> Aside: it's a little odd that the first caret diagnostic there only >>> highlights the word "operator" and not the name of the function, >>> "operator()". >> >> Yes, I imagine we need to adjust DECL_SOURCE_LOCATION to use a range >> instead of assuming the location of the first token is sufficient. >> >> Jason > > [...] > >> diff --git a/gcc/doc/invoke.texi b/gcc/doc/invoke.texi >> index 9b4371b9213..cdfddd75343 100644 >> --- a/gcc/doc/invoke.texi >> +++ b/gcc/doc/invoke.texi >> @@ -4803,6 +4803,14 @@ SGR substring for location information, > @samp{file:line} or >> @vindex quote GCC_COLORS @r{capability} >> SGR substring for information printed within quotes. >> >> +@item fnname= >> +@vindex fnname GCC_COLORS @r{capability} >> +SGR substring for names of C++ functions. >> + >> +@item targs= >> +@vindex targs GCC_COLORS @r{capability} >> +SGR substring for C++ function template parameter bindings. >> + >> @item fixit-insert= >> @vindex fixit-insert GCC_COLORS @r{capability} >> SGR substring for fix-it hints suggesting text to > > There's a section of the docs for -fdiagnostics-color a little above > this, starting > "The default @env{GCC_COLORS} is" > which needs to be updated whenever we add new color capabilities. Fixed. >> diff --git a/gcc/cp/error.c b/gcc/cp/error.c >> index 323643d1e6f..0008ee2ee8d 100644 >> --- a/gcc/cp/error.c >> +++ b/gcc/cp/error.c >> @@ -1,4 +1,4 @@ >> -/* Call-backs for C++ error reporting. >> +/* Call-backs for -*- C++ -*- error reporting. > > This change isn't called out in the ChangeLog. Is it deliberate? Yes, an incidental change to tell emacs that it's a C++ source file despite the .c suffix. Probably not important, since it seems we're about to rename the .c files. > [...] > >> @@ -1158,6 +1163,22 @@ dump_simple_decl (cxx_pretty_printer *pp, tree > t, tree type, int flags) >> dump_type_suffix (pp, type, flags); >> } >> >> +struct colorize_guard >> +{ >> + bool colorize; >> + cxx_pretty_printer *pp; >> + >> + colorize_guard (bool _colorize, cxx_pretty_printer *pp, const char > *name) >> + : colorize (_colorize && pp_show_color (pp)), pp (pp) >> + { >> + pp_string (pp, colorize_start (colorize, name)); >> + } >> + ~colorize_guard () >> + { >> + pp_string (pp, colorize_stop (colorize)); >> + } >> +}; > > Might as well make this a class, and make the fields be private since > nothing accesses them, I think. Done. >> @@ -1928,6 +1949,11 @@ dump_exception_spec (cxx_pretty_printer *pp, > tree t, int flags) >> static void >> dump_function_name (cxx_pretty_printer *pp, tree t, int flags) >> { >> + bool colorize = flags & (TFF_DECL_SPECIFIERS | TFF_RETURN_TYPE >> + | TFF_TEMPLATE_HEADER); > > I'm not as familiar with this code as you, so I'm assuming the above is > correct. Maybe a comment explaining the intent of this logic? Done. >> + >> + colorize_guard g (colorize, pp, "fnname"); >> + >> tree name = DECL_NAME (t); >> >> /* We can get here with a decl that was synthesized by language- > > [...] > >> @@ -3598,20 +3628,20 @@ function_category (tree fn) >> && DECL_FUNCTION_MEMBER_P (fn)) >> { >> if (DECL_STATIC_FUNCTION_P (fn)) >> - return _("In static member function %qs"); >> + return _("In static member function %qD"); >> else if (DECL_COPY_CONSTRUCTOR_P (fn)) >> - return _("In copy constructor %qs"); >> + return _("In copy constructor %qD"); >> else if (DECL_CONSTRUCTOR_P (fn)) >> - return _("In constructor %qs"); >> + return _("In constructor %qD"); >> else if (DECL_DESTRUCTOR_P (fn)) >> - return _("In destructor %qs"); >> + return _("In destructor %qD"); >> else if (LAMBDA_FUNCTION_P (fn)) >> return _("In lambda function"); >> else >> - return _("In member function %qs"); >> + return _("In member function %qD"); >> } >> else >> - return _("In function %qs"); >> + return _("In function %qD"); >> } > > The leading comment for function_category still refers to %qs and thus > needs updating. Fixed. >> @@ -4393,7 +4423,7 @@ cp_printer (pretty_printer *pp, text_info > *text, const char *spec, >> break; >> } >> } >> - result = decl_to_string (temp, verbose); >> + result = decl_to_string (temp, verbose, pp_show_color (pp)); >> } >> break; >> case 'E': result = expr_to_string (next_tree); break; > > [...] > > FWIW there's no automated test coverage for this; there are some > examples of testing colorization in DejaGnu in the plugins > subdirectories e.g. > gcc/testsuite/g++.dg/plugin/show_template_tree_color_plugin.c > gcc/testsuite/g++.dg/plugin/show-template-tree-color.C > They can be awkward to write and maintain, but this stuff is non- > trivial, so it would be nice to have a test to make sure we don't > regress. > > To what extent have you been "eating your own dogfood" with this patch? > (i.e. having it applied to your primary compiler for development). I'm > a bit wary of making this change at this point in the release cycle > without spending some time "living with it" (and sorry again for not > commenting on it earlier; I was avoiding being online for most of > December) Not to a significant extent; this isn't so important for compiling relatively simple C++ code like we have in GCC, and I mostly build with the system compiler. I've mostly used it when debugging the compiler's handling of a larger testcase. > My feeling is that this patch would be OK with the above nits fixed, > given that it's relatively trivial to revert if it causes difficulties, > but we should test it "in anger". > > Hope this is constructive Definitely, thanks. Here's a revision to address those nits: --------------SMP4mwa0ylsK0eKyK3X8Zvgv Content-Type: text/x-patch; charset=UTF-8; name="0001-c-add-color-to-function-decl-printing.patch" Content-Disposition: attachment; filename="0001-c-add-color-to-function-decl-printing.patch" Content-Transfer-Encoding: base64 RnJvbSAyYzYyNTZmNGE1MDk0YjNjYWFmZjNmMDVkNjFkZWRlYjI2MDlkNDE3IE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBKYXNvbiBNZXJyaWxsIDxqYXNvbkByZWRoYXQuY29tPgpEYXRl OiBGcmksIDE4IEp1biAyMDIxIDA1OjQ1OjAyIC0wNDAwClN1YmplY3Q6IFtQQVRDSF0gYysrOiBh ZGQgY29sb3IgdG8gZnVuY3Rpb24gZGVjbCBwcmludGluZwpUbzogZ2NjLXBhdGNoZXNAZ2NjLmdu dS5vcmcKCkluIHJlYWRpbmcgQysrIGRpYWdub3N0aWNzLCBpdCdzIG9mdGVuIGhhcmQgdG8gZmlu ZCB0aGUgbmFtZSBvZiB0aGUgZnVuY3Rpb24KaW4gdGhlIG1pZGRsZSBvZiB0aGUgdGVtcGxhdGUg aGVhZGVyLCByZXR1cm4gdHlwZSwgcGFyYW1ldGVycywgYW5kIHRlbXBsYXRlCmFyZ3VtZW50cy4g IFNvIGxldCdzIGNvbG9yaXplIGl0LCBhbmQgbWF5YmUgdGhlIHRlbXBsYXRlIGFyZ3VtZW50IGJp bmRpbmdzCndoaWxlIHdlJ3JlIGF0IGl0LgoKSSd2ZSBzb21ld2hhdCBhcmJpdHJhcmlseSBjaG9z ZW4gYm9sZCBncmVlbiBmb3IgdGhlIGZ1bmN0aW9uIG5hbWUsIGFuZApub24tYm9sZCBtYWdlbnRh IGZvciB0aGUgdGVtcGxhdGUgYXJndW1lbnRzLgoKQSBzaWRlLWVmZmVjdCBvZiB0aGlzIGlzIHRo YXQgd2hlbiB0aGlzIGhhcHBlbnMgaW4gYSBxdW90ZSAoaS5lLiAlcUQpLCB0aGUKcmVzdCBvZiB0 aGUgcXVvdGUgYWZ0ZXIgdGhlIGZ1bmN0aW9uIG5hbWUgaXMgbm8gbG9uZ2VyIGJvbGQuICBJIHRo aW5rIHRoYXQncwphY2NlcHRhYmxlOyByZXR1cm5pbmcgdG8gdGhlIGJvbGQgd291bGQgcmVxdWly ZSBtYWludGFpbmluZyBhIGNvbG9yaXplIHN0YWNrCmluc3RlYWQgb2YgdGhlIG9uL29mZiBjb250 cm9scyB3ZSBoYXZlIG5vdy4KCmdjYy9jcC9DaGFuZ2VMb2c6CgoJKiBlcnJvci5jIChkZWNsX3Rv X3N0cmluZyk6IEFkZCBzaG93X2NvbG9yIHBhcmFtZXRlci4KCShzdWJzdF90b19zdHJpbmcpOiBM aWtld2lzZS4KCShjcF9wcmludGVyKTogUGFzcyBpdC4KCSh0eXBlX3RvX3N0cmluZyk6IFNldCBw cF9zaG93X2NvbG9yLgoJKGR1bXBfZnVuY3Rpb25fbmFtZSk6IFVzZSAiZm5uYW1lIiBjb2xvci4K CShkdW1wX3RlbXBsYXRlX2JpbmRpbmdzKTogVXNlICJ0YXJncyIgY29sb3IuCgkoc3RydWN0IGNv bG9yaXplX2d1YXJkKTogTmV3LgoJKHJlaW5pdF9jeHhfcHApOiBDbGVhciBwcF9zaG93X2NvbG9y LgoJKGNwX3ByaW50X2Vycm9yX2Z1bmN0aW9uKTogVXNlICVxRC4KCShmdW5jdGlvbl9jYXRlZ29y eSk6IFVzZSAlcUQuCgpnY2MvQ2hhbmdlTG9nOgoKCSogZGlhZ25vc3RpYy1jb2xvci5jOiBBZGQg Zm5uYW1lIGFuZCB0YXJncyBjb2xvciBlbnRyaWVzLgoJKiBkb2MvaW52b2tlLnRleGk6IERvY3Vt ZW50IHRoZW0uCgpnY2MvdGVzdHN1aXRlL0NoYW5nZUxvZzoKCgkqIGcrKy5kZy9kaWFnbm9zdGlj L2Z1bmN0aW9uLWNvbG9yMS5DOiBOZXcgdGVzdC4KLS0tCiBnY2MvZG9jL2ludm9rZS50ZXhpICAg ICAgICAgICAgICAgICAgICAgICAgICAgfCAxMCArKy0KIGdjYy9jcC9lcnJvci5jICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICB8IDczICsrKysrKysrKysrKysrLS0tLS0KIGdjYy9kaWFn bm9zdGljLWNvbG9yLmMgICAgICAgICAgICAgICAgICAgICAgICB8ICAyICsKIC4uLi9nKysuZGcv ZGlhZ25vc3RpYy9mdW5jdGlvbi1jb2xvcjEuQyAgICAgICB8IDIxICsrKysrKwogNCBmaWxlcyBj aGFuZ2VkLCA4NSBpbnNlcnRpb25zKCspLCAyMSBkZWxldGlvbnMoLSkKIGNyZWF0ZSBtb2RlIDEw MDY0NCBnY2MvdGVzdHN1aXRlL2crKy5kZy9kaWFnbm9zdGljL2Z1bmN0aW9uLWNvbG9yMS5DCgpk aWZmIC0tZ2l0IGEvZ2NjL2RvYy9pbnZva2UudGV4aSBiL2djYy9kb2MvaW52b2tlLnRleGkKaW5k ZXggNTUwNDk3MWVhODEuLmNkMDczYzNjMzdlIDEwMDY0NAotLS0gYS9nY2MvZG9jL2ludm9rZS50 ZXhpCisrKyBiL2djYy9kb2MvaW52b2tlLnRleGkKQEAgLTQ3NTgsNyArNDc1OCw3IEBAIFRoZSBk ZWZhdWx0IEBlbnZ7R0NDX0NPTE9SU30gaXMKIGVycm9yPTAxOzMxOndhcm5pbmc9MDE7MzU6bm90 ZT0wMTszNjpyYW5nZTE9MzI6cmFuZ2UyPTM0OmxvY3VzPTAxOlwKIHF1b3RlPTAxOnBhdGg9MDE7 MzY6Zml4aXQtaW5zZXJ0PTMyOmZpeGl0LWRlbGV0ZT0zMTpcCiBkaWZmLWZpbGVuYW1lPTAxOmRp ZmYtaHVuaz0zMjpkaWZmLWRlbGV0ZT0zMTpkaWZmLWluc2VydD0zMjpcCi10eXBlLWRpZmY9MDE7 MzIKK3R5cGUtZGlmZj0wMTszMjpmbm5hbWU9MDE7MzI6dGFyZ3M9MzUKIEBlbmQgc21hbGxleGFt cGxlCiBAbm9pbmRlbnQKIHdoZXJlIEBzYW1wezAxOzMxfSBpcyBib2xkIHJlZCwgQHNhbXB7MDE7 MzV9IGlzIGJvbGQgbWFnZW50YSwKQEAgLTQ4MDMsNiArNDgwMywxNCBAQCBTR1Igc3Vic3RyaW5n IGZvciBsb2NhdGlvbiBpbmZvcm1hdGlvbiwgQHNhbXB7ZmlsZTpsaW5lfSBvcgogQHZpbmRleCBx dW90ZSBHQ0NfQ09MT1JTIEBye2NhcGFiaWxpdHl9CiBTR1Igc3Vic3RyaW5nIGZvciBpbmZvcm1h dGlvbiBwcmludGVkIHdpdGhpbiBxdW90ZXMuCiAKK0BpdGVtIGZubmFtZT0KK0B2aW5kZXggZm5u YW1lIEdDQ19DT0xPUlMgQHJ7Y2FwYWJpbGl0eX0KK1NHUiBzdWJzdHJpbmcgZm9yIG5hbWVzIG9m IEMrKyBmdW5jdGlvbnMuCisKK0BpdGVtIHRhcmdzPQorQHZpbmRleCB0YXJncyBHQ0NfQ09MT1JT IEBye2NhcGFiaWxpdHl9CitTR1Igc3Vic3RyaW5nIGZvciBDKysgZnVuY3Rpb24gdGVtcGxhdGUg cGFyYW1ldGVyIGJpbmRpbmdzLgorCiBAaXRlbSBmaXhpdC1pbnNlcnQ9CiBAdmluZGV4IGZpeGl0 LWluc2VydCBHQ0NfQ09MT1JTIEBye2NhcGFiaWxpdHl9CiBTR1Igc3Vic3RyaW5nIGZvciBmaXgt aXQgaGludHMgc3VnZ2VzdGluZyB0ZXh0IHRvCmRpZmYgLS1naXQgYS9nY2MvY3AvZXJyb3IuYyBi L2djYy9jcC9lcnJvci5jCmluZGV4IDhhM2I3YjU1MzdjLi40YzI5NTk2YzMwNCAxMDA2NDQKLS0t IGEvZ2NjL2NwL2Vycm9yLmMKKysrIGIvZ2NjL2NwL2Vycm9yLmMKQEAgLTI1LDYgKzI1LDcgQEAg YWxvbmcgd2l0aCBHQ0M7IHNlZSB0aGUgZmlsZSBDT1BZSU5HMy4gIElmIG5vdCBzZWUKICNpbmNs dWRlICJjcC10cmVlLmgiCiAjaW5jbHVkZSAic3RyaW5ncG9vbC5oIgogI2luY2x1ZGUgInRyZWUt ZGlhZ25vc3RpYy5oIgorI2luY2x1ZGUgImRpYWdub3N0aWMtY29sb3IuaCIKICNpbmNsdWRlICJs YW5naG9va3MtZGVmLmgiCiAjaW5jbHVkZSAiaW50bC5oIgogI2luY2x1ZGUgImN4eC1wcmV0dHkt cHJpbnQuaCIKQEAgLTU2LDcgKzU3LDcgQEAgc3RhdGljIGN4eF9wcmV0dHlfcHJpbnRlciAqIGNv bnN0IGN4eF9wcCA9ICZhY3R1YWxfcHJldHR5X3ByaW50ZXI7CiBzdGF0aWMgY29uc3QgY2hhciAq YXJnc190b19zdHJpbmcgKHRyZWUsIGludCk7CiBzdGF0aWMgY29uc3QgY2hhciAqY29kZV90b19z dHJpbmcgKGVudW0gdHJlZV9jb2RlKTsKIHN0YXRpYyBjb25zdCBjaGFyICpjdl90b19zdHJpbmcg KHRyZWUsIGludCk7Ci1zdGF0aWMgY29uc3QgY2hhciAqZGVjbF90b19zdHJpbmcgKHRyZWUsIGlu dCk7CitzdGF0aWMgY29uc3QgY2hhciAqZGVjbF90b19zdHJpbmcgKHRyZWUsIGludCwgYm9vbCk7 CiBzdGF0aWMgY29uc3QgY2hhciAqZm5kZWNsX3RvX3N0cmluZyAodHJlZSwgaW50KTsKIHN0YXRp YyBjb25zdCBjaGFyICpvcF90b19zdHJpbmcJKGJvb2wsIGVudW0gdHJlZV9jb2RlKTsKIHN0YXRp YyBjb25zdCBjaGFyICpwYXJtX3RvX3N0cmluZyAoaW50KTsKQEAgLTM5MCw2ICszOTEsNyBAQCBk dW1wX3RlbXBsYXRlX2JpbmRpbmdzIChjeHhfcHJldHR5X3ByaW50ZXIgKnBwLCB0cmVlIHBhcm1z LCB0cmVlIGFyZ3MsCiAgICAgICBlbHNlCiAJewogCSAgcHBfY3h4X3doaXRlc3BhY2UgKHBwKTsK KwkgIHBwX3N0cmluZyAocHAsIGNvbG9yaXplX3N0YXJ0IChwcF9zaG93X2NvbG9yIChwcCksICJ0 YXJncyIpKTsKIAkgIHBwX2N4eF9sZWZ0X2JyYWNrZXQgKHBwKTsKIAkgIHBwLT50cmFuc2xhdGVf c3RyaW5nICgid2l0aCIpOwogCSAgcHBfY3h4X3doaXRlc3BhY2UgKHBwKTsKQEAgLTQwMCw3ICs0 MDIsMTAgQEAgZHVtcF90ZW1wbGF0ZV9iaW5kaW5ncyAoY3h4X3ByZXR0eV9wcmludGVyICpwcCwg dHJlZSBwYXJtcywgdHJlZSBhcmdzLAogICAgIH5wcmVwb3N0X3NlbWljb2xvbiAoKQogICAgIHsK ICAgICAgIGlmIChuZWVkX3NlbWljb2xvbikKLQlwcF9jeHhfcmlnaHRfYnJhY2tldCAocHApOwor CXsKKwkgIHBwX2N4eF9yaWdodF9icmFja2V0IChwcCk7CisJICBwcF9zdHJpbmcgKHBwLCBjb2xv cml6ZV9zdG9wIChwcF9zaG93X2NvbG9yIChwcCkpKTsKKwl9CiAgICAgfQogICB9IHNlbWljb2xv bl9vcl9pbnRyb2R1Y2VyID0ge3BwLCBmYWxzZX07CiAKQEAgLTExNTgsNiArMTE2MywyMiBAQCBk dW1wX3NpbXBsZV9kZWNsIChjeHhfcHJldHR5X3ByaW50ZXIgKnBwLCB0cmVlIHQsIHRyZWUgdHlw ZSwgaW50IGZsYWdzKQogICAgIGR1bXBfdHlwZV9zdWZmaXggKHBwLCB0eXBlLCBmbGFncyk7CiB9 CiAKK2NsYXNzIGNvbG9yaXplX2d1YXJkCit7CisgIGJvb2wgY29sb3JpemU7CisgIGN4eF9wcmV0 dHlfcHJpbnRlciAqcHA7CitwdWJsaWM6CisgIGNvbG9yaXplX2d1YXJkIChib29sIF9jb2xvcml6 ZSwgY3h4X3ByZXR0eV9wcmludGVyICpwcCwgY29uc3QgY2hhciAqbmFtZSkKKyAgICA6IGNvbG9y aXplIChfY29sb3JpemUgJiYgcHBfc2hvd19jb2xvciAocHApKSwgcHAgKHBwKQorICB7CisgICAg cHBfc3RyaW5nIChwcCwgY29sb3JpemVfc3RhcnQgKGNvbG9yaXplLCBuYW1lKSk7CisgIH0KKyAg fmNvbG9yaXplX2d1YXJkICgpCisgIHsKKyAgICBwcF9zdHJpbmcgKHBwLCBjb2xvcml6ZV9zdG9w IChjb2xvcml6ZSkpOworICB9Cit9OworCiAvKiBQcmludCBhbiBJREVOVElGSUVSX05PREUgdGhh dCBpcyB0aGUgbmFtZSBvZiBhIGRlY2xhcmF0aW9uLiAgKi8KIAogc3RhdGljIHZvaWQKQEAgLTE5 MjgsNiArMTk0OSwxMyBAQCBkdW1wX2V4Y2VwdGlvbl9zcGVjIChjeHhfcHJldHR5X3ByaW50ZXIg KnBwLCB0cmVlIHQsIGludCBmbGFncykKIHN0YXRpYyB2b2lkCiBkdW1wX2Z1bmN0aW9uX25hbWUg KGN4eF9wcmV0dHlfcHJpbnRlciAqcHAsIHRyZWUgdCwgaW50IGZsYWdzKQogeworICAvKiBPbmx5 IGNvbG9yaXplIHdoZW4gd2UncmUgcHJpbnRpbmcgc29tZXRoaW5nIGJlZm9yZSB0aGUgbmFtZTsg aW4KKyAgICAgcGFydGljdWxhciwgbm90IHdoZW4gcHJpbnRpbmcgYSBDQUxMX0VYUFIuICAqLwor ICBib29sIGNvbG9yaXplID0gZmxhZ3MgJiAoVEZGX0RFQ0xfU1BFQ0lGSUVSUyB8IFRGRl9SRVRV Uk5fVFlQRQorCQkJICAgfCBURkZfVEVNUExBVEVfSEVBREVSKTsKKworICBjb2xvcml6ZV9ndWFy ZCBnIChjb2xvcml6ZSwgcHAsICJmbm5hbWUiKTsKKwogICB0cmVlIG5hbWUgPSBERUNMX05BTUUg KHQpOwogCiAgIC8qIFdlIGNhbiBnZXQgaGVyZSB3aXRoIGEgZGVjbCB0aGF0IHdhcyBzeW50aGVz aXplZCBieSBsYW5ndWFnZS0KQEAgLTMwNjIsNiArMzA5MCw3IEBAIHJlaW5pdF9jeHhfcHAgKHZv aWQpCiAgIGN4eF9wcC0+cGFkZGluZyA9IHBwX25vbmU7CiAgIHBwX2luZGVudGF0aW9uIChjeHhf cHApID0gMDsKICAgcHBfbmVlZHNfbmV3bGluZSAoY3h4X3BwKSA9IGZhbHNlOworICBwcF9zaG93 X2NvbG9yIChjeHhfcHApID0gZmFsc2U7CiAgIGN4eF9wcC0+ZW5jbG9zaW5nX3Njb3BlID0gY3Vy cmVudF9mdW5jdGlvbl9kZWNsOwogfQogCkBAIC0zMjA4LDcgKzMyMzcsNyBAQCBsb2NhdGlvbl9v ZiAodHJlZSB0KQogICAgZnVuY3Rpb24uICAqLwogCiBzdGF0aWMgY29uc3QgY2hhciAqCi1kZWNs X3RvX3N0cmluZyAodHJlZSBkZWNsLCBpbnQgdmVyYm9zZSkKK2RlY2xfdG9fc3RyaW5nICh0cmVl IGRlY2wsIGludCB2ZXJib3NlLCBib29sIHNob3dfY29sb3IpCiB7CiAgIGludCBmbGFncyA9IDA7 CiAKQEAgLTMyMjIsNiArMzI1MSw3IEBAIGRlY2xfdG9fc3RyaW5nICh0cmVlIGRlY2wsIGludCB2 ZXJib3NlKQogICBmbGFncyB8PSBURkZfVEVNUExBVEVfSEVBREVSOwogCiAgIHJlaW5pdF9jeHhf cHAgKCk7CisgIHBwX3Nob3dfY29sb3IgKGN4eF9wcCkgPSBzaG93X2NvbG9yOwogICBkdW1wX2Rl Y2wgKGN4eF9wcCwgZGVjbCwgZmxhZ3MpOwogICByZXR1cm4gcHBfZ2djX2Zvcm1hdHRlZF90ZXh0 IChjeHhfcHApOwogfQpAQCAtMzMyMSw2ICszMzUxLDcgQEAgdHlwZV90b19zdHJpbmcgKHRyZWUg dHlwLCBpbnQgdmVyYm9zZSwgYm9vbCBwb3N0cHJvY2Vzc2VkLCBib29sICpxdW90ZSwKICAgZmxh Z3MgfD0gVEZGX1RFTVBMQVRFX0hFQURFUjsKIAogICByZWluaXRfY3h4X3BwICgpOworICBwcF9z aG93X2NvbG9yIChjeHhfcHApID0gc2hvd19jb2xvcjsKIAogICBpZiAocG9zdHByb2Nlc3NlZCAm JiBxdW90ZSAmJiAqcXVvdGUpCiAgICAgcHBfYmVnaW5fcXVvdGUgKGN4eF9wcCwgc2hvd19jb2xv cik7CkBAIC0zNDE1LDcgKzM0NDYsNyBAQCBhcmdzX3RvX3N0cmluZyAodHJlZSBwLCBpbnQgdmVy Ym9zZSkKICAgIGFyZ3VtZW50cy4gICovCiAKIHN0YXRpYyBjb25zdCBjaGFyICoKLXN1YnN0X3Rv X3N0cmluZyAodHJlZSBwKQorc3Vic3RfdG9fc3RyaW5nICh0cmVlIHAsIGJvb2wgc2hvd19jb2xv cikKIHsKICAgdHJlZSBkZWNsID0gVFJFRV9QVVJQT1NFIChwKTsKICAgdHJlZSB0YXJncyA9IFRS RUVfVkFMVUUgKHApOwpAQCAtMzQyNyw2ICszNDU4LDcgQEAgc3Vic3RfdG9fc3RyaW5nICh0cmVl IHApCiAgICAgcmV0dXJuICIiOwogCiAgIHJlaW5pdF9jeHhfcHAgKCk7CisgIHBwX3Nob3dfY29s b3IgKGN4eF9wcCkgPSBzaG93X2NvbG9yOwogICBkdW1wX3RlbXBsYXRlX2RlY2wgKGN4eF9wcCwg VFJFRV9QVVJQT1NFIChwKSwgZmxhZ3MpOwogICBkdW1wX3N1YnN0aXR1dGlvbiAoY3h4X3BwLCBO VUxMLCB0cGFybXMsIHRhcmdzLCAvKmZsYWdzPSovMCk7CiAgIHJldHVybiBwcF9nZ2NfZm9ybWF0 dGVkX3RleHQgKGN4eF9wcCk7CkBAIC0zNTE3LDcgKzM1NDksNyBAQCBjcF9wcmludF9lcnJvcl9m dW5jdGlvbiAoZGlhZ25vc3RpY19jb250ZXh0ICpjb250ZXh0LAogCSAgICBmbmRlY2wgPSBjdXJy ZW50X2Z1bmN0aW9uX2RlY2w7CiAKIAkgIHBwX3ByaW50ZiAoY29udGV4dC0+cHJpbnRlciwgZnVu Y3Rpb25fY2F0ZWdvcnkgKGZuZGVjbCksCi0JCSAgICAgY3h4X3ByaW50YWJsZV9uYW1lX3RyYW5z bGF0ZSAoZm5kZWNsLCAyKSk7CisJCSAgICAgZm5kZWNsKTsKIAogCSAgd2hpbGUgKGFic3RyYWN0 X29yaWdpbikKIAkgICAgewpAQCAtMzU2MSwxOSArMzU5MywxOSBAQCBjcF9wcmludF9lcnJvcl9m dW5jdGlvbiAoZGlhZ25vc3RpY19jb250ZXh0ICpjb250ZXh0LAogCQkgICAgewogCQkgICAgICBp ZiAoY29udGV4dC0+c2hvd19jb2x1bW4gJiYgcy5jb2x1bW4gIT0gMCkKIAkJCXBwX3ByaW50ZiAo Y29udGV4dC0+cHJpbnRlciwKLQkJCQkgICBfKCIgICAgaW5saW5lZCBmcm9tICVxcyBhdCAlciVz OiVkOiVkJVIiKSwKLQkJCQkgICBjeHhfcHJpbnRhYmxlX25hbWVfdHJhbnNsYXRlIChmbmRlY2ws IDIpLAorCQkJCSAgIF8oIiAgICBpbmxpbmVkIGZyb20gJXFEIGF0ICVyJXM6JWQ6JWQlUiIpLAor CQkJCSAgIGZuZGVjbCwKIAkJCQkgICAibG9jdXMiLCBzLmZpbGUsIHMubGluZSwgcy5jb2x1bW4p OwogCQkgICAgICBlbHNlCiAJCQlwcF9wcmludGYgKGNvbnRleHQtPnByaW50ZXIsCi0JCQkJICAg XygiICAgIGlubGluZWQgZnJvbSAlcXMgYXQgJXIlczolZCVSIiksCi0JCQkJICAgY3h4X3ByaW50 YWJsZV9uYW1lX3RyYW5zbGF0ZSAoZm5kZWNsLCAyKSwKKwkJCQkgICBfKCIgICAgaW5saW5lZCBm cm9tICVxRCBhdCAlciVzOiVkJVIiKSwKKwkJCQkgICBmbmRlY2wsCiAJCQkJICAgImxvY3VzIiwg cy5maWxlLCBzLmxpbmUpOwogCiAJCSAgICB9CiAJCSAgZWxzZQotCQkgICAgcHBfcHJpbnRmIChj b250ZXh0LT5wcmludGVyLCBfKCIgICAgaW5saW5lZCBmcm9tICVxcyIpLAotCQkJICAgICAgIGN4 eF9wcmludGFibGVfbmFtZV90cmFuc2xhdGUgKGZuZGVjbCwgMikpOworCQkgICAgcHBfcHJpbnRm IChjb250ZXh0LT5wcmludGVyLCBfKCIgICAgaW5saW5lZCBmcm9tICVxRCIpLAorCQkJICAgICAg IGZuZGVjbCk7CiAJCX0KIAkgICAgfQogCSAgcHBfY2hhcmFjdGVyIChjb250ZXh0LT5wcmludGVy LCAnOicpOwpAQCAtMzU4Nyw3ICszNjE5LDggQEAgY3BfcHJpbnRfZXJyb3JfZnVuY3Rpb24gKGRp YWdub3N0aWNfY29udGV4dCAqY29udGV4dCwKIH0KIAogLyogUmV0dXJucyBhIGRlc2NyaXB0aW9u IG9mIEZVTkNUSU9OIHVzaW5nIHN0YW5kYXJkIHRlcm1pbm9sb2d5LiAgVGhlCi0gICByZXN1bHQg aXMgYSBmb3JtYXQgc3RyaW5nIG9mIHRoZSBmb3JtICJJbiBDQVRFR09SWSAlcXMiLiAgKi8KKyAg IHJlc3VsdCBpcyBhIGZvcm1hdCBzdHJpbmcgb2YgdGhlIGZvcm0gIkluIENBVEVHT1JZICVxRCIu ICAqLworCiBzdGF0aWMgY29uc3QgY2hhciAqCiBmdW5jdGlvbl9jYXRlZ29yeSAodHJlZSBmbikK IHsKQEAgLTM1OTgsMjAgKzM2MzEsMjAgQEAgZnVuY3Rpb25fY2F0ZWdvcnkgKHRyZWUgZm4pCiAg ICAgICAmJiBERUNMX0ZVTkNUSU9OX01FTUJFUl9QIChmbikpCiAgICAgewogICAgICAgaWYgKERF Q0xfU1RBVElDX0ZVTkNUSU9OX1AgKGZuKSkKLQlyZXR1cm4gXygiSW4gc3RhdGljIG1lbWJlciBm dW5jdGlvbiAlcXMiKTsKKwlyZXR1cm4gXygiSW4gc3RhdGljIG1lbWJlciBmdW5jdGlvbiAlcUQi KTsKICAgICAgIGVsc2UgaWYgKERFQ0xfQ09QWV9DT05TVFJVQ1RPUl9QIChmbikpCi0JcmV0dXJu IF8oIkluIGNvcHkgY29uc3RydWN0b3IgJXFzIik7CisJcmV0dXJuIF8oIkluIGNvcHkgY29uc3Ry dWN0b3IgJXFEIik7CiAgICAgICBlbHNlIGlmIChERUNMX0NPTlNUUlVDVE9SX1AgKGZuKSkKLQly ZXR1cm4gXygiSW4gY29uc3RydWN0b3IgJXFzIik7CisJcmV0dXJuIF8oIkluIGNvbnN0cnVjdG9y ICVxRCIpOwogICAgICAgZWxzZSBpZiAoREVDTF9ERVNUUlVDVE9SX1AgKGZuKSkKLQlyZXR1cm4g XygiSW4gZGVzdHJ1Y3RvciAlcXMiKTsKKwlyZXR1cm4gXygiSW4gZGVzdHJ1Y3RvciAlcUQiKTsK ICAgICAgIGVsc2UgaWYgKExBTUJEQV9GVU5DVElPTl9QIChmbikpCiAJcmV0dXJuIF8oIkluIGxh bWJkYSBmdW5jdGlvbiIpOwogICAgICAgZWxzZQotCXJldHVybiBfKCJJbiBtZW1iZXIgZnVuY3Rp b24gJXFzIik7CisJcmV0dXJuIF8oIkluIG1lbWJlciBmdW5jdGlvbiAlcUQiKTsKICAgICB9CiAg IGVsc2UKLSAgICByZXR1cm4gXygiSW4gZnVuY3Rpb24gJXFzIik7CisgICAgcmV0dXJuIF8oIklu IGZ1bmN0aW9uICVxRCIpOwogfQogCiAvKiBEaXNhYmxlIHdhcm5pbmdzIGFib3V0IG1pc3Npbmcg cXVvdGluZyBpbiBHQ0MgZGlhZ25vc3RpY3MgZm9yCkBAIC00MzkzLDcgKzQ0MjYsNyBAQCBjcF9w cmludGVyIChwcmV0dHlfcHJpbnRlciAqcHAsIHRleHRfaW5mbyAqdGV4dCwgY29uc3QgY2hhciAq c3BlYywKIAkJYnJlYWs7CiAJICAgICAgfQogCSAgfQotCXJlc3VsdCA9IGRlY2xfdG9fc3RyaW5n ICh0ZW1wLCB2ZXJib3NlKTsKKwlyZXN1bHQgPSBkZWNsX3RvX3N0cmluZyAodGVtcCwgdmVyYm9z ZSwgcHBfc2hvd19jb2xvciAocHApKTsKICAgICAgIH0KICAgICAgIGJyZWFrOwogICAgIGNhc2Ug J0UnOiByZXN1bHQgPSBleHByX3RvX3N0cmluZyAobmV4dF90cmVlKTsJCWJyZWFrOwpAQCAtNDQx MCw3ICs0NDQzLDcgQEAgY3BfcHJpbnRlciAocHJldHR5X3ByaW50ZXIgKnBwLCB0ZXh0X2luZm8g KnRleHQsIGNvbnN0IGNoYXIgKnNwZWMsCiAgICAgY2FzZSAnTyc6IHJlc3VsdCA9IG9wX3RvX3N0 cmluZyAoZmFsc2UsIG5leHRfdGNvZGUpOwlicmVhazsKICAgICBjYXNlICdQJzogcmVzdWx0ID0g cGFybV90b19zdHJpbmcgKG5leHRfaW50KTsJCWJyZWFrOwogICAgIGNhc2UgJ1EnOiByZXN1bHQg PSBvcF90b19zdHJpbmcgKHRydWUsIG5leHRfdGNvZGUpOwkJYnJlYWs7Ci0gICAgY2FzZSAnUyc6 IHJlc3VsdCA9IHN1YnN0X3RvX3N0cmluZyAobmV4dF90cmVlKTsJCWJyZWFrOworICAgIGNhc2Ug J1MnOiByZXN1bHQgPSBzdWJzdF90b19zdHJpbmcgKG5leHRfdHJlZSwgcHBfc2hvd19jb2xvciAo cHApKTsgYnJlYWs7CiAgICAgY2FzZSAnVCc6CiAgICAgICB7CiAJcmVzdWx0ID0gdHlwZV90b19z dHJpbmcgKG5leHRfdHJlZSwgdmVyYm9zZSwgZmFsc2UsIHF1b3RlZCwKZGlmZiAtLWdpdCBhL2dj Yy9kaWFnbm9zdGljLWNvbG9yLmMgYi9nY2MvZGlhZ25vc3RpYy1jb2xvci5jCmluZGV4IGZhMzA3 MDc5NzVmLi5mMGJhYWIyYTI4MiAxMDA2NDQKLS0tIGEvZ2NjL2RpYWdub3N0aWMtY29sb3IuYwor KysgYi9nY2MvZGlhZ25vc3RpYy1jb2xvci5jCkBAIC05MSw2ICs5MSw4IEBAIHN0YXRpYyBzdHJ1 Y3QgY29sb3JfY2FwIGNvbG9yX2RpY3RbXSA9CiAgIHsgImxvY3VzIiwgU0dSX1NFUSAoQ09MT1Jf Qk9MRCksIDUsIGZhbHNlIH0sCiAgIHsgInF1b3RlIiwgU0dSX1NFUSAoQ09MT1JfQk9MRCksIDUs IGZhbHNlIH0sCiAgIHsgInBhdGgiLCBTR1JfU0VRIChDT0xPUl9CT0xEIENPTE9SX1NFUEFSQVRP UiBDT0xPUl9GR19DWUFOKSwgNCwgZmFsc2UgfSwKKyAgeyAiZm5uYW1lIiwgU0dSX1NFUSAoQ09M T1JfQk9MRCBDT0xPUl9TRVBBUkFUT1IgQ09MT1JfRkdfR1JFRU4pLCA2LCBmYWxzZSB9LAorICB7 ICJ0YXJncyIsIFNHUl9TRVEgKENPTE9SX0ZHX01BR0VOVEEpLCA1LCBmYWxzZSB9LAogICB7ICJm aXhpdC1pbnNlcnQiLCBTR1JfU0VRIChDT0xPUl9GR19HUkVFTiksIDEyLCBmYWxzZSB9LAogICB7 ICJmaXhpdC1kZWxldGUiLCBTR1JfU0VRIChDT0xPUl9GR19SRUQpLCAxMiwgZmFsc2UgfSwKICAg eyAiZGlmZi1maWxlbmFtZSIsIFNHUl9TRVEgKENPTE9SX0JPTEQpLCAxMywgZmFsc2UgfSwKZGlm ZiAtLWdpdCBhL2djYy90ZXN0c3VpdGUvZysrLmRnL2RpYWdub3N0aWMvZnVuY3Rpb24tY29sb3Ix LkMgYi9nY2MvdGVzdHN1aXRlL2crKy5kZy9kaWFnbm9zdGljL2Z1bmN0aW9uLWNvbG9yMS5DCm5l dyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwLi4zMmQ5ZTk2NmJkYgotLS0gL2Rl di9udWxsCisrKyBiL2djYy90ZXN0c3VpdGUvZysrLmRnL2RpYWdub3N0aWMvZnVuY3Rpb24tY29s b3IxLkMKQEAgLTAsMCArMSwyMSBAQAorLy8gVmVyaWZ5IGNvbG9yaXphdGlvbiBvZiBwcmludGlu ZyBvZiBmdW5jdGlvbiBkZWNsYXJhdGlvbnMuCisvLyBVc2UgZGctKi1tdWx0aWxpbmUtb3V0cHV0 IHRvIGF2b2lkIHJlZ2V4cCBpbnRlcnByZXRhdGlvbi4KKworLy8geyBkZy1vcHRpb25zICItZmRp YWdub3N0aWNzLWNvbG9yPWFsd2F5cyIgfQorCit0ZW1wbGF0ZSA8Y2xhc3MgVD4gdm9pZCBmKHNo b3J0IHQpOwordGVtcGxhdGUgPGNsYXNzIFQ+IHZvaWQgZihsb25nIHQpOworCitpbnQgbWFpbigp Cit7CisgIGY8aW50Pig0Mik7CisgIC8qIHsgZGctYmVnaW4tbXVsdGlsaW5lLW91dHB1dCAiIiB9 CitjYWxsIG9mIG92ZXJsb2FkZWQgJxtbMDFtG1tLZjxpbnQ+KGludCkbW20bW0snIGlzIGFtYmln dW91cworICAgICB7IGRnLWVuZC1tdWx0aWxpbmUtb3V0cHV0ICIiIH0gKi8KKyAgLyogeyBkZy1i ZWdpbi1tdWx0aWxpbmUtb3V0cHV0ICIiIH0KK2NhbmRpZGF0ZTogJxtbMDFtG1tLdm9pZBtbMDE7 MzJtG1tLIGYbW20bW0soc2hvcnQgaW50KSAbWzM1bRtbS1t3aXRoIFQgPSBpbnRdG1ttG1tLG1tt G1tLJworICAgICB7IGRnLWVuZC1tdWx0aWxpbmUtb3V0cHV0ICIiIH0gKi8KK30KKworLy8gRGlz Y2FyZCB0aGUgcmVtYWluaW5nIGNvbG9yaXplZCBvdXRwdXQgdGhhdCBjb25mdXNlcyBkZWphZ251 LgorLy8geyBkZy1wcnVuZS1vdXRwdXQgZGlhZ25vc3RpYy9mdW5jdGlvbi1jb2xvcjEuQyB9Ci0t IAoyLjI3LjAKCg== --------------SMP4mwa0ylsK0eKyK3X8Zvgv--