From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753911AbYL3XIe (ORCPT ); Tue, 30 Dec 2008 18:08:34 -0500 Received: (majordomo@vger.kernel.org) by vger.kernel.org id S1752379AbYL3XIV (ORCPT ); Tue, 30 Dec 2008 18:08:21 -0500 Received: from ozlabs.org ([203.10.76.45]:54920 "EHLO ozlabs.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751351AbYL3XIS (ORCPT ); Tue, 30 Dec 2008 18:08:18 -0500 From: Rusty Russell To: linux-kernel@vger.kernel.org, netdev@vger.kernel.org Subject: [RFC] cpualloc: improvements to per-cpu allocation Date: Wed, 31 Dec 2008 09:38:09 +1030 User-Agent: KMail/1.10.3 (Linux/2.6.27-9-generic; KDE/4.1.3; i686; ; ) Cc: catalin.marinas@arm.com, Christoph Lameter , Mathieu Desnoyers MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Disposition: inline Message-Id: <200812310938.09912.rusty@rustcorp.com.au> Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Transfer-Encoding: 8bit X-MIME-Autoconverted: from base64 to 8bit by alpha id mBV0RwMt000651 This finally uses the "static" per-cpu region for alloc_percpu. It includesa number of cleanups required to make that happen, and some cleanups are doneafterwards, with many more to come (eg. local_t is now more useful, if we sortthe semantics of what it should look like). http://git.kernel.org/pub/scm/linux/kernel/git/rusty/linux-2.6-cpualloc commit 6b24141396c424dd3b9979fc1b915a51636f6ad6Author: Rusty Russell Date: Wed Dec 31 09:21:46 2008 +1030 alloc_percpu: big_percpu_alloc Impact: New API We never allowed the dynamic per-cpu allocator to use the per-cpu region, waiting until that region became resizable. That was over 5 years ago. Christoph Lameter has demonstrated that small dynamic per-cpu allocations make sense, and most allocations are small. So we want to use the same efficient per-cpu access paths for alloc_percpu() memory. But some places really do allocate large amounts of percpu memory. We give them a separate API (equivalent to the current inefficient one). Signed-off-by: Rusty Russell commit b9b67f3c818b617bb47344a8574de8bcd5f6b294Author: Rusty Russell Date: Wed Dec 31 09:21:46 2008 +1030 alloc_percpu: Move SNMP and ip_rt_acct to big_percpu If we look at percpu allocations to boot an x86/32 "allyesconfig" kernel, we see the following: File and line Number Size Total net/ipv4/af_inet.c:1287 21 2048 43008 net/ipv4/af_inet.c:1290 21 2048 43008 net/ipv4/af_inet.c:1287 48 128 6144 net/ipv4/af_inet.c:1290 48 128 6144 net/ipv4/route.c:3258 1 4096 4096 net/ipv4/af_inet.c:1287 1 288 288 net/ipv4/af_inet.c:1290 1 288 288 net/ipv4/af_inet.c:1287 1 256 256 net/ipv4/af_inet.c:1290 1 256 256 net/ipv4/af_inet.c:1287 1 104 104 net/ipv4/af_inet.c:1290 1 104 104 Subtotal: 103696 Total (including other callers untouched by this patch) 117228 So networking is chubby: worst case about 100k per cpu for SNMP stats. This can be reduced, but it's still 88% of the percpu memory, and IA64 has a hardcoded limit of 64k at the moment. That's why these two callers get moved to big_percpu_alloc. Note: ip_rt_acct could be simplified and made more efficient by making it a DEFINE_PER_CPU. But DaveM made some argument about image size and I have far too much respect to argue with BloatBoy :) Signed-off-by: Rusty Russell Cc: netdev@vger.kernel.org commit d782824cdeacc530836661d98014a3872772d3a0Author: Rusty Russell Date: Wed Dec 31 09:21:47 2008 +1030 alloc_percpu: remove alignment on cpu_workqueue_struct. Since we're improving alloc_percpu, we don't need to waste space. On 32-bit this drops struct cpu_workqueue_struct from 128 to 64 bytes. File and line Number Size Total Before: kernel/workqueue.c:819 72 128 9126 After: kernel/workqueue.c:819 72 64 4608 It's still the biggest dynamic percpu user though. Signed-off-by: Rusty Russell commit 9eac9d07744882b52653d47fef6facd93d469b35Author: Rusty Russell Date: Wed Dec 31 09:21:47 2008 +1030 alloc_percpu: change percpu_ptr to per_cpu_ptr Impact: cleanup There are two allocated per-cpu accessor macros with almost identical spelling. The original and far more popular is per_cpu_ptr (44 files), so change over the other 4 files. Signed-off-by: Rusty Russell Cc: mingo@redhat.com Cc: lenb@kernel.org Cc: cpufreq@vger.kernel.org commit 1aebde676d5a1e4965e98de401cf60e9a8e35351Author: Rusty Russell Date: Wed Dec 31 09:21:48 2008 +1030 alloc_percpu: add align argument to __alloc_percpu. This prepares for a real __alloc_percpu, by adding an alignment argument. Only one place uses __alloc_percpu directly, and that's for a string. Signed-off-by: Rusty Russell Cc: Christoph Lameter Cc: Jens Axboe commit ba26c860d5d47896aee45ec5f13c0d7bd21a784aAuthor: Rusty Russell Date: Wed Dec 31 09:21:48 2008 +1030 alloc_percpu: make the per cpu reserve configurable and larger. This is based on Christoph Lameter's "cpualloc: make the per cpu reserve configurable" patch, and his "Increase default reserve percpu area" patch. Christoph did the hard work of figuring out what the number should be (based on converting the slub allocator). allyesconfig on x86-32 uses 7k before mounting root, so 10k seems reasonable. Signed-off-by: Rusty Russell Cc: Christoph Lameter commit f39b80d1009c1611f791b665640e8b41191733f2Author: Rusty Russell Date: Wed Dec 31 09:21:49 2008 +1030 alloc_percpu: make percpu_modalloc/modfree more generic Remove the "name" arg to percpu_modalloc, and make it zero memory. Make percpu_modfree take NULL without barfing. Make non-SMP versions do kzalloc/kfree. These trivial changes make it suitable for use as a general per-cpu allocator. Signed-off-by: Rusty Russell Cc: Christoph Lameter commit 98bd1519536ef62d283cee221232c3c2d6157218Author: Rusty Russell Date: Wed Dec 31 09:21:49 2008 +1030 alloc_percpu: expose percpu_modalloc and percpu_modfree This simply moves the percpu allocator functions from the module code to mm/allocpercpu.c. percpu_modinit is renamed percpu_alloc_init and called from init/main.c. (Note: this allocator will need to be weaned off krealloc for use in the slab allocator itself as Christoph does in one of his patches). Signed-off-by: Rusty Russell Cc: Christoph Lameter commit 5fe633a3432021d0cf719ab238f6c936ef99d5eeAuthor: Rusty Russell Date: Wed Dec 31 09:21:50 2008 +1030 alloc_percpu: switch over to (renamed) percpu_modfree. Now the switch: rename percpu_modalloc to __alloc_percpu, and percpu_modfree to free_percpu and export them. We delete the old ones, including the unused percpu_alloc, percpu_alloc_mask and percpu_ptr. per_cpu_ptr now uses RELOC_HIDE on per_cpu_offset, just like static per-cpu variables (not SHIFT_PERCPU_PTR: this has side effects on S/390 and Alpha). The Alpha changes are untested. Signed-off-by: Rusty Russell Cc: Christoph Lameter commit 5f930541571ae751b5b0639c0294c3109f76933fAuthor: Rusty Russell Date: Wed Dec 31 09:21:50 2008 +1030 alloc_percpu: documentation Since we can now endorse this interface without wincing, we should document it. Nothing has changed API-wise, but it's a nice cleanup. Signed-off-by: Rusty Russell Cc: Christoph Lameter commit 987afcb643485258568e02cd94e2b906969e080eAuthor: Rusty Russell Date: Wed Dec 31 09:21:51 2008 +1030 alloc_percpu: __get_cpu_ptr/get_cpu_ptr/put_cpu_ptr Now we have a decent implementation it makes sense to have an interface for "this cpu", analogous to __get_cpu_var. Alpha is untested. Signed-off-by: Rusty Russell Cc: Christoph Lameter commit ae6f86a1492dd62523ef8c75455b3b784799cefaAuthor: Rusty Russell Date: Wed Dec 31 09:21:52 2008 +1030 alloc_percpu: read_percpu_var / read_percpu_ptr Impact: New API get_cpu_var/get_cpu_ptr return lvalues, but for ia64 and x86/32 (and one day x86/64) there are more efficient ways if you just want an rvalue. The x86-specific versions have proven popular in that arch, so I expect they'll be popular generally. So introduce read_percpu_var and read_percpu_ptr. They are separate, because when we enlarge percpu areas IA64 is not going to be able to do its trick on abitrary per-cpu pointers, only vars (which are in the first 64k). Signed-off-by: Rusty Russell commit defbdecc2b971063c6311db91f0be6007306a9bdAuthor: Rusty Russell Date: Wed Dec 31 09:21:52 2008 +1030 alloc_percpu: rename percpu vars which cause name clashes. Currently DECLARE_PER_CPU vars have per_cpu__ prefixed to them, and this effectively puts them in a separate namespace. No surprise that they clash with other names when that prefix is removed. There may be others I've missed, but if so the transform is simple. Signed-off-by: Rusty Russell commit a56f30e8a075e8ce15b4dff8e3fe0edb9baff7eaAuthor: Rusty Russell Date: Wed Dec 31 09:21:53 2008 +1030 alloc_percpu: remove per_cpu__ prefix. Now that the return from alloc_percpu is compatible with the address of per-cpu vars, it makes sense to hand around the address of per-cpu variables. To make this sane, we remove the per_cpu__ prefix we used created to stop people accidentally using these vars directly. Now we have sparse, we can use that (next patch). Signed-off-by: Rusty Russell commit a3c45e59bb71da1a013e0063469c523fca50295bAuthor: Rusty Russell Date: Wed Dec 31 09:21:53 2008 +1030 alloc_percpu: use __percpu annotation for sparse. Add __percpu for sparse. We have to make __kernel "__attribute__((address_space(0)))" so we can cast to it. Signed-off-by: Rusty Russell Cc: Al Viro commit 1d8e4bd04436d08d66807bfc772f6adadf0eadf8Author: Rusty Russell Date: Wed Dec 31 09:21:54 2008 +1030 alloc_percpu: Use __get_cpu_ptr in block/ Impact: slight efficiency improvement on some archs. Let's use __get_cpu_ptr and get_cpu_ptr now, rather than per_cpu_ptr(..., smp_processor_id()). Signed-off-by: Rusty Russell Cc: Jens Axboe commit 7de8836a4c54bb950932508a2396b822bc41f939Author: Rusty Russell Date: Wed Dec 31 09:21:54 2008 +1030 alloc_percpu: Use __get_cpu_ptr in crypto/ Impact: slight efficiency improvement on some archs. Let's use __get_cpu_ptr and get_cpu_ptr now, rather than per_cpu_ptr(..., smp_processor_id()). Signed-off-by: Rusty Russell Cc: Herbert Xu commit 21307114ab782c98ae172f4bd1db6685de8f0269Author: Rusty Russell Date: Wed Dec 31 09:21:55 2008 +1030 alloc_percpu: Use __get_cpu_ptr in drivers/dma Impact: slight efficiency improvement on some archs. Let's use __get_cpu_ptr and get_cpu_ptr now, rather than per_cpu_ptr(..., smp_processor_id()). Signed-off-by: Rusty Russell Cc: Maciej Sosnowski Cc: Dan Williams commit c88c3d8ed7eea6bc06d1f128c86bc5f309d71235Author: Rusty Russell Date: Wed Dec 31 09:21:55 2008 +1030 alloc_percpu: Use __raw_get_cpu_ptr in fs/ext4 Impact: slight efficiency improvement on some archs. Let's use __raw_get_cpu_ptr now, rather than per_cpu_ptr(..., raw_smp_processor_id()). Signed-off-by: Rusty Russell Cc: Theodore Ts'o Cc: adilger@sun.com Cc: linux-ext4@vger.kernel.org commit 010674876450701d458cfb15d8d4c70388603cf6Author: Rusty Russell Date: Wed Dec 31 09:21:56 2008 +1030 alloc_percpu: Use get_cpu_ptr in fs/nfs Impact: slight efficiency improvement on some archs. Let's use get_cpu_ptr_ptr now, rather than per_cpu_ptr(..., smp_processor_id()). Note that now we have real dynamic per-cpu allocations, cacheline aligning should not win anything, and is a little antisocial. Signed-off-by: Rusty Russell Cc: Trond Myklebust Cc: linux-nfs@vger.kernel.org commit b456282af0715bd986d57cba6a629a5b71ca7692Author: Rusty Russell Date: Wed Dec 31 09:21:56 2008 +1030 alloc_percpu: Use __get_cpu_ptr in fs/xfs Impact: slight efficiency improvement on some archs. Let's use get_cpu_ptr now, rather than per_cpu_ptr(..., smp_processor_id()). Signed-off-by: Rusty Russell Cc: Tim Shimmin Cc: xfs@oss.sgi.com commit ea59384cda8cbeb40c5749f3b070df346667f7a7Author: Rusty Russell Date: Wed Dec 31 09:21:57 2008 +1030 alloc_percpu: Use __get_cpu_ptr / get_cpu_ptr / get_cpu_var in kernel Impact: slight efficiency improvement on some archs. Let's use __get_cpu_ptr and get_cpu_ptr now, rather than per_cpu_ptr(..., smp_processor_id()). Signed-off-by: Rusty Russell Cc: Thomas Gleixner Cc: Ingo Molnar Cc: Dipankar Sarma commit 9ba7023fdebca58d35f970bb66fbcd91403a9ab7Author: Rusty Russell Date: Wed Dec 31 09:21:57 2008 +1030 alloc_percpu: Use __get_cpu_ptr in networking Impact: slight efficiency improvement on some archs. Let's use __get_cpu_ptr and get_cpu_ptr now, rather than per_cpu_ptr(..., smp_processor_id()). (The nfconntrack code seems a bit confused over when raw_smp_processor_id() should be used: not here). Signed-off-by: Rusty Russell Cc: Hoang-Nam Nguyen Cc: Christoph Raisch Cc: netdev@vger.kernel.org Documentation/kernel-parameters.txt | 8 + arch/alpha/include/asm/percpu.h | 21 ++- arch/cris/arch-v10/kernel/entry.S | 2 +- arch/cris/arch-v32/mm/mmu.S | 2 +- arch/ia64/include/asm/percpu.h | 5 +- arch/ia64/kernel/ia64_ksyms.c | 4 +- arch/ia64/mm/discontig.c | 2 +- arch/parisc/lib/fixup.S | 8 +- arch/powerpc/platforms/pseries/hvCall.S | 2 +- arch/sparc64/kernel/rtrap.S | 8 +- arch/x86/include/asm/percpu.h | 24 ++- arch/x86/include/asm/timer.h | 5 +- arch/x86/kernel/cpu/cpufreq/acpi-cpufreq.c | 2 +- arch/x86/kernel/entry_64.S | 4 +- arch/x86/kernel/head_32.S | 2 +- arch/x86/kernel/head_64.S | 2 +- arch/x86/kernel/tsc.c | 4 +- arch/x86/xen/xen-asm_32.S | 4 +- block/blktrace.c | 4 +- crypto/async_tx/async_tx.c | 5 +- drivers/acpi/processor_perflib.c | 4 +- drivers/dma/dmaengine.c | 32 ++-- drivers/infiniband/hw/ehca/ehca_irq.c | 3 +- drivers/net/chelsio/sge.c | 5 +- drivers/net/loopback.c | 4 +- drivers/net/veth.c | 7 +- fs/ext4/mballoc.c | 2 +- fs/nfs/iostat.h | 10 +- fs/xfs/xfs_mount.c | 9 +- include/asm-generic/percpu.h | 60 ++++++- include/linux/compiler.h | 4 +- include/linux/percpu.h | 117 +++++++----- include/net/netfilter/nf_conntrack.h | 4 +- include/net/netfilter/nf_conntrack_ecache.h | 2 +- include/net/snmp.h | 12 +- init/main.c | 3 + kernel/lockdep.c | 11 +- kernel/module.c | 154 +--------------- kernel/posix-cpu-timers.c | 2 +- kernel/sched.c | 21 +- kernel/sched_stats.h | 4 +- kernel/softirq.c | 4 +- kernel/softlockup.c | 12 +- kernel/srcu.c | 4 +- kernel/stop_machine.c | 2 +- kernel/workqueue.c | 6 +- mm/allocpercpu.c | 265 ++++++++++++++++----------- mm/vmstat.c | 6 +- net/core/sock.c | 3 +- net/ipv4/af_inet.c | 14 +- net/ipv4/ip_input.c | 3 +- net/ipv4/route.c | 4 +- net/netfilter/nf_conntrack_ecache.c | 4 +- net/xfrm/xfrm_ipcomp.c | 20 +-- 54 files changed, 469 insertions(+), 466 deletions(-) {.n++%ݶw{.n+{G{ayʇڙ,jfhz_(階ݢj"mG?&~iOzv^m ?I From mboxrd@z Thu Jan 1 00:00:00 1970 From: Rusty Russell Subject: [RFC] cpualloc: improvements to per-cpu allocation Date: Wed, 31 Dec 2008 09:38:09 +1030 Message-ID: <200812310938.09912.rusty@rustcorp.com.au> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Cc: catalin.marinas@arm.com, Christoph Lameter , Mathieu Desnoyers To: linux-kernel@vger.kernel.org, netdev@vger.kernel.org Return-path: Received: from ozlabs.org ([203.10.76.45]:54920 "EHLO ozlabs.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751351AbYL3XIS (ORCPT ); Tue, 30 Dec 2008 18:08:18 -0500 Content-Disposition: inline Sender: netdev-owner@vger.kernel.org List-ID: VGhpcyBmaW5hbGx5IHVzZXMgdGhlICJzdGF0aWMiIHBlci1jcHUgcmVnaW9uIGZvciBhbGxvY19w ZXJjcHUuICBJdCBpbmNsdWRlcwphIG51bWJlciBvZiBjbGVhbnVwcyByZXF1aXJlZCB0byBtYWtl IHRoYXQgaGFwcGVuLCBhbmQgc29tZSBjbGVhbnVwcyBhcmUgZG9uZQphZnRlcndhcmRzLCB3aXRo IG1hbnkgbW9yZSB0byBjb21lIChlZy4gbG9jYWxfdCBpcyBub3cgbW9yZSB1c2VmdWwsIGlmIHdl IHNvcnQKdGhlIHNlbWFudGljcyBvZiB3aGF0IGl0IHNob3VsZCBsb29rIGxpa2UpLgoKICBodHRw Oi8vZ2l0Lmtlcm5lbC5vcmcvcHViL3NjbS9saW51eC9rZXJuZWwvZ2l0L3J1c3R5L2xpbnV4LTIu Ni1jcHVhbGxvYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIAoKY29tbWl0IDZiMjQxNDEzOTZjNDI0ZGQzYjk5NzlmYzFiOTE1YTUxNjM2 ZjZhZDYKQXV0aG9yOiBSdXN0eSBSdXNzZWxsIDxydXN0eUBydXN0Y29ycC5jb20uYXU+CkRhdGU6 ICAgV2VkIERlYyAzMSAwOToyMTo0NiAyMDA4ICsxMDMwCgogICAgYWxsb2NfcGVyY3B1OiBiaWdf cGVyY3B1X2FsbG9jCiAgICAKICAgIEltcGFjdDogTmV3IEFQSQogICAgCiAgICBXZSBuZXZlciBh bGxvd2VkIHRoZSBkeW5hbWljIHBlci1jcHUgYWxsb2NhdG9yIHRvIHVzZSB0aGUgcGVyLWNwdSBy ZWdpb24sCiAgICB3YWl0aW5nIHVudGlsIHRoYXQgcmVnaW9uIGJlY2FtZSByZXNpemFibGUuICBU aGF0IHdhcyBvdmVyIDUgeWVhcnMgYWdvLgogICAgCiAgICBDaHJpc3RvcGggTGFtZXRlciBoYXMg ZGVtb25zdHJhdGVkIHRoYXQgc21hbGwgZHluYW1pYyBwZXItY3B1IGFsbG9jYXRpb25zCiAgICBt YWtlIHNlbnNlLCBhbmQgbW9zdCBhbGxvY2F0aW9ucyBhcmUgc21hbGwuICBTbyB3ZSB3YW50IHRv IHVzZSB0aGUgc2FtZQogICAgZWZmaWNpZW50IHBlci1jcHUgYWNjZXNzIHBhdGhzIGZvciBhbGxv Y19wZXJjcHUoKSBtZW1vcnkuCiAgICAKICAgIEJ1dCBzb21lIHBsYWNlcyByZWFsbHkgZG8gYWxs b2NhdGUgbGFyZ2UgYW1vdW50cyBvZiBwZXJjcHUgbWVtb3J5LiAgV2UKICAgIGdpdmUgdGhlbSBh IHNlcGFyYXRlIEFQSSAoZXF1aXZhbGVudCB0byB0aGUgY3VycmVudCBpbmVmZmljaWVudCBvbmUp LgogICAgCiAgICBTaWduZWQtb2ZmLWJ5OiBSdXN0eSBSdXNzZWxsIDxydXN0eUBydXN0Y29ycC5j b20uYXU+Cgpjb21taXQgYjliNjdmM2M4MThiNjE3YmI0NzM0NGE4NTc0ZGU4YmNkNWY2YjI5NApB dXRob3I6IFJ1c3R5IFJ1c3NlbGwgPHJ1c3R5QHJ1c3Rjb3JwLmNvbS5hdT4KRGF0ZTogICBXZWQg RGVjIDMxIDA5OjIxOjQ2IDIwMDggKzEwMzAKCiAgICBhbGxvY19wZXJjcHU6IE1vdmUgU05NUCBh bmQgaXBfcnRfYWNjdCB0byBiaWdfcGVyY3B1CiAgICAKICAgIElmIHdlIGxvb2sgYXQgcGVyY3B1 IGFsbG9jYXRpb25zIHRvIGJvb3QgYW4geDg2LzMyICJhbGx5ZXNjb25maWciCiAgICBrZXJuZWws IHdlIHNlZSB0aGUgZm9sbG93aW5nOgogICAgCiAgICBGaWxlIGFuZCBsaW5lCQkJTnVtYmVyCQlT aXplCQlUb3RhbAogICAgbmV0L2lwdjQvYWZfaW5ldC5jOjEyODcJCSAyMQkJMjA0OAkJIDQzMDA4 CiAgICBuZXQvaXB2NC9hZl9pbmV0LmM6MTI5MAkJIDIxCQkyMDQ4CQkgNDMwMDgKICAgIG5ldC9p cHY0L2FmX2luZXQuYzoxMjg3CQkgNDgJCSAxMjgJCSAgNjE0NAogICAgbmV0L2lwdjQvYWZfaW5l dC5jOjEyOTAJCSA0OAkJIDEyOAkJICA2MTQ0CiAgICBuZXQvaXB2NC9yb3V0ZS5jOjMyNTgJCSAg MQkJNDA5NgkJICA0MDk2CiAgICBuZXQvaXB2NC9hZl9pbmV0LmM6MTI4NwkJICAxCQkgMjg4CQkg ICAyODgKICAgIG5ldC9pcHY0L2FmX2luZXQuYzoxMjkwCQkgIDEJCSAyODgJCSAgIDI4OAogICAg bmV0L2lwdjQvYWZfaW5ldC5jOjEyODcJCSAgMQkJIDI1NgkJICAgMjU2CiAgICBuZXQvaXB2NC9h Zl9pbmV0LmM6MTI5MAkJICAxCQkgMjU2CQkgICAyNTYKICAgIG5ldC9pcHY0L2FmX2luZXQuYzox Mjg3CQkgIDEJCSAxMDQJCSAgIDEwNAogICAgbmV0L2lwdjQvYWZfaW5ldC5jOjEyOTAJCSAgMQkJ IDEwNAkJICAgMTA0CiAgICBTdWJ0b3RhbDoJCQkJCQkJMTAzNjk2CiAgICAKICAgIFRvdGFsIChp bmNsdWRpbmcgb3RoZXIgY2FsbGVycyB1bnRvdWNoZWQgYnkgdGhpcyBwYXRjaCkJCTExNzIyOAog ICAgCiAgICBTbyBuZXR3b3JraW5nIGlzIGNodWJieTogd29yc3QgY2FzZSBhYm91dCAxMDBrIHBl ciBjcHUgZm9yIFNOTVAgc3RhdHMuCiAgICBUaGlzIGNhbiBiZSByZWR1Y2VkLCBidXQgaXQncyBz dGlsbCA4OCUgb2YgdGhlIHBlcmNwdSBtZW1vcnksIGFuZCBJQTY0CiAgICBoYXMgYSBoYXJkY29k ZWQgbGltaXQgb2YgNjRrIGF0IHRoZSBtb21lbnQuCiAgICAKICAgIFRoYXQncyB3aHkgdGhlc2Ug dHdvIGNhbGxlcnMgZ2V0IG1vdmVkIHRvIGJpZ19wZXJjcHVfYWxsb2MuCiAgICAKICAgIE5vdGU6 IGlwX3J0X2FjY3QgY291bGQgYmUgc2ltcGxpZmllZCBhbmQgbWFkZSBtb3JlIGVmZmljaWVudCBi eSBtYWtpbmcKICAgIGl0IGEgREVGSU5FX1BFUl9DUFUuICBCdXQgRGF2ZU0gbWFkZSBzb21lIGFy Z3VtZW50IGFib3V0IGltYWdlIHNpemUKICAgIGFuZCBJIGhhdmUgZmFyIHRvbyBtdWNoIHJlc3Bl Y3QgdG8gYXJndWUgd2l0aCBCbG9hdEJveSA6KQogICAgCiAgICBTaWduZWQtb2ZmLWJ5OiBSdXN0 eSBSdXNzZWxsIDxydXN0eUBydXN0Y29ycC5jb20uYXU+CiAgICBDYzogbmV0ZGV2QHZnZXIua2Vy bmVsLm9yZwoKY29tbWl0IGQ3ODI4MjRjZGVhY2M1MzA4MzY2NjFkOTgwMTRhMzg3Mjc3MmQzYTAK QXV0aG9yOiBSdXN0eSBSdXNzZWxsIDxydXN0eUBydXN0Y29ycC5jb20uYXU+CkRhdGU6ICAgV2Vk IERlYyAzMSAwOToyMTo0NyAyMDA4ICsxMDMwCgogICAgYWxsb2NfcGVyY3B1OiByZW1vdmUgYWxp Z25tZW50IG9uIGNwdV93b3JrcXVldWVfc3RydWN0LgogICAgCiAgICBTaW5jZSB3ZSdyZSBpbXBy b3ZpbmcgYWxsb2NfcGVyY3B1LCB3ZSBkb24ndCBuZWVkIHRvIHdhc3RlIHNwYWNlLgogICAgT24g MzItYml0IHRoaXMgZHJvcHMgc3RydWN0IGNwdV93b3JrcXVldWVfc3RydWN0IGZyb20gMTI4IHRv IDY0IGJ5dGVzLgogICAgCiAgICBGaWxlIGFuZCBsaW5lCQkJTnVtYmVyCQlTaXplCQlUb3RhbAog ICAgQmVmb3JlOgogICAgICBrZXJuZWwvd29ya3F1ZXVlLmM6ODE5CSA3MgkJIDEyOAkJIDkxMjYK ICAgIEFmdGVyOgogICAgICBrZXJuZWwvd29ya3F1ZXVlLmM6ODE5CSA3MgkJICA2NAkJIDQ2MDgK ICAgIAogICAgSXQncyBzdGlsbCB0aGUgYmlnZ2VzdCBkeW5hbWljIHBlcmNwdSB1c2VyIHRob3Vn aC4KICAgIAogICAgU2lnbmVkLW9mZi1ieTogUnVzdHkgUnVzc2VsbCA8cnVzdHlAcnVzdGNvcnAu Y29tLmF1PgoKY29tbWl0IDllYWM5ZDA3NzQ0ODgyYjUyNjUzZDQ3ZmVmNmZhY2Q5M2Q0NjliMzUK QXV0aG9yOiBSdXN0eSBSdXNzZWxsIDxydXN0eUBydXN0Y29ycC5jb20uYXU+CkRhdGU6ICAgV2Vk IERlYyAzMSAwOToyMTo0NyAyMDA4ICsxMDMwCgogICAgYWxsb2NfcGVyY3B1OiBjaGFuZ2UgcGVy Y3B1X3B0ciB0byBwZXJfY3B1X3B0cgogICAgCiAgICBJbXBhY3Q6IGNsZWFudXAKICAgIAogICAg VGhlcmUgYXJlIHR3byBhbGxvY2F0ZWQgcGVyLWNwdSBhY2Nlc3NvciBtYWNyb3Mgd2l0aCBhbG1v c3QgaWRlbnRpY2FsCiAgICBzcGVsbGluZy4gIFRoZSBvcmlnaW5hbCBhbmQgZmFyIG1vcmUgcG9w dWxhciBpcyBwZXJfY3B1X3B0ciAoNDQKICAgIGZpbGVzKSwgc28gY2hhbmdlIG92ZXIgdGhlIG90 aGVyIDQgZmlsZXMuCiAgICAKICAgIFNpZ25lZC1vZmYtYnk6IFJ1c3R5IFJ1c3NlbGwgPHJ1c3R5 QHJ1c3Rjb3JwLmNvbS5hdT4KICAgIENjOiBtaW5nb0ByZWRoYXQuY29tCiAgICBDYzogbGVuYkBr ZXJuZWwub3JnCiAgICBDYzogY3B1ZnJlcUB2Z2VyLmtlcm5lbC5vcmcKCmNvbW1pdCAxYWViZGU2 NzZkNWExZTQ5NjVlOThkZTQwMWNmNjBlOWE4ZTM1MzUxCkF1dGhvcjogUnVzdHkgUnVzc2VsbCA8 cnVzdHlAcnVzdGNvcnAuY29tLmF1PgpEYXRlOiAgIFdlZCBEZWMgMzEgMDk6MjE6NDggMjAwOCAr MTAzMAoKICAgIGFsbG9jX3BlcmNwdTogYWRkIGFsaWduIGFyZ3VtZW50IHRvIF9fYWxsb2NfcGVy Y3B1LgogICAgCiAgICBUaGlzIHByZXBhcmVzIGZvciBhIHJlYWwgX19hbGxvY19wZXJjcHUsIGJ5 IGFkZGluZyBhbiBhbGlnbm1lbnQgYXJndW1lbnQuCiAgICBPbmx5IG9uZSBwbGFjZSB1c2VzIF9f YWxsb2NfcGVyY3B1IGRpcmVjdGx5LCBhbmQgdGhhdCdzIGZvciBhIHN0cmluZy4KICAgIAogICAg U2lnbmVkLW9mZi1ieTogUnVzdHkgUnVzc2VsbCA8cnVzdHlAcnVzdGNvcnAuY29tLmF1PgogICAg Q2M6IENocmlzdG9waCBMYW1ldGVyIDxjbEBsaW51eC1mb3VuZGF0aW9uLm9yZz4KICAgIENjOiBK ZW5zIEF4Ym9lIDxheGJvZUBrZXJuZWwuZGs+Cgpjb21taXQgYmEyNmM4NjBkNWQ0Nzg5NmFlZTQ1 ZWM1ZjEzYzBkN2JkMjFhNzg0YQpBdXRob3I6IFJ1c3R5IFJ1c3NlbGwgPHJ1c3R5QHJ1c3Rjb3Jw LmNvbS5hdT4KRGF0ZTogICBXZWQgRGVjIDMxIDA5OjIxOjQ4IDIwMDggKzEwMzAKCiAgICBhbGxv Y19wZXJjcHU6IG1ha2UgdGhlIHBlciBjcHUgcmVzZXJ2ZSBjb25maWd1cmFibGUgYW5kIGxhcmdl ci4KICAgIAogICAgVGhpcyBpcyBiYXNlZCBvbiBDaHJpc3RvcGggTGFtZXRlcidzICJjcHVhbGxv YzogbWFrZSB0aGUgcGVyIGNwdQogICAgcmVzZXJ2ZSBjb25maWd1cmFibGUiIHBhdGNoLCBhbmQg aGlzICJJbmNyZWFzZSBkZWZhdWx0IHJlc2VydmUgcGVyY3B1CiAgICBhcmVhIiBwYXRjaC4KICAg IAogICAgQ2hyaXN0b3BoIGRpZCB0aGUgaGFyZCB3b3JrIG9mIGZpZ3VyaW5nIG91dCB3aGF0IHRo ZSBudW1iZXIgc2hvdWxkIGJlCiAgICAoYmFzZWQgb24gY29udmVydGluZyB0aGUgc2x1YiBhbGxv Y2F0b3IpLiAgYWxseWVzY29uZmlnIG9uIHg4Ni0zMiB1c2VzCiAgICA3ayBiZWZvcmUgbW91bnRp bmcgcm9vdCwgc28gMTBrIHNlZW1zIHJlYXNvbmFibGUuCiAgICAKICAgIFNpZ25lZC1vZmYtYnk6 IFJ1c3R5IFJ1c3NlbGwgPHJ1c3R5QHJ1c3Rjb3JwLmNvbS5hdT4KICAgIENjOiBDaHJpc3RvcGgg TGFtZXRlciA8Y2xAbGludXgtZm91bmRhdGlvbi5vcmc+Cgpjb21taXQgZjM5YjgwZDEwMDljMTYx MWY3OTFiNjY1NjQwZThiNDExOTE3MzNmMgpBdXRob3I6IFJ1c3R5IFJ1c3NlbGwgPHJ1c3R5QHJ1 c3Rjb3JwLmNvbS5hdT4KRGF0ZTogICBXZWQgRGVjIDMxIDA5OjIxOjQ5IDIwMDggKzEwMzAKCiAg ICBhbGxvY19wZXJjcHU6IG1ha2UgcGVyY3B1X21vZGFsbG9jL21vZGZyZWUgbW9yZSBnZW5lcmlj CiAgICAKICAgIFJlbW92ZSB0aGUgIm5hbWUiIGFyZyB0byBwZXJjcHVfbW9kYWxsb2MsIGFuZCBt YWtlIGl0IHplcm8gbWVtb3J5LgogICAgTWFrZSBwZXJjcHVfbW9kZnJlZSB0YWtlIE5VTEwgd2l0 aG91dCBiYXJmaW5nLgogICAgTWFrZSBub24tU01QIHZlcnNpb25zIGRvIGt6YWxsb2Mva2ZyZWUu CiAgICAKICAgIFRoZXNlIHRyaXZpYWwgY2hhbmdlcyBtYWtlIGl0IHN1aXRhYmxlIGZvciB1c2Ug YXMgYSBnZW5lcmFsIHBlci1jcHUKICAgIGFsbG9jYXRvci4KICAgIAogICAgU2lnbmVkLW9mZi1i eTogUnVzdHkgUnVzc2VsbCA8cnVzdHlAcnVzdGNvcnAuY29tLmF1PgogICAgQ2M6IENocmlzdG9w aCBMYW1ldGVyIDxjbEBsaW51eC1mb3VuZGF0aW9uLm9yZz4KCmNvbW1pdCA5OGJkMTUxOTUzNmVm NjJkMjgzY2VlMjIxMjMyYzNjMmQ2MTU3MjE4CkF1dGhvcjogUnVzdHkgUnVzc2VsbCA8cnVzdHlA cnVzdGNvcnAuY29tLmF1PgpEYXRlOiAgIFdlZCBEZWMgMzEgMDk6MjE6NDkgMjAwOCArMTAzMAoK ICAgIGFsbG9jX3BlcmNwdTogZXhwb3NlIHBlcmNwdV9tb2RhbGxvYyBhbmQgcGVyY3B1X21vZGZy ZWUKICAgIAogICAgVGhpcyBzaW1wbHkgbW92ZXMgdGhlIHBlcmNwdSBhbGxvY2F0b3IgZnVuY3Rp b25zIGZyb20gdGhlIG1vZHVsZSBjb2RlCiAgICB0byBtbS9hbGxvY3BlcmNwdS5jLiAgcGVyY3B1 X21vZGluaXQgaXMgcmVuYW1lZCBwZXJjcHVfYWxsb2NfaW5pdCBhbmQKICAgIGNhbGxlZCBmcm9t IGluaXQvbWFpbi5jLgogICAgCiAgICAoTm90ZTogdGhpcyBhbGxvY2F0b3Igd2lsbCBuZWVkIHRv IGJlIHdlYW5lZCBvZmYga3JlYWxsb2MgZm9yIHVzZSBpbgogICAgdGhlIHNsYWIgYWxsb2NhdG9y IGl0c2VsZiBhcyBDaHJpc3RvcGggZG9lcyBpbiBvbmUgb2YgaGlzIHBhdGNoZXMpLgogICAgCiAg ICBTaWduZWQtb2ZmLWJ5OiBSdXN0eSBSdXNzZWxsIDxydXN0eUBydXN0Y29ycC5jb20uYXU+CiAg ICBDYzogQ2hyaXN0b3BoIExhbWV0ZXIgPGNsQGxpbnV4LWZvdW5kYXRpb24ub3JnPgoKY29tbWl0 IDVmZTYzM2EzNDMyMDIxZDBjZjcxOWFiMjM4ZjZjOTM2ZWY5OWQ1ZWUKQXV0aG9yOiBSdXN0eSBS dXNzZWxsIDxydXN0eUBydXN0Y29ycC5jb20uYXU+CkRhdGU6ICAgV2VkIERlYyAzMSAwOToyMTo1 MCAyMDA4ICsxMDMwCgogICAgYWxsb2NfcGVyY3B1OiBzd2l0Y2ggb3ZlciB0byAocmVuYW1lZCkg cGVyY3B1X21vZGZyZWUuCiAgICAKICAgIE5vdyB0aGUgc3dpdGNoOiByZW5hbWUgcGVyY3B1X21v ZGFsbG9jIHRvIF9fYWxsb2NfcGVyY3B1LCBhbmQKICAgIHBlcmNwdV9tb2RmcmVlIHRvIGZyZWVf cGVyY3B1IGFuZCBleHBvcnQgdGhlbS4KICAgIAogICAgV2UgZGVsZXRlIHRoZSBvbGQgb25lcywg aW5jbHVkaW5nIHRoZSB1bnVzZWQgcGVyY3B1X2FsbG9jLAogICAgcGVyY3B1X2FsbG9jX21hc2sg YW5kIHBlcmNwdV9wdHIuCiAgICAKICAgIHBlcl9jcHVfcHRyIG5vdyB1c2VzIFJFTE9DX0hJREUg b24gcGVyX2NwdV9vZmZzZXQsIGp1c3QgbGlrZSBzdGF0aWMKICAgIHBlci1jcHUgdmFyaWFibGVz IChub3QgU0hJRlRfUEVSQ1BVX1BUUjogdGhpcyBoYXMgc2lkZSBlZmZlY3RzIG9uCiAgICBTLzM5 MCBhbmQgQWxwaGEpLgogICAgCiAgICBUaGUgQWxwaGEgY2hhbmdlcyBhcmUgdW50ZXN0ZWQuCiAg ICAKICAgIFNpZ25lZC1vZmYtYnk6IFJ1c3R5IFJ1c3NlbGwgPHJ1c3R5QHJ1c3Rjb3JwLmNvbS5h dT4KICAgIENjOiBDaHJpc3RvcGggTGFtZXRlciA8Y2xAbGludXgtZm91bmRhdGlvbi5vcmc+Cgpj b21taXQgNWY5MzA1NDE1NzFhZTc1MWI1YjA2MzljMDI5NGMzMTA5Zjc2OTMzZgpBdXRob3I6IFJ1 c3R5IFJ1c3NlbGwgPHJ1c3R5QHJ1c3Rjb3JwLmNvbS5hdT4KRGF0ZTogICBXZWQgRGVjIDMxIDA5 OjIxOjUwIDIwMDggKzEwMzAKCiAgICBhbGxvY19wZXJjcHU6IGRvY3VtZW50YXRpb24KICAgIAog ICAgU2luY2Ugd2UgY2FuIG5vdyBlbmRvcnNlIHRoaXMgaW50ZXJmYWNlIHdpdGhvdXQgd2luY2lu Zywgd2Ugc2hvdWxkCiAgICBkb2N1bWVudCBpdC4gICBOb3RoaW5nIGhhcyBjaGFuZ2VkIEFQSS13 aXNlLCBidXQgaXQncyBhIG5pY2UgY2xlYW51cC4KICAgIAogICAgU2lnbmVkLW9mZi1ieTogUnVz dHkgUnVzc2VsbCA8cnVzdHlAcnVzdGNvcnAuY29tLmF1PgogICAgQ2M6IENocmlzdG9waCBMYW1l dGVyIDxjbEBsaW51eC1mb3VuZGF0aW9uLm9yZz4KCmNvbW1pdCA5ODdhZmNiNjQzNDg1MjU4NTY4 ZTAyY2Q5NGUyYjkwNjk2OWUwODBlCkF1dGhvcjogUnVzdHkgUnVzc2VsbCA8cnVzdHlAcnVzdGNv cnAuY29tLmF1PgpEYXRlOiAgIFdlZCBEZWMgMzEgMDk6MjE6NTEgMjAwOCArMTAzMAoKICAgIGFs bG9jX3BlcmNwdTogX19nZXRfY3B1X3B0ci9nZXRfY3B1X3B0ci9wdXRfY3B1X3B0cgogICAgCiAg ICBOb3cgd2UgaGF2ZSBhIGRlY2VudCBpbXBsZW1lbnRhdGlvbiBpdCBtYWtlcyBzZW5zZSB0byBo YXZlIGFuCiAgICBpbnRlcmZhY2UgZm9yICJ0aGlzIGNwdSIsIGFuYWxvZ291cyB0byBfX2dldF9j cHVfdmFyLgogICAgCiAgICBBbHBoYSBpcyB1bnRlc3RlZC4KICAgIAogICAgU2lnbmVkLW9mZi1i eTogUnVzdHkgUnVzc2VsbCA8cnVzdHlAcnVzdGNvcnAuY29tLmF1PgogICAgQ2M6IENocmlzdG9w aCBMYW1ldGVyIDxjbEBsaW51eC1mb3VuZGF0aW9uLm9yZz4KCmNvbW1pdCBhZTZmODZhMTQ5MmRk NjI1MjNlZjhjNzU0NTViM2I3ODQ3OTljZWZhCkF1dGhvcjogUnVzdHkgUnVzc2VsbCA8cnVzdHlA cnVzdGNvcnAuY29tLmF1PgpEYXRlOiAgIFdlZCBEZWMgMzEgMDk6MjE6NTIgMjAwOCArMTAzMAoK ICAgIGFsbG9jX3BlcmNwdTogcmVhZF9wZXJjcHVfdmFyIC8gcmVhZF9wZXJjcHVfcHRyCiAgICAK ICAgIEltcGFjdDogTmV3IEFQSQogICAgCiAgICBnZXRfY3B1X3Zhci9nZXRfY3B1X3B0ciByZXR1 cm4gbHZhbHVlcywgYnV0IGZvciBpYTY0IGFuZCB4ODYvMzIgKGFuZCBvbmUKICAgIGRheSB4ODYv NjQpIHRoZXJlIGFyZSBtb3JlIGVmZmljaWVudCB3YXlzIGlmIHlvdSBqdXN0IHdhbnQgYW4gcnZh bHVlLgogICAgCiAgICBUaGUgeDg2LXNwZWNpZmljIHZlcnNpb25zIGhhdmUgcHJvdmVuIHBvcHVs YXIgaW4gdGhhdCBhcmNoLCBzbyBJIGV4cGVjdAogICAgdGhleSdsbCBiZSBwb3B1bGFyIGdlbmVy YWxseS4KICAgIAogICAgU28gaW50cm9kdWNlIHJlYWRfcGVyY3B1X3ZhciBhbmQgcmVhZF9wZXJj cHVfcHRyLiAgVGhleSBhcmUgc2VwYXJhdGUsCiAgICBiZWNhdXNlIHdoZW4gd2UgZW5sYXJnZSBw ZXJjcHUgYXJlYXMgSUE2NCBpcyBub3QgZ29pbmcgdG8gYmUgYWJsZSB0bwogICAgZG8gaXRzIHRy aWNrIG9uIGFiaXRyYXJ5IHBlci1jcHUgcG9pbnRlcnMsIG9ubHkgdmFycyAod2hpY2ggYXJlIGlu IHRoZQogICAgZmlyc3QgNjRrKS4KICAgIAogICAgU2lnbmVkLW9mZi1ieTogUnVzdHkgUnVzc2Vs bCA8cnVzdHlAcnVzdGNvcnAuY29tLmF1PgoKY29tbWl0IGRlZmJkZWNjMmI5NzEwNjNjNjMxMWRi OTFmMGJlNjAwNzMwNmE5YmQKQXV0aG9yOiBSdXN0eSBSdXNzZWxsIDxydXN0eUBydXN0Y29ycC5j b20uYXU+CkRhdGU6ICAgV2VkIERlYyAzMSAwOToyMTo1MiAyMDA4ICsxMDMwCgogICAgYWxsb2Nf cGVyY3B1OiByZW5hbWUgcGVyY3B1IHZhcnMgd2hpY2ggY2F1c2UgbmFtZSBjbGFzaGVzLgogICAg CiAgICBDdXJyZW50bHkgREVDTEFSRV9QRVJfQ1BVIHZhcnMgaGF2ZSBwZXJfY3B1X18gcHJlZml4 ZWQgdG8gdGhlbSwgYW5kCiAgICB0aGlzIGVmZmVjdGl2ZWx5IHB1dHMgdGhlbSBpbiBhIHNlcGFy YXRlIG5hbWVzcGFjZS4gIE5vIHN1cnByaXNlIHRoYXQKICAgIHRoZXkgY2xhc2ggd2l0aCBvdGhl ciBuYW1lcyB3aGVuIHRoYXQgcHJlZml4IGlzIHJlbW92ZWQuCiAgICAKICAgIFRoZXJlIG1heSBi ZSBvdGhlcnMgSSd2ZSBtaXNzZWQsIGJ1dCBpZiBzbyB0aGUgdHJhbnNmb3JtIGlzIHNpbXBsZS4K ICAgIAogICAgU2lnbmVkLW9mZi1ieTogUnVzdHkgUnVzc2VsbCA8cnVzdHlAcnVzdGNvcnAuY29t LmF1PgoKY29tbWl0IGE1NmYzMGU4YTA3NWU4Y2UxNWI0ZGZmOGUzZmUwZWRiOWJhZmY3ZWEKQXV0 aG9yOiBSdXN0eSBSdXNzZWxsIDxydXN0eUBydXN0Y29ycC5jb20uYXU+CkRhdGU6ICAgV2VkIERl YyAzMSAwOToyMTo1MyAyMDA4ICsxMDMwCgogICAgYWxsb2NfcGVyY3B1OiByZW1vdmUgcGVyX2Nw dV9fIHByZWZpeC4KICAgIAogICAgTm93IHRoYXQgdGhlIHJldHVybiBmcm9tIGFsbG9jX3BlcmNw dSBpcyBjb21wYXRpYmxlIHdpdGggdGhlIGFkZHJlc3MKICAgIG9mIHBlci1jcHUgdmFycywgaXQg bWFrZXMgc2Vuc2UgdG8gaGFuZCBhcm91bmQgdGhlIGFkZHJlc3Mgb2YgcGVyLWNwdQogICAgdmFy aWFibGVzLiAgVG8gbWFrZSB0aGlzIHNhbmUsIHdlIHJlbW92ZSB0aGUgcGVyX2NwdV9fIHByZWZp eCB3ZSB1c2VkCiAgICBjcmVhdGVkIHRvIHN0b3AgcGVvcGxlIGFjY2lkZW50YWxseSB1c2luZyB0 aGVzZSB2YXJzIGRpcmVjdGx5LgogICAgCiAgICBOb3cgd2UgaGF2ZSBzcGFyc2UsIHdlIGNhbiB1 c2UgdGhhdCAobmV4dCBwYXRjaCkuCiAgICAKICAgIFNpZ25lZC1vZmYtYnk6IFJ1c3R5IFJ1c3Nl bGwgPHJ1c3R5QHJ1c3Rjb3JwLmNvbS5hdT4KCmNvbW1pdCBhM2M0NWU1OWJiNzFkYTFhMDEzZTAw NjM0NjljNTIzZmNhNTAyOTViCkF1dGhvcjogUnVzdHkgUnVzc2VsbCA8cnVzdHlAcnVzdGNvcnAu Y29tLmF1PgpEYXRlOiAgIFdlZCBEZWMgMzEgMDk6MjE6NTMgMjAwOCArMTAzMAoKICAgIGFsbG9j X3BlcmNwdTogdXNlIF9fcGVyY3B1IGFubm90YXRpb24gZm9yIHNwYXJzZS4KICAgIAogICAgQWRk IF9fcGVyY3B1IGZvciBzcGFyc2UuCiAgICAKICAgIFdlIGhhdmUgdG8gbWFrZSBfX2tlcm5lbCAi X19hdHRyaWJ1dGVfXygoYWRkcmVzc19zcGFjZSgwKSkpIiBzbyB3ZSBjYW4KICAgIGNhc3QgdG8g aXQuCiAgICAKICAgIFNpZ25lZC1vZmYtYnk6IFJ1c3R5IFJ1c3NlbGwgPHJ1c3R5QHJ1c3Rjb3Jw LmNvbS5hdT4KICAgIENjOiBBbCBWaXJvIDx2aXJvQHplbml2LmxpbnV4Lm9yZy51az4KCmNvbW1p dCAxZDhlNGJkMDQ0MzZkMDhkNjY4MDdiZmM3NzJmNmFkYWRmMGVhZGY4CkF1dGhvcjogUnVzdHkg UnVzc2VsbCA8cnVzdHlAcnVzdGNvcnAuY29tLmF1PgpEYXRlOiAgIFdlZCBEZWMgMzEgMDk6MjE6 NTQgMjAwOCArMTAzMAoKICAgIGFsbG9jX3BlcmNwdTogVXNlIF9fZ2V0X2NwdV9wdHIgaW4gYmxv Y2svCiAgICAKICAgIEltcGFjdDogc2xpZ2h0IGVmZmljaWVuY3kgaW1wcm92ZW1lbnQgb24gc29t ZSBhcmNocy4KICAgIAogICAgTGV0J3MgdXNlIF9fZ2V0X2NwdV9wdHIgYW5kIGdldF9jcHVfcHRy IG5vdywgcmF0aGVyIHRoYW4KICAgIHBlcl9jcHVfcHRyKC4uLiwgc21wX3Byb2Nlc3Nvcl9pZCgp KS4KICAgIAogICAgU2lnbmVkLW9mZi1ieTogUnVzdHkgUnVzc2VsbCA8cnVzdHlAcnVzdGNvcnAu Y29tLmF1PgogICAgQ2M6IEplbnMgQXhib2UgPGF4Ym9lQGtlcm5lbC5kaz4KCmNvbW1pdCA3ZGU4 ODM2YTRjNTRiYjk1MDkzMjUwOGEyMzk2YjgyMmJjNDFmOTM5CkF1dGhvcjogUnVzdHkgUnVzc2Vs bCA8cnVzdHlAcnVzdGNvcnAuY29tLmF1PgpEYXRlOiAgIFdlZCBEZWMgMzEgMDk6MjE6NTQgMjAw OCArMTAzMAoKICAgIGFsbG9jX3BlcmNwdTogVXNlIF9fZ2V0X2NwdV9wdHIgaW4gY3J5cHRvLwog ICAgCiAgICBJbXBhY3Q6IHNsaWdodCBlZmZpY2llbmN5IGltcHJvdmVtZW50IG9uIHNvbWUgYXJj aHMuCiAgICAKICAgIExldCdzIHVzZSBfX2dldF9jcHVfcHRyIGFuZCBnZXRfY3B1X3B0ciBub3cs IHJhdGhlciB0aGFuCiAgICBwZXJfY3B1X3B0ciguLi4sIHNtcF9wcm9jZXNzb3JfaWQoKSkuCiAg ICAKICAgIFNpZ25lZC1vZmYtYnk6IFJ1c3R5IFJ1c3NlbGwgPHJ1c3R5QHJ1c3Rjb3JwLmNvbS5h dT4KICAgIENjOiBIZXJiZXJ0IFh1IDxoZXJiZXJ0QGdvbmRvci5hcGFuYS5vcmcuYXU+Cgpjb21t aXQgMjEzMDcxMTRhYjc4MmM5OGFlMTcyZjRiZDFkYjY2ODVkZThmMDI2OQpBdXRob3I6IFJ1c3R5 IFJ1c3NlbGwgPHJ1c3R5QHJ1c3Rjb3JwLmNvbS5hdT4KRGF0ZTogICBXZWQgRGVjIDMxIDA5OjIx OjU1IDIwMDggKzEwMzAKCiAgICBhbGxvY19wZXJjcHU6IFVzZSBfX2dldF9jcHVfcHRyIGluIGRy aXZlcnMvZG1hCiAgICAKICAgIEltcGFjdDogc2xpZ2h0IGVmZmljaWVuY3kgaW1wcm92ZW1lbnQg b24gc29tZSBhcmNocy4KICAgIAogICAgTGV0J3MgdXNlIF9fZ2V0X2NwdV9wdHIgYW5kIGdldF9j cHVfcHRyIG5vdywgcmF0aGVyIHRoYW4KICAgIHBlcl9jcHVfcHRyKC4uLiwgc21wX3Byb2Nlc3Nv cl9pZCgpKS4KICAgIAogICAgU2lnbmVkLW9mZi1ieTogUnVzdHkgUnVzc2VsbCA8cnVzdHlAcnVz dGNvcnAuY29tLmF1PgogICAgQ2M6IE1hY2llaiBTb3Nub3dza2kgPG1hY2llai5zb3Nub3dza2lA aW50ZWwuY29tPgogICAgQ2M6IERhbiBXaWxsaWFtcyA8ZGFuLmoud2lsbGlhbXNAaW50ZWwuY29t PgoKY29tbWl0IGM4OGMzZDhlZDdlZWE2YmMwNmQxZjEyOGM4NmJjNWYzMDlkNzEyMzUKQXV0aG9y OiBSdXN0eSBSdXNzZWxsIDxydXN0eUBydXN0Y29ycC5jb20uYXU+CkRhdGU6ICAgV2VkIERlYyAz MSAwOToyMTo1NSAyMDA4ICsxMDMwCgogICAgYWxsb2NfcGVyY3B1OiBVc2UgX19yYXdfZ2V0X2Nw dV9wdHIgaW4gZnMvZXh0NAogICAgCiAgICBJbXBhY3Q6IHNsaWdodCBlZmZpY2llbmN5IGltcHJv dmVtZW50IG9uIHNvbWUgYXJjaHMuCiAgICAKICAgIExldCdzIHVzZSBfX3Jhd19nZXRfY3B1X3B0 ciBub3csIHJhdGhlciB0aGFuIHBlcl9jcHVfcHRyKC4uLiwKICAgIHJhd19zbXBfcHJvY2Vzc29y X2lkKCkpLgogICAgCiAgICBTaWduZWQtb2ZmLWJ5OiBSdXN0eSBSdXNzZWxsIDxydXN0eUBydXN0 Y29ycC5jb20uYXU+CiAgICBDYzogVGhlb2RvcmUgVHMnbyA8dHl0c29AbWl0LmVkdT4KICAgIENj OiBhZGlsZ2VyQHN1bi5jb20KICAgIENjOiBsaW51eC1leHQ0QHZnZXIua2VybmVsLm9yZwoKY29t bWl0IDAxMDY3NDg3NjQ1MDcwMWQ0NThjZmIxNWQ4ZDRjNzAzODg2MDNjZjYKQXV0aG9yOiBSdXN0 eSBSdXNzZWxsIDxydXN0eUBydXN0Y29ycC5jb20uYXU+CkRhdGU6ICAgV2VkIERlYyAzMSAwOToy MTo1NiAyMDA4ICsxMDMwCgogICAgYWxsb2NfcGVyY3B1OiBVc2UgZ2V0X2NwdV9wdHIgaW4gZnMv bmZzCiAgICAKICAgIEltcGFjdDogc2xpZ2h0IGVmZmljaWVuY3kgaW1wcm92ZW1lbnQgb24gc29t ZSBhcmNocy4KICAgIAogICAgTGV0J3MgdXNlIGdldF9jcHVfcHRyX3B0ciBub3csIHJhdGhlciB0 aGFuIHBlcl9jcHVfcHRyKC4uLiwgc21wX3Byb2Nlc3Nvcl9pZCgpKS4KICAgIAogICAgTm90ZSB0 aGF0IG5vdyB3ZSBoYXZlIHJlYWwgZHluYW1pYyBwZXItY3B1IGFsbG9jYXRpb25zLCBjYWNoZWxp bmUgYWxpZ25pbmcKICAgIHNob3VsZCBub3Qgd2luIGFueXRoaW5nLCBhbmQgaXMgYSBsaXR0bGUg YW50aXNvY2lhbC4KICAgIAogICAgU2lnbmVkLW9mZi1ieTogUnVzdHkgUnVzc2VsbCA8cnVzdHlA cnVzdGNvcnAuY29tLmF1PgogICAgQ2M6IFRyb25kIE15a2xlYnVzdCA8VHJvbmQuTXlrbGVidXN0 QG5ldGFwcC5jb20+CiAgICBDYzogbGludXgtbmZzQHZnZXIua2VybmVsLm9yZwoKY29tbWl0IGI0 NTYyODJhZjA3MTViZDk4NmQ1N2NiYTZhNjI5YTViNzFjYTc2OTIKQXV0aG9yOiBSdXN0eSBSdXNz ZWxsIDxydXN0eUBydXN0Y29ycC5jb20uYXU+CkRhdGU6ICAgV2VkIERlYyAzMSAwOToyMTo1NiAy MDA4ICsxMDMwCgogICAgYWxsb2NfcGVyY3B1OiBVc2UgX19nZXRfY3B1X3B0ciBpbiBmcy94ZnMK ICAgIAogICAgSW1wYWN0OiBzbGlnaHQgZWZmaWNpZW5jeSBpbXByb3ZlbWVudCBvbiBzb21lIGFy Y2hzLgogICAgCiAgICBMZXQncyB1c2UgZ2V0X2NwdV9wdHIgbm93LCByYXRoZXIgdGhhbiBwZXJf Y3B1X3B0ciguLi4sIHNtcF9wcm9jZXNzb3JfaWQoKSkuCiAgICAKICAgIFNpZ25lZC1vZmYtYnk6 IFJ1c3R5IFJ1c3NlbGwgPHJ1c3R5QHJ1c3Rjb3JwLmNvbS5hdT4KICAgIENjOiBUaW0gU2hpbW1p biA8eGZzLW1hc3RlcnNAb3NzLnNnaS5jb20+CiAgICBDYzogeGZzQG9zcy5zZ2kuY29tCgpjb21t aXQgZWE1OTM4NGNkYThjYmViNDBjNTc0OWYzYjA3MGRmMzQ2NjY3ZjdhNwpBdXRob3I6IFJ1c3R5 IFJ1c3NlbGwgPHJ1c3R5QHJ1c3Rjb3JwLmNvbS5hdT4KRGF0ZTogICBXZWQgRGVjIDMxIDA5OjIx OjU3IDIwMDggKzEwMzAKCiAgICBhbGxvY19wZXJjcHU6IFVzZSBfX2dldF9jcHVfcHRyIC8gZ2V0 X2NwdV9wdHIgLyBnZXRfY3B1X3ZhciBpbiBrZXJuZWwKICAgIAogICAgSW1wYWN0OiBzbGlnaHQg ZWZmaWNpZW5jeSBpbXByb3ZlbWVudCBvbiBzb21lIGFyY2hzLgogICAgCiAgICBMZXQncyB1c2Ug X19nZXRfY3B1X3B0ciBhbmQgZ2V0X2NwdV9wdHIgbm93LCByYXRoZXIgdGhhbgogICAgcGVyX2Nw dV9wdHIoLi4uLCBzbXBfcHJvY2Vzc29yX2lkKCkpLgogICAgCiAgICBTaWduZWQtb2ZmLWJ5OiBS dXN0eSBSdXNzZWxsIDxydXN0eUBydXN0Y29ycC5jb20uYXU+CiAgICBDYzogVGhvbWFzIEdsZWl4 bmVyIDx0Z2x4QGxpbnV0cm9uaXguZGU+CiAgICBDYzogSW5nbyBNb2xuYXIgPG1pbmdvQGVsdGUu aHU+CiAgICBDYzogRGlwYW5rYXIgU2FybWEgPGRpcGFua2FyQGluLmlibS5jb20+Cgpjb21taXQg OWJhNzAyM2ZkZWJjYTU4ZDM1Zjk3MGJiNjZmYmNkOTE0MDNhOWFiNwpBdXRob3I6IFJ1c3R5IFJ1 c3NlbGwgPHJ1c3R5QHJ1c3Rjb3JwLmNvbS5hdT4KRGF0ZTogICBXZWQgRGVjIDMxIDA5OjIxOjU3 IDIwMDggKzEwMzAKCiAgICBhbGxvY19wZXJjcHU6IFVzZSBfX2dldF9jcHVfcHRyIGluIG5ldHdv cmtpbmcKICAgIAogICAgSW1wYWN0OiBzbGlnaHQgZWZmaWNpZW5jeSBpbXByb3ZlbWVudCBvbiBz b21lIGFyY2hzLgogICAgCiAgICBMZXQncyB1c2UgX19nZXRfY3B1X3B0ciBhbmQgZ2V0X2NwdV9w dHIgbm93LCByYXRoZXIgdGhhbgogICAgcGVyX2NwdV9wdHIoLi4uLCBzbXBfcHJvY2Vzc29yX2lk KCkpLgogICAgCiAgICAoVGhlIG5mY29ubnRyYWNrIGNvZGUgc2VlbXMgYSBiaXQgY29uZnVzZWQg b3ZlciB3aGVuIHJhd19zbXBfcHJvY2Vzc29yX2lkKCkKICAgICBzaG91bGQgYmUgdXNlZDogbm90 IGhlcmUpLgogICAgCiAgICBTaWduZWQtb2ZmLWJ5OiBSdXN0eSBSdXNzZWxsIDxydXN0eUBydXN0 Y29ycC5jb20uYXU+CiAgICBDYzogSG9hbmctTmFtIE5ndXllbiA8aG5ndXllbkBkZS5pYm0uY29t PgogICAgQ2M6IENocmlzdG9waCBSYWlzY2ggPHJhaXNjaEBkZS5pYm0uY29tPgogICAgQ2M6IG5l dGRldkB2Z2VyLmtlcm5lbC5vcmcKAAoKIERvY3VtZW50YXRpb24va2VybmVsLXBhcmFtZXRlcnMu dHh0ICAgICAgICAgfCAgICA4ICsKIGFyY2gvYWxwaGEvaW5jbHVkZS9hc20vcGVyY3B1LmggICAg ICAgICAgICAgfCAgIDIxICsrLQogYXJjaC9jcmlzL2FyY2gtdjEwL2tlcm5lbC9lbnRyeS5TICAg ICAgICAgICB8ICAgIDIgKy0gCiBhcmNoL2NyaXMvYXJjaC12MzIvbW0vbW11LlMgICAgICAgICAg ICAgICAgIHwgICAgMiArLSAKIGFyY2gvaWE2NC9pbmNsdWRlL2FzbS9wZXJjcHUuaCAgICAgICAg ICAgICAgfCAgICA1ICstIAogYXJjaC9pYTY0L2tlcm5lbC9pYTY0X2tzeW1zLmMgICAgICAgICAg ICAgICB8ICAgIDQgKy0gCiBhcmNoL2lhNjQvbW0vZGlzY29udGlnLmMgICAgICAgICAgICAgICAg ICAgIHwgICAgMiArLSAKIGFyY2gvcGFyaXNjL2xpYi9maXh1cC5TICAgICAgICAgICAgICAgICAg ICAgfCAgICA4ICstIAogYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL2h2Q2FsbC5TICAg ICB8ICAgIDIgKy0gCiBhcmNoL3NwYXJjNjQva2VybmVsL3J0cmFwLlMgICAgICAgICAgICAgICAg IHwgICAgOCArLSAKIGFyY2gveDg2L2luY2x1ZGUvYXNtL3BlcmNwdS5oICAgICAgICAgICAgICAg fCAgIDI0ICsrLQogYXJjaC94ODYvaW5jbHVkZS9hc20vdGltZXIuaCAgICAgICAgICAgICAgICB8 ICAgIDUgKy0gCiBhcmNoL3g4Ni9rZXJuZWwvY3B1L2NwdWZyZXEvYWNwaS1jcHVmcmVxLmMgIHwg ICAgMiArLSAKIGFyY2gveDg2L2tlcm5lbC9lbnRyeV82NC5TICAgICAgICAgICAgICAgICAgfCAg ICA0ICstIAogYXJjaC94ODYva2VybmVsL2hlYWRfMzIuUyAgICAgICAgICAgICAgICAgICB8ICAg IDIgKy0gCiBhcmNoL3g4Ni9rZXJuZWwvaGVhZF82NC5TICAgICAgICAgICAgICAgICAgIHwgICAg MiArLSAKIGFyY2gveDg2L2tlcm5lbC90c2MuYyAgICAgICAgICAgICAgICAgICAgICAgfCAgICA0 ICstIAogYXJjaC94ODYveGVuL3hlbi1hc21fMzIuUyAgICAgICAgICAgICAgICAgICB8ICAgIDQg Ky0gCiBibG9jay9ibGt0cmFjZS5jICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgNCAr LSAKIGNyeXB0by9hc3luY190eC9hc3luY190eC5jICAgICAgICAgICAgICAgICAgfCAgICA1ICst IAogZHJpdmVycy9hY3BpL3Byb2Nlc3Nvcl9wZXJmbGliLmMgICAgICAgICAgICB8ICAgIDQgKy0g CiBkcml2ZXJzL2RtYS9kbWFlbmdpbmUuYyAgICAgICAgICAgICAgICAgICAgIHwgICAzMiArKy0t CiBkcml2ZXJzL2luZmluaWJhbmQvaHcvZWhjYS9laGNhX2lycS5jICAgICAgIHwgICAgMyArLSAg CiBkcml2ZXJzL25ldC9jaGVsc2lvL3NnZS5jICAgICAgICAgICAgICAgICAgIHwgICAgNSArLSAg CiBkcml2ZXJzL25ldC9sb29wYmFjay5jICAgICAgICAgICAgICAgICAgICAgIHwgICAgNCArLSAg CiBkcml2ZXJzL25ldC92ZXRoLmMgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgNyArLQog ZnMvZXh0NC9tYmFsbG9jLmMgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgIDIgKy0KIGZz L25mcy9pb3N0YXQuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgIDEwICstCiBmcy94 ZnMveGZzX21vdW50LmMgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgOSArLQogaW5jbHVk ZS9hc20tZ2VuZXJpYy9wZXJjcHUuaCAgICAgICAgICAgICAgICB8ICAgNjAgKysrKysrLQogaW5j bHVkZS9saW51eC9jb21waWxlci5oICAgICAgICAgICAgICAgICAgICB8ICAgIDQgKy0KIGluY2x1 ZGUvbGludXgvcGVyY3B1LmggICAgICAgICAgICAgICAgICAgICAgfCAgMTE3ICsrKysrKystLS0t LQogaW5jbHVkZS9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFjay5oICAgICAgICB8ICAgIDQgKy0K IGluY2x1ZGUvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfZWNhY2hlLmggfCAgICAyICstCiBp bmNsdWRlL25ldC9zbm1wLmggICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAxMiArLQogaW5p dC9tYWluLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgIDMgKwoga2VybmVs L2xvY2tkZXAuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgMTEgKy0KIGtlcm5lbC9t b2R1bGUuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgMTU0ICstLS0tLS0tLS0tLS0t LS0KIGtlcm5lbC9wb3NpeC1jcHUtdGltZXJzLmMgICAgICAgICAgICAgICAgICAgfCAgICAyICst CiBrZXJuZWwvc2NoZWQuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAyMSArLQog a2VybmVsL3NjaGVkX3N0YXRzLmggICAgICAgICAgICAgICAgICAgICAgICB8ICAgIDQgKy0KIGtl cm5lbC9zb2Z0aXJxLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICA0ICstCiBrZXJu ZWwvc29mdGxvY2t1cC5jICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAxMiArLQoga2VybmVs L3NyY3UuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgIDQgKy0KIGtlcm5lbC9z dG9wX21hY2hpbmUuYyAgICAgICAgICAgICAgICAgICAgICAgfCAgICAyICstCiBrZXJuZWwvd29y a3F1ZXVlLmMgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgNiArLQogbW0vYWxsb2NwZXJj cHUuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAyNjUgKysrKysrKysrKysrKysrKy0t LS0tLS0tLS0tCiBtbS92bXN0YXQuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwg ICAgNiArLQogbmV0L2NvcmUvc29jay5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAg IDMgKy0KIG5ldC9pcHY0L2FmX2luZXQuYyAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgIDE0 ICstCiBuZXQvaXB2NC9pcF9pbnB1dC5jICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgMyAr LQogbmV0L2lwdjQvcm91dGUuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgIDQgKy0K IG5ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2VjYWNoZS5jICAgICAgICAgfCAgICA0ICstCiBu ZXQveGZybS94ZnJtX2lwY29tcC5jICAgICAgICAgICAgICAgICAgICAgIHwgICAyMCArLS0KIDU0 IGZpbGVzIGNoYW5nZWQsIDQ2OSBpbnNlcnRpb25zKCspLCA0NjYgZGVsZXRpb25zKC0pCgo=