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 D31D4C19F2D for ; Thu, 4 Aug 2022 05:04:46 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S238782AbiHDFEl (ORCPT ); Thu, 4 Aug 2022 01:04:41 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:53036 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S238660AbiHDFEf (ORCPT ); Thu, 4 Aug 2022 01:04:35 -0400 Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.129.124]) by lindbergh.monkeyblade.net (Postfix) with ESMTP id 0A6535FAEC for ; Wed, 3 Aug 2022 22:04:33 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1659589473; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=6BgLzkyxivpxssxT30ZKZR41YIXRw12sSiCVIsAhFrQ=; b=Vj97CRW0YyMEYzDVZo0fqR3Ey0aH1mBWu+HH9l1L24Eoc+dU+xAiQuHYk/AEcrBsQKAuDa v//criCHghG+HNGNiCHzs6MAxe/ofEnASrKPtZbD6knZ8U3yf1DAyHvzC8OQjbWvShabSI K6g4GPpFzAIfQGhvrnABQw3R5iGxP2g= Received: from mail-lf1-f70.google.com (mail-lf1-f70.google.com [209.85.167.70]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id us-mta-171-GxoDlMa-P7SSH2uciyYWRg-1; Thu, 04 Aug 2022 01:04:29 -0400 X-MC-Unique: GxoDlMa-P7SSH2uciyYWRg-1 Received: by mail-lf1-f70.google.com with SMTP id f21-20020a056512229500b0048af0b6da1dso3544198lfu.22 for ; Wed, 03 Aug 2022 22:04:29 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:mime-version:references:in-reply-to:from:date :message-id:subject:to:cc:content-transfer-encoding; bh=6BgLzkyxivpxssxT30ZKZR41YIXRw12sSiCVIsAhFrQ=; b=eIUa7wmYHxkqg3MTtmkSr3YyExcLYLPCLIEGg31/+OLqI1oo/WKCQ8JabD/6qf+YG3 hvf1ZZDQ8WsWUKOKO646+Ml5TQiNBMTYUWJ9BUBRRPhCsmlYTR48PX88hJaEQW5J5J0i W5gv3IBA6we3gAeYawm05oI7fAI55oeCxC8G9Y0yCe30X/ygqqTWNV+gMBq5vbDidJVR HsdybqaBvQYeglLpViNo77UfQawJhaj0XdgmkuVjwUY+2ae2ROcgs6jmtQLra0z3HH0o 0kXqjmfQRw+litCIWyhJFW2FdRvL11f3aCyzmRzUX2oKWv5QbG07sjehP6TbpDXVnwD/ HhIg== X-Gm-Message-State: ACgBeo2XND7KhsBVcz9Ekt0kri4imOduN4Qv9FZ/IEXlyOujjpc5s2bw nxAGUnzSv2BbXXm0moWyPftcOWwB6RJAkqXgtAGu8as49XGLfWXPPfHhdPc/DJPIFDBl8vTiv4G Fo71TTYZz6VMyMtRhVW7pjy8jb2P//W1g/I4p1RZ/ X-Received: by 2002:a19:ac09:0:b0:48a:d1b5:1791 with SMTP id g9-20020a19ac09000000b0048ad1b51791mr89510lfc.397.1659589467815; Wed, 03 Aug 2022 22:04:27 -0700 (PDT) X-Google-Smtp-Source: AA6agR4t/K2cGtun6THXBNHPloepeMXgVEufBLuHVeiLudT98dIeu2GyjvQqL3UL5dgFI7QeRnYBIPno+nD0SyHPerE= X-Received: by 2002:a19:ac09:0:b0:48a:d1b5:1791 with SMTP id g9-20020a19ac09000000b0048ad1b51791mr89499lfc.397.1659589467615; Wed, 03 Aug 2022 22:04:27 -0700 (PDT) MIME-Version: 1.0 References: <20220721084341.24183-1-qtxuning1999@sjtu.edu.cn> <20220721084341.24183-2-qtxuning1999@sjtu.edu.cn> <16a232ad-e0a1-fd4c-ae3e-27db168daacb@redhat.com> <2a8838c4-2e6f-6de7-dcdc-572699ff3dc9@sjtu.edu.cn> <682271447.4491372.1659449548731.JavaMail.zimbra@sjtu.edu.cn> In-Reply-To: <682271447.4491372.1659449548731.JavaMail.zimbra@sjtu.edu.cn> From: Jason Wang Date: Thu, 4 Aug 2022 13:04:16 +0800 Message-ID: Subject: Re: [RFC 1/5] vhost: reorder used descriptors in a batch To: Guo Zhi Cc: eperezma , sgarzare , Michael Tsirkin , netdev , linux-kernel , kvm list , virtualization 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 Tue, Aug 2, 2022 at 10:12 PM Guo Zhi wrote: > > > > ----- Original Message ----- > > From: "jasowang" > > To: "Guo Zhi" > > Cc: "eperezma" , "sgarzare" ,= "Michael Tsirkin" , "netdev" > > , "linux-kernel" = , "kvm list" , > > "virtualization" > > Sent: Friday, July 29, 2022 3:32:02 PM > > Subject: Re: [RFC 1/5] vhost: reorder used descriptors in a batch > > > On Thu, Jul 28, 2022 at 4:26 PM Guo Zhi wrot= e: > >> > >> On 2022/7/26 15:36, Jason Wang wrote: > >> > >> > >> =E5=9C=A8 2022/7/21 16:43, Guo Zhi =E5=86=99=E9=81=93: > >> > >> Device may not use descriptors in order, for example, NIC and SCSI may > >> not call __vhost_add_used_n with buffers in order. It's the task of > >> __vhost_add_used_n to order them. > >> > >> > >> > >> I'm not sure this is ture. Having ooo descriptors is probably by desig= n to have > >> better performance. > >> > >> This might be obvious for device that may have elevator or QOS stuffs. > >> > >> I suspect the right thing to do here is, for the device that can't per= form > >> better in the case of IN_ORDER, let's simply not offer IN_ORDER (zeroc= opy or > >> scsi). And for the device we know it can perform better, non-zercopy e= thernet > >> device we can do that. > >> > >> > >> This commit reorder the buffers using > >> vq->heads, only the batch is begin from the expected start point and i= s > >> continuous can the batch be exposed to driver. And only writing out a > >> single used ring for a batch of descriptors, according to VIRTIO 1.1 > >> spec. > >> > >> > >> > >> So this sounds more like a "workaround" of the device that can't consu= me buffer > >> in order, I suspect it can help in performance. > >> > >> More below. > >> > >> > >> > >> Signed-off-by: Guo Zhi > >> --- > >> drivers/vhost/vhost.c | 44 +++++++++++++++++++++++++++++++++++++++++= -- > >> drivers/vhost/vhost.h | 3 +++ > >> 2 files changed, 45 insertions(+), 2 deletions(-) > >> > >> diff --git a/drivers/vhost/vhost.c b/drivers/vhost/vhost.c > >> index 40097826c..e2e77e29f 100644 > >> --- a/drivers/vhost/vhost.c > >> +++ b/drivers/vhost/vhost.c > >> @@ -317,6 +317,7 @@ static void vhost_vq_reset(struct vhost_dev *dev, > >> vq->used_flags =3D 0; > >> vq->log_used =3D false; > >> vq->log_addr =3D -1ull; > >> + vq->next_used_head_idx =3D 0; > >> vq->private_data =3D NULL; > >> vq->acked_features =3D 0; > >> vq->acked_backend_features =3D 0; > >> @@ -398,6 +399,8 @@ static long vhost_dev_alloc_iovecs(struct vhost_de= v *dev) > >> GFP_KERNEL); > >> if (!vq->indirect || !vq->log || !vq->heads) > >> goto err_nomem; > >> + > >> + memset(vq->heads, 0, sizeof(*vq->heads) * dev->iov_limit); > >> } > >> return 0; > >> @@ -2374,12 +2377,49 @@ static int __vhost_add_used_n(struct vhost_v= irtqueue > >> *vq, > >> unsigned count) > >> { > >> vring_used_elem_t __user *used; > >> + struct vring_desc desc; > >> u16 old, new; > >> int start; > >> + int begin, end, i; > >> + int copy_n =3D count; > >> + > >> + if (vhost_has_feature(vq, VIRTIO_F_IN_ORDER)) { > >> > >> > >> > >> How do you guarantee that ids of heads are contiguous? > >> > >> There is no need to be contiguous for ids of heads. > >> > >> For example, I have three buffer { .id =3D 0, 15}, {.id =3D 20, 30} {.= id =3D 15, 20} > >> for vhost_add_used_n. Then I will let the vq->heads[0].len=3D15. > >> vq->heads[15].len=3D5, vq->heads[20].len=3D10 as reorder. Once I found= there is no > >> hold in the batched descriptors. I will expose them to driver. > > > > So spec said: > > > > "If VIRTIO_F_IN_ORDER has been negotiated, driver uses descriptors in > > ring order: starting from offset 0 in the table, and wrapping around > > at the end of the table." > > > > And > > > > "VIRTIO_F_IN_ORDER(35)This feature indicates that all buffers are used > > by the device in the same order in which they have been made > > available." > > > > This means your example is not an IN_ORDER device. > > > > The driver should submit buffers (assuming each buffer have one > > descriptor) in order {id =3D 0, 15}, {id =3D 1, 30} and {id =3D 2, 20}. > > > > And even if it is submitted in order, we can not use a batch because: > > > > "The skipped buffers (for which no used ring entry was written) are > > assumed to have been used (read or written) by the device completely." > > > > This means for TX we are probably ok, but for rx, unless we know the > > buffers were written completely, we can't write them in a batch. > > > > I'd suggest to do cross testing for this series: > > > > 1) testing vhost IN_ORDER support with DPDK virtio PMD > > 2) testing virtio IN_ORDER with DPDK vhost-user via testpmd > > > > Thanks > > > You are correct, for rx we can't do a batch because we have to let the dr= iver know the length of buffers. Note that we can do a batch for rx when we know all the buffers have been fully written. > > I think these circumstances can offer batch: > 1. tx > 2. rx with RX_MRGBUF feature, which introduce a header for each received = buffer > > Consider batch is not a mandatory requirement for in order feature accord= ing to spec. > I'd like to let current RFC patch focus on in order implementation, and s= end another > patch series to improve performance by batching on above circumstances. That's fine, how about simply starting from the patch that offers IN_ORDER when zerocopy is disabled? Thanks > > What's your opinon. > > Thanks > > > >> > >> > >> + /* calculate descriptor chain length for each used buffer */ > >> > >> > >> > >> I'm a little bit confused about this comment, we have heads[i].len for= this? > >> > >> Maybe I should not use vq->heads, some misleading. > >> > >> > >> + for (i =3D 0; i < count; i++) { > >> + begin =3D heads[i].id; > >> + end =3D begin; > >> + vq->heads[begin].len =3D 0; > >> > >> > >> > >> Does this work for e.g RX virtqueue? > >> > >> > >> + do { > >> + vq->heads[begin].len +=3D 1; > >> + if (unlikely(vhost_get_desc(vq, &desc, end))) { > >> > >> > >> > >> Let's try hard to avoid more userspace copy here, it's the source of p= erformance > >> regression. > >> > >> Thanks > >> > >> > >> + vq_err(vq, "Failed to get descriptor: idx %d addr= %p\n", > >> + end, vq->desc + end); > >> + return -EFAULT; > >> + } > >> + } while ((end =3D next_desc(vq, &desc)) !=3D -1); > >> + } > >> + > >> + count =3D 0; > >> + /* sort and batch continuous used ring entry */ > >> + while (vq->heads[vq->next_used_head_idx].len !=3D 0) { > >> + count++; > >> + i =3D vq->next_used_head_idx; > >> + vq->next_used_head_idx =3D (vq->next_used_head_idx + > >> + vq->heads[vq->next_used_head_idx].len) > >> + % vq->num; > >> + vq->heads[i].len =3D 0; > >> + } > >> + /* only write out a single used ring entry with the id corres= ponding > >> + * to the head entry of the descriptor chain describing the l= ast buffer > >> + * in the batch. > >> + */ > >> + heads[0].id =3D i; > >> + copy_n =3D 1; > >> + } > >> start =3D vq->last_used_idx & (vq->num - 1); > >> used =3D vq->used->ring + start; > >> - if (vhost_put_used(vq, heads, start, count)) { > >> + if (vhost_put_used(vq, heads, start, copy_n)) { > >> vq_err(vq, "Failed to write used"); > >> return -EFAULT; > >> } > >> @@ -2410,7 +2450,7 @@ int vhost_add_used_n(struct vhost_virtqueue *vq,= struct > >> vring_used_elem *heads, > >> start =3D vq->last_used_idx & (vq->num - 1); > >> n =3D vq->num - start; > >> - if (n < count) { > >> + if (n < count && !vhost_has_feature(vq, VIRTIO_F_IN_ORDER)) { > >> r =3D __vhost_add_used_n(vq, heads, n); > >> if (r < 0) > >> return r; > >> diff --git a/drivers/vhost/vhost.h b/drivers/vhost/vhost.h > >> index d9109107a..7b2c0fbb5 100644 > >> --- a/drivers/vhost/vhost.h > >> +++ b/drivers/vhost/vhost.h > >> @@ -107,6 +107,9 @@ struct vhost_virtqueue { > >> bool log_used; > >> u64 log_addr; > >> + /* Sort heads in order */ > >> + u16 next_used_head_idx; > >> + > >> struct iovec iov[UIO_MAXIOV]; > >> struct iovec iotlb_iov[64]; > >> struct iovec *indirect; > >> > >> > >> > 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 smtp4.osuosl.org (smtp4.osuosl.org [140.211.166.137]) (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 E0208C00144 for ; Thu, 4 Aug 2022 05:04:45 +0000 (UTC) Received: from localhost (localhost [127.0.0.1]) by smtp4.osuosl.org (Postfix) with ESMTP id 60FD941725; Thu, 4 Aug 2022 05:04:45 +0000 (UTC) DKIM-Filter: OpenDKIM Filter v2.11.0 smtp4.osuosl.org 60FD941725 Authentication-Results: smtp4.osuosl.org; dkim=fail reason="signature verification failed" (1024-bit key) header.d=redhat.com header.i=@redhat.com header.a=rsa-sha256 header.s=mimecast20190719 header.b=OfLFY/MV X-Virus-Scanned: amavisd-new at osuosl.org Received: from smtp4.osuosl.org ([127.0.0.1]) by localhost (smtp4.osuosl.org [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id JNRh0jUAFw9r; Thu, 4 Aug 2022 05:04:43 +0000 (UTC) Received: from lists.linuxfoundation.org (lf-lists.osuosl.org [140.211.9.56]) by smtp4.osuosl.org (Postfix) with ESMTPS id 2FA7F416C2; Thu, 4 Aug 2022 05:04:43 +0000 (UTC) DKIM-Filter: OpenDKIM Filter v2.11.0 smtp4.osuosl.org 2FA7F416C2 Received: from lf-lists.osuosl.org (localhost [127.0.0.1]) by lists.linuxfoundation.org (Postfix) with ESMTP id 05AC7C0032; Thu, 4 Aug 2022 05:04:43 +0000 (UTC) Received: from smtp1.osuosl.org (smtp1.osuosl.org [IPv6:2605:bc80:3010::138]) by lists.linuxfoundation.org (Postfix) with ESMTP id 8062CC002D for ; Thu, 4 Aug 2022 05:04:42 +0000 (UTC) Received: from localhost (localhost [127.0.0.1]) by smtp1.osuosl.org (Postfix) with ESMTP id 5AA4881775 for ; Thu, 4 Aug 2022 05:04:42 +0000 (UTC) DKIM-Filter: OpenDKIM Filter v2.11.0 smtp1.osuosl.org 5AA4881775 Authentication-Results: smtp1.osuosl.org; dkim=pass (1024-bit key) header.d=redhat.com header.i=@redhat.com header.a=rsa-sha256 header.s=mimecast20190719 header.b=OfLFY/MV X-Virus-Scanned: amavisd-new at osuosl.org Received: from smtp1.osuosl.org ([127.0.0.1]) by localhost (smtp1.osuosl.org [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id 5dKmt62TMsjZ for ; Thu, 4 Aug 2022 05:04:39 +0000 (UTC) X-Greylist: domain auto-whitelisted by SQLgrey-1.8.0 DKIM-Filter: OpenDKIM Filter v2.11.0 smtp1.osuosl.org 73487817AD Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.129.124]) by smtp1.osuosl.org (Postfix) with ESMTPS id 73487817AD for ; Thu, 4 Aug 2022 05:04:39 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1659589478; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=6BgLzkyxivpxssxT30ZKZR41YIXRw12sSiCVIsAhFrQ=; b=OfLFY/MVMvyz6Nb6n/S7XAG/chQD28QnxtagbYNLpvhhJec5P51WbnCzOchgyGZFk9KAZV +GpyZ2iLwYLxM80ktN5vkDKvv8Y5HmMVjTA0p4NJj+q2wvlOLgvA1XJruKr3I+6F68Ba3Y kpyTBAM/FdEdYBGwKenuFYTjO0qyIG8= Received: from mail-lf1-f70.google.com (mail-lf1-f70.google.com [209.85.167.70]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id us-mta-211-wpaJTUD7NzSoA89rb56EXw-1; Thu, 04 Aug 2022 01:04:29 -0400 X-MC-Unique: wpaJTUD7NzSoA89rb56EXw-1 Received: by mail-lf1-f70.google.com with SMTP id b16-20020a056512305000b0048aec76a1ccso3716618lfb.18 for ; Wed, 03 Aug 2022 22:04:29 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:mime-version:references:in-reply-to:from:date :message-id:subject:to:cc:content-transfer-encoding; bh=6BgLzkyxivpxssxT30ZKZR41YIXRw12sSiCVIsAhFrQ=; b=yVo5A9hAuObZFfuMfDvYqDioiCIlWnJHv3w8JUHWlFPW5kLxhdKk/tT6wRV/G/bZ16 FJ8ea7XdaO6rrnJGEKUcfptdp+lRP8Iq5QdWtfPtIVIh1cSIKgB0oHB2Z/j02a5Ewvbz leeHbApTdmzH0VoZ+25UEYRvIpg3m0g9xkaCO9hTdyBldR1PeooKHiQyuLgjj7DyoImG ttCOFq3yvY3UTRCvrgZ7bIvKNm/zZtwL3Ab6VRcrdtwp92KrcF7nltZ9B76W7H7VPIMf V5iMCeKP2JfWToXFa68CRfLVArZCqyPl/SjZxfSDnIdZtwL8RNpJ5RI7OlItX+2Jmt0l F/NQ== X-Gm-Message-State: ACgBeo2IEtfOb9UlWAYmvZckaaZ6cY1w4ywIvoL5Xs4GalgawpFu0ht6 8rbVnTPXvh7tlE9XErXhQHEIhqDmtqKM+O0vb4cIG/XgkQg6lg/UIYWFl2NhWmn95VbgylV+wBZ y/lCPy8+Ap0TNm4C3nkd2L7SUmbhGEE4/sxKdSaGtIByid6bslJaD73z5Zg== X-Received: by 2002:a19:ac09:0:b0:48a:d1b5:1791 with SMTP id g9-20020a19ac09000000b0048ad1b51791mr89516lfc.397.1659589467823; Wed, 03 Aug 2022 22:04:27 -0700 (PDT) X-Google-Smtp-Source: AA6agR4t/K2cGtun6THXBNHPloepeMXgVEufBLuHVeiLudT98dIeu2GyjvQqL3UL5dgFI7QeRnYBIPno+nD0SyHPerE= X-Received: by 2002:a19:ac09:0:b0:48a:d1b5:1791 with SMTP id g9-20020a19ac09000000b0048ad1b51791mr89499lfc.397.1659589467615; Wed, 03 Aug 2022 22:04:27 -0700 (PDT) MIME-Version: 1.0 References: <20220721084341.24183-1-qtxuning1999@sjtu.edu.cn> <20220721084341.24183-2-qtxuning1999@sjtu.edu.cn> <16a232ad-e0a1-fd4c-ae3e-27db168daacb@redhat.com> <2a8838c4-2e6f-6de7-dcdc-572699ff3dc9@sjtu.edu.cn> <682271447.4491372.1659449548731.JavaMail.zimbra@sjtu.edu.cn> In-Reply-To: <682271447.4491372.1659449548731.JavaMail.zimbra@sjtu.edu.cn> From: Jason Wang Date: Thu, 4 Aug 2022 13:04:16 +0800 Message-ID: Subject: Re: [RFC 1/5] vhost: reorder used descriptors in a batch To: Guo Zhi X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Cc: kvm list , Michael Tsirkin , netdev , linux-kernel , virtualization , eperezma X-BeenThere: virtualization@lists.linux-foundation.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: Linux virtualization List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Errors-To: virtualization-bounces@lists.linux-foundation.org Sender: "Virtualization" T24gVHVlLCBBdWcgMiwgMjAyMiBhdCAxMDoxMiBQTSBHdW8gWmhpIDxxdHh1bmluZzE5OTlAc2p0 dS5lZHUuY24+IHdyb3RlOgo+Cj4KPgo+IC0tLS0tIE9yaWdpbmFsIE1lc3NhZ2UgLS0tLS0KPiA+ IEZyb206ICJqYXNvd2FuZyIgPGphc293YW5nQHJlZGhhdC5jb20+Cj4gPiBUbzogIkd1byBaaGki IDxxdHh1bmluZzE5OTlAc2p0dS5lZHUuY24+Cj4gPiBDYzogImVwZXJlem1hIiA8ZXBlcmV6bWFA cmVkaGF0LmNvbT4sICJzZ2FyemFyZSIgPHNnYXJ6YXJlQHJlZGhhdC5jb20+LCAiTWljaGFlbCBU c2lya2luIiA8bXN0QHJlZGhhdC5jb20+LCAibmV0ZGV2Igo+ID4gPG5ldGRldkB2Z2VyLmtlcm5l bC5vcmc+LCAibGludXgta2VybmVsIiA8bGludXgta2VybmVsQHZnZXIua2VybmVsLm9yZz4sICJr dm0gbGlzdCIgPGt2bUB2Z2VyLmtlcm5lbC5vcmc+LAo+ID4gInZpcnR1YWxpemF0aW9uIiA8dmly dHVhbGl6YXRpb25AbGlzdHMubGludXgtZm91bmRhdGlvbi5vcmc+Cj4gPiBTZW50OiBGcmlkYXks IEp1bHkgMjksIDIwMjIgMzozMjowMiBQTQo+ID4gU3ViamVjdDogUmU6IFtSRkMgMS81XSB2aG9z dDogcmVvcmRlciB1c2VkIGRlc2NyaXB0b3JzIGluIGEgYmF0Y2gKPgo+ID4gT24gVGh1LCBKdWwg MjgsIDIwMjIgYXQgNDoyNiBQTSBHdW8gWmhpIDxxdHh1bmluZzE5OTlAc2p0dS5lZHUuY24+IHdy b3RlOgo+ID4+Cj4gPj4gT24gMjAyMi83LzI2IDE1OjM2LCBKYXNvbiBXYW5nIHdyb3RlOgo+ID4+ Cj4gPj4KPiA+PiDlnKggMjAyMi83LzIxIDE2OjQzLCBHdW8gWmhpIOWGmemBkzoKPiA+Pgo+ID4+ IERldmljZSBtYXkgbm90IHVzZSBkZXNjcmlwdG9ycyBpbiBvcmRlciwgZm9yIGV4YW1wbGUsIE5J QyBhbmQgU0NTSSBtYXkKPiA+PiBub3QgY2FsbCBfX3Zob3N0X2FkZF91c2VkX24gd2l0aCBidWZm ZXJzIGluIG9yZGVyLiAgSXQncyB0aGUgdGFzayBvZgo+ID4+IF9fdmhvc3RfYWRkX3VzZWRfbiB0 byBvcmRlciB0aGVtLgo+ID4+Cj4gPj4KPiA+Pgo+ID4+IEknbSBub3Qgc3VyZSB0aGlzIGlzIHR1 cmUuIEhhdmluZyBvb28gZGVzY3JpcHRvcnMgaXMgcHJvYmFibHkgYnkgZGVzaWduIHRvIGhhdmUK PiA+PiBiZXR0ZXIgcGVyZm9ybWFuY2UuCj4gPj4KPiA+PiBUaGlzIG1pZ2h0IGJlIG9idmlvdXMg Zm9yIGRldmljZSB0aGF0IG1heSBoYXZlIGVsZXZhdG9yIG9yIFFPUyBzdHVmZnMuCj4gPj4KPiA+ PiBJIHN1c3BlY3QgdGhlIHJpZ2h0IHRoaW5nIHRvIGRvIGhlcmUgaXMsIGZvciB0aGUgZGV2aWNl IHRoYXQgY2FuJ3QgcGVyZm9ybQo+ID4+IGJldHRlciBpbiB0aGUgY2FzZSBvZiBJTl9PUkRFUiwg bGV0J3Mgc2ltcGx5IG5vdCBvZmZlciBJTl9PUkRFUiAoemVyb2NvcHkgb3IKPiA+PiBzY3NpKS4g QW5kIGZvciB0aGUgZGV2aWNlIHdlIGtub3cgaXQgY2FuIHBlcmZvcm0gYmV0dGVyLCBub24temVy Y29weSBldGhlcm5ldAo+ID4+IGRldmljZSB3ZSBjYW4gZG8gdGhhdC4KPiA+Pgo+ID4+Cj4gPj4g ICBUaGlzIGNvbW1pdCByZW9yZGVyIHRoZSBidWZmZXJzIHVzaW5nCj4gPj4gdnEtPmhlYWRzLCBv bmx5IHRoZSBiYXRjaCBpcyBiZWdpbiBmcm9tIHRoZSBleHBlY3RlZCBzdGFydCBwb2ludCBhbmQg aXMKPiA+PiBjb250aW51b3VzIGNhbiB0aGUgYmF0Y2ggYmUgZXhwb3NlZCB0byBkcml2ZXIuICBB bmQgb25seSB3cml0aW5nIG91dCBhCj4gPj4gc2luZ2xlIHVzZWQgcmluZyBmb3IgYSBiYXRjaCBv ZiBkZXNjcmlwdG9ycywgYWNjb3JkaW5nIHRvIFZJUlRJTyAxLjEKPiA+PiBzcGVjLgo+ID4+Cj4g Pj4KPiA+Pgo+ID4+IFNvIHRoaXMgc291bmRzIG1vcmUgbGlrZSBhICJ3b3JrYXJvdW5kIiBvZiB0 aGUgZGV2aWNlIHRoYXQgY2FuJ3QgY29uc3VtZSBidWZmZXIKPiA+PiBpbiBvcmRlciwgSSBzdXNw ZWN0IGl0IGNhbiBoZWxwIGluIHBlcmZvcm1hbmNlLgo+ID4+Cj4gPj4gTW9yZSBiZWxvdy4KPiA+ Pgo+ID4+Cj4gPj4KPiA+PiBTaWduZWQtb2ZmLWJ5OiBHdW8gWmhpIDxxdHh1bmluZzE5OTlAc2p0 dS5lZHUuY24+Cj4gPj4gLS0tCj4gPj4gICBkcml2ZXJzL3Zob3N0L3Zob3N0LmMgfCA0NCArKysr KysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKy0tCj4gPj4gICBkcml2ZXJzL3Zo b3N0L3Zob3N0LmggfCAgMyArKysKPiA+PiAgIDIgZmlsZXMgY2hhbmdlZCwgNDUgaW5zZXJ0aW9u cygrKSwgMiBkZWxldGlvbnMoLSkKPiA+Pgo+ID4+IGRpZmYgLS1naXQgYS9kcml2ZXJzL3Zob3N0 L3Zob3N0LmMgYi9kcml2ZXJzL3Zob3N0L3Zob3N0LmMKPiA+PiBpbmRleCA0MDA5NzgyNmMuLmUy ZTc3ZTI5ZiAxMDA2NDQKPiA+PiAtLS0gYS9kcml2ZXJzL3Zob3N0L3Zob3N0LmMKPiA+PiArKysg Yi9kcml2ZXJzL3Zob3N0L3Zob3N0LmMKPiA+PiBAQCAtMzE3LDYgKzMxNyw3IEBAIHN0YXRpYyB2 b2lkIHZob3N0X3ZxX3Jlc2V0KHN0cnVjdCB2aG9zdF9kZXYgKmRldiwKPiA+PiAgICAgICB2cS0+ dXNlZF9mbGFncyA9IDA7Cj4gPj4gICAgICAgdnEtPmxvZ191c2VkID0gZmFsc2U7Cj4gPj4gICAg ICAgdnEtPmxvZ19hZGRyID0gLTF1bGw7Cj4gPj4gKyAgICB2cS0+bmV4dF91c2VkX2hlYWRfaWR4 ID0gMDsKPiA+PiAgICAgICB2cS0+cHJpdmF0ZV9kYXRhID0gTlVMTDsKPiA+PiAgICAgICB2cS0+ YWNrZWRfZmVhdHVyZXMgPSAwOwo+ID4+ICAgICAgIHZxLT5hY2tlZF9iYWNrZW5kX2ZlYXR1cmVz ID0gMDsKPiA+PiBAQCAtMzk4LDYgKzM5OSw4IEBAIHN0YXRpYyBsb25nIHZob3N0X2Rldl9hbGxv Y19pb3ZlY3Moc3RydWN0IHZob3N0X2RldiAqZGV2KQo+ID4+ICAgICAgICAgICAgICAgICAgICAg ICAgIEdGUF9LRVJORUwpOwo+ID4+ICAgICAgICAgICBpZiAoIXZxLT5pbmRpcmVjdCB8fCAhdnEt PmxvZyB8fCAhdnEtPmhlYWRzKQo+ID4+ICAgICAgICAgICAgICAgZ290byBlcnJfbm9tZW07Cj4g Pj4gKwo+ID4+ICsgICAgICAgIG1lbXNldCh2cS0+aGVhZHMsIDAsIHNpemVvZigqdnEtPmhlYWRz KSAqIGRldi0+aW92X2xpbWl0KTsKPiA+PiAgICAgICB9Cj4gPj4gICAgICAgcmV0dXJuIDA7Cj4g Pj4gICBAQCAtMjM3NCwxMiArMjM3Nyw0OSBAQCBzdGF0aWMgaW50IF9fdmhvc3RfYWRkX3VzZWRf bihzdHJ1Y3Qgdmhvc3RfdmlydHF1ZXVlCj4gPj4gICAqdnEsCj4gPj4gICAgICAgICAgICAgICAg ICAgdW5zaWduZWQgY291bnQpCj4gPj4gICB7Cj4gPj4gICAgICAgdnJpbmdfdXNlZF9lbGVtX3Qg X191c2VyICp1c2VkOwo+ID4+ICsgICAgc3RydWN0IHZyaW5nX2Rlc2MgZGVzYzsKPiA+PiAgICAg ICB1MTYgb2xkLCBuZXc7Cj4gPj4gICAgICAgaW50IHN0YXJ0Owo+ID4+ICsgICAgaW50IGJlZ2lu LCBlbmQsIGk7Cj4gPj4gKyAgICBpbnQgY29weV9uID0gY291bnQ7Cj4gPj4gKwo+ID4+ICsgICAg aWYgKHZob3N0X2hhc19mZWF0dXJlKHZxLCBWSVJUSU9fRl9JTl9PUkRFUikpIHsKPiA+Pgo+ID4+ Cj4gPj4KPiA+PiBIb3cgZG8geW91IGd1YXJhbnRlZSB0aGF0IGlkcyBvZiBoZWFkcyBhcmUgY29u dGlndW91cz8KPiA+Pgo+ID4+IFRoZXJlIGlzIG5vIG5lZWQgdG8gYmUgY29udGlndW91cyBmb3Ig aWRzIG9mIGhlYWRzLgo+ID4+Cj4gPj4gRm9yIGV4YW1wbGUsIEkgaGF2ZSB0aHJlZSBidWZmZXIg eyAuaWQgPSAwLCAxNX0sIHsuaWQgPSAyMCwgMzB9IHsuaWQgPSAxNSwgMjB9Cj4gPj4gZm9yIHZo b3N0X2FkZF91c2VkX24uIFRoZW4gSSB3aWxsIGxldCB0aGUgdnEtPmhlYWRzWzBdLmxlbj0xNS4K PiA+PiB2cS0+aGVhZHNbMTVdLmxlbj01LCB2cS0+aGVhZHNbMjBdLmxlbj0xMCBhcyByZW9yZGVy LiBPbmNlIEkgZm91bmQgdGhlcmUgaXMgbm8KPiA+PiBob2xkIGluIHRoZSBiYXRjaGVkIGRlc2Ny aXB0b3JzLiBJIHdpbGwgZXhwb3NlIHRoZW0gdG8gZHJpdmVyLgo+ID4KPiA+IFNvIHNwZWMgc2Fp ZDoKPiA+Cj4gPiAiSWYgVklSVElPX0ZfSU5fT1JERVIgaGFzIGJlZW4gbmVnb3RpYXRlZCwgZHJp dmVyIHVzZXMgZGVzY3JpcHRvcnMgaW4KPiA+IHJpbmcgb3JkZXI6IHN0YXJ0aW5nIGZyb20gb2Zm c2V0IDAgaW4gdGhlIHRhYmxlLCBhbmQgd3JhcHBpbmcgYXJvdW5kCj4gPiBhdCB0aGUgZW5kIG9m IHRoZSB0YWJsZS4iCj4gPgo+ID4gQW5kCj4gPgo+ID4gIlZJUlRJT19GX0lOX09SREVSKDM1KVRo aXMgZmVhdHVyZSBpbmRpY2F0ZXMgdGhhdCBhbGwgYnVmZmVycyBhcmUgdXNlZAo+ID4gYnkgdGhl IGRldmljZSBpbiB0aGUgc2FtZSBvcmRlciBpbiB3aGljaCB0aGV5IGhhdmUgYmVlbiBtYWRlCj4g PiBhdmFpbGFibGUuIgo+ID4KPiA+IFRoaXMgbWVhbnMgeW91ciBleGFtcGxlIGlzIG5vdCBhbiBJ Tl9PUkRFUiBkZXZpY2UuCj4gPgo+ID4gVGhlIGRyaXZlciBzaG91bGQgc3VibWl0IGJ1ZmZlcnMg KGFzc3VtaW5nIGVhY2ggYnVmZmVyIGhhdmUgb25lCj4gPiBkZXNjcmlwdG9yKSBpbiBvcmRlciB7 aWQgPSAwLCAxNX0sIHtpZCA9IDEsIDMwfSBhbmQge2lkID0gMiwgMjB9Lgo+ID4KPiA+IEFuZCBl dmVuIGlmIGl0IGlzIHN1Ym1pdHRlZCBpbiBvcmRlciwgd2UgY2FuIG5vdCB1c2UgYSBiYXRjaCBi ZWNhdXNlOgo+ID4KPiA+ICJUaGUgc2tpcHBlZCBidWZmZXJzIChmb3Igd2hpY2ggbm8gdXNlZCBy aW5nIGVudHJ5IHdhcyB3cml0dGVuKSBhcmUKPiA+IGFzc3VtZWQgdG8gaGF2ZSBiZWVuIHVzZWQg KHJlYWQgb3Igd3JpdHRlbikgYnkgdGhlIGRldmljZSBjb21wbGV0ZWx5LiIKPiA+Cj4gPiBUaGlz IG1lYW5zIGZvciBUWCB3ZSBhcmUgcHJvYmFibHkgb2ssIGJ1dCBmb3IgcngsIHVubGVzcyB3ZSBr bm93IHRoZQo+ID4gYnVmZmVycyB3ZXJlIHdyaXR0ZW4gY29tcGxldGVseSwgd2UgY2FuJ3Qgd3Jp dGUgdGhlbSBpbiBhIGJhdGNoLgo+ID4KPiA+IEknZCBzdWdnZXN0IHRvIGRvIGNyb3NzIHRlc3Rp bmcgZm9yIHRoaXMgc2VyaWVzOgo+ID4KPiA+IDEpIHRlc3Rpbmcgdmhvc3QgSU5fT1JERVIgc3Vw cG9ydCB3aXRoIERQREsgdmlydGlvIFBNRAo+ID4gMikgdGVzdGluZyB2aXJ0aW8gSU5fT1JERVIg d2l0aCBEUERLIHZob3N0LXVzZXIgdmlhIHRlc3RwbWQKPiA+Cj4gPiBUaGFua3MKPiA+Cj4gWW91 IGFyZSBjb3JyZWN0LCBmb3Igcnggd2UgY2FuJ3QgZG8gYSBiYXRjaCBiZWNhdXNlIHdlIGhhdmUg dG8gbGV0IHRoZSBkcml2ZXIga25vdyB0aGUgbGVuZ3RoIG9mIGJ1ZmZlcnMuCgpOb3RlIHRoYXQg d2UgY2FuIGRvIGEgYmF0Y2ggZm9yIHJ4IHdoZW4gd2Uga25vdyBhbGwgdGhlIGJ1ZmZlcnMgaGF2 ZQpiZWVuIGZ1bGx5IHdyaXR0ZW4uCgo+Cj4gSSB0aGluayB0aGVzZSBjaXJjdW1zdGFuY2VzIGNh biBvZmZlciBiYXRjaDoKPiAxLiB0eAo+IDIuIHJ4IHdpdGggUlhfTVJHQlVGIGZlYXR1cmUsIHdo aWNoIGludHJvZHVjZSBhIGhlYWRlciBmb3IgZWFjaCByZWNlaXZlZCBidWZmZXIKPgo+IENvbnNp ZGVyIGJhdGNoIGlzIG5vdCBhIG1hbmRhdG9yeSByZXF1aXJlbWVudCBmb3IgaW4gb3JkZXIgZmVh dHVyZSBhY2NvcmRpbmcgdG8gc3BlYy4KPiBJJ2QgbGlrZSB0byBsZXQgY3VycmVudCBSRkMgcGF0 Y2ggZm9jdXMgb24gaW4gb3JkZXIgaW1wbGVtZW50YXRpb24sIGFuZCBzZW5kIGFub3RoZXIKPiBw YXRjaCBzZXJpZXMgdG8gaW1wcm92ZSBwZXJmb3JtYW5jZSBieSBiYXRjaGluZyBvbiBhYm92ZSBj aXJjdW1zdGFuY2VzLgoKVGhhdCdzIGZpbmUsIGhvdyBhYm91dCBzaW1wbHkgc3RhcnRpbmcgZnJv bSB0aGUgcGF0Y2ggdGhhdCBvZmZlcnMKSU5fT1JERVIgd2hlbiB6ZXJvY29weSBpcyBkaXNhYmxl ZD8KClRoYW5rcwoKPgo+IFdoYXQncyB5b3VyIG9waW5vbi4KPgo+IFRoYW5rcwo+ID4KPiA+Pgo+ ID4+Cj4gPj4gKyAgICAgICAgLyogY2FsY3VsYXRlIGRlc2NyaXB0b3IgY2hhaW4gbGVuZ3RoIGZv ciBlYWNoIHVzZWQgYnVmZmVyICovCj4gPj4KPiA+Pgo+ID4+Cj4gPj4gSSdtIGEgbGl0dGxlIGJp dCBjb25mdXNlZCBhYm91dCB0aGlzIGNvbW1lbnQsIHdlIGhhdmUgaGVhZHNbaV0ubGVuIGZvciB0 aGlzPwo+ID4+Cj4gPj4gTWF5YmUgSSBzaG91bGQgbm90IHVzZSB2cS0+aGVhZHMsIHNvbWUgbWlz bGVhZGluZy4KPiA+Pgo+ID4+Cj4gPj4gKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGNvdW50OyBp KyspIHsKPiA+PiArICAgICAgICAgICAgYmVnaW4gPSBoZWFkc1tpXS5pZDsKPiA+PiArICAgICAg ICAgICAgZW5kID0gYmVnaW47Cj4gPj4gKyAgICAgICAgICAgIHZxLT5oZWFkc1tiZWdpbl0ubGVu ID0gMDsKPiA+Pgo+ID4+Cj4gPj4KPiA+PiBEb2VzIHRoaXMgd29yayBmb3IgZS5nIFJYIHZpcnRx dWV1ZT8KPiA+Pgo+ID4+Cj4gPj4gKyAgICAgICAgICAgIGRvIHsKPiA+PiArICAgICAgICAgICAg ICAgIHZxLT5oZWFkc1tiZWdpbl0ubGVuICs9IDE7Cj4gPj4gKyAgICAgICAgICAgICAgICBpZiAo dW5saWtlbHkodmhvc3RfZ2V0X2Rlc2ModnEsICZkZXNjLCBlbmQpKSkgewo+ID4+Cj4gPj4KPiA+ Pgo+ID4+IExldCdzIHRyeSBoYXJkIHRvIGF2b2lkIG1vcmUgdXNlcnNwYWNlIGNvcHkgaGVyZSwg aXQncyB0aGUgc291cmNlIG9mIHBlcmZvcm1hbmNlCj4gPj4gcmVncmVzc2lvbi4KPiA+Pgo+ID4+ IFRoYW5rcwo+ID4+Cj4gPj4KPiA+PiArICAgICAgICAgICAgICAgICAgICB2cV9lcnIodnEsICJG YWlsZWQgdG8gZ2V0IGRlc2NyaXB0b3I6IGlkeCAlZCBhZGRyICVwXG4iLAo+ID4+ICsgICAgICAg ICAgICAgICAgICAgICAgICAgICBlbmQsIHZxLT5kZXNjICsgZW5kKTsKPiA+PiArICAgICAgICAg ICAgICAgICAgICByZXR1cm4gLUVGQVVMVDsKPiA+PiArICAgICAgICAgICAgICAgIH0KPiA+PiAr ICAgICAgICAgICAgfSB3aGlsZSAoKGVuZCA9IG5leHRfZGVzYyh2cSwgJmRlc2MpKSAhPSAtMSk7 Cj4gPj4gKyAgICAgICAgfQo+ID4+ICsKPiA+PiArICAgICAgICBjb3VudCA9IDA7Cj4gPj4gKyAg ICAgICAgLyogc29ydCBhbmQgYmF0Y2ggY29udGludW91cyB1c2VkIHJpbmcgZW50cnkgKi8KPiA+ PiArICAgICAgICB3aGlsZSAodnEtPmhlYWRzW3ZxLT5uZXh0X3VzZWRfaGVhZF9pZHhdLmxlbiAh PSAwKSB7Cj4gPj4gKyAgICAgICAgICAgIGNvdW50Kys7Cj4gPj4gKyAgICAgICAgICAgIGkgPSB2 cS0+bmV4dF91c2VkX2hlYWRfaWR4Owo+ID4+ICsgICAgICAgICAgICB2cS0+bmV4dF91c2VkX2hl YWRfaWR4ID0gKHZxLT5uZXh0X3VzZWRfaGVhZF9pZHggKwo+ID4+ICsgICAgICAgICAgICAgICAg ICAgICAgICAgIHZxLT5oZWFkc1t2cS0+bmV4dF91c2VkX2hlYWRfaWR4XS5sZW4pCj4gPj4gKyAg ICAgICAgICAgICAgICAgICAgICAgICAgJSB2cS0+bnVtOwo+ID4+ICsgICAgICAgICAgICB2cS0+ aGVhZHNbaV0ubGVuID0gMDsKPiA+PiArICAgICAgICB9Cj4gPj4gKyAgICAgICAgLyogb25seSB3 cml0ZSBvdXQgYSBzaW5nbGUgdXNlZCByaW5nIGVudHJ5IHdpdGggdGhlIGlkIGNvcnJlc3BvbmRp bmcKPiA+PiArICAgICAgICAgKiB0byB0aGUgaGVhZCBlbnRyeSBvZiB0aGUgZGVzY3JpcHRvciBj aGFpbiBkZXNjcmliaW5nIHRoZSBsYXN0IGJ1ZmZlcgo+ID4+ICsgICAgICAgICAqIGluIHRoZSBi YXRjaC4KPiA+PiArICAgICAgICAgKi8KPiA+PiArICAgICAgICBoZWFkc1swXS5pZCA9IGk7Cj4g Pj4gKyAgICAgICAgY29weV9uID0gMTsKPiA+PiArICAgIH0KPiA+PiAgICAgICAgIHN0YXJ0ID0g dnEtPmxhc3RfdXNlZF9pZHggJiAodnEtPm51bSAtIDEpOwo+ID4+ICAgICAgIHVzZWQgPSB2cS0+ dXNlZC0+cmluZyArIHN0YXJ0Owo+ID4+IC0gICAgaWYgKHZob3N0X3B1dF91c2VkKHZxLCBoZWFk cywgc3RhcnQsIGNvdW50KSkgewo+ID4+ICsgICAgaWYgKHZob3N0X3B1dF91c2VkKHZxLCBoZWFk cywgc3RhcnQsIGNvcHlfbikpIHsKPiA+PiAgICAgICAgICAgdnFfZXJyKHZxLCAiRmFpbGVkIHRv IHdyaXRlIHVzZWQiKTsKPiA+PiAgICAgICAgICAgcmV0dXJuIC1FRkFVTFQ7Cj4gPj4gICAgICAg fQo+ID4+IEBAIC0yNDEwLDcgKzI0NTAsNyBAQCBpbnQgdmhvc3RfYWRkX3VzZWRfbihzdHJ1Y3Qg dmhvc3RfdmlydHF1ZXVlICp2cSwgc3RydWN0Cj4gPj4gdnJpbmdfdXNlZF9lbGVtICpoZWFkcywK PiA+PiAgICAgICAgIHN0YXJ0ID0gdnEtPmxhc3RfdXNlZF9pZHggJiAodnEtPm51bSAtIDEpOwo+ ID4+ICAgICAgIG4gPSB2cS0+bnVtIC0gc3RhcnQ7Cj4gPj4gLSAgICBpZiAobiA8IGNvdW50KSB7 Cj4gPj4gKyAgICBpZiAobiA8IGNvdW50ICYmICF2aG9zdF9oYXNfZmVhdHVyZSh2cSwgVklSVElP X0ZfSU5fT1JERVIpKSB7Cj4gPj4gICAgICAgICAgIHIgPSBfX3Zob3N0X2FkZF91c2VkX24odnEs IGhlYWRzLCBuKTsKPiA+PiAgICAgICAgICAgaWYgKHIgPCAwKQo+ID4+ICAgICAgICAgICAgICAg cmV0dXJuIHI7Cj4gPj4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmhvc3Qvdmhvc3QuaCBiL2RyaXZl cnMvdmhvc3Qvdmhvc3QuaAo+ID4+IGluZGV4IGQ5MTA5MTA3YS4uN2IyYzBmYmI1IDEwMDY0NAo+ ID4+IC0tLSBhL2RyaXZlcnMvdmhvc3Qvdmhvc3QuaAo+ID4+ICsrKyBiL2RyaXZlcnMvdmhvc3Qv dmhvc3QuaAo+ID4+IEBAIC0xMDcsNiArMTA3LDkgQEAgc3RydWN0IHZob3N0X3ZpcnRxdWV1ZSB7 Cj4gPj4gICAgICAgYm9vbCBsb2dfdXNlZDsKPiA+PiAgICAgICB1NjQgbG9nX2FkZHI7Cj4gPj4g ICArICAgIC8qIFNvcnQgaGVhZHMgaW4gb3JkZXIgKi8KPiA+PiArICAgIHUxNiBuZXh0X3VzZWRf aGVhZF9pZHg7Cj4gPj4gKwo+ID4+ICAgICAgIHN0cnVjdCBpb3ZlYyBpb3ZbVUlPX01BWElPVl07 Cj4gPj4gICAgICAgc3RydWN0IGlvdmVjIGlvdGxiX2lvdls2NF07Cj4gPj4gICAgICAgc3RydWN0 IGlvdmVjICppbmRpcmVjdDsKPiA+Pgo+ID4+Cj4gPj4KPgoKX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX18KVmlydHVhbGl6YXRpb24gbWFpbGluZyBsaXN0ClZp cnR1YWxpemF0aW9uQGxpc3RzLmxpbnV4LWZvdW5kYXRpb24ub3JnCmh0dHBzOi8vbGlzdHMubGlu dXhmb3VuZGF0aW9uLm9yZy9tYWlsbWFuL2xpc3RpbmZvL3ZpcnR1YWxpemF0aW9u