From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 5521 invoked by alias); 18 May 2011 08:58:18 -0000 Received: (qmail 5489 invoked by uid 22791); 18 May 2011 08:58:09 -0000 X-SWARE-Spam-Status: No, hits=-0.2 required=5.0 tests=AWL,BAYES_05,DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,FREEMAIL_FROM,KAM_STOCKGEN,RCVD_IN_DNSWL_LOW,RFC_ABUSE_POST,TW_BJ,TW_BP,TW_EG,TW_GJ,TW_YB X-Spam-Check-By: sourceware.org Received: from mail-vx0-f169.google.com (HELO mail-vx0-f169.google.com) (209.85.220.169) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Wed, 18 May 2011 08:57:47 +0000 Received: by vxk20 with SMTP id 20so1226107vxk.0 for ; Wed, 18 May 2011 01:57:46 -0700 (PDT) Received: by 10.52.179.162 with SMTP id dh2mr2198021vdc.158.1305709066311; Wed, 18 May 2011 01:57:46 -0700 (PDT) MIME-Version: 1.0 Received: by 10.220.188.139 with HTTP; Wed, 18 May 2011 01:57:26 -0700 (PDT) In-Reply-To: References: From: Kevin Pouget Date: Wed, 18 May 2011 08:58:00 -0000 Message-ID: Subject: Re: [RFC] Python Finish Breakpoints To: Doug Evans Cc: gdb@sourceware.org, pmuldoon@redhat.com Content-Type: multipart/mixed; boundary=bcaec5014c4713d6c304a3891550 X-IsSubscribed: yes Mailing-List: contact gdb-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-owner@sourceware.org X-SW-Source: 2011-05/txt/msg00084.txt.bz2 --bcaec5014c4713d6c304a3891550 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable Content-length: 21580 Hello, I've included with this mail a complete patch build agains the current HEAD, and checked that there was no regression in the testsuite Kevin On Mon, May 16, 2011 at 7:23 AM, Kevin Pouget wrot= e: > Hello, > > I prepared some tests which show the behavior of this new Breakpoint > type in various environment: > - normal termination, forced termination (gdb return) > - longjmp > - c++ exception > - breakpoint condition > > there is two bits which differs from what I expected, in the > breakpoint conditions > > * setting a BP in a DUMMY_FRAME: the `stop' function will be triggerd, > but it's return value (stop or continue/booleans) won't be taken into > account. I'm not sure whether the kind of FinishBreakpoint should be > forbidden or not, because I may want to track ALL the calls to that > function, including GDB inferior calls > > * the "normal_stop" notification if not triggered during condition > evaluation, so the `out_of_scope_notif' flag is not turn off (more > generally, the notification should be disabled when the breakpoint is > hit, and not when GDB stops) > > > otherwise, for c++ exception, the return PC of a frame surrounded by a > try/catch is at the end of the catch, so with > try { fct_1() } catch { ... }, a FinishBreakpoint in fct_1 will be > correcty catch, but it won't work for function nested within fct_1. > > > > Does this testsuite match your expectations, or would you like it to > be more advanced? (I'll need more hints in this case) > > > cordially, > > Kevin > > > diff --git a/gdb/testsuite/gdb.python/py-finish-breakpoint-cc.cc > b/gdb/testsuite/gdb.python/py-finish-breakpoint-cc.cc > new file mode 100644 > index 0000000..a0eea06 > --- /dev/null > +++ b/gdb/testsuite/gdb.python/py-finish-breakpoint-cc.cc > @@ -0,0 +1,59 @@ > +/* This testcase is part of GDB, the GNU debugger. > + > + =A0 Copyright 2011 Free Software Foundation, Inc. > + > + =A0 This program is free software; you can redistribute it and/or modify > + =A0 it under the terms of the GNU General Public License as published by > + =A0 the Free Software Foundation; either version 3 of the License, or > + =A0 (at your option) any later version. > + > + =A0 This program is distributed in the hope that it will be useful, > + =A0 but WITHOUT ANY WARRANTY; without even the implied warranty of > + =A0 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. =A0See the > + =A0 GNU General Public License for more details. > + > + =A0 You should have received a copy of the GNU General Public License > + =A0 along with this program. =A0If not, see =A0. > +*/ > + > + > +#include > + > +void > +throw_exception_1 (int e) > +{ > + =A0throw new int (e); > +} > + > +void > +throw_exception (int e) > +{ > + =A0throw_exception_1 (e); > +} > + > +int > +main (void) > +{ > + =A0int i; > + =A0try > + =A0 =A0{ > + =A0 =A0 =A0throw_exception_1 (10); > + =A0 =A0} > + =A0catch (const int *e) > + =A0 =A0{ > + =A0 =A0 =A0 =A0std::cerr << "Exception #" << *e << std::endl; > + =A0 =A0} > + =A0i +=3D 1; /* Break after exception 1. =A0*/ > + > + =A0try > + =A0 =A0{ > + =A0 =A0 =A0throw_exception (10); > + =A0 =A0} > + =A0catch (const int *e) > + =A0 =A0{ > + =A0 =A0 =A0 =A0std::cerr << "Exception #" << *e << std::endl; > + =A0 =A0} > + =A0i +=3D 1; /* Break after exception 2. =A0*/ > + > + =A0return i; > +} > diff --git a/gdb/testsuite/gdb.python/py-finish-breakpoint-cc.exp > b/gdb/testsuite/gdb.python/py-finish-breakpoint-cc.exp > new file mode 100644 > index 0000000..e74023d > --- /dev/null > +++ b/gdb/testsuite/gdb.python/py-finish-breakpoint-cc.exp > @@ -0,0 +1,59 @@ > +# Copyright (C) 2011 Free Software Foundation, Inc. > +# > +# This program is free software; you can redistribute it and/or modify > +# it under the terms of the GNU General Public License as published by > +# the Free Software Foundation; either version 3 of the License, or > +# (at your option) any later version. > +# > +# This program is distributed in the hope that it will be useful, > +# but WITHOUT ANY WARRANTY; without even the implied warranty of > +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. =A0See the > +# GNU General Public License for more details. > +# > +# You should have received a copy of the GNU General Public License > +# along with this program. =A0If not, see . > + > +# This file is part of the GDB testsuite. =A0It tests the mechanism > +# exposing values to Python. > + > +if $tracelevel then { > + =A0 =A0strace $tracelevel > +} > + > +load_lib gdb-python.exp > + > +set testfile "py-finish-breakpoint-cc" > +set srcfile ${testfile}.cc > +set binfile ${objdir}/${subdir}/${testfile} > +set pyfile =A0${srcdir}/${subdir}/${testfile}.py > + > +# Start with a fresh gdb. > +gdb_exit > +gdb_start > +gdb_reinitialize_dir $srcdir/$subdir > +gdb_load ${binfile} > + > +if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" > executable {debug c++}] !=3D "" } { > + =A0 =A0untested "Couldn't compile ${srcfile}" > + =A0 =A0return -1 > +} > + > +if ![runto_main] then { > + =A0 =A0fail "Cannot run to main." > + =A0 =A0return 0 > +} > + > +gdb_test "source $pyfile" ".*Python script imported.*" \ > + =A0 =A0 =A0 =A0 "import python scripts" > + > +gdb_test "break [gdb_get_line_number "Break after exception 1."]" > "Breakpoint.* at .*" \ > + =A0 =A0 =A0 =A0 "set watchdog after the exception 1" > +gdb_test "break [gdb_get_line_number "Break after exception 2."]" > "Breakpoint.* at .*" \ > + =A0 =A0 =A0 =A0 "set watchdog after the exception 2" > + > +gdb_test "python ExceptionBreakpoint()" "ExceptionBreakpoint init" > "set BP before throwing the exception" > +gdb_test "python print len(gdb.breakpoints())" "4" "check number of BPs" > +gdb_test "continue" ".*stopped at ExceptionFinishBreakpoint.*" "check > FinishBreakpoint in catch()" > +gdb_test "python print len(gdb.breakpoints())" "4" "check finish BP remo= val" > + > +gdb_test "continue" ".*exception did not finish.*" "FinishBreakpoint > with exception thrown not caught" > diff --git a/gdb/testsuite/gdb.python/py-finish-breakpoint-cc.py > b/gdb/testsuite/gdb.python/py-finish-breakpoint-cc.py > new file mode 100644 > index 0000000..d0dfe2f > --- /dev/null > +++ b/gdb/testsuite/gdb.python/py-finish-breakpoint-cc.py > @@ -0,0 +1,43 @@ > +# Copyright (C) 2011 Free Software Foundation, Inc. > + > +# This program is free software; you can redistribute it and/or modify > +# it under the terms of the GNU General Public License as published by > +# the Free Software Foundation; either version 3 of the License, or > +# (at your option) any later version. > +# > +# This program is distributed in the hope that it will be useful, > +# but WITHOUT ANY WARRANTY; without even the implied warranty of > +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. =A0See the > +# GNU General Public License for more details. > +# > +# You should have received a copy of the GNU General Public License > +# along with this program. =A0If not, see . > + > +# This file is part of the GDB testsuite. =A0It tests python Finish > +# Breakpoints. > + > +class ExceptionBreakpoint(gdb.Breakpoint): > + =A0 =A0def __init__(self): > + =A0 =A0 =A0 =A0gdb.Breakpoint.__init__(self, spec=3D"throw_exception_1"= , internal=3D1) > + =A0 =A0 =A0 =A0self.silent =3D True > + =A0 =A0 =A0 =A0print "ExceptionBreakpoint init" > + > + =A0 =A0def stop(self): > + =A0 =A0 =A0 =A0ExceptionFinishBreakpoint(gdb.newest_frame()) > + =A0 =A0 =A0 =A0return False > + > +class ExceptionFinishBreakpoint(gdb.FinishBreakpoint): > + =A0 =A0def __init__(self, frame): > + =A0 =A0 =A0 =A0gdb.FinishBreakpoint.__init__(self, frame, internal=3D1) > + =A0 =A0 =A0 =A0self.silent =3D True; > + > + =A0 =A0def stop(self): > + =A0 =A0 =A0 print "stopped at ExceptionFinishBreakpoint" > + =A0 =A0 =A0 gdb.post_event(self.delete) > + =A0 =A0 =A0 =A0return True > + > + =A0 =A0def out_of_scope(self): > + =A0 =A0 =A0 =A0print "exception did not finish ..." > + > + > +print "Python script imported" > diff --git a/gdb/testsuite/gdb.python/py-finish-breakpoint.c > b/gdb/testsuite/gdb.python/py-finish-breakpoint.c > new file mode 100644 > index 0000000..32b8b38 > --- /dev/null > +++ b/gdb/testsuite/gdb.python/py-finish-breakpoint.c > @@ -0,0 +1,82 @@ > +/* This testcase is part of GDB, the GNU debugger. > + > + =A0 Copyright 2011 Free Software Foundation, Inc. > + > + =A0 This program is free software; you can redistribute it and/or modify > + =A0 it under the terms of the GNU General Public License as published by > + =A0 the Free Software Foundation; either version 3 of the License, or > + =A0 (at your option) any later version. > + > + =A0 This program is distributed in the hope that it will be useful, > + =A0 but WITHOUT ANY WARRANTY; without even the implied warranty of > + =A0 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. =A0See the > + =A0 GNU General Public License for more details. > + > + =A0 You should have received a copy of the GNU General Public License > + =A0 along with this program. =A0If not, see =A0. > +*/ > +#include > + > +int increase_1(int *a) > +{ > + =A0*a +=3D 1; > + =A0return -5; > +} > + > +void increase(int *a) > +{ > + =A0increase_1(a); > +} > + > +int > +test_1(int i, int j) > +{ > + =A0return i =3D=3D j; > +} > + > +int > +test(int i, int j) > +{ > + =A0return test_1(i, j); > +} > + > +int > +call_longjmp_1 (jmp_buf *buf) > +{ > + =A0longjmp (*buf, 1); > +} > + > +int > +call_longjmp (jmp_buf *buf) > +{ > + =A0call_longjmp_1 (buf); > +} > + > + > +int main (int argc, char *argv[]) > +{ > + =A0jmp_buf env; > + =A0int foo =3D 5; > + =A0int bar =3D 42; > + =A0int i, j; > + > + =A0i =3D 0 ; > + =A0/* Break at increase. */ > + =A0increase (&i) ; > + =A0increase (&i) ; > + =A0increase (&i) ; > + > + =A0for (i =3D 0; i < 10; i++) > + =A0 =A0{ > + =A0 =A0 =A0j +=3D 1; /* Condition Break. */ > + =A0 =A0} > + > + =A0if (setjmp (env) =3D=3D 0) /* longjmp caught */ > + =A0 =A0{ > + =A0 =A0 =A0call_longjmp (&env); > + =A0 =A0} > + =A0else > + =A0 =A0 =A0 =A0 j +=3D 1; /* after longjmp. */ > + > + =A0return j; /* Break at end. */ > +} > diff --git a/gdb/testsuite/gdb.python/py-finish-breakpoint.exp > b/gdb/testsuite/gdb.python/py-finish-breakpoint.exp > new file mode 100644 > index 0000000..65eebc9 > --- /dev/null > +++ b/gdb/testsuite/gdb.python/py-finish-breakpoint.exp > @@ -0,0 +1,183 @@ > +# Copyright (C) 2011 Free Software Foundation, Inc. > +# > +# This program is free software; you can redistribute it and/or modify > +# it under the terms of the GNU General Public License as published by > +# the Free Software Foundation; either version 3 of the License, or > +# (at your option) any later version. > +# > +# This program is distributed in the hope that it will be useful, > +# but WITHOUT ANY WARRANTY; without even the implied warranty of > +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. =A0See the > +# GNU General Public License for more details. > +# > +# You should have received a copy of the GNU General Public License > +# along with this program. =A0If not, see . > + > +# This file is part of the GDB testsuite. =A0It tests the mechanism > +# exposing values to Python. > + > +if $tracelevel then { > + =A0 =A0strace $tracelevel > +} > + > +load_lib gdb-python.exp > + > +set testfile "py-finish-breakpoint" > +set srcfile ${testfile}.c > + > +if { [prepare_for_testing ${testfile}.exp ${testfile} ${srcfile}] } { > + =A0 =A0return -1 > +} > + > +set remote_python_file [remote_download host > ${srcdir}/${subdir}/${testfile}.py] > + > + > +# Skip all tests if Python scripting is not enabled. > +if { [skip_python_tests] } { continue } > + > +# > +# Test FinishBreakpoint in function returned by longjmp > +# > + > +clean_restart ${testfile} > + > +if ![runto call_longjmp_1] then { > + =A0 =A0perror "couldn't run to breakpoint call_longjmp" > + =A0 =A0continue > +} > + > +gdb_test "source $remote_python_file" ".*Python script imported.*" \ > + =A0 =A0 =A0 =A0 "import python scripts" > + > +gdb_test "python ljmpBP =3D LongjmpFinishBreakpoint(gdb.newest_frame())"= \ > + =A0 =A0 =A0 =A0 "LongjmpFinishBreakpoint init" \ > + =A0 =A0 =A0 =A0 "set finish breakpoint" > +gdb_test "break [gdb_get_line_number "after longjmp."]" "Breakpoint.* at= .*" \ > + =A0 =A0 =A0 =A0 "set BP after the jump" > +gdb_test "continue" ".*Longjmp didn't finish.*" "check FinishBP out > of scope notification" > + > +# > +# Test FinishBreakpoint in BP condition evaluation > +# (finish in dummy frame) > +# > + > +clean_restart ${testfile} > + > +set cond_line [gdb_get_line_number "Condition Break."] > +if ![runto_main] then { > + =A0 =A0fail "Cannot run to main." > + =A0 =A0return 0 > +} > + > +gdb_test "source $remote_python_file" ".*Python script imported.*" \ > + =A0 =A0 =A0 =A0 "import python scripts" > + > +gdb_test "break ${cond_line} if test_1(i,8)" ".*Breakpoint .* at .*" > "set conditional BP" > +gdb_test "python TestBreakpoint()" "TestBreakpoint init" "set BP in cond= ition" > + > + > +set msg "check FinishBreakpoint don't stop in GDB Dummy Frame" > +gdb_test_multiple "continue" $msg { > + =A0 =A0 =A0 -re ".*test don't stop 2.*test stop.*test don't stop 4.*" { > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 pass $msg > + =A0 =A0 =A0 } > + =A0 =A0 =A0 -re ".*test don't stop 2.*test stop.*$gdb_prompt" { > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 fail $msg > + =A0 =A0 =A0 } > +} > + > +gdb_test "print i" "8" "check stopped location" > + > +# > +# Test FinishBreakpoint in BP condition evaluation > +# (finish in normal frame) > +# > + > +clean_restart ${testfile} > + > +gdb_test "source $remote_python_file" ".*Python script imported.*" \ > + =A0 =A0 =A0 =A0 "import python scripts" > + > +if ![runto_main] then { > + =A0 =A0fail "Cannot run to main." > + =A0 =A0return 0 > +} > + > +gdb_test "break ${cond_line} if test(i,8)" ".*Breakpoint .* at .*" > "set conditional BP" > +gdb_test "python TestBreakpoint()" "TestBreakpoint init" "set BP in cond= ition" > + > +gdb_test "continue" ".*test don't stop 1.*test don't stop 2.*test > stop.*Error in testing breakpoint condition.*The program being > debugged stopped while in a function called from GDB.*" \ > + =A0 =A0 =A0 =A0 "stop in condition function" > + > +setup_kfail "normal_stop_notification not triggered during condition > evaluation" *-*-* > +gdb_test "python print gdb.breakpoints()\[2\].out_of_scope_notif" > ".*False.*" "check out_of_scope notification disabled" > +gdb_test_no_output "python gdb.breakpoints()\[2\].out_of_scope_notif > =3D False" "reestablish correct value" > + > +gdb_test "continue" "Continuing.*" "finish condition evaluation" > +gdb_test "continue" "Breakpoint.*" "stop at conditional breakpoint" > +gdb_test "print i" "8" "check stopped location" > + > +# > +# Test FinishBreakpoint in normal conditions > +# > + > +clean_restart ${testfile} > + > +if ![runto_main] then { > + =A0 =A0fail "Cannot run to main." > + =A0 =A0return 0 > +} > +gdb_test_no_output "set confirm off" "disable confirmation" > +gdb_test "source $remote_python_file" ".*Python script imported.*" \ > + =A0 =A0 =A0 =A0 "import python scripts" > +gdb_test "python MyBreakpoint(\"increase_1\")" ".*Breakpoint 2.*" \ > + =A0 =A0 =A0 =A0 "create Python function breakpoint" > +gdb_test "continue" ".*Arrived at MyBreakpoint with 0.*" "check > MyBreakpoint hit" > + > +# set FinishBreakpoint > + > +gdb_test "python finishbp =3D MyFinishBreakpoint (gdb.parse_and_eval > (\"a\"), gdb.selected_frame ())" \ > + =A0 =A0 =A0 =A0 ".*Breakpoint 3.*" "set FinishBreakpoint" > +gdb_test "python print finishbp.out_of_scope_notif" ".*True.*" \ > + =A0 =A0 =A0 =A0 "check out_of_scope_notif at init" > +gdb_test "python print finishbp.return_value" ".*None.*" \ > + =A0 =A0 =A0 =A0 "check return_value at init" > + > +# check normal bp hit > + > +gdb_test "continue" ".*MyFinishBreakpoint stop with.*#0.*increase.*" \ > + =A0 =A0 =A0 =A0 "check MyFinishBreakpoint hit" > +gdb_test "python print finishbp.return_value" ".*-5.*" "check return_val= ue" > +gdb_test "python print finishbp.out_of_scope_notif" ".*False.*" \ > + =A0 =A0 =A0 =A0 "check out_of_scope_notif disabled after hit" > +gdb_test "finish" ".*main.*" "return to main()" > +gdb_test "python print finishbp.return_value" ".*None.*" "check return_v= alue" > + > +# check forced return / check out of scpop > +gdb_test_no_output "python finishbp.out_of_scope_notif =3D True" \ > + =A0 =A0 =A0 =A0 "re-enable out_of_scope_notif" > + > +gdb_test "continue" ".*Arrived at MyBreakpoint with.*" "check > MyBreakpoint second hit" > +gdb_test "up" ".*increase_1.*" "go one frame up" > +gdb_test_no_output "return" "return from the frame" > +gdb_test "python print finishbp.check_scope()" ".*MyFinishBreakpoint > out of scope.*True.*" \ > + =A0 =A0 =A0 =A0 "go one frame up" > + > +# check forced return / automatic notification > + > +gdb_test_no_output "python finishbp.out_of_scope_notif =3D True" \ > + =A0 =A0 =A0 =A0 "re-enable out_of_scope_notif" > + > +gdb_test "continue" ".*Arrived at MyBreakpoint with.*" "check > MyBreakpoint third hit" > +gdb_test "up" ".*increase_1.*" "go one frame up" > +gdb_test_no_output "return" "return from the frame" > +gdb_test "next" ".*MyFinishBreakpoint out of scope.*" "check Finish > breakpoint discard" > +gdb_test "python print finishbp.out_of_scope_notif" ".*False.*" > "check out_of_scope_notif" > + > +# check FinishBreakpoint in main > + > +gdb_test "python MyFinishBreakpoint (None, gdb.selected_frame ())" \ > + =A0 =A0 =A0 =A0 ".*ValueError: \"FinishBreakpoint\" not meaningful in t= he > outermost frame..*" \ > + =A0 =A0 =A0 =A0 "check FinishBP not allowed in main" > + > + > diff --git a/gdb/testsuite/gdb.python/py-finish-breakpoint.py > b/gdb/testsuite/gdb.python/py-finish-breakpoint.py > new file mode 100644 > index 0000000..f014cc6 > --- /dev/null > +++ b/gdb/testsuite/gdb.python/py-finish-breakpoint.py > @@ -0,0 +1,85 @@ > +# Copyright (C) 2011 Free Software Foundation, Inc. > + > +# This program is free software; you can redistribute it and/or modify > +# it under the terms of the GNU General Public License as published by > +# the Free Software Foundation; either version 3 of the License, or > +# (at your option) any later version. > +# > +# This program is distributed in the hope that it will be useful, > +# but WITHOUT ANY WARRANTY; without even the implied warranty of > +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. =A0See the > +# GNU General Public License for more details. > +# > +# You should have received a copy of the GNU General Public License > +# along with this program. =A0If not, see . > + > +# This file is part of the GDB testsuite. =A0It tests python Finish > +# Breakpoints. > + > +class MyBreakpoint(gdb.Breakpoint): > + =A0 =A0 =A0 def stop(self): > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 val =3D gdb.parse_and_eval ("a") > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 print "Arrived at MyBreakpoint with %d" % i= nt(val.dereference()) > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 return True > + > +class MyFinishBreakpoint(gdb.FinishBreakpoint): > + =A0 =A0 =A0 def __init__(self, val, frame): > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 super (MyFinishBreakpoint, self).__init__ (= frame) > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 print "MyFinishBreakpoint init" > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 self.val =3D val > + > + =A0 =A0 =A0 def stop(self): > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 print "MyFinishBreakpoint stop with %d" % i= nt(self.val.dereference()) > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 gdb.execute("where 1") > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 return True > + > + =A0 =A0 =A0 def out_of_scope(self): > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 print "MyFinishBreakpoint out of scope..." > + > +test_finish_bp =3D None > +class TestBreakpoint(gdb.Breakpoint): > + =A0 =A0def __init__(self): > + =A0 =A0 =A0 =A0gdb.Breakpoint.__init__(self, spec=3D"test_1", internal= =3D1) > + =A0 =A0 =A0 =A0self.silent =3D True > + =A0 =A0 =A0 =A0self.finish =3D None > + =A0 =A0 =A0 =A0print "TestBreakpoint init" > + > + =A0 =A0def stop(self): > + =A0 =A0 =A0 global test_finish_bp > + =A0 =A0 =A0 =A0if (self.finish =3D=3D None): > + =A0 =A0 =A0 =A0 =A0 =A0self.finish =3D TestFinishBreakpoint(gdb.newest_= frame()) > + =A0 =A0 =A0 =A0 =A0 =A0test_finish_bp =3D self.finish > + =A0 =A0 =A0 =A0return False > + > + > +class TestFinishBreakpoint(gdb.FinishBreakpoint): > + =A0 =A0def __init__(self, frame): > + =A0 =A0 =A0 =A0gdb.FinishBreakpoint.__init__(self, frame, internal=3D1) > + =A0 =A0 =A0 =A0self.count =3D 0 > + > + =A0 =A0def stop(self): > + =A0 =A0 =A0 =A0self.count +=3D 1 > + =A0 =A0 =A0 =A0if (self.count =3D=3D 3): > + =A0 =A0 =A0 =A0 =A0 =A0print "test stop ..." > + =A0 =A0 =A0 =A0 =A0 =A0return True > + =A0 =A0 =A0 =A0else: > + =A0 =A0 =A0 =A0 =A0 =A0print "test don't stop %d" % self.count > + =A0 =A0 =A0 =A0 =A0 =A0return False > + > + > + =A0 =A0def out_of_scope(self): > + =A0 =A0 =A0 =A0print "test didn't finish ..." > + > +class LongjmpFinishBreakpoint(gdb.FinishBreakpoint): > + =A0 =A0 =A0 def __init__(self, frame): > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 gdb.FinishBreakpoint.__init__(self, frame, = internal=3D1) > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 print "LongjmpFinishBreakpoint init" > + > + =A0 =A0 =A0 def stop(self): > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 print "Stopped at LongjmpFinishBreakpoint" > + > + > + =A0 =A0 =A0 def out_of_scope(self): > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 print "Longjmp didn't finish ..." > + > +print "Python script imported" > -- > 1.7.4.4 > --bcaec5014c4713d6c304a3891550 Content-Type: text/plain; charset=US-ASCII; name="0001-Python-Finish-Breakpoints.txt" Content-Disposition: attachment; filename="0001-Python-Finish-Breakpoints.txt" Content-Transfer-Encoding: base64 X-Attachment-Id: f_gnudkj3s0 Content-length: 68882 RnJvbSA3MzVkZGYxZDQ4ZTk0NTUzZDQwMWQzOWFmYzNiNDlmYjFiNGU4OThl IE1vbiBTZXAgMTcgMDA6MDA6MDAgMjAwMQpGcm9tOiBLZXZpbiBQb3VnZXQg PGtldmluLnBvdWdldEBzdC5jb20+CkRhdGU6IFRodSwgMTIgTWF5IDIwMTEg MTU6NTU6NTQgLTA0MDAKU3ViamVjdDogW1BBVENIXSBQeXRob24gRmluaXNo IEJyZWFrcG9pbnRzCgotLS0KIGdkYi9NYWtlZmlsZS5pbiAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgNiArCiBnZGIvYnJlYWtw b2ludC5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAg IDIgKy0KIGdkYi9icmVha3BvaW50LmggICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIHwgICAxMCArCiBnZGIvaW5mY21kLmMgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgMjAgKy0KIGdkYi9p bmZlcmlvci5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg IHwgICAgMyArCiBnZGIvaW5mcnVuLmMgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICB8ICAgIDQgKy0KIGdkYi9weXRob24vcHktYnJl YWtwb2ludC5jICAgICAgICAgICAgICAgICAgICAgICAgIHwgICA0MCArLS0K IGdkYi9weXRob24vcHktZmluaXNoYnJlYWtwb2ludC5jICAgICAgICAgICAg ICAgICAgIHwgIDQ0NyArKysrKysrKysrKysrKysrKysrKwogZ2RiL3B5dGhv bi9weS1mcmFtZS5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAg IDMyICstCiBnZGIvcHl0aG9uL3B5dGhvbi1pbnRlcm5hbC5oICAgICAgICAg ICAgICAgICAgICAgICB8ICAgNDQgKystCiBnZGIvcHl0aG9uL3B5dGhvbi5j ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgIDYgKwogZ2Ri L3B5dGhvbi9weXRob24uaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgfCAgICAyICsKIGdkYi90ZXN0c3VpdGUvZ2RiLnB5dGhvbi9weS1icmVh a3BvaW50LmV4cCAgICAgICAgIHwgICAgNyArLQogLi4uL2dkYi5weXRob24v cHktZmluaXNoLWJyZWFrcG9pbnQtY2MuY2MgICAgICAgICAgfCAgIDU5ICsr KwogLi4uL2dkYi5weXRob24vcHktZmluaXNoLWJyZWFrcG9pbnQtY2MuZXhw ICAgICAgICAgfCAgIDU5ICsrKwogLi4uL2dkYi5weXRob24vcHktZmluaXNo LWJyZWFrcG9pbnQtY2MucHkgICAgICAgICAgfCAgIDQzICsrCiBnZGIvdGVz dHN1aXRlL2dkYi5weXRob24vcHktZmluaXNoLWJyZWFrcG9pbnQuYyAgICB8 ICAgODIgKysrKwogZ2RiL3Rlc3RzdWl0ZS9nZGIucHl0aG9uL3B5LWZpbmlz aC1icmVha3BvaW50LmV4cCAgfCAgMTgzICsrKysrKysrCiBnZGIvdGVzdHN1 aXRlL2dkYi5weXRob24vcHktZmluaXNoLWJyZWFrcG9pbnQucHkgICB8ICAg ODUgKysrKwogMTkgZmlsZXMgY2hhbmdlZCwgMTA3MCBpbnNlcnRpb25zKCsp LCA2NCBkZWxldGlvbnMoLSkKIGNyZWF0ZSBtb2RlIDEwMDY0NCBnZGIvcHl0 aG9uL3B5LWZpbmlzaGJyZWFrcG9pbnQuYwogY3JlYXRlIG1vZGUgMTAwNjQ0 IGdkYi90ZXN0c3VpdGUvZ2RiLnB5dGhvbi9weS1maW5pc2gtYnJlYWtwb2lu dC1jYy5jYwogY3JlYXRlIG1vZGUgMTAwNjQ0IGdkYi90ZXN0c3VpdGUvZ2Ri LnB5dGhvbi9weS1maW5pc2gtYnJlYWtwb2ludC1jYy5leHAKIGNyZWF0ZSBt b2RlIDEwMDY0NCBnZGIvdGVzdHN1aXRlL2dkYi5weXRob24vcHktZmluaXNo LWJyZWFrcG9pbnQtY2MucHkKIGNyZWF0ZSBtb2RlIDEwMDY0NCBnZGIvdGVz dHN1aXRlL2dkYi5weXRob24vcHktZmluaXNoLWJyZWFrcG9pbnQuYwogY3Jl YXRlIG1vZGUgMTAwNjQ0IGdkYi90ZXN0c3VpdGUvZ2RiLnB5dGhvbi9weS1m aW5pc2gtYnJlYWtwb2ludC5leHAKIGNyZWF0ZSBtb2RlIDEwMDY0NCBnZGIv dGVzdHN1aXRlL2dkYi5weXRob24vcHktZmluaXNoLWJyZWFrcG9pbnQucHkK CmRpZmYgLS1naXQgYS9nZGIvTWFrZWZpbGUuaW4gYi9nZGIvTWFrZWZpbGUu aW4KaW5kZXggNWJhYjM2MC4uMjUwNzkzOCAxMDA2NDQKLS0tIGEvZ2RiL01h a2VmaWxlLmluCisrKyBiL2dkYi9NYWtlZmlsZS5pbgpAQCAtMjg1LDYgKzI4 NSw3IEBAIFNVQkRJUl9QWVRIT05fT0JTID0gXAogCXB5LWV2dHJlZ2lzdHJ5 Lm8gXAogCXB5LWV2dHMubyBcCiAJcHktZXhpdGVkZXZlbnQubyBcCisJcHkt ZmluaXNoYnJlYWtwb2ludC5vIFwKIAlweS1mcmFtZS5vIFwKIAlweS1mdW5j dGlvbi5vIFwKIAlweS1pbmZlcmlvci5vIFwKQEAgLTMxNSw2ICszMTYsNyBA QCBTVUJESVJfUFlUSE9OX1NSQ1MgPSBcCiAJcHl0aG9uL3B5LWV2dHJlZ2lz dHJ5LmMgXAogCXB5dGhvbi9weS1ldnRzLmMgXAogCXB5dGhvbi9weS1leGl0 ZWRldmVudC5jIFwKKwlweXRob24vcHktZmluaXNoYnJlYWtwb2ludC5jIFwK IAlweXRob24vcHktZnJhbWUuYyBcCiAJcHl0aG9uL3B5LWZ1bmN0aW9uLmMg XAogCXB5dGhvbi9weS1pbmZlcmlvci5jIFwKQEAgLTIwNjIsNiArMjA2NCwx MCBAQCBweS1leGl0ZWRldmVudC5vOiAkKHNyY2RpcikvcHl0aG9uL3B5LWV4 aXRlZGV2ZW50LmMKIAkkKENPTVBJTEUpICQoUFlUSE9OX0NGTEFHUykgJChz cmNkaXIpL3B5dGhvbi9weS1leGl0ZWRldmVudC5jCiAJJChQT1NUQ09NUElM RSkKIAorcHktZmluaXNoYnJlYWtwb2ludC5vOiAkKHNyY2RpcikvcHl0aG9u L3B5LWZpbmlzaGJyZWFrcG9pbnQuYworCSQoQ09NUElMRSkgJChQWVRIT05f Q0ZMQUdTKSAkKHNyY2RpcikvcHl0aG9uL3B5LWZpbmlzaGJyZWFrcG9pbnQu YworCSQoUE9TVENPTVBJTEUpCisKIHB5LWZyYW1lLm86ICQoc3JjZGlyKS9w eXRob24vcHktZnJhbWUuYwogCSQoQ09NUElMRSkgJChQWVRIT05fQ0ZMQUdT KSAkKHNyY2RpcikvcHl0aG9uL3B5LWZyYW1lLmMKIAkkKFBPU1RDT01QSUxF KQpkaWZmIC0tZ2l0IGEvZ2RiL2JyZWFrcG9pbnQuYyBiL2dkYi9icmVha3Bv aW50LmMKaW5kZXggYjVmYzQ0OC4uZWZmNWUyMyAxMDA2NDQKLS0tIGEvZ2Ri L2JyZWFrcG9pbnQuYworKysgYi9nZGIvYnJlYWtwb2ludC5jCkBAIC03MzMw LDcgKzczMzAsNyBAQCBicF9sb2NfaXNfcGVybWFuZW50IChzdHJ1Y3QgYnBf bG9jYXRpb24gKmxvYykKICAgIGFzIHRleHR1YWwgZGVzY3JpcHRpb24gb2Yg dGhlIGxvY2F0aW9uLCBhbmQgQ09ORF9TVFJJTkcKICAgIGFzIGNvbmRpdGlv biBleHByZXNzaW9uLiAgKi8KIAotc3RhdGljIHZvaWQKK3ZvaWQKIGNyZWF0 ZV9icmVha3BvaW50X3NhbCAoc3RydWN0IGdkYmFyY2ggKmdkYmFyY2gsCiAJ CSAgICAgICBzdHJ1Y3Qgc3ltdGFic19hbmRfbGluZXMgc2FscywgY2hhciAq YWRkcl9zdHJpbmcsCiAJCSAgICAgICBjaGFyICpjb25kX3N0cmluZywKZGlm ZiAtLWdpdCBhL2dkYi9icmVha3BvaW50LmggYi9nZGIvYnJlYWtwb2ludC5o CmluZGV4IDdhOWMyZDQuLmEwMDM2NTEgMTAwNjQ0Ci0tLSBhL2dkYi9icmVh a3BvaW50LmgKKysrIGIvZ2RiL2JyZWFrcG9pbnQuaApAQCAtOTg2LDYgKzk4 NiwxNiBAQCBleHRlcm4gaW50IGNyZWF0ZV9icmVha3BvaW50IChzdHJ1Y3Qg Z2RiYXJjaCAqZ2RiYXJjaCwgY2hhciAqYXJnLAogCQkJICAgICAgaW50IGVu YWJsZWQsCiAJCQkgICAgICBpbnQgaW50ZXJuYWwpOwogCitleHRlcm4gdm9p ZCBjcmVhdGVfYnJlYWtwb2ludF9zYWwgKHN0cnVjdCBnZGJhcmNoICpnZGJh cmNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1 Y3Qgc3ltdGFic19hbmRfbGluZXMgc2FscywgCisgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgIGNoYXIgKmFkZHJfc3RyaW5nLAorICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICpjb25kX3N0cmlu ZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW51bSBi cHR5cGUgdHlwZSwgZW51bSBicGRpc3AgZGlzcG9zaXRpb24sCisgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0aHJlYWQsIGludCB0 YXNrLCBpbnQgaWdub3JlX2NvdW50LAorICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICBzdHJ1Y3QgYnJlYWtwb2ludF9vcHMgKm9wcywgaW50 IGZyb21fdHR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICBpbnQgZW5hYmxlZCwgaW50IGludGVybmFsLCAKKyAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgaW50IGRpc3BsYXlfY2Fub25pY2FsKTsK KwogZXh0ZXJuIHZvaWQgaW5zZXJ0X2JyZWFrcG9pbnRzICh2b2lkKTsKIAog ZXh0ZXJuIGludCByZW1vdmVfYnJlYWtwb2ludHMgKHZvaWQpOwpkaWZmIC0t Z2l0IGEvZ2RiL2luZmNtZC5jIGIvZ2RiL2luZmNtZC5jCmluZGV4IGZjZTFl OGYuLjFiOGM2MTIgMTAwNjQ0Ci0tLSBhL2dkYi9pbmZjbWQuYworKysgYi9n ZGIvaW5mY21kLmMKQEAgLTEzNzgsMTQgKzEzNzgsMTIgQEAgYWR2YW5jZV9j b21tYW5kIChjaGFyICphcmcsIGludCBmcm9tX3R0eSkKICAgdW50aWxfYnJl YWtfY29tbWFuZCAoYXJnLCBmcm9tX3R0eSwgMSk7CiB9CiAMCi0vKiBQcmlu dCB0aGUgcmVzdWx0IG9mIGEgZnVuY3Rpb24gYXQgdGhlIGVuZCBvZiBhICdm aW5pc2gnIGNvbW1hbmQuICAqLworLyogUmV0dXJucyB0aGUgdmFsdWUgb2Yg dGhlIHJlc3VsdCBhdCB0aGUgZW5kIG9mIGEgJ2ZpbmlzaCcgY29tbWFuZC9C UC4gICovCiAKLXN0YXRpYyB2b2lkCi1wcmludF9yZXR1cm5fdmFsdWUgKHN0 cnVjdCB0eXBlICpmdW5jX3R5cGUsIHN0cnVjdCB0eXBlICp2YWx1ZV90eXBl KQorc3RydWN0IHZhbHVlICoKK2dldF9yZXR1cm5fdmFsdWUgKHN0cnVjdCB0 eXBlICpmdW5jX3R5cGUsIHN0cnVjdCB0eXBlICp2YWx1ZV90eXBlKQogewog ICBzdHJ1Y3QgZ2RiYXJjaCAqZ2RiYXJjaCA9IGdldF9yZWdjYWNoZV9hcmNo IChzdG9wX3JlZ2lzdGVycyk7Ci0gIHN0cnVjdCBjbGVhbnVwICpvbGRfY2hh aW47Ci0gIHN0cnVjdCB1aV9zdHJlYW0gKnN0YjsKICAgc3RydWN0IHZhbHVl ICp2YWx1ZTsKIAogICBDSEVDS19UWVBFREVGICh2YWx1ZV90eXBlKTsKQEAg LTE0MTUsNiArMTQxMywxOCBAQCBwcmludF9yZXR1cm5fdmFsdWUgKHN0cnVj dCB0eXBlICpmdW5jX3R5cGUsIHN0cnVjdCB0eXBlICp2YWx1ZV90eXBlKQog ICAgICAgaW50ZXJuYWxfZXJyb3IgKF9fRklMRV9fLCBfX0xJTkVfXywgXygi YmFkIHN3aXRjaCIpKTsKICAgICB9CiAKKyAgcmV0dXJuIHZhbHVlOworfQor CisvKiBQcmludCB0aGUgcmVzdWx0IG9mIGEgZnVuY3Rpb24gYXQgdGhlIGVu ZCBvZiBhICdmaW5pc2gnIGNvbW1hbmQuICAqLworCitzdGF0aWMgdm9pZAor cHJpbnRfcmV0dXJuX3ZhbHVlIChzdHJ1Y3QgdHlwZSAqZnVuY190eXBlLCBz dHJ1Y3QgdHlwZSAqdmFsdWVfdHlwZSkKK3sKKyAgc3RydWN0IHZhbHVlICp2 YWx1ZSA9IGdldF9yZXR1cm5fdmFsdWUoZnVuY190eXBlLCB2YWx1ZV90eXBl KTsKKyAgc3RydWN0IGNsZWFudXAgKm9sZF9jaGFpbjsKKyAgc3RydWN0IHVp X3N0cmVhbSAqc3RiOworCiAgIGlmICh2YWx1ZSkKICAgICB7CiAgICAgICBz dHJ1Y3QgdmFsdWVfcHJpbnRfb3B0aW9ucyBvcHRzOwpkaWZmIC0tZ2l0IGEv Z2RiL2luZmVyaW9yLmggYi9nZGIvaW5mZXJpb3IuaAppbmRleCBmOGFkYjZj Li5iOGQ1YjEzIDEwMDY0NAotLS0gYS9nZGIvaW5mZXJpb3IuaAorKysgYi9n ZGIvaW5mZXJpb3IuaApAQCAtMjg1LDYgKzI4NSw5IEBAIGV4dGVybiB2b2lk IGRldGFjaF9jb21tYW5kIChjaGFyICosIGludCk7CiAKIGV4dGVybiB2b2lk IG5vdGljZV9uZXdfaW5mZXJpb3IgKHB0aWRfdCwgaW50LCBpbnQpOwogCitl eHRlcm4gc3RydWN0IHZhbHVlICpnZXRfcmV0dXJuX3ZhbHVlIChzdHJ1Y3Qg dHlwZSAqZnVuY190eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgc3RydWN0IHR5cGUgKnZhbHVlX3R5cGUpOworCiAvKiBB ZGRyZXNzIGF0IHdoaWNoIGluZmVyaW9yIHN0b3BwZWQuICAqLwogCiBleHRl cm4gQ09SRV9BRERSIHN0b3BfcGM7CmRpZmYgLS1naXQgYS9nZGIvaW5mcnVu LmMgYi9nZGIvaW5mcnVuLmMKaW5kZXggMmQ2ZDUyMy4uM2NmMWNkNSAxMDA2 NDQKLS0tIGEvZ2RiL2luZnJ1bi5jCisrKyBiL2dkYi9pbmZydW4uYwpAQCAt NTQsNiArNTQsNyBAQAogI2luY2x1ZGUgImlubGluZS1mcmFtZS5oIgogI2lu Y2x1ZGUgImppdC5oIgogI2luY2x1ZGUgInRyYWNlcG9pbnQuaCIKKyNpbmNs dWRlICJweXRob24vcHl0aG9uLmgiCiAKIC8qIFByb3RvdHlwZXMgZm9yIGxv Y2FsIGZ1bmN0aW9ucyAqLwogCkBAIC01ODI2LDcgKzU4MjcsOCBAQCBub3Jt YWxfc3RvcCAodm9pZCkKIAogICAvKiBTYXZlIHRoZSBmdW5jdGlvbiB2YWx1 ZSByZXR1cm4gcmVnaXN0ZXJzLCBpZiB3ZSBjYXJlLgogICAgICBXZSBtaWdo dCBiZSBhYm91dCB0byByZXN0b3JlIHRoZWlyIHByZXZpb3VzIGNvbnRlbnRz LiAgKi8KLSAgaWYgKGluZmVyaW9yX3RocmVhZCAoKS0+Y29udHJvbC5wcm9j ZWVkX3RvX2ZpbmlzaCkKKyAgaWYgKGdkYnB5X2lzX3N0b3BwZWRfYXRfZmlu aXNoX2JwIChpbmZlcmlvcl90aHJlYWQgKCktPmNvbnRyb2wuc3RvcF9icHN0 YXQpCisgICAgICB8fCBpbmZlcmlvcl90aHJlYWQgKCktPmNvbnRyb2wucHJv Y2VlZF90b19maW5pc2gpCiAgICAgewogICAgICAgLyogVGhpcyBzaG91bGQg bm90IGJlIG5lY2Vzc2FyeS4gICovCiAgICAgICBpZiAoc3RvcF9yZWdpc3Rl cnMpCmRpZmYgLS1naXQgYS9nZGIvcHl0aG9uL3B5LWJyZWFrcG9pbnQuYyBi L2dkYi9weXRob24vcHktYnJlYWtwb2ludC5jCmluZGV4IDljMzM4NDguLmY5 YTNhOGYgMTAwNjQ0Ci0tLSBhL2dkYi9weXRob24vcHktYnJlYWtwb2ludC5j CisrKyBiL2dkYi9weXRob24vcHktYnJlYWtwb2ludC5jCkBAIC0zMSw1MiAr MzEsMTggQEAKICNpbmNsdWRlICJhcmNoLXV0aWxzLmgiCiAjaW5jbHVkZSAi bGFuZ3VhZ2UuaCIKIAotc3RhdGljIFB5VHlwZU9iamVjdCBicmVha3BvaW50 X29iamVjdF90eXBlOworUHlUeXBlT2JqZWN0IGJyZWFrcG9pbnRfb2JqZWN0 X3R5cGU7CiAKIC8qIE51bWJlciBvZiBsaXZlIGJyZWFrcG9pbnRzLiAgKi8K IHN0YXRpYyBpbnQgYnBweV9saXZlOwogCiAvKiBWYXJpYWJsZXMgdXNlZCB0 byBwYXNzIGluZm9ybWF0aW9uIGJldHdlZW4gdGhlIEJyZWFrcG9pbnQKICAg IGNvbnN0cnVjdG9yIGFuZCB0aGUgYnJlYWtwb2ludC1jcmVhdGVkIGhvb2sg ZnVuY3Rpb24uICAqLwotc3RhdGljIGJyZWFrcG9pbnRfb2JqZWN0ICpicHB5 X3BlbmRpbmdfb2JqZWN0OworYnJlYWtwb2ludF9vYmplY3QgKmJwcHlfcGVu ZGluZ19vYmplY3Q7CiAKIC8qIEZ1bmN0aW9uIHRoYXQgaXMgY2FsbGVkIHdo ZW4gYSBQeXRob24gY29uZGl0aW9uIGlzIGV2YWx1YXRlZC4gICovCiBzdGF0 aWMgY2hhciAqIGNvbnN0IHN0b3BfZnVuYyA9ICJzdG9wIjsKIAotc3RydWN0 IGJyZWFrcG9pbnRfb2JqZWN0Ci17Ci0gIFB5T2JqZWN0X0hFQUQKLQotICAv KiBUaGUgYnJlYWtwb2ludCBudW1iZXIgYWNjb3JkaW5nIHRvIGdkYi4gICov Ci0gIGludCBudW1iZXI7Ci0KLSAgLyogVGhlIGdkYiBicmVha3BvaW50IG9i amVjdCwgb3IgTlVMTCBpZiB0aGUgYnJlYWtwb2ludCBoYXMgYmVlbgotICAg ICBkZWxldGVkLiAgKi8KLSAgc3RydWN0IGJyZWFrcG9pbnQgKmJwOwotfTsK LQotLyogUmVxdWlyZSB0aGF0IEJSRUFLUE9JTlQgYmUgYSB2YWxpZCBicmVh a3BvaW50IElEOyB0aHJvdyBhIFB5dGhvbgotICAgZXhjZXB0aW9uIGlmIGl0 IGlzIGludmFsaWQuICAqLwotI2RlZmluZSBCUFBZX1JFUVVJUkVfVkFMSUQo QnJlYWtwb2ludCkJCQkJCVwKLSAgICBkbyB7CQkJCQkJCQlcCi0gICAgICBp ZiAoKEJyZWFrcG9pbnQpLT5icCA9PSBOVUxMKQkJCQkJXAotCXJldHVybiBQ eUVycl9Gb3JtYXQgKFB5RXhjX1J1bnRpbWVFcnJvciwgICAgICAgICAgICAg ICAgICAgICAgICBcCi0JCQkgICAgIF8oIkJyZWFrcG9pbnQgJWQgaXMgaW52 YWxpZC4iKSwJCVwKLQkJCSAgICAgKEJyZWFrcG9pbnQpLT5udW1iZXIpOwkJ CVwKLSAgICB9IHdoaWxlICgwKQotCi0vKiBSZXF1aXJlIHRoYXQgQlJFQUtQ T0lOVCBiZSBhIHZhbGlkIGJyZWFrcG9pbnQgSUQ7IHRocm93IGEgUHl0aG9u Ci0gICBleGNlcHRpb24gaWYgaXQgaXMgaW52YWxpZC4gIFRoaXMgbWFjcm8g aXMgZm9yIHVzZSBpbiBzZXR0ZXIgZnVuY3Rpb25zLiAgKi8KLSNkZWZpbmUg QlBQWV9TRVRfUkVRVUlSRV9WQUxJRChCcmVha3BvaW50KQkJCQlcCi0gICAg ZG8gewkJCQkJCQkJXAotICAgICAgaWYgKChCcmVha3BvaW50KS0+YnAgPT0g TlVMTCkJCQkJCVwKLSAgICAgICAgewkJCQkJCQkJXAotCSAgUHlFcnJfRm9y bWF0IChQeUV4Y19SdW50aW1lRXJyb3IsIF8oIkJyZWFrcG9pbnQgJWQgaXMg aW52YWxpZC4iKSwgXAotCQkJKEJyZWFrcG9pbnQpLT5udW1iZXIpOwkJCQlc Ci0JICByZXR1cm4gLTE7CQkJCQkJCVwKLQl9CQkJCQkJCQlcCi0gICAgfSB3 aGlsZSAoMCkKLQogLyogVGhpcyBpcyB1c2VkIHRvIGluaXRpYWxpemUgdmFy aW91cyBnZGIuYnBfKiBjb25zdGFudHMuICAqLwogc3RydWN0IHB5YnBfY29k ZQogewpAQCAtOTcxLDcgKzkzNyw3IEBAIHN0YXRpYyBQeU1ldGhvZERlZiBi cmVha3BvaW50X29iamVjdF9tZXRob2RzW10gPQogICB7IE5VTEwgfSAvKiBT ZW50aW5lbC4gICovCiB9OwogCi1zdGF0aWMgUHlUeXBlT2JqZWN0IGJyZWFr cG9pbnRfb2JqZWN0X3R5cGUgPQorUHlUeXBlT2JqZWN0IGJyZWFrcG9pbnRf b2JqZWN0X3R5cGUgPQogewogICBQeU9iamVjdF9IRUFEX0lOSVQgKE5VTEwp CiAgIDAsCQkJCSAgLypvYl9zaXplKi8KZGlmZiAtLWdpdCBhL2dkYi9weXRo b24vcHktZmluaXNoYnJlYWtwb2ludC5jIGIvZ2RiL3B5dGhvbi9weS1maW5p c2hicmVha3BvaW50LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAw MDAwMC4uZjY5OTI4ZQotLS0gL2Rldi9udWxsCisrKyBiL2dkYi9weXRob24v cHktZmluaXNoYnJlYWtwb2ludC5jCkBAIC0wLDAgKzEsNDQ3IEBACisvKiBQ eXRob24gaW50ZXJmYWNlIHRvIGZpbmlzaCBicmVha3BvaW50cworCisgICBD b3B5cmlnaHQgKEMpIDIwMTEgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJ bmMuCisKKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQi4KKworICAgVGhp cyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmli dXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBv ZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVk IGJ5CisgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIg dmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgorICAgKGF0IHlvdXIgb3B0 aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhpcyBwcm9ncmFtIGlz IGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2Vm dWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZl biB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZ IG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRo ZQorICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0 YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBv ZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgIGFsb25nIHdp dGggdGhpcyBwcm9ncmFtLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251 Lm9yZy9saWNlbnNlcy8+LiAgKi8KKworCisKKyNpbmNsdWRlICJkZWZzLmgi CisjaW5jbHVkZSAiZXhjZXB0aW9ucy5oIgorI2luY2x1ZGUgInB5dGhvbi1p bnRlcm5hbC5oIgorI2luY2x1ZGUgImJyZWFrcG9pbnQuaCIKKyNpbmNsdWRl ICJmcmFtZS5oIgorI2luY2x1ZGUgImdkYnRocmVhZC5oIgorI2luY2x1ZGUg ImFyY2gtdXRpbHMuaCIKKyNpbmNsdWRlICJsYW5ndWFnZS5oIgorI2luY2x1 ZGUgIm9ic2VydmVyLmgiCisjaW5jbHVkZSAiaW5mZXJpb3IuaCIKKworc3Rh dGljIFB5VHlwZU9iamVjdCBmaW5pc2hfYnJlYWtwb2ludF9vYmplY3RfdHlw ZTsKKworLyogRnVuY3Rpb24gdGhhdCBpcyBjYWxsZWQgd2hlbiBhIFB5dGhv biBmaW5pc2ggYnAgaXMgZm91bmQgb3V0IG9mIHNjb3BlLiAgKi8KK3N0YXRp YyBjaGFyICogY29uc3Qgb3V0b2ZzY29wZV9mdW5jID0gIm91dF9vZl9zY29w ZSI7CisKKy8qIHN0cnVjdCBpbXBsZW1lbnRpbmcgdGhlIGdkYi5GaW5pc2hC cmVha3BvaW50IG9iamVjdCBieSBleHRlbmRpbmcKKyAgIHRoZSBnZGIuQnJl YWtwb2ludCBjbGFzcy4gICovCitzdHJ1Y3QgZmluaXNoX2JyZWFrcG9pbnRf b2JqZWN0Cit7CisgIC8qIGdkYi5CcmVha3BvaW50IGJhc2UgY2xhc3MuICAq LworICBzdHJ1Y3QgYnJlYWtwb2ludF9vYmplY3QgcHlfYnA7CisgIC8qIEZs YWcgaW5kaWNhdGluZyB0aGF0IHRoZSBCUCBpcyBvdXQgb2YgdGhlIGNhbGxz dGFjayBhbmQgUHl0aG9uIGNhbGxiYWNrCisgICAgIGhhcyBiZWVuIHRyaWdn ZXJlZC4gICovCisgIGludCBvdXRfb2Zfc2NvcGVfbm90aWY7CisgIC8qIFRo ZSBmdW5jdGlvbiBmaW5pc2hlZCBieSB0aGlzIGJyZWFrcG9pbnQuICAqLwor ICBzdHJ1Y3Qgc3ltYm9sICpmdW5jdGlvbjsKK307CisKKy8qIFB5dGhvbiBm dW5jdGlvbiB0byBzZXQgdGhlICdvdXRfb2Zfc2NvcGVfbm90aWYnIGF0dHJp YnV0ZSBvZgorICAgRmluaXNoQnJlYWtwb2ludC4gICovCisKK3N0YXRpYyBp bnQKK2JwZmluaXNocHlfc2V0X291dG9mc2NvcGVfbm90aWYgKFB5T2JqZWN0 ICpzZWxmLCBQeU9iamVjdCAqbmV3dmFsdWUsCisgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICB2b2lkICpjbG9zdXJlKQoreworICBzdHJ1Y3Qg ZmluaXNoX2JyZWFrcG9pbnRfb2JqZWN0ICpzZWxmX2ZpbmlzaGJwID0KKyAg ICAgIChzdHJ1Y3QgZmluaXNoX2JyZWFrcG9pbnRfb2JqZWN0ICopIHNlbGY7 CisgIGludCBjbXA7CisKKyAgQlBQWV9TRVRfUkVRVUlSRV9WQUxJRCAoJnNl bGZfZmluaXNoYnAtPnB5X2JwKTsKKworICBpZiAobmV3dmFsdWUgPT0gTlVM TCkKKyAgICB7CisgICAgICBQeUVycl9TZXRTdHJpbmcgKFB5RXhjX1R5cGVF cnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIF8oIkNhbm5vdCBk ZWxldGUgYG91dF9vZl9zY29wZV9ub3RpZicgYXR0cmlidXRlLiIpKTsKKyAg ICAgIHJldHVybiAtMTsKKyAgICB9CisgIGVsc2UgaWYgKCFQeUJvb2xfQ2hl Y2sgKG5ld3ZhbHVlKSkKKyAgICB7CisgICAgICBQeUVycl9TZXRTdHJpbmcg KFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgXygiVGhl IHZhbHVlIG9mIGBvdXRfb2Zfc2NvcGVfbm90aWYnIG11c3QgYmUgYSBib29s ZWFuLiIpKTsKKyAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgY21wID0g UHlPYmplY3RfSXNUcnVlIChuZXd2YWx1ZSk7CisgIGlmIChjbXAgPCAwKQor ICAgIHJldHVybiAtMTsKKyAgZWxzZQorICAgIHNlbGZfZmluaXNoYnAtPm91 dF9vZl9zY29wZV9ub3RpZiA9IGNtcDsKKworICByZXR1cm4gMDsKK30KKwor LyogUHl0aG9uIGZ1bmN0aW9uIHRvIHVwZGF0ZSBhbmQgZ2V0IHRoZSAnb3V0 X29mX3Njb3BlX25vdGlmJworICAgYXR0cmlidXRlIG9mIEZpbmlzaEJyZWFr cG9pbnQuICAqLworCitzdGF0aWMgUHlPYmplY3QgKgorYnBmaW5pc2hweV9n ZXRfb3V0b2ZzY29wZV9ub3RpZiAoUHlPYmplY3QgKnNlbGYsIHZvaWQgKmNs b3N1cmUpCit7CisgIHN0cnVjdCBmaW5pc2hfYnJlYWtwb2ludF9vYmplY3Qg KnNlbGZfZmluaXNoYnAgPQorICAgICAgKHN0cnVjdCBmaW5pc2hfYnJlYWtw b2ludF9vYmplY3QgKikgc2VsZjsKKworICBCUFBZX1JFUVVJUkVfVkFMSUQg KCZzZWxmX2ZpbmlzaGJwLT5weV9icCk7CisKKyAgaWYgKHNlbGZfZmluaXNo YnAtPm91dF9vZl9zY29wZV9ub3RpZikKKyAgICBQeV9SRVRVUk5fVFJVRTsK KyAgUHlfUkVUVVJOX0ZBTFNFOworfQorCisvKiBQeXRob24gZnVuY3Rpb24g dG8gZ2V0IHRoZSAncmV0dXJuX3ZhbHVlJyBhdHRyaWJ1dGUgb2YKKyAgIEZp bmlzaEJyZWFrcG9pbnQuICAqLworCitzdGF0aWMgUHlPYmplY3QgKgorYnBm aW5pc2hweV9nZXRfcmV0dXJudmFsdWUgKFB5T2JqZWN0ICpzZWxmLCB2b2lk ICpjbG9zdXJlKQoreworICBzdHJ1Y3QgZmluaXNoX2JyZWFrcG9pbnRfb2Jq ZWN0ICpzZWxmX2ZpbmlzaGJwID0KKyAgICAgIChzdHJ1Y3QgZmluaXNoX2Jy ZWFrcG9pbnRfb2JqZWN0ICopIHNlbGY7CisKKyAgQlBQWV9SRVFVSVJFX1ZB TElEICgmc2VsZl9maW5pc2hicC0+cHlfYnApOworCisgIGlmIChzZWxmX2Zp bmlzaGJwLT5mdW5jdGlvbiA9PSBOVUxMKQorICAgIGdvdG8gcmV0dXJuX25v bmU7CisKKyAgLyogRW5zdXJlIHRoYXQgR0RCIGlzIHN0b3BwZWQgYXQgdGhp cyBGaW5pc2hCcmVha3BvaW50LiAgKi8KKyAgaWYgKGluZmVyaW9yX3RocmVh ZCAoKS0+Y29udHJvbC5zdG9wX2Jwc3RhdCAhPSBOVUxMKQorICAgIHsKKyAg ICAgIGJwc3RhdCBiczsKKworICAgICAgZm9yKGJzID0gaW5mZXJpb3JfdGhy ZWFkICgpLT5jb250cm9sLnN0b3BfYnBzdGF0OworICAgICAgICAgIGJzOyBi cyA9IGJzLT5uZXh0KQorICAgICAgICB7CisgICAgICAgICAgc3RydWN0IGJy ZWFrcG9pbnQgKmJwID0gYnMtPmJyZWFrcG9pbnRfYXQ7CisgICAgICAgICAg aWYgKGJwICE9IE5VTEwKKyAgICAgICAgICAgICAgJiYgKFB5T2JqZWN0ICop IGJwLT5weV9icF9vYmplY3QgPT0gc2VsZikKKyAgICAgICAgICAgIHsKKyAg ICAgICAgICAgICAgc3RydWN0IHR5cGUgKnZfdHlwZTsKKworICAgICAgICAg ICAgICB2X3R5cGUgPSBUWVBFX1RBUkdFVF9UWVBFIChTWU1CT0xfVFlQRQor ICAgICAgICAgICAgICAgICAgKHNlbGZfZmluaXNoYnAtPmZ1bmN0aW9uKSk7 CisgICAgICAgICAgICAgIGlmICghdl90eXBlKQorICAgICAgICAgICAgICAg IGludGVybmFsX2Vycm9yIChfX0ZJTEVfXywgX19MSU5FX18sCisgICAgICAg ICAgICAgICAgIF8oImJwZmluaXNocHlfZ2V0X3JldHVybnZhbHVlOiBmdW5j dGlvbiBoYXMgbm8gdGFyZ2V0IHR5cGUiKSk7CisKKyAgICAgICAgICAgICAg aWYgKFRZUEVfQ09ERSAodl90eXBlKSAhPSBUWVBFX0NPREVfVk9JRCkKKyAg ICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBzdHJ1Y3QgdmFs dWUgKnJldCA9IGdldF9yZXR1cm5fdmFsdWUKKyAgICAgICAgICAgICAgICAg ICAgICAoU1lNQk9MX1RZUEUgKHNlbGZfZmluaXNoYnAtPmZ1bmN0aW9uKSwg dl90eXBlKTsKKyAgICAgICAgICAgICAgICAgIFB5T2JqZWN0ICpyZXR1cm5f dmFsdWUgPSB2YWx1ZV90b192YWx1ZV9vYmplY3QgKHJldCk7CisKKyAgICAg ICAgICAgICAgICAgIFB5X0lOQ1JFRiAocmV0dXJuX3ZhbHVlKTsKKyAgICAg ICAgICAgICAgICAgIHJldHVybiByZXR1cm5fdmFsdWU7CisgICAgICAgICAg ICAgICAgfQorICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAg ICBnb3RvIHJldHVybl9ub25lOworICAgICAgICAgICAgfQorICAgICAgICB9 CisgICAgfQorCityZXR1cm5fbm9uZToKKyAgUHlfUkVUVVJOX05PTkU7Cit9 CisKKy8qIENhbGxlZCB3aGVuIEdEQiBub3RpY2VzIHRoYXQgdGhlIGZpbmlz aCBicmVha3BvaW50IEJQX09CSiBpcyBvdXQgb2YgCisgICB0aGUgY3VycmVu dCBjYWxsc3RhY2suIElmIEJQX09CSiBoYXMgdGhlIGF0dHJpYnV0ZSBPVVRf T0ZfU0NPUEVfTk9USUYKKyAgIGFuZCBpdHMgdmFsdWUgaXMgRkFMU0UsIHRy aWdnZXIgdGhlIG1ldGhvZCBPVVRfT0ZfU0NPUEUgYW5kIHNldCB0aGUgZmxh ZworICAgdG8gVFJVRS4gICovCisKK3N0YXRpYyB2b2lkCitnZGJweV9vdXRf b2Zfc2NvcGUgKHN0cnVjdCBmaW5pc2hfYnJlYWtwb2ludF9vYmplY3QgKmJw ZmluaXNoX29iaikKK3sKKyAgYnJlYWtwb2ludF9vYmplY3QgKmJwX29iaiA9 IChicmVha3BvaW50X29iamVjdCAqKSBicGZpbmlzaF9vYmo7CisgIFB5T2Jq ZWN0ICpweV9vYmogPSAoUHlPYmplY3QgKikgYnBfb2JqIDsKKyAgCisgIGJw ZmluaXNoX29iai0+b3V0X29mX3Njb3BlX25vdGlmID0gMDsKKworICBpZiAo UHlPYmplY3RfSGFzQXR0clN0cmluZyAocHlfb2JqLCBvdXRvZnNjb3BlX2Z1 bmMpKQorICAgIHsKKyAgICAgIHN0cnVjdCBnZGJhcmNoICpnYXJjaCA9ICBi cF9vYmotPmJwLT5nZGJhcmNoID8gIAorICAgICAgICAgIGJwX29iai0+YnAt PmdkYmFyY2ggOiBnZXRfY3VycmVudF9hcmNoICgpOworICAgICAgc3RydWN0 IGNsZWFudXAgKmNsZWFudXAgPSBlbnN1cmVfcHl0aG9uX2VudiAoZ2FyY2gs IGN1cnJlbnRfbGFuZ3VhZ2UpOworICAgICAgCisgICAgICBpZiAoIVB5T2Jq ZWN0X0NhbGxNZXRob2QgKHB5X29iaiwgb3V0b2ZzY29wZV9mdW5jLCBOVUxM KSkKKyAgICAgICAgICBnZGJweV9wcmludF9zdGFjayAoKTsKKyAgICAgIAor ICAgICAgZG9fY2xlYW51cHMgKGNsZWFudXApOworICAgIH0KK30KKworLyog UHl0aG9uIGZ1bmN0aW9uIHRvIGNoZWNrIGlmIHRoZSBGaW5pc2hCcmVha3Bv aW50IFNFTEYgaXMgbm90IGFueW1vcmUKKyAgIGluIHRoZSBjYWxsc3RhY2su IFRyaWdnZXJzIHNlbGYtPm91dF9vZl9zY29wZSAgKi8KK3N0YXRpYyBQeU9i amVjdCAqCiticGZpbmlzaHB5X2NoZWNrX3Njb3BlIChQeU9iamVjdCAqc2Vs ZiwgUHlPYmplY3QgKmFyZ3MpCit7CisgIHN0cnVjdCBmaW5pc2hfYnJlYWtw b2ludF9vYmplY3QgKnNlbGZfZmluaXNoYnAgPQorICAgICAgKHN0cnVjdCBm aW5pc2hfYnJlYWtwb2ludF9vYmplY3QgKikgc2VsZjsKKworICBpZiAoc2Vs Zl9maW5pc2hicC0+b3V0X29mX3Njb3BlX25vdGlmCisgICAgICAmJiBmcmFt ZV9maW5kX2J5X2lkKHNlbGZfZmluaXNoYnAtPnB5X2JwLmJwLT5mcmFtZV9p ZCkgPT0gTlVMTCkKKyAgICB7CisgICAgICBnZGJweV9vdXRfb2Zfc2NvcGUg KHNlbGZfZmluaXNoYnApOworCisgICAgICBQeV9SRVRVUk5fVFJVRTsKKyAg ICB9CisgIFB5X1JFVFVSTl9GQUxTRTsKK30KKworLyogUHl0aG9uIGZ1bmN0 aW9uIHRvIGNyZWF0ZSBhIG5ldyBicmVha3BvaW50LiAgKi8KKworc3RhdGlj IGludAorYnBmaW5pc2hweV9pbml0IChQeU9iamVjdCAqc2VsZiwgUHlPYmpl Y3QgKmFyZ3MsIFB5T2JqZWN0ICprd2FyZ3MpCit7CisgIHN0YXRpYyBjaGFy ICprZXl3b3Jkc1tdID0geyAiZnJhbWUiLCAiaW50ZXJuYWwiLCBOVUxMIH07 CisgIGJyZWFrcG9pbnRfb2JqZWN0ICpzZWxmX2JwID0gKGJyZWFrcG9pbnRf b2JqZWN0ICopIHNlbGY7CisgIHN0cnVjdCBmaW5pc2hfYnJlYWtwb2ludF9v YmplY3QgKnNlbGZfYnBmaW5pc2ggPQorICAgICAgKHN0cnVjdCBmaW5pc2hf YnJlYWtwb2ludF9vYmplY3QgKikgc2VsZjsKKyAgaW50IHR5cGUgPSBicF9i cmVha3BvaW50OworICBQeU9iamVjdCAqZnJhbWVfb2JqID0gTlVMTDsKKyAg c3RydWN0IGZyYW1lX2luZm8gKmZyYW1lLCAqcHJldl9mcmFtZTsKKyAgc3Ry dWN0IGZyYW1lX2lkIGZyYW1lX2lkOworICBzdHJ1Y3Qgc3ltdGFic19hbmRf bGluZXMgc2FsczsKKyAgc3RydWN0IHN5bXRhYl9hbmRfbGluZSBzYWw7Cisg IFB5T2JqZWN0ICppbnRlcm5hbCA9IE5VTEw7CisgIGludCBpbnRlcm5hbF9i cCA9IDA7CisgIENPUkVfQUREUiBwYyA7CisgIHZvbGF0aWxlIHN0cnVjdCBn ZGJfZXhjZXB0aW9uIGV4Y2VwdDsKKworICBpZiAoISBQeUFyZ19QYXJzZVR1 cGxlQW5kS2V5d29yZHMgKGFyZ3MsIGt3YXJncywgIk98TyIsIGtleXdvcmRz LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmcmFt ZV9vYmosICZpbnRlcm5hbCkpCisgICAgcmV0dXJuIC0xOworCisgIGlmICgh ZnJhbWVfb2JqKQorICAgIGdvdG8gaW52YWxpZF9mcmFtZTsKKyAgCisgIGZy YW1lID0gZnJhbWVfb2JqZWN0X3RvX2ZyYW1lX2luZm8gKGZyYW1lX29iaik7 CisgIGlmIChmcmFtZSA9PSBOVUxMKQorICAgIGdvdG8gaW52YWxpZF9mcmFt ZTsKKyAgCisgIHByZXZfZnJhbWUgPSBnZXRfcHJldl9mcmFtZShmcmFtZSk7 CisgIGlmIChwcmV2X2ZyYW1lID09IDApCisgICAgeworICAgICAgUHlFcnJf U2V0U3RyaW5nIChQeUV4Y19WYWx1ZUVycm9yLCAKKyAgICAgICAgICAgXygi XCJGaW5pc2hCcmVha3BvaW50XCIgbm90IG1lYW5pbmdmdWwgaW4gdGhlIG91 dGVybW9zdCBmcmFtZS4iKSk7CisgICAgICByZXR1cm4gLTE7CisgICAgfQor ICAKKyAgZnJhbWVfaWQgPSBnZXRfZnJhbWVfaWQgKHByZXZfZnJhbWUpOwor ICBpZiAoZnJhbWVfaWRfZXEoZnJhbWVfaWQsIG51bGxfZnJhbWVfaWQpKQor ICAgIGdvdG8gaW52YWxpZF9mcmFtZTsKKyAgCisgIHBjID0gZ2V0X2ZyYW1l X3BjIChwcmV2X2ZyYW1lKTsKKworICBzYWwgPSBmaW5kX3BjX2xpbmUgKHBj LCAwKTsKKyAgc2FsLnBjID0gcGM7CisgIHNhbHMuc2FscyA9ICZzYWw7Cisg IHNhbHMubmVsdHMgPSAxOworICAKKyAgLyogRmluZCB0aGUgZnVuY3Rpb24g d2Ugd2lsbCByZXR1cm4gZnJvbS4gICovCisgIHNlbGZfYnBmaW5pc2gtPmZ1 bmN0aW9uID0gZmluZF9wY19mdW5jdGlvbiAoZ2V0X2ZyYW1lX3BjIChmcmFt ZSkpOworCisgIGlmIChpbnRlcm5hbCkKKyAgICB7CisgICAgICBpbnRlcm5h bF9icCA9IFB5T2JqZWN0X0lzVHJ1ZSAoaW50ZXJuYWwpOworICAgICAgaWYg KGludGVybmFsX2JwID09IC0xKSAKKyAgICAgICAgeworICAgICAgICAgIFB5 RXJyX1NldFN0cmluZyAoUHlFeGNfVmFsdWVFcnJvciwgCisgICAgICAgICAg ICAgICAgICAgICAgICAgICBfKCJUaGUgdmFsdWUgb2YgYGludGVybmFsJyBt dXN0IGJlIGEgYm9vbGVhbi4iKSk7CisgICAgICAgICAgcmV0dXJuIC0xOwor ICAgICAgICB9CisgICAgfQorCisgIGJwcHlfcGVuZGluZ19vYmplY3QgPSBz ZWxmX2JwOworICBicHB5X3BlbmRpbmdfb2JqZWN0LT5udW1iZXIgPSAtMTsK KyAgYnBweV9wZW5kaW5nX29iamVjdC0+YnAgPSBOVUxMOworCisgIFRSWV9D QVRDSCAoZXhjZXB0LCBSRVRVUk5fTUFTS19BTEwpCisgICAgeworICAgICAg Y3JlYXRlX2JyZWFrcG9pbnRfc2FsIChweXRob25fZ2RiYXJjaCwgc2Fscywg TlVMTCwgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnBf YnJlYWtwb2ludCwgZGlzcF9kb250dG91Y2gsIC0xLAorICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAwLCAwLCBOVUxMLCAwLCAxLCBpbnRlcm5hbF9i cCwgMCkgOyAKKyAgICB9CisgIGlmIChleGNlcHQucmVhc29uIDwgMCkKKyAg ICB7CisgICAgICBQeUVycl9Gb3JtYXQgKGV4Y2VwdC5yZWFzb24gPT0gUkVU VVJOX1FVSVQKKyAgICAgICAgICAgICAgICAgICAgPyBQeUV4Y19LZXlib2Fy ZEludGVycnVwdCA6IFB5RXhjX1J1bnRpbWVFcnJvciwKKyAgICAgICAgICAg ICAgICAgICAgIiVzIiwgZXhjZXB0Lm1lc3NhZ2UpOworICAgICAgcmV0dXJu IC0xOworICAgIH0KKyAgQlBQWV9TRVRfUkVRVUlSRV9WQUxJRCAoc2VsZl9i cCk7CisgIAorICBzZWxmX2JwLT5icC0+ZnJhbWVfaWQgPSBmcmFtZV9pZDsK KyAgCisgIHNlbGZfYnBmaW5pc2gtPm91dF9vZl9zY29wZV9ub3RpZiA9IDE7 CisgIAorICByZXR1cm4gMDsKKyAgCitpbnZhbGlkX2ZyYW1lOgorICBQeUVy cl9TZXRTdHJpbmcgKFB5RXhjX1ZhbHVlRXJyb3IsIAorICAgICAgICAgICAg ICAgICAgIF8oIkludmFsaWQgSUQgZm9yIHRoZSBgZnJhbWUnIG9iamVjdC4i KSk7CisgIHJldHVybiAtMTsKK30KKworLyogUmV0dXJucyAxIGlmIE9CSiBp cyBub3QgTlVMTCBhbmQgcmVmZXJlbmNlcyBhIEZpbmlzaEJyZWFrcG9pbnQg b2JqZWN0LiAgKi8KKworc3RhdGljIGludAorYnBmaW5pc2hweV9pc19maW5p c2hfYnAgKFB5T2JqZWN0ICpvYmopCit7CisgIHJldHVybiBvYmogIT0gTlVM TAorICAgICAgICAgJiYgUHlPYmplY3RfVHlwZUNoZWNrIChvYmosICZmaW5p c2hfYnJlYWtwb2ludF9vYmplY3RfdHlwZSkgOworfQorCisvKiBSZXR1cm5z IDEgaWYgU1RPUF9CUFNUQVQgY29udGFpbnMgYSBGaW5pc2hCcmVha3BvaW50 LCAwIGlmIG5vdC4gICovCisKK2ludAorZ2RicHlfaXNfc3RvcHBlZF9hdF9m aW5pc2hfYnAgKGJwc3RhdCBzdG9wX2Jwc3RhdCkKK3sKKyAgYnBzdGF0IGJz OworCisgIGZvciAoYnMgPSBzdG9wX2Jwc3RhdDsgYnM7IGJzID0gYnMtPm5l eHQpCisgICAgeworICAgICAgaWYgKGJzLT5icmVha3BvaW50X2F0CisgICAg ICAgICAgJiYgYnBmaW5pc2hweV9pc19maW5pc2hfYnAoKFB5T2JqZWN0ICop CisgICAgICAgIAkJICAgICAgICAgICAgICAgICAgICAgYnMtPmJyZWFrcG9p bnRfYXQtPnB5X2JwX29iamVjdCkpCisgICAgICAgIHJldHVybiAxOworICAg IH0KKworICByZXR1cm4gMDsKK30KKworLyogQ2FsbGJhY2sgZm9yIGBicGZp bmlzaHB5X2RldGVjdF9vdXRfc2NvcGUnLiAgVHJpZ2dlcnMgUHl0aG9uJ3MK KyAgIGBCLT5vdXRfb2Zfc2NvcGUnIGZ1bmN0aW9uIGlmIEIgaXMgYSBGaW5p c2hCcmVha3BvaW50IG91dCBvZiBpdHMKKyAgICBzY29wZSBvciB0dXJuIG9m IG91dF9vZl9zY29wZSBub3RpZmljYXRpb24gaWYgQiBoYXMgYmVlbiBoaXQu ICAqLworCitzdGF0aWMgaW50CiticGZpbmlzaHB5X2RldGVjdF9vdXRfc2Nv cGVfY2IgKHN0cnVjdCBicmVha3BvaW50ICpiLCB2b2lkICphcmdzKQorewor ICBzdHJ1Y3QgYnJlYWtwb2ludCAqYnBfc3RvcHBlZCA9IChzdHJ1Y3QgYnJl YWtwb2ludCAqKSBhcmdzOworICBQeU9iamVjdCAqcHlfYnAgPSAoUHlPYmpl Y3QgKikgYi0+cHlfYnBfb2JqZWN0OworICBzdHJ1Y3QgZ2RiYXJjaCAqZ2Fy Y2ggPSBiLT5nZGJhcmNoID8gYi0+Z2RiYXJjaCA6IGdldF9jdXJyZW50X2Fy Y2ggKCk7CisgIHN0cnVjdCBjbGVhbnVwICpjbGVhbnVwID0gZW5zdXJlX3B5 dGhvbl9lbnYgKGdhcmNoLCBjdXJyZW50X2xhbmd1YWdlKTsKKyAgCisgIC8q IFRyaWdnZXIgb3V0X29mX3Njb3BlIGlmIHRoaXMgaXMgYSBGaW5pc2hCcmVh a3BvaW50IGl0cyBmcmFtZSBpcyBub3QgaW4gdGhlCisgICAgIGN1cnJlbnQg Y2FsbHN0YWNrIGFuZCB0aGUgbm90aWZpY2F0aW9uIGhhcyBub3QgYmVlbiBz ZW50IHlldC4gICovCisgIGlmIChicGZpbmlzaHB5X2lzX2ZpbmlzaF9icCAo cHlfYnApKQorICAgIHsKKyAgICAgIHN0cnVjdCBmaW5pc2hfYnJlYWtwb2lu dF9vYmplY3QgKmZpbmlzaF9icCA9CisgICAgICAgICAgKHN0cnVjdCBmaW5p c2hfYnJlYWtwb2ludF9vYmplY3QgKikgcHlfYnA7CisKKyAgICAgIGlmIChi ID09IGJwX3N0b3BwZWQpCisgICAgICAgIGZpbmlzaF9icC0+b3V0X29mX3Nj b3BlX25vdGlmID0gMDsKKyAgICAgIGVsc2UgaWYgKGZyYW1lX2ZpbmRfYnlf aWQoYi0+ZnJhbWVfaWQpID09IE5VTEwKKyAgICAgICAgICAgJiYgZmluaXNo X2JwLT5vdXRfb2Zfc2NvcGVfbm90aWYpCisgICAgICAgIHsKKyAgICAgICAg ICBnZGJweV9vdXRfb2Zfc2NvcGUgKGZpbmlzaF9icCk7CisgICAgICAgIH0K KyAgICB9CisgIAorICBkb19jbGVhbnVwcyAoY2xlYW51cCk7CisgIAorICBy ZXR1cm4gMDsKK30KKworLyogQXR0YWNoZWQgdG8gYHN0b3AnIG5vdGlmaWNh dGlvbnMsIGNoZWNrIGlmIHRoZSBleGVjdXRpb24gaGFzIHJ1biBvdXQKKyAg IG91dCBvZiB0aGUgc2NvcGUgb2YgYW55IEZpbmlzaEJyZWFrcG9pbnQgYmVm b3JlIGl0IGhhcyBiZWVuIGhpdC4gICovCisKK3N0YXRpYyB2b2lkCiticGZp bmlzaHB5X2hhbmRsZV9zdG9wIChzdHJ1Y3QgYnBzdGF0cyAqYnMsIGludCBw cmludF9mcmFtZSkKK3sKKyAgaXRlcmF0ZV9vdmVyX2JyZWFrcG9pbnRzIChi cGZpbmlzaHB5X2RldGVjdF9vdXRfc2NvcGVfY2IsCisgICAgICAgICAgICAg ICAgICAgICAgICAgICAgYnMgPT0gTlVMTCA/IE5VTEwgOiBicy0+YnJlYWtw b2ludF9hdCk7Cit9CisKKy8qIEF0dGFjaGVkIHRvIGBleGl0JyBub3RpZmlj YXRpb25zLCB0cmlnZ2VycyBhbGwgdGhlIG5lY2Vzc2FyeSBvdXQgb2YKKyAg IHNjb3BlIG5vdGlmaWNhdGlvbnMuICAqLworCitzdGF0aWMgdm9pZAorYnBm aW5pc2hweV9oYW5kbGVfZXhpdCAoc3RydWN0IGluZmVyaW9yICppbmYpCit7 CisgIGl0ZXJhdGVfb3Zlcl9icmVha3BvaW50cyAoYnBmaW5pc2hweV9kZXRl Y3Rfb3V0X3Njb3BlX2NiLCBOVUxMKTsKK30KKworLyogSW5pdGlhbGl6ZSB0 aGUgUHl0aG9uIGZpbmlzaCBicmVha3BvaW50IGNvZGUuICAqLworCit2b2lk CitnZGJweV9pbml0aWFsaXplX2ZpbmlzaGJyZWFrcG9pbnRzICh2b2lkKQor eworICBpZiAoUHlUeXBlX1JlYWR5ICgmZmluaXNoX2JyZWFrcG9pbnRfb2Jq ZWN0X3R5cGUpIDwgMCkKKyAgICAgIHJldHVybjsKKyAgCisgIFB5X0lOQ1JF RiAoJmZpbmlzaF9icmVha3BvaW50X29iamVjdF90eXBlKTsKKyAgUHlNb2R1 bGVfQWRkT2JqZWN0IChnZGJfbW9kdWxlLCAiRmluaXNoQnJlYWtwb2ludCIs CisgICAgICAgICAgICAgICAgICAgICAgKFB5T2JqZWN0ICopICZmaW5pc2hf YnJlYWtwb2ludF9vYmplY3RfdHlwZSk7CisgICAgCisgIG9ic2VydmVyX2F0 dGFjaF9ub3JtYWxfc3RvcCAoYnBmaW5pc2hweV9oYW5kbGVfc3RvcCk7Cisg IG9ic2VydmVyX2F0dGFjaF9pbmZlcmlvcl9leGl0KGJwZmluaXNocHlfaGFu ZGxlX2V4aXQpOworfQorCitzdGF0aWMgUHlNZXRob2REZWYgZmluaXNoX2Jy ZWFrcG9pbnRfb2JqZWN0X21ldGhvZHNbXSA9IHsKKyAgeyAiY2hlY2tfc2Nv cGUiLCBicGZpbmlzaHB5X2NoZWNrX3Njb3BlLCBNRVRIX05PQVJHUywKKyAg ICAiY2hlY2tfc2NvcGUgKCkgLT4gQm9vbGVhbi5cblwKK1JldHVybiB0cnVl IGlmIG91dF9vZl9zY29wZSgpIGhhcyBiZWVuIHRyaWdnZXJlZCwgZmFsc2Ug aWYgbm90LiIgfSwKKyAge05VTEx9ICAvKiBTZW50aW5lbCAqLworfTsKKwor c3RhdGljIFB5R2V0U2V0RGVmIGZpbmlzaF9icmVha3BvaW50X29iamVjdF9n ZXRzZXRbXSA9IHsKKyAgeyAib3V0X29mX3Njb3BlX25vdGlmIiwgYnBmaW5p c2hweV9nZXRfb3V0b2ZzY29wZV9ub3RpZiwgYnBmaW5pc2hweV9zZXRfb3V0 b2ZzY29wZV9ub3RpZiwKKyAgICAiQm9vbGVhbiB0ZWxsaW5nIHdoZXRoZXIg dGhlIGJyZWFrcG9pbnQgaXMgc3RpbGwgd2l0aGluIHRoZSBzY29wZSBcCitv ZiB0aGUgY3VycmVudCBjYWxsc3RhY2suIiwgTlVMTCB9LAorICB7ICJyZXR1 cm5fdmFsdWUiLCBicGZpbmlzaHB5X2dldF9yZXR1cm52YWx1ZSwgTlVMTCwK KyAgImdkYi5WYWx1ZSBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSByZXR1cm4g dmFsdWUsIGlmIGFueS4gXAorTm9uZSBvdGhlcndpc2UuIiwgTlVMTCB9LAor ICAgIHsgTlVMTCB9ICAvKiBTZW50aW5lbC4gICovCit9OworCitzdGF0aWMg UHlUeXBlT2JqZWN0IGZpbmlzaF9icmVha3BvaW50X29iamVjdF90eXBlID0K K3sKKyAgUHlPYmplY3RfSEVBRF9JTklUIChOVUxMKQorICAwLCAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIC8qb2Jfc2l6ZSovCisgICJnZGIuRmlu aXNoQnJlYWtwb2ludCIsICAgICAgICAgLyp0cF9uYW1lKi8KKyAgc2l6ZW9m IChzdHJ1Y3QgZmluaXNoX2JyZWFrcG9pbnRfb2JqZWN0KSwgIC8qdHBfYmFz aWNzaXplKi8KKyAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAv KnRwX2l0ZW1zaXplKi8KKyAgMCwgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAvKnRwX2RlYWxsb2MqLworICAwLCAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgIC8qdHBfcHJpbnQqLworICAwLCAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIC8qdHBfZ2V0YXR0ciovCisgIDAsICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgLyp0cF9zZXRhdHRyKi8KKyAgMCwgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2NvbXBhcmUqLworICAwLCAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfcmVwciovCisgIDAs ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9hc19udW1iZXIq LworICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfYXNf c2VxdWVuY2UqLworICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAg IC8qdHBfYXNfbWFwcGluZyovCisgIDAsICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgLyp0cF9oYXNoICovCisgIDAsICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgLyp0cF9jYWxsKi8KKyAgMCwgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAvKnRwX3N0ciovCisgIDAsICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgLyp0cF9nZXRhdHRybyovCisgIDAsICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgLyp0cF9zZXRhdHRybyAqLworICAwLCAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfYXNfYnVmZmVyKi8K KyAgUHlfVFBGTEFHU19ERUZBVUxUIHwgUHlfVFBGTEFHU19CQVNFVFlQRSwg IC8qdHBfZmxhZ3MqLworICAiR0RCIGZpbmlzaCBicmVha3BvaW50IG9iamVj dCIsIC8qIHRwX2RvYyAqLworICAwLCAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgIC8qIHRwX3RyYXZlcnNlICovCisgIDAsICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgLyogdHBfY2xlYXIgKi8KKyAgMCwgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAvKiB0cF9yaWNoY29tcGFyZSAqLworICAw LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3dlYWtsaXN0 b2Zmc2V0ICovCisgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg LyogdHBfaXRlciAqLworICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgIC8qIHRwX2l0ZXJuZXh0ICovCisgIGZpbmlzaF9icmVha3BvaW50X29i amVjdF9tZXRob2RzLCAgLyogdHBfbWV0aG9kcyAqLworICAwLCAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX21lbWJlcnMgKi8KKyAgZmlu aXNoX2JyZWFrcG9pbnRfb2JqZWN0X2dldHNldCwvKiB0cF9nZXRzZXQgKi8K KyAgJmJyZWFrcG9pbnRfb2JqZWN0X3R5cGUsICAgICAgICAvKiB0cF9iYXNl ICovCisgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBf ZGljdCAqLworICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8q IHRwX2Rlc2NyX2dldCAqLworICAwLCAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgIC8qIHRwX2Rlc2NyX3NldCAqLworICAwLCAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIC8qIHRwX2RpY3RvZmZzZXQgKi8KKyAgYnBmaW5p c2hweV9pbml0LCAgICAgICAgICAgICAgICAvKiB0cF9pbml0ICovCisgIDAs ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYWxsb2MgKi8K KyAgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9uZXcg Ki8KK307CmRpZmYgLS1naXQgYS9nZGIvcHl0aG9uL3B5LWZyYW1lLmMgYi9n ZGIvcHl0aG9uL3B5LWZyYW1lLmMKaW5kZXggZDcxMjhhOS4uMjEwOWM3MyAx MDA2NDQKLS0tIGEvZ2RiL3B5dGhvbi9weS1mcmFtZS5jCisrKyBiL2dkYi9w eXRob24vcHktZnJhbWUuYwpAQCAtNjAsOSArNjAsMTAgQEAgc3RhdGljIFB5 VHlwZU9iamVjdCBmcmFtZV9vYmplY3RfdHlwZTsKICAgIG9iamVjdC4gIElm IHRoZSBmcmFtZSBkb2Vzbid0IGV4aXN0IGFueW1vcmUgKHRoZSBmcmFtZSBp ZCBkb2Vzbid0CiAgICBjb3JyZXNwb25kIHRvIGFueSBmcmFtZSBpbiB0aGUg aW5mZXJpb3IpLCByZXR1cm5zIE5VTEwuICAqLwogCi1zdGF0aWMgc3RydWN0 IGZyYW1lX2luZm8gKgotZnJhbWVfb2JqZWN0X3RvX2ZyYW1lX2luZm8gKGZy YW1lX29iamVjdCAqZnJhbWVfb2JqKQorc3RydWN0IGZyYW1lX2luZm8gKgor ZnJhbWVfb2JqZWN0X3RvX2ZyYW1lX2luZm8gKFB5T2JqZWN0ICpvYmopCiB7 CisgIGZyYW1lX29iamVjdCAqZnJhbWVfb2JqID0gKGZyYW1lX29iamVjdCAq KSBvYmo7ICAKICAgc3RydWN0IGZyYW1lX2luZm8gKmZyYW1lOwogCiAgIGZy YW1lID0gZnJhbWVfZmluZF9ieV9pZCAoZnJhbWVfb2JqLT5mcmFtZV9pZCk7 CkBAIC0xMDMsNyArMTA0LDcgQEAgZnJhcHlfaXNfdmFsaWQgKFB5T2JqZWN0 ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKICAgc3RydWN0IGZyYW1lX2lu Zm8gKmZyYW1lOwogCi0gIGZyYW1lID0gZnJhbWVfb2JqZWN0X3RvX2ZyYW1l X2luZm8gKChmcmFtZV9vYmplY3QgKikgc2VsZik7CisgIGZyYW1lID0gZnJh bWVfb2JqZWN0X3RvX2ZyYW1lX2luZm8gKHNlbGYpOwogICBpZiAoZnJhbWUg PT0gTlVMTCkKICAgICBQeV9SRVRVUk5fRkFMU0U7CiAKQEAgLTEyNCw3ICsx MjUsNyBAQCBmcmFweV9uYW1lIChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3Qg KmFyZ3MpCiAKICAgVFJZX0NBVENIIChleGNlcHQsIFJFVFVSTl9NQVNLX0FM TCkKICAgICB7Ci0gICAgICBGUkFQWV9SRVFVSVJFX1ZBTElEICgoZnJhbWVf b2JqZWN0ICopIHNlbGYsIGZyYW1lKTsKKyAgICAgIEZSQVBZX1JFUVVJUkVf VkFMSUQgKHNlbGYsIGZyYW1lKTsKIAogICAgICAgZmluZF9mcmFtZV9mdW5u YW1lIChmcmFtZSwgJm5hbWUsICZsYW5nLCBOVUxMKTsKICAgICB9CkBAIC0x NTMsNyArMTU0LDcgQEAgZnJhcHlfdHlwZSAoUHlPYmplY3QgKnNlbGYsIFB5 T2JqZWN0ICphcmdzKQogCiAgIFRSWV9DQVRDSCAoZXhjZXB0LCBSRVRVUk5f TUFTS19BTEwpCiAgICAgewotICAgICAgRlJBUFlfUkVRVUlSRV9WQUxJRCAo KGZyYW1lX29iamVjdCAqKSBzZWxmLCBmcmFtZSk7CisgICAgICBGUkFQWV9S RVFVSVJFX1ZBTElEIChzZWxmLCBmcmFtZSk7CiAKICAgICAgIHR5cGUgPSBn ZXRfZnJhbWVfdHlwZSAoZnJhbWUpOwogICAgIH0KQEAgLTE3NCw3ICsxNzUs NyBAQCBmcmFweV91bndpbmRfc3RvcF9yZWFzb24gKFB5T2JqZWN0ICpzZWxm LCBQeU9iamVjdCAqYXJncykKIAogICBUUllfQ0FUQ0ggKGV4Y2VwdCwgUkVU VVJOX01BU0tfQUxMKQogICAgIHsKLSAgICAgIEZSQVBZX1JFUVVJUkVfVkFM SUQgKChmcmFtZV9vYmplY3QgKikgc2VsZiwgZnJhbWUpOworICAgICAgRlJB UFlfUkVRVUlSRV9WQUxJRCAoc2VsZiwgZnJhbWUpOwogICAgIH0KICAgR0RC X1BZX0hBTkRMRV9FWENFUFRJT04gKGV4Y2VwdCk7CiAKQEAgLTE5NSw3ICsx OTYsNyBAQCBmcmFweV9wYyAoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICph cmdzKQogCiAgIFRSWV9DQVRDSCAoZXhjZXB0LCBSRVRVUk5fTUFTS19BTEwp CiAgICAgewotICAgICAgRlJBUFlfUkVRVUlSRV9WQUxJRCAoKGZyYW1lX29i amVjdCAqKSBzZWxmLCBmcmFtZSk7CisgICAgICBGUkFQWV9SRVFVSVJFX1ZB TElEIChzZWxmLCBmcmFtZSk7CiAKICAgICAgIHBjID0gZ2V0X2ZyYW1lX3Bj IChmcmFtZSk7CiAgICAgfQpAQCAtMjE2LDcgKzIxNyw3IEBAIGZyYXB5X2Js b2NrIChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiAKICAgVFJZ X0NBVENIIChleGNlcHQsIFJFVFVSTl9NQVNLX0FMTCkKICAgICB7Ci0gICAg ICBGUkFQWV9SRVFVSVJFX1ZBTElEICgoZnJhbWVfb2JqZWN0ICopIHNlbGYs IGZyYW1lKTsKKyAgICAgIEZSQVBZX1JFUVVJUkVfVkFMSUQgKHNlbGYsIGZy YW1lKTsKICAgICAgIGJsb2NrID0gZ2V0X2ZyYW1lX2Jsb2NrIChmcmFtZSwg TlVMTCk7CiAgICAgfQogICBHREJfUFlfSEFORExFX0VYQ0VQVElPTiAoZXhj ZXB0KTsKQEAgLTI1Nyw3ICsyNTgsNyBAQCBmcmFweV9mdW5jdGlvbiAoUHlP YmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogCiAgIFRSWV9DQVRDSCAo ZXhjZXB0LCBSRVRVUk5fTUFTS19BTEwpCiAgICAgewotICAgICAgRlJBUFlf UkVRVUlSRV9WQUxJRCAoKGZyYW1lX29iamVjdCAqKSBzZWxmLCBmcmFtZSk7 CisgICAgICBGUkFQWV9SRVFVSVJFX1ZBTElEIChzZWxmLCBmcmFtZSk7CiAK ICAgICAgIHN5bSA9IGZpbmRfcGNfZnVuY3Rpb24gKGdldF9mcmFtZV9hZGRy ZXNzX2luX2Jsb2NrIChmcmFtZSkpOwogICAgIH0KQEAgLTMxOSw3ICszMjAs NyBAQCBmcmFweV9vbGRlciAoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICph cmdzKQogCiAgIFRSWV9DQVRDSCAoZXhjZXB0LCBSRVRVUk5fTUFTS19BTEwp CiAgICAgewotICAgICAgRlJBUFlfUkVRVUlSRV9WQUxJRCAoKGZyYW1lX29i amVjdCAqKSBzZWxmLCBmcmFtZSk7CisgICAgICBGUkFQWV9SRVFVSVJFX1ZB TElEIChzZWxmLCBmcmFtZSk7CiAKICAgICAgIHByZXYgPSBnZXRfcHJldl9m cmFtZSAoZnJhbWUpOwogICAgICAgaWYgKHByZXYpCkBAIC0zNDgsNyArMzQ5 LDcgQEAgZnJhcHlfbmV3ZXIgKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAq YXJncykKIAogICBUUllfQ0FUQ0ggKGV4Y2VwdCwgUkVUVVJOX01BU0tfQUxM KQogICAgIHsKLSAgICAgIEZSQVBZX1JFUVVJUkVfVkFMSUQgKChmcmFtZV9v YmplY3QgKikgc2VsZiwgZnJhbWUpOworICAgICAgRlJBUFlfUkVRVUlSRV9W QUxJRCAoc2VsZiwgZnJhbWUpOwogCiAgICAgICBuZXh0ID0gZ2V0X25leHRf ZnJhbWUgKGZyYW1lKTsKICAgICAgIGlmIChuZXh0KQpAQCAtMzc3LDcgKzM3 OCw3IEBAIGZyYXB5X2ZpbmRfc2FsIChQeU9iamVjdCAqc2VsZiwgUHlPYmpl Y3QgKmFyZ3MpCiAKICAgVFJZX0NBVENIIChleGNlcHQsIFJFVFVSTl9NQVNL X0FMTCkKICAgICB7Ci0gICAgICBGUkFQWV9SRVFVSVJFX1ZBTElEICgoZnJh bWVfb2JqZWN0ICopIHNlbGYsIGZyYW1lKTsKKyAgICAgIEZSQVBZX1JFUVVJ UkVfVkFMSUQgKHNlbGYsIGZyYW1lKTsKIAogICAgICAgZmluZF9mcmFtZV9z YWwgKGZyYW1lLCAmc2FsKTsKICAgICAgIHNhbF9vYmogPSBzeW10YWJfYW5k X2xpbmVfdG9fc2FsX29iamVjdCAoc2FsKTsKQEAgLTQzMyw3ICs0MzQsNyBA QCBmcmFweV9yZWFkX3ZhciAoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICph cmdzKQogCiAgICAgICBUUllfQ0FUQ0ggKGV4Y2VwdCwgUkVUVVJOX01BU0tf QUxMKQogCXsKLQkgIEZSQVBZX1JFUVVJUkVfVkFMSUQgKChmcmFtZV9vYmpl Y3QgKikgc2VsZiwgZnJhbWUpOworCSAgRlJBUFlfUkVRVUlSRV9WQUxJRCAo c2VsZiwgZnJhbWUpOwogCiAJICBpZiAoIWJsb2NrKQogCSAgICBibG9jayA9 IGdldF9mcmFtZV9ibG9jayAoZnJhbWUsIE5VTEwpOwpAQCAtNDYxLDcgKzQ2 Miw3IEBAIGZyYXB5X3JlYWRfdmFyIChQeU9iamVjdCAqc2VsZiwgUHlPYmpl Y3QgKmFyZ3MpCiAKICAgVFJZX0NBVENIIChleGNlcHQsIFJFVFVSTl9NQVNL X0FMTCkKICAgICB7Ci0gICAgICBGUkFQWV9SRVFVSVJFX1ZBTElEICgoZnJh bWVfb2JqZWN0ICopIHNlbGYsIGZyYW1lKTsKKyAgICAgIEZSQVBZX1JFUVVJ UkVfVkFMSUQgKHNlbGYsIGZyYW1lKTsKIAogICAgICAgdmFsID0gcmVhZF92 YXJfdmFsdWUgKHZhciwgZnJhbWUpOwogICAgIH0KQEAgLTQ4NCwxMiArNDg1 LDExIEBAIHN0YXRpYyBQeU9iamVjdCAqCiBmcmFweV9zZWxlY3QgKFB5T2Jq ZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKICAgc3RydWN0IGZyYW1l X2luZm8gKmZpOwotICBmcmFtZV9vYmplY3QgKmZyYW1lID0gKGZyYW1lX29i amVjdCAqKSBzZWxmOwogICB2b2xhdGlsZSBzdHJ1Y3QgZ2RiX2V4Y2VwdGlv biBleGNlcHQ7CiAKICAgVFJZX0NBVENIIChleGNlcHQsIFJFVFVSTl9NQVNL X0FMTCkKICAgICB7Ci0gICAgICBGUkFQWV9SRVFVSVJFX1ZBTElEIChmcmFt ZSwgZmkpOworICAgICAgRlJBUFlfUkVRVUlSRV9WQUxJRCAoc2VsZiwgZmkp OwogCiAgICAgICBzZWxlY3RfZnJhbWUgKGZpKTsKICAgICB9CmRpZmYgLS1n aXQgYS9nZGIvcHl0aG9uL3B5dGhvbi1pbnRlcm5hbC5oIGIvZ2RiL3B5dGhv bi9weXRob24taW50ZXJuYWwuaAppbmRleCBkM2NiNzg4Li4zMWVjMWI4IDEw MDY0NAotLS0gYS9nZGIvcHl0aG9uL3B5dGhvbi1pbnRlcm5hbC5oCisrKyBi L2dkYi9weXRob24vcHl0aG9uLWludGVybmFsLmgKQEAgLTExNCw5ICsxMTQs NDcgQEAgZXh0ZXJuIFB5VHlwZU9iamVjdCBzeW1ib2xfb2JqZWN0X3R5cGU7 CiBleHRlcm4gUHlUeXBlT2JqZWN0IGV2ZW50X29iamVjdF90eXBlOwogZXh0 ZXJuIFB5VHlwZU9iamVjdCBldmVudHNfb2JqZWN0X3R5cGU7CiBleHRlcm4g UHlUeXBlT2JqZWN0IHN0b3BfZXZlbnRfb2JqZWN0X3R5cGU7CitleHRlcm4g UHlUeXBlT2JqZWN0IGJyZWFrcG9pbnRfb2JqZWN0X3R5cGU7CisKK3R5cGVk ZWYgc3RydWN0IGJyZWFrcG9pbnRfb2JqZWN0Cit7CisgIFB5T2JqZWN0X0hF QUQKKworICAvKiBUaGUgYnJlYWtwb2ludCBudW1iZXIgYWNjb3JkaW5nIHRv IGdkYi4gICovCisgIGludCBudW1iZXI7CisKKyAgLyogVGhlIGdkYiBicmVh a3BvaW50IG9iamVjdCwgb3IgTlVMTCBpZiB0aGUgYnJlYWtwb2ludCBoYXMg YmVlbgorICAgICBkZWxldGVkLiAgKi8KKyAgc3RydWN0IGJyZWFrcG9pbnQg KmJwOworfSBicmVha3BvaW50X29iamVjdDsKKworLyogUmVxdWlyZSB0aGF0 IEJSRUFLUE9JTlQgYmUgYSB2YWxpZCBicmVha3BvaW50IElEOyB0aHJvdyBh IFB5dGhvbgorICAgZXhjZXB0aW9uIGlmIGl0IGlzIGludmFsaWQuICAqLwor I2RlZmluZSBCUFBZX1JFUVVJUkVfVkFMSUQoQnJlYWtwb2ludCkgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGRvIHsgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgXAorICAgICAgaWYgKChCcmVha3BvaW50KS0+YnAgPT0g TlVMTCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAor ICAgICAgICByZXR1cm4gUHlFcnJfRm9ybWF0IChQeUV4Y19SdW50aW1lRXJy b3IsICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAg ICAgICAgICAgICAgICBfKCJCcmVha3BvaW50ICVkIGlzIGludmFsaWQuIiks ICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAo QnJlYWtwb2ludCktPm51bWJlcik7ICAgICAgICAgICAgICAgICAgICAgXAor ICAgIH0gd2hpbGUgKDApCisKKy8qIFJlcXVpcmUgdGhhdCBCUkVBS1BPSU5U IGJlIGEgdmFsaWQgYnJlYWtwb2ludCBJRDsgdGhyb3cgYSBQeXRob24KKyAg IGV4Y2VwdGlvbiBpZiBpdCBpcyBpbnZhbGlkLiAgVGhpcyBtYWNybyBpcyBm b3IgdXNlIGluIHNldHRlciBmdW5jdGlvbnMuICAqLworI2RlZmluZSBCUFBZ X1NFVF9SRVFVSVJFX1ZBTElEKEJyZWFrcG9pbnQpICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgXAorICAgIGRvIHsgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg XAorICAgICAgaWYgKChCcmVha3BvaW50KS0+YnAgPT0gTlVMTCkgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB7ICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgXAorICAgICAgICAgIFB5RXJyX0Zvcm1hdCAoUHlF eGNfUnVudGltZUVycm9yLCBfKCJCcmVha3BvaW50ICVkIGlzIGludmFsaWQu IiksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIChCcmVha3BvaW50KS0+ bnVtYmVyKTsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAg ICByZXR1cm4gLTE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgIFwKKyAgICB9IHdoaWxlICgwKQorCisKKy8qIFZhcmlhYmxlcyB1c2Vk IHRvIHBhc3MgaW5mb3JtYXRpb24gYmV0d2VlbiB0aGUgQnJlYWtwb2ludAor ICAgY29uc3RydWN0b3IgYW5kIHRoZSBicmVha3BvaW50LWNyZWF0ZWQgaG9v ayBmdW5jdGlvbi4gICovCitleHRlcm4gYnJlYWtwb2ludF9vYmplY3QgKmJw cHlfcGVuZGluZ19vYmplY3Q7CiAKLS8qIERlZmluZWQgaW4gcHktYnJlYWtw b2ludC5jICovCi10eXBlZGVmIHN0cnVjdCBicmVha3BvaW50X29iamVjdCBi cmVha3BvaW50X29iamVjdDsKIAogdHlwZWRlZiBzdHJ1Y3QKIHsKQEAgLTE2 MSw2ICsxOTksNyBAQCBQeU9iamVjdCAqYmxvY2tfdG9fYmxvY2tfb2JqZWN0 IChzdHJ1Y3QgYmxvY2sgKmJsb2NrLCBzdHJ1Y3Qgb2JqZmlsZSAqb2JqZmls ZSk7CiBQeU9iamVjdCAqdmFsdWVfdG9fdmFsdWVfb2JqZWN0IChzdHJ1Y3Qg dmFsdWUgKnYpOwogUHlPYmplY3QgKnR5cGVfdG9fdHlwZV9vYmplY3QgKHN0 cnVjdCB0eXBlICopOwogUHlPYmplY3QgKmZyYW1lX2luZm9fdG9fZnJhbWVf b2JqZWN0IChzdHJ1Y3QgZnJhbWVfaW5mbyAqZnJhbWUpOworc3RydWN0IGZy YW1lX2luZm8gKmZyYW1lX29iamVjdF90b19mcmFtZV9pbmZvIChQeU9iamVj dCAqZnJhbWVfb2JqKTsKIAogUHlPYmplY3QgKnBzcGFjZV90b19wc3BhY2Vf b2JqZWN0IChzdHJ1Y3QgcHJvZ3JhbV9zcGFjZSAqKTsKIFB5T2JqZWN0ICpw c3B5X2dldF9wcmludGVycyAoUHlPYmplY3QgKiwgdm9pZCAqKTsKQEAgLTE5 NCw2ICsyMzMsNyBAQCB2b2lkIGdkYnB5X2luaXRpYWxpemVfZnVuY3Rpb25z ICh2b2lkKTsKIHZvaWQgZ2RicHlfaW5pdGlhbGl6ZV9wc3BhY2UgKHZvaWQp Owogdm9pZCBnZGJweV9pbml0aWFsaXplX29iamZpbGUgKHZvaWQpOwogdm9p ZCBnZGJweV9pbml0aWFsaXplX2JyZWFrcG9pbnRzICh2b2lkKTsKK3ZvaWQg Z2RicHlfaW5pdGlhbGl6ZV9maW5pc2hicmVha3BvaW50cyAodm9pZCk7CiB2 b2lkIGdkYnB5X2luaXRpYWxpemVfbGF6eV9zdHJpbmcgKHZvaWQpOwogdm9p ZCBnZGJweV9pbml0aWFsaXplX3BhcmFtZXRlcnMgKHZvaWQpOwogdm9pZCBn ZGJweV9pbml0aWFsaXplX3RocmVhZCAodm9pZCk7CmRpZmYgLS1naXQgYS9n ZGIvcHl0aG9uL3B5dGhvbi5jIGIvZ2RiL3B5dGhvbi9weXRob24uYwppbmRl eCA4YTdiYzY2Li45NzAwN2IzIDEwMDY0NAotLS0gYS9nZGIvcHl0aG9uL3B5 dGhvbi5jCisrKyBiL2dkYi9weXRob24vcHl0aG9uLmMKQEAgLTkyNiw2ICs5 MjYsMTEgQEAgZ2RicHlfYnJlYWtwb2ludF9oYXNfcHlfY29uZCAoc3RydWN0 IGJyZWFrcG9pbnRfb2JqZWN0ICpicF9vYmopCiAJCSAgICAic2NyaXB0aW5n IGlzIG5vdCBzdXBwb3J0ZWQuIikpOwogfQogCitpbnQKK2dkYnB5X2lzX3N0 b3BwZWRfYXRfZmluaXNoX2JwIChicHN0YXQgc3RvcF9icHN0YXQpCit7Cisg IHJldHVybiAwOworfQogI2VuZGlmIC8qIEhBVkVfUFlUSE9OICovCiAKIAwK QEAgLTEwNjAsNiArMTA2NSw3IEBAIEVuYWJsZXMgb3IgZGlzYWJsZXMgcHJp bnRpbmcgb2YgUHl0aG9uIHN0YWNrIHRyYWNlcy4iKSwKICAgZ2RicHlfaW5p dGlhbGl6ZV9wc3BhY2UgKCk7CiAgIGdkYnB5X2luaXRpYWxpemVfb2JqZmls ZSAoKTsKICAgZ2RicHlfaW5pdGlhbGl6ZV9icmVha3BvaW50cyAoKTsKKyAg Z2RicHlfaW5pdGlhbGl6ZV9maW5pc2hicmVha3BvaW50cyAoKTsKICAgZ2Ri cHlfaW5pdGlhbGl6ZV9sYXp5X3N0cmluZyAoKTsKICAgZ2RicHlfaW5pdGlh bGl6ZV90aHJlYWQgKCk7CiAgIGdkYnB5X2luaXRpYWxpemVfaW5mZXJpb3Ig KCk7CmRpZmYgLS1naXQgYS9nZGIvcHl0aG9uL3B5dGhvbi5oIGIvZ2RiL3B5 dGhvbi9weXRob24uaAppbmRleCBjZTBlYjM1Li5hYTJkMDk2IDEwMDY0NAot LS0gYS9nZGIvcHl0aG9uL3B5dGhvbi5oCisrKyBiL2dkYi9weXRob24vcHl0 aG9uLmgKQEAgLTIxLDYgKzIxLDcgQEAKICNkZWZpbmUgR0RCX1BZVEhPTl9I CiAKICNpbmNsdWRlICJ2YWx1ZS5oIgorI2luY2x1ZGUgImJyZWFrcG9pbnQu aCIKIAogc3RydWN0IGJyZWFrcG9pbnRfb2JqZWN0OwogCkBAIC00Nyw0ICs0 OCw1IEBAIGludCBnZGJweV9zaG91bGRfc3RvcCAoc3RydWN0IGJyZWFrcG9p bnRfb2JqZWN0ICpicF9vYmopOwogCiBpbnQgZ2RicHlfYnJlYWtwb2ludF9o YXNfcHlfY29uZCAoc3RydWN0IGJyZWFrcG9pbnRfb2JqZWN0ICpicF9vYmop OwogCitpbnQgZ2RicHlfaXNfc3RvcHBlZF9hdF9maW5pc2hfYnAgKGJwc3Rh dCBzdG9wX2Jwc3RhdCk7CiAjZW5kaWYgLyogR0RCX1BZVEhPTl9IICovCmRp ZmYgLS1naXQgYS9nZGIvdGVzdHN1aXRlL2dkYi5weXRob24vcHktYnJlYWtw b2ludC5leHAgYi9nZGIvdGVzdHN1aXRlL2dkYi5weXRob24vcHktYnJlYWtw b2ludC5leHAKaW5kZXggZjBhODNmMS4uODc1NTg4OCAxMDA2NDQKLS0tIGEv Z2RiL3Rlc3RzdWl0ZS9nZGIucHl0aG9uL3B5LWJyZWFrcG9pbnQuZXhwCisr KyBiL2dkYi90ZXN0c3VpdGUvZ2RiLnB5dGhvbi9weS1icmVha3BvaW50LmV4 cApAQCAtNDQsNyArNDQsOCBAQCBnZGJfcHlfdGVzdF9zaWxlbnRfY21kICJw eXRob24gYmxpc3QgPSBnZGIuYnJlYWtwb2ludHMoKSIgIkdldCBCcmVha3Bv aW50IExpc3QiCiBnZGJfdGVzdCAicHl0aG9uIHByaW50IGJsaXN0XFswXF0i ICI8Z2RiLkJyZWFrcG9pbnQgb2JqZWN0IGF0ICRoZXg+IiAiQ2hlY2sgb2Jq IGV4aXN0cyIKIGdkYl90ZXN0ICJweXRob24gcHJpbnQgYmxpc3RcWzBcXS5s b2NhdGlvbiIgIm1haW4uIiAiQ2hlY2sgYnJlYWtwb2ludCBsb2NhdGlvbiIK IAotZ2RiX2JyZWFrcG9pbnQgW2dkYl9nZXRfbGluZV9udW1iZXIgIkJyZWFr IGF0IG11bHRpcGx5LiJdCitzZXQgbXVsdF9saW5lIFtnZGJfZ2V0X2xpbmVf bnVtYmVyICJCcmVhayBhdCBtdWx0aXBseS4iXQorZ2RiX2JyZWFrcG9pbnQg JHttdWx0X2xpbmV9CiBnZGJfY29udGludWVfdG9fYnJlYWtwb2ludCAiQnJl YWsgYXQgbXVsdGlwbHkuIgogCiAjIENoZWNrIHRoYXQgdGhlIFB5dGhvbiBi cmVha3BvaW50IGNvZGUgbm90ZWQgdGhlIGFkZGl0aW9uIG9mIGEKQEAgLTU0 LDcgKzU1LDkgQEAgZ2RiX3Rlc3QgInB5dGhvbiBwcmludCBsZW4oYmxpc3Qp IiAiMiIgIkNoZWNrIGZvciB0d28gYnJlYWtwb2ludHMiCiBnZGJfdGVzdCAi cHl0aG9uIHByaW50IGJsaXN0XFswXF0iICI8Z2RiLkJyZWFrcG9pbnQgb2Jq ZWN0IGF0ICRoZXg+IiAiQ2hlY2sgb2JqIGV4aXN0cyIKIGdkYl90ZXN0ICJw eXRob24gcHJpbnQgYmxpc3RcWzBcXS5sb2NhdGlvbiIgIm1haW4uIiAiQ2hl Y2sgYnJlYWtwb2ludCBsb2NhdGlvbiIKIGdkYl90ZXN0ICJweXRob24gcHJp bnQgYmxpc3RcWzFcXSIgIjxnZGIuQnJlYWtwb2ludCBvYmplY3QgYXQgJGhl eD4iICJDaGVjayBvYmogZXhpc3RzIgotZ2RiX3Rlc3QgInB5dGhvbiBwcmlu dCBibGlzdFxbMVxdLmxvY2F0aW9uIiAicHktYnJlYWtwb2ludFwuYzo0MSoi ICJDaGVjayBicmVha3BvaW50IGxvY2F0aW9uIgorCitnZGJfdGVzdCAicHl0 aG9uIHByaW50IGJsaXN0XFsxXF0ubG9jYXRpb24iICJweS1icmVha3BvaW50 XC5jOiR7bXVsdF9saW5lfSoiIFwKKyAgICAgICAgICJDaGVjayBicmVha3Bv aW50IGxvY2F0aW9uIgogCiAjIENoZWNrIGhpdCBhbmQgaWdub3JlIGNvdW50 cy4gCiBnZGJfdGVzdCAicHl0aG9uIHByaW50IGJsaXN0XFsxXF0uaGl0X2Nv dW50IiAiMSIgIkNoZWNrIGJyZWFrcG9pbnQgaGl0IGNvdW50IgpkaWZmIC0t Z2l0IGEvZ2RiL3Rlc3RzdWl0ZS9nZGIucHl0aG9uL3B5LWZpbmlzaC1icmVh a3BvaW50LWNjLmNjIGIvZ2RiL3Rlc3RzdWl0ZS9nZGIucHl0aG9uL3B5LWZp bmlzaC1icmVha3BvaW50LWNjLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0Cmlu ZGV4IDAwMDAwMDAuLmEwZWVhMDYKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIv dGVzdHN1aXRlL2dkYi5weXRob24vcHktZmluaXNoLWJyZWFrcG9pbnQtY2Mu Y2MKQEAgLTAsMCArMSw1OSBAQAorLyogVGhpcyB0ZXN0Y2FzZSBpcyBwYXJ0 IG9mIEdEQiwgdGhlIEdOVSBkZWJ1Z2dlci4KKworICAgQ29weXJpZ2h0IDIw MTEgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKKyAgIFRoaXMg cHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0 ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICBpdCB1bmRlciB0aGUgdGVybXMgb2Yg dGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBi eQorICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZl cnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKKyAgIChhdCB5b3VyIG9wdGlv bikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBk aXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVs LAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4g dGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBv ciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUK KyAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFp bHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2Yg dGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICBhbG9uZyB3aXRo IHRoaXMgcHJvZ3JhbS4gIElmIG5vdCwgc2VlICA8aHR0cDovL3d3dy5nbnUu b3JnL2xpY2Vuc2VzLz4uCisqLworCisKKyNpbmNsdWRlIDxpb3N0cmVhbT4K Kwordm9pZAordGhyb3dfZXhjZXB0aW9uXzEgKGludCBlKQoreworICB0aHJv dyBuZXcgaW50IChlKTsKK30KKwordm9pZAordGhyb3dfZXhjZXB0aW9uIChp bnQgZSkKK3sKKyAgdGhyb3dfZXhjZXB0aW9uXzEgKGUpOworfQorCitpbnQK K21haW4gKHZvaWQpCit7CisgIGludCBpOworICB0cnkKKyAgICB7CisgICAg ICB0aHJvd19leGNlcHRpb25fMSAoMTApOworICAgIH0KKyAgY2F0Y2ggKGNv bnN0IGludCAqZSkKKyAgICB7CisgICAgICAgIHN0ZDo6Y2VyciA8PCAiRXhj ZXB0aW9uICMiIDw8ICplIDw8IHN0ZDo6ZW5kbDsKKyAgICB9CisgIGkgKz0g MTsgLyogQnJlYWsgYWZ0ZXIgZXhjZXB0aW9uIDEuICAqLworCisgIHRyeQor ICAgIHsKKyAgICAgIHRocm93X2V4Y2VwdGlvbiAoMTApOworICAgIH0KKyAg Y2F0Y2ggKGNvbnN0IGludCAqZSkKKyAgICB7CisgICAgICAgIHN0ZDo6Y2Vy ciA8PCAiRXhjZXB0aW9uICMiIDw8ICplIDw8IHN0ZDo6ZW5kbDsKKyAgICB9 CisgIGkgKz0gMTsgLyogQnJlYWsgYWZ0ZXIgZXhjZXB0aW9uIDIuICAqLwor CisgIHJldHVybiBpOworfQpkaWZmIC0tZ2l0IGEvZ2RiL3Rlc3RzdWl0ZS9n ZGIucHl0aG9uL3B5LWZpbmlzaC1icmVha3BvaW50LWNjLmV4cCBiL2dkYi90 ZXN0c3VpdGUvZ2RiLnB5dGhvbi9weS1maW5pc2gtYnJlYWtwb2ludC1jYy5l eHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTc0MDIz ZAotLS0gL2Rldi9udWxsCisrKyBiL2dkYi90ZXN0c3VpdGUvZ2RiLnB5dGhv bi9weS1maW5pc2gtYnJlYWtwb2ludC1jYy5leHAKQEAgLTAsMCArMSw1OSBA QAorIyBDb3B5cmlnaHQgKEMpIDIwMTEgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0 aW9uLCBJbmMuCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJl OyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisjIGl0 IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExp Y2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisjIHRoZSBGcmVlIFNvZnR3YXJlIEZv dW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9y CisjIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisjCisj IFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0 IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFO VFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBN RVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBV UlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNl IGZvciBtb3JlIGRldGFpbHMuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNl aXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNl CisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYgbm90LCBzZWUgPGh0 dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisjIFRoaXMgZmlsZSBp cyBwYXJ0IG9mIHRoZSBHREIgdGVzdHN1aXRlLiAgSXQgdGVzdHMgdGhlIG1l Y2hhbmlzbQorIyBleHBvc2luZyB2YWx1ZXMgdG8gUHl0aG9uLgorCitpZiAk dHJhY2VsZXZlbCB0aGVuIHsKKyAgICBzdHJhY2UgJHRyYWNlbGV2ZWwKK30K KworbG9hZF9saWIgZ2RiLXB5dGhvbi5leHAKKworc2V0IHRlc3RmaWxlICJw eS1maW5pc2gtYnJlYWtwb2ludC1jYyIKK3NldCBzcmNmaWxlICR7dGVzdGZp bGV9LmNjCitzZXQgYmluZmlsZSAke29iamRpcn0vJHtzdWJkaXJ9LyR7dGVz dGZpbGV9CitzZXQgcHlmaWxlICAke3NyY2Rpcn0vJHtzdWJkaXJ9LyR7dGVz dGZpbGV9LnB5CisKKyMgU3RhcnQgd2l0aCBhIGZyZXNoIGdkYi4KK2dkYl9l eGl0CitnZGJfc3RhcnQKK2dkYl9yZWluaXRpYWxpemVfZGlyICRzcmNkaXIv JHN1YmRpcgorZ2RiX2xvYWQgJHtiaW5maWxlfQorCitpZiB7IFtnZGJfY29t cGlsZSAiJHtzcmNkaXJ9LyR7c3ViZGlyfS8ke3NyY2ZpbGV9IiAiJHtiaW5m aWxlfSIgZXhlY3V0YWJsZSB7ZGVidWcgYysrfV0gIT0gIiIgfSB7CisgICAg dW50ZXN0ZWQgIkNvdWxkbid0IGNvbXBpbGUgJHtzcmNmaWxlfSIKKyAgICBy ZXR1cm4gLTEKK30KKworaWYgIVtydW50b19tYWluXSB0aGVuIHsKKyAgICBm YWlsICJDYW5ub3QgcnVuIHRvIG1haW4uIgorICAgIHJldHVybiAwCit9CisK K2dkYl90ZXN0ICJzb3VyY2UgJHB5ZmlsZSIgIi4qUHl0aG9uIHNjcmlwdCBp bXBvcnRlZC4qIiBcCisgICAgICAgICAiaW1wb3J0IHB5dGhvbiBzY3JpcHRz IgorCitnZGJfdGVzdCAiYnJlYWsgW2dkYl9nZXRfbGluZV9udW1iZXIgIkJy ZWFrIGFmdGVyIGV4Y2VwdGlvbiAxLiJdIiAiQnJlYWtwb2ludC4qIGF0IC4q IiBcCisgICAgICAgICAic2V0IHdhdGNoZG9nIGFmdGVyIHRoZSBleGNlcHRp b24gMSIKK2dkYl90ZXN0ICJicmVhayBbZ2RiX2dldF9saW5lX251bWJlciAi QnJlYWsgYWZ0ZXIgZXhjZXB0aW9uIDIuIl0iICJCcmVha3BvaW50LiogYXQg LioiIFwKKyAgICAgICAgICJzZXQgd2F0Y2hkb2cgYWZ0ZXIgdGhlIGV4Y2Vw dGlvbiAyIgorICAgICAgICAgCitnZGJfdGVzdCAicHl0aG9uIEV4Y2VwdGlv bkJyZWFrcG9pbnQoKSIgIkV4Y2VwdGlvbkJyZWFrcG9pbnQgaW5pdCIgInNl dCBCUCBiZWZvcmUgdGhyb3dpbmcgdGhlIGV4Y2VwdGlvbiIKK2dkYl90ZXN0 ICJweXRob24gcHJpbnQgbGVuKGdkYi5icmVha3BvaW50cygpKSIgIjQiICJj aGVjayBudW1iZXIgb2YgQlBzIgorZ2RiX3Rlc3QgImNvbnRpbnVlIiAiLipz dG9wcGVkIGF0IEV4Y2VwdGlvbkZpbmlzaEJyZWFrcG9pbnQuKiIgImNoZWNr IEZpbmlzaEJyZWFrcG9pbnQgaW4gY2F0Y2goKSIKK2dkYl90ZXN0ICJweXRo b24gcHJpbnQgbGVuKGdkYi5icmVha3BvaW50cygpKSIgIjQiICJjaGVjayBm aW5pc2ggQlAgcmVtb3ZhbCIKKworZ2RiX3Rlc3QgImNvbnRpbnVlIiAiLipl eGNlcHRpb24gZGlkIG5vdCBmaW5pc2guKiIgIkZpbmlzaEJyZWFrcG9pbnQg d2l0aCBleGNlcHRpb24gdGhyb3duIG5vdCBjYXVnaHQiCmRpZmYgLS1naXQg YS9nZGIvdGVzdHN1aXRlL2dkYi5weXRob24vcHktZmluaXNoLWJyZWFrcG9p bnQtY2MucHkgYi9nZGIvdGVzdHN1aXRlL2dkYi5weXRob24vcHktZmluaXNo LWJyZWFrcG9pbnQtY2MucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXgg MDAwMDAwMC4uZDBkZmUyZgotLS0gL2Rldi9udWxsCisrKyBiL2dkYi90ZXN0 c3VpdGUvZ2RiLnB5dGhvbi9weS1maW5pc2gtYnJlYWtwb2ludC1jYy5weQpA QCAtMCwwICsxLDQzIEBACisjIENvcHlyaWdodCAoQykgMjAxMSBGcmVlIFNv ZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworIyBUaGlzIHByb2dyYW0gaXMg ZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29y IG1vZGlmeQorIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5l cmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorIyB0aGUgRnJl ZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRo ZSBMaWNlbnNlLCBvcgorIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2 ZXJzaW9uLgorIworIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4g dGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhP VVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2Fy cmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEg UEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQ dWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIworIyBZb3Ugc2hv dWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQ dWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElm IG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKwor IyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR0RCIHRlc3RzdWl0ZS4gIEl0 IHRlc3RzIHB5dGhvbiBGaW5pc2gKKyMgQnJlYWtwb2ludHMuCisKK2NsYXNz IEV4Y2VwdGlvbkJyZWFrcG9pbnQoZ2RiLkJyZWFrcG9pbnQpOgorICAgIGRl ZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgZ2RiLkJyZWFrcG9pbnQuX19p bml0X18oc2VsZiwgc3BlYz0idGhyb3dfZXhjZXB0aW9uXzEiLCBpbnRlcm5h bD0xKQorICAgICAgICBzZWxmLnNpbGVudCA9IFRydWUKKyAgICAgICAgcHJp bnQgIkV4Y2VwdGlvbkJyZWFrcG9pbnQgaW5pdCIKKyAgICAgICAgCisgICAg ZGVmIHN0b3Aoc2VsZik6CisgICAgICAgIEV4Y2VwdGlvbkZpbmlzaEJyZWFr cG9pbnQoZ2RiLm5ld2VzdF9mcmFtZSgpKQorICAgICAgICByZXR1cm4gRmFs c2UKKworY2xhc3MgRXhjZXB0aW9uRmluaXNoQnJlYWtwb2ludChnZGIuRmlu aXNoQnJlYWtwb2ludCk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGZyYW1l KToKKyAgICAgICAgZ2RiLkZpbmlzaEJyZWFrcG9pbnQuX19pbml0X18oc2Vs ZiwgZnJhbWUsIGludGVybmFsPTEpCisgICAgICAgIHNlbGYuc2lsZW50ID0g VHJ1ZTsKKyAKKyAgICBkZWYgc3RvcChzZWxmKToKKwlwcmludCAic3RvcHBl ZCBhdCBFeGNlcHRpb25GaW5pc2hCcmVha3BvaW50IgorCWdkYi5wb3N0X2V2 ZW50KHNlbGYuZGVsZXRlKQorICAgICAgICByZXR1cm4gVHJ1ZSAKKyAgICAK KyAgICBkZWYgb3V0X29mX3Njb3BlKHNlbGYpOgorICAgICAgICBwcmludCAi ZXhjZXB0aW9uIGRpZCBub3QgZmluaXNoIC4uLiIKKworCitwcmludCAiUHl0 aG9uIHNjcmlwdCBpbXBvcnRlZCIKZGlmZiAtLWdpdCBhL2dkYi90ZXN0c3Vp dGUvZ2RiLnB5dGhvbi9weS1maW5pc2gtYnJlYWtwb2ludC5jIGIvZ2RiL3Rl c3RzdWl0ZS9nZGIucHl0aG9uL3B5LWZpbmlzaC1icmVha3BvaW50LmMKbmV3 IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzJiOGIzOAotLS0g L2Rldi9udWxsCisrKyBiL2dkYi90ZXN0c3VpdGUvZ2RiLnB5dGhvbi9weS1m aW5pc2gtYnJlYWtwb2ludC5jCkBAIC0wLDAgKzEsODIgQEAKKy8qIFRoaXMg dGVzdGNhc2UgaXMgcGFydCBvZiBHREIsIHRoZSBHTlUgZGVidWdnZXIuCisK KyAgIENvcHlyaWdodCAyMDExIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwg SW5jLgorCisgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91 IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgaXQgdW5k ZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5z ZSBhcyBwdWJsaXNoZWQgYnkKKyAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5k YXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCisg ICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBU aGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBp dCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5U WTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBN RVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBV UlBPU0UuICBTZWUgdGhlCisgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5z ZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVj ZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5z ZQorICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSAg PGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorKi8KKyNpbmNsdWRl IDxzZXRqbXAuaD4KKworaW50IGluY3JlYXNlXzEoaW50ICphKQoreworICAq YSArPSAxOworICByZXR1cm4gLTU7Cit9CisKK3ZvaWQgaW5jcmVhc2UoaW50 ICphKQoreworICBpbmNyZWFzZV8xKGEpOworfQorCitpbnQKK3Rlc3RfMShp bnQgaSwgaW50IGopCit7CisgIHJldHVybiBpID09IGo7Cit9CisKK2ludAor dGVzdChpbnQgaSwgaW50IGopCit7CisgIHJldHVybiB0ZXN0XzEoaSwgaik7 Cit9CisKK2ludAorY2FsbF9sb25nam1wXzEgKGptcF9idWYgKmJ1ZikKK3sK KyAgbG9uZ2ptcCAoKmJ1ZiwgMSk7Cit9CisKK2ludAorY2FsbF9sb25nam1w IChqbXBfYnVmICpidWYpCit7CisgIGNhbGxfbG9uZ2ptcF8xIChidWYpOwor fQorCisKK2ludCBtYWluIChpbnQgYXJnYywgY2hhciAqYXJndltdKQorewor ICBqbXBfYnVmIGVudjsKKyAgaW50IGZvbyA9IDU7CisgIGludCBiYXIgPSA0 MjsKKyAgaW50IGksIGo7CisKKyAgaSA9IDAgOworICAvKiBCcmVhayBhdCBp bmNyZWFzZS4gKi8KKyAgaW5jcmVhc2UgKCZpKSA7CisgIGluY3JlYXNlICgm aSkgOworICBpbmNyZWFzZSAoJmkpIDsKKworICBmb3IgKGkgPSAwOyBpIDwg MTA7IGkrKykKKyAgICB7CisgICAgICBqICs9IDE7IC8qIENvbmRpdGlvbiBC cmVhay4gKi8KKyAgICB9CisKKyAgaWYgKHNldGptcCAoZW52KSA9PSAwKSAv KiBsb25nam1wIGNhdWdodCAqLworICAgIHsKKyAgICAgIGNhbGxfbG9uZ2pt cCAoJmVudik7CisgICAgfQorICBlbHNlCisJICBqICs9IDE7IC8qIGFmdGVy IGxvbmdqbXAuICovCisKKyAgcmV0dXJuIGo7IC8qIEJyZWFrIGF0IGVuZC4g Ki8KK30KZGlmZiAtLWdpdCBhL2dkYi90ZXN0c3VpdGUvZ2RiLnB5dGhvbi9w eS1maW5pc2gtYnJlYWtwb2ludC5leHAgYi9nZGIvdGVzdHN1aXRlL2dkYi5w eXRob24vcHktZmluaXNoLWJyZWFrcG9pbnQuZXhwCm5ldyBmaWxlIG1vZGUg MTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY1ZWViYzkKLS0tIC9kZXYvbnVsbAor KysgYi9nZGIvdGVzdHN1aXRlL2dkYi5weXRob24vcHktZmluaXNoLWJyZWFr cG9pbnQuZXhwCkBAIC0wLDAgKzEsMTgzIEBACisjIENvcHlyaWdodCAoQykg MjAxMSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyMKKyMgVGhp cyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmli dXRlIGl0IGFuZC9vciBtb2RpZnkKKyMgaXQgdW5kZXIgdGhlIHRlcm1zIG9m IHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQg YnkKKyMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZl cnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKKyMgKGF0IHlvdXIgb3B0aW9u KSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGRp c3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWws CisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRo ZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBG SVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMg R05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4K KyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUg R05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlz IHByb2dyYW0uICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xp Y2Vuc2VzLz4uCisKKyMgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdEQiB0 ZXN0c3VpdGUuICBJdCB0ZXN0cyB0aGUgbWVjaGFuaXNtCisjIGV4cG9zaW5n IHZhbHVlcyB0byBQeXRob24uCisKK2lmICR0cmFjZWxldmVsIHRoZW4gewor ICAgIHN0cmFjZSAkdHJhY2VsZXZlbAorfQorCitsb2FkX2xpYiBnZGItcHl0 aG9uLmV4cAorCitzZXQgdGVzdGZpbGUgInB5LWZpbmlzaC1icmVha3BvaW50 Igorc2V0IHNyY2ZpbGUgJHt0ZXN0ZmlsZX0uYworCitpZiB7IFtwcmVwYXJl X2Zvcl90ZXN0aW5nICR7dGVzdGZpbGV9LmV4cCAke3Rlc3RmaWxlfSAke3Ny Y2ZpbGV9XSB9IHsKKyAgICByZXR1cm4gLTEKK30KKworc2V0IHJlbW90ZV9w eXRob25fZmlsZSBbcmVtb3RlX2Rvd25sb2FkIGhvc3QgJHtzcmNkaXJ9LyR7 c3ViZGlyfS8ke3Rlc3RmaWxlfS5weV0KKworCisjIFNraXAgYWxsIHRlc3Rz IGlmIFB5dGhvbiBzY3JpcHRpbmcgaXMgbm90IGVuYWJsZWQuCitpZiB7IFtz a2lwX3B5dGhvbl90ZXN0c10gfSB7IGNvbnRpbnVlIH0KKworIworIyBUZXN0 IEZpbmlzaEJyZWFrcG9pbnQgaW4gZnVuY3Rpb24gcmV0dXJuZWQgYnkgbG9u Z2ptcCAKKyMKKworY2xlYW5fcmVzdGFydCAke3Rlc3RmaWxlfQorCitpZiAh W3J1bnRvIGNhbGxfbG9uZ2ptcF8xXSB0aGVuIHsKKyAgICBwZXJyb3IgImNv dWxkbid0IHJ1biB0byBicmVha3BvaW50IGNhbGxfbG9uZ2ptcCIKKyAgICBj b250aW51ZQorfQorCitnZGJfdGVzdCAic291cmNlICRyZW1vdGVfcHl0aG9u X2ZpbGUiICIuKlB5dGhvbiBzY3JpcHQgaW1wb3J0ZWQuKiIgXAorICAgICAg ICAgImltcG9ydCBweXRob24gc2NyaXB0cyIKKworZ2RiX3Rlc3QgInB5dGhv biBsam1wQlAgPSBMb25nam1wRmluaXNoQnJlYWtwb2ludChnZGIubmV3ZXN0 X2ZyYW1lKCkpIiBcCisgICAgICAgICAiTG9uZ2ptcEZpbmlzaEJyZWFrcG9p bnQgaW5pdCIgXAorICAgICAgICAgInNldCBmaW5pc2ggYnJlYWtwb2ludCIg CitnZGJfdGVzdCAiYnJlYWsgW2dkYl9nZXRfbGluZV9udW1iZXIgImFmdGVy IGxvbmdqbXAuIl0iICJCcmVha3BvaW50LiogYXQgLioiIFwKKyAgICAgICAg ICJzZXQgQlAgYWZ0ZXIgdGhlIGp1bXAiCitnZGJfdGVzdCAiY29udGludWUi ICIuKkxvbmdqbXAgZGlkbid0IGZpbmlzaC4qIiAiY2hlY2sgRmluaXNoQlAg b3V0IG9mIHNjb3BlIG5vdGlmaWNhdGlvbiIKKworIworIyBUZXN0IEZpbmlz aEJyZWFrcG9pbnQgaW4gQlAgY29uZGl0aW9uIGV2YWx1YXRpb24gCisjIChm aW5pc2ggaW4gZHVtbXkgZnJhbWUpCisjCisKK2NsZWFuX3Jlc3RhcnQgJHt0 ZXN0ZmlsZX0KKworc2V0IGNvbmRfbGluZSBbZ2RiX2dldF9saW5lX251bWJl ciAiQ29uZGl0aW9uIEJyZWFrLiJdCitpZiAhW3J1bnRvX21haW5dIHRoZW4g eworICAgIGZhaWwgIkNhbm5vdCBydW4gdG8gbWFpbi4iCisgICAgcmV0dXJu IDAKK30KKworZ2RiX3Rlc3QgInNvdXJjZSAkcmVtb3RlX3B5dGhvbl9maWxl IiAiLipQeXRob24gc2NyaXB0IGltcG9ydGVkLioiIFwKKyAgICAgICAgICJp bXBvcnQgcHl0aG9uIHNjcmlwdHMiCisgICAgICAgICAKK2dkYl90ZXN0ICJi cmVhayAke2NvbmRfbGluZX0gaWYgdGVzdF8xKGksOCkiICIuKkJyZWFrcG9p bnQgLiogYXQgLioiICJzZXQgY29uZGl0aW9uYWwgQlAiCitnZGJfdGVzdCAi cHl0aG9uIFRlc3RCcmVha3BvaW50KCkiICJUZXN0QnJlYWtwb2ludCBpbml0 IiAic2V0IEJQIGluIGNvbmRpdGlvbiIKKworCitzZXQgbXNnICJjaGVjayBG aW5pc2hCcmVha3BvaW50IGRvbid0IHN0b3AgaW4gR0RCIER1bW15IEZyYW1l IgorZ2RiX3Rlc3RfbXVsdGlwbGUgImNvbnRpbnVlIiAkbXNnIHsKKwktcmUg Ii4qdGVzdCBkb24ndCBzdG9wIDIuKnRlc3Qgc3RvcC4qdGVzdCBkb24ndCBz dG9wIDQuKiIgeworCQlwYXNzICRtc2cKKwl9CisJLXJlICIuKnRlc3QgZG9u J3Qgc3RvcCAyLip0ZXN0IHN0b3AuKiRnZGJfcHJvbXB0IiB7CisJCWZhaWwg JG1zZworCX0KK30KKworZ2RiX3Rlc3QgInByaW50IGkiICI4IiAiY2hlY2sg c3RvcHBlZCBsb2NhdGlvbiIKKworIworIyBUZXN0IEZpbmlzaEJyZWFrcG9p bnQgaW4gQlAgY29uZGl0aW9uIGV2YWx1YXRpb24gCisjIChmaW5pc2ggaW4g bm9ybWFsIGZyYW1lKQorIworCitjbGVhbl9yZXN0YXJ0ICR7dGVzdGZpbGV9 CisKK2dkYl90ZXN0ICJzb3VyY2UgJHJlbW90ZV9weXRob25fZmlsZSIgIi4q UHl0aG9uIHNjcmlwdCBpbXBvcnRlZC4qIiBcCisgICAgICAgICAiaW1wb3J0 IHB5dGhvbiBzY3JpcHRzIgorCitpZiAhW3J1bnRvX21haW5dIHRoZW4gewor ICAgIGZhaWwgIkNhbm5vdCBydW4gdG8gbWFpbi4iCisgICAgcmV0dXJuIDAK K30KKworZ2RiX3Rlc3QgImJyZWFrICR7Y29uZF9saW5lfSBpZiB0ZXN0KGks OCkiICIuKkJyZWFrcG9pbnQgLiogYXQgLioiICJzZXQgY29uZGl0aW9uYWwg QlAiCitnZGJfdGVzdCAicHl0aG9uIFRlc3RCcmVha3BvaW50KCkiICJUZXN0 QnJlYWtwb2ludCBpbml0IiAic2V0IEJQIGluIGNvbmRpdGlvbiIKKworZ2Ri X3Rlc3QgImNvbnRpbnVlIiAiLip0ZXN0IGRvbid0IHN0b3AgMS4qdGVzdCBk b24ndCBzdG9wIDIuKnRlc3Qgc3RvcC4qRXJyb3IgaW4gdGVzdGluZyBicmVh a3BvaW50IGNvbmRpdGlvbi4qVGhlIHByb2dyYW0gYmVpbmcgZGVidWdnZWQg c3RvcHBlZCB3aGlsZSBpbiBhIGZ1bmN0aW9uIGNhbGxlZCBmcm9tIEdEQi4q IiBcCisgICAgICAgICAic3RvcCBpbiBjb25kaXRpb24gZnVuY3Rpb24iCisg ICAgICAgICAKK3NldHVwX2tmYWlsICJub3JtYWxfc3RvcF9ub3RpZmljYXRp b24gbm90IHRyaWdnZXJlZCBkdXJpbmcgY29uZGl0aW9uIGV2YWx1YXRpb24i ICotKi0qCitnZGJfdGVzdCAicHl0aG9uIHByaW50IGdkYi5icmVha3BvaW50 cygpXFsyXF0ub3V0X29mX3Njb3BlX25vdGlmIiAiLipGYWxzZS4qIiAiY2hl Y2sgb3V0X29mX3Njb3BlIG5vdGlmaWNhdGlvbiBkaXNhYmxlZCIKK2dkYl90 ZXN0X25vX291dHB1dCAicHl0aG9uIGdkYi5icmVha3BvaW50cygpXFsyXF0u b3V0X29mX3Njb3BlX25vdGlmID0gRmFsc2UiICJyZWVzdGFibGlzaCBjb3Jy ZWN0IHZhbHVlIgorCitnZGJfdGVzdCAiY29udGludWUiICJDb250aW51aW5n LioiICJmaW5pc2ggY29uZGl0aW9uIGV2YWx1YXRpb24iCitnZGJfdGVzdCAi Y29udGludWUiICJCcmVha3BvaW50LioiICJzdG9wIGF0IGNvbmRpdGlvbmFs IGJyZWFrcG9pbnQiCitnZGJfdGVzdCAicHJpbnQgaSIgIjgiICJjaGVjayBz dG9wcGVkIGxvY2F0aW9uIgorCisjCisjIFRlc3QgRmluaXNoQnJlYWtwb2lu dCBpbiBub3JtYWwgY29uZGl0aW9ucworIworCitjbGVhbl9yZXN0YXJ0ICR7 dGVzdGZpbGV9CisKK2lmICFbcnVudG9fbWFpbl0gdGhlbiB7CisgICAgZmFp bCAiQ2Fubm90IHJ1biB0byBtYWluLiIKKyAgICByZXR1cm4gMAorfQorZ2Ri X3Rlc3Rfbm9fb3V0cHV0ICJzZXQgY29uZmlybSBvZmYiICJkaXNhYmxlIGNv bmZpcm1hdGlvbiIKK2dkYl90ZXN0ICJzb3VyY2UgJHJlbW90ZV9weXRob25f ZmlsZSIgIi4qUHl0aG9uIHNjcmlwdCBpbXBvcnRlZC4qIiBcCisgICAgICAg ICAiaW1wb3J0IHB5dGhvbiBzY3JpcHRzIgorZ2RiX3Rlc3QgInB5dGhvbiBN eUJyZWFrcG9pbnQoXCJpbmNyZWFzZV8xXCIpIiAiLipCcmVha3BvaW50IDIu KiIgXAorICAgICAgICAgImNyZWF0ZSBQeXRob24gZnVuY3Rpb24gYnJlYWtw b2ludCIKK2dkYl90ZXN0ICJjb250aW51ZSIgIi4qQXJyaXZlZCBhdCBNeUJy ZWFrcG9pbnQgd2l0aCAwLioiICJjaGVjayBNeUJyZWFrcG9pbnQgaGl0Igor CisjIHNldCBGaW5pc2hCcmVha3BvaW50CisKK2dkYl90ZXN0ICJweXRob24g ZmluaXNoYnAgPSBNeUZpbmlzaEJyZWFrcG9pbnQgKGdkYi5wYXJzZV9hbmRf ZXZhbCAoXCJhXCIpLCBnZGIuc2VsZWN0ZWRfZnJhbWUgKCkpIiBcCisgICAg ICAgICAiLipCcmVha3BvaW50IDMuKiIgInNldCBGaW5pc2hCcmVha3BvaW50 IgorZ2RiX3Rlc3QgInB5dGhvbiBwcmludCBmaW5pc2hicC5vdXRfb2Zfc2Nv cGVfbm90aWYiICIuKlRydWUuKiIgXAorICAgICAgICAgImNoZWNrIG91dF9v Zl9zY29wZV9ub3RpZiBhdCBpbml0IgorZ2RiX3Rlc3QgInB5dGhvbiBwcmlu dCBmaW5pc2hicC5yZXR1cm5fdmFsdWUiICIuKk5vbmUuKiIgXAorICAgICAg ICAgImNoZWNrIHJldHVybl92YWx1ZSBhdCBpbml0IgorCisjIGNoZWNrIG5v cm1hbCBicCBoaXQKKworZ2RiX3Rlc3QgImNvbnRpbnVlIiAiLipNeUZpbmlz aEJyZWFrcG9pbnQgc3RvcCB3aXRoLiojMC4qaW5jcmVhc2UuKiIgXAorICAg ICAgICAgImNoZWNrIE15RmluaXNoQnJlYWtwb2ludCBoaXQiCitnZGJfdGVz dCAicHl0aG9uIHByaW50IGZpbmlzaGJwLnJldHVybl92YWx1ZSIgIi4qLTUu KiIgImNoZWNrIHJldHVybl92YWx1ZSIKK2dkYl90ZXN0ICJweXRob24gcHJp bnQgZmluaXNoYnAub3V0X29mX3Njb3BlX25vdGlmIiAiLipGYWxzZS4qIiBc CisgICAgICAgICAiY2hlY2sgb3V0X29mX3Njb3BlX25vdGlmIGRpc2FibGVk IGFmdGVyIGhpdCIKK2dkYl90ZXN0ICJmaW5pc2giICIuKm1haW4uKiIgInJl dHVybiB0byBtYWluKCkiCitnZGJfdGVzdCAicHl0aG9uIHByaW50IGZpbmlz aGJwLnJldHVybl92YWx1ZSIgIi4qTm9uZS4qIiAiY2hlY2sgcmV0dXJuX3Zh bHVlIgorCisjIGNoZWNrIGZvcmNlZCByZXR1cm4gLyBjaGVjayBvdXQgb2Yg c2Nwb3AKK2dkYl90ZXN0X25vX291dHB1dCAicHl0aG9uIGZpbmlzaGJwLm91 dF9vZl9zY29wZV9ub3RpZiA9IFRydWUiIFwKKyAgICAgICAgICJyZS1lbmFi bGUgb3V0X29mX3Njb3BlX25vdGlmIgorCitnZGJfdGVzdCAiY29udGludWUi ICIuKkFycml2ZWQgYXQgTXlCcmVha3BvaW50IHdpdGguKiIgImNoZWNrIE15 QnJlYWtwb2ludCBzZWNvbmQgaGl0IgorZ2RiX3Rlc3QgInVwIiAiLippbmNy ZWFzZV8xLioiICJnbyBvbmUgZnJhbWUgdXAiCitnZGJfdGVzdF9ub19vdXRw dXQgInJldHVybiIgInJldHVybiBmcm9tIHRoZSBmcmFtZSIKK2dkYl90ZXN0 ICJweXRob24gcHJpbnQgZmluaXNoYnAuY2hlY2tfc2NvcGUoKSIgIi4qTXlG aW5pc2hCcmVha3BvaW50IG91dCBvZiBzY29wZS4qVHJ1ZS4qIiBcCisgICAg ICAgICAiZ28gb25lIGZyYW1lIHVwIgorCisjIGNoZWNrIGZvcmNlZCByZXR1 cm4gLyBhdXRvbWF0aWMgbm90aWZpY2F0aW9uCisKK2dkYl90ZXN0X25vX291 dHB1dCAicHl0aG9uIGZpbmlzaGJwLm91dF9vZl9zY29wZV9ub3RpZiA9IFRy dWUiIFwKKyAgICAgICAgICJyZS1lbmFibGUgb3V0X29mX3Njb3BlX25vdGlm IgorCitnZGJfdGVzdCAiY29udGludWUiICIuKkFycml2ZWQgYXQgTXlCcmVh a3BvaW50IHdpdGguKiIgImNoZWNrIE15QnJlYWtwb2ludCB0aGlyZCBoaXQi CitnZGJfdGVzdCAidXAiICIuKmluY3JlYXNlXzEuKiIgImdvIG9uZSBmcmFt ZSB1cCIKK2dkYl90ZXN0X25vX291dHB1dCAicmV0dXJuIiAicmV0dXJuIGZy b20gdGhlIGZyYW1lIgorZ2RiX3Rlc3QgIm5leHQiICIuKk15RmluaXNoQnJl YWtwb2ludCBvdXQgb2Ygc2NvcGUuKiIgImNoZWNrIEZpbmlzaCBicmVha3Bv aW50IGRpc2NhcmQiCitnZGJfdGVzdCAicHl0aG9uIHByaW50IGZpbmlzaGJw Lm91dF9vZl9zY29wZV9ub3RpZiIgIi4qRmFsc2UuKiIgImNoZWNrIG91dF9v Zl9zY29wZV9ub3RpZiIKKworIyBjaGVjayBGaW5pc2hCcmVha3BvaW50IGlu IG1haW4KKworZ2RiX3Rlc3QgInB5dGhvbiBNeUZpbmlzaEJyZWFrcG9pbnQg KE5vbmUsIGdkYi5zZWxlY3RlZF9mcmFtZSAoKSkiIFwKKyAgICAgICAgICIu KlZhbHVlRXJyb3I6IFwiRmluaXNoQnJlYWtwb2ludFwiIG5vdCBtZWFuaW5n ZnVsIGluIHRoZSBvdXRlcm1vc3QgZnJhbWUuLioiIFwKKyAgICAgICAgICJj aGVjayBGaW5pc2hCUCBub3QgYWxsb3dlZCBpbiBtYWluIgorICAgICAgICAg CisgICAgICAgICAKZGlmZiAtLWdpdCBhL2dkYi90ZXN0c3VpdGUvZ2RiLnB5 dGhvbi9weS1maW5pc2gtYnJlYWtwb2ludC5weSBiL2dkYi90ZXN0c3VpdGUv Z2RiLnB5dGhvbi9weS1maW5pc2gtYnJlYWtwb2ludC5weQpuZXcgZmlsZSBt b2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMDE0Y2M2Ci0tLSAvZGV2L251 bGwKKysrIGIvZ2RiL3Rlc3RzdWl0ZS9nZGIucHl0aG9uL3B5LWZpbmlzaC1i cmVha3BvaW50LnB5CkBAIC0wLDAgKzEsODUgQEAKKyMgQ29weXJpZ2h0IChD KSAyMDExIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCisjIFRo aXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJp YnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisjIGl0IHVuZGVyIHRoZSB0ZXJtcyBv ZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVk IGJ5CisjIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2 ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCisjIChhdCB5b3VyIG9wdGlv bikgYW55IGxhdGVyIHZlcnNpb24uCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBk aXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVs LAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0 aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3Ig RklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisj IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMu CisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhl IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhp cyBwcm9ncmFtLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9s aWNlbnNlcy8+LgorCisjIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHREIg dGVzdHN1aXRlLiAgSXQgdGVzdHMgcHl0aG9uIEZpbmlzaAorIyBCcmVha3Bv aW50cy4KKworY2xhc3MgTXlCcmVha3BvaW50KGdkYi5CcmVha3BvaW50KToJ CQorCWRlZiBzdG9wKHNlbGYpOgorCQl2YWwgPSBnZGIucGFyc2VfYW5kX2V2 YWwgKCJhIikKKwkJcHJpbnQgIkFycml2ZWQgYXQgTXlCcmVha3BvaW50IHdp dGggJWQiICUgaW50KHZhbC5kZXJlZmVyZW5jZSgpKQorCQlyZXR1cm4gVHJ1 ZQorCQkKK2NsYXNzIE15RmluaXNoQnJlYWtwb2ludChnZGIuRmluaXNoQnJl YWtwb2ludCk6CisJZGVmIF9faW5pdF9fKHNlbGYsIHZhbCwgZnJhbWUpOgor CQlzdXBlciAoTXlGaW5pc2hCcmVha3BvaW50LCBzZWxmKS5fX2luaXRfXyAo ZnJhbWUpCisJCXByaW50ICJNeUZpbmlzaEJyZWFrcG9pbnQgaW5pdCIKKwkJ c2VsZi52YWwgPSB2YWwKKwkJCisJZGVmIHN0b3Aoc2VsZik6CisJCXByaW50 ICJNeUZpbmlzaEJyZWFrcG9pbnQgc3RvcCB3aXRoICVkIiAlIGludChzZWxm LnZhbC5kZXJlZmVyZW5jZSgpKQorCQlnZGIuZXhlY3V0ZSgid2hlcmUgMSIp CisJCXJldHVybiBUcnVlCisJCisJZGVmIG91dF9vZl9zY29wZShzZWxmKToK KwkJcHJpbnQgIk15RmluaXNoQnJlYWtwb2ludCBvdXQgb2Ygc2NvcGUuLi4i CisKK3Rlc3RfZmluaXNoX2JwID0gTm9uZSAKK2NsYXNzIFRlc3RCcmVha3Bv aW50KGdkYi5CcmVha3BvaW50KToKKyAgICBkZWYgX19pbml0X18oc2VsZik6 CisgICAgICAgIGdkYi5CcmVha3BvaW50Ll9faW5pdF9fKHNlbGYsIHNwZWM9 InRlc3RfMSIsIGludGVybmFsPTEpCisgICAgICAgIHNlbGYuc2lsZW50ID0g VHJ1ZQorICAgICAgICBzZWxmLmZpbmlzaCA9IE5vbmUKKyAgICAgICAgcHJp bnQgIlRlc3RCcmVha3BvaW50IGluaXQiCisgICAgICAgIAorICAgIGRlZiBz dG9wKHNlbGYpOgorICAgIAlnbG9iYWwgdGVzdF9maW5pc2hfYnAKKyAgICAg ICAgaWYgKHNlbGYuZmluaXNoID09IE5vbmUpOgorICAgICAgICAgICAgc2Vs Zi5maW5pc2ggPSBUZXN0RmluaXNoQnJlYWtwb2ludChnZGIubmV3ZXN0X2Zy YW1lKCkpCisgICAgICAgICAgICB0ZXN0X2ZpbmlzaF9icCA9IHNlbGYuZmlu aXNoCisgICAgICAgIHJldHVybiBGYWxzZQorCisKK2NsYXNzIFRlc3RGaW5p c2hCcmVha3BvaW50KGdkYi5GaW5pc2hCcmVha3BvaW50KToKKyAgICBkZWYg X19pbml0X18oc2VsZiwgZnJhbWUpOgorICAgICAgICBnZGIuRmluaXNoQnJl YWtwb2ludC5fX2luaXRfXyhzZWxmLCBmcmFtZSwgaW50ZXJuYWw9MSkKKyAg ICAgICAgc2VsZi5jb3VudCA9IDAKKyAgICAgICAgCisgICAgZGVmIHN0b3Ao c2VsZik6CisgICAgICAgIHNlbGYuY291bnQgKz0gMQorICAgICAgICBpZiAo c2VsZi5jb3VudCA9PSAzKToKKyAgICAgICAgICAgIHByaW50ICJ0ZXN0IHN0 b3AgLi4uIgorICAgICAgICAgICAgcmV0dXJuIFRydWUKKyAgICAgICAgZWxz ZToKKyAgICAgICAgICAgIHByaW50ICJ0ZXN0IGRvbid0IHN0b3AgJWQiICUg c2VsZi5jb3VudAorICAgICAgICAgICAgcmV0dXJuIEZhbHNlIAorICAgICAg ICAKKyAgICAKKyAgICBkZWYgb3V0X29mX3Njb3BlKHNlbGYpOgorICAgICAg ICBwcmludCAidGVzdCBkaWRuJ3QgZmluaXNoIC4uLiIKKwkJIAorY2xhc3Mg TG9uZ2ptcEZpbmlzaEJyZWFrcG9pbnQoZ2RiLkZpbmlzaEJyZWFrcG9pbnQp OgorCWRlZiBfX2luaXRfXyhzZWxmLCBmcmFtZSk6CisJCWdkYi5GaW5pc2hC cmVha3BvaW50Ll9faW5pdF9fKHNlbGYsIGZyYW1lLCBpbnRlcm5hbD0xKQor CQlwcmludCAiTG9uZ2ptcEZpbmlzaEJyZWFrcG9pbnQgaW5pdCIKKwkJCisJ ZGVmIHN0b3Aoc2VsZik6CisJCXByaW50ICJTdG9wcGVkIGF0IExvbmdqbXBG aW5pc2hCcmVha3BvaW50IgorICAgICAgICAKKyAgICAKKwlkZWYgb3V0X29m X3Njb3BlKHNlbGYpOgorCQlwcmludCAiTG9uZ2ptcCBkaWRuJ3QgZmluaXNo IC4uLiIKKworcHJpbnQgIlB5dGhvbiBzY3JpcHQgaW1wb3J0ZWQiCi0tIAox LjcuNC40Cgo= --bcaec5014c4713d6c304a3891550--