From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: ARC-Seal: i=1; a=rsa-sha256; t=1521991560; cv=none; d=google.com; s=arc-20160816; b=XP/tqD0Zn5YT7y5KsdaWUrETXvGBLvjthVF239F8NyZhLhT5aMzV71vgKHBhv3Zdpt Lx6GhZOlvaErLpXAZn4L+SoKYc7/443tVk7YSVfQIPtOJnSl2iQZBKjFEy4kG9nOyHls 44tJHaPtHwt0YKph2S6DLjDnpXlsQW9JlVn6K1vEe4ZvyWcE5goUzrTmomlKZ5LDpW2d VBAG5MimwPBlmmpCpacWkoDuVbwxsvkPpKjJcNnZw/rfPT9wYFZEQKlmo2vNoTlMipHT WC/U+DY9tLB+lC9j8nVYlWeuD7cbW8kvIrbLWcNv2JCOp+X5/1DB93zeFRWqaR0c3yeD 0kww== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=cc:to:subject:message-id:date:from:references:in-reply-to :mime-version:dkim-signature:arc-authentication-results; bh=brgvCCetpXW1NFkkBk1rkYZFVVcLfWzSvAOLNC31UX4=; b=axvYpTrVwVKYT5LS2cacnHySkyFlN636gtZFbFHNWNA8nP09gb4qX8PxNANwly4lpb 0UkRhjEVOptRvqt1gMXXYYiBWY/3hQnPu8/1wwy0hPHmtZkqHeI/bxJh3jmJmOqPRD2L Y36zEbYJlNfNTQPHX98dEeM2r5WTJhnOzu9ltNPmbfPdVOwOPPkwuaRNPGOrJMwdvdha 2Z0evPHlKHG+ds87krQZoWYJF5NAwpSQ6Rn6F9y85oamq6tuYVGxdMUVRfV3zQ1O0oYD O8fel0LCWLK9P56w1t9OlgWVvCPIPPvJM1ULTsZQAl1bqtvRwywNgEEWB1S+ZRhhPFns QzbA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@gmail.com header.s=20161025 header.b=t3jR/mkE; spf=pass (google.com: domain of net147@gmail.com designates 209.85.220.65 as permitted sender) smtp.mailfrom=net147@gmail.com; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Authentication-Results: mx.google.com; dkim=pass header.i=@gmail.com header.s=20161025 header.b=t3jR/mkE; spf=pass (google.com: domain of net147@gmail.com designates 209.85.220.65 as permitted sender) smtp.mailfrom=net147@gmail.com; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com X-Google-Smtp-Source: AIpwx4+sZNVmPYxr0JB/2Wjf19719Jf2G2eOrFQr7EcHb3MiPRVusViwMA+p2EHNvHohtO2LNpPOQTpbJQr4lcWaRaM= MIME-Version: 1.0 In-Reply-To: References: <20180208035501.10711-1-jeffy.chen@rock-chips.com> From: Jonathan Liu Date: Mon, 26 Mar 2018 02:25:59 +1100 Message-ID: Subject: Re: [v6] usb: ohci: Proper handling of ed_rm_list to handle race condition between usb_kill_urb() and finish_unlinks() To: Jeffy Chen Cc: linux-kernel , Brian Norris , Alan Stern , mka@chromium.org, Douglas Anderson , AMAN DEEP , stable@vger.kernel.org, Greg Kroah-Hartman , linux-usb@vger.kernel.org Content-Type: text/plain; charset="UTF-8" X-getmail-retrieved-from-mailbox: INBOX X-GMAIL-THRID: =?utf-8?q?1591803495381541713?= X-GMAIL-MSGID: =?utf-8?q?1595923822248932756?= X-Mailing-List: linux-kernel@vger.kernel.org List-ID: Hi, On 25 March 2018 at 12:21, Jonathan Liu wrote: > On 8 February 2018 at 14:55, Jeffy Chen wrote: >> From: AMAN DEEP >> >> There is a race condition between finish_unlinks->finish_urb() function >> and usb_kill_urb() in ohci controller case. The finish_urb calls >> spin_unlock(&ohci->lock) before usb_hcd_giveback_urb() function call, >> then if during this time, usb_kill_urb is called for another endpoint, >> then new ed will be added to ed_rm_list at beginning for unlink, and >> ed_rm_list will point to newly added. >> >> When finish_urb() is completed in finish_unlinks() and ed->td_list >> becomes empty as in below code (in finish_unlinks() function): >> >> if (list_empty(&ed->td_list)) { >> *last = ed->ed_next; >> ed->ed_next = NULL; >> } else if (ohci->rh_state == OHCI_RH_RUNNING) { >> *last = ed->ed_next; >> ed->ed_next = NULL; >> ed_schedule(ohci, ed); >> } >> >> The *last = ed->ed_next will make ed_rm_list to point to ed->ed_next >> and previously added ed by usb_kill_urb will be left unreferenced by >> ed_rm_list. This causes usb_kill_urb() hang forever waiting for >> finish_unlink to remove added ed from ed_rm_list. >> >> The main reason for hang in this race condtion is addition and removal >> of ed from ed_rm_list in the beginning during usb_kill_urb and later >> last* is modified in finish_unlinks(). >> >> As suggested by Alan Stern, the solution for proper handling of >> ohci->ed_rm_list is to remove ed from the ed_rm_list before finishing >> any URBs. Then at the end, we can add ed back to the list if necessary. >> >> This properly handle the updated ohci->ed_rm_list in usb_kill_urb(). >> >> Fixes:977dcfdc6031("USB:OHCI:don't lose track of EDs when a controller dies") >> Acked-by: Alan Stern >> CC: >> Signed-off-by: Aman Deep >> Signed-off-by: Jeffy Chen >> --- >> >> Changes in v6: >> This is a resend of Aman Deep's v5 patch [0], which solved the hang we >> hit [1]. (Thanks Aman :) >> >> The v5 has some format issues, so i slightly adjust the commit message. >> >> [0] https://www.spinics.net/lists/linux-usb/msg129010.html >> [1] https://bugs.chromium.org/p/chromium/issues/detail?id=803749 >> >> drivers/usb/host/ohci-q.c | 17 ++++++++++------- >> 1 file changed, 10 insertions(+), 7 deletions(-) >> >> diff --git a/drivers/usb/host/ohci-q.c b/drivers/usb/host/ohci-q.c >> index b2ec8c399363..4ccb85a67bb3 100644 >> --- a/drivers/usb/host/ohci-q.c >> +++ b/drivers/usb/host/ohci-q.c >> @@ -1019,6 +1019,8 @@ static void finish_unlinks(struct ohci_hcd *ohci) >> * have modified this list. normally it's just prepending >> * entries (which we'd ignore), but paranoia won't hurt. >> */ >> + *last = ed->ed_next; >> + ed->ed_next = NULL; >> modified = 0; >> >> /* unlink urbs as requested, but rescan the list after >> @@ -1077,21 +1079,22 @@ static void finish_unlinks(struct ohci_hcd *ohci) >> goto rescan_this; >> >> /* >> - * If no TDs are queued, take ED off the ed_rm_list. >> + * If no TDs are queued, ED is now idle. >> * Otherwise, if the HC is running, reschedule. >> - * If not, leave it on the list for further dequeues. >> + * If the HC isn't running, add ED back to the >> + * start of the list for later processing. >> */ >> if (list_empty(&ed->td_list)) { >> - *last = ed->ed_next; >> - ed->ed_next = NULL; >> ed->state = ED_IDLE; >> list_del(&ed->in_use_list); >> } else if (ohci->rh_state == OHCI_RH_RUNNING) { >> - *last = ed->ed_next; >> - ed->ed_next = NULL; >> ed_schedule(ohci, ed); >> } else { >> - last = &ed->ed_next; >> + ed->ed_next = ohci->ed_rm_list; >> + ohci->ed_rm_list = ed; >> + /* Don't loop on the same ED */ >> + if (last == &ohci->ed_rm_list) >> + last = &ed->ed_next; >> } >> >> if (modified) > > I am experiencing a USB function call hang from userspace with OCHI > (full speed USB device) after updating from Linux 4.14.15 to 4.14.24 > and noticed this commit. > > Here is the Linux 4.14.24 kernel stack trace (extracted from SysRq+w > and amended with addr2line): > [] (__schedule) from [] (schedule+0x50/0xb4) > kernel/sched/core.c:2792 > [] (schedule) from [] > (usb_kill_urb.part.3+0x78/0xa8) include/asm-generic/preempt.h:59 > [] (usb_kill_urb.part.3) from [] > (usbdev_ioctl+0x1288/0x1cf0) drivers/usb/core/urb.c:690 > [] (usbdev_ioctl) from [] > (do_vfs_ioctl+0x9c/0x8ec) drivers/usb/core/devio.c:1835 > [] (do_vfs_ioctl) from [] (SyS_ioctl+0x34/0x5c) > fs/ioctl.c:47 > [] (SyS_ioctl) from [] (ret_fast_syscall+0x0/0x54) > include/linux/file.h:39 > > Afterwards the kernel is unresponsive to disconnect/connect of the > full speed USB device but I can connect/disconnect a high speed USB > device to the same port and communicate to it without problem since it > uses EHCI (OHCI is companion controller). If I try to connect the full > speed USB device again it is still unresponsive. The userspace > application is still hanging after all this. > > Could this commit be causing the issue? There does seem to be something wrong with this commit. I did some more testing with Linux 4.16.0-rc6 on sun7i-a20-olinuxino-lime. I connected a sun7i-a20-pcduino3b running Linux 4.15.12 that has OTG port with gadget zero kernel module (g_zero) loaded to the USB port and did some testing with usbtest from tools/usb/testusb.c in kernel repository. I had to do the following change to avoid getting flooded with "usbtest 1-1:3.0: unlink retry" kernel messages after test 11 of testusb starts: --- a/drivers/usb/misc/usbtest.c +++ b/drivers/usb/misc/usbtest.c @@ -1473,7 +1473,7 @@ static int unlink1(struct usbtest_dev *dev, int pipe, int size, int async) * resubmission, but since we're testing unlink * paths, we can't. */ - ERROR(dev, "unlink retry\n"); + /*ERROR(dev, "unlink retry\n");*/ continue; case 0: case -EINPROGRESS: Here are the results. # ./testusb -a /dev/bus/usb/001/002 test 0, 0.006822 secs /dev/bus/usb/001/002 test 1, 0.140112 secs /dev/bus/usb/001/002 test 2, 0.381125 secs /dev/bus/usb/001/002 test 3, 0.133564 secs /dev/bus/usb/001/002 test 4, 0.385498 secs /dev/bus/usb/001/002 test 5, 2.138259 secs /dev/bus/usb/001/002 test 6, 1.755144 secs /dev/bus/usb/001/002 test 7, 2.137387 secs /dev/bus/usb/001/002 test 8, 1.752393 secs /dev/bus/usb/001/002 test 9, 1.132559 secs /dev/bus/usb/001/002 test 10, 3.698934 secs /dev/bus/usb/001/002 test 11, 40.061114 secs dmesg (processed through scripts/decode_stacktrace.sh from kernel repository): [ 21.573242] usbtest 1-1:3.0: TEST 0: NOP [ 21.580315] usbtest 1-1:3.0: TEST 1: write 1024 bytes 1000 times [ 21.732138] usbtest 1-1:3.0: TEST 2: read 1024 bytes 1000 times [ 22.132133] usbtest 1-1:3.0: TEST 3: write/1024 0..1024 bytes 1000 times [ 22.282137] usbtest 1-1:3.0: TEST 4: read/1024 0..1024 bytes 1000 times [ 22.682131] usbtest 1-1:3.0: TEST 5: write 1000 sglists 32 entries of 1024 bytes [ 24.832138] usbtest 1-1:3.0: TEST 6: read 1000 sglists 32 entries of 1024 bytes [ 26.602135] usbtest 1-1:3.0: TEST 7: write/1024 1000 sglists 32 entries 0..1024 bytes [ 28.752136] usbtest 1-1:3.0: TEST 8: read/1024 1000 sglists 32 entries 0..1024 bytes [ 30.522139] usbtest 1-1:3.0: TEST 9: ch9 (subset) control tests, 1000 times [ 31.654957] usbtest 1-1:3.0: TEST 10: queue 32 control calls, 1000 times [ 35.354220] usbtest 1-1:3.0: TEST 11: unlink 1000 reads of 1024 [ 75.414099] usbtest 1-1:3.0: TEST 12: unlink 1000 writes of 1024 [ 128.026194] INFO: rcu_sched self-detected stall on CPU [ 128.031367] 0-....: (1 GPs behind) idle=faa/1/1073741826 softirq=2614/2621 fqs=1048 [ 128.039182] (t=2100 jiffies g=227 c=226 q=1961) [ 128.043887] NMI backtrace for cpu 0 [ 128.047377] CPU: 0 PID: 262 Comm: testusb Tainted: G O 4.16.0-rc6 #1 [ 128.054932] Hardware name: Allwinner sun7i (A20) Family [ 128.060181] (unwind_backtrace) from show_stack (arch/arm/kernel/traps.c:249) [ 128.067921] (show_stack) from dump_stack (lib/dump_stack.c:55) [ 128.075142] (dump_stack) from nmi_cpu_backtrace (lib/nmi_backtrace.c:103) [ 128.083141] (nmi_cpu_backtrace) from nmi_trigger_cpumask_backtrace (lib/nmi_backtrace.c:62) [ 128.092704] (nmi_trigger_cpumask_backtrace) from rcu_dump_cpu_stacks (kernel/rcu/tree.c:1373 (discriminator 2)) [ 128.102351] (rcu_dump_cpu_stacks) from rcu_check_callbacks (kernel/rcu/tree.c:1526 kernel/rcu/tree.c:1592 kernel/rcu/tree.c:3361 kernel/rcu/tree.c:3423 kernel/rcu/tree.c:2763) [ 128.111304] (rcu_check_callbacks) from update_process_times (arch/arm/include/asm/thread_info.h:91 include/asm-generic/preempt.h:11 kernel/time/timer.c:1638) [ 128.120173] (update_process_times) from tick_sched_timer (kernel/time/tick-sched.c:1199) [ 128.128777] (tick_sched_timer) from __hrtimer_run_queues (kernel/time/hrtimer.c:1349 kernel/time/hrtimer.c:1411) [ 128.137553] (__hrtimer_run_queues) from hrtimer_interrupt (kernel/time/hrtimer.c:1472) [ 128.146331] (hrtimer_interrupt) from arch_timer_handler_phys (drivers/clocksource/arm_arch_timer.c:589 drivers/clocksource/arm_arch_timer.c:606) [ 128.155285] (arch_timer_handler_phys) from handle_percpu_devid_irq (kernel/irq/chip.c:909) [ 128.164843] (handle_percpu_devid_irq) from generic_handle_irq (kernel/irq/irqdesc.c:607) [ 128.173880] (generic_handle_irq) from __handle_domain_irq (kernel/irq/irqdesc.c:646) [ 128.182574] (__handle_domain_irq) from gic_handle_irq (arch/arm/include/asm/io.h:118 drivers/irqchip/irq-gic.c:360) [ 128.190920] (gic_handle_irq) from __irq_svc (arch/arm/kernel/entry-armv.S:226) [ 128.198382] Exception stack(0xcda1fc88 to 0xcda1fcd0) [ 128.203431] fc80: c0a95bc8 a0060013 0000000a 0000aa75 cd83b480 a0060013 [ 128.211598] fca0: cf7ee000 ffffff98 00000001 00000000 00000400 cec2b800 00000009 cda1fcd8 [ 128.219763] fcc0: c045b328 c0622890 20060013 ffffffff [ 128.224818] (__irq_svc) from _raw_spin_unlock_irqrestore (kernel/locking/spinlock.c:185) [ 128.233428] (_raw_spin_unlock_irqrestore) from usb_hcd_unlink_urb (drivers/usb/core/hcd.c:1720) [ 128.242816] (usb_hcd_unlink_urb) from unlink1 (drivers/usb/core/hcd.c:864 drivers/usb/core/hcd.c:1684) [ 128.250555] (unlink1) from unlink_simple (drivers/usb/misc/usbtest.c:1510) [ 128.257774] (unlink_simple) from usbtest_do_ioctl (drivers/usb/misc/usbtest.c:2360) [ 128.266033] (usbtest_do_ioctl) from usbtest_ioctl (drivers/usb/misc/usbtest.c:2685) [ 128.274206] (usbtest_ioctl) from usbdev_ioctl (drivers/usb/core/devio.c:2175 drivers/usb/core/devio.c:2197 drivers/usb/core/devio.c:2511 drivers/usb/core/devio.c:2555) [ 128.282200] (usbdev_ioctl) from do_vfs_ioctl (fs/ioctl.c:47 fs/ioctl.c:686) [ 128.289854] (do_vfs_ioctl) from SyS_ioctl (include/linux/file.h:39 fs/ioctl.c:702 fs/ioctl.c:692) [ 128.297159] (SyS_ioctl) from ret_fast_syscall (arch/arm/kernel/entry-common.S:52) [ 128.304716] Exception stack(0xcda1ffa8 to 0xcda1fff0) [ 128.309763] ffa0: 000119c4 00000000 00000003 c00c5512 bebbfb34 bebbfb34 [ 128.317931] ffc0: 000119c4 00000000 000109b0 00000036 00000000 00000000 b6fb0fac bebbfb44 [ 128.326096] ffe0: 00022034 bebbfb1c 00011020 b6ee073c If I revert the commit, I can run "./testusb -a" to completion without any issues with Linux 4.16.0-rc6 on sun7i-a20-olinuxino-lime. I don't get a kernel stall detected when testing on x86_64 but I do still get at least one "unlink retry" error message from kernel in dmesg which can be reproduced using "./testusb -a" or more frequently with "./testusb -a -t 11 -c 5000". Regards, Jonathan From mboxrd@z Thu Jan 1 00:00:00 1970 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: base64 Subject: [v6] usb: ohci: Proper handling of ed_rm_list to handle race condition between usb_kill_urb() and finish_unlinks() From: Jonathan Liu Message-Id: Date: Mon, 26 Mar 2018 02:25:59 +1100 To: Jeffy Chen Cc: linux-kernel , Brian Norris , Alan Stern , mka@chromium.org, Douglas Anderson , AMAN DEEP , stable@vger.kernel.org, Greg Kroah-Hartman , linux-usb@vger.kernel.org List-ID: SGksCgpPbiAyNSBNYXJjaCAyMDE4IGF0IDEyOjIxLCBKb25hdGhhbiBMaXUgPG5ldDE0N0BnbWFp bC5jb20+IHdyb3RlOgo+IE9uIDggRmVicnVhcnkgMjAxOCBhdCAxNDo1NSwgSmVmZnkgQ2hlbiA8 amVmZnkuY2hlbkByb2NrLWNoaXBzLmNvbT4gd3JvdGU6Cj4+IEZyb206IEFNQU4gREVFUCA8YW1h bi5kZWVwQHNhbXN1bmcuY29tPgo+Pgo+PiBUaGVyZSBpcyBhIHJhY2UgY29uZGl0aW9uIGJldHdl ZW4gZmluaXNoX3VubGlua3MtPmZpbmlzaF91cmIoKSBmdW5jdGlvbgo+PiBhbmQgdXNiX2tpbGxf dXJiKCkgaW4gb2hjaSBjb250cm9sbGVyIGNhc2UuIFRoZSBmaW5pc2hfdXJiIGNhbGxzCj4+IHNw aW5fdW5sb2NrKCZvaGNpLT5sb2NrKSBiZWZvcmUgdXNiX2hjZF9naXZlYmFja191cmIoKSBmdW5j dGlvbiBjYWxsLAo+PiB0aGVuIGlmIGR1cmluZyB0aGlzIHRpbWUsIHVzYl9raWxsX3VyYiBpcyBj YWxsZWQgZm9yIGFub3RoZXIgZW5kcG9pbnQsCj4+IHRoZW4gbmV3IGVkIHdpbGwgYmUgYWRkZWQg dG8gZWRfcm1fbGlzdCBhdCBiZWdpbm5pbmcgZm9yIHVubGluaywgYW5kCj4+IGVkX3JtX2xpc3Qg d2lsbCBwb2ludCB0byBuZXdseSBhZGRlZC4KPj4KPj4gV2hlbiBmaW5pc2hfdXJiKCkgaXMgY29t cGxldGVkIGluIGZpbmlzaF91bmxpbmtzKCkgYW5kIGVkLT50ZF9saXN0Cj4+IGJlY29tZXMgZW1w dHkgYXMgaW4gYmVsb3cgY29kZSAoaW4gZmluaXNoX3VubGlua3MoKSBmdW5jdGlvbik6Cj4+Cj4+ ICAgICAgICAgaWYgKGxpc3RfZW1wdHkoJmVkLT50ZF9saXN0KSkgewo+PiAgICAgICAgICAgICAg ICAgKmxhc3QgPSBlZC0+ZWRfbmV4dDsKPj4gICAgICAgICAgICAgICAgIGVkLT5lZF9uZXh0ID0g TlVMTDsKPj4gICAgICAgICB9IGVsc2UgaWYgKG9oY2ktPnJoX3N0YXRlID09IE9IQ0lfUkhfUlVO TklORykgewo+PiAgICAgICAgICAgICAgICAgKmxhc3QgPSBlZC0+ZWRfbmV4dDsKPj4gICAgICAg ICAgICAgICAgIGVkLT5lZF9uZXh0ID0gTlVMTDsKPj4gICAgICAgICAgICAgICAgIGVkX3NjaGVk dWxlKG9oY2ksIGVkKTsKPj4gICAgICAgICB9Cj4+Cj4+IFRoZSAqbGFzdCA9IGVkLT5lZF9uZXh0 IHdpbGwgbWFrZSBlZF9ybV9saXN0IHRvIHBvaW50IHRvIGVkLT5lZF9uZXh0Cj4+IGFuZCBwcmV2 aW91c2x5IGFkZGVkIGVkIGJ5IHVzYl9raWxsX3VyYiB3aWxsIGJlIGxlZnQgdW5yZWZlcmVuY2Vk IGJ5Cj4+IGVkX3JtX2xpc3QuIFRoaXMgY2F1c2VzIHVzYl9raWxsX3VyYigpIGhhbmcgZm9yZXZl ciB3YWl0aW5nIGZvcgo+PiBmaW5pc2hfdW5saW5rIHRvIHJlbW92ZSBhZGRlZCBlZCBmcm9tIGVk X3JtX2xpc3QuCj4+Cj4+IFRoZSBtYWluIHJlYXNvbiBmb3IgaGFuZyBpbiB0aGlzIHJhY2UgY29u ZHRpb24gaXMgYWRkaXRpb24gYW5kIHJlbW92YWwKPj4gb2YgZWQgZnJvbSBlZF9ybV9saXN0IGlu IHRoZSBiZWdpbm5pbmcgZHVyaW5nIHVzYl9raWxsX3VyYiBhbmQgbGF0ZXIKPj4gbGFzdCogaXMg bW9kaWZpZWQgaW4gZmluaXNoX3VubGlua3MoKS4KPj4KPj4gQXMgc3VnZ2VzdGVkIGJ5IEFsYW4g U3Rlcm4sIHRoZSBzb2x1dGlvbiBmb3IgcHJvcGVyIGhhbmRsaW5nIG9mCj4+IG9oY2ktPmVkX3Jt X2xpc3QgaXMgdG8gcmVtb3ZlIGVkIGZyb20gdGhlIGVkX3JtX2xpc3QgYmVmb3JlIGZpbmlzaGlu Zwo+PiBhbnkgVVJCcy4gVGhlbiBhdCB0aGUgZW5kLCB3ZSBjYW4gYWRkIGVkIGJhY2sgdG8gdGhl IGxpc3QgaWYgbmVjZXNzYXJ5Lgo+Pgo+PiBUaGlzIHByb3Blcmx5IGhhbmRsZSB0aGUgdXBkYXRl ZCBvaGNpLT5lZF9ybV9saXN0IGluIHVzYl9raWxsX3VyYigpLgo+Pgo+PiBGaXhlczo5NzdkY2Zk YzYwMzEoIlVTQjpPSENJOmRvbid0IGxvc2UgdHJhY2sgb2YgRURzIHdoZW4gYSBjb250cm9sbGVy IGRpZXMiKQo+PiBBY2tlZC1ieTogQWxhbiBTdGVybiA8c3Rlcm5Acm93bGFuZC5oYXJ2YXJkLmVk dT4KPj4gQ0M6IDxzdGFibGVAdmdlci5rZXJuZWwub3JnPgo+PiBTaWduZWQtb2ZmLWJ5OiBBbWFu IERlZXAgPGFtYW4uZGVlcEBzYW1zdW5nLmNvbT4KPj4gU2lnbmVkLW9mZi1ieTogSmVmZnkgQ2hl biA8amVmZnkuY2hlbkByb2NrLWNoaXBzLmNvbT4KPj4gLS0tCj4+Cj4+IENoYW5nZXMgaW4gdjY6 Cj4+IFRoaXMgaXMgYSByZXNlbmQgb2YgQW1hbiBEZWVwJ3MgdjUgcGF0Y2ggWzBdLCB3aGljaCBz b2x2ZWQgdGhlIGhhbmcgd2UKPj4gaGl0IFsxXS4gKFRoYW5rcyBBbWFuIDopCj4+Cj4+IFRoZSB2 NSBoYXMgc29tZSBmb3JtYXQgaXNzdWVzLCBzbyBpIHNsaWdodGx5IGFkanVzdCB0aGUgY29tbWl0 IG1lc3NhZ2UuCj4+Cj4+IFswXSBodHRwczovL3d3dy5zcGluaWNzLm5ldC9saXN0cy9saW51eC11 c2IvbXNnMTI5MDEwLmh0bWwKPj4gWzFdIGh0dHBzOi8vYnVncy5jaHJvbWl1bS5vcmcvcC9jaHJv bWl1bS9pc3N1ZXMvZGV0YWlsP2lkPTgwMzc0OQo+Pgo+PiAgZHJpdmVycy91c2IvaG9zdC9vaGNp LXEuYyB8IDE3ICsrKysrKysrKystLS0tLS0tCj4+ICAxIGZpbGUgY2hhbmdlZCwgMTAgaW5zZXJ0 aW9ucygrKSwgNyBkZWxldGlvbnMoLSkKPj4KPj4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2hv c3Qvb2hjaS1xLmMgYi9kcml2ZXJzL3VzYi9ob3N0L29oY2ktcS5jCj4+IGluZGV4IGIyZWM4YzM5 OTM2My4uNGNjYjg1YTY3YmIzIDEwMDY0NAo+PiAtLS0gYS9kcml2ZXJzL3VzYi9ob3N0L29oY2kt cS5jCj4+ICsrKyBiL2RyaXZlcnMvdXNiL2hvc3Qvb2hjaS1xLmMKPj4gQEAgLTEwMTksNiArMTAx OSw4IEBAIHN0YXRpYyB2b2lkIGZpbmlzaF91bmxpbmtzKHN0cnVjdCBvaGNpX2hjZCAqb2hjaSkK Pj4gICAgICAgICAgICAgICAgICAqIGhhdmUgbW9kaWZpZWQgdGhpcyBsaXN0LiAgbm9ybWFsbHkg aXQncyBqdXN0IHByZXBlbmRpbmcKPj4gICAgICAgICAgICAgICAgICAqIGVudHJpZXMgKHdoaWNo IHdlJ2QgaWdub3JlKSwgYnV0IHBhcmFub2lhIHdvbid0IGh1cnQuCj4+ICAgICAgICAgICAgICAg ICAgKi8KPj4gKyAgICAgICAgICAgICAgICpsYXN0ID0gZWQtPmVkX25leHQ7Cj4+ICsgICAgICAg ICAgICAgICBlZC0+ZWRfbmV4dCA9IE5VTEw7Cj4+ICAgICAgICAgICAgICAgICBtb2RpZmllZCA9 IDA7Cj4+Cj4+ICAgICAgICAgICAgICAgICAvKiB1bmxpbmsgdXJicyBhcyByZXF1ZXN0ZWQsIGJ1 dCByZXNjYW4gdGhlIGxpc3QgYWZ0ZXIKPj4gQEAgLTEwNzcsMjEgKzEwNzksMjIgQEAgc3RhdGlj IHZvaWQgZmluaXNoX3VubGlua3Moc3RydWN0IG9oY2lfaGNkICpvaGNpKQo+PiAgICAgICAgICAg ICAgICAgICAgICAgICBnb3RvIHJlc2Nhbl90aGlzOwo+Pgo+PiAgICAgICAgICAgICAgICAgLyoK Pj4gLSAgICAgICAgICAgICAgICAqIElmIG5vIFREcyBhcmUgcXVldWVkLCB0YWtlIEVEIG9mZiB0 aGUgZWRfcm1fbGlzdC4KPj4gKyAgICAgICAgICAgICAgICAqIElmIG5vIFREcyBhcmUgcXVldWVk LCBFRCBpcyBub3cgaWRsZS4KPj4gICAgICAgICAgICAgICAgICAqIE90aGVyd2lzZSwgaWYgdGhl IEhDIGlzIHJ1bm5pbmcsIHJlc2NoZWR1bGUuCj4+IC0gICAgICAgICAgICAgICAgKiBJZiBub3Qs IGxlYXZlIGl0IG9uIHRoZSBsaXN0IGZvciBmdXJ0aGVyIGRlcXVldWVzLgo+PiArICAgICAgICAg ICAgICAgICogSWYgdGhlIEhDIGlzbid0IHJ1bm5pbmcsIGFkZCBFRCBiYWNrIHRvIHRoZQo+PiAr ICAgICAgICAgICAgICAgICogc3RhcnQgb2YgdGhlIGxpc3QgZm9yIGxhdGVyIHByb2Nlc3Npbmcu Cj4+ICAgICAgICAgICAgICAgICAgKi8KPj4gICAgICAgICAgICAgICAgIGlmIChsaXN0X2VtcHR5 KCZlZC0+dGRfbGlzdCkpIHsKPj4gLSAgICAgICAgICAgICAgICAgICAgICAgKmxhc3QgPSBlZC0+ ZWRfbmV4dDsKPj4gLSAgICAgICAgICAgICAgICAgICAgICAgZWQtPmVkX25leHQgPSBOVUxMOwo+ PiAgICAgICAgICAgICAgICAgICAgICAgICBlZC0+c3RhdGUgPSBFRF9JRExFOwo+PiAgICAgICAg ICAgICAgICAgICAgICAgICBsaXN0X2RlbCgmZWQtPmluX3VzZV9saXN0KTsKPj4gICAgICAgICAg ICAgICAgIH0gZWxzZSBpZiAob2hjaS0+cmhfc3RhdGUgPT0gT0hDSV9SSF9SVU5OSU5HKSB7Cj4+ IC0gICAgICAgICAgICAgICAgICAgICAgICpsYXN0ID0gZWQtPmVkX25leHQ7Cj4+IC0gICAgICAg ICAgICAgICAgICAgICAgIGVkLT5lZF9uZXh0ID0gTlVMTDsKPj4gICAgICAgICAgICAgICAgICAg ICAgICAgZWRfc2NoZWR1bGUob2hjaSwgZWQpOwo+PiAgICAgICAgICAgICAgICAgfSBlbHNlIHsK Pj4gLSAgICAgICAgICAgICAgICAgICAgICAgbGFzdCA9ICZlZC0+ZWRfbmV4dDsKPj4gKyAgICAg ICAgICAgICAgICAgICAgICAgZWQtPmVkX25leHQgPSBvaGNpLT5lZF9ybV9saXN0Owo+PiArICAg ICAgICAgICAgICAgICAgICAgICBvaGNpLT5lZF9ybV9saXN0ID0gZWQ7Cj4+ICsgICAgICAgICAg ICAgICAgICAgICAgIC8qIERvbid0IGxvb3Agb24gdGhlIHNhbWUgRUQgKi8KPj4gKyAgICAgICAg ICAgICAgICAgICAgICAgaWYgKGxhc3QgPT0gJm9oY2ktPmVkX3JtX2xpc3QpCj4+ICsgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgbGFzdCA9ICZlZC0+ZWRfbmV4dDsKPj4gICAgICAgICAg ICAgICAgIH0KPj4KPj4gICAgICAgICAgICAgICAgIGlmIChtb2RpZmllZCkKPgo+IEkgYW0gZXhw ZXJpZW5jaW5nIGEgVVNCIGZ1bmN0aW9uIGNhbGwgaGFuZyBmcm9tIHVzZXJzcGFjZSB3aXRoIE9D SEkKPiAoZnVsbCBzcGVlZCBVU0IgZGV2aWNlKSBhZnRlciB1cGRhdGluZyBmcm9tIExpbnV4IDQu MTQuMTUgdG8gNC4xNC4yNAo+IGFuZCBub3RpY2VkIHRoaXMgY29tbWl0Lgo+Cj4gSGVyZSBpcyB0 aGUgTGludXggNC4xNC4yNCBrZXJuZWwgc3RhY2sgdHJhY2UgKGV4dHJhY3RlZCBmcm9tIFN5c1Jx K3cKPiBhbmQgYW1lbmRlZCB3aXRoIGFkZHIybGluZSk6Cj4gWzxjMDVjYmQ2ND5dIChfX3NjaGVk dWxlKSBmcm9tIFs8YzA1Y2MxNDg+XSAoc2NoZWR1bGUrMHg1MC8weGI0KQo+IGtlcm5lbC9zY2hl ZC9jb3JlLmM6Mjc5Mgo+IFs8YzA1Y2MxNDg+XSAoc2NoZWR1bGUpIGZyb20gWzxjMDQyNzg5Yz5d Cj4gKHVzYl9raWxsX3VyYi5wYXJ0LjMrMHg3OC8weGE4KSBpbmNsdWRlL2FzbS1nZW5lcmljL3By ZWVtcHQuaDo1OQo+IFs8YzA0Mjc4OWM+XSAodXNiX2tpbGxfdXJiLnBhcnQuMykgZnJvbSBbPGMw NDMzYTNjPl0KPiAodXNiZGV2X2lvY3RsKzB4MTI4OC8weDFjZjApIGRyaXZlcnMvdXNiL2NvcmUv dXJiLmM6NjkwCj4gWzxjMDQzM2EzYz5dICh1c2JkZXZfaW9jdGwpIGZyb20gWzxjMDIxN2RiOD5d Cj4gKGRvX3Zmc19pb2N0bCsweDljLzB4OGVjKSBkcml2ZXJzL3VzYi9jb3JlL2RldmlvLmM6MTgz NQo+IFs8YzAyMTdkYjg+XSAoZG9fdmZzX2lvY3RsKSBmcm9tIFs8YzAyMTg2M2M+XSAoU3lTX2lv Y3RsKzB4MzQvMHg1YykKPiBmcy9pb2N0bC5jOjQ3Cj4gWzxjMDIxODYzYz5dIChTeVNfaW9jdGwp IGZyb20gWzxjMDEwNzgyMD5dIChyZXRfZmFzdF9zeXNjYWxsKzB4MC8weDU0KQo+IGluY2x1ZGUv bGludXgvZmlsZS5oOjM5Cj4KPiBBZnRlcndhcmRzIHRoZSBrZXJuZWwgaXMgdW5yZXNwb25zaXZl IHRvIGRpc2Nvbm5lY3QvY29ubmVjdCBvZiB0aGUKPiBmdWxsIHNwZWVkIFVTQiBkZXZpY2UgYnV0 IEkgY2FuIGNvbm5lY3QvZGlzY29ubmVjdCBhIGhpZ2ggc3BlZWQgVVNCCj4gZGV2aWNlIHRvIHRo ZSBzYW1lIHBvcnQgYW5kIGNvbW11bmljYXRlIHRvIGl0IHdpdGhvdXQgcHJvYmxlbSBzaW5jZSBp dAo+IHVzZXMgRUhDSSAoT0hDSSBpcyBjb21wYW5pb24gY29udHJvbGxlcikuIElmIEkgdHJ5IHRv IGNvbm5lY3QgdGhlIGZ1bGwKPiBzcGVlZCBVU0IgZGV2aWNlIGFnYWluIGl0IGlzIHN0aWxsIHVu cmVzcG9uc2l2ZS4gVGhlIHVzZXJzcGFjZQo+IGFwcGxpY2F0aW9uIGlzIHN0aWxsIGhhbmdpbmcg YWZ0ZXIgYWxsIHRoaXMuCj4KPiBDb3VsZCB0aGlzIGNvbW1pdCBiZSBjYXVzaW5nIHRoZSBpc3N1 ZT8KClRoZXJlIGRvZXMgc2VlbSB0byBiZSBzb21ldGhpbmcgd3Jvbmcgd2l0aCB0aGlzIGNvbW1p dC4gSSBkaWQgc29tZQptb3JlIHRlc3Rpbmcgd2l0aCBMaW51eCA0LjE2LjAtcmM2IG9uIHN1bjdp LWEyMC1vbGludXhpbm8tbGltZS4KSSBjb25uZWN0ZWQgYSBzdW43aS1hMjAtcGNkdWlubzNiIHJ1 bm5pbmcgTGludXggNC4xNS4xMiB0aGF0IGhhcyBPVEcKcG9ydCB3aXRoIGdhZGdldCB6ZXJvIGtl cm5lbCBtb2R1bGUgKGdfemVybykgbG9hZGVkIHRvIHRoZSBVU0IgcG9ydAphbmQgZGlkIHNvbWUg dGVzdGluZyB3aXRoIHVzYnRlc3QgZnJvbSB0b29scy91c2IvdGVzdHVzYi5jIGluIGtlcm5lbApy ZXBvc2l0b3J5LgoKSSBoYWQgdG8gZG8gdGhlIGZvbGxvd2luZyBjaGFuZ2UgdG8gYXZvaWQgZ2V0 dGluZyBmbG9vZGVkIHdpdGgKInVzYnRlc3QgMS0xOjMuMDogdW5saW5rIHJldHJ5IiBrZXJuZWwg bWVzc2FnZXMgYWZ0ZXIgdGVzdCAxMSBvZgp0ZXN0dXNiIHN0YXJ0czoKICAgICAgICAgICAgICAg ICAgICAgICAgY2FzZSAwOgogICAgICAgICAgICAgICAgICAgICAgICBjYXNlIC1FSU5QUk9HUkVT UzoKCkhlcmUgYXJlIHRoZSByZXN1bHRzLgoKIyAuL3Rlc3R1c2IgLWEKL2Rldi9idXMvdXNiLzAw MS8wMDIgdGVzdCAwLCAgICAwLjAwNjgyMiBzZWNzCi9kZXYvYnVzL3VzYi8wMDEvMDAyIHRlc3Qg MSwgICAgMC4xNDAxMTIgc2VjcwovZGV2L2J1cy91c2IvMDAxLzAwMiB0ZXN0IDIsICAgIDAuMzgx MTI1IHNlY3MKL2Rldi9idXMvdXNiLzAwMS8wMDIgdGVzdCAzLCAgICAwLjEzMzU2NCBzZWNzCi9k ZXYvYnVzL3VzYi8wMDEvMDAyIHRlc3QgNCwgICAgMC4zODU0OTggc2VjcwovZGV2L2J1cy91c2Iv MDAxLzAwMiB0ZXN0IDUsICAgIDIuMTM4MjU5IHNlY3MKL2Rldi9idXMvdXNiLzAwMS8wMDIgdGVz dCA2LCAgICAxLjc1NTE0NCBzZWNzCi9kZXYvYnVzL3VzYi8wMDEvMDAyIHRlc3QgNywgICAgMi4x MzczODcgc2VjcwovZGV2L2J1cy91c2IvMDAxLzAwMiB0ZXN0IDgsICAgIDEuNzUyMzkzIHNlY3MK L2Rldi9idXMvdXNiLzAwMS8wMDIgdGVzdCA5LCAgICAxLjEzMjU1OSBzZWNzCi9kZXYvYnVzL3Vz Yi8wMDEvMDAyIHRlc3QgMTAsICAgMy42OTg5MzQgc2VjcwovZGV2L2J1cy91c2IvMDAxLzAwMiB0 ZXN0IDExLCAgIDQwLjA2MTExNCBzZWNzCgpkbWVzZyAocHJvY2Vzc2VkIHRocm91Z2ggc2NyaXB0 cy9kZWNvZGVfc3RhY2t0cmFjZS5zaCBmcm9tIGtlcm5lbCByZXBvc2l0b3J5KToKWyAgIDIxLjU3 MzI0Ml0gdXNidGVzdCAxLTE6My4wOiBURVNUIDA6ICBOT1AKWyAgIDIxLjU4MDMxNV0gdXNidGVz dCAxLTE6My4wOiBURVNUIDE6ICB3cml0ZSAxMDI0IGJ5dGVzIDEwMDAgdGltZXMKWyAgIDIxLjcz MjEzOF0gdXNidGVzdCAxLTE6My4wOiBURVNUIDI6ICByZWFkIDEwMjQgYnl0ZXMgMTAwMCB0aW1l cwpbICAgMjIuMTMyMTMzXSB1c2J0ZXN0IDEtMTozLjA6IFRFU1QgMzogIHdyaXRlLzEwMjQgMC4u MTAyNCBieXRlcyAxMDAwIHRpbWVzClsgICAyMi4yODIxMzddIHVzYnRlc3QgMS0xOjMuMDogVEVT VCA0OiAgcmVhZC8xMDI0IDAuLjEwMjQgYnl0ZXMgMTAwMCB0aW1lcwpbICAgMjIuNjgyMTMxXSB1 c2J0ZXN0IDEtMTozLjA6IFRFU1QgNTogIHdyaXRlIDEwMDAgc2dsaXN0cyAzMiBlbnRyaWVzCm9m IDEwMjQgYnl0ZXMKWyAgIDI0LjgzMjEzOF0gdXNidGVzdCAxLTE6My4wOiBURVNUIDY6ICByZWFk IDEwMDAgc2dsaXN0cyAzMiBlbnRyaWVzCm9mIDEwMjQgYnl0ZXMKWyAgIDI2LjYwMjEzNV0gdXNi dGVzdCAxLTE6My4wOiBURVNUIDc6ICB3cml0ZS8xMDI0IDEwMDAgc2dsaXN0cyAzMgplbnRyaWVz IDAuLjEwMjQgYnl0ZXMKWyAgIDI4Ljc1MjEzNl0gdXNidGVzdCAxLTE6My4wOiBURVNUIDg6ICBy ZWFkLzEwMjQgMTAwMCBzZ2xpc3RzIDMyCmVudHJpZXMgMC4uMTAyNCBieXRlcwpbICAgMzAuNTIy MTM5XSB1c2J0ZXN0IDEtMTozLjA6IFRFU1QgOTogIGNoOSAoc3Vic2V0KSBjb250cm9sIHRlc3Rz LCAxMDAwIHRpbWVzClsgICAzMS42NTQ5NTddIHVzYnRlc3QgMS0xOjMuMDogVEVTVCAxMDogIHF1 ZXVlIDMyIGNvbnRyb2wgY2FsbHMsIDEwMDAgdGltZXMKWyAgIDM1LjM1NDIyMF0gdXNidGVzdCAx LTE6My4wOiBURVNUIDExOiAgdW5saW5rIDEwMDAgcmVhZHMgb2YgMTAyNApbICAgNzUuNDE0MDk5 XSB1c2J0ZXN0IDEtMTozLjA6IFRFU1QgMTI6ICB1bmxpbmsgMTAwMCB3cml0ZXMgb2YgMTAyNApb ICAxMjguMDI2MTk0XSBJTkZPOiByY3Vfc2NoZWQgc2VsZi1kZXRlY3RlZCBzdGFsbCBvbiBDUFUK WyAgMTI4LjAzMTM2N10gIDAtLi4uLjogKDEgR1BzIGJlaGluZCkgaWRsZT1mYWEvMS8xMDczNzQx ODI2CnNvZnRpcnE9MjYxNC8yNjIxIGZxcz0xMDQ4ClsgIDEyOC4wMzkxODJdICAgKHQ9MjEwMCBq aWZmaWVzIGc9MjI3IGM9MjI2IHE9MTk2MSkKWyAgMTI4LjA0Mzg4N10gTk1JIGJhY2t0cmFjZSBm b3IgY3B1IDAKWyAgMTI4LjA0NzM3N10gQ1BVOiAwIFBJRDogMjYyIENvbW06IHRlc3R1c2IgVGFp bnRlZDogRyAgICAgICAgICAgTwogNC4xNi4wLXJjNiAjMQpbICAxMjguMDU0OTMyXSBIYXJkd2Fy ZSBuYW1lOiBBbGx3aW5uZXIgc3VuN2kgKEEyMCkgRmFtaWx5ClsgIDEyOC4wNjAxODFdICh1bndp bmRfYmFja3RyYWNlKSBmcm9tIHNob3dfc3RhY2sgKGFyY2gvYXJtL2tlcm5lbC90cmFwcy5jOjI0 OSkKWyAgMTI4LjA2NzkyMV0gKHNob3dfc3RhY2spIGZyb20gZHVtcF9zdGFjayAobGliL2R1bXBf c3RhY2suYzo1NSkKWyAgMTI4LjA3NTE0Ml0gKGR1bXBfc3RhY2spIGZyb20gbm1pX2NwdV9iYWNr dHJhY2UgKGxpYi9ubWlfYmFja3RyYWNlLmM6MTAzKQpbICAxMjguMDgzMTQxXSAobm1pX2NwdV9i YWNrdHJhY2UpIGZyb20gbm1pX3RyaWdnZXJfY3B1bWFza19iYWNrdHJhY2UKKGxpYi9ubWlfYmFj a3RyYWNlLmM6NjIpClsgIDEyOC4wOTI3MDRdIChubWlfdHJpZ2dlcl9jcHVtYXNrX2JhY2t0cmFj ZSkgZnJvbQpyY3VfZHVtcF9jcHVfc3RhY2tzIChrZXJuZWwvcmN1L3RyZWUuYzoxMzczIChkaXNj cmltaW5hdG9yIDIpKQpbICAxMjguMTAyMzUxXSAocmN1X2R1bXBfY3B1X3N0YWNrcykgZnJvbSBy Y3VfY2hlY2tfY2FsbGJhY2tzCihrZXJuZWwvcmN1L3RyZWUuYzoxNTI2IGtlcm5lbC9yY3UvdHJl ZS5jOjE1OTIga2VybmVsL3JjdS90cmVlLmM6MzM2MQprZXJuZWwvcmN1L3RyZWUuYzozNDIzIGtl cm5lbC9yY3UvdHJlZS5jOjI3NjMpClsgIDEyOC4xMTEzMDRdIChyY3VfY2hlY2tfY2FsbGJhY2tz KSBmcm9tIHVwZGF0ZV9wcm9jZXNzX3RpbWVzCihhcmNoL2FybS9pbmNsdWRlL2FzbS90aHJlYWRf aW5mby5oOjkxCmluY2x1ZGUvYXNtLWdlbmVyaWMvcHJlZW1wdC5oOjExIGtlcm5lbC90aW1lL3Rp bWVyLmM6MTYzOCkKWyAgMTI4LjEyMDE3M10gKHVwZGF0ZV9wcm9jZXNzX3RpbWVzKSBmcm9tIHRp Y2tfc2NoZWRfdGltZXIKKGtlcm5lbC90aW1lL3RpY2stc2NoZWQuYzoxMTk5KQpbICAxMjguMTI4 Nzc3XSAodGlja19zY2hlZF90aW1lcikgZnJvbSBfX2hydGltZXJfcnVuX3F1ZXVlcwooa2VybmVs L3RpbWUvaHJ0aW1lci5jOjEzNDkga2VybmVsL3RpbWUvaHJ0aW1lci5jOjE0MTEpClsgIDEyOC4x Mzc1NTNdIChfX2hydGltZXJfcnVuX3F1ZXVlcykgZnJvbSBocnRpbWVyX2ludGVycnVwdAooa2Vy bmVsL3RpbWUvaHJ0aW1lci5jOjE0NzIpClsgIDEyOC4xNDYzMzFdIChocnRpbWVyX2ludGVycnVw dCkgZnJvbSBhcmNoX3RpbWVyX2hhbmRsZXJfcGh5cwooZHJpdmVycy9jbG9ja3NvdXJjZS9hcm1f YXJjaF90aW1lci5jOjU4OQpkcml2ZXJzL2Nsb2Nrc291cmNlL2FybV9hcmNoX3RpbWVyLmM6NjA2 KQpbICAxMjguMTU1Mjg1XSAoYXJjaF90aW1lcl9oYW5kbGVyX3BoeXMpIGZyb20gaGFuZGxlX3Bl cmNwdV9kZXZpZF9pcnEKKGtlcm5lbC9pcnEvY2hpcC5jOjkwOSkKWyAgMTI4LjE2NDg0M10gKGhh bmRsZV9wZXJjcHVfZGV2aWRfaXJxKSBmcm9tIGdlbmVyaWNfaGFuZGxlX2lycQooa2VybmVsL2ly cS9pcnFkZXNjLmM6NjA3KQpbICAxMjguMTczODgwXSAoZ2VuZXJpY19oYW5kbGVfaXJxKSBmcm9t IF9faGFuZGxlX2RvbWFpbl9pcnEKKGtlcm5lbC9pcnEvaXJxZGVzYy5jOjY0NikKWyAgMTI4LjE4 MjU3NF0gKF9faGFuZGxlX2RvbWFpbl9pcnEpIGZyb20gZ2ljX2hhbmRsZV9pcnEKKGFyY2gvYXJt L2luY2x1ZGUvYXNtL2lvLmg6MTE4IGRyaXZlcnMvaXJxY2hpcC9pcnEtZ2ljLmM6MzYwKQpbICAx MjguMTkwOTIwXSAoZ2ljX2hhbmRsZV9pcnEpIGZyb20gX19pcnFfc3ZjCihhcmNoL2FybS9rZXJu ZWwvZW50cnktYXJtdi5TOjIyNikKWyAgMTI4LjE5ODM4Ml0gRXhjZXB0aW9uIHN0YWNrKDB4Y2Rh MWZjODggdG8gMHhjZGExZmNkMCkKWyAgMTI4LjIwMzQzMV0gZmM4MDogICAgICAgICAgICAgICAg ICAgYzBhOTViYzggYTAwNjAwMTMgMDAwMDAwMGEKMDAwMGFhNzUgY2Q4M2I0ODAgYTAwNjAwMTMK WyAgMTI4LjIxMTU5OF0gZmNhMDogY2Y3ZWUwMDAgZmZmZmZmOTggMDAwMDAwMDEgMDAwMDAwMDAg MDAwMDA0MDAKY2VjMmI4MDAgMDAwMDAwMDkgY2RhMWZjZDgKWyAgMTI4LjIxOTc2M10gZmNjMDog YzA0NWIzMjggYzA2MjI4OTAgMjAwNjAwMTMgZmZmZmZmZmYKWyAgMTI4LjIyNDgxOF0gKF9faXJx X3N2YykgZnJvbSBfcmF3X3NwaW5fdW5sb2NrX2lycXJlc3RvcmUKKGtlcm5lbC9sb2NraW5nL3Nw aW5sb2NrLmM6MTg1KQpbICAxMjguMjMzNDI4XSAoX3Jhd19zcGluX3VubG9ja19pcnFyZXN0b3Jl KSBmcm9tIHVzYl9oY2RfdW5saW5rX3VyYgooZHJpdmVycy91c2IvY29yZS9oY2QuYzoxNzIwKQpb ICAxMjguMjQyODE2XSAodXNiX2hjZF91bmxpbmtfdXJiKSBmcm9tIHVubGluazEKKGRyaXZlcnMv dXNiL2NvcmUvaGNkLmM6ODY0IGRyaXZlcnMvdXNiL2NvcmUvaGNkLmM6MTY4NCkKWyAgMTI4LjI1 MDU1NV0gKHVubGluazEpIGZyb20gdW5saW5rX3NpbXBsZSAoZHJpdmVycy91c2IvbWlzYy91c2J0 ZXN0LmM6MTUxMCkKWyAgMTI4LjI1Nzc3NF0gKHVubGlua19zaW1wbGUpIGZyb20gdXNidGVzdF9k b19pb2N0bAooZHJpdmVycy91c2IvbWlzYy91c2J0ZXN0LmM6MjM2MCkKWyAgMTI4LjI2NjAzM10g KHVzYnRlc3RfZG9faW9jdGwpIGZyb20gdXNidGVzdF9pb2N0bAooZHJpdmVycy91c2IvbWlzYy91 c2J0ZXN0LmM6MjY4NSkKWyAgMTI4LjI3NDIwNl0gKHVzYnRlc3RfaW9jdGwpIGZyb20gdXNiZGV2 X2lvY3RsCihkcml2ZXJzL3VzYi9jb3JlL2RldmlvLmM6MjE3NSBkcml2ZXJzL3VzYi9jb3JlL2Rl dmlvLmM6MjE5Nwpkcml2ZXJzL3VzYi9jb3JlL2RldmlvLmM6MjUxMSBkcml2ZXJzL3VzYi9jb3Jl L2RldmlvLmM6MjU1NSkKWyAgMTI4LjI4MjIwMF0gKHVzYmRldl9pb2N0bCkgZnJvbSBkb192ZnNf aW9jdGwgKGZzL2lvY3RsLmM6NDcgZnMvaW9jdGwuYzo2ODYpClsgIDEyOC4yODk4NTRdIChkb192 ZnNfaW9jdGwpIGZyb20gU3lTX2lvY3RsIChpbmNsdWRlL2xpbnV4L2ZpbGUuaDozOQpmcy9pb2N0 bC5jOjcwMiBmcy9pb2N0bC5jOjY5MikKWyAgMTI4LjI5NzE1OV0gKFN5U19pb2N0bCkgZnJvbSBy ZXRfZmFzdF9zeXNjYWxsCihhcmNoL2FybS9rZXJuZWwvZW50cnktY29tbW9uLlM6NTIpClsgIDEy OC4zMDQ3MTZdIEV4Y2VwdGlvbiBzdGFjaygweGNkYTFmZmE4IHRvIDB4Y2RhMWZmZjApClsgIDEy OC4zMDk3NjNdIGZmYTA6ICAgICAgICAgICAgICAgICAgIDAwMDExOWM0IDAwMDAwMDAwIDAwMDAw MDAzCmMwMGM1NTEyIGJlYmJmYjM0IGJlYmJmYjM0ClsgIDEyOC4zMTc5MzFdIGZmYzA6IDAwMDEx OWM0IDAwMDAwMDAwIDAwMDEwOWIwIDAwMDAwMDM2IDAwMDAwMDAwCjAwMDAwMDAwIGI2ZmIwZmFj IGJlYmJmYjQ0ClsgIDEyOC4zMjYwOTZdIGZmZTA6IDAwMDIyMDM0IGJlYmJmYjFjIDAwMDExMDIw IGI2ZWUwNzNjCgpJZiBJIHJldmVydCB0aGUgY29tbWl0LCBJIGNhbiBydW4gIi4vdGVzdHVzYiAt YSIgdG8gY29tcGxldGlvbiB3aXRob3V0CmFueSBpc3N1ZXMgd2l0aCBMaW51eCA0LjE2LjAtcmM2 IG9uIHN1bjdpLWEyMC1vbGludXhpbm8tbGltZS4KSSBkb24ndCBnZXQgYSBrZXJuZWwgc3RhbGwg ZGV0ZWN0ZWQgd2hlbiB0ZXN0aW5nIG9uIHg4Nl82NCBidXQgSSBkbwpzdGlsbCBnZXQgYXQgbGVh c3Qgb25lICJ1bmxpbmsgcmV0cnkiIGVycm9yIG1lc3NhZ2UgZnJvbSBrZXJuZWwgaW4KZG1lc2cg d2hpY2ggY2FuIGJlIHJlcHJvZHVjZWQgdXNpbmcgIi4vdGVzdHVzYiAtYSIgb3IgbW9yZSBmcmVx dWVudGx5CndpdGggIi4vdGVzdHVzYiAtYSAtdCAxMSAtYyA1MDAwIi4KClJlZ2FyZHMsCkpvbmF0 aGFuCi0tLQpUbyB1bnN1YnNjcmliZSBmcm9tIHRoaXMgbGlzdDogc2VuZCB0aGUgbGluZSAidW5z dWJzY3JpYmUgbGludXgtdXNiIiBpbgp0aGUgYm9keSBvZiBhIG1lc3NhZ2UgdG8gbWFqb3Jkb21v QHZnZXIua2VybmVsLm9yZwpNb3JlIG1ham9yZG9tbyBpbmZvIGF0ICBodHRwOi8vdmdlci5rZXJu ZWwub3JnL21ham9yZG9tby1pbmZvLmh0bWwKCi0tLSBhL2RyaXZlcnMvdXNiL21pc2MvdXNidGVz dC5jCisrKyBiL2RyaXZlcnMvdXNiL21pc2MvdXNidGVzdC5jCkBAIC0xNDczLDcgKzE0NzMsNyBA QCBzdGF0aWMgaW50IHVubGluazEoc3RydWN0IHVzYnRlc3RfZGV2ICpkZXYsIGludApwaXBlLCBp bnQKICAgICAgICAgICAgICAgIHNpemUsIGludCBhc3luYykKICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgKiByZXN1Ym1pc3Npb24sIGJ1dCBzaW5jZSB3ZSdyZSB0ZXN0aW5nIHVubGlu awogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHBhdGhzLCB3ZSBjYW4ndC4KICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAg ICAgIEVSUk9SKGRldiwgInVubGluayByZXRyeVxuIik7CisgICAgICAgICAgICAgICAgICAgICAg ICAgLypFUlJPUihkZXYsICJ1bmxpbmsgcmV0cnlcbiIpOyovCiAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgY29udGludWU7Cg==