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 X-Spam-Level: X-Spam-Status: No, score=-0.3 required=3.0 tests=DKIM_ADSP_CUSTOM_MED, DKIM_INVALID,DKIM_SIGNED,FREEMAIL_FORGED_FROMDOMAIN,FREEMAIL_FROM, HEADER_FROM_DIFFERENT_DOMAINS,MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS autolearn=no autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 64136C33CB1 for ; Tue, 14 Jan 2020 14:42:41 +0000 (UTC) Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 1DB142467D for ; Tue, 14 Jan 2020 14:42:41 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=fail reason="signature verification failed" (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="SlKgBPWb" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 1DB142467D Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=gmail.com Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=qemu-devel-bounces+qemu-devel=archiver.kernel.org@nongnu.org Received: from localhost ([::1]:41030 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1irNOy-0001UR-9Y for qemu-devel@archiver.kernel.org; Tue, 14 Jan 2020 09:42:40 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]:33042) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1irNOL-00010h-Cq for qemu-devel@nongnu.org; Tue, 14 Jan 2020 09:42:03 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1irNOJ-00034K-HT for qemu-devel@nongnu.org; Tue, 14 Jan 2020 09:42:01 -0500 Received: from mail-lj1-x242.google.com ([2a00:1450:4864:20::242]:41845) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1irNOJ-00034C-7G for qemu-devel@nongnu.org; Tue, 14 Jan 2020 09:41:59 -0500 Received: by mail-lj1-x242.google.com with SMTP id h23so14627645ljc.8 for ; Tue, 14 Jan 2020 06:41:59 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=mime-version:references:in-reply-to:from:date:message-id:subject:to :cc:content-transfer-encoding; bh=KScogeDftmvqWYIkPyyiPLur8lC1L/rXWGn83bgxhNc=; b=SlKgBPWbPrrlTrsa5/1lSY7DUL3Lbqw9Zen97OZDuZeXiF7rZMySocuw++DXkmt7U7 fpFxhOiRO06nYoNIQ5GfpmcspAVOyDeYinNPKYj8e957EaCl2frLbUjWGNqGYMPVZZfN WuHcga+2V9h0TYWINSPOCdF7eWntQeoN4KwRj02eo+N06j5E0oMxMiUZoBbjA67NiEL5 M/tjE09cl7mTThw5NLVVlvUheebRvR1Dm2kkWb3tYgdaq2w2/gqDU0FZ0TLDQCPDU5Mk 1/9OcpHVytpW1qEHxnSs+o4Ww6sTdJTVi4jcbsNttCMv2dJxzZihLZLF3qxnzGiz7oCW vfTg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:references:in-reply-to:from:date :message-id:subject:to:cc:content-transfer-encoding; bh=KScogeDftmvqWYIkPyyiPLur8lC1L/rXWGn83bgxhNc=; b=PQhWu5+0zcpaFDW0XkmDtu9jAAtu0czhWk3jhnFRAJxSoOx3NE5N+TUNRtmrDqG5YT idyoYwDpsv7INiBGsfe4gTm4buqqDGjIlKg+Sza3bWiyeHx5twU2do7kRoHPx+6+EHZd 6rvt3ShrtVf+VEz0Z+B0jrAEwerEPQM6qXi7PcJ/6B2NblyIcDJ2/JXZP3f7w+uApSd/ u1NEr3DtdYSGjHx6/PclJcuXOXSRfBNGBD8v1XPb+SX4p2H9PkvBXmtLyc+0+Y/FtWiA ggt1d9O762nTRNxoEZzojsV/KOy9bH4ZEmdlgSdSBJcQG63lW00hGbIb5fwo/PktF50Y jUYw== X-Gm-Message-State: APjAAAUI7JDkBniiEYzVLOVD7kx6rWZa3tdk5duFGop5++N801WeUkrh v3Iz9rubRtJG1aVKqnUJTx++JhCKIiGbqPyj0B8= X-Google-Smtp-Source: APXvYqxUbN2OiIBkXqdcyM7277FQJ8KxNOBpAR3aYwqLyXQI3z3Sz6j68OqJwSxfcqAWVfqsAEzZLjO4nTpc6Qezwso= X-Received: by 2002:a2e:6f19:: with SMTP id k25mr14504839ljc.84.1579012917620; Tue, 14 Jan 2020 06:41:57 -0800 (PST) MIME-Version: 1.0 References: <20190311180216.18811-1-jandryuk@gmail.com> <20190311180216.18811-7-jandryuk@gmail.com> <57dc1083d20a469785f05a2e5250a820@AMSPEX02CL02.citrite.net> <20190322030936.fkiajz5ifgaejkd4@MacBook-Air-de-Roger.local> <20200114100406.GF11756@Air-de-Roger> In-Reply-To: <20200114100406.GF11756@Air-de-Roger> From: Jason Andryuk Date: Tue, 14 Jan 2020 09:41:46 -0500 Message-ID: Subject: Re: [Xen-devel] [PATCH 6/6] xen-pt: Round pci regions sizes to XEN_PAGE_SIZE To: =?UTF-8?Q?Roger_Pau_Monn=C3=A9?= Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2a00:1450:4864:20::242 X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Stefano Stabellini , Andrew Cooper , Paul Durrant , "marmarek@invisiblethingslab.com" , "qemu-devel@nongnu.org" , Simon Gaiser , Anthony Perard , "xen-devel@lists.xenproject.org" Errors-To: qemu-devel-bounces+qemu-devel=archiver.kernel.org@nongnu.org Sender: "Qemu-devel" On Tue, Jan 14, 2020 at 5:04 AM Roger Pau Monn=C3=A9 = wrote: > > On Mon, Jan 13, 2020 at 02:01:47PM -0500, Jason Andryuk wrote: > > On Fri, Mar 22, 2019 at 3:43 PM Jason Andryuk wrot= e: > > > > > > On Thu, Mar 21, 2019 at 11:09 PM Roger Pau Monn=C3=A9 wrote: > > > > > > > > On Wed, Mar 20, 2019 at 01:28:47PM -0400, Jason Andryuk wrote: > > > > > On Fri, Mar 15, 2019 at 12:28 PM Andrew Cooper > > > > > wrote: > > > > > > > > > > > > On 15/03/2019 09:17, Paul Durrant wrote: > > > > > > >> -----Original Message----- > > > > > > >> From: Jason Andryuk [mailto:jandryuk@gmail.com] > > > > > > >> Sent: 14 March 2019 18:16 > > > > > > >> To: Paul Durrant > > > > > > >> Cc: qemu-devel@nongnu.org; xen-devel@lists.xenproject.org; m= armarek@invisiblethingslab.com; Simon > > > > > > >> Gaiser ; Stefano Stabellini ; Anthony Perard > > > > > > >> > > > > > > >> Subject: Re: [PATCH 6/6] xen-pt: Round pci regions sizes to = XEN_PAGE_SIZE > > > > > > >> > > > > > > >> On Wed, Mar 13, 2019 at 11:09 AM Paul Durrant wrote: > > > > > > >>>> -----Original Message----- > > > > > > >>>> From: Jason Andryuk [mailto:jandryuk@gmail.com] > > > > > > >>>> Sent: 11 March 2019 18:02 > > > > > > >>>> To: qemu-devel@nongnu.org > > > > > > >>>> Cc: xen-devel@lists.xenproject.org; marmarek@invisiblethin= gslab.com; Simon Gaiser > > > > > > >>>> ; Jason Andryuk ; Stefano Stabellini > > > > > > >>>> ; Anthony Perard ; Paul Durrant > > > > > > >>>> > > > > > > >>>> Subject: [PATCH 6/6] xen-pt: Round pci regions sizes to XE= N_PAGE_SIZE > > > > > > >>>> > > > > > > >>>> From: Simon Gaiser > > > > > > >>>> > > > > > > >>>> If a pci memory region has a size < XEN_PAGE_SIZE it can g= et located at > > > > > > >>>> an address which is not page aligned. > > > > > > >>> IIRC the PCI spec says that the minimum memory region size = should be at least 4k. Should we even be > > > > > > >> tolerating BARs smaller than that? > > > > > > >>> Paul > > > > > > >>> > > > > > > >> Hi, Paul. > > > > > > >> > > > > > > >> Simon found this, so it affects a real device. Simon, do yo= u recall > > > > > > >> which device was affected? > > > > > > >> > > > > > > >> I think BARs only need to be power-of-two size and aligned, = and 4k is > > > > > > >> not a minimum. 16bytes may be a minimum, but I don't know w= hat the > > > > > > >> spec says. > > > > > > >> > > > > > > >> On an Ivy Bridge system, here are some of the devices with B= ARs smaller than 4K: > > > > > > >> 00:16.0 Communication controller: Intel Corporation 7 Series= /C210 > > > > > > >> Series Chipset Family MEI Controller #1 (rev 04) > > > > > > >> Memory at d0735000 (64-bit, non-prefetchable) [disabled] = [size=3D16] > > > > > > >> 00:1d.0 USB controller: Intel Corporation 7 Series/C210 Seri= es Chipset > > > > > > >> Family USB Enhanced Host Controller #1 (rev 04) (prog-if 20 = [EHCI]) > > > > > > >> Memory at d0739000 (32-bit, non-prefetchable) [disabled] = [size=3D1K] > > > > > > >> 00:1f.3 SMBus: Intel Corporation 7 Series/C210 Series Chipse= t Family > > > > > > >> SMBus Controller (rev 04) > > > > > > >> Memory at d0734000 (64-bit, non-prefetchable) [disabled] = [size=3D256] > > > > > > >> 02:00.0 System peripheral: JMicron Technology Corp. SD/MMC H= ost > > > > > > >> Controller (rev 30) > > > > > > >> Memory at d0503000 (32-bit, non-prefetchable) [disabled] = [size=3D256] > > > > > > >> > > > > > > >> These examples are all 4K aligned, so this is not an issue o= n this machine. > > > > > > >> > > > > > > >> Reviewing the code, I'm now wondering if the following in > > > > > > >> hw/xen/xen_pt.c:xen_pt_region_update is wrong: rc =3D > > > > > > >> xc_domain_memory_mapping(xen_xc, xen_domid, > > > > > > >> XEN_PFN(guest_addr + XC= _PAGE_SIZE - 1), > > > > > > >> XEN_PFN(machine_addr + = XC_PAGE_SIZE - 1), > > > > > > >> XEN_PFN(size + XC_PAGE_= SIZE - 1), > > > > > > >> op); > > > > > > >> > > > > > > >> If a bar of size 0x100 is at 0xd0500800, then the machine_ad= dr passed > > > > > > >> in would be 0xd0501000 which is past the actual location. S= hould the > > > > > > >> call arguments just be XEN_PFN(guest_addr) & XEN_PFN(machine= _addr)? > > > > > > >> > > > > > > >> BARs smaller than a page would also be a problem if BARs for= different > > > > > > >> devices shared the same page. > > > > > > > Exactly. We cannot pass them through with any degree of safet= y (not that passthrough of an arbitrary device is a particularly safe thing= to do anyway). The xen-pt code would instead need to trap those BARs and p= erform the accesses to the real BAR itself. Ultimately though I think we sh= ould be retiring the xen-pt code in favour of a standalone emulator. > > > > > > > > > > > > It doesn't matter if the BAR is smaller than 4k, if there are h= oles next > > > > > > to it. > > > > > > > > > > > > Do we know what the case is in practice for these USB controlle= rs? > > > > > > > > > > > > If the worst comes to the worst, we can re-enumerate the PCI bu= s to > > > > > > ensure that all bars smaller than 4k still have 4k alignment be= tween > > > > > > them. That way we can safely pass them through even when they = are smaller. > > > > > > > > > > Andrew, thanks for checking the spec on the minimum BAR size. > > > > > > > > > > Dropping the Round PCI region patch from QMEU, the guest HVM will= have: > > > > > > > > > > 00:06.0 SD Host controller: Ricoh Co Ltd PCIe SDXC/MMC Host Contr= oller (rev 07) > > > > > Memory at f2028800 (32-bit, non-prefetchable) [size=3D256] > > > > > 00:07.0 USB controller: NEC Corporation uPD720200 USB 3.0 Host > > > > > Controller (rev 04) (prog-if 30 [XHCI]) > > > > > Memory at f2024000 (64-bit, non-prefetchable) [size=3D8K] > > > > > 00:08.0 USB controller: Intel Corporation 6 Series/C200 Series Ch= ipset > > > > > Family USB Enhanced Host Controller #2 (rev 05) (prog-if 20 [EHCI= ]) > > > > > Memory at f2028000 (32-bit, non-prefetchable) [size=3D1K] > > > > > 00:09.0 USB controller: Intel Corporation 6 Series/C200 Series Ch= ipset > > > > > Family USB Enhanced Host Controller #1 (rev 05) (prog-if 20 [EHCI= ]) > > > > > Memory at f2028400 (32-bit, non-prefetchable) [size=3D1K] > > > > > > > > > > 00:09.0, 00:08.0 & 00:06.0 all share the same page. Only 00:08.0= is > > > > > working. With some added debugging output, you'll see that the s= ame > > > > > page* is used for three of the BARs. > > > > > > > > > > [00:06.0] mapping guest_addr 0xf2028800 gfn 0xf2028 to maddr > > > > > 0xe1a30000 mfn 0xe1a30 > > > > > [00:07.0] mapping guest_addr 0xf2024000 gfn 0xf2024 to maddr > > > > > 0xe0800000 mfn 0xe0800 > > > > > [00:09.0] mapping guest_addr 0xf2028400 gfn 0xf2028 to maddr > > > > > 0xe1900000 mfn 0xe1900 > > > > > [00:08.0] mapping guest_addr 0xf2028000 gfn 0xf2028 to maddr > > > > > 0xe1a2f000 mfn 0xe1a2f > > > > > > > > The patch below should prevent hvmloader from placing multiple BARs= on > > > > the same page, could you give it a try? > > > > > > > > Note that this is not going to prevent the guest from moving those > > > > BARs around and place them in the same page, thus breaking the init= ial > > > > placement done by hvmloader. > > > > > > > > Thanks, Roger. > > > > > > Hi, Roger. > > > > > > I've minimally tested this. Yes, this patch seems to place small BAR= s > > > into separate pages. The linux stubdom and QEMU then use the spacing > > > as provided by hvmloader. > > > > Roger, > > > > Would you mind submitting this patch to Xen? > > Hm, I'm half minded regarding this patch. It feels more like a bandaid > than a proper solution. Mapping BARs not multiple of page-sizes is > dangerous because AFAIK there's no entity that asserts there isn't any > other BAR from a different device on the same page, and hence you > might end up mapping some MMIO region from another device > inadvertently. We have the guest, linux stubdom with qemu, & dom0. Are you concerned that all of them need a minimum of page alignment? Linux PCI subsytem has an option resource_alignment that can be applied to either a single device or all devices. Booting with pci=3Dresource_aligment=3D4096 will align each device to a page. Do you think pciback should force resource_alignment=3D4096 for dom0? Are there other MMIO ranges to be concerned about adjacent to BARs? On my one test machine with a BAR smaller than 4096, the firmware already sets an alignment of 4096. Linux dom0 seems to keep the firmware BAR alignment by default. > Anyway, I can formally submit the patch since it's no worse than > what's currently done, but I would clearly state this is not safe in > it's current state. Regards, Jason 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 X-Spam-Level: X-Spam-Status: No, score=-0.3 required=3.0 tests=DKIM_ADSP_CUSTOM_MED, DKIM_INVALID,DKIM_SIGNED,FREEMAIL_FORGED_FROMDOMAIN,FREEMAIL_FROM, HEADER_FROM_DIFFERENT_DOMAINS,MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS autolearn=no autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id AB3FCC33CB1 for ; Tue, 14 Jan 2020 14:42:17 +0000 (UTC) Received: from lists.xenproject.org (lists.xenproject.org [192.237.175.120]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 70A6324680 for ; Tue, 14 Jan 2020 14:42:17 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=fail reason="signature verification failed" (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="SlKgBPWb" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 70A6324680 Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=gmail.com Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=xen-devel-bounces@lists.xenproject.org Received: from localhost ([127.0.0.1] helo=lists.xenproject.org) by lists.xenproject.org with esmtp (Exim 4.89) (envelope-from ) id 1irNOL-0001x0-E2; Tue, 14 Jan 2020 14:42:01 +0000 Received: from us1-rack-iad1.inumbo.com ([172.99.69.81]) by lists.xenproject.org with esmtp (Exim 4.89) (envelope-from ) id 1irNOK-0001wu-2J for xen-devel@lists.xenproject.org; Tue, 14 Jan 2020 14:42:00 +0000 X-Inumbo-ID: 044d4a88-36dc-11ea-b89f-bc764e2007e4 Received: from mail-lj1-x241.google.com (unknown [2a00:1450:4864:20::241]) by us1-rack-iad1.inumbo.com (Halon) with ESMTPS id 044d4a88-36dc-11ea-b89f-bc764e2007e4; Tue, 14 Jan 2020 14:41:58 +0000 (UTC) Received: by mail-lj1-x241.google.com with SMTP id y4so14625403ljj.9 for ; Tue, 14 Jan 2020 06:41:58 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=mime-version:references:in-reply-to:from:date:message-id:subject:to :cc:content-transfer-encoding; bh=KScogeDftmvqWYIkPyyiPLur8lC1L/rXWGn83bgxhNc=; b=SlKgBPWbPrrlTrsa5/1lSY7DUL3Lbqw9Zen97OZDuZeXiF7rZMySocuw++DXkmt7U7 fpFxhOiRO06nYoNIQ5GfpmcspAVOyDeYinNPKYj8e957EaCl2frLbUjWGNqGYMPVZZfN WuHcga+2V9h0TYWINSPOCdF7eWntQeoN4KwRj02eo+N06j5E0oMxMiUZoBbjA67NiEL5 M/tjE09cl7mTThw5NLVVlvUheebRvR1Dm2kkWb3tYgdaq2w2/gqDU0FZ0TLDQCPDU5Mk 1/9OcpHVytpW1qEHxnSs+o4Ww6sTdJTVi4jcbsNttCMv2dJxzZihLZLF3qxnzGiz7oCW vfTg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:references:in-reply-to:from:date :message-id:subject:to:cc:content-transfer-encoding; bh=KScogeDftmvqWYIkPyyiPLur8lC1L/rXWGn83bgxhNc=; b=SdTRzufeU+GUq5V5kn+P2JMUZVKzh0kACx8lOmb52q2R/ITs1KcoxvPmkTVhhfEj8z 5ZXpe3J3V2W9tLWvDsNzucaM0Phn0Uti3Vri1TmZ1DM09hhqc3/JY3McTcLFNI/jGNrj Qp75S1L6GeBt2RakrzgscL0d1KB8rze3EL9C6rdfftAPJsGwV3olR2F9Vl3QSKxKYfbo hkaylz8XXOcs6A8DcxypZiZy1FXeVd5p6ZR4qk4bkBmT78sCAbtzj5SmXuzwfuhawL53 fodMRpc1yvMh0LF1eu2U7yKjAAv1GUUc+9fRxEOeugDKJJFPG0qaRYkkEFBxZ3zkEYfY OHNg== X-Gm-Message-State: APjAAAUH1Ylo6UTHHAjsUHmuWikr7v3eNvs4Dm87M3ByQ/x/ku0bsfth 1i9qcnbo5Oiaj0iWKYXtYwsZrViM9BnlXpgYmug= X-Google-Smtp-Source: APXvYqxUbN2OiIBkXqdcyM7277FQJ8KxNOBpAR3aYwqLyXQI3z3Sz6j68OqJwSxfcqAWVfqsAEzZLjO4nTpc6Qezwso= X-Received: by 2002:a2e:6f19:: with SMTP id k25mr14504839ljc.84.1579012917620; Tue, 14 Jan 2020 06:41:57 -0800 (PST) MIME-Version: 1.0 References: <20190311180216.18811-1-jandryuk@gmail.com> <20190311180216.18811-7-jandryuk@gmail.com> <57dc1083d20a469785f05a2e5250a820@AMSPEX02CL02.citrite.net> <20190322030936.fkiajz5ifgaejkd4@MacBook-Air-de-Roger.local> <20200114100406.GF11756@Air-de-Roger> In-Reply-To: <20200114100406.GF11756@Air-de-Roger> From: Jason Andryuk Date: Tue, 14 Jan 2020 09:41:46 -0500 Message-ID: To: =?UTF-8?Q?Roger_Pau_Monn=C3=A9?= Subject: Re: [Xen-devel] [PATCH 6/6] xen-pt: Round pci regions sizes to XEN_PAGE_SIZE X-BeenThere: xen-devel@lists.xenproject.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: Xen developer discussion List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Cc: Stefano Stabellini , Andrew Cooper , Paul Durrant , "marmarek@invisiblethingslab.com" , "qemu-devel@nongnu.org" , Simon Gaiser , Anthony Perard , "xen-devel@lists.xenproject.org" Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Errors-To: xen-devel-bounces@lists.xenproject.org Sender: "Xen-devel" T24gVHVlLCBKYW4gMTQsIDIwMjAgYXQgNTowNCBBTSBSb2dlciBQYXUgTW9ubsOpIDxyb2dlci5w YXVAY2l0cml4LmNvbT4gd3JvdGU6Cj4KPiBPbiBNb24sIEphbiAxMywgMjAyMCBhdCAwMjowMTo0 N1BNIC0wNTAwLCBKYXNvbiBBbmRyeXVrIHdyb3RlOgo+ID4gT24gRnJpLCBNYXIgMjIsIDIwMTkg YXQgMzo0MyBQTSBKYXNvbiBBbmRyeXVrIDxqYW5kcnl1a0BnbWFpbC5jb20+IHdyb3RlOgo+ID4g Pgo+ID4gPiBPbiBUaHUsIE1hciAyMSwgMjAxOSBhdCAxMTowOSBQTSBSb2dlciBQYXUgTW9ubsOp IDxyb2dlci5wYXVAY2l0cml4LmNvbT4gd3JvdGU6Cj4gPiA+ID4KPiA+ID4gPiBPbiBXZWQsIE1h ciAyMCwgMjAxOSBhdCAwMToyODo0N1BNIC0wNDAwLCBKYXNvbiBBbmRyeXVrIHdyb3RlOgo+ID4g PiA+ID4gT24gRnJpLCBNYXIgMTUsIDIwMTkgYXQgMTI6MjggUE0gQW5kcmV3IENvb3Blcgo+ID4g PiA+ID4gPGFuZHJldy5jb29wZXIzQGNpdHJpeC5jb20+IHdyb3RlOgo+ID4gPiA+ID4gPgo+ID4g PiA+ID4gPiBPbiAxNS8wMy8yMDE5IDA5OjE3LCBQYXVsIER1cnJhbnQgd3JvdGU6Cj4gPiA+ID4g PiA+ID4+IC0tLS0tT3JpZ2luYWwgTWVzc2FnZS0tLS0tCj4gPiA+ID4gPiA+ID4+IEZyb206IEph c29uIEFuZHJ5dWsgW21haWx0bzpqYW5kcnl1a0BnbWFpbC5jb21dCj4gPiA+ID4gPiA+ID4+IFNl bnQ6IDE0IE1hcmNoIDIwMTkgMTg6MTYKPiA+ID4gPiA+ID4gPj4gVG86IFBhdWwgRHVycmFudCA8 UGF1bC5EdXJyYW50QGNpdHJpeC5jb20+Cj4gPiA+ID4gPiA+ID4+IENjOiBxZW11LWRldmVsQG5v bmdudS5vcmc7IHhlbi1kZXZlbEBsaXN0cy54ZW5wcm9qZWN0Lm9yZzsgbWFybWFyZWtAaW52aXNp YmxldGhpbmdzbGFiLmNvbTsgU2ltb24KPiA+ID4gPiA+ID4gPj4gR2Fpc2VyIDxzaW1vbkBpbnZp c2libGV0aGluZ3NsYWIuY29tPjsgU3RlZmFubyBTdGFiZWxsaW5pIDxzc3RhYmVsbGluaUBrZXJu ZWwub3JnPjsgQW50aG9ueSBQZXJhcmQKPiA+ID4gPiA+ID4gPj4gPGFudGhvbnkucGVyYXJkQGNp dHJpeC5jb20+Cj4gPiA+ID4gPiA+ID4+IFN1YmplY3Q6IFJlOiBbUEFUQ0ggNi82XSB4ZW4tcHQ6 IFJvdW5kIHBjaSByZWdpb25zIHNpemVzIHRvIFhFTl9QQUdFX1NJWkUKPiA+ID4gPiA+ID4gPj4K PiA+ID4gPiA+ID4gPj4gT24gV2VkLCBNYXIgMTMsIDIwMTkgYXQgMTE6MDkgQU0gUGF1bCBEdXJy YW50IDxQYXVsLkR1cnJhbnRAY2l0cml4LmNvbT4gd3JvdGU6Cj4gPiA+ID4gPiA+ID4+Pj4gLS0t LS1PcmlnaW5hbCBNZXNzYWdlLS0tLS0KPiA+ID4gPiA+ID4gPj4+PiBGcm9tOiBKYXNvbiBBbmRy eXVrIFttYWlsdG86amFuZHJ5dWtAZ21haWwuY29tXQo+ID4gPiA+ID4gPiA+Pj4+IFNlbnQ6IDEx IE1hcmNoIDIwMTkgMTg6MDIKPiA+ID4gPiA+ID4gPj4+PiBUbzogcWVtdS1kZXZlbEBub25nbnUu b3JnCj4gPiA+ID4gPiA+ID4+Pj4gQ2M6IHhlbi1kZXZlbEBsaXN0cy54ZW5wcm9qZWN0Lm9yZzsg bWFybWFyZWtAaW52aXNpYmxldGhpbmdzbGFiLmNvbTsgU2ltb24gR2Fpc2VyCj4gPiA+ID4gPiA+ ID4+Pj4gPHNpbW9uQGludmlzaWJsZXRoaW5nc2xhYi5jb20+OyBKYXNvbiBBbmRyeXVrIDxqYW5k cnl1a0BnbWFpbC5jb20+OyBTdGVmYW5vIFN0YWJlbGxpbmkKPiA+ID4gPiA+ID4gPj4+PiA8c3N0 YWJlbGxpbmlAa2VybmVsLm9yZz47IEFudGhvbnkgUGVyYXJkIDxhbnRob255LnBlcmFyZEBjaXRy aXguY29tPjsgUGF1bCBEdXJyYW50Cj4gPiA+ID4gPiA+ID4+Pj4gPFBhdWwuRHVycmFudEBjaXRy aXguY29tPgo+ID4gPiA+ID4gPiA+Pj4+IFN1YmplY3Q6IFtQQVRDSCA2LzZdIHhlbi1wdDogUm91 bmQgcGNpIHJlZ2lvbnMgc2l6ZXMgdG8gWEVOX1BBR0VfU0laRQo+ID4gPiA+ID4gPiA+Pj4+Cj4g PiA+ID4gPiA+ID4+Pj4gRnJvbTogU2ltb24gR2Fpc2VyIDxzaW1vbkBpbnZpc2libGV0aGluZ3Ns YWIuY29tPgo+ID4gPiA+ID4gPiA+Pj4+Cj4gPiA+ID4gPiA+ID4+Pj4gSWYgYSBwY2kgbWVtb3J5 IHJlZ2lvbiBoYXMgYSBzaXplIDwgWEVOX1BBR0VfU0laRSBpdCBjYW4gZ2V0IGxvY2F0ZWQgYXQK PiA+ID4gPiA+ID4gPj4+PiBhbiBhZGRyZXNzIHdoaWNoIGlzIG5vdCBwYWdlIGFsaWduZWQuCj4g PiA+ID4gPiA+ID4+PiBJSVJDIHRoZSBQQ0kgc3BlYyBzYXlzIHRoYXQgdGhlIG1pbmltdW0gbWVt b3J5IHJlZ2lvbiBzaXplIHNob3VsZCBiZSBhdCBsZWFzdCA0ay4gU2hvdWxkIHdlIGV2ZW4gYmUK PiA+ID4gPiA+ID4gPj4gdG9sZXJhdGluZyBCQVJzIHNtYWxsZXIgdGhhbiB0aGF0Pwo+ID4gPiA+ ID4gPiA+Pj4gICBQYXVsCj4gPiA+ID4gPiA+ID4+Pgo+ID4gPiA+ID4gPiA+PiBIaSwgUGF1bC4K PiA+ID4gPiA+ID4gPj4KPiA+ID4gPiA+ID4gPj4gU2ltb24gZm91bmQgdGhpcywgc28gaXQgYWZm ZWN0cyBhIHJlYWwgZGV2aWNlLiAgU2ltb24sIGRvIHlvdSByZWNhbGwKPiA+ID4gPiA+ID4gPj4g d2hpY2ggZGV2aWNlIHdhcyBhZmZlY3RlZD8KPiA+ID4gPiA+ID4gPj4KPiA+ID4gPiA+ID4gPj4g SSB0aGluayBCQVJzIG9ubHkgbmVlZCB0byBiZSBwb3dlci1vZi10d28gc2l6ZSBhbmQgYWxpZ25l ZCwgYW5kIDRrIGlzCj4gPiA+ID4gPiA+ID4+IG5vdCBhIG1pbmltdW0uICAxNmJ5dGVzIG1heSBi ZSBhIG1pbmltdW0sIGJ1dCBJIGRvbid0IGtub3cgd2hhdCB0aGUKPiA+ID4gPiA+ID4gPj4gc3Bl YyBzYXlzLgo+ID4gPiA+ID4gPiA+Pgo+ID4gPiA+ID4gPiA+PiBPbiBhbiBJdnkgQnJpZGdlIHN5 c3RlbSwgaGVyZSBhcmUgc29tZSBvZiB0aGUgZGV2aWNlcyB3aXRoIEJBUnMgc21hbGxlciB0aGFu IDRLOgo+ID4gPiA+ID4gPiA+PiAwMDoxNi4wIENvbW11bmljYXRpb24gY29udHJvbGxlcjogSW50 ZWwgQ29ycG9yYXRpb24gNyBTZXJpZXMvQzIxMAo+ID4gPiA+ID4gPiA+PiBTZXJpZXMgQ2hpcHNl dCBGYW1pbHkgTUVJIENvbnRyb2xsZXIgIzEgKHJldiAwNCkKPiA+ID4gPiA+ID4gPj4gICAgTWVt b3J5IGF0IGQwNzM1MDAwICg2NC1iaXQsIG5vbi1wcmVmZXRjaGFibGUpIFtkaXNhYmxlZF0gW3Np emU9MTZdCj4gPiA+ID4gPiA+ID4+IDAwOjFkLjAgVVNCIGNvbnRyb2xsZXI6IEludGVsIENvcnBv cmF0aW9uIDcgU2VyaWVzL0MyMTAgU2VyaWVzIENoaXBzZXQKPiA+ID4gPiA+ID4gPj4gRmFtaWx5 IFVTQiBFbmhhbmNlZCBIb3N0IENvbnRyb2xsZXIgIzEgKHJldiAwNCkgKHByb2ctaWYgMjAgW0VI Q0ldKQo+ID4gPiA+ID4gPiA+PiAgICBNZW1vcnkgYXQgZDA3MzkwMDAgKDMyLWJpdCwgbm9uLXBy ZWZldGNoYWJsZSkgW2Rpc2FibGVkXSBbc2l6ZT0xS10KPiA+ID4gPiA+ID4gPj4gMDA6MWYuMyBT TUJ1czogSW50ZWwgQ29ycG9yYXRpb24gNyBTZXJpZXMvQzIxMCBTZXJpZXMgQ2hpcHNldCBGYW1p bHkKPiA+ID4gPiA+ID4gPj4gU01CdXMgQ29udHJvbGxlciAocmV2IDA0KQo+ID4gPiA+ID4gPiA+ PiAgICBNZW1vcnkgYXQgZDA3MzQwMDAgKDY0LWJpdCwgbm9uLXByZWZldGNoYWJsZSkgW2Rpc2Fi bGVkXSBbc2l6ZT0yNTZdCj4gPiA+ID4gPiA+ID4+IDAyOjAwLjAgU3lzdGVtIHBlcmlwaGVyYWw6 IEpNaWNyb24gVGVjaG5vbG9neSBDb3JwLiBTRC9NTUMgSG9zdAo+ID4gPiA+ID4gPiA+PiBDb250 cm9sbGVyIChyZXYgMzApCj4gPiA+ID4gPiA+ID4+ICAgIE1lbW9yeSBhdCBkMDUwMzAwMCAoMzIt Yml0LCBub24tcHJlZmV0Y2hhYmxlKSBbZGlzYWJsZWRdIFtzaXplPTI1Nl0KPiA+ID4gPiA+ID4g Pj4KPiA+ID4gPiA+ID4gPj4gVGhlc2UgZXhhbXBsZXMgYXJlIGFsbCA0SyBhbGlnbmVkLCBzbyB0 aGlzIGlzIG5vdCBhbiBpc3N1ZSBvbiB0aGlzIG1hY2hpbmUuCj4gPiA+ID4gPiA+ID4+Cj4gPiA+ ID4gPiA+ID4+IFJldmlld2luZyB0aGUgY29kZSwgSSdtIG5vdyB3b25kZXJpbmcgaWYgdGhlIGZv bGxvd2luZyBpbgo+ID4gPiA+ID4gPiA+PiBody94ZW4veGVuX3B0LmM6eGVuX3B0X3JlZ2lvbl91 cGRhdGUgaXMgd3Jvbmc6ICAgICAgICByYyA9Cj4gPiA+ID4gPiA+ID4+IHhjX2RvbWFpbl9tZW1v cnlfbWFwcGluZyh4ZW5feGMsIHhlbl9kb21pZCwKPiA+ID4gPiA+ID4gPj4gICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIFhFTl9QRk4oZ3Vlc3RfYWRkciArIFhDX1BBR0VfU0la RSAtIDEpLAo+ID4gPiA+ID4gPiA+PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgWEVOX1BGTihtYWNoaW5lX2FkZHIgKyBYQ19QQUdFX1NJWkUgLSAxKSwKPiA+ID4gPiA+ID4g Pj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhFTl9QRk4oc2l6ZSArIFhD X1BBR0VfU0laRSAtIDEpLAo+ID4gPiA+ID4gPiA+PiAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgb3ApOwo+ID4gPiA+ID4gPiA+Pgo+ID4gPiA+ID4gPiA+PiBJZiBhIGJhciBv ZiBzaXplIDB4MTAwIGlzIGF0IDB4ZDA1MDA4MDAsIHRoZW4gdGhlIG1hY2hpbmVfYWRkciBwYXNz ZWQKPiA+ID4gPiA+ID4gPj4gaW4gd291bGQgYmUgMHhkMDUwMTAwMCB3aGljaCBpcyBwYXN0IHRo ZSBhY3R1YWwgbG9jYXRpb24uICBTaG91bGQgdGhlCj4gPiA+ID4gPiA+ID4+IGNhbGwgYXJndW1l bnRzIGp1c3QgYmUgWEVOX1BGTihndWVzdF9hZGRyKSAmIFhFTl9QRk4obWFjaGluZV9hZGRyKT8K PiA+ID4gPiA+ID4gPj4KPiA+ID4gPiA+ID4gPj4gQkFScyBzbWFsbGVyIHRoYW4gYSBwYWdlIHdv dWxkIGFsc28gYmUgYSBwcm9ibGVtIGlmIEJBUnMgZm9yIGRpZmZlcmVudAo+ID4gPiA+ID4gPiA+ PiBkZXZpY2VzIHNoYXJlZCB0aGUgc2FtZSBwYWdlLgo+ID4gPiA+ID4gPiA+IEV4YWN0bHkuIFdl IGNhbm5vdCBwYXNzIHRoZW0gdGhyb3VnaCB3aXRoIGFueSBkZWdyZWUgb2Ygc2FmZXR5IChub3Qg dGhhdCBwYXNzdGhyb3VnaCBvZiBhbiBhcmJpdHJhcnkgZGV2aWNlIGlzIGEgcGFydGljdWxhcmx5 IHNhZmUgdGhpbmcgdG8gZG8gYW55d2F5KS4gVGhlIHhlbi1wdCBjb2RlIHdvdWxkIGluc3RlYWQg bmVlZCB0byB0cmFwIHRob3NlIEJBUnMgYW5kIHBlcmZvcm0gdGhlIGFjY2Vzc2VzIHRvIHRoZSBy ZWFsIEJBUiBpdHNlbGYuIFVsdGltYXRlbHkgdGhvdWdoIEkgdGhpbmsgd2Ugc2hvdWxkIGJlIHJl dGlyaW5nIHRoZSB4ZW4tcHQgY29kZSBpbiBmYXZvdXIgb2YgYSBzdGFuZGFsb25lIGVtdWxhdG9y Lgo+ID4gPiA+ID4gPgo+ID4gPiA+ID4gPiBJdCBkb2Vzbid0IG1hdHRlciBpZiB0aGUgQkFSIGlz IHNtYWxsZXIgdGhhbiA0aywgaWYgdGhlcmUgYXJlIGhvbGVzIG5leHQKPiA+ID4gPiA+ID4gdG8g aXQuCj4gPiA+ID4gPiA+Cj4gPiA+ID4gPiA+IERvIHdlIGtub3cgd2hhdCB0aGUgY2FzZSBpcyBp biBwcmFjdGljZSBmb3IgdGhlc2UgVVNCIGNvbnRyb2xsZXJzPwo+ID4gPiA+ID4gPgo+ID4gPiA+ ID4gPiBJZiB0aGUgd29yc3QgY29tZXMgdG8gdGhlIHdvcnN0LCB3ZSBjYW4gcmUtZW51bWVyYXRl IHRoZSBQQ0kgYnVzIHRvCj4gPiA+ID4gPiA+IGVuc3VyZSB0aGF0IGFsbCBiYXJzIHNtYWxsZXIg dGhhbiA0ayBzdGlsbCBoYXZlIDRrIGFsaWdubWVudCBiZXR3ZWVuCj4gPiA+ID4gPiA+IHRoZW0u ICBUaGF0IHdheSB3ZSBjYW4gc2FmZWx5IHBhc3MgdGhlbSB0aHJvdWdoIGV2ZW4gd2hlbiB0aGV5 IGFyZSBzbWFsbGVyLgo+ID4gPiA+ID4KPiA+ID4gPiA+IEFuZHJldywgdGhhbmtzIGZvciBjaGVj a2luZyB0aGUgc3BlYyBvbiB0aGUgbWluaW11bSBCQVIgc2l6ZS4KPiA+ID4gPiA+Cj4gPiA+ID4g PiBEcm9wcGluZyB0aGUgUm91bmQgUENJIHJlZ2lvbiBwYXRjaCBmcm9tIFFNRVUsIHRoZSBndWVz dCBIVk0gd2lsbCBoYXZlOgo+ID4gPiA+ID4KPiA+ID4gPiA+IDAwOjA2LjAgU0QgSG9zdCBjb250 cm9sbGVyOiBSaWNvaCBDbyBMdGQgUENJZSBTRFhDL01NQyBIb3N0IENvbnRyb2xsZXIgKHJldiAw NykKPiA+ID4gPiA+ICAgICBNZW1vcnkgYXQgZjIwMjg4MDAgKDMyLWJpdCwgbm9uLXByZWZldGNo YWJsZSkgW3NpemU9MjU2XQo+ID4gPiA+ID4gMDA6MDcuMCBVU0IgY29udHJvbGxlcjogTkVDIENv cnBvcmF0aW9uIHVQRDcyMDIwMCBVU0IgMy4wIEhvc3QKPiA+ID4gPiA+IENvbnRyb2xsZXIgKHJl diAwNCkgKHByb2ctaWYgMzAgW1hIQ0ldKQo+ID4gPiA+ID4gICAgIE1lbW9yeSBhdCBmMjAyNDAw MCAoNjQtYml0LCBub24tcHJlZmV0Y2hhYmxlKSBbc2l6ZT04S10KPiA+ID4gPiA+IDAwOjA4LjAg VVNCIGNvbnRyb2xsZXI6IEludGVsIENvcnBvcmF0aW9uIDYgU2VyaWVzL0MyMDAgU2VyaWVzIENo aXBzZXQKPiA+ID4gPiA+IEZhbWlseSBVU0IgRW5oYW5jZWQgSG9zdCBDb250cm9sbGVyICMyIChy ZXYgMDUpIChwcm9nLWlmIDIwIFtFSENJXSkKPiA+ID4gPiA+ICAgICBNZW1vcnkgYXQgZjIwMjgw MDAgKDMyLWJpdCwgbm9uLXByZWZldGNoYWJsZSkgW3NpemU9MUtdCj4gPiA+ID4gPiAwMDowOS4w IFVTQiBjb250cm9sbGVyOiBJbnRlbCBDb3Jwb3JhdGlvbiA2IFNlcmllcy9DMjAwIFNlcmllcyBD aGlwc2V0Cj4gPiA+ID4gPiBGYW1pbHkgVVNCIEVuaGFuY2VkIEhvc3QgQ29udHJvbGxlciAjMSAo cmV2IDA1KSAocHJvZy1pZiAyMCBbRUhDSV0pCj4gPiA+ID4gPiAgICAgTWVtb3J5IGF0IGYyMDI4 NDAwICgzMi1iaXQsIG5vbi1wcmVmZXRjaGFibGUpIFtzaXplPTFLXQo+ID4gPiA+ID4KPiA+ID4g PiA+IDAwOjA5LjAsIDAwOjA4LjAgJiAwMDowNi4wIGFsbCBzaGFyZSB0aGUgc2FtZSBwYWdlLiAg T25seSAwMDowOC4wIGlzCj4gPiA+ID4gPiB3b3JraW5nLiAgV2l0aCBzb21lIGFkZGVkIGRlYnVn Z2luZyBvdXRwdXQsIHlvdSdsbCBzZWUgdGhhdCB0aGUgc2FtZQo+ID4gPiA+ID4gcGFnZSogaXMg dXNlZCBmb3IgdGhyZWUgb2YgdGhlIEJBUnMuCj4gPiA+ID4gPgo+ID4gPiA+ID4gWzAwOjA2LjBd IG1hcHBpbmcgZ3Vlc3RfYWRkciAweGYyMDI4ODAwIGdmbiAweGYyMDI4IHRvIG1hZGRyCj4gPiA+ ID4gPiAweGUxYTMwMDAwIG1mbiAweGUxYTMwCj4gPiA+ID4gPiBbMDA6MDcuMF0gbWFwcGluZyBn dWVzdF9hZGRyIDB4ZjIwMjQwMDAgZ2ZuIDB4ZjIwMjQgdG8gbWFkZHIKPiA+ID4gPiA+IDB4ZTA4 MDAwMDAgbWZuIDB4ZTA4MDAKPiA+ID4gPiA+IFswMDowOS4wXSBtYXBwaW5nIGd1ZXN0X2FkZHIg MHhmMjAyODQwMCBnZm4gMHhmMjAyOCB0byBtYWRkcgo+ID4gPiA+ID4gMHhlMTkwMDAwMCBtZm4g MHhlMTkwMAo+ID4gPiA+ID4gWzAwOjA4LjBdIG1hcHBpbmcgZ3Vlc3RfYWRkciAweGYyMDI4MDAw IGdmbiAweGYyMDI4IHRvIG1hZGRyCj4gPiA+ID4gPiAweGUxYTJmMDAwIG1mbiAweGUxYTJmCj4g PiA+ID4KPiA+ID4gPiBUaGUgcGF0Y2ggYmVsb3cgc2hvdWxkIHByZXZlbnQgaHZtbG9hZGVyIGZy b20gcGxhY2luZyBtdWx0aXBsZSBCQVJzIG9uCj4gPiA+ID4gdGhlIHNhbWUgcGFnZSwgY291bGQg eW91IGdpdmUgaXQgYSB0cnk/Cj4gPiA+ID4KPiA+ID4gPiBOb3RlIHRoYXQgdGhpcyBpcyBub3Qg Z29pbmcgdG8gcHJldmVudCB0aGUgZ3Vlc3QgZnJvbSBtb3ZpbmcgdGhvc2UKPiA+ID4gPiBCQVJz IGFyb3VuZCBhbmQgcGxhY2UgdGhlbSBpbiB0aGUgc2FtZSBwYWdlLCB0aHVzIGJyZWFraW5nIHRo ZSBpbml0aWFsCj4gPiA+ID4gcGxhY2VtZW50IGRvbmUgYnkgaHZtbG9hZGVyLgo+ID4gPiA+Cj4g PiA+ID4gVGhhbmtzLCBSb2dlci4KPiA+ID4KPiA+ID4gSGksIFJvZ2VyLgo+ID4gPgo+ID4gPiBJ J3ZlIG1pbmltYWxseSB0ZXN0ZWQgdGhpcy4gIFllcywgdGhpcyBwYXRjaCBzZWVtcyB0byBwbGFj ZSBzbWFsbCBCQVJzCj4gPiA+IGludG8gc2VwYXJhdGUgcGFnZXMuICBUaGUgbGludXggc3R1YmRv bSBhbmQgUUVNVSB0aGVuIHVzZSB0aGUgc3BhY2luZwo+ID4gPiBhcyBwcm92aWRlZCBieSBodm1s b2FkZXIuCj4gPgo+ID4gUm9nZXIsCj4gPgo+ID4gV291bGQgeW91IG1pbmQgc3VibWl0dGluZyB0 aGlzIHBhdGNoIHRvIFhlbj8KPgo+IEhtLCBJJ20gaGFsZiBtaW5kZWQgcmVnYXJkaW5nIHRoaXMg cGF0Y2guIEl0IGZlZWxzIG1vcmUgbGlrZSBhIGJhbmRhaWQKPiB0aGFuIGEgcHJvcGVyIHNvbHV0 aW9uLiBNYXBwaW5nIEJBUnMgbm90IG11bHRpcGxlIG9mIHBhZ2Utc2l6ZXMgaXMKPiBkYW5nZXJv dXMgYmVjYXVzZSBBRkFJSyB0aGVyZSdzIG5vIGVudGl0eSB0aGF0IGFzc2VydHMgdGhlcmUgaXNu J3QgYW55Cj4gb3RoZXIgQkFSIGZyb20gYSBkaWZmZXJlbnQgZGV2aWNlIG9uIHRoZSBzYW1lIHBh Z2UsIGFuZCBoZW5jZSB5b3UKPiBtaWdodCBlbmQgdXAgbWFwcGluZyBzb21lIE1NSU8gcmVnaW9u IGZyb20gYW5vdGhlciBkZXZpY2UKPiBpbmFkdmVydGVudGx5LgoKV2UgaGF2ZSB0aGUgZ3Vlc3Qs IGxpbnV4IHN0dWJkb20gd2l0aCBxZW11LCAmIGRvbTAuIEFyZSB5b3UgY29uY2VybmVkCnRoYXQg YWxsIG9mIHRoZW0gbmVlZCBhIG1pbmltdW0gb2YgcGFnZSBhbGlnbm1lbnQ/CgpMaW51eCBQQ0kg c3Vic3l0ZW0gaGFzIGFuIG9wdGlvbiByZXNvdXJjZV9hbGlnbm1lbnQgdGhhdCBjYW4gYmUKYXBw bGllZCB0byBlaXRoZXIgYSBzaW5nbGUgZGV2aWNlIG9yIGFsbCBkZXZpY2VzLiAgQm9vdGluZyB3 aXRoCnBjaT1yZXNvdXJjZV9hbGlnbWVudD00MDk2IHdpbGwgYWxpZ24gZWFjaCBkZXZpY2UgdG8g YSBwYWdlLiAgRG8geW91CnRoaW5rIHBjaWJhY2sgc2hvdWxkIGZvcmNlIHJlc291cmNlX2FsaWdu bWVudD00MDk2IGZvciBkb20wPyAgQXJlCnRoZXJlIG90aGVyIE1NSU8gcmFuZ2VzIHRvIGJlIGNv bmNlcm5lZCBhYm91dCBhZGphY2VudCB0byBCQVJzPwoKT24gbXkgb25lIHRlc3QgbWFjaGluZSB3 aXRoIGEgQkFSIHNtYWxsZXIgdGhhbiA0MDk2LCB0aGUgZmlybXdhcmUKYWxyZWFkeSBzZXRzIGFu IGFsaWdubWVudCBvZiA0MDk2LiAgTGludXggZG9tMCBzZWVtcyB0byBrZWVwIHRoZQpmaXJtd2Fy ZSBCQVIgYWxpZ25tZW50IGJ5IGRlZmF1bHQuCgo+IEFueXdheSwgSSBjYW4gZm9ybWFsbHkgc3Vi bWl0IHRoZSBwYXRjaCBzaW5jZSBpdCdzIG5vIHdvcnNlIHRoYW4KPiB3aGF0J3MgY3VycmVudGx5 IGRvbmUsIGJ1dCBJIHdvdWxkIGNsZWFybHkgc3RhdGUgdGhpcyBpcyBub3Qgc2FmZSBpbgo+IGl0 J3MgY3VycmVudCBzdGF0ZS4KClJlZ2FyZHMsCkphc29uCgpfX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fXwpYZW4tZGV2ZWwgbWFpbGluZyBsaXN0Clhlbi1kZXZl bEBsaXN0cy54ZW5wcm9qZWN0Lm9yZwpodHRwczovL2xpc3RzLnhlbnByb2plY3Qub3JnL21haWxt YW4vbGlzdGluZm8veGVuLWRldmVs