bpf.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH 0/4] bpf: Add more information into bpffs
@ 2022-02-11 12:11 Yafang Shao
  2022-02-11 12:11 ` [PATCH 1/4] bpf: Add pin_name into struct bpf_prog_aux Yafang Shao
                   ` (3 more replies)
  0 siblings, 4 replies; 11+ messages in thread
From: Yafang Shao @ 2022-02-11 12:11 UTC (permalink / raw)
  To: ast, daniel, andrii, kafai, songliubraving, yhs, john.fastabend, kpsingh
  Cc: netdev, bpf, Yafang Shao

We have a bpf manager (bpfman) running on the host to maintain the
lifecycle of all the bpf progs and maps on this host.

The purpose of the bpfman includes,
- pin and unpin bpf progs and maps
- attach and detach bpf progs
- update running bpf progs and the related bpf maps
- update some running bpf progs only without updating the related bpf
  maps
- check the possible conflict of bpf progs
- etc

In order to safely do these works, we used many tools to get the
required information, like bpftool and some other customized tools. Some
of these works seem a little heavy. After the preloaded progs.debug and
maps.debug are introduced, we decided to improve these two files to get
the full view of progs and maps that required by bpfman.

This patchset includes below features,
- the pinned file of progs and maps are introduced into these two files
- the relateship of progs and maps is introduced into progs.debug

With these features we may also improve how bpftool get the pinned
file[1] in the next step.

[1]. https://github.com/torvalds/linux/blob/master/tools/bpf/bpftool/prog.c#L648

Yafang Shao (4):
  bpf: Add pin_name into struct bpf_prog_aux
  bpf: Add pin_name into struct bpf_map
  bpf: show pinned file name in {progs, maps}.debug
  bpf: Show the used maps of each prog in progs.debug

 include/linux/bpf.h                           |   3 +
 include/uapi/linux/bpf.h                      |   1 +
 kernel/bpf/inode.c                            |  29 +-
 kernel/bpf/preload/iterators/iterators.bpf.c  |  33 +-
 kernel/bpf/preload/iterators/iterators.skel.h | 676 +++++++++++++++-----------
 5 files changed, 460 insertions(+), 282 deletions(-)

-- 
1.8.3.1


^ permalink raw reply	[flat|nested] 11+ messages in thread

* [PATCH 1/4] bpf: Add pin_name into struct bpf_prog_aux
  2022-02-11 12:11 [PATCH 0/4] bpf: Add more information into bpffs Yafang Shao
@ 2022-02-11 12:11 ` Yafang Shao
  2022-02-11 12:43   ` Daniel Borkmann
  2022-02-11 17:58   ` kernel test robot
  2022-02-11 12:11 ` [PATCH 2/4] bpf: Add pin_name into struct bpf_map Yafang Shao
                   ` (2 subsequent siblings)
  3 siblings, 2 replies; 11+ messages in thread
From: Yafang Shao @ 2022-02-11 12:11 UTC (permalink / raw)
  To: ast, daniel, andrii, kafai, songliubraving, yhs, john.fastabend, kpsingh
  Cc: netdev, bpf, Yafang Shao

A new member pin_name is added into struct bpf_prog_aux, which will be
set when the prog is set and cleared when the pinned file is removed.

Signed-off-by: Yafang Shao <laoar.shao@gmail.com>
---
 include/linux/bpf.h      |  2 ++
 include/uapi/linux/bpf.h |  1 +
 kernel/bpf/inode.c       | 20 +++++++++++++++++++-
 3 files changed, 22 insertions(+), 1 deletion(-)

diff --git a/include/linux/bpf.h b/include/linux/bpf.h
index 0ceb25b..9cf8055 100644
--- a/include/linux/bpf.h
+++ b/include/linux/bpf.h
@@ -933,6 +933,8 @@ struct bpf_prog_aux {
 		struct work_struct work;
 		struct rcu_head	rcu;
 	};
+
+	char pin_name[BPF_PIN_NAME_LEN];
 };
 
 struct bpf_array_aux {
diff --git a/include/uapi/linux/bpf.h b/include/uapi/linux/bpf.h
index c14fed8..bada5cc 100644
--- a/include/uapi/linux/bpf.h
+++ b/include/uapi/linux/bpf.h
@@ -1217,6 +1217,7 @@ struct bpf_stack_build_id {
 };
 
 #define BPF_OBJ_NAME_LEN 16U
+#define BPF_PIN_NAME_LEN 64U
 
 union bpf_attr {
 	struct { /* anonymous struct used by BPF_MAP_CREATE command */
diff --git a/kernel/bpf/inode.c b/kernel/bpf/inode.c
index 4477ca8..f1a8811 100644
--- a/kernel/bpf/inode.c
+++ b/kernel/bpf/inode.c
@@ -437,6 +437,8 @@ static int bpf_iter_link_pin_kernel(struct dentry *parent,
 static int bpf_obj_do_pin(const char __user *pathname, void *raw,
 			  enum bpf_type type)
 {
+	struct bpf_prog_aux *aux;
+	struct bpf_prog *prog;
 	struct dentry *dentry;
 	struct inode *dir;
 	struct path path;
@@ -461,6 +463,10 @@ static int bpf_obj_do_pin(const char __user *pathname, void *raw,
 
 	switch (type) {
 	case BPF_TYPE_PROG:
+		prog = raw;
+		aux = prog->aux;
+		(void) strncpy_from_user(aux->pin_name, pathname, BPF_PIN_NAME_LEN);
+		aux->pin_name[BPF_PIN_NAME_LEN - 1] = '\0';
 		ret = vfs_mkobj(dentry, mode, bpf_mkprog, raw);
 		break;
 	case BPF_TYPE_MAP:
@@ -611,12 +617,24 @@ static int bpf_show_options(struct seq_file *m, struct dentry *root)
 
 static void bpf_free_inode(struct inode *inode)
 {
+	struct bpf_prog_aux *aux;
+	struct bpf_prog *prog;
 	enum bpf_type type;
 
 	if (S_ISLNK(inode->i_mode))
 		kfree(inode->i_link);
-	if (!bpf_inode_type(inode, &type))
+	if (!bpf_inode_type(inode, &type)) {
+		switch (type) {
+		case BPF_TYPE_PROG:
+			prog = inode->i_private;
+			aux = prog->aux;
+			aux->pin_name[0] = '\0';
+			break;
+		default:
+			break;
+		}
 		bpf_any_put(inode->i_private, type);
+	}
 	free_inode_nonrcu(inode);
 }
 
-- 
1.8.3.1


^ permalink raw reply related	[flat|nested] 11+ messages in thread

* [PATCH 2/4] bpf: Add pin_name into struct bpf_map
  2022-02-11 12:11 [PATCH 0/4] bpf: Add more information into bpffs Yafang Shao
  2022-02-11 12:11 ` [PATCH 1/4] bpf: Add pin_name into struct bpf_prog_aux Yafang Shao
@ 2022-02-11 12:11 ` Yafang Shao
  2022-02-11 12:11 ` [PATCH 3/4] bpf: Show pinned file name in {progs, maps}.debug Yafang Shao
  2022-02-11 12:11 ` [PATCH 4/4] bpf: Show the used maps of each prog in progs.debug Yafang Shao
  3 siblings, 0 replies; 11+ messages in thread
From: Yafang Shao @ 2022-02-11 12:11 UTC (permalink / raw)
  To: ast, daniel, andrii, kafai, songliubraving, yhs, john.fastabend, kpsingh
  Cc: netdev, bpf, Yafang Shao

A new member pin_name is added into struct bpf_map, which will set when
the map is pinned and cleared when the pinned file is removed.

Signed-off-by: Yafang Shao <laoar.shao@gmail.com>
---
 include/linux/bpf.h | 1 +
 kernel/bpf/inode.c  | 9 +++++++++
 2 files changed, 10 insertions(+)

diff --git a/include/linux/bpf.h b/include/linux/bpf.h
index 9cf8055..220de69 100644
--- a/include/linux/bpf.h
+++ b/include/linux/bpf.h
@@ -182,6 +182,7 @@ struct bpf_map {
 	struct mem_cgroup *memcg;
 #endif
 	char name[BPF_OBJ_NAME_LEN];
+	char pin_name[BPF_PIN_NAME_LEN];
 	bool bypass_spec_v1;
 	bool frozen; /* write-once; write-protected by freeze_mutex */
 	/* 14 bytes hole */
diff --git a/kernel/bpf/inode.c b/kernel/bpf/inode.c
index f1a8811..586adef 100644
--- a/kernel/bpf/inode.c
+++ b/kernel/bpf/inode.c
@@ -440,6 +440,7 @@ static int bpf_obj_do_pin(const char __user *pathname, void *raw,
 	struct bpf_prog_aux *aux;
 	struct bpf_prog *prog;
 	struct dentry *dentry;
+	struct bpf_map *map;
 	struct inode *dir;
 	struct path path;
 	umode_t mode;
@@ -470,6 +471,9 @@ static int bpf_obj_do_pin(const char __user *pathname, void *raw,
 		ret = vfs_mkobj(dentry, mode, bpf_mkprog, raw);
 		break;
 	case BPF_TYPE_MAP:
+		map = raw;
+		(void) strncpy_from_user(map->pin_name, pathname, BPF_PIN_NAME_LEN);
+		map->pin_name[BPF_PIN_NAME_LEN - 1] = '\0';
 		ret = vfs_mkobj(dentry, mode, bpf_mkmap, raw);
 		break;
 	case BPF_TYPE_LINK:
@@ -619,6 +623,7 @@ static void bpf_free_inode(struct inode *inode)
 {
 	struct bpf_prog_aux *aux;
 	struct bpf_prog *prog;
+	struct bpf_map *map;
 	enum bpf_type type;
 
 	if (S_ISLNK(inode->i_mode))
@@ -630,6 +635,10 @@ static void bpf_free_inode(struct inode *inode)
 			aux = prog->aux;
 			aux->pin_name[0] = '\0';
 			break;
+		case BPF_TYPE_MAP:
+			map = inode->i_private;
+			map->pin_name[0] = '\0';
+			break;
 		default:
 			break;
 		}
-- 
1.8.3.1


^ permalink raw reply related	[flat|nested] 11+ messages in thread

* [PATCH 3/4] bpf: Show pinned file name in {progs, maps}.debug
  2022-02-11 12:11 [PATCH 0/4] bpf: Add more information into bpffs Yafang Shao
  2022-02-11 12:11 ` [PATCH 1/4] bpf: Add pin_name into struct bpf_prog_aux Yafang Shao
  2022-02-11 12:11 ` [PATCH 2/4] bpf: Add pin_name into struct bpf_map Yafang Shao
@ 2022-02-11 12:11 ` Yafang Shao
  2022-02-11 12:11 ` [PATCH 4/4] bpf: Show the used maps of each prog in progs.debug Yafang Shao
  3 siblings, 0 replies; 11+ messages in thread
From: Yafang Shao @ 2022-02-11 12:11 UTC (permalink / raw)
  To: ast, daniel, andrii, kafai, songliubraving, yhs, john.fastabend, kpsingh
  Cc: netdev, bpf, Yafang Shao

If the progs or maps are pinned into bpffs, the pinned file name can be
displayed in progs.debug or maps.debug. It will help us to maintain the
lifecycle of pinned maps and progs.

The result as follows,

$ cat progs.debug
  id name             attached         pinned
  19 dump_bpf_map     bpf_iter_bpf_map
  21 dump_bpf_prog    bpf_iter_bpf_prog
  22                                   /var/run/pnc/bpf/tc/prog/cls-ingress
  23                                   /var/run/pnc/bpf/tc/prog/cls-egress
  24                                   /var/run/pnc/bpf/tc/prog/connect4
  25                                   /var/run/pnc/bpf/tc/prog/sockops
  26                                   /var/run/pnc/bpf/tc/prog/skmsg

$ cat maps.debug
  id name             max_entries  pinned
  13 iterator.rodata  1
  14 .rodata.str1.1   1
  16                  32           /var/run/pnc/bpf//tc//globals/ctrl
  17                  256          /var/run/pnc/bpf//tc//globals/events
  18                  102400       /var/run/pnc/bpf//tc//globals/egw_stat
  19                  1024         /var/run/pnc/bpf//tc//globals/egw_config
  20                  1024         /var/run/pnc/bpf//tc//globals/egw_mapping
  21                  102400       /var/run/pnc/bpf//tc//globals/egw_sock_info
  22                  0            /var/run/pnc/bpf//tc//globals/egw_sk_storage
  23                  102400       /var/run/pnc/bpf//tc//globals/egw_sock
  24                  1048576      /var/run/pnc/bpf//tc//globals/ip_identity
  25                  1024         /var/run/pnc/bpf//tc//globals/metrics
  26                  1024         /var/run/pnc/bpf//tc//globals/ns_ctrl
  27                  262144       /var/run/pnc/bpf//tc//globals/identity_ctrl
  28                  4194304      /var/run/pnc/bpf//tc//globals/rule
  29                  16384        /var/run/pnc/bpf//tc//globals/rgroup_rule
  30                  1048576      /var/run/pnc/bpf//tc//globals/rgroup_ref
  31                  102400       /var/run/pnc/bpf//tc//globals/policy_stats
  32                  102400       /var/run/pnc/bpf//tc//globals/lazy_record
  33                  102400       /var/run/pnc/bpf//tc//globals/flow_stats
  34                  1024         /var/run/pnc/bpf//tc//globals/fs_filter_raddr
  35                  1024         /var/run/pnc/bpf//tc//globals/fs_filter_l4addr

The pinned name in these two files will be disappeared if the pinned file is removed.

Signed-off-by: Yafang Shao <laoar.shao@gmail.com>
---
 kernel/bpf/preload/iterators/iterators.bpf.c  |  16 +-
 kernel/bpf/preload/iterators/iterators.skel.h | 599 ++++++++++++++------------
 2 files changed, 334 insertions(+), 281 deletions(-)

diff --git a/kernel/bpf/preload/iterators/iterators.bpf.c b/kernel/bpf/preload/iterators/iterators.bpf.c
index 03af863..cf6b2c0 100644
--- a/kernel/bpf/preload/iterators/iterators.bpf.c
+++ b/kernel/bpf/preload/iterators/iterators.bpf.c
@@ -16,6 +16,7 @@ struct bpf_map {
 	__u32 id;
 	char name[16];
 	__u32 max_entries;
+	char pin_name[64];
 };
 
 struct bpf_iter__bpf_map {
@@ -44,6 +45,7 @@ struct bpf_prog_aux {
 	struct bpf_prog *dst_prog;
 	struct bpf_func_info *func_info;
 	struct btf *btf;
+	char pin_name[64];
 };
 
 struct bpf_prog {
@@ -84,9 +86,11 @@ int dump_bpf_map(struct bpf_iter__bpf_map *ctx)
 		return 0;
 
 	if (seq_num == 0)
-		BPF_SEQ_PRINTF(seq, "  id name             max_entries\n");
+		BPF_SEQ_PRINTF(seq, "%4s %-16s %-12s %s\n",
+						"id", "name", "max_entries", "pinned");
 
-	BPF_SEQ_PRINTF(seq, "%4u %-16s%6d\n", map->id, map->name, map->max_entries);
+	BPF_SEQ_PRINTF(seq, "%4u %-16s %-12d %s\n",
+					map->id, map->name, map->max_entries, map->pin_name);
 	return 0;
 }
 
@@ -103,11 +107,13 @@ int dump_bpf_prog(struct bpf_iter__bpf_prog *ctx)
 
 	aux = prog->aux;
 	if (seq_num == 0)
-		BPF_SEQ_PRINTF(seq, "  id name             attached\n");
+		BPF_SEQ_PRINTF(seq, "%4s %-16s %-16s %s\n",
+						"id", "name", "attached", "pinned");
 
-	BPF_SEQ_PRINTF(seq, "%4u %-16s %s %s\n", aux->id,
+	BPF_SEQ_PRINTF(seq, "%4u %-16s %-16s %s %s\n", aux->id,
 		       get_name(aux->btf, aux->func_info[0].type_id, aux->name),
-		       aux->attach_func_name, aux->dst_prog->aux->name);
+		       aux->attach_func_name, aux->pin_name,
+			   aux->dst_prog->aux->name);
 	return 0;
 }
 char LICENSE[] SEC("license") = "GPL";
diff --git a/kernel/bpf/preload/iterators/iterators.skel.h b/kernel/bpf/preload/iterators/iterators.skel.h
index cf9a6a9..4efb8e7 100644
--- a/kernel/bpf/preload/iterators/iterators.skel.h
+++ b/kernel/bpf/preload/iterators/iterators.skel.h
@@ -4,6 +4,7 @@
 #ifndef __ITERATORS_BPF_SKEL_H__
 #define __ITERATORS_BPF_SKEL_H__
 
+#include <errno.h>
 #include <stdlib.h>
 #include <bpf/libbpf.h>
 
@@ -12,6 +13,7 @@ struct iterators_bpf {
 	struct bpf_object *obj;
 	struct {
 		struct bpf_map *rodata;
+		struct bpf_map *rodata_str1_1;
 	} maps;
 	struct {
 		struct bpf_program *dump_bpf_map;
@@ -22,11 +24,9 @@ struct iterators_bpf {
 		struct bpf_link *dump_bpf_prog;
 	} links;
 	struct iterators_bpf__rodata {
-		char dump_bpf_map____fmt[35];
-		char dump_bpf_map____fmt_1[14];
-		char dump_bpf_prog____fmt[32];
-		char dump_bpf_prog____fmt_2[17];
 	} *rodata;
+	struct iterators_bpf__rodata_str1_1 {
+	} *rodata_str1_1;
 };
 
 static void
@@ -46,18 +46,26 @@ struct iterators_bpf {
 iterators_bpf__open_opts(const struct bpf_object_open_opts *opts)
 {
 	struct iterators_bpf *obj;
+	int err;
 
 	obj = (struct iterators_bpf *)calloc(1, sizeof(*obj));
-	if (!obj)
+	if (!obj) {
+		errno = ENOMEM;
 		return NULL;
-	if (iterators_bpf__create_skeleton(obj))
-		goto err;
-	if (bpf_object__open_skeleton(obj->skeleton, opts))
-		goto err;
+	}
+
+	err = iterators_bpf__create_skeleton(obj);
+	if (err)
+		goto err_out;
+
+	err = bpf_object__open_skeleton(obj->skeleton, opts);
+	if (err)
+		goto err_out;
 
 	return obj;
-err:
+err_out:
 	iterators_bpf__destroy(obj);
+	errno = -err;
 	return NULL;
 }
 
@@ -77,12 +85,15 @@ struct iterators_bpf {
 iterators_bpf__open_and_load(void)
 {
 	struct iterators_bpf *obj;
+	int err;
 
 	obj = iterators_bpf__open();
 	if (!obj)
 		return NULL;
-	if (iterators_bpf__load(obj)) {
+	err = iterators_bpf__load(obj);
+	if (err) {
 		iterators_bpf__destroy(obj);
+		errno = -err;
 		return NULL;
 	}
 	return obj;
@@ -100,6 +111,8 @@ struct iterators_bpf {
 	return bpf_object__detach_skeleton(obj->skeleton);
 }
 
+static inline const void *iterators_bpf__elf_bytes(size_t *sz);
+
 static inline int
 iterators_bpf__create_skeleton(struct iterators_bpf *obj)
 {
@@ -107,7 +120,7 @@ struct iterators_bpf {
 
 	s = (struct bpf_object_skeleton *)calloc(1, sizeof(*s));
 	if (!s)
-		return -1;
+		goto err;
 	obj->skeleton = s;
 
 	s->sz = sizeof(*s);
@@ -115,7 +128,7 @@ struct iterators_bpf {
 	s->obj = &obj->obj;
 
 	/* maps */
-	s->map_cnt = 1;
+	s->map_cnt = 2;
 	s->map_skel_sz = sizeof(*s->maps);
 	s->maps = (struct bpf_map_skeleton *)calloc(s->map_cnt, s->map_skel_sz);
 	if (!s->maps)
@@ -125,6 +138,10 @@ struct iterators_bpf {
 	s->maps[0].map = &obj->maps.rodata;
 	s->maps[0].mmaped = (void **)&obj->rodata;
 
+	s->maps[1].name = ".rodata.str1.1";
+	s->maps[1].map = &obj->maps.rodata_str1_1;
+	s->maps[1].mmaped = (void **)&obj->rodata_str1_1;
+
 	/* programs */
 	s->prog_cnt = 2;
 	s->prog_skel_sz = sizeof(*s->progs);
@@ -140,273 +157,303 @@ struct iterators_bpf {
 	s->progs[1].prog = &obj->progs.dump_bpf_prog;
 	s->progs[1].link = &obj->links.dump_bpf_prog;
 
-	s->data_sz = 7176;
-	s->data = (void *)"\
-\x7f\x45\x4c\x46\x02\x01\x01\0\0\0\0\0\0\0\0\0\x01\0\xf7\0\x01\0\0\0\0\0\0\0\0\
-\0\0\0\0\0\0\0\0\0\0\0\x48\x18\0\0\0\0\0\0\0\0\0\0\x40\0\0\0\0\0\x40\0\x0f\0\
-\x0e\0\x79\x12\0\0\0\0\0\0\x79\x26\0\0\0\0\0\0\x79\x17\x08\0\0\0\0\0\x15\x07\
-\x1a\0\0\0\0\0\x79\x21\x10\0\0\0\0\0\x55\x01\x08\0\0\0\0\0\xbf\xa4\0\0\0\0\0\0\
-\x07\x04\0\0\xe8\xff\xff\xff\xbf\x61\0\0\0\0\0\0\x18\x02\0\0\0\0\0\0\0\0\0\0\0\
-\0\0\0\xb7\x03\0\0\x23\0\0\0\xb7\x05\0\0\0\0\0\0\x85\0\0\0\x7e\0\0\0\x61\x71\0\
-\0\0\0\0\0\x7b\x1a\xe8\xff\0\0\0\0\xb7\x01\0\0\x04\0\0\0\xbf\x72\0\0\0\0\0\0\
-\x0f\x12\0\0\0\0\0\0\x7b\x2a\xf0\xff\0\0\0\0\x61\x71\x14\0\0\0\0\0\x7b\x1a\xf8\
-\xff\0\0\0\0\xbf\xa4\0\0\0\0\0\0\x07\x04\0\0\xe8\xff\xff\xff\xbf\x61\0\0\0\0\0\
-\0\x18\x02\0\0\x23\0\0\0\0\0\0\0\0\0\0\0\xb7\x03\0\0\x0e\0\0\0\xb7\x05\0\0\x18\
-\0\0\0\x85\0\0\0\x7e\0\0\0\xb7\0\0\0\0\0\0\0\x95\0\0\0\0\0\0\0\x79\x12\0\0\0\0\
-\0\0\x79\x26\0\0\0\0\0\0\x79\x11\x08\0\0\0\0\0\x15\x01\x3b\0\0\0\0\0\x79\x17\0\
-\0\0\0\0\0\x79\x21\x10\0\0\0\0\0\x55\x01\x08\0\0\0\0\0\xbf\xa4\0\0\0\0\0\0\x07\
-\x04\0\0\xd0\xff\xff\xff\xbf\x61\0\0\0\0\0\0\x18\x02\0\0\x31\0\0\0\0\0\0\0\0\0\
-\0\0\xb7\x03\0\0\x20\0\0\0\xb7\x05\0\0\0\0\0\0\x85\0\0\0\x7e\0\0\0\x7b\x6a\xc8\
-\xff\0\0\0\0\x61\x71\0\0\0\0\0\0\x7b\x1a\xd0\xff\0\0\0\0\xb7\x03\0\0\x04\0\0\0\
-\xbf\x79\0\0\0\0\0\0\x0f\x39\0\0\0\0\0\0\x79\x71\x28\0\0\0\0\0\x79\x78\x30\0\0\
-\0\0\0\x15\x08\x18\0\0\0\0\0\xb7\x02\0\0\0\0\0\0\x0f\x21\0\0\0\0\0\0\x61\x11\
-\x04\0\0\0\0\0\x79\x83\x08\0\0\0\0\0\x67\x01\0\0\x03\0\0\0\x0f\x13\0\0\0\0\0\0\
-\x79\x86\0\0\0\0\0\0\xbf\xa1\0\0\0\0\0\0\x07\x01\0\0\xf8\xff\xff\xff\xb7\x02\0\
-\0\x08\0\0\0\x85\0\0\0\x71\0\0\0\xb7\x01\0\0\0\0\0\0\x79\xa3\xf8\xff\0\0\0\0\
-\x0f\x13\0\0\0\0\0\0\xbf\xa1\0\0\0\0\0\0\x07\x01\0\0\xf4\xff\xff\xff\xb7\x02\0\
-\0\x04\0\0\0\x85\0\0\0\x71\0\0\0\xb7\x03\0\0\x04\0\0\0\x61\xa1\xf4\xff\0\0\0\0\
-\x61\x82\x10\0\0\0\0\0\x3d\x21\x02\0\0\0\0\0\x0f\x16\0\0\0\0\0\0\xbf\x69\0\0\0\
-\0\0\0\x7b\x9a\xd8\xff\0\0\0\0\x79\x71\x18\0\0\0\0\0\x7b\x1a\xe0\xff\0\0\0\0\
-\x79\x71\x20\0\0\0\0\0\x79\x11\0\0\0\0\0\0\x0f\x31\0\0\0\0\0\0\x7b\x1a\xe8\xff\
-\0\0\0\0\xbf\xa4\0\0\0\0\0\0\x07\x04\0\0\xd0\xff\xff\xff\x79\xa1\xc8\xff\0\0\0\
-\0\x18\x02\0\0\x51\0\0\0\0\0\0\0\0\0\0\0\xb7\x03\0\0\x11\0\0\0\xb7\x05\0\0\x20\
-\0\0\0\x85\0\0\0\x7e\0\0\0\xb7\0\0\0\0\0\0\0\x95\0\0\0\0\0\0\0\x20\x20\x69\x64\
-\x20\x6e\x61\x6d\x65\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x6d\
-\x61\x78\x5f\x65\x6e\x74\x72\x69\x65\x73\x0a\0\x25\x34\x75\x20\x25\x2d\x31\x36\
-\x73\x25\x36\x64\x0a\0\x20\x20\x69\x64\x20\x6e\x61\x6d\x65\x20\x20\x20\x20\x20\
-\x20\x20\x20\x20\x20\x20\x20\x20\x61\x74\x74\x61\x63\x68\x65\x64\x0a\0\x25\x34\
-\x75\x20\x25\x2d\x31\x36\x73\x20\x25\x73\x20\x25\x73\x0a\0\x47\x50\x4c\0\x9f\
-\xeb\x01\0\x18\0\0\0\0\0\0\0\x1c\x04\0\0\x1c\x04\0\0\x09\x05\0\0\0\0\0\0\0\0\0\
-\x02\x02\0\0\0\x01\0\0\0\x02\0\0\x04\x10\0\0\0\x13\0\0\0\x03\0\0\0\0\0\0\0\x18\
-\0\0\0\x04\0\0\0\x40\0\0\0\0\0\0\0\0\0\0\x02\x08\0\0\0\0\0\0\0\0\0\0\x02\x0d\0\
-\0\0\0\0\0\0\x01\0\0\x0d\x06\0\0\0\x1c\0\0\0\x01\0\0\0\x20\0\0\0\0\0\0\x01\x04\
-\0\0\0\x20\0\0\x01\x24\0\0\0\x01\0\0\x0c\x05\0\0\0\xaf\0\0\0\x03\0\0\x04\x18\0\
-\0\0\xbd\0\0\0\x09\0\0\0\0\0\0\0\xc1\0\0\0\x0b\0\0\0\x40\0\0\0\xcc\0\0\0\x0b\0\
-\0\0\x80\0\0\0\0\0\0\0\0\0\0\x02\x0a\0\0\0\xd4\0\0\0\0\0\0\x07\0\0\0\0\xdd\0\0\
-\0\0\0\0\x08\x0c\0\0\0\xe3\0\0\0\0\0\0\x01\x08\0\0\0\x40\0\0\0\xa4\x01\0\0\x03\
-\0\0\x04\x18\0\0\0\xac\x01\0\0\x0e\0\0\0\0\0\0\0\xaf\x01\0\0\x11\0\0\0\x20\0\0\
-\0\xb4\x01\0\0\x0e\0\0\0\xa0\0\0\0\xc0\x01\0\0\0\0\0\x08\x0f\0\0\0\xc6\x01\0\0\
-\0\0\0\x01\x04\0\0\0\x20\0\0\0\xd3\x01\0\0\0\0\0\x01\x01\0\0\0\x08\0\0\x01\0\0\
-\0\0\0\0\0\x03\0\0\0\0\x10\0\0\0\x12\0\0\0\x10\0\0\0\xd8\x01\0\0\0\0\0\x01\x04\
-\0\0\0\x20\0\0\0\0\0\0\0\0\0\0\x02\x14\0\0\0\x3c\x02\0\0\x02\0\0\x04\x10\0\0\0\
-\x13\0\0\0\x03\0\0\0\0\0\0\0\x4f\x02\0\0\x15\0\0\0\x40\0\0\0\0\0\0\0\0\0\0\x02\
-\x18\0\0\0\0\0\0\0\x01\0\0\x0d\x06\0\0\0\x1c\0\0\0\x13\0\0\0\x54\x02\0\0\x01\0\
-\0\x0c\x16\0\0\0\xa0\x02\0\0\x01\0\0\x04\x08\0\0\0\xa9\x02\0\0\x19\0\0\0\0\0\0\
-\0\0\0\0\0\0\0\0\x02\x1a\0\0\0\xfa\x02\0\0\x06\0\0\x04\x38\0\0\0\xac\x01\0\0\
-\x0e\0\0\0\0\0\0\0\xaf\x01\0\0\x11\0\0\0\x20\0\0\0\x07\x03\0\0\x1b\0\0\0\xc0\0\
-\0\0\x18\x03\0\0\x15\0\0\0\0\x01\0\0\x21\x03\0\0\x1d\0\0\0\x40\x01\0\0\x2b\x03\
-\0\0\x1e\0\0\0\x80\x01\0\0\0\0\0\0\0\0\0\x02\x1c\0\0\0\0\0\0\0\0\0\0\x0a\x10\0\
-\0\0\0\0\0\0\0\0\0\x02\x1f\0\0\0\0\0\0\0\0\0\0\x02\x20\0\0\0\x75\x03\0\0\x02\0\
-\0\x04\x08\0\0\0\x83\x03\0\0\x0e\0\0\0\0\0\0\0\x8c\x03\0\0\x0e\0\0\0\x20\0\0\0\
-\x2b\x03\0\0\x03\0\0\x04\x18\0\0\0\x96\x03\0\0\x1b\0\0\0\0\0\0\0\x9e\x03\0\0\
-\x21\0\0\0\x40\0\0\0\xa4\x03\0\0\x23\0\0\0\x80\0\0\0\0\0\0\0\0\0\0\x02\x22\0\0\
-\0\0\0\0\0\0\0\0\x02\x24\0\0\0\xa8\x03\0\0\x01\0\0\x04\x04\0\0\0\xb3\x03\0\0\
-\x0e\0\0\0\0\0\0\0\x1c\x04\0\0\x01\0\0\x04\x04\0\0\0\x25\x04\0\0\x0e\0\0\0\0\0\
-\0\0\0\0\0\0\0\0\0\x03\0\0\0\0\x1c\0\0\0\x12\0\0\0\x23\0\0\0\x9b\x04\0\0\0\0\0\
-\x0e\x25\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x03\0\0\0\0\x1c\0\0\0\x12\0\0\0\x0e\0\0\0\
-\xaf\x04\0\0\0\0\0\x0e\x27\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x03\0\0\0\0\x1c\0\0\0\
-\x12\0\0\0\x20\0\0\0\xc5\x04\0\0\0\0\0\x0e\x29\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x03\
-\0\0\0\0\x1c\0\0\0\x12\0\0\0\x11\0\0\0\xda\x04\0\0\0\0\0\x0e\x2b\0\0\0\0\0\0\0\
-\0\0\0\0\0\0\0\x03\0\0\0\0\x10\0\0\0\x12\0\0\0\x04\0\0\0\xf1\x04\0\0\0\0\0\x0e\
-\x2d\0\0\0\x01\0\0\0\xf9\x04\0\0\x04\0\0\x0f\0\0\0\0\x26\0\0\0\0\0\0\0\x23\0\0\
-\0\x28\0\0\0\x23\0\0\0\x0e\0\0\0\x2a\0\0\0\x31\0\0\0\x20\0\0\0\x2c\0\0\0\x51\0\
-\0\0\x11\0\0\0\x01\x05\0\0\x01\0\0\x0f\0\0\0\0\x2e\0\0\0\0\0\0\0\x04\0\0\0\0\
-\x62\x70\x66\x5f\x69\x74\x65\x72\x5f\x5f\x62\x70\x66\x5f\x6d\x61\x70\0\x6d\x65\
-\x74\x61\0\x6d\x61\x70\0\x63\x74\x78\0\x69\x6e\x74\0\x64\x75\x6d\x70\x5f\x62\
-\x70\x66\x5f\x6d\x61\x70\0\x69\x74\x65\x72\x2f\x62\x70\x66\x5f\x6d\x61\x70\0\
-\x30\x3a\x30\0\x2f\x68\x6f\x6d\x65\x2f\x61\x6c\x72\x75\x61\x2f\x62\x75\x69\x6c\
-\x64\x2f\x6c\x69\x6e\x75\x78\x2f\x6b\x65\x72\x6e\x65\x6c\x2f\x62\x70\x66\x2f\
-\x70\x72\x65\x6c\x6f\x61\x64\x2f\x69\x74\x65\x72\x61\x74\x6f\x72\x73\x2f\x69\
-\x74\x65\x72\x61\x74\x6f\x72\x73\x2e\x62\x70\x66\x2e\x63\0\x09\x73\x74\x72\x75\
-\x63\x74\x20\x73\x65\x71\x5f\x66\x69\x6c\x65\x20\x2a\x73\x65\x71\x20\x3d\x20\
-\x63\x74\x78\x2d\x3e\x6d\x65\x74\x61\x2d\x3e\x73\x65\x71\x3b\0\x62\x70\x66\x5f\
-\x69\x74\x65\x72\x5f\x6d\x65\x74\x61\0\x73\x65\x71\0\x73\x65\x73\x73\x69\x6f\
-\x6e\x5f\x69\x64\0\x73\x65\x71\x5f\x6e\x75\x6d\0\x73\x65\x71\x5f\x66\x69\x6c\
-\x65\0\x5f\x5f\x75\x36\x34\0\x6c\x6f\x6e\x67\x20\x6c\x6f\x6e\x67\x20\x75\x6e\
-\x73\x69\x67\x6e\x65\x64\x20\x69\x6e\x74\0\x30\x3a\x31\0\x09\x73\x74\x72\x75\
-\x63\x74\x20\x62\x70\x66\x5f\x6d\x61\x70\x20\x2a\x6d\x61\x70\x20\x3d\x20\x63\
-\x74\x78\x2d\x3e\x6d\x61\x70\x3b\0\x09\x69\x66\x20\x28\x21\x6d\x61\x70\x29\0\
-\x30\x3a\x32\0\x09\x5f\x5f\x75\x36\x34\x20\x73\x65\x71\x5f\x6e\x75\x6d\x20\x3d\
-\x20\x63\x74\x78\x2d\x3e\x6d\x65\x74\x61\x2d\x3e\x73\x65\x71\x5f\x6e\x75\x6d\
-\x3b\0\x09\x69\x66\x20\x28\x73\x65\x71\x5f\x6e\x75\x6d\x20\x3d\x3d\x20\x30\x29\
-\0\x09\x09\x42\x50\x46\x5f\x53\x45\x51\x5f\x50\x52\x49\x4e\x54\x46\x28\x73\x65\
-\x71\x2c\x20\x22\x20\x20\x69\x64\x20\x6e\x61\x6d\x65\x20\x20\x20\x20\x20\x20\
-\x20\x20\x20\x20\x20\x20\x20\x6d\x61\x78\x5f\x65\x6e\x74\x72\x69\x65\x73\x5c\
-\x6e\x22\x29\x3b\0\x62\x70\x66\x5f\x6d\x61\x70\0\x69\x64\0\x6e\x61\x6d\x65\0\
-\x6d\x61\x78\x5f\x65\x6e\x74\x72\x69\x65\x73\0\x5f\x5f\x75\x33\x32\0\x75\x6e\
-\x73\x69\x67\x6e\x65\x64\x20\x69\x6e\x74\0\x63\x68\x61\x72\0\x5f\x5f\x41\x52\
-\x52\x41\x59\x5f\x53\x49\x5a\x45\x5f\x54\x59\x50\x45\x5f\x5f\0\x09\x42\x50\x46\
-\x5f\x53\x45\x51\x5f\x50\x52\x49\x4e\x54\x46\x28\x73\x65\x71\x2c\x20\x22\x25\
-\x34\x75\x20\x25\x2d\x31\x36\x73\x25\x36\x64\x5c\x6e\x22\x2c\x20\x6d\x61\x70\
-\x2d\x3e\x69\x64\x2c\x20\x6d\x61\x70\x2d\x3e\x6e\x61\x6d\x65\x2c\x20\x6d\x61\
-\x70\x2d\x3e\x6d\x61\x78\x5f\x65\x6e\x74\x72\x69\x65\x73\x29\x3b\0\x7d\0\x62\
-\x70\x66\x5f\x69\x74\x65\x72\x5f\x5f\x62\x70\x66\x5f\x70\x72\x6f\x67\0\x70\x72\
-\x6f\x67\0\x64\x75\x6d\x70\x5f\x62\x70\x66\x5f\x70\x72\x6f\x67\0\x69\x74\x65\
-\x72\x2f\x62\x70\x66\x5f\x70\x72\x6f\x67\0\x09\x73\x74\x72\x75\x63\x74\x20\x62\
-\x70\x66\x5f\x70\x72\x6f\x67\x20\x2a\x70\x72\x6f\x67\x20\x3d\x20\x63\x74\x78\
-\x2d\x3e\x70\x72\x6f\x67\x3b\0\x09\x69\x66\x20\x28\x21\x70\x72\x6f\x67\x29\0\
-\x62\x70\x66\x5f\x70\x72\x6f\x67\0\x61\x75\x78\0\x09\x61\x75\x78\x20\x3d\x20\
-\x70\x72\x6f\x67\x2d\x3e\x61\x75\x78\x3b\0\x09\x09\x42\x50\x46\x5f\x53\x45\x51\
-\x5f\x50\x52\x49\x4e\x54\x46\x28\x73\x65\x71\x2c\x20\x22\x20\x20\x69\x64\x20\
-\x6e\x61\x6d\x65\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x61\x74\
-\x74\x61\x63\x68\x65\x64\x5c\x6e\x22\x29\x3b\0\x62\x70\x66\x5f\x70\x72\x6f\x67\
-\x5f\x61\x75\x78\0\x61\x74\x74\x61\x63\x68\x5f\x66\x75\x6e\x63\x5f\x6e\x61\x6d\
-\x65\0\x64\x73\x74\x5f\x70\x72\x6f\x67\0\x66\x75\x6e\x63\x5f\x69\x6e\x66\x6f\0\
-\x62\x74\x66\0\x09\x42\x50\x46\x5f\x53\x45\x51\x5f\x50\x52\x49\x4e\x54\x46\x28\
-\x73\x65\x71\x2c\x20\x22\x25\x34\x75\x20\x25\x2d\x31\x36\x73\x20\x25\x73\x20\
-\x25\x73\x5c\x6e\x22\x2c\x20\x61\x75\x78\x2d\x3e\x69\x64\x2c\0\x30\x3a\x34\0\
-\x30\x3a\x35\0\x09\x69\x66\x20\x28\x21\x62\x74\x66\x29\0\x62\x70\x66\x5f\x66\
-\x75\x6e\x63\x5f\x69\x6e\x66\x6f\0\x69\x6e\x73\x6e\x5f\x6f\x66\x66\0\x74\x79\
-\x70\x65\x5f\x69\x64\0\x30\0\x73\x74\x72\x69\x6e\x67\x73\0\x74\x79\x70\x65\x73\
-\0\x68\x64\x72\0\x62\x74\x66\x5f\x68\x65\x61\x64\x65\x72\0\x73\x74\x72\x5f\x6c\
-\x65\x6e\0\x09\x74\x79\x70\x65\x73\x20\x3d\x20\x62\x74\x66\x2d\x3e\x74\x79\x70\
-\x65\x73\x3b\0\x09\x62\x70\x66\x5f\x70\x72\x6f\x62\x65\x5f\x72\x65\x61\x64\x5f\
-\x6b\x65\x72\x6e\x65\x6c\x28\x26\x74\x2c\x20\x73\x69\x7a\x65\x6f\x66\x28\x74\
-\x29\x2c\x20\x74\x79\x70\x65\x73\x20\x2b\x20\x62\x74\x66\x5f\x69\x64\x29\x3b\0\
-\x09\x73\x74\x72\x20\x3d\x20\x62\x74\x66\x2d\x3e\x73\x74\x72\x69\x6e\x67\x73\
-\x3b\0\x62\x74\x66\x5f\x74\x79\x70\x65\0\x6e\x61\x6d\x65\x5f\x6f\x66\x66\0\x09\
-\x6e\x61\x6d\x65\x5f\x6f\x66\x66\x20\x3d\x20\x42\x50\x46\x5f\x43\x4f\x52\x45\
-\x5f\x52\x45\x41\x44\x28\x74\x2c\x20\x6e\x61\x6d\x65\x5f\x6f\x66\x66\x29\x3b\0\
-\x30\x3a\x32\x3a\x30\0\x09\x69\x66\x20\x28\x6e\x61\x6d\x65\x5f\x6f\x66\x66\x20\
-\x3e\x3d\x20\x62\x74\x66\x2d\x3e\x68\x64\x72\x2e\x73\x74\x72\x5f\x6c\x65\x6e\
-\x29\0\x09\x72\x65\x74\x75\x72\x6e\x20\x73\x74\x72\x20\x2b\x20\x6e\x61\x6d\x65\
-\x5f\x6f\x66\x66\x3b\0\x30\x3a\x33\0\x64\x75\x6d\x70\x5f\x62\x70\x66\x5f\x6d\
-\x61\x70\x2e\x5f\x5f\x5f\x66\x6d\x74\0\x64\x75\x6d\x70\x5f\x62\x70\x66\x5f\x6d\
-\x61\x70\x2e\x5f\x5f\x5f\x66\x6d\x74\x2e\x31\0\x64\x75\x6d\x70\x5f\x62\x70\x66\
-\x5f\x70\x72\x6f\x67\x2e\x5f\x5f\x5f\x66\x6d\x74\0\x64\x75\x6d\x70\x5f\x62\x70\
-\x66\x5f\x70\x72\x6f\x67\x2e\x5f\x5f\x5f\x66\x6d\x74\x2e\x32\0\x4c\x49\x43\x45\
-\x4e\x53\x45\0\x2e\x72\x6f\x64\x61\x74\x61\0\x6c\x69\x63\x65\x6e\x73\x65\0\x9f\
-\xeb\x01\0\x20\0\0\0\0\0\0\0\x24\0\0\0\x24\0\0\0\x44\x02\0\0\x68\x02\0\0\xa4\
-\x01\0\0\x08\0\0\0\x31\0\0\0\x01\0\0\0\0\0\0\0\x07\0\0\0\x62\x02\0\0\x01\0\0\0\
-\0\0\0\0\x17\0\0\0\x10\0\0\0\x31\0\0\0\x09\0\0\0\0\0\0\0\x42\0\0\0\x87\0\0\0\
-\x1e\x40\x01\0\x08\0\0\0\x42\0\0\0\x87\0\0\0\x24\x40\x01\0\x10\0\0\0\x42\0\0\0\
-\xfe\0\0\0\x1d\x48\x01\0\x18\0\0\0\x42\0\0\0\x1f\x01\0\0\x06\x50\x01\0\x20\0\0\
-\0\x42\0\0\0\x2e\x01\0\0\x1d\x44\x01\0\x28\0\0\0\x42\0\0\0\x53\x01\0\0\x06\x5c\
-\x01\0\x38\0\0\0\x42\0\0\0\x66\x01\0\0\x03\x60\x01\0\x70\0\0\0\x42\0\0\0\xec\
-\x01\0\0\x02\x68\x01\0\xf0\0\0\0\x42\0\0\0\x3a\x02\0\0\x01\x70\x01\0\x62\x02\0\
-\0\x1a\0\0\0\0\0\0\0\x42\0\0\0\x87\0\0\0\x1e\x84\x01\0\x08\0\0\0\x42\0\0\0\x87\
-\0\0\0\x24\x84\x01\0\x10\0\0\0\x42\0\0\0\x70\x02\0\0\x1f\x8c\x01\0\x18\0\0\0\
-\x42\0\0\0\x94\x02\0\0\x06\x98\x01\0\x20\0\0\0\x42\0\0\0\xad\x02\0\0\x0e\xa4\
-\x01\0\x28\0\0\0\x42\0\0\0\x2e\x01\0\0\x1d\x88\x01\0\x30\0\0\0\x42\0\0\0\x53\
-\x01\0\0\x06\xa8\x01\0\x40\0\0\0\x42\0\0\0\xbf\x02\0\0\x03\xac\x01\0\x80\0\0\0\
-\x42\0\0\0\x2f\x03\0\0\x02\xb4\x01\0\xb8\0\0\0\x42\0\0\0\x6a\x03\0\0\x06\x08\
-\x01\0\xd0\0\0\0\x42\0\0\0\0\0\0\0\0\0\0\0\xd8\0\0\0\x42\0\0\0\xbb\x03\0\0\x0f\
-\x14\x01\0\xe0\0\0\0\x42\0\0\0\xd0\x03\0\0\x2d\x18\x01\0\xf0\0\0\0\x42\0\0\0\
-\x07\x04\0\0\x0d\x10\x01\0\0\x01\0\0\x42\0\0\0\0\0\0\0\0\0\0\0\x08\x01\0\0\x42\
-\0\0\0\xd0\x03\0\0\x02\x18\x01\0\x20\x01\0\0\x42\0\0\0\x2e\x04\0\0\x0d\x1c\x01\
-\0\x38\x01\0\0\x42\0\0\0\0\0\0\0\0\0\0\0\x40\x01\0\0\x42\0\0\0\x2e\x04\0\0\x0d\
-\x1c\x01\0\x58\x01\0\0\x42\0\0\0\x2e\x04\0\0\x0d\x1c\x01\0\x60\x01\0\0\x42\0\0\
-\0\x5c\x04\0\0\x1b\x20\x01\0\x68\x01\0\0\x42\0\0\0\x5c\x04\0\0\x06\x20\x01\0\
-\x70\x01\0\0\x42\0\0\0\x7f\x04\0\0\x0d\x28\x01\0\x78\x01\0\0\x42\0\0\0\0\0\0\0\
-\0\0\0\0\x80\x01\0\0\x42\0\0\0\x2f\x03\0\0\x02\xb4\x01\0\xf8\x01\0\0\x42\0\0\0\
-\x3a\x02\0\0\x01\xc4\x01\0\x10\0\0\0\x31\0\0\0\x07\0\0\0\0\0\0\0\x02\0\0\0\x3e\
-\0\0\0\0\0\0\0\x08\0\0\0\x08\0\0\0\x3e\0\0\0\0\0\0\0\x10\0\0\0\x02\0\0\0\xfa\0\
-\0\0\0\0\0\0\x20\0\0\0\x08\0\0\0\x2a\x01\0\0\0\0\0\0\x70\0\0\0\x0d\0\0\0\x3e\0\
-\0\0\0\0\0\0\x80\0\0\0\x0d\0\0\0\xfa\0\0\0\0\0\0\0\xa0\0\0\0\x0d\0\0\0\x2a\x01\
-\0\0\0\0\0\0\x62\x02\0\0\x12\0\0\0\0\0\0\0\x14\0\0\0\x3e\0\0\0\0\0\0\0\x08\0\0\
-\0\x08\0\0\0\x3e\0\0\0\0\0\0\0\x10\0\0\0\x14\0\0\0\xfa\0\0\0\0\0\0\0\x20\0\0\0\
-\x18\0\0\0\x3e\0\0\0\0\0\0\0\x28\0\0\0\x08\0\0\0\x2a\x01\0\0\0\0\0\0\x80\0\0\0\
-\x1a\0\0\0\x3e\0\0\0\0\0\0\0\x90\0\0\0\x1a\0\0\0\xfa\0\0\0\0\0\0\0\xa8\0\0\0\
-\x1a\0\0\0\x62\x03\0\0\0\0\0\0\xb0\0\0\0\x1a\0\0\0\x66\x03\0\0\0\0\0\0\xc0\0\0\
-\0\x1f\0\0\0\x94\x03\0\0\0\0\0\0\xd8\0\0\0\x20\0\0\0\xfa\0\0\0\0\0\0\0\xf0\0\0\
-\0\x20\0\0\0\x3e\0\0\0\0\0\0\0\x18\x01\0\0\x24\0\0\0\x3e\0\0\0\0\0\0\0\x50\x01\
-\0\0\x1a\0\0\0\xfa\0\0\0\0\0\0\0\x60\x01\0\0\x20\0\0\0\x56\x04\0\0\0\0\0\0\x88\
-\x01\0\0\x1a\0\0\0\x2a\x01\0\0\0\0\0\0\x98\x01\0\0\x1a\0\0\0\x97\x04\0\0\0\0\0\
-\0\xa0\x01\0\0\x18\0\0\0\x3e\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\
-\0\0\0\0\0\0\0\x91\0\0\0\x04\0\xf1\xff\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xe6\0\0\
-\0\0\0\x02\0\x70\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xd8\0\0\0\0\0\x02\0\xf0\0\0\0\0\
-\0\0\0\0\0\0\0\0\0\0\0\xdf\0\0\0\0\0\x03\0\x78\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\
-\xd1\0\0\0\0\0\x03\0\x80\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xca\0\0\0\0\0\x03\0\
-\xf8\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x14\0\0\0\x01\0\x04\0\0\0\0\0\0\0\0\0\x23\
-\0\0\0\0\0\0\0\x04\x01\0\0\x01\0\x04\0\x23\0\0\0\0\0\0\0\x0e\0\0\0\0\0\0\0\x28\
-\0\0\0\x01\0\x04\0\x31\0\0\0\0\0\0\0\x20\0\0\0\0\0\0\0\xed\0\0\0\x01\0\x04\0\
-\x51\0\0\0\0\0\0\0\x11\0\0\0\0\0\0\0\0\0\0\0\x03\0\x02\0\0\0\0\0\0\0\0\0\0\0\0\
-\0\0\0\0\0\0\0\0\0\x03\0\x03\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x03\0\
-\x04\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xc2\0\0\0\x11\0\x05\0\0\0\0\0\0\0\0\0\
-\x04\0\0\0\0\0\0\0\x3d\0\0\0\x12\0\x02\0\0\0\0\0\0\0\0\0\0\x01\0\0\0\0\0\0\x5b\
-\0\0\0\x12\0\x03\0\0\0\0\0\0\0\0\0\x08\x02\0\0\0\0\0\0\x48\0\0\0\0\0\0\0\x01\0\
-\0\0\x0d\0\0\0\xc8\0\0\0\0\0\0\0\x01\0\0\0\x0d\0\0\0\x50\0\0\0\0\0\0\0\x01\0\0\
-\0\x0d\0\0\0\xd0\x01\0\0\0\0\0\0\x01\0\0\0\x0d\0\0\0\xf0\x03\0\0\0\0\0\0\x0a\0\
-\0\0\x0d\0\0\0\xfc\x03\0\0\0\0\0\0\x0a\0\0\0\x0d\0\0\0\x08\x04\0\0\0\0\0\0\x0a\
-\0\0\0\x0d\0\0\0\x14\x04\0\0\0\0\0\0\x0a\0\0\0\x0d\0\0\0\x2c\x04\0\0\0\0\0\0\0\
-\0\0\0\x0e\0\0\0\x2c\0\0\0\0\0\0\0\0\0\0\0\x0b\0\0\0\x3c\0\0\0\0\0\0\0\0\0\0\0\
-\x0c\0\0\0\x50\0\0\0\0\0\0\0\0\0\0\0\x0b\0\0\0\x60\0\0\0\0\0\0\0\0\0\0\0\x0b\0\
-\0\0\x70\0\0\0\0\0\0\0\0\0\0\0\x0b\0\0\0\x80\0\0\0\0\0\0\0\0\0\0\0\x0b\0\0\0\
-\x90\0\0\0\0\0\0\0\0\0\0\0\x0b\0\0\0\xa0\0\0\0\0\0\0\0\0\0\0\0\x0b\0\0\0\xb0\0\
-\0\0\0\0\0\0\0\0\0\0\x0b\0\0\0\xc0\0\0\0\0\0\0\0\0\0\0\0\x0b\0\0\0\xd0\0\0\0\0\
-\0\0\0\0\0\0\0\x0b\0\0\0\xe8\0\0\0\0\0\0\0\0\0\0\0\x0c\0\0\0\xf8\0\0\0\0\0\0\0\
-\0\0\0\0\x0c\0\0\0\x08\x01\0\0\0\0\0\0\0\0\0\0\x0c\0\0\0\x18\x01\0\0\0\0\0\0\0\
-\0\0\0\x0c\0\0\0\x28\x01\0\0\0\0\0\0\0\0\0\0\x0c\0\0\0\x38\x01\0\0\0\0\0\0\0\0\
-\0\0\x0c\0\0\0\x48\x01\0\0\0\0\0\0\0\0\0\0\x0c\0\0\0\x58\x01\0\0\0\0\0\0\0\0\0\
-\0\x0c\0\0\0\x68\x01\0\0\0\0\0\0\0\0\0\0\x0c\0\0\0\x78\x01\0\0\0\0\0\0\0\0\0\0\
-\x0c\0\0\0\x88\x01\0\0\0\0\0\0\0\0\0\0\x0c\0\0\0\x98\x01\0\0\0\0\0\0\0\0\0\0\
-\x0c\0\0\0\xa8\x01\0\0\0\0\0\0\0\0\0\0\x0c\0\0\0\xb8\x01\0\0\0\0\0\0\0\0\0\0\
-\x0c\0\0\0\xc8\x01\0\0\0\0\0\0\0\0\0\0\x0c\0\0\0\xd8\x01\0\0\0\0\0\0\0\0\0\0\
-\x0c\0\0\0\xe8\x01\0\0\0\0\0\0\0\0\0\0\x0c\0\0\0\xf8\x01\0\0\0\0\0\0\0\0\0\0\
-\x0c\0\0\0\x08\x02\0\0\0\0\0\0\0\0\0\0\x0c\0\0\0\x18\x02\0\0\0\0\0\0\0\0\0\0\
-\x0c\0\0\0\x28\x02\0\0\0\0\0\0\0\0\0\0\x0c\0\0\0\x38\x02\0\0\0\0\0\0\0\0\0\0\
-\x0c\0\0\0\x48\x02\0\0\0\0\0\0\0\0\0\0\x0c\0\0\0\x58\x02\0\0\0\0\0\0\0\0\0\0\
-\x0c\0\0\0\x68\x02\0\0\0\0\0\0\0\0\0\0\x0c\0\0\0\x78\x02\0\0\0\0\0\0\0\0\0\0\
-\x0c\0\0\0\x94\x02\0\0\0\0\0\0\0\0\0\0\x0b\0\0\0\xa4\x02\0\0\0\0\0\0\0\0\0\0\
-\x0b\0\0\0\xb4\x02\0\0\0\0\0\0\0\0\0\0\x0b\0\0\0\xc4\x02\0\0\0\0\0\0\0\0\0\0\
-\x0b\0\0\0\xd4\x02\0\0\0\0\0\0\0\0\0\0\x0b\0\0\0\xe4\x02\0\0\0\0\0\0\0\0\0\0\
-\x0b\0\0\0\xf4\x02\0\0\0\0\0\0\0\0\0\0\x0b\0\0\0\x0c\x03\0\0\0\0\0\0\0\0\0\0\
-\x0c\0\0\0\x1c\x03\0\0\0\0\0\0\0\0\0\0\x0c\0\0\0\x2c\x03\0\0\0\0\0\0\0\0\0\0\
-\x0c\0\0\0\x3c\x03\0\0\0\0\0\0\0\0\0\0\x0c\0\0\0\x4c\x03\0\0\0\0\0\0\0\0\0\0\
-\x0c\0\0\0\x5c\x03\0\0\0\0\0\0\0\0\0\0\x0c\0\0\0\x6c\x03\0\0\0\0\0\0\0\0\0\0\
-\x0c\0\0\0\x7c\x03\0\0\0\0\0\0\0\0\0\0\x0c\0\0\0\x8c\x03\0\0\0\0\0\0\0\0\0\0\
-\x0c\0\0\0\x9c\x03\0\0\0\0\0\0\0\0\0\0\x0c\0\0\0\xac\x03\0\0\0\0\0\0\0\0\0\0\
-\x0c\0\0\0\xbc\x03\0\0\0\0\0\0\0\0\0\0\x0c\0\0\0\xcc\x03\0\0\0\0\0\0\0\0\0\0\
-\x0c\0\0\0\xdc\x03\0\0\0\0\0\0\0\0\0\0\x0c\0\0\0\xec\x03\0\0\0\0\0\0\0\0\0\0\
-\x0c\0\0\0\xfc\x03\0\0\0\0\0\0\0\0\0\0\x0c\0\0\0\x0c\x04\0\0\0\0\0\0\0\0\0\0\
-\x0c\0\0\0\x1c\x04\0\0\0\0\0\0\0\0\0\0\x0c\0\0\0\x4d\x4e\x40\x41\x42\x43\x4c\0\
-\x2e\x74\x65\x78\x74\0\x2e\x72\x65\x6c\x2e\x42\x54\x46\x2e\x65\x78\x74\0\x64\
-\x75\x6d\x70\x5f\x62\x70\x66\x5f\x6d\x61\x70\x2e\x5f\x5f\x5f\x66\x6d\x74\0\x64\
-\x75\x6d\x70\x5f\x62\x70\x66\x5f\x70\x72\x6f\x67\x2e\x5f\x5f\x5f\x66\x6d\x74\0\
-\x64\x75\x6d\x70\x5f\x62\x70\x66\x5f\x6d\x61\x70\0\x2e\x72\x65\x6c\x69\x74\x65\
-\x72\x2f\x62\x70\x66\x5f\x6d\x61\x70\0\x64\x75\x6d\x70\x5f\x62\x70\x66\x5f\x70\
-\x72\x6f\x67\0\x2e\x72\x65\x6c\x69\x74\x65\x72\x2f\x62\x70\x66\x5f\x70\x72\x6f\
-\x67\0\x2e\x6c\x6c\x76\x6d\x5f\x61\x64\x64\x72\x73\x69\x67\0\x6c\x69\x63\x65\
-\x6e\x73\x65\0\x69\x74\x65\x72\x61\x74\x6f\x72\x73\x2e\x62\x70\x66\x2e\x63\0\
-\x2e\x73\x74\x72\x74\x61\x62\0\x2e\x73\x79\x6d\x74\x61\x62\0\x2e\x72\x6f\x64\
-\x61\x74\x61\0\x2e\x72\x65\x6c\x2e\x42\x54\x46\0\x4c\x49\x43\x45\x4e\x53\x45\0\
-\x4c\x42\x42\x31\x5f\x37\0\x4c\x42\x42\x31\x5f\x36\0\x4c\x42\x42\x30\x5f\x34\0\
-\x4c\x42\x42\x31\x5f\x33\0\x4c\x42\x42\x30\x5f\x33\0\x64\x75\x6d\x70\x5f\x62\
-\x70\x66\x5f\x70\x72\x6f\x67\x2e\x5f\x5f\x5f\x66\x6d\x74\x2e\x32\0\x64\x75\x6d\
-\x70\x5f\x62\x70\x66\x5f\x6d\x61\x70\x2e\x5f\x5f\x5f\x66\x6d\x74\x2e\x31\0\0\0\
-\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\
-\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x01\0\0\0\x01\0\0\
-\0\x06\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x40\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\
-\0\0\0\0\x04\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x4e\0\0\0\x01\0\0\0\x06\0\0\0\0\0\0\
-\0\0\0\0\0\0\0\0\0\x40\0\0\0\0\0\0\0\0\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x08\0\0\
-\0\0\0\0\0\0\0\0\0\0\0\0\0\x6d\0\0\0\x01\0\0\0\x06\0\0\0\0\0\0\0\0\0\0\0\0\0\0\
-\0\x40\x01\0\0\0\0\0\0\x08\x02\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x08\0\0\0\0\0\0\0\0\
-\0\0\0\0\0\0\0\xb1\0\0\0\x01\0\0\0\x02\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x48\x03\0\
-\0\0\0\0\0\x62\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\
-\x89\0\0\0\x01\0\0\0\x03\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xaa\x03\0\0\0\0\0\0\x04\
-\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xbd\0\0\0\x01\
-\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xae\x03\0\0\0\0\0\0\x3d\x09\0\0\0\0\0\0\
-\0\0\0\0\0\0\0\0\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x0b\0\0\0\x01\0\0\0\0\0\0\0\
-\0\0\0\0\0\0\0\0\0\0\0\0\xeb\x0c\0\0\0\0\0\0\x2c\x04\0\0\0\0\0\0\0\0\0\0\0\0\0\
-\0\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xa9\0\0\0\x02\0\0\0\0\0\0\0\0\0\0\0\0\0\0\
-\0\0\0\0\0\x18\x11\0\0\0\0\0\0\x98\x01\0\0\0\0\0\0\x0e\0\0\0\x0e\0\0\0\x08\0\0\
-\0\0\0\0\0\x18\0\0\0\0\0\0\0\x4a\0\0\0\x09\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\
-\0\xb0\x12\0\0\0\0\0\0\x20\0\0\0\0\0\0\0\x08\0\0\0\x02\0\0\0\x08\0\0\0\0\0\0\0\
-\x10\0\0\0\0\0\0\0\x69\0\0\0\x09\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xd0\x12\
-\0\0\0\0\0\0\x20\0\0\0\0\0\0\0\x08\0\0\0\x03\0\0\0\x08\0\0\0\0\0\0\0\x10\0\0\0\
-\0\0\0\0\xb9\0\0\0\x09\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xf0\x12\0\0\0\0\0\
-\0\x50\0\0\0\0\0\0\0\x08\0\0\0\x06\0\0\0\x08\0\0\0\0\0\0\0\x10\0\0\0\0\0\0\0\
-\x07\0\0\0\x09\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x40\x13\0\0\0\0\0\0\xe0\
-\x03\0\0\0\0\0\0\x08\0\0\0\x07\0\0\0\x08\0\0\0\0\0\0\0\x10\0\0\0\0\0\0\0\x7b\0\
-\0\0\x03\x4c\xff\x6f\0\0\0\x80\0\0\0\0\0\0\0\0\0\0\0\0\x20\x17\0\0\0\0\0\0\x07\
-\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xa1\0\0\0\x03\
-\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x27\x17\0\0\0\0\0\0\x1a\x01\0\0\0\0\0\0\
-\0\0\0\0\0\0\0\0\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0";
+	s->data = (void *)iterators_bpf__elf_bytes(&s->data_sz);
 
 	return 0;
 err:
 	bpf_object__destroy_skeleton(s);
-	return -1;
+	return -ENOMEM;
+}
+
+static inline const void *iterators_bpf__elf_bytes(size_t *sz)
+{
+	*sz = 7896;
+	return (const void *)"\
+\x7f\x45\x4c\x46\x02\x01\x01\0\0\0\0\0\0\0\0\0\x01\0\xf7\0\x01\0\0\0\0\0\0\0\0\
+\0\0\0\0\0\0\0\0\0\0\0\xd8\x1a\0\0\0\0\0\0\0\0\0\0\x40\0\0\0\0\0\x40\0\x10\0\
+\x0f\0\x79\x12\0\0\0\0\0\0\x79\x26\0\0\0\0\0\0\x79\x17\x08\0\0\0\0\0\x15\x07\
+\x29\0\0\0\0\0\x79\x21\x10\0\0\0\0\0\x55\x01\x14\0\0\0\0\0\x18\x01\0\0\0\0\0\0\
+\0\0\0\0\0\0\0\0\x7b\x1a\xf8\xff\0\0\0\0\x18\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\
+\x7b\x1a\xf0\xff\0\0\0\0\x18\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x7b\x1a\xe8\xff\0\
+\0\0\0\x18\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x7b\x1a\xe0\xff\0\0\0\0\xbf\xa4\0\0\
+\0\0\0\0\x07\x04\0\0\xe0\xff\xff\xff\xbf\x61\0\0\0\0\0\0\x18\x02\0\0\0\0\0\0\0\
+\0\0\0\0\0\0\0\xb7\x03\0\0\x14\0\0\0\xb7\x05\0\0\x20\0\0\0\x85\0\0\0\x7e\0\0\0\
+\x61\x71\0\0\0\0\0\0\x7b\x1a\xe0\xff\0\0\0\0\xb7\x01\0\0\x04\0\0\0\xbf\x72\0\0\
+\0\0\0\0\x0f\x12\0\0\0\0\0\0\x7b\x2a\xe8\xff\0\0\0\0\x61\x71\x14\0\0\0\0\0\x7b\
+\x1a\xf0\xff\0\0\0\0\xb7\x01\0\0\x18\0\0\0\x0f\x17\0\0\0\0\0\0\x7b\x7a\xf8\xff\
+\0\0\0\0\xbf\xa4\0\0\0\0\0\0\x07\x04\0\0\xe0\xff\xff\xff\xbf\x61\0\0\0\0\0\0\
+\x18\x02\0\0\x14\0\0\0\0\0\0\0\0\0\0\0\xb7\x03\0\0\x14\0\0\0\xb7\x05\0\0\x20\0\
+\0\0\x85\0\0\0\x7e\0\0\0\xb7\0\0\0\0\0\0\0\x95\0\0\0\0\0\0\0\x79\x12\0\0\0\0\0\
+\0\x79\x26\0\0\0\0\0\0\x79\x11\x08\0\0\0\0\0\x15\x01\x4b\0\0\0\0\0\x79\x17\0\0\
+\0\0\0\0\x79\x21\x10\0\0\0\0\0\x55\x01\x14\0\0\0\0\0\x18\x01\0\0\0\0\0\0\0\0\0\
+\0\0\0\0\0\x7b\x1a\xe0\xff\0\0\0\0\x18\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x7b\x1a\
+\xd8\xff\0\0\0\0\x18\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x7b\x1a\xd0\xff\0\0\0\0\
+\x18\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x7b\x1a\xc8\xff\0\0\0\0\xbf\xa4\0\0\0\0\0\
+\0\x07\x04\0\0\xc8\xff\xff\xff\xbf\x61\0\0\0\0\0\0\x18\x02\0\0\x28\0\0\0\0\0\0\
+\0\0\0\0\0\xb7\x03\0\0\x14\0\0\0\xb7\x05\0\0\x20\0\0\0\x85\0\0\0\x7e\0\0\0\x7b\
+\x6a\xc0\xff\0\0\0\0\x61\x71\0\0\0\0\0\0\x7b\x1a\xc8\xff\0\0\0\0\xb7\x03\0\0\
+\x04\0\0\0\xbf\x79\0\0\0\0\0\0\x0f\x39\0\0\0\0\0\0\x79\x71\x28\0\0\0\0\0\x79\
+\x78\x30\0\0\0\0\0\x15\x08\x18\0\0\0\0\0\xb7\x02\0\0\0\0\0\0\x0f\x21\0\0\0\0\0\
+\0\x61\x11\x04\0\0\0\0\0\x79\x83\x08\0\0\0\0\0\x67\x01\0\0\x03\0\0\0\x0f\x13\0\
+\0\0\0\0\0\x79\x86\0\0\0\0\0\0\xbf\xa1\0\0\0\0\0\0\x07\x01\0\0\xf8\xff\xff\xff\
+\xb7\x02\0\0\x08\0\0\0\x85\0\0\0\x71\0\0\0\xb7\x01\0\0\0\0\0\0\x79\xa3\xf8\xff\
+\0\0\0\0\x0f\x13\0\0\0\0\0\0\xbf\xa1\0\0\0\0\0\0\x07\x01\0\0\xf4\xff\xff\xff\
+\xb7\x02\0\0\x04\0\0\0\x85\0\0\0\x71\0\0\0\xb7\x03\0\0\x04\0\0\0\x61\xa1\xf4\
+\xff\0\0\0\0\x61\x82\x10\0\0\0\0\0\x3d\x21\x02\0\0\0\0\0\x0f\x16\0\0\0\0\0\0\
+\xbf\x69\0\0\0\0\0\0\x7b\x9a\xd0\xff\0\0\0\0\x79\x71\x18\0\0\0\0\0\x7b\x1a\xd8\
+\xff\0\0\0\0\xb7\x01\0\0\x38\0\0\0\xbf\x72\0\0\0\0\0\0\x0f\x12\0\0\0\0\0\0\x7b\
+\x2a\xe0\xff\0\0\0\0\x79\x71\x20\0\0\0\0\0\x79\x11\0\0\0\0\0\0\x0f\x31\0\0\0\0\
+\0\0\x7b\x1a\xe8\xff\0\0\0\0\xbf\xa4\0\0\0\0\0\0\x07\x04\0\0\xc8\xff\xff\xff\
+\x79\xa1\xc0\xff\0\0\0\0\x18\x02\0\0\x3c\0\0\0\0\0\0\0\0\0\0\0\xb7\x03\0\0\x17\
+\0\0\0\xb7\x05\0\0\x28\0\0\0\x85\0\0\0\x7e\0\0\0\xb7\0\0\0\0\0\0\0\x95\0\0\0\0\
+\0\0\0\x25\x34\x73\x20\x25\x2d\x31\x36\x73\x20\x25\x2d\x31\x32\x73\x20\x25\x73\
+\x0a\0\x25\x34\x75\x20\x25\x2d\x31\x36\x73\x20\x25\x2d\x31\x32\x64\x20\x25\x73\
+\x0a\0\x25\x34\x73\x20\x25\x2d\x31\x36\x73\x20\x25\x2d\x31\x36\x73\x20\x25\x73\
+\x0a\0\x25\x34\x75\x20\x25\x2d\x31\x36\x73\x20\x25\x2d\x31\x36\x73\x20\x25\x73\
+\x20\x25\x73\x0a\0\x69\x64\0\x6e\x61\x6d\x65\0\x6d\x61\x78\x5f\x65\x6e\x74\x72\
+\x69\x65\x73\0\x70\x69\x6e\x6e\x65\x64\0\x61\x74\x74\x61\x63\x68\x65\x64\0\x47\
+\x50\x4c\0\x9f\xeb\x01\0\x18\0\0\0\0\0\0\0\x1c\x04\0\0\x1c\x04\0\0\x1c\x05\0\0\
+\0\0\0\0\0\0\0\x02\x02\0\0\0\x01\0\0\0\x02\0\0\x04\x10\0\0\0\x13\0\0\0\x03\0\0\
+\0\0\0\0\0\x18\0\0\0\x04\0\0\0\x40\0\0\0\0\0\0\0\0\0\0\x02\x08\0\0\0\0\0\0\0\0\
+\0\0\x02\x0d\0\0\0\0\0\0\0\x01\0\0\x0d\x06\0\0\0\x1c\0\0\0\x01\0\0\0\x20\0\0\0\
+\0\0\0\x01\x04\0\0\0\x20\0\0\x01\x24\0\0\0\x01\0\0\x0c\x05\0\0\0\xb7\0\0\0\x03\
+\0\0\x04\x18\0\0\0\xc5\0\0\0\x09\0\0\0\0\0\0\0\xc9\0\0\0\x0b\0\0\0\x40\0\0\0\
+\xd4\0\0\0\x0b\0\0\0\x80\0\0\0\0\0\0\0\0\0\0\x02\x0a\0\0\0\xdc\0\0\0\0\0\0\x07\
+\0\0\0\0\xe5\0\0\0\0\0\0\x08\x0c\0\0\0\xeb\0\0\0\0\0\0\x01\x08\0\0\0\x40\0\0\0\
+\x9c\x01\0\0\x04\0\0\x04\x58\0\0\0\xa4\x01\0\0\x0e\0\0\0\0\0\0\0\xa7\x01\0\0\
+\x11\0\0\0\x20\0\0\0\xac\x01\0\0\x0e\0\0\0\xa0\0\0\0\xb8\x01\0\0\x13\0\0\0\xc0\
+\0\0\0\xc1\x01\0\0\0\0\0\x08\x0f\0\0\0\xc7\x01\0\0\0\0\0\x01\x04\0\0\0\x20\0\0\
+\0\xd4\x01\0\0\0\0\0\x01\x01\0\0\0\x08\0\0\x01\0\0\0\0\0\0\0\x03\0\0\0\0\x10\0\
+\0\0\x12\0\0\0\x10\0\0\0\xd9\x01\0\0\0\0\0\x01\x04\0\0\0\x20\0\0\0\0\0\0\0\0\0\
+\0\x03\0\0\0\0\x10\0\0\0\x12\0\0\0\x40\0\0\0\0\0\0\0\0\0\0\x02\x15\0\0\0\x56\
+\x02\0\0\x02\0\0\x04\x10\0\0\0\x13\0\0\0\x03\0\0\0\0\0\0\0\x69\x02\0\0\x16\0\0\
+\0\x40\0\0\0\0\0\0\0\0\0\0\x02\x19\0\0\0\0\0\0\0\x01\0\0\x0d\x06\0\0\0\x1c\0\0\
+\0\x14\0\0\0\x6e\x02\0\0\x01\0\0\x0c\x17\0\0\0\xba\x02\0\0\x01\0\0\x04\x08\0\0\
+\0\xc3\x02\0\0\x1a\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x02\x1b\0\0\0\x07\x03\0\0\x07\0\
+\0\x04\x78\0\0\0\xa4\x01\0\0\x0e\0\0\0\0\0\0\0\xa7\x01\0\0\x11\0\0\0\x20\0\0\0\
+\x14\x03\0\0\x1c\0\0\0\xc0\0\0\0\x25\x03\0\0\x16\0\0\0\0\x01\0\0\x2e\x03\0\0\
+\x1e\0\0\0\x40\x01\0\0\x38\x03\0\0\x1f\0\0\0\x80\x01\0\0\xb8\x01\0\0\x13\0\0\0\
+\xc0\x01\0\0\0\0\0\0\0\0\0\x02\x1d\0\0\0\0\0\0\0\0\0\0\x0a\x10\0\0\0\0\0\0\0\0\
+\0\0\x02\x20\0\0\0\0\0\0\0\0\0\0\x02\x21\0\0\0\x88\x03\0\0\x02\0\0\x04\x08\0\0\
+\0\x96\x03\0\0\x0e\0\0\0\0\0\0\0\x9f\x03\0\0\x0e\0\0\0\x20\0\0\0\x38\x03\0\0\
+\x03\0\0\x04\x18\0\0\0\xa9\x03\0\0\x1c\0\0\0\0\0\0\0\xb1\x03\0\0\x22\0\0\0\x40\
+\0\0\0\xb7\x03\0\0\x24\0\0\0\x80\0\0\0\0\0\0\0\0\0\0\x02\x23\0\0\0\0\0\0\0\0\0\
+\0\x02\x25\0\0\0\xbb\x03\0\0\x01\0\0\x04\x04\0\0\0\xc6\x03\0\0\x0e\0\0\0\0\0\0\
+\0\x2f\x04\0\0\x01\0\0\x04\x04\0\0\0\x38\x04\0\0\x0e\0\0\0\0\0\0\0\0\0\0\0\0\0\
+\0\x03\0\0\0\0\x1d\0\0\0\x12\0\0\0\x14\0\0\0\xae\x04\0\0\0\0\0\x0e\x26\0\0\0\0\
+\0\0\0\xc2\x04\0\0\0\0\0\x0e\x26\0\0\0\0\0\0\0\xd8\x04\0\0\0\0\0\x0e\x26\0\0\0\
+\0\0\0\0\0\0\0\0\0\0\0\x03\0\0\0\0\x1d\0\0\0\x12\0\0\0\x17\0\0\0\xed\x04\0\0\0\
+\0\0\x0e\x2a\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x03\0\0\0\0\x10\0\0\0\x12\0\0\0\x04\0\
+\0\0\x04\x05\0\0\0\0\0\x0e\x2c\0\0\0\x01\0\0\0\x0c\x05\0\0\x04\0\0\x0f\0\0\0\0\
+\x27\0\0\0\0\0\0\0\x14\0\0\0\x28\0\0\0\x14\0\0\0\x14\0\0\0\x29\0\0\0\x28\0\0\0\
+\x14\0\0\0\x2b\0\0\0\x3c\0\0\0\x17\0\0\0\x14\x05\0\0\x01\0\0\x0f\0\0\0\0\x2d\0\
+\0\0\0\0\0\0\x04\0\0\0\0\x62\x70\x66\x5f\x69\x74\x65\x72\x5f\x5f\x62\x70\x66\
+\x5f\x6d\x61\x70\0\x6d\x65\x74\x61\0\x6d\x61\x70\0\x63\x74\x78\0\x69\x6e\x74\0\
+\x64\x75\x6d\x70\x5f\x62\x70\x66\x5f\x6d\x61\x70\0\x69\x74\x65\x72\x2f\x62\x70\
+\x66\x5f\x6d\x61\x70\0\x30\x3a\x30\0\x2f\x64\x61\x74\x61\x30\x2f\x77\x61\x6b\
+\x65\x6e\x2f\x76\x65\x72\x69\x66\x79\x2f\x6c\x69\x6e\x75\x78\x2d\x35\x2e\x39\
+\x2e\x79\x2f\x6b\x65\x72\x6e\x65\x6c\x2f\x62\x70\x66\x2f\x70\x72\x65\x6c\x6f\
+\x61\x64\x2f\x69\x74\x65\x72\x61\x74\x6f\x72\x73\x2f\x69\x74\x65\x72\x61\x74\
+\x6f\x72\x73\x2e\x62\x70\x66\x2e\x63\0\x09\x73\x74\x72\x75\x63\x74\x20\x73\x65\
+\x71\x5f\x66\x69\x6c\x65\x20\x2a\x73\x65\x71\x20\x3d\x20\x63\x74\x78\x2d\x3e\
+\x6d\x65\x74\x61\x2d\x3e\x73\x65\x71\x3b\0\x62\x70\x66\x5f\x69\x74\x65\x72\x5f\
+\x6d\x65\x74\x61\0\x73\x65\x71\0\x73\x65\x73\x73\x69\x6f\x6e\x5f\x69\x64\0\x73\
+\x65\x71\x5f\x6e\x75\x6d\0\x73\x65\x71\x5f\x66\x69\x6c\x65\0\x5f\x5f\x75\x36\
+\x34\0\x6c\x6f\x6e\x67\x20\x6c\x6f\x6e\x67\x20\x75\x6e\x73\x69\x67\x6e\x65\x64\
+\x20\x69\x6e\x74\0\x30\x3a\x31\0\x09\x73\x74\x72\x75\x63\x74\x20\x62\x70\x66\
+\x5f\x6d\x61\x70\x20\x2a\x6d\x61\x70\x20\x3d\x20\x63\x74\x78\x2d\x3e\x6d\x61\
+\x70\x3b\0\x09\x69\x66\x20\x28\x21\x6d\x61\x70\x29\0\x30\x3a\x32\0\x09\x5f\x5f\
+\x75\x36\x34\x20\x73\x65\x71\x5f\x6e\x75\x6d\x20\x3d\x20\x63\x74\x78\x2d\x3e\
+\x6d\x65\x74\x61\x2d\x3e\x73\x65\x71\x5f\x6e\x75\x6d\x3b\0\x09\x69\x66\x20\x28\
+\x73\x65\x71\x5f\x6e\x75\x6d\x20\x3d\x3d\x20\x30\x29\0\x09\x09\x42\x50\x46\x5f\
+\x53\x45\x51\x5f\x50\x52\x49\x4e\x54\x46\x28\x73\x65\x71\x2c\x20\x22\x25\x34\
+\x73\x20\x25\x2d\x31\x36\x73\x20\x25\x2d\x31\x32\x73\x20\x25\x73\x5c\x6e\x22\
+\x2c\0\x62\x70\x66\x5f\x6d\x61\x70\0\x69\x64\0\x6e\x61\x6d\x65\0\x6d\x61\x78\
+\x5f\x65\x6e\x74\x72\x69\x65\x73\0\x70\x69\x6e\x5f\x6e\x61\x6d\x65\0\x5f\x5f\
+\x75\x33\x32\0\x75\x6e\x73\x69\x67\x6e\x65\x64\x20\x69\x6e\x74\0\x63\x68\x61\
+\x72\0\x5f\x5f\x41\x52\x52\x41\x59\x5f\x53\x49\x5a\x45\x5f\x54\x59\x50\x45\x5f\
+\x5f\0\x09\x42\x50\x46\x5f\x53\x45\x51\x5f\x50\x52\x49\x4e\x54\x46\x28\x73\x65\
+\x71\x2c\x20\x22\x25\x34\x75\x20\x25\x2d\x31\x36\x73\x20\x25\x2d\x31\x32\x64\
+\x20\x25\x73\x5c\x6e\x22\x2c\x20\x6d\x61\x70\x2d\x3e\x69\x64\x2c\x20\x6d\x61\
+\x70\x2d\x3e\x6e\x61\x6d\x65\x2c\x20\x6d\x61\x70\x2d\x3e\x6d\x61\x78\x5f\x65\
+\x6e\x74\x72\x69\x65\x73\x2c\x20\x6d\x61\x70\x2d\x3e\x70\x69\x6e\x5f\x6e\x61\
+\x6d\x65\x29\x3b\0\x30\x3a\x33\0\x7d\0\x62\x70\x66\x5f\x69\x74\x65\x72\x5f\x5f\
+\x62\x70\x66\x5f\x70\x72\x6f\x67\0\x70\x72\x6f\x67\0\x64\x75\x6d\x70\x5f\x62\
+\x70\x66\x5f\x70\x72\x6f\x67\0\x69\x74\x65\x72\x2f\x62\x70\x66\x5f\x70\x72\x6f\
+\x67\0\x09\x73\x74\x72\x75\x63\x74\x20\x62\x70\x66\x5f\x70\x72\x6f\x67\x20\x2a\
+\x70\x72\x6f\x67\x20\x3d\x20\x63\x74\x78\x2d\x3e\x70\x72\x6f\x67\x3b\0\x09\x69\
+\x66\x20\x28\x21\x70\x72\x6f\x67\x29\0\x62\x70\x66\x5f\x70\x72\x6f\x67\0\x61\
+\x75\x78\0\x09\x61\x75\x78\x20\x3d\x20\x70\x72\x6f\x67\x2d\x3e\x61\x75\x78\x3b\
+\0\x09\x09\x42\x50\x46\x5f\x53\x45\x51\x5f\x50\x52\x49\x4e\x54\x46\x28\x73\x65\
+\x71\x2c\x20\x22\x25\x34\x73\x20\x25\x2d\x31\x36\x73\x20\x25\x2d\x31\x36\x73\
+\x20\x25\x73\x5c\x6e\x22\x2c\0\x62\x70\x66\x5f\x70\x72\x6f\x67\x5f\x61\x75\x78\
+\0\x61\x74\x74\x61\x63\x68\x5f\x66\x75\x6e\x63\x5f\x6e\x61\x6d\x65\0\x64\x73\
+\x74\x5f\x70\x72\x6f\x67\0\x66\x75\x6e\x63\x5f\x69\x6e\x66\x6f\0\x62\x74\x66\0\
+\x09\x42\x50\x46\x5f\x53\x45\x51\x5f\x50\x52\x49\x4e\x54\x46\x28\x73\x65\x71\
+\x2c\x20\x22\x25\x34\x75\x20\x25\x2d\x31\x36\x73\x20\x25\x2d\x31\x36\x73\x20\
+\x25\x73\x20\x25\x73\x5c\x6e\x22\x2c\x20\x61\x75\x78\x2d\x3e\x69\x64\x2c\0\x30\
+\x3a\x34\0\x30\x3a\x35\0\x09\x69\x66\x20\x28\x21\x62\x74\x66\x29\0\x62\x70\x66\
+\x5f\x66\x75\x6e\x63\x5f\x69\x6e\x66\x6f\0\x69\x6e\x73\x6e\x5f\x6f\x66\x66\0\
+\x74\x79\x70\x65\x5f\x69\x64\0\x30\0\x73\x74\x72\x69\x6e\x67\x73\0\x74\x79\x70\
+\x65\x73\0\x68\x64\x72\0\x62\x74\x66\x5f\x68\x65\x61\x64\x65\x72\0\x73\x74\x72\
+\x5f\x6c\x65\x6e\0\x09\x74\x79\x70\x65\x73\x20\x3d\x20\x62\x74\x66\x2d\x3e\x74\
+\x79\x70\x65\x73\x3b\0\x09\x62\x70\x66\x5f\x70\x72\x6f\x62\x65\x5f\x72\x65\x61\
+\x64\x5f\x6b\x65\x72\x6e\x65\x6c\x28\x26\x74\x2c\x20\x73\x69\x7a\x65\x6f\x66\
+\x28\x74\x29\x2c\x20\x74\x79\x70\x65\x73\x20\x2b\x20\x62\x74\x66\x5f\x69\x64\
+\x29\x3b\0\x09\x73\x74\x72\x20\x3d\x20\x62\x74\x66\x2d\x3e\x73\x74\x72\x69\x6e\
+\x67\x73\x3b\0\x62\x74\x66\x5f\x74\x79\x70\x65\0\x6e\x61\x6d\x65\x5f\x6f\x66\
+\x66\0\x09\x6e\x61\x6d\x65\x5f\x6f\x66\x66\x20\x3d\x20\x42\x50\x46\x5f\x43\x4f\
+\x52\x45\x5f\x52\x45\x41\x44\x28\x74\x2c\x20\x6e\x61\x6d\x65\x5f\x6f\x66\x66\
+\x29\x3b\0\x30\x3a\x32\x3a\x30\0\x09\x69\x66\x20\x28\x6e\x61\x6d\x65\x5f\x6f\
+\x66\x66\x20\x3e\x3d\x20\x62\x74\x66\x2d\x3e\x68\x64\x72\x2e\x73\x74\x72\x5f\
+\x6c\x65\x6e\x29\0\x09\x72\x65\x74\x75\x72\x6e\x20\x73\x74\x72\x20\x2b\x20\x6e\
+\x61\x6d\x65\x5f\x6f\x66\x66\x3b\0\x30\x3a\x36\0\x64\x75\x6d\x70\x5f\x62\x70\
+\x66\x5f\x6d\x61\x70\x2e\x5f\x5f\x5f\x66\x6d\x74\0\x64\x75\x6d\x70\x5f\x62\x70\
+\x66\x5f\x6d\x61\x70\x2e\x5f\x5f\x5f\x66\x6d\x74\x2e\x34\0\x64\x75\x6d\x70\x5f\
+\x62\x70\x66\x5f\x70\x72\x6f\x67\x2e\x5f\x5f\x5f\x66\x6d\x74\0\x64\x75\x6d\x70\
+\x5f\x62\x70\x66\x5f\x70\x72\x6f\x67\x2e\x5f\x5f\x5f\x66\x6d\x74\x2e\x36\0\x4c\
+\x49\x43\x45\x4e\x53\x45\0\x2e\x72\x6f\x64\x61\x74\x61\0\x6c\x69\x63\x65\x6e\
+\x73\x65\0\x9f\xeb\x01\0\x20\0\0\0\0\0\0\0\x24\0\0\0\x24\0\0\0\x44\x02\0\0\x68\
+\x02\0\0\xc4\x01\0\0\x08\0\0\0\x31\0\0\0\x01\0\0\0\0\0\0\0\x07\0\0\0\x7c\x02\0\
+\0\x01\0\0\0\0\0\0\0\x18\0\0\0\x10\0\0\0\x31\0\0\0\x09\0\0\0\0\0\0\0\x42\0\0\0\
+\x8f\0\0\0\x1e\x44\x01\0\x08\0\0\0\x42\0\0\0\x8f\0\0\0\x24\x44\x01\0\x10\0\0\0\
+\x42\0\0\0\x06\x01\0\0\x1d\x4c\x01\0\x18\0\0\0\x42\0\0\0\x27\x01\0\0\x06\x54\
+\x01\0\x20\0\0\0\x42\0\0\0\x36\x01\0\0\x1d\x48\x01\0\x28\0\0\0\x42\0\0\0\x5b\
+\x01\0\0\x06\x60\x01\0\x30\0\0\0\x42\0\0\0\x6e\x01\0\0\x03\x64\x01\0\xd0\0\0\0\
+\x42\0\0\0\xed\x01\0\0\x02\x70\x01\0\x68\x01\0\0\x42\0\0\0\x54\x02\0\0\x01\x78\
+\x01\0\x7c\x02\0\0\x1a\0\0\0\0\0\0\0\x42\0\0\0\x8f\0\0\0\x1e\x8c\x01\0\x08\0\0\
+\0\x42\0\0\0\x8f\0\0\0\x24\x8c\x01\0\x10\0\0\0\x42\0\0\0\x8a\x02\0\0\x1f\x94\
+\x01\0\x18\0\0\0\x42\0\0\0\xae\x02\0\0\x06\xa0\x01\0\x20\0\0\0\x42\0\0\0\xc7\
+\x02\0\0\x0e\xac\x01\0\x28\0\0\0\x42\0\0\0\x36\x01\0\0\x1d\x90\x01\0\x30\0\0\0\
+\x42\0\0\0\x5b\x01\0\0\x06\xb0\x01\0\x38\0\0\0\x42\0\0\0\xd9\x02\0\0\x03\xb4\
+\x01\0\xe0\0\0\0\x42\0\0\0\x3c\x03\0\0\x02\xc0\x01\0\x18\x01\0\0\x42\0\0\0\x7d\
+\x03\0\0\x06\x0c\x01\0\x30\x01\0\0\x42\0\0\0\0\0\0\0\0\0\0\0\x38\x01\0\0\x42\0\
+\0\0\xce\x03\0\0\x0f\x18\x01\0\x40\x01\0\0\x42\0\0\0\xe3\x03\0\0\x2d\x1c\x01\0\
+\x50\x01\0\0\x42\0\0\0\x1a\x04\0\0\x0d\x14\x01\0\x60\x01\0\0\x42\0\0\0\0\0\0\0\
+\0\0\0\0\x68\x01\0\0\x42\0\0\0\xe3\x03\0\0\x02\x1c\x01\0\x80\x01\0\0\x42\0\0\0\
+\x41\x04\0\0\x0d\x20\x01\0\x98\x01\0\0\x42\0\0\0\0\0\0\0\0\0\0\0\xa0\x01\0\0\
+\x42\0\0\0\x41\x04\0\0\x0d\x20\x01\0\xb8\x01\0\0\x42\0\0\0\x41\x04\0\0\x0d\x20\
+\x01\0\xc0\x01\0\0\x42\0\0\0\x6f\x04\0\0\x1b\x24\x01\0\xc8\x01\0\0\x42\0\0\0\
+\x6f\x04\0\0\x06\x24\x01\0\xd0\x01\0\0\x42\0\0\0\x92\x04\0\0\x0d\x2c\x01\0\xd8\
+\x01\0\0\x42\0\0\0\0\0\0\0\0\0\0\0\xe0\x01\0\0\x42\0\0\0\x3c\x03\0\0\x02\xc0\
+\x01\0\x78\x02\0\0\x42\0\0\0\x54\x02\0\0\x01\xd4\x01\0\x10\0\0\0\x31\0\0\0\x08\
+\0\0\0\0\0\0\0\x02\0\0\0\x3e\0\0\0\0\0\0\0\x08\0\0\0\x08\0\0\0\x3e\0\0\0\0\0\0\
+\0\x10\0\0\0\x02\0\0\0\x02\x01\0\0\0\0\0\0\x20\0\0\0\x08\0\0\0\x32\x01\0\0\0\0\
+\0\0\xd0\0\0\0\x0d\0\0\0\x3e\0\0\0\0\0\0\0\xe0\0\0\0\x0d\0\0\0\x02\x01\0\0\0\0\
+\0\0\0\x01\0\0\x0d\0\0\0\x32\x01\0\0\0\0\0\0\x10\x01\0\0\x0d\0\0\0\x50\x02\0\0\
+\0\0\0\0\x7c\x02\0\0\x13\0\0\0\0\0\0\0\x15\0\0\0\x3e\0\0\0\0\0\0\0\x08\0\0\0\
+\x08\0\0\0\x3e\0\0\0\0\0\0\0\x10\0\0\0\x15\0\0\0\x02\x01\0\0\0\0\0\0\x20\0\0\0\
+\x19\0\0\0\x3e\0\0\0\0\0\0\0\x28\0\0\0\x08\0\0\0\x32\x01\0\0\0\0\0\0\xe0\0\0\0\
+\x1b\0\0\0\x3e\0\0\0\0\0\0\0\xf0\0\0\0\x1b\0\0\0\x02\x01\0\0\0\0\0\0\x08\x01\0\
+\0\x1b\0\0\0\x75\x03\0\0\0\0\0\0\x10\x01\0\0\x1b\0\0\0\x79\x03\0\0\0\0\0\0\x20\
+\x01\0\0\x20\0\0\0\xa7\x03\0\0\0\0\0\0\x38\x01\0\0\x21\0\0\0\x02\x01\0\0\0\0\0\
+\0\x50\x01\0\0\x21\0\0\0\x3e\0\0\0\0\0\0\0\x78\x01\0\0\x25\0\0\0\x3e\0\0\0\0\0\
+\0\0\xb0\x01\0\0\x1b\0\0\0\x02\x01\0\0\0\0\0\0\xc0\x01\0\0\x21\0\0\0\x69\x04\0\
+\0\0\0\0\0\xe8\x01\0\0\x1b\0\0\0\x32\x01\0\0\0\0\0\0\xf8\x01\0\0\x1b\0\0\0\xaa\
+\x04\0\0\0\0\0\0\x18\x02\0\0\x1b\0\0\0\x50\x02\0\0\0\0\0\0\x20\x02\0\0\x19\0\0\
+\0\x3e\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x98\0\0\
+\0\x04\0\xf1\xff\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x3d\0\0\0\x01\0\x05\0\0\0\0\0\
+\0\0\0\0\x03\0\0\0\0\0\0\0\x3c\x01\0\0\x01\0\x05\0\x03\0\0\0\0\0\0\0\x05\0\0\0\
+\0\0\0\0\x33\x01\0\0\x01\0\x05\0\x08\0\0\0\0\0\0\0\x0c\0\0\0\0\0\0\0\x2a\x01\0\
+\0\x01\0\x05\0\x14\0\0\0\0\0\0\0\x07\0\0\0\0\0\0\0\xf6\0\0\0\x01\0\x05\0\x1b\0\
+\0\0\0\0\0\0\x09\0\0\0\0\0\0\0\x23\x01\0\0\0\0\x02\0\xd0\0\0\0\0\0\0\0\0\0\0\0\
+\0\0\0\0\xff\0\0\0\0\0\x02\0\x68\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x1c\x01\0\0\0\
+\0\x03\0\xd8\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xd8\0\0\0\0\0\x03\0\xe0\x01\0\0\0\0\
+\0\0\0\0\0\0\0\0\0\0\xd1\0\0\0\0\0\x03\0\x78\x02\0\0\0\0\0\0\0\0\0\0\0\0\0\0\
+\x14\0\0\0\x01\0\x04\0\0\0\0\0\0\0\0\0\x14\0\0\0\0\0\0\0\x06\x01\0\0\x01\0\x04\
+\0\x14\0\0\0\0\0\0\0\x14\0\0\0\0\0\0\0\x28\0\0\0\x01\0\x04\0\x28\0\0\0\0\0\0\0\
+\x14\0\0\0\0\0\0\0\xdf\0\0\0\x01\0\x04\0\x3c\0\0\0\0\0\0\0\x17\0\0\0\0\0\0\0\0\
+\0\0\0\x03\0\x02\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x03\0\x03\0\0\0\0\0\
+\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x03\0\x04\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\
+\xc9\0\0\0\x11\0\x06\0\0\0\0\0\0\0\0\0\x04\0\0\0\0\0\0\0\x44\0\0\0\x12\0\x02\0\
+\0\0\0\0\0\0\0\0\x78\x01\0\0\0\0\0\0\x62\0\0\0\x12\0\x03\0\0\0\0\0\0\0\0\0\x88\
+\x02\0\0\0\0\0\0\x30\0\0\0\0\0\0\0\x01\0\0\0\x05\0\0\0\x48\0\0\0\0\0\0\0\x01\0\
+\0\0\x04\0\0\0\x60\0\0\0\0\0\0\0\x01\0\0\0\x03\0\0\0\x78\0\0\0\0\0\0\0\x01\0\0\
+\0\x02\0\0\0\xa8\0\0\0\0\0\0\0\x01\0\0\0\x12\0\0\0\x40\x01\0\0\0\0\0\0\x01\0\0\
+\0\x12\0\0\0\x38\0\0\0\0\0\0\0\x01\0\0\0\x05\0\0\0\x50\0\0\0\0\0\0\0\x01\0\0\0\
+\x06\0\0\0\x68\0\0\0\0\0\0\0\x01\0\0\0\x03\0\0\0\x80\0\0\0\0\0\0\0\x01\0\0\0\
+\x02\0\0\0\xb0\0\0\0\0\0\0\0\x01\0\0\0\x12\0\0\0\x50\x02\0\0\0\0\0\0\x01\0\0\0\
+\x12\0\0\0\xf0\x03\0\0\0\0\0\0\x0a\0\0\0\x12\0\0\0\xfc\x03\0\0\0\0\0\0\x0a\0\0\
+\0\x12\0\0\0\x08\x04\0\0\0\0\0\0\x0a\0\0\0\x12\0\0\0\x14\x04\0\0\0\0\0\0\x0a\0\
+\0\0\x12\0\0\0\x2c\x04\0\0\0\0\0\0\0\0\0\0\x13\0\0\0\x2c\0\0\0\0\0\0\0\0\0\0\0\
+\x10\0\0\0\x3c\0\0\0\0\0\0\0\0\0\0\0\x11\0\0\0\x50\0\0\0\0\0\0\0\0\0\0\0\x10\0\
+\0\0\x60\0\0\0\0\0\0\0\0\0\0\0\x10\0\0\0\x70\0\0\0\0\0\0\0\0\0\0\0\x10\0\0\0\
+\x80\0\0\0\0\0\0\0\0\0\0\0\x10\0\0\0\x90\0\0\0\0\0\0\0\0\0\0\0\x10\0\0\0\xa0\0\
+\0\0\0\0\0\0\0\0\0\0\x10\0\0\0\xb0\0\0\0\0\0\0\0\0\0\0\0\x10\0\0\0\xc0\0\0\0\0\
+\0\0\0\0\0\0\0\x10\0\0\0\xd0\0\0\0\0\0\0\0\0\0\0\0\x10\0\0\0\xe8\0\0\0\0\0\0\0\
+\0\0\0\0\x11\0\0\0\xf8\0\0\0\0\0\0\0\0\0\0\0\x11\0\0\0\x08\x01\0\0\0\0\0\0\0\0\
+\0\0\x11\0\0\0\x18\x01\0\0\0\0\0\0\0\0\0\0\x11\0\0\0\x28\x01\0\0\0\0\0\0\0\0\0\
+\0\x11\0\0\0\x38\x01\0\0\0\0\0\0\0\0\0\0\x11\0\0\0\x48\x01\0\0\0\0\0\0\0\0\0\0\
+\x11\0\0\0\x58\x01\0\0\0\0\0\0\0\0\0\0\x11\0\0\0\x68\x01\0\0\0\0\0\0\0\0\0\0\
+\x11\0\0\0\x78\x01\0\0\0\0\0\0\0\0\0\0\x11\0\0\0\x88\x01\0\0\0\0\0\0\0\0\0\0\
+\x11\0\0\0\x98\x01\0\0\0\0\0\0\0\0\0\0\x11\0\0\0\xa8\x01\0\0\0\0\0\0\0\0\0\0\
+\x11\0\0\0\xb8\x01\0\0\0\0\0\0\0\0\0\0\x11\0\0\0\xc8\x01\0\0\0\0\0\0\0\0\0\0\
+\x11\0\0\0\xd8\x01\0\0\0\0\0\0\0\0\0\0\x11\0\0\0\xe8\x01\0\0\0\0\0\0\0\0\0\0\
+\x11\0\0\0\xf8\x01\0\0\0\0\0\0\0\0\0\0\x11\0\0\0\x08\x02\0\0\0\0\0\0\0\0\0\0\
+\x11\0\0\0\x18\x02\0\0\0\0\0\0\0\0\0\0\x11\0\0\0\x28\x02\0\0\0\0\0\0\0\0\0\0\
+\x11\0\0\0\x38\x02\0\0\0\0\0\0\0\0\0\0\x11\0\0\0\x48\x02\0\0\0\0\0\0\0\0\0\0\
+\x11\0\0\0\x58\x02\0\0\0\0\0\0\0\0\0\0\x11\0\0\0\x68\x02\0\0\0\0\0\0\0\0\0\0\
+\x11\0\0\0\x78\x02\0\0\0\0\0\0\0\0\0\0\x11\0\0\0\x94\x02\0\0\0\0\0\0\0\0\0\0\
+\x10\0\0\0\xa4\x02\0\0\0\0\0\0\0\0\0\0\x10\0\0\0\xb4\x02\0\0\0\0\0\0\0\0\0\0\
+\x10\0\0\0\xc4\x02\0\0\0\0\0\0\0\0\0\0\x10\0\0\0\xd4\x02\0\0\0\0\0\0\0\0\0\0\
+\x10\0\0\0\xe4\x02\0\0\0\0\0\0\0\0\0\0\x10\0\0\0\xf4\x02\0\0\0\0\0\0\0\0\0\0\
+\x10\0\0\0\x04\x03\0\0\0\0\0\0\0\0\0\0\x10\0\0\0\x1c\x03\0\0\0\0\0\0\0\0\0\0\
+\x11\0\0\0\x2c\x03\0\0\0\0\0\0\0\0\0\0\x11\0\0\0\x3c\x03\0\0\0\0\0\0\0\0\0\0\
+\x11\0\0\0\x4c\x03\0\0\0\0\0\0\0\0\0\0\x11\0\0\0\x5c\x03\0\0\0\0\0\0\0\0\0\0\
+\x11\0\0\0\x6c\x03\0\0\0\0\0\0\0\0\0\0\x11\0\0\0\x7c\x03\0\0\0\0\0\0\0\0\0\0\
+\x11\0\0\0\x8c\x03\0\0\0\0\0\0\0\0\0\0\x11\0\0\0\x9c\x03\0\0\0\0\0\0\0\0\0\0\
+\x11\0\0\0\xac\x03\0\0\0\0\0\0\0\0\0\0\x11\0\0\0\xbc\x03\0\0\0\0\0\0\0\0\0\0\
+\x11\0\0\0\xcc\x03\0\0\0\0\0\0\0\0\0\0\x11\0\0\0\xdc\x03\0\0\0\0\0\0\0\0\0\0\
+\x11\0\0\0\xec\x03\0\0\0\0\0\0\0\0\0\0\x11\0\0\0\xfc\x03\0\0\0\0\0\0\0\0\0\0\
+\x11\0\0\0\x0c\x04\0\0\0\0\0\0\0\0\0\0\x11\0\0\0\x1c\x04\0\0\0\0\0\0\0\0\0\0\
+\x11\0\0\0\x2c\x04\0\0\0\0\0\0\0\0\0\0\x11\0\0\0\x3c\x04\0\0\0\0\0\0\0\0\0\0\
+\x11\0\0\0\x52\x53\x45\x46\x47\x48\x51\0\x2e\x74\x65\x78\x74\0\x2e\x72\x65\x6c\
+\x2e\x42\x54\x46\x2e\x65\x78\x74\0\x64\x75\x6d\x70\x5f\x62\x70\x66\x5f\x6d\x61\
+\x70\x2e\x5f\x5f\x5f\x66\x6d\x74\0\x64\x75\x6d\x70\x5f\x62\x70\x66\x5f\x70\x72\
+\x6f\x67\x2e\x5f\x5f\x5f\x66\x6d\x74\0\x2e\x4c\x2e\x73\x74\x72\0\x64\x75\x6d\
+\x70\x5f\x62\x70\x66\x5f\x6d\x61\x70\0\x2e\x72\x65\x6c\x69\x74\x65\x72\x2f\x62\
+\x70\x66\x5f\x6d\x61\x70\0\x64\x75\x6d\x70\x5f\x62\x70\x66\x5f\x70\x72\x6f\x67\
+\0\x2e\x72\x65\x6c\x69\x74\x65\x72\x2f\x62\x70\x66\x5f\x70\x72\x6f\x67\0\x2e\
+\x6c\x6c\x76\x6d\x5f\x61\x64\x64\x72\x73\x69\x67\0\x6c\x69\x63\x65\x6e\x73\x65\
+\0\x69\x74\x65\x72\x61\x74\x6f\x72\x73\x2e\x62\x70\x66\x2e\x63\0\x2e\x73\x74\
+\x72\x74\x61\x62\0\x2e\x73\x79\x6d\x74\x61\x62\0\x2e\x72\x6f\x64\x61\x74\x61\0\
+\x2e\x72\x65\x6c\x2e\x42\x54\x46\0\x4c\x49\x43\x45\x4e\x53\x45\0\x4c\x42\x42\
+\x31\x5f\x37\0\x4c\x42\x42\x31\x5f\x36\0\x64\x75\x6d\x70\x5f\x62\x70\x66\x5f\
+\x70\x72\x6f\x67\x2e\x5f\x5f\x5f\x66\x6d\x74\x2e\x36\0\x2e\x4c\x2e\x73\x74\x72\
+\x2e\x35\0\x4c\x42\x42\x30\x5f\x34\0\x64\x75\x6d\x70\x5f\x62\x70\x66\x5f\x6d\
+\x61\x70\x2e\x5f\x5f\x5f\x66\x6d\x74\x2e\x34\0\x4c\x42\x42\x31\x5f\x33\0\x4c\
+\x42\x42\x30\x5f\x33\0\x2e\x4c\x2e\x73\x74\x72\x2e\x33\0\x2e\x4c\x2e\x73\x74\
+\x72\x2e\x32\0\x2e\x4c\x2e\x73\x74\x72\x2e\x31\0\x2e\x72\x6f\x64\x61\x74\x61\
+\x2e\x73\x74\x72\x31\x2e\x31\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\
+\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\
+\0\0\0\0\0\0\x01\0\0\0\x01\0\0\0\x06\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x40\0\0\0\0\
+\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x04\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x55\0\
+\0\0\x01\0\0\0\x06\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x40\0\0\0\0\0\0\0\x78\x01\0\0\
+\0\0\0\0\0\0\0\0\0\0\0\0\x08\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x74\0\0\0\x01\0\0\0\
+\x06\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xb8\x01\0\0\0\0\0\0\x88\x02\0\0\0\0\0\0\0\0\
+\0\0\0\0\0\0\x08\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xb8\0\0\0\x01\0\0\0\x02\0\0\0\0\
+\0\0\0\0\0\0\0\0\0\0\0\x40\x04\0\0\0\0\0\0\x53\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\
+\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x45\x01\0\0\x01\0\0\0\x32\0\0\0\0\0\0\0\0\0\
+\0\0\0\0\0\0\x93\x04\0\0\0\0\0\0\x24\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x01\0\0\0\0\
+\0\0\0\x01\0\0\0\0\0\0\0\x90\0\0\0\x01\0\0\0\x03\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\
+\xb7\x04\0\0\0\0\0\0\x04\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x01\0\0\0\0\0\0\0\0\0\0\
+\0\0\0\0\0\xc4\0\0\0\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xbb\x04\0\0\0\0\
+\0\0\x50\x09\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x0b\
+\0\0\0\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x0b\x0e\0\0\0\0\0\0\x4c\x04\0\
+\0\0\0\0\0\0\0\0\0\0\0\0\0\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xb0\0\0\0\x02\0\0\
+\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x58\x12\0\0\0\0\0\0\x10\x02\0\0\0\0\0\0\x0f\
+\0\0\0\x13\0\0\0\x08\0\0\0\0\0\0\0\x18\0\0\0\0\0\0\0\x51\0\0\0\x09\0\0\0\0\0\0\
+\0\0\0\0\0\0\0\0\0\0\0\0\0\x68\x14\0\0\0\0\0\0\x60\0\0\0\0\0\0\0\x09\0\0\0\x02\
+\0\0\0\x08\0\0\0\0\0\0\0\x10\0\0\0\0\0\0\0\x70\0\0\0\x09\0\0\0\0\0\0\0\0\0\0\0\
+\0\0\0\0\0\0\0\0\xc8\x14\0\0\0\0\0\0\x60\0\0\0\0\0\0\0\x09\0\0\0\x03\0\0\0\x08\
+\0\0\0\0\0\0\0\x10\0\0\0\0\0\0\0\xc0\0\0\0\x09\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\
+\0\0\0\x28\x15\0\0\0\0\0\0\x50\0\0\0\0\0\0\0\x09\0\0\0\x07\0\0\0\x08\0\0\0\0\0\
+\0\0\x10\0\0\0\0\0\0\0\x07\0\0\0\x09\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x78\
+\x15\0\0\0\0\0\0\0\x04\0\0\0\0\0\0\x09\0\0\0\x08\0\0\0\x08\0\0\0\0\0\0\0\x10\0\
+\0\0\0\0\0\0\x82\0\0\0\x03\x4c\xff\x6f\0\0\0\x80\0\0\0\0\0\0\0\0\0\0\0\0\x78\
+\x19\0\0\0\0\0\0\x07\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x01\0\0\0\0\0\0\0\0\0\0\0\0\
+\0\0\0\xa8\0\0\0\x03\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x7f\x19\0\0\0\0\0\0\
+\x54\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0";
 }
 
 #endif /* __ITERATORS_BPF_SKEL_H__ */
-- 
1.8.3.1


^ permalink raw reply related	[flat|nested] 11+ messages in thread

* [PATCH 4/4] bpf: Show the used maps of each prog in progs.debug
  2022-02-11 12:11 [PATCH 0/4] bpf: Add more information into bpffs Yafang Shao
                   ` (2 preceding siblings ...)
  2022-02-11 12:11 ` [PATCH 3/4] bpf: Show pinned file name in {progs, maps}.debug Yafang Shao
@ 2022-02-11 12:11 ` Yafang Shao
  3 siblings, 0 replies; 11+ messages in thread
From: Yafang Shao @ 2022-02-11 12:11 UTC (permalink / raw)
  To: ast, daniel, andrii, kafai, songliubraving, yhs, john.fastabend, kpsingh
  Cc: netdev, bpf, Yafang Shao

We can get bpf maps via maps.debug, and bpf progs via progs.debug, but
we don't know the relationship of these progs and maps. Let show the
used maps of each prog in progs.debug.

The result as follows,

$ cat progs.debug
  id name             attached         pinned
  19 dump_bpf_map     bpf_iter_bpf_map
    maps: 14 13
  21 dump_bpf_prog    bpf_iter_bpf_prog
    maps: 14 13
  36                                   /var/run/pnc/bpf/tc/prog/cls-ingress
    maps: 26 35 27 45 44 43 34 36 41 37 38 42
  37                                   /var/run/pnc/bpf/tc/prog/cls-egress
    maps: 26 35 27 32 45 44 28 43 34 36 41 37 38 42
  38                                   /var/run/pnc/bpf/tc/prog/connect4
    maps: 26 35 34 30 29 32 28
  39                                   /var/run/pnc/bpf/tc/prog/sockops
    maps: 35 32 28 33 31
  40                                   /var/run/pnc/bpf/tc/prog/skmsg
    maps: 35 33 31

Signed-off-by: Yafang Shao <laoar.shao@gmail.com>
---
 kernel/bpf/preload/iterators/iterators.bpf.c  |  17 +
 kernel/bpf/preload/iterators/iterators.skel.h | 587 +++++++++++++++-----------
 2 files changed, 349 insertions(+), 255 deletions(-)

diff --git a/kernel/bpf/preload/iterators/iterators.bpf.c b/kernel/bpf/preload/iterators/iterators.bpf.c
index cf6b2c0..e4c273d 100644
--- a/kernel/bpf/preload/iterators/iterators.bpf.c
+++ b/kernel/bpf/preload/iterators/iterators.bpf.c
@@ -46,6 +46,8 @@ struct bpf_prog_aux {
 	struct bpf_func_info *func_info;
 	struct btf *btf;
 	char pin_name[64];
+	__u32 used_map_cnt;
+	struct bpf_map **used_maps;
 };
 
 struct bpf_prog {
@@ -101,6 +103,9 @@ int dump_bpf_prog(struct bpf_iter__bpf_prog *ctx)
 	__u64 seq_num = ctx->meta->seq_num;
 	struct bpf_prog *prog = ctx->prog;
 	struct bpf_prog_aux *aux;
+	struct bpf_map *map;
+	__u32 id;
+	__u32 i;
 
 	if (!prog)
 		return 0;
@@ -114,6 +119,18 @@ int dump_bpf_prog(struct bpf_iter__bpf_prog *ctx)
 		       get_name(aux->btf, aux->func_info[0].type_id, aux->name),
 		       aux->attach_func_name, aux->pin_name,
 			   aux->dst_prog->aux->name);
+
+	if (!aux->used_map_cnt)
+		return 0;
+
+	BPF_SEQ_PRINTF(seq, "    maps:");
+	for (i = 0; i < aux->used_map_cnt && i < 64; i++) {
+		bpf_probe_read_kernel(&map, sizeof(map), aux->used_maps + i);
+		id = BPF_CORE_READ(map, id);
+		BPF_SEQ_PRINTF(seq, " %u", id);
+	}
+	BPF_SEQ_PRINTF(seq, "\n");
+
 	return 0;
 }
 char LICENSE[] SEC("license") = "GPL";
diff --git a/kernel/bpf/preload/iterators/iterators.skel.h b/kernel/bpf/preload/iterators/iterators.skel.h
index 4efb8e7..5eea473 100644
--- a/kernel/bpf/preload/iterators/iterators.skel.h
+++ b/kernel/bpf/preload/iterators/iterators.skel.h
@@ -167,10 +167,10 @@ struct iterators_bpf {
 
 static inline const void *iterators_bpf__elf_bytes(size_t *sz)
 {
-	*sz = 7896;
+	*sz = 9968;
 	return (const void *)"\
 \x7f\x45\x4c\x46\x02\x01\x01\0\0\0\0\0\0\0\0\0\x01\0\xf7\0\x01\0\0\0\0\0\0\0\0\
-\0\0\0\0\0\0\0\0\0\0\0\xd8\x1a\0\0\0\0\0\0\0\0\0\0\x40\0\0\0\0\0\x40\0\x10\0\
+\0\0\0\0\0\0\0\0\0\0\0\xf0\x22\0\0\0\0\0\0\0\0\0\0\x40\0\0\0\0\0\x40\0\x10\0\
 \x0f\0\x79\x12\0\0\0\0\0\0\x79\x26\0\0\0\0\0\0\x79\x17\x08\0\0\0\0\0\x15\x07\
 \x29\0\0\0\0\0\x79\x21\x10\0\0\0\0\0\x55\x01\x14\0\0\0\0\0\x18\x01\0\0\0\0\0\0\
 \0\0\0\0\0\0\0\0\x7b\x1a\xf8\xff\0\0\0\0\x18\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\
@@ -183,9 +183,9 @@ static inline const void *iterators_bpf__elf_bytes(size_t *sz)
 \x1a\xf0\xff\0\0\0\0\xb7\x01\0\0\x18\0\0\0\x0f\x17\0\0\0\0\0\0\x7b\x7a\xf8\xff\
 \0\0\0\0\xbf\xa4\0\0\0\0\0\0\x07\x04\0\0\xe0\xff\xff\xff\xbf\x61\0\0\0\0\0\0\
 \x18\x02\0\0\x14\0\0\0\0\0\0\0\0\0\0\0\xb7\x03\0\0\x14\0\0\0\xb7\x05\0\0\x20\0\
-\0\0\x85\0\0\0\x7e\0\0\0\xb7\0\0\0\0\0\0\0\x95\0\0\0\0\0\0\0\x79\x12\0\0\0\0\0\
-\0\x79\x26\0\0\0\0\0\0\x79\x11\x08\0\0\0\0\0\x15\x01\x4b\0\0\0\0\0\x79\x17\0\0\
-\0\0\0\0\x79\x21\x10\0\0\0\0\0\x55\x01\x14\0\0\0\0\0\x18\x01\0\0\0\0\0\0\0\0\0\
+\0\0\x85\0\0\0\x7e\0\0\0\xb7\0\0\0\0\0\0\0\x95\0\0\0\0\0\0\0\x79\x13\0\0\0\0\0\
+\0\x79\x32\x10\0\0\0\0\0\x79\x36\0\0\0\0\0\0\x79\x11\x08\0\0\0\0\0\x15\x01\x7d\
+\0\0\0\0\0\x79\x17\0\0\0\0\0\0\x55\x02\x14\0\0\0\0\0\x18\x01\0\0\0\0\0\0\0\0\0\
 \0\0\0\0\0\x7b\x1a\xe0\xff\0\0\0\0\x18\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x7b\x1a\
 \xd8\xff\0\0\0\0\x18\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x7b\x1a\xd0\xff\0\0\0\0\
 \x18\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x7b\x1a\xc8\xff\0\0\0\0\xbf\xa4\0\0\0\0\0\
@@ -193,267 +193,344 @@ static inline const void *iterators_bpf__elf_bytes(size_t *sz)
 \0\0\0\0\0\xb7\x03\0\0\x14\0\0\0\xb7\x05\0\0\x20\0\0\0\x85\0\0\0\x7e\0\0\0\x7b\
 \x6a\xc0\xff\0\0\0\0\x61\x71\0\0\0\0\0\0\x7b\x1a\xc8\xff\0\0\0\0\xb7\x03\0\0\
 \x04\0\0\0\xbf\x79\0\0\0\0\0\0\x0f\x39\0\0\0\0\0\0\x79\x71\x28\0\0\0\0\0\x79\
-\x78\x30\0\0\0\0\0\x15\x08\x18\0\0\0\0\0\xb7\x02\0\0\0\0\0\0\x0f\x21\0\0\0\0\0\
-\0\x61\x11\x04\0\0\0\0\0\x79\x83\x08\0\0\0\0\0\x67\x01\0\0\x03\0\0\0\x0f\x13\0\
-\0\0\0\0\0\x79\x86\0\0\0\0\0\0\xbf\xa1\0\0\0\0\0\0\x07\x01\0\0\xf8\xff\xff\xff\
+\x76\x30\0\0\0\0\0\x15\x06\x18\0\0\0\0\0\xb7\x02\0\0\0\0\0\0\x0f\x21\0\0\0\0\0\
+\0\x61\x11\x04\0\0\0\0\0\x79\x63\x08\0\0\0\0\0\x67\x01\0\0\x03\0\0\0\x0f\x13\0\
+\0\0\0\0\0\x79\x68\0\0\0\0\0\0\xbf\xa1\0\0\0\0\0\0\x07\x01\0\0\xf8\xff\xff\xff\
 \xb7\x02\0\0\x08\0\0\0\x85\0\0\0\x71\0\0\0\xb7\x01\0\0\0\0\0\0\x79\xa3\xf8\xff\
 \0\0\0\0\x0f\x13\0\0\0\0\0\0\xbf\xa1\0\0\0\0\0\0\x07\x01\0\0\xf4\xff\xff\xff\
 \xb7\x02\0\0\x04\0\0\0\x85\0\0\0\x71\0\0\0\xb7\x03\0\0\x04\0\0\0\x61\xa1\xf4\
-\xff\0\0\0\0\x61\x82\x10\0\0\0\0\0\x3d\x21\x02\0\0\0\0\0\x0f\x16\0\0\0\0\0\0\
-\xbf\x69\0\0\0\0\0\0\x7b\x9a\xd0\xff\0\0\0\0\x79\x71\x18\0\0\0\0\0\x7b\x1a\xd8\
+\xff\0\0\0\0\x61\x62\x10\0\0\0\0\0\x3d\x21\x02\0\0\0\0\0\x0f\x18\0\0\0\0\0\0\
+\xbf\x89\0\0\0\0\0\0\x7b\x9a\xd0\xff\0\0\0\0\x79\x71\x18\0\0\0\0\0\x7b\x1a\xd8\
 \xff\0\0\0\0\xb7\x01\0\0\x38\0\0\0\xbf\x72\0\0\0\0\0\0\x0f\x12\0\0\0\0\0\0\x7b\
 \x2a\xe0\xff\0\0\0\0\x79\x71\x20\0\0\0\0\0\x79\x11\0\0\0\0\0\0\x0f\x31\0\0\0\0\
 \0\0\x7b\x1a\xe8\xff\0\0\0\0\xbf\xa4\0\0\0\0\0\0\x07\x04\0\0\xc8\xff\xff\xff\
-\x79\xa1\xc0\xff\0\0\0\0\x18\x02\0\0\x3c\0\0\0\0\0\0\0\0\0\0\0\xb7\x03\0\0\x17\
-\0\0\0\xb7\x05\0\0\x28\0\0\0\x85\0\0\0\x7e\0\0\0\xb7\0\0\0\0\0\0\0\x95\0\0\0\0\
-\0\0\0\x25\x34\x73\x20\x25\x2d\x31\x36\x73\x20\x25\x2d\x31\x32\x73\x20\x25\x73\
-\x0a\0\x25\x34\x75\x20\x25\x2d\x31\x36\x73\x20\x25\x2d\x31\x32\x64\x20\x25\x73\
-\x0a\0\x25\x34\x73\x20\x25\x2d\x31\x36\x73\x20\x25\x2d\x31\x36\x73\x20\x25\x73\
-\x0a\0\x25\x34\x75\x20\x25\x2d\x31\x36\x73\x20\x25\x2d\x31\x36\x73\x20\x25\x73\
-\x20\x25\x73\x0a\0\x69\x64\0\x6e\x61\x6d\x65\0\x6d\x61\x78\x5f\x65\x6e\x74\x72\
-\x69\x65\x73\0\x70\x69\x6e\x6e\x65\x64\0\x61\x74\x74\x61\x63\x68\x65\x64\0\x47\
-\x50\x4c\0\x9f\xeb\x01\0\x18\0\0\0\0\0\0\0\x1c\x04\0\0\x1c\x04\0\0\x1c\x05\0\0\
-\0\0\0\0\0\0\0\x02\x02\0\0\0\x01\0\0\0\x02\0\0\x04\x10\0\0\0\x13\0\0\0\x03\0\0\
-\0\0\0\0\0\x18\0\0\0\x04\0\0\0\x40\0\0\0\0\0\0\0\0\0\0\x02\x08\0\0\0\0\0\0\0\0\
-\0\0\x02\x0d\0\0\0\0\0\0\0\x01\0\0\x0d\x06\0\0\0\x1c\0\0\0\x01\0\0\0\x20\0\0\0\
-\0\0\0\x01\x04\0\0\0\x20\0\0\x01\x24\0\0\0\x01\0\0\x0c\x05\0\0\0\xb7\0\0\0\x03\
-\0\0\x04\x18\0\0\0\xc5\0\0\0\x09\0\0\0\0\0\0\0\xc9\0\0\0\x0b\0\0\0\x40\0\0\0\
-\xd4\0\0\0\x0b\0\0\0\x80\0\0\0\0\0\0\0\0\0\0\x02\x0a\0\0\0\xdc\0\0\0\0\0\0\x07\
-\0\0\0\0\xe5\0\0\0\0\0\0\x08\x0c\0\0\0\xeb\0\0\0\0\0\0\x01\x08\0\0\0\x40\0\0\0\
-\x9c\x01\0\0\x04\0\0\x04\x58\0\0\0\xa4\x01\0\0\x0e\0\0\0\0\0\0\0\xa7\x01\0\0\
-\x11\0\0\0\x20\0\0\0\xac\x01\0\0\x0e\0\0\0\xa0\0\0\0\xb8\x01\0\0\x13\0\0\0\xc0\
-\0\0\0\xc1\x01\0\0\0\0\0\x08\x0f\0\0\0\xc7\x01\0\0\0\0\0\x01\x04\0\0\0\x20\0\0\
-\0\xd4\x01\0\0\0\0\0\x01\x01\0\0\0\x08\0\0\x01\0\0\0\0\0\0\0\x03\0\0\0\0\x10\0\
-\0\0\x12\0\0\0\x10\0\0\0\xd9\x01\0\0\0\0\0\x01\x04\0\0\0\x20\0\0\0\0\0\0\0\0\0\
-\0\x03\0\0\0\0\x10\0\0\0\x12\0\0\0\x40\0\0\0\0\0\0\0\0\0\0\x02\x15\0\0\0\x56\
-\x02\0\0\x02\0\0\x04\x10\0\0\0\x13\0\0\0\x03\0\0\0\0\0\0\0\x69\x02\0\0\x16\0\0\
-\0\x40\0\0\0\0\0\0\0\0\0\0\x02\x19\0\0\0\0\0\0\0\x01\0\0\x0d\x06\0\0\0\x1c\0\0\
-\0\x14\0\0\0\x6e\x02\0\0\x01\0\0\x0c\x17\0\0\0\xba\x02\0\0\x01\0\0\x04\x08\0\0\
-\0\xc3\x02\0\0\x1a\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x02\x1b\0\0\0\x07\x03\0\0\x07\0\
-\0\x04\x78\0\0\0\xa4\x01\0\0\x0e\0\0\0\0\0\0\0\xa7\x01\0\0\x11\0\0\0\x20\0\0\0\
-\x14\x03\0\0\x1c\0\0\0\xc0\0\0\0\x25\x03\0\0\x16\0\0\0\0\x01\0\0\x2e\x03\0\0\
-\x1e\0\0\0\x40\x01\0\0\x38\x03\0\0\x1f\0\0\0\x80\x01\0\0\xb8\x01\0\0\x13\0\0\0\
-\xc0\x01\0\0\0\0\0\0\0\0\0\x02\x1d\0\0\0\0\0\0\0\0\0\0\x0a\x10\0\0\0\0\0\0\0\0\
-\0\0\x02\x20\0\0\0\0\0\0\0\0\0\0\x02\x21\0\0\0\x88\x03\0\0\x02\0\0\x04\x08\0\0\
-\0\x96\x03\0\0\x0e\0\0\0\0\0\0\0\x9f\x03\0\0\x0e\0\0\0\x20\0\0\0\x38\x03\0\0\
-\x03\0\0\x04\x18\0\0\0\xa9\x03\0\0\x1c\0\0\0\0\0\0\0\xb1\x03\0\0\x22\0\0\0\x40\
-\0\0\0\xb7\x03\0\0\x24\0\0\0\x80\0\0\0\0\0\0\0\0\0\0\x02\x23\0\0\0\0\0\0\0\0\0\
-\0\x02\x25\0\0\0\xbb\x03\0\0\x01\0\0\x04\x04\0\0\0\xc6\x03\0\0\x0e\0\0\0\0\0\0\
-\0\x2f\x04\0\0\x01\0\0\x04\x04\0\0\0\x38\x04\0\0\x0e\0\0\0\0\0\0\0\0\0\0\0\0\0\
-\0\x03\0\0\0\0\x1d\0\0\0\x12\0\0\0\x14\0\0\0\xae\x04\0\0\0\0\0\x0e\x26\0\0\0\0\
-\0\0\0\xc2\x04\0\0\0\0\0\x0e\x26\0\0\0\0\0\0\0\xd8\x04\0\0\0\0\0\x0e\x26\0\0\0\
-\0\0\0\0\0\0\0\0\0\0\0\x03\0\0\0\0\x1d\0\0\0\x12\0\0\0\x17\0\0\0\xed\x04\0\0\0\
-\0\0\x0e\x2a\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x03\0\0\0\0\x10\0\0\0\x12\0\0\0\x04\0\
-\0\0\x04\x05\0\0\0\0\0\x0e\x2c\0\0\0\x01\0\0\0\x0c\x05\0\0\x04\0\0\x0f\0\0\0\0\
-\x27\0\0\0\0\0\0\0\x14\0\0\0\x28\0\0\0\x14\0\0\0\x14\0\0\0\x29\0\0\0\x28\0\0\0\
-\x14\0\0\0\x2b\0\0\0\x3c\0\0\0\x17\0\0\0\x14\x05\0\0\x01\0\0\x0f\0\0\0\0\x2d\0\
-\0\0\0\0\0\0\x04\0\0\0\0\x62\x70\x66\x5f\x69\x74\x65\x72\x5f\x5f\x62\x70\x66\
-\x5f\x6d\x61\x70\0\x6d\x65\x74\x61\0\x6d\x61\x70\0\x63\x74\x78\0\x69\x6e\x74\0\
-\x64\x75\x6d\x70\x5f\x62\x70\x66\x5f\x6d\x61\x70\0\x69\x74\x65\x72\x2f\x62\x70\
-\x66\x5f\x6d\x61\x70\0\x30\x3a\x30\0\x2f\x64\x61\x74\x61\x30\x2f\x77\x61\x6b\
-\x65\x6e\x2f\x76\x65\x72\x69\x66\x79\x2f\x6c\x69\x6e\x75\x78\x2d\x35\x2e\x39\
-\x2e\x79\x2f\x6b\x65\x72\x6e\x65\x6c\x2f\x62\x70\x66\x2f\x70\x72\x65\x6c\x6f\
-\x61\x64\x2f\x69\x74\x65\x72\x61\x74\x6f\x72\x73\x2f\x69\x74\x65\x72\x61\x74\
-\x6f\x72\x73\x2e\x62\x70\x66\x2e\x63\0\x09\x73\x74\x72\x75\x63\x74\x20\x73\x65\
-\x71\x5f\x66\x69\x6c\x65\x20\x2a\x73\x65\x71\x20\x3d\x20\x63\x74\x78\x2d\x3e\
-\x6d\x65\x74\x61\x2d\x3e\x73\x65\x71\x3b\0\x62\x70\x66\x5f\x69\x74\x65\x72\x5f\
-\x6d\x65\x74\x61\0\x73\x65\x71\0\x73\x65\x73\x73\x69\x6f\x6e\x5f\x69\x64\0\x73\
-\x65\x71\x5f\x6e\x75\x6d\0\x73\x65\x71\x5f\x66\x69\x6c\x65\0\x5f\x5f\x75\x36\
-\x34\0\x6c\x6f\x6e\x67\x20\x6c\x6f\x6e\x67\x20\x75\x6e\x73\x69\x67\x6e\x65\x64\
-\x20\x69\x6e\x74\0\x30\x3a\x31\0\x09\x73\x74\x72\x75\x63\x74\x20\x62\x70\x66\
-\x5f\x6d\x61\x70\x20\x2a\x6d\x61\x70\x20\x3d\x20\x63\x74\x78\x2d\x3e\x6d\x61\
-\x70\x3b\0\x09\x69\x66\x20\x28\x21\x6d\x61\x70\x29\0\x30\x3a\x32\0\x09\x5f\x5f\
-\x75\x36\x34\x20\x73\x65\x71\x5f\x6e\x75\x6d\x20\x3d\x20\x63\x74\x78\x2d\x3e\
-\x6d\x65\x74\x61\x2d\x3e\x73\x65\x71\x5f\x6e\x75\x6d\x3b\0\x09\x69\x66\x20\x28\
-\x73\x65\x71\x5f\x6e\x75\x6d\x20\x3d\x3d\x20\x30\x29\0\x09\x09\x42\x50\x46\x5f\
+\x79\xa6\xc0\xff\0\0\0\0\xbf\x61\0\0\0\0\0\0\x18\x02\0\0\x3c\0\0\0\0\0\0\0\0\0\
+\0\0\xb7\x03\0\0\x17\0\0\0\xb7\x05\0\0\x28\0\0\0\x85\0\0\0\x7e\0\0\0\x61\x71\
+\x78\0\0\0\0\0\x15\x01\x30\0\0\0\0\0\xbf\xa4\0\0\0\0\0\0\x07\x04\0\0\xf8\xff\
+\xff\xff\xb7\x08\0\0\0\0\0\0\xbf\x61\0\0\0\0\0\0\x18\x02\0\0\x53\0\0\0\0\0\0\0\
+\0\0\0\0\xb7\x03\0\0\x0a\0\0\0\xb7\x05\0\0\0\0\0\0\x85\0\0\0\x7e\0\0\0\x61\x71\
+\x78\0\0\0\0\0\x15\x01\x1d\0\0\0\0\0\xb7\x09\0\0\0\0\0\0\xb7\x06\0\0\0\0\0\0\
+\x79\x73\x80\0\0\0\0\0\x0f\x83\0\0\0\0\0\0\xbf\xa1\0\0\0\0\0\0\x07\x01\0\0\xc8\
+\xff\xff\xff\xb7\x02\0\0\x08\0\0\0\x85\0\0\0\x71\0\0\0\x79\xa3\xc8\xff\0\0\0\0\
+\x0f\x93\0\0\0\0\0\0\xbf\xa1\0\0\0\0\0\0\x07\x01\0\0\xf8\xff\xff\xff\xb7\x02\0\
+\0\x04\0\0\0\x85\0\0\0\x71\0\0\0\x61\xa1\xf8\xff\0\0\0\0\x7b\x1a\xf8\xff\0\0\0\
+\0\xbf\xa4\0\0\0\0\0\0\x07\x04\0\0\xf8\xff\xff\xff\x79\xa1\xc0\xff\0\0\0\0\x18\
+\x02\0\0\x5d\0\0\0\0\0\0\0\0\0\0\0\xb7\x03\0\0\x04\0\0\0\xb7\x05\0\0\x08\0\0\0\
+\x85\0\0\0\x7e\0\0\0\x61\x71\x78\0\0\0\0\0\x25\x06\x03\0\x3e\0\0\0\x07\x08\0\0\
+\x08\0\0\0\x07\x06\0\0\x01\0\0\0\x2d\x61\xe5\xff\0\0\0\0\xbf\xa4\0\0\0\0\0\0\
+\x07\x04\0\0\xf8\xff\xff\xff\x79\xa1\xc0\xff\0\0\0\0\x18\x02\0\0\x61\0\0\0\0\0\
+\0\0\0\0\0\0\xb7\x03\0\0\x02\0\0\0\xb7\x05\0\0\0\0\0\0\x85\0\0\0\x7e\0\0\0\xb7\
+\0\0\0\0\0\0\0\x95\0\0\0\0\0\0\0\x25\x34\x73\x20\x25\x2d\x31\x36\x73\x20\x25\
+\x2d\x31\x32\x73\x20\x25\x73\x0a\0\x25\x34\x75\x20\x25\x2d\x31\x36\x73\x20\x25\
+\x2d\x31\x32\x64\x20\x25\x73\x0a\0\x25\x34\x73\x20\x25\x2d\x31\x36\x73\x20\x25\
+\x2d\x31\x36\x73\x20\x25\x73\x0a\0\x25\x34\x75\x20\x25\x2d\x31\x36\x73\x20\x25\
+\x2d\x31\x36\x73\x20\x25\x73\x20\x25\x73\x0a\0\x20\x20\x20\x20\x6d\x61\x70\x73\
+\x3a\0\x20\x25\x75\0\x0a\0\x69\x64\0\x6e\x61\x6d\x65\0\x6d\x61\x78\x5f\x65\x6e\
+\x74\x72\x69\x65\x73\0\x70\x69\x6e\x6e\x65\x64\0\x61\x74\x74\x61\x63\x68\x65\
+\x64\0\x47\x50\x4c\0\x9f\xeb\x01\0\x18\0\0\0\0\0\0\0\xdc\x04\0\0\xdc\x04\0\0\
+\x58\x06\0\0\0\0\0\0\0\0\0\x02\x02\0\0\0\x01\0\0\0\x02\0\0\x04\x10\0\0\0\x13\0\
+\0\0\x03\0\0\0\0\0\0\0\x18\0\0\0\x04\0\0\0\x40\0\0\0\0\0\0\0\0\0\0\x02\x08\0\0\
+\0\0\0\0\0\0\0\0\x02\x0d\0\0\0\0\0\0\0\x01\0\0\x0d\x06\0\0\0\x1c\0\0\0\x01\0\0\
+\0\x20\0\0\0\0\0\0\x01\x04\0\0\0\x20\0\0\x01\x24\0\0\0\x01\0\0\x0c\x05\0\0\0\
+\xb7\0\0\0\x03\0\0\x04\x18\0\0\0\xc5\0\0\0\x09\0\0\0\0\0\0\0\xc9\0\0\0\x0b\0\0\
+\0\x40\0\0\0\xd4\0\0\0\x0b\0\0\0\x80\0\0\0\0\0\0\0\0\0\0\x02\x0a\0\0\0\xdc\0\0\
+\0\0\0\0\x07\0\0\0\0\xe5\0\0\0\0\0\0\x08\x0c\0\0\0\xeb\0\0\0\0\0\0\x01\x08\0\0\
+\0\x40\0\0\0\x9c\x01\0\0\x04\0\0\x04\x58\0\0\0\xa4\x01\0\0\x0e\0\0\0\0\0\0\0\
+\xa7\x01\0\0\x11\0\0\0\x20\0\0\0\xac\x01\0\0\x0e\0\0\0\xa0\0\0\0\xb8\x01\0\0\
+\x13\0\0\0\xc0\0\0\0\xc1\x01\0\0\0\0\0\x08\x0f\0\0\0\xc7\x01\0\0\0\0\0\x01\x04\
+\0\0\0\x20\0\0\0\xd4\x01\0\0\0\0\0\x01\x01\0\0\0\x08\0\0\x01\0\0\0\0\0\0\0\x03\
+\0\0\0\0\x10\0\0\0\x12\0\0\0\x10\0\0\0\xd9\x01\0\0\0\0\0\x01\x04\0\0\0\x20\0\0\
+\0\0\0\0\0\0\0\0\x03\0\0\0\0\x10\0\0\0\x12\0\0\0\x40\0\0\0\0\0\0\0\0\0\0\x02\
+\x15\0\0\0\x20\x02\0\0\x02\0\0\x04\x10\0\0\0\x13\0\0\0\x03\0\0\0\0\0\0\0\x33\
+\x02\0\0\x16\0\0\0\x40\0\0\0\0\0\0\0\0\0\0\x02\x19\0\0\0\0\0\0\0\x01\0\0\x0d\
+\x06\0\0\0\x1c\0\0\0\x14\0\0\0\x38\x02\0\0\x01\0\0\x0c\x17\0\0\0\x84\x02\0\0\
+\x01\0\0\x04\x08\0\0\0\x8d\x02\0\0\x1a\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x02\x1b\0\0\
+\0\xd1\x02\0\0\x09\0\0\x04\x88\0\0\0\xa4\x01\0\0\x0e\0\0\0\0\0\0\0\xa7\x01\0\0\
+\x11\0\0\0\x20\0\0\0\xde\x02\0\0\x1c\0\0\0\xc0\0\0\0\xef\x02\0\0\x16\0\0\0\0\
+\x01\0\0\xf8\x02\0\0\x1e\0\0\0\x40\x01\0\0\x02\x03\0\0\x1f\0\0\0\x80\x01\0\0\
+\xb8\x01\0\0\x13\0\0\0\xc0\x01\0\0\x06\x03\0\0\x0e\0\0\0\xc0\x03\0\0\x13\x03\0\
+\0\x20\0\0\0\0\x04\0\0\0\0\0\0\0\0\0\x02\x1d\0\0\0\0\0\0\0\0\0\0\x0a\x10\0\0\0\
+\0\0\0\0\0\0\0\x02\x21\0\0\0\0\0\0\0\0\0\0\x02\x22\0\0\0\0\0\0\0\0\0\0\x02\x04\
+\0\0\0\x69\x03\0\0\x02\0\0\x04\x08\0\0\0\x77\x03\0\0\x0e\0\0\0\0\0\0\0\x80\x03\
+\0\0\x0e\0\0\0\x20\0\0\0\x02\x03\0\0\x03\0\0\x04\x18\0\0\0\x8a\x03\0\0\x1c\0\0\
+\0\0\0\0\0\x92\x03\0\0\x23\0\0\0\x40\0\0\0\x98\x03\0\0\x25\0\0\0\x80\0\0\0\0\0\
+\0\0\0\0\0\x02\x24\0\0\0\0\0\0\0\0\0\0\x02\x26\0\0\0\x9c\x03\0\0\x01\0\0\x04\
+\x04\0\0\0\xa7\x03\0\0\x0e\0\0\0\0\0\0\0\x10\x04\0\0\x01\0\0\x04\x04\0\0\0\x19\
+\x04\0\0\x0e\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x03\0\0\0\0\x1d\0\0\0\x12\0\0\0\x14\0\
+\0\0\xa5\x05\0\0\0\0\0\x0e\x27\0\0\0\0\0\0\0\xb9\x05\0\0\0\0\0\x0e\x27\0\0\0\0\
+\0\0\0\xcf\x05\0\0\0\0\0\x0e\x27\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x03\0\0\0\0\x1d\0\
+\0\0\x12\0\0\0\x17\0\0\0\xe4\x05\0\0\0\0\0\x0e\x2b\0\0\0\0\0\0\0\0\0\0\0\0\0\0\
+\x03\0\0\0\0\x1d\0\0\0\x12\0\0\0\x0a\0\0\0\xfb\x05\0\0\0\0\0\x0e\x2d\0\0\0\0\0\
+\0\0\0\0\0\0\0\0\0\x03\0\0\0\0\x1d\0\0\0\x12\0\0\0\x04\0\0\0\x12\x06\0\0\0\0\0\
+\x0e\x2f\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x03\0\0\0\0\x1d\0\0\0\x12\0\0\0\x02\0\0\0\
+\x29\x06\0\0\0\0\0\x0e\x31\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x03\0\0\0\0\x10\0\0\0\
+\x12\0\0\0\x04\0\0\0\x40\x06\0\0\0\0\0\x0e\x33\0\0\0\x01\0\0\0\x48\x06\0\0\x07\
+\0\0\x0f\0\0\0\0\x28\0\0\0\0\0\0\0\x14\0\0\0\x29\0\0\0\x14\0\0\0\x14\0\0\0\x2a\
+\0\0\0\x28\0\0\0\x14\0\0\0\x2c\0\0\0\x3c\0\0\0\x17\0\0\0\x2e\0\0\0\x53\0\0\0\
+\x0a\0\0\0\x30\0\0\0\x5d\0\0\0\x04\0\0\0\x32\0\0\0\x61\0\0\0\x02\0\0\0\x50\x06\
+\0\0\x01\0\0\x0f\0\0\0\0\x34\0\0\0\0\0\0\0\x04\0\0\0\0\x62\x70\x66\x5f\x69\x74\
+\x65\x72\x5f\x5f\x62\x70\x66\x5f\x6d\x61\x70\0\x6d\x65\x74\x61\0\x6d\x61\x70\0\
+\x63\x74\x78\0\x69\x6e\x74\0\x64\x75\x6d\x70\x5f\x62\x70\x66\x5f\x6d\x61\x70\0\
+\x69\x74\x65\x72\x2f\x62\x70\x66\x5f\x6d\x61\x70\0\x30\x3a\x30\0\x2f\x64\x61\
+\x74\x61\x30\x2f\x77\x61\x6b\x65\x6e\x2f\x76\x65\x72\x69\x66\x79\x2f\x6c\x69\
+\x6e\x75\x78\x2d\x35\x2e\x39\x2e\x79\x2f\x6b\x65\x72\x6e\x65\x6c\x2f\x62\x70\
+\x66\x2f\x70\x72\x65\x6c\x6f\x61\x64\x2f\x69\x74\x65\x72\x61\x74\x6f\x72\x73\
+\x2f\x69\x74\x65\x72\x61\x74\x6f\x72\x73\x2e\x62\x70\x66\x2e\x63\0\x09\x73\x74\
+\x72\x75\x63\x74\x20\x73\x65\x71\x5f\x66\x69\x6c\x65\x20\x2a\x73\x65\x71\x20\
+\x3d\x20\x63\x74\x78\x2d\x3e\x6d\x65\x74\x61\x2d\x3e\x73\x65\x71\x3b\0\x62\x70\
+\x66\x5f\x69\x74\x65\x72\x5f\x6d\x65\x74\x61\0\x73\x65\x71\0\x73\x65\x73\x73\
+\x69\x6f\x6e\x5f\x69\x64\0\x73\x65\x71\x5f\x6e\x75\x6d\0\x73\x65\x71\x5f\x66\
+\x69\x6c\x65\0\x5f\x5f\x75\x36\x34\0\x6c\x6f\x6e\x67\x20\x6c\x6f\x6e\x67\x20\
+\x75\x6e\x73\x69\x67\x6e\x65\x64\x20\x69\x6e\x74\0\x30\x3a\x31\0\x09\x73\x74\
+\x72\x75\x63\x74\x20\x62\x70\x66\x5f\x6d\x61\x70\x20\x2a\x6d\x61\x70\x20\x3d\
+\x20\x63\x74\x78\x2d\x3e\x6d\x61\x70\x3b\0\x09\x69\x66\x20\x28\x21\x6d\x61\x70\
+\x29\0\x30\x3a\x32\0\x09\x5f\x5f\x75\x36\x34\x20\x73\x65\x71\x5f\x6e\x75\x6d\
+\x20\x3d\x20\x63\x74\x78\x2d\x3e\x6d\x65\x74\x61\x2d\x3e\x73\x65\x71\x5f\x6e\
+\x75\x6d\x3b\0\x09\x69\x66\x20\x28\x73\x65\x71\x5f\x6e\x75\x6d\x20\x3d\x3d\x20\
+\x30\x29\0\x09\x09\x42\x50\x46\x5f\x53\x45\x51\x5f\x50\x52\x49\x4e\x54\x46\x28\
+\x73\x65\x71\x2c\x20\x22\x25\x34\x73\x20\x25\x2d\x31\x36\x73\x20\x25\x2d\x31\
+\x32\x73\x20\x25\x73\x5c\x6e\x22\x2c\0\x62\x70\x66\x5f\x6d\x61\x70\0\x69\x64\0\
+\x6e\x61\x6d\x65\0\x6d\x61\x78\x5f\x65\x6e\x74\x72\x69\x65\x73\0\x70\x69\x6e\
+\x5f\x6e\x61\x6d\x65\0\x5f\x5f\x75\x33\x32\0\x75\x6e\x73\x69\x67\x6e\x65\x64\
+\x20\x69\x6e\x74\0\x63\x68\x61\x72\0\x5f\x5f\x41\x52\x52\x41\x59\x5f\x53\x49\
+\x5a\x45\x5f\x54\x59\x50\x45\x5f\x5f\0\x09\x42\x50\x46\x5f\x53\x45\x51\x5f\x50\
+\x52\x49\x4e\x54\x46\x28\x73\x65\x71\x2c\x20\x22\x25\x34\x75\x20\x25\x2d\x31\
+\x36\x73\x20\x25\x2d\x31\x32\x64\x20\x25\x73\x5c\x6e\x22\x2c\0\x30\x3a\x33\0\
+\x7d\0\x62\x70\x66\x5f\x69\x74\x65\x72\x5f\x5f\x62\x70\x66\x5f\x70\x72\x6f\x67\
+\0\x70\x72\x6f\x67\0\x64\x75\x6d\x70\x5f\x62\x70\x66\x5f\x70\x72\x6f\x67\0\x69\
+\x74\x65\x72\x2f\x62\x70\x66\x5f\x70\x72\x6f\x67\0\x09\x73\x74\x72\x75\x63\x74\
+\x20\x62\x70\x66\x5f\x70\x72\x6f\x67\x20\x2a\x70\x72\x6f\x67\x20\x3d\x20\x63\
+\x74\x78\x2d\x3e\x70\x72\x6f\x67\x3b\0\x09\x69\x66\x20\x28\x21\x70\x72\x6f\x67\
+\x29\0\x62\x70\x66\x5f\x70\x72\x6f\x67\0\x61\x75\x78\0\x09\x61\x75\x78\x20\x3d\
+\x20\x70\x72\x6f\x67\x2d\x3e\x61\x75\x78\x3b\0\x09\x09\x42\x50\x46\x5f\x53\x45\
+\x51\x5f\x50\x52\x49\x4e\x54\x46\x28\x73\x65\x71\x2c\x20\x22\x25\x34\x73\x20\
+\x25\x2d\x31\x36\x73\x20\x25\x2d\x31\x36\x73\x20\x25\x73\x5c\x6e\x22\x2c\0\x62\
+\x70\x66\x5f\x70\x72\x6f\x67\x5f\x61\x75\x78\0\x61\x74\x74\x61\x63\x68\x5f\x66\
+\x75\x6e\x63\x5f\x6e\x61\x6d\x65\0\x64\x73\x74\x5f\x70\x72\x6f\x67\0\x66\x75\
+\x6e\x63\x5f\x69\x6e\x66\x6f\0\x62\x74\x66\0\x75\x73\x65\x64\x5f\x6d\x61\x70\
+\x5f\x63\x6e\x74\0\x75\x73\x65\x64\x5f\x6d\x61\x70\x73\0\x09\x42\x50\x46\x5f\
 \x53\x45\x51\x5f\x50\x52\x49\x4e\x54\x46\x28\x73\x65\x71\x2c\x20\x22\x25\x34\
-\x73\x20\x25\x2d\x31\x36\x73\x20\x25\x2d\x31\x32\x73\x20\x25\x73\x5c\x6e\x22\
-\x2c\0\x62\x70\x66\x5f\x6d\x61\x70\0\x69\x64\0\x6e\x61\x6d\x65\0\x6d\x61\x78\
-\x5f\x65\x6e\x74\x72\x69\x65\x73\0\x70\x69\x6e\x5f\x6e\x61\x6d\x65\0\x5f\x5f\
-\x75\x33\x32\0\x75\x6e\x73\x69\x67\x6e\x65\x64\x20\x69\x6e\x74\0\x63\x68\x61\
-\x72\0\x5f\x5f\x41\x52\x52\x41\x59\x5f\x53\x49\x5a\x45\x5f\x54\x59\x50\x45\x5f\
-\x5f\0\x09\x42\x50\x46\x5f\x53\x45\x51\x5f\x50\x52\x49\x4e\x54\x46\x28\x73\x65\
-\x71\x2c\x20\x22\x25\x34\x75\x20\x25\x2d\x31\x36\x73\x20\x25\x2d\x31\x32\x64\
-\x20\x25\x73\x5c\x6e\x22\x2c\x20\x6d\x61\x70\x2d\x3e\x69\x64\x2c\x20\x6d\x61\
-\x70\x2d\x3e\x6e\x61\x6d\x65\x2c\x20\x6d\x61\x70\x2d\x3e\x6d\x61\x78\x5f\x65\
-\x6e\x74\x72\x69\x65\x73\x2c\x20\x6d\x61\x70\x2d\x3e\x70\x69\x6e\x5f\x6e\x61\
-\x6d\x65\x29\x3b\0\x30\x3a\x33\0\x7d\0\x62\x70\x66\x5f\x69\x74\x65\x72\x5f\x5f\
-\x62\x70\x66\x5f\x70\x72\x6f\x67\0\x70\x72\x6f\x67\0\x64\x75\x6d\x70\x5f\x62\
-\x70\x66\x5f\x70\x72\x6f\x67\0\x69\x74\x65\x72\x2f\x62\x70\x66\x5f\x70\x72\x6f\
-\x67\0\x09\x73\x74\x72\x75\x63\x74\x20\x62\x70\x66\x5f\x70\x72\x6f\x67\x20\x2a\
-\x70\x72\x6f\x67\x20\x3d\x20\x63\x74\x78\x2d\x3e\x70\x72\x6f\x67\x3b\0\x09\x69\
-\x66\x20\x28\x21\x70\x72\x6f\x67\x29\0\x62\x70\x66\x5f\x70\x72\x6f\x67\0\x61\
-\x75\x78\0\x09\x61\x75\x78\x20\x3d\x20\x70\x72\x6f\x67\x2d\x3e\x61\x75\x78\x3b\
-\0\x09\x09\x42\x50\x46\x5f\x53\x45\x51\x5f\x50\x52\x49\x4e\x54\x46\x28\x73\x65\
-\x71\x2c\x20\x22\x25\x34\x73\x20\x25\x2d\x31\x36\x73\x20\x25\x2d\x31\x36\x73\
-\x20\x25\x73\x5c\x6e\x22\x2c\0\x62\x70\x66\x5f\x70\x72\x6f\x67\x5f\x61\x75\x78\
-\0\x61\x74\x74\x61\x63\x68\x5f\x66\x75\x6e\x63\x5f\x6e\x61\x6d\x65\0\x64\x73\
-\x74\x5f\x70\x72\x6f\x67\0\x66\x75\x6e\x63\x5f\x69\x6e\x66\x6f\0\x62\x74\x66\0\
-\x09\x42\x50\x46\x5f\x53\x45\x51\x5f\x50\x52\x49\x4e\x54\x46\x28\x73\x65\x71\
-\x2c\x20\x22\x25\x34\x75\x20\x25\x2d\x31\x36\x73\x20\x25\x2d\x31\x36\x73\x20\
-\x25\x73\x20\x25\x73\x5c\x6e\x22\x2c\x20\x61\x75\x78\x2d\x3e\x69\x64\x2c\0\x30\
-\x3a\x34\0\x30\x3a\x35\0\x09\x69\x66\x20\x28\x21\x62\x74\x66\x29\0\x62\x70\x66\
-\x5f\x66\x75\x6e\x63\x5f\x69\x6e\x66\x6f\0\x69\x6e\x73\x6e\x5f\x6f\x66\x66\0\
-\x74\x79\x70\x65\x5f\x69\x64\0\x30\0\x73\x74\x72\x69\x6e\x67\x73\0\x74\x79\x70\
-\x65\x73\0\x68\x64\x72\0\x62\x74\x66\x5f\x68\x65\x61\x64\x65\x72\0\x73\x74\x72\
-\x5f\x6c\x65\x6e\0\x09\x74\x79\x70\x65\x73\x20\x3d\x20\x62\x74\x66\x2d\x3e\x74\
-\x79\x70\x65\x73\x3b\0\x09\x62\x70\x66\x5f\x70\x72\x6f\x62\x65\x5f\x72\x65\x61\
-\x64\x5f\x6b\x65\x72\x6e\x65\x6c\x28\x26\x74\x2c\x20\x73\x69\x7a\x65\x6f\x66\
-\x28\x74\x29\x2c\x20\x74\x79\x70\x65\x73\x20\x2b\x20\x62\x74\x66\x5f\x69\x64\
-\x29\x3b\0\x09\x73\x74\x72\x20\x3d\x20\x62\x74\x66\x2d\x3e\x73\x74\x72\x69\x6e\
-\x67\x73\x3b\0\x62\x74\x66\x5f\x74\x79\x70\x65\0\x6e\x61\x6d\x65\x5f\x6f\x66\
-\x66\0\x09\x6e\x61\x6d\x65\x5f\x6f\x66\x66\x20\x3d\x20\x42\x50\x46\x5f\x43\x4f\
-\x52\x45\x5f\x52\x45\x41\x44\x28\x74\x2c\x20\x6e\x61\x6d\x65\x5f\x6f\x66\x66\
-\x29\x3b\0\x30\x3a\x32\x3a\x30\0\x09\x69\x66\x20\x28\x6e\x61\x6d\x65\x5f\x6f\
-\x66\x66\x20\x3e\x3d\x20\x62\x74\x66\x2d\x3e\x68\x64\x72\x2e\x73\x74\x72\x5f\
-\x6c\x65\x6e\x29\0\x09\x72\x65\x74\x75\x72\x6e\x20\x73\x74\x72\x20\x2b\x20\x6e\
-\x61\x6d\x65\x5f\x6f\x66\x66\x3b\0\x30\x3a\x36\0\x64\x75\x6d\x70\x5f\x62\x70\
+\x75\x20\x25\x2d\x31\x36\x73\x20\x25\x2d\x31\x36\x73\x20\x25\x73\x20\x25\x73\
+\x5c\x6e\x22\x2c\x20\x61\x75\x78\x2d\x3e\x69\x64\x2c\0\x30\x3a\x34\0\x30\x3a\
+\x35\0\x09\x69\x66\x20\x28\x21\x62\x74\x66\x29\0\x62\x70\x66\x5f\x66\x75\x6e\
+\x63\x5f\x69\x6e\x66\x6f\0\x69\x6e\x73\x6e\x5f\x6f\x66\x66\0\x74\x79\x70\x65\
+\x5f\x69\x64\0\x30\0\x73\x74\x72\x69\x6e\x67\x73\0\x74\x79\x70\x65\x73\0\x68\
+\x64\x72\0\x62\x74\x66\x5f\x68\x65\x61\x64\x65\x72\0\x73\x74\x72\x5f\x6c\x65\
+\x6e\0\x09\x74\x79\x70\x65\x73\x20\x3d\x20\x62\x74\x66\x2d\x3e\x74\x79\x70\x65\
+\x73\x3b\0\x09\x62\x70\x66\x5f\x70\x72\x6f\x62\x65\x5f\x72\x65\x61\x64\x5f\x6b\
+\x65\x72\x6e\x65\x6c\x28\x26\x74\x2c\x20\x73\x69\x7a\x65\x6f\x66\x28\x74\x29\
+\x2c\x20\x74\x79\x70\x65\x73\x20\x2b\x20\x62\x74\x66\x5f\x69\x64\x29\x3b\0\x09\
+\x73\x74\x72\x20\x3d\x20\x62\x74\x66\x2d\x3e\x73\x74\x72\x69\x6e\x67\x73\x3b\0\
+\x62\x74\x66\x5f\x74\x79\x70\x65\0\x6e\x61\x6d\x65\x5f\x6f\x66\x66\0\x09\x6e\
+\x61\x6d\x65\x5f\x6f\x66\x66\x20\x3d\x20\x42\x50\x46\x5f\x43\x4f\x52\x45\x5f\
+\x52\x45\x41\x44\x28\x74\x2c\x20\x6e\x61\x6d\x65\x5f\x6f\x66\x66\x29\x3b\0\x30\
+\x3a\x32\x3a\x30\0\x09\x69\x66\x20\x28\x6e\x61\x6d\x65\x5f\x6f\x66\x66\x20\x3e\
+\x3d\x20\x62\x74\x66\x2d\x3e\x68\x64\x72\x2e\x73\x74\x72\x5f\x6c\x65\x6e\x29\0\
+\x09\x72\x65\x74\x75\x72\x6e\x20\x73\x74\x72\x20\x2b\x20\x6e\x61\x6d\x65\x5f\
+\x6f\x66\x66\x3b\0\x30\x3a\x36\0\x30\x3a\x37\0\x09\x69\x66\x20\x28\x21\x61\x75\
+\x78\x2d\x3e\x75\x73\x65\x64\x5f\x6d\x61\x70\x5f\x63\x6e\x74\x29\0\x09\x42\x50\
+\x46\x5f\x53\x45\x51\x5f\x50\x52\x49\x4e\x54\x46\x28\x73\x65\x71\x2c\x20\x22\
+\x20\x20\x20\x20\x6d\x61\x70\x73\x3a\x22\x29\x3b\0\x09\x66\x6f\x72\x20\x28\x69\
+\x20\x3d\x20\x30\x3b\x20\x69\x20\x3c\x20\x61\x75\x78\x2d\x3e\x75\x73\x65\x64\
+\x5f\x6d\x61\x70\x5f\x63\x6e\x74\x20\x26\x26\x20\x69\x20\x3c\x20\x36\x34\x3b\
+\x20\x69\x2b\x2b\x29\x20\x7b\0\x30\x3a\x38\0\x09\x09\x62\x70\x66\x5f\x70\x72\
+\x6f\x62\x65\x5f\x72\x65\x61\x64\x5f\x6b\x65\x72\x6e\x65\x6c\x28\x26\x6d\x61\
+\x70\x2c\x20\x73\x69\x7a\x65\x6f\x66\x28\x6d\x61\x70\x29\x2c\x20\x61\x75\x78\
+\x2d\x3e\x75\x73\x65\x64\x5f\x6d\x61\x70\x73\x20\x2b\x20\x69\x29\x3b\0\x09\x09\
+\x69\x64\x20\x3d\x20\x42\x50\x46\x5f\x43\x4f\x52\x45\x5f\x52\x45\x41\x44\x28\
+\x6d\x61\x70\x2c\x20\x69\x64\x29\x3b\0\x09\x09\x42\x50\x46\x5f\x53\x45\x51\x5f\
+\x50\x52\x49\x4e\x54\x46\x28\x73\x65\x71\x2c\x20\x22\x20\x25\x75\x22\x2c\x20\
+\x69\x64\x29\x3b\0\x09\x42\x50\x46\x5f\x53\x45\x51\x5f\x50\x52\x49\x4e\x54\x46\
+\x28\x73\x65\x71\x2c\x20\x22\x5c\x6e\x22\x29\x3b\0\x64\x75\x6d\x70\x5f\x62\x70\
 \x66\x5f\x6d\x61\x70\x2e\x5f\x5f\x5f\x66\x6d\x74\0\x64\x75\x6d\x70\x5f\x62\x70\
 \x66\x5f\x6d\x61\x70\x2e\x5f\x5f\x5f\x66\x6d\x74\x2e\x34\0\x64\x75\x6d\x70\x5f\
 \x62\x70\x66\x5f\x70\x72\x6f\x67\x2e\x5f\x5f\x5f\x66\x6d\x74\0\x64\x75\x6d\x70\
-\x5f\x62\x70\x66\x5f\x70\x72\x6f\x67\x2e\x5f\x5f\x5f\x66\x6d\x74\x2e\x36\0\x4c\
-\x49\x43\x45\x4e\x53\x45\0\x2e\x72\x6f\x64\x61\x74\x61\0\x6c\x69\x63\x65\x6e\
-\x73\x65\0\x9f\xeb\x01\0\x20\0\0\0\0\0\0\0\x24\0\0\0\x24\0\0\0\x44\x02\0\0\x68\
-\x02\0\0\xc4\x01\0\0\x08\0\0\0\x31\0\0\0\x01\0\0\0\0\0\0\0\x07\0\0\0\x7c\x02\0\
-\0\x01\0\0\0\0\0\0\0\x18\0\0\0\x10\0\0\0\x31\0\0\0\x09\0\0\0\0\0\0\0\x42\0\0\0\
-\x8f\0\0\0\x1e\x44\x01\0\x08\0\0\0\x42\0\0\0\x8f\0\0\0\x24\x44\x01\0\x10\0\0\0\
-\x42\0\0\0\x06\x01\0\0\x1d\x4c\x01\0\x18\0\0\0\x42\0\0\0\x27\x01\0\0\x06\x54\
-\x01\0\x20\0\0\0\x42\0\0\0\x36\x01\0\0\x1d\x48\x01\0\x28\0\0\0\x42\0\0\0\x5b\
-\x01\0\0\x06\x60\x01\0\x30\0\0\0\x42\0\0\0\x6e\x01\0\0\x03\x64\x01\0\xd0\0\0\0\
-\x42\0\0\0\xed\x01\0\0\x02\x70\x01\0\x68\x01\0\0\x42\0\0\0\x54\x02\0\0\x01\x78\
-\x01\0\x7c\x02\0\0\x1a\0\0\0\0\0\0\0\x42\0\0\0\x8f\0\0\0\x1e\x8c\x01\0\x08\0\0\
-\0\x42\0\0\0\x8f\0\0\0\x24\x8c\x01\0\x10\0\0\0\x42\0\0\0\x8a\x02\0\0\x1f\x94\
-\x01\0\x18\0\0\0\x42\0\0\0\xae\x02\0\0\x06\xa0\x01\0\x20\0\0\0\x42\0\0\0\xc7\
-\x02\0\0\x0e\xac\x01\0\x28\0\0\0\x42\0\0\0\x36\x01\0\0\x1d\x90\x01\0\x30\0\0\0\
-\x42\0\0\0\x5b\x01\0\0\x06\xb0\x01\0\x38\0\0\0\x42\0\0\0\xd9\x02\0\0\x03\xb4\
-\x01\0\xe0\0\0\0\x42\0\0\0\x3c\x03\0\0\x02\xc0\x01\0\x18\x01\0\0\x42\0\0\0\x7d\
-\x03\0\0\x06\x0c\x01\0\x30\x01\0\0\x42\0\0\0\0\0\0\0\0\0\0\0\x38\x01\0\0\x42\0\
-\0\0\xce\x03\0\0\x0f\x18\x01\0\x40\x01\0\0\x42\0\0\0\xe3\x03\0\0\x2d\x1c\x01\0\
-\x50\x01\0\0\x42\0\0\0\x1a\x04\0\0\x0d\x14\x01\0\x60\x01\0\0\x42\0\0\0\0\0\0\0\
-\0\0\0\0\x68\x01\0\0\x42\0\0\0\xe3\x03\0\0\x02\x1c\x01\0\x80\x01\0\0\x42\0\0\0\
-\x41\x04\0\0\x0d\x20\x01\0\x98\x01\0\0\x42\0\0\0\0\0\0\0\0\0\0\0\xa0\x01\0\0\
-\x42\0\0\0\x41\x04\0\0\x0d\x20\x01\0\xb8\x01\0\0\x42\0\0\0\x41\x04\0\0\x0d\x20\
-\x01\0\xc0\x01\0\0\x42\0\0\0\x6f\x04\0\0\x1b\x24\x01\0\xc8\x01\0\0\x42\0\0\0\
-\x6f\x04\0\0\x06\x24\x01\0\xd0\x01\0\0\x42\0\0\0\x92\x04\0\0\x0d\x2c\x01\0\xd8\
-\x01\0\0\x42\0\0\0\0\0\0\0\0\0\0\0\xe0\x01\0\0\x42\0\0\0\x3c\x03\0\0\x02\xc0\
-\x01\0\x78\x02\0\0\x42\0\0\0\x54\x02\0\0\x01\xd4\x01\0\x10\0\0\0\x31\0\0\0\x08\
-\0\0\0\0\0\0\0\x02\0\0\0\x3e\0\0\0\0\0\0\0\x08\0\0\0\x08\0\0\0\x3e\0\0\0\0\0\0\
-\0\x10\0\0\0\x02\0\0\0\x02\x01\0\0\0\0\0\0\x20\0\0\0\x08\0\0\0\x32\x01\0\0\0\0\
-\0\0\xd0\0\0\0\x0d\0\0\0\x3e\0\0\0\0\0\0\0\xe0\0\0\0\x0d\0\0\0\x02\x01\0\0\0\0\
-\0\0\0\x01\0\0\x0d\0\0\0\x32\x01\0\0\0\0\0\0\x10\x01\0\0\x0d\0\0\0\x50\x02\0\0\
-\0\0\0\0\x7c\x02\0\0\x13\0\0\0\0\0\0\0\x15\0\0\0\x3e\0\0\0\0\0\0\0\x08\0\0\0\
-\x08\0\0\0\x3e\0\0\0\0\0\0\0\x10\0\0\0\x15\0\0\0\x02\x01\0\0\0\0\0\0\x20\0\0\0\
-\x19\0\0\0\x3e\0\0\0\0\0\0\0\x28\0\0\0\x08\0\0\0\x32\x01\0\0\0\0\0\0\xe0\0\0\0\
-\x1b\0\0\0\x3e\0\0\0\0\0\0\0\xf0\0\0\0\x1b\0\0\0\x02\x01\0\0\0\0\0\0\x08\x01\0\
-\0\x1b\0\0\0\x75\x03\0\0\0\0\0\0\x10\x01\0\0\x1b\0\0\0\x79\x03\0\0\0\0\0\0\x20\
-\x01\0\0\x20\0\0\0\xa7\x03\0\0\0\0\0\0\x38\x01\0\0\x21\0\0\0\x02\x01\0\0\0\0\0\
-\0\x50\x01\0\0\x21\0\0\0\x3e\0\0\0\0\0\0\0\x78\x01\0\0\x25\0\0\0\x3e\0\0\0\0\0\
-\0\0\xb0\x01\0\0\x1b\0\0\0\x02\x01\0\0\0\0\0\0\xc0\x01\0\0\x21\0\0\0\x69\x04\0\
-\0\0\0\0\0\xe8\x01\0\0\x1b\0\0\0\x32\x01\0\0\0\0\0\0\xf8\x01\0\0\x1b\0\0\0\xaa\
-\x04\0\0\0\0\0\0\x18\x02\0\0\x1b\0\0\0\x50\x02\0\0\0\0\0\0\x20\x02\0\0\x19\0\0\
-\0\x3e\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x98\0\0\
-\0\x04\0\xf1\xff\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x3d\0\0\0\x01\0\x05\0\0\0\0\0\
-\0\0\0\0\x03\0\0\0\0\0\0\0\x3c\x01\0\0\x01\0\x05\0\x03\0\0\0\0\0\0\0\x05\0\0\0\
-\0\0\0\0\x33\x01\0\0\x01\0\x05\0\x08\0\0\0\0\0\0\0\x0c\0\0\0\0\0\0\0\x2a\x01\0\
-\0\x01\0\x05\0\x14\0\0\0\0\0\0\0\x07\0\0\0\0\0\0\0\xf6\0\0\0\x01\0\x05\0\x1b\0\
-\0\0\0\0\0\0\x09\0\0\0\0\0\0\0\x23\x01\0\0\0\0\x02\0\xd0\0\0\0\0\0\0\0\0\0\0\0\
-\0\0\0\0\xff\0\0\0\0\0\x02\0\x68\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x1c\x01\0\0\0\
-\0\x03\0\xd8\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xd8\0\0\0\0\0\x03\0\xe0\x01\0\0\0\0\
-\0\0\0\0\0\0\0\0\0\0\xd1\0\0\0\0\0\x03\0\x78\x02\0\0\0\0\0\0\0\0\0\0\0\0\0\0\
-\x14\0\0\0\x01\0\x04\0\0\0\0\0\0\0\0\0\x14\0\0\0\0\0\0\0\x06\x01\0\0\x01\0\x04\
-\0\x14\0\0\0\0\0\0\0\x14\0\0\0\0\0\0\0\x28\0\0\0\x01\0\x04\0\x28\0\0\0\0\0\0\0\
-\x14\0\0\0\0\0\0\0\xdf\0\0\0\x01\0\x04\0\x3c\0\0\0\0\0\0\0\x17\0\0\0\0\0\0\0\0\
-\0\0\0\x03\0\x02\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x03\0\x03\0\0\0\0\0\
-\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x03\0\x04\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\
-\xc9\0\0\0\x11\0\x06\0\0\0\0\0\0\0\0\0\x04\0\0\0\0\0\0\0\x44\0\0\0\x12\0\x02\0\
-\0\0\0\0\0\0\0\0\x78\x01\0\0\0\0\0\0\x62\0\0\0\x12\0\x03\0\0\0\0\0\0\0\0\0\x88\
-\x02\0\0\0\0\0\0\x30\0\0\0\0\0\0\0\x01\0\0\0\x05\0\0\0\x48\0\0\0\0\0\0\0\x01\0\
-\0\0\x04\0\0\0\x60\0\0\0\0\0\0\0\x01\0\0\0\x03\0\0\0\x78\0\0\0\0\0\0\0\x01\0\0\
-\0\x02\0\0\0\xa8\0\0\0\0\0\0\0\x01\0\0\0\x12\0\0\0\x40\x01\0\0\0\0\0\0\x01\0\0\
-\0\x12\0\0\0\x38\0\0\0\0\0\0\0\x01\0\0\0\x05\0\0\0\x50\0\0\0\0\0\0\0\x01\0\0\0\
-\x06\0\0\0\x68\0\0\0\0\0\0\0\x01\0\0\0\x03\0\0\0\x80\0\0\0\0\0\0\0\x01\0\0\0\
-\x02\0\0\0\xb0\0\0\0\0\0\0\0\x01\0\0\0\x12\0\0\0\x50\x02\0\0\0\0\0\0\x01\0\0\0\
-\x12\0\0\0\xf0\x03\0\0\0\0\0\0\x0a\0\0\0\x12\0\0\0\xfc\x03\0\0\0\0\0\0\x0a\0\0\
-\0\x12\0\0\0\x08\x04\0\0\0\0\0\0\x0a\0\0\0\x12\0\0\0\x14\x04\0\0\0\0\0\0\x0a\0\
-\0\0\x12\0\0\0\x2c\x04\0\0\0\0\0\0\0\0\0\0\x13\0\0\0\x2c\0\0\0\0\0\0\0\0\0\0\0\
-\x10\0\0\0\x3c\0\0\0\0\0\0\0\0\0\0\0\x11\0\0\0\x50\0\0\0\0\0\0\0\0\0\0\0\x10\0\
-\0\0\x60\0\0\0\0\0\0\0\0\0\0\0\x10\0\0\0\x70\0\0\0\0\0\0\0\0\0\0\0\x10\0\0\0\
-\x80\0\0\0\0\0\0\0\0\0\0\0\x10\0\0\0\x90\0\0\0\0\0\0\0\0\0\0\0\x10\0\0\0\xa0\0\
-\0\0\0\0\0\0\0\0\0\0\x10\0\0\0\xb0\0\0\0\0\0\0\0\0\0\0\0\x10\0\0\0\xc0\0\0\0\0\
-\0\0\0\0\0\0\0\x10\0\0\0\xd0\0\0\0\0\0\0\0\0\0\0\0\x10\0\0\0\xe8\0\0\0\0\0\0\0\
-\0\0\0\0\x11\0\0\0\xf8\0\0\0\0\0\0\0\0\0\0\0\x11\0\0\0\x08\x01\0\0\0\0\0\0\0\0\
-\0\0\x11\0\0\0\x18\x01\0\0\0\0\0\0\0\0\0\0\x11\0\0\0\x28\x01\0\0\0\0\0\0\0\0\0\
-\0\x11\0\0\0\x38\x01\0\0\0\0\0\0\0\0\0\0\x11\0\0\0\x48\x01\0\0\0\0\0\0\0\0\0\0\
-\x11\0\0\0\x58\x01\0\0\0\0\0\0\0\0\0\0\x11\0\0\0\x68\x01\0\0\0\0\0\0\0\0\0\0\
-\x11\0\0\0\x78\x01\0\0\0\0\0\0\0\0\0\0\x11\0\0\0\x88\x01\0\0\0\0\0\0\0\0\0\0\
-\x11\0\0\0\x98\x01\0\0\0\0\0\0\0\0\0\0\x11\0\0\0\xa8\x01\0\0\0\0\0\0\0\0\0\0\
-\x11\0\0\0\xb8\x01\0\0\0\0\0\0\0\0\0\0\x11\0\0\0\xc8\x01\0\0\0\0\0\0\0\0\0\0\
-\x11\0\0\0\xd8\x01\0\0\0\0\0\0\0\0\0\0\x11\0\0\0\xe8\x01\0\0\0\0\0\0\0\0\0\0\
-\x11\0\0\0\xf8\x01\0\0\0\0\0\0\0\0\0\0\x11\0\0\0\x08\x02\0\0\0\0\0\0\0\0\0\0\
-\x11\0\0\0\x18\x02\0\0\0\0\0\0\0\0\0\0\x11\0\0\0\x28\x02\0\0\0\0\0\0\0\0\0\0\
-\x11\0\0\0\x38\x02\0\0\0\0\0\0\0\0\0\0\x11\0\0\0\x48\x02\0\0\0\0\0\0\0\0\0\0\
-\x11\0\0\0\x58\x02\0\0\0\0\0\0\0\0\0\0\x11\0\0\0\x68\x02\0\0\0\0\0\0\0\0\0\0\
-\x11\0\0\0\x78\x02\0\0\0\0\0\0\0\0\0\0\x11\0\0\0\x94\x02\0\0\0\0\0\0\0\0\0\0\
-\x10\0\0\0\xa4\x02\0\0\0\0\0\0\0\0\0\0\x10\0\0\0\xb4\x02\0\0\0\0\0\0\0\0\0\0\
-\x10\0\0\0\xc4\x02\0\0\0\0\0\0\0\0\0\0\x10\0\0\0\xd4\x02\0\0\0\0\0\0\0\0\0\0\
-\x10\0\0\0\xe4\x02\0\0\0\0\0\0\0\0\0\0\x10\0\0\0\xf4\x02\0\0\0\0\0\0\0\0\0\0\
-\x10\0\0\0\x04\x03\0\0\0\0\0\0\0\0\0\0\x10\0\0\0\x1c\x03\0\0\0\0\0\0\0\0\0\0\
-\x11\0\0\0\x2c\x03\0\0\0\0\0\0\0\0\0\0\x11\0\0\0\x3c\x03\0\0\0\0\0\0\0\0\0\0\
-\x11\0\0\0\x4c\x03\0\0\0\0\0\0\0\0\0\0\x11\0\0\0\x5c\x03\0\0\0\0\0\0\0\0\0\0\
-\x11\0\0\0\x6c\x03\0\0\0\0\0\0\0\0\0\0\x11\0\0\0\x7c\x03\0\0\0\0\0\0\0\0\0\0\
-\x11\0\0\0\x8c\x03\0\0\0\0\0\0\0\0\0\0\x11\0\0\0\x9c\x03\0\0\0\0\0\0\0\0\0\0\
-\x11\0\0\0\xac\x03\0\0\0\0\0\0\0\0\0\0\x11\0\0\0\xbc\x03\0\0\0\0\0\0\0\0\0\0\
-\x11\0\0\0\xcc\x03\0\0\0\0\0\0\0\0\0\0\x11\0\0\0\xdc\x03\0\0\0\0\0\0\0\0\0\0\
-\x11\0\0\0\xec\x03\0\0\0\0\0\0\0\0\0\0\x11\0\0\0\xfc\x03\0\0\0\0\0\0\0\0\0\0\
-\x11\0\0\0\x0c\x04\0\0\0\0\0\0\0\0\0\0\x11\0\0\0\x1c\x04\0\0\0\0\0\0\0\0\0\0\
-\x11\0\0\0\x2c\x04\0\0\0\0\0\0\0\0\0\0\x11\0\0\0\x3c\x04\0\0\0\0\0\0\0\0\0\0\
-\x11\0\0\0\x52\x53\x45\x46\x47\x48\x51\0\x2e\x74\x65\x78\x74\0\x2e\x72\x65\x6c\
-\x2e\x42\x54\x46\x2e\x65\x78\x74\0\x64\x75\x6d\x70\x5f\x62\x70\x66\x5f\x6d\x61\
-\x70\x2e\x5f\x5f\x5f\x66\x6d\x74\0\x64\x75\x6d\x70\x5f\x62\x70\x66\x5f\x70\x72\
-\x6f\x67\x2e\x5f\x5f\x5f\x66\x6d\x74\0\x2e\x4c\x2e\x73\x74\x72\0\x64\x75\x6d\
-\x70\x5f\x62\x70\x66\x5f\x6d\x61\x70\0\x2e\x72\x65\x6c\x69\x74\x65\x72\x2f\x62\
-\x70\x66\x5f\x6d\x61\x70\0\x64\x75\x6d\x70\x5f\x62\x70\x66\x5f\x70\x72\x6f\x67\
-\0\x2e\x72\x65\x6c\x69\x74\x65\x72\x2f\x62\x70\x66\x5f\x70\x72\x6f\x67\0\x2e\
-\x6c\x6c\x76\x6d\x5f\x61\x64\x64\x72\x73\x69\x67\0\x6c\x69\x63\x65\x6e\x73\x65\
-\0\x69\x74\x65\x72\x61\x74\x6f\x72\x73\x2e\x62\x70\x66\x2e\x63\0\x2e\x73\x74\
-\x72\x74\x61\x62\0\x2e\x73\x79\x6d\x74\x61\x62\0\x2e\x72\x6f\x64\x61\x74\x61\0\
-\x2e\x72\x65\x6c\x2e\x42\x54\x46\0\x4c\x49\x43\x45\x4e\x53\x45\0\x4c\x42\x42\
-\x31\x5f\x37\0\x4c\x42\x42\x31\x5f\x36\0\x64\x75\x6d\x70\x5f\x62\x70\x66\x5f\
-\x70\x72\x6f\x67\x2e\x5f\x5f\x5f\x66\x6d\x74\x2e\x36\0\x2e\x4c\x2e\x73\x74\x72\
-\x2e\x35\0\x4c\x42\x42\x30\x5f\x34\0\x64\x75\x6d\x70\x5f\x62\x70\x66\x5f\x6d\
-\x61\x70\x2e\x5f\x5f\x5f\x66\x6d\x74\x2e\x34\0\x4c\x42\x42\x31\x5f\x33\0\x4c\
-\x42\x42\x30\x5f\x33\0\x2e\x4c\x2e\x73\x74\x72\x2e\x33\0\x2e\x4c\x2e\x73\x74\
-\x72\x2e\x32\0\x2e\x4c\x2e\x73\x74\x72\x2e\x31\0\x2e\x72\x6f\x64\x61\x74\x61\
-\x2e\x73\x74\x72\x31\x2e\x31\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\
+\x5f\x62\x70\x66\x5f\x70\x72\x6f\x67\x2e\x5f\x5f\x5f\x66\x6d\x74\x2e\x36\0\x64\
+\x75\x6d\x70\x5f\x62\x70\x66\x5f\x70\x72\x6f\x67\x2e\x5f\x5f\x5f\x66\x6d\x74\
+\x2e\x37\0\x64\x75\x6d\x70\x5f\x62\x70\x66\x5f\x70\x72\x6f\x67\x2e\x5f\x5f\x5f\
+\x66\x6d\x74\x2e\x38\0\x64\x75\x6d\x70\x5f\x62\x70\x66\x5f\x70\x72\x6f\x67\x2e\
+\x5f\x5f\x5f\x66\x6d\x74\x2e\x39\0\x4c\x49\x43\x45\x4e\x53\x45\0\x2e\x72\x6f\
+\x64\x61\x74\x61\0\x6c\x69\x63\x65\x6e\x73\x65\0\x9f\xeb\x01\0\x20\0\0\0\0\0\0\
+\0\x24\0\0\0\x24\0\0\0\x94\x03\0\0\xb8\x03\0\0\x14\x02\0\0\x08\0\0\0\x31\0\0\0\
+\x01\0\0\0\0\0\0\0\x07\0\0\0\x46\x02\0\0\x01\0\0\0\0\0\0\0\x18\0\0\0\x10\0\0\0\
+\x31\0\0\0\x09\0\0\0\0\0\0\0\x42\0\0\0\x8f\0\0\0\x1e\x4c\x01\0\x08\0\0\0\x42\0\
+\0\0\x8f\0\0\0\x24\x4c\x01\0\x10\0\0\0\x42\0\0\0\x06\x01\0\0\x1d\x54\x01\0\x18\
+\0\0\0\x42\0\0\0\x27\x01\0\0\x06\x5c\x01\0\x20\0\0\0\x42\0\0\0\x36\x01\0\0\x1d\
+\x50\x01\0\x28\0\0\0\x42\0\0\0\x5b\x01\0\0\x06\x68\x01\0\x30\0\0\0\x42\0\0\0\
+\x6e\x01\0\0\x03\x6c\x01\0\xd0\0\0\0\x42\0\0\0\xed\x01\0\0\x02\x78\x01\0\x68\
+\x01\0\0\x42\0\0\0\x1e\x02\0\0\x01\x84\x01\0\x46\x02\0\0\x2f\0\0\0\0\0\0\0\x42\
+\0\0\0\x8f\0\0\0\x1e\x98\x01\0\x08\0\0\0\x42\0\0\0\x36\x01\0\0\x1d\x9c\x01\0\
+\x10\0\0\0\x42\0\0\0\x8f\0\0\0\x24\x98\x01\0\x18\0\0\0\x42\0\0\0\x54\x02\0\0\
+\x1f\xa0\x01\0\x20\0\0\0\x42\0\0\0\x78\x02\0\0\x06\xb8\x01\0\x28\0\0\0\x42\0\0\
+\0\x91\x02\0\0\x0e\xc4\x01\0\x30\0\0\0\x42\0\0\0\x5b\x01\0\0\x06\xc8\x01\0\x38\
+\0\0\0\x42\0\0\0\xa3\x02\0\0\x03\xcc\x01\0\xe0\0\0\0\x42\0\0\0\x1d\x03\0\0\x02\
+\xd8\x01\0\x18\x01\0\0\x42\0\0\0\x5e\x03\0\0\x06\x14\x01\0\x30\x01\0\0\x42\0\0\
+\0\0\0\0\0\0\0\0\0\x38\x01\0\0\x42\0\0\0\xaf\x03\0\0\x0f\x20\x01\0\x40\x01\0\0\
+\x42\0\0\0\xc4\x03\0\0\x2d\x24\x01\0\x50\x01\0\0\x42\0\0\0\xfb\x03\0\0\x0d\x1c\
+\x01\0\x60\x01\0\0\x42\0\0\0\0\0\0\0\0\0\0\0\x68\x01\0\0\x42\0\0\0\xc4\x03\0\0\
+\x02\x24\x01\0\x80\x01\0\0\x42\0\0\0\x22\x04\0\0\x0d\x28\x01\0\x98\x01\0\0\x42\
+\0\0\0\0\0\0\0\0\0\0\0\xa0\x01\0\0\x42\0\0\0\x22\x04\0\0\x0d\x28\x01\0\xb8\x01\
+\0\0\x42\0\0\0\x22\x04\0\0\x0d\x28\x01\0\xc0\x01\0\0\x42\0\0\0\x50\x04\0\0\x1b\
+\x2c\x01\0\xc8\x01\0\0\x42\0\0\0\x50\x04\0\0\x06\x2c\x01\0\xd0\x01\0\0\x42\0\0\
+\0\x73\x04\0\0\x0d\x34\x01\0\xd8\x01\0\0\x42\0\0\0\0\0\0\0\0\0\0\0\xe0\x01\0\0\
+\x42\0\0\0\x1d\x03\0\0\x02\xd8\x01\0\x80\x02\0\0\x42\0\0\0\x93\x04\0\0\x0c\xec\
+\x01\0\x88\x02\0\0\x42\0\0\0\x93\x04\0\0\x06\xec\x01\0\x98\x02\0\0\x42\0\0\0\
+\xac\x04\0\0\x02\xf8\x01\0\xd8\x02\0\0\x42\0\0\0\xcf\x04\0\0\x17\xfc\x01\0\xe0\
+\x02\0\0\x42\0\0\0\xcf\x04\0\0\x02\xfc\x01\0\xf8\x02\0\0\x42\0\0\0\x08\x05\0\0\
+\x31\0\x02\0\0\x03\0\0\x42\0\0\0\x08\x05\0\0\x03\0\x02\0\x10\x03\0\0\x42\0\0\0\
+\0\0\0\0\0\0\0\0\x18\x03\0\0\x42\0\0\0\x08\x05\0\0\x03\0\x02\0\x28\x03\0\0\x42\
+\0\0\0\x48\x05\0\0\x08\x04\x02\0\x40\x03\0\0\x42\0\0\0\0\0\0\0\0\0\0\0\x48\x03\
+\0\0\x42\0\0\0\x48\x05\0\0\x08\x04\x02\0\x58\x03\0\0\x42\0\0\0\x48\x05\0\0\x08\
+\x04\x02\0\x60\x03\0\0\x42\0\0\0\x67\x05\0\0\x03\x08\x02\0\x70\x03\0\0\x42\0\0\
+\0\0\0\0\0\0\0\0\0\x78\x03\0\0\x42\0\0\0\x67\x05\0\0\x03\x08\x02\0\xa8\x03\0\0\
+\x42\0\0\0\xcf\x04\0\0\x17\xfc\x01\0\xb0\x03\0\0\x42\0\0\0\xcf\x04\0\0\x02\xfc\
+\x01\0\xb8\x03\0\0\x42\0\0\0\0\0\0\0\0\0\0\0\xc8\x03\0\0\x42\0\0\0\xcf\x04\0\0\
+\x02\xfc\x01\0\xd8\x03\0\0\x42\0\0\0\x89\x05\0\0\x02\x10\x02\0\x10\x04\0\0\x42\
+\0\0\0\x1e\x02\0\0\x01\x1c\x02\0\x10\0\0\0\x31\0\0\0\x08\0\0\0\0\0\0\0\x02\0\0\
+\0\x3e\0\0\0\0\0\0\0\x08\0\0\0\x08\0\0\0\x3e\0\0\0\0\0\0\0\x10\0\0\0\x02\0\0\0\
+\x02\x01\0\0\0\0\0\0\x20\0\0\0\x08\0\0\0\x32\x01\0\0\0\0\0\0\xd0\0\0\0\x0d\0\0\
+\0\x3e\0\0\0\0\0\0\0\xe0\0\0\0\x0d\0\0\0\x02\x01\0\0\0\0\0\0\0\x01\0\0\x0d\0\0\
+\0\x32\x01\0\0\0\0\0\0\x10\x01\0\0\x0d\0\0\0\x1a\x02\0\0\0\0\0\0\x46\x02\0\0\
+\x18\0\0\0\0\0\0\0\x15\0\0\0\x3e\0\0\0\0\0\0\0\x08\0\0\0\x08\0\0\0\x32\x01\0\0\
+\0\0\0\0\x10\0\0\0\x08\0\0\0\x3e\0\0\0\0\0\0\0\x18\0\0\0\x15\0\0\0\x02\x01\0\0\
+\0\0\0\0\x28\0\0\0\x19\0\0\0\x3e\0\0\0\0\0\0\0\xe0\0\0\0\x1b\0\0\0\x3e\0\0\0\0\
+\0\0\0\xf0\0\0\0\x1b\0\0\0\x02\x01\0\0\0\0\0\0\x08\x01\0\0\x1b\0\0\0\x56\x03\0\
+\0\0\0\0\0\x10\x01\0\0\x1b\0\0\0\x5a\x03\0\0\0\0\0\0\x20\x01\0\0\x21\0\0\0\x88\
+\x03\0\0\0\0\0\0\x38\x01\0\0\x22\0\0\0\x02\x01\0\0\0\0\0\0\x50\x01\0\0\x22\0\0\
+\0\x3e\0\0\0\0\0\0\0\x78\x01\0\0\x26\0\0\0\x3e\0\0\0\0\0\0\0\xb0\x01\0\0\x1b\0\
+\0\0\x02\x01\0\0\0\0\0\0\xc0\x01\0\0\x22\0\0\0\x4a\x04\0\0\0\0\0\0\xe8\x01\0\0\
+\x1b\0\0\0\x32\x01\0\0\0\0\0\0\xf8\x01\0\0\x1b\0\0\0\x8b\x04\0\0\0\0\0\0\x18\
+\x02\0\0\x1b\0\0\0\x1a\x02\0\0\0\0\0\0\x20\x02\0\0\x19\0\0\0\x3e\0\0\0\0\0\0\0\
+\x80\x02\0\0\x1b\0\0\0\x8f\x04\0\0\0\0\0\0\xd8\x02\0\0\x1b\0\0\0\x8f\x04\0\0\0\
+\0\0\0\xe8\x02\0\0\x0d\0\0\0\x3e\0\0\0\0\0\0\0\xf8\x02\0\0\x1b\0\0\0\x04\x05\0\
+\0\0\0\0\0\xa8\x03\0\0\x1b\0\0\0\x8f\x04\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\
+\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x98\0\0\0\x04\0\xf1\xff\0\0\0\0\0\0\0\0\0\0\0\
+\0\0\0\0\0\x3d\0\0\0\x01\0\x05\0\0\0\0\0\0\0\0\0\x03\0\0\0\0\0\0\0\x91\x01\0\0\
+\x01\0\x05\0\x03\0\0\0\0\0\0\0\x05\0\0\0\0\0\0\0\x80\x01\0\0\x01\0\x05\0\x08\0\
+\0\0\0\0\0\0\x0c\0\0\0\0\0\0\0\x6f\x01\0\0\x01\0\x05\0\x14\0\0\0\0\0\0\0\x07\0\
+\0\0\0\0\0\0\x3b\x01\0\0\x01\0\x05\0\x1b\0\0\0\0\0\0\0\x09\0\0\0\0\0\0\0\x68\
+\x01\0\0\0\0\x02\0\xd0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x44\x01\0\0\0\0\x02\0\x68\
+\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x89\x01\0\0\0\0\x03\0\xd0\x03\0\0\0\0\0\0\0\0\
+\0\0\0\0\0\0\x78\x01\0\0\0\0\x03\0\x10\x04\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x61\x01\
+\0\0\0\0\x03\0\xd8\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x1d\x01\0\0\0\0\x03\0\xe0\x01\
+\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xd1\0\0\0\0\0\x03\0\xf8\x02\0\0\0\0\0\0\0\0\0\0\0\
+\0\0\0\x14\0\0\0\x01\0\x04\0\0\0\0\0\0\0\0\0\x14\0\0\0\0\0\0\0\x4b\x01\0\0\x01\
+\0\x04\0\x14\0\0\0\0\0\0\0\x14\0\0\0\0\0\0\0\x28\0\0\0\x01\0\x04\0\x28\0\0\0\0\
+\0\0\0\x14\0\0\0\0\0\0\0\x24\x01\0\0\x01\0\x04\0\x3c\0\0\0\0\0\0\0\x17\0\0\0\0\
+\0\0\0\x06\x01\0\0\x01\0\x04\0\x53\0\0\0\0\0\0\0\x0a\0\0\0\0\0\0\0\xef\0\0\0\
+\x01\0\x04\0\x5d\0\0\0\0\0\0\0\x04\0\0\0\0\0\0\0\xd8\0\0\0\x01\0\x04\0\x61\0\0\
+\0\0\0\0\0\x02\0\0\0\0\0\0\0\0\0\0\0\x03\0\x02\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\
+\0\0\0\0\0\x03\0\x03\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x03\0\x04\0\0\0\
+\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xc9\0\0\0\x11\0\x06\0\0\0\0\0\0\0\0\0\x04\0\0\0\0\
+\0\0\0\x44\0\0\0\x12\0\x02\0\0\0\0\0\0\0\0\0\x78\x01\0\0\0\0\0\0\x62\0\0\0\x12\
+\0\x03\0\0\0\0\0\0\0\0\0\x20\x04\0\0\0\0\0\0\x30\0\0\0\0\0\0\0\x01\0\0\0\x05\0\
+\0\0\x48\0\0\0\0\0\0\0\x01\0\0\0\x04\0\0\0\x60\0\0\0\0\0\0\0\x01\0\0\0\x03\0\0\
+\0\x78\0\0\0\0\0\0\0\x01\0\0\0\x02\0\0\0\xa8\0\0\0\0\0\0\0\x01\0\0\0\x17\0\0\0\
+\x40\x01\0\0\0\0\0\0\x01\0\0\0\x17\0\0\0\x38\0\0\0\0\0\0\0\x01\0\0\0\x05\0\0\0\
+\x50\0\0\0\0\0\0\0\x01\0\0\0\x06\0\0\0\x68\0\0\0\0\0\0\0\x01\0\0\0\x03\0\0\0\
+\x80\0\0\0\0\0\0\0\x01\0\0\0\x02\0\0\0\xb0\0\0\0\0\0\0\0\x01\0\0\0\x17\0\0\0\
+\x58\x02\0\0\0\0\0\0\x01\0\0\0\x17\0\0\0\xb0\x02\0\0\0\0\0\0\x01\0\0\0\x17\0\0\
+\0\x80\x03\0\0\0\0\0\0\x01\0\0\0\x17\0\0\0\xe8\x03\0\0\0\0\0\0\x01\0\0\0\x17\0\
+\0\0\x8c\x04\0\0\0\0\0\0\x0a\0\0\0\x17\0\0\0\x98\x04\0\0\0\0\0\0\x0a\0\0\0\x17\
+\0\0\0\xa4\x04\0\0\0\0\0\0\x0a\0\0\0\x17\0\0\0\xb0\x04\0\0\0\0\0\0\x0a\0\0\0\
+\x17\0\0\0\xbc\x04\0\0\0\0\0\0\x0a\0\0\0\x17\0\0\0\xc8\x04\0\0\0\0\0\0\x0a\0\0\
+\0\x17\0\0\0\xd4\x04\0\0\0\0\0\0\x0a\0\0\0\x17\0\0\0\xec\x04\0\0\0\0\0\0\0\0\0\
+\0\x18\0\0\0\x2c\0\0\0\0\0\0\0\0\0\0\0\x15\0\0\0\x3c\0\0\0\0\0\0\0\0\0\0\0\x16\
+\0\0\0\x50\0\0\0\0\0\0\0\0\0\0\0\x15\0\0\0\x60\0\0\0\0\0\0\0\0\0\0\0\x15\0\0\0\
+\x70\0\0\0\0\0\0\0\0\0\0\0\x15\0\0\0\x80\0\0\0\0\0\0\0\0\0\0\0\x15\0\0\0\x90\0\
+\0\0\0\0\0\0\0\0\0\0\x15\0\0\0\xa0\0\0\0\0\0\0\0\0\0\0\0\x15\0\0\0\xb0\0\0\0\0\
+\0\0\0\0\0\0\0\x15\0\0\0\xc0\0\0\0\0\0\0\0\0\0\0\0\x15\0\0\0\xd0\0\0\0\0\0\0\0\
+\0\0\0\0\x15\0\0\0\xe8\0\0\0\0\0\0\0\0\0\0\0\x16\0\0\0\xf8\0\0\0\0\0\0\0\0\0\0\
+\0\x16\0\0\0\x08\x01\0\0\0\0\0\0\0\0\0\0\x16\0\0\0\x18\x01\0\0\0\0\0\0\0\0\0\0\
+\x16\0\0\0\x28\x01\0\0\0\0\0\0\0\0\0\0\x16\0\0\0\x38\x01\0\0\0\0\0\0\0\0\0\0\
+\x16\0\0\0\x48\x01\0\0\0\0\0\0\0\0\0\0\x16\0\0\0\x58\x01\0\0\0\0\0\0\0\0\0\0\
+\x16\0\0\0\x68\x01\0\0\0\0\0\0\0\0\0\0\x16\0\0\0\x78\x01\0\0\0\0\0\0\0\0\0\0\
+\x16\0\0\0\x88\x01\0\0\0\0\0\0\0\0\0\0\x16\0\0\0\x98\x01\0\0\0\0\0\0\0\0\0\0\
+\x16\0\0\0\xa8\x01\0\0\0\0\0\0\0\0\0\0\x16\0\0\0\xb8\x01\0\0\0\0\0\0\0\0\0\0\
+\x16\0\0\0\xc8\x01\0\0\0\0\0\0\0\0\0\0\x16\0\0\0\xd8\x01\0\0\0\0\0\0\0\0\0\0\
+\x16\0\0\0\xe8\x01\0\0\0\0\0\0\0\0\0\0\x16\0\0\0\xf8\x01\0\0\0\0\0\0\0\0\0\0\
+\x16\0\0\0\x08\x02\0\0\0\0\0\0\0\0\0\0\x16\0\0\0\x18\x02\0\0\0\0\0\0\0\0\0\0\
+\x16\0\0\0\x28\x02\0\0\0\0\0\0\0\0\0\0\x16\0\0\0\x38\x02\0\0\0\0\0\0\0\0\0\0\
+\x16\0\0\0\x48\x02\0\0\0\0\0\0\0\0\0\0\x16\0\0\0\x58\x02\0\0\0\0\0\0\0\0\0\0\
+\x16\0\0\0\x68\x02\0\0\0\0\0\0\0\0\0\0\x16\0\0\0\x78\x02\0\0\0\0\0\0\0\0\0\0\
+\x16\0\0\0\x88\x02\0\0\0\0\0\0\0\0\0\0\x16\0\0\0\x98\x02\0\0\0\0\0\0\0\0\0\0\
+\x16\0\0\0\xa8\x02\0\0\0\0\0\0\0\0\0\0\x16\0\0\0\xb8\x02\0\0\0\0\0\0\0\0\0\0\
+\x16\0\0\0\xc8\x02\0\0\0\0\0\0\0\0\0\0\x16\0\0\0\xd8\x02\0\0\0\0\0\0\0\0\0\0\
+\x16\0\0\0\xe8\x02\0\0\0\0\0\0\0\0\0\0\x16\0\0\0\xf8\x02\0\0\0\0\0\0\0\0\0\0\
+\x16\0\0\0\x08\x03\0\0\0\0\0\0\0\0\0\0\x16\0\0\0\x18\x03\0\0\0\0\0\0\0\0\0\0\
+\x16\0\0\0\x28\x03\0\0\0\0\0\0\0\0\0\0\x16\0\0\0\x38\x03\0\0\0\0\0\0\0\0\0\0\
+\x16\0\0\0\x48\x03\0\0\0\0\0\0\0\0\0\0\x16\0\0\0\x58\x03\0\0\0\0\0\0\0\0\0\0\
+\x16\0\0\0\x68\x03\0\0\0\0\0\0\0\0\0\0\x16\0\0\0\x78\x03\0\0\0\0\0\0\0\0\0\0\
+\x16\0\0\0\x88\x03\0\0\0\0\0\0\0\0\0\0\x16\0\0\0\x98\x03\0\0\0\0\0\0\0\0\0\0\
+\x16\0\0\0\xa8\x03\0\0\0\0\0\0\0\0\0\0\x16\0\0\0\xb8\x03\0\0\0\0\0\0\0\0\0\0\
+\x16\0\0\0\xc8\x03\0\0\0\0\0\0\0\0\0\0\x16\0\0\0\xe4\x03\0\0\0\0\0\0\0\0\0\0\
+\x15\0\0\0\xf4\x03\0\0\0\0\0\0\0\0\0\0\x15\0\0\0\x04\x04\0\0\0\0\0\0\0\0\0\0\
+\x15\0\0\0\x14\x04\0\0\0\0\0\0\0\0\0\0\x15\0\0\0\x24\x04\0\0\0\0\0\0\0\0\0\0\
+\x15\0\0\0\x34\x04\0\0\0\0\0\0\0\0\0\0\x15\0\0\0\x44\x04\0\0\0\0\0\0\0\0\0\0\
+\x15\0\0\0\x54\x04\0\0\0\0\0\0\0\0\0\0\x15\0\0\0\x6c\x04\0\0\0\0\0\0\0\0\0\0\
+\x16\0\0\0\x7c\x04\0\0\0\0\0\0\0\0\0\0\x16\0\0\0\x8c\x04\0\0\0\0\0\0\0\0\0\0\
+\x16\0\0\0\x9c\x04\0\0\0\0\0\0\0\0\0\0\x16\0\0\0\xac\x04\0\0\0\0\0\0\0\0\0\0\
+\x16\0\0\0\xbc\x04\0\0\0\0\0\0\0\0\0\0\x16\0\0\0\xcc\x04\0\0\0\0\0\0\0\0\0\0\
+\x16\0\0\0\xdc\x04\0\0\0\0\0\0\0\0\0\0\x16\0\0\0\xec\x04\0\0\0\0\0\0\0\0\0\0\
+\x16\0\0\0\xfc\x04\0\0\0\0\0\0\0\0\0\0\x16\0\0\0\x0c\x05\0\0\0\0\0\0\0\0\0\0\
+\x16\0\0\0\x1c\x05\0\0\0\0\0\0\0\0\0\0\x16\0\0\0\x2c\x05\0\0\0\0\0\0\0\0\0\0\
+\x16\0\0\0\x3c\x05\0\0\0\0\0\0\0\0\0\0\x16\0\0\0\x4c\x05\0\0\0\0\0\0\0\0\0\0\
+\x16\0\0\0\x5c\x05\0\0\0\0\0\0\0\0\0\0\x16\0\0\0\x6c\x05\0\0\0\0\0\0\0\0\0\0\
+\x16\0\0\0\x7c\x05\0\0\0\0\0\0\0\0\0\0\x16\0\0\0\x8c\x05\0\0\0\0\0\0\0\0\0\0\
+\x16\0\0\0\x9c\x05\0\0\0\0\0\0\0\0\0\0\x16\0\0\0\xac\x05\0\0\0\0\0\0\0\0\0\0\
+\x16\0\0\0\xbc\x05\0\0\0\0\0\0\0\0\0\0\x16\0\0\0\xcc\x05\0\0\0\0\0\0\0\0\0\0\
+\x16\0\0\0\xdc\x05\0\0\0\0\0\0\0\0\0\0\x16\0\0\0\x5a\x5b\x4a\x4b\x4c\x4d\x4e\
+\x4f\x50\x59\0\x2e\x74\x65\x78\x74\0\x2e\x72\x65\x6c\x2e\x42\x54\x46\x2e\x65\
+\x78\x74\0\x64\x75\x6d\x70\x5f\x62\x70\x66\x5f\x6d\x61\x70\x2e\x5f\x5f\x5f\x66\
+\x6d\x74\0\x64\x75\x6d\x70\x5f\x62\x70\x66\x5f\x70\x72\x6f\x67\x2e\x5f\x5f\x5f\
+\x66\x6d\x74\0\x2e\x4c\x2e\x73\x74\x72\0\x64\x75\x6d\x70\x5f\x62\x70\x66\x5f\
+\x6d\x61\x70\0\x2e\x72\x65\x6c\x69\x74\x65\x72\x2f\x62\x70\x66\x5f\x6d\x61\x70\
+\0\x64\x75\x6d\x70\x5f\x62\x70\x66\x5f\x70\x72\x6f\x67\0\x2e\x72\x65\x6c\x69\
+\x74\x65\x72\x2f\x62\x70\x66\x5f\x70\x72\x6f\x67\0\x2e\x6c\x6c\x76\x6d\x5f\x61\
+\x64\x64\x72\x73\x69\x67\0\x6c\x69\x63\x65\x6e\x73\x65\0\x69\x74\x65\x72\x61\
+\x74\x6f\x72\x73\x2e\x62\x70\x66\x2e\x63\0\x2e\x73\x74\x72\x74\x61\x62\0\x2e\
+\x73\x79\x6d\x74\x61\x62\0\x2e\x72\x6f\x64\x61\x74\x61\0\x2e\x72\x65\x6c\x2e\
+\x42\x54\x46\0\x4c\x49\x43\x45\x4e\x53\x45\0\x4c\x42\x42\x31\x5f\x39\0\x64\x75\
+\x6d\x70\x5f\x62\x70\x66\x5f\x70\x72\x6f\x67\x2e\x5f\x5f\x5f\x66\x6d\x74\x2e\
+\x39\0\x64\x75\x6d\x70\x5f\x62\x70\x66\x5f\x70\x72\x6f\x67\x2e\x5f\x5f\x5f\x66\
+\x6d\x74\x2e\x38\0\x64\x75\x6d\x70\x5f\x62\x70\x66\x5f\x70\x72\x6f\x67\x2e\x5f\
+\x5f\x5f\x66\x6d\x74\x2e\x37\0\x4c\x42\x42\x31\x5f\x36\0\x64\x75\x6d\x70\x5f\
+\x62\x70\x66\x5f\x70\x72\x6f\x67\x2e\x5f\x5f\x5f\x66\x6d\x74\x2e\x36\0\x2e\x4c\
+\x2e\x73\x74\x72\x2e\x35\0\x4c\x42\x42\x30\x5f\x34\0\x64\x75\x6d\x70\x5f\x62\
+\x70\x66\x5f\x6d\x61\x70\x2e\x5f\x5f\x5f\x66\x6d\x74\x2e\x34\0\x4c\x42\x42\x31\
+\x5f\x33\0\x4c\x42\x42\x30\x5f\x33\0\x2e\x4c\x2e\x73\x74\x72\x2e\x33\0\x4c\x42\
+\x42\x31\x5f\x31\x32\0\x2e\x4c\x2e\x73\x74\x72\x2e\x32\0\x4c\x42\x42\x31\x5f\
+\x31\x31\0\x2e\x4c\x2e\x73\x74\x72\x2e\x31\0\x2e\x72\x6f\x64\x61\x74\x61\x2e\
+\x73\x74\x72\x31\x2e\x31\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\
 \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\
-\0\0\0\0\0\0\x01\0\0\0\x01\0\0\0\x06\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x40\0\0\0\0\
-\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x04\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x55\0\
-\0\0\x01\0\0\0\x06\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x40\0\0\0\0\0\0\0\x78\x01\0\0\
-\0\0\0\0\0\0\0\0\0\0\0\0\x08\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x74\0\0\0\x01\0\0\0\
-\x06\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xb8\x01\0\0\0\0\0\0\x88\x02\0\0\0\0\0\0\0\0\
-\0\0\0\0\0\0\x08\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xb8\0\0\0\x01\0\0\0\x02\0\0\0\0\
-\0\0\0\0\0\0\0\0\0\0\0\x40\x04\0\0\0\0\0\0\x53\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\
-\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x45\x01\0\0\x01\0\0\0\x32\0\0\0\0\0\0\0\0\0\
-\0\0\0\0\0\0\x93\x04\0\0\0\0\0\0\x24\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x01\0\0\0\0\
-\0\0\0\x01\0\0\0\0\0\0\0\x90\0\0\0\x01\0\0\0\x03\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\
-\xb7\x04\0\0\0\0\0\0\x04\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x01\0\0\0\0\0\0\0\0\0\0\
-\0\0\0\0\0\xc4\0\0\0\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xbb\x04\0\0\0\0\
-\0\0\x50\x09\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x0b\
-\0\0\0\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x0b\x0e\0\0\0\0\0\0\x4c\x04\0\
-\0\0\0\0\0\0\0\0\0\0\0\0\0\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xb0\0\0\0\x02\0\0\
-\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x58\x12\0\0\0\0\0\0\x10\x02\0\0\0\0\0\0\x0f\
-\0\0\0\x13\0\0\0\x08\0\0\0\0\0\0\0\x18\0\0\0\0\0\0\0\x51\0\0\0\x09\0\0\0\0\0\0\
-\0\0\0\0\0\0\0\0\0\0\0\0\0\x68\x14\0\0\0\0\0\0\x60\0\0\0\0\0\0\0\x09\0\0\0\x02\
-\0\0\0\x08\0\0\0\0\0\0\0\x10\0\0\0\0\0\0\0\x70\0\0\0\x09\0\0\0\0\0\0\0\0\0\0\0\
-\0\0\0\0\0\0\0\0\xc8\x14\0\0\0\0\0\0\x60\0\0\0\0\0\0\0\x09\0\0\0\x03\0\0\0\x08\
-\0\0\0\0\0\0\0\x10\0\0\0\0\0\0\0\xc0\0\0\0\x09\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\
-\0\0\0\x28\x15\0\0\0\0\0\0\x50\0\0\0\0\0\0\0\x09\0\0\0\x07\0\0\0\x08\0\0\0\0\0\
-\0\0\x10\0\0\0\0\0\0\0\x07\0\0\0\x09\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x78\
-\x15\0\0\0\0\0\0\0\x04\0\0\0\0\0\0\x09\0\0\0\x08\0\0\0\x08\0\0\0\0\0\0\0\x10\0\
-\0\0\0\0\0\0\x82\0\0\0\x03\x4c\xff\x6f\0\0\0\x80\0\0\0\0\0\0\0\0\0\0\0\0\x78\
-\x19\0\0\0\0\0\0\x07\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x01\0\0\0\0\0\0\0\0\0\0\0\0\
-\0\0\0\xa8\0\0\0\x03\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x7f\x19\0\0\0\0\0\0\
-\x54\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0";
+\0\0\0\0\x01\0\0\0\x01\0\0\0\x06\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x40\0\0\0\0\0\0\
+\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x04\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x55\0\0\0\
+\x01\0\0\0\x06\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x40\0\0\0\0\0\0\0\x78\x01\0\0\0\0\
+\0\0\0\0\0\0\0\0\0\0\x08\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x74\0\0\0\x01\0\0\0\x06\
+\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xb8\x01\0\0\0\0\0\0\x20\x04\0\0\0\0\0\0\0\0\0\0\
+\0\0\0\0\x08\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xb8\0\0\0\x01\0\0\0\x02\0\0\0\0\0\0\
+\0\0\0\0\0\0\0\0\0\xd8\x05\0\0\0\0\0\0\x63\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x01\0\
+\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x9a\x01\0\0\x01\0\0\0\x32\0\0\0\0\0\0\0\0\0\0\0\0\
+\0\0\0\x3b\x06\0\0\0\0\0\0\x24\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x01\0\0\0\0\0\0\0\
+\x01\0\0\0\0\0\0\0\x90\0\0\0\x01\0\0\0\x03\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x5f\
+\x06\0\0\0\0\0\0\x04\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x01\0\0\0\0\0\0\0\0\0\0\0\0\
+\0\0\0\xc4\0\0\0\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x63\x06\0\0\0\0\0\0\
+\x4c\x0b\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x0b\0\0\
+\0\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xaf\x11\0\0\0\0\0\0\xec\x05\0\0\0\
+\0\0\0\0\0\0\0\0\0\0\0\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xb0\0\0\0\x02\0\0\0\0\
+\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xa0\x17\0\0\0\0\0\0\x88\x02\0\0\0\0\0\0\x0f\0\0\
+\0\x18\0\0\0\x08\0\0\0\0\0\0\0\x18\0\0\0\0\0\0\0\x51\0\0\0\x09\0\0\0\0\0\0\0\0\
+\0\0\0\0\0\0\0\0\0\0\0\x28\x1a\0\0\0\0\0\0\x60\0\0\0\0\0\0\0\x09\0\0\0\x02\0\0\
+\0\x08\0\0\0\0\0\0\0\x10\0\0\0\0\0\0\0\x70\0\0\0\x09\0\0\0\0\0\0\0\0\0\0\0\0\0\
+\0\0\0\0\0\0\x88\x1a\0\0\0\0\0\0\x90\0\0\0\0\0\0\0\x09\0\0\0\x03\0\0\0\x08\0\0\
+\0\0\0\0\0\x10\0\0\0\0\0\0\0\xc0\0\0\0\x09\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\
+\0\x18\x1b\0\0\0\0\0\0\x80\0\0\0\0\0\0\0\x09\0\0\0\x07\0\0\0\x08\0\0\0\0\0\0\0\
+\x10\0\0\0\0\0\0\0\x07\0\0\0\x09\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x98\x1b\
+\0\0\0\0\0\0\xa0\x05\0\0\0\0\0\0\x09\0\0\0\x08\0\0\0\x08\0\0\0\0\0\0\0\x10\0\0\
+\0\0\0\0\0\x82\0\0\0\x03\x4c\xff\x6f\0\0\0\x80\0\0\0\0\0\0\0\0\0\0\0\0\x38\x21\
+\0\0\0\0\0\0\x0a\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\
+\0\xa8\0\0\0\x03\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x42\x21\0\0\0\0\0\0\xa9\
+\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0";
 }
 
 #endif /* __ITERATORS_BPF_SKEL_H__ */
-- 
1.8.3.1


^ permalink raw reply related	[flat|nested] 11+ messages in thread

* Re: [PATCH 1/4] bpf: Add pin_name into struct bpf_prog_aux
  2022-02-11 12:11 ` [PATCH 1/4] bpf: Add pin_name into struct bpf_prog_aux Yafang Shao
@ 2022-02-11 12:43   ` Daniel Borkmann
  2022-02-11 12:44     ` Daniel Borkmann
  2022-02-13 11:27     ` Yafang Shao
  2022-02-11 17:58   ` kernel test robot
  1 sibling, 2 replies; 11+ messages in thread
From: Daniel Borkmann @ 2022-02-11 12:43 UTC (permalink / raw)
  To: Yafang Shao, ast, andrii, kafai, songliubraving, yhs,
	john.fastabend, kpsingh
  Cc: netdev, bpf

On 2/11/22 1:11 PM, Yafang Shao wrote:
> A new member pin_name is added into struct bpf_prog_aux, which will be
> set when the prog is set and cleared when the pinned file is removed.
> 
> Signed-off-by: Yafang Shao <laoar.shao@gmail.com>
> ---
>   include/linux/bpf.h      |  2 ++
>   include/uapi/linux/bpf.h |  1 +
>   kernel/bpf/inode.c       | 20 +++++++++++++++++++-
>   3 files changed, 22 insertions(+), 1 deletion(-)
> 
> diff --git a/include/linux/bpf.h b/include/linux/bpf.h
> index 0ceb25b..9cf8055 100644
> --- a/include/linux/bpf.h
> +++ b/include/linux/bpf.h
> @@ -933,6 +933,8 @@ struct bpf_prog_aux {
>   		struct work_struct work;
>   		struct rcu_head	rcu;
>   	};
> +
> +	char pin_name[BPF_PIN_NAME_LEN];
>   };

I'm afraid this is not possible. You are assuming a 1:1 relationship between prog
and pin location, but it's really a 1:n (prog can be pinned in multiple locations
and also across multiple mount instances). Also, you can create hard links of pins
which are not handled via bpf_obj_do_pin().

>   struct bpf_array_aux {
> diff --git a/include/uapi/linux/bpf.h b/include/uapi/linux/bpf.h
> index c14fed8..bada5cc 100644
> --- a/include/uapi/linux/bpf.h
> +++ b/include/uapi/linux/bpf.h
> @@ -1217,6 +1217,7 @@ struct bpf_stack_build_id {
>   };
>   
>   #define BPF_OBJ_NAME_LEN 16U
> +#define BPF_PIN_NAME_LEN 64U
>   
>   union bpf_attr {
>   	struct { /* anonymous struct used by BPF_MAP_CREATE command */
> diff --git a/kernel/bpf/inode.c b/kernel/bpf/inode.c
> index 4477ca8..f1a8811 100644
> --- a/kernel/bpf/inode.c
> +++ b/kernel/bpf/inode.c
> @@ -437,6 +437,8 @@ static int bpf_iter_link_pin_kernel(struct dentry *parent,
>   static int bpf_obj_do_pin(const char __user *pathname, void *raw,
>   			  enum bpf_type type)
>   {
> +	struct bpf_prog_aux *aux;
> +	struct bpf_prog *prog;
>   	struct dentry *dentry;
>   	struct inode *dir;
>   	struct path path;
> @@ -461,6 +463,10 @@ static int bpf_obj_do_pin(const char __user *pathname, void *raw,
>   
>   	switch (type) {
>   	case BPF_TYPE_PROG:
> +		prog = raw;
> +		aux = prog->aux;
> +		(void) strncpy_from_user(aux->pin_name, pathname, BPF_PIN_NAME_LEN);
> +		aux->pin_name[BPF_PIN_NAME_LEN - 1] = '\0';
>   		ret = vfs_mkobj(dentry, mode, bpf_mkprog, raw);
>   		break;
>   	case BPF_TYPE_MAP:
> @@ -611,12 +617,24 @@ static int bpf_show_options(struct seq_file *m, struct dentry *root)
>   
>   static void bpf_free_inode(struct inode *inode)
>   {
> +	struct bpf_prog_aux *aux;
> +	struct bpf_prog *prog;
>   	enum bpf_type type;
>   
>   	if (S_ISLNK(inode->i_mode))
>   		kfree(inode->i_link);
> -	if (!bpf_inode_type(inode, &type))
> +	if (!bpf_inode_type(inode, &type)) {
> +		switch (type) {
> +		case BPF_TYPE_PROG:
> +			prog = inode->i_private;
> +			aux = prog->aux;
> +			aux->pin_name[0] = '\0';
> +			break;
> +		default:
> +			break;
> +		}
>   		bpf_any_put(inode->i_private, type);
> +	}
>   	free_inode_nonrcu(inode);
>   }
>   
> 


^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [PATCH 1/4] bpf: Add pin_name into struct bpf_prog_aux
  2022-02-11 12:43   ` Daniel Borkmann
@ 2022-02-11 12:44     ` Daniel Borkmann
  2022-02-13 11:28       ` Yafang Shao
  2022-02-13 11:27     ` Yafang Shao
  1 sibling, 1 reply; 11+ messages in thread
From: Daniel Borkmann @ 2022-02-11 12:44 UTC (permalink / raw)
  To: Yafang Shao, ast, andrii, kafai, songliubraving, yhs,
	john.fastabend, kpsingh
  Cc: netdev, bpf

On 2/11/22 1:43 PM, Daniel Borkmann wrote:
> On 2/11/22 1:11 PM, Yafang Shao wrote:
>> A new member pin_name is added into struct bpf_prog_aux, which will be
>> set when the prog is set and cleared when the pinned file is removed.
>>
>> Signed-off-by: Yafang Shao <laoar.shao@gmail.com>
>> ---
>>   include/linux/bpf.h      |  2 ++
>>   include/uapi/linux/bpf.h |  1 +
>>   kernel/bpf/inode.c       | 20 +++++++++++++++++++-
>>   3 files changed, 22 insertions(+), 1 deletion(-)
>>
>> diff --git a/include/linux/bpf.h b/include/linux/bpf.h
>> index 0ceb25b..9cf8055 100644
>> --- a/include/linux/bpf.h
>> +++ b/include/linux/bpf.h
>> @@ -933,6 +933,8 @@ struct bpf_prog_aux {
>>           struct work_struct work;
>>           struct rcu_head    rcu;
>>       };
>> +
>> +    char pin_name[BPF_PIN_NAME_LEN];
>>   };
> 
> I'm afraid this is not possible. You are assuming a 1:1 relationship between prog
> and pin location, but it's really a 1:n (prog can be pinned in multiple locations
> and also across multiple mount instances). Also, you can create hard links of pins
> which are not handled via bpf_obj_do_pin().

(Same is also true for BPF maps wrt patch 2.)

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [PATCH 1/4] bpf: Add pin_name into struct bpf_prog_aux
  2022-02-11 12:11 ` [PATCH 1/4] bpf: Add pin_name into struct bpf_prog_aux Yafang Shao
  2022-02-11 12:43   ` Daniel Borkmann
@ 2022-02-11 17:58   ` kernel test robot
  2022-02-13 11:29     ` Yafang Shao
  1 sibling, 1 reply; 11+ messages in thread
From: kernel test robot @ 2022-02-11 17:58 UTC (permalink / raw)
  To: Yafang Shao, ast, daniel, andrii, kafai, songliubraving, yhs,
	john.fastabend, kpsingh
  Cc: kbuild-all, netdev, bpf, Yafang Shao

Hi Yafang,

Thank you for the patch! Perhaps something to improve:

[auto build test WARNING on bpf/master]
[also build test WARNING on net/master horms-ipvs/master net-next/master v5.17-rc3 next-20220211]
[cannot apply to bpf-next/master]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch]

url:    https://github.com/0day-ci/linux/commits/Yafang-Shao/bpf-Add-more-information-into-bpffs/20220211-201319
base:   https://git.kernel.org/pub/scm/linux/kernel/git/bpf/bpf.git master
config: arc-allyesconfig (https://download.01.org/0day-ci/archive/20220211/202202112213.WGiJCCYD-lkp@intel.com/config)
compiler: arceb-elf-gcc (GCC) 11.2.0
reproduce (this is a W=1 build):
        wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
        chmod +x ~/bin/make.cross
        # https://github.com/0day-ci/linux/commit/6cd35bc70f99caee380d84f5ba9256ac5fe03860
        git remote add linux-review https://github.com/0day-ci/linux
        git fetch --no-tags linux-review Yafang-Shao/bpf-Add-more-information-into-bpffs/20220211-201319
        git checkout 6cd35bc70f99caee380d84f5ba9256ac5fe03860
        # save the config file to linux build tree
        mkdir build_dir
        COMPILER_INSTALL_PATH=$HOME/0day COMPILER=gcc-11.2.0 make.cross O=build_dir ARCH=arc SHELL=/bin/bash kernel/bpf/

If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <lkp@intel.com>

All warnings (new ones prefixed by >>):

   kernel/bpf/inode.c: In function 'bpf_obj_do_pin':
>> kernel/bpf/inode.c:469:24: warning: ignoring return value of 'strncpy_from_user' declared with attribute 'warn_unused_result' [-Wunused-result]
     469 |                 (void) strncpy_from_user(aux->pin_name, pathname, BPF_PIN_NAME_LEN);
         |                        ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~


vim +469 kernel/bpf/inode.c

   437	
   438	static int bpf_obj_do_pin(const char __user *pathname, void *raw,
   439				  enum bpf_type type)
   440	{
   441		struct bpf_prog_aux *aux;
   442		struct bpf_prog *prog;
   443		struct dentry *dentry;
   444		struct inode *dir;
   445		struct path path;
   446		umode_t mode;
   447		int ret;
   448	
   449		dentry = user_path_create(AT_FDCWD, pathname, &path, 0);
   450		if (IS_ERR(dentry))
   451			return PTR_ERR(dentry);
   452	
   453		mode = S_IFREG | ((S_IRUSR | S_IWUSR) & ~current_umask());
   454	
   455		ret = security_path_mknod(&path, dentry, mode, 0);
   456		if (ret)
   457			goto out;
   458	
   459		dir = d_inode(path.dentry);
   460		if (dir->i_op != &bpf_dir_iops) {
   461			ret = -EPERM;
   462			goto out;
   463		}
   464	
   465		switch (type) {
   466		case BPF_TYPE_PROG:
   467			prog = raw;
   468			aux = prog->aux;
 > 469			(void) strncpy_from_user(aux->pin_name, pathname, BPF_PIN_NAME_LEN);
   470			aux->pin_name[BPF_PIN_NAME_LEN - 1] = '\0';
   471			ret = vfs_mkobj(dentry, mode, bpf_mkprog, raw);
   472			break;
   473		case BPF_TYPE_MAP:
   474			ret = vfs_mkobj(dentry, mode, bpf_mkmap, raw);
   475			break;
   476		case BPF_TYPE_LINK:
   477			ret = vfs_mkobj(dentry, mode, bpf_mklink, raw);
   478			break;
   479		default:
   480			ret = -EPERM;
   481		}
   482	out:
   483		done_path_create(&path, dentry);
   484		return ret;
   485	}
   486	

---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/kbuild-all@lists.01.org

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [PATCH 1/4] bpf: Add pin_name into struct bpf_prog_aux
  2022-02-11 12:43   ` Daniel Borkmann
  2022-02-11 12:44     ` Daniel Borkmann
@ 2022-02-13 11:27     ` Yafang Shao
  1 sibling, 0 replies; 11+ messages in thread
From: Yafang Shao @ 2022-02-13 11:27 UTC (permalink / raw)
  To: Daniel Borkmann
  Cc: Alexei Starovoitov, Andrii Nakryiko, Martin Lau, Song Liu,
	Yonghong Song, john fastabend, KP Singh, netdev, bpf

On Fri, Feb 11, 2022 at 8:43 PM Daniel Borkmann <daniel@iogearbox.net> wrote:
>
> On 2/11/22 1:11 PM, Yafang Shao wrote:
> > A new member pin_name is added into struct bpf_prog_aux, which will be
> > set when the prog is set and cleared when the pinned file is removed.
> >
> > Signed-off-by: Yafang Shao <laoar.shao@gmail.com>
> > ---
> >   include/linux/bpf.h      |  2 ++
> >   include/uapi/linux/bpf.h |  1 +
> >   kernel/bpf/inode.c       | 20 +++++++++++++++++++-
> >   3 files changed, 22 insertions(+), 1 deletion(-)
> >
> > diff --git a/include/linux/bpf.h b/include/linux/bpf.h
> > index 0ceb25b..9cf8055 100644
> > --- a/include/linux/bpf.h
> > +++ b/include/linux/bpf.h
> > @@ -933,6 +933,8 @@ struct bpf_prog_aux {
> >               struct work_struct work;
> >               struct rcu_head rcu;
> >       };
> > +
> > +     char pin_name[BPF_PIN_NAME_LEN];
> >   };
>
> I'm afraid this is not possible. You are assuming a 1:1 relationship between prog
> and pin location, but it's really a 1:n (prog can be pinned in multiple locations
> and also across multiple mount instances).

Thanks for the explanation!
I didn't notice the 1:n relationship before. I will read the code more
to try to find if there's a good way to implement it.

> Also, you can create hard links of pins
> which are not handled via bpf_obj_do_pin().
>

Yes, it seems we should introduce bpf_{link, unlink, rename} first
instead of the simple_* one.

> >   struct bpf_array_aux {
> > diff --git a/include/uapi/linux/bpf.h b/include/uapi/linux/bpf.h
> > index c14fed8..bada5cc 100644
> > --- a/include/uapi/linux/bpf.h
> > +++ b/include/uapi/linux/bpf.h
> > @@ -1217,6 +1217,7 @@ struct bpf_stack_build_id {
> >   };
> >
> >   #define BPF_OBJ_NAME_LEN 16U
> > +#define BPF_PIN_NAME_LEN 64U
> >
> >   union bpf_attr {
> >       struct { /* anonymous struct used by BPF_MAP_CREATE command */
> > diff --git a/kernel/bpf/inode.c b/kernel/bpf/inode.c
> > index 4477ca8..f1a8811 100644
> > --- a/kernel/bpf/inode.c
> > +++ b/kernel/bpf/inode.c
> > @@ -437,6 +437,8 @@ static int bpf_iter_link_pin_kernel(struct dentry *parent,
> >   static int bpf_obj_do_pin(const char __user *pathname, void *raw,
> >                         enum bpf_type type)
> >   {
> > +     struct bpf_prog_aux *aux;
> > +     struct bpf_prog *prog;
> >       struct dentry *dentry;
> >       struct inode *dir;
> >       struct path path;
> > @@ -461,6 +463,10 @@ static int bpf_obj_do_pin(const char __user *pathname, void *raw,
> >
> >       switch (type) {
> >       case BPF_TYPE_PROG:
> > +             prog = raw;
> > +             aux = prog->aux;
> > +             (void) strncpy_from_user(aux->pin_name, pathname, BPF_PIN_NAME_LEN);
> > +             aux->pin_name[BPF_PIN_NAME_LEN - 1] = '\0';
> >               ret = vfs_mkobj(dentry, mode, bpf_mkprog, raw);
> >               break;
> >       case BPF_TYPE_MAP:
> > @@ -611,12 +617,24 @@ static int bpf_show_options(struct seq_file *m, struct dentry *root)
> >
> >   static void bpf_free_inode(struct inode *inode)
> >   {
> > +     struct bpf_prog_aux *aux;
> > +     struct bpf_prog *prog;
> >       enum bpf_type type;
> >
> >       if (S_ISLNK(inode->i_mode))
> >               kfree(inode->i_link);
> > -     if (!bpf_inode_type(inode, &type))
> > +     if (!bpf_inode_type(inode, &type)) {
> > +             switch (type) {
> > +             case BPF_TYPE_PROG:
> > +                     prog = inode->i_private;
> > +                     aux = prog->aux;
> > +                     aux->pin_name[0] = '\0';
> > +                     break;
> > +             default:
> > +                     break;
> > +             }
> >               bpf_any_put(inode->i_private, type);
> > +     }
> >       free_inode_nonrcu(inode);
> >   }
> >
> >
>


-- 
Thanks
Yafang

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [PATCH 1/4] bpf: Add pin_name into struct bpf_prog_aux
  2022-02-11 12:44     ` Daniel Borkmann
@ 2022-02-13 11:28       ` Yafang Shao
  0 siblings, 0 replies; 11+ messages in thread
From: Yafang Shao @ 2022-02-13 11:28 UTC (permalink / raw)
  To: Daniel Borkmann
  Cc: Alexei Starovoitov, Andrii Nakryiko, Martin Lau, Song Liu,
	Yonghong Song, john fastabend, KP Singh, netdev, bpf

On Fri, Feb 11, 2022 at 8:44 PM Daniel Borkmann <daniel@iogearbox.net> wrote:
>
> On 2/11/22 1:43 PM, Daniel Borkmann wrote:
> > On 2/11/22 1:11 PM, Yafang Shao wrote:
> >> A new member pin_name is added into struct bpf_prog_aux, which will be
> >> set when the prog is set and cleared when the pinned file is removed.
> >>
> >> Signed-off-by: Yafang Shao <laoar.shao@gmail.com>
> >> ---
> >>   include/linux/bpf.h      |  2 ++
> >>   include/uapi/linux/bpf.h |  1 +
> >>   kernel/bpf/inode.c       | 20 +++++++++++++++++++-
> >>   3 files changed, 22 insertions(+), 1 deletion(-)
> >>
> >> diff --git a/include/linux/bpf.h b/include/linux/bpf.h
> >> index 0ceb25b..9cf8055 100644
> >> --- a/include/linux/bpf.h
> >> +++ b/include/linux/bpf.h
> >> @@ -933,6 +933,8 @@ struct bpf_prog_aux {
> >>           struct work_struct work;
> >>           struct rcu_head    rcu;
> >>       };
> >> +
> >> +    char pin_name[BPF_PIN_NAME_LEN];
> >>   };
> >
> > I'm afraid this is not possible. You are assuming a 1:1 relationship between prog
> > and pin location, but it's really a 1:n (prog can be pinned in multiple locations
> > and also across multiple mount instances). Also, you can create hard links of pins
> > which are not handled via bpf_obj_do_pin().
>
> (Same is also true for BPF maps wrt patch 2.)

Thanks again for the reminder.

-- 
Thanks
Yafang

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [PATCH 1/4] bpf: Add pin_name into struct bpf_prog_aux
  2022-02-11 17:58   ` kernel test robot
@ 2022-02-13 11:29     ` Yafang Shao
  0 siblings, 0 replies; 11+ messages in thread
From: Yafang Shao @ 2022-02-13 11:29 UTC (permalink / raw)
  To: kernel test robot
  Cc: Alexei Starovoitov, Daniel Borkmann, Andrii Nakryiko, Martin Lau,
	Song Liu, Yonghong Song, john fastabend, KP Singh, kbuild-all,
	netdev, bpf

On Sat, Feb 12, 2022 at 1:59 AM kernel test robot <lkp@intel.com> wrote:
>
> Hi Yafang,
>
> Thank you for the patch! Perhaps something to improve:
>
> [auto build test WARNING on bpf/master]
> [also build test WARNING on net/master horms-ipvs/master net-next/master v5.17-rc3 next-20220211]
> [cannot apply to bpf-next/master]
> [If your patch is applied to the wrong git tree, kindly drop us a note.
> And when submitting patch, we suggest to use '--base' as documented in
> https://git-scm.com/docs/git-format-patch]
>
> url:    https://github.com/0day-ci/linux/commits/Yafang-Shao/bpf-Add-more-information-into-bpffs/20220211-201319
> base:   https://git.kernel.org/pub/scm/linux/kernel/git/bpf/bpf.git master
> config: arc-allyesconfig (https://download.01.org/0day-ci/archive/20220211/202202112213.WGiJCCYD-lkp@intel.com/config)
> compiler: arceb-elf-gcc (GCC) 11.2.0
> reproduce (this is a W=1 build):
>         wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
>         chmod +x ~/bin/make.cross
>         # https://github.com/0day-ci/linux/commit/6cd35bc70f99caee380d84f5ba9256ac5fe03860
>         git remote add linux-review https://github.com/0day-ci/linux
>         git fetch --no-tags linux-review Yafang-Shao/bpf-Add-more-information-into-bpffs/20220211-201319
>         git checkout 6cd35bc70f99caee380d84f5ba9256ac5fe03860
>         # save the config file to linux build tree
>         mkdir build_dir
>         COMPILER_INSTALL_PATH=$HOME/0day COMPILER=gcc-11.2.0 make.cross O=build_dir ARCH=arc SHELL=/bin/bash kernel/bpf/
>
> If you fix the issue, kindly add following tag as appropriate
> Reported-by: kernel test robot <lkp@intel.com>
>
> All warnings (new ones prefixed by >>):
>
>    kernel/bpf/inode.c: In function 'bpf_obj_do_pin':
> >> kernel/bpf/inode.c:469:24: warning: ignoring return value of 'strncpy_from_user' declared with attribute 'warn_unused_result' [-Wunused-result]
>      469 |                 (void) strncpy_from_user(aux->pin_name, pathname, BPF_PIN_NAME_LEN);
>          |                        ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
>

Thanks for the report.
I will improve it to avoid this warning.

>
> vim +469 kernel/bpf/inode.c
>
>    437
>    438  static int bpf_obj_do_pin(const char __user *pathname, void *raw,
>    439                            enum bpf_type type)
>    440  {
>    441          struct bpf_prog_aux *aux;
>    442          struct bpf_prog *prog;
>    443          struct dentry *dentry;
>    444          struct inode *dir;
>    445          struct path path;
>    446          umode_t mode;
>    447          int ret;
>    448
>    449          dentry = user_path_create(AT_FDCWD, pathname, &path, 0);
>    450          if (IS_ERR(dentry))
>    451                  return PTR_ERR(dentry);
>    452
>    453          mode = S_IFREG | ((S_IRUSR | S_IWUSR) & ~current_umask());
>    454
>    455          ret = security_path_mknod(&path, dentry, mode, 0);
>    456          if (ret)
>    457                  goto out;
>    458
>    459          dir = d_inode(path.dentry);
>    460          if (dir->i_op != &bpf_dir_iops) {
>    461                  ret = -EPERM;
>    462                  goto out;
>    463          }
>    464
>    465          switch (type) {
>    466          case BPF_TYPE_PROG:
>    467                  prog = raw;
>    468                  aux = prog->aux;
>  > 469                  (void) strncpy_from_user(aux->pin_name, pathname, BPF_PIN_NAME_LEN);
>    470                  aux->pin_name[BPF_PIN_NAME_LEN - 1] = '\0';
>    471                  ret = vfs_mkobj(dentry, mode, bpf_mkprog, raw);
>    472                  break;
>    473          case BPF_TYPE_MAP:
>    474                  ret = vfs_mkobj(dentry, mode, bpf_mkmap, raw);
>    475                  break;
>    476          case BPF_TYPE_LINK:
>    477                  ret = vfs_mkobj(dentry, mode, bpf_mklink, raw);
>    478                  break;
>    479          default:
>    480                  ret = -EPERM;
>    481          }
>    482  out:
>    483          done_path_create(&path, dentry);
>    484          return ret;
>    485  }
>    486
>
> ---
> 0-DAY CI Kernel Test Service, Intel Corporation
> https://lists.01.org/hyperkitty/list/kbuild-all@lists.01.org



-- 
Thanks
Yafang

^ permalink raw reply	[flat|nested] 11+ messages in thread

end of thread, other threads:[~2022-02-13 11:30 UTC | newest]

Thread overview: 11+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-02-11 12:11 [PATCH 0/4] bpf: Add more information into bpffs Yafang Shao
2022-02-11 12:11 ` [PATCH 1/4] bpf: Add pin_name into struct bpf_prog_aux Yafang Shao
2022-02-11 12:43   ` Daniel Borkmann
2022-02-11 12:44     ` Daniel Borkmann
2022-02-13 11:28       ` Yafang Shao
2022-02-13 11:27     ` Yafang Shao
2022-02-11 17:58   ` kernel test robot
2022-02-13 11:29     ` Yafang Shao
2022-02-11 12:11 ` [PATCH 2/4] bpf: Add pin_name into struct bpf_map Yafang Shao
2022-02-11 12:11 ` [PATCH 3/4] bpf: Show pinned file name in {progs, maps}.debug Yafang Shao
2022-02-11 12:11 ` [PATCH 4/4] bpf: Show the used maps of each prog in progs.debug Yafang Shao

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).