diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..375f1be
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1 @@
+SOURCES/procps-ng-3.3.10.tar.xz
diff --git a/.procps-ng.metadata b/.procps-ng.metadata
new file mode 100644
index 0000000..ea35251
--- /dev/null
+++ b/.procps-ng.metadata
@@ -0,0 +1 @@
+484db198d6a18a42b4011d5ecb2cb784a81b0e4f SOURCES/procps-ng-3.3.10.tar.xz
diff --git a/SOURCES/procps-ng-3.3.10-CVE-2018-1122.patch b/SOURCES/procps-ng-3.3.10-CVE-2018-1122.patch
new file mode 100644
index 0000000..8c19d9c
--- /dev/null
+++ b/SOURCES/procps-ng-3.3.10-CVE-2018-1122.patch
@@ -0,0 +1,44 @@
+diff -up ./top/top.c.ori ./top/top.c
+--- ./top/top.c.ori	2019-02-27 17:23:48.060408215 +0100
++++ ./top/top.c	2019-02-28 15:28:11.321927877 +0100
+@@ -3437,6 +3437,20 @@ static int config_cvt (WIN_t *q) {
+ } // end: config_cvt
+ 
+ 
++static int snprintf_Rc_name (const char *const format, ...) __attribute__((format(printf,1,2)));
++static int snprintf_Rc_name (const char *const format, ...) {
++   int len;
++   va_list ap;
++   va_start(ap, format);
++   len = vsnprintf(Rc_name, sizeof(Rc_name), format, ap);
++   va_end(ap);
++   if (len <= 0 || (size_t)len >= sizeof(Rc_name)) {
++      Rc_name[0] = '\0';
++      return 0;
++   }
++   return len;
++}
++
+         /*
+          * Build the local RC file name then try to read both of 'em.
+          * 'SYS_RCFILESPEC' contains two lines consisting of the secure
+@@ -3458,8 +3472,18 @@ static void configs_read (void) {
+    FILE *fp;
+    int i;
+ 
++   Rc_name[0] = '\0'; // "fopen() shall fail if pathname is an empty string."
+    p = getenv("HOME");
+-   snprintf(Rc_name, sizeof(Rc_name), "%s/.%src", (p && *p) ? p : ".", Myname);
++
++   if (!p || p[0] != '/') {
++      const struct passwd *const pwd = getpwuid(getuid());
++      if (!pwd || !(p = pwd->pw_dir) || p[0] != '/') {
++         p = NULL;
++      }
++   }
++   if (p) {
++      snprintf_Rc_name("%s/.%src", p, Myname);
++   }
+ 
+    fp = fopen(SYS_RCFILESPEC, "r");
+    if (fp) {
diff --git a/SOURCES/procps-ng-3.3.10-CVE-2018-1124.patch b/SOURCES/procps-ng-3.3.10-CVE-2018-1124.patch
new file mode 100644
index 0000000..ecb4476
--- /dev/null
+++ b/SOURCES/procps-ng-3.3.10-CVE-2018-1124.patch
@@ -0,0 +1,337 @@
+From 9d2ec74b76d220f5343e548fcb7058d723293a22 Mon Sep 17 00:00:00 2001
+From: Qualys Security Advisory <qsa@qualys.com>
+Date: Thu, 1 Jan 1970 00:00:00 +0000
+Subject: [PATCH 1/3] proc/alloc.*: Use size_t, not unsigned int.
+
+Otherwise this can truncate sizes on 64-bit platforms, and is one of the
+reasons the integer overflows in file2strvec() are exploitable at all.
+Also: catch potential integer overflow in xstrdup() (should never
+happen, but better safe than sorry), and use memcpy() instead of
+strcpy() (faster).
+
+Warnings:
+
+- in glibc, realloc(ptr, 0) is equivalent to free(ptr), but not here,
+  because of the ++size;
+
+- here, xstrdup() can return NULL (if str is NULL), which goes against
+  the idea of the xalloc wrappers.
+
+We were tempted to call exit() or xerrx() in those cases, but decided
+against it, because it might break things in unexpected places; TODO?
+---
+ proc/alloc.c | 20 ++++++++++++--------
+ proc/alloc.h |  4 ++--
+ 2 files changed, 14 insertions(+), 10 deletions(-)
+
+diff --git a/proc/alloc.c b/proc/alloc.c
+index 94af47f..1768d73 100644
+--- a/proc/alloc.c
++++ b/proc/alloc.c
+@@ -37,14 +37,14 @@ static void xdefault_error(const char *restrict fmts, ...) {
+ message_fn xalloc_err_handler = xdefault_error;
+ 
+ 
+-void *xcalloc(unsigned int size) {
++void *xcalloc(size_t size) {
+     void * p;
+ 
+     if (size == 0)
+         ++size;
+     p = calloc(1, size);
+     if (!p) {
+-        xalloc_err_handler("%s failed to allocate %u bytes of memory", __func__, size);
++        xalloc_err_handler("%s failed to allocate %zu bytes of memory", __func__, size);
+         exit(EXIT_FAILURE);
+     }
+     return p;
+@@ -57,20 +57,20 @@ void *xmalloc(size_t size) {
+         ++size;
+     p = malloc(size);
+     if (!p) {
+-	xalloc_err_handler("%s failed to allocate %zu bytes of memory", __func__, size);
++        xalloc_err_handler("%s failed to allocate %zu bytes of memory", __func__, size);
+         exit(EXIT_FAILURE);
+     }
+     return(p);
+ }
+ 
+-void *xrealloc(void *oldp, unsigned int size) {
++void *xrealloc(void *oldp, size_t size) {
+     void *p;
+ 
+     if (size == 0)
+         ++size;
+     p = realloc(oldp, size);
+     if (!p) {
+-        xalloc_err_handler("%s failed to allocate %u bytes of memory", __func__, size);
++        xalloc_err_handler("%s failed to allocate %zu bytes of memory", __func__, size);
+         exit(EXIT_FAILURE);
+     }
+     return(p);
+@@ -80,13 +80,17 @@ char *xstrdup(const char *str) {
+     char *p = NULL;
+ 
+     if (str) {
+-        unsigned int size = strlen(str) + 1;
++        size_t size = strlen(str) + 1;
++        if (size < 1) {
++            xalloc_err_handler("%s refused to allocate %zu bytes of memory", __func__, size);
++            exit(EXIT_FAILURE);
++        }
+         p = malloc(size);
+         if (!p) {
+-            xalloc_err_handler("%s failed to allocate %u bytes of memory", __func__, size);
++            xalloc_err_handler("%s failed to allocate %zu bytes of memory", __func__, size);
+             exit(EXIT_FAILURE);
+         }
+-        strcpy(p, str);
++        memcpy(p, str, size);
+     }
+     return(p);
+ }
+diff --git a/proc/alloc.h b/proc/alloc.h
+index 19c91d7..6787a72 100644
+--- a/proc/alloc.h
++++ b/proc/alloc.h
+@@ -8,9 +8,9 @@ EXTERN_C_BEGIN
+  /* change xalloc_err_handler to override the default fprintf(stderr... */
+ extern message_fn xalloc_err_handler;
+ 
+-extern void *xcalloc(unsigned int size) MALLOC;
++extern void *xcalloc(size_t size) MALLOC;
+ extern void *xmalloc(size_t size) MALLOC;
+-extern void *xrealloc(void *oldp, unsigned int size) MALLOC;
++extern void *xrealloc(void *oldp, size_t size) MALLOC;
+ extern char *xstrdup(const char *str) MALLOC;
+ 
+ EXTERN_C_END
+-- 
+2.14.3
+
+
+From de660b14b80188d9b323c4999d1b91a9456ed687 Mon Sep 17 00:00:00 2001
+From: Qualys Security Advisory <qsa@qualys.com>
+Date: Thu, 1 Jan 1970 00:00:00 +0000
+Subject: [PATCH 2/3] proc/readproc.c: Harden file2str().
+
+1/ Replace sprintf() with snprintf() (and check for truncation).
+
+2/ Prevent an integer overflow of ub->siz. The "tot_read--" is needed to
+avoid an off-by-one overflow in "ub->buf[tot_read] = '\0'". It is safe
+to decrement tot_read here, because we know that tot_read is equal to
+ub->siz (and ub->siz is very large).
+
+We believe that truncation is a better option than failure (implementing
+failure instead should be as easy as replacing the "tot_read--" with
+"tot_read = 0").
+---
+ proc/readproc.c | 10 ++++++++--
+ 1 file changed, 8 insertions(+), 2 deletions(-)
+
+diff --git a/proc/readproc.c b/proc/readproc.c
+index 9e3afc9..39235c7 100644
+--- a/proc/readproc.c
++++ b/proc/readproc.c
+@@ -35,6 +35,7 @@
+ #include <signal.h>
+ #include <fcntl.h>
+ #include <dirent.h>
++#include <limits.h>
+ #include <sys/types.h>
+ #include <sys/stat.h>
+ #ifdef WITH_SYSTEMD
+@@ -622,7 +623,7 @@ static void statm2proc(const char* s, proc_t *restrict P) {
+ static int file2str(const char *directory, const char *what, struct utlbuf_s *ub) {
+  #define buffGRW 1024
+     char path[PROCPATHLEN];
+-    int fd, num, tot_read = 0;
++    int fd, num, tot_read = 0, len;
+ 
+     /* on first use we preallocate a buffer of minimum size to emulate
+        former 'local static' behavior -- even if this read fails, that
+@@ -630,11 +631,16 @@ static int file2str(const char *directory, const char *what, struct utlbuf_s *ub
+        ( besides, with this xcalloc we will never need to use memcpy ) */
+     if (ub->buf) ub->buf[0] = '\0';
+     else ub->buf = xcalloc((ub->siz = buffGRW));
+-    sprintf(path, "%s/%s", directory, what);
++    len = snprintf(path, sizeof path, "%s/%s", directory, what);
++    if (len <= 0 || (size_t)len >= sizeof path) return -1;
+     if (-1 == (fd = open(path, O_RDONLY, 0))) return -1;
+     while (0 < (num = read(fd, ub->buf + tot_read, ub->siz - tot_read))) {
+         tot_read += num;
+         if (tot_read < ub->siz) break;
++        if (ub->siz >= INT_MAX - buffGRW) {
++            tot_read--;
++            break;
++        }
+         ub->buf = xrealloc(ub->buf, (ub->siz += buffGRW));
+     };
+     ub->buf[tot_read] = '\0';
+-- 
+2.14.3
+
+
+From 44a4b658f45bc3fbd7170662a52038a7b35c83de Mon Sep 17 00:00:00 2001
+From: Qualys Security Advisory <qsa@qualys.com>
+Date: Thu, 1 Jan 1970 00:00:00 +0000
+Subject: [PATCH 3/3] proc/readproc.c: Fix bugs and overflows in file2strvec().
+
+Note: this is by far the most important and complex patch of the whole
+series, please review it carefully; thank you very much!
+
+For this patch, we decided to keep the original function's design and
+skeleton, to avoid regressions and behavior changes, while fixing the
+various bugs and overflows. And like the "Harden file2str()" patch, this
+patch does not fail when about to overflow, but truncates instead: there
+is information available about this process, so return it to the caller;
+also, we used INT_MAX as a limit, but a lower limit could be used.
+
+The easy changes:
+
+- Replace sprintf() with snprintf() (and check for truncation).
+
+- Replace "if (n == 0 && rbuf == 0)" with "if (n <= 0 && tot <= 0)" and
+  do break instead of return: it simplifies the code (only one place to
+  handle errors), and also guarantees that in the while loop either n or
+  tot is > 0 (or both), even if n is reset to 0 when about to overflow.
+
+- Remove the "if (n < 0)" block in the while loop: it is (and was) dead
+  code, since we enter the while loop only if n >= 0.
+
+- Rewrite the missing-null-terminator detection: in the original
+  function, if the size of the file is a multiple of 2047, a null-
+  terminator is appended even if the file is already null-terminated.
+
+- Replace "if (n <= 0 && !end_of_file)" with "if (n < 0 || tot <= 0)":
+  originally, it was equivalent to "if (n < 0)", but we added "tot <= 0"
+  to handle the first break of the while loop, and to guarantee that in
+  the rest of the function tot is > 0.
+
+- Double-force ("belt and suspenders") the null-termination of rbuf:
+  this is (and was) essential to the correctness of the function.
+
+- Replace the final "while" loop with a "for" loop that behaves just
+  like the preceding "for" loop: in the original function, this would
+  lead to unexpected results (for example, if rbuf is |\0|A|\0|, this
+  would return the array {"",NULL} but should return {"","A",NULL}; and
+  if rbuf is |A|\0|B| (should never happen because rbuf should be null-
+  terminated), this would make room for two pointers in ret, but would
+  write three pointers to ret).
+
+The hard changes:
+
+- Prevent the integer overflow of tot in the while loop, but unlike
+  file2str(), file2strvec() cannot let tot grow until it almost reaches
+  INT_MAX, because it needs more space for the pointers: this is why we
+  introduced ARG_LEN, which also guarantees that we can add "align" and
+  a few sizeof(char*)s to tot without overflowing.
+
+- Prevent the integer overflow of "tot + c + align": when INT_MAX is
+  (almost) reached, we write the maximal safe amount of pointers to ret
+  (ARG_LEN guarantees that there is always space for *ret = rbuf and the
+  NULL terminator).
+---
+ proc/readproc.c | 53 ++++++++++++++++++++++++++++++++---------------------
+ 1 file changed, 32 insertions(+), 21 deletions(-)
+
+diff --git a/proc/readproc.c b/proc/readproc.c
+index 39235c7..94ca4e9 100644
+--- a/proc/readproc.c
++++ b/proc/readproc.c
+@@ -652,11 +652,12 @@ static int file2str(const char *directory, const char *what, struct utlbuf_s *ub
+ 
+ static char** file2strvec(const char* directory, const char* what) {
+     char buf[2048];	/* read buf bytes at a time */
+-    char *p, *rbuf = 0, *endbuf, **q, **ret;
++    char *p, *rbuf = 0, *endbuf, **q, **ret, *strp;
+     int fd, tot = 0, n, c, end_of_file = 0;
+     int align;
+ 
+-    sprintf(buf, "%s/%s", directory, what);
++    const int len = snprintf(buf, sizeof buf, "%s/%s", directory, what);
++    if(len <= 0 || (size_t)len >= sizeof buf) return NULL;
+     fd = open(buf, O_RDONLY, 0);
+     if(fd==-1) return NULL;
+ 
+@@ -664,18 +665,23 @@ static char** file2strvec(const char* directory, const char* what) {
+     while ((n = read(fd, buf, sizeof buf - 1)) >= 0) {
+ 	if (n < (int)(sizeof buf - 1))
+ 	    end_of_file = 1;
+-	if (n == 0 && rbuf == 0) {
+-	    close(fd);
+-	    return NULL;	/* process died between our open and read */
++	if (n <= 0 && tot <= 0) { /* nothing read now, nothing read before */
++	    break;		/* process died between our open and read */
+ 	}
+-	if (n < 0) {
+-	    if (rbuf)
+-		free(rbuf);
+-	    close(fd);
+-	    return NULL;	/* read error */
++	/* ARG_LEN is our guesstimated median length of a command-line argument
++	   or environment variable (the minimum is 1, the maximum is 131072) */
++	#define ARG_LEN 64
++	if (tot >= INT_MAX / (ARG_LEN + (int)sizeof(char*)) * ARG_LEN - n) {
++	    end_of_file = 1; /* integer overflow: null-terminate and break */
++	    n = 0; /* but tot > 0 */
+ 	}
+-	if (end_of_file && (n == 0 || buf[n-1]))/* last read char not null */
++	#undef ARG_LEN
++	if (end_of_file &&
++	    ((n > 0 && buf[n-1] != '\0') ||	/* last read char not null */
++	     (n <= 0 && rbuf[tot-1] != '\0')))	/* last read char not null */
+ 	    buf[n++] = '\0';			/* so append null-terminator */
++
++	if (n <= 0) break; /* unneeded (end_of_file = 1) but avoid realloc */
+ 	rbuf = xrealloc(rbuf, tot + n);		/* allocate more memory */
+ 	memcpy(rbuf + tot, buf, n);		/* copy buffer into it */
+ 	tot += n;				/* increment total byte ctr */
+@@ -683,29 +689,34 @@ static char** file2strvec(const char* directory, const char* what) {
+ 	    break;
+     }
+     close(fd);
+-    if (n <= 0 && !end_of_file) {
++    if (n < 0 || tot <= 0) {	/* error, or nothing read */
+ 	if (rbuf) free(rbuf);
+ 	return NULL;		/* read error */
+     }
++    rbuf[tot-1] = '\0'; /* belt and suspenders (the while loop did it, too) */
+     endbuf = rbuf + tot;			/* count space for pointers */
+     align = (sizeof(char*)-1) - ((tot + sizeof(char*)-1) & (sizeof(char*)-1));
+-    for (c = 0, p = rbuf; p < endbuf; p++) {
+-	if (!*p || *p == '\n')
++    c = sizeof(char*);				/* one extra for NULL term */
++    for (p = rbuf; p < endbuf; p++) {
++	if (!*p || *p == '\n') {
++	    if (c >= INT_MAX - (tot + (int)sizeof(char*) + align)) break;
+ 	    c += sizeof(char*);
++	}
+ 	if (*p == '\n')
+ 	    *p = 0;
+     }
+-    c += sizeof(char*);				/* one extra for NULL term */
+ 
+     rbuf = xrealloc(rbuf, tot + c + align);	/* make room for ptrs AT END */
+     endbuf = rbuf + tot;			/* addr just past data buf */
+     q = ret = (char**) (endbuf+align);		/* ==> free(*ret) to dealloc */
+-    *q++ = p = rbuf;				/* point ptrs to the strings */
+-    endbuf--;					/* do not traverse final NUL */
+-    while (++p < endbuf)
+-    	if (!*p)				/* NUL char implies that */
+-	    *q++ = p+1;				/* next string -> next char */
+-
++    for (strp = p = rbuf; p < endbuf; p++) {
++	if (!*p) {				/* NUL char implies that */
++	    if (c < 2 * (int)sizeof(char*)) break;
++	    c -= sizeof(char*);
++	    *q++ = strp;			/* point ptrs to the strings */
++	    strp = p+1;				/* next string -> next char */
++	}
++    }
+     *q = 0;					/* null ptr list terminator */
+     return ret;
+ }
+-- 
+2.14.3
+
diff --git a/SOURCES/procps-ng-3.3.10-find_elf_note-memory-error-fix.patch b/SOURCES/procps-ng-3.3.10-find_elf_note-memory-error-fix.patch
new file mode 100644
index 0000000..47b52d9
--- /dev/null
+++ b/SOURCES/procps-ng-3.3.10-find_elf_note-memory-error-fix.patch
@@ -0,0 +1,89 @@
+diff --git a/proc/sysinfo.c b/proc/sysinfo.c
+index 1435de1..1d2b8e2 100644
+--- a/proc/sysinfo.c
++++ b/proc/sysinfo.c
+@@ -36,6 +36,9 @@
+ #include <netinet/in.h>  /* htons */
+ #endif
+ 
++#include <link.h>
++#include <elf.h>
++
+ long smp_num_cpus;     /* number of CPUs */
+ long page_bytes;       /* this architecture's page size */
+ 
+@@ -249,15 +252,67 @@ static void old_Hertz_hack(void){
+ 
+ extern char** environ;
+ 
+-/* for ELF executables, notes are pushed before environment and args */
+-static unsigned long find_elf_note(unsigned long findme){
++static unsigned long find_elf_note(unsigned long type)
++{
++  ElfW(auxv_t) auxv_struct;
++  ElfW(auxv_t) *auxv_temp;
++  FILE *fd;
++  int i;
++  static ElfW(auxv_t) *auxv = NULL;
+   unsigned long *ep = (unsigned long *)environ;
+-  while(*ep++);
+-  while(*ep){
+-    if(ep[0]==findme) return ep[1];
+-    ep+=2;
++  unsigned long ret_val = NOTE_NOT_FOUND;
++
++
++  if(!auxv) {
++
++    fd = fopen("/proc/self/auxv", "rb");
++
++    if(!fd) {  // can't open auxv? that could be caused by euid change
++               // ... and we need to fall back to the old and unsafe
++               // ... method that doesn't work when calling library
++               // ... functions with dlopen -> FIXME :(
++
++      while(*ep++);  // for ELF executables, notes are pushed
++      while(*ep){    // ... before environment and args
++        if(ep[0]==type) return ep[1];
++        ep+=2;
++      }
++      return NOTE_NOT_FOUND;
++    }
++
++    auxv = (ElfW(auxv_t) *) malloc(getpagesize());
++    if (!auxv) {
++      perror("malloc");
++      exit(EXIT_FAILURE);
++    }
++
++    i = 0;
++    do {
++      fread(&auxv_struct, sizeof(ElfW(auxv_t)), 1, fd);
++      auxv[i] = auxv_struct;
++      i++;
++    } while (auxv_struct.a_type != AT_NULL);
++
++    fclose(fd);
++
++  }
++
++  auxv_temp = auxv;
++  i = 0;
++  do {
++    if(auxv_temp[i].a_type == type) {
++      ret_val = (unsigned long)auxv_temp[i].a_un.a_val;
++      break;
++    }
++    i++;
++  } while (auxv_temp[i].a_type != AT_NULL);
++
++  if (auxv){
++	  auxv_temp = NULL;
++	  free(auxv);
++	  auxv = NULL;
+   }
+-  return NOTE_NOT_FOUND;
++  return ret_val;
+ }
+ 
+ int have_privs;
diff --git a/SOURCES/procps-ng-3.3.10-free-counts-unreclaim-slabs-in-avail-mem.patch b/SOURCES/procps-ng-3.3.10-free-counts-unreclaim-slabs-in-avail-mem.patch
new file mode 100644
index 0000000..a943478
--- /dev/null
+++ b/SOURCES/procps-ng-3.3.10-free-counts-unreclaim-slabs-in-avail-mem.patch
@@ -0,0 +1,24 @@
+diff -up ./free.1.ori ./free.1
+--- ./free.1.ori	2019-04-12 13:28:22.255295567 +0200
++++ ./free.1	2019-04-12 13:29:00.666768897 +0200
+@@ -32,7 +32,7 @@ kernels 2.6.32, displayed as zero if not
+ Memory used by kernel buffers (Buffers in /proc/meminfo)
+ .TP
+ \fBcache\fR
+-Memory used by the page cache and slabs (Cached and Slab in /proc/meminfo)
++Memory used by the page cache and slabs (Cached and SReclaimable in /proc/meminfo)
+ .TP
+ \fBbuff/cache\fR
+ Sum of \fBbuffers\fR and \fBcache\fR
+diff -up ./proc/sysinfo.c.ori ./proc/sysinfo.c
+--- ./proc/sysinfo.c.ori	2019-04-12 13:28:22.241295394 +0200
++++ ./proc/sysinfo.c	2019-04-12 13:29:00.668768921 +0200
+@@ -758,7 +758,7 @@ nextline:
+   if(kb_inactive==~0UL){
+     kb_inactive = kb_inact_dirty + kb_inact_clean + kb_inact_laundry;
+   }
+-  kb_main_cached = kb_page_cache + kb_slab;
++  kb_main_cached = kb_page_cache + kb_slab_reclaimable;
+   kb_swap_used = kb_swap_total - kb_swap_free;
+   kb_main_used = kb_main_total - kb_main_free - kb_main_cached - kb_main_buffers;
+ 
diff --git a/SOURCES/procps-ng-3.3.10-free-mem-petabytes-segfault.patch b/SOURCES/procps-ng-3.3.10-free-mem-petabytes-segfault.patch
new file mode 100644
index 0000000..bae7933
--- /dev/null
+++ b/SOURCES/procps-ng-3.3.10-free-mem-petabytes-segfault.patch
@@ -0,0 +1,97 @@
+diff -up ./free.1.orig ./free.1
+--- ./free.1.orig	2018-01-16 16:11:35.609874589 +0100
++++ ./free.1	2018-01-17 14:33:04.625716399 +0100
+@@ -62,6 +62,9 @@ Display the amount of memory in gigabyte
+ \fB\-\-tera\fR
+ Display the amount of memory in terabytes.
+ .TP
++\fB\-\-peta\fR
++Display the amount of memory in petabytes.
++.TP
+ \fB\-h\fR, \fB\-\-human\fP
+ Show all output fields automatically scaled to shortest three digit unit and
+ display the units of print out.  Following units are used.
+@@ -72,9 +75,10 @@ display the units of print out.  Followi
+   M = megas
+   G = gigas
+   T = teras
++  P = petas
+ .fi
+ .sp
+-If unit is missing, and you have petabyte of RAM or swap, the number is in
++If unit is missing, and you have exabyte of RAM or swap, the number is in
+ terabytes and columns might not be aligned with header.
+ .TP
+ \fB\-w\fR, \fB\-\-wide\fR
+diff -up ./free.c.orig ./free.c
+--- ./free.c.orig	2018-01-16 16:10:27.058158964 +0100
++++ ./free.c	2018-01-17 14:58:06.723658091 +0100
+@@ -78,6 +78,7 @@ static void __attribute__ ((__noreturn__
+ 	fputs(_(" -m, --mega          show output in megabytes\n"), out);
+ 	fputs(_(" -g, --giga          show output in gigabytes\n"), out);
+ 	fputs(_("     --tera          show output in terabytes\n"), out);
++	fputs(_("     --peta          show output in petabytes\n"), out);
+ 	fputs(_(" -h, --human         show human-readable output\n"), out);
+ 	fputs(_("     --si            use powers of 1000 not 1024\n"), out);
+ 	fputs(_(" -l, --lohi          show detailed low and high memory statistics\n"), out);
+@@ -101,7 +102,7 @@ double power(unsigned int base, unsigned
+ /* idea of this function is copied from top size scaling */
+ static const char *scale_size(unsigned long size, int flags, struct commandline_arguments args)
+ {
+-	static char nextup[] = { 'B', 'K', 'M', 'G', 'T', 0 };
++	static char nextup[] = { 'B', 'K', 'M', 'G', 'T', 'P', 0 };
+ 	static char buf[BUFSIZ];
+ 	int i;
+ 	char *up;
+@@ -163,6 +164,7 @@ static const char *scale_size(unsigned l
+ 		case 3:
+ 		case 4:
+ 		case 5:
++		case 6:
+ 			if (4 >=
+ 			    snprintf(buf, sizeof(buf), "%.1f%c",
+ 				     (float)(size / power(base, i - 2)), *up))
+@@ -172,14 +174,14 @@ static const char *scale_size(unsigned l
+ 				     (long)(size / power(base, i - 2)), *up))
+ 				return buf;
+ 			break;
+-		case 6:
++		case 7:
+ 			break;
+ 		}
+ 	}
+ 	/*
+-	 * On system where there is more than petabyte of memory or swap the
++	 * On system where there is more than exbibyte of memory or swap the
+ 	 * output does not fit to column. For incoming few years this should
+-	 * not be a big problem (wrote at Apr, 2011).
++	 * not be a big problem (wrote at Apr, 2015).
+ 	 */
+ 	return buf;
+ }
+@@ -197,6 +199,7 @@ int main(int argc, char **argv)
+ 	enum {
+ 		SI_OPTION = CHAR_MAX + 1,
+ 		TERA_OPTION,
++		PETA_OPTION,
+ 		HELP_OPTION
+ 	};
+ 
+@@ -206,6 +209,7 @@ int main(int argc, char **argv)
+ 		{  "mega",	no_argument,	    NULL,  'm'		},
+ 		{  "giga",	no_argument,	    NULL,  'g'		},
+ 		{  "tera",	no_argument,	    NULL,  TERA_OPTION	},
++		{  "peta",	no_argument,	    NULL,  PETA_OPTION	},
+ 		{  "human",	no_argument,	    NULL,  'h'		},
+ 		{  "si",	no_argument,	    NULL,  SI_OPTION	},
+ 		{  "lohi",	no_argument,	    NULL,  'l'		},
+@@ -248,6 +252,9 @@ int main(int argc, char **argv)
+ 		case TERA_OPTION:
+ 			args.exponent = 5;
+ 			break;
++		case PETA_OPTION:
++			args.exponent = 6;
++			break;
+ 		case 'h':
+ 			flags |= FREE_HUMANREADABLE;
+ 			break;
diff --git a/SOURCES/procps-ng-3.3.10-free-uninitialized-errno.patch b/SOURCES/procps-ng-3.3.10-free-uninitialized-errno.patch
new file mode 100644
index 0000000..3975e42
--- /dev/null
+++ b/SOURCES/procps-ng-3.3.10-free-uninitialized-errno.patch
@@ -0,0 +1,11 @@
+diff -Naur procps-ng-3.3.10.orig/free.c procps-ng-3.3.10/free.c
+--- procps-ng-3.3.10.orig/free.c	2015-12-01 17:23:26.702968686 +0100
++++ procps-ng-3.3.10/free.c	2015-12-01 17:22:34.590529390 +0100
+@@ -262,6 +262,7 @@
+ 			break;
+ 		case 's':
+ 			flags |= FREE_REPEAT;
++			errno = 0;
+ 			args.repeat_interval = (1000000 * strtof(optarg, &endptr));
+ 			if (errno || optarg == endptr || (endptr && *endptr))
+ 				xerrx(EXIT_FAILURE, _("seconds argument `%s' failed"), optarg);
diff --git a/SOURCES/procps-ng-3.3.10-pmap-lines-twice.patch b/SOURCES/procps-ng-3.3.10-pmap-lines-twice.patch
new file mode 100644
index 0000000..edb2250
--- /dev/null
+++ b/SOURCES/procps-ng-3.3.10-pmap-lines-twice.patch
@@ -0,0 +1,12 @@
+diff -up procps-ng-3.3.10/pmap.c.ori procps-ng-3.3.10/pmap.c
+--- procps-ng-3.3.10/pmap.c.ori	2017-02-20 10:47:08.292453148 +0100
++++ procps-ng-3.3.10/pmap.c	2017-02-20 10:49:05.078924572 +0100
+@@ -615,7 +615,7 @@ static int one_proc(proc_t * p)
+ 					total_private_dirty += smap_value;
+ 					continue;
+ 				}
+-				if (strncmp("Swap", smap_key, 4) == 0) {
++				if ((strncmp("Swap", smap_key, 4) == 0) && (strlen(smap_key)==4)) {
+ 					/*doesn't matter as long as last */
+ 					printf("%0*" KLF "x %*lu %*llu %*llu %*s %s\n",
+ 					       maxw1, start,
diff --git a/SOURCES/procps-ng-3.3.10-pmap-skip-vmflags.patch b/SOURCES/procps-ng-3.3.10-pmap-skip-vmflags.patch
new file mode 100644
index 0000000..bc949a8
--- /dev/null
+++ b/SOURCES/procps-ng-3.3.10-pmap-skip-vmflags.patch
@@ -0,0 +1,15 @@
+diff -Naur procps-ng-3.3.10.orig/pmap.c procps-ng-3.3.10/pmap.c
+--- procps-ng-3.3.10.orig/pmap.c	2014-09-23 13:40:36.000000000 +0200
++++ procps-ng-3.3.10/pmap.c	2015-11-24 10:47:24.764107976 +0100
+@@ -629,9 +629,9 @@
+ 					diff = 0;
+ 					continue;
+ 				}
+-				/* Other keys */
+-				continue;
+ 			}
++			/* Anything else starting with A-Z? -> skip it (rhbz#1262864) */
++			continue;
+ 		}
+ 		sscanf(mapbuf, "%" KLF "x-%" KLF "x %31s %llx %x:%x %llu", &start,
+ 		       &end, perms, &file_offset, &dev_major, &dev_minor,
diff --git a/SOURCES/procps-ng-3.3.10-ps-full-wchan-name.patch b/SOURCES/procps-ng-3.3.10-ps-full-wchan-name.patch
new file mode 100644
index 0000000..e72d059
--- /dev/null
+++ b/SOURCES/procps-ng-3.3.10-ps-full-wchan-name.patch
@@ -0,0 +1,29 @@
+diff -up ./proc/ksym.c.ori ./proc/ksym.c
+--- ./proc/ksym.c.ori	2006-06-25 08:57:18.000000000 +0200
++++ ./proc/ksym.c	2016-11-16 13:34:31.902836748 +0100
+@@ -567,11 +567,7 @@ static const char * read_wchan_file(unsi
+ 
+   // lame ppc64 has a '.' in front of every name
+   if(*ret=='.') ret++;
+-  switch(*ret){
+-    case 's': if(!strncmp(ret, "sys_", 4)) ret += 4;   break;
+-    case 'd': if(!strncmp(ret, "do_",  3)) ret += 3;   break;
+-    case '_': while(*ret=='_') ret++;                  break;
+-  }
++  while(*ret=='_') ret++; 
+   return ret;
+ }
+ 
+@@ -616,11 +612,7 @@ const char * lookup_wchan(unsigned KLONG
+   ret = good_symb->name;
+   // lame ppc64 has a '.' in front of every name
+   if(*ret=='.') ret++;
+-  switch(*ret){
+-    case 's': if(!strncmp(ret, "sys_", 4)) ret += 4;   break;
+-    case 'd': if(!strncmp(ret, "do_",  3)) ret += 3;   break;
+-    case '_': while(*ret=='_') ret++;                  break;
+-  }
++  while(*ret=='_') ret++;
+   /* if(!*ret) ret = fail.name; */  /* not likely (name was "sys_", etc.) */
+ 
+   /* cache name after abbreviation */
diff --git a/SOURCES/procps-ng-3.3.10-ps-new-option-loginid-luid.patch b/SOURCES/procps-ng-3.3.10-ps-new-option-loginid-luid.patch
new file mode 100644
index 0000000..c1e0ecb
--- /dev/null
+++ b/SOURCES/procps-ng-3.3.10-ps-new-option-loginid-luid.patch
@@ -0,0 +1,61 @@
+diff -up ./ps/output.c.ori ./ps/output.c
+--- ./ps/output.c.ori	2018-04-19 15:18:36.510737173 +0200
++++ ./ps/output.c	2018-04-19 15:18:07.850849743 +0200
+@@ -1087,6 +1087,34 @@ static int pr_fuid(char *restrict const
+   return snprintf(outbuf, COLWID, "%d", pp->fuid);
+ }
+ 
++/* LoginID implementation */
++static int pr_luid(char *restrict const outbuf, const proc_t *restrict const pp){
++    char filename[48];
++    ssize_t num_read;
++    int fd;
++    u_int32_t luid;
++
++    snprintf(filename, sizeof filename, "/proc/%d/loginuid", pp->tgid);
++
++    if ((fd = open(filename, O_RDONLY, 0)) != -1) {
++        num_read = read(fd, outbuf, OUTBUF_SIZE - 1);
++        close(fd);
++        if (num_read > 0) {
++            outbuf[num_read] = '\0';
++
++            // processes born before audit have no LoginID set
++            luid = (u_int32_t) atoi(outbuf);
++            if (luid != -1)
++                return num_read;
++        }
++    }
++    outbuf[0] = '-';
++    outbuf[1] = '\0';
++    num_read = 1;
++    return num_read;
++}
++
++
+ // The Open Group Base Specifications Issue 6 (IEEE Std 1003.1, 2004 Edition)
+ // requires that user and group names print as decimal numbers if there is
+ // not enough room in the column.  However, we will now truncate such names
+@@ -1531,7 +1559,7 @@ static const format_struct format_array[
+ {"lsession",  "SESSION", pr_sd_session, sr_nop,  11,  SD,    LNX, ET|LEFT},
+ #endif
+ {"lstart",    "STARTED", pr_lstart,   sr_nop,    24,   0,    XXX, ET|RIGHT},
+-{"luid",      "LUID",    pr_nop,      sr_nop,     5,   0,    LNX, ET|RIGHT}, /* login ID */
++{"luid",      "LUID",    pr_luid,     sr_nop,     5,   0,    LNX, ET|RIGHT}, /* login ID */
+ {"luser",     "LUSER",   pr_nop,      sr_nop,     8, USR,    LNX, ET|USER}, /* login USER */
+ {"lwp",       "LWP",     pr_tasks,    sr_tasks,   5,   0,    SUN, TO|PIDMAX|RIGHT},
+ {"m_drs",     "DRS",     pr_drs,      sr_drs,     5, MEM,    LNx, PO|RIGHT},
+diff -up ./ps/ps.1.ori ./ps/ps.1
+--- ./ps/ps.1.ori	2018-04-19 15:18:36.510737173 +0200
++++ ./ps/ps.1	2018-04-19 15:18:25.175781694 +0200
+@@ -1353,6 +1353,10 @@ displays the login session identifier of
+ if systemd support has been included.
+ T}
+ 
++luid	LUID	T{
++displays Login ID associated with a process.
++T}
++
+ lwp	LWP	T{
+ light weight process (thread) ID of the dispatchable entity (alias
+ .BR spid , \ tid ).
diff --git a/SOURCES/procps-ng-3.3.10-ps-scattered-thread-cgroups.patch b/SOURCES/procps-ng-3.3.10-ps-scattered-thread-cgroups.patch
new file mode 100644
index 0000000..03ec6d1
--- /dev/null
+++ b/SOURCES/procps-ng-3.3.10-ps-scattered-thread-cgroups.patch
@@ -0,0 +1,69 @@
+diff --git a/ps/output.c b/ps/output.c
+index 501e29a..5f011b1 100644
+--- a/ps/output.c
++++ b/ps/output.c
+@@ -1343,6 +1343,41 @@
+   return snprintf(outbuf, COLWID, "%s", vals[lines_to_next_header%4u]);
+ }
+ 
++static int pr_thcgr(char *restrict const outbuf, const proc_t *restrict const pp){
++  char filename[48];
++  FILE *fd;
++  int counter = 0;
++  int c;
++  int is_cgroup = 0;
++
++  outbuf[0]='\0';
++  snprintf(filename, sizeof filename, "/proc/%d/task/%d/cgroup", pp->tgid, pp->tid);
++  fd = fopen(filename, "r");
++  if (likely(fd == NULL)) goto fail;
++  while (( (c = fgetc(fd)) != EOF) && (counter<665)) {
++    if (is_cgroup == 0) {
++      if (c == ':') {
++        is_cgroup = 1;
++        if (counter>0)
++          outbuf[counter++]=';';
++      }
++    }else
++      if ((c == '\n') || (c == '\0'))
++        is_cgroup = 0;
++      else
++        outbuf[counter++]=c;
++  }
++  outbuf[counter]='\0';
++  fclose(fd);
++  if (counter>0)
++    return counter;
++fail:
++  outbuf[0] = '-';
++  outbuf[1] = '\0';
++  return 1;
++}
++
++
+ /***************************************************************************/
+ /*************************** other stuff ***********************************/
+ 
+@@ -1623,6 +1658,7 @@
+ {"taskid",    "TASKID",  pr_nop,      sr_nop,     5,   0,    SUN, TO|PIDMAX|RIGHT}, // is this a thread ID?
+ {"tdev",      "TDEV",    pr_nop,      sr_nop,     4,   0,    XXX, AN|RIGHT},
+ {"tgid",      "TGID",    pr_procs,    sr_procs,   5,   0,    LNX, PO|PIDMAX|RIGHT},
++{"thcgr",     "THCGR",   pr_thcgr,    sr_nop,    35,   0,    LNX, PO|LEFT},  /* thread cgroups */
+ {"thcount",   "THCNT",   pr_nlwp,     sr_nlwp,    5,   0,    AIX, PO|RIGHT},
+ {"tid",       "TID",     pr_tasks,    sr_tasks,   5,   0,    AIX, TO|PIDMAX|RIGHT},
+ {"time",      "TIME",    pr_time,     sr_time,    8,   0,    U98, ET|RIGHT}, /*cputime*/ /* was 6 wide */
+diff --git a/ps/ps.1 b/ps/ps.1
+index b90adc8..b8d6c81 100644
+--- a/ps/ps.1
++++ b/ps/ps.1
+@@ -1713,6 +1713,10 @@
+ It is the process ID of the thread group leader.
+ T}
+ 
++thcgr	THCGR	T{
++display control groups to which the thread belongs.
++T}
++
+ thcount	THCNT	T{
+ see
+ .BR nlwp .
diff --git a/SOURCES/procps-ng-3.3.10-ps-thcount-format-option.patch b/SOURCES/procps-ng-3.3.10-ps-thcount-format-option.patch
new file mode 100644
index 0000000..7e36b07
--- /dev/null
+++ b/SOURCES/procps-ng-3.3.10-ps-thcount-format-option.patch
@@ -0,0 +1,13 @@
+diff -aur procps-ng-3.3.10/ps/output.c ../procps-ng-3.3.10/ps/output.c
+--- procps-ng-3.3.10/ps/output.c	2014-09-23 13:40:36.000000000 +0200
++++ ../procps-ng-3.3.10/ps/output.c	2016-06-06 18:58:36.267123736 +0200
+@@ -1622,8 +1622,8 @@
+ {"sz",        "SZ",      pr_sz,       sr_nop,     5,   0,    HPU, PO|RIGHT},
+ {"taskid",    "TASKID",  pr_nop,      sr_nop,     5,   0,    SUN, TO|PIDMAX|RIGHT}, // is this a thread ID?
+ {"tdev",      "TDEV",    pr_nop,      sr_nop,     4,   0,    XXX, AN|RIGHT},
+-{"thcount",   "THCNT",   pr_nlwp,     sr_nlwp,    5,   0,    AIX, PO|RIGHT},
+ {"tgid",      "TGID",    pr_procs,    sr_procs,   5,   0,    LNX, PO|PIDMAX|RIGHT},
++{"thcount",   "THCNT",   pr_nlwp,     sr_nlwp,    5,   0,    AIX, PO|RIGHT},
+ {"tid",       "TID",     pr_tasks,    sr_tasks,   5,   0,    AIX, TO|PIDMAX|RIGHT},
+ {"time",      "TIME",    pr_time,     sr_time,    8,   0,    U98, ET|RIGHT}, /*cputime*/ /* was 6 wide */
+ {"timeout",   "TMOUT",   pr_nop,      sr_nop,     5,   0,    LNX, AN|RIGHT}, // 2.0.xx era
diff --git a/SOURCES/procps-ng-3.3.10-recognize_sched_deadline.patch b/SOURCES/procps-ng-3.3.10-recognize_sched_deadline.patch
new file mode 100644
index 0000000..ee34e10
--- /dev/null
+++ b/SOURCES/procps-ng-3.3.10-recognize_sched_deadline.patch
@@ -0,0 +1,82 @@
+diff -up ./man-po/fr.po.ori ./man-po/fr.po
+--- ./man-po/fr.po.ori	2014-09-23 13:40:36.000000000 +0200
++++ ./man-po/fr.po	2019-03-27 13:52:01.636939773 +0100
+@@ -4593,6 +4593,9 @@ msgstr "Le programme B<watch> a été é
+ #~ msgid "IDL\tSCHED_IDLE\n"
+ #~ msgstr "IDL\tSCHED_IDLE\n"
+ 
++#~ msgid "DLN\tSCHED_DEADLINE\n"
++#~ msgstr "DLN\tSCHED_DEADLINE\n"
++
+ #~ msgid "?\tunknown value\n"
+ #~ msgstr "?\tvaleur inconnue\n"
+ 
+@@ -5200,11 +5203,11 @@ msgstr "Le programme B<watch> a été é
+ #~ msgid "scheduling policy of the process.  The policies SCHED_OTHER (SCHED_NORMAL),\n"
+ #~ msgstr "Ordonnancement de la politique du processus. Les politiques SCHED_OTHER (SCHED_NORMAL),\n"
+ 
+-#~ msgid "SCHED_FIFO, SCHED_RR, SCHED_BATCH, SCHED_ISO, and SCHED_IDLE are respectively\n"
+-#~ msgstr "SCHED_FIFO, SCHED_RR, SCHED_BATCH, SCHED_ISO et SCHED_IDLE sont respectivement\n"
++#~ msgid "SCHED_FIFO, SCHED_RR, SCHED_BATCH, SCHED_ISO, SCHED_IDLE and SCHED_DEADLINE are respectively\n"
++#~ msgstr "SCHED_FIFO, SCHED_RR, SCHED_BATCH, SCHED_ISO, SCHED_IDLE et SCHED_DEADLINE sont respectivement\n"
+ 
+-#~ msgid "displayed as 0, 1, 2, 3, 4, and 5.\n"
+-#~ msgstr "affichées comme 0, 1, 2, 3, 4 et 5.\n"
++#~ msgid "displayed as 0, 1, 2, 3, 4, 5 and 6.\n"
++#~ msgstr "affichées comme 0, 1, 2, 3, 4, 5 et 6.\n"
+ 
+ #~ msgid "seat\tSEAT\tT{\n"
+ #~ msgstr "seat\tSEAT\tT{\n"
+diff -up ./ps/output.c.ori ./ps/output.c
+--- ./ps/output.c.ori	2019-03-27 13:51:51.072812431 +0100
++++ ./ps/output.c	2019-03-27 13:52:01.638939797 +0100
+@@ -674,7 +674,7 @@ static int pr_class(char *restrict const
+   case  3: return snprintf(outbuf, COLWID, "B");   // SCHED_BATCH
+   case  4: return snprintf(outbuf, COLWID, "ISO"); // reserved for SCHED_ISO (Con Kolivas)
+   case  5: return snprintf(outbuf, COLWID, "IDL"); // SCHED_IDLE
+-  case  6: return snprintf(outbuf, COLWID, "#6");  //
++  case  6: return snprintf(outbuf, COLWID, "DLN"); // SCHED_DEADLINE
+   case  7: return snprintf(outbuf, COLWID, "#7");  //
+   case  8: return snprintf(outbuf, COLWID, "#8");  //
+   case  9: return snprintf(outbuf, COLWID, "#9");  //
+diff -up ./ps/ps.1.ori ./ps/ps.1
+--- ./ps/ps.1.ori	2019-03-27 13:51:51.073812443 +0100
++++ ./ps/ps.1	2019-03-27 13:52:01.639939809 +0100
+@@ -1138,6 +1138,8 @@ ISO	SCHED_ISO
+ .br
+ IDL	SCHED_IDLE
+ .br
++DLN	SCHED_DEADLINE
++.br
+ ?	unknown value
+ T}
+ 
+@@ -1160,6 +1162,8 @@ ISO	SCHED_ISO
+ .br
+ IDL	SCHED_IDLE
+ .br
++DLN	SCHED_DEADLINE
++.br
+ ?	unknown value
+ T}
+ 
+@@ -1485,6 +1489,8 @@ ISO	SCHED_ISO
+ .br
+ IDL	SCHED_IDLE
+ .br
++DLN	SCHED_DEADLINE
++.br
+ ?	unknown value
+ T}
+ 
+@@ -1553,8 +1559,8 @@ T}
+ 
+ sched	SCH	T{
+ scheduling policy of the process.  The policies SCHED_OTHER (SCHED_NORMAL),
+-SCHED_FIFO, SCHED_RR, SCHED_BATCH, SCHED_ISO, and SCHED_IDLE are respectively
+-displayed as 0, 1, 2, 3, 4, and 5.
++SCHED_FIFO, SCHED_RR, SCHED_BATCH, SCHED_ISO, SCHED_IDLE and SCHED_DEADLINE are
++respectively displayed as 0, 1, 2, 3, 4, 5 and 6.
+ T}
+ 
+ seat	SEAT	T{
diff --git a/SOURCES/procps-ng-3.3.10-slabtop-use-val-float.patch b/SOURCES/procps-ng-3.3.10-slabtop-use-val-float.patch
new file mode 100644
index 0000000..42ed9df
--- /dev/null
+++ b/SOURCES/procps-ng-3.3.10-slabtop-use-val-float.patch
@@ -0,0 +1,21 @@
+diff -up ./proc/slab.c.ori ./proc/slab.c
+--- ./proc/slab.c.ori	2017-03-13 17:14:22.684744976 +0100
++++ ./proc/slab.c	2017-03-13 17:14:28.836719945 +0100
+@@ -179,7 +179,7 @@ static int parse_slabinfo20(struct slab_
+ 		curr->cache_size = (unsigned long)curr->nr_slabs * curr->pages_per_slab * page_size;
+ 
+ 		if (curr->nr_objs) {
+-			curr->use = 100 * curr->nr_active_objs / curr->nr_objs;
++			curr->use = 100 * (float)curr->nr_active_objs / curr->nr_objs;
+ 			stats->nr_active_caches++;
+ 		} else
+ 			curr->use = 0;
+@@ -258,7 +258,7 @@ static int parse_slabinfo11(struct slab_
+ 		curr->cache_size = (unsigned long)curr->nr_slabs * curr->pages_per_slab * page_size;
+ 
+ 		if (curr->nr_objs) {
+-			curr->use = 100 * curr->nr_active_objs / curr->nr_objs;
++			curr->use = 100 * (float)curr->nr_active_objs / curr->nr_objs;
+ 			stats->nr_active_caches++;
+ 		} else
+ 			curr->use = 0;
diff --git a/SOURCES/procps-ng-3.3.10-sysctl-conf-manpage-predef-note.patch b/SOURCES/procps-ng-3.3.10-sysctl-conf-manpage-predef-note.patch
new file mode 100644
index 0000000..8f687ca
--- /dev/null
+++ b/SOURCES/procps-ng-3.3.10-sysctl-conf-manpage-predef-note.patch
@@ -0,0 +1,19 @@
+diff -up ./sysctl.conf.5.ori ./sysctl.conf.5
+--- ./sysctl.conf.5.ori	2017-04-06 18:59:51.718644400 +0200
++++ ./sysctl.conf.5	2017-04-06 19:00:01.872604143 +0200
+@@ -28,6 +28,15 @@ token = value
+ Note that blank lines are ignored, and whitespace before and after a token or
+ value is ignored, although a value can contain whitespace within.  Lines which
+ begin with a # or ; are considered comments and ignored.
++.SH NOTES
++As the
++.BR /etc/sysctl.conf
++file is used to override default kernel parameter values, only a small number of parameters is predefined in the file.
++Use
++.IR /sbin/sysctl\ \-a
++or follow
++.BR sysctl (8)
++to list all possible parameters. The description of individual parameters can be found in the kernel documentation.
+ .SH EXAMPLE
+ .RS
+ .sp
diff --git a/SOURCES/procps-ng-3.3.10-sysctl-empty-value-allowed.patch b/SOURCES/procps-ng-3.3.10-sysctl-empty-value-allowed.patch
new file mode 100644
index 0000000..4fc5765
--- /dev/null
+++ b/SOURCES/procps-ng-3.3.10-sysctl-empty-value-allowed.patch
@@ -0,0 +1,12 @@
+diff -up ./sysctl.c.ori ./sysctl.c
+--- ./sysctl.c.ori	2018-01-04 16:56:26.705925767 +0100
++++ ./sysctl.c	2018-01-04 16:56:40.365877248 +0100
+@@ -379,7 +379,7 @@ static int WriteSetting(const char *sett
+ 	/* point to the value in name=value */
+ 	value = equals + 1;
+ 
+-	if (!*name || !*value || name == equals) {
++	if (!*name || name == equals) {
+ 		xwarnx(_("malformed setting \"%s\""), setting);
+ 		return -2;
+ 	}
diff --git a/SOURCES/procps-ng-3.3.10-sysctl-man-conf-override-hint.patch b/SOURCES/procps-ng-3.3.10-sysctl-man-conf-override-hint.patch
new file mode 100644
index 0000000..0f3b3de
--- /dev/null
+++ b/SOURCES/procps-ng-3.3.10-sysctl-man-conf-override-hint.patch
@@ -0,0 +1,12 @@
+diff -up ./sysctl.8.ori ./sysctl.8
+--- ./sysctl.8.ori	2014-09-23 13:40:36.000000000 +0200
++++ ./sysctl.8	2017-05-31 14:43:08.323364474 +0200
+@@ -78,7 +78,7 @@ values listing.
+ Print value without new line.
+ .TP
+ \fB\-\-system\fR
+-Load settings from all system configuration files.
++Load settings from all system configuration files. Files are read from directories in the following list in given order from top to bottom. Once a file of a given filename is loaded, any file of the same name in subsequent directories is ignored.
+ .br
+ /run/sysctl.d/*.conf
+ .br
diff --git a/SOURCES/procps-ng-3.3.10-top-instant-cpu-stats.patch b/SOURCES/procps-ng-3.3.10-top-instant-cpu-stats.patch
new file mode 100644
index 0000000..a60a043
--- /dev/null
+++ b/SOURCES/procps-ng-3.3.10-top-instant-cpu-stats.patch
@@ -0,0 +1,166 @@
+diff -up ./top/top.c.ori ./top/top.c
+--- ./top/top.c.ori	2017-04-07 18:36:05.953611338 +0200
++++ ./top/top.c	2017-04-07 18:37:14.037321741 +0200
+@@ -91,6 +91,7 @@ static int   Rc_questions;
+ static unsigned Pg2K_shft = 0;
+ 
+         /* SMP, Irix/Solaris mode, Linux 2.5.xx support */
++static CPU_t      *Cpu_tics;
+ static int         Cpu_faux_tot;
+ static float       Cpu_pmax;
+ static const char *Cpu_States_fmts;
+@@ -2356,10 +2357,10 @@ static void zap_fieldstab (void) {
+          * This guy's modeled on libproc's 'eight_cpu_numbers' function except
+          * we preserve all cpu data in our CPU_t array which is organized
+          * as follows:
+-         *    cpus[0] thru cpus[n] == tics for each separate cpu
+-         *    cpus[sumSLOT]        == tics from the 1st /proc/stat line
+-         *  [ and beyond sumSLOT   == tics for each cpu NUMA node ] */
+-static CPU_t *cpus_refresh (CPU_t *cpus) {
++         *    Cpu_tics[0] thru Cpu_tics[n] == tics for each separate cpu
++         *    Cpu_tics[sumSLOT]            == tics from /proc/stat line #1
++         *  [ and beyond sumSLOT           == tics for each cpu NUMA node ] */
++static void cpus_refresh (void) {
+  #define sumSLOT ( smp_num_cpus )
+  #define totSLOT ( 1 + smp_num_cpus + Numa_node_tot)
+    static FILE *fp = NULL;
+@@ -2377,7 +2378,7 @@ static CPU_t *cpus_refresh (CPU_t *cpus)
+       sav_slot = sumSLOT;
+       zap_fieldstab();
+       if (fp) { fclose(fp); fp = NULL; }
+-      if (cpus) { free(cpus); cpus = NULL; }
++      if (Cpu_tics) free(Cpu_tics);
+    }
+ 
+    /* by opening this file once, we'll avoid the hit on minor page faults
+@@ -2387,7 +2388,7 @@ static CPU_t *cpus_refresh (CPU_t *cpus)
+          error_exit(fmtmk(N_fmt(FAIL_statopn_fmt), strerror(errno)));
+       /* note: we allocate one more CPU_t via totSLOT than 'cpus' so that a
+                slot can hold tics representing the /proc/stat cpu summary */
+-      cpus = alloc_c(totSLOT * sizeof(CPU_t));
++      Cpu_tics = alloc_c(totSLOT * sizeof(CPU_t));
+    }
+    rewind(fp);
+    fflush(fp);
+@@ -2410,7 +2411,7 @@ static CPU_t *cpus_refresh (CPU_t *cpus)
+  #undef buffGRW
+ 
+    // remember from last time around
+-   sum_ptr = &cpus[sumSLOT];
++   sum_ptr = &Cpu_tics[sumSLOT];
+    memcpy(&sum_ptr->sav, &sum_ptr->cur, sizeof(CT_t));
+    // then value the last slot with the cpu summary line
+    if (4 > sscanf(bp, "cpu %Lu %Lu %Lu %Lu %Lu %Lu %Lu %Lu"
+@@ -2437,7 +2438,7 @@ static CPU_t *cpus_refresh (CPU_t *cpus)
+ 
+    // now value each separate cpu's tics...
+    for (i = 0; i < sumSLOT; i++) {
+-      CPU_t *cpu_ptr = &cpus[i];               // avoid gcc subscript bloat
++      CPU_t *cpu_ptr = &Cpu_tics[i];           // avoid gcc subscript bloat
+ #ifdef PRETEND8CPUS
+       bp = buf;
+ #endif
+@@ -2448,7 +2449,6 @@ static CPU_t *cpus_refresh (CPU_t *cpus)
+          , &cpu_ptr->cur.u, &cpu_ptr->cur.n, &cpu_ptr->cur.s
+          , &cpu_ptr->cur.i, &cpu_ptr->cur.w, &cpu_ptr->cur.x
+          , &cpu_ptr->cur.y, &cpu_ptr->cur.z)) {
+-            memmove(cpu_ptr, sum_ptr, sizeof(CPU_t));
+             break;        // tolerate cpus taken offline
+       }
+ 
+@@ -2488,8 +2488,6 @@ static CPU_t *cpus_refresh (CPU_t *cpus)
+    } // end: for each cpu
+ 
+    Cpu_faux_tot = i;      // tolerate cpus taken offline
+-
+-   return cpus;
+  #undef sumSLOT
+  #undef totSLOT
+ } // end: cpus_refresh
+@@ -5119,7 +5117,6 @@ static void summary_hlp (CPU_t *cpu, con
+ static void summary_show (void) {
+  #define isROOM(f,n) (CHKw(w, f) && Msg_row + (n) < Screen_rows - 1)
+  #define anyFLG 0xffffff
+-   static CPU_t *smpcpu = NULL;
+    WIN_t *w = Curwin;             // avoid gcc bloat with a local copy
+    char tmp[MEDBUFSIZ];
+    int i;
+@@ -5142,7 +5139,7 @@ static void summary_show (void) {
+          , Frame_stopped, Frame_zombied));
+       Msg_row += 1;
+ 
+-      smpcpu = cpus_refresh(smpcpu);
++      cpus_refresh();
+ 
+ #ifndef NUMA_DISABLE
+       if (!Numa_node_tot) goto numa_nope;
+@@ -5150,11 +5147,11 @@ static void summary_show (void) {
+       if (CHKw(w, View_CPUNOD)) {
+          if (Numa_node_sel < 0) {
+             // display the 1st /proc/stat line, then the nodes (if room)
+-            summary_hlp(&smpcpu[smp_num_cpus], N_txt(WORD_allcpus_txt));
++            summary_hlp(&Cpu_tics[smp_num_cpus], N_txt(WORD_allcpus_txt));
+             Msg_row += 1;
+             // display each cpu node's states
+             for (i = 0; i < Numa_node_tot; i++) {
+-               CPU_t *nod_ptr = &smpcpu[1 + smp_num_cpus + i];
++               CPU_t *nod_ptr = &Cpu_tics[1 + smp_num_cpus + i];
+                if (!isROOM(anyFLG, 1)) break;
+ #ifndef OFF_NUMASKIP
+                if (nod_ptr->id) {
+@@ -5169,13 +5166,13 @@ static void summary_show (void) {
+          } else {
+             // display the node summary, then the associated cpus (if room)
+             snprintf(tmp, sizeof(tmp), N_fmt(NUMA_nodenam_fmt), Numa_node_sel);
+-            summary_hlp(&smpcpu[1 + smp_num_cpus + Numa_node_sel], tmp);
++            summary_hlp(&Cpu_tics[1 + smp_num_cpus + Numa_node_sel], tmp);
+             Msg_row += 1;
+             for (i = 0; i < Cpu_faux_tot; i++) {
+-               if (Numa_node_sel == smpcpu[i].node) {
++               if (Numa_node_sel == Cpu_tics[i].node) {
+                   if (!isROOM(anyFLG, 1)) break;
+-                  snprintf(tmp, sizeof(tmp), N_fmt(WORD_eachcpu_fmt), smpcpu[i].id);
+-                  summary_hlp(&smpcpu[i], tmp);
++                  snprintf(tmp, sizeof(tmp), N_fmt(WORD_eachcpu_fmt), Cpu_tics[i].id);
++                  summary_hlp(&Cpu_tics[i], tmp);
+                   Msg_row += 1;
+                }
+             }
+@@ -5185,14 +5182,14 @@ numa_nope:
+ #endif
+       if (CHKw(w, View_CPUSUM)) {
+          // display just the 1st /proc/stat line
+-         summary_hlp(&smpcpu[Cpu_faux_tot], N_txt(WORD_allcpus_txt));
++         summary_hlp(&Cpu_tics[Cpu_faux_tot], N_txt(WORD_allcpus_txt));
+          Msg_row += 1;
+ 
+       } else {
+          // display each cpu's states separately, screen height permitting...
+          for (i = 0; i < Cpu_faux_tot; i++) {
+-            snprintf(tmp, sizeof(tmp), N_fmt(WORD_eachcpu_fmt), smpcpu[i].id);
+-            summary_hlp(&smpcpu[i], tmp);
++            snprintf(tmp, sizeof(tmp), N_fmt(WORD_eachcpu_fmt), Cpu_tics[i].id);
++            summary_hlp(&Cpu_tics[i], tmp);
+             Msg_row += 1;
+             if (!isROOM(anyFLG, 1)) break;
+          }
+@@ -5643,6 +5640,7 @@ static void frame_make (void) {
+ 
+    // whoa either first time or thread/task mode change, (re)prime the pump...
+    if (Pseudo_row == PROC_XTRA) {
++      cpus_refresh();
+       procs_refresh();
+       usleep(LIB_USLEEP);
+       putp(Cap_clr_scr);
+diff -up ./top/top.h.ori ./top/top.h
+--- ./top/top.h.ori	2017-04-07 18:36:14.921573192 +0200
++++ ./top/top.h	2017-04-07 18:37:14.037321741 +0200
+@@ -728,7 +728,7 @@ typedef struct WIN_t {
+ //atic inline void   widths_resize (void);
+ //atic void          zap_fieldstab (void);
+ /*------  Library Interface  ---------------------------------------------*/
+-//atic CPU_t        *cpus_refresh (CPU_t *cpus);
++//atic void          cpus_refresh (void);
+ #ifdef OFF_HST_HASH
+ //atic inline HST_t *hstbsrch (HST_t *hst, int max, int pid);
+ #else
diff --git a/SOURCES/procps-ng-3.3.10-top-locale-independent-float-delay.patch b/SOURCES/procps-ng-3.3.10-top-locale-independent-float-delay.patch
new file mode 100644
index 0000000..8d61e69
--- /dev/null
+++ b/SOURCES/procps-ng-3.3.10-top-locale-independent-float-delay.patch
@@ -0,0 +1,35 @@
+diff -up ./top/top.c.ori ./top/top.c
+--- ./top/top.c.ori	2018-01-15 14:04:42.403457405 +0100
++++ ./top/top.c	2018-01-15 14:07:59.663713707 +0100
+@@ -1260,15 +1260,25 @@ static char *ioline (const char *prompt)
+ 
+ 
+         /*
+-         * Make locale aware float (but maybe restrict to whole numbers). */
++         * Make locale unaware float (but maybe restrict to whole numbers). */
+ static int mkfloat (const char *str, float *num, int whole) {
+-   char *ep;
++   char tmp[SMLBUFSIZ], *ep;
+ 
+-   if (whole)
++   if (whole) {
+       *num = (float)strtol(str, &ep, 0);
+-   else
+-      *num = strtof(str, &ep);
+-   if (ep != str && *ep == '\0' && *num < INT_MAX)
++      if (ep != str && *ep == '\0' && *num < INT_MAX)
++         return 1;
++      return 0;
++   }
++   snprintf(tmp, sizeof(tmp), "%s", str);
++   *num = strtof(tmp, &ep);
++   if (*ep != '\0') {
++      // fallback - try to swap the floating point separator
++      if (*ep == '.') *ep = ',';
++      else if (*ep == ',') *ep = '.';
++      *num = strtof(tmp, &ep);
++   }
++   if (ep != tmp && *ep == '\0' && *num < INT_MAX)
+       return 1;
+    return 0;
+ } // end: mkfloat
diff --git a/SOURCES/procps-ng-3.3.10-top-segv-on-double-exit.patch b/SOURCES/procps-ng-3.3.10-top-segv-on-double-exit.patch
new file mode 100644
index 0000000..e86771d
--- /dev/null
+++ b/SOURCES/procps-ng-3.3.10-top-segv-on-double-exit.patch
@@ -0,0 +1,28 @@
+diff -up ./top/top.c.ori ./top/top.c
+--- ./top/top.c.ori	2019-08-08 17:07:57.970295504 +0200
++++ ./top/top.c	2019-08-08 17:09:02.705070742 +0200
+@@ -406,6 +406,11 @@ static void at_eoj (void) {
+          * The real program end */
+ static void bye_bye (const char *str) NORETURN;
+ static void bye_bye (const char *str) {
++   sigset_t ss;
++
++// POSIX.1-2004 async-signal-safe: sigfillset, sigprocmask
++   sigfillset(&ss);
++   sigprocmask(SIG_BLOCK, &ss, NULL);
+    at_eoj();                 // restore tty in preparation for exit
+ #ifdef ATEOJ_RPTSTD
+ {  proc_t *p;
+@@ -616,12 +621,6 @@ static void sig_abexit (int sig) {
+          *    SIGUSR1 and SIGUSR2 */
+ static void sig_endpgm (int dont_care_sig) NORETURN;
+ static void sig_endpgm (int dont_care_sig) {
+-   sigset_t ss;
+-
+-// POSIX.1-2004 async-signal-safe: sigfillset, sigprocmask
+-   sigfillset(&ss);
+-   sigprocmask(SIG_BLOCK, &ss, NULL);
+-   Frames_signal = BREAK_sig;
+    bye_bye(NULL);
+    (void)dont_care_sig;
+ } // end: sig_endpgm
diff --git a/SOURCES/procps-ng-3.3.10-top-strange-mem-val-scaling.patch b/SOURCES/procps-ng-3.3.10-top-strange-mem-val-scaling.patch
new file mode 100644
index 0000000..786eeae
--- /dev/null
+++ b/SOURCES/procps-ng-3.3.10-top-strange-mem-val-scaling.patch
@@ -0,0 +1,111 @@
+diff -up ./configure.ac.ori ./configure.ac
+--- ./configure.ac.ori	2014-09-23 13:40:36.000000000 +0200
++++ ./configure.ac	2017-08-02 13:04:25.439881501 +0200
+@@ -218,11 +218,11 @@ if test "x$enable_wide_percent" = xyes;
+ fi
+ 
+ AC_ARG_ENABLE([wide-memory],
+-  AS_HELP_STRING([--disable-wide-memory], [disable extra precision under memory fields for top]),
+-  [], [enable_wide_memory=yes]
++  AS_HELP_STRING([--enable-wide-memory], [provide extra precision under memory fields for top]),
++  [], [enable_wide_memory=no]
+ )
+-if test "x$enable_wide_memory" = xno; then
+-  AC_DEFINE(NOBOOST_MEMS, 1, [disable extra precision under memory fields for top])
++if test "x$enable_wide_memory" = xyes; then
++  AC_DEFINE(BOOST_MEMORY, 1, [provide extra precision under memory fields for top])
+ fi
+ 
+ AC_ARG_ENABLE([modern-top],
+diff -up ./top/top.c.ori ./top/top.c
+--- ./top/top.c.ori	2017-08-02 12:56:41.681326790 +0200
++++ ./top/top.c	2017-08-02 13:50:24.953331241 +0200
+@@ -1542,11 +1542,11 @@ static inline const char *make_str (cons
+          * We'll interpret 'num' as a kibibytes quantity and try to
+          * format it to reach 'target' while also fitting 'width'. */
+ static const char *scale_mem (int target, unsigned long num, int width, int justr) {
+-#ifndef NOBOOST_MEMS
+    //                               SK_Kb   SK_Mb      SK_Gb      SK_Tb      SK_Pb      SK_Eb
++#ifdef BOOST_MEMORY
+    static const char *fmttab[] =  { "%.0f", "%#.1f%c", "%#.3f%c", "%#.3f%c", "%#.3f%c", NULL };
+ #else
+-   static const char *fmttab[] =  { "%.0f", "%.0f%c",  "%.0f%c",  "%.0f%c",  "%.0f%c",  NULL };
++   static const char *fmttab[] =  { "%.0f", "%.1f%c",  "%.1f%c",  "%.1f%c",  "%.1f%c",  NULL };
+ #endif
+    static char buf[SMLBUFSIZ];
+    float scaled_num;
+@@ -1750,21 +1750,12 @@ static FLD_t Fieldstab[] = {
+ #else
+    {     4,     -1,  A_right,  SF(RES),  L_statm   }, // EU_MEM slot
+ #endif
+-#ifndef NOBOOST_MEMS
+    {     7,  SK_Kb,  A_right,  SF(VRT),  L_statm   },
+    {     6,  SK_Kb,  A_right,  SF(SWP),  L_status  },
+    {     6,  SK_Kb,  A_right,  SF(RES),  L_statm   },
+    {     6,  SK_Kb,  A_right,  SF(COD),  L_statm   },
+    {     7,  SK_Kb,  A_right,  SF(DAT),  L_statm   },
+    {     6,  SK_Kb,  A_right,  SF(SHR),  L_statm   },
+-#else
+-   {     5,  SK_Kb,  A_right,  SF(VRT),  L_statm   },
+-   {     4,  SK_Kb,  A_right,  SF(SWP),  L_status  },
+-   {     4,  SK_Kb,  A_right,  SF(RES),  L_statm   },
+-   {     4,  SK_Kb,  A_right,  SF(COD),  L_statm   },
+-   {     5,  SK_Kb,  A_right,  SF(DAT),  L_statm   },
+-   {     4,  SK_Kb,  A_right,  SF(SHR),  L_statm   },
+-#endif
+    {     4,     -1,  A_right,  SF(FL1),  L_stat    },
+    {     4,     -1,  A_right,  SF(FL2),  L_stat    },
+    {     4,     -1,  A_right,  SF(DRT),  L_statm   },
+@@ -1785,11 +1776,7 @@ static FLD_t Fieldstab[] = {
+    {    -1,     -1,  A_left,   SF(ENV),  L_ENVIRON },
+    {     3,     -1,  A_right,  SF(FV1),  L_stat    },
+    {     3,     -1,  A_right,  SF(FV2),  L_stat    },
+-#ifndef NOBOOST_MEMS
+    {     6,  SK_Kb,  A_right,  SF(USE),  L_USED    },
+-#else
+-   {     4,  SK_Kb,  A_right,  SF(USE),  L_USED    },
+-#endif
+    {    10,     -1,  A_right,  SF(NS1),  L_NS      }, // IPCNS
+    {    10,     -1,  A_right,  SF(NS2),  L_NS      }, // MNTNS
+    {    10,     -1,  A_right,  SF(NS3),  L_NS      }, // NETNS
+@@ -5208,12 +5195,20 @@ numa_nope:
+          const char *fmts;
+          const char *label;
+       } scaletab[] = {
+-         { 1, "%1.0f ", NULL },                            // kibibytes
+-         { 1024.0, "%#4.3f ", NULL },                      // mebibytes
+-         { 1024.0*1024, "%#4.3f ", NULL },                 // gibibytes
+-         { 1024.0*1024*1024, "%#4.3f ", NULL },            // tebibytes
+-         { 1024.0*1024*1024*1024, "%#4.3f ", NULL },       // pebibytes
+-         { 1024.0*1024*1024*1024*1024, "%#4.3f ", NULL }   // exbibytes
++         { 1, "%.0f ", NULL },                             // kibibytes
++#ifdef BOOST_MEMORY
++         { 1024.0, "%#.3f ", NULL },                       // mebibytes
++         { 1024.0*1024, "%#.3f ", NULL },                  // gibibytes
++         { 1024.0*1024*1024, "%#.3f ", NULL },             // tebibytes
++         { 1024.0*1024*1024*1024, "%#.3f ", NULL },        // pebibytes
++         { 1024.0*1024*1024*1024*1024, "%#.3f ", NULL }    // exbibytes
++#else
++         { 1024.0, "%#.1f ", NULL },                       // mebibytes
++         { 1024.0*1024, "%#.1f ", NULL },                  // gibibytes
++         { 1024.0*1024*1024, "%#.1f ", NULL },             // tebibytes
++         { 1024.0*1024*1024*1024, "%#.1f ", NULL },        // pebibytes
++         { 1024.0*1024*1024*1024*1024, "%#.1f ", NULL }    // exbibytes
++#endif
+       };
+       struct { //                                            0123456789
+       // snprintf contents of each buf (after SK_Kb):       'nnnn.nnn 0'
+diff -up ./top/top.h.ori ./top/top.h
+--- ./top/top.h.ori	2017-08-02 12:56:41.681326790 +0200
++++ ./top/top.h	2017-08-02 13:04:25.446881464 +0200
+@@ -23,8 +23,8 @@
+ #include "../proc/readproc.h"
+ 
+         /* Defines represented in configure.ac ----------------------------- */
+-//#define BOOST_PERCNT            /* enable extra precision for two % fields */
+-//#define NOBOOST_MEMS            /* disable extra precision for mem fields  */
++//#define BOOST_MEMORY            /* enable extra precision for mem fields   */
++//#define BOOST_PERCNT            /* enable extra precision for 2 % fields   */
+ //#define NUMA_DISABLE            /* disable summary area NUMA/Nodes display */
+ //#define OOMEM_ENABLE            /* enable the SuSE out-of-memory additions */
+ //#define ORIG_TOPDEFS            /* with no rcfile retain original defaults */
diff --git a/SOURCES/procps-ng-3.3.10-vmstat-devlen.patch b/SOURCES/procps-ng-3.3.10-vmstat-devlen.patch
new file mode 100644
index 0000000..e41de18
--- /dev/null
+++ b/SOURCES/procps-ng-3.3.10-vmstat-devlen.patch
@@ -0,0 +1,57 @@
+diff -Naur procps-ng-3.3.10.orig/proc/sysinfo.c procps-ng-3.3.10/proc/sysinfo.c
+--- procps-ng-3.3.10.orig/proc/sysinfo.c	2016-01-14 15:57:33.000000000 +0100
++++ procps-ng-3.3.10/proc/sysinfo.c	2016-01-14 16:40:01.290000000 +0100
+@@ -988,7 +988,7 @@
+   int cPartition = 0;
+   int fields;
+   unsigned dummy;
+-  char devname[32];
++  char devname[35];
+ 
+   *disks = NULL;
+   *partitions = NULL;
+@@ -1001,10 +1001,10 @@
+       fclose(fd);
+       break;
+     }
+-    fields = sscanf(buff, " %*d %*d %15s %*u %*u %*u %*u %*u %*u %*u %*u %*u %*u %u", devname, &dummy);
++    fields = sscanf(buff, " %*d %*d %34s %*u %*u %*u %*u %*u %*u %*u %*u %*u %*u %u", devname, &dummy);
+     if (fields == 2 && is_disk(devname)){
+       (*disks) = xrealloc(*disks, (cDisk+1)*sizeof(struct disk_stat));
+-      sscanf(buff,  "   %*d    %*d %15s %u %u %llu %u %u %u %llu %u %u %u %u",
++      sscanf(buff,  "   %*d    %*d %31s %u %u %llu %u %u %u %llu %u %u %u %u",
+         //&disk_major,
+         //&disk_minor,
+         (*disks)[cDisk].disk_name,
+@@ -1026,8 +1026,8 @@
+       (*partitions) = xrealloc(*partitions, (cPartition+1)*sizeof(struct partition_stat));
+       fflush(stdout);
+       sscanf(buff,  (fields == 2)
+-          ? "   %*d    %*d %15s %u %*u %llu %*u %u %*u %llu %*u %*u %*u %*u"
+-          : "   %*d    %*d %15s %u %llu %u %llu",
++          ? "   %*d    %*d %34s %u %*u %llu %*u %u %*u %llu %*u %*u %*u %*u"
++          : "   %*d    %*d %34s %u %llu %u %llu",
+         //&part_major,
+         //&part_minor,
+         (*partitions)[cPartition].partition_name,
+diff -Naur procps-ng-3.3.10.orig/proc/sysinfo.h procps-ng-3.3.10/proc/sysinfo.h
+--- procps-ng-3.3.10.orig/proc/sysinfo.h	2014-09-23 13:40:36.000000000 +0200
++++ procps-ng-3.3.10/proc/sysinfo.h	2016-01-14 16:30:02.326000000 +0100
+@@ -101,7 +101,7 @@
+ typedef struct disk_stat{
+ 	unsigned long long reads_sectors;
+ 	unsigned long long written_sectors;
+-	char               disk_name [16];
++	char               disk_name [32];
+ 	unsigned           inprogress_IO;
+ 	unsigned           merged_reads;
+ 	unsigned           merged_writes;
+@@ -115,7 +115,7 @@
+ }disk_stat;
+ 
+ typedef struct partition_stat{
+-	char partition_name [16];
++	char partition_name [35];
+ 	unsigned long long reads_sectors;
+ 	unsigned           parent_disk;  // index into a struct disk_stat array
+ 	unsigned           reads;
diff --git a/SOURCES/procps-ng-3.3.10-vmstat-long-device-name.patch b/SOURCES/procps-ng-3.3.10-vmstat-long-device-name.patch
new file mode 100644
index 0000000..91c72ec
--- /dev/null
+++ b/SOURCES/procps-ng-3.3.10-vmstat-long-device-name.patch
@@ -0,0 +1,13 @@
+diff --git a/proc/sysinfo.c b/proc/sysinfo.c
+index baa2453..c95f378 100644
+--- a/proc/sysinfo.c
++++ b/proc/sysinfo.c
+@@ -979,7 +979,7 @@ unsigned int getpartitions_num(struct disk_stat *disks, int ndisks){
+ /////////////////////////////////////////////////////////////////////////////
+ static int is_disk(char *dev)
+ {
+-  char syspath[32];
++  char syspath[64];
+   char *slash;
+ 
+   while ((slash = strchr(dev, '/')))
diff --git a/SPECS/procps-ng.spec b/SPECS/procps-ng.spec
new file mode 100644
index 0000000..37dccae
--- /dev/null
+++ b/SPECS/procps-ng.spec
@@ -0,0 +1,459 @@
+# The testsuite is unsuitable for running on buildsystems
+%global tests_enabled 0
+
+Summary: System and process monitoring utilities
+Name: procps-ng
+Version: 3.3.10
+Release: 27%{?dist}
+License: GPL+ and GPLv2 and GPLv2+ and GPLv3+ and LGPLv2+
+Group: Applications/System
+URL: https://sourceforge.net/projects/procps-ng/
+
+Source: http://downloads.sourceforge.net/%{name}/%{name}-%{version}.tar.xz
+
+Patch0: procps-ng-3.3.10-pmap-skip-vmflags.patch
+Patch1: procps-ng-3.3.10-free-uninitialized-errno.patch
+Patch2: procps-ng-3.3.10-ps-thcount-format-option.patch
+Patch3: procps-ng-3.3.10-vmstat-devlen.patch
+Patch4: procps-ng-3.3.10-find_elf_note-memory-error-fix.patch
+Patch5: procps-ng-3.3.10-ps-scattered-thread-cgroups.patch
+Patch6: procps-ng-3.3.10-vmstat-long-device-name.patch
+Patch7: procps-ng-3.3.10-ps-full-wchan-name.patch
+Patch8: procps-ng-3.3.10-pmap-lines-twice.patch
+Patch9: procps-ng-3.3.10-slabtop-use-val-float.patch
+Patch10: procps-ng-3.3.10-sysctl-conf-manpage-predef-note.patch 
+Patch11: procps-ng-3.3.10-top-instant-cpu-stats.patch
+Patch12: procps-ng-3.3.10-sysctl-man-conf-override-hint.patch
+Patch13: procps-ng-3.3.10-top-strange-mem-val-scaling.patch 
+Patch14: procps-ng-3.3.10-sysctl-empty-value-allowed.patch
+Patch15: procps-ng-3.3.10-top-locale-independent-float-delay.patch
+Patch16: procps-ng-3.3.10-free-mem-petabytes-segfault.patch
+Patch17: procps-ng-3.3.10-ps-new-option-loginid-luid.patch
+Patch18: procps-ng-3.3.10-CVE-2018-1124.patch
+Patch19: procps-ng-3.3.10-CVE-2018-1122.patch
+Patch20: procps-ng-3.3.10-recognize_sched_deadline.patch
+Patch21: procps-ng-3.3.10-free-counts-unreclaim-slabs-in-avail-mem.patch
+Patch22: procps-ng-3.3.10-top-segv-on-double-exit.patch
+
+
+Requires(post): /sbin/ldconfig
+Requires(postun): /sbin/ldconfig
+
+BuildRequires: ncurses-devel
+BuildRequires: libtool
+BuildRequires: autoconf
+BuildRequires: automake
+BuildRequires: gettext-devel
+BuildRequires: systemd-devel
+
+%if %{tests_enabled}
+BuildRequires: dejagnu
+%endif
+
+Provides: procps = %{version}-%{release}
+Obsoletes: procps < 3.2.9-1
+
+# usrmove hack - will be removed once initscripts are fixed
+Provides: /sbin/sysctl
+Provides: /bin/ps
+
+%description
+The procps package contains a set of system utilities that provide
+system information. Procps includes ps, free, skill, pkill, pgrep,
+snice, tload, top, uptime, vmstat, w, watch and pwdx. The ps command
+displays a snapshot of running processes. The top command provides
+a repetitive update of the statuses of running processes. The free
+command displays the amounts of free and used memory on your
+system. The skill command sends a terminate command (or another
+specified signal) to a specified set of processes. The snice
+command is used to change the scheduling priority of specified
+processes. The tload command prints a graph of the current system
+load average to a specified tty. The uptime command displays the
+current time, how long the system has been running, how many users
+are logged on, and system load averages for the past one, five,
+and fifteen minutes. The w command displays a list of the users
+who are currently logged on and what they are running. The watch
+program watches a running program. The vmstat command displays
+virtual memory statistics about processes, memory, paging, block
+I/O, traps, and CPU activity. The pwdx command reports the current
+working directory of a process or processes.
+
+%package devel
+Summary:  System and process monitoring utilities
+Group:    Development/Libraries
+Requires: %{name}%{?_isa} = %{version}-%{release}
+Provides: procps-devel = %{version}-%{release}
+Obsoletes: procps-devel < 3.2.9-1
+
+%description devel
+System and process monitoring utilities development headers
+
+%package i18n
+Summary:  Internationalization pack for procps-ng
+Group:    Applications/System
+Requires: %{name} = %{version}-%{release}
+
+%description i18n
+Internationalization pack for procps-ng
+
+
+%prep
+%setup -q -n %{name}-%{version}
+
+%patch0 -p1
+%patch1 -p1
+%patch2 -p1
+%patch3 -p1
+%patch4 -p1
+%patch5 -p1
+%patch6 -p1
+%patch7 -p1
+%patch8 -p1
+%patch9 -p1
+%patch10 -p1
+%patch11 -p1
+%patch12 -p1
+%patch13 -p1
+%patch14 -p1
+%patch15 -p1
+%patch16 -p1
+%patch17 -p1
+%patch18 -p1
+%patch19 -p1
+%patch20 -p1
+%patch21 -p1
+%patch22 -p1
+
+
+%build
+# The following stuff is needed for git archives only
+#echo "%{version}" > .tarball-version
+#./autogen.sh
+
+autoreconf --verbose --force --install
+
+./configure --prefix=/ \
+            --bindir=%{_bindir} \
+            --sbindir=%{_sbindir} \
+            --libdir=%{_libdir} \
+            --mandir=%{_mandir} \
+            --includedir=%{_includedir} \
+            --sysconfdir=%{_sysconfdir} \
+            --localedir=%{_datadir}/locale \
+            --docdir=/unwanted \
+            --disable-static \
+            --enable-w-from \
+            --disable-kill \
+            --disable-rpath \
+            --enable-watch8bit \
+            --enable-skill \
+            --enable-sigwinch \
+            --enable-libselinux \
+            --with-systemd \
+            --disable-pidof \
+            --disable-modern-top
+
+make CFLAGS="%{optflags}"
+
+
+%if %{tests_enabled}
+%check
+make check
+%endif
+
+
+%install
+make DESTDIR=%{buildroot} install
+
+# --localedir doesn't work correctly
+mv %{buildroot}/share/locale %{buildroot}%{_datadir}
+rmdir %{buildroot}/share
+
+# translated man pages
+#find man-po/ -type d -maxdepth 1 -mindepth 1 | while read dirname; do cp -a $dirname %{buildroot}/usr/share/man/ ; done
+
+%post -p /sbin/ldconfig
+
+%postun -p /sbin/ldconfig
+
+%files
+%doc AUTHORS Documentation/BUGS COPYING COPYING.LIB Documentation/FAQ NEWS README top/README.top Documentation/TODO
+
+%{_libdir}/libprocps.so.*
+%{_bindir}/*
+%{_sbindir}/*
+%{_mandir}/man1/*
+%{_mandir}/man8/*
+%{_mandir}/man5/*
+#%%{_mandir}/*/man1/*
+#%%{_mandir}/*/man8/*
+#%%{_mandir}/*/man5/*
+
+%exclude %{_libdir}/libprocps.la
+%exclude %{_sysconfdir}/sysctl.conf
+%exclude /unwanted/*
+
+%files devel
+%doc COPYING COPYING.LIB
+%{_libdir}/libprocps.so
+%{_libdir}/pkgconfig/libprocps.pc
+%{_includedir}/proc
+%{_mandir}/man3/*
+
+%files i18n
+%{_datadir}/locale/*
+
+%changelog
+* Thu Aug 08 2019 Jan Rybar <jrybar@redhat.com> - 3.3.10-27
+- top: segfault if killed by sigterm in batch mode
+- Resolves: rhbz#1737552
+
+* Fri Apr 12 2019 Jan Rybar <jrybar@redhat.com> - 3.3.10-26
+- free: unreclaimable slabs counted into free memory, used mem incorrect
+- Resolves: rhbz#1699264
+
+* Wed Mar 27 2019 Jan Rybar <jrybar@redhat.com> - 3.3.10-25
+- ps: recognize SCHED_DEADLINE in CLS field, upstream backport
+- Resolves: rhbz#1692843
+
+* Tue Feb 26 2019 Jan Rybar <jrybar@redhat.com> - 3.3.10-24
+- top: Do not default to the cwd in configs_read()
+- Resolves: rhbz#1577023
+
+* Tue May 15 2018 Kamil Dudka <kdudka@redhat.com> - 3.3.10-23
+- check for truncation after calling snprintf()
+- Related: CVE-2018-1124
+
+* Fri May 11 2018 Kamil Dudka <kdudka@redhat.com> - 3.3.10-22
+- fix integer overflows leading to heap overflow in file2strvec()
+- Resolves: CVE-2018-1124
+
+* Thu Apr 19 2018 Jan Rybar <jrybar@redhat.com> - 3.3.10-21
+- ps: new format option LUID (LoginId)
+- Resolves: rhbz#1518986
+
+* Mon Jan 15 2018 Jan Rybar <jrybar@redhat.com> - 3.3.10-20
+- free: segfault when system memory exceeds petabytes
+- Resolves: rhbz#1263765
+
+* Mon Jan 15 2018 Jan Rybar <jrybar@redhat.com> - 3.3.10-19
+- top: locale independent float character in delay now accepted
+- Resolves: rhbz#1182248
+
+* Thu Jan 04 2018 Jan Rybar <jrybar@redhat.com> - 3.3.10-18
+- sysctl: empty value is now accepted
+- Resolves: rhbz#1507356
+
+* Wed Sep 06 2017 Jan Rybar <jrybar@redhat.com> - 3.3.10-17
+- top: strange unit scaling with high memory values
+- Resolves: rhbz#1253851
+
+* Wed May 31 2017 Jan Rybar <jrybar@redhat.com> - 3.3.10-16
+- sysctl manpage: Added explanation of conf files precedence
+- Resolves: rhbz#1456905
+
+* Fri Apr 07 2017 Jan Rybar <jrybar@redhat.com> - 3.3.10-15
+- top - real CPU statistics instead of since-boot are shown at start
+- Resolves: rhbz#1182327
+
+* Fri Apr 07 2017 Jan Rybar <jrybar@redhat.com> - 3.3.10-14
+- sysctl.conf manpage: note about predefined values added
+- Resolves: rhbz#1439837
+
+* Mon Mar 13 2017 Jan Rybar <jrybar@redhat.com> - 3.3.10-13
+- slabtop: incorrect computation of "used" value, use float to fix
+- Resolves: rhbz#1329958
+
+* Mon Feb 20 2017 Jan Rybar <jrybar@redhat.com> - 3.3.10-12
+- pmap no longer shows each line twice with blank values on newer kernels
+- Resolves: rhbz#1330417
+
+* Tue Jan 31 2017 Jan Rybar <jrybar@redhat.com> - 3.3.10-11
+- ps no longer removes 'do_' and 'sys_' from wchan data
+- Resolves: rhbz#1373246
+
+* Tue Jul 26 2016 Jan Rybar <jrybar@redhat.com> - 3.3.10-10
+- Fixes sysinfo - devices with name longer than 20 chars are mistaken for partitions
+- Resolves: rhbz#1169349
+
+* Thu Jul 07 2016 Jan Rybar <jrybar@redhat.com> - 3.3.10-9
+- Fixes showing same cgroups for threads under process by adding format option
+- Resolves: rhbz#1284087
+
+* Mon Jul 04 2016 Jan Rybar <jrybar@redhat.com> - 3.3.10-8
+- Fixes obtaining environment variables in find_elf_note function
+- Resolves: rhbz#1287752
+ 
+* Thu Jun 09 2016 Jan Rybar <jrybar@redhat.com> - 3.3.10-7
+- Fixing sysinfo - devices with length exceeding 15 chars are not displayed in vmstat -d
+- Resolves: #1169349
+
+* Mon Jun 06 2016 Jan Rybar <jrybar@redhat.com> - 3.3.10-6
+- #1174311 - ps - thcount not recognized as a format option
+- Resolves: #1174311
+
+* Tue Dec 01 2015 Jaromir Capik <jcapik@redhat.com> - 3.3.10-5
+- #1287038 - free - error while parsing arguments
+- Resolves: #1287038
+
+* Tue Nov 24 2015 Jaromir Capik <jcapik@redhat.com> - 3.3.10-4
+- #1262864 - Correctly skip vmflags (and other keys starting with A-Z)
+- Resolves: #1262864
+
+* Mon Oct 06 2014 Jaromir Capik <jcapik@redhat.com> - 3.3.10-3
+- Disabling translated man pages due to conflicts with man-pages-*
+- Removing /etc/sysctl.d (quietly stolen by systemd)
+- Related: rhbz#1119263 rhbz#1119260 rhbz#1060715 rhbz#1113206
+- Related: rhbz#1112734 rhbz#1078310 rhbz#1116309 rhbz#1070736
+
+* Tue Sep 23 2014 Jaromir Capik <jcapik@redhat.com> - 3.3.10-2
+- Replacing RC tarball with final 3.3.10 release
+- Related: rhbz#1119263 rhbz#1119260 rhbz#1060715 rhbz#1113206
+- Related: rhbz#1112734 rhbz#1078310 rhbz#1116309 rhbz#1070736
+
+* Tue Sep 09 2014 Jaromir Capik <jcapik@redhat.com> - 3.3.10-1
+- Upgrading to 3.3.10
+- top.1: physical memory - has used / is using (#1119263)
+- Include man pages for openproc, readproc and readproctab (#1119260)
+- ps -p cycles over all PIDs instead of just one (#1060715)
+- Remove explicit dependency on systemd-libs package (#1113206)
+- Allow longer usernames to display in ps output (#1112734)
+- w doesn't display FROM by default (#1078310)
+- Return value of pgrep is incorrect (#1116309)
+- Should shared memory be accounted in cached in free output? (#1070736)
+- Resolves: rhbz#1119263 rhbz#1119260 rhbz#1060715 rhbz#1113206
+- Resolves: rhbz#1112734 rhbz#1078310 rhbz#1116309 rhbz#1070736
+
+* Thu Feb 27 2014 Jaromir Capik <jcapik@redhat.com> - 3.3.9-6
+- Subtracting Shmem from Cached (#1070736)
+- Resolves: rhbz#1070736
+
+* Thu Feb 06 2014 Jaromir Capik <jcapik@redhat.com> - 3.3.9-5
+- Support for timestamps & wide diskstat (#1053428, #1025833)
+- Fixing fd leak in watch
+- Fixing format-security build issues
+- Skipping trailing zeros in read_unvectored (#1057600)
+- Resolves: rhbz#1053428, Related: rhbz#1025833
+
+* Fri Jan 24 2014 Daniel Mach <dmach@redhat.com> - 3.3.9-4
+- Mass rebuild 2014-01-24
+
+* Mon Jan 20 2014 Jaromir Capik <jcapik@redhat.com> - 3.3.9-3
+- 'vmstat -w' was not wide enough (#1025833)
+- Related: rhbz#1025833
+
+* Fri Dec 27 2013 Daniel Mach <dmach@redhat.com> - 3.3.9-2
+- Mass rebuild 2013-12-27
+
+* Tue Dec 03 2013 Jaromir Capik <jcapik@redhat.com> - 3.3.9-1
+- Update to 3.3.9
+- Resolves: rhbz#1025833 rhbz#1025774 rhbz#1027109
+
+* Mon Oct 21 2013 Jaromir Capik <jcapik@redhat.com> - 3.3.8-15
+- Fixing incorrect format specifier (introduced with namespaces)
+
+* Tue Sep 17 2013 Aristeu Rozanski <aris@redhat.com> - 3.3.8-14
+- Introduce namespaces support (#980516)
+
+* Fri Aug 09 2013 Jaromir Capik <jcapik@redhat.com> - 3.3.8-13
+- Including forgotten man fixes (#948522)
+
+* Wed Aug 07 2013 Jaromir Capik <jcapik@redhat.com> - 3.3.8-12
+- Fixing the license tag
+
+* Wed Aug 07 2013 Jaromir Capik <jcapik@redhat.com> - 3.3.8-11
+- Support for libselinux (#975459)
+- Support for systemd (#994457)
+- Support for 'Shmem' in free (#993271)
+
+* Sun Aug 04 2013 Fedora Release Engineering <rel-eng@lists.fedoraproject.org> - 3.3.8-10
+- Rebuilt for https://fedoraproject.org/wiki/Fedora_20_Mass_Rebuild
+
+* Fri Jul 19 2013 Jaromir Capik <jcapik@redhat.com> - 3.3.8-9
+- RH man page scan (#948522)
+
+* Tue Jul 02 2013 Jaromir Capik <jcapik@redhat.com> - 3.3.8-8
+- Extending the end-of-job patch disabling the screen content restoration
+
+* Mon Jul 01 2013 Jaromir Capik <jcapik@redhat.com> - 3.3.8-7
+- Disabling screen content restoration when exiting 'top' (#977561)
+- Enabling SIGWINCH flood prevention
+
+* Wed Jun 26 2013 Jaromir Capik <jcapik@redhat.com> - 3.3.8-6
+- Avoiding "write error" messages when piping to grep (#976199)
+
+* Wed Jun 26 2013 Jaromir Capik <jcapik@redhat.com> - 3.3.8-5
+- Disabling tests - unsuitable for running on buildsystems
+
+* Mon Jun 17 2013 Jaromir Capik <jcapik@redhat.com> - 3.3.8-4
+- Enabling skill and snice (#974752)
+
+* Wed Jun 12 2013 Jaromir Capik <jcapik@redhat.com> - 3.3.8-3
+- Adding major version in the libnuma soname
+
+* Thu May 30 2013 Jaromir Capik <jcapik@redhat.com> - 3.3.8-2
+- watch: enabling UTF-8 (#965867)
+
+* Wed May 29 2013 Jaromir Capik <jcapik@redhat.com> - 3.3.8-1
+- Update to 3.3.8
+
+* Wed May 22 2013 Jaromir Capik <jcapik@redhat.com> - 3.3.7-4
+- top: inoculated against a window manager like 'screen' (#962022)
+
+* Tue Apr 16 2013 Jaromir Capik <jcapik@redhat.com> - 3.3.7-3
+- Avoid segfaults when reading zero bytes - file2str (#951391)
+
+* Mon Apr 15 2013 Jaromir Capik <jcapik@redhat.com> - 3.3.7-2
+- Moving libprocps.pc to the devel subpackage (#951726)
+
+* Tue Mar 26 2013 Jaromir Capik <jcapik@redhat.com> - 3.3.7-1
+- Update to 3.3.7
+- Reverting upstream commit for testsuite/unix.exp
+
+* Tue Feb 05 2013 Jaromir Capik <jcapik@redhat.com> - 3.3.6-4
+- Fixing empty pmap output on ppc/s390 (#906457)
+
+* Tue Jan 15 2013 Jaromir Capik <jcapik@redhat.com> - 3.3.6-3
+- Typo in the description, pdwx instead of pwdx (#891476)
+
+* Tue Jan 08 2013 Jaromir Capik <jcapik@redhat.com> - 3.3.6-2
+- Rebuilding with tests disabled (koji issue #853084)
+
+* Tue Jan 08 2013 Jaromir Capik <jcapik@redhat.com> - 3.3.6-1
+- Update to 3.3.6
+- Changing URL/Source from gitorious to recently created sourceforge page
+- Replacing autogen.sh with autoreconf
+
+* Mon Jan 07 2013 Jaromir Capik <jcapik@redhat.com> - 3.3.5-1
+- Update to 3.3.5
+
+* Tue Dec 11 2012 Jaromir Capik <jcapik@redhat.com> - 3.3.4-2
+- fixing the following regressions:
+-   negative ETIME field in ps (#871819)
+-   procps states a bug is hit when receiving a signal (#871824)
+-   allow core file generation by ps command (#871825)
+
+* Tue Dec 11 2012 Jaromir Capik <jcapik@redhat.com> - 3.3.4-1
+- Update to 3.3.4
+
+* Tue Sep 25 2012 Jaromir Capik <jcapik@redhat.com> - 3.3.3-3.20120807git
+- SELinux spelling fixes (#859900)
+
+* Tue Aug 21 2012 Jaromir Capik <jcapik@redhat.com> - 3.3.3-2.20120807git
+- Tests enabled
+
+* Tue Aug 07 2012 Jaromir Capik <jcapik@redhat.com> - 3.3.3-1.20120807git
+- Update to 3.3.3-20120807git
+
+* Sat Jul 21 2012 Fedora Release Engineering <rel-eng@lists.fedoraproject.org> - 3.3.2-4
+- Rebuilt for https://fedoraproject.org/wiki/Fedora_18_Mass_Rebuild
+
+* Thu Mar 08 2012 Jaromir Capik <jcapik@redhat.com> - 3.3.2-3
+- Second usrmove hack - providing /bin/ps
+
+* Tue Mar 06 2012 Jaromir Capik <jcapik@redhat.com> - 3.3.2-2
+- Fixing requires in the devel subpackage (missing %{?_isa} macro)
+- License statement clarification (upstream patch referrenced in the spec header)
+
+* Mon Feb 27 2012 Jaromir Capik <jcapik@redhat.com> - 3.3.2-1
+- Initial version