From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 45363C43217 for ; Thu, 24 Nov 2022 15:11:41 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229967AbiKXPLj (ORCPT ); Thu, 24 Nov 2022 10:11:39 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:53592 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229853AbiKXPLg (ORCPT ); Thu, 24 Nov 2022 10:11:36 -0500 Received: from dfw.source.kernel.org (dfw.source.kernel.org [139.178.84.217]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id D808D15B4E5 for ; Thu, 24 Nov 2022 07:11:35 -0800 (PST) Received: from smtp.kernel.org (relay.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by dfw.source.kernel.org (Postfix) with ESMTPS id 66724621AC for ; Thu, 24 Nov 2022 15:11:35 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id CA8E0C43147 for ; Thu, 24 Nov 2022 15:11:34 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1669302694; bh=GAJszz1anTsyFOPZYjqt7c7rfYbHUSpWhZeNuUZjPAI=; h=References:In-Reply-To:From:Date:Subject:To:Cc:From; b=Ne7notNf+PN8jzn4ElQJeEAnrwqG4JNFB2vcNNYGBB09r6IHOJSzEcvrZT2Abrmw1 3ABXhk+R3f3dWYlABWhX1oEapHMQH19LQ7yBWVzy/q4DLZ1zIEC6CpKN6PC4ypzPUO XaUUrcA0k/LdPM9For2dcpjHO5ddwGJcntMm7o0TJXKWBs47Pc6WkoDpSGSYsBZUPp lJvH0w10cpzzlL56w6ftBwlTcZG+ZLgz+U8e43Pkfn3rgJSw4e3FYb8s+EKqulxROo 9pm76JB50dav5ngcyH5LdBKgFviDFEMvJke4MGeIpfA9u23F9ysqOwPeIE/u+qyp/9 RxqlBtuw/2JHw== Received: by mail-ed1-f45.google.com with SMTP id f7so2916387edc.6 for ; Thu, 24 Nov 2022 07:11:34 -0800 (PST) X-Gm-Message-State: ANoB5pmwynhfZy3v5A+XxfjJG/osBfypFVdOugH2rHMUIaXaKxw6cUng MEGdvoMCUmne6fDgGIcdCpr62pQnMOpvzNKkSFU= X-Google-Smtp-Source: AA0mqf5RW0K3dXQMOm5gjhFJ6hMSmCvigSouFXI9DaTJxNgZbT9oz+pvYdrwnMdX9wy+wl6OXPuhTtkSCrLo93Bp9R0= X-Received: by 2002:a05:6402:1a:b0:467:30ad:c4ca with SMTP id d26-20020a056402001a00b0046730adc4camr30794889edu.285.1669302692921; Thu, 24 Nov 2022 07:11:32 -0800 (PST) MIME-Version: 1.0 References: <20221123142025.1504030-1-suagrfillet@gmail.com> <20221123142025.1504030-2-suagrfillet@gmail.com> In-Reply-To: From: Guo Ren Date: Thu, 24 Nov 2022 23:11:20 +0800 X-Gmail-Original-Message-ID: Message-ID: Subject: Re: [PATCH 1/2] riscv/ftrace: add DYNAMIC_FTRACE_WITH_DIRECT_CALLS support To: Song Shuai Cc: paul.walmsley@sifive.com, palmer@dabbelt.com, aou@eecs.berkeley.edu, rostedt@goodmis.org, mhiramat@kernel.org, mark.rutland@arm.com, peterz@infradead.org, jolsa@redhat.com, bp@suse.de, jpoimboe@kernel.org, linux-riscv@lists.infradead.org, linux-kernel@vger.kernel.org Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Thu, Nov 24, 2022 at 7:49 PM Song Shuai wrote: > > Guo Ren =E4=BA=8E2022=E5=B9=B411=E6=9C=8824=E6=97=A5= =E5=91=A8=E5=9B=9B 03:40=E5=86=99=E9=81=93=EF=BC=9A > > > > On Thu, Nov 24, 2022 at 11:09 AM Song Shuai wro= te: > > > > > > Song Shuai =E4=BA=8E2022=E5=B9=B411=E6=9C=882= 4=E6=97=A5=E5=91=A8=E5=9B=9B 02:52=E5=86=99=E9=81=93=EF=BC=9A > > > > > > > > Guo Ren =E4=BA=8E2022=E5=B9=B411=E6=9C=8824=E6= =97=A5=E5=91=A8=E5=9B=9B 02:08=E5=86=99=E9=81=93=EF=BC=9A > > > > > > > > > > On Thu, Nov 24, 2022 at 1:27 AM Song Shuai wrote: > > > > > > > > > > > > Guo Ren =E4=BA=8E2022=E5=B9=B411=E6=9C=8823= =E6=97=A5=E5=91=A8=E4=B8=89 23:02=E5=86=99=E9=81=93=EF=BC=9A > > > > > > > > > > > > > > Cool job, thx. > > > > > > > > > > > > > > On Wed, Nov 23, 2022 at 10:20 PM Song Shuai wrote: > > > > > > >> > > > > > > >> This patch adds DYNAMIC_FTRACE_WITH_DIRECT_CALLS support for= RISC-V. > > > > > > >> > > > > > > >> select the DYNAMIC_FTRACE_WITH_DIRECT_CALLS to provide the > > > > > > >> register_ftrace_direct[_multi] interfaces allowing users to = register > > > > > > >> the customed trampoline (direct_caller) as the mcount for on= e or > > > > > > >> more target functions. And modify_ftrace_direct[_multi] are = also > > > > > > >> provided for modifying direct_caller. > > > > > > >> > > > > > > >> To make the direct_caller and the other ftrace hooks (eg. fu= nction/fgraph > > > > > > >> tracer, k[ret]probes) co-exist, a temporary register is nomi= nated to > > > > > > >> store the address of direct_caller in ftrace_regs_caller. Af= ter the > > > > > > >> setting of the address direct_caller by direct_ops->func and= the > > > > > > >> RESTORE_REGS in ftrace_regs_caller, direct_caller will be ju= mped to > > > > > > >> by the `jr` inst. > > > > > > >> > > > > > > >> Signed-off-by: Song Shuai > > > > > > >> --- > > > > > > >> arch/riscv/Kconfig | 1 + > > > > > > >> arch/riscv/include/asm/ftrace.h | 6 ++++++ > > > > > > >> arch/riscv/kernel/mcount-dyn.S | 4 ++++ > > > > > > >> 3 files changed, 11 insertions(+) > > > > > > >> > > > > > > >> diff --git a/arch/riscv/Kconfig b/arch/riscv/Kconfig > > > > > > >> index 39ec8d628cf6..d083ec08d0b6 100644 > > > > > > >> --- a/arch/riscv/Kconfig > > > > > > >> +++ b/arch/riscv/Kconfig > > > > > > >> @@ -278,6 +278,7 @@ config ARCH_RV64I > > > > > > >> select ARCH_SUPPORTS_INT128 if CC_HAS_INT128 > > > > > > >> select HAVE_DYNAMIC_FTRACE if !XIP_KERNEL && MMU && = $(cc-option,-fpatchable-function-entry=3D8) > > > > > > >> select HAVE_DYNAMIC_FTRACE_WITH_REGS if HAVE_DYNAMIC= _FTRACE > > > > > > >> + select HAVE_DYNAMIC_FTRACE_WITH_DIRECT_CALLS > > > > > > >> select HAVE_FTRACE_MCOUNT_RECORD if !XIP_KERNEL > > > > > > >> select HAVE_FUNCTION_GRAPH_TRACER > > > > > > >> select HAVE_FUNCTION_TRACER if !XIP_KERNEL && !PREEM= PTION > > > > > > >> diff --git a/arch/riscv/include/asm/ftrace.h b/arch/riscv/in= clude/asm/ftrace.h > > > > > > >> index 01bebb28eabe..be4d57566139 100644 > > > > > > >> --- a/arch/riscv/include/asm/ftrace.h > > > > > > >> +++ b/arch/riscv/include/asm/ftrace.h > > > > > > >> @@ -114,6 +114,12 @@ struct ftrace_regs; > > > > > > >> void ftrace_graph_func(unsigned long ip, unsigned long pare= nt_ip, > > > > > > >> struct ftrace_ops *op, struct ftrace_= regs *fregs); > > > > > > >> #define ftrace_graph_func ftrace_graph_func > > > > > > >> + > > > > > > >> +static inline void arch_ftrace_set_direct_caller(struct pt_= regs *regs, unsigned long addr) > > > > > > >> +{ > > > > > > >> + regs->t1 =3D addr; > > > > > > > > > > > > > > How about regs->t0 =3D addr; ? > > > > > > > And delete all mcount-dyn.S modification. > > > > > > > > > > > > > The direct_caller has the same program layout as the ftrace_cal= ler, which means > > > > > > the reg t0 will never be changed when direct_caller returns. > > > > > > > > > > > > If regs->t0 changes here and ftrace_regs_caller executes `jr t0= `, > > > > > > direct_caller will enter the dead loop. > > > > > ? > > > > > > > > > > ftrace_regs_caller->call_direct_funcs-> > > > > > arch_ftrace_set_direct_caller-> ftrace_regs_caller jr t0. > > > > > > > > > > Only call_direct_funcs call arch_ftrace_set_direct_caller ! > > > > > > > > > > static void call_direct_funcs(unsigned long ip, unsigned long pip= , > > > > > struct ftrace_ops *ops, struct ftra= ce_regs *fregs) > > > > > { > > > > > struct pt_regs *regs =3D ftrace_get_regs(fregs); > > > > > unsigned long addr; > > > > > > > > > > addr =3D ftrace_find_rec_direct(ip); > > > > > if (!addr) > > > > > return; > > > > > > > > > > arch_ftrace_set_direct_caller(regs, addr); > > > > > } > > > > > > > > > When direct_caller and function tracer co-hook a function, the simp= le > > > > diagram is like this: > > > > > > > > ``` > > > > func -> ftrace_regs_caller -> arch_ftrace_ops_list_func -> > > > > function_trace_call // write ringbuffer > > > > | > > > > -> call_direct_funcs // regs->t1 =3D direct_caller > > > > -> t1 !=3D0 && jr t1 // goto direct_caller > > > > ``` > > > > > > > ``` > > > f -- regs_caller -- list_func > > > | | -- function_trace_call > > > | | -- call_direct_funcs // t1 =3D addr > > > |-- t1 !=3D0 && jr t1 // goto direct_caller > > Cool diagram! Thx, but we still need a discussion: > > f -- regs_caller > > | -- SAVE_ABI_REGS 1 > > | -- list_func > > | | -- function_trace_call > > | | -- call_direct_funcs // t1 =3D addr > > | -- RESTORE_ABI_REGS 1 > > |-- t1 !=3D0 && jr t1 // goto direct_caller > > If you set t1 non-zero, then we always go to direct_caller. I think > > the code is equal to set t0=3Daddr. > If only focusing on the whole ftrace_regs_caller code, you're right. Yes, that's the problem I have; I didn't look at the sample code. t0 -> ftrace caller t1 -> my_tramp1 (direct caller) ra -> original func return addr. Okay, I would include these patches in v4. Reviewed-by: Guo Ren > > But we should also take direct_caller code into the consideration, > if using t0 here, direct_caller will always return to itself as I > described before. > > | | -- call_direct_funcs // t0 =3D addr > > | -- RESTORE_ABI_REGS 1 > > |-- jr t0 // goto direct_caller > > > > I think the only problem happens in the below non-existent situation: > > f -- regs_caller > > | -- SAVE_ABI_REGS 1 > > | -- list_func > > | | -- call_direct_funcs // t0 =3D addr > > | | -- function_trace_call //t0 contains > > direct_caller instead > function_trace_call is one type of global_ops->func which doesn't take ca= re > of the regs->t0. > > But the func of IPMODIFY ops (eg. livepatch, kprobe with posthandler) > will change regs->epc which will then be restored to t0 in ftrace_regs_ca= ller. > And then the address of direct_caller will be covered in this situation. > I'm not very clear about the process of the livepatch and kprobe in RISCV > but I think we should keep t0 for their ipmodifying. > > | -- RESTORE_ABI_REGS 1 > > |-- jr t0 // goto direct_caller > > > > The key issue is whether going to direct_caller correctly depends on > > call_direct_funcs called, right? > Yes, in other words, call_direct_func informs ftrace_regs_caller that > there is a direct caller stored in t1, please jump to it first. > > > > > ``` > > > This diagram looks better. > > > > And the direct_caller has a similar implement as ftrace_caller. > > > > > > > > ``` > > > > direct_caller: > > > > add sp,sp,-? > > > > sd t0,?(sp) > > > > sd ra,?(sp) > > > > call foo > > > > ld t0,?(sp) > > > > ld ra,?(sp) > > > > add sp,sp,? > > > > jr t0 // <- back to function entry > > > > ``` > > > > > > > > If we change regs->t0 as direct_caller and execute `jr t0` directly= , > > > > the direct_caller will always jump to itself due to its last `jr` i= nst. > --- Here is what I described in the previous email. > > > > > > > > ``` > > > > func -> ftrace_regs_caller -> arch_ftrace_ops_list_func -> > > > > function_trace_call // write ringbuffer > > > > | > > > > -> call_direct_funcs // regs->t0 =3D direct_caller > > > > -> jr t0 // goto direct_caller > > > > > > > > direct_caller: > > > > ... > > > > sd t0,?(sp) > > > > ... > > > > ld t0,?(s0) > > > > ... > > > > jr t0 // goto direct_caller always > > > > ``` > > > > > > > > Hope I made it clear. > > > > > > > > > > > > Actually the reg t0 always saves the address of function entry = with 8B > > > > > > offset, it should only > > > > > > changed by the IPMODIFY ops instead of the direct_ops. > > > > > > >> > > > > > > >> +} > > > > > > >> + > > > > > > >> #endif /* CONFIG_DYNAMIC_FTRACE_WITH_REGS */ > > > > > > >> > > > > > > >> #endif /* __ASSEMBLY__ */ > > > > > > >> diff --git a/arch/riscv/kernel/mcount-dyn.S b/arch/riscv/ker= nel/mcount-dyn.S > > > > > > >> index 466c6ef217b1..b89c85a58569 100644 > > > > > > >> --- a/arch/riscv/kernel/mcount-dyn.S > > > > > > >> +++ b/arch/riscv/kernel/mcount-dyn.S > > > > > > >> @@ -233,6 +233,7 @@ ENDPROC(ftrace_caller) > > > > > > >> #else /* CONFIG_DYNAMIC_FTRACE_WITH_REGS */ > > > > > > >> ENTRY(ftrace_regs_caller) > > > > > > >> SAVE_ABI_REGS 1 > > > > > > >> + REG_S x0, PT_T1(sp) > > > > > > >> PREPARE_ARGS > > > > > > >> > > > > > > >> ftrace_regs_call: > > > > > > >> @@ -241,7 +242,10 @@ ftrace_regs_call: > > > > > > >> > > > > > > >> > > > > > > >> RESTORE_ABI_REGS 1 > > > > > > >> + bnez t1,.Ldirect > > > > > > >> jr t0 > > > > > > >> +.Ldirect: > > > > > > >> + jr t1 > > > > > > >> ENDPROC(ftrace_regs_caller) > > > > > > >> > > > > > > >> ENTRY(ftrace_caller) > > > > > > >> -- > > > > > > >> 2.20.1 > > > > > > >> > > > > > > > > > > > > > > > > > > > > > -- > > > > > > > Best Regards > > > > > > > Guo Ren > > > > > > > > > > > > > > > > > > > > -- > > > > > Best Regards > > > > > Guo Ren > > > > Thanks, > > > > Song > > > Thanks, > > > Song > > > > > > > > -- > > Best Regards > > Guo Ren > Thanks, > Song --=20 Best Regards Guo Ren From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 2EA96C43217 for ; Thu, 24 Nov 2022 15:11:50 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender: Content-Transfer-Encoding:Content-Type:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:Cc:To:Subject:Message-ID:Date:From: In-Reply-To:References:MIME-Version:Reply-To:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=aGwxbVNrcnqmqBo3tieY66zLzNt3ta3WpnJfm0hfavM=; b=iIWxRSiyRIoOnf ykOvxWkXlRvWA8kbSNLFi/VNSN2fE54QMX1aJeYbX2rXFlBNQQrGQh6e7cDQjNaDfB7S7ARabnWL/ 3BCShigEVpXMWKmVtUXwwD9O57IgwbnZ+ZbmdiicswPekZHpDHsIuhAYuCSTnGA39QMH4+QYwkg92 hie9ExT2+TFaXGgOtDVc6+wIsg3KEraRqaoTTIBL4gRf+PNflo4Cj6Vx2yS8a7l6ZQSO+yBJQxYwK CzJJra9AQZ+Que5GJ8WM9iAaOzrOALCQXeEFLKVsBAaMxxLmCssSJ6K6+96j/92PB7psO2v84iRjf GKCUxxuqJoQ41AkA1dFQ==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.94.2 #2 (Red Hat Linux)) id 1oyDt7-009b9P-9l; Thu, 24 Nov 2022 15:11:41 +0000 Received: from ams.source.kernel.org ([2604:1380:4601:e00::1]) by bombadil.infradead.org with esmtps (Exim 4.94.2 #2 (Red Hat Linux)) id 1oyDt4-009b7Q-41 for linux-riscv@lists.infradead.org; Thu, 24 Nov 2022 15:11:40 +0000 Received: from smtp.kernel.org (relay.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ams.source.kernel.org (Postfix) with ESMTPS id 10490B8284A for ; Thu, 24 Nov 2022 15:11:36 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id C0CADC433C1 for ; Thu, 24 Nov 2022 15:11:34 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1669302694; bh=GAJszz1anTsyFOPZYjqt7c7rfYbHUSpWhZeNuUZjPAI=; h=References:In-Reply-To:From:Date:Subject:To:Cc:From; b=Ne7notNf+PN8jzn4ElQJeEAnrwqG4JNFB2vcNNYGBB09r6IHOJSzEcvrZT2Abrmw1 3ABXhk+R3f3dWYlABWhX1oEapHMQH19LQ7yBWVzy/q4DLZ1zIEC6CpKN6PC4ypzPUO XaUUrcA0k/LdPM9For2dcpjHO5ddwGJcntMm7o0TJXKWBs47Pc6WkoDpSGSYsBZUPp lJvH0w10cpzzlL56w6ftBwlTcZG+ZLgz+U8e43Pkfn3rgJSw4e3FYb8s+EKqulxROo 9pm76JB50dav5ngcyH5LdBKgFviDFEMvJke4MGeIpfA9u23F9ysqOwPeIE/u+qyp/9 RxqlBtuw/2JHw== Received: by mail-ed1-f45.google.com with SMTP id r26so835107edc.10 for ; Thu, 24 Nov 2022 07:11:34 -0800 (PST) X-Gm-Message-State: ANoB5pkaNjI22TfltCDVcXUj/cUjJM6EX+yg3xbyA4kzyYkV9qP103dZ H0Q4VFRNkySgLc+L+6C/9NguIg8sX90SDoQT7YQ= X-Google-Smtp-Source: AA0mqf5RW0K3dXQMOm5gjhFJ6hMSmCvigSouFXI9DaTJxNgZbT9oz+pvYdrwnMdX9wy+wl6OXPuhTtkSCrLo93Bp9R0= X-Received: by 2002:a05:6402:1a:b0:467:30ad:c4ca with SMTP id d26-20020a056402001a00b0046730adc4camr30794889edu.285.1669302692921; Thu, 24 Nov 2022 07:11:32 -0800 (PST) MIME-Version: 1.0 References: <20221123142025.1504030-1-suagrfillet@gmail.com> <20221123142025.1504030-2-suagrfillet@gmail.com> In-Reply-To: From: Guo Ren Date: Thu, 24 Nov 2022 23:11:20 +0800 X-Gmail-Original-Message-ID: Message-ID: Subject: Re: [PATCH 1/2] riscv/ftrace: add DYNAMIC_FTRACE_WITH_DIRECT_CALLS support To: Song Shuai Cc: paul.walmsley@sifive.com, palmer@dabbelt.com, aou@eecs.berkeley.edu, rostedt@goodmis.org, mhiramat@kernel.org, mark.rutland@arm.com, peterz@infradead.org, jolsa@redhat.com, bp@suse.de, jpoimboe@kernel.org, linux-riscv@lists.infradead.org, linux-kernel@vger.kernel.org X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20221124_071138_492339_D55A81DC X-CRM114-Status: GOOD ( 50.25 ) X-BeenThere: linux-riscv@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Sender: "linux-riscv" Errors-To: linux-riscv-bounces+linux-riscv=archiver.kernel.org@lists.infradead.org T24gVGh1LCBOb3YgMjQsIDIwMjIgYXQgNzo0OSBQTSBTb25nIFNodWFpIDxzdWFncmZpbGxldEBn bWFpbC5jb20+IHdyb3RlOgo+Cj4gR3VvIFJlbiA8Z3VvcmVuQGtlcm5lbC5vcmc+IOS6jjIwMjLl ubQxMeaciDI05pel5ZGo5ZubIDAzOjQw5YaZ6YGT77yaCj4gPgo+ID4gT24gVGh1LCBOb3YgMjQs IDIwMjIgYXQgMTE6MDkgQU0gU29uZyBTaHVhaSA8c3VhZ3JmaWxsZXRAZ21haWwuY29tPiB3cm90 ZToKPiA+ID4KPiA+ID4gU29uZyBTaHVhaSA8c3VhZ3JmaWxsZXRAZ21haWwuY29tPiDkuo4yMDIy 5bm0MTHmnIgyNOaXpeWRqOWbmyAwMjo1MuWGmemBk++8mgo+ID4gPiA+Cj4gPiA+ID4gR3VvIFJl biA8Z3VvcmVuQGtlcm5lbC5vcmc+IOS6jjIwMjLlubQxMeaciDI05pel5ZGo5ZubIDAyOjA45YaZ 6YGT77yaCj4gPiA+ID4gPgo+ID4gPiA+ID4gT24gVGh1LCBOb3YgMjQsIDIwMjIgYXQgMToyNyBB TSBTb25nIFNodWFpIDxzdWFncmZpbGxldEBnbWFpbC5jb20+IHdyb3RlOgo+ID4gPiA+ID4gPgo+ ID4gPiA+ID4gPiBHdW8gUmVuIDxndW9yZW5Aa2VybmVsLm9yZz4g5LqOMjAyMuW5tDEx5pyIMjPm l6XlkajkuIkgMjM6MDLlhpnpgZPvvJoKPiA+ID4gPiA+ID4gPgo+ID4gPiA+ID4gPiA+IENvb2wg am9iLCB0aHguCj4gPiA+ID4gPiA+ID4KPiA+ID4gPiA+ID4gPiBPbiBXZWQsIE5vdiAyMywgMjAy MiBhdCAxMDoyMCBQTSBTb25nIFNodWFpIDxzdWFncmZpbGxldEBnbWFpbC5jb20+IHdyb3RlOgo+ ID4gPiA+ID4gPiA+Pgo+ID4gPiA+ID4gPiA+PiBUaGlzIHBhdGNoIGFkZHMgRFlOQU1JQ19GVFJB Q0VfV0lUSF9ESVJFQ1RfQ0FMTFMgc3VwcG9ydCBmb3IgUklTQy1WLgo+ID4gPiA+ID4gPiA+Pgo+ ID4gPiA+ID4gPiA+PiBzZWxlY3QgdGhlIERZTkFNSUNfRlRSQUNFX1dJVEhfRElSRUNUX0NBTExT IHRvIHByb3ZpZGUgdGhlCj4gPiA+ID4gPiA+ID4+IHJlZ2lzdGVyX2Z0cmFjZV9kaXJlY3RbX211 bHRpXSBpbnRlcmZhY2VzIGFsbG93aW5nIHVzZXJzIHRvIHJlZ2lzdGVyCj4gPiA+ID4gPiA+ID4+ IHRoZSBjdXN0b21lZCB0cmFtcG9saW5lIChkaXJlY3RfY2FsbGVyKSBhcyB0aGUgbWNvdW50IGZv ciBvbmUgb3IKPiA+ID4gPiA+ID4gPj4gbW9yZSB0YXJnZXQgZnVuY3Rpb25zLiBBbmQgbW9kaWZ5 X2Z0cmFjZV9kaXJlY3RbX211bHRpXSBhcmUgYWxzbwo+ID4gPiA+ID4gPiA+PiBwcm92aWRlZCBm b3IgbW9kaWZ5aW5nIGRpcmVjdF9jYWxsZXIuCj4gPiA+ID4gPiA+ID4+Cj4gPiA+ID4gPiA+ID4+ IFRvIG1ha2UgdGhlIGRpcmVjdF9jYWxsZXIgYW5kIHRoZSBvdGhlciBmdHJhY2UgaG9va3MgKGVn LiBmdW5jdGlvbi9mZ3JhcGgKPiA+ID4gPiA+ID4gPj4gdHJhY2VyLCBrW3JldF1wcm9iZXMpIGNv LWV4aXN0LCBhIHRlbXBvcmFyeSByZWdpc3RlciBpcyBub21pbmF0ZWQgdG8KPiA+ID4gPiA+ID4g Pj4gc3RvcmUgdGhlIGFkZHJlc3Mgb2YgZGlyZWN0X2NhbGxlciBpbiBmdHJhY2VfcmVnc19jYWxs ZXIuIEFmdGVyIHRoZQo+ID4gPiA+ID4gPiA+PiBzZXR0aW5nIG9mIHRoZSBhZGRyZXNzIGRpcmVj dF9jYWxsZXIgYnkgZGlyZWN0X29wcy0+ZnVuYyBhbmQgdGhlCj4gPiA+ID4gPiA+ID4+IFJFU1RP UkVfUkVHUyBpbiBmdHJhY2VfcmVnc19jYWxsZXIsIGRpcmVjdF9jYWxsZXIgd2lsbCBiZSBqdW1w ZWQgdG8KPiA+ID4gPiA+ID4gPj4gYnkgdGhlIGBqcmAgaW5zdC4KPiA+ID4gPiA+ID4gPj4KPiA+ ID4gPiA+ID4gPj4gU2lnbmVkLW9mZi1ieTogU29uZyBTaHVhaSA8c3VhZ3JmaWxsZXRAZ21haWwu Y29tPgo+ID4gPiA+ID4gPiA+PiAtLS0KPiA+ID4gPiA+ID4gPj4gIGFyY2gvcmlzY3YvS2NvbmZp ZyAgICAgICAgICAgICAgfCAxICsKPiA+ID4gPiA+ID4gPj4gIGFyY2gvcmlzY3YvaW5jbHVkZS9h c20vZnRyYWNlLmggfCA2ICsrKysrKwo+ID4gPiA+ID4gPiA+PiAgYXJjaC9yaXNjdi9rZXJuZWwv bWNvdW50LWR5bi5TICB8IDQgKysrKwo+ID4gPiA+ID4gPiA+PiAgMyBmaWxlcyBjaGFuZ2VkLCAx MSBpbnNlcnRpb25zKCspCj4gPiA+ID4gPiA+ID4+Cj4gPiA+ID4gPiA+ID4+IGRpZmYgLS1naXQg YS9hcmNoL3Jpc2N2L0tjb25maWcgYi9hcmNoL3Jpc2N2L0tjb25maWcKPiA+ID4gPiA+ID4gPj4g aW5kZXggMzllYzhkNjI4Y2Y2Li5kMDgzZWMwOGQwYjYgMTAwNjQ0Cj4gPiA+ID4gPiA+ID4+IC0t LSBhL2FyY2gvcmlzY3YvS2NvbmZpZwo+ID4gPiA+ID4gPiA+PiArKysgYi9hcmNoL3Jpc2N2L0tj b25maWcKPiA+ID4gPiA+ID4gPj4gQEAgLTI3OCw2ICsyNzgsNyBAQCBjb25maWcgQVJDSF9SVjY0 SQo+ID4gPiA+ID4gPiA+PiAgICAgICAgIHNlbGVjdCBBUkNIX1NVUFBPUlRTX0lOVDEyOCBpZiBD Q19IQVNfSU5UMTI4Cj4gPiA+ID4gPiA+ID4+ICAgICAgICAgc2VsZWN0IEhBVkVfRFlOQU1JQ19G VFJBQ0UgaWYgIVhJUF9LRVJORUwgJiYgTU1VICYmICQoY2Mtb3B0aW9uLC1mcGF0Y2hhYmxlLWZ1 bmN0aW9uLWVudHJ5PTgpCj4gPiA+ID4gPiA+ID4+ICAgICAgICAgc2VsZWN0IEhBVkVfRFlOQU1J Q19GVFJBQ0VfV0lUSF9SRUdTIGlmIEhBVkVfRFlOQU1JQ19GVFJBQ0UKPiA+ID4gPiA+ID4gPj4g KyAgICAgICBzZWxlY3QgSEFWRV9EWU5BTUlDX0ZUUkFDRV9XSVRIX0RJUkVDVF9DQUxMUwo+ID4g PiA+ID4gPiA+PiAgICAgICAgIHNlbGVjdCBIQVZFX0ZUUkFDRV9NQ09VTlRfUkVDT1JEIGlmICFY SVBfS0VSTkVMCj4gPiA+ID4gPiA+ID4+ICAgICAgICAgc2VsZWN0IEhBVkVfRlVOQ1RJT05fR1JB UEhfVFJBQ0VSCj4gPiA+ID4gPiA+ID4+ICAgICAgICAgc2VsZWN0IEhBVkVfRlVOQ1RJT05fVFJB Q0VSIGlmICFYSVBfS0VSTkVMICYmICFQUkVFTVBUSU9OCj4gPiA+ID4gPiA+ID4+IGRpZmYgLS1n aXQgYS9hcmNoL3Jpc2N2L2luY2x1ZGUvYXNtL2Z0cmFjZS5oIGIvYXJjaC9yaXNjdi9pbmNsdWRl L2FzbS9mdHJhY2UuaAo+ID4gPiA+ID4gPiA+PiBpbmRleCAwMWJlYmIyOGVhYmUuLmJlNGQ1NzU2 NjEzOSAxMDA2NDQKPiA+ID4gPiA+ID4gPj4gLS0tIGEvYXJjaC9yaXNjdi9pbmNsdWRlL2FzbS9m dHJhY2UuaAo+ID4gPiA+ID4gPiA+PiArKysgYi9hcmNoL3Jpc2N2L2luY2x1ZGUvYXNtL2Z0cmFj ZS5oCj4gPiA+ID4gPiA+ID4+IEBAIC0xMTQsNiArMTE0LDEyIEBAIHN0cnVjdCBmdHJhY2VfcmVn czsKPiA+ID4gPiA+ID4gPj4gIHZvaWQgZnRyYWNlX2dyYXBoX2Z1bmModW5zaWduZWQgbG9uZyBp cCwgdW5zaWduZWQgbG9uZyBwYXJlbnRfaXAsCj4gPiA+ID4gPiA+ID4+ICAgICAgICAgICAgICAg ICAgICAgICAgc3RydWN0IGZ0cmFjZV9vcHMgKm9wLCBzdHJ1Y3QgZnRyYWNlX3JlZ3MgKmZyZWdz KTsKPiA+ID4gPiA+ID4gPj4gICNkZWZpbmUgZnRyYWNlX2dyYXBoX2Z1bmMgZnRyYWNlX2dyYXBo X2Z1bmMKPiA+ID4gPiA+ID4gPj4gKwo+ID4gPiA+ID4gPiA+PiArc3RhdGljIGlubGluZSB2b2lk IGFyY2hfZnRyYWNlX3NldF9kaXJlY3RfY2FsbGVyKHN0cnVjdCBwdF9yZWdzICpyZWdzLCB1bnNp Z25lZCBsb25nIGFkZHIpCj4gPiA+ID4gPiA+ID4+ICt7Cj4gPiA+ID4gPiA+ID4+ICsgICAgICAg ICAgICAgICByZWdzLT50MSA9IGFkZHI7Cj4gPiA+ID4gPiA+ID4KPiA+ID4gPiA+ID4gPiBIb3cg YWJvdXQgcmVncy0+dDAgPSBhZGRyOyA/Cj4gPiA+ID4gPiA+ID4gQW5kIGRlbGV0ZSBhbGwgbWNv dW50LWR5bi5TIG1vZGlmaWNhdGlvbi4KPiA+ID4gPiA+ID4gPgo+ID4gPiA+ID4gPiBUaGUgZGly ZWN0X2NhbGxlciBoYXMgdGhlIHNhbWUgcHJvZ3JhbSBsYXlvdXQgYXMgdGhlIGZ0cmFjZV9jYWxs ZXIsIHdoaWNoIG1lYW5zCj4gPiA+ID4gPiA+IHRoZSByZWcgdDAgd2lsbCBuZXZlciBiZSBjaGFu Z2VkIHdoZW4gZGlyZWN0X2NhbGxlciByZXR1cm5zLgo+ID4gPiA+ID4gPgo+ID4gPiA+ID4gPiBJ ZiByZWdzLT50MCBjaGFuZ2VzIGhlcmUgYW5kIGZ0cmFjZV9yZWdzX2NhbGxlciBleGVjdXRlcyBg anIgdDBgLAo+ID4gPiA+ID4gPiBkaXJlY3RfY2FsbGVyIHdpbGwgZW50ZXIgdGhlIGRlYWQgbG9v cC4KPiA+ID4gPiA+ID8KPiA+ID4gPiA+Cj4gPiA+ID4gPiBmdHJhY2VfcmVnc19jYWxsZXItPmNh bGxfZGlyZWN0X2Z1bmNzLT4KPiA+ID4gPiA+IGFyY2hfZnRyYWNlX3NldF9kaXJlY3RfY2FsbGVy LT4gZnRyYWNlX3JlZ3NfY2FsbGVyIGpyIHQwLgo+ID4gPiA+ID4KPiA+ID4gPiA+IE9ubHkgY2Fs bF9kaXJlY3RfZnVuY3MgY2FsbCBhcmNoX2Z0cmFjZV9zZXRfZGlyZWN0X2NhbGxlciAhCj4gPiA+ ID4gPgo+ID4gPiA+ID4gc3RhdGljIHZvaWQgY2FsbF9kaXJlY3RfZnVuY3ModW5zaWduZWQgbG9u ZyBpcCwgdW5zaWduZWQgbG9uZyBwaXAsCj4gPiA+ID4gPiAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICBzdHJ1Y3QgZnRyYWNlX29wcyAqb3BzLCBzdHJ1Y3QgZnRyYWNlX3JlZ3MgKmZyZWdz KQo+ID4gPiA+ID4gewo+ID4gPiA+ID4gICAgICAgICBzdHJ1Y3QgcHRfcmVncyAqcmVncyA9IGZ0 cmFjZV9nZXRfcmVncyhmcmVncyk7Cj4gPiA+ID4gPiAgICAgICAgIHVuc2lnbmVkIGxvbmcgYWRk cjsKPiA+ID4gPiA+Cj4gPiA+ID4gPiAgICAgICAgIGFkZHIgPSBmdHJhY2VfZmluZF9yZWNfZGly ZWN0KGlwKTsKPiA+ID4gPiA+ICAgICAgICAgaWYgKCFhZGRyKQo+ID4gPiA+ID4gICAgICAgICAg ICAgICAgIHJldHVybjsKPiA+ID4gPiA+Cj4gPiA+ID4gPiAgICAgICAgIGFyY2hfZnRyYWNlX3Nl dF9kaXJlY3RfY2FsbGVyKHJlZ3MsIGFkZHIpOwo+ID4gPiA+ID4gfQo+ID4gPiA+ID4KPiA+ID4g PiBXaGVuIGRpcmVjdF9jYWxsZXIgYW5kIGZ1bmN0aW9uIHRyYWNlciBjby1ob29rIGEgZnVuY3Rp b24sIHRoZSBzaW1wbGUKPiA+ID4gPiBkaWFncmFtIGlzIGxpa2UgdGhpczoKPiA+ID4gPgo+ID4g PiA+IGBgYAo+ID4gPiA+IGZ1bmMgLT4gZnRyYWNlX3JlZ3NfY2FsbGVyIC0+IGFyY2hfZnRyYWNl X29wc19saXN0X2Z1bmMgLT4KPiA+ID4gPiBmdW5jdGlvbl90cmFjZV9jYWxsIC8vIHdyaXRlIHJp bmdidWZmZXIKPiA+ID4gPiAgICAgICAgICAgICB8Cj4gPiA+ID4gICAgICAgICAgICAgICAgICAt PiBjYWxsX2RpcmVjdF9mdW5jcyAvLyByZWdzLT50MSA9IGRpcmVjdF9jYWxsZXIKPiA+ID4gPiAg ICAgICAgICAgIC0+IHQxICE9MCAmJiBqciB0MSAvLyBnb3RvIGRpcmVjdF9jYWxsZXIKPiA+ID4g PiBgYGAKPiA+ID4gPgo+ID4gPiBgYGAKPiA+ID4gZiAtLSByZWdzX2NhbGxlciAtLSBsaXN0X2Z1 bmMKPiA+ID4gICAgIHwgICAgICAgICAgICAgICAgICAgICAgIHwgLS0gZnVuY3Rpb25fdHJhY2Vf Y2FsbAo+ID4gPiAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgfCAtLSBjYWxsX2RpcmVjdF9m dW5jcyAgLy8gdDEgPSBhZGRyCj4gPiA+ICAgICB8LS0gdDEgIT0wICYmIGpyIHQxIC8vIGdvdG8g ZGlyZWN0X2NhbGxlcgo+ID4gQ29vbCBkaWFncmFtISBUaHgsIGJ1dCB3ZSBzdGlsbCBuZWVkIGEg ZGlzY3Vzc2lvbjoKPiA+IGYgLS0gcmVnc19jYWxsZXIKPiA+ICAgICAgfCAtLSBTQVZFX0FCSV9S RUdTIDEKPiA+ICAgICAgfCAtLSBsaXN0X2Z1bmMKPiA+ICAgICAgfCAgICAgICAgICAgICAgICAg ICAgICAgfCAtLSBmdW5jdGlvbl90cmFjZV9jYWxsCj4gPiAgICAgIHwgICAgICAgICAgICAgICAg ICAgICAgIHwgLS0gY2FsbF9kaXJlY3RfZnVuY3MgIC8vIHQxID0gYWRkcgo+ID4gICAgICB8IC0t IFJFU1RPUkVfQUJJX1JFR1MgMQo+ID4gICAgICB8LS0gdDEgIT0wICYmIGpyIHQxIC8vIGdvdG8g ZGlyZWN0X2NhbGxlcgo+ID4gSWYgeW91IHNldCB0MSBub24temVybywgdGhlbiB3ZSBhbHdheXMg Z28gdG8gZGlyZWN0X2NhbGxlci4gSSB0aGluawo+ID4gdGhlIGNvZGUgaXMgZXF1YWwgdG8gc2V0 IHQwPWFkZHIuCj4gSWYgb25seSBmb2N1c2luZyBvbiB0aGUgd2hvbGUgZnRyYWNlX3JlZ3NfY2Fs bGVyIGNvZGUsIHlvdSdyZSByaWdodC4KWWVzLCB0aGF0J3MgdGhlIHByb2JsZW0gSSBoYXZlOyBJ IGRpZG4ndCBsb29rIGF0IHRoZSBzYW1wbGUgY29kZS4KCnQwIC0+IGZ0cmFjZSBjYWxsZXIKdDEg LT4gbXlfdHJhbXAxIChkaXJlY3QgY2FsbGVyKQpyYSAtPiBvcmlnaW5hbCBmdW5jIHJldHVybiBh ZGRyLgoKT2theSwgSSB3b3VsZCBpbmNsdWRlIHRoZXNlIHBhdGNoZXMgaW4gdjQuCgpSZXZpZXdl ZC1ieTogR3VvIFJlbiA8Z3VvcmVuQGtlcm5lbC5vcmc+CgoKPgo+IEJ1dCB3ZSBzaG91bGQgYWxz byB0YWtlIGRpcmVjdF9jYWxsZXIgY29kZSBpbnRvIHRoZSBjb25zaWRlcmF0aW9uLAo+IGlmIHVz aW5nIHQwIGhlcmUsIGRpcmVjdF9jYWxsZXIgd2lsbCBhbHdheXMgcmV0dXJuIHRvIGl0c2VsZiBh cyBJCj4gZGVzY3JpYmVkIGJlZm9yZS4KPiA+ICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAg fCAtLSBjYWxsX2RpcmVjdF9mdW5jcyAgLy8gdDAgPSBhZGRyCj4gPiAgICAgIHwgLS0gUkVTVE9S RV9BQklfUkVHUyAxCj4gPiAgICAgIHwtLSBqciB0MCAvLyBnb3RvIGRpcmVjdF9jYWxsZXIKPiA+ Cj4gPiBJIHRoaW5rIHRoZSBvbmx5IHByb2JsZW0gaGFwcGVucyBpbiB0aGUgYmVsb3cgbm9uLWV4 aXN0ZW50IHNpdHVhdGlvbjoKPiA+IGYgLS0gcmVnc19jYWxsZXIKPiA+ICAgICAgfCAtLSBTQVZF X0FCSV9SRUdTIDEKPiA+ICAgICAgfCAtLSBsaXN0X2Z1bmMKPiA+ICAgICAgfCAgICAgICAgICAg ICAgICAgICAgICAgfCAtLSBjYWxsX2RpcmVjdF9mdW5jcyAgLy8gdDAgPSBhZGRyCj4gPiAgICAg IHwgICAgICAgICAgICAgICAgICAgICAgIHwgLS0gZnVuY3Rpb25fdHJhY2VfY2FsbCAvL3QwIGNv bnRhaW5zCj4gPiBkaXJlY3RfY2FsbGVyIGluc3RlYWQKPiBmdW5jdGlvbl90cmFjZV9jYWxsIGlz IG9uZSB0eXBlIG9mIGdsb2JhbF9vcHMtPmZ1bmMgd2hpY2ggZG9lc24ndCB0YWtlIGNhcmUKPiBv ZiB0aGUgcmVncy0+dDAuCj4KPiBCdXQgdGhlIGZ1bmMgb2YgSVBNT0RJRlkgb3BzIChlZy4gbGl2 ZXBhdGNoLCBrcHJvYmUgd2l0aCBwb3N0aGFuZGxlcikKPiB3aWxsIGNoYW5nZSByZWdzLT5lcGMg d2hpY2ggd2lsbCB0aGVuIGJlIHJlc3RvcmVkIHRvIHQwIGluIGZ0cmFjZV9yZWdzX2NhbGxlci4K PiBBbmQgdGhlbiB0aGUgYWRkcmVzcyBvZiBkaXJlY3RfY2FsbGVyIHdpbGwgYmUgY292ZXJlZCBp biB0aGlzIHNpdHVhdGlvbi4KPiBJJ20gbm90IHZlcnkgY2xlYXIgYWJvdXQgdGhlIHByb2Nlc3Mg b2YgdGhlIGxpdmVwYXRjaCBhbmQga3Byb2JlIGluIFJJU0NWCj4gYnV0IEkgdGhpbmsgd2Ugc2hv dWxkIGtlZXAgdDAgZm9yIHRoZWlyIGlwbW9kaWZ5aW5nLgo+ID4gICAgICB8IC0tIFJFU1RPUkVf QUJJX1JFR1MgMQo+ID4gICAgICB8LS0ganIgdDAgLy8gZ290byBkaXJlY3RfY2FsbGVyCj4gPgo+ ID4gVGhlIGtleSBpc3N1ZSBpcyB3aGV0aGVyIGdvaW5nIHRvIGRpcmVjdF9jYWxsZXIgY29ycmVj dGx5IGRlcGVuZHMgb24KPiA+IGNhbGxfZGlyZWN0X2Z1bmNzIGNhbGxlZCwgcmlnaHQ/Cj4gWWVz LCBpbiBvdGhlciB3b3JkcywgY2FsbF9kaXJlY3RfZnVuYyBpbmZvcm1zIGZ0cmFjZV9yZWdzX2Nh bGxlciB0aGF0Cj4gdGhlcmUgaXMgYSBkaXJlY3QgY2FsbGVyIHN0b3JlZCBpbiB0MSwgcGxlYXNl IGp1bXAgdG8gaXQgZmlyc3QuCj4gPgo+ID4gPiBgYGAKPiA+ID4gVGhpcyBkaWFncmFtIGxvb2tz IGJldHRlci4KPiA+ID4gPiBBbmQgdGhlIGRpcmVjdF9jYWxsZXIgaGFzIGEgc2ltaWxhciBpbXBs ZW1lbnQgYXMgZnRyYWNlX2NhbGxlci4KPiA+ID4gPgo+ID4gPiA+IGBgYAo+ID4gPiA+IGRpcmVj dF9jYWxsZXI6Cj4gPiA+ID4gYWRkIHNwLHNwLC0/Cj4gPiA+ID4gc2QgdDAsPyhzcCkKPiA+ID4g PiBzZCByYSw/KHNwKQo+ID4gPiA+IGNhbGwgZm9vCj4gPiA+ID4gbGQgdDAsPyhzcCkKPiA+ID4g PiBsZCByYSw/KHNwKQo+ID4gPiA+IGFkZCBzcCxzcCw/Cj4gPiA+ID4ganIgdDAgLy8gPC0gYmFj ayB0byBmdW5jdGlvbiBlbnRyeQo+ID4gPiA+IGBgYAo+ID4gPiA+Cj4gPiA+ID4gSWYgd2UgY2hh bmdlIHJlZ3MtPnQwIGFzIGRpcmVjdF9jYWxsZXIgYW5kIGV4ZWN1dGUgYGpyIHQwYCBkaXJlY3Rs eSwKPiA+ID4gPiB0aGUgZGlyZWN0X2NhbGxlciB3aWxsIGFsd2F5cyBqdW1wIHRvIGl0c2VsZiBk dWUgdG8gaXRzIGxhc3QgYGpyYCBpbnN0Lgo+IC0tLSBIZXJlIGlzIHdoYXQgSSBkZXNjcmliZWQg aW4gdGhlIHByZXZpb3VzIGVtYWlsLgo+ID4gPiA+Cj4gPiA+ID4gYGBgCj4gPiA+ID4gZnVuYyAt PiBmdHJhY2VfcmVnc19jYWxsZXIgLT4gYXJjaF9mdHJhY2Vfb3BzX2xpc3RfZnVuYyAtPgo+ID4g PiA+IGZ1bmN0aW9uX3RyYWNlX2NhbGwgLy8gd3JpdGUgcmluZ2J1ZmZlcgo+ID4gPiA+ICAgICAg ICAgICAgIHwKPiA+ID4gPiAgICAgICAgICAgICAgICAgIC0+IGNhbGxfZGlyZWN0X2Z1bmNzIC8v IHJlZ3MtPnQwID0gZGlyZWN0X2NhbGxlcgo+ID4gPiA+ICAgICAgICAgICAgLT4ganIgdDAgLy8g Z290byBkaXJlY3RfY2FsbGVyCj4gPiA+ID4KPiA+ID4gPiBkaXJlY3RfY2FsbGVyOgo+ID4gPiA+ IC4uLgo+ID4gPiA+IHNkIHQwLD8oc3ApCj4gPiA+ID4gLi4uCj4gPiA+ID4gbGQgdDAsPyhzMCkK PiA+ID4gPiAuLi4KPiA+ID4gPiBqciB0MCAvLyBnb3RvIGRpcmVjdF9jYWxsZXIgYWx3YXlzCj4g PiA+ID4gYGBgCj4gPiA+ID4KPiA+ID4gPiBIb3BlIEkgbWFkZSBpdCBjbGVhci4KPiA+ID4gPiA+ ID4KPiA+ID4gPiA+ID4gQWN0dWFsbHkgdGhlIHJlZyB0MCBhbHdheXMgc2F2ZXMgdGhlIGFkZHJl c3Mgb2YgZnVuY3Rpb24gZW50cnkgd2l0aCA4Qgo+ID4gPiA+ID4gPiBvZmZzZXQsIGl0IHNob3Vs ZCBvbmx5Cj4gPiA+ID4gPiA+IGNoYW5nZWQgYnkgdGhlIElQTU9ESUZZIG9wcyBpbnN0ZWFkIG9m IHRoZSBkaXJlY3Rfb3BzLgo+ID4gPiA+ID4gPiA+Pgo+ID4gPiA+ID4gPiA+PiArfQo+ID4gPiA+ ID4gPiA+PiArCj4gPiA+ID4gPiA+ID4+ICAjZW5kaWYgLyogQ09ORklHX0RZTkFNSUNfRlRSQUNF X1dJVEhfUkVHUyAqLwo+ID4gPiA+ID4gPiA+Pgo+ID4gPiA+ID4gPiA+PiAgI2VuZGlmIC8qIF9f QVNTRU1CTFlfXyAqLwo+ID4gPiA+ID4gPiA+PiBkaWZmIC0tZ2l0IGEvYXJjaC9yaXNjdi9rZXJu ZWwvbWNvdW50LWR5bi5TIGIvYXJjaC9yaXNjdi9rZXJuZWwvbWNvdW50LWR5bi5TCj4gPiA+ID4g PiA+ID4+IGluZGV4IDQ2NmM2ZWYyMTdiMS4uYjg5Yzg1YTU4NTY5IDEwMDY0NAo+ID4gPiA+ID4g PiA+PiAtLS0gYS9hcmNoL3Jpc2N2L2tlcm5lbC9tY291bnQtZHluLlMKPiA+ID4gPiA+ID4gPj4g KysrIGIvYXJjaC9yaXNjdi9rZXJuZWwvbWNvdW50LWR5bi5TCj4gPiA+ID4gPiA+ID4+IEBAIC0y MzMsNiArMjMzLDcgQEAgRU5EUFJPQyhmdHJhY2VfY2FsbGVyKQo+ID4gPiA+ID4gPiA+PiAgI2Vs c2UgLyogQ09ORklHX0RZTkFNSUNfRlRSQUNFX1dJVEhfUkVHUyAqLwo+ID4gPiA+ID4gPiA+PiAg RU5UUlkoZnRyYWNlX3JlZ3NfY2FsbGVyKQo+ID4gPiA+ID4gPiA+PiAgICAgICAgIFNBVkVfQUJJ X1JFR1MgMQo+ID4gPiA+ID4gPiA+PiArICAgICAgIFJFR19TICAgeDAsIFBUX1QxKHNwKQo+ID4g PiA+ID4gPiA+PiAgICAgICAgIFBSRVBBUkVfQVJHUwo+ID4gPiA+ID4gPiA+Pgo+ID4gPiA+ID4g PiA+PiAgZnRyYWNlX3JlZ3NfY2FsbDoKPiA+ID4gPiA+ID4gPj4gQEAgLTI0MSw3ICsyNDIsMTAg QEAgZnRyYWNlX3JlZ3NfY2FsbDoKPiA+ID4gPiA+ID4gPj4KPiA+ID4gPiA+ID4gPj4KPiA+ID4g PiA+ID4gPj4gICAgICAgICBSRVNUT1JFX0FCSV9SRUdTIDEKPiA+ID4gPiA+ID4gPj4gKyAgICAg ICBibmV6ICAgIHQxLC5MZGlyZWN0Cj4gPiA+ID4gPiA+ID4+ICAgICAgICAganIgdDAKPiA+ID4g PiA+ID4gPj4gKy5MZGlyZWN0Ogo+ID4gPiA+ID4gPiA+PiArICAgICAgIGpyIHQxCj4gPiA+ID4g PiA+ID4+ICBFTkRQUk9DKGZ0cmFjZV9yZWdzX2NhbGxlcikKPiA+ID4gPiA+ID4gPj4KPiA+ID4g PiA+ID4gPj4gIEVOVFJZKGZ0cmFjZV9jYWxsZXIpCj4gPiA+ID4gPiA+ID4+IC0tCj4gPiA+ID4g PiA+ID4+IDIuMjAuMQo+ID4gPiA+ID4gPiA+Pgo+ID4gPiA+ID4gPiA+Cj4gPiA+ID4gPiA+ID4K PiA+ID4gPiA+ID4gPiAtLQo+ID4gPiA+ID4gPiA+IEJlc3QgUmVnYXJkcwo+ID4gPiA+ID4gPiA+ ICBHdW8gUmVuCj4gPiA+ID4gPgo+ID4gPiA+ID4KPiA+ID4gPiA+Cj4gPiA+ID4gPiAtLQo+ID4g PiA+ID4gQmVzdCBSZWdhcmRzCj4gPiA+ID4gPiAgR3VvIFJlbgo+ID4gPiA+IFRoYW5rcywKPiA+ ID4gPiBTb25nCj4gPiA+IFRoYW5rcywKPiA+ID4gU29uZwo+ID4KPiA+Cj4gPgo+ID4gLS0KPiA+ IEJlc3QgUmVnYXJkcwo+ID4gIEd1byBSZW4KPiBUaGFua3MsCj4gU29uZwoKCgotLSAKQmVzdCBS ZWdhcmRzCiBHdW8gUmVuCgpfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fXwpsaW51eC1yaXNjdiBtYWlsaW5nIGxpc3QKbGludXgtcmlzY3ZAbGlzdHMuaW5mcmFk ZWFkLm9yZwpodHRwOi8vbGlzdHMuaW5mcmFkZWFkLm9yZy9tYWlsbWFuL2xpc3RpbmZvL2xpbnV4 LXJpc2N2Cg==