From mboxrd@z Thu Jan 1 00:00:00 1970 From: Martijn Coenen Subject: [PATCH 5/6] scripts: Coccinelle script for namespace dependencies. Date: Mon, 16 Jul 2018 14:21:24 +0200 Message-ID: <20180716122125.175792-6-maco@android.com> References: <20180716122125.175792-1-maco@android.com> Return-path: In-Reply-To: <20180716122125.175792-1-maco@android.com> Sender: linux-kernel-owner@vger.kernel.org To: linux-kernel@vger.kernel.org Cc: Martijn Coenen , Masahiro Yamada , Michal Marek , Geert Uytterhoeven , Thomas Gleixner , Ingo Molnar , "H. Peter Anvin" , x86@kernel.org, Alan Stern , Greg Kroah-Hartman , Oliver Neukum , Arnd Bergmann , Jessica Yu , Stephen Boyd , Philippe Ombredanne , Kate Stewart , Sam Ravnborg , linux-kbuild@vger.kernel.org, linux-m68k@lists.linux-m68k.org, linux-usb@vger.kernel.org, usb-storage@lists.one-eyed-alien.net, linux-scsi List-Id: linux-arch.vger.kernel.org A script that uses the '.ns_deps' file generated by modpost to automatically add the required symbol namespace dependencies to each module. Usage: 1) Move some symbols to a namespace with EXPORT_SYMBOL_NS() 2) Run 'make' (or 'make modules'), get warnings about modules not importing that namespace 3) Run 'make nsdeps' to automatically add required import statements to said modules This makes it easer for subsystem maintainers to introduce and maintain symbol namespaces into their codebase. Signed-off-by: Martijn Coenen --- Makefile | 11 ++++++++++ scripts/Makefile.modpost | 4 +++- scripts/add_namespace.cocci | 19 +++++++++++++++++ scripts/nsdeps | 41 +++++++++++++++++++++++++++++++++++++ 4 files changed, 74 insertions(+), 1 deletion(-) create mode 100644 scripts/add_namespace.cocci create mode 100644 scripts/nsdeps diff --git a/Makefile b/Makefile index 925c55f2524f..96e62d732a3b 100644 --- a/Makefile +++ b/Makefile @@ -1391,6 +1391,9 @@ help: @echo ' headerdep - Detect inclusion cycles in headers' @echo ' coccicheck - Check with Coccinelle' @echo '' + @echo 'Tools:' + @echo ' nsdeps - Generate missing symbol namespace dependencies' + @echo '' @echo 'Kernel selftest:' @echo ' kselftest - Build and run kernel selftest (run as root)' @echo ' Build, install, and boot kernel before' @@ -1566,6 +1569,14 @@ quiet_cmd_tags = GEN $@ tags TAGS cscope gtags: FORCE $(call cmd,tags) +# Script to generate missing namespace dependencies + +PHONY += nsdeps + +nsdeps: + $(Q)$(MAKE) -f $(srctree)/scripts/Makefile.modpost nsdeps + $(Q)$(CONFIG_SHELL) $(srctree)/scripts/$@ + # Scripts to check various things for consistency # --------------------------------------------------------------------------- diff --git a/scripts/Makefile.modpost b/scripts/Makefile.modpost index df4174405feb..a9a90c3e3879 100644 --- a/scripts/Makefile.modpost +++ b/scripts/Makefile.modpost @@ -79,7 +79,8 @@ modpost = scripts/mod/modpost \ $(if $(KBUILD_EXTMOD),-o $(modulesymfile)) \ $(if $(CONFIG_DEBUG_SECTION_MISMATCH),,-S) \ $(if $(CONFIG_SECTION_MISMATCH_WARN_ONLY),,-E) \ - $(if $(KBUILD_EXTMOD)$(KBUILD_MODPOST_WARN),-w) + $(if $(KBUILD_EXTMOD)$(KBUILD_MODPOST_WARN),-w) \ + $(if $(filter nsdeps,$(MAKECMDGOALS)),-d) MODPOST_OPT=$(subst -i,-n,$(filter -i,$(MAKEFLAGS))) @@ -130,6 +131,7 @@ $(modules): %.ko :%.o %.mod.o FORCE targets += $(modules) +nsdeps: _modpost # Add FORCE to the prequisites of a target to force it to be always rebuilt. # --------------------------------------------------------------------------- diff --git a/scripts/add_namespace.cocci b/scripts/add_namespace.cocci new file mode 100644 index 000000000000..a6d33e066067 --- /dev/null +++ b/scripts/add_namespace.cocci @@ -0,0 +1,19 @@ +@has_ns_import@ +declarer name MODULE_IMPORT_NS; +identifier virtual.ns; +@@ +MODULE_IMPORT_NS(ns); + +@has_module_license@ +declarer name MODULE_LICENSE; +expression license; +@@ +MODULE_LICENSE(license); + +@do_import depends on has_module_license && !has_ns_import@ +declarer name MODULE_LICENSE; +expression license; +identifier virtual.ns; +@@ +MODULE_LICENSE(license); ++ MODULE_IMPORT_NS(ns); diff --git a/scripts/nsdeps b/scripts/nsdeps new file mode 100644 index 000000000000..5678e02626b3 --- /dev/null +++ b/scripts/nsdeps @@ -0,0 +1,41 @@ +#!/bin/bash +# SPDX-License-Identifier: GPL-2.0 +# Linux kernel symbol namespace import generator +# +# This script requires at least spatch +# version 1.0.6. +SPATCH_REQ_VERSION="1.0.6" + +DIR="$(dirname $(readlink -f $0))/.." +SPATCH="`which ${SPATCH:=spatch}`" +if [ ! -x "$SPATCH" ]; then + echo 'spatch is part of the Coccinelle project and is available at http://coccinelle.lip6.fr/' + exit 1 +fi + +SPATCH_REQ_VERSION_NUM=$(echo $SPATCH_REQ_VERSION | ${DIR}/scripts/ld-version.sh) +SPATCH_VERSION=$($SPATCH --version | head -1 | awk '{print $3}') +SPATCH_VERSION_NUM=$(echo $SPATCH_VERSION | ${DIR}/scripts/ld-version.sh) + +if [ "$SPATCH_VERSION_NUM" -lt "$SPATCH_REQ_VERSION_NUM" ] ; then + echo 'spatch needs to be version 1.06 or higher' + exit 1 +fi + +generate_deps_for_ns() { + $SPATCH --very-quiet --in-place --sp-file $srctree/scripts/add_namespace.cocci -D ns=$1 $2 +} + +generate_deps() { + local mod_file=`echo $@ | sed -e 's/\.ns_deps/\.mod/'` + local mod_name=`cat $mod_file | sed -n 1p | sed -e 's/\/[^.]*$//'` + local mod_source_files=`cat $mod_file | sed -n 2p | sed -e 's/\.o/\.c/'` + for ns in `cat $@`; do + echo "Adding namespace $ns to module $mod_name (if needed)." + generate_deps_for_ns $ns $mod_source_files + done +} + +for f in `find $srctree/.tmp_versions/ -name *.ns_deps`; do + generate_deps $f +done -- 2.18.0.203.gfac676dfb9-goog From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-ed1-f66.google.com ([209.85.208.66]:43205 "EHLO mail-ed1-f66.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1731228AbeGPMsw (ORCPT ); Mon, 16 Jul 2018 08:48:52 -0400 Received: by mail-ed1-f66.google.com with SMTP id b20-v6so4264122edt.10 for ; Mon, 16 Jul 2018 05:21:39 -0700 (PDT) From: Martijn Coenen Subject: [PATCH 5/6] scripts: Coccinelle script for namespace dependencies. Date: Mon, 16 Jul 2018 14:21:24 +0200 Message-ID: <20180716122125.175792-6-maco@android.com> In-Reply-To: <20180716122125.175792-1-maco@android.com> References: <20180716122125.175792-1-maco@android.com> Sender: linux-arch-owner@vger.kernel.org List-ID: To: linux-kernel@vger.kernel.org Cc: Martijn Coenen , Masahiro Yamada , Michal Marek , Geert Uytterhoeven , Thomas Gleixner , Ingo Molnar , "H. Peter Anvin" , x86@kernel.org, Alan Stern , Greg Kroah-Hartman , Oliver Neukum , Arnd Bergmann , Jessica Yu , Stephen Boyd , Philippe Ombredanne , Kate Stewart , Sam Ravnborg , linux-kbuild@vger.kernel.org, linux-m68k@lists.linux-m68k.org, linux-usb@vger.kernel.org, usb-storage@lists.one-eyed-alien.net, linux-scsi@vger.kernel.org, linux-arch@vger.kernel.org, maco@google.com, sspatil@google.com, malchev@google.com, joelaf@google.com Message-ID: <20180716122124.JjOqJUL6tk4s2msVRdEBf64CU130WBDJK7aQgW-52eM@z> A script that uses the '.ns_deps' file generated by modpost to automatically add the required symbol namespace dependencies to each module. Usage: 1) Move some symbols to a namespace with EXPORT_SYMBOL_NS() 2) Run 'make' (or 'make modules'), get warnings about modules not importing that namespace 3) Run 'make nsdeps' to automatically add required import statements to said modules This makes it easer for subsystem maintainers to introduce and maintain symbol namespaces into their codebase. Signed-off-by: Martijn Coenen --- Makefile | 11 ++++++++++ scripts/Makefile.modpost | 4 +++- scripts/add_namespace.cocci | 19 +++++++++++++++++ scripts/nsdeps | 41 +++++++++++++++++++++++++++++++++++++ 4 files changed, 74 insertions(+), 1 deletion(-) create mode 100644 scripts/add_namespace.cocci create mode 100644 scripts/nsdeps diff --git a/Makefile b/Makefile index 925c55f2524f..96e62d732a3b 100644 --- a/Makefile +++ b/Makefile @@ -1391,6 +1391,9 @@ help: @echo ' headerdep - Detect inclusion cycles in headers' @echo ' coccicheck - Check with Coccinelle' @echo '' + @echo 'Tools:' + @echo ' nsdeps - Generate missing symbol namespace dependencies' + @echo '' @echo 'Kernel selftest:' @echo ' kselftest - Build and run kernel selftest (run as root)' @echo ' Build, install, and boot kernel before' @@ -1566,6 +1569,14 @@ quiet_cmd_tags = GEN $@ tags TAGS cscope gtags: FORCE $(call cmd,tags) +# Script to generate missing namespace dependencies + +PHONY += nsdeps + +nsdeps: + $(Q)$(MAKE) -f $(srctree)/scripts/Makefile.modpost nsdeps + $(Q)$(CONFIG_SHELL) $(srctree)/scripts/$@ + # Scripts to check various things for consistency # --------------------------------------------------------------------------- diff --git a/scripts/Makefile.modpost b/scripts/Makefile.modpost index df4174405feb..a9a90c3e3879 100644 --- a/scripts/Makefile.modpost +++ b/scripts/Makefile.modpost @@ -79,7 +79,8 @@ modpost = scripts/mod/modpost \ $(if $(KBUILD_EXTMOD),-o $(modulesymfile)) \ $(if $(CONFIG_DEBUG_SECTION_MISMATCH),,-S) \ $(if $(CONFIG_SECTION_MISMATCH_WARN_ONLY),,-E) \ - $(if $(KBUILD_EXTMOD)$(KBUILD_MODPOST_WARN),-w) + $(if $(KBUILD_EXTMOD)$(KBUILD_MODPOST_WARN),-w) \ + $(if $(filter nsdeps,$(MAKECMDGOALS)),-d) MODPOST_OPT=$(subst -i,-n,$(filter -i,$(MAKEFLAGS))) @@ -130,6 +131,7 @@ $(modules): %.ko :%.o %.mod.o FORCE targets += $(modules) +nsdeps: _modpost # Add FORCE to the prequisites of a target to force it to be always rebuilt. # --------------------------------------------------------------------------- diff --git a/scripts/add_namespace.cocci b/scripts/add_namespace.cocci new file mode 100644 index 000000000000..a6d33e066067 --- /dev/null +++ b/scripts/add_namespace.cocci @@ -0,0 +1,19 @@ +@has_ns_import@ +declarer name MODULE_IMPORT_NS; +identifier virtual.ns; +@@ +MODULE_IMPORT_NS(ns); + +@has_module_license@ +declarer name MODULE_LICENSE; +expression license; +@@ +MODULE_LICENSE(license); + +@do_import depends on has_module_license && !has_ns_import@ +declarer name MODULE_LICENSE; +expression license; +identifier virtual.ns; +@@ +MODULE_LICENSE(license); ++ MODULE_IMPORT_NS(ns); diff --git a/scripts/nsdeps b/scripts/nsdeps new file mode 100644 index 000000000000..5678e02626b3 --- /dev/null +++ b/scripts/nsdeps @@ -0,0 +1,41 @@ +#!/bin/bash +# SPDX-License-Identifier: GPL-2.0 +# Linux kernel symbol namespace import generator +# +# This script requires at least spatch +# version 1.0.6. +SPATCH_REQ_VERSION="1.0.6" + +DIR="$(dirname $(readlink -f $0))/.." +SPATCH="`which ${SPATCH:=spatch}`" +if [ ! -x "$SPATCH" ]; then + echo 'spatch is part of the Coccinelle project and is available at http://coccinelle.lip6.fr/' + exit 1 +fi + +SPATCH_REQ_VERSION_NUM=$(echo $SPATCH_REQ_VERSION | ${DIR}/scripts/ld-version.sh) +SPATCH_VERSION=$($SPATCH --version | head -1 | awk '{print $3}') +SPATCH_VERSION_NUM=$(echo $SPATCH_VERSION | ${DIR}/scripts/ld-version.sh) + +if [ "$SPATCH_VERSION_NUM" -lt "$SPATCH_REQ_VERSION_NUM" ] ; then + echo 'spatch needs to be version 1.06 or higher' + exit 1 +fi + +generate_deps_for_ns() { + $SPATCH --very-quiet --in-place --sp-file $srctree/scripts/add_namespace.cocci -D ns=$1 $2 +} + +generate_deps() { + local mod_file=`echo $@ | sed -e 's/\.ns_deps/\.mod/'` + local mod_name=`cat $mod_file | sed -n 1p | sed -e 's/\/[^.]*$//'` + local mod_source_files=`cat $mod_file | sed -n 2p | sed -e 's/\.o/\.c/'` + for ns in `cat $@`; do + echo "Adding namespace $ns to module $mod_name (if needed)." + generate_deps_for_ns $ns $mod_source_files + done +} + +for f in `find $srctree/.tmp_versions/ -name *.ns_deps`; do + generate_deps $f +done -- 2.18.0.203.gfac676dfb9-goog From mboxrd@z Thu Jan 1 00:00:00 1970 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: base64 Subject: [5/6] scripts: Coccinelle script for namespace dependencies. From: Martijn Coenen Message-Id: <20180716122125.175792-6-maco@android.com> Date: Mon, 16 Jul 2018 14:21:24 +0200 To: linux-kernel@vger.kernel.org Cc: Martijn Coenen , Masahiro Yamada , Michal Marek , Geert Uytterhoeven , Thomas Gleixner , Ingo Molnar , "H. Peter Anvin" , x86@kernel.org, Alan Stern , Greg Kroah-Hartman , Oliver Neukum , Arnd Bergmann , Jessica Yu , Stephen Boyd , Philippe Ombredanne , Kate Stewart , Sam Ravnborg , linux-kbuild@vger.kernel.org, linux-m68k@lists.linux-m68k.org, linux-usb@vger.kernel.org, usb-storage@lists.one-eyed-alien.net, linux-scsi@vger.kernel.org, linux-arch@vger.kernel.org, maco@google.com, sspatil@google.com, malchev@google.com, joelaf@google.com List-ID: QSBzY3JpcHQgdGhhdCB1c2VzIHRoZSAnPG1vZHVsZT4ubnNfZGVwcycgZmlsZSBnZW5lcmF0ZWQg YnkgbW9kcG9zdCB0bwphdXRvbWF0aWNhbGx5IGFkZCB0aGUgcmVxdWlyZWQgc3ltYm9sIG5hbWVz cGFjZSBkZXBlbmRlbmNpZXMgdG8gZWFjaAptb2R1bGUuCgpVc2FnZToKMSkgTW92ZSBzb21lIHN5 bWJvbHMgdG8gYSBuYW1lc3BhY2Ugd2l0aCBFWFBPUlRfU1lNQk9MX05TKCkKMikgUnVuICdtYWtl JyAob3IgJ21ha2UgbW9kdWxlcycpLCBnZXQgd2FybmluZ3MgYWJvdXQgbW9kdWxlcyBub3QKICAg aW1wb3J0aW5nIHRoYXQgbmFtZXNwYWNlCjMpIFJ1biAnbWFrZSBuc2RlcHMnIHRvIGF1dG9tYXRp Y2FsbHkgYWRkIHJlcXVpcmVkIGltcG9ydCBzdGF0ZW1lbnRzCiAgIHRvIHNhaWQgbW9kdWxlcwoK VGhpcyBtYWtlcyBpdCBlYXNlciBmb3Igc3Vic3lzdGVtIG1haW50YWluZXJzIHRvIGludHJvZHVj ZSBhbmQgbWFpbnRhaW4Kc3ltYm9sIG5hbWVzcGFjZXMgaW50byB0aGVpciBjb2RlYmFzZS4KClNp Z25lZC1vZmYtYnk6IE1hcnRpam4gQ29lbmVuIDxtYWNvQGFuZHJvaWQuY29tPgotLS0KIE1ha2Vm aWxlICAgICAgICAgICAgICAgICAgICB8IDExICsrKysrKysrKysKIHNjcmlwdHMvTWFrZWZpbGUu bW9kcG9zdCAgICB8ICA0ICsrKy0KIHNjcmlwdHMvYWRkX25hbWVzcGFjZS5jb2NjaSB8IDE5ICsr KysrKysrKysrKysrKysrCiBzY3JpcHRzL25zZGVwcyAgICAgICAgICAgICAgfCA0MSArKysrKysr KysrKysrKysrKysrKysrKysrKysrKysrKysrKysrCiA0IGZpbGVzIGNoYW5nZWQsIDc0IGluc2Vy dGlvbnMoKyksIDEgZGVsZXRpb24oLSkKIGNyZWF0ZSBtb2RlIDEwMDY0NCBzY3JpcHRzL2FkZF9u YW1lc3BhY2UuY29jY2kKIGNyZWF0ZSBtb2RlIDEwMDY0NCBzY3JpcHRzL25zZGVwcwoKZGlmZiAt LWdpdCBhL01ha2VmaWxlIGIvTWFrZWZpbGUKaW5kZXggOTI1YzU1ZjI1MjRmLi45NmU2MmQ3MzJh M2IgMTAwNjQ0Ci0tLSBhL01ha2VmaWxlCisrKyBiL01ha2VmaWxlCkBAIC0xMzkxLDYgKzEzOTEs OSBAQCBoZWxwOgogCUBlY2hvICAnICBoZWFkZXJkZXAgICAgICAgLSBEZXRlY3QgaW5jbHVzaW9u IGN5Y2xlcyBpbiBoZWFkZXJzJwogCUBlY2hvICAnICBjb2NjaWNoZWNrICAgICAgLSBDaGVjayB3 aXRoIENvY2NpbmVsbGUnCiAJQGVjaG8gICcnCisJQGVjaG8gICdUb29sczonCisJQGVjaG8gICcg IG5zZGVwcyAgICAgICAgICAtIEdlbmVyYXRlIG1pc3Npbmcgc3ltYm9sIG5hbWVzcGFjZSBkZXBl bmRlbmNpZXMnCisJQGVjaG8gICcnCiAJQGVjaG8gICdLZXJuZWwgc2VsZnRlc3Q6JwogCUBlY2hv ICAnICBrc2VsZnRlc3QgICAgICAgLSBCdWlsZCBhbmQgcnVuIGtlcm5lbCBzZWxmdGVzdCAocnVu IGFzIHJvb3QpJwogCUBlY2hvICAnICAgICAgICAgICAgICAgICAgICBCdWlsZCwgaW5zdGFsbCwg YW5kIGJvb3Qga2VybmVsIGJlZm9yZScKQEAgLTE1NjYsNiArMTU2OSwxNCBAQCBxdWlldF9jbWRf dGFncyA9IEdFTiAgICAgJEAKIHRhZ3MgVEFHUyBjc2NvcGUgZ3RhZ3M6IEZPUkNFCiAJJChjYWxs IGNtZCx0YWdzKQogCisjIFNjcmlwdCB0byBnZW5lcmF0ZSBtaXNzaW5nIG5hbWVzcGFjZSBkZXBl bmRlbmNpZXMKKworUEhPTlkgKz0gbnNkZXBzCisKK25zZGVwczoKKwkkKFEpJChNQUtFKSAtZiAk KHNyY3RyZWUpL3NjcmlwdHMvTWFrZWZpbGUubW9kcG9zdCBuc2RlcHMKKwkkKFEpJChDT05GSUdf U0hFTEwpICQoc3JjdHJlZSkvc2NyaXB0cy8kQAorCiAjIFNjcmlwdHMgdG8gY2hlY2sgdmFyaW91 cyB0aGluZ3MgZm9yIGNvbnNpc3RlbmN5CiAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCmRpZmYgLS1n aXQgYS9zY3JpcHRzL01ha2VmaWxlLm1vZHBvc3QgYi9zY3JpcHRzL01ha2VmaWxlLm1vZHBvc3QK aW5kZXggZGY0MTc0NDA1ZmViLi5hOWE5MGMzZTM4NzkgMTAwNjQ0Ci0tLSBhL3NjcmlwdHMvTWFr ZWZpbGUubW9kcG9zdAorKysgYi9zY3JpcHRzL01ha2VmaWxlLm1vZHBvc3QKQEAgLTc5LDcgKzc5 LDggQEAgbW9kcG9zdCA9IHNjcmlwdHMvbW9kL21vZHBvc3QgICAgICAgICAgICAgICAgICAgIFwK ICAkKGlmICQoS0JVSUxEX0VYVE1PRCksLW8gJChtb2R1bGVzeW1maWxlKSkgICAgICBcCiAgJChp ZiAkKENPTkZJR19ERUJVR19TRUNUSU9OX01JU01BVENIKSwsLVMpICAgICAgXAogICQoaWYgJChD T05GSUdfU0VDVElPTl9NSVNNQVRDSF9XQVJOX09OTFkpLCwtRSkgIFwKLSAkKGlmICQoS0JVSUxE X0VYVE1PRCkkKEtCVUlMRF9NT0RQT1NUX1dBUk4pLC13KQorICQoaWYgJChLQlVJTERfRVhUTU9E KSQoS0JVSUxEX01PRFBPU1RfV0FSTiksLXcpIFwKKyAkKGlmICQoZmlsdGVyIG5zZGVwcywkKE1B S0VDTURHT0FMUykpLC1kKQogCiBNT0RQT1NUX09QVD0kKHN1YnN0IC1pLC1uLCQoZmlsdGVyIC1p LCQoTUFLRUZMQUdTKSkpCiAKQEAgLTEzMCw2ICsxMzEsNyBAQCAkKG1vZHVsZXMpOiAlLmtvIDol Lm8gJS5tb2QubyBGT1JDRQogCiB0YXJnZXRzICs9ICQobW9kdWxlcykKIAorbnNkZXBzOiBfbW9k cG9zdAogCiAjIEFkZCBGT1JDRSB0byB0aGUgcHJlcXVpc2l0ZXMgb2YgYSB0YXJnZXQgdG8gZm9y Y2UgaXQgdG8gYmUgYWx3YXlzIHJlYnVpbHQuCiAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpkaWZmIC0t Z2l0IGEvc2NyaXB0cy9hZGRfbmFtZXNwYWNlLmNvY2NpIGIvc2NyaXB0cy9hZGRfbmFtZXNwYWNl LmNvY2NpCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMC4uYTZkMzNlMDY2 MDY3Ci0tLSAvZGV2L251bGwKKysrIGIvc2NyaXB0cy9hZGRfbmFtZXNwYWNlLmNvY2NpCkBAIC0w LDAgKzEsMTkgQEAKK0BoYXNfbnNfaW1wb3J0QAorZGVjbGFyZXIgbmFtZSBNT0RVTEVfSU1QT1JU X05TOworaWRlbnRpZmllciB2aXJ0dWFsLm5zOworQEAKK01PRFVMRV9JTVBPUlRfTlMobnMpOwor CitAaGFzX21vZHVsZV9saWNlbnNlQAorZGVjbGFyZXIgbmFtZSBNT0RVTEVfTElDRU5TRTsKK2V4 cHJlc3Npb24gbGljZW5zZTsKK0BACitNT0RVTEVfTElDRU5TRShsaWNlbnNlKTsKKworQGRvX2lt cG9ydCBkZXBlbmRzIG9uIGhhc19tb2R1bGVfbGljZW5zZSAmJiAhaGFzX25zX2ltcG9ydEAKK2Rl Y2xhcmVyIG5hbWUgTU9EVUxFX0xJQ0VOU0U7CitleHByZXNzaW9uIGxpY2Vuc2U7CitpZGVudGlm aWVyIHZpcnR1YWwubnM7CitAQAorTU9EVUxFX0xJQ0VOU0UobGljZW5zZSk7CisrIE1PRFVMRV9J TVBPUlRfTlMobnMpOwpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9uc2RlcHMgYi9zY3JpcHRzL25zZGVw cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAuLjU2NzhlMDI2MjZiMwot LS0gL2Rldi9udWxsCisrKyBiL3NjcmlwdHMvbnNkZXBzCkBAIC0wLDAgKzEsNDEgQEAKKyMhL2Jp bi9iYXNoCisjIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wCisjIExpbnV4IGtlcm5l bCBzeW1ib2wgbmFtZXNwYWNlIGltcG9ydCBnZW5lcmF0b3IKKyMKKyMgVGhpcyBzY3JpcHQgcmVx dWlyZXMgYXQgbGVhc3Qgc3BhdGNoCisjIHZlcnNpb24gMS4wLjYuCitTUEFUQ0hfUkVRX1ZFUlNJ T049IjEuMC42IgorCitESVI9IiQoZGlybmFtZSAkKHJlYWRsaW5rIC1mICQwKSkvLi4iCitTUEFU Q0g9ImB3aGljaCAke1NQQVRDSDo9c3BhdGNofWAiCitpZiBbICEgLXggIiRTUEFUQ0giIF07IHRo ZW4KKyAgICBlY2hvICdzcGF0Y2ggaXMgcGFydCBvZiB0aGUgQ29jY2luZWxsZSBwcm9qZWN0IGFu ZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL2NvY2NpbmVsbGUubGlwNi5mci8nCisgICAgZXhpdCAx CitmaQorCitTUEFUQ0hfUkVRX1ZFUlNJT05fTlVNPSQoZWNobyAkU1BBVENIX1JFUV9WRVJTSU9O IHwgJHtESVJ9L3NjcmlwdHMvbGQtdmVyc2lvbi5zaCkKK1NQQVRDSF9WRVJTSU9OPSQoJFNQQVRD SCAtLXZlcnNpb24gfCBoZWFkIC0xIHwgYXdrICd7cHJpbnQgJDN9JykKK1NQQVRDSF9WRVJTSU9O X05VTT0kKGVjaG8gJFNQQVRDSF9WRVJTSU9OIHwgJHtESVJ9L3NjcmlwdHMvbGQtdmVyc2lvbi5z aCkKKworaWYgWyAiJFNQQVRDSF9WRVJTSU9OX05VTSIgLWx0ICIkU1BBVENIX1JFUV9WRVJTSU9O X05VTSIgXSA7IHRoZW4KKyAgICBlY2hvICdzcGF0Y2ggbmVlZHMgdG8gYmUgdmVyc2lvbiAxLjA2 IG9yIGhpZ2hlcicKKyAgICBleGl0IDEKK2ZpCisKK2dlbmVyYXRlX2RlcHNfZm9yX25zKCkgewor ICAgICRTUEFUQ0ggLS12ZXJ5LXF1aWV0IC0taW4tcGxhY2UgLS1zcC1maWxlICRzcmN0cmVlL3Nj cmlwdHMvYWRkX25hbWVzcGFjZS5jb2NjaSAtRCBucz0kMSAkMgorfQorCitnZW5lcmF0ZV9kZXBz KCkgeworICAgIGxvY2FsIG1vZF9maWxlPWBlY2hvICRAIHwgc2VkIC1lICdzL1wubnNfZGVwcy9c Lm1vZC8nYAorICAgIGxvY2FsIG1vZF9uYW1lPWBjYXQgJG1vZF9maWxlIHwgc2VkIC1uIDFwIHwg c2VkIC1lICdzL1wvW14uXSokLy8nYAorICAgIGxvY2FsIG1vZF9zb3VyY2VfZmlsZXM9YGNhdCAk bW9kX2ZpbGUgfCBzZWQgLW4gMnAgfCBzZWQgLWUgJ3MvXC5vL1wuYy8nYAorICAgIGZvciBucyBp biBgY2F0ICRAYDsgZG8KKwllY2hvICJBZGRpbmcgbmFtZXNwYWNlICRucyB0byBtb2R1bGUgJG1v ZF9uYW1lIChpZiBuZWVkZWQpLiIKKyAgICAgICAgZ2VuZXJhdGVfZGVwc19mb3JfbnMgJG5zICRt b2Rfc291cmNlX2ZpbGVzCisgICAgZG9uZQorfQorCitmb3IgZiBpbiBgZmluZCAkc3JjdHJlZS8u dG1wX3ZlcnNpb25zLyAtbmFtZSAqLm5zX2RlcHNgOyBkbworICAgIGdlbmVyYXRlX2RlcHMgJGYK K2RvbmUK