From 011ea751332259af8aaf90d793d858a3f6e1870b Mon Sep 17 00:00:00 2001 From: Serhiy Storchaka Date: Sun, 16 May 2021 13:51:35 +0300 Subject: [PATCH 1/5] bpo-28307: Optimize C-style formatting of numbers Support format codes %d, %o, %x, %f, %e, %g, etc. --- Doc/library/ast.rst | 18 +- Doc/library/dis.rst | 20 +- Doc/whatsnew/3.11.rst | 3 +- Include/ceval.h | 9 +- Lib/dis.py | 8 +- Lib/importlib/_bootstrap_external.py | 4 +- Lib/test/test_dis.py | 4 +- Lib/test/test_peepholer.py | 24 ++ .../2021-05-08-19-54-57.bpo-28307.7ysaVW.rst | 3 +- Python/ast_opt.c | 107 ++++++--- Python/ceval.c | 3 + Python/compile.c | 20 +- Python/importlib_external.h | 220 +++++++++--------- 13 files changed, 277 insertions(+), 166 deletions(-) diff --git a/Doc/library/ast.rst b/Doc/library/ast.rst index c7074c40f280c6..e7f214540f9635 100644 --- a/Doc/library/ast.rst +++ b/Doc/library/ast.rst @@ -173,15 +173,25 @@ Literals function call). * ``conversion`` is an integer: - * -1: no formatting - * 115: ``!s`` string formatting - * 114: ``!r`` repr formatting - * 97: ``!a`` ascii formatting + * ``-1``: no formatting + * ``ord('s')``: convert to :class:`str` before formatting (``!s``) + * ``ord('r')``: call :func:`repr` before formatting (``!r``) + * ``ord('a')``: call :func:`ascii` before formatting (``!a``) + * ``ord('d')``: convert to :class:`int` with truncating + (for internal use only) + * ``ord('i')``: call :func:`operator.index` before formatting + (for internal use only) + * ``ord('f')``: convert to :class:`float` before formatting + (for internal use only) * ``format_spec`` is a :class:`JoinedStr` node representing the formatting of the value, or ``None`` if no format was specified. Both ``conversion`` and ``format_spec`` can be set at the same time. + ... versionchanged:: 3.11 + Added support for lossy and lossless convertions to :class:`int` + and :class:`float`. + .. class:: JoinedStr(values) diff --git a/Doc/library/dis.rst b/Doc/library/dis.rst index 193e40014d1ce4..fb8a3cabf0f652 100644 --- a/Doc/library/dis.rst +++ b/Doc/library/dis.rst @@ -1215,14 +1215,20 @@ All of the following opcodes use their arguments. an optional *fmt_spec* from the stack, then a required *value*. *flags* is interpreted as follows: - * ``(flags & 0x03) == 0x00``: *value* is formatted as-is. - * ``(flags & 0x03) == 0x01``: call :func:`str` on *value* before + * ``(flags & 0x07) == 0x00``: *value* is formatted as-is. + * ``(flags & 0x07) == 0x01``: call :func:`str` on *value* before formatting it. - * ``(flags & 0x03) == 0x02``: call :func:`repr` on *value* before + * ``(flags & 0x07) == 0x02``: call :func:`repr` on *value* before formatting it. - * ``(flags & 0x03) == 0x03``: call :func:`ascii` on *value* before + * ``(flags & 0x07) == 0x03``: call :func:`ascii` on *value* before formatting it. - * ``(flags & 0x04) == 0x04``: pop *fmt_spec* from the stack and use + * ``(flags & 0x07) == 0x04``: convert *value* to :class:`int` with + truncating before formatting it. + * ``(flags & 0x07) == 0x05``: call :func:`operator.index` on *value* before + formatting it. + * ``(flags & 0x07) == 0x06``: convert *value* to :class:`float` before + formatting it. + * ``(flags & 0x08) == 0x08``: pop *fmt_spec* from the stack and use it, else use an empty *fmt_spec*. Formatting is performed using :c:func:`PyObject_Format`. The @@ -1230,6 +1236,10 @@ All of the following opcodes use their arguments. .. versionadded:: 3.6 + .. versionchanged:: 3.11 + Added support of lossy and lossless convertions to :class:`int` + and :class:`float`. + .. opcode:: MATCH_CLASS (count) diff --git a/Doc/whatsnew/3.11.rst b/Doc/whatsnew/3.11.rst index 503688294072a3..ab509766b018b6 100644 --- a/Doc/whatsnew/3.11.rst +++ b/Doc/whatsnew/3.11.rst @@ -91,8 +91,7 @@ Optimizations ============= * Compiler optimizes now simple C-style formatting with literal format - containing only format codes ``%s``, ``%r`` and ``%a`` and makes it as - fast as corresponding f-string expression. + string and makes it as fast as corresponding f-string expression. (Contributed by Serhiy Storchaka in :issue:`28307`.) * "Zero-cost" exceptions are implemented. The cost of ``try`` statements is diff --git a/Include/ceval.h b/Include/ceval.h index 0f687666e2bccf..218434f5b6a3df 100644 --- a/Include/ceval.h +++ b/Include/ceval.h @@ -138,13 +138,16 @@ PyAPI_FUNC(void) PyEval_ReleaseThread(PyThreadState *tstate); } /* Masks and values used by FORMAT_VALUE opcode. */ -#define FVC_MASK 0x3 +#define FVC_MASK 0x7 #define FVC_NONE 0x0 #define FVC_STR 0x1 #define FVC_REPR 0x2 #define FVC_ASCII 0x3 -#define FVS_MASK 0x4 -#define FVS_HAVE_SPEC 0x4 +#define FVC_INT 0x4 +#define FVC_INDEX 0x5 +#define FVC_FLOAT 0x6 +#define FVS_MASK 0x8 +#define FVS_HAVE_SPEC 0x8 #ifndef Py_LIMITED_API # define Py_CPYTHON_CEVAL_H diff --git a/Lib/dis.py b/Lib/dis.py index bc7c4d4a8d52c0..bab54ce58bec93 100644 --- a/Lib/dis.py +++ b/Lib/dis.py @@ -4,6 +4,7 @@ import types import collections import io +import operator from opcode import * from opcode import __all__ as _opcodes_all @@ -22,6 +23,9 @@ (str, 'str'), (repr, 'repr'), (ascii, 'ascii'), + (int, 'int'), + (operator.index, 'index'), + (float, 'float'), ) MAKE_FUNCTION = opmap['MAKE_FUNCTION'] MAKE_FUNCTION_FLAGS = ('defaults', 'kwdefaults', 'annotations', 'closure') @@ -383,8 +387,8 @@ def _get_instructions_bytes(code, varnames=None, names=None, constants=None, elif op in hasfree: argval, argrepr = _get_name_info(arg, cells) elif op == FORMAT_VALUE: - argval, argrepr = FORMAT_VALUE_CONVERTERS[arg & 0x3] - argval = (argval, bool(arg & 0x4)) + argval, argrepr = FORMAT_VALUE_CONVERTERS[arg & 0x7] + argval = (argval, bool(arg & 0x8)) if argval[1]: if argrepr: argrepr += ', ' diff --git a/Lib/importlib/_bootstrap_external.py b/Lib/importlib/_bootstrap_external.py index 8d0ebef80450a0..bd36702576cf68 100644 --- a/Lib/importlib/_bootstrap_external.py +++ b/Lib/importlib/_bootstrap_external.py @@ -354,6 +354,8 @@ def _write_atomic(path, data, mode=0o666): # Python 3.10b1 3439 (Add ROT_N) # Python 3.11a1 3450 Use exception table for unwinding ("zero cost" exception handling) # Python 3.11a1 3451 (Add CALL_METHOD_KW) +# Python 3.11a1 3452 (Support int, index and float converter in +# FORMAT_VALUE #28307) # # MAGIC must change whenever the bytecode emitted by the compiler may no @@ -363,7 +365,7 @@ def _write_atomic(path, data, mode=0o666): # Whenever MAGIC_NUMBER is changed, the ranges in the magic_values array # in PC/launcher.c must also be updated. -MAGIC_NUMBER = (3451).to_bytes(2, 'little') + b'\r\n' +MAGIC_NUMBER = (3452).to_bytes(2, 'little') + b'\r\n' _RAW_MAGIC_NUMBER = int.from_bytes(MAGIC_NUMBER, 'little') # For import.c _PYCACHE = '__pycache__' diff --git a/Lib/test/test_dis.py b/Lib/test/test_dis.py index f341a3e5750349..2428197c5257a5 100644 --- a/Lib/test/test_dis.py +++ b/Lib/test/test_dis.py @@ -340,14 +340,14 @@ def _fstring(a, b, c, d): 4 LOAD_CONST 1 (' ') 6 LOAD_FAST 1 (b) 8 LOAD_CONST 2 ('4') - 10 FORMAT_VALUE 4 (with format) + 10 FORMAT_VALUE 8 (with format) 12 LOAD_CONST 1 (' ') 14 LOAD_FAST 2 (c) 16 FORMAT_VALUE 2 (repr) 18 LOAD_CONST 1 (' ') 20 LOAD_FAST 3 (d) 22 LOAD_CONST 2 ('4') - 24 FORMAT_VALUE 6 (repr, with format) + 24 FORMAT_VALUE 10 (repr, with format) 26 BUILD_STRING 7 28 RETURN_VALUE """ % (_fstring.__code__.co_firstlineno + 1,) diff --git a/Lib/test/test_peepholer.py b/Lib/test/test_peepholer.py index 4034154e4dcfb5..1f8ac8778805bd 100644 --- a/Lib/test/test_peepholer.py +++ b/Lib/test/test_peepholer.py @@ -1,4 +1,5 @@ import dis +from itertools import combinations, product import unittest from test.support.bytecode_helper import BytecodeTestCase @@ -494,6 +495,29 @@ def genexpr(): return (y for x in a for y in [f(x)]) self.assertEqual(count_instr_recursively(genexpr, 'FOR_ITER'), 1) + def test_format(self): + flags = '-+ #0' + testcases = [ + *product(('', '1234',), 'sra'), + *product((1234, -1234), 'duioxX'), + *product((1234.5678901, -1234.5678901), 'duifegFEG'), + *product((float('inf'), -float('inf')), 'fegFEG'), + ] + width_precs = [ + *product(('', '1', '30'), ('', '.', '.0', '.2')), + ('', '.40'), + ('30', '.40'), + ] + for value, suffix in testcases: + for width, prec in width_precs: + for r in range(len(flags) + 1): + for spec in combinations(flags, r): + fmt = '%' + ''.join(spec) + width + prec + suffix + with self.subTest(fmt=fmt, value=value): + s1 = fmt % value + s2 = eval(f'{fmt!r} % (x,)', {'x': value}) + self.assertEqual(s2, s1, f'{fmt = }') + class TestBuglets(unittest.TestCase): diff --git a/Misc/NEWS.d/next/Core and Builtins/2021-05-08-19-54-57.bpo-28307.7ysaVW.rst b/Misc/NEWS.d/next/Core and Builtins/2021-05-08-19-54-57.bpo-28307.7ysaVW.rst index 86ac3254eaea87..cf39b029fc6bfb 100644 --- a/Misc/NEWS.d/next/Core and Builtins/2021-05-08-19-54-57.bpo-28307.7ysaVW.rst +++ b/Misc/NEWS.d/next/Core and Builtins/2021-05-08-19-54-57.bpo-28307.7ysaVW.rst @@ -1,3 +1,2 @@ Compiler now optimizes simple C-style formatting with literal format -containing only format codes %s, %r and %a by converting them to f-string -expressions. +string by converting them to f-string expressions. diff --git a/Python/ast_opt.c b/Python/ast_opt.c index 53e089cfab499c..261d2fb097c67a 100644 --- a/Python/ast_opt.c +++ b/Python/ast_opt.c @@ -318,8 +318,8 @@ simple_format_arg_parse(PyObject *fmt, Py_ssize_t *ppos, if (ch == '.') { NEXTC; + *prec = 0; if ('0' <= ch && ch <= '9') { - *prec = 0; int digits = 0; while ('0' <= ch && ch <= '9') { *prec = *prec * 10 + (ch - '0'); @@ -340,44 +340,95 @@ simple_format_arg_parse(PyObject *fmt, Py_ssize_t *ppos, static expr_ty parse_format(PyObject *fmt, Py_ssize_t *ppos, expr_ty arg, PyArena *arena) { - int spec, flags, width = -1, prec = -1; + int spec, flags, width = -1, prec = -1, conv, type, align = 0; if (!simple_format_arg_parse(fmt, ppos, &spec, &flags, &width, &prec)) { // Unsupported format. return NULL; } - if (spec == 's' || spec == 'r' || spec == 'a') { - char buf[1 + MAXDIGITS + 1 + MAXDIGITS + 1], *p = buf; - if (!(flags & F_LJUST) && width > 0) { - *p++ = '>'; - } - if (width >= 0) { - p += snprintf(p, MAXDIGITS + 1, "%d", width); - } - if (prec >= 0) { - p += snprintf(p, MAXDIGITS + 2, ".%d", prec); + char buf[4 + MAXDIGITS + 1 + MAXDIGITS + 2], *p = buf; + align = (flags & F_LJUST) ? '<' : 0; + switch (spec) { + case 's': case 'r': case 'a': { + align = (flags & F_LJUST) ? 0 : '>'; + flags &= F_LJUST; + conv = spec; + type = 0; + break; } - expr_ty format_spec = NULL; - if (p != buf) { - PyObject *str = PyUnicode_FromString(buf); - if (str == NULL) { - return NULL; - } - if (_PyArena_AddPyObject(arena, str) < 0) { - Py_DECREF(str); + case 'd': case 'u': case 'i': { + if (prec >= 0) { + // Unsupported format. return NULL; } - format_spec = _PyAST_Constant(str, NULL, -1, -1, -1, -1, arena); - if (format_spec == NULL) { + conv = 'd'; + type = 0; + break; + } + case 'o': case 'x': case 'X': { + if (prec >= 0) { + // Unsupported format. return NULL; } + conv = 'i'; + type = spec; + break; + } + case 'f': case 'e': case 'g': case 'F': case 'E': case 'G': { + conv = 'f'; + type = spec; + break; + } + default: { + // Unsupported format. + return NULL; + } + } + + if (align && width > 0) { + *p++ = align; + } + if (flags & F_SIGN) { + *p++ = '+'; + } + else if (flags & F_BLANK) { + *p++ = ' '; + } + if (flags & F_ALT) { + *p++ = '#'; + } + if ((flags & F_ZERO) && !align && width > 0) { + *p++ = '0'; + } + + if (width >= 0) { + p += snprintf(p, MAXDIGITS + 1, "%d", width); + } + if (prec >= 0) { + p += snprintf(p, MAXDIGITS + 2, ".%d", prec); + } + if (type) { + *p++ = type; + } + *p = 0; + expr_ty format_spec = NULL; + if (p != buf) { + PyObject *str = PyUnicode_FromString(buf); + if (str == NULL) { + return NULL; + } + if (_PyArena_AddPyObject(arena, str) < 0) { + Py_DECREF(str); + return NULL; + } + format_spec = _PyAST_Constant(str, NULL, -1, -1, -1, -1, arena); + if (format_spec == NULL) { + return NULL; } - return _PyAST_FormattedValue(arg, spec, format_spec, - arg->lineno, arg->col_offset, - arg->end_lineno, arg->end_col_offset, - arena); } - // Unsupported format. - return NULL; + return _PyAST_FormattedValue(arg, conv, format_spec, + arg->lineno, arg->col_offset, + arg->end_lineno, arg->end_col_offset, + arena); } static int diff --git a/Python/ceval.c b/Python/ceval.c index fa7b0b5a051e3a..f4a08cccbf08ad 100644 --- a/Python/ceval.c +++ b/Python/ceval.c @@ -4378,6 +4378,9 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, PyFrameObject *f, int throwflag) case FVC_STR: conv_fn = PyObject_Str; break; case FVC_REPR: conv_fn = PyObject_Repr; break; case FVC_ASCII: conv_fn = PyObject_ASCII; break; + case FVC_INT: conv_fn = PyNumber_Long; break; + case FVC_INDEX: conv_fn = PyNumber_Index; break; + case FVC_FLOAT: conv_fn = PyNumber_Float; break; default: _PyErr_Format(tstate, PyExc_SystemError, "unexpected conversion flag %d", diff --git a/Python/compile.c b/Python/compile.c index 94f2e825bd0913..e77b493e8122f0 100644 --- a/Python/compile.c +++ b/Python/compile.c @@ -4400,15 +4400,18 @@ compiler_formatted_value(struct compiler *c, expr_ty e) /* Our oparg encodes 2 pieces of information: the conversion character, and whether or not a format_spec was provided. - Convert the conversion char to 3 bits: - : 000 0x0 FVC_NONE The default if nothing specified. - !s : 001 0x1 FVC_STR - !r : 010 0x2 FVC_REPR - !a : 011 0x3 FVC_ASCII + Convert the conversion char to 4 bits: + : 0000 0x0 FVC_NONE The default if nothing specified. + !s : 0001 0x1 FVC_STR + !r : 0010 0x2 FVC_REPR + !a : 0011 0x3 FVC_ASCII + !d : 0100 0x4 FVC_INT + !i : 0101 0x5 FVC_INDEX + !f : 0110 0x6 FVC_FLOAT next bit is whether or not we have a format spec: - yes : 100 0x4 - no : 000 0x0 + yes : 1000 0x8 + no : 0000 0x0 */ int conversion = e->v.FormattedValue.conversion; @@ -4421,6 +4424,9 @@ compiler_formatted_value(struct compiler *c, expr_ty e) case 's': oparg = FVC_STR; break; case 'r': oparg = FVC_REPR; break; case 'a': oparg = FVC_ASCII; break; + case 'd': oparg = FVC_INT; break; + case 'i': oparg = FVC_INDEX; break; + case 'f': oparg = FVC_FLOAT; break; case -1: oparg = FVC_NONE; break; default: PyErr_Format(PyExc_SystemError, diff --git a/Python/importlib_external.h b/Python/importlib_external.h index 4b8052d992a8f8..f5ea63d3f2eeef 100644 --- a/Python/importlib_external.h +++ b/Python/importlib_external.h @@ -370,7 +370,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 9,62,0,190,7,65,22,7,193,6,5,65,12,6,193,11, 1,65,22,7,193,12,7,65,21,13,193,19,3,65,22,7, 193,23,1,65,21,13,193,24,1,65,22,7,114,96,0,0, - 0,105,123,13,0,0,114,45,0,0,0,114,33,0,0,0, + 0,105,124,13,0,0,114,45,0,0,0,114,33,0,0,0, 115,2,0,0,0,13,10,90,11,95,95,112,121,99,97,99, 104,101,95,95,122,4,111,112,116,45,122,3,46,112,121,122, 4,46,112,121,119,122,4,46,112,121,99,41,1,218,12,111, @@ -484,7 +484,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 108,109,111,115,116,95,102,105,108,101,110,97,109,101,218,8, 102,105,108,101,110,97,109,101,114,7,0,0,0,114,7,0, 0,0,114,8,0,0,0,218,17,99,97,99,104,101,95,102, - 114,111,109,95,115,111,117,114,99,101,126,1,0,0,115,72, + 114,111,109,95,115,111,117,114,99,101,128,1,0,0,115,72, 0,0,0,8,18,6,1,2,1,4,255,8,2,4,1,8, 1,12,1,10,1,12,1,16,1,8,1,8,1,8,1,24, 1,8,1,12,1,6,1,8,2,8,1,8,1,8,1,14, @@ -565,7 +565,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 0,90,9,111,112,116,95,108,101,118,101,108,90,13,98,97, 115,101,95,102,105,108,101,110,97,109,101,114,7,0,0,0, 114,7,0,0,0,114,8,0,0,0,218,17,115,111,117,114, - 99,101,95,102,114,111,109,95,99,97,99,104,101,197,1,0, + 99,101,95,102,114,111,109,95,99,97,99,104,101,199,1,0, 0,115,60,0,0,0,12,9,8,1,10,1,12,1,4,1, 10,1,12,1,14,1,16,1,4,1,4,1,12,1,8,1, 8,1,2,1,8,255,10,2,8,1,14,1,8,1,16,1, @@ -601,7 +601,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 95,90,9,101,120,116,101,110,115,105,111,110,218,11,115,111, 117,114,99,101,95,112,97,116,104,114,7,0,0,0,114,7, 0,0,0,114,8,0,0,0,218,15,95,103,101,116,95,115, - 111,117,114,99,101,102,105,108,101,237,1,0,0,115,26,0, + 111,117,114,99,101,102,105,108,101,239,1,0,0,115,26,0, 0,0,12,7,4,1,16,1,24,1,4,1,2,1,10,1, 2,128,16,1,16,1,2,128,16,1,2,254,115,12,0,0, 0,159,4,36,0,164,15,53,7,190,1,53,7,114,136,0, @@ -616,7 +616,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 0,0,0,114,108,0,0,0,114,114,0,0,0,41,1,114, 121,0,0,0,114,7,0,0,0,114,7,0,0,0,114,8, 0,0,0,218,11,95,103,101,116,95,99,97,99,104,101,100, - 0,2,0,0,115,22,0,0,0,14,1,2,1,8,1,2, + 2,2,0,0,115,22,0,0,0,14,1,2,1,8,1,2, 128,12,1,6,1,2,128,14,1,4,1,4,2,2,251,115, 12,0,0,0,136,3,12,0,140,7,22,7,162,1,22,7, 114,138,0,0,0,99,1,0,0,0,0,0,0,0,0,0, @@ -632,7 +632,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 114,78,0,0,0,114,77,0,0,0,41,2,114,66,0,0, 0,114,79,0,0,0,114,7,0,0,0,114,7,0,0,0, 114,8,0,0,0,218,10,95,99,97,108,99,95,109,111,100, - 101,12,2,0,0,115,18,0,0,0,2,2,12,1,2,128, + 101,14,2,0,0,115,18,0,0,0,2,2,12,1,2,128, 12,1,8,1,2,128,8,3,4,1,2,251,115,12,0,0, 0,129,5,7,0,135,9,18,7,153,1,18,7,114,140,0, 0,0,99,1,0,0,0,0,0,0,0,0,0,0,0,3, @@ -671,7 +671,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 6,107,119,97,114,103,115,169,1,218,6,109,101,116,104,111, 100,114,7,0,0,0,114,8,0,0,0,218,19,95,99,104, 101,99,107,95,110,97,109,101,95,119,114,97,112,112,101,114, - 32,2,0,0,115,18,0,0,0,8,1,8,1,10,1,4, + 34,2,0,0,115,18,0,0,0,8,1,8,1,10,1,4, 1,12,1,2,255,2,1,6,255,24,2,114,10,0,0,0, 122,40,95,99,104,101,99,107,95,110,97,109,101,46,60,108, 111,99,97,108,115,62,46,95,99,104,101,99,107,95,110,97, @@ -689,7 +689,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 8,95,95,100,105,99,116,95,95,218,6,117,112,100,97,116, 101,41,3,90,3,110,101,119,90,3,111,108,100,114,86,0, 0,0,114,7,0,0,0,114,7,0,0,0,114,8,0,0, - 0,218,5,95,119,114,97,112,45,2,0,0,115,10,0,0, + 0,218,5,95,119,114,97,112,47,2,0,0,115,10,0,0, 0,8,1,10,1,18,1,2,128,18,1,114,10,0,0,0, 122,26,95,99,104,101,99,107,95,110,97,109,101,46,60,108, 111,99,97,108,115,62,46,95,119,114,97,112,114,70,0,0, @@ -697,7 +697,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 159,0,0,0,41,3,114,148,0,0,0,114,149,0,0,0, 114,159,0,0,0,114,7,0,0,0,114,147,0,0,0,114, 8,0,0,0,218,11,95,99,104,101,99,107,95,110,97,109, - 101,24,2,0,0,115,12,0,0,0,14,8,8,10,8,1, + 101,26,2,0,0,115,12,0,0,0,14,8,8,10,8,1, 8,2,10,6,4,1,114,10,0,0,0,114,161,0,0,0, 99,2,0,0,0,0,0,0,0,0,0,0,0,5,0,0, 0,6,0,0,0,67,0,0,0,115,72,0,0,0,116,0, @@ -732,7 +732,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 111,97,100,101,114,218,8,112,111,114,116,105,111,110,115,218, 3,109,115,103,114,7,0,0,0,114,7,0,0,0,114,8, 0,0,0,218,17,95,102,105,110,100,95,109,111,100,117,108, - 101,95,115,104,105,109,55,2,0,0,115,16,0,0,0,6, + 101,95,115,104,105,109,57,2,0,0,115,16,0,0,0,6, 7,2,2,4,254,14,6,16,1,4,1,22,1,4,1,114, 10,0,0,0,114,168,0,0,0,99,3,0,0,0,0,0, 0,0,0,0,0,0,6,0,0,0,4,0,0,0,67,0, @@ -800,7 +800,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 97,105,108,115,90,5,109,97,103,105,99,114,118,0,0,0, 114,17,0,0,0,114,7,0,0,0,114,7,0,0,0,114, 8,0,0,0,218,13,95,99,108,97,115,115,105,102,121,95, - 112,121,99,75,2,0,0,115,28,0,0,0,12,16,8,1, + 112,121,99,77,2,0,0,115,28,0,0,0,12,16,8,1, 16,1,12,1,16,1,12,1,10,1,12,1,8,1,16,1, 8,2,16,1,16,1,4,1,114,10,0,0,0,114,177,0, 0,0,99,5,0,0,0,0,0,0,0,0,0,0,0,6, @@ -855,7 +855,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 115,105,122,101,114,142,0,0,0,114,176,0,0,0,114,118, 0,0,0,114,7,0,0,0,114,7,0,0,0,114,8,0, 0,0,218,23,95,118,97,108,105,100,97,116,101,95,116,105, - 109,101,115,116,97,109,112,95,112,121,99,108,2,0,0,115, + 109,101,115,116,97,109,112,95,112,121,99,110,2,0,0,115, 18,0,0,0,24,19,10,1,12,1,16,1,8,1,22,1, 2,255,22,2,8,254,114,10,0,0,0,114,181,0,0,0, 99,4,0,0,0,0,0,0,0,0,0,0,0,4,0,0, @@ -902,7 +902,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 114,99,101,95,104,97,115,104,114,142,0,0,0,114,176,0, 0,0,114,7,0,0,0,114,7,0,0,0,114,8,0,0, 0,218,18,95,118,97,108,105,100,97,116,101,95,104,97,115, - 104,95,112,121,99,136,2,0,0,115,14,0,0,0,16,17, + 104,95,112,121,99,138,2,0,0,115,14,0,0,0,16,17, 2,1,8,1,4,255,2,2,6,254,4,255,114,10,0,0, 0,114,183,0,0,0,99,4,0,0,0,0,0,0,0,0, 0,0,0,5,0,0,0,5,0,0,0,67,0,0,0,115, @@ -926,7 +926,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 0,114,142,0,0,0,114,133,0,0,0,114,135,0,0,0, 218,4,99,111,100,101,114,7,0,0,0,114,7,0,0,0, 114,8,0,0,0,218,17,95,99,111,109,112,105,108,101,95, - 98,121,116,101,99,111,100,101,160,2,0,0,115,18,0,0, + 98,121,116,101,99,111,100,101,162,2,0,0,115,18,0,0, 0,10,2,10,1,12,1,8,1,12,1,4,1,10,2,4, 1,6,255,114,10,0,0,0,114,190,0,0,0,99,3,0, 0,0,0,0,0,0,0,0,0,0,4,0,0,0,5,0, @@ -945,7 +945,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 180,0,0,0,114,42,0,0,0,114,7,0,0,0,114,7, 0,0,0,114,8,0,0,0,218,22,95,99,111,100,101,95, 116,111,95,116,105,109,101,115,116,97,109,112,95,112,121,99, - 173,2,0,0,115,12,0,0,0,8,2,14,1,14,1,14, + 175,2,0,0,115,12,0,0,0,8,2,14,1,14,1,14, 1,16,1,4,1,114,10,0,0,0,114,195,0,0,0,84, 99,3,0,0,0,0,0,0,0,0,0,0,0,5,0,0, 0,5,0,0,0,67,0,0,0,115,80,0,0,0,116,0, @@ -963,7 +963,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 182,0,0,0,90,7,99,104,101,99,107,101,100,114,42,0, 0,0,114,17,0,0,0,114,7,0,0,0,114,7,0,0, 0,114,8,0,0,0,218,17,95,99,111,100,101,95,116,111, - 95,104,97,115,104,95,112,121,99,183,2,0,0,115,14,0, + 95,104,97,115,104,95,112,121,99,185,2,0,0,115,14,0, 0,0,8,2,12,1,14,1,16,1,10,1,16,1,4,1, 114,10,0,0,0,114,196,0,0,0,99,1,0,0,0,0, 0,0,0,0,0,0,0,5,0,0,0,6,0,0,0,67, @@ -991,7 +991,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 101,110,99,111,100,105,110,103,90,15,110,101,119,108,105,110, 101,95,100,101,99,111,100,101,114,114,7,0,0,0,114,7, 0,0,0,114,8,0,0,0,218,13,100,101,99,111,100,101, - 95,115,111,117,114,99,101,194,2,0,0,115,10,0,0,0, + 95,115,111,117,114,99,101,196,2,0,0,115,10,0,0,0, 8,5,12,1,10,1,12,1,20,1,114,10,0,0,0,114, 201,0,0,0,169,2,114,165,0,0,0,218,26,115,117,98, 109,111,100,117,108,101,95,115,101,97,114,99,104,95,108,111, @@ -1057,7 +1057,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 0,0,0,90,7,100,105,114,110,97,109,101,114,7,0,0, 0,114,7,0,0,0,114,8,0,0,0,218,23,115,112,101, 99,95,102,114,111,109,95,102,105,108,101,95,108,111,99,97, - 116,105,111,110,211,2,0,0,115,96,0,0,0,8,12,4, + 116,105,111,110,213,2,0,0,115,96,0,0,0,8,12,4, 4,10,1,2,2,12,1,2,128,12,1,4,1,2,128,2, 251,10,7,8,1,2,1,16,1,2,128,12,1,4,1,2, 128,16,8,6,1,8,3,14,1,14,1,10,1,6,1,4, @@ -1100,7 +1100,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 69,89,95,76,79,67,65,76,95,77,65,67,72,73,78,69, 114,20,0,0,0,114,7,0,0,0,114,7,0,0,0,114, 8,0,0,0,218,14,95,111,112,101,110,95,114,101,103,105, - 115,116,114,121,40,3,0,0,115,14,0,0,0,2,2,14, + 115,116,114,121,42,3,0,0,115,14,0,0,0,2,2,14, 1,2,128,12,1,18,1,2,128,2,255,115,12,0,0,0, 129,6,8,0,136,14,24,7,153,1,24,7,122,36,87,105, 110,100,111,119,115,82,101,103,105,115,116,114,121,70,105,110, @@ -1129,7 +1129,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 0,0,0,90,4,104,107,101,121,218,8,102,105,108,101,112, 97,116,104,114,7,0,0,0,114,7,0,0,0,114,8,0, 0,0,218,16,95,115,101,97,114,99,104,95,114,101,103,105, - 115,116,114,121,47,3,0,0,115,34,0,0,0,6,2,8, + 115,116,114,121,49,3,0,0,115,34,0,0,0,6,2,8, 1,6,2,6,1,16,1,6,255,2,2,12,1,12,1,12, 255,22,128,4,4,2,128,12,254,6,1,2,128,2,255,115, 39,0,0,0,153,5,56,0,158,7,43,3,165,6,56,0, @@ -1155,7 +1155,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 114,103,101,116,114,223,0,0,0,114,165,0,0,0,114,213, 0,0,0,114,211,0,0,0,114,7,0,0,0,114,7,0, 0,0,114,8,0,0,0,218,9,102,105,110,100,95,115,112, - 101,99,62,3,0,0,115,38,0,0,0,10,2,8,1,4, + 101,99,64,3,0,0,115,38,0,0,0,10,2,8,1,4, 1,2,1,10,1,2,128,12,1,6,1,2,128,14,1,14, 1,6,1,8,1,2,1,6,254,8,3,2,252,4,255,2, 254,115,12,0,0,0,140,4,17,0,145,7,27,7,188,1, @@ -1184,7 +1184,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 0,0,114,165,0,0,0,169,4,114,222,0,0,0,114,164, 0,0,0,114,66,0,0,0,114,211,0,0,0,114,7,0, 0,0,114,7,0,0,0,114,8,0,0,0,218,11,102,105, - 110,100,95,109,111,100,117,108,101,78,3,0,0,115,14,0, + 110,100,95,109,111,100,117,108,101,80,3,0,0,115,14,0, 0,0,6,7,2,2,4,254,12,3,8,1,6,1,4,2, 114,10,0,0,0,122,33,87,105,110,100,111,119,115,82,101, 103,105,115,116,114,121,70,105,110,100,101,114,46,102,105,110, @@ -1197,7 +1197,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 101,116,104,111,100,114,217,0,0,0,218,11,99,108,97,115, 115,109,101,116,104,111,100,114,224,0,0,0,114,227,0,0, 0,114,230,0,0,0,114,7,0,0,0,114,7,0,0,0, - 114,7,0,0,0,114,8,0,0,0,114,215,0,0,0,28, + 114,7,0,0,0,114,8,0,0,0,114,215,0,0,0,30, 3,0,0,115,30,0,0,0,8,0,4,2,2,3,2,255, 2,4,2,255,12,3,2,2,10,1,2,6,10,1,2,14, 12,1,2,15,16,1,114,10,0,0,0,114,215,0,0,0, @@ -1234,7 +1234,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 164,0,0,0,114,121,0,0,0,90,13,102,105,108,101,110, 97,109,101,95,98,97,115,101,90,9,116,97,105,108,95,110, 97,109,101,114,7,0,0,0,114,7,0,0,0,114,8,0, - 0,0,114,207,0,0,0,100,3,0,0,115,8,0,0,0, + 0,0,114,207,0,0,0,102,3,0,0,115,8,0,0,0, 18,3,16,1,14,1,16,1,114,10,0,0,0,122,24,95, 76,111,97,100,101,114,66,97,115,105,99,115,46,105,115,95, 112,97,99,107,97,103,101,99,2,0,0,0,0,0,0,0, @@ -1245,7 +1245,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 111,110,46,78,114,7,0,0,0,169,2,114,144,0,0,0, 114,211,0,0,0,114,7,0,0,0,114,7,0,0,0,114, 8,0,0,0,218,13,99,114,101,97,116,101,95,109,111,100, - 117,108,101,108,3,0,0,243,2,0,0,0,4,0,114,10, + 117,108,101,110,3,0,0,243,2,0,0,0,4,0,114,10, 0,0,0,122,27,95,76,111,97,100,101,114,66,97,115,105, 99,115,46,99,114,101,97,116,101,95,109,111,100,117,108,101, 99,2,0,0,0,0,0,0,0,0,0,0,0,3,0,0, @@ -1265,7 +1265,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 4,101,120,101,99,114,157,0,0,0,41,3,114,144,0,0, 0,218,6,109,111,100,117,108,101,114,189,0,0,0,114,7, 0,0,0,114,7,0,0,0,114,8,0,0,0,218,11,101, - 120,101,99,95,109,111,100,117,108,101,111,3,0,0,115,12, + 120,101,99,95,109,111,100,117,108,101,113,3,0,0,115,12, 0,0,0,12,2,8,1,4,1,8,1,4,255,20,2,114, 10,0,0,0,122,25,95,76,111,97,100,101,114,66,97,115, 105,99,115,46,101,120,101,99,95,109,111,100,117,108,101,99, @@ -1277,14 +1277,14 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 17,95,108,111,97,100,95,109,111,100,117,108,101,95,115,104, 105,109,169,2,114,144,0,0,0,114,164,0,0,0,114,7, 0,0,0,114,7,0,0,0,114,8,0,0,0,218,11,108, - 111,97,100,95,109,111,100,117,108,101,119,3,0,0,115,2, + 111,97,100,95,109,111,100,117,108,101,121,3,0,0,115,2, 0,0,0,12,3,114,10,0,0,0,122,25,95,76,111,97, 100,101,114,66,97,115,105,99,115,46,108,111,97,100,95,109, 111,100,117,108,101,78,41,8,114,151,0,0,0,114,150,0, 0,0,114,152,0,0,0,114,153,0,0,0,114,207,0,0, 0,114,240,0,0,0,114,246,0,0,0,114,249,0,0,0, 114,7,0,0,0,114,7,0,0,0,114,7,0,0,0,114, - 8,0,0,0,114,236,0,0,0,95,3,0,0,115,12,0, + 8,0,0,0,114,236,0,0,0,97,3,0,0,115,12,0, 0,0,8,0,4,2,8,3,8,8,8,3,12,8,114,10, 0,0,0,114,236,0,0,0,99,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,3,0,0,0,64,0,0, @@ -1309,7 +1309,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 100,46,10,32,32,32,32,32,32,32,32,78,41,1,114,77, 0,0,0,169,2,114,144,0,0,0,114,66,0,0,0,114, 7,0,0,0,114,7,0,0,0,114,8,0,0,0,218,10, - 112,97,116,104,95,109,116,105,109,101,127,3,0,0,115,2, + 112,97,116,104,95,109,116,105,109,101,129,3,0,0,115,2, 0,0,0,4,6,114,10,0,0,0,122,23,83,111,117,114, 99,101,76,111,97,100,101,114,46,112,97,116,104,95,109,116, 105,109,101,99,2,0,0,0,0,0,0,0,0,0,0,0, @@ -1344,7 +1344,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 32,32,32,32,114,194,0,0,0,78,41,1,114,252,0,0, 0,114,251,0,0,0,114,7,0,0,0,114,7,0,0,0, 114,8,0,0,0,218,10,112,97,116,104,95,115,116,97,116, - 115,135,3,0,0,115,2,0,0,0,14,12,114,10,0,0, + 115,137,3,0,0,115,2,0,0,0,14,12,114,10,0,0, 0,122,23,83,111,117,114,99,101,76,111,97,100,101,114,46, 112,97,116,104,95,115,116,97,116,115,99,4,0,0,0,0, 0,0,0,0,0,0,0,4,0,0,0,4,0,0,0,67, @@ -1368,7 +1368,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 114,135,0,0,0,90,10,99,97,99,104,101,95,112,97,116, 104,114,42,0,0,0,114,7,0,0,0,114,7,0,0,0, 114,8,0,0,0,218,15,95,99,97,99,104,101,95,98,121, - 116,101,99,111,100,101,149,3,0,0,115,2,0,0,0,12, + 116,101,99,111,100,101,151,3,0,0,115,2,0,0,0,12, 8,114,10,0,0,0,122,28,83,111,117,114,99,101,76,111, 97,100,101,114,46,95,99,97,99,104,101,95,98,121,116,101, 99,111,100,101,99,3,0,0,0,0,0,0,0,0,0,0, @@ -1385,7 +1385,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 101,115,46,10,32,32,32,32,32,32,32,32,78,114,7,0, 0,0,41,3,114,144,0,0,0,114,66,0,0,0,114,42, 0,0,0,114,7,0,0,0,114,7,0,0,0,114,8,0, - 0,0,114,254,0,0,0,159,3,0,0,114,241,0,0,0, + 0,0,114,254,0,0,0,161,3,0,0,114,241,0,0,0, 114,10,0,0,0,122,21,83,111,117,114,99,101,76,111,97, 100,101,114,46,115,101,116,95,100,97,116,97,99,2,0,0, 0,0,0,0,0,0,0,0,0,5,0,0,0,8,0,0, @@ -1405,7 +1405,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 0,0,114,201,0,0,0,41,5,114,144,0,0,0,114,164, 0,0,0,114,66,0,0,0,114,199,0,0,0,218,3,101, 120,99,114,7,0,0,0,114,7,0,0,0,114,8,0,0, - 0,218,10,103,101,116,95,115,111,117,114,99,101,166,3,0, + 0,218,10,103,101,116,95,115,111,117,114,99,101,168,3,0, 0,115,26,0,0,0,10,2,2,1,10,1,8,4,2,128, 12,253,4,1,2,1,4,255,2,1,2,255,10,128,2,255, 115,20,0,0,0,134,5,15,0,143,7,33,7,150,7,29, @@ -1430,7 +1430,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 4,114,144,0,0,0,114,42,0,0,0,114,66,0,0,0, 114,3,1,0,0,114,7,0,0,0,114,7,0,0,0,114, 8,0,0,0,218,14,115,111,117,114,99,101,95,116,111,95, - 99,111,100,101,176,3,0,0,115,6,0,0,0,12,5,4, + 99,111,100,101,178,3,0,0,115,6,0,0,0,12,5,4, 1,6,255,114,10,0,0,0,122,27,83,111,117,114,99,101, 76,111,97,100,101,114,46,115,111,117,114,99,101,95,116,111, 95,99,111,100,101,99,2,0,0,0,0,0,0,0,0,0, @@ -1507,7 +1507,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 42,0,0,0,114,176,0,0,0,114,17,0,0,0,90,10, 98,121,116,101,115,95,100,97,116,97,90,11,99,111,100,101, 95,111,98,106,101,99,116,114,7,0,0,0,114,7,0,0, - 0,114,8,0,0,0,114,242,0,0,0,184,3,0,0,115, + 0,114,8,0,0,0,114,242,0,0,0,186,3,0,0,115, 188,0,0,0,10,7,4,1,4,1,4,1,4,1,4,1, 2,1,10,1,2,128,14,1,8,1,2,128,2,2,12,1, 2,128,14,1,4,1,2,128,12,2,2,1,12,1,2,128, @@ -1531,7 +1531,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 0,0,0,114,253,0,0,0,114,255,0,0,0,114,254,0, 0,0,114,2,1,0,0,114,6,1,0,0,114,242,0,0, 0,114,7,0,0,0,114,7,0,0,0,114,7,0,0,0, - 114,8,0,0,0,114,250,0,0,0,125,3,0,0,115,16, + 114,8,0,0,0,114,250,0,0,0,127,3,0,0,115,16, 0,0,0,8,0,8,2,8,8,8,14,8,10,8,7,14, 10,12,8,114,10,0,0,0,114,250,0,0,0,99,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0, @@ -1559,7 +1559,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 32,32,32,32,102,105,110,100,101,114,46,78,114,184,0,0, 0,41,3,114,144,0,0,0,114,164,0,0,0,114,66,0, 0,0,114,7,0,0,0,114,7,0,0,0,114,8,0,0, - 0,114,237,0,0,0,18,4,0,0,115,4,0,0,0,6, + 0,114,237,0,0,0,20,4,0,0,115,4,0,0,0,6, 3,10,1,114,10,0,0,0,122,19,70,105,108,101,76,111, 97,100,101,114,46,95,95,105,110,105,116,95,95,99,2,0, 0,0,0,0,0,0,0,0,0,0,2,0,0,0,2,0, @@ -1568,7 +1568,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 2,83,0,114,70,0,0,0,169,2,218,9,95,95,99,108, 97,115,115,95,95,114,157,0,0,0,169,2,114,144,0,0, 0,90,5,111,116,104,101,114,114,7,0,0,0,114,7,0, - 0,0,114,8,0,0,0,218,6,95,95,101,113,95,95,24, + 0,0,114,8,0,0,0,218,6,95,95,101,113,95,95,26, 4,0,0,243,6,0,0,0,12,1,10,1,2,255,114,10, 0,0,0,122,17,70,105,108,101,76,111,97,100,101,114,46, 95,95,101,113,95,95,99,1,0,0,0,0,0,0,0,0, @@ -1577,7 +1577,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 106,2,131,1,65,0,83,0,114,70,0,0,0,169,3,218, 4,104,97,115,104,114,142,0,0,0,114,66,0,0,0,169, 1,114,144,0,0,0,114,7,0,0,0,114,7,0,0,0, - 114,8,0,0,0,218,8,95,95,104,97,115,104,95,95,28, + 114,8,0,0,0,218,8,95,95,104,97,115,104,95,95,30, 4,0,0,243,2,0,0,0,20,1,114,10,0,0,0,122, 19,70,105,108,101,76,111,97,100,101,114,46,95,95,104,97, 115,104,95,95,99,2,0,0,0,0,0,0,0,0,0,0, @@ -1592,7 +1592,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 10,10,32,32,32,32,32,32,32,32,78,41,3,218,5,115, 117,112,101,114,114,12,1,0,0,114,249,0,0,0,114,248, 0,0,0,169,1,114,15,1,0,0,114,7,0,0,0,114, - 8,0,0,0,114,249,0,0,0,31,4,0,0,115,2,0, + 8,0,0,0,114,249,0,0,0,33,4,0,0,115,2,0, 0,0,16,10,114,10,0,0,0,122,22,70,105,108,101,76, 111,97,100,101,114,46,108,111,97,100,95,109,111,100,117,108, 101,99,2,0,0,0,0,0,0,0,0,0,0,0,2,0, @@ -1603,7 +1603,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 111,117,110,100,32,98,121,32,116,104,101,32,102,105,110,100, 101,114,46,78,114,72,0,0,0,114,248,0,0,0,114,7, 0,0,0,114,7,0,0,0,114,8,0,0,0,114,204,0, - 0,0,43,4,0,0,243,2,0,0,0,6,3,114,10,0, + 0,0,45,4,0,0,243,2,0,0,0,6,3,114,10,0, 0,0,122,23,70,105,108,101,76,111,97,100,101,114,46,103, 101,116,95,102,105,108,101,110,97,109,101,99,2,0,0,0, 0,0,0,0,0,0,0,0,3,0,0,0,9,0,0,0, @@ -1625,7 +1625,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 101,114,110,0,0,0,90,4,114,101,97,100,114,93,0,0, 0,41,3,114,144,0,0,0,114,66,0,0,0,114,95,0, 0,0,114,7,0,0,0,114,7,0,0,0,114,8,0,0, - 0,114,0,1,0,0,48,4,0,0,115,26,0,0,0,14, + 0,114,0,1,0,0,50,4,0,0,115,26,0,0,0,14, 2,16,1,6,1,12,255,2,1,22,128,4,0,14,2,6, 1,12,255,2,1,22,128,4,0,115,24,0,0,0,142,4, 25,3,153,4,29,11,158,3,29,11,172,4,55,3,183,4, @@ -1640,7 +1640,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 144,0,0,0,114,245,0,0,0,114,32,1,0,0,114,7, 0,0,0,114,7,0,0,0,114,8,0,0,0,218,19,103, 101,116,95,114,101,115,111,117,114,99,101,95,114,101,97,100, - 101,114,57,4,0,0,115,4,0,0,0,12,2,8,1,114, + 101,114,59,4,0,0,115,4,0,0,0,12,2,8,1,114, 10,0,0,0,122,30,70,105,108,101,76,111,97,100,101,114, 46,103,101,116,95,114,101,115,111,117,114,99,101,95,114,101, 97,100,101,114,41,13,114,151,0,0,0,114,150,0,0,0, @@ -1649,7 +1649,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 0,0,0,114,204,0,0,0,114,0,1,0,0,114,34,1, 0,0,90,13,95,95,99,108,97,115,115,99,101,108,108,95, 95,114,7,0,0,0,114,7,0,0,0,114,26,1,0,0, - 114,8,0,0,0,114,12,1,0,0,13,4,0,0,115,24, + 114,8,0,0,0,114,12,1,0,0,15,4,0,0,115,24, 0,0,0,8,0,4,2,8,3,8,6,8,4,2,3,14, 1,2,11,10,1,8,4,2,9,18,1,114,10,0,0,0, 114,12,1,0,0,99,0,0,0,0,0,0,0,0,0,0, @@ -1672,7 +1672,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 0,0,218,8,115,116,95,109,116,105,109,101,90,7,115,116, 95,115,105,122,101,41,3,114,144,0,0,0,114,66,0,0, 0,114,11,1,0,0,114,7,0,0,0,114,7,0,0,0, - 114,8,0,0,0,114,253,0,0,0,67,4,0,0,115,4, + 114,8,0,0,0,114,253,0,0,0,69,4,0,0,115,4, 0,0,0,8,2,14,1,114,10,0,0,0,122,27,83,111, 117,114,99,101,70,105,108,101,76,111,97,100,101,114,46,112, 97,116,104,95,115,116,97,116,115,99,4,0,0,0,0,0, @@ -1683,7 +1683,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 0,0,114,254,0,0,0,41,5,114,144,0,0,0,114,135, 0,0,0,114,133,0,0,0,114,42,0,0,0,114,79,0, 0,0,114,7,0,0,0,114,7,0,0,0,114,8,0,0, - 0,114,255,0,0,0,72,4,0,0,115,4,0,0,0,8, + 0,114,255,0,0,0,74,4,0,0,115,4,0,0,0,8, 2,16,1,114,10,0,0,0,122,32,83,111,117,114,99,101, 70,105,108,101,76,111,97,100,101,114,46,95,99,97,99,104, 101,95,98,121,116,101,99,111,100,101,114,88,0,0,0,114, @@ -1718,7 +1718,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 66,0,0,0,114,42,0,0,0,114,38,1,0,0,218,6, 112,97,114,101,110,116,114,121,0,0,0,114,64,0,0,0, 114,69,0,0,0,114,1,1,0,0,114,7,0,0,0,114, - 7,0,0,0,114,8,0,0,0,114,254,0,0,0,77,4, + 7,0,0,0,114,8,0,0,0,114,254,0,0,0,79,4, 0,0,115,60,0,0,0,12,2,4,1,12,2,12,1,10, 1,12,254,12,4,10,1,2,1,12,1,2,128,12,1,4, 2,12,1,6,3,4,1,4,255,14,2,10,128,2,1,12, @@ -1733,7 +1733,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 0,0,0,114,153,0,0,0,114,253,0,0,0,114,255,0, 0,0,114,254,0,0,0,114,7,0,0,0,114,7,0,0, 0,114,7,0,0,0,114,8,0,0,0,114,35,1,0,0, - 63,4,0,0,115,10,0,0,0,8,0,4,2,8,2,8, + 65,4,0,0,115,10,0,0,0,8,0,4,2,8,2,8, 5,18,5,114,10,0,0,0,114,35,1,0,0,99,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0, 0,0,64,0,0,0,115,32,0,0,0,101,0,90,1,100, @@ -1755,7 +1755,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 0,0,0,114,8,1,0,0,41,5,114,144,0,0,0,114, 164,0,0,0,114,66,0,0,0,114,42,0,0,0,114,176, 0,0,0,114,7,0,0,0,114,7,0,0,0,114,8,0, - 0,0,114,242,0,0,0,112,4,0,0,115,22,0,0,0, + 0,0,114,242,0,0,0,114,4,0,0,115,22,0,0,0, 10,1,10,1,2,4,2,1,6,254,12,4,2,1,14,1, 2,1,2,1,6,253,114,10,0,0,0,122,29,83,111,117, 114,99,101,108,101,115,115,70,105,108,101,76,111,97,100,101, @@ -1766,13 +1766,13 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 32,105,115,32,110,111,32,115,111,117,114,99,101,32,99,111, 100,101,46,78,114,7,0,0,0,114,248,0,0,0,114,7, 0,0,0,114,7,0,0,0,114,8,0,0,0,114,2,1, - 0,0,128,4,0,0,114,25,0,0,0,114,10,0,0,0, + 0,0,130,4,0,0,114,25,0,0,0,114,10,0,0,0, 122,31,83,111,117,114,99,101,108,101,115,115,70,105,108,101, 76,111,97,100,101,114,46,103,101,116,95,115,111,117,114,99, 101,78,41,6,114,151,0,0,0,114,150,0,0,0,114,152, 0,0,0,114,153,0,0,0,114,242,0,0,0,114,2,1, 0,0,114,7,0,0,0,114,7,0,0,0,114,7,0,0, - 0,114,8,0,0,0,114,42,1,0,0,108,4,0,0,115, + 0,114,8,0,0,0,114,42,1,0,0,110,4,0,0,115, 8,0,0,0,8,0,4,2,8,2,12,16,114,10,0,0, 0,114,42,1,0,0,99,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,3,0,0,0,64,0,0,0,115, @@ -1794,20 +1794,20 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 100,0,83,0,114,70,0,0,0,114,184,0,0,0,41,3, 114,144,0,0,0,114,142,0,0,0,114,66,0,0,0,114, 7,0,0,0,114,7,0,0,0,114,8,0,0,0,114,237, - 0,0,0,141,4,0,0,115,4,0,0,0,6,1,10,1, + 0,0,0,143,4,0,0,115,4,0,0,0,6,1,10,1, 114,10,0,0,0,122,28,69,120,116,101,110,115,105,111,110, 70,105,108,101,76,111,97,100,101,114,46,95,95,105,110,105, 116,95,95,99,2,0,0,0,0,0,0,0,0,0,0,0, 2,0,0,0,2,0,0,0,67,0,0,0,114,13,1,0, 0,114,70,0,0,0,114,14,1,0,0,114,16,1,0,0, 114,7,0,0,0,114,7,0,0,0,114,8,0,0,0,114, - 17,1,0,0,145,4,0,0,114,18,1,0,0,114,10,0, + 17,1,0,0,147,4,0,0,114,18,1,0,0,114,10,0, 0,0,122,26,69,120,116,101,110,115,105,111,110,70,105,108, 101,76,111,97,100,101,114,46,95,95,101,113,95,95,99,1, 0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,3, 0,0,0,67,0,0,0,114,19,1,0,0,114,70,0,0, 0,114,20,1,0,0,114,22,1,0,0,114,7,0,0,0, - 114,7,0,0,0,114,8,0,0,0,114,23,1,0,0,149, + 114,7,0,0,0,114,8,0,0,0,114,23,1,0,0,151, 4,0,0,114,24,1,0,0,114,10,0,0,0,122,28,69, 120,116,101,110,115,105,111,110,70,105,108,101,76,111,97,100, 101,114,46,95,95,104,97,115,104,95,95,99,2,0,0,0, @@ -1825,7 +1825,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 99,114,174,0,0,0,114,142,0,0,0,114,66,0,0,0, 41,3,114,144,0,0,0,114,211,0,0,0,114,245,0,0, 0,114,7,0,0,0,114,7,0,0,0,114,8,0,0,0, - 114,240,0,0,0,152,4,0,0,115,14,0,0,0,4,2, + 114,240,0,0,0,154,4,0,0,115,14,0,0,0,4,2, 6,1,4,255,6,2,8,1,4,255,4,2,114,10,0,0, 0,122,33,69,120,116,101,110,115,105,111,110,70,105,108,101, 76,111,97,100,101,114,46,99,114,101,97,116,101,95,109,111, @@ -1843,7 +1843,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 105,99,114,174,0,0,0,114,142,0,0,0,114,66,0,0, 0,169,2,114,144,0,0,0,114,245,0,0,0,114,7,0, 0,0,114,7,0,0,0,114,8,0,0,0,114,246,0,0, - 0,160,4,0,0,115,8,0,0,0,14,2,6,1,8,1, + 0,162,4,0,0,115,8,0,0,0,14,2,6,1,8,1, 8,255,114,10,0,0,0,122,31,69,120,116,101,110,115,105, 111,110,70,105,108,101,76,111,97,100,101,114,46,101,120,101, 99,95,109,111,100,117,108,101,99,2,0,0,0,0,0,0, @@ -1861,14 +1861,14 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 114,237,0,0,0,78,114,7,0,0,0,169,2,114,5,0, 0,0,218,6,115,117,102,102,105,120,169,1,90,9,102,105, 108,101,95,110,97,109,101,114,7,0,0,0,114,8,0,0, - 0,114,9,0,0,0,169,4,0,0,115,6,0,0,0,6, + 0,114,9,0,0,0,171,4,0,0,115,6,0,0,0,6, 128,2,1,20,255,114,10,0,0,0,122,49,69,120,116,101, 110,115,105,111,110,70,105,108,101,76,111,97,100,101,114,46, 105,115,95,112,97,99,107,97,103,101,46,60,108,111,99,97, 108,115,62,46,60,103,101,110,101,120,112,114,62,78,41,4, 114,75,0,0,0,114,66,0,0,0,218,3,97,110,121,114, 233,0,0,0,114,248,0,0,0,114,7,0,0,0,114,46, - 1,0,0,114,8,0,0,0,114,207,0,0,0,166,4,0, + 1,0,0,114,8,0,0,0,114,207,0,0,0,168,4,0, 0,115,8,0,0,0,14,2,12,1,2,1,8,255,114,10, 0,0,0,122,30,69,120,116,101,110,115,105,111,110,70,105, 108,101,76,111,97,100,101,114,46,105,115,95,112,97,99,107, @@ -1880,7 +1880,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 114,101,97,116,101,32,97,32,99,111,100,101,32,111,98,106, 101,99,116,46,78,114,7,0,0,0,114,248,0,0,0,114, 7,0,0,0,114,7,0,0,0,114,8,0,0,0,114,242, - 0,0,0,172,4,0,0,114,25,0,0,0,114,10,0,0, + 0,0,0,174,4,0,0,114,25,0,0,0,114,10,0,0, 0,122,28,69,120,116,101,110,115,105,111,110,70,105,108,101, 76,111,97,100,101,114,46,103,101,116,95,99,111,100,101,99, 2,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0, @@ -1890,14 +1890,14 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 115,32,104,97,118,101,32,110,111,32,115,111,117,114,99,101, 32,99,111,100,101,46,78,114,7,0,0,0,114,248,0,0, 0,114,7,0,0,0,114,7,0,0,0,114,8,0,0,0, - 114,2,1,0,0,176,4,0,0,114,25,0,0,0,114,10, + 114,2,1,0,0,178,4,0,0,114,25,0,0,0,114,10, 0,0,0,122,30,69,120,116,101,110,115,105,111,110,70,105, 108,101,76,111,97,100,101,114,46,103,101,116,95,115,111,117, 114,99,101,99,2,0,0,0,0,0,0,0,0,0,0,0, 2,0,0,0,1,0,0,0,67,0,0,0,114,27,1,0, 0,114,28,1,0,0,114,72,0,0,0,114,248,0,0,0, 114,7,0,0,0,114,7,0,0,0,114,8,0,0,0,114, - 204,0,0,0,180,4,0,0,114,29,1,0,0,114,10,0, + 204,0,0,0,182,4,0,0,114,29,1,0,0,114,10,0, 0,0,122,32,69,120,116,101,110,115,105,111,110,70,105,108, 101,76,111,97,100,101,114,46,103,101,116,95,102,105,108,101, 110,97,109,101,78,41,14,114,151,0,0,0,114,150,0,0, @@ -1906,7 +1906,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 246,0,0,0,114,207,0,0,0,114,242,0,0,0,114,2, 1,0,0,114,161,0,0,0,114,204,0,0,0,114,7,0, 0,0,114,7,0,0,0,114,7,0,0,0,114,8,0,0, - 0,114,31,1,0,0,133,4,0,0,115,24,0,0,0,8, + 0,114,31,1,0,0,135,4,0,0,115,24,0,0,0,8, 0,4,2,8,6,8,4,8,4,8,3,8,8,8,6,8, 6,8,4,2,4,14,1,114,10,0,0,0,114,31,1,0, 0,99,0,0,0,0,0,0,0,0,0,0,0,0,0,0, @@ -1949,7 +1949,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 100,101,114,169,4,114,144,0,0,0,114,142,0,0,0,114, 66,0,0,0,90,11,112,97,116,104,95,102,105,110,100,101, 114,114,7,0,0,0,114,7,0,0,0,114,8,0,0,0, - 114,237,0,0,0,193,4,0,0,115,8,0,0,0,6,1, + 114,237,0,0,0,195,4,0,0,115,8,0,0,0,6,1, 6,1,14,1,10,1,114,10,0,0,0,122,23,95,78,97, 109,101,115,112,97,99,101,80,97,116,104,46,95,95,105,110, 105,116,95,95,99,1,0,0,0,0,0,0,0,0,0,0, @@ -1967,7 +1967,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 1,0,0,218,3,100,111,116,90,2,109,101,114,7,0,0, 0,114,7,0,0,0,114,8,0,0,0,218,23,95,102,105, 110,100,95,112,97,114,101,110,116,95,112,97,116,104,95,110, - 97,109,101,115,199,4,0,0,115,8,0,0,0,18,2,8, + 97,109,101,115,201,4,0,0,115,8,0,0,0,18,2,8, 1,4,2,8,3,114,10,0,0,0,122,38,95,78,97,109, 101,115,112,97,99,101,80,97,116,104,46,95,102,105,110,100, 95,112,97,114,101,110,116,95,112,97,116,104,95,110,97,109, @@ -1980,7 +1980,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 0,0,90,18,112,97,114,101,110,116,95,109,111,100,117,108, 101,95,110,97,109,101,90,14,112,97,116,104,95,97,116,116, 114,95,110,97,109,101,114,7,0,0,0,114,7,0,0,0, - 114,8,0,0,0,114,51,1,0,0,209,4,0,0,115,4, + 114,8,0,0,0,114,51,1,0,0,211,4,0,0,115,4, 0,0,0,12,1,16,1,114,10,0,0,0,122,31,95,78, 97,109,101,115,112,97,99,101,80,97,116,104,46,95,103,101, 116,95,112,97,114,101,110,116,95,112,97,116,104,99,1,0, @@ -1997,7 +1997,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 0,90,11,112,97,114,101,110,116,95,112,97,116,104,114,211, 0,0,0,114,7,0,0,0,114,7,0,0,0,114,8,0, 0,0,218,12,95,114,101,99,97,108,99,117,108,97,116,101, - 213,4,0,0,115,16,0,0,0,12,2,10,1,14,1,18, + 215,4,0,0,115,16,0,0,0,12,2,10,1,14,1,18, 3,6,1,8,1,6,1,6,1,114,10,0,0,0,122,27, 95,78,97,109,101,115,112,97,99,101,80,97,116,104,46,95, 114,101,99,97,108,99,117,108,97,116,101,99,1,0,0,0, @@ -2006,7 +2006,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 0,131,1,83,0,114,70,0,0,0,41,2,218,4,105,116, 101,114,114,58,1,0,0,114,22,1,0,0,114,7,0,0, 0,114,7,0,0,0,114,8,0,0,0,218,8,95,95,105, - 116,101,114,95,95,226,4,0,0,243,2,0,0,0,12,1, + 116,101,114,95,95,228,4,0,0,243,2,0,0,0,12,1, 114,10,0,0,0,122,23,95,78,97,109,101,115,112,97,99, 101,80,97,116,104,46,95,95,105,116,101,114,95,95,99,2, 0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,2, @@ -2014,7 +2014,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 161,0,124,1,25,0,83,0,114,70,0,0,0,169,1,114, 58,1,0,0,41,2,114,144,0,0,0,218,5,105,110,100, 101,120,114,7,0,0,0,114,7,0,0,0,114,8,0,0, - 0,218,11,95,95,103,101,116,105,116,101,109,95,95,229,4, + 0,218,11,95,95,103,101,116,105,116,101,109,95,95,231,4, 0,0,114,62,1,0,0,114,10,0,0,0,122,26,95,78, 97,109,101,115,112,97,99,101,80,97,116,104,46,95,95,103, 101,116,105,116,101,109,95,95,99,3,0,0,0,0,0,0, @@ -2023,7 +2023,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 100,0,83,0,114,70,0,0,0,41,1,114,50,1,0,0, 41,3,114,144,0,0,0,114,64,1,0,0,114,66,0,0, 0,114,7,0,0,0,114,7,0,0,0,114,8,0,0,0, - 218,11,95,95,115,101,116,105,116,101,109,95,95,232,4,0, + 218,11,95,95,115,101,116,105,116,101,109,95,95,234,4,0, 0,115,2,0,0,0,14,1,114,10,0,0,0,122,26,95, 78,97,109,101,115,112,97,99,101,80,97,116,104,46,95,95, 115,101,116,105,116,101,109,95,95,99,1,0,0,0,0,0, @@ -2031,7 +2031,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 0,0,114,59,1,0,0,114,70,0,0,0,41,2,114,4, 0,0,0,114,58,1,0,0,114,22,1,0,0,114,7,0, 0,0,114,7,0,0,0,114,8,0,0,0,218,7,95,95, - 108,101,110,95,95,235,4,0,0,114,62,1,0,0,114,10, + 108,101,110,95,95,237,4,0,0,114,62,1,0,0,114,10, 0,0,0,122,22,95,78,97,109,101,115,112,97,99,101,80, 97,116,104,46,95,95,108,101,110,95,95,99,1,0,0,0, 0,0,0,0,0,0,0,0,1,0,0,0,3,0,0,0, @@ -2040,7 +2040,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 112,97,99,101,80,97,116,104,40,123,33,114,125,41,41,2, 114,90,0,0,0,114,50,1,0,0,114,22,1,0,0,114, 7,0,0,0,114,7,0,0,0,114,8,0,0,0,218,8, - 95,95,114,101,112,114,95,95,238,4,0,0,114,62,1,0, + 95,95,114,101,112,114,95,95,240,4,0,0,114,62,1,0, 0,114,10,0,0,0,122,23,95,78,97,109,101,115,112,97, 99,101,80,97,116,104,46,95,95,114,101,112,114,95,95,99, 2,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0, @@ -2048,7 +2048,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 0,160,0,161,0,118,0,83,0,114,70,0,0,0,114,63, 1,0,0,169,2,114,144,0,0,0,218,4,105,116,101,109, 114,7,0,0,0,114,7,0,0,0,114,8,0,0,0,218, - 12,95,95,99,111,110,116,97,105,110,115,95,95,241,4,0, + 12,95,95,99,111,110,116,97,105,110,115,95,95,243,4,0, 0,114,62,1,0,0,114,10,0,0,0,122,27,95,78,97, 109,101,115,112,97,99,101,80,97,116,104,46,95,95,99,111, 110,116,97,105,110,115,95,95,99,2,0,0,0,0,0,0, @@ -2057,7 +2057,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 1,0,100,0,83,0,114,70,0,0,0,41,2,114,50,1, 0,0,114,62,0,0,0,114,70,1,0,0,114,7,0,0, 0,114,7,0,0,0,114,8,0,0,0,114,62,0,0,0, - 244,4,0,0,243,2,0,0,0,16,1,114,10,0,0,0, + 246,4,0,0,243,2,0,0,0,16,1,114,10,0,0,0, 122,21,95,78,97,109,101,115,112,97,99,101,80,97,116,104, 46,97,112,112,101,110,100,78,41,15,114,151,0,0,0,114, 150,0,0,0,114,152,0,0,0,114,153,0,0,0,114,237, @@ -2065,7 +2065,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 0,0,114,61,1,0,0,114,65,1,0,0,114,66,1,0, 0,114,67,1,0,0,114,69,1,0,0,114,72,1,0,0, 114,62,0,0,0,114,7,0,0,0,114,7,0,0,0,114, - 7,0,0,0,114,8,0,0,0,114,48,1,0,0,186,4, + 7,0,0,0,114,8,0,0,0,114,48,1,0,0,188,4, 0,0,115,26,0,0,0,8,0,4,1,8,6,8,6,8, 10,8,4,8,13,8,3,8,3,8,3,8,3,8,3,12, 3,114,10,0,0,0,114,48,1,0,0,99,0,0,0,0, @@ -2082,7 +2082,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 0,0,0,116,0,124,1,124,2,124,3,131,3,124,0,95, 1,100,0,83,0,114,70,0,0,0,41,2,114,48,1,0, 0,114,50,1,0,0,114,54,1,0,0,114,7,0,0,0, - 114,7,0,0,0,114,8,0,0,0,114,237,0,0,0,250, + 114,7,0,0,0,114,8,0,0,0,114,237,0,0,0,252, 4,0,0,115,2,0,0,0,18,1,114,10,0,0,0,122, 25,95,78,97,109,101,115,112,97,99,101,76,111,97,100,101, 114,46,95,95,105,110,105,116,95,95,99,1,0,0,0,0, @@ -2107,21 +2107,21 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 0,0,0,114,102,0,0,0,114,90,0,0,0,114,151,0, 0,0,41,1,114,245,0,0,0,114,7,0,0,0,114,7, 0,0,0,114,8,0,0,0,218,11,109,111,100,117,108,101, - 95,114,101,112,114,253,4,0,0,115,8,0,0,0,6,7, + 95,114,101,112,114,255,4,0,0,115,8,0,0,0,6,7, 2,1,4,255,12,2,114,10,0,0,0,122,28,95,78,97, 109,101,115,112,97,99,101,76,111,97,100,101,114,46,109,111, 100,117,108,101,95,114,101,112,114,99,2,0,0,0,0,0, 0,0,0,0,0,0,2,0,0,0,1,0,0,0,67,0, 0,0,114,24,0,0,0,41,2,78,84,114,7,0,0,0, 114,248,0,0,0,114,7,0,0,0,114,7,0,0,0,114, - 8,0,0,0,114,207,0,0,0,8,5,0,0,243,2,0, + 8,0,0,0,114,207,0,0,0,10,5,0,0,243,2,0, 0,0,4,1,114,10,0,0,0,122,27,95,78,97,109,101, 115,112,97,99,101,76,111,97,100,101,114,46,105,115,95,112, 97,99,107,97,103,101,99,2,0,0,0,0,0,0,0,0, 0,0,0,2,0,0,0,1,0,0,0,67,0,0,0,114, 24,0,0,0,41,2,78,114,11,0,0,0,114,7,0,0, 0,114,248,0,0,0,114,7,0,0,0,114,7,0,0,0, - 114,8,0,0,0,114,2,1,0,0,11,5,0,0,114,76, + 114,8,0,0,0,114,2,1,0,0,13,5,0,0,114,76, 1,0,0,114,10,0,0,0,122,27,95,78,97,109,101,115, 112,97,99,101,76,111,97,100,101,114,46,103,101,116,95,115, 111,117,114,99,101,99,2,0,0,0,0,0,0,0,0,0, @@ -2131,20 +2131,20 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 114,105,110,103,62,114,244,0,0,0,84,41,1,114,4,1, 0,0,41,1,114,5,1,0,0,114,248,0,0,0,114,7, 0,0,0,114,7,0,0,0,114,8,0,0,0,114,242,0, - 0,0,14,5,0,0,114,73,1,0,0,114,10,0,0,0, + 0,0,16,5,0,0,114,73,1,0,0,114,10,0,0,0, 122,25,95,78,97,109,101,115,112,97,99,101,76,111,97,100, 101,114,46,103,101,116,95,99,111,100,101,99,2,0,0,0, 0,0,0,0,0,0,0,0,2,0,0,0,1,0,0,0, 67,0,0,0,114,24,0,0,0,114,238,0,0,0,114,7, 0,0,0,114,239,0,0,0,114,7,0,0,0,114,7,0, - 0,0,114,8,0,0,0,114,240,0,0,0,17,5,0,0, + 0,0,114,8,0,0,0,114,240,0,0,0,19,5,0,0, 114,241,0,0,0,114,10,0,0,0,122,30,95,78,97,109, 101,115,112,97,99,101,76,111,97,100,101,114,46,99,114,101, 97,116,101,95,109,111,100,117,108,101,99,2,0,0,0,0, 0,0,0,0,0,0,0,2,0,0,0,1,0,0,0,67, 0,0,0,115,4,0,0,0,100,0,83,0,114,70,0,0, 0,114,7,0,0,0,114,43,1,0,0,114,7,0,0,0, - 114,7,0,0,0,114,8,0,0,0,114,246,0,0,0,20, + 114,7,0,0,0,114,8,0,0,0,114,246,0,0,0,22, 5,0,0,114,76,1,0,0,114,10,0,0,0,122,28,95, 78,97,109,101,115,112,97,99,101,76,111,97,100,101,114,46, 101,120,101,99,95,109,111,100,117,108,101,99,2,0,0,0, @@ -2163,7 +2163,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 125,78,41,4,114,160,0,0,0,114,174,0,0,0,114,50, 1,0,0,114,247,0,0,0,114,248,0,0,0,114,7,0, 0,0,114,7,0,0,0,114,8,0,0,0,114,249,0,0, - 0,23,5,0,0,115,8,0,0,0,6,7,4,1,4,255, + 0,25,5,0,0,115,8,0,0,0,6,7,4,1,4,255, 12,3,114,10,0,0,0,122,28,95,78,97,109,101,115,112, 97,99,101,76,111,97,100,101,114,46,108,111,97,100,95,109, 111,100,117,108,101,99,2,0,0,0,0,0,0,0,0,0, @@ -2174,7 +2174,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 97,100,101,114,41,3,114,33,1,0,0,114,77,1,0,0, 114,50,1,0,0,41,3,114,144,0,0,0,114,245,0,0, 0,114,77,1,0,0,114,7,0,0,0,114,7,0,0,0, - 114,8,0,0,0,114,34,1,0,0,35,5,0,0,115,4, + 114,8,0,0,0,114,34,1,0,0,37,5,0,0,115,4, 0,0,0,12,1,10,1,114,10,0,0,0,122,36,95,78, 97,109,101,115,112,97,99,101,76,111,97,100,101,114,46,103, 101,116,95,114,101,115,111,117,114,99,101,95,114,101,97,100, @@ -2183,7 +2183,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 1,0,0,114,207,0,0,0,114,2,1,0,0,114,242,0, 0,0,114,240,0,0,0,114,246,0,0,0,114,249,0,0, 0,114,34,1,0,0,114,7,0,0,0,114,7,0,0,0, - 114,7,0,0,0,114,8,0,0,0,114,74,1,0,0,249, + 114,7,0,0,0,114,8,0,0,0,114,74,1,0,0,251, 4,0,0,115,22,0,0,0,8,0,8,1,2,3,10,1, 8,10,8,3,8,3,8,3,8,3,8,3,12,12,114,10, 0,0,0,114,74,1,0,0,99,0,0,0,0,0,0,0, @@ -2221,7 +2221,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 5,105,116,101,109,115,114,154,0,0,0,114,79,1,0,0, 41,2,114,142,0,0,0,218,6,102,105,110,100,101,114,114, 7,0,0,0,114,7,0,0,0,114,8,0,0,0,114,79, - 1,0,0,46,5,0,0,115,14,0,0,0,22,4,8,1, + 1,0,0,48,5,0,0,115,14,0,0,0,22,4,8,1, 10,1,10,1,8,1,2,128,4,252,114,10,0,0,0,122, 28,80,97,116,104,70,105,110,100,101,114,46,105,110,118,97, 108,105,100,97,116,101,95,99,97,99,104,101,115,99,1,0, @@ -2241,7 +2241,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 0,0,114,163,0,0,0,114,143,0,0,0,41,2,114,66, 0,0,0,90,4,104,111,111,107,114,7,0,0,0,114,7, 0,0,0,114,8,0,0,0,218,11,95,112,97,116,104,95, - 104,111,111,107,115,56,5,0,0,115,22,0,0,0,16,3, + 104,111,111,107,115,58,5,0,0,115,22,0,0,0,16,3, 12,1,10,1,2,1,12,1,2,128,12,1,4,1,2,128, 4,2,2,253,115,12,0,0,0,148,3,26,2,154,7,35, 9,166,1,35,9,122,22,80,97,116,104,70,105,110,100,101, @@ -2274,7 +2274,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 111,114,114,85,1,0,0,41,3,114,222,0,0,0,114,66, 0,0,0,114,83,1,0,0,114,7,0,0,0,114,7,0, 0,0,114,8,0,0,0,218,20,95,112,97,116,104,95,105, - 109,112,111,114,116,101,114,95,99,97,99,104,101,69,5,0, + 109,112,111,114,116,101,114,95,99,97,99,104,101,71,5,0, 0,115,36,0,0,0,8,8,2,1,10,1,2,128,12,1, 6,3,2,128,2,1,10,1,4,4,2,128,12,253,10,1, 12,1,4,1,2,128,2,253,2,250,115,24,0,0,0,133, @@ -2307,7 +2307,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 164,0,0,0,114,83,1,0,0,114,167,0,0,0,114,165, 0,0,0,114,166,0,0,0,114,211,0,0,0,114,7,0, 0,0,114,7,0,0,0,114,8,0,0,0,218,16,95,108, - 101,103,97,99,121,95,103,101,116,95,115,112,101,99,91,5, + 101,103,97,99,121,95,103,101,116,95,115,112,101,99,93,5, 0,0,115,26,0,0,0,10,4,16,1,12,2,16,1,16, 2,12,2,10,1,4,1,8,1,12,1,12,1,6,1,4, 1,114,10,0,0,0,122,27,80,97,116,104,70,105,110,100, @@ -2340,7 +2340,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 104,90,5,101,110,116,114,121,114,83,1,0,0,114,211,0, 0,0,114,166,0,0,0,114,7,0,0,0,114,7,0,0, 0,114,8,0,0,0,218,9,95,103,101,116,95,115,112,101, - 99,112,5,0,0,115,42,0,0,0,4,5,8,1,14,1, + 99,114,5,0,0,115,42,0,0,0,4,5,8,1,14,1, 2,1,10,1,8,1,10,1,14,1,12,2,8,1,2,1, 10,1,8,1,6,1,8,1,8,1,10,5,2,128,12,2, 6,1,4,1,114,10,0,0,0,122,20,80,97,116,104,70, @@ -2367,7 +2367,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 0,0,41,6,114,222,0,0,0,114,164,0,0,0,114,66, 0,0,0,114,226,0,0,0,114,211,0,0,0,114,91,1, 0,0,114,7,0,0,0,114,7,0,0,0,114,8,0,0, - 0,114,227,0,0,0,144,5,0,0,115,26,0,0,0,8, + 0,114,227,0,0,0,146,5,0,0,115,26,0,0,0,8, 6,6,1,14,1,8,1,4,1,10,1,6,1,4,1,6, 3,16,1,4,1,4,2,4,2,114,10,0,0,0,122,20, 80,97,116,104,70,105,110,100,101,114,46,102,105,110,100,95, @@ -2395,7 +2395,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 110,100,95,115,112,101,99,40,41,32,105,110,115,116,101,97, 100,78,114,228,0,0,0,114,229,0,0,0,114,7,0,0, 0,114,7,0,0,0,114,8,0,0,0,114,230,0,0,0, - 168,5,0,0,115,14,0,0,0,6,8,2,2,4,254,12, + 170,5,0,0,115,14,0,0,0,6,8,2,2,4,254,12, 3,8,1,4,1,6,1,114,10,0,0,0,122,22,80,97, 116,104,70,105,110,100,101,114,46,102,105,110,100,95,109,111, 100,117,108,101,99,0,0,0,0,0,0,0,0,0,0,0, @@ -2427,7 +2427,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 110,100,95,100,105,115,116,114,105,98,117,116,105,111,110,115, 41,3,114,145,0,0,0,114,146,0,0,0,114,93,1,0, 0,114,7,0,0,0,114,7,0,0,0,114,8,0,0,0, - 114,94,1,0,0,184,5,0,0,115,4,0,0,0,12,10, + 114,94,1,0,0,186,5,0,0,115,4,0,0,0,12,10, 16,1,114,10,0,0,0,122,29,80,97,116,104,70,105,110, 100,101,114,46,102,105,110,100,95,100,105,115,116,114,105,98, 117,116,105,111,110,115,114,70,0,0,0,114,231,0,0,0, @@ -2437,7 +2437,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 89,1,0,0,114,92,1,0,0,114,227,0,0,0,114,230, 0,0,0,114,94,1,0,0,114,7,0,0,0,114,7,0, 0,0,114,7,0,0,0,114,8,0,0,0,114,78,1,0, - 0,42,5,0,0,115,36,0,0,0,8,0,4,2,2,2, + 0,44,5,0,0,115,36,0,0,0,8,0,4,2,2,2, 10,1,2,9,10,1,2,12,10,1,2,21,10,1,2,20, 12,1,2,31,12,1,2,23,12,1,2,15,14,1,114,10, 0,0,0,114,78,1,0,0,99,0,0,0,0,0,0,0, @@ -2484,7 +2484,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 136,0,102,2,86,0,1,0,113,2,100,0,83,0,114,70, 0,0,0,114,7,0,0,0,114,44,1,0,0,169,1,114, 165,0,0,0,114,7,0,0,0,114,8,0,0,0,114,9, - 0,0,0,213,5,0,0,115,4,0,0,0,6,128,18,0, + 0,0,0,215,5,0,0,115,4,0,0,0,6,128,18,0, 114,10,0,0,0,122,38,70,105,108,101,70,105,110,100,101, 114,46,95,95,105,110,105,116,95,95,46,60,108,111,99,97, 108,115,62,46,60,103,101,110,101,120,112,114,62,114,98,0, @@ -2498,7 +2498,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 0,0,218,14,108,111,97,100,101,114,95,100,101,116,97,105, 108,115,90,7,108,111,97,100,101,114,115,114,213,0,0,0, 114,7,0,0,0,114,96,1,0,0,114,8,0,0,0,114, - 237,0,0,0,207,5,0,0,115,20,0,0,0,4,4,12, + 237,0,0,0,209,5,0,0,115,20,0,0,0,4,4,12, 1,26,1,6,1,10,2,10,1,18,1,6,1,8,1,12, 1,114,10,0,0,0,122,19,70,105,108,101,70,105,110,100, 101,114,46,95,95,105,110,105,116,95,95,99,1,0,0,0, @@ -2508,7 +2508,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 101,32,116,104,101,32,100,105,114,101,99,116,111,114,121,32, 109,116,105,109,101,46,114,131,0,0,0,78,41,1,114,98, 1,0,0,114,22,1,0,0,114,7,0,0,0,114,7,0, - 0,0,114,8,0,0,0,114,79,1,0,0,223,5,0,0, + 0,0,114,8,0,0,0,114,79,1,0,0,225,5,0,0, 114,82,0,0,0,114,10,0,0,0,122,28,70,105,108,101, 70,105,110,100,101,114,46,105,110,118,97,108,105,100,97,116, 101,95,99,97,99,104,101,115,99,2,0,0,0,0,0,0, @@ -2540,7 +2540,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 0,0,0,114,165,0,0,0,114,203,0,0,0,41,3,114, 144,0,0,0,114,164,0,0,0,114,211,0,0,0,114,7, 0,0,0,114,7,0,0,0,114,8,0,0,0,114,162,0, - 0,0,229,5,0,0,115,14,0,0,0,6,7,2,2,4, + 0,0,231,5,0,0,115,14,0,0,0,6,7,2,2,4, 254,10,3,8,1,8,1,16,1,114,10,0,0,0,122,22, 70,105,108,101,70,105,110,100,101,114,46,102,105,110,100,95, 108,111,97,100,101,114,99,6,0,0,0,0,0,0,0,0, @@ -2551,7 +2551,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 144,0,0,0,114,212,0,0,0,114,164,0,0,0,114,66, 0,0,0,90,4,115,109,115,108,114,226,0,0,0,114,165, 0,0,0,114,7,0,0,0,114,7,0,0,0,114,8,0, - 0,0,114,92,1,0,0,244,5,0,0,115,8,0,0,0, + 0,0,114,92,1,0,0,246,5,0,0,115,8,0,0,0, 10,1,8,1,2,1,6,255,114,10,0,0,0,122,20,70, 105,108,101,70,105,110,100,101,114,46,95,103,101,116,95,115, 112,101,99,78,99,3,0,0,0,0,0,0,0,0,0,0, @@ -2608,7 +2608,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 212,0,0,0,90,13,105,110,105,116,95,102,105,108,101,110, 97,109,101,90,9,102,117,108,108,95,112,97,116,104,114,211, 0,0,0,114,7,0,0,0,114,7,0,0,0,114,8,0, - 0,0,114,227,0,0,0,249,5,0,0,115,94,0,0,0, + 0,0,114,227,0,0,0,251,5,0,0,115,94,0,0,0, 4,5,14,1,2,1,22,1,2,128,12,1,8,1,2,128, 10,1,8,1,6,1,6,2,6,1,10,1,6,2,4,1, 8,2,12,1,14,1,8,1,10,1,8,1,24,1,2,255, @@ -2643,7 +2643,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 0,93,6,125,1,124,1,160,0,161,0,146,2,113,2,83, 0,114,7,0,0,0,41,1,114,132,0,0,0,41,2,114, 5,0,0,0,90,2,102,110,114,7,0,0,0,114,7,0, - 0,0,114,8,0,0,0,114,14,0,0,0,73,6,0,0, + 0,0,114,8,0,0,0,114,14,0,0,0,75,6,0,0, 115,2,0,0,0,20,0,114,10,0,0,0,122,41,70,105, 108,101,70,105,110,100,101,114,46,95,102,105,108,108,95,99, 97,99,104,101,46,60,108,111,99,97,108,115,62,46,60,115, @@ -2661,7 +2661,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 114,71,1,0,0,114,142,0,0,0,114,55,1,0,0,114, 45,1,0,0,90,8,110,101,119,95,110,97,109,101,114,7, 0,0,0,114,7,0,0,0,114,8,0,0,0,114,103,1, - 0,0,44,6,0,0,115,42,0,0,0,6,2,2,1,20, + 0,0,46,6,0,0,115,42,0,0,0,6,2,2,1,20, 1,2,128,18,1,8,3,2,128,12,3,12,1,6,7,8, 1,16,1,4,1,18,1,4,2,12,1,6,1,12,1,20, 1,4,255,2,233,115,13,0,0,0,132,9,14,0,142,12, @@ -2701,7 +2701,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 72,0,0,0,169,2,114,222,0,0,0,114,102,1,0,0, 114,7,0,0,0,114,8,0,0,0,218,24,112,97,116,104, 95,104,111,111,107,95,102,111,114,95,70,105,108,101,70,105, - 110,100,101,114,85,6,0,0,115,6,0,0,0,8,2,12, + 110,100,101,114,87,6,0,0,115,6,0,0,0,8,2,12, 1,16,1,114,10,0,0,0,122,54,70,105,108,101,70,105, 110,100,101,114,46,112,97,116,104,95,104,111,111,107,46,60, 108,111,99,97,108,115,62,46,112,97,116,104,95,104,111,111, @@ -2709,7 +2709,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 78,114,7,0,0,0,41,3,114,222,0,0,0,114,102,1, 0,0,114,108,1,0,0,114,7,0,0,0,114,107,1,0, 0,114,8,0,0,0,218,9,112,97,116,104,95,104,111,111, - 107,75,6,0,0,115,4,0,0,0,14,10,4,6,114,10, + 107,77,6,0,0,115,4,0,0,0,14,10,4,6,114,10, 0,0,0,122,20,70,105,108,101,70,105,110,100,101,114,46, 112,97,116,104,95,104,111,111,107,99,1,0,0,0,0,0, 0,0,0,0,0,0,1,0,0,0,3,0,0,0,67,0, @@ -2717,7 +2717,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 70,105,110,100,101,114,40,123,33,114,125,41,41,2,114,90, 0,0,0,114,66,0,0,0,114,22,1,0,0,114,7,0, 0,0,114,7,0,0,0,114,8,0,0,0,114,69,1,0, - 0,93,6,0,0,114,62,1,0,0,114,10,0,0,0,122, + 0,95,6,0,0,114,62,1,0,0,114,10,0,0,0,122, 19,70,105,108,101,70,105,110,100,101,114,46,95,95,114,101, 112,114,95,95,114,70,0,0,0,41,15,114,151,0,0,0, 114,150,0,0,0,114,152,0,0,0,114,153,0,0,0,114, @@ -2725,7 +2725,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 0,0,0,114,162,0,0,0,114,92,1,0,0,114,227,0, 0,0,114,103,1,0,0,114,235,0,0,0,114,109,1,0, 0,114,69,1,0,0,114,7,0,0,0,114,7,0,0,0, - 114,7,0,0,0,114,8,0,0,0,114,95,1,0,0,198, + 114,7,0,0,0,114,8,0,0,0,114,95,1,0,0,200, 5,0,0,115,24,0,0,0,8,0,4,2,8,7,8,16, 4,4,8,2,8,15,10,5,8,51,2,31,10,1,12,17, 114,10,0,0,0,114,95,1,0,0,99,4,0,0,0,0, @@ -2749,7 +2749,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 8,112,97,116,104,110,97,109,101,90,9,99,112,97,116,104, 110,97,109,101,114,165,0,0,0,114,211,0,0,0,114,7, 0,0,0,114,7,0,0,0,114,8,0,0,0,218,14,95, - 102,105,120,95,117,112,95,109,111,100,117,108,101,99,6,0, + 102,105,120,95,117,112,95,109,111,100,117,108,101,101,6,0, 0,115,40,0,0,0,10,2,10,1,4,1,4,1,8,1, 8,1,12,1,10,2,4,1,14,1,2,1,8,1,8,1, 8,1,12,1,2,128,12,1,6,2,2,128,2,254,115,15, @@ -2771,7 +2771,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 0,0,0,41,3,90,10,101,120,116,101,110,115,105,111,110, 115,90,6,115,111,117,114,99,101,90,8,98,121,116,101,99, 111,100,101,114,7,0,0,0,114,7,0,0,0,114,8,0, - 0,0,114,209,0,0,0,122,6,0,0,115,8,0,0,0, + 0,0,114,209,0,0,0,124,6,0,0,115,8,0,0,0, 12,5,8,1,8,1,10,1,114,10,0,0,0,114,209,0, 0,0,99,1,0,0,0,0,0,0,0,0,0,0,0,1, 0,0,0,1,0,0,0,67,0,0,0,115,8,0,0,0, @@ -2779,7 +2779,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 160,0,0,0,41,1,218,17,95,98,111,111,116,115,116,114, 97,112,95,109,111,100,117,108,101,114,7,0,0,0,114,7, 0,0,0,114,8,0,0,0,218,21,95,115,101,116,95,98, - 111,111,116,115,116,114,97,112,95,109,111,100,117,108,101,133, + 111,111,116,115,116,114,97,112,95,109,111,100,117,108,101,135, 6,0,0,115,2,0,0,0,8,2,114,10,0,0,0,114, 117,1,0,0,99,1,0,0,0,0,0,0,0,0,0,0, 0,2,0,0,0,4,0,0,0,67,0,0,0,115,50,0, @@ -2795,7 +2795,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 116,104,114,62,0,0,0,114,78,1,0,0,41,2,114,116, 1,0,0,90,17,115,117,112,112,111,114,116,101,100,95,108, 111,97,100,101,114,115,114,7,0,0,0,114,7,0,0,0, - 114,8,0,0,0,218,8,95,105,110,115,116,97,108,108,138, + 114,8,0,0,0,218,8,95,105,110,115,116,97,108,108,140, 6,0,0,115,8,0,0,0,8,2,6,1,20,1,16,1, 114,10,0,0,0,114,119,1,0,0,41,1,114,88,0,0, 0,114,70,0,0,0,41,3,78,78,78,41,2,114,0,0, @@ -2840,7 +2840,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 1,6,2,22,2,8,1,8,1,10,1,14,1,4,4,4, 1,2,1,2,1,4,255,8,4,6,16,8,3,8,5,8, 5,4,6,10,1,8,30,8,6,8,8,8,10,8,9,8, - 5,4,7,10,1,8,8,10,5,10,22,0,127,16,32,12, + 5,4,7,10,1,8,8,10,5,10,22,0,127,16,34,12, 1,4,2,4,1,6,2,4,1,10,1,8,2,6,2,8, 2,16,2,8,71,8,40,8,19,8,12,8,12,8,31,8, 20,8,33,8,28,10,24,10,13,10,10,8,11,6,14,4, From 860ff0959b536cd47990b951373f9df86217297c Mon Sep 17 00:00:00 2001 From: Serhiy Storchaka Date: Sun, 16 May 2021 17:31:42 +0300 Subject: [PATCH 2/5] Fix RST formatting. --- Doc/library/ast.rst | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Doc/library/ast.rst b/Doc/library/ast.rst index e7f214540f9635..f8af01466afb06 100644 --- a/Doc/library/ast.rst +++ b/Doc/library/ast.rst @@ -188,9 +188,9 @@ Literals of the value, or ``None`` if no format was specified. Both ``conversion`` and ``format_spec`` can be set at the same time. - ... versionchanged:: 3.11 - Added support for lossy and lossless convertions to :class:`int` - and :class:`float`. + .. versionchanged:: 3.11 + Added support for lossy and lossless convertions to :class:`int` + and :class:`float`. .. class:: JoinedStr(values) From e0300f7df3d135547acd124e84f25f9b4588a3ae Mon Sep 17 00:00:00 2001 From: Serhiy Storchaka Date: Tue, 18 May 2021 10:32:02 +0300 Subject: [PATCH 3/5] Address review comments. Fix convertion to int and float. --- Doc/library/ast.rst | 5 +--- Lib/test/test_peepholer.py | 50 ++++++++++++++++++++++++++++++++++++-- Python/ceval.c | 21 ++++++++++++++-- 3 files changed, 68 insertions(+), 8 deletions(-) diff --git a/Doc/library/ast.rst b/Doc/library/ast.rst index f8af01466afb06..03778745fd7ddc 100644 --- a/Doc/library/ast.rst +++ b/Doc/library/ast.rst @@ -177,12 +177,9 @@ Literals * ``ord('s')``: convert to :class:`str` before formatting (``!s``) * ``ord('r')``: call :func:`repr` before formatting (``!r``) * ``ord('a')``: call :func:`ascii` before formatting (``!a``) - * ``ord('d')``: convert to :class:`int` with truncating - (for internal use only) + * ``ord('d')``: convert to :class:`int` with truncating before formatting * ``ord('i')``: call :func:`operator.index` before formatting - (for internal use only) * ``ord('f')``: convert to :class:`float` before formatting - (for internal use only) * ``format_spec`` is a :class:`JoinedStr` node representing the formatting of the value, or ``None`` if no format was specified. Both diff --git a/Lib/test/test_peepholer.py b/Lib/test/test_peepholer.py index 1f8ac8778805bd..4f1c9713e66ce3 100644 --- a/Lib/test/test_peepholer.py +++ b/Lib/test/test_peepholer.py @@ -495,10 +495,10 @@ def genexpr(): return (y for x in a for y in [f(x)]) self.assertEqual(count_instr_recursively(genexpr, 'FOR_ITER'), 1) - def test_format(self): + def test_format_combinations(self): flags = '-+ #0' testcases = [ - *product(('', '1234',), 'sra'), + *product(('', '1234', 'абвг'), 'sra'), *product((1234, -1234), 'duioxX'), *product((1234.5678901, -1234.5678901), 'duifegFEG'), *product((float('inf'), -float('inf')), 'fegFEG'), @@ -518,6 +518,52 @@ def test_format(self): s2 = eval(f'{fmt!r} % (x,)', {'x': value}) self.assertEqual(s2, s1, f'{fmt = }') + def test_format_misc(self): + def format(fmt, *values): + vars = [f'x{i+1}' for i in range(len(values))] + if len(vars) == 1: + args = '(' + vars[0] + ',)' + else: + args = '(' + ', '.join(vars) + ')' + return eval(f'{fmt!r} % {args}', dict(zip(vars, values))) + + self.assertEqual(format('string'), 'string') + self.assertEqual(format('x = %s!', 1234), 'x = 1234!') + self.assertEqual(format('x = %d!', 1234), 'x = 1234!') + self.assertEqual(format('x = %x!', 1234), 'x = 4d2!') + self.assertEqual(format('x = %f!', 1234), 'x = 1234.000000!') + self.assertEqual(format('x = %s!', 1234.5678901), 'x = 1234.5678901!') + self.assertEqual(format('x = %f!', 1234.5678901), 'x = 1234.567890!') + self.assertEqual(format('x = %d!', 1234.5678901), 'x = 1234!') + self.assertEqual(format('x = %s%% %%%%', 1234), 'x = 1234% %%') + self.assertEqual(format('x = %s!', '%% %s'), 'x = %% %s!') + self.assertEqual(format('x = %s, y = %d', 12, 34), 'x = 12, y = 34') + + def test_format_errors(self): + with self.assertRaisesRegex(TypeError, + 'not enough arguments for format string'): + eval("'%s' % ()") + with self.assertRaisesRegex(TypeError, + 'not all arguments converted during string formatting'): + eval("'%s' % (x, y)", {'x': 1, 'y': 2}) + with self.assertRaisesRegex(ValueError, 'incomplete format'): + eval("'%s%' % (x,)", {'x': 1234}) + with self.assertRaisesRegex(ValueError, 'incomplete format'): + eval("'%s%%%' % (x,)", {'x': 1234}) + with self.assertRaisesRegex(TypeError, + 'not enough arguments for format string'): + eval("'%s%z' % (x,)", {'x': 1234}) + with self.assertRaisesRegex(ValueError, 'unsupported format character'): + eval("'%s%z' % (x, 5)", {'x': 1234}) + with self.assertRaisesRegex(TypeError, 'a number is required, not str'): + eval("'%d' % (x,)", {'x': '1234'}) + with self.assertRaisesRegex(TypeError, 'float'): + eval("'%x' % (x,)", {'x': 1234.56}) + with self.assertRaisesRegex(TypeError, 'str'): + eval("'%x' % (x,)", {'x': '1234'}) + with self.assertRaisesRegex(TypeError, 'a number is required, not str'): + eval("'%f' % (x,)", {'x': '1234'}) + class TestBuglets(unittest.TestCase): diff --git a/Python/ceval.c b/Python/ceval.c index f4a08cccbf08ad..63b6225e672087 100644 --- a/Python/ceval.c +++ b/Python/ceval.c @@ -4378,13 +4378,30 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, PyFrameObject *f, int throwflag) case FVC_STR: conv_fn = PyObject_Str; break; case FVC_REPR: conv_fn = PyObject_Repr; break; case FVC_ASCII: conv_fn = PyObject_ASCII; break; - case FVC_INT: conv_fn = PyNumber_Long; break; case FVC_INDEX: conv_fn = PyNumber_Index; break; - case FVC_FLOAT: conv_fn = PyNumber_Float; break; + case FVC_INT: + case FVC_FLOAT: + if (!PyNumber_Check(value)) { + _PyErr_Format(tstate, PyExc_TypeError, + "a number is required, not %.200s", + Py_TYPE(value)->tp_name); + Py_DECREF(value); + Py_XDECREF(fmt_spec); + goto error; + } + if (which_conversion == FVC_INT) { + conv_fn = PyNumber_Long; + } + else { + conv_fn = PyNumber_Float; + } + break; default: _PyErr_Format(tstate, PyExc_SystemError, "unexpected conversion flag %d", which_conversion); + Py_DECREF(value); + Py_XDECREF(fmt_spec); goto error; } From eeb44042d2dd0810b666c05634e8097e2121292e Mon Sep 17 00:00:00 2001 From: Serhiy Storchaka Date: Sun, 23 May 2021 19:26:41 +0300 Subject: [PATCH 4/5] Tweak tests. --- Lib/test/test_peepholer.py | 10 ++++++---- Python/ceval.c | 2 +- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/Lib/test/test_peepholer.py b/Lib/test/test_peepholer.py index bfafc3ee4b9542..379db1df4d919e 100644 --- a/Lib/test/test_peepholer.py +++ b/Lib/test/test_peepholer.py @@ -555,13 +555,15 @@ def test_format_errors(self): eval("'%s%z' % (x,)", {'x': 1234}) with self.assertRaisesRegex(ValueError, 'unsupported format character'): eval("'%s%z' % (x, 5)", {'x': 1234}) - with self.assertRaisesRegex(TypeError, 'a real number is required, not str'): + with self.assertRaisesRegex(TypeError, r'\breal number\b.*, not str'): eval("'%d' % (x,)", {'x': '1234'}) - with self.assertRaisesRegex(TypeError, 'an integer is required, not float'): + with self.assertRaisesRegex(TypeError, + r'\binteger\b.*, not float|\bfloat.* cannot .*\binteger\b'): eval("'%x' % (x,)", {'x': 1234.56}) - with self.assertRaisesRegex(TypeError, 'an integer is required, not str'): + with self.assertRaisesRegex(TypeError, + r'\binteger\b.*, not str|\bstr.* cannot .*\binteger\b'): eval("'%x' % (x,)", {'x': '1234'}) - with self.assertRaisesRegex(TypeError, 'must be real number, not str'): + with self.assertRaisesRegex(TypeError, r'\breal number\b.*, not str'): eval("'%f' % (x,)", {'x': '1234'}) with self.assertRaisesRegex(TypeError, 'not enough arguments for format string'): diff --git a/Python/ceval.c b/Python/ceval.c index bb376150c23d30..cd64040d40eecc 100644 --- a/Python/ceval.c +++ b/Python/ceval.c @@ -4388,7 +4388,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, PyFrameObject *f, int throwflag) case FVC_FLOAT: if (!PyNumber_Check(value)) { _PyErr_Format(tstate, PyExc_TypeError, - "a number is required, not %.200s", + "a real number is required, not %.200s", Py_TYPE(value)->tp_name); Py_DECREF(value); Py_XDECREF(fmt_spec); From b6bbb7c9a98f3eb00e3d902c6634f32a08b8d209 Mon Sep 17 00:00:00 2001 From: Serhiy Storchaka Date: Mon, 24 May 2021 15:03:15 +0300 Subject: [PATCH 5/5] Polishing. --- Python/ceval.c | 13 ++++--------- 1 file changed, 4 insertions(+), 9 deletions(-) diff --git a/Python/ceval.c b/Python/ceval.c index cd64040d40eecc..72144c02b5b917 100644 --- a/Python/ceval.c +++ b/Python/ceval.c @@ -4371,14 +4371,14 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, PyFrameObject *f, int throwflag) PyObject *fmt_spec; PyObject *value; PyObject *(*conv_fn)(PyObject *); - int which_conversion = oparg & FVC_MASK; + int conv = oparg & FVC_MASK; int have_fmt_spec = (oparg & FVS_MASK) == FVS_HAVE_SPEC; fmt_spec = have_fmt_spec ? POP() : NULL; value = POP(); /* See if any conversion is specified. */ - switch (which_conversion) { + switch (conv) { case FVC_NONE: conv_fn = NULL; break; case FVC_STR: conv_fn = PyObject_Str; break; case FVC_REPR: conv_fn = PyObject_Repr; break; @@ -4394,17 +4394,12 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, PyFrameObject *f, int throwflag) Py_XDECREF(fmt_spec); goto error; } - if (which_conversion == FVC_INT) { - conv_fn = PyNumber_Long; - } - else { - conv_fn = PyNumber_Float; - } + conv_fn = (conv == FVC_INT) ? PyNumber_Long : PyNumber_Float; break; default: _PyErr_Format(tstate, PyExc_SystemError, "unexpected conversion flag %d", - which_conversion); + conv); Py_DECREF(value); Py_XDECREF(fmt_spec); goto error;