From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from lists.gentoo.org (pigeon.gentoo.org [208.92.234.80]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by finch.gentoo.org (Postfix) with ESMTPS id 5D3E3158041 for ; Sat, 6 Apr 2024 11:57:32 +0000 (UTC) Received: from pigeon.gentoo.org (localhost [127.0.0.1]) by pigeon.gentoo.org (Postfix) with SMTP id D38A8E29F2; Sat, 6 Apr 2024 11:57:26 +0000 (UTC) Received: from james.steelbluetech.co.uk (james.steelbluetech.co.uk [78.40.151.100]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) by pigeon.gentoo.org (Postfix) with ESMTPS id 428E2E29B9 for ; Sat, 6 Apr 2024 11:57:25 +0000 (UTC) Received: from [10.0.5.25] (tv.ehuk.net [10.0.5.25]) by james.steelbluetech.co.uk (Postfix) with ESMTP id D2BB9BFC17 for ; Sat, 6 Apr 2024 12:57:23 +0100 (BST) DKIM-Filter: OpenDKIM Filter v2.10.3 james.steelbluetech.co.uk D2BB9BFC17 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ehuk.net; s=default; t=1712404643; bh=THc7p4jtZYql0FXyAp31Ebh7BkSw39Glk4DKM51XRdc=; h=Date:Reply-To:Subject:From:To:References:In-Reply-To:From; b=XEyBiQt9xoLebzmXj0ed6YPl80MD7lYrbq1yRwieAr6EJju18AyWl8rDbSnfbOW0z gwdghkbQSm3w5TP1fTVMsjh7dgi2Zrka/YmYvRRUIHx/uSV05D7I19N/+A9GrD1nEu djoLkH2KrCPRx7+o509NDxXgY//cLlPpj6HzNa+paB8sVFM3lsbxJ8ncZwk9RTv+Km PQgNpq608gTHg+3M1+f5HLiwr6QjYttZyReTn1XcdfkzoytdJBjuxTWYyETn/ez5U2 eqn1UyY1bWyJFv0P11QooX+RNbpiS8rjOwPTkcmwe8TSgxktqL07rVMissJoRPPNPI OBLieh+/8wk2Q== Content-Type: multipart/mixed; boundary="------------gctadYlt1Z45q5mMqqyqL2RD" Message-ID: <92ef54a0-7a49-49f3-b3cc-d38a2b9adebd@ehuk.net> Date: Sat, 6 Apr 2024 12:57:23 +0100 Precedence: bulk List-Post: List-Help: List-Unsubscribe: List-Subscribe: List-Id: Gentoo Linux mail X-BeenThere: gentoo-dev@lists.gentoo.org Reply-to: gentoo-dev@lists.gentoo.org X-Auto-Response-Suppress: DR, RN, NRN, OOF, AutoReply MIME-Version: 1.0 User-Agent: Mozilla Thunderbird Subject: Re: [gentoo-dev] Current unavoidable use of xz utils in Gentoo From: Eddie Chapman To: gentoo-dev@lists.gentoo.org References: <875xwy8wxo.fsf@gentoo.org> <963ef0b6-7c2a-4730-b09d-5a829c3ff4c0@gmail.com> Content-Language: en-GB In-Reply-To: X-Scanned-By: MIMEDefang X-Archives-Salt: e506c48f-c921-4ed7-8fb1-e4d48688cd32 X-Archives-Hash: 9c3da225a0ea35a2d1f5985c0955499f This is a multi-part message in MIME format. --------------gctadYlt1Z45q5mMqqyqL2RD Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit On 04/04/2024 15:24, Eddie Chapman wrote: > Since there appears to be some interest I'll put together a single email > to the list later today detailing everything, as I needed to do more > things overall in addition to replacing /usr/bin/xz. Below is a guide I've written to removing app-arch/xz-utils in case anyone else wants to do so. Attached is the current version of the Bash wrapper script I now use in place of /usr/bin/xz Comments, corrections on anything technical in the guide or script are welcome, apart from flames about how this is ridiculous and unnecessary :-). Best wishes, Eddie ==== Guide to removing xz utils on a Gentoo system ==== === Introduction === This guide is for people who wish to remove xz utils (app-arch/xz-utils) from a Gentoo system. I've been able to remove xz utils from two Gentoo workstations with 2412 packages and KDE 5.x as the desktop, and it has not been painful at all. I've gone on to remove it from several Gentoo server systems without any pain. These are all SElinux systems. In this guide we replace app-arch/xz-utils with app-arch/p7zip which will do all the work of uncompressing xz distfiles for Portage going forward. It works perfectly fine for that right now. I've written a bash wrapper script which is designed to be installed as /usr/bin/xz, which is referred to in the instructions below. It is attached to this email as xz.txt. It tries to takes care of decompressing .xz files transparently whenever Portage runs /usr/bin/xz, by behaving like it but using app-arch/p7zip in the background. You will need it if you want to get rid of app-arch/xz-utils. But don't blindly use it, check it yourself first of course. If you don't like it you will either need to write your own script, or hack emerge/Portage in various places to use something else to decompress xz files. You're mileage may vary with any of this, proceed at your own risk, don't blame me if you break your system or lose data. === Warnings / Caveats / Breakages === Before you do this, you should identify whether you have applications or scripts which use the Tukaani xz utils, or that link against liblzma.so.5. This could include non-Gentoo apps or scripts you run which call any of the xz utils (xz, unxz, xzgrep|xzegrep|xzfgrep, xzcat, xzcmp, xzdec, xzdiff, lzma, unlzma, lzgrep|lzegrep|lzfgrep, lzmainfo, lzmadec, lzcmp, lzdiff, lzcat). Those programs will all be gone, so you should not do this if you want or need them and cannot use alternatives. 99% of packages in Gentoo work fine without xz utils, it's just that some might optionally link against liblzma.so.5 in order to provide support for xz (de)compression along with other algorithms. We will rebuild those packages so they don't link against liblzma.so.5 anymore. xx utils is a relative newcomer to the Linux/OSS/GNU world so you will find there aren't any low level system packages that absolutely need it to do their main job. You are highly unlikely to render your system completely unbootable doing this. But removing it does carry some risk. You might discover along the way there is some application you have installed that cannot function without xz utils. You might just have to uninstall it and find an alternative, if the situation cannot be resolved by creating your own custom ebuild and tweaking configure/meson options. But worst case if you have to uninstall a package and other packages depend on it, you might have to remove them too, and I'm sure you know how that remove list can potentially turn into a long one once all deps are worked out. You will lose some things. I've had to uninstall the following two packages for now: media-gfx/gimp kde-apps/ark (and kde-apps/kdeutils-meta which depends on it) (I'll probably figure out later how to coax them into working without xz. There might even be upstream updates soon that make xz optional, who knows. I'll also need to add to my world file at some point everything that was in kde-apps/kdeutils-meta.) If you run another desktop (e.g. Gnome) I've no idea what might or might not need xz utils. The situation with your desktop environment may be worse, more painful, or impossible. You will lose lzma support in the core Python language (dev-lang/python) in 3.x versions and higher (not sure when exactly support was introduced but 2.7 does not have it, 3.11 & 3.12 do), so if you have python scripts that happen to need that, well, they will definitely throw a big error after this :-) But I was able to rebuild the 179 dev-python packages on my workstations and everything in app-portage and none of them complained. I've been able to go on and do plenty of rebuilding with Portage after this without any problem, so core Python functionality in Gentoo is fine (although see next paragraph about Gemato). There is one significant thing that breaks, which is Gemato (app-portage/gemato). Gemato requires lzma support in core python in order to do GPG signature verification. This means you will have to say goodbye (for now) to verifying upstream GPG signatures on distfiles, and verification of Portage metadata after doing an emerge --sync. These features have been added to Portage relatively recently (2022?) so are "nice to have", without them your system is just less hardened, but still with the very high level of security that Gentoo systems have has always had prior to these features, in my opinion. Personally I can live without them for now. Verifying hashes in Manifest files still works fine and that's the main thing. You may disagree in which case, well, don't do this then. I'm going to figure out an alternative way I can verify Portage metadata soon, as there are other ways if you are creative. In practise this means you have to use USE="-verify-sig" for every emerge with a package that has a corresponding sec-keys package, and you have to set: sync-rsync-verify-metamanifest = no in files in /etc/portage/repos.conf/ But after doing that all works fine. Here's some other very minor things you might lose if you are currently using them: - KDE users will lose xz compression support from KArchive (kde-frameworks/karchive). AFAICT this has NOT had any impact on my own KDE experience, I've not seen any errors and everything I use works fine in my KDE sessions. KArchive will still support GZip, BZip2 and Zstd, just not xz. I suspect nothing that uses KArchive is using xz by default, but I'm not completely sure. All I know is my KDE sessions are running fine without it, and I can do everything in KDE I did before (apart from use Ark of course, see above). I don't know anything about KArchive. Full details of compression support in KArchive are at https://api.kde.org/frameworks/karchive/html/classKCompressionDevice.html - Portage binary packages: You cannot use xz compression if you create Portage binary packages. You will need to use one of bzip2, gzip, lz4, lzip, lzop, or zstd in BINPKG_COMPRESS in make.conf instead of xz (if that is what you were using, or is it the default?). I have always used gzip so no probs for me, creating binary packages works fine, I've already updated several Gentoo systems from many binary packages I've created using gzip without xz utils installed. - Grub bootloader: If you happened to have been using the optional, not used by default, --compress argument for grub-install, and you happen to have chosen xz, well you can't anymore. You will have to use gz or lzo instead, or stop using --compress if you don't like either of those two. Grub still builds, installs, works fine without xz utils for almost everyone. But if you did happen to previously use --compress=xz with grub-install before, make sure you check out fully what you might or might not have to do before next rebooting (I have no idea, I have never used this feature, Grub has continued working fine for me after rebuilding it without xz-utils and running grub-install again on my boot drives). - Dovecot: net-mail/dovecot links liblzma.so.5 in order to support it's optional Zlib plugin ( https://doc.dovecot.org/configuration_manual/zlib_plugin/ ) for reading/writing compressed mail files. Despite the plugin being called "Zlib" it supports several different compression algorithms. At one time they supported xz, but in recent Dovecot releases they decided to deprecate it. They still support reading (not writing) xz compressed files, so when net-mail/dovecot is built, if it finds liblzma.so.5 it will use it, if it doesn't find it, it wont, and then you just have no support for xz in the Zlib plugin (again, only *if* you are using that plugin, which is not default). From what I can gather, if you use this plugin you should migrate away from using xz compressed mail files (to another supported compression). So you should do that before you do this, if that applies to you. I use Dovecot but never enabled mail file compression so this did not affect me, Dovecot has continued working fine with the mail stores I look after. - Mariadb: If you happen to make use of the optional InnoDB Page Compression feature in Mariadb ( https://mariadb.com/kb/en/innodb-page-compression/ ), and if you happen to have chosen lzma compression for that feature (not the default) rather than one of the other 5 algorithms, then that is very unlucky, you will need to change that in your MariaDB installation in order to use one of the other 5 compression algorithms instead. dev-db/mariadb during build will automatically pick up support for the compression algorithms you have installed on the system, you don't currently specify anything in the ebuild that affects that. So if you have dev-db/mariadb installed you will have to rebuild it after removing xz utils as it links against liblzma.so.5 for this feature, and on rebuilding it you will lose support for lzma in InnoDB Page Compression. If you don't know if you are using it, this sql query will tell you: SHOW GLOBAL VARIABLES LIKE 'innodb_compression_algorithm'; On my MariaDB 10.6 server it returned: +------------------------------+-------+ | Variable_name | Value | +------------------------------+-------+ | innodb_compression_algorithm | zlib | +------------------------------+-------+ So I was not using lzma and was not affected. Tested: my MariaDB 10.6 server is now using rebuilt dev-db/mariadb without liblzma.so.5 and is running with no problems. - sys-apps/fwupd might stop working properly (though it will still build fine) due to what you have to change with dev-libs/libxmlb below. I'm not sure as I haven't checked yet, I just suspect it will. So bear that in mind if you need to rely on sys-apps/fwupd at the moment. But this "might" is temporary, upstream has now decided to make lzma optional, so this will trickle down to Gentoo soon. - app-arch/rpm will probably not be able to extract some rpm archives if they are compressed with xz, but I haven't checked that yet. Though it will still build fine. This does not affect building Gentoo packages which come with .rpm distfiles (e.g. libreoffice), Portage uses rpm2tgz for that and my script takes care of the rest. === The instructions === Follow them in order. 1. Do an emerge --sync and @world update first to make sure any upgrades/updates have been applied. Makes it easier for the things you need to do after you remove xz utils. 2. Install p7zip: emerge app-arch/p7zip 3. Add -lzma to USE flags in make.conf 4. Rebuild @world. This will rebuild only a few packages which respect -lzma 5. Copy the bash wrapper script to somewhere on the machine you are doing this on (but NOT to /usr/bin yet) 6. Prepare the script to be installed. Rename it to "xz" (with no extension), set permissions to 0755, owned by root:root. 7. On an SElinux installation, set the SElinux context of the script to whatever the current /usr/bin/xz binary is set to. 8. Remove xz utils, ignoring the warning about it being part of system: emerge --unmerge app-arch/xz-utils Once it is removed Portage will tell you that it preserved liblzma.so.5. More on that below. 9. Install the bash wrapper script to /usr/bin/xz 10. Add the following line: app-arch/xz-utils-5.4.2 to /etc/portage/profile/package.provided 11. Remove kde-apps/kdeutils-meta and kde-apps/ark if you use KDE, and media-gfx/gimp if you use it: emerge --unmerge kde-apps/kdeutils-meta kde-apps/ark media-gfx/gimp 12. (optional) Add -verify-sig to USE flags in make.conf. If you do you will soon have to rebuild all packages that rely on it. If you don't, you can just add USE="-verify-sig" in front of every emerge command you have to do from now on, or add to individual packages in your package.use file. 13. Now you will need to rebuild all packages with files that rely on the preserved liblzma.so.5 library. See below for further notes about that. 14. set: sync-rsync-verify-metamanifest = no in applicable files in /etc/portage/repos.conf/ before you do your next emerge --sync 15. Eventually, you will have to rebuild all packages that have corresponding signatures in sec-keys. That's all, enjoy life without app-arch/xz-utils! But read on for more info about step 13. === Notes about Step 13 === These are the packages that I needed to rebuild on my systems before the preserved liblzma.so.5 library was finally removed by Portage: app-arch/libarchive app-arch/rpm sys-boot/grub dev-db/mariadb dev-lang/python:2.7 kde-frameworks/karchive dev-lang/python:3.11 (needs custom ebuild, see below) dev-lang/python:3.12 (needs custom ebuild, see below) net-mail/dovecot (needs custom ebuild, see below) dev-libs/libxmlb (needs custom ebuild, see last note at the bottom of this guide) There might be others on your system. In most cases just rebuilding them will be enough. Some you might be able to clone the ebuild to your local repo and tweak configure/meson options so that the package does not link against liblzma.so.5. There may be packages with issues too difficult to resolve so you might have to just uninstall them if you can't live without them :-( (or resign yourself to rolling back and having to live with xz utils) Remember you will need to specify USE="-verify-sig" for any packages that rely on that, in whichever is your preferred way. From my list I had to clone the following 3 packages to my local ebuilds directory with small modification to each in order to get them to build without linking against liblzma.so.5: net-mail/dovecot dev-lang/python:3.11 dev-lang/python:3.12 Here are 3 diffs showing what I had to change: --- /usr/portage/net-mail/dovecot/dovecot-2.3.21-r1.ebuild +++ /usr/local/portage/net-mail/dovecot/dovecot-2.3.21-r1.ebuild @@ -43,7 +43,6 @@ DEPEND=" app-arch/bzip2 - app-arch/xz-utils dev-libs/icu:= dev-libs/openssl:0= sys-libs/zlib:= @@ -126,7 +125,7 @@ --disable-rpath \ --with-bzlib \ --without-libbsd \ - --with-lzma \ + --without-lzma \ --with-icu \ --with-ssl \ --with-zlib \ --- /usr/portage/dev-lang/python/python-3.11.8_p1.ebuild +++ /usr/local/portage/dev-lang/python/python-3.11.8_p1.ebuild @@ -179,6 +179,7 @@ # Avoid as many dependencies as possible for the cross build. cat >> Makefile <<-EOF || die MODULE_NIS_STATE=disabled + MODULE__LZMA_STATE=disabled MODULE__DBM_STATE=disabled MODULE__GDBM_STATE=disabled MODULE__DBM_STATE=disabled @@ -328,7 +329,7 @@ fi # force-disable modules we don't want built - local disable_modules=( NIS ) + local disable_modules=( NIS _LZMA ) use gdbm || disable_modules+=( _GDBM _DBM ) use sqlite || disable_modules+=( _SQLITE3 ) use ssl || disable_modules+=( _HASHLIB _SSL ) --- /usr/portage/dev-lang/python/python-3.12.2_p1.ebuild +++ /usr/local/portage/dev-lang/python/python-3.12.2_p1.ebuild @@ -177,6 +177,7 @@ cat > Modules/Setup.local <<-EOF || die *disabled* nis + _lzma _dbm _gdbm _sqlite3 _hashlib _ssl @@ -299,6 +300,7 @@ cat > Modules/Setup.local <<-EOF || die *disabled* nis + _lzma $(usev !gdbm '_gdbm _dbm') $(usev !sqlite '_sqlite3') $(usev !ssl '_hashlib _ssl') Lastly, I needed to create a custom dev-libs/libxmlb ebuild in order to upgrade it from 0.3.14 (latest in Gentoo at time of writing) to 0.3.15. I also needed to apply a very recent patch from upstream, from this commit, which makes LZMA support optional: https://github.com/hughsie/libxmlb/commit/bdf845510fbed40b88465b2272ccad9e93656639 and I needed to make some small changes to the ebuild. So this is what you need to do at the time of writing (6th April 2024): 1. Copy the in-tree /usr/portage/dev-libs/libxmlb ebuild directory into your local ebuilds directory. 2. Rename the ebuild file from libxmlb-0.3.14.ebuild to libxmlb-0.3.15.ebuild 3. Download the raw patch, you can use this link: https://github.com/hughsie/libxmlb/commit/bdf845510fbed40b88465b2272ccad9e93656639.patch rename it to: libxmlb-0.3.15-make_lzma_optional.patch and place it in the local "files" directory. 4. Modify the new ebuild according to the diff below. Then just rebuild it. --- /usr/portage/dev-libs/libxmlb/libxmlb-0.3.14.ebuild +++ /usr/local/portage/dev-libs/libxmlb/libxmlb-0.3.15.ebuild @@ -14,15 +14,15 @@ SLOT="0/2" # libxmlb.so version KEYWORDS="amd64 ~arm arm64 ~loong ppc ppc64 ~riscv x86" -IUSE="doc introspection stemmer test +zstd" +IUSE="doc introspection -lzma stemmer test +zstd" RESTRICT="!test? ( test )" RDEPEND=" - app-arch/xz-utils dev-libs/glib:2 sys-apps/util-linux stemmer? ( dev-libs/snowball-stemmer:= ) + lzma? ( app-arch/xz-utils:= ) zstd? ( app-arch/zstd:= ) " @@ -43,6 +43,7 @@ PATCHES=( "${FILESDIR}"/${PN}-0.3.12-no_installed_tests.patch + "${FILESDIR}"/${PN}-0.3.15-make_lzma_optional.patch ) python_check_deps() { @@ -60,6 +61,7 @@ $(meson_use stemmer) $(meson_use test tests) $(meson_use zstd) + $(meson_feature lzma) ) meson_src_configure } --------------gctadYlt1Z45q5mMqqyqL2RD Content-Type: text/plain; charset=UTF-8; name="xz.txt" Content-Disposition: attachment; filename="xz.txt" Content-Transfer-Encoding: base64 IyEvdXNyL2Jpbi9lbnYgYmFzaAoKIyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIu MC1vbmx5CiMgU1BEWC1GaWxlQ29weXJpZ2h0VGV4dDogMjAyNCBFZGRpZSBDaGFwbWFuIDxl ZGRpZUBlaHVrLm5ldD4KCiMgV0FSTklORzogdGhpcyBzY3JpcHQgaXMgY3VycmVudGx5IG5v dCBhIGZ1bGwgcmVwbGFjZW1lbnQgZm9yIHh6LCBpdCBqdXN0IG1pbWlja3MgCiMgc29tZSBv ZiB0aGUgZGVjb21wcmVzc2lvbiBmdW5jdGlvbmFsaXR5IG9mIHh6LiBJdCBpcyBvbmx5IGRl c2lnbmVkIGF0IHRoZQojIG1vbWVudCB0byBiZSBjYWxsZWQgYnkgUG9ydGFnZSBhbmQgZXZl biB0aGVuIGl0IGRvZXMgbm90IHlldCBjb3ZlciBhbGwgY2FzZXMgb2YgCiMgdGhhdC4KCiMg U29tZSBwbGFjZXMgaW4gcG9ydGFnZSB3aGVyZSB4eiBpcyBjYWxsZWQ6CiMgLSAvdXNyL2xp Yi9wb3J0YWdlL3B5dGhvbjMuMTEvcGhhc2UtaGVscGVycy5zaAojICAgICAgVGhpcyBpcyB3 aGVyZSA5OSUgb2YgY2FsbHMgdG8geHogaGFwcGVuLCBmcm9tIHRoZSBsaW5lOgojICAgICAg X191bnBhY2tfdGFyICJ4eiAtVCQoX19fbWFrZW9wdHNfam9icykgLWQiCiMgICAgICBpbiB0 aGUgdW5wYWNrIHBoYXNlLgojICAgICAgVGhpcyByZXN1bHRzIGluIGEgY2FsbCB0byB4eiBp bnNpZGUgX191bnBhY2tfdGFyKCkgd2hlcmUgdGhlIC1jIGFyZyBpcyBhZGRlZCAoZm9yIHN0 ZG91dCkKIyAgICAgIGFuZCB0aGUgZmlsZW5hbWUgaXMgYWRkZWQgYXMgYW4gYXJndW1lbnQu CiMgLSAvdXNyL2Jpbi9kZWIydGFyZ3oKIyAgICAgIFNvbWUgcGFja2FnZXMgZS5nLiBnb29n bGUtY2hyb21lIGhhdmUgZGViIGRpc3RmaWxlcyB3aGljaCBjYW4gY29udGFpbiBhIGRhdGEu dGFyLnh6CiMgICAgICBmaWxlIHNvIGRlYjJ0YXJneiBsYXVuY2hlcyB4eiAtZGMgdG8gZGVj b21wcmVzcyB0aGF0LgojIC0gL3Vzci9iaW4vcnBtMnRhcgojICAgICAgU29tZSBwYWNrYWdl cyBlLmcuIGxpYnJlb2ZmaWNlIGhhdmUgcnBtIGRpc3RmaWxlcyBjb21wcmVzc2VkIHdpdGgg eHogc28gcnBtMnRhciBsYXVuY2hlcyAKIyAgICAgIHh6IC1kYyB0byBkZWNvbXByZXNzIHRo ZW0KIyAtIC91c3IvcG9ydGFnZS9lY2xhc3MvbGx2bS5vcmcuZWNsYXNzCiMgICAgICB4eiBp cyBub3QgY2FsbGVkIGRpcmVjdGx5IGJ1dCB0YXIgLXggLUogaXMgcnVuIChhbmQgdGFyIHRo ZW4gcnVucyAieHogLWQiIHdpdGggcGlwZWQgCiMgICAgICBpbi9vdXQsIHdpdGggbm8gZmls ZSBhcyBhcmd1bWVudCkKCkxPR0dFUj0kKGNvbW1hbmQgLXYgbG9nZ2VyKQoKaWYgWyAhIC14 ICIke0xPR0dFUn0iIF07IHRoZW4KZWNobyAiKHdyYXBwZXIpOiBGYXRhbCBlcnJvcjogbG9n Z2VyIGNvbW1hbmQgZG9lcyBub3QgYXBwZWFyIHRvIGV4aXN0ISIKZXhpdCAxCmZpCgpMT0df UFJFRklYPSIod3JhcHBlcik6IgoKIyAvdXNyL2Jpbi83emEgaXMganVzdCBhIHdyYXBwZXIg dGhhdCBleGVjdXRlcyB0aGlzClNFVkVOX1pBPSIvdXNyL2xpYjY0L3A3emlwLzd6YSIKCkRB VEVfQ01EPSQoY29tbWFuZCAtdiBkYXRlKQpNS1RFTVBfQ01EPSQoY29tbWFuZCAtdiBta3Rl bXApClBTX0NNRD0kKGNvbW1hbmQgLXYgcHMpCkNBVF9DTUQ9JChjb21tYW5kIC12IGNhdCkK Q0hNT0Q9JChjb21tYW5kIC12IGNobW9kKQpXSE9BTUk9JChjb21tYW5kIC12IHdob2FtaSkK R1JFUD0kKGNvbW1hbmQgLXYgZ3JlcCkKRklMRV9DTUQ9JChjb21tYW5kIC12IGZpbGUpClJF QURMSU5LPSQoY29tbWFuZCAtdiByZWFkbGluaykKCmZvciBFWEVfRiBpbiAke1NFVkVOX1pB fSAke0RBVEVfQ01EfSAke01LVEVNUF9DTUR9ICR7UFNfQ01EfSAke0NBVF9DTUR9ICR7Q0hN T0R9IFwKJHtXSE9BTUl9ICR7R1JFUH0gJHtGSUxFX0NNRH0gJHtSRUFETElOS307IGRvCgoJ aWYgWyAhIC14ICIke0VYRV9GfSIgXTsgdGhlbgoJTVNHPSIke0xPR19QUkVGSVh9IEZhdGFs IEVycm9yOiAke0VYRV9GfSBkb2VzIG5vdCBleGlzdCBvciBpcyBub3QgYW4gZXhlISIKCSR7 TE9HR0VSfSAtcCBzeXNsb2cuZXJyIC10ICIkezB9IiAiJHtNU0d9IgoJZXhpdCAxCglmaQoK ZG9uZQoKREVDT01QUkVTU19SRVFVRVNURUQ9TgpTVERPVVRfUkVRVUVTVEVEPU4KCmZvciBt eWFyZyBpbiAiJHtAfSI7IGRvCgoJIyBMb29rIGZvciB0aGUgMyBmb3JtcyBvZiB4eidzIGRl Y29tcHJlc3MgYXJndW1lbnQgd2hlbiBpdCBpcyBieSBpdHNlbGYuCgkjIFRPLURPOiBjb2xs YXBzZSB0aGVzZSBpbnRvIG9uZSBncmVwIGNvbW1hbmQsIGltcHJvdmUgdGhlIGhvcnJpYmxl IHJlZ2V4LgoJZWNobyAiJHtteWFyZ30iIHwgJHtHUkVQfSAtRXEgJ15bLV1kJCcgCglyZXRB PSQ/CgllY2hvICIke215YXJnfSIgfCAke0dSRVB9IC1FcSAnXlstXVstXWRlY29tcHJlc3Mk JwoJcmV0Qj0kPwoJZWNobyAiJHtteWFyZ30iIHwgJHtHUkVQfSAtRXEgJ15bLV1bLV11bmNv bXByZXNzJCcKCXJldEM9JD8KCglpZiBbICR7cmV0QX0gLWVxIDAgXSB8fCBbICR7cmV0Qn0g LWVxIDAgXSB8fCBbICR7cmV0Q30gLWVxIDAgXTsgdGhlbgoJREVDT01QUkVTU19SRVFVRVNU RUQ9WQoJZmkKCgkjIExvb2sgZm9yIHRoZSAzIGZvcm1zIG9mIHh6J3Mgc3Rkb3V0IGFyZ3Vt ZW50IHdoZW4gaXQgaXMgYnkgaXRzZWxmLgoJIyBUTy1ETzogY29sbGFwc2UgdGhlc2UgaW50 byBvbmUgZ3JlcCBjb21tYW5kLCBpbXByb3ZlIHRoZSBob3JyaWJsZSByZWdleC4KCWVjaG8g IiR7bXlhcmd9IiB8ICR7R1JFUH0gLUVxICdeWy1dYyQnIAoJcmV0QT0kPwoJZWNobyAiJHtt eWFyZ30iIHwgJHtHUkVQfSAtRXEgJ15bLV1bLV10b1stXXN0ZG91dCQnCglyZXRCPSQ/Cgll Y2hvICIke215YXJnfSIgfCAke0dSRVB9IC1FcSAnXlstXVstXXN0ZG91dCQnCglyZXRDPSQ/ CgoJaWYgWyAke3JldEF9IC1lcSAwIF0gfHwgWyAke3JldEJ9IC1lcSAwIF0gfHwgWyAke3Jl dEN9IC1lcSAwIF07IHRoZW4KCVNURE9VVF9SRVFVRVNURUQ9WQoJZmkKCgkjIGFuZCBsb29r IGZvciBib3RoIHRvZ2V0aGVyIGFzIC1kYyBvciAtY2QKCSMgVE8tRE86IGNvbGxhcHNlIHRo ZXNlIGludG8gb25lIGdyZXAgY29tbWFuZCwgaW1wcm92ZSB0aGUgaG9ycmlibGUgcmVnZXgu CgllY2hvICIke215YXJnfSIgfCAke0dSRVB9IC1FcSAnXlstXWRjJCcgCglyZXRBPSQ/Cgll Y2hvICIke215YXJnfSIgfCAke0dSRVB9IC1FcSAnXlstXWNkJCcgCglyZXRCPSQ/CgoJaWYg WyAke3JldEF9IC1lcSAwIF0gfHwgWyAke3JldEJ9IC1lcSAwIF07IHRoZW4KCURFQ09NUFJF U1NfUkVRVUVTVEVEPVkKCVNURE9VVF9SRVFVRVNURUQ9WQoJZmkKCmRvbmUKCiMgVGhpcyBz Y3JpcHQgb25seSB0cmllcyB0byBkZWNvbXByZXNzLiBObyBjb21wcmVzcyBmdW5jdGlvbmFp bGl0eSBhdCBhbGwKIyBhdCB0aGlzIHN0YWdlIGluIGl0cyBkZXZlbG9wbWVudC4KaWYgWyAi JHtERUNPTVBSRVNTX1JFUVVFU1RFRH0iID0gIk4iIF07IHRoZW4KCglNU0c9IiR7TE9HX1BS RUZJWH0gRmF0YWwgRXJyb3I6IG5vIChkfGRlY29tcHJlc3N8dW5jb21wcmVzcykgb3B0aW9u IG9uIHRoZSBjb21tYW5kIGxpbmUuIFNvcnJ5LCB0aGlzIHdyYXBwZXIgc2NyaXB0IG9ubHkg c3VwcG9ydHMgZGVjb21wcmVzc2lvbi4iCgkjZWNobyAiJE1TRyIKCSR7TE9HR0VSfSAtcCBz eXNsb2cuZXJyIC10ICIkezB9IiAiJHtNU0d9IgoJZXhpdCAxCgpmaQoKIyBERUJVRwojTVNH PSIke0xPR19QUkVGSVh9IChERUJVRykgc3Rkb3V0IHJlcXVlc3RlZD8gJHtTVERPVVRfUkVR VUVTVEVEfSIKIyR7TE9HR0VSfSAtcCBzeXNsb2cuaW5mbyAtdCAiJHswfSIgIiR7TVNHfSIK CldIT19DQUxMRUQ9JCgke1dIT0FNSX0pCgojIGdldCB0aGUgcGFyZW50IGNvbW1hbmQsIHZl cnkgdXNlZnVsIGZvciBkZWJ1Z2dpbmcKUEFSRU5UX0NNRD0kKCR7UFNfQ01EfSAtbyBhcmdz PSAke1BQSUR9KQoKIyBERUJVRywgYXZvaWQgbGVhdmluZyBlbmFibGVkIGxvbmcgdGVybSBh cyBwb3RlbnRpYWwgZm9yIGZ1dHVyZSBzZWN1cml0eSBwcm9ibGVtLCAKIyBkdWUgdG8gdW5l c2NhcGVkIGF0dGFja2VyIGNvbnRyb2xsZWQgaW5mbyBiZWluZyBwYXNzZWQgdG8gbG9nZ2Vy CiNNU0c9IiR7TE9HX1BSRUZJWH0gKERFQlVHKSBVOiAke1dIT19DQUxMRUR9LCBQQVJFTlQ6 ICR7UEFSRU5UX0NNRH0sIEFSR1M6ICR7QH0iCiMke0xPR0dFUn0gLXAgc3lzbG9nLmluZm8g LXQgIiR7MH0iICIke01TR30iCgpmX3Bhc3NlZF90b19zY3JpcHQ9CgojIGxvb3Agb3ZlciBh cmdzIGFnYWluIHRvIHNlZSBpZiBhbnkgZmlsZSBoYXMgYmVlbiBwYXNzZWQgYXMgYW4gYXJn CiMgVE8tRE8gdGhlcmUgd2lsbCBiZSBhIGJldHRlciB3YXkgb2YgZG9pbmcgdGhpcy4KZm9y IG15YXJnIGluICIke0B9IjsgZG8KCgkjIFRPLURPLCBhcmUgdGhlcmUgb3RoZXIgcG9zc2li bGUgZXh0ZW5zaW9ucyBmb3IgeHouIEFsc28gdGhlb3JldGljYWxseSBwb3NzaWJsZSB3ZQoJ IyBjb3VsZCBiZSBwYXNzZWQgb25lIHdpdGggZXh0ZW5zaW9uIGluIGNhcHMuCgllY2hvICIk e215YXJnfSIgfCAke0dSRVB9IC1FcSAnWy5deHokJyAKCXI9JD8KCglpZiBbICR7cn0gLWVx IDAgXTsgdGhlbgoJZl9wYXNzZWRfdG9fc2NyaXB0PSIke215YXJnfSIKCWJyZWFrCglmaQoK ZG9uZQoKCmZ1bmN0aW9uIGRvX3VuY29tcHJlc3MgewoKCSMgcmVtZW1iZXIgcmV0dXJuIG51 bWJlcnMgY2FuIG9ubHkgYmUgYnR3IDAgLSAyNTUKCgkjIHNvbWUgc2FuaXR5IGNoZWNrcyBm b2xsb3cgLi4uCgoJaWYgWyAteiAiJHsxfSIgXTsgdGhlbgoJTVNHX1RPX1NIT1c9ImZ1bmN0 aW9uIHJlcXVpcmVzIDEgYXJndW1lbnQ7IGEgZmlsZW5hbWUgd2l0aCBvdXIgd2l0aG91dCBs ZWFkaW5nIHBhdGgiCglyZXR1cm4gMTg0CglmaQoKCXJlYWxmPSQoJHtSRUFETElOS30gLWUg IiR7MX0iIDI+L2Rldi9udWxsKQoKCWlmIFsgISAtZiAiJHtyZWFsZn0iIF07IHRoZW4KCU1T R19UT19TSE9XPSJhcmd1bWVudCBzdXBwbGllZCBlaXRoZXIgaXMgbm90IGEgZmlsZSBvciwg aWYgaXQgaXMgYSBmaWxlLCBJIGNhbm5vdCBmaW5kIGl0LiIKCXJldHVybiAxOTQKCWZpCgoJ aWYgISB0ZXN0IC1zICIke3JlYWxmfSI7IHRoZW4KCU1TR19UT19TSE9XPSJmaWxlIHN1cHBs aWVkIGlzIGVtcHR5ISIKCXJldHVybiAyMDQKCWZpCgoJaWYgWyAhIC1yICIke3JlYWxmfSIg XTsgdGhlbgoJTVNHX1RPX1NIT1c9ImZpbGUgc3VwcGxpZWQgY2Fubm90IGJlIHJlYWQhIgoJ cmV0dXJuIDIxNAoJZmkKCgkjIDd6IGRvZXMgbm90IGxpa2UgdGhlIGZpbGUgcGF0aCBiZWlu ZyBwYXNzZWQgdG8gaXQgaW5zaWRlIHF1b3Rlcy4gU28gbGV0cyBqdXN0IG1ha2UgCgkjIHN1 cmUgbm90IHRvIHBhc3MgaXQgYW55dGhpbmcgdGhhdCBjb250YWlucyBhbnkgY2hhcmFjdGVy cyBOT1QgaW4gb3VyIHNhbmUgbGlzdCAKCSMgaW4gb3VyIHJlZ2V4IGJlbG93IChzbyBub3Ro aW5nIG5lZWRzIHF1b3RpbmcgYXMgbm8gc2hlbGwgbWV0YWNoYXJzKS4KCSMgVE8tRE86IHRo ZXJlIHdpbGwgYmUgYSBiZXR0ZXIgd2F5IG9mIGRlYWxpbmcgd2l0aCB0aGlzLCBwcm9iIGJ5 IGNvbnZlcnRpbmcgdG8gYW4gCgkjIGVzY2FwZWQgc3RyaW5nLiBCdXQgZm9yIG5vdyAoMjAy NCkgaGF2ZW4ndCBjb21lIGFjcm9zcyBhbnkgZGlzdGZpbGVzIHdpdGggd2VpcmQgY2hhcnMg CgkjIGluIHRoZW0gdGhhbmtmdWxseS4KCWVjaG8gIiR7cmVhbGZ9IiB8ICR7R1JFUH0gLUV2 cSAnW0EtWmEtejAtOV86QCUrLy4tXScKCXI9JD8KCglpZiBbICR7cn0gLWVxIDAgXTsgdGhl bgoJTVNHX1RPX1NIT1c9ImZvdW5kIHVuc3VwcG9ydGVkIGNoYXJhY3RlcnMgaW4gdGhlIChy ZWFsKSBmaWxlIHBhdGguIgoJcmV0dXJuIDIyNAoJZmkKCgkjIE1ha2Ugc3VyZSB3ZSBoYXZl IGJlZW4gZ2l2ZW4gYW4geHogZmlsZS4KCSMgdGhlIC1lIGFyZ3VtZW50cyBleGNsdWRlIHRl c3RzIHdlJ3JlIG5vdCBpbnRlcmVzdGVkIGluLCBob3BlZnVsbHkgc29tZSB0aW55IHBlcmYg Z2FpbgoJIyBidXQgbW9yZSBpbXBvcnRhbnRseSByZWR1Y2UgYXR0YWNrIHN1cmZhY2UuCgkj IEFsc28gd2UgaGFlIGl0IG91dHB1dCB0aGUgbWltZSB0eXBlIHJhdGhlciB0aGFuIGEgaHVt YW4gcmVhZGFibGUgc3RyaW5nLCBtb3JlIHJlbGlhYmxlCgkke0ZJTEVfQ01EfSAtZSBhc2Np aSAtZSBjZGYgLWUgYXBwdHlwZSAtZSBjc3YgLWUgZWxmIC1lIGpzb24gLWUgc2ltaCAtZSB0 YXIgLS1taW1lICR7cmVhbGZ9IDI+L2Rldi9udWxsIHwgJHtHUkVQfSAtcSAnYXBwbGljYXRp b24veC14ejsnCglyPSQ/CgoJaWYgWyAke3J9IC1uZSAwIF07IHRoZW4KCU1TR19UT19TSE9X PSJmaWxlIHN1cHBsaWVkIGRvZXMgbm90IGFwcGVhciB0byBiZSBhbiB4eiBmaWxlLCBhY2Nv cmRpbmcgdG8gdGhlIGZpbGUgY29tbWFuZCIKCXJldHVybiAyMzQKCWZpCgoJIyBpbml0aWFs aXNlIHRoaXMgc3RyaW5nIGZvciB0aGUgN3phIHN0ZG91dCBvcHRpb24gKC1zbykuIEVtcHR5 IChubyBzdGRvdXQpIGJ5IGRlZmF1bHQuCglTVERPVVRfT1BUX1NUUj0nJwoJIyBhbmQgdGhp cyBzdHJpbmcgdG8sIGJ5IGRlZmF1bHQsIHJlZGlyZWN0IDd6YSBvdXRwdXQgdG8gL2Rldi9u dWxsLCBhcyBpdCBpcyBzb21ld2hhdAoJIyBjaGF0dHkgd2hlbiBkZWNvbXByZXNzaW5nLgoJ U1RET1VUX1JFRElSX1NUUj0nPi9kZXYvbnVsbCcKCgkjIElmIHRoZSB1bmNvbXByZXNzZWQg ZGF0YSBzaG91bGQgYmUgc2VudCB0byBzdGRvdXQgdGhlbiB0aGUgYWJvdmUgdmFycyBuZWVk IHRvIGJlIGNoYW5nZWQuCglpZiBbICIke1NURE9VVF9SRVFVRVNURUR9IiA9ICJZIiBdOyB0 aGVuCglTVERPVVRfT1BUX1NUUj0nLXNvJwoJU1RET1VUX1JFRElSX1NUUj0nJwoJZmkKCgkj IHdlIGN1cnJlbnRseSBzZXQgc3RkZXJyIHRvIHJlZGlyZWN0IHRvIC9kZXYvbnVsbCBhbHdh eXMuCglTVERFUlJfUkVESVJfU1RSPScyPi9kZXYvbnVsbCcKCglTRVZFTl9aQV9GVUxMX0NN RD0iJHtTRVZFTl9aQX0gZSAke3JlYWxmfSAke1NURE9VVF9PUFRfU1RSfSAtYmQgJHtTVERP VVRfUkVESVJfU1RSfSAke1NUREVSUl9SRURJUl9TVFJ9IgoKCU1TRz0iJHtMT0dfUFJFRklY fSBBYm91dCB0byBydW46ICR7U0VWRU5fWkFfRlVMTF9DTUR9IgoJJHtMT0dHRVJ9IC1wIHN5 c2xvZy5pbmZvIC10ICIkezB9IiAiJHtNU0d9IgoKCSMgSW4gOTklIG9mIGNhc2VzIHdlIHdp bGwgcmVkaXJlY3QgN3phIGRlY29tcHJlc3NlZCBvdXRwdXQgdG8gc3Rkb3V0ICgtc28pLgoJ IyBTbyBtYWtlIHJlYWxseSBzdXJlIG5vdGhpbmcgZ2V0cyBvdXRwdXQgdG8gc3Rkb3V0IGJ5 IHRoaXMgc2NyaXB0IGFmdGVyIHRoaXMgcG9pbnQhCgkjIExvZyBtZXNzYWdlcyBhbGwgb25s eSB0byBsb2dnZXIuCglldmFsICIke1NFVkVOX1pBX0ZVTExfQ01EfSIKCXJldHVybiAkPwoK fQoKbGFzdF9yPTAKTEFTVF9FUlJfTVNHPQoKIyBpZiBubyBmaWxlIHdhcyBkZXRlY3RlZCB3 ZSBhc3N1bWUgd2Ugd2lsbCBnZXQgY29tcHJlc3NlZCBkYXRhIHZpYSBzdGRpbgppZiBbIC16 ICIke2ZfcGFzc2VkX3RvX3NjcmlwdH0iIF07IHRoZW4KCgkjIFdlIGNyZWF0ZSBhIHRlbXAg ZmlsZSB0byBzYXZlIHRoZSBzdGRpbiBjb21wcmVzc2VkIGRhdGEgaW50byBhcyB0aGUgY3Vy cmVudCBwN3ppcCBwcm92aWRlZCAKCSMgN3phIGRvZXMgbm90IHdvcmsgcHJvcGVybHkgaWYg ZmVkIGRhdGEgdmlhIHN0ZGluLCB0aG91Z2ggYWNjb3JkaW5nIHRvIGRvY3MgaXQKCSMgc2hv dWxkIHdvcmssIHNvIHByb2JhYmx5IGEgYnVnLgoJIyBBbHNvIG5vdGUgd2l0aGluIHNhbmRi b3ggdG1wIHNwYWNlIGlzIG5vdCB0aGUgc3lzdGVtIC90bXAgQUZBSUNULgoJIyBVbmZvcnR1 bmF0ZWx5IHRoaXMgbWVhbnMgd2UgbmVlZCB0byBtYWtlIHN1cmUgd2UgaGF2ZSBlbm91Z2gg c3BhY2UgZm9yIHRoZSB1bmNvbXByZXNzZWQKCSMgZGF0YSBib3RoIGluIC90bXAgYXMgd2Vs bCBhcyB3aGljaGV2ZXIgZmlsZXN5c3RlbSB3ZSBzZXQgcG9ydGFnZSB0byBkbyBidWlsZHMg b24uCgoJbXl0Zj1gJHtNS1RFTVBfQ01EfWAKCXNsZWVwIDAuMwoKCSMgc2FuaXR5CglpZiBb IC1lICIke215dGZ9IiBdOyB0aGVuCgoJCSR7Q0hNT0R9IDA2MDAgIiR7bXl0Zn0iCgoJZWxz ZQoKCQlNU0c9IiR7TE9HX1BSRUZJWH0gRmF0YWwgRXJyb3I6IHNvbWV0aGluZyBoYXMgZ29u ZSB2ZXJ5IHdyb25nLCBubyB0ZW1wIGZpbGUgZXhpc3RzISIKCQkke0xPR0dFUn0gLXAgc3lz bG9nLmVyciAtdCAiJHswfSIgIiR7TVNHfSIKCQlleGl0IDEKCglmaQoKCSMgc2F2ZSBzdGRp biB0byBvdXIgdG1wZmlsZS4gcXVvdGVzIHNobGQgbm90IGJlIG5lZWRlZCBidXQsIHdoYXQg dGhlIGhlbGwsIG1pZ2h0IGFzIHdlbGwuCgljYXQgPiAiJHtteXRmfSIKCXI9JD8KCgkjIHNh bml0eQoJaWYgWyAke3J9IC1uZSAwIF07IHRoZW4KCgkJTVNHPSIke0xPR19QUkVGSVh9IEZh dGFsIEVycm9yOiBjYXQgcmV0dXJuZWQgbm9uLXplcm8gY29kZSBvZiAke3J9IHdoZW4gcmVk aXJlY3RpbmcgdG8gJHtteXRmfSEiCgkJJHtMT0dHRVJ9IC1wIHN5c2xvZy5lcnIgLXQgIiR7 MH0iICIke01TR30iCgkJZXhpdCAxCgoJZWxzZQoKCQkjIEV2ZW4gaWYgc3Rkb3V0IHdhcyBO T1QgcmVxdWVzdGVkIHVzaW5nIGEgY29tbWFuZCBsaW5lIGFyZ3VtZW50IChhbmQgdGh1cyBT VERPVVRfUkVRVUVTVEVEIHdpbGwgYmUgc2V0IHRvIE4pLAoJCSMgeHogYXNzdW1lcyB0aGF0 IHlvdSAqZG8qIHdhbnQgdGhlIHVuY29tcHJlc3NlZCBzdHJlYW0gdG8gZ28gdG8gc3Rkb3V0 IGlmIG5vIGZpbGUgd2FzIGdpdmVuIG9uIHRoZSBjb21tYW5kIGxpbmUgKG5hdHVyYWxseSku CgkJIyBTbyB3ZSBuZWVkIHRvIGZvcmNlIHRoaXMgdG8gWSBoZXJlIHRvIG1ha2Ugc3VyZSB0 aGF0IGhhcHBlbnMuCgkJU1RET1VUX1JFUVVFU1RFRD1ZCgoJCSMgSGF2aW5nIHNhdmVkIHN0 ZGluIHRvIHRoZSB0bXAgZmlsZSBhYm92ZSB3ZSBjYW4gbm93IGhhdmUgN3phIGRlY29tcHJl c3Mgc2FpZCB0bXAgZmlsZS4KCQkjIFJlbWVtYmVyIGZyb20gaGVyZSBvbiB3ZSBydW4gN3ph IHdoaWNoIHdpbGwgaW4gbW9zdCBjYXNlcyBvdXRwdXQgYmluYXJ5IGRhdGEgdG8gc3Rkb3V0 LgoJCSMgU28gbWFrZSBSRUFMTFkgc3VyZSBub3RoaW5nIGVsc2UgZ2V0cyBvdXRwdXQgYWZ0 ZXIgdGhpcyEKCQkjIExvZyBtZXNzYWdlcyBhbGwgb25seSB0byBsb2dnZXIuCgkJZG9fdW5j b21wcmVzcyAiJHtteXRmfSIKCQlsYXN0X3I9JD8KCgkJIyBlcnJvciBtZXNzYWdlIG51bWJl cnMgaW5zaWRlIGRvX3VuY29tcHJlc3MoKSwgaG9wZWZ1bGx5IG5vbmUgY2xhc2ggd2l0aCB0 aG9zZSB1c2VkIGJ5IDd6YQoJCWlmIFsgJHtsYXN0X3J9ID0gMTg0IF0gfHwgWyAke2xhc3Rf cn0gPSAxOTQgXSB8fCBbICR7bGFzdF9yfSA9IDIwNCBdIHx8IFsgJHtsYXN0X3J9ID0gMjE0 IF0gfHwgWyAke2xhc3Rfcn0gPSAyMjQgXSB8fCBbICR7bGFzdF9yfSA9IDIzNCBdOyB0aGVu CgoJCQlMQVNUX0VSUl9NU0c9ImRvX3VuY29tcHJlc3MoKTogJHtNU0dfVE9fU0hPV30iCgoJ CWVsaWYgWyAke2xhc3Rfcn0gLW5lIDAgXTsgdGhlbgoKCQkJTEFTVF9FUlJfTVNHPSI3emEg cmV0dXJuZWQgbm9uLXplcm8gY29kZSBvZiAke2xhc3Rfcn0gd2hlbiB0cnlpbmcgdG8gZGVj b21wcmVzcyBzdGRpbiEiCgoJCWZpCgoJZmkKCQoJIyB0aGlzIGlzIG91ciBjcmVhdGVkIHRl bXAgZmlsZSByYXRoZXIgdGhhbiBvbmUgc3VwcGxpZWQgdG8gdGhlIHNjcmlwdCBzbyBzaGxk IGJlIGRlbGV0ZWQKCXJtIC1mICIke215dGZ9IgoKZWxpZiBbIC1lICIke2ZfcGFzc2VkX3Rv X3NjcmlwdH0iIF07IHRoZW4KCgkjIFJlbWVtYmVyIGZyb20gaGVyZSBvbiB3ZSBydW4gN3ph IHdoaWNoIHdpbGwgaW4gbW9zdCBjYXNlcyBvdXRwdXQgYmluYXJ5IGRhdGEgdG8gc3Rkb3V0 LgoJIyBTbyBtYWtlIFJFQUxMWSBzdXJlIG5vdGhpbmcgZWxzZSBnZXRzIG91dHB1dCBhZnRl ciB0aGlzIQoJIyBMb2cgbWVzc2FnZXMgYWxsIG9ubHkgdG8gbG9nZ2VyLgoJZG9fdW5jb21w cmVzcyAiJHtmX3Bhc3NlZF90b19zY3JpcHR9IgoJbGFzdF9yPSQ/CgoJIyBlcnJvciBtZXNz YWdlIG51bWJlcnMgaW5zaWRlIGRvX3VuY29tcHJlc3MoKSwgaG9wZWZ1bGx5IG5vbmUgY2xh c2ggd2l0aCB0aG9zZSB1c2VkIGJ5IDd6YQoJaWYgWyAke2xhc3Rfcn0gPSAxODQgXSB8fCBb ICR7bGFzdF9yfSA9IDE5NCBdIHx8IFsgJHtsYXN0X3J9ID0gMjA0IF0gfHwgWyAke2xhc3Rf cn0gPSAyMTQgXSB8fCBbICR7bGFzdF9yfSA9IDIyNCBdIHx8IFsgJHtsYXN0X3J9ID0gMjM0 IF07IHRoZW4KCgkJTEFTVF9FUlJfTVNHPSJkb191bmNvbXByZXNzKCk6ICR7TVNHX1RPX1NI T1d9IgoKCWVsaWYgWyAke2xhc3Rfcn0gLW5lIDAgXTsgdGhlbgoKCQlMQVNUX0VSUl9NU0c9 Ijd6YSByZXR1cm5lZCBub24temVybyBjb2RlIG9mICR7bGFzdF9yfSB3aGVuIHRyeWluZyB0 byBkZWNvbXByZXNzIHRoZSBmaWxlISIKCglmaQoKCSMgN3phIGRvZXMgbm90IGRlbGV0ZSB0 aGUgb3JpZ2luYWwgZmlsZSBieSBkZWZhdWx0IGJ1dCB4eiBkb2VzCgkjIElmIHN0ZG91dCB3 YXMgbm90IHJlcXVlc3RlZCB0aGVuIHRoZXkgd2lsbCBiZSBleHBlY3RpbmcgdXMgdG8gZGVs ZXRlIGl0IHNvIGRvIHRoYXQuCgkjIFRPLURPOiBjYXRjaCAtLWtlZXAgYXJndW1lbnQgYW5k IGRvIG5vdCBkZWxldGUgaWYgaXQgaXMgcGFzc2VkCglpZiBbICIke1NURE9VVF9SRVFVRVNU RUR9IiA9ICJOIiBdOyB0aGVuCglybSAtZiAiJHtmX3Bhc3NlZF90b19zY3JpcHR9IgoJZmkK CmVsc2UKCglsYXN0X3I9MQoJTEFTVF9FUlJfTVNHPSJubyB2YWxpZCBmaWxlIHdhcyBmb3Vu ZCBpbiBzdXBwbGllZCBhcmd1bWVudHMgYW5kIHN0ZGluIHdhcyBub3QgYW4geHogc3RyZWFt ISIKCmZpCgppZiBbICR7bGFzdF9yfSAtbmUgMCBdOyB0aGVuCgoJJHtMT0dHRVJ9IC1wIHN5 c2xvZy5lcnIgLXQgIiR7MH0iICIke0xPR19QUkVGSVh9IEZhdGFsIEVycm9yOiAke0xBU1Rf RVJSX01TR30iID4vZGV2L251bGwgMj4mMQoJZXhpdCAxCgplbHNlCgoJZXhpdCAwCgpmaQoK --------------gctadYlt1Z45q5mMqqyqL2RD--