Blob Blame History Raw
diff -up chromium-103.0.5060.53/third_party/catapult/common/py_vulcanize/third_party/rjsmin/rjsmin.c.12 chromium-103.0.5060.53/third_party/catapult/common/py_vulcanize/third_party/rjsmin/rjsmin.c
--- chromium-103.0.5060.53/third_party/catapult/common/py_vulcanize/third_party/rjsmin/rjsmin.c.12	2022-06-28 12:50:10.167324583 +0000
+++ chromium-103.0.5060.53/third_party/catapult/common/py_vulcanize/third_party/rjsmin/rjsmin.c	2021-11-14 19:50:55.000000000 +0000
@@ -1,5 +1,5 @@
 /*
- * Copyright 2011 - 2015
+ * Copyright 2011 - 2021
  * Andr\xe9 Malo or his licensors, as applicable
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
@@ -18,21 +18,21 @@
 #include "cext.h"
 EXT_INIT_FUNC;
 
-#define RJSMIN_DULL_BIT           (1 << 0)
-#define RJSMIN_PRE_REGEX_BIT      (1 << 1)
-#define RJSMIN_REGEX_DULL_BIT     (1 << 2)
-#define RJSMIN_REGEX_CC_DULL_BIT  (1 << 3)
-#define RJSMIN_ID_LIT_BIT         (1 << 4)
-#define RJSMIN_ID_LIT_O_BIT       (1 << 5)
-#define RJSMIN_ID_LIT_C_BIT       (1 << 6)
-#define RJSMIN_STRING_DULL_BIT    (1 << 7)
-#define RJSMIN_SPACE_BIT          (1 << 8)
-#define RJSMIN_POST_REGEX_OFF_BIT (1 << 9)
+#define RJSMIN_DULL_BIT           (1 <<  0)
+#define RJSMIN_PRE_REGEX_BIT      (1 <<  1)
+#define RJSMIN_REGEX_DULL_BIT     (1 <<  2)
+#define RJSMIN_REGEX_CC_DULL_BIT  (1 <<  3)
+#define RJSMIN_ID_LIT_BIT         (1 <<  4)
+#define RJSMIN_ID_LIT_O_BIT       (1 <<  5)
+#define RJSMIN_ID_LIT_C_BIT       (1 <<  6)
+#define RJSMIN_STRING_DULL_BIT    (1 <<  7)
+#define RJSMIN_SPACE_BIT          (1 <<  8)
+#define RJSMIN_POST_REGEX_OFF_BIT (1 <<  9)
+#define RJSMIN_A_Z_BIT            (1 << 10)
 
-#ifdef EXT3
-typedef Py_UNICODE rchar;
-#else
 typedef unsigned char rchar;
+#ifdef U
+#undef U
 #endif
 #define U(c) ((rchar)(c))
 
@@ -66,66 +66,120 @@ typedef unsigned char rchar;
 #define RJSMIN_IS_PRE_REGEX_1(c) ((U(c) <= 127) && \
     (rjsmin_charmask[U(c) & 0x7F] & RJSMIN_PRE_REGEX_BIT))
 
+#define RJSMIN_IS_A_Z(c) ((U(c) <= 127) && \
+    (rjsmin_charmask[U(c) & 0x7F] & RJSMIN_A_Z_BIT))
+
 
 static const unsigned short rjsmin_charmask[128] = {
-    396, 396, 396, 396, 396, 396, 396, 396,
-    396, 396,   2, 396, 396,   2, 396, 396,
-    396, 396, 396, 396, 396, 396, 396, 396,
-    396, 396, 396, 396, 396, 396, 396, 396,
-    396, 687, 588, 653, 765, 653, 143, 588,
-    687, 205, 653, 237, 143, 237, 141, 648,
-    765, 765, 765, 765, 765, 765, 765, 765,
-    765, 765, 143, 143, 653, 143, 653, 143,
-    653, 765, 765, 765, 765, 765, 765, 765,
-    765, 765, 765, 765, 765, 765, 765, 765,
-    765, 765, 765, 765, 765, 765, 765, 765,
-    765, 765, 765, 683, 513, 197, 653, 765,
-    653, 765, 765, 765, 765, 765, 765, 765,
-    765, 765, 765, 765, 765, 765, 765, 765,
-    765, 765, 765, 765, 765, 765, 765, 765,
-    765, 765, 765, 687, 143, 207, 653, 765
+     396,  396,  396,  396,  396,  396,  396,  396,
+     396,  396,    2,  396,  396,    2,  396,  396,
+     396,  396,  396,  396,  396,  396,  396,  396,
+     396,  396,  396,  396,  396,  396,  396,  396,
+     396,  687,  588,  653,  765,  653,  143,  588,
+     687,  205,  655,  239,  143,  239,  141,  648,
+     765,  765,  765,  765,  765,  765,  765,  765,
+     765,  765,  143,  143,  653,  143,  653,  143,
+     653,  765,  765,  765,  765,  765,  765,  765,
+     765,  765,  765,  765,  765,  765,  765,  765,
+     765,  765,  765,  765,  765,  765,  765,  765,
+     765,  765,  765,  683,  513,  197,  653,  765,
+     588, 1789, 1789, 1789, 1789, 1789, 1789, 1789,
+    1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789,
+    1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789,
+    1789, 1789, 1789,  687,  143,  207,  653,  765
 };
 
+
 static Py_ssize_t
 rjsmin(const rchar *source, rchar *target, Py_ssize_t length,
        int keep_bang_comments)
 {
-    const rchar *reset, *pcreset = NULL, *pctoken = NULL, *xtarget,
-                *sentinel = source + length;
-    rchar *tstart = target;
-    int post_regex = 0;
-    rchar c, quote, spaced = U(' ');
+    const rchar
+        *sentinel = source + length, /* never hit this pointer (source buf) */
+        *reset,          /* reset pointer (source buf) */
+        *pcreset = NULL, /* pre-comment reset pointer (source buf) */
+        *pctoken = NULL, /* pre-comment token pointer (target buf)
+                          * Pointing to before the last kept comment, if any */
+        *rsreset = NULL, /* regex-with-method reset pointer (source buf) */
+        *xtarget;        /* pre-regex-2 target pointer */
+
+    rchar *tstart = target, /* Target start pointer for reference */
+        *rtreset = NULL;    /* regex-with-method reset pointer (target buf) */
+
+    int rsdot,              /* seen dot after regex-with-method pattern? */
+        post_regex = 0;
+    rchar c, quote,
+        spaced = U(' ');    /* the last seen kind of space (nl taking prio),
+                             * init with ' ' */
 
+    /* main loop */
     while (source < sentinel) {
         c = *source++;
+
         if (RJSMIN_IS_DULL(c)) {
             if (post_regex) post_regex = 0;
             if (pctoken) pctoken = NULL;
             if (spaced == U('\n')) spaced = U(' ');
+            if (rsreset) {
+                /* both a-z and . are covered by "dull" */
+                if (!rsdot) {
+                    if (c != U('.')) {
+                        /* reset regex-with-method to the starting slash */
+                        source = rsreset;
+                        target = rtreset;
+                        rsreset = NULL;
+                        continue; /* main loop */
+                    }
+                    /* Found a dot after possible regex, looking for a-z now */
+                    rsdot = 1;
+                }
+                else if (!RJSMIN_IS_A_Z(c)) {
+                    /* reset regex-with-method to the starting slash */
+                    source = rsreset;
+                    target = rtreset;
+                    rsreset = NULL;
+                    continue; /* main loop */
+                }
+                else {
+                    /* Successfull finish the regex-with-method match */
+                    rsreset = NULL;
+                }
+            }
 
             *target++ = c;
-            continue;
+            continue; /* main loop */
         }
+
         switch (c) {
 
         /* String */
-        case U('\''): case U('"'):
+        case U('\''): case U('"'): case U('`'):
             if (post_regex) post_regex = 0;
             if (pctoken) pctoken = NULL;
             if (spaced == U('\n')) spaced = U(' ');
+            if (rsreset) {
+                /* reset regex-with-method to the starting slash */
+                source = rsreset;
+                target = rtreset;
+                rsreset = NULL;
+                continue; /* main loop */
+            }
 
             reset = source;
             *target++ = quote = c;
+
+            /* string loop */
             while (source < sentinel) {
                 c = *source++;
                 *target++ = c;
                 if (RJSMIN_IS_STRING_DULL(c))
-                    continue;
+                    continue; /* string loop */
+
                 switch (c) {
-                case U('\''): case U('"'):
+                case U('\''): case U('"'): case U('`'):
                     if (c == quote)
-                        goto cont;
-                    continue;
+                        goto cont; /* main loop */
+                    continue; /* string loop */
                 case U('\\'):
                     if (source < sentinel) {
                         c = *source++;
@@ -134,13 +188,18 @@ rjsmin(const rchar *source, rchar *targe
                             && *source == U('\n'))
                             *target++ = *source++;
                     }
-                    continue;
+                    continue; /* string loop */
+                case U('\r'): case U('\n'):
+                    if (quote != U('`'))
+                        break; /* string reset */
+                    continue; /* string loop */
                 }
-                break;
+                break; /* string reset */
             }
+            /* string reset */
             target -= source - reset;
             source = reset;
-            continue;
+            continue; /* main loop */
 
         /* Comment or Regex or something else entirely */
         case U('/'):
@@ -148,6 +207,13 @@ rjsmin(const rchar *source, rchar *targe
                 if (post_regex) post_regex = 0;
                 if (pctoken) pctoken = NULL;
                 if (spaced == U('\n')) spaced = U(' ');
+                if (rsreset) {
+                    /* reset regex-with-method to the starting slash */
+                    source = rsreset;
+                    target = rtreset;
+                    rsreset = NULL;
+                    continue; /* main loop */
+                }
 
                 *target++ = c;
             }
@@ -157,7 +223,19 @@ rjsmin(const rchar *source, rchar *targe
                 case U('*'): case U('/'):
                     goto skip_or_copy_ws;
 
+            /* Regex or slash */
                 default:
+                    if (rsreset) {
+                        /* reset regex-with-method to the starting slash */
+                        if (post_regex) post_regex = 0;
+                        if (pctoken) pctoken = NULL;
+                        if (spaced == U('\n')) spaced = U(' ');
+                        source = rsreset;
+                        target = rtreset;
+                        rsreset = NULL;
+                        continue; /* main loop */
+                    }
+
                     xtarget = NULL;
                     if (   target == tstart
                         || RJSMIN_IS_PRE_REGEX_1(*((pctoken ? pctoken : target)
@@ -176,99 +254,148 @@ rjsmin(const rchar *source, rchar *targe
                                 || !RJSMIN_IS_ID_LITERAL(*(xtarget - 7))
                             )
                         )) {
-
-            /* Regex */
+                        /* nothing to do here, continuing down below
+                         * We could unset rsreset here, but we know it already
+                         * is. */
+                        ;
+                    }
+                    else if (*((pctoken ? pctoken : target) - 1) == U(')')) {
+                        xtarget = NULL;
+                        rsreset = source;
+                        rtreset = target + 1;
+                        rsdot = 0;
+                    }
+                    else {
+                        /* Just a slash */
                         if (post_regex) post_regex = 0;
                         if (pctoken) pctoken = NULL;
+                        if (spaced == U('\n')) spaced = U(' ');
 
-                        reset = source;
-                        if (spaced == U('\n')) {
-                            spaced = U(' ');
-                            if (xtarget)
-                                *target++ = U('\n');
-                        }
+                        *target++ = c;
+                        continue; /* main loop */
+                    }
 
-                        *target++ = U('/');
-                        while (source < sentinel) {
-                            c = *source++;
-                            *target++ = c;
-                            if (RJSMIN_IS_REGEX_DULL(c))
-                                continue;
-                            switch (c) {
-                            case U('/'):
-                                post_regex = 1;
-                                goto cont;
-                            case U('\\'):
-                                if (source < sentinel) {
-                                    c = *source++;
-                                    *target++ = c;
-                                    if (c == U('\r') || c == U('\n'))
-                                        break;
-                                }
-                                continue;
-                            case U('['):
-                                while (source < sentinel) {
-                                    c = *source++;
-                                    *target++ = c;
-                                    if (RJSMIN_IS_REGEX_CC_DULL(c))
-                                        continue;
-                                    switch (c) {
-                                    case U('\\'):
-                                        if (source < sentinel) {
-                                            c = *source++;
-                                            *target++ = c;
-                                            if (c == U('\r') || c == U('\n'))
-                                                break;
-                                        }
-                                        continue;
-                                    case U(']'):
-                                        goto cont_regex;
+                    if (post_regex) post_regex = 0;
+                    if (pctoken) pctoken = NULL;
+
+                    reset = source;
+                    if (spaced == U('\n')) {
+                        spaced = U(' ');
+                        if (xtarget)
+                            *target++ = U('\n');
+                    }
+
+                    *target++ = U('/');
+
+                    /* regex loop */
+                    while (source < sentinel) {
+                        c = *source++;
+                        *target++ = c;
+
+                        if (RJSMIN_IS_REGEX_DULL(c))
+                            continue; /* regex loop */
+
+                        switch (c) {
+                        case U('/'):
+                            while (source < sentinel
+                                   && RJSMIN_IS_A_Z(*source))
+                                *target++ = *source++;
+                            post_regex = !rsreset;
+                            /* This check is supposed to make it faster.
+                             * It doesn't. It slows it down. I wonder why...
+                             */
+                            /*
+                             * if (!post_regex
+                             *     && source < sentinel - 1
+                             *     && *source == U('.')
+                             *     && RJSMIN_IS_A_Z(*(source + 1)))
+                             *     rsreset = NULL;
+                             */
+
+                            goto cont; /* main loop */
+
+                        case U('\\'):
+                            if (source < sentinel) {
+                                c = *source++;
+                                *target++ = c;
+                                if (c == U('\r') || c == U('\n'))
+                                    break; /* regex reset */
+                            }
+                            continue; /* regex loop */
+
+                        case U('['):
+                            /* regex CC loop */
+                            while (source < sentinel) {
+                                c = *source++;
+                                *target++ = c;
+
+                                if (RJSMIN_IS_REGEX_CC_DULL(c))
+                                    continue; /* regex CC loop */
+
+                                switch (c) {
+                                case U('\\'):
+                                    if (source < sentinel) {
+                                        c = *source++;
+                                        *target++ = c;
+                                        if (c == U('\r') || c == U('\n'))
+                                            break; /* regex reset */
                                     }
+                                    continue; /* regex CC loop */
+
+                                case U(']'):
+                                    goto cont_regex; /* regex loop */
                                 }
-                                break;
                             }
-                            break;
-                        cont_regex:
-                            continue;
+                            break; /* regex reset */
+
                         }
-                        target -= source - reset;
-                        source = reset;
-                    }
-                    else {
-            /* Just a slash */
-                        if (post_regex) post_regex = 0;
-                        if (pctoken) pctoken = NULL;
-                        if (spaced == U('\n')) spaced = U(' ');
+                        break; /* regex reset */
 
-                        *target++ = c;
+                    cont_regex:
+                        continue; /* regex loop */
                     }
-                    continue;
+
+                    /* regex reset */
+                    target -= source - reset;
+                    source = reset;
+                    rsreset = NULL;
+                    continue; /* main loop */
                 }
             }
-            continue;
+            continue;  /* main loop */ /* LCOV_EXCL_LINE */
 
         /* Whitespace */
         default:
         skip_or_copy_ws:
+            /* remember if we've seen a newline, start with: no */
             quote = U(' ');
             --source;
+
+            /* space loop */
             while (source < sentinel) {
                 c = *source++;
                 if (RJSMIN_IS_SPACE(c))
-                    continue;
+                    continue; /* space loop */
+
                 switch (c) {
                 case U('\r'): case U('\n'):
                     quote = U('\n');
-                    continue;
+                    continue; /* space loop */
+
+                /* Can only be a comment at this point
+                 * (or ending prematurely) */
                 case U('/'):
                     if (source < sentinel) {
                         switch (*source) {
+
+                        /* multiline comment */
                         case U('*'):
                             reset = source++;
                             /* copy bang comment, if requested */
                             if (   keep_bang_comments && source < sentinel
                                 && *source == U('!')) {
                                 if (!pctoken) {
+                                    /* Backtracking if ending prematurely */
                                     pctoken = target;
                                     pcreset = reset;
                                 }
@@ -276,6 +403,8 @@ rjsmin(const rchar *source, rchar *targe
                                 *target++ = U('/');
                                 *target++ = U('*');
                                 *target++ = *source++;
+
+                                /* comment loop */
                                 while (source < sentinel) {
                                     c = *source++;
                                     *target++ = c;
@@ -283,20 +412,21 @@ rjsmin(const rchar *source, rchar *targe
                                         && *source == U('/')) {
                                         *target++ = *source++;
                                         reset = NULL;
-                                        break;
+                                        break; /* continue space loop */
                                     }
                                 }
                                 if (!reset)
-                                    continue;
+                                    continue; /* space loop */
 
+                                /* comment reset */
                                 target -= source - reset;
                                 source = reset;
                                 if (pcreset == reset) {
                                     pctoken = NULL;
                                     pcreset = NULL;
                                 }
-
                             }
+
                             /* strip regular comment */
                             else {
                                 while (source < sentinel) {
@@ -305,41 +435,52 @@ rjsmin(const rchar *source, rchar *targe
                                         && *source == U('/')) {
                                         ++source;
                                         reset = NULL;
-                                        break;
+                                        break; /* continue space loop */
                                     }
                                 }
                                 if (!reset)
-                                    continue;
+                                    continue; /* space loop */
+
+                                /* comment reset: fallback to slash */
                                 source = reset;
                                 *target++ = U('/');
                             }
-                            goto cont;
+                            goto cont; /* main loop */
+
+                        /* single line comment */
                         case U('/'):
                             ++source;
+
+                            /* single line comment loop */
                             while (source < sentinel) {
                                 c = *source++;
                                 switch (c) {
                                 case U('\n'):
-                                    break;
+                                    break; /* continue space loop */
+
                                 case U('\r'):
                                     if (source < sentinel
                                         && *source == U('\n'))
                                         ++source;
-                                    break;
+                                    break; /* continue space loop */
+
                                 default:
-                                    continue;
+                                    continue; /* single line comment loop */
                                 }
-                                break;
+                                break; /* continue space loop */
                             }
                             quote = U('\n');
-                            continue;
+                            continue; /* space loop */
                         }
                     }
                 }
+
+                /* No more spacy character found */
                 --source;
-                break;
+                break; /* end space loop */
             }
 
+            /* Copy a space if needed */
             if ((tstart < (pctoken ? pctoken : target) && source < sentinel)
                 && ((quote == U('\n')
                      && ((RJSMIN_IS_ID_LITERAL_CLOSE(*((pctoken ?
@@ -363,8 +504,9 @@ rjsmin(const rchar *source, rchar *targe
             pcreset = NULL;
             spaced = quote;
         }
+
     cont:
-        continue;
+        continue; /* main loop */
     }
     return (Py_ssize_t)(target - tstart);
 }
@@ -385,15 +527,15 @@ substitution regex.\n\
 :Note: This is a hand crafted C implementation built on the regex\n\
        semantics.\n\
 \n\
-:Parameters:\n\
-  `script` : ``str``\n\
+Parameters:\n\
+  script (str):\n\
     Script to minify\n\
 \n\
-  `keep_bang_comments` : ``bool``\n\
+  keep_bang_comments (bool):\n\
     Keep comments starting with an exclamation mark? (``/*!...*/``)\n\
 \n\
-:Return: Minified script\n\
-:Rtype: ``str``");
+Returns:\n\
+  str: Minified script");
 
 static PyObject *
 rjsmin_jsmin(PyObject *self, PyObject *args, PyObject *kwds)
@@ -404,15 +546,15 @@ rjsmin_jsmin(PyObject *self, PyObject *a
     int keep_bang_comments;
 #ifdef EXT2
     int uni;
-#define UOBJ "O"
 #endif
 #ifdef EXT3
-#define UOBJ "U"
+    int bytes;
+    rchar *bytescript;
 #endif
 
-    if (!PyArg_ParseTupleAndKeywords(args, kwds, UOBJ "|O", kwlist,
+    if (!PyArg_ParseTupleAndKeywords(args, kwds, "O|O", kwlist,
                                      &script, &keep_bang_comments_))
-        return NULL;
+        LCOV_EXCL_LINE_RETURN(NULL);
 
     if (!keep_bang_comments_)
         keep_bang_comments = 0;
@@ -425,28 +567,27 @@ rjsmin_jsmin(PyObject *self, PyObject *a
 #ifdef EXT2
     if (PyUnicode_Check(script)) {
         if (!(script = PyUnicode_AsUTF8String(script)))
-            return NULL;
+            LCOV_EXCL_LINE_RETURN(NULL);
         uni = 1;
     }
+    else if (!PyString_Check(script)) {
+        PyErr_SetString(PyExc_TypeError, "Unexpected type");
+        return NULL;
+    }
     else {
         if (!(script = PyObject_Str(script)))
-            return NULL;
+            LCOV_EXCL_LINE_RETURN(NULL);
         uni = 0;
     }
-#endif
-
-#ifdef EXT3
-    Py_INCREF(script);
-#define PyString_GET_SIZE PyUnicode_GET_SIZE
-#define PyString_AS_STRING PyUnicode_AS_UNICODE
-#define _PyString_Resize PyUnicode_Resize
-#define PyString_FromStringAndSize PyUnicode_FromUnicode
-#endif
-
     slength = PyString_GET_SIZE(script);
+
     if (!(result = PyString_FromStringAndSize(NULL, slength))) {
+        LCOV_EXCL_START
+
         Py_DECREF(script);
         return NULL;
+
+        LCOV_EXCL_STOP
     }
     Py_BEGIN_ALLOW_THREADS
     length = rjsmin((rchar *)PyString_AS_STRING(script),
@@ -456,30 +597,97 @@ rjsmin_jsmin(PyObject *self, PyObject *a
 
     Py_DECREF(script);
     if (length < 0) {
+        LCOV_EXCL_START
+
         Py_DECREF(result);
         return NULL;
+
+        LCOV_EXCL_STOP
     }
     if (length != slength && _PyString_Resize(&result, length) == -1)
-        return NULL;
+        LCOV_EXCL_LINE_RETURN(NULL);
 
-#ifdef EXT2
     if (uni) {
         script = PyUnicode_DecodeUTF8(PyString_AS_STRING(result),
                                       PyString_GET_SIZE(result), "strict");
         Py_DECREF(result);
-        if (!script)
-            return NULL;
-        result = script;
+        return script;
     }
-#endif
+
     return result;
+
+#else  /* EXT3 */
+
+    if (PyUnicode_Check(script)) {
+        bytes = 0;
+        script = PyUnicode_AsUTF8String(script);
+        bytescript = (rchar *)PyBytes_AS_STRING(script);
+        slength = PyBytes_GET_SIZE(script);
+    }
+    else if (PyBytes_Check(script)) {
+        bytes = 1;
+        Py_INCREF(script);
+        bytescript = (rchar *)PyBytes_AS_STRING(script);
+        slength = PyBytes_GET_SIZE(script);
+    }
+    else if (PyByteArray_Check(script)) {
+        bytes = 2;
+        Py_INCREF(script);
+        bytescript = (rchar *)PyByteArray_AS_STRING(script);
+        slength = PyByteArray_GET_SIZE(script);
+    }
+    else {
+        PyErr_SetString(PyExc_TypeError, "Unexpected type");
+        return NULL;
+    }
+
+    if (!(result = PyBytes_FromStringAndSize(NULL, slength))) {
+        LCOV_EXCL_START
+
+        Py_DECREF(script);
+        return NULL;
+
+        LCOV_EXCL_STOP
+    }
+    Py_BEGIN_ALLOW_THREADS
+    length = rjsmin(bytescript, (rchar *)PyBytes_AS_STRING(result),
+                    slength, keep_bang_comments);
+    Py_END_ALLOW_THREADS
+
+    Py_DECREF(script);
+    if (length < 0) {
+        LCOV_EXCL_START
+
+        Py_DECREF(result);
+        return NULL;
+
+        LCOV_EXCL_STOP
+    }
+
+    if (!bytes) {
+        script = PyUnicode_DecodeUTF8(PyBytes_AS_STRING(result), length,
+                                      "strict");
+        Py_DECREF(result);
+        return script;
+    }
+    if (bytes == 1) {
+        if (length != slength) {
+            _PyBytes_Resize(&result, length);
+        }
+        return result;
+    }
+    /* bytes == 2: bytearray */
+    script = PyByteArray_FromStringAndSize(PyBytes_AS_STRING(result), length);
+    Py_DECREF(result);
+    return script;
+#endif
 }
 
 /* ------------------------ BEGIN MODULE DEFINITION ------------------------ */
 
 EXT_METHODS = {
     {"jsmin",
-        (PyCFunction)rjsmin_jsmin, METH_VARARGS | METH_KEYWORDS,
+        EXT_CFUNC(rjsmin_jsmin), METH_VARARGS | METH_KEYWORDS,
         rjsmin_jsmin__doc__},
 
     {NULL}  /* Sentinel */
@@ -499,10 +707,10 @@ EXT_INIT_FUNC {
 
     /* Create the module and populate stuff */
     if (!(m = EXT_CREATE(&EXT_DEFINE_VAR)))
-        EXT_INIT_ERROR(NULL);
+        EXT_INIT_ERROR(LCOV_EXCL_LINE(NULL));
 
     EXT_ADD_UNICODE(m, "__author__", "Andr\xe9 Malo", "latin-1");
-    EXT_ADD_STRING(m, "__docformat__", "restructuredtext en");
+    EXT_ADD_STRING(m, "__version__", STRINGIFY(EXT_VERSION));
 
     EXT_INIT_RETURN(m);
 }
diff -up chromium-103.0.5060.53/third_party/catapult/common/py_vulcanize/third_party/rjsmin/rjsmin.py.12 chromium-103.0.5060.53/third_party/catapult/common/py_vulcanize/third_party/rjsmin/rjsmin.py
--- chromium-103.0.5060.53/third_party/catapult/common/py_vulcanize/third_party/rjsmin/rjsmin.py.12	2022-07-01 20:33:39.317727375 +0000
+++ chromium-103.0.5060.53/third_party/catapult/common/py_vulcanize/third_party/rjsmin/rjsmin.py	2021-11-14 20:24:16.000000000 +0000
@@ -1,6 +1,6 @@
 #!/usr/bin/env python
 # -*- coding: ascii -*-
-r"""
+u"""
 =====================
  Javascript Minifier
 =====================
@@ -11,7 +11,7 @@ The minifier is based on the semantics o
 
 :Copyright:
 
- Copyright 2011 - 2015
+ Copyright 2011 - 2021
  Andr\xe9 Malo or his licensors, as applicable
 
 :License:
@@ -39,9 +39,11 @@ same results as the original ``jsmin.c``
 - Newline characters are not allowed inside string and regex literals, except
   for line continuations in string literals (ECMA-5).
 - "return /regex/" is recognized correctly.
+- More characters are allowed before regexes.
 - Line terminators after regex literals are handled more sensibly
 - "+ +" and "- -" sequences are not collapsed to '++' or '--'
 - Newlines before ! operators are removed more sensibly
+- (Unnested) template literals are supported (ECMA-6)
 - Comments starting with an exclamation mark (``!``) can be kept optionally
 - rJSmin does not handle streams, but only complete strings. (However, the
   module provides a "streamy" interface).
@@ -56,20 +58,17 @@ file for details.
 
 rjsmin.c is a reimplementation of rjsmin.py in C and speeds it up even more.
 
-Both python 2 and python 3 are supported.
+Supported python versions are 2.7 and 3.6+.
 
 .. _jsmin.c by Douglas Crockford:
    http://www.crockford.com/javascript/jsmin.c
 """
-if __doc__:
-    # pylint: disable = redefined-builtin
-    __doc__ = __doc__.encode('ascii').decode('unicode_escape')
-__author__ = r"Andr\xe9 Malo".encode('ascii').decode('unicode_escape')
-__docformat__ = "restructuredtext en"
+__author__ = u"Andr\xe9 Malo"
 __license__ = "Apache License, Version 2.0"
-__version__ = '1.0.12'
+__version__ = '1.2.0'
 __all__ = ['jsmin']
 
+import functools as _ft
 import re as _re
 
 
@@ -80,13 +79,13 @@ def _make_jsmin(python_only=False):
     .. _jsmin.c by Douglas Crockford:
        http://www.crockford.com/javascript/jsmin.c
 
-    :Parameters:
-      `python_only` : ``bool``
+    Parameters:
+      python_only (bool):
         Use only the python variant. If true, the c extension is not even
         tried to be loaded.
 
-    :Return: Minifier
-    :Rtype: ``callable``
+    Returns:
+      callable: Minifier
     """
     # pylint: disable = unused-variable
     # pylint: disable = too-many-locals
@@ -97,7 +96,10 @@ def _make_jsmin(python_only=False):
         except ImportError:
             pass
         else:
-            return _rjsmin.jsmin
+            # Ensure that the C version is in sync
+            # https://github.com/ndparker/rjsmin/issues/11
+            if getattr(_rjsmin, '__version__', None) == __version__:
+                return _rjsmin.jsmin
     try:
         xrange
     except NameError:
@@ -110,15 +112,16 @@ def _make_jsmin(python_only=False):
     space_comment_nobang = r'(?:/\*(?!!)[^*]*\*+(?:[^/*][^*]*\*+)*/)'
     bang_comment = r'(?:/\*![^*]*\*+(?:[^/*][^*]*\*+)*/)'
 
-    string1 = \
-        r'(?:\047[^\047\\\r\n]*(?:\\(?:[^\r\n]|\r?\n|\r)[^\047\\\r\n]*)*\047)'
+    string1 = r"(?:'[^'\\\r\n]*(?:\\(?:[^\r\n]|\r?\n|\r)[^'\\\r\n]*)*')"
+    string1 = string1.replace("'", r'\047')  # portability
     string2 = r'(?:"[^"\\\r\n]*(?:\\(?:[^\r\n]|\r?\n|\r)[^"\\\r\n]*)*")'
-    string3 = r'(?:`(?:[^`\\]|\\.)*`)'
+    string3 = r'(?:`[^`\\]*(?:\\(?:[^\r\n]|\r?\n|\r)[^`\\]*)*`)'
+    string3 = string3.replace('`', r'\140')  # portability
     strings = r'(?:%s|%s|%s)' % (string1, string2, string3)
 
     charclass = r'(?:\[[^\\\]\r\n]*(?:\\[^\r\n][^\\\]\r\n]*)*\])'
     nospecial = r'[^/\\\[\r\n]'
-    regex = r'(?:/(?![\r\n/*])%s*(?:(?:\\[^\r\n]|%s)%s*)*/)' % (
+    regex = r'(?:/(?![\r\n/*])%s*(?:(?:\\[^\r\n]|%s)%s*)*/[a-z]*)' % (
         nospecial, charclass, nospecial
     )
     space = r'(?:%s|%s)' % (space_chars, space_comment)
@@ -154,7 +157,7 @@ def _make_jsmin(python_only=False):
             ) for first, last in result])  # noqa
 
         return _re.sub(
-            r'([\000-\040\047])',  # \047 for better portability
+            r"([\000-\040'`])",  # ' and ` for better portability
             lambda m: '\\%03o' % ord(m.group(1)), (
                 sequentize(result)
                 .replace('\\', '\\\\')
@@ -180,42 +183,48 @@ def _make_jsmin(python_only=False):
         return r'[%s]' % fix_charclass(result)
 
     not_id_literal = not_id_literal_(r'[a-zA-Z0-9_$]')
-    preregex1 = r'[(,=:\[!&|?{};\r\n]'
+    preregex1 = r'[(,=:\[!&|?{};\r\n+*-]'
     preregex2 = r'%(not_id_literal)sreturn' % locals()
 
     id_literal = id_literal_(r'[a-zA-Z0-9_$]')
     id_literal_open = id_literal_(r'[a-zA-Z0-9_${\[(!+-]')
-    id_literal_close = id_literal_(r'[a-zA-Z0-9_$}\])"\047+-]')
+    id_literal_close = id_literal_(r'[a-zA-Z0-9_$}\])"\047\140+-]')
     post_regex_off = id_literal_(r'[^\000-\040}\])?:|,;.&=+-]')
 
-    dull = r'[^\047"`/\000-\040]'
+    dull = r'[^\047"\140/\000-\040]'
 
     space_sub_simple = _re.compile((
-        # noqa pylint: disable = bad-continuation
+        # noqa pylint: disable = bad-option-value, bad-continuation
 
         r'(%(dull)s+)'                                         # 0
         r'|(%(strings)s%(dull)s*)'                             # 1
-        r'|(?<=%(preregex1)s)'
+        r'|(?<=[)])'
             r'%(space)s*(?:%(newline)s%(space)s*)*'
             r'(%(regex)s)'                                     # 2
-            r'(%(space)s*(?:%(newline)s%(space)s*)+'           # 3
+            r'(?=%(space)s*(?:%(newline)s%(space)s*)*'
+                r'\.'
+                r'%(space)s*(?:%(newline)s%(space)s*)*[a-z])'
+        r'|(?<=%(preregex1)s)'
+            r'%(space)s*(?:%(newline)s%(space)s*)*'
+            r'(%(regex)s)'                                     # 3
+            r'(%(space)s*(?:%(newline)s%(space)s*)+'           # 4
                 r'(?=%(post_regex_off)s))?'
         r'|(?<=%(preregex2)s)'
-            r'%(space)s*(?:(%(newline)s)%(space)s*)*'          # 4
-            r'(%(regex)s)'                                     # 5
-            r'(%(space)s*(?:%(newline)s%(space)s*)+'           # 6
+            r'%(space)s*(?:(%(newline)s)%(space)s*)*'          # 5
+            r'(%(regex)s)'                                     # 6
+            r'(%(space)s*(?:%(newline)s%(space)s*)+'           # 7
                 r'(?=%(post_regex_off)s))?'
         r'|(?<=%(id_literal_close)s)'
-            r'%(space)s*(?:(%(newline)s)%(space)s*)+'          # 7
+            r'%(space)s*(?:(%(newline)s)%(space)s*)+'          # 8
             r'(?=%(id_literal_open)s)'
-        r'|(?<=%(id_literal)s)(%(space)s)+(?=%(id_literal)s)'  # 8
-        r'|(?<=\+)(%(space)s)+(?=\+)'                          # 9
-        r'|(?<=-)(%(space)s)+(?=-)'                            # 10
+        r'|(?<=%(id_literal)s)(%(space)s)+(?=%(id_literal)s)'  # 9
+        r'|(?<=\+)(%(space)s)+(?=\+)'                          # 10
+        r'|(?<=-)(%(space)s)+(?=-)'                            # 11
         r'|%(space)s+'
         r'|(?:%(newline)s%(space)s*)+'
     ) % locals()).sub
 
-    # print space_sub_simple.__self__.pattern
+    # print(space_sub_simple.__self__.pattern)
 
     def space_subber_simple(match):
         """ Substitution callback """
@@ -227,48 +236,56 @@ def _make_jsmin(python_only=False):
         elif groups[1]:
             return groups[1]
         elif groups[2]:
-            if groups[3]:
-                return groups[2] + '\n'
             return groups[2]
-        elif groups[5]:
+        elif groups[3]:
+            if groups[4]:
+                return groups[3] + '\n'
+            return groups[3]
+        elif groups[6]:
             return "%s%s%s" % (
-                groups[4] and '\n' or '',
-                groups[5],
-                groups[6] and '\n' or '',
+                groups[5] and '\n' or '',
+                groups[6],
+                groups[7] and '\n' or '',
             )
-        elif groups[7]:
+        elif groups[8]:
             return '\n'
-        elif groups[8] or groups[9] or groups[10]:
+        elif groups[9] or groups[10] or groups[11]:
             return ' '
         else:
             return ''
 
     space_sub_banged = _re.compile((
-        # noqa pylint: disable = bad-continuation
+        # noqa pylint: disable = bad-option-value, bad-continuation
 
         r'(%(dull)s+)'                                         # 0
         r'|(%(strings)s%(dull)s*)'                             # 1
-        r'|(?<=%(preregex1)s)'
+        r'|(?<=[)])'
             r'(%(space)s*(?:%(newline)s%(space)s*)*)'          # 2
             r'(%(regex)s)'                                     # 3
-            r'(%(space)s*(?:%(newline)s%(space)s*)+'           # 4
+            r'(?=%(space)s*(?:%(newline)s%(space)s*)*'
+                r'\.'
+                r'%(space)s*(?:%(newline)s%(space)s*)*[a-z])'
+        r'|(?<=%(preregex1)s)'
+            r'(%(space)s*(?:%(newline)s%(space)s*)*)'          # 4
+            r'(%(regex)s)'                                     # 5
+            r'(%(space)s*(?:%(newline)s%(space)s*)+'           # 6
                 r'(?=%(post_regex_off)s))?'
         r'|(?<=%(preregex2)s)'
-            r'(%(space)s*(?:(%(newline)s)%(space)s*)*)'        # 5, 6
-            r'(%(regex)s)'                                     # 7
-            r'(%(space)s*(?:%(newline)s%(space)s*)+'           # 8
+            r'(%(space)s*(?:(%(newline)s)%(space)s*)*)'        # 7, 8
+            r'(%(regex)s)'                                     # 9
+            r'(%(space)s*(?:%(newline)s%(space)s*)+'           # 10
                 r'(?=%(post_regex_off)s))?'
         r'|(?<=%(id_literal_close)s)'
-            r'(%(space)s*(?:%(newline)s%(space)s*)+)'          # 9
+            r'(%(space)s*(?:%(newline)s%(space)s*)+)'          # 11
             r'(?=%(id_literal_open)s)'
-        r'|(?<=%(id_literal)s)(%(space)s+)(?=%(id_literal)s)'  # 10
-        r'|(?<=\+)(%(space)s+)(?=\+)'                          # 11
-        r'|(?<=-)(%(space)s+)(?=-)'                            # 12
-        r'|(%(space)s+)'                                       # 13
-        r'|((?:%(newline)s%(space)s*)+)'                       # 14
+        r'|(?<=%(id_literal)s)(%(space)s+)(?=%(id_literal)s)'  # 12
+        r'|(?<=\+)(%(space)s+)(?=\+)'                          # 13
+        r'|(?<=-)(%(space)s+)(?=-)'                            # 14
+        r'|(%(space)s+)'                                       # 15
+        r'|((?:%(newline)s%(space)s*)+)'                       # 16
     ) % locals()).sub
 
-    # print space_sub_banged.__self__.pattern
+    # print(space_sub_banged.__self__.pattern)
 
     keep = _re.compile((
         r'%(space_chars)s+|%(space_comment_nobang)s+|%(newline)s+'
@@ -276,7 +293,7 @@ def _make_jsmin(python_only=False):
     ) % locals()).sub
     keeper = lambda m: m.groups()[0] or ''
 
-    # print keep.__self__.pattern
+    # print(keep.__self__.pattern)
 
     def space_subber_banged(match):
         """ Substitution callback """
@@ -288,26 +305,34 @@ def _make_jsmin(python_only=False):
         elif groups[1]:
             return groups[1]
         elif groups[3]:
-            return "%s%s%s%s" % (
+            return "%s%s" % (
                 keep(keeper, groups[2]),
                 groups[3],
-                keep(keeper, groups[4] or ''),
-                groups[4] and '\n' or '',
             )
-        elif groups[7]:
-            return "%s%s%s%s%s" % (
-                keep(keeper, groups[5]),
+        elif groups[5]:
+            return "%s%s%s%s" % (
+                keep(keeper, groups[4]),
+                groups[5],
+                keep(keeper, groups[6] or ''),
                 groups[6] and '\n' or '',
-                groups[7],
-                keep(keeper, groups[8] or ''),
-                groups[8] and '\n' or '',
             )
         elif groups[9]:
-            return keep(keeper, groups[9]) + '\n'
-        elif groups[10] or groups[11] or groups[12]:
-            return keep(keeper, groups[10] or groups[11] or groups[12]) or ' '
+            return "%s%s%s%s%s" % (
+                keep(keeper, groups[7]),
+                groups[8] and '\n' or '',
+                groups[9],
+                keep(keeper, groups[10] or ''),
+                groups[10] and '\n' or '',
+            )
+        elif groups[11]:
+            return keep(keeper, groups[11]) + '\n'
+        elif groups[12] or groups[13] or groups[14]:
+            return keep(keeper, groups[12] or groups[13] or groups[14]) or ' '
         else:
-            return keep(keeper, groups[13] or groups[14])
+            return keep(keeper, groups[15] or groups[16])
+
+    banged = _ft.partial(space_sub_banged, space_subber_banged)
+    simple = _ft.partial(space_sub_simple, space_subber_simple)
 
     def jsmin(script, keep_bang_comments=False):
         r"""
@@ -320,32 +345,51 @@ def _make_jsmin(python_only=False):
         .. _jsmin.c by Douglas Crockford:
            http://www.crockford.com/javascript/jsmin.c
 
-        :Parameters:
-          `script` : ``str``
+        Parameters:
+          script (str):
             Script to minify
 
-          `keep_bang_comments` : ``bool``
+          keep_bang_comments (bool):
             Keep comments starting with an exclamation mark? (``/*!...*/``)
 
-        :Return: Minified script
-        :Rtype: ``str``
+        Returns:
+          str: Minified script
         """
         # pylint: disable = redefined-outer-name
 
-        if keep_bang_comments:
-            return space_sub_banged(
-                space_subber_banged, '\n%s\n' % script
-            ).strip()
-        else:
-            return space_sub_simple(
-                space_subber_simple, '\n%s\n' % script
-            ).strip()
+        is_bytes, script = _as_str(script)
+        script = (banged if keep_bang_comments else simple)(
+            '\n%s\n' % script
+        ).strip()
+        if is_bytes:
+            script = script.encode('latin-1')
+            if is_bytes == 2:
+                script = bytearray(script)
+        return script
 
     return jsmin
 
 jsmin = _make_jsmin()
 
 
+def _as_str(script):
+    """ Make sure the script is a text string """
+    is_bytes = False
+    if str is bytes:
+        if not isinstance(script, basestring):  # noqa pylint: disable = undefined-variable
+            raise TypeError("Unexpected type")
+    elif isinstance(script, bytes):
+        is_bytes = True
+        script = script.decode('latin-1')
+    elif isinstance(script, bytearray):
+        is_bytes = 2
+        script = script.decode('latin-1')
+    elif not isinstance(script, str):
+        raise TypeError("Unexpected type")
+
+    return is_bytes, script
+
+
 def jsmin_for_posers(script, keep_bang_comments=False):
     r"""
     Minify javascript based on `jsmin.c by Douglas Crockford`_\.
@@ -361,49 +405,61 @@ def jsmin_for_posers(script, keep_bang_c
               utilizes the resulting regexes. It's here for fun and may
               vanish any time. Use the `jsmin` function instead.
 
-    :Parameters:
-      `script` : ``str``
+    Parameters:
+      script (str):
         Script to minify
 
-      `keep_bang_comments` : ``bool``
+      keep_bang_comments (bool):
         Keep comments starting with an exclamation mark? (``/*!...*/``)
 
-    :Return: Minified script
-    :Rtype: ``str``
+    Returns:
+      str: Minified script
     """
     if not keep_bang_comments:
         rex = (
-            r'([^\047"/\000-\040]+)|((?:(?:\047[^\047\\\r\n]*(?:\\(?:[^\r\n]'
-            r'|\r?\n|\r)[^\047\\\r\n]*)*\047)|(?:"[^"\\\r\n]*(?:\\(?:[^\r\n]'
-            r'|\r?\n|\r)[^"\\\r\n]*)*"))[^\047"/\000-\040]*)|(?<=[(,=:\[!&|?'
-            r'{};\r\n])(?:[\000-\011\013\014\016-\040]|(?:/\*[^*]*\*+(?:[^/*'
-            r'][^*]*\*+)*/))*(?:(?:(?://[^\r\n]*)?[\r\n])(?:[\000-\011\013\0'
-            r'14\016-\040]|(?:/\*[^*]*\*+(?:[^/*][^*]*\*+)*/))*)*((?:/(?![\r'
-            r'\n/*])[^/\\\[\r\n]*(?:(?:\\[^\r\n]|(?:\[[^\\\]\r\n]*(?:\\[^\r'
-            r'\n][^\\\]\r\n]*)*\]))[^/\\\[\r\n]*)*/))((?:[\000-\011\013\014'
+            r'([^\047"\140/\000-\040]+)|((?:(?:\047[^\047\\\r\n]*(?:\\(?:[^'
+            r'\r\n]|\r?\n|\r)[^\047\\\r\n]*)*\047)|(?:"[^"\\\r\n]*(?:\\(?:[^'
+            r'\r\n]|\r?\n|\r)[^"\\\r\n]*)*")|(?:\140[^\140\\]*(?:\\(?:[^\r\n'
+            r']|\r?\n|\r)[^\140\\]*)*\140))[^\047"\140/\000-\040]*)|(?<=[)])'
+            r'(?:[\000-\011\013\014\016-\040]|(?:/\*[^*]*\*+(?:[^/*][^*]*\*+'
+            r')*/))*(?:(?:(?://[^\r\n]*)?[\r\n])(?:[\000-\011\013\014\016-\0'
+            r'40]|(?:/\*[^*]*\*+(?:[^/*][^*]*\*+)*/))*)*((?:/(?![\r\n/*])[^/'
+            r'\\\[\r\n]*(?:(?:\\[^\r\n]|(?:\[[^\\\]\r\n]*(?:\\[^\r\n][^\\\]'
+            r'\r\n]*)*\]))[^/\\\[\r\n]*)*/[a-z]*))(?=(?:[\000-\011\013\014\0'
+            r'16-\040]|(?:/\*[^*]*\*+(?:[^/*][^*]*\*+)*/))*(?:(?:(?://[^\r\n'
+            r']*)?[\r\n])(?:[\000-\011\013\014\016-\040]|(?:/\*[^*]*\*+(?:[^'
+            r'/*][^*]*\*+)*/))*)*\.(?:[\000-\011\013\014\016-\040]|(?:/\*[^*'
+            r']*\*+(?:[^/*][^*]*\*+)*/))*(?:(?:(?://[^\r\n]*)?[\r\n])(?:[\00'
+            r'0-\011\013\014\016-\040]|(?:/\*[^*]*\*+(?:[^/*][^*]*\*+)*/))*)'
+            r'*[a-z])|(?<=[(,=:\[!&|?{};\r\n+*-])(?:[\000-\011\013\014\016-'
+            r'\040]|(?:/\*[^*]*\*+(?:[^/*][^*]*\*+)*/))*(?:(?:(?://[^\r\n]*)'
+            r'?[\r\n])(?:[\000-\011\013\014\016-\040]|(?:/\*[^*]*\*+(?:[^/*]'
+            r'[^*]*\*+)*/))*)*((?:/(?![\r\n/*])[^/\\\[\r\n]*(?:(?:\\[^\r\n]|'
+            r'(?:\[[^\\\]\r\n]*(?:\\[^\r\n][^\\\]\r\n]*)*\]))[^/\\\[\r\n]*)*'
+            r'/[a-z]*))((?:[\000-\011\013\014\016-\040]|(?:/\*[^*]*\*+(?:[^/'
+            r'*][^*]*\*+)*/))*(?:(?:(?://[^\r\n]*)?[\r\n])(?:[\000-\011\013'
+            r'\014\016-\040]|(?:/\*[^*]*\*+(?:[^/*][^*]*\*+)*/))*)+(?=[^\000'
+            r'-\040&)+,.:;=?\]|}-]))?|(?<=[\000-#%-,./:-@\[-^\140{-~-]return'
+            r')(?:[\000-\011\013\014\016-\040]|(?:/\*[^*]*\*+(?:[^/*][^*]*\*'
+            r'+)*/))*(?:((?:(?://[^\r\n]*)?[\r\n]))(?:[\000-\011\013\014\016'
+            r'-\040]|(?:/\*[^*]*\*+(?:[^/*][^*]*\*+)*/))*)*((?:/(?![\r\n/*])'
+            r'[^/\\\[\r\n]*(?:(?:\\[^\r\n]|(?:\[[^\\\]\r\n]*(?:\\[^\r\n][^'
+            r'\\\]\r\n]*)*\]))[^/\\\[\r\n]*)*/[a-z]*))((?:[\000-\011\013\014'
             r'\016-\040]|(?:/\*[^*]*\*+(?:[^/*][^*]*\*+)*/))*(?:(?:(?://[^\r'
             r'\n]*)?[\r\n])(?:[\000-\011\013\014\016-\040]|(?:/\*[^*]*\*+(?:'
-            r'[^/*][^*]*\*+)*/))*)+(?=[^\000-\040&)+,.:;=?\]|}-]))?|(?<=[\00'
-            r'0-#%-,./:-@\[-^`{-~-]return)(?:[\000-\011\013\014\016-\040]|(?'
-            r':/\*[^*]*\*+(?:[^/*][^*]*\*+)*/))*(?:((?:(?://[^\r\n]*)?[\r\n]'
-            r'))(?:[\000-\011\013\014\016-\040]|(?:/\*[^*]*\*+(?:[^/*][^*]*'
-            r'\*+)*/))*)*((?:/(?![\r\n/*])[^/\\\[\r\n]*(?:(?:\\[^\r\n]|(?:\['
-            r'[^\\\]\r\n]*(?:\\[^\r\n][^\\\]\r\n]*)*\]))[^/\\\[\r\n]*)*/))(('
-            r'?:[\000-\011\013\014\016-\040]|(?:/\*[^*]*\*+(?:[^/*][^*]*\*+)'
-            r'*/))*(?:(?:(?://[^\r\n]*)?[\r\n])(?:[\000-\011\013\014\016-\04'
-            r'0]|(?:/\*[^*]*\*+(?:[^/*][^*]*\*+)*/))*)+(?=[^\000-\040&)+,.:;'
-            r'=?\]|}-]))?|(?<=[^\000-!#%&(*,./:-@\[\\^`{|~])(?:[\000-\011\01'
-            r'3\014\016-\040]|(?:/\*[^*]*\*+(?:[^/*][^*]*\*+)*/))*(?:((?:(?:'
-            r'//[^\r\n]*)?[\r\n]))(?:[\000-\011\013\014\016-\040]|(?:/\*[^*]'
-            r'*\*+(?:[^/*][^*]*\*+)*/))*)+(?=[^\000-\040"#%-\047)*,./:-@\\-^'
-            r'`|-~])|(?<=[^\000-#%-,./:-@\[-^`{-~-])((?:[\000-\011\013\014\0'
-            r'16-\040]|(?:/\*[^*]*\*+(?:[^/*][^*]*\*+)*/)))+(?=[^\000-#%-,./'
-            r':-@\[-^`{-~-])|(?<=\+)((?:[\000-\011\013\014\016-\040]|(?:/\*['
-            r'^*]*\*+(?:[^/*][^*]*\*+)*/)))+(?=\+)|(?<=-)((?:[\000-\011\013'
-            r'\014\016-\040]|(?:/\*[^*]*\*+(?:[^/*][^*]*\*+)*/)))+(?=-)|(?:['
-            r'\000-\011\013\014\016-\040]|(?:/\*[^*]*\*+(?:[^/*][^*]*\*+)*/)'
-            r')+|(?:(?:(?://[^\r\n]*)?[\r\n])(?:[\000-\011\013\014\016-\040]'
-            r'|(?:/\*[^*]*\*+(?:[^/*][^*]*\*+)*/))*)+'
+            r'[^/*][^*]*\*+)*/))*)+(?=[^\000-\040&)+,.:;=?\]|}-]))?|(?<=[^\0'
+            r'00-!#%&(*,./:-@\[\\^{|~])(?:[\000-\011\013\014\016-\040]|(?:/'
+            r'\*[^*]*\*+(?:[^/*][^*]*\*+)*/))*(?:((?:(?://[^\r\n]*)?[\r\n]))'
+            r'(?:[\000-\011\013\014\016-\040]|(?:/\*[^*]*\*+(?:[^/*][^*]*\*+'
+            r')*/))*)+(?=[^\000-\040"#%-\047)*,./:-@\\-^\140|-~])|(?<=[^\000'
+            r'-#%-,./:-@\[-^\140{-~-])((?:[\000-\011\013\014\016-\040]|(?:/'
+            r'\*[^*]*\*+(?:[^/*][^*]*\*+)*/)))+(?=[^\000-#%-,./:-@\[-^\140{-'
+            r'~-])|(?<=\+)((?:[\000-\011\013\014\016-\040]|(?:/\*[^*]*\*+(?:'
+            r'[^/*][^*]*\*+)*/)))+(?=\+)|(?<=-)((?:[\000-\011\013\014\016-\0'
+            r'40]|(?:/\*[^*]*\*+(?:[^/*][^*]*\*+)*/)))+(?=-)|(?:[\000-\011\0'
+            r'13\014\016-\040]|(?:/\*[^*]*\*+(?:[^/*][^*]*\*+)*/))+|(?:(?:(?'
+            r'://[^\r\n]*)?[\r\n])(?:[\000-\011\013\014\016-\040]|(?:/\*[^*]'
+            r'*\*+(?:[^/*][^*]*\*+)*/))*)+'
         )
 
         def subber(match):
@@ -412,59 +468,72 @@ def jsmin_for_posers(script, keep_bang_c
             return (
                 groups[0] or
                 groups[1] or
-                (groups[3] and (groups[2] + '\n')) or
                 groups[2] or
-                (groups[5] and "%s%s%s" % (
-                    groups[4] and '\n' or '',
-                    groups[5],
-                    groups[6] and '\n' or '',
+                (groups[4] and (groups[3] + '\n')) or
+                groups[3] or
+                (groups[6] and "%s%s%s" % (
+                    groups[5] and '\n' or '',
+                    groups[6],
+                    groups[7] and '\n' or '',
                 )) or
-                (groups[7] and '\n') or
-                (groups[8] and ' ') or
+                (groups[8] and '\n') or
                 (groups[9] and ' ') or
                 (groups[10] and ' ') or
+                (groups[11] and ' ') or
                 ''
             )
     else:
         rex = (
-            r'([^\047"/\000-\040]+)|((?:(?:\047[^\047\\\r\n]*(?:\\(?:[^\r\n]'
-            r'|\r?\n|\r)[^\047\\\r\n]*)*\047)|(?:"[^"\\\r\n]*(?:\\(?:[^\r\n]'
-            r'|\r?\n|\r)[^"\\\r\n]*)*"))[^\047"/\000-\040]*)|(?<=[(,=:\[!&|?'
-            r'{};\r\n])((?:[\000-\011\013\014\016-\040]|(?:/\*[^*]*\*+(?:[^/'
-            r'*][^*]*\*+)*/))*(?:(?:(?://[^\r\n]*)?[\r\n])(?:[\000-\011\013'
-            r'\014\016-\040]|(?:/\*[^*]*\*+(?:[^/*][^*]*\*+)*/))*)*)((?:/(?!'
-            r'[\r\n/*])[^/\\\[\r\n]*(?:(?:\\[^\r\n]|(?:\[[^\\\]\r\n]*(?:\\[^'
-            r'\r\n][^\\\]\r\n]*)*\]))[^/\\\[\r\n]*)*/))((?:[\000-\011\013\01'
-            r'4\016-\040]|(?:/\*[^*]*\*+(?:[^/*][^*]*\*+)*/))*(?:(?:(?://[^'
+            r'([^\047"\140/\000-\040]+)|((?:(?:\047[^\047\\\r\n]*(?:\\(?:[^'
+            r'\r\n]|\r?\n|\r)[^\047\\\r\n]*)*\047)|(?:"[^"\\\r\n]*(?:\\(?:[^'
+            r'\r\n]|\r?\n|\r)[^"\\\r\n]*)*")|(?:\140[^\140\\]*(?:\\(?:[^\r\n'
+            r']|\r?\n|\r)[^\140\\]*)*\140))[^\047"\140/\000-\040]*)|(?<=[)])'
+            r'((?:[\000-\011\013\014\016-\040]|(?:/\*[^*]*\*+(?:[^/*][^*]*\*'
+            r'+)*/))*(?:(?:(?://[^\r\n]*)?[\r\n])(?:[\000-\011\013\014\016-'
+            r'\040]|(?:/\*[^*]*\*+(?:[^/*][^*]*\*+)*/))*)*)((?:/(?![\r\n/*])'
+            r'[^/\\\[\r\n]*(?:(?:\\[^\r\n]|(?:\[[^\\\]\r\n]*(?:\\[^\r\n][^'
+            r'\\\]\r\n]*)*\]))[^/\\\[\r\n]*)*/[a-z]*))(?=(?:[\000-\011\013\0'
+            r'14\016-\040]|(?:/\*[^*]*\*+(?:[^/*][^*]*\*+)*/))*(?:(?:(?://[^'
             r'\r\n]*)?[\r\n])(?:[\000-\011\013\014\016-\040]|(?:/\*[^*]*\*+('
-            r'?:[^/*][^*]*\*+)*/))*)+(?=[^\000-\040&)+,.:;=?\]|}-]))?|(?<=['
-            r'\000-#%-,./:-@\[-^`{-~-]return)((?:[\000-\011\013\014\016-\040'
-            r']|(?:/\*[^*]*\*+(?:[^/*][^*]*\*+)*/))*(?:((?:(?://[^\r\n]*)?['
-            r'\r\n]))(?:[\000-\011\013\014\016-\040]|(?:/\*[^*]*\*+(?:[^/*]['
-            r'^*]*\*+)*/))*)*)((?:/(?![\r\n/*])[^/\\\[\r\n]*(?:(?:\\[^\r\n]|'
-            r'(?:\[[^\\\]\r\n]*(?:\\[^\r\n][^\\\]\r\n]*)*\]))[^/\\\[\r\n]*)*'
-            r'/))((?:[\000-\011\013\014\016-\040]|(?:/\*[^*]*\*+(?:[^/*][^*]'
-            r'*\*+)*/))*(?:(?:(?://[^\r\n]*)?[\r\n])(?:[\000-\011\013\014\01'
-            r'6-\040]|(?:/\*[^*]*\*+(?:[^/*][^*]*\*+)*/))*)+(?=[^\000-\040&)'
-            r'+,.:;=?\]|}-]))?|(?<=[^\000-!#%&(*,./:-@\[\\^`{|~])((?:[\000-'
-            r'\011\013\014\016-\040]|(?:/\*[^*]*\*+(?:[^/*][^*]*\*+)*/))*(?:'
-            r'(?:(?://[^\r\n]*)?[\r\n])(?:[\000-\011\013\014\016-\040]|(?:/'
-            r'\*[^*]*\*+(?:[^/*][^*]*\*+)*/))*)+)(?=[^\000-\040"#%-\047)*,./'
-            r':-@\\-^`|-~])|(?<=[^\000-#%-,./:-@\[-^`{-~-])((?:[\000-\011\01'
-            r'3\014\016-\040]|(?:/\*[^*]*\*+(?:[^/*][^*]*\*+)*/))+)(?=[^\000'
-            r'-#%-,./:-@\[-^`{-~-])|(?<=\+)((?:[\000-\011\013\014\016-\040]|'
-            r'(?:/\*[^*]*\*+(?:[^/*][^*]*\*+)*/))+)(?=\+)|(?<=-)((?:[\000-\0'
-            r'11\013\014\016-\040]|(?:/\*[^*]*\*+(?:[^/*][^*]*\*+)*/))+)(?=-'
-            r')|((?:[\000-\011\013\014\016-\040]|(?:/\*[^*]*\*+(?:[^/*][^*]*'
-            r'\*+)*/))+)|((?:(?:(?://[^\r\n]*)?[\r\n])(?:[\000-\011\013\014'
-            r'\016-\040]|(?:/\*[^*]*\*+(?:[^/*][^*]*\*+)*/))*)+)'
+            r'?:[^/*][^*]*\*+)*/))*)*\.(?:[\000-\011\013\014\016-\040]|(?:/'
+            r'\*[^*]*\*+(?:[^/*][^*]*\*+)*/))*(?:(?:(?://[^\r\n]*)?[\r\n])(?'
+            r':[\000-\011\013\014\016-\040]|(?:/\*[^*]*\*+(?:[^/*][^*]*\*+)*'
+            r'/))*)*[a-z])|(?<=[(,=:\[!&|?{};\r\n+*-])((?:[\000-\011\013\014'
+            r'\016-\040]|(?:/\*[^*]*\*+(?:[^/*][^*]*\*+)*/))*(?:(?:(?://[^\r'
+            r'\n]*)?[\r\n])(?:[\000-\011\013\014\016-\040]|(?:/\*[^*]*\*+(?:'
+            r'[^/*][^*]*\*+)*/))*)*)((?:/(?![\r\n/*])[^/\\\[\r\n]*(?:(?:\\[^'
+            r'\r\n]|(?:\[[^\\\]\r\n]*(?:\\[^\r\n][^\\\]\r\n]*)*\]))[^/\\\[\r'
+            r'\n]*)*/[a-z]*))((?:[\000-\011\013\014\016-\040]|(?:/\*[^*]*\*+'
+            r'(?:[^/*][^*]*\*+)*/))*(?:(?:(?://[^\r\n]*)?[\r\n])(?:[\000-\01'
+            r'1\013\014\016-\040]|(?:/\*[^*]*\*+(?:[^/*][^*]*\*+)*/))*)+(?=['
+            r'^\000-\040&)+,.:;=?\]|}-]))?|(?<=[\000-#%-,./:-@\[-^\140{-~-]r'
+            r'eturn)((?:[\000-\011\013\014\016-\040]|(?:/\*[^*]*\*+(?:[^/*]['
+            r'^*]*\*+)*/))*(?:((?:(?://[^\r\n]*)?[\r\n]))(?:[\000-\011\013\0'
+            r'14\016-\040]|(?:/\*[^*]*\*+(?:[^/*][^*]*\*+)*/))*)*)((?:/(?!['
+            r'\r\n/*])[^/\\\[\r\n]*(?:(?:\\[^\r\n]|(?:\[[^\\\]\r\n]*(?:\\[^'
+            r'\r\n][^\\\]\r\n]*)*\]))[^/\\\[\r\n]*)*/[a-z]*))((?:[\000-\011'
+            r'\013\014\016-\040]|(?:/\*[^*]*\*+(?:[^/*][^*]*\*+)*/))*(?:(?:('
+            r'?://[^\r\n]*)?[\r\n])(?:[\000-\011\013\014\016-\040]|(?:/\*[^*'
+            r']*\*+(?:[^/*][^*]*\*+)*/))*)+(?=[^\000-\040&)+,.:;=?\]|}-]))?|'
+            r'(?<=[^\000-!#%&(*,./:-@\[\\^{|~])((?:[\000-\011\013\014\016-\0'
+            r'40]|(?:/\*[^*]*\*+(?:[^/*][^*]*\*+)*/))*(?:(?:(?://[^\r\n]*)?['
+            r'\r\n])(?:[\000-\011\013\014\016-\040]|(?:/\*[^*]*\*+(?:[^/*][^'
+            r'*]*\*+)*/))*)+)(?=[^\000-\040"#%-\047)*,./:-@\\-^\140|-~])|(?<'
+            r'=[^\000-#%-,./:-@\[-^\140{-~-])((?:[\000-\011\013\014\016-\040'
+            r']|(?:/\*[^*]*\*+(?:[^/*][^*]*\*+)*/))+)(?=[^\000-#%-,./:-@\[-^'
+            r'\140{-~-])|(?<=\+)((?:[\000-\011\013\014\016-\040]|(?:/\*[^*]*'
+            r'\*+(?:[^/*][^*]*\*+)*/))+)(?=\+)|(?<=-)((?:[\000-\011\013\014'
+            r'\016-\040]|(?:/\*[^*]*\*+(?:[^/*][^*]*\*+)*/))+)(?=-)|((?:[\00'
+            r'0-\011\013\014\016-\040]|(?:/\*[^*]*\*+(?:[^/*][^*]*\*+)*/))+)'
+            r'|((?:(?:(?://[^\r\n]*)?[\r\n])(?:[\000-\011\013\014\016-\040]|'
+            r'(?:/\*[^*]*\*+(?:[^/*][^*]*\*+)*/))*)+)'
         )
 
-        keep = _re.compile((
+        keep = _re.compile(
             r'[\000-\011\013\014\016-\040]+|(?:/\*(?!!)[^*]*\*+(?:[^/*][^*]*'
             r'\*+)*/)+|(?:(?://[^\r\n]*)?[\r\n])+|((?:/\*![^*]*\*+(?:[^/*][^'
             r'*]*\*+)*/)+)'
-        ) % locals()).sub
+        ).sub
         keeper = lambda m: m.groups()[0] or ''
 
         def subber(match):
@@ -473,27 +542,37 @@ def jsmin_for_posers(script, keep_bang_c
             return (
                 groups[0] or
                 groups[1] or
-                (groups[3] and "%s%s%s%s" % (
+                groups[3] and "%s%s" % (
                     keep(keeper, groups[2]),
                     groups[3],
-                    keep(keeper, groups[4] or ''),
-                    groups[4] and '\n' or '',
-                )) or
-                (groups[7] and "%s%s%s%s%s" % (
-                    keep(keeper, groups[5]),
+                ) or
+                groups[5] and "%s%s%s%s" % (
+                    keep(keeper, groups[4]),
+                    groups[5],
+                    keep(keeper, groups[6] or ''),
                     groups[6] and '\n' or '',
-                    groups[7],
-                    keep(keeper, groups[8] or ''),
+                ) or
+                groups[9] and "%s%s%s%s%s" % (
+                    keep(keeper, groups[7]),
                     groups[8] and '\n' or '',
-                )) or
-                (groups[9] and keep(keeper, groups[9] + '\n')) or
-                (groups[10] and keep(keeper, groups[10]) or ' ') or
-                (groups[11] and keep(keeper, groups[11]) or ' ') or
-                (groups[12] and keep(keeper, groups[12]) or ' ') or
-                keep(keeper, groups[13] or groups[14])
+                    groups[9],
+                    keep(keeper, groups[10] or ''),
+                    groups[10] and '\n' or '',
+                ) or
+                groups[11] and (keep(keeper, groups[11]) + '\n') or
+                groups[12] and (keep(keeper, groups[12]) or ' ') or
+                groups[13] and (keep(keeper, groups[13]) or ' ') or
+                groups[14] and (keep(keeper, groups[14]) or ' ') or
+                keep(keeper, groups[15] or groups[16])
             )
 
-    return _re.sub(rex, subber, '\n%s\n' % script).strip()
+    is_bytes, script = _as_str(script)
+    script = _re.sub(rex, subber, '\n%s\n' % script).strip()
+    if is_bytes:
+        script = script.encode('latin-1')
+        if is_bytes == 2:
+            script = bytearray(script)
+    return script
 
 
 if __name__ == '__main__':
diff -up chromium-103.0.5060.53/third_party/catapult/common/py_vulcanize/third_party/rjsmin/setup.py.12 chromium-103.0.5060.53/third_party/catapult/common/py_vulcanize/third_party/rjsmin/setup.py
--- chromium-103.0.5060.53/third_party/catapult/common/py_vulcanize/third_party/rjsmin/setup.py.12	2022-06-28 12:50:10.171324444 +0000
+++ chromium-103.0.5060.53/third_party/catapult/common/py_vulcanize/third_party/rjsmin/setup.py	2021-11-05 17:03:12.000000000 +0000
@@ -1,41 +1,264 @@
 #!/usr/bin/env python
 # -*- coding: ascii -*-
-#
-# Copyright 2006 - 2013
-# Andr\xe9 Malo or his licensors, as applicable
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
+u"""
+:Copyright:
 
+ Copyright 2011 - 2021
+ Andr\xe9 Malo or his licensors, as applicable
+
+:License:
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+     http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+
+===========================================
+ rJSmin - A Javascript Minifier For Python
+===========================================
+
+rJSmin - A Javascript Minifier For Python.
+"""
+from __future__ import print_function
+__author__ = u"Andr\xe9 Malo"
+__docformat__ = "restructuredtext en"
+
+import os as _os
+import posixpath as _posixpath
 import sys as _sys
-from _setup import run
 
+# pylint: disable = no-name-in-module, import-error, raise-missing-from
+import setuptools as _setuptools
+
+# pylint: disable = invalid-name
+
+
+def _doc(filename):
+    """ Read docs file """
+    # pylint: disable = unspecified-encoding
+    args = {} if str is bytes else dict(encoding='utf-8')
+    try:
+        with open(_os.path.join('docs', filename), **args) as fp:
+            return fp.read()
+    except IOError:
+        return None
+
+
+def _lines(multiline):
+    """ Split multiline string into single line % empty and comments """
+    return [line for line in (
+        line.strip() for line in multiline.splitlines(False)
+    ) if line and not line.startswith('#')]
+
+
+package = dict(
+    name='rjsmin',
+    top='.',
+    pathname='.',
+    provides=_doc('PROVIDES'),
+    desc=_doc('SUMMARY').strip(),
+    longdesc=_doc('DESCRIPTION'),
+    author=__author__,
+    email='nd@perlig.de',
+    license="Apache License, Version 2.0",
+    keywords=_lines(_doc('KEYWORDS')),
+    url='http://opensource.perlig.de/rjsmin/',
+    classifiers=_lines(_doc('CLASSIFIERS') or ''),
+
+    packages=False,
+    py_modules=['rjsmin'],
+    version_file='rjsmin.py',
+    install_requires=[],
+)
+
+
+class BuildFailed(Exception):
+    """ The build has failed """
+
+
+from distutils.command import build_ext as _build_ext  # pylint: disable = wrong-import-order
+from distutils import errors as _errors  # pylint: disable = wrong-import-order
+class build_ext(_build_ext.build_ext):  # pylint: disable = no-init
+    """ Improved extension building code """
+
+    def run(self):
+        """ Unify exception """
+        try:
+            _build_ext.build_ext.run(self)
+        except _errors.DistutilsPlatformError:
+            raise BuildFailed()
+
+
+    def build_extension(self, ext):
+        """
+        Build C extension - with extended functionality
 
-def setup(args=None, _manifest=0):
-    """ Main setup function """
-    from _setup.ext import Extension
+        The following features are added here:
 
-    if 'java' in _sys.platform.lower():
-        # no c extension for jython
-        ext = None
+        - The macros ``EXT_PACKAGE`` and ``EXT_MODULE`` will be filled (or
+          unset) depending on the extensions name, but only if they are not
+          already defined.
+
+        - "." is added to the include directories (for cext.h)
+
+        :Parameters:
+          `ext` : `Extension`
+            The extension to build
+
+        :Return: whatever ``distutils.command.build_ext.build_ext`` returns
+        :Rtype: any
+        """
+        # handle name macros
+        macros = dict(ext.define_macros or ())
+        tup = ext.name.split('.')
+        if len(tup) == 1:
+            pkg, mod = None, tup[0]
+        else:
+            pkg, mod = '.'.join(tup[:-1]), tup[-1]
+        if pkg is not None and 'EXT_PACKAGE' not in macros:
+            ext.define_macros.append(('EXT_PACKAGE', pkg))
+        if 'EXT_MODULE' not in macros:
+            ext.define_macros.append(('EXT_MODULE', mod))
+        if pkg is None:
+            macros = dict(ext.undef_macros or ())
+            if 'EXT_PACKAGE' not in macros:
+                ext.undef_macros.append('EXT_PACKAGE')
+
+        import pprint; pprint.pprint(ext.__dict__)
+        try:
+            return _build_ext.build_ext.build_extension(self, ext)
+        except (_errors.CCompilerError, _errors.DistutilsExecError,
+                _errors.DistutilsPlatformError, IOError, ValueError):
+            raise BuildFailed()
+
+
+class Extension(_setuptools.Extension):
+    """ improved functionality """
+
+    def __init__(self, *args, **kwargs):
+        """ Initialization """
+        version = kwargs.pop('version')
+        self.depends = []
+        if 'depends' in kwargs:
+            self.depends = kwargs['depends']
+        _setuptools.Extension.__init__(self, *args, **kwargs)
+        self.define_macros.append(('EXT_VERSION', version))
+
+        # add include path
+        included = '.'
+        if included not in self.include_dirs:
+            self.include_dirs.append(included)
+
+        # add cext.h to the dependencies
+        cext_h = _posixpath.normpath(_posixpath.join(included, 'cext.h'))
+        for item in self.depends:
+            if _posixpath.normpath(item) == cext_h:
+                break
+        else:
+            self.depends.append(cext_h)
+
+
+EXTENSIONS = lambda v: [Extension('_rjsmin', ["rjsmin.c"], version=v)]
+
+
+def do_setup(cext):
+    """ Main """
+    # pylint: disable = too-many-branches
+    # pylint: disable = unspecified-encoding
+
+    args = {} if str is bytes else dict(encoding='utf-8')
+    version_file = '%s/%s' % (package['pathname'],
+                              package.get('version_file', '__init__.py'))
+    with open(version_file, **args) as fp:
+        for line in fp:  # pylint: disable = redefined-outer-name
+            if line.startswith('__version__'):
+                version = line.split('=', 1)[1].strip()
+                if version.startswith(("'", '"')):
+                    version = version[1:-1].strip()
+                break
+        else:
+            raise RuntimeError("Version not found")
+
+    kwargs = {}
+
+    if not cext or 'java' in _sys.platform.lower():
+        extensions = []
     else:
-        ext=[Extension('_rjsmin', sources=['rjsmin.c'])]
+        extensions = EXTENSIONS(version)
+
+    if extensions:
+        if 'build_ext' in globals():
+            kwargs.setdefault('cmdclass', {})['build_ext'] = build_ext
+        kwargs['ext_modules'] = extensions
+
+        cflags = None
+        if _os.environ.get('CFLAGS') is None:
+            from distutils import ccompiler as _ccompiler
+
+            compiler = _ccompiler.get_default_compiler()
+            try:
+                with open("debug.%s.cflags" % compiler) as fp:
+                    cflags = ' '.join([
+                        line for line in (line.strip() for line in fp)
+                        if line and not line.startswith('#')
+                    ]).split() or None
+            except IOError:
+                pass
+
+        if cflags:
+            gcov = 'coverage' in ' '.join(cflags)
+            for ext in extensions:
+                # pylint: disable = attribute-defined-outside-init
+                ext.extra_compile_args = \
+                    getattr(ext, 'extra_compile_args', []) + cflags
+                if gcov:
+                    ext.libraries.append('gcov')
+
+
+    if package.get('packages', True):
+        kwargs['packages'] = [package['top']] + [
+            '%s.%s' % (package['top'], item)
+            for item in
+            _setuptools.find_packages(package['pathname'])
+        ]
+    if package.get('py_modules'):
+        kwargs['py_modules'] = package['py_modules']
 
-    return run(script_args=args, ext=ext, manifest_only=_manifest)
+    _setuptools.setup(
+        name=package['name'],
+        author=package['author'],
+        author_email=package['email'],
+        license=package['license'],
+        classifiers=package['classifiers'],
+        description=package['desc'],
+        long_description=package['longdesc'],
+        url=package['url'],
+        install_requires=package['install_requires'],
+        version=version,
+        zip_safe=False,
+        **kwargs
+    )
 
 
-def manifest():
-    """ Create List of packaged files """
-    return setup((), _manifest=1)
+def setup():
+    """ Run setup """
+    try:
+        do_setup(True)
+    except BuildFailed:
+        env = 'SETUP_CEXT_REQUIRED'
+        if _os.environ.get(env, '') not in ('', '0'):
+            raise
+        print("C extension build failed - building python only version now. "
+              "Set '%s' environment variable to '1' to make it fail."
+              % (env,), file=_sys.stderr)
+        do_setup(False)
 
 
 if __name__ == '__main__':