From nobody Fri Oct 2 12:25:26 2026 Received: from mail-qt1-f177.google.com (mail-qt1-f177.google.com [209.85.160.177]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 985913624AE for ; Sat, 1 Aug 2026 10:21:01 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=pass smtp.client-ip=209.85.160.177 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785579663; cv=pass; b=IIxItGna827TJdcEJA/WiGrefYg46LnQ7Vt+vmoLWx4CKEKWJUK97z8tsMVrhN0zsJomJLon/xD9NiMt+BVMFwiVOLclo0wEDpv+ub3LqZoWO60515FopyEQY8QoIq8clJ2QfWdAijH5rNyrgK9QTTwq3ONPS+S/JldcOQJJqZ8= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785579663; c=relaxed/simple; bh=YC/RBG84fJ9rhPBxgqIMsoJQx81EadQUxjyT0RURS40=; h=MIME-Version:From:Date:Message-ID:Subject:To:Cc:Content-Type; b=nwbVXWM/8zMKSbJGL9YxfLjo2aEW3DoUv8bQzl45FaP9p1zobUO1pAcNXjoygQHIOMtEUHCs8SA3zbSZCDAflrqI/Gb1Zf8OL6BKp/Es7IFjKZ0mnq+yR9f0p598NsmXJCwBvGyWUsVa3ZkkCaT0xJoSGRyzAmHqUwgoXvkK1zY= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=cAwCiCX/; arc=pass smtp.client-ip=209.85.160.177 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="cAwCiCX/" Received: by mail-qt1-f177.google.com with SMTP id d75a77b69052e-51bfad59921so11194501cf.0 for ; Sat, 01 Aug 2026 03:21:01 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1785579660; cv=none; d=google.com; s=arc-20260327; b=n2kp2C4ot1e9Sx1B3Y4VGRzuG7QNjY8hkhmotapEoD0Eoqg/5cYJ/yMlEf1HJNTZYj NiuNjZlSQyBg7DAnuufo6T9DmI/lahjzBmajQ0RUvsLtZnplql+69hD9+D5AlG/o4SmF F4M8vhPSdUaoYefeU6aqQzRy1e87UFG62rpEIRl/W/IbauuWiO3h78z/iYfecdp8+Rxi PGfPWQOhy8rpzNrmBQpY4T9PqhZBzXZXsrZzQGG0e6aVibARi7VJyaEzcP9KC8oXhplF uTo/n5bgMqwAu4g0Y9Z/gwVFPo2wzTwpFxu6mOcQfQBrTqetsI6YdJFQWRX10WZv2J7/ plHg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20260327; h=cc:to:subject:message-id:date:from:mime-version:dkim-signature; bh=C3zf/NMYzfCpkVlPgOj5LeVCyN0A3PQ7z2mBY0LdY4Q=; fh=ACwcknNUirD7tisZR0ZJ8edPFNiv12cTc/5CZIdTmWw=; b=eBQlD9mnbtMuIsvGvoSno3HHi/G6dWZ5C81q0nh0twX7WFw+VqadKn4v+GBHrA3Azv a5FlkvMnskvZru/aw6YkMgrmaZ9hnl7CdUormw9/NnkCMskHiB0+c0cNsjqK295f/Qok 0fqJlWAGDxly+emB4+14Ve5U6iVpH36eLZv6G2TYyw5kjt6cg1n4pw54RdeXT1i7/emV ScYSLaWDn+C4ltM0Gx+MPaKC9053lz4RmN+fgsz5ggcH5ZGojZCIm7xo/8rftjeCu7GS xzW7DNQekZ3789IoMtwzoFwyM8BjEWeEFMVABWScwO2qKEldFmYAdeMXABlmWrrUp+5s AAFA==; darn=vger.kernel.org ARC-Authentication-Results: i=1; mx.google.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1785579660; x=1786184460; darn=vger.kernel.org; h=content-type:cc:to:subject:message-id:date:from:mime-version:from :to:cc:subject:date:message-id:reply-to:content-type; bh=C3zf/NMYzfCpkVlPgOj5LeVCyN0A3PQ7z2mBY0LdY4Q=; b=cAwCiCX/VISMtrVM3CC4Y2/bOxjMfOvRGFo5OJI4sS+6isj5jVxn4yK1K6c83fLZvw mYrzPyCjgMNQPIZjMep6zr1Aal26lsBsQmr3Zpm/13RKs0zDqniWkzpHqiCnFFEqfgdL eaBhZXPsxCCGTa0Frk4bkdQirRJh4P4TrxKXQpJyjALIv1vpq6FvaM+NlKA4ToSE6DCp ZbCF43M7uZ+IdU6fjJZC3r0feybivUQTnxNcChbtfyrKxfN/qsYkihiZhM8ZTMP9el4B 4ljPCmTYXxm+jDgoLLAoezJGhkl7nMq0IX83hstNtOltGnfDMIHYR8ZbQ3ehsYG4tbo2 hrQA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1785579660; x=1786184460; h=content-type:cc:to:subject:message-id:date:from:mime-version :x-gm-gg:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to:content-type; bh=C3zf/NMYzfCpkVlPgOj5LeVCyN0A3PQ7z2mBY0LdY4Q=; b=mzQ4EKAXax+yATPqF5hllL63zjc6tkw+4iYQJbSnjT8oQJpjkyuVZBa0CBSl9DBXtq JSc7lQl5ppILmUpCu0jhynr4XxIoXmQNTYUlisKCP9tjYTSWjzxNsmpWdMUjU2x/AU9l TQKNMTeIyRLPUEgDDGc+6oo5qkvdBSnZYQ6+Wk3dEAGcDq5sPoZpUKqphAAiAwc+iVOg K53s8DD1lHCZGzwQuBExVv/DoHEE95EkynxOQ8DzTVHPG3hyVGOd4hHKOBt5506+vXZA J+W5PLelG7iaXzwY8SZyt6HUEVOBkj1wUZl9/V/vQZkNwKGPBbn5upEesfYRLC5qOzmp BByw== X-Gm-Message-State: AOJu0YyRnz0NtFmyxuCBsZHDBocFyB/2KBDyIb7nRO1ypMfIOQFnRGFs MH/DuPSuIiF7iTa9CofhOAFWf0Svk9PYafrOoWO/ewe9u0ZH4g88eLyNkNYnK7KO/8K9P1P5Yc6 X1xGxbFtaZRg7WL8Hyb6J3t5n6vFJ+D9E0pX3OtGvTkty X-Gm-Gg: AR+sD10CCbYcQyre1evu6Du5VlZE+p6sXCPBRBjc27y8OxtS5Rl9rM2okxPWO19l8Pd 5P+FVn4dc2noNgc694eRsF5KaDYWY3A4wDldePRKIIxLQkz5W6sSWZjQ+v/ucfWUi/NNoTHTDmd JQfFRykUVisHR8x41QCKYMQ+aVgWp0eDyssYGRHcCvepXeMHsNSdVqpCEFVUR3lbC/oWKI6b+9s LlXu0mHrYULkqY6AzADADD/c1zUwJHPyZ/oLw+PUfdhKlVuHlLOggtJQBt4hYX5mkh+z0Ku7Kmw Np+qQWxn7atAa4AGZIXODa46pQvJfP2rqvyQ31aXwmZ46g== X-Received: by 2002:a05:622a:1246:b0:516:dff5:68c4 with SMTP id d75a77b69052e-52b566f6e46mr66617211cf.7.1785579660044; Sat, 01 Aug 2026 03:21:00 -0700 (PDT) Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 From: =?UTF-8?B?xJDhu6ljIEPhuqNuaCBOZ3V54buFbg==?= <0206canh@gmail.com> Date: Sat, 1 Aug 2026 17:20:48 +0700 X-Gm-Features: AUfX_my6NggAN9FAK93sEygrK74Li4RmsTNul4hkRO2Z0X3R2p6crw3-1K-0XIs Message-ID: Subject: [BUG] freevxfs: divide-by-zero in vxfs_bmap_ext4() causes kernel oops on mount To: hch@infradead.org Cc: linux-kernel@vger.kernel.org Content-Type: multipart/mixed; boundary="0000000000005b136e0657f9a9ce" --0000000000005b136e0657f9a9ce Content-Type: multipart/alternative; boundary="0000000000005b136e0657f9a9cc" --0000000000005b136e0657f9a9cc Content-Type: text/plain; charset="UTF-8" Subject: freevxfs: divide-by-zero in vxfs_bmap_ext4() causes kernel oops on mount To: Christoph Hellwig Cc: linux-kernel@vger.kernel.org Hi Christoph, I found a divide-by-zero in vxfs_bmap_ext4() (fs/freevxfs/vxfs_bmap.c). Mounting a crafted VxFS image triggers a kernel oops ("divide error") right at mount time -- no read or ioctl needed. A full repro (image, initramfs, QEMU script, logs) is here: https://drive.google.com/file/d/1UKsDOxX8aUHeG2AVsk2VIcTLobWAORl9/view?usp=sharing Summary of the bug: - File: fs/freevxfs/vxfs_bmap.c, vxfs_bmap_ext4() - Type: integer divide-by-zero -> kernel oops (DoS), local, needs CAP_SYS_ADMIN to mount a crafted image - Present since: Linux-2.6.12-rc2 (1da177e4c3f4); never fixed Two paths hit the divide-by-zero: 1. line 62: ve4_indsize == 0 -> denominator (indsize * indsize * bsize / 4) is 0. The existing guard (line 52) only rejects indsize > s_blocksize, so 0 gets through. 2. line 73: if block 0 isn't covered by the first direct extent (size == 0), bn stays 0 after the direct loop, and with indsize > 0 the expression (bn / indsize) % (indsize * bn) becomes 0 % 0. The recent freevxfs fix (704d48d81dc4) only touched vxfs_bmap_typed(), not vxfs_bmap_ext4(), so the bug is still present in mainline. Reproduced in QEMU on Ubuntu 7.0.0-28-generic: Oops: divide error: 0000 [#1] SMP NOPTI RIP: 0010:vxfs_bmap_ext4+0xfc/0x1c0 [freevxfs] RAX: 0000000000000000 RBX: 0000000000000000 RDX: 0000000000000000 Call Trace: vxfs_bmap_ext4+0xfc/0x1c0 [freevxfs] vxfs_bmap1+0x42/0x70 [freevxfs] vxfs_getblk+0x17/0x70 [freevxfs] block_read_full_folio+0x109/0x270 vxfs_read_folio+0x18/0x30 [freevxfs] vxfs_get_page+0x13/0x40 [freevxfs] __vxfs_iget+0x3a/0xd0 [freevxfs] vxfs_iget+0x5b/0x1a0 [freevxfs] vxfs_fill_super+0x159/0x340 [freevxfs] get_tree_bdev_flags+0x141/0x1e0 ... __x64_sys_mount+0x12b/0x160 The crash happens inside vxfs_fill_super(), i.e. during mount itself. Suggested fix (also in the Drive zip): diff --git a/fs/freevxfs/vxfs_bmap.c b/fs/freevxfs/vxfs_bmap.c --- a/fs/freevxfs/vxfs_bmap.c +++ b/fs/freevxfs/vxfs_bmap.c @@ -49,7 +49,7 @@ vxfs_bmap_ext4(struct inode *ip, long bn) unsigned long bsize = sb->s_blocksize; u32 indsize = fs32_to_cpu(sbi, vip->vii_ext4.ve4_indsize); int i; - if (indsize > sb->s_blocksize) + if (indsize == 0 || indsize > sb->s_blocksize) goto fail_size; for (i = 0; i < VXFS_NDADDR; i++) { @@ -62,7 +62,8 @@ vxfs_bmap_ext4(struct inode *ip, long bn) bn -= fs32_to_cpu(sbi, d->size); } - if ((bn / (indsize * indsize * bsize / 4)) == 0) { + if (bn == 0) + goto fail_buf; + if ((bn / (indsize * indsize * bsize / 4)) == 0) { struct buffer_head *buf; daddr_t bno; __fs32 *indir; Environment note about the repro: it was built and tested on a machine whose /boot already ships vmlinuz-7.0.0-28-generic (I did not build a kernel from source). The image targets the Ubuntu struct vxfs_sb layout (verified via module BTF: vs_bsize@32, vs_oltext[0]@368, vs_oltsize@376); mainline offsets differ (vs_bsize@24, vs_oltext[0]@356, vs_oltsize@364) and the PoC script documents both. The bug itself is in shared mainline code and is independent of these offsets. Thanks, canhnguyen26 (Nguyen Duc Canh) --0000000000005b136e0657f9a9cc Content-Type: text/html; charset="UTF-8" Content-Transfer-Encoding: quoted-printable
Subject: freevxfs: divide-by-zero in vxfs_bmap_ext4() caus= es kernel oops on mount

To: Christoph Hellwig <hch@infradead.org>
Cc: linux-kernel@vger.kernel.org

Hi Christo= ph,

I found a divide-by-zero in vxfs_bmap_ext4() (fs/freevxfs/vxfs_b= map.c).
Mounting a crafted VxFS image triggers a kernel oops ("divi= de error")
right at mount time -- no read or ioctl needed. A full r= epro (image,
initramfs, QEMU script, logs) is here:

https://drive.google.com/file/d/1UKsDOxX8aUHeG2AVsk2VIcTLobWAORl9/= view?usp=3Dsharing

Summary of the bug:

- File: fs/freevxf= s/vxfs_bmap.c, vxfs_bmap_ext4()
- Type: integer divide-by-zero -> ker= nel oops (DoS), local, needs
=C2=A0 CAP_SYS_ADMIN to mount a crafted ima= ge
- Present since: Linux-2.6.12-rc2 (1da177e4c3f4); never fixed

= Two paths hit the divide-by-zero:

1. line 62: ve4_indsize =3D=3D 0 -= > denominator (indsize * indsize * bsize / 4)
=C2=A0 =C2=A0is 0. The = existing guard (line 52) only rejects indsize > s_blocksize,
=C2=A0 = =C2=A0so 0 gets through.

2. line 73: if block 0 isn't covered by= the first direct extent (size =3D=3D 0),
=C2=A0 =C2=A0bn stays 0 after = the direct loop, and with indsize > 0 the expression
=C2=A0 =C2=A0(bn= / indsize) % (indsize * bn) becomes 0 % 0.

The recent freevxfs fix = (704d48d81dc4) only touched vxfs_bmap_typed(),
not vxfs_bmap_ext4(), so = the bug is still present in mainline.

Reproduced in QEMU on Ubuntu 7= .0.0-28-generic:

=C2=A0 Oops: divide error: 0000 [#1] SMP NOPTI
= =C2=A0 RIP: 0010:vxfs_bmap_ext4+0xfc/0x1c0 [freevxfs]
=C2=A0 RAX: 000000= 0000000000 RBX: 0000000000000000 RDX: 0000000000000000
=C2=A0 Call Trace= :
=C2=A0 =C2=A0 vxfs_bmap_ext4+0xfc/0x1c0 [freevxfs]
=C2=A0 =C2=A0 vx= fs_bmap1+0x42/0x70 [freevxfs]
=C2=A0 =C2=A0 vxfs_getblk+0x17/0x70 [freev= xfs]
=C2=A0 =C2=A0 block_read_full_folio+0x109/0x270
=C2=A0 =C2=A0 vx= fs_read_folio+0x18/0x30 [freevxfs]
=C2=A0 =C2=A0 vxfs_get_page+0x13/0x40= [freevxfs]
=C2=A0 =C2=A0 __vxfs_iget+0x3a/0xd0 [freevxfs]
=C2=A0 =C2= =A0 vxfs_iget+0x5b/0x1a0 [freevxfs]
=C2=A0 =C2=A0 vxfs_fill_super+0x159/= 0x340 [freevxfs]
=C2=A0 =C2=A0 get_tree_bdev_flags+0x141/0x1e0
=C2=A0= =C2=A0 ...
=C2=A0 =C2=A0 __x64_sys_mount+0x12b/0x160

The crash h= appens inside vxfs_fill_super(), i.e. during mount itself.

Suggested= fix (also in the Drive zip):

diff --git a/fs/freevxfs/vxfs_bmap.c b= /fs/freevxfs/vxfs_bmap.c
--- a/fs/freevxfs/vxfs_bmap.c
+++ b/fs/freev= xfs/vxfs_bmap.c
@@ -49,7 +49,7 @@ vxfs_bmap_ext4(struct inode *ip, long = bn)
=C2=A0 unsigned long bsize =3D sb->s_blocksize;
=C2=A0 u32 ind= size =3D fs32_to_cpu(sbi, vip->vii_ext4.ve4_indsize);
=C2=A0 int i;=C2=A0
- if (indsize > sb->s_blocksize)
+ if (indsize =3D=3D = 0 || indsize > sb->s_blocksize)
=C2=A0 goto fail_size;
=C2=A0<= br>=C2=A0 for (i =3D 0; i < VXFS_NDADDR; i++) {
@@ -62,7 +62,8 @@ vxf= s_bmap_ext4(struct inode *ip, long bn)
=C2=A0 bn -=3D fs32_to_cpu(sbi, = d->size);
=C2=A0 }
=C2=A0
- if ((bn / (indsize * indsize * bsiz= e / 4)) =3D=3D 0) {
+ if (bn =3D=3D 0)
+ goto fail_buf;
+ if ((bn= / (indsize * indsize * bsize / 4)) =3D=3D 0) {
=C2=A0 struct buffer_he= ad *buf;
=C2=A0 daddr_t bno;
=C2=A0 __fs32 *indir;

Environme= nt note about the repro: it was built and tested on a machine
whose /boo= t already ships vmlinuz-7.0.0-28-generic (I did not build a
kernel from = source). The image targets the Ubuntu struct vxfs_sb layout
(verified vi= a module BTF: vs_bsize@32, vs_oltext[0]@368, vs_oltsize@376);
mainline o= ffsets differ (vs_bsize@24, vs_oltext[0]@356, vs_oltsize@364)
and the Po= C script documents both. The bug itself is in shared mainline
code and i= s independent of these offsets.

Thanks,
canhnguyen26 (Nguyen Duc = Canh)=C2=A0
--0000000000005b136e0657f9a9cc-- --0000000000005b136e0657f9a9ce Content-Type: text/markdown; charset="UTF-8"; name="REPORT.md" Content-Disposition: attachment; filename="REPORT.md" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_msa7zzrv0 IyBmcmVldnhmczogZGl2aWRlLWJ5LXplcm8gaW4gYHZ4ZnNfYm1hcF9leHQ0KClgIOKAlCBrZXJu ZWwgb29wcyBvbiBtb3VudAoKKipDb21wb25lbnQ6KiogYGZzL2ZyZWV2eGZzL3Z4ZnNfYm1hcC5j YAoqKkltcGFjdDoqKiBMb2NhbCBkZW5pYWwgb2Ygc2VydmljZSAoa2VybmVsIG9vcHMgLyBgZGl2 aWRlIGVycm9yYCk7IHJlcHJvZHVjaWJsZSBieSBtb3VudGluZyBhIGNyYWZ0ZWQgVnhGUyBpbWFn ZS4gUmVxdWlyZXMgQ0FQX1NZU19BRE1JTi4KKipJbnRyb2R1Y2VkOioqIExpbnV4LTIuNi4xMi1y YzIgKGAxZGExNzdlNGMzZjRgKSwgbmV2ZXIgZml4ZWQuCioqQWZmZWN0ZWQga2VybmVsICh0ZXN0 ZWQpOioqIFVidW50dSBgNy4wLjAtMjgtZ2VuZXJpY2AgKHZtbGludXogZnJvbSBgL2Jvb3RgLCBi b290ZWQgaW4gUUVNVSkuIEJ1ZyBwcmVzZW50IGluIG1haW5saW5lIHVwIHRvIGF0IGxlYXN0IGB2 Ny4yLXJjNWAuCgojIyAxLiBTdW1tYXJ5Cgpgdnhmc19ibWFwX2V4dDQoKWAgcGVyZm9ybXMgaW50 ZWdlciBkaXZpc2lvbnMgd2hvc2UgZGl2aXNvciBpcyBmdWxseQpjb250cm9sbGVkIGJ5IGF0dGFj a2VyLXN1cHBsaWVkIG9uLWRpc2sgaW5vZGUgZmllbGRzIGFuZCBkb2VzIG5vdCBndWFyZAphZ2Fp bnN0IHplcm86CgotIExpbmUgNjIgZGl2aWRlcyBgYm5gIGJ5IGBpbmRzaXplICogaW5kc2l6ZSAq IGJzaXplIC8gNGAuCi0gTGluZSA3MyBldmFsdWF0ZXMgYChibiAvIGluZHNpemUpICUgKGluZHNp emUgKiBibilgLgoKVHdvIGluZGVwZW5kZW50IHBhdGhzIHlpZWxkIGEgZGl2aXNvciBvZiB6ZXJv LCByYWlzaW5nIGAjREVgIGluIHRoZSBrZXJuZWw6Cgp8IFBhdGggfCBUcmlnZ2VyIHwgRmF1bHRp bmcgZXhwcmVzc2lvbiB8CnwtLS0tLS18LS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tLXwK fCBBICAgIHwgYHZlNF9pbmRzaXplID09IDBgIHwgYGJuIC8gKDAgKiAwICogYnNpemUgLyA0KWAg 4oaSIGBibiAvIDBgIHwKfCBCICAgIHwgYGJuID09IDBgIChibG9jayAwIG5vdCBjb3ZlcmVkIGJ5 IGEgZGlyZWN0IGV4dGVudCkgd2l0aCBgaW5kc2l6ZSA+IDBgIHwgYCgwIC8gaW5kc2l6ZSkgJSAo aW5kc2l6ZSAqIDApYCDihpIgYDAgJSAwYCB8CgpUaGUgb25seSBndWFyZCBpcyBhdCBsaW5lIDUy LCB3aGljaCByZWplY3RzIGBpbmRzaXplID4gc19ibG9ja3NpemVgIGJ1dAphbGxvd3MgYGluZHNp emUgPT0gMGAuCgojIyAyLiBWdWxuZXJhYmxlIGNvZGUgKG1haW5saW5lIEAgYDAyZGM2OTlmODNk MGApCgotIEZ1bmN0aW9uOiBbZnMvZnJlZXZ4ZnMvdnhmc19ibWFwLmMjTDQyLUw4Nl0oaHR0cHM6 Ly9naXRodWIuY29tL3RvcnZhbGRzL2xpbnV4L2Jsb2IvMDJkYzY5OWY4M2QwNDA2OWZkYWJjOTk2 ZmMyMmQ0N2NkYTQ3YTRhOS9mcy9mcmVldnhmcy92eGZzX2JtYXAuYyNMNDItTDg2KQotIEd1YXJk ICh0b28gd2Vhayk6IFtMNTJdKGh0dHBzOi8vZ2l0aHViLmNvbS90b3J2YWxkcy9saW51eC9ibG9i LzAyZGM2OTlmODNkMDQwNjlmZGFiYzk5NmZjMjJkNDdjZGE0N2E0YTkvZnMvZnJlZXZ4ZnMvdnhm c19ibWFwLmMjTDUyKQotIERpcmVjdC1leHRlbnQgbG9vcCAoY2FuIGxlYXZlIGBibmAgdW5jaGFu Z2VkKTogW0w1NS1MNjBdKGh0dHBzOi8vZ2l0aHViLmNvbS90b3J2YWxkcy9saW51eC9ibG9iLzAy ZGM2OTlmODNkMDQwNjlmZGFiYzk5NmZjMjJkNDdjZGE0N2E0YTkvZnMvZnJlZXZ4ZnMvdnhmc19i bWFwLmMjTDU1LUw2MCkKLSBEaXYtYnktemVybyAjMTogW0w2Ml0oaHR0cHM6Ly9naXRodWIuY29t L3RvcnZhbGRzL2xpbnV4L2Jsb2IvMDJkYzY5OWY4M2QwNDA2OWZkYWJjOTk2ZmMyMmQ0N2NkYTQ3 YTRhOS9mcy9mcmVldnhmcy92eGZzX2JtYXAuYyNMNjIpCi0gRGl2LWJ5LXplcm8gIzI6IFtMNzNd KGh0dHBzOi8vZ2l0aHViLmNvbS90b3J2YWxkcy9saW51eC9ibG9iLzAyZGM2OTlmODNkMDQwNjlm ZGFiYzk5NmZjMjJkNDdjZGE0N2E0YTkvZnMvZnJlZXZ4ZnMvdnhmc19ibWFwLmMjTDczKQoKYGBg YwpzdGF0aWMgZGFkZHJfdAp2eGZzX2JtYXBfZXh0NChzdHJ1Y3QgaW5vZGUgKmlwLCBsb25nIGJu KQp7CgkuLi4KCXUzMiBpbmRzaXplID0gZnMzMl90b19jcHUoc2JpLCB2aXAtPnZpaV9leHQ0LnZl NF9pbmRzaXplKTsgICAvKiBMNDk6IGRpc2stY29udHJvbGxlZCAqLwoJLi4uCglpZiAoaW5kc2l6 ZSA+IHNiLT5zX2Jsb2Nrc2l6ZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTDUy OiBvbmx5IHJlamVjdHMgInRvbyBiaWciICovCgkJZ290byBmYWlsX3NpemU7CgoJZm9yIChpID0g MDsgaSA8IFZYRlNfTkRBRERSOyBpKyspIHsgICAgICAgICAgICAgICAgICAgICAgICAgLyogTDU1 LTYwICovCgkJc3RydWN0IGRpcmVjdCAqZCA9IHZpcC0+dmlpX2V4dDQudmU0X2RpcmVjdCArIGk7 CgkJaWYgKGJuID49IDAgJiYgYm4gPCBmczMyX3RvX2NwdShzYmksIGQtPnNpemUpKQoJCQlyZXR1 cm4gKGJuICsgZnMzMl90b19jcHUoc2JpLCBkLT5leHRlbnQpKTsKCQlibiAtPSBmczMyX3RvX2Nw dShzYmksIGQtPnNpemUpOwoJfQoKCWlmICgoYm4gLyAoaW5kc2l6ZSAqIGluZHNpemUgKiBic2l6 ZSAvIDQpKSA9PSAwKSB7ICAgICAgICAgIC8qIEw2MjogRElWLTAgIzEgKi8KCQkuLi4KCQlibm8g PSBmczMyX3RvX2NwdShzYmksIGluZGlyWyhibiAvIGluZHNpemUpICUgKGluZHNpemUgKiBibild KSArIC8qIEw3MzogRElWLTAgIzIgKi8KCQkJKGJuICUgaW5kc2l6ZSk7CgkJLi4uCmBgYAoKIyMj IFBhdGggQSDigJQgYHZlNF9pbmRzaXplID09IDBgCgpgdmU0X2luZHNpemVgIGlzIGNvcGllZCB2 ZXJiYXRpbSBmcm9tIHRoZSBvbi1kaXNrIGlub2RlIGluCltkaXAydmlwX2NweSgpXShodHRwczov L2dpdGh1Yi5jb20vdG9ydmFsZHMvbGludXgvYmxvYi8wMmRjNjk5ZjgzZDA0MDY5ZmRhYmM5OTZm YzIyZDQ3Y2RhNDdhNGE5L2ZzL2ZyZWV2eGZzL3Z4ZnNfaW5vZGUuYyNMNzYtTDExNikKKGB2ZGlf ZXh0NC52ZTRfaW5kc2l6ZWAsIG9mZnNldCA4NCBpbiB0aGUgaW5vZGUpLiBXaXRoIGBpbmRzaXpl ID09IDBgIHRoZQpkZW5vbWluYXRvciBgMCAqIDAgKiBic2l6ZSAvIDQgPT0gMGAsIHNvIGBibiAv IDBgIGZhdWx0cyBmb3IgYW55IGBibmAKdGhhdCBlc2NhcGVzIHRoZSBkaXJlY3QgbG9vcCAoZS5n LiBhbGwgYHZlNF9kaXJlY3RbXS5zaXplID09IDBgKS4KCiMjIyBQYXRoIEIg4oCUIGBibiA9PSAw YCB3aXRoIGBpbmRzaXplID4gMGAKCklmIGJsb2NrIDAgaXMgbm90IGNvdmVyZWQgYnkgYHZlNF9k aXJlY3RbMF1gIChpdHMgYHNpemVgIGZpZWxkIGlzIDApLCB0aGUKbG9vcCBhdCBMNTUtNjAgbGVh dmVzIGBibiA9PSAwYC4gVGhlbiBgMCAvIHBvc2l0aXZlID09IDBgIGVudGVycyB0aGUgYGlmYApi bG9jayBhbmQgbGluZSA3MyBjb21wdXRlcyBgKDAgLyBpbmRzaXplKSAlICgwKWAgPSBgMCAlIDBg LgoKIyMgMy4gUm9vdCBjYXVzZQoKYHZ4ZnNfYm1hcF9leHQ0KClgIHdhcyBhZGRlZCBpbiBbMWRh MTc3ZTRjM2Y0ICgiTGludXgtMi42LjEyLXJjMiIpXShodHRwczovL2dpdGh1Yi5jb20vdG9ydmFs ZHMvbGludXgvY29tbWl0LzFkYTE3N2U0YzNmNDE1ZjI4YWQyZTEyOTg5NzRmZjFjN2E3YzkyODAp CmFuZCBuZXZlciBhdWRpdGVkIGZvciB6ZXJvIGRpdmlzb3JzOgoKLSBbZ2l0IGJsYW1lIG9mIEw2 Ml0oaHR0cHM6Ly9naXRodWIuY29tL3RvcnZhbGRzL2xpbnV4L2JsYW1lLzAyZGM2OTlmODNkMDQw NjlmZGFiYzk5NmZjMjJkNDdjZGE0N2E0YTkvZnMvZnJlZXZ4ZnMvdnhmc19ibWFwLmMjTDYyKSDi gJQgdW5jaGFuZ2VkIHNpbmNlIDIwMDUuCi0gW2dpdCBibGFtZSBvZiBMNzNdKGh0dHBzOi8vZ2l0 aHViLmNvbS90b3J2YWxkcy9saW51eC9ibGFtZS8wMmRjNjk5ZjgzZDA0MDY5ZmRhYmM5OTZmYzIy ZDQ3Y2RhNDdhNGE5L2ZzL2ZyZWV2eGZzL3Z4ZnNfYm1hcC5jI0w3Mykg4oCUIG9ubHkgZW5kaWFu LXN3YXAgY2h1cm4gKGAwZDgzZjdmYzgzZjdgKSBzaW5jZS4KClRoZSBKdW5lIDIwMjYgZml4IGJ5 IEZhcmhhZCBBbGVtaQooWzcwNGQ0OGQ4MWRjNCAiZnJlZXZ4ZnM6IGRvbid0IEJVRygpIG9uIHVu a25vd24gdHlwZWQtZXh0ZW50IHR5cGUiXShodHRwczovL2dpdGh1Yi5jb20vdG9ydmFsZHMvbGlu dXgvY29tbWl0LzcwNGQ0OGQ4MWRjNDE0NzBlMTA4ODExYzMyYzU3N2FkYTY2MTkyZDQpKQpvbmx5 IHRvdWNoZWQgYHZ4ZnNfYm1hcF90eXBlZCgpYCAoZGVmYXVsdCBjYXNlKTsgYHZ4ZnNfYm1hcF9l eHQ0KClgIHdhcwpub3QgYWRkcmVzc2VkLiBUaGUgYnVnIGlzIHRoZXJlZm9yZSBzdGlsbCBwcmVz ZW50IGluIG1haW5saW5lLgoKIyMgNC4gUmVwcm9kdWNlcgoKQSBjb21wbGV0ZSwgc2VsZi1jb250 YWluZWQgcmVwcm8gZW52aXJvbm1lbnQgbGl2ZXMgaW4gdGhpcyBmb2xkZXI6CgpgYGAKcmVwcm8v dnhmcy1ibWFwLWV4dDQtZGl2MC8K4pSc4pSA4pSAIGJ1aWxkX2luaXRyYW1mcy5zaCAgICAgICAg ICAjIGJ1aWxkcyBxZW11L2luaXRyYW1mcy5pbWcuZ3ogKGJ1c3lib3ggKyBtb2R1bGUgKyBQb0Mg aW1hZ2UpCuKUnOKUgOKUgCBydW4uc2ggICAgICAgICAgICAgICAgICAgICAgIyBib290cyBrZXJu ZWwgaW4gUUVNVSBhbmQgdHJpZ2dlcnMgdGhlIGJ1ZwrilJzilIDilIAgcG9jLwrilIIgICDilJzi lIDilIAgbWFrZV92eGZzX3BvYy5weSAgICAgICAgIyBjcmFmdHMgdGhlIG1hbGljaW91cyBWeEZT IGltYWdlCuKUgiAgIOKUlOKUgOKUgCB2eGZzX3BvYy5pbWcgICAgICAgICAgICAjIHByZS1idWls dCBpbWFnZSAoMTYgS0IsIDEwMjQtYnl0ZSBibG9ja3MpCuKUnOKUgOKUgCBpbml0cmFtZnMvCuKU giAgIOKUnOKUgOKUgCBpbml0ICAgICAgICAgICAgICAgICAgICAjIGluaXQgc2NyaXB0IChpbnNt b2QgKyBtb3VudCkK4pSCICAg4pSU4pSA4pSAIGZyZWV2eGZzLmtvICAgICAgICAgICAgICMgbW9k dWxlIGZyb20gVWJ1bnR1IDcuMC4wLTI4LWdlbmVyaWMK4pSc4pSA4pSAIHFlbXUvaW5pdHJhbWZz LmltZy5neiAgICAgICAjIChnZW5lcmF0ZWQpCuKUnOKUgOKUgCBsb2dzLwrilIIgICDilJzilIDi lIAgYm9vdF9jb25zb2xlLmxvZyAgICAgICAgIyBmdWxsIGJvb3QgKyBvb3BzIGNvbnNvbGUgY2Fw dHVyZQrilIIgICDilJTilIDilIAgb29wc19ob3N0XzcuMC4wLTI4LnR4dCAgIyBleHRyYWN0ZWQg b29wcwrilJTilIDilIAgcGF0Y2hlcy9mcmVldnhmcy1maXgtZGl2aWRlLWJ5LXplcm8ucGF0Y2gK YGBgCgojIyMgSG93IHRoZSBpbWFnZSB0cmlnZ2VycyB0aGUgYnVnCgpgbWFrZV92eGZzX3BvYy5w eWAgYnVpbGRzIGEgbWluaW1hbCBWeEZTIGZpbGVzeXN0ZW06CgotIFN1cGVyYmxvY2sgQGJsazEg d2l0aCB2YWxpZCBtYWdpYyBgMHhhNTAxRkNGNWAsIGB2c19ic2l6ZSA9IDEwMjRgLAogIE9MVCBw b2ludGVyIGFuZCBPTFQgc2l6ZSDigJQgZW5vdWdoIGZvciBgdnhmc19maWxsX3N1cGVyKClgIHRv IHByb2NlZWQKICAoW3Z4ZnNfc3VwZXIuYyNMMjI4LUwyNjJdKGh0dHBzOi8vZ2l0aHViLmNvbS90 b3J2YWxkcy9saW51eC9ibG9iLzAyZGM2OTlmODNkMDQwNjlmZGFiYzk5NmZjMjJkNDdjZGE0N2E0 YTkvZnMvZnJlZXZ4ZnMvdnhmc19zdXBlci5jI0wyMjgtTDI2MikpLgotIE9MVCBAYmxrMiB3aXRo IEZTSEVBRCArIElMSVNUIGVudHJpZXMuCi0gSW5vZGUgbGlzdCBAYmxrMzsgc3RydWN0dXJhbCBG U0ggQGJsazY7IHByaW1hcnkgRlNIIEBibGs3OyBTVElMSVNUIEBibGs4OwogIGlsaXN0IEBibGs5 IGNvbnRhaW5pbmcgdGhlIHJvb3QgaW5vZGUgKGlubyAyKS4KLSBSb290IGlub2RlIChpbm8gMik6 IGB2ZGlfb3JndHlwZSA9IFZYRlNfT1JHX0VYVDQgKDEpYCwKICBgdmU0X2luZHNpemUgPSAwYCwg YWxsIGB2ZTRfZGlyZWN0W10uc2l6ZSA9IDBgLCBgdmRpX3NpemUgPiAwYCwKICBtb2RlIGBTX0lG RElSIHwgMHgxZmZgIOKAlCB0aGlzIGlzICoqUGF0aCBBKiouCgpEdXJpbmcgbW91bnQsIGB2eGZz X2ZpbGxfc3VwZXIoKWAgY2FsbHMgYF9fdnhmc19pZ2V0KClgIG9uIHRoZSByb290IGlub2RlLAp3 aGljaCByZWFkcyBpbm9kZSBtZXRhZGF0YSB0aHJvdWdoIGB2eGZzX2dldF9wYWdlKClgIOKGkiBg dnhmc19yZWFkX2ZvbGlvKClgCuKGkiBgYmxvY2tfcmVhZF9mdWxsX2ZvbGlvKClgIOKGkiBgdnhm c19nZXRibGsoKWAg4oaSIGB2eGZzX2JtYXAxKClgIOKGkgpgdnhmc19ibWFwX2V4dDQoKWAg4oaS ICoqI0RFKiouCgojIyMgU3RlcHMgdG8gcmVwcm9kdWNlCgpgYGBiYXNoCiMgMC4gcHJlcmVxdWlz aXRlcyAoaG9zdCkKc3VkbyBhcHQgaW5zdGFsbCBxZW11LXN5c3RlbS14ODYgYnVzeWJveC1zdGF0 aWMgY3BpbyBnemlwICAgIyBhbHJlYWR5IGluc3RhbGxlZCBvbiB0aGUgZGV2IGJveAoKIyAxLiAo cmUpYnVpbGQgdGhlIGluaXRyYW1mcwouL2J1aWxkX2luaXRyYW1mcy5zaAoKIyAyLiBydW4gUUVN VSB1c2luZyB0aGUgaG9zdCBrZXJuZWwgaW1hZ2UKc3VkbyBiYXNoIHJ1bi5zaCAvYm9vdC92bWxp bnV6LSQodW5hbWUgLXIpICAgICAjIG9yOiBzdWRvIFZNTElOVVo9L3RtcC92bWxpbnV6LWhvc3Qg YmFzaCBydW4uc2gKCiMgMy4gZXhwZWN0ZWQgb3V0cHV0IChncmVwIG9mIHJ1bl9jb25zb2xlLmxv ZykKIyAgICBPb3BzOiBkaXZpZGUgZXJyb3I6IDAwMDAgWyMxXSBTTVAgTk9QVEkKIyAgICBSSVA6 IDAwMTA6dnhmc19ibWFwX2V4dDQrMHhmYy8weDFjMCBbZnJlZXZ4ZnNdCmBgYAoKIyMjIEVudmly b25tZW50IGxpbWl0YXRpb25zIChpbXBvcnRhbnQpCgpUaGUgUG9DIHdhcyBkZXZlbG9wZWQgYW5k IHZlcmlmaWVkIG9uIGEgKipzaW5nbGUgVWJ1bnR1IDI0LjA0IG1hY2hpbmUqKgp3aG9zZSBib290 IGxvYWRlciBhbHJlYWR5IHNoaXBzIGAvYm9vdC92bWxpbnV6LTcuMC4wLTI4LWdlbmVyaWNgLiBX ZSBkaWQKKipub3QqKiBidWlsZCBhIGtlcm5lbCBmcm9tIHNvdXJjZSwgc28gcmVwcm9kdWNpYmls aXR5IGRlcGVuZHMgb246CgoxLiAqKktlcm5lbCBpbWFnZSoqIOKAlCBgcnVuLnNoYCBib290cyB0 aGUgbWFjaGluZSdzIG93bgogICBgL2Jvb3Qvdm1saW51ei0kKHVuYW1lIC1yKWAgKGZhbGxiYWNr OiBleHBsaWNpdCBwYXRoKS4gVmVyaWZpZWQgcnVuOgogICBgNy4wLjAtMjgtZ2VuZXJpY2AuCjIu ICoqTW9kdWxlIHZlcnNpb24gbWF0Y2gqKiDigJQgYGluaXRyYW1mcy9mcmVldnhmcy5rb2Agd2Fz IGV4dHJhY3RlZCBmcm9tCiAgIHRoZSA3LjAuMC0yOC1nZW5lcmljIG1vZHVsZSBzZXQgKGAvbGli L21vZHVsZXMvNy4wLjAtMjgtZ2VuZXJpYy8uLi4vZnJlZXZ4ZnMua28uenN0YCkKICAgYW5kIGlz IGBpbnNtb2RgLWVkIGluc2lkZSB0aGUgaW5pdHJhbWZzLiBgaW5zbW9kYCByZXF1aXJlcyB2ZXJt YWdpYyB0bwogICBtYXRjaCB0aGUgYm9vdGVkIGtlcm5lbC4gRm9yIGFub3RoZXIga2VybmVsLCBy ZXBsYWNlIHRoZSBtb2R1bGUgd2l0aAogICB0aGF0IGtlcm5lbCdzIGZyZWV2eGZzLmtvIChvciBi dWlsZCBpdDogYG1ha2UgTT1mcy9mcmVldnhmc2AgYWZ0ZXIKICAgYnVpbGRpbmcgdGhhdCBrZXJu ZWwpLgozLiAqKk9uLWRpc2sgc3RydWN0IGxheW91dCoqIOKAlCBgcG9jL3Z4ZnNfcG9jLmltZ2Ag dGFyZ2V0cyB0aGUgKlVidW50dSoKICAgYHN0cnVjdCB2eGZzX3NiYCAodmVyaWZpZWQgdmlhIG1v ZHVsZSBCVEY6IGB2c19ic2l6ZUAzMmAsCiAgIGB2c19vbHRleHRbMF1AMzY4YCwgYHZzX29sdHNp emVAMzc2YCkuIE1haW5saW5lIG9mZnNldHMgZGlmZmVyCiAgIChgdnNfYnNpemVAMjRgLCBgdnNf b2x0ZXh0WzBdQDM1NmAsIGB2c19vbHRzaXplQDM2NGApOyB0aGUgUG9DIHNjcmlwdAogICBkb2N1 bWVudHMgYm90aCBzZXRzIGFuZCBjYW4gYmUgZmxpcHBlZCBmb3IgbWFpbmxpbmUuCjQuICoqUm9v dCAvIENBUF9TWVNfQURNSU4qKiBpcyByZXF1aXJlZCB0byBtb3VudCBhIGNyYWZ0ZWQgZmlsZXN5 c3RlbS4KClRoZSBkaXZpZGUtYnktemVybyBpbiBgdnhmc19ibWFwX2V4dDQoKWAgaXRzZWxmIChz aGFyZWQgbWFpbmxpbmUgY29kZSwKYHZ4ZnNfYm1hcC5jOjYyYC9gOjczYCkgaXMgaW5kZXBlbmRl bnQgb2YgdGhlc2Ugb2Zmc2V0cyAtLSBvbmx5IHRoZQp0cmlnZ2VyaW5nIGltYWdlIGlzIGxheW91 dC1zcGVjaWZpYy4KCiMjIDUuIE9ic2VydmVkIGNyYXNoICh0ZXN0ZWQgb24gVWJ1bnR1IDcuMC4w LTI4LWdlbmVyaWMpCgpGdWxsIGNvbnNvbGUgY2FwdHVyZTogW2Bsb2dzL2Jvb3RfY29uc29sZS5s b2dgXShsb2dzL2Jvb3RfY29uc29sZS5sb2cpCkV4dHJhY3RlZCBvb3BzOiBbYGxvZ3Mvb29wc19o b3N0XzcuMC4wLTI4LnR4dGBdKGxvZ3Mvb29wc19ob3N0XzcuMC4wLTI4LnR4dCkKCmBgYApPb3Bz OiBkaXZpZGUgZXJyb3I6IDAwMDAgWyMxXSBTTVAgTk9QVEkKUklQOiAwMDEwOnZ4ZnNfYm1hcF9l eHQ0KzB4ZmMvMHgxYzAgW2ZyZWV2eGZzXQpSQVg6IDAwMDAwMDAwMDAwMDAwMDAgUkJYOiAwMDAw MDAwMDAwMDAwMDAwIFJDWDogMDAwMDAwMDAwMDAwMDAwMApSRFg6IDAwMDAwMDAwMDAwMDAwMDAg ICAgICAgIDwtLSBkaXZpc29yID09IDAKQ2FsbCBUcmFjZToKICB2eGZzX2JtYXBfZXh0NCsweGZj LzB4MWMwIFtmcmVldnhmc10KICB2eGZzX2JtYXAxKzB4NDIvMHg3MCBbZnJlZXZ4ZnNdCiAgdnhm c19nZXRibGsrMHgxNy8weDcwIFtmcmVldnhmc10KICBibG9ja19yZWFkX2Z1bGxfZm9saW8rMHgx MDkvMHgyNzAKICB2eGZzX3JlYWRfZm9saW8rMHgxOC8weDMwIFtmcmVldnhmc10KICB2eGZzX2dl dF9wYWdlKzB4MTMvMHg0MCBbZnJlZXZ4ZnNdCiAgX192eGZzX2lnZXQrMHgzYS8weGQwIFtmcmVl dnhmc10KICB2eGZzX2lnZXQrMHg1Yi8weDFhMCBbZnJlZXZ4ZnNdCiAgdnhmc19maWxsX3N1cGVy KzB4MTU5LzB4MzQwIFtmcmVldnhmc10KICBnZXRfdHJlZV9iZGV2X2ZsYWdzKzB4MTQxLzB4MWUw CiAgZ2V0X3RyZWVfYmRldisweDEwLzB4MjAKICB2eGZzX2dldF90cmVlKzB4MTUvMHgyMCBbZnJl ZXZ4ZnNdCiAgdmZzX2dldF90cmVlKzB4MmEvMHgxMDAKICBmY19tb3VudCsweDE0LzB4YTAKICBk b19uZXdfbW91bnQrMHgxYmIvMHgzNzAKICBwYXRoX21vdW50KzB4MWUwLzB4NmYwCiAgX194NjRf c3lzX21vdW50KzB4MTJiLzB4MTYwCiAgLi4uCmBgYAoKS2V5IG9ic2VydmF0aW9uczoKCi0gRmF1 bHRpbmcgaW5zdHJ1Y3Rpb24gaXMgdGhlIHNlY29uZCBgZGl2YCBpbiBgdnhmc19ibWFwX2V4dDRg CiAgKGJ5dGVzIGA0OCA5OSA0OSBmNyBmYyAuLi4gPDQ5IGY3IGZjPmAg4oCUIHNlZSB0aGUgYENv ZGU6YCBsaW5lIGluIHRoZSBsb2cpLAogIG1hdGNoaW5nIGxpbmUgNzMgKGAwICUgMGApLgotIEFs bCB0aHJlZSByZWdpc3RlcnMgaW52b2x2ZWQgKGBSQVhgLCBgUkJYYCwgYFJEWGApIGFyZSB6ZXJv LgotIFRoZSBjcmFzaCBoYXBwZW5zICoqaW5zaWRlIGB2eGZzX2ZpbGxfc3VwZXIoKWAsIGkuZS4g YXQgYG1vdW50YCB0aW1lKiog4oCUCiAgbm8gYGxzYC9gcmVhZGAvYEZJQk1BUGAgbmVlZGVkLiBU aGlzIG1ha2VzIHRoZSBidWcgdHJpdmlhbGx5IHJlYWNoYWJsZToKICBhbnkgdXNlciBhbGxvd2Vk IHRvIG1vdW50IGEgY3JhZnRlZCBWeEZTIGltYWdlIChyb290IG9yIENBUF9TWVNfQURNSU4pCiAg Y3Jhc2hlcyB0aGUga2VybmVsLgoKIyMgNi4gUHJvcG9zZWQgZml4CgpQYXRjaDogW2BwYXRjaGVz L2ZyZWV2eGZzLWZpeC1kaXZpZGUtYnktemVyby5wYXRjaGBdKHBhdGNoZXMvZnJlZXZ4ZnMtZml4 LWRpdmlkZS1ieS16ZXJvLnBhdGNoKQoKYGBgYwotCWlmIChpbmRzaXplID4gc2ItPnNfYmxvY2tz aXplKQorCWlmIChpbmRzaXplID09IDAgfHwgaW5kc2l6ZSA+IHNiLT5zX2Jsb2Nrc2l6ZSkKIAkJ Z290byBmYWlsX3NpemU7Ci4uLgotCWlmICgoYm4gLyAoaW5kc2l6ZSAqIGluZHNpemUgKiBic2l6 ZSAvIDQpKSA9PSAwKSB7CisJaWYgKGJuID09IDApCisJCWdvdG8gZmFpbF9idWY7CisJaWYgKChi biAvIChpbmRzaXplICogaW5kc2l6ZSAqIGJzaXplIC8gNCkpID09IDApIHsKYGBgCgotIGBpbmRz aXplID09IDBgIGNsb3NlcyAqKlBhdGggQSoqLgotIGBibiA9PSAwYCAoYWZ0ZXIgdGhlIGRpcmVj dCBsb29wKSBjbG9zZXMgKipQYXRoIEIqKjogZm9yIGEgdmFsaWQgRVhUNAogIGlub2RlLCBibG9j ayAwIG11c3QgYWx3YXlzIGJlIGNvdmVyZWQgYnkgdGhlIGZpcnN0IGRpcmVjdCBleHRlbnQsIHNv CiAgcmVhY2hpbmcgbGluZSA2MiB3aXRoIGBibiA9PSAwYCBvbmx5IGhhcHBlbnMgZm9yIGNvcnJ1 cHRlZCBpbWFnZXMg4oCUCiAgYmFpbGluZyBvdXQgd2l0aCBgZmFpbF9idWZgIChyZXR1cm5zIDAp IGlzIHNhZmUuCgojIyA3LiBOb3RlcyAvIGZvbGxvdy11cHMKCi0gVGhlIGluZGV4IGV4cHJlc3Np b24gYChibiAvIGluZHNpemUpICUgKGluZHNpemUgKiBibilgIGl0c2VsZiBpcyBhbHNvCiAgc3Vz cGljaW91cyAoaXQgY2FuIGluZGV4IHBhc3QgYGJ1Zi0+Yl9kYXRhYCBmb3IgbGFyZ2UgYGJuYCkg YnV0IHRoYXQgaXMKICBvdXRzaWRlIHRoZSBzY29wZSBvZiB0aGlzIHJlcG9ydC4KLSBBbiBvbGRl ciwgd2Vha2VyIHJlcHJvIHBhdGggKG1vdW50IHN1Y2NlZWRzLCB0aGVuIGBsc2AvYEZJQk1BUGAg dHJpZ2dlcnMKICB0aGUgYnVnKSBpcyBkb2N1bWVudGVkIGluIHRoZSBhbmFseXNpcyBub3Rlczsg dGhlIGN1cnJlbnQgUG9DIHRyaWdnZXJzIGF0CiAgbW91bnQgdGltZSwgd2hpY2ggaXMgc3Ryb25n ZXIuCi0gT24gbWFpbmxpbmUgdGhlIHN0cnVjdCBvZmZzZXRzIGFyZSBgdnNfYnNpemVAMjRgLCBg dnNfb2x0ZXh0WzBdQDM1NmAsCiAgYHZzX29sdHNpemVAMzY0YCAoW3Z4ZnMuaCNMNDQtTDEzMl0o aHR0cHM6Ly9naXRodWIuY29tL3RvcnZhbGRzL2xpbnV4L2Jsb2IvMDJkYzY5OWY4M2QwNDA2OWZk YWJjOTk2ZmMyMmQ0N2NkYTQ3YTRhOS9mcy9mcmVldnhmcy92eGZzLmgjTDQ0LUwxMzIpKS4KICBV YnVudHUncyBgNy4wLjAtMjhgIGtlcm5lbCBpbnNlcnRzIGBfX3VudXNlZDEvX191bnVzZWQyL19f dW51c2VkM2AKICAodmVyaWZpZWQgdmlhIG1vZHVsZSBCVEYpLCBzaGlmdGluZyBvZmZzZXRzIHRv IGB2c19ic2l6ZUAzMmAsCiAgYHZzX29sdGV4dFswXUAzNjhgLCBgdnNfb2x0c2l6ZUAzNzZgOyB0 aGUgYnVuZGxlZCBQb0MgYWxyZWFkeSB1c2VzIHRoZQogIFVidW50dSBsYXlvdXQgc2luY2UgaXQg d2FzIHRlc3RlZCB0aGVyZS4gYG1ha2Vfdnhmc19wb2MucHlgIG5vdGVzIGJvdGguCgojIyA4LiBE aXNjbG9zdXJlIHRpbWVsaW5lCgotIDIwMjYtMDgtMDE6IGJ1ZyBpZGVudGlmaWVkOyBjcmFmdGVk IFBvQyBpbWFnZTsgcmVwcm9kdWNlZCBvb3BzIGluIFFFTVUgb24KICBVYnVudHUgNy4wLjAtMjgt Z2VuZXJpYy4KLSAyMDI2LTA4LTAxOiByZXBvcnQgKyBwYXRjaCBwcmVwYXJlZC4gUGVuZGluZyBk aXNjbG9zdXJlIGRlY2lzaW9uLgoKLS0tCgoqKlJlcG9ydGVyOioqIGNhbmhuZ3V5ZW4yNiAoTmd1 eWVuIER1YyBDYW5oKSA8MDIwNmNhbmhAZ21haWwuY29tPgoqKkNvbXBvbmVudCBtYWludGFpbmVy OioqIENocmlzdG9waCBIZWxsd2lnIDxoY2hAaW5mcmFkZWFkLm9yZz4KKipEcmFmdCBzdWJtaXNz aW9uIGVtYWlsOioqIFtgcGF0Y2hlcy9lbWFpbC1kcmFmdC50eHRgXShwYXRjaGVzL2VtYWlsLWRy YWZ0LnR4dCkKCg== --0000000000005b136e0657f9a9ce--