From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from sender4-pp-o91.zoho.com (sender4-pp-o91.zoho.com [136.143.188.91]) by sourceware.org (Postfix) with ESMTPS id A4D0B385703C; Fri, 14 May 2021 02:11:55 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.3.2 sourceware.org A4D0B385703C ARC-Seal: i=1; a=rsa-sha256; t=1620958311; cv=none; d=zohomail.com; s=zohoarc; b=E0EoK+GIBx7OY5K/C9bWngPvTK8kOGFa7c9UMdaK82SZSFtLyU8y/KxJaA2cGH/8H/922xgRpXYwhDGCvdbnJdEA8kdOAeUJNa7NVFV7y2sudBD3s6LcK44ighjpIk9eZedL9dgEVY1bTjR6zrEo2RkDl1CqpMr529zXsxuT3A0= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1620958311; h=Content-Type:Cc:Date:From:In-Reply-To:MIME-Version:Message-ID:References:Subject:To; bh=wOI3j8GidCsKqwJ/vRQgQTDKauBt8SkNQAAad47VT2U=; b=Fq3kIWZMM86L3lMHyIzJdNRpAlWThGRUzFWFccRjKUzAMj0C4b3emoLpTDyjV9++KDrI9seck6e7t8knSGljmJHuhKl5bimhXDFTzOQm6iJ0z3tqzxzbvXgUVs7EokfTo0xK3s6CtLJZhOXhXsG0eBhUqfS027UZfWKjuWYI8fc= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass header.i=zoho.com; spf=pass smtp.mailfrom=bouanto@zoho.com; dmarc=pass header.from= header.from= Received: from [192.168.1.174] (38.87.11.6 [38.87.11.6]) by mx.zohomail.com with SMTPS id 162095830940111.761140648556193; Thu, 13 May 2021 19:11:49 -0700 (PDT) Message-ID: Subject: Re: [PATCH] libgccjit: add some reflection functions in the jit C api From: Antoni Boucher To: David Malcolm Cc: Andrea Corallo , Antoni Boucher via Jit , gcc-patches@gcc.gnu.org Date: Thu, 13 May 2021 22:11:47 -0400 In-Reply-To: <3388bb8c84e68cd7b0698dc154e7a5666c0d2cde.camel@redhat.com> References: <20200902010120.crnx55ev635ceiey@bouanto-desktop.localdomain> <6fe2ea355403eb177c9632e076c11c792f23c791.camel@redhat.com> <9cd00fe5cb5c03184e3a5bd939447b30450a8ca7.camel@redhat.com> <20201015160226.cka4iq3w22jztopm@bouanto-desktop.localdomain> <20201015173952.ft7mu5ajbaxb3gke@bouanto-desktop.localdomain> <54ba5c58dbd2b8c7b1f3276c2b87cddf55e258bd.camel@redhat.com> <20201103221324.xw3jbvrw2uwdc4rz@bouanto-desktop.localdomain> <3388bb8c84e68cd7b0698dc154e7a5666c0d2cde.camel@redhat.com> Content-Type: multipart/mixed; boundary="=-zcRM2rzc8XQu9QUjPBh9" User-Agent: Evolution 3.40.1 MIME-Version: 1.0 X-Zoho-Virus-Status: 1 X-ZohoMailClient: External X-Spam-Status: No, score=-9.5 required=5.0 tests=BAYES_00, BODY_8BITS, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, FREEMAIL_FROM, GIT_PATCH_0, KAM_ASCII_DIVIDERS, 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: jit@gcc.gnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Jit mailing list List-Unsubscribe: , List-Archive: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 14 May 2021 02:12:00 -0000 --=-zcRM2rzc8XQu9QUjPBh9 Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable Thanks for your reviews. I attached the new patch to this email. See answers below: Le jeudi 13 mai 2021 =C3=A0 17:30 -0400, David Malcolm a =C3=A9crit : > On Tue, 2020-11-03 at 17:13 -0500, Antoni Boucher wrote: > > I was missing a check in gcc_jit_struct_get_field, I added it in > > this > > new patch. > >=20 >=20 > Sorry about the long delay in reviewing this patch. >=20 > The main high-level points are: > - currently the get_*_count functions return "ssize_t" - why? Only > unsigned values are meaningful; shouldn't they return "size_t" > instead? For those, I had this question in a previous email: That seemed off to return NULL for the functions returning a=20 size_t to indicate an error. So I changed it to return -1 (and return type to ssize_t). Is that the proper way to indicate an error? Once I know the answer for this error handling question, I'll fix the types. > - the various "lookup by index" functions take "int" i.e. signed, but > only >=3D 0 is meaningful. I think it makes sense to make them take > size_t instead. That's fixed in the new patch. > Sorry if we covered that before in the review, it's been a while. >=20 > Various nitpicks inline below... >=20 > [...snip...] > =C2=A0 > > diff --git a/gcc/jit/docs/topics/compatibility.rst > > b/gcc/jit/docs/topics/compatibility.rst > > index 6bfa101ed71..236e5c72d81 100644 > > --- a/gcc/jit/docs/topics/compatibility.rst > > +++ b/gcc/jit/docs/topics/compatibility.rst > > @@ -226,3 +226,44 @@ entrypoints: > > =C2=A0-------------------- > > =C2=A0``LIBGCCJIT_ABI_14`` covers the addition of > > =C2=A0:func:`gcc_jit_global_set_initializer` > > + > > +.. _LIBGCCJIT_ABI_15: > > + > > +``LIBGCCJIT_ABI_15`` > > +-------------------- > > +``LIBGCCJIT_ABI_15`` covers the addition of reflection functions via > > API > > +entrypoints: >=20 > This needs updating, as I used LIBGCCJIT_ABI_15 for inline asm. This was updated for the new patch. > [...snip...] >=20 > > diff --git a/gcc/jit/docs/topics/functions.rst > > b/gcc/jit/docs/topics/functions.rst > > index eb40d64010e..aa6de87282d 100644 > > --- a/gcc/jit/docs/topics/functions.rst > > +++ b/gcc/jit/docs/topics/functions.rst > > @@ -171,6 +171,16 @@ Functions > > =C2=A0=C2=A0=C2=A0 underlying string, so it is valid to pass in a point= er to an on- > > stack > > =C2=A0=C2=A0=C2=A0 buffer. > > =C2=A0 > > +.. function::=C2=A0 ssize_t \ > > +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0 gcc_jit_function_get_param_count (gcc_jit_function > > *func) > > + > > +=C2=A0=C2=A0 Get the number of parameters of the function. > > + > > +.. function::=C2=A0 gcc_jit_type \* > > +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0 gcc_jit_function_get_return_type (gcc_jit_function > > *func) > > + > > +=C2=A0=C2=A0 Get the return type of the function. >=20 > As noted before, this doesn't yet document all the new entrypoints; I > think you wanted to hold off until all the details were thrashed out, > but hopefully we're close. >=20 > The documentation for an entrypoint should specify which ABI it was > added in. The documentation was added in the new patch. > [...snip...] >=20 > > +/* Public entrypoint.=C2=A0 See description in libgccjit.h. > > + > > +=C2=A0=C2=A0 After error-checking, the real work is done by the > > +=C2=A0=C2=A0 gcc::jit::recording::type::is_struct method, in > > +=C2=A0=C2=A0 jit-recording.c.=C2=A0 */ > > + > > +gcc_jit_struct * > > +gcc_jit_type_is_struct (gcc_jit_type *type) > > +{ > > +=C2=A0 RETURN_NULL_IF_FAIL (type, NULL, NULL, "NULL type"); > > +=C2=A0 gcc::jit::recording::struct_ *struct_type =3D type->is_struct (= ); > > +=C2=A0 return (gcc_jit_struct *)struct_type; > > +} > > + > > +/* Public entrypoint.=C2=A0 See description in libgccjit.h. > > + > > +=C2=A0=C2=A0 After error-checking, the real work is done by the > > +=C2=A0=C2=A0 gcc::jit::recording::vector_type::get_num_units method, i= n > > +=C2=A0=C2=A0 jit-recording.c.=C2=A0 */ > > + > > +ssize_t > > +gcc_jit_vector_type_get_num_units (gcc_jit_vector_type > > *vector_type) > > +{ > > +=C2=A0 RETURN_VAL_IF_FAIL (vector_type, -1, NULL, NULL, "NULL > > vector_type"); > > +=C2=A0 return vector_type->get_num_units (); > > +} > > + > > +/* Public entrypoint.=C2=A0 See description in libgccjit.h. > > + > > +=C2=A0=C2=A0 After error-checking, the real work is done by the > > +=C2=A0=C2=A0 gcc::jit::recording::vector_type::get_element_type method= , in > > +=C2=A0=C2=A0 jit-recording.c.=C2=A0 */ > > + > > +gcc_jit_type * > > +gcc_jit_vector_type_get_element_type (gcc_jit_vector_type > > *vector_type) > > +{ > > +=C2=A0 RETURN_NULL_IF_FAIL (vector_type, NULL, NULL, "NULL > > vector_type"); > > +=C2=A0 return (gcc_jit_type *)vector_type->get_element_type (); > > +} > > + > > +/* Public entrypoint.=C2=A0 See description in libgccjit.h. > > + > > +=C2=A0=C2=A0 After error-checking, the real work is done by the > > +=C2=A0=C2=A0 gcc::jit::recording::type::unqualified method, in > > +=C2=A0=C2=A0 jit-recording.c.=C2=A0 */ > > + > > +gcc_jit_type * > > +gcc_jit_type_unqualified (gcc_jit_type *type) > > +{ > > +=C2=A0 RETURN_NULL_IF_FAIL (type, NULL, NULL, "NULL type"); > > + > > +=C2=A0 return (gcc_jit_type *)type->unqualified (); > > +} > > + > > +/* Public entrypoint.=C2=A0 See description in libgccjit.h. > > + > > +=C2=A0=C2=A0 After error-checking, the real work is done by the > > +=C2=A0=C2=A0 gcc::jit::recording::type::dyn_cast_function_type method,= in > > +=C2=A0=C2=A0 jit-recording.c.=C2=A0 */ > > + > > +gcc_jit_function_type * > > +gcc_jit_type_is_function_ptr_type (gcc_jit_type *type) > > +{ > > +=C2=A0 RETURN_NULL_IF_FAIL (type, NULL, NULL, "NULL type"); > > +=C2=A0 gcc::jit::recording::type *func_ptr_type =3D type->dereference = (); > > +=C2=A0 RETURN_NULL_IF_FAIL (func_ptr_type, NULL, NULL, "NULL type"); > > +=C2=A0 gcc::jit::recording::function_type *func_type =3D > > +=C2=A0=C2=A0=C2=A0 func_ptr_type->dyn_cast_function_type (); > > +=C2=A0 RETURN_NULL_IF_FAIL (func_type, NULL, NULL, "NULL type"); >=20 > I notice that the other new "*_is_*" functions don't fail if the > dyncast returns NULL, whereas this one does. > > RETURN_NULL_IF_FAIL calls jit_error; do we really want that?=C2=A0 It > seems > more consistent to have it return NULL without an error for the case > where "type" isn't a function ptr type. This is fixed in the patch. >=20 > > + > > +=C2=A0 return (gcc_jit_function_type *)func_type; > > +} > > + > > +/* Public entrypoint.=C2=A0 See description in libgccjit.h. > > + > > +=C2=A0=C2=A0 After error-checking, the real work is done by the > > +=C2=A0=C2=A0 gcc::jit::recording::function_type::get_return_type metho= d, in > > +=C2=A0=C2=A0 jit-recording.c.=C2=A0 */ > > + > > +gcc_jit_type * > > +gcc_jit_function_type_get_return_type (gcc_jit_function_type > > *function_type) > > +{ > > +=C2=A0 RETURN_NULL_IF_FAIL (function_type, NULL, NULL, "NULL > > struct_type"); >=20 > Wrong error message; should be "NULL function_type". Fixed in the patch. >=20 >=20 > > +=C2=A0 return (gcc_jit_type *)function_type->get_return_type (); > > +} > > + > > +/* Public entrypoint.=C2=A0 See description in libgccjit.h. > > + > > +=C2=A0=C2=A0 After error-checking, the real work is done by the > > +=C2=A0=C2=A0 gcc::jit::recording::function_type::get_param_types metho= d, in > > +=C2=A0=C2=A0 jit-recording.c.=C2=A0 */ > > + > > +ssize_t > > +gcc_jit_function_type_get_param_count (gcc_jit_function_type > > *function_type) > > +{ > > +=C2=A0 RETURN_VAL_IF_FAIL (function_type, -1, NULL, NULL, "NULL > > struct_type"); >=20 > Wrong error message; should be "NULL function_type". Fixed in the patch >=20 > > +=C2=A0 return function_type->get_param_types ().length (); > > +} > > + > > +/* Public entrypoint.=C2=A0 See description in libgccjit.h. > > + > > +=C2=A0=C2=A0 After error-checking, the real work is done by the > > +=C2=A0=C2=A0 gcc::jit::recording::function_type::get_param_types metho= d, in > > +=C2=A0=C2=A0 jit-recording.c.=C2=A0 */ > > + > > +gcc_jit_type * > > +gcc_jit_function_type_get_param_type (gcc_jit_function_type > > *function_type, > > +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0int index) > > +{ > > +=C2=A0 RETURN_NULL_IF_FAIL (function_type, NULL, NULL, "NULL > > struct_type"); >=20 > Wrong error message; should be "NULL function_type". Fixed in the patch. >=20 >=20 > > +=C2=A0 int num_params =3D function_type->get_param_types ().length (); > > +=C2=A0 gcc::jit::recording::context *ctxt =3D function_type->m_ctxt; >=20 > "index" should either be unsigned, or we need to check here for >=3D 0. >=20 > > +=C2=A0 RETURN_NULL_IF_FAIL_PRINTF3 (index < num_params, > > +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 ctxt, NULL, > > +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 "index of %d is too large (%s has %d > > params)", > > +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 index, > > +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 function_type->get_debug_string (), > > +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 num_params); > > +=C2=A0 return (gcc_jit_type *)function_type->get_param_types ()[index]= ; > > +} > > + > > =C2=A0/* Public entrypoint.=C2=A0 See description in libgccjit.h. > > =C2=A0 > > =C2=A0=C2=A0=C2=A0 After error-checking, the real work is done by the > > @@ -731,6 +930,36 @@ gcc_jit_struct_set_fields (gcc_jit_struct > > *struct_type, > > =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0 (gcc::jit::recording::field **)fields); > > =C2=A0} > > =C2=A0 > > + > > +/* Public entrypoint.=C2=A0 See description in libgccjit.h. > > + > > +=C2=A0=C2=A0 After error-checking, the real work is done by the > > +=C2=A0=C2=A0 gcc::jit::recording::fields::get_field method in > > +=C2=A0=C2=A0 jit-recording.c.=C2=A0 */ > > +extern gcc_jit_field * > > +gcc_jit_struct_get_field (gcc_jit_struct *struct_type, > > +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0 int index) > > +{ > > +=C2=A0 RETURN_NULL_IF_FAIL (struct_type, NULL, NULL, "NULL struct > > type"); > > +=C2=A0 RETURN_NULL_IF_FAIL (struct_type->get_fields (), NULL, NULL, > > "NULL struct fields"); >=20 > "index" should either be unsigned, or we need to check here for >=3D 0. Fixed in the patch. >=20 > > +=C2=A0 RETURN_NULL_IF_FAIL (index < struct_type->get_fields ()->length > > (), NULL, > > +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0NULL, "NULL struct type"); > > +=C2=A0 return (gcc_jit_field *)struct_type->get_fields ()->get_field > > (index); > > +} >=20 > [...snip...] >=20 > > diff --git a/gcc/jit/libgccjit.h b/gcc/jit/libgccjit.h > > index 7134841bb07..db4ccffb41c 100644 > > --- a/gcc/jit/libgccjit.h > > +++ b/gcc/jit/libgccjit.h > > @@ -96,6 +96,12 @@ typedef struct gcc_jit_field gcc_jit_field; > > =C2=A0=C2=A0=C2=A0 the layout for, or an opaque type.=C2=A0 */ > > =C2=A0typedef struct gcc_jit_struct gcc_jit_struct; > > =C2=A0 > > +/* A gcc_jit_function_type encapsulates a function type.=C2=A0 */ > > +typedef struct gcc_jit_function_type gcc_jit_function_type; > > + > > +/* A gcc_jit_vector_type encapsulates a vector type.=C2=A0 */ > > +typedef struct gcc_jit_vector_type gcc_jit_vector_type; > > + >=20 > Please add these to the ASCII art inheritance diagram immediately > above: > =C2=A0 typedef struct gcc_jit_object gcc_jit_object; Done. >=20 > [...snip...] >=20 > > =C2=A0/* Unions work similarly to structs.=C2=A0 */ > > =C2=A0extern gcc_jit_type * > > =C2=A0gcc_jit_context_new_union_type (gcc_jit_context *ctxt, > > @@ -1518,6 +1533,78 @@ gcc_jit_version_minor (void); > > =C2=A0extern int > > =C2=A0gcc_jit_version_patchlevel (void); > > =C2=A0 > > +#define LIBGCCJIT_HAVE_REFLECTION > > + > > +/* Reflection functions to get the number of parameters, return > > type of > > +=C2=A0=C2=A0 a function and whether a type is a bool from the C API. > > + > > +=C2=A0=C2=A0 This API entrypoint was added in LIBGCCJIT_ABI_15; you ca= n test > > for its > > +=C2=A0=C2=A0 presence using > > +=C2=A0=C2=A0=C2=A0=C2=A0 #ifdef LIBGCCJIT_HAVE_REFLECTION > > +*/ > > +/* Get the return type of a function.=C2=A0 */ > > +extern gcc_jit_type * > > +gcc_jit_function_get_return_type (gcc_jit_function *func); > > + > > +/* Get the number of params of a function.=C2=A0 */ > > +extern ssize_t > > +gcc_jit_function_get_param_count (gcc_jit_function *func); >=20 > You're using ssize_t here, why?=C2=A0 Wouldn't size_t be better? > The count can't be negative. As explained aboved, it is to indicate an error. >=20 > Should we use size_t for indexes, rather than "int"? >=20 > (this happens in various places e.g. > gcc_jit_function_type_get_param_count and > gcc_jit_vector_type_get_num_units) >=20 > [...snip...] >=20 > > diff --git a/gcc/jit/libgccjit.map b/gcc/jit/libgccjit.map > > index a6e67e781a4..720b6ca286f 100644 > > --- a/gcc/jit/libgccjit.map > > +++ b/gcc/jit/libgccjit.map > > @@ -192,3 +192,24 @@ LIBGCCJIT_ABI_14 { > > =C2=A0=C2=A0 global: > > =C2=A0=C2=A0=C2=A0=C2=A0 gcc_jit_global_set_initializer; > > =C2=A0} LIBGCCJIT_ABI_13; > > + > > +LIBGCCJIT_ABI_15 { > > +=C2=A0 global: > > +=C2=A0=C2=A0=C2=A0 gcc_jit_function_get_return_type; > > +=C2=A0=C2=A0=C2=A0 gcc_jit_function_get_param_count; > > +=C2=A0=C2=A0=C2=A0 gcc_jit_function_type_get_return_type; > > +=C2=A0=C2=A0=C2=A0 gcc_jit_function_type_get_param_count; > > +=C2=A0=C2=A0=C2=A0 gcc_jit_function_type_get_param_type; > > +=C2=A0=C2=A0=C2=A0 gcc_jit_type_unqualified; > > +=C2=A0=C2=A0=C2=A0 gcc_jit_type_is_array; > > +=C2=A0=C2=A0=C2=A0 gcc_jit_type_is_bool; > > +=C2=A0=C2=A0=C2=A0 gcc_jit_type_is_function_ptr_type; > > +=C2=A0=C2=A0=C2=A0 gcc_jit_type_is_integral; > > +=C2=A0=C2=A0=C2=A0 gcc_jit_type_is_pointer; > > +=C2=A0=C2=A0=C2=A0 gcc_jit_type_is_vector; > > +=C2=A0=C2=A0=C2=A0 gcc_jit_vector_type_get_element_type; > > +=C2=A0=C2=A0=C2=A0 gcc_jit_vector_type_get_num_units; > > +=C2=A0=C2=A0=C2=A0 gcc_jit_struct_get_field; > > +=C2=A0=C2=A0=C2=A0 gcc_jit_type_is_struct; > > +=C2=A0=C2=A0=C2=A0 gcc_jit_struct_get_field_count; > > +} LIBGCCJIT_ABI_14; >=20 > As noted above, this will need to be LIBGCCJIT_ABI_16 as I used > LIBGCCJIT_ABI_15 for inline asm. Fixed. >=20 > [...snip...] >=20 > > diff --git a/gcc/testsuite/jit.dg/test-reflection.c > > b/gcc/testsuite/jit.dg/test-reflection.c > > new file mode 100644 > > index 00000000000..b3cf2942f3a > > --- /dev/null > > +++ b/gcc/testsuite/jit.dg/test-reflection.c > > @@ -0,0 +1,89 @@ > > +#include > > +#include > > + > > +#include "libgccjit.h" > > + > > +#include "harness.h" > > + > > +void > > +create_code (gcc_jit_context *ctxt, void *user_data) > > +{ > > +=C2=A0 /* Do nothing.=C2=A0 */ > > +} > > + > > +void > > +verify_code (gcc_jit_context *ctxt, gcc_jit_result *result) > > +{ > > +=C2=A0 /* Get the built-in functions.=C2=A0 */ > > +=C2=A0 gcc_jit_function *builtin_sin =3D > > +=C2=A0=C2=A0=C2=A0 gcc_jit_context_get_builtin_function (ctxt, "sin"); > > + > > +=C2=A0 CHECK_VALUE (gcc_jit_function_get_param_count(builtin_sin), 1); > > + > > +=C2=A0 gcc_jit_type *double_type =3D > > +=C2=A0=C2=A0=C2=A0 gcc_jit_context_get_type (ctxt, GCC_JIT_TYPE_DOUBLE= ); > > +=C2=A0 CHECK_VALUE (gcc_jit_function_get_return_type(builtin_sin), > > double_type); > > +=C2=A0 CHECK (!gcc_jit_type_is_integral(double_type)); > > + > > +=C2=A0 gcc_jit_type *bool_type =3D > > +=C2=A0=C2=A0=C2=A0 gcc_jit_context_get_type (ctxt, GCC_JIT_TYPE_BOOL); > > +=C2=A0 CHECK (gcc_jit_type_is_bool(bool_type)); > > +=C2=A0 CHECK (!gcc_jit_type_is_integral(bool_type)); > > + > > +=C2=A0 gcc_jit_type *aligned_bool_type =3D > > +=C2=A0=C2=A0=C2=A0 gcc_jit_type_get_aligned(gcc_jit_context_get_type (= ctxt, > > GCC_JIT_TYPE_BOOL), 8); > > +=C2=A0 CHECK (gcc_jit_type_is_bool(aligned_bool_type)); > > +=C2=A0 CHECK (bool_type !=3D aligned_bool_type); > > +=C2=A0 CHECK_VALUE (gcc_jit_type_unqualified(aligned_bool_type), > > bool_type); > > + > > +=C2=A0 CHECK_VALUE > > (gcc_jit_type_unqualified(gcc_jit_type_get_const(bool_type)), > > bool_type); > > +=C2=A0 CHECK_VALUE > > (gcc_jit_type_unqualified(gcc_jit_type_get_volatile(bool_type)), > > bool_type); > > + > > +=C2=A0 gcc_jit_type *int64 =3D > > +=C2=A0=C2=A0=C2=A0 gcc_jit_context_get_int_type(ctxt, 8, 1); > > +=C2=A0 CHECK (gcc_jit_type_is_integral(int64)); > > +=C2=A0 gcc_jit_type *uint64 =3D > > +=C2=A0=C2=A0=C2=A0 gcc_jit_context_get_int_type(ctxt, 8, 0); > > +=C2=A0 CHECK (gcc_jit_type_is_integral(uint64)); > > +=C2=A0 gcc_jit_type *int8 =3D > > +=C2=A0=C2=A0=C2=A0 gcc_jit_context_get_int_type(ctxt, 1, 1); > > +=C2=A0 CHECK (gcc_jit_type_is_integral(int8)); > > +=C2=A0 gcc_jit_type *uint8 =3D > > +=C2=A0=C2=A0=C2=A0 gcc_jit_context_get_int_type(ctxt, 1, 0); > > +=C2=A0 CHECK (gcc_jit_type_is_integral(uint8)); > > + > > +=C2=A0 CHECK (!gcc_jit_type_is_vector(double_type)); > > +=C2=A0 gcc_jit_type *vec_type =3D gcc_jit_type_get_vector (double_type= , > > 4); > > +=C2=A0 gcc_jit_vector_type *vector_type =3D > > gcc_jit_type_is_vector(vec_type); > > +=C2=A0 CHECK (vector_type); > > +=C2=A0 CHECK (vec_type !=3D double_type); > > +=C2=A0 CHECK_VALUE (gcc_jit_vector_type_get_element_type(vector_type), > > double_type); > > +=C2=A0 CHECK_VALUE (gcc_jit_vector_type_get_num_units(vector_type), 4)= ; > > + > > +=C2=A0 CHECK (!gcc_jit_type_is_pointer(double_type)); > > +=C2=A0 CHECK_VALUE > > (gcc_jit_type_is_pointer(gcc_jit_type_get_pointer(double_type)), > > double_type); > > + > > +=C2=A0 gcc_jit_type* params[2] =3D {int8, uint64}; > > +=C2=A0 gcc_jit_type *function_ptr_type =3D > > gcc_jit_context_new_function_ptr_type(ctxt, NULL, int64, 2, params, > > 0); > > +=C2=A0 gcc_jit_function_type *function_type =3D > > gcc_jit_type_is_function_ptr_type (function_ptr_type); > > +=C2=A0 CHECK (function_type); > > +=C2=A0 int param_count =3D > > gcc_jit_function_type_get_param_count(function_type); > > +=C2=A0 CHECK_VALUE (param_count, 2); > > +=C2=A0 gcc_jit_type *return_type =3D > > gcc_jit_function_type_get_return_type(function_type); > > +=C2=A0 CHECK_VALUE (return_type, int64); > > +=C2=A0 gcc_jit_type *param1 =3D > > gcc_jit_function_type_get_param_type(function_type, 0); > > +=C2=A0 CHECK_VALUE (param1, int8); > > +=C2=A0 gcc_jit_type *param2 =3D > > gcc_jit_function_type_get_param_type(function_type, 1); > > +=C2=A0 CHECK_VALUE (param2, uint64); > > + > > +=C2=A0 gcc_jit_field *field1 =3D gcc_jit_context_new_field (ctxt, NULL= , > > uint64, "field1"); > > +=C2=A0 gcc_jit_field *field2 =3D gcc_jit_context_new_field (ctxt, NULL= , > > double_type, "field2"); > > +=C2=A0 gcc_jit_field *fields[2] =3D { field1, field2 }; > > +=C2=A0 gcc_jit_struct *struct_type =3D gcc_jit_context_new_struct_type > > (ctxt, NULL, "testStruct", 2, fields); > > +=C2=A0 CHECK_VALUE (gcc_jit_struct_get_field_count(struct_type), 2); > > +=C2=A0 CHECK_VALUE (gcc_jit_struct_get_field(struct_type, 0), field1); > > +=C2=A0 CHECK_VALUE (gcc_jit_struct_get_field(struct_type, 1), field2); > > +=C2=A0 gcc_jit_struct *struct_ty =3D > > gcc_jit_type_is_struct(gcc_jit_struct_as_type(struct_type)); > > +=C2=A0 CHECK_VALUE (struct_ty, struct_type); >=20 >=20 > I think this is missing test coverage for the various > gcc_jit_type_is_* > entrypoints gracefully returning NULL when the type passed to them is > wrong (e.g. a non-struct type passed to gcc_jit_type_is_struct, etc) I added tests for those. >=20 > Hope this is constructive; sorry again about the delay in reviewing > it. > Dave >=20 >=20 --=-zcRM2rzc8XQu9QUjPBh9 Content-Disposition: attachment; filename*0=0001-This-patch-add-some-reflection-functions-in-the-jit-.pat; filename*1=ch Content-Type: text/x-patch; name="0001-This-patch-add-some-reflection-functions-in-the-jit-.patch"; charset="UTF-8" Content-Transfer-Encoding: base64 RnJvbSA2ZjJkMzdhNjdhZDlhZDcyZWFmM2YxN2Y0ZDIwYTViZTVhMDkzYWM0IE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBBbnRvbmkgQm91Y2hlciA8Ym91YW50b0B6b2hvLmNvbT4KRGF0 ZTogU2F0LCAxIEF1ZyAyMDIwIDE3OjUyOjE3IC0wNDAwClN1YmplY3Q6IFtQQVRDSF0gVGhpcyBw YXRjaCBhZGQgc29tZSByZWZsZWN0aW9uIGZ1bmN0aW9ucyBpbiB0aGUgaml0IEMgYXBpCiBbUFI5 Njg4OV0KCjIwMjAtMDktMSAgQW50b25pIEJvdWNoZXIgIDxib3VhbnRvQHpvaG8uY29tPgoKICAg IGdjYy9qaXQvCiAgICAgICAgICAgIFBSIHRhcmdldC85Njg4OQogICAgICAgICAgICAqIGRvY3Mv dG9waWNzL2NvbXBhdGliaWxpdHkucnN0IChMSUJHQ0NKSVRfQUJJXzE2KTogTmV3IEFCSSB0YWcu CiAgICAgICAgICAgICogZG9jcy90b3BpY3MvZnVuY3Rpb25zLnJzdDogQWRkIGRvY3VtZW50YXRp b24gZm9yIHRoZQogICAgICAgICAgICBmdW5jdGlvbnMgZ2NjX2ppdF9mdW5jdGlvbl9nZXRfcmV0 dXJuX3R5cGUgYW5kCiAgICAgICAgICAgIGdjY19qaXRfZnVuY3Rpb25fZ2V0X3BhcmFtX2NvdW50 CiAgICAgICAgICAgICogZG9jcy90b3BpY3MvdHlwZXMucnN0OiBBZGQgZG9jdW1lbnRhdGlvbiBm b3IgdGhlIGZ1bmN0aW9ucwogICAgICAgICAgICBnY2Nfaml0X2Z1bmN0aW9uX3R5cGVfZ2V0X3Jl dHVybl90eXBlLAogICAgICAgICAgICBnY2Nfaml0X2Z1bmN0aW9uX3R5cGVfZ2V0X3BhcmFtX2Nv dW50LAogICAgICAgICAgICBnY2Nfaml0X2Z1bmN0aW9uX3R5cGVfZ2V0X3BhcmFtX3R5cGUsCiAg ICAgICAgICAgIGdjY19qaXRfdHlwZV91bnF1YWxpZmllZCwgZ2NjX2ppdF90eXBlX2lzX2FycmF5 LAogICAgICAgICAgICBnY2Nfaml0X3R5cGVfaXNfYm9vbCwKICAgICAgICAgICAgZ2NjX2ppdF90 eXBlX2lzX2Z1bmN0aW9uX3B0cl90eXBlLAogICAgICAgICAgICBnY2Nfaml0X3R5cGVfaXNfaW50 ZWdyYWwsIGdjY19qaXRfdHlwZV9pc19wb2ludGVyLAogICAgICAgICAgICBnY2Nfaml0X3R5cGVf aXNfdmVjdG9yLAogICAgICAgICAgICBnY2Nfaml0X3ZlY3Rvcl90eXBlX2dldF9lbGVtZW50X3R5 cGUsCiAgICAgICAgICAgIGdjY19qaXRfdmVjdG9yX3R5cGVfZ2V0X251bV91bml0cywKICAgICAg ICAgICAgZ2NjX2ppdF9zdHJ1Y3RfZ2V0X2ZpZWxkLCBnY2Nfaml0X3R5cGVfaXNfc3RydWN0LAog ICAgICAgICAgICBhbmQgZ2NjX2ppdF9zdHJ1Y3RfZ2V0X2ZpZWxkX2NvdW50CiAgICAgICAgICAg ICogbGliZ2Njaml0LmM6CiAgICAgICAgICAgIChnY2Nfaml0X2Z1bmN0aW9uX2dldF9yZXR1cm5f dHlwZSwgZ2NjX2ppdF9mdW5jdGlvbl9nZXRfcGFyYW1fY291bnQsCiAgICAgICAgICAgIGdjY19q aXRfZnVuY3Rpb25fdHlwZV9nZXRfcmV0dXJuX3R5cGUsCiAgICAgICAgICAgIGdjY19qaXRfZnVu Y3Rpb25fdHlwZV9nZXRfcGFyYW1fY291bnQsCiAgICAgICAgICAgIGdjY19qaXRfZnVuY3Rpb25f dHlwZV9nZXRfcGFyYW1fdHlwZSwgZ2NjX2ppdF90eXBlX3VucXVhbGlmaWVkLAogICAgICAgICAg ICBnY2Nfaml0X3R5cGVfaXNfYXJyYXksIGdjY19qaXRfdHlwZV9pc19ib29sLAogICAgICAgICAg ICBnY2Nfaml0X3R5cGVfaXNfZnVuY3Rpb25fcHRyX3R5cGUsIGdjY19qaXRfdHlwZV9pc19pbnRl Z3JhbCwKICAgICAgICAgICAgZ2NjX2ppdF90eXBlX2lzX3BvaW50ZXIsIGdjY19qaXRfdHlwZV9p c192ZWN0b3IsCiAgICAgICAgICAgIGdjY19qaXRfdmVjdG9yX3R5cGVfZ2V0X2VsZW1lbnRfdHlw ZSwKICAgICAgICAgICAgZ2NjX2ppdF92ZWN0b3JfdHlwZV9nZXRfbnVtX3VuaXRzLCBnY2Nfaml0 X3N0cnVjdF9nZXRfZmllbGQsCiAgICAgICAgICAgIGdjY19qaXRfdHlwZV9pc19zdHJ1Y3QsIGdj Y19qaXRfc3RydWN0X2dldF9maWVsZF9jb3VudCk6IE5ldwogICAgICAgICAgICBmdW5jdGlvbnMu CiAgICAgICAgICAgIChzdHJ1Y3QgZ2NjX2ppdF9mdW5jdGlvbl90eXBlLCBzdHJ1Y3QgZ2NjX2pp dF92ZWN0b3JfdHlwZSk6CiAgICAgICAgICAgIE5ldyB0eXBlcy4KICAgICAgICAgICAgKiBsaWJn Y2NqaXQuaDoKICAgICAgICAgICAgKGdjY19qaXRfZnVuY3Rpb25fZ2V0X3JldHVybl90eXBlLCBn Y2Nfaml0X2Z1bmN0aW9uX2dldF9wYXJhbV9jb3VudCwKICAgICAgICAgICAgZ2NjX2ppdF9mdW5j dGlvbl90eXBlX2dldF9yZXR1cm5fdHlwZSwKICAgICAgICAgICAgZ2NjX2ppdF9mdW5jdGlvbl90 eXBlX2dldF9wYXJhbV9jb3VudCwKICAgICAgICAgICAgZ2NjX2ppdF9mdW5jdGlvbl90eXBlX2dl dF9wYXJhbV90eXBlLCBnY2Nfaml0X3R5cGVfdW5xdWFsaWZpZWQsCiAgICAgICAgICAgIGdjY19q aXRfdHlwZV9pc19hcnJheSwgZ2NjX2ppdF90eXBlX2lzX2Jvb2wsCiAgICAgICAgICAgIGdjY19q aXRfdHlwZV9pc19mdW5jdGlvbl9wdHJfdHlwZSwgZ2NjX2ppdF90eXBlX2lzX2ludGVncmFsLAog ICAgICAgICAgICBnY2Nfaml0X3R5cGVfaXNfcG9pbnRlciwgZ2NjX2ppdF90eXBlX2lzX3ZlY3Rv ciwKICAgICAgICAgICAgZ2NjX2ppdF92ZWN0b3JfdHlwZV9nZXRfZWxlbWVudF90eXBlLAogICAg ICAgICAgICBnY2Nfaml0X3ZlY3Rvcl90eXBlX2dldF9udW1fdW5pdHMsIGdjY19qaXRfc3RydWN0 X2dldF9maWVsZCwKICAgICAgICAgICAgZ2NjX2ppdF90eXBlX2lzX3N0cnVjdCwgZ2NjX2ppdF9z dHJ1Y3RfZ2V0X2ZpZWxkX2NvdW50KTogTmV3CiAgICAgICAgICAgIGZ1bmN0aW9uIGRlY2xhcmF0 aW9ucy4KICAgICAgICAgICAgKHN0cnVjdCBnY2Nfaml0X2Z1bmN0aW9uX3R5cGUsIHN0cnVjdCBn Y2Nfaml0X3ZlY3Rvcl90eXBlKToKICAgICAgICAgICAgTmV3IHR5cGVzLgogICAgICAgICAgICAq IGppdC1yZWNvcmRpbmcuaDogTmV3IGZ1bmN0aW9ucyAoaXNfc3RydWN0IGFuZCBpc192ZWN0b3Ip CiAgICAgICAgICAgICogbGliZ2Njaml0Lm1hcCAoTElCR0NDSklUX0FCSV8xNik6IE5ldyBBQkkg dGFnLgoKICAgIGdjYy90ZXN0c3VpdGUvCiAgICAgICAgICAgIFBSIHRhcmdldC85Njg4OQogICAg ICAgICAgICAqIGppdC5kZy9hbGwtbm9uLWZhaWxpbmctdGVzdHMuaDogQWRkIHRlc3QtcmVmbGVj dGlvbi5jLgogICAgICAgICAgICAqIGppdC5kZy90ZXN0LXJlZmxlY3Rpb24uYzogTmV3IHRlc3Qu Ci0tLQogZ2NjL2ppdC9kb2NzL3RvcGljcy9jb21wYXRpYmlsaXR5LnJzdCAgICAgICAgfCAgNDMg KysrLQogZ2NjL2ppdC9kb2NzL3RvcGljcy9mdW5jdGlvbnMucnN0ICAgICAgICAgICAgfCAgMjYg KysKIGdjYy9qaXQvZG9jcy90b3BpY3MvdHlwZXMucnN0ICAgICAgICAgICAgICAgIHwgMTIyICsr KysrKysrKwogZ2NjL2ppdC9qaXQtcmVjb3JkaW5nLmggICAgICAgICAgICAgICAgICAgICAgfCAg IDcgKwogZ2NjL2ppdC9saWJnY2NqaXQuYyAgICAgICAgICAgICAgICAgICAgICAgICAgfCAyNTYg KysrKysrKysrKysrKysrKysrKwogZ2NjL2ppdC9saWJnY2NqaXQuaCAgICAgICAgICAgICAgICAg ICAgICAgICAgfCAgODkgKysrKysrKwogZ2NjL2ppdC9saWJnY2NqaXQubWFwICAgICAgICAgICAg ICAgICAgICAgICAgfCAgMjEgKysKIGdjYy90ZXN0c3VpdGUvaml0LmRnL2FsbC1ub24tZmFpbGlu Zy10ZXN0cy5oIHwgIDEwICsKIGdjYy90ZXN0c3VpdGUvaml0LmRnL3Rlc3QtcmVmbGVjdGlvbi5j ICAgICAgIHwgIDk1ICsrKysrKysKIDkgZmlsZXMgY2hhbmdlZCwgNjY4IGluc2VydGlvbnMoKyks IDEgZGVsZXRpb24oLSkKIGNyZWF0ZSBtb2RlIDEwMDY0NCBnY2MvdGVzdHN1aXRlL2ppdC5kZy90 ZXN0LXJlZmxlY3Rpb24uYwoKZGlmZiAtLWdpdCBhL2djYy9qaXQvZG9jcy90b3BpY3MvY29tcGF0 aWJpbGl0eS5yc3QgYi9nY2Mvaml0L2RvY3MvdG9waWNzL2NvbXBhdGliaWxpdHkucnN0CmluZGV4 IDIzOWI2YWExYTkyLi5jZWM0MGNhNTA4YyAxMDA2NDQKLS0tIGEvZ2NjL2ppdC9kb2NzL3RvcGlj cy9jb21wYXRpYmlsaXR5LnJzdAorKysgYi9nY2Mvaml0L2RvY3MvdG9waWNzL2NvbXBhdGliaWxp dHkucnN0CkBAIC0yMzAsNyArMjMwLDcgQEAgZW50cnlwb2ludHM6CiAuLiBfTElCR0NDSklUX0FC SV8xNToKIAogYGBMSUJHQ0NKSVRfQUJJXzE1YGAKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCist LS0tLS0tLS0tLS0tLS0tLS0tLQogYGBMSUJHQ0NKSVRfQUJJXzE1YGAgY292ZXJzIHRoZSBhZGRp dGlvbiBvZiBBUEkgZW50cnlwb2ludHMgZm9yIGRpcmVjdGx5CiBlbWJlZGRpbmcgYXNzZW1ibGVy IGluc3RydWN0aW9uczoKIApAQCAtMjQzLDMgKzI0Myw0NCBAQCBlbWJlZGRpbmcgYXNzZW1ibGVy IGluc3RydWN0aW9uczoKICAgKiA6ZnVuYzpgZ2NjX2ppdF9leHRlbmRlZF9hc21fYWRkX2lucHV0 X29wZXJhbmRgCiAgICogOmZ1bmM6YGdjY19qaXRfZXh0ZW5kZWRfYXNtX2FkZF9jbG9iYmVyYAog ICAqIDpmdW5jOmBnY2Nfaml0X2NvbnRleHRfYWRkX3RvcF9sZXZlbF9hc21gCisKKy4uIF9MSUJH Q0NKSVRfQUJJXzE2OgorCitgYExJQkdDQ0pJVF9BQklfMTZgYAorLS0tLS0tLS0tLS0tLS0tLS0t LS0KK2BgTElCR0NDSklUX0FCSV8xNmBgIGNvdmVycyB0aGUgYWRkaXRpb24gb2YgcmVmbGVjdGlv biBmdW5jdGlvbnMgdmlhIEFQSQorZW50cnlwb2ludHM6CisKKyAgKiA6ZnVuYzpgZ2NjX2ppdF9m dW5jdGlvbl9nZXRfcmV0dXJuX3R5cGVgCisKKyAgKiA6ZnVuYzpgZ2NjX2ppdF9mdW5jdGlvbl9n ZXRfcGFyYW1fY291bnRgCisKKyAgKiA6ZnVuYzpgZ2NjX2ppdF90eXBlX2lzX2FycmF5YAorCisg ICogOmZ1bmM6YGdjY19qaXRfdHlwZV9pc19ib29sYAorCisgICogOmZ1bmM6YGdjY19qaXRfdHlw ZV9pc19pbnRlZ3JhbGAKKworICAqIDpmdW5jOmBnY2Nfaml0X3R5cGVfaXNfcG9pbnRlcmAKKwor ICAqIDpmdW5jOmBnY2Nfaml0X3R5cGVfaXNfc3RydWN0YAorCisgICogOmZ1bmM6YGdjY19qaXRf dHlwZV9pc192ZWN0b3JgCisKKyAgKiA6ZnVuYzpgZ2NjX2ppdF90eXBlX3VucXVhbGlmaWVkYAor CisgICogOmZ1bmM6YGdjY19qaXRfdHlwZV9pc19mdW5jdGlvbl9wdHJfdHlwZWAKKworICAqIDpm dW5jOmBnY2Nfaml0X2Z1bmN0aW9uX3R5cGVfZ2V0X3JldHVybl90eXBlYAorCisgICogOmZ1bmM6 YGdjY19qaXRfZnVuY3Rpb25fdHlwZV9nZXRfcGFyYW1fY291bnRgCisKKyAgKiA6ZnVuYzpgZ2Nj X2ppdF9mdW5jdGlvbl90eXBlX2dldF9wYXJhbV90eXBlYAorCisgICogOmZ1bmM6YGdjY19qaXRf dmVjdG9yX3R5cGVfZ2V0X251bV91bml0c2AKKworICAqIDpmdW5jOmBnY2Nfaml0X3ZlY3Rvcl90 eXBlX2dldF9lbGVtZW50X3R5cGVgCisKKyAgKiA6ZnVuYzpgZ2NjX2ppdF9zdHJ1Y3RfZ2V0X2Zp ZWxkYAorCisgICogOmZ1bmM6YGdjY19qaXRfc3RydWN0X2dldF9maWVsZF9jb3VudGAKZGlmZiAt LWdpdCBhL2djYy9qaXQvZG9jcy90b3BpY3MvZnVuY3Rpb25zLnJzdCBiL2djYy9qaXQvZG9jcy90 b3BpY3MvZnVuY3Rpb25zLnJzdAppbmRleCBiMmQ5MjM5YWEwYS4uOTUwZGE0ZTVhNzYgMTAwNjQ0 Ci0tLSBhL2djYy9qaXQvZG9jcy90b3BpY3MvZnVuY3Rpb25zLnJzdAorKysgYi9nY2Mvaml0L2Rv Y3MvdG9waWNzL2Z1bmN0aW9ucy5yc3QKQEAgLTE3MSw2ICsxNzEsMzIgQEAgRnVuY3Rpb25zCiAg ICB1bmRlcmx5aW5nIHN0cmluZywgc28gaXQgaXMgdmFsaWQgdG8gcGFzcyBpbiBhIHBvaW50ZXIg dG8gYW4gb24tc3RhY2sKICAgIGJ1ZmZlci4KIAorLi4gZnVuY3Rpb246OiAgc3NpemVfdCBcCisg ICAgICAgICAgICAgICBnY2Nfaml0X2Z1bmN0aW9uX2dldF9wYXJhbV9jb3VudCAoZ2NjX2ppdF9m dW5jdGlvbiAqZnVuYykKKworICAgR2V0IHRoZSBudW1iZXIgb2YgcGFyYW1ldGVycyBvZiB0aGUg ZnVuY3Rpb24uCisKKy4uIGZ1bmN0aW9uOjogIGdjY19qaXRfdHlwZSAqXAorICAgICAgICAgICAg ICAgZ2NjX2ppdF9mdW5jdGlvbl9nZXRfcmV0dXJuX3R5cGUgKGdjY19qaXRfZnVuY3Rpb24gKmZ1 bmMpCisKKyAgIEdldCB0aGUgcmV0dXJuIHR5cGUgb2YgdGhlIGZ1bmN0aW9uLgorCisgICBUaGUg QVBJIGVudHJ5cG9pbnRzIHJlbGF0aW5nIHRvIGdldHRpbmcgaW5mbyBhYm91dCBwYXJhbWV0ZXJz IGFuZCByZXR1cm4KKyAgIHR5cGVzOgorCisgICAgICAqIDpjOmZ1bmM6YGdjY19qaXRfZnVuY3Rp b25fZ2V0X3JldHVybl90eXBlYAorCisgICAgICAqIDpjOmZ1bmM6YGdjY19qaXRfZnVuY3Rpb25f Z2V0X3BhcmFtX2NvdW50YAorCisgICB3ZXJlIGFkZGVkIGluIDpyZWY6YExJQkdDQ0pJVF9BQklf MTVgOyB5b3UgY2FuIHRlc3QgZm9yIHRoZWlyIHByZXNlbmNlCisgICB1c2luZworCisgICAuLiBj b2RlLWJsb2NrOjogYworCisgICAgICAjaWZkZWYgTElCR0NDSklUX0hBVkVfUkVGTEVDVElPTgor CisgICAuLiB0eXBlOjogZ2NjX2ppdF9jYXNlCisKIEJsb2NrcwogLS0tLS0tCiAuLiB0eXBlOjog Z2NjX2ppdF9ibG9jawpkaWZmIC0tZ2l0IGEvZ2NjL2ppdC9kb2NzL3RvcGljcy90eXBlcy5yc3Qg Yi9nY2Mvaml0L2RvY3MvdG9waWNzL3R5cGVzLnJzdAppbmRleCA4MzFmMTFiNjc5YS4uNzNjZGNh MTFjM2IgMTAwNjQ0Ci0tLSBhL2djYy9qaXQvZG9jcy90b3BpY3MvdHlwZXMucnN0CisrKyBiL2dj Yy9qaXQvZG9jcy90b3BpY3MvdHlwZXMucnN0CkBAIC0zNDUsMyArMzQ1LDEyNSBAQCBGdW5jdGlv biBwb2ludGVyIHR5cGVzCiAKIEZ1bmN0aW9uIHBvaW50ZXIgdHlwZXMgY2FuIGJlIGNyZWF0ZWQg dXNpbmcKIDpjOmZ1bmM6YGdjY19qaXRfY29udGV4dF9uZXdfZnVuY3Rpb25fcHRyX3R5cGVgLgor CitSZWZsZWN0aW9uIEFQSQorLS0tLS0tLS0tLS0tLS0KKworLi4gZnVuY3Rpb246OiAgZ2NjX2pp dF90eXBlICpcCisgICAgICAgICAgICAgICBnY2Nfaml0X3R5cGVfaXNfYXJyYXkgKGdjY19qaXRf dHlwZSAqdHlwZSkKKworICAgICBHZXQgdGhlIGVsZW1lbnQgdHlwZSBvZiBhbiBhcnJheSB0eXBl IG9yIE5VTEwgaWYgaXQncyBub3QgYW4gYXJyYXkuCisKKy4uIGZ1bmN0aW9uOjogIGludFwKKyAg ICAgICAgICAgICAgIGdjY19qaXRfdHlwZV9pc19ib29sIChnY2Nfaml0X3R5cGUgKnR5cGUpCisK KyAgICAgUmV0dXJuIG5vbi16ZXJvIGlmIHRoZSB0eXBlIGlzIGEgYm9vbC4KKworLi4gZnVuY3Rp b246OiAgZ2NjX2ppdF9mdW5jdGlvbl90eXBlICpcCisgICAgICAgICAgICAgICBnY2Nfaml0X3R5 cGVfaXNfZnVuY3Rpb25fcHRyX3R5cGUgKGdjY19qaXRfdHlwZSAqdHlwZSkKKworICAgICBSZXR1 cm4gdGhlIGZ1bmN0aW9uIHR5cGUgaWYgaXQgaXMgb25lIG9yIE5VTEwuCisKKy4uIGZ1bmN0aW9u OjogIGdjY19qaXRfdHlwZSAqXAorICAgICAgICAgICAgICAgZ2NjX2ppdF9mdW5jdGlvbl90eXBl X2dldF9yZXR1cm5fdHlwZSAoZ2NjX2ppdF9mdW5jdGlvbl90eXBlICpmdW5jdGlvbl90eXBlKQor CisgICAgIEdpdmVuIGEgZnVuY3Rpb24gdHlwZSwgcmV0dXJuIGl0cyByZXR1cm4gdHlwZS4KKwor Li4gZnVuY3Rpb246OiAgc3NpemVfdFwKKyAgICAgICAgICAgICAgIGdjY19qaXRfZnVuY3Rpb25f dHlwZV9nZXRfcGFyYW1fY291bnQgKGdjY19qaXRfZnVuY3Rpb25fdHlwZSAqZnVuY3Rpb25fdHlw ZSkKKworICAgICBHaXZlbiBhIGZ1bmN0aW9uIHR5cGUsIHJldHVybiBpdHMgbnVtYmVyIG9mIHBh cmFtZXRlcnMuCisKKy4uIGZ1bmN0aW9uOjogIGdjY19qaXRfdHlwZSAqXAorICAgICAgICAgICAg ICAgZ2NjX2ppdF9mdW5jdGlvbl90eXBlX2dldF9wYXJhbV90eXBlIChnY2Nfaml0X2Z1bmN0aW9u X3R5cGUgKmZ1bmN0aW9uX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgIHNpemVfdCBpbmRleCkKKworICAgICBHaXZlbiBhIGZ1bmN0aW9u IHR5cGUsIHJldHVybiB0aGUgdHlwZSBvZiB0aGUgc3BlY2lmaWVkIHBhcmFtZXRlci4KKworLi4g ZnVuY3Rpb246OiAgaW50XAorICAgICAgICAgICAgICAgZ2NjX2ppdF90eXBlX2lzX2ludGVncmFs IChnY2Nfaml0X3R5cGUgKnR5cGUpCisKKyAgICAgUmV0dXJuIG5vbi16ZXJvIGlmIHRoZSB0eXBl IGlzIGFuIGludGVncmFsLgorCisuLiBmdW5jdGlvbjo6ICBnY2Nfaml0X3R5cGUgKlwKKyAgICAg ICAgICAgICAgIGdjY19qaXRfdHlwZV9pc19wb2ludGVyIChnY2Nfaml0X3R5cGUgKnR5cGUpCisK KyAgICAgUmV0dXJuIHRoZSB0eXBlIHBvaW50ZWQgYnkgdGhlIHBvaW50ZXIgdHlwZSBvciBOVUxM IGlmIGl0J3Mgbm90IGEgcG9pbnRlci4KKworLi4gZnVuY3Rpb246OiAgZ2NjX2ppdF92ZWN0b3Jf dHlwZSAqXAorICAgICAgICAgICAgICAgZ2NjX2ppdF90eXBlX2lzX3ZlY3RvciAoZ2NjX2ppdF90 eXBlICp0eXBlKQorCisgICAgIEdpdmVuIGEgdHlwZSwgcmV0dXJuIGEgZHluYW1pYyBjYXN0IHRv IGEgdmVjdG9yIHR5cGUgb3IgTlVMTC4KKworLi4gZnVuY3Rpb246OiAgZ2NjX2ppdF9zdHJ1Y3Qg KlwKKyAgICAgICAgICAgICAgIGdjY19qaXRfdHlwZV9pc19zdHJ1Y3QgKGdjY19qaXRfdHlwZSAq dHlwZSkKKworICAgICBHaXZlbiBhIHR5cGUsIHJldHVybiBhIGR5bmFtaWMgY2FzdCB0byBhIHN0 cnVjdCB0eXBlIG9yIE5VTEwuCisKKy4uIGZ1bmN0aW9uOjogIHNzaXplX3RcCisgICAgICAgICAg ICAgICBnY2Nfaml0X3ZlY3Rvcl90eXBlX2dldF9udW1fdW5pdHMgKGdjY19qaXRfdmVjdG9yX3R5 cGUgKnZlY3Rvcl90eXBlKQorCisgICAgIEdpdmVuIGEgdmVjdG9yIHR5cGUsIHJldHVybiB0aGUg bnVtYmVyIG9mIHVuaXRzIGl0IGNvbnRhaW5zLgorCisuLiBmdW5jdGlvbjo6ICBnY2Nfaml0X3R5 cGUgKlwKKyAgICAgICAgICAgICAgIGdjY19qaXRfdmVjdG9yX3R5cGVfZ2V0X2VsZW1lbnRfdHlw ZSAoZ2NjX2ppdF92ZWN0b3JfdHlwZSAqIHZlY3Rvcl90eXBlKQorCisgICAgIEdpdmVuIGEgdmVj dG9yIHR5cGUsIHJldHVybiB0aGUgdHlwZSBvZiBpdHMgZWxlbWVudHMuCisKKy4uIGZ1bmN0aW9u OjogIGdjY19qaXRfdHlwZSAqXAorICAgICAgICAgICAgICAgZ2NjX2ppdF90eXBlX3VucXVhbGlm aWVkIChnY2Nfaml0X3R5cGUgKnR5cGUpCisKKyAgICAgR2l2ZW4gYSB0eXBlLCByZXR1cm4gdGhl IHVucXVhbGlmaWVkIHR5cGUsIHJlbW92aW5nICJjb25zdCIsICJ2b2xhdGlsZSIgYW5kCisgICAg IGFsaWdubWVudCBxdWFsaWZpZXJzLgorCisuLiBmdW5jdGlvbjo6ICBnY2Nfaml0X2ZpZWxkICpc CisgICAgICAgICAgICAgICBnY2Nfaml0X3N0cnVjdF9nZXRfZmllbGQgKGdjY19qaXRfc3RydWN0 ICpzdHJ1Y3RfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg c2l6ZV90IGluZGV4KQorCisgICAgIEdldCBhIHN0cnVjdCBmaWVsZCBieSBpbmRleC4KKworLi4g ZnVuY3Rpb246OiAgc3NpemVfdFwKKyAgICAgICAgICAgICAgIGdjY19qaXRfc3RydWN0X2dldF9m aWVsZF9jb3VudCAoZ2NjX2ppdF9zdHJ1Y3QgKnN0cnVjdF90eXBlKQorCisgICAgIEdldCB0aGUg bnVtYmVyIG9mIGZpZWxkcyBpbiB0aGUgc3RydWN0LgorCisgICBUaGUgQVBJIGVudHJ5cG9pbnRz IHJlbGF0ZWQgdG8gdGhlIHJlZmxlY3Rpb24gQVBJOgorCisgICAgICAqIDpjOmZ1bmM6YGdjY19q aXRfZnVuY3Rpb25fdHlwZV9nZXRfcmV0dXJuX3R5cGVgCisKKyAgICAgICogOmM6ZnVuYzpgZ2Nj X2ppdF9mdW5jdGlvbl90eXBlX2dldF9wYXJhbV9jb3VudGAKKworICAgICAgKiA6YzpmdW5jOmBn Y2Nfaml0X2Z1bmN0aW9uX3R5cGVfZ2V0X3BhcmFtX3R5cGVgCisKKyAgICAgICogOmM6ZnVuYzpg Z2NjX2ppdF90eXBlX3VucXVhbGlmaWVkYAorCisgICAgICAqIDpjOmZ1bmM6YGdjY19qaXRfdHlw ZV9pc19hcnJheWAKKworICAgICAgKiA6YzpmdW5jOmBnY2Nfaml0X3R5cGVfaXNfYm9vbGAKKwor ICAgICAgKiA6YzpmdW5jOmBnY2Nfaml0X3R5cGVfaXNfZnVuY3Rpb25fcHRyX3R5cGVgCisKKyAg ICAgICogOmM6ZnVuYzpgZ2NjX2ppdF90eXBlX2lzX2ludGVncmFsYAorCisgICAgICAqIDpjOmZ1 bmM6YGdjY19qaXRfdHlwZV9pc19wb2ludGVyYAorCisgICAgICAqIDpjOmZ1bmM6YGdjY19qaXRf dHlwZV9pc192ZWN0b3JgCisKKyAgICAgICogOmM6ZnVuYzpgZ2NjX2ppdF92ZWN0b3JfdHlwZV9n ZXRfZWxlbWVudF90eXBlYAorCisgICAgICAqIDpjOmZ1bmM6YGdjY19qaXRfdmVjdG9yX3R5cGVf Z2V0X251bV91bml0c2AKKworICAgICAgKiA6YzpmdW5jOmBnY2Nfaml0X3N0cnVjdF9nZXRfZmll bGRgCisKKyAgICAgICogOmM6ZnVuYzpgZ2NjX2ppdF90eXBlX2lzX3N0cnVjdGAKKworICAgICAg KiA6YzpmdW5jOmBnY2Nfaml0X3N0cnVjdF9nZXRfZmllbGRfY291bnRgCisKKyAgIHdlcmUgYWRk ZWQgaW4gOnJlZjpgTElCR0NDSklUX0FCSV8xNWA7IHlvdSBjYW4gdGVzdCBmb3IgdGhlaXIgcHJl c2VuY2UKKyAgIHVzaW5nCisKKyAgIC4uIGNvZGUtYmxvY2s6OiBjCisKKyAgICAgICNpZmRlZiBM SUJHQ0NKSVRfSEFWRV9SRUZMRUNUSU9OCisKKyAgIC4uIHR5cGU6OiBnY2Nfaml0X2Nhc2UKZGlm ZiAtLWdpdCBhL2djYy9qaXQvaml0LXJlY29yZGluZy5oIGIvZ2NjL2ppdC9qaXQtcmVjb3JkaW5n LmgKaW5kZXggMDNmYTExNjBjZjAuLjRhOTk0ZmU3MDk0IDEwMDY0NAotLS0gYS9nY2Mvaml0L2pp dC1yZWNvcmRpbmcuaAorKysgYi9nY2Mvaml0L2ppdC1yZWNvcmRpbmcuaApAQCAtNTQ2LDcgKzU0 Niw5IEBAIHB1YmxpYzoKICAgdmlydHVhbCBib29sIGlzX2Jvb2wgKCkgY29uc3QgPSAwOwogICB2 aXJ0dWFsIHR5cGUgKmlzX3BvaW50ZXIgKCkgPSAwOwogICB2aXJ0dWFsIHR5cGUgKmlzX2FycmF5 ICgpID0gMDsKKyAgdmlydHVhbCBzdHJ1Y3RfICppc19zdHJ1Y3QgKCkgeyByZXR1cm4gTlVMTDsg fQogICB2aXJ0dWFsIGJvb2wgaXNfdm9pZCAoKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQorICB2 aXJ0dWFsIHZlY3Rvcl90eXBlICppc192ZWN0b3IgKCkgeyByZXR1cm4gTlVMTDsgfQogICB2aXJ0 dWFsIGJvb2wgaGFzX2tub3duX3NpemUgKCkgY29uc3QgeyByZXR1cm4gdHJ1ZTsgfQogCiAgIGJv b2wgaXNfbnVtZXJpYyAoKSBjb25zdApAQCAtNjYzLDYgKzY2NSw3IEBAIHB1YmxpYzoKICAgYm9v bCBpc19ib29sICgpIGNvbnN0IEZJTkFMIE9WRVJSSURFIHsgcmV0dXJuIG1fb3RoZXJfdHlwZS0+ aXNfYm9vbCAoKTsgfQogICB0eXBlICppc19wb2ludGVyICgpIEZJTkFMIE9WRVJSSURFIHsgcmV0 dXJuIG1fb3RoZXJfdHlwZS0+aXNfcG9pbnRlciAoKTsgfQogICB0eXBlICppc19hcnJheSAoKSBG SU5BTCBPVkVSUklERSB7IHJldHVybiBtX290aGVyX3R5cGUtPmlzX2FycmF5ICgpOyB9CisgIHN0 cnVjdF8gKmlzX3N0cnVjdCAoKSBGSU5BTCBPVkVSUklERSB7IHJldHVybiBtX290aGVyX3R5cGUt PmlzX3N0cnVjdCAoKTsgfQogCiBwcm90ZWN0ZWQ6CiAgIHR5cGUgKm1fb3RoZXJfdHlwZTsKQEAg LTc0NSw2ICs3NDgsOCBAQCBwdWJsaWM6CiAKICAgdm9pZCByZXBsYXlfaW50byAocmVwbGF5ZXIg KikgRklOQUwgT1ZFUlJJREU7CiAKKyAgdmVjdG9yX3R5cGUgKmlzX3ZlY3RvciAoKSBGSU5BTCBP VkVSUklERSB7IHJldHVybiB0aGlzOyB9CisKIHByaXZhdGU6CiAgIHN0cmluZyAqIG1ha2VfZGVi dWdfc3RyaW5nICgpIEZJTkFMIE9WRVJSSURFOwogICB2b2lkIHdyaXRlX3JlcHJvZHVjZXIgKHJl cHJvZHVjZXIgJnIpIEZJTkFMIE9WRVJSSURFOwpAQCAtOTUxLDYgKzk1Niw4IEBAIHB1YmxpYzoK IAogICBjb25zdCBjaGFyICphY2Nlc3NfYXNfdHlwZSAocmVwcm9kdWNlciAmcikgRklOQUwgT1ZF UlJJREU7CiAKKyAgc3RydWN0XyAqaXNfc3RydWN0ICgpIEZJTkFMIE9WRVJSSURFIHsgcmV0dXJu IHRoaXM7IH0KKwogcHJpdmF0ZToKICAgc3RyaW5nICogbWFrZV9kZWJ1Z19zdHJpbmcgKCkgRklO QUwgT1ZFUlJJREU7CiAgIHZvaWQgd3JpdGVfcmVwcm9kdWNlciAocmVwcm9kdWNlciAmcikgRklO QUwgT1ZFUlJJREU7CmRpZmYgLS1naXQgYS9nY2Mvaml0L2xpYmdjY2ppdC5jIGIvZ2NjL2ppdC9s aWJnY2NqaXQuYwppbmRleCAwY2M2NTBmOTgxMC4uYjBjYmQzYTJiNmEgMTAwNjQ0Ci0tLSBhL2dj Yy9qaXQvbGliZ2Njaml0LmMKKysrIGIvZ2NjL2ppdC9saWJnY2NqaXQuYwpAQCAtNjAsNiArNjAs MTQgQEAgc3RydWN0IGdjY19qaXRfc3RydWN0IDogcHVibGljIGdjYzo6aml0OjpyZWNvcmRpbmc6 OnN0cnVjdF8KIHsKIH07CiAKK3N0cnVjdCBnY2Nfaml0X2Z1bmN0aW9uX3R5cGUgOiBwdWJsaWMg Z2NjOjpqaXQ6OnJlY29yZGluZzo6ZnVuY3Rpb25fdHlwZQoreworfTsKKworc3RydWN0IGdjY19q aXRfdmVjdG9yX3R5cGUgOiBwdWJsaWMgZ2NjOjpqaXQ6OnJlY29yZGluZzo6dmVjdG9yX3R5cGUK K3sKK307CisKIHN0cnVjdCBnY2Nfaml0X2ZpZWxkIDogcHVibGljIGdjYzo6aml0OjpyZWNvcmRp bmc6OmZpZWxkCiB7CiB9OwpAQCAtNTE1LDYgKzUyMywxOTQgQEAgZ2NjX2ppdF90eXBlX2dldF92 b2xhdGlsZSAoZ2NjX2ppdF90eXBlICp0eXBlKQogICByZXR1cm4gKGdjY19qaXRfdHlwZSAqKXR5 cGUtPmdldF92b2xhdGlsZSAoKTsKIH0KIAorLyogUHVibGljIGVudHJ5cG9pbnQuICBTZWUgZGVz Y3JpcHRpb24gaW4gbGliZ2Njaml0LmguCisKKyAgIEFmdGVyIGVycm9yLWNoZWNraW5nLCB0aGUg cmVhbCB3b3JrIGlzIGRvbmUgYnkgdGhlCisgICBnY2M6OmppdDo6cmVjb3JkaW5nOjp0eXBlOjpp c19hcnJheSBtZXRob2QsIGluCisgICBqaXQtcmVjb3JkaW5nLmMuICAqLworCitnY2Nfaml0X3R5 cGUgKgorZ2NjX2ppdF90eXBlX2lzX2FycmF5IChnY2Nfaml0X3R5cGUgKnR5cGUpCit7CisgIFJF VFVSTl9OVUxMX0lGX0ZBSUwgKHR5cGUsIE5VTEwsIE5VTEwsICJOVUxMIHR5cGUiKTsKKworICBy ZXR1cm4gKGdjY19qaXRfdHlwZSAqKXR5cGUtPmlzX2FycmF5ICgpOworfQorCisvKiBQdWJsaWMg ZW50cnlwb2ludC4gIFNlZSBkZXNjcmlwdGlvbiBpbiBsaWJnY2NqaXQuaC4KKworICAgQWZ0ZXIg ZXJyb3ItY2hlY2tpbmcsIHRoZSByZWFsIHdvcmsgaXMgZG9uZSBieSB0aGUKKyAgIGdjYzo6aml0 OjpyZWNvcmRpbmc6OnR5cGU6OmlzX2Jvb2wgbWV0aG9kLCBpbgorICAgaml0LXJlY29yZGluZy5j LiAgKi8KKworaW50CitnY2Nfaml0X3R5cGVfaXNfYm9vbCAoZ2NjX2ppdF90eXBlICp0eXBlKQor eworICBSRVRVUk5fVkFMX0lGX0ZBSUwgKHR5cGUsIEZBTFNFLCBOVUxMLCBOVUxMLCAiTlVMTCB0 eXBlIik7CisKKyAgcmV0dXJuIHR5cGUtPmlzX2Jvb2wgKCk7Cit9CisKKy8qIFB1YmxpYyBlbnRy eXBvaW50LiAgU2VlIGRlc2NyaXB0aW9uIGluIGxpYmdjY2ppdC5oLgorCisgICBBZnRlciBlcnJv ci1jaGVja2luZywgdGhlIHJlYWwgd29yayBpcyBkb25lIGJ5IHRoZQorICAgZ2NjOjpqaXQ6OnJl Y29yZGluZzo6dHlwZTo6aXNfcG9pbnRlciBtZXRob2QsIGluCisgICBqaXQtcmVjb3JkaW5nLmMu ICAqLworCitnY2Nfaml0X3R5cGUgKgorZ2NjX2ppdF90eXBlX2lzX3BvaW50ZXIgKGdjY19qaXRf dHlwZSAqdHlwZSkKK3sKKyAgUkVUVVJOX05VTExfSUZfRkFJTCAodHlwZSwgTlVMTCwgTlVMTCwg Ik5VTEwgdHlwZSIpOworCisgIHJldHVybiAoZ2NjX2ppdF90eXBlICopdHlwZS0+aXNfcG9pbnRl ciAoKTsKK30KKworLyogUHVibGljIGVudHJ5cG9pbnQuICBTZWUgZGVzY3JpcHRpb24gaW4gbGli Z2Njaml0LmguCisKKyAgIEFmdGVyIGVycm9yLWNoZWNraW5nLCB0aGUgcmVhbCB3b3JrIGlzIGRv bmUgYnkgdGhlCisgICBnY2M6OmppdDo6cmVjb3JkaW5nOjp0eXBlOjppc19pbnQgbWV0aG9kLCBp bgorICAgaml0LXJlY29yZGluZy5jLiAgKi8KKworaW50CitnY2Nfaml0X3R5cGVfaXNfaW50ZWdy YWwgKGdjY19qaXRfdHlwZSAqdHlwZSkKK3sKKyAgUkVUVVJOX1ZBTF9JRl9GQUlMICh0eXBlLCBG QUxTRSwgTlVMTCwgTlVMTCwgIk5VTEwgdHlwZSIpOworCisgIHJldHVybiB0eXBlLT5pc19pbnQg KCk7Cit9CisKKy8qIFB1YmxpYyBlbnRyeXBvaW50LiAgU2VlIGRlc2NyaXB0aW9uIGluIGxpYmdj Y2ppdC5oLgorCisgICBBZnRlciBlcnJvci1jaGVja2luZywgdGhlIHJlYWwgd29yayBpcyBkb25l IGJ5IHRoZQorICAgZ2NjOjpqaXQ6OnJlY29yZGluZzo6dHlwZTo6aXNfdmVjdG9yIG1ldGhvZCwg aW4KKyAgIGppdC1yZWNvcmRpbmcuYy4gICovCisKK2djY19qaXRfdmVjdG9yX3R5cGUgKgorZ2Nj X2ppdF90eXBlX2lzX3ZlY3RvciAoZ2NjX2ppdF90eXBlICp0eXBlKQoreworICBSRVRVUk5fTlVM TF9JRl9GQUlMICh0eXBlLCBOVUxMLCBOVUxMLCAiTlVMTCB0eXBlIik7CisgIGdjYzo6aml0Ojpy ZWNvcmRpbmc6OnZlY3Rvcl90eXBlICp2ZWN0b3JfdHlwZSA9IHR5cGUtPmlzX3ZlY3RvciAoKTsK KyAgcmV0dXJuIChnY2Nfaml0X3ZlY3Rvcl90eXBlICopdmVjdG9yX3R5cGU7Cit9CisKKy8qIFB1 YmxpYyBlbnRyeXBvaW50LiAgU2VlIGRlc2NyaXB0aW9uIGluIGxpYmdjY2ppdC5oLgorCisgICBB ZnRlciBlcnJvci1jaGVja2luZywgdGhlIHJlYWwgd29yayBpcyBkb25lIGJ5IHRoZQorICAgZ2Nj OjpqaXQ6OnJlY29yZGluZzo6dHlwZTo6aXNfc3RydWN0IG1ldGhvZCwgaW4KKyAgIGppdC1yZWNv cmRpbmcuYy4gICovCisKK2djY19qaXRfc3RydWN0ICoKK2djY19qaXRfdHlwZV9pc19zdHJ1Y3Qg KGdjY19qaXRfdHlwZSAqdHlwZSkKK3sKKyAgUkVUVVJOX05VTExfSUZfRkFJTCAodHlwZSwgTlVM TCwgTlVMTCwgIk5VTEwgdHlwZSIpOworICBnY2M6OmppdDo6cmVjb3JkaW5nOjpzdHJ1Y3RfICpz dHJ1Y3RfdHlwZSA9IHR5cGUtPmlzX3N0cnVjdCAoKTsKKyAgcmV0dXJuIChnY2Nfaml0X3N0cnVj dCAqKXN0cnVjdF90eXBlOworfQorCisvKiBQdWJsaWMgZW50cnlwb2ludC4gIFNlZSBkZXNjcmlw dGlvbiBpbiBsaWJnY2NqaXQuaC4KKworICAgQWZ0ZXIgZXJyb3ItY2hlY2tpbmcsIHRoZSByZWFs IHdvcmsgaXMgZG9uZSBieSB0aGUKKyAgIGdjYzo6aml0OjpyZWNvcmRpbmc6OnZlY3Rvcl90eXBl OjpnZXRfbnVtX3VuaXRzIG1ldGhvZCwgaW4KKyAgIGppdC1yZWNvcmRpbmcuYy4gICovCisKK3Nz aXplX3QKK2djY19qaXRfdmVjdG9yX3R5cGVfZ2V0X251bV91bml0cyAoZ2NjX2ppdF92ZWN0b3Jf dHlwZSAqdmVjdG9yX3R5cGUpCit7CisgIFJFVFVSTl9WQUxfSUZfRkFJTCAodmVjdG9yX3R5cGUs IC0xLCBOVUxMLCBOVUxMLCAiTlVMTCB2ZWN0b3JfdHlwZSIpOworICByZXR1cm4gdmVjdG9yX3R5 cGUtPmdldF9udW1fdW5pdHMgKCk7Cit9CisKKy8qIFB1YmxpYyBlbnRyeXBvaW50LiAgU2VlIGRl c2NyaXB0aW9uIGluIGxpYmdjY2ppdC5oLgorCisgICBBZnRlciBlcnJvci1jaGVja2luZywgdGhl IHJlYWwgd29yayBpcyBkb25lIGJ5IHRoZQorICAgZ2NjOjpqaXQ6OnJlY29yZGluZzo6dmVjdG9y X3R5cGU6OmdldF9lbGVtZW50X3R5cGUgbWV0aG9kLCBpbgorICAgaml0LXJlY29yZGluZy5jLiAg Ki8KKworZ2NjX2ppdF90eXBlICoKK2djY19qaXRfdmVjdG9yX3R5cGVfZ2V0X2VsZW1lbnRfdHlw ZSAoZ2NjX2ppdF92ZWN0b3JfdHlwZSAqdmVjdG9yX3R5cGUpCit7CisgIFJFVFVSTl9OVUxMX0lG X0ZBSUwgKHZlY3Rvcl90eXBlLCBOVUxMLCBOVUxMLCAiTlVMTCB2ZWN0b3JfdHlwZSIpOworICBy ZXR1cm4gKGdjY19qaXRfdHlwZSAqKXZlY3Rvcl90eXBlLT5nZXRfZWxlbWVudF90eXBlICgpOwor fQorCisvKiBQdWJsaWMgZW50cnlwb2ludC4gIFNlZSBkZXNjcmlwdGlvbiBpbiBsaWJnY2NqaXQu aC4KKworICAgQWZ0ZXIgZXJyb3ItY2hlY2tpbmcsIHRoZSByZWFsIHdvcmsgaXMgZG9uZSBieSB0 aGUKKyAgIGdjYzo6aml0OjpyZWNvcmRpbmc6OnR5cGU6OnVucXVhbGlmaWVkIG1ldGhvZCwgaW4K KyAgIGppdC1yZWNvcmRpbmcuYy4gICovCisKK2djY19qaXRfdHlwZSAqCitnY2Nfaml0X3R5cGVf dW5xdWFsaWZpZWQgKGdjY19qaXRfdHlwZSAqdHlwZSkKK3sKKyAgUkVUVVJOX05VTExfSUZfRkFJ TCAodHlwZSwgTlVMTCwgTlVMTCwgIk5VTEwgdHlwZSIpOworCisgIHJldHVybiAoZ2NjX2ppdF90 eXBlICopdHlwZS0+dW5xdWFsaWZpZWQgKCk7Cit9CisKKy8qIFB1YmxpYyBlbnRyeXBvaW50LiAg U2VlIGRlc2NyaXB0aW9uIGluIGxpYmdjY2ppdC5oLgorCisgICBBZnRlciBlcnJvci1jaGVja2lu ZywgdGhlIHJlYWwgd29yayBpcyBkb25lIGJ5IHRoZQorICAgZ2NjOjpqaXQ6OnJlY29yZGluZzo6 dHlwZTo6ZHluX2Nhc3RfZnVuY3Rpb25fdHlwZSBtZXRob2QsIGluCisgICBqaXQtcmVjb3JkaW5n LmMuICAqLworCitnY2Nfaml0X2Z1bmN0aW9uX3R5cGUgKgorZ2NjX2ppdF90eXBlX2lzX2Z1bmN0 aW9uX3B0cl90eXBlIChnY2Nfaml0X3R5cGUgKnR5cGUpCit7CisgIFJFVFVSTl9OVUxMX0lGX0ZB SUwgKHR5cGUsIE5VTEwsIE5VTEwsICJOVUxMIHR5cGUiKTsKKyAgZ2NjOjpqaXQ6OnJlY29yZGlu Zzo6dHlwZSAqZnVuY19wdHJfdHlwZSA9IHR5cGUtPmRlcmVmZXJlbmNlICgpOworICBSRVRVUk5f TlVMTF9JRl9GQUlMIChmdW5jX3B0cl90eXBlLCBOVUxMLCBOVUxMLCAiTlVMTCB0eXBlIik7CisK KyAgcmV0dXJuIChnY2Nfaml0X2Z1bmN0aW9uX3R5cGUgKilmdW5jX3B0cl90eXBlLT5keW5fY2Fz dF9mdW5jdGlvbl90eXBlICgpOworfQorCisvKiBQdWJsaWMgZW50cnlwb2ludC4gIFNlZSBkZXNj cmlwdGlvbiBpbiBsaWJnY2NqaXQuaC4KKworICAgQWZ0ZXIgZXJyb3ItY2hlY2tpbmcsIHRoZSBy ZWFsIHdvcmsgaXMgZG9uZSBieSB0aGUKKyAgIGdjYzo6aml0OjpyZWNvcmRpbmc6OmZ1bmN0aW9u X3R5cGU6OmdldF9yZXR1cm5fdHlwZSBtZXRob2QsIGluCisgICBqaXQtcmVjb3JkaW5nLmMuICAq LworCitnY2Nfaml0X3R5cGUgKgorZ2NjX2ppdF9mdW5jdGlvbl90eXBlX2dldF9yZXR1cm5fdHlw ZSAoZ2NjX2ppdF9mdW5jdGlvbl90eXBlICpmdW5jdGlvbl90eXBlKQoreworICBSRVRVUk5fTlVM TF9JRl9GQUlMIChmdW5jdGlvbl90eXBlLCBOVUxMLCBOVUxMLCAiTlVMTCBmdW5jdGlvbl90eXBl Iik7CisgIHJldHVybiAoZ2NjX2ppdF90eXBlICopZnVuY3Rpb25fdHlwZS0+Z2V0X3JldHVybl90 eXBlICgpOworfQorCisvKiBQdWJsaWMgZW50cnlwb2ludC4gIFNlZSBkZXNjcmlwdGlvbiBpbiBs aWJnY2NqaXQuaC4KKworICAgQWZ0ZXIgZXJyb3ItY2hlY2tpbmcsIHRoZSByZWFsIHdvcmsgaXMg ZG9uZSBieSB0aGUKKyAgIGdjYzo6aml0OjpyZWNvcmRpbmc6OmZ1bmN0aW9uX3R5cGU6OmdldF9w YXJhbV90eXBlcyBtZXRob2QsIGluCisgICBqaXQtcmVjb3JkaW5nLmMuICAqLworCitzc2l6ZV90 CitnY2Nfaml0X2Z1bmN0aW9uX3R5cGVfZ2V0X3BhcmFtX2NvdW50IChnY2Nfaml0X2Z1bmN0aW9u X3R5cGUgKmZ1bmN0aW9uX3R5cGUpCit7CisgIFJFVFVSTl9WQUxfSUZfRkFJTCAoZnVuY3Rpb25f dHlwZSwgLTEsIE5VTEwsIE5VTEwsICJOVUxMIGZ1bmN0aW9uX3R5cGUiKTsKKyAgcmV0dXJuIGZ1 bmN0aW9uX3R5cGUtPmdldF9wYXJhbV90eXBlcyAoKS5sZW5ndGggKCk7Cit9CisKKy8qIFB1Ymxp YyBlbnRyeXBvaW50LiAgU2VlIGRlc2NyaXB0aW9uIGluIGxpYmdjY2ppdC5oLgorCisgICBBZnRl ciBlcnJvci1jaGVja2luZywgdGhlIHJlYWwgd29yayBpcyBkb25lIGJ5IHRoZQorICAgZ2NjOjpq aXQ6OnJlY29yZGluZzo6ZnVuY3Rpb25fdHlwZTo6Z2V0X3BhcmFtX3R5cGVzIG1ldGhvZCwgaW4K KyAgIGppdC1yZWNvcmRpbmcuYy4gICovCisKK2djY19qaXRfdHlwZSAqCitnY2Nfaml0X2Z1bmN0 aW9uX3R5cGVfZ2V0X3BhcmFtX3R5cGUgKGdjY19qaXRfZnVuY3Rpb25fdHlwZSAqZnVuY3Rpb25f dHlwZSwKKwkJCQlzaXplX3QgaW5kZXgpCit7CisgIFJFVFVSTl9OVUxMX0lGX0ZBSUwgKGZ1bmN0 aW9uX3R5cGUsIE5VTEwsIE5VTEwsICJOVUxMIGZ1bmN0aW9uX3R5cGUiKTsKKyAgc2l6ZV90IG51 bV9wYXJhbXMgPSBmdW5jdGlvbl90eXBlLT5nZXRfcGFyYW1fdHlwZXMgKCkubGVuZ3RoICgpOwor ICBnY2M6OmppdDo6cmVjb3JkaW5nOjpjb250ZXh0ICpjdHh0ID0gZnVuY3Rpb25fdHlwZS0+bV9j dHh0OworICBSRVRVUk5fTlVMTF9JRl9GQUlMX1BSSU5URjMgKGluZGV4IDwgbnVtX3BhcmFtcywK KwkJCSAgICAgICBjdHh0LCBOVUxMLAorCQkJICAgICAgICJpbmRleCBvZiAlbGQgaXMgdG9vIGxh cmdlICglcyBoYXMgJWxkIHBhcmFtcykiLAorCQkJICAgICAgIGluZGV4LAorCQkJICAgICAgIGZ1 bmN0aW9uX3R5cGUtPmdldF9kZWJ1Z19zdHJpbmcgKCksCisJCQkgICAgICAgbnVtX3BhcmFtcyk7 CisgIHJldHVybiAoZ2NjX2ppdF90eXBlICopZnVuY3Rpb25fdHlwZS0+Z2V0X3BhcmFtX3R5cGVz ICgpW2luZGV4XTsKK30KKwogLyogUHVibGljIGVudHJ5cG9pbnQuICBTZWUgZGVzY3JpcHRpb24g aW4gbGliZ2Njaml0LmguCiAKICAgIEFmdGVyIGVycm9yLWNoZWNraW5nLCB0aGUgcmVhbCB3b3Jr IGlzIGRvbmUgYnkgdGhlCkBAIC03MzYsNiArOTMyLDM3IEBAIGdjY19qaXRfc3RydWN0X3NldF9m aWVsZHMgKGdjY19qaXRfc3RydWN0ICpzdHJ1Y3RfdHlwZSwKIAkJCSAgIChnY2M6OmppdDo6cmVj b3JkaW5nOjpmaWVsZCAqKilmaWVsZHMpOwogfQogCisKKy8qIFB1YmxpYyBlbnRyeXBvaW50LiAg U2VlIGRlc2NyaXB0aW9uIGluIGxpYmdjY2ppdC5oLgorCisgICBBZnRlciBlcnJvci1jaGVja2lu ZywgdGhlIHJlYWwgd29yayBpcyBkb25lIGJ5IHRoZQorICAgZ2NjOjpqaXQ6OnJlY29yZGluZzo6 ZmllbGRzOjpnZXRfZmllbGQgbWV0aG9kIGluCisgICBqaXQtcmVjb3JkaW5nLmMuICAqLworZXh0 ZXJuIGdjY19qaXRfZmllbGQgKgorZ2NjX2ppdF9zdHJ1Y3RfZ2V0X2ZpZWxkIChnY2Nfaml0X3N0 cnVjdCAqc3RydWN0X3R5cGUsCisJCQkgICBzaXplX3QgaW5kZXgpCit7CisgIFJFVFVSTl9OVUxM X0lGX0ZBSUwgKHN0cnVjdF90eXBlLCBOVUxMLCBOVUxMLCAiTlVMTCBzdHJ1Y3QgdHlwZSIpOwor ICBSRVRVUk5fTlVMTF9JRl9GQUlMIChzdHJ1Y3RfdHlwZS0+Z2V0X2ZpZWxkcyAoKSwgTlVMTCwg TlVMTCwKKwkJCQkiTlVMTCBzdHJ1Y3QgZmllbGRzIik7CisgIFJFVFVSTl9OVUxMX0lGX0ZBSUwg KChpbnQpIGluZGV4IDwgc3RydWN0X3R5cGUtPmdldF9maWVsZHMgKCktPmxlbmd0aCAoKSwKKwkJ CQlOVUxMLCBOVUxMLCAiTlVMTCBzdHJ1Y3QgdHlwZSIpOworICByZXR1cm4gKGdjY19qaXRfZmll bGQgKilzdHJ1Y3RfdHlwZS0+Z2V0X2ZpZWxkcyAoKS0+Z2V0X2ZpZWxkIChpbmRleCk7Cit9CisK Ky8qIFB1YmxpYyBlbnRyeXBvaW50LiAgU2VlIGRlc2NyaXB0aW9uIGluIGxpYmdjY2ppdC5oLgor CisgICBBZnRlciBlcnJvci1jaGVja2luZywgdGhpcyBjYWxscyB0aGUgdHJpdmlhbAorICAgZ2Nj OjpqaXQ6OnJlY29yZGluZzo6c3RydWN0Xzo6Z2V0X2ZpZWxkcyBtZXRob2QgaW4KKyAgIGppdC1y ZWNvcmRpbmcuaC4gICovCisKK3NzaXplX3QKK2djY19qaXRfc3RydWN0X2dldF9maWVsZF9jb3Vu dCAoZ2NjX2ppdF9zdHJ1Y3QgKnN0cnVjdF90eXBlKQoreworICBSRVRVUk5fVkFMX0lGX0ZBSUwg KHN0cnVjdF90eXBlLCAtMSwgTlVMTCwgTlVMTCwgIk5VTEwgc3RydWN0IHR5cGUiKTsKKyAgcmV0 dXJuIHN0cnVjdF90eXBlLT5nZXRfZmllbGRzICgpLT5sZW5ndGggKCk7Cit9CisKIC8qIFB1Ymxp YyBlbnRyeXBvaW50LiAgU2VlIGRlc2NyaXB0aW9uIGluIGxpYmdjY2ppdC5oLgogCiAgICBBZnRl ciBlcnJvci1jaGVja2luZywgdGhlIHJlYWwgd29yayBpcyBkb25lIGJ5IHRoZQpAQCAtMTAxNyw2 ICsxMjQ0LDM1IEBAIGdjY19qaXRfZnVuY3Rpb25fZ2V0X3BhcmFtIChnY2Nfaml0X2Z1bmN0aW9u ICpmdW5jLCBpbnQgaW5kZXgpCiAgIHJldHVybiBzdGF0aWNfY2FzdCA8Z2NjX2ppdF9wYXJhbSAq PiAoZnVuYy0+Z2V0X3BhcmFtIChpbmRleCkpOwogfQogCisvKiBQdWJsaWMgZW50cnlwb2ludC4g IFNlZSBkZXNjcmlwdGlvbiBpbiBsaWJnY2NqaXQuaC4KKworICAgQWZ0ZXIgZXJyb3ItY2hlY2tp bmcsIHRoZSByZWFsIHdvcmsgaXMgZG9uZSBieSB0aGUKKyAgIGdjYzo6aml0OjpyZWNvcmRpbmc6 OmZ1bmN0aW9uOjpnZXRfcGFyYW1zIG1ldGhvZCwgaW4KKyAgIGppdC1yZWNvcmRpbmcuaC4KKyAg Ki8KKworc3NpemVfdAorZ2NjX2ppdF9mdW5jdGlvbl9nZXRfcGFyYW1fY291bnQgKGdjY19qaXRf ZnVuY3Rpb24gKmZ1bmMpCit7CisgIFJFVFVSTl9WQUxfSUZfRkFJTCAoZnVuYywgLTEsIE5VTEws IE5VTEwsICJOVUxMIGZ1bmN0aW9uIik7CisgIGdjYzo6aml0OjpyZWNvcmRpbmc6OmNvbnRleHQg KmN0eHQgPSBmdW5jLT5tX2N0eHQ7CisgIEpJVF9MT0dfRlVOQyAoY3R4dC0+Z2V0X2xvZ2dlciAo KSk7CisgIHJldHVybiBmdW5jLT5nZXRfcGFyYW1zICgpLmxlbmd0aCAoKTsKK30KKworLyogUHVi bGljIGVudHJ5cG9pbnQuICBTZWUgZGVzY3JpcHRpb24gaW4gbGliZ2Njaml0LmguCisKKyAgIEFm dGVyIGVycm9yLWNoZWNraW5nLCB0aGUgcmVhbCB3b3JrIGlzIGRvbmUgYnkgdGhlCisgICBnY2M6 OmppdDo6cmVjb3JkaW5nOjpmdW5jdGlvbjo6Z2V0X3JldHVybl90eXBlIG1ldGhvZCwgaW4KKyAg IGppdC1yZWNvcmRpbmcuaC4gICovCisKK2djY19qaXRfdHlwZSAqCitnY2Nfaml0X2Z1bmN0aW9u X2dldF9yZXR1cm5fdHlwZSAoZ2NjX2ppdF9mdW5jdGlvbiAqZnVuYykKK3sKKyAgICBSRVRVUk5f TlVMTF9JRl9GQUlMIChmdW5jLCBOVUxMLCBOVUxMLCAiTlVMTCBmdW5jdGlvbl90eXBlIik7Cisg ICAgcmV0dXJuIChnY2Nfaml0X3R5cGUgKilmdW5jLT5nZXRfcmV0dXJuX3R5cGUgKCk7Cit9CisK IC8qIFB1YmxpYyBlbnRyeXBvaW50LiAgU2VlIGRlc2NyaXB0aW9uIGluIGxpYmdjY2ppdC5oLgog CiAgICBBZnRlciBlcnJvci1jaGVja2luZywgdGhlIHJlYWwgd29yayBpcyBkb25lIGJ5IHRoZQpk aWZmIC0tZ2l0IGEvZ2NjL2ppdC9saWJnY2NqaXQuaCBiL2djYy9qaXQvbGliZ2Njaml0LmgKaW5k ZXggNWM3MjJjMmM1N2YuLjFlNWM1YzE2OWNiIDEwMDY0NAotLS0gYS9nY2Mvaml0L2xpYmdjY2pp dC5oCisrKyBiL2djYy9qaXQvbGliZ2Njaml0LmgKQEAgLTYxLDYgKzYxLDggQEAgdHlwZWRlZiBz dHJ1Y3QgZ2NjX2ppdF9yZXN1bHQgZ2NjX2ppdF9yZXN1bHQ7CiAJICstIGdjY19qaXRfbG9jYXRp b24KIAkgKy0gZ2NjX2ppdF90eXBlCiAJICAgICstIGdjY19qaXRfc3RydWN0CisJICAgICstIGdj Y19qaXRfZnVuY3Rpb25fdHlwZQorCSAgICArLSBnY2Nfaml0X3ZlY3Rvcl90eXBlCiAJICstIGdj Y19qaXRfZmllbGQKIAkgKy0gZ2NjX2ppdF9mdW5jdGlvbgogCSArLSBnY2Nfaml0X2Jsb2NrCkBA IC05Nyw2ICs5OSwxMiBAQCB0eXBlZGVmIHN0cnVjdCBnY2Nfaml0X2ZpZWxkIGdjY19qaXRfZmll bGQ7CiAgICB0aGUgbGF5b3V0IGZvciwgb3IgYW4gb3BhcXVlIHR5cGUuICAqLwogdHlwZWRlZiBz dHJ1Y3QgZ2NjX2ppdF9zdHJ1Y3QgZ2NjX2ppdF9zdHJ1Y3Q7CiAKKy8qIEEgZ2NjX2ppdF9mdW5j dGlvbl90eXBlIGVuY2Fwc3VsYXRlcyBhIGZ1bmN0aW9uIHR5cGUuICAqLwordHlwZWRlZiBzdHJ1 Y3QgZ2NjX2ppdF9mdW5jdGlvbl90eXBlIGdjY19qaXRfZnVuY3Rpb25fdHlwZTsKKworLyogQSBn Y2Nfaml0X3ZlY3Rvcl90eXBlIGVuY2Fwc3VsYXRlcyBhIHZlY3RvciB0eXBlLiAgKi8KK3R5cGVk ZWYgc3RydWN0IGdjY19qaXRfdmVjdG9yX3R5cGUgZ2NjX2ppdF92ZWN0b3JfdHlwZTsKKwogLyog QSBnY2Nfaml0X2Z1bmN0aW9uIGVuY2Fwc3VsYXRlcyBhIGZ1bmN0aW9uOiBlaXRoZXIgb25lIHRo YXQgeW91J3JlCiAgICBjcmVhdGluZyB5b3Vyc2VsZiwgb3IgYSByZWZlcmVuY2UgdG8gb25lIHRo YXQgeW91J3JlIGR5bmFtaWNhbGx5CiAgICBsaW5raW5nIHRvIHdpdGhpbiB0aGUgcmVzdCBvZiB0 aGUgcHJvY2Vzcy4gICovCkBAIC02NTQsNiArNjYyLDE1IEBAIGdjY19qaXRfc3RydWN0X3NldF9m aWVsZHMgKGdjY19qaXRfc3RydWN0ICpzdHJ1Y3RfdHlwZSwKIAkJCSAgIGludCBudW1fZmllbGRz LAogCQkJICAgZ2NjX2ppdF9maWVsZCAqKmZpZWxkcyk7CiAKKy8qIEdldCBhIGZpZWxkIGJ5IGlu ZGV4LiAgKi8KK2V4dGVybiBnY2Nfaml0X2ZpZWxkICoKK2djY19qaXRfc3RydWN0X2dldF9maWVs ZCAoZ2NjX2ppdF9zdHJ1Y3QgKnN0cnVjdF90eXBlLAorCQkJICAgc2l6ZV90IGluZGV4KTsKKwor LyogR2V0IHRoZSBudW1iZXIgb2YgZmllbGRzLiAgKi8KK2V4dGVybiBzc2l6ZV90CitnY2Nfaml0 X3N0cnVjdF9nZXRfZmllbGRfY291bnQgKGdjY19qaXRfc3RydWN0ICpzdHJ1Y3RfdHlwZSk7CisK IC8qIFVuaW9ucyB3b3JrIHNpbWlsYXJseSB0byBzdHJ1Y3RzLiAgKi8KIGV4dGVybiBnY2Nfaml0 X3R5cGUgKgogZ2NjX2ppdF9jb250ZXh0X25ld191bmlvbl90eXBlIChnY2Nfaml0X2NvbnRleHQg KmN0eHQsCkBAIC0xNjIxLDYgKzE2MzgsNzggQEAgZ2NjX2ppdF9jb250ZXh0X2FkZF90b3BfbGV2 ZWxfYXNtIChnY2Nfaml0X2NvbnRleHQgKmN0eHQsCiAJCQkJICAgZ2NjX2ppdF9sb2NhdGlvbiAq bG9jLAogCQkJCSAgIGNvbnN0IGNoYXIgKmFzbV9zdG10cyk7CiAKKyNkZWZpbmUgTElCR0NDSklU X0hBVkVfUkVGTEVDVElPTgorCisvKiBSZWZsZWN0aW9uIGZ1bmN0aW9ucyB0byBnZXQgdGhlIG51 bWJlciBvZiBwYXJhbWV0ZXJzLCByZXR1cm4gdHlwZSBvZgorICAgYSBmdW5jdGlvbiBhbmQgd2hl dGhlciBhIHR5cGUgaXMgYSBib29sIGZyb20gdGhlIEMgQVBJLgorCisgICBUaGlzIEFQSSBlbnRy eXBvaW50IHdhcyBhZGRlZCBpbiBMSUJHQ0NKSVRfQUJJXzE1OyB5b3UgY2FuIHRlc3QgZm9yIGl0 cworICAgcHJlc2VuY2UgdXNpbmcKKyAgICAgI2lmZGVmIExJQkdDQ0pJVF9IQVZFX1JFRkxFQ1RJ T04KKyovCisvKiBHZXQgdGhlIHJldHVybiB0eXBlIG9mIGEgZnVuY3Rpb24uICAqLworZXh0ZXJu IGdjY19qaXRfdHlwZSAqCitnY2Nfaml0X2Z1bmN0aW9uX2dldF9yZXR1cm5fdHlwZSAoZ2NjX2pp dF9mdW5jdGlvbiAqZnVuYyk7CisKKy8qIEdldCB0aGUgbnVtYmVyIG9mIHBhcmFtcyBvZiBhIGZ1 bmN0aW9uLiAgKi8KK2V4dGVybiBzc2l6ZV90CitnY2Nfaml0X2Z1bmN0aW9uX2dldF9wYXJhbV9j b3VudCAoZ2NjX2ppdF9mdW5jdGlvbiAqZnVuYyk7CisKKy8qIEdldCB0aGUgZWxlbWVudCB0eXBl IG9mIGFuIGFycmF5IHR5cGUgb3IgTlVMTCBpZiBpdCdzIG5vdCBhbiBhcnJheS4gICovCitleHRl cm4gZ2NjX2ppdF90eXBlICoKK2djY19qaXRfdHlwZV9pc19hcnJheSAoZ2NjX2ppdF90eXBlICp0 eXBlKTsKKworLyogUmV0dXJuIG5vbi16ZXJvIGlmIHRoZSB0eXBlIGlzIGEgYm9vbC4gICovCitl eHRlcm4gaW50CitnY2Nfaml0X3R5cGVfaXNfYm9vbCAoZ2NjX2ppdF90eXBlICp0eXBlKTsKKwor LyogUmV0dXJuIHRoZSBmdW5jdGlvbiB0eXBlIGlmIGl0IGlzIG9uZSBvciBOVUxMLiAgKi8KK2V4 dGVybiBnY2Nfaml0X2Z1bmN0aW9uX3R5cGUgKgorZ2NjX2ppdF90eXBlX2lzX2Z1bmN0aW9uX3B0 cl90eXBlIChnY2Nfaml0X3R5cGUgKnR5cGUpOworCisvKiBHaXZlbiBhIGZ1bmN0aW9uIHR5cGUs IHJldHVybiBpdHMgcmV0dXJuIHR5cGUuICAqLworZXh0ZXJuIGdjY19qaXRfdHlwZSAqCitnY2Nf aml0X2Z1bmN0aW9uX3R5cGVfZ2V0X3JldHVybl90eXBlIChnY2Nfaml0X2Z1bmN0aW9uX3R5cGUg KmZ1bmN0aW9uX3R5cGUpOworCisvKiBHaXZlbiBhIGZ1bmN0aW9uIHR5cGUsIHJldHVybiBpdHMg bnVtYmVyIG9mIHBhcmFtZXRlcnMuICAqLworZXh0ZXJuIHNzaXplX3QKK2djY19qaXRfZnVuY3Rp b25fdHlwZV9nZXRfcGFyYW1fY291bnQgKGdjY19qaXRfZnVuY3Rpb25fdHlwZSAqZnVuY3Rpb25f dHlwZSk7CisKKy8qIEdpdmVuIGEgZnVuY3Rpb24gdHlwZSwgcmV0dXJuIHRoZSB0eXBlIG9mIHRo ZSBzcGVjaWZpZWQgcGFyYW1ldGVyLiAgKi8KK2V4dGVybiBnY2Nfaml0X3R5cGUgKgorZ2NjX2pp dF9mdW5jdGlvbl90eXBlX2dldF9wYXJhbV90eXBlIChnY2Nfaml0X2Z1bmN0aW9uX3R5cGUgKmZ1 bmN0aW9uX3R5cGUsCisJCQkJc2l6ZV90IGluZGV4KTsKKworLyogUmV0dXJuIG5vbi16ZXJvIGlm IHRoZSB0eXBlIGlzIGFuIGludGVncmFsLiAgKi8KK2V4dGVybiBpbnQKK2djY19qaXRfdHlwZV9p c19pbnRlZ3JhbCAoZ2NjX2ppdF90eXBlICp0eXBlKTsKKworLyogUmV0dXJuIHRoZSB0eXBlIHBv aW50ZWQgYnkgdGhlIHBvaW50ZXIgdHlwZSBvciBOVUxMIGlmIGl0J3Mgbm90IGEKKyAqIHBvaW50 ZXIuICAqLworZXh0ZXJuIGdjY19qaXRfdHlwZSAqCitnY2Nfaml0X3R5cGVfaXNfcG9pbnRlciAo Z2NjX2ppdF90eXBlICp0eXBlKTsKKworLyogR2l2ZW4gYSB0eXBlLCByZXR1cm4gYSBkeW5hbWlj IGNhc3QgdG8gYSB2ZWN0b3IgdHlwZSBvciBOVUxMLiAgKi8KK2V4dGVybiBnY2Nfaml0X3ZlY3Rv cl90eXBlICoKK2djY19qaXRfdHlwZV9pc192ZWN0b3IgKGdjY19qaXRfdHlwZSAqdHlwZSk7CisK Ky8qIEdpdmVuIGEgdHlwZSwgcmV0dXJuIGEgZHluYW1pYyBjYXN0IHRvIGEgc3RydWN0IHR5cGUg b3IgTlVMTC4gICovCitleHRlcm4gZ2NjX2ppdF9zdHJ1Y3QgKgorZ2NjX2ppdF90eXBlX2lzX3N0 cnVjdCAoZ2NjX2ppdF90eXBlICp0eXBlKTsKKworLyogR2l2ZW4gYSB2ZWN0b3IgdHlwZSwgcmV0 dXJuIHRoZSBudW1iZXIgb2YgdW5pdHMgaXQgY29udGFpbnMuICAqLworZXh0ZXJuIHNzaXplX3QK K2djY19qaXRfdmVjdG9yX3R5cGVfZ2V0X251bV91bml0cyAoZ2NjX2ppdF92ZWN0b3JfdHlwZSAq dmVjdG9yX3R5cGUpOworCisvKiBHaXZlbiBhIHZlY3RvciB0eXBlLCByZXR1cm4gdGhlIHR5cGUg b2YgaXRzIGVsZW1lbnRzLiAgKi8KK2V4dGVybiBnY2Nfaml0X3R5cGUgKgorZ2NjX2ppdF92ZWN0 b3JfdHlwZV9nZXRfZWxlbWVudF90eXBlIChnY2Nfaml0X3ZlY3Rvcl90eXBlICp2ZWN0b3JfdHlw ZSk7CisKKy8qIEdpdmVuIGEgdHlwZSwgcmV0dXJuIHRoZSB1bnF1YWxpZmllZCB0eXBlLCByZW1v dmluZyAiY29uc3QiLCAidm9sYXRpbGUiCisgKiBhbmQgYWxpZ25tZW50IHF1YWxpZmllcnMuICAq LworZXh0ZXJuIGdjY19qaXRfdHlwZSAqCitnY2Nfaml0X3R5cGVfdW5xdWFsaWZpZWQgKGdjY19q aXRfdHlwZSAqdHlwZSk7CisKICNpZmRlZiBfX2NwbHVzcGx1cwogfQogI2VuZGlmIC8qIF9fY3Bs dXNwbHVzICovCmRpZmYgLS1naXQgYS9nY2Mvaml0L2xpYmdjY2ppdC5tYXAgYi9nY2Mvaml0L2xp YmdjY2ppdC5tYXAKaW5kZXggMzM3ZWE2YzdmZTQuLjg0MzU4NzYzY2Q2IDEwMDY0NAotLS0gYS9n Y2Mvaml0L2xpYmdjY2ppdC5tYXAKKysrIGIvZ2NjL2ppdC9saWJnY2NqaXQubWFwCkBAIC0yMDUs MyArMjA1LDI0IEBAIExJQkdDQ0pJVF9BQklfMTUgewogICAgIGdjY19qaXRfZXh0ZW5kZWRfYXNt X2FkZF9jbG9iYmVyOwogICAgIGdjY19qaXRfY29udGV4dF9hZGRfdG9wX2xldmVsX2FzbTsKIH0g TElCR0NDSklUX0FCSV8xNDsKKworTElCR0NDSklUX0FCSV8xNiB7CisgIGdsb2JhbDoKKyAgICBn Y2Nfaml0X2Z1bmN0aW9uX2dldF9yZXR1cm5fdHlwZTsKKyAgICBnY2Nfaml0X2Z1bmN0aW9uX2dl dF9wYXJhbV9jb3VudDsKKyAgICBnY2Nfaml0X2Z1bmN0aW9uX3R5cGVfZ2V0X3JldHVybl90eXBl OworICAgIGdjY19qaXRfZnVuY3Rpb25fdHlwZV9nZXRfcGFyYW1fY291bnQ7CisgICAgZ2NjX2pp dF9mdW5jdGlvbl90eXBlX2dldF9wYXJhbV90eXBlOworICAgIGdjY19qaXRfdHlwZV91bnF1YWxp ZmllZDsKKyAgICBnY2Nfaml0X3R5cGVfaXNfYXJyYXk7CisgICAgZ2NjX2ppdF90eXBlX2lzX2Jv b2w7CisgICAgZ2NjX2ppdF90eXBlX2lzX2Z1bmN0aW9uX3B0cl90eXBlOworICAgIGdjY19qaXRf dHlwZV9pc19pbnRlZ3JhbDsKKyAgICBnY2Nfaml0X3R5cGVfaXNfcG9pbnRlcjsKKyAgICBnY2Nf aml0X3R5cGVfaXNfdmVjdG9yOworICAgIGdjY19qaXRfdmVjdG9yX3R5cGVfZ2V0X2VsZW1lbnRf dHlwZTsKKyAgICBnY2Nfaml0X3ZlY3Rvcl90eXBlX2dldF9udW1fdW5pdHM7CisgICAgZ2NjX2pp dF9zdHJ1Y3RfZ2V0X2ZpZWxkOworICAgIGdjY19qaXRfdHlwZV9pc19zdHJ1Y3Q7CisgICAgZ2Nj X2ppdF9zdHJ1Y3RfZ2V0X2ZpZWxkX2NvdW50OworfSBMSUJHQ0NKSVRfQUJJXzE1OwpkaWZmIC0t Z2l0IGEvZ2NjL3Rlc3RzdWl0ZS9qaXQuZGcvYWxsLW5vbi1mYWlsaW5nLXRlc3RzLmggYi9nY2Mv dGVzdHN1aXRlL2ppdC5kZy9hbGwtbm9uLWZhaWxpbmctdGVzdHMuaAppbmRleCA0MjAyZWI3Nzk4 Yi4uYTI2OTE0NGQyZGYgMTAwNjQ0Ci0tLSBhL2djYy90ZXN0c3VpdGUvaml0LmRnL2FsbC1ub24t ZmFpbGluZy10ZXN0cy5oCisrKyBiL2djYy90ZXN0c3VpdGUvaml0LmRnL2FsbC1ub24tZmFpbGlu Zy10ZXN0cy5oCkBAIC0yNTgsNiArMjU4LDEzIEBACiAjdW5kZWYgY3JlYXRlX2NvZGUKICN1bmRl ZiB2ZXJpZnlfY29kZQogCisvKiB0ZXN0LXJlZmxlY3Rpb24uYyAqLworI2RlZmluZSBjcmVhdGVf Y29kZSBjcmVhdGVfY29kZV9yZWZsZWN0aW9uCisjZGVmaW5lIHZlcmlmeV9jb2RlIHZlcmlmeV9j b2RlX3JlZmxlY3Rpb24KKyNpbmNsdWRlICJ0ZXN0LXJlZmxlY3Rpb24uYyIKKyN1bmRlZiBjcmVh dGVfY29kZQorI3VuZGVmIHZlcmlmeV9jb2RlCisKIC8qIHRlc3Qtc3RyaW5nLWxpdGVyYWwuYyAq LwogI2RlZmluZSBjcmVhdGVfY29kZSBjcmVhdGVfY29kZV9zdHJpbmdfbGl0ZXJhbAogI2RlZmlu ZSB2ZXJpZnlfY29kZSB2ZXJpZnlfY29kZV9zdHJpbmdfbGl0ZXJhbApAQCAtNDI0LDYgKzQzMSw5 IEBAIGNvbnN0IHN0cnVjdCB0ZXN0Y2FzZSB0ZXN0Y2FzZXNbXSA9IHsKICAgeyJyZWFkaW5nX3N0 cnVjdCAiLAogICAgY3JlYXRlX2NvZGVfcmVhZGluZ19zdHJ1Y3QgLAogICAgdmVyaWZ5X2NvZGVf cmVhZGluZ19zdHJ1Y3QgfSwKKyAgeyJyZWZsZWN0aW9uIiwKKyAgIGNyZWF0ZV9jb2RlX3JlZmxl Y3Rpb24gLAorICAgdmVyaWZ5X2NvZGVfcmVmbGVjdGlvbiB9LAogICB7InN0cmluZ19saXRlcmFs IiwKICAgIGNyZWF0ZV9jb2RlX3N0cmluZ19saXRlcmFsLAogICAgdmVyaWZ5X2NvZGVfc3RyaW5n X2xpdGVyYWx9LApkaWZmIC0tZ2l0IGEvZ2NjL3Rlc3RzdWl0ZS9qaXQuZGcvdGVzdC1yZWZsZWN0 aW9uLmMgYi9nY2MvdGVzdHN1aXRlL2ppdC5kZy90ZXN0LXJlZmxlY3Rpb24uYwpuZXcgZmlsZSBt b2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMC4uNDZhYjJjM2U4ODcKLS0tIC9kZXYvbnVsbAor KysgYi9nY2MvdGVzdHN1aXRlL2ppdC5kZy90ZXN0LXJlZmxlY3Rpb24uYwpAQCAtMCwwICsxLDk1 IEBACisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKworI2luY2x1ZGUg ImxpYmdjY2ppdC5oIgorCisjaW5jbHVkZSAiaGFybmVzcy5oIgorCit2b2lkCitjcmVhdGVfY29k ZSAoZ2NjX2ppdF9jb250ZXh0ICpjdHh0LCB2b2lkICp1c2VyX2RhdGEpCit7CisgIC8qIERvIG5v dGhpbmcuICAqLworfQorCit2b2lkCit2ZXJpZnlfY29kZSAoZ2NjX2ppdF9jb250ZXh0ICpjdHh0 LCBnY2Nfaml0X3Jlc3VsdCAqcmVzdWx0KQoreworICAvKiBHZXQgdGhlIGJ1aWx0LWluIGZ1bmN0 aW9ucy4gICovCisgIGdjY19qaXRfZnVuY3Rpb24gKmJ1aWx0aW5fc2luID0KKyAgICBnY2Nfaml0 X2NvbnRleHRfZ2V0X2J1aWx0aW5fZnVuY3Rpb24gKGN0eHQsICJzaW4iKTsKKworICBDSEVDS19W QUxVRSAoZ2NjX2ppdF9mdW5jdGlvbl9nZXRfcGFyYW1fY291bnQoYnVpbHRpbl9zaW4pLCAxKTsK KworICBnY2Nfaml0X3R5cGUgKmRvdWJsZV90eXBlID0KKyAgICBnY2Nfaml0X2NvbnRleHRfZ2V0 X3R5cGUgKGN0eHQsIEdDQ19KSVRfVFlQRV9ET1VCTEUpOworICBDSEVDS19WQUxVRSAoZ2NjX2pp dF9mdW5jdGlvbl9nZXRfcmV0dXJuX3R5cGUoYnVpbHRpbl9zaW4pLCBkb3VibGVfdHlwZSk7Cisg IENIRUNLICghZ2NjX2ppdF90eXBlX2lzX2ludGVncmFsKGRvdWJsZV90eXBlKSk7CisKKyAgZ2Nj X2ppdF90eXBlICpib29sX3R5cGUgPQorICAgIGdjY19qaXRfY29udGV4dF9nZXRfdHlwZSAoY3R4 dCwgR0NDX0pJVF9UWVBFX0JPT0wpOworICBDSEVDSyAoZ2NjX2ppdF90eXBlX2lzX2Jvb2woYm9v bF90eXBlKSk7CisgIENIRUNLICghZ2NjX2ppdF90eXBlX2lzX2ludGVncmFsKGJvb2xfdHlwZSkp OworCisgIGdjY19qaXRfdHlwZSAqYWxpZ25lZF9ib29sX3R5cGUgPQorICAgIGdjY19qaXRfdHlw ZV9nZXRfYWxpZ25lZChnY2Nfaml0X2NvbnRleHRfZ2V0X3R5cGUgKGN0eHQsIEdDQ19KSVRfVFlQ RV9CT09MKSwgOCk7CisgIENIRUNLIChnY2Nfaml0X3R5cGVfaXNfYm9vbChhbGlnbmVkX2Jvb2xf dHlwZSkpOworICBDSEVDSyAoYm9vbF90eXBlICE9IGFsaWduZWRfYm9vbF90eXBlKTsKKyAgQ0hF Q0tfVkFMVUUgKGdjY19qaXRfdHlwZV91bnF1YWxpZmllZChhbGlnbmVkX2Jvb2xfdHlwZSksIGJv b2xfdHlwZSk7CisKKyAgQ0hFQ0tfVkFMVUUgKGdjY19qaXRfdHlwZV91bnF1YWxpZmllZChnY2Nf aml0X3R5cGVfZ2V0X2NvbnN0KGJvb2xfdHlwZSkpLCBib29sX3R5cGUpOworICBDSEVDS19WQUxV RSAoZ2NjX2ppdF90eXBlX3VucXVhbGlmaWVkKGdjY19qaXRfdHlwZV9nZXRfdm9sYXRpbGUoYm9v bF90eXBlKSksIGJvb2xfdHlwZSk7CisKKyAgZ2NjX2ppdF90eXBlICppbnQ2NCA9CisgICAgZ2Nj X2ppdF9jb250ZXh0X2dldF9pbnRfdHlwZShjdHh0LCA4LCAxKTsKKyAgQ0hFQ0sgKGdjY19qaXRf dHlwZV9pc19pbnRlZ3JhbChpbnQ2NCkpOworICBnY2Nfaml0X3R5cGUgKnVpbnQ2NCA9CisgICAg Z2NjX2ppdF9jb250ZXh0X2dldF9pbnRfdHlwZShjdHh0LCA4LCAwKTsKKyAgQ0hFQ0sgKGdjY19q aXRfdHlwZV9pc19pbnRlZ3JhbCh1aW50NjQpKTsKKyAgZ2NjX2ppdF90eXBlICppbnQ4ID0KKyAg ICBnY2Nfaml0X2NvbnRleHRfZ2V0X2ludF90eXBlKGN0eHQsIDEsIDEpOworICBDSEVDSyAoZ2Nj X2ppdF90eXBlX2lzX2ludGVncmFsKGludDgpKTsKKyAgZ2NjX2ppdF90eXBlICp1aW50OCA9Cisg ICAgZ2NjX2ppdF9jb250ZXh0X2dldF9pbnRfdHlwZShjdHh0LCAxLCAwKTsKKyAgQ0hFQ0sgKGdj Y19qaXRfdHlwZV9pc19pbnRlZ3JhbCh1aW50OCkpOworCisgIENIRUNLICghZ2NjX2ppdF90eXBl X2lzX3ZlY3Rvcihkb3VibGVfdHlwZSkpOworICBnY2Nfaml0X3R5cGUgKnZlY190eXBlID0gZ2Nj X2ppdF90eXBlX2dldF92ZWN0b3IgKGRvdWJsZV90eXBlLCA0KTsKKyAgZ2NjX2ppdF92ZWN0b3Jf dHlwZSAqdmVjdG9yX3R5cGUgPSBnY2Nfaml0X3R5cGVfaXNfdmVjdG9yKHZlY190eXBlKTsKKyAg Q0hFQ0sgKHZlY3Rvcl90eXBlKTsKKyAgQ0hFQ0sgKHZlY190eXBlICE9IGRvdWJsZV90eXBlKTsK KyAgQ0hFQ0tfVkFMVUUgKGdjY19qaXRfdmVjdG9yX3R5cGVfZ2V0X2VsZW1lbnRfdHlwZSh2ZWN0 b3JfdHlwZSksIGRvdWJsZV90eXBlKTsKKyAgQ0hFQ0tfVkFMVUUgKGdjY19qaXRfdmVjdG9yX3R5 cGVfZ2V0X251bV91bml0cyh2ZWN0b3JfdHlwZSksIDQpOworCisgIENIRUNLICghZ2NjX2ppdF90 eXBlX2lzX3BvaW50ZXIoZG91YmxlX3R5cGUpKTsKKyAgQ0hFQ0tfVkFMVUUgKGdjY19qaXRfdHlw ZV9pc19wb2ludGVyKGdjY19qaXRfdHlwZV9nZXRfcG9pbnRlcihkb3VibGVfdHlwZSkpLCBkb3Vi bGVfdHlwZSk7CisKKyAgZ2NjX2ppdF90eXBlKiBwYXJhbXNbMl0gPSB7aW50OCwgdWludDY0fTsK KyAgZ2NjX2ppdF90eXBlICpmdW5jdGlvbl9wdHJfdHlwZSA9IGdjY19qaXRfY29udGV4dF9uZXdf ZnVuY3Rpb25fcHRyX3R5cGUoY3R4dCwgTlVMTCwgaW50NjQsIDIsIHBhcmFtcywgMCk7CisgIENI RUNLICghZ2NjX2ppdF90eXBlX2lzX2Z1bmN0aW9uX3B0cl90eXBlIChpbnQ2NCkpOworICBnY2Nf aml0X2Z1bmN0aW9uX3R5cGUgKmZ1bmN0aW9uX3R5cGUgPSBnY2Nfaml0X3R5cGVfaXNfZnVuY3Rp b25fcHRyX3R5cGUgKGZ1bmN0aW9uX3B0cl90eXBlKTsKKyAgQ0hFQ0sgKGZ1bmN0aW9uX3R5cGUp OworICBpbnQgcGFyYW1fY291bnQgPSBnY2Nfaml0X2Z1bmN0aW9uX3R5cGVfZ2V0X3BhcmFtX2Nv dW50KGZ1bmN0aW9uX3R5cGUpOworICBDSEVDS19WQUxVRSAocGFyYW1fY291bnQsIDIpOworICBn Y2Nfaml0X3R5cGUgKnJldHVybl90eXBlID0gZ2NjX2ppdF9mdW5jdGlvbl90eXBlX2dldF9yZXR1 cm5fdHlwZShmdW5jdGlvbl90eXBlKTsKKyAgQ0hFQ0tfVkFMVUUgKHJldHVybl90eXBlLCBpbnQ2 NCk7CisgIGdjY19qaXRfdHlwZSAqcGFyYW0xID0gZ2NjX2ppdF9mdW5jdGlvbl90eXBlX2dldF9w YXJhbV90eXBlKGZ1bmN0aW9uX3R5cGUsIDApOworICBDSEVDS19WQUxVRSAocGFyYW0xLCBpbnQ4 KTsKKyAgZ2NjX2ppdF90eXBlICpwYXJhbTIgPSBnY2Nfaml0X2Z1bmN0aW9uX3R5cGVfZ2V0X3Bh cmFtX3R5cGUoZnVuY3Rpb25fdHlwZSwgMSk7CisgIENIRUNLX1ZBTFVFIChwYXJhbTIsIHVpbnQ2 NCk7CisKKyAgZ2NjX2ppdF9maWVsZCAqZmllbGQxID0gZ2NjX2ppdF9jb250ZXh0X25ld19maWVs ZCAoY3R4dCwgTlVMTCwgdWludDY0LCAiZmllbGQxIik7CisgIGdjY19qaXRfZmllbGQgKmZpZWxk MiA9IGdjY19qaXRfY29udGV4dF9uZXdfZmllbGQgKGN0eHQsIE5VTEwsIGRvdWJsZV90eXBlLCAi ZmllbGQyIik7CisgIGdjY19qaXRfZmllbGQgKmZpZWxkc1syXSA9IHsgZmllbGQxLCBmaWVsZDIg fTsKKyAgZ2NjX2ppdF9zdHJ1Y3QgKnN0cnVjdF90eXBlID0gZ2NjX2ppdF9jb250ZXh0X25ld19z dHJ1Y3RfdHlwZSAoY3R4dCwgTlVMTCwgInRlc3RTdHJ1Y3QiLCAyLCBmaWVsZHMpOworICBDSEVD S19WQUxVRSAoZ2NjX2ppdF9zdHJ1Y3RfZ2V0X2ZpZWxkX2NvdW50KHN0cnVjdF90eXBlKSwgMik7 CisgIENIRUNLX1ZBTFVFIChnY2Nfaml0X3N0cnVjdF9nZXRfZmllbGQoc3RydWN0X3R5cGUsIDAp LCBmaWVsZDEpOworICBDSEVDS19WQUxVRSAoZ2NjX2ppdF9zdHJ1Y3RfZ2V0X2ZpZWxkKHN0cnVj dF90eXBlLCAxKSwgZmllbGQyKTsKKyAgQ0hFQ0sgKCFnY2Nfaml0X3R5cGVfaXNfc3RydWN0KGRv dWJsZV90eXBlKSk7CisgIGdjY19qaXRfc3RydWN0ICpzdHJ1Y3RfdHkgPSBnY2Nfaml0X3R5cGVf aXNfc3RydWN0KGdjY19qaXRfc3RydWN0X2FzX3R5cGUoc3RydWN0X3R5cGUpKTsKKyAgQ0hFQ0tf VkFMVUUgKHN0cnVjdF90eSwgc3RydWN0X3R5cGUpOworCisgIENIRUNLICghZ2NjX2ppdF90eXBl X2lzX2FycmF5KGRvdWJsZV90eXBlKSk7CisgIGdjY19qaXRfdHlwZSogYXJyYXlfdHlwZSA9IGdj Y19qaXRfY29udGV4dF9uZXdfYXJyYXlfdHlwZShjdHh0LCBOVUxMLCBkb3VibGVfdHlwZSwgMSk7 CisgIENIRUNLX1ZBTFVFIChnY2Nfaml0X3R5cGVfaXNfYXJyYXkoYXJyYXlfdHlwZSksIGRvdWJs ZV90eXBlKTsKK30KKwotLSAKMi4zMS4xCgo= --=-zcRM2rzc8XQu9QUjPBh9--