diff options
Diffstat (limited to 'Python')
45 files changed, 10632 insertions, 8245 deletions
diff --git a/Python/Python-ast.c b/Python/Python-ast.c index 8543b66..44fdafc 100644 --- a/Python/Python-ast.c +++ b/Python/Python-ast.c @@ -271,6 +271,10 @@ static PyTypeObject *Bytes_type; static char *Bytes_fields[]={ "s", }; +static PyTypeObject *NameConstant_type; +static char *NameConstant_fields[]={ + "value", +}; static PyTypeObject *Ellipsis_type; static PyTypeObject *Attribute_type; _Py_IDENTIFIER(attr); @@ -408,24 +412,24 @@ static char *ExceptHandler_fields[]={ static PyTypeObject *arguments_type; static PyObject* ast2obj_arguments(void*); _Py_IDENTIFIER(vararg); -_Py_IDENTIFIER(varargannotation); _Py_IDENTIFIER(kwonlyargs); +_Py_IDENTIFIER(kw_defaults); _Py_IDENTIFIER(kwarg); -_Py_IDENTIFIER(kwargannotation); _Py_IDENTIFIER(defaults); -_Py_IDENTIFIER(kw_defaults); static char *arguments_fields[]={ "args", "vararg", - "varargannotation", "kwonlyargs", + "kw_defaults", "kwarg", - "kwargannotation", "defaults", - "kw_defaults", }; static PyTypeObject *arg_type; static PyObject* ast2obj_arg(void*); +static char *arg_attributes[] = { + "lineno", + "col_offset", +}; _Py_IDENTIFIER(arg); _Py_IDENTIFIER(annotation); static char *arg_fields[]={ @@ -673,6 +677,7 @@ static PyObject* ast2obj_object(void *o) Py_INCREF((PyObject*)o); return (PyObject*)o; } +#define ast2obj_singleton ast2obj_object #define ast2obj_identifier ast2obj_object #define ast2obj_string ast2obj_object #define ast2obj_bytes ast2obj_object @@ -684,6 +689,17 @@ static PyObject* ast2obj_int(long b) /* Conversion Python -> AST */ +static int obj2ast_singleton(PyObject *obj, PyObject** out, PyArena* arena) +{ + if (obj != Py_None && obj != Py_True && obj != Py_False) { + PyErr_SetString(PyExc_ValueError, + "AST singleton must be True, False, or None"); + return 1; + } + *out = obj; + return 0; +} + static int obj2ast_object(PyObject* obj, PyObject** out, PyArena* arena) { if (obj == Py_None) @@ -758,6 +774,19 @@ static int add_ast_fields(void) return 0; } +static int exists_not_none(PyObject *obj, _Py_Identifier *id) +{ + int isnone; + PyObject *attr = _PyObject_GetAttrId(obj, id); + if (!attr) { + PyErr_Clear(); + return 0; + } + isnone = attr == Py_None; + Py_DECREF(attr); + return !isnone; +} + static int init_types(void) { @@ -862,6 +891,9 @@ static int init_types(void) if (!Str_type) return 0; Bytes_type = make_type("Bytes", expr_type, Bytes_fields, 1); if (!Bytes_type) return 0; + NameConstant_type = make_type("NameConstant", expr_type, + NameConstant_fields, 1); + if (!NameConstant_type) return 0; Ellipsis_type = make_type("Ellipsis", expr_type, NULL, 0); if (!Ellipsis_type) return 0; Attribute_type = make_type("Attribute", expr_type, Attribute_fields, 3); @@ -1039,6 +1071,7 @@ static int init_types(void) comprehension_type = make_type("comprehension", &AST_type, comprehension_fields, 3); if (!comprehension_type) return 0; + if (!add_attributes(comprehension_type, NULL, 0)) return 0; excepthandler_type = make_type("excepthandler", &AST_type, NULL, 0); if (!excepthandler_type) return 0; if (!add_attributes(excepthandler_type, excepthandler_attributes, 2)) @@ -1046,16 +1079,21 @@ static int init_types(void) ExceptHandler_type = make_type("ExceptHandler", excepthandler_type, ExceptHandler_fields, 3); if (!ExceptHandler_type) return 0; - arguments_type = make_type("arguments", &AST_type, arguments_fields, 8); + arguments_type = make_type("arguments", &AST_type, arguments_fields, 6); if (!arguments_type) return 0; + if (!add_attributes(arguments_type, NULL, 0)) return 0; arg_type = make_type("arg", &AST_type, arg_fields, 2); if (!arg_type) return 0; + if (!add_attributes(arg_type, arg_attributes, 2)) return 0; keyword_type = make_type("keyword", &AST_type, keyword_fields, 2); if (!keyword_type) return 0; + if (!add_attributes(keyword_type, NULL, 0)) return 0; alias_type = make_type("alias", &AST_type, alias_fields, 2); if (!alias_type) return 0; + if (!add_attributes(alias_type, NULL, 0)) return 0; withitem_type = make_type("withitem", &AST_type, withitem_fields, 2); if (!withitem_type) return 0; + if (!add_attributes(withitem_type, NULL, 0)) return 0; initialized = 1; return 1; } @@ -1923,6 +1961,25 @@ Bytes(bytes s, int lineno, int col_offset, PyArena *arena) } expr_ty +NameConstant(singleton value, int lineno, int col_offset, PyArena *arena) +{ + expr_ty p; + if (!value) { + PyErr_SetString(PyExc_ValueError, + "field value is required for NameConstant"); + return NULL; + } + p = (expr_ty)PyArena_Malloc(arena, sizeof(*p)); + if (!p) + return NULL; + p->kind = NameConstant_kind; + p->v.NameConstant.value = value; + p->lineno = lineno; + p->col_offset = col_offset; + return p; +} + +expr_ty Ellipsis(int lineno, int col_offset, PyArena *arena) { expr_ty p; @@ -2177,9 +2234,8 @@ ExceptHandler(expr_ty type, identifier name, asdl_seq * body, int lineno, int } arguments_ty -arguments(asdl_seq * args, identifier vararg, expr_ty varargannotation, - asdl_seq * kwonlyargs, identifier kwarg, expr_ty kwargannotation, - asdl_seq * defaults, asdl_seq * kw_defaults, PyArena *arena) +arguments(asdl_seq * args, arg_ty vararg, asdl_seq * kwonlyargs, asdl_seq * + kw_defaults, arg_ty kwarg, asdl_seq * defaults, PyArena *arena) { arguments_ty p; p = (arguments_ty)PyArena_Malloc(arena, sizeof(*p)); @@ -2187,12 +2243,10 @@ arguments(asdl_seq * args, identifier vararg, expr_ty varargannotation, return NULL; p->args = args; p->vararg = vararg; - p->varargannotation = varargannotation; p->kwonlyargs = kwonlyargs; + p->kw_defaults = kw_defaults; p->kwarg = kwarg; - p->kwargannotation = kwargannotation; p->defaults = defaults; - p->kw_defaults = kw_defaults; return p; } @@ -2943,6 +2997,15 @@ ast2obj_expr(void* _o) goto failed; Py_DECREF(value); break; + case NameConstant_kind: + result = PyType_GenericNew(NameConstant_type, NULL, NULL); + if (!result) goto failed; + value = ast2obj_singleton(o->v.NameConstant.value); + if (!value) goto failed; + if (_PyObject_SetAttrId(result, &PyId_value, value) == -1) + goto failed; + Py_DECREF(value); + break; case Ellipsis_kind: result = PyType_GenericNew(Ellipsis_type, NULL, NULL); if (!result) goto failed; @@ -3361,29 +3424,24 @@ ast2obj_arguments(void* _o) if (_PyObject_SetAttrId(result, &PyId_args, value) == -1) goto failed; Py_DECREF(value); - value = ast2obj_identifier(o->vararg); + value = ast2obj_arg(o->vararg); if (!value) goto failed; if (_PyObject_SetAttrId(result, &PyId_vararg, value) == -1) goto failed; Py_DECREF(value); - value = ast2obj_expr(o->varargannotation); - if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_varargannotation, value) == -1) - goto failed; - Py_DECREF(value); value = ast2obj_list(o->kwonlyargs, ast2obj_arg); if (!value) goto failed; if (_PyObject_SetAttrId(result, &PyId_kwonlyargs, value) == -1) goto failed; Py_DECREF(value); - value = ast2obj_identifier(o->kwarg); + value = ast2obj_list(o->kw_defaults, ast2obj_expr); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_kwarg, value) == -1) + if (_PyObject_SetAttrId(result, &PyId_kw_defaults, value) == -1) goto failed; Py_DECREF(value); - value = ast2obj_expr(o->kwargannotation); + value = ast2obj_arg(o->kwarg); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_kwargannotation, value) == -1) + if (_PyObject_SetAttrId(result, &PyId_kwarg, value) == -1) goto failed; Py_DECREF(value); value = ast2obj_list(o->defaults, ast2obj_expr); @@ -3391,11 +3449,6 @@ ast2obj_arguments(void* _o) if (_PyObject_SetAttrId(result, &PyId_defaults, value) == -1) goto failed; Py_DECREF(value); - value = ast2obj_list(o->kw_defaults, ast2obj_expr); - if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_kw_defaults, value) == -1) - goto failed; - Py_DECREF(value); return result; failed: Py_XDECREF(value); @@ -3425,6 +3478,16 @@ ast2obj_arg(void* _o) if (_PyObject_SetAttrId(result, &PyId_annotation, value) == -1) goto failed; Py_DECREF(value); + value = ast2obj_int(o->lineno); + if (!value) goto failed; + if (_PyObject_SetAttrId(result, &PyId_lineno, value) < 0) + goto failed; + Py_DECREF(value); + value = ast2obj_int(o->col_offset); + if (!value) goto failed; + if (_PyObject_SetAttrId(result, &PyId_col_offset, value) < 0) + goto failed; + Py_DECREF(value); return result; failed: Py_XDECREF(value); @@ -3549,7 +3612,7 @@ obj2ast_mod(PyObject* obj, mod_ty* out, PyArena* arena) goto failed; } len = PyList_GET_SIZE(tmp); - body = asdl_seq_new(len, arena); + body = _Py_asdl_seq_new(len, arena); if (body == NULL) goto failed; for (i = 0; i < len; i++) { stmt_ty value; @@ -3584,7 +3647,7 @@ obj2ast_mod(PyObject* obj, mod_ty* out, PyArena* arena) goto failed; } len = PyList_GET_SIZE(tmp); - body = asdl_seq_new(len, arena); + body = _Py_asdl_seq_new(len, arena); if (body == NULL) goto failed; for (i = 0; i < len; i++) { stmt_ty value; @@ -3641,7 +3704,7 @@ obj2ast_mod(PyObject* obj, mod_ty* out, PyArena* arena) goto failed; } len = PyList_GET_SIZE(tmp); - body = asdl_seq_new(len, arena); + body = _Py_asdl_seq_new(len, arena); if (body == NULL) goto failed; for (i = 0; i < len; i++) { stmt_ty value; @@ -3744,7 +3807,7 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) goto failed; } len = PyList_GET_SIZE(tmp); - body = asdl_seq_new(len, arena); + body = _Py_asdl_seq_new(len, arena); if (body == NULL) goto failed; for (i = 0; i < len; i++) { stmt_ty value; @@ -3768,7 +3831,7 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) goto failed; } len = PyList_GET_SIZE(tmp); - decorator_list = asdl_seq_new(len, arena); + decorator_list = _Py_asdl_seq_new(len, arena); if (decorator_list == NULL) goto failed; for (i = 0; i < len; i++) { expr_ty value; @@ -3781,7 +3844,7 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) PyErr_SetString(PyExc_TypeError, "required field \"decorator_list\" missing from FunctionDef"); return 1; } - if (_PyObject_HasAttrId(obj, &PyId_returns)) { + if (exists_not_none(obj, &PyId_returns)) { int res; tmp = _PyObject_GetAttrId(obj, &PyId_returns); if (tmp == NULL) goto failed; @@ -3831,7 +3894,7 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) goto failed; } len = PyList_GET_SIZE(tmp); - bases = asdl_seq_new(len, arena); + bases = _Py_asdl_seq_new(len, arena); if (bases == NULL) goto failed; for (i = 0; i < len; i++) { expr_ty value; @@ -3855,7 +3918,7 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) goto failed; } len = PyList_GET_SIZE(tmp); - keywords = asdl_seq_new(len, arena); + keywords = _Py_asdl_seq_new(len, arena); if (keywords == NULL) goto failed; for (i = 0; i < len; i++) { keyword_ty value; @@ -3868,7 +3931,7 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) PyErr_SetString(PyExc_TypeError, "required field \"keywords\" missing from ClassDef"); return 1; } - if (_PyObject_HasAttrId(obj, &PyId_starargs)) { + if (exists_not_none(obj, &PyId_starargs)) { int res; tmp = _PyObject_GetAttrId(obj, &PyId_starargs); if (tmp == NULL) goto failed; @@ -3878,7 +3941,7 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) } else { starargs = NULL; } - if (_PyObject_HasAttrId(obj, &PyId_kwargs)) { + if (exists_not_none(obj, &PyId_kwargs)) { int res; tmp = _PyObject_GetAttrId(obj, &PyId_kwargs); if (tmp == NULL) goto failed; @@ -3899,7 +3962,7 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) goto failed; } len = PyList_GET_SIZE(tmp); - body = asdl_seq_new(len, arena); + body = _Py_asdl_seq_new(len, arena); if (body == NULL) goto failed; for (i = 0; i < len; i++) { stmt_ty value; @@ -3923,7 +3986,7 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) goto failed; } len = PyList_GET_SIZE(tmp); - decorator_list = asdl_seq_new(len, arena); + decorator_list = _Py_asdl_seq_new(len, arena); if (decorator_list == NULL) goto failed; for (i = 0; i < len; i++) { expr_ty value; @@ -3948,7 +4011,7 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) if (isinstance) { expr_ty value; - if (_PyObject_HasAttrId(obj, &PyId_value)) { + if (exists_not_none(obj, &PyId_value)) { int res; tmp = _PyObject_GetAttrId(obj, &PyId_value); if (tmp == NULL) goto failed; @@ -3980,7 +4043,7 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) goto failed; } len = PyList_GET_SIZE(tmp); - targets = asdl_seq_new(len, arena); + targets = _Py_asdl_seq_new(len, arena); if (targets == NULL) goto failed; for (i = 0; i < len; i++) { expr_ty value; @@ -4016,7 +4079,7 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) goto failed; } len = PyList_GET_SIZE(tmp); - targets = asdl_seq_new(len, arena); + targets = _Py_asdl_seq_new(len, arena); if (targets == NULL) goto failed; for (i = 0; i < len; i++) { expr_ty value; @@ -4133,7 +4196,7 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) goto failed; } len = PyList_GET_SIZE(tmp); - body = asdl_seq_new(len, arena); + body = _Py_asdl_seq_new(len, arena); if (body == NULL) goto failed; for (i = 0; i < len; i++) { stmt_ty value; @@ -4157,7 +4220,7 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) goto failed; } len = PyList_GET_SIZE(tmp); - orelse = asdl_seq_new(len, arena); + orelse = _Py_asdl_seq_new(len, arena); if (orelse == NULL) goto failed; for (i = 0; i < len; i++) { stmt_ty value; @@ -4205,7 +4268,7 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) goto failed; } len = PyList_GET_SIZE(tmp); - body = asdl_seq_new(len, arena); + body = _Py_asdl_seq_new(len, arena); if (body == NULL) goto failed; for (i = 0; i < len; i++) { stmt_ty value; @@ -4229,7 +4292,7 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) goto failed; } len = PyList_GET_SIZE(tmp); - orelse = asdl_seq_new(len, arena); + orelse = _Py_asdl_seq_new(len, arena); if (orelse == NULL) goto failed; for (i = 0; i < len; i++) { stmt_ty value; @@ -4277,7 +4340,7 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) goto failed; } len = PyList_GET_SIZE(tmp); - body = asdl_seq_new(len, arena); + body = _Py_asdl_seq_new(len, arena); if (body == NULL) goto failed; for (i = 0; i < len; i++) { stmt_ty value; @@ -4301,7 +4364,7 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) goto failed; } len = PyList_GET_SIZE(tmp); - orelse = asdl_seq_new(len, arena); + orelse = _Py_asdl_seq_new(len, arena); if (orelse == NULL) goto failed; for (i = 0; i < len; i++) { stmt_ty value; @@ -4337,7 +4400,7 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) goto failed; } len = PyList_GET_SIZE(tmp); - items = asdl_seq_new(len, arena); + items = _Py_asdl_seq_new(len, arena); if (items == NULL) goto failed; for (i = 0; i < len; i++) { withitem_ty value; @@ -4361,7 +4424,7 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) goto failed; } len = PyList_GET_SIZE(tmp); - body = asdl_seq_new(len, arena); + body = _Py_asdl_seq_new(len, arena); if (body == NULL) goto failed; for (i = 0; i < len; i++) { stmt_ty value; @@ -4386,7 +4449,7 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) expr_ty exc; expr_ty cause; - if (_PyObject_HasAttrId(obj, &PyId_exc)) { + if (exists_not_none(obj, &PyId_exc)) { int res; tmp = _PyObject_GetAttrId(obj, &PyId_exc); if (tmp == NULL) goto failed; @@ -4396,7 +4459,7 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) } else { exc = NULL; } - if (_PyObject_HasAttrId(obj, &PyId_cause)) { + if (exists_not_none(obj, &PyId_cause)) { int res; tmp = _PyObject_GetAttrId(obj, &PyId_cause); if (tmp == NULL) goto failed; @@ -4431,7 +4494,7 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) goto failed; } len = PyList_GET_SIZE(tmp); - body = asdl_seq_new(len, arena); + body = _Py_asdl_seq_new(len, arena); if (body == NULL) goto failed; for (i = 0; i < len; i++) { stmt_ty value; @@ -4455,7 +4518,7 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) goto failed; } len = PyList_GET_SIZE(tmp); - handlers = asdl_seq_new(len, arena); + handlers = _Py_asdl_seq_new(len, arena); if (handlers == NULL) goto failed; for (i = 0; i < len; i++) { excepthandler_ty value; @@ -4479,7 +4542,7 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) goto failed; } len = PyList_GET_SIZE(tmp); - orelse = asdl_seq_new(len, arena); + orelse = _Py_asdl_seq_new(len, arena); if (orelse == NULL) goto failed; for (i = 0; i < len; i++) { stmt_ty value; @@ -4503,7 +4566,7 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) goto failed; } len = PyList_GET_SIZE(tmp); - finalbody = asdl_seq_new(len, arena); + finalbody = _Py_asdl_seq_new(len, arena); if (finalbody == NULL) goto failed; for (i = 0; i < len; i++) { stmt_ty value; @@ -4540,7 +4603,7 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) PyErr_SetString(PyExc_TypeError, "required field \"test\" missing from Assert"); return 1; } - if (_PyObject_HasAttrId(obj, &PyId_msg)) { + if (exists_not_none(obj, &PyId_msg)) { int res; tmp = _PyObject_GetAttrId(obj, &PyId_msg); if (tmp == NULL) goto failed; @@ -4572,7 +4635,7 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) goto failed; } len = PyList_GET_SIZE(tmp); - names = asdl_seq_new(len, arena); + names = _Py_asdl_seq_new(len, arena); if (names == NULL) goto failed; for (i = 0; i < len; i++) { alias_ty value; @@ -4598,7 +4661,7 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) asdl_seq* names; int level; - if (_PyObject_HasAttrId(obj, &PyId_module)) { + if (exists_not_none(obj, &PyId_module)) { int res; tmp = _PyObject_GetAttrId(obj, &PyId_module); if (tmp == NULL) goto failed; @@ -4619,7 +4682,7 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) goto failed; } len = PyList_GET_SIZE(tmp); - names = asdl_seq_new(len, arena); + names = _Py_asdl_seq_new(len, arena); if (names == NULL) goto failed; for (i = 0; i < len; i++) { alias_ty value; @@ -4632,7 +4695,7 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) PyErr_SetString(PyExc_TypeError, "required field \"names\" missing from ImportFrom"); return 1; } - if (_PyObject_HasAttrId(obj, &PyId_level)) { + if (exists_not_none(obj, &PyId_level)) { int res; tmp = _PyObject_GetAttrId(obj, &PyId_level); if (tmp == NULL) goto failed; @@ -4664,7 +4727,7 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) goto failed; } len = PyList_GET_SIZE(tmp); - names = asdl_seq_new(len, arena); + names = _Py_asdl_seq_new(len, arena); if (names == NULL) goto failed; for (i = 0; i < len; i++) { identifier value; @@ -4699,7 +4762,7 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) goto failed; } len = PyList_GET_SIZE(tmp); - names = asdl_seq_new(len, arena); + names = _Py_asdl_seq_new(len, arena); if (names == NULL) goto failed; for (i = 0; i < len; i++) { identifier value; @@ -4840,7 +4903,7 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena) goto failed; } len = PyList_GET_SIZE(tmp); - values = asdl_seq_new(len, arena); + values = _Py_asdl_seq_new(len, arena); if (values == NULL) goto failed; for (i = 0; i < len; i++) { expr_ty value; @@ -5036,7 +5099,7 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena) goto failed; } len = PyList_GET_SIZE(tmp); - keys = asdl_seq_new(len, arena); + keys = _Py_asdl_seq_new(len, arena); if (keys == NULL) goto failed; for (i = 0; i < len; i++) { expr_ty value; @@ -5060,7 +5123,7 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena) goto failed; } len = PyList_GET_SIZE(tmp); - values = asdl_seq_new(len, arena); + values = _Py_asdl_seq_new(len, arena); if (values == NULL) goto failed; for (i = 0; i < len; i++) { expr_ty value; @@ -5095,7 +5158,7 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena) goto failed; } len = PyList_GET_SIZE(tmp); - elts = asdl_seq_new(len, arena); + elts = _Py_asdl_seq_new(len, arena); if (elts == NULL) goto failed; for (i = 0; i < len; i++) { expr_ty value; @@ -5142,7 +5205,7 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena) goto failed; } len = PyList_GET_SIZE(tmp); - generators = asdl_seq_new(len, arena); + generators = _Py_asdl_seq_new(len, arena); if (generators == NULL) goto failed; for (i = 0; i < len; i++) { comprehension_ty value; @@ -5189,7 +5252,7 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena) goto failed; } len = PyList_GET_SIZE(tmp); - generators = asdl_seq_new(len, arena); + generators = _Py_asdl_seq_new(len, arena); if (generators == NULL) goto failed; for (i = 0; i < len; i++) { comprehension_ty value; @@ -5248,7 +5311,7 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena) goto failed; } len = PyList_GET_SIZE(tmp); - generators = asdl_seq_new(len, arena); + generators = _Py_asdl_seq_new(len, arena); if (generators == NULL) goto failed; for (i = 0; i < len; i++) { comprehension_ty value; @@ -5295,7 +5358,7 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena) goto failed; } len = PyList_GET_SIZE(tmp); - generators = asdl_seq_new(len, arena); + generators = _Py_asdl_seq_new(len, arena); if (generators == NULL) goto failed; for (i = 0; i < len; i++) { comprehension_ty value; @@ -5319,7 +5382,7 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena) if (isinstance) { expr_ty value; - if (_PyObject_HasAttrId(obj, &PyId_value)) { + if (exists_not_none(obj, &PyId_value)) { int res; tmp = _PyObject_GetAttrId(obj, &PyId_value); if (tmp == NULL) goto failed; @@ -5386,7 +5449,7 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena) goto failed; } len = PyList_GET_SIZE(tmp); - ops = asdl_int_seq_new(len, arena); + ops = _Py_asdl_int_seq_new(len, arena); if (ops == NULL) goto failed; for (i = 0; i < len; i++) { cmpop_ty value; @@ -5410,7 +5473,7 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena) goto failed; } len = PyList_GET_SIZE(tmp); - comparators = asdl_seq_new(len, arena); + comparators = _Py_asdl_seq_new(len, arena); if (comparators == NULL) goto failed; for (i = 0; i < len; i++) { expr_ty value; @@ -5460,7 +5523,7 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena) goto failed; } len = PyList_GET_SIZE(tmp); - args = asdl_seq_new(len, arena); + args = _Py_asdl_seq_new(len, arena); if (args == NULL) goto failed; for (i = 0; i < len; i++) { expr_ty value; @@ -5484,7 +5547,7 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena) goto failed; } len = PyList_GET_SIZE(tmp); - keywords = asdl_seq_new(len, arena); + keywords = _Py_asdl_seq_new(len, arena); if (keywords == NULL) goto failed; for (i = 0; i < len; i++) { keyword_ty value; @@ -5497,7 +5560,7 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena) PyErr_SetString(PyExc_TypeError, "required field \"keywords\" missing from Call"); return 1; } - if (_PyObject_HasAttrId(obj, &PyId_starargs)) { + if (exists_not_none(obj, &PyId_starargs)) { int res; tmp = _PyObject_GetAttrId(obj, &PyId_starargs); if (tmp == NULL) goto failed; @@ -5507,7 +5570,7 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena) } else { starargs = NULL; } - if (_PyObject_HasAttrId(obj, &PyId_kwargs)) { + if (exists_not_none(obj, &PyId_kwargs)) { int res; tmp = _PyObject_GetAttrId(obj, &PyId_kwargs); if (tmp == NULL) goto failed; @@ -5588,6 +5651,28 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena) if (*out == NULL) goto failed; return 0; } + isinstance = PyObject_IsInstance(obj, (PyObject*)NameConstant_type); + if (isinstance == -1) { + return 1; + } + if (isinstance) { + singleton value; + + if (_PyObject_HasAttrId(obj, &PyId_value)) { + int res; + tmp = _PyObject_GetAttrId(obj, &PyId_value); + if (tmp == NULL) goto failed; + res = obj2ast_singleton(tmp, &value, arena); + if (res != 0) goto failed; + Py_CLEAR(tmp); + } else { + PyErr_SetString(PyExc_TypeError, "required field \"value\" missing from NameConstant"); + return 1; + } + *out = NameConstant(value, lineno, col_offset, arena); + if (*out == NULL) goto failed; + return 0; + } isinstance = PyObject_IsInstance(obj, (PyObject*)Ellipsis_type); if (isinstance == -1) { return 1; @@ -5777,7 +5862,7 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena) goto failed; } len = PyList_GET_SIZE(tmp); - elts = asdl_seq_new(len, arena); + elts = _Py_asdl_seq_new(len, arena); if (elts == NULL) goto failed; for (i = 0; i < len; i++) { expr_ty value; @@ -5824,7 +5909,7 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena) goto failed; } len = PyList_GET_SIZE(tmp); - elts = asdl_seq_new(len, arena); + elts = _Py_asdl_seq_new(len, arena); if (elts == NULL) goto failed; for (i = 0; i < len; i++) { expr_ty value; @@ -5937,7 +6022,7 @@ obj2ast_slice(PyObject* obj, slice_ty* out, PyArena* arena) expr_ty upper; expr_ty step; - if (_PyObject_HasAttrId(obj, &PyId_lower)) { + if (exists_not_none(obj, &PyId_lower)) { int res; tmp = _PyObject_GetAttrId(obj, &PyId_lower); if (tmp == NULL) goto failed; @@ -5947,7 +6032,7 @@ obj2ast_slice(PyObject* obj, slice_ty* out, PyArena* arena) } else { lower = NULL; } - if (_PyObject_HasAttrId(obj, &PyId_upper)) { + if (exists_not_none(obj, &PyId_upper)) { int res; tmp = _PyObject_GetAttrId(obj, &PyId_upper); if (tmp == NULL) goto failed; @@ -5957,7 +6042,7 @@ obj2ast_slice(PyObject* obj, slice_ty* out, PyArena* arena) } else { upper = NULL; } - if (_PyObject_HasAttrId(obj, &PyId_step)) { + if (exists_not_none(obj, &PyId_step)) { int res; tmp = _PyObject_GetAttrId(obj, &PyId_step); if (tmp == NULL) goto failed; @@ -5989,7 +6074,7 @@ obj2ast_slice(PyObject* obj, slice_ty* out, PyArena* arena) goto failed; } len = PyList_GET_SIZE(tmp); - dims = asdl_seq_new(len, arena); + dims = _Py_asdl_seq_new(len, arena); if (dims == NULL) goto failed; for (i = 0; i < len; i++) { slice_ty value; @@ -6340,7 +6425,7 @@ obj2ast_comprehension(PyObject* obj, comprehension_ty* out, PyArena* arena) goto failed; } len = PyList_GET_SIZE(tmp); - ifs = asdl_seq_new(len, arena); + ifs = _Py_asdl_seq_new(len, arena); if (ifs == NULL) goto failed; for (i = 0; i < len; i++) { expr_ty value; @@ -6404,7 +6489,7 @@ obj2ast_excepthandler(PyObject* obj, excepthandler_ty* out, PyArena* arena) identifier name; asdl_seq* body; - if (_PyObject_HasAttrId(obj, &PyId_type)) { + if (exists_not_none(obj, &PyId_type)) { int res; tmp = _PyObject_GetAttrId(obj, &PyId_type); if (tmp == NULL) goto failed; @@ -6414,7 +6499,7 @@ obj2ast_excepthandler(PyObject* obj, excepthandler_ty* out, PyArena* arena) } else { type = NULL; } - if (_PyObject_HasAttrId(obj, &PyId_name)) { + if (exists_not_none(obj, &PyId_name)) { int res; tmp = _PyObject_GetAttrId(obj, &PyId_name); if (tmp == NULL) goto failed; @@ -6435,7 +6520,7 @@ obj2ast_excepthandler(PyObject* obj, excepthandler_ty* out, PyArena* arena) goto failed; } len = PyList_GET_SIZE(tmp); - body = asdl_seq_new(len, arena); + body = _Py_asdl_seq_new(len, arena); if (body == NULL) goto failed; for (i = 0; i < len; i++) { stmt_ty value; @@ -6464,13 +6549,11 @@ obj2ast_arguments(PyObject* obj, arguments_ty* out, PyArena* arena) { PyObject* tmp = NULL; asdl_seq* args; - identifier vararg; - expr_ty varargannotation; + arg_ty vararg; asdl_seq* kwonlyargs; - identifier kwarg; - expr_ty kwargannotation; - asdl_seq* defaults; asdl_seq* kw_defaults; + arg_ty kwarg; + asdl_seq* defaults; if (_PyObject_HasAttrId(obj, &PyId_args)) { int res; @@ -6483,7 +6566,7 @@ obj2ast_arguments(PyObject* obj, arguments_ty* out, PyArena* arena) goto failed; } len = PyList_GET_SIZE(tmp); - args = asdl_seq_new(len, arena); + args = _Py_asdl_seq_new(len, arena); if (args == NULL) goto failed; for (i = 0; i < len; i++) { arg_ty value; @@ -6496,26 +6579,16 @@ obj2ast_arguments(PyObject* obj, arguments_ty* out, PyArena* arena) PyErr_SetString(PyExc_TypeError, "required field \"args\" missing from arguments"); return 1; } - if (_PyObject_HasAttrId(obj, &PyId_vararg)) { + if (exists_not_none(obj, &PyId_vararg)) { int res; tmp = _PyObject_GetAttrId(obj, &PyId_vararg); if (tmp == NULL) goto failed; - res = obj2ast_identifier(tmp, &vararg, arena); + res = obj2ast_arg(tmp, &vararg, arena); if (res != 0) goto failed; Py_CLEAR(tmp); } else { vararg = NULL; } - if (_PyObject_HasAttrId(obj, &PyId_varargannotation)) { - int res; - tmp = _PyObject_GetAttrId(obj, &PyId_varargannotation); - if (tmp == NULL) goto failed; - res = obj2ast_expr(tmp, &varargannotation, arena); - if (res != 0) goto failed; - Py_CLEAR(tmp); - } else { - varargannotation = NULL; - } if (_PyObject_HasAttrId(obj, &PyId_kwonlyargs)) { int res; Py_ssize_t len; @@ -6527,7 +6600,7 @@ obj2ast_arguments(PyObject* obj, arguments_ty* out, PyArena* arena) goto failed; } len = PyList_GET_SIZE(tmp); - kwonlyargs = asdl_seq_new(len, arena); + kwonlyargs = _Py_asdl_seq_new(len, arena); if (kwonlyargs == NULL) goto failed; for (i = 0; i < len; i++) { arg_ty value; @@ -6540,76 +6613,66 @@ obj2ast_arguments(PyObject* obj, arguments_ty* out, PyArena* arena) PyErr_SetString(PyExc_TypeError, "required field \"kwonlyargs\" missing from arguments"); return 1; } - if (_PyObject_HasAttrId(obj, &PyId_kwarg)) { - int res; - tmp = _PyObject_GetAttrId(obj, &PyId_kwarg); - if (tmp == NULL) goto failed; - res = obj2ast_identifier(tmp, &kwarg, arena); - if (res != 0) goto failed; - Py_CLEAR(tmp); - } else { - kwarg = NULL; - } - if (_PyObject_HasAttrId(obj, &PyId_kwargannotation)) { - int res; - tmp = _PyObject_GetAttrId(obj, &PyId_kwargannotation); - if (tmp == NULL) goto failed; - res = obj2ast_expr(tmp, &kwargannotation, arena); - if (res != 0) goto failed; - Py_CLEAR(tmp); - } else { - kwargannotation = NULL; - } - if (_PyObject_HasAttrId(obj, &PyId_defaults)) { + if (_PyObject_HasAttrId(obj, &PyId_kw_defaults)) { int res; Py_ssize_t len; Py_ssize_t i; - tmp = _PyObject_GetAttrId(obj, &PyId_defaults); + tmp = _PyObject_GetAttrId(obj, &PyId_kw_defaults); if (tmp == NULL) goto failed; if (!PyList_Check(tmp)) { - PyErr_Format(PyExc_TypeError, "arguments field \"defaults\" must be a list, not a %.200s", tmp->ob_type->tp_name); + PyErr_Format(PyExc_TypeError, "arguments field \"kw_defaults\" must be a list, not a %.200s", tmp->ob_type->tp_name); goto failed; } len = PyList_GET_SIZE(tmp); - defaults = asdl_seq_new(len, arena); - if (defaults == NULL) goto failed; + kw_defaults = _Py_asdl_seq_new(len, arena); + if (kw_defaults == NULL) goto failed; for (i = 0; i < len; i++) { expr_ty value; res = obj2ast_expr(PyList_GET_ITEM(tmp, i), &value, arena); if (res != 0) goto failed; - asdl_seq_SET(defaults, i, value); + asdl_seq_SET(kw_defaults, i, value); } Py_CLEAR(tmp); } else { - PyErr_SetString(PyExc_TypeError, "required field \"defaults\" missing from arguments"); + PyErr_SetString(PyExc_TypeError, "required field \"kw_defaults\" missing from arguments"); return 1; } - if (_PyObject_HasAttrId(obj, &PyId_kw_defaults)) { + if (exists_not_none(obj, &PyId_kwarg)) { + int res; + tmp = _PyObject_GetAttrId(obj, &PyId_kwarg); + if (tmp == NULL) goto failed; + res = obj2ast_arg(tmp, &kwarg, arena); + if (res != 0) goto failed; + Py_CLEAR(tmp); + } else { + kwarg = NULL; + } + if (_PyObject_HasAttrId(obj, &PyId_defaults)) { int res; Py_ssize_t len; Py_ssize_t i; - tmp = _PyObject_GetAttrId(obj, &PyId_kw_defaults); + tmp = _PyObject_GetAttrId(obj, &PyId_defaults); if (tmp == NULL) goto failed; if (!PyList_Check(tmp)) { - PyErr_Format(PyExc_TypeError, "arguments field \"kw_defaults\" must be a list, not a %.200s", tmp->ob_type->tp_name); + PyErr_Format(PyExc_TypeError, "arguments field \"defaults\" must be a list, not a %.200s", tmp->ob_type->tp_name); goto failed; } len = PyList_GET_SIZE(tmp); - kw_defaults = asdl_seq_new(len, arena); - if (kw_defaults == NULL) goto failed; + defaults = _Py_asdl_seq_new(len, arena); + if (defaults == NULL) goto failed; for (i = 0; i < len; i++) { expr_ty value; res = obj2ast_expr(PyList_GET_ITEM(tmp, i), &value, arena); if (res != 0) goto failed; - asdl_seq_SET(kw_defaults, i, value); + asdl_seq_SET(defaults, i, value); } Py_CLEAR(tmp); } else { - PyErr_SetString(PyExc_TypeError, "required field \"kw_defaults\" missing from arguments"); + PyErr_SetString(PyExc_TypeError, "required field \"defaults\" missing from arguments"); return 1; } - *out = arguments(args, vararg, varargannotation, kwonlyargs, kwarg, - kwargannotation, defaults, kw_defaults, arena); + *out = arguments(args, vararg, kwonlyargs, kw_defaults, kwarg, defaults, + arena); return 0; failed: Py_XDECREF(tmp); @@ -6634,7 +6697,7 @@ obj2ast_arg(PyObject* obj, arg_ty* out, PyArena* arena) PyErr_SetString(PyExc_TypeError, "required field \"arg\" missing from arg"); return 1; } - if (_PyObject_HasAttrId(obj, &PyId_annotation)) { + if (exists_not_none(obj, &PyId_annotation)) { int res; tmp = _PyObject_GetAttrId(obj, &PyId_annotation); if (tmp == NULL) goto failed; @@ -6705,7 +6768,7 @@ obj2ast_alias(PyObject* obj, alias_ty* out, PyArena* arena) PyErr_SetString(PyExc_TypeError, "required field \"name\" missing from alias"); return 1; } - if (_PyObject_HasAttrId(obj, &PyId_asname)) { + if (exists_not_none(obj, &PyId_asname)) { int res; tmp = _PyObject_GetAttrId(obj, &PyId_asname); if (tmp == NULL) goto failed; @@ -6740,7 +6803,7 @@ obj2ast_withitem(PyObject* obj, withitem_ty* out, PyArena* arena) PyErr_SetString(PyExc_TypeError, "required field \"context_expr\" missing from withitem"); return 1; } - if (_PyObject_HasAttrId(obj, &PyId_optional_vars)) { + if (exists_not_none(obj, &PyId_optional_vars)) { int res; tmp = _PyObject_GetAttrId(obj, &PyId_optional_vars); if (tmp == NULL) goto failed; @@ -6770,7 +6833,7 @@ PyInit__ast(void) if (!m) return NULL; d = PyModule_GetDict(m); if (PyDict_SetItemString(d, "AST", (PyObject*)&AST_type) < 0) return NULL; - if (PyModule_AddIntConstant(m, "PyCF_ONLY_AST", PyCF_ONLY_AST) < 0) + if (PyModule_AddIntMacro(m, PyCF_ONLY_AST) < 0) return NULL; if (PyDict_SetItemString(d, "mod", (PyObject*)mod_type) < 0) return NULL; if (PyDict_SetItemString(d, "Module", (PyObject*)Module_type) < 0) return @@ -6850,6 +6913,8 @@ PyInit__ast(void) if (PyDict_SetItemString(d, "Str", (PyObject*)Str_type) < 0) return NULL; if (PyDict_SetItemString(d, "Bytes", (PyObject*)Bytes_type) < 0) return NULL; + if (PyDict_SetItemString(d, "NameConstant", (PyObject*)NameConstant_type) < + 0) return NULL; if (PyDict_SetItemString(d, "Ellipsis", (PyObject*)Ellipsis_type) < 0) return NULL; if (PyDict_SetItemString(d, "Attribute", (PyObject*)Attribute_type) < 0) @@ -6949,7 +7014,8 @@ PyInit__ast(void) PyObject* PyAST_mod2obj(mod_ty t) { - init_types(); + if (!init_types()) + return NULL; return ast2obj_mod(t); } @@ -6967,7 +7033,8 @@ mod_ty PyAST_obj2mod(PyObject* ast, PyArena* arena, int mode) assert(0 <= mode && mode <= 2); - init_types(); + if (!init_types()) + return NULL; isinstance = PyObject_IsInstance(ast, req_type[mode]); if (isinstance == -1) @@ -6985,7 +7052,8 @@ mod_ty PyAST_obj2mod(PyObject* ast, PyArena* arena, int mode) int PyAST_Check(PyObject* obj) { - init_types(); + if (!init_types()) + return -1; return PyObject_IsInstance(obj, (PyObject*)&AST_type); } diff --git a/Python/_warnings.c b/Python/_warnings.c index d274789..6dff0a2 100644 --- a/Python/_warnings.c +++ b/Python/_warnings.c @@ -12,7 +12,10 @@ MODULE_NAME " provides basic warning filtering support.\n" static PyObject *_filters; /* List */ static PyObject *_once_registry; /* Dict */ static PyObject *_default_action; /* String */ +static long _filters_version; +_Py_IDENTIFIER(argv); +_Py_IDENTIFIER(stderr); static int check_matched(PyObject *obj, PyObject *arg) @@ -99,7 +102,7 @@ get_default_action(void) /* The item is a new reference. */ -static const char * +static PyObject* get_filter(PyObject *category, PyObject *text, Py_ssize_t lineno, PyObject *module, PyObject **item) { @@ -145,18 +148,32 @@ get_filter(PyObject *category, PyObject *text, Py_ssize_t lineno, ln_obj = PyTuple_GET_ITEM(tmp_item, 4); good_msg = check_matched(msg, text); + if (good_msg == -1) { + Py_DECREF(tmp_item); + return NULL; + } + good_mod = check_matched(mod, module); + if (good_mod == -1) { + Py_DECREF(tmp_item); + return NULL; + } + is_subclass = PyObject_IsSubclass(category, cat); + if (is_subclass == -1) { + Py_DECREF(tmp_item); + return NULL; + } + ln = PyLong_AsSsize_t(ln_obj); - if (good_msg == -1 || good_mod == -1 || is_subclass == -1 || - (ln == -1 && PyErr_Occurred())) { + if (ln == -1 && PyErr_Occurred()) { Py_DECREF(tmp_item); return NULL; } if (good_msg && is_subclass && good_mod && (ln == 0 || lineno == ln)) { *item = tmp_item; - return _PyUnicode_AsString(action); + return action; } Py_DECREF(tmp_item); @@ -166,7 +183,7 @@ get_filter(PyObject *category, PyObject *text, Py_ssize_t lineno, if (action != NULL) { Py_INCREF(Py_None); *item = Py_None; - return _PyUnicode_AsString(action); + return action; } PyErr_SetString(PyExc_ValueError, @@ -178,16 +195,33 @@ get_filter(PyObject *category, PyObject *text, Py_ssize_t lineno, static int already_warned(PyObject *registry, PyObject *key, int should_set) { - PyObject *already_warned; + PyObject *version_obj, *already_warned; + _Py_IDENTIFIER(version); if (key == NULL) return -1; - already_warned = PyDict_GetItem(registry, key); - if (already_warned != NULL) { - int rc = PyObject_IsTrue(already_warned); - if (rc != 0) - return rc; + version_obj = _PyDict_GetItemId(registry, &PyId_version); + if (version_obj == NULL + || !PyLong_CheckExact(version_obj) + || PyLong_AsLong(version_obj) != _filters_version) { + PyDict_Clear(registry); + version_obj = PyLong_FromLong(_filters_version); + if (version_obj == NULL) + return -1; + if (_PyDict_SetItemId(registry, &PyId_version, version_obj) < 0) { + Py_DECREF(version_obj); + return -1; + } + Py_DECREF(version_obj); + } + else { + already_warned = PyDict_GetItem(registry, key); + if (already_warned != NULL) { + int rc = PyObject_IsTrue(already_warned); + if (rc != 0) + return rc; + } } /* This warning wasn't found in the registry, set it. */ @@ -201,23 +235,26 @@ static PyObject * normalize_module(PyObject *filename) { PyObject *module; - const char *mod_str; + int kind; + void *data; Py_ssize_t len; - int rc = PyObject_IsTrue(filename); - if (rc == -1) - return NULL; - else if (rc == 0) - return PyUnicode_FromString("<unknown>"); - - mod_str = _PyUnicode_AsString(filename); - if (mod_str == NULL) - return NULL; len = PyUnicode_GetLength(filename); if (len < 0) return NULL; + + if (len == 0) + return PyUnicode_FromString("<unknown>"); + + kind = PyUnicode_KIND(filename); + data = PyUnicode_DATA(filename); + + /* if filename.endswith(".py"): */ if (len >= 3 && - strncmp(mod_str + (len - 3), ".py", 3) == 0) { + PyUnicode_READ(kind, data, len-3) == '.' && + PyUnicode_READ(kind, data, len-2) == 'p' && + PyUnicode_READ(kind, data, len-1) == 'y') + { module = PyUnicode_Substring(filename, 0, len-3); } else { @@ -262,39 +299,63 @@ show_warning(PyObject *filename, int lineno, PyObject *text, PyObject name = _PyObject_GetAttrId(category, &PyId___name__); if (name == NULL) /* XXX Can an object lack a '__name__' attribute? */ - return; + goto error; - f_stderr = PySys_GetObject("stderr"); + f_stderr = _PySys_GetObjectId(&PyId_stderr); if (f_stderr == NULL) { fprintf(stderr, "lost sys.stderr\n"); - Py_DECREF(name); - return; + goto error; } /* Print "filename:lineno: category: text\n" */ - PyFile_WriteObject(filename, f_stderr, Py_PRINT_RAW); - PyFile_WriteString(lineno_str, f_stderr); - PyFile_WriteObject(name, f_stderr, Py_PRINT_RAW); - PyFile_WriteString(": ", f_stderr); - PyFile_WriteObject(text, f_stderr, Py_PRINT_RAW); - PyFile_WriteString("\n", f_stderr); - Py_XDECREF(name); + if (PyFile_WriteObject(filename, f_stderr, Py_PRINT_RAW) < 0) + goto error; + if (PyFile_WriteString(lineno_str, f_stderr) < 0) + goto error; + if (PyFile_WriteObject(name, f_stderr, Py_PRINT_RAW) < 0) + goto error; + if (PyFile_WriteString(": ", f_stderr) < 0) + goto error; + if (PyFile_WriteObject(text, f_stderr, Py_PRINT_RAW) < 0) + goto error; + if (PyFile_WriteString("\n", f_stderr) < 0) + goto error; + Py_CLEAR(name); /* Print " source_line\n" */ if (sourceline) { - char *source_line_str = _PyUnicode_AsString(sourceline); - if (source_line_str == NULL) - return; - while (*source_line_str == ' ' || *source_line_str == '\t' || - *source_line_str == '\014') - source_line_str++; - - PyFile_WriteString(source_line_str, f_stderr); + int kind; + void *data; + Py_ssize_t i, len; + Py_UCS4 ch; + PyObject *truncated; + + if (PyUnicode_READY(sourceline) < 1) + goto error; + + kind = PyUnicode_KIND(sourceline); + data = PyUnicode_DATA(sourceline); + len = PyUnicode_GET_LENGTH(sourceline); + for (i=0; i<len; i++) { + ch = PyUnicode_READ(kind, data, i); + if (ch != ' ' && ch != '\t' && ch != '\014') + break; + } + + truncated = PyUnicode_Substring(sourceline, i, len); + if (truncated == NULL) + goto error; + + PyFile_WriteObject(sourceline, f_stderr, Py_PRINT_RAW); + Py_DECREF(truncated); PyFile_WriteString("\n", f_stderr); } - else - if (_Py_DisplaySourceLine(f_stderr, filename, lineno, 2) < 0) - return; + else { + _Py_DisplaySourceLine(f_stderr, filename, lineno, 2); + } + +error: + Py_XDECREF(name); PyErr_Clear(); } @@ -305,9 +366,16 @@ warn_explicit(PyObject *category, PyObject *message, { PyObject *key = NULL, *text = NULL, *result = NULL, *lineno_obj = NULL; PyObject *item = NULL; - const char *action; + PyObject *action; int rc; + /* module can be None if a warning is emitted late during Python shutdown. + In this case, the Python warnings module was probably unloaded, filters + are no more available to choose as action. It is safer to ignore the + warning and do nothing. */ + if (module == Py_None) + Py_RETURN_NONE; + if (registry && !PyDict_Check(registry) && (registry != Py_None)) { PyErr_SetString(PyExc_TypeError, "'registry' must be a dict"); return NULL; @@ -363,7 +431,7 @@ warn_explicit(PyObject *category, PyObject *message, if (action == NULL) goto cleanup; - if (strcmp(action, "error") == 0) { + if (PyUnicode_CompareWithASCIIString(action, "error") == 0) { PyErr_SetObject(category, message); goto cleanup; } @@ -371,13 +439,13 @@ warn_explicit(PyObject *category, PyObject *message, /* Store in the registry that we've been here, *except* when the action is "always". */ rc = 0; - if (strcmp(action, "always") != 0) { + if (PyUnicode_CompareWithASCIIString(action, "always") != 0) { if (registry != NULL && registry != Py_None && PyDict_SetItem(registry, key, Py_True) < 0) goto cleanup; - else if (strcmp(action, "ignore") == 0) + else if (PyUnicode_CompareWithASCIIString(action, "ignore") == 0) goto return_none; - else if (strcmp(action, "once") == 0) { + else if (PyUnicode_CompareWithASCIIString(action, "once") == 0) { if (registry == NULL || registry == Py_None) { registry = get_once_registry(); if (registry == NULL) @@ -386,24 +454,15 @@ warn_explicit(PyObject *category, PyObject *message, /* _once_registry[(text, category)] = 1 */ rc = update_registry(registry, text, category, 0); } - else if (strcmp(action, "module") == 0) { + else if (PyUnicode_CompareWithASCIIString(action, "module") == 0) { /* registry[(text, category, 0)] = 1 */ if (registry != NULL && registry != Py_None) rc = update_registry(registry, text, category, 0); } - else if (strcmp(action, "default") != 0) { - PyObject *to_str = PyObject_Str(item); - const char *err_str = "???"; - - if (to_str != NULL) { - err_str = _PyUnicode_AsString(to_str); - if (err_str == NULL) - goto cleanup; - } + else if (PyUnicode_CompareWithASCIIString(action, "default") != 0) { PyErr_Format(PyExc_RuntimeError, - "Unrecognized action (%s) in warnings.filters:\n %s", - action, err_str); - Py_XDECREF(to_str); + "Unrecognized action (%R) in warnings.filters:\n %R", + action, item); goto cleanup; } } @@ -538,13 +597,12 @@ setup_context(Py_ssize_t stack_level, PyObject **filename, int *lineno, Py_INCREF(*filename); } else { - const char *module_str = _PyUnicode_AsString(*module); *filename = NULL; - if (module_str == NULL) - goto handle_error; - if (strcmp(module_str, "__main__") == 0) { - PyObject *argv = PySys_GetObject("argv"); - if (argv != NULL && PyList_Size(argv) > 0) { + if (*module != Py_None && PyUnicode_CompareWithASCIIString(*module, "__main__") == 0) { + PyObject *argv = _PySys_GetObjectId(&PyId_argv); + /* PyList_Check() is needed because sys.argv is set to None during + Python finalization */ + if (argv != NULL && PyList_Check(argv) && PyList_Size(argv) > 0) { int is_true; *filename = PyList_GetItem(argv, 0); Py_INCREF(*filename); @@ -564,8 +622,8 @@ setup_context(Py_ssize_t stack_level, PyObject **filename, int *lineno, else { /* embedded interpreters don't have sys.argv, see bug #839151 */ *filename = PyUnicode_FromString("__main__"); - if (*filename == NULL) - goto handle_error; + if (*filename == NULL) + goto handle_error; } } if (*filename == NULL) { @@ -659,7 +717,7 @@ warnings_warn_explicit(PyObject *self, PyObject *args, PyObject *kwds) PyObject *registry = NULL; PyObject *module_globals = NULL; - if (!PyArg_ParseTupleAndKeywords(args, kwds, "OOOi|OOO:warn_explicit", + if (!PyArg_ParseTupleAndKeywords(args, kwds, "OOUi|OOO:warn_explicit", kwd_list, &message, &category, &filename, &lineno, &module, ®istry, &module_globals)) return NULL; @@ -717,14 +775,21 @@ warnings_warn_explicit(PyObject *self, PyObject *args, PyObject *kwds) /* Handle the warning. */ returned = warn_explicit(category, message, filename, lineno, module, - registry, source_line); + registry, source_line); Py_DECREF(source_list); return returned; } standard_call: return warn_explicit(category, message, filename, lineno, module, - registry, NULL); + registry, NULL); +} + +static PyObject * +warnings_filters_mutated(PyObject *self, PyObject *args) +{ + _filters_version++; + Py_RETURN_NONE; } @@ -796,11 +861,26 @@ PyErr_Warn(PyObject *category, char *text) /* Warning with explicit origin */ int +PyErr_WarnExplicitObject(PyObject *category, PyObject *message, + PyObject *filename, int lineno, + PyObject *module, PyObject *registry) +{ + PyObject *res; + if (category == NULL) + category = PyExc_RuntimeWarning; + res = warn_explicit(category, message, filename, lineno, + module, registry, NULL); + if (res == NULL) + return -1; + Py_DECREF(res); + return 0; +} + +int PyErr_WarnExplicit(PyObject *category, const char *text, const char *filename_str, int lineno, const char *module_str, PyObject *registry) { - PyObject *res; PyObject *message = PyUnicode_FromString(text); PyObject *filename = PyUnicode_DecodeFSDefault(filename_str); PyObject *module = NULL; @@ -810,18 +890,12 @@ PyErr_WarnExplicit(PyObject *category, const char *text, goto exit; if (module_str != NULL) { module = PyUnicode_FromString(module_str); - if (module == NULL) - goto exit; + if (module == NULL) + goto exit; } - if (category == NULL) - category = PyExc_RuntimeWarning; - res = warn_explicit(category, message, filename, lineno, module, registry, - NULL); - if (res == NULL) - goto exit; - Py_DECREF(res); - ret = 0; + ret = PyErr_WarnExplicitObject(category, message, filename, lineno, + module, registry); exit: Py_XDECREF(message); @@ -830,6 +904,49 @@ PyErr_WarnExplicit(PyObject *category, const char *text, return ret; } +int +PyErr_WarnExplicitFormat(PyObject *category, + const char *filename_str, int lineno, + const char *module_str, PyObject *registry, + const char *format, ...) +{ + PyObject *message; + PyObject *module = NULL; + PyObject *filename = PyUnicode_DecodeFSDefault(filename_str); + int ret = -1; + va_list vargs; + + if (filename == NULL) + goto exit; + if (module_str != NULL) { + module = PyUnicode_FromString(module_str); + if (module == NULL) + goto exit; + } + +#ifdef HAVE_STDARG_PROTOTYPES + va_start(vargs, format); +#else + va_start(vargs); +#endif + message = PyUnicode_FromFormatV(format, vargs); + if (message != NULL) { + PyObject *res; + res = warn_explicit(category, message, filename, lineno, + module, registry, NULL); + Py_DECREF(message); + if (res != NULL) { + Py_DECREF(res); + ret = 0; + } + } + va_end(vargs); +exit: + Py_XDECREF(module); + Py_XDECREF(filename); + return ret; +} + PyDoc_STRVAR(warn_doc, "Issue a warning, or maybe ignore it or raise an exception."); @@ -842,6 +959,8 @@ static PyMethodDef warnings_functions[] = { warn_doc}, {"warn_explicit", (PyCFunction)warnings_warn_explicit, METH_VARARGS | METH_KEYWORDS, warn_explicit_doc}, + {"_filters_mutated", (PyCFunction)warnings_filters_mutated, METH_NOARGS, + NULL}, /* XXX(brett.cannon): add showwarning? */ /* XXX(brett.cannon): Reasonable to add formatwarning? */ {NULL, NULL} /* sentinel */ @@ -994,5 +1113,7 @@ _PyWarnings_Init(void) Py_INCREF(_default_action); if (PyModule_AddObject(m, "_defaultaction", _default_action) < 0) return NULL; + + _filters_version = 0; return m; } diff --git a/Python/asdl.c b/Python/asdl.c index e7e3280..74fa941 100644 --- a/Python/asdl.c +++ b/Python/asdl.c @@ -2,7 +2,7 @@ #include "asdl.h" asdl_seq * -asdl_seq_new(Py_ssize_t size, PyArena *arena) +_Py_asdl_seq_new(Py_ssize_t size, PyArena *arena) { asdl_seq *seq = NULL; size_t n = (size ? (sizeof(void *) * (size - 1)) : 0); @@ -33,7 +33,7 @@ asdl_seq_new(Py_ssize_t size, PyArena *arena) } asdl_int_seq * -asdl_int_seq_new(Py_ssize_t size, PyArena *arena) +_Py_asdl_int_seq_new(Py_ssize_t size, PyArena *arena) { asdl_int_seq *seq = NULL; size_t n = (size ? (sizeof(void *) * (size - 1)) : 0); diff --git a/Python/ast.c b/Python/ast.c index 9a0b064..d50cb80 100644 --- a/Python/ast.c +++ b/Python/ast.c @@ -109,22 +109,14 @@ validate_arguments(arguments_ty args) { if (!validate_args(args->args)) return 0; - if (args->varargannotation) { - if (!args->vararg) { - PyErr_SetString(PyExc_ValueError, "varargannotation but no vararg on arguments"); - return 0; - } - if (!validate_expr(args->varargannotation, Load)) + if (args->vararg && args->vararg->annotation + && !validate_expr(args->vararg->annotation, Load)) { return 0; } if (!validate_args(args->kwonlyargs)) return 0; - if (args->kwargannotation) { - if (!args->kwarg) { - PyErr_SetString(PyExc_ValueError, "kwargannotation but no kwarg on arguments"); - return 0; - } - if (!validate_expr(args->kwargannotation, Load)) + if (args->kwarg && args->kwarg->annotation + && !validate_expr(args->kwarg->annotation, Load)) { return 0; } if (asdl_seq_LEN(args->defaults) > asdl_seq_LEN(args->args)) { @@ -282,6 +274,7 @@ validate_expr(expr_ty exp, expr_context_ty ctx) return validate_exprs(exp->v.Tuple.elts, ctx, 0); /* These last cases don't have any checking. */ case Name_kind: + case NameConstant_kind: case Ellipsis_kind: return 1; default: @@ -498,7 +491,7 @@ PyAST_Validate(mod_ty mod) struct compiling { char *c_encoding; /* source encoding */ PyArena *c_arena; /* arena for allocating memeory */ - const char *c_filename; /* filename */ + PyObject *c_filename; /* filename */ PyObject *c_normalize; /* Normalization function from unicodedata. */ PyObject *c_normalize_args; /* Normalization argument tuple. */ }; @@ -567,7 +560,10 @@ new_identifier(const char *n, struct compiling *c) id = id2; } PyUnicode_InternInPlace(&id); - PyArena_AddPyObject(c->c_arena, id); + if (PyArena_AddPyObject(c->c_arena, id) < 0) { + Py_DECREF(id); + return NULL; + } return id; } @@ -577,24 +573,13 @@ static int ast_error(struct compiling *c, const node *n, const char *errmsg) { PyObject *value, *errstr, *loc, *tmp; - PyObject *filename_obj; - loc = PyErr_ProgramText(c->c_filename, LINENO(n)); + loc = PyErr_ProgramTextObject(c->c_filename, LINENO(n)); if (!loc) { Py_INCREF(Py_None); loc = Py_None; } - if (c->c_filename) { - filename_obj = PyUnicode_DecodeFSDefault(c->c_filename); - if (!filename_obj) { - Py_DECREF(loc); - return 0; - } - } else { - Py_INCREF(Py_None); - filename_obj = Py_None; - } - tmp = Py_BuildValue("(NiiN)", filename_obj, LINENO(n), n->n_col_offset, loc); + tmp = Py_BuildValue("(OiiN)", c->c_filename, LINENO(n), n->n_col_offset, loc); if (!tmp) return 0; errstr = PyUnicode_FromString(errmsg); @@ -677,8 +662,8 @@ num_stmts(const node *n) */ mod_ty -PyAST_FromNode(const node *n, PyCompilerFlags *flags, const char *filename, - PyArena *arena) +PyAST_FromNodeObject(const node *n, PyCompilerFlags *flags, + PyObject *filename, PyArena *arena) { int i, j, k, num; asdl_seq *stmts = NULL; @@ -688,6 +673,7 @@ PyAST_FromNode(const node *n, PyCompilerFlags *flags, const char *filename, mod_ty res = NULL; c.c_arena = arena; + /* borrowed reference */ c.c_filename = filename; c.c_normalize = c.c_normalize_args = NULL; if (flags && flags->cf_flags & PyCF_SOURCE_IS_UTF8) { @@ -710,7 +696,7 @@ PyAST_FromNode(const node *n, PyCompilerFlags *flags, const char *filename, k = 0; switch (TYPE(n)) { case file_input: - stmts = asdl_seq_new(num_stmts(n), arena); + stmts = _Py_asdl_seq_new(num_stmts(n), arena); if (!stmts) goto out; for (i = 0; i < NCH(n) - 1; i++) { @@ -750,7 +736,7 @@ PyAST_FromNode(const node *n, PyCompilerFlags *flags, const char *filename, } case single_input: if (TYPE(CHILD(n, 0)) == NEWLINE) { - stmts = asdl_seq_new(1, arena); + stmts = _Py_asdl_seq_new(1, arena); if (!stmts) goto out; asdl_seq_SET(stmts, 0, Pass(n->n_lineno, n->n_col_offset, @@ -762,7 +748,7 @@ PyAST_FromNode(const node *n, PyCompilerFlags *flags, const char *filename, else { n = CHILD(n, 0); num = num_stmts(n); - stmts = asdl_seq_new(num, arena); + stmts = _Py_asdl_seq_new(num, arena); if (!stmts) goto out; if (num == 1) { @@ -801,6 +787,21 @@ PyAST_FromNode(const node *n, PyCompilerFlags *flags, const char *filename, return res; } +mod_ty +PyAST_FromNode(const node *n, PyCompilerFlags *flags, const char *filename_str, + PyArena *arena) +{ + mod_ty mod; + PyObject *filename; + filename = PyUnicode_DecodeFSDefault(filename_str); + if (filename == NULL) + return NULL; + mod = PyAST_FromNodeObject(n, flags, filename, arena); + Py_DECREF(filename); + return mod; + +} + /* Return the AST repr. of the operator represented as syntax (|, ^, etc.) */ @@ -903,7 +904,7 @@ set_context(struct compiling *c, expr_ty e, expr_context_ty ctx, const node *n) break; case Name_kind: if (ctx == Store) { - if (forbidden_name(c, e->v.Name.id, n, 1)) + if (forbidden_name(c, e->v.Name.id, n, 0)) return 0; /* forbidden_name() calls ast_error() */ } e->v.Name.ctx = ctx; @@ -955,6 +956,9 @@ set_context(struct compiling *c, expr_ty e, expr_context_ty ctx, const node *n) case Bytes_kind: expr_name = "literal"; break; + case NameConstant_kind: + expr_name = "keyword"; + break; case Ellipsis_kind: expr_name = "Ellipsis"; break; @@ -1095,7 +1099,7 @@ seq_for_testlist(struct compiling *c, const node *n) int i; assert(TYPE(n) == testlist || TYPE(n) == testlist_star_expr || TYPE(n) == testlist_comp); - seq = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena); + seq = _Py_asdl_seq_new((NCH(n) + 1) / 2, c->c_arena); if (!seq) return NULL; @@ -1119,6 +1123,7 @@ ast_for_arg(struct compiling *c, const node *n) identifier name; expr_ty annotation = NULL; node *ch; + arg_ty ret; assert(TYPE(n) == tfpdef || TYPE(n) == vfpdef); ch = CHILD(n, 0); @@ -1134,7 +1139,12 @@ ast_for_arg(struct compiling *c, const node *n) return NULL; } - return arg(name, annotation, c->c_arena); + ret = arg(name, annotation, c->c_arena); + if (!ret) + return NULL; + ret->lineno = LINENO(n); + ret->col_offset = n->n_col_offset; + return ret; } /* returns -1 if failed to handle keyword only arguments @@ -1192,6 +1202,8 @@ handle_keywordonly_args(struct compiling *c, const node *n, int start, arg = arg(argname, annotation, c->c_arena); if (!arg) goto error; + arg->lineno = LINENO(ch); + arg->col_offset = ch->n_col_offset; asdl_seq_SET(kwonlyargs, j++, arg); i += 2; /* the name and the comma */ break; @@ -1230,15 +1242,13 @@ ast_for_arguments(struct compiling *c, const node *n) int i, j, k, nposargs = 0, nkwonlyargs = 0; int nposdefaults = 0, found_default = 0; asdl_seq *posargs, *posdefaults, *kwonlyargs, *kwdefaults; - identifier vararg = NULL, kwarg = NULL; + arg_ty vararg = NULL, kwarg = NULL; arg_ty arg; - expr_ty varargannotation = NULL, kwargannotation = NULL; node *ch; if (TYPE(n) == parameters) { if (NCH(n) == 2) /* () as argument list */ - return arguments(NULL, NULL, NULL, NULL, NULL, NULL, NULL, - NULL, c->c_arena); + return arguments(NULL, NULL, NULL, NULL, NULL, NULL, c->c_arena); n = CHILD(n, 1); } assert(TYPE(n) == typedargslist || TYPE(n) == varargslist); @@ -1270,22 +1280,22 @@ ast_for_arguments(struct compiling *c, const node *n) if (TYPE(ch) == DOUBLESTAR) break; if (TYPE(ch) == tfpdef || TYPE(ch) == vfpdef) nkwonlyargs++; } - posargs = (nposargs ? asdl_seq_new(nposargs, c->c_arena) : NULL); + posargs = (nposargs ? _Py_asdl_seq_new(nposargs, c->c_arena) : NULL); if (!posargs && nposargs) return NULL; kwonlyargs = (nkwonlyargs ? - asdl_seq_new(nkwonlyargs, c->c_arena) : NULL); + _Py_asdl_seq_new(nkwonlyargs, c->c_arena) : NULL); if (!kwonlyargs && nkwonlyargs) return NULL; posdefaults = (nposdefaults ? - asdl_seq_new(nposdefaults, c->c_arena) : NULL); + _Py_asdl_seq_new(nposdefaults, c->c_arena) : NULL); if (!posdefaults && nposdefaults) return NULL; /* The length of kwonlyargs and kwdefaults are same since we set NULL as default for keyword only argument w/o default - we have sequence data structure, but no dictionary */ kwdefaults = (nkwonlyargs ? - asdl_seq_new(nkwonlyargs, c->c_arena) : NULL); + _Py_asdl_seq_new(nkwonlyargs, c->c_arena) : NULL); if (!kwdefaults && nkwonlyargs) return NULL; @@ -1344,17 +1354,10 @@ ast_for_arguments(struct compiling *c, const node *n) i = res; /* res has new position to process */ } else { - vararg = NEW_IDENTIFIER(CHILD(ch, 0)); + vararg = ast_for_arg(c, ch); if (!vararg) return NULL; - if (forbidden_name(c, vararg, CHILD(ch, 0), 0)) - return NULL; - if (NCH(ch) > 1) { - /* there is an annotation on the vararg */ - varargannotation = ast_for_expr(c, CHILD(ch, 2)); - if (!varargannotation) - return NULL; - } + i += 3; if (i < NCH(n) && (TYPE(CHILD(n, i)) == tfpdef || TYPE(CHILD(n, i)) == vfpdef)) { @@ -1369,17 +1372,9 @@ ast_for_arguments(struct compiling *c, const node *n) case DOUBLESTAR: ch = CHILD(n, i+1); /* tfpdef */ assert(TYPE(ch) == tfpdef || TYPE(ch) == vfpdef); - kwarg = NEW_IDENTIFIER(CHILD(ch, 0)); + kwarg = ast_for_arg(c, ch); if (!kwarg) return NULL; - if (NCH(ch) > 1) { - /* there is an annotation on the kwarg */ - kwargannotation = ast_for_expr(c, CHILD(ch, 2)); - if (!kwargannotation) - return NULL; - } - if (forbidden_name(c, kwarg, CHILD(ch, 0), 0)) - return NULL; i += 3; break; default: @@ -1389,8 +1384,7 @@ ast_for_arguments(struct compiling *c, const node *n) return NULL; } } - return arguments(posargs, vararg, varargannotation, kwonlyargs, kwarg, - kwargannotation, posdefaults, kwdefaults, c->c_arena); + return arguments(posargs, vararg, kwonlyargs, kwdefaults, kwarg, posdefaults, c->c_arena); } static expr_ty @@ -1469,7 +1463,7 @@ ast_for_decorators(struct compiling *c, const node *n) int i; REQ(n, decorators); - decorator_seq = asdl_seq_new(NCH(n), c->c_arena); + decorator_seq = _Py_asdl_seq_new(NCH(n), c->c_arena); if (!decorator_seq) return NULL; @@ -1555,8 +1549,7 @@ ast_for_lambdef(struct compiling *c, const node *n) expr_ty expression; if (NCH(n) == 3) { - args = arguments(NULL, NULL, NULL, NULL, NULL, NULL, NULL, - NULL, c->c_arena); + args = arguments(NULL, NULL, NULL, NULL, NULL, NULL, c->c_arena); if (!args) return NULL; expression = ast_for_expr(c, CHILD(n, 2)); @@ -1666,7 +1659,7 @@ ast_for_comprehension(struct compiling *c, const node *n) if (n_fors == -1) return NULL; - comps = asdl_seq_new(n_fors, c->c_arena); + comps = _Py_asdl_seq_new(n_fors, c->c_arena); if (!comps) return NULL; @@ -1707,7 +1700,7 @@ ast_for_comprehension(struct compiling *c, const node *n) if (n_ifs == -1) return NULL; - ifs = asdl_seq_new(n_ifs, c->c_arena); + ifs = _Py_asdl_seq_new(n_ifs, c->c_arena); if (!ifs) return NULL; @@ -1819,11 +1812,21 @@ ast_for_atom(struct compiling *c, const node *n) switch (TYPE(ch)) { case NAME: { - /* All names start in Load context, but may later be - changed. */ - PyObject *name = NEW_IDENTIFIER(ch); + PyObject *name; + const char *s = STR(ch); + size_t len = strlen(s); + if (len >= 4 && len <= 5) { + if (!strcmp(s, "None")) + return NameConstant(Py_None, LINENO(n), n->n_col_offset, c->c_arena); + if (!strcmp(s, "True")) + return NameConstant(Py_True, LINENO(n), n->n_col_offset, c->c_arena); + if (!strcmp(s, "False")) + return NameConstant(Py_False, LINENO(n), n->n_col_offset, c->c_arena); + } + name = new_identifier(s, c); if (!name) return NULL; + /* All names start in Load context, but may later be changed. */ return Name(name, Load, LINENO(n), n->n_col_offset, c->c_arena); } case STRING: { @@ -1848,12 +1851,15 @@ ast_for_atom(struct compiling *c, const node *n) } ast_error(c, n, buf); Py_DECREF(type); - Py_DECREF(value); + Py_XDECREF(value); Py_XDECREF(tback); } return NULL; } - PyArena_AddPyObject(c->c_arena, str); + if (PyArena_AddPyObject(c->c_arena, str) < 0) { + Py_DECREF(str); + return NULL; + } if (bytesmode) return Bytes(str, LINENO(n), n->n_col_offset, c->c_arena); else @@ -1864,7 +1870,10 @@ ast_for_atom(struct compiling *c, const node *n) if (!pynum) return NULL; - PyArena_AddPyObject(c->c_arena, pynum); + if (PyArena_AddPyObject(c->c_arena, pynum) < 0) { + Py_DECREF(pynum); + return NULL; + } return Num(pynum, LINENO(n), n->n_col_offset, c->c_arena); } case ELLIPSIS: /* Ellipsis */ @@ -1913,7 +1922,7 @@ ast_for_atom(struct compiling *c, const node *n) /* it's a simple set */ asdl_seq *elts; size = (NCH(ch) + 1) / 2; /* +1 in case no trailing comma */ - elts = asdl_seq_new(size, c->c_arena); + elts = _Py_asdl_seq_new(size, c->c_arena); if (!elts) return NULL; for (i = 0; i < NCH(ch); i += 2) { @@ -1932,11 +1941,11 @@ ast_for_atom(struct compiling *c, const node *n) } else { /* it's a dict */ size = (NCH(ch) + 1) / 4; /* +1 in case no trailing comma */ - keys = asdl_seq_new(size, c->c_arena); + keys = _Py_asdl_seq_new(size, c->c_arena); if (!keys) return NULL; - values = asdl_seq_new(size, c->c_arena); + values = _Py_asdl_seq_new(size, c->c_arena); if (!values) return NULL; @@ -2096,7 +2105,7 @@ ast_for_trailer(struct compiling *c, const node *n, expr_ty left_expr) else return ast_for_call(c, CHILD(n, 1), left_expr); } - else if (TYPE(CHILD(n, 0)) == DOT ) { + else if (TYPE(CHILD(n, 0)) == DOT) { PyObject *attr_id = NEW_IDENTIFIER(CHILD(n, 1)); if (!attr_id) return NULL; @@ -2124,7 +2133,7 @@ ast_for_trailer(struct compiling *c, const node *n, expr_ty left_expr) expr_ty e; int simple = 1; asdl_seq *slices, *elts; - slices = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena); + slices = _Py_asdl_seq_new((NCH(n) + 1) / 2, c->c_arena); if (!slices) return NULL; for (j = 0; j < NCH(n); j += 2) { @@ -2140,7 +2149,7 @@ ast_for_trailer(struct compiling *c, const node *n, expr_ty left_expr) Load, LINENO(n), n->n_col_offset, c->c_arena); } /* extract Index values and put them in a Tuple */ - elts = asdl_seq_new(asdl_seq_LEN(slices), c->c_arena); + elts = _Py_asdl_seq_new(asdl_seq_LEN(slices), c->c_arena); if (!elts) return NULL; for (j = 0; j < asdl_seq_LEN(slices); ++j) { @@ -2210,10 +2219,7 @@ ast_for_power(struct compiling *c, const node *n) expr_ty f = ast_for_expr(c, CHILD(n, NCH(n) - 1)); if (!f) return NULL; - tmp = BinOp(e, Pow, f, LINENO(n), n->n_col_offset, c->c_arena); - if (!tmp) - return NULL; - e = tmp; + e = BinOp(e, Pow, f, LINENO(n), n->n_col_offset, c->c_arena); } return e; } @@ -2275,7 +2281,7 @@ ast_for_expr(struct compiling *c, const node *n) n = CHILD(n, 0); goto loop; } - seq = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena); + seq = _Py_asdl_seq_new((NCH(n) + 1) / 2, c->c_arena); if (!seq) return NULL; for (i = 0; i < NCH(n); i += 2) { @@ -2311,10 +2317,10 @@ ast_for_expr(struct compiling *c, const node *n) expr_ty expression; asdl_int_seq *ops; asdl_seq *cmps; - ops = asdl_int_seq_new(NCH(n) / 2, c->c_arena); + ops = _Py_asdl_int_seq_new(NCH(n) / 2, c->c_arena); if (!ops) return NULL; - cmps = asdl_seq_new(NCH(n) / 2, c->c_arena); + cmps = _Py_asdl_seq_new(NCH(n) / 2, c->c_arena); if (!cmps) { return NULL; } @@ -2440,10 +2446,10 @@ ast_for_call(struct compiling *c, const node *n, expr_ty func) return NULL; } - args = asdl_seq_new(nargs + ngens, c->c_arena); + args = _Py_asdl_seq_new(nargs + ngens, c->c_arena); if (!args) return NULL; - keywords = asdl_seq_new(nkeywords, c->c_arena); + keywords = _Py_asdl_seq_new(nkeywords, c->c_arena); if (!keywords) return NULL; nargs = 0; @@ -2620,7 +2626,7 @@ ast_for_expr_stmt(struct compiling *c, const node *n) /* a normal assignment */ REQ(CHILD(n, 1), EQUAL); - targets = asdl_seq_new(NCH(n) / 2, c->c_arena); + targets = _Py_asdl_seq_new(NCH(n) / 2, c->c_arena); if (!targets) return NULL; for (i = 0; i < NCH(n) - 2; i += 2) { @@ -2661,7 +2667,7 @@ ast_for_exprlist(struct compiling *c, const node *n, expr_context_ty context) REQ(n, exprlist); - seq = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena); + seq = _Py_asdl_seq_new((NCH(n) + 1) / 2, c->c_arena); if (!seq) return NULL; for (i = 0; i < NCH(n); i += 2) { @@ -2846,13 +2852,19 @@ alias_for_import_name(struct compiling *c, const node *n, int store) return NULL; str = uni; PyUnicode_InternInPlace(&str); - PyArena_AddPyObject(c->c_arena, str); + if (PyArena_AddPyObject(c->c_arena, str) < 0) { + Py_DECREF(str); + return NULL; + } return alias(str, NULL, c->c_arena); } break; case STAR: str = PyUnicode_InternFromString("*"); - PyArena_AddPyObject(c->c_arena, str); + if (PyArena_AddPyObject(c->c_arena, str) < 0) { + Py_DECREF(str); + return NULL; + } return alias(str, NULL, c->c_arena); default: PyErr_Format(PyExc_SystemError, @@ -2885,7 +2897,7 @@ ast_for_import_stmt(struct compiling *c, const node *n) if (TYPE(n) == import_name) { n = CHILD(n, 1); REQ(n, dotted_as_names); - aliases = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena); + aliases = _Py_asdl_seq_new((NCH(n) + 1) / 2, c->c_arena); if (!aliases) return NULL; for (i = 0; i < NCH(n); i += 2) { @@ -2947,7 +2959,7 @@ ast_for_import_stmt(struct compiling *c, const node *n) return NULL; } - aliases = asdl_seq_new((n_children + 1) / 2, c->c_arena); + aliases = _Py_asdl_seq_new((n_children + 1) / 2, c->c_arena); if (!aliases) return NULL; @@ -2986,7 +2998,7 @@ ast_for_global_stmt(struct compiling *c, const node *n) int i; REQ(n, global_stmt); - s = asdl_seq_new(NCH(n) / 2, c->c_arena); + s = _Py_asdl_seq_new(NCH(n) / 2, c->c_arena); if (!s) return NULL; for (i = 1; i < NCH(n); i += 2) { @@ -3007,7 +3019,7 @@ ast_for_nonlocal_stmt(struct compiling *c, const node *n) int i; REQ(n, nonlocal_stmt); - s = asdl_seq_new(NCH(n) / 2, c->c_arena); + s = _Py_asdl_seq_new(NCH(n) / 2, c->c_arena); if (!s) return NULL; for (i = 1; i < NCH(n); i += 2) { @@ -3060,7 +3072,7 @@ ast_for_suite(struct compiling *c, const node *n) REQ(n, suite); total = num_stmts(n); - seq = asdl_seq_new(total, c->c_arena); + seq = _Py_asdl_seq_new(total, c->c_arena); if (!seq) return NULL; if (TYPE(CHILD(n, 0)) == simple_stmt) { @@ -3179,7 +3191,7 @@ ast_for_if_stmt(struct compiling *c, const node *n) if (has_else) { asdl_seq *suite_seq2; - orelse = asdl_seq_new(1, c->c_arena); + orelse = _Py_asdl_seq_new(1, c->c_arena); if (!orelse) return NULL; expression = ast_for_expr(c, CHILD(n, NCH(n) - 6)); @@ -3203,7 +3215,7 @@ ast_for_if_stmt(struct compiling *c, const node *n) for (i = 0; i < n_elif; i++) { int off = 5 + (n_elif - i - 1) * 4; - asdl_seq *newobj = asdl_seq_new(1, c->c_arena); + asdl_seq *newobj = _Py_asdl_seq_new(1, c->c_arena); if (!newobj) return NULL; expression = ast_for_expr(c, CHILD(n, off)); @@ -3415,7 +3427,7 @@ ast_for_try_stmt(struct compiling *c, const node *n) if (n_except > 0) { int i; /* process except statements to create a try ... except */ - handlers = asdl_seq_new(n_except, c->c_arena); + handlers = _Py_asdl_seq_new(n_except, c->c_arena); if (handlers == NULL) return NULL; @@ -3466,7 +3478,7 @@ ast_for_with_stmt(struct compiling *c, const node *n) REQ(n, with_stmt); n_items = (NCH(n) - 2) / 2; - items = asdl_seq_new(n_items, c->c_arena); + items = _Py_asdl_seq_new(n_items, c->c_arena); if (!items) return NULL; for (i = 1; i < NCH(n) - 2; i += 2) { @@ -3632,18 +3644,16 @@ parsenumber(struct compiling *c, const char *s) end = s + strlen(s) - 1; imflag = *end == 'j' || *end == 'J'; if (s[0] == '0') { - x = (long) PyOS_strtoul((char *)s, (char **)&end, 0); + x = (long) PyOS_strtoul(s, (char **)&end, 0); if (x < 0 && errno == 0) { - return PyLong_FromString((char *)s, - (char **)0, - 0); + return PyLong_FromString(s, (char **)0, 0); } } else - x = PyOS_strtol((char *)s, (char **)&end, 0); + x = PyOS_strtol(s, (char **)&end, 0); if (*end == '\0') { if (errno != 0) - return PyLong_FromString((char *)s, (char **)0, 0); + return PyLong_FromString(s, (char **)0, 0); return PyLong_FromLong(x); } /* XXX Huge floats may silently fail */ @@ -3666,8 +3676,8 @@ parsenumber(struct compiling *c, const char *s) static PyObject * decode_utf8(struct compiling *c, const char **sPtr, const char *end) { - char *s, *t; - t = s = (char *)*sPtr; + const char *s, *t; + t = s = *sPtr; /* while (s < end && *s != '\\') s++; */ /* inefficient for u".." */ while (s < end && (*s & 0x80)) s++; *sPtr = s; diff --git a/Python/bltinmodule.c b/Python/bltinmodule.c index c94daea..53009e3 100644 --- a/Python/bltinmodule.c +++ b/Python/bltinmodule.c @@ -32,8 +32,19 @@ const char *Py_FileSystemDefaultEncoding = NULL; /* set by initfsencoding() */ int Py_HasFileSystemDefaultEncoding = 0; #endif +_Py_IDENTIFIER(__builtins__); +_Py_IDENTIFIER(__dict__); +_Py_IDENTIFIER(__prepare__); +_Py_IDENTIFIER(__round__); +_Py_IDENTIFIER(encoding); +_Py_IDENTIFIER(errors); _Py_IDENTIFIER(fileno); _Py_IDENTIFIER(flush); +_Py_IDENTIFIER(metaclass); +_Py_IDENTIFIER(sort); +_Py_IDENTIFIER(stdin); +_Py_IDENTIFIER(stdout); +_Py_IDENTIFIER(stderr); static PyObject * builtin___build_class__(PyObject *self, PyObject *args, PyObject *kwds) @@ -42,7 +53,6 @@ builtin___build_class__(PyObject *self, PyObject *args, PyObject *kwds) PyObject *cls = NULL; Py_ssize_t nargs; int isclass; - _Py_IDENTIFIER(__prepare__); assert(args != NULL); if (!PyTuple_Check(args)) { @@ -57,6 +67,11 @@ builtin___build_class__(PyObject *self, PyObject *args, PyObject *kwds) return NULL; } func = PyTuple_GET_ITEM(args, 0); /* Better be callable */ + if (!PyFunction_Check(func)) { + PyErr_SetString(PyExc_TypeError, + "__build_class__: func must be a function"); + return NULL; + } name = PyTuple_GET_ITEM(args, 1); if (!PyUnicode_Check(name)) { PyErr_SetString(PyExc_TypeError, @@ -77,10 +92,10 @@ builtin___build_class__(PyObject *self, PyObject *args, PyObject *kwds) Py_DECREF(bases); return NULL; } - meta = PyDict_GetItemString(mkw, "metaclass"); + meta = _PyDict_GetItemId(mkw, &PyId_metaclass); if (meta != NULL) { Py_INCREF(meta); - if (PyDict_DelItemString(mkw, "metaclass") < 0) { + if (_PyDict_DelItemId(mkw, &PyId_metaclass) < 0) { Py_DECREF(meta); Py_DECREF(mkw); Py_DECREF(bases); @@ -155,7 +170,9 @@ builtin___build_class__(PyObject *self, PyObject *args, PyObject *kwds) Py_DECREF(bases); return NULL; } - cell = PyObject_CallFunctionObjArgs(func, ns, NULL); + cell = PyEval_EvalCodeEx(PyFunction_GET_CODE(func), PyFunction_GET_GLOBALS(func), ns, + NULL, 0, NULL, 0, NULL, 0, NULL, + PyFunction_GET_CLOSURE(func)); if (cell != NULL) { PyObject *margs; margs = PyTuple_Pack(3, name, bases, ns); @@ -333,7 +350,11 @@ builtin_bin(PyObject *self, PyObject *v) PyDoc_STRVAR(bin_doc, "bin(number) -> string\n\ \n\ -Return the binary representation of an integer."); +Return the binary representation of an integer.\n\ +\n\ + >>> bin(2796202)\n\ + '0b1010101010101010101010'\n\ +"); static PyObject * @@ -538,31 +559,50 @@ PyDoc_STRVAR(chr_doc, Return a Unicode string of one character with ordinal i; 0 <= i <= 0x10ffff."); -static char * -source_as_string(PyObject *cmd, char *funcname, char *what, PyCompilerFlags *cf) +static const char * +source_as_string(PyObject *cmd, const char *funcname, const char *what, PyCompilerFlags *cf, PyObject **cmd_copy) { - char *str; + const char *str; Py_ssize_t size; + Py_buffer view; + *cmd_copy = NULL; if (PyUnicode_Check(cmd)) { cf->cf_flags |= PyCF_IGNORE_COOKIE; str = PyUnicode_AsUTF8AndSize(cmd, &size); if (str == NULL) return NULL; } - else if (!PyObject_CheckReadBuffer(cmd)) { + else if (PyBytes_Check(cmd)) { + str = PyBytes_AS_STRING(cmd); + size = PyBytes_GET_SIZE(cmd); + } + else if (PyByteArray_Check(cmd)) { + str = PyByteArray_AS_STRING(cmd); + size = PyByteArray_GET_SIZE(cmd); + } + else if (PyObject_GetBuffer(cmd, &view, PyBUF_SIMPLE) == 0) { + /* Copy to NUL-terminated buffer. */ + *cmd_copy = PyBytes_FromStringAndSize( + (const char *)view.buf, view.len); + PyBuffer_Release(&view); + if (*cmd_copy == NULL) { + return NULL; + } + str = PyBytes_AS_STRING(*cmd_copy); + size = PyBytes_GET_SIZE(*cmd_copy); + } + else { PyErr_Format(PyExc_TypeError, "%s() arg 1 must be a %s object", funcname, what); return NULL; } - else if (PyObject_AsReadBuffer(cmd, (const void **)&str, &size) < 0) { - return NULL; - } if (strlen(str) != size) { PyErr_SetString(PyExc_TypeError, "source code string cannot contain null bytes"); + Py_CLEAR(*cmd_copy); return NULL; } return str; @@ -571,9 +611,9 @@ source_as_string(PyObject *cmd, char *funcname, char *what, PyCompilerFlags *cf) static PyObject * builtin_compile(PyObject *self, PyObject *args, PyObject *kwds) { - char *str; - PyObject *filename_obj; - char *filename; + PyObject *cmd_copy; + const char *str; + PyObject *filename; char *startstr; int mode = -1; int dont_inherit = 0; @@ -589,12 +629,11 @@ builtin_compile(PyObject *self, PyObject *args, PyObject *kwds) if (!PyArg_ParseTupleAndKeywords(args, kwds, "OO&s|iii:compile", kwlist, &cmd, - PyUnicode_FSConverter, &filename_obj, + PyUnicode_FSDecoder, &filename, &startstr, &supplied_flags, &dont_inherit, &optimize)) return NULL; - filename = PyBytes_AS_STRING(filename_obj); cf.cf_flags = supplied_flags | PyCF_SOURCE_IS_UTF8; if (supplied_flags & @@ -652,24 +691,25 @@ builtin_compile(PyObject *self, PyObject *args, PyObject *kwds) PyArena_Free(arena); goto error; } - result = (PyObject*)PyAST_CompileEx(mod, filename, - &cf, optimize, arena); + result = (PyObject*)PyAST_CompileObject(mod, filename, + &cf, optimize, arena); PyArena_Free(arena); } goto finally; } - str = source_as_string(cmd, "compile", "string, bytes, AST or code", &cf); + str = source_as_string(cmd, "compile", "string, bytes or AST", &cf, &cmd_copy); if (str == NULL) goto error; - result = Py_CompileStringExFlags(str, filename, start[mode], &cf, optimize); + result = Py_CompileStringObject(str, filename, start[mode], &cf, optimize); + Py_XDECREF(cmd_copy); goto finally; error: result = NULL; finally: - Py_DECREF(filename_obj); + Py_DECREF(filename); return result; } @@ -731,9 +771,9 @@ Return the tuple ((x-x%y)/y, x%y). Invariant: div*y + mod == x."); static PyObject * builtin_eval(PyObject *self, PyObject *args) { - PyObject *cmd, *result, *tmp = NULL; + PyObject *cmd, *result, *cmd_copy; PyObject *globals = Py_None, *locals = Py_None; - char *str; + const char *str; PyCompilerFlags cf; if (!PyArg_UnpackTuple(args, "eval", 1, 3, &cmd, &globals, &locals)) @@ -750,8 +790,11 @@ builtin_eval(PyObject *self, PyObject *args) } if (globals == Py_None) { globals = PyEval_GetGlobals(); - if (locals == Py_None) + if (locals == Py_None) { locals = PyEval_GetLocals(); + if (locals == NULL) + return NULL; + } } else if (locals == Py_None) locals = globals; @@ -763,9 +806,9 @@ builtin_eval(PyObject *self, PyObject *args) return NULL; } - if (PyDict_GetItemString(globals, "__builtins__") == NULL) { - if (PyDict_SetItemString(globals, "__builtins__", - PyEval_GetBuiltins()) != 0) + if (_PyDict_GetItemId(globals, &PyId___builtins__) == NULL) { + if (_PyDict_SetItemId(globals, &PyId___builtins__, + PyEval_GetBuiltins()) != 0) return NULL; } @@ -779,7 +822,7 @@ builtin_eval(PyObject *self, PyObject *args) } cf.cf_flags = PyCF_SOURCE_IS_UTF8; - str = source_as_string(cmd, "eval", "string, bytes or code", &cf); + str = source_as_string(cmd, "eval", "string, bytes or code", &cf, &cmd_copy); if (str == NULL) return NULL; @@ -788,7 +831,7 @@ builtin_eval(PyObject *self, PyObject *args) (void)PyEval_MergeCompilerFlags(&cf); result = PyRun_StringFlags(str, Py_eval_input, globals, locals, &cf); - Py_XDECREF(tmp); + Py_XDECREF(cmd_copy); return result; } @@ -815,6 +858,8 @@ builtin_exec(PyObject *self, PyObject *args) globals = PyEval_GetGlobals(); if (locals == Py_None) { locals = PyEval_GetLocals(); + if (locals == NULL) + return NULL; } if (!globals || !locals) { PyErr_SetString(PyExc_SystemError, @@ -836,9 +881,9 @@ builtin_exec(PyObject *self, PyObject *args) locals->ob_type->tp_name); return NULL; } - if (PyDict_GetItemString(globals, "__builtins__") == NULL) { - if (PyDict_SetItemString(globals, "__builtins__", - PyEval_GetBuiltins()) != 0) + if (_PyDict_GetItemId(globals, &PyId___builtins__) == NULL) { + if (_PyDict_SetItemId(globals, &PyId___builtins__, + PyEval_GetBuiltins()) != 0) return NULL; } @@ -852,11 +897,13 @@ builtin_exec(PyObject *self, PyObject *args) v = PyEval_EvalCode(prog, globals, locals); } else { - char *str; + PyObject *prog_copy; + const char *str; PyCompilerFlags cf; cf.cf_flags = PyCF_SOURCE_IS_UTF8; str = source_as_string(prog, "exec", - "string, bytes or code", &cf); + "string, bytes or code", &cf, + &prog_copy); if (str == NULL) return NULL; if (PyEval_MergeCompilerFlags(&cf)) @@ -864,6 +911,7 @@ builtin_exec(PyObject *self, PyObject *args) locals, &cf); else v = PyRun_String(str, Py_file_input, globals, locals); + Py_XDECREF(prog_copy); } if (v == NULL) return NULL; @@ -1256,7 +1304,11 @@ builtin_hex(PyObject *self, PyObject *v) PyDoc_STRVAR(hex_doc, "hex(number) -> string\n\ \n\ -Return the hexadecimal representation of an integer."); +Return the hexadecimal representation of an integer.\n\ +\n\ + >>> hex(3735928559)\n\ + '0xdeadbeef'\n\ +"); static PyObject * @@ -1297,9 +1349,9 @@ builtin_len(PyObject *self, PyObject *v) } PyDoc_STRVAR(len_doc, -"len(object) -> integer\n\ +"len(object)\n\ \n\ -Return the number of items of a sequence or mapping."); +Return the number of items of a sequence or collection."); static PyObject * @@ -1322,26 +1374,35 @@ static PyObject * min_max(PyObject *args, PyObject *kwds, int op) { PyObject *v, *it, *item, *val, *maxitem, *maxval, *keyfunc=NULL; + PyObject *emptytuple, *defaultval = NULL; + static char *kwlist[] = {"key", "default", NULL}; const char *name = op == Py_LT ? "min" : "max"; + const int positional = PyTuple_Size(args) > 1; + int ret; - if (PyTuple_Size(args) > 1) + if (positional) v = args; - else if (!PyArg_UnpackTuple(args, (char *)name, 1, 1, &v)) + else if (!PyArg_UnpackTuple(args, name, 1, 1, &v)) return NULL; - if (kwds != NULL && PyDict_Check(kwds) && PyDict_Size(kwds)) { - keyfunc = PyDict_GetItemString(kwds, "key"); - if (PyDict_Size(kwds)!=1 || keyfunc == NULL) { - PyErr_Format(PyExc_TypeError, - "%s() got an unexpected keyword argument", name); - return NULL; - } - Py_INCREF(keyfunc); + emptytuple = PyTuple_New(0); + if (emptytuple == NULL) + return NULL; + ret = PyArg_ParseTupleAndKeywords(emptytuple, kwds, "|$OO", kwlist, + &keyfunc, &defaultval); + Py_DECREF(emptytuple); + if (!ret) + return NULL; + + if (positional && defaultval != NULL) { + PyErr_Format(PyExc_TypeError, + "Cannot specify a default for %s() with multiple " + "positional arguments", name); + return NULL; } it = PyObject_GetIter(v); if (it == NULL) { - Py_XDECREF(keyfunc); return NULL; } @@ -1385,14 +1446,18 @@ min_max(PyObject *args, PyObject *kwds, int op) if (PyErr_Occurred()) goto Fail_it; if (maxval == NULL) { - PyErr_Format(PyExc_ValueError, - "%s() arg is an empty sequence", name); assert(maxitem == NULL); + if (defaultval != NULL) { + Py_INCREF(defaultval); + maxitem = defaultval; + } else { + PyErr_Format(PyExc_ValueError, + "%s() arg is an empty sequence", name); + } } else Py_DECREF(maxval); Py_DECREF(it); - Py_XDECREF(keyfunc); return maxitem; Fail_it_item_and_val: @@ -1403,7 +1468,6 @@ Fail_it: Py_XDECREF(maxval); Py_XDECREF(maxitem); Py_DECREF(it); - Py_XDECREF(keyfunc); return NULL; } @@ -1414,10 +1478,12 @@ builtin_min(PyObject *self, PyObject *args, PyObject *kwds) } PyDoc_STRVAR(min_doc, -"min(iterable[, key=func]) -> value\n\ -min(a, b, c, ...[, key=func]) -> value\n\ +"min(iterable, *[, default=obj, key=func]) -> value\n\ +min(arg1, arg2, *args, *[, key=func]) -> value\n\ \n\ -With a single iterable argument, return its smallest item.\n\ +With a single iterable argument, return its smallest item. The\n\ +default keyword-only argument specifies an object to return if\n\ +the provided iterable is empty.\n\ With two or more arguments, return the smallest argument."); @@ -1428,10 +1494,12 @@ builtin_max(PyObject *self, PyObject *args, PyObject *kwds) } PyDoc_STRVAR(max_doc, -"max(iterable[, key=func]) -> value\n\ -max(a, b, c, ...[, key=func]) -> value\n\ +"max(iterable, *[, default=obj, key=func]) -> value\n\ +max(arg1, arg2, *args, *[, key=func]) -> value\n\ \n\ -With a single iterable argument, return its largest item.\n\ +With a single iterable argument, return its biggest item. The\n\ +default keyword-only argument specifies an object to return if\n\ +the provided iterable is empty.\n\ With two or more arguments, return the largest argument."); @@ -1444,7 +1512,11 @@ builtin_oct(PyObject *self, PyObject *v) PyDoc_STRVAR(oct_doc, "oct(number) -> string\n\ \n\ -Return the octal representation of an integer."); +Return the octal representation of an integer.\n\ +\n\ + >>> oct(342391)\n\ + '0o1234567'\n\ +"); static PyObject * @@ -1530,7 +1602,12 @@ builtin_print(PyObject *self, PyObject *args, PyObject *kwds) kwlist, &sep, &end, &file, &flush)) return NULL; if (file == NULL || file == Py_None) { - file = PySys_GetObject("stdout"); + file = _PySys_GetObjectId(&PyId_stdout); + if (file == NULL) { + PyErr_SetString(PyExc_RuntimeError, "lost sys.stdout"); + return NULL; + } + /* sys.stdout may be None when FILE* stdout isn't connected */ if (file == Py_None) Py_RETURN_NONE; @@ -1584,7 +1661,7 @@ builtin_print(PyObject *self, PyObject *args, PyObject *kwds) if (do_flush == -1) return NULL; else if (do_flush) { - tmp = PyObject_CallMethod(file, "flush", ""); + tmp = _PyObject_CallMethodId(file, &PyId_flush, ""); if (tmp == NULL) return NULL; else @@ -1610,9 +1687,9 @@ static PyObject * builtin_input(PyObject *self, PyObject *args) { PyObject *promptarg = NULL; - PyObject *fin = PySys_GetObject("stdin"); - PyObject *fout = PySys_GetObject("stdout"); - PyObject *ferr = PySys_GetObject("stderr"); + PyObject *fin = _PySys_GetObjectId(&PyId_stdin); + PyObject *fout = _PySys_GetObjectId(&PyId_stdout); + PyObject *ferr = _PySys_GetObjectId(&PyId_stderr); PyObject *tmp; long fd; int tty; @@ -1662,8 +1739,10 @@ builtin_input(PyObject *self, PyObject *args) } if (tty) { tmp = _PyObject_CallMethodId(fout, &PyId_fileno, ""); - if (tmp == NULL) + if (tmp == NULL) { PyErr_Clear(); + tty = 0; + } else { fd = PyLong_AsLong(tmp); Py_DECREF(tmp); @@ -1683,8 +1762,6 @@ builtin_input(PyObject *self, PyObject *args) char *stdin_encoding_str, *stdin_errors_str; PyObject *result; size_t len; - _Py_IDENTIFIER(encoding); - _Py_IDENTIFIER(errors); stdin_encoding = _PyObject_GetAttrId(fin, &PyId_encoding); stdin_errors = _PyObject_GetAttrId(fin, &PyId_errors); @@ -1810,10 +1887,9 @@ For most object types, eval(repr(object)) == object."); static PyObject * builtin_round(PyObject *self, PyObject *args, PyObject *kwds) { - static PyObject *round_str = NULL; PyObject *ndigits = NULL; static char *kwlist[] = {"number", "ndigits", 0}; - PyObject *number, *round; + PyObject *number, *round, *result; if (!PyArg_ParseTupleAndKeywords(args, kwds, "O|O:round", kwlist, &number, &ndigits)) @@ -1824,24 +1900,21 @@ builtin_round(PyObject *self, PyObject *args, PyObject *kwds) return NULL; } - if (round_str == NULL) { - round_str = PyUnicode_InternFromString("__round__"); - if (round_str == NULL) - return NULL; - } - - round = _PyType_Lookup(Py_TYPE(number), round_str); + round = _PyObject_LookupSpecial(number, &PyId___round__); if (round == NULL) { - PyErr_Format(PyExc_TypeError, - "type %.100s doesn't define __round__ method", - Py_TYPE(number)->tp_name); + if (!PyErr_Occurred()) + PyErr_Format(PyExc_TypeError, + "type %.100s doesn't define __round__ method", + Py_TYPE(number)->tp_name); return NULL; } if (ndigits == NULL) - return PyObject_CallFunction(round, "O", number); + result = PyObject_CallFunctionObjArgs(round, NULL); else - return PyObject_CallFunction(round, "OO", number, ndigits); + result = PyObject_CallFunctionObjArgs(round, ndigits, NULL); + Py_DECREF(round); + return result; } PyDoc_STRVAR(round_doc, @@ -1859,7 +1932,6 @@ builtin_sorted(PyObject *self, PyObject *args, PyObject *kwds) PyObject *callable; static char *kwlist[] = {"iterable", "key", "reverse", 0}; int reverse; - _Py_IDENTIFIER(sort); /* args 1-3 should match listsort in Objects/listobject.c */ if (!PyArg_ParseTupleAndKeywords(args, kwds, "O|Oi:sorted", @@ -1907,16 +1979,11 @@ builtin_vars(PyObject *self, PyObject *args) return NULL; if (v == NULL) { d = PyEval_GetLocals(); - if (d == NULL) { - if (!PyErr_Occurred()) - PyErr_SetString(PyExc_SystemError, - "vars(): no locals!?"); - } - else - Py_INCREF(d); + if (d == NULL) + return NULL; + Py_INCREF(d); } else { - _Py_IDENTIFIER(__dict__); d = _PyObject_GetAttrId(v, &PyId___dict__); if (d == NULL) { PyErr_SetString(PyExc_TypeError, @@ -2413,6 +2480,12 @@ PyObject * _PyBuiltin_Init(void) { PyObject *mod, *dict, *debug; + + if (PyType_Ready(&PyFilter_Type) < 0 || + PyType_Ready(&PyMap_Type) < 0 || + PyType_Ready(&PyZip_Type) < 0) + return NULL; + mod = PyModule_Create(&builtinsmodule); if (mod == NULL) return NULL; diff --git a/Python/ceval.c b/Python/ceval.c index 2b16191..7a0cb7f 100644 --- a/Python/ceval.c +++ b/Python/ceval.c @@ -37,7 +37,7 @@ typedef unsigned long long uint64; static void ppc_getcounter(uint64 *v) { - register unsigned long tbu, tb, tbu2; + unsigned long tbu, tb, tbu2; loop: asm volatile ("mftbu %0" : "=r" (tbu) ); @@ -65,9 +65,11 @@ ppc_getcounter(uint64 *v) even in 64-bit mode, we need to use "a" and "d" for the lower and upper 32-bit pieces of the result. */ -#define READ_TIMESTAMP(val) \ - __asm__ __volatile__("rdtsc" : \ - "=a" (((int*)&(val))[0]), "=d" (((int*)&(val))[1])); +#define READ_TIMESTAMP(val) do { \ + unsigned int h, l; \ + __asm__ __volatile__("rdtsc" : "=a" (l), "=d" (h)); \ + (val) = ((uint64)l) | (((uint64)h) << 32); \ + } while(0) #else @@ -123,13 +125,16 @@ static PyObject * load_args(PyObject ***, int); static int lltrace; static int prtrace(PyObject *, char *); #endif -static int call_trace(Py_tracefunc, PyObject *, PyFrameObject *, +static int call_trace(Py_tracefunc, PyObject *, + PyThreadState *, PyFrameObject *, int, PyObject *); static int call_trace_protected(Py_tracefunc, PyObject *, - PyFrameObject *, int, PyObject *); -static void call_exc_trace(Py_tracefunc, PyObject *, PyFrameObject *); + PyThreadState *, PyFrameObject *, + int, PyObject *); +static void call_exc_trace(Py_tracefunc, PyObject *, + PyThreadState *, PyFrameObject *); static int maybe_call_line_trace(Py_tracefunc, PyObject *, - PyFrameObject *, int *, int *, int *); + PyThreadState *, PyFrameObject *, int *, int *, int *); static PyObject * cmp_outcome(int, PyObject *, PyObject *); static PyObject * import_from(PyObject *, PyObject *); @@ -142,8 +147,6 @@ static PyObject * special_lookup(PyObject *, _Py_Identifier *); #define NAME_ERROR_MSG \ "name '%.200s' is not defined" -#define GLOBAL_NAME_ERROR_MSG \ - "global name '%.200s' is not defined" #define UNBOUNDLOCAL_ERROR_MSG \ "local variable '%.200s' referenced before assignment" #define UNBOUNDFREE_ERROR_MSG \ @@ -364,29 +367,28 @@ PyEval_ReleaseThread(PyThreadState *tstate) drop_gil(tstate); } -/* This function is called from PyOS_AfterFork to ensure that newly - created child processes don't hold locks referring to threads which - are not running in the child process. (This could also be done using - pthread_atfork mechanism, at least for the pthreads implementation.) */ +/* This function is called from PyOS_AfterFork to destroy all threads which are + * not running in the child process, and clear internal locks which might be + * held by those threads. (This could also be done using pthread_atfork + * mechanism, at least for the pthreads implementation.) */ void PyEval_ReInitThreads(void) { _Py_IDENTIFIER(_after_fork); PyObject *threading, *result; - PyThreadState *tstate = PyThreadState_GET(); + PyThreadState *current_tstate = PyThreadState_GET(); if (!gil_created()) return; recreate_gil(); pending_lock = PyThread_allocate_lock(); - take_gil(tstate); + take_gil(current_tstate); main_thread = PyThread_get_thread_ident(); /* Update the threading module with the new state. */ - tstate = PyThreadState_GET(); - threading = PyMapping_GetItemString(tstate->interp->modules, + threading = PyMapping_GetItemString(current_tstate->interp->modules, "threading"); if (threading == NULL) { /* threading not imported */ @@ -399,6 +401,9 @@ PyEval_ReInitThreads(void) else Py_DECREF(result); Py_DECREF(threading); + + /* Destroy all threads except the current one */ + _PyThreadState_DeleteExcept(current_tstate); } #else @@ -705,7 +710,7 @@ Py_SetRecursionLimit(int new_limit) to guarantee that _Py_CheckRecursiveCall() is regularly called. Without USE_STACKCHECK, there is no need for this. */ int -_Py_CheckRecursiveCall(char *where) +_Py_CheckRecursiveCall(const char *where) { PyThreadState *tstate = PyThreadState_GET(); @@ -742,7 +747,6 @@ _Py_CheckRecursiveCall(char *where) enum why_code { WHY_NOT = 0x0001, /* No error */ WHY_EXCEPTION = 0x0002, /* Exception occurred */ - WHY_RERAISE = 0x0004, /* Exception re-raised by 'finally' */ WHY_RETURN = 0x0008, /* 'return' statement */ WHY_BREAK = 0x0010, /* 'break' statement */ WHY_CONTINUE = 0x0020, /* 'continue' statement */ @@ -753,7 +757,7 @@ enum why_code { static void save_exc_state(PyThreadState *, PyFrameObject *); static void swap_exc_state(PyThreadState *, PyFrameObject *); static void restore_and_clear_exc_state(PyThreadState *, PyFrameObject *); -static enum why_code do_raise(PyObject *, PyObject *); +static int do_raise(PyObject *, PyObject *); static int unpack_iterable(PyObject *, int, int, PyObject **); /* Records whether tracing is on for any thread. Counts the number of @@ -793,18 +797,12 @@ PyEval_EvalFrameEx(PyFrameObject *f, int throwflag) #ifdef DXPAIRS int lastopcode = 0; #endif - register PyObject **stack_pointer; /* Next free slot in value stack */ - register unsigned char *next_instr; - register int opcode; /* Current opcode */ - register int oparg; /* Current opcode argument, if any */ - register enum why_code why; /* Reason for block stack unwind */ - register int err; /* Error status -- nonzero if error */ - register PyObject *x; /* Result object -- NULL if error */ - register PyObject *v; /* Temporary objects popped off stack */ - register PyObject *w; - register PyObject *u; - register PyObject *t; - register PyObject **fastlocals, **freevars; + PyObject **stack_pointer; /* Next free slot in value stack */ + unsigned char *next_instr; + int opcode; /* Current opcode */ + int oparg; /* Current opcode argument, if any */ + enum why_code why; /* Reason for block stack unwind */ + PyObject **fastlocals, **freevars; PyObject *retval = NULL; /* Return value */ PyThreadState *tstate = PyThreadState_GET(); PyCodeObject *co; @@ -1143,7 +1141,7 @@ PyEval_EvalFrameEx(PyFrameObject *f, int throwflag) whenever an exception is detected. */ if (call_trace_protected(tstate->c_tracefunc, tstate->c_traceobj, - f, PyTrace_CALL, Py_None)) { + tstate, f, PyTrace_CALL, Py_None)) { /* Trace function raised an error */ goto exit_eval_frame; } @@ -1153,7 +1151,7 @@ PyEval_EvalFrameEx(PyFrameObject *f, int throwflag) return itself and isn't called for "line" events */ if (call_trace_protected(tstate->c_profilefunc, tstate->c_profileobj, - f, PyTrace_CALL, Py_None)) { + tstate, f, PyTrace_CALL, Py_None)) { /* Profile function raised an error */ goto exit_eval_frame; } @@ -1189,9 +1187,10 @@ PyEval_EvalFrameEx(PyFrameObject *f, int throwflag) stack_pointer = f->f_stacktop; assert(stack_pointer != NULL); f->f_stacktop = NULL; /* remains NULL unless yield suspends frame */ + f->f_executing = 1; - if (co->co_flags & CO_GENERATOR && !throwflag) { - if (f->f_exc_type != NULL && f->f_exc_type != Py_None) { + if (co->co_flags & CO_GENERATOR) { + if (!throwflag && f->f_exc_type != NULL && f->f_exc_type != Py_None) { /* We were in an except handler when we left, restore the exception state which was put aside (see YIELD_VALUE). */ @@ -1206,14 +1205,16 @@ PyEval_EvalFrameEx(PyFrameObject *f, int throwflag) #endif why = WHY_NOT; - err = 0; - x = Py_None; /* Not a reference, just anything non-NULL */ - w = NULL; - if (throwflag) { /* support for generator.throw() */ - why = WHY_EXCEPTION; - goto on_error; - } + if (throwflag) /* support for generator.throw() */ + goto error; + +#ifdef Py_DEBUG + /* PyEval_EvalFrameEx() must not be called with an exception set, + because it may clear it (directly or indirectly) and so the + caller loses its exception */ + assert(!PyErr_Occurred()); +#endif for (;;) { #ifdef WITH_TSC @@ -1235,6 +1236,7 @@ PyEval_EvalFrameEx(PyFrameObject *f, int throwflag) #endif assert(stack_pointer >= f->f_valuestack); /* else underflow */ assert(STACK_LEVEL() <= co->co_stacksize); /* else overflow */ + assert(!PyErr_Occurred()); /* Do periodic things. Doing this every time through the loop would add too much overhead, so we do it @@ -1250,15 +1252,12 @@ PyEval_EvalFrameEx(PyFrameObject *f, int throwflag) a try: finally: block uninterruptible. */ goto fast_next_opcode; } - tstate->tick_counter++; #ifdef WITH_TSC ticked = 1; #endif if (_Py_atomic_load_relaxed(&pendingcalls_to_do)) { - if (Py_MakePendingCalls() < 0) { - why = WHY_EXCEPTION; - goto on_error; - } + if (Py_MakePendingCalls() < 0) + goto error; } #ifdef WITH_THREAD if (_Py_atomic_load_relaxed(&gil_drop_request)) { @@ -1270,19 +1269,25 @@ PyEval_EvalFrameEx(PyFrameObject *f, int throwflag) /* Other threads may run now */ take_gil(tstate); + + /* Check if we should make a quick exit. */ + if (_Py_Finalizing && _Py_Finalizing != tstate) { + drop_gil(tstate); + PyThread_exit_thread(); + } + if (PyThreadState_Swap(tstate) != NULL) Py_FatalError("ceval: orphan tstate"); } #endif /* Check for asynchronous exceptions. */ if (tstate->async_exc != NULL) { - x = tstate->async_exc; + PyObject *exc = tstate->async_exc; tstate->async_exc = NULL; UNSIGNAL_ASYNC_EXC(); - PyErr_SetNone(x); - Py_DECREF(x); - why = WHY_EXCEPTION; - goto on_error; + PyErr_SetNone(exc); + Py_DECREF(exc); + goto error; } } @@ -1293,24 +1298,24 @@ PyEval_EvalFrameEx(PyFrameObject *f, int throwflag) if (_Py_TracingPossible && tstate->c_tracefunc != NULL && !tstate->tracing) { + int err; /* see maybe_call_line_trace for expository comments */ f->f_stacktop = stack_pointer; err = maybe_call_line_trace(tstate->c_tracefunc, tstate->c_traceobj, - f, &instr_lb, &instr_ub, - &instr_prev); + tstate, f, + &instr_lb, &instr_ub, &instr_prev); /* Reload possibly changed frame fields */ JUMPTO(f->f_lasti); if (f->f_stacktop != NULL) { stack_pointer = f->f_stacktop; f->f_stacktop = NULL; } - if (err) { + if (err) /* trace function raised an exception */ - goto on_error; - } + goto error; } /* Extract opcode and argument */ @@ -1357,87 +1362,99 @@ PyEval_EvalFrameEx(PyFrameObject *f, int throwflag) TARGET(NOP) FAST_DISPATCH(); - TARGET(LOAD_FAST) - x = GETLOCAL(oparg); - if (x != NULL) { - Py_INCREF(x); - PUSH(x); - FAST_DISPATCH(); + TARGET(LOAD_FAST) { + PyObject *value = GETLOCAL(oparg); + if (value == NULL) { + format_exc_check_arg(PyExc_UnboundLocalError, + UNBOUNDLOCAL_ERROR_MSG, + PyTuple_GetItem(co->co_varnames, oparg)); + goto error; } - format_exc_check_arg(PyExc_UnboundLocalError, - UNBOUNDLOCAL_ERROR_MSG, - PyTuple_GetItem(co->co_varnames, oparg)); - break; + Py_INCREF(value); + PUSH(value); + FAST_DISPATCH(); + } - TARGET(LOAD_CONST) - x = GETITEM(consts, oparg); - Py_INCREF(x); - PUSH(x); + TARGET(LOAD_CONST) { + PyObject *value = GETITEM(consts, oparg); + Py_INCREF(value); + PUSH(value); FAST_DISPATCH(); + } PREDICTED_WITH_ARG(STORE_FAST); - TARGET(STORE_FAST) - v = POP(); - SETLOCAL(oparg, v); + TARGET(STORE_FAST) { + PyObject *value = POP(); + SETLOCAL(oparg, value); FAST_DISPATCH(); + } - TARGET(POP_TOP) - v = POP(); - Py_DECREF(v); + TARGET(POP_TOP) { + PyObject *value = POP(); + Py_DECREF(value); FAST_DISPATCH(); + } - TARGET(ROT_TWO) - v = TOP(); - w = SECOND(); - SET_TOP(w); - SET_SECOND(v); + TARGET(ROT_TWO) { + PyObject *top = TOP(); + PyObject *second = SECOND(); + SET_TOP(second); + SET_SECOND(top); FAST_DISPATCH(); + } - TARGET(ROT_THREE) - v = TOP(); - w = SECOND(); - x = THIRD(); - SET_TOP(w); - SET_SECOND(x); - SET_THIRD(v); + TARGET(ROT_THREE) { + PyObject *top = TOP(); + PyObject *second = SECOND(); + PyObject *third = THIRD(); + SET_TOP(second); + SET_SECOND(third); + SET_THIRD(top); FAST_DISPATCH(); + } - TARGET(DUP_TOP) - v = TOP(); - Py_INCREF(v); - PUSH(v); + TARGET(DUP_TOP) { + PyObject *top = TOP(); + Py_INCREF(top); + PUSH(top); FAST_DISPATCH(); + } - TARGET(DUP_TOP_TWO) - x = TOP(); - Py_INCREF(x); - w = SECOND(); - Py_INCREF(w); + TARGET(DUP_TOP_TWO) { + PyObject *top = TOP(); + PyObject *second = SECOND(); + Py_INCREF(top); + Py_INCREF(second); STACKADJ(2); - SET_TOP(x); - SET_SECOND(w); + SET_TOP(top); + SET_SECOND(second); FAST_DISPATCH(); + } - TARGET(UNARY_POSITIVE) - v = TOP(); - x = PyNumber_Positive(v); - Py_DECREF(v); - SET_TOP(x); - if (x != NULL) DISPATCH(); - break; + TARGET(UNARY_POSITIVE) { + PyObject *value = TOP(); + PyObject *res = PyNumber_Positive(value); + Py_DECREF(value); + SET_TOP(res); + if (res == NULL) + goto error; + DISPATCH(); + } - TARGET(UNARY_NEGATIVE) - v = TOP(); - x = PyNumber_Negative(v); - Py_DECREF(v); - SET_TOP(x); - if (x != NULL) DISPATCH(); - break; + TARGET(UNARY_NEGATIVE) { + PyObject *value = TOP(); + PyObject *res = PyNumber_Negative(value); + Py_DECREF(value); + SET_TOP(res); + if (res == NULL) + goto error; + DISPATCH(); + } - TARGET(UNARY_NOT) - v = TOP(); - err = PyObject_IsTrue(v); - Py_DECREF(v); + TARGET(UNARY_NOT) { + PyObject *value = TOP(); + int err = PyObject_IsTrue(value); + Py_DECREF(value); if (err == 0) { Py_INCREF(Py_True); SET_TOP(Py_True); @@ -1450,416 +1467,464 @@ PyEval_EvalFrameEx(PyFrameObject *f, int throwflag) DISPATCH(); } STACKADJ(-1); - break; + goto error; + } - TARGET(UNARY_INVERT) - v = TOP(); - x = PyNumber_Invert(v); - Py_DECREF(v); - SET_TOP(x); - if (x != NULL) DISPATCH(); - break; + TARGET(UNARY_INVERT) { + PyObject *value = TOP(); + PyObject *res = PyNumber_Invert(value); + Py_DECREF(value); + SET_TOP(res); + if (res == NULL) + goto error; + DISPATCH(); + } - TARGET(BINARY_POWER) - w = POP(); - v = TOP(); - x = PyNumber_Power(v, w, Py_None); - Py_DECREF(v); - Py_DECREF(w); - SET_TOP(x); - if (x != NULL) DISPATCH(); - break; + TARGET(BINARY_POWER) { + PyObject *exp = POP(); + PyObject *base = TOP(); + PyObject *res = PyNumber_Power(base, exp, Py_None); + Py_DECREF(base); + Py_DECREF(exp); + SET_TOP(res); + if (res == NULL) + goto error; + DISPATCH(); + } - TARGET(BINARY_MULTIPLY) - w = POP(); - v = TOP(); - x = PyNumber_Multiply(v, w); - Py_DECREF(v); - Py_DECREF(w); - SET_TOP(x); - if (x != NULL) DISPATCH(); - break; + TARGET(BINARY_MULTIPLY) { + PyObject *right = POP(); + PyObject *left = TOP(); + PyObject *res = PyNumber_Multiply(left, right); + Py_DECREF(left); + Py_DECREF(right); + SET_TOP(res); + if (res == NULL) + goto error; + DISPATCH(); + } - TARGET(BINARY_TRUE_DIVIDE) - w = POP(); - v = TOP(); - x = PyNumber_TrueDivide(v, w); - Py_DECREF(v); - Py_DECREF(w); - SET_TOP(x); - if (x != NULL) DISPATCH(); - break; + TARGET(BINARY_TRUE_DIVIDE) { + PyObject *divisor = POP(); + PyObject *dividend = TOP(); + PyObject *quotient = PyNumber_TrueDivide(dividend, divisor); + Py_DECREF(dividend); + Py_DECREF(divisor); + SET_TOP(quotient); + if (quotient == NULL) + goto error; + DISPATCH(); + } - TARGET(BINARY_FLOOR_DIVIDE) - w = POP(); - v = TOP(); - x = PyNumber_FloorDivide(v, w); - Py_DECREF(v); - Py_DECREF(w); - SET_TOP(x); - if (x != NULL) DISPATCH(); - break; + TARGET(BINARY_FLOOR_DIVIDE) { + PyObject *divisor = POP(); + PyObject *dividend = TOP(); + PyObject *quotient = PyNumber_FloorDivide(dividend, divisor); + Py_DECREF(dividend); + Py_DECREF(divisor); + SET_TOP(quotient); + if (quotient == NULL) + goto error; + DISPATCH(); + } - TARGET(BINARY_MODULO) - w = POP(); - v = TOP(); - if (PyUnicode_CheckExact(v)) - x = PyUnicode_Format(v, w); - else - x = PyNumber_Remainder(v, w); - Py_DECREF(v); - Py_DECREF(w); - SET_TOP(x); - if (x != NULL) DISPATCH(); - break; + TARGET(BINARY_MODULO) { + PyObject *divisor = POP(); + PyObject *dividend = TOP(); + PyObject *res = PyUnicode_CheckExact(dividend) ? + PyUnicode_Format(dividend, divisor) : + PyNumber_Remainder(dividend, divisor); + Py_DECREF(divisor); + Py_DECREF(dividend); + SET_TOP(res); + if (res == NULL) + goto error; + DISPATCH(); + } - TARGET(BINARY_ADD) - w = POP(); - v = TOP(); - if (PyUnicode_CheckExact(v) && - PyUnicode_CheckExact(w)) { - x = unicode_concatenate(v, w, f, next_instr); + TARGET(BINARY_ADD) { + PyObject *right = POP(); + PyObject *left = TOP(); + PyObject *sum; + if (PyUnicode_CheckExact(left) && + PyUnicode_CheckExact(right)) { + sum = unicode_concatenate(left, right, f, next_instr); /* unicode_concatenate consumed the ref to v */ - goto skip_decref_vx; } else { - x = PyNumber_Add(v, w); + sum = PyNumber_Add(left, right); + Py_DECREF(left); } - Py_DECREF(v); - skip_decref_vx: - Py_DECREF(w); - SET_TOP(x); - if (x != NULL) DISPATCH(); - break; - - TARGET(BINARY_SUBTRACT) - w = POP(); - v = TOP(); - x = PyNumber_Subtract(v, w); - Py_DECREF(v); - Py_DECREF(w); - SET_TOP(x); - if (x != NULL) DISPATCH(); - break; - - TARGET(BINARY_SUBSCR) - w = POP(); - v = TOP(); - x = PyObject_GetItem(v, w); - Py_DECREF(v); - Py_DECREF(w); - SET_TOP(x); - if (x != NULL) DISPATCH(); - break; + Py_DECREF(right); + SET_TOP(sum); + if (sum == NULL) + goto error; + DISPATCH(); + } - TARGET(BINARY_LSHIFT) - w = POP(); - v = TOP(); - x = PyNumber_Lshift(v, w); - Py_DECREF(v); - Py_DECREF(w); - SET_TOP(x); - if (x != NULL) DISPATCH(); - break; + TARGET(BINARY_SUBTRACT) { + PyObject *right = POP(); + PyObject *left = TOP(); + PyObject *diff = PyNumber_Subtract(left, right); + Py_DECREF(right); + Py_DECREF(left); + SET_TOP(diff); + if (diff == NULL) + goto error; + DISPATCH(); + } - TARGET(BINARY_RSHIFT) - w = POP(); - v = TOP(); - x = PyNumber_Rshift(v, w); - Py_DECREF(v); - Py_DECREF(w); - SET_TOP(x); - if (x != NULL) DISPATCH(); - break; + TARGET(BINARY_SUBSCR) { + PyObject *sub = POP(); + PyObject *container = TOP(); + PyObject *res = PyObject_GetItem(container, sub); + Py_DECREF(container); + Py_DECREF(sub); + SET_TOP(res); + if (res == NULL) + goto error; + DISPATCH(); + } - TARGET(BINARY_AND) - w = POP(); - v = TOP(); - x = PyNumber_And(v, w); - Py_DECREF(v); - Py_DECREF(w); - SET_TOP(x); - if (x != NULL) DISPATCH(); - break; + TARGET(BINARY_LSHIFT) { + PyObject *right = POP(); + PyObject *left = TOP(); + PyObject *res = PyNumber_Lshift(left, right); + Py_DECREF(left); + Py_DECREF(right); + SET_TOP(res); + if (res == NULL) + goto error; + DISPATCH(); + } - TARGET(BINARY_XOR) - w = POP(); - v = TOP(); - x = PyNumber_Xor(v, w); - Py_DECREF(v); - Py_DECREF(w); - SET_TOP(x); - if (x != NULL) DISPATCH(); - break; + TARGET(BINARY_RSHIFT) { + PyObject *right = POP(); + PyObject *left = TOP(); + PyObject *res = PyNumber_Rshift(left, right); + Py_DECREF(left); + Py_DECREF(right); + SET_TOP(res); + if (res == NULL) + goto error; + DISPATCH(); + } - TARGET(BINARY_OR) - w = POP(); - v = TOP(); - x = PyNumber_Or(v, w); - Py_DECREF(v); - Py_DECREF(w); - SET_TOP(x); - if (x != NULL) DISPATCH(); - break; + TARGET(BINARY_AND) { + PyObject *right = POP(); + PyObject *left = TOP(); + PyObject *res = PyNumber_And(left, right); + Py_DECREF(left); + Py_DECREF(right); + SET_TOP(res); + if (res == NULL) + goto error; + DISPATCH(); + } - TARGET(LIST_APPEND) - w = POP(); - v = PEEK(oparg); - err = PyList_Append(v, w); - Py_DECREF(w); - if (err == 0) { - PREDICT(JUMP_ABSOLUTE); - DISPATCH(); - } - break; + TARGET(BINARY_XOR) { + PyObject *right = POP(); + PyObject *left = TOP(); + PyObject *res = PyNumber_Xor(left, right); + Py_DECREF(left); + Py_DECREF(right); + SET_TOP(res); + if (res == NULL) + goto error; + DISPATCH(); + } - TARGET(SET_ADD) - w = POP(); - v = stack_pointer[-oparg]; - err = PySet_Add(v, w); - Py_DECREF(w); - if (err == 0) { - PREDICT(JUMP_ABSOLUTE); - DISPATCH(); - } - break; + TARGET(BINARY_OR) { + PyObject *right = POP(); + PyObject *left = TOP(); + PyObject *res = PyNumber_Or(left, right); + Py_DECREF(left); + Py_DECREF(right); + SET_TOP(res); + if (res == NULL) + goto error; + DISPATCH(); + } - TARGET(INPLACE_POWER) - w = POP(); - v = TOP(); - x = PyNumber_InPlacePower(v, w, Py_None); + TARGET(LIST_APPEND) { + PyObject *v = POP(); + PyObject *list = PEEK(oparg); + int err; + err = PyList_Append(list, v); Py_DECREF(v); - Py_DECREF(w); - SET_TOP(x); - if (x != NULL) DISPATCH(); - break; + if (err != 0) + goto error; + PREDICT(JUMP_ABSOLUTE); + DISPATCH(); + } - TARGET(INPLACE_MULTIPLY) - w = POP(); - v = TOP(); - x = PyNumber_InPlaceMultiply(v, w); + TARGET(SET_ADD) { + PyObject *v = POP(); + PyObject *set = stack_pointer[-oparg]; + int err; + err = PySet_Add(set, v); Py_DECREF(v); - Py_DECREF(w); - SET_TOP(x); - if (x != NULL) DISPATCH(); - break; + if (err != 0) + goto error; + PREDICT(JUMP_ABSOLUTE); + DISPATCH(); + } - TARGET(INPLACE_TRUE_DIVIDE) - w = POP(); - v = TOP(); - x = PyNumber_InPlaceTrueDivide(v, w); - Py_DECREF(v); - Py_DECREF(w); - SET_TOP(x); - if (x != NULL) DISPATCH(); - break; + TARGET(INPLACE_POWER) { + PyObject *exp = POP(); + PyObject *base = TOP(); + PyObject *res = PyNumber_InPlacePower(base, exp, Py_None); + Py_DECREF(base); + Py_DECREF(exp); + SET_TOP(res); + if (res == NULL) + goto error; + DISPATCH(); + } - TARGET(INPLACE_FLOOR_DIVIDE) - w = POP(); - v = TOP(); - x = PyNumber_InPlaceFloorDivide(v, w); - Py_DECREF(v); - Py_DECREF(w); - SET_TOP(x); - if (x != NULL) DISPATCH(); - break; + TARGET(INPLACE_MULTIPLY) { + PyObject *right = POP(); + PyObject *left = TOP(); + PyObject *res = PyNumber_InPlaceMultiply(left, right); + Py_DECREF(left); + Py_DECREF(right); + SET_TOP(res); + if (res == NULL) + goto error; + DISPATCH(); + } - TARGET(INPLACE_MODULO) - w = POP(); - v = TOP(); - x = PyNumber_InPlaceRemainder(v, w); - Py_DECREF(v); - Py_DECREF(w); - SET_TOP(x); - if (x != NULL) DISPATCH(); - break; + TARGET(INPLACE_TRUE_DIVIDE) { + PyObject *divisor = POP(); + PyObject *dividend = TOP(); + PyObject *quotient = PyNumber_InPlaceTrueDivide(dividend, divisor); + Py_DECREF(dividend); + Py_DECREF(divisor); + SET_TOP(quotient); + if (quotient == NULL) + goto error; + DISPATCH(); + } + + TARGET(INPLACE_FLOOR_DIVIDE) { + PyObject *divisor = POP(); + PyObject *dividend = TOP(); + PyObject *quotient = PyNumber_InPlaceFloorDivide(dividend, divisor); + Py_DECREF(dividend); + Py_DECREF(divisor); + SET_TOP(quotient); + if (quotient == NULL) + goto error; + DISPATCH(); + } - TARGET(INPLACE_ADD) - w = POP(); - v = TOP(); - if (PyUnicode_CheckExact(v) && - PyUnicode_CheckExact(w)) { - x = unicode_concatenate(v, w, f, next_instr); + TARGET(INPLACE_MODULO) { + PyObject *right = POP(); + PyObject *left = TOP(); + PyObject *mod = PyNumber_InPlaceRemainder(left, right); + Py_DECREF(left); + Py_DECREF(right); + SET_TOP(mod); + if (mod == NULL) + goto error; + DISPATCH(); + } + + TARGET(INPLACE_ADD) { + PyObject *right = POP(); + PyObject *left = TOP(); + PyObject *sum; + if (PyUnicode_CheckExact(left) && PyUnicode_CheckExact(right)) { + sum = unicode_concatenate(left, right, f, next_instr); /* unicode_concatenate consumed the ref to v */ - goto skip_decref_v; } else { - x = PyNumber_InPlaceAdd(v, w); + sum = PyNumber_InPlaceAdd(left, right); + Py_DECREF(left); } - Py_DECREF(v); - skip_decref_v: - Py_DECREF(w); - SET_TOP(x); - if (x != NULL) DISPATCH(); - break; + Py_DECREF(right); + SET_TOP(sum); + if (sum == NULL) + goto error; + DISPATCH(); + } - TARGET(INPLACE_SUBTRACT) - w = POP(); - v = TOP(); - x = PyNumber_InPlaceSubtract(v, w); - Py_DECREF(v); - Py_DECREF(w); - SET_TOP(x); - if (x != NULL) DISPATCH(); - break; + TARGET(INPLACE_SUBTRACT) { + PyObject *right = POP(); + PyObject *left = TOP(); + PyObject *diff = PyNumber_InPlaceSubtract(left, right); + Py_DECREF(left); + Py_DECREF(right); + SET_TOP(diff); + if (diff == NULL) + goto error; + DISPATCH(); + } - TARGET(INPLACE_LSHIFT) - w = POP(); - v = TOP(); - x = PyNumber_InPlaceLshift(v, w); - Py_DECREF(v); - Py_DECREF(w); - SET_TOP(x); - if (x != NULL) DISPATCH(); - break; + TARGET(INPLACE_LSHIFT) { + PyObject *right = POP(); + PyObject *left = TOP(); + PyObject *res = PyNumber_InPlaceLshift(left, right); + Py_DECREF(left); + Py_DECREF(right); + SET_TOP(res); + if (res == NULL) + goto error; + DISPATCH(); + } - TARGET(INPLACE_RSHIFT) - w = POP(); - v = TOP(); - x = PyNumber_InPlaceRshift(v, w); - Py_DECREF(v); - Py_DECREF(w); - SET_TOP(x); - if (x != NULL) DISPATCH(); - break; + TARGET(INPLACE_RSHIFT) { + PyObject *right = POP(); + PyObject *left = TOP(); + PyObject *res = PyNumber_InPlaceRshift(left, right); + Py_DECREF(left); + Py_DECREF(right); + SET_TOP(res); + if (res == NULL) + goto error; + DISPATCH(); + } - TARGET(INPLACE_AND) - w = POP(); - v = TOP(); - x = PyNumber_InPlaceAnd(v, w); - Py_DECREF(v); - Py_DECREF(w); - SET_TOP(x); - if (x != NULL) DISPATCH(); - break; + TARGET(INPLACE_AND) { + PyObject *right = POP(); + PyObject *left = TOP(); + PyObject *res = PyNumber_InPlaceAnd(left, right); + Py_DECREF(left); + Py_DECREF(right); + SET_TOP(res); + if (res == NULL) + goto error; + DISPATCH(); + } - TARGET(INPLACE_XOR) - w = POP(); - v = TOP(); - x = PyNumber_InPlaceXor(v, w); - Py_DECREF(v); - Py_DECREF(w); - SET_TOP(x); - if (x != NULL) DISPATCH(); - break; + TARGET(INPLACE_XOR) { + PyObject *right = POP(); + PyObject *left = TOP(); + PyObject *res = PyNumber_InPlaceXor(left, right); + Py_DECREF(left); + Py_DECREF(right); + SET_TOP(res); + if (res == NULL) + goto error; + DISPATCH(); + } - TARGET(INPLACE_OR) - w = POP(); - v = TOP(); - x = PyNumber_InPlaceOr(v, w); - Py_DECREF(v); - Py_DECREF(w); - SET_TOP(x); - if (x != NULL) DISPATCH(); - break; + TARGET(INPLACE_OR) { + PyObject *right = POP(); + PyObject *left = TOP(); + PyObject *res = PyNumber_InPlaceOr(left, right); + Py_DECREF(left); + Py_DECREF(right); + SET_TOP(res); + if (res == NULL) + goto error; + DISPATCH(); + } - TARGET(STORE_SUBSCR) - w = TOP(); - v = SECOND(); - u = THIRD(); + TARGET(STORE_SUBSCR) { + PyObject *sub = TOP(); + PyObject *container = SECOND(); + PyObject *v = THIRD(); + int err; STACKADJ(-3); /* v[w] = u */ - err = PyObject_SetItem(v, w, u); - Py_DECREF(u); + err = PyObject_SetItem(container, sub, v); Py_DECREF(v); - Py_DECREF(w); - if (err == 0) DISPATCH(); - break; + Py_DECREF(container); + Py_DECREF(sub); + if (err != 0) + goto error; + DISPATCH(); + } - TARGET(DELETE_SUBSCR) - w = TOP(); - v = SECOND(); + TARGET(DELETE_SUBSCR) { + PyObject *sub = TOP(); + PyObject *container = SECOND(); + int err; STACKADJ(-2); /* del v[w] */ - err = PyObject_DelItem(v, w); - Py_DECREF(v); - Py_DECREF(w); - if (err == 0) DISPATCH(); - break; + err = PyObject_DelItem(container, sub); + Py_DECREF(container); + Py_DECREF(sub); + if (err != 0) + goto error; + DISPATCH(); + } - TARGET(PRINT_EXPR) - v = POP(); - w = PySys_GetObject("displayhook"); - if (w == NULL) { + TARGET(PRINT_EXPR) { + _Py_IDENTIFIER(displayhook); + PyObject *value = POP(); + PyObject *hook = _PySys_GetObjectId(&PyId_displayhook); + PyObject *res; + if (hook == NULL) { PyErr_SetString(PyExc_RuntimeError, "lost sys.displayhook"); - err = -1; - x = NULL; - } - if (err == 0) { - x = PyTuple_Pack(1, v); - if (x == NULL) - err = -1; - } - if (err == 0) { - w = PyEval_CallObject(w, x); - Py_XDECREF(w); - if (w == NULL) - err = -1; + Py_DECREF(value); + goto error; } - Py_DECREF(v); - Py_XDECREF(x); - break; + res = PyObject_CallFunctionObjArgs(hook, value, NULL); + Py_DECREF(value); + if (res == NULL) + goto error; + Py_DECREF(res); + DISPATCH(); + } #ifdef CASE_TOO_BIG default: switch (opcode) { #endif - TARGET(RAISE_VARARGS) - v = w = NULL; + TARGET(RAISE_VARARGS) { + PyObject *cause = NULL, *exc = NULL; switch (oparg) { case 2: - v = POP(); /* cause */ + cause = POP(); /* cause */ case 1: - w = POP(); /* exc */ + exc = POP(); /* exc */ case 0: /* Fallthrough */ - why = do_raise(w, v); + if (do_raise(exc, cause)) { + why = WHY_EXCEPTION; + goto fast_block_end; + } break; default: PyErr_SetString(PyExc_SystemError, "bad RAISE_VARARGS oparg"); - why = WHY_EXCEPTION; break; } - break; - - TARGET(STORE_LOCALS) - x = POP(); - v = f->f_locals; - Py_XDECREF(v); - f->f_locals = x; - DISPATCH(); + goto error; + } - TARGET(RETURN_VALUE) + TARGET(RETURN_VALUE) { retval = POP(); why = WHY_RETURN; goto fast_block_end; + } - TARGET(YIELD_FROM) - u = POP(); - x = TOP(); - /* send u to x */ - if (PyGen_CheckExact(x)) { - retval = _PyGen_Send((PyGenObject *)x, u); + TARGET(YIELD_FROM) { + PyObject *v = POP(); + PyObject *reciever = TOP(); + int err; + if (PyGen_CheckExact(reciever)) { + retval = _PyGen_Send((PyGenObject *)reciever, v); } else { _Py_IDENTIFIER(send); - if (u == Py_None) - retval = Py_TYPE(x)->tp_iternext(x); + if (v == Py_None) + retval = Py_TYPE(reciever)->tp_iternext(reciever); else - retval = _PyObject_CallMethodId(x, &PyId_send, "O", u); + retval = _PyObject_CallMethodIdObjArgs(reciever, &PyId_send, v, NULL); } - Py_DECREF(u); - if (!retval) { + Py_DECREF(v); + if (retval == NULL) { PyObject *val; - x = POP(); /* Remove iter from stack */ - Py_DECREF(x); + if (tstate->c_tracefunc != NULL + && PyErr_ExceptionMatches(PyExc_StopIteration)) + call_exc_trace(tstate->c_tracefunc, tstate->c_traceobj, tstate, f); err = _PyGen_FetchStopIterationValue(&val); - if (err < 0) { - x = NULL; - break; - } - x = val; - PUSH(x); - continue; + if (err < 0) + goto error; + Py_DECREF(reciever); + SET_TOP(val); + DISPATCH(); } /* x remains on stack, retval is value to be yielded */ f->f_stacktop = stack_pointer; @@ -1867,39 +1932,38 @@ PyEval_EvalFrameEx(PyFrameObject *f, int throwflag) /* and repeat... */ f->f_lasti--; goto fast_yield; + } - TARGET(YIELD_VALUE) + TARGET(YIELD_VALUE) { retval = POP(); f->f_stacktop = stack_pointer; why = WHY_YIELD; goto fast_yield; + } - TARGET(POP_EXCEPT) - { - PyTryBlock *b = PyFrame_BlockPop(f); - if (b->b_type != EXCEPT_HANDLER) { - PyErr_SetString(PyExc_SystemError, - "popped block is not an except handler"); - why = WHY_EXCEPTION; - break; - } - UNWIND_EXCEPT_HANDLER(b); + TARGET(POP_EXCEPT) { + PyTryBlock *b = PyFrame_BlockPop(f); + if (b->b_type != EXCEPT_HANDLER) { + PyErr_SetString(PyExc_SystemError, + "popped block is not an except handler"); + goto error; } + UNWIND_EXCEPT_HANDLER(b); DISPATCH(); + } - TARGET(POP_BLOCK) - { - PyTryBlock *b = PyFrame_BlockPop(f); - UNWIND_BLOCK(b); - } + TARGET(POP_BLOCK) { + PyTryBlock *b = PyFrame_BlockPop(f); + UNWIND_BLOCK(b); DISPATCH(); + } PREDICTED(END_FINALLY); - TARGET(END_FINALLY) - v = POP(); - if (PyLong_Check(v)) { - why = (enum why_code) PyLong_AS_LONG(v); - assert(why != WHY_YIELD); + TARGET(END_FINALLY) { + PyObject *status = POP(); + if (PyLong_Check(status)) { + why = (enum why_code) PyLong_AS_LONG(status); + assert(why != WHY_YIELD && why != WHY_EXCEPTION); if (why == WHY_RETURN || why == WHY_CONTINUE) retval = POP(); @@ -1912,248 +1976,280 @@ PyEval_EvalFrameEx(PyFrameObject *f, int throwflag) assert(b->b_type == EXCEPT_HANDLER); UNWIND_EXCEPT_HANDLER(b); why = WHY_NOT; + Py_DECREF(status); + DISPATCH(); } + Py_DECREF(status); + goto fast_block_end; } - else if (PyExceptionClass_Check(v)) { - w = POP(); - u = POP(); - PyErr_Restore(v, w, u); - why = WHY_RERAISE; - break; + else if (PyExceptionClass_Check(status)) { + PyObject *exc = POP(); + PyObject *tb = POP(); + PyErr_Restore(status, exc, tb); + why = WHY_EXCEPTION; + goto fast_block_end; } - else if (v != Py_None) { + else if (status != Py_None) { PyErr_SetString(PyExc_SystemError, "'finally' pops bad exception"); - why = WHY_EXCEPTION; + Py_DECREF(status); + goto error; } - Py_DECREF(v); - break; + Py_DECREF(status); + DISPATCH(); + } - TARGET(LOAD_BUILD_CLASS) - { + TARGET(LOAD_BUILD_CLASS) { _Py_IDENTIFIER(__build_class__); + PyObject *bc; if (PyDict_CheckExact(f->f_builtins)) { - x = _PyDict_GetItemId(f->f_builtins, &PyId___build_class__); - if (x == NULL) { + bc = _PyDict_GetItemId(f->f_builtins, &PyId___build_class__); + if (bc == NULL) { PyErr_SetString(PyExc_NameError, "__build_class__ not found"); - break; + goto error; } - Py_INCREF(x); + Py_INCREF(bc); } else { PyObject *build_class_str = _PyUnicode_FromId(&PyId___build_class__); if (build_class_str == NULL) break; - x = PyObject_GetItem(f->f_builtins, build_class_str); - if (x == NULL) { + bc = PyObject_GetItem(f->f_builtins, build_class_str); + if (bc == NULL) { if (PyErr_ExceptionMatches(PyExc_KeyError)) PyErr_SetString(PyExc_NameError, "__build_class__ not found"); - break; + goto error; } } - PUSH(x); - break; + PUSH(bc); + DISPATCH(); } - TARGET(STORE_NAME) - w = GETITEM(names, oparg); - v = POP(); - if ((x = f->f_locals) != NULL) { - if (PyDict_CheckExact(x)) - err = PyDict_SetItem(x, w, v); - else - err = PyObject_SetItem(x, w, v); + TARGET(STORE_NAME) { + PyObject *name = GETITEM(names, oparg); + PyObject *v = POP(); + PyObject *ns = f->f_locals; + int err; + if (ns == NULL) { + PyErr_Format(PyExc_SystemError, + "no locals found when storing %R", name); Py_DECREF(v); - if (err == 0) DISPATCH(); - break; + goto error; } - PyErr_Format(PyExc_SystemError, - "no locals found when storing %R", w); - break; + if (PyDict_CheckExact(ns)) + err = PyDict_SetItem(ns, name, v); + else + err = PyObject_SetItem(ns, name, v); + Py_DECREF(v); + if (err != 0) + goto error; + DISPATCH(); + } - TARGET(DELETE_NAME) - w = GETITEM(names, oparg); - if ((x = f->f_locals) != NULL) { - if ((err = PyObject_DelItem(x, w)) != 0) - format_exc_check_arg(PyExc_NameError, - NAME_ERROR_MSG, - w); - break; + TARGET(DELETE_NAME) { + PyObject *name = GETITEM(names, oparg); + PyObject *ns = f->f_locals; + int err; + if (ns == NULL) { + PyErr_Format(PyExc_SystemError, + "no locals when deleting %R", name); + goto error; } - PyErr_Format(PyExc_SystemError, - "no locals when deleting %R", w); - break; + err = PyObject_DelItem(ns, name); + if (err != 0) { + format_exc_check_arg(PyExc_NameError, + NAME_ERROR_MSG, + name); + goto error; + } + DISPATCH(); + } PREDICTED_WITH_ARG(UNPACK_SEQUENCE); - TARGET(UNPACK_SEQUENCE) - v = POP(); - if (PyTuple_CheckExact(v) && - PyTuple_GET_SIZE(v) == oparg) { - PyObject **items = \ - ((PyTupleObject *)v)->ob_item; + TARGET(UNPACK_SEQUENCE) { + PyObject *seq = POP(), *item, **items; + if (PyTuple_CheckExact(seq) && + PyTuple_GET_SIZE(seq) == oparg) { + items = ((PyTupleObject *)seq)->ob_item; while (oparg--) { - w = items[oparg]; - Py_INCREF(w); - PUSH(w); + item = items[oparg]; + Py_INCREF(item); + PUSH(item); } - Py_DECREF(v); - DISPATCH(); - } else if (PyList_CheckExact(v) && - PyList_GET_SIZE(v) == oparg) { - PyObject **items = \ - ((PyListObject *)v)->ob_item; + } else if (PyList_CheckExact(seq) && + PyList_GET_SIZE(seq) == oparg) { + items = ((PyListObject *)seq)->ob_item; while (oparg--) { - w = items[oparg]; - Py_INCREF(w); - PUSH(w); + item = items[oparg]; + Py_INCREF(item); + PUSH(item); } - } else if (unpack_iterable(v, oparg, -1, + } else if (unpack_iterable(seq, oparg, -1, stack_pointer + oparg)) { STACKADJ(oparg); } else { /* unpack_iterable() raised an exception */ - why = WHY_EXCEPTION; + Py_DECREF(seq); + goto error; } - Py_DECREF(v); - break; + Py_DECREF(seq); + DISPATCH(); + } - TARGET(UNPACK_EX) - { + TARGET(UNPACK_EX) { int totalargs = 1 + (oparg & 0xFF) + (oparg >> 8); - v = POP(); + PyObject *seq = POP(); - if (unpack_iterable(v, oparg & 0xFF, oparg >> 8, + if (unpack_iterable(seq, oparg & 0xFF, oparg >> 8, stack_pointer + totalargs)) { stack_pointer += totalargs; } else { - why = WHY_EXCEPTION; + Py_DECREF(seq); + goto error; } - Py_DECREF(v); - break; + Py_DECREF(seq); + DISPATCH(); } - TARGET(STORE_ATTR) - w = GETITEM(names, oparg); - v = TOP(); - u = SECOND(); + TARGET(STORE_ATTR) { + PyObject *name = GETITEM(names, oparg); + PyObject *owner = TOP(); + PyObject *v = SECOND(); + int err; STACKADJ(-2); - err = PyObject_SetAttr(v, w, u); /* v.w = u */ + err = PyObject_SetAttr(owner, name, v); Py_DECREF(v); - Py_DECREF(u); - if (err == 0) DISPATCH(); - break; + Py_DECREF(owner); + if (err != 0) + goto error; + DISPATCH(); + } - TARGET(DELETE_ATTR) - w = GETITEM(names, oparg); - v = POP(); - err = PyObject_SetAttr(v, w, (PyObject *)NULL); - /* del v.w */ - Py_DECREF(v); - break; + TARGET(DELETE_ATTR) { + PyObject *name = GETITEM(names, oparg); + PyObject *owner = POP(); + int err; + err = PyObject_SetAttr(owner, name, (PyObject *)NULL); + Py_DECREF(owner); + if (err != 0) + goto error; + DISPATCH(); + } - TARGET(STORE_GLOBAL) - w = GETITEM(names, oparg); - v = POP(); - err = PyDict_SetItem(f->f_globals, w, v); + TARGET(STORE_GLOBAL) { + PyObject *name = GETITEM(names, oparg); + PyObject *v = POP(); + int err; + err = PyDict_SetItem(f->f_globals, name, v); Py_DECREF(v); - if (err == 0) DISPATCH(); - break; + if (err != 0) + goto error; + DISPATCH(); + } - TARGET(DELETE_GLOBAL) - w = GETITEM(names, oparg); - if ((err = PyDict_DelItem(f->f_globals, w)) != 0) + TARGET(DELETE_GLOBAL) { + PyObject *name = GETITEM(names, oparg); + int err; + err = PyDict_DelItem(f->f_globals, name); + if (err != 0) { format_exc_check_arg( - PyExc_NameError, GLOBAL_NAME_ERROR_MSG, w); - break; + PyExc_NameError, NAME_ERROR_MSG, name); + goto error; + } + DISPATCH(); + } - TARGET(LOAD_NAME) - w = GETITEM(names, oparg); - if ((v = f->f_locals) == NULL) { + TARGET(LOAD_NAME) { + PyObject *name = GETITEM(names, oparg); + PyObject *locals = f->f_locals; + PyObject *v; + if (locals == NULL) { PyErr_Format(PyExc_SystemError, - "no locals when loading %R", w); - why = WHY_EXCEPTION; - break; + "no locals when loading %R", name); + goto error; } - if (PyDict_CheckExact(v)) { - x = PyDict_GetItem(v, w); - Py_XINCREF(x); + if (PyDict_CheckExact(locals)) { + v = PyDict_GetItem(locals, name); + Py_XINCREF(v); } else { - x = PyObject_GetItem(v, w); - if (x == NULL && _PyErr_OCCURRED()) { - if (!PyErr_ExceptionMatches( - PyExc_KeyError)) - break; + v = PyObject_GetItem(locals, name); + if (v == NULL && _PyErr_OCCURRED()) { + if (!PyErr_ExceptionMatches(PyExc_KeyError)) + goto error; PyErr_Clear(); } } - if (x == NULL) { - x = PyDict_GetItem(f->f_globals, w); - Py_XINCREF(x); - if (x == NULL) { + if (v == NULL) { + v = PyDict_GetItem(f->f_globals, name); + Py_XINCREF(v); + if (v == NULL) { if (PyDict_CheckExact(f->f_builtins)) { - x = PyDict_GetItem(f->f_builtins, w); - if (x == NULL) { + v = PyDict_GetItem(f->f_builtins, name); + if (v == NULL) { format_exc_check_arg( PyExc_NameError, - NAME_ERROR_MSG, w); - break; + NAME_ERROR_MSG, name); + goto error; } - Py_INCREF(x); + Py_INCREF(v); } else { - x = PyObject_GetItem(f->f_builtins, w); - if (x == NULL) { + v = PyObject_GetItem(f->f_builtins, name); + if (v == NULL) { if (PyErr_ExceptionMatches(PyExc_KeyError)) format_exc_check_arg( PyExc_NameError, - NAME_ERROR_MSG, w); - break; + NAME_ERROR_MSG, name); + goto error; } } } } - PUSH(x); + PUSH(v); DISPATCH(); + } - TARGET(LOAD_GLOBAL) - w = GETITEM(names, oparg); + TARGET(LOAD_GLOBAL) { + PyObject *name = GETITEM(names, oparg); + PyObject *v; if (PyDict_CheckExact(f->f_globals) && PyDict_CheckExact(f->f_builtins)) { - x = _PyDict_LoadGlobal((PyDictObject *)f->f_globals, + v = _PyDict_LoadGlobal((PyDictObject *)f->f_globals, (PyDictObject *)f->f_builtins, - w); - if (x == NULL) { + name); + if (v == NULL) { if (!_PyErr_OCCURRED()) format_exc_check_arg(PyExc_NameError, - GLOBAL_NAME_ERROR_MSG, w); - break; + NAME_ERROR_MSG, name); + goto error; } - Py_INCREF(x); + Py_INCREF(v); } else { /* Slow-path if globals or builtins is not a dict */ - x = PyObject_GetItem(f->f_globals, w); - if (x == NULL) { - x = PyObject_GetItem(f->f_builtins, w); - if (x == NULL) { + v = PyObject_GetItem(f->f_globals, name); + if (v == NULL) { + v = PyObject_GetItem(f->f_builtins, name); + if (v == NULL) { if (PyErr_ExceptionMatches(PyExc_KeyError)) format_exc_check_arg( PyExc_NameError, - GLOBAL_NAME_ERROR_MSG, w); - break; + NAME_ERROR_MSG, name); + goto error; } } } - PUSH(x); + PUSH(v); DISPATCH(); + } - TARGET(DELETE_FAST) - x = GETLOCAL(oparg); - if (x != NULL) { + TARGET(DELETE_FAST) { + PyObject *v = GETLOCAL(oparg); + if (v != NULL) { SETLOCAL(oparg, NULL); DISPATCH(); } @@ -2162,252 +2258,312 @@ PyEval_EvalFrameEx(PyFrameObject *f, int throwflag) UNBOUNDLOCAL_ERROR_MSG, PyTuple_GetItem(co->co_varnames, oparg) ); - break; + goto error; + } - TARGET(DELETE_DEREF) - x = freevars[oparg]; - if (PyCell_GET(x) != NULL) { - PyCell_Set(x, NULL); + TARGET(DELETE_DEREF) { + PyObject *cell = freevars[oparg]; + if (PyCell_GET(cell) != NULL) { + PyCell_Set(cell, NULL); DISPATCH(); } - err = -1; format_exc_unbound(co, oparg); - break; + goto error; + } - TARGET(LOAD_CLOSURE) - x = freevars[oparg]; - Py_INCREF(x); - PUSH(x); - if (x != NULL) DISPATCH(); - break; + TARGET(LOAD_CLOSURE) { + PyObject *cell = freevars[oparg]; + Py_INCREF(cell); + PUSH(cell); + DISPATCH(); + } - TARGET(LOAD_DEREF) - x = freevars[oparg]; - w = PyCell_Get(x); - if (w != NULL) { - PUSH(w); - DISPATCH(); + TARGET(LOAD_CLASSDEREF) { + PyObject *name, *value, *locals = f->f_locals; + Py_ssize_t idx; + assert(locals); + assert(oparg >= PyTuple_GET_SIZE(co->co_cellvars)); + idx = oparg - PyTuple_GET_SIZE(co->co_cellvars); + assert(idx >= 0 && idx < PyTuple_GET_SIZE(co->co_freevars)); + name = PyTuple_GET_ITEM(co->co_freevars, idx); + if (PyDict_CheckExact(locals)) { + value = PyDict_GetItem(locals, name); + Py_XINCREF(value); } - err = -1; - format_exc_unbound(co, oparg); - break; + else { + value = PyObject_GetItem(locals, name); + if (value == NULL && PyErr_Occurred()) { + if (!PyErr_ExceptionMatches(PyExc_KeyError)) + goto error; + PyErr_Clear(); + } + } + if (!value) { + PyObject *cell = freevars[oparg]; + value = PyCell_GET(cell); + if (value == NULL) { + format_exc_unbound(co, oparg); + goto error; + } + Py_INCREF(value); + } + PUSH(value); + DISPATCH(); + } - TARGET(STORE_DEREF) - w = POP(); - x = freevars[oparg]; - PyCell_Set(x, w); - Py_DECREF(w); + TARGET(LOAD_DEREF) { + PyObject *cell = freevars[oparg]; + PyObject *value = PyCell_GET(cell); + if (value == NULL) { + format_exc_unbound(co, oparg); + goto error; + } + Py_INCREF(value); + PUSH(value); DISPATCH(); + } - TARGET(BUILD_TUPLE) - x = PyTuple_New(oparg); - if (x != NULL) { - for (; --oparg >= 0;) { - w = POP(); - PyTuple_SET_ITEM(x, oparg, w); - } - PUSH(x); - DISPATCH(); + TARGET(STORE_DEREF) { + PyObject *v = POP(); + PyObject *cell = freevars[oparg]; + PyCell_Set(cell, v); + Py_DECREF(v); + DISPATCH(); + } + + TARGET(BUILD_TUPLE) { + PyObject *tup = PyTuple_New(oparg); + if (tup == NULL) + goto error; + while (--oparg >= 0) { + PyObject *item = POP(); + PyTuple_SET_ITEM(tup, oparg, item); } - break; + PUSH(tup); + DISPATCH(); + } - TARGET(BUILD_LIST) - x = PyList_New(oparg); - if (x != NULL) { - for (; --oparg >= 0;) { - w = POP(); - PyList_SET_ITEM(x, oparg, w); - } - PUSH(x); - DISPATCH(); + TARGET(BUILD_LIST) { + PyObject *list = PyList_New(oparg); + if (list == NULL) + goto error; + while (--oparg >= 0) { + PyObject *item = POP(); + PyList_SET_ITEM(list, oparg, item); } - break; + PUSH(list); + DISPATCH(); + } - TARGET(BUILD_SET) - x = PySet_New(NULL); - if (x != NULL) { - for (; --oparg >= 0;) { - w = POP(); - if (err == 0) - err = PySet_Add(x, w); - Py_DECREF(w); - } - if (err != 0) { - Py_DECREF(x); - break; - } - PUSH(x); - DISPATCH(); + TARGET(BUILD_SET) { + PyObject *set = PySet_New(NULL); + int err = 0; + if (set == NULL) + goto error; + while (--oparg >= 0) { + PyObject *item = POP(); + if (err == 0) + err = PySet_Add(set, item); + Py_DECREF(item); } - break; + if (err != 0) { + Py_DECREF(set); + goto error; + } + PUSH(set); + DISPATCH(); + } - TARGET(BUILD_MAP) - x = _PyDict_NewPresized((Py_ssize_t)oparg); - PUSH(x); - if (x != NULL) DISPATCH(); - break; + TARGET(BUILD_MAP) { + PyObject *map = _PyDict_NewPresized((Py_ssize_t)oparg); + if (map == NULL) + goto error; + PUSH(map); + DISPATCH(); + } - TARGET(STORE_MAP) - w = TOP(); /* key */ - u = SECOND(); /* value */ - v = THIRD(); /* dict */ + TARGET(STORE_MAP) { + PyObject *key = TOP(); + PyObject *value = SECOND(); + PyObject *map = THIRD(); + int err; STACKADJ(-2); - assert (PyDict_CheckExact(v)); - err = PyDict_SetItem(v, w, u); /* v[w] = u */ - Py_DECREF(u); - Py_DECREF(w); - if (err == 0) DISPATCH(); - break; + assert(PyDict_CheckExact(map)); + err = PyDict_SetItem(map, key, value); + Py_DECREF(value); + Py_DECREF(key); + if (err != 0) + goto error; + DISPATCH(); + } - TARGET(MAP_ADD) - w = TOP(); /* key */ - u = SECOND(); /* value */ + TARGET(MAP_ADD) { + PyObject *key = TOP(); + PyObject *value = SECOND(); + PyObject *map; + int err; STACKADJ(-2); - v = stack_pointer[-oparg]; /* dict */ - assert (PyDict_CheckExact(v)); - err = PyDict_SetItem(v, w, u); /* v[w] = u */ - Py_DECREF(u); - Py_DECREF(w); - if (err == 0) { - PREDICT(JUMP_ABSOLUTE); - DISPATCH(); - } - break; + map = stack_pointer[-oparg]; /* dict */ + assert(PyDict_CheckExact(map)); + err = PyDict_SetItem(map, key, value); /* v[w] = u */ + Py_DECREF(value); + Py_DECREF(key); + if (err != 0) + goto error; + PREDICT(JUMP_ABSOLUTE); + DISPATCH(); + } - TARGET(LOAD_ATTR) - w = GETITEM(names, oparg); - v = TOP(); - x = PyObject_GetAttr(v, w); - Py_DECREF(v); - SET_TOP(x); - if (x != NULL) DISPATCH(); - break; + TARGET(LOAD_ATTR) { + PyObject *name = GETITEM(names, oparg); + PyObject *owner = TOP(); + PyObject *res = PyObject_GetAttr(owner, name); + Py_DECREF(owner); + SET_TOP(res); + if (res == NULL) + goto error; + DISPATCH(); + } - TARGET(COMPARE_OP) - w = POP(); - v = TOP(); - x = cmp_outcome(oparg, v, w); - Py_DECREF(v); - Py_DECREF(w); - SET_TOP(x); - if (x == NULL) break; + TARGET(COMPARE_OP) { + PyObject *right = POP(); + PyObject *left = TOP(); + PyObject *res = cmp_outcome(oparg, left, right); + Py_DECREF(left); + Py_DECREF(right); + SET_TOP(res); + if (res == NULL) + goto error; PREDICT(POP_JUMP_IF_FALSE); PREDICT(POP_JUMP_IF_TRUE); DISPATCH(); + } - TARGET(IMPORT_NAME) - { + TARGET(IMPORT_NAME) { _Py_IDENTIFIER(__import__); - w = GETITEM(names, oparg); - x = _PyDict_GetItemId(f->f_builtins, &PyId___import__); - if (x == NULL) { + PyObject *name = GETITEM(names, oparg); + PyObject *func = _PyDict_GetItemId(f->f_builtins, &PyId___import__); + PyObject *from, *level, *args, *res; + if (func == NULL) { PyErr_SetString(PyExc_ImportError, "__import__ not found"); - break; + goto error; } - Py_INCREF(x); - v = POP(); - u = TOP(); - if (PyLong_AsLong(u) != -1 || PyErr_Occurred()) - w = PyTuple_Pack(5, - w, + Py_INCREF(func); + from = POP(); + level = TOP(); + if (PyLong_AsLong(level) != -1 || PyErr_Occurred()) + args = PyTuple_Pack(5, + name, f->f_globals, f->f_locals == NULL ? Py_None : f->f_locals, - v, - u); + from, + level); else - w = PyTuple_Pack(4, - w, + args = PyTuple_Pack(4, + name, f->f_globals, f->f_locals == NULL ? Py_None : f->f_locals, - v); - Py_DECREF(v); - Py_DECREF(u); - if (w == NULL) { - u = POP(); - Py_DECREF(x); - x = NULL; - break; + from); + Py_DECREF(level); + Py_DECREF(from); + if (args == NULL) { + Py_DECREF(func); + STACKADJ(-1); + goto error; } READ_TIMESTAMP(intr0); - v = x; - x = PyEval_CallObject(v, w); - Py_DECREF(v); + res = PyEval_CallObject(func, args); READ_TIMESTAMP(intr1); - Py_DECREF(w); - SET_TOP(x); - if (x != NULL) DISPATCH(); - break; + Py_DECREF(args); + Py_DECREF(func); + SET_TOP(res); + if (res == NULL) + goto error; + DISPATCH(); } - TARGET(IMPORT_STAR) - v = POP(); - PyFrame_FastToLocals(f); - if ((x = f->f_locals) == NULL) { + TARGET(IMPORT_STAR) { + PyObject *from = POP(), *locals; + int err; + if (PyFrame_FastToLocalsWithError(f) < 0) + goto error; + + locals = f->f_locals; + if (locals == NULL) { PyErr_SetString(PyExc_SystemError, "no locals found during 'import *'"); - break; + goto error; } READ_TIMESTAMP(intr0); - err = import_all_from(x, v); + err = import_all_from(locals, from); READ_TIMESTAMP(intr1); PyFrame_LocalsToFast(f, 0); - Py_DECREF(v); - if (err == 0) DISPATCH(); - break; + Py_DECREF(from); + if (err != 0) + goto error; + DISPATCH(); + } - TARGET(IMPORT_FROM) - w = GETITEM(names, oparg); - v = TOP(); + TARGET(IMPORT_FROM) { + PyObject *name = GETITEM(names, oparg); + PyObject *from = TOP(); + PyObject *res; READ_TIMESTAMP(intr0); - x = import_from(v, w); + res = import_from(from, name); READ_TIMESTAMP(intr1); - PUSH(x); - if (x != NULL) DISPATCH(); - break; + PUSH(res); + if (res == NULL) + goto error; + DISPATCH(); + } - TARGET(JUMP_FORWARD) + TARGET(JUMP_FORWARD) { JUMPBY(oparg); FAST_DISPATCH(); + } PREDICTED_WITH_ARG(POP_JUMP_IF_FALSE); - TARGET(POP_JUMP_IF_FALSE) - w = POP(); - if (w == Py_True) { - Py_DECREF(w); + TARGET(POP_JUMP_IF_FALSE) { + PyObject *cond = POP(); + int err; + if (cond == Py_True) { + Py_DECREF(cond); FAST_DISPATCH(); } - if (w == Py_False) { - Py_DECREF(w); + if (cond == Py_False) { + Py_DECREF(cond); JUMPTO(oparg); FAST_DISPATCH(); } - err = PyObject_IsTrue(w); - Py_DECREF(w); + err = PyObject_IsTrue(cond); + Py_DECREF(cond); if (err > 0) err = 0; else if (err == 0) JUMPTO(oparg); else - break; + goto error; DISPATCH(); + } PREDICTED_WITH_ARG(POP_JUMP_IF_TRUE); - TARGET(POP_JUMP_IF_TRUE) - w = POP(); - if (w == Py_False) { - Py_DECREF(w); + TARGET(POP_JUMP_IF_TRUE) { + PyObject *cond = POP(); + int err; + if (cond == Py_False) { + Py_DECREF(cond); FAST_DISPATCH(); } - if (w == Py_True) { - Py_DECREF(w); + if (cond == Py_True) { + Py_DECREF(cond); JUMPTO(oparg); FAST_DISPATCH(); } - err = PyObject_IsTrue(w); - Py_DECREF(w); + err = PyObject_IsTrue(cond); + Py_DECREF(cond); if (err > 0) { err = 0; JUMPTO(oparg); @@ -2415,58 +2571,63 @@ PyEval_EvalFrameEx(PyFrameObject *f, int throwflag) else if (err == 0) ; else - break; + goto error; DISPATCH(); + } - TARGET(JUMP_IF_FALSE_OR_POP) - w = TOP(); - if (w == Py_True) { + TARGET(JUMP_IF_FALSE_OR_POP) { + PyObject *cond = TOP(); + int err; + if (cond == Py_True) { STACKADJ(-1); - Py_DECREF(w); + Py_DECREF(cond); FAST_DISPATCH(); } - if (w == Py_False) { + if (cond == Py_False) { JUMPTO(oparg); FAST_DISPATCH(); } - err = PyObject_IsTrue(w); + err = PyObject_IsTrue(cond); if (err > 0) { STACKADJ(-1); - Py_DECREF(w); + Py_DECREF(cond); err = 0; } else if (err == 0) JUMPTO(oparg); else - break; + goto error; DISPATCH(); + } - TARGET(JUMP_IF_TRUE_OR_POP) - w = TOP(); - if (w == Py_False) { + TARGET(JUMP_IF_TRUE_OR_POP) { + PyObject *cond = TOP(); + int err; + if (cond == Py_False) { STACKADJ(-1); - Py_DECREF(w); + Py_DECREF(cond); FAST_DISPATCH(); } - if (w == Py_True) { + if (cond == Py_True) { JUMPTO(oparg); FAST_DISPATCH(); } - err = PyObject_IsTrue(w); + err = PyObject_IsTrue(cond); if (err > 0) { err = 0; JUMPTO(oparg); } else if (err == 0) { STACKADJ(-1); - Py_DECREF(w); + Py_DECREF(cond); } else - break; + goto error; DISPATCH(); + } PREDICTED_WITH_ARG(JUMP_ABSOLUTE); - TARGET(JUMP_ABSOLUTE) + TARGET(JUMP_ABSOLUTE) { JUMPTO(oparg); #if FAST_LOOPS /* Enabling this path speeds-up all while and for-loops by bypassing @@ -2480,60 +2641,62 @@ PyEval_EvalFrameEx(PyFrameObject *f, int throwflag) #else DISPATCH(); #endif + } - TARGET(GET_ITER) + TARGET(GET_ITER) { /* before: [obj]; after [getiter(obj)] */ - v = TOP(); - x = PyObject_GetIter(v); - Py_DECREF(v); - if (x != NULL) { - SET_TOP(x); - PREDICT(FOR_ITER); - DISPATCH(); - } - STACKADJ(-1); - break; + PyObject *iterable = TOP(); + PyObject *iter = PyObject_GetIter(iterable); + Py_DECREF(iterable); + SET_TOP(iter); + if (iter == NULL) + goto error; + PREDICT(FOR_ITER); + DISPATCH(); + } PREDICTED_WITH_ARG(FOR_ITER); - TARGET(FOR_ITER) + TARGET(FOR_ITER) { /* before: [iter]; after: [iter, iter()] *or* [] */ - v = TOP(); - x = (*v->ob_type->tp_iternext)(v); - if (x != NULL) { - PUSH(x); + PyObject *iter = TOP(); + PyObject *next = (*iter->ob_type->tp_iternext)(iter); + if (next != NULL) { + PUSH(next); PREDICT(STORE_FAST); PREDICT(UNPACK_SEQUENCE); DISPATCH(); } if (PyErr_Occurred()) { - if (!PyErr_ExceptionMatches( - PyExc_StopIteration)) - break; + if (!PyErr_ExceptionMatches(PyExc_StopIteration)) + goto error; + else if (tstate->c_tracefunc != NULL) + call_exc_trace(tstate->c_tracefunc, tstate->c_traceobj, tstate, f); PyErr_Clear(); } /* iterator ended normally */ - x = v = POP(); - Py_DECREF(v); + STACKADJ(-1); + Py_DECREF(iter); JUMPBY(oparg); DISPATCH(); + } - TARGET(BREAK_LOOP) + TARGET(BREAK_LOOP) { why = WHY_BREAK; goto fast_block_end; + } - TARGET(CONTINUE_LOOP) + TARGET(CONTINUE_LOOP) { retval = PyLong_FromLong(oparg); - if (!retval) { - x = NULL; - break; - } + if (retval == NULL) + goto error; why = WHY_CONTINUE; goto fast_block_end; + } TARGET_WITH_IMPL(SETUP_LOOP, _setup_finally) TARGET_WITH_IMPL(SETUP_EXCEPT, _setup_finally) TARGET(SETUP_FINALLY) - _setup_finally: + _setup_finally: { /* NOTE: If you add any new block-setup opcodes that are not try/except/finally handlers, you may need to update the PyGen_NeedsFinalizing() function. @@ -2542,37 +2705,35 @@ PyEval_EvalFrameEx(PyFrameObject *f, int throwflag) PyFrame_BlockSetup(f, opcode, INSTR_OFFSET() + oparg, STACK_LEVEL()); DISPATCH(); + } - TARGET(SETUP_WITH) - { + TARGET(SETUP_WITH) { _Py_IDENTIFIER(__exit__); _Py_IDENTIFIER(__enter__); - w = TOP(); - x = special_lookup(w, &PyId___exit__); - if (!x) - break; - SET_TOP(x); - u = special_lookup(w, &PyId___enter__); - Py_DECREF(w); - if (!u) { - x = NULL; - break; - } - x = PyObject_CallFunctionObjArgs(u, NULL); - Py_DECREF(u); - if (!x) - break; + PyObject *mgr = TOP(); + PyObject *exit = special_lookup(mgr, &PyId___exit__), *enter; + PyObject *res; + if (exit == NULL) + goto error; + SET_TOP(exit); + enter = special_lookup(mgr, &PyId___enter__); + Py_DECREF(mgr); + if (enter == NULL) + goto error; + res = PyObject_CallFunctionObjArgs(enter, NULL); + Py_DECREF(enter); + if (res == NULL) + goto error; /* Setup the finally block before pushing the result of __enter__ on the stack. */ PyFrame_BlockSetup(f, SETUP_FINALLY, INSTR_OFFSET() + oparg, STACK_LEVEL()); - PUSH(x); + PUSH(res); DISPATCH(); } - TARGET(WITH_CLEANUP) - { + TARGET(WITH_CLEANUP) { /* At the top of the stack are 1-6 values indicating how/why we entered the finally clause: - TOP = None @@ -2599,42 +2760,42 @@ PyEval_EvalFrameEx(PyFrameObject *f, int throwflag) */ PyObject *exit_func; - u = TOP(); - if (u == Py_None) { + PyObject *exc = TOP(), *val = Py_None, *tb = Py_None, *res; + int err; + if (exc == Py_None) { (void)POP(); exit_func = TOP(); - SET_TOP(u); - v = w = Py_None; + SET_TOP(exc); } - else if (PyLong_Check(u)) { - (void)POP(); - switch(PyLong_AsLong(u)) { + else if (PyLong_Check(exc)) { + STACKADJ(-1); + switch (PyLong_AsLong(exc)) { case WHY_RETURN: case WHY_CONTINUE: /* Retval in TOP. */ exit_func = SECOND(); SET_SECOND(TOP()); - SET_TOP(u); + SET_TOP(exc); break; default: exit_func = TOP(); - SET_TOP(u); + SET_TOP(exc); break; } - u = v = w = Py_None; + exc = Py_None; } else { - PyObject *tp, *exc, *tb; + PyObject *tp2, *exc2, *tb2; PyTryBlock *block; - v = SECOND(); - w = THIRD(); - tp = FOURTH(); - exc = PEEK(5); - tb = PEEK(6); + val = SECOND(); + tb = THIRD(); + tp2 = FOURTH(); + exc2 = PEEK(5); + tb2 = PEEK(6); exit_func = PEEK(7); - SET_VALUE(7, tb); - SET_VALUE(6, exc); - SET_VALUE(5, tp); + SET_VALUE(7, tb2); + SET_VALUE(6, exc2); + SET_VALUE(5, tp2); /* UNWIND_EXCEPT_HANDLER will pop this off. */ SET_FOURTH(NULL); /* We just shifted the stack down, so we have @@ -2645,56 +2806,53 @@ PyEval_EvalFrameEx(PyFrameObject *f, int throwflag) block->b_level--; } /* XXX Not the fastest way to call it... */ - x = PyObject_CallFunctionObjArgs(exit_func, u, v, w, - NULL); + res = PyObject_CallFunctionObjArgs(exit_func, exc, val, tb, NULL); Py_DECREF(exit_func); - if (x == NULL) - break; /* Go to error exit */ + if (res == NULL) + goto error; - if (u != Py_None) - err = PyObject_IsTrue(x); + if (exc != Py_None) + err = PyObject_IsTrue(res); else err = 0; - Py_DECREF(x); + Py_DECREF(res); if (err < 0) - break; /* Go to error exit */ + goto error; else if (err > 0) { err = 0; /* There was an exception and a True return */ PUSH(PyLong_FromLong((long) WHY_SILENCED)); } PREDICT(END_FINALLY); - break; + DISPATCH(); } - TARGET(CALL_FUNCTION) - { - PyObject **sp; + TARGET(CALL_FUNCTION) { + PyObject **sp, *res; PCALL(PCALL_ALL); sp = stack_pointer; #ifdef WITH_TSC - x = call_function(&sp, oparg, &intr0, &intr1); + res = call_function(&sp, oparg, &intr0, &intr1); #else - x = call_function(&sp, oparg); + res = call_function(&sp, oparg); #endif stack_pointer = sp; - PUSH(x); - if (x != NULL) - DISPATCH(); - break; + PUSH(res); + if (res == NULL) + goto error; + DISPATCH(); } TARGET_WITH_IMPL(CALL_FUNCTION_VAR, _call_function_var_kw) TARGET_WITH_IMPL(CALL_FUNCTION_KW, _call_function_var_kw) TARGET(CALL_FUNCTION_VAR_KW) - _call_function_var_kw: - { + _call_function_var_kw: { int na = oparg & 0xff; int nk = (oparg>>8) & 0xff; int flags = (opcode - CALL_FUNCTION) & 3; int n = na + 2 * nk; - PyObject **pfunc, *func, **sp; + PyObject **pfunc, *func, **sp, *res; PCALL(PCALL_ALL); if (flags & CALL_FLAG_VAR) n++; @@ -2717,137 +2875,156 @@ PyEval_EvalFrameEx(PyFrameObject *f, int throwflag) Py_INCREF(func); sp = stack_pointer; READ_TIMESTAMP(intr0); - x = ext_do_call(func, &sp, flags, na, nk); + res = ext_do_call(func, &sp, flags, na, nk); READ_TIMESTAMP(intr1); stack_pointer = sp; Py_DECREF(func); while (stack_pointer > pfunc) { - w = POP(); - Py_DECREF(w); + PyObject *o = POP(); + Py_DECREF(o); } - PUSH(x); - if (x != NULL) - DISPATCH(); - break; + PUSH(res); + if (res == NULL) + goto error; + DISPATCH(); } TARGET_WITH_IMPL(MAKE_CLOSURE, _make_function) TARGET(MAKE_FUNCTION) - _make_function: - { + _make_function: { int posdefaults = oparg & 0xff; int kwdefaults = (oparg>>8) & 0xff; int num_annotations = (oparg >> 16) & 0x7fff; - w = POP(); /* qualname */ - v = POP(); /* code object */ - x = PyFunction_NewWithQualName(v, f->f_globals, w); - Py_DECREF(v); - Py_DECREF(w); + PyObject *qualname = POP(); /* qualname */ + PyObject *code = POP(); /* code object */ + PyObject *func = PyFunction_NewWithQualName(code, f->f_globals, qualname); + Py_DECREF(code); + Py_DECREF(qualname); + + if (func == NULL) + goto error; - if (x != NULL && opcode == MAKE_CLOSURE) { - v = POP(); - if (PyFunction_SetClosure(x, v) != 0) { + if (opcode == MAKE_CLOSURE) { + PyObject *closure = POP(); + if (PyFunction_SetClosure(func, closure) != 0) { /* Can't happen unless bytecode is corrupt. */ - why = WHY_EXCEPTION; + Py_DECREF(func); + Py_DECREF(closure); + goto error; } - Py_DECREF(v); + Py_DECREF(closure); } - if (x != NULL && num_annotations > 0) { + if (num_annotations > 0) { Py_ssize_t name_ix; - u = POP(); /* names of args with annotations */ - v = PyDict_New(); - if (v == NULL) { - Py_DECREF(x); - x = NULL; - break; + PyObject *names = POP(); /* names of args with annotations */ + PyObject *anns = PyDict_New(); + if (anns == NULL) { + Py_DECREF(func); + goto error; } - name_ix = PyTuple_Size(u); + name_ix = PyTuple_Size(names); assert(num_annotations == name_ix+1); while (name_ix > 0) { + PyObject *name, *value; + int err; --name_ix; - t = PyTuple_GET_ITEM(u, name_ix); - w = POP(); - /* XXX(nnorwitz): check for errors */ - PyDict_SetItem(v, t, w); - Py_DECREF(w); + name = PyTuple_GET_ITEM(names, name_ix); + value = POP(); + err = PyDict_SetItem(anns, name, value); + Py_DECREF(value); + if (err != 0) { + Py_DECREF(anns); + Py_DECREF(func); + goto error; + } } - if (PyFunction_SetAnnotations(x, v) != 0) { + if (PyFunction_SetAnnotations(func, anns) != 0) { /* Can't happen unless PyFunction_SetAnnotations changes. */ - why = WHY_EXCEPTION; + Py_DECREF(anns); + Py_DECREF(func); + goto error; } - Py_DECREF(v); - Py_DECREF(u); + Py_DECREF(anns); + Py_DECREF(names); } /* XXX Maybe this should be a separate opcode? */ - if (x != NULL && posdefaults > 0) { - v = PyTuple_New(posdefaults); - if (v == NULL) { - Py_DECREF(x); - x = NULL; - break; + if (kwdefaults > 0) { + PyObject *defs = PyDict_New(); + if (defs == NULL) { + Py_DECREF(func); + goto error; } - while (--posdefaults >= 0) { - w = POP(); - PyTuple_SET_ITEM(v, posdefaults, w); + while (--kwdefaults >= 0) { + PyObject *v = POP(); /* default value */ + PyObject *key = POP(); /* kw only arg name */ + int err = PyDict_SetItem(defs, key, v); + Py_DECREF(v); + Py_DECREF(key); + if (err != 0) { + Py_DECREF(defs); + Py_DECREF(func); + goto error; + } } - if (PyFunction_SetDefaults(x, v) != 0) { + if (PyFunction_SetKwDefaults(func, defs) != 0) { /* Can't happen unless - PyFunction_SetDefaults changes. */ - why = WHY_EXCEPTION; + PyFunction_SetKwDefaults changes. */ + Py_DECREF(func); + Py_DECREF(defs); + goto error; } - Py_DECREF(v); + Py_DECREF(defs); } - if (x != NULL && kwdefaults > 0) { - v = PyDict_New(); - if (v == NULL) { - Py_DECREF(x); - x = NULL; - break; - } - while (--kwdefaults >= 0) { - w = POP(); /* default value */ - u = POP(); /* kw only arg name */ - /* XXX(nnorwitz): check for errors */ - PyDict_SetItem(v, u, w); - Py_DECREF(w); - Py_DECREF(u); + if (posdefaults > 0) { + PyObject *defs = PyTuple_New(posdefaults); + if (defs == NULL) { + Py_DECREF(func); + goto error; } - if (PyFunction_SetKwDefaults(x, v) != 0) { + while (--posdefaults >= 0) + PyTuple_SET_ITEM(defs, posdefaults, POP()); + if (PyFunction_SetDefaults(func, defs) != 0) { /* Can't happen unless - PyFunction_SetKwDefaults changes. */ - why = WHY_EXCEPTION; + PyFunction_SetDefaults changes. */ + Py_DECREF(defs); + Py_DECREF(func); + goto error; } - Py_DECREF(v); + Py_DECREF(defs); } - PUSH(x); - break; + PUSH(func); + DISPATCH(); } - TARGET(BUILD_SLICE) + TARGET(BUILD_SLICE) { + PyObject *start, *stop, *step, *slice; if (oparg == 3) - w = POP(); + step = POP(); else - w = NULL; - v = POP(); - u = TOP(); - x = PySlice_New(u, v, w); - Py_DECREF(u); - Py_DECREF(v); - Py_XDECREF(w); - SET_TOP(x); - if (x != NULL) DISPATCH(); - break; + step = NULL; + stop = POP(); + start = TOP(); + slice = PySlice_New(start, stop, step); + Py_DECREF(start); + Py_DECREF(stop); + Py_XDECREF(step); + SET_TOP(slice); + if (slice == NULL) + goto error; + DISPATCH(); + } - TARGET(EXTENDED_ARG) + TARGET(EXTENDED_ARG) { opcode = NEXTOP(); oparg = oparg<<16 | NEXTARG(); goto dispatch_opcode; + } #if USE_COMPUTED_GOTOS _unknown_opcode: @@ -2858,8 +3035,7 @@ PyEval_EvalFrameEx(PyFrameObject *f, int throwflag) PyFrame_GetLineNumber(f), opcode); PyErr_SetString(PyExc_SystemError, "unknown opcode"); - why = WHY_EXCEPTION; - break; + goto error; #ifdef CASE_TOO_BIG } @@ -2867,71 +3043,36 @@ PyEval_EvalFrameEx(PyFrameObject *f, int throwflag) } /* switch */ - on_error: + /* This should never be reached. Every opcode should end with DISPATCH() + or goto error. */ + assert(0); +error: READ_TIMESTAMP(inst1); - /* Quickly continue if no error occurred */ - - if (why == WHY_NOT) { - if (err == 0 && x != NULL) { -#ifdef CHECKEXC - /* This check is expensive! */ - if (PyErr_Occurred()) - fprintf(stderr, - "XXX undetected error\n"); - else { -#endif - READ_TIMESTAMP(loop1); - continue; /* Normal, fast path */ -#ifdef CHECKEXC - } -#endif - } - why = WHY_EXCEPTION; - x = Py_None; - err = 0; - } - - /* Double-check exception status */ + assert(why == WHY_NOT); + why = WHY_EXCEPTION; - if (why == WHY_EXCEPTION || why == WHY_RERAISE) { - if (!PyErr_Occurred()) { - PyErr_SetString(PyExc_SystemError, - "error return without exception set"); - why = WHY_EXCEPTION; - } - } -#ifdef CHECKEXC - else { - /* This check is expensive! */ - if (PyErr_Occurred()) { - char buf[128]; - sprintf(buf, "Stack unwind with exception " - "set and why=%d", why); - Py_FatalError(buf); - } - } + /* Double-check exception status. */ +#ifdef NDEBUG + if (!PyErr_Occurred()) + PyErr_SetString(PyExc_SystemError, + "error return without exception set"); +#else + assert(PyErr_Occurred()); #endif - /* Log traceback info if this is a real exception */ + /* Log traceback info. */ + PyTraceBack_Here(f); - if (why == WHY_EXCEPTION) { - PyTraceBack_Here(f); + if (tstate->c_tracefunc != NULL) + call_exc_trace(tstate->c_tracefunc, tstate->c_traceobj, + tstate, f); - if (tstate->c_tracefunc != NULL) - call_exc_trace(tstate->c_tracefunc, - tstate->c_traceobj, f); - } - - /* For the rest, treat WHY_RERAISE as WHY_EXCEPTION */ - - if (why == WHY_RERAISE) - why = WHY_EXCEPTION; +fast_block_end: + assert(why != WHY_NOT); /* Unwind stacks if a (pseudo) exception occurred */ - -fast_block_end: while (why != WHY_NOT && f->f_iblock > 0) { /* Peek at the current block. */ PyTryBlock *b = &f->f_blockstack[f->f_iblock - 1]; @@ -2978,7 +3119,10 @@ fast_block_end: Python main loop. */ PyErr_NormalizeException( &exc, &val, &tb); - PyException_SetTraceback(val, tb); + if (tb != NULL) + PyException_SetTraceback(val, tb); + else + PyException_SetTraceback(val, Py_None); Py_INCREF(exc); tstate->exc_type = exc; Py_INCREF(val); @@ -3010,20 +3154,26 @@ fast_block_end: break; READ_TIMESTAMP(loop1); + assert(!PyErr_Occurred()); + } /* main loop */ assert(why != WHY_YIELD); /* Pop remaining stack entries. */ while (!EMPTY()) { - v = POP(); - Py_XDECREF(v); + PyObject *o = POP(); + Py_XDECREF(o); } if (why != WHY_RETURN) retval = NULL; + assert((retval != NULL && !PyErr_Occurred()) + || (retval == NULL && PyErr_Occurred())); + fast_yield: - if (co->co_flags & CO_GENERATOR && (why == WHY_YIELD || why == WHY_RETURN)) { + if (co->co_flags & CO_GENERATOR) { + /* The purpose of this block is to put aside the generator's exception state and restore that of the calling frame. If the current exception state is from the caller, we clear the exception values @@ -3046,26 +3196,27 @@ fast_yield: if (tstate->use_tracing) { if (tstate->c_tracefunc) { if (why == WHY_RETURN || why == WHY_YIELD) { - if (call_trace(tstate->c_tracefunc, - tstate->c_traceobj, f, + if (call_trace(tstate->c_tracefunc, tstate->c_traceobj, + tstate, f, PyTrace_RETURN, retval)) { Py_CLEAR(retval); why = WHY_EXCEPTION; } } else if (why == WHY_EXCEPTION) { - call_trace_protected(tstate->c_tracefunc, - tstate->c_traceobj, f, + call_trace_protected(tstate->c_tracefunc, tstate->c_traceobj, + tstate, f, PyTrace_RETURN, NULL); } } if (tstate->c_profilefunc) { if (why == WHY_EXCEPTION) call_trace_protected(tstate->c_profilefunc, - tstate->c_profileobj, f, + tstate->c_profileobj, + tstate, f, PyTrace_RETURN, NULL); - else if (call_trace(tstate->c_profilefunc, - tstate->c_profileobj, f, + else if (call_trace(tstate->c_profilefunc, tstate->c_profileobj, + tstate, f, PyTrace_RETURN, retval)) { Py_CLEAR(retval); /* why = WHY_EXCEPTION; */ @@ -3076,6 +3227,7 @@ fast_yield: /* pop frame */ exit_eval_frame: Py_LeaveRecursiveCall(); + f->f_executing = 0; tstate->frame = f->f_back; return retval; @@ -3241,9 +3393,9 @@ PyEval_EvalCodeEx(PyObject *_co, PyObject *globals, PyObject *locals, PyObject **defs, int defcount, PyObject *kwdefs, PyObject *closure) { PyCodeObject* co = (PyCodeObject*)_co; - register PyFrameObject *f; - register PyObject *retval = NULL; - register PyObject **fastlocals, **freevars; + PyFrameObject *f; + PyObject *retval = NULL; + PyObject **fastlocals, **freevars; PyThreadState *tstate = PyThreadState_GET(); PyObject *x, *u; int total_args = co->co_argcount + co->co_kwonlyargcount; @@ -3519,7 +3671,7 @@ restore_and_clear_exc_state(PyThreadState *tstate, PyFrameObject *f) /* Logic for the raise statement (too complicated for inlining). This *consumes* a reference count to each of its arguments. */ -static enum why_code +static int do_raise(PyObject *exc, PyObject *cause) { PyObject *type = NULL, *value = NULL; @@ -3534,13 +3686,13 @@ do_raise(PyObject *exc, PyObject *cause) if (type == Py_None) { PyErr_SetString(PyExc_RuntimeError, "No active exception to reraise"); - return WHY_EXCEPTION; - } + return 0; + } Py_XINCREF(type); Py_XINCREF(value); Py_XINCREF(tb); PyErr_Restore(type, value, tb); - return WHY_RERAISE; + return 1; } /* We support the following forms of raise: @@ -3603,13 +3755,13 @@ do_raise(PyObject *exc, PyObject *cause) /* PyErr_SetObject incref's its arguments */ Py_XDECREF(value); Py_XDECREF(type); - return WHY_EXCEPTION; + return 0; raise_error: Py_XDECREF(value); Py_XDECREF(type); Py_XDECREF(cause); - return WHY_EXCEPTION; + return 0; } /* Iterate v argcnt times and store the results on the stack (via decreasing @@ -3706,40 +3858,43 @@ prtrace(PyObject *v, char *str) #endif static void -call_exc_trace(Py_tracefunc func, PyObject *self, PyFrameObject *f) +call_exc_trace(Py_tracefunc func, PyObject *self, + PyThreadState *tstate, PyFrameObject *f) { - PyObject *type, *value, *traceback, *arg; + PyObject *type, *value, *traceback, *orig_traceback, *arg; int err; - PyErr_Fetch(&type, &value, &traceback); + PyErr_Fetch(&type, &value, &orig_traceback); if (value == NULL) { value = Py_None; Py_INCREF(value); } - PyErr_NormalizeException(&type, &value, &traceback); + PyErr_NormalizeException(&type, &value, &orig_traceback); + traceback = (orig_traceback != NULL) ? orig_traceback : Py_None; arg = PyTuple_Pack(3, type, value, traceback); if (arg == NULL) { - PyErr_Restore(type, value, traceback); + PyErr_Restore(type, value, orig_traceback); return; } - err = call_trace(func, self, f, PyTrace_EXCEPTION, arg); + err = call_trace(func, self, tstate, f, PyTrace_EXCEPTION, arg); Py_DECREF(arg); if (err == 0) - PyErr_Restore(type, value, traceback); + PyErr_Restore(type, value, orig_traceback); else { Py_XDECREF(type); Py_XDECREF(value); - Py_XDECREF(traceback); + Py_XDECREF(orig_traceback); } } static int -call_trace_protected(Py_tracefunc func, PyObject *obj, PyFrameObject *frame, +call_trace_protected(Py_tracefunc func, PyObject *obj, + PyThreadState *tstate, PyFrameObject *frame, int what, PyObject *arg) { PyObject *type, *value, *traceback; int err; PyErr_Fetch(&type, &value, &traceback); - err = call_trace(func, obj, frame, what, arg); + err = call_trace(func, obj, tstate, frame, what, arg); if (err == 0) { PyErr_Restore(type, value, traceback); @@ -3754,10 +3909,10 @@ call_trace_protected(Py_tracefunc func, PyObject *obj, PyFrameObject *frame, } static int -call_trace(Py_tracefunc func, PyObject *obj, PyFrameObject *frame, +call_trace(Py_tracefunc func, PyObject *obj, + PyThreadState *tstate, PyFrameObject *frame, int what, PyObject *arg) { - register PyThreadState *tstate = frame->f_tstate; int result; if (tstate->tracing) return 0; @@ -3773,8 +3928,7 @@ call_trace(Py_tracefunc func, PyObject *obj, PyFrameObject *frame, PyObject * _PyEval_CallTracing(PyObject *func, PyObject *args) { - PyFrameObject *frame = PyEval_GetFrame(); - PyThreadState *tstate = frame->f_tstate; + PyThreadState *tstate = PyThreadState_GET(); int save_tracing = tstate->tracing; int save_use_tracing = tstate->use_tracing; PyObject *result; @@ -3791,8 +3945,8 @@ _PyEval_CallTracing(PyObject *func, PyObject *args) /* See Objects/lnotab_notes.txt for a description of how tracing works. */ static int maybe_call_line_trace(Py_tracefunc func, PyObject *obj, - PyFrameObject *frame, int *instr_lb, int *instr_ub, - int *instr_prev) + PyThreadState *tstate, PyFrameObject *frame, + int *instr_lb, int *instr_ub, int *instr_prev) { int result = 0; int line = frame->f_lineno; @@ -3812,7 +3966,7 @@ maybe_call_line_trace(Py_tracefunc func, PyObject *obj, number and call the trace function. */ if (frame->f_lasti == *instr_lb || frame->f_lasti < *instr_prev) { frame->f_lineno = line; - result = call_trace(func, obj, frame, PyTrace_LINE, Py_None); + result = call_trace(func, obj, tstate, frame, PyTrace_LINE, Py_None); } *instr_prev = frame->f_lasti; return result; @@ -3868,9 +4022,15 @@ PyObject * PyEval_GetLocals(void) { PyFrameObject *current_frame = PyEval_GetFrame(); - if (current_frame == NULL) + if (current_frame == NULL) { + PyErr_SetString(PyExc_SystemError, "frame does not exist"); return NULL; - PyFrame_FastToLocals(current_frame); + } + + if (PyFrame_FastToLocalsWithError(current_frame) < 0) + return NULL; + + assert(current_frame->f_locals != NULL); return current_frame->f_locals; } @@ -3880,8 +4040,9 @@ PyEval_GetGlobals(void) PyFrameObject *current_frame = PyEval_GetFrame(); if (current_frame == NULL) return NULL; - else - return current_frame->f_globals; + + assert(current_frame->f_globals != NULL); + return current_frame->f_globals; } PyFrameObject * @@ -3923,6 +4084,13 @@ PyEval_CallObjectWithKeywords(PyObject *func, PyObject *arg, PyObject *kw) { PyObject *result; +#ifdef Py_DEBUG + /* PyEval_CallObjectWithKeywords() must not be called with an exception + set, because it may clear it (directly or indirectly) + and so the caller loses its exception */ + assert(!PyErr_Occurred()); +#endif + if (arg == NULL) { arg = PyTuple_New(0); if (arg == NULL) @@ -3945,6 +4113,9 @@ PyEval_CallObjectWithKeywords(PyObject *func, PyObject *arg, PyObject *kw) result = PyObject_Call(func, arg, kw); Py_DECREF(arg); + + assert((result != NULL && !PyErr_Occurred()) + || (result == NULL && PyErr_Occurred())); return result; } @@ -3991,10 +4162,9 @@ err_args(PyObject *func, int flags, int nargs) #define C_TRACE(x, call) \ if (tstate->use_tracing && tstate->c_profilefunc) { \ - if (call_trace(tstate->c_profilefunc, \ - tstate->c_profileobj, \ - tstate->frame, PyTrace_C_CALL, \ - func)) { \ + if (call_trace(tstate->c_profilefunc, tstate->c_profileobj, \ + tstate, tstate->frame, \ + PyTrace_C_CALL, func)) { \ x = NULL; \ } \ else { \ @@ -4003,14 +4173,14 @@ if (tstate->use_tracing && tstate->c_profilefunc) { \ if (x == NULL) { \ call_trace_protected(tstate->c_profilefunc, \ tstate->c_profileobj, \ - tstate->frame, PyTrace_C_EXCEPTION, \ - func); \ + tstate, tstate->frame, \ + PyTrace_C_EXCEPTION, func); \ /* XXX should pass (type, value, tb) */ \ } else { \ if (call_trace(tstate->c_profilefunc, \ tstate->c_profileobj, \ - tstate->frame, PyTrace_C_RETURN, \ - func)) { \ + tstate, tstate->frame, \ + PyTrace_C_RETURN, func)) { \ Py_DECREF(x); \ x = NULL; \ } \ @@ -4062,10 +4232,15 @@ call_function(PyObject ***pp_stack, int oparg else { PyObject *callargs; callargs = load_args(pp_stack, na); - READ_TIMESTAMP(*pintr0); - C_TRACE(x, PyCFunction_Call(func,callargs,NULL)); - READ_TIMESTAMP(*pintr1); - Py_XDECREF(callargs); + if (callargs != NULL) { + READ_TIMESTAMP(*pintr0); + C_TRACE(x, PyCFunction_Call(func,callargs,NULL)); + READ_TIMESTAMP(*pintr1); + Py_XDECREF(callargs); + } + else { + x = NULL; + } } } else { if (PyMethod_Check(func) && PyMethod_GET_SELF(func) != NULL) { @@ -4090,6 +4265,8 @@ call_function(PyObject ***pp_stack, int oparg READ_TIMESTAMP(*pintr1); Py_DECREF(func); } + assert((x != NULL && !PyErr_Occurred()) + || (x == NULL && PyErr_Occurred())); /* Clear the stack of the function object. Also removes the arguments in case they weren't consumed already @@ -4100,6 +4277,9 @@ call_function(PyObject ***pp_stack, int oparg Py_DECREF(w); PCALL(PCALL_POP); } + + assert((x != NULL && !PyErr_Occurred()) + || (x == NULL && PyErr_Occurred())); return x; } @@ -4383,6 +4563,8 @@ ext_call_fail: Py_XDECREF(callargs); Py_XDECREF(kwdict); Py_XDECREF(stararg); + assert((result != NULL && !PyErr_Occurred()) + || (result == NULL && PyErr_Occurred())); return result; } @@ -4421,7 +4603,7 @@ _PyEval_SliceIndex(PyObject *v, Py_ssize_t *pi) "BaseException is not allowed" static PyObject * -cmp_outcome(int op, register PyObject *v, register PyObject *w) +cmp_outcome(int op, PyObject *v, PyObject *w) { int res = 0; switch (op) { @@ -4479,7 +4661,7 @@ import_from(PyObject *v, PyObject *name) x = PyObject_GetAttr(v, name); if (x == NULL && PyErr_ExceptionMatches(PyExc_AttributeError)) { - PyErr_Format(PyExc_ImportError, "cannot import name %S", name); + PyErr_Format(PyExc_ImportError, "cannot import name %R", name); } return x; } diff --git a/Python/codecs.c b/Python/codecs.c index ea33c49..27f2aeb 100644 --- a/Python/codecs.c +++ b/Python/codecs.c @@ -53,7 +53,7 @@ int PyCodec_Register(PyObject *search_function) static PyObject *normalizestring(const char *string) { - register size_t i; + size_t i; size_t len = strlen(string); char *p; PyObject *v; @@ -65,9 +65,9 @@ PyObject *normalizestring(const char *string) p = PyMem_Malloc(len + 1); if (p == NULL) - return NULL; + return PyErr_NoMemory(); for (i = 0; i < len; i++) { - register char ch = string[i]; + char ch = string[i]; if (ch == ' ') ch = '-'; else @@ -185,6 +185,32 @@ PyObject *_PyCodec_Lookup(const char *encoding) return NULL; } +int _PyCodec_Forget(const char *encoding) +{ + PyInterpreterState *interp; + PyObject *v; + int result; + + interp = PyThreadState_GET()->interp; + if (interp->codec_search_path == NULL) { + return -1; + } + + /* Convert the encoding to a normalized Python string: all + characters are converted to lower case, spaces and hyphens are + replaced with underscores. */ + v = normalizestring(encoding); + if (v == NULL) { + return -1; + } + + /* Drop the named codec from the internal cache */ + result = PyDict_DelItem(interp->codec_search_cache, v); + Py_DECREF(v); + + return result; +} + /* Codec registry encoding check API. */ int PyCodec_KnownEncoding(const char *encoding) @@ -360,6 +386,22 @@ PyObject *PyCodec_StreamWriter(const char *encoding, return codec_getstreamcodec(encoding, stream, errors, 3); } +/* Helper that tries to ensure the reported exception chain indicates the + * codec that was invoked to trigger the failure without changing the type + * of the exception raised. + */ +static void +wrap_codec_error(const char *operation, + const char *encoding) +{ + /* TrySetFromCause will replace the active exception with a suitably + * updated clone if it can, otherwise it will leave the original + * exception alone. + */ + _PyErr_TrySetFromCause("%s with '%s' codec failed", + operation, encoding); +} + /* Encode an object (e.g. an Unicode object) using the given encoding and return the resulting encoded object (usually a Python string). @@ -379,8 +421,10 @@ _PyCodec_EncodeInternal(PyObject *object, goto onError; result = PyEval_CallObject(encoder, args); - if (result == NULL) + if (result == NULL) { + wrap_codec_error("encoding", encoding); goto onError; + } if (!PyTuple_Check(result) || PyTuple_GET_SIZE(result) != 2) { @@ -423,8 +467,10 @@ _PyCodec_DecodeInternal(PyObject *object, goto onError; result = PyEval_CallObject(decoder,args); - if (result == NULL) + if (result == NULL) { + wrap_codec_error("decoding", encoding); goto onError; + } if (!PyTuple_Check(result) || PyTuple_GET_SIZE(result) != 2) { PyErr_SetString(PyExc_TypeError, @@ -503,12 +549,13 @@ PyObject * _PyCodec_LookupTextEncoding(const char *encoding, } else { is_text_codec = PyObject_IsTrue(attr); Py_DECREF(attr); - if (!is_text_codec) { + if (is_text_codec <= 0) { Py_DECREF(codec); - PyErr_Format(PyExc_LookupError, - "'%.400s' is not a text encoding; " - "use %s to handle arbitrary codecs", - encoding, alternate_command); + if (!is_text_codec) + PyErr_Format(PyExc_LookupError, + "'%.400s' is not a text encoding; " + "use %s to handle arbitrary codecs", + encoding, alternate_command); return NULL; } } @@ -589,7 +636,7 @@ int PyCodec_RegisterError(const char *name, PyObject *error) return -1; } return PyDict_SetItemString(interp->codec_error_registry, - (char *)name, error); + name, error); } /* Lookup the error handling callback function registered under the @@ -605,7 +652,7 @@ PyObject *PyCodec_LookupError(const char *name) if (name==NULL) name = "strict"; - handler = PyDict_GetItemString(interp->codec_error_registry, (char *)name); + handler = PyDict_GetItemString(interp->codec_error_registry, name); if (!handler) PyErr_Format(PyExc_LookupError, "unknown error handler name '%.400s'", name); else @@ -615,18 +662,9 @@ PyObject *PyCodec_LookupError(const char *name) static void wrong_exception_type(PyObject *exc) { - _Py_IDENTIFIER(__class__); - _Py_IDENTIFIER(__name__); - PyObject *type = _PyObject_GetAttrId(exc, &PyId___class__); - if (type != NULL) { - PyObject *name = _PyObject_GetAttrId(type, &PyId___name__); - Py_DECREF(type); - if (name != NULL) { - PyErr_Format(PyExc_TypeError, - "don't know how to handle %S in error callback", name); - Py_DECREF(name); - } - } + PyErr_Format(PyExc_TypeError, + "don't know how to handle %.200s in error callback", + exc->ob_type->tp_name); } PyObject *PyCodec_StrictErrors(PyObject *exc) @@ -642,15 +680,16 @@ PyObject *PyCodec_StrictErrors(PyObject *exc) PyObject *PyCodec_IgnoreErrors(PyObject *exc) { Py_ssize_t end; - if (PyObject_IsInstance(exc, PyExc_UnicodeEncodeError)) { + + if (PyObject_TypeCheck(exc, (PyTypeObject *)PyExc_UnicodeEncodeError)) { if (PyUnicodeEncodeError_GetEnd(exc, &end)) return NULL; } - else if (PyObject_IsInstance(exc, PyExc_UnicodeDecodeError)) { + else if (PyObject_TypeCheck(exc, (PyTypeObject *)PyExc_UnicodeDecodeError)) { if (PyUnicodeDecodeError_GetEnd(exc, &end)) return NULL; } - else if (PyObject_IsInstance(exc, PyExc_UnicodeTranslateError)) { + else if (PyObject_TypeCheck(exc, (PyTypeObject *)PyExc_UnicodeTranslateError)) { if (PyUnicodeTranslateError_GetEnd(exc, &end)) return NULL; } @@ -666,7 +705,7 @@ PyObject *PyCodec_ReplaceErrors(PyObject *exc) { Py_ssize_t start, end, i, len; - if (PyObject_IsInstance(exc, PyExc_UnicodeEncodeError)) { + if (PyObject_TypeCheck(exc, (PyTypeObject *)PyExc_UnicodeEncodeError)) { PyObject *res; int kind; void *data; @@ -685,14 +724,14 @@ PyObject *PyCodec_ReplaceErrors(PyObject *exc) assert(_PyUnicode_CheckConsistency(res, 1)); return Py_BuildValue("(Nn)", res, end); } - else if (PyObject_IsInstance(exc, PyExc_UnicodeDecodeError)) { + else if (PyObject_TypeCheck(exc, (PyTypeObject *)PyExc_UnicodeDecodeError)) { if (PyUnicodeDecodeError_GetEnd(exc, &end)) return NULL; return Py_BuildValue("(Cn)", (int)Py_UNICODE_REPLACEMENT_CHARACTER, end); } - else if (PyObject_IsInstance(exc, PyExc_UnicodeTranslateError)) { + else if (PyObject_TypeCheck(exc, (PyTypeObject *)PyExc_UnicodeTranslateError)) { PyObject *res; int kind; void *data; @@ -719,7 +758,7 @@ PyObject *PyCodec_ReplaceErrors(PyObject *exc) PyObject *PyCodec_XMLCharRefReplaceErrors(PyObject *exc) { - if (PyObject_IsInstance(exc, PyExc_UnicodeEncodeError)) { + if (PyObject_TypeCheck(exc, (PyTypeObject *)PyExc_UnicodeEncodeError)) { PyObject *restuple; PyObject *object; Py_ssize_t i; @@ -817,7 +856,7 @@ PyObject *PyCodec_XMLCharRefReplaceErrors(PyObject *exc) PyObject *PyCodec_BackslashReplaceErrors(PyObject *exc) { - if (PyObject_IsInstance(exc, PyExc_UnicodeEncodeError)) { + if (PyObject_TypeCheck(exc, (PyTypeObject *)PyExc_UnicodeEncodeError)) { PyObject *restuple; PyObject *object; Py_ssize_t i; @@ -848,8 +887,10 @@ PyObject *PyCodec_BackslashReplaceErrors(PyObject *exc) ressize += 1+1+2; } res = PyUnicode_New(ressize, 127); - if (res==NULL) + if (res == NULL) { + Py_DECREF(object); return NULL; + } for (i = start, outp = PyUnicode_1BYTE_DATA(res); i < end; ++i) { c = PyUnicode_READ_CHAR(object, i); @@ -885,6 +926,65 @@ PyObject *PyCodec_BackslashReplaceErrors(PyObject *exc) } } +#define ENC_UTF8 0 +#define ENC_UTF16BE 1 +#define ENC_UTF16LE 2 +#define ENC_UTF32BE 3 +#define ENC_UTF32LE 4 + +static int +get_standard_encoding(const char *encoding, int *bytelength) +{ + if (Py_TOLOWER(encoding[0]) == 'u' && + Py_TOLOWER(encoding[1]) == 't' && + Py_TOLOWER(encoding[2]) == 'f') { + encoding += 3; + if (*encoding == '-' || *encoding == '_' ) + encoding++; + if (encoding[0] == '1' && encoding[1] == '6') { + encoding += 2; + *bytelength = 2; + if (*encoding == '\0') { +#ifdef WORDS_BIGENDIAN + return ENC_UTF16BE; +#else + return ENC_UTF16LE; +#endif + } + if (*encoding == '-' || *encoding == '_' ) + encoding++; + if (Py_TOLOWER(encoding[1]) == 'e' && encoding[2] == '\0') { + if (Py_TOLOWER(encoding[0]) == 'b') + return ENC_UTF16BE; + if (Py_TOLOWER(encoding[0]) == 'l') + return ENC_UTF16LE; + } + } + else if (encoding[0] == '3' && encoding[1] == '2') { + encoding += 2; + *bytelength = 4; + if (*encoding == '\0') { +#ifdef WORDS_BIGENDIAN + return ENC_UTF32BE; +#else + return ENC_UTF32LE; +#endif + } + if (*encoding == '-' || *encoding == '_' ) + encoding++; + if (Py_TOLOWER(encoding[1]) == 'e' && encoding[2] == '\0') { + if (Py_TOLOWER(encoding[0]) == 'b') + return ENC_UTF32BE; + if (Py_TOLOWER(encoding[0]) == 'l') + return ENC_UTF32LE; + } + } + } + /* utf-8 */ + *bytelength = 3; + return ENC_UTF8; +} + /* This handler is declared static until someone demonstrates a need to call it directly. */ static PyObject * @@ -892,76 +992,149 @@ PyCodec_SurrogatePassErrors(PyObject *exc) { PyObject *restuple; PyObject *object; + PyObject *encode; + char *encoding; + int code; + int bytelength; Py_ssize_t i; Py_ssize_t start; Py_ssize_t end; PyObject *res; - if (PyObject_IsInstance(exc, PyExc_UnicodeEncodeError)) { - char *outp; + + if (PyObject_TypeCheck(exc, (PyTypeObject *)PyExc_UnicodeEncodeError)) { + unsigned char *outp; if (PyUnicodeEncodeError_GetStart(exc, &start)) return NULL; if (PyUnicodeEncodeError_GetEnd(exc, &end)) return NULL; if (!(object = PyUnicodeEncodeError_GetObject(exc))) return NULL; - res = PyBytes_FromStringAndSize(NULL, 3*(end-start)); + if (!(encode = PyUnicodeEncodeError_GetEncoding(exc))) { + Py_DECREF(object); + return NULL; + } + if (!(encoding = PyUnicode_AsUTF8(encode))) { + Py_DECREF(object); + Py_DECREF(encode); + return NULL; + } + code = get_standard_encoding(encoding, &bytelength); + Py_DECREF(encode); + + if (end - start > PY_SSIZE_T_MAX / bytelength) + end = start + PY_SSIZE_T_MAX / bytelength; + res = PyBytes_FromStringAndSize(NULL, bytelength*(end-start)); if (!res) { Py_DECREF(object); return NULL; } - outp = PyBytes_AsString(res); + outp = (unsigned char*)PyBytes_AsString(res); for (i = start; i < end; i++) { /* object is guaranteed to be "ready" */ Py_UCS4 ch = PyUnicode_READ_CHAR(object, i); - if (ch < 0xd800 || ch > 0xdfff) { + if (!Py_UNICODE_IS_SURROGATE(ch)) { /* Not a surrogate, fail with original exception */ PyErr_SetObject(PyExceptionInstance_Class(exc), exc); Py_DECREF(res); Py_DECREF(object); return NULL; } - *outp++ = (char)(0xe0 | (ch >> 12)); - *outp++ = (char)(0x80 | ((ch >> 6) & 0x3f)); - *outp++ = (char)(0x80 | (ch & 0x3f)); + switch (code) { + case ENC_UTF8: + *outp++ = (unsigned char)(0xe0 | (ch >> 12)); + *outp++ = (unsigned char)(0x80 | ((ch >> 6) & 0x3f)); + *outp++ = (unsigned char)(0x80 | (ch & 0x3f)); + break; + case ENC_UTF16LE: + *outp++ = (unsigned char) ch; + *outp++ = (unsigned char)(ch >> 8); + break; + case ENC_UTF16BE: + *outp++ = (unsigned char)(ch >> 8); + *outp++ = (unsigned char) ch; + break; + case ENC_UTF32LE: + *outp++ = (unsigned char) ch; + *outp++ = (unsigned char)(ch >> 8); + *outp++ = (unsigned char)(ch >> 16); + *outp++ = (unsigned char)(ch >> 24); + break; + case ENC_UTF32BE: + *outp++ = (unsigned char)(ch >> 24); + *outp++ = (unsigned char)(ch >> 16); + *outp++ = (unsigned char)(ch >> 8); + *outp++ = (unsigned char) ch; + break; + } } restuple = Py_BuildValue("(On)", res, end); Py_DECREF(res); Py_DECREF(object); return restuple; } - else if (PyObject_IsInstance(exc, PyExc_UnicodeDecodeError)) { + else if (PyObject_TypeCheck(exc, (PyTypeObject *)PyExc_UnicodeDecodeError)) { unsigned char *p; Py_UCS4 ch = 0; if (PyUnicodeDecodeError_GetStart(exc, &start)) return NULL; + if (PyUnicodeDecodeError_GetEnd(exc, &end)) + return NULL; if (!(object = PyUnicodeDecodeError_GetObject(exc))) return NULL; if (!(p = (unsigned char*)PyBytes_AsString(object))) { Py_DECREF(object); return NULL; } + if (!(encode = PyUnicodeDecodeError_GetEncoding(exc))) { + Py_DECREF(object); + return NULL; + } + if (!(encoding = PyUnicode_AsUTF8(encode))) { + Py_DECREF(object); + Py_DECREF(encode); + return NULL; + } + code = get_standard_encoding(encoding, &bytelength); + Py_DECREF(encode); + /* Try decoding a single surrogate character. If there are more, let the codec call us again. */ p += start; - if (PyBytes_GET_SIZE(object) - start >= 3 && - (p[0] & 0xf0) == 0xe0 && - (p[1] & 0xc0) == 0x80 && - (p[2] & 0xc0) == 0x80) { - /* it's a three-byte code */ - ch = ((p[0] & 0x0f) << 12) + ((p[1] & 0x3f) << 6) + (p[2] & 0x3f); - if (ch < 0xd800 || ch > 0xdfff) - /* it's not a surrogate - fail */ - ch = 0; + if (PyBytes_GET_SIZE(object) - start >= bytelength) { + switch (code) { + case ENC_UTF8: + if ((p[0] & 0xf0) == 0xe0 && + (p[1] & 0xc0) == 0x80 && + (p[2] & 0xc0) == 0x80) { + /* it's a three-byte code */ + ch = ((p[0] & 0x0f) << 12) + ((p[1] & 0x3f) << 6) + (p[2] & 0x3f); + } + break; + case ENC_UTF16LE: + ch = p[1] << 8 | p[0]; + break; + case ENC_UTF16BE: + ch = p[0] << 8 | p[1]; + break; + case ENC_UTF32LE: + ch = (p[3] << 24) | (p[2] << 16) | (p[1] << 8) | p[0]; + break; + case ENC_UTF32BE: + ch = (p[0] << 24) | (p[1] << 16) | (p[2] << 8) | p[3]; + break; + } } + Py_DECREF(object); - if (ch == 0) { + if (!Py_UNICODE_IS_SURROGATE(ch)) { + /* it's not a surrogate - fail */ PyErr_SetObject(PyExceptionInstance_Class(exc), exc); return NULL; } res = PyUnicode_FromOrdinal(ch); if (res == NULL) return NULL; - return Py_BuildValue("(Nn)", res, start+3); + return Py_BuildValue("(Nn)", res, start + bytelength); } else { wrong_exception_type(exc); @@ -978,7 +1151,8 @@ PyCodec_SurrogateEscapeErrors(PyObject *exc) Py_ssize_t start; Py_ssize_t end; PyObject *res; - if (PyObject_IsInstance(exc, PyExc_UnicodeEncodeError)) { + + if (PyObject_TypeCheck(exc, (PyTypeObject *)PyExc_UnicodeEncodeError)) { char *outp; if (PyUnicodeEncodeError_GetStart(exc, &start)) return NULL; @@ -1009,7 +1183,7 @@ PyCodec_SurrogateEscapeErrors(PyObject *exc) Py_DECREF(object); return restuple; } - else if (PyObject_IsInstance(exc, PyExc_UnicodeDecodeError)) { + else if (PyObject_TypeCheck(exc, (PyTypeObject *)PyExc_UnicodeDecodeError)) { PyObject *str; unsigned char *p; Py_UCS2 ch[4]; /* decode up to 4 bad bytes. */ @@ -1178,7 +1352,7 @@ static int _PyCodecRegistry_Init(void) if (interp->codec_error_registry) { for (i = 0; i < Py_ARRAY_LENGTH(methods); ++i) { - PyObject *func = PyCFunction_New(&methods[i].def, NULL); + PyObject *func = PyCFunction_NewEx(&methods[i].def, NULL, NULL); int res; if (!func) Py_FatalError("can't initialize codec error registry"); diff --git a/Python/compile.c b/Python/compile.c index 6d66255..ff62487 100644 --- a/Python/compile.c +++ b/Python/compile.c @@ -94,6 +94,7 @@ enum { COMPILER_SCOPE_MODULE, COMPILER_SCOPE_CLASS, COMPILER_SCOPE_FUNCTION, + COMPILER_SCOPE_LAMBDA, COMPILER_SCOPE_COMPREHENSION, }; @@ -119,8 +120,8 @@ struct compiler_unit { PyObject *u_private; /* for private name mangling */ - int u_argcount; /* number of arguments for block */ - int u_kwonlyargcount; /* number of keyword only arguments for block */ + Py_ssize_t u_argcount; /* number of arguments for block */ + Py_ssize_t u_kwonlyargcount; /* number of keyword only arguments for block */ /* Pointer to the most recently allocated block. By following b_list members, you can reach all early allocated blocks. */ basicblock *u_blocks; @@ -149,8 +150,7 @@ handled by the symbol analysis pass. */ struct compiler { - const char *c_filename; - PyObject *c_filename_obj; + PyObject *c_filename; struct symtable *c_st; PyFutureFeatures *c_future; /* pointer to module's __future__ */ PyCompilerFlags *c_flags; @@ -170,7 +170,7 @@ static basicblock *compiler_new_block(struct compiler *); static int compiler_next_instr(struct compiler *, basicblock *); static int compiler_addop(struct compiler *, int); static int compiler_addop_o(struct compiler *, int, PyObject *, PyObject *); -static int compiler_addop_i(struct compiler *, int, int); +static int compiler_addop_i(struct compiler *, int, Py_ssize_t); static int compiler_addop_j(struct compiler *, int, basicblock *, int); static basicblock *compiler_use_new_block(struct compiler *); static int compiler_error(struct compiler *, const char *); @@ -195,17 +195,18 @@ static int inplace_binop(struct compiler *, operator_ty); static int expr_constant(struct compiler *, expr_ty); static int compiler_with(struct compiler *, stmt_ty, int); -static int compiler_call_helper(struct compiler *c, int n, +static int compiler_call_helper(struct compiler *c, Py_ssize_t n, asdl_seq *args, asdl_seq *keywords, expr_ty starargs, expr_ty kwargs); static int compiler_try_except(struct compiler *, stmt_ty); +static int compiler_set_qualname(struct compiler *); static PyCodeObject *assemble(struct compiler *, int addNone); static PyObject *__doc__; -#define COMPILER_CAPSULE_NAME_COMPILER_UNIT "compile.c compiler unit" +#define CAPSULE_NAME "compile.c compiler unit" PyObject * _Py_Mangle(PyObject *privateobj, PyObject *ident) @@ -288,8 +289,8 @@ compiler_init(struct compiler *c) } PyCodeObject * -PyAST_CompileEx(mod_ty mod, const char *filename, PyCompilerFlags *flags, - int optimize, PyArena *arena) +PyAST_CompileObject(mod_ty mod, PyObject *filename, PyCompilerFlags *flags, + int optimize, PyArena *arena) { struct compiler c; PyCodeObject *co = NULL; @@ -304,12 +305,10 @@ PyAST_CompileEx(mod_ty mod, const char *filename, PyCompilerFlags *flags, if (!compiler_init(&c)) return NULL; + Py_INCREF(filename); c.c_filename = filename; - c.c_filename_obj = PyUnicode_DecodeFSDefault(filename); - if (!c.c_filename_obj) - goto finally; c.c_arena = arena; - c.c_future = PyFuture_FromAST(mod, filename); + c.c_future = PyFuture_FromASTObject(mod, filename); if (c.c_future == NULL) goto finally; if (!flags) { @@ -323,7 +322,7 @@ PyAST_CompileEx(mod_ty mod, const char *filename, PyCompilerFlags *flags, c.c_optimize = (optimize == -1) ? Py_OptimizeFlag : optimize; c.c_nestlevel = 0; - c.c_st = PySymtable_Build(mod, filename, c.c_future); + c.c_st = PySymtable_BuildObject(mod, filename, c.c_future); if (c.c_st == NULL) { if (!PyErr_Occurred()) PyErr_SetString(PyExc_SystemError, "no symtable"); @@ -339,6 +338,21 @@ PyAST_CompileEx(mod_ty mod, const char *filename, PyCompilerFlags *flags, } PyCodeObject * +PyAST_CompileEx(mod_ty mod, const char *filename_str, PyCompilerFlags *flags, + int optimize, PyArena *arena) +{ + PyObject *filename; + PyCodeObject *co; + filename = PyUnicode_DecodeFSDefault(filename_str); + if (filename == NULL) + return NULL; + co = PyAST_CompileObject(mod, filename, flags, optimize, arena); + Py_DECREF(filename); + return co; + +} + +PyCodeObject * PyNode_Compile(struct _node *n, const char *filename) { PyCodeObject *co = NULL; @@ -360,8 +374,7 @@ compiler_free(struct compiler *c) PySymtable_Free(c->c_st); if (c->c_future) PyObject_Free(c->c_future); - if (c->c_filename_obj) - Py_DECREF(c->c_filename_obj); + Py_XDECREF(c->c_filename); Py_DECREF(c->c_stack); } @@ -375,7 +388,7 @@ list2dict(PyObject *list) n = PyList_Size(list); for (i = 0; i < n; i++) { - v = PyLong_FromLong(i); + v = PyLong_FromSsize_t(i); if (!v) { Py_DECREF(dict); return NULL; @@ -403,7 +416,7 @@ each key. */ static PyObject * -dictbytype(PyObject *src, int scope_type, int flag, int offset) +dictbytype(PyObject *src, int scope_type, int flag, Py_ssize_t offset) { Py_ssize_t i = offset, scope, num_keys, key_i; PyObject *k, *v, *dest = PyDict_New(); @@ -437,7 +450,7 @@ dictbytype(PyObject *src, int scope_type, int flag, int offset) scope = (vi >> SCOPE_OFFSET) & SCOPE_MASK; if (scope == scope_type || vi & flag) { - PyObject *tuple, *item = PyLong_FromLong(i); + PyObject *tuple, *item = PyLong_FromSsize_t(i); if (item == NULL) { Py_DECREF(sorted_keys); Py_DECREF(dest); @@ -535,6 +548,37 @@ compiler_enter_scope(struct compiler *c, identifier name, compiler_unit_free(u); return 0; } + if (u->u_ste->ste_needs_class_closure) { + /* Cook up an implicit __class__ cell. */ + _Py_IDENTIFIER(__class__); + PyObject *tuple, *name, *zero; + int res; + assert(u->u_scope_type == COMPILER_SCOPE_CLASS); + assert(PyDict_Size(u->u_cellvars) == 0); + name = _PyUnicode_FromId(&PyId___class__); + if (!name) { + compiler_unit_free(u); + return 0; + } + tuple = PyTuple_Pack(2, name, Py_TYPE(name)); + if (!tuple) { + compiler_unit_free(u); + return 0; + } + zero = PyLong_FromLong(0); + if (!zero) { + Py_DECREF(tuple); + compiler_unit_free(u); + return 0; + } + res = PyDict_SetItem(u->u_cellvars, tuple, zero); + Py_DECREF(tuple); + Py_DECREF(zero); + if (res < 0) { + compiler_unit_free(u); + return 0; + } + } u->u_freevars = dictbytype(u->u_ste->ste_symbols, FREE, DEF_FREE_CLASS, PyDict_Size(u->u_cellvars)); @@ -564,7 +608,7 @@ compiler_enter_scope(struct compiler *c, identifier name, /* Push the old compiler_unit on the stack. */ if (c->u) { - PyObject *capsule = PyCapsule_New(c->u, COMPILER_CAPSULE_NAME_COMPILER_UNIT, NULL); + PyObject *capsule = PyCapsule_New(c->u, CAPSULE_NAME, NULL); if (!capsule || PyList_Append(c->c_stack, capsule) < 0) { Py_XDECREF(capsule); compiler_unit_free(u); @@ -580,13 +624,18 @@ compiler_enter_scope(struct compiler *c, identifier name, if (compiler_use_new_block(c) == NULL) return 0; + if (u->u_scope_type != COMPILER_SCOPE_MODULE) { + if (!compiler_set_qualname(c)) + return 0; + } + return 1; } static void compiler_exit_scope(struct compiler *c) { - int n; + Py_ssize_t n; PyObject *capsule; c->c_nestlevel--; @@ -595,7 +644,7 @@ compiler_exit_scope(struct compiler *c) n = PyList_GET_SIZE(c->c_stack) - 1; if (n >= 0) { capsule = PyList_GET_ITEM(c->c_stack, n); - c->u = (struct compiler_unit *)PyCapsule_GetPointer(capsule, COMPILER_CAPSULE_NAME_COMPILER_UNIT); + c->u = (struct compiler_unit *)PyCapsule_GetPointer(capsule, CAPSULE_NAME); assert(c->u); /* we are deleting from a list so this really shouldn't fail */ if (PySequence_DelItem(c->c_stack, n) < 0) @@ -607,57 +656,77 @@ compiler_exit_scope(struct compiler *c) } -static PyObject * -compiler_scope_qualname(struct compiler *c) +static int +compiler_set_qualname(struct compiler *c) { - Py_ssize_t stack_size, i; _Py_static_string(dot, "."); - _Py_static_string(locals, "<locals>"); - struct compiler_unit *u; - PyObject *capsule, *name, *seq, *dot_str, *locals_str; + _Py_static_string(dot_locals, ".<locals>"); + Py_ssize_t stack_size; + struct compiler_unit *u = c->u; + PyObject *name, *base, *dot_str, *dot_locals_str; - u = c->u; - if (u->u_qualname != NULL) { - Py_INCREF(u->u_qualname); - return u->u_qualname; - } + base = NULL; + stack_size = PyList_GET_SIZE(c->c_stack); + assert(stack_size >= 1); + if (stack_size > 1) { + int scope, force_global = 0; + struct compiler_unit *parent; + PyObject *mangled, *capsule; + + capsule = PyList_GET_ITEM(c->c_stack, stack_size - 1); + parent = (struct compiler_unit *)PyCapsule_GetPointer(capsule, CAPSULE_NAME); + assert(parent); + + if (u->u_scope_type == COMPILER_SCOPE_FUNCTION || u->u_scope_type == COMPILER_SCOPE_CLASS) { + assert(u->u_name); + mangled = _Py_Mangle(parent->u_private, u->u_name); + if (!mangled) + return 0; + scope = PyST_GetScope(parent->u_ste, mangled); + Py_DECREF(mangled); + assert(scope != GLOBAL_IMPLICIT); + if (scope == GLOBAL_EXPLICIT) + force_global = 1; + } - seq = PyList_New(0); - if (seq == NULL) - return NULL; + if (!force_global) { + if (parent->u_scope_type == COMPILER_SCOPE_FUNCTION + || parent->u_scope_type == COMPILER_SCOPE_LAMBDA) { + dot_locals_str = _PyUnicode_FromId(&dot_locals); + if (dot_locals_str == NULL) + return 0; + base = PyUnicode_Concat(parent->u_qualname, dot_locals_str); + if (base == NULL) + return 0; + } + else { + Py_INCREF(parent->u_qualname); + base = parent->u_qualname; + } + } + } - stack_size = PyList_GET_SIZE(c->c_stack); - for (i = 0; i < stack_size; i++) { - capsule = PyList_GET_ITEM(c->c_stack, i); - u = (struct compiler_unit *)PyCapsule_GetPointer(capsule, COMPILER_CAPSULE_NAME_COMPILER_UNIT); - assert(u); - if (u->u_scope_type == COMPILER_SCOPE_MODULE) - continue; - if (PyList_Append(seq, u->u_name)) - goto _error; - if (u->u_scope_type == COMPILER_SCOPE_FUNCTION) { - locals_str = _PyUnicode_FromId(&locals); - if (locals_str == NULL) - goto _error; - if (PyList_Append(seq, locals_str)) - goto _error; + if (base != NULL) { + dot_str = _PyUnicode_FromId(&dot); + if (dot_str == NULL) { + Py_DECREF(base); + return 0; } + name = PyUnicode_Concat(base, dot_str); + Py_DECREF(base); + if (name == NULL) + return 0; + PyUnicode_Append(&name, u->u_name); + if (name == NULL) + return 0; + } + else { + Py_INCREF(u->u_name); + name = u->u_name; } - u = c->u; - if (PyList_Append(seq, u->u_name)) - goto _error; - dot_str = _PyUnicode_FromId(&dot); - if (dot_str == NULL) - goto _error; - name = PyUnicode_Join(dot_str, seq); - Py_DECREF(seq); u->u_qualname = name; - Py_XINCREF(name); - return name; -_error: - Py_XDECREF(seq); - return NULL; + return 1; } /* Allocate a new block and return a pointer to it. @@ -784,8 +853,8 @@ compiler_set_lineno(struct compiler *c, int off) b->b_instr[off].i_lineno = c->u->u_lineno; } -static int -opcode_stack_effect(int opcode, int oparg) +int +PyCompile_OpcodeStackEffect(int opcode, int oparg) { switch (opcode) { case POP_TOP: @@ -862,8 +931,6 @@ opcode_stack_effect(int opcode, int oparg) return 7; case WITH_CLEANUP: return -1; /* XXX Sometimes more */ - case STORE_LOCALS: - return -1; case RETURN_VALUE: return -1; case IMPORT_STAR: @@ -970,17 +1037,16 @@ opcode_stack_effect(int opcode, int oparg) case LOAD_CLOSURE: return 1; case LOAD_DEREF: + case LOAD_CLASSDEREF: return 1; case STORE_DEREF: return -1; case DELETE_DEREF: return 0; default: - fprintf(stderr, "opcode = %d\n", opcode); - Py_FatalError("opcode_stack_effect()"); - + return PY_INVALID_STACK_EFFECT; } - return 0; /* not reachable */ + return PY_INVALID_STACK_EFFECT; /* not reachable */ } /* Add an opcode with no argument. @@ -1006,7 +1072,7 @@ compiler_addop(struct compiler *c, int opcode) return 1; } -static int +static Py_ssize_t compiler_add_o(struct compiler *c, PyObject *dict, PyObject *o) { PyObject *t, *v; @@ -1060,7 +1126,7 @@ compiler_add_o(struct compiler *c, PyObject *dict, PyObject *o) if (PyErr_Occurred()) return -1; arg = PyDict_Size(dict); - v = PyLong_FromLong(arg); + v = PyLong_FromSsize_t(arg); if (!v) { Py_DECREF(t); return -1; @@ -1082,7 +1148,7 @@ static int compiler_addop_o(struct compiler *c, int opcode, PyObject *dict, PyObject *o) { - int arg = compiler_add_o(c, dict, o); + Py_ssize_t arg = compiler_add_o(c, dict, o); if (arg < 0) return 0; return compiler_addop_i(c, opcode, arg); @@ -1092,7 +1158,7 @@ static int compiler_addop_name(struct compiler *c, int opcode, PyObject *dict, PyObject *o) { - int arg; + Py_ssize_t arg; PyObject *mangled = _Py_Mangle(c->u->u_private, o); if (!mangled) return 0; @@ -1108,16 +1174,22 @@ compiler_addop_name(struct compiler *c, int opcode, PyObject *dict, */ static int -compiler_addop_i(struct compiler *c, int opcode, int oparg) +compiler_addop_i(struct compiler *c, int opcode, Py_ssize_t oparg) { struct instr *i; int off; + + /* Integer arguments are limit to 16-bit. There is an extension for 32-bit + integer arguments. */ + assert((-2147483647-1) <= oparg); + assert(oparg <= 2147483647); + off = compiler_next_instr(c, c->u->u_curblock); if (off < 0) return 0; i = &c->u->u_curblock->b_instr[off]; i->i_opcode = opcode; - i->i_oparg = oparg; + i->i_oparg = Py_SAFE_DOWNCAST(oparg, Py_ssize_t, int); i->i_hasarg = 1; compiler_set_lineno(c, off); return 1; @@ -1330,19 +1402,22 @@ compiler_mod(struct compiler *c, mod_ty mod) static int get_ref_type(struct compiler *c, PyObject *name) { - int scope = PyST_GetScope(c->u->u_ste, name); + int scope; + if (c->u->u_scope_type == COMPILER_SCOPE_CLASS && + !PyUnicode_CompareWithASCIIString(name, "__class__")) + return CELL; + scope = PyST_GetScope(c->u->u_ste, name); if (scope == 0) { char buf[350]; PyOS_snprintf(buf, sizeof(buf), - "unknown scope for %.100s in %.100s(%s) in %s\n" + "unknown scope for %.100s in %.100s(%s)\n" "symbols: %s\nlocals: %s\nglobals: %s", - PyBytes_AS_STRING(name), - PyBytes_AS_STRING(c->u->u_name), - PyObject_REPR(c->u->u_ste->ste_id), - c->c_filename, - PyObject_REPR(c->u->u_ste->ste_symbols), - PyObject_REPR(c->u->u_varnames), - PyObject_REPR(c->u->u_names) + PyUnicode_AsUTF8(name), + PyUnicode_AsUTF8(c->u->u_name), + PyUnicode_AsUTF8(PyObject_Repr(c->u->u_ste->ste_id)), + PyUnicode_AsUTF8(PyObject_Repr(c->u->u_ste->ste_symbols)), + PyUnicode_AsUTF8(PyObject_Repr(c->u->u_varnames)), + PyUnicode_AsUTF8(PyObject_Repr(c->u->u_names)) ); Py_FatalError(buf); } @@ -1365,9 +1440,9 @@ compiler_lookup_arg(PyObject *dict, PyObject *name) } static int -compiler_make_closure(struct compiler *c, PyCodeObject *co, int args, PyObject *qualname) +compiler_make_closure(struct compiler *c, PyCodeObject *co, Py_ssize_t args, PyObject *qualname) { - int i, free = PyCode_GetNumFree(co); + Py_ssize_t i, free = PyCode_GetNumFree(co); if (qualname == NULL) qualname = co->co_name; @@ -1399,11 +1474,11 @@ compiler_make_closure(struct compiler *c, PyCodeObject *co, int args, PyObject * fprintf(stderr, "lookup %s in %s %d %d\n" "freevars of %s: %s\n", - PyObject_REPR(name), - PyBytes_AS_STRING(c->u->u_name), + PyUnicode_AsUTF8(PyObject_Repr(name)), + PyUnicode_AsUTF8(c->u->u_name), reftype, arg, - _PyUnicode_AsString(co->co_name), - PyObject_REPR(co->co_freevars)); + PyUnicode_AsUTF8(co->co_name), + PyUnicode_AsUTF8(PyObject_Repr(co->co_freevars))); Py_FatalError("compiler_make_closure()"); } ADDOP_I(c, LOAD_CLOSURE, arg); @@ -1457,9 +1532,16 @@ compiler_visit_argannotation(struct compiler *c, identifier id, expr_ty annotation, PyObject *names) { if (annotation) { + PyObject *mangled; VISIT(c, expr, annotation); - if (PyList_Append(names, id)) + mangled = _Py_Mangle(c->u->u_private, id); + if (!mangled) + return -1; + if (PyList_Append(names, mangled) < 0) { + Py_DECREF(mangled); return -1; + } + Py_DECREF(mangled); } return 0; } @@ -1494,22 +1576,22 @@ compiler_visit_annotations(struct compiler *c, arguments_ty args, */ static identifier return_str; PyObject *names; - int len; + Py_ssize_t len; names = PyList_New(0); if (!names) return -1; if (compiler_visit_argannotations(c, args->args, names)) goto error; - if (args->varargannotation && - compiler_visit_argannotation(c, args->vararg, - args->varargannotation, names)) + if (args->vararg && args->vararg->annotation && + compiler_visit_argannotation(c, args->vararg->arg, + args->vararg->annotation, names)) goto error; if (compiler_visit_argannotations(c, args->kwonlyargs, names)) goto error; - if (args->kwargannotation && - compiler_visit_argannotation(c, args->kwarg, - args->kwargannotation, names)) + if (args->kwarg && args->kwarg->annotation && + compiler_visit_argannotation(c, args->kwarg->arg, + args->kwarg->annotation, names)) goto error; if (!return_str) { @@ -1531,7 +1613,7 @@ compiler_visit_annotations(struct compiler *c, arguments_ty args, if (len) { /* convert names to a tuple and place on stack */ PyObject *elt; - int i; + Py_ssize_t i; PyObject *s = PyTuple_New(len); if (!s) goto error; @@ -1545,7 +1627,9 @@ compiler_visit_annotations(struct compiler *c, arguments_ty args, len++; /* include the just-pushed tuple */ } Py_DECREF(names); - return len; + + /* We just checked that len <= 65535, see above */ + return Py_SAFE_DOWNCAST(len, Py_ssize_t, int); error: Py_DECREF(names); @@ -1561,13 +1645,16 @@ compiler_function(struct compiler *c, stmt_ty s) expr_ty returns = s->v.FunctionDef.returns; asdl_seq* decos = s->v.FunctionDef.decorator_list; stmt_ty st; - int i, n, docstring, kw_default_count = 0, arglength; + Py_ssize_t i, n, arglength; + int docstring, kw_default_count = 0; int num_annotations; assert(s->kind == FunctionDef_kind); if (!compiler_decorators(c, decos)) return 0; + if (args->defaults) + VISIT_SEQ(c, expr, args->defaults); if (args->kwonlyargs) { int res = compiler_visit_kwonlydefaults(c, args->kwonlyargs, args->kw_defaults); @@ -1575,8 +1662,6 @@ compiler_function(struct compiler *c, stmt_ty s) return 0; kw_default_count = res; } - if (args->defaults) - VISIT_SEQ(c, expr, args->defaults); num_annotations = compiler_visit_annotations(c, args, returns); if (num_annotations < 0) return 0; @@ -1605,9 +1690,10 @@ compiler_function(struct compiler *c, stmt_ty s) VISIT_IN_SCOPE(c, stmt, st); } co = assemble(c, 1); - qualname = compiler_scope_qualname(c); + qualname = c->u->u_qualname; + Py_INCREF(qualname); compiler_exit_scope(c); - if (qualname == NULL || co == NULL) { + if (co == NULL) { Py_XDECREF(qualname); Py_XDECREF(co); return 0; @@ -1661,12 +1747,6 @@ compiler_class(struct compiler *c, stmt_ty s) Py_INCREF(s->v.ClassDef.name); Py_XDECREF(c->u->u_private); c->u->u_private = s->v.ClassDef.name; - /* force it to have one mandatory argument */ - c->u->u_argcount = 1; - /* load the first argument (__locals__) ... */ - ADDOP_I(c, LOAD_FAST, 0); - /* ... and store it into f_locals */ - ADDOP_IN_SCOPE(c, STORE_LOCALS); /* load (global) __name__ ... */ str = PyUnicode_InternFromString("__name__"); if (!str || !compiler_nameop(c, str, Load)) { @@ -1683,14 +1763,8 @@ compiler_class(struct compiler *c, stmt_ty s) return 0; } Py_DECREF(str); - /* store the __qualname__ */ - str = compiler_scope_qualname(c); - if (!str) { - compiler_exit_scope(c); - return 0; - } - ADDOP_O(c, LOAD_CONST, str, consts); - Py_DECREF(str); + assert(c->u->u_qualname); + ADDOP_O(c, LOAD_CONST, c->u->u_qualname, consts); str = PyUnicode_InternFromString("__qualname__"); if (!str || !compiler_nameop(c, str, Store)) { Py_XDECREF(str); @@ -1703,24 +1777,28 @@ compiler_class(struct compiler *c, stmt_ty s) compiler_exit_scope(c); return 0; } - /* return the (empty) __class__ cell */ - str = PyUnicode_InternFromString("__class__"); - if (str == NULL) { - compiler_exit_scope(c); - return 0; - } - i = compiler_lookup_arg(c->u->u_cellvars, str); - Py_DECREF(str); - if (i == -1) { - /* This happens when nobody references the cell */ - PyErr_Clear(); - /* Return None */ - ADDOP_O(c, LOAD_CONST, Py_None, consts); - } - else { + if (c->u->u_ste->ste_needs_class_closure) { + /* return the (empty) __class__ cell */ + str = PyUnicode_InternFromString("__class__"); + if (str == NULL) { + compiler_exit_scope(c); + return 0; + } + i = compiler_lookup_arg(c->u->u_cellvars, str); + Py_DECREF(str); + if (i < 0) { + compiler_exit_scope(c); + return 0; + } + assert(i == 0); /* Return the cell where to store __class__ */ ADDOP_I(c, LOAD_CLOSURE, i); } + else { + assert(PyDict_Size(c->u->u_cellvars) == 0); + /* This happens when nobody references the cell. Return None. */ + ADDOP_O(c, LOAD_CONST, Py_None, consts); + } ADDOP_IN_SCOPE(c, RETURN_VALUE); /* create the code object */ co = assemble(c, 1); @@ -1787,7 +1865,8 @@ compiler_lambda(struct compiler *c, expr_ty e) PyCodeObject *co; PyObject *qualname; static identifier name; - int kw_default_count = 0, arglength; + int kw_default_count = 0; + Py_ssize_t arglength; arguments_ty args = e->v.Lambda.args; assert(e->kind == Lambda_kind); @@ -1797,15 +1876,15 @@ compiler_lambda(struct compiler *c, expr_ty e) return 0; } + if (args->defaults) + VISIT_SEQ(c, expr, args->defaults); if (args->kwonlyargs) { int res = compiler_visit_kwonlydefaults(c, args->kwonlyargs, args->kw_defaults); if (res < 0) return 0; kw_default_count = res; } - if (args->defaults) - VISIT_SEQ(c, expr, args->defaults); - if (!compiler_enter_scope(c, name, COMPILER_SCOPE_FUNCTION, + if (!compiler_enter_scope(c, name, COMPILER_SCOPE_LAMBDA, (void *)e, e->lineno)) return 0; @@ -1818,15 +1897,16 @@ compiler_lambda(struct compiler *c, expr_ty e) c->u->u_kwonlyargcount = asdl_seq_LEN(args->kwonlyargs); VISIT_IN_SCOPE(c, expr, e->v.Lambda.body); if (c->u->u_ste->ste_generator) { - ADDOP_IN_SCOPE(c, POP_TOP); + co = assemble(c, 0); } else { ADDOP_IN_SCOPE(c, RETURN_VALUE); + co = assemble(c, 1); } - co = assemble(c, 1); - qualname = compiler_scope_qualname(c); + qualname = c->u->u_qualname; + Py_INCREF(qualname); compiler_exit_scope(c); - if (qualname == NULL || co == NULL) + if (co == NULL) return 0; arglength = asdl_seq_LEN(args->defaults); @@ -1949,10 +2029,9 @@ compiler_while(struct compiler *c, stmt_ty s) if there is no else clause ? */ - if (constant == -1) { + if (constant == -1) compiler_use_next_block(c, anchor); - ADDOP(c, POP_BLOCK); - } + ADDOP(c, POP_BLOCK); compiler_pop_fblock(c, LOOP, loop); if (orelse != NULL) /* what if orelse is just pass? */ VISIT_SEQ(c, stmt, s->v.While.orelse); @@ -2097,7 +2176,7 @@ static int compiler_try_except(struct compiler *c, stmt_ty s) { basicblock *body, *orelse, *except, *end; - int i, n; + Py_ssize_t i, n; body = compiler_new_block(c); except = compiler_new_block(c); @@ -2263,7 +2342,7 @@ compiler_import(struct compiler *c, stmt_ty s) module names. XXX Perhaps change the representation to make this case simpler? */ - int i, n = asdl_seq_LEN(s->v.Import.names); + Py_ssize_t i, n = asdl_seq_LEN(s->v.Import.names); for (i = 0; i < n; i++) { alias_ty alias = (alias_ty)asdl_seq_GET(s->v.Import.names, i); @@ -2288,8 +2367,11 @@ compiler_import(struct compiler *c, stmt_ty s) identifier tmp = alias->name; Py_ssize_t dot = PyUnicode_FindChar( alias->name, '.', 0, PyUnicode_GET_LENGTH(alias->name), 1); - if (dot != -1) + if (dot != -1) { tmp = PyUnicode_Substring(alias->name, 0, dot); + if (tmp == NULL) + return 0; + } r = compiler_nameop(c, tmp, Store); if (dot != -1) { Py_DECREF(tmp); @@ -2304,7 +2386,7 @@ compiler_import(struct compiler *c, stmt_ty s) static int compiler_from_import(struct compiler *c, stmt_ty s) { - int i, n = asdl_seq_LEN(s->v.ImportFrom.names); + Py_ssize_t i, n = asdl_seq_LEN(s->v.ImportFrom.names); PyObject *names = PyTuple_New(n); PyObject *level; @@ -2380,6 +2462,7 @@ compiler_assert(struct compiler *c, stmt_ty s) { static PyObject *assertion_error = NULL; basicblock *end; + PyObject* msg; if (c->c_optimize) return 1; @@ -2390,11 +2473,17 @@ compiler_assert(struct compiler *c, stmt_ty s) } if (s->v.Assert.test->kind == Tuple_kind && asdl_seq_LEN(s->v.Assert.test->v.Tuple.elts) > 0) { - const char* msg = - "assertion is always true, perhaps remove parentheses?"; - if (PyErr_WarnExplicit(PyExc_SyntaxWarning, msg, c->c_filename, - c->u->u_lineno, NULL, NULL) == -1) + msg = PyUnicode_FromString("assertion is always true, " + "perhaps remove parentheses?"); + if (msg == NULL) return 0; + if (PyErr_WarnExplicitObject(PyExc_SyntaxWarning, msg, + c->c_filename, c->u->u_lineno, + NULL, NULL) == -1) { + Py_DECREF(msg); + return 0; + } + Py_DECREF(msg); } VISIT(c, expr, s->v.Assert.test); end = compiler_new_block(c); @@ -2414,7 +2503,7 @@ compiler_assert(struct compiler *c, stmt_ty s) static int compiler_visit_stmt(struct compiler *c, stmt_ty s) { - int i, n; + Py_ssize_t i, n; /* Always assign a lineno to the next instruction for a stmt. */ c->u->u_lineno = s->lineno; @@ -2462,12 +2551,12 @@ compiler_visit_stmt(struct compiler *c, stmt_ty s) if (s->v.Raise.exc) { VISIT(c, expr, s->v.Raise.exc); n++; - if (s->v.Raise.cause) { - VISIT(c, expr, s->v.Raise.cause); - n++; - } + if (s->v.Raise.cause) { + VISIT(c, expr, s->v.Raise.cause); + n++; + } } - ADDOP_I(c, RAISE_VARARGS, n); + ADDOP_I(c, RAISE_VARARGS, (int)n); break; case Try_kind: return compiler_try(c, s); @@ -2627,7 +2716,8 @@ inplace_binop(struct compiler *c, operator_ty op) static int compiler_nameop(struct compiler *c, identifier name, expr_context_ty ctx) { - int op, scope, arg; + int op, scope; + Py_ssize_t arg; enum { OP_FAST, OP_GLOBAL, OP_DEREF, OP_NAME } optype; PyObject *dict = c->u->u_names; @@ -2638,6 +2728,10 @@ compiler_nameop(struct compiler *c, identifier name, expr_context_ty ctx) if (!mangled) return 0; + assert(PyUnicode_CompareWithASCIIString(name, "None") && + PyUnicode_CompareWithASCIIString(name, "True") && + PyUnicode_CompareWithASCIIString(name, "False")); + op = 0; optype = OP_NAME; scope = PyST_GetScope(c->u->u_ste, mangled); @@ -2673,7 +2767,9 @@ compiler_nameop(struct compiler *c, identifier name, expr_context_ty ctx) switch (optype) { case OP_DEREF: switch (ctx) { - case Load: op = LOAD_DEREF; break; + case Load: + op = (c->u->u_ste->ste_type == ClassBlock) ? LOAD_CLASSDEREF : LOAD_DEREF; + break; case Store: op = STORE_DEREF; break; case AugLoad: case AugStore: @@ -2747,7 +2843,8 @@ static int compiler_boolop(struct compiler *c, expr_ty e) { basicblock *end; - int jumpi, i, n; + int jumpi; + Py_ssize_t i, n; asdl_seq *s; assert(e->kind == BoolOp_kind); @@ -2773,7 +2870,7 @@ compiler_boolop(struct compiler *c, expr_ty e) static int compiler_list(struct compiler *c, expr_ty e) { - int n = asdl_seq_LEN(e->v.List.elts); + Py_ssize_t n = asdl_seq_LEN(e->v.List.elts); if (e->v.List.ctx == Store) { int i, seen_star = 0; for (i = 0; i < n; i++) { @@ -2806,7 +2903,7 @@ compiler_list(struct compiler *c, expr_ty e) static int compiler_tuple(struct compiler *c, expr_ty e) { - int n = asdl_seq_LEN(e->v.Tuple.elts); + Py_ssize_t n = asdl_seq_LEN(e->v.Tuple.elts); if (e->v.Tuple.ctx == Store) { int i, seen_star = 0; for (i = 0; i < n; i++) { @@ -2839,7 +2936,7 @@ compiler_tuple(struct compiler *c, expr_ty e) static int compiler_compare(struct compiler *c, expr_ty e) { - int i, n; + Py_ssize_t i, n; basicblock *cleanup = NULL; /* XXX the logic can be cleaned up for 1 or multiple comparisons */ @@ -2895,11 +2992,11 @@ compiler_call(struct compiler *c, expr_ty e) /* shared code between compiler_call and compiler_class */ static int compiler_call_helper(struct compiler *c, - int n, /* Args already pushed */ - asdl_seq *args, - asdl_seq *keywords, - expr_ty starargs, - expr_ty kwargs) + Py_ssize_t n, /* Args already pushed */ + asdl_seq *args, + asdl_seq *keywords, + expr_ty starargs, + expr_ty kwargs) { int code = 0; @@ -2960,7 +3057,7 @@ compiler_comprehension_generator(struct compiler *c, comprehension_ty gen; basicblock *start, *anchor, *skip, *if_cleanup; - int i, n; + Py_ssize_t i, n; start = compiler_new_block(c); skip = compiler_new_block(c); @@ -3085,9 +3182,10 @@ compiler_comprehension(struct compiler *c, expr_ty e, int type, identifier name, } co = assemble(c, 1); - qualname = compiler_scope_qualname(c); + qualname = c->u->u_qualname; + Py_INCREF(qualname); compiler_exit_scope(c); - if (qualname == NULL || co == NULL) + if (co == NULL) goto error; if (!compiler_make_closure(c, co, 0, qualname)) @@ -3197,12 +3295,18 @@ expr_constant(struct compiler *c, expr_ty e) case Name_kind: /* optimize away names that can't be reassigned */ id = PyUnicode_AsUTF8(e->v.Name.id); - if (strcmp(id, "True") == 0) return 1; - if (strcmp(id, "False") == 0) return 0; - if (strcmp(id, "None") == 0) return 0; - if (strcmp(id, "__debug__") == 0) - return ! c->c_optimize; - /* fall through */ + if (id && strcmp(id, "__debug__") == 0) + return !c->c_optimize; + return -1; + case NameConstant_kind: { + PyObject *o = e->v.NameConstant.value; + if (o == Py_None) + return 0; + else if (o == Py_True) + return 1; + else if (o == Py_False) + return 0; + } default: return -1; } @@ -3226,9 +3330,9 @@ expr_constant(struct compiler *c, expr_ty e) BLOCK finally: if an exception was raised: - exc = copy of (exception, instance, traceback) + exc = copy of (exception, instance, traceback) else: - exc = (None, None, None) + exc = (None, None, None) exit(*exc) */ static int @@ -3292,7 +3396,7 @@ compiler_with(struct compiler *c, stmt_ty s, int pos) static int compiler_visit_expr(struct compiler *c, expr_ty e) { - int i, n; + Py_ssize_t i, n; /* If expr e has a different line number than the last expr/stmt, set a new line number for the next instruction. @@ -3321,6 +3425,8 @@ compiler_visit_expr(struct compiler *c, expr_ty e) return compiler_ifexp(c, e); case Dict_kind: n = asdl_seq_LEN(e->v.Dict.values); + /* BUILD_MAP parameter is only used to preallocate the dictionary, + it doesn't need to be exact */ ADDOP_I(c, BUILD_MAP, (n>0xFFFF ? 0xFFFF : n)); for (i = 0; i < n; i++) { VISIT(c, expr, @@ -3378,6 +3484,9 @@ compiler_visit_expr(struct compiler *c, expr_ty e) case Ellipsis_kind: ADDOP_O(c, LOAD_CONST, Py_Ellipsis, consts); break; + case NameConstant_kind: + ADDOP_O(c, LOAD_CONST, e->v.NameConstant.value, consts); + break; /* The following exprs can be assignment targets. */ case Attribute_kind: if (e->v.Attribute.ctx != AugStore) @@ -3547,12 +3656,12 @@ compiler_error(struct compiler *c, const char *errstr) PyObject *loc; PyObject *u = NULL, *v = NULL; - loc = PyErr_ProgramText(c->c_filename, c->u->u_lineno); + loc = PyErr_ProgramTextObject(c->c_filename, c->u->u_lineno); if (!loc) { Py_INCREF(Py_None); loc = Py_None; } - u = Py_BuildValue("(OiiO)", c->c_filename_obj, c->u->u_lineno, + u = Py_BuildValue("(OiiO)", c->c_filename, c->u->u_lineno, c->u->u_col_offset, loc); if (!u) goto exit; @@ -3665,7 +3774,7 @@ compiler_visit_slice(struct compiler *c, slice_ty s, expr_context_ty ctx) case ExtSlice_kind: kindname = "extended slice"; if (ctx != AugStore) { - int i, n = asdl_seq_LEN(s->v.ExtSlice.dims); + Py_ssize_t i, n = asdl_seq_LEN(s->v.ExtSlice.dims); for (i = 0; i < n; i++) { slice_ty sub = (slice_ty)asdl_seq_GET( s->v.ExtSlice.dims, i); @@ -3724,7 +3833,7 @@ dfs(struct compiler *c, basicblock *b, struct assembler *a) static int stackdepth_walk(struct compiler *c, basicblock *b, int depth, int maxdepth) { - int i, target_depth; + int i, target_depth, effect; struct instr *instr; if (b->b_seen || b->b_startdepth >= depth) return maxdepth; @@ -3732,7 +3841,13 @@ stackdepth_walk(struct compiler *c, basicblock *b, int depth, int maxdepth) b->b_startdepth = depth; for (i = 0; i < b->b_iused; i++) { instr = &b->b_instr[i]; - depth += opcode_stack_effect(instr->i_opcode, instr->i_oparg); + effect = PyCompile_OpcodeStackEffect(instr->i_opcode, instr->i_oparg); + if (effect == PY_INVALID_STACK_EFFECT) { + fprintf(stderr, "opcode = %d\n", instr->i_opcode); + Py_FatalError("PyCompile_OpcodeStackEffect()"); + } + depth += effect; + if (depth > maxdepth) maxdepth = depth; assert(depth >= 0); /* invalid code or bug in stackdepth() */ @@ -3740,12 +3855,16 @@ stackdepth_walk(struct compiler *c, basicblock *b, int depth, int maxdepth) target_depth = depth; if (instr->i_opcode == FOR_ITER) { target_depth = depth-2; - } else if (instr->i_opcode == SETUP_FINALLY || - instr->i_opcode == SETUP_EXCEPT) { + } + else if (instr->i_opcode == SETUP_FINALLY || + instr->i_opcode == SETUP_EXCEPT) { target_depth = depth+3; if (target_depth > maxdepth) maxdepth = target_depth; } + else if (instr->i_opcode == JUMP_IF_TRUE_OR_POP || + instr->i_opcode == JUMP_IF_FALSE_OR_POP) + depth = depth - 1; maxdepth = stackdepth_walk(c, instr->i_target, target_depth, maxdepth); if (instr->i_opcode == JUMP_ABSOLUTE || @@ -3790,7 +3909,7 @@ assemble_init(struct assembler *a, int nblocks, int firstlineno) a->a_lnotab = PyBytes_FromStringAndSize(NULL, DEFAULT_LNOTAB_SIZE); if (!a->a_lnotab) return 0; - if (nblocks > PY_SIZE_MAX / sizeof(basicblock *)) { + if ((size_t)nblocks > PY_SIZE_MAX / sizeof(basicblock *)) { PyErr_NoMemory(); return 0; } @@ -3843,7 +3962,7 @@ static int assemble_lnotab(struct assembler *a, struct instr *i) { int d_bytecode, d_lineno; - int len; + Py_ssize_t len; unsigned char *lnotab; d_bytecode = a->a_offset - a->a_lineno_off; @@ -4034,7 +4153,7 @@ assemble_jump_offsets(struct assembler *a, struct compiler *c) } static PyObject * -dict_keys_inorder(PyObject *dict, int offset) +dict_keys_inorder(PyObject *dict, Py_ssize_t offset) { PyObject *tuple, *k, *v; Py_ssize_t i, pos = 0, size = PyDict_Size(dict); @@ -4059,10 +4178,10 @@ static int compute_code_flags(struct compiler *c) { PySTEntryObject *ste = c->u->u_ste; - int flags = 0, n; - if (ste->ste_type != ModuleBlock) - flags |= CO_NEWLOCALS; + int flags = 0; + Py_ssize_t n; if (ste->ste_type == FunctionBlock) { + flags |= CO_NEWLOCALS; if (!ste->ste_unoptimized) flags |= CO_OPTIMIZED; if (ste->ste_nested) @@ -4084,9 +4203,9 @@ compute_code_flags(struct compiler *c) if (n == 0) { n = PyDict_Size(c->u->u_cellvars); if (n < 0) - return -1; + return -1; if (n == 0) { - flags |= CO_NOFREE; + flags |= CO_NOFREE; } } @@ -4105,7 +4224,10 @@ makecode(struct compiler *c, struct assembler *a) PyObject *freevars = NULL; PyObject *cellvars = NULL; PyObject *bytecode = NULL; - int nlocals, flags; + Py_ssize_t nlocals; + int nlocals_int; + int flags; + int argcount, kwonlyargcount; tmp = dict_keys_inorder(c->u->u_consts, 0); if (!tmp) @@ -4124,7 +4246,11 @@ makecode(struct compiler *c, struct assembler *a) freevars = dict_keys_inorder(c->u->u_freevars, PyTuple_Size(cellvars)); if (!freevars) goto error; + nlocals = PyDict_Size(c->u->u_varnames); + assert(nlocals < INT_MAX); + nlocals_int = Py_SAFE_DOWNCAST(nlocals, Py_ssize_t, int); + flags = compute_code_flags(c); if (flags < 0) goto error; @@ -4139,11 +4265,13 @@ makecode(struct compiler *c, struct assembler *a) Py_DECREF(consts); consts = tmp; - co = PyCode_New(c->u->u_argcount, c->u->u_kwonlyargcount, - nlocals, stackdepth(c), flags, + argcount = Py_SAFE_DOWNCAST(c->u->u_argcount, Py_ssize_t, int); + kwonlyargcount = Py_SAFE_DOWNCAST(c->u->u_kwonlyargcount, Py_ssize_t, int); + co = PyCode_New(argcount, kwonlyargcount, + nlocals_int, stackdepth(c), flags, bytecode, consts, names, varnames, freevars, cellvars, - c->c_filename_obj, c->u->u_name, + c->c_filename, c->u->u_name, c->u->u_firstlineno, a->a_lnotab); error: @@ -4259,4 +4387,3 @@ PyAST_Compile(mod_ty mod, const char *filename, PyCompilerFlags *flags, return PyAST_CompileEx(mod, filename, flags, -1, arena); } - diff --git a/Python/condvar.h b/Python/condvar.h index 19474ef..ef818c4 100644 --- a/Python/condvar.h +++ b/Python/condvar.h @@ -241,7 +241,7 @@ _PyCOND_WAIT_MS(PyCOND_T *cv, PyMUTEX_T *cs, DWORD ms) * but we are safe because we are using a semaphore wich has an internal * count. */ - wait = WaitForSingleObject(cv->sem, ms); + wait = WaitForSingleObjectEx(cv->sem, ms, FALSE); PyMUTEX_LOCK(cs); if (wait != WAIT_OBJECT_0) --cv->waiting; diff --git a/Python/dynload_aix.c b/Python/dynload_aix.c index f40a0be..5ac30ed 100644 --- a/Python/dynload_aix.c +++ b/Python/dynload_aix.c @@ -30,11 +30,11 @@ const char *_PyImport_DynLoadFiletab[] = {".so", NULL}; static int aix_getoldmodules(void **modlistptr) { - register ModulePtr modptr, prevmodptr; - register struct ld_info *ldiptr; - register char *ldibuf; - register int errflag, bufsize = 1024; - register unsigned int offset; + ModulePtr modptr, prevmodptr; + struct ld_info *ldiptr; + char *ldibuf; + int errflag, bufsize = 1024; + unsigned int offset; char *progname = Py_GetProgramName(); /* @@ -106,7 +106,7 @@ aix_loaderror(const char *pathname) char *message[1024], errbuf[1024]; PyObject *pathname_ob = NULL; PyObject *errbuf_ob = NULL; - register int i,j; + int i,j; struct errtab { int errNo; diff --git a/Python/dynload_os2.c b/Python/dynload_os2.c deleted file mode 100644 index 0e1b907..0000000 --- a/Python/dynload_os2.c +++ /dev/null @@ -1,42 +0,0 @@ - -/* Support for dynamic loading of extension modules */ - -#define INCL_DOSERRORS -#define INCL_DOSMODULEMGR -#include <os2.h> - -#include "Python.h" -#include "importdl.h" - - -const char *_PyImport_DynLoadFiletab[] = {".pyd", ".dll", NULL}; - -dl_funcptr _PyImport_GetDynLoadFunc(const char *shortname, - const char *pathname, FILE *fp) -{ - dl_funcptr p; - APIRET rc; - HMODULE hDLL; - char failreason[256]; - char funcname[258]; - - rc = DosLoadModule(failreason, - sizeof(failreason), - pathname, - &hDLL); - - if (rc != NO_ERROR) { - char errBuf[256]; - PyOS_snprintf(errBuf, sizeof(errBuf), - "DLL load failed, rc = %d: %.200s", - rc, failreason); - PyErr_SetString(PyExc_ImportError, errBuf); - return NULL; - } - - PyOS_snprintf(funcname, sizeof(funcname), "PyInit_%.200s", shortname); - rc = DosQueryProcAddr(hDLL, 0L, funcname, &p); - if (rc != NO_ERROR) - p = NULL; /* Signify Failure to Acquire Entrypoint */ - return p; -} diff --git a/Python/dynload_shlib.c b/Python/dynload_shlib.c index 75544ed..5cd1efd 100644 --- a/Python/dynload_shlib.c +++ b/Python/dynload_shlib.c @@ -18,10 +18,6 @@ #ifdef HAVE_DLFCN_H #include <dlfcn.h> -#else -#if defined(PYOS_OS2) && defined(PYCC_GCC) -#include "dlfcn.h" -#endif #endif #if (defined(__OpenBSD__) || defined(__NetBSD__)) && !defined(__ELF__) @@ -40,30 +36,16 @@ const char *_PyImport_DynLoadFiletab[] = { #ifdef __CYGWIN__ ".dll", #else /* !__CYGWIN__ */ -#if defined(PYOS_OS2) && defined(PYCC_GCC) - ".pyd", - ".dll", -#else /* !(defined(PYOS_OS2) && defined(PYCC_GCC)) */ -#ifdef __VMS - ".exe", - ".EXE", -#else /* !__VMS */ "." SOABI ".so", ".abi" PYTHON_ABI_STRING ".so", ".so", -#endif /* __VMS */ -#endif /* defined(PYOS_OS2) && defined(PYCC_GCC) */ #endif /* __CYGWIN__ */ NULL, }; static struct { dev_t dev; -#ifdef __VMS - ino_t ino[3]; -#else ino_t ino; -#endif void *handle; } handles[128]; static int nhandles = 0; @@ -104,47 +86,39 @@ dl_funcptr _PyImport_GetDynLoadFunc(const char *shortname, } if (nhandles < 128) { handles[nhandles].dev = statb.st_dev; -#ifdef __VMS - handles[nhandles].ino[0] = statb.st_ino[0]; - handles[nhandles].ino[1] = statb.st_ino[1]; - handles[nhandles].ino[2] = statb.st_ino[2]; -#else handles[nhandles].ino = statb.st_ino; -#endif } } -#if !(defined(PYOS_OS2) && defined(PYCC_GCC)) dlopenflags = PyThreadState_GET()->interp->dlopenflags; -#endif - -#ifdef __VMS - /* VMS currently don't allow a pathname, use a logical name instead */ - /* Concatenate 'python_module_' and shortname */ - /* so "import vms.bar" will use the logical python_module_bar */ - /* As C module use only one name space this is probably not a */ - /* important limitation */ - PyOS_snprintf(pathbuf, sizeof(pathbuf), "python_module_%-.200s", - shortname); - pathname = pathbuf; -#endif handle = dlopen(pathname, dlopenflags); if (handle == NULL) { - PyObject *mod_name = NULL; - PyObject *path = NULL; - PyObject *error_ob = NULL; + PyObject *mod_name; + PyObject *path; + PyObject *error_ob; const char *error = dlerror(); if (error == NULL) error = "unknown dlopen() error"; error_ob = PyUnicode_FromString(error); - path = PyUnicode_FromString(pathname); + if (error_ob == NULL) + return NULL; mod_name = PyUnicode_FromString(shortname); + if (mod_name == NULL) { + Py_DECREF(error_ob); + return NULL; + } + path = PyUnicode_FromString(pathname); + if (path == NULL) { + Py_DECREF(error_ob); + Py_DECREF(mod_name); + return NULL; + } PyErr_SetImportError(error_ob, mod_name, path); - Py_XDECREF(error_ob); - Py_XDECREF(path); - Py_XDECREF(mod_name); + Py_DECREF(error_ob); + Py_DECREF(mod_name); + Py_DECREF(path); return NULL; } if (fp != NULL && nhandles < 128) diff --git a/Python/errors.c b/Python/errors.c index 626b16e..b0ad9aa 100644 --- a/Python/errors.c +++ b/Python/errors.c @@ -20,6 +20,9 @@ extern char *strerror(int); extern "C" { #endif +_Py_IDENTIFIER(builtins); +_Py_IDENTIFIER(stderr); + void PyErr_Restore(PyObject *type, PyObject *value, PyObject *traceback) @@ -71,6 +74,11 @@ PyErr_SetObject(PyObject *exception, PyObject *value) if (value == NULL || !PyExceptionInstance_Check(value)) { /* We must normalize the value right now */ PyObject *args, *fixed_value; +#ifdef Py_DEBUG + /* in debug mode, PyEval_EvalFrameEx() fails with an assertion + error if an exception is set when it is called */ + PyErr_Clear(); +#endif if (value == NULL || value == Py_None) args = PyTuple_New(0); else if (PyTuple_Check(value)) { @@ -112,6 +120,20 @@ PyErr_SetObject(PyObject *exception, PyObject *value) PyErr_Restore(exception, value, tb); } +/* Set a key error with the specified argument, wrapping it in a + * tuple automatically so that tuple keys are not unpacked as the + * exception arguments. */ +void +_PyErr_SetKeyError(PyObject *arg) +{ + PyObject *tup; + tup = PyTuple_Pack(1, arg); + if (!tup) + return; /* caller will expect error to be set anyway */ + PyErr_SetObject(PyExc_KeyError, tup); + Py_DECREF(tup); +} + void PyErr_SetNone(PyObject *exception) { @@ -227,12 +249,21 @@ PyErr_NormalizeException(PyObject **exc, PyObject **val, PyObject **tb) value will be an instance. */ if (PyExceptionClass_Check(type)) { + int is_subclass; + if (inclass) { + is_subclass = PyObject_IsSubclass(inclass, type); + if (is_subclass < 0) + goto finally; + } + else + is_subclass = 0; + /* if the value was not an instance, or is not an instance whose class is (or is derived from) type, then use the value as an argument to instantiation of the type class. */ - if (!inclass || !PyObject_IsSubclass(inclass, type)) { + if (!inclass || !is_subclass) { PyObject *args, *res; if (value == Py_None) @@ -353,6 +384,30 @@ PyErr_SetExcInfo(PyObject *p_type, PyObject *p_value, PyObject *p_traceback) Py_XDECREF(oldtraceback); } +/* Like PyErr_Restore(), but if an exception is already set, + set the context associated with it. + */ +void +_PyErr_ChainExceptions(PyObject *exc, PyObject *val, PyObject *tb) +{ + if (exc == NULL) + return; + + if (PyErr_Occurred()) { + PyObject *exc2, *val2, *tb2; + PyErr_Fetch(&exc2, &val2, &tb2); + PyErr_NormalizeException(&exc, &val, &tb); + Py_DECREF(exc); + Py_XDECREF(tb); + PyErr_NormalizeException(&exc2, &val2, &tb2); + PyException_SetContext(val2, val); + PyErr_Restore(exc2, val2, tb2); + } + else { + PyErr_Restore(exc, val, tb); + } +} + /* Convenience functions to set a type error exception and return 0 */ int @@ -366,6 +421,12 @@ PyErr_BadArgument(void) PyObject * PyErr_NoMemory(void) { + if (Py_TYPE(PyExc_MemoryError) == NULL) { + /* PyErr_NoMemory() has been called before PyExc_MemoryError has been + initialized by _PyExc_Init() */ + Py_FatalError("Out of memory and PyExc_MemoryError is not " + "initialized yet"); + } PyErr_SetNone(PyExc_MemoryError); return NULL; } @@ -373,6 +434,12 @@ PyErr_NoMemory(void) PyObject * PyErr_SetFromErrnoWithFilenameObject(PyObject *exc, PyObject *filenameObject) { + return PyErr_SetFromErrnoWithFilenameObjects(exc, filenameObject, NULL); +} + +PyObject * +PyErr_SetFromErrnoWithFilenameObjects(PyObject *exc, PyObject *filenameObject, PyObject *filenameObject2) +{ PyObject *message; PyObject *v, *args; int i = errno; @@ -424,7 +491,7 @@ PyErr_SetFromErrnoWithFilenameObject(PyObject *exc, PyObject *filenameObject) /* Only ever seen this in out-of-mem situations */ s_buf = NULL; - message = PyUnicode_FromFormat("Windows Error 0x%X", i); + message = PyUnicode_FromFormat("Windows Error 0x%x", i); } else { /* remove trailing cr/lf and dots */ while (len > 0 && (s_buf[len-1] <= L' ' || s_buf[len-1] == L'.')) @@ -443,10 +510,15 @@ PyErr_SetFromErrnoWithFilenameObject(PyObject *exc, PyObject *filenameObject) return NULL; } - if (filenameObject != NULL) - args = Py_BuildValue("(iOO)", i, message, filenameObject); - else + if (filenameObject != NULL) { + if (filenameObject2 != NULL) + args = Py_BuildValue("(iOOiO)", i, message, filenameObject, 0, filenameObject2); + else + args = Py_BuildValue("(iOO)", i, message, filenameObject); + } else { + assert(filenameObject2 == NULL); args = Py_BuildValue("(iO)", i, message); + } Py_DECREF(message); if (args != NULL) { @@ -463,12 +535,11 @@ PyErr_SetFromErrnoWithFilenameObject(PyObject *exc, PyObject *filenameObject) return NULL; } - PyObject * PyErr_SetFromErrnoWithFilename(PyObject *exc, const char *filename) { PyObject *name = filename ? PyUnicode_DecodeFSDefault(filename) : NULL; - PyObject *result = PyErr_SetFromErrnoWithFilenameObject(exc, name); + PyObject *result = PyErr_SetFromErrnoWithFilenameObjects(exc, name, NULL); Py_XDECREF(name); return result; } @@ -480,7 +551,7 @@ PyErr_SetFromErrnoWithUnicodeFilename(PyObject *exc, const Py_UNICODE *filename) PyObject *name = filename ? PyUnicode_FromUnicode(filename, wcslen(filename)) : NULL; - PyObject *result = PyErr_SetFromErrnoWithFilenameObject(exc, name); + PyObject *result = PyErr_SetFromErrnoWithFilenameObjects(exc, name, NULL); Py_XDECREF(name); return result; } @@ -489,7 +560,7 @@ PyErr_SetFromErrnoWithUnicodeFilename(PyObject *exc, const Py_UNICODE *filename) PyObject * PyErr_SetFromErrno(PyObject *exc) { - return PyErr_SetFromErrnoWithFilenameObject(exc, NULL); + return PyErr_SetFromErrnoWithFilenameObjects(exc, NULL, NULL); } #ifdef MS_WINDOWS @@ -499,6 +570,16 @@ PyObject *PyErr_SetExcFromWindowsErrWithFilenameObject( int ierr, PyObject *filenameObject) { + return PyErr_SetExcFromWindowsErrWithFilenameObjects(exc, ierr, + filenameObject, NULL); +} + +PyObject *PyErr_SetExcFromWindowsErrWithFilenameObjects( + PyObject *exc, + int ierr, + PyObject *filenameObject, + PyObject *filenameObject2) +{ int len; WCHAR *s_buf = NULL; /* Free via LocalFree */ PyObject *message; @@ -519,7 +600,7 @@ PyObject *PyErr_SetExcFromWindowsErrWithFilenameObject( NULL); /* no args */ if (len==0) { /* Only seen this in out of mem situations */ - message = PyUnicode_FromFormat("Windows Error 0x%X", err); + message = PyUnicode_FromFormat("Windows Error 0x%x", err); s_buf = NULL; } else { /* remove trailing cr/lf and dots */ @@ -534,11 +615,15 @@ PyObject *PyErr_SetExcFromWindowsErrWithFilenameObject( return NULL; } - if (filenameObject == NULL) - filenameObject = Py_None; - /* This is the constructor signature for passing a Windows error code. + if (filenameObject == NULL) { + assert(filenameObject2 == NULL); + filenameObject = filenameObject2 = Py_None; + } + else if (filenameObject2 == NULL) + filenameObject2 = Py_None; + /* This is the constructor signature for OSError. The POSIX translation will be figured out by the constructor. */ - args = Py_BuildValue("(iOOi)", 0, message, filenameObject, err); + args = Py_BuildValue("(iOOiO)", 0, message, filenameObject, err, filenameObject2); Py_DECREF(message); if (args != NULL) { @@ -559,9 +644,10 @@ PyObject *PyErr_SetExcFromWindowsErrWithFilename( const char *filename) { PyObject *name = filename ? PyUnicode_DecodeFSDefault(filename) : NULL; - PyObject *ret = PyErr_SetExcFromWindowsErrWithFilenameObject(exc, + PyObject *ret = PyErr_SetExcFromWindowsErrWithFilenameObjects(exc, ierr, - name); + name, + NULL); Py_XDECREF(name); return ret; } @@ -574,9 +660,10 @@ PyObject *PyErr_SetExcFromWindowsErrWithUnicodeFilename( PyObject *name = filename ? PyUnicode_FromUnicode(filename, wcslen(filename)) : NULL; - PyObject *ret = PyErr_SetExcFromWindowsErrWithFilenameObject(exc, + PyObject *ret = PyErr_SetExcFromWindowsErrWithFilenameObjects(exc, ierr, - name); + name, + NULL); Py_XDECREF(name); return ret; } @@ -588,17 +675,18 @@ PyObject *PyErr_SetExcFromWindowsErr(PyObject *exc, int ierr) PyObject *PyErr_SetFromWindowsErr(int ierr) { - return PyErr_SetExcFromWindowsErrWithFilename(PyExc_WindowsError, + return PyErr_SetExcFromWindowsErrWithFilename(PyExc_OSError, ierr, NULL); } + PyObject *PyErr_SetFromWindowsErrWithFilename( int ierr, const char *filename) { PyObject *name = filename ? PyUnicode_DecodeFSDefault(filename) : NULL; - PyObject *result = PyErr_SetExcFromWindowsErrWithFilenameObject( - PyExc_WindowsError, - ierr, name); + PyObject *result = PyErr_SetExcFromWindowsErrWithFilenameObjects( + PyExc_OSError, + ierr, name, NULL); Py_XDECREF(name); return result; } @@ -610,9 +698,9 @@ PyObject *PyErr_SetFromWindowsErrWithUnicodeFilename( PyObject *name = filename ? PyUnicode_FromUnicode(filename, wcslen(filename)) : NULL; - PyObject *result = PyErr_SetExcFromWindowsErrWithFilenameObject( - PyExc_WindowsError, - ierr, name); + PyObject *result = PyErr_SetExcFromWindowsErrWithFilenameObjects( + PyExc_OSError, + ierr, name, NULL); Py_XDECREF(name); return result; } @@ -646,8 +734,11 @@ PyErr_SetImportError(PyObject *msg, PyObject *name, PyObject *path) Py_INCREF(msg); PyTuple_SET_ITEM(args, 0, msg); - PyDict_SetItemString(kwargs, "name", name); - PyDict_SetItemString(kwargs, "path", path); + + if (PyDict_SetItemString(kwargs, "name", name) < 0) + return NULL; + if (PyDict_SetItemString(kwargs, "path", path) < 0) + return NULL; error = PyObject_Call(PyExc_ImportError, args, kwargs); if (error != NULL) { @@ -675,6 +766,7 @@ _PyErr_BadInternalCall(const char *filename, int lineno) void PyErr_BadInternalCall(void) { + assert(0 && "bad argument to internal function"); PyErr_Format(PyExc_SystemError, "bad argument to internal function"); } @@ -694,6 +786,12 @@ PyErr_Format(PyObject *exception, const char *format, ...) va_start(vargs); #endif +#ifdef Py_DEBUG + /* in debug mode, PyEval_EvalFrameEx() fails with an assertion error + if an exception is set when it is called */ + PyErr_Clear(); +#endif + string = PyUnicode_FromFormatV(format, vargs); PyErr_SetObject(exception, string); Py_XDECREF(string); @@ -795,60 +893,84 @@ PyErr_WriteUnraisable(PyObject *obj) { _Py_IDENTIFIER(__module__); PyObject *f, *t, *v, *tb; + PyObject *moduleName = NULL; + char* className; + PyErr_Fetch(&t, &v, &tb); - f = PySys_GetObject("stderr"); - if (f != NULL && f != Py_None) { - PyFile_WriteString("Exception ", f); - if (t) { - PyObject* moduleName; - char* className; - assert(PyExceptionClass_Check(t)); - className = PyExceptionClass_Name(t); - if (className != NULL) { - char *dot = strrchr(className, '.'); - if (dot != NULL) - className = dot+1; - } - moduleName = _PyObject_GetAttrId(t, &PyId___module__); - if (moduleName == NULL) - PyFile_WriteString("<unknown>", f); - else { - char* modstr = _PyUnicode_AsString(moduleName); - if (modstr && - strcmp(modstr, "builtins") != 0) - { - PyFile_WriteString(modstr, f); - PyFile_WriteString(".", f); - } - } - if (className == NULL) - PyFile_WriteString("<unknown>", f); - else - PyFile_WriteString(className, f); - if (v && v != Py_None) { - PyFile_WriteString(": ", f); - PyFile_WriteObject(v, f, 0); - } - Py_XDECREF(moduleName); - } - if (obj) { - PyFile_WriteString(" in ", f); - PyFile_WriteObject(obj, f, 0); + f = _PySys_GetObjectId(&PyId_stderr); + if (f == NULL || f == Py_None) + goto done; + + if (obj) { + if (PyFile_WriteString("Exception ignored in: ", f) < 0) + goto done; + if (PyFile_WriteObject(obj, f, 0) < 0) + goto done; + if (PyFile_WriteString("\n", f) < 0) + goto done; + } + + if (PyTraceBack_Print(tb, f) < 0) + goto done; + + if (!t) + goto done; + + assert(PyExceptionClass_Check(t)); + className = PyExceptionClass_Name(t); + if (className != NULL) { + char *dot = strrchr(className, '.'); + if (dot != NULL) + className = dot+1; + } + + moduleName = _PyObject_GetAttrId(t, &PyId___module__); + if (moduleName == NULL) { + PyErr_Clear(); + if (PyFile_WriteString("<unknown>", f) < 0) + goto done; + } + else { + if (_PyUnicode_CompareWithId(moduleName, &PyId_builtins) != 0) { + if (PyFile_WriteObject(moduleName, f, Py_PRINT_RAW) < 0) + goto done; + if (PyFile_WriteString(".", f) < 0) + goto done; } - PyFile_WriteString(" ignored\n", f); - PyErr_Clear(); /* Just in case */ } + if (className == NULL) { + if (PyFile_WriteString("<unknown>", f) < 0) + goto done; + } + else { + if (PyFile_WriteString(className, f) < 0) + goto done; + } + + if (v && v != Py_None) { + if (PyFile_WriteString(": ", f) < 0) + goto done; + if (PyFile_WriteObject(v, f, Py_PRINT_RAW) < 0) + goto done; + } + if (PyFile_WriteString("\n", f) < 0) + goto done; + +done: + Py_XDECREF(moduleName); Py_XDECREF(t); Py_XDECREF(v); Py_XDECREF(tb); + PyErr_Clear(); /* Just in case */ } extern PyObject *PyModule_GetWarningsModule(void); void -PyErr_SyntaxLocation(const char *filename, int lineno) { +PyErr_SyntaxLocation(const char *filename, int lineno) +{ PyErr_SyntaxLocationEx(filename, lineno, -1); } @@ -858,7 +980,7 @@ PyErr_SyntaxLocation(const char *filename, int lineno) { to make printing of exceptions believe it is a syntax error. */ void -PyErr_SyntaxLocationEx(const char *filename, int lineno, int col_offset) +PyErr_SyntaxLocationObject(PyObject *filename, int lineno, int col_offset) { PyObject *exc, *v, *tb, *tmp; _Py_IDENTIFIER(filename); @@ -892,16 +1014,10 @@ PyErr_SyntaxLocationEx(const char *filename, int lineno, int col_offset) } } if (filename != NULL) { - tmp = PyUnicode_DecodeFSDefault(filename); - if (tmp == NULL) + if (_PyObject_SetAttrId(v, &PyId_filename, filename)) PyErr_Clear(); - else { - if (_PyObject_SetAttrId(v, &PyId_filename, tmp)) - PyErr_Clear(); - Py_DECREF(tmp); - } - tmp = PyErr_ProgramText(filename, lineno); + tmp = PyErr_ProgramTextObject(filename, lineno); if (tmp) { if (_PyObject_SetAttrId(v, &PyId_text, tmp)) PyErr_Clear(); @@ -931,22 +1047,33 @@ PyErr_SyntaxLocationEx(const char *filename, int lineno, int col_offset) PyErr_Restore(exc, v, tb); } +void +PyErr_SyntaxLocationEx(const char *filename, int lineno, int col_offset) +{ + PyObject *fileobj; + if (filename != NULL) { + fileobj = PyUnicode_DecodeFSDefault(filename); + if (fileobj == NULL) + PyErr_Clear(); + } + else + fileobj = NULL; + PyErr_SyntaxLocationObject(fileobj, lineno, col_offset); + Py_XDECREF(fileobj); +} + /* Attempt to load the line of text that the exception refers to. If it fails, it will return NULL but will not set an exception. XXX The functionality of this function is quite similar to the functionality in tb_displayline() in traceback.c. */ -PyObject * -PyErr_ProgramText(const char *filename, int lineno) +static PyObject * +err_programtext(FILE *fp, int lineno) { - FILE *fp; int i; char linebuf[1000]; - if (filename == NULL || *filename == '\0' || lineno <= 0) - return NULL; - fp = fopen(filename, "r" PY_STDIOTEXTMODE); if (fp == NULL) return NULL; for (i = 0; i < lineno; i++) { @@ -977,6 +1104,26 @@ PyErr_ProgramText(const char *filename, int lineno) return NULL; } +PyObject * +PyErr_ProgramText(const char *filename, int lineno) +{ + FILE *fp; + if (filename == NULL || *filename == '\0' || lineno <= 0) + return NULL; + fp = _Py_fopen(filename, "r" PY_STDIOTEXTMODE); + return err_programtext(fp, lineno); +} + +PyObject * +PyErr_ProgramTextObject(PyObject *filename, int lineno) +{ + FILE *fp; + if (filename == NULL || lineno <= 0) + return NULL; + fp = _Py_fopen_obj(filename, "r" PY_STDIOTEXTMODE); + return err_programtext(fp, lineno); +} + #ifdef __cplusplus } #endif diff --git a/Python/fileutils.c b/Python/fileutils.c index 5c66ecf..31689c0 100644 --- a/Python/fileutils.c +++ b/Python/fileutils.c @@ -10,20 +10,39 @@ #include <langinfo.h> #endif +#ifdef HAVE_SYS_IOCTL_H +#include <sys/ioctl.h> +#endif + +#ifdef HAVE_FCNTL_H +#include <fcntl.h> +#endif /* HAVE_FCNTL_H */ + #ifdef __APPLE__ extern wchar_t* _Py_DecodeUTF8_surrogateescape(const char *s, Py_ssize_t size); #endif +#ifdef O_CLOEXEC +/* Does open() support the O_CLOEXEC flag? Possible values: + + -1: unknown + 0: open() ignores O_CLOEXEC flag, ex: Linux kernel older than 2.6.23 + 1: open() supports O_CLOEXEC flag, close-on-exec is set + + The flag is used by _Py_open(), io.FileIO and os.open() */ +int _Py_open_cloexec_works = -1; +#endif + PyObject * _Py_device_encoding(int fd) { -#if defined(MS_WINDOWS) || defined(MS_WIN64) +#if defined(MS_WINDOWS) UINT cp; #endif if (!_PyVerify_fd(fd) || !isatty(fd)) { Py_RETURN_NONE; } -#if defined(MS_WINDOWS) || defined(MS_WIN64) +#if defined(MS_WINDOWS) if (fd == 0) cp = GetConsoleCP(); else if (fd == 1 || fd == 2) @@ -61,7 +80,7 @@ extern int _Py_normalize_encoding(const char *, char *, size_t); workaround is also enabled on error, for example if getting the locale failed. - Values of locale_is_ascii: + Values of force_ascii: 1: the workaround is used: _Py_wchar2char() uses encode_ascii_surrogateescape() and _Py_char2wchar() uses @@ -205,7 +224,7 @@ decode_ascii_surrogateescape(const char *arg, size_t *size) if (argsize > PY_SSIZE_T_MAX/sizeof(wchar_t)) return NULL; - res = PyMem_Malloc(argsize*sizeof(wchar_t)); + res = PyMem_RawMalloc(argsize*sizeof(wchar_t)); if (!res) return NULL; @@ -233,7 +252,7 @@ decode_ascii_surrogateescape(const char *arg, size_t *size) Use _Py_wchar2char() to encode the character string back to a byte string. Return a pointer to a newly allocated wide character string (use - PyMem_Free() to free the memory) and write the number of written wide + PyMem_RawFree() to free the memory) and write the number of written wide characters excluding the null character into *size if size is not NULL, or NULL on error (decoding or memory allocation error). If size is not NULL, *size is set to (size_t)-1 on memory error and (size_t)-2 on decoding @@ -258,9 +277,9 @@ _Py_char2wchar(const char* arg, size_t *size) wchar_t *res; size_t argsize; size_t count; +#ifdef HAVE_MBRTOWC unsigned char *in; wchar_t *out; -#ifdef HAVE_MBRTOWC mbstate_t mbs; #endif @@ -292,7 +311,7 @@ _Py_char2wchar(const char* arg, size_t *size) argsize += 1; if (argsize > PY_SSIZE_T_MAX/sizeof(wchar_t)) goto oom; - res = (wchar_t *)PyMem_Malloc(argsize*sizeof(wchar_t)); + res = (wchar_t *)PyMem_RawMalloc(argsize*sizeof(wchar_t)); if (!res) goto oom; count = mbstowcs(res, arg, argsize); @@ -301,7 +320,7 @@ _Py_char2wchar(const char* arg, size_t *size) /* Only use the result if it contains no surrogate characters. */ for (tmp = res; *tmp != 0 && - (*tmp < 0xd800 || *tmp > 0xdfff); tmp++) + !Py_UNICODE_IS_SURROGATE(*tmp); tmp++) ; if (*tmp == 0) { if (size != NULL) @@ -309,7 +328,7 @@ _Py_char2wchar(const char* arg, size_t *size) return res; } } - PyMem_Free(res); + PyMem_RawFree(res); } /* Conversion failed. Fall back to escaping with surrogateescape. */ #ifdef HAVE_MBRTOWC @@ -320,7 +339,7 @@ _Py_char2wchar(const char* arg, size_t *size) argsize = strlen(arg) + 1; if (argsize > PY_SSIZE_T_MAX/sizeof(wchar_t)) goto oom; - res = (wchar_t*)PyMem_Malloc(argsize*sizeof(wchar_t)); + res = (wchar_t*)PyMem_RawMalloc(argsize*sizeof(wchar_t)); if (!res) goto oom; in = (unsigned char*)arg; @@ -336,7 +355,7 @@ _Py_char2wchar(const char* arg, size_t *size) since we provide everything that we have - unless there is a bug in the C library, or I misunderstood how mbrtowc works. */ - PyMem_Free(res); + PyMem_RawFree(res); if (size != NULL) *size = (size_t)-2; return NULL; @@ -349,7 +368,7 @@ _Py_char2wchar(const char* arg, size_t *size) memset(&mbs, 0, sizeof mbs); continue; } - if (*out >= 0xd800 && *out <= 0xdfff) { + if (Py_UNICODE_IS_SURROGATE(*out)) { /* Surrogate character. Escape the original byte sequence with surrogateescape. */ argsize -= converted; @@ -558,14 +577,235 @@ _Py_stat(PyObject *path, struct stat *statbuf) #endif -/* Open a file. Use _wfopen() on Windows, encode the path to the locale - encoding and use fopen() otherwise. */ +static int +get_inheritable(int fd, int raise) +{ +#ifdef MS_WINDOWS + HANDLE handle; + DWORD flags; + + if (!_PyVerify_fd(fd)) { + if (raise) + PyErr_SetFromErrno(PyExc_OSError); + return -1; + } + + handle = (HANDLE)_get_osfhandle(fd); + if (handle == INVALID_HANDLE_VALUE) { + if (raise) + PyErr_SetFromErrno(PyExc_OSError); + return -1; + } + + if (!GetHandleInformation(handle, &flags)) { + if (raise) + PyErr_SetFromWindowsErr(0); + return -1; + } + + return (flags & HANDLE_FLAG_INHERIT); +#else + int flags; + + flags = fcntl(fd, F_GETFD, 0); + if (flags == -1) { + if (raise) + PyErr_SetFromErrno(PyExc_OSError); + return -1; + } + return !(flags & FD_CLOEXEC); +#endif +} + +/* Get the inheritable flag of the specified file descriptor. + Return 1 if the file descriptor can be inherited, 0 if it cannot, + raise an exception and return -1 on error. */ +int +_Py_get_inheritable(int fd) +{ + return get_inheritable(fd, 1); +} + +static int +set_inheritable(int fd, int inheritable, int raise, int *atomic_flag_works) +{ +#ifdef MS_WINDOWS + HANDLE handle; + DWORD flags; +#else +#if defined(HAVE_SYS_IOCTL_H) && defined(FIOCLEX) && defined(FIONCLEX) + static int ioctl_works = -1; + int request; + int err; +#endif + int flags; + int res; +#endif + + /* atomic_flag_works can only be used to make the file descriptor + non-inheritable */ + assert(!(atomic_flag_works != NULL && inheritable)); + + if (atomic_flag_works != NULL && !inheritable) { + if (*atomic_flag_works == -1) { + int isInheritable = get_inheritable(fd, raise); + if (isInheritable == -1) + return -1; + *atomic_flag_works = !isInheritable; + } + + if (*atomic_flag_works) + return 0; + } + +#ifdef MS_WINDOWS + if (!_PyVerify_fd(fd)) { + if (raise) + PyErr_SetFromErrno(PyExc_OSError); + return -1; + } + + handle = (HANDLE)_get_osfhandle(fd); + if (handle == INVALID_HANDLE_VALUE) { + if (raise) + PyErr_SetFromErrno(PyExc_OSError); + return -1; + } + + if (inheritable) + flags = HANDLE_FLAG_INHERIT; + else + flags = 0; + if (!SetHandleInformation(handle, HANDLE_FLAG_INHERIT, flags)) { + if (raise) + PyErr_SetFromWindowsErr(0); + return -1; + } + return 0; + +#else + +#if defined(HAVE_SYS_IOCTL_H) && defined(FIOCLEX) && defined(FIONCLEX) + if (ioctl_works != 0) { + /* fast-path: ioctl() only requires one syscall */ + if (inheritable) + request = FIONCLEX; + else + request = FIOCLEX; + err = ioctl(fd, request, NULL); + if (!err) { + ioctl_works = 1; + return 0; + } + + if (errno != ENOTTY) { + if (raise) + PyErr_SetFromErrno(PyExc_OSError); + return -1; + } + else { + /* Issue #22258: Here, ENOTTY means "Inappropriate ioctl for + device". The ioctl is declared but not supported by the kernel. + Remember that ioctl() doesn't work. It is the case on + Illumos-based OS for example. */ + ioctl_works = 0; + } + /* fallback to fcntl() if ioctl() does not work */ + } +#endif + + /* slow-path: fcntl() requires two syscalls */ + flags = fcntl(fd, F_GETFD); + if (flags < 0) { + if (raise) + PyErr_SetFromErrno(PyExc_OSError); + return -1; + } + + if (inheritable) + flags &= ~FD_CLOEXEC; + else + flags |= FD_CLOEXEC; + res = fcntl(fd, F_SETFD, flags); + if (res < 0) { + if (raise) + PyErr_SetFromErrno(PyExc_OSError); + return -1; + } + return 0; +#endif +} +/* Make the file descriptor non-inheritable. + Return 0 on success, set errno and return -1 on error. */ +static int +make_non_inheritable(int fd) +{ + return set_inheritable(fd, 0, 0, NULL); +} + +/* Set the inheritable flag of the specified file descriptor. + On success: return 0, on error: raise an exception if raise is nonzero + and return -1. + + If atomic_flag_works is not NULL: + + * if *atomic_flag_works==-1, check if the inheritable is set on the file + descriptor: if yes, set *atomic_flag_works to 1, otherwise set to 0 and + set the inheritable flag + * if *atomic_flag_works==1: do nothing + * if *atomic_flag_works==0: set inheritable flag to False + + Set atomic_flag_works to NULL if no atomic flag was used to create the + file descriptor. + + atomic_flag_works can only be used to make a file descriptor + non-inheritable: atomic_flag_works must be NULL if inheritable=1. */ +int +_Py_set_inheritable(int fd, int inheritable, int *atomic_flag_works) +{ + return set_inheritable(fd, inheritable, 1, atomic_flag_works); +} + +/* Open a file with the specified flags (wrapper to open() function). + The file descriptor is created non-inheritable. */ +int +_Py_open(const char *pathname, int flags) +{ + int fd; +#ifdef MS_WINDOWS + fd = open(pathname, flags | O_NOINHERIT); + if (fd < 0) + return fd; +#else + + int *atomic_flag_works; +#ifdef O_CLOEXEC + atomic_flag_works = &_Py_open_cloexec_works; + flags |= O_CLOEXEC; +#else + atomic_flag_works = NULL; +#endif + fd = open(pathname, flags); + if (fd < 0) + return fd; + + if (set_inheritable(fd, 0, 0, atomic_flag_works) < 0) { + close(fd); + return -1; + } +#endif /* !MS_WINDOWS */ + return fd; +} + +/* Open a file. Use _wfopen() on Windows, encode the path to the locale + encoding and use fopen() otherwise. The file descriptor is created + non-inheritable. */ FILE * _Py_wfopen(const wchar_t *path, const wchar_t *mode) { -#ifndef MS_WINDOWS FILE *f; +#ifndef MS_WINDOWS char *cpath; char cmode[10]; size_t r; @@ -579,21 +819,42 @@ _Py_wfopen(const wchar_t *path, const wchar_t *mode) return NULL; f = fopen(cpath, cmode); PyMem_Free(cpath); - return f; #else - return _wfopen(path, mode); + f = _wfopen(path, mode); #endif + if (f == NULL) + return NULL; + if (make_non_inheritable(fileno(f)) < 0) { + fclose(f); + return NULL; + } + return f; } -/* Call _wfopen() on Windows, or encode the path to the filesystem encoding and - call fopen() otherwise. +/* Wrapper to fopen(). The file descriptor is created non-inheritable. */ +FILE* +_Py_fopen(const char *pathname, const char *mode) +{ + FILE *f = fopen(pathname, mode); + if (f == NULL) + return NULL; + if (make_non_inheritable(fileno(f)) < 0) { + fclose(f); + return NULL; + } + return f; +} - Return the new file object on success, or NULL if the file cannot be open or - (if PyErr_Occurred()) on unicode error */ +/* Open a file. Call _wfopen() on Windows, or encode the path to the filesystem + encoding and call fopen() otherwise. The file descriptor is created + non-inheritable. + Return the new file object on success, or NULL if the file cannot be open or + (if PyErr_Occurred()) on unicode error. */ FILE* -_Py_fopen(PyObject *path, const char *mode) +_Py_fopen_obj(PyObject *path, const char *mode) { + FILE *f; #ifdef MS_WINDOWS wchar_t *wpath; wchar_t wmode[10]; @@ -613,16 +874,21 @@ _Py_fopen(PyObject *path, const char *mode) if (usize == 0) return NULL; - return _wfopen(wpath, wmode); + f = _wfopen(wpath, wmode); #else - FILE *f; PyObject *bytes; if (!PyUnicode_FSConverter(path, &bytes)) return NULL; f = fopen(PyBytes_AS_STRING(bytes), mode); Py_DECREF(bytes); - return f; #endif + if (f == NULL) + return NULL; + if (make_non_inheritable(fileno(f)) < 0) { + fclose(f); + return NULL; + } + return f; } #ifdef HAVE_READLINK @@ -659,12 +925,12 @@ _Py_wreadlink(const wchar_t *path, wchar_t *buf, size_t bufsiz) return -1; } if (bufsiz <= r1) { - PyMem_Free(wbuf); + PyMem_RawFree(wbuf); errno = EINVAL; return -1; } wcsncpy(buf, wbuf, bufsiz); - PyMem_Free(wbuf); + PyMem_RawFree(wbuf); return (int)r1; } #endif @@ -700,12 +966,12 @@ _Py_wrealpath(const wchar_t *path, return NULL; } if (resolved_path_size <= r) { - PyMem_Free(wresolved_path); + PyMem_RawFree(wresolved_path); errno = EINVAL; return NULL; } wcsncpy(resolved_path, wresolved_path, resolved_path_size); - PyMem_Free(wresolved_path); + PyMem_RawFree(wresolved_path); return resolved_path; } #endif @@ -718,7 +984,8 @@ wchar_t* _Py_wgetcwd(wchar_t *buf, size_t size) { #ifdef MS_WINDOWS - return _wgetcwd(buf, size); + int isize = (int)Py_MIN(size, INT_MAX); + return _wgetcwd(buf, isize); #else char fname[MAXPATHLEN]; wchar_t *wname; @@ -730,12 +997,81 @@ _Py_wgetcwd(wchar_t *buf, size_t size) if (wname == NULL) return NULL; if (size <= len) { - PyMem_Free(wname); + PyMem_RawFree(wname); return NULL; } wcsncpy(buf, wname, size); - PyMem_Free(wname); + PyMem_RawFree(wname); return buf; #endif } +/* Duplicate a file descriptor. The new file descriptor is created as + non-inheritable. Return a new file descriptor on success, raise an OSError + exception and return -1 on error. + + The GIL is released to call dup(). The caller must hold the GIL. */ +int +_Py_dup(int fd) +{ +#ifdef MS_WINDOWS + HANDLE handle; + DWORD ftype; +#endif + + if (!_PyVerify_fd(fd)) { + PyErr_SetFromErrno(PyExc_OSError); + return -1; + } + +#ifdef MS_WINDOWS + handle = (HANDLE)_get_osfhandle(fd); + if (handle == INVALID_HANDLE_VALUE) { + PyErr_SetFromErrno(PyExc_OSError); + return -1; + } + + /* get the file type, ignore the error if it failed */ + ftype = GetFileType(handle); + + Py_BEGIN_ALLOW_THREADS + fd = dup(fd); + Py_END_ALLOW_THREADS + if (fd < 0) { + PyErr_SetFromErrno(PyExc_OSError); + return -1; + } + + /* Character files like console cannot be make non-inheritable */ + if (ftype != FILE_TYPE_CHAR) { + if (_Py_set_inheritable(fd, 0, NULL) < 0) { + close(fd); + return -1; + } + } +#elif defined(HAVE_FCNTL_H) && defined(F_DUPFD_CLOEXEC) + Py_BEGIN_ALLOW_THREADS + fd = fcntl(fd, F_DUPFD_CLOEXEC, 0); + Py_END_ALLOW_THREADS + if (fd < 0) { + PyErr_SetFromErrno(PyExc_OSError); + return -1; + } + +#else + Py_BEGIN_ALLOW_THREADS + fd = dup(fd); + Py_END_ALLOW_THREADS + if (fd < 0) { + PyErr_SetFromErrno(PyExc_OSError); + return -1; + } + + if (_Py_set_inheritable(fd, 0, NULL) < 0) { + close(fd); + return -1; + } +#endif + return fd; +} + diff --git a/Python/formatter_unicode.c b/Python/formatter_unicode.c index a6516dc..e3a8149 100644 --- a/Python/formatter_unicode.c +++ b/Python/formatter_unicode.c @@ -156,8 +156,9 @@ parse_internal_render_format_spec(PyObject *format_spec, Py_ssize_t consumed; int align_specified = 0; + int fill_char_specified = 0; - format->fill_char = '\0'; + format->fill_char = ' '; format->align = default_align; format->alternate = 0; format->sign = '\0'; @@ -171,6 +172,7 @@ parse_internal_render_format_spec(PyObject *format_spec, if (end-pos >= 2 && is_alignment_token(READ_spec(pos+1))) { format->align = READ_spec(pos+1); format->fill_char = READ_spec(pos); + fill_char_specified = 1; align_specified = 1; pos += 2; } @@ -194,7 +196,7 @@ parse_internal_render_format_spec(PyObject *format_spec, } /* The special case for 0-padding (backwards compat) */ - if (format->fill_char == '\0' && end-pos >= 1 && READ_spec(pos) == '0') { + if (!fill_char_specified && end-pos >= 1 && READ_spec(pos) == '0') { format->fill_char = '0'; if (!align_specified) { format->align = '='; @@ -315,7 +317,7 @@ calc_padding(Py_ssize_t nchars, Py_ssize_t width, Py_UCS4 align, /* Do the padding, and return a pointer to where the caller-supplied content goes. */ -static Py_ssize_t +static int fill_padding(_PyUnicodeWriter *writer, Py_ssize_t nchars, Py_UCS4 fill_char, Py_ssize_t n_lpadding, @@ -556,7 +558,7 @@ fill_number(_PyUnicodeWriter *writer, const NumberFieldWidths *spec, { /* Used to keep track of digits, decimal, and remainder. */ Py_ssize_t d_pos = d_start; - const enum PyUnicode_Kind kind = writer->kind; + const unsigned int kind = writer->kind; const void *data = writer->data; Py_ssize_t r; @@ -757,7 +759,8 @@ format_string_internal(PyObject *value, const InternalFormatSpec *format, goto done; } - if (format->width == -1 && format->precision == -1) { + if ((format->width == -1 || format->width <= len) + && (format->precision == -1 || format->precision >= len)) { /* Fast path */ return _PyUnicodeWriter_WriteStr(writer, value); } @@ -770,18 +773,20 @@ format_string_internal(PyObject *value, const InternalFormatSpec *format, calc_padding(len, format->width, format->align, &lpad, &rpad, &total); - maxchar = _PyUnicode_FindMaxChar(value, 0, len); + maxchar = writer->maxchar; if (lpad != 0 || rpad != 0) maxchar = Py_MAX(maxchar, format->fill_char); + if (PyUnicode_MAX_CHAR_VALUE(value) > maxchar) { + Py_UCS4 valmaxchar = _PyUnicode_FindMaxChar(value, 0, len); + maxchar = Py_MAX(maxchar, valmaxchar); + } /* allocate the resulting string */ if (_PyUnicodeWriter_Prepare(writer, total, maxchar) == -1) goto done; /* Write into that space. First the padding. */ - result = fill_padding(writer, len, - format->fill_char=='\0'?' ':format->fill_char, - lpad, rpad); + result = fill_padding(writer, len, format->fill_char, lpad, rpad); if (result == -1) goto done; @@ -951,8 +956,7 @@ format_long_internal(PyObject *value, const InternalFormatSpec *format, /* Populate the memory. */ result = fill_number(writer, &spec, tmp, inumeric_chars, inumeric_chars + n_digits, - tmp, prefix, - format->fill_char == '\0' ? ' ' : format->fill_char, + tmp, prefix, format->fill_char, &locale, format->type == 'X'); done: @@ -977,8 +981,7 @@ format_float_internal(PyObject *value, Py_ssize_t n_total; int has_decimal; double val; - Py_ssize_t precision; - Py_ssize_t default_precision = 6; + int precision, default_precision = 6; Py_UCS4 type = format->type; int add_pct = 0; Py_ssize_t index; @@ -1049,24 +1052,24 @@ format_float_internal(PyObject *value, n_digits += 1; } - /* Since there is no unicode version of PyOS_double_to_string, - just use the 8 bit version and then convert to unicode. */ - unicode_tmp = _PyUnicode_FromASCII(buf, n_digits); - PyMem_Free(buf); - if (unicode_tmp == NULL) - goto done; - if (format->sign != '+' && format->sign != ' ' && format->width == -1 && format->type != 'n' && !format->thousands_separators) { /* Fast path */ - result = _PyUnicodeWriter_WriteStr(writer, unicode_tmp); - Py_DECREF(unicode_tmp); + result = _PyUnicodeWriter_WriteASCIIString(writer, buf, n_digits); + PyMem_Free(buf); return result; } + /* Since there is no unicode version of PyOS_double_to_string, + just use the 8 bit version and then convert to unicode. */ + unicode_tmp = _PyUnicode_FromASCII(buf, n_digits); + PyMem_Free(buf); + if (unicode_tmp == NULL) + goto done; + /* Is a sign character present in the output? If so, remember it and skip it */ index = 0; @@ -1100,8 +1103,7 @@ format_float_internal(PyObject *value, /* Populate the memory. */ result = fill_number(writer, &spec, unicode_tmp, index, index + n_digits, - NULL, 0, - format->fill_char == '\0' ? ' ' : format->fill_char, + NULL, 0, format->fill_char, &locale, 0); done: @@ -1133,8 +1135,7 @@ format_complex_internal(PyObject *value, Py_ssize_t n_im_total; int re_has_decimal; int im_has_decimal; - int precision; - Py_ssize_t default_precision = 6; + int precision, default_precision = 6; Py_UCS4 type = format->type; Py_ssize_t i_re; Py_ssize_t i_im; @@ -1308,8 +1309,7 @@ format_complex_internal(PyObject *value, /* Populate the memory. First, the padding. */ result = fill_padding(writer, n_re_total + n_im_total + 1 + add_parens * 2, - format->fill_char=='\0' ? ' ' : format->fill_char, - lpad, rpad); + format->fill_char, lpad, rpad); if (result == -1) goto done; diff --git a/Python/frozen.c b/Python/frozen.c index 25fdc17..9bc662b 100644 --- a/Python/frozen.c +++ b/Python/frozen.c @@ -28,7 +28,7 @@ static unsigned char M___hello__[] = { #define SIZE (int)sizeof(M___hello__) -static struct _frozen _PyImport_FrozenModules[] = { +static const struct _frozen _PyImport_FrozenModules[] = { /* importlib */ {"_frozen_importlib", _Py_M__importlib, (int)sizeof(_Py_M__importlib)}, /* Test module */ @@ -42,4 +42,4 @@ static struct _frozen _PyImport_FrozenModules[] = { /* Embedding apps may change this pointer to point to their favorite collection of frozen modules: */ -struct _frozen *PyImport_FrozenModules = _PyImport_FrozenModules; +const struct _frozen *PyImport_FrozenModules = _PyImport_FrozenModules; diff --git a/Python/frozenmain.c b/Python/frozenmain.c index 8b1f2d4..b05c94a 100644 --- a/Python/frozenmain.c +++ b/Python/frozenmain.c @@ -16,19 +16,21 @@ int Py_FrozenMain(int argc, char **argv) { char *p; - int i, n, sts; + int i, n, sts = 1; int inspect = 0; int unbuffered = 0; - char *oldloc; - wchar_t **argv_copy; + char *oldloc = NULL; + wchar_t **argv_copy = NULL; /* We need a second copies, as Python might modify the first one. */ - wchar_t **argv_copy2; + wchar_t **argv_copy2 = NULL; - argv_copy = PyMem_Malloc(sizeof(wchar_t*)*argc); - argv_copy2 = PyMem_Malloc(sizeof(wchar_t*)*argc); - if (!argv_copy || !argv_copy2) { - fprintf(stderr, "out of memory\n"); - return 1; + if (argc > 0) { + argv_copy = PyMem_RawMalloc(sizeof(wchar_t*) * argc); + argv_copy2 = PyMem_RawMalloc(sizeof(wchar_t*) * argc); + if (!argv_copy || !argv_copy2) { + fprintf(stderr, "out of memory\n"); + goto error; + } } Py_FrozenFlag = 1; /* Suppress errors from getpath.c */ @@ -44,37 +46,32 @@ Py_FrozenMain(int argc, char **argv) setbuf(stderr, (char *)NULL); } - oldloc = setlocale(LC_ALL, NULL); + oldloc = _PyMem_RawStrdup(setlocale(LC_ALL, NULL)); + if (!oldloc) { + fprintf(stderr, "out of memory\n"); + goto error; + } + setlocale(LC_ALL, ""); for (i = 0; i < argc; i++) { -#ifdef HAVE_BROKEN_MBSTOWCS - size_t argsize = strlen(argv[i]); -#else - size_t argsize = mbstowcs(NULL, argv[i], 0); -#endif - size_t count; - if (argsize == (size_t)-1) { - fprintf(stderr, "Could not convert argument %d to string\n", i); - return 1; - } - argv_copy[i] = PyMem_Malloc((argsize+1)*sizeof(wchar_t)); + argv_copy[i] = _Py_char2wchar(argv[i], NULL); argv_copy2[i] = argv_copy[i]; if (!argv_copy[i]) { - fprintf(stderr, "out of memory\n"); - return 1; - } - count = mbstowcs(argv_copy[i], argv[i], argsize+1); - if (count == (size_t)-1) { - fprintf(stderr, "Could not convert argument %d to string\n", i); - return 1; + fprintf(stderr, "Unable to decode the command line argument #%i\n", + i + 1); + argc = i; + goto error; } } setlocale(LC_ALL, oldloc); + PyMem_RawFree(oldloc); + oldloc = NULL; #ifdef MS_WINDOWS PyInitFrozenExtensions(); #endif /* MS_WINDOWS */ - Py_SetProgramName(argv_copy[0]); + if (argc >= 1) + Py_SetProgramName(argv_copy[0]); Py_Initialize(); #ifdef MS_WINDOWS PyWinFreeze_ExeInit(); @@ -103,10 +100,14 @@ Py_FrozenMain(int argc, char **argv) PyWinFreeze_ExeTerm(); #endif Py_Finalize(); - for (i = 0; i < argc; i++) { - PyMem_Free(argv_copy2[i]); + +error: + PyMem_RawFree(argv_copy); + if (argv_copy2) { + for (i = 0; i < argc; i++) + PyMem_RawFree(argv_copy2[i]); + PyMem_RawFree(argv_copy2); } - PyMem_Free(argv_copy); - PyMem_Free(argv_copy2); + PyMem_RawFree(oldloc); return sts; } diff --git a/Python/future.c b/Python/future.c index d24ae41..81eab54 100644 --- a/Python/future.c +++ b/Python/future.c @@ -11,7 +11,7 @@ "from __future__ imports must occur at the beginning of the file" static int -future_check_features(PyFutureFeatures *ff, stmt_ty s, const char *filename) +future_check_features(PyFutureFeatures *ff, stmt_ty s, PyObject *filename) { int i; asdl_seq *names; @@ -43,12 +43,12 @@ future_check_features(PyFutureFeatures *ff, stmt_ty s, const char *filename) } else if (strcmp(feature, "braces") == 0) { PyErr_SetString(PyExc_SyntaxError, "not a chance"); - PyErr_SyntaxLocationEx(filename, s->lineno, s->col_offset); + PyErr_SyntaxLocationObject(filename, s->lineno, s->col_offset); return 0; } else { PyErr_Format(PyExc_SyntaxError, UNDEFINED_FUTURE_FEATURE, feature); - PyErr_SyntaxLocationEx(filename, s->lineno, s->col_offset); + PyErr_SyntaxLocationObject(filename, s->lineno, s->col_offset); return 0; } } @@ -56,13 +56,17 @@ future_check_features(PyFutureFeatures *ff, stmt_ty s, const char *filename) } static int -future_parse(PyFutureFeatures *ff, mod_ty mod, const char *filename) +future_parse(PyFutureFeatures *ff, mod_ty mod, PyObject *filename) { - int i, found_docstring = 0, done = 0, prev_line = 0; + int i, done = 0, prev_line = 0; + stmt_ty first; if (!(mod->kind == Module_kind || mod->kind == Interactive_kind)) return 1; + if (asdl_seq_LEN(mod->v.Module.body) == 0) + return 1; + /* A subsequent pass will detect future imports that don't appear at the beginning of the file. There's one case, however, that is easier to handle here: A series of imports @@ -71,8 +75,13 @@ future_parse(PyFutureFeatures *ff, mod_ty mod, const char *filename) but is preceded by a regular import. */ + i = 0; + first = (stmt_ty)asdl_seq_GET(mod->v.Module.body, i); + if (first->kind == Expr_kind && first->v.Expr.value->kind == Str_kind) + i++; - for (i = 0; i < asdl_seq_LEN(mod->v.Module.body); i++) { + + for (; i < asdl_seq_LEN(mod->v.Module.body); i++) { stmt_ty s = (stmt_ty)asdl_seq_GET(mod->v.Module.body, i); if (done && s->lineno > prev_line) @@ -92,32 +101,27 @@ future_parse(PyFutureFeatures *ff, mod_ty mod, const char *filename) if (done) { PyErr_SetString(PyExc_SyntaxError, ERR_LATE_FUTURE); - PyErr_SyntaxLocationEx(filename, s->lineno, s->col_offset); + PyErr_SyntaxLocationObject(filename, s->lineno, s->col_offset); return 0; } if (!future_check_features(ff, s, filename)) return 0; ff->ff_lineno = s->lineno; } - else - done = 1; - } - else if (s->kind == Expr_kind && !found_docstring) { - expr_ty e = s->v.Expr.value; - if (e->kind != Str_kind) + else { done = 1; - else - found_docstring = 1; + } } - else + else { done = 1; + } } return 1; } PyFutureFeatures * -PyFuture_FromAST(mod_ty mod, const char *filename) +PyFuture_FromASTObject(mod_ty mod, PyObject *filename) { PyFutureFeatures *ff; @@ -135,3 +139,18 @@ PyFuture_FromAST(mod_ty mod, const char *filename) } return ff; } + + +PyFutureFeatures * +PyFuture_FromAST(mod_ty mod, const char *filename_str) +{ + PyFutureFeatures *ff; + PyObject *filename; + + filename = PyUnicode_DecodeFSDefault(filename_str); + if (filename == NULL) + return NULL; + ff = PyFuture_FromASTObject(mod, filename); + Py_DECREF(filename); + return ff; +} diff --git a/Python/getargs.c b/Python/getargs.c index ae931b9..6902d13 100644 --- a/Python/getargs.c +++ b/Python/getargs.c @@ -46,14 +46,16 @@ typedef struct { } freelistentry_t; typedef struct { - int first_available; freelistentry_t *entries; + int first_available; + int entries_malloced; } freelist_t; +#define STATIC_FREELIST_ENTRIES 8 /* Forward */ static int vgetargs1(PyObject *, const char *, va_list *, int); -static void seterror(int, const char *, int *, const char *, const char *); +static void seterror(Py_ssize_t, const char *, int *, const char *, const char *); static char *convertitem(PyObject *, const char **, va_list *, int, int *, char *, size_t, freelist_t *); static char *converttuple(PyObject *, const char **, va_list *, int, @@ -187,7 +189,8 @@ cleanreturn(int retval, freelist_t *freelist) freelist->entries[index].item); } } - PyMem_FREE(freelist->entries); + if (freelist->entries_malloced) + PyMem_FREE(freelist->entries); return retval; } @@ -206,8 +209,13 @@ vgetargs1(PyObject *args, const char *format, va_list *p_va, int flags) const char *formatsave = format; Py_ssize_t i, len; char *msg; - freelist_t freelist = {0, NULL}; int compat = flags & FLAG_COMPAT; + freelistentry_t static_entries[STATIC_FREELIST_ENTRIES]; + freelist_t freelist; + + freelist.entries = static_entries; + freelist.first_available = 0; + freelist.entries_malloced = 0; assert(compat || (args != (PyObject*)NULL)); flags = flags & ~FLAG_COMPAT; @@ -240,15 +248,15 @@ vgetargs1(PyObject *args, const char *format, va_list *p_va, int flags) message = format; endfmt = 1; break; + case '|': + if (level == 0) + min = max; + break; default: if (level == 0) { - if (c == 'O') - max++; - else if (Py_ISALPHA(Py_CHARMASK(c))) { + if (Py_ISALPHA(Py_CHARMASK(c))) if (c != 'e') /* skip encoded */ max++; - } else if (c == '|') - min = max; } break; } @@ -262,10 +270,13 @@ vgetargs1(PyObject *args, const char *format, va_list *p_va, int flags) format = formatsave; - freelist.entries = PyMem_NEW(freelistentry_t, max); - if (freelist.entries == NULL) { - PyErr_NoMemory(); - return 0; + if (max > STATIC_FREELIST_ENTRIES) { + freelist.entries = PyMem_NEW(freelistentry_t, max); + if (freelist.entries == NULL) { + PyErr_NoMemory(); + return 0; + } + freelist.entries_malloced = 1; } if (compat) { @@ -350,7 +361,7 @@ vgetargs1(PyObject *args, const char *format, va_list *p_va, int flags) static void -seterror(int iarg, const char *msg, int *levels, const char *fname, +seterror(Py_ssize_t iarg, const char *msg, int *levels, const char *fname, const char *message) { char buf[512]; @@ -366,10 +377,10 @@ seterror(int iarg, const char *msg, int *levels, const char *fname, } if (iarg != 0) { PyOS_snprintf(p, sizeof(buf) - (p - buf), - "argument %d", iarg); + "argument %" PY_FORMAT_SIZE_T "d", iarg); i = 0; p += strlen(p); - while (levels[i] > 0 && i < 32 && (int)(p-buf) < 220) { + while (i < 32 && levels[i] > 0 && (int)(p-buf) < 220) { PyOS_snprintf(p, sizeof(buf) - (p - buf), ", item %d", levels[i]-1); p += strlen(p); @@ -414,6 +425,7 @@ converttuple(PyObject *arg, const char **p_format, va_list *p_va, int flags, int n = 0; const char *format = *p_format; int i; + Py_ssize_t len; for (;;) { int c = *format++; @@ -443,12 +455,20 @@ converttuple(PyObject *arg, const char **p_format, va_list *p_va, int flags, return msgbuf; } - if ((i = PySequence_Size(arg)) != n) { + len = PySequence_Size(arg); + if (len != n) { levels[0] = 0; - PyOS_snprintf(msgbuf, bufsize, - toplevel ? "expected %d arguments, not %d" : - "must be sequence of length %d, not %d", - n, i); + if (toplevel) { + PyOS_snprintf(msgbuf, bufsize, + "expected %d arguments, not %" PY_FORMAT_SIZE_T "d", + n, len); + } + else { + PyOS_snprintf(msgbuf, bufsize, + "must be sequence of length %d, " + "not %" PY_FORMAT_SIZE_T "d", + n, len); + } return msgbuf; } @@ -563,7 +583,7 @@ convertsimple(PyObject *arg, const char **p_format, va_list *p_va, int flags, "size does not fit in an int"); \ return converterr("", arg, msgbuf, bufsize); \ } \ - *q=s; \ + *q = (int)s; \ } #define BUFFER_LEN ((flags & FLAG_SIZE_T) ? *q2:*q) #define RETURN_ERR_OCCURRED return msgbuf @@ -829,7 +849,7 @@ convertsimple(PyObject *arg, const char **p_format, va_list *p_va, int flags, /* XXX WAAAAH! 's', 'y', 'z', 'u', 'Z', 'e', 'w' codes all need to be cleaned up! */ - case 'y': {/* any buffer-like object, but not PyUnicode */ + case 'y': {/* any bytes-like object */ void **p = (void **)va_arg(*p_va, char **); char *buf; Py_ssize_t count; @@ -860,8 +880,8 @@ convertsimple(PyObject *arg, const char **p_format, va_list *p_va, int flags, break; } - case 's': /* text string */ - case 'z': /* text string or None */ + case 's': /* text string or bytes-like object */ + case 'z': /* text string, bytes-like object or None */ { if (*format == '*') { /* "s*" or "z*" */ @@ -877,7 +897,7 @@ convertsimple(PyObject *arg, const char **p_format, va_list *p_va, int flags, arg, msgbuf, bufsize); PyBuffer_FillInfo(p, arg, sarg, len, 1, 0); } - else { /* any buffer-like object */ + else { /* any bytes-like object */ char *buf; if (getbuffer(arg, p, &buf) < 0) return converterr(buf, arg, msgbuf, bufsize); @@ -888,7 +908,7 @@ convertsimple(PyObject *arg, const char **p_format, va_list *p_va, int flags, arg, msgbuf, bufsize); } format++; - } else if (*format == '#') { /* any buffer-like object */ + } else if (*format == '#') { /* a string or read-only bytes-like object */ /* "s#" or "z#" */ void **p = (void **)va_arg(*p_va, char **); FETCH_SIZE; @@ -906,7 +926,7 @@ convertsimple(PyObject *arg, const char **p_format, va_list *p_va, int flags, *p = sarg; STORE_SIZE(len); } - else { /* any buffer-like object */ + else { /* read-only bytes-like object */ /* XXX Really? */ char *buf; Py_ssize_t count = convertbuffer(arg, p, &buf); @@ -947,8 +967,8 @@ convertsimple(PyObject *arg, const char **p_format, va_list *p_va, int flags, { Py_UNICODE **p = va_arg(*p_va, Py_UNICODE **); - if (*format == '#') { /* any buffer-like object */ - /* "s#" or "Z#" */ + if (*format == '#') { + /* "u#" or "Z#" */ FETCH_SIZE; if (c == 'Z' && arg == Py_None) { @@ -963,10 +983,11 @@ convertsimple(PyObject *arg, const char **p_format, va_list *p_va, int flags, STORE_SIZE(len); } else - return converterr("str or None", arg, msgbuf, bufsize); + return converterr(c == 'Z' ? "str or None" : "str", + arg, msgbuf, bufsize); format++; } else { - /* "s" or "Z" */ + /* "u" or "Z" */ if (c == 'Z' && arg == Py_None) *p = NULL; else if (PyUnicode_Check(arg)) { @@ -1419,9 +1440,15 @@ vgetargskeywords(PyObject *args, PyObject *keywords, const char *format, const char *fname, *msg, *custom_msg, *keyword; int min = INT_MAX; int max = INT_MAX; - int i, len, nargs, nkeywords; + int i, len; + Py_ssize_t nargs, nkeywords; PyObject *current_arg; - freelist_t freelist = {0, NULL}; + freelistentry_t static_entries[STATIC_FREELIST_ENTRIES]; + freelist_t freelist; + + freelist.entries = static_entries; + freelist.first_available = 0; + freelist.entries_malloced = 0; assert(args != NULL && PyTuple_Check(args)); assert(keywords == NULL || PyDict_Check(keywords)); @@ -1445,17 +1472,20 @@ vgetargskeywords(PyObject *args, PyObject *keywords, const char *format, for (len=0; kwlist[len]; len++) continue; - freelist.entries = PyMem_NEW(freelistentry_t, len); - if (freelist.entries == NULL) { - PyErr_NoMemory(); - return 0; + if (len > STATIC_FREELIST_ENTRIES) { + freelist.entries = PyMem_NEW(freelistentry_t, len); + if (freelist.entries == NULL) { + PyErr_NoMemory(); + return 0; + } + freelist.entries_malloced = 1; } nargs = PyTuple_GET_SIZE(args); nkeywords = (keywords == NULL) ? 0 : PyDict_Size(keywords); if (nargs + nkeywords > len) { PyErr_Format(PyExc_TypeError, - "%s%s takes at most %d argument%s (%d given)", + "%s%s takes at most %d argument%s (%zd given)", (fname == NULL) ? "function" : fname, (fname == NULL) ? "" : "()", len, @@ -1574,20 +1604,15 @@ vgetargskeywords(PyObject *args, PyObject *keywords, const char *format, Py_ssize_t pos = 0; while (PyDict_Next(keywords, &pos, &key, &value)) { int match = 0; - char *ks; if (!PyUnicode_Check(key)) { PyErr_SetString(PyExc_TypeError, "keywords must be strings"); return cleanreturn(0, &freelist); } - /* check that _PyUnicode_AsString() result is not NULL */ - ks = _PyUnicode_AsString(key); - if (ks != NULL) { - for (i = 0; i < len; i++) { - if (!strcmp(ks, kwlist[i])) { - match = 1; - break; - } + for (i = 0; i < len; i++) { + if (!PyUnicode_CompareWithASCIIString(key, kwlist[i])) { + match = 1; + break; } } if (!match) { @@ -1789,7 +1814,7 @@ PyArg_UnpackTuple(PyObject *args, const char *name, Py_ssize_t min, Py_ssize_t m /* For type constructors that don't take keyword args * - * Sets a TypeError and returns 0 if the kwds dict is + * Sets a TypeError and returns 0 if the args/kwargs is * not empty, returns 1 otherwise */ int @@ -1808,6 +1833,25 @@ _PyArg_NoKeywords(const char *funcname, PyObject *kw) funcname); return 0; } + + +int +_PyArg_NoPositional(const char *funcname, PyObject *args) +{ + if (args == NULL) + return 1; + if (!PyTuple_CheckExact(args)) { + PyErr_BadInternalCall(); + return 0; + } + if (PyTuple_GET_SIZE(args) == 0) + return 1; + + PyErr_Format(PyExc_TypeError, "%s does not take positional arguments", + funcname); + return 0; +} + #ifdef __cplusplus }; #endif diff --git a/Python/getcwd.c b/Python/getcwd.c deleted file mode 100644 index 4bedbd1..0000000 --- a/Python/getcwd.c +++ /dev/null @@ -1,83 +0,0 @@ - -/* Two PD getcwd() implementations. - Author: Guido van Rossum, CWI Amsterdam, Jan 1991, <guido@cwi.nl>. */ - -#include <stdio.h> -#include <errno.h> - -#ifdef HAVE_GETWD - -/* Version for BSD systems -- use getwd() */ - -#ifdef HAVE_SYS_PARAM_H -#include <sys/param.h> -#endif - -#ifndef MAXPATHLEN -#if defined(PATH_MAX) && PATH_MAX > 1024 -#define MAXPATHLEN PATH_MAX -#else -#define MAXPATHLEN 1024 -#endif -#endif - -extern char *getwd(char *); - -char * -getcwd(char *buf, int size) -{ - char localbuf[MAXPATHLEN+1]; - char *ret; - - if (size <= 0) { - errno = EINVAL; - return NULL; - } - ret = getwd(localbuf); - if (ret != NULL && strlen(localbuf) >= (size_t)size) { - errno = ERANGE; - return NULL; - } - if (ret == NULL) { - errno = EACCES; /* Most likely error */ - return NULL; - } - strncpy(buf, localbuf, size); - return buf; -} - -#else /* !HAVE_GETWD */ - -/* Version for really old UNIX systems -- use pipe from pwd */ - -#ifndef PWD_CMD -#define PWD_CMD "/bin/pwd" -#endif - -char * -getcwd(char *buf, int size) -{ - FILE *fp; - char *p; - int sts; - if (size <= 0) { - errno = EINVAL; - return NULL; - } - if ((fp = popen(PWD_CMD, "r")) == NULL) - return NULL; - if (fgets(buf, size, fp) == NULL || (sts = pclose(fp)) != 0) { - errno = EACCES; /* Most likely error */ - return NULL; - } - for (p = buf; *p != '\n'; p++) { - if (*p == '\0') { - errno = ERANGE; - return NULL; - } - } - *p = '\0'; - return buf; -} - -#endif /* !HAVE_GETWD */ diff --git a/Python/import.c b/Python/import.c index b0b2405..4f0765a 100644 --- a/Python/import.c +++ b/Python/import.c @@ -19,22 +19,11 @@ extern "C" { #endif -#ifdef MS_WINDOWS -/* for stat.st_mode */ -typedef unsigned short mode_t; -/* for _mkdir */ -#include <direct.h> -#endif - - #define CACHEDIR "__pycache__" /* See _PyImport_FixupExtensionObject() below */ static PyObject *extensions = NULL; -/* Function from Parser/tokenizer.c */ -extern char * PyTokenizer_FindEncodingFilename(int, PyObject *); - /* This table is defined in config.c: */ extern struct _inittab _PyImport_Inittab[]; @@ -42,14 +31,31 @@ struct _inittab *PyImport_Inittab = _PyImport_Inittab; static PyObject *initstr = NULL; +/*[clinic input] +module _imp +[clinic start generated code]*/ +/*[clinic end generated code: output=da39a3ee5e6b4b0d input=9c332475d8686284]*/ + +/*[python input] +class fs_unicode_converter(CConverter): + type = 'PyObject *' + converter = 'PyUnicode_FSDecoder' + +[python start generated code]*/ +/*[python end generated code: output=da39a3ee5e6b4b0d input=9d6786230166006e]*/ + /* Initialize things */ void _PyImport_Init(void) { + PyInterpreterState *interp = PyThreadState_Get()->interp; initstr = PyUnicode_InternFromString("__init__"); if (initstr == NULL) Py_FatalError("Can't initialize import variables"); + interp->builtins_copy = PyDict_Copy(interp->builtins); + if (interp->builtins_copy == NULL) + Py_FatalError("Can't backup builtins dict"); } void @@ -93,8 +99,10 @@ _PyImportZip_Init(void) int err = 0; path_hooks = PySys_GetObject("path_hooks"); - if (path_hooks == NULL) + if (path_hooks == NULL) { + PyErr_SetString(PyExc_RuntimeError, "unable to get sys.path_hooks"); goto error; + } if (Py_VerboseFlag) PySys_WriteStderr("# installing zipimport hook\n"); @@ -208,8 +216,11 @@ _PyImport_ReInitLock(void) if (import_lock_level > 1) { /* Forked as a side effect of import */ long me = PyThread_get_thread_ident(); - PyThread_acquire_lock(import_lock, 0); - /* XXX: can the previous line fail? */ + /* The following could fail if the lock is already held, but forking as + a side-effect of an import is a) rare, b) nuts, and c) difficult to + do thanks to the lock only being held when doing individual module + locks per import. */ + PyThread_acquire_lock(import_lock, NOWAIT_LOCK); import_lock_thread = me; import_lock_level--; } else { @@ -220,8 +231,37 @@ _PyImport_ReInitLock(void) #endif +/*[clinic input] +_imp.lock_held + +Return True if the import lock is currently held, else False. + +On platforms without threads, return False. +[clinic start generated code]*/ + +PyDoc_STRVAR(_imp_lock_held__doc__, +"lock_held($module, /)\n" +"--\n" +"\n" +"Return True if the import lock is currently held, else False.\n" +"\n" +"On platforms without threads, return False."); + +#define _IMP_LOCK_HELD_METHODDEF \ + {"lock_held", (PyCFunction)_imp_lock_held, METH_NOARGS, _imp_lock_held__doc__}, + +static PyObject * +_imp_lock_held_impl(PyModuleDef *module); + static PyObject * -imp_lock_held(PyObject *self, PyObject *noargs) +_imp_lock_held(PyModuleDef *module, PyObject *Py_UNUSED(ignored)) +{ + return _imp_lock_held_impl(module); +} + +static PyObject * +_imp_lock_held_impl(PyModuleDef *module) +/*[clinic end generated code: output=dae65674966baa65 input=9b088f9b217d9bdf]*/ { #ifdef WITH_THREAD return PyBool_FromLong(import_lock_thread != -1); @@ -230,8 +270,39 @@ imp_lock_held(PyObject *self, PyObject *noargs) #endif } +/*[clinic input] +_imp.acquire_lock + +Acquires the interpreter's import lock for the current thread. + +This lock should be used by import hooks to ensure thread-safety when importing +modules. On platforms without threads, this function does nothing. +[clinic start generated code]*/ + +PyDoc_STRVAR(_imp_acquire_lock__doc__, +"acquire_lock($module, /)\n" +"--\n" +"\n" +"Acquires the interpreter\'s import lock for the current thread.\n" +"\n" +"This lock should be used by import hooks to ensure thread-safety when importing\n" +"modules. On platforms without threads, this function does nothing."); + +#define _IMP_ACQUIRE_LOCK_METHODDEF \ + {"acquire_lock", (PyCFunction)_imp_acquire_lock, METH_NOARGS, _imp_acquire_lock__doc__}, + static PyObject * -imp_acquire_lock(PyObject *self, PyObject *noargs) +_imp_acquire_lock_impl(PyModuleDef *module); + +static PyObject * +_imp_acquire_lock(PyModuleDef *module, PyObject *Py_UNUSED(ignored)) +{ + return _imp_acquire_lock_impl(module); +} + +static PyObject * +_imp_acquire_lock_impl(PyModuleDef *module) +/*[clinic end generated code: output=478f1fa089fdb9a4 input=4a2d4381866d5fdc]*/ { #ifdef WITH_THREAD _PyImport_AcquireLock(); @@ -240,8 +311,37 @@ imp_acquire_lock(PyObject *self, PyObject *noargs) return Py_None; } +/*[clinic input] +_imp.release_lock + +Release the interpreter's import lock. + +On platforms without threads, this function does nothing. +[clinic start generated code]*/ + +PyDoc_STRVAR(_imp_release_lock__doc__, +"release_lock($module, /)\n" +"--\n" +"\n" +"Release the interpreter\'s import lock.\n" +"\n" +"On platforms without threads, this function does nothing."); + +#define _IMP_RELEASE_LOCK_METHODDEF \ + {"release_lock", (PyCFunction)_imp_release_lock, METH_NOARGS, _imp_release_lock__doc__}, + static PyObject * -imp_release_lock(PyObject *self, PyObject *noargs) +_imp_release_lock_impl(PyModuleDef *module); + +static PyObject * +_imp_release_lock(PyModuleDef *module, PyObject *Py_UNUSED(ignored)) +{ + return _imp_release_lock_impl(module); +} + +static PyObject * +_imp_release_lock_impl(PyModuleDef *module) +/*[clinic end generated code: output=36c77a6832fdafd4 input=934fb11516dd778b]*/ { #ifdef WITH_THREAD if (_PyImport_ReleaseLock() < 0) { @@ -283,6 +383,7 @@ static char* sys_deletes[] = { "path", "argv", "ps1", "ps2", "last_type", "last_value", "last_traceback", "path_hooks", "path_importer_cache", "meta_path", + "__interactivehook__", /* misc stuff */ "flags", "float_info", NULL @@ -295,16 +396,17 @@ static char* sys_files[] = { NULL }; - /* Un-initialize things, as good as we can */ void PyImport_Cleanup(void) { - Py_ssize_t pos, ndone; + Py_ssize_t pos; PyObject *key, *value, *dict; PyInterpreterState *interp = PyThreadState_GET()->interp; PyObject *modules = interp->modules; + PyObject *weaklist = NULL; + char **p; if (modules == NULL) return; /* Already done */ @@ -315,114 +417,129 @@ PyImport_Cleanup(void) deleted *last* of all, they would come too late in the normal destruction order. Sigh. */ - value = PyDict_GetItemString(modules, "builtins"); - if (value != NULL && PyModule_Check(value)) { - dict = PyModule_GetDict(value); + /* XXX Perhaps these precautions are obsolete. Who knows? */ + + if (Py_VerboseFlag) + PySys_WriteStderr("# clear builtins._\n"); + PyDict_SetItemString(interp->builtins, "_", Py_None); + + for (p = sys_deletes; *p != NULL; p++) { if (Py_VerboseFlag) - PySys_WriteStderr("# clear builtins._\n"); - PyDict_SetItemString(dict, "_", Py_None); - } - value = PyDict_GetItemString(modules, "sys"); - if (value != NULL && PyModule_Check(value)) { - char **p; - PyObject *v; - dict = PyModule_GetDict(value); - for (p = sys_deletes; *p != NULL; p++) { - if (Py_VerboseFlag) - PySys_WriteStderr("# clear sys.%s\n", *p); - PyDict_SetItemString(dict, *p, Py_None); - } - for (p = sys_files; *p != NULL; p+=2) { - if (Py_VerboseFlag) - PySys_WriteStderr("# restore sys.%s\n", *p); - v = PyDict_GetItemString(dict, *(p+1)); - if (v == NULL) - v = Py_None; - PyDict_SetItemString(dict, *p, v); - } + PySys_WriteStderr("# clear sys.%s\n", *p); + PyDict_SetItemString(interp->sysdict, *p, Py_None); } - - /* First, delete __main__ */ - value = PyDict_GetItemString(modules, "__main__"); - if (value != NULL && PyModule_Check(value)) { + for (p = sys_files; *p != NULL; p+=2) { if (Py_VerboseFlag) - PySys_WriteStderr("# cleanup __main__\n"); - _PyModule_Clear(value); - PyDict_SetItemString(modules, "__main__", Py_None); + PySys_WriteStderr("# restore sys.%s\n", *p); + value = PyDict_GetItemString(interp->sysdict, *(p+1)); + if (value == NULL) + value = Py_None; + PyDict_SetItemString(interp->sysdict, *p, value); + } + + /* We prepare a list which will receive (name, weakref) tuples of + modules when they are removed from sys.modules. The name is used + for diagnosis messages (in verbose mode), while the weakref helps + detect those modules which have been held alive. */ + weaklist = PyList_New(0); + if (weaklist == NULL) + PyErr_Clear(); + +#define STORE_MODULE_WEAKREF(name, mod) \ + if (weaklist != NULL) { \ + PyObject *wr = PyWeakref_NewRef(mod, NULL); \ + if (name && wr) { \ + PyObject *tup = PyTuple_Pack(2, name, wr); \ + PyList_Append(weaklist, tup); \ + Py_XDECREF(tup); \ + } \ + Py_XDECREF(wr); \ + if (PyErr_Occurred()) \ + PyErr_Clear(); \ + } + + /* Remove all modules from sys.modules, hoping that garbage collection + can reclaim most of them. */ + pos = 0; + while (PyDict_Next(modules, &pos, &key, &value)) { + if (PyModule_Check(value)) { + if (Py_VerboseFlag && PyUnicode_Check(key)) + PySys_FormatStderr("# cleanup[2] removing %U\n", key); + STORE_MODULE_WEAKREF(key, value); + PyDict_SetItem(modules, key, Py_None); + } } - /* The special treatment of "builtins" here is because even + /* Clear the modules dict. */ + PyDict_Clear(modules); + /* Restore the original builtins dict, to ensure that any + user data gets cleared. */ + dict = PyDict_Copy(interp->builtins); + if (dict == NULL) + PyErr_Clear(); + PyDict_Clear(interp->builtins); + if (PyDict_Update(interp->builtins, interp->builtins_copy)) + PyErr_Clear(); + Py_XDECREF(dict); + /* Clear module dict copies stored in the interpreter state */ + _PyState_ClearModules(); + /* Collect references */ + _PyGC_CollectNoFail(); + /* Dump GC stats before it's too late, since it uses the warnings + machinery. */ + _PyGC_DumpShutdownStats(); + + /* Now, if there are any modules left alive, clear their globals to + minimize potential leaks. All C extension modules actually end + up here, since they are kept alive in the interpreter state. + + The special treatment of "builtins" here is because even when it's not referenced as a module, its dictionary is referenced by almost every module's __builtins__. Since deleting a module clears its dictionary (even if there are references left to it), we need to delete the "builtins" module last. Likewise, we don't delete sys until the very - end because it is implicitly referenced (e.g. by print). - - Also note that we 'delete' modules by replacing their entry - in the modules dict with None, rather than really deleting - them; this avoids a rehash of the modules dictionary and - also marks them as "non existent" so they won't be - re-imported. */ - - /* Next, repeatedly delete modules with a reference count of - one (skipping builtins and sys) and delete them */ - do { - ndone = 0; - pos = 0; - while (PyDict_Next(modules, &pos, &key, &value)) { - if (value->ob_refcnt != 1) + end because it is implicitly referenced (e.g. by print). */ + if (weaklist != NULL) { + Py_ssize_t i, n; + n = PyList_GET_SIZE(weaklist); + for (i = 0; i < n; i++) { + PyObject *tup = PyList_GET_ITEM(weaklist, i); + PyObject *name = PyTuple_GET_ITEM(tup, 0); + PyObject *mod = PyWeakref_GET_OBJECT(PyTuple_GET_ITEM(tup, 1)); + if (mod == Py_None) continue; - if (PyUnicode_Check(key) && PyModule_Check(value)) { - if (PyUnicode_CompareWithASCIIString(key, "builtins") == 0) - continue; - if (PyUnicode_CompareWithASCIIString(key, "sys") == 0) - continue; - if (Py_VerboseFlag) - PySys_FormatStderr( - "# cleanup[1] %U\n", key); - _PyModule_Clear(value); - PyDict_SetItem(modules, key, Py_None); - ndone++; - } - } - } while (ndone > 0); - - /* Next, delete all modules (still skipping builtins and sys) */ - pos = 0; - while (PyDict_Next(modules, &pos, &key, &value)) { - if (PyUnicode_Check(key) && PyModule_Check(value)) { - if (PyUnicode_CompareWithASCIIString(key, "builtins") == 0) + assert(PyModule_Check(mod)); + dict = PyModule_GetDict(mod); + if (dict == interp->builtins || dict == interp->sysdict) continue; - if (PyUnicode_CompareWithASCIIString(key, "sys") == 0) - continue; - if (Py_VerboseFlag) - PySys_FormatStderr("# cleanup[2] %U\n", key); - _PyModule_Clear(value); - PyDict_SetItem(modules, key, Py_None); + Py_INCREF(mod); + if (Py_VerboseFlag && PyUnicode_Check(name)) + PySys_FormatStderr("# cleanup[3] wiping %U\n", name); + _PyModule_Clear(mod); + Py_DECREF(mod); } + Py_DECREF(weaklist); } /* Next, delete sys and builtins (in that order) */ - value = PyDict_GetItemString(modules, "sys"); - if (value != NULL && PyModule_Check(value)) { - if (Py_VerboseFlag) - PySys_WriteStderr("# cleanup sys\n"); - _PyModule_Clear(value); - PyDict_SetItemString(modules, "sys", Py_None); - } - value = PyDict_GetItemString(modules, "builtins"); - if (value != NULL && PyModule_Check(value)) { - if (Py_VerboseFlag) - PySys_WriteStderr("# cleanup builtins\n"); - _PyModule_Clear(value); - PyDict_SetItemString(modules, "builtins", Py_None); - } + if (Py_VerboseFlag) + PySys_FormatStderr("# cleanup[3] wiping sys\n"); + _PyModule_ClearDict(interp->sysdict); + if (Py_VerboseFlag) + PySys_FormatStderr("# cleanup[3] wiping builtins\n"); + _PyModule_ClearDict(interp->builtins); - /* Finally, clear and delete the modules directory */ - PyDict_Clear(modules); + /* Clear and delete the modules directory. Actual modules will + still be there only if imported during the execution of some + destructor. */ interp->modules = NULL; Py_DECREF(modules); + + /* Once more */ + _PyGC_CollectNoFail(); + +#undef STORE_MODULE_WEAKREF } @@ -454,12 +571,12 @@ PyImport_GetMagicTag(void) /* Magic for extension modules (built-in as well as dynamically loaded). To prevent initializing an extension module more than - once, we keep a static dictionary 'extensions' keyed by module name - (for built-in modules) or by filename (for dynamically loaded - modules), containing these modules. A copy of the module's - dictionary is stored by calling _PyImport_FixupExtensionObject() - immediately after the module initialization function succeeds. A - copy can be retrieved from there by calling + once, we keep a static dictionary 'extensions' keyed by the tuple + (module name, module name) (for built-in modules) or by + (filename, module name) (for dynamically loaded modules), containing these + modules. A copy of the module's dictionary is stored by calling + _PyImport_FixupExtensionObject() immediately after the module initialization + function succeeds. A copy can be retrieved from there by calling _PyImport_FindExtensionObject(). Modules which do support multiple initialization set their m_size @@ -472,8 +589,9 @@ int _PyImport_FixupExtensionObject(PyObject *mod, PyObject *name, PyObject *filename) { - PyObject *modules, *dict; + PyObject *modules, *dict, *key; struct PyModuleDef *def; + int res; if (extensions == NULL) { extensions = PyDict_New(); if (extensions == NULL) @@ -509,12 +627,18 @@ _PyImport_FixupExtensionObject(PyObject *mod, PyObject *name, if (def->m_base.m_copy == NULL) return -1; } - PyDict_SetItem(extensions, filename, (PyObject*)def); + key = PyTuple_Pack(2, filename, name); + if (key == NULL) + return -1; + res = PyDict_SetItem(extensions, key, (PyObject *)def); + Py_DECREF(key); + if (res < 0) + return -1; return 0; } int -_PyImport_FixupBuiltin(PyObject *mod, char *name) +_PyImport_FixupBuiltin(PyObject *mod, const char *name) { int res; PyObject *nameobj; @@ -529,11 +653,15 @@ _PyImport_FixupBuiltin(PyObject *mod, char *name) PyObject * _PyImport_FindExtensionObject(PyObject *name, PyObject *filename) { - PyObject *mod, *mdict; + PyObject *mod, *mdict, *key; PyModuleDef* def; if (extensions == NULL) return NULL; - def = (PyModuleDef*)PyDict_GetItem(extensions, filename); + key = PyTuple_Pack(2, filename, name); + if (key == NULL) + return NULL; + def = (PyModuleDef *)PyDict_GetItem(extensions, key); + Py_DECREF(key); if (def == NULL) return NULL; if (def->m_size == -1) { @@ -649,22 +777,23 @@ remove_module(PyObject *name) * interface. The other two exist primarily for backward compatibility. */ PyObject * -PyImport_ExecCodeModule(char *name, PyObject *co) +PyImport_ExecCodeModule(const char *name, PyObject *co) { return PyImport_ExecCodeModuleWithPathnames( name, co, (char *)NULL, (char *)NULL); } PyObject * -PyImport_ExecCodeModuleEx(char *name, PyObject *co, char *pathname) +PyImport_ExecCodeModuleEx(const char *name, PyObject *co, const char *pathname) { return PyImport_ExecCodeModuleWithPathnames( name, co, pathname, (char *)NULL); } PyObject * -PyImport_ExecCodeModuleWithPathnames(char *name, PyObject *co, char *pathname, - char *cpathname) +PyImport_ExecCodeModuleWithPathnames(const char *name, PyObject *co, + const char *pathname, + const char *cpathname) { PyObject *m = NULL; PyObject *nameobj, *pathobj = NULL, *cpathobj = NULL; @@ -695,7 +824,7 @@ PyImport_ExecCodeModuleWithPathnames(char *name, PyObject *co, char *pathname, "no interpreter!"); } - pathobj = _PyObject_CallMethodObjIdArgs(interp->importlib, + pathobj = _PyObject_CallMethodIdObjArgs(interp->importlib, &PyId__get_sourcefile, cpathobj, NULL); if (pathobj == NULL) @@ -712,12 +841,10 @@ error: return m; } -PyObject* -PyImport_ExecCodeModuleObject(PyObject *name, PyObject *co, PyObject *pathname, - PyObject *cpathname) +static PyObject * +module_dict_for_exec(PyObject *name) { - PyObject *modules = PyImport_GetModuleDict(); - PyObject *m, *d, *v; + PyObject *m, *d = NULL; m = PyImport_AddModuleObject(name); if (m == NULL) @@ -727,31 +854,26 @@ PyImport_ExecCodeModuleObject(PyObject *name, PyObject *co, PyObject *pathname, d = PyModule_GetDict(m); if (PyDict_GetItemString(d, "__builtins__") == NULL) { if (PyDict_SetItemString(d, "__builtins__", - PyEval_GetBuiltins()) != 0) - goto error; - } - if (pathname != NULL) { - v = pathname; - } - else { - v = ((PyCodeObject *)co)->co_filename; + PyEval_GetBuiltins()) != 0) { + remove_module(name); + return NULL; + } } - Py_INCREF(v); - if (PyDict_SetItemString(d, "__file__", v) != 0) - PyErr_Clear(); /* Not important enough to report */ - Py_DECREF(v); - /* Remember the pyc path name as the __cached__ attribute. */ - if (cpathname != NULL) - v = cpathname; - else - v = Py_None; - if (PyDict_SetItemString(d, "__cached__", v) != 0) - PyErr_Clear(); /* Not important enough to report */ + return d; /* Return a borrowed reference. */ +} - v = PyEval_EvalCode(co, d, d); - if (v == NULL) - goto error; +static PyObject * +exec_code_in_module(PyObject *name, PyObject *module_dict, PyObject *code_object) +{ + PyObject *modules = PyImport_GetModuleDict(); + PyObject *v, *m; + + v = PyEval_EvalCode(code_object, module_dict, module_dict); + if (v == NULL) { + remove_module(name); + return NULL; + } Py_DECREF(v); if ((m = PyDict_GetItem(modules, name)) == NULL) { @@ -764,10 +886,32 @@ PyImport_ExecCodeModuleObject(PyObject *name, PyObject *co, PyObject *pathname, Py_INCREF(m); return m; +} - error: - remove_module(name); - return NULL; +PyObject* +PyImport_ExecCodeModuleObject(PyObject *name, PyObject *co, PyObject *pathname, + PyObject *cpathname) +{ + PyObject *d, *res; + PyInterpreterState *interp = PyThreadState_GET()->interp; + _Py_IDENTIFIER(_fix_up_module); + + d = module_dict_for_exec(name); + if (d == NULL) { + return NULL; + } + + if (pathname == NULL) { + pathname = ((PyCodeObject *)co)->co_filename; + } + res = _PyObject_CallMethodIdObjArgs(interp->importlib, + &PyId__fix_up_module, + d, name, pathname, cpathname, NULL); + if (res != NULL) { + Py_DECREF(res); + res = exec_code_in_module(name, d, co); + } + return res; } @@ -809,35 +953,66 @@ update_compiled_module(PyCodeObject *co, PyObject *newname) Py_DECREF(oldname); } -static PyObject * -imp_fix_co_filename(PyObject *self, PyObject *args) -{ - PyObject *co; - PyObject *file_path; +/*[clinic input] +_imp._fix_co_filename - if (!PyArg_ParseTuple(args, "OO:_fix_co_filename", &co, &file_path)) - return NULL; + code: object(type="PyCodeObject *", subclass_of="&PyCode_Type") + Code object to change. - if (!PyCode_Check(co)) { - PyErr_SetString(PyExc_TypeError, - "first argument must be a code object"); - return NULL; - } + path: unicode + File path to use. + / - if (!PyUnicode_Check(file_path)) { - PyErr_SetString(PyExc_TypeError, - "second argument must be a string"); - return NULL; - } +Changes code.co_filename to specify the passed-in file path. +[clinic start generated code]*/ - update_compiled_module((PyCodeObject*)co, file_path); +PyDoc_STRVAR(_imp__fix_co_filename__doc__, +"_fix_co_filename($module, code, path, /)\n" +"--\n" +"\n" +"Changes code.co_filename to specify the passed-in file path.\n" +"\n" +" code\n" +" Code object to change.\n" +" path\n" +" File path to use."); + +#define _IMP__FIX_CO_FILENAME_METHODDEF \ + {"_fix_co_filename", (PyCFunction)_imp__fix_co_filename, METH_VARARGS, _imp__fix_co_filename__doc__}, + +static PyObject * +_imp__fix_co_filename_impl(PyModuleDef *module, PyCodeObject *code, PyObject *path); + +static PyObject * +_imp__fix_co_filename(PyModuleDef *module, PyObject *args) +{ + PyObject *return_value = NULL; + PyCodeObject *code; + PyObject *path; + + if (!PyArg_ParseTuple(args, + "O!U:_fix_co_filename", + &PyCode_Type, &code, &path)) + goto exit; + return_value = _imp__fix_co_filename_impl(module, code, path); + +exit: + return return_value; +} + +static PyObject * +_imp__fix_co_filename_impl(PyModuleDef *module, PyCodeObject *code, PyObject *path) +/*[clinic end generated code: output=6b4b1edeb0d55c5d input=895ba50e78b82f05]*/ + +{ + update_compiled_module(code, path); Py_RETURN_NONE; } /* Forward */ -static struct _frozen * find_frozen(PyObject *); +static const struct _frozen * find_frozen(PyObject *); /* Helper to test for built-in module */ @@ -919,11 +1094,11 @@ PyAPI_FUNC(PyObject *) PyImport_GetImporter(PyObject *path) { PyObject *importer=NULL, *path_importer_cache=NULL, *path_hooks=NULL; - if ((path_importer_cache = PySys_GetObject("path_importer_cache"))) { - if ((path_hooks = PySys_GetObject("path_hooks"))) { - importer = get_path_importer(path_importer_cache, - path_hooks, path); - } + path_importer_cache = PySys_GetObject("path_importer_cache"); + path_hooks = PySys_GetObject("path_hooks"); + if (path_importer_cache != NULL && path_hooks != NULL) { + importer = get_path_importer(path_importer_cache, + path_hooks, path); } Py_XINCREF(importer); /* get_path_importer returns a borrowed reference */ return importer; @@ -940,8 +1115,12 @@ static int init_builtin(PyObject *name) { struct _inittab *p; + PyObject *mod; - if (_PyImport_FindExtensionObject(name, name) != NULL) + mod = _PyImport_FindExtensionObject(name, name); + if (PyErr_Occurred()) + return -1; + if (mod != NULL) return 1; for (p = PyImport_Inittab; p->name != NULL; p++) { @@ -974,10 +1153,10 @@ init_builtin(PyObject *name) /* Frozen modules */ -static struct _frozen * +static const struct _frozen * find_frozen(PyObject *name) { - struct _frozen *p; + const struct _frozen *p; if (name == NULL) return NULL; @@ -994,7 +1173,7 @@ find_frozen(PyObject *name) static PyObject * get_frozen_object(PyObject *name) { - struct _frozen *p = find_frozen(name); + const struct _frozen *p = find_frozen(name); int size; if (p == NULL) { @@ -1012,13 +1191,13 @@ get_frozen_object(PyObject *name) size = p->size; if (size < 0) size = -size; - return PyMarshal_ReadObjectFromString((char *)p->code, size); + return PyMarshal_ReadObjectFromString((const char *)p->code, size); } static PyObject * is_frozen_package(PyObject *name) { - struct _frozen *p = find_frozen(name); + const struct _frozen *p = find_frozen(name); int size; if (p == NULL) { @@ -1045,8 +1224,8 @@ is_frozen_package(PyObject *name) int PyImport_ImportFrozenModuleObject(PyObject *name) { - struct _frozen *p; - PyObject *co, *m, *path; + const struct _frozen *p; + PyObject *co, *m, *d; int ispackage; int size; @@ -1064,7 +1243,7 @@ PyImport_ImportFrozenModuleObject(PyObject *name) ispackage = (size < 0); if (ispackage) size = -size; - co = PyMarshal_ReadObjectFromString((char *)p->code, size); + co = PyMarshal_ReadObjectFromString((const char *)p->code, size); if (co == NULL) return -1; if (!PyCode_Check(co)) { @@ -1074,29 +1253,27 @@ PyImport_ImportFrozenModuleObject(PyObject *name) goto err_return; } if (ispackage) { - /* Set __path__ to the package name */ - PyObject *d, *l; + /* Set __path__ to the empty list */ + PyObject *l; int err; m = PyImport_AddModuleObject(name); if (m == NULL) goto err_return; d = PyModule_GetDict(m); - l = PyList_New(1); + l = PyList_New(0); if (l == NULL) { goto err_return; } - Py_INCREF(name); - PyList_SET_ITEM(l, 0, name); err = PyDict_SetItemString(d, "__path__", l); Py_DECREF(l); if (err != 0) goto err_return; } - path = PyUnicode_FromString("<frozen>"); - if (path == NULL) + d = module_dict_for_exec(name); + if (d == NULL) { goto err_return; - m = PyImport_ExecCodeModuleObject(name, co, path, NULL); - Py_DECREF(path); + } + m = exec_code_in_module(name, d, co); if (m == NULL) goto err_return; Py_DECREF(co); @@ -1108,7 +1285,7 @@ err_return: } int -PyImport_ImportFrozenModule(char *name) +PyImport_ImportFrozenModule(const char *name) { PyObject *nameobj; int ret; @@ -1222,7 +1399,8 @@ PyImport_ImportModuleLevelObject(PyObject *name, PyObject *given_globals, int level) { _Py_IDENTIFIER(__import__); - _Py_IDENTIFIER(__initializing__); + _Py_IDENTIFIER(__spec__); + _Py_IDENTIFIER(_initializing); _Py_IDENTIFIER(__package__); _Py_IDENTIFIER(__path__); _Py_IDENTIFIER(__name__); @@ -1238,6 +1416,7 @@ PyImport_ImportModuleLevelObject(PyObject *name, PyObject *given_globals, PyObject *globals = NULL; PyObject *fromlist = NULL; PyInterpreterState *interp = PyThreadState_GET()->interp; + int has_from; /* Make sure to use default values so as to not have PyObject_CallMethodObjArgs() truncate the parameter list because of a @@ -1358,7 +1537,11 @@ PyImport_ImportModuleLevelObject(PyObject *name, PyObject *given_globals, goto error; } } + base = PyUnicode_Substring(package, 0, last_dot); + if (base == NULL) + goto error; + if (PyUnicode_GET_LENGTH(name) > 0) { PyObject *borrowed_dot, *seq = NULL; @@ -1412,16 +1595,21 @@ PyImport_ImportModuleLevelObject(PyObject *name, PyObject *given_globals, goto error_with_unlock; } else if (mod != NULL) { - PyObject *value; + PyObject *value = NULL; + PyObject *spec; int initializing = 0; Py_INCREF(mod); /* Optimization: only call _bootstrap._lock_unlock_module() if - __initializing__ is true. - NOTE: because of this, __initializing__ must be set *before* + __spec__._initializing is true. + NOTE: because of this, initializing must be set *before* stuffing the new module in sys.modules. */ - value = _PyObject_GetAttrId(mod, &PyId___initializing__); + spec = _PyObject_GetAttrId(mod, &PyId___spec__); + if (spec != NULL) { + value = _PyObject_GetAttrId(spec, &PyId__initializing); + Py_DECREF(spec); + } if (value == NULL) PyErr_Clear(); else { @@ -1432,7 +1620,7 @@ PyImport_ImportModuleLevelObject(PyObject *name, PyObject *given_globals, } if (initializing > 0) { /* _bootstrap._lock_unlock_module() releases the import lock */ - value = _PyObject_CallMethodObjIdArgs(interp->importlib, + value = _PyObject_CallMethodIdObjArgs(interp->importlib, &PyId__lock_unlock_module, abs_name, NULL); if (value == NULL) @@ -1450,7 +1638,7 @@ PyImport_ImportModuleLevelObject(PyObject *name, PyObject *given_globals, } else { /* _bootstrap._find_and_load() releases the import lock */ - mod = _PyObject_CallMethodObjIdArgs(interp->importlib, + mod = _PyObject_CallMethodIdObjArgs(interp->importlib, &PyId__find_and_load, abs_name, builtins_import, NULL); if (mod == NULL) { @@ -1459,7 +1647,10 @@ PyImport_ImportModuleLevelObject(PyObject *name, PyObject *given_globals, } /* From now on we don't hold the import lock anymore. */ - if (PyObject_Not(fromlist)) { + has_from = PyObject_IsTrue(fromlist); + if (has_from < 0) + goto error; + if (!has_from) { if (level == 0 || PyUnicode_GET_LENGTH(name) > 0) { PyObject *front = NULL; PyObject *partition = NULL; @@ -1519,7 +1710,7 @@ PyImport_ImportModuleLevelObject(PyObject *name, PyObject *given_globals, } } else { - final_mod = _PyObject_CallMethodObjIdArgs(interp->importlib, + final_mod = _PyObject_CallMethodIdObjArgs(interp->importlib, &PyId__handle_fromlist, mod, fromlist, builtins_import, NULL); @@ -1671,8 +1862,33 @@ PyImport_Import(PyObject *module_name) return r; } +/*[clinic input] +_imp.extension_suffixes + +Returns the list of file suffixes used to identify extension modules. +[clinic start generated code]*/ + +PyDoc_STRVAR(_imp_extension_suffixes__doc__, +"extension_suffixes($module, /)\n" +"--\n" +"\n" +"Returns the list of file suffixes used to identify extension modules."); + +#define _IMP_EXTENSION_SUFFIXES_METHODDEF \ + {"extension_suffixes", (PyCFunction)_imp_extension_suffixes, METH_NOARGS, _imp_extension_suffixes__doc__}, + static PyObject * -imp_extension_suffixes(PyObject *self, PyObject *noargs) +_imp_extension_suffixes_impl(PyModuleDef *module); + +static PyObject * +_imp_extension_suffixes(PyModuleDef *module, PyObject *Py_UNUSED(ignored)) +{ + return _imp_extension_suffixes_impl(module); +} + +static PyObject * +_imp_extension_suffixes_impl(PyModuleDef *module) +/*[clinic end generated code: output=bb30a2438167798c input=ecdeeecfcb6f839e]*/ { PyObject *list; const char *suffix; @@ -1700,14 +1916,50 @@ imp_extension_suffixes(PyObject *self, PyObject *noargs) return list; } +/*[clinic input] +_imp.init_builtin + + name: unicode + / + +Initializes a built-in module. +[clinic start generated code]*/ + +PyDoc_STRVAR(_imp_init_builtin__doc__, +"init_builtin($module, name, /)\n" +"--\n" +"\n" +"Initializes a built-in module."); + +#define _IMP_INIT_BUILTIN_METHODDEF \ + {"init_builtin", (PyCFunction)_imp_init_builtin, METH_VARARGS, _imp_init_builtin__doc__}, + +static PyObject * +_imp_init_builtin_impl(PyModuleDef *module, PyObject *name); + static PyObject * -imp_init_builtin(PyObject *self, PyObject *args) +_imp_init_builtin(PyModuleDef *module, PyObject *args) { + PyObject *return_value = NULL; PyObject *name; + + if (!PyArg_ParseTuple(args, + "U:init_builtin", + &name)) + goto exit; + return_value = _imp_init_builtin_impl(module, name); + +exit: + return return_value; +} + +static PyObject * +_imp_init_builtin_impl(PyModuleDef *module, PyObject *name) +/*[clinic end generated code: output=a0244948a43f8e26 input=f934d2231ec52a2e]*/ +{ int ret; PyObject *m; - if (!PyArg_ParseTuple(args, "U:init_builtin", &name)) - return NULL; + ret = init_builtin(name); if (ret < 0) return NULL; @@ -1720,14 +1972,50 @@ imp_init_builtin(PyObject *self, PyObject *args) return m; } +/*[clinic input] +_imp.init_frozen + + name: unicode + / + +Initializes a frozen module. +[clinic start generated code]*/ + +PyDoc_STRVAR(_imp_init_frozen__doc__, +"init_frozen($module, name, /)\n" +"--\n" +"\n" +"Initializes a frozen module."); + +#define _IMP_INIT_FROZEN_METHODDEF \ + {"init_frozen", (PyCFunction)_imp_init_frozen, METH_VARARGS, _imp_init_frozen__doc__}, + static PyObject * -imp_init_frozen(PyObject *self, PyObject *args) +_imp_init_frozen_impl(PyModuleDef *module, PyObject *name); + +static PyObject * +_imp_init_frozen(PyModuleDef *module, PyObject *args) { + PyObject *return_value = NULL; PyObject *name; + + if (!PyArg_ParseTuple(args, + "U:init_frozen", + &name)) + goto exit; + return_value = _imp_init_frozen_impl(module, name); + +exit: + return return_value; +} + +static PyObject * +_imp_init_frozen_impl(PyModuleDef *module, PyObject *name) +/*[clinic end generated code: output=e4bc2bff296f8f22 input=13019adfc04f3fb3]*/ +{ int ret; PyObject *m; - if (!PyArg_ParseTuple(args, "U:init_frozen", &name)) - return NULL; + ret = PyImport_ImportFrozenModuleObject(name); if (ret < 0) return NULL; @@ -1740,61 +2028,239 @@ imp_init_frozen(PyObject *self, PyObject *args) return m; } +/*[clinic input] +_imp.get_frozen_object + + name: unicode + / + +Create a code object for a frozen module. +[clinic start generated code]*/ + +PyDoc_STRVAR(_imp_get_frozen_object__doc__, +"get_frozen_object($module, name, /)\n" +"--\n" +"\n" +"Create a code object for a frozen module."); + +#define _IMP_GET_FROZEN_OBJECT_METHODDEF \ + {"get_frozen_object", (PyCFunction)_imp_get_frozen_object, METH_VARARGS, _imp_get_frozen_object__doc__}, + +static PyObject * +_imp_get_frozen_object_impl(PyModuleDef *module, PyObject *name); + static PyObject * -imp_get_frozen_object(PyObject *self, PyObject *args) +_imp_get_frozen_object(PyModuleDef *module, PyObject *args) { + PyObject *return_value = NULL; PyObject *name; - if (!PyArg_ParseTuple(args, "U:get_frozen_object", &name)) - return NULL; + if (!PyArg_ParseTuple(args, + "U:get_frozen_object", + &name)) + goto exit; + return_value = _imp_get_frozen_object_impl(module, name); + +exit: + return return_value; +} + +static PyObject * +_imp_get_frozen_object_impl(PyModuleDef *module, PyObject *name) +/*[clinic end generated code: output=4089ec702a9d70c5 input=ed689bc05358fdbd]*/ +{ return get_frozen_object(name); } +/*[clinic input] +_imp.is_frozen_package + + name: unicode + / + +Returns True if the module name is of a frozen package. +[clinic start generated code]*/ + +PyDoc_STRVAR(_imp_is_frozen_package__doc__, +"is_frozen_package($module, name, /)\n" +"--\n" +"\n" +"Returns True if the module name is of a frozen package."); + +#define _IMP_IS_FROZEN_PACKAGE_METHODDEF \ + {"is_frozen_package", (PyCFunction)_imp_is_frozen_package, METH_VARARGS, _imp_is_frozen_package__doc__}, + +static PyObject * +_imp_is_frozen_package_impl(PyModuleDef *module, PyObject *name); + static PyObject * -imp_is_frozen_package(PyObject *self, PyObject *args) +_imp_is_frozen_package(PyModuleDef *module, PyObject *args) { + PyObject *return_value = NULL; PyObject *name; - if (!PyArg_ParseTuple(args, "U:is_frozen_package", &name)) - return NULL; + if (!PyArg_ParseTuple(args, + "U:is_frozen_package", + &name)) + goto exit; + return_value = _imp_is_frozen_package_impl(module, name); + +exit: + return return_value; +} + +static PyObject * +_imp_is_frozen_package_impl(PyModuleDef *module, PyObject *name) +/*[clinic end generated code: output=86aab14dcd4b959b input=81b6cdecd080fbb8]*/ +{ return is_frozen_package(name); } +/*[clinic input] +_imp.is_builtin + + name: unicode + / + +Returns True if the module name corresponds to a built-in module. +[clinic start generated code]*/ + +PyDoc_STRVAR(_imp_is_builtin__doc__, +"is_builtin($module, name, /)\n" +"--\n" +"\n" +"Returns True if the module name corresponds to a built-in module."); + +#define _IMP_IS_BUILTIN_METHODDEF \ + {"is_builtin", (PyCFunction)_imp_is_builtin, METH_VARARGS, _imp_is_builtin__doc__}, + +static PyObject * +_imp_is_builtin_impl(PyModuleDef *module, PyObject *name); + static PyObject * -imp_is_builtin(PyObject *self, PyObject *args) +_imp_is_builtin(PyModuleDef *module, PyObject *args) { + PyObject *return_value = NULL; PyObject *name; - if (!PyArg_ParseTuple(args, "U:is_builtin", &name)) - return NULL; + + if (!PyArg_ParseTuple(args, + "U:is_builtin", + &name)) + goto exit; + return_value = _imp_is_builtin_impl(module, name); + +exit: + return return_value; +} + +static PyObject * +_imp_is_builtin_impl(PyModuleDef *module, PyObject *name) +/*[clinic end generated code: output=d5847f8cac50946e input=86befdac021dd1c7]*/ +{ return PyLong_FromLong(is_builtin(name)); } +/*[clinic input] +_imp.is_frozen + + name: unicode + / + +Returns True if the module name corresponds to a frozen module. +[clinic start generated code]*/ + +PyDoc_STRVAR(_imp_is_frozen__doc__, +"is_frozen($module, name, /)\n" +"--\n" +"\n" +"Returns True if the module name corresponds to a frozen module."); + +#define _IMP_IS_FROZEN_METHODDEF \ + {"is_frozen", (PyCFunction)_imp_is_frozen, METH_VARARGS, _imp_is_frozen__doc__}, + static PyObject * -imp_is_frozen(PyObject *self, PyObject *args) +_imp_is_frozen_impl(PyModuleDef *module, PyObject *name); + +static PyObject * +_imp_is_frozen(PyModuleDef *module, PyObject *args) { + PyObject *return_value = NULL; PyObject *name; - struct _frozen *p; - if (!PyArg_ParseTuple(args, "U:is_frozen", &name)) - return NULL; + + if (!PyArg_ParseTuple(args, + "U:is_frozen", + &name)) + goto exit; + return_value = _imp_is_frozen_impl(module, name); + +exit: + return return_value; +} + +static PyObject * +_imp_is_frozen_impl(PyModuleDef *module, PyObject *name) +/*[clinic end generated code: output=6691af884ba4987d input=7301dbca1897d66b]*/ +{ + const struct _frozen *p; + p = find_frozen(name); return PyBool_FromLong((long) (p == NULL ? 0 : p->size)); } #ifdef HAVE_DYNAMIC_LOADING +/*[clinic input] +_imp.load_dynamic + + name: unicode + path: fs_unicode + file: object = NULL + / + +Loads an extension module. +[clinic start generated code]*/ + +PyDoc_STRVAR(_imp_load_dynamic__doc__, +"load_dynamic($module, name, path, file=None, /)\n" +"--\n" +"\n" +"Loads an extension module."); + +#define _IMP_LOAD_DYNAMIC_METHODDEF \ + {"load_dynamic", (PyCFunction)_imp_load_dynamic, METH_VARARGS, _imp_load_dynamic__doc__}, + +static PyObject * +_imp_load_dynamic_impl(PyModuleDef *module, PyObject *name, PyObject *path, PyObject *file); + static PyObject * -imp_load_dynamic(PyObject *self, PyObject *args) +_imp_load_dynamic(PyModuleDef *module, PyObject *args) { - PyObject *name, *pathname, *fob = NULL, *mod; + PyObject *return_value = NULL; + PyObject *name; + PyObject *path; + PyObject *file = NULL; + + if (!PyArg_ParseTuple(args, + "UO&|O:load_dynamic", + &name, PyUnicode_FSDecoder, &path, &file)) + goto exit; + return_value = _imp_load_dynamic_impl(module, name, path, file); + +exit: + return return_value; +} + +static PyObject * +_imp_load_dynamic_impl(PyModuleDef *module, PyObject *name, PyObject *path, PyObject *file) +/*[clinic end generated code: output=81d11a1fbd1ea0a8 input=af64f06e4bad3526]*/ +{ + PyObject *mod; FILE *fp; - if (!PyArg_ParseTuple(args, "UO&|O:load_dynamic", - &name, PyUnicode_FSDecoder, &pathname, &fob)) - return NULL; - if (fob != NULL) { - fp = _Py_fopen(pathname, "r"); + if (file != NULL) { + fp = _Py_fopen_obj(path, "r"); if (fp == NULL) { - Py_DECREF(pathname); + Py_DECREF(path); if (!PyErr_Occurred()) PyErr_SetFromErrno(PyExc_IOError); return NULL; @@ -1802,8 +2268,8 @@ imp_load_dynamic(PyObject *self, PyObject *args) } else fp = NULL; - mod = _PyImport_LoadDynamicModule(name, pathname, fp); - Py_DECREF(pathname); + mod = _PyImport_LoadDynamicModule(name, path, fp); + Py_DECREF(path); if (fp) fclose(fp); return mod; @@ -1811,50 +2277,33 @@ imp_load_dynamic(PyObject *self, PyObject *args) #endif /* HAVE_DYNAMIC_LOADING */ +/*[clinic input] +dump buffer +[clinic start generated code]*/ + +#ifndef _IMP_LOAD_DYNAMIC_METHODDEF + #define _IMP_LOAD_DYNAMIC_METHODDEF +#endif /* !defined(_IMP_LOAD_DYNAMIC_METHODDEF) */ +/*[clinic end generated code: output=d07c1d4a343a9579 input=524ce2e021e4eba6]*/ -/* Doc strings */ PyDoc_STRVAR(doc_imp, "(Extremely) low-level import machinery bits as used by importlib and imp."); -PyDoc_STRVAR(doc_extension_suffixes, -"extension_suffixes() -> list of strings\n\ -Returns the list of file suffixes used to identify extension modules."); - -PyDoc_STRVAR(doc_lock_held, -"lock_held() -> boolean\n\ -Return True if the import lock is currently held, else False.\n\ -On platforms without threads, return False."); - -PyDoc_STRVAR(doc_acquire_lock, -"acquire_lock() -> None\n\ -Acquires the interpreter's import lock for the current thread.\n\ -This lock should be used by import hooks to ensure thread-safety\n\ -when importing modules.\n\ -On platforms without threads, this function does nothing."); - -PyDoc_STRVAR(doc_release_lock, -"release_lock() -> None\n\ -Release the interpreter's import lock.\n\ -On platforms without threads, this function does nothing."); - static PyMethodDef imp_methods[] = { - {"extension_suffixes", imp_extension_suffixes, METH_NOARGS, - doc_extension_suffixes}, - {"lock_held", imp_lock_held, METH_NOARGS, doc_lock_held}, - {"acquire_lock", imp_acquire_lock, METH_NOARGS, doc_acquire_lock}, - {"release_lock", imp_release_lock, METH_NOARGS, doc_release_lock}, - {"get_frozen_object", imp_get_frozen_object, METH_VARARGS}, - {"is_frozen_package", imp_is_frozen_package, METH_VARARGS}, - {"init_builtin", imp_init_builtin, METH_VARARGS}, - {"init_frozen", imp_init_frozen, METH_VARARGS}, - {"is_builtin", imp_is_builtin, METH_VARARGS}, - {"is_frozen", imp_is_frozen, METH_VARARGS}, -#ifdef HAVE_DYNAMIC_LOADING - {"load_dynamic", imp_load_dynamic, METH_VARARGS}, -#endif - {"_fix_co_filename", imp_fix_co_filename, METH_VARARGS}, - {NULL, NULL} /* sentinel */ + _IMP_EXTENSION_SUFFIXES_METHODDEF + _IMP_LOCK_HELD_METHODDEF + _IMP_ACQUIRE_LOCK_METHODDEF + _IMP_RELEASE_LOCK_METHODDEF + _IMP_GET_FROZEN_OBJECT_METHODDEF + _IMP_IS_FROZEN_PACKAGE_METHODDEF + _IMP_INIT_BUILTIN_METHODDEF + _IMP_INIT_FROZEN_METHODDEF + _IMP_IS_BUILTIN_METHODDEF + _IMP_IS_FROZEN_METHODDEF + _IMP_LOAD_DYNAMIC_METHODDEF + _IMP__FIX_CO_FILENAME_METHODDEF + {NULL, NULL} /* sentinel */ }; @@ -1944,3 +2393,4 @@ PyImport_AppendInittab(const char *name, PyObject* (*initfunc)(void)) #ifdef __cplusplus } #endif + diff --git a/Python/importdl.c b/Python/importdl.c index 0ea954c..b60f1c7 100644 --- a/Python/importdl.c +++ b/Python/importdl.c @@ -77,6 +77,8 @@ _PyImport_LoadDynamicModule(PyObject *name, PyObject *path, FILE *fp) PyObject *msg = PyUnicode_FromFormat("dynamic module does not define " "init function (PyInit_%s)", shortname); + if (msg == NULL) + goto error; PyErr_SetImportError(msg, name, path); Py_DECREF(msg); goto error; diff --git a/Python/importdl.h b/Python/importdl.h index 6b9cf75..6a51a91 100644 --- a/Python/importdl.h +++ b/Python/importdl.h @@ -18,13 +18,8 @@ extern PyObject *_PyImport_LoadDynamicModule(PyObject *name, PyObject *pathname, #include <windows.h> typedef FARPROC dl_funcptr; #else -#if defined(PYOS_OS2) && !defined(PYCC_GCC) -#include <os2def.h> -typedef int (* APIENTRY dl_funcptr)(); -#else typedef void (*dl_funcptr)(void); #endif -#endif #ifdef __cplusplus diff --git a/Python/importlib.h b/Python/importlib.h index cb6afc5..75bfca4 100644 --- a/Python/importlib.h +++ b/Python/importlib.h @@ -1,1202 +1,915 @@ /* Auto-generated by Modules/_freeze_importlib.c */ -unsigned char _Py_M__importlib[] = { - 99,0,0,0,0,0,0,0,0,0,0,0,0,6,0,0, - 0,64,0,0,0,115,206,3,0,0,100,0,0,90,0,0, - 100,131,0,90,1,0,100,4,0,100,5,0,132,0,0,90, +const unsigned char _Py_M__importlib[] = { + 99,0,0,0,0,0,0,0,0,0,0,0,0,7,0,0, + 0,64,0,0,0,115,228,4,0,0,100,0,0,90,0,0, + 100,163,0,90,1,0,100,4,0,100,5,0,132,0,0,90, 2,0,100,6,0,100,7,0,132,0,0,90,3,0,100,8, 0,100,9,0,132,0,0,90,4,0,100,10,0,100,11,0, 132,0,0,90,5,0,100,12,0,100,13,0,132,0,0,90, 6,0,100,14,0,100,15,0,132,0,0,90,7,0,100,16, 0,100,17,0,132,0,0,90,8,0,100,18,0,100,19,0, - 132,0,0,90,9,0,100,20,0,100,21,0,100,22,0,132, - 1,0,90,10,0,100,23,0,100,24,0,132,0,0,90,11, - 0,101,12,0,101,11,0,106,13,0,131,1,0,90,14,0, - 100,25,0,100,26,0,132,0,0,90,15,0,105,0,0,90, - 16,0,105,0,0,90,17,0,71,100,27,0,100,28,0,132, - 0,0,100,28,0,101,18,0,131,3,0,90,19,0,71,100, - 29,0,100,30,0,132,0,0,100,30,0,131,2,0,90,20, - 0,71,100,31,0,100,32,0,132,0,0,100,32,0,131,2, - 0,90,21,0,100,33,0,100,34,0,132,0,0,90,22,0, - 100,35,0,100,36,0,132,0,0,90,23,0,100,37,0,100, - 38,0,132,0,0,90,24,0,100,39,0,101,25,0,100,40, - 0,131,1,0,100,41,0,62,66,101,25,0,100,42,0,131, - 1,0,100,43,0,62,66,90,26,0,101,27,0,100,44,0, - 100,45,0,132,0,0,101,28,0,100,46,0,100,47,0,100, - 48,0,131,3,0,68,131,1,0,131,1,0,90,29,0,100, - 49,0,90,30,0,100,50,0,103,1,0,90,31,0,100,51, - 0,103,1,0,90,32,0,100,52,0,103,1,0,90,33,0, - 100,130,0,100,53,0,100,54,0,132,1,0,90,35,0,100, - 55,0,100,56,0,132,0,0,90,36,0,100,57,0,100,58, - 0,132,0,0,90,37,0,100,59,0,100,60,0,100,61,0, - 100,62,0,132,0,1,90,38,0,100,63,0,100,64,0,132, - 0,0,90,39,0,100,65,0,100,66,0,132,0,0,90,40, - 0,100,67,0,100,68,0,132,0,0,90,41,0,100,69,0, - 100,70,0,132,0,0,90,42,0,100,71,0,100,72,0,132, - 0,0,90,43,0,100,73,0,100,74,0,132,0,0,90,44, - 0,100,75,0,100,76,0,132,0,0,90,45,0,71,100,77, - 0,100,78,0,132,0,0,100,78,0,131,2,0,90,46,0, - 71,100,79,0,100,80,0,132,0,0,100,80,0,131,2,0, - 90,47,0,71,100,81,0,100,82,0,132,0,0,100,82,0, - 131,2,0,90,48,0,71,100,83,0,100,84,0,132,0,0, - 100,84,0,131,2,0,90,49,0,71,100,85,0,100,86,0, - 132,0,0,100,86,0,101,49,0,131,3,0,90,50,0,71, - 100,87,0,100,88,0,132,0,0,100,88,0,131,2,0,90, - 51,0,71,100,89,0,100,90,0,132,0,0,100,90,0,101, - 51,0,101,50,0,131,4,0,90,52,0,71,100,91,0,100, - 92,0,132,0,0,100,92,0,101,51,0,101,49,0,131,4, - 0,90,53,0,103,0,0,90,54,0,71,100,93,0,100,94, - 0,132,0,0,100,94,0,131,2,0,90,55,0,71,100,95, - 0,100,96,0,132,0,0,100,96,0,131,2,0,90,56,0, - 71,100,97,0,100,98,0,132,0,0,100,98,0,131,2,0, - 90,57,0,71,100,99,0,100,100,0,132,0,0,100,100,0, - 131,2,0,90,58,0,71,100,101,0,100,102,0,132,0,0, - 100,102,0,131,2,0,90,59,0,71,100,103,0,100,104,0, - 132,0,0,100,104,0,131,2,0,90,60,0,100,105,0,100, - 106,0,132,0,0,90,61,0,100,107,0,100,108,0,132,0, - 0,90,62,0,100,109,0,100,110,0,132,0,0,90,63,0, - 100,111,0,90,64,0,100,112,0,100,113,0,132,0,0,90, - 65,0,100,114,0,100,115,0,132,0,0,90,66,0,100,130, - 0,100,46,0,100,116,0,100,117,0,132,2,0,90,67,0, - 100,118,0,100,119,0,132,0,0,90,68,0,100,120,0,100, - 121,0,132,0,0,90,69,0,100,122,0,100,123,0,132,0, - 0,90,70,0,100,130,0,100,130,0,102,0,0,100,46,0, - 100,124,0,100,125,0,132,4,0,90,71,0,100,126,0,100, - 127,0,132,0,0,90,72,0,100,128,0,100,129,0,132,0, - 0,90,73,0,100,130,0,83,40,132,0,0,0,117,83,1, - 0,0,67,111,114,101,32,105,109,112,108,101,109,101,110,116, - 97,116,105,111,110,32,111,102,32,105,109,112,111,114,116,46, - 10,10,84,104,105,115,32,109,111,100,117,108,101,32,105,115, - 32,78,79,84,32,109,101,97,110,116,32,116,111,32,98,101, - 32,100,105,114,101,99,116,108,121,32,105,109,112,111,114,116, - 101,100,33,32,73,116,32,104,97,115,32,98,101,101,110,32, - 100,101,115,105,103,110,101,100,32,115,117,99,104,10,116,104, - 97,116,32,105,116,32,99,97,110,32,98,101,32,98,111,111, - 116,115,116,114,97,112,112,101,100,32,105,110,116,111,32,80, - 121,116,104,111,110,32,97,115,32,116,104,101,32,105,109,112, - 108,101,109,101,110,116,97,116,105,111,110,32,111,102,32,105, - 109,112,111,114,116,46,32,65,115,10,115,117,99,104,32,105, - 116,32,114,101,113,117,105,114,101,115,32,116,104,101,32,105, - 110,106,101,99,116,105,111,110,32,111,102,32,115,112,101,99, - 105,102,105,99,32,109,111,100,117,108,101,115,32,97,110,100, - 32,97,116,116,114,105,98,117,116,101,115,32,105,110,32,111, - 114,100,101,114,32,116,111,10,119,111,114,107,46,32,79,110, - 101,32,115,104,111,117,108,100,32,117,115,101,32,105,109,112, - 111,114,116,108,105,98,32,97,115,32,116,104,101,32,112,117, - 98,108,105,99,45,102,97,99,105,110,103,32,118,101,114,115, - 105,111,110,32,111,102,32,116,104,105,115,32,109,111,100,117, - 108,101,46,10,10,117,3,0,0,0,119,105,110,117,6,0, - 0,0,99,121,103,119,105,110,117,6,0,0,0,100,97,114, - 119,105,110,99,0,0,0,0,0,0,0,0,1,0,0,0, - 2,0,0,0,67,0,0,0,115,49,0,0,0,116,0,0, - 106,1,0,106,2,0,116,3,0,131,1,0,114,33,0,100, - 1,0,100,2,0,132,0,0,125,0,0,110,12,0,100,3, - 0,100,2,0,132,0,0,125,0,0,124,0,0,83,40,4, - 0,0,0,78,99,0,0,0,0,0,0,0,0,0,0,0, - 0,2,0,0,0,83,0,0,0,115,13,0,0,0,100,1, - 0,116,0,0,106,1,0,107,6,0,83,40,2,0,0,0, - 117,53,0,0,0,84,114,117,101,32,105,102,32,102,105,108, - 101,110,97,109,101,115,32,109,117,115,116,32,98,101,32,99, - 104,101,99,107,101,100,32,99,97,115,101,45,105,110,115,101, - 110,115,105,116,105,118,101,108,121,46,115,12,0,0,0,80, - 89,84,72,79,78,67,65,83,69,79,75,40,2,0,0,0, - 117,3,0,0,0,95,111,115,117,7,0,0,0,101,110,118, - 105,114,111,110,40,0,0,0,0,40,0,0,0,0,40,0, - 0,0,0,117,29,0,0,0,60,102,114,111,122,101,110,32, - 105,109,112,111,114,116,108,105,98,46,95,98,111,111,116,115, - 116,114,97,112,62,117,11,0,0,0,95,114,101,108,97,120, - 95,99,97,115,101,34,0,0,0,115,2,0,0,0,0,2, - 117,37,0,0,0,95,109,97,107,101,95,114,101,108,97,120, - 95,99,97,115,101,46,60,108,111,99,97,108,115,62,46,95, - 114,101,108,97,120,95,99,97,115,101,99,0,0,0,0,0, - 0,0,0,0,0,0,0,1,0,0,0,83,0,0,0,115, - 4,0,0,0,100,1,0,83,40,2,0,0,0,117,53,0, - 0,0,84,114,117,101,32,105,102,32,102,105,108,101,110,97, - 109,101,115,32,109,117,115,116,32,98,101,32,99,104,101,99, - 107,101,100,32,99,97,115,101,45,105,110,115,101,110,115,105, - 116,105,118,101,108,121,46,70,40,1,0,0,0,117,5,0, - 0,0,70,97,108,115,101,40,0,0,0,0,40,0,0,0, - 0,40,0,0,0,0,117,29,0,0,0,60,102,114,111,122, - 101,110,32,105,109,112,111,114,116,108,105,98,46,95,98,111, - 111,116,115,116,114,97,112,62,117,11,0,0,0,95,114,101, - 108,97,120,95,99,97,115,101,38,0,0,0,115,2,0,0, - 0,0,2,40,4,0,0,0,117,3,0,0,0,115,121,115, - 117,8,0,0,0,112,108,97,116,102,111,114,109,117,10,0, - 0,0,115,116,97,114,116,115,119,105,116,104,117,27,0,0, - 0,95,67,65,83,69,95,73,78,83,69,78,83,73,84,73, - 86,69,95,80,76,65,84,70,79,82,77,83,40,1,0,0, - 0,117,11,0,0,0,95,114,101,108,97,120,95,99,97,115, - 101,40,0,0,0,0,40,0,0,0,0,117,29,0,0,0, - 60,102,114,111,122,101,110,32,105,109,112,111,114,116,108,105, - 98,46,95,98,111,111,116,115,116,114,97,112,62,117,16,0, - 0,0,95,109,97,107,101,95,114,101,108,97,120,95,99,97, - 115,101,32,0,0,0,115,8,0,0,0,0,1,18,1,15, - 4,12,3,117,16,0,0,0,95,109,97,107,101,95,114,101, - 108,97,120,95,99,97,115,101,99,1,0,0,0,0,0,0, - 0,2,0,0,0,3,0,0,0,67,0,0,0,115,108,0, - 0,0,116,0,0,124,0,0,131,1,0,125,0,0,103,0, - 0,125,1,0,124,1,0,106,1,0,124,0,0,100,1,0, - 64,131,1,0,1,124,1,0,106,1,0,124,0,0,100,2, - 0,63,100,1,0,64,131,1,0,1,124,1,0,106,1,0, - 124,0,0,100,3,0,63,100,1,0,64,131,1,0,1,124, - 1,0,106,1,0,124,0,0,100,4,0,63,100,1,0,64, - 131,1,0,1,116,2,0,124,1,0,131,1,0,83,40,5, - 0,0,0,117,111,0,0,0,67,111,110,118,101,114,116,32, - 97,32,51,50,45,98,105,116,32,105,110,116,101,103,101,114, - 32,116,111,32,108,105,116,116,108,101,45,101,110,100,105,97, - 110,46,10,10,32,32,32,32,88,88,88,32,84,101,109,112, - 111,114,97,114,121,32,117,110,116,105,108,32,109,97,114,115, - 104,97,108,39,115,32,108,111,110,103,32,102,117,110,99,116, - 105,111,110,115,32,97,114,101,32,101,120,112,111,115,101,100, - 46,10,10,32,32,32,32,105,255,0,0,0,105,8,0,0, - 0,105,16,0,0,0,105,24,0,0,0,40,3,0,0,0, - 117,3,0,0,0,105,110,116,117,6,0,0,0,97,112,112, - 101,110,100,117,9,0,0,0,98,121,116,101,97,114,114,97, - 121,40,2,0,0,0,117,1,0,0,0,120,117,9,0,0, - 0,105,110,116,95,98,121,116,101,115,40,0,0,0,0,40, - 0,0,0,0,117,29,0,0,0,60,102,114,111,122,101,110, - 32,105,109,112,111,114,116,108,105,98,46,95,98,111,111,116, - 115,116,114,97,112,62,117,7,0,0,0,95,119,95,108,111, - 110,103,45,0,0,0,115,14,0,0,0,0,6,12,1,6, - 1,17,1,21,1,21,1,21,1,117,7,0,0,0,95,119, - 95,108,111,110,103,99,1,0,0,0,0,0,0,0,2,0, - 0,0,3,0,0,0,67,0,0,0,115,68,0,0,0,124, - 0,0,100,1,0,25,125,1,0,124,1,0,124,0,0,100, - 2,0,25,100,3,0,62,79,125,1,0,124,1,0,124,0, - 0,100,4,0,25,100,5,0,62,79,125,1,0,124,1,0, - 124,0,0,100,6,0,25,100,7,0,62,79,125,1,0,124, - 1,0,83,40,8,0,0,0,117,115,0,0,0,67,111,110, - 118,101,114,116,32,52,32,98,121,116,101,115,32,105,110,32, - 108,105,116,116,108,101,45,101,110,100,105,97,110,32,116,111, - 32,97,110,32,105,110,116,101,103,101,114,46,10,10,32,32, - 32,32,88,88,88,32,84,101,109,112,111,114,97,114,121,32, - 117,110,116,105,108,32,109,97,114,115,104,97,108,39,115,32, - 108,111,110,103,32,102,117,110,99,116,105,111,110,32,97,114, - 101,32,101,120,112,111,115,101,100,46,10,10,32,32,32,32, - 105,0,0,0,0,105,1,0,0,0,105,8,0,0,0,105, - 2,0,0,0,105,16,0,0,0,105,3,0,0,0,105,24, - 0,0,0,40,0,0,0,0,40,2,0,0,0,117,9,0, - 0,0,105,110,116,95,98,121,116,101,115,117,1,0,0,0, - 120,40,0,0,0,0,40,0,0,0,0,117,29,0,0,0, - 60,102,114,111,122,101,110,32,105,109,112,111,114,116,108,105, - 98,46,95,98,111,111,116,115,116,114,97,112,62,117,7,0, - 0,0,95,114,95,108,111,110,103,61,0,0,0,115,10,0, - 0,0,0,6,10,1,18,1,18,1,18,1,117,7,0,0, - 0,95,114,95,108,111,110,103,99,0,0,0,0,0,0,0, - 0,3,0,0,0,4,0,0,0,71,0,0,0,115,103,0, - 0,0,103,0,0,125,1,0,120,71,0,124,0,0,68,93, - 63,0,125,2,0,124,2,0,115,31,0,113,13,0,110,0, - 0,124,1,0,106,0,0,124,2,0,131,1,0,1,124,2, - 0,100,4,0,25,116,1,0,107,7,0,114,13,0,124,1, - 0,106,0,0,116,2,0,131,1,0,1,113,13,0,113,13, - 0,87,100,2,0,106,3,0,124,1,0,100,3,0,100,5, - 0,133,2,0,25,131,1,0,83,40,6,0,0,0,117,31, - 0,0,0,82,101,112,108,97,99,101,109,101,110,116,32,102, - 111,114,32,111,115,46,112,97,116,104,46,106,111,105,110,40, - 41,46,105,1,0,0,0,117,0,0,0,0,78,105,255,255, - 255,255,105,255,255,255,255,40,4,0,0,0,117,6,0,0, - 0,97,112,112,101,110,100,117,15,0,0,0,112,97,116,104, - 95,115,101,112,97,114,97,116,111,114,115,117,8,0,0,0, - 112,97,116,104,95,115,101,112,117,4,0,0,0,106,111,105, - 110,40,3,0,0,0,117,10,0,0,0,112,97,116,104,95, - 112,97,114,116,115,117,9,0,0,0,110,101,119,95,112,97, - 114,116,115,117,4,0,0,0,112,97,114,116,40,0,0,0, - 0,40,0,0,0,0,117,29,0,0,0,60,102,114,111,122, - 101,110,32,105,109,112,111,114,116,108,105,98,46,95,98,111, - 111,116,115,116,114,97,112,62,117,10,0,0,0,95,112,97, - 116,104,95,106,111,105,110,74,0,0,0,115,16,0,0,0, - 0,2,6,1,13,1,6,1,6,1,13,1,16,1,20,1, - 117,10,0,0,0,95,112,97,116,104,95,106,111,105,110,99, - 1,0,0,0,0,0,0,0,6,0,0,0,3,0,0,0, - 67,0,0,0,115,85,0,0,0,120,48,0,116,0,0,124, - 0,0,131,1,0,68,93,28,0,125,1,0,124,1,0,116, - 1,0,107,6,0,114,13,0,124,1,0,125,2,0,80,113, - 13,0,113,13,0,87,116,2,0,125,2,0,124,0,0,106, - 3,0,124,2,0,131,1,0,92,3,0,125,3,0,125,4, - 0,125,5,0,124,3,0,124,5,0,102,2,0,83,40,1, - 0,0,0,117,32,0,0,0,82,101,112,108,97,99,101,109, - 101,110,116,32,102,111,114,32,111,115,46,112,97,116,104,46, - 115,112,108,105,116,40,41,46,40,4,0,0,0,117,8,0, - 0,0,114,101,118,101,114,115,101,100,117,15,0,0,0,112, - 97,116,104,95,115,101,112,97,114,97,116,111,114,115,117,8, - 0,0,0,112,97,116,104,95,115,101,112,117,10,0,0,0, - 114,112,97,114,116,105,116,105,111,110,40,6,0,0,0,117, - 4,0,0,0,112,97,116,104,117,1,0,0,0,120,117,3, - 0,0,0,115,101,112,117,5,0,0,0,102,114,111,110,116, - 117,1,0,0,0,95,117,4,0,0,0,116,97,105,108,40, - 0,0,0,0,40,0,0,0,0,117,29,0,0,0,60,102, - 114,111,122,101,110,32,105,109,112,111,114,116,108,105,98,46, - 95,98,111,111,116,115,116,114,97,112,62,117,11,0,0,0, - 95,112,97,116,104,95,115,112,108,105,116,86,0,0,0,115, - 14,0,0,0,0,2,19,1,12,1,6,1,8,2,6,1, - 24,1,117,11,0,0,0,95,112,97,116,104,95,115,112,108, - 105,116,99,2,0,0,0,0,0,0,0,3,0,0,0,11, - 0,0,0,67,0,0,0,115,61,0,0,0,121,19,0,116, - 0,0,106,1,0,124,0,0,131,1,0,125,2,0,87,110, - 22,0,4,116,2,0,107,10,0,114,43,0,1,1,1,100, - 2,0,83,89,110,1,0,88,124,2,0,106,4,0,100,1, - 0,64,124,1,0,107,2,0,83,40,3,0,0,0,117,49, - 0,0,0,84,101,115,116,32,119,104,101,116,104,101,114,32, - 116,104,101,32,112,97,116,104,32,105,115,32,116,104,101,32, - 115,112,101,99,105,102,105,101,100,32,109,111,100,101,32,116, - 121,112,101,46,105,0,240,0,0,70,40,5,0,0,0,117, - 3,0,0,0,95,111,115,117,4,0,0,0,115,116,97,116, - 117,7,0,0,0,79,83,69,114,114,111,114,117,5,0,0, - 0,70,97,108,115,101,117,7,0,0,0,115,116,95,109,111, - 100,101,40,3,0,0,0,117,4,0,0,0,112,97,116,104, - 117,4,0,0,0,109,111,100,101,117,9,0,0,0,115,116, - 97,116,95,105,110,102,111,40,0,0,0,0,40,0,0,0, - 0,117,29,0,0,0,60,102,114,111,122,101,110,32,105,109, - 112,111,114,116,108,105,98,46,95,98,111,111,116,115,116,114, - 97,112,62,117,18,0,0,0,95,112,97,116,104,95,105,115, - 95,109,111,100,101,95,116,121,112,101,98,0,0,0,115,10, - 0,0,0,0,2,3,1,19,1,13,1,9,1,117,18,0, - 0,0,95,112,97,116,104,95,105,115,95,109,111,100,101,95, - 116,121,112,101,99,1,0,0,0,0,0,0,0,1,0,0, + 132,0,0,90,9,0,100,20,0,100,21,0,132,0,0,90, + 10,0,100,22,0,100,23,0,100,24,0,132,1,0,90,11, + 0,100,25,0,100,26,0,132,0,0,90,12,0,100,27,0, + 100,28,0,132,0,0,90,13,0,101,14,0,101,12,0,106, + 15,0,131,1,0,90,16,0,71,100,29,0,100,30,0,132, + 0,0,100,30,0,131,2,0,90,17,0,105,0,0,90,18, + 0,105,0,0,90,19,0,71,100,31,0,100,32,0,132,0, + 0,100,32,0,101,20,0,131,3,0,90,21,0,71,100,33, + 0,100,34,0,132,0,0,100,34,0,131,2,0,90,22,0, + 71,100,35,0,100,36,0,132,0,0,100,36,0,131,2,0, + 90,23,0,71,100,37,0,100,38,0,132,0,0,100,38,0, + 131,2,0,90,24,0,100,39,0,100,40,0,132,0,0,90, + 25,0,100,41,0,100,42,0,132,0,0,90,26,0,100,43, + 0,100,44,0,132,0,0,90,27,0,100,45,0,106,28,0, + 100,46,0,100,47,0,131,2,0,100,48,0,23,90,29,0, + 101,30,0,106,31,0,101,29,0,100,47,0,131,2,0,90, + 32,0,100,49,0,90,33,0,100,50,0,103,1,0,90,34, + 0,100,51,0,103,1,0,90,35,0,100,52,0,103,1,0, + 90,36,0,100,53,0,100,54,0,100,55,0,132,1,0,90, + 37,0,100,56,0,100,57,0,132,0,0,90,38,0,100,58, + 0,100,59,0,132,0,0,90,39,0,100,60,0,100,61,0, + 132,0,0,90,40,0,100,62,0,100,63,0,100,64,0,100, + 65,0,132,0,1,90,41,0,100,66,0,100,67,0,132,0, + 0,90,42,0,100,68,0,100,69,0,132,0,0,90,43,0, + 100,70,0,100,71,0,132,0,0,90,44,0,100,72,0,100, + 73,0,132,0,0,90,45,0,100,74,0,100,75,0,132,0, + 0,90,46,0,100,53,0,100,53,0,100,53,0,100,76,0, + 100,77,0,132,3,0,90,47,0,100,53,0,100,53,0,100, + 53,0,100,78,0,100,79,0,132,3,0,90,48,0,100,80, + 0,100,80,0,100,81,0,100,82,0,132,2,0,90,49,0, + 100,83,0,100,84,0,132,0,0,90,50,0,100,85,0,100, + 86,0,132,0,0,90,51,0,71,100,87,0,100,88,0,132, + 0,0,100,88,0,131,2,0,90,52,0,71,100,89,0,100, + 90,0,132,0,0,100,90,0,131,2,0,90,53,0,100,91, + 0,100,53,0,100,92,0,100,53,0,100,93,0,100,94,0, + 132,0,2,90,54,0,101,55,0,131,0,0,90,56,0,100, + 53,0,100,95,0,100,53,0,100,96,0,101,56,0,100,97, + 0,100,98,0,132,1,2,90,57,0,100,53,0,100,53,0, + 100,99,0,100,100,0,132,2,0,90,58,0,71,100,101,0, + 100,102,0,132,0,0,100,102,0,131,2,0,90,59,0,100, + 53,0,100,103,0,100,104,0,132,1,0,90,60,0,71,100, + 105,0,100,106,0,132,0,0,100,106,0,131,2,0,90,61, + 0,71,100,107,0,100,108,0,132,0,0,100,108,0,131,2, + 0,90,62,0,71,100,109,0,100,110,0,132,0,0,100,110, + 0,131,2,0,90,63,0,71,100,111,0,100,112,0,132,0, + 0,100,112,0,131,2,0,90,64,0,71,100,113,0,100,114, + 0,132,0,0,100,114,0,101,64,0,131,3,0,90,65,0, + 71,100,115,0,100,116,0,132,0,0,100,116,0,131,2,0, + 90,66,0,71,100,117,0,100,118,0,132,0,0,100,118,0, + 101,66,0,101,65,0,131,4,0,90,67,0,71,100,119,0, + 100,120,0,132,0,0,100,120,0,101,66,0,101,64,0,131, + 4,0,90,68,0,103,0,0,90,69,0,71,100,121,0,100, + 122,0,132,0,0,100,122,0,131,2,0,90,70,0,71,100, + 123,0,100,124,0,132,0,0,100,124,0,131,2,0,90,71, + 0,71,100,125,0,100,126,0,132,0,0,100,126,0,131,2, + 0,90,72,0,71,100,127,0,100,128,0,132,0,0,100,128, + 0,131,2,0,90,73,0,71,100,129,0,100,130,0,132,0, + 0,100,130,0,131,2,0,90,74,0,71,100,131,0,100,132, + 0,132,0,0,100,132,0,131,2,0,90,75,0,100,133,0, + 100,134,0,132,0,0,90,76,0,100,135,0,100,136,0,132, + 0,0,90,77,0,100,53,0,100,137,0,100,138,0,132,1, + 0,90,78,0,100,139,0,100,140,0,132,0,0,90,79,0, + 100,141,0,90,80,0,101,80,0,100,142,0,23,90,81,0, + 100,143,0,100,144,0,132,0,0,90,82,0,100,145,0,100, + 146,0,132,0,0,90,83,0,100,53,0,100,80,0,100,147, + 0,100,148,0,132,2,0,90,84,0,100,149,0,100,150,0, + 132,0,0,90,85,0,100,151,0,100,152,0,132,0,0,90, + 86,0,100,153,0,100,154,0,132,0,0,90,87,0,100,53, + 0,100,53,0,102,0,0,100,80,0,100,155,0,100,156,0, + 132,4,0,90,88,0,100,157,0,100,158,0,132,0,0,90, + 89,0,100,159,0,100,160,0,132,0,0,90,90,0,100,161, + 0,100,162,0,132,0,0,90,91,0,100,53,0,83,41,164, + 97,83,1,0,0,67,111,114,101,32,105,109,112,108,101,109, + 101,110,116,97,116,105,111,110,32,111,102,32,105,109,112,111, + 114,116,46,10,10,84,104,105,115,32,109,111,100,117,108,101, + 32,105,115,32,78,79,84,32,109,101,97,110,116,32,116,111, + 32,98,101,32,100,105,114,101,99,116,108,121,32,105,109,112, + 111,114,116,101,100,33,32,73,116,32,104,97,115,32,98,101, + 101,110,32,100,101,115,105,103,110,101,100,32,115,117,99,104, + 10,116,104,97,116,32,105,116,32,99,97,110,32,98,101,32, + 98,111,111,116,115,116,114,97,112,112,101,100,32,105,110,116, + 111,32,80,121,116,104,111,110,32,97,115,32,116,104,101,32, + 105,109,112,108,101,109,101,110,116,97,116,105,111,110,32,111, + 102,32,105,109,112,111,114,116,46,32,65,115,10,115,117,99, + 104,32,105,116,32,114,101,113,117,105,114,101,115,32,116,104, + 101,32,105,110,106,101,99,116,105,111,110,32,111,102,32,115, + 112,101,99,105,102,105,99,32,109,111,100,117,108,101,115,32, + 97,110,100,32,97,116,116,114,105,98,117,116,101,115,32,105, + 110,32,111,114,100,101,114,32,116,111,10,119,111,114,107,46, + 32,79,110,101,32,115,104,111,117,108,100,32,117,115,101,32, + 105,109,112,111,114,116,108,105,98,32,97,115,32,116,104,101, + 32,112,117,98,108,105,99,45,102,97,99,105,110,103,32,118, + 101,114,115,105,111,110,32,111,102,32,116,104,105,115,32,109, + 111,100,117,108,101,46,10,10,218,3,119,105,110,218,6,99, + 121,103,119,105,110,218,6,100,97,114,119,105,110,99,0,0, + 0,0,0,0,0,0,1,0,0,0,2,0,0,0,67,0, + 0,0,115,49,0,0,0,116,0,0,106,1,0,106,2,0, + 116,3,0,131,1,0,114,33,0,100,1,0,100,2,0,132, + 0,0,125,0,0,110,12,0,100,3,0,100,2,0,132,0, + 0,125,0,0,124,0,0,83,41,4,78,99,0,0,0,0, + 0,0,0,0,0,0,0,0,2,0,0,0,83,0,0,0, + 115,13,0,0,0,100,1,0,116,0,0,106,1,0,107,6, + 0,83,41,2,122,53,84,114,117,101,32,105,102,32,102,105, + 108,101,110,97,109,101,115,32,109,117,115,116,32,98,101,32, + 99,104,101,99,107,101,100,32,99,97,115,101,45,105,110,115, + 101,110,115,105,116,105,118,101,108,121,46,115,12,0,0,0, + 80,89,84,72,79,78,67,65,83,69,79,75,41,2,218,3, + 95,111,115,90,7,101,110,118,105,114,111,110,169,0,114,4, + 0,0,0,114,4,0,0,0,250,29,60,102,114,111,122,101, + 110,32,105,109,112,111,114,116,108,105,98,46,95,98,111,111, + 116,115,116,114,97,112,62,218,11,95,114,101,108,97,120,95, + 99,97,115,101,30,0,0,0,115,2,0,0,0,0,2,122, + 37,95,109,97,107,101,95,114,101,108,97,120,95,99,97,115, + 101,46,60,108,111,99,97,108,115,62,46,95,114,101,108,97, + 120,95,99,97,115,101,99,0,0,0,0,0,0,0,0,0, + 0,0,0,1,0,0,0,83,0,0,0,115,4,0,0,0, + 100,1,0,83,41,2,122,53,84,114,117,101,32,105,102,32, + 102,105,108,101,110,97,109,101,115,32,109,117,115,116,32,98, + 101,32,99,104,101,99,107,101,100,32,99,97,115,101,45,105, + 110,115,101,110,115,105,116,105,118,101,108,121,46,70,114,4, + 0,0,0,114,4,0,0,0,114,4,0,0,0,114,4,0, + 0,0,114,5,0,0,0,114,6,0,0,0,34,0,0,0, + 115,2,0,0,0,0,2,41,4,218,3,115,121,115,218,8, + 112,108,97,116,102,111,114,109,218,10,115,116,97,114,116,115, + 119,105,116,104,218,27,95,67,65,83,69,95,73,78,83,69, + 78,83,73,84,73,86,69,95,80,76,65,84,70,79,82,77, + 83,41,1,114,6,0,0,0,114,4,0,0,0,114,4,0, + 0,0,114,5,0,0,0,218,16,95,109,97,107,101,95,114, + 101,108,97,120,95,99,97,115,101,28,0,0,0,115,8,0, + 0,0,0,1,18,1,15,4,12,3,114,11,0,0,0,99, + 1,0,0,0,0,0,0,0,1,0,0,0,3,0,0,0, + 67,0,0,0,115,26,0,0,0,116,0,0,124,0,0,131, + 1,0,100,1,0,64,106,1,0,100,2,0,100,3,0,131, + 2,0,83,41,4,122,42,67,111,110,118,101,114,116,32,97, + 32,51,50,45,98,105,116,32,105,110,116,101,103,101,114,32, + 116,111,32,108,105,116,116,108,101,45,101,110,100,105,97,110, + 46,108,3,0,0,0,255,127,255,127,3,0,233,4,0,0, + 0,218,6,108,105,116,116,108,101,41,2,218,3,105,110,116, + 218,8,116,111,95,98,121,116,101,115,41,1,218,1,120,114, + 4,0,0,0,114,4,0,0,0,114,5,0,0,0,218,7, + 95,119,95,108,111,110,103,40,0,0,0,115,2,0,0,0, + 0,2,114,17,0,0,0,99,1,0,0,0,0,0,0,0, + 1,0,0,0,3,0,0,0,67,0,0,0,115,16,0,0, + 0,116,0,0,106,1,0,124,0,0,100,1,0,131,2,0, + 83,41,2,122,47,67,111,110,118,101,114,116,32,52,32,98, + 121,116,101,115,32,105,110,32,108,105,116,116,108,101,45,101, + 110,100,105,97,110,32,116,111,32,97,110,32,105,110,116,101, + 103,101,114,46,114,13,0,0,0,41,2,114,14,0,0,0, + 218,10,102,114,111,109,95,98,121,116,101,115,41,1,90,9, + 105,110,116,95,98,121,116,101,115,114,4,0,0,0,114,4, + 0,0,0,114,5,0,0,0,218,7,95,114,95,108,111,110, + 103,45,0,0,0,115,2,0,0,0,0,2,114,19,0,0, + 0,99,0,0,0,0,0,0,0,0,1,0,0,0,3,0, + 0,0,71,0,0,0,115,26,0,0,0,116,0,0,106,1, + 0,100,1,0,100,2,0,132,0,0,124,0,0,68,131,1, + 0,131,1,0,83,41,3,122,31,82,101,112,108,97,99,101, + 109,101,110,116,32,102,111,114,32,111,115,46,112,97,116,104, + 46,106,111,105,110,40,41,46,99,1,0,0,0,0,0,0, + 0,2,0,0,0,4,0,0,0,83,0,0,0,115,37,0, + 0,0,103,0,0,124,0,0,93,27,0,125,1,0,124,1, + 0,114,6,0,124,1,0,106,0,0,116,1,0,131,1,0, + 145,2,0,113,6,0,83,114,4,0,0,0,41,2,218,6, + 114,115,116,114,105,112,218,15,112,97,116,104,95,115,101,112, + 97,114,97,116,111,114,115,41,2,218,2,46,48,218,4,112, + 97,114,116,114,4,0,0,0,114,4,0,0,0,114,5,0, + 0,0,250,10,60,108,105,115,116,99,111,109,112,62,52,0, + 0,0,115,2,0,0,0,9,1,122,30,95,112,97,116,104, + 95,106,111,105,110,46,60,108,111,99,97,108,115,62,46,60, + 108,105,115,116,99,111,109,112,62,41,2,218,8,112,97,116, + 104,95,115,101,112,218,4,106,111,105,110,41,1,218,10,112, + 97,116,104,95,112,97,114,116,115,114,4,0,0,0,114,4, + 0,0,0,114,5,0,0,0,218,10,95,112,97,116,104,95, + 106,111,105,110,50,0,0,0,115,4,0,0,0,0,2,15, + 1,114,28,0,0,0,99,1,0,0,0,0,0,0,0,5, + 0,0,0,5,0,0,0,67,0,0,0,115,134,0,0,0, + 116,0,0,116,1,0,131,1,0,100,1,0,107,2,0,114, + 52,0,124,0,0,106,2,0,116,3,0,131,1,0,92,3, + 0,125,1,0,125,2,0,125,3,0,124,1,0,124,3,0, + 102,2,0,83,120,69,0,116,4,0,124,0,0,131,1,0, + 68,93,55,0,125,4,0,124,4,0,116,1,0,107,6,0, + 114,65,0,124,0,0,106,5,0,124,4,0,100,2,0,100, + 1,0,131,1,1,92,2,0,125,1,0,125,3,0,124,1, + 0,124,3,0,102,2,0,83,113,65,0,87,100,3,0,124, + 0,0,102,2,0,83,41,4,122,32,82,101,112,108,97,99, + 101,109,101,110,116,32,102,111,114,32,111,115,46,112,97,116, + 104,46,115,112,108,105,116,40,41,46,233,1,0,0,0,90, + 8,109,97,120,115,112,108,105,116,218,0,41,6,218,3,108, + 101,110,114,21,0,0,0,218,10,114,112,97,114,116,105,116, + 105,111,110,114,25,0,0,0,218,8,114,101,118,101,114,115, + 101,100,218,6,114,115,112,108,105,116,41,5,218,4,112,97, + 116,104,90,5,102,114,111,110,116,218,1,95,218,4,116,97, + 105,108,114,16,0,0,0,114,4,0,0,0,114,4,0,0, + 0,114,5,0,0,0,218,11,95,112,97,116,104,95,115,112, + 108,105,116,56,0,0,0,115,16,0,0,0,0,2,18,1, + 24,1,10,1,19,1,12,1,27,1,14,1,114,38,0,0, + 0,99,1,0,0,0,0,0,0,0,1,0,0,0,2,0, + 0,0,67,0,0,0,115,13,0,0,0,116,0,0,106,1, + 0,124,0,0,131,1,0,83,41,1,122,126,83,116,97,116, + 32,116,104,101,32,112,97,116,104,46,10,10,32,32,32,32, + 77,97,100,101,32,97,32,115,101,112,97,114,97,116,101,32, + 102,117,110,99,116,105,111,110,32,116,111,32,109,97,107,101, + 32,105,116,32,101,97,115,105,101,114,32,116,111,32,111,118, + 101,114,114,105,100,101,32,105,110,32,101,120,112,101,114,105, + 109,101,110,116,115,10,32,32,32,32,40,101,46,103,46,32, + 99,97,99,104,101,32,115,116,97,116,32,114,101,115,117,108, + 116,115,41,46,10,10,32,32,32,32,41,2,114,3,0,0, + 0,90,4,115,116,97,116,41,1,114,35,0,0,0,114,4, + 0,0,0,114,4,0,0,0,114,5,0,0,0,218,10,95, + 112,97,116,104,95,115,116,97,116,68,0,0,0,115,2,0, + 0,0,0,7,114,39,0,0,0,99,2,0,0,0,0,0, + 0,0,3,0,0,0,11,0,0,0,67,0,0,0,115,58, + 0,0,0,121,16,0,116,0,0,124,0,0,131,1,0,125, + 2,0,87,110,22,0,4,116,1,0,107,10,0,114,40,0, + 1,1,1,100,1,0,83,89,110,1,0,88,124,2,0,106, + 2,0,100,2,0,64,124,1,0,107,2,0,83,41,3,122, + 49,84,101,115,116,32,119,104,101,116,104,101,114,32,116,104, + 101,32,112,97,116,104,32,105,115,32,116,104,101,32,115,112, + 101,99,105,102,105,101,100,32,109,111,100,101,32,116,121,112, + 101,46,70,105,0,240,0,0,41,3,114,39,0,0,0,218, + 7,79,83,69,114,114,111,114,218,7,115,116,95,109,111,100, + 101,41,3,114,35,0,0,0,218,4,109,111,100,101,90,9, + 115,116,97,116,95,105,110,102,111,114,4,0,0,0,114,4, + 0,0,0,114,5,0,0,0,218,18,95,112,97,116,104,95, + 105,115,95,109,111,100,101,95,116,121,112,101,78,0,0,0, + 115,10,0,0,0,0,2,3,1,16,1,13,1,9,1,114, + 43,0,0,0,99,1,0,0,0,0,0,0,0,1,0,0, 0,3,0,0,0,67,0,0,0,115,13,0,0,0,116,0, - 0,124,0,0,100,1,0,131,2,0,83,40,2,0,0,0, - 117,31,0,0,0,82,101,112,108,97,99,101,109,101,110,116, - 32,102,111,114,32,111,115,46,112,97,116,104,46,105,115,102, - 105,108,101,46,105,0,128,0,0,40,1,0,0,0,117,18, - 0,0,0,95,112,97,116,104,95,105,115,95,109,111,100,101, - 95,116,121,112,101,40,1,0,0,0,117,4,0,0,0,112, - 97,116,104,40,0,0,0,0,40,0,0,0,0,117,29,0, - 0,0,60,102,114,111,122,101,110,32,105,109,112,111,114,116, - 108,105,98,46,95,98,111,111,116,115,116,114,97,112,62,117, - 12,0,0,0,95,112,97,116,104,95,105,115,102,105,108,101, - 108,0,0,0,115,2,0,0,0,0,2,117,12,0,0,0, - 95,112,97,116,104,95,105,115,102,105,108,101,99,1,0,0, - 0,0,0,0,0,1,0,0,0,3,0,0,0,67,0,0, - 0,115,34,0,0,0,124,0,0,115,21,0,116,0,0,106, - 1,0,131,0,0,125,0,0,110,0,0,116,2,0,124,0, - 0,100,1,0,131,2,0,83,40,2,0,0,0,117,30,0, - 0,0,82,101,112,108,97,99,101,109,101,110,116,32,102,111, - 114,32,111,115,46,112,97,116,104,46,105,115,100,105,114,46, - 105,0,64,0,0,40,3,0,0,0,117,3,0,0,0,95, - 111,115,117,6,0,0,0,103,101,116,99,119,100,117,18,0, - 0,0,95,112,97,116,104,95,105,115,95,109,111,100,101,95, - 116,121,112,101,40,1,0,0,0,117,4,0,0,0,112,97, - 116,104,40,0,0,0,0,40,0,0,0,0,117,29,0,0, - 0,60,102,114,111,122,101,110,32,105,109,112,111,114,116,108, - 105,98,46,95,98,111,111,116,115,116,114,97,112,62,117,11, - 0,0,0,95,112,97,116,104,95,105,115,100,105,114,114,0, - 0,0,115,6,0,0,0,0,2,6,1,15,1,117,11,0, - 0,0,95,112,97,116,104,95,105,115,100,105,114,105,182,1, - 0,0,99,3,0,0,0,0,0,0,0,6,0,0,0,17, - 0,0,0,67,0,0,0,115,192,0,0,0,100,1,0,106, - 0,0,124,0,0,116,1,0,124,0,0,131,1,0,131,2, - 0,125,3,0,116,2,0,106,3,0,124,3,0,116,2,0, - 106,4,0,116,2,0,106,5,0,66,116,2,0,106,6,0, - 66,124,2,0,100,2,0,64,131,3,0,125,4,0,121,60, - 0,116,7,0,106,8,0,124,4,0,100,3,0,131,2,0, - 143,20,0,125,5,0,124,5,0,106,9,0,124,1,0,131, - 1,0,1,87,100,4,0,81,88,116,2,0,106,10,0,124, - 3,0,124,0,0,131,2,0,1,87,110,59,0,4,116,11, - 0,107,10,0,114,187,0,1,1,1,121,17,0,116,2,0, - 106,12,0,124,3,0,131,1,0,1,87,110,18,0,4,116, - 11,0,107,10,0,114,179,0,1,1,1,89,110,1,0,88, - 130,0,0,89,110,1,0,88,100,4,0,83,40,5,0,0, - 0,117,162,0,0,0,66,101,115,116,45,101,102,102,111,114, - 116,32,102,117,110,99,116,105,111,110,32,116,111,32,119,114, - 105,116,101,32,100,97,116,97,32,116,111,32,97,32,112,97, - 116,104,32,97,116,111,109,105,99,97,108,108,121,46,10,32, - 32,32,32,66,101,32,112,114,101,112,97,114,101,100,32,116, - 111,32,104,97,110,100,108,101,32,97,32,70,105,108,101,69, - 120,105,115,116,115,69,114,114,111,114,32,105,102,32,99,111, - 110,99,117,114,114,101,110,116,32,119,114,105,116,105,110,103, - 32,111,102,32,116,104,101,10,32,32,32,32,116,101,109,112, - 111,114,97,114,121,32,102,105,108,101,32,105,115,32,97,116, - 116,101,109,112,116,101,100,46,117,5,0,0,0,123,125,46, - 123,125,105,182,1,0,0,117,2,0,0,0,119,98,78,40, - 13,0,0,0,117,6,0,0,0,102,111,114,109,97,116,117, - 2,0,0,0,105,100,117,3,0,0,0,95,111,115,117,4, - 0,0,0,111,112,101,110,117,6,0,0,0,79,95,69,88, - 67,76,117,7,0,0,0,79,95,67,82,69,65,84,117,8, - 0,0,0,79,95,87,82,79,78,76,89,117,3,0,0,0, - 95,105,111,117,6,0,0,0,70,105,108,101,73,79,117,5, - 0,0,0,119,114,105,116,101,117,7,0,0,0,114,101,112, - 108,97,99,101,117,7,0,0,0,79,83,69,114,114,111,114, - 117,6,0,0,0,117,110,108,105,110,107,40,6,0,0,0, - 117,4,0,0,0,112,97,116,104,117,4,0,0,0,100,97, - 116,97,117,4,0,0,0,109,111,100,101,117,8,0,0,0, - 112,97,116,104,95,116,109,112,117,2,0,0,0,102,100,117, - 4,0,0,0,102,105,108,101,40,0,0,0,0,40,0,0, - 0,0,117,29,0,0,0,60,102,114,111,122,101,110,32,105, - 109,112,111,114,116,108,105,98,46,95,98,111,111,116,115,116, - 114,97,112,62,117,13,0,0,0,95,119,114,105,116,101,95, - 97,116,111,109,105,99,121,0,0,0,115,26,0,0,0,0, - 5,24,1,9,1,33,1,3,3,21,1,19,1,20,1,13, - 1,3,1,17,1,13,1,5,1,117,13,0,0,0,95,119, - 114,105,116,101,95,97,116,111,109,105,99,99,2,0,0,0, - 0,0,0,0,3,0,0,0,7,0,0,0,67,0,0,0, - 115,95,0,0,0,120,69,0,100,1,0,100,2,0,100,3, - 0,100,4,0,103,4,0,68,93,49,0,125,2,0,116,0, - 0,124,1,0,124,2,0,131,2,0,114,19,0,116,1,0, - 124,0,0,124,2,0,116,2,0,124,1,0,124,2,0,131, - 2,0,131,3,0,1,113,19,0,113,19,0,87,124,0,0, - 106,3,0,106,4,0,124,1,0,106,3,0,131,1,0,1, - 100,5,0,83,40,6,0,0,0,117,47,0,0,0,83,105, - 109,112,108,101,32,115,117,98,115,116,105,116,117,116,101,32, - 102,111,114,32,102,117,110,99,116,111,111,108,115,46,117,112, - 100,97,116,101,95,119,114,97,112,112,101,114,46,117,10,0, - 0,0,95,95,109,111,100,117,108,101,95,95,117,8,0,0, - 0,95,95,110,97,109,101,95,95,117,12,0,0,0,95,95, - 113,117,97,108,110,97,109,101,95,95,117,7,0,0,0,95, - 95,100,111,99,95,95,78,40,5,0,0,0,117,7,0,0, - 0,104,97,115,97,116,116,114,117,7,0,0,0,115,101,116, - 97,116,116,114,117,7,0,0,0,103,101,116,97,116,116,114, - 117,8,0,0,0,95,95,100,105,99,116,95,95,117,6,0, - 0,0,117,112,100,97,116,101,40,3,0,0,0,117,3,0, - 0,0,110,101,119,117,3,0,0,0,111,108,100,117,7,0, - 0,0,114,101,112,108,97,99,101,40,0,0,0,0,40,0, - 0,0,0,117,29,0,0,0,60,102,114,111,122,101,110,32, - 105,109,112,111,114,116,108,105,98,46,95,98,111,111,116,115, - 116,114,97,112,62,117,5,0,0,0,95,119,114,97,112,143, - 0,0,0,115,8,0,0,0,0,2,25,1,15,1,32,1, - 117,5,0,0,0,95,119,114,97,112,99,1,0,0,0,0, - 0,0,0,1,0,0,0,2,0,0,0,67,0,0,0,115, - 16,0,0,0,116,0,0,116,1,0,131,1,0,124,0,0, - 131,1,0,83,40,1,0,0,0,117,75,0,0,0,67,114, - 101,97,116,101,32,97,32,110,101,119,32,109,111,100,117,108, - 101,46,10,10,32,32,32,32,84,104,101,32,109,111,100,117, - 108,101,32,105,115,32,110,111,116,32,101,110,116,101,114,101, - 100,32,105,110,116,111,32,115,121,115,46,109,111,100,117,108, - 101,115,46,10,10,32,32,32,32,40,2,0,0,0,117,4, - 0,0,0,116,121,112,101,117,3,0,0,0,95,105,111,40, - 1,0,0,0,117,4,0,0,0,110,97,109,101,40,0,0, - 0,0,40,0,0,0,0,117,29,0,0,0,60,102,114,111, - 122,101,110,32,105,109,112,111,114,116,108,105,98,46,95,98, - 111,111,116,115,116,114,97,112,62,117,10,0,0,0,110,101, - 119,95,109,111,100,117,108,101,154,0,0,0,115,2,0,0, - 0,0,6,117,10,0,0,0,110,101,119,95,109,111,100,117, - 108,101,99,1,0,0,0,0,0,0,0,1,0,0,0,1, - 0,0,0,66,0,0,0,115,20,0,0,0,124,0,0,69, - 101,0,0,90,1,0,100,0,0,90,2,0,100,1,0,83, - 40,2,0,0,0,117,14,0,0,0,95,68,101,97,100,108, - 111,99,107,69,114,114,111,114,78,40,3,0,0,0,117,8, - 0,0,0,95,95,110,97,109,101,95,95,117,10,0,0,0, - 95,95,109,111,100,117,108,101,95,95,117,12,0,0,0,95, - 95,113,117,97,108,110,97,109,101,95,95,40,1,0,0,0, - 117,10,0,0,0,95,95,108,111,99,97,108,115,95,95,40, - 0,0,0,0,40,0,0,0,0,117,29,0,0,0,60,102, - 114,111,122,101,110,32,105,109,112,111,114,116,108,105,98,46, - 95,98,111,111,116,115,116,114,97,112,62,117,14,0,0,0, - 95,68,101,97,100,108,111,99,107,69,114,114,111,114,171,0, - 0,0,115,2,0,0,0,16,1,117,14,0,0,0,95,68, - 101,97,100,108,111,99,107,69,114,114,111,114,99,1,0,0, - 0,0,0,0,0,1,0,0,0,2,0,0,0,66,0,0, - 0,115,86,0,0,0,124,0,0,69,101,0,0,90,1,0, + 0,124,0,0,100,1,0,131,2,0,83,41,2,122,31,82, + 101,112,108,97,99,101,109,101,110,116,32,102,111,114,32,111, + 115,46,112,97,116,104,46,105,115,102,105,108,101,46,105,0, + 128,0,0,41,1,114,43,0,0,0,41,1,114,35,0,0, + 0,114,4,0,0,0,114,4,0,0,0,114,5,0,0,0, + 218,12,95,112,97,116,104,95,105,115,102,105,108,101,87,0, + 0,0,115,2,0,0,0,0,2,114,44,0,0,0,99,1, + 0,0,0,0,0,0,0,1,0,0,0,3,0,0,0,67, + 0,0,0,115,34,0,0,0,124,0,0,115,21,0,116,0, + 0,106,1,0,131,0,0,125,0,0,110,0,0,116,2,0, + 124,0,0,100,1,0,131,2,0,83,41,2,122,30,82,101, + 112,108,97,99,101,109,101,110,116,32,102,111,114,32,111,115, + 46,112,97,116,104,46,105,115,100,105,114,46,105,0,64,0, + 0,41,3,114,3,0,0,0,218,6,103,101,116,99,119,100, + 114,43,0,0,0,41,1,114,35,0,0,0,114,4,0,0, + 0,114,4,0,0,0,114,5,0,0,0,218,11,95,112,97, + 116,104,95,105,115,100,105,114,92,0,0,0,115,6,0,0, + 0,0,2,6,1,15,1,114,46,0,0,0,105,182,1,0, + 0,99,3,0,0,0,0,0,0,0,6,0,0,0,17,0, + 0,0,67,0,0,0,115,192,0,0,0,100,1,0,106,0, + 0,124,0,0,116,1,0,124,0,0,131,1,0,131,2,0, + 125,3,0,116,2,0,106,3,0,124,3,0,116,2,0,106, + 4,0,116,2,0,106,5,0,66,116,2,0,106,6,0,66, + 124,2,0,100,2,0,64,131,3,0,125,4,0,121,60,0, + 116,7,0,106,8,0,124,4,0,100,3,0,131,2,0,143, + 20,0,125,5,0,124,5,0,106,9,0,124,1,0,131,1, + 0,1,87,100,4,0,81,88,116,2,0,106,10,0,124,3, + 0,124,0,0,131,2,0,1,87,110,59,0,4,116,11,0, + 107,10,0,114,187,0,1,1,1,121,17,0,116,2,0,106, + 12,0,124,3,0,131,1,0,1,87,110,18,0,4,116,11, + 0,107,10,0,114,179,0,1,1,1,89,110,1,0,88,130, + 0,0,89,110,1,0,88,100,4,0,83,41,5,122,162,66, + 101,115,116,45,101,102,102,111,114,116,32,102,117,110,99,116, + 105,111,110,32,116,111,32,119,114,105,116,101,32,100,97,116, + 97,32,116,111,32,97,32,112,97,116,104,32,97,116,111,109, + 105,99,97,108,108,121,46,10,32,32,32,32,66,101,32,112, + 114,101,112,97,114,101,100,32,116,111,32,104,97,110,100,108, + 101,32,97,32,70,105,108,101,69,120,105,115,116,115,69,114, + 114,111,114,32,105,102,32,99,111,110,99,117,114,114,101,110, + 116,32,119,114,105,116,105,110,103,32,111,102,32,116,104,101, + 10,32,32,32,32,116,101,109,112,111,114,97,114,121,32,102, + 105,108,101,32,105,115,32,97,116,116,101,109,112,116,101,100, + 46,122,5,123,125,46,123,125,105,182,1,0,0,90,2,119, + 98,78,41,13,218,6,102,111,114,109,97,116,218,2,105,100, + 114,3,0,0,0,90,4,111,112,101,110,90,6,79,95,69, + 88,67,76,90,7,79,95,67,82,69,65,84,90,8,79,95, + 87,82,79,78,76,89,218,3,95,105,111,218,6,70,105,108, + 101,73,79,218,5,119,114,105,116,101,218,7,114,101,112,108, + 97,99,101,114,40,0,0,0,90,6,117,110,108,105,110,107, + 41,6,114,35,0,0,0,218,4,100,97,116,97,114,42,0, + 0,0,90,8,112,97,116,104,95,116,109,112,90,2,102,100, + 218,4,102,105,108,101,114,4,0,0,0,114,4,0,0,0, + 114,5,0,0,0,218,13,95,119,114,105,116,101,95,97,116, + 111,109,105,99,99,0,0,0,115,26,0,0,0,0,5,24, + 1,9,1,33,1,3,3,21,1,19,1,20,1,13,1,3, + 1,17,1,13,1,5,1,114,55,0,0,0,99,2,0,0, + 0,0,0,0,0,3,0,0,0,7,0,0,0,67,0,0, + 0,115,95,0,0,0,120,69,0,100,1,0,100,2,0,100, + 3,0,100,4,0,103,4,0,68,93,49,0,125,2,0,116, + 0,0,124,1,0,124,2,0,131,2,0,114,19,0,116,1, + 0,124,0,0,124,2,0,116,2,0,124,1,0,124,2,0, + 131,2,0,131,3,0,1,113,19,0,113,19,0,87,124,0, + 0,106,3,0,106,4,0,124,1,0,106,3,0,131,1,0, + 1,100,5,0,83,41,6,122,47,83,105,109,112,108,101,32, + 115,117,98,115,116,105,116,117,116,101,32,102,111,114,32,102, + 117,110,99,116,111,111,108,115,46,117,112,100,97,116,101,95, + 119,114,97,112,112,101,114,46,218,10,95,95,109,111,100,117, + 108,101,95,95,218,8,95,95,110,97,109,101,95,95,218,12, + 95,95,113,117,97,108,110,97,109,101,95,95,218,7,95,95, + 100,111,99,95,95,78,41,5,218,7,104,97,115,97,116,116, + 114,218,7,115,101,116,97,116,116,114,218,7,103,101,116,97, + 116,116,114,218,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,52,0,0,0,114,4,0,0,0,114,4,0,0,0, + 114,5,0,0,0,218,5,95,119,114,97,112,121,0,0,0, + 115,8,0,0,0,0,2,25,1,15,1,32,1,114,65,0, + 0,0,99,1,0,0,0,0,0,0,0,1,0,0,0,2, + 0,0,0,67,0,0,0,115,16,0,0,0,116,0,0,116, + 1,0,131,1,0,124,0,0,131,1,0,83,41,1,78,41, + 2,218,4,116,121,112,101,114,7,0,0,0,41,1,218,4, + 110,97,109,101,114,4,0,0,0,114,4,0,0,0,114,5, + 0,0,0,218,11,95,110,101,119,95,109,111,100,117,108,101, + 129,0,0,0,115,2,0,0,0,0,1,114,68,0,0,0, + 99,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0, + 0,64,0,0,0,115,58,0,0,0,101,0,0,90,1,0, 100,0,0,90,2,0,100,1,0,90,3,0,100,2,0,100, 3,0,132,0,0,90,4,0,100,4,0,100,5,0,132,0, 0,90,5,0,100,6,0,100,7,0,132,0,0,90,6,0, - 100,8,0,100,9,0,132,0,0,90,7,0,100,10,0,100, - 11,0,132,0,0,90,8,0,100,12,0,83,40,13,0,0, - 0,117,11,0,0,0,95,77,111,100,117,108,101,76,111,99, - 107,117,169,0,0,0,65,32,114,101,99,117,114,115,105,118, - 101,32,108,111,99,107,32,105,109,112,108,101,109,101,110,116, - 97,116,105,111,110,32,119,104,105,99,104,32,105,115,32,97, - 98,108,101,32,116,111,32,100,101,116,101,99,116,32,100,101, - 97,100,108,111,99,107,115,10,32,32,32,32,40,101,46,103, - 46,32,116,104,114,101,97,100,32,49,32,116,114,121,105,110, - 103,32,116,111,32,116,97,107,101,32,108,111,99,107,115,32, - 65,32,116,104,101,110,32,66,44,32,97,110,100,32,116,104, - 114,101,97,100,32,50,32,116,114,121,105,110,103,32,116,111, - 10,32,32,32,32,116,97,107,101,32,108,111,99,107,115,32, - 66,32,116,104,101,110,32,65,41,46,10,32,32,32,32,99, - 2,0,0,0,0,0,0,0,2,0,0,0,2,0,0,0, - 67,0,0,0,115,70,0,0,0,116,0,0,106,1,0,131, - 0,0,124,0,0,95,2,0,116,0,0,106,1,0,131,0, - 0,124,0,0,95,3,0,124,1,0,124,0,0,95,4,0, - 100,0,0,124,0,0,95,6,0,100,1,0,124,0,0,95, - 7,0,100,1,0,124,0,0,95,8,0,100,0,0,83,40, - 2,0,0,0,78,105,0,0,0,0,40,9,0,0,0,117, - 7,0,0,0,95,116,104,114,101,97,100,117,13,0,0,0, - 97,108,108,111,99,97,116,101,95,108,111,99,107,117,4,0, - 0,0,108,111,99,107,117,6,0,0,0,119,97,107,101,117, - 112,117,4,0,0,0,110,97,109,101,117,4,0,0,0,78, - 111,110,101,117,5,0,0,0,111,119,110,101,114,117,5,0, - 0,0,99,111,117,110,116,117,7,0,0,0,119,97,105,116, - 101,114,115,40,2,0,0,0,117,4,0,0,0,115,101,108, - 102,117,4,0,0,0,110,97,109,101,40,0,0,0,0,40, - 0,0,0,0,117,29,0,0,0,60,102,114,111,122,101,110, - 32,105,109,112,111,114,116,108,105,98,46,95,98,111,111,116, - 115,116,114,97,112,62,117,8,0,0,0,95,95,105,110,105, - 116,95,95,181,0,0,0,115,12,0,0,0,0,1,15,1, - 15,1,9,1,9,1,9,1,117,20,0,0,0,95,77,111, - 100,117,108,101,76,111,99,107,46,95,95,105,110,105,116,95, - 95,99,1,0,0,0,0,0,0,0,4,0,0,0,2,0, - 0,0,67,0,0,0,115,87,0,0,0,116,0,0,106,1, - 0,131,0,0,125,1,0,124,0,0,106,2,0,125,2,0, - 120,59,0,116,3,0,106,4,0,124,2,0,131,1,0,125, - 3,0,124,3,0,100,0,0,107,8,0,114,55,0,100,1, - 0,83,124,3,0,106,2,0,125,2,0,124,2,0,124,1, - 0,107,2,0,114,24,0,100,2,0,83,113,24,0,100,0, - 0,83,40,3,0,0,0,78,70,84,40,8,0,0,0,117, - 7,0,0,0,95,116,104,114,101,97,100,117,9,0,0,0, - 103,101,116,95,105,100,101,110,116,117,5,0,0,0,111,119, - 110,101,114,117,12,0,0,0,95,98,108,111,99,107,105,110, - 103,95,111,110,117,3,0,0,0,103,101,116,117,4,0,0, - 0,78,111,110,101,117,5,0,0,0,70,97,108,115,101,117, - 4,0,0,0,84,114,117,101,40,4,0,0,0,117,4,0, - 0,0,115,101,108,102,117,2,0,0,0,109,101,117,3,0, - 0,0,116,105,100,117,4,0,0,0,108,111,99,107,40,0, - 0,0,0,40,0,0,0,0,117,29,0,0,0,60,102,114, - 111,122,101,110,32,105,109,112,111,114,116,108,105,98,46,95, - 98,111,111,116,115,116,114,97,112,62,117,12,0,0,0,104, - 97,115,95,100,101,97,100,108,111,99,107,189,0,0,0,115, - 18,0,0,0,0,2,12,1,9,1,3,1,15,1,12,1, - 4,1,9,1,12,1,117,24,0,0,0,95,77,111,100,117, - 108,101,76,111,99,107,46,104,97,115,95,100,101,97,100,108, - 111,99,107,99,1,0,0,0,0,0,0,0,2,0,0,0, - 17,0,0,0,67,0,0,0,115,214,0,0,0,116,0,0, - 106,1,0,131,0,0,125,1,0,124,0,0,116,2,0,124, - 1,0,60,122,177,0,120,170,0,124,0,0,106,3,0,143, - 130,0,1,124,0,0,106,4,0,100,1,0,107,2,0,115, - 68,0,124,0,0,106,5,0,124,1,0,107,2,0,114,96, - 0,124,1,0,124,0,0,95,5,0,124,0,0,4,106,4, - 0,100,2,0,55,2,95,4,0,100,5,0,83,124,0,0, - 106,7,0,131,0,0,114,127,0,116,8,0,100,3,0,124, - 0,0,22,131,1,0,130,1,0,110,0,0,124,0,0,106, - 9,0,106,10,0,100,6,0,131,1,0,114,163,0,124,0, - 0,4,106,12,0,100,2,0,55,2,95,12,0,110,0,0, - 87,100,4,0,81,88,124,0,0,106,9,0,106,10,0,131, - 0,0,1,124,0,0,106,9,0,106,13,0,131,0,0,1, - 113,28,0,87,100,4,0,116,2,0,124,1,0,61,88,100, - 4,0,83,40,7,0,0,0,117,185,0,0,0,10,32,32, - 32,32,32,32,32,32,65,99,113,117,105,114,101,32,116,104, - 101,32,109,111,100,117,108,101,32,108,111,99,107,46,32,32, - 73,102,32,97,32,112,111,116,101,110,116,105,97,108,32,100, - 101,97,100,108,111,99,107,32,105,115,32,100,101,116,101,99, - 116,101,100,44,10,32,32,32,32,32,32,32,32,97,32,95, - 68,101,97,100,108,111,99,107,69,114,114,111,114,32,105,115, - 32,114,97,105,115,101,100,46,10,32,32,32,32,32,32,32, - 32,79,116,104,101,114,119,105,115,101,44,32,116,104,101,32, - 108,111,99,107,32,105,115,32,97,108,119,97,121,115,32,97, - 99,113,117,105,114,101,100,32,97,110,100,32,84,114,117,101, - 32,105,115,32,114,101,116,117,114,110,101,100,46,10,32,32, - 32,32,32,32,32,32,105,0,0,0,0,105,1,0,0,0, - 117,23,0,0,0,100,101,97,100,108,111,99,107,32,100,101, - 116,101,99,116,101,100,32,98,121,32,37,114,78,84,70,40, - 14,0,0,0,117,7,0,0,0,95,116,104,114,101,97,100, - 117,9,0,0,0,103,101,116,95,105,100,101,110,116,117,12, - 0,0,0,95,98,108,111,99,107,105,110,103,95,111,110,117, - 4,0,0,0,108,111,99,107,117,5,0,0,0,99,111,117, - 110,116,117,5,0,0,0,111,119,110,101,114,117,4,0,0, - 0,84,114,117,101,117,12,0,0,0,104,97,115,95,100,101, - 97,100,108,111,99,107,117,14,0,0,0,95,68,101,97,100, - 108,111,99,107,69,114,114,111,114,117,6,0,0,0,119,97, - 107,101,117,112,117,7,0,0,0,97,99,113,117,105,114,101, - 117,5,0,0,0,70,97,108,115,101,117,7,0,0,0,119, - 97,105,116,101,114,115,117,7,0,0,0,114,101,108,101,97, - 115,101,40,2,0,0,0,117,4,0,0,0,115,101,108,102, - 117,3,0,0,0,116,105,100,40,0,0,0,0,40,0,0, - 0,0,117,29,0,0,0,60,102,114,111,122,101,110,32,105, - 109,112,111,114,116,108,105,98,46,95,98,111,111,116,115,116, - 114,97,112,62,117,7,0,0,0,97,99,113,117,105,114,101, - 201,0,0,0,115,32,0,0,0,0,6,12,1,10,1,3, - 1,3,1,10,1,30,1,9,1,15,1,4,1,12,1,19, - 1,18,1,24,2,13,1,20,2,117,19,0,0,0,95,77, - 111,100,117,108,101,76,111,99,107,46,97,99,113,117,105,114, - 101,99,1,0,0,0,0,0,0,0,2,0,0,0,10,0, - 0,0,67,0,0,0,115,165,0,0,0,116,0,0,106,1, - 0,131,0,0,125,1,0,124,0,0,106,2,0,143,138,0, - 1,124,0,0,106,3,0,124,1,0,107,3,0,114,52,0, - 116,4,0,100,1,0,131,1,0,130,1,0,110,0,0,124, - 0,0,106,5,0,100,2,0,107,4,0,115,73,0,116,6, - 0,130,1,0,124,0,0,4,106,5,0,100,3,0,56,2, - 95,5,0,124,0,0,106,5,0,100,2,0,107,2,0,114, - 155,0,100,0,0,124,0,0,95,3,0,124,0,0,106,8, - 0,114,155,0,124,0,0,4,106,8,0,100,3,0,56,2, - 95,8,0,124,0,0,106,9,0,106,10,0,131,0,0,1, - 113,155,0,110,0,0,87,100,0,0,81,88,100,0,0,83, - 40,4,0,0,0,78,117,31,0,0,0,99,97,110,110,111, - 116,32,114,101,108,101,97,115,101,32,117,110,45,97,99,113, - 117,105,114,101,100,32,108,111,99,107,105,0,0,0,0,105, - 1,0,0,0,40,11,0,0,0,117,7,0,0,0,95,116, - 104,114,101,97,100,117,9,0,0,0,103,101,116,95,105,100, - 101,110,116,117,4,0,0,0,108,111,99,107,117,5,0,0, - 0,111,119,110,101,114,117,12,0,0,0,82,117,110,116,105, - 109,101,69,114,114,111,114,117,5,0,0,0,99,111,117,110, - 116,117,14,0,0,0,65,115,115,101,114,116,105,111,110,69, - 114,114,111,114,117,4,0,0,0,78,111,110,101,117,7,0, - 0,0,119,97,105,116,101,114,115,117,6,0,0,0,119,97, - 107,101,117,112,117,7,0,0,0,114,101,108,101,97,115,101, - 40,2,0,0,0,117,4,0,0,0,115,101,108,102,117,3, - 0,0,0,116,105,100,40,0,0,0,0,40,0,0,0,0, - 117,29,0,0,0,60,102,114,111,122,101,110,32,105,109,112, - 111,114,116,108,105,98,46,95,98,111,111,116,115,116,114,97, - 112,62,117,7,0,0,0,114,101,108,101,97,115,101,226,0, - 0,0,115,22,0,0,0,0,1,12,1,10,1,15,1,15, - 1,21,1,15,1,15,1,9,1,9,1,15,1,117,19,0, - 0,0,95,77,111,100,117,108,101,76,111,99,107,46,114,101, - 108,101,97,115,101,99,1,0,0,0,0,0,0,0,1,0, - 0,0,4,0,0,0,67,0,0,0,115,23,0,0,0,100, - 1,0,124,0,0,106,0,0,116,1,0,124,0,0,131,1, - 0,102,2,0,22,83,40,2,0,0,0,78,117,21,0,0, - 0,95,77,111,100,117,108,101,76,111,99,107,40,37,114,41, - 32,97,116,32,37,100,40,2,0,0,0,117,4,0,0,0, - 110,97,109,101,117,2,0,0,0,105,100,40,1,0,0,0, - 117,4,0,0,0,115,101,108,102,40,0,0,0,0,40,0, - 0,0,0,117,29,0,0,0,60,102,114,111,122,101,110,32, - 105,109,112,111,114,116,108,105,98,46,95,98,111,111,116,115, - 116,114,97,112,62,117,8,0,0,0,95,95,114,101,112,114, - 95,95,239,0,0,0,115,2,0,0,0,0,1,117,20,0, - 0,0,95,77,111,100,117,108,101,76,111,99,107,46,95,95, - 114,101,112,114,95,95,78,40,9,0,0,0,117,8,0,0, - 0,95,95,110,97,109,101,95,95,117,10,0,0,0,95,95, - 109,111,100,117,108,101,95,95,117,12,0,0,0,95,95,113, - 117,97,108,110,97,109,101,95,95,117,7,0,0,0,95,95, - 100,111,99,95,95,117,8,0,0,0,95,95,105,110,105,116, - 95,95,117,12,0,0,0,104,97,115,95,100,101,97,100,108, - 111,99,107,117,7,0,0,0,97,99,113,117,105,114,101,117, - 7,0,0,0,114,101,108,101,97,115,101,117,8,0,0,0, - 95,95,114,101,112,114,95,95,40,1,0,0,0,117,10,0, - 0,0,95,95,108,111,99,97,108,115,95,95,40,0,0,0, - 0,40,0,0,0,0,117,29,0,0,0,60,102,114,111,122, - 101,110,32,105,109,112,111,114,116,108,105,98,46,95,98,111, - 111,116,115,116,114,97,112,62,117,11,0,0,0,95,77,111, - 100,117,108,101,76,111,99,107,175,0,0,0,115,12,0,0, - 0,16,4,6,2,12,8,12,12,12,25,12,13,117,11,0, - 0,0,95,77,111,100,117,108,101,76,111,99,107,99,1,0, - 0,0,0,0,0,0,1,0,0,0,2,0,0,0,66,0, - 0,0,115,74,0,0,0,124,0,0,69,101,0,0,90,1, - 0,100,0,0,90,2,0,100,1,0,90,3,0,100,2,0, - 100,3,0,132,0,0,90,4,0,100,4,0,100,5,0,132, - 0,0,90,5,0,100,6,0,100,7,0,132,0,0,90,6, - 0,100,8,0,100,9,0,132,0,0,90,7,0,100,10,0, - 83,40,11,0,0,0,117,16,0,0,0,95,68,117,109,109, - 121,77,111,100,117,108,101,76,111,99,107,117,86,0,0,0, - 65,32,115,105,109,112,108,101,32,95,77,111,100,117,108,101, - 76,111,99,107,32,101,113,117,105,118,97,108,101,110,116,32, - 102,111,114,32,80,121,116,104,111,110,32,98,117,105,108,100, - 115,32,119,105,116,104,111,117,116,10,32,32,32,32,109,117, - 108,116,105,45,116,104,114,101,97,100,105,110,103,32,115,117, - 112,112,111,114,116,46,99,2,0,0,0,0,0,0,0,2, + 100,8,0,83,41,9,218,13,95,77,97,110,97,103,101,82, + 101,108,111,97,100,122,63,77,97,110,97,103,101,115,32,116, + 104,101,32,112,111,115,115,105,98,108,101,32,99,108,101,97, + 110,45,117,112,32,111,102,32,115,121,115,46,109,111,100,117, + 108,101,115,32,102,111,114,32,108,111,97,100,95,109,111,100, + 117,108,101,40,41,46,99,2,0,0,0,0,0,0,0,2, + 0,0,0,2,0,0,0,67,0,0,0,115,13,0,0,0, + 124,1,0,124,0,0,95,0,0,100,0,0,83,41,1,78, + 41,1,218,5,95,110,97,109,101,41,2,218,4,115,101,108, + 102,114,67,0,0,0,114,4,0,0,0,114,4,0,0,0, + 114,5,0,0,0,218,8,95,95,105,110,105,116,95,95,141, + 0,0,0,115,2,0,0,0,0,1,122,22,95,77,97,110, + 97,103,101,82,101,108,111,97,100,46,95,95,105,110,105,116, + 95,95,99,1,0,0,0,0,0,0,0,1,0,0,0,2, + 0,0,0,67,0,0,0,115,25,0,0,0,124,0,0,106, + 0,0,116,1,0,106,2,0,107,6,0,124,0,0,95,3, + 0,100,0,0,83,41,1,78,41,4,114,70,0,0,0,114, + 7,0,0,0,218,7,109,111,100,117,108,101,115,218,10,95, + 105,115,95,114,101,108,111,97,100,41,1,114,71,0,0,0, + 114,4,0,0,0,114,4,0,0,0,114,5,0,0,0,218, + 9,95,95,101,110,116,101,114,95,95,144,0,0,0,115,2, + 0,0,0,0,1,122,23,95,77,97,110,97,103,101,82,101, + 108,111,97,100,46,95,95,101,110,116,101,114,95,95,99,1, + 0,0,0,0,0,0,0,2,0,0,0,11,0,0,0,71, + 0,0,0,115,80,0,0,0,116,0,0,100,1,0,100,2, + 0,132,0,0,124,1,0,68,131,1,0,131,1,0,114,76, + 0,124,0,0,106,1,0,12,114,76,0,121,17,0,116,2, + 0,106,3,0,124,0,0,106,4,0,61,87,113,76,0,4, + 116,5,0,107,10,0,114,72,0,1,1,1,89,113,76,0, + 88,110,0,0,100,0,0,83,41,3,78,99,1,0,0,0, + 0,0,0,0,2,0,0,0,3,0,0,0,115,0,0,0, + 115,27,0,0,0,124,0,0,93,17,0,125,1,0,124,1, + 0,100,0,0,107,9,0,86,1,113,3,0,100,0,0,83, + 41,1,78,114,4,0,0,0,41,2,114,22,0,0,0,218, + 3,97,114,103,114,4,0,0,0,114,4,0,0,0,114,5, + 0,0,0,250,9,60,103,101,110,101,120,112,114,62,148,0, + 0,0,115,2,0,0,0,6,0,122,41,95,77,97,110,97, + 103,101,82,101,108,111,97,100,46,95,95,101,120,105,116,95, + 95,46,60,108,111,99,97,108,115,62,46,60,103,101,110,101, + 120,112,114,62,41,6,218,3,97,110,121,114,74,0,0,0, + 114,7,0,0,0,114,73,0,0,0,114,70,0,0,0,218, + 8,75,101,121,69,114,114,111,114,41,2,114,71,0,0,0, + 218,4,97,114,103,115,114,4,0,0,0,114,4,0,0,0, + 114,5,0,0,0,218,8,95,95,101,120,105,116,95,95,147, + 0,0,0,115,10,0,0,0,0,1,35,1,3,1,17,1, + 13,1,122,22,95,77,97,110,97,103,101,82,101,108,111,97, + 100,46,95,95,101,120,105,116,95,95,78,41,7,114,57,0, + 0,0,114,56,0,0,0,114,58,0,0,0,114,59,0,0, + 0,114,72,0,0,0,114,75,0,0,0,114,81,0,0,0, + 114,4,0,0,0,114,4,0,0,0,114,4,0,0,0,114, + 5,0,0,0,114,69,0,0,0,137,0,0,0,115,8,0, + 0,0,12,2,6,2,12,3,12,3,114,69,0,0,0,99, + 0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0, + 64,0,0,0,115,16,0,0,0,101,0,0,90,1,0,100, + 0,0,90,2,0,100,1,0,83,41,2,218,14,95,68,101, + 97,100,108,111,99,107,69,114,114,111,114,78,41,3,114,57, + 0,0,0,114,56,0,0,0,114,58,0,0,0,114,4,0, + 0,0,114,4,0,0,0,114,4,0,0,0,114,5,0,0, + 0,114,82,0,0,0,162,0,0,0,115,2,0,0,0,12, + 1,114,82,0,0,0,99,0,0,0,0,0,0,0,0,0, + 0,0,0,2,0,0,0,64,0,0,0,115,82,0,0,0, + 101,0,0,90,1,0,100,0,0,90,2,0,100,1,0,90, + 3,0,100,2,0,100,3,0,132,0,0,90,4,0,100,4, + 0,100,5,0,132,0,0,90,5,0,100,6,0,100,7,0, + 132,0,0,90,6,0,100,8,0,100,9,0,132,0,0,90, + 7,0,100,10,0,100,11,0,132,0,0,90,8,0,100,12, + 0,83,41,13,218,11,95,77,111,100,117,108,101,76,111,99, + 107,122,169,65,32,114,101,99,117,114,115,105,118,101,32,108, + 111,99,107,32,105,109,112,108,101,109,101,110,116,97,116,105, + 111,110,32,119,104,105,99,104,32,105,115,32,97,98,108,101, + 32,116,111,32,100,101,116,101,99,116,32,100,101,97,100,108, + 111,99,107,115,10,32,32,32,32,40,101,46,103,46,32,116, + 104,114,101,97,100,32,49,32,116,114,121,105,110,103,32,116, + 111,32,116,97,107,101,32,108,111,99,107,115,32,65,32,116, + 104,101,110,32,66,44,32,97,110,100,32,116,104,114,101,97, + 100,32,50,32,116,114,121,105,110,103,32,116,111,10,32,32, + 32,32,116,97,107,101,32,108,111,99,107,115,32,66,32,116, + 104,101,110,32,65,41,46,10,32,32,32,32,99,2,0,0, + 0,0,0,0,0,2,0,0,0,2,0,0,0,67,0,0, + 0,115,70,0,0,0,116,0,0,106,1,0,131,0,0,124, + 0,0,95,2,0,116,0,0,106,1,0,131,0,0,124,0, + 0,95,3,0,124,1,0,124,0,0,95,4,0,100,0,0, + 124,0,0,95,5,0,100,1,0,124,0,0,95,6,0,100, + 1,0,124,0,0,95,7,0,100,0,0,83,41,2,78,233, + 0,0,0,0,41,8,218,7,95,116,104,114,101,97,100,90, + 13,97,108,108,111,99,97,116,101,95,108,111,99,107,218,4, + 108,111,99,107,218,6,119,97,107,101,117,112,114,67,0,0, + 0,218,5,111,119,110,101,114,218,5,99,111,117,110,116,218, + 7,119,97,105,116,101,114,115,41,2,114,71,0,0,0,114, + 67,0,0,0,114,4,0,0,0,114,4,0,0,0,114,5, + 0,0,0,114,72,0,0,0,172,0,0,0,115,12,0,0, + 0,0,1,15,1,15,1,9,1,9,1,9,1,122,20,95, + 77,111,100,117,108,101,76,111,99,107,46,95,95,105,110,105, + 116,95,95,99,1,0,0,0,0,0,0,0,4,0,0,0, + 2,0,0,0,67,0,0,0,115,88,0,0,0,116,0,0, + 106,1,0,131,0,0,125,1,0,124,0,0,106,2,0,125, + 2,0,120,60,0,116,3,0,106,4,0,124,2,0,131,1, + 0,125,3,0,124,3,0,100,0,0,107,8,0,114,55,0, + 100,1,0,83,124,3,0,106,2,0,125,2,0,124,2,0, + 124,1,0,107,2,0,114,24,0,100,2,0,83,113,24,0, + 87,100,0,0,83,41,3,78,70,84,41,5,114,85,0,0, + 0,218,9,103,101,116,95,105,100,101,110,116,114,88,0,0, + 0,218,12,95,98,108,111,99,107,105,110,103,95,111,110,218, + 3,103,101,116,41,4,114,71,0,0,0,218,2,109,101,218, + 3,116,105,100,114,86,0,0,0,114,4,0,0,0,114,4, + 0,0,0,114,5,0,0,0,218,12,104,97,115,95,100,101, + 97,100,108,111,99,107,180,0,0,0,115,18,0,0,0,0, + 2,12,1,9,1,3,1,15,1,12,1,4,1,9,1,12, + 1,122,24,95,77,111,100,117,108,101,76,111,99,107,46,104, + 97,115,95,100,101,97,100,108,111,99,107,99,1,0,0,0, + 0,0,0,0,2,0,0,0,16,0,0,0,67,0,0,0, + 115,215,0,0,0,116,0,0,106,1,0,131,0,0,125,1, + 0,124,0,0,116,2,0,124,1,0,60,122,178,0,120,171, + 0,124,0,0,106,3,0,143,130,0,1,124,0,0,106,4, + 0,100,1,0,107,2,0,115,68,0,124,0,0,106,5,0, + 124,1,0,107,2,0,114,96,0,124,1,0,124,0,0,95, + 5,0,124,0,0,4,106,4,0,100,2,0,55,2,95,4, + 0,100,3,0,83,124,0,0,106,6,0,131,0,0,114,127, + 0,116,7,0,100,4,0,124,0,0,22,131,1,0,130,1, + 0,110,0,0,124,0,0,106,8,0,106,9,0,100,5,0, + 131,1,0,114,163,0,124,0,0,4,106,10,0,100,2,0, + 55,2,95,10,0,110,0,0,87,100,6,0,81,88,124,0, + 0,106,8,0,106,9,0,131,0,0,1,124,0,0,106,8, + 0,106,11,0,131,0,0,1,113,28,0,87,87,100,6,0, + 116,2,0,124,1,0,61,88,100,6,0,83,41,7,122,185, + 10,32,32,32,32,32,32,32,32,65,99,113,117,105,114,101, + 32,116,104,101,32,109,111,100,117,108,101,32,108,111,99,107, + 46,32,32,73,102,32,97,32,112,111,116,101,110,116,105,97, + 108,32,100,101,97,100,108,111,99,107,32,105,115,32,100,101, + 116,101,99,116,101,100,44,10,32,32,32,32,32,32,32,32, + 97,32,95,68,101,97,100,108,111,99,107,69,114,114,111,114, + 32,105,115,32,114,97,105,115,101,100,46,10,32,32,32,32, + 32,32,32,32,79,116,104,101,114,119,105,115,101,44,32,116, + 104,101,32,108,111,99,107,32,105,115,32,97,108,119,97,121, + 115,32,97,99,113,117,105,114,101,100,32,97,110,100,32,84, + 114,117,101,32,105,115,32,114,101,116,117,114,110,101,100,46, + 10,32,32,32,32,32,32,32,32,114,84,0,0,0,114,29, + 0,0,0,84,122,23,100,101,97,100,108,111,99,107,32,100, + 101,116,101,99,116,101,100,32,98,121,32,37,114,70,78,41, + 12,114,85,0,0,0,114,91,0,0,0,114,92,0,0,0, + 114,86,0,0,0,114,89,0,0,0,114,88,0,0,0,114, + 96,0,0,0,114,82,0,0,0,114,87,0,0,0,218,7, + 97,99,113,117,105,114,101,114,90,0,0,0,218,7,114,101, + 108,101,97,115,101,41,2,114,71,0,0,0,114,95,0,0, + 0,114,4,0,0,0,114,4,0,0,0,114,5,0,0,0, + 114,97,0,0,0,192,0,0,0,115,32,0,0,0,0,6, + 12,1,10,1,3,1,3,1,10,1,30,1,9,1,15,1, + 4,1,12,1,19,1,18,1,24,2,13,1,21,2,122,19, + 95,77,111,100,117,108,101,76,111,99,107,46,97,99,113,117, + 105,114,101,99,1,0,0,0,0,0,0,0,2,0,0,0, + 10,0,0,0,67,0,0,0,115,165,0,0,0,116,0,0, + 106,1,0,131,0,0,125,1,0,124,0,0,106,2,0,143, + 138,0,1,124,0,0,106,3,0,124,1,0,107,3,0,114, + 52,0,116,4,0,100,1,0,131,1,0,130,1,0,110,0, + 0,124,0,0,106,5,0,100,2,0,107,4,0,115,73,0, + 116,6,0,130,1,0,124,0,0,4,106,5,0,100,3,0, + 56,2,95,5,0,124,0,0,106,5,0,100,2,0,107,2, + 0,114,155,0,100,0,0,124,0,0,95,3,0,124,0,0, + 106,7,0,114,155,0,124,0,0,4,106,7,0,100,3,0, + 56,2,95,7,0,124,0,0,106,8,0,106,9,0,131,0, + 0,1,113,155,0,110,0,0,87,100,0,0,81,88,100,0, + 0,83,41,4,78,122,31,99,97,110,110,111,116,32,114,101, + 108,101,97,115,101,32,117,110,45,97,99,113,117,105,114,101, + 100,32,108,111,99,107,114,84,0,0,0,114,29,0,0,0, + 41,10,114,85,0,0,0,114,91,0,0,0,114,86,0,0, + 0,114,88,0,0,0,218,12,82,117,110,116,105,109,101,69, + 114,114,111,114,114,89,0,0,0,218,14,65,115,115,101,114, + 116,105,111,110,69,114,114,111,114,114,90,0,0,0,114,87, + 0,0,0,114,98,0,0,0,41,2,114,71,0,0,0,114, + 95,0,0,0,114,4,0,0,0,114,4,0,0,0,114,5, + 0,0,0,114,98,0,0,0,217,0,0,0,115,22,0,0, + 0,0,1,12,1,10,1,15,1,15,1,21,1,15,1,15, + 1,9,1,9,1,15,1,122,19,95,77,111,100,117,108,101, + 76,111,99,107,46,114,101,108,101,97,115,101,99,1,0,0, + 0,0,0,0,0,1,0,0,0,4,0,0,0,67,0,0, + 0,115,25,0,0,0,100,1,0,106,0,0,124,0,0,106, + 1,0,116,2,0,124,0,0,131,1,0,131,2,0,83,41, + 2,78,122,23,95,77,111,100,117,108,101,76,111,99,107,40, + 123,33,114,125,41,32,97,116,32,123,125,41,3,114,47,0, + 0,0,114,67,0,0,0,114,48,0,0,0,41,1,114,71, + 0,0,0,114,4,0,0,0,114,4,0,0,0,114,5,0, + 0,0,218,8,95,95,114,101,112,114,95,95,230,0,0,0, + 115,2,0,0,0,0,1,122,20,95,77,111,100,117,108,101, + 76,111,99,107,46,95,95,114,101,112,114,95,95,78,41,9, + 114,57,0,0,0,114,56,0,0,0,114,58,0,0,0,114, + 59,0,0,0,114,72,0,0,0,114,96,0,0,0,114,97, + 0,0,0,114,98,0,0,0,114,101,0,0,0,114,4,0, + 0,0,114,4,0,0,0,114,4,0,0,0,114,5,0,0, + 0,114,83,0,0,0,166,0,0,0,115,12,0,0,0,12, + 4,6,2,12,8,12,12,12,25,12,13,114,83,0,0,0, + 99,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0, + 0,64,0,0,0,115,70,0,0,0,101,0,0,90,1,0, + 100,0,0,90,2,0,100,1,0,90,3,0,100,2,0,100, + 3,0,132,0,0,90,4,0,100,4,0,100,5,0,132,0, + 0,90,5,0,100,6,0,100,7,0,132,0,0,90,6,0, + 100,8,0,100,9,0,132,0,0,90,7,0,100,10,0,83, + 41,11,218,16,95,68,117,109,109,121,77,111,100,117,108,101, + 76,111,99,107,122,86,65,32,115,105,109,112,108,101,32,95, + 77,111,100,117,108,101,76,111,99,107,32,101,113,117,105,118, + 97,108,101,110,116,32,102,111,114,32,80,121,116,104,111,110, + 32,98,117,105,108,100,115,32,119,105,116,104,111,117,116,10, + 32,32,32,32,109,117,108,116,105,45,116,104,114,101,97,100, + 105,110,103,32,115,117,112,112,111,114,116,46,99,2,0,0, + 0,0,0,0,0,2,0,0,0,2,0,0,0,67,0,0, + 0,115,22,0,0,0,124,1,0,124,0,0,95,0,0,100, + 1,0,124,0,0,95,1,0,100,0,0,83,41,2,78,114, + 84,0,0,0,41,2,114,67,0,0,0,114,89,0,0,0, + 41,2,114,71,0,0,0,114,67,0,0,0,114,4,0,0, + 0,114,4,0,0,0,114,5,0,0,0,114,72,0,0,0, + 238,0,0,0,115,4,0,0,0,0,1,9,1,122,25,95, + 68,117,109,109,121,77,111,100,117,108,101,76,111,99,107,46, + 95,95,105,110,105,116,95,95,99,1,0,0,0,0,0,0, + 0,1,0,0,0,3,0,0,0,67,0,0,0,115,19,0, + 0,0,124,0,0,4,106,0,0,100,1,0,55,2,95,0, + 0,100,2,0,83,41,3,78,114,29,0,0,0,84,41,1, + 114,89,0,0,0,41,1,114,71,0,0,0,114,4,0,0, + 0,114,4,0,0,0,114,5,0,0,0,114,97,0,0,0, + 242,0,0,0,115,4,0,0,0,0,1,15,1,122,24,95, + 68,117,109,109,121,77,111,100,117,108,101,76,111,99,107,46, + 97,99,113,117,105,114,101,99,1,0,0,0,0,0,0,0, + 1,0,0,0,3,0,0,0,67,0,0,0,115,49,0,0, + 0,124,0,0,106,0,0,100,1,0,107,2,0,114,30,0, + 116,1,0,100,2,0,131,1,0,130,1,0,110,0,0,124, + 0,0,4,106,0,0,100,3,0,56,2,95,0,0,100,0, + 0,83,41,4,78,114,84,0,0,0,122,31,99,97,110,110, + 111,116,32,114,101,108,101,97,115,101,32,117,110,45,97,99, + 113,117,105,114,101,100,32,108,111,99,107,114,29,0,0,0, + 41,2,114,89,0,0,0,114,99,0,0,0,41,1,114,71, + 0,0,0,114,4,0,0,0,114,4,0,0,0,114,5,0, + 0,0,114,98,0,0,0,246,0,0,0,115,6,0,0,0, + 0,1,15,1,15,1,122,24,95,68,117,109,109,121,77,111, + 100,117,108,101,76,111,99,107,46,114,101,108,101,97,115,101, + 99,1,0,0,0,0,0,0,0,1,0,0,0,4,0,0, + 0,67,0,0,0,115,25,0,0,0,100,1,0,106,0,0, + 124,0,0,106,1,0,116,2,0,124,0,0,131,1,0,131, + 2,0,83,41,2,78,122,28,95,68,117,109,109,121,77,111, + 100,117,108,101,76,111,99,107,40,123,33,114,125,41,32,97, + 116,32,123,125,41,3,114,47,0,0,0,114,67,0,0,0, + 114,48,0,0,0,41,1,114,71,0,0,0,114,4,0,0, + 0,114,4,0,0,0,114,5,0,0,0,114,101,0,0,0, + 251,0,0,0,115,2,0,0,0,0,1,122,25,95,68,117, + 109,109,121,77,111,100,117,108,101,76,111,99,107,46,95,95, + 114,101,112,114,95,95,78,41,8,114,57,0,0,0,114,56, + 0,0,0,114,58,0,0,0,114,59,0,0,0,114,72,0, + 0,0,114,97,0,0,0,114,98,0,0,0,114,101,0,0, + 0,114,4,0,0,0,114,4,0,0,0,114,4,0,0,0, + 114,5,0,0,0,114,102,0,0,0,234,0,0,0,115,10, + 0,0,0,12,2,6,2,12,4,12,4,12,5,114,102,0, + 0,0,99,0,0,0,0,0,0,0,0,0,0,0,0,2, + 0,0,0,64,0,0,0,115,52,0,0,0,101,0,0,90, + 1,0,100,0,0,90,2,0,100,1,0,100,2,0,132,0, + 0,90,3,0,100,3,0,100,4,0,132,0,0,90,4,0, + 100,5,0,100,6,0,132,0,0,90,5,0,100,7,0,83, + 41,8,218,18,95,77,111,100,117,108,101,76,111,99,107,77, + 97,110,97,103,101,114,99,2,0,0,0,0,0,0,0,2, 0,0,0,2,0,0,0,67,0,0,0,115,22,0,0,0, - 124,1,0,124,0,0,95,0,0,100,1,0,124,0,0,95, - 1,0,100,0,0,83,40,2,0,0,0,78,105,0,0,0, - 0,40,2,0,0,0,117,4,0,0,0,110,97,109,101,117, - 5,0,0,0,99,111,117,110,116,40,2,0,0,0,117,4, - 0,0,0,115,101,108,102,117,4,0,0,0,110,97,109,101, - 40,0,0,0,0,40,0,0,0,0,117,29,0,0,0,60, - 102,114,111,122,101,110,32,105,109,112,111,114,116,108,105,98, - 46,95,98,111,111,116,115,116,114,97,112,62,117,8,0,0, - 0,95,95,105,110,105,116,95,95,247,0,0,0,115,4,0, - 0,0,0,1,9,1,117,25,0,0,0,95,68,117,109,109, - 121,77,111,100,117,108,101,76,111,99,107,46,95,95,105,110, - 105,116,95,95,99,1,0,0,0,0,0,0,0,1,0,0, - 0,3,0,0,0,67,0,0,0,115,19,0,0,0,124,0, - 0,4,106,0,0,100,1,0,55,2,95,0,0,100,2,0, - 83,40,3,0,0,0,78,105,1,0,0,0,84,40,2,0, - 0,0,117,5,0,0,0,99,111,117,110,116,117,4,0,0, - 0,84,114,117,101,40,1,0,0,0,117,4,0,0,0,115, - 101,108,102,40,0,0,0,0,40,0,0,0,0,117,29,0, - 0,0,60,102,114,111,122,101,110,32,105,109,112,111,114,116, - 108,105,98,46,95,98,111,111,116,115,116,114,97,112,62,117, - 7,0,0,0,97,99,113,117,105,114,101,251,0,0,0,115, - 4,0,0,0,0,1,15,1,117,24,0,0,0,95,68,117, - 109,109,121,77,111,100,117,108,101,76,111,99,107,46,97,99, - 113,117,105,114,101,99,1,0,0,0,0,0,0,0,1,0, - 0,0,3,0,0,0,67,0,0,0,115,49,0,0,0,124, - 0,0,106,0,0,100,1,0,107,2,0,114,30,0,116,1, - 0,100,2,0,131,1,0,130,1,0,110,0,0,124,0,0, - 4,106,0,0,100,3,0,56,2,95,0,0,100,0,0,83, - 40,4,0,0,0,78,105,0,0,0,0,117,31,0,0,0, - 99,97,110,110,111,116,32,114,101,108,101,97,115,101,32,117, - 110,45,97,99,113,117,105,114,101,100,32,108,111,99,107,105, - 1,0,0,0,40,2,0,0,0,117,5,0,0,0,99,111, - 117,110,116,117,12,0,0,0,82,117,110,116,105,109,101,69, - 114,114,111,114,40,1,0,0,0,117,4,0,0,0,115,101, - 108,102,40,0,0,0,0,40,0,0,0,0,117,29,0,0, - 0,60,102,114,111,122,101,110,32,105,109,112,111,114,116,108, - 105,98,46,95,98,111,111,116,115,116,114,97,112,62,117,7, - 0,0,0,114,101,108,101,97,115,101,255,0,0,0,115,6, - 0,0,0,0,1,15,1,15,1,117,24,0,0,0,95,68, - 117,109,109,121,77,111,100,117,108,101,76,111,99,107,46,114, - 101,108,101,97,115,101,99,1,0,0,0,0,0,0,0,1, - 0,0,0,4,0,0,0,67,0,0,0,115,23,0,0,0, - 100,1,0,124,0,0,106,0,0,116,1,0,124,0,0,131, - 1,0,102,2,0,22,83,40,2,0,0,0,78,117,26,0, - 0,0,95,68,117,109,109,121,77,111,100,117,108,101,76,111, - 99,107,40,37,114,41,32,97,116,32,37,100,40,2,0,0, - 0,117,4,0,0,0,110,97,109,101,117,2,0,0,0,105, - 100,40,1,0,0,0,117,4,0,0,0,115,101,108,102,40, - 0,0,0,0,40,0,0,0,0,117,29,0,0,0,60,102, - 114,111,122,101,110,32,105,109,112,111,114,116,108,105,98,46, - 95,98,111,111,116,115,116,114,97,112,62,117,8,0,0,0, - 95,95,114,101,112,114,95,95,4,1,0,0,115,2,0,0, - 0,0,1,117,25,0,0,0,95,68,117,109,109,121,77,111, - 100,117,108,101,76,111,99,107,46,95,95,114,101,112,114,95, - 95,78,40,8,0,0,0,117,8,0,0,0,95,95,110,97, - 109,101,95,95,117,10,0,0,0,95,95,109,111,100,117,108, - 101,95,95,117,12,0,0,0,95,95,113,117,97,108,110,97, - 109,101,95,95,117,7,0,0,0,95,95,100,111,99,95,95, - 117,8,0,0,0,95,95,105,110,105,116,95,95,117,7,0, - 0,0,97,99,113,117,105,114,101,117,7,0,0,0,114,101, - 108,101,97,115,101,117,8,0,0,0,95,95,114,101,112,114, - 95,95,40,1,0,0,0,117,10,0,0,0,95,95,108,111, - 99,97,108,115,95,95,40,0,0,0,0,40,0,0,0,0, - 117,29,0,0,0,60,102,114,111,122,101,110,32,105,109,112, - 111,114,116,108,105,98,46,95,98,111,111,116,115,116,114,97, - 112,62,117,16,0,0,0,95,68,117,109,109,121,77,111,100, - 117,108,101,76,111,99,107,243,0,0,0,115,10,0,0,0, - 16,2,6,2,12,4,12,4,12,5,117,16,0,0,0,95, - 68,117,109,109,121,77,111,100,117,108,101,76,111,99,107,99, - 1,0,0,0,0,0,0,0,3,0,0,0,11,0,0,0, - 3,0,0,0,115,142,0,0,0,100,3,0,125,1,0,121, - 17,0,116,1,0,136,0,0,25,131,0,0,125,1,0,87, - 110,18,0,4,116,2,0,107,10,0,114,43,0,1,1,1, - 89,110,1,0,88,124,1,0,100,3,0,107,8,0,114,138, - 0,116,3,0,100,3,0,107,8,0,114,83,0,116,4,0, - 136,0,0,131,1,0,125,1,0,110,12,0,116,5,0,136, - 0,0,131,1,0,125,1,0,135,0,0,102,1,0,100,1, - 0,100,2,0,134,0,0,125,2,0,116,6,0,106,7,0, - 124,1,0,124,2,0,131,2,0,116,1,0,136,0,0,60, - 110,0,0,124,1,0,83,40,4,0,0,0,117,109,0,0, - 0,71,101,116,32,111,114,32,99,114,101,97,116,101,32,116, - 104,101,32,109,111,100,117,108,101,32,108,111,99,107,32,102, - 111,114,32,97,32,103,105,118,101,110,32,109,111,100,117,108, - 101,32,110,97,109,101,46,10,10,32,32,32,32,83,104,111, - 117,108,100,32,111,110,108,121,32,98,101,32,99,97,108,108, - 101,100,32,119,105,116,104,32,116,104,101,32,105,109,112,111, - 114,116,32,108,111,99,107,32,116,97,107,101,110,46,99,1, - 0,0,0,0,0,0,0,1,0,0,0,2,0,0,0,19, - 0,0,0,115,11,0,0,0,116,0,0,136,0,0,61,100, - 0,0,83,40,1,0,0,0,78,40,1,0,0,0,117,13, - 0,0,0,95,109,111,100,117,108,101,95,108,111,99,107,115, - 40,1,0,0,0,117,1,0,0,0,95,40,1,0,0,0, - 117,4,0,0,0,110,97,109,101,40,0,0,0,0,117,29, - 0,0,0,60,102,114,111,122,101,110,32,105,109,112,111,114, - 116,108,105,98,46,95,98,111,111,116,115,116,114,97,112,62, - 117,2,0,0,0,99,98,24,1,0,0,115,2,0,0,0, - 0,1,117,28,0,0,0,95,103,101,116,95,109,111,100,117, - 108,101,95,108,111,99,107,46,60,108,111,99,97,108,115,62, - 46,99,98,78,40,8,0,0,0,117,4,0,0,0,78,111, - 110,101,117,13,0,0,0,95,109,111,100,117,108,101,95,108, - 111,99,107,115,117,8,0,0,0,75,101,121,69,114,114,111, - 114,117,7,0,0,0,95,116,104,114,101,97,100,117,16,0, - 0,0,95,68,117,109,109,121,77,111,100,117,108,101,76,111, - 99,107,117,11,0,0,0,95,77,111,100,117,108,101,76,111, - 99,107,117,8,0,0,0,95,119,101,97,107,114,101,102,117, - 3,0,0,0,114,101,102,40,3,0,0,0,117,4,0,0, - 0,110,97,109,101,117,4,0,0,0,108,111,99,107,117,2, - 0,0,0,99,98,40,0,0,0,0,40,1,0,0,0,117, - 4,0,0,0,110,97,109,101,117,29,0,0,0,60,102,114, - 111,122,101,110,32,105,109,112,111,114,116,108,105,98,46,95, - 98,111,111,116,115,116,114,97,112,62,117,16,0,0,0,95, - 103,101,116,95,109,111,100,117,108,101,95,108,111,99,107,10, - 1,0,0,115,24,0,0,0,0,4,6,1,3,1,17,1, - 13,1,5,1,12,1,12,1,15,2,12,1,18,2,25,1, - 117,16,0,0,0,95,103,101,116,95,109,111,100,117,108,101, - 95,108,111,99,107,99,1,0,0,0,0,0,0,0,2,0, - 0,0,11,0,0,0,67,0,0,0,115,71,0,0,0,116, - 0,0,124,0,0,131,1,0,125,1,0,116,1,0,106,2, - 0,131,0,0,1,121,14,0,124,1,0,106,3,0,131,0, - 0,1,87,110,18,0,4,116,4,0,107,10,0,114,56,0, - 1,1,1,89,110,11,0,88,124,1,0,106,5,0,131,0, - 0,1,100,1,0,83,40,2,0,0,0,117,21,1,0,0, - 82,101,108,101,97,115,101,32,116,104,101,32,103,108,111,98, - 97,108,32,105,109,112,111,114,116,32,108,111,99,107,44,32, - 97,110,100,32,97,99,113,117,105,114,101,115,32,116,104,101, - 110,32,114,101,108,101,97,115,101,32,116,104,101,10,32,32, - 32,32,109,111,100,117,108,101,32,108,111,99,107,32,102,111, - 114,32,97,32,103,105,118,101,110,32,109,111,100,117,108,101, - 32,110,97,109,101,46,10,32,32,32,32,84,104,105,115,32, - 105,115,32,117,115,101,100,32,116,111,32,101,110,115,117,114, - 101,32,97,32,109,111,100,117,108,101,32,105,115,32,99,111, - 109,112,108,101,116,101,108,121,32,105,110,105,116,105,97,108, - 105,122,101,100,44,32,105,110,32,116,104,101,10,32,32,32, - 32,101,118,101,110,116,32,105,116,32,105,115,32,98,101,105, - 110,103,32,105,109,112,111,114,116,101,100,32,98,121,32,97, - 110,111,116,104,101,114,32,116,104,114,101,97,100,46,10,10, + 124,1,0,124,0,0,95,0,0,100,0,0,124,0,0,95, + 1,0,100,0,0,83,41,1,78,41,2,114,70,0,0,0, + 218,5,95,108,111,99,107,41,2,114,71,0,0,0,114,67, + 0,0,0,114,4,0,0,0,114,4,0,0,0,114,5,0, + 0,0,114,72,0,0,0,1,1,0,0,115,4,0,0,0, + 0,1,9,1,122,27,95,77,111,100,117,108,101,76,111,99, + 107,77,97,110,97,103,101,114,46,95,95,105,110,105,116,95, + 95,99,1,0,0,0,0,0,0,0,1,0,0,0,10,0, + 0,0,67,0,0,0,115,53,0,0,0,122,22,0,116,0, + 0,124,0,0,106,1,0,131,1,0,124,0,0,95,2,0, + 87,100,0,0,116,3,0,106,4,0,131,0,0,1,88,124, + 0,0,106,2,0,106,5,0,131,0,0,1,100,0,0,83, + 41,1,78,41,6,218,16,95,103,101,116,95,109,111,100,117, + 108,101,95,108,111,99,107,114,70,0,0,0,114,104,0,0, + 0,218,4,95,105,109,112,218,12,114,101,108,101,97,115,101, + 95,108,111,99,107,114,97,0,0,0,41,1,114,71,0,0, + 0,114,4,0,0,0,114,4,0,0,0,114,5,0,0,0, + 114,75,0,0,0,5,1,0,0,115,8,0,0,0,0,1, + 3,1,22,2,11,1,122,28,95,77,111,100,117,108,101,76, + 111,99,107,77,97,110,97,103,101,114,46,95,95,101,110,116, + 101,114,95,95,99,1,0,0,0,0,0,0,0,3,0,0, + 0,1,0,0,0,79,0,0,0,115,17,0,0,0,124,0, + 0,106,0,0,106,1,0,131,0,0,1,100,0,0,83,41, + 1,78,41,2,114,104,0,0,0,114,98,0,0,0,41,3, + 114,71,0,0,0,114,80,0,0,0,218,6,107,119,97,114, + 103,115,114,4,0,0,0,114,4,0,0,0,114,5,0,0, + 0,114,81,0,0,0,12,1,0,0,115,2,0,0,0,0, + 1,122,27,95,77,111,100,117,108,101,76,111,99,107,77,97, + 110,97,103,101,114,46,95,95,101,120,105,116,95,95,78,41, + 6,114,57,0,0,0,114,56,0,0,0,114,58,0,0,0, + 114,72,0,0,0,114,75,0,0,0,114,81,0,0,0,114, + 4,0,0,0,114,4,0,0,0,114,4,0,0,0,114,5, + 0,0,0,114,103,0,0,0,255,0,0,0,115,6,0,0, + 0,12,2,12,4,12,7,114,103,0,0,0,99,1,0,0, + 0,0,0,0,0,3,0,0,0,11,0,0,0,3,0,0, + 0,115,142,0,0,0,100,1,0,125,1,0,121,17,0,116, + 0,0,136,0,0,25,131,0,0,125,1,0,87,110,18,0, + 4,116,1,0,107,10,0,114,43,0,1,1,1,89,110,1, + 0,88,124,1,0,100,1,0,107,8,0,114,138,0,116,2, + 0,100,1,0,107,8,0,114,83,0,116,3,0,136,0,0, + 131,1,0,125,1,0,110,12,0,116,4,0,136,0,0,131, + 1,0,125,1,0,135,0,0,102,1,0,100,2,0,100,3, + 0,134,0,0,125,2,0,116,5,0,106,6,0,124,1,0, + 124,2,0,131,2,0,116,0,0,136,0,0,60,110,0,0, + 124,1,0,83,41,4,122,109,71,101,116,32,111,114,32,99, + 114,101,97,116,101,32,116,104,101,32,109,111,100,117,108,101, + 32,108,111,99,107,32,102,111,114,32,97,32,103,105,118,101, + 110,32,109,111,100,117,108,101,32,110,97,109,101,46,10,10, 32,32,32,32,83,104,111,117,108,100,32,111,110,108,121,32, 98,101,32,99,97,108,108,101,100,32,119,105,116,104,32,116, 104,101,32,105,109,112,111,114,116,32,108,111,99,107,32,116, - 97,107,101,110,46,78,40,6,0,0,0,117,16,0,0,0, - 95,103,101,116,95,109,111,100,117,108,101,95,108,111,99,107, - 117,4,0,0,0,95,105,109,112,117,12,0,0,0,114,101, - 108,101,97,115,101,95,108,111,99,107,117,7,0,0,0,97, - 99,113,117,105,114,101,117,14,0,0,0,95,68,101,97,100, - 108,111,99,107,69,114,114,111,114,117,7,0,0,0,114,101, - 108,101,97,115,101,40,2,0,0,0,117,4,0,0,0,110, - 97,109,101,117,4,0,0,0,108,111,99,107,40,0,0,0, - 0,40,0,0,0,0,117,29,0,0,0,60,102,114,111,122, - 101,110,32,105,109,112,111,114,116,108,105,98,46,95,98,111, - 111,116,115,116,114,97,112,62,117,19,0,0,0,95,108,111, - 99,107,95,117,110,108,111,99,107,95,109,111,100,117,108,101, - 29,1,0,0,115,14,0,0,0,0,7,12,1,10,1,3, - 1,14,1,13,3,5,2,117,19,0,0,0,95,108,111,99, - 107,95,117,110,108,111,99,107,95,109,111,100,117,108,101,99, - 1,0,0,0,0,0,0,0,3,0,0,0,3,0,0,0, - 79,0,0,0,115,13,0,0,0,124,0,0,124,1,0,124, - 2,0,142,0,0,83,40,1,0,0,0,117,46,1,0,0, - 114,101,109,111,118,101,95,105,109,112,111,114,116,108,105,98, - 95,102,114,97,109,101,115,32,105,110,32,105,109,112,111,114, - 116,46,99,32,119,105,108,108,32,97,108,119,97,121,115,32, - 114,101,109,111,118,101,32,115,101,113,117,101,110,99,101,115, - 10,32,32,32,32,111,102,32,105,109,112,111,114,116,108,105, - 98,32,102,114,97,109,101,115,32,116,104,97,116,32,101,110, - 100,32,119,105,116,104,32,97,32,99,97,108,108,32,116,111, - 32,116,104,105,115,32,102,117,110,99,116,105,111,110,10,10, - 32,32,32,32,85,115,101,32,105,116,32,105,110,115,116,101, - 97,100,32,111,102,32,97,32,110,111,114,109,97,108,32,99, - 97,108,108,32,105,110,32,112,108,97,99,101,115,32,119,104, - 101,114,101,32,105,110,99,108,117,100,105,110,103,32,116,104, - 101,32,105,109,112,111,114,116,108,105,98,10,32,32,32,32, - 102,114,97,109,101,115,32,105,110,116,114,111,100,117,99,101, - 115,32,117,110,119,97,110,116,101,100,32,110,111,105,115,101, - 32,105,110,116,111,32,116,104,101,32,116,114,97,99,101,98, - 97,99,107,32,40,101,46,103,46,32,119,104,101,110,32,101, - 120,101,99,117,116,105,110,103,10,32,32,32,32,109,111,100, - 117,108,101,32,99,111,100,101,41,10,32,32,32,32,40,0, - 0,0,0,40,3,0,0,0,117,1,0,0,0,102,117,4, - 0,0,0,97,114,103,115,117,4,0,0,0,107,119,100,115, - 40,0,0,0,0,40,0,0,0,0,117,29,0,0,0,60, - 102,114,111,122,101,110,32,105,109,112,111,114,116,108,105,98, - 46,95,98,111,111,116,115,116,114,97,112,62,117,25,0,0, - 0,95,99,97,108,108,95,119,105,116,104,95,102,114,97,109, - 101,115,95,114,101,109,111,118,101,100,49,1,0,0,115,2, - 0,0,0,0,8,117,25,0,0,0,95,99,97,108,108,95, - 119,105,116,104,95,102,114,97,109,101,115,95,114,101,109,111, - 118,101,100,105,158,12,0,0,117,1,0,0,0,13,105,16, - 0,0,0,117,1,0,0,0,10,105,24,0,0,0,99,1, - 0,0,0,0,0,0,0,2,0,0,0,3,0,0,0,99, - 0,0,0,115,29,0,0,0,124,0,0,93,19,0,125,1, - 0,116,0,0,124,1,0,63,100,0,0,64,86,1,113,3, - 0,100,1,0,83,40,2,0,0,0,105,255,0,0,0,78, - 40,1,0,0,0,117,17,0,0,0,95,82,65,87,95,77, - 65,71,73,67,95,78,85,77,66,69,82,40,2,0,0,0, - 117,2,0,0,0,46,48,117,1,0,0,0,110,40,0,0, - 0,0,40,0,0,0,0,117,29,0,0,0,60,102,114,111, - 122,101,110,32,105,109,112,111,114,116,108,105,98,46,95,98, - 111,111,116,115,116,114,97,112,62,117,9,0,0,0,60,103, - 101,110,101,120,112,114,62,150,1,0,0,115,2,0,0,0, - 6,0,117,9,0,0,0,60,103,101,110,101,120,112,114,62, - 105,0,0,0,0,105,25,0,0,0,105,8,0,0,0,117, - 11,0,0,0,95,95,112,121,99,97,99,104,101,95,95,117, - 3,0,0,0,46,112,121,117,4,0,0,0,46,112,121,99, - 117,4,0,0,0,46,112,121,111,99,2,0,0,0,0,0, - 0,0,11,0,0,0,6,0,0,0,67,0,0,0,115,180, - 0,0,0,124,1,0,100,5,0,107,8,0,114,25,0,116, - 1,0,106,2,0,106,3,0,12,110,3,0,124,1,0,125, - 2,0,124,2,0,114,46,0,116,4,0,125,3,0,110,6, - 0,116,5,0,125,3,0,116,6,0,124,0,0,131,1,0, - 92,2,0,125,4,0,125,5,0,124,5,0,106,7,0,100, - 1,0,131,1,0,92,3,0,125,6,0,125,7,0,125,8, - 0,116,1,0,106,8,0,106,9,0,125,9,0,124,9,0, - 100,5,0,107,8,0,114,133,0,116,10,0,100,2,0,131, - 1,0,130,1,0,110,0,0,100,3,0,106,11,0,124,6, - 0,124,7,0,124,9,0,124,3,0,100,4,0,25,103,4, - 0,131,1,0,125,10,0,116,12,0,124,4,0,116,13,0, - 124,10,0,131,3,0,83,40,6,0,0,0,117,244,1,0, - 0,71,105,118,101,110,32,116,104,101,32,112,97,116,104,32, - 116,111,32,97,32,46,112,121,32,102,105,108,101,44,32,114, - 101,116,117,114,110,32,116,104,101,32,112,97,116,104,32,116, - 111,32,105,116,115,32,46,112,121,99,47,46,112,121,111,32, - 102,105,108,101,46,10,10,32,32,32,32,84,104,101,32,46, - 112,121,32,102,105,108,101,32,100,111,101,115,32,110,111,116, - 32,110,101,101,100,32,116,111,32,101,120,105,115,116,59,32, - 116,104,105,115,32,115,105,109,112,108,121,32,114,101,116,117, - 114,110,115,32,116,104,101,32,112,97,116,104,32,116,111,32, - 116,104,101,10,32,32,32,32,46,112,121,99,47,46,112,121, - 111,32,102,105,108,101,32,99,97,108,99,117,108,97,116,101, - 100,32,97,115,32,105,102,32,116,104,101,32,46,112,121,32, - 102,105,108,101,32,119,101,114,101,32,105,109,112,111,114,116, - 101,100,46,32,32,84,104,101,32,101,120,116,101,110,115,105, - 111,110,10,32,32,32,32,119,105,108,108,32,98,101,32,46, - 112,121,99,32,117,110,108,101,115,115,32,115,121,115,46,102, - 108,97,103,115,46,111,112,116,105,109,105,122,101,32,105,115, - 32,110,111,110,45,122,101,114,111,44,32,116,104,101,110,32, - 105,116,32,119,105,108,108,32,98,101,32,46,112,121,111,46, - 10,10,32,32,32,32,73,102,32,100,101,98,117,103,95,111, - 118,101,114,114,105,100,101,32,105,115,32,110,111,116,32,78, - 111,110,101,44,32,116,104,101,110,32,105,116,32,109,117,115, - 116,32,98,101,32,97,32,98,111,111,108,101,97,110,32,97, - 110,100,32,105,115,32,117,115,101,100,32,105,110,10,32,32, - 32,32,112,108,97,99,101,32,111,102,32,115,121,115,46,102, - 108,97,103,115,46,111,112,116,105,109,105,122,101,46,10,10, - 32,32,32,32,73,102,32,115,121,115,46,105,109,112,108,101, - 109,101,110,116,97,116,105,111,110,46,99,97,99,104,101,95, - 116,97,103,32,105,115,32,78,111,110,101,32,116,104,101,110, - 32,78,111,116,73,109,112,108,101,109,101,110,116,101,100,69, - 114,114,111,114,32,105,115,32,114,97,105,115,101,100,46,10, - 10,32,32,32,32,117,1,0,0,0,46,117,36,0,0,0, - 115,121,115,46,105,109,112,108,101,109,101,110,116,97,116,105, - 111,110,46,99,97,99,104,101,95,116,97,103,32,105,115,32, - 78,111,110,101,117,0,0,0,0,105,0,0,0,0,78,40, - 14,0,0,0,117,4,0,0,0,78,111,110,101,117,3,0, - 0,0,115,121,115,117,5,0,0,0,102,108,97,103,115,117, - 8,0,0,0,111,112,116,105,109,105,122,101,117,23,0,0, - 0,68,69,66,85,71,95,66,89,84,69,67,79,68,69,95, - 83,85,70,70,73,88,69,83,117,27,0,0,0,79,80,84, - 73,77,73,90,69,68,95,66,89,84,69,67,79,68,69,95, - 83,85,70,70,73,88,69,83,117,11,0,0,0,95,112,97, - 116,104,95,115,112,108,105,116,117,9,0,0,0,112,97,114, - 116,105,116,105,111,110,117,14,0,0,0,105,109,112,108,101, - 109,101,110,116,97,116,105,111,110,117,9,0,0,0,99,97, - 99,104,101,95,116,97,103,117,19,0,0,0,78,111,116,73, - 109,112,108,101,109,101,110,116,101,100,69,114,114,111,114,117, - 4,0,0,0,106,111,105,110,117,10,0,0,0,95,112,97, - 116,104,95,106,111,105,110,117,8,0,0,0,95,80,89,67, - 65,67,72,69,40,11,0,0,0,117,4,0,0,0,112,97, - 116,104,117,14,0,0,0,100,101,98,117,103,95,111,118,101, - 114,114,105,100,101,117,5,0,0,0,100,101,98,117,103,117, - 8,0,0,0,115,117,102,102,105,120,101,115,117,4,0,0, - 0,104,101,97,100,117,4,0,0,0,116,97,105,108,117,13, - 0,0,0,98,97,115,101,95,102,105,108,101,110,97,109,101, - 117,3,0,0,0,115,101,112,117,1,0,0,0,95,117,3, - 0,0,0,116,97,103,117,8,0,0,0,102,105,108,101,110, - 97,109,101,40,0,0,0,0,40,0,0,0,0,117,29,0, - 0,0,60,102,114,111,122,101,110,32,105,109,112,111,114,116, - 108,105,98,46,95,98,111,111,116,115,116,114,97,112,62,117, - 17,0,0,0,99,97,99,104,101,95,102,114,111,109,95,115, - 111,117,114,99,101,159,1,0,0,115,22,0,0,0,0,13, - 31,1,6,1,9,2,6,1,18,1,24,1,12,1,12,1, - 15,1,31,1,117,17,0,0,0,99,97,99,104,101,95,102, - 114,111,109,95,115,111,117,114,99,101,99,1,0,0,0,0, - 0,0,0,5,0,0,0,5,0,0,0,67,0,0,0,115, - 193,0,0,0,116,0,0,106,1,0,106,2,0,100,7,0, - 107,8,0,114,33,0,116,4,0,100,1,0,131,1,0,130, - 1,0,110,0,0,116,5,0,124,0,0,131,1,0,92,2, - 0,125,1,0,125,2,0,116,5,0,124,1,0,131,1,0, - 92,2,0,125,1,0,125,3,0,124,3,0,116,6,0,107, - 3,0,114,108,0,116,7,0,100,2,0,106,8,0,116,6, - 0,124,0,0,131,2,0,131,1,0,130,1,0,110,0,0, - 124,2,0,106,9,0,100,3,0,131,1,0,100,4,0,107, - 3,0,114,153,0,116,7,0,100,5,0,106,8,0,124,2, - 0,131,1,0,131,1,0,130,1,0,110,0,0,124,2,0, - 106,10,0,100,3,0,131,1,0,100,6,0,25,125,4,0, - 116,11,0,124,1,0,124,4,0,116,12,0,100,6,0,25, - 23,131,2,0,83,40,8,0,0,0,117,121,1,0,0,71, - 105,118,101,110,32,116,104,101,32,112,97,116,104,32,116,111, - 32,97,32,46,112,121,99,46,47,46,112,121,111,32,102,105, + 97,107,101,110,46,78,99,1,0,0,0,0,0,0,0,1, + 0,0,0,2,0,0,0,19,0,0,0,115,11,0,0,0, + 116,0,0,136,0,0,61,100,0,0,83,41,1,78,41,1, + 218,13,95,109,111,100,117,108,101,95,108,111,99,107,115,41, + 1,114,36,0,0,0,41,1,114,67,0,0,0,114,4,0, + 0,0,114,5,0,0,0,218,2,99,98,32,1,0,0,115, + 2,0,0,0,0,1,122,28,95,103,101,116,95,109,111,100, + 117,108,101,95,108,111,99,107,46,60,108,111,99,97,108,115, + 62,46,99,98,41,7,114,109,0,0,0,114,79,0,0,0, + 114,85,0,0,0,114,102,0,0,0,114,83,0,0,0,218, + 8,95,119,101,97,107,114,101,102,90,3,114,101,102,41,3, + 114,67,0,0,0,114,86,0,0,0,114,110,0,0,0,114, + 4,0,0,0,41,1,114,67,0,0,0,114,5,0,0,0, + 114,105,0,0,0,18,1,0,0,115,24,0,0,0,0,4, + 6,1,3,1,17,1,13,1,5,1,12,1,12,1,15,2, + 12,1,18,2,25,1,114,105,0,0,0,99,1,0,0,0, + 0,0,0,0,2,0,0,0,11,0,0,0,67,0,0,0, + 115,71,0,0,0,116,0,0,124,0,0,131,1,0,125,1, + 0,116,1,0,106,2,0,131,0,0,1,121,14,0,124,1, + 0,106,3,0,131,0,0,1,87,110,18,0,4,116,4,0, + 107,10,0,114,56,0,1,1,1,89,110,11,0,88,124,1, + 0,106,5,0,131,0,0,1,100,1,0,83,41,2,97,21, + 1,0,0,82,101,108,101,97,115,101,32,116,104,101,32,103, + 108,111,98,97,108,32,105,109,112,111,114,116,32,108,111,99, + 107,44,32,97,110,100,32,97,99,113,117,105,114,101,115,32, + 116,104,101,110,32,114,101,108,101,97,115,101,32,116,104,101, + 10,32,32,32,32,109,111,100,117,108,101,32,108,111,99,107, + 32,102,111,114,32,97,32,103,105,118,101,110,32,109,111,100, + 117,108,101,32,110,97,109,101,46,10,32,32,32,32,84,104, + 105,115,32,105,115,32,117,115,101,100,32,116,111,32,101,110, + 115,117,114,101,32,97,32,109,111,100,117,108,101,32,105,115, + 32,99,111,109,112,108,101,116,101,108,121,32,105,110,105,116, + 105,97,108,105,122,101,100,44,32,105,110,32,116,104,101,10, + 32,32,32,32,101,118,101,110,116,32,105,116,32,105,115,32, + 98,101,105,110,103,32,105,109,112,111,114,116,101,100,32,98, + 121,32,97,110,111,116,104,101,114,32,116,104,114,101,97,100, + 46,10,10,32,32,32,32,83,104,111,117,108,100,32,111,110, + 108,121,32,98,101,32,99,97,108,108,101,100,32,119,105,116, + 104,32,116,104,101,32,105,109,112,111,114,116,32,108,111,99, + 107,32,116,97,107,101,110,46,78,41,6,114,105,0,0,0, + 114,106,0,0,0,114,107,0,0,0,114,97,0,0,0,114, + 82,0,0,0,114,98,0,0,0,41,2,114,67,0,0,0, + 114,86,0,0,0,114,4,0,0,0,114,4,0,0,0,114, + 5,0,0,0,218,19,95,108,111,99,107,95,117,110,108,111, + 99,107,95,109,111,100,117,108,101,37,1,0,0,115,14,0, + 0,0,0,7,12,1,10,1,3,1,14,1,13,3,5,2, + 114,112,0,0,0,99,1,0,0,0,0,0,0,0,3,0, + 0,0,3,0,0,0,79,0,0,0,115,13,0,0,0,124, + 0,0,124,1,0,124,2,0,142,0,0,83,41,1,97,46, + 1,0,0,114,101,109,111,118,101,95,105,109,112,111,114,116, + 108,105,98,95,102,114,97,109,101,115,32,105,110,32,105,109, + 112,111,114,116,46,99,32,119,105,108,108,32,97,108,119,97, + 121,115,32,114,101,109,111,118,101,32,115,101,113,117,101,110, + 99,101,115,10,32,32,32,32,111,102,32,105,109,112,111,114, + 116,108,105,98,32,102,114,97,109,101,115,32,116,104,97,116, + 32,101,110,100,32,119,105,116,104,32,97,32,99,97,108,108, + 32,116,111,32,116,104,105,115,32,102,117,110,99,116,105,111, + 110,10,10,32,32,32,32,85,115,101,32,105,116,32,105,110, + 115,116,101,97,100,32,111,102,32,97,32,110,111,114,109,97, + 108,32,99,97,108,108,32,105,110,32,112,108,97,99,101,115, + 32,119,104,101,114,101,32,105,110,99,108,117,100,105,110,103, + 32,116,104,101,32,105,109,112,111,114,116,108,105,98,10,32, + 32,32,32,102,114,97,109,101,115,32,105,110,116,114,111,100, + 117,99,101,115,32,117,110,119,97,110,116,101,100,32,110,111, + 105,115,101,32,105,110,116,111,32,116,104,101,32,116,114,97, + 99,101,98,97,99,107,32,40,101,46,103,46,32,119,104,101, + 110,32,101,120,101,99,117,116,105,110,103,10,32,32,32,32, + 109,111,100,117,108,101,32,99,111,100,101,41,10,32,32,32, + 32,114,4,0,0,0,41,3,218,1,102,114,80,0,0,0, + 90,4,107,119,100,115,114,4,0,0,0,114,4,0,0,0, + 114,5,0,0,0,218,25,95,99,97,108,108,95,119,105,116, + 104,95,102,114,97,109,101,115,95,114,101,109,111,118,101,100, + 57,1,0,0,115,2,0,0,0,0,8,114,114,0,0,0, + 105,238,12,0,0,233,2,0,0,0,114,13,0,0,0,115, + 2,0,0,0,13,10,90,11,95,95,112,121,99,97,99,104, + 101,95,95,122,3,46,112,121,122,4,46,112,121,99,122,4, + 46,112,121,111,78,99,2,0,0,0,0,0,0,0,11,0, + 0,0,6,0,0,0,67,0,0,0,115,192,0,0,0,124, + 1,0,100,1,0,107,8,0,114,25,0,116,0,0,106,1, + 0,106,2,0,12,110,3,0,124,1,0,125,2,0,124,2, + 0,114,46,0,116,3,0,125,3,0,110,6,0,116,4,0, + 125,3,0,116,5,0,124,0,0,131,1,0,92,2,0,125, + 4,0,125,5,0,124,5,0,106,6,0,100,2,0,131,1, + 0,92,3,0,125,6,0,125,7,0,125,8,0,116,0,0, + 106,7,0,106,8,0,125,9,0,124,9,0,100,1,0,107, + 8,0,114,133,0,116,9,0,100,3,0,131,1,0,130,1, + 0,110,0,0,100,4,0,106,10,0,124,6,0,114,151,0, + 124,6,0,110,3,0,124,8,0,124,7,0,124,9,0,124, + 3,0,100,5,0,25,103,4,0,131,1,0,125,10,0,116, + 11,0,124,4,0,116,12,0,124,10,0,131,3,0,83,41, + 6,97,244,1,0,0,71,105,118,101,110,32,116,104,101,32, + 112,97,116,104,32,116,111,32,97,32,46,112,121,32,102,105, 108,101,44,32,114,101,116,117,114,110,32,116,104,101,32,112, - 97,116,104,32,116,111,32,105,116,115,32,46,112,121,32,102, - 105,108,101,46,10,10,32,32,32,32,84,104,101,32,46,112, - 121,99,47,46,112,121,111,32,102,105,108,101,32,100,111,101, + 97,116,104,32,116,111,32,105,116,115,32,46,112,121,99,47, + 46,112,121,111,32,102,105,108,101,46,10,10,32,32,32,32, + 84,104,101,32,46,112,121,32,102,105,108,101,32,100,111,101, 115,32,110,111,116,32,110,101,101,100,32,116,111,32,101,120, 105,115,116,59,32,116,104,105,115,32,115,105,109,112,108,121, 32,114,101,116,117,114,110,115,32,116,104,101,32,112,97,116, - 104,32,116,111,10,32,32,32,32,116,104,101,32,46,112,121, - 32,102,105,108,101,32,99,97,108,99,117,108,97,116,101,100, - 32,116,111,32,99,111,114,114,101,115,112,111,110,100,32,116, - 111,32,116,104,101,32,46,112,121,99,47,46,112,121,111,32, - 102,105,108,101,46,32,32,73,102,32,112,97,116,104,32,100, - 111,101,115,10,32,32,32,32,110,111,116,32,99,111,110,102, - 111,114,109,32,116,111,32,80,69,80,32,51,49,52,55,32, - 102,111,114,109,97,116,44,32,86,97,108,117,101,69,114,114, - 111,114,32,119,105,108,108,32,98,101,32,114,97,105,115,101, - 100,46,32,73,102,10,32,32,32,32,115,121,115,46,105,109, - 112,108,101,109,101,110,116,97,116,105,111,110,46,99,97,99, - 104,101,95,116,97,103,32,105,115,32,78,111,110,101,32,116, - 104,101,110,32,78,111,116,73,109,112,108,101,109,101,110,116, - 101,100,69,114,114,111,114,32,105,115,32,114,97,105,115,101, - 100,46,10,10,32,32,32,32,117,36,0,0,0,115,121,115, - 46,105,109,112,108,101,109,101,110,116,97,116,105,111,110,46, - 99,97,99,104,101,95,116,97,103,32,105,115,32,78,111,110, - 101,117,37,0,0,0,123,125,32,110,111,116,32,98,111,116, - 116,111,109,45,108,101,118,101,108,32,100,105,114,101,99,116, - 111,114,121,32,105,110,32,123,33,114,125,117,1,0,0,0, - 46,105,2,0,0,0,117,28,0,0,0,101,120,112,101,99, - 116,101,100,32,111,110,108,121,32,50,32,100,111,116,115,32, - 105,110,32,123,33,114,125,105,0,0,0,0,78,40,13,0, - 0,0,117,3,0,0,0,115,121,115,117,14,0,0,0,105, - 109,112,108,101,109,101,110,116,97,116,105,111,110,117,9,0, - 0,0,99,97,99,104,101,95,116,97,103,117,4,0,0,0, - 78,111,110,101,117,19,0,0,0,78,111,116,73,109,112,108, - 101,109,101,110,116,101,100,69,114,114,111,114,117,11,0,0, - 0,95,112,97,116,104,95,115,112,108,105,116,117,8,0,0, - 0,95,80,89,67,65,67,72,69,117,10,0,0,0,86,97, - 108,117,101,69,114,114,111,114,117,6,0,0,0,102,111,114, - 109,97,116,117,5,0,0,0,99,111,117,110,116,117,9,0, - 0,0,112,97,114,116,105,116,105,111,110,117,10,0,0,0, - 95,112,97,116,104,95,106,111,105,110,117,15,0,0,0,83, - 79,85,82,67,69,95,83,85,70,70,73,88,69,83,40,5, - 0,0,0,117,4,0,0,0,112,97,116,104,117,4,0,0, - 0,104,101,97,100,117,16,0,0,0,112,121,99,97,99,104, - 101,95,102,105,108,101,110,97,109,101,117,7,0,0,0,112, - 121,99,97,99,104,101,117,13,0,0,0,98,97,115,101,95, - 102,105,108,101,110,97,109,101,40,0,0,0,0,40,0,0, - 0,0,117,29,0,0,0,60,102,114,111,122,101,110,32,105, - 109,112,111,114,116,108,105,98,46,95,98,111,111,116,115,116, - 114,97,112,62,117,17,0,0,0,115,111,117,114,99,101,95, - 102,114,111,109,95,99,97,99,104,101,186,1,0,0,115,24, - 0,0,0,0,9,18,1,15,1,18,1,18,1,12,1,9, - 1,18,1,21,1,9,1,15,1,19,1,117,17,0,0,0, - 115,111,117,114,99,101,95,102,114,111,109,95,99,97,99,104, - 101,99,1,0,0,0,0,0,0,0,5,0,0,0,13,0, - 0,0,67,0,0,0,115,164,0,0,0,116,0,0,124,0, - 0,131,1,0,100,1,0,107,2,0,114,22,0,100,6,0, - 83,124,0,0,106,2,0,100,2,0,131,1,0,92,3,0, - 125,1,0,125,2,0,125,3,0,124,1,0,12,115,81,0, - 124,3,0,106,3,0,131,0,0,100,7,0,100,8,0,133, - 2,0,25,100,5,0,107,3,0,114,85,0,124,0,0,83, - 121,16,0,116,4,0,124,0,0,131,1,0,125,4,0,87, - 110,40,0,4,116,5,0,116,6,0,102,2,0,107,10,0, - 114,143,0,1,1,1,124,0,0,100,6,0,100,9,0,133, - 2,0,25,125,4,0,89,110,1,0,88,116,7,0,124,4, - 0,131,1,0,114,160,0,124,4,0,83,124,0,0,83,40, - 10,0,0,0,117,188,0,0,0,67,111,110,118,101,114,116, - 32,97,32,98,121,116,101,99,111,100,101,32,102,105,108,101, - 32,112,97,116,104,32,116,111,32,97,32,115,111,117,114,99, - 101,32,112,97,116,104,32,40,105,102,32,112,111,115,115,105, - 98,108,101,41,46,10,10,32,32,32,32,84,104,105,115,32, - 102,117,110,99,116,105,111,110,32,101,120,105,115,116,115,32, - 112,117,114,101,108,121,32,102,111,114,32,98,97,99,107,119, - 97,114,100,115,45,99,111,109,112,97,116,105,98,105,108,105, - 116,121,32,102,111,114,10,32,32,32,32,80,121,73,109,112, - 111,114,116,95,69,120,101,99,67,111,100,101,77,111,100,117, - 108,101,87,105,116,104,70,105,108,101,110,97,109,101,115,40, - 41,32,105,110,32,116,104,101,32,67,32,65,80,73,46,10, - 10,32,32,32,32,105,0,0,0,0,117,1,0,0,0,46, - 105,3,0,0,0,105,1,0,0,0,117,2,0,0,0,112, - 121,78,105,253,255,255,255,105,255,255,255,255,105,255,255,255, - 255,40,8,0,0,0,117,3,0,0,0,108,101,110,117,4, - 0,0,0,78,111,110,101,117,10,0,0,0,114,112,97,114, - 116,105,116,105,111,110,117,5,0,0,0,108,111,119,101,114, - 117,17,0,0,0,115,111,117,114,99,101,95,102,114,111,109, - 95,99,97,99,104,101,117,19,0,0,0,78,111,116,73,109, - 112,108,101,109,101,110,116,101,100,69,114,114,111,114,117,10, - 0,0,0,86,97,108,117,101,69,114,114,111,114,117,12,0, - 0,0,95,112,97,116,104,95,105,115,102,105,108,101,40,5, - 0,0,0,117,13,0,0,0,98,121,116,101,99,111,100,101, - 95,112,97,116,104,117,4,0,0,0,114,101,115,116,117,1, - 0,0,0,95,117,9,0,0,0,101,120,116,101,110,115,105, - 111,110,117,11,0,0,0,115,111,117,114,99,101,95,112,97, - 116,104,40,0,0,0,0,40,0,0,0,0,117,29,0,0, - 0,60,102,114,111,122,101,110,32,105,109,112,111,114,116,108, - 105,98,46,95,98,111,111,116,115,116,114,97,112,62,117,15, - 0,0,0,95,103,101,116,95,115,111,117,114,99,101,102,105, - 108,101,209,1,0,0,115,20,0,0,0,0,7,18,1,4, - 1,24,1,35,1,4,1,3,1,16,1,19,1,21,1,117, - 15,0,0,0,95,103,101,116,95,115,111,117,114,99,101,102, - 105,108,101,117,9,0,0,0,118,101,114,98,111,115,105,116, - 121,105,1,0,0,0,99,1,0,0,0,1,0,0,0,3, - 0,0,0,4,0,0,0,71,0,0,0,115,81,0,0,0, - 116,0,0,106,1,0,106,2,0,124,1,0,107,5,0,114, - 77,0,124,0,0,106,3,0,100,6,0,131,1,0,115,46, - 0,100,3,0,124,0,0,23,125,0,0,110,0,0,116,4, - 0,124,0,0,106,5,0,124,2,0,140,0,0,100,4,0, - 116,0,0,106,6,0,131,1,1,1,110,0,0,100,5,0, - 83,40,7,0,0,0,117,61,0,0,0,80,114,105,110,116, - 32,116,104,101,32,109,101,115,115,97,103,101,32,116,111,32, - 115,116,100,101,114,114,32,105,102,32,45,118,47,80,89,84, - 72,79,78,86,69,82,66,79,83,69,32,105,115,32,116,117, - 114,110,101,100,32,111,110,46,117,1,0,0,0,35,117,7, - 0,0,0,105,109,112,111,114,116,32,117,2,0,0,0,35, - 32,117,4,0,0,0,102,105,108,101,78,40,2,0,0,0, - 117,1,0,0,0,35,117,7,0,0,0,105,109,112,111,114, - 116,32,40,7,0,0,0,117,3,0,0,0,115,121,115,117, - 5,0,0,0,102,108,97,103,115,117,7,0,0,0,118,101, - 114,98,111,115,101,117,10,0,0,0,115,116,97,114,116,115, - 119,105,116,104,117,5,0,0,0,112,114,105,110,116,117,6, - 0,0,0,102,111,114,109,97,116,117,6,0,0,0,115,116, - 100,101,114,114,40,3,0,0,0,117,7,0,0,0,109,101, - 115,115,97,103,101,117,9,0,0,0,118,101,114,98,111,115, - 105,116,121,117,4,0,0,0,97,114,103,115,40,0,0,0, - 0,40,0,0,0,0,117,29,0,0,0,60,102,114,111,122, - 101,110,32,105,109,112,111,114,116,108,105,98,46,95,98,111, - 111,116,115,116,114,97,112,62,117,16,0,0,0,95,118,101, - 114,98,111,115,101,95,109,101,115,115,97,103,101,228,1,0, - 0,115,8,0,0,0,0,2,18,1,15,1,13,1,117,16, - 0,0,0,95,118,101,114,98,111,115,101,95,109,101,115,115, - 97,103,101,99,1,0,0,0,0,0,0,0,2,0,0,0, - 3,0,0,0,3,0,0,0,115,35,0,0,0,135,0,0, - 102,1,0,100,1,0,100,2,0,134,0,0,125,1,0,116, - 0,0,124,1,0,136,0,0,131,2,0,1,124,1,0,83, - 40,3,0,0,0,117,39,0,0,0,83,101,116,32,95,95, - 112,97,99,107,97,103,101,95,95,32,111,110,32,116,104,101, - 32,114,101,116,117,114,110,101,100,32,109,111,100,117,108,101, - 46,99,0,0,0,0,0,0,0,0,3,0,0,0,4,0, - 0,0,31,0,0,0,115,101,0,0,0,136,0,0,124,0, - 0,124,1,0,142,0,0,125,2,0,116,0,0,124,2,0, - 100,1,0,100,0,0,131,3,0,100,0,0,107,8,0,114, - 97,0,124,2,0,106,2,0,124,2,0,95,3,0,116,4, - 0,124,2,0,100,2,0,131,2,0,115,97,0,124,2,0, - 106,3,0,106,5,0,100,3,0,131,1,0,100,4,0,25, - 124,2,0,95,3,0,113,97,0,110,0,0,124,2,0,83, - 40,5,0,0,0,78,117,11,0,0,0,95,95,112,97,99, - 107,97,103,101,95,95,117,8,0,0,0,95,95,112,97,116, - 104,95,95,117,1,0,0,0,46,105,0,0,0,0,40,6, - 0,0,0,117,7,0,0,0,103,101,116,97,116,116,114,117, - 4,0,0,0,78,111,110,101,117,8,0,0,0,95,95,110, - 97,109,101,95,95,117,11,0,0,0,95,95,112,97,99,107, - 97,103,101,95,95,117,7,0,0,0,104,97,115,97,116,116, - 114,117,10,0,0,0,114,112,97,114,116,105,116,105,111,110, - 40,3,0,0,0,117,4,0,0,0,97,114,103,115,117,6, - 0,0,0,107,119,97,114,103,115,117,6,0,0,0,109,111, - 100,117,108,101,40,1,0,0,0,117,3,0,0,0,102,120, - 110,40,0,0,0,0,117,29,0,0,0,60,102,114,111,122, - 101,110,32,105,109,112,111,114,116,108,105,98,46,95,98,111, - 111,116,115,116,114,97,112,62,117,19,0,0,0,115,101,116, - 95,112,97,99,107,97,103,101,95,119,114,97,112,112,101,114, - 238,1,0,0,115,12,0,0,0,0,1,15,1,24,1,12, - 1,15,1,31,1,117,40,0,0,0,115,101,116,95,112,97, - 99,107,97,103,101,46,60,108,111,99,97,108,115,62,46,115, - 101,116,95,112,97,99,107,97,103,101,95,119,114,97,112,112, - 101,114,40,1,0,0,0,117,5,0,0,0,95,119,114,97, - 112,40,2,0,0,0,117,3,0,0,0,102,120,110,117,19, - 0,0,0,115,101,116,95,112,97,99,107,97,103,101,95,119, - 114,97,112,112,101,114,40,0,0,0,0,40,1,0,0,0, - 117,3,0,0,0,102,120,110,117,29,0,0,0,60,102,114, - 111,122,101,110,32,105,109,112,111,114,116,108,105,98,46,95, - 98,111,111,116,115,116,114,97,112,62,117,11,0,0,0,115, - 101,116,95,112,97,99,107,97,103,101,236,1,0,0,115,6, - 0,0,0,0,2,18,7,13,1,117,11,0,0,0,115,101, - 116,95,112,97,99,107,97,103,101,99,1,0,0,0,0,0, - 0,0,2,0,0,0,3,0,0,0,3,0,0,0,115,35, - 0,0,0,135,0,0,102,1,0,100,1,0,100,2,0,134, - 0,0,125,1,0,116,0,0,124,1,0,136,0,0,131,2, - 0,1,124,1,0,83,40,3,0,0,0,117,38,0,0,0, - 83,101,116,32,95,95,108,111,97,100,101,114,95,95,32,111, - 110,32,116,104,101,32,114,101,116,117,114,110,101,100,32,109, - 111,100,117,108,101,46,99,1,0,0,0,0,0,0,0,4, - 0,0,0,4,0,0,0,31,0,0,0,115,49,0,0,0, - 136,0,0,124,0,0,124,1,0,124,2,0,142,1,0,125, - 3,0,116,0,0,124,3,0,100,1,0,131,2,0,115,45, - 0,124,0,0,124,3,0,95,1,0,110,0,0,124,3,0, - 83,40,2,0,0,0,78,117,10,0,0,0,95,95,108,111, - 97,100,101,114,95,95,40,2,0,0,0,117,7,0,0,0, - 104,97,115,97,116,116,114,117,10,0,0,0,95,95,108,111, - 97,100,101,114,95,95,40,4,0,0,0,117,4,0,0,0, - 115,101,108,102,117,4,0,0,0,97,114,103,115,117,6,0, - 0,0,107,119,97,114,103,115,117,6,0,0,0,109,111,100, - 117,108,101,40,1,0,0,0,117,3,0,0,0,102,120,110, - 40,0,0,0,0,117,29,0,0,0,60,102,114,111,122,101, - 110,32,105,109,112,111,114,116,108,105,98,46,95,98,111,111, - 116,115,116,114,97,112,62,117,18,0,0,0,115,101,116,95, - 108,111,97,100,101,114,95,119,114,97,112,112,101,114,251,1, - 0,0,115,8,0,0,0,0,1,18,1,15,1,12,1,117, - 38,0,0,0,115,101,116,95,108,111,97,100,101,114,46,60, - 108,111,99,97,108,115,62,46,115,101,116,95,108,111,97,100, - 101,114,95,119,114,97,112,112,101,114,40,1,0,0,0,117, - 5,0,0,0,95,119,114,97,112,40,2,0,0,0,117,3, - 0,0,0,102,120,110,117,18,0,0,0,115,101,116,95,108, - 111,97,100,101,114,95,119,114,97,112,112,101,114,40,0,0, - 0,0,40,1,0,0,0,117,3,0,0,0,102,120,110,117, - 29,0,0,0,60,102,114,111,122,101,110,32,105,109,112,111, - 114,116,108,105,98,46,95,98,111,111,116,115,116,114,97,112, - 62,117,10,0,0,0,115,101,116,95,108,111,97,100,101,114, - 249,1,0,0,115,6,0,0,0,0,2,18,5,13,1,117, - 10,0,0,0,115,101,116,95,108,111,97,100,101,114,99,1, - 0,0,0,0,0,0,0,2,0,0,0,3,0,0,0,3, - 0,0,0,115,35,0,0,0,135,0,0,102,1,0,100,1, - 0,100,2,0,134,0,0,125,1,0,116,0,0,124,1,0, - 136,0,0,131,2,0,1,124,1,0,83,40,3,0,0,0, - 117,42,3,0,0,68,101,99,111,114,97,116,111,114,32,116, - 111,32,104,97,110,100,108,101,32,115,101,108,101,99,116,105, - 110,103,32,116,104,101,32,112,114,111,112,101,114,32,109,111, - 100,117,108,101,32,102,111,114,32,108,111,97,100,101,114,115, - 46,10,10,32,32,32,32,84,104,101,32,100,101,99,111,114, - 97,116,101,100,32,102,117,110,99,116,105,111,110,32,105,115, - 32,112,97,115,115,101,100,32,116,104,101,32,109,111,100,117, - 108,101,32,116,111,32,117,115,101,32,105,110,115,116,101,97, - 100,32,111,102,32,116,104,101,32,109,111,100,117,108,101,10, - 32,32,32,32,110,97,109,101,46,32,84,104,101,32,109,111, - 100,117,108,101,32,112,97,115,115,101,100,32,105,110,32,116, - 111,32,116,104,101,32,102,117,110,99,116,105,111,110,32,105, - 115,32,101,105,116,104,101,114,32,102,114,111,109,32,115,121, - 115,46,109,111,100,117,108,101,115,32,105,102,10,32,32,32, - 32,105,116,32,97,108,114,101,97,100,121,32,101,120,105,115, - 116,115,32,111,114,32,105,115,32,97,32,110,101,119,32,109, - 111,100,117,108,101,46,32,73,102,32,116,104,101,32,109,111, - 100,117,108,101,32,105,115,32,110,101,119,44,32,116,104,101, - 110,32,95,95,110,97,109,101,95,95,10,32,32,32,32,105, - 115,32,115,101,116,32,116,104,101,32,102,105,114,115,116,32, - 97,114,103,117,109,101,110,116,32,116,111,32,116,104,101,32, - 109,101,116,104,111,100,44,32,95,95,108,111,97,100,101,114, - 95,95,32,105,115,32,115,101,116,32,116,111,32,115,101,108, - 102,44,32,97,110,100,10,32,32,32,32,95,95,112,97,99, - 107,97,103,101,95,95,32,105,115,32,115,101,116,32,97,99, - 99,111,114,100,105,110,103,108,121,32,40,105,102,32,115,101, - 108,102,46,105,115,95,112,97,99,107,97,103,101,40,41,32, - 105,115,32,100,101,102,105,110,101,100,41,32,119,105,108,108, - 32,98,101,32,115,101,116,10,32,32,32,32,98,101,102,111, - 114,101,32,105,116,32,105,115,32,112,97,115,115,101,100,32, - 116,111,32,116,104,101,32,100,101,99,111,114,97,116,101,100, - 32,102,117,110,99,116,105,111,110,32,40,105,102,32,115,101, - 108,102,46,105,115,95,112,97,99,107,97,103,101,40,41,32, - 100,111,101,115,10,32,32,32,32,110,111,116,32,119,111,114, - 107,32,102,111,114,32,116,104,101,32,109,111,100,117,108,101, - 32,105,116,32,119,105,108,108,32,98,101,32,115,101,116,32, - 112,111,115,116,45,108,111,97,100,41,46,10,10,32,32,32, - 32,73,102,32,97,110,32,101,120,99,101,112,116,105,111,110, - 32,105,115,32,114,97,105,115,101,100,32,97,110,100,32,116, - 104,101,32,100,101,99,111,114,97,116,111,114,32,99,114,101, - 97,116,101,100,32,116,104,101,32,109,111,100,117,108,101,32, - 105,116,32,105,115,10,32,32,32,32,115,117,98,115,101,113, - 117,101,110,116,108,121,32,114,101,109,111,118,101,100,32,102, - 114,111,109,32,115,121,115,46,109,111,100,117,108,101,115,46, - 10,10,32,32,32,32,84,104,101,32,100,101,99,111,114,97, - 116,111,114,32,97,115,115,117,109,101,115,32,116,104,97,116, - 32,116,104,101,32,100,101,99,111,114,97,116,101,100,32,102, - 117,110,99,116,105,111,110,32,116,97,107,101,115,32,116,104, - 101,32,109,111,100,117,108,101,32,110,97,109,101,32,97,115, - 10,32,32,32,32,116,104,101,32,115,101,99,111,110,100,32, - 97,114,103,117,109,101,110,116,46,10,10,32,32,32,32,99, - 2,0,0,0,0,0,0,0,7,0,0,0,25,0,0,0, - 31,0,0,0,115,254,0,0,0,116,0,0,106,1,0,106, - 2,0,124,1,0,131,1,0,125,4,0,124,4,0,100,0, - 0,107,9,0,125,5,0,124,5,0,115,168,0,116,4,0, - 124,1,0,131,1,0,125,4,0,100,3,0,124,4,0,95, - 6,0,124,4,0,116,0,0,106,1,0,124,1,0,60,124, - 0,0,124,4,0,95,7,0,121,19,0,124,0,0,106,8, - 0,124,1,0,131,1,0,125,6,0,87,110,24,0,4,116, - 9,0,116,10,0,102,2,0,107,10,0,114,124,0,1,1, - 1,89,113,177,0,88,124,6,0,114,143,0,124,1,0,124, - 4,0,95,11,0,113,177,0,124,1,0,106,12,0,100,1, - 0,131,1,0,100,2,0,25,124,4,0,95,11,0,110,9, - 0,100,3,0,124,4,0,95,6,0,122,60,0,121,23,0, - 136,0,0,124,0,0,124,4,0,124,2,0,124,3,0,142, - 2,0,83,87,110,30,0,1,1,1,124,5,0,115,228,0, - 116,0,0,106,1,0,124,1,0,61,110,0,0,130,0,0, - 89,110,1,0,88,87,100,0,0,100,4,0,124,4,0,95, - 6,0,88,100,0,0,83,40,5,0,0,0,78,117,1,0, - 0,0,46,105,0,0,0,0,84,70,40,14,0,0,0,117, - 3,0,0,0,115,121,115,117,7,0,0,0,109,111,100,117, - 108,101,115,117,3,0,0,0,103,101,116,117,4,0,0,0, - 78,111,110,101,117,10,0,0,0,110,101,119,95,109,111,100, - 117,108,101,117,4,0,0,0,84,114,117,101,117,16,0,0, - 0,95,95,105,110,105,116,105,97,108,105,122,105,110,103,95, - 95,117,10,0,0,0,95,95,108,111,97,100,101,114,95,95, - 117,10,0,0,0,105,115,95,112,97,99,107,97,103,101,117, - 11,0,0,0,73,109,112,111,114,116,69,114,114,111,114,117, - 14,0,0,0,65,116,116,114,105,98,117,116,101,69,114,114, - 111,114,117,11,0,0,0,95,95,112,97,99,107,97,103,101, - 95,95,117,10,0,0,0,114,112,97,114,116,105,116,105,111, - 110,117,5,0,0,0,70,97,108,115,101,40,7,0,0,0, - 117,4,0,0,0,115,101,108,102,117,8,0,0,0,102,117, - 108,108,110,97,109,101,117,4,0,0,0,97,114,103,115,117, - 6,0,0,0,107,119,97,114,103,115,117,6,0,0,0,109, - 111,100,117,108,101,117,9,0,0,0,105,115,95,114,101,108, - 111,97,100,117,10,0,0,0,105,115,95,112,97,99,107,97, - 103,101,40,1,0,0,0,117,3,0,0,0,102,120,110,40, - 0,0,0,0,117,29,0,0,0,60,102,114,111,122,101,110, - 32,105,109,112,111,114,116,108,105,98,46,95,98,111,111,116, - 115,116,114,97,112,62,117,25,0,0,0,109,111,100,117,108, - 101,95,102,111,114,95,108,111,97,100,101,114,95,119,114,97, - 112,112,101,114,22,2,0,0,115,44,0,0,0,0,1,18, - 1,12,1,6,4,12,3,9,1,13,1,9,1,3,1,19, - 1,19,1,5,2,6,1,12,2,25,2,9,1,6,2,23, - 1,3,1,6,1,13,1,12,2,117,52,0,0,0,109,111, - 100,117,108,101,95,102,111,114,95,108,111,97,100,101,114,46, - 60,108,111,99,97,108,115,62,46,109,111,100,117,108,101,95, - 102,111,114,95,108,111,97,100,101,114,95,119,114,97,112,112, - 101,114,40,1,0,0,0,117,5,0,0,0,95,119,114,97, - 112,40,2,0,0,0,117,3,0,0,0,102,120,110,117,25, - 0,0,0,109,111,100,117,108,101,95,102,111,114,95,108,111, - 97,100,101,114,95,119,114,97,112,112,101,114,40,0,0,0, - 0,40,1,0,0,0,117,3,0,0,0,102,120,110,117,29, - 0,0,0,60,102,114,111,122,101,110,32,105,109,112,111,114, - 116,108,105,98,46,95,98,111,111,116,115,116,114,97,112,62, - 117,17,0,0,0,109,111,100,117,108,101,95,102,111,114,95, - 108,111,97,100,101,114,4,2,0,0,115,6,0,0,0,0, - 18,18,33,13,1,117,17,0,0,0,109,111,100,117,108,101, - 95,102,111,114,95,108,111,97,100,101,114,99,1,0,0,0, - 0,0,0,0,2,0,0,0,4,0,0,0,3,0,0,0, - 115,38,0,0,0,100,3,0,135,0,0,102,1,0,100,1, - 0,100,2,0,134,1,0,125,1,0,116,1,0,124,1,0, - 136,0,0,131,2,0,1,124,1,0,83,40,4,0,0,0, - 117,252,0,0,0,68,101,99,111,114,97,116,111,114,32,116, + 104,32,116,111,32,116,104,101,10,32,32,32,32,46,112,121, + 99,47,46,112,121,111,32,102,105,108,101,32,99,97,108,99, + 117,108,97,116,101,100,32,97,115,32,105,102,32,116,104,101, + 32,46,112,121,32,102,105,108,101,32,119,101,114,101,32,105, + 109,112,111,114,116,101,100,46,32,32,84,104,101,32,101,120, + 116,101,110,115,105,111,110,10,32,32,32,32,119,105,108,108, + 32,98,101,32,46,112,121,99,32,117,110,108,101,115,115,32, + 115,121,115,46,102,108,97,103,115,46,111,112,116,105,109,105, + 122,101,32,105,115,32,110,111,110,45,122,101,114,111,44,32, + 116,104,101,110,32,105,116,32,119,105,108,108,32,98,101,32, + 46,112,121,111,46,10,10,32,32,32,32,73,102,32,100,101, + 98,117,103,95,111,118,101,114,114,105,100,101,32,105,115,32, + 110,111,116,32,78,111,110,101,44,32,116,104,101,110,32,105, + 116,32,109,117,115,116,32,98,101,32,97,32,98,111,111,108, + 101,97,110,32,97,110,100,32,105,115,32,117,115,101,100,32, + 105,110,10,32,32,32,32,112,108,97,99,101,32,111,102,32, + 115,121,115,46,102,108,97,103,115,46,111,112,116,105,109,105, + 122,101,46,10,10,32,32,32,32,73,102,32,115,121,115,46, + 105,109,112,108,101,109,101,110,116,97,116,105,111,110,46,99, + 97,99,104,101,95,116,97,103,32,105,115,32,78,111,110,101, + 32,116,104,101,110,32,78,111,116,73,109,112,108,101,109,101, + 110,116,101,100,69,114,114,111,114,32,105,115,32,114,97,105, + 115,101,100,46,10,10,32,32,32,32,78,218,1,46,122,36, + 115,121,115,46,105,109,112,108,101,109,101,110,116,97,116,105, + 111,110,46,99,97,99,104,101,95,116,97,103,32,105,115,32, + 78,111,110,101,114,30,0,0,0,114,84,0,0,0,41,13, + 114,7,0,0,0,218,5,102,108,97,103,115,218,8,111,112, + 116,105,109,105,122,101,218,23,68,69,66,85,71,95,66,89, + 84,69,67,79,68,69,95,83,85,70,70,73,88,69,83,218, + 27,79,80,84,73,77,73,90,69,68,95,66,89,84,69,67, + 79,68,69,95,83,85,70,70,73,88,69,83,114,38,0,0, + 0,114,32,0,0,0,218,14,105,109,112,108,101,109,101,110, + 116,97,116,105,111,110,218,9,99,97,99,104,101,95,116,97, + 103,218,19,78,111,116,73,109,112,108,101,109,101,110,116,101, + 100,69,114,114,111,114,114,26,0,0,0,114,28,0,0,0, + 218,8,95,80,89,67,65,67,72,69,41,11,114,35,0,0, + 0,90,14,100,101,98,117,103,95,111,118,101,114,114,105,100, + 101,218,5,100,101,98,117,103,218,8,115,117,102,102,105,120, + 101,115,218,4,104,101,97,100,114,37,0,0,0,218,4,98, + 97,115,101,218,3,115,101,112,218,4,114,101,115,116,90,3, + 116,97,103,218,8,102,105,108,101,110,97,109,101,114,4,0, + 0,0,114,4,0,0,0,114,5,0,0,0,218,17,99,97, + 99,104,101,95,102,114,111,109,95,115,111,117,114,99,101,181, + 1,0,0,115,22,0,0,0,0,13,31,1,6,1,9,2, + 6,1,18,1,24,1,12,1,12,1,15,1,43,1,114,132, + 0,0,0,99,1,0,0,0,0,0,0,0,5,0,0,0, + 5,0,0,0,67,0,0,0,115,193,0,0,0,116,0,0, + 106,1,0,106,2,0,100,1,0,107,8,0,114,33,0,116, + 3,0,100,2,0,131,1,0,130,1,0,110,0,0,116,4, + 0,124,0,0,131,1,0,92,2,0,125,1,0,125,2,0, + 116,4,0,124,1,0,131,1,0,92,2,0,125,1,0,125, + 3,0,124,3,0,116,5,0,107,3,0,114,108,0,116,6, + 0,100,3,0,106,7,0,116,5,0,124,0,0,131,2,0, + 131,1,0,130,1,0,110,0,0,124,2,0,106,8,0,100, + 4,0,131,1,0,100,5,0,107,3,0,114,153,0,116,6, + 0,100,6,0,106,7,0,124,2,0,131,1,0,131,1,0, + 130,1,0,110,0,0,124,2,0,106,9,0,100,4,0,131, + 1,0,100,7,0,25,125,4,0,116,10,0,124,1,0,124, + 4,0,116,11,0,100,7,0,25,23,131,2,0,83,41,8, + 97,121,1,0,0,71,105,118,101,110,32,116,104,101,32,112, + 97,116,104,32,116,111,32,97,32,46,112,121,99,46,47,46, + 112,121,111,32,102,105,108,101,44,32,114,101,116,117,114,110, + 32,116,104,101,32,112,97,116,104,32,116,111,32,105,116,115, + 32,46,112,121,32,102,105,108,101,46,10,10,32,32,32,32, + 84,104,101,32,46,112,121,99,47,46,112,121,111,32,102,105, + 108,101,32,100,111,101,115,32,110,111,116,32,110,101,101,100, + 32,116,111,32,101,120,105,115,116,59,32,116,104,105,115,32, + 115,105,109,112,108,121,32,114,101,116,117,114,110,115,32,116, + 104,101,32,112,97,116,104,32,116,111,10,32,32,32,32,116, + 104,101,32,46,112,121,32,102,105,108,101,32,99,97,108,99, + 117,108,97,116,101,100,32,116,111,32,99,111,114,114,101,115, + 112,111,110,100,32,116,111,32,116,104,101,32,46,112,121,99, + 47,46,112,121,111,32,102,105,108,101,46,32,32,73,102,32, + 112,97,116,104,32,100,111,101,115,10,32,32,32,32,110,111, + 116,32,99,111,110,102,111,114,109,32,116,111,32,80,69,80, + 32,51,49,52,55,32,102,111,114,109,97,116,44,32,86,97, + 108,117,101,69,114,114,111,114,32,119,105,108,108,32,98,101, + 32,114,97,105,115,101,100,46,32,73,102,10,32,32,32,32, + 115,121,115,46,105,109,112,108,101,109,101,110,116,97,116,105, + 111,110,46,99,97,99,104,101,95,116,97,103,32,105,115,32, + 78,111,110,101,32,116,104,101,110,32,78,111,116,73,109,112, + 108,101,109,101,110,116,101,100,69,114,114,111,114,32,105,115, + 32,114,97,105,115,101,100,46,10,10,32,32,32,32,78,122, + 36,115,121,115,46,105,109,112,108,101,109,101,110,116,97,116, + 105,111,110,46,99,97,99,104,101,95,116,97,103,32,105,115, + 32,78,111,110,101,122,37,123,125,32,110,111,116,32,98,111, + 116,116,111,109,45,108,101,118,101,108,32,100,105,114,101,99, + 116,111,114,121,32,105,110,32,123,33,114,125,114,116,0,0, + 0,114,115,0,0,0,122,28,101,120,112,101,99,116,101,100, + 32,111,110,108,121,32,50,32,100,111,116,115,32,105,110,32, + 123,33,114,125,114,84,0,0,0,41,12,114,7,0,0,0, + 114,121,0,0,0,114,122,0,0,0,114,123,0,0,0,114, + 38,0,0,0,114,124,0,0,0,218,10,86,97,108,117,101, + 69,114,114,111,114,114,47,0,0,0,114,89,0,0,0,218, + 9,112,97,114,116,105,116,105,111,110,114,28,0,0,0,218, + 15,83,79,85,82,67,69,95,83,85,70,70,73,88,69,83, + 41,5,114,35,0,0,0,114,127,0,0,0,90,16,112,121, + 99,97,99,104,101,95,102,105,108,101,110,97,109,101,90,7, + 112,121,99,97,99,104,101,90,13,98,97,115,101,95,102,105, + 108,101,110,97,109,101,114,4,0,0,0,114,4,0,0,0, + 114,5,0,0,0,218,17,115,111,117,114,99,101,95,102,114, + 111,109,95,99,97,99,104,101,208,1,0,0,115,24,0,0, + 0,0,9,18,1,15,1,18,1,18,1,12,1,9,1,18, + 1,21,1,9,1,15,1,19,1,114,136,0,0,0,99,1, + 0,0,0,0,0,0,0,5,0,0,0,12,0,0,0,67, + 0,0,0,115,164,0,0,0,116,0,0,124,0,0,131,1, + 0,100,1,0,107,2,0,114,22,0,100,2,0,83,124,0, + 0,106,1,0,100,3,0,131,1,0,92,3,0,125,1,0, + 125,2,0,125,3,0,124,1,0,12,115,81,0,124,3,0, + 106,2,0,131,0,0,100,7,0,100,8,0,133,2,0,25, + 100,6,0,107,3,0,114,85,0,124,0,0,83,121,16,0, + 116,3,0,124,0,0,131,1,0,125,4,0,87,110,40,0, + 4,116,4,0,116,5,0,102,2,0,107,10,0,114,143,0, + 1,1,1,124,0,0,100,2,0,100,9,0,133,2,0,25, + 125,4,0,89,110,1,0,88,116,6,0,124,4,0,131,1, + 0,114,160,0,124,4,0,83,124,0,0,83,41,10,122,188, + 67,111,110,118,101,114,116,32,97,32,98,121,116,101,99,111, + 100,101,32,102,105,108,101,32,112,97,116,104,32,116,111,32, + 97,32,115,111,117,114,99,101,32,112,97,116,104,32,40,105, + 102,32,112,111,115,115,105,98,108,101,41,46,10,10,32,32, + 32,32,84,104,105,115,32,102,117,110,99,116,105,111,110,32, + 101,120,105,115,116,115,32,112,117,114,101,108,121,32,102,111, + 114,32,98,97,99,107,119,97,114,100,115,45,99,111,109,112, + 97,116,105,98,105,108,105,116,121,32,102,111,114,10,32,32, + 32,32,80,121,73,109,112,111,114,116,95,69,120,101,99,67, + 111,100,101,77,111,100,117,108,101,87,105,116,104,70,105,108, + 101,110,97,109,101,115,40,41,32,105,110,32,116,104,101,32, + 67,32,65,80,73,46,10,10,32,32,32,32,114,84,0,0, + 0,78,114,116,0,0,0,233,3,0,0,0,114,29,0,0, + 0,90,2,112,121,233,253,255,255,255,233,255,255,255,255,114, + 139,0,0,0,41,7,114,31,0,0,0,114,32,0,0,0, + 218,5,108,111,119,101,114,114,136,0,0,0,114,123,0,0, + 0,114,133,0,0,0,114,44,0,0,0,41,5,218,13,98, + 121,116,101,99,111,100,101,95,112,97,116,104,114,130,0,0, + 0,114,36,0,0,0,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,4, + 0,0,0,114,4,0,0,0,114,5,0,0,0,218,15,95, + 103,101,116,95,115,111,117,114,99,101,102,105,108,101,231,1, + 0,0,115,20,0,0,0,0,7,18,1,4,1,24,1,35, + 1,4,1,3,1,16,1,19,1,21,1,114,143,0,0,0, + 99,1,0,0,0,0,0,0,0,2,0,0,0,11,0,0, + 0,67,0,0,0,115,60,0,0,0,121,19,0,116,0,0, + 124,0,0,131,1,0,106,1,0,125,1,0,87,110,24,0, + 4,116,2,0,107,10,0,114,45,0,1,1,1,100,1,0, + 125,1,0,89,110,1,0,88,124,1,0,100,2,0,79,125, + 1,0,124,1,0,83,41,3,122,51,67,97,108,99,117,108, + 97,116,101,32,116,104,101,32,109,111,100,101,32,112,101,114, + 109,105,115,115,105,111,110,115,32,102,111,114,32,97,32,98, + 121,116,101,99,111,100,101,32,102,105,108,101,46,105,182,1, + 0,0,233,128,0,0,0,41,3,114,39,0,0,0,114,41, + 0,0,0,114,40,0,0,0,41,2,114,35,0,0,0,114, + 42,0,0,0,114,4,0,0,0,114,4,0,0,0,114,5, + 0,0,0,218,10,95,99,97,108,99,95,109,111,100,101,250, + 1,0,0,115,12,0,0,0,0,2,3,1,19,1,13,1, + 11,3,10,1,114,145,0,0,0,218,9,118,101,114,98,111, + 115,105,116,121,114,29,0,0,0,99,1,0,0,0,1,0, + 0,0,3,0,0,0,4,0,0,0,71,0,0,0,115,81, + 0,0,0,116,0,0,106,1,0,106,2,0,124,1,0,107, + 5,0,114,77,0,124,0,0,106,3,0,100,6,0,131,1, + 0,115,46,0,100,3,0,124,0,0,23,125,0,0,110,0, + 0,116,4,0,124,0,0,106,5,0,124,2,0,140,0,0, + 100,4,0,116,0,0,106,6,0,131,1,1,1,110,0,0, + 100,5,0,83,41,7,122,61,80,114,105,110,116,32,116,104, + 101,32,109,101,115,115,97,103,101,32,116,111,32,115,116,100, + 101,114,114,32,105,102,32,45,118,47,80,89,84,72,79,78, + 86,69,82,66,79,83,69,32,105,115,32,116,117,114,110,101, + 100,32,111,110,46,250,1,35,250,7,105,109,112,111,114,116, + 32,122,2,35,32,114,54,0,0,0,78,41,2,114,147,0, + 0,0,114,148,0,0,0,41,7,114,7,0,0,0,114,117, + 0,0,0,218,7,118,101,114,98,111,115,101,114,9,0,0, + 0,218,5,112,114,105,110,116,114,47,0,0,0,218,6,115, + 116,100,101,114,114,41,3,218,7,109,101,115,115,97,103,101, + 114,146,0,0,0,114,80,0,0,0,114,4,0,0,0,114, + 4,0,0,0,114,5,0,0,0,218,16,95,118,101,114,98, + 111,115,101,95,109,101,115,115,97,103,101,6,2,0,0,115, + 8,0,0,0,0,2,18,1,15,1,13,1,114,153,0,0, + 0,99,1,0,0,0,0,0,0,0,2,0,0,0,4,0, + 0,0,3,0,0,0,115,38,0,0,0,100,1,0,135,0, + 0,102,1,0,100,2,0,100,3,0,134,1,0,125,1,0, + 116,0,0,124,1,0,136,0,0,131,2,0,1,124,1,0, + 83,41,4,122,252,68,101,99,111,114,97,116,111,114,32,116, 111,32,118,101,114,105,102,121,32,116,104,97,116,32,116,104, 101,32,109,111,100,117,108,101,32,98,101,105,110,103,32,114, 101,113,117,101,115,116,101,100,32,109,97,116,99,104,101,115, @@ -1212,2518 +925,2976 @@ unsigned char _Py_M__importlib[] = { 111,109,112,97,114,105,115,111,110,32,102,97,105,108,115,32, 116,104,101,110,32,73,109,112,111,114,116,69,114,114,111,114, 32,105,115,32,114,97,105,115,101,100,46,10,10,32,32,32, - 32,99,2,0,0,0,0,0,0,0,4,0,0,0,5,0, - 0,0,31,0,0,0,115,83,0,0,0,124,1,0,100,0, - 0,107,8,0,114,24,0,124,0,0,106,1,0,125,1,0, - 110,40,0,124,0,0,106,1,0,124,1,0,107,3,0,114, - 64,0,116,2,0,100,1,0,124,1,0,22,100,2,0,124, - 1,0,131,1,1,130,1,0,110,0,0,136,0,0,124,0, - 0,124,1,0,124,2,0,124,3,0,142,2,0,83,40,3, - 0,0,0,78,117,23,0,0,0,108,111,97,100,101,114,32, - 99,97,110,110,111,116,32,104,97,110,100,108,101,32,37,115, - 117,4,0,0,0,110,97,109,101,40,3,0,0,0,117,4, - 0,0,0,78,111,110,101,117,4,0,0,0,110,97,109,101, - 117,11,0,0,0,73,109,112,111,114,116,69,114,114,111,114, - 40,4,0,0,0,117,4,0,0,0,115,101,108,102,117,4, - 0,0,0,110,97,109,101,117,4,0,0,0,97,114,103,115, - 117,6,0,0,0,107,119,97,114,103,115,40,1,0,0,0, - 117,6,0,0,0,109,101,116,104,111,100,40,0,0,0,0, - 117,29,0,0,0,60,102,114,111,122,101,110,32,105,109,112, - 111,114,116,108,105,98,46,95,98,111,111,116,115,116,114,97, - 112,62,117,19,0,0,0,95,99,104,101,99,107,95,110,97, - 109,101,95,119,114,97,112,112,101,114,67,2,0,0,115,10, - 0,0,0,0,1,12,1,12,1,15,1,25,1,117,40,0, - 0,0,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, - 109,101,95,119,114,97,112,112,101,114,78,40,2,0,0,0, - 117,4,0,0,0,78,111,110,101,117,5,0,0,0,95,119, - 114,97,112,40,2,0,0,0,117,6,0,0,0,109,101,116, - 104,111,100,117,19,0,0,0,95,99,104,101,99,107,95,110, - 97,109,101,95,119,114,97,112,112,101,114,40,0,0,0,0, - 40,1,0,0,0,117,6,0,0,0,109,101,116,104,111,100, - 117,29,0,0,0,60,102,114,111,122,101,110,32,105,109,112, - 111,114,116,108,105,98,46,95,98,111,111,116,115,116,114,97, - 112,62,117,11,0,0,0,95,99,104,101,99,107,95,110,97, - 109,101,59,2,0,0,115,6,0,0,0,0,8,21,6,13, - 1,117,11,0,0,0,95,99,104,101,99,107,95,110,97,109, - 101,99,1,0,0,0,0,0,0,0,2,0,0,0,3,0, - 0,0,3,0,0,0,115,35,0,0,0,135,0,0,102,1, - 0,100,1,0,100,2,0,134,0,0,125,1,0,116,0,0, - 124,1,0,136,0,0,131,2,0,1,124,1,0,83,40,3, - 0,0,0,117,49,0,0,0,68,101,99,111,114,97,116,111, - 114,32,116,111,32,118,101,114,105,102,121,32,116,104,101,32, - 110,97,109,101,100,32,109,111,100,117,108,101,32,105,115,32, - 98,117,105,108,116,45,105,110,46,99,2,0,0,0,0,0, - 0,0,2,0,0,0,4,0,0,0,19,0,0,0,115,58, - 0,0,0,124,1,0,116,0,0,106,1,0,107,7,0,114, - 45,0,116,2,0,100,1,0,106,3,0,124,1,0,131,1, - 0,100,2,0,124,1,0,131,1,1,130,1,0,110,0,0, - 136,0,0,124,0,0,124,1,0,131,2,0,83,40,3,0, - 0,0,78,117,27,0,0,0,123,125,32,105,115,32,110,111, - 116,32,97,32,98,117,105,108,116,45,105,110,32,109,111,100, - 117,108,101,117,4,0,0,0,110,97,109,101,40,4,0,0, - 0,117,3,0,0,0,115,121,115,117,20,0,0,0,98,117, - 105,108,116,105,110,95,109,111,100,117,108,101,95,110,97,109, - 101,115,117,11,0,0,0,73,109,112,111,114,116,69,114,114, - 111,114,117,6,0,0,0,102,111,114,109,97,116,40,2,0, - 0,0,117,4,0,0,0,115,101,108,102,117,8,0,0,0, - 102,117,108,108,110,97,109,101,40,1,0,0,0,117,3,0, - 0,0,102,120,110,40,0,0,0,0,117,29,0,0,0,60, - 102,114,111,122,101,110,32,105,109,112,111,114,116,108,105,98, - 46,95,98,111,111,116,115,116,114,97,112,62,117,25,0,0, - 0,95,114,101,113,117,105,114,101,115,95,98,117,105,108,116, - 105,110,95,119,114,97,112,112,101,114,79,2,0,0,115,8, - 0,0,0,0,1,15,1,18,1,12,1,117,52,0,0,0, - 95,114,101,113,117,105,114,101,115,95,98,117,105,108,116,105, - 110,46,60,108,111,99,97,108,115,62,46,95,114,101,113,117, - 105,114,101,115,95,98,117,105,108,116,105,110,95,119,114,97, - 112,112,101,114,40,1,0,0,0,117,5,0,0,0,95,119, - 114,97,112,40,2,0,0,0,117,3,0,0,0,102,120,110, - 117,25,0,0,0,95,114,101,113,117,105,114,101,115,95,98, - 117,105,108,116,105,110,95,119,114,97,112,112,101,114,40,0, - 0,0,0,40,1,0,0,0,117,3,0,0,0,102,120,110, - 117,29,0,0,0,60,102,114,111,122,101,110,32,105,109,112, - 111,114,116,108,105,98,46,95,98,111,111,116,115,116,114,97, - 112,62,117,17,0,0,0,95,114,101,113,117,105,114,101,115, - 95,98,117,105,108,116,105,110,77,2,0,0,115,6,0,0, - 0,0,2,18,5,13,1,117,17,0,0,0,95,114,101,113, - 117,105,114,101,115,95,98,117,105,108,116,105,110,99,1,0, - 0,0,0,0,0,0,2,0,0,0,3,0,0,0,3,0, - 0,0,115,35,0,0,0,135,0,0,102,1,0,100,1,0, - 100,2,0,134,0,0,125,1,0,116,0,0,124,1,0,136, - 0,0,131,2,0,1,124,1,0,83,40,3,0,0,0,117, - 47,0,0,0,68,101,99,111,114,97,116,111,114,32,116,111, - 32,118,101,114,105,102,121,32,116,104,101,32,110,97,109,101, - 100,32,109,111,100,117,108,101,32,105,115,32,102,114,111,122, - 101,110,46,99,2,0,0,0,0,0,0,0,2,0,0,0, - 4,0,0,0,19,0,0,0,115,58,0,0,0,116,0,0, - 106,1,0,124,1,0,131,1,0,115,45,0,116,2,0,100, - 1,0,106,3,0,124,1,0,131,1,0,100,2,0,124,1, - 0,131,1,1,130,1,0,110,0,0,136,0,0,124,0,0, - 124,1,0,131,2,0,83,40,3,0,0,0,78,117,25,0, - 0,0,123,125,32,105,115,32,110,111,116,32,97,32,102,114, - 111,122,101,110,32,109,111,100,117,108,101,117,4,0,0,0, - 110,97,109,101,40,4,0,0,0,117,4,0,0,0,95,105, - 109,112,117,9,0,0,0,105,115,95,102,114,111,122,101,110, - 117,11,0,0,0,73,109,112,111,114,116,69,114,114,111,114, - 117,6,0,0,0,102,111,114,109,97,116,40,2,0,0,0, - 117,4,0,0,0,115,101,108,102,117,8,0,0,0,102,117, - 108,108,110,97,109,101,40,1,0,0,0,117,3,0,0,0, - 102,120,110,40,0,0,0,0,117,29,0,0,0,60,102,114, - 111,122,101,110,32,105,109,112,111,114,116,108,105,98,46,95, - 98,111,111,116,115,116,114,97,112,62,117,24,0,0,0,95, - 114,101,113,117,105,114,101,115,95,102,114,111,122,101,110,95, - 119,114,97,112,112,101,114,90,2,0,0,115,8,0,0,0, - 0,1,15,1,18,1,12,1,117,50,0,0,0,95,114,101, - 113,117,105,114,101,115,95,102,114,111,122,101,110,46,60,108, - 111,99,97,108,115,62,46,95,114,101,113,117,105,114,101,115, - 95,102,114,111,122,101,110,95,119,114,97,112,112,101,114,40, - 1,0,0,0,117,5,0,0,0,95,119,114,97,112,40,2, - 0,0,0,117,3,0,0,0,102,120,110,117,24,0,0,0, - 95,114,101,113,117,105,114,101,115,95,102,114,111,122,101,110, - 95,119,114,97,112,112,101,114,40,0,0,0,0,40,1,0, - 0,0,117,3,0,0,0,102,120,110,117,29,0,0,0,60, - 102,114,111,122,101,110,32,105,109,112,111,114,116,108,105,98, - 46,95,98,111,111,116,115,116,114,97,112,62,117,16,0,0, - 0,95,114,101,113,117,105,114,101,115,95,102,114,111,122,101, - 110,88,2,0,0,115,6,0,0,0,0,2,18,5,13,1, - 117,16,0,0,0,95,114,101,113,117,105,114,101,115,95,102, - 114,111,122,101,110,99,2,0,0,0,0,0,0,0,5,0, - 0,0,5,0,0,0,67,0,0,0,115,87,0,0,0,124, - 0,0,106,0,0,124,1,0,131,1,0,92,2,0,125,2, - 0,125,3,0,124,2,0,100,3,0,107,8,0,114,83,0, - 116,2,0,124,3,0,131,1,0,114,83,0,100,1,0,125, - 4,0,116,3,0,106,4,0,124,4,0,106,5,0,124,3, - 0,100,2,0,25,131,1,0,116,6,0,131,2,0,1,110, - 0,0,124,2,0,83,40,4,0,0,0,117,86,0,0,0, - 84,114,121,32,116,111,32,102,105,110,100,32,97,32,108,111, - 97,100,101,114,32,102,111,114,32,116,104,101,32,115,112,101, - 99,105,102,105,101,100,32,109,111,100,117,108,101,32,98,121, - 32,100,101,108,101,103,97,116,105,110,103,32,116,111,10,32, - 32,32,32,115,101,108,102,46,102,105,110,100,95,108,111,97, - 100,101,114,40,41,46,117,44,0,0,0,78,111,116,32,105, - 109,112,111,114,116,105,110,103,32,100,105,114,101,99,116,111, - 114,121,32,123,125,58,32,109,105,115,115,105,110,103,32,95, - 95,105,110,105,116,95,95,105,0,0,0,0,78,40,7,0, - 0,0,117,11,0,0,0,102,105,110,100,95,108,111,97,100, - 101,114,117,4,0,0,0,78,111,110,101,117,3,0,0,0, - 108,101,110,117,9,0,0,0,95,119,97,114,110,105,110,103, - 115,117,4,0,0,0,119,97,114,110,117,6,0,0,0,102, - 111,114,109,97,116,117,13,0,0,0,73,109,112,111,114,116, - 87,97,114,110,105,110,103,40,5,0,0,0,117,4,0,0, - 0,115,101,108,102,117,8,0,0,0,102,117,108,108,110,97, - 109,101,117,6,0,0,0,108,111,97,100,101,114,117,8,0, - 0,0,112,111,114,116,105,111,110,115,117,3,0,0,0,109, - 115,103,40,0,0,0,0,40,0,0,0,0,117,29,0,0, - 0,60,102,114,111,122,101,110,32,105,109,112,111,114,116,108, - 105,98,46,95,98,111,111,116,115,116,114,97,112,62,117,17, - 0,0,0,95,102,105,110,100,95,109,111,100,117,108,101,95, - 115,104,105,109,99,2,0,0,115,10,0,0,0,0,6,21, - 1,24,1,6,1,32,1,117,17,0,0,0,95,102,105,110, - 100,95,109,111,100,117,108,101,95,115,104,105,109,99,1,0, - 0,0,0,0,0,0,1,0,0,0,6,0,0,0,66,0, - 0,0,115,173,0,0,0,124,0,0,69,101,0,0,90,1, - 0,100,0,0,90,2,0,100,1,0,90,3,0,101,4,0, - 100,2,0,100,3,0,132,0,0,131,1,0,90,5,0,101, - 4,0,100,14,0,100,4,0,100,5,0,132,1,0,131,1, - 0,90,7,0,101,4,0,101,8,0,101,9,0,101,10,0, - 100,6,0,100,7,0,132,0,0,131,1,0,131,1,0,131, - 1,0,131,1,0,90,11,0,101,4,0,101,10,0,100,8, - 0,100,9,0,132,0,0,131,1,0,131,1,0,90,12,0, - 101,4,0,101,10,0,100,10,0,100,11,0,132,0,0,131, - 1,0,131,1,0,90,13,0,101,4,0,101,10,0,100,12, - 0,100,13,0,132,0,0,131,1,0,131,1,0,90,14,0, - 100,14,0,83,40,15,0,0,0,117,15,0,0,0,66,117, - 105,108,116,105,110,73,109,112,111,114,116,101,114,117,144,0, - 0,0,77,101,116,97,32,112,97,116,104,32,105,109,112,111, - 114,116,32,102,111,114,32,98,117,105,108,116,45,105,110,32, - 109,111,100,117,108,101,115,46,10,10,32,32,32,32,65,108, - 108,32,109,101,116,104,111,100,115,32,97,114,101,32,101,105, - 116,104,101,114,32,99,108,97,115,115,32,111,114,32,115,116, - 97,116,105,99,32,109,101,116,104,111,100,115,32,116,111,32, - 97,118,111,105,100,32,116,104,101,32,110,101,101,100,32,116, - 111,10,32,32,32,32,105,110,115,116,97,110,116,105,97,116, - 101,32,116,104,101,32,99,108,97,115,115,46,10,10,32,32, - 32,32,99,2,0,0,0,0,0,0,0,2,0,0,0,2, - 0,0,0,67,0,0,0,115,16,0,0,0,100,1,0,106, - 0,0,124,1,0,106,1,0,131,1,0,83,40,2,0,0, - 0,78,117,24,0,0,0,60,109,111,100,117,108,101,32,39, - 123,125,39,32,40,98,117,105,108,116,45,105,110,41,62,40, - 2,0,0,0,117,6,0,0,0,102,111,114,109,97,116,117, - 8,0,0,0,95,95,110,97,109,101,95,95,40,2,0,0, - 0,117,3,0,0,0,99,108,115,117,6,0,0,0,109,111, - 100,117,108,101,40,0,0,0,0,40,0,0,0,0,117,29, - 0,0,0,60,102,114,111,122,101,110,32,105,109,112,111,114, - 116,108,105,98,46,95,98,111,111,116,115,116,114,97,112,62, - 117,11,0,0,0,109,111,100,117,108,101,95,114,101,112,114, - 125,2,0,0,115,2,0,0,0,0,2,117,27,0,0,0, + 32,78,99,2,0,0,0,0,0,0,0,4,0,0,0,5, + 0,0,0,31,0,0,0,115,83,0,0,0,124,1,0,100, + 0,0,107,8,0,114,24,0,124,0,0,106,0,0,125,1, + 0,110,40,0,124,0,0,106,0,0,124,1,0,107,3,0, + 114,64,0,116,1,0,100,1,0,124,1,0,22,100,2,0, + 124,1,0,131,1,1,130,1,0,110,0,0,136,0,0,124, + 0,0,124,1,0,124,2,0,124,3,0,142,2,0,83,41, + 3,78,122,23,108,111,97,100,101,114,32,99,97,110,110,111, + 116,32,104,97,110,100,108,101,32,37,115,114,67,0,0,0, + 41,2,114,67,0,0,0,218,11,73,109,112,111,114,116,69, + 114,114,111,114,41,4,114,71,0,0,0,114,67,0,0,0, + 114,80,0,0,0,114,108,0,0,0,41,1,218,6,109,101, + 116,104,111,100,114,4,0,0,0,114,5,0,0,0,218,19, + 95,99,104,101,99,107,95,110,97,109,101,95,119,114,97,112, + 112,101,114,22,2,0,0,115,10,0,0,0,0,1,12,1, + 12,1,15,1,25,1,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,109,101,95,119,114,97,112,112,101,114, + 41,1,114,65,0,0,0,41,2,114,155,0,0,0,114,156, + 0,0,0,114,4,0,0,0,41,1,114,155,0,0,0,114, + 5,0,0,0,218,11,95,99,104,101,99,107,95,110,97,109, + 101,14,2,0,0,115,6,0,0,0,0,8,21,6,13,1, + 114,157,0,0,0,99,1,0,0,0,0,0,0,0,2,0, + 0,0,3,0,0,0,3,0,0,0,115,35,0,0,0,135, + 0,0,102,1,0,100,1,0,100,2,0,134,0,0,125,1, + 0,116,0,0,124,1,0,136,0,0,131,2,0,1,124,1, + 0,83,41,3,122,49,68,101,99,111,114,97,116,111,114,32, + 116,111,32,118,101,114,105,102,121,32,116,104,101,32,110,97, + 109,101,100,32,109,111,100,117,108,101,32,105,115,32,98,117, + 105,108,116,45,105,110,46,99,2,0,0,0,0,0,0,0, + 2,0,0,0,4,0,0,0,19,0,0,0,115,58,0,0, + 0,124,1,0,116,0,0,106,1,0,107,7,0,114,45,0, + 116,2,0,100,1,0,106,3,0,124,1,0,131,1,0,100, + 2,0,124,1,0,131,1,1,130,1,0,110,0,0,136,0, + 0,124,0,0,124,1,0,131,2,0,83,41,3,78,122,29, + 123,33,114,125,32,105,115,32,110,111,116,32,97,32,98,117, + 105,108,116,45,105,110,32,109,111,100,117,108,101,114,67,0, + 0,0,41,4,114,7,0,0,0,218,20,98,117,105,108,116, + 105,110,95,109,111,100,117,108,101,95,110,97,109,101,115,114, + 154,0,0,0,114,47,0,0,0,41,2,114,71,0,0,0, + 218,8,102,117,108,108,110,97,109,101,41,1,218,3,102,120, + 110,114,4,0,0,0,114,5,0,0,0,218,25,95,114,101, + 113,117,105,114,101,115,95,98,117,105,108,116,105,110,95,119, + 114,97,112,112,101,114,34,2,0,0,115,8,0,0,0,0, + 1,15,1,18,1,12,1,122,52,95,114,101,113,117,105,114, + 101,115,95,98,117,105,108,116,105,110,46,60,108,111,99,97, + 108,115,62,46,95,114,101,113,117,105,114,101,115,95,98,117, + 105,108,116,105,110,95,119,114,97,112,112,101,114,41,1,114, + 65,0,0,0,41,2,114,160,0,0,0,114,161,0,0,0, + 114,4,0,0,0,41,1,114,160,0,0,0,114,5,0,0, + 0,218,17,95,114,101,113,117,105,114,101,115,95,98,117,105, + 108,116,105,110,32,2,0,0,115,6,0,0,0,0,2,18, + 5,13,1,114,162,0,0,0,99,1,0,0,0,0,0,0, + 0,2,0,0,0,3,0,0,0,3,0,0,0,115,35,0, + 0,0,135,0,0,102,1,0,100,1,0,100,2,0,134,0, + 0,125,1,0,116,0,0,124,1,0,136,0,0,131,2,0, + 1,124,1,0,83,41,3,122,47,68,101,99,111,114,97,116, + 111,114,32,116,111,32,118,101,114,105,102,121,32,116,104,101, + 32,110,97,109,101,100,32,109,111,100,117,108,101,32,105,115, + 32,102,114,111,122,101,110,46,99,2,0,0,0,0,0,0, + 0,2,0,0,0,4,0,0,0,19,0,0,0,115,58,0, + 0,0,116,0,0,106,1,0,124,1,0,131,1,0,115,45, + 0,116,2,0,100,1,0,106,3,0,124,1,0,131,1,0, + 100,2,0,124,1,0,131,1,1,130,1,0,110,0,0,136, + 0,0,124,0,0,124,1,0,131,2,0,83,41,3,78,122, + 27,123,33,114,125,32,105,115,32,110,111,116,32,97,32,102, + 114,111,122,101,110,32,109,111,100,117,108,101,114,67,0,0, + 0,41,4,114,106,0,0,0,218,9,105,115,95,102,114,111, + 122,101,110,114,154,0,0,0,114,47,0,0,0,41,2,114, + 71,0,0,0,114,159,0,0,0,41,1,114,160,0,0,0, + 114,4,0,0,0,114,5,0,0,0,218,24,95,114,101,113, + 117,105,114,101,115,95,102,114,111,122,101,110,95,119,114,97, + 112,112,101,114,45,2,0,0,115,8,0,0,0,0,1,15, + 1,18,1,12,1,122,50,95,114,101,113,117,105,114,101,115, + 95,102,114,111,122,101,110,46,60,108,111,99,97,108,115,62, + 46,95,114,101,113,117,105,114,101,115,95,102,114,111,122,101, + 110,95,119,114,97,112,112,101,114,41,1,114,65,0,0,0, + 41,2,114,160,0,0,0,114,164,0,0,0,114,4,0,0, + 0,41,1,114,160,0,0,0,114,5,0,0,0,218,16,95, + 114,101,113,117,105,114,101,115,95,102,114,111,122,101,110,43, + 2,0,0,115,6,0,0,0,0,2,18,5,13,1,114,165, + 0,0,0,99,2,0,0,0,0,0,0,0,5,0,0,0, + 4,0,0,0,67,0,0,0,115,87,0,0,0,124,0,0, + 106,0,0,124,1,0,131,1,0,92,2,0,125,2,0,125, + 3,0,124,2,0,100,1,0,107,8,0,114,83,0,116,1, + 0,124,3,0,131,1,0,114,83,0,100,2,0,125,4,0, + 116,2,0,106,3,0,124,4,0,106,4,0,124,3,0,100, + 3,0,25,131,1,0,116,5,0,131,2,0,1,110,0,0, + 124,2,0,83,41,4,122,155,84,114,121,32,116,111,32,102, + 105,110,100,32,97,32,108,111,97,100,101,114,32,102,111,114, + 32,116,104,101,32,115,112,101,99,105,102,105,101,100,32,109, + 111,100,117,108,101,32,98,121,32,100,101,108,101,103,97,116, + 105,110,103,32,116,111,10,32,32,32,32,115,101,108,102,46, + 102,105,110,100,95,108,111,97,100,101,114,40,41,46,10,10, + 32,32,32,32,84,104,105,115,32,109,101,116,104,111,100,32, + 105,115,32,100,101,112,114,101,99,97,116,101,100,32,105,110, + 32,102,97,118,111,114,32,111,102,32,102,105,110,100,101,114, + 46,102,105,110,100,95,115,112,101,99,40,41,46,10,10,32, + 32,32,32,78,122,44,78,111,116,32,105,109,112,111,114,116, + 105,110,103,32,100,105,114,101,99,116,111,114,121,32,123,125, + 58,32,109,105,115,115,105,110,103,32,95,95,105,110,105,116, + 95,95,114,84,0,0,0,41,6,218,11,102,105,110,100,95, + 108,111,97,100,101,114,114,31,0,0,0,218,9,95,119,97, + 114,110,105,110,103,115,218,4,119,97,114,110,114,47,0,0, + 0,218,13,73,109,112,111,114,116,87,97,114,110,105,110,103, + 41,5,114,71,0,0,0,114,159,0,0,0,218,6,108,111, + 97,100,101,114,218,8,112,111,114,116,105,111,110,115,218,3, + 109,115,103,114,4,0,0,0,114,4,0,0,0,114,5,0, + 0,0,218,17,95,102,105,110,100,95,109,111,100,117,108,101, + 95,115,104,105,109,54,2,0,0,115,10,0,0,0,0,10, + 21,1,24,1,6,1,32,1,114,173,0,0,0,99,2,0, + 0,0,0,0,0,0,5,0,0,0,3,0,0,0,67,0, + 0,0,115,93,0,0,0,116,0,0,124,1,0,124,0,0, + 131,2,0,125,2,0,116,1,0,124,2,0,131,1,0,125, + 3,0,124,1,0,116,2,0,106,3,0,107,6,0,114,79, + 0,116,2,0,106,3,0,124,1,0,25,125,4,0,124,3, + 0,106,4,0,124,4,0,131,1,0,1,116,2,0,106,3, + 0,124,1,0,25,83,124,3,0,106,5,0,131,0,0,83, + 100,1,0,83,41,2,122,128,76,111,97,100,32,116,104,101, + 32,115,112,101,99,105,102,105,101,100,32,109,111,100,117,108, + 101,32,105,110,116,111,32,115,121,115,46,109,111,100,117,108, + 101,115,32,97,110,100,32,114,101,116,117,114,110,32,105,116, + 46,10,10,32,32,32,32,84,104,105,115,32,109,101,116,104, + 111,100,32,105,115,32,100,101,112,114,101,99,97,116,101,100, + 46,32,32,85,115,101,32,108,111,97,100,101,114,46,101,120, + 101,99,95,109,111,100,117,108,101,32,105,110,115,116,101,97, + 100,46,10,10,32,32,32,32,78,41,6,218,16,115,112,101, + 99,95,102,114,111,109,95,108,111,97,100,101,114,218,12,95, + 83,112,101,99,77,101,116,104,111,100,115,114,7,0,0,0, + 114,73,0,0,0,218,4,101,120,101,99,218,4,108,111,97, + 100,41,5,114,71,0,0,0,114,159,0,0,0,218,4,115, + 112,101,99,218,7,109,101,116,104,111,100,115,218,6,109,111, + 100,117,108,101,114,4,0,0,0,114,4,0,0,0,114,5, + 0,0,0,218,17,95,108,111,97,100,95,109,111,100,117,108, + 101,95,115,104,105,109,71,2,0,0,115,14,0,0,0,0, + 6,15,1,12,1,15,1,13,1,13,1,11,2,114,181,0, + 0,0,99,4,0,0,0,0,0,0,0,11,0,0,0,19, + 0,0,0,67,0,0,0,115,255,1,0,0,105,0,0,125, + 4,0,124,2,0,100,1,0,107,9,0,114,31,0,124,2, + 0,124,4,0,100,2,0,60,110,6,0,100,3,0,125,2, + 0,124,3,0,100,1,0,107,9,0,114,62,0,124,3,0, + 124,4,0,100,4,0,60,110,0,0,124,0,0,100,1,0, + 100,5,0,133,2,0,25,125,5,0,124,0,0,100,5,0, + 100,6,0,133,2,0,25,125,6,0,124,0,0,100,6,0, + 100,7,0,133,2,0,25,125,7,0,124,5,0,116,0,0, + 107,3,0,114,171,0,100,8,0,106,1,0,124,2,0,124, + 5,0,131,2,0,125,8,0,116,2,0,100,9,0,124,8, + 0,131,2,0,1,116,3,0,124,8,0,124,4,0,141,1, + 0,130,1,0,110,122,0,116,4,0,124,6,0,131,1,0, + 100,5,0,107,3,0,114,232,0,100,10,0,106,1,0,124, + 2,0,131,1,0,125,8,0,116,2,0,100,9,0,124,8, + 0,131,2,0,1,116,5,0,124,8,0,131,1,0,130,1, + 0,110,61,0,116,4,0,124,7,0,131,1,0,100,5,0, + 107,3,0,114,37,1,100,11,0,106,1,0,124,2,0,131, + 1,0,125,8,0,116,2,0,100,9,0,124,8,0,131,2, + 0,1,116,5,0,124,8,0,131,1,0,130,1,0,110,0, + 0,124,1,0,100,1,0,107,9,0,114,241,1,121,20,0, + 116,6,0,124,1,0,100,12,0,25,131,1,0,125,9,0, + 87,110,18,0,4,116,7,0,107,10,0,114,89,1,1,1, + 1,89,110,65,0,88,116,8,0,124,6,0,131,1,0,124, + 9,0,107,3,0,114,154,1,100,13,0,106,1,0,124,2, + 0,131,1,0,125,8,0,116,2,0,100,9,0,124,8,0, + 131,2,0,1,116,3,0,124,8,0,124,4,0,141,1,0, + 130,1,0,110,0,0,121,18,0,124,1,0,100,14,0,25, + 100,15,0,64,125,10,0,87,110,18,0,4,116,7,0,107, + 10,0,114,192,1,1,1,1,89,113,241,1,88,116,8,0, + 124,7,0,131,1,0,124,10,0,107,3,0,114,241,1,116, + 3,0,100,13,0,106,1,0,124,2,0,131,1,0,124,4, + 0,141,1,0,130,1,0,113,241,1,110,0,0,124,0,0, + 100,7,0,100,1,0,133,2,0,25,83,41,16,97,122,1, + 0,0,86,97,108,105,100,97,116,101,32,116,104,101,32,104, + 101,97,100,101,114,32,111,102,32,116,104,101,32,112,97,115, + 115,101,100,45,105,110,32,98,121,116,101,99,111,100,101,32, + 97,103,97,105,110,115,116,32,115,111,117,114,99,101,95,115, + 116,97,116,115,32,40,105,102,10,32,32,32,32,103,105,118, + 101,110,41,32,97,110,100,32,114,101,116,117,114,110,105,110, + 103,32,116,104,101,32,98,121,116,101,99,111,100,101,32,116, + 104,97,116,32,99,97,110,32,98,101,32,99,111,109,112,105, + 108,101,100,32,98,121,32,99,111,109,112,105,108,101,40,41, + 46,10,10,32,32,32,32,65,108,108,32,111,116,104,101,114, + 32,97,114,103,117,109,101,110,116,115,32,97,114,101,32,117, + 115,101,100,32,116,111,32,101,110,104,97,110,99,101,32,101, + 114,114,111,114,32,114,101,112,111,114,116,105,110,103,46,10, + 10,32,32,32,32,73,109,112,111,114,116,69,114,114,111,114, + 32,105,115,32,114,97,105,115,101,100,32,119,104,101,110,32, + 116,104,101,32,109,97,103,105,99,32,110,117,109,98,101,114, + 32,105,115,32,105,110,99,111,114,114,101,99,116,32,111,114, + 32,116,104,101,32,98,121,116,101,99,111,100,101,32,105,115, + 10,32,32,32,32,102,111,117,110,100,32,116,111,32,98,101, + 32,115,116,97,108,101,46,32,69,79,70,69,114,114,111,114, + 32,105,115,32,114,97,105,115,101,100,32,119,104,101,110,32, + 116,104,101,32,100,97,116,97,32,105,115,32,102,111,117,110, + 100,32,116,111,32,98,101,10,32,32,32,32,116,114,117,110, + 99,97,116,101,100,46,10,10,32,32,32,32,78,114,67,0, + 0,0,122,10,60,98,121,116,101,99,111,100,101,62,114,35, + 0,0,0,114,12,0,0,0,233,8,0,0,0,233,12,0, + 0,0,122,30,98,97,100,32,109,97,103,105,99,32,110,117, + 109,98,101,114,32,105,110,32,123,33,114,125,58,32,123,33, + 114,125,122,2,123,125,122,43,114,101,97,99,104,101,100,32, + 69,79,70,32,119,104,105,108,101,32,114,101,97,100,105,110, + 103,32,116,105,109,101,115,116,97,109,112,32,105,110,32,123, + 33,114,125,122,48,114,101,97,99,104,101,100,32,69,79,70, + 32,119,104,105,108,101,32,114,101,97,100,105,110,103,32,115, + 105,122,101,32,111,102,32,115,111,117,114,99,101,32,105,110, + 32,123,33,114,125,218,5,109,116,105,109,101,122,26,98,121, + 116,101,99,111,100,101,32,105,115,32,115,116,97,108,101,32, + 102,111,114,32,123,33,114,125,218,4,115,105,122,101,108,3, + 0,0,0,255,127,255,127,3,0,41,9,218,12,77,65,71, + 73,67,95,78,85,77,66,69,82,114,47,0,0,0,114,153, + 0,0,0,114,154,0,0,0,114,31,0,0,0,218,8,69, + 79,70,69,114,114,111,114,114,14,0,0,0,114,79,0,0, + 0,114,19,0,0,0,41,11,114,53,0,0,0,218,12,115, + 111,117,114,99,101,95,115,116,97,116,115,114,67,0,0,0, + 114,35,0,0,0,90,11,101,120,99,95,100,101,116,97,105, + 108,115,90,5,109,97,103,105,99,90,13,114,97,119,95,116, + 105,109,101,115,116,97,109,112,90,8,114,97,119,95,115,105, + 122,101,114,152,0,0,0,218,12,115,111,117,114,99,101,95, + 109,116,105,109,101,218,11,115,111,117,114,99,101,95,115,105, + 122,101,114,4,0,0,0,114,4,0,0,0,114,5,0,0, + 0,218,25,95,118,97,108,105,100,97,116,101,95,98,121,116, + 101,99,111,100,101,95,104,101,97,100,101,114,87,2,0,0, + 115,76,0,0,0,0,11,6,1,12,1,13,3,6,1,12, + 1,13,1,16,1,16,1,16,1,12,1,18,1,13,1,18, + 1,18,1,15,1,13,1,15,1,18,1,15,1,13,1,15, + 1,12,1,3,1,20,1,13,1,5,2,18,1,15,1,13, + 1,18,1,3,1,18,1,13,1,5,2,18,1,15,1,15, + 1,114,191,0,0,0,99,4,0,0,0,0,0,0,0,5, + 0,0,0,6,0,0,0,67,0,0,0,115,115,0,0,0, + 116,0,0,106,1,0,124,0,0,131,1,0,125,4,0,116, + 2,0,124,4,0,116,3,0,131,2,0,114,78,0,116,4, + 0,100,1,0,124,2,0,131,2,0,1,124,3,0,100,2, + 0,107,9,0,114,74,0,116,5,0,106,6,0,124,4,0, + 124,3,0,131,2,0,1,110,0,0,124,4,0,83,116,7, + 0,100,3,0,106,8,0,124,2,0,131,1,0,100,4,0, + 124,1,0,100,5,0,124,2,0,131,1,2,130,1,0,100, + 2,0,83,41,6,122,60,67,111,109,112,105,108,101,32,98, + 121,116,101,99,111,100,101,32,97,115,32,114,101,116,117,114, + 110,101,100,32,98,121,32,95,118,97,108,105,100,97,116,101, + 95,98,121,116,101,99,111,100,101,95,104,101,97,100,101,114, + 40,41,46,122,21,99,111,100,101,32,111,98,106,101,99,116, + 32,102,114,111,109,32,123,33,114,125,78,122,23,78,111,110, + 45,99,111,100,101,32,111,98,106,101,99,116,32,105,110,32, + 123,33,114,125,114,67,0,0,0,114,35,0,0,0,41,9, + 218,7,109,97,114,115,104,97,108,90,5,108,111,97,100,115, + 218,10,105,115,105,110,115,116,97,110,99,101,218,10,95,99, + 111,100,101,95,116,121,112,101,114,153,0,0,0,114,106,0, + 0,0,90,16,95,102,105,120,95,99,111,95,102,105,108,101, + 110,97,109,101,114,154,0,0,0,114,47,0,0,0,41,5, + 114,53,0,0,0,114,67,0,0,0,114,141,0,0,0,114, + 142,0,0,0,218,4,99,111,100,101,114,4,0,0,0,114, + 4,0,0,0,114,5,0,0,0,218,17,95,99,111,109,112, + 105,108,101,95,98,121,116,101,99,111,100,101,142,2,0,0, + 115,16,0,0,0,0,2,15,1,15,1,13,1,12,1,19, + 1,4,2,18,1,114,196,0,0,0,114,84,0,0,0,99, + 3,0,0,0,0,0,0,0,4,0,0,0,3,0,0,0, + 67,0,0,0,115,76,0,0,0,116,0,0,116,1,0,131, + 1,0,125,3,0,124,3,0,106,2,0,116,3,0,124,1, + 0,131,1,0,131,1,0,1,124,3,0,106,2,0,116,3, + 0,124,2,0,131,1,0,131,1,0,1,124,3,0,106,2, + 0,116,4,0,106,5,0,124,0,0,131,1,0,131,1,0, + 1,124,3,0,83,41,1,122,80,67,111,109,112,105,108,101, + 32,97,32,99,111,100,101,32,111,98,106,101,99,116,32,105, + 110,116,111,32,98,121,116,101,99,111,100,101,32,102,111,114, + 32,119,114,105,116,105,110,103,32,111,117,116,32,116,111,32, + 97,32,98,121,116,101,45,99,111,109,112,105,108,101,100,10, + 32,32,32,32,102,105,108,101,46,41,6,218,9,98,121,116, + 101,97,114,114,97,121,114,186,0,0,0,218,6,101,120,116, + 101,110,100,114,17,0,0,0,114,192,0,0,0,90,5,100, + 117,109,112,115,41,4,114,195,0,0,0,114,184,0,0,0, + 114,190,0,0,0,114,53,0,0,0,114,4,0,0,0,114, + 4,0,0,0,114,5,0,0,0,218,17,95,99,111,100,101, + 95,116,111,95,98,121,116,101,99,111,100,101,154,2,0,0, + 115,10,0,0,0,0,3,12,1,19,1,19,1,22,1,114, + 199,0,0,0,99,1,0,0,0,0,0,0,0,5,0,0, + 0,4,0,0,0,67,0,0,0,115,89,0,0,0,100,1, + 0,100,2,0,108,0,0,125,1,0,116,1,0,106,2,0, + 124,0,0,131,1,0,106,3,0,125,2,0,124,1,0,106, + 4,0,124,2,0,131,1,0,125,3,0,116,1,0,106,5, + 0,100,2,0,100,3,0,131,2,0,125,4,0,124,4,0, + 106,6,0,124,0,0,106,6,0,124,3,0,100,1,0,25, + 131,1,0,131,1,0,83,41,4,122,121,68,101,99,111,100, + 101,32,98,121,116,101,115,32,114,101,112,114,101,115,101,110, + 116,105,110,103,32,115,111,117,114,99,101,32,99,111,100,101, + 32,97,110,100,32,114,101,116,117,114,110,32,116,104,101,32, + 115,116,114,105,110,103,46,10,10,32,32,32,32,85,110,105, + 118,101,114,115,97,108,32,110,101,119,108,105,110,101,32,115, + 117,112,112,111,114,116,32,105,115,32,117,115,101,100,32,105, + 110,32,116,104,101,32,100,101,99,111,100,105,110,103,46,10, + 32,32,32,32,114,84,0,0,0,78,84,41,7,218,8,116, + 111,107,101,110,105,122,101,114,49,0,0,0,90,7,66,121, + 116,101,115,73,79,90,8,114,101,97,100,108,105,110,101,90, + 15,100,101,116,101,99,116,95,101,110,99,111,100,105,110,103, + 90,25,73,110,99,114,101,109,101,110,116,97,108,78,101,119, + 108,105,110,101,68,101,99,111,100,101,114,218,6,100,101,99, + 111,100,101,41,5,218,12,115,111,117,114,99,101,95,98,121, + 116,101,115,114,200,0,0,0,90,21,115,111,117,114,99,101, + 95,98,121,116,101,115,95,114,101,97,100,108,105,110,101,218, + 8,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,4,0,0,0,114, + 4,0,0,0,114,5,0,0,0,218,13,100,101,99,111,100, + 101,95,115,111,117,114,99,101,164,2,0,0,115,10,0,0, + 0,0,5,12,1,18,1,15,1,18,1,114,204,0,0,0, + 99,1,0,0,0,0,0,0,0,5,0,0,0,35,0,0, + 0,67,0,0,0,115,15,1,0,0,116,0,0,124,0,0, + 100,1,0,100,0,0,131,3,0,125,1,0,116,1,0,124, + 1,0,100,2,0,131,2,0,114,74,0,121,17,0,124,1, + 0,106,2,0,124,0,0,131,1,0,83,87,113,74,0,4, + 116,3,0,107,10,0,114,70,0,1,1,1,89,113,74,0, + 88,110,0,0,121,13,0,124,0,0,106,4,0,125,2,0, + 87,110,18,0,4,116,5,0,107,10,0,114,107,0,1,1, + 1,89,110,29,0,88,124,2,0,100,0,0,107,9,0,114, + 136,0,116,6,0,124,2,0,131,1,0,106,2,0,131,0, + 0,83,121,13,0,124,0,0,106,7,0,125,3,0,87,110, + 24,0,4,116,5,0,107,10,0,114,175,0,1,1,1,100, + 3,0,125,3,0,89,110,1,0,88,121,13,0,124,0,0, + 106,8,0,125,4,0,87,110,59,0,4,116,5,0,107,10, + 0,114,250,0,1,1,1,124,1,0,100,0,0,107,8,0, + 114,230,0,100,4,0,106,9,0,124,3,0,131,1,0,83, + 100,5,0,106,9,0,124,3,0,124,1,0,131,2,0,83, + 89,110,17,0,88,100,6,0,106,9,0,124,3,0,124,4, + 0,131,2,0,83,100,0,0,83,41,7,78,218,10,95,95, + 108,111,97,100,101,114,95,95,218,11,109,111,100,117,108,101, + 95,114,101,112,114,250,1,63,122,13,60,109,111,100,117,108, + 101,32,123,33,114,125,62,122,20,60,109,111,100,117,108,101, + 32,123,33,114,125,32,40,123,33,114,125,41,62,122,23,60, + 109,111,100,117,108,101,32,123,33,114,125,32,102,114,111,109, + 32,123,33,114,125,62,41,10,114,62,0,0,0,114,60,0, + 0,0,114,206,0,0,0,218,9,69,120,99,101,112,116,105, + 111,110,218,8,95,95,115,112,101,99,95,95,218,14,65,116, + 116,114,105,98,117,116,101,69,114,114,111,114,114,175,0,0, + 0,114,57,0,0,0,218,8,95,95,102,105,108,101,95,95, + 114,47,0,0,0,41,5,114,180,0,0,0,114,170,0,0, + 0,114,178,0,0,0,114,67,0,0,0,114,131,0,0,0, + 114,4,0,0,0,114,4,0,0,0,114,5,0,0,0,218, + 12,95,109,111,100,117,108,101,95,114,101,112,114,178,2,0, + 0,115,46,0,0,0,0,2,18,1,15,4,3,1,17,1, + 13,1,8,1,3,1,13,1,13,1,5,2,12,1,16,4, + 3,1,13,1,13,1,11,1,3,1,13,1,13,1,12,1, + 13,2,21,2,114,212,0,0,0,99,0,0,0,0,0,0, + 0,0,0,0,0,0,2,0,0,0,64,0,0,0,115,52, + 0,0,0,101,0,0,90,1,0,100,0,0,90,2,0,100, + 1,0,100,2,0,132,0,0,90,3,0,100,3,0,100,4, + 0,132,0,0,90,4,0,100,5,0,100,6,0,132,0,0, + 90,5,0,100,7,0,83,41,8,218,17,95,105,110,115,116, + 97,108,108,101,100,95,115,97,102,101,108,121,99,2,0,0, + 0,0,0,0,0,2,0,0,0,2,0,0,0,67,0,0, + 0,115,25,0,0,0,124,1,0,124,0,0,95,0,0,124, + 1,0,106,1,0,124,0,0,95,2,0,100,0,0,83,41, + 1,78,41,3,218,7,95,109,111,100,117,108,101,114,209,0, + 0,0,218,5,95,115,112,101,99,41,2,114,71,0,0,0, + 114,180,0,0,0,114,4,0,0,0,114,4,0,0,0,114, + 5,0,0,0,114,72,0,0,0,216,2,0,0,115,4,0, + 0,0,0,1,9,1,122,26,95,105,110,115,116,97,108,108, + 101,100,95,115,97,102,101,108,121,46,95,95,105,110,105,116, + 95,95,99,1,0,0,0,0,0,0,0,1,0,0,0,3, + 0,0,0,67,0,0,0,115,38,0,0,0,100,1,0,124, + 0,0,106,0,0,95,1,0,124,0,0,106,2,0,116,3, + 0,106,4,0,124,0,0,106,0,0,106,5,0,60,100,0, + 0,83,41,2,78,84,41,6,114,215,0,0,0,218,13,95, + 105,110,105,116,105,97,108,105,122,105,110,103,114,214,0,0, + 0,114,7,0,0,0,114,73,0,0,0,114,67,0,0,0, + 41,1,114,71,0,0,0,114,4,0,0,0,114,4,0,0, + 0,114,5,0,0,0,114,75,0,0,0,220,2,0,0,115, + 4,0,0,0,0,4,12,1,122,27,95,105,110,115,116,97, + 108,108,101,100,95,115,97,102,101,108,121,46,95,95,101,110, + 116,101,114,95,95,99,1,0,0,0,0,0,0,0,3,0, + 0,0,17,0,0,0,71,0,0,0,115,121,0,0,0,122, + 101,0,124,0,0,106,0,0,125,2,0,116,1,0,100,1, + 0,100,2,0,132,0,0,124,1,0,68,131,1,0,131,1, + 0,114,78,0,121,17,0,116,2,0,106,3,0,124,2,0, + 106,4,0,61,87,113,100,0,4,116,5,0,107,10,0,114, + 74,0,1,1,1,89,113,100,0,88,110,22,0,116,6,0, + 100,3,0,124,2,0,106,4,0,124,2,0,106,7,0,131, + 3,0,1,87,100,0,0,100,4,0,124,0,0,106,0,0, + 95,8,0,88,100,0,0,83,41,5,78,99,1,0,0,0, + 0,0,0,0,2,0,0,0,3,0,0,0,115,0,0,0, + 115,27,0,0,0,124,0,0,93,17,0,125,1,0,124,1, + 0,100,0,0,107,9,0,86,1,113,3,0,100,0,0,83, + 41,1,78,114,4,0,0,0,41,2,114,22,0,0,0,114, + 76,0,0,0,114,4,0,0,0,114,4,0,0,0,114,5, + 0,0,0,114,77,0,0,0,230,2,0,0,115,2,0,0, + 0,6,0,122,45,95,105,110,115,116,97,108,108,101,100,95, + 115,97,102,101,108,121,46,95,95,101,120,105,116,95,95,46, + 60,108,111,99,97,108,115,62,46,60,103,101,110,101,120,112, + 114,62,122,18,105,109,112,111,114,116,32,123,33,114,125,32, + 35,32,123,33,114,125,70,41,9,114,215,0,0,0,114,78, + 0,0,0,114,7,0,0,0,114,73,0,0,0,114,67,0, + 0,0,114,79,0,0,0,114,153,0,0,0,114,170,0,0, + 0,114,216,0,0,0,41,3,114,71,0,0,0,114,80,0, + 0,0,114,178,0,0,0,114,4,0,0,0,114,4,0,0, + 0,114,5,0,0,0,114,81,0,0,0,227,2,0,0,115, + 18,0,0,0,0,1,3,1,9,1,25,1,3,1,17,1, + 13,1,8,2,26,2,122,26,95,105,110,115,116,97,108,108, + 101,100,95,115,97,102,101,108,121,46,95,95,101,120,105,116, + 95,95,78,41,6,114,57,0,0,0,114,56,0,0,0,114, + 58,0,0,0,114,72,0,0,0,114,75,0,0,0,114,81, + 0,0,0,114,4,0,0,0,114,4,0,0,0,114,4,0, + 0,0,114,5,0,0,0,114,213,0,0,0,214,2,0,0, + 115,6,0,0,0,12,2,12,4,12,7,114,213,0,0,0, + 99,0,0,0,0,0,0,0,0,0,0,0,0,8,0,0, + 0,64,0,0,0,115,172,0,0,0,101,0,0,90,1,0, + 100,0,0,90,2,0,100,1,0,90,3,0,100,2,0,100, + 3,0,100,4,0,100,3,0,100,5,0,100,3,0,100,6, + 0,100,7,0,132,0,3,90,4,0,100,8,0,100,9,0, + 132,0,0,90,5,0,100,10,0,100,11,0,132,0,0,90, + 6,0,101,7,0,100,12,0,100,13,0,132,0,0,131,1, + 0,90,8,0,101,8,0,106,9,0,100,14,0,100,13,0, + 132,0,0,131,1,0,90,8,0,101,7,0,100,15,0,100, + 16,0,132,0,0,131,1,0,90,10,0,101,7,0,100,17, + 0,100,18,0,132,0,0,131,1,0,90,11,0,101,11,0, + 106,9,0,100,19,0,100,18,0,132,0,0,131,1,0,90, + 11,0,100,3,0,83,41,20,218,10,77,111,100,117,108,101, + 83,112,101,99,97,208,5,0,0,84,104,101,32,115,112,101, + 99,105,102,105,99,97,116,105,111,110,32,102,111,114,32,97, + 32,109,111,100,117,108,101,44,32,117,115,101,100,32,102,111, + 114,32,108,111,97,100,105,110,103,46,10,10,32,32,32,32, + 65,32,109,111,100,117,108,101,39,115,32,115,112,101,99,32, + 105,115,32,116,104,101,32,115,111,117,114,99,101,32,102,111, + 114,32,105,110,102,111,114,109,97,116,105,111,110,32,97,98, + 111,117,116,32,116,104,101,32,109,111,100,117,108,101,46,32, + 32,70,111,114,10,32,32,32,32,100,97,116,97,32,97,115, + 115,111,99,105,97,116,101,100,32,119,105,116,104,32,116,104, + 101,32,109,111,100,117,108,101,44,32,105,110,99,108,117,100, + 105,110,103,32,115,111,117,114,99,101,44,32,117,115,101,32, + 116,104,101,32,115,112,101,99,39,115,10,32,32,32,32,108, + 111,97,100,101,114,46,10,10,32,32,32,32,96,110,97,109, + 101,96,32,105,115,32,116,104,101,32,97,98,115,111,108,117, + 116,101,32,110,97,109,101,32,111,102,32,116,104,101,32,109, + 111,100,117,108,101,46,32,32,96,108,111,97,100,101,114,96, + 32,105,115,32,116,104,101,32,108,111,97,100,101,114,10,32, + 32,32,32,116,111,32,117,115,101,32,119,104,101,110,32,108, + 111,97,100,105,110,103,32,116,104,101,32,109,111,100,117,108, + 101,46,32,32,96,112,97,114,101,110,116,96,32,105,115,32, + 116,104,101,32,110,97,109,101,32,111,102,32,116,104,101,10, + 32,32,32,32,112,97,99,107,97,103,101,32,116,104,101,32, + 109,111,100,117,108,101,32,105,115,32,105,110,46,32,32,84, + 104,101,32,112,97,114,101,110,116,32,105,115,32,100,101,114, + 105,118,101,100,32,102,114,111,109,32,116,104,101,32,110,97, + 109,101,46,10,10,32,32,32,32,96,105,115,95,112,97,99, + 107,97,103,101,96,32,100,101,116,101,114,109,105,110,101,115, + 32,105,102,32,116,104,101,32,109,111,100,117,108,101,32,105, + 115,32,99,111,110,115,105,100,101,114,101,100,32,97,32,112, + 97,99,107,97,103,101,32,111,114,10,32,32,32,32,110,111, + 116,46,32,32,79,110,32,109,111,100,117,108,101,115,32,116, + 104,105,115,32,105,115,32,114,101,102,108,101,99,116,101,100, + 32,98,121,32,116,104,101,32,96,95,95,112,97,116,104,95, + 95,96,32,97,116,116,114,105,98,117,116,101,46,10,10,32, + 32,32,32,96,111,114,105,103,105,110,96,32,105,115,32,116, + 104,101,32,115,112,101,99,105,102,105,99,32,108,111,99,97, + 116,105,111,110,32,117,115,101,100,32,98,121,32,116,104,101, + 32,108,111,97,100,101,114,32,102,114,111,109,32,119,104,105, + 99,104,32,116,111,10,32,32,32,32,108,111,97,100,32,116, + 104,101,32,109,111,100,117,108,101,44,32,105,102,32,116,104, + 97,116,32,105,110,102,111,114,109,97,116,105,111,110,32,105, + 115,32,97,118,97,105,108,97,98,108,101,46,32,32,87,104, + 101,110,32,102,105,108,101,110,97,109,101,32,105,115,10,32, + 32,32,32,115,101,116,44,32,111,114,105,103,105,110,32,119, + 105,108,108,32,109,97,116,99,104,46,10,10,32,32,32,32, + 96,104,97,115,95,108,111,99,97,116,105,111,110,96,32,105, + 110,100,105,99,97,116,101,115,32,116,104,97,116,32,97,32, + 115,112,101,99,39,115,32,34,111,114,105,103,105,110,34,32, + 114,101,102,108,101,99,116,115,32,97,32,108,111,99,97,116, + 105,111,110,46,10,32,32,32,32,87,104,101,110,32,116,104, + 105,115,32,105,115,32,84,114,117,101,44,32,96,95,95,102, + 105,108,101,95,95,96,32,97,116,116,114,105,98,117,116,101, + 32,111,102,32,116,104,101,32,109,111,100,117,108,101,32,105, + 115,32,115,101,116,46,10,10,32,32,32,32,96,99,97,99, + 104,101,100,96,32,105,115,32,116,104,101,32,108,111,99,97, + 116,105,111,110,32,111,102,32,116,104,101,32,99,97,99,104, + 101,100,32,98,121,116,101,99,111,100,101,32,102,105,108,101, + 44,32,105,102,32,97,110,121,46,32,32,73,116,10,32,32, + 32,32,99,111,114,114,101,115,112,111,110,100,115,32,116,111, + 32,116,104,101,32,96,95,95,99,97,99,104,101,100,95,95, + 96,32,97,116,116,114,105,98,117,116,101,46,10,10,32,32, + 32,32,96,115,117,98,109,111,100,117,108,101,95,115,101,97, + 114,99,104,95,108,111,99,97,116,105,111,110,115,96,32,105, + 115,32,116,104,101,32,115,101,113,117,101,110,99,101,32,111, + 102,32,112,97,116,104,32,101,110,116,114,105,101,115,32,116, + 111,10,32,32,32,32,115,101,97,114,99,104,32,119,104,101, + 110,32,105,109,112,111,114,116,105,110,103,32,115,117,98,109, + 111,100,117,108,101,115,46,32,32,73,102,32,115,101,116,44, + 32,105,115,95,112,97,99,107,97,103,101,32,115,104,111,117, + 108,100,32,98,101,10,32,32,32,32,84,114,117,101,45,45, + 97,110,100,32,70,97,108,115,101,32,111,116,104,101,114,119, + 105,115,101,46,10,10,32,32,32,32,80,97,99,107,97,103, + 101,115,32,97,114,101,32,115,105,109,112,108,121,32,109,111, + 100,117,108,101,115,32,116,104,97,116,32,40,109,97,121,41, + 32,104,97,118,101,32,115,117,98,109,111,100,117,108,101,115, + 46,32,32,73,102,32,97,32,115,112,101,99,10,32,32,32, + 32,104,97,115,32,97,32,110,111,110,45,78,111,110,101,32, + 118,97,108,117,101,32,105,110,32,96,115,117,98,109,111,100, + 117,108,101,95,115,101,97,114,99,104,95,108,111,99,97,116, + 105,111,110,115,96,44,32,116,104,101,32,105,109,112,111,114, + 116,10,32,32,32,32,115,121,115,116,101,109,32,119,105,108, + 108,32,99,111,110,115,105,100,101,114,32,109,111,100,117,108, + 101,115,32,108,111,97,100,101,100,32,102,114,111,109,32,116, + 104,101,32,115,112,101,99,32,97,115,32,112,97,99,107,97, + 103,101,115,46,10,10,32,32,32,32,79,110,108,121,32,102, + 105,110,100,101,114,115,32,40,115,101,101,32,105,109,112,111, + 114,116,108,105,98,46,97,98,99,46,77,101,116,97,80,97, + 116,104,70,105,110,100,101,114,32,97,110,100,10,32,32,32, + 32,105,109,112,111,114,116,108,105,98,46,97,98,99,46,80, + 97,116,104,69,110,116,114,121,70,105,110,100,101,114,41,32, + 115,104,111,117,108,100,32,109,111,100,105,102,121,32,77,111, + 100,117,108,101,83,112,101,99,32,105,110,115,116,97,110,99, + 101,115,46,10,10,32,32,32,32,218,6,111,114,105,103,105, + 110,78,218,12,108,111,97,100,101,114,95,115,116,97,116,101, + 218,10,105,115,95,112,97,99,107,97,103,101,99,3,0,0, + 0,3,0,0,0,6,0,0,0,2,0,0,0,67,0,0, + 0,115,79,0,0,0,124,1,0,124,0,0,95,0,0,124, + 2,0,124,0,0,95,1,0,124,3,0,124,0,0,95,2, + 0,124,4,0,124,0,0,95,3,0,124,5,0,114,48,0, + 103,0,0,110,3,0,100,0,0,124,0,0,95,4,0,100, + 1,0,124,0,0,95,5,0,100,0,0,124,0,0,95,6, + 0,100,0,0,83,41,2,78,70,41,7,114,67,0,0,0, + 114,170,0,0,0,114,218,0,0,0,114,219,0,0,0,218, + 26,115,117,98,109,111,100,117,108,101,95,115,101,97,114,99, + 104,95,108,111,99,97,116,105,111,110,115,218,13,95,115,101, + 116,95,102,105,108,101,97,116,116,114,218,7,95,99,97,99, + 104,101,100,41,6,114,71,0,0,0,114,67,0,0,0,114, + 170,0,0,0,114,218,0,0,0,114,219,0,0,0,114,220, + 0,0,0,114,4,0,0,0,114,4,0,0,0,114,5,0, + 0,0,114,72,0,0,0,22,3,0,0,115,14,0,0,0, + 0,2,9,1,9,1,9,1,9,1,21,3,9,1,122,19, + 77,111,100,117,108,101,83,112,101,99,46,95,95,105,110,105, + 116,95,95,99,1,0,0,0,0,0,0,0,2,0,0,0, + 4,0,0,0,67,0,0,0,115,153,0,0,0,100,1,0, + 106,0,0,124,0,0,106,1,0,131,1,0,100,2,0,106, + 0,0,124,0,0,106,2,0,131,1,0,103,2,0,125,1, + 0,124,0,0,106,3,0,100,0,0,107,9,0,114,79,0, + 124,1,0,106,4,0,100,3,0,106,0,0,124,0,0,106, + 3,0,131,1,0,131,1,0,1,110,0,0,124,0,0,106, + 5,0,100,0,0,107,9,0,114,122,0,124,1,0,106,4, + 0,100,4,0,106,0,0,124,0,0,106,5,0,131,1,0, + 131,1,0,1,110,0,0,100,5,0,106,0,0,124,0,0, + 106,6,0,106,7,0,100,6,0,106,8,0,124,1,0,131, + 1,0,131,2,0,83,41,7,78,122,9,110,97,109,101,61, + 123,33,114,125,122,11,108,111,97,100,101,114,61,123,33,114, + 125,122,11,111,114,105,103,105,110,61,123,33,114,125,122,29, + 115,117,98,109,111,100,117,108,101,95,115,101,97,114,99,104, + 95,108,111,99,97,116,105,111,110,115,61,123,125,122,6,123, + 125,40,123,125,41,122,2,44,32,41,9,114,47,0,0,0, + 114,67,0,0,0,114,170,0,0,0,114,218,0,0,0,218, + 6,97,112,112,101,110,100,114,221,0,0,0,218,9,95,95, + 99,108,97,115,115,95,95,114,57,0,0,0,114,26,0,0, + 0,41,2,114,71,0,0,0,114,80,0,0,0,114,4,0, + 0,0,114,4,0,0,0,114,5,0,0,0,114,101,0,0, + 0,34,3,0,0,115,16,0,0,0,0,1,15,1,21,1, + 15,1,28,1,15,1,12,1,16,1,122,19,77,111,100,117, + 108,101,83,112,101,99,46,95,95,114,101,112,114,95,95,99, + 2,0,0,0,0,0,0,0,3,0,0,0,11,0,0,0, + 67,0,0,0,115,145,0,0,0,124,0,0,106,0,0,125, + 2,0,121,107,0,124,0,0,106,1,0,124,1,0,106,1, + 0,107,2,0,111,114,0,124,0,0,106,2,0,124,1,0, + 106,2,0,107,2,0,111,114,0,124,0,0,106,3,0,124, + 1,0,106,3,0,107,2,0,111,114,0,124,2,0,124,1, + 0,106,0,0,107,2,0,111,114,0,124,0,0,106,4,0, + 124,1,0,106,4,0,107,2,0,111,114,0,124,0,0,106, + 5,0,124,1,0,106,5,0,107,2,0,83,87,110,22,0, + 4,116,6,0,107,10,0,114,140,0,1,1,1,100,1,0, + 83,89,110,1,0,88,100,0,0,83,41,2,78,70,41,7, + 114,221,0,0,0,114,67,0,0,0,114,170,0,0,0,114, + 218,0,0,0,218,6,99,97,99,104,101,100,218,12,104,97, + 115,95,108,111,99,97,116,105,111,110,114,210,0,0,0,41, + 3,114,71,0,0,0,218,5,111,116,104,101,114,218,4,115, + 109,115,108,114,4,0,0,0,114,4,0,0,0,114,5,0, + 0,0,218,6,95,95,101,113,95,95,44,3,0,0,115,20, + 0,0,0,0,1,9,1,3,1,18,1,18,1,18,1,15, + 1,18,1,20,1,13,1,122,17,77,111,100,117,108,101,83, + 112,101,99,46,95,95,101,113,95,95,99,1,0,0,0,0, + 0,0,0,2,0,0,0,11,0,0,0,67,0,0,0,115, + 158,0,0,0,124,0,0,106,0,0,100,0,0,107,8,0, + 114,151,0,124,0,0,106,1,0,100,0,0,107,9,0,114, + 151,0,124,0,0,106,2,0,114,151,0,124,0,0,106,1, + 0,125,1,0,124,1,0,106,3,0,116,4,0,116,5,0, + 131,1,0,131,1,0,114,112,0,121,19,0,116,6,0,124, + 1,0,131,1,0,124,0,0,95,0,0,87,113,145,0,4, + 116,7,0,107,10,0,114,108,0,1,1,1,89,113,145,0, + 88,113,148,0,124,1,0,106,3,0,116,4,0,116,8,0, + 131,1,0,131,1,0,114,148,0,124,1,0,124,0,0,95, + 0,0,113,148,0,113,151,0,110,0,0,124,0,0,106,0, + 0,83,41,1,78,41,9,114,223,0,0,0,114,218,0,0, + 0,114,222,0,0,0,218,8,101,110,100,115,119,105,116,104, + 218,5,116,117,112,108,101,114,135,0,0,0,114,132,0,0, + 0,114,123,0,0,0,218,17,66,89,84,69,67,79,68,69, + 95,83,85,70,70,73,88,69,83,41,2,114,71,0,0,0, + 114,131,0,0,0,114,4,0,0,0,114,4,0,0,0,114, + 5,0,0,0,114,226,0,0,0,56,3,0,0,115,22,0, + 0,0,0,2,15,1,24,1,9,1,21,1,3,1,19,1, + 13,1,8,1,21,1,18,1,122,17,77,111,100,117,108,101, + 83,112,101,99,46,99,97,99,104,101,100,99,2,0,0,0, + 0,0,0,0,2,0,0,0,2,0,0,0,67,0,0,0, + 115,13,0,0,0,124,1,0,124,0,0,95,0,0,100,0, + 0,83,41,1,78,41,1,114,223,0,0,0,41,2,114,71, + 0,0,0,114,226,0,0,0,114,4,0,0,0,114,4,0, + 0,0,114,5,0,0,0,114,226,0,0,0,70,3,0,0, + 115,2,0,0,0,0,2,99,1,0,0,0,0,0,0,0, + 1,0,0,0,2,0,0,0,67,0,0,0,115,46,0,0, + 0,124,0,0,106,0,0,100,1,0,107,8,0,114,35,0, + 124,0,0,106,1,0,106,2,0,100,2,0,131,1,0,100, + 3,0,25,83,124,0,0,106,1,0,83,100,1,0,83,41, + 4,122,32,84,104,101,32,110,97,109,101,32,111,102,32,116, + 104,101,32,109,111,100,117,108,101,39,115,32,112,97,114,101, + 110,116,46,78,114,116,0,0,0,114,84,0,0,0,41,3, + 114,221,0,0,0,114,67,0,0,0,114,32,0,0,0,41, + 1,114,71,0,0,0,114,4,0,0,0,114,4,0,0,0, + 114,5,0,0,0,218,6,112,97,114,101,110,116,74,3,0, + 0,115,6,0,0,0,0,3,15,1,20,2,122,17,77,111, + 100,117,108,101,83,112,101,99,46,112,97,114,101,110,116,99, + 1,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0, + 67,0,0,0,115,7,0,0,0,124,0,0,106,0,0,83, + 41,1,78,41,1,114,222,0,0,0,41,1,114,71,0,0, + 0,114,4,0,0,0,114,4,0,0,0,114,5,0,0,0, + 114,227,0,0,0,82,3,0,0,115,2,0,0,0,0,2, + 122,23,77,111,100,117,108,101,83,112,101,99,46,104,97,115, + 95,108,111,99,97,116,105,111,110,99,2,0,0,0,0,0, + 0,0,2,0,0,0,2,0,0,0,67,0,0,0,115,19, + 0,0,0,116,0,0,124,1,0,131,1,0,124,0,0,95, + 1,0,100,0,0,83,41,1,78,41,2,218,4,98,111,111, + 108,114,222,0,0,0,41,2,114,71,0,0,0,218,5,118, + 97,108,117,101,114,4,0,0,0,114,4,0,0,0,114,5, + 0,0,0,114,227,0,0,0,86,3,0,0,115,2,0,0, + 0,0,2,41,12,114,57,0,0,0,114,56,0,0,0,114, + 58,0,0,0,114,59,0,0,0,114,72,0,0,0,114,101, + 0,0,0,114,230,0,0,0,218,8,112,114,111,112,101,114, + 116,121,114,226,0,0,0,218,6,115,101,116,116,101,114,114, + 234,0,0,0,114,227,0,0,0,114,4,0,0,0,114,4, + 0,0,0,114,4,0,0,0,114,5,0,0,0,114,217,0, + 0,0,241,2,0,0,115,20,0,0,0,12,35,6,2,15, + 1,15,11,12,10,12,12,18,14,21,4,18,8,18,4,114, + 217,0,0,0,114,218,0,0,0,114,220,0,0,0,99,2, + 0,0,0,2,0,0,0,5,0,0,0,15,0,0,0,67, + 0,0,0,115,193,0,0,0,116,0,0,124,1,0,100,1, + 0,131,2,0,114,83,0,124,3,0,100,2,0,107,8,0, + 114,43,0,116,1,0,124,0,0,100,3,0,124,1,0,131, + 1,1,83,124,3,0,114,55,0,103,0,0,110,3,0,100, + 2,0,125,4,0,116,1,0,124,0,0,100,3,0,124,1, + 0,100,4,0,124,4,0,131,1,2,83,124,3,0,100,2, + 0,107,8,0,114,168,0,116,0,0,124,1,0,100,5,0, + 131,2,0,114,159,0,121,19,0,124,1,0,106,2,0,124, + 0,0,131,1,0,125,3,0,87,113,165,0,4,116,3,0, + 107,10,0,114,155,0,1,1,1,100,2,0,125,3,0,89, + 113,165,0,88,113,168,0,100,6,0,125,3,0,110,0,0, + 116,4,0,124,0,0,124,1,0,100,7,0,124,2,0,100, + 5,0,124,3,0,131,2,2,83,41,8,122,53,82,101,116, + 117,114,110,32,97,32,109,111,100,117,108,101,32,115,112,101, + 99,32,98,97,115,101,100,32,111,110,32,118,97,114,105,111, + 117,115,32,108,111,97,100,101,114,32,109,101,116,104,111,100, + 115,46,218,12,103,101,116,95,102,105,108,101,110,97,109,101, + 78,114,170,0,0,0,114,221,0,0,0,114,220,0,0,0, + 70,114,218,0,0,0,41,5,114,60,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,114,220,0,0,0,114,154,0,0,0, + 114,217,0,0,0,41,5,114,67,0,0,0,114,170,0,0, + 0,114,218,0,0,0,114,220,0,0,0,90,6,115,101,97, + 114,99,104,114,4,0,0,0,114,4,0,0,0,114,5,0, + 0,0,114,174,0,0,0,91,3,0,0,115,28,0,0,0, + 0,2,15,1,12,1,16,1,18,1,15,1,7,2,12,1, + 15,1,3,1,19,1,13,1,14,3,9,2,114,174,0,0, + 0,114,170,0,0,0,114,221,0,0,0,99,2,0,0,0, + 2,0,0,0,9,0,0,0,19,0,0,0,67,0,0,0, + 115,110,1,0,0,124,1,0,100,1,0,107,8,0,114,79, + 0,100,2,0,125,1,0,116,0,0,124,2,0,100,3,0, + 131,2,0,114,79,0,121,19,0,124,2,0,106,1,0,124, + 0,0,131,1,0,125,1,0,87,113,76,0,4,116,2,0, + 107,10,0,114,72,0,1,1,1,89,113,76,0,88,113,79, + 0,110,0,0,116,3,0,124,0,0,124,2,0,100,4,0, + 124,1,0,131,2,1,125,4,0,100,5,0,124,4,0,95, + 4,0,124,2,0,100,1,0,107,8,0,114,203,0,120,79, + 0,116,5,0,131,0,0,68,93,61,0,92,2,0,125,5, + 0,125,6,0,124,1,0,106,6,0,116,7,0,124,6,0, + 131,1,0,131,1,0,114,131,0,124,5,0,124,0,0,124, + 1,0,131,2,0,125,2,0,124,2,0,124,4,0,95,8, + 0,80,113,131,0,113,131,0,87,100,1,0,83,110,0,0, + 124,3,0,116,9,0,107,8,0,114,38,1,116,0,0,124, + 2,0,100,6,0,131,2,0,114,47,1,121,19,0,124,2, + 0,106,10,0,124,0,0,131,1,0,125,7,0,87,110,18, + 0,4,116,2,0,107,10,0,114,13,1,1,1,1,89,113, + 35,1,88,124,7,0,114,35,1,103,0,0,124,4,0,95, + 11,0,113,35,1,113,47,1,110,9,0,124,3,0,124,4, + 0,95,11,0,124,4,0,106,11,0,103,0,0,107,2,0, + 114,106,1,124,1,0,114,106,1,116,12,0,124,1,0,131, + 1,0,100,7,0,25,125,8,0,124,4,0,106,11,0,106, + 13,0,124,8,0,131,1,0,1,113,106,1,110,0,0,124, + 4,0,83,41,8,97,61,1,0,0,82,101,116,117,114,110, + 32,97,32,109,111,100,117,108,101,32,115,112,101,99,32,98, + 97,115,101,100,32,111,110,32,97,32,102,105,108,101,32,108, + 111,99,97,116,105,111,110,46,10,10,32,32,32,32,84,111, + 32,105,110,100,105,99,97,116,101,32,116,104,97,116,32,116, + 104,101,32,109,111,100,117,108,101,32,105,115,32,97,32,112, + 97,99,107,97,103,101,44,32,115,101,116,10,32,32,32,32, + 115,117,98,109,111,100,117,108,101,95,115,101,97,114,99,104, + 95,108,111,99,97,116,105,111,110,115,32,116,111,32,97,32, + 108,105,115,116,32,111,102,32,100,105,114,101,99,116,111,114, + 121,32,112,97,116,104,115,46,32,32,65,110,10,32,32,32, + 32,101,109,112,116,121,32,108,105,115,116,32,105,115,32,115, + 117,102,102,105,99,105,101,110,116,44,32,116,104,111,117,103, + 104,32,105,116,115,32,110,111,116,32,111,116,104,101,114,119, + 105,115,101,32,117,115,101,102,117,108,32,116,111,32,116,104, + 101,10,32,32,32,32,105,109,112,111,114,116,32,115,121,115, + 116,101,109,46,10,10,32,32,32,32,84,104,101,32,108,111, + 97,100,101,114,32,109,117,115,116,32,116,97,107,101,32,97, + 32,115,112,101,99,32,97,115,32,105,116,115,32,111,110,108, + 121,32,95,95,105,110,105,116,95,95,40,41,32,97,114,103, + 46,10,10,32,32,32,32,78,122,9,60,117,110,107,110,111, + 119,110,62,114,239,0,0,0,114,218,0,0,0,84,114,220, + 0,0,0,114,84,0,0,0,41,14,114,60,0,0,0,114, + 239,0,0,0,114,154,0,0,0,114,217,0,0,0,114,222, + 0,0,0,218,27,95,103,101,116,95,115,117,112,112,111,114, + 116,101,100,95,102,105,108,101,95,108,111,97,100,101,114,115, + 114,231,0,0,0,114,232,0,0,0,114,170,0,0,0,218, + 9,95,80,79,80,85,76,65,84,69,114,220,0,0,0,114, + 221,0,0,0,114,38,0,0,0,114,224,0,0,0,41,9, + 114,67,0,0,0,218,8,108,111,99,97,116,105,111,110,114, + 170,0,0,0,114,221,0,0,0,114,178,0,0,0,218,12, + 108,111,97,100,101,114,95,99,108,97,115,115,114,126,0,0, + 0,114,220,0,0,0,90,7,100,105,114,110,97,109,101,114, + 4,0,0,0,114,4,0,0,0,114,5,0,0,0,114,240, + 0,0,0,116,3,0,0,115,60,0,0,0,0,12,12,4, + 6,1,15,2,3,1,19,1,13,1,11,8,21,1,9,3, + 12,1,22,1,21,1,15,1,9,1,8,2,7,3,12,2, + 15,1,3,1,19,1,13,1,5,2,6,1,18,2,9,1, + 15,1,6,1,16,1,22,2,114,240,0,0,0,99,3,0, + 0,0,0,0,0,0,8,0,0,0,53,0,0,0,67,0, + 0,0,115,124,1,0,0,121,13,0,124,0,0,106,0,0, + 125,3,0,87,110,18,0,4,116,1,0,107,10,0,114,33, + 0,1,1,1,89,110,17,0,88,124,3,0,100,0,0,107, + 9,0,114,50,0,124,3,0,83,124,0,0,106,2,0,125, + 4,0,124,1,0,100,0,0,107,8,0,114,108,0,121,13, + 0,124,0,0,106,3,0,125,1,0,87,113,108,0,4,116, + 1,0,107,10,0,114,104,0,1,1,1,89,113,108,0,88, + 110,0,0,121,13,0,124,0,0,106,4,0,125,5,0,87, + 110,24,0,4,116,1,0,107,10,0,114,147,0,1,1,1, + 100,0,0,125,5,0,89,110,1,0,88,124,2,0,100,0, + 0,107,8,0,114,224,0,124,5,0,100,0,0,107,8,0, + 114,215,0,121,13,0,124,1,0,106,5,0,125,2,0,87, + 113,221,0,4,116,1,0,107,10,0,114,211,0,1,1,1, + 100,0,0,125,2,0,89,113,221,0,88,113,224,0,124,5, + 0,125,2,0,110,0,0,121,13,0,124,0,0,106,6,0, + 125,6,0,87,110,24,0,4,116,1,0,107,10,0,114,7, + 1,1,1,1,100,0,0,125,6,0,89,110,1,0,88,121, + 19,0,116,7,0,124,0,0,106,8,0,131,1,0,125,7, + 0,87,110,24,0,4,116,1,0,107,10,0,114,53,1,1, + 1,1,100,0,0,125,7,0,89,110,1,0,88,116,9,0, + 124,4,0,124,1,0,100,1,0,124,2,0,131,2,1,125, + 3,0,124,5,0,100,0,0,107,8,0,114,93,1,100,2, + 0,110,3,0,100,3,0,124,3,0,95,10,0,124,6,0, + 124,3,0,95,11,0,124,7,0,124,3,0,95,12,0,124, + 3,0,83,41,4,78,114,218,0,0,0,70,84,41,13,114, + 209,0,0,0,114,210,0,0,0,114,57,0,0,0,114,205, + 0,0,0,114,211,0,0,0,90,7,95,79,82,73,71,73, + 78,218,10,95,95,99,97,99,104,101,100,95,95,218,4,108, + 105,115,116,218,8,95,95,112,97,116,104,95,95,114,217,0, + 0,0,114,222,0,0,0,114,226,0,0,0,114,221,0,0, + 0,41,8,114,180,0,0,0,114,170,0,0,0,114,218,0, + 0,0,114,178,0,0,0,114,67,0,0,0,114,243,0,0, + 0,114,226,0,0,0,114,221,0,0,0,114,4,0,0,0, + 114,4,0,0,0,114,5,0,0,0,218,17,95,115,112,101, + 99,95,102,114,111,109,95,109,111,100,117,108,101,180,3,0, + 0,115,72,0,0,0,0,2,3,1,13,1,13,1,5,2, + 12,1,4,2,9,1,12,1,3,1,13,1,13,2,8,1, + 3,1,13,1,13,1,11,1,12,1,12,1,3,1,13,1, + 13,1,14,2,9,1,3,1,13,1,13,1,11,1,3,1, + 19,1,13,1,11,2,21,1,27,1,9,1,9,1,114,248, + 0,0,0,99,0,0,0,0,0,0,0,0,0,0,0,0, + 6,0,0,0,64,0,0,0,115,142,0,0,0,101,0,0, + 90,1,0,100,0,0,90,2,0,100,1,0,90,3,0,100, + 2,0,100,3,0,132,0,0,90,4,0,100,4,0,100,5, + 0,132,0,0,90,5,0,100,6,0,100,7,0,100,8,0, + 100,9,0,100,10,0,100,11,0,132,0,2,90,6,0,100, + 12,0,100,13,0,132,0,0,90,7,0,100,14,0,100,15, + 0,132,0,0,90,8,0,100,16,0,100,17,0,132,0,0, + 90,9,0,100,18,0,100,19,0,132,0,0,90,10,0,100, + 20,0,100,21,0,132,0,0,90,11,0,100,22,0,100,23, + 0,132,0,0,90,12,0,100,24,0,83,41,25,114,175,0, + 0,0,122,77,67,111,110,118,101,110,105,101,110,99,101,32, + 119,114,97,112,112,101,114,32,97,114,111,117,110,100,32,115, + 112,101,99,32,111,98,106,101,99,116,115,32,116,111,32,112, + 114,111,118,105,100,101,32,115,112,101,99,45,115,112,101,99, + 105,102,105,99,10,32,32,32,32,109,101,116,104,111,100,115, + 46,99,2,0,0,0,0,0,0,0,2,0,0,0,2,0, + 0,0,67,0,0,0,115,13,0,0,0,124,1,0,124,0, + 0,95,0,0,100,0,0,83,41,1,78,41,1,114,178,0, + 0,0,41,2,114,71,0,0,0,114,178,0,0,0,114,4, + 0,0,0,114,4,0,0,0,114,5,0,0,0,114,72,0, + 0,0,232,3,0,0,115,2,0,0,0,0,1,122,21,95, + 83,112,101,99,77,101,116,104,111,100,115,46,95,95,105,110, + 105,116,95,95,99,1,0,0,0,0,0,0,0,3,0,0, + 0,3,0,0,0,67,0,0,0,115,158,0,0,0,124,0, + 0,106,0,0,125,1,0,124,1,0,106,1,0,100,1,0, + 107,8,0,114,30,0,100,2,0,110,6,0,124,1,0,106, + 1,0,125,2,0,124,1,0,106,2,0,100,1,0,107,8, + 0,114,104,0,124,1,0,106,3,0,100,1,0,107,8,0, + 114,82,0,100,3,0,106,4,0,124,2,0,131,1,0,83, + 100,4,0,106,4,0,124,2,0,124,1,0,106,3,0,131, + 2,0,83,110,50,0,124,1,0,106,5,0,114,132,0,100, + 5,0,106,4,0,124,2,0,124,1,0,106,2,0,131,2, + 0,83,100,6,0,106,4,0,124,1,0,106,1,0,124,1, + 0,106,2,0,131,2,0,83,100,1,0,83,41,7,122,38, + 82,101,116,117,114,110,32,116,104,101,32,114,101,112,114,32, + 116,111,32,117,115,101,32,102,111,114,32,116,104,101,32,109, + 111,100,117,108,101,46,78,114,207,0,0,0,122,13,60,109, + 111,100,117,108,101,32,123,33,114,125,62,122,20,60,109,111, + 100,117,108,101,32,123,33,114,125,32,40,123,33,114,125,41, + 62,122,23,60,109,111,100,117,108,101,32,123,33,114,125,32, + 102,114,111,109,32,123,33,114,125,62,122,18,60,109,111,100, + 117,108,101,32,123,33,114,125,32,40,123,125,41,62,41,6, + 114,178,0,0,0,114,67,0,0,0,114,218,0,0,0,114, + 170,0,0,0,114,47,0,0,0,114,227,0,0,0,41,3, + 114,71,0,0,0,114,178,0,0,0,114,67,0,0,0,114, + 4,0,0,0,114,4,0,0,0,114,5,0,0,0,114,206, + 0,0,0,235,3,0,0,115,18,0,0,0,0,3,9,1, + 30,1,15,1,15,1,13,2,22,2,9,1,19,2,122,24, + 95,83,112,101,99,77,101,116,104,111,100,115,46,109,111,100, + 117,108,101,95,114,101,112,114,218,9,95,111,118,101,114,114, + 105,100,101,70,218,11,95,102,111,114,99,101,95,110,97,109, + 101,84,99,2,0,0,0,2,0,0,0,6,0,0,0,59, + 0,0,0,67,0,0,0,115,75,2,0,0,124,0,0,106, + 0,0,125,4,0,124,2,0,115,45,0,124,3,0,115,45, + 0,116,1,0,124,1,0,100,1,0,100,2,0,131,3,0, + 100,2,0,107,8,0,114,85,0,121,16,0,124,4,0,106, + 2,0,124,1,0,95,3,0,87,113,85,0,4,116,4,0, + 107,10,0,114,81,0,1,1,1,89,113,85,0,88,110,0, + 0,124,2,0,115,115,0,116,1,0,124,1,0,100,3,0, + 100,2,0,131,3,0,100,2,0,107,8,0,114,221,0,124, + 4,0,106,5,0,125,5,0,124,5,0,100,2,0,107,8, + 0,114,184,0,124,4,0,106,6,0,100,2,0,107,9,0, + 114,184,0,116,7,0,106,8,0,116,7,0,131,1,0,125, + 5,0,124,4,0,106,6,0,124,5,0,95,9,0,113,184, + 0,110,0,0,121,13,0,124,5,0,124,1,0,95,10,0, + 87,113,221,0,4,116,4,0,107,10,0,114,217,0,1,1, + 1,89,113,221,0,88,110,0,0,124,2,0,115,251,0,116, + 1,0,124,1,0,100,4,0,100,2,0,131,3,0,100,2, + 0,107,8,0,114,35,1,121,16,0,124,4,0,106,11,0, + 124,1,0,95,12,0,87,113,35,1,4,116,4,0,107,10, + 0,114,31,1,1,1,1,89,113,35,1,88,110,0,0,121, + 13,0,124,4,0,124,1,0,95,13,0,87,110,18,0,4, + 116,4,0,107,10,0,114,68,1,1,1,1,89,110,1,0, + 88,124,2,0,115,99,1,116,1,0,124,1,0,100,5,0, + 100,2,0,131,3,0,100,2,0,107,8,0,114,157,1,124, + 4,0,106,6,0,100,2,0,107,9,0,114,157,1,121,16, + 0,124,4,0,106,6,0,124,1,0,95,14,0,87,113,154, + 1,4,116,4,0,107,10,0,114,150,1,1,1,1,89,113, + 154,1,88,113,157,1,110,0,0,124,4,0,106,15,0,114, + 71,2,124,2,0,115,196,1,116,1,0,124,1,0,100,6, + 0,100,2,0,131,3,0,100,2,0,107,8,0,114,236,1, + 121,16,0,124,4,0,106,16,0,124,1,0,95,17,0,87, + 113,236,1,4,116,4,0,107,10,0,114,232,1,1,1,1, + 89,113,236,1,88,110,0,0,124,2,0,115,10,2,116,1, + 0,124,1,0,100,7,0,100,2,0,131,3,0,100,2,0, + 107,8,0,114,71,2,124,4,0,106,18,0,100,2,0,107, + 9,0,114,68,2,121,16,0,124,4,0,106,18,0,124,1, + 0,95,19,0,87,113,65,2,4,116,4,0,107,10,0,114, + 61,2,1,1,1,89,113,65,2,88,113,68,2,113,71,2, + 110,0,0,100,2,0,83,41,8,97,29,2,0,0,83,101, + 116,32,116,104,101,32,109,111,100,117,108,101,39,115,32,97, + 116,116,114,105,98,117,116,101,115,46,10,10,32,32,32,32, + 32,32,32,32,65,108,108,32,109,105,115,115,105,110,103,32, + 105,109,112,111,114,116,45,114,101,108,97,116,101,100,32,109, + 111,100,117,108,101,32,97,116,116,114,105,98,117,116,101,115, + 32,119,105,108,108,32,98,101,32,115,101,116,46,32,32,72, + 101,114,101,10,32,32,32,32,32,32,32,32,105,115,32,104, + 111,119,32,116,104,101,32,115,112,101,99,32,97,116,116,114, + 105,98,117,116,101,115,32,109,97,112,32,111,110,116,111,32, + 116,104,101,32,109,111,100,117,108,101,58,10,10,32,32,32, + 32,32,32,32,32,115,112,101,99,46,110,97,109,101,32,45, + 62,32,109,111,100,117,108,101,46,95,95,110,97,109,101,95, + 95,10,32,32,32,32,32,32,32,32,115,112,101,99,46,108, + 111,97,100,101,114,32,45,62,32,109,111,100,117,108,101,46, + 95,95,108,111,97,100,101,114,95,95,10,32,32,32,32,32, + 32,32,32,115,112,101,99,46,112,97,114,101,110,116,32,45, + 62,32,109,111,100,117,108,101,46,95,95,112,97,99,107,97, + 103,101,95,95,10,32,32,32,32,32,32,32,32,115,112,101, + 99,32,45,62,32,109,111,100,117,108,101,46,95,95,115,112, + 101,99,95,95,10,10,32,32,32,32,32,32,32,32,79,112, + 116,105,111,110,97,108,58,10,32,32,32,32,32,32,32,32, + 115,112,101,99,46,111,114,105,103,105,110,32,45,62,32,109, + 111,100,117,108,101,46,95,95,102,105,108,101,95,95,32,40, + 105,102,32,115,112,101,99,46,115,101,116,95,102,105,108,101, + 97,116,116,114,32,105,115,32,116,114,117,101,41,10,32,32, + 32,32,32,32,32,32,115,112,101,99,46,99,97,99,104,101, + 100,32,45,62,32,109,111,100,117,108,101,46,95,95,99,97, + 99,104,101,100,95,95,32,40,105,102,32,95,95,102,105,108, + 101,95,95,32,97,108,115,111,32,115,101,116,41,10,32,32, + 32,32,32,32,32,32,115,112,101,99,46,115,117,98,109,111, + 100,117,108,101,95,115,101,97,114,99,104,95,108,111,99,97, + 116,105,111,110,115,32,45,62,32,109,111,100,117,108,101,46, + 95,95,112,97,116,104,95,95,32,40,105,102,32,115,101,116, + 41,10,10,32,32,32,32,32,32,32,32,114,57,0,0,0, + 78,114,205,0,0,0,218,11,95,95,112,97,99,107,97,103, + 101,95,95,114,247,0,0,0,114,211,0,0,0,114,245,0, + 0,0,41,20,114,178,0,0,0,114,62,0,0,0,114,67, + 0,0,0,114,57,0,0,0,114,210,0,0,0,114,170,0, + 0,0,114,221,0,0,0,218,16,95,78,97,109,101,115,112, + 97,99,101,76,111,97,100,101,114,218,7,95,95,110,101,119, + 95,95,218,5,95,112,97,116,104,114,205,0,0,0,114,234, + 0,0,0,114,251,0,0,0,114,209,0,0,0,114,247,0, + 0,0,114,227,0,0,0,114,218,0,0,0,114,211,0,0, + 0,114,226,0,0,0,114,245,0,0,0,41,6,114,71,0, + 0,0,114,180,0,0,0,114,249,0,0,0,114,250,0,0, + 0,114,178,0,0,0,114,170,0,0,0,114,4,0,0,0, + 114,4,0,0,0,114,5,0,0,0,218,17,105,110,105,116, + 95,109,111,100,117,108,101,95,97,116,116,114,115,251,3,0, + 0,115,88,0,0,0,0,17,9,6,12,1,24,1,3,1, + 16,1,13,1,8,3,30,1,9,1,12,2,15,1,15,1, + 18,1,3,1,13,1,13,1,8,3,30,1,3,1,16,1, + 13,1,8,3,3,1,13,1,13,1,5,3,30,1,15,1, + 3,1,16,1,13,1,11,2,9,2,30,1,3,1,16,1, + 13,1,8,3,30,1,15,1,3,1,16,1,13,1,122,30, + 95,83,112,101,99,77,101,116,104,111,100,115,46,105,110,105, + 116,95,109,111,100,117,108,101,95,97,116,116,114,115,99,1, + 0,0,0,0,0,0,0,3,0,0,0,3,0,0,0,67, + 0,0,0,115,101,0,0,0,124,0,0,106,0,0,125,1, + 0,116,1,0,124,1,0,106,2,0,100,1,0,131,2,0, + 114,48,0,124,1,0,106,2,0,106,3,0,124,1,0,131, + 1,0,125,2,0,110,6,0,100,2,0,125,2,0,124,2, + 0,100,2,0,107,8,0,114,84,0,116,4,0,124,1,0, + 106,5,0,131,1,0,125,2,0,110,0,0,124,0,0,106, + 6,0,124,2,0,131,1,0,1,124,2,0,83,41,3,122, + 153,82,101,116,117,114,110,32,97,32,110,101,119,32,109,111, + 100,117,108,101,32,116,111,32,98,101,32,108,111,97,100,101, + 100,46,10,10,32,32,32,32,32,32,32,32,84,104,101,32, + 105,109,112,111,114,116,45,114,101,108,97,116,101,100,32,109, + 111,100,117,108,101,32,97,116,116,114,105,98,117,116,101,115, + 32,97,114,101,32,97,108,115,111,32,115,101,116,32,119,105, + 116,104,32,116,104,101,10,32,32,32,32,32,32,32,32,97, + 112,112,114,111,112,114,105,97,116,101,32,118,97,108,117,101, + 115,32,102,114,111,109,32,116,104,101,32,115,112,101,99,46, + 10,10,32,32,32,32,32,32,32,32,218,13,99,114,101,97, + 116,101,95,109,111,100,117,108,101,78,41,7,114,178,0,0, + 0,114,60,0,0,0,114,170,0,0,0,114,0,1,0,0, + 114,68,0,0,0,114,67,0,0,0,114,255,0,0,0,41, + 3,114,71,0,0,0,114,178,0,0,0,114,180,0,0,0, + 114,4,0,0,0,114,4,0,0,0,114,5,0,0,0,218, + 6,99,114,101,97,116,101,75,4,0,0,115,16,0,0,0, + 0,7,9,2,18,3,21,2,6,1,12,4,18,1,13,1, + 122,19,95,83,112,101,99,77,101,116,104,111,100,115,46,99, + 114,101,97,116,101,99,2,0,0,0,0,0,0,0,2,0, + 0,0,2,0,0,0,67,0,0,0,115,23,0,0,0,124, + 0,0,106,0,0,106,1,0,106,2,0,124,1,0,131,1, + 0,1,100,1,0,83,41,2,122,189,68,111,32,101,118,101, + 114,121,116,104,105,110,103,32,110,101,99,101,115,115,97,114, + 121,32,116,111,32,101,120,101,99,117,116,101,32,116,104,101, + 32,109,111,100,117,108,101,46,10,10,32,32,32,32,32,32, + 32,32,84,104,101,32,110,97,109,101,115,112,97,99,101,32, + 111,102,32,96,109,111,100,117,108,101,96,32,105,115,32,117, + 115,101,100,32,97,115,32,116,104,101,32,116,97,114,103,101, + 116,32,111,102,32,101,120,101,99,117,116,105,111,110,46,10, + 32,32,32,32,32,32,32,32,84,104,105,115,32,109,101,116, + 104,111,100,32,117,115,101,115,32,116,104,101,32,108,111,97, + 100,101,114,39,115,32,96,101,120,101,99,95,109,111,100,117, + 108,101,40,41,96,32,109,101,116,104,111,100,46,10,10,32, + 32,32,32,32,32,32,32,78,41,3,114,178,0,0,0,114, + 170,0,0,0,218,11,101,120,101,99,95,109,111,100,117,108, + 101,41,2,114,71,0,0,0,114,180,0,0,0,114,4,0, + 0,0,114,4,0,0,0,114,5,0,0,0,218,5,95,101, + 120,101,99,98,4,0,0,115,2,0,0,0,0,7,122,18, + 95,83,112,101,99,77,101,116,104,111,100,115,46,95,101,120, + 101,99,99,2,0,0,0,0,0,0,0,4,0,0,0,11, + 0,0,0,67,0,0,0,115,17,1,0,0,124,0,0,106, + 0,0,106,1,0,125,2,0,116,2,0,106,3,0,131,0, + 0,1,116,4,0,124,2,0,131,1,0,143,226,0,1,116, + 5,0,106,6,0,106,7,0,124,2,0,131,1,0,124,1, + 0,107,9,0,114,95,0,100,1,0,106,8,0,124,2,0, + 131,1,0,125,3,0,116,9,0,124,3,0,100,2,0,124, + 2,0,131,1,1,130,1,0,110,0,0,124,0,0,106,0, + 0,106,10,0,100,3,0,107,8,0,114,181,0,124,0,0, + 106,0,0,106,11,0,100,3,0,107,8,0,114,158,0,116, + 9,0,100,4,0,100,2,0,124,0,0,106,0,0,106,1, + 0,131,1,1,130,1,0,110,0,0,124,0,0,106,12,0, + 124,1,0,100,5,0,100,6,0,131,1,1,1,124,1,0, + 83,124,0,0,106,12,0,124,1,0,100,5,0,100,6,0, + 131,1,1,1,116,13,0,124,0,0,106,0,0,106,10,0, + 100,7,0,131,2,0,115,243,0,124,0,0,106,0,0,106, + 10,0,106,14,0,124,2,0,131,1,0,1,110,13,0,124, + 0,0,106,15,0,124,1,0,131,1,0,1,87,100,3,0, + 81,88,116,5,0,106,6,0,124,2,0,25,83,41,8,122, + 51,69,120,101,99,117,116,101,32,116,104,101,32,115,112,101, + 99,32,105,110,32,97,110,32,101,120,105,115,116,105,110,103, + 32,109,111,100,117,108,101,39,115,32,110,97,109,101,115,112, + 97,99,101,46,122,30,109,111,100,117,108,101,32,123,33,114, + 125,32,110,111,116,32,105,110,32,115,121,115,46,109,111,100, + 117,108,101,115,114,67,0,0,0,78,122,14,109,105,115,115, + 105,110,103,32,108,111,97,100,101,114,114,249,0,0,0,84, + 114,2,1,0,0,41,16,114,178,0,0,0,114,67,0,0, + 0,114,106,0,0,0,218,12,97,99,113,117,105,114,101,95, + 108,111,99,107,114,103,0,0,0,114,7,0,0,0,114,73, + 0,0,0,114,93,0,0,0,114,47,0,0,0,114,154,0, + 0,0,114,170,0,0,0,114,221,0,0,0,114,255,0,0, + 0,114,60,0,0,0,218,11,108,111,97,100,95,109,111,100, + 117,108,101,114,3,1,0,0,41,4,114,71,0,0,0,114, + 180,0,0,0,114,67,0,0,0,114,172,0,0,0,114,4, + 0,0,0,114,4,0,0,0,114,5,0,0,0,114,176,0, + 0,0,108,4,0,0,115,32,0,0,0,0,2,12,1,10, + 1,13,1,24,1,15,1,21,1,18,1,18,1,27,2,19, + 1,4,1,19,1,21,4,22,2,19,1,122,17,95,83,112, + 101,99,77,101,116,104,111,100,115,46,101,120,101,99,99,1, + 0,0,0,0,0,0,0,3,0,0,0,27,0,0,0,67, + 0,0,0,115,24,1,0,0,124,0,0,106,0,0,125,1, + 0,124,1,0,106,1,0,106,2,0,124,1,0,106,3,0, + 131,1,0,1,116,4,0,106,5,0,124,1,0,106,3,0, + 25,125,2,0,116,6,0,124,2,0,100,1,0,100,0,0, + 131,3,0,100,0,0,107,8,0,114,108,0,121,16,0,124, + 1,0,106,1,0,124,2,0,95,7,0,87,113,108,0,4, + 116,8,0,107,10,0,114,104,0,1,1,1,89,113,108,0, + 88,110,0,0,116,6,0,124,2,0,100,2,0,100,0,0, + 131,3,0,100,0,0,107,8,0,114,215,0,121,59,0,124, + 2,0,106,9,0,124,2,0,95,10,0,116,11,0,124,2, + 0,100,3,0,131,2,0,115,190,0,124,1,0,106,3,0, + 106,12,0,100,4,0,131,1,0,100,5,0,25,124,2,0, + 95,10,0,110,0,0,87,113,215,0,4,116,8,0,107,10, + 0,114,211,0,1,1,1,89,113,215,0,88,110,0,0,116, + 6,0,124,2,0,100,6,0,100,0,0,131,3,0,100,0, + 0,107,8,0,114,20,1,121,13,0,124,1,0,124,2,0, + 95,13,0,87,113,20,1,4,116,8,0,107,10,0,114,16, + 1,1,1,1,89,113,20,1,88,110,0,0,124,2,0,83, + 41,7,78,114,205,0,0,0,114,251,0,0,0,114,247,0, + 0,0,114,116,0,0,0,114,84,0,0,0,114,209,0,0, + 0,41,14,114,178,0,0,0,114,170,0,0,0,114,5,1, + 0,0,114,67,0,0,0,114,7,0,0,0,114,73,0,0, + 0,114,62,0,0,0,114,205,0,0,0,114,210,0,0,0, + 114,57,0,0,0,114,251,0,0,0,114,60,0,0,0,114, + 32,0,0,0,114,209,0,0,0,41,3,114,71,0,0,0, + 114,178,0,0,0,114,180,0,0,0,114,4,0,0,0,114, + 4,0,0,0,114,5,0,0,0,218,25,95,108,111,97,100, + 95,98,97,99,107,119,97,114,100,95,99,111,109,112,97,116, + 105,98,108,101,132,4,0,0,115,42,0,0,0,0,4,9, + 1,19,2,16,1,24,1,3,1,16,1,13,1,8,1,24, + 1,3,4,12,1,15,1,32,1,13,1,8,1,24,1,3, + 1,13,1,13,1,8,1,122,38,95,83,112,101,99,77,101, + 116,104,111,100,115,46,95,108,111,97,100,95,98,97,99,107, + 119,97,114,100,95,99,111,109,112,97,116,105,98,108,101,99, + 1,0,0,0,0,0,0,0,2,0,0,0,11,0,0,0, + 67,0,0,0,115,179,0,0,0,124,0,0,106,0,0,106, + 1,0,100,0,0,107,9,0,114,52,0,116,2,0,124,0, + 0,106,0,0,106,1,0,100,1,0,131,2,0,115,52,0, + 124,0,0,106,3,0,131,0,0,83,110,0,0,124,0,0, + 106,4,0,131,0,0,125,1,0,116,5,0,124,1,0,131, + 1,0,143,84,0,1,124,0,0,106,0,0,106,1,0,100, + 0,0,107,8,0,114,143,0,124,0,0,106,0,0,106,6, + 0,100,0,0,107,8,0,114,156,0,116,7,0,100,2,0, + 100,3,0,124,0,0,106,0,0,106,8,0,131,1,1,130, + 1,0,113,156,0,110,13,0,124,0,0,106,9,0,124,1, + 0,131,1,0,1,87,100,0,0,81,88,116,10,0,106,11, + 0,124,0,0,106,0,0,106,8,0,25,83,41,4,78,114, + 2,1,0,0,122,14,109,105,115,115,105,110,103,32,108,111, + 97,100,101,114,114,67,0,0,0,41,12,114,178,0,0,0, + 114,170,0,0,0,114,60,0,0,0,114,6,1,0,0,114, + 1,1,0,0,114,213,0,0,0,114,221,0,0,0,114,154, + 0,0,0,114,67,0,0,0,114,3,1,0,0,114,7,0, + 0,0,114,73,0,0,0,41,2,114,71,0,0,0,114,180, + 0,0,0,114,4,0,0,0,114,4,0,0,0,114,5,0, + 0,0,218,14,95,108,111,97,100,95,117,110,108,111,99,107, + 101,100,162,4,0,0,115,20,0,0,0,0,2,18,2,21, + 1,13,2,12,1,13,1,18,1,18,1,30,3,19,5,122, + 27,95,83,112,101,99,77,101,116,104,111,100,115,46,95,108, + 111,97,100,95,117,110,108,111,99,107,101,100,99,1,0,0, + 0,0,0,0,0,1,0,0,0,8,0,0,0,67,0,0, + 0,115,49,0,0,0,116,0,0,106,1,0,131,0,0,1, + 116,2,0,124,0,0,106,3,0,106,4,0,131,1,0,143, + 15,0,1,124,0,0,106,5,0,131,0,0,83,87,100,1, + 0,81,88,100,1,0,83,41,2,122,207,82,101,116,117,114, + 110,32,97,32,110,101,119,32,109,111,100,117,108,101,32,111, + 98,106,101,99,116,44,32,108,111,97,100,101,100,32,98,121, + 32,116,104,101,32,115,112,101,99,39,115,32,108,111,97,100, + 101,114,46,10,10,32,32,32,32,32,32,32,32,84,104,101, + 32,109,111,100,117,108,101,32,105,115,32,110,111,116,32,97, + 100,100,101,100,32,116,111,32,105,116,115,32,112,97,114,101, + 110,116,46,10,10,32,32,32,32,32,32,32,32,73,102,32, + 97,32,109,111,100,117,108,101,32,105,115,32,97,108,114,101, + 97,100,121,32,105,110,32,115,121,115,46,109,111,100,117,108, + 101,115,44,32,116,104,97,116,32,101,120,105,115,116,105,110, + 103,32,109,111,100,117,108,101,32,103,101,116,115,10,32,32, + 32,32,32,32,32,32,99,108,111,98,98,101,114,101,100,46, + 10,10,32,32,32,32,32,32,32,32,78,41,6,114,106,0, + 0,0,114,4,1,0,0,114,103,0,0,0,114,178,0,0, + 0,114,67,0,0,0,114,7,1,0,0,41,1,114,71,0, + 0,0,114,4,0,0,0,114,4,0,0,0,114,5,0,0, + 0,114,177,0,0,0,185,4,0,0,115,6,0,0,0,0, + 9,10,1,19,1,122,17,95,83,112,101,99,77,101,116,104, + 111,100,115,46,108,111,97,100,78,41,13,114,57,0,0,0, + 114,56,0,0,0,114,58,0,0,0,114,59,0,0,0,114, + 72,0,0,0,114,206,0,0,0,114,255,0,0,0,114,1, + 1,0,0,114,3,1,0,0,114,176,0,0,0,114,6,1, + 0,0,114,7,1,0,0,114,177,0,0,0,114,4,0,0, + 0,114,4,0,0,0,114,4,0,0,0,114,5,0,0,0, + 114,175,0,0,0,225,3,0,0,115,20,0,0,0,12,3, + 6,4,12,3,12,16,24,80,12,23,12,10,12,24,12,30, + 12,23,114,175,0,0,0,99,4,0,0,0,0,0,0,0, + 6,0,0,0,11,0,0,0,67,0,0,0,115,201,0,0, + 0,124,0,0,106,0,0,100,1,0,131,1,0,125,4,0, + 124,0,0,106,0,0,100,2,0,131,1,0,125,5,0,124, + 4,0,115,102,0,124,5,0,114,54,0,124,5,0,106,1, + 0,125,4,0,113,102,0,124,2,0,124,3,0,107,2,0, + 114,84,0,116,2,0,124,1,0,124,2,0,131,2,0,125, + 4,0,113,102,0,116,3,0,124,1,0,124,2,0,131,2, + 0,125,4,0,110,0,0,124,5,0,115,132,0,116,4,0, + 124,1,0,124,2,0,100,3,0,124,4,0,131,2,1,125, + 5,0,110,0,0,121,44,0,124,5,0,124,0,0,100,2, + 0,60,124,4,0,124,0,0,100,1,0,60,124,2,0,124, + 0,0,100,4,0,60,124,3,0,124,0,0,100,5,0,60, + 87,110,18,0,4,116,5,0,107,10,0,114,196,0,1,1, + 1,89,110,1,0,88,100,0,0,83,41,6,78,114,205,0, + 0,0,114,209,0,0,0,114,170,0,0,0,114,211,0,0, + 0,114,245,0,0,0,41,6,114,93,0,0,0,114,170,0, + 0,0,218,20,83,111,117,114,99,101,108,101,115,115,70,105, + 108,101,76,111,97,100,101,114,218,16,83,111,117,114,99,101, + 70,105,108,101,76,111,97,100,101,114,114,240,0,0,0,114, + 208,0,0,0,41,6,90,2,110,115,114,67,0,0,0,90, + 8,112,97,116,104,110,97,109,101,90,9,99,112,97,116,104, + 110,97,109,101,114,170,0,0,0,114,178,0,0,0,114,4, + 0,0,0,114,4,0,0,0,114,5,0,0,0,218,14,95, + 102,105,120,95,117,112,95,109,111,100,117,108,101,199,4,0, + 0,115,34,0,0,0,0,2,15,1,15,1,6,1,6,1, + 12,1,12,1,18,2,18,1,6,1,24,1,3,1,10,1, + 10,1,10,1,14,1,13,2,114,10,1,0,0,99,0,0, + 0,0,0,0,0,0,0,0,0,0,5,0,0,0,64,0, + 0,0,115,181,0,0,0,101,0,0,90,1,0,100,0,0, + 90,2,0,100,1,0,90,3,0,101,4,0,100,2,0,100, + 3,0,132,0,0,131,1,0,90,5,0,101,6,0,100,4, + 0,100,4,0,100,5,0,100,6,0,132,2,0,131,1,0, + 90,7,0,101,6,0,100,4,0,100,7,0,100,8,0,132, + 1,0,131,1,0,90,8,0,101,6,0,101,9,0,100,9, + 0,100,10,0,132,0,0,131,1,0,131,1,0,90,10,0, + 101,6,0,101,9,0,100,11,0,100,12,0,132,0,0,131, + 1,0,131,1,0,90,11,0,101,6,0,101,9,0,100,13, + 0,100,14,0,132,0,0,131,1,0,131,1,0,90,12,0, + 101,6,0,101,9,0,100,15,0,100,16,0,132,0,0,131, + 1,0,131,1,0,90,13,0,100,4,0,83,41,17,218,15, + 66,117,105,108,116,105,110,73,109,112,111,114,116,101,114,122, + 144,77,101,116,97,32,112,97,116,104,32,105,109,112,111,114, + 116,32,102,111,114,32,98,117,105,108,116,45,105,110,32,109, + 111,100,117,108,101,115,46,10,10,32,32,32,32,65,108,108, + 32,109,101,116,104,111,100,115,32,97,114,101,32,101,105,116, + 104,101,114,32,99,108,97,115,115,32,111,114,32,115,116,97, + 116,105,99,32,109,101,116,104,111,100,115,32,116,111,32,97, + 118,111,105,100,32,116,104,101,32,110,101,101,100,32,116,111, + 10,32,32,32,32,105,110,115,116,97,110,116,105,97,116,101, + 32,116,104,101,32,99,108,97,115,115,46,10,10,32,32,32, + 32,99,1,0,0,0,0,0,0,0,1,0,0,0,2,0, + 0,0,67,0,0,0,115,16,0,0,0,100,1,0,106,0, + 0,124,0,0,106,1,0,131,1,0,83,41,2,122,115,82, + 101,116,117,114,110,32,114,101,112,114,32,102,111,114,32,116, + 104,101,32,109,111,100,117,108,101,46,10,10,32,32,32,32, + 32,32,32,32,84,104,101,32,109,101,116,104,111,100,32,105, + 115,32,100,101,112,114,101,99,97,116,101,100,46,32,32,84, + 104,101,32,105,109,112,111,114,116,32,109,97,99,104,105,110, + 101,114,121,32,100,111,101,115,32,116,104,101,32,106,111,98, + 32,105,116,115,101,108,102,46,10,10,32,32,32,32,32,32, + 32,32,122,24,60,109,111,100,117,108,101,32,123,33,114,125, + 32,40,98,117,105,108,116,45,105,110,41,62,41,2,114,47, + 0,0,0,114,57,0,0,0,41,1,114,180,0,0,0,114, + 4,0,0,0,114,4,0,0,0,114,5,0,0,0,114,206, + 0,0,0,233,4,0,0,115,2,0,0,0,0,7,122,27, 66,117,105,108,116,105,110,73,109,112,111,114,116,101,114,46, - 109,111,100,117,108,101,95,114,101,112,114,99,3,0,0,0, - 0,0,0,0,3,0,0,0,2,0,0,0,67,0,0,0, - 115,39,0,0,0,124,2,0,100,1,0,107,9,0,114,16, - 0,100,1,0,83,116,1,0,106,2,0,124,1,0,131,1, - 0,114,35,0,124,0,0,83,100,1,0,83,40,2,0,0, - 0,117,113,0,0,0,70,105,110,100,32,116,104,101,32,98, - 117,105,108,116,45,105,110,32,109,111,100,117,108,101,46,10, - 10,32,32,32,32,32,32,32,32,73,102,32,39,112,97,116, - 104,39,32,105,115,32,101,118,101,114,32,115,112,101,99,105, - 102,105,101,100,32,116,104,101,110,32,116,104,101,32,115,101, - 97,114,99,104,32,105,115,32,99,111,110,115,105,100,101,114, - 101,100,32,97,32,102,97,105,108,117,114,101,46,10,10,32, - 32,32,32,32,32,32,32,78,40,3,0,0,0,117,4,0, - 0,0,78,111,110,101,117,4,0,0,0,95,105,109,112,117, - 10,0,0,0,105,115,95,98,117,105,108,116,105,110,40,3, - 0,0,0,117,3,0,0,0,99,108,115,117,8,0,0,0, - 102,117,108,108,110,97,109,101,117,4,0,0,0,112,97,116, - 104,40,0,0,0,0,40,0,0,0,0,117,29,0,0,0, - 60,102,114,111,122,101,110,32,105,109,112,111,114,116,108,105, - 98,46,95,98,111,111,116,115,116,114,97,112,62,117,11,0, - 0,0,102,105,110,100,95,109,111,100,117,108,101,129,2,0, - 0,115,6,0,0,0,0,7,12,1,4,1,117,27,0,0, - 0,66,117,105,108,116,105,110,73,109,112,111,114,116,101,114, - 46,102,105,110,100,95,109,111,100,117,108,101,99,2,0,0, - 0,0,0,0,0,3,0,0,0,9,0,0,0,67,0,0, - 0,115,88,0,0,0,124,1,0,116,0,0,106,1,0,107, - 6,0,125,2,0,121,20,0,116,2,0,116,3,0,106,4, - 0,124,1,0,131,2,0,83,87,110,46,0,1,1,1,124, - 2,0,12,114,76,0,124,1,0,116,0,0,106,1,0,107, - 6,0,114,76,0,116,0,0,106,1,0,124,1,0,61,110, - 0,0,130,0,0,89,110,1,0,88,100,1,0,83,40,2, - 0,0,0,117,23,0,0,0,76,111,97,100,32,97,32,98, - 117,105,108,116,45,105,110,32,109,111,100,117,108,101,46,78, - 40,5,0,0,0,117,3,0,0,0,115,121,115,117,7,0, - 0,0,109,111,100,117,108,101,115,117,25,0,0,0,95,99, - 97,108,108,95,119,105,116,104,95,102,114,97,109,101,115,95, - 114,101,109,111,118,101,100,117,4,0,0,0,95,105,109,112, - 117,12,0,0,0,105,110,105,116,95,98,117,105,108,116,105, - 110,40,3,0,0,0,117,3,0,0,0,99,108,115,117,8, - 0,0,0,102,117,108,108,110,97,109,101,117,9,0,0,0, - 105,115,95,114,101,108,111,97,100,40,0,0,0,0,40,0, - 0,0,0,117,29,0,0,0,60,102,114,111,122,101,110,32, - 105,109,112,111,114,116,108,105,98,46,95,98,111,111,116,115, - 116,114,97,112,62,117,11,0,0,0,108,111,97,100,95,109, - 111,100,117,108,101,140,2,0,0,115,14,0,0,0,0,6, - 15,1,3,1,20,1,3,1,22,1,13,1,117,27,0,0, - 0,66,117,105,108,116,105,110,73,109,112,111,114,116,101,114, - 46,108,111,97,100,95,109,111,100,117,108,101,99,2,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,1,0,83,40,2,0,0,0,117, - 57,0,0,0,82,101,116,117,114,110,32,78,111,110,101,32, - 97,115,32,98,117,105,108,116,45,105,110,32,109,111,100,117, - 108,101,115,32,100,111,32,110,111,116,32,104,97,118,101,32, - 99,111,100,101,32,111,98,106,101,99,116,115,46,78,40,1, - 0,0,0,117,4,0,0,0,78,111,110,101,40,2,0,0, - 0,117,3,0,0,0,99,108,115,117,8,0,0,0,102,117, - 108,108,110,97,109,101,40,0,0,0,0,40,0,0,0,0, - 117,29,0,0,0,60,102,114,111,122,101,110,32,105,109,112, - 111,114,116,108,105,98,46,95,98,111,111,116,115,116,114,97, - 112,62,117,8,0,0,0,103,101,116,95,99,111,100,101,154, - 2,0,0,115,2,0,0,0,0,4,117,24,0,0,0,66, - 117,105,108,116,105,110,73,109,112,111,114,116,101,114,46,103, - 101,116,95,99,111,100,101,99,2,0,0,0,0,0,0,0, + 109,111,100,117,108,101,95,114,101,112,114,78,99,4,0,0, + 0,0,0,0,0,4,0,0,0,5,0,0,0,67,0,0, + 0,115,58,0,0,0,124,2,0,100,0,0,107,9,0,114, + 16,0,100,0,0,83,116,0,0,106,1,0,124,1,0,131, + 1,0,114,50,0,116,2,0,124,1,0,124,0,0,100,1, + 0,100,2,0,131,2,1,83,100,0,0,83,100,0,0,83, + 41,3,78,114,218,0,0,0,122,8,98,117,105,108,116,45, + 105,110,41,3,114,106,0,0,0,90,10,105,115,95,98,117, + 105,108,116,105,110,114,174,0,0,0,41,4,218,3,99,108, + 115,114,159,0,0,0,114,35,0,0,0,218,6,116,97,114, + 103,101,116,114,4,0,0,0,114,4,0,0,0,114,5,0, + 0,0,218,9,102,105,110,100,95,115,112,101,99,242,4,0, + 0,115,10,0,0,0,0,2,12,1,4,1,15,1,19,2, + 122,25,66,117,105,108,116,105,110,73,109,112,111,114,116,101, + 114,46,102,105,110,100,95,115,112,101,99,99,3,0,0,0, + 0,0,0,0,4,0,0,0,3,0,0,0,67,0,0,0, + 115,41,0,0,0,124,0,0,106,0,0,124,1,0,124,2, + 0,131,2,0,125,3,0,124,3,0,100,1,0,107,9,0, + 114,37,0,124,3,0,106,1,0,83,100,1,0,83,41,2, + 122,175,70,105,110,100,32,116,104,101,32,98,117,105,108,116, + 45,105,110,32,109,111,100,117,108,101,46,10,10,32,32,32, + 32,32,32,32,32,73,102,32,39,112,97,116,104,39,32,105, + 115,32,101,118,101,114,32,115,112,101,99,105,102,105,101,100, + 32,116,104,101,110,32,116,104,101,32,115,101,97,114,99,104, + 32,105,115,32,99,111,110,115,105,100,101,114,101,100,32,97, + 32,102,97,105,108,117,114,101,46,10,10,32,32,32,32,32, + 32,32,32,84,104,105,115,32,109,101,116,104,111,100,32,105, + 115,32,100,101,112,114,101,99,97,116,101,100,46,32,32,85, + 115,101,32,102,105,110,100,95,115,112,101,99,40,41,32,105, + 110,115,116,101,97,100,46,10,10,32,32,32,32,32,32,32, + 32,78,41,2,114,14,1,0,0,114,170,0,0,0,41,4, + 114,12,1,0,0,114,159,0,0,0,114,35,0,0,0,114, + 178,0,0,0,114,4,0,0,0,114,4,0,0,0,114,5, + 0,0,0,218,11,102,105,110,100,95,109,111,100,117,108,101, + 251,4,0,0,115,4,0,0,0,0,9,18,1,122,27,66, + 117,105,108,116,105,110,73,109,112,111,114,116,101,114,46,102, + 105,110,100,95,109,111,100,117,108,101,99,2,0,0,0,0, + 0,0,0,3,0,0,0,10,0,0,0,67,0,0,0,115, + 59,0,0,0,116,0,0,124,1,0,131,1,0,143,23,0, + 1,116,1,0,116,2,0,106,3,0,124,1,0,131,2,0, + 125,2,0,87,100,1,0,81,88,124,0,0,124,2,0,95, + 4,0,100,2,0,124,2,0,95,5,0,124,2,0,83,41, + 3,122,23,76,111,97,100,32,97,32,98,117,105,108,116,45, + 105,110,32,109,111,100,117,108,101,46,78,114,30,0,0,0, + 41,6,114,69,0,0,0,114,114,0,0,0,114,106,0,0, + 0,90,12,105,110,105,116,95,98,117,105,108,116,105,110,114, + 205,0,0,0,114,251,0,0,0,41,3,114,12,1,0,0, + 114,159,0,0,0,114,180,0,0,0,114,4,0,0,0,114, + 4,0,0,0,114,5,0,0,0,114,5,1,0,0,7,5, + 0,0,115,10,0,0,0,0,6,13,1,24,1,9,1,9, + 1,122,27,66,117,105,108,116,105,110,73,109,112,111,114,116, + 101,114,46,108,111,97,100,95,109,111,100,117,108,101,99,2, + 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,1,0,83,41,2,122,57, + 82,101,116,117,114,110,32,78,111,110,101,32,97,115,32,98, + 117,105,108,116,45,105,110,32,109,111,100,117,108,101,115,32, + 100,111,32,110,111,116,32,104,97,118,101,32,99,111,100,101, + 32,111,98,106,101,99,116,115,46,78,114,4,0,0,0,41, + 2,114,12,1,0,0,114,159,0,0,0,114,4,0,0,0, + 114,4,0,0,0,114,5,0,0,0,218,8,103,101,116,95, + 99,111,100,101,19,5,0,0,115,2,0,0,0,0,4,122, + 24,66,117,105,108,116,105,110,73,109,112,111,114,116,101,114, + 46,103,101,116,95,99,111,100,101,99,2,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,1,0,83,41,2,122,56,82,101,116,117,114, + 110,32,78,111,110,101,32,97,115,32,98,117,105,108,116,45, + 105,110,32,109,111,100,117,108,101,115,32,100,111,32,110,111, + 116,32,104,97,118,101,32,115,111,117,114,99,101,32,99,111, + 100,101,46,78,114,4,0,0,0,41,2,114,12,1,0,0, + 114,159,0,0,0,114,4,0,0,0,114,4,0,0,0,114, + 5,0,0,0,218,10,103,101,116,95,115,111,117,114,99,101, + 25,5,0,0,115,2,0,0,0,0,4,122,26,66,117,105, + 108,116,105,110,73,109,112,111,114,116,101,114,46,103,101,116, + 95,115,111,117,114,99,101,99,2,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,1,0,83,40,2,0,0,0,117,56,0,0,0,82, - 101,116,117,114,110,32,78,111,110,101,32,97,115,32,98,117, - 105,108,116,45,105,110,32,109,111,100,117,108,101,115,32,100, - 111,32,110,111,116,32,104,97,118,101,32,115,111,117,114,99, - 101,32,99,111,100,101,46,78,40,1,0,0,0,117,4,0, - 0,0,78,111,110,101,40,2,0,0,0,117,3,0,0,0, - 99,108,115,117,8,0,0,0,102,117,108,108,110,97,109,101, - 40,0,0,0,0,40,0,0,0,0,117,29,0,0,0,60, - 102,114,111,122,101,110,32,105,109,112,111,114,116,108,105,98, - 46,95,98,111,111,116,115,116,114,97,112,62,117,10,0,0, - 0,103,101,116,95,115,111,117,114,99,101,160,2,0,0,115, - 2,0,0,0,0,4,117,26,0,0,0,66,117,105,108,116, - 105,110,73,109,112,111,114,116,101,114,46,103,101,116,95,115, - 111,117,114,99,101,99,2,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, - 1,0,83,40,2,0,0,0,117,52,0,0,0,82,101,116, - 117,114,110,32,70,97,108,115,101,32,97,115,32,98,117,105, - 108,116,45,105,110,32,109,111,100,117,108,101,115,32,97,114, - 101,32,110,101,118,101,114,32,112,97,99,107,97,103,101,115, - 46,70,40,1,0,0,0,117,5,0,0,0,70,97,108,115, - 101,40,2,0,0,0,117,3,0,0,0,99,108,115,117,8, - 0,0,0,102,117,108,108,110,97,109,101,40,0,0,0,0, - 40,0,0,0,0,117,29,0,0,0,60,102,114,111,122,101, - 110,32,105,109,112,111,114,116,108,105,98,46,95,98,111,111, - 116,115,116,114,97,112,62,117,10,0,0,0,105,115,95,112, - 97,99,107,97,103,101,166,2,0,0,115,2,0,0,0,0, - 4,117,26,0,0,0,66,117,105,108,116,105,110,73,109,112, - 111,114,116,101,114,46,105,115,95,112,97,99,107,97,103,101, - 78,40,15,0,0,0,117,8,0,0,0,95,95,110,97,109, - 101,95,95,117,10,0,0,0,95,95,109,111,100,117,108,101, - 95,95,117,12,0,0,0,95,95,113,117,97,108,110,97,109, - 101,95,95,117,7,0,0,0,95,95,100,111,99,95,95,117, - 11,0,0,0,99,108,97,115,115,109,101,116,104,111,100,117, - 11,0,0,0,109,111,100,117,108,101,95,114,101,112,114,117, - 4,0,0,0,78,111,110,101,117,11,0,0,0,102,105,110, - 100,95,109,111,100,117,108,101,117,11,0,0,0,115,101,116, - 95,112,97,99,107,97,103,101,117,10,0,0,0,115,101,116, - 95,108,111,97,100,101,114,117,17,0,0,0,95,114,101,113, - 117,105,114,101,115,95,98,117,105,108,116,105,110,117,11,0, - 0,0,108,111,97,100,95,109,111,100,117,108,101,117,8,0, - 0,0,103,101,116,95,99,111,100,101,117,10,0,0,0,103, - 101,116,95,115,111,117,114,99,101,117,10,0,0,0,105,115, - 95,112,97,99,107,97,103,101,40,1,0,0,0,117,10,0, - 0,0,95,95,108,111,99,97,108,115,95,95,40,0,0,0, - 0,40,0,0,0,0,117,29,0,0,0,60,102,114,111,122, - 101,110,32,105,109,112,111,114,116,108,105,98,46,95,98,111, - 111,116,115,116,114,97,112,62,117,15,0,0,0,66,117,105, - 108,116,105,110,73,109,112,111,114,116,101,114,116,2,0,0, - 115,28,0,0,0,16,7,6,2,18,4,3,1,18,10,3, - 1,3,1,3,1,27,11,3,1,21,5,3,1,21,5,3, - 1,117,15,0,0,0,66,117,105,108,116,105,110,73,109,112, - 111,114,116,101,114,99,1,0,0,0,0,0,0,0,1,0, - 0,0,6,0,0,0,66,0,0,0,115,173,0,0,0,124, - 0,0,69,101,0,0,90,1,0,100,0,0,90,2,0,100, - 1,0,90,3,0,101,4,0,100,2,0,100,3,0,132,0, - 0,131,1,0,90,5,0,101,4,0,100,14,0,100,4,0, - 100,5,0,132,1,0,131,1,0,90,7,0,101,4,0,101, - 8,0,101,9,0,101,10,0,100,6,0,100,7,0,132,0, - 0,131,1,0,131,1,0,131,1,0,131,1,0,90,11,0, - 101,4,0,101,10,0,100,8,0,100,9,0,132,0,0,131, - 1,0,131,1,0,90,12,0,101,4,0,101,10,0,100,10, - 0,100,11,0,132,0,0,131,1,0,131,1,0,90,13,0, - 101,4,0,101,10,0,100,12,0,100,13,0,132,0,0,131, - 1,0,131,1,0,90,14,0,100,14,0,83,40,15,0,0, - 0,117,14,0,0,0,70,114,111,122,101,110,73,109,112,111, - 114,116,101,114,117,142,0,0,0,77,101,116,97,32,112,97, - 116,104,32,105,109,112,111,114,116,32,102,111,114,32,102,114, - 111,122,101,110,32,109,111,100,117,108,101,115,46,10,10,32, - 32,32,32,65,108,108,32,109,101,116,104,111,100,115,32,97, - 114,101,32,101,105,116,104,101,114,32,99,108,97,115,115,32, - 111,114,32,115,116,97,116,105,99,32,109,101,116,104,111,100, - 115,32,116,111,32,97,118,111,105,100,32,116,104,101,32,110, - 101,101,100,32,116,111,10,32,32,32,32,105,110,115,116,97, - 110,116,105,97,116,101,32,116,104,101,32,99,108,97,115,115, - 46,10,10,32,32,32,32,99,2,0,0,0,0,0,0,0, - 2,0,0,0,2,0,0,0,67,0,0,0,115,16,0,0, - 0,100,1,0,106,0,0,124,1,0,106,1,0,131,1,0, - 83,40,2,0,0,0,78,117,22,0,0,0,60,109,111,100, - 117,108,101,32,39,123,125,39,32,40,102,114,111,122,101,110, - 41,62,40,2,0,0,0,117,6,0,0,0,102,111,114,109, - 97,116,117,8,0,0,0,95,95,110,97,109,101,95,95,40, - 2,0,0,0,117,3,0,0,0,99,108,115,117,1,0,0, - 0,109,40,0,0,0,0,40,0,0,0,0,117,29,0,0, - 0,60,102,114,111,122,101,110,32,105,109,112,111,114,116,108, - 105,98,46,95,98,111,111,116,115,116,114,97,112,62,117,11, - 0,0,0,109,111,100,117,108,101,95,114,101,112,114,182,2, - 0,0,115,2,0,0,0,0,2,117,26,0,0,0,70,114, + 0,100,1,0,83,41,2,122,52,82,101,116,117,114,110,32, + 70,97,108,115,101,32,97,115,32,98,117,105,108,116,45,105, + 110,32,109,111,100,117,108,101,115,32,97,114,101,32,110,101, + 118,101,114,32,112,97,99,107,97,103,101,115,46,70,114,4, + 0,0,0,41,2,114,12,1,0,0,114,159,0,0,0,114, + 4,0,0,0,114,4,0,0,0,114,5,0,0,0,114,220, + 0,0,0,31,5,0,0,115,2,0,0,0,0,4,122,26, + 66,117,105,108,116,105,110,73,109,112,111,114,116,101,114,46, + 105,115,95,112,97,99,107,97,103,101,41,14,114,57,0,0, + 0,114,56,0,0,0,114,58,0,0,0,114,59,0,0,0, + 218,12,115,116,97,116,105,99,109,101,116,104,111,100,114,206, + 0,0,0,218,11,99,108,97,115,115,109,101,116,104,111,100, + 114,14,1,0,0,114,15,1,0,0,114,162,0,0,0,114, + 5,1,0,0,114,16,1,0,0,114,17,1,0,0,114,220, + 0,0,0,114,4,0,0,0,114,4,0,0,0,114,4,0, + 0,0,114,5,0,0,0,114,11,1,0,0,224,4,0,0, + 115,28,0,0,0,12,7,6,2,18,9,3,1,21,8,3, + 1,18,11,3,1,21,11,3,1,21,5,3,1,21,5,3, + 1,114,11,1,0,0,99,0,0,0,0,0,0,0,0,0, + 0,0,0,5,0,0,0,64,0,0,0,115,193,0,0,0, + 101,0,0,90,1,0,100,0,0,90,2,0,100,1,0,90, + 3,0,101,4,0,100,2,0,100,3,0,132,0,0,131,1, + 0,90,5,0,101,6,0,100,4,0,100,4,0,100,5,0, + 100,6,0,132,2,0,131,1,0,90,7,0,101,6,0,100, + 4,0,100,7,0,100,8,0,132,1,0,131,1,0,90,8, + 0,101,4,0,100,9,0,100,10,0,132,0,0,131,1,0, + 90,9,0,101,6,0,100,11,0,100,12,0,132,0,0,131, + 1,0,90,10,0,101,6,0,101,11,0,100,13,0,100,14, + 0,132,0,0,131,1,0,131,1,0,90,12,0,101,6,0, + 101,11,0,100,15,0,100,16,0,132,0,0,131,1,0,131, + 1,0,90,13,0,101,6,0,101,11,0,100,17,0,100,18, + 0,132,0,0,131,1,0,131,1,0,90,14,0,100,4,0, + 83,41,19,218,14,70,114,111,122,101,110,73,109,112,111,114, + 116,101,114,122,142,77,101,116,97,32,112,97,116,104,32,105, + 109,112,111,114,116,32,102,111,114,32,102,114,111,122,101,110, + 32,109,111,100,117,108,101,115,46,10,10,32,32,32,32,65, + 108,108,32,109,101,116,104,111,100,115,32,97,114,101,32,101, + 105,116,104,101,114,32,99,108,97,115,115,32,111,114,32,115, + 116,97,116,105,99,32,109,101,116,104,111,100,115,32,116,111, + 32,97,118,111,105,100,32,116,104,101,32,110,101,101,100,32, + 116,111,10,32,32,32,32,105,110,115,116,97,110,116,105,97, + 116,101,32,116,104,101,32,99,108,97,115,115,46,10,10,32, + 32,32,32,99,1,0,0,0,0,0,0,0,1,0,0,0, + 2,0,0,0,67,0,0,0,115,16,0,0,0,100,1,0, + 106,0,0,124,0,0,106,1,0,131,1,0,83,41,2,122, + 115,82,101,116,117,114,110,32,114,101,112,114,32,102,111,114, + 32,116,104,101,32,109,111,100,117,108,101,46,10,10,32,32, + 32,32,32,32,32,32,84,104,101,32,109,101,116,104,111,100, + 32,105,115,32,100,101,112,114,101,99,97,116,101,100,46,32, + 32,84,104,101,32,105,109,112,111,114,116,32,109,97,99,104, + 105,110,101,114,121,32,100,111,101,115,32,116,104,101,32,106, + 111,98,32,105,116,115,101,108,102,46,10,10,32,32,32,32, + 32,32,32,32,122,22,60,109,111,100,117,108,101,32,123,33, + 114,125,32,40,102,114,111,122,101,110,41,62,41,2,114,47, + 0,0,0,114,57,0,0,0,41,1,218,1,109,114,4,0, + 0,0,114,4,0,0,0,114,5,0,0,0,114,206,0,0, + 0,47,5,0,0,115,2,0,0,0,0,7,122,26,70,114, 111,122,101,110,73,109,112,111,114,116,101,114,46,109,111,100, - 117,108,101,95,114,101,112,114,99,3,0,0,0,0,0,0, - 0,3,0,0,0,2,0,0,0,67,0,0,0,115,23,0, - 0,0,116,0,0,106,1,0,124,1,0,131,1,0,114,19, - 0,124,0,0,83,100,1,0,83,40,2,0,0,0,117,21, - 0,0,0,70,105,110,100,32,97,32,102,114,111,122,101,110, - 32,109,111,100,117,108,101,46,78,40,3,0,0,0,117,4, - 0,0,0,95,105,109,112,117,9,0,0,0,105,115,95,102, - 114,111,122,101,110,117,4,0,0,0,78,111,110,101,40,3, - 0,0,0,117,3,0,0,0,99,108,115,117,8,0,0,0, - 102,117,108,108,110,97,109,101,117,4,0,0,0,112,97,116, - 104,40,0,0,0,0,40,0,0,0,0,117,29,0,0,0, - 60,102,114,111,122,101,110,32,105,109,112,111,114,116,108,105, - 98,46,95,98,111,111,116,115,116,114,97,112,62,117,11,0, - 0,0,102,105,110,100,95,109,111,100,117,108,101,186,2,0, - 0,115,2,0,0,0,0,3,117,26,0,0,0,70,114,111, - 122,101,110,73,109,112,111,114,116,101,114,46,102,105,110,100, - 95,109,111,100,117,108,101,99,2,0,0,0,0,0,0,0, - 4,0,0,0,9,0,0,0,67,0,0,0,115,100,0,0, - 0,124,1,0,116,0,0,106,1,0,107,6,0,125,2,0, - 121,32,0,116,2,0,116,3,0,106,4,0,124,1,0,131, - 2,0,125,3,0,124,3,0,96,5,0,124,3,0,83,87, - 110,46,0,1,1,1,124,2,0,12,114,88,0,124,1,0, - 116,0,0,106,1,0,107,6,0,114,88,0,116,0,0,106, - 1,0,124,1,0,61,110,0,0,130,0,0,89,110,1,0, - 88,100,1,0,83,40,2,0,0,0,117,21,0,0,0,76, - 111,97,100,32,97,32,102,114,111,122,101,110,32,109,111,100, - 117,108,101,46,78,40,6,0,0,0,117,3,0,0,0,115, - 121,115,117,7,0,0,0,109,111,100,117,108,101,115,117,25, - 0,0,0,95,99,97,108,108,95,119,105,116,104,95,102,114, - 97,109,101,115,95,114,101,109,111,118,101,100,117,4,0,0, - 0,95,105,109,112,117,11,0,0,0,105,110,105,116,95,102, - 114,111,122,101,110,117,8,0,0,0,95,95,102,105,108,101, - 95,95,40,4,0,0,0,117,3,0,0,0,99,108,115,117, - 8,0,0,0,102,117,108,108,110,97,109,101,117,9,0,0, - 0,105,115,95,114,101,108,111,97,100,117,1,0,0,0,109, - 40,0,0,0,0,40,0,0,0,0,117,29,0,0,0,60, - 102,114,111,122,101,110,32,105,109,112,111,114,116,108,105,98, - 46,95,98,111,111,116,115,116,114,97,112,62,117,11,0,0, - 0,108,111,97,100,95,109,111,100,117,108,101,191,2,0,0, - 115,18,0,0,0,0,6,15,1,3,1,18,2,6,1,8, - 1,3,1,22,1,13,1,117,26,0,0,0,70,114,111,122, - 101,110,73,109,112,111,114,116,101,114,46,108,111,97,100,95, - 109,111,100,117,108,101,99,2,0,0,0,0,0,0,0,2, - 0,0,0,2,0,0,0,67,0,0,0,115,13,0,0,0, - 116,0,0,106,1,0,124,1,0,131,1,0,83,40,1,0, - 0,0,117,45,0,0,0,82,101,116,117,114,110,32,116,104, - 101,32,99,111,100,101,32,111,98,106,101,99,116,32,102,111, - 114,32,116,104,101,32,102,114,111,122,101,110,32,109,111,100, - 117,108,101,46,40,2,0,0,0,117,4,0,0,0,95,105, - 109,112,117,17,0,0,0,103,101,116,95,102,114,111,122,101, - 110,95,111,98,106,101,99,116,40,2,0,0,0,117,3,0, - 0,0,99,108,115,117,8,0,0,0,102,117,108,108,110,97, - 109,101,40,0,0,0,0,40,0,0,0,0,117,29,0,0, - 0,60,102,114,111,122,101,110,32,105,109,112,111,114,116,108, - 105,98,46,95,98,111,111,116,115,116,114,97,112,62,117,8, - 0,0,0,103,101,116,95,99,111,100,101,208,2,0,0,115, - 2,0,0,0,0,4,117,23,0,0,0,70,114,111,122,101, + 117,108,101,95,114,101,112,114,78,99,4,0,0,0,0,0, + 0,0,4,0,0,0,5,0,0,0,67,0,0,0,115,42, + 0,0,0,116,0,0,106,1,0,124,1,0,131,1,0,114, + 34,0,116,2,0,124,1,0,124,0,0,100,1,0,100,2, + 0,131,2,1,83,100,0,0,83,100,0,0,83,41,3,78, + 114,218,0,0,0,90,6,102,114,111,122,101,110,41,3,114, + 106,0,0,0,114,163,0,0,0,114,174,0,0,0,41,4, + 114,12,1,0,0,114,159,0,0,0,114,35,0,0,0,114, + 13,1,0,0,114,4,0,0,0,114,4,0,0,0,114,5, + 0,0,0,114,14,1,0,0,56,5,0,0,115,6,0,0, + 0,0,2,15,1,19,2,122,24,70,114,111,122,101,110,73, + 109,112,111,114,116,101,114,46,102,105,110,100,95,115,112,101, + 99,99,3,0,0,0,0,0,0,0,3,0,0,0,2,0, + 0,0,67,0,0,0,115,23,0,0,0,116,0,0,106,1, + 0,124,1,0,131,1,0,114,19,0,124,0,0,83,100,1, + 0,83,41,2,122,93,70,105,110,100,32,97,32,102,114,111, + 122,101,110,32,109,111,100,117,108,101,46,10,10,32,32,32, + 32,32,32,32,32,84,104,105,115,32,109,101,116,104,111,100, + 32,105,115,32,100,101,112,114,101,99,97,116,101,100,46,32, + 32,85,115,101,32,102,105,110,100,95,115,112,101,99,40,41, + 32,105,110,115,116,101,97,100,46,10,10,32,32,32,32,32, + 32,32,32,78,41,2,114,106,0,0,0,114,163,0,0,0, + 41,3,114,12,1,0,0,114,159,0,0,0,114,35,0,0, + 0,114,4,0,0,0,114,4,0,0,0,114,5,0,0,0, + 114,15,1,0,0,63,5,0,0,115,2,0,0,0,0,7, + 122,26,70,114,111,122,101,110,73,109,112,111,114,116,101,114, + 46,102,105,110,100,95,109,111,100,117,108,101,99,1,0,0, + 0,0,0,0,0,3,0,0,0,4,0,0,0,67,0,0, + 0,115,95,0,0,0,124,0,0,106,0,0,106,1,0,125, + 1,0,116,2,0,106,3,0,124,1,0,131,1,0,115,57, + 0,116,4,0,100,1,0,106,5,0,124,1,0,131,1,0, + 100,2,0,124,1,0,131,1,1,130,1,0,110,0,0,116, + 6,0,116,2,0,106,7,0,124,1,0,131,2,0,125,2, + 0,116,8,0,124,2,0,124,0,0,106,9,0,131,2,0, + 1,100,0,0,83,41,3,78,122,27,123,33,114,125,32,105, + 115,32,110,111,116,32,97,32,102,114,111,122,101,110,32,109, + 111,100,117,108,101,114,67,0,0,0,41,10,114,209,0,0, + 0,114,67,0,0,0,114,106,0,0,0,114,163,0,0,0, + 114,154,0,0,0,114,47,0,0,0,114,114,0,0,0,218, + 17,103,101,116,95,102,114,111,122,101,110,95,111,98,106,101, + 99,116,114,176,0,0,0,114,63,0,0,0,41,3,114,180, + 0,0,0,114,67,0,0,0,114,195,0,0,0,114,4,0, + 0,0,114,4,0,0,0,114,5,0,0,0,114,2,1,0, + 0,72,5,0,0,115,12,0,0,0,0,2,12,1,15,1, + 18,1,12,1,18,1,122,26,70,114,111,122,101,110,73,109, + 112,111,114,116,101,114,46,101,120,101,99,95,109,111,100,117, + 108,101,99,2,0,0,0,0,0,0,0,2,0,0,0,3, + 0,0,0,67,0,0,0,115,13,0,0,0,116,0,0,124, + 0,0,124,1,0,131,2,0,83,41,1,122,95,76,111,97, + 100,32,97,32,102,114,111,122,101,110,32,109,111,100,117,108, + 101,46,10,10,32,32,32,32,32,32,32,32,84,104,105,115, + 32,109,101,116,104,111,100,32,105,115,32,100,101,112,114,101, + 99,97,116,101,100,46,32,32,85,115,101,32,101,120,101,99, + 95,109,111,100,117,108,101,40,41,32,105,110,115,116,101,97, + 100,46,10,10,32,32,32,32,32,32,32,32,41,1,114,181, + 0,0,0,41,2,114,12,1,0,0,114,159,0,0,0,114, + 4,0,0,0,114,4,0,0,0,114,5,0,0,0,114,5, + 1,0,0,81,5,0,0,115,2,0,0,0,0,7,122,26, + 70,114,111,122,101,110,73,109,112,111,114,116,101,114,46,108, + 111,97,100,95,109,111,100,117,108,101,99,2,0,0,0,0, + 0,0,0,2,0,0,0,2,0,0,0,67,0,0,0,115, + 13,0,0,0,116,0,0,106,1,0,124,1,0,131,1,0, + 83,41,1,122,45,82,101,116,117,114,110,32,116,104,101,32, + 99,111,100,101,32,111,98,106,101,99,116,32,102,111,114,32, + 116,104,101,32,102,114,111,122,101,110,32,109,111,100,117,108, + 101,46,41,2,114,106,0,0,0,114,22,1,0,0,41,2, + 114,12,1,0,0,114,159,0,0,0,114,4,0,0,0,114, + 4,0,0,0,114,5,0,0,0,114,16,1,0,0,90,5, + 0,0,115,2,0,0,0,0,4,122,23,70,114,111,122,101, 110,73,109,112,111,114,116,101,114,46,103,101,116,95,99,111, 100,101,99,2,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,1,0,83, - 40,2,0,0,0,117,54,0,0,0,82,101,116,117,114,110, - 32,78,111,110,101,32,97,115,32,102,114,111,122,101,110,32, - 109,111,100,117,108,101,115,32,100,111,32,110,111,116,32,104, - 97,118,101,32,115,111,117,114,99,101,32,99,111,100,101,46, - 78,40,1,0,0,0,117,4,0,0,0,78,111,110,101,40, - 2,0,0,0,117,3,0,0,0,99,108,115,117,8,0,0, - 0,102,117,108,108,110,97,109,101,40,0,0,0,0,40,0, - 0,0,0,117,29,0,0,0,60,102,114,111,122,101,110,32, - 105,109,112,111,114,116,108,105,98,46,95,98,111,111,116,115, - 116,114,97,112,62,117,10,0,0,0,103,101,116,95,115,111, - 117,114,99,101,214,2,0,0,115,2,0,0,0,0,4,117, - 25,0,0,0,70,114,111,122,101,110,73,109,112,111,114,116, - 101,114,46,103,101,116,95,115,111,117,114,99,101,99,2,0, - 0,0,0,0,0,0,2,0,0,0,2,0,0,0,67,0, - 0,0,115,13,0,0,0,116,0,0,106,1,0,124,1,0, - 131,1,0,83,40,1,0,0,0,117,46,0,0,0,82,101, - 116,117,114,110,32,84,114,117,101,32,105,102,32,116,104,101, - 32,102,114,111,122,101,110,32,109,111,100,117,108,101,32,105, - 115,32,97,32,112,97,99,107,97,103,101,46,40,2,0,0, - 0,117,4,0,0,0,95,105,109,112,117,17,0,0,0,105, - 115,95,102,114,111,122,101,110,95,112,97,99,107,97,103,101, - 40,2,0,0,0,117,3,0,0,0,99,108,115,117,8,0, - 0,0,102,117,108,108,110,97,109,101,40,0,0,0,0,40, - 0,0,0,0,117,29,0,0,0,60,102,114,111,122,101,110, - 32,105,109,112,111,114,116,108,105,98,46,95,98,111,111,116, - 115,116,114,97,112,62,117,10,0,0,0,105,115,95,112,97, - 99,107,97,103,101,220,2,0,0,115,2,0,0,0,0,4, - 117,25,0,0,0,70,114,111,122,101,110,73,109,112,111,114, - 116,101,114,46,105,115,95,112,97,99,107,97,103,101,78,40, - 15,0,0,0,117,8,0,0,0,95,95,110,97,109,101,95, - 95,117,10,0,0,0,95,95,109,111,100,117,108,101,95,95, - 117,12,0,0,0,95,95,113,117,97,108,110,97,109,101,95, - 95,117,7,0,0,0,95,95,100,111,99,95,95,117,11,0, - 0,0,99,108,97,115,115,109,101,116,104,111,100,117,11,0, - 0,0,109,111,100,117,108,101,95,114,101,112,114,117,4,0, - 0,0,78,111,110,101,117,11,0,0,0,102,105,110,100,95, - 109,111,100,117,108,101,117,11,0,0,0,115,101,116,95,112, - 97,99,107,97,103,101,117,10,0,0,0,115,101,116,95,108, - 111,97,100,101,114,117,16,0,0,0,95,114,101,113,117,105, - 114,101,115,95,102,114,111,122,101,110,117,11,0,0,0,108, - 111,97,100,95,109,111,100,117,108,101,117,8,0,0,0,103, - 101,116,95,99,111,100,101,117,10,0,0,0,103,101,116,95, - 115,111,117,114,99,101,117,10,0,0,0,105,115,95,112,97, - 99,107,97,103,101,40,1,0,0,0,117,10,0,0,0,95, - 95,108,111,99,97,108,115,95,95,40,0,0,0,0,40,0, - 0,0,0,117,29,0,0,0,60,102,114,111,122,101,110,32, - 105,109,112,111,114,116,108,105,98,46,95,98,111,111,116,115, - 116,114,97,112,62,117,14,0,0,0,70,114,111,122,101,110, - 73,109,112,111,114,116,101,114,173,2,0,0,115,28,0,0, - 0,16,7,6,2,18,4,3,1,18,4,3,1,3,1,3, - 1,27,14,3,1,21,5,3,1,21,5,3,1,117,14,0, - 0,0,70,114,111,122,101,110,73,109,112,111,114,116,101,114, - 99,1,0,0,0,0,0,0,0,1,0,0,0,4,0,0, - 0,66,0,0,0,115,101,0,0,0,124,0,0,69,101,0, - 0,90,1,0,100,0,0,90,2,0,100,1,0,90,3,0, - 100,2,0,90,4,0,100,3,0,90,5,0,100,11,0,90, - 7,0,101,8,0,100,4,0,100,5,0,132,0,0,131,1, - 0,90,9,0,101,8,0,100,6,0,100,7,0,132,0,0, - 131,1,0,90,10,0,101,8,0,100,10,0,100,8,0,100, - 9,0,132,1,0,131,1,0,90,12,0,100,10,0,83,40, - 12,0,0,0,117,21,0,0,0,87,105,110,100,111,119,115, - 82,101,103,105,115,116,114,121,70,105,110,100,101,114,117,67, - 0,0,0,77,101,116,97,32,112,97,116,104,32,102,105,110, - 100,101,114,32,102,111,114,32,109,111,100,117,108,101,115,32, - 100,101,99,108,97,114,101,100,32,105,110,32,116,104,101,32, - 87,105,110,100,111,119,115,32,114,101,103,105,115,116,114,121, - 46,10,32,32,32,32,117,59,0,0,0,83,111,102,116,119, - 97,114,101,92,80,121,116,104,111,110,92,80,121,116,104,111, - 110,67,111,114,101,92,123,115,121,115,95,118,101,114,115,105, - 111,110,125,92,77,111,100,117,108,101,115,92,123,102,117,108, - 108,110,97,109,101,125,117,65,0,0,0,83,111,102,116,119, - 97,114,101,92,80,121,116,104,111,110,92,80,121,116,104,111, - 110,67,111,114,101,92,123,115,121,115,95,118,101,114,115,105, - 111,110,125,92,77,111,100,117,108,101,115,92,123,102,117,108, - 108,110,97,109,101,125,92,68,101,98,117,103,99,2,0,0, + 41,2,122,54,82,101,116,117,114,110,32,78,111,110,101,32, + 97,115,32,102,114,111,122,101,110,32,109,111,100,117,108,101, + 115,32,100,111,32,110,111,116,32,104,97,118,101,32,115,111, + 117,114,99,101,32,99,111,100,101,46,78,114,4,0,0,0, + 41,2,114,12,1,0,0,114,159,0,0,0,114,4,0,0, + 0,114,4,0,0,0,114,5,0,0,0,114,17,1,0,0, + 96,5,0,0,115,2,0,0,0,0,4,122,25,70,114,111, + 122,101,110,73,109,112,111,114,116,101,114,46,103,101,116,95, + 115,111,117,114,99,101,99,2,0,0,0,0,0,0,0,2, + 0,0,0,2,0,0,0,67,0,0,0,115,13,0,0,0, + 116,0,0,106,1,0,124,1,0,131,1,0,83,41,1,122, + 46,82,101,116,117,114,110,32,84,114,117,101,32,105,102,32, + 116,104,101,32,102,114,111,122,101,110,32,109,111,100,117,108, + 101,32,105,115,32,97,32,112,97,99,107,97,103,101,46,41, + 2,114,106,0,0,0,90,17,105,115,95,102,114,111,122,101, + 110,95,112,97,99,107,97,103,101,41,2,114,12,1,0,0, + 114,159,0,0,0,114,4,0,0,0,114,4,0,0,0,114, + 5,0,0,0,114,220,0,0,0,102,5,0,0,115,2,0, + 0,0,0,4,122,25,70,114,111,122,101,110,73,109,112,111, + 114,116,101,114,46,105,115,95,112,97,99,107,97,103,101,41, + 15,114,57,0,0,0,114,56,0,0,0,114,58,0,0,0, + 114,59,0,0,0,114,18,1,0,0,114,206,0,0,0,114, + 19,1,0,0,114,14,1,0,0,114,15,1,0,0,114,2, + 1,0,0,114,5,1,0,0,114,165,0,0,0,114,16,1, + 0,0,114,17,1,0,0,114,220,0,0,0,114,4,0,0, + 0,114,4,0,0,0,114,4,0,0,0,114,5,0,0,0, + 114,20,1,0,0,38,5,0,0,115,28,0,0,0,12,7, + 6,2,18,9,3,1,21,6,3,1,18,8,18,9,18,9, + 3,1,21,5,3,1,21,5,3,1,114,20,1,0,0,99, + 0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0, + 64,0,0,0,115,121,0,0,0,101,0,0,90,1,0,100, + 0,0,90,2,0,100,1,0,90,3,0,100,2,0,90,4, + 0,100,3,0,90,5,0,100,4,0,90,6,0,101,7,0, + 100,5,0,100,6,0,132,0,0,131,1,0,90,8,0,101, + 7,0,100,7,0,100,8,0,132,0,0,131,1,0,90,9, + 0,101,7,0,100,9,0,100,9,0,100,10,0,100,11,0, + 132,2,0,131,1,0,90,10,0,101,7,0,100,9,0,100, + 12,0,100,13,0,132,1,0,131,1,0,90,11,0,100,9, + 0,83,41,14,218,21,87,105,110,100,111,119,115,82,101,103, + 105,115,116,114,121,70,105,110,100,101,114,122,62,77,101,116, + 97,32,112,97,116,104,32,102,105,110,100,101,114,32,102,111, + 114,32,109,111,100,117,108,101,115,32,100,101,99,108,97,114, + 101,100,32,105,110,32,116,104,101,32,87,105,110,100,111,119, + 115,32,114,101,103,105,115,116,114,121,46,122,59,83,111,102, + 116,119,97,114,101,92,80,121,116,104,111,110,92,80,121,116, + 104,111,110,67,111,114,101,92,123,115,121,115,95,118,101,114, + 115,105,111,110,125,92,77,111,100,117,108,101,115,92,123,102, + 117,108,108,110,97,109,101,125,122,65,83,111,102,116,119,97, + 114,101,92,80,121,116,104,111,110,92,80,121,116,104,111,110, + 67,111,114,101,92,123,115,121,115,95,118,101,114,115,105,111, + 110,125,92,77,111,100,117,108,101,115,92,123,102,117,108,108, + 110,97,109,101,125,92,68,101,98,117,103,70,99,2,0,0, 0,0,0,0,0,2,0,0,0,11,0,0,0,67,0,0, 0,115,67,0,0,0,121,23,0,116,0,0,106,1,0,116, 0,0,106,2,0,124,1,0,131,2,0,83,87,110,37,0, 4,116,3,0,107,10,0,114,62,0,1,1,1,116,0,0, 106,1,0,116,0,0,106,4,0,124,1,0,131,2,0,83, - 89,110,1,0,88,100,0,0,83,40,1,0,0,0,78,40, - 5,0,0,0,117,7,0,0,0,95,119,105,110,114,101,103, - 117,7,0,0,0,79,112,101,110,75,101,121,117,17,0,0, - 0,72,75,69,89,95,67,85,82,82,69,78,84,95,85,83, - 69,82,117,12,0,0,0,87,105,110,100,111,119,115,69,114, - 114,111,114,117,18,0,0,0,72,75,69,89,95,76,79,67, - 65,76,95,77,65,67,72,73,78,69,40,2,0,0,0,117, - 3,0,0,0,99,108,115,117,3,0,0,0,107,101,121,40, - 0,0,0,0,40,0,0,0,0,117,29,0,0,0,60,102, - 114,111,122,101,110,32,105,109,112,111,114,116,108,105,98,46, - 95,98,111,111,116,115,116,114,97,112,62,117,14,0,0,0, - 95,111,112,101,110,95,114,101,103,105,115,116,114,121,240,2, - 0,0,115,8,0,0,0,0,2,3,1,23,1,13,1,117, - 36,0,0,0,87,105,110,100,111,119,115,82,101,103,105,115, - 116,114,121,70,105,110,100,101,114,46,95,111,112,101,110,95, - 114,101,103,105,115,116,114,121,99,2,0,0,0,0,0,0, - 0,6,0,0,0,16,0,0,0,67,0,0,0,115,142,0, - 0,0,124,0,0,106,0,0,114,21,0,124,0,0,106,1, - 0,125,2,0,110,9,0,124,0,0,106,2,0,125,2,0, - 124,2,0,106,3,0,100,1,0,124,1,0,100,2,0,116, - 4,0,106,5,0,100,0,0,100,3,0,133,2,0,25,131, - 0,2,125,3,0,121,46,0,124,0,0,106,6,0,124,3, - 0,131,1,0,143,25,0,125,4,0,116,7,0,106,8,0, - 124,4,0,100,4,0,131,2,0,125,5,0,87,100,0,0, - 81,88,87,110,22,0,4,116,9,0,107,10,0,114,137,0, - 1,1,1,100,0,0,83,89,110,1,0,88,124,5,0,83, - 40,5,0,0,0,78,117,8,0,0,0,102,117,108,108,110, - 97,109,101,117,11,0,0,0,115,121,115,95,118,101,114,115, - 105,111,110,105,3,0,0,0,117,0,0,0,0,40,11,0, - 0,0,117,11,0,0,0,68,69,66,85,71,95,66,85,73, - 76,68,117,18,0,0,0,82,69,71,73,83,84,82,89,95, - 75,69,89,95,68,69,66,85,71,117,12,0,0,0,82,69, - 71,73,83,84,82,89,95,75,69,89,117,6,0,0,0,102, - 111,114,109,97,116,117,3,0,0,0,115,121,115,117,7,0, - 0,0,118,101,114,115,105,111,110,117,14,0,0,0,95,111, - 112,101,110,95,114,101,103,105,115,116,114,121,117,7,0,0, - 0,95,119,105,110,114,101,103,117,10,0,0,0,81,117,101, - 114,121,86,97,108,117,101,117,12,0,0,0,87,105,110,100, - 111,119,115,69,114,114,111,114,117,4,0,0,0,78,111,110, - 101,40,6,0,0,0,117,3,0,0,0,99,108,115,117,8, - 0,0,0,102,117,108,108,110,97,109,101,117,12,0,0,0, - 114,101,103,105,115,116,114,121,95,107,101,121,117,3,0,0, - 0,107,101,121,117,4,0,0,0,104,107,101,121,117,8,0, - 0,0,102,105,108,101,112,97,116,104,40,0,0,0,0,40, - 0,0,0,0,117,29,0,0,0,60,102,114,111,122,101,110, - 32,105,109,112,111,114,116,108,105,98,46,95,98,111,111,116, - 115,116,114,97,112,62,117,16,0,0,0,95,115,101,97,114, - 99,104,95,114,101,103,105,115,116,114,121,247,2,0,0,115, - 22,0,0,0,0,2,9,1,12,2,9,1,15,1,22,1, - 3,1,18,1,28,1,13,1,9,1,117,38,0,0,0,87, + 89,110,1,0,88,100,0,0,83,41,1,78,41,5,218,7, + 95,119,105,110,114,101,103,90,7,79,112,101,110,75,101,121, + 90,17,72,75,69,89,95,67,85,82,82,69,78,84,95,85, + 83,69,82,114,40,0,0,0,90,18,72,75,69,89,95,76, + 79,67,65,76,95,77,65,67,72,73,78,69,41,2,114,12, + 1,0,0,218,3,107,101,121,114,4,0,0,0,114,4,0, + 0,0,114,5,0,0,0,218,14,95,111,112,101,110,95,114, + 101,103,105,115,116,114,121,121,5,0,0,115,8,0,0,0, + 0,2,3,1,23,1,13,1,122,36,87,105,110,100,111,119, + 115,82,101,103,105,115,116,114,121,70,105,110,100,101,114,46, + 95,111,112,101,110,95,114,101,103,105,115,116,114,121,99,2, + 0,0,0,0,0,0,0,6,0,0,0,16,0,0,0,67, + 0,0,0,115,142,0,0,0,124,0,0,106,0,0,114,21, + 0,124,0,0,106,1,0,125,2,0,110,9,0,124,0,0, + 106,2,0,125,2,0,124,2,0,106,3,0,100,1,0,124, + 1,0,100,2,0,116,4,0,106,5,0,100,0,0,100,3, + 0,133,2,0,25,131,0,2,125,3,0,121,46,0,124,0, + 0,106,6,0,124,3,0,131,1,0,143,25,0,125,4,0, + 116,7,0,106,8,0,124,4,0,100,4,0,131,2,0,125, + 5,0,87,100,0,0,81,88,87,110,22,0,4,116,9,0, + 107,10,0,114,137,0,1,1,1,100,0,0,83,89,110,1, + 0,88,124,5,0,83,41,5,78,114,159,0,0,0,90,11, + 115,121,115,95,118,101,114,115,105,111,110,114,137,0,0,0, + 114,30,0,0,0,41,10,218,11,68,69,66,85,71,95,66, + 85,73,76,68,218,18,82,69,71,73,83,84,82,89,95,75, + 69,89,95,68,69,66,85,71,218,12,82,69,71,73,83,84, + 82,89,95,75,69,89,114,47,0,0,0,114,7,0,0,0, + 218,7,118,101,114,115,105,111,110,114,26,1,0,0,114,24, + 1,0,0,90,10,81,117,101,114,121,86,97,108,117,101,114, + 40,0,0,0,41,6,114,12,1,0,0,114,159,0,0,0, + 90,12,114,101,103,105,115,116,114,121,95,107,101,121,114,25, + 1,0,0,90,4,104,107,101,121,218,8,102,105,108,101,112, + 97,116,104,114,4,0,0,0,114,4,0,0,0,114,5,0, + 0,0,218,16,95,115,101,97,114,99,104,95,114,101,103,105, + 115,116,114,121,128,5,0,0,115,22,0,0,0,0,2,9, + 1,12,2,9,1,15,1,22,1,3,1,18,1,28,1,13, + 1,9,1,122,38,87,105,110,100,111,119,115,82,101,103,105, + 115,116,114,121,70,105,110,100,101,114,46,95,115,101,97,114, + 99,104,95,114,101,103,105,115,116,114,121,78,99,4,0,0, + 0,0,0,0,0,8,0,0,0,14,0,0,0,67,0,0, + 0,115,155,0,0,0,124,0,0,106,0,0,124,1,0,131, + 1,0,125,4,0,124,4,0,100,0,0,107,8,0,114,31, + 0,100,0,0,83,121,14,0,116,1,0,124,4,0,131,1, + 0,1,87,110,22,0,4,116,2,0,107,10,0,114,69,0, + 1,1,1,100,0,0,83,89,110,1,0,88,120,78,0,116, + 3,0,131,0,0,68,93,67,0,92,2,0,125,5,0,125, + 6,0,124,4,0,106,4,0,116,5,0,124,6,0,131,1, + 0,131,1,0,114,80,0,116,6,0,124,1,0,124,5,0, + 124,1,0,124,4,0,131,2,0,100,1,0,124,4,0,131, + 2,1,125,7,0,124,7,0,83,113,80,0,87,100,0,0, + 83,41,2,78,114,218,0,0,0,41,7,114,32,1,0,0, + 114,39,0,0,0,114,40,0,0,0,114,241,0,0,0,114, + 231,0,0,0,114,232,0,0,0,114,174,0,0,0,41,8, + 114,12,1,0,0,114,159,0,0,0,114,35,0,0,0,114, + 13,1,0,0,114,31,1,0,0,114,170,0,0,0,114,126, + 0,0,0,114,178,0,0,0,114,4,0,0,0,114,4,0, + 0,0,114,5,0,0,0,114,14,1,0,0,143,5,0,0, + 115,24,0,0,0,0,2,15,1,12,1,4,1,3,1,14, + 1,13,1,9,1,22,1,21,1,21,1,9,1,122,31,87, 105,110,100,111,119,115,82,101,103,105,115,116,114,121,70,105, - 110,100,101,114,46,95,115,101,97,114,99,104,95,114,101,103, - 105,115,116,114,121,99,3,0,0,0,0,0,0,0,6,0, - 0,0,12,0,0,0,67,0,0,0,115,137,0,0,0,124, - 0,0,106,0,0,124,1,0,131,1,0,125,3,0,124,3, - 0,100,1,0,107,8,0,114,31,0,100,1,0,83,121,17, - 0,116,2,0,106,3,0,124,3,0,131,1,0,1,87,110, - 22,0,4,116,4,0,107,10,0,114,72,0,1,1,1,100, - 1,0,83,89,110,1,0,88,120,57,0,116,5,0,131,0, - 0,68,93,46,0,92,2,0,125,4,0,125,5,0,124,3, - 0,106,6,0,116,7,0,124,5,0,131,1,0,131,1,0, - 114,83,0,124,4,0,124,1,0,124,3,0,131,2,0,83, - 113,83,0,87,100,1,0,83,40,2,0,0,0,117,34,0, - 0,0,70,105,110,100,32,109,111,100,117,108,101,32,110,97, - 109,101,100,32,105,110,32,116,104,101,32,114,101,103,105,115, - 116,114,121,46,78,40,8,0,0,0,117,16,0,0,0,95, - 115,101,97,114,99,104,95,114,101,103,105,115,116,114,121,117, - 4,0,0,0,78,111,110,101,117,3,0,0,0,95,111,115, - 117,4,0,0,0,115,116,97,116,117,7,0,0,0,79,83, - 69,114,114,111,114,117,27,0,0,0,95,103,101,116,95,115, - 117,112,112,111,114,116,101,100,95,102,105,108,101,95,108,111, - 97,100,101,114,115,117,8,0,0,0,101,110,100,115,119,105, - 116,104,117,5,0,0,0,116,117,112,108,101,40,6,0,0, - 0,117,3,0,0,0,99,108,115,117,8,0,0,0,102,117, - 108,108,110,97,109,101,117,4,0,0,0,112,97,116,104,117, - 8,0,0,0,102,105,108,101,112,97,116,104,117,6,0,0, - 0,108,111,97,100,101,114,117,8,0,0,0,115,117,102,102, - 105,120,101,115,40,0,0,0,0,40,0,0,0,0,117,29, - 0,0,0,60,102,114,111,122,101,110,32,105,109,112,111,114, - 116,108,105,98,46,95,98,111,111,116,115,116,114,97,112,62, - 117,11,0,0,0,102,105,110,100,95,109,111,100,117,108,101, - 6,3,0,0,115,20,0,0,0,0,3,15,1,12,1,4, - 1,3,1,17,1,13,1,9,1,22,1,21,1,117,33,0, - 0,0,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,100,95,109,111,100, - 117,108,101,78,70,40,13,0,0,0,117,8,0,0,0,95, - 95,110,97,109,101,95,95,117,10,0,0,0,95,95,109,111, - 100,117,108,101,95,95,117,12,0,0,0,95,95,113,117,97, - 108,110,97,109,101,95,95,117,7,0,0,0,95,95,100,111, - 99,95,95,117,12,0,0,0,82,69,71,73,83,84,82,89, - 95,75,69,89,117,18,0,0,0,82,69,71,73,83,84,82, - 89,95,75,69,89,95,68,69,66,85,71,117,5,0,0,0, - 70,97,108,115,101,117,11,0,0,0,68,69,66,85,71,95, - 66,85,73,76,68,117,11,0,0,0,99,108,97,115,115,109, - 101,116,104,111,100,117,14,0,0,0,95,111,112,101,110,95, - 114,101,103,105,115,116,114,121,117,16,0,0,0,95,115,101, - 97,114,99,104,95,114,101,103,105,115,116,114,121,117,4,0, - 0,0,78,111,110,101,117,11,0,0,0,102,105,110,100,95, - 109,111,100,117,108,101,40,1,0,0,0,117,10,0,0,0, - 95,95,108,111,99,97,108,115,95,95,40,0,0,0,0,40, - 0,0,0,0,117,29,0,0,0,60,102,114,111,122,101,110, - 32,105,109,112,111,114,116,108,105,98,46,95,98,111,111,116, - 115,116,114,97,112,62,117,21,0,0,0,87,105,110,100,111, - 119,115,82,101,103,105,115,116,114,121,70,105,110,100,101,114, - 227,2,0,0,115,16,0,0,0,16,3,6,3,6,3,6, - 2,6,2,18,7,18,15,3,1,117,21,0,0,0,87,105, - 110,100,111,119,115,82,101,103,105,115,116,114,121,70,105,110, - 100,101,114,99,1,0,0,0,0,0,0,0,1,0,0,0, - 5,0,0,0,66,0,0,0,115,74,0,0,0,124,0,0, - 69,101,0,0,90,1,0,100,0,0,90,2,0,100,1,0, - 90,3,0,100,2,0,100,3,0,132,0,0,90,4,0,100, - 4,0,100,5,0,132,0,0,90,5,0,101,6,0,100,6, - 0,100,10,0,100,7,0,100,8,0,132,0,1,131,1,0, - 90,8,0,100,9,0,83,40,11,0,0,0,117,13,0,0, - 0,95,76,111,97,100,101,114,66,97,115,105,99,115,117,83, - 0,0,0,66,97,115,101,32,99,108,97,115,115,32,111,102, - 32,99,111,109,109,111,110,32,99,111,100,101,32,110,101,101, - 100,101,100,32,98,121,32,98,111,116,104,32,83,111,117,114, - 99,101,76,111,97,100,101,114,32,97,110,100,10,32,32,32, - 32,83,111,117,114,99,101,108,101,115,115,70,105,108,101,76, - 111,97,100,101,114,46,99,2,0,0,0,0,0,0,0,5, - 0,0,0,3,0,0,0,67,0,0,0,115,88,0,0,0, - 116,0,0,124,0,0,106,1,0,124,1,0,131,1,0,131, - 1,0,100,1,0,25,125,2,0,124,2,0,106,2,0,100, - 2,0,100,1,0,131,2,0,100,3,0,25,125,3,0,124, - 1,0,106,3,0,100,2,0,131,1,0,100,4,0,25,125, - 4,0,124,3,0,100,5,0,107,2,0,111,87,0,124,4, - 0,100,5,0,107,3,0,83,40,6,0,0,0,117,141,0, - 0,0,67,111,110,99,114,101,116,101,32,105,109,112,108,101, - 109,101,110,116,97,116,105,111,110,32,111,102,32,73,110,115, - 112,101,99,116,76,111,97,100,101,114,46,105,115,95,112,97, - 99,107,97,103,101,32,98,121,32,99,104,101,99,107,105,110, - 103,32,105,102,10,32,32,32,32,32,32,32,32,116,104,101, - 32,112,97,116,104,32,114,101,116,117,114,110,101,100,32,98, - 121,32,103,101,116,95,102,105,108,101,110,97,109,101,32,104, - 97,115,32,97,32,102,105,108,101,110,97,109,101,32,111,102, - 32,39,95,95,105,110,105,116,95,95,46,112,121,39,46,105, - 1,0,0,0,117,1,0,0,0,46,105,0,0,0,0,105, - 2,0,0,0,117,8,0,0,0,95,95,105,110,105,116,95, - 95,40,4,0,0,0,117,11,0,0,0,95,112,97,116,104, - 95,115,112,108,105,116,117,12,0,0,0,103,101,116,95,102, - 105,108,101,110,97,109,101,117,6,0,0,0,114,115,112,108, - 105,116,117,10,0,0,0,114,112,97,114,116,105,116,105,111, - 110,40,5,0,0,0,117,4,0,0,0,115,101,108,102,117, - 8,0,0,0,102,117,108,108,110,97,109,101,117,8,0,0, - 0,102,105,108,101,110,97,109,101,117,13,0,0,0,102,105, - 108,101,110,97,109,101,95,98,97,115,101,117,9,0,0,0, - 116,97,105,108,95,110,97,109,101,40,0,0,0,0,40,0, - 0,0,0,117,29,0,0,0,60,102,114,111,122,101,110,32, - 105,109,112,111,114,116,108,105,98,46,95,98,111,111,116,115, - 116,114,97,112,62,117,10,0,0,0,105,115,95,112,97,99, - 107,97,103,101,26,3,0,0,115,8,0,0,0,0,3,25, - 1,22,1,19,1,117,24,0,0,0,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,5,0,0,0,0,0,0,0,12,0,0,0,22, - 0,0,0,67,0,0,0,115,208,1,0,0,124,2,0,100, - 1,0,100,2,0,133,2,0,25,125,5,0,124,2,0,100, - 2,0,100,3,0,133,2,0,25,125,6,0,124,2,0,100, - 3,0,100,4,0,133,2,0,25,125,7,0,124,5,0,116, - 0,0,107,3,0,114,115,0,100,5,0,106,1,0,124,1, - 0,124,5,0,131,2,0,125,8,0,116,2,0,124,8,0, - 131,1,0,1,116,3,0,124,8,0,100,6,0,124,1,0, - 100,7,0,124,3,0,131,1,2,130,1,0,110,116,0,116, - 4,0,124,6,0,131,1,0,100,2,0,107,3,0,114,173, - 0,100,8,0,106,1,0,124,1,0,131,1,0,125,9,0, - 116,2,0,124,9,0,131,1,0,1,116,5,0,124,9,0, - 131,1,0,130,1,0,110,58,0,116,4,0,124,7,0,131, - 1,0,100,2,0,107,3,0,114,231,0,100,9,0,106,1, - 0,124,1,0,131,1,0,125,9,0,116,2,0,124,9,0, - 131,1,0,1,116,5,0,124,9,0,131,1,0,130,1,0, - 110,0,0,124,4,0,100,1,0,107,9,0,114,194,1,121, - 20,0,116,7,0,124,4,0,100,10,0,25,131,1,0,125, - 10,0,87,110,18,0,4,116,8,0,107,10,0,114,27,1, - 1,1,1,89,110,71,0,88,116,9,0,124,6,0,131,1, - 0,124,10,0,107,3,0,114,98,1,100,11,0,106,1,0, - 124,1,0,131,1,0,125,9,0,116,2,0,124,9,0,131, - 1,0,1,116,3,0,124,9,0,100,6,0,124,1,0,100, - 7,0,124,3,0,131,1,2,130,1,0,110,0,0,121,18, - 0,124,4,0,100,12,0,25,100,13,0,64,125,11,0,87, - 110,18,0,4,116,8,0,107,10,0,114,136,1,1,1,1, - 89,113,194,1,88,116,9,0,124,7,0,131,1,0,124,11, - 0,107,3,0,114,194,1,116,3,0,100,11,0,106,1,0, - 124,1,0,131,1,0,100,6,0,124,1,0,100,7,0,124, - 3,0,131,1,2,130,1,0,113,194,1,110,0,0,124,2, - 0,100,4,0,100,1,0,133,2,0,25,83,40,14,0,0, - 0,117,193,0,0,0,82,101,116,117,114,110,32,116,104,101, - 32,109,97,114,115,104,97,108,108,101,100,32,98,121,116,101, - 115,32,102,114,111,109,32,98,121,116,101,99,111,100,101,44, - 32,118,101,114,105,102,121,105,110,103,32,116,104,101,32,109, - 97,103,105,99,10,32,32,32,32,32,32,32,32,110,117,109, - 98,101,114,44,32,116,105,109,101,115,116,97,109,112,32,97, - 110,100,32,115,111,117,114,99,101,32,115,105,122,101,32,97, - 108,111,110,103,32,116,104,101,32,119,97,121,46,10,10,32, - 32,32,32,32,32,32,32,73,102,32,115,111,117,114,99,101, - 95,115,116,97,116,115,32,105,115,32,78,111,110,101,32,116, - 104,101,110,32,115,107,105,112,32,116,104,101,32,116,105,109, - 101,115,116,97,109,112,32,99,104,101,99,107,46,10,10,32, - 32,32,32,32,32,32,32,78,105,4,0,0,0,105,8,0, - 0,0,105,12,0,0,0,117,30,0,0,0,98,97,100,32, - 109,97,103,105,99,32,110,117,109,98,101,114,32,105,110,32, - 123,33,114,125,58,32,123,33,114,125,117,4,0,0,0,110, - 97,109,101,117,4,0,0,0,112,97,116,104,117,19,0,0, - 0,98,97,100,32,116,105,109,101,115,116,97,109,112,32,105, - 110,32,123,125,117,14,0,0,0,98,97,100,32,115,105,122, - 101,32,105,110,32,123,125,117,5,0,0,0,109,116,105,109, - 101,117,24,0,0,0,98,121,116,101,99,111,100,101,32,105, - 115,32,115,116,97,108,101,32,102,111,114,32,123,125,117,4, - 0,0,0,115,105,122,101,108,3,0,0,0,255,127,255,127, - 3,0,40,10,0,0,0,117,12,0,0,0,95,77,65,71, - 73,67,95,66,89,84,69,83,117,6,0,0,0,102,111,114, - 109,97,116,117,16,0,0,0,95,118,101,114,98,111,115,101, - 95,109,101,115,115,97,103,101,117,11,0,0,0,73,109,112, - 111,114,116,69,114,114,111,114,117,3,0,0,0,108,101,110, - 117,8,0,0,0,69,79,70,69,114,114,111,114,117,4,0, - 0,0,78,111,110,101,117,3,0,0,0,105,110,116,117,8, - 0,0,0,75,101,121,69,114,114,111,114,117,7,0,0,0, - 95,114,95,108,111,110,103,40,12,0,0,0,117,4,0,0, - 0,115,101,108,102,117,8,0,0,0,102,117,108,108,110,97, - 109,101,117,4,0,0,0,100,97,116,97,117,13,0,0,0, - 98,121,116,101,99,111,100,101,95,112,97,116,104,117,12,0, - 0,0,115,111,117,114,99,101,95,115,116,97,116,115,117,5, - 0,0,0,109,97,103,105,99,117,13,0,0,0,114,97,119, - 95,116,105,109,101,115,116,97,109,112,117,8,0,0,0,114, - 97,119,95,115,105,122,101,117,3,0,0,0,109,115,103,117, - 7,0,0,0,109,101,115,115,97,103,101,117,12,0,0,0, - 115,111,117,114,99,101,95,109,116,105,109,101,117,11,0,0, - 0,115,111,117,114,99,101,95,115,105,122,101,40,0,0,0, - 0,40,0,0,0,0,117,29,0,0,0,60,102,114,111,122, - 101,110,32,105,109,112,111,114,116,108,105,98,46,95,98,111, - 111,116,115,116,114,97,112,62,117,20,0,0,0,95,98,121, - 116,101,115,95,102,114,111,109,95,98,121,116,101,99,111,100, - 101,34,3,0,0,115,68,0,0,0,0,7,16,1,16,1, - 16,1,12,1,18,1,10,1,27,1,18,1,15,1,10,1, - 15,1,18,1,15,1,10,1,15,1,12,1,3,1,20,1, - 13,1,5,2,18,1,15,1,10,1,15,1,12,1,3,1, - 18,1,13,1,5,2,18,1,3,1,15,1,21,3,117,34, - 0,0,0,95,76,111,97,100,101,114,66,97,115,105,99,115, - 46,95,98,121,116,101,115,95,102,114,111,109,95,98,121,116, - 101,99,111,100,101,117,10,0,0,0,115,111,117,114,99,101, - 108,101,115,115,99,2,0,0,0,1,0,0,0,5,0,0, - 0,12,0,0,0,67,0,0,0,115,227,0,0,0,124,1, - 0,106,0,0,125,3,0,124,0,0,106,1,0,124,3,0, - 131,1,0,125,4,0,124,0,0,106,2,0,124,3,0,131, - 1,0,124,1,0,95,3,0,124,2,0,115,106,0,121,22, - 0,116,4,0,124,1,0,106,3,0,131,1,0,124,1,0, - 95,5,0,87,113,118,0,4,116,6,0,107,10,0,114,102, - 0,1,1,1,124,1,0,106,3,0,124,1,0,95,5,0, - 89,113,118,0,88,110,12,0,124,1,0,106,3,0,124,1, - 0,95,5,0,124,3,0,124,1,0,95,7,0,124,0,0, - 106,8,0,124,3,0,131,1,0,114,170,0,116,9,0,124, - 1,0,106,3,0,131,1,0,100,1,0,25,103,1,0,124, - 1,0,95,10,0,110,25,0,124,1,0,106,7,0,106,11, - 0,100,2,0,131,1,0,100,1,0,25,124,1,0,95,7, - 0,124,0,0,124,1,0,95,12,0,116,13,0,116,14,0, - 124,4,0,124,1,0,106,15,0,131,3,0,1,124,1,0, - 83,40,3,0,0,0,117,82,0,0,0,72,101,108,112,101, - 114,32,102,111,114,32,108,111,97,100,95,109,111,100,117,108, - 101,32,97,98,108,101,32,116,111,32,104,97,110,100,108,101, - 32,101,105,116,104,101,114,32,115,111,117,114,99,101,32,111, - 114,32,115,111,117,114,99,101,108,101,115,115,10,32,32,32, - 32,32,32,32,32,108,111,97,100,105,110,103,46,105,0,0, - 0,0,117,1,0,0,0,46,40,16,0,0,0,117,8,0, - 0,0,95,95,110,97,109,101,95,95,117,8,0,0,0,103, - 101,116,95,99,111,100,101,117,12,0,0,0,103,101,116,95, - 102,105,108,101,110,97,109,101,117,8,0,0,0,95,95,102, - 105,108,101,95,95,117,17,0,0,0,99,97,99,104,101,95, - 102,114,111,109,95,115,111,117,114,99,101,117,10,0,0,0, - 95,95,99,97,99,104,101,100,95,95,117,19,0,0,0,78, - 111,116,73,109,112,108,101,109,101,110,116,101,100,69,114,114, - 111,114,117,11,0,0,0,95,95,112,97,99,107,97,103,101, - 95,95,117,10,0,0,0,105,115,95,112,97,99,107,97,103, - 101,117,11,0,0,0,95,112,97,116,104,95,115,112,108,105, - 116,117,8,0,0,0,95,95,112,97,116,104,95,95,117,10, - 0,0,0,114,112,97,114,116,105,116,105,111,110,117,10,0, - 0,0,95,95,108,111,97,100,101,114,95,95,117,25,0,0, - 0,95,99,97,108,108,95,119,105,116,104,95,102,114,97,109, - 101,115,95,114,101,109,111,118,101,100,117,4,0,0,0,101, - 120,101,99,117,8,0,0,0,95,95,100,105,99,116,95,95, - 40,5,0,0,0,117,4,0,0,0,115,101,108,102,117,6, - 0,0,0,109,111,100,117,108,101,117,10,0,0,0,115,111, - 117,114,99,101,108,101,115,115,117,4,0,0,0,110,97,109, - 101,117,11,0,0,0,99,111,100,101,95,111,98,106,101,99, - 116,40,0,0,0,0,40,0,0,0,0,117,29,0,0,0, - 60,102,114,111,122,101,110,32,105,109,112,111,114,116,108,105, - 98,46,95,98,111,111,116,115,116,114,97,112,62,117,12,0, - 0,0,95,108,111,97,100,95,109,111,100,117,108,101,80,3, - 0,0,115,32,0,0,0,0,4,9,1,15,1,18,1,6, - 1,3,1,22,1,13,1,20,2,12,1,9,1,15,1,28, - 2,25,1,9,1,19,1,117,26,0,0,0,95,76,111,97, - 100,101,114,66,97,115,105,99,115,46,95,108,111,97,100,95, - 109,111,100,117,108,101,78,70,40,9,0,0,0,117,8,0, - 0,0,95,95,110,97,109,101,95,95,117,10,0,0,0,95, - 95,109,111,100,117,108,101,95,95,117,12,0,0,0,95,95, - 113,117,97,108,110,97,109,101,95,95,117,7,0,0,0,95, - 95,100,111,99,95,95,117,10,0,0,0,105,115,95,112,97, - 99,107,97,103,101,117,20,0,0,0,95,98,121,116,101,115, - 95,102,114,111,109,95,98,121,116,101,99,111,100,101,117,17, - 0,0,0,109,111,100,117,108,101,95,102,111,114,95,108,111, - 97,100,101,114,117,5,0,0,0,70,97,108,115,101,117,12, - 0,0,0,95,108,111,97,100,95,109,111,100,117,108,101,40, - 1,0,0,0,117,10,0,0,0,95,95,108,111,99,97,108, - 115,95,95,40,0,0,0,0,40,0,0,0,0,117,29,0, - 0,0,60,102,114,111,122,101,110,32,105,109,112,111,114,116, - 108,105,98,46,95,98,111,111,116,115,116,114,97,112,62,117, - 13,0,0,0,95,76,111,97,100,101,114,66,97,115,105,99, - 115,21,3,0,0,115,10,0,0,0,16,3,6,2,12,8, - 12,46,6,1,117,13,0,0,0,95,76,111,97,100,101,114, - 66,97,115,105,99,115,99,1,0,0,0,0,0,0,0,1, - 0,0,0,2,0,0,0,66,0,0,0,115,104,0,0,0, - 124,0,0,69,101,0,0,90,1,0,100,0,0,90,2,0, - 100,1,0,100,2,0,132,0,0,90,3,0,100,3,0,100, - 4,0,132,0,0,90,4,0,100,5,0,100,6,0,132,0, - 0,90,5,0,100,7,0,100,8,0,132,0,0,90,6,0, - 100,9,0,100,10,0,132,0,0,90,7,0,100,11,0,100, - 12,0,132,0,0,90,8,0,100,13,0,100,14,0,132,0, - 0,90,9,0,100,15,0,83,40,16,0,0,0,117,12,0, - 0,0,83,111,117,114,99,101,76,111,97,100,101,114,99,2, - 0,0,0,0,0,0,0,2,0,0,0,1,0,0,0,67, - 0,0,0,115,10,0,0,0,116,0,0,130,1,0,100,1, - 0,83,40,2,0,0,0,117,121,0,0,0,79,112,116,105, - 111,110,97,108,32,109,101,116,104,111,100,32,116,104,97,116, - 32,114,101,116,117,114,110,115,32,116,104,101,32,109,111,100, - 105,102,105,99,97,116,105,111,110,32,116,105,109,101,32,40, - 97,110,32,105,110,116,41,32,102,111,114,32,116,104,101,10, - 32,32,32,32,32,32,32,32,115,112,101,99,105,102,105,101, - 100,32,112,97,116,104,44,32,119,104,101,114,101,32,112,97, - 116,104,32,105,115,32,97,32,115,116,114,46,10,32,32,32, - 32,32,32,32,32,78,40,1,0,0,0,117,19,0,0,0, - 78,111,116,73,109,112,108,101,109,101,110,116,101,100,69,114, - 114,111,114,40,2,0,0,0,117,4,0,0,0,115,101,108, - 102,117,4,0,0,0,112,97,116,104,40,0,0,0,0,40, - 0,0,0,0,117,29,0,0,0,60,102,114,111,122,101,110, - 32,105,109,112,111,114,116,108,105,98,46,95,98,111,111,116, - 115,116,114,97,112,62,117,10,0,0,0,112,97,116,104,95, - 109,116,105,109,101,106,3,0,0,115,2,0,0,0,0,4, - 117,23,0,0,0,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,2,0,0,0,3,0,0,0,67,0,0, - 0,115,20,0,0,0,105,1,0,124,0,0,106,0,0,124, - 1,0,131,1,0,100,1,0,54,83,40,2,0,0,0,117, - 114,1,0,0,79,112,116,105,111,110,97,108,32,109,101,116, - 104,111,100,32,114,101,116,117,114,110,105,110,103,32,97,32, - 109,101,116,97,100,97,116,97,32,100,105,99,116,32,102,111, - 114,32,116,104,101,32,115,112,101,99,105,102,105,101,100,32, - 112,97,116,104,10,32,32,32,32,32,32,32,32,116,111,32, - 98,121,32,116,104,101,32,112,97,116,104,32,40,115,116,114, - 41,46,10,32,32,32,32,32,32,32,32,80,111,115,115,105, - 98,108,101,32,107,101,121,115,58,10,32,32,32,32,32,32, - 32,32,45,32,39,109,116,105,109,101,39,32,40,109,97,110, - 100,97,116,111,114,121,41,32,105,115,32,116,104,101,32,110, - 117,109,101,114,105,99,32,116,105,109,101,115,116,97,109,112, - 32,111,102,32,108,97,115,116,32,115,111,117,114,99,101,10, - 32,32,32,32,32,32,32,32,32,32,99,111,100,101,32,109, - 111,100,105,102,105,99,97,116,105,111,110,59,10,32,32,32, - 32,32,32,32,32,45,32,39,115,105,122,101,39,32,40,111, - 112,116,105,111,110,97,108,41,32,105,115,32,116,104,101,32, - 115,105,122,101,32,105,110,32,98,121,116,101,115,32,111,102, - 32,116,104,101,32,115,111,117,114,99,101,32,99,111,100,101, - 46,10,10,32,32,32,32,32,32,32,32,73,109,112,108,101, - 109,101,110,116,105,110,103,32,116,104,105,115,32,109,101,116, - 104,111,100,32,97,108,108,111,119,115,32,116,104,101,32,108, - 111,97,100,101,114,32,116,111,32,114,101,97,100,32,98,121, - 116,101,99,111,100,101,32,102,105,108,101,115,46,10,32,32, - 32,32,32,32,32,32,117,5,0,0,0,109,116,105,109,101, - 40,1,0,0,0,117,10,0,0,0,112,97,116,104,95,109, - 116,105,109,101,40,2,0,0,0,117,4,0,0,0,115,101, - 108,102,117,4,0,0,0,112,97,116,104,40,0,0,0,0, - 40,0,0,0,0,117,29,0,0,0,60,102,114,111,122,101, - 110,32,105,109,112,111,114,116,108,105,98,46,95,98,111,111, - 116,115,116,114,97,112,62,117,10,0,0,0,112,97,116,104, - 95,115,116,97,116,115,112,3,0,0,115,2,0,0,0,0, - 10,117,23,0,0,0,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,4,0,0,0,3,0,0,0,67,0, - 0,0,115,16,0,0,0,124,0,0,106,0,0,124,2,0, - 124,3,0,131,2,0,83,40,1,0,0,0,117,228,0,0, - 0,79,112,116,105,111,110,97,108,32,109,101,116,104,111,100, - 32,119,104,105,99,104,32,119,114,105,116,101,115,32,100,97, - 116,97,32,40,98,121,116,101,115,41,32,116,111,32,97,32, - 102,105,108,101,32,112,97,116,104,32,40,97,32,115,116,114, - 41,46,10,10,32,32,32,32,32,32,32,32,73,109,112,108, - 101,109,101,110,116,105,110,103,32,116,104,105,115,32,109,101, - 116,104,111,100,32,97,108,108,111,119,115,32,102,111,114,32, - 116,104,101,32,119,114,105,116,105,110,103,32,111,102,32,98, - 121,116,101,99,111,100,101,32,102,105,108,101,115,46,10,10, - 32,32,32,32,32,32,32,32,84,104,101,32,115,111,117,114, - 99,101,32,112,97,116,104,32,105,115,32,110,101,101,100,101, - 100,32,105,110,32,111,114,100,101,114,32,116,111,32,99,111, - 114,114,101,99,116,108,121,32,116,114,97,110,115,102,101,114, - 32,112,101,114,109,105,115,115,105,111,110,115,10,32,32,32, - 32,32,32,32,32,40,1,0,0,0,117,8,0,0,0,115, - 101,116,95,100,97,116,97,40,4,0,0,0,117,4,0,0, - 0,115,101,108,102,117,11,0,0,0,115,111,117,114,99,101, - 95,112,97,116,104,117,10,0,0,0,99,97,99,104,101,95, - 112,97,116,104,117,4,0,0,0,100,97,116,97,40,0,0, - 0,0,40,0,0,0,0,117,29,0,0,0,60,102,114,111, - 122,101,110,32,105,109,112,111,114,116,108,105,98,46,95,98, - 111,111,116,115,116,114,97,112,62,117,15,0,0,0,95,99, - 97,99,104,101,95,98,121,116,101,99,111,100,101,124,3,0, - 0,115,2,0,0,0,0,8,117,28,0,0,0,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,3,0,0,0,1,0,0,0,67,0,0,0,115,10, - 0,0,0,116,0,0,130,1,0,100,1,0,83,40,2,0, - 0,0,117,151,0,0,0,79,112,116,105,111,110,97,108,32, - 109,101,116,104,111,100,32,119,104,105,99,104,32,119,114,105, - 116,101,115,32,100,97,116,97,32,40,98,121,116,101,115,41, - 32,116,111,32,97,32,102,105,108,101,32,112,97,116,104,32, - 40,97,32,115,116,114,41,46,10,10,32,32,32,32,32,32, - 32,32,73,109,112,108,101,109,101,110,116,105,110,103,32,116, - 104,105,115,32,109,101,116,104,111,100,32,97,108,108,111,119, - 115,32,102,111,114,32,116,104,101,32,119,114,105,116,105,110, - 103,32,111,102,32,98,121,116,101,99,111,100,101,32,102,105, - 108,101,115,46,10,10,32,32,32,32,32,32,32,32,78,40, - 1,0,0,0,117,19,0,0,0,78,111,116,73,109,112,108, - 101,109,101,110,116,101,100,69,114,114,111,114,40,3,0,0, - 0,117,4,0,0,0,115,101,108,102,117,4,0,0,0,112, - 97,116,104,117,4,0,0,0,100,97,116,97,40,0,0,0, - 0,40,0,0,0,0,117,29,0,0,0,60,102,114,111,122, - 101,110,32,105,109,112,111,114,116,108,105,98,46,95,98,111, - 111,116,115,116,114,97,112,62,117,8,0,0,0,115,101,116, - 95,100,97,116,97,134,3,0,0,115,2,0,0,0,0,6, - 117,21,0,0,0,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,9,0,0,0,44,0,0,0,67,0,0,0,115, - 62,1,0,0,100,1,0,100,2,0,108,0,0,125,2,0, - 124,0,0,106,1,0,124,1,0,131,1,0,125,3,0,121, - 19,0,124,0,0,106,2,0,124,3,0,131,1,0,125,4, - 0,87,110,58,0,4,116,3,0,107,10,0,114,106,0,1, - 125,5,0,1,122,26,0,116,4,0,100,3,0,100,4,0, - 124,1,0,131,1,1,124,5,0,130,2,0,87,89,100,2, - 0,100,2,0,125,5,0,126,5,0,88,110,1,0,88,116, - 5,0,106,6,0,124,4,0,131,1,0,106,7,0,125,6, - 0,121,19,0,124,2,0,106,8,0,124,6,0,131,1,0, - 125,7,0,87,110,58,0,4,116,9,0,107,10,0,114,204, - 0,1,125,5,0,1,122,26,0,116,4,0,100,5,0,100, - 4,0,124,1,0,131,1,1,124,5,0,130,2,0,87,89, - 100,2,0,100,2,0,125,5,0,126,5,0,88,110,1,0, - 88,116,5,0,106,10,0,100,2,0,100,7,0,131,2,0, - 125,8,0,121,30,0,124,8,0,106,13,0,124,4,0,106, - 13,0,124,7,0,100,1,0,25,131,1,0,131,1,0,83, - 87,110,58,0,4,116,14,0,107,10,0,114,57,1,1,125, - 5,0,1,122,26,0,116,4,0,100,6,0,100,4,0,124, - 1,0,131,1,1,124,5,0,130,2,0,87,89,100,2,0, - 100,2,0,125,5,0,126,5,0,88,110,1,0,88,100,2, - 0,83,40,8,0,0,0,117,52,0,0,0,67,111,110,99, + 110,100,101,114,46,102,105,110,100,95,115,112,101,99,99,3, + 0,0,0,0,0,0,0,4,0,0,0,3,0,0,0,67, + 0,0,0,115,45,0,0,0,124,0,0,106,0,0,124,1, + 0,124,2,0,131,2,0,125,3,0,124,3,0,100,1,0, + 107,9,0,114,37,0,124,3,0,106,1,0,83,100,1,0, + 83,100,1,0,83,41,2,122,108,70,105,110,100,32,109,111, + 100,117,108,101,32,110,97,109,101,100,32,105,110,32,116,104, + 101,32,114,101,103,105,115,116,114,121,46,10,10,32,32,32, + 32,32,32,32,32,84,104,105,115,32,109,101,116,104,111,100, + 32,105,115,32,100,101,112,114,101,99,97,116,101,100,46,32, + 32,85,115,101,32,101,120,101,99,95,109,111,100,117,108,101, + 40,41,32,105,110,115,116,101,97,100,46,10,10,32,32,32, + 32,32,32,32,32,78,41,2,114,14,1,0,0,114,170,0, + 0,0,41,4,114,12,1,0,0,114,159,0,0,0,114,35, + 0,0,0,114,178,0,0,0,114,4,0,0,0,114,4,0, + 0,0,114,5,0,0,0,114,15,1,0,0,158,5,0,0, + 115,8,0,0,0,0,7,18,1,12,1,7,2,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,100,95,109,111,100,117,108,101, + 41,12,114,57,0,0,0,114,56,0,0,0,114,58,0,0, + 0,114,59,0,0,0,114,29,1,0,0,114,28,1,0,0, + 114,27,1,0,0,114,19,1,0,0,114,26,1,0,0,114, + 32,1,0,0,114,14,1,0,0,114,15,1,0,0,114,4, + 0,0,0,114,4,0,0,0,114,4,0,0,0,114,5,0, + 0,0,114,23,1,0,0,109,5,0,0,115,20,0,0,0, + 12,2,6,3,6,3,6,2,6,2,18,7,18,15,3,1, + 21,14,3,1,114,23,1,0,0,99,0,0,0,0,0,0, + 0,0,0,0,0,0,2,0,0,0,64,0,0,0,115,52, + 0,0,0,101,0,0,90,1,0,100,0,0,90,2,0,100, + 1,0,90,3,0,100,2,0,100,3,0,132,0,0,90,4, + 0,100,4,0,100,5,0,132,0,0,90,5,0,101,6,0, + 90,7,0,100,6,0,83,41,7,218,13,95,76,111,97,100, + 101,114,66,97,115,105,99,115,122,83,66,97,115,101,32,99, + 108,97,115,115,32,111,102,32,99,111,109,109,111,110,32,99, + 111,100,101,32,110,101,101,100,101,100,32,98,121,32,98,111, + 116,104,32,83,111,117,114,99,101,76,111,97,100,101,114,32, + 97,110,100,10,32,32,32,32,83,111,117,114,99,101,108,101, + 115,115,70,105,108,101,76,111,97,100,101,114,46,99,2,0, + 0,0,0,0,0,0,5,0,0,0,3,0,0,0,67,0, + 0,0,115,88,0,0,0,116,0,0,124,0,0,106,1,0, + 124,1,0,131,1,0,131,1,0,100,1,0,25,125,2,0, + 124,2,0,106,2,0,100,2,0,100,1,0,131,2,0,100, + 3,0,25,125,3,0,124,1,0,106,3,0,100,2,0,131, + 1,0,100,4,0,25,125,4,0,124,3,0,100,5,0,107, + 2,0,111,87,0,124,4,0,100,5,0,107,3,0,83,41, + 6,122,141,67,111,110,99,114,101,116,101,32,105,109,112,108, + 101,109,101,110,116,97,116,105,111,110,32,111,102,32,73,110, + 115,112,101,99,116,76,111,97,100,101,114,46,105,115,95,112, + 97,99,107,97,103,101,32,98,121,32,99,104,101,99,107,105, + 110,103,32,105,102,10,32,32,32,32,32,32,32,32,116,104, + 101,32,112,97,116,104,32,114,101,116,117,114,110,101,100,32, + 98,121,32,103,101,116,95,102,105,108,101,110,97,109,101,32, + 104,97,115,32,97,32,102,105,108,101,110,97,109,101,32,111, + 102,32,39,95,95,105,110,105,116,95,95,46,112,121,39,46, + 114,29,0,0,0,114,116,0,0,0,114,84,0,0,0,114, + 115,0,0,0,114,72,0,0,0,41,4,114,38,0,0,0, + 114,239,0,0,0,114,34,0,0,0,114,32,0,0,0,41, + 5,114,71,0,0,0,114,159,0,0,0,114,131,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,4,0,0,0,114, + 4,0,0,0,114,5,0,0,0,114,220,0,0,0,177,5, + 0,0,115,8,0,0,0,0,3,25,1,22,1,19,1,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,3,0,0,0,4,0,0,0,67,0,0,0,115,80, + 0,0,0,124,0,0,106,0,0,124,1,0,106,1,0,131, + 1,0,125,2,0,124,2,0,100,1,0,107,8,0,114,57, + 0,116,2,0,100,2,0,106,3,0,124,1,0,106,1,0, + 131,1,0,131,1,0,130,1,0,110,0,0,116,4,0,116, + 5,0,124,2,0,124,1,0,106,6,0,131,3,0,1,100, + 1,0,83,41,3,122,19,69,120,101,99,117,116,101,32,116, + 104,101,32,109,111,100,117,108,101,46,78,122,52,99,97,110, + 110,111,116,32,108,111,97,100,32,109,111,100,117,108,101,32, + 123,33,114,125,32,119,104,101,110,32,103,101,116,95,99,111, + 100,101,40,41,32,114,101,116,117,114,110,115,32,78,111,110, + 101,41,7,114,16,1,0,0,114,57,0,0,0,114,154,0, + 0,0,114,47,0,0,0,114,114,0,0,0,114,176,0,0, + 0,114,63,0,0,0,41,3,114,71,0,0,0,114,180,0, + 0,0,114,195,0,0,0,114,4,0,0,0,114,4,0,0, + 0,114,5,0,0,0,114,2,1,0,0,185,5,0,0,115, + 10,0,0,0,0,2,18,1,12,1,9,1,18,1,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,78,41,8,114,57,0,0, + 0,114,56,0,0,0,114,58,0,0,0,114,59,0,0,0, + 114,220,0,0,0,114,2,1,0,0,114,181,0,0,0,114, + 5,1,0,0,114,4,0,0,0,114,4,0,0,0,114,4, + 0,0,0,114,5,0,0,0,114,33,1,0,0,172,5,0, + 0,115,8,0,0,0,12,3,6,2,12,8,12,8,114,33, + 1,0,0,99,0,0,0,0,0,0,0,0,0,0,0,0, + 4,0,0,0,64,0,0,0,115,106,0,0,0,101,0,0, + 90,1,0,100,0,0,90,2,0,100,1,0,100,2,0,132, + 0,0,90,3,0,100,3,0,100,4,0,132,0,0,90,4, + 0,100,5,0,100,6,0,132,0,0,90,5,0,100,7,0, + 100,8,0,132,0,0,90,6,0,100,9,0,100,10,0,132, + 0,0,90,7,0,100,11,0,100,18,0,100,13,0,100,14, + 0,132,0,1,90,8,0,100,15,0,100,16,0,132,0,0, + 90,9,0,100,17,0,83,41,19,218,12,83,111,117,114,99, + 101,76,111,97,100,101,114,99,2,0,0,0,0,0,0,0, + 2,0,0,0,1,0,0,0,67,0,0,0,115,10,0,0, + 0,116,0,0,130,1,0,100,1,0,83,41,2,122,178,79, + 112,116,105,111,110,97,108,32,109,101,116,104,111,100,32,116, + 104,97,116,32,114,101,116,117,114,110,115,32,116,104,101,32, + 109,111,100,105,102,105,99,97,116,105,111,110,32,116,105,109, + 101,32,40,97,110,32,105,110,116,41,32,102,111,114,32,116, + 104,101,10,32,32,32,32,32,32,32,32,115,112,101,99,105, + 102,105,101,100,32,112,97,116,104,44,32,119,104,101,114,101, + 32,112,97,116,104,32,105,115,32,97,32,115,116,114,46,10, + 10,32,32,32,32,32,32,32,32,82,97,105,115,101,115,32, + 73,79,69,114,114,111,114,32,119,104,101,110,32,116,104,101, + 32,112,97,116,104,32,99,97,110,110,111,116,32,98,101,32, + 104,97,110,100,108,101,100,46,10,32,32,32,32,32,32,32, + 32,78,41,1,218,7,73,79,69,114,114,111,114,41,2,114, + 71,0,0,0,114,35,0,0,0,114,4,0,0,0,114,4, + 0,0,0,114,5,0,0,0,218,10,112,97,116,104,95,109, + 116,105,109,101,198,5,0,0,115,2,0,0,0,0,6,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,2,0,0,0,3,0,0,0,67,0,0,0,115,20,0, + 0,0,105,1,0,124,0,0,106,0,0,124,1,0,131,1, + 0,100,1,0,54,83,41,2,97,170,1,0,0,79,112,116, + 105,111,110,97,108,32,109,101,116,104,111,100,32,114,101,116, + 117,114,110,105,110,103,32,97,32,109,101,116,97,100,97,116, + 97,32,100,105,99,116,32,102,111,114,32,116,104,101,32,115, + 112,101,99,105,102,105,101,100,32,112,97,116,104,10,32,32, + 32,32,32,32,32,32,116,111,32,98,121,32,116,104,101,32, + 112,97,116,104,32,40,115,116,114,41,46,10,32,32,32,32, + 32,32,32,32,80,111,115,115,105,98,108,101,32,107,101,121, + 115,58,10,32,32,32,32,32,32,32,32,45,32,39,109,116, + 105,109,101,39,32,40,109,97,110,100,97,116,111,114,121,41, + 32,105,115,32,116,104,101,32,110,117,109,101,114,105,99,32, + 116,105,109,101,115,116,97,109,112,32,111,102,32,108,97,115, + 116,32,115,111,117,114,99,101,10,32,32,32,32,32,32,32, + 32,32,32,99,111,100,101,32,109,111,100,105,102,105,99,97, + 116,105,111,110,59,10,32,32,32,32,32,32,32,32,45,32, + 39,115,105,122,101,39,32,40,111,112,116,105,111,110,97,108, + 41,32,105,115,32,116,104,101,32,115,105,122,101,32,105,110, + 32,98,121,116,101,115,32,111,102,32,116,104,101,32,115,111, + 117,114,99,101,32,99,111,100,101,46,10,10,32,32,32,32, + 32,32,32,32,73,109,112,108,101,109,101,110,116,105,110,103, + 32,116,104,105,115,32,109,101,116,104,111,100,32,97,108,108, + 111,119,115,32,116,104,101,32,108,111,97,100,101,114,32,116, + 111,32,114,101,97,100,32,98,121,116,101,99,111,100,101,32, + 102,105,108,101,115,46,10,32,32,32,32,32,32,32,32,82, + 97,105,115,101,115,32,73,79,69,114,114,111,114,32,119,104, + 101,110,32,116,104,101,32,112,97,116,104,32,99,97,110,110, + 111,116,32,98,101,32,104,97,110,100,108,101,100,46,10,32, + 32,32,32,32,32,32,32,114,184,0,0,0,41,1,114,36, + 1,0,0,41,2,114,71,0,0,0,114,35,0,0,0,114, + 4,0,0,0,114,4,0,0,0,114,5,0,0,0,218,10, + 112,97,116,104,95,115,116,97,116,115,206,5,0,0,115,2, + 0,0,0,0,11,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,4,0,0,0,3,0,0,0,67, + 0,0,0,115,16,0,0,0,124,0,0,106,0,0,124,2, + 0,124,3,0,131,2,0,83,41,1,122,228,79,112,116,105, + 111,110,97,108,32,109,101,116,104,111,100,32,119,104,105,99, + 104,32,119,114,105,116,101,115,32,100,97,116,97,32,40,98, + 121,116,101,115,41,32,116,111,32,97,32,102,105,108,101,32, + 112,97,116,104,32,40,97,32,115,116,114,41,46,10,10,32, + 32,32,32,32,32,32,32,73,109,112,108,101,109,101,110,116, + 105,110,103,32,116,104,105,115,32,109,101,116,104,111,100,32, + 97,108,108,111,119,115,32,102,111,114,32,116,104,101,32,119, + 114,105,116,105,110,103,32,111,102,32,98,121,116,101,99,111, + 100,101,32,102,105,108,101,115,46,10,10,32,32,32,32,32, + 32,32,32,84,104,101,32,115,111,117,114,99,101,32,112,97, + 116,104,32,105,115,32,110,101,101,100,101,100,32,105,110,32, + 111,114,100,101,114,32,116,111,32,99,111,114,114,101,99,116, + 108,121,32,116,114,97,110,115,102,101,114,32,112,101,114,109, + 105,115,115,105,111,110,115,10,32,32,32,32,32,32,32,32, + 41,1,218,8,115,101,116,95,100,97,116,97,41,4,114,71, + 0,0,0,114,142,0,0,0,90,10,99,97,99,104,101,95, + 112,97,116,104,114,53,0,0,0,114,4,0,0,0,114,4, + 0,0,0,114,5,0,0,0,218,15,95,99,97,99,104,101, + 95,98,121,116,101,99,111,100,101,219,5,0,0,115,2,0, + 0,0,0,8,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,3,0,0,0,1, + 0,0,0,67,0,0,0,115,4,0,0,0,100,1,0,83, + 41,2,122,150,79,112,116,105,111,110,97,108,32,109,101,116, + 104,111,100,32,119,104,105,99,104,32,119,114,105,116,101,115, + 32,100,97,116,97,32,40,98,121,116,101,115,41,32,116,111, + 32,97,32,102,105,108,101,32,112,97,116,104,32,40,97,32, + 115,116,114,41,46,10,10,32,32,32,32,32,32,32,32,73, + 109,112,108,101,109,101,110,116,105,110,103,32,116,104,105,115, + 32,109,101,116,104,111,100,32,97,108,108,111,119,115,32,102, + 111,114,32,116,104,101,32,119,114,105,116,105,110,103,32,111, + 102,32,98,121,116,101,99,111,100,101,32,102,105,108,101,115, + 46,10,32,32,32,32,32,32,32,32,78,114,4,0,0,0, + 41,3,114,71,0,0,0,114,35,0,0,0,114,53,0,0, + 0,114,4,0,0,0,114,4,0,0,0,114,5,0,0,0, + 114,38,1,0,0,229,5,0,0,115,0,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,5,0, + 0,0,16,0,0,0,67,0,0,0,115,105,0,0,0,124, + 0,0,106,0,0,124,1,0,131,1,0,125,2,0,121,19, + 0,124,0,0,106,1,0,124,2,0,131,1,0,125,3,0, + 87,110,58,0,4,116,2,0,107,10,0,114,94,0,1,125, + 4,0,1,122,26,0,116,3,0,100,1,0,100,2,0,124, + 1,0,131,1,1,124,4,0,130,2,0,87,89,100,3,0, + 100,3,0,125,4,0,126,4,0,88,110,1,0,88,116,4, + 0,124,3,0,131,1,0,83,41,4,122,52,67,111,110,99, 114,101,116,101,32,105,109,112,108,101,109,101,110,116,97,116, 105,111,110,32,111,102,32,73,110,115,112,101,99,116,76,111, 97,100,101,114,46,103,101,116,95,115,111,117,114,99,101,46, - 105,0,0,0,0,78,117,39,0,0,0,115,111,117,114,99, - 101,32,110,111,116,32,97,118,97,105,108,97,98,108,101,32, - 116,104,114,111,117,103,104,32,103,101,116,95,100,97,116,97, - 40,41,117,4,0,0,0,110,97,109,101,117,25,0,0,0, - 70,97,105,108,101,100,32,116,111,32,100,101,116,101,99,116, - 32,101,110,99,111,100,105,110,103,117,28,0,0,0,70,97, - 105,108,101,100,32,116,111,32,100,101,99,111,100,101,32,115, - 111,117,114,99,101,32,102,105,108,101,84,40,15,0,0,0, - 117,8,0,0,0,116,111,107,101,110,105,122,101,117,12,0, - 0,0,103,101,116,95,102,105,108,101,110,97,109,101,117,8, - 0,0,0,103,101,116,95,100,97,116,97,117,7,0,0,0, - 73,79,69,114,114,111,114,117,11,0,0,0,73,109,112,111, - 114,116,69,114,114,111,114,117,3,0,0,0,95,105,111,117, - 7,0,0,0,66,121,116,101,115,73,79,117,8,0,0,0, - 114,101,97,100,108,105,110,101,117,15,0,0,0,100,101,116, - 101,99,116,95,101,110,99,111,100,105,110,103,117,11,0,0, - 0,83,121,110,116,97,120,69,114,114,111,114,117,25,0,0, - 0,73,110,99,114,101,109,101,110,116,97,108,78,101,119,108, - 105,110,101,68,101,99,111,100,101,114,117,4,0,0,0,78, - 111,110,101,117,4,0,0,0,84,114,117,101,117,6,0,0, - 0,100,101,99,111,100,101,117,18,0,0,0,85,110,105,99, - 111,100,101,68,101,99,111,100,101,69,114,114,111,114,40,9, - 0,0,0,117,4,0,0,0,115,101,108,102,117,8,0,0, - 0,102,117,108,108,110,97,109,101,117,8,0,0,0,116,111, - 107,101,110,105,122,101,117,4,0,0,0,112,97,116,104,117, - 12,0,0,0,115,111,117,114,99,101,95,98,121,116,101,115, - 117,3,0,0,0,101,120,99,117,10,0,0,0,114,101,97, - 100,115,111,117,114,99,101,117,8,0,0,0,101,110,99,111, - 100,105,110,103,117,15,0,0,0,110,101,119,108,105,110,101, - 95,100,101,99,111,100,101,114,40,0,0,0,0,40,0,0, - 0,0,117,29,0,0,0,60,102,114,111,122,101,110,32,105, - 109,112,111,114,116,108,105,98,46,95,98,111,111,116,115,116, - 114,97,112,62,117,10,0,0,0,103,101,116,95,115,111,117, - 114,99,101,143,3,0,0,115,38,0,0,0,0,2,12,1, - 15,1,3,1,19,1,18,1,9,1,31,1,18,1,3,1, - 19,1,18,1,9,1,31,1,18,1,3,1,30,1,18,1, - 9,1,117,23,0,0,0,83,111,117,114,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,12,0,0,0,45,0,0,0,67, - 0,0,0,115,52,2,0,0,124,0,0,106,0,0,124,1, - 0,131,1,0,125,2,0,100,10,0,125,3,0,121,16,0, - 116,2,0,124,2,0,131,1,0,125,4,0,87,110,24,0, - 4,116,3,0,107,10,0,114,63,0,1,1,1,100,10,0, - 125,4,0,89,110,14,1,88,121,19,0,124,0,0,106,4, - 0,124,2,0,131,1,0,125,5,0,87,110,18,0,4,116, - 3,0,107,10,0,114,103,0,1,1,1,89,110,230,0,88, - 116,5,0,124,5,0,100,1,0,25,131,1,0,125,3,0, - 121,19,0,124,0,0,106,6,0,124,4,0,131,1,0,125, - 6,0,87,110,18,0,4,116,7,0,107,10,0,114,159,0, - 1,1,1,89,110,174,0,88,121,28,0,124,0,0,106,8, - 0,124,1,0,124,6,0,124,4,0,124,5,0,131,4,0, - 125,7,0,87,110,24,0,4,116,9,0,116,10,0,102,2, - 0,107,10,0,114,214,0,1,1,1,89,110,119,0,88,116, - 11,0,100,2,0,124,4,0,124,2,0,131,3,0,1,116, - 12,0,106,13,0,124,7,0,131,1,0,125,8,0,116,14, - 0,124,8,0,116,15,0,131,2,0,114,38,1,116,16,0, - 106,17,0,124,8,0,124,2,0,131,2,0,1,116,11,0, - 100,3,0,124,4,0,131,2,0,1,124,8,0,83,100,4, - 0,125,9,0,116,9,0,124,9,0,106,18,0,124,4,0, - 131,1,0,100,5,0,124,1,0,100,6,0,124,4,0,131, - 1,2,130,1,0,124,0,0,106,6,0,124,2,0,131,1, - 0,125,10,0,116,19,0,116,20,0,124,10,0,124,2,0, - 100,7,0,100,8,0,100,11,0,131,4,1,125,11,0,116, - 11,0,100,3,0,124,2,0,131,2,0,1,116,22,0,106, - 23,0,12,114,48,2,124,4,0,100,10,0,107,9,0,114, - 48,2,124,3,0,100,10,0,107,9,0,114,48,2,116,24, - 0,116,25,0,131,1,0,125,6,0,124,6,0,106,26,0, - 116,27,0,124,3,0,131,1,0,131,1,0,1,124,6,0, - 106,26,0,116,27,0,116,28,0,124,10,0,131,1,0,131, - 1,0,131,1,0,1,124,6,0,106,26,0,116,12,0,106, - 29,0,124,11,0,131,1,0,131,1,0,1,121,36,0,124, - 0,0,106,30,0,124,2,0,124,4,0,124,6,0,131,3, - 0,1,116,11,0,100,9,0,124,4,0,131,2,0,1,87, - 113,48,2,4,116,3,0,107,10,0,114,44,2,1,1,1, - 89,113,48,2,88,110,0,0,124,11,0,83,40,12,0,0, - 0,117,190,0,0,0,67,111,110,99,114,101,116,101,32,105, - 109,112,108,101,109,101,110,116,97,116,105,111,110,32,111,102, - 32,73,110,115,112,101,99,116,76,111,97,100,101,114,46,103, - 101,116,95,99,111,100,101,46,10,10,32,32,32,32,32,32, - 32,32,82,101,97,100,105,110,103,32,111,102,32,98,121,116, - 101,99,111,100,101,32,114,101,113,117,105,114,101,115,32,112, - 97,116,104,95,115,116,97,116,115,32,116,111,32,98,101,32, - 105,109,112,108,101,109,101,110,116,101,100,46,32,84,111,32, - 119,114,105,116,101,10,32,32,32,32,32,32,32,32,98,121, - 116,101,99,111,100,101,44,32,115,101,116,95,100,97,116,97, - 32,109,117,115,116,32,97,108,115,111,32,98,101,32,105,109, - 112,108,101,109,101,110,116,101,100,46,10,10,32,32,32,32, - 32,32,32,32,117,5,0,0,0,109,116,105,109,101,117,13, - 0,0,0,123,125,32,109,97,116,99,104,101,115,32,123,125, - 117,19,0,0,0,99,111,100,101,32,111,98,106,101,99,116, - 32,102,114,111,109,32,123,125,117,21,0,0,0,78,111,110, - 45,99,111,100,101,32,111,98,106,101,99,116,32,105,110,32, - 123,125,117,4,0,0,0,110,97,109,101,117,4,0,0,0, - 112,97,116,104,117,4,0,0,0,101,120,101,99,117,12,0, - 0,0,100,111,110,116,95,105,110,104,101,114,105,116,117,10, - 0,0,0,119,114,111,116,101,32,123,33,114,125,78,84,40, - 31,0,0,0,117,12,0,0,0,103,101,116,95,102,105,108, - 101,110,97,109,101,117,4,0,0,0,78,111,110,101,117,17, - 0,0,0,99,97,99,104,101,95,102,114,111,109,95,115,111, - 117,114,99,101,117,19,0,0,0,78,111,116,73,109,112,108, - 101,109,101,110,116,101,100,69,114,114,111,114,117,10,0,0, - 0,112,97,116,104,95,115,116,97,116,115,117,3,0,0,0, - 105,110,116,117,8,0,0,0,103,101,116,95,100,97,116,97, - 117,7,0,0,0,73,79,69,114,114,111,114,117,20,0,0, - 0,95,98,121,116,101,115,95,102,114,111,109,95,98,121,116, - 101,99,111,100,101,117,11,0,0,0,73,109,112,111,114,116, - 69,114,114,111,114,117,8,0,0,0,69,79,70,69,114,114, - 111,114,117,16,0,0,0,95,118,101,114,98,111,115,101,95, - 109,101,115,115,97,103,101,117,7,0,0,0,109,97,114,115, - 104,97,108,117,5,0,0,0,108,111,97,100,115,117,10,0, - 0,0,105,115,105,110,115,116,97,110,99,101,117,10,0,0, - 0,95,99,111,100,101,95,116,121,112,101,117,4,0,0,0, - 95,105,109,112,117,16,0,0,0,95,102,105,120,95,99,111, - 95,102,105,108,101,110,97,109,101,117,6,0,0,0,102,111, - 114,109,97,116,117,25,0,0,0,95,99,97,108,108,95,119, - 105,116,104,95,102,114,97,109,101,115,95,114,101,109,111,118, - 101,100,117,7,0,0,0,99,111,109,112,105,108,101,117,4, - 0,0,0,84,114,117,101,117,3,0,0,0,115,121,115,117, - 19,0,0,0,100,111,110,116,95,119,114,105,116,101,95,98, - 121,116,101,99,111,100,101,117,9,0,0,0,98,121,116,101, - 97,114,114,97,121,117,12,0,0,0,95,77,65,71,73,67, - 95,66,89,84,69,83,117,6,0,0,0,101,120,116,101,110, - 100,117,7,0,0,0,95,119,95,108,111,110,103,117,3,0, - 0,0,108,101,110,117,5,0,0,0,100,117,109,112,115,117, - 15,0,0,0,95,99,97,99,104,101,95,98,121,116,101,99, - 111,100,101,40,12,0,0,0,117,4,0,0,0,115,101,108, - 102,117,8,0,0,0,102,117,108,108,110,97,109,101,117,11, - 0,0,0,115,111,117,114,99,101,95,112,97,116,104,117,12, - 0,0,0,115,111,117,114,99,101,95,109,116,105,109,101,117, - 13,0,0,0,98,121,116,101,99,111,100,101,95,112,97,116, - 104,117,2,0,0,0,115,116,117,4,0,0,0,100,97,116, - 97,117,10,0,0,0,98,121,116,101,115,95,100,97,116,97, - 117,5,0,0,0,102,111,117,110,100,117,3,0,0,0,109, - 115,103,117,12,0,0,0,115,111,117,114,99,101,95,98,121, - 116,101,115,117,11,0,0,0,99,111,100,101,95,111,98,106, - 101,99,116,40,0,0,0,0,40,0,0,0,0,117,29,0, - 0,0,60,102,114,111,122,101,110,32,105,109,112,111,114,116, - 108,105,98,46,95,98,111,111,116,115,116,114,97,112,62,117, - 8,0,0,0,103,101,116,95,99,111,100,101,165,3,0,0, - 115,98,0,0,0,0,7,15,1,6,1,3,1,16,1,13, - 1,11,2,3,1,19,1,13,1,5,2,16,1,3,1,19, - 1,13,1,5,2,3,1,12,1,3,1,13,1,19,1,5, - 2,9,1,7,1,15,1,15,1,16,1,6,1,7,1,4, - 2,6,1,18,1,15,1,15,1,6,1,12,1,9,1,13, - 1,22,1,12,1,12,1,19,1,25,1,22,1,3,1,19, - 1,17,1,13,1,8,1,117,21,0,0,0,83,111,117,114, - 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,2,0,0,0,2,0, - 0,0,67,0,0,0,115,13,0,0,0,124,0,0,106,0, - 0,124,1,0,131,1,0,83,40,1,0,0,0,117,0,1, - 0,0,67,111,110,99,114,101,116,101,32,105,109,112,108,101, - 109,101,110,116,97,116,105,111,110,32,111,102,32,76,111,97, - 100,101,114,46,108,111,97,100,95,109,111,100,117,108,101,46, - 10,10,32,32,32,32,32,32,32,32,82,101,113,117,105,114, - 101,115,32,69,120,101,99,117,116,105,111,110,76,111,97,100, - 101,114,46,103,101,116,95,102,105,108,101,110,97,109,101,32, - 97,110,100,32,82,101,115,111,117,114,99,101,76,111,97,100, - 101,114,46,103,101,116,95,100,97,116,97,32,116,111,32,98, - 101,10,32,32,32,32,32,32,32,32,105,109,112,108,101,109, - 101,110,116,101,100,32,116,111,32,108,111,97,100,32,115,111, - 117,114,99,101,32,99,111,100,101,46,32,85,115,101,32,111, - 102,32,98,121,116,101,99,111,100,101,32,105,115,32,100,105, - 99,116,97,116,101,100,32,98,121,32,119,104,101,116,104,101, - 114,10,32,32,32,32,32,32,32,32,103,101,116,95,99,111, - 100,101,32,117,115,101,115,47,119,114,105,116,101,115,32,98, - 121,116,101,99,111,100,101,46,10,10,32,32,32,32,32,32, - 32,32,40,1,0,0,0,117,12,0,0,0,95,108,111,97, - 100,95,109,111,100,117,108,101,40,2,0,0,0,117,4,0, - 0,0,115,101,108,102,117,8,0,0,0,102,117,108,108,110, - 97,109,101,40,0,0,0,0,40,0,0,0,0,117,29,0, - 0,0,60,102,114,111,122,101,110,32,105,109,112,111,114,116, - 108,105,98,46,95,98,111,111,116,115,116,114,97,112,62,117, - 11,0,0,0,108,111,97,100,95,109,111,100,117,108,101,227, - 3,0,0,115,2,0,0,0,0,8,117,24,0,0,0,83, - 111,117,114,99,101,76,111,97,100,101,114,46,108,111,97,100, - 95,109,111,100,117,108,101,78,40,10,0,0,0,117,8,0, - 0,0,95,95,110,97,109,101,95,95,117,10,0,0,0,95, - 95,109,111,100,117,108,101,95,95,117,12,0,0,0,95,95, - 113,117,97,108,110,97,109,101,95,95,117,10,0,0,0,112, - 97,116,104,95,109,116,105,109,101,117,10,0,0,0,112,97, - 116,104,95,115,116,97,116,115,117,15,0,0,0,95,99,97, - 99,104,101,95,98,121,116,101,99,111,100,101,117,8,0,0, - 0,115,101,116,95,100,97,116,97,117,10,0,0,0,103,101, - 116,95,115,111,117,114,99,101,117,8,0,0,0,103,101,116, - 95,99,111,100,101,117,11,0,0,0,108,111,97,100,95,109, - 111,100,117,108,101,40,1,0,0,0,117,10,0,0,0,95, - 95,108,111,99,97,108,115,95,95,40,0,0,0,0,40,0, - 0,0,0,117,29,0,0,0,60,102,114,111,122,101,110,32, - 105,109,112,111,114,116,108,105,98,46,95,98,111,111,116,115, - 116,114,97,112,62,117,12,0,0,0,83,111,117,114,99,101, - 76,111,97,100,101,114,104,3,0,0,115,14,0,0,0,16, - 2,12,6,12,12,12,10,12,9,12,22,12,62,117,12,0, - 0,0,83,111,117,114,99,101,76,111,97,100,101,114,99,1, - 0,0,0,0,0,0,0,1,0,0,0,4,0,0,0,2, - 0,0,0,115,92,0,0,0,124,0,0,69,101,0,0,90, + 122,39,115,111,117,114,99,101,32,110,111,116,32,97,118,97, + 105,108,97,98,108,101,32,116,104,114,111,117,103,104,32,103, + 101,116,95,100,97,116,97,40,41,114,67,0,0,0,78,41, + 5,114,239,0,0,0,218,8,103,101,116,95,100,97,116,97, + 114,40,0,0,0,114,154,0,0,0,114,204,0,0,0,41, + 5,114,71,0,0,0,114,159,0,0,0,114,35,0,0,0, + 114,202,0,0,0,218,3,101,120,99,114,4,0,0,0,114, + 4,0,0,0,114,5,0,0,0,114,17,1,0,0,236,5, + 0,0,115,14,0,0,0,0,2,15,1,3,1,19,1,18, + 1,9,1,31,1,122,23,83,111,117,114,99,101,76,111,97, + 100,101,114,46,103,101,116,95,115,111,117,114,99,101,218,9, + 95,111,112,116,105,109,105,122,101,114,29,0,0,0,99,3, + 0,0,0,1,0,0,0,4,0,0,0,9,0,0,0,67, + 0,0,0,115,31,0,0,0,116,0,0,116,1,0,124,1, + 0,124,2,0,100,1,0,100,2,0,100,3,0,100,4,0, + 124,3,0,131,4,2,83,41,5,122,130,82,101,116,117,114, + 110,32,116,104,101,32,99,111,100,101,32,111,98,106,101,99, + 116,32,99,111,109,112,105,108,101,100,32,102,114,111,109,32, + 115,111,117,114,99,101,46,10,10,32,32,32,32,32,32,32, + 32,84,104,101,32,39,100,97,116,97,39,32,97,114,103,117, + 109,101,110,116,32,99,97,110,32,98,101,32,97,110,121,32, + 111,98,106,101,99,116,32,116,121,112,101,32,116,104,97,116, + 32,99,111,109,112,105,108,101,40,41,32,115,117,112,112,111, + 114,116,115,46,10,32,32,32,32,32,32,32,32,114,176,0, + 0,0,218,12,100,111,110,116,95,105,110,104,101,114,105,116, + 84,114,118,0,0,0,41,2,114,114,0,0,0,218,7,99, + 111,109,112,105,108,101,41,4,114,71,0,0,0,114,53,0, + 0,0,114,35,0,0,0,114,42,1,0,0,114,4,0,0, + 0,114,4,0,0,0,114,5,0,0,0,218,14,115,111,117, + 114,99,101,95,116,111,95,99,111,100,101,246,5,0,0,115, + 4,0,0,0,0,5,18,1,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,10,0, + 0,0,43,0,0,0,67,0,0,0,115,177,1,0,0,124, + 0,0,106,0,0,124,1,0,131,1,0,125,2,0,100,1, + 0,125,3,0,121,16,0,116,1,0,124,2,0,131,1,0, + 125,4,0,87,110,24,0,4,116,2,0,107,10,0,114,63, + 0,1,1,1,100,1,0,125,4,0,89,110,202,0,88,121, + 19,0,124,0,0,106,3,0,124,2,0,131,1,0,125,5, + 0,87,110,18,0,4,116,4,0,107,10,0,114,103,0,1, + 1,1,89,110,162,0,88,116,5,0,124,5,0,100,2,0, + 25,131,1,0,125,3,0,121,19,0,124,0,0,106,6,0, + 124,4,0,131,1,0,125,6,0,87,110,18,0,4,116,7, + 0,107,10,0,114,159,0,1,1,1,89,110,106,0,88,121, + 34,0,116,8,0,124,6,0,100,3,0,124,5,0,100,4, + 0,124,1,0,100,5,0,124,4,0,131,1,3,125,7,0, + 87,110,24,0,4,116,9,0,116,10,0,102,2,0,107,10, + 0,114,220,0,1,1,1,89,110,45,0,88,116,11,0,100, + 6,0,124,4,0,124,2,0,131,3,0,1,116,12,0,124, + 7,0,100,4,0,124,1,0,100,7,0,124,4,0,100,8, + 0,124,2,0,131,1,3,83,124,0,0,106,6,0,124,2, + 0,131,1,0,125,8,0,124,0,0,106,13,0,124,8,0, + 124,2,0,131,2,0,125,9,0,116,11,0,100,9,0,124, + 2,0,131,2,0,1,116,14,0,106,15,0,12,114,173,1, + 124,4,0,100,1,0,107,9,0,114,173,1,124,3,0,100, + 1,0,107,9,0,114,173,1,116,16,0,124,9,0,124,3, + 0,116,17,0,124,8,0,131,1,0,131,3,0,125,6,0, + 121,36,0,124,0,0,106,18,0,124,2,0,124,4,0,124, + 6,0,131,3,0,1,116,11,0,100,10,0,124,4,0,131, + 2,0,1,87,113,173,1,4,116,2,0,107,10,0,114,169, + 1,1,1,1,89,113,173,1,88,110,0,0,124,9,0,83, + 41,11,122,190,67,111,110,99,114,101,116,101,32,105,109,112, + 108,101,109,101,110,116,97,116,105,111,110,32,111,102,32,73, + 110,115,112,101,99,116,76,111,97,100,101,114,46,103,101,116, + 95,99,111,100,101,46,10,10,32,32,32,32,32,32,32,32, + 82,101,97,100,105,110,103,32,111,102,32,98,121,116,101,99, + 111,100,101,32,114,101,113,117,105,114,101,115,32,112,97,116, + 104,95,115,116,97,116,115,32,116,111,32,98,101,32,105,109, + 112,108,101,109,101,110,116,101,100,46,32,84,111,32,119,114, + 105,116,101,10,32,32,32,32,32,32,32,32,98,121,116,101, + 99,111,100,101,44,32,115,101,116,95,100,97,116,97,32,109, + 117,115,116,32,97,108,115,111,32,98,101,32,105,109,112,108, + 101,109,101,110,116,101,100,46,10,10,32,32,32,32,32,32, + 32,32,78,114,184,0,0,0,114,188,0,0,0,114,67,0, + 0,0,114,35,0,0,0,122,13,123,125,32,109,97,116,99, + 104,101,115,32,123,125,114,141,0,0,0,114,142,0,0,0, + 122,19,99,111,100,101,32,111,98,106,101,99,116,32,102,114, + 111,109,32,123,125,122,10,119,114,111,116,101,32,123,33,114, + 125,41,19,114,239,0,0,0,114,132,0,0,0,114,123,0, + 0,0,114,37,1,0,0,114,35,1,0,0,114,14,0,0, + 0,114,40,1,0,0,114,40,0,0,0,114,191,0,0,0, + 114,154,0,0,0,114,187,0,0,0,114,153,0,0,0,114, + 196,0,0,0,114,45,1,0,0,114,7,0,0,0,218,19, + 100,111,110,116,95,119,114,105,116,101,95,98,121,116,101,99, + 111,100,101,114,199,0,0,0,114,31,0,0,0,114,39,1, + 0,0,41,10,114,71,0,0,0,114,159,0,0,0,114,142, + 0,0,0,114,189,0,0,0,114,141,0,0,0,218,2,115, + 116,114,53,0,0,0,218,10,98,121,116,101,115,95,100,97, + 116,97,114,202,0,0,0,90,11,99,111,100,101,95,111,98, + 106,101,99,116,114,4,0,0,0,114,4,0,0,0,114,5, + 0,0,0,114,16,1,0,0,254,5,0,0,115,78,0,0, + 0,0,7,15,1,6,1,3,1,16,1,13,1,11,2,3, + 1,19,1,13,1,5,2,16,1,3,1,19,1,13,1,5, + 2,3,1,9,1,12,1,13,1,19,1,5,2,9,1,7, + 1,15,1,6,1,7,1,15,1,18,1,13,1,22,1,12, + 1,9,1,15,1,3,1,19,1,17,1,13,1,8,1,122, + 21,83,111,117,114,99,101,76,111,97,100,101,114,46,103,101, + 116,95,99,111,100,101,78,114,139,0,0,0,41,10,114,57, + 0,0,0,114,56,0,0,0,114,58,0,0,0,114,36,1, + 0,0,114,37,1,0,0,114,39,1,0,0,114,38,1,0, + 0,114,17,1,0,0,114,45,1,0,0,114,16,1,0,0, + 114,4,0,0,0,114,4,0,0,0,114,4,0,0,0,114, + 5,0,0,0,114,34,1,0,0,196,5,0,0,115,14,0, + 0,0,12,2,12,8,12,13,12,10,12,7,12,10,18,8, + 114,34,1,0,0,99,0,0,0,0,0,0,0,0,0,0, + 0,0,4,0,0,0,0,0,0,0,115,112,0,0,0,101, + 0,0,90,1,0,100,0,0,90,2,0,100,1,0,90,3, + 0,100,2,0,100,3,0,132,0,0,90,4,0,100,4,0, + 100,5,0,132,0,0,90,5,0,100,6,0,100,7,0,132, + 0,0,90,6,0,101,7,0,135,0,0,102,1,0,100,8, + 0,100,9,0,134,0,0,131,1,0,90,8,0,101,7,0, + 100,10,0,100,11,0,132,0,0,131,1,0,90,9,0,100, + 12,0,100,13,0,132,0,0,90,10,0,135,0,0,83,41, + 14,218,10,70,105,108,101,76,111,97,100,101,114,122,103,66, + 97,115,101,32,102,105,108,101,32,108,111,97,100,101,114,32, + 99,108,97,115,115,32,119,104,105,99,104,32,105,109,112,108, + 101,109,101,110,116,115,32,116,104,101,32,108,111,97,100,101, + 114,32,112,114,111,116,111,99,111,108,32,109,101,116,104,111, + 100,115,32,116,104,97,116,10,32,32,32,32,114,101,113,117, + 105,114,101,32,102,105,108,101,32,115,121,115,116,101,109,32, + 117,115,97,103,101,46,99,3,0,0,0,0,0,0,0,3, + 0,0,0,2,0,0,0,67,0,0,0,115,22,0,0,0, + 124,1,0,124,0,0,95,0,0,124,2,0,124,0,0,95, + 1,0,100,1,0,83,41,2,122,75,67,97,99,104,101,32, + 116,104,101,32,109,111,100,117,108,101,32,110,97,109,101,32, + 97,110,100,32,116,104,101,32,112,97,116,104,32,116,111,32, + 116,104,101,32,102,105,108,101,32,102,111,117,110,100,32,98, + 121,32,116,104,101,10,32,32,32,32,32,32,32,32,102,105, + 110,100,101,114,46,78,41,2,114,67,0,0,0,114,35,0, + 0,0,41,3,114,71,0,0,0,114,159,0,0,0,114,35, + 0,0,0,114,4,0,0,0,114,4,0,0,0,114,5,0, + 0,0,114,72,0,0,0,55,6,0,0,115,4,0,0,0, + 0,3,9,1,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,2,0,0,0,2,0,0,0,67,0,0,0,115,34, + 0,0,0,124,0,0,106,0,0,124,1,0,106,0,0,107, + 2,0,111,33,0,124,0,0,106,1,0,124,1,0,106,1, + 0,107,2,0,83,41,1,78,41,2,114,225,0,0,0,114, + 63,0,0,0,41,2,114,71,0,0,0,114,228,0,0,0, + 114,4,0,0,0,114,4,0,0,0,114,5,0,0,0,114, + 230,0,0,0,61,6,0,0,115,4,0,0,0,0,1,18, + 1,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,1,0,0, + 0,3,0,0,0,67,0,0,0,115,26,0,0,0,116,0, + 0,124,0,0,106,1,0,131,1,0,116,0,0,124,0,0, + 106,2,0,131,1,0,65,83,41,1,78,41,3,218,4,104, + 97,115,104,114,67,0,0,0,114,35,0,0,0,41,1,114, + 71,0,0,0,114,4,0,0,0,114,4,0,0,0,114,5, + 0,0,0,218,8,95,95,104,97,115,104,95,95,65,6,0, + 0,115,2,0,0,0,0,1,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,2,0,0,0,3,0,0,0,3,0, + 0,0,115,22,0,0,0,116,0,0,116,1,0,124,0,0, + 131,2,0,106,2,0,124,1,0,131,1,0,83,41,1,122, + 100,76,111,97,100,32,97,32,109,111,100,117,108,101,32,102, + 114,111,109,32,97,32,102,105,108,101,46,10,10,32,32,32, + 32,32,32,32,32,84,104,105,115,32,109,101,116,104,111,100, + 32,105,115,32,100,101,112,114,101,99,97,116,101,100,46,32, + 32,85,115,101,32,101,120,101,99,95,109,111,100,117,108,101, + 40,41,32,105,110,115,116,101,97,100,46,10,10,32,32,32, + 32,32,32,32,32,41,3,218,5,115,117,112,101,114,114,49, + 1,0,0,114,5,1,0,0,41,2,114,71,0,0,0,114, + 159,0,0,0,41,1,114,225,0,0,0,114,4,0,0,0, + 114,5,0,0,0,114,5,1,0,0,68,6,0,0,115,2, + 0,0,0,0,10,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,2,0,0,0,1,0,0,0,67,0, + 0,0,115,7,0,0,0,124,0,0,106,0,0,83,41,1, + 122,58,82,101,116,117,114,110,32,116,104,101,32,112,97,116, + 104,32,116,111,32,116,104,101,32,115,111,117,114,99,101,32, + 102,105,108,101,32,97,115,32,102,111,117,110,100,32,98,121, + 32,116,104,101,32,102,105,110,100,101,114,46,41,1,114,35, + 0,0,0,41,2,114,71,0,0,0,114,159,0,0,0,114, + 4,0,0,0,114,4,0,0,0,114,5,0,0,0,114,239, + 0,0,0,80,6,0,0,115,2,0,0,0,0,3,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, + 3,0,0,0,8,0,0,0,67,0,0,0,115,41,0,0, + 0,116,0,0,106,1,0,124,1,0,100,1,0,131,2,0, + 143,17,0,125,2,0,124,2,0,106,2,0,131,0,0,83, + 87,100,2,0,81,88,100,2,0,83,41,3,122,39,82,101, + 116,117,114,110,32,116,104,101,32,100,97,116,97,32,102,114, + 111,109,32,112,97,116,104,32,97,115,32,114,97,119,32,98, + 121,116,101,115,46,218,1,114,78,41,3,114,49,0,0,0, + 114,50,0,0,0,90,4,114,101,97,100,41,3,114,71,0, + 0,0,114,35,0,0,0,114,54,0,0,0,114,4,0,0, + 0,114,4,0,0,0,114,5,0,0,0,114,40,1,0,0, + 85,6,0,0,115,4,0,0,0,0,2,21,1,122,19,70, + 105,108,101,76,111,97,100,101,114,46,103,101,116,95,100,97, + 116,97,41,11,114,57,0,0,0,114,56,0,0,0,114,58, + 0,0,0,114,59,0,0,0,114,72,0,0,0,114,230,0, + 0,0,114,51,1,0,0,114,157,0,0,0,114,5,1,0, + 0,114,239,0,0,0,114,40,1,0,0,114,4,0,0,0, + 114,4,0,0,0,41,1,114,225,0,0,0,114,5,0,0, + 0,114,49,1,0,0,50,6,0,0,115,14,0,0,0,12, + 3,6,2,12,6,12,4,12,3,24,12,18,5,114,49,1, + 0,0,99,0,0,0,0,0,0,0,0,0,0,0,0,4, + 0,0,0,64,0,0,0,115,64,0,0,0,101,0,0,90, 1,0,100,0,0,90,2,0,100,1,0,90,3,0,100,2, - 0,100,3,0,132,0,0,90,4,0,101,5,0,135,0,0, - 102,1,0,100,4,0,100,5,0,134,0,0,131,1,0,90, - 6,0,101,5,0,100,6,0,100,7,0,132,0,0,131,1, - 0,90,7,0,100,8,0,100,9,0,132,0,0,90,8,0, - 135,0,0,83,40,10,0,0,0,117,10,0,0,0,70,105, - 108,101,76,111,97,100,101,114,117,103,0,0,0,66,97,115, - 101,32,102,105,108,101,32,108,111,97,100,101,114,32,99,108, - 97,115,115,32,119,104,105,99,104,32,105,109,112,108,101,109, - 101,110,116,115,32,116,104,101,32,108,111,97,100,101,114,32, - 112,114,111,116,111,99,111,108,32,109,101,116,104,111,100,115, - 32,116,104,97,116,10,32,32,32,32,114,101,113,117,105,114, - 101,32,102,105,108,101,32,115,121,115,116,101,109,32,117,115, - 97,103,101,46,99,3,0,0,0,0,0,0,0,3,0,0, - 0,2,0,0,0,67,0,0,0,115,22,0,0,0,124,1, - 0,124,0,0,95,0,0,124,2,0,124,0,0,95,1,0, - 100,1,0,83,40,2,0,0,0,117,75,0,0,0,67,97, - 99,104,101,32,116,104,101,32,109,111,100,117,108,101,32,110, - 97,109,101,32,97,110,100,32,116,104,101,32,112,97,116,104, - 32,116,111,32,116,104,101,32,102,105,108,101,32,102,111,117, - 110,100,32,98,121,32,116,104,101,10,32,32,32,32,32,32, - 32,32,102,105,110,100,101,114,46,78,40,2,0,0,0,117, - 4,0,0,0,110,97,109,101,117,4,0,0,0,112,97,116, - 104,40,3,0,0,0,117,4,0,0,0,115,101,108,102,117, - 8,0,0,0,102,117,108,108,110,97,109,101,117,4,0,0, - 0,112,97,116,104,40,0,0,0,0,40,0,0,0,0,117, - 29,0,0,0,60,102,114,111,122,101,110,32,105,109,112,111, - 114,116,108,105,98,46,95,98,111,111,116,115,116,114,97,112, - 62,117,8,0,0,0,95,95,105,110,105,116,95,95,243,3, - 0,0,115,4,0,0,0,0,3,9,1,117,19,0,0,0, - 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,2,0,0,0, - 3,0,0,0,3,0,0,0,115,22,0,0,0,116,0,0, - 116,1,0,124,0,0,131,2,0,106,2,0,124,1,0,131, - 1,0,83,40,1,0,0,0,117,26,0,0,0,76,111,97, - 100,32,97,32,109,111,100,117,108,101,32,102,114,111,109,32, - 97,32,102,105,108,101,46,40,3,0,0,0,117,5,0,0, - 0,115,117,112,101,114,117,10,0,0,0,70,105,108,101,76, - 111,97,100,101,114,117,11,0,0,0,108,111,97,100,95,109, - 111,100,117,108,101,40,2,0,0,0,117,4,0,0,0,115, - 101,108,102,117,8,0,0,0,102,117,108,108,110,97,109,101, - 40,1,0,0,0,117,9,0,0,0,95,95,99,108,97,115, - 115,95,95,40,0,0,0,0,117,29,0,0,0,60,102,114, - 111,122,101,110,32,105,109,112,111,114,116,108,105,98,46,95, - 98,111,111,116,115,116,114,97,112,62,117,11,0,0,0,108, - 111,97,100,95,109,111,100,117,108,101,249,3,0,0,115,2, - 0,0,0,0,5,117,22,0,0,0,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,2,0,0,0,1,0,0, - 0,67,0,0,0,115,7,0,0,0,124,0,0,106,0,0, - 83,40,1,0,0,0,117,58,0,0,0,82,101,116,117,114, - 110,32,116,104,101,32,112,97,116,104,32,116,111,32,116,104, - 101,32,115,111,117,114,99,101,32,102,105,108,101,32,97,115, - 32,102,111,117,110,100,32,98,121,32,116,104,101,32,102,105, - 110,100,101,114,46,40,1,0,0,0,117,4,0,0,0,112, - 97,116,104,40,2,0,0,0,117,4,0,0,0,115,101,108, - 102,117,8,0,0,0,102,117,108,108,110,97,109,101,40,0, - 0,0,0,40,0,0,0,0,117,29,0,0,0,60,102,114, - 111,122,101,110,32,105,109,112,111,114,116,108,105,98,46,95, - 98,111,111,116,115,116,114,97,112,62,117,12,0,0,0,103, - 101,116,95,102,105,108,101,110,97,109,101,0,4,0,0,115, - 2,0,0,0,0,3,117,23,0,0,0,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,3,0,0,0,8, - 0,0,0,67,0,0,0,115,41,0,0,0,116,0,0,106, - 1,0,124,1,0,100,1,0,131,2,0,143,17,0,125,2, - 0,124,2,0,106,2,0,131,0,0,83,87,100,2,0,81, - 88,100,2,0,83,40,3,0,0,0,117,39,0,0,0,82, - 101,116,117,114,110,32,116,104,101,32,100,97,116,97,32,102, - 114,111,109,32,112,97,116,104,32,97,115,32,114,97,119,32, - 98,121,116,101,115,46,117,1,0,0,0,114,78,40,3,0, - 0,0,117,3,0,0,0,95,105,111,117,6,0,0,0,70, - 105,108,101,73,79,117,4,0,0,0,114,101,97,100,40,3, - 0,0,0,117,4,0,0,0,115,101,108,102,117,4,0,0, - 0,112,97,116,104,117,4,0,0,0,102,105,108,101,40,0, - 0,0,0,40,0,0,0,0,117,29,0,0,0,60,102,114, - 111,122,101,110,32,105,109,112,111,114,116,108,105,98,46,95, - 98,111,111,116,115,116,114,97,112,62,117,8,0,0,0,103, - 101,116,95,100,97,116,97,5,4,0,0,115,4,0,0,0, - 0,2,21,1,117,19,0,0,0,70,105,108,101,76,111,97, - 100,101,114,46,103,101,116,95,100,97,116,97,40,9,0,0, - 0,117,8,0,0,0,95,95,110,97,109,101,95,95,117,10, - 0,0,0,95,95,109,111,100,117,108,101,95,95,117,12,0, - 0,0,95,95,113,117,97,108,110,97,109,101,95,95,117,7, - 0,0,0,95,95,100,111,99,95,95,117,8,0,0,0,95, - 95,105,110,105,116,95,95,117,11,0,0,0,95,99,104,101, - 99,107,95,110,97,109,101,117,11,0,0,0,108,111,97,100, - 95,109,111,100,117,108,101,117,12,0,0,0,103,101,116,95, - 102,105,108,101,110,97,109,101,117,8,0,0,0,103,101,116, - 95,100,97,116,97,40,1,0,0,0,117,10,0,0,0,95, - 95,108,111,99,97,108,115,95,95,40,0,0,0,0,40,1, - 0,0,0,117,9,0,0,0,95,95,99,108,97,115,115,95, - 95,117,29,0,0,0,60,102,114,111,122,101,110,32,105,109, - 112,111,114,116,108,105,98,46,95,98,111,111,116,115,116,114, - 97,112,62,117,10,0,0,0,70,105,108,101,76,111,97,100, - 101,114,238,3,0,0,115,10,0,0,0,16,3,6,2,12, - 6,24,7,18,5,117,10,0,0,0,70,105,108,101,76,111, - 97,100,101,114,99,1,0,0,0,0,0,0,0,1,0,0, - 0,4,0,0,0,66,0,0,0,115,68,0,0,0,124,0, - 0,69,101,0,0,90,1,0,100,0,0,90,2,0,100,1, - 0,90,3,0,100,2,0,100,3,0,132,0,0,90,4,0, - 100,4,0,100,5,0,132,0,0,90,5,0,100,6,0,100, - 7,0,100,8,0,100,9,0,132,0,1,90,6,0,100,10, - 0,83,40,11,0,0,0,117,16,0,0,0,83,111,117,114, - 99,101,70,105,108,101,76,111,97,100,101,114,117,62,0,0, - 0,67,111,110,99,114,101,116,101,32,105,109,112,108,101,109, - 101,110,116,97,116,105,111,110,32,111,102,32,83,111,117,114, - 99,101,76,111,97,100,101,114,32,117,115,105,110,103,32,116, - 104,101,32,102,105,108,101,32,115,121,115,116,101,109,46,99, - 2,0,0,0,0,0,0,0,3,0,0,0,3,0,0,0, - 67,0,0,0,115,39,0,0,0,116,0,0,106,1,0,124, - 1,0,131,1,0,125,2,0,105,2,0,124,2,0,106,2, - 0,100,1,0,54,124,2,0,106,3,0,100,2,0,54,83, - 40,3,0,0,0,117,33,0,0,0,82,101,116,117,114,110, - 32,116,104,101,32,109,101,116,97,100,97,116,97,32,102,111, - 114,32,116,104,101,32,112,97,116,104,46,117,5,0,0,0, - 109,116,105,109,101,117,4,0,0,0,115,105,122,101,40,4, - 0,0,0,117,3,0,0,0,95,111,115,117,4,0,0,0, - 115,116,97,116,117,8,0,0,0,115,116,95,109,116,105,109, - 101,117,7,0,0,0,115,116,95,115,105,122,101,40,3,0, - 0,0,117,4,0,0,0,115,101,108,102,117,4,0,0,0, - 112,97,116,104,117,2,0,0,0,115,116,40,0,0,0,0, - 40,0,0,0,0,117,29,0,0,0,60,102,114,111,122,101, - 110,32,105,109,112,111,114,116,108,105,98,46,95,98,111,111, - 116,115,116,114,97,112,62,117,10,0,0,0,112,97,116,104, - 95,115,116,97,116,115,15,4,0,0,115,4,0,0,0,0, - 2,15,1,117,27,0,0,0,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,0,0,5,0,0,0, - 13,0,0,0,67,0,0,0,115,81,0,0,0,121,22,0, - 116,0,0,106,1,0,124,1,0,131,1,0,106,2,0,125, - 4,0,87,110,24,0,4,116,3,0,107,10,0,114,48,0, - 1,1,1,100,1,0,125,4,0,89,110,1,0,88,124,4, - 0,100,2,0,79,125,4,0,124,0,0,106,4,0,124,2, - 0,124,3,0,100,3,0,124,4,0,131,2,1,83,40,4, - 0,0,0,78,105,182,1,0,0,105,128,0,0,0,117,5, - 0,0,0,95,109,111,100,101,40,5,0,0,0,117,3,0, - 0,0,95,111,115,117,4,0,0,0,115,116,97,116,117,7, - 0,0,0,115,116,95,109,111,100,101,117,7,0,0,0,79, - 83,69,114,114,111,114,117,8,0,0,0,115,101,116,95,100, - 97,116,97,40,5,0,0,0,117,4,0,0,0,115,101,108, - 102,117,11,0,0,0,115,111,117,114,99,101,95,112,97,116, - 104,117,13,0,0,0,98,121,116,101,99,111,100,101,95,112, - 97,116,104,117,4,0,0,0,100,97,116,97,117,4,0,0, - 0,109,111,100,101,40,0,0,0,0,40,0,0,0,0,117, - 29,0,0,0,60,102,114,111,122,101,110,32,105,109,112,111, - 114,116,108,105,98,46,95,98,111,111,116,115,116,114,97,112, - 62,117,15,0,0,0,95,99,97,99,104,101,95,98,121,116, - 101,99,111,100,101,20,4,0,0,115,12,0,0,0,0,2, - 3,1,22,1,13,1,11,3,10,1,117,32,0,0,0,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,117, - 5,0,0,0,95,109,111,100,101,105,182,1,0,0,99,3, - 0,0,0,1,0,0,0,9,0,0,0,18,0,0,0,67, - 0,0,0,115,53,1,0,0,116,0,0,124,1,0,131,1, - 0,92,2,0,125,4,0,125,5,0,103,0,0,125,6,0, - 120,54,0,124,4,0,114,80,0,116,1,0,124,4,0,131, - 1,0,12,114,80,0,116,0,0,124,4,0,131,1,0,92, - 2,0,125,4,0,125,7,0,124,6,0,106,2,0,124,7, - 0,131,1,0,1,113,27,0,87,120,132,0,116,3,0,124, - 6,0,131,1,0,68,93,118,0,125,7,0,116,4,0,124, - 4,0,124,7,0,131,2,0,125,4,0,121,17,0,116,5, - 0,106,6,0,124,4,0,131,1,0,1,87,113,94,0,4, - 116,7,0,107,10,0,114,155,0,1,1,1,119,94,0,89, - 113,94,0,4,116,8,0,107,10,0,114,211,0,1,125,8, - 0,1,122,25,0,116,9,0,100,1,0,124,4,0,124,8, - 0,131,3,0,1,100,2,0,83,87,89,100,2,0,100,2, - 0,125,8,0,126,8,0,88,113,94,0,88,113,94,0,87, - 121,33,0,116,10,0,124,1,0,124,2,0,124,3,0,131, - 3,0,1,116,9,0,100,3,0,124,1,0,131,2,0,1, - 87,110,53,0,4,116,8,0,107,10,0,114,48,1,1,125, - 8,0,1,122,21,0,116,9,0,100,1,0,124,1,0,124, - 8,0,131,3,0,1,87,89,100,2,0,100,2,0,125,8, - 0,126,8,0,88,110,1,0,88,100,2,0,83,40,4,0, - 0,0,117,27,0,0,0,87,114,105,116,101,32,98,121,116, - 101,115,32,100,97,116,97,32,116,111,32,97,32,102,105,108, - 101,46,117,27,0,0,0,99,111,117,108,100,32,110,111,116, - 32,99,114,101,97,116,101,32,123,33,114,125,58,32,123,33, - 114,125,78,117,12,0,0,0,99,114,101,97,116,101,100,32, - 123,33,114,125,40,11,0,0,0,117,11,0,0,0,95,112, - 97,116,104,95,115,112,108,105,116,117,11,0,0,0,95,112, - 97,116,104,95,105,115,100,105,114,117,6,0,0,0,97,112, - 112,101,110,100,117,8,0,0,0,114,101,118,101,114,115,101, - 100,117,10,0,0,0,95,112,97,116,104,95,106,111,105,110, - 117,3,0,0,0,95,111,115,117,5,0,0,0,109,107,100, - 105,114,117,15,0,0,0,70,105,108,101,69,120,105,115,116, - 115,69,114,114,111,114,117,7,0,0,0,79,83,69,114,114, - 111,114,117,16,0,0,0,95,118,101,114,98,111,115,101,95, - 109,101,115,115,97,103,101,117,13,0,0,0,95,119,114,105, - 116,101,95,97,116,111,109,105,99,40,9,0,0,0,117,4, - 0,0,0,115,101,108,102,117,4,0,0,0,112,97,116,104, - 117,4,0,0,0,100,97,116,97,117,5,0,0,0,95,109, - 111,100,101,117,6,0,0,0,112,97,114,101,110,116,117,8, - 0,0,0,102,105,108,101,110,97,109,101,117,10,0,0,0, - 112,97,116,104,95,112,97,114,116,115,117,4,0,0,0,112, - 97,114,116,117,3,0,0,0,101,120,99,40,0,0,0,0, - 40,0,0,0,0,117,29,0,0,0,60,102,114,111,122,101, - 110,32,105,109,112,111,114,116,108,105,98,46,95,98,111,111, - 116,115,116,114,97,112,62,117,8,0,0,0,115,101,116,95, - 100,97,116,97,31,4,0,0,115,38,0,0,0,0,2,18, - 1,6,2,22,1,18,1,17,2,19,1,15,1,3,1,17, - 1,13,2,7,1,18,3,16,1,27,1,3,1,16,1,17, - 1,18,2,117,25,0,0,0,83,111,117,114,99,101,70,105, + 0,100,3,0,132,0,0,90,4,0,100,4,0,100,5,0, + 132,0,0,90,5,0,100,6,0,100,7,0,100,8,0,100, + 9,0,132,0,1,90,6,0,100,10,0,83,41,11,114,9, + 1,0,0,122,62,67,111,110,99,114,101,116,101,32,105,109, + 112,108,101,109,101,110,116,97,116,105,111,110,32,111,102,32, + 83,111,117,114,99,101,76,111,97,100,101,114,32,117,115,105, + 110,103,32,116,104,101,32,102,105,108,101,32,115,121,115,116, + 101,109,46,99,2,0,0,0,0,0,0,0,3,0,0,0, + 3,0,0,0,67,0,0,0,115,36,0,0,0,116,0,0, + 124,1,0,131,1,0,125,2,0,105,2,0,124,2,0,106, + 1,0,100,1,0,54,124,2,0,106,2,0,100,2,0,54, + 83,41,3,122,33,82,101,116,117,114,110,32,116,104,101,32, + 109,101,116,97,100,97,116,97,32,102,111,114,32,116,104,101, + 32,112,97,116,104,46,114,184,0,0,0,114,185,0,0,0, + 41,3,114,39,0,0,0,218,8,115,116,95,109,116,105,109, + 101,90,7,115,116,95,115,105,122,101,41,3,114,71,0,0, + 0,114,35,0,0,0,114,47,1,0,0,114,4,0,0,0, + 114,4,0,0,0,114,5,0,0,0,114,37,1,0,0,95, + 6,0,0,115,4,0,0,0,0,2,12,1,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, + 0,0,5,0,0,0,5,0,0,0,67,0,0,0,115,34, + 0,0,0,116,0,0,124,1,0,131,1,0,125,4,0,124, + 0,0,106,1,0,124,2,0,124,3,0,100,1,0,124,4, + 0,131,2,1,83,41,2,78,218,5,95,109,111,100,101,41, + 2,114,145,0,0,0,114,38,1,0,0,41,5,114,71,0, + 0,0,114,142,0,0,0,114,141,0,0,0,114,53,0,0, + 0,114,42,0,0,0,114,4,0,0,0,114,4,0,0,0, + 114,5,0,0,0,114,39,1,0,0,100,6,0,0,115,4, + 0,0,0,0,2,12,1,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,55,1,0,0,105,182, + 1,0,0,99,3,0,0,0,1,0,0,0,9,0,0,0, + 17,0,0,0,67,0,0,0,115,53,1,0,0,116,0,0, + 124,1,0,131,1,0,92,2,0,125,4,0,125,5,0,103, + 0,0,125,6,0,120,54,0,124,4,0,114,80,0,116,1, + 0,124,4,0,131,1,0,12,114,80,0,116,0,0,124,4, + 0,131,1,0,92,2,0,125,4,0,125,7,0,124,6,0, + 106,2,0,124,7,0,131,1,0,1,113,27,0,87,120,132, + 0,116,3,0,124,6,0,131,1,0,68,93,118,0,125,7, + 0,116,4,0,124,4,0,124,7,0,131,2,0,125,4,0, + 121,17,0,116,5,0,106,6,0,124,4,0,131,1,0,1, + 87,113,94,0,4,116,7,0,107,10,0,114,155,0,1,1, + 1,119,94,0,89,113,94,0,4,116,8,0,107,10,0,114, + 211,0,1,125,8,0,1,122,25,0,116,9,0,100,1,0, + 124,4,0,124,8,0,131,3,0,1,100,2,0,83,87,89, + 100,2,0,100,2,0,125,8,0,126,8,0,88,113,94,0, + 88,113,94,0,87,121,33,0,116,10,0,124,1,0,124,2, + 0,124,3,0,131,3,0,1,116,9,0,100,3,0,124,1, + 0,131,2,0,1,87,110,53,0,4,116,8,0,107,10,0, + 114,48,1,1,125,8,0,1,122,21,0,116,9,0,100,1, + 0,124,1,0,124,8,0,131,3,0,1,87,89,100,2,0, + 100,2,0,125,8,0,126,8,0,88,110,1,0,88,100,2, + 0,83,41,4,122,27,87,114,105,116,101,32,98,121,116,101, + 115,32,100,97,116,97,32,116,111,32,97,32,102,105,108,101, + 46,122,27,99,111,117,108,100,32,110,111,116,32,99,114,101, + 97,116,101,32,123,33,114,125,58,32,123,33,114,125,78,122, + 12,99,114,101,97,116,101,100,32,123,33,114,125,41,11,114, + 38,0,0,0,114,46,0,0,0,114,224,0,0,0,114,33, + 0,0,0,114,28,0,0,0,114,3,0,0,0,90,5,109, + 107,100,105,114,218,15,70,105,108,101,69,120,105,115,116,115, + 69,114,114,111,114,114,40,0,0,0,114,153,0,0,0,114, + 55,0,0,0,41,9,114,71,0,0,0,114,35,0,0,0, + 114,53,0,0,0,114,55,1,0,0,114,234,0,0,0,114, + 131,0,0,0,114,27,0,0,0,114,23,0,0,0,114,41, + 1,0,0,114,4,0,0,0,114,4,0,0,0,114,5,0, + 0,0,114,38,1,0,0,105,6,0,0,115,38,0,0,0, + 0,2,18,1,6,2,22,1,18,1,17,2,19,1,15,1, + 3,1,17,1,13,2,7,1,18,3,16,1,27,1,3,1, + 16,1,17,1,18,2,122,25,83,111,117,114,99,101,70,105, 108,101,76,111,97,100,101,114,46,115,101,116,95,100,97,116, - 97,78,40,7,0,0,0,117,8,0,0,0,95,95,110,97, - 109,101,95,95,117,10,0,0,0,95,95,109,111,100,117,108, - 101,95,95,117,12,0,0,0,95,95,113,117,97,108,110,97, - 109,101,95,95,117,7,0,0,0,95,95,100,111,99,95,95, - 117,10,0,0,0,112,97,116,104,95,115,116,97,116,115,117, - 15,0,0,0,95,99,97,99,104,101,95,98,121,116,101,99, - 111,100,101,117,8,0,0,0,115,101,116,95,100,97,116,97, - 40,1,0,0,0,117,10,0,0,0,95,95,108,111,99,97, - 108,115,95,95,40,0,0,0,0,40,0,0,0,0,117,29, - 0,0,0,60,102,114,111,122,101,110,32,105,109,112,111,114, - 116,108,105,98,46,95,98,111,111,116,115,116,114,97,112,62, - 117,16,0,0,0,83,111,117,114,99,101,70,105,108,101,76, - 111,97,100,101,114,11,4,0,0,115,8,0,0,0,16,2, - 6,2,12,5,12,11,117,16,0,0,0,83,111,117,114,99, - 101,70,105,108,101,76,111,97,100,101,114,99,1,0,0,0, - 0,0,0,0,1,0,0,0,2,0,0,0,66,0,0,0, - 115,62,0,0,0,124,0,0,69,101,0,0,90,1,0,100, - 0,0,90,2,0,100,1,0,90,3,0,100,2,0,100,3, - 0,132,0,0,90,4,0,100,4,0,100,5,0,132,0,0, - 90,5,0,100,6,0,100,7,0,132,0,0,90,6,0,100, - 8,0,83,40,9,0,0,0,117,20,0,0,0,83,111,117, - 114,99,101,108,101,115,115,70,105,108,101,76,111,97,100,101, - 114,117,45,0,0,0,76,111,97,100,101,114,32,119,104,105, - 99,104,32,104,97,110,100,108,101,115,32,115,111,117,114,99, - 101,108,101,115,115,32,102,105,108,101,32,105,109,112,111,114, - 116,115,46,99,2,0,0,0,0,0,0,0,2,0,0,0, - 4,0,0,0,67,0,0,0,115,19,0,0,0,124,0,0, - 106,0,0,124,1,0,100,1,0,100,2,0,131,1,1,83, - 40,3,0,0,0,78,117,10,0,0,0,115,111,117,114,99, - 101,108,101,115,115,84,40,2,0,0,0,117,12,0,0,0, - 95,108,111,97,100,95,109,111,100,117,108,101,117,4,0,0, - 0,84,114,117,101,40,2,0,0,0,117,4,0,0,0,115, - 101,108,102,117,8,0,0,0,102,117,108,108,110,97,109,101, - 40,0,0,0,0,40,0,0,0,0,117,29,0,0,0,60, - 102,114,111,122,101,110,32,105,109,112,111,114,116,108,105,98, - 46,95,98,111,111,116,115,116,114,97,112,62,117,11,0,0, - 0,108,111,97,100,95,109,111,100,117,108,101,64,4,0,0, - 115,2,0,0,0,0,1,117,32,0,0,0,83,111,117,114, - 99,101,108,101,115,115,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,6,0,0,0,6,0,0,0,67,0,0, - 0,115,138,0,0,0,124,0,0,106,0,0,124,1,0,131, - 1,0,125,2,0,124,0,0,106,1,0,124,2,0,131,1, - 0,125,3,0,124,0,0,106,2,0,124,1,0,124,3,0, - 124,2,0,100,0,0,131,4,0,125,4,0,116,4,0,106, - 5,0,124,4,0,131,1,0,125,5,0,116,6,0,124,5, - 0,116,7,0,131,2,0,114,101,0,116,8,0,100,1,0, - 124,2,0,131,2,0,1,124,5,0,83,116,9,0,100,2, - 0,106,10,0,124,2,0,131,1,0,100,3,0,124,1,0, - 100,4,0,124,2,0,131,1,2,130,1,0,100,0,0,83, - 40,5,0,0,0,78,117,21,0,0,0,99,111,100,101,32, - 111,98,106,101,99,116,32,102,114,111,109,32,123,33,114,125, - 117,21,0,0,0,78,111,110,45,99,111,100,101,32,111,98, - 106,101,99,116,32,105,110,32,123,125,117,4,0,0,0,110, - 97,109,101,117,4,0,0,0,112,97,116,104,40,11,0,0, - 0,117,12,0,0,0,103,101,116,95,102,105,108,101,110,97, - 109,101,117,8,0,0,0,103,101,116,95,100,97,116,97,117, - 20,0,0,0,95,98,121,116,101,115,95,102,114,111,109,95, - 98,121,116,101,99,111,100,101,117,4,0,0,0,78,111,110, - 101,117,7,0,0,0,109,97,114,115,104,97,108,117,5,0, - 0,0,108,111,97,100,115,117,10,0,0,0,105,115,105,110, - 115,116,97,110,99,101,117,10,0,0,0,95,99,111,100,101, - 95,116,121,112,101,117,16,0,0,0,95,118,101,114,98,111, - 115,101,95,109,101,115,115,97,103,101,117,11,0,0,0,73, - 109,112,111,114,116,69,114,114,111,114,117,6,0,0,0,102, - 111,114,109,97,116,40,6,0,0,0,117,4,0,0,0,115, - 101,108,102,117,8,0,0,0,102,117,108,108,110,97,109,101, - 117,4,0,0,0,112,97,116,104,117,4,0,0,0,100,97, - 116,97,117,10,0,0,0,98,121,116,101,115,95,100,97,116, - 97,117,5,0,0,0,102,111,117,110,100,40,0,0,0,0, - 40,0,0,0,0,117,29,0,0,0,60,102,114,111,122,101, - 110,32,105,109,112,111,114,116,108,105,98,46,95,98,111,111, - 116,115,116,114,97,112,62,117,8,0,0,0,103,101,116,95, - 99,111,100,101,67,4,0,0,115,18,0,0,0,0,1,15, - 1,15,1,24,1,15,1,15,1,13,1,4,2,18,1,117, - 29,0,0,0,83,111,117,114,99,101,108,101,115,115,70,105, + 97,78,41,7,114,57,0,0,0,114,56,0,0,0,114,58, + 0,0,0,114,59,0,0,0,114,37,1,0,0,114,39,1, + 0,0,114,38,1,0,0,114,4,0,0,0,114,4,0,0, + 0,114,4,0,0,0,114,5,0,0,0,114,9,1,0,0, + 91,6,0,0,115,8,0,0,0,12,2,6,2,12,5,12, + 5,114,9,1,0,0,99,0,0,0,0,0,0,0,0,0, + 0,0,0,2,0,0,0,64,0,0,0,115,46,0,0,0, + 101,0,0,90,1,0,100,0,0,90,2,0,100,1,0,90, + 3,0,100,2,0,100,3,0,132,0,0,90,4,0,100,4, + 0,100,5,0,132,0,0,90,5,0,100,6,0,83,41,7, + 114,8,1,0,0,122,45,76,111,97,100,101,114,32,119,104, + 105,99,104,32,104,97,110,100,108,101,115,32,115,111,117,114, + 99,101,108,101,115,115,32,102,105,108,101,32,105,109,112,111, + 114,116,115,46,99,2,0,0,0,0,0,0,0,5,0,0, + 0,6,0,0,0,67,0,0,0,115,76,0,0,0,124,0, + 0,106,0,0,124,1,0,131,1,0,125,2,0,124,0,0, + 106,1,0,124,2,0,131,1,0,125,3,0,116,2,0,124, + 3,0,100,1,0,124,1,0,100,2,0,124,2,0,131,1, + 2,125,4,0,116,3,0,124,4,0,100,1,0,124,1,0, + 100,3,0,124,2,0,131,1,2,83,41,4,78,114,67,0, + 0,0,114,35,0,0,0,114,141,0,0,0,41,4,114,239, + 0,0,0,114,40,1,0,0,114,191,0,0,0,114,196,0, + 0,0,41,5,114,71,0,0,0,114,159,0,0,0,114,35, + 0,0,0,114,53,0,0,0,114,48,1,0,0,114,4,0, + 0,0,114,4,0,0,0,114,5,0,0,0,114,16,1,0, + 0,138,6,0,0,115,8,0,0,0,0,1,15,1,15,1, + 24,1,122,29,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,99,111,100, 101,99,2,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,1,0,83,40, - 2,0,0,0,117,39,0,0,0,82,101,116,117,114,110,32, - 78,111,110,101,32,97,115,32,116,104,101,114,101,32,105,115, - 32,110,111,32,115,111,117,114,99,101,32,99,111,100,101,46, - 78,40,1,0,0,0,117,4,0,0,0,78,111,110,101,40, - 2,0,0,0,117,4,0,0,0,115,101,108,102,117,8,0, - 0,0,102,117,108,108,110,97,109,101,40,0,0,0,0,40, - 0,0,0,0,117,29,0,0,0,60,102,114,111,122,101,110, - 32,105,109,112,111,114,116,108,105,98,46,95,98,111,111,116, - 115,116,114,97,112,62,117,10,0,0,0,103,101,116,95,115, - 111,117,114,99,101,79,4,0,0,115,2,0,0,0,0,2, - 117,31,0,0,0,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,40,7,0,0,0,117,8,0,0,0,95, - 95,110,97,109,101,95,95,117,10,0,0,0,95,95,109,111, - 100,117,108,101,95,95,117,12,0,0,0,95,95,113,117,97, - 108,110,97,109,101,95,95,117,7,0,0,0,95,95,100,111, - 99,95,95,117,11,0,0,0,108,111,97,100,95,109,111,100, - 117,108,101,117,8,0,0,0,103,101,116,95,99,111,100,101, - 117,10,0,0,0,103,101,116,95,115,111,117,114,99,101,40, - 1,0,0,0,117,10,0,0,0,95,95,108,111,99,97,108, - 115,95,95,40,0,0,0,0,40,0,0,0,0,117,29,0, - 0,0,60,102,114,111,122,101,110,32,105,109,112,111,114,116, - 108,105,98,46,95,98,111,111,116,115,116,114,97,112,62,117, - 20,0,0,0,83,111,117,114,99,101,108,101,115,115,70,105, - 108,101,76,111,97,100,101,114,60,4,0,0,115,8,0,0, - 0,16,2,6,2,12,3,12,12,117,20,0,0,0,83,111, - 117,114,99,101,108,101,115,115,70,105,108,101,76,111,97,100, - 101,114,99,1,0,0,0,0,0,0,0,1,0,0,0,5, - 0,0,0,66,0,0,0,115,104,0,0,0,124,0,0,69, - 101,0,0,90,1,0,100,0,0,90,2,0,100,1,0,90, - 3,0,100,2,0,100,3,0,132,0,0,90,4,0,101,5, - 0,101,6,0,101,7,0,100,4,0,100,5,0,132,0,0, - 131,1,0,131,1,0,131,1,0,90,8,0,100,6,0,100, - 7,0,132,0,0,90,9,0,100,8,0,100,9,0,132,0, - 0,90,10,0,100,10,0,100,11,0,132,0,0,90,11,0, - 100,12,0,83,40,13,0,0,0,117,19,0,0,0,69,120, - 116,101,110,115,105,111,110,70,105,108,101,76,111,97,100,101, - 114,117,93,0,0,0,76,111,97,100,101,114,32,102,111,114, - 32,101,120,116,101,110,115,105,111,110,32,109,111,100,117,108, - 101,115,46,10,10,32,32,32,32,84,104,101,32,99,111,110, - 115,116,114,117,99,116,111,114,32,105,115,32,100,101,115,105, - 103,110,101,100,32,116,111,32,119,111,114,107,32,119,105,116, - 104,32,70,105,108,101,70,105,110,100,101,114,46,10,10,32, - 32,32,32,99,3,0,0,0,0,0,0,0,3,0,0,0, - 2,0,0,0,67,0,0,0,115,22,0,0,0,124,1,0, - 124,0,0,95,0,0,124,2,0,124,0,0,95,1,0,100, - 0,0,83,40,1,0,0,0,78,40,2,0,0,0,117,4, - 0,0,0,110,97,109,101,117,4,0,0,0,112,97,116,104, - 40,3,0,0,0,117,4,0,0,0,115,101,108,102,117,4, - 0,0,0,110,97,109,101,117,4,0,0,0,112,97,116,104, - 40,0,0,0,0,40,0,0,0,0,117,29,0,0,0,60, - 102,114,111,122,101,110,32,105,109,112,111,114,116,108,105,98, - 46,95,98,111,111,116,115,116,114,97,112,62,117,8,0,0, - 0,95,95,105,110,105,116,95,95,96,4,0,0,115,4,0, - 0,0,0,1,9,1,117,28,0,0,0,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, - 4,0,0,0,10,0,0,0,67,0,0,0,115,175,0,0, - 0,124,1,0,116,0,0,106,1,0,107,6,0,125,2,0, - 121,107,0,116,2,0,116,3,0,106,4,0,124,1,0,124, - 0,0,106,5,0,131,3,0,125,3,0,116,6,0,100,1, - 0,124,0,0,106,5,0,131,2,0,1,124,0,0,106,7, - 0,124,1,0,131,1,0,114,117,0,116,8,0,124,3,0, - 100,2,0,131,2,0,12,114,117,0,116,9,0,124,0,0, - 106,5,0,131,1,0,100,3,0,25,103,1,0,124,3,0, - 95,10,0,110,0,0,124,3,0,83,87,110,46,0,1,1, - 1,124,2,0,12,114,163,0,124,1,0,116,0,0,106,1, - 0,107,6,0,114,163,0,116,0,0,106,1,0,124,1,0, - 61,110,0,0,130,0,0,89,110,1,0,88,100,4,0,83, - 40,5,0,0,0,117,25,0,0,0,76,111,97,100,32,97, - 110,32,101,120,116,101,110,115,105,111,110,32,109,111,100,117, - 108,101,46,117,33,0,0,0,101,120,116,101,110,115,105,111, - 110,32,109,111,100,117,108,101,32,108,111,97,100,101,100,32, - 102,114,111,109,32,123,33,114,125,117,8,0,0,0,95,95, - 112,97,116,104,95,95,105,0,0,0,0,78,40,11,0,0, - 0,117,3,0,0,0,115,121,115,117,7,0,0,0,109,111, - 100,117,108,101,115,117,25,0,0,0,95,99,97,108,108,95, - 119,105,116,104,95,102,114,97,109,101,115,95,114,101,109,111, - 118,101,100,117,4,0,0,0,95,105,109,112,117,12,0,0, - 0,108,111,97,100,95,100,121,110,97,109,105,99,117,4,0, - 0,0,112,97,116,104,117,16,0,0,0,95,118,101,114,98, - 111,115,101,95,109,101,115,115,97,103,101,117,10,0,0,0, - 105,115,95,112,97,99,107,97,103,101,117,7,0,0,0,104, - 97,115,97,116,116,114,117,11,0,0,0,95,112,97,116,104, - 95,115,112,108,105,116,117,8,0,0,0,95,95,112,97,116, - 104,95,95,40,4,0,0,0,117,4,0,0,0,115,101,108, - 102,117,8,0,0,0,102,117,108,108,110,97,109,101,117,9, - 0,0,0,105,115,95,114,101,108,111,97,100,117,6,0,0, - 0,109,111,100,117,108,101,40,0,0,0,0,40,0,0,0, - 0,117,29,0,0,0,60,102,114,111,122,101,110,32,105,109, - 112,111,114,116,108,105,98,46,95,98,111,111,116,115,116,114, - 97,112,62,117,11,0,0,0,108,111,97,100,95,109,111,100, - 117,108,101,100,4,0,0,115,24,0,0,0,0,5,15,1, - 3,1,9,1,15,1,16,1,31,1,28,1,8,1,3,1, - 22,1,13,1,117,31,0,0,0,69,120,116,101,110,115,105, - 111,110,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,2,0,0,0,4,0,0,0,3,0,0,0,115,48,0, - 0,0,116,0,0,124,0,0,106,1,0,131,1,0,100,1, - 0,25,137,0,0,116,2,0,135,0,0,102,1,0,100,2, - 0,100,3,0,134,0,0,116,3,0,68,131,1,0,131,1, - 0,83,40,4,0,0,0,117,49,0,0,0,82,101,116,117, - 114,110,32,84,114,117,101,32,105,102,32,116,104,101,32,101, - 120,116,101,110,115,105,111,110,32,109,111,100,117,108,101,32, - 105,115,32,97,32,112,97,99,107,97,103,101,46,105,1,0, - 0,0,99,1,0,0,0,0,0,0,0,2,0,0,0,4, - 0,0,0,51,0,0,0,115,31,0,0,0,124,0,0,93, - 21,0,125,1,0,136,0,0,100,0,0,124,1,0,23,107, - 2,0,86,1,113,3,0,100,1,0,83,40,2,0,0,0, - 117,8,0,0,0,95,95,105,110,105,116,95,95,78,40,0, - 0,0,0,40,2,0,0,0,117,2,0,0,0,46,48,117, - 6,0,0,0,115,117,102,102,105,120,40,1,0,0,0,117, - 9,0,0,0,102,105,108,101,95,110,97,109,101,40,0,0, - 0,0,117,29,0,0,0,60,102,114,111,122,101,110,32,105, - 109,112,111,114,116,108,105,98,46,95,98,111,111,116,115,116, - 114,97,112,62,117,9,0,0,0,60,103,101,110,101,120,112, - 114,62,121,4,0,0,115,2,0,0,0,6,1,117,49,0, - 0,0,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,40,4,0,0,0,117,11,0,0,0,95,112,97, - 116,104,95,115,112,108,105,116,117,4,0,0,0,112,97,116, - 104,117,3,0,0,0,97,110,121,117,18,0,0,0,69,88, - 84,69,78,83,73,79,78,95,83,85,70,70,73,88,69,83, - 40,2,0,0,0,117,4,0,0,0,115,101,108,102,117,8, - 0,0,0,102,117,108,108,110,97,109,101,40,0,0,0,0, - 40,1,0,0,0,117,9,0,0,0,102,105,108,101,95,110, - 97,109,101,117,29,0,0,0,60,102,114,111,122,101,110,32, - 105,109,112,111,114,116,108,105,98,46,95,98,111,111,116,115, - 116,114,97,112,62,117,10,0,0,0,105,115,95,112,97,99, - 107,97,103,101,118,4,0,0,115,6,0,0,0,0,2,19, - 1,18,1,117,30,0,0,0,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,99,2,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,1,0,83,40,2,0,0,0,117,63,0,0,0,82,101, - 116,117,114,110,32,78,111,110,101,32,97,115,32,97,110,32, - 101,120,116,101,110,115,105,111,110,32,109,111,100,117,108,101, - 32,99,97,110,110,111,116,32,99,114,101,97,116,101,32,97, - 32,99,111,100,101,32,111,98,106,101,99,116,46,78,40,1, - 0,0,0,117,4,0,0,0,78,111,110,101,40,2,0,0, - 0,117,4,0,0,0,115,101,108,102,117,8,0,0,0,102, - 117,108,108,110,97,109,101,40,0,0,0,0,40,0,0,0, - 0,117,29,0,0,0,60,102,114,111,122,101,110,32,105,109, - 112,111,114,116,108,105,98,46,95,98,111,111,116,115,116,114, - 97,112,62,117,8,0,0,0,103,101,116,95,99,111,100,101, - 124,4,0,0,115,2,0,0,0,0,2,117,28,0,0,0, - 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,2,0,0,0,1,0,0,0,67,0,0, - 0,115,4,0,0,0,100,1,0,83,40,2,0,0,0,117, - 53,0,0,0,82,101,116,117,114,110,32,78,111,110,101,32, + 0,0,67,0,0,0,115,4,0,0,0,100,1,0,83,41, + 2,122,39,82,101,116,117,114,110,32,78,111,110,101,32,97, + 115,32,116,104,101,114,101,32,105,115,32,110,111,32,115,111, + 117,114,99,101,32,99,111,100,101,46,78,114,4,0,0,0, + 41,2,114,71,0,0,0,114,159,0,0,0,114,4,0,0, + 0,114,4,0,0,0,114,5,0,0,0,114,17,1,0,0, + 144,6,0,0,115,2,0,0,0,0,2,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, + 57,0,0,0,114,56,0,0,0,114,58,0,0,0,114,59, + 0,0,0,114,16,1,0,0,114,17,1,0,0,114,4,0, + 0,0,114,4,0,0,0,114,4,0,0,0,114,5,0,0, + 0,114,8,1,0,0,134,6,0,0,115,6,0,0,0,12, + 2,6,2,12,6,114,8,1,0,0,99,0,0,0,0,0, + 0,0,0,0,0,0,0,3,0,0,0,64,0,0,0,115, + 130,0,0,0,101,0,0,90,1,0,100,0,0,90,2,0, + 100,1,0,90,3,0,100,2,0,100,3,0,132,0,0,90, + 4,0,100,4,0,100,5,0,132,0,0,90,5,0,100,6, + 0,100,7,0,132,0,0,90,6,0,101,7,0,100,8,0, + 100,9,0,132,0,0,131,1,0,90,8,0,100,10,0,100, + 11,0,132,0,0,90,9,0,100,12,0,100,13,0,132,0, + 0,90,10,0,100,14,0,100,15,0,132,0,0,90,11,0, + 101,7,0,100,16,0,100,17,0,132,0,0,131,1,0,90, + 12,0,100,18,0,83,41,19,218,19,69,120,116,101,110,115, + 105,111,110,70,105,108,101,76,111,97,100,101,114,122,93,76, + 111,97,100,101,114,32,102,111,114,32,101,120,116,101,110,115, + 105,111,110,32,109,111,100,117,108,101,115,46,10,10,32,32, + 32,32,84,104,101,32,99,111,110,115,116,114,117,99,116,111, + 114,32,105,115,32,100,101,115,105,103,110,101,100,32,116,111, + 32,119,111,114,107,32,119,105,116,104,32,70,105,108,101,70, + 105,110,100,101,114,46,10,10,32,32,32,32,99,3,0,0, + 0,0,0,0,0,3,0,0,0,2,0,0,0,67,0,0, + 0,115,22,0,0,0,124,1,0,124,0,0,95,0,0,124, + 2,0,124,0,0,95,1,0,100,0,0,83,41,1,78,41, + 2,114,67,0,0,0,114,35,0,0,0,41,3,114,71,0, + 0,0,114,67,0,0,0,114,35,0,0,0,114,4,0,0, + 0,114,4,0,0,0,114,5,0,0,0,114,72,0,0,0, + 161,6,0,0,115,4,0,0,0,0,1,9,1,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,2,0,0,0,2,0,0,0,67,0,0,0, + 115,34,0,0,0,124,0,0,106,0,0,124,1,0,106,0, + 0,107,2,0,111,33,0,124,0,0,106,1,0,124,1,0, + 106,1,0,107,2,0,83,41,1,78,41,2,114,225,0,0, + 0,114,63,0,0,0,41,2,114,71,0,0,0,114,228,0, + 0,0,114,4,0,0,0,114,4,0,0,0,114,5,0,0, + 0,114,230,0,0,0,165,6,0,0,115,4,0,0,0,0, + 1,18,1,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,1,0,0,0,3,0,0,0, + 67,0,0,0,115,26,0,0,0,116,0,0,124,0,0,106, + 1,0,131,1,0,116,0,0,124,0,0,106,2,0,131,1, + 0,65,83,41,1,78,41,3,114,50,1,0,0,114,67,0, + 0,0,114,35,0,0,0,41,1,114,71,0,0,0,114,4, + 0,0,0,114,4,0,0,0,114,5,0,0,0,114,51,1, + 0,0,169,6,0,0,115,2,0,0,0,0,1,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, + 0,0,0,0,4,0,0,0,11,0,0,0,67,0,0,0, + 115,183,0,0,0,116,0,0,124,1,0,131,1,0,143,29, + 0,1,116,1,0,116,2,0,106,3,0,124,1,0,124,0, + 0,106,4,0,131,3,0,125,2,0,87,100,1,0,81,88, + 116,5,0,100,2,0,124,0,0,106,4,0,131,2,0,1, + 124,0,0,106,6,0,124,1,0,131,1,0,125,3,0,124, + 3,0,114,124,0,116,7,0,124,2,0,100,3,0,131,2, + 0,12,114,124,0,116,8,0,124,0,0,106,4,0,131,1, + 0,100,4,0,25,103,1,0,124,2,0,95,9,0,110,0, + 0,124,0,0,124,2,0,95,10,0,124,2,0,106,11,0, + 124,2,0,95,12,0,124,3,0,115,179,0,124,2,0,106, + 12,0,106,13,0,100,5,0,131,1,0,100,4,0,25,124, + 2,0,95,12,0,110,0,0,124,2,0,83,41,6,122,25, + 76,111,97,100,32,97,110,32,101,120,116,101,110,115,105,111, + 110,32,109,111,100,117,108,101,46,78,122,33,101,120,116,101, + 110,115,105,111,110,32,109,111,100,117,108,101,32,108,111,97, + 100,101,100,32,102,114,111,109,32,123,33,114,125,114,247,0, + 0,0,114,84,0,0,0,114,116,0,0,0,41,14,114,69, + 0,0,0,114,114,0,0,0,114,106,0,0,0,90,12,108, + 111,97,100,95,100,121,110,97,109,105,99,114,35,0,0,0, + 114,153,0,0,0,114,220,0,0,0,114,60,0,0,0,114, + 38,0,0,0,114,247,0,0,0,114,205,0,0,0,114,57, + 0,0,0,114,251,0,0,0,114,32,0,0,0,41,4,114, + 71,0,0,0,114,159,0,0,0,114,180,0,0,0,114,220, + 0,0,0,114,4,0,0,0,114,4,0,0,0,114,5,0, + 0,0,114,5,1,0,0,172,6,0,0,115,24,0,0,0, + 0,5,13,1,9,1,21,1,16,1,15,1,22,1,28,1, + 9,1,12,1,6,1,28,1,122,31,69,120,116,101,110,115, + 105,111,110,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,2,0,0,0,4,0,0,0,3,0,0,0,115,48, + 0,0,0,116,0,0,124,0,0,106,1,0,131,1,0,100, + 1,0,25,137,0,0,116,2,0,135,0,0,102,1,0,100, + 2,0,100,3,0,134,0,0,116,3,0,68,131,1,0,131, + 1,0,83,41,4,122,49,82,101,116,117,114,110,32,84,114, + 117,101,32,105,102,32,116,104,101,32,101,120,116,101,110,115, + 105,111,110,32,109,111,100,117,108,101,32,105,115,32,97,32, + 112,97,99,107,97,103,101,46,114,29,0,0,0,99,1,0, + 0,0,0,0,0,0,2,0,0,0,4,0,0,0,51,0, + 0,0,115,31,0,0,0,124,0,0,93,21,0,125,1,0, + 136,0,0,100,0,0,124,1,0,23,107,2,0,86,1,113, + 3,0,100,1,0,83,41,2,114,72,0,0,0,78,114,4, + 0,0,0,41,2,114,22,0,0,0,218,6,115,117,102,102, + 105,120,41,1,218,9,102,105,108,101,95,110,97,109,101,114, + 4,0,0,0,114,5,0,0,0,114,77,0,0,0,193,6, + 0,0,115,2,0,0,0,6,1,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,41,4,114,38, + 0,0,0,114,35,0,0,0,114,78,0,0,0,218,18,69, + 88,84,69,78,83,73,79,78,95,83,85,70,70,73,88,69, + 83,41,2,114,71,0,0,0,114,159,0,0,0,114,4,0, + 0,0,41,1,114,59,1,0,0,114,5,0,0,0,114,220, + 0,0,0,190,6,0,0,115,6,0,0,0,0,2,19,1, + 18,1,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,97, + 103,101,99,2,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,1,0,83, + 41,2,122,63,82,101,116,117,114,110,32,78,111,110,101,32, + 97,115,32,97,110,32,101,120,116,101,110,115,105,111,110,32, + 109,111,100,117,108,101,32,99,97,110,110,111,116,32,99,114, + 101,97,116,101,32,97,32,99,111,100,101,32,111,98,106,101, + 99,116,46,78,114,4,0,0,0,41,2,114,71,0,0,0, + 114,159,0,0,0,114,4,0,0,0,114,4,0,0,0,114, + 5,0,0,0,114,16,1,0,0,196,6,0,0,115,2,0, + 0,0,0,2,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,2,0,0,0,1, + 0,0,0,67,0,0,0,115,4,0,0,0,100,1,0,83, + 41,2,122,53,82,101,116,117,114,110,32,78,111,110,101,32, 97,115,32,101,120,116,101,110,115,105,111,110,32,109,111,100, 117,108,101,115,32,104,97,118,101,32,110,111,32,115,111,117, - 114,99,101,32,99,111,100,101,46,78,40,1,0,0,0,117, - 4,0,0,0,78,111,110,101,40,2,0,0,0,117,4,0, - 0,0,115,101,108,102,117,8,0,0,0,102,117,108,108,110, - 97,109,101,40,0,0,0,0,40,0,0,0,0,117,29,0, - 0,0,60,102,114,111,122,101,110,32,105,109,112,111,114,116, - 108,105,98,46,95,98,111,111,116,115,116,114,97,112,62,117, - 10,0,0,0,103,101,116,95,115,111,117,114,99,101,128,4, - 0,0,115,2,0,0,0,0,2,117,30,0,0,0,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,78,40,12,0, - 0,0,117,8,0,0,0,95,95,110,97,109,101,95,95,117, - 10,0,0,0,95,95,109,111,100,117,108,101,95,95,117,12, - 0,0,0,95,95,113,117,97,108,110,97,109,101,95,95,117, - 7,0,0,0,95,95,100,111,99,95,95,117,8,0,0,0, - 95,95,105,110,105,116,95,95,117,11,0,0,0,95,99,104, - 101,99,107,95,110,97,109,101,117,11,0,0,0,115,101,116, - 95,112,97,99,107,97,103,101,117,10,0,0,0,115,101,116, - 95,108,111,97,100,101,114,117,11,0,0,0,108,111,97,100, - 95,109,111,100,117,108,101,117,10,0,0,0,105,115,95,112, - 97,99,107,97,103,101,117,8,0,0,0,103,101,116,95,99, - 111,100,101,117,10,0,0,0,103,101,116,95,115,111,117,114, - 99,101,40,1,0,0,0,117,10,0,0,0,95,95,108,111, - 99,97,108,115,95,95,40,0,0,0,0,40,0,0,0,0, - 117,29,0,0,0,60,102,114,111,122,101,110,32,105,109,112, - 111,114,116,108,105,98,46,95,98,111,111,116,115,116,114,97, - 112,62,117,19,0,0,0,69,120,116,101,110,115,105,111,110, - 70,105,108,101,76,111,97,100,101,114,88,4,0,0,115,16, - 0,0,0,16,6,6,2,12,4,3,1,3,1,24,16,12, - 6,12,4,117,19,0,0,0,69,120,116,101,110,115,105,111, - 110,70,105,108,101,76,111,97,100,101,114,99,1,0,0,0, - 0,0,0,0,1,0,0,0,2,0,0,0,66,0,0,0, - 115,134,0,0,0,124,0,0,69,101,0,0,90,1,0,100, - 0,0,90,2,0,100,1,0,90,3,0,100,2,0,100,3, - 0,132,0,0,90,4,0,100,4,0,100,5,0,132,0,0, - 90,5,0,100,6,0,100,7,0,132,0,0,90,6,0,100, - 8,0,100,9,0,132,0,0,90,7,0,100,10,0,100,11, - 0,132,0,0,90,8,0,100,12,0,100,13,0,132,0,0, - 90,9,0,100,14,0,100,15,0,132,0,0,90,10,0,100, - 16,0,100,17,0,132,0,0,90,11,0,100,18,0,100,19, - 0,132,0,0,90,12,0,100,20,0,83,40,21,0,0,0, - 117,14,0,0,0,95,78,97,109,101,115,112,97,99,101,80, - 97,116,104,117,38,1,0,0,82,101,112,114,101,115,101,110, - 116,115,32,97,32,110,97,109,101,115,112,97,99,101,32,112, - 97,99,107,97,103,101,39,115,32,112,97,116,104,46,32,32, - 73,116,32,117,115,101,115,32,116,104,101,32,109,111,100,117, - 108,101,32,110,97,109,101,10,32,32,32,32,116,111,32,102, - 105,110,100,32,105,116,115,32,112,97,114,101,110,116,32,109, - 111,100,117,108,101,44,32,97,110,100,32,102,114,111,109,32, - 116,104,101,114,101,32,105,116,32,108,111,111,107,115,32,117, - 112,32,116,104,101,32,112,97,114,101,110,116,39,115,10,32, - 32,32,32,95,95,112,97,116,104,95,95,46,32,32,87,104, - 101,110,32,116,104,105,115,32,99,104,97,110,103,101,115,44, - 32,116,104,101,32,109,111,100,117,108,101,39,115,32,111,119, - 110,32,112,97,116,104,32,105,115,32,114,101,99,111,109,112, - 117,116,101,100,44,10,32,32,32,32,117,115,105,110,103,32, - 112,97,116,104,95,102,105,110,100,101,114,46,32,32,70,111, - 114,32,116,111,112,45,108,101,118,101,108,32,109,111,100,117, - 108,101,115,44,32,116,104,101,32,112,97,114,101,110,116,32, - 109,111,100,117,108,101,39,115,32,112,97,116,104,10,32,32, - 32,32,105,115,32,115,121,115,46,112,97,116,104,46,99,4, - 0,0,0,0,0,0,0,4,0,0,0,2,0,0,0,67, - 0,0,0,115,52,0,0,0,124,1,0,124,0,0,95,0, - 0,124,2,0,124,0,0,95,1,0,116,2,0,124,0,0, - 106,3,0,131,0,0,131,1,0,124,0,0,95,4,0,124, - 3,0,124,0,0,95,5,0,100,0,0,83,40,1,0,0, - 0,78,40,6,0,0,0,117,5,0,0,0,95,110,97,109, - 101,117,5,0,0,0,95,112,97,116,104,117,5,0,0,0, - 116,117,112,108,101,117,16,0,0,0,95,103,101,116,95,112, - 97,114,101,110,116,95,112,97,116,104,117,17,0,0,0,95, - 108,97,115,116,95,112,97,114,101,110,116,95,112,97,116,104, - 117,12,0,0,0,95,112,97,116,104,95,102,105,110,100,101, - 114,40,4,0,0,0,117,4,0,0,0,115,101,108,102,117, - 4,0,0,0,110,97,109,101,117,4,0,0,0,112,97,116, - 104,117,11,0,0,0,112,97,116,104,95,102,105,110,100,101, - 114,40,0,0,0,0,40,0,0,0,0,117,29,0,0,0, - 60,102,114,111,122,101,110,32,105,109,112,111,114,116,108,105, - 98,46,95,98,111,111,116,115,116,114,97,112,62,117,8,0, - 0,0,95,95,105,110,105,116,95,95,140,4,0,0,115,8, - 0,0,0,0,1,9,1,9,1,21,1,117,23,0,0,0, - 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, - 4,0,0,0,3,0,0,0,67,0,0,0,115,53,0,0, - 0,124,0,0,106,0,0,106,1,0,100,1,0,131,1,0, - 92,3,0,125,1,0,125,2,0,125,3,0,124,2,0,100, - 2,0,107,2,0,114,43,0,100,6,0,83,124,1,0,100, - 5,0,102,2,0,83,40,7,0,0,0,117,62,0,0,0, - 82,101,116,117,114,110,115,32,97,32,116,117,112,108,101,32, - 111,102,32,40,112,97,114,101,110,116,45,109,111,100,117,108, - 101,45,110,97,109,101,44,32,112,97,114,101,110,116,45,112, - 97,116,104,45,97,116,116,114,45,110,97,109,101,41,117,1, - 0,0,0,46,117,0,0,0,0,117,3,0,0,0,115,121, - 115,117,4,0,0,0,112,97,116,104,117,8,0,0,0,95, - 95,112,97,116,104,95,95,40,2,0,0,0,117,3,0,0, - 0,115,121,115,117,4,0,0,0,112,97,116,104,40,2,0, - 0,0,117,5,0,0,0,95,110,97,109,101,117,10,0,0, - 0,114,112,97,114,116,105,116,105,111,110,40,4,0,0,0, - 117,4,0,0,0,115,101,108,102,117,6,0,0,0,112,97, - 114,101,110,116,117,3,0,0,0,100,111,116,117,2,0,0, - 0,109,101,40,0,0,0,0,40,0,0,0,0,117,29,0, - 0,0,60,102,114,111,122,101,110,32,105,109,112,111,114,116, - 108,105,98,46,95,98,111,111,116,115,116,114,97,112,62,117, - 23,0,0,0,95,102,105,110,100,95,112,97,114,101,110,116, - 95,112,97,116,104,95,110,97,109,101,115,146,4,0,0,115, - 8,0,0,0,0,2,27,1,12,2,4,3,117,38,0,0, - 0,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,101,115,99,1,0,0,0,0,0,0,0, - 3,0,0,0,3,0,0,0,67,0,0,0,115,38,0,0, - 0,124,0,0,106,0,0,131,0,0,92,2,0,125,1,0, - 125,2,0,116,1,0,116,2,0,106,3,0,124,1,0,25, - 124,2,0,131,2,0,83,40,1,0,0,0,78,40,4,0, - 0,0,117,23,0,0,0,95,102,105,110,100,95,112,97,114, - 101,110,116,95,112,97,116,104,95,110,97,109,101,115,117,7, - 0,0,0,103,101,116,97,116,116,114,117,3,0,0,0,115, - 121,115,117,7,0,0,0,109,111,100,117,108,101,115,40,3, - 0,0,0,117,4,0,0,0,115,101,108,102,117,18,0,0, - 0,112,97,114,101,110,116,95,109,111,100,117,108,101,95,110, - 97,109,101,117,14,0,0,0,112,97,116,104,95,97,116,116, - 114,95,110,97,109,101,40,0,0,0,0,40,0,0,0,0, - 117,29,0,0,0,60,102,114,111,122,101,110,32,105,109,112, - 111,114,116,108,105,98,46,95,98,111,111,116,115,116,114,97, - 112,62,117,16,0,0,0,95,103,101,116,95,112,97,114,101, - 110,116,95,112,97,116,104,156,4,0,0,115,4,0,0,0, - 0,1,18,1,117,31,0,0,0,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,0,0,0,0,0, - 0,4,0,0,0,3,0,0,0,67,0,0,0,115,103,0, - 0,0,116,0,0,124,0,0,106,1,0,131,0,0,131,1, - 0,125,1,0,124,1,0,124,0,0,106,2,0,107,3,0, - 114,96,0,124,0,0,106,3,0,124,0,0,106,4,0,124, - 1,0,131,2,0,92,2,0,125,2,0,125,3,0,124,2, - 0,100,0,0,107,8,0,114,84,0,124,3,0,124,0,0, - 95,6,0,110,0,0,124,1,0,124,0,0,95,2,0,110, - 0,0,124,0,0,106,6,0,83,40,1,0,0,0,78,40, - 7,0,0,0,117,5,0,0,0,116,117,112,108,101,117,16, - 0,0,0,95,103,101,116,95,112,97,114,101,110,116,95,112, - 97,116,104,117,17,0,0,0,95,108,97,115,116,95,112,97, - 114,101,110,116,95,112,97,116,104,117,12,0,0,0,95,112, - 97,116,104,95,102,105,110,100,101,114,117,5,0,0,0,95, - 110,97,109,101,117,4,0,0,0,78,111,110,101,117,5,0, - 0,0,95,112,97,116,104,40,4,0,0,0,117,4,0,0, - 0,115,101,108,102,117,11,0,0,0,112,97,114,101,110,116, - 95,112,97,116,104,117,6,0,0,0,108,111,97,100,101,114, - 117,8,0,0,0,110,101,119,95,112,97,116,104,40,0,0, - 0,0,40,0,0,0,0,117,29,0,0,0,60,102,114,111, - 122,101,110,32,105,109,112,111,114,116,108,105,98,46,95,98, - 111,111,116,115,116,114,97,112,62,117,12,0,0,0,95,114, - 101,99,97,108,99,117,108,97,116,101,160,4,0,0,115,14, - 0,0,0,0,2,18,1,15,1,27,3,12,1,12,1,12, - 1,117,27,0,0,0,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,0,0,0,0,1,0,0,0,2,0, - 0,0,67,0,0,0,115,16,0,0,0,116,0,0,124,0, - 0,106,1,0,131,0,0,131,1,0,83,40,1,0,0,0, - 78,40,2,0,0,0,117,4,0,0,0,105,116,101,114,117, - 12,0,0,0,95,114,101,99,97,108,99,117,108,97,116,101, - 40,1,0,0,0,117,4,0,0,0,115,101,108,102,40,0, - 0,0,0,40,0,0,0,0,117,29,0,0,0,60,102,114, - 111,122,101,110,32,105,109,112,111,114,116,108,105,98,46,95, - 98,111,111,116,115,116,114,97,112,62,117,8,0,0,0,95, - 95,105,116,101,114,95,95,172,4,0,0,115,2,0,0,0, - 0,1,117,23,0,0,0,95,78,97,109,101,115,112,97,99, - 101,80,97,116,104,46,95,95,105,116,101,114,95,95,99,1, - 0,0,0,0,0,0,0,1,0,0,0,2,0,0,0,67, - 0,0,0,115,16,0,0,0,116,0,0,124,0,0,106,1, - 0,131,0,0,131,1,0,83,40,1,0,0,0,78,40,2, - 0,0,0,117,3,0,0,0,108,101,110,117,12,0,0,0, - 95,114,101,99,97,108,99,117,108,97,116,101,40,1,0,0, - 0,117,4,0,0,0,115,101,108,102,40,0,0,0,0,40, - 0,0,0,0,117,29,0,0,0,60,102,114,111,122,101,110, - 32,105,109,112,111,114,116,108,105,98,46,95,98,111,111,116, - 115,116,114,97,112,62,117,7,0,0,0,95,95,108,101,110, - 95,95,175,4,0,0,115,2,0,0,0,0,1,117,22,0, - 0,0,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,1,0,0,0,2,0,0,0,67,0,0,0,115,16,0, - 0,0,100,1,0,106,0,0,124,0,0,106,1,0,131,1, - 0,83,40,2,0,0,0,78,117,20,0,0,0,95,78,97, - 109,101,115,112,97,99,101,80,97,116,104,40,123,33,114,125, - 41,40,2,0,0,0,117,6,0,0,0,102,111,114,109,97, - 116,117,5,0,0,0,95,112,97,116,104,40,1,0,0,0, - 117,4,0,0,0,115,101,108,102,40,0,0,0,0,40,0, - 0,0,0,117,29,0,0,0,60,102,114,111,122,101,110,32, - 105,109,112,111,114,116,108,105,98,46,95,98,111,111,116,115, - 116,114,97,112,62,117,8,0,0,0,95,95,114,101,112,114, - 95,95,178,4,0,0,115,2,0,0,0,0,1,117,23,0, - 0,0,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,2,0,0,0,2,0,0,0,67,0,0,0,115,16, - 0,0,0,124,1,0,124,0,0,106,0,0,131,0,0,107, - 6,0,83,40,1,0,0,0,78,40,1,0,0,0,117,12, - 0,0,0,95,114,101,99,97,108,99,117,108,97,116,101,40, - 2,0,0,0,117,4,0,0,0,115,101,108,102,117,4,0, - 0,0,105,116,101,109,40,0,0,0,0,40,0,0,0,0, - 117,29,0,0,0,60,102,114,111,122,101,110,32,105,109,112, - 111,114,116,108,105,98,46,95,98,111,111,116,115,116,114,97, - 112,62,117,12,0,0,0,95,95,99,111,110,116,97,105,110, - 115,95,95,181,4,0,0,115,2,0,0,0,0,1,117,27, - 0,0,0,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, + 114,99,101,32,99,111,100,101,46,78,114,4,0,0,0,41, + 2,114,71,0,0,0,114,159,0,0,0,114,4,0,0,0, + 114,4,0,0,0,114,5,0,0,0,114,17,1,0,0,200, + 6,0,0,115,2,0,0,0,0,2,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,2,0,0,0,1,0,0,0,67,0,0,0,115, + 7,0,0,0,124,0,0,106,0,0,83,41,1,122,58,82, + 101,116,117,114,110,32,116,104,101,32,112,97,116,104,32,116, + 111,32,116,104,101,32,115,111,117,114,99,101,32,102,105,108, + 101,32,97,115,32,102,111,117,110,100,32,98,121,32,116,104, + 101,32,102,105,110,100,101,114,46,41,1,114,35,0,0,0, + 41,2,114,71,0,0,0,114,159,0,0,0,114,4,0,0, + 0,114,4,0,0,0,114,5,0,0,0,114,239,0,0,0, + 204,6,0,0,115,2,0,0,0,0,3,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,13, + 114,57,0,0,0,114,56,0,0,0,114,58,0,0,0,114, + 59,0,0,0,114,72,0,0,0,114,230,0,0,0,114,51, + 1,0,0,114,157,0,0,0,114,5,1,0,0,114,220,0, + 0,0,114,16,1,0,0,114,17,1,0,0,114,239,0,0, + 0,114,4,0,0,0,114,4,0,0,0,114,4,0,0,0, + 114,5,0,0,0,114,57,1,0,0,153,6,0,0,115,18, + 0,0,0,12,6,6,2,12,4,12,4,12,3,18,18,12, + 6,12,4,12,4,114,57,1,0,0,99,0,0,0,0,0, + 0,0,0,0,0,0,0,2,0,0,0,64,0,0,0,115, + 130,0,0,0,101,0,0,90,1,0,100,0,0,90,2,0, + 100,1,0,90,3,0,100,2,0,100,3,0,132,0,0,90, + 4,0,100,4,0,100,5,0,132,0,0,90,5,0,100,6, + 0,100,7,0,132,0,0,90,6,0,100,8,0,100,9,0, + 132,0,0,90,7,0,100,10,0,100,11,0,132,0,0,90, + 8,0,100,12,0,100,13,0,132,0,0,90,9,0,100,14, + 0,100,15,0,132,0,0,90,10,0,100,16,0,100,17,0, + 132,0,0,90,11,0,100,18,0,100,19,0,132,0,0,90, + 12,0,100,20,0,83,41,21,218,14,95,78,97,109,101,115, + 112,97,99,101,80,97,116,104,97,38,1,0,0,82,101,112, + 114,101,115,101,110,116,115,32,97,32,110,97,109,101,115,112, + 97,99,101,32,112,97,99,107,97,103,101,39,115,32,112,97, + 116,104,46,32,32,73,116,32,117,115,101,115,32,116,104,101, + 32,109,111,100,117,108,101,32,110,97,109,101,10,32,32,32, + 32,116,111,32,102,105,110,100,32,105,116,115,32,112,97,114, + 101,110,116,32,109,111,100,117,108,101,44,32,97,110,100,32, + 102,114,111,109,32,116,104,101,114,101,32,105,116,32,108,111, + 111,107,115,32,117,112,32,116,104,101,32,112,97,114,101,110, + 116,39,115,10,32,32,32,32,95,95,112,97,116,104,95,95, + 46,32,32,87,104,101,110,32,116,104,105,115,32,99,104,97, + 110,103,101,115,44,32,116,104,101,32,109,111,100,117,108,101, + 39,115,32,111,119,110,32,112,97,116,104,32,105,115,32,114, + 101,99,111,109,112,117,116,101,100,44,10,32,32,32,32,117, + 115,105,110,103,32,112,97,116,104,95,102,105,110,100,101,114, + 46,32,32,70,111,114,32,116,111,112,45,108,101,118,101,108, + 32,109,111,100,117,108,101,115,44,32,116,104,101,32,112,97, + 114,101,110,116,32,109,111,100,117,108,101,39,115,32,112,97, + 116,104,10,32,32,32,32,105,115,32,115,121,115,46,112,97, + 116,104,46,99,4,0,0,0,0,0,0,0,4,0,0,0, + 2,0,0,0,67,0,0,0,115,52,0,0,0,124,1,0, + 124,0,0,95,0,0,124,2,0,124,0,0,95,1,0,116, + 2,0,124,0,0,106,3,0,131,0,0,131,1,0,124,0, + 0,95,4,0,124,3,0,124,0,0,95,5,0,100,0,0, + 83,41,1,78,41,6,114,70,0,0,0,114,254,0,0,0, + 114,232,0,0,0,218,16,95,103,101,116,95,112,97,114,101, + 110,116,95,112,97,116,104,218,17,95,108,97,115,116,95,112, + 97,114,101,110,116,95,112,97,116,104,218,12,95,112,97,116, + 104,95,102,105,110,100,101,114,41,4,114,71,0,0,0,114, + 67,0,0,0,114,35,0,0,0,218,11,112,97,116,104,95, + 102,105,110,100,101,114,114,4,0,0,0,114,4,0,0,0, + 114,5,0,0,0,114,72,0,0,0,217,6,0,0,115,8, + 0,0,0,0,1,9,1,9,1,21,1,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,4,0,0, + 0,3,0,0,0,67,0,0,0,115,53,0,0,0,124,0, + 0,106,0,0,106,1,0,100,1,0,131,1,0,92,3,0, + 125,1,0,125,2,0,125,3,0,124,2,0,100,2,0,107, + 2,0,114,43,0,100,6,0,83,124,1,0,100,5,0,102, + 2,0,83,41,7,122,62,82,101,116,117,114,110,115,32,97, + 32,116,117,112,108,101,32,111,102,32,40,112,97,114,101,110, + 116,45,109,111,100,117,108,101,45,110,97,109,101,44,32,112, + 97,114,101,110,116,45,112,97,116,104,45,97,116,116,114,45, + 110,97,109,101,41,114,116,0,0,0,114,30,0,0,0,114, + 7,0,0,0,114,35,0,0,0,114,247,0,0,0,41,2, + 122,3,115,121,115,122,4,112,97,116,104,41,2,114,70,0, + 0,0,114,32,0,0,0,41,4,114,71,0,0,0,114,234, + 0,0,0,218,3,100,111,116,114,94,0,0,0,114,4,0, + 0,0,114,4,0,0,0,114,5,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,223,6,0,0,115,8,0,0,0,0,2, + 27,1,12,2,4,3,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,101,115,99,1, + 0,0,0,0,0,0,0,3,0,0,0,3,0,0,0,67, + 0,0,0,115,38,0,0,0,124,0,0,106,0,0,131,0, + 0,92,2,0,125,1,0,125,2,0,116,1,0,116,2,0, + 106,3,0,124,1,0,25,124,2,0,131,2,0,83,41,1, + 78,41,4,114,67,1,0,0,114,62,0,0,0,114,7,0, + 0,0,114,73,0,0,0,41,3,114,71,0,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,4,0,0,0,114,4,0,0,0,114,5,0,0, + 0,114,62,1,0,0,233,6,0,0,115,4,0,0,0,0, + 1,18,1,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,0,0,0,0,0,0,3,0,0, + 0,3,0,0,0,67,0,0,0,115,127,0,0,0,116,0, + 0,124,0,0,106,1,0,131,0,0,131,1,0,125,1,0, + 124,1,0,124,0,0,106,2,0,107,3,0,114,120,0,124, + 0,0,106,3,0,124,0,0,106,4,0,124,1,0,131,2, + 0,125,2,0,124,2,0,100,0,0,107,9,0,114,108,0, + 124,2,0,106,5,0,100,0,0,107,8,0,114,108,0,124, + 2,0,106,6,0,114,108,0,124,2,0,106,6,0,124,0, + 0,95,7,0,113,108,0,110,0,0,124,1,0,124,0,0, + 95,2,0,110,0,0,124,0,0,106,7,0,83,41,1,78, + 41,8,114,232,0,0,0,114,62,1,0,0,114,63,1,0, + 0,114,64,1,0,0,114,70,0,0,0,114,170,0,0,0, + 114,221,0,0,0,114,254,0,0,0,41,3,114,71,0,0, + 0,90,11,112,97,114,101,110,116,95,112,97,116,104,114,178, + 0,0,0,114,4,0,0,0,114,4,0,0,0,114,5,0, + 0,0,218,12,95,114,101,99,97,108,99,117,108,97,116,101, + 237,6,0,0,115,16,0,0,0,0,2,18,1,15,1,21, + 3,27,1,9,1,18,1,12,1,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,0,0,0,0,1, + 0,0,0,2,0,0,0,67,0,0,0,115,16,0,0,0, + 116,0,0,124,0,0,106,1,0,131,0,0,131,1,0,83, + 41,1,78,41,2,218,4,105,116,101,114,114,68,1,0,0, + 41,1,114,71,0,0,0,114,4,0,0,0,114,4,0,0, + 0,114,5,0,0,0,218,8,95,95,105,116,101,114,95,95, + 250,6,0,0,115,2,0,0,0,0,1,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,1,0,0,0,0,0,0,0,1,0,0, + 0,2,0,0,0,67,0,0,0,115,16,0,0,0,116,0, + 0,124,0,0,106,1,0,131,0,0,131,1,0,83,41,1, + 78,41,2,114,31,0,0,0,114,68,1,0,0,41,1,114, + 71,0,0,0,114,4,0,0,0,114,4,0,0,0,114,5, + 0,0,0,218,7,95,95,108,101,110,95,95,253,6,0,0, + 115,2,0,0,0,0,1,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,1,0,0,0,2,0,0,0, + 67,0,0,0,115,16,0,0,0,100,1,0,106,0,0,124, + 0,0,106,1,0,131,1,0,83,41,2,78,122,20,95,78, + 97,109,101,115,112,97,99,101,80,97,116,104,40,123,33,114, + 125,41,41,2,114,47,0,0,0,114,254,0,0,0,41,1, + 114,71,0,0,0,114,4,0,0,0,114,4,0,0,0,114, + 5,0,0,0,114,101,0,0,0,0,7,0,0,115,2,0, + 0,0,0,1,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,2,0,0,0,2,0,0,0,67,0, + 0,0,115,16,0,0,0,124,1,0,124,0,0,106,0,0, + 131,0,0,107,6,0,83,41,1,78,41,1,114,68,1,0, + 0,41,2,114,71,0,0,0,218,4,105,116,101,109,114,4, + 0,0,0,114,4,0,0,0,114,5,0,0,0,218,12,95, + 95,99,111,110,116,97,105,110,115,95,95,3,7,0,0,115, + 2,0,0,0,0,1,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,0,2,0,0,0, + 2,0,0,0,67,0,0,0,115,20,0,0,0,124,0,0, + 106,0,0,106,1,0,124,1,0,131,1,0,1,100,0,0, + 83,41,1,78,41,2,114,254,0,0,0,114,224,0,0,0, + 41,2,114,71,0,0,0,114,72,1,0,0,114,4,0,0, + 0,114,4,0,0,0,114,5,0,0,0,114,224,0,0,0, + 6,7,0,0,115,2,0,0,0,0,1,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,13,114,57,0,0,0,114,56,0,0,0,114, + 58,0,0,0,114,59,0,0,0,114,72,0,0,0,114,67, + 1,0,0,114,62,1,0,0,114,68,1,0,0,114,70,1, + 0,0,114,71,1,0,0,114,101,0,0,0,114,73,1,0, + 0,114,224,0,0,0,114,4,0,0,0,114,4,0,0,0, + 114,4,0,0,0,114,5,0,0,0,114,61,1,0,0,210, + 6,0,0,115,20,0,0,0,12,5,6,2,12,6,12,10, + 12,4,12,13,12,3,12,3,12,3,12,3,114,61,1,0, + 0,99,0,0,0,0,0,0,0,0,0,0,0,0,3,0, + 0,0,64,0,0,0,115,106,0,0,0,101,0,0,90,1, + 0,100,0,0,90,2,0,100,1,0,100,2,0,132,0,0, + 90,3,0,101,4,0,100,3,0,100,4,0,132,0,0,131, + 1,0,90,5,0,100,5,0,100,6,0,132,0,0,90,6, + 0,100,7,0,100,8,0,132,0,0,90,7,0,100,9,0, + 100,10,0,132,0,0,90,8,0,100,11,0,100,12,0,132, + 0,0,90,9,0,100,13,0,100,14,0,132,0,0,90,10, + 0,100,15,0,83,41,16,114,252,0,0,0,99,4,0,0, + 0,0,0,0,0,4,0,0,0,4,0,0,0,67,0,0, + 0,115,25,0,0,0,116,0,0,124,1,0,124,2,0,124, + 3,0,131,3,0,124,0,0,95,1,0,100,0,0,83,41, + 1,78,41,2,114,61,1,0,0,114,254,0,0,0,41,4, + 114,71,0,0,0,114,67,0,0,0,114,35,0,0,0,114, + 65,1,0,0,114,4,0,0,0,114,4,0,0,0,114,5, + 0,0,0,114,72,0,0,0,12,7,0,0,115,2,0,0, + 0,0,1,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,2, 0,0,0,0,0,0,0,2,0,0,0,2,0,0,0,67, - 0,0,0,115,20,0,0,0,124,0,0,106,0,0,106,1, - 0,124,1,0,131,1,0,1,100,0,0,83,40,1,0,0, - 0,78,40,2,0,0,0,117,5,0,0,0,95,112,97,116, - 104,117,6,0,0,0,97,112,112,101,110,100,40,2,0,0, - 0,117,4,0,0,0,115,101,108,102,117,4,0,0,0,105, - 116,101,109,40,0,0,0,0,40,0,0,0,0,117,29,0, - 0,0,60,102,114,111,122,101,110,32,105,109,112,111,114,116, - 108,105,98,46,95,98,111,111,116,115,116,114,97,112,62,117, - 6,0,0,0,97,112,112,101,110,100,184,4,0,0,115,2, - 0,0,0,0,1,117,21,0,0,0,95,78,97,109,101,115, - 112,97,99,101,80,97,116,104,46,97,112,112,101,110,100,78, - 40,13,0,0,0,117,8,0,0,0,95,95,110,97,109,101, - 95,95,117,10,0,0,0,95,95,109,111,100,117,108,101,95, - 95,117,12,0,0,0,95,95,113,117,97,108,110,97,109,101, - 95,95,117,7,0,0,0,95,95,100,111,99,95,95,117,8, - 0,0,0,95,95,105,110,105,116,95,95,117,23,0,0,0, - 95,102,105,110,100,95,112,97,114,101,110,116,95,112,97,116, - 104,95,110,97,109,101,115,117,16,0,0,0,95,103,101,116, - 95,112,97,114,101,110,116,95,112,97,116,104,117,12,0,0, - 0,95,114,101,99,97,108,99,117,108,97,116,101,117,8,0, - 0,0,95,95,105,116,101,114,95,95,117,7,0,0,0,95, - 95,108,101,110,95,95,117,8,0,0,0,95,95,114,101,112, - 114,95,95,117,12,0,0,0,95,95,99,111,110,116,97,105, - 110,115,95,95,117,6,0,0,0,97,112,112,101,110,100,40, - 1,0,0,0,117,10,0,0,0,95,95,108,111,99,97,108, - 115,95,95,40,0,0,0,0,40,0,0,0,0,117,29,0, - 0,0,60,102,114,111,122,101,110,32,105,109,112,111,114,116, - 108,105,98,46,95,98,111,111,116,115,116,114,97,112,62,117, - 14,0,0,0,95,78,97,109,101,115,112,97,99,101,80,97, - 116,104,133,4,0,0,115,20,0,0,0,16,5,6,2,12, - 6,12,10,12,4,12,12,12,3,12,3,12,3,12,3,117, - 14,0,0,0,95,78,97,109,101,115,112,97,99,101,80,97, - 116,104,99,1,0,0,0,0,0,0,0,1,0,0,0,3, - 0,0,0,66,0,0,0,115,68,0,0,0,124,0,0,69, - 101,0,0,90,1,0,100,0,0,90,2,0,100,1,0,100, - 2,0,132,0,0,90,3,0,101,4,0,100,3,0,100,4, - 0,132,0,0,131,1,0,90,5,0,101,6,0,100,5,0, - 100,6,0,132,0,0,131,1,0,90,7,0,100,7,0,83, - 40,8,0,0,0,117,15,0,0,0,78,97,109,101,115,112, - 97,99,101,76,111,97,100,101,114,99,4,0,0,0,0,0, - 0,0,4,0,0,0,4,0,0,0,67,0,0,0,115,25, - 0,0,0,116,0,0,124,1,0,124,2,0,124,3,0,131, - 3,0,124,0,0,95,1,0,100,0,0,83,40,1,0,0, - 0,78,40,2,0,0,0,117,14,0,0,0,95,78,97,109, - 101,115,112,97,99,101,80,97,116,104,117,5,0,0,0,95, - 112,97,116,104,40,4,0,0,0,117,4,0,0,0,115,101, - 108,102,117,4,0,0,0,110,97,109,101,117,4,0,0,0, - 112,97,116,104,117,11,0,0,0,112,97,116,104,95,102,105, - 110,100,101,114,40,0,0,0,0,40,0,0,0,0,117,29, - 0,0,0,60,102,114,111,122,101,110,32,105,109,112,111,114, - 116,108,105,98,46,95,98,111,111,116,115,116,114,97,112,62, - 117,8,0,0,0,95,95,105,110,105,116,95,95,189,4,0, - 0,115,2,0,0,0,0,1,117,24,0,0,0,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,2,0,0,0,0,0,0,0,2,0, - 0,0,2,0,0,0,67,0,0,0,115,16,0,0,0,100, - 1,0,106,0,0,124,1,0,106,1,0,131,1,0,83,40, - 2,0,0,0,78,117,25,0,0,0,60,109,111,100,117,108, - 101,32,39,123,125,39,32,40,110,97,109,101,115,112,97,99, - 101,41,62,40,2,0,0,0,117,6,0,0,0,102,111,114, - 109,97,116,117,8,0,0,0,95,95,110,97,109,101,95,95, - 40,2,0,0,0,117,3,0,0,0,99,108,115,117,6,0, - 0,0,109,111,100,117,108,101,40,0,0,0,0,40,0,0, - 0,0,117,29,0,0,0,60,102,114,111,122,101,110,32,105, - 109,112,111,114,116,108,105,98,46,95,98,111,111,116,115,116, - 114,97,112,62,117,11,0,0,0,109,111,100,117,108,101,95, - 114,101,112,114,192,4,0,0,115,2,0,0,0,0,2,117, - 27,0,0,0,78,97,109,101,115,112,97,99,101,76,111,97, + 0,0,0,115,16,0,0,0,100,1,0,106,0,0,124,1, + 0,106,1,0,131,1,0,83,41,2,122,115,82,101,116,117, + 114,110,32,114,101,112,114,32,102,111,114,32,116,104,101,32, + 109,111,100,117,108,101,46,10,10,32,32,32,32,32,32,32, + 32,84,104,101,32,109,101,116,104,111,100,32,105,115,32,100, + 101,112,114,101,99,97,116,101,100,46,32,32,84,104,101,32, + 105,109,112,111,114,116,32,109,97,99,104,105,110,101,114,121, + 32,100,111,101,115,32,116,104,101,32,106,111,98,32,105,116, + 115,101,108,102,46,10,10,32,32,32,32,32,32,32,32,122, + 25,60,109,111,100,117,108,101,32,123,33,114,125,32,40,110, + 97,109,101,115,112,97,99,101,41,62,41,2,114,47,0,0, + 0,114,57,0,0,0,41,2,114,12,1,0,0,114,180,0, + 0,0,114,4,0,0,0,114,4,0,0,0,114,5,0,0, + 0,114,206,0,0,0,15,7,0,0,115,2,0,0,0,0, + 7,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,2,0,0,0,3,0,0,0, - 67,0,0,0,115,32,0,0,0,116,0,0,100,1,0,124, - 0,0,106,1,0,131,2,0,1,124,0,0,106,1,0,124, - 1,0,95,2,0,124,1,0,83,40,2,0,0,0,117,24, - 0,0,0,76,111,97,100,32,97,32,110,97,109,101,115,112, - 97,99,101,32,109,111,100,117,108,101,46,117,38,0,0,0, - 110,97,109,101,115,112,97,99,101,32,109,111,100,117,108,101, - 32,108,111,97,100,101,100,32,119,105,116,104,32,112,97,116, - 104,32,123,33,114,125,40,3,0,0,0,117,16,0,0,0, - 95,118,101,114,98,111,115,101,95,109,101,115,115,97,103,101, - 117,5,0,0,0,95,112,97,116,104,117,8,0,0,0,95, - 95,112,97,116,104,95,95,40,2,0,0,0,117,4,0,0, - 0,115,101,108,102,117,6,0,0,0,109,111,100,117,108,101, - 40,0,0,0,0,40,0,0,0,0,117,29,0,0,0,60, - 102,114,111,122,101,110,32,105,109,112,111,114,116,108,105,98, - 46,95,98,111,111,116,115,116,114,97,112,62,117,11,0,0, - 0,108,111,97,100,95,109,111,100,117,108,101,196,4,0,0, - 115,6,0,0,0,0,3,16,1,12,1,117,27,0,0,0, + 2,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,1,0,83,41,2,78, + 84,114,4,0,0,0,41,2,114,71,0,0,0,114,159,0, + 0,0,114,4,0,0,0,114,4,0,0,0,114,5,0,0, + 0,114,220,0,0,0,24,7,0,0,115,2,0,0,0,0, + 1,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,2,0,0,0,1,0,0,0,67, + 0,0,0,115,4,0,0,0,100,1,0,83,41,2,78,114, + 30,0,0,0,114,4,0,0,0,41,2,114,71,0,0,0, + 114,159,0,0,0,114,4,0,0,0,114,4,0,0,0,114, + 5,0,0,0,114,17,1,0,0,27,7,0,0,115,2,0, + 0,0,0,1,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,2,0,0,0,6,0, + 0,0,67,0,0,0,115,22,0,0,0,116,0,0,100,1, + 0,100,2,0,100,3,0,100,4,0,100,5,0,131,3,1, + 83,41,6,78,114,30,0,0,0,122,8,60,115,116,114,105, + 110,103,62,114,176,0,0,0,114,43,1,0,0,84,41,1, + 114,44,1,0,0,41,2,114,71,0,0,0,114,159,0,0, + 0,114,4,0,0,0,114,4,0,0,0,114,5,0,0,0, + 114,16,1,0,0,30,7,0,0,115,2,0,0,0,0,1, + 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,2,0,0,0,1,0,0,0,67,0,0,0, + 115,4,0,0,0,100,0,0,83,41,1,78,114,4,0,0, + 0,41,2,114,71,0,0,0,114,180,0,0,0,114,4,0, + 0,0,114,4,0,0,0,114,5,0,0,0,114,2,1,0, + 0,33,7,0,0,115,2,0,0,0,0,1,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,0, + 0,0,0,2,0,0,0,3,0,0,0,67,0,0,0,115, + 29,0,0,0,116,0,0,100,1,0,124,0,0,106,1,0, + 131,2,0,1,116,2,0,124,0,0,124,1,0,131,2,0, + 83,41,2,122,98,76,111,97,100,32,97,32,110,97,109,101, + 115,112,97,99,101,32,109,111,100,117,108,101,46,10,10,32, + 32,32,32,32,32,32,32,84,104,105,115,32,109,101,116,104, + 111,100,32,105,115,32,100,101,112,114,101,99,97,116,101,100, + 46,32,32,85,115,101,32,101,120,101,99,95,109,111,100,117, + 108,101,40,41,32,105,110,115,116,101,97,100,46,10,10,32, + 32,32,32,32,32,32,32,122,38,110,97,109,101,115,112,97, + 99,101,32,109,111,100,117,108,101,32,108,111,97,100,101,100, + 32,119,105,116,104,32,112,97,116,104,32,123,33,114,125,41, + 3,114,153,0,0,0,114,254,0,0,0,114,181,0,0,0, + 41,2,114,71,0,0,0,114,159,0,0,0,114,4,0,0, + 0,114,4,0,0,0,114,5,0,0,0,114,5,1,0,0, + 36,7,0,0,115,4,0,0,0,0,7,16,1,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,78,40,8,0,0, - 0,117,8,0,0,0,95,95,110,97,109,101,95,95,117,10, - 0,0,0,95,95,109,111,100,117,108,101,95,95,117,12,0, - 0,0,95,95,113,117,97,108,110,97,109,101,95,95,117,8, - 0,0,0,95,95,105,110,105,116,95,95,117,11,0,0,0, - 99,108,97,115,115,109,101,116,104,111,100,117,11,0,0,0, - 109,111,100,117,108,101,95,114,101,112,114,117,17,0,0,0, - 109,111,100,117,108,101,95,102,111,114,95,108,111,97,100,101, - 114,117,11,0,0,0,108,111,97,100,95,109,111,100,117,108, - 101,40,1,0,0,0,117,10,0,0,0,95,95,108,111,99, - 97,108,115,95,95,40,0,0,0,0,40,0,0,0,0,117, - 29,0,0,0,60,102,114,111,122,101,110,32,105,109,112,111, - 114,116,108,105,98,46,95,98,111,111,116,115,116,114,97,112, - 62,117,15,0,0,0,78,97,109,101,115,112,97,99,101,76, - 111,97,100,101,114,188,4,0,0,115,6,0,0,0,16,1, - 12,3,18,4,117,15,0,0,0,78,97,109,101,115,112,97, - 99,101,76,111,97,100,101,114,99,1,0,0,0,0,0,0, - 0,1,0,0,0,4,0,0,0,66,0,0,0,115,119,0, - 0,0,124,0,0,69,101,0,0,90,1,0,100,0,0,90, - 2,0,100,1,0,90,3,0,101,4,0,100,2,0,100,3, - 0,132,0,0,131,1,0,90,5,0,101,4,0,100,4,0, - 100,5,0,132,0,0,131,1,0,90,6,0,101,4,0,100, - 6,0,100,7,0,132,0,0,131,1,0,90,7,0,101,4, - 0,100,8,0,100,9,0,132,0,0,131,1,0,90,8,0, - 101,4,0,100,12,0,100,10,0,100,11,0,132,1,0,131, - 1,0,90,10,0,100,12,0,83,40,13,0,0,0,117,10, - 0,0,0,80,97,116,104,70,105,110,100,101,114,117,62,0, - 0,0,77,101,116,97,32,112,97,116,104,32,102,105,110,100, - 101,114,32,102,111,114,32,115,121,115,46,112,97,116,104,32, - 97,110,100,32,112,97,99,107,97,103,101,32,95,95,112,97, - 116,104,95,95,32,97,116,116,114,105,98,117,116,101,115,46, - 99,1,0,0,0,0,0,0,0,2,0,0,0,4,0,0, - 0,67,0,0,0,115,58,0,0,0,120,51,0,116,0,0, - 106,1,0,106,2,0,131,0,0,68,93,34,0,125,1,0, - 116,3,0,124,1,0,100,1,0,131,2,0,114,16,0,124, - 1,0,106,4,0,131,0,0,1,113,16,0,113,16,0,87, - 100,2,0,83,40,3,0,0,0,117,125,0,0,0,67,97, - 108,108,32,116,104,101,32,105,110,118,97,108,105,100,97,116, - 101,95,99,97,99,104,101,115,40,41,32,109,101,116,104,111, - 100,32,111,110,32,97,108,108,32,112,97,116,104,32,101,110, - 116,114,121,32,102,105,110,100,101,114,115,10,32,32,32,32, - 32,32,32,32,115,116,111,114,101,100,32,105,110,32,115,121, - 115,46,112,97,116,104,95,105,109,112,111,114,116,101,114,95, - 99,97,99,104,101,115,32,40,119,104,101,114,101,32,105,109, - 112,108,101,109,101,110,116,101,100,41,46,117,17,0,0,0, - 105,110,118,97,108,105,100,97,116,101,95,99,97,99,104,101, - 115,78,40,5,0,0,0,117,3,0,0,0,115,121,115,117, - 19,0,0,0,112,97,116,104,95,105,109,112,111,114,116,101, - 114,95,99,97,99,104,101,117,6,0,0,0,118,97,108,117, - 101,115,117,7,0,0,0,104,97,115,97,116,116,114,117,17, - 0,0,0,105,110,118,97,108,105,100,97,116,101,95,99,97, - 99,104,101,115,40,2,0,0,0,117,3,0,0,0,99,108, - 115,117,6,0,0,0,102,105,110,100,101,114,40,0,0,0, - 0,40,0,0,0,0,117,29,0,0,0,60,102,114,111,122, - 101,110,32,105,109,112,111,114,116,108,105,98,46,95,98,111, - 111,116,115,116,114,97,112,62,117,17,0,0,0,105,110,118, - 97,108,105,100,97,116,101,95,99,97,99,104,101,115,210,4, - 0,0,115,6,0,0,0,0,4,22,1,15,1,117,28,0, - 0,0,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,2, - 0,0,0,0,0,0,0,3,0,0,0,12,0,0,0,67, - 0,0,0,115,94,0,0,0,116,0,0,106,1,0,115,28, - 0,116,2,0,106,3,0,100,1,0,116,4,0,131,2,0, - 1,110,0,0,120,59,0,116,0,0,106,1,0,68,93,44, - 0,125,2,0,121,14,0,124,2,0,124,1,0,131,1,0, - 83,87,113,38,0,4,116,5,0,107,10,0,114,81,0,1, - 1,1,119,38,0,89,113,38,0,88,113,38,0,87,100,2, - 0,83,100,2,0,83,40,3,0,0,0,117,113,0,0,0, - 83,101,97,114,99,104,32,115,101,113,117,101,110,99,101,32, - 111,102,32,104,111,111,107,115,32,102,111,114,32,97,32,102, - 105,110,100,101,114,32,102,111,114,32,39,112,97,116,104,39, - 46,10,10,32,32,32,32,32,32,32,32,73,102,32,39,104, - 111,111,107,115,39,32,105,115,32,102,97,108,115,101,32,116, - 104,101,110,32,117,115,101,32,115,121,115,46,112,97,116,104, - 95,104,111,111,107,115,46,10,10,32,32,32,32,32,32,32, - 32,117,23,0,0,0,115,121,115,46,112,97,116,104,95,104, - 111,111,107,115,32,105,115,32,101,109,112,116,121,78,40,7, - 0,0,0,117,3,0,0,0,115,121,115,117,10,0,0,0, - 112,97,116,104,95,104,111,111,107,115,117,9,0,0,0,95, - 119,97,114,110,105,110,103,115,117,4,0,0,0,119,97,114, - 110,117,13,0,0,0,73,109,112,111,114,116,87,97,114,110, - 105,110,103,117,11,0,0,0,73,109,112,111,114,116,69,114, - 114,111,114,117,4,0,0,0,78,111,110,101,40,3,0,0, - 0,117,3,0,0,0,99,108,115,117,4,0,0,0,112,97, - 116,104,117,4,0,0,0,104,111,111,107,40,0,0,0,0, - 40,0,0,0,0,117,29,0,0,0,60,102,114,111,122,101, - 110,32,105,109,112,111,114,116,108,105,98,46,95,98,111,111, - 116,115,116,114,97,112,62,117,11,0,0,0,95,112,97,116, - 104,95,104,111,111,107,115,218,4,0,0,115,16,0,0,0, - 0,7,9,1,19,1,16,1,3,1,14,1,13,1,12,2, - 117,22,0,0,0,80,97,116,104,70,105,110,100,101,114,46, - 95,112,97,116,104,95,104,111,111,107,115,99,2,0,0,0, - 0,0,0,0,3,0,0,0,11,0,0,0,67,0,0,0, - 115,91,0,0,0,124,1,0,100,1,0,107,2,0,114,21, - 0,100,2,0,125,1,0,110,0,0,121,17,0,116,0,0, - 106,1,0,124,1,0,25,125,2,0,87,110,46,0,4,116, - 2,0,107,10,0,114,86,0,1,1,1,124,0,0,106,3, - 0,124,1,0,131,1,0,125,2,0,124,2,0,116,0,0, - 106,1,0,124,1,0,60,89,110,1,0,88,124,2,0,83, - 40,3,0,0,0,117,210,0,0,0,71,101,116,32,116,104, - 101,32,102,105,110,100,101,114,32,102,111,114,32,116,104,101, - 32,112,97,116,104,32,101,110,116,114,121,32,102,114,111,109, - 32,115,121,115,46,112,97,116,104,95,105,109,112,111,114,116, - 101,114,95,99,97,99,104,101,46,10,10,32,32,32,32,32, - 32,32,32,73,102,32,116,104,101,32,112,97,116,104,32,101, - 110,116,114,121,32,105,115,32,110,111,116,32,105,110,32,116, - 104,101,32,99,97,99,104,101,44,32,102,105,110,100,32,116, - 104,101,32,97,112,112,114,111,112,114,105,97,116,101,32,102, - 105,110,100,101,114,10,32,32,32,32,32,32,32,32,97,110, - 100,32,99,97,99,104,101,32,105,116,46,32,73,102,32,110, - 111,32,102,105,110,100,101,114,32,105,115,32,97,118,97,105, - 108,97,98,108,101,44,32,115,116,111,114,101,32,78,111,110, - 101,46,10,10,32,32,32,32,32,32,32,32,117,0,0,0, - 0,117,1,0,0,0,46,40,4,0,0,0,117,3,0,0, - 0,115,121,115,117,19,0,0,0,112,97,116,104,95,105,109, - 112,111,114,116,101,114,95,99,97,99,104,101,117,8,0,0, - 0,75,101,121,69,114,114,111,114,117,11,0,0,0,95,112, - 97,116,104,95,104,111,111,107,115,40,3,0,0,0,117,3, - 0,0,0,99,108,115,117,4,0,0,0,112,97,116,104,117, - 6,0,0,0,102,105,110,100,101,114,40,0,0,0,0,40, - 0,0,0,0,117,29,0,0,0,60,102,114,111,122,101,110, - 32,105,109,112,111,114,116,108,105,98,46,95,98,111,111,116, - 115,116,114,97,112,62,117,20,0,0,0,95,112,97,116,104, - 95,105,109,112,111,114,116,101,114,95,99,97,99,104,101,235, - 4,0,0,115,16,0,0,0,0,8,12,1,9,1,3,1, - 17,1,13,1,15,1,18,1,117,31,0,0,0,80,97,116, + 108,111,97,100,95,109,111,100,117,108,101,78,41,11,114,57, + 0,0,0,114,56,0,0,0,114,58,0,0,0,114,72,0, + 0,0,114,19,1,0,0,114,206,0,0,0,114,220,0,0, + 0,114,17,1,0,0,114,16,1,0,0,114,2,1,0,0, + 114,5,1,0,0,114,4,0,0,0,114,4,0,0,0,114, + 4,0,0,0,114,5,0,0,0,114,252,0,0,0,11,7, + 0,0,115,14,0,0,0,12,1,12,3,18,9,12,3,12, + 3,12,3,12,3,114,252,0,0,0,99,0,0,0,0,0, + 0,0,0,0,0,0,0,5,0,0,0,64,0,0,0,115, + 160,0,0,0,101,0,0,90,1,0,100,0,0,90,2,0, + 100,1,0,90,3,0,101,4,0,100,2,0,100,3,0,132, + 0,0,131,1,0,90,5,0,101,4,0,100,4,0,100,5, + 0,132,0,0,131,1,0,90,6,0,101,4,0,100,6,0, + 100,7,0,132,0,0,131,1,0,90,7,0,101,4,0,100, + 8,0,100,9,0,132,0,0,131,1,0,90,8,0,101,4, + 0,100,10,0,100,11,0,100,12,0,132,1,0,131,1,0, + 90,9,0,101,4,0,100,10,0,100,10,0,100,13,0,100, + 14,0,132,2,0,131,1,0,90,10,0,101,4,0,100,10, + 0,100,15,0,100,16,0,132,1,0,131,1,0,90,11,0, + 100,10,0,83,41,17,218,10,80,97,116,104,70,105,110,100, + 101,114,122,62,77,101,116,97,32,112,97,116,104,32,102,105, + 110,100,101,114,32,102,111,114,32,115,121,115,46,112,97,116, + 104,32,97,110,100,32,112,97,99,107,97,103,101,32,95,95, + 112,97,116,104,95,95,32,97,116,116,114,105,98,117,116,101, + 115,46,99,1,0,0,0,0,0,0,0,2,0,0,0,4, + 0,0,0,67,0,0,0,115,58,0,0,0,120,51,0,116, + 0,0,106,1,0,106,2,0,131,0,0,68,93,34,0,125, + 1,0,116,3,0,124,1,0,100,1,0,131,2,0,114,16, + 0,124,1,0,106,4,0,131,0,0,1,113,16,0,113,16, + 0,87,100,2,0,83,41,3,122,125,67,97,108,108,32,116, + 104,101,32,105,110,118,97,108,105,100,97,116,101,95,99,97, + 99,104,101,115,40,41,32,109,101,116,104,111,100,32,111,110, + 32,97,108,108,32,112,97,116,104,32,101,110,116,114,121,32, + 102,105,110,100,101,114,115,10,32,32,32,32,32,32,32,32, + 115,116,111,114,101,100,32,105,110,32,115,121,115,46,112,97, + 116,104,95,105,109,112,111,114,116,101,114,95,99,97,99,104, + 101,115,32,40,119,104,101,114,101,32,105,109,112,108,101,109, + 101,110,116,101,100,41,46,218,17,105,110,118,97,108,105,100, + 97,116,101,95,99,97,99,104,101,115,78,41,5,114,7,0, + 0,0,218,19,112,97,116,104,95,105,109,112,111,114,116,101, + 114,95,99,97,99,104,101,218,6,118,97,108,117,101,115,114, + 60,0,0,0,114,75,1,0,0,41,2,114,12,1,0,0, + 218,6,102,105,110,100,101,114,114,4,0,0,0,114,4,0, + 0,0,114,5,0,0,0,114,75,1,0,0,53,7,0,0, + 115,6,0,0,0,0,4,22,1,15,1,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,2,0,0,0,0,0, + 0,0,3,0,0,0,12,0,0,0,67,0,0,0,115,94, + 0,0,0,116,0,0,106,1,0,115,28,0,116,2,0,106, + 3,0,100,1,0,116,4,0,131,2,0,1,110,0,0,120, + 59,0,116,0,0,106,1,0,68,93,44,0,125,2,0,121, + 14,0,124,2,0,124,1,0,131,1,0,83,87,113,38,0, + 4,116,5,0,107,10,0,114,81,0,1,1,1,119,38,0, + 89,113,38,0,88,113,38,0,87,100,2,0,83,100,2,0, + 83,41,3,122,113,83,101,97,114,99,104,32,115,101,113,117, + 101,110,99,101,32,111,102,32,104,111,111,107,115,32,102,111, + 114,32,97,32,102,105,110,100,101,114,32,102,111,114,32,39, + 112,97,116,104,39,46,10,10,32,32,32,32,32,32,32,32, + 73,102,32,39,104,111,111,107,115,39,32,105,115,32,102,97, + 108,115,101,32,116,104,101,110,32,117,115,101,32,115,121,115, + 46,112,97,116,104,95,104,111,111,107,115,46,10,10,32,32, + 32,32,32,32,32,32,122,23,115,121,115,46,112,97,116,104, + 95,104,111,111,107,115,32,105,115,32,101,109,112,116,121,78, + 41,6,114,7,0,0,0,218,10,112,97,116,104,95,104,111, + 111,107,115,114,167,0,0,0,114,168,0,0,0,114,169,0, + 0,0,114,154,0,0,0,41,3,114,12,1,0,0,114,35, + 0,0,0,90,4,104,111,111,107,114,4,0,0,0,114,4, + 0,0,0,114,5,0,0,0,218,11,95,112,97,116,104,95, + 104,111,111,107,115,61,7,0,0,115,16,0,0,0,0,7, + 9,1,19,1,16,1,3,1,14,1,13,1,12,2,122,22, + 80,97,116,104,70,105,110,100,101,114,46,95,112,97,116,104, + 95,104,111,111,107,115,99,2,0,0,0,0,0,0,0,3, + 0,0,0,11,0,0,0,67,0,0,0,115,97,0,0,0, + 124,1,0,100,1,0,107,2,0,114,27,0,116,0,0,106, + 1,0,131,0,0,125,1,0,110,0,0,121,17,0,116,2, + 0,106,3,0,124,1,0,25,125,2,0,87,110,46,0,4, + 116,4,0,107,10,0,114,92,0,1,1,1,124,0,0,106, + 5,0,124,1,0,131,1,0,125,2,0,124,2,0,116,2, + 0,106,3,0,124,1,0,60,89,110,1,0,88,124,2,0, + 83,41,2,122,210,71,101,116,32,116,104,101,32,102,105,110, + 100,101,114,32,102,111,114,32,116,104,101,32,112,97,116,104, + 32,101,110,116,114,121,32,102,114,111,109,32,115,121,115,46, + 112,97,116,104,95,105,109,112,111,114,116,101,114,95,99,97, + 99,104,101,46,10,10,32,32,32,32,32,32,32,32,73,102, + 32,116,104,101,32,112,97,116,104,32,101,110,116,114,121,32, + 105,115,32,110,111,116,32,105,110,32,116,104,101,32,99,97, + 99,104,101,44,32,102,105,110,100,32,116,104,101,32,97,112, + 112,114,111,112,114,105,97,116,101,32,102,105,110,100,101,114, + 10,32,32,32,32,32,32,32,32,97,110,100,32,99,97,99, + 104,101,32,105,116,46,32,73,102,32,110,111,32,102,105,110, + 100,101,114,32,105,115,32,97,118,97,105,108,97,98,108,101, + 44,32,115,116,111,114,101,32,78,111,110,101,46,10,10,32, + 32,32,32,32,32,32,32,114,30,0,0,0,41,6,114,3, + 0,0,0,114,45,0,0,0,114,7,0,0,0,114,76,1, + 0,0,114,79,0,0,0,114,80,1,0,0,41,3,114,12, + 1,0,0,114,35,0,0,0,114,78,1,0,0,114,4,0, + 0,0,114,4,0,0,0,114,5,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,78,7,0,0,115,16,0,0,0,0,8,12,1,15, + 1,3,1,17,1,13,1,15,1,18,1,122,31,80,97,116, 104,70,105,110,100,101,114,46,95,112,97,116,104,95,105,109, 112,111,114,116,101,114,95,99,97,99,104,101,99,3,0,0, - 0,0,0,0,0,8,0,0,0,5,0,0,0,67,0,0, - 0,115,189,0,0,0,103,0,0,125,3,0,120,176,0,124, - 2,0,68,93,158,0,125,4,0,116,0,0,124,4,0,116, - 1,0,116,2,0,102,2,0,131,2,0,115,46,0,113,13, - 0,110,0,0,124,0,0,106,3,0,124,4,0,131,1,0, - 125,5,0,124,5,0,100,2,0,107,9,0,114,13,0,116, - 5,0,124,5,0,100,1,0,131,2,0,114,112,0,124,5, - 0,106,6,0,124,1,0,131,1,0,92,2,0,125,6,0, - 125,7,0,110,21,0,124,5,0,106,7,0,124,1,0,131, - 1,0,125,6,0,103,0,0,125,7,0,124,6,0,100,2, - 0,107,9,0,114,155,0,124,6,0,124,3,0,102,2,0, - 83,124,3,0,106,8,0,124,7,0,131,1,0,1,113,13, - 0,113,13,0,87,100,2,0,124,3,0,102,2,0,83,100, - 2,0,83,40,3,0,0,0,117,63,0,0,0,70,105,110, - 100,32,116,104,101,32,108,111,97,100,101,114,32,111,114,32, - 110,97,109,101,115,112,97,99,101,95,112,97,116,104,32,102, - 111,114,32,116,104,105,115,32,109,111,100,117,108,101,47,112, - 97,99,107,97,103,101,32,110,97,109,101,46,117,11,0,0, - 0,102,105,110,100,95,108,111,97,100,101,114,78,40,9,0, - 0,0,117,10,0,0,0,105,115,105,110,115,116,97,110,99, - 101,117,3,0,0,0,115,116,114,117,5,0,0,0,98,121, - 116,101,115,117,20,0,0,0,95,112,97,116,104,95,105,109, - 112,111,114,116,101,114,95,99,97,99,104,101,117,4,0,0, - 0,78,111,110,101,117,7,0,0,0,104,97,115,97,116,116, - 114,117,11,0,0,0,102,105,110,100,95,108,111,97,100,101, - 114,117,11,0,0,0,102,105,110,100,95,109,111,100,117,108, - 101,117,6,0,0,0,101,120,116,101,110,100,40,8,0,0, - 0,117,3,0,0,0,99,108,115,117,8,0,0,0,102,117, - 108,108,110,97,109,101,117,4,0,0,0,112,97,116,104,117, - 14,0,0,0,110,97,109,101,115,112,97,99,101,95,112,97, - 116,104,117,5,0,0,0,101,110,116,114,121,117,6,0,0, - 0,102,105,110,100,101,114,117,6,0,0,0,108,111,97,100, - 101,114,117,8,0,0,0,112,111,114,116,105,111,110,115,40, - 0,0,0,0,40,0,0,0,0,117,29,0,0,0,60,102, - 114,111,122,101,110,32,105,109,112,111,114,116,108,105,98,46, - 95,98,111,111,116,115,116,114,97,112,62,117,11,0,0,0, - 95,103,101,116,95,108,111,97,100,101,114,252,4,0,0,115, - 28,0,0,0,0,5,6,1,13,1,21,1,6,1,15,1, - 12,1,15,1,24,2,15,1,6,1,12,2,10,5,20,2, - 117,22,0,0,0,80,97,116,104,70,105,110,100,101,114,46, - 95,103,101,116,95,108,111,97,100,101,114,99,3,0,0,0, - 0,0,0,0,5,0,0,0,4,0,0,0,67,0,0,0, - 115,97,0,0,0,124,2,0,100,1,0,107,8,0,114,24, - 0,116,1,0,106,2,0,125,2,0,110,0,0,124,0,0, - 106,3,0,124,1,0,124,2,0,131,2,0,92,2,0,125, - 3,0,125,4,0,124,3,0,100,1,0,107,9,0,114,64, - 0,124,3,0,83,124,4,0,114,89,0,116,4,0,124,1, - 0,124,4,0,124,0,0,106,3,0,131,3,0,83,100,1, - 0,83,100,1,0,83,40,2,0,0,0,117,98,0,0,0, - 70,105,110,100,32,116,104,101,32,109,111,100,117,108,101,32, - 111,110,32,115,121,115,46,112,97,116,104,32,111,114,32,39, - 112,97,116,104,39,32,98,97,115,101,100,32,111,110,32,115, - 121,115,46,112,97,116,104,95,104,111,111,107,115,32,97,110, - 100,10,32,32,32,32,32,32,32,32,115,121,115,46,112,97, - 116,104,95,105,109,112,111,114,116,101,114,95,99,97,99,104, - 101,46,78,40,5,0,0,0,117,4,0,0,0,78,111,110, - 101,117,3,0,0,0,115,121,115,117,4,0,0,0,112,97, - 116,104,117,11,0,0,0,95,103,101,116,95,108,111,97,100, - 101,114,117,15,0,0,0,78,97,109,101,115,112,97,99,101, - 76,111,97,100,101,114,40,5,0,0,0,117,3,0,0,0, - 99,108,115,117,8,0,0,0,102,117,108,108,110,97,109,101, - 117,4,0,0,0,112,97,116,104,117,6,0,0,0,108,111, - 97,100,101,114,117,14,0,0,0,110,97,109,101,115,112,97, - 99,101,95,112,97,116,104,40,0,0,0,0,40,0,0,0, - 0,117,29,0,0,0,60,102,114,111,122,101,110,32,105,109, - 112,111,114,116,108,105,98,46,95,98,111,111,116,115,116,114, - 97,112,62,117,11,0,0,0,102,105,110,100,95,109,111,100, - 117,108,101,23,5,0,0,115,16,0,0,0,0,4,12,1, - 12,1,24,1,12,1,4,2,6,3,19,2,117,22,0,0, - 0,80,97,116,104,70,105,110,100,101,114,46,102,105,110,100, - 95,109,111,100,117,108,101,78,40,11,0,0,0,117,8,0, - 0,0,95,95,110,97,109,101,95,95,117,10,0,0,0,95, - 95,109,111,100,117,108,101,95,95,117,12,0,0,0,95,95, - 113,117,97,108,110,97,109,101,95,95,117,7,0,0,0,95, - 95,100,111,99,95,95,117,11,0,0,0,99,108,97,115,115, - 109,101,116,104,111,100,117,17,0,0,0,105,110,118,97,108, - 105,100,97,116,101,95,99,97,99,104,101,115,117,11,0,0, - 0,95,112,97,116,104,95,104,111,111,107,115,117,20,0,0, - 0,95,112,97,116,104,95,105,109,112,111,114,116,101,114,95, - 99,97,99,104,101,117,11,0,0,0,95,103,101,116,95,108, - 111,97,100,101,114,117,4,0,0,0,78,111,110,101,117,11, - 0,0,0,102,105,110,100,95,109,111,100,117,108,101,40,1, - 0,0,0,117,10,0,0,0,95,95,108,111,99,97,108,115, - 95,95,40,0,0,0,0,40,0,0,0,0,117,29,0,0, - 0,60,102,114,111,122,101,110,32,105,109,112,111,114,116,108, - 105,98,46,95,98,111,111,116,115,116,114,97,112,62,117,10, - 0,0,0,80,97,116,104,70,105,110,100,101,114,206,4,0, - 0,115,14,0,0,0,16,2,6,2,18,8,18,17,18,17, - 18,27,3,1,117,10,0,0,0,80,97,116,104,70,105,110, - 100,101,114,99,1,0,0,0,0,0,0,0,1,0,0,0, - 3,0,0,0,66,0,0,0,115,110,0,0,0,124,0,0, - 69,101,0,0,90,1,0,100,0,0,90,2,0,100,1,0, - 90,3,0,100,2,0,100,3,0,132,0,0,90,4,0,100, - 4,0,100,5,0,132,0,0,90,5,0,101,6,0,90,7, - 0,100,6,0,100,7,0,132,0,0,90,8,0,100,8,0, - 100,9,0,132,0,0,90,9,0,101,10,0,100,10,0,100, - 11,0,132,0,0,131,1,0,90,11,0,100,12,0,100,13, - 0,132,0,0,90,12,0,100,14,0,83,40,15,0,0,0, - 117,10,0,0,0,70,105,108,101,70,105,110,100,101,114,117, - 172,0,0,0,70,105,108,101,45,98,97,115,101,100,32,102, - 105,110,100,101,114,46,10,10,32,32,32,32,73,110,116,101, - 114,97,99,116,105,111,110,115,32,119,105,116,104,32,116,104, - 101,32,102,105,108,101,32,115,121,115,116,101,109,32,97,114, - 101,32,99,97,99,104,101,100,32,102,111,114,32,112,101,114, - 102,111,114,109,97,110,99,101,44,32,98,101,105,110,103,10, - 32,32,32,32,114,101,102,114,101,115,104,101,100,32,119,104, - 101,110,32,116,104,101,32,100,105,114,101,99,116,111,114,121, - 32,116,104,101,32,102,105,110,100,101,114,32,105,115,32,104, - 97,110,100,108,105,110,103,32,104,97,115,32,98,101,101,110, - 32,109,111,100,105,102,105,101,100,46,10,10,32,32,32,32, - 99,2,0,0,0,0,0,0,0,5,0,0,0,5,0,0, - 0,7,0,0,0,115,122,0,0,0,103,0,0,125,3,0, - 120,52,0,124,2,0,68,93,44,0,92,2,0,137,0,0, - 125,4,0,124,3,0,106,0,0,135,0,0,102,1,0,100, - 1,0,100,2,0,134,0,0,124,4,0,68,131,1,0,131, - 1,0,1,113,13,0,87,124,3,0,124,0,0,95,1,0, - 124,1,0,112,79,0,100,3,0,124,0,0,95,2,0,100, - 6,0,124,0,0,95,3,0,116,4,0,131,0,0,124,0, - 0,95,5,0,116,4,0,131,0,0,124,0,0,95,6,0, - 100,5,0,83,40,7,0,0,0,117,154,0,0,0,73,110, - 105,116,105,97,108,105,122,101,32,119,105,116,104,32,116,104, - 101,32,112,97,116,104,32,116,111,32,115,101,97,114,99,104, - 32,111,110,32,97,110,100,32,97,32,118,97,114,105,97,98, - 108,101,32,110,117,109,98,101,114,32,111,102,10,32,32,32, - 32,32,32,32,32,50,45,116,117,112,108,101,115,32,99,111, - 110,116,97,105,110,105,110,103,32,116,104,101,32,108,111,97, - 100,101,114,32,97,110,100,32,116,104,101,32,102,105,108,101, - 32,115,117,102,102,105,120,101,115,32,116,104,101,32,108,111, - 97,100,101,114,10,32,32,32,32,32,32,32,32,114,101,99, - 111,103,110,105,122,101,115,46,99,1,0,0,0,0,0,0, - 0,2,0,0,0,3,0,0,0,51,0,0,0,115,27,0, - 0,0,124,0,0,93,17,0,125,1,0,124,1,0,136,0, - 0,102,2,0,86,1,113,3,0,100,0,0,83,40,1,0, - 0,0,78,40,0,0,0,0,40,2,0,0,0,117,2,0, - 0,0,46,48,117,6,0,0,0,115,117,102,102,105,120,40, - 1,0,0,0,117,6,0,0,0,108,111,97,100,101,114,40, - 0,0,0,0,117,29,0,0,0,60,102,114,111,122,101,110, - 32,105,109,112,111,114,116,108,105,98,46,95,98,111,111,116, - 115,116,114,97,112,62,117,9,0,0,0,60,103,101,110,101, - 120,112,114,62,56,5,0,0,115,2,0,0,0,6,0,117, - 38,0,0,0,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,117,1,0,0,0,46, - 105,1,0,0,0,78,105,255,255,255,255,40,7,0,0,0, - 117,6,0,0,0,101,120,116,101,110,100,117,8,0,0,0, - 95,108,111,97,100,101,114,115,117,4,0,0,0,112,97,116, - 104,117,11,0,0,0,95,112,97,116,104,95,109,116,105,109, - 101,117,3,0,0,0,115,101,116,117,11,0,0,0,95,112, - 97,116,104,95,99,97,99,104,101,117,19,0,0,0,95,114, - 101,108,97,120,101,100,95,112,97,116,104,95,99,97,99,104, - 101,40,5,0,0,0,117,4,0,0,0,115,101,108,102,117, - 4,0,0,0,112,97,116,104,117,14,0,0,0,108,111,97, - 100,101,114,95,100,101,116,97,105,108,115,117,7,0,0,0, - 108,111,97,100,101,114,115,117,8,0,0,0,115,117,102,102, - 105,120,101,115,40,0,0,0,0,40,1,0,0,0,117,6, - 0,0,0,108,111,97,100,101,114,117,29,0,0,0,60,102, - 114,111,122,101,110,32,105,109,112,111,114,116,108,105,98,46, - 95,98,111,111,116,115,116,114,97,112,62,117,8,0,0,0, - 95,95,105,110,105,116,95,95,50,5,0,0,115,16,0,0, - 0,0,4,6,1,19,1,36,1,9,2,15,1,9,1,12, - 1,117,19,0,0,0,70,105,108,101,70,105,110,100,101,114, - 46,95,95,105,110,105,116,95,95,99,1,0,0,0,0,0, - 0,0,1,0,0,0,2,0,0,0,67,0,0,0,115,13, - 0,0,0,100,3,0,124,0,0,95,0,0,100,2,0,83, - 40,4,0,0,0,117,31,0,0,0,73,110,118,97,108,105, - 100,97,116,101,32,116,104,101,32,100,105,114,101,99,116,111, - 114,121,32,109,116,105,109,101,46,105,1,0,0,0,78,105, - 255,255,255,255,40,1,0,0,0,117,11,0,0,0,95,112, - 97,116,104,95,109,116,105,109,101,40,1,0,0,0,117,4, - 0,0,0,115,101,108,102,40,0,0,0,0,40,0,0,0, - 0,117,29,0,0,0,60,102,114,111,122,101,110,32,105,109, - 112,111,114,116,108,105,98,46,95,98,111,111,116,115,116,114, - 97,112,62,117,17,0,0,0,105,110,118,97,108,105,100,97, - 116,101,95,99,97,99,104,101,115,64,5,0,0,115,2,0, - 0,0,0,2,117,28,0,0,0,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,0,12,0, - 0,0,13,0,0,0,67,0,0,0,115,216,1,0,0,100, - 8,0,125,2,0,124,1,0,106,1,0,100,1,0,131,1, - 0,100,2,0,25,125,3,0,121,25,0,116,2,0,106,3, - 0,124,0,0,106,4,0,131,1,0,106,5,0,125,4,0, - 87,110,24,0,4,116,6,0,107,10,0,114,76,0,1,1, - 1,100,9,0,125,4,0,89,110,1,0,88,124,4,0,124, - 0,0,106,7,0,107,3,0,114,114,0,124,0,0,106,8, - 0,131,0,0,1,124,4,0,124,0,0,95,7,0,110,0, - 0,116,9,0,131,0,0,114,147,0,124,0,0,106,10,0, - 125,5,0,124,3,0,106,11,0,131,0,0,125,6,0,110, - 15,0,124,0,0,106,12,0,125,5,0,124,3,0,125,6, - 0,124,6,0,124,5,0,107,6,0,114,45,1,116,13,0, - 124,0,0,106,4,0,124,3,0,131,2,0,125,7,0,116, - 14,0,124,7,0,131,1,0,114,45,1,120,91,0,124,0, - 0,106,15,0,68,93,71,0,92,2,0,125,8,0,125,9, - 0,100,4,0,124,8,0,23,125,10,0,116,13,0,124,7, - 0,124,10,0,131,2,0,125,11,0,116,16,0,124,11,0, - 131,1,0,114,214,0,124,9,0,124,1,0,124,11,0,131, - 2,0,124,7,0,103,1,0,102,2,0,83,113,214,0,87, - 100,10,0,125,2,0,113,45,1,110,0,0,120,120,0,124, - 0,0,106,15,0,68,93,109,0,92,2,0,125,8,0,125, - 9,0,116,13,0,124,0,0,106,4,0,124,3,0,124,8, - 0,23,131,2,0,125,11,0,116,18,0,100,5,0,106,19, - 0,124,11,0,131,1,0,100,6,0,100,2,0,131,1,1, - 1,124,6,0,124,8,0,23,124,5,0,107,6,0,114,55, - 1,116,16,0,124,11,0,131,1,0,114,164,1,124,9,0, - 124,1,0,124,11,0,131,2,0,103,0,0,102,2,0,83, - 113,55,1,113,55,1,87,124,2,0,114,206,1,116,18,0, - 100,7,0,106,19,0,124,7,0,131,1,0,131,1,0,1, - 100,11,0,124,7,0,103,1,0,102,2,0,83,100,11,0, - 103,0,0,102,2,0,83,40,12,0,0,0,117,125,0,0, - 0,84,114,121,32,116,111,32,102,105,110,100,32,97,32,108, - 111,97,100,101,114,32,102,111,114,32,116,104,101,32,115,112, - 101,99,105,102,105,101,100,32,109,111,100,117,108,101,44,32, - 111,114,32,116,104,101,32,110,97,109,101,115,112,97,99,101, - 10,32,32,32,32,32,32,32,32,112,97,99,107,97,103,101, - 32,112,111,114,116,105,111,110,115,46,32,82,101,116,117,114, - 110,115,32,40,108,111,97,100,101,114,44,32,108,105,115,116, - 45,111,102,45,112,111,114,116,105,111,110,115,41,46,117,1, - 0,0,0,46,105,2,0,0,0,105,1,0,0,0,117,8, - 0,0,0,95,95,105,110,105,116,95,95,117,9,0,0,0, - 116,114,121,105,110,103,32,123,125,117,9,0,0,0,118,101, - 114,98,111,115,105,116,121,117,25,0,0,0,112,111,115,115, - 105,98,108,101,32,110,97,109,101,115,112,97,99,101,32,102, - 111,114,32,123,125,70,105,255,255,255,255,84,78,40,21,0, - 0,0,117,5,0,0,0,70,97,108,115,101,117,10,0,0, - 0,114,112,97,114,116,105,116,105,111,110,117,3,0,0,0, - 95,111,115,117,4,0,0,0,115,116,97,116,117,4,0,0, - 0,112,97,116,104,117,8,0,0,0,115,116,95,109,116,105, - 109,101,117,7,0,0,0,79,83,69,114,114,111,114,117,11, - 0,0,0,95,112,97,116,104,95,109,116,105,109,101,117,11, - 0,0,0,95,102,105,108,108,95,99,97,99,104,101,117,11, - 0,0,0,95,114,101,108,97,120,95,99,97,115,101,117,19, - 0,0,0,95,114,101,108,97,120,101,100,95,112,97,116,104, - 95,99,97,99,104,101,117,5,0,0,0,108,111,119,101,114, - 117,11,0,0,0,95,112,97,116,104,95,99,97,99,104,101, - 117,10,0,0,0,95,112,97,116,104,95,106,111,105,110,117, - 11,0,0,0,95,112,97,116,104,95,105,115,100,105,114,117, - 8,0,0,0,95,108,111,97,100,101,114,115,117,12,0,0, - 0,95,112,97,116,104,95,105,115,102,105,108,101,117,4,0, - 0,0,84,114,117,101,117,16,0,0,0,95,118,101,114,98, - 111,115,101,95,109,101,115,115,97,103,101,117,6,0,0,0, - 102,111,114,109,97,116,117,4,0,0,0,78,111,110,101,40, - 12,0,0,0,117,4,0,0,0,115,101,108,102,117,8,0, - 0,0,102,117,108,108,110,97,109,101,117,12,0,0,0,105, - 115,95,110,97,109,101,115,112,97,99,101,117,11,0,0,0, - 116,97,105,108,95,109,111,100,117,108,101,117,5,0,0,0, - 109,116,105,109,101,117,5,0,0,0,99,97,99,104,101,117, - 12,0,0,0,99,97,99,104,101,95,109,111,100,117,108,101, - 117,9,0,0,0,98,97,115,101,95,112,97,116,104,117,6, - 0,0,0,115,117,102,102,105,120,117,6,0,0,0,108,111, - 97,100,101,114,117,13,0,0,0,105,110,105,116,95,102,105, - 108,101,110,97,109,101,117,9,0,0,0,102,117,108,108,95, - 112,97,116,104,40,0,0,0,0,40,0,0,0,0,117,29, - 0,0,0,60,102,114,111,122,101,110,32,105,109,112,111,114, - 116,108,105,98,46,95,98,111,111,116,115,116,114,97,112,62, - 117,11,0,0,0,102,105,110,100,95,108,111,97,100,101,114, - 70,5,0,0,115,66,0,0,0,0,3,6,1,19,1,3, - 1,25,1,13,1,11,1,15,1,10,1,12,2,9,1,9, - 1,15,2,9,1,6,2,12,1,18,1,12,1,22,1,10, - 1,15,1,12,1,26,4,12,2,22,1,22,1,25,1,16, - 1,12,1,26,1,6,1,19,1,13,1,117,22,0,0,0, - 70,105,108,101,70,105,110,100,101,114,46,102,105,110,100,95, - 108,111,97,100,101,114,99,1,0,0,0,0,0,0,0,9, - 0,0,0,13,0,0,0,67,0,0,0,115,8,1,0,0, - 124,0,0,106,0,0,125,1,0,121,19,0,116,1,0,106, - 2,0,124,1,0,131,1,0,125,2,0,87,110,33,0,4, - 116,3,0,116,4,0,116,5,0,102,3,0,107,10,0,114, - 63,0,1,1,1,103,0,0,125,2,0,89,110,1,0,88, - 116,6,0,106,7,0,106,8,0,100,1,0,131,1,0,115, - 100,0,116,9,0,124,2,0,131,1,0,124,0,0,95,10, - 0,110,111,0,116,9,0,131,0,0,125,3,0,120,90,0, - 124,2,0,68,93,82,0,125,4,0,124,4,0,106,11,0, - 100,2,0,131,1,0,92,3,0,125,5,0,125,6,0,125, - 7,0,124,6,0,114,179,0,100,3,0,106,12,0,124,5, - 0,124,7,0,106,13,0,131,0,0,131,2,0,125,8,0, - 110,6,0,124,5,0,125,8,0,124,3,0,106,14,0,124, - 8,0,131,1,0,1,113,116,0,87,124,3,0,124,0,0, - 95,10,0,116,6,0,106,7,0,106,8,0,116,15,0,131, - 1,0,114,4,1,116,9,0,100,4,0,100,5,0,132,0, - 0,124,2,0,68,131,1,0,131,1,0,124,0,0,95,16, - 0,110,0,0,100,6,0,83,40,7,0,0,0,117,68,0, - 0,0,70,105,108,108,32,116,104,101,32,99,97,99,104,101, - 32,111,102,32,112,111,116,101,110,116,105,97,108,32,109,111, - 100,117,108,101,115,32,97,110,100,32,112,97,99,107,97,103, - 101,115,32,102,111,114,32,116,104,105,115,32,100,105,114,101, - 99,116,111,114,121,46,117,3,0,0,0,119,105,110,117,1, - 0,0,0,46,117,5,0,0,0,123,125,46,123,125,99,1, - 0,0,0,0,0,0,0,2,0,0,0,2,0,0,0,115, - 0,0,0,115,27,0,0,0,124,0,0,93,17,0,125,1, - 0,124,1,0,106,0,0,131,0,0,86,1,113,3,0,100, - 0,0,83,40,1,0,0,0,78,40,1,0,0,0,117,5, - 0,0,0,108,111,119,101,114,40,2,0,0,0,117,2,0, - 0,0,46,48,117,2,0,0,0,102,110,40,0,0,0,0, - 40,0,0,0,0,117,29,0,0,0,60,102,114,111,122,101, - 110,32,105,109,112,111,114,116,108,105,98,46,95,98,111,111, - 116,115,116,114,97,112,62,117,9,0,0,0,60,103,101,110, - 101,120,112,114,62,143,5,0,0,115,2,0,0,0,6,0, - 117,41,0,0,0,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,103,101,110,101,120,112,114,62,78,40, - 17,0,0,0,117,4,0,0,0,112,97,116,104,117,3,0, - 0,0,95,111,115,117,7,0,0,0,108,105,115,116,100,105, - 114,117,17,0,0,0,70,105,108,101,78,111,116,70,111,117, - 110,100,69,114,114,111,114,117,15,0,0,0,80,101,114,109, - 105,115,115,105,111,110,69,114,114,111,114,117,18,0,0,0, - 78,111,116,65,68,105,114,101,99,116,111,114,121,69,114,114, - 111,114,117,3,0,0,0,115,121,115,117,8,0,0,0,112, - 108,97,116,102,111,114,109,117,10,0,0,0,115,116,97,114, - 116,115,119,105,116,104,117,3,0,0,0,115,101,116,117,11, - 0,0,0,95,112,97,116,104,95,99,97,99,104,101,117,9, - 0,0,0,112,97,114,116,105,116,105,111,110,117,6,0,0, - 0,102,111,114,109,97,116,117,5,0,0,0,108,111,119,101, - 114,117,3,0,0,0,97,100,100,117,27,0,0,0,95,67, - 65,83,69,95,73,78,83,69,78,83,73,84,73,86,69,95, - 80,76,65,84,70,79,82,77,83,117,19,0,0,0,95,114, - 101,108,97,120,101,100,95,112,97,116,104,95,99,97,99,104, - 101,40,9,0,0,0,117,4,0,0,0,115,101,108,102,117, - 4,0,0,0,112,97,116,104,117,8,0,0,0,99,111,110, - 116,101,110,116,115,117,21,0,0,0,108,111,119,101,114,95, - 115,117,102,102,105,120,95,99,111,110,116,101,110,116,115,117, - 4,0,0,0,105,116,101,109,117,4,0,0,0,110,97,109, - 101,117,3,0,0,0,100,111,116,117,6,0,0,0,115,117, - 102,102,105,120,117,8,0,0,0,110,101,119,95,110,97,109, - 101,40,0,0,0,0,40,0,0,0,0,117,29,0,0,0, - 60,102,114,111,122,101,110,32,105,109,112,111,114,116,108,105, - 98,46,95,98,111,111,116,115,116,114,97,112,62,117,11,0, - 0,0,95,102,105,108,108,95,99,97,99,104,101,114,5,0, - 0,115,34,0,0,0,0,2,9,1,3,1,19,1,22,3, - 11,3,18,1,18,7,9,1,13,1,24,1,6,1,27,2, - 6,1,17,1,9,1,18,1,117,22,0,0,0,70,105,108, - 101,70,105,110,100,101,114,46,95,102,105,108,108,95,99,97, - 99,104,101,99,1,0,0,0,0,0,0,0,3,0,0,0, - 3,0,0,0,7,0,0,0,115,25,0,0,0,135,0,0, - 135,1,0,102,2,0,100,1,0,100,2,0,134,0,0,125, - 2,0,124,2,0,83,40,3,0,0,0,117,20,1,0,0, - 65,32,99,108,97,115,115,32,109,101,116,104,111,100,32,119, - 104,105,99,104,32,114,101,116,117,114,110,115,32,97,32,99, - 108,111,115,117,114,101,32,116,111,32,117,115,101,32,111,110, - 32,115,121,115,46,112,97,116,104,95,104,111,111,107,10,32, - 32,32,32,32,32,32,32,119,104,105,99,104,32,119,105,108, - 108,32,114,101,116,117,114,110,32,97,110,32,105,110,115,116, - 97,110,99,101,32,117,115,105,110,103,32,116,104,101,32,115, - 112,101,99,105,102,105,101,100,32,108,111,97,100,101,114,115, - 32,97,110,100,32,116,104,101,32,112,97,116,104,10,32,32, - 32,32,32,32,32,32,99,97,108,108,101,100,32,111,110,32, - 116,104,101,32,99,108,111,115,117,114,101,46,10,10,32,32, - 32,32,32,32,32,32,73,102,32,116,104,101,32,112,97,116, - 104,32,99,97,108,108,101,100,32,111,110,32,116,104,101,32, - 99,108,111,115,117,114,101,32,105,115,32,110,111,116,32,97, - 32,100,105,114,101,99,116,111,114,121,44,32,73,109,112,111, - 114,116,69,114,114,111,114,32,105,115,10,32,32,32,32,32, - 32,32,32,114,97,105,115,101,100,46,10,10,32,32,32,32, - 32,32,32,32,99,1,0,0,0,0,0,0,0,1,0,0, - 0,4,0,0,0,19,0,0,0,115,46,0,0,0,116,0, - 0,124,0,0,131,1,0,115,33,0,116,1,0,100,1,0, - 100,2,0,124,0,0,131,1,1,130,1,0,110,0,0,136, - 0,0,124,0,0,136,1,0,140,1,0,83,40,3,0,0, - 0,117,45,0,0,0,80,97,116,104,32,104,111,111,107,32, - 102,111,114,32,105,109,112,111,114,116,108,105,98,46,109,97, - 99,104,105,110,101,114,121,46,70,105,108,101,70,105,110,100, - 101,114,46,117,30,0,0,0,111,110,108,121,32,100,105,114, - 101,99,116,111,114,105,101,115,32,97,114,101,32,115,117,112, - 112,111,114,116,101,100,117,4,0,0,0,112,97,116,104,40, - 2,0,0,0,117,11,0,0,0,95,112,97,116,104,95,105, - 115,100,105,114,117,11,0,0,0,73,109,112,111,114,116,69, - 114,114,111,114,40,1,0,0,0,117,4,0,0,0,112,97, - 116,104,40,2,0,0,0,117,3,0,0,0,99,108,115,117, - 14,0,0,0,108,111,97,100,101,114,95,100,101,116,97,105, - 108,115,40,0,0,0,0,117,29,0,0,0,60,102,114,111, - 122,101,110,32,105,109,112,111,114,116,108,105,98,46,95,98, - 111,111,116,115,116,114,97,112,62,117,24,0,0,0,112,97, - 116,104,95,104,111,111,107,95,102,111,114,95,70,105,108,101, - 70,105,110,100,101,114,155,5,0,0,115,6,0,0,0,0, - 2,12,1,21,1,117,54,0,0,0,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, + 0,0,0,0,0,6,0,0,0,3,0,0,0,67,0,0, + 0,115,113,0,0,0,116,0,0,124,2,0,100,1,0,131, + 2,0,114,39,0,124,2,0,106,1,0,124,1,0,131,1, + 0,92,2,0,125,3,0,125,4,0,110,21,0,124,2,0, + 106,2,0,124,1,0,131,1,0,125,3,0,103,0,0,125, + 4,0,124,3,0,100,0,0,107,9,0,114,85,0,116,3, + 0,124,1,0,124,3,0,131,2,0,83,116,4,0,124,1, + 0,100,0,0,131,2,0,125,5,0,124,4,0,124,5,0, + 95,5,0,124,5,0,83,41,2,78,114,166,0,0,0,41, + 6,114,60,0,0,0,114,166,0,0,0,114,15,1,0,0, + 114,174,0,0,0,114,217,0,0,0,114,221,0,0,0,41, + 6,114,12,1,0,0,114,159,0,0,0,114,78,1,0,0, + 114,170,0,0,0,114,171,0,0,0,114,178,0,0,0,114, + 4,0,0,0,114,4,0,0,0,114,5,0,0,0,218,16, + 95,108,101,103,97,99,121,95,103,101,116,95,115,112,101,99, + 95,7,0,0,115,18,0,0,0,0,4,15,1,24,2,15, + 1,6,1,12,1,13,1,15,1,9,1,122,27,80,97,116, + 104,70,105,110,100,101,114,46,95,108,101,103,97,99,121,95, + 103,101,116,95,115,112,101,99,78,99,4,0,0,0,0,0, + 0,0,9,0,0,0,5,0,0,0,67,0,0,0,115,252, + 0,0,0,103,0,0,125,4,0,120,239,0,124,2,0,68, + 93,203,0,125,5,0,116,0,0,124,5,0,116,1,0,116, + 2,0,102,2,0,131,2,0,115,46,0,113,13,0,110,0, + 0,124,0,0,106,3,0,124,5,0,131,1,0,125,6,0, + 124,6,0,100,1,0,107,9,0,114,13,0,116,4,0,124, + 6,0,100,2,0,131,2,0,114,109,0,124,6,0,106,5, + 0,124,1,0,124,3,0,131,2,0,125,7,0,110,18,0, + 124,0,0,106,6,0,124,1,0,124,6,0,131,2,0,125, + 7,0,124,7,0,100,1,0,107,8,0,114,145,0,113,13, + 0,110,0,0,124,7,0,106,7,0,100,1,0,107,9,0, + 114,164,0,124,7,0,83,124,7,0,106,8,0,125,8,0, + 124,8,0,100,1,0,107,8,0,114,200,0,116,9,0,100, + 3,0,131,1,0,130,1,0,110,0,0,124,4,0,106,10, + 0,124,8,0,131,1,0,1,113,13,0,113,13,0,87,116, + 11,0,124,1,0,100,1,0,131,2,0,125,7,0,124,4, + 0,124,7,0,95,8,0,124,7,0,83,100,1,0,83,41, + 4,122,63,70,105,110,100,32,116,104,101,32,108,111,97,100, + 101,114,32,111,114,32,110,97,109,101,115,112,97,99,101,95, + 112,97,116,104,32,102,111,114,32,116,104,105,115,32,109,111, + 100,117,108,101,47,112,97,99,107,97,103,101,32,110,97,109, + 101,46,78,114,14,1,0,0,122,19,115,112,101,99,32,109, + 105,115,115,105,110,103,32,108,111,97,100,101,114,41,12,114, + 193,0,0,0,218,3,115,116,114,218,5,98,121,116,101,115, + 114,81,1,0,0,114,60,0,0,0,114,14,1,0,0,114, + 82,1,0,0,114,170,0,0,0,114,221,0,0,0,114,154, + 0,0,0,114,198,0,0,0,114,217,0,0,0,41,9,114, + 12,1,0,0,114,159,0,0,0,114,35,0,0,0,114,13, + 1,0,0,218,14,110,97,109,101,115,112,97,99,101,95,112, + 97,116,104,90,5,101,110,116,114,121,114,78,1,0,0,114, + 178,0,0,0,114,171,0,0,0,114,4,0,0,0,114,4, + 0,0,0,114,5,0,0,0,218,9,95,103,101,116,95,115, + 112,101,99,110,7,0,0,115,40,0,0,0,0,5,6,1, + 13,1,21,1,6,1,15,1,12,1,15,1,21,2,18,1, + 12,1,6,1,15,1,4,1,9,1,12,1,15,5,20,2, + 15,1,9,1,122,20,80,97,116,104,70,105,110,100,101,114, + 46,95,103,101,116,95,115,112,101,99,99,4,0,0,0,0, + 0,0,0,6,0,0,0,4,0,0,0,67,0,0,0,115, + 143,0,0,0,124,2,0,100,1,0,107,8,0,114,24,0, + 116,0,0,106,1,0,125,2,0,110,0,0,124,0,0,106, + 2,0,124,1,0,124,2,0,124,3,0,131,3,0,125,4, + 0,124,4,0,100,1,0,107,8,0,114,61,0,100,1,0, + 83,124,4,0,106,3,0,100,1,0,107,8,0,114,135,0, + 124,4,0,106,4,0,125,5,0,124,5,0,114,128,0,100, + 2,0,124,4,0,95,5,0,116,6,0,124,1,0,124,5, + 0,124,0,0,106,2,0,131,3,0,124,4,0,95,4,0, + 124,4,0,83,100,1,0,83,110,4,0,124,4,0,83,100, + 1,0,83,41,3,122,98,102,105,110,100,32,116,104,101,32, + 109,111,100,117,108,101,32,111,110,32,115,121,115,46,112,97, + 116,104,32,111,114,32,39,112,97,116,104,39,32,98,97,115, + 101,100,32,111,110,32,115,121,115,46,112,97,116,104,95,104, + 111,111,107,115,32,97,110,100,10,32,32,32,32,32,32,32, + 32,115,121,115,46,112,97,116,104,95,105,109,112,111,114,116, + 101,114,95,99,97,99,104,101,46,78,90,9,110,97,109,101, + 115,112,97,99,101,41,7,114,7,0,0,0,114,35,0,0, + 0,114,86,1,0,0,114,170,0,0,0,114,221,0,0,0, + 114,218,0,0,0,114,61,1,0,0,41,6,114,12,1,0, + 0,114,159,0,0,0,114,35,0,0,0,114,13,1,0,0, + 114,178,0,0,0,114,85,1,0,0,114,4,0,0,0,114, + 4,0,0,0,114,5,0,0,0,114,14,1,0,0,142,7, + 0,0,115,26,0,0,0,0,4,12,1,12,1,21,1,12, + 1,4,1,15,1,9,1,6,3,9,1,24,1,4,2,7, + 2,122,20,80,97,116,104,70,105,110,100,101,114,46,102,105, + 110,100,95,115,112,101,99,99,3,0,0,0,0,0,0,0, + 4,0,0,0,3,0,0,0,67,0,0,0,115,41,0,0, + 0,124,0,0,106,0,0,124,1,0,124,2,0,131,2,0, + 125,3,0,124,3,0,100,1,0,107,8,0,114,34,0,100, + 1,0,83,124,3,0,106,1,0,83,41,2,122,170,102,105, + 110,100,32,116,104,101,32,109,111,100,117,108,101,32,111,110, + 32,115,121,115,46,112,97,116,104,32,111,114,32,39,112,97, + 116,104,39,32,98,97,115,101,100,32,111,110,32,115,121,115, + 46,112,97,116,104,95,104,111,111,107,115,32,97,110,100,10, + 32,32,32,32,32,32,32,32,115,121,115,46,112,97,116,104, + 95,105,109,112,111,114,116,101,114,95,99,97,99,104,101,46, + 10,10,32,32,32,32,32,32,32,32,84,104,105,115,32,109, + 101,116,104,111,100,32,105,115,32,100,101,112,114,101,99,97, + 116,101,100,46,32,32,85,115,101,32,102,105,110,100,95,115, + 112,101,99,40,41,32,105,110,115,116,101,97,100,46,10,10, + 32,32,32,32,32,32,32,32,78,41,2,114,14,1,0,0, + 114,170,0,0,0,41,4,114,12,1,0,0,114,159,0,0, + 0,114,35,0,0,0,114,178,0,0,0,114,4,0,0,0, + 114,4,0,0,0,114,5,0,0,0,114,15,1,0,0,164, + 7,0,0,115,8,0,0,0,0,8,18,1,12,1,4,1, + 122,22,80,97,116,104,70,105,110,100,101,114,46,102,105,110, + 100,95,109,111,100,117,108,101,41,12,114,57,0,0,0,114, + 56,0,0,0,114,58,0,0,0,114,59,0,0,0,114,19, + 1,0,0,114,75,1,0,0,114,80,1,0,0,114,81,1, + 0,0,114,82,1,0,0,114,86,1,0,0,114,14,1,0, + 0,114,15,1,0,0,114,4,0,0,0,114,4,0,0,0, + 114,4,0,0,0,114,5,0,0,0,114,74,1,0,0,49, + 7,0,0,115,22,0,0,0,12,2,6,2,18,8,18,17, + 18,17,18,15,3,1,18,31,3,1,21,21,3,1,114,74, + 1,0,0,99,0,0,0,0,0,0,0,0,0,0,0,0, + 3,0,0,0,64,0,0,0,115,133,0,0,0,101,0,0, + 90,1,0,100,0,0,90,2,0,100,1,0,90,3,0,100, + 2,0,100,3,0,132,0,0,90,4,0,100,4,0,100,5, + 0,132,0,0,90,5,0,101,6,0,90,7,0,100,6,0, + 100,7,0,132,0,0,90,8,0,100,8,0,100,9,0,132, + 0,0,90,9,0,100,10,0,100,11,0,100,12,0,132,1, + 0,90,10,0,100,13,0,100,14,0,132,0,0,90,11,0, + 101,12,0,100,15,0,100,16,0,132,0,0,131,1,0,90, + 13,0,100,17,0,100,18,0,132,0,0,90,14,0,100,10, + 0,83,41,19,218,10,70,105,108,101,70,105,110,100,101,114, + 122,172,70,105,108,101,45,98,97,115,101,100,32,102,105,110, + 100,101,114,46,10,10,32,32,32,32,73,110,116,101,114,97, + 99,116,105,111,110,115,32,119,105,116,104,32,116,104,101,32, + 102,105,108,101,32,115,121,115,116,101,109,32,97,114,101,32, + 99,97,99,104,101,100,32,102,111,114,32,112,101,114,102,111, + 114,109,97,110,99,101,44,32,98,101,105,110,103,10,32,32, + 32,32,114,101,102,114,101,115,104,101,100,32,119,104,101,110, + 32,116,104,101,32,100,105,114,101,99,116,111,114,121,32,116, + 104,101,32,102,105,110,100,101,114,32,105,115,32,104,97,110, + 100,108,105,110,103,32,104,97,115,32,98,101,101,110,32,109, + 111,100,105,102,105,101,100,46,10,10,32,32,32,32,99,2, + 0,0,0,0,0,0,0,5,0,0,0,5,0,0,0,7, + 0,0,0,115,122,0,0,0,103,0,0,125,3,0,120,52, + 0,124,2,0,68,93,44,0,92,2,0,137,0,0,125,4, + 0,124,3,0,106,0,0,135,0,0,102,1,0,100,1,0, + 100,2,0,134,0,0,124,4,0,68,131,1,0,131,1,0, + 1,113,13,0,87,124,3,0,124,0,0,95,1,0,124,1, + 0,112,79,0,100,3,0,124,0,0,95,2,0,100,6,0, + 124,0,0,95,3,0,116,4,0,131,0,0,124,0,0,95, + 5,0,116,4,0,131,0,0,124,0,0,95,6,0,100,5, + 0,83,41,7,122,154,73,110,105,116,105,97,108,105,122,101, + 32,119,105,116,104,32,116,104,101,32,112,97,116,104,32,116, + 111,32,115,101,97,114,99,104,32,111,110,32,97,110,100,32, + 97,32,118,97,114,105,97,98,108,101,32,110,117,109,98,101, + 114,32,111,102,10,32,32,32,32,32,32,32,32,50,45,116, + 117,112,108,101,115,32,99,111,110,116,97,105,110,105,110,103, + 32,116,104,101,32,108,111,97,100,101,114,32,97,110,100,32, + 116,104,101,32,102,105,108,101,32,115,117,102,102,105,120,101, + 115,32,116,104,101,32,108,111,97,100,101,114,10,32,32,32, + 32,32,32,32,32,114,101,99,111,103,110,105,122,101,115,46, + 99,1,0,0,0,0,0,0,0,2,0,0,0,3,0,0, + 0,51,0,0,0,115,27,0,0,0,124,0,0,93,17,0, + 125,1,0,124,1,0,136,0,0,102,2,0,86,1,113,3, + 0,100,0,0,83,41,1,78,114,4,0,0,0,41,2,114, + 22,0,0,0,114,58,1,0,0,41,1,114,170,0,0,0, + 114,4,0,0,0,114,5,0,0,0,114,77,0,0,0,193, + 7,0,0,115,2,0,0,0,6,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,116,0,0,0,114,29,0,0,0,78,114,139,0, + 0,0,41,7,114,198,0,0,0,218,8,95,108,111,97,100, + 101,114,115,114,35,0,0,0,218,11,95,112,97,116,104,95, + 109,116,105,109,101,218,3,115,101,116,218,11,95,112,97,116, + 104,95,99,97,99,104,101,218,19,95,114,101,108,97,120,101, + 100,95,112,97,116,104,95,99,97,99,104,101,41,5,114,71, + 0,0,0,114,35,0,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,126,0,0,0,114,4,0,0,0,41,1,114,170,0, + 0,0,114,5,0,0,0,114,72,0,0,0,187,7,0,0, + 115,16,0,0,0,0,4,6,1,19,1,36,1,9,2,15, + 1,9,1,12,1,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,0, + 0,0,0,1,0,0,0,2,0,0,0,67,0,0,0,115, + 13,0,0,0,100,3,0,124,0,0,95,0,0,100,2,0, + 83,41,4,122,31,73,110,118,97,108,105,100,97,116,101,32, + 116,104,101,32,100,105,114,101,99,116,111,114,121,32,109,116, + 105,109,101,46,114,29,0,0,0,78,114,139,0,0,0,41, + 1,114,89,1,0,0,41,1,114,71,0,0,0,114,4,0, + 0,0,114,4,0,0,0,114,5,0,0,0,114,75,1,0, + 0,201,7,0,0,115,2,0,0,0,0,2,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,0,3,0,0,0,2,0,0,0,67,0,0,0,115, + 59,0,0,0,124,0,0,106,0,0,124,1,0,131,1,0, + 125,2,0,124,2,0,100,1,0,107,8,0,114,37,0,100, + 1,0,103,0,0,102,2,0,83,124,2,0,106,1,0,124, + 2,0,106,2,0,112,55,0,103,0,0,102,2,0,83,41, + 2,122,197,84,114,121,32,116,111,32,102,105,110,100,32,97, + 32,108,111,97,100,101,114,32,102,111,114,32,116,104,101,32, + 115,112,101,99,105,102,105,101,100,32,109,111,100,117,108,101, + 44,32,111,114,32,116,104,101,32,110,97,109,101,115,112,97, + 99,101,10,32,32,32,32,32,32,32,32,112,97,99,107,97, + 103,101,32,112,111,114,116,105,111,110,115,46,32,82,101,116, + 117,114,110,115,32,40,108,111,97,100,101,114,44,32,108,105, + 115,116,45,111,102,45,112,111,114,116,105,111,110,115,41,46, + 10,10,32,32,32,32,32,32,32,32,84,104,105,115,32,109, + 101,116,104,111,100,32,105,115,32,100,101,112,114,101,99,97, + 116,101,100,46,32,32,85,115,101,32,102,105,110,100,95,115, + 112,101,99,40,41,32,105,110,115,116,101,97,100,46,10,10, + 32,32,32,32,32,32,32,32,78,41,3,114,14,1,0,0, + 114,170,0,0,0,114,221,0,0,0,41,3,114,71,0,0, + 0,114,159,0,0,0,114,178,0,0,0,114,4,0,0,0, + 114,4,0,0,0,114,5,0,0,0,114,166,0,0,0,207, + 7,0,0,115,8,0,0,0,0,7,15,1,12,1,10,1, + 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,7,0,0,0,7,0,0,0,67,0,0,0,115,40,0, + 0,0,124,1,0,124,2,0,124,3,0,131,2,0,125,6, + 0,116,0,0,124,2,0,124,3,0,100,1,0,124,6,0, + 100,2,0,124,4,0,131,2,2,83,41,3,78,114,170,0, + 0,0,114,221,0,0,0,41,1,114,240,0,0,0,41,7, + 114,71,0,0,0,114,244,0,0,0,114,159,0,0,0,114, + 35,0,0,0,114,229,0,0,0,114,13,1,0,0,114,170, + 0,0,0,114,4,0,0,0,114,4,0,0,0,114,5,0, + 0,0,114,86,1,0,0,219,7,0,0,115,6,0,0,0, + 0,1,15,1,18,1,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,14,0,0,0,15,0,0,0,67,0, + 0,0,115,240,1,0,0,100,1,0,125,3,0,124,1,0, + 106,0,0,100,2,0,131,1,0,100,3,0,25,125,4,0, + 121,34,0,116,1,0,124,0,0,106,2,0,112,49,0,116, + 3,0,106,4,0,131,0,0,131,1,0,106,5,0,125,5, + 0,87,110,24,0,4,116,6,0,107,10,0,114,85,0,1, + 1,1,100,10,0,125,5,0,89,110,1,0,88,124,5,0, + 124,0,0,106,7,0,107,3,0,114,123,0,124,0,0,106, + 8,0,131,0,0,1,124,5,0,124,0,0,95,7,0,110, + 0,0,116,9,0,131,0,0,114,156,0,124,0,0,106,10, + 0,125,6,0,124,4,0,106,11,0,131,0,0,125,7,0, + 110,15,0,124,0,0,106,12,0,125,6,0,124,4,0,125, + 7,0,124,7,0,124,6,0,107,6,0,114,51,1,116,13, + 0,124,0,0,106,2,0,124,4,0,131,2,0,125,8,0, + 120,103,0,124,0,0,106,14,0,68,93,77,0,92,2,0, + 125,9,0,125,10,0,100,5,0,124,9,0,23,125,11,0, + 116,13,0,124,8,0,124,11,0,131,2,0,125,12,0,116, + 15,0,124,12,0,131,1,0,114,211,0,124,0,0,106,16, + 0,124,10,0,124,1,0,124,12,0,124,8,0,103,1,0, + 124,2,0,131,5,0,83,113,211,0,87,116,17,0,124,8, + 0,131,1,0,125,3,0,110,0,0,120,126,0,124,0,0, + 106,14,0,68,93,115,0,92,2,0,125,9,0,125,10,0, + 116,13,0,124,0,0,106,2,0,124,4,0,124,9,0,23, + 131,2,0,125,12,0,116,18,0,100,6,0,106,19,0,124, + 12,0,131,1,0,100,7,0,100,3,0,131,1,1,1,124, + 7,0,124,9,0,23,124,6,0,107,6,0,114,61,1,116, + 15,0,124,12,0,131,1,0,114,176,1,124,0,0,106,16, + 0,124,10,0,124,1,0,124,12,0,100,8,0,124,2,0, + 131,5,0,83,113,61,1,113,61,1,87,124,3,0,114,236, + 1,116,18,0,100,9,0,106,19,0,124,8,0,131,1,0, + 131,1,0,1,116,20,0,124,1,0,100,8,0,131,2,0, + 125,13,0,124,8,0,103,1,0,124,13,0,95,21,0,124, + 13,0,83,100,8,0,83,41,11,122,125,84,114,121,32,116, + 111,32,102,105,110,100,32,97,32,108,111,97,100,101,114,32, + 102,111,114,32,116,104,101,32,115,112,101,99,105,102,105,101, + 100,32,109,111,100,117,108,101,44,32,111,114,32,116,104,101, + 32,110,97,109,101,115,112,97,99,101,10,32,32,32,32,32, + 32,32,32,112,97,99,107,97,103,101,32,112,111,114,116,105, + 111,110,115,46,32,82,101,116,117,114,110,115,32,40,108,111, + 97,100,101,114,44,32,108,105,115,116,45,111,102,45,112,111, + 114,116,105,111,110,115,41,46,70,114,116,0,0,0,114,115, + 0,0,0,114,29,0,0,0,114,72,0,0,0,122,9,116, + 114,121,105,110,103,32,123,125,114,146,0,0,0,78,122,25, + 112,111,115,115,105,98,108,101,32,110,97,109,101,115,112,97, + 99,101,32,102,111,114,32,123,125,114,139,0,0,0,41,22, + 114,32,0,0,0,114,39,0,0,0,114,35,0,0,0,114, + 3,0,0,0,114,45,0,0,0,114,54,1,0,0,114,40, + 0,0,0,114,89,1,0,0,218,11,95,102,105,108,108,95, + 99,97,99,104,101,114,6,0,0,0,114,92,1,0,0,114, + 140,0,0,0,114,91,1,0,0,114,28,0,0,0,114,88, + 1,0,0,114,44,0,0,0,114,86,1,0,0,114,46,0, + 0,0,114,153,0,0,0,114,47,0,0,0,114,217,0,0, + 0,114,221,0,0,0,41,14,114,71,0,0,0,114,159,0, + 0,0,114,13,1,0,0,90,12,105,115,95,110,97,109,101, + 115,112,97,99,101,90,11,116,97,105,108,95,109,111,100,117, + 108,101,114,184,0,0,0,90,5,99,97,99,104,101,90,12, + 99,97,99,104,101,95,109,111,100,117,108,101,90,9,98,97, + 115,101,95,112,97,116,104,114,58,1,0,0,114,244,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,178,0,0,0, + 114,4,0,0,0,114,4,0,0,0,114,5,0,0,0,114, + 14,1,0,0,224,7,0,0,115,68,0,0,0,0,3,6, + 1,19,1,3,1,34,1,13,1,11,1,15,1,10,1,12, + 2,9,1,9,1,15,2,9,1,6,2,12,1,18,1,22, + 1,10,1,15,1,12,1,32,4,15,2,22,1,22,1,25, + 1,16,1,12,1,32,1,6,1,19,1,15,1,12,1,4, + 1,122,20,70,105,108,101,70,105,110,100,101,114,46,102,105, + 110,100,95,115,112,101,99,99,1,0,0,0,0,0,0,0, + 9,0,0,0,13,0,0,0,67,0,0,0,115,14,1,0, + 0,124,0,0,106,0,0,125,1,0,121,31,0,116,1,0, + 106,2,0,124,1,0,112,33,0,116,1,0,106,3,0,131, + 0,0,131,1,0,125,2,0,87,110,33,0,4,116,4,0, + 116,5,0,116,6,0,102,3,0,107,10,0,114,75,0,1, + 1,1,103,0,0,125,2,0,89,110,1,0,88,116,7,0, + 106,8,0,106,9,0,100,1,0,131,1,0,115,112,0,116, + 10,0,124,2,0,131,1,0,124,0,0,95,11,0,110,111, + 0,116,10,0,131,0,0,125,3,0,120,90,0,124,2,0, + 68,93,82,0,125,4,0,124,4,0,106,12,0,100,2,0, + 131,1,0,92,3,0,125,5,0,125,6,0,125,7,0,124, + 6,0,114,191,0,100,3,0,106,13,0,124,5,0,124,7, + 0,106,14,0,131,0,0,131,2,0,125,8,0,110,6,0, + 124,5,0,125,8,0,124,3,0,106,15,0,124,8,0,131, + 1,0,1,113,128,0,87,124,3,0,124,0,0,95,11,0, + 116,7,0,106,8,0,106,9,0,116,16,0,131,1,0,114, + 10,1,100,4,0,100,5,0,132,0,0,124,2,0,68,131, + 1,0,124,0,0,95,17,0,110,0,0,100,6,0,83,41, + 7,122,68,70,105,108,108,32,116,104,101,32,99,97,99,104, + 101,32,111,102,32,112,111,116,101,110,116,105,97,108,32,109, + 111,100,117,108,101,115,32,97,110,100,32,112,97,99,107,97, + 103,101,115,32,102,111,114,32,116,104,105,115,32,100,105,114, + 101,99,116,111,114,121,46,114,0,0,0,0,114,116,0,0, + 0,122,5,123,125,46,123,125,99,1,0,0,0,0,0,0, + 0,2,0,0,0,3,0,0,0,83,0,0,0,115,28,0, + 0,0,104,0,0,124,0,0,93,18,0,125,1,0,124,1, + 0,106,0,0,131,0,0,146,2,0,113,6,0,83,114,4, + 0,0,0,41,1,114,140,0,0,0,41,2,114,22,0,0, + 0,90,2,102,110,114,4,0,0,0,114,4,0,0,0,114, + 5,0,0,0,250,9,60,115,101,116,99,111,109,112,62,42, + 8,0,0,115,2,0,0,0,9,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,101,116, + 99,111,109,112,62,78,41,18,114,35,0,0,0,114,3,0, + 0,0,90,7,108,105,115,116,100,105,114,114,45,0,0,0, + 218,17,70,105,108,101,78,111,116,70,111,117,110,100,69,114, + 114,111,114,218,15,80,101,114,109,105,115,115,105,111,110,69, + 114,114,111,114,218,18,78,111,116,65,68,105,114,101,99,116, + 111,114,121,69,114,114,111,114,114,7,0,0,0,114,8,0, + 0,0,114,9,0,0,0,114,90,1,0,0,114,91,1,0, + 0,114,134,0,0,0,114,47,0,0,0,114,140,0,0,0, + 218,3,97,100,100,114,10,0,0,0,114,92,1,0,0,41, + 9,114,71,0,0,0,114,35,0,0,0,90,8,99,111,110, + 116,101,110,116,115,90,21,108,111,119,101,114,95,115,117,102, + 102,105,120,95,99,111,110,116,101,110,116,115,114,72,1,0, + 0,114,67,0,0,0,114,66,1,0,0,114,58,1,0,0, + 90,8,110,101,119,95,110,97,109,101,114,4,0,0,0,114, + 4,0,0,0,114,5,0,0,0,114,94,1,0,0,13,8, + 0,0,115,34,0,0,0,0,2,9,1,3,1,31,1,22, + 3,11,3,18,1,18,7,9,1,13,1,24,1,6,1,27, + 2,6,1,17,1,9,1,18,1,122,22,70,105,108,101,70, + 105,110,100,101,114,46,95,102,105,108,108,95,99,97,99,104, + 101,99,1,0,0,0,0,0,0,0,3,0,0,0,3,0, + 0,0,7,0,0,0,115,25,0,0,0,135,0,0,135,1, + 0,102,2,0,100,1,0,100,2,0,134,0,0,125,2,0, + 124,2,0,83,41,3,97,20,1,0,0,65,32,99,108,97, + 115,115,32,109,101,116,104,111,100,32,119,104,105,99,104,32, + 114,101,116,117,114,110,115,32,97,32,99,108,111,115,117,114, + 101,32,116,111,32,117,115,101,32,111,110,32,115,121,115,46, + 112,97,116,104,95,104,111,111,107,10,32,32,32,32,32,32, + 32,32,119,104,105,99,104,32,119,105,108,108,32,114,101,116, + 117,114,110,32,97,110,32,105,110,115,116,97,110,99,101,32, + 117,115,105,110,103,32,116,104,101,32,115,112,101,99,105,102, + 105,101,100,32,108,111,97,100,101,114,115,32,97,110,100,32, + 116,104,101,32,112,97,116,104,10,32,32,32,32,32,32,32, + 32,99,97,108,108,101,100,32,111,110,32,116,104,101,32,99, + 108,111,115,117,114,101,46,10,10,32,32,32,32,32,32,32, + 32,73,102,32,116,104,101,32,112,97,116,104,32,99,97,108, + 108,101,100,32,111,110,32,116,104,101,32,99,108,111,115,117, + 114,101,32,105,115,32,110,111,116,32,97,32,100,105,114,101, + 99,116,111,114,121,44,32,73,109,112,111,114,116,69,114,114, + 111,114,32,105,115,10,32,32,32,32,32,32,32,32,114,97, + 105,115,101,100,46,10,10,32,32,32,32,32,32,32,32,99, + 1,0,0,0,0,0,0,0,1,0,0,0,4,0,0,0, + 19,0,0,0,115,46,0,0,0,116,0,0,124,0,0,131, + 1,0,115,33,0,116,1,0,100,1,0,100,2,0,124,0, + 0,131,1,1,130,1,0,110,0,0,136,0,0,124,0,0, + 136,1,0,140,1,0,83,41,3,122,45,80,97,116,104,32, + 104,111,111,107,32,102,111,114,32,105,109,112,111,114,116,108, + 105,98,46,109,97,99,104,105,110,101,114,121,46,70,105,108, + 101,70,105,110,100,101,114,46,122,30,111,110,108,121,32,100, + 105,114,101,99,116,111,114,105,101,115,32,97,114,101,32,115, + 117,112,112,111,114,116,101,100,114,35,0,0,0,41,2,114, + 46,0,0,0,114,154,0,0,0,41,1,114,35,0,0,0, + 41,2,114,12,1,0,0,114,93,1,0,0,114,4,0,0, + 0,114,5,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, - 40,0,0,0,0,40,3,0,0,0,117,3,0,0,0,99, - 108,115,117,14,0,0,0,108,111,97,100,101,114,95,100,101, - 116,97,105,108,115,117,24,0,0,0,112,97,116,104,95,104, - 111,111,107,95,102,111,114,95,70,105,108,101,70,105,110,100, - 101,114,40,0,0,0,0,40,2,0,0,0,117,3,0,0, - 0,99,108,115,117,14,0,0,0,108,111,97,100,101,114,95, - 100,101,116,97,105,108,115,117,29,0,0,0,60,102,114,111, - 122,101,110,32,105,109,112,111,114,116,108,105,98,46,95,98, - 111,111,116,115,116,114,97,112,62,117,9,0,0,0,112,97, - 116,104,95,104,111,111,107,145,5,0,0,115,4,0,0,0, - 0,10,21,6,117,20,0,0,0,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,1,0,0,0,2,0,0,0,67,0, - 0,0,115,14,0,0,0,100,1,0,124,0,0,106,0,0, - 102,1,0,22,83,40,2,0,0,0,78,117,14,0,0,0, - 70,105,108,101,70,105,110,100,101,114,40,37,114,41,40,1, - 0,0,0,117,4,0,0,0,112,97,116,104,40,1,0,0, - 0,117,4,0,0,0,115,101,108,102,40,0,0,0,0,40, - 0,0,0,0,117,29,0,0,0,60,102,114,111,122,101,110, - 32,105,109,112,111,114,116,108,105,98,46,95,98,111,111,116, - 115,116,114,97,112,62,117,8,0,0,0,95,95,114,101,112, - 114,95,95,163,5,0,0,115,2,0,0,0,0,1,117,19, - 0,0,0,70,105,108,101,70,105,110,100,101,114,46,95,95, - 114,101,112,114,95,95,78,40,13,0,0,0,117,8,0,0, - 0,95,95,110,97,109,101,95,95,117,10,0,0,0,95,95, - 109,111,100,117,108,101,95,95,117,12,0,0,0,95,95,113, - 117,97,108,110,97,109,101,95,95,117,7,0,0,0,95,95, - 100,111,99,95,95,117,8,0,0,0,95,95,105,110,105,116, - 95,95,117,17,0,0,0,105,110,118,97,108,105,100,97,116, - 101,95,99,97,99,104,101,115,117,17,0,0,0,95,102,105, - 110,100,95,109,111,100,117,108,101,95,115,104,105,109,117,11, - 0,0,0,102,105,110,100,95,109,111,100,117,108,101,117,11, - 0,0,0,102,105,110,100,95,108,111,97,100,101,114,117,11, - 0,0,0,95,102,105,108,108,95,99,97,99,104,101,117,11, - 0,0,0,99,108,97,115,115,109,101,116,104,111,100,117,9, - 0,0,0,112,97,116,104,95,104,111,111,107,117,8,0,0, - 0,95,95,114,101,112,114,95,95,40,1,0,0,0,117,10, - 0,0,0,95,95,108,111,99,97,108,115,95,95,40,0,0, - 0,0,40,0,0,0,0,117,29,0,0,0,60,102,114,111, - 122,101,110,32,105,109,112,111,114,116,108,105,98,46,95,98, - 111,111,116,115,116,114,97,112,62,117,10,0,0,0,70,105, - 108,101,70,105,110,100,101,114,41,5,0,0,115,16,0,0, - 0,16,7,6,2,12,14,12,4,6,2,12,44,12,31,18, - 18,117,10,0,0,0,70,105,108,101,70,105,110,100,101,114, - 99,1,0,0,0,0,0,0,0,1,0,0,0,2,0,0, - 0,66,0,0,0,115,50,0,0,0,124,0,0,69,101,0, - 0,90,1,0,100,0,0,90,2,0,100,1,0,90,3,0, - 100,2,0,100,3,0,132,0,0,90,4,0,100,4,0,100, - 5,0,132,0,0,90,5,0,100,6,0,83,40,7,0,0, - 0,117,18,0,0,0,95,73,109,112,111,114,116,76,111,99, - 107,67,111,110,116,101,120,116,117,36,0,0,0,67,111,110, - 116,101,120,116,32,109,97,110,97,103,101,114,32,102,111,114, - 32,116,104,101,32,105,109,112,111,114,116,32,108,111,99,107, - 46,99,1,0,0,0,0,0,0,0,1,0,0,0,1,0, - 0,0,67,0,0,0,115,14,0,0,0,116,0,0,106,1, - 0,131,0,0,1,100,1,0,83,40,2,0,0,0,117,24, - 0,0,0,65,99,113,117,105,114,101,32,116,104,101,32,105, - 109,112,111,114,116,32,108,111,99,107,46,78,40,2,0,0, - 0,117,4,0,0,0,95,105,109,112,117,12,0,0,0,97, - 99,113,117,105,114,101,95,108,111,99,107,40,1,0,0,0, - 117,4,0,0,0,115,101,108,102,40,0,0,0,0,40,0, - 0,0,0,117,29,0,0,0,60,102,114,111,122,101,110,32, - 105,109,112,111,114,116,108,105,98,46,95,98,111,111,116,115, - 116,114,97,112,62,117,9,0,0,0,95,95,101,110,116,101, - 114,95,95,173,5,0,0,115,2,0,0,0,0,2,117,28, - 0,0,0,95,73,109,112,111,114,116,76,111,99,107,67,111, - 110,116,101,120,116,46,95,95,101,110,116,101,114,95,95,99, - 4,0,0,0,0,0,0,0,4,0,0,0,1,0,0,0, - 67,0,0,0,115,14,0,0,0,116,0,0,106,1,0,131, - 0,0,1,100,1,0,83,40,2,0,0,0,117,60,0,0, - 0,82,101,108,101,97,115,101,32,116,104,101,32,105,109,112, - 111,114,116,32,108,111,99,107,32,114,101,103,97,114,100,108, - 101,115,115,32,111,102,32,97,110,121,32,114,97,105,115,101, - 100,32,101,120,99,101,112,116,105,111,110,115,46,78,40,2, - 0,0,0,117,4,0,0,0,95,105,109,112,117,12,0,0, - 0,114,101,108,101,97,115,101,95,108,111,99,107,40,4,0, - 0,0,117,4,0,0,0,115,101,108,102,117,8,0,0,0, - 101,120,99,95,116,121,112,101,117,9,0,0,0,101,120,99, - 95,118,97,108,117,101,117,13,0,0,0,101,120,99,95,116, - 114,97,99,101,98,97,99,107,40,0,0,0,0,40,0,0, - 0,0,117,29,0,0,0,60,102,114,111,122,101,110,32,105, - 109,112,111,114,116,108,105,98,46,95,98,111,111,116,115,116, - 114,97,112,62,117,8,0,0,0,95,95,101,120,105,116,95, - 95,177,5,0,0,115,2,0,0,0,0,2,117,27,0,0, - 0,95,73,109,112,111,114,116,76,111,99,107,67,111,110,116, - 101,120,116,46,95,95,101,120,105,116,95,95,78,40,6,0, - 0,0,117,8,0,0,0,95,95,110,97,109,101,95,95,117, - 10,0,0,0,95,95,109,111,100,117,108,101,95,95,117,12, - 0,0,0,95,95,113,117,97,108,110,97,109,101,95,95,117, - 7,0,0,0,95,95,100,111,99,95,95,117,9,0,0,0, - 95,95,101,110,116,101,114,95,95,117,8,0,0,0,95,95, - 101,120,105,116,95,95,40,1,0,0,0,117,10,0,0,0, - 95,95,108,111,99,97,108,115,95,95,40,0,0,0,0,40, - 0,0,0,0,117,29,0,0,0,60,102,114,111,122,101,110, - 32,105,109,112,111,114,116,108,105,98,46,95,98,111,111,116, - 115,116,114,97,112,62,117,18,0,0,0,95,73,109,112,111, - 114,116,76,111,99,107,67,111,110,116,101,120,116,169,5,0, - 0,115,6,0,0,0,16,2,6,2,12,4,117,18,0,0, - 0,95,73,109,112,111,114,116,76,111,99,107,67,111,110,116, - 101,120,116,99,3,0,0,0,0,0,0,0,5,0,0,0, - 4,0,0,0,67,0,0,0,115,91,0,0,0,124,1,0, - 106,0,0,100,1,0,124,2,0,100,2,0,24,131,2,0, - 125,3,0,116,1,0,124,3,0,131,1,0,124,2,0,107, - 0,0,114,55,0,116,2,0,100,3,0,131,1,0,130,1, - 0,110,0,0,124,3,0,100,4,0,25,125,4,0,124,0, - 0,114,87,0,100,5,0,106,3,0,124,4,0,124,0,0, - 131,2,0,83,124,4,0,83,40,6,0,0,0,117,50,0, - 0,0,82,101,115,111,108,118,101,32,97,32,114,101,108,97, - 116,105,118,101,32,109,111,100,117,108,101,32,110,97,109,101, - 32,116,111,32,97,110,32,97,98,115,111,108,117,116,101,32, - 111,110,101,46,117,1,0,0,0,46,105,1,0,0,0,117, - 50,0,0,0,97,116,116,101,109,112,116,101,100,32,114,101, - 108,97,116,105,118,101,32,105,109,112,111,114,116,32,98,101, - 121,111,110,100,32,116,111,112,45,108,101,118,101,108,32,112, - 97,99,107,97,103,101,105,0,0,0,0,117,5,0,0,0, - 123,125,46,123,125,40,4,0,0,0,117,6,0,0,0,114, - 115,112,108,105,116,117,3,0,0,0,108,101,110,117,10,0, - 0,0,86,97,108,117,101,69,114,114,111,114,117,6,0,0, - 0,102,111,114,109,97,116,40,5,0,0,0,117,4,0,0, - 0,110,97,109,101,117,7,0,0,0,112,97,99,107,97,103, - 101,117,5,0,0,0,108,101,118,101,108,117,4,0,0,0, - 98,105,116,115,117,4,0,0,0,98,97,115,101,40,0,0, - 0,0,40,0,0,0,0,117,29,0,0,0,60,102,114,111, - 122,101,110,32,105,109,112,111,114,116,108,105,98,46,95,98, - 111,111,116,115,116,114,97,112,62,117,13,0,0,0,95,114, - 101,115,111,108,118,101,95,110,97,109,101,182,5,0,0,115, - 10,0,0,0,0,2,22,1,18,1,15,1,10,1,117,13, - 0,0,0,95,114,101,115,111,108,118,101,95,110,97,109,101, - 99,2,0,0,0,0,0,0,0,4,0,0,0,11,0,0, - 0,67,0,0,0,115,138,0,0,0,116,0,0,106,1,0, - 115,28,0,116,2,0,106,3,0,100,1,0,116,4,0,131, - 2,0,1,110,0,0,120,103,0,116,0,0,106,1,0,68, - 93,88,0,125,2,0,116,5,0,131,0,0,143,23,0,1, - 124,2,0,106,6,0,124,0,0,124,1,0,131,2,0,125, - 3,0,87,100,2,0,81,88,124,3,0,100,2,0,107,9, - 0,114,38,0,124,0,0,116,0,0,106,8,0,107,7,0, - 114,109,0,124,3,0,83,116,0,0,106,8,0,124,0,0, - 25,106,9,0,83,113,38,0,113,38,0,87,100,2,0,83, - 100,2,0,83,40,3,0,0,0,117,23,0,0,0,70,105, - 110,100,32,97,32,109,111,100,117,108,101,39,115,32,108,111, - 97,100,101,114,46,117,22,0,0,0,115,121,115,46,109,101, - 116,97,95,112,97,116,104,32,105,115,32,101,109,112,116,121, - 78,40,10,0,0,0,117,3,0,0,0,115,121,115,117,9, - 0,0,0,109,101,116,97,95,112,97,116,104,117,9,0,0, - 0,95,119,97,114,110,105,110,103,115,117,4,0,0,0,119, - 97,114,110,117,13,0,0,0,73,109,112,111,114,116,87,97, - 114,110,105,110,103,117,18,0,0,0,95,73,109,112,111,114, - 116,76,111,99,107,67,111,110,116,101,120,116,117,11,0,0, - 0,102,105,110,100,95,109,111,100,117,108,101,117,4,0,0, - 0,78,111,110,101,117,7,0,0,0,109,111,100,117,108,101, - 115,117,10,0,0,0,95,95,108,111,97,100,101,114,95,95, - 40,4,0,0,0,117,4,0,0,0,110,97,109,101,117,4, - 0,0,0,112,97,116,104,117,6,0,0,0,102,105,110,100, - 101,114,117,6,0,0,0,108,111,97,100,101,114,40,0,0, - 0,0,40,0,0,0,0,117,29,0,0,0,60,102,114,111, - 122,101,110,32,105,109,112,111,114,116,108,105,98,46,95,98, - 111,111,116,115,116,114,97,112,62,117,12,0,0,0,95,102, - 105,110,100,95,109,111,100,117,108,101,191,5,0,0,115,20, - 0,0,0,0,2,9,1,19,1,16,1,10,1,24,1,12, - 2,15,1,4,2,21,2,117,12,0,0,0,95,102,105,110, - 100,95,109,111,100,117,108,101,99,3,0,0,0,0,0,0, + 54,8,0,0,115,6,0,0,0,0,2,12,1,21,1,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,107,95,102,111,114,95,70,105,108, + 101,70,105,110,100,101,114,114,4,0,0,0,41,3,114,12, + 1,0,0,114,93,1,0,0,114,100,1,0,0,114,4,0, + 0,0,41,2,114,12,1,0,0,114,93,1,0,0,114,5, + 0,0,0,218,9,112,97,116,104,95,104,111,111,107,44,8, + 0,0,115,4,0,0,0,0,10,21,6,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,1,0,0,0,2,0, + 0,0,67,0,0,0,115,16,0,0,0,100,1,0,106,0, + 0,124,0,0,106,1,0,131,1,0,83,41,2,78,122,16, + 70,105,108,101,70,105,110,100,101,114,40,123,33,114,125,41, + 41,2,114,47,0,0,0,114,35,0,0,0,41,1,114,71, + 0,0,0,114,4,0,0,0,114,4,0,0,0,114,5,0, + 0,0,114,101,0,0,0,62,8,0,0,115,2,0,0,0, + 0,1,122,19,70,105,108,101,70,105,110,100,101,114,46,95, + 95,114,101,112,114,95,95,41,15,114,57,0,0,0,114,56, + 0,0,0,114,58,0,0,0,114,59,0,0,0,114,72,0, + 0,0,114,75,1,0,0,114,173,0,0,0,114,15,1,0, + 0,114,166,0,0,0,114,86,1,0,0,114,14,1,0,0, + 114,94,1,0,0,114,19,1,0,0,114,101,1,0,0,114, + 101,0,0,0,114,4,0,0,0,114,4,0,0,0,114,4, + 0,0,0,114,5,0,0,0,114,87,1,0,0,178,7,0, + 0,115,20,0,0,0,12,7,6,2,12,14,12,4,6,2, + 12,12,12,5,15,45,12,31,18,18,114,87,1,0,0,99, + 0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0, + 64,0,0,0,115,46,0,0,0,101,0,0,90,1,0,100, + 0,0,90,2,0,100,1,0,90,3,0,100,2,0,100,3, + 0,132,0,0,90,4,0,100,4,0,100,5,0,132,0,0, + 90,5,0,100,6,0,83,41,7,218,18,95,73,109,112,111, + 114,116,76,111,99,107,67,111,110,116,101,120,116,122,36,67, + 111,110,116,101,120,116,32,109,97,110,97,103,101,114,32,102, + 111,114,32,116,104,101,32,105,109,112,111,114,116,32,108,111, + 99,107,46,99,1,0,0,0,0,0,0,0,1,0,0,0, + 1,0,0,0,67,0,0,0,115,14,0,0,0,116,0,0, + 106,1,0,131,0,0,1,100,1,0,83,41,2,122,24,65, + 99,113,117,105,114,101,32,116,104,101,32,105,109,112,111,114, + 116,32,108,111,99,107,46,78,41,2,114,106,0,0,0,114, + 4,1,0,0,41,1,114,71,0,0,0,114,4,0,0,0, + 114,4,0,0,0,114,5,0,0,0,114,75,0,0,0,72, + 8,0,0,115,2,0,0,0,0,2,122,28,95,73,109,112, + 111,114,116,76,111,99,107,67,111,110,116,101,120,116,46,95, + 95,101,110,116,101,114,95,95,99,4,0,0,0,0,0,0, + 0,4,0,0,0,1,0,0,0,67,0,0,0,115,14,0, + 0,0,116,0,0,106,1,0,131,0,0,1,100,1,0,83, + 41,2,122,60,82,101,108,101,97,115,101,32,116,104,101,32, + 105,109,112,111,114,116,32,108,111,99,107,32,114,101,103,97, + 114,100,108,101,115,115,32,111,102,32,97,110,121,32,114,97, + 105,115,101,100,32,101,120,99,101,112,116,105,111,110,115,46, + 78,41,2,114,106,0,0,0,114,107,0,0,0,41,4,114, + 71,0,0,0,90,8,101,120,99,95,116,121,112,101,90,9, + 101,120,99,95,118,97,108,117,101,90,13,101,120,99,95,116, + 114,97,99,101,98,97,99,107,114,4,0,0,0,114,4,0, + 0,0,114,5,0,0,0,114,81,0,0,0,76,8,0,0, + 115,2,0,0,0,0,2,122,27,95,73,109,112,111,114,116, + 76,111,99,107,67,111,110,116,101,120,116,46,95,95,101,120, + 105,116,95,95,78,41,6,114,57,0,0,0,114,56,0,0, + 0,114,58,0,0,0,114,59,0,0,0,114,75,0,0,0, + 114,81,0,0,0,114,4,0,0,0,114,4,0,0,0,114, + 4,0,0,0,114,5,0,0,0,114,102,1,0,0,68,8, + 0,0,115,6,0,0,0,12,2,6,2,12,4,114,102,1, + 0,0,99,3,0,0,0,0,0,0,0,5,0,0,0,4, + 0,0,0,67,0,0,0,115,91,0,0,0,124,1,0,106, + 0,0,100,1,0,124,2,0,100,2,0,24,131,2,0,125, + 3,0,116,1,0,124,3,0,131,1,0,124,2,0,107,0, + 0,114,55,0,116,2,0,100,3,0,131,1,0,130,1,0, + 110,0,0,124,3,0,100,4,0,25,125,4,0,124,0,0, + 114,87,0,100,5,0,106,3,0,124,4,0,124,0,0,131, + 2,0,83,124,4,0,83,41,6,122,50,82,101,115,111,108, + 118,101,32,97,32,114,101,108,97,116,105,118,101,32,109,111, + 100,117,108,101,32,110,97,109,101,32,116,111,32,97,110,32, + 97,98,115,111,108,117,116,101,32,111,110,101,46,114,116,0, + 0,0,114,29,0,0,0,122,50,97,116,116,101,109,112,116, + 101,100,32,114,101,108,97,116,105,118,101,32,105,109,112,111, + 114,116,32,98,101,121,111,110,100,32,116,111,112,45,108,101, + 118,101,108,32,112,97,99,107,97,103,101,114,84,0,0,0, + 122,5,123,125,46,123,125,41,4,114,34,0,0,0,114,31, + 0,0,0,114,133,0,0,0,114,47,0,0,0,41,5,114, + 67,0,0,0,218,7,112,97,99,107,97,103,101,218,5,108, + 101,118,101,108,90,4,98,105,116,115,114,128,0,0,0,114, + 4,0,0,0,114,4,0,0,0,114,5,0,0,0,218,13, + 95,114,101,115,111,108,118,101,95,110,97,109,101,81,8,0, + 0,115,10,0,0,0,0,2,22,1,18,1,15,1,10,1, + 114,105,1,0,0,99,3,0,0,0,0,0,0,0,4,0, + 0,0,3,0,0,0,67,0,0,0,115,47,0,0,0,124, + 0,0,106,0,0,124,1,0,124,2,0,131,2,0,125,3, + 0,124,3,0,100,0,0,107,8,0,114,34,0,100,0,0, + 83,116,1,0,124,1,0,124,3,0,131,2,0,83,41,1, + 78,41,2,114,15,1,0,0,114,174,0,0,0,41,4,114, + 78,1,0,0,114,67,0,0,0,114,35,0,0,0,114,170, + 0,0,0,114,4,0,0,0,114,4,0,0,0,114,5,0, + 0,0,218,17,95,102,105,110,100,95,115,112,101,99,95,108, + 101,103,97,99,121,90,8,0,0,115,8,0,0,0,0,3, + 18,1,12,1,4,1,114,106,1,0,0,99,3,0,0,0, + 0,0,0,0,9,0,0,0,26,0,0,0,67,0,0,0, + 115,34,1,0,0,116,0,0,106,1,0,115,28,0,116,2, + 0,106,3,0,100,1,0,116,4,0,131,2,0,1,110,0, + 0,124,0,0,116,0,0,106,5,0,107,6,0,125,3,0, + 120,240,0,116,0,0,106,1,0,68,93,225,0,125,4,0, + 116,6,0,131,0,0,143,93,0,1,121,13,0,124,4,0, + 106,7,0,125,5,0,87,110,54,0,4,116,8,0,107,10, + 0,114,138,0,1,1,1,116,9,0,124,4,0,124,0,0, + 124,1,0,131,3,0,125,6,0,124,6,0,100,2,0,107, + 8,0,114,134,0,119,53,0,110,0,0,89,110,19,0,88, + 124,5,0,124,0,0,124,1,0,124,2,0,131,3,0,125, + 6,0,87,100,2,0,81,88,124,6,0,100,2,0,107,9, + 0,114,53,0,124,3,0,12,114,15,1,124,0,0,116,0, + 0,106,5,0,107,6,0,114,15,1,116,0,0,106,5,0, + 124,0,0,25,125,7,0,121,13,0,124,7,0,106,10,0, + 125,8,0,87,110,22,0,4,116,8,0,107,10,0,114,247, + 0,1,1,1,124,6,0,83,89,113,19,1,88,124,8,0, + 100,2,0,107,8,0,114,8,1,124,6,0,83,124,8,0, + 83,113,22,1,124,6,0,83,113,53,0,113,53,0,87,100, + 2,0,83,100,2,0,83,41,3,122,23,70,105,110,100,32, + 97,32,109,111,100,117,108,101,39,115,32,108,111,97,100,101, + 114,46,122,22,115,121,115,46,109,101,116,97,95,112,97,116, + 104,32,105,115,32,101,109,112,116,121,78,41,11,114,7,0, + 0,0,218,9,109,101,116,97,95,112,97,116,104,114,167,0, + 0,0,114,168,0,0,0,114,169,0,0,0,114,73,0,0, + 0,114,102,1,0,0,114,14,1,0,0,114,210,0,0,0, + 114,106,1,0,0,114,209,0,0,0,41,9,114,67,0,0, + 0,114,35,0,0,0,114,13,1,0,0,90,9,105,115,95, + 114,101,108,111,97,100,114,78,1,0,0,114,14,1,0,0, + 114,178,0,0,0,114,180,0,0,0,114,209,0,0,0,114, + 4,0,0,0,114,4,0,0,0,114,5,0,0,0,218,10, + 95,102,105,110,100,95,115,112,101,99,99,8,0,0,115,48, + 0,0,0,0,2,9,1,19,4,15,1,16,1,10,1,3, + 1,13,1,13,1,18,1,12,1,11,2,24,1,12,2,22, + 1,13,1,3,1,13,1,13,4,9,2,12,1,4,2,7, + 2,11,2,114,108,1,0,0,99,3,0,0,0,0,0,0, 0,4,0,0,0,4,0,0,0,67,0,0,0,115,194,0, 0,0,116,0,0,124,0,0,116,1,0,131,2,0,115,45, 0,116,2,0,100,1,0,106,3,0,116,4,0,124,0,0, @@ -3737,446 +3908,336 @@ unsigned char _Py_M__importlib[] = { 1,0,131,1,0,130,1,0,113,156,0,110,0,0,124,0, 0,12,114,190,0,124,2,0,100,2,0,107,2,0,114,190, 0,116,5,0,100,6,0,131,1,0,130,1,0,110,0,0, - 100,7,0,83,40,8,0,0,0,117,28,0,0,0,86,101, - 114,105,102,121,32,97,114,103,117,109,101,110,116,115,32,97, - 114,101,32,34,115,97,110,101,34,46,117,31,0,0,0,109, - 111,100,117,108,101,32,110,97,109,101,32,109,117,115,116,32, - 98,101,32,115,116,114,44,32,110,111,116,32,123,125,105,0, - 0,0,0,117,18,0,0,0,108,101,118,101,108,32,109,117, - 115,116,32,98,101,32,62,61,32,48,117,31,0,0,0,95, - 95,112,97,99,107,97,103,101,95,95,32,110,111,116,32,115, - 101,116,32,116,111,32,97,32,115,116,114,105,110,103,117,61, - 0,0,0,80,97,114,101,110,116,32,109,111,100,117,108,101, - 32,123,33,114,125,32,110,111,116,32,108,111,97,100,101,100, - 44,32,99,97,110,110,111,116,32,112,101,114,102,111,114,109, - 32,114,101,108,97,116,105,118,101,32,105,109,112,111,114,116, - 117,17,0,0,0,69,109,112,116,121,32,109,111,100,117,108, - 101,32,110,97,109,101,78,40,9,0,0,0,117,10,0,0, - 0,105,115,105,110,115,116,97,110,99,101,117,3,0,0,0, - 115,116,114,117,9,0,0,0,84,121,112,101,69,114,114,111, - 114,117,6,0,0,0,102,111,114,109,97,116,117,4,0,0, - 0,116,121,112,101,117,10,0,0,0,86,97,108,117,101,69, - 114,114,111,114,117,3,0,0,0,115,121,115,117,7,0,0, - 0,109,111,100,117,108,101,115,117,11,0,0,0,83,121,115, - 116,101,109,69,114,114,111,114,40,4,0,0,0,117,4,0, - 0,0,110,97,109,101,117,7,0,0,0,112,97,99,107,97, - 103,101,117,5,0,0,0,108,101,118,101,108,117,3,0,0, - 0,109,115,103,40,0,0,0,0,40,0,0,0,0,117,29, - 0,0,0,60,102,114,111,122,101,110,32,105,109,112,111,114, - 116,108,105,98,46,95,98,111,111,116,115,116,114,97,112,62, - 117,13,0,0,0,95,115,97,110,105,116,121,95,99,104,101, - 99,107,208,5,0,0,115,24,0,0,0,0,2,15,1,30, - 1,12,1,15,1,6,1,15,1,15,1,15,1,6,2,27, - 1,19,1,117,13,0,0,0,95,115,97,110,105,116,121,95, - 99,104,101,99,107,117,20,0,0,0,78,111,32,109,111,100, - 117,108,101,32,110,97,109,101,100,32,123,33,114,125,99,2, - 0,0,0,0,0,0,0,9,0,0,0,27,0,0,0,67, - 0,0,0,115,12,2,0,0,100,0,0,125,2,0,124,0, - 0,106,1,0,100,1,0,131,1,0,100,2,0,25,125,3, - 0,124,3,0,114,178,0,124,3,0,116,2,0,106,3,0, - 107,7,0,114,62,0,116,4,0,124,1,0,124,3,0,131, - 2,0,1,110,0,0,124,0,0,116,2,0,106,3,0,107, - 6,0,114,88,0,116,2,0,106,3,0,124,0,0,25,83, - 116,2,0,106,3,0,124,3,0,25,125,4,0,121,13,0, - 124,4,0,106,5,0,125,2,0,87,113,178,0,4,116,6, - 0,107,10,0,114,174,0,1,1,1,116,7,0,100,3,0, - 23,106,8,0,124,0,0,124,3,0,131,2,0,125,5,0, - 116,9,0,124,5,0,100,4,0,124,0,0,131,1,1,130, - 1,0,89,113,178,0,88,110,0,0,116,10,0,124,0,0, - 124,2,0,131,2,0,125,6,0,124,6,0,100,0,0,107, - 8,0,114,250,0,116,9,0,116,7,0,106,8,0,124,0, - 0,131,1,0,100,4,0,124,0,0,131,1,1,125,7,0, - 100,10,0,124,7,0,95,12,0,124,7,0,130,1,0,110, - 47,0,124,0,0,116,2,0,106,3,0,107,7,0,114,41, - 1,124,6,0,106,13,0,124,0,0,131,1,0,1,116,14, - 0,100,5,0,124,0,0,124,6,0,131,3,0,1,110,0, - 0,116,2,0,106,3,0,124,0,0,25,125,8,0,124,3, - 0,114,105,1,116,2,0,106,3,0,124,3,0,25,125,4, - 0,116,15,0,124,4,0,124,0,0,106,1,0,100,1,0, - 131,1,0,100,6,0,25,124,8,0,131,3,0,1,110,0, - 0,116,16,0,124,8,0,100,7,0,100,0,0,131,3,0, - 100,0,0,107,8,0,114,212,1,121,59,0,124,8,0,106, - 17,0,124,8,0,95,18,0,116,19,0,124,8,0,100,8, - 0,131,2,0,115,187,1,124,8,0,106,18,0,106,1,0, - 100,1,0,131,1,0,100,2,0,25,124,8,0,95,18,0, - 110,0,0,87,113,212,1,4,116,6,0,107,10,0,114,208, - 1,1,1,1,89,113,212,1,88,110,0,0,116,19,0,124, - 8,0,100,9,0,131,2,0,115,8,2,121,13,0,124,6, - 0,124,8,0,95,20,0,87,113,8,2,4,116,6,0,107, - 10,0,114,4,2,1,1,1,89,113,8,2,88,110,0,0, - 124,8,0,83,40,11,0,0,0,78,117,1,0,0,0,46, - 105,0,0,0,0,117,21,0,0,0,59,32,123,125,32,105, - 115,32,110,111,116,32,97,32,112,97,99,107,97,103,101,117, - 4,0,0,0,110,97,109,101,117,18,0,0,0,105,109,112, - 111,114,116,32,123,33,114,125,32,35,32,123,33,114,125,105, - 2,0,0,0,117,11,0,0,0,95,95,112,97,99,107,97, - 103,101,95,95,117,8,0,0,0,95,95,112,97,116,104,95, - 95,117,10,0,0,0,95,95,108,111,97,100,101,114,95,95, - 84,40,21,0,0,0,117,4,0,0,0,78,111,110,101,117, - 10,0,0,0,114,112,97,114,116,105,116,105,111,110,117,3, - 0,0,0,115,121,115,117,7,0,0,0,109,111,100,117,108, - 101,115,117,25,0,0,0,95,99,97,108,108,95,119,105,116, - 104,95,102,114,97,109,101,115,95,114,101,109,111,118,101,100, - 117,8,0,0,0,95,95,112,97,116,104,95,95,117,14,0, - 0,0,65,116,116,114,105,98,117,116,101,69,114,114,111,114, - 117,8,0,0,0,95,69,82,82,95,77,83,71,117,6,0, - 0,0,102,111,114,109,97,116,117,11,0,0,0,73,109,112, - 111,114,116,69,114,114,111,114,117,12,0,0,0,95,102,105, - 110,100,95,109,111,100,117,108,101,117,4,0,0,0,84,114, - 117,101,117,10,0,0,0,95,110,111,116,95,102,111,117,110, - 100,117,11,0,0,0,108,111,97,100,95,109,111,100,117,108, - 101,117,16,0,0,0,95,118,101,114,98,111,115,101,95,109, - 101,115,115,97,103,101,117,7,0,0,0,115,101,116,97,116, - 116,114,117,7,0,0,0,103,101,116,97,116,116,114,117,8, - 0,0,0,95,95,110,97,109,101,95,95,117,11,0,0,0, - 95,95,112,97,99,107,97,103,101,95,95,117,7,0,0,0, - 104,97,115,97,116,116,114,117,10,0,0,0,95,95,108,111, - 97,100,101,114,95,95,40,9,0,0,0,117,4,0,0,0, - 110,97,109,101,117,7,0,0,0,105,109,112,111,114,116,95, - 117,4,0,0,0,112,97,116,104,117,6,0,0,0,112,97, - 114,101,110,116,117,13,0,0,0,112,97,114,101,110,116,95, - 109,111,100,117,108,101,117,3,0,0,0,109,115,103,117,6, - 0,0,0,108,111,97,100,101,114,117,3,0,0,0,101,120, - 99,117,6,0,0,0,109,111,100,117,108,101,40,0,0,0, - 0,40,0,0,0,0,117,29,0,0,0,60,102,114,111,122, - 101,110,32,105,109,112,111,114,116,108,105,98,46,95,98,111, - 111,116,115,116,114,97,112,62,117,23,0,0,0,95,102,105, - 110,100,95,97,110,100,95,108,111,97,100,95,117,110,108,111, - 99,107,101,100,227,5,0,0,115,76,0,0,0,0,1,6, - 1,19,1,6,1,15,1,16,2,15,1,11,2,13,1,3, - 1,13,1,13,1,22,1,26,1,15,1,12,1,27,3,9, - 1,9,1,15,2,13,1,19,2,13,1,6,2,13,1,32, - 2,24,1,3,1,12,1,15,1,32,1,13,1,8,2,15, - 1,3,1,13,1,13,1,8,1,117,23,0,0,0,95,102, - 105,110,100,95,97,110,100,95,108,111,97,100,95,117,110,108, - 111,99,107,101,100,99,2,0,0,0,0,0,0,0,3,0, - 0,0,18,0,0,0,67,0,0,0,115,75,0,0,0,122, - 16,0,116,0,0,124,0,0,131,1,0,125,2,0,87,100, - 1,0,116,1,0,106,2,0,131,0,0,1,88,124,2,0, - 106,3,0,131,0,0,1,122,17,0,116,4,0,124,0,0, - 124,1,0,131,2,0,83,87,100,1,0,124,2,0,106,5, - 0,131,0,0,1,88,100,1,0,83,40,2,0,0,0,117, - 54,0,0,0,70,105,110,100,32,97,110,100,32,108,111,97, - 100,32,116,104,101,32,109,111,100,117,108,101,44,32,97,110, - 100,32,114,101,108,101,97,115,101,32,116,104,101,32,105,109, - 112,111,114,116,32,108,111,99,107,46,78,40,6,0,0,0, - 117,16,0,0,0,95,103,101,116,95,109,111,100,117,108,101, - 95,108,111,99,107,117,4,0,0,0,95,105,109,112,117,12, - 0,0,0,114,101,108,101,97,115,101,95,108,111,99,107,117, - 7,0,0,0,97,99,113,117,105,114,101,117,23,0,0,0, + 100,7,0,83,41,8,122,28,86,101,114,105,102,121,32,97, + 114,103,117,109,101,110,116,115,32,97,114,101,32,34,115,97, + 110,101,34,46,122,31,109,111,100,117,108,101,32,110,97,109, + 101,32,109,117,115,116,32,98,101,32,115,116,114,44,32,110, + 111,116,32,123,125,114,84,0,0,0,122,18,108,101,118,101, + 108,32,109,117,115,116,32,98,101,32,62,61,32,48,122,31, + 95,95,112,97,99,107,97,103,101,95,95,32,110,111,116,32, + 115,101,116,32,116,111,32,97,32,115,116,114,105,110,103,122, + 61,80,97,114,101,110,116,32,109,111,100,117,108,101,32,123, + 33,114,125,32,110,111,116,32,108,111,97,100,101,100,44,32, + 99,97,110,110,111,116,32,112,101,114,102,111,114,109,32,114, + 101,108,97,116,105,118,101,32,105,109,112,111,114,116,122,17, + 69,109,112,116,121,32,109,111,100,117,108,101,32,110,97,109, + 101,78,41,9,114,193,0,0,0,114,83,1,0,0,218,9, + 84,121,112,101,69,114,114,111,114,114,47,0,0,0,114,66, + 0,0,0,114,133,0,0,0,114,7,0,0,0,114,73,0, + 0,0,218,11,83,121,115,116,101,109,69,114,114,111,114,41, + 4,114,67,0,0,0,114,103,1,0,0,114,104,1,0,0, + 114,172,0,0,0,114,4,0,0,0,114,4,0,0,0,114, + 5,0,0,0,218,13,95,115,97,110,105,116,121,95,99,104, + 101,99,107,139,8,0,0,115,24,0,0,0,0,2,15,1, + 30,1,12,1,15,1,6,1,15,1,15,1,15,1,6,2, + 27,1,19,1,114,111,1,0,0,122,16,78,111,32,109,111, + 100,117,108,101,32,110,97,109,101,100,32,122,4,123,33,114, + 125,99,2,0,0,0,0,0,0,0,8,0,0,0,12,0, + 0,0,67,0,0,0,115,52,1,0,0,100,0,0,125,2, + 0,124,0,0,106,0,0,100,1,0,131,1,0,100,2,0, + 25,125,3,0,124,3,0,114,178,0,124,3,0,116,1,0, + 106,2,0,107,7,0,114,62,0,116,3,0,124,1,0,124, + 3,0,131,2,0,1,110,0,0,124,0,0,116,1,0,106, + 2,0,107,6,0,114,88,0,116,1,0,106,2,0,124,0, + 0,25,83,116,1,0,106,2,0,124,3,0,25,125,4,0, + 121,13,0,124,4,0,106,4,0,125,2,0,87,113,178,0, + 4,116,5,0,107,10,0,114,174,0,1,1,1,116,6,0, + 100,3,0,23,106,7,0,124,0,0,124,3,0,131,2,0, + 125,5,0,116,8,0,124,5,0,100,4,0,124,0,0,131, + 1,1,130,1,0,89,113,178,0,88,110,0,0,116,9,0, + 124,0,0,124,2,0,131,2,0,125,6,0,124,6,0,100, + 0,0,107,8,0,114,235,0,116,8,0,116,6,0,106,7, + 0,124,0,0,131,1,0,100,4,0,124,0,0,131,1,1, + 130,1,0,110,18,0,116,10,0,124,6,0,131,1,0,106, + 11,0,131,0,0,125,7,0,124,3,0,114,48,1,116,1, + 0,106,2,0,124,3,0,25,125,4,0,116,12,0,124,4, + 0,124,0,0,106,0,0,100,1,0,131,1,0,100,5,0, + 25,124,7,0,131,3,0,1,110,0,0,124,7,0,83,41, + 6,78,114,116,0,0,0,114,84,0,0,0,122,23,59,32, + 123,33,114,125,32,105,115,32,110,111,116,32,97,32,112,97, + 99,107,97,103,101,114,67,0,0,0,114,115,0,0,0,41, + 13,114,32,0,0,0,114,7,0,0,0,114,73,0,0,0, + 114,114,0,0,0,114,247,0,0,0,114,210,0,0,0,218, + 8,95,69,82,82,95,77,83,71,114,47,0,0,0,114,154, + 0,0,0,114,108,1,0,0,114,175,0,0,0,114,7,1, + 0,0,114,61,0,0,0,41,8,114,67,0,0,0,218,7, + 105,109,112,111,114,116,95,114,35,0,0,0,114,234,0,0, + 0,90,13,112,97,114,101,110,116,95,109,111,100,117,108,101, + 114,172,0,0,0,114,178,0,0,0,114,180,0,0,0,114, + 4,0,0,0,114,4,0,0,0,114,5,0,0,0,218,23, 95,102,105,110,100,95,97,110,100,95,108,111,97,100,95,117, - 110,108,111,99,107,101,100,117,7,0,0,0,114,101,108,101, - 97,115,101,40,3,0,0,0,117,4,0,0,0,110,97,109, - 101,117,7,0,0,0,105,109,112,111,114,116,95,117,4,0, - 0,0,108,111,99,107,40,0,0,0,0,40,0,0,0,0, - 117,29,0,0,0,60,102,114,111,122,101,110,32,105,109,112, - 111,114,116,108,105,98,46,95,98,111,111,116,115,116,114,97, - 112,62,117,14,0,0,0,95,102,105,110,100,95,97,110,100, - 95,108,111,97,100,21,6,0,0,115,14,0,0,0,0,2, - 3,1,16,2,11,1,10,1,3,1,17,2,117,14,0,0, - 0,95,102,105,110,100,95,97,110,100,95,108,111,97,100,99, - 3,0,0,0,0,0,0,0,5,0,0,0,4,0,0,0, - 67,0,0,0,115,172,0,0,0,116,0,0,124,0,0,124, - 1,0,124,2,0,131,3,0,1,124,2,0,100,1,0,107, - 4,0,114,49,0,116,1,0,124,0,0,124,1,0,124,2, - 0,131,3,0,125,0,0,110,0,0,116,2,0,106,3,0, - 131,0,0,1,124,0,0,116,4,0,106,5,0,107,7,0, - 114,87,0,116,6,0,124,0,0,116,7,0,131,2,0,83, - 116,4,0,106,5,0,124,0,0,25,125,3,0,124,3,0, - 100,4,0,107,8,0,114,158,0,116,2,0,106,9,0,131, - 0,0,1,100,2,0,106,10,0,124,0,0,131,1,0,125, - 4,0,116,11,0,124,4,0,100,3,0,124,0,0,131,1, - 1,130,1,0,110,0,0,116,12,0,124,0,0,131,1,0, - 1,124,3,0,83,40,5,0,0,0,117,50,1,0,0,73, - 109,112,111,114,116,32,97,110,100,32,114,101,116,117,114,110, - 32,116,104,101,32,109,111,100,117,108,101,32,98,97,115,101, - 100,32,111,110,32,105,116,115,32,110,97,109,101,44,32,116, - 104,101,32,112,97,99,107,97,103,101,32,116,104,101,32,99, - 97,108,108,32,105,115,10,32,32,32,32,98,101,105,110,103, - 32,109,97,100,101,32,102,114,111,109,44,32,97,110,100,32, - 116,104,101,32,108,101,118,101,108,32,97,100,106,117,115,116, - 109,101,110,116,46,10,10,32,32,32,32,84,104,105,115,32, - 102,117,110,99,116,105,111,110,32,114,101,112,114,101,115,101, - 110,116,115,32,116,104,101,32,103,114,101,97,116,101,115,116, - 32,99,111,109,109,111,110,32,100,101,110,111,109,105,110,97, - 116,111,114,32,111,102,32,102,117,110,99,116,105,111,110,97, - 108,105,116,121,10,32,32,32,32,98,101,116,119,101,101,110, - 32,105,109,112,111,114,116,95,109,111,100,117,108,101,32,97, - 110,100,32,95,95,105,109,112,111,114,116,95,95,46,32,84, - 104,105,115,32,105,110,99,108,117,100,101,115,32,115,101,116, - 116,105,110,103,32,95,95,112,97,99,107,97,103,101,95,95, - 32,105,102,10,32,32,32,32,116,104,101,32,108,111,97,100, - 101,114,32,100,105,100,32,110,111,116,46,10,10,32,32,32, - 32,105,0,0,0,0,117,40,0,0,0,105,109,112,111,114, - 116,32,111,102,32,123,125,32,104,97,108,116,101,100,59,32, - 78,111,110,101,32,105,110,32,115,121,115,46,109,111,100,117, - 108,101,115,117,4,0,0,0,110,97,109,101,78,40,13,0, - 0,0,117,13,0,0,0,95,115,97,110,105,116,121,95,99, - 104,101,99,107,117,13,0,0,0,95,114,101,115,111,108,118, - 101,95,110,97,109,101,117,4,0,0,0,95,105,109,112,117, - 12,0,0,0,97,99,113,117,105,114,101,95,108,111,99,107, - 117,3,0,0,0,115,121,115,117,7,0,0,0,109,111,100, - 117,108,101,115,117,14,0,0,0,95,102,105,110,100,95,97, - 110,100,95,108,111,97,100,117,11,0,0,0,95,103,99,100, - 95,105,109,112,111,114,116,117,4,0,0,0,78,111,110,101, - 117,12,0,0,0,114,101,108,101,97,115,101,95,108,111,99, - 107,117,6,0,0,0,102,111,114,109,97,116,117,11,0,0, - 0,73,109,112,111,114,116,69,114,114,111,114,117,19,0,0, - 0,95,108,111,99,107,95,117,110,108,111,99,107,95,109,111, - 100,117,108,101,40,5,0,0,0,117,4,0,0,0,110,97, - 109,101,117,7,0,0,0,112,97,99,107,97,103,101,117,5, - 0,0,0,108,101,118,101,108,117,6,0,0,0,109,111,100, - 117,108,101,117,7,0,0,0,109,101,115,115,97,103,101,40, - 0,0,0,0,40,0,0,0,0,117,29,0,0,0,60,102, - 114,111,122,101,110,32,105,109,112,111,114,116,108,105,98,46, - 95,98,111,111,116,115,116,114,97,112,62,117,11,0,0,0, - 95,103,99,100,95,105,109,112,111,114,116,34,6,0,0,115, - 28,0,0,0,0,9,16,1,12,1,21,1,10,1,15,1, - 13,1,13,1,12,1,10,1,6,1,9,1,21,1,10,1, - 117,11,0,0,0,95,103,99,100,95,105,109,112,111,114,116, - 99,3,0,0,0,0,0,0,0,6,0,0,0,17,0,0, - 0,67,0,0,0,115,254,0,0,0,116,0,0,124,0,0, - 100,1,0,131,2,0,114,250,0,100,2,0,124,1,0,107, - 6,0,114,89,0,116,1,0,124,1,0,131,1,0,125,1, - 0,124,1,0,106,2,0,100,2,0,131,1,0,1,116,0, - 0,124,0,0,100,3,0,131,2,0,114,89,0,124,1,0, - 106,3,0,124,0,0,106,4,0,131,1,0,1,113,89,0, - 110,0,0,120,158,0,124,1,0,68,93,147,0,125,3,0, - 116,0,0,124,0,0,124,3,0,131,2,0,115,96,0,100, - 4,0,106,5,0,124,0,0,106,6,0,124,3,0,131,2, - 0,125,4,0,121,17,0,116,7,0,124,2,0,124,4,0, - 131,2,0,1,87,113,243,0,4,116,8,0,107,10,0,114, - 239,0,1,125,5,0,1,122,50,0,116,9,0,124,5,0, - 100,5,0,100,7,0,131,3,0,114,218,0,124,5,0,106, - 11,0,124,4,0,107,2,0,114,218,0,119,96,0,113,218, - 0,110,0,0,130,0,0,87,89,100,6,0,100,6,0,125, - 5,0,126,5,0,88,113,243,0,88,113,96,0,113,96,0, - 87,110,0,0,124,0,0,83,40,8,0,0,0,117,238,0, - 0,0,70,105,103,117,114,101,32,111,117,116,32,119,104,97, - 116,32,95,95,105,109,112,111,114,116,95,95,32,115,104,111, - 117,108,100,32,114,101,116,117,114,110,46,10,10,32,32,32, - 32,84,104,101,32,105,109,112,111,114,116,95,32,112,97,114, - 97,109,101,116,101,114,32,105,115,32,97,32,99,97,108,108, - 97,98,108,101,32,119,104,105,99,104,32,116,97,107,101,115, - 32,116,104,101,32,110,97,109,101,32,111,102,32,109,111,100, - 117,108,101,32,116,111,10,32,32,32,32,105,109,112,111,114, - 116,46,32,73,116,32,105,115,32,114,101,113,117,105,114,101, - 100,32,116,111,32,100,101,99,111,117,112,108,101,32,116,104, - 101,32,102,117,110,99,116,105,111,110,32,102,114,111,109,32, - 97,115,115,117,109,105,110,103,32,105,109,112,111,114,116,108, - 105,98,39,115,10,32,32,32,32,105,109,112,111,114,116,32, - 105,109,112,108,101,109,101,110,116,97,116,105,111,110,32,105, - 115,32,100,101,115,105,114,101,100,46,10,10,32,32,32,32, - 117,8,0,0,0,95,95,112,97,116,104,95,95,117,1,0, - 0,0,42,117,7,0,0,0,95,95,97,108,108,95,95,117, - 5,0,0,0,123,125,46,123,125,117,10,0,0,0,95,110, - 111,116,95,102,111,117,110,100,78,70,40,12,0,0,0,117, - 7,0,0,0,104,97,115,97,116,116,114,117,4,0,0,0, - 108,105,115,116,117,6,0,0,0,114,101,109,111,118,101,117, - 6,0,0,0,101,120,116,101,110,100,117,7,0,0,0,95, - 95,97,108,108,95,95,117,6,0,0,0,102,111,114,109,97, - 116,117,8,0,0,0,95,95,110,97,109,101,95,95,117,25, - 0,0,0,95,99,97,108,108,95,119,105,116,104,95,102,114, - 97,109,101,115,95,114,101,109,111,118,101,100,117,11,0,0, - 0,73,109,112,111,114,116,69,114,114,111,114,117,7,0,0, - 0,103,101,116,97,116,116,114,117,5,0,0,0,70,97,108, - 115,101,117,4,0,0,0,110,97,109,101,40,6,0,0,0, - 117,6,0,0,0,109,111,100,117,108,101,117,8,0,0,0, - 102,114,111,109,108,105,115,116,117,7,0,0,0,105,109,112, - 111,114,116,95,117,1,0,0,0,120,117,9,0,0,0,102, - 114,111,109,95,110,97,109,101,117,3,0,0,0,101,120,99, - 40,0,0,0,0,40,0,0,0,0,117,29,0,0,0,60, - 102,114,111,122,101,110,32,105,109,112,111,114,116,108,105,98, - 46,95,98,111,111,116,115,116,114,97,112,62,117,16,0,0, - 0,95,104,97,110,100,108,101,95,102,114,111,109,108,105,115, - 116,58,6,0,0,115,34,0,0,0,0,10,15,1,12,1, - 12,1,13,1,15,1,22,1,13,1,15,1,21,1,3,1, - 17,1,18,6,18,1,15,1,9,1,32,1,117,16,0,0, - 0,95,104,97,110,100,108,101,95,102,114,111,109,108,105,115, - 116,99,1,0,0,0,0,0,0,0,2,0,0,0,2,0, - 0,0,67,0,0,0,115,78,0,0,0,124,0,0,106,0, - 0,100,1,0,131,1,0,125,1,0,124,1,0,100,6,0, - 107,8,0,114,74,0,124,0,0,100,2,0,25,125,1,0, - 100,3,0,124,0,0,107,7,0,114,74,0,124,1,0,106, - 2,0,100,4,0,131,1,0,100,5,0,25,125,1,0,113, - 74,0,110,0,0,124,1,0,83,40,7,0,0,0,117,167, - 0,0,0,67,97,108,99,117,108,97,116,101,32,119,104,97, - 116,32,95,95,112,97,99,107,97,103,101,95,95,32,115,104, - 111,117,108,100,32,98,101,46,10,10,32,32,32,32,95,95, - 112,97,99,107,97,103,101,95,95,32,105,115,32,110,111,116, - 32,103,117,97,114,97,110,116,101,101,100,32,116,111,32,98, - 101,32,100,101,102,105,110,101,100,32,111,114,32,99,111,117, - 108,100,32,98,101,32,115,101,116,32,116,111,32,78,111,110, - 101,10,32,32,32,32,116,111,32,114,101,112,114,101,115,101, - 110,116,32,116,104,97,116,32,105,116,115,32,112,114,111,112, - 101,114,32,118,97,108,117,101,32,105,115,32,117,110,107,110, - 111,119,110,46,10,10,32,32,32,32,117,11,0,0,0,95, - 95,112,97,99,107,97,103,101,95,95,117,8,0,0,0,95, - 95,110,97,109,101,95,95,117,8,0,0,0,95,95,112,97, - 116,104,95,95,117,1,0,0,0,46,105,0,0,0,0,78, - 40,3,0,0,0,117,3,0,0,0,103,101,116,117,4,0, - 0,0,78,111,110,101,117,10,0,0,0,114,112,97,114,116, - 105,116,105,111,110,40,2,0,0,0,117,7,0,0,0,103, - 108,111,98,97,108,115,117,7,0,0,0,112,97,99,107,97, - 103,101,40,0,0,0,0,40,0,0,0,0,117,29,0,0, - 0,60,102,114,111,122,101,110,32,105,109,112,111,114,116,108, - 105,98,46,95,98,111,111,116,115,116,114,97,112,62,117,17, - 0,0,0,95,99,97,108,99,95,95,95,112,97,99,107,97, - 103,101,95,95,92,6,0,0,115,12,0,0,0,0,7,15, - 1,12,1,10,1,12,1,25,1,117,17,0,0,0,95,99, - 97,108,99,95,95,95,112,97,99,107,97,103,101,95,95,99, - 0,0,0,0,0,0,0,0,3,0,0,0,3,0,0,0, - 67,0,0,0,115,55,0,0,0,116,0,0,116,1,0,106, - 2,0,131,0,0,102,2,0,125,0,0,116,3,0,116,4, - 0,102,2,0,125,1,0,116,5,0,116,6,0,102,2,0, - 125,2,0,124,0,0,124,1,0,124,2,0,103,3,0,83, - 40,1,0,0,0,117,95,0,0,0,82,101,116,117,114,110, - 115,32,97,32,108,105,115,116,32,111,102,32,102,105,108,101, - 45,98,97,115,101,100,32,109,111,100,117,108,101,32,108,111, - 97,100,101,114,115,46,10,10,32,32,32,32,69,97,99,104, - 32,105,116,101,109,32,105,115,32,97,32,116,117,112,108,101, - 32,40,108,111,97,100,101,114,44,32,115,117,102,102,105,120, - 101,115,41,46,10,32,32,32,32,40,7,0,0,0,117,19, - 0,0,0,69,120,116,101,110,115,105,111,110,70,105,108,101, - 76,111,97,100,101,114,117,4,0,0,0,95,105,109,112,117, - 18,0,0,0,101,120,116,101,110,115,105,111,110,95,115,117, - 102,102,105,120,101,115,117,16,0,0,0,83,111,117,114,99, - 101,70,105,108,101,76,111,97,100,101,114,117,15,0,0,0, - 83,79,85,82,67,69,95,83,85,70,70,73,88,69,83,117, - 20,0,0,0,83,111,117,114,99,101,108,101,115,115,70,105, - 108,101,76,111,97,100,101,114,117,17,0,0,0,66,89,84, - 69,67,79,68,69,95,83,85,70,70,73,88,69,83,40,3, - 0,0,0,117,10,0,0,0,101,120,116,101,110,115,105,111, - 110,115,117,6,0,0,0,115,111,117,114,99,101,117,8,0, - 0,0,98,121,116,101,99,111,100,101,40,0,0,0,0,40, - 0,0,0,0,117,29,0,0,0,60,102,114,111,122,101,110, - 32,105,109,112,111,114,116,108,105,98,46,95,98,111,111,116, - 115,116,114,97,112,62,117,27,0,0,0,95,103,101,116,95, - 115,117,112,112,111,114,116,101,100,95,102,105,108,101,95,108, - 111,97,100,101,114,115,107,6,0,0,115,8,0,0,0,0, - 5,18,1,12,1,12,1,117,27,0,0,0,95,103,101,116, - 95,115,117,112,112,111,114,116,101,100,95,102,105,108,101,95, - 108,111,97,100,101,114,115,99,5,0,0,0,0,0,0,0, - 9,0,0,0,5,0,0,0,67,0,0,0,115,227,0,0, - 0,124,4,0,100,1,0,107,2,0,114,27,0,116,0,0, - 124,0,0,131,1,0,125,5,0,110,54,0,124,1,0,100, - 3,0,107,9,0,114,45,0,124,1,0,110,3,0,105,0, - 0,125,6,0,116,2,0,124,6,0,131,1,0,125,7,0, - 116,0,0,124,0,0,124,7,0,124,4,0,131,3,0,125, - 5,0,124,3,0,115,207,0,124,4,0,100,1,0,107,2, - 0,114,122,0,116,0,0,124,0,0,106,3,0,100,2,0, - 131,1,0,100,1,0,25,131,1,0,83,124,0,0,115,132, - 0,124,5,0,83,116,4,0,124,0,0,131,1,0,116,4, - 0,124,0,0,106,3,0,100,2,0,131,1,0,100,1,0, - 25,131,1,0,24,125,8,0,116,5,0,106,6,0,124,5, - 0,106,7,0,100,3,0,116,4,0,124,5,0,106,7,0, - 131,1,0,124,8,0,24,133,2,0,25,25,83,110,16,0, - 116,8,0,124,5,0,124,3,0,116,0,0,131,3,0,83, - 100,3,0,83,40,4,0,0,0,117,214,1,0,0,73,109, - 112,111,114,116,32,97,32,109,111,100,117,108,101,46,10,10, - 32,32,32,32,84,104,101,32,39,103,108,111,98,97,108,115, - 39,32,97,114,103,117,109,101,110,116,32,105,115,32,117,115, - 101,100,32,116,111,32,105,110,102,101,114,32,119,104,101,114, - 101,32,116,104,101,32,105,109,112,111,114,116,32,105,115,32, - 111,99,99,117,114,105,110,103,32,102,114,111,109,10,32,32, - 32,32,116,111,32,104,97,110,100,108,101,32,114,101,108,97, - 116,105,118,101,32,105,109,112,111,114,116,115,46,32,84,104, - 101,32,39,108,111,99,97,108,115,39,32,97,114,103,117,109, - 101,110,116,32,105,115,32,105,103,110,111,114,101,100,46,32, - 84,104,101,10,32,32,32,32,39,102,114,111,109,108,105,115, - 116,39,32,97,114,103,117,109,101,110,116,32,115,112,101,99, - 105,102,105,101,115,32,119,104,97,116,32,115,104,111,117,108, - 100,32,101,120,105,115,116,32,97,115,32,97,116,116,114,105, - 98,117,116,101,115,32,111,110,32,116,104,101,32,109,111,100, - 117,108,101,10,32,32,32,32,98,101,105,110,103,32,105,109, - 112,111,114,116,101,100,32,40,101,46,103,46,32,96,96,102, - 114,111,109,32,109,111,100,117,108,101,32,105,109,112,111,114, - 116,32,60,102,114,111,109,108,105,115,116,62,96,96,41,46, - 32,32,84,104,101,32,39,108,101,118,101,108,39,10,32,32, - 32,32,97,114,103,117,109,101,110,116,32,114,101,112,114,101, - 115,101,110,116,115,32,116,104,101,32,112,97,99,107,97,103, - 101,32,108,111,99,97,116,105,111,110,32,116,111,32,105,109, - 112,111,114,116,32,102,114,111,109,32,105,110,32,97,32,114, - 101,108,97,116,105,118,101,10,32,32,32,32,105,109,112,111, - 114,116,32,40,101,46,103,46,32,96,96,102,114,111,109,32, - 46,46,112,107,103,32,105,109,112,111,114,116,32,109,111,100, - 96,96,32,119,111,117,108,100,32,104,97,118,101,32,97,32, - 39,108,101,118,101,108,39,32,111,102,32,50,41,46,10,10, - 32,32,32,32,105,0,0,0,0,117,1,0,0,0,46,78, - 40,9,0,0,0,117,11,0,0,0,95,103,99,100,95,105, - 109,112,111,114,116,117,4,0,0,0,78,111,110,101,117,17, - 0,0,0,95,99,97,108,99,95,95,95,112,97,99,107,97, - 103,101,95,95,117,9,0,0,0,112,97,114,116,105,116,105, - 111,110,117,3,0,0,0,108,101,110,117,3,0,0,0,115, - 121,115,117,7,0,0,0,109,111,100,117,108,101,115,117,8, - 0,0,0,95,95,110,97,109,101,95,95,117,16,0,0,0, - 95,104,97,110,100,108,101,95,102,114,111,109,108,105,115,116, - 40,9,0,0,0,117,4,0,0,0,110,97,109,101,117,7, - 0,0,0,103,108,111,98,97,108,115,117,6,0,0,0,108, - 111,99,97,108,115,117,8,0,0,0,102,114,111,109,108,105, - 115,116,117,5,0,0,0,108,101,118,101,108,117,6,0,0, - 0,109,111,100,117,108,101,117,8,0,0,0,103,108,111,98, - 97,108,115,95,117,7,0,0,0,112,97,99,107,97,103,101, - 117,7,0,0,0,99,117,116,95,111,102,102,40,0,0,0, - 0,40,0,0,0,0,117,29,0,0,0,60,102,114,111,122, - 101,110,32,105,109,112,111,114,116,108,105,98,46,95,98,111, - 111,116,115,116,114,97,112,62,117,10,0,0,0,95,95,105, - 109,112,111,114,116,95,95,118,6,0,0,115,26,0,0,0, - 0,11,12,1,15,2,24,1,12,1,18,1,6,3,12,1, - 23,1,6,1,4,4,35,3,40,2,117,10,0,0,0,95, - 95,105,109,112,111,114,116,95,95,99,2,0,0,0,0,0, - 0,0,16,0,0,0,13,0,0,0,67,0,0,0,115,24, - 3,0,0,124,1,0,97,0,0,124,0,0,97,1,0,116, - 1,0,106,2,0,106,3,0,114,33,0,116,4,0,97,5, - 0,110,6,0,116,6,0,97,5,0,116,7,0,116,1,0, - 131,1,0,125,2,0,120,119,0,116,1,0,106,8,0,106, - 9,0,131,0,0,68,93,102,0,92,2,0,125,3,0,125, - 4,0,116,10,0,124,4,0,124,2,0,131,2,0,114,67, - 0,116,11,0,124,4,0,100,1,0,131,2,0,115,169,0, - 124,3,0,116,1,0,106,12,0,107,6,0,114,136,0,116, - 13,0,124,4,0,95,14,0,113,166,0,116,0,0,106,15, - 0,124,3,0,131,1,0,114,166,0,116,16,0,124,4,0, - 95,14,0,113,166,0,113,169,0,113,67,0,113,67,0,87, - 116,1,0,106,8,0,116,17,0,25,125,5,0,120,76,0, - 100,28,0,68,93,68,0,125,6,0,124,6,0,116,1,0, - 106,8,0,107,7,0,114,232,0,116,13,0,106,18,0,124, - 6,0,131,1,0,125,7,0,110,13,0,116,1,0,106,8, - 0,124,6,0,25,125,7,0,116,19,0,124,5,0,124,6, - 0,124,7,0,131,3,0,1,113,193,0,87,100,6,0,100, - 7,0,103,1,0,102,2,0,100,8,0,100,9,0,100,7, - 0,103,2,0,102,2,0,100,10,0,100,9,0,100,7,0, - 103,2,0,102,2,0,102,3,0,125,8,0,120,189,0,124, - 8,0,68,93,169,0,92,2,0,125,9,0,125,10,0,116, - 20,0,100,11,0,100,12,0,132,0,0,124,10,0,68,131, - 1,0,131,1,0,115,107,1,116,21,0,130,1,0,124,10, - 0,100,13,0,25,125,11,0,124,9,0,116,1,0,106,8, - 0,107,6,0,114,149,1,116,1,0,106,8,0,124,9,0, - 25,125,12,0,80,113,64,1,121,60,0,116,13,0,106,18, - 0,124,9,0,131,1,0,125,12,0,124,9,0,100,10,0, - 107,2,0,114,207,1,100,14,0,116,1,0,106,22,0,107, - 6,0,114,207,1,124,10,0,100,15,0,25,125,11,0,110, - 0,0,80,87,113,64,1,4,116,23,0,107,10,0,114,232, - 1,1,1,1,119,64,1,89,113,64,1,88,113,64,1,87, - 116,23,0,100,16,0,131,1,0,130,1,0,121,19,0,116, - 13,0,106,18,0,100,17,0,131,1,0,125,13,0,87,110, - 24,0,4,116,23,0,107,10,0,114,38,2,1,1,1,100, - 27,0,125,13,0,89,110,1,0,88,116,13,0,106,18,0, - 100,18,0,131,1,0,125,14,0,124,9,0,100,8,0,107, - 2,0,114,100,2,116,13,0,106,18,0,100,19,0,131,1, - 0,125,15,0,116,19,0,124,5,0,100,20,0,124,15,0, - 131,3,0,1,110,0,0,116,19,0,124,5,0,100,21,0, - 124,12,0,131,3,0,1,116,19,0,124,5,0,100,17,0, - 124,13,0,131,3,0,1,116,19,0,124,5,0,100,18,0, - 124,14,0,131,3,0,1,116,19,0,124,5,0,100,22,0, - 124,11,0,131,3,0,1,116,19,0,124,5,0,100,23,0, - 116,25,0,124,10,0,131,1,0,131,3,0,1,116,19,0, - 124,5,0,100,24,0,116,26,0,131,0,0,131,3,0,1, - 116,27,0,106,28,0,116,0,0,106,29,0,131,0,0,131, - 1,0,1,124,9,0,100,8,0,107,2,0,114,20,3,116, - 30,0,106,31,0,100,25,0,131,1,0,1,100,26,0,116, - 27,0,107,6,0,114,20,3,100,29,0,116,33,0,95,34, - 0,113,20,3,110,0,0,100,27,0,83,40,30,0,0,0, - 117,250,0,0,0,83,101,116,117,112,32,105,109,112,111,114, + 110,108,111,99,107,101,100,159,8,0,0,115,42,0,0,0, + 0,1,6,1,19,1,6,1,15,1,16,2,15,1,11,1, + 13,1,3,1,13,1,13,1,22,1,26,1,15,1,12,1, + 30,2,18,1,6,2,13,1,32,1,114,114,1,0,0,99, + 2,0,0,0,0,0,0,0,2,0,0,0,10,0,0,0, + 67,0,0,0,115,36,0,0,0,116,0,0,124,0,0,131, + 1,0,143,18,0,1,116,1,0,124,0,0,124,1,0,131, + 2,0,83,87,100,1,0,81,88,100,1,0,83,41,2,122, + 54,70,105,110,100,32,97,110,100,32,108,111,97,100,32,116, + 104,101,32,109,111,100,117,108,101,44,32,97,110,100,32,114, + 101,108,101,97,115,101,32,116,104,101,32,105,109,112,111,114, + 116,32,108,111,99,107,46,78,41,2,114,103,0,0,0,114, + 114,1,0,0,41,2,114,67,0,0,0,114,113,1,0,0, + 114,4,0,0,0,114,4,0,0,0,114,5,0,0,0,218, + 14,95,102,105,110,100,95,97,110,100,95,108,111,97,100,186, + 8,0,0,115,4,0,0,0,0,2,13,1,114,115,1,0, + 0,99,3,0,0,0,0,0,0,0,5,0,0,0,4,0, + 0,0,67,0,0,0,115,172,0,0,0,116,0,0,124,0, + 0,124,1,0,124,2,0,131,3,0,1,124,2,0,100,1, + 0,107,4,0,114,49,0,116,1,0,124,0,0,124,1,0, + 124,2,0,131,3,0,125,0,0,110,0,0,116,2,0,106, + 3,0,131,0,0,1,124,0,0,116,4,0,106,5,0,107, + 7,0,114,87,0,116,6,0,124,0,0,116,7,0,131,2, + 0,83,116,4,0,106,5,0,124,0,0,25,125,3,0,124, + 3,0,100,2,0,107,8,0,114,158,0,116,2,0,106,8, + 0,131,0,0,1,100,3,0,106,9,0,124,0,0,131,1, + 0,125,4,0,116,10,0,124,4,0,100,4,0,124,0,0, + 131,1,1,130,1,0,110,0,0,116,11,0,124,0,0,131, + 1,0,1,124,3,0,83,41,5,97,50,1,0,0,73,109, + 112,111,114,116,32,97,110,100,32,114,101,116,117,114,110,32, + 116,104,101,32,109,111,100,117,108,101,32,98,97,115,101,100, + 32,111,110,32,105,116,115,32,110,97,109,101,44,32,116,104, + 101,32,112,97,99,107,97,103,101,32,116,104,101,32,99,97, + 108,108,32,105,115,10,32,32,32,32,98,101,105,110,103,32, + 109,97,100,101,32,102,114,111,109,44,32,97,110,100,32,116, + 104,101,32,108,101,118,101,108,32,97,100,106,117,115,116,109, + 101,110,116,46,10,10,32,32,32,32,84,104,105,115,32,102, + 117,110,99,116,105,111,110,32,114,101,112,114,101,115,101,110, + 116,115,32,116,104,101,32,103,114,101,97,116,101,115,116,32, + 99,111,109,109,111,110,32,100,101,110,111,109,105,110,97,116, + 111,114,32,111,102,32,102,117,110,99,116,105,111,110,97,108, + 105,116,121,10,32,32,32,32,98,101,116,119,101,101,110,32, + 105,109,112,111,114,116,95,109,111,100,117,108,101,32,97,110, + 100,32,95,95,105,109,112,111,114,116,95,95,46,32,84,104, + 105,115,32,105,110,99,108,117,100,101,115,32,115,101,116,116, + 105,110,103,32,95,95,112,97,99,107,97,103,101,95,95,32, + 105,102,10,32,32,32,32,116,104,101,32,108,111,97,100,101, + 114,32,100,105,100,32,110,111,116,46,10,10,32,32,32,32, + 114,84,0,0,0,78,122,40,105,109,112,111,114,116,32,111, + 102,32,123,125,32,104,97,108,116,101,100,59,32,78,111,110, + 101,32,105,110,32,115,121,115,46,109,111,100,117,108,101,115, + 114,67,0,0,0,41,12,114,111,1,0,0,114,105,1,0, + 0,114,106,0,0,0,114,4,1,0,0,114,7,0,0,0, + 114,73,0,0,0,114,115,1,0,0,218,11,95,103,99,100, + 95,105,109,112,111,114,116,114,107,0,0,0,114,47,0,0, + 0,114,154,0,0,0,114,112,0,0,0,41,5,114,67,0, + 0,0,114,103,1,0,0,114,104,1,0,0,114,180,0,0, + 0,114,152,0,0,0,114,4,0,0,0,114,4,0,0,0, + 114,5,0,0,0,114,116,1,0,0,192,8,0,0,115,28, + 0,0,0,0,9,16,1,12,1,21,1,10,1,15,1,13, + 1,13,1,12,1,10,1,6,1,9,1,21,1,10,1,114, + 116,1,0,0,99,3,0,0,0,0,0,0,0,6,0,0, + 0,17,0,0,0,67,0,0,0,115,1,1,0,0,116,0, + 0,124,0,0,100,1,0,131,2,0,114,253,0,100,2,0, + 124,1,0,107,6,0,114,89,0,116,1,0,124,1,0,131, + 1,0,125,1,0,124,1,0,106,2,0,100,2,0,131,1, + 0,1,116,0,0,124,0,0,100,3,0,131,2,0,114,89, + 0,124,1,0,106,3,0,124,0,0,106,4,0,131,1,0, + 1,113,89,0,110,0,0,120,161,0,124,1,0,68,93,150, + 0,125,3,0,116,0,0,124,0,0,124,3,0,131,2,0, + 115,96,0,100,4,0,106,5,0,124,0,0,106,6,0,124, + 3,0,131,2,0,125,4,0,121,17,0,116,7,0,124,2, + 0,124,4,0,131,2,0,1,87,113,246,0,4,116,8,0, + 107,10,0,114,242,0,1,125,5,0,1,122,53,0,116,9, + 0,124,5,0,131,1,0,106,10,0,116,11,0,131,1,0, + 114,221,0,124,5,0,106,12,0,124,4,0,107,2,0,114, + 221,0,119,96,0,113,221,0,110,0,0,130,0,0,87,89, + 100,5,0,100,5,0,125,5,0,126,5,0,88,113,246,0, + 88,113,96,0,113,96,0,87,110,0,0,124,0,0,83,41, + 6,122,238,70,105,103,117,114,101,32,111,117,116,32,119,104, + 97,116,32,95,95,105,109,112,111,114,116,95,95,32,115,104, + 111,117,108,100,32,114,101,116,117,114,110,46,10,10,32,32, + 32,32,84,104,101,32,105,109,112,111,114,116,95,32,112,97, + 114,97,109,101,116,101,114,32,105,115,32,97,32,99,97,108, + 108,97,98,108,101,32,119,104,105,99,104,32,116,97,107,101, + 115,32,116,104,101,32,110,97,109,101,32,111,102,32,109,111, + 100,117,108,101,32,116,111,10,32,32,32,32,105,109,112,111, + 114,116,46,32,73,116,32,105,115,32,114,101,113,117,105,114, + 101,100,32,116,111,32,100,101,99,111,117,112,108,101,32,116, + 104,101,32,102,117,110,99,116,105,111,110,32,102,114,111,109, + 32,97,115,115,117,109,105,110,103,32,105,109,112,111,114,116, + 108,105,98,39,115,10,32,32,32,32,105,109,112,111,114,116, + 32,105,109,112,108,101,109,101,110,116,97,116,105,111,110,32, + 105,115,32,100,101,115,105,114,101,100,46,10,10,32,32,32, + 32,114,247,0,0,0,250,1,42,218,7,95,95,97,108,108, + 95,95,122,5,123,125,46,123,125,78,41,13,114,60,0,0, + 0,114,246,0,0,0,218,6,114,101,109,111,118,101,114,198, + 0,0,0,114,118,1,0,0,114,47,0,0,0,114,57,0, + 0,0,114,114,0,0,0,114,154,0,0,0,114,83,1,0, + 0,114,9,0,0,0,218,15,95,69,82,82,95,77,83,71, + 95,80,82,69,70,73,88,114,67,0,0,0,41,6,114,180, + 0,0,0,218,8,102,114,111,109,108,105,115,116,114,113,1, + 0,0,114,16,0,0,0,90,9,102,114,111,109,95,110,97, + 109,101,114,41,1,0,0,114,4,0,0,0,114,4,0,0, + 0,114,5,0,0,0,218,16,95,104,97,110,100,108,101,95, + 102,114,111,109,108,105,115,116,216,8,0,0,115,34,0,0, + 0,0,10,15,1,12,1,12,1,13,1,15,1,22,1,13, + 1,15,1,21,1,3,1,17,1,18,4,21,1,15,1,9, + 1,32,1,114,122,1,0,0,99,1,0,0,0,0,0,0, + 0,2,0,0,0,2,0,0,0,67,0,0,0,115,78,0, + 0,0,124,0,0,106,0,0,100,1,0,131,1,0,125,1, + 0,124,1,0,100,2,0,107,8,0,114,74,0,124,0,0, + 100,3,0,25,125,1,0,100,4,0,124,0,0,107,7,0, + 114,74,0,124,1,0,106,1,0,100,5,0,131,1,0,100, + 6,0,25,125,1,0,113,74,0,110,0,0,124,1,0,83, + 41,7,122,167,67,97,108,99,117,108,97,116,101,32,119,104, + 97,116,32,95,95,112,97,99,107,97,103,101,95,95,32,115, + 104,111,117,108,100,32,98,101,46,10,10,32,32,32,32,95, + 95,112,97,99,107,97,103,101,95,95,32,105,115,32,110,111, + 116,32,103,117,97,114,97,110,116,101,101,100,32,116,111,32, + 98,101,32,100,101,102,105,110,101,100,32,111,114,32,99,111, + 117,108,100,32,98,101,32,115,101,116,32,116,111,32,78,111, + 110,101,10,32,32,32,32,116,111,32,114,101,112,114,101,115, + 101,110,116,32,116,104,97,116,32,105,116,115,32,112,114,111, + 112,101,114,32,118,97,108,117,101,32,105,115,32,117,110,107, + 110,111,119,110,46,10,10,32,32,32,32,114,251,0,0,0, + 78,114,57,0,0,0,114,247,0,0,0,114,116,0,0,0, + 114,84,0,0,0,41,2,114,93,0,0,0,114,32,0,0, + 0,41,2,218,7,103,108,111,98,97,108,115,114,103,1,0, + 0,114,4,0,0,0,114,4,0,0,0,114,5,0,0,0, + 218,17,95,99,97,108,99,95,95,95,112,97,99,107,97,103, + 101,95,95,248,8,0,0,115,12,0,0,0,0,7,15,1, + 12,1,10,1,12,1,25,1,114,124,1,0,0,99,0,0, + 0,0,0,0,0,0,3,0,0,0,3,0,0,0,67,0, + 0,0,115,55,0,0,0,116,0,0,116,1,0,106,2,0, + 131,0,0,102,2,0,125,0,0,116,3,0,116,4,0,102, + 2,0,125,1,0,116,5,0,116,6,0,102,2,0,125,2, + 0,124,0,0,124,1,0,124,2,0,103,3,0,83,41,1, + 122,95,82,101,116,117,114,110,115,32,97,32,108,105,115,116, + 32,111,102,32,102,105,108,101,45,98,97,115,101,100,32,109, + 111,100,117,108,101,32,108,111,97,100,101,114,115,46,10,10, + 32,32,32,32,69,97,99,104,32,105,116,101,109,32,105,115, + 32,97,32,116,117,112,108,101,32,40,108,111,97,100,101,114, + 44,32,115,117,102,102,105,120,101,115,41,46,10,32,32,32, + 32,41,7,114,57,1,0,0,114,106,0,0,0,218,18,101, + 120,116,101,110,115,105,111,110,95,115,117,102,102,105,120,101, + 115,114,9,1,0,0,114,135,0,0,0,114,8,1,0,0, + 114,233,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,4,0,0,0,114,4,0,0,0,114, + 5,0,0,0,114,241,0,0,0,7,9,0,0,115,8,0, + 0,0,0,5,18,1,12,1,12,1,114,241,0,0,0,99, + 5,0,0,0,0,0,0,0,9,0,0,0,5,0,0,0, + 67,0,0,0,115,227,0,0,0,124,4,0,100,1,0,107, + 2,0,114,27,0,116,0,0,124,0,0,131,1,0,125,5, + 0,110,54,0,124,1,0,100,2,0,107,9,0,114,45,0, + 124,1,0,110,3,0,105,0,0,125,6,0,116,1,0,124, + 6,0,131,1,0,125,7,0,116,0,0,124,0,0,124,7, + 0,124,4,0,131,3,0,125,5,0,124,3,0,115,207,0, + 124,4,0,100,1,0,107,2,0,114,122,0,116,0,0,124, + 0,0,106,2,0,100,3,0,131,1,0,100,1,0,25,131, + 1,0,83,124,0,0,115,132,0,124,5,0,83,116,3,0, + 124,0,0,131,1,0,116,3,0,124,0,0,106,2,0,100, + 3,0,131,1,0,100,1,0,25,131,1,0,24,125,8,0, + 116,4,0,106,5,0,124,5,0,106,6,0,100,2,0,116, + 3,0,124,5,0,106,6,0,131,1,0,124,8,0,24,133, + 2,0,25,25,83,110,16,0,116,7,0,124,5,0,124,3, + 0,116,0,0,131,3,0,83,100,2,0,83,41,4,97,214, + 1,0,0,73,109,112,111,114,116,32,97,32,109,111,100,117, + 108,101,46,10,10,32,32,32,32,84,104,101,32,39,103,108, + 111,98,97,108,115,39,32,97,114,103,117,109,101,110,116,32, + 105,115,32,117,115,101,100,32,116,111,32,105,110,102,101,114, + 32,119,104,101,114,101,32,116,104,101,32,105,109,112,111,114, + 116,32,105,115,32,111,99,99,117,114,105,110,103,32,102,114, + 111,109,10,32,32,32,32,116,111,32,104,97,110,100,108,101, + 32,114,101,108,97,116,105,118,101,32,105,109,112,111,114,116, + 115,46,32,84,104,101,32,39,108,111,99,97,108,115,39,32, + 97,114,103,117,109,101,110,116,32,105,115,32,105,103,110,111, + 114,101,100,46,32,84,104,101,10,32,32,32,32,39,102,114, + 111,109,108,105,115,116,39,32,97,114,103,117,109,101,110,116, + 32,115,112,101,99,105,102,105,101,115,32,119,104,97,116,32, + 115,104,111,117,108,100,32,101,120,105,115,116,32,97,115,32, + 97,116,116,114,105,98,117,116,101,115,32,111,110,32,116,104, + 101,32,109,111,100,117,108,101,10,32,32,32,32,98,101,105, + 110,103,32,105,109,112,111,114,116,101,100,32,40,101,46,103, + 46,32,96,96,102,114,111,109,32,109,111,100,117,108,101,32, + 105,109,112,111,114,116,32,60,102,114,111,109,108,105,115,116, + 62,96,96,41,46,32,32,84,104,101,32,39,108,101,118,101, + 108,39,10,32,32,32,32,97,114,103,117,109,101,110,116,32, + 114,101,112,114,101,115,101,110,116,115,32,116,104,101,32,112, + 97,99,107,97,103,101,32,108,111,99,97,116,105,111,110,32, + 116,111,32,105,109,112,111,114,116,32,102,114,111,109,32,105, + 110,32,97,32,114,101,108,97,116,105,118,101,10,32,32,32, + 32,105,109,112,111,114,116,32,40,101,46,103,46,32,96,96, + 102,114,111,109,32,46,46,112,107,103,32,105,109,112,111,114, + 116,32,109,111,100,96,96,32,119,111,117,108,100,32,104,97, + 118,101,32,97,32,39,108,101,118,101,108,39,32,111,102,32, + 50,41,46,10,10,32,32,32,32,114,84,0,0,0,78,114, + 116,0,0,0,41,8,114,116,1,0,0,114,124,1,0,0, + 114,134,0,0,0,114,31,0,0,0,114,7,0,0,0,114, + 73,0,0,0,114,57,0,0,0,114,122,1,0,0,41,9, + 114,67,0,0,0,114,123,1,0,0,218,6,108,111,99,97, + 108,115,114,121,1,0,0,114,104,1,0,0,114,180,0,0, + 0,90,8,103,108,111,98,97,108,115,95,114,103,1,0,0, + 90,7,99,117,116,95,111,102,102,114,4,0,0,0,114,4, + 0,0,0,114,5,0,0,0,218,10,95,95,105,109,112,111, + 114,116,95,95,18,9,0,0,115,26,0,0,0,0,11,12, + 1,15,2,24,1,12,1,18,1,6,3,12,1,23,1,6, + 1,4,4,35,3,40,2,114,127,1,0,0,99,1,0,0, + 0,0,0,0,0,3,0,0,0,3,0,0,0,67,0,0, + 0,115,68,0,0,0,116,0,0,106,1,0,124,0,0,131, + 1,0,125,1,0,124,1,0,100,0,0,107,8,0,114,46, + 0,116,2,0,100,1,0,124,0,0,23,131,1,0,130,1, + 0,110,0,0,116,3,0,124,1,0,131,1,0,125,2,0, + 124,2,0,106,4,0,131,0,0,83,41,2,78,122,25,110, + 111,32,98,117,105,108,116,45,105,110,32,109,111,100,117,108, + 101,32,110,97,109,101,100,32,41,5,114,11,1,0,0,114, + 14,1,0,0,114,154,0,0,0,114,175,0,0,0,114,7, + 1,0,0,41,3,114,67,0,0,0,114,178,0,0,0,114, + 179,0,0,0,114,4,0,0,0,114,4,0,0,0,114,5, + 0,0,0,218,18,95,98,117,105,108,116,105,110,95,102,114, + 111,109,95,110,97,109,101,53,9,0,0,115,10,0,0,0, + 0,1,15,1,12,1,19,1,12,1,114,128,1,0,0,99, + 2,0,0,0,0,0,0,0,19,0,0,0,12,0,0,0, + 67,0,0,0,115,232,2,0,0,124,1,0,97,0,0,124, + 0,0,97,1,0,116,1,0,106,2,0,106,3,0,114,33, + 0,116,4,0,97,5,0,110,6,0,116,6,0,97,5,0, + 116,7,0,116,1,0,131,1,0,125,2,0,120,138,0,116, + 1,0,106,8,0,106,9,0,131,0,0,68,93,121,0,92, + 2,0,125,3,0,125,4,0,116,10,0,124,4,0,124,2, + 0,131,2,0,114,67,0,124,3,0,116,1,0,106,11,0, + 107,6,0,114,118,0,116,12,0,125,5,0,110,27,0,116, + 0,0,106,13,0,124,3,0,131,1,0,114,67,0,116,14, + 0,125,5,0,110,3,0,113,67,0,116,15,0,124,4,0, + 124,5,0,131,2,0,125,6,0,116,16,0,124,6,0,131, + 1,0,125,7,0,124,7,0,106,17,0,124,4,0,131,1, + 0,1,113,67,0,113,67,0,87,116,1,0,106,8,0,116, + 18,0,25,125,8,0,120,73,0,100,26,0,68,93,65,0, + 125,9,0,124,9,0,116,1,0,106,8,0,107,7,0,114, + 248,0,116,19,0,124,9,0,131,1,0,125,10,0,110,13, + 0,116,1,0,106,8,0,124,9,0,25,125,10,0,116,20, + 0,124,8,0,124,9,0,124,10,0,131,3,0,1,113,212, + 0,87,100,5,0,100,6,0,103,1,0,102,2,0,100,7, + 0,100,8,0,100,6,0,103,2,0,102,2,0,102,2,0, + 125,11,0,120,146,0,124,11,0,68,93,126,0,92,2,0, + 125,12,0,125,13,0,116,21,0,100,9,0,100,10,0,132, + 0,0,124,13,0,68,131,1,0,131,1,0,115,108,1,116, + 22,0,130,1,0,124,13,0,100,11,0,25,125,14,0,124, + 12,0,116,1,0,106,8,0,107,6,0,114,150,1,116,1, + 0,106,8,0,124,12,0,25,125,15,0,80,113,65,1,121, + 17,0,116,19,0,124,12,0,131,1,0,125,15,0,80,87, + 113,65,1,4,116,23,0,107,10,0,114,190,1,1,1,1, + 119,65,1,89,113,65,1,88,113,65,1,87,116,23,0,100, + 12,0,131,1,0,130,1,0,116,20,0,124,8,0,100,13, + 0,124,15,0,131,3,0,1,116,20,0,124,8,0,100,14, + 0,124,14,0,131,3,0,1,116,20,0,124,8,0,100,15, + 0,100,16,0,106,24,0,124,13,0,131,1,0,131,3,0, + 1,121,16,0,116,19,0,100,17,0,131,1,0,125,16,0, + 87,110,24,0,4,116,23,0,107,10,0,114,50,2,1,1, + 1,100,18,0,125,16,0,89,110,1,0,88,116,20,0,124, + 8,0,100,17,0,124,16,0,131,3,0,1,116,19,0,100, + 19,0,131,1,0,125,17,0,116,20,0,124,8,0,100,19, + 0,124,17,0,131,3,0,1,124,12,0,100,7,0,107,2, + 0,114,138,2,116,19,0,100,20,0,131,1,0,125,18,0, + 116,20,0,124,8,0,100,21,0,124,18,0,131,3,0,1, + 110,0,0,116,20,0,124,8,0,100,22,0,116,25,0,131, + 0,0,131,3,0,1,116,26,0,106,27,0,116,0,0,106, + 28,0,131,0,0,131,1,0,1,124,12,0,100,7,0,107, + 2,0,114,228,2,116,29,0,106,30,0,100,23,0,131,1, + 0,1,100,24,0,116,26,0,107,6,0,114,228,2,100,25, + 0,116,31,0,95,32,0,113,228,2,110,0,0,100,18,0, + 83,41,27,122,250,83,101,116,117,112,32,105,109,112,111,114, 116,108,105,98,32,98,121,32,105,109,112,111,114,116,105,110, 103,32,110,101,101,100,101,100,32,98,117,105,108,116,45,105, 110,32,109,111,100,117,108,101,115,32,97,110,100,32,105,110, @@ -4191,103 +4252,60 @@ unsigned char _Py_M__importlib[] = { 32,109,111,100,117,108,101,115,44,32,116,104,111,115,101,32, 116,119,111,32,109,111,100,117,108,101,115,32,109,117,115,116, 32,98,101,32,101,120,112,108,105,99,105,116,108,121,32,112, - 97,115,115,101,100,32,105,110,46,10,10,32,32,32,32,117, - 10,0,0,0,95,95,108,111,97,100,101,114,95,95,117,3, - 0,0,0,95,105,111,117,9,0,0,0,95,119,97,114,110, - 105,110,103,115,117,8,0,0,0,98,117,105,108,116,105,110, - 115,117,7,0,0,0,109,97,114,115,104,97,108,117,5,0, - 0,0,112,111,115,105,120,117,1,0,0,0,47,117,2,0, - 0,0,110,116,117,1,0,0,0,92,117,3,0,0,0,111, - 115,50,99,1,0,0,0,0,0,0,0,2,0,0,0,3, - 0,0,0,115,0,0,0,115,33,0,0,0,124,0,0,93, - 23,0,125,1,0,116,0,0,124,1,0,131,1,0,100,0, - 0,107,2,0,86,1,113,3,0,100,1,0,83,40,2,0, - 0,0,105,1,0,0,0,78,40,1,0,0,0,117,3,0, - 0,0,108,101,110,40,2,0,0,0,117,2,0,0,0,46, - 48,117,3,0,0,0,115,101,112,40,0,0,0,0,40,0, - 0,0,0,117,29,0,0,0,60,102,114,111,122,101,110,32, - 105,109,112,111,114,116,108,105,98,46,95,98,111,111,116,115, - 116,114,97,112,62,117,9,0,0,0,60,103,101,110,101,120, - 112,114,62,191,6,0,0,115,2,0,0,0,6,0,117,25, - 0,0,0,95,115,101,116,117,112,46,60,108,111,99,97,108, - 115,62,46,60,103,101,110,101,120,112,114,62,105,0,0,0, - 0,117,7,0,0,0,69,77,88,32,71,67,67,105,1,0, - 0,0,117,30,0,0,0,105,109,112,111,114,116,108,105,98, - 32,114,101,113,117,105,114,101,115,32,112,111,115,105,120,32, - 111,114,32,110,116,117,7,0,0,0,95,116,104,114,101,97, - 100,117,8,0,0,0,95,119,101,97,107,114,101,102,117,6, - 0,0,0,119,105,110,114,101,103,117,7,0,0,0,95,119, - 105,110,114,101,103,117,3,0,0,0,95,111,115,117,8,0, - 0,0,112,97,116,104,95,115,101,112,117,15,0,0,0,112, - 97,116,104,95,115,101,112,97,114,97,116,111,114,115,117,11, - 0,0,0,95,114,101,108,97,120,95,99,97,115,101,117,4, - 0,0,0,46,112,121,119,117,6,0,0,0,95,100,46,112, - 121,100,78,40,4,0,0,0,117,3,0,0,0,95,105,111, - 117,9,0,0,0,95,119,97,114,110,105,110,103,115,117,8, - 0,0,0,98,117,105,108,116,105,110,115,117,7,0,0,0, - 109,97,114,115,104,97,108,84,40,35,0,0,0,117,4,0, - 0,0,95,105,109,112,117,3,0,0,0,115,121,115,117,5, - 0,0,0,102,108,97,103,115,117,8,0,0,0,111,112,116, - 105,109,105,122,101,117,27,0,0,0,79,80,84,73,77,73, - 90,69,68,95,66,89,84,69,67,79,68,69,95,83,85,70, - 70,73,88,69,83,117,17,0,0,0,66,89,84,69,67,79, - 68,69,95,83,85,70,70,73,88,69,83,117,23,0,0,0, - 68,69,66,85,71,95,66,89,84,69,67,79,68,69,95,83, - 85,70,70,73,88,69,83,117,4,0,0,0,116,121,112,101, - 117,7,0,0,0,109,111,100,117,108,101,115,117,5,0,0, - 0,105,116,101,109,115,117,10,0,0,0,105,115,105,110,115, - 116,97,110,99,101,117,7,0,0,0,104,97,115,97,116,116, - 114,117,20,0,0,0,98,117,105,108,116,105,110,95,109,111, - 100,117,108,101,95,110,97,109,101,115,117,15,0,0,0,66, - 117,105,108,116,105,110,73,109,112,111,114,116,101,114,117,10, - 0,0,0,95,95,108,111,97,100,101,114,95,95,117,9,0, - 0,0,105,115,95,102,114,111,122,101,110,117,14,0,0,0, - 70,114,111,122,101,110,73,109,112,111,114,116,101,114,117,8, - 0,0,0,95,95,110,97,109,101,95,95,117,11,0,0,0, - 108,111,97,100,95,109,111,100,117,108,101,117,7,0,0,0, - 115,101,116,97,116,116,114,117,3,0,0,0,97,108,108,117, - 14,0,0,0,65,115,115,101,114,116,105,111,110,69,114,114, - 111,114,117,7,0,0,0,118,101,114,115,105,111,110,117,11, - 0,0,0,73,109,112,111,114,116,69,114,114,111,114,117,4, - 0,0,0,78,111,110,101,117,3,0,0,0,115,101,116,117, - 16,0,0,0,95,109,97,107,101,95,114,101,108,97,120,95, - 99,97,115,101,117,18,0,0,0,69,88,84,69,78,83,73, - 79,78,95,83,85,70,70,73,88,69,83,117,6,0,0,0, - 101,120,116,101,110,100,117,18,0,0,0,101,120,116,101,110, - 115,105,111,110,95,115,117,102,102,105,120,101,115,117,15,0, - 0,0,83,79,85,82,67,69,95,83,85,70,70,73,88,69, - 83,117,6,0,0,0,97,112,112,101,110,100,117,4,0,0, - 0,84,114,117,101,117,21,0,0,0,87,105,110,100,111,119, - 115,82,101,103,105,115,116,114,121,70,105,110,100,101,114,117, - 11,0,0,0,68,69,66,85,71,95,66,85,73,76,68,40, - 16,0,0,0,117,10,0,0,0,115,121,115,95,109,111,100, - 117,108,101,117,11,0,0,0,95,105,109,112,95,109,111,100, - 117,108,101,117,11,0,0,0,109,111,100,117,108,101,95,116, - 121,112,101,117,4,0,0,0,110,97,109,101,117,6,0,0, - 0,109,111,100,117,108,101,117,11,0,0,0,115,101,108,102, - 95,109,111,100,117,108,101,117,12,0,0,0,98,117,105,108, - 116,105,110,95,110,97,109,101,117,14,0,0,0,98,117,105, - 108,116,105,110,95,109,111,100,117,108,101,117,10,0,0,0, - 111,115,95,100,101,116,97,105,108,115,117,10,0,0,0,98, - 117,105,108,116,105,110,95,111,115,117,15,0,0,0,112,97, - 116,104,95,115,101,112,97,114,97,116,111,114,115,117,8,0, - 0,0,112,97,116,104,95,115,101,112,117,9,0,0,0,111, - 115,95,109,111,100,117,108,101,117,13,0,0,0,116,104,114, - 101,97,100,95,109,111,100,117,108,101,117,14,0,0,0,119, - 101,97,107,114,101,102,95,109,111,100,117,108,101,117,13,0, - 0,0,119,105,110,114,101,103,95,109,111,100,117,108,101,40, - 0,0,0,0,40,0,0,0,0,117,29,0,0,0,60,102, - 114,111,122,101,110,32,105,109,112,111,114,116,108,105,98,46, - 95,98,111,111,116,115,116,114,97,112,62,117,6,0,0,0, - 95,115,101,116,117,112,154,6,0,0,115,106,0,0,0,0, - 9,6,1,6,2,12,1,9,2,6,2,12,1,28,1,15, - 1,15,1,15,1,12,1,15,1,22,2,13,1,13,1,15, - 1,18,2,13,1,20,2,48,1,19,2,31,1,10,1,15, - 1,13,1,4,2,3,1,15,2,27,1,13,1,5,1,13, - 1,12,2,12,2,3,1,19,1,13,2,11,1,15,2,12, - 1,15,1,19,2,16,1,16,1,16,1,16,1,22,2,19, - 1,19,1,12,1,13,1,12,1,117,6,0,0,0,95,115, - 101,116,117,112,99,2,0,0,0,0,0,0,0,3,0,0, + 97,115,115,101,100,32,105,110,46,10,10,32,32,32,32,114, + 49,0,0,0,114,167,0,0,0,218,8,98,117,105,108,116, + 105,110,115,114,192,0,0,0,90,5,112,111,115,105,120,250, + 1,47,218,2,110,116,250,1,92,99,1,0,0,0,0,0, + 0,0,2,0,0,0,3,0,0,0,115,0,0,0,115,33, + 0,0,0,124,0,0,93,23,0,125,1,0,116,0,0,124, + 1,0,131,1,0,100,0,0,107,2,0,86,1,113,3,0, + 100,1,0,83,41,2,114,29,0,0,0,78,41,1,114,31, + 0,0,0,41,2,114,22,0,0,0,114,129,0,0,0,114, + 4,0,0,0,114,4,0,0,0,114,5,0,0,0,114,77, + 0,0,0,105,9,0,0,115,2,0,0,0,6,0,122,25, + 95,115,101,116,117,112,46,60,108,111,99,97,108,115,62,46, + 60,103,101,110,101,120,112,114,62,114,84,0,0,0,122,30, + 105,109,112,111,114,116,108,105,98,32,114,101,113,117,105,114, + 101,115,32,112,111,115,105,120,32,111,114,32,110,116,114,3, + 0,0,0,114,25,0,0,0,114,21,0,0,0,114,30,0, + 0,0,114,85,0,0,0,78,114,111,0,0,0,90,6,119, + 105,110,114,101,103,114,24,1,0,0,114,6,0,0,0,122, + 4,46,112,121,119,122,6,95,100,46,112,121,100,84,41,4, + 122,3,95,105,111,122,9,95,119,97,114,110,105,110,103,115, + 122,8,98,117,105,108,116,105,110,115,122,7,109,97,114,115, + 104,97,108,41,33,114,106,0,0,0,114,7,0,0,0,114, + 117,0,0,0,114,118,0,0,0,114,120,0,0,0,114,233, + 0,0,0,114,119,0,0,0,114,66,0,0,0,114,73,0, + 0,0,218,5,105,116,101,109,115,114,193,0,0,0,114,158, + 0,0,0,114,11,1,0,0,114,163,0,0,0,114,20,1, + 0,0,114,248,0,0,0,114,175,0,0,0,114,255,0,0, + 0,114,57,0,0,0,114,128,1,0,0,114,61,0,0,0, + 218,3,97,108,108,114,100,0,0,0,114,154,0,0,0,114, + 26,0,0,0,114,11,0,0,0,114,60,1,0,0,114,198, + 0,0,0,114,125,1,0,0,114,135,0,0,0,114,224,0, + 0,0,114,23,1,0,0,114,27,1,0,0,41,19,218,10, + 115,121,115,95,109,111,100,117,108,101,218,11,95,105,109,112, + 95,109,111,100,117,108,101,90,11,109,111,100,117,108,101,95, + 116,121,112,101,114,67,0,0,0,114,180,0,0,0,114,170, + 0,0,0,114,178,0,0,0,114,179,0,0,0,90,11,115, + 101,108,102,95,109,111,100,117,108,101,90,12,98,117,105,108, + 116,105,110,95,110,97,109,101,90,14,98,117,105,108,116,105, + 110,95,109,111,100,117,108,101,90,10,111,115,95,100,101,116, + 97,105,108,115,90,10,98,117,105,108,116,105,110,95,111,115, + 114,21,0,0,0,114,25,0,0,0,90,9,111,115,95,109, + 111,100,117,108,101,90,13,116,104,114,101,97,100,95,109,111, + 100,117,108,101,90,14,119,101,97,107,114,101,102,95,109,111, + 100,117,108,101,90,13,119,105,110,114,101,103,95,109,111,100, + 117,108,101,114,4,0,0,0,114,4,0,0,0,114,5,0, + 0,0,218,6,95,115,101,116,117,112,61,9,0,0,115,108, + 0,0,0,0,9,6,1,6,2,12,1,9,2,6,3,12, + 1,28,1,15,1,15,1,9,1,15,1,9,2,3,1,15, + 1,12,1,20,3,13,1,13,1,15,1,15,2,13,1,20, + 3,33,1,19,2,31,1,10,1,15,1,13,1,4,2,3, + 1,12,1,5,1,13,1,12,2,12,1,16,1,16,1,25, + 3,3,1,16,1,13,2,11,1,16,3,12,1,16,3,12, + 1,12,1,19,3,19,1,19,1,12,1,13,1,12,1,114, + 137,1,0,0,99,2,0,0,0,0,0,0,0,3,0,0, 0,3,0,0,0,67,0,0,0,115,136,0,0,0,116,0, 0,124,0,0,124,1,0,131,2,0,1,116,1,0,131,0, 0,125,2,0,116,2,0,106,3,0,106,4,0,116,5,0, @@ -4297,134 +4315,63 @@ unsigned char _Py_M__importlib[] = { 116,11,0,106,12,0,100,1,0,107,2,0,114,116,0,116, 2,0,106,7,0,106,8,0,116,13,0,131,1,0,1,110, 0,0,116,2,0,106,7,0,106,8,0,116,14,0,131,1, - 0,1,100,2,0,83,40,3,0,0,0,117,50,0,0,0, - 73,110,115,116,97,108,108,32,105,109,112,111,114,116,108,105, - 98,32,97,115,32,116,104,101,32,105,109,112,108,101,109,101, - 110,116,97,116,105,111,110,32,111,102,32,105,109,112,111,114, - 116,46,117,2,0,0,0,110,116,78,40,15,0,0,0,117, - 6,0,0,0,95,115,101,116,117,112,117,27,0,0,0,95, - 103,101,116,95,115,117,112,112,111,114,116,101,100,95,102,105, - 108,101,95,108,111,97,100,101,114,115,117,3,0,0,0,115, - 121,115,117,10,0,0,0,112,97,116,104,95,104,111,111,107, - 115,117,6,0,0,0,101,120,116,101,110,100,117,10,0,0, - 0,70,105,108,101,70,105,110,100,101,114,117,9,0,0,0, - 112,97,116,104,95,104,111,111,107,117,9,0,0,0,109,101, - 116,97,95,112,97,116,104,117,6,0,0,0,97,112,112,101, - 110,100,117,15,0,0,0,66,117,105,108,116,105,110,73,109, - 112,111,114,116,101,114,117,14,0,0,0,70,114,111,122,101, - 110,73,109,112,111,114,116,101,114,117,3,0,0,0,95,111, - 115,117,8,0,0,0,95,95,110,97,109,101,95,95,117,21, - 0,0,0,87,105,110,100,111,119,115,82,101,103,105,115,116, - 114,121,70,105,110,100,101,114,117,10,0,0,0,80,97,116, - 104,70,105,110,100,101,114,40,3,0,0,0,117,10,0,0, - 0,115,121,115,95,109,111,100,117,108,101,117,11,0,0,0, - 95,105,109,112,95,109,111,100,117,108,101,117,17,0,0,0, - 115,117,112,112,111,114,116,101,100,95,108,111,97,100,101,114, - 115,40,0,0,0,0,40,0,0,0,0,117,29,0,0,0, - 60,102,114,111,122,101,110,32,105,109,112,111,114,116,108,105, - 98,46,95,98,111,111,116,115,116,114,97,112,62,117,8,0, - 0,0,95,105,110,115,116,97,108,108,233,6,0,0,115,16, - 0,0,0,0,2,13,1,9,1,28,1,16,1,16,1,15, - 1,19,1,117,8,0,0,0,95,105,110,115,116,97,108,108, - 78,40,3,0,0,0,117,3,0,0,0,119,105,110,117,6, - 0,0,0,99,121,103,119,105,110,117,6,0,0,0,100,97, - 114,119,105,110,40,74,0,0,0,117,7,0,0,0,95,95, - 100,111,99,95,95,117,27,0,0,0,95,67,65,83,69,95, - 73,78,83,69,78,83,73,84,73,86,69,95,80,76,65,84, - 70,79,82,77,83,117,16,0,0,0,95,109,97,107,101,95, - 114,101,108,97,120,95,99,97,115,101,117,7,0,0,0,95, - 119,95,108,111,110,103,117,7,0,0,0,95,114,95,108,111, - 110,103,117,10,0,0,0,95,112,97,116,104,95,106,111,105, - 110,117,11,0,0,0,95,112,97,116,104,95,115,112,108,105, - 116,117,18,0,0,0,95,112,97,116,104,95,105,115,95,109, - 111,100,101,95,116,121,112,101,117,12,0,0,0,95,112,97, - 116,104,95,105,115,102,105,108,101,117,11,0,0,0,95,112, - 97,116,104,95,105,115,100,105,114,117,13,0,0,0,95,119, - 114,105,116,101,95,97,116,111,109,105,99,117,5,0,0,0, - 95,119,114,97,112,117,4,0,0,0,116,121,112,101,117,8, - 0,0,0,95,95,99,111,100,101,95,95,117,10,0,0,0, - 95,99,111,100,101,95,116,121,112,101,117,10,0,0,0,110, - 101,119,95,109,111,100,117,108,101,117,13,0,0,0,95,109, - 111,100,117,108,101,95,108,111,99,107,115,117,12,0,0,0, - 95,98,108,111,99,107,105,110,103,95,111,110,117,12,0,0, - 0,82,117,110,116,105,109,101,69,114,114,111,114,117,14,0, - 0,0,95,68,101,97,100,108,111,99,107,69,114,114,111,114, - 117,11,0,0,0,95,77,111,100,117,108,101,76,111,99,107, - 117,16,0,0,0,95,68,117,109,109,121,77,111,100,117,108, - 101,76,111,99,107,117,16,0,0,0,95,103,101,116,95,109, - 111,100,117,108,101,95,108,111,99,107,117,19,0,0,0,95, - 108,111,99,107,95,117,110,108,111,99,107,95,109,111,100,117, - 108,101,117,25,0,0,0,95,99,97,108,108,95,119,105,116, - 104,95,102,114,97,109,101,115,95,114,101,109,111,118,101,100, - 117,3,0,0,0,111,114,100,117,17,0,0,0,95,82,65, - 87,95,77,65,71,73,67,95,78,85,77,66,69,82,117,5, - 0,0,0,98,121,116,101,115,117,5,0,0,0,114,97,110, - 103,101,117,12,0,0,0,95,77,65,71,73,67,95,66,89, - 84,69,83,117,8,0,0,0,95,80,89,67,65,67,72,69, - 117,15,0,0,0,83,79,85,82,67,69,95,83,85,70,70, - 73,88,69,83,117,23,0,0,0,68,69,66,85,71,95,66, - 89,84,69,67,79,68,69,95,83,85,70,70,73,88,69,83, - 117,27,0,0,0,79,80,84,73,77,73,90,69,68,95,66, - 89,84,69,67,79,68,69,95,83,85,70,70,73,88,69,83, - 117,4,0,0,0,78,111,110,101,117,17,0,0,0,99,97, - 99,104,101,95,102,114,111,109,95,115,111,117,114,99,101,117, - 17,0,0,0,115,111,117,114,99,101,95,102,114,111,109,95, - 99,97,99,104,101,117,15,0,0,0,95,103,101,116,95,115, - 111,117,114,99,101,102,105,108,101,117,16,0,0,0,95,118, - 101,114,98,111,115,101,95,109,101,115,115,97,103,101,117,11, - 0,0,0,115,101,116,95,112,97,99,107,97,103,101,117,10, - 0,0,0,115,101,116,95,108,111,97,100,101,114,117,17,0, - 0,0,109,111,100,117,108,101,95,102,111,114,95,108,111,97, - 100,101,114,117,11,0,0,0,95,99,104,101,99,107,95,110, - 97,109,101,117,17,0,0,0,95,114,101,113,117,105,114,101, - 115,95,98,117,105,108,116,105,110,117,16,0,0,0,95,114, - 101,113,117,105,114,101,115,95,102,114,111,122,101,110,117,17, - 0,0,0,95,102,105,110,100,95,109,111,100,117,108,101,95, - 115,104,105,109,117,15,0,0,0,66,117,105,108,116,105,110, - 73,109,112,111,114,116,101,114,117,14,0,0,0,70,114,111, - 122,101,110,73,109,112,111,114,116,101,114,117,21,0,0,0, - 87,105,110,100,111,119,115,82,101,103,105,115,116,114,121,70, - 105,110,100,101,114,117,13,0,0,0,95,76,111,97,100,101, - 114,66,97,115,105,99,115,117,12,0,0,0,83,111,117,114, - 99,101,76,111,97,100,101,114,117,10,0,0,0,70,105,108, - 101,76,111,97,100,101,114,117,16,0,0,0,83,111,117,114, - 99,101,70,105,108,101,76,111,97,100,101,114,117,20,0,0, - 0,83,111,117,114,99,101,108,101,115,115,70,105,108,101,76, - 111,97,100,101,114,117,18,0,0,0,69,88,84,69,78,83, - 73,79,78,95,83,85,70,70,73,88,69,83,117,19,0,0, - 0,69,120,116,101,110,115,105,111,110,70,105,108,101,76,111, - 97,100,101,114,117,14,0,0,0,95,78,97,109,101,115,112, - 97,99,101,80,97,116,104,117,15,0,0,0,78,97,109,101, - 115,112,97,99,101,76,111,97,100,101,114,117,10,0,0,0, - 80,97,116,104,70,105,110,100,101,114,117,10,0,0,0,70, - 105,108,101,70,105,110,100,101,114,117,18,0,0,0,95,73, - 109,112,111,114,116,76,111,99,107,67,111,110,116,101,120,116, - 117,13,0,0,0,95,114,101,115,111,108,118,101,95,110,97, - 109,101,117,12,0,0,0,95,102,105,110,100,95,109,111,100, - 117,108,101,117,13,0,0,0,95,115,97,110,105,116,121,95, - 99,104,101,99,107,117,8,0,0,0,95,69,82,82,95,77, - 83,71,117,23,0,0,0,95,102,105,110,100,95,97,110,100, - 95,108,111,97,100,95,117,110,108,111,99,107,101,100,117,14, - 0,0,0,95,102,105,110,100,95,97,110,100,95,108,111,97, - 100,117,11,0,0,0,95,103,99,100,95,105,109,112,111,114, - 116,117,16,0,0,0,95,104,97,110,100,108,101,95,102,114, - 111,109,108,105,115,116,117,17,0,0,0,95,99,97,108,99, - 95,95,95,112,97,99,107,97,103,101,95,95,117,27,0,0, - 0,95,103,101,116,95,115,117,112,112,111,114,116,101,100,95, - 102,105,108,101,95,108,111,97,100,101,114,115,117,10,0,0, - 0,95,95,105,109,112,111,114,116,95,95,117,6,0,0,0, - 95,115,101,116,117,112,117,8,0,0,0,95,105,110,115,116, - 97,108,108,40,0,0,0,0,40,0,0,0,0,40,0,0, - 0,0,117,29,0,0,0,60,102,114,111,122,101,110,32,105, - 109,112,111,114,116,108,105,98,46,95,98,111,111,116,115,116, - 114,97,112,62,117,8,0,0,0,60,109,111,100,117,108,101, - 62,8,0,0,0,115,132,0,0,0,6,21,6,3,12,13, - 12,16,12,13,12,12,12,12,12,10,12,6,12,7,15,22, - 12,8,15,3,12,12,6,2,6,3,22,4,19,68,19,23, - 12,19,12,20,12,100,34,1,37,2,6,2,9,2,9,1, - 9,2,15,27,12,23,12,19,18,8,12,13,12,11,12,55, - 12,18,12,11,12,11,12,17,19,57,19,54,19,50,19,83, - 22,134,19,29,25,49,25,25,6,3,19,45,19,55,19,18, - 19,91,19,128,19,13,12,9,12,17,12,17,6,2,12,50, - 12,13,18,24,12,34,12,15,12,11,24,36,12,79, + 0,1,100,2,0,83,41,3,122,50,73,110,115,116,97,108, + 108,32,105,109,112,111,114,116,108,105,98,32,97,115,32,116, + 104,101,32,105,109,112,108,101,109,101,110,116,97,116,105,111, + 110,32,111,102,32,105,109,112,111,114,116,46,114,131,1,0, + 0,78,41,15,114,137,1,0,0,114,241,0,0,0,114,7, + 0,0,0,114,79,1,0,0,114,198,0,0,0,114,87,1, + 0,0,114,101,1,0,0,114,107,1,0,0,114,224,0,0, + 0,114,11,1,0,0,114,20,1,0,0,114,3,0,0,0, + 114,57,0,0,0,114,23,1,0,0,114,74,1,0,0,41, + 3,114,135,1,0,0,114,136,1,0,0,90,17,115,117,112, + 112,111,114,116,101,100,95,108,111,97,100,101,114,115,114,4, + 0,0,0,114,4,0,0,0,114,5,0,0,0,218,8,95, + 105,110,115,116,97,108,108,148,9,0,0,115,16,0,0,0, + 0,2,13,1,9,1,28,1,16,1,16,1,15,1,19,1, + 114,138,1,0,0,41,3,122,3,119,105,110,114,1,0,0, + 0,114,2,0,0,0,41,92,114,59,0,0,0,114,10,0, + 0,0,114,11,0,0,0,114,17,0,0,0,114,19,0,0, + 0,114,28,0,0,0,114,38,0,0,0,114,39,0,0,0, + 114,43,0,0,0,114,44,0,0,0,114,46,0,0,0,114, + 55,0,0,0,114,65,0,0,0,114,68,0,0,0,114,66, + 0,0,0,218,8,95,95,99,111,100,101,95,95,114,194,0, + 0,0,114,69,0,0,0,114,109,0,0,0,114,92,0,0, + 0,114,99,0,0,0,114,82,0,0,0,114,83,0,0,0, + 114,102,0,0,0,114,103,0,0,0,114,105,0,0,0,114, + 112,0,0,0,114,114,0,0,0,114,15,0,0,0,114,186, + 0,0,0,114,14,0,0,0,114,18,0,0,0,90,17,95, + 82,65,87,95,77,65,71,73,67,95,78,85,77,66,69,82, + 114,124,0,0,0,114,135,0,0,0,114,119,0,0,0,114, + 120,0,0,0,114,132,0,0,0,114,136,0,0,0,114,143, + 0,0,0,114,145,0,0,0,114,153,0,0,0,114,157,0, + 0,0,114,162,0,0,0,114,165,0,0,0,114,173,0,0, + 0,114,181,0,0,0,114,191,0,0,0,114,196,0,0,0, + 114,199,0,0,0,114,204,0,0,0,114,212,0,0,0,114, + 213,0,0,0,114,217,0,0,0,114,174,0,0,0,218,6, + 111,98,106,101,99,116,114,242,0,0,0,114,240,0,0,0, + 114,248,0,0,0,114,175,0,0,0,114,10,1,0,0,114, + 11,1,0,0,114,20,1,0,0,114,23,1,0,0,114,33, + 1,0,0,114,34,1,0,0,114,49,1,0,0,114,9,1, + 0,0,114,8,1,0,0,114,60,1,0,0,114,57,1,0, + 0,114,61,1,0,0,114,252,0,0,0,114,74,1,0,0, + 114,87,1,0,0,114,102,1,0,0,114,105,1,0,0,114, + 106,1,0,0,114,108,1,0,0,114,111,1,0,0,114,120, + 1,0,0,114,112,1,0,0,114,114,1,0,0,114,115,1, + 0,0,114,116,1,0,0,114,122,1,0,0,114,124,1,0, + 0,114,241,0,0,0,114,127,1,0,0,114,128,1,0,0, + 114,137,1,0,0,114,138,1,0,0,114,4,0,0,0,114, + 4,0,0,0,114,4,0,0,0,114,5,0,0,0,218,8, + 60,109,111,100,117,108,101,62,8,0,0,0,115,170,0,0, + 0,6,17,6,3,12,12,12,5,12,5,12,6,12,12,12, + 10,12,9,12,5,12,7,15,22,12,8,12,4,15,4,19, + 20,6,2,6,3,22,4,19,68,19,21,19,19,12,19,12, + 20,12,114,22,1,18,2,6,2,9,2,9,1,9,2,15, + 27,12,23,12,19,12,12,18,8,12,18,12,11,12,11,12, + 17,12,16,21,55,21,12,18,10,12,14,12,36,19,27,19, + 106,24,22,9,3,12,1,15,63,18,45,19,230,15,25,19, + 70,19,71,19,63,19,24,22,110,19,41,25,43,25,16,6, + 3,19,57,19,57,19,38,19,129,19,146,19,13,12,9,12, + 9,15,40,12,17,6,1,10,2,12,27,12,6,18,24,12, + 32,12,15,12,11,24,35,12,8,12,87, }; diff --git a/Python/marshal.c b/Python/marshal.c index cc17329..6f0ee5e 100644 --- a/Python/marshal.c +++ b/Python/marshal.c @@ -1,8 +1,10 @@ /* Write Python objects to files and read them back. - This is intended for writing and reading compiled Python code only; - a true persistent storage facility would be much harder, since - it would have to take circular links and sharing into account. */ + This is primarily intended for writing and reading compiled Python code, + even though dicts, lists, sets and frozensets, not commonly seen in + code objects, are supported. + Version 3 of this protocol properly supports circular links + and sharing. */ #define PY_SSIZE_T_CLEAN @@ -31,16 +33,14 @@ #define TYPE_STOPITER 'S' #define TYPE_ELLIPSIS '.' #define TYPE_INT 'i' -/* TYPE_INT64 is deprecated. It is not - generated anymore, and support for reading it - will be removed in Python 3.4. */ -#define TYPE_INT64 'I' #define TYPE_FLOAT 'f' #define TYPE_BINARY_FLOAT 'g' #define TYPE_COMPLEX 'x' #define TYPE_BINARY_COMPLEX 'y' #define TYPE_LONG 'l' #define TYPE_STRING 's' +#define TYPE_INTERNED 't' +#define TYPE_REF 'r' #define TYPE_TUPLE '(' #define TYPE_LIST '[' #define TYPE_DICT '{' @@ -49,6 +49,13 @@ #define TYPE_UNKNOWN '?' #define TYPE_SET '<' #define TYPE_FROZENSET '>' +#define FLAG_REF '\x80' /* with a type, add obj to index */ + +#define TYPE_ASCII 'a' +#define TYPE_ASCII_INTERNED 'A' +#define TYPE_SMALL_TUPLE ')' +#define TYPE_SHORT_ASCII 'z' +#define TYPE_SHORT_ASCII_INTERNED 'Z' #define WFERR_OK 0 #define WFERR_UNMARSHALLABLE 1 @@ -65,15 +72,18 @@ typedef struct { PyObject *current_filename; char *ptr; char *end; + char *buf; + Py_ssize_t buf_size; + PyObject *refs; /* dict on marshal, list on unmarshal */ int version; } WFILE; #define w_byte(c, p) if (((p)->fp)) putc((c), (p)->fp); \ else if ((p)->ptr != (p)->end) *(p)->ptr++ = (c); \ - else w_more(c, p) + else w_more((c), p) static void -w_more(int c, WFILE *p) +w_more(char c, WFILE *p) { Py_ssize_t size, newsize; if (p->str == NULL) @@ -90,7 +100,7 @@ w_more(int c, WFILE *p) p->ptr = PyBytes_AS_STRING((PyBytesObject *)p->str) + size; p->end = PyBytes_AS_STRING((PyBytesObject *)p->str) + newsize; - *p->ptr++ = Py_SAFE_DOWNCAST(c, int, char); + *p->ptr++ = c; } } @@ -146,6 +156,13 @@ w_pstring(const char *s, Py_ssize_t n, WFILE *p) w_string(s, n, p); } +static void +w_short_pstring(const char *s, Py_ssize_t n, WFILE *p) +{ + w_byte(Py_SAFE_DOWNCAST(n, Py_ssize_t, unsigned char), p); + w_string(s, n, p); +} + /* We assume that Python ints are stored internally in base some power of 2**15; for the sake of portability we'll always read and write them in base exactly 2**15. */ @@ -158,13 +175,17 @@ w_pstring(const char *s, Py_ssize_t n, WFILE *p) #endif #define PyLong_MARSHAL_RATIO (PyLong_SHIFT / PyLong_MARSHAL_SHIFT) +#define W_TYPE(t, p) do { \ + w_byte((t) | flag, (p)); \ +} while(0) + static void -w_PyLong(const PyLongObject *ob, WFILE *p) +w_PyLong(const PyLongObject *ob, char flag, WFILE *p) { Py_ssize_t i, j, n, l; digit d; - w_byte(TYPE_LONG, p); + W_TYPE(TYPE_LONG, p); if (Py_SIZE(ob) == 0) { w_long((long)0, p); return; @@ -201,10 +222,64 @@ w_PyLong(const PyLongObject *ob, WFILE *p) } while (d != 0); } +static int +w_ref(PyObject *v, char *flag, WFILE *p) +{ + PyObject *id; + PyObject *idx; + + if (p->version < 3 || p->refs == NULL) + return 0; /* not writing object references */ + + /* if it has only one reference, it definitely isn't shared */ + if (Py_REFCNT(v) == 1) + return 0; + + id = PyLong_FromVoidPtr((void*)v); + if (id == NULL) + goto err; + idx = PyDict_GetItem(p->refs, id); + if (idx != NULL) { + /* write the reference index to the stream */ + long w = PyLong_AsLong(idx); + Py_DECREF(id); + if (w == -1 && PyErr_Occurred()) { + goto err; + } + /* we don't store "long" indices in the dict */ + assert(0 <= w && w <= 0x7fffffff); + w_byte(TYPE_REF, p); + w_long(w, p); + return 1; + } else { + int ok; + Py_ssize_t s = PyDict_Size(p->refs); + /* we don't support long indices */ + if (s >= 0x7fffffff) { + PyErr_SetString(PyExc_ValueError, "too many objects"); + goto err; + } + idx = PyLong_FromSsize_t(s); + ok = idx && PyDict_SetItem(p->refs, id, idx) == 0; + Py_DECREF(id); + Py_XDECREF(idx); + if (!ok) + goto err; + *flag |= FLAG_REF; + return 0; + } +err: + p->error = WFERR_UNMARSHALLABLE; + return 1; +} + +static void +w_complex_object(PyObject *v, char flag, WFILE *p); + static void w_object(PyObject *v, WFILE *p) { - Py_ssize_t i, n; + char flag = '\0'; p->depth++; @@ -229,24 +304,35 @@ w_object(PyObject *v, WFILE *p) else if (v == Py_True) { w_byte(TYPE_TRUE, p); } - else if (PyLong_CheckExact(v)) { + else if (!w_ref(v, &flag, p)) + w_complex_object(v, flag, p); + + p->depth--; +} + +static void +w_complex_object(PyObject *v, char flag, WFILE *p) +{ + Py_ssize_t i, n; + + if (PyLong_CheckExact(v)) { long x = PyLong_AsLong(v); if ((x == -1) && PyErr_Occurred()) { PyLongObject *ob = (PyLongObject *)v; PyErr_Clear(); - w_PyLong(ob, p); + w_PyLong(ob, flag, p); } else { #if SIZEOF_LONG > 4 long y = Py_ARITHMETIC_RIGHT_SHIFT(long, x, 31); if (y && y != -1) { /* Too large for TYPE_INT */ - w_PyLong((PyLongObject*)v, p); + w_PyLong((PyLongObject*)v, flag, p); } else #endif { - w_byte(TYPE_INT, p); + W_TYPE(TYPE_INT, p); w_long(x, p); } } @@ -259,7 +345,7 @@ w_object(PyObject *v, WFILE *p) p->error = WFERR_UNMARSHALLABLE; return; } - w_byte(TYPE_BINARY_FLOAT, p); + W_TYPE(TYPE_BINARY_FLOAT, p); w_string((char*)buf, 8, p); } else { @@ -270,7 +356,7 @@ w_object(PyObject *v, WFILE *p) return; } n = strlen(buf); - w_byte(TYPE_FLOAT, p); + W_TYPE(TYPE_FLOAT, p); w_byte((int)n, p); w_string(buf, n, p); PyMem_Free(buf); @@ -284,7 +370,7 @@ w_object(PyObject *v, WFILE *p) p->error = WFERR_UNMARSHALLABLE; return; } - w_byte(TYPE_BINARY_COMPLEX, p); + W_TYPE(TYPE_BINARY_COMPLEX, p); w_string((char*)buf, 8, p); if (_PyFloat_Pack8(PyComplex_ImagAsDouble(v), buf, 1) < 0) { @@ -295,7 +381,7 @@ w_object(PyObject *v, WFILE *p) } else { char *buf; - w_byte(TYPE_COMPLEX, p); + W_TYPE(TYPE_COMPLEX, p); buf = PyOS_double_to_string(PyComplex_RealAsDouble(v), 'g', 17, 0, NULL); if (!buf) { @@ -319,31 +405,61 @@ w_object(PyObject *v, WFILE *p) } } else if (PyBytes_CheckExact(v)) { - w_byte(TYPE_STRING, p); + W_TYPE(TYPE_STRING, p); w_pstring(PyBytes_AS_STRING(v), PyBytes_GET_SIZE(v), p); } else if (PyUnicode_CheckExact(v)) { - PyObject *utf8; - utf8 = PyUnicode_AsEncodedString(v, "utf8", "surrogatepass"); - if (utf8 == NULL) { - p->depth--; - p->error = WFERR_UNMARSHALLABLE; - return; + if (p->version >= 4 && PyUnicode_IS_ASCII(v)) { + int is_short = PyUnicode_GET_LENGTH(v) < 256; + if (is_short) { + if (PyUnicode_CHECK_INTERNED(v)) + W_TYPE(TYPE_SHORT_ASCII_INTERNED, p); + else + W_TYPE(TYPE_SHORT_ASCII, p); + w_short_pstring((char *) PyUnicode_1BYTE_DATA(v), + PyUnicode_GET_LENGTH(v), p); + } + else { + if (PyUnicode_CHECK_INTERNED(v)) + W_TYPE(TYPE_ASCII_INTERNED, p); + else + W_TYPE(TYPE_ASCII, p); + w_pstring((char *) PyUnicode_1BYTE_DATA(v), + PyUnicode_GET_LENGTH(v), p); + } + } + else { + PyObject *utf8; + utf8 = PyUnicode_AsEncodedString(v, "utf8", "surrogatepass"); + if (utf8 == NULL) { + p->depth--; + p->error = WFERR_UNMARSHALLABLE; + return; + } + if (p->version >= 3 && PyUnicode_CHECK_INTERNED(v)) + W_TYPE(TYPE_INTERNED, p); + else + W_TYPE(TYPE_UNICODE, p); + w_pstring(PyBytes_AS_STRING(utf8), PyBytes_GET_SIZE(utf8), p); + Py_DECREF(utf8); } - w_byte(TYPE_UNICODE, p); - w_pstring(PyBytes_AS_STRING(utf8), PyBytes_GET_SIZE(utf8), p); - Py_DECREF(utf8); } else if (PyTuple_CheckExact(v)) { - w_byte(TYPE_TUPLE, p); n = PyTuple_Size(v); - W_SIZE(n, p); + if (p->version >= 4 && n < 256) { + W_TYPE(TYPE_SMALL_TUPLE, p); + w_byte((unsigned char)n, p); + } + else { + W_TYPE(TYPE_TUPLE, p); + W_SIZE(n, p); + } for (i = 0; i < n; i++) { w_object(PyTuple_GET_ITEM(v, i), p); } } else if (PyList_CheckExact(v)) { - w_byte(TYPE_LIST, p); + W_TYPE(TYPE_LIST, p); n = PyList_GET_SIZE(v); W_SIZE(n, p); for (i = 0; i < n; i++) { @@ -353,7 +469,7 @@ w_object(PyObject *v, WFILE *p) else if (PyDict_CheckExact(v)) { Py_ssize_t pos; PyObject *key, *value; - w_byte(TYPE_DICT, p); + W_TYPE(TYPE_DICT, p); /* This one is NULL object terminated! */ pos = 0; while (PyDict_Next(v, &pos, &key, &value)) { @@ -366,9 +482,9 @@ w_object(PyObject *v, WFILE *p) PyObject *value, *it; if (PyObject_TypeCheck(v, &PySet_Type)) - w_byte(TYPE_SET, p); + W_TYPE(TYPE_SET, p); else - w_byte(TYPE_FROZENSET, p); + W_TYPE(TYPE_FROZENSET, p); n = PyObject_Size(v); if (n == -1) { p->depth--; @@ -395,7 +511,7 @@ w_object(PyObject *v, WFILE *p) } else if (PyCode_Check(v)) { PyCodeObject *co = (PyCodeObject *)v; - w_byte(TYPE_CODE, p); + W_TYPE(TYPE_CODE, p); w_long(co->co_argcount, p); w_long(co->co_kwonlyargcount, p); w_long(co->co_nlocals, p); @@ -413,7 +529,7 @@ w_object(PyObject *v, WFILE *p) w_object(co->co_lnotab, p); } else if (PyObject_CheckBuffer(v)) { - /* Write unknown buffer-style objects as a string */ + /* Write unknown bytes-like objects as a byte string */ Py_buffer view; if (PyObject_GetBuffer(v, &view, PyBUF_SIMPLE) != 0) { w_byte(TYPE_UNKNOWN, p); @@ -421,15 +537,14 @@ w_object(PyObject *v, WFILE *p) p->error = WFERR_UNMARSHALLABLE; return; } - w_byte(TYPE_STRING, p); + W_TYPE(TYPE_STRING, p); w_pstring(view.buf, view.len, p); PyBuffer_Release(&view); } else { - w_byte(TYPE_UNKNOWN, p); + W_TYPE(TYPE_UNKNOWN, p); p->error = WFERR_UNMARSHALLABLE; } - p->depth--; } /* version currently has no effect for writing ints. */ @@ -440,6 +555,7 @@ PyMarshal_WriteLongToFile(long x, FILE *fp, int version) wf.fp = fp; wf.error = WFERR_OK; wf.depth = 0; + wf.refs = NULL; wf.version = version; w_long(x, &wf); } @@ -451,81 +567,107 @@ PyMarshal_WriteObjectToFile(PyObject *x, FILE *fp, int version) wf.fp = fp; wf.error = WFERR_OK; wf.depth = 0; + if (version >= 3) { + if ((wf.refs = PyDict_New()) == NULL) + return; /* caller mush check PyErr_Occurred() */ + } else + wf.refs = NULL; wf.version = version; w_object(x, &wf); + Py_XDECREF(wf.refs); } typedef WFILE RFILE; /* Same struct with different invariants */ -#define rs_byte(p) (((p)->ptr < (p)->end) ? (unsigned char)*(p)->ptr++ : EOF) - -static Py_ssize_t -r_string(char *s, Py_ssize_t n, RFILE *p) +static char * +r_string(Py_ssize_t n, RFILE *p) { - char *ptr; - Py_ssize_t read, left; + Py_ssize_t read = -1; + + if (p->ptr != NULL) { + /* Fast path for loads() */ + char *res = p->ptr; + Py_ssize_t left = p->end - p->ptr; + if (left < n) { + PyErr_SetString(PyExc_EOFError, + "marshal data too short"); + return NULL; + } + p->ptr += n; + return res; + } + if (p->buf == NULL) { + p->buf = PyMem_MALLOC(n); + if (p->buf == NULL) { + PyErr_NoMemory(); + return NULL; + } + p->buf_size = n; + } + else if (p->buf_size < n) { + p->buf = PyMem_REALLOC(p->buf, n); + if (p->buf == NULL) { + PyErr_NoMemory(); + return NULL; + } + p->buf_size = n; + } if (!p->readable) { - if (p->fp != NULL) - /* The result fits into int because it must be <=n. */ - read = fread(s, 1, n, p->fp); - else { - left = p->end - p->ptr; - read = (left < n) ? left : n; - memcpy(s, p->ptr, read); - p->ptr += read; - } + assert(p->fp != NULL); + read = fread(p->buf, 1, n, p->fp); } else { - _Py_IDENTIFIER(read); - - PyObject *data = _PyObject_CallMethodId(p->readable, &PyId_read, "n", n); - read = 0; - if (data != NULL) { - if (!PyBytes_Check(data)) { - PyErr_Format(PyExc_TypeError, - "f.read() returned not bytes but %.100s", - data->ob_type->tp_name); - } - else { - read = PyBytes_GET_SIZE(data); - if (read > 0) { - if (read > n) { - PyErr_Format(PyExc_ValueError, - "read() returned too much data: " - "%zd bytes requested, %zd returned", - n, read); - read = -1; - } - else { - ptr = PyBytes_AS_STRING(data); - memcpy(s, ptr, read); - } - } - } - Py_DECREF(data); + _Py_IDENTIFIER(readinto); + PyObject *res, *mview; + Py_buffer buf; + + if (PyBuffer_FillInfo(&buf, NULL, p->buf, n, 0, PyBUF_CONTIG) == -1) + return NULL; + mview = PyMemoryView_FromBuffer(&buf); + if (mview == NULL) + return NULL; + + res = _PyObject_CallMethodId(p->readable, &PyId_readinto, "N", mview); + if (res != NULL) { + read = PyNumber_AsSsize_t(res, PyExc_ValueError); + Py_DECREF(res); } } - if (!PyErr_Occurred() && (read < n)) { - PyErr_SetString(PyExc_EOFError, "EOF read where not expected"); + if (read != n) { + if (!PyErr_Occurred()) { + if (read > n) + PyErr_Format(PyExc_ValueError, + "read() returned too much data: " + "%zd bytes requested, %zd returned", + n, read); + else + PyErr_SetString(PyExc_EOFError, + "EOF read where not expected"); + } + return NULL; } - return read; + return p->buf; } - static int r_byte(RFILE *p) { int c = EOF; - unsigned char ch; - Py_ssize_t n; - if (!p->readable) - c = p->fp ? getc(p->fp) : rs_byte(p); + if (p->ptr != NULL) { + if (p->ptr < p->end) + c = (unsigned char) *p->ptr++; + return c; + } + if (!p->readable) { + assert(p->fp); + c = getc(p->fp); + } else { - n = r_string((char *) &ch, 1, p); - if (n > 0) - c = ch; + char *ptr = r_string(1, p); + if (ptr != NULL) + c = *(unsigned char *) ptr; } return c; } @@ -533,69 +675,37 @@ r_byte(RFILE *p) static int r_short(RFILE *p) { - register short x; - unsigned char buffer[2]; - - r_string((char *) buffer, 2, p); - x = buffer[0]; - x |= buffer[1] << 8; - /* Sign-extension, in case short greater than 16 bits */ - x |= -(x & 0x8000); + short x = -1; + unsigned char *buffer; + + buffer = (unsigned char *) r_string(2, p); + if (buffer != NULL) { + x = buffer[0]; + x |= buffer[1] << 8; + /* Sign-extension, in case short greater than 16 bits */ + x |= -(x & 0x8000); + } return x; } static long r_long(RFILE *p) { - register long x; - unsigned char buffer[4]; - - r_string((char *) buffer, 4, p); - x = buffer[0]; - x |= (long)buffer[1] << 8; - x |= (long)buffer[2] << 16; - x |= (long)buffer[3] << 24; -#if SIZEOF_LONG > 4 - /* Sign extension for 64-bit machines */ - x |= -(x & 0x80000000L); -#endif - return x; -} - -/* r_long64 deals with the TYPE_INT64 code. On a machine with - sizeof(long) > 4, it returns a Python int object, else a Python long - object. Note that w_long64 writes out TYPE_INT if 32 bits is enough, - so there's no inefficiency here in returning a PyLong on 32-bit boxes - for everything written via TYPE_INT64 (i.e., if an int is written via - TYPE_INT64, it *needs* more than 32 bits). -*/ -static PyObject * -r_long64(RFILE *p) -{ - PyObject *result = NULL; - long lo4 = r_long(p); - long hi4 = r_long(p); - - if (!PyErr_Occurred()) { + long x = -1; + unsigned char *buffer; + + buffer = (unsigned char *) r_string(4, p); + if (buffer != NULL) { + x = buffer[0]; + x |= (long)buffer[1] << 8; + x |= (long)buffer[2] << 16; + x |= (long)buffer[3] << 24; #if SIZEOF_LONG > 4 - long x = (hi4 << 32) | (lo4 & 0xFFFFFFFFL); - result = PyLong_FromLong(x); -#else - unsigned char buf[8]; - int one = 1; - int is_little_endian = (int)*(char*)&one; - if (is_little_endian) { - memcpy(buf, &lo4, 4); - memcpy(buf+4, &hi4, 4); - } - else { - memcpy(buf, &hi4, 4); - memcpy(buf+4, &lo4, 4); - } - result = _PyLong_FromByteArray(buf, 8, is_little_endian, 1); + /* Sign extension for 64-bit machines */ + x |= -(x & 0x80000000L); #endif } - return result; + return x; } static PyObject * @@ -622,25 +732,31 @@ r_PyLong(RFILE *p) ob = _PyLong_New(size); if (ob == NULL) return NULL; + Py_SIZE(ob) = n > 0 ? size : -size; for (i = 0; i < size-1; i++) { d = 0; for (j=0; j < PyLong_MARSHAL_RATIO; j++) { md = r_short(p); - if (PyErr_Occurred()) - break; + if (PyErr_Occurred()) { + Py_DECREF(ob); + return NULL; + } if (md < 0 || md > PyLong_MARSHAL_BASE) goto bad_digit; d += (digit)md << j*PyLong_MARSHAL_SHIFT; } ob->ob_digit[i] = d; } + d = 0; for (j=0; j < shorts_in_top_digit; j++) { md = r_short(p); - if (PyErr_Occurred()) - break; + if (PyErr_Occurred()) { + Py_DECREF(ob); + return NULL; + } if (md < 0 || md > PyLong_MARSHAL_BASE) goto bad_digit; /* topmost marshal digit should be nonzero */ @@ -667,6 +783,59 @@ r_PyLong(RFILE *p) return NULL; } +/* allocate the reflist index for a new object. Return -1 on failure */ +static Py_ssize_t +r_ref_reserve(int flag, RFILE *p) +{ + if (flag) { /* currently only FLAG_REF is defined */ + Py_ssize_t idx = PyList_GET_SIZE(p->refs); + if (idx >= 0x7ffffffe) { + PyErr_SetString(PyExc_ValueError, "bad marshal data (index list too large)"); + return -1; + } + if (PyList_Append(p->refs, Py_None) < 0) + return -1; + return idx; + } else + return 0; +} + +/* insert the new object 'o' to the reflist at previously + * allocated index 'idx'. + * 'o' can be NULL, in which case nothing is done. + * if 'o' was non-NULL, and the function succeeds, 'o' is returned. + * if 'o' was non-NULL, and the function fails, 'o' is released and + * NULL returned. This simplifies error checking at the call site since + * a single test for NULL for the function result is enough. + */ +static PyObject * +r_ref_insert(PyObject *o, Py_ssize_t idx, int flag, RFILE *p) +{ + if (o != NULL && flag) { /* currently only FLAG_REF is defined */ + PyObject *tmp = PyList_GET_ITEM(p->refs, idx); + Py_INCREF(o); + PyList_SET_ITEM(p->refs, idx, o); + Py_DECREF(tmp); + } + return o; +} + +/* combination of both above, used when an object can be + * created whenever it is seen in the file, as opposed to + * after having loaded its sub-objects. + */ +static PyObject * +r_ref(PyObject *o, int flag, RFILE *p) +{ + assert(flag & FLAG_REF); + if (o == NULL) + return NULL; + if (PyList_Append(p->refs, o) < 0) { + Py_DECREF(o); /* release the new object */ + return NULL; + } + return o; +} static PyObject * r_object(RFILE *p) @@ -674,9 +843,17 @@ r_object(RFILE *p) /* NULL is a valid return value, it does not necessarily means that an exception is set. */ PyObject *v, *v2; + Py_ssize_t idx = 0; long i, n; - int type = r_byte(p); - PyObject *retval; + int type, code = r_byte(p); + int flag, is_interned = 0; + PyObject *retval = NULL; + + if (code == EOF) { + PyErr_SetString(PyExc_EOFError, + "EOF read where object expected"); + return NULL; + } p->depth++; @@ -686,16 +863,17 @@ r_object(RFILE *p) return NULL; } - switch (type) { + flag = code & FLAG_REF; + type = code & ~FLAG_REF; - case EOF: - PyErr_SetString(PyExc_EOFError, - "EOF read where object expected"); - retval = NULL; - break; +#define R_REF(O) do{\ + if (flag) \ + O = r_ref(O, flag, p);\ +} while (0) + + switch (type) { case TYPE_NULL: - retval = NULL; break; case TYPE_NONE: @@ -726,67 +904,66 @@ r_object(RFILE *p) case TYPE_INT: n = r_long(p); retval = PyErr_Occurred() ? NULL : PyLong_FromLong(n); - break; - - case TYPE_INT64: - retval = r_long64(p); + R_REF(retval); break; case TYPE_LONG: retval = r_PyLong(p); + R_REF(retval); break; case TYPE_FLOAT: { - char buf[256]; + char buf[256], *ptr; double dx; - retval = NULL; n = r_byte(p); if (n == EOF) { PyErr_SetString(PyExc_EOFError, "EOF read where object expected"); break; } - if (r_string(buf, n, p) != n) + ptr = r_string(n, p); + if (ptr == NULL) break; + memcpy(buf, ptr, n); buf[n] = '\0'; dx = PyOS_string_to_double(buf, NULL, NULL); if (dx == -1.0 && PyErr_Occurred()) break; retval = PyFloat_FromDouble(dx); + R_REF(retval); break; } case TYPE_BINARY_FLOAT: { - unsigned char buf[8]; + unsigned char *buf; double x; - if (r_string((char*)buf, 8, p) != 8) { - retval = NULL; + buf = (unsigned char *) r_string(8, p); + if (buf == NULL) break; - } x = _PyFloat_Unpack8(buf, 1); - if (x == -1.0 && PyErr_Occurred()) { - retval = NULL; + if (x == -1.0 && PyErr_Occurred()) break; - } retval = PyFloat_FromDouble(x); + R_REF(retval); break; } case TYPE_COMPLEX: { - char buf[256]; + char buf[256], *ptr; Py_complex c; - retval = NULL; n = r_byte(p); if (n == EOF) { PyErr_SetString(PyExc_EOFError, "EOF read where object expected"); break; } - if (r_string(buf, n, p) != n) + ptr = r_string(n, p); + if (ptr == NULL) break; + memcpy(buf, ptr, n); buf[n] = '\0'; c.real = PyOS_string_to_double(buf, NULL, NULL); if (c.real == -1.0 && PyErr_Occurred()) @@ -797,112 +974,151 @@ r_object(RFILE *p) "EOF read where object expected"); break; } - if (r_string(buf, n, p) != n) + ptr = r_string(n, p); + if (ptr == NULL) break; + memcpy(buf, ptr, n); buf[n] = '\0'; c.imag = PyOS_string_to_double(buf, NULL, NULL); if (c.imag == -1.0 && PyErr_Occurred()) break; retval = PyComplex_FromCComplex(c); + R_REF(retval); break; } case TYPE_BINARY_COMPLEX: { - unsigned char buf[8]; + unsigned char *buf; Py_complex c; - if (r_string((char*)buf, 8, p) != 8) { - retval = NULL; + buf = (unsigned char *) r_string(8, p); + if (buf == NULL) break; - } c.real = _PyFloat_Unpack8(buf, 1); - if (c.real == -1.0 && PyErr_Occurred()) { - retval = NULL; + if (c.real == -1.0 && PyErr_Occurred()) break; - } - if (r_string((char*)buf, 8, p) != 8) { - retval = NULL; + buf = (unsigned char *) r_string(8, p); + if (buf == NULL) break; - } c.imag = _PyFloat_Unpack8(buf, 1); - if (c.imag == -1.0 && PyErr_Occurred()) { - retval = NULL; + if (c.imag == -1.0 && PyErr_Occurred()) break; - } retval = PyComplex_FromCComplex(c); + R_REF(retval); break; } case TYPE_STRING: - n = r_long(p); - if (PyErr_Occurred()) { - retval = NULL; + { + char *ptr; + n = r_long(p); + if (PyErr_Occurred()) + break; + if (n < 0 || n > SIZE32_MAX) { + PyErr_SetString(PyExc_ValueError, "bad marshal data (string size out of range)"); + break; + } + v = PyBytes_FromStringAndSize((char *)NULL, n); + if (v == NULL) + break; + ptr = r_string(n, p); + if (ptr == NULL) { + Py_DECREF(v); + break; + } + memcpy(PyBytes_AS_STRING(v), ptr, n); + retval = v; + R_REF(retval); break; } + + case TYPE_ASCII_INTERNED: + is_interned = 1; + case TYPE_ASCII: + n = r_long(p); + if (PyErr_Occurred()) + break; if (n < 0 || n > SIZE32_MAX) { - PyErr_SetString(PyExc_ValueError, "bad marshal data (string size out of range)"); - retval = NULL; + PyErr_SetString(PyExc_ValueError, "bad marshal data (unicode size out of range)"); break; } - v = PyBytes_FromStringAndSize((char *)NULL, n); - if (v == NULL) { - retval = NULL; + goto _read_ascii; + + case TYPE_SHORT_ASCII_INTERNED: + is_interned = 1; + case TYPE_SHORT_ASCII: + n = r_byte(p); + if (n == EOF) { + PyErr_SetString(PyExc_EOFError, + "EOF read where object expected"); break; } - if (r_string(PyBytes_AS_STRING(v), n, p) != n) { - Py_DECREF(v); - retval = NULL; + _read_ascii: + { + char *ptr; + ptr = r_string(n, p); + if (ptr == NULL) + break; + v = PyUnicode_FromKindAndData(PyUnicode_1BYTE_KIND, ptr, n); + if (v == NULL) + break; + if (is_interned) + PyUnicode_InternInPlace(&v); + retval = v; + R_REF(retval); break; } - retval = v; - break; + case TYPE_INTERNED: + is_interned = 1; case TYPE_UNICODE: { char *buffer; n = r_long(p); - if (PyErr_Occurred()) { - retval = NULL; + if (PyErr_Occurred()) break; - } if (n < 0 || n > SIZE32_MAX) { PyErr_SetString(PyExc_ValueError, "bad marshal data (unicode size out of range)"); - retval = NULL; break; } - buffer = PyMem_NEW(char, n); - if (buffer == NULL) { - retval = PyErr_NoMemory(); - break; + if (n != 0) { + buffer = r_string(n, p); + if (buffer == NULL) + break; + v = PyUnicode_DecodeUTF8(buffer, n, "surrogatepass"); } - if (r_string(buffer, n, p) != n) { - PyMem_DEL(buffer); - retval = NULL; - break; + else { + v = PyUnicode_New(0, 0); } - v = PyUnicode_DecodeUTF8(buffer, n, "surrogatepass"); - PyMem_DEL(buffer); + if (v == NULL) + break; + if (is_interned) + PyUnicode_InternInPlace(&v); retval = v; + R_REF(retval); break; } + case TYPE_SMALL_TUPLE: + n = (unsigned char) r_byte(p); + if (PyErr_Occurred()) + break; + goto _read_tuple; case TYPE_TUPLE: n = r_long(p); - if (PyErr_Occurred()) { - retval = NULL; + if (PyErr_Occurred()) break; - } if (n < 0 || n > SIZE32_MAX) { PyErr_SetString(PyExc_ValueError, "bad marshal data (tuple size out of range)"); - retval = NULL; break; } + _read_tuple: v = PyTuple_New(n); - if (v == NULL) { - retval = NULL; + R_REF(v); + if (v == NULL) break; - } + for (i = 0; i < n; i++) { v2 = r_object(p); if ( v2 == NULL ) { @@ -920,20 +1136,16 @@ r_object(RFILE *p) case TYPE_LIST: n = r_long(p); - if (PyErr_Occurred()) { - retval = NULL; + if (PyErr_Occurred()) break; - } if (n < 0 || n > SIZE32_MAX) { PyErr_SetString(PyExc_ValueError, "bad marshal data (list size out of range)"); - retval = NULL; break; } v = PyList_New(n); - if (v == NULL) { - retval = NULL; + R_REF(v); + if (v == NULL) break; - } for (i = 0; i < n; i++) { v2 = r_object(p); if ( v2 == NULL ) { @@ -951,20 +1163,26 @@ r_object(RFILE *p) case TYPE_DICT: v = PyDict_New(); - if (v == NULL) { - retval = NULL; + R_REF(v); + if (v == NULL) break; - } for (;;) { PyObject *key, *val; key = r_object(p); if (key == NULL) break; val = r_object(p); - if (val != NULL) - PyDict_SetItem(v, key, val); + if (val == NULL) { + Py_DECREF(key); + break; + } + if (PyDict_SetItem(v, key, val) < 0) { + Py_DECREF(key); + Py_DECREF(val); + break; + } Py_DECREF(key); - Py_XDECREF(val); + Py_DECREF(val); } if (PyErr_Occurred()) { Py_DECREF(v); @@ -976,20 +1194,26 @@ r_object(RFILE *p) case TYPE_SET: case TYPE_FROZENSET: n = r_long(p); - if (PyErr_Occurred()) { - retval = NULL; + if (PyErr_Occurred()) break; - } if (n < 0 || n > SIZE32_MAX) { PyErr_SetString(PyExc_ValueError, "bad marshal data (set size out of range)"); - retval = NULL; break; } v = (type == TYPE_SET) ? PySet_New(NULL) : PyFrozenSet_New(NULL); - if (v == NULL) { - retval = NULL; - break; + if (type == TYPE_SET) { + R_REF(v); + } else { + /* must use delayed registration of frozensets because they must + * be init with a refcount of 1 + */ + idx = r_ref_reserve(flag, p); + if (idx < 0) + Py_CLEAR(v); /* signal error */ } + if (v == NULL) + break; + for (i = 0; i < n; i++) { v2 = r_object(p); if ( v2 == NULL ) { @@ -1008,6 +1232,8 @@ r_object(RFILE *p) } Py_DECREF(v2); } + if (type != TYPE_SET) + v = r_ref_insert(v, idx, flag, p); retval = v; break; @@ -1029,6 +1255,10 @@ r_object(RFILE *p) int firstlineno; PyObject *lnotab = NULL; + idx = r_ref_reserve(flag, p); + if (idx < 0) + break; + v = NULL; /* XXX ignore long->int overflows for now */ @@ -1084,6 +1314,8 @@ r_object(RFILE *p) if (name == NULL) goto code_error; firstlineno = (int)r_long(p); + if (firstlineno == -1 && PyErr_Occurred()) + break; lnotab = r_object(p); if (lnotab == NULL) goto code_error; @@ -1094,6 +1326,7 @@ r_object(RFILE *p) code, consts, names, varnames, freevars, cellvars, filename, name, firstlineno, lnotab); + v = r_ref_insert(v, idx, flag, p); code_error: Py_XDECREF(code); @@ -1109,11 +1342,27 @@ r_object(RFILE *p) retval = v; break; + case TYPE_REF: + n = r_long(p); + if (n < 0 || n >= PyList_GET_SIZE(p->refs)) { + if (n == -1 && PyErr_Occurred()) + break; + PyErr_SetString(PyExc_ValueError, "bad marshal data (invalid reference)"); + break; + } + v = PyList_GET_ITEM(p->refs, n); + if (v == Py_None) { + PyErr_SetString(PyExc_ValueError, "bad marshal data (invalid reference)"); + break; + } + Py_INCREF(v); + retval = v; + break; + default: /* Bogus data got written, which isn't ideal. This will let you keep working and recover. */ PyErr_SetString(PyExc_ValueError, "bad marshal data (unknown type code)"); - retval = NULL; break; } @@ -1139,23 +1388,33 @@ int PyMarshal_ReadShortFromFile(FILE *fp) { RFILE rf; + int res; assert(fp); rf.readable = NULL; rf.fp = fp; rf.current_filename = NULL; rf.end = rf.ptr = NULL; - return r_short(&rf); + rf.buf = NULL; + res = r_short(&rf); + if (rf.buf != NULL) + PyMem_FREE(rf.buf); + return res; } long PyMarshal_ReadLongFromFile(FILE *fp) { RFILE rf; + long res; rf.fp = fp; rf.readable = NULL; rf.current_filename = NULL; rf.ptr = rf.end = NULL; - return r_long(&rf); + rf.buf = NULL; + res = r_long(&rf); + if (rf.buf != NULL) + PyMem_FREE(rf.buf); + return res; } #ifdef HAVE_FSTAT @@ -1214,22 +1473,36 @@ PyMarshal_ReadObjectFromFile(FILE *fp) rf.current_filename = NULL; rf.depth = 0; rf.ptr = rf.end = NULL; + rf.buf = NULL; + rf.refs = PyList_New(0); + if (rf.refs == NULL) + return NULL; result = r_object(&rf); + Py_DECREF(rf.refs); + if (rf.buf != NULL) + PyMem_FREE(rf.buf); return result; } PyObject * -PyMarshal_ReadObjectFromString(char *str, Py_ssize_t len) +PyMarshal_ReadObjectFromString(const char *str, Py_ssize_t len) { RFILE rf; PyObject *result; rf.fp = NULL; rf.readable = NULL; rf.current_filename = NULL; - rf.ptr = str; - rf.end = str + len; + rf.ptr = (char *)str; + rf.end = (char *)str + len; + rf.buf = NULL; rf.depth = 0; + rf.refs = PyList_New(0); + if (rf.refs == NULL) + return NULL; result = r_object(&rf); + Py_DECREF(rf.refs); + if (rf.buf != NULL) + PyMem_FREE(rf.buf); return result; } @@ -1248,7 +1521,15 @@ PyMarshal_WriteObjectToString(PyObject *x, int version) wf.error = WFERR_OK; wf.depth = 0; wf.version = version; + if (version >= 3) { + if ((wf.refs = PyDict_New()) == NULL) { + Py_DECREF(wf.str); + return NULL; + } + } else + wf.refs = NULL; w_object(x, &wf); + Py_XDECREF(wf.refs); if (wf.str != NULL) { char *base = PyBytes_AS_STRING((PyBytesObject *)wf.str); if (wf.ptr - base > PY_SSIZE_T_MAX) { @@ -1320,6 +1601,8 @@ marshal_load(PyObject *self, PyObject *f) * Make a call to the read method, but read zero bytes. * This is to ensure that the object passed in at least * has a read method which returns bytes. + * This can be removed if we guarantee good error handling + * for r_string() */ data = _PyObject_CallMethodId(f, &PyId_read, "i", 0); if (data == NULL) @@ -1335,7 +1618,15 @@ marshal_load(PyObject *self, PyObject *f) rf.fp = NULL; rf.readable = f; rf.current_filename = NULL; - result = read_object(&rf); + rf.ptr = rf.end = NULL; + rf.buf = NULL; + if ((rf.refs = PyList_New(0)) != NULL) { + result = read_object(&rf); + Py_DECREF(rf.refs); + if (rf.buf != NULL) + PyMem_FREE(rf.buf); + } else + result = NULL; } Py_DECREF(data); return result; @@ -1392,8 +1683,11 @@ marshal_loads(PyObject *self, PyObject *args) rf.ptr = s; rf.end = s + n; rf.depth = 0; + if ((rf.refs = PyList_New(0)) == NULL) + return NULL; result = read_object(&rf); PyBuffer_Release(&p); + Py_DECREF(rf.refs); return result; } @@ -1433,6 +1727,7 @@ Variables:\n\ version -- indicates the format that the module uses. Version 0 is the\n\ historical format, version 1 shares interned strings and version 2\n\ uses a binary format for floating point numbers.\n\ + Version 3 shares common object references (New in version 3.4).\n\ \n\ Functions:\n\ \n\ diff --git a/Python/modsupport.c b/Python/modsupport.c index 428914f..6c938dd 100644 --- a/Python/modsupport.c +++ b/Python/modsupport.c @@ -161,7 +161,17 @@ do_mktuple(const char **p_format, va_list *p_va, int endchar, int n, int flags) /* Note that we can't bail immediately on error as this will leak refcounts on any 'N' arguments. */ for (i = 0; i < n; i++) { - PyObject *w = do_mkvalue(p_format, p_va, flags); + PyObject *w; + + if (itemfailed) { + PyObject *exception, *value, *tb; + PyErr_Fetch(&exception, &value, &tb); + w = do_mkvalue(p_format, p_va, flags); + PyErr_Restore(exception, value, tb); + } + else { + w = do_mkvalue(p_format, p_va, flags); + } if (w == NULL) { itemfailed = 1; Py_INCREF(Py_None); diff --git a/Python/mystrtoul.c b/Python/mystrtoul.c index 8a54cbf..98429d4 100644 --- a/Python/mystrtoul.c +++ b/Python/mystrtoul.c @@ -92,11 +92,11 @@ static int digitlimit[] = { ** exceptions - we don't check for them. */ unsigned long -PyOS_strtoul(register char *str, char **ptr, int base) +PyOS_strtoul(const char *str, char **ptr, int base) { - register unsigned long result = 0; /* return value of the function */ - register int c; /* current input character */ - register int ovlimit; /* required digits to overflow */ + unsigned long result = 0; /* return value of the function */ + int c; /* current input character */ + int ovlimit; /* required digits to overflow */ /* skip leading white space */ while (*str && Py_ISSPACE(Py_CHARMASK(*str))) @@ -111,7 +111,7 @@ PyOS_strtoul(register char *str, char **ptr, int base) /* there must be at least one digit after 0x */ if (_PyLong_DigitValue[Py_CHARMASK(str[1])] >= 16) { if (ptr) - *ptr = str; + *ptr = (char *)str; return 0; } ++str; @@ -120,7 +120,7 @@ PyOS_strtoul(register char *str, char **ptr, int base) /* there must be at least one digit after 0o */ if (_PyLong_DigitValue[Py_CHARMASK(str[1])] >= 8) { if (ptr) - *ptr = str; + *ptr = (char *)str; return 0; } ++str; @@ -129,7 +129,7 @@ PyOS_strtoul(register char *str, char **ptr, int base) /* there must be at least one digit after 0b */ if (_PyLong_DigitValue[Py_CHARMASK(str[1])] >= 2) { if (ptr) - *ptr = str; + *ptr = (char *)str; return 0; } ++str; @@ -141,7 +141,7 @@ PyOS_strtoul(register char *str, char **ptr, int base) while (Py_ISSPACE(Py_CHARMASK(*str))) ++str; if (ptr) - *ptr = str; + *ptr = (char *)str; return 0; } } @@ -157,7 +157,7 @@ PyOS_strtoul(register char *str, char **ptr, int base) /* there must be at least one digit after 0x */ if (_PyLong_DigitValue[Py_CHARMASK(str[1])] >= 16) { if (ptr) - *ptr = str; + *ptr = (char *)str; return 0; } ++str; @@ -171,7 +171,7 @@ PyOS_strtoul(register char *str, char **ptr, int base) /* there must be at least one digit after 0o */ if (_PyLong_DigitValue[Py_CHARMASK(str[1])] >= 8) { if (ptr) - *ptr = str; + *ptr = (char *)str; return 0; } ++str; @@ -185,7 +185,7 @@ PyOS_strtoul(register char *str, char **ptr, int base) /* there must be at least one digit after 0b */ if (_PyLong_DigitValue[Py_CHARMASK(str[1])] >= 2) { if (ptr) - *ptr = str; + *ptr = (char *)str; return 0; } ++str; @@ -197,7 +197,7 @@ PyOS_strtoul(register char *str, char **ptr, int base) /* catch silly bases */ if (base < 2 || base > 36) { if (ptr) - *ptr = str; + *ptr = (char *)str; return 0; } @@ -213,7 +213,7 @@ PyOS_strtoul(register char *str, char **ptr, int base) if (ovlimit > 0) /* no overflow check required */ result = result * base + c; else { /* requires overflow check */ - register unsigned long temp_result; + unsigned long temp_result; if (ovlimit < 0) /* guaranteed overflow */ goto overflowed; @@ -239,7 +239,7 @@ PyOS_strtoul(register char *str, char **ptr, int base) /* set pointer to point to the last character scanned */ if (ptr) - *ptr = str; + *ptr = (char *)str; return result; @@ -248,7 +248,7 @@ overflowed: /* spool through remaining digit characters */ while (_PyLong_DigitValue[Py_CHARMASK(*str)] < base) ++str; - *ptr = str; + *ptr = (char *)str; } errno = ERANGE; return (unsigned long)-1; @@ -260,7 +260,7 @@ overflowed: #define PY_ABS_LONG_MIN (0-(unsigned long)LONG_MIN) long -PyOS_strtol(char *str, char **ptr, int base) +PyOS_strtol(const char *str, char **ptr, int base) { long result; unsigned long uresult; diff --git a/Python/opcode_targets.h b/Python/opcode_targets.h index 2d6bcda..f90a17a 100644 --- a/Python/opcode_targets.h +++ b/Python/opcode_targets.h @@ -68,7 +68,7 @@ static void *opcode_targets[256] = { &&TARGET_BINARY_OR, &&TARGET_INPLACE_POWER, &&TARGET_GET_ITER, - &&TARGET_STORE_LOCALS, + &&_unknown_opcode, &&TARGET_PRINT_EXPR, &&TARGET_LOAD_BUILD_CLASS, &&TARGET_YIELD_FROM, @@ -147,7 +147,7 @@ static void *opcode_targets[256] = { &&TARGET_LIST_APPEND, &&TARGET_SET_ADD, &&TARGET_MAP_ADD, - &&_unknown_opcode, + &&TARGET_LOAD_CLASSDEREF, &&_unknown_opcode, &&_unknown_opcode, &&_unknown_opcode, diff --git a/Python/peephole.c b/Python/peephole.c index 5d53677..c56c8fc 100644 --- a/Python/peephole.c +++ b/Python/peephole.c @@ -275,6 +275,7 @@ fold_unaryops_on_constants(unsigned char *codestr, PyObject *consts, PyObject *v len_consts = PyList_GET_SIZE(consts); if (PyList_Append(consts, newconst)) { Py_DECREF(newconst); + PyErr_Clear(); return 0; } Py_DECREF(newconst); @@ -289,7 +290,7 @@ fold_unaryops_on_constants(unsigned char *codestr, PyObject *consts, PyObject *v static unsigned int * markblocks(unsigned char *code, Py_ssize_t len) { - unsigned int *blocks = (unsigned int *)PyMem_Malloc(len*sizeof(int)); + unsigned int *blocks = PyMem_New(unsigned int, len); int i,j, opcode, blockcnt = 0; if (blocks == NULL) { @@ -327,37 +328,6 @@ markblocks(unsigned char *code, Py_ssize_t len) return blocks; } -/* Helper to replace LOAD_NAME None/True/False with LOAD_CONST - Returns: 0 if no change, 1 if change, -1 if error */ -static int -load_global(unsigned char *codestr, Py_ssize_t i, char *name, PyObject *consts) -{ - Py_ssize_t j; - PyObject *obj; - if (name == NULL) - return 0; - if (strcmp(name, "None") == 0) - obj = Py_None; - else if (strcmp(name, "True") == 0) - obj = Py_True; - else if (strcmp(name, "False") == 0) - obj = Py_False; - else - return 0; - for (j = 0; j < PyList_GET_SIZE(consts); j++) { - if (PyList_GET_ITEM(consts, j) == obj) - break; - } - if (j == PyList_GET_SIZE(consts)) { - if (PyList_Append(consts, obj) < 0) - return -1; - } - assert(PyList_GET_ITEM(consts, j) == obj); - codestr[i] = LOAD_CONST; - SETARG(codestr, i, j); - return 1; -} - /* Perform basic peephole optimizations to components of a code object. The consts object should still be in list form to allow new constants to be appended. @@ -392,7 +362,6 @@ PyCode_Optimize(PyObject *code, PyObject* consts, PyObject *names, Py_ssize_t const_stack_size = 0; int in_consts = 0; /* whether we are in a LOAD_CONST sequence */ unsigned int *blocks = NULL; - char *name; /* Bail out if an exception is set */ if (PyErr_Occurred()) @@ -413,8 +382,10 @@ PyCode_Optimize(PyObject *code, PyObject* consts, PyObject *names, /* Make a modifiable copy of the code string */ codestr = (unsigned char *)PyMem_Malloc(codelen); - if (codestr == NULL) + if (codestr == NULL) { + PyErr_NoMemory(); goto exitError; + } codestr = (unsigned char *)memcpy(codestr, PyBytes_AS_STRING(code), codelen); @@ -427,9 +398,11 @@ PyCode_Optimize(PyObject *code, PyObject* consts, PyObject *names, goto exitUnchanged; /* Mapping to new jump targets after NOPs are removed */ - addrmap = (int *)PyMem_Malloc(codelen * sizeof(int)); - if (addrmap == NULL) + addrmap = PyMem_New(int, codelen); + if (addrmap == NULL) { + PyErr_NoMemory(); goto exitError; + } blocks = markblocks(codestr, codelen); if (blocks == NULL) @@ -475,20 +448,6 @@ PyCode_Optimize(PyObject *code, PyObject* consts, PyObject *names, codestr[i+3] = NOP; break; - /* Replace LOAD_GLOBAL/LOAD_NAME None/True/False - with LOAD_CONST None/True/False */ - case LOAD_NAME: - case LOAD_GLOBAL: - j = GETARG(codestr, i); - name = _PyUnicode_AsString(PyTuple_GET_ITEM(names, j)); - h = load_global(codestr, i, name, consts); - if (h < 0) - goto exitError; - else if (h == 0) - continue; - CONST_STACK_PUSH_OP(i); - break; - /* Skip over LOAD_CONST trueconst POP_JUMP_IF_FALSE xx. This improves "while 1" performance. */ diff --git a/Python/pyarena.c b/Python/pyarena.c index 02a31d8..103603f 100644 --- a/Python/pyarena.c +++ b/Python/pyarena.c @@ -77,7 +77,7 @@ block_new(size_t size) { /* Allocate header and block as one unit. ab_mem points just past header. */ - block *b = (block *)malloc(sizeof(block) + size); + block *b = (block *)PyMem_Malloc(sizeof(block) + size); if (!b) return NULL; b->ab_size = size; @@ -92,7 +92,7 @@ static void block_free(block *b) { while (b) { block *next = b->ab_next; - free(b); + PyMem_Free(b); b = next; } } @@ -127,20 +127,20 @@ block_alloc(block *b, size_t size) PyArena * PyArena_New() { - PyArena* arena = (PyArena *)malloc(sizeof(PyArena)); + PyArena* arena = (PyArena *)PyMem_Malloc(sizeof(PyArena)); if (!arena) return (PyArena*)PyErr_NoMemory(); arena->a_head = block_new(DEFAULT_BLOCK_SIZE); arena->a_cur = arena->a_head; if (!arena->a_head) { - free((void *)arena); + PyMem_Free((void *)arena); return (PyArena*)PyErr_NoMemory(); } arena->a_objects = PyList_New(0); if (!arena->a_objects) { block_free(arena->a_head); - free((void *)arena); + PyMem_Free((void *)arena); return (PyArena*)PyErr_NoMemory(); } #if defined(Py_DEBUG) @@ -173,7 +173,7 @@ PyArena_Free(PyArena *arena) */ Py_DECREF(arena->a_objects); - free(arena); + PyMem_Free(arena); } void * diff --git a/Python/pyhash.c b/Python/pyhash.c new file mode 100644 index 0000000..97cb547 --- /dev/null +++ b/Python/pyhash.c @@ -0,0 +1,427 @@ +/* Set of hash utility functions to help maintaining the invariant that + if a==b then hash(a)==hash(b) + + All the utility functions (_Py_Hash*()) return "-1" to signify an error. +*/ +#include "Python.h" + +#ifdef __APPLE__ +# include <libkern/OSByteOrder.h> +#elif defined(HAVE_LE64TOH) && defined(HAVE_ENDIAN_H) +# include <endian.h> +#elif defined(HAVE_LE64TOH) && defined(HAVE_SYS_ENDIAN_H) +# include <sys/endian.h> +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +_Py_HashSecret_t _Py_HashSecret; + +#if Py_HASH_ALGORITHM == Py_HASH_EXTERNAL +extern PyHash_FuncDef PyHash_Func; +#else +static PyHash_FuncDef PyHash_Func; +#endif + +/* Count _Py_HashBytes() calls */ +#ifdef Py_HASH_STATS +#define Py_HASH_STATS_MAX 32 +static Py_ssize_t hashstats[Py_HASH_STATS_MAX + 1] = {0}; +#endif + +/* For numeric types, the hash of a number x is based on the reduction + of x modulo the prime P = 2**_PyHASH_BITS - 1. It's designed so that + hash(x) == hash(y) whenever x and y are numerically equal, even if + x and y have different types. + + A quick summary of the hashing strategy: + + (1) First define the 'reduction of x modulo P' for any rational + number x; this is a standard extension of the usual notion of + reduction modulo P for integers. If x == p/q (written in lowest + terms), the reduction is interpreted as the reduction of p times + the inverse of the reduction of q, all modulo P; if q is exactly + divisible by P then define the reduction to be infinity. So we've + got a well-defined map + + reduce : { rational numbers } -> { 0, 1, 2, ..., P-1, infinity }. + + (2) Now for a rational number x, define hash(x) by: + + reduce(x) if x >= 0 + -reduce(-x) if x < 0 + + If the result of the reduction is infinity (this is impossible for + integers, floats and Decimals) then use the predefined hash value + _PyHASH_INF for x >= 0, or -_PyHASH_INF for x < 0, instead. + _PyHASH_INF, -_PyHASH_INF and _PyHASH_NAN are also used for the + hashes of float and Decimal infinities and nans. + + A selling point for the above strategy is that it makes it possible + to compute hashes of decimal and binary floating-point numbers + efficiently, even if the exponent of the binary or decimal number + is large. The key point is that + + reduce(x * y) == reduce(x) * reduce(y) (modulo _PyHASH_MODULUS) + + provided that {reduce(x), reduce(y)} != {0, infinity}. The reduction of a + binary or decimal float is never infinity, since the denominator is a power + of 2 (for binary) or a divisor of a power of 10 (for decimal). So we have, + for nonnegative x, + + reduce(x * 2**e) == reduce(x) * reduce(2**e) % _PyHASH_MODULUS + + reduce(x * 10**e) == reduce(x) * reduce(10**e) % _PyHASH_MODULUS + + and reduce(10**e) can be computed efficiently by the usual modular + exponentiation algorithm. For reduce(2**e) it's even better: since + P is of the form 2**n-1, reduce(2**e) is 2**(e mod n), and multiplication + by 2**(e mod n) modulo 2**n-1 just amounts to a rotation of bits. + + */ + +Py_hash_t +_Py_HashDouble(double v) +{ + int e, sign; + double m; + Py_uhash_t x, y; + + if (!Py_IS_FINITE(v)) { + if (Py_IS_INFINITY(v)) + return v > 0 ? _PyHASH_INF : -_PyHASH_INF; + else + return _PyHASH_NAN; + } + + m = frexp(v, &e); + + sign = 1; + if (m < 0) { + sign = -1; + m = -m; + } + + /* process 28 bits at a time; this should work well both for binary + and hexadecimal floating point. */ + x = 0; + while (m) { + x = ((x << 28) & _PyHASH_MODULUS) | x >> (_PyHASH_BITS - 28); + m *= 268435456.0; /* 2**28 */ + e -= 28; + y = (Py_uhash_t)m; /* pull out integer part */ + m -= y; + x += y; + if (x >= _PyHASH_MODULUS) + x -= _PyHASH_MODULUS; + } + + /* adjust for the exponent; first reduce it modulo _PyHASH_BITS */ + e = e >= 0 ? e % _PyHASH_BITS : _PyHASH_BITS-1-((-1-e) % _PyHASH_BITS); + x = ((x << e) & _PyHASH_MODULUS) | x >> (_PyHASH_BITS - e); + + x = x * sign; + if (x == (Py_uhash_t)-1) + x = (Py_uhash_t)-2; + return (Py_hash_t)x; +} + +Py_hash_t +_Py_HashPointer(void *p) +{ + Py_hash_t x; + size_t y = (size_t)p; + /* bottom 3 or 4 bits are likely to be 0; rotate y by 4 to avoid + excessive hash collisions for dicts and sets */ + y = (y >> 4) | (y << (8 * SIZEOF_VOID_P - 4)); + x = (Py_hash_t)y; + if (x == -1) + x = -2; + return x; +} + +Py_hash_t +_Py_HashBytes(const void *src, Py_ssize_t len) +{ + Py_hash_t x; + /* + We make the hash of the empty string be 0, rather than using + (prefix ^ suffix), since this slightly obfuscates the hash secret + */ + if (len == 0) { + return 0; + } + +#ifdef Py_HASH_STATS + hashstats[(len <= Py_HASH_STATS_MAX) ? len : 0]++; +#endif + +#if Py_HASH_CUTOFF > 0 + if (len < Py_HASH_CUTOFF) { + /* Optimize hashing of very small strings with inline DJBX33A. */ + Py_uhash_t hash; + const unsigned char *p = src; + hash = 5381; /* DJBX33A starts with 5381 */ + + switch(len) { + /* ((hash << 5) + hash) + *p == hash * 33 + *p */ + case 7: hash = ((hash << 5) + hash) + *p++; /* fallthrough */ + case 6: hash = ((hash << 5) + hash) + *p++; /* fallthrough */ + case 5: hash = ((hash << 5) + hash) + *p++; /* fallthrough */ + case 4: hash = ((hash << 5) + hash) + *p++; /* fallthrough */ + case 3: hash = ((hash << 5) + hash) + *p++; /* fallthrough */ + case 2: hash = ((hash << 5) + hash) + *p++; /* fallthrough */ + case 1: hash = ((hash << 5) + hash) + *p++; break; + default: + assert(0); + } + hash ^= len; + hash ^= (Py_uhash_t) _Py_HashSecret.djbx33a.suffix; + x = (Py_hash_t)hash; + } + else +#endif /* Py_HASH_CUTOFF */ + x = PyHash_Func.hash(src, len); + + if (x == -1) + return -2; + return x; +} + +void +_PyHash_Fini(void) +{ +#ifdef Py_HASH_STATS + int i; + Py_ssize_t total = 0; + char *fmt = "%2i %8" PY_FORMAT_SIZE_T "d %8" PY_FORMAT_SIZE_T "d\n"; + + fprintf(stderr, "len calls total\n"); + for (i = 1; i <= Py_HASH_STATS_MAX; i++) { + total += hashstats[i]; + fprintf(stderr, fmt, i, hashstats[i], total); + } + total += hashstats[0]; + fprintf(stderr, "> %8" PY_FORMAT_SIZE_T "d %8" PY_FORMAT_SIZE_T "d\n", + hashstats[0], total); +#endif +} + +PyHash_FuncDef * +PyHash_GetFuncDef(void) +{ + return &PyHash_Func; +} + +/* Optimized memcpy() for Windows */ +#ifdef _MSC_VER +# if SIZEOF_PY_UHASH_T == 4 +# define PY_UHASH_CPY(dst, src) do { \ + dst[0] = src[0]; dst[1] = src[1]; dst[2] = src[2]; dst[3] = src[3]; \ + } while(0) +# elif SIZEOF_PY_UHASH_T == 8 +# define PY_UHASH_CPY(dst, src) do { \ + dst[0] = src[0]; dst[1] = src[1]; dst[2] = src[2]; dst[3] = src[3]; \ + dst[4] = src[4]; dst[5] = src[5]; dst[6] = src[6]; dst[7] = src[7]; \ + } while(0) +# else +# error SIZEOF_PY_UHASH_T must be 4 or 8 +# endif /* SIZEOF_PY_UHASH_T */ +#else /* not Windows */ +# define PY_UHASH_CPY(dst, src) memcpy(dst, src, SIZEOF_PY_UHASH_T) +#endif /* _MSC_VER */ + + +#if Py_HASH_ALGORITHM == Py_HASH_FNV +/* ************************************************************************** + * Modified Fowler-Noll-Vo (FNV) hash function + */ +static Py_hash_t +fnv(const void *src, Py_ssize_t len) +{ + const unsigned char *p = src; + Py_uhash_t x; + Py_ssize_t remainder, blocks; + union { + Py_uhash_t value; + unsigned char bytes[SIZEOF_PY_UHASH_T]; + } block; + +#ifdef Py_DEBUG + assert(_Py_HashSecret_Initialized); +#endif + remainder = len % SIZEOF_PY_UHASH_T; + if (remainder == 0) { + /* Process at least one block byte by byte to reduce hash collisions + * for strings with common prefixes. */ + remainder = SIZEOF_PY_UHASH_T; + } + blocks = (len - remainder) / SIZEOF_PY_UHASH_T; + + x = (Py_uhash_t) _Py_HashSecret.fnv.prefix; + x ^= (Py_uhash_t) *p << 7; + while (blocks--) { + PY_UHASH_CPY(block.bytes, p); + x = (_PyHASH_MULTIPLIER * x) ^ block.value; + p += SIZEOF_PY_UHASH_T; + } + /* add remainder */ + for (; remainder > 0; remainder--) + x = (_PyHASH_MULTIPLIER * x) ^ (Py_uhash_t) *p++; + x ^= (Py_uhash_t) len; + x ^= (Py_uhash_t) _Py_HashSecret.fnv.suffix; + if (x == -1) { + x = -2; + } + return x; +} + +static PyHash_FuncDef PyHash_Func = {fnv, "fnv", 8 * SIZEOF_PY_HASH_T, + 16 * SIZEOF_PY_HASH_T}; + +#endif /* Py_HASH_ALGORITHM == Py_HASH_FNV */ + + +#if Py_HASH_ALGORITHM == Py_HASH_SIPHASH24 +/* ************************************************************************** + <MIT License> + Copyright (c) 2013 Marek Majkowski <marek@popcount.org> + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + THE SOFTWARE. + </MIT License> + + Original location: + https://github.com/majek/csiphash/ + + Solution inspired by code from: + Samuel Neves (supercop/crypto_auth/siphash24/little) + djb (supercop/crypto_auth/siphash24/little2) + Jean-Philippe Aumasson (https://131002.net/siphash/siphash24.c) + + Modified for Python by Christian Heimes: + - C89 / MSVC compatibility + - PY_UINT64_T, PY_UINT32_T and PY_UINT8_T + - _rotl64() on Windows + - letoh64() fallback +*/ + +typedef unsigned char PY_UINT8_T; + +/* byte swap little endian to host endian + * Endian conversion not only ensures that the hash function returns the same + * value on all platforms. It is also required to for a good dispersion of + * the hash values' least significant bits. + */ +#if PY_LITTLE_ENDIAN +# define _le64toh(x) ((PY_UINT64_T)(x)) +#elif defined(__APPLE__) +# define _le64toh(x) OSSwapLittleToHostInt64(x) +#elif defined(HAVE_LETOH64) +# define _le64toh(x) le64toh(x) +#else +# define _le64toh(x) (((PY_UINT64_T)(x) << 56) | \ + (((PY_UINT64_T)(x) << 40) & 0xff000000000000ULL) | \ + (((PY_UINT64_T)(x) << 24) & 0xff0000000000ULL) | \ + (((PY_UINT64_T)(x) << 8) & 0xff00000000ULL) | \ + (((PY_UINT64_T)(x) >> 8) & 0xff000000ULL) | \ + (((PY_UINT64_T)(x) >> 24) & 0xff0000ULL) | \ + (((PY_UINT64_T)(x) >> 40) & 0xff00ULL) | \ + ((PY_UINT64_T)(x) >> 56)) +#endif + + +#ifdef _MSC_VER +# define ROTATE(x, b) _rotl64(x, b) +#else +# define ROTATE(x, b) (PY_UINT64_T)( ((x) << (b)) | ( (x) >> (64 - (b))) ) +#endif + +#define HALF_ROUND(a,b,c,d,s,t) \ + a += b; c += d; \ + b = ROTATE(b, s) ^ a; \ + d = ROTATE(d, t) ^ c; \ + a = ROTATE(a, 32); + +#define DOUBLE_ROUND(v0,v1,v2,v3) \ + HALF_ROUND(v0,v1,v2,v3,13,16); \ + HALF_ROUND(v2,v1,v0,v3,17,21); \ + HALF_ROUND(v0,v1,v2,v3,13,16); \ + HALF_ROUND(v2,v1,v0,v3,17,21); + + +static Py_hash_t +siphash24(const void *src, Py_ssize_t src_sz) { + PY_UINT64_T k0 = _le64toh(_Py_HashSecret.siphash.k0); + PY_UINT64_T k1 = _le64toh(_Py_HashSecret.siphash.k1); + PY_UINT64_T b = (PY_UINT64_T)src_sz << 56; + const PY_UINT64_T *in = (PY_UINT64_T*)src; + + PY_UINT64_T v0 = k0 ^ 0x736f6d6570736575ULL; + PY_UINT64_T v1 = k1 ^ 0x646f72616e646f6dULL; + PY_UINT64_T v2 = k0 ^ 0x6c7967656e657261ULL; + PY_UINT64_T v3 = k1 ^ 0x7465646279746573ULL; + + PY_UINT64_T t; + PY_UINT8_T *pt; + PY_UINT8_T *m; + + while (src_sz >= 8) { + PY_UINT64_T mi = _le64toh(*in); + in += 1; + src_sz -= 8; + v3 ^= mi; + DOUBLE_ROUND(v0,v1,v2,v3); + v0 ^= mi; + } + + t = 0; + pt = (PY_UINT8_T *)&t; + m = (PY_UINT8_T *)in; + switch (src_sz) { + case 7: pt[6] = m[6]; + case 6: pt[5] = m[5]; + case 5: pt[4] = m[4]; + case 4: Py_MEMCPY(pt, m, sizeof(PY_UINT32_T)); break; + case 3: pt[2] = m[2]; + case 2: pt[1] = m[1]; + case 1: pt[0] = m[0]; + } + b |= _le64toh(t); + + v3 ^= b; + DOUBLE_ROUND(v0,v1,v2,v3); + v0 ^= b; + v2 ^= 0xff; + DOUBLE_ROUND(v0,v1,v2,v3); + DOUBLE_ROUND(v0,v1,v2,v3); + + /* modified */ + t = (v0 ^ v1) ^ (v2 ^ v3); + return (Py_hash_t)t; +} + +static PyHash_FuncDef PyHash_Func = {siphash24, "siphash24", 64, 128}; + +#endif /* Py_HASH_ALGORITHM == Py_HASH_SIPHASH24 */ + +#ifdef __cplusplus +} +#endif diff --git a/Python/pystate.c b/Python/pystate.c index 772aa53..2ac2fd5 100644 --- a/Python/pystate.c +++ b/Python/pystate.c @@ -6,11 +6,11 @@ /* -------------------------------------------------------------------------- CAUTION -Always use malloc() and free() directly in this file. A number of these -functions are advertised as safe to call when the GIL isn't held, and in -a debug build Python redirects (e.g.) PyMem_NEW (etc) to Python's debugging -obmalloc functions. Those aren't thread-safe (they rely on the GIL to avoid -the expense of doing their own locking). +Always use PyMem_RawMalloc() and PyMem_RawFree() directly in this file. A +number of these functions are advertised as safe to call when the GIL isn't +held, and in a debug build Python redirects (e.g.) PyMem_NEW (etc) to Python's +debugging obmalloc functions. Those aren't thread-safe (they rely on the GIL +to avoid the expense of doing their own locking). -------------------------------------------------------------------------- */ #ifdef HAVE_DLOPEN @@ -60,7 +60,7 @@ PyInterpreterState * PyInterpreterState_New(void) { PyInterpreterState *interp = (PyInterpreterState *) - malloc(sizeof(PyInterpreterState)); + PyMem_RawMalloc(sizeof(PyInterpreterState)); if (interp != NULL) { HEAD_INIT(); @@ -72,6 +72,7 @@ PyInterpreterState_New(void) interp->modules_by_index = NULL; interp->sysdict = NULL; interp->builtins = NULL; + interp->builtins_copy = NULL; interp->tstate_head = NULL; interp->codec_search_path = NULL; interp->codec_search_cache = NULL; @@ -115,6 +116,7 @@ PyInterpreterState_Clear(PyInterpreterState *interp) Py_CLEAR(interp->modules_by_index); Py_CLEAR(interp->sysdict); Py_CLEAR(interp->builtins); + Py_CLEAR(interp->builtins_copy); Py_CLEAR(interp->importlib); } @@ -148,7 +150,7 @@ PyInterpreterState_Delete(PyInterpreterState *interp) Py_FatalError("PyInterpreterState_Delete: remaining threads"); *p = interp->next; HEAD_UNLOCK(); - free(interp); + PyMem_RawFree(interp); #ifdef WITH_THREAD if (interp_head == NULL && head_mutex != NULL) { PyThread_free_lock(head_mutex); @@ -168,7 +170,7 @@ threadstate_getframe(PyThreadState *self) static PyThreadState * new_threadstate(PyInterpreterState *interp, int init) { - PyThreadState *tstate = (PyThreadState *)malloc(sizeof(PyThreadState)); + PyThreadState *tstate = (PyThreadState *)PyMem_RawMalloc(sizeof(PyThreadState)); if (_PyThreadState_GetFrame == NULL) _PyThreadState_GetFrame = threadstate_getframe; @@ -182,7 +184,6 @@ new_threadstate(PyInterpreterState *interp, int init) tstate->recursion_critical = 0; tstate->tracing = 0; tstate->use_tracing = 0; - tstate->tick_counter = 0; tstate->gilstate_counter = 0; tstate->async_exc = NULL; #ifdef WITH_THREAD @@ -208,12 +209,17 @@ new_threadstate(PyInterpreterState *interp, int init) tstate->trash_delete_nesting = 0; tstate->trash_delete_later = NULL; + tstate->on_delete = NULL; + tstate->on_delete_data = NULL; if (init) _PyThreadState_Init(tstate); HEAD_LOCK(); + tstate->prev = NULL; tstate->next = interp->tstate_head; + if (tstate->next) + tstate->next->prev = tstate; interp->tstate_head = tstate; HEAD_UNLOCK(); } @@ -317,6 +323,31 @@ PyState_RemoveModule(struct PyModuleDef* def) return PyList_SetItem(state->modules_by_index, index, Py_None); } +/* used by import.c:PyImport_Cleanup */ +void +_PyState_ClearModules(void) +{ + PyInterpreterState *state = PyThreadState_GET()->interp; + if (state->modules_by_index) { + Py_ssize_t i; + for (i = 0; i < PyList_GET_SIZE(state->modules_by_index); i++) { + PyObject *m = PyList_GET_ITEM(state->modules_by_index, i); + if (PyModule_Check(m)) { + /* cleanup the saved copy of module dicts */ + PyModuleDef *md = PyModule_GetDef(m); + if (md) + Py_CLEAR(md->m_base.m_copy); + } + } + /* Setting modules_by_index to NULL could be dangerous, so we + clear the list instead. */ + if (PyList_SetSlice(state->modules_by_index, + 0, PyList_GET_SIZE(state->modules_by_index), + NULL)) + PyErr_WriteUnraisable(state->modules_by_index); + } +} + void PyThreadState_Clear(PyThreadState *tstate) { @@ -349,37 +380,23 @@ static void tstate_delete_common(PyThreadState *tstate) { PyInterpreterState *interp; - PyThreadState **p; - PyThreadState *prev_p = NULL; if (tstate == NULL) Py_FatalError("PyThreadState_Delete: NULL tstate"); interp = tstate->interp; if (interp == NULL) Py_FatalError("PyThreadState_Delete: NULL interp"); HEAD_LOCK(); - for (p = &interp->tstate_head; ; p = &(*p)->next) { - if (*p == NULL) - Py_FatalError( - "PyThreadState_Delete: invalid tstate"); - if (*p == tstate) - break; - /* Sanity check. These states should never happen but if - * they do we must abort. Otherwise we'll end up spinning in - * in a tight loop with the lock held. A similar check is done - * in thread.c find_key(). */ - if (*p == prev_p) - Py_FatalError( - "PyThreadState_Delete: small circular list(!)" - " and tstate not found."); - prev_p = *p; - if ((*p)->next == interp->tstate_head) - Py_FatalError( - "PyThreadState_Delete: circular list(!) and" - " tstate not found."); - } - *p = tstate->next; + if (tstate->prev) + tstate->prev->next = tstate->next; + else + interp->tstate_head = tstate->next; + if (tstate->next) + tstate->next->prev = tstate->prev; HEAD_UNLOCK(); - free(tstate); + if (tstate->on_delete != NULL) { + tstate->on_delete(tstate->on_delete_data); + } + PyMem_RawFree(tstate); } @@ -414,6 +431,43 @@ PyThreadState_DeleteCurrent() #endif /* WITH_THREAD */ +/* + * Delete all thread states except the one passed as argument. + * Note that, if there is a current thread state, it *must* be the one + * passed as argument. Also, this won't touch any other interpreters + * than the current one, since we don't know which thread state should + * be kept in those other interpreteres. + */ +void +_PyThreadState_DeleteExcept(PyThreadState *tstate) +{ + PyInterpreterState *interp = tstate->interp; + PyThreadState *p, *next, *garbage; + HEAD_LOCK(); + /* Remove all thread states, except tstate, from the linked list of + thread states. This will allow calling PyThreadState_Clear() + without holding the lock. */ + garbage = interp->tstate_head; + if (garbage == tstate) + garbage = tstate->next; + if (tstate->prev) + tstate->prev->next = tstate->next; + if (tstate->next) + tstate->next->prev = tstate->prev; + tstate->prev = tstate->next = NULL; + interp->tstate_head = tstate; + HEAD_UNLOCK(); + /* Clear and deallocate all stale thread states. Even if this + executes Python code, we should be safe since it executes + in the current thread, not one of the stale threads. */ + for (p = garbage; p; p = next) { + next = p->next; + PyThreadState_Clear(p); + PyMem_RawFree(p); + } +} + + PyThreadState * PyThreadState_Get(void) { @@ -671,18 +725,18 @@ _PyGILState_NoteThreadState(PyThreadState* tstate) The only situation where you can legitimately have more than one thread state for an OS level thread is when there are multiple - interpreters, when: + interpreters. - a) You shouldn't really be using the PyGILState_ APIs anyway, - and: + You shouldn't really be using the PyGILState_ APIs anyway (see issues + #10915 and #15751). - b) The slightly odd way PyThread_set_key_value works (see - comments by its implementation) means that the first thread - state created for that given OS level thread will "win", - which seems reasonable behaviour. + The first thread state created for that given OS level thread will + "win", which seems reasonable behaviour. */ - if (PyThread_set_key_value(autoTLSkey, (void *)tstate) < 0) - Py_FatalError("Couldn't create autoTLSkey mapping"); + if (PyThread_get_key_value(autoTLSkey) == NULL) { + if (PyThread_set_key_value(autoTLSkey, (void *)tstate) < 0) + Py_FatalError("Couldn't create autoTLSkey mapping"); + } /* PyGILState_Release must not try to delete this thread state. */ tstate->gilstate_counter = 1; @@ -697,6 +751,15 @@ PyGILState_GetThisThreadState(void) return (PyThreadState *)PyThread_get_key_value(autoTLSkey); } +int +PyGILState_Check(void) +{ + /* can't use PyThreadState_Get() since it will assert that it has the GIL */ + PyThreadState *tstate = (PyThreadState*)_Py_atomic_load_relaxed( + &_PyThreadState_Current); + return tstate && (tstate == PyGILState_GetThisThreadState()); +} + PyGILState_STATE PyGILState_Ensure(void) { @@ -710,6 +773,11 @@ PyGILState_Ensure(void) assert(autoInterpreterState); /* Py_Initialize() hasn't been called! */ tcur = (PyThreadState *)PyThread_get_key_value(autoTLSkey); if (tcur == NULL) { + /* At startup, Python has no concrete GIL. If PyGILState_Ensure() is + called from a new thread for the first time, we need the create the + GIL. */ + PyEval_InitThreads(); + /* Create a new thread state for this thread */ tcur = PyThreadState_New(autoInterpreterState); if (tcur == NULL) diff --git a/Python/pystrtod.c b/Python/pystrtod.c index 4ab8f08..209c908 100644 --- a/Python/pystrtod.c +++ b/Python/pystrtod.c @@ -164,7 +164,7 @@ static double _PyOS_ascii_strtod(const char *nptr, char **endptr) { char *fail_pos; - double val = -1.0; + double val; struct lconv *locale_data; const char *decimal_point; size_t decimal_point_len; @@ -325,7 +325,7 @@ _PyOS_ascii_strtod(const char *nptr, char **endptr) On overflow (e.g., when trying to convert '1e500' on an IEEE 754 machine), if overflow_exception is NULL then +-Py_HUGE_VAL is returned, and no Python - exception is raised. Otherwise, overflow_exception should point to a + exception is raised. Otherwise, overflow_exception should point to a Python exception, this exception will be raised, -1.0 will be returned, and *endptr will point just past the end of the converted value. @@ -923,7 +923,7 @@ static char *uc_float_strings[] = { static char * format_float_short(double d, char format_code, - int mode, Py_ssize_t precision, + int mode, int precision, int always_add_sign, int add_dot_0_if_integer, int use_alt_formatting, char **float_strings, int *type) { @@ -1059,7 +1059,7 @@ format_float_short(double d, char format_code, /* if using an exponent, reset decimal point position to 1 and adjust exponent accordingly.*/ if (use_exp) { - exp = decpt - 1; + exp = (int)decpt - 1; decpt = 1; } /* ensure vdigits_start < decpt <= vdigits_end, or vdigits_start < diff --git a/Python/pythonrun.c b/Python/pythonrun.c index 91d56b7..0967a47 100644 --- a/Python/pythonrun.c +++ b/Python/pythonrun.c @@ -35,12 +35,46 @@ #define PATH_MAX MAXPATHLEN #endif +#ifdef __gnu_hurd__ +#define PATH_MAX MAXPATHLEN +#endif + +_Py_IDENTIFIER(builtins); +_Py_IDENTIFIER(excepthook); +_Py_IDENTIFIER(flush); +_Py_IDENTIFIER(last_traceback); +_Py_IDENTIFIER(last_type); +_Py_IDENTIFIER(last_value); +_Py_IDENTIFIER(name); +_Py_IDENTIFIER(ps1); +_Py_IDENTIFIER(ps2); +_Py_IDENTIFIER(stdin); +_Py_IDENTIFIER(stdout); +_Py_IDENTIFIER(stderr); +_Py_static_string(PyId_string, "<string>"); + +#ifdef Py_REF_DEBUG +static +void _print_total_refs(void) { + PyObject *xoptions, *value; + _Py_IDENTIFIER(showrefcount); + + xoptions = PySys_GetXOptions(); + if (xoptions == NULL) + return; + value = _PyDict_GetItemId(xoptions, &PyId_showrefcount); + if (value == Py_True) + fprintf(stderr, + "[%" PY_FORMAT_SIZE_T "d refs, " + "%" PY_FORMAT_SIZE_T "d blocks]\n", + _Py_GetRefTotal(), _Py_GetAllocatedBlocks()); +} +#endif + #ifndef Py_REF_DEBUG #define PRINT_TOTAL_REFS() #else /* Py_REF_DEBUG */ -#define PRINT_TOTAL_REFS() fprintf(stderr, \ - "[%" PY_FORMAT_SIZE_T "d refs]\n", \ - _Py_GetRefTotal()) +#define PRINT_TOTAL_REFS() _print_total_refs() #endif #ifdef __cplusplus @@ -57,7 +91,7 @@ static int initfsencoding(PyInterpreterState *interp); static void initsite(void); static int initstdio(void); static void flush_io(void); -static PyObject *run_mod(mod_ty, const char *, PyObject *, PyObject *, +static PyObject *run_mod(mod_ty, PyObject *, PyObject *, PyObject *, PyCompilerFlags *, PyArena *); static PyObject *run_pyc_file(FILE *, const char *, PyObject *, PyObject *, PyCompilerFlags *); @@ -68,11 +102,15 @@ static void call_py_exitfuncs(void); static void wait_for_thread_shutdown(void); static void call_ll_exitfuncs(void); extern int _PyUnicode_Init(void); +extern int _PyStructSequence_Init(void); extern void _PyUnicode_Fini(void); extern int _PyLong_Init(void); extern void PyLong_Fini(void); extern int _PyFaulthandler_Init(void); extern void _PyFaulthandler_Fini(void); +extern void _PyHash_Fini(void); +extern int _PyTraceMalloc_Init(void); +extern int _PyTraceMalloc_Fini(void); #ifdef WITH_THREAD extern void _PyGILState_Init(PyInterpreterState *, PyThreadState *); @@ -93,6 +131,7 @@ int Py_IgnoreEnvironmentFlag; /* e.g. PYTHONPATH, PYTHONHOME */ int Py_NoUserSiteDirectory = 0; /* for -s and site.py */ int Py_UnbufferedStdioFlag = 0; /* Unbuffered binary std{in,out,err} */ int Py_HashRandomizationFlag = 0; /* for -R and PYTHONHASHSEED */ +int Py_IsolatedFlag = 0; /* for -I, isolate from user's env */ PyThreadState *_Py_Finalizing = NULL; @@ -118,6 +157,45 @@ Py_IsInitialized(void) return initialized; } +/* Helper to allow an embedding application to override the normal + * mechanism that attempts to figure out an appropriate IO encoding + */ + +static char *_Py_StandardStreamEncoding = NULL; +static char *_Py_StandardStreamErrors = NULL; + +int +Py_SetStandardStreamEncoding(const char *encoding, const char *errors) +{ + if (Py_IsInitialized()) { + /* This is too late to have any effect */ + return -1; + } + /* Can't call PyErr_NoMemory() on errors, as Python hasn't been + * initialised yet. + * + * However, the raw memory allocators are initialised appropriately + * as C static variables, so _PyMem_RawStrdup is OK even though + * Py_Initialize hasn't been called yet. + */ + if (encoding) { + _Py_StandardStreamEncoding = _PyMem_RawStrdup(encoding); + if (!_Py_StandardStreamEncoding) { + return -2; + } + } + if (errors) { + _Py_StandardStreamErrors = _PyMem_RawStrdup(errors); + if (!_Py_StandardStreamErrors) { + if (_Py_StandardStreamEncoding) { + PyMem_RawFree(_Py_StandardStreamEncoding); + } + return -3; + } + } + return 0; +} + /* Global initializations. Can be undone by Py_Finalize(). Don't call this twice without an intervening Py_Finalize() call. When initializations fail, a fatal error is issued and the function does @@ -146,7 +224,6 @@ get_codec_name(const char *encoding) { char *name_utf8, *name_str; PyObject *codec, *name = NULL; - _Py_IDENTIFIER(name); codec = _PyCodec_Lookup(encoding); if (!codec) @@ -160,7 +237,7 @@ get_codec_name(const char *encoding) name_utf8 = _PyUnicode_AsString(name); if (name_utf8 == NULL) goto error; - name_str = strdup(name_utf8); + name_str = _PyMem_RawStrdup(name_utf8); Py_DECREF(name); if (name_str == NULL) { PyErr_NoMemory(); @@ -313,7 +390,8 @@ _Py_InitializeEx_Private(int install_sigs, int install_importlib) if (!PyByteArray_Init()) Py_FatalError("Py_Initialize: can't init bytearray"); - _PyFloat_Init(); + if (!_PyFloat_Init()) + Py_FatalError("Py_Initialize: can't init float"); interp->modules = PyDict_New(); if (interp->modules == NULL) @@ -322,6 +400,8 @@ _Py_InitializeEx_Private(int install_sigs, int install_importlib) /* Init Unicode implementation; relies on the codec registry */ if (_PyUnicode_Init() < 0) Py_FatalError("Py_Initialize: can't initialize unicode"); + if (_PyStructSequence_Init() < 0) + Py_FatalError("Py_Initialize: can't initialize structseq"); bimod = _PyBuiltin_Init(); if (bimod == NULL) @@ -352,7 +432,7 @@ _Py_InitializeEx_Private(int install_sigs, int install_importlib) pstderr = PyFile_NewStdPrinter(fileno(stderr)); if (pstderr == NULL) Py_FatalError("Py_Initialize: can't set preliminary stderr"); - PySys_SetObject("stderr", pstderr); + _PySys_SetObjectId(&PyId_stderr, pstderr); PySys_SetObject("__stderr__", pstderr); Py_DECREF(pstderr); @@ -380,6 +460,9 @@ _Py_InitializeEx_Private(int install_sigs, int install_importlib) if (install_sigs) initsigs(); /* Signal handling stuff, including initintr() */ + if (_PyTraceMalloc_Init() < 0) + Py_FatalError("Py_Initialize: can't initialize tracemalloc"); + initmain(interp); /* Module __main__ */ if (initstdio() < 0) Py_FatalError( @@ -437,10 +520,9 @@ file_is_closed(PyObject *fobj) static void flush_std_files(void) { - PyObject *fout = PySys_GetObject("stdout"); - PyObject *ferr = PySys_GetObject("stderr"); + PyObject *fout = _PySys_GetObjectId(&PyId_stdout); + PyObject *ferr = _PySys_GetObjectId(&PyId_stderr); PyObject *tmp; - _Py_IDENTIFIER(flush); if (fout != NULL && fout != Py_None && !file_is_closed(fout)) { tmp = _PyObject_CallMethodId(fout, &PyId_flush, ""); @@ -504,7 +586,7 @@ Py_Finalize(void) _Py_Finalizing = tstate; initialized = 0; - /* Flush stdout+stderr */ + /* Flush sys.stdout and sys.stderr */ flush_std_files(); /* Disable signal handling */ @@ -530,14 +612,10 @@ Py_Finalize(void) while (PyGC_Collect() > 0) /* nothing */; #endif - /* We run this while most interpreter state is still alive, so that - debug information can be printed out */ - _PyGC_Fini(); - /* Destroy all modules */ PyImport_Cleanup(); - /* Flush stdout+stderr (again, in case more was printed) */ + /* Flush sys.stdout and sys.stderr (again, in case more was printed) */ flush_std_files(); /* Collect final garbage. This disposes of cycles created by @@ -559,6 +637,10 @@ Py_Finalize(void) PyGC_Collect(); #endif + /* Disable tracemalloc after all Python objects have been destroyed, + so it is possible to use tracemalloc in objects destructor. */ + _PyTraceMalloc_Fini(); + /* Destroy the database used by _PyImport_{Fixup,Find}Extension */ _PyImport_Fini(); @@ -572,6 +654,8 @@ Py_Finalize(void) #ifdef COUNT_ALLOCS dump_counts(stdout); #endif + /* dump hash stats */ + _PyHash_Fini(); PRINT_TOTAL_REFS(); @@ -596,11 +680,6 @@ Py_Finalize(void) _PyExc_Fini(); - /* Cleanup auto-thread-state */ -#ifdef WITH_THREAD - _PyGILState_Fini(); -#endif /* WITH_THREAD */ - /* Sundry finalizers */ PyMethod_Fini(); PyFrame_Fini(); @@ -614,17 +693,15 @@ Py_Finalize(void) PyFloat_Fini(); PyDict_Fini(); PySlice_Fini(); + _PyGC_Fini(); + _PyRandom_Fini(); /* Cleanup Unicode implementation */ _PyUnicode_Fini(); - /* Delete current thread. After this, many C API calls become crashy. */ - PyThreadState_Swap(NULL); - PyInterpreterState_Delete(interp); - /* reset file system default encoding */ if (!Py_HasFileSystemDefaultEncoding && Py_FileSystemDefaultEncoding) { - free((char*)Py_FileSystemDefaultEncoding); + PyMem_RawFree((char*)Py_FileSystemDefaultEncoding); Py_FileSystemDefaultEncoding = NULL; } @@ -636,6 +713,15 @@ Py_Finalize(void) PyGrammar_RemoveAccelerators(&_PyParser_Grammar); + /* Cleanup auto-thread-state */ +#ifdef WITH_THREAD + _PyGILState_Fini(); +#endif /* WITH_THREAD */ + + /* Delete current thread. After this, many C API calls become crashy. */ + PyThreadState_Swap(NULL); + PyInterpreterState_Delete(interp); + #ifdef Py_TRACE_REFS /* Display addresses (& refcnts) of all objects still alive. * An address can be used to find the repr of the object, printed @@ -718,7 +804,7 @@ Py_NewInterpreter(void) pstderr = PyFile_NewStdPrinter(fileno(stderr)); if (pstderr == NULL) Py_FatalError("Py_Initialize: can't set preliminary stderr"); - PySys_SetObject("stderr", pstderr); + _PySys_SetObjectId(&PyId_stderr, pstderr); PySys_SetObject("__stderr__", pstderr); Py_DECREF(pstderr); @@ -773,6 +859,9 @@ Py_EndInterpreter(PyThreadState *tstate) Py_FatalError("Py_EndInterpreter: thread is not current"); if (tstate->frame != NULL) Py_FatalError("Py_EndInterpreter: thread still has a frame"); + + wait_for_thread_shutdown(); + if (tstate != interp->tstate_head || tstate->next != NULL) Py_FatalError("Py_EndInterpreter: not the last thread"); @@ -802,7 +891,7 @@ Py_GetProgramName(void) } static wchar_t *default_home = NULL; -static wchar_t env_home[PATH_MAX+1]; +static wchar_t env_home[MAXPATHLEN+1]; void Py_SetPythonHome(wchar_t *home) @@ -832,7 +921,7 @@ Py_GetPythonHome(void) static void initmain(PyInterpreterState *interp) { - PyObject *m, *d; + PyObject *m, *d, *loader; m = PyImport_AddModule("__main__"); if (m == NULL) Py_FatalError("can't create __main__ module"); @@ -853,7 +942,8 @@ initmain(PyInterpreterState *interp) * be set if __main__ gets further initialized later in the startup * process. */ - if (PyDict_GetItemString(d, "__loader__") == NULL) { + loader = PyDict_GetItemString(d, "__loader__"); + if (loader == NULL || loader == Py_None) { PyObject *loader = PyObject_GetAttrString(interp->importlib, "BuiltinImporter"); if (loader == NULL) { @@ -903,6 +993,7 @@ initsite(void) PyObject *m; m = PyImport_ImportModule("site"); if (m == NULL) { + fprintf(stderr, "Failed to import the site module\n"); PyErr_Print(); Py_Finalize(); exit(1); @@ -912,6 +1003,21 @@ initsite(void) } } +/* Check if a file descriptor is valid or not. + Return 0 if the file descriptor is invalid, return non-zero otherwise. */ +static int +is_valid_fd(int fd) +{ + int fd2; + if (fd < 0 || !_PyVerify_fd(fd)) + return 0; + fd2 = dup(fd); + if (fd2 >= 0) + close(fd2); + return fd2 >= 0; +} + +/* returns Py_None if the fd is not valid */ static PyObject* create_stdio(PyObject* io, int fd, int write_mode, char* name, @@ -925,9 +1031,11 @@ create_stdio(PyObject* io, _Py_IDENTIFIER(open); _Py_IDENTIFIER(isatty); _Py_IDENTIFIER(TextIOWrapper); - _Py_IDENTIFIER(name); _Py_IDENTIFIER(mode); + if (!is_valid_fd(fd)) + Py_RETURN_NONE; + /* stdin is always opened in buffered mode, first because it shouldn't make a difference in common use cases, second because TextIOWrapper depends on the presence of a read1() method which only exists on @@ -1009,20 +1117,15 @@ error: Py_XDECREF(stream); Py_XDECREF(text); Py_XDECREF(raw); - return NULL; -} -static int -is_valid_fd(int fd) -{ - int dummy_fd; - if (fd < 0 || !_PyVerify_fd(fd)) - return 0; - dummy_fd = dup(fd); - if (dummy_fd < 0) - return 0; - close(dummy_fd); - return 1; + if (PyErr_ExceptionMatches(PyExc_OSError) && !is_valid_fd(fd)) { + /* Issue #24891: the file descriptor was closed after the first + is_valid_fd() check was called. Ignore the OSError and set the + stream to None. */ + PyErr_Clear(); + Py_RETURN_NONE; + } + return NULL; } /* Initialize sys.stdin, stdout, stderr and builtins.open */ @@ -1035,7 +1138,7 @@ initstdio(void) PyObject *std = NULL; int status = 0, fd; PyObject * encoding_attr; - char *encoding = NULL, *errors; + char *pythonioencoding = NULL, *encoding, *errors; /* Hack to avoid a nasty recursion issue when Python is invoked in verbose mode: pre-import the Latin-1 and UTF-8 codecs */ @@ -1067,14 +1170,28 @@ initstdio(void) } Py_DECREF(wrapper); - encoding = Py_GETENV("PYTHONIOENCODING"); - errors = NULL; - if (encoding) { - encoding = strdup(encoding); - errors = strchr(encoding, ':'); - if (errors) { - *errors = '\0'; - errors++; + encoding = _Py_StandardStreamEncoding; + errors = _Py_StandardStreamErrors; + if (!encoding || !errors) { + pythonioencoding = Py_GETENV("PYTHONIOENCODING"); + if (pythonioencoding) { + char *err; + pythonioencoding = _PyMem_Strdup(pythonioencoding); + if (pythonioencoding == NULL) { + PyErr_NoMemory(); + goto error; + } + err = strchr(pythonioencoding, ':'); + if (err) { + *err = '\0'; + err++; + if (*err && !errors) { + errors = err; + } + } + if (*pythonioencoding && !encoding) { + encoding = pythonioencoding; + } } } @@ -1084,63 +1201,51 @@ initstdio(void) * and fileno() may point to an invalid file descriptor. For example * GUI apps don't have valid standard streams by default. */ - if (!is_valid_fd(fd)) { - std = Py_None; - Py_INCREF(std); - } - else { - std = create_stdio(iomod, fd, 0, "<stdin>", encoding, errors); - if (std == NULL) - goto error; - } /* if (fd < 0) */ + std = create_stdio(iomod, fd, 0, "<stdin>", encoding, errors); + if (std == NULL) + goto error; PySys_SetObject("__stdin__", std); - PySys_SetObject("stdin", std); + _PySys_SetObjectId(&PyId_stdin, std); Py_DECREF(std); /* Set sys.stdout */ fd = fileno(stdout); - if (!is_valid_fd(fd)) { - std = Py_None; - Py_INCREF(std); - } - else { - std = create_stdio(iomod, fd, 1, "<stdout>", encoding, errors); - if (std == NULL) - goto error; - } /* if (fd < 0) */ + std = create_stdio(iomod, fd, 1, "<stdout>", encoding, errors); + if (std == NULL) + goto error; PySys_SetObject("__stdout__", std); - PySys_SetObject("stdout", std); + _PySys_SetObjectId(&PyId_stdout, std); Py_DECREF(std); #if 1 /* Disable this if you have trouble debugging bootstrap stuff */ /* Set sys.stderr, replaces the preliminary stderr */ fd = fileno(stderr); - if (!is_valid_fd(fd)) { - std = Py_None; - Py_INCREF(std); - } - else { - std = create_stdio(iomod, fd, 1, "<stderr>", encoding, "backslashreplace"); - if (std == NULL) - goto error; - } /* if (fd < 0) */ + std = create_stdio(iomod, fd, 1, "<stderr>", encoding, "backslashreplace"); + if (std == NULL) + goto error; /* Same as hack above, pre-import stderr's codec to avoid recursion when import.c tries to write to stderr in verbose mode. */ encoding_attr = PyObject_GetAttrString(std, "encoding"); if (encoding_attr != NULL) { - const char * encoding; - encoding = _PyUnicode_AsString(encoding_attr); - if (encoding != NULL) { - PyObject *codec_info = _PyCodec_Lookup(encoding); + const char * std_encoding; + std_encoding = _PyUnicode_AsString(encoding_attr); + if (std_encoding != NULL) { + PyObject *codec_info = _PyCodec_Lookup(std_encoding); Py_XDECREF(codec_info); } Py_DECREF(encoding_attr); } PyErr_Clear(); /* Not a fatal error if codec isn't available */ - PySys_SetObject("__stderr__", std); - PySys_SetObject("stderr", std); + if (PySys_SetObject("__stderr__", std) < 0) { + Py_DECREF(std); + goto error; + } + if (_PySys_SetObjectId(&PyId_stderr, std) < 0) { + Py_DECREF(std); + goto error; + } Py_DECREF(std); #endif @@ -1149,8 +1254,16 @@ initstdio(void) status = -1; } - if (encoding) - free(encoding); + /* We won't need them anymore. */ + if (_Py_StandardStreamEncoding) { + PyMem_RawFree(_Py_StandardStreamEncoding); + _Py_StandardStreamEncoding = NULL; + } + if (_Py_StandardStreamErrors) { + PyMem_RawFree(_Py_StandardStreamErrors); + _Py_StandardStreamErrors = NULL; + } + PyMem_Free(pythonioencoding); Py_XDECREF(bimod); Py_XDECREF(iomod); return status; @@ -1175,36 +1288,47 @@ PyRun_AnyFileExFlags(FILE *fp, const char *filename, int closeit, } int -PyRun_InteractiveLoopFlags(FILE *fp, const char *filename, PyCompilerFlags *flags) +PyRun_InteractiveLoopFlags(FILE *fp, const char *filename_str, PyCompilerFlags *flags) { - PyObject *v; - int ret; + PyObject *filename, *v; + int ret, err; PyCompilerFlags local_flags; + filename = PyUnicode_DecodeFSDefault(filename_str); + if (filename == NULL) { + PyErr_Print(); + return -1; + } + if (flags == NULL) { flags = &local_flags; local_flags.cf_flags = 0; } - v = PySys_GetObject("ps1"); + v = _PySys_GetObjectId(&PyId_ps1); if (v == NULL) { - PySys_SetObject("ps1", v = PyUnicode_FromString(">>> ")); + _PySys_SetObjectId(&PyId_ps1, v = PyUnicode_FromString(">>> ")); Py_XDECREF(v); } - v = PySys_GetObject("ps2"); + v = _PySys_GetObjectId(&PyId_ps2); if (v == NULL) { - PySys_SetObject("ps2", v = PyUnicode_FromString("... ")); + _PySys_SetObjectId(&PyId_ps2, v = PyUnicode_FromString("... ")); Py_XDECREF(v); } + err = -1; for (;;) { - ret = PyRun_InteractiveOneFlags(fp, filename, flags); + ret = PyRun_InteractiveOneObject(fp, filename, flags); PRINT_TOTAL_REFS(); - if (ret == E_EOF) - return 0; + if (ret == E_EOF) { + err = 0; + break; + } /* if (ret == E_NOMEM) - return -1; + break; */ } + Py_DECREF(filename); + return err; } /* compute parser flags based on compiler flags */ @@ -1232,18 +1356,25 @@ static int PARSER_FLAGS(PyCompilerFlags *flags) #endif int -PyRun_InteractiveOneFlags(FILE *fp, const char *filename, PyCompilerFlags *flags) +PyRun_InteractiveOneObject(FILE *fp, PyObject *filename, PyCompilerFlags *flags) { - PyObject *m, *d, *v, *w, *oenc = NULL; + PyObject *m, *d, *v, *w, *oenc = NULL, *mod_name; mod_ty mod; PyArena *arena; char *ps1 = "", *ps2 = "", *enc = NULL; int errcode = 0; _Py_IDENTIFIER(encoding); + _Py_IDENTIFIER(__main__); + + mod_name = _PyUnicode_FromId(&PyId___main__); /* borrowed */ + if (mod_name == NULL) { + PyErr_Print(); + return -1; + } if (fp == stdin) { /* Fetch encoding from sys.stdin if possible. */ - v = PySys_GetObject("stdin"); + v = _PySys_GetObjectId(&PyId_stdin); if (v && v != Py_None) { oenc = _PyObject_GetAttrId(v, &PyId_encoding); if (oenc) @@ -1252,7 +1383,7 @@ PyRun_InteractiveOneFlags(FILE *fp, const char *filename, PyCompilerFlags *flags PyErr_Clear(); } } - v = PySys_GetObject("ps1"); + v = _PySys_GetObjectId(&PyId_ps1); if (v != NULL) { v = PyObject_Str(v); if (v == NULL) @@ -1265,7 +1396,7 @@ PyRun_InteractiveOneFlags(FILE *fp, const char *filename, PyCompilerFlags *flags } } } - w = PySys_GetObject("ps2"); + w = _PySys_GetObjectId(&PyId_ps2); if (w != NULL) { w = PyObject_Str(w); if (w == NULL) @@ -1285,9 +1416,9 @@ PyRun_InteractiveOneFlags(FILE *fp, const char *filename, PyCompilerFlags *flags Py_XDECREF(oenc); return -1; } - mod = PyParser_ASTFromFile(fp, filename, enc, - Py_single_input, ps1, ps2, - flags, &errcode, arena); + mod = PyParser_ASTFromFileObject(fp, filename, enc, + Py_single_input, ps1, ps2, + flags, &errcode, arena); Py_XDECREF(v); Py_XDECREF(w); Py_XDECREF(oenc); @@ -1300,7 +1431,7 @@ PyRun_InteractiveOneFlags(FILE *fp, const char *filename, PyCompilerFlags *flags PyErr_Print(); return -1; } - m = PyImport_AddModule("__main__"); + m = PyImport_AddModuleObject(mod_name); if (m == NULL) { PyArena_Free(arena); return -1; @@ -1308,15 +1439,33 @@ PyRun_InteractiveOneFlags(FILE *fp, const char *filename, PyCompilerFlags *flags d = PyModule_GetDict(m); v = run_mod(mod, filename, d, d, flags, arena); PyArena_Free(arena); - flush_io(); if (v == NULL) { PyErr_Print(); + flush_io(); return -1; } Py_DECREF(v); + flush_io(); return 0; } +int +PyRun_InteractiveOneFlags(FILE *fp, const char *filename_str, PyCompilerFlags *flags) +{ + PyObject *filename; + int res; + + filename = PyUnicode_DecodeFSDefault(filename_str); + if (filename == NULL) { + PyErr_Print(); + return -1; + } + res = PyRun_InteractiveOneObject(fp, filename, flags); + Py_DECREF(filename); + return res; +} + + /* Check whether a file maybe a pyc file: Look at the extension, the file type, and, if we may close it, at the first few bytes. */ @@ -1357,8 +1506,8 @@ maybe_pyc_file(FILE *fp, const char* filename, const char* ext, int closeit) return 0; } -int -static set_main_loader(PyObject *d, const char *filename, const char *loader_name) +static int +set_main_loader(PyObject *d, const char *filename, const char *loader_name) { PyInterpreterState *interp; PyThreadState *tstate; @@ -1425,7 +1574,7 @@ PyRun_SimpleFileExFlags(FILE *fp, const char *filename, int closeit, /* Try to run a pyc file. First, re-open in binary */ if (closeit) fclose(fp); - if ((pyc_fp = fopen(filename, "rb")) == NULL) { + if ((pyc_fp = _Py_fopen(filename, "rb")) == NULL) { fprintf(stderr, "python: Can't reopen .pyc file\n"); goto done; } @@ -1484,8 +1633,8 @@ PyRun_SimpleStringFlags(const char *command, PyCompilerFlags *flags) } static int -parse_syntax_error(PyObject *err, PyObject **message, const char **filename, - int *lineno, int *offset, const char **text) +parse_syntax_error(PyObject *err, PyObject **message, PyObject **filename, + int *lineno, int *offset, PyObject **text) { long hold; PyObject *v; @@ -1496,6 +1645,7 @@ parse_syntax_error(PyObject *err, PyObject **message, const char **filename, _Py_IDENTIFIER(text); *message = NULL; + *filename = NULL; /* new style errors. `err' is an instance */ *message = _PyObject_GetAttrId(err, &PyId_msg); @@ -1507,13 +1657,13 @@ parse_syntax_error(PyObject *err, PyObject **message, const char **filename, goto finally; if (v == Py_None) { Py_DECREF(v); - *filename = NULL; + *filename = _PyUnicode_FromId(&PyId_string); + if (*filename == NULL) + goto finally; + Py_INCREF(*filename); } else { - *filename = _PyUnicode_AsString(v); - Py_DECREF(v); - if (!*filename) - goto finally; + *filename = v; } v = _PyObject_GetAttrId(err, &PyId_lineno); @@ -1547,15 +1697,13 @@ parse_syntax_error(PyObject *err, PyObject **message, const char **filename, *text = NULL; } else { - *text = _PyUnicode_AsString(v); - Py_DECREF(v); - if (!*text) - goto finally; + *text = v; } return 1; finally: Py_XDECREF(*message); + Py_XDECREF(*filename); return 0; } @@ -1566,9 +1714,15 @@ PyErr_Print(void) } static void -print_error_text(PyObject *f, int offset, const char *text) +print_error_text(PyObject *f, int offset, PyObject *text_obj) { + char *text; char *nl; + + text = _PyUnicode_AsString(text_obj); + if (text == NULL) + return; + if (offset >= 0) { if (offset > 0 && offset == strlen(text) && text[offset - 1] == '\n') offset--; @@ -1627,7 +1781,12 @@ handle_system_exit(void) if (PyLong_Check(value)) exitcode = (int)PyLong_AsLong(value); else { - PyObject *sys_stderr = PySys_GetObject("stderr"); + PyObject *sys_stderr = _PySys_GetObjectId(&PyId_stderr); + /* We clear the exception here to avoid triggering the assertion + * in PyObject_Str that ensures it won't silently lose exception + * details. + */ + PyErr_Clear(); if (sys_stderr != NULL && sys_stderr != Py_None) { PyFile_WriteObject(value, sys_stderr, Py_PRINT_RAW); } else { @@ -1670,11 +1829,11 @@ PyErr_PrintEx(int set_sys_last_vars) return; /* Now we know v != NULL too */ if (set_sys_last_vars) { - PySys_SetObject("last_type", exception); - PySys_SetObject("last_value", v); - PySys_SetObject("last_traceback", tb); + _PySys_SetObjectId(&PyId_last_type, exception); + _PySys_SetObjectId(&PyId_last_value, v); + _PySys_SetObjectId(&PyId_last_traceback, tb); } - hook = PySys_GetObject("excepthook"); + hook = _PySys_GetObjectId(&PyId_excepthook); if (hook) { PyObject *args = PyTuple_Pack(3, exception, v, tb); PyObject *result = PyEval_CallObject(hook, args); @@ -1724,9 +1883,11 @@ print_exception(PyObject *f, PyObject *value) _Py_IDENTIFIER(print_file_and_line); if (!PyExceptionInstance_Check(value)) { - PyFile_WriteString("TypeError: print_exception(): Exception expected for value, ", f); - PyFile_WriteString(Py_TYPE(value)->tp_name, f); - PyFile_WriteString(" found\n", f); + err = PyFile_WriteString("TypeError: print_exception(): Exception expected for value, ", f); + err += PyFile_WriteString(Py_TYPE(value)->tp_name, f); + err += PyFile_WriteString(" found\n", f); + if (err) + PyErr_Clear(); return; } @@ -1739,27 +1900,30 @@ print_exception(PyObject *f, PyObject *value) if (err == 0 && _PyObject_HasAttrId(value, &PyId_print_file_and_line)) { - PyObject *message; - const char *filename, *text; + PyObject *message, *filename, *text; int lineno, offset; if (!parse_syntax_error(value, &message, &filename, &lineno, &offset, &text)) PyErr_Clear(); else { - char buf[10]; - PyFile_WriteString(" File \"", f); - if (filename == NULL) - PyFile_WriteString("<string>", f); - else - PyFile_WriteString(filename, f); - PyFile_WriteString("\", line ", f); - PyOS_snprintf(buf, sizeof(buf), "%d", lineno); - PyFile_WriteString(buf, f); - PyFile_WriteString("\n", f); - if (text != NULL) - print_error_text(f, offset, text); + PyObject *line; + Py_DECREF(value); value = message; + + line = PyUnicode_FromFormat(" File \"%U\", line %d\n", + filename, lineno); + Py_DECREF(filename); + if (line != NULL) { + PyFile_WriteObject(line, f, Py_PRINT_RAW); + Py_DECREF(line); + } + + if (text != NULL) { + print_error_text(f, offset, text); + Py_DECREF(text); + } + /* Can't be bothered to check all those PyFile_WriteString() calls */ if (PyErr_Occurred()) @@ -1788,10 +1952,9 @@ print_exception(PyObject *f, PyObject *value) err = PyFile_WriteString("<unknown>", f); } else { - char* modstr = _PyUnicode_AsString(moduleName); - if (modstr && strcmp(modstr, "builtins")) + if (_PyUnicode_CompareWithId(moduleName, &PyId_builtins) != 0) { - err = PyFile_WriteString(modstr, f); + err = PyFile_WriteObject(moduleName, f, Py_PRINT_RAW); err += PyFile_WriteString(".", f); } Py_DECREF(moduleName); @@ -1884,7 +2047,7 @@ void PyErr_Display(PyObject *exception, PyObject *value, PyObject *tb) { PyObject *seen; - PyObject *f = PySys_GetObject("stderr"); + PyObject *f = _PySys_GetObjectId(&PyId_stderr); if (PyExceptionInstance_Check(value) && tb != NULL && PyTraceBack_Check(tb)) { /* Put the traceback on the exception, otherwise it won't get @@ -1920,37 +2083,54 @@ PyRun_StringFlags(const char *str, int start, PyObject *globals, { PyObject *ret = NULL; mod_ty mod; - PyArena *arena = PyArena_New(); + PyArena *arena; + PyObject *filename; + + filename = _PyUnicode_FromId(&PyId_string); /* borrowed */ + if (filename == NULL) + return NULL; + + arena = PyArena_New(); if (arena == NULL) return NULL; - mod = PyParser_ASTFromString(str, "<string>", start, flags, arena); + mod = PyParser_ASTFromStringObject(str, filename, start, flags, arena); if (mod != NULL) - ret = run_mod(mod, "<string>", globals, locals, flags, arena); + ret = run_mod(mod, filename, globals, locals, flags, arena); PyArena_Free(arena); return ret; } PyObject * -PyRun_FileExFlags(FILE *fp, const char *filename, int start, PyObject *globals, +PyRun_FileExFlags(FILE *fp, const char *filename_str, int start, PyObject *globals, PyObject *locals, int closeit, PyCompilerFlags *flags) { - PyObject *ret; + PyObject *ret = NULL; mod_ty mod; - PyArena *arena = PyArena_New(); + PyArena *arena = NULL; + PyObject *filename; + + filename = PyUnicode_DecodeFSDefault(filename_str); + if (filename == NULL) + goto exit; + + arena = PyArena_New(); if (arena == NULL) - return NULL; + goto exit; - mod = PyParser_ASTFromFile(fp, filename, NULL, start, 0, 0, - flags, NULL, arena); + mod = PyParser_ASTFromFileObject(fp, filename, NULL, start, 0, 0, + flags, NULL, arena); if (closeit) fclose(fp); if (mod == NULL) { - PyArena_Free(arena); - return NULL; + goto exit; } ret = run_mod(mod, filename, globals, locals, flags, arena); - PyArena_Free(arena); + +exit: + Py_XDECREF(filename); + if (arena != NULL) + PyArena_Free(arena); return ret; } @@ -1959,12 +2139,11 @@ flush_io(void) { PyObject *f, *r; PyObject *type, *value, *traceback; - _Py_IDENTIFIER(flush); /* Save the current exception */ PyErr_Fetch(&type, &value, &traceback); - f = PySys_GetObject("stderr"); + f = _PySys_GetObjectId(&PyId_stderr); if (f != NULL) { r = _PyObject_CallMethodId(f, &PyId_flush, ""); if (r) @@ -1972,7 +2151,7 @@ flush_io(void) else PyErr_Clear(); } - f = PySys_GetObject("stdout"); + f = _PySys_GetObjectId(&PyId_stdout); if (f != NULL) { r = _PyObject_CallMethodId(f, &PyId_flush, ""); if (r) @@ -1985,12 +2164,12 @@ flush_io(void) } static PyObject * -run_mod(mod_ty mod, const char *filename, PyObject *globals, PyObject *locals, - PyCompilerFlags *flags, PyArena *arena) +run_mod(mod_ty mod, PyObject *filename, PyObject *globals, PyObject *locals, + PyCompilerFlags *flags, PyArena *arena) { PyCodeObject *co; PyObject *v; - co = PyAST_Compile(mod, filename, flags, arena); + co = PyAST_CompileObject(mod, filename, flags, -1, arena); if (co == NULL) return NULL; v = PyEval_EvalCode((PyObject*)co, globals, locals); @@ -2032,8 +2211,8 @@ run_pyc_file(FILE *fp, const char *filename, PyObject *globals, } PyObject * -Py_CompileStringExFlags(const char *str, const char *filename, int start, - PyCompilerFlags *flags, int optimize) +Py_CompileStringObject(const char *str, PyObject *filename, int start, + PyCompilerFlags *flags, int optimize) { PyCodeObject *co; mod_ty mod; @@ -2041,7 +2220,7 @@ Py_CompileStringExFlags(const char *str, const char *filename, int start, if (arena == NULL) return NULL; - mod = PyParser_ASTFromString(str, filename, start, flags, arena); + mod = PyParser_ASTFromStringObject(str, filename, start, flags, arena); if (mod == NULL) { PyArena_Free(arena); return NULL; @@ -2051,11 +2230,24 @@ Py_CompileStringExFlags(const char *str, const char *filename, int start, PyArena_Free(arena); return result; } - co = PyAST_CompileEx(mod, filename, flags, optimize, arena); + co = PyAST_CompileObject(mod, filename, flags, optimize, arena); PyArena_Free(arena); return (PyObject *)co; } +PyObject * +Py_CompileStringExFlags(const char *str, const char *filename_str, int start, + PyCompilerFlags *flags, int optimize) +{ + PyObject *filename, *co; + filename = PyUnicode_DecodeFSDefault(filename_str); + if (filename == NULL) + return NULL; + co = Py_CompileStringObject(str, filename, start, flags, optimize); + Py_DECREF(filename); + return co; +} + /* For use in Py_LIMITED_API */ #undef Py_CompileString PyObject * @@ -2065,46 +2257,62 @@ PyCompileString(const char *str, const char *filename, int start) } struct symtable * -Py_SymtableString(const char *str, const char *filename, int start) +Py_SymtableStringObject(const char *str, PyObject *filename, int start) { struct symtable *st; mod_ty mod; PyCompilerFlags flags; - PyArena *arena = PyArena_New(); + PyArena *arena; + + arena = PyArena_New(); if (arena == NULL) return NULL; flags.cf_flags = 0; - mod = PyParser_ASTFromString(str, filename, start, &flags, arena); + mod = PyParser_ASTFromStringObject(str, filename, start, &flags, arena); if (mod == NULL) { PyArena_Free(arena); return NULL; } - st = PySymtable_Build(mod, filename, 0); + st = PySymtable_BuildObject(mod, filename, 0); PyArena_Free(arena); return st; } +struct symtable * +Py_SymtableString(const char *str, const char *filename_str, int start) +{ + PyObject *filename; + struct symtable *st; + + filename = PyUnicode_DecodeFSDefault(filename_str); + if (filename == NULL) + return NULL; + st = Py_SymtableStringObject(str, filename, start); + Py_DECREF(filename); + return st; +} + /* Preferred access to parser is through AST. */ mod_ty -PyParser_ASTFromString(const char *s, const char *filename, int start, - PyCompilerFlags *flags, PyArena *arena) +PyParser_ASTFromStringObject(const char *s, PyObject *filename, int start, + PyCompilerFlags *flags, PyArena *arena) { mod_ty mod; PyCompilerFlags localflags; perrdetail err; int iflags = PARSER_FLAGS(flags); - node *n = PyParser_ParseStringFlagsFilenameEx(s, filename, - &_PyParser_Grammar, start, &err, - &iflags); + node *n = PyParser_ParseStringObject(s, filename, + &_PyParser_Grammar, start, &err, + &iflags); if (flags == NULL) { localflags.cf_flags = 0; flags = &localflags; } if (n) { flags->cf_flags |= iflags & PyCF_MASK; - mod = PyAST_FromNode(n, flags, filename, arena); + mod = PyAST_FromNodeObject(n, flags, filename, arena); PyNode_Free(n); } else { @@ -2116,26 +2324,40 @@ PyParser_ASTFromString(const char *s, const char *filename, int start, } mod_ty -PyParser_ASTFromFile(FILE *fp, const char *filename, const char* enc, - int start, char *ps1, - char *ps2, PyCompilerFlags *flags, int *errcode, - PyArena *arena) +PyParser_ASTFromString(const char *s, const char *filename_str, int start, + PyCompilerFlags *flags, PyArena *arena) +{ + PyObject *filename; + mod_ty mod; + filename = PyUnicode_DecodeFSDefault(filename_str); + if (filename == NULL) + return NULL; + mod = PyParser_ASTFromStringObject(s, filename, start, flags, arena); + Py_DECREF(filename); + return mod; +} + +mod_ty +PyParser_ASTFromFileObject(FILE *fp, PyObject *filename, const char* enc, + int start, char *ps1, + char *ps2, PyCompilerFlags *flags, int *errcode, + PyArena *arena) { mod_ty mod; PyCompilerFlags localflags; perrdetail err; int iflags = PARSER_FLAGS(flags); - node *n = PyParser_ParseFileFlagsEx(fp, filename, enc, - &_PyParser_Grammar, - start, ps1, ps2, &err, &iflags); + node *n = PyParser_ParseFileObject(fp, filename, enc, + &_PyParser_Grammar, + start, ps1, ps2, &err, &iflags); if (flags == NULL) { localflags.cf_flags = 0; flags = &localflags; } if (n) { flags->cf_flags |= iflags & PyCF_MASK; - mod = PyAST_FromNode(n, flags, filename, arena); + mod = PyAST_FromNodeObject(n, flags, filename, arena); PyNode_Free(n); } else { @@ -2148,6 +2370,23 @@ PyParser_ASTFromFile(FILE *fp, const char *filename, const char* enc, return mod; } +mod_ty +PyParser_ASTFromFile(FILE *fp, const char *filename_str, const char* enc, + int start, char *ps1, + char *ps2, PyCompilerFlags *flags, int *errcode, + PyArena *arena) +{ + mod_ty mod; + PyObject *filename; + filename = PyUnicode_DecodeFSDefault(filename_str); + if (filename == NULL) + return NULL; + mod = PyParser_ASTFromFileObject(fp, filename, enc, start, ps1, ps2, + flags, errcode, arena); + Py_DECREF(filename); + return mod; +} + /* Simplified interface to parsefile -- return node or set exception */ node * @@ -2343,49 +2582,133 @@ cleanup: } } +/* Print the current exception (if an exception is set) with its traceback, + * or display the current Python stack. + * + * Don't call PyErr_PrintEx() and the except hook, because Py_FatalError() is + * called on catastrophic cases. */ + +static void +_Py_PrintFatalError(int fd) +{ + PyObject *ferr, *res; + PyObject *exception, *v, *tb; + int has_tb; + PyThreadState *tstate; + + PyErr_Fetch(&exception, &v, &tb); + if (exception == NULL) { + /* No current exception */ + goto display_stack; + } + + ferr = _PySys_GetObjectId(&PyId_stderr); + if (ferr == NULL || ferr == Py_None) { + /* sys.stderr is not set yet or set to None, + no need to try to display the exception */ + goto display_stack; + } + + PyErr_NormalizeException(&exception, &v, &tb); + if (tb == NULL) { + tb = Py_None; + Py_INCREF(tb); + } + PyException_SetTraceback(v, tb); + if (exception == NULL) { + /* PyErr_NormalizeException() failed */ + goto display_stack; + } + + has_tb = (tb != NULL && tb != Py_None); + PyErr_Display(exception, v, tb); + Py_XDECREF(exception); + Py_XDECREF(v); + Py_XDECREF(tb); + + /* sys.stderr may be buffered: call sys.stderr.flush() */ + res = _PyObject_CallMethodId(ferr, &PyId_flush, ""); + if (res == NULL) + PyErr_Clear(); + else + Py_DECREF(res); + + if (has_tb) + return; + +display_stack: +#ifdef WITH_THREAD + /* PyGILState_GetThisThreadState() works even if the GIL was released */ + tstate = PyGILState_GetThisThreadState(); +#else + tstate = PyThreadState_GET(); +#endif + if (tstate == NULL) { + /* _Py_DumpTracebackThreads() requires the thread state to display + * frames */ + return; + } + + fputc('\n', stderr); + fflush(stderr); + + /* display the current Python stack */ + _Py_DumpTracebackThreads(fd, tstate->interp, tstate); +} + /* Print fatal error message and abort */ void Py_FatalError(const char *msg) { const int fd = fileno(stderr); - PyThreadState *tstate; + static int reentrant = 0; +#ifdef MS_WINDOWS + size_t len; + WCHAR* buffer; + size_t i; +#endif + + if (reentrant) { + /* Py_FatalError() caused a second fatal error. + Example: flush_std_files() raises a recursion error. */ + goto exit; + } + reentrant = 1; fprintf(stderr, "Fatal Python error: %s\n", msg); fflush(stderr); /* it helps in Windows debug build */ - if (PyErr_Occurred()) { - PyErr_PrintEx(0); - } - else { - tstate = _Py_atomic_load_relaxed(&_PyThreadState_Current); - if (tstate != NULL) { - fputc('\n', stderr); - fflush(stderr); - _Py_DumpTracebackThreads(fd, tstate->interp, tstate); - } - _PyFaulthandler_Fini(); - } + + /* Print the exception (if an exception is set) with its traceback, + * or display the current Python stack. */ + _Py_PrintFatalError(fd); + + /* Flush sys.stdout and sys.stderr */ + flush_std_files(); + + /* The main purpose of faulthandler is to display the traceback. We already + * did our best to display it. So faulthandler can now be disabled. + * (Don't trigger it on abort().) */ + _PyFaulthandler_Fini(); #ifdef MS_WINDOWS - { - size_t len = strlen(msg); - WCHAR* buffer; - size_t i; - - /* Convert the message to wchar_t. This uses a simple one-to-one - conversion, assuming that the this error message actually uses ASCII - only. If this ceases to be true, we will have to convert. */ - buffer = alloca( (len+1) * (sizeof *buffer)); - for( i=0; i<=len; ++i) - buffer[i] = msg[i]; - OutputDebugStringW(L"Fatal Python error: "); - OutputDebugStringW(buffer); - OutputDebugStringW(L"\n"); - } -#ifdef _DEBUG + len = strlen(msg); + + /* Convert the message to wchar_t. This uses a simple one-to-one + conversion, assuming that the this error message actually uses ASCII + only. If this ceases to be true, we will have to convert. */ + buffer = alloca( (len+1) * (sizeof *buffer)); + for( i=0; i<=len; ++i) + buffer[i] = msg[i]; + OutputDebugStringW(L"Fatal Python error: "); + OutputDebugStringW(buffer); + OutputDebugStringW(L"\n"); +#endif /* MS_WINDOWS */ + +exit: +#if defined(MS_WINDOWS) && defined(_DEBUG) DebugBreak(); #endif -#endif /* MS_WINDOWS */ abort(); } @@ -2484,6 +2807,9 @@ initsigs(void) PyOS_setsig(SIGXFSZ, SIG_IGN); #endif PyOS_InitInterrupts(); /* May imply initsignal() */ + if (PyErr_Occurred()) { + Py_FatalError("Py_Initialize: can't import signal"); + } } diff --git a/Python/pytime.c b/Python/pytime.c index beeab87..de6a41f 100644 --- a/Python/pytime.c +++ b/Python/pytime.c @@ -152,7 +152,7 @@ _PyLong_FromTime_t(time_t t) static int _PyTime_ObjectToDenominator(PyObject *obj, time_t *sec, long *numerator, - double denominator) + double denominator, _PyTime_round_t round) { assert(denominator <= LONG_MAX); if (PyFloat_Check(obj)) { @@ -167,6 +167,20 @@ _PyTime_ObjectToDenominator(PyObject *obj, time_t *sec, long *numerator, intpart -= 1.0; } + floatpart *= denominator; + if (round == _PyTime_ROUND_UP) { + if (intpart >= 0) { + floatpart = ceil(floatpart); + if (floatpart >= denominator) { + floatpart = 0.0; + intpart += 1.0; + } + } + else { + floatpart = floor(floatpart); + } + } + *sec = (time_t)intpart; err = intpart - (double)*sec; if (err <= -1.0 || err >= 1.0) { @@ -174,7 +188,6 @@ _PyTime_ObjectToDenominator(PyObject *obj, time_t *sec, long *numerator, return -1; } - floatpart *= denominator; *numerator = (long)floatpart; return 0; } @@ -188,12 +201,18 @@ _PyTime_ObjectToDenominator(PyObject *obj, time_t *sec, long *numerator, } int -_PyTime_ObjectToTime_t(PyObject *obj, time_t *sec) +_PyTime_ObjectToTime_t(PyObject *obj, time_t *sec, _PyTime_round_t round) { if (PyFloat_Check(obj)) { double d, intpart, err; d = PyFloat_AsDouble(obj); + if (round == _PyTime_ROUND_UP) { + if (d >= 0) + d = ceil(d); + else + d = floor(d); + } (void)modf(d, &intpart); *sec = (time_t)intpart; @@ -213,15 +232,17 @@ _PyTime_ObjectToTime_t(PyObject *obj, time_t *sec) } int -_PyTime_ObjectToTimespec(PyObject *obj, time_t *sec, long *nsec) +_PyTime_ObjectToTimespec(PyObject *obj, time_t *sec, long *nsec, + _PyTime_round_t round) { - return _PyTime_ObjectToDenominator(obj, sec, nsec, 1e9); + return _PyTime_ObjectToDenominator(obj, sec, nsec, 1e9, round); } int -_PyTime_ObjectToTimeval(PyObject *obj, time_t *sec, long *usec) +_PyTime_ObjectToTimeval(PyObject *obj, time_t *sec, long *usec, + _PyTime_round_t round) { - return _PyTime_ObjectToDenominator(obj, sec, usec, 1e6); + return _PyTime_ObjectToDenominator(obj, sec, usec, 1e6, round); } void diff --git a/Python/random.c b/Python/random.c index 337be86..af3d0bd 100644 --- a/Python/random.c +++ b/Python/random.c @@ -3,6 +3,9 @@ #include <windows.h> #else #include <fcntl.h> +#ifdef HAVE_SYS_STAT_H +#include <sys/stat.h> +#endif #endif #ifdef Py_DEBUG @@ -12,43 +15,14 @@ static int _Py_HashSecret_Initialized = 0; #endif #ifdef MS_WINDOWS -typedef BOOL (WINAPI *CRYPTACQUIRECONTEXTA)(HCRYPTPROV *phProv,\ - LPCSTR pszContainer, LPCSTR pszProvider, DWORD dwProvType,\ - DWORD dwFlags ); -typedef BOOL (WINAPI *CRYPTGENRANDOM)(HCRYPTPROV hProv, DWORD dwLen,\ - BYTE *pbBuffer ); - -static CRYPTGENRANDOM pCryptGenRandom = NULL; -/* This handle is never explicitly released. Instead, the operating - system will release it when the process terminates. */ static HCRYPTPROV hCryptProv = 0; static int win32_urandom_init(int raise) { - HINSTANCE hAdvAPI32 = NULL; - CRYPTACQUIRECONTEXTA pCryptAcquireContext = NULL; - - /* Obtain handle to the DLL containing CryptoAPI. This should not fail. */ - hAdvAPI32 = GetModuleHandle("advapi32.dll"); - if(hAdvAPI32 == NULL) - goto error; - - /* Obtain pointers to the CryptoAPI functions. This will fail on some early - versions of Win95. */ - pCryptAcquireContext = (CRYPTACQUIRECONTEXTA)GetProcAddress( - hAdvAPI32, "CryptAcquireContextA"); - if (pCryptAcquireContext == NULL) - goto error; - - pCryptGenRandom = (CRYPTGENRANDOM)GetProcAddress(hAdvAPI32, - "CryptGenRandom"); - if (pCryptGenRandom == NULL) - goto error; - /* Acquire context */ - if (! pCryptAcquireContext(&hCryptProv, NULL, NULL, - PROV_RSA_FULL, CRYPT_VERIFYCONTEXT)) + if (!CryptAcquireContext(&hCryptProv, NULL, NULL, + PROV_RSA_FULL, CRYPT_VERIFYCONTEXT)) goto error; return 0; @@ -62,7 +36,7 @@ error: } /* Fill buffer with size pseudo-random bytes generated by the Windows CryptoGen - API. Return 0 on success, or -1 on error. */ + API. Return 0 on success, or raise an exception and return -1 on error. */ static int win32_urandom(unsigned char *buffer, Py_ssize_t size, int raise) { @@ -77,7 +51,7 @@ win32_urandom(unsigned char *buffer, Py_ssize_t size, int raise) while (size > 0) { chunk = size > INT_MAX ? INT_MAX : size; - if (!pCryptGenRandom(hCryptProv, chunk, buffer)) + if (!CryptGenRandom(hCryptProv, (DWORD)chunk, buffer)) { /* CryptGenRandom() failed */ if (raise) @@ -92,43 +66,64 @@ win32_urandom(unsigned char *buffer, Py_ssize_t size, int raise) } return 0; } -#endif /* MS_WINDOWS */ +/* Issue #25003: Don' use getentropy() on Solaris (available since + * Solaris 11.3), it is blocking whereas os.urandom() should not block. */ +#elif defined(HAVE_GETENTROPY) && !defined(sun) +#define PY_GETENTROPY 1 + +/* Fill buffer with size pseudo-random bytes generated by getentropy(). + Return 0 on success, or raise an exception and return -1 on error. -#ifdef __VMS -/* Use openssl random routine */ -#include <openssl/rand.h> + If fatal is nonzero, call Py_FatalError() instead of raising an exception + on error. */ static int -vms_urandom(unsigned char *buffer, Py_ssize_t size, int raise) +py_getentropy(unsigned char *buffer, Py_ssize_t size, int fatal) { - if (RAND_pseudo_bytes(buffer, size) < 0) { - if (raise) { - PyErr_Format(PyExc_ValueError, - "RAND_pseudo_bytes"); - } else { - Py_FatalError("Failed to initialize the randomized hash " - "secret using RAND_pseudo_bytes"); + while (size > 0) { + Py_ssize_t len = Py_MIN(size, 256); + int res; + + if (!fatal) { + Py_BEGIN_ALLOW_THREADS + res = getentropy(buffer, len); + Py_END_ALLOW_THREADS + + if (res < 0) { + PyErr_SetFromErrno(PyExc_OSError); + return -1; + } } - return -1; + else { + res = getentropy(buffer, len); + if (res < 0) + Py_FatalError("getentropy() failed"); + } + + buffer += len; + size -= len; } return 0; } -#endif /* __VMS */ - -#if !defined(MS_WINDOWS) && !defined(__VMS) +#else +static struct { + int fd; + dev_t st_dev; + ino_t st_ino; +} urandom_cache = { -1 }; /* Read size bytes from /dev/urandom into buffer. Call Py_FatalError() on error. */ static void -dev_urandom_noraise(char *buffer, Py_ssize_t size) +dev_urandom_noraise(unsigned char *buffer, Py_ssize_t size) { int fd; Py_ssize_t n; assert (0 < size); - fd = open("/dev/urandom", O_RDONLY); + fd = _Py_open("/dev/urandom", O_RDONLY); if (fd < 0) Py_FatalError("Failed to open /dev/urandom"); @@ -156,22 +151,56 @@ dev_urandom_python(char *buffer, Py_ssize_t size) { int fd; Py_ssize_t n; + struct stat st; if (size <= 0) return 0; - Py_BEGIN_ALLOW_THREADS - fd = open("/dev/urandom", O_RDONLY); - Py_END_ALLOW_THREADS - if (fd < 0) - { - if (errno == ENOENT || errno == ENXIO || - errno == ENODEV || errno == EACCES) - PyErr_SetString(PyExc_NotImplementedError, - "/dev/urandom (or equivalent) not found"); - else - PyErr_SetFromErrno(PyExc_OSError); - return -1; + if (urandom_cache.fd >= 0) { + /* Does the fd point to the same thing as before? (issue #21207) */ + if (fstat(urandom_cache.fd, &st) + || st.st_dev != urandom_cache.st_dev + || st.st_ino != urandom_cache.st_ino) { + /* Something changed: forget the cached fd (but don't close it, + since it probably points to something important for some + third-party code). */ + urandom_cache.fd = -1; + } + } + if (urandom_cache.fd >= 0) + fd = urandom_cache.fd; + else { + Py_BEGIN_ALLOW_THREADS + fd = _Py_open("/dev/urandom", O_RDONLY); + Py_END_ALLOW_THREADS + if (fd < 0) + { + if (errno == ENOENT || errno == ENXIO || + errno == ENODEV || errno == EACCES) + PyErr_SetString(PyExc_NotImplementedError, + "/dev/urandom (or equivalent) not found"); + else + PyErr_SetFromErrno(PyExc_OSError); + return -1; + } + if (urandom_cache.fd >= 0) { + /* urandom_fd was initialized by another thread while we were + not holding the GIL, keep it. */ + close(fd); + fd = urandom_cache.fd; + } + else { + if (fstat(fd, &st)) { + PyErr_SetFromErrno(PyExc_OSError); + close(fd); + return -1; + } + else { + urandom_cache.fd = fd; + urandom_cache.st_dev = st.st_dev; + urandom_cache.st_ino = st.st_ino; + } + } } Py_BEGIN_ALLOW_THREADS @@ -195,13 +224,21 @@ dev_urandom_python(char *buffer, Py_ssize_t size) PyErr_Format(PyExc_RuntimeError, "Failed to read %zi bytes from /dev/urandom", size); - close(fd); return -1; } - close(fd); return 0; } -#endif /* !defined(MS_WINDOWS) && !defined(__VMS) */ + +static void +dev_urandom_close(void) +{ + if (urandom_cache.fd >= 0) { + close(urandom_cache.fd); + urandom_cache.fd = -1; + } +} + +#endif /* HAVE_GETENTROPY */ /* Fill buffer with pseudo-random bytes generated by a linear congruent generator (LCG): @@ -225,7 +262,7 @@ lcg_urandom(unsigned int x0, unsigned char *buffer, size_t size) } /* Fill buffer with size pseudo-random bytes from the operating system random - number generator (RNG). It is suitable for for most cryptographic purposes + number generator (RNG). It is suitable for most cryptographic purposes except long living private keys for asymmetric encryption. Return 0 on success, raise an exception and return -1 on error. */ @@ -242,12 +279,10 @@ _PyOS_URandom(void *buffer, Py_ssize_t size) #ifdef MS_WINDOWS return win32_urandom((unsigned char *)buffer, size, 1); +#elif defined(PY_GETENTROPY) + return py_getentropy(buffer, size, 0); #else -# ifdef __VMS - return vms_urandom((unsigned char *)buffer, size, 1); -# else return dev_urandom_python((char*)buffer, size); -# endif #endif } @@ -255,8 +290,9 @@ void _PyRandom_Init(void) { char *env; - void *secret = &_Py_HashSecret; + unsigned char *secret = (unsigned char *)&_Py_HashSecret.uc; Py_ssize_t secret_size = sizeof(_Py_HashSecret_t); + assert(secret_size == sizeof(_Py_HashSecret.uc)); if (_Py_HashSecret_Initialized) return; @@ -284,18 +320,31 @@ _PyRandom_Init(void) memset(secret, 0, secret_size); } else { - lcg_urandom(seed, (unsigned char*)secret, secret_size); + lcg_urandom(seed, secret, secret_size); } } else { #ifdef MS_WINDOWS - (void)win32_urandom((unsigned char *)secret, secret_size, 0); -#else /* #ifdef MS_WINDOWS */ -# ifdef __VMS - vms_urandom((unsigned char *)secret, secret_size, 0); -# else - dev_urandom_noraise((char*)secret, secret_size); -# endif + (void)win32_urandom(secret, secret_size, 0); +#elif defined(PY_GETENTROPY) + (void)py_getentropy(secret, secret_size, 1); +#else + dev_urandom_noraise(secret, secret_size); #endif } } + +void +_PyRandom_Fini(void) +{ +#ifdef MS_WINDOWS + if (hCryptProv) { + CryptReleaseContext(hCryptProv, 0); + hCryptProv = 0; + } +#elif defined(PY_GETENTROPY) + /* nothing to clean */ +#else + dev_urandom_close(); +#endif +} diff --git a/Python/strdup.c b/Python/strdup.c index 20187e0..769d3db 100644 --- a/Python/strdup.c +++ b/Python/strdup.c @@ -6,7 +6,7 @@ char * strdup(const char *str) { if (str != NULL) { - register char *copy = malloc(strlen(str) + 1); + char *copy = malloc(strlen(str) + 1); if (copy != NULL) return strcpy(copy, str); } diff --git a/Python/symtable.c b/Python/symtable.c index 1e13b790..9512673 100644 --- a/Python/symtable.c +++ b/Python/symtable.c @@ -37,24 +37,14 @@ ste_new(struct symtable *st, identifier name, _Py_block_ty block, ste->ste_table = st; ste->ste_id = k; /* ste owns reference to k */ - ste->ste_name = name; Py_INCREF(name); + ste->ste_name = name; ste->ste_symbols = NULL; ste->ste_varnames = NULL; ste->ste_children = NULL; - ste->ste_symbols = PyDict_New(); - if (ste->ste_symbols == NULL) - goto fail; - - ste->ste_varnames = PyList_New(0); - if (ste->ste_varnames == NULL) - goto fail; - - ste->ste_children = PyList_New(0); - if (ste->ste_children == NULL) - goto fail; + ste->ste_directives = NULL; ste->ste_type = block; ste->ste_unoptimized = 0; @@ -75,6 +65,15 @@ ste_new(struct symtable *st, identifier name, _Py_block_ty block, ste->ste_child_free = 0; ste->ste_generator = 0; ste->ste_returns_value = 0; + ste->ste_needs_class_closure = 0; + + ste->ste_symbols = PyDict_New(); + ste->ste_varnames = PyList_New(0); + ste->ste_children = PyList_New(0); + if (ste->ste_symbols == NULL + || ste->ste_varnames == NULL + || ste->ste_children == NULL) + goto fail; if (PyDict_SetItem(st->st_blocks, ste->ste_id, (PyObject *)ste) < 0) goto fail; @@ -102,6 +101,7 @@ ste_dealloc(PySTEntryObject *ste) Py_XDECREF(ste->ste_symbols); Py_XDECREF(ste->ste_varnames); Py_XDECREF(ste->ste_children); + Py_XDECREF(ste->ste_directives); PyObject_Del(ste); } @@ -188,7 +188,7 @@ static int symtable_visit_withitem(struct symtable *st, withitem_ty item); static identifier top = NULL, lambda = NULL, genexpr = NULL, listcomp = NULL, setcomp = NULL, dictcomp = NULL, - __class__ = NULL, __locals__ = NULL; + __class__ = NULL; #define GET_IDENTIFIER(VAR) \ ((VAR) ? (VAR) : ((VAR) = PyUnicode_InternFromString(# VAR))) @@ -233,7 +233,7 @@ symtable_new(void) #define COMPILER_STACK_FRAME_SCALE 3 struct symtable * -PySymtable_Build(mod_ty mod, const char *filename, PyFutureFeatures *future) +PySymtable_BuildObject(mod_ty mod, PyObject *filename, PyFutureFeatures *future) { struct symtable *st = symtable_new(); asdl_seq *seq; @@ -242,7 +242,12 @@ PySymtable_Build(mod_ty mod, const char *filename, PyFutureFeatures *future) int recursion_limit = Py_GetRecursionLimit(); if (st == NULL) - return st; + return NULL; + if (filename == NULL) { + PySymtable_Free(st); + return NULL; + } + Py_INCREF(filename); st->st_filename = filename; st->st_future = future; @@ -306,9 +311,23 @@ PySymtable_Build(mod_ty mod, const char *filename, PyFutureFeatures *future) return NULL; } +struct symtable * +PySymtable_Build(mod_ty mod, const char *filename_str, PyFutureFeatures *future) +{ + PyObject *filename; + struct symtable *st; + filename = PyUnicode_DecodeFSDefault(filename_str); + if (filename == NULL) + return NULL; + st = PySymtable_BuildObject(mod, filename, future); + Py_DECREF(filename); + return st; +} + void PySymtable_Free(struct symtable *st) { + Py_XDECREF(st->st_filename); Py_XDECREF(st->st_blocks); Py_XDECREF(st->st_stack); PyMem_Free((void *)st); @@ -346,6 +365,24 @@ PyST_GetScope(PySTEntryObject *ste, PyObject *name) return (PyLong_AS_LONG(v) >> SCOPE_OFFSET) & SCOPE_MASK; } +static int +error_at_directive(PySTEntryObject *ste, PyObject *name) +{ + Py_ssize_t i; + PyObject *data; + assert(ste->ste_directives); + for (i = 0; ; i++) { + data = PyList_GET_ITEM(ste->ste_directives, i); + assert(PyTuple_CheckExact(data)); + if (PyTuple_GET_ITEM(data, 0) == name) + break; + } + PyErr_SyntaxLocationObject(ste->ste_table->st_filename, + PyLong_AsLong(PyTuple_GET_ITEM(data, 1)), + PyLong_AsLong(PyTuple_GET_ITEM(data, 2))); + return 0; +} + /* Analyze raw symbol information to determine scope of each name. @@ -420,16 +457,13 @@ analyze_name(PySTEntryObject *ste, PyObject *scopes, PyObject *name, long flags, PyErr_Format(PyExc_SyntaxError, "name '%U' is parameter and global", name); - PyErr_SyntaxLocationEx(ste->ste_table->st_filename, - ste->ste_lineno, ste->ste_col_offset); - - return 0; + return error_at_directive(ste, name); } if (flags & DEF_NONLOCAL) { PyErr_Format(PyExc_SyntaxError, "name '%U' is nonlocal and global", name); - return 0; + return error_at_directive(ste, name); } SET_SCOPE(scopes, name, GLOBAL_EXPLICIT); if (PySet_Add(global, name) < 0) @@ -443,19 +477,19 @@ analyze_name(PySTEntryObject *ste, PyObject *scopes, PyObject *name, long flags, PyErr_Format(PyExc_SyntaxError, "name '%U' is parameter and nonlocal", name); - return 0; + return error_at_directive(ste, name); } if (!bound) { PyErr_Format(PyExc_SyntaxError, "nonlocal declaration not allowed at module level"); - return 0; + return error_at_directive(ste, name); } if (!PySet_Contains(bound, name)) { PyErr_Format(PyExc_SyntaxError, "no binding for nonlocal '%U' found", name); - return 0; + return error_at_directive(ste, name); } SET_SCOPE(scopes, name, FREE); ste->ste_free = 1; @@ -500,13 +534,10 @@ analyze_name(PySTEntryObject *ste, PyObject *scopes, PyObject *name, long flags, Note that the current block's free variables are included in free. That's safe because no name can be free and local in the same scope. - - The 'restricted' argument may be set to a string to restrict the analysis - to the one variable whose name equals that string (e.g. "__class__"). */ static int -analyze_cells(PyObject *scopes, PyObject *free, const char *restricted) +analyze_cells(PyObject *scopes, PyObject *free) { PyObject *name, *v, *v_cell; int success = 0; @@ -523,9 +554,6 @@ analyze_cells(PyObject *scopes, PyObject *free, const char *restricted) continue; if (!PySet_Contains(free, name)) continue; - if (restricted != NULL && - PyUnicode_CompareWithASCIIString(name, restricted)) - continue; /* Replace LOCAL with CELL for this name, and remove from free. It is safe to replace the value of name in the dict, because it will not cause a resize. @@ -541,32 +569,18 @@ analyze_cells(PyObject *scopes, PyObject *free, const char *restricted) return success; } -/* Check for illegal statements in unoptimized namespaces */ static int -check_unoptimized(const PySTEntryObject* ste) { - const char* trailer; - - if (ste->ste_type != FunctionBlock || !ste->ste_unoptimized - || !(ste->ste_free || ste->ste_child_free)) - return 1; - - trailer = (ste->ste_child_free ? - "contains a nested function with free variables" : - "is a nested function"); - - switch (ste->ste_unoptimized) { - case OPT_TOPLEVEL: /* import * at top-level is fine */ - return 1; - case OPT_IMPORT_STAR: - PyErr_Format(PyExc_SyntaxError, - "import * is not allowed in function '%U' because it %s", - ste->ste_name, trailer); - break; - } - - PyErr_SyntaxLocationEx(ste->ste_table->st_filename, ste->ste_opt_lineno, - ste->ste_opt_col_offset); - return 0; +drop_class_free(PySTEntryObject *ste, PyObject *free) +{ + int res; + if (!GET_IDENTIFIER(__class__)) + return 0; + res = PySet_Discard(free, __class__); + if (res < 0) + return 0; + if (res) + ste->ste_needs_class_closure = 1; + return 1; } /* Enter the final scope information into the ste_symbols dict. @@ -771,7 +785,6 @@ analyze_block(PySTEntryObject *ste, PyObject *bound, PyObject *free, /* Special-case __class__ */ if (!GET_IDENTIFIER(__class__)) goto error; - assert(PySet_Contains(local, __class__) == 1); if (PySet_Add(newbound, __class__) < 0) goto error; } @@ -804,18 +817,14 @@ analyze_block(PySTEntryObject *ste, PyObject *bound, PyObject *free, Py_DECREF(temp); /* Check if any local variables must be converted to cell variables */ - if (ste->ste_type == FunctionBlock && !analyze_cells(scopes, newfree, - NULL)) + if (ste->ste_type == FunctionBlock && !analyze_cells(scopes, newfree)) goto error; - else if (ste->ste_type == ClassBlock && !analyze_cells(scopes, newfree, - "__class__")) + else if (ste->ste_type == ClassBlock && !drop_class_free(ste, newfree)) goto error; /* Records the results of the analysis in the symbol table entry */ if (!update_symbols(ste->ste_symbols, scopes, bound, newfree, ste->ste_type == ClassBlock)) goto error; - if (!check_unoptimized(ste)) - goto error; temp = PyNumber_InPlaceOr(free, newfree); if (!temp) @@ -899,15 +908,20 @@ symtable_analyze(struct symtable *st) static int symtable_warn(struct symtable *st, char *msg, int lineno) { - if (PyErr_WarnExplicit(PyExc_SyntaxWarning, msg, st->st_filename, - lineno, NULL, NULL) < 0) { + PyObject *message = PyUnicode_FromString(msg); + if (message == NULL) + return 0; + if (PyErr_WarnExplicitObject(PyExc_SyntaxWarning, message, st->st_filename, + lineno, NULL, NULL) < 0) { + Py_DECREF(message); if (PyErr_ExceptionMatches(PyExc_SyntaxWarning)) { PyErr_SetString(PyExc_SyntaxError, msg); - PyErr_SyntaxLocationEx(st->st_filename, st->st_cur->ste_lineno, - st->st_cur->ste_col_offset); + PyErr_SyntaxLocationObject(st->st_filename, st->st_cur->ste_lineno, + st->st_cur->ste_col_offset); } return 0; } + Py_DECREF(message); return 1; } @@ -990,9 +1004,9 @@ symtable_add_def(struct symtable *st, PyObject *name, int flag) if ((flag & DEF_PARAM) && (val & DEF_PARAM)) { /* Is it better to use 'mangled' or 'name' here? */ PyErr_Format(PyExc_SyntaxError, DUPLICATE_ARGUMENT, name); - PyErr_SyntaxLocationEx(st->st_filename, - st->st_cur->ste_lineno, - st->st_cur->ste_col_offset); + PyErr_SyntaxLocationObject(st->st_filename, + st->st_cur->ste_lineno, + st->st_cur->ste_col_offset); goto error; } val |= flag; @@ -1102,6 +1116,25 @@ symtable_new_tmpname(struct symtable *st) static int +symtable_record_directive(struct symtable *st, identifier name, stmt_ty s) +{ + PyObject *data; + int res; + if (!st->st_cur->ste_directives) { + st->st_cur->ste_directives = PyList_New(0); + if (!st->st_cur->ste_directives) + return 0; + } + data = Py_BuildValue("(Oii)", name, s->lineno, s->col_offset); + if (!data) + return 0; + res = PyList_Append(st->st_cur->ste_directives, data); + Py_DECREF(data); + return res == 0; +} + + +static int symtable_visit_stmt(struct symtable *st, stmt_ty s) { if (++st->recursion_depth > st->recursion_limit) { @@ -1146,13 +1179,6 @@ symtable_visit_stmt(struct symtable *st, stmt_ty s) if (!symtable_enter_block(st, s->v.ClassDef.name, ClassBlock, (void *)s, s->lineno, s->col_offset)) VISIT_QUIT(st, 0); - if (!GET_IDENTIFIER(__class__) || - !symtable_add_def(st, __class__, DEF_LOCAL) || - !GET_IDENTIFIER(__locals__) || - !symtable_add_def(st, __locals__, DEF_PARAM)) { - symtable_exit_block(st, s); - VISIT_QUIT(st, 0); - } tmp = st->st_private; st->st_private = s->v.ClassDef.name; VISIT_SEQ(st, stmt, s->v.ClassDef.body); @@ -1240,14 +1266,7 @@ symtable_visit_stmt(struct symtable *st, stmt_ty s) asdl_seq *seq = s->v.Global.names; for (i = 0; i < asdl_seq_LEN(seq); i++) { identifier name = (identifier)asdl_seq_GET(seq, i); - long cur; - if (st->st_cur->ste_type == ClassBlock && - !PyUnicode_CompareWithASCIIString(name, "__class__")) { - PyErr_SetString(PyExc_SyntaxError, "cannot make __class__ global"); - PyErr_SyntaxLocationEx(st->st_filename, s->lineno, s->col_offset); - return 0; - } - cur = symtable_lookup(st, name); + long cur = symtable_lookup(st, name); if (cur < 0) VISIT_QUIT(st, 0); if (cur & (DEF_LOCAL | USE)) { @@ -1268,6 +1287,8 @@ symtable_visit_stmt(struct symtable *st, stmt_ty s) } if (!symtable_add_def(st, name, DEF_GLOBAL)) VISIT_QUIT(st, 0); + if (!symtable_record_directive(st, name, s)) + VISIT_QUIT(st, 0); } break; } @@ -1297,6 +1318,8 @@ symtable_visit_stmt(struct symtable *st, stmt_ty s) } if (!symtable_add_def(st, name, DEF_NONLOCAL)) VISIT_QUIT(st, 0); + if (!symtable_record_directive(st, name, s)) + VISIT_QUIT(st, 0); } break; } @@ -1407,6 +1430,7 @@ symtable_visit_expr(struct symtable *st, expr_ty e) case Str_kind: case Bytes_kind: case Ellipsis_kind: + case NameConstant_kind: /* Nothing to do here. */ break; /* The following exprs can be assignment targets. */ @@ -1499,10 +1523,10 @@ symtable_visit_annotations(struct symtable *st, stmt_ty s) if (a->args && !symtable_visit_argannotations(st, a->args)) return 0; - if (a->varargannotation) - VISIT(st, expr, a->varargannotation); - if (a->kwargannotation) - VISIT(st, expr, a->kwargannotation); + if (a->vararg && a->vararg->annotation) + VISIT(st, expr, a->vararg->annotation); + if (a->kwarg && a->kwarg->annotation) + VISIT(st, expr, a->kwarg->annotation); if (a->kwonlyargs && !symtable_visit_argannotations(st, a->kwonlyargs)) return 0; if (s->v.FunctionDef.returns) @@ -1521,12 +1545,12 @@ symtable_visit_arguments(struct symtable *st, arguments_ty a) if (a->kwonlyargs && !symtable_visit_params(st, a->kwonlyargs)) return 0; if (a->vararg) { - if (!symtable_add_def(st, a->vararg, DEF_PARAM)) + if (!symtable_add_def(st, a->vararg->arg, DEF_PARAM)) return 0; st->st_cur->ste_varargs = 1; } if (a->kwarg) { - if (!symtable_add_def(st, a->kwarg, DEF_PARAM)) + if (!symtable_add_def(st, a->kwarg->arg, DEF_PARAM)) return 0; st->st_cur->ste_varkeywords = 1; } @@ -1587,7 +1611,7 @@ symtable_visit_alias(struct symtable *st, alias_ty a) int lineno = st->st_cur->ste_lineno; int col_offset = st->st_cur->ste_col_offset; PyErr_SetString(PyExc_SyntaxError, IMPORT_STAR_WARNING); - PyErr_SyntaxLocationEx(st->st_filename, lineno, col_offset); + PyErr_SyntaxLocationObject(st->st_filename, lineno, col_offset); Py_DECREF(store_name); return 0; } diff --git a/Python/sysmodule.c b/Python/sysmodule.c index 2f700e6..290eec1 100644 --- a/Python/sysmodule.c +++ b/Python/sysmodule.c @@ -32,15 +32,31 @@ extern void *PyWin_DLLhModule; extern const char *PyWin_DLLVersionString; #endif -#ifdef __VMS -#include <unixlib.h> -#endif - #ifdef HAVE_LANGINFO_H #include <locale.h> #include <langinfo.h> #endif +_Py_IDENTIFIER(_); +_Py_IDENTIFIER(__sizeof__); +_Py_IDENTIFIER(buffer); +_Py_IDENTIFIER(builtins); +_Py_IDENTIFIER(encoding); +_Py_IDENTIFIER(path); +_Py_IDENTIFIER(stdout); +_Py_IDENTIFIER(stderr); +_Py_IDENTIFIER(write); + +PyObject * +_PySys_GetObjectId(_Py_Identifier *key) +{ + PyThreadState *tstate = PyThreadState_GET(); + PyObject *sd = tstate->interp->sysdict; + if (sd == NULL) + return NULL; + return _PyDict_GetItemId(sd, key); +} + PyObject * PySys_GetObject(const char *name) { @@ -52,6 +68,21 @@ PySys_GetObject(const char *name) } int +_PySys_SetObjectId(_Py_Identifier *key, PyObject *v) +{ + PyThreadState *tstate = PyThreadState_GET(); + PyObject *sd = tstate->interp->sysdict; + if (v == NULL) { + if (_PyDict_GetItemId(sd, key) == NULL) + return 0; + else + return _PyDict_DelItemId(sd, key); + } + else + return _PyDict_SetItemId(sd, key, v); +} + +int PySys_SetObject(const char *name, PyObject *v) { PyThreadState *tstate = PyThreadState_GET(); @@ -79,8 +110,6 @@ sys_displayhook_unencodable(PyObject *outf, PyObject *o) PyObject *encoded, *escaped_str, *repr_str, *buffer, *result; char *stdout_encoding_str; int ret; - _Py_IDENTIFIER(encoding); - _Py_IDENTIFIER(buffer); stdout_encoding = _PyObject_GetAttrId(outf, &PyId_encoding); if (stdout_encoding == NULL) @@ -101,7 +130,6 @@ sys_displayhook_unencodable(PyObject *outf, PyObject *o) buffer = _PyObject_GetAttrId(outf, &PyId_buffer); if (buffer) { - _Py_IDENTIFIER(write); result = _PyObject_CallMethodId(buffer, &PyId_write, "(O)", encoded); Py_DECREF(buffer); Py_DECREF(encoded); @@ -137,10 +165,11 @@ sys_displayhook(PyObject *self, PyObject *o) PyObject *outf; PyInterpreterState *interp = PyThreadState_GET()->interp; PyObject *modules = interp->modules; - PyObject *builtins = PyDict_GetItemString(modules, "builtins"); + PyObject *builtins; + static PyObject *newline = NULL; int err; - _Py_IDENTIFIER(_); + builtins = _PyDict_GetItemId(modules, &PyId_builtins); if (builtins == NULL) { PyErr_SetString(PyExc_RuntimeError, "lost builtins module"); return NULL; @@ -155,7 +184,7 @@ sys_displayhook(PyObject *self, PyObject *o) } if (_PyObject_SetAttrId(builtins, &PyId__, Py_None) != 0) return NULL; - outf = PySys_GetObject("stdout"); + outf = _PySys_GetObjectId(&PyId_stdout); if (outf == NULL || outf == Py_None) { PyErr_SetString(PyExc_RuntimeError, "lost sys.stdout"); return NULL; @@ -173,7 +202,12 @@ sys_displayhook(PyObject *self, PyObject *o) return NULL; } } - if (PyFile_WriteString("\n", outf) != 0) + if (newline == NULL) { + newline = PyUnicode_FromString("\n"); + if (newline == NULL) + return NULL; + } + if (PyFile_WriteObject(newline, outf, Py_PRINT_RAW) != 0) return NULL; if (_PyObject_SetAttrId(builtins, &PyId__, o) != 0) return NULL; @@ -329,15 +363,19 @@ trace_init(void) static PyObject * -call_trampoline(PyThreadState *tstate, PyObject* callback, +call_trampoline(PyObject* callback, PyFrameObject *frame, int what, PyObject *arg) { - PyObject *args = PyTuple_New(3); + PyObject *args; PyObject *whatstr; PyObject *result; + args = PyTuple_New(3); if (args == NULL) return NULL; + if (PyFrame_FastToLocalsWithError(frame) < 0) + return NULL; + Py_INCREF(frame); whatstr = whatstrings[what]; Py_INCREF(whatstr); @@ -349,7 +387,6 @@ call_trampoline(PyThreadState *tstate, PyObject* callback, PyTuple_SET_ITEM(args, 2, arg); /* call the Python-level function */ - PyFrame_FastToLocals(frame); result = PyEval_CallObject(callback, args); PyFrame_LocalsToFast(frame, 1); if (result == NULL) @@ -364,12 +401,11 @@ static int profile_trampoline(PyObject *self, PyFrameObject *frame, int what, PyObject *arg) { - PyThreadState *tstate = frame->f_tstate; PyObject *result; if (arg == NULL) arg = Py_None; - result = call_trampoline(tstate, self, frame, what, arg); + result = call_trampoline(self, frame, what, arg); if (result == NULL) { PyEval_SetProfile(NULL, NULL); return -1; @@ -382,7 +418,6 @@ static int trace_trampoline(PyObject *self, PyFrameObject *frame, int what, PyObject *arg) { - PyThreadState *tstate = frame->f_tstate; PyObject *callback; PyObject *result; @@ -392,7 +427,7 @@ trace_trampoline(PyObject *self, PyFrameObject *frame, callback = frame->f_trace; if (callback == NULL) return 0; - result = call_trampoline(tstate, callback, frame, what, arg); + result = call_trampoline(callback, frame, what, arg); if (result == NULL) { PyEval_SetTrace(NULL, NULL); Py_CLEAR(frame->f_trace); @@ -616,7 +651,7 @@ PyDoc_STRVAR(hash_info_doc, "hash_info\n\ \n\ A struct sequence providing parameters used for computing\n\ -numeric hashes. The attributes are read only."); +hashes. The attributes are read only."); static PyStructSequence_Field hash_info_fields[] = { {"width", "width of the type used for hashing, in bits"}, @@ -625,6 +660,11 @@ static PyStructSequence_Field hash_info_fields[] = { {"inf", "value to be used for hash of a positive infinity"}, {"nan", "value to be used for hash of a nan"}, {"imag", "multiplier used for the imaginary part of a complex number"}, + {"algorithm", "name of the algorithm for hashing of str, bytes and " + "memoryviews"}, + {"hash_bits", "internal output size of hash algorithm"}, + {"seed_bits", "seed size of hash algorithm"}, + {"cutoff", "small string optimization cutoff"}, {NULL, NULL} }; @@ -632,7 +672,7 @@ static PyStructSequence_Desc hash_info_desc = { "sys.hash_info", hash_info_doc, hash_info_fields, - 5, + 9, }; static PyObject * @@ -640,9 +680,11 @@ get_hash_info(void) { PyObject *hash_info; int field = 0; + PyHash_FuncDef *hashfunc; hash_info = PyStructSequence_New(&Hash_InfoType); if (hash_info == NULL) return NULL; + hashfunc = PyHash_GetFuncDef(); PyStructSequence_SET_ITEM(hash_info, field++, PyLong_FromLong(8*sizeof(Py_hash_t))); PyStructSequence_SET_ITEM(hash_info, field++, @@ -653,6 +695,14 @@ get_hash_info(void) PyLong_FromLong(_PyHASH_NAN)); PyStructSequence_SET_ITEM(hash_info, field++, PyLong_FromLong(_PyHASH_IMAG)); + PyStructSequence_SET_ITEM(hash_info, field++, + PyUnicode_FromString(hashfunc->name)); + PyStructSequence_SET_ITEM(hash_info, field++, + PyLong_FromLong(hashfunc->hash_bits)); + PyStructSequence_SET_ITEM(hash_info, field++, + PyLong_FromLong(hashfunc->seed_bits)); + PyStructSequence_SET_ITEM(hash_info, field++, + PyLong_FromLong(Py_HASH_CUTOFF)); if (PyErr_Occurred()) { Py_CLEAR(hash_info); return NULL; @@ -777,7 +827,7 @@ Set the flags used by the interpreter for dlopen calls, such as when the\n\ interpreter loads extension modules. Among other things, this will enable\n\ a lazy resolving of symbols when importing a module, if called as\n\ sys.setdlopenflags(0). To share symbols across extension modules, call as\n\ -sys.setdlopenflags(ctypes.RTLD_GLOBAL). Symbolic names for the flag modules\n\ +sys.setdlopenflags(os.RTLD_GLOBAL). Symbolic names for the flag modules\n\ can be found in the os module (RTLD_xxx constants, e.g. os.RTLD_LAZY)."); static PyObject * @@ -793,7 +843,7 @@ PyDoc_STRVAR(getdlopenflags_doc, "getdlopenflags() -> int\n\ \n\ Return the current value of the flags that are used for dlopen calls.\n\ -The flag constants are defined in the ctypes and DLFCN modules."); +The flag constants are defined in the os module."); #endif /* HAVE_DLOPEN */ @@ -813,30 +863,16 @@ sys_mdebug(PyObject *self, PyObject *args) } #endif /* USE_MALLOPT */ -static PyObject * -sys_getsizeof(PyObject *self, PyObject *args, PyObject *kwds) +size_t +_PySys_GetSizeOf(PyObject *o) { PyObject *res = NULL; - static PyObject *gc_head_size = NULL; - static char *kwlist[] = {"object", "default", 0}; - PyObject *o, *dflt = NULL; PyObject *method; - _Py_IDENTIFIER(__sizeof__); - - if (!PyArg_ParseTupleAndKeywords(args, kwds, "O|O:getsizeof", - kwlist, &o, &dflt)) - return NULL; - - /* Initialize static variable for GC head size */ - if (gc_head_size == NULL) { - gc_head_size = PyLong_FromSsize_t(sizeof(PyGC_Head)); - if (gc_head_size == NULL) - return NULL; - } + Py_ssize_t size; /* Make sure the type is initialized. float gets initialized late */ if (PyType_Ready(Py_TYPE(o)) < 0) - return NULL; + return (size_t)-1; method = _PyObject_LookupSpecial(o, &PyId___sizeof__); if (method == NULL) { @@ -850,24 +886,50 @@ sys_getsizeof(PyObject *self, PyObject *args, PyObject *kwds) Py_DECREF(method); } - /* Has a default value been given */ - if ((res == NULL) && (dflt != NULL) && - PyErr_ExceptionMatches(PyExc_TypeError)) - { - PyErr_Clear(); - Py_INCREF(dflt); - return dflt; + if (res == NULL) + return (size_t)-1; + + size = PyLong_AsSsize_t(res); + Py_DECREF(res); + if (size == -1 && PyErr_Occurred()) + return (size_t)-1; + + if (size < 0) { + PyErr_SetString(PyExc_ValueError, "__sizeof__() should return >= 0"); + return (size_t)-1; } - else if (res == NULL) - return res; /* add gc_head size */ - if (PyObject_IS_GC(o)) { - PyObject *tmp = res; - res = PyNumber_Add(tmp, gc_head_size); - Py_DECREF(tmp); + if (PyObject_IS_GC(o)) + return ((size_t)size) + sizeof(PyGC_Head); + return (size_t)size; +} + +static PyObject * +sys_getsizeof(PyObject *self, PyObject *args, PyObject *kwds) +{ + static char *kwlist[] = {"object", "default", 0}; + size_t size; + PyObject *o, *dflt = NULL; + + if (!PyArg_ParseTupleAndKeywords(args, kwds, "O|O:getsizeof", + kwlist, &o, &dflt)) + return NULL; + + size = _PySys_GetSizeOf(o); + + if (size == (size_t)-1 && PyErr_Occurred()) { + /* Has a default value been given */ + if (dflt != NULL && PyErr_ExceptionMatches(PyExc_TypeError)) { + PyErr_Clear(); + Py_INCREF(dflt); + return dflt; + } + else + return NULL; } - return res; + + return PyLong_FromSize_t(size); } PyDoc_STRVAR(getsizeof_doc, @@ -897,6 +959,19 @@ one higher than you might expect, because it includes the (temporary)\n\ reference as an argument to getrefcount()." ); +static PyObject * +sys_getallocatedblocks(PyObject *self) +{ + return PyLong_FromSsize_t(_Py_GetAllocatedBlocks()); +} + +PyDoc_STRVAR(getallocatedblocks_doc, +"getallocatedblocks() -> integer\n\ +\n\ +Return the number of memory blocks currently allocated, regardless of their\n\ +size." +); + #ifdef COUNT_ALLOCS static PyObject * sys_getcounts(PyObject *self) @@ -1065,6 +1140,8 @@ static PyMethodDef sys_methods[] = { {"getdlopenflags", (PyCFunction)sys_getdlopenflags, METH_NOARGS, getdlopenflags_doc}, #endif + {"getallocatedblocks", (PyCFunction)sys_getallocatedblocks, METH_NOARGS, + getallocatedblocks_doc}, #ifdef COUNT_ALLOCS {"getcounts", (PyCFunction)sys_getcounts, METH_NOARGS}, #endif @@ -1117,7 +1194,7 @@ static PyMethodDef sys_methods[] = { {"settrace", sys_settrace, METH_O, settrace_doc}, {"gettrace", sys_gettrace, METH_NOARGS, gettrace_doc}, {"call_tracing", sys_call_tracing, METH_VARARGS, call_tracing_doc}, - {"_debugmallocstats", sys_debugmallocstats, METH_VARARGS, + {"_debugmallocstats", sys_debugmallocstats, METH_NOARGS, debugmallocstats_doc}, {NULL, NULL} /* sentinel */ }; @@ -1286,11 +1363,12 @@ exec_prefix -- prefix used to find the machine-specific Python library\n\ executable -- absolute path of the executable binary of the Python interpreter\n\ float_info -- a struct sequence with information about the float implementation.\n\ float_repr_style -- string indicating the style of repr() output for floats\n\ +hash_info -- a struct sequence with information about the hash algorithm.\n\ hexversion -- version information encoded as a single integer\n\ implementation -- Python implementation information.\n\ int_info -- a struct sequence with information about the int implementation.\n\ maxsize -- the largest supported length of containers.\n\ -maxunicode -- the value of the largest Unicode codepoint\n\ +maxunicode -- the value of the largest Unicode code point\n\ platform -- platform identifier\n\ prefix -- prefix used to find the Python library\n\ thread_info -- a struct sequence with information about the thread implementation.\n\ @@ -1352,14 +1430,12 @@ static PyStructSequence_Field flags_fields[] = { {"no_site", "-S"}, {"ignore_environment", "-E"}, {"verbose", "-v"}, -#ifdef RISCOS - {"riscos_wimp", "???"}, -#endif /* {"unbuffered", "-u"}, */ /* {"skip_first", "-x"}, */ {"bytes_warning", "-b"}, {"quiet", "-q"}, {"hash_randomization", "-R"}, + {"isolated", "-I"}, {0} }; @@ -1367,11 +1443,7 @@ static PyStructSequence_Desc flags_desc = { "sys.flags", /* name */ flags__doc__, /* doc */ flags_fields, /* fields */ -#ifdef RISCOS 13 -#else - 12 -#endif }; static PyObject* @@ -1396,14 +1468,12 @@ make_flags(void) SetFlag(Py_NoSiteFlag); SetFlag(Py_IgnoreEnvironmentFlag); SetFlag(Py_VerboseFlag); -#ifdef RISCOS - SetFlag(Py_RISCOSWimpFlag); -#endif /* SetFlag(saw_unbuffered_flag); */ /* SetFlag(skipfirstline); */ SetFlag(Py_BytesWarningFlag); SetFlag(Py_QuietFlag); SetFlag(Py_HashRandomizationFlag); + SetFlag(Py_IsolatedFlag); #undef SetFlag if (PyErr_Occurred()) { @@ -1489,7 +1559,7 @@ const char *_PySys_ImplName = NAME; #define STRIFY(name) QUOTE(name) #define MAJOR STRIFY(PY_MAJOR_VERSION) #define MINOR STRIFY(PY_MINOR_VERSION) -#define TAG NAME "-" MAJOR MINOR; +#define TAG NAME "-" MAJOR MINOR const char *_PySys_ImplCacheTag = TAG; #undef NAME #undef QUOTE @@ -1564,18 +1634,34 @@ static struct PyModuleDef sysmodule = { PyObject * _PySys_Init(void) { - PyObject *m, *v, *sysdict, *version_info; - char *s; + PyObject *m, *sysdict, *version_info; + int res; m = PyModule_Create(&sysmodule); if (m == NULL) return NULL; sysdict = PyModule_GetDict(m); -#define SET_SYS_FROM_STRING(key, value) \ - v = value; \ - if (v != NULL) \ - PyDict_SetItemString(sysdict, key, v); \ - Py_XDECREF(v) +#define SET_SYS_FROM_STRING_BORROW(key, value) \ + do { \ + PyObject *v = (value); \ + if (v == NULL) \ + return NULL; \ + res = PyDict_SetItemString(sysdict, key, v); \ + if (res < 0) { \ + return NULL; \ + } \ + } while (0) +#define SET_SYS_FROM_STRING(key, value) \ + do { \ + PyObject *v = (value); \ + if (v == NULL) \ + return NULL; \ + res = PyDict_SetItemString(sysdict, key, v); \ + Py_DECREF(v); \ + if (res < 0) { \ + return NULL; \ + } \ + } while (0) /* Check that stdin is not a directory Using shell redirection, you can redirect stdin to a directory, @@ -1597,10 +1683,10 @@ _PySys_Init(void) /* stdin/stdout/stderr are now set by pythonrun.c */ - PyDict_SetItemString(sysdict, "__displayhook__", - PyDict_GetItemString(sysdict, "displayhook")); - PyDict_SetItemString(sysdict, "__excepthook__", - PyDict_GetItemString(sysdict, "excepthook")); + SET_SYS_FROM_STRING_BORROW("__displayhook__", + PyDict_GetItemString(sysdict, "displayhook")); + SET_SYS_FROM_STRING_BORROW("__excepthook__", + PyDict_GetItemString(sysdict, "excepthook")); SET_SYS_FROM_STRING("version", PyUnicode_FromString(Py_GetVersion())); SET_SYS_FROM_STRING("hexversion", @@ -1634,28 +1720,24 @@ _PySys_Init(void) SET_SYS_FROM_STRING("int_info", PyLong_GetInfo()); /* initialize hash_info */ - if (Hash_InfoType.tp_name == 0) - PyStructSequence_InitType(&Hash_InfoType, &hash_info_desc); + if (Hash_InfoType.tp_name == NULL) { + if (PyStructSequence_InitType2(&Hash_InfoType, &hash_info_desc) < 0) + return NULL; + } SET_SYS_FROM_STRING("hash_info", get_hash_info()); SET_SYS_FROM_STRING("maxunicode", PyLong_FromLong(0x10FFFF)); SET_SYS_FROM_STRING("builtin_module_names", list_builtin_module_names()); - { - /* Assumes that longs are at least 2 bytes long. - Should be safe! */ - unsigned long number = 1; - char *value; - - s = (char *) &number; - if (s[0] == 0) - value = "big"; - else - value = "little"; - SET_SYS_FROM_STRING("byteorder", - PyUnicode_FromString(value)); - } +#if PY_BIG_ENDIAN + SET_SYS_FROM_STRING("byteorder", + PyUnicode_FromString("big")); +#else + SET_SYS_FROM_STRING("byteorder", + PyUnicode_FromString("little")); +#endif + #ifdef MS_COREDLL SET_SYS_FROM_STRING("dllhandle", PyLong_FromVoidPtr(PyWin_DLLhModule)); @@ -1668,47 +1750,59 @@ _PySys_Init(void) #endif if (warnoptions == NULL) { warnoptions = PyList_New(0); + if (warnoptions == NULL) + return NULL; } else { Py_INCREF(warnoptions); } - if (warnoptions != NULL) { - PyDict_SetItemString(sysdict, "warnoptions", warnoptions); - } + SET_SYS_FROM_STRING_BORROW("warnoptions", warnoptions); - v = get_xoptions(); - if (v != NULL) { - PyDict_SetItemString(sysdict, "_xoptions", v); - } + SET_SYS_FROM_STRING_BORROW("_xoptions", get_xoptions()); /* version_info */ - if (VersionInfoType.tp_name == 0) - PyStructSequence_InitType(&VersionInfoType, &version_info_desc); + if (VersionInfoType.tp_name == NULL) { + if (PyStructSequence_InitType2(&VersionInfoType, + &version_info_desc) < 0) + return NULL; + } version_info = make_version_info(); SET_SYS_FROM_STRING("version_info", version_info); /* prevent user from creating new instances */ VersionInfoType.tp_init = NULL; VersionInfoType.tp_new = NULL; + res = PyDict_DelItemString(VersionInfoType.tp_dict, "__new__"); + if (res < 0 && PyErr_ExceptionMatches(PyExc_KeyError)) + PyErr_Clear(); /* implementation */ SET_SYS_FROM_STRING("implementation", make_impl_info(version_info)); /* flags */ - if (FlagsType.tp_name == 0) - PyStructSequence_InitType(&FlagsType, &flags_desc); + if (FlagsType.tp_name == 0) { + if (PyStructSequence_InitType2(&FlagsType, &flags_desc) < 0) + return NULL; + } SET_SYS_FROM_STRING("flags", make_flags()); /* prevent user from creating new instances */ FlagsType.tp_init = NULL; FlagsType.tp_new = NULL; - + res = PyDict_DelItemString(FlagsType.tp_dict, "__new__"); + if (res < 0 && PyErr_ExceptionMatches(PyExc_KeyError)) + PyErr_Clear(); #if defined(MS_WINDOWS) /* getwindowsversion */ if (WindowsVersionType.tp_name == 0) - PyStructSequence_InitType(&WindowsVersionType, &windows_version_desc); + if (PyStructSequence_InitType2(&WindowsVersionType, + &windows_version_desc) < 0) + return NULL; /* prevent user from creating new instances */ WindowsVersionType.tp_init = NULL; WindowsVersionType.tp_new = NULL; + res = PyDict_DelItemString(WindowsVersionType.tp_dict, "__new__"); + if (res < 0 && PyErr_ExceptionMatches(PyExc_KeyError)) + PyErr_Clear(); #endif /* float repr style: 0.03 (short) vs 0.029999999999999999 (legacy) */ @@ -1725,6 +1819,7 @@ _PySys_Init(void) #endif #undef SET_SYS_FROM_STRING +#undef SET_SYS_FROM_STRING_BORROW if (PyErr_Occurred()) return NULL; return m; @@ -1769,7 +1864,7 @@ PySys_SetPath(const wchar_t *path) PyObject *v; if ((v = makepathobject(path, DELIM)) == NULL) Py_FatalError("can't create sys.path"); - if (PySys_SetObject("path", v) != 0) + if (_PySys_SetObjectId(&PyId_path, v) != 0) Py_FatalError("can't assign sys.path"); Py_DECREF(v); } @@ -1788,22 +1883,7 @@ makeargvobject(int argc, wchar_t **argv) if (av != NULL) { int i; for (i = 0; i < argc; i++) { -#ifdef __VMS - PyObject *v; - - /* argv[0] is the script pathname if known */ - if (i == 0) { - char* fn = decc$translate_vms(argv[0]); - if ((fn == (char *)0) || fn == (char *)-1) - v = PyUnicode_FromString(argv[0]); - else - v = PyUnicode_FromString( - decc$translate_vms(argv[0])); - } else - v = PyUnicode_FromString(argv[i]); -#else PyObject *v = PyUnicode_FromWideChar(argv[i], -1); -#endif if (v == NULL) { Py_DECREF(av); av = NULL; @@ -1838,7 +1918,7 @@ sys_update_path(int argc, wchar_t **argv) wchar_t fullpath[MAX_PATH]; #endif - path = PySys_GetObject("path"); + path = _PySys_GetObjectId(&PyId_path); if (path == NULL) return; @@ -1937,7 +2017,7 @@ PySys_SetArgvEx(int argc, wchar_t **argv, int updatepath) void PySys_SetArgv(int argc, wchar_t **argv) { - PySys_SetArgvEx(argc, argv, 1); + PySys_SetArgvEx(argc, argv, Py_IsolatedFlag == 0); } /* Reimplementation of PyFile_WriteString() no calling indirectly @@ -1948,7 +2028,6 @@ sys_pyfile_write_unicode(PyObject *unicode, PyObject *file) { PyObject *writer = NULL, *args = NULL, *result = NULL; int err; - _Py_IDENTIFIER(write); if (file == NULL) return -1; @@ -2025,7 +2104,7 @@ sys_pyfile_write(const char *text, PyObject *file) */ static void -sys_write(char *name, FILE *fp, const char *format, va_list va) +sys_write(_Py_Identifier *key, FILE *fp, const char *format, va_list va) { PyObject *file; PyObject *error_type, *error_value, *error_traceback; @@ -2033,7 +2112,7 @@ sys_write(char *name, FILE *fp, const char *format, va_list va) int written; PyErr_Fetch(&error_type, &error_value, &error_traceback); - file = PySys_GetObject(name); + file = _PySys_GetObjectId(key); written = PyOS_vsnprintf(buffer, sizeof(buffer), format, va); if (sys_pyfile_write(buffer, file) != 0) { PyErr_Clear(); @@ -2053,7 +2132,7 @@ PySys_WriteStdout(const char *format, ...) va_list va; va_start(va, format); - sys_write("stdout", stdout, format, va); + sys_write(&PyId_stdout, stdout, format, va); va_end(va); } @@ -2063,19 +2142,19 @@ PySys_WriteStderr(const char *format, ...) va_list va; va_start(va, format); - sys_write("stderr", stderr, format, va); + sys_write(&PyId_stderr, stderr, format, va); va_end(va); } static void -sys_format(char *name, FILE *fp, const char *format, va_list va) +sys_format(_Py_Identifier *key, FILE *fp, const char *format, va_list va) { PyObject *file, *message; PyObject *error_type, *error_value, *error_traceback; char *utf8; PyErr_Fetch(&error_type, &error_value, &error_traceback); - file = PySys_GetObject(name); + file = _PySys_GetObjectId(key); message = PyUnicode_FromFormatV(format, va); if (message != NULL) { if (sys_pyfile_write_unicode(message, file) != 0) { @@ -2095,7 +2174,7 @@ PySys_FormatStdout(const char *format, ...) va_list va; va_start(va, format); - sys_format("stdout", stdout, format, va); + sys_format(&PyId_stdout, stdout, format, va); va_end(va); } @@ -2105,6 +2184,6 @@ PySys_FormatStderr(const char *format, ...) va_list va; va_start(va, format); - sys_format("stderr", stderr, format, va); + sys_format(&PyId_stderr, stderr, format, va); va_end(va); } diff --git a/Python/thread.c b/Python/thread.c index e55d342..810691f 100644 --- a/Python/thread.c +++ b/Python/thread.c @@ -31,7 +31,7 @@ threads. This is valid for HP-UX 11.23 running on an ia64 system. If needed, add - a check of __ia64 to verify that we're running on a ia64 system instead + a check of __ia64 to verify that we're running on an ia64 system instead of a pa-risc system. */ #ifdef __hpux @@ -91,10 +91,6 @@ static size_t _pythread_stacksize = 0; #include "thread_nt.h" #endif -#ifdef OS2_THREADS -#define PYTHREAD_NAME "os2" -#include "thread_os2.h" -#endif /* #ifdef FOOBAR_THREADS @@ -209,7 +205,7 @@ static int nkeys = 0; /* PyThread_create_key() hands out nkeys+1 next */ * segfaults. Now we lock the whole routine. */ static struct key * -find_key(int key, void *value) +find_key(int set_value, int key, void *value) { struct key *p, *prev_p; long id = PyThread_get_thread_ident(); @@ -219,10 +215,13 @@ find_key(int key, void *value) PyThread_acquire_lock(keymutex, 1); prev_p = NULL; for (p = keyhead; p != NULL; p = p->next) { - if (p->id == id && p->key == key) + if (p->id == id && p->key == key) { + if (set_value) + p->value = value; goto Done; + } /* Sanity check. These states should never happen but if - * they do we must abort. Otherwise we'll end up spinning in + * they do we must abort. Otherwise we'll end up spinning * in a tight loop with the lock held. A similar check is done * in pystate.c tstate_delete_common(). */ if (p == prev_p) @@ -231,11 +230,11 @@ find_key(int key, void *value) if (p->next == keyhead) Py_FatalError("tls find_key: circular list(!)"); } - if (value == NULL) { + if (!set_value && value == NULL) { assert(p == NULL); goto Done; } - p = (struct key *)malloc(sizeof(struct key)); + p = (struct key *)PyMem_RawMalloc(sizeof(struct key)); if (p != NULL) { p->id = id; p->key = key; @@ -274,7 +273,7 @@ PyThread_delete_key(int key) while ((p = *q) != NULL) { if (p->key == key) { *q = p->next; - free((void *)p); + PyMem_RawFree((void *)p); /* NB This does *not* free p->value! */ } else @@ -283,19 +282,12 @@ PyThread_delete_key(int key) PyThread_release_lock(keymutex); } -/* Confusing: If the current thread has an association for key, - * value is ignored, and 0 is returned. Else an attempt is made to create - * an association of key to value for the current thread. 0 is returned - * if that succeeds, but -1 is returned if there's not enough memory - * to create the association. value must not be NULL. - */ int PyThread_set_key_value(int key, void *value) { struct key *p; - assert(value != NULL); - p = find_key(key, value); + p = find_key(1, key, value); if (p == NULL) return -1; else @@ -308,7 +300,7 @@ PyThread_set_key_value(int key, void *value) void * PyThread_get_key_value(int key) { - struct key *p = find_key(key, NULL); + struct key *p = find_key(0, key, NULL); if (p == NULL) return NULL; @@ -328,7 +320,7 @@ PyThread_delete_key_value(int key) while ((p = *q) != NULL) { if (p->key == key && p->id == id) { *q = p->next; - free((void *)p); + PyMem_RawFree((void *)p); /* NB This does *not* free p->value! */ break; } @@ -361,7 +353,7 @@ PyThread_ReInitTLS(void) while ((p = *q) != NULL) { if (p->id != id) { *q = p->next; - free((void *)p); + PyMem_RawFree((void *)p); /* NB This does *not* free p->value! */ } else @@ -403,8 +395,10 @@ PyThread_GetInfo(void) int len; #endif - if (ThreadInfoType.tp_name == 0) - PyStructSequence_InitType(&ThreadInfoType, &threadinfo_desc); + if (ThreadInfoType.tp_name == 0) { + if (PyStructSequence_InitType2(&ThreadInfoType, &threadinfo_desc) < 0) + return NULL; + } threadinfo = PyStructSequence_New(&ThreadInfoType); if (threadinfo == NULL) diff --git a/Python/thread_nt.h b/Python/thread_nt.h index b157fc5..84452cd 100644 --- a/Python/thread_nt.h +++ b/Python/thread_nt.h @@ -34,7 +34,7 @@ typedef NRMUTEX *PNRMUTEX; PNRMUTEX AllocNonRecursiveMutex() { - PNRMUTEX m = (PNRMUTEX)malloc(sizeof(NRMUTEX)); + PNRMUTEX m = (PNRMUTEX)PyMem_RawMalloc(sizeof(NRMUTEX)); if (!m) return NULL; if (PyCOND_INIT(&m->cv)) @@ -46,7 +46,7 @@ AllocNonRecursiveMutex() m->locked = 0; return m; fail: - free(m); + PyMem_RawFree(m); return NULL; } @@ -56,7 +56,7 @@ FreeNonRecursiveMutex(PNRMUTEX mutex) if (mutex) { PyCOND_FINI(&mutex->cv); PyMUTEX_FINI(&mutex->cs); - free(mutex); + PyMem_RawFree(mutex); } } @@ -107,7 +107,7 @@ LeaveNonRecursiveMutex(PNRMUTEX mutex) result = PyCOND_SIGNAL(&mutex->cv); result &= PyMUTEX_UNLOCK(&mutex->cs); return result; -} +} #else /* if ! _PY_USE_CV_LOCKS */ @@ -130,7 +130,7 @@ FreeNonRecursiveMutex(PNRMUTEX mutex) DWORD EnterNonRecursiveMutex(PNRMUTEX mutex, DWORD milliseconds) { - return WaitForSingleObject(mutex, milliseconds); + return WaitForSingleObjectEx(mutex, milliseconds, FALSE); } BOOL @@ -389,20 +389,11 @@ PyThread_delete_key(int key) TlsFree(key); } -/* We must be careful to emulate the strange semantics implemented in thread.c, - * where the value is only set if it hasn't been set before. - */ int PyThread_set_key_value(int key, void *value) { BOOL ok; - void *oldvalue; - assert(value != NULL); - oldvalue = TlsGetValue(key); - if (oldvalue != NULL) - /* ignore value if already set */ - return 0; ok = TlsSetValue(key, value); if (!ok) return -1; diff --git a/Python/thread_os2.h b/Python/thread_os2.h deleted file mode 100644 index 1b264b5..0000000 --- a/Python/thread_os2.h +++ /dev/null @@ -1,267 +0,0 @@ -/* This code implemented by cvale@netcom.com */ - -#define INCL_DOSPROCESS -#define INCL_DOSSEMAPHORES -#include "os2.h" -#include "limits.h" - -#include "process.h" - -#if defined(PYCC_GCC) -#include <sys/builtin.h> -#include <sys/fmutex.h> -#else -long PyThread_get_thread_ident(void); -#endif - -/* default thread stack size of 64kB */ -#if !defined(THREAD_STACK_SIZE) -#define THREAD_STACK_SIZE 0x10000 -#endif - -#define OS2_STACKSIZE(x) (x ? x : THREAD_STACK_SIZE) - -/* - * Initialization of the C package, should not be needed. - */ -static void -PyThread__init_thread(void) -{ -} - -/* - * Thread support. - */ -long -PyThread_start_new_thread(void (*func)(void *), void *arg) -{ - int thread_id; - - thread_id = _beginthread(func, - NULL, - OS2_STACKSIZE(_pythread_stacksize), - arg); - - if (thread_id == -1) { - dprintf(("_beginthread failed. return %ld\n", errno)); - } - - return thread_id; -} - -long -PyThread_get_thread_ident(void) -{ -#if !defined(PYCC_GCC) - PPIB pib; - PTIB tib; -#endif - - if (!initialized) - PyThread_init_thread(); - -#if defined(PYCC_GCC) - return _gettid(); -#else - DosGetInfoBlocks(&tib, &pib); - return tib->tib_ptib2->tib2_ultid; -#endif -} - -void -PyThread_exit_thread(void) -{ - dprintf(("%ld: PyThread_exit_thread called\n", - PyThread_get_thread_ident())); - if (!initialized) - exit(0); - _endthread(); -} - -/* - * Lock support. This is implemented with an event semaphore and critical - * sections to make it behave more like a posix mutex than its OS/2 - * counterparts. - */ - -typedef struct os2_lock_t { - int is_set; - HEV changed; -} *type_os2_lock; - -PyThread_type_lock -PyThread_allocate_lock(void) -{ -#if defined(PYCC_GCC) - _fmutex *sem = malloc(sizeof(_fmutex)); - if (!initialized) - PyThread_init_thread(); - dprintf(("%ld: PyThread_allocate_lock() -> %lx\n", - PyThread_get_thread_ident(), - (long)sem)); - if (_fmutex_create(sem, 0)) { - free(sem); - sem = NULL; - } - return (PyThread_type_lock)sem; -#else - APIRET rc; - type_os2_lock lock = (type_os2_lock)malloc(sizeof(struct os2_lock_t)); - - dprintf(("PyThread_allocate_lock called\n")); - if (!initialized) - PyThread_init_thread(); - - lock->is_set = 0; - - DosCreateEventSem(NULL, &lock->changed, 0, 0); - - dprintf(("%ld: PyThread_allocate_lock() -> %p\n", - PyThread_get_thread_ident(), - lock->changed)); - - return (PyThread_type_lock)lock; -#endif -} - -void -PyThread_free_lock(PyThread_type_lock aLock) -{ -#if !defined(PYCC_GCC) - type_os2_lock lock = (type_os2_lock)aLock; -#endif - - dprintf(("%ld: PyThread_free_lock(%p) called\n", - PyThread_get_thread_ident(),aLock)); - -#if defined(PYCC_GCC) - if (aLock) { - _fmutex_close((_fmutex *)aLock); - free((_fmutex *)aLock); - } -#else - DosCloseEventSem(lock->changed); - free(aLock); -#endif -} - -/* - * Return 1 on success if the lock was acquired - * - * and 0 if the lock was not acquired. - */ -int -PyThread_acquire_lock(PyThread_type_lock aLock, int waitflag) -{ -#if !defined(PYCC_GCC) - int done = 0; - ULONG count; - PID pid = 0; - TID tid = 0; - type_os2_lock lock = (type_os2_lock)aLock; -#endif - - dprintf(("%ld: PyThread_acquire_lock(%p, %d) called\n", - PyThread_get_thread_ident(), - aLock, - waitflag)); - -#if defined(PYCC_GCC) - /* always successful if the lock doesn't exist */ - if (aLock && - _fmutex_request((_fmutex *)aLock, waitflag ? 0 : _FMR_NOWAIT)) - return 0; -#else - while (!done) { - /* if the lock is currently set, we have to wait for - * the state to change - */ - if (lock->is_set) { - if (!waitflag) - return 0; - DosWaitEventSem(lock->changed, SEM_INDEFINITE_WAIT); - } - - /* enter a critical section and try to get the semaphore. If - * it is still locked, we will try again. - */ - if (DosEnterCritSec()) - return 0; - - if (!lock->is_set) { - lock->is_set = 1; - DosResetEventSem(lock->changed, &count); - done = 1; - } - - DosExitCritSec(); - } -#endif - - return 1; -} - -void -PyThread_release_lock(PyThread_type_lock aLock) -{ -#if !defined(PYCC_GCC) - type_os2_lock lock = (type_os2_lock)aLock; -#endif - - dprintf(("%ld: PyThread_release_lock(%p) called\n", - PyThread_get_thread_ident(), - aLock)); - -#if defined(PYCC_GCC) - if (aLock) - _fmutex_release((_fmutex *)aLock); -#else - if (!lock->is_set) { - dprintf(("%ld: Could not PyThread_release_lock(%p) error: %l\n", - PyThread_get_thread_ident(), - aLock, - GetLastError())); - return; - } - - if (DosEnterCritSec()) { - dprintf(("%ld: Could not PyThread_release_lock(%p) error: %l\n", - PyThread_get_thread_ident(), - aLock, - GetLastError())); - return; - } - - lock->is_set = 0; - DosPostEventSem(lock->changed); - - DosExitCritSec(); -#endif -} - -/* minimum/maximum thread stack sizes supported */ -#define THREAD_MIN_STACKSIZE 0x8000 /* 32kB */ -#define THREAD_MAX_STACKSIZE 0x2000000 /* 32MB */ - -/* set the thread stack size. - * Return 0 if size is valid, -1 otherwise. - */ -static int -_pythread_os2_set_stacksize(size_t size) -{ - /* set to default */ - if (size == 0) { - _pythread_stacksize = 0; - return 0; - } - - /* valid range? */ - if (size >= THREAD_MIN_STACKSIZE && size < THREAD_MAX_STACKSIZE) { - _pythread_stacksize = size; - return 0; - } - - return -1; -} - -#define THREAD_SET_STACKSIZE(x) _pythread_os2_set_stacksize(x) diff --git a/Python/thread_pth.h b/Python/thread_pth.h deleted file mode 100644 index 5704266..0000000 --- a/Python/thread_pth.h +++ /dev/null @@ -1,177 +0,0 @@ - -/* GNU pth threads interface - http://www.gnu.org/software/pth - 2000-05-03 Andy Dustman <andy@dustman.net> - - Adapted from Posix threads interface - 12 May 1997 -- david arnold <davida@pobox.com> - */ - -#include <stdlib.h> -#include <string.h> -#include <pth.h> - -/* A pth mutex isn't sufficient to model the Python lock type - * because pth mutexes can be acquired multiple times by the - * same thread. - * - * The pth_lock struct implements a Python lock as a "locked?" bit - * and a <condition, mutex> pair. In general, if the bit can be acquired - * instantly, it is, else the pair is used to block the thread until the - * bit is cleared. - */ - -typedef struct { - char locked; /* 0=unlocked, 1=locked */ - /* a <cond, mutex> pair to handle an acquire of a locked lock */ - pth_cond_t lock_released; - pth_mutex_t mut; -} pth_lock; - -#define CHECK_STATUS(name) if (status == -1) { printf("%d ", status); perror(name); error = 1; } - -pth_attr_t PyThread_attr; - -/* - * Initialization. - */ - -static void PyThread__init_thread(void) -{ - pth_init(); - PyThread_attr = pth_attr_new(); - pth_attr_set(PyThread_attr, PTH_ATTR_STACK_SIZE, 1<<18); - pth_attr_set(PyThread_attr, PTH_ATTR_JOINABLE, FALSE); -} - -/* - * Thread support. - */ - - -long PyThread_start_new_thread(void (*func)(void *), void *arg) -{ - pth_t th; - dprintf(("PyThread_start_new_thread called\n")); - if (!initialized) - PyThread_init_thread(); - - th = pth_spawn(PyThread_attr, - (void* (*)(void *))func, - (void *)arg - ); - - return th; -} - -long PyThread_get_thread_ident(void) -{ - volatile pth_t threadid; - if (!initialized) - PyThread_init_thread(); - threadid = pth_self(); - return (long) threadid; -} - -void PyThread_exit_thread(void) -{ - dprintf(("PyThread_exit_thread called\n")); - if (!initialized) { - exit(0); - } -} - -/* - * Lock support. - */ -PyThread_type_lock PyThread_allocate_lock(void) -{ - pth_lock *lock; - int status, error = 0; - - dprintf(("PyThread_allocate_lock called\n")); - if (!initialized) - PyThread_init_thread(); - - lock = (pth_lock *) malloc(sizeof(pth_lock)); - memset((void *)lock, '\0', sizeof(pth_lock)); - if (lock) { - lock->locked = 0; - status = pth_mutex_init(&lock->mut); - CHECK_STATUS("pth_mutex_init"); - status = pth_cond_init(&lock->lock_released); - CHECK_STATUS("pth_cond_init"); - if (error) { - free((void *)lock); - lock = NULL; - } - } - dprintf(("PyThread_allocate_lock() -> %p\n", lock)); - return (PyThread_type_lock) lock; -} - -void PyThread_free_lock(PyThread_type_lock lock) -{ - pth_lock *thelock = (pth_lock *)lock; - - dprintf(("PyThread_free_lock(%p) called\n", lock)); - - free((void *)thelock); -} - -int PyThread_acquire_lock(PyThread_type_lock lock, int waitflag) -{ - int success; - pth_lock *thelock = (pth_lock *)lock; - int status, error = 0; - - dprintf(("PyThread_acquire_lock(%p, %d) called\n", lock, waitflag)); - - status = pth_mutex_acquire(&thelock->mut, !waitflag, NULL); - CHECK_STATUS("pth_mutex_acquire[1]"); - success = thelock->locked == 0; - if (success) thelock->locked = 1; - status = pth_mutex_release( &thelock->mut ); - CHECK_STATUS("pth_mutex_release[1]"); - - if ( !success && waitflag ) { - /* continue trying until we get the lock */ - - /* mut must be locked by me -- part of the condition - * protocol */ - status = pth_mutex_acquire( &thelock->mut, !waitflag, NULL ); - CHECK_STATUS("pth_mutex_acquire[2]"); - while ( thelock->locked ) { - status = pth_cond_await(&thelock->lock_released, - &thelock->mut, NULL); - CHECK_STATUS("pth_cond_await"); - } - thelock->locked = 1; - status = pth_mutex_release( &thelock->mut ); - CHECK_STATUS("pth_mutex_release[2]"); - success = 1; - } - if (error) success = 0; - dprintf(("PyThread_acquire_lock(%p, %d) -> %d\n", lock, waitflag, success)); - return success; -} - -void PyThread_release_lock(PyThread_type_lock lock) -{ - pth_lock *thelock = (pth_lock *)lock; - int status, error = 0; - - dprintf(("PyThread_release_lock(%p) called\n", lock)); - - status = pth_mutex_acquire( &thelock->mut, 0, NULL ); - CHECK_STATUS("pth_mutex_acquire[3]"); - - thelock->locked = 0; - - status = pth_mutex_release( &thelock->mut ); - CHECK_STATUS("pth_mutex_release[3]"); - - /* wake up someone (anyone, if any) waiting on the lock */ - status = pth_cond_notify( &thelock->lock_released, 0 ); - CHECK_STATUS("pth_cond_notify"); -} diff --git a/Python/thread_pthread.h b/Python/thread_pthread.h index e90ae7e..d9f7c76 100644 --- a/Python/thread_pthread.h +++ b/Python/thread_pthread.h @@ -282,14 +282,14 @@ PyThread_allocate_lock(void) if (!initialized) PyThread_init_thread(); - lock = (sem_t *)malloc(sizeof(sem_t)); + lock = (sem_t *)PyMem_RawMalloc(sizeof(sem_t)); if (lock) { status = sem_init(lock,0,1); CHECK_STATUS("sem_init"); if (error) { - free((void *)lock); + PyMem_RawFree((void *)lock); lock = NULL; } } @@ -313,7 +313,7 @@ PyThread_free_lock(PyThread_type_lock lock) status = sem_destroy(thelock); CHECK_STATUS("sem_destroy"); - free((void *)thelock); + PyMem_RawFree((void *)thelock); } /* @@ -410,7 +410,7 @@ PyThread_allocate_lock(void) if (!initialized) PyThread_init_thread(); - lock = (pthread_lock *) malloc(sizeof(pthread_lock)); + lock = (pthread_lock *) PyMem_RawMalloc(sizeof(pthread_lock)); if (lock) { memset((void *)lock, '\0', sizeof(pthread_lock)); lock->locked = 0; @@ -430,7 +430,7 @@ PyThread_allocate_lock(void) CHECK_STATUS("pthread_cond_init"); if (error) { - free((void *)lock); + PyMem_RawFree((void *)lock); lock = 0; } } @@ -457,7 +457,7 @@ PyThread_free_lock(PyThread_type_lock lock) status = pthread_mutex_destroy( &thelock->mut ); CHECK_STATUS("pthread_mutex_destroy"); - free((void *)thelock); + PyMem_RawFree((void *)thelock); } PyLockStatus @@ -627,9 +627,6 @@ int PyThread_set_key_value(int key, void *value) { int fail; - void *oldValue = pthread_getspecific(key); - if (oldValue != NULL) - return 0; fail = pthread_setspecific(key, value); return fail ? -1 : 0; } diff --git a/Python/traceback.c b/Python/traceback.c index 74075c9..7d1fc2e 100644 --- a/Python/traceback.c +++ b/Python/traceback.c @@ -13,7 +13,7 @@ #define OFF(x) offsetof(PyTracebackObject, x) -#define PUTS(fd, str) write(fd, str, strlen(str)) +#define PUTS(fd, str) write(fd, str, (int)strlen(str)) #define MAX_STRING_LENGTH 500 #define MAX_FRAME_DEPTH 100 #define MAX_NTHREADS 100 @@ -21,6 +21,11 @@ /* Function from Parser/tokenizer.c */ extern char * PyTokenizer_FindEncodingFilename(int, PyObject *); +_Py_IDENTIFIER(TextIOWrapper); +_Py_IDENTIFIER(close); +_Py_IDENTIFIER(open); +_Py_IDENTIFIER(path); + static PyObject * tb_dir(PyTracebackObject *self) { @@ -137,6 +142,39 @@ PyTraceBack_Here(PyFrameObject *frame) return 0; } +/* Insert a frame into the traceback for (funcname, filename, lineno). */ +void _PyTraceback_Add(const char *funcname, const char *filename, int lineno) +{ + PyObject *globals = NULL; + PyCodeObject *code = NULL; + PyFrameObject *frame = NULL; + PyObject *exception, *value, *tb; + + /* Save and clear the current exception. Python functions must not be + called with an exception set. Calling Python functions happens when + the codec of the filesystem encoding is implemented in pure Python. */ + PyErr_Fetch(&exception, &value, &tb); + + globals = PyDict_New(); + if (!globals) + goto done; + code = PyCode_NewEmpty(filename, funcname, lineno); + if (!code) + goto done; + frame = PyFrame_New(PyThreadState_Get(), code, globals, NULL); + if (!frame) + goto done; + frame->f_lineno = lineno; + + PyErr_Restore(exception, value, tb); + PyTraceBack_Here(frame); + +done: + Py_XDECREF(globals); + Py_XDECREF(code); + Py_XDECREF(frame); +} + static PyObject * _Py_FindSourceFile(PyObject *filename, char* namebuf, size_t namelen, PyObject *io) { @@ -152,7 +190,6 @@ _Py_FindSourceFile(PyObject *filename, char* namebuf, size_t namelen, PyObject * const char* filepath; Py_ssize_t len; PyObject* result; - _Py_IDENTIFIER(open); filebytes = PyUnicode_EncodeFSDefault(filename); if (filebytes == NULL) { @@ -169,7 +206,7 @@ _Py_FindSourceFile(PyObject *filename, char* namebuf, size_t namelen, PyObject * tail++; taillen = strlen(tail); - syspath = PySys_GetObject("path"); + syspath = _PySys_GetObjectId(&PyId_path); if (syspath == NULL || !PyList_Check(syspath)) goto error; npath = PyList_Size(syspath); @@ -232,9 +269,6 @@ _Py_DisplaySourceLine(PyObject *f, PyObject *filename, int lineno, int indent) char buf[MAXPATHLEN+1]; int kind; void *data; - _Py_IDENTIFIER(close); - _Py_IDENTIFIER(open); - _Py_IDENTIFIER(TextIOWrapper); /* open the file */ if (filename == NULL) @@ -246,10 +280,12 @@ _Py_DisplaySourceLine(PyObject *f, PyObject *filename, int lineno, int indent) binary = _PyObject_CallMethodId(io, &PyId_open, "Os", filename, "rb"); if (binary == NULL) { + PyErr_Clear(); + binary = _Py_FindSourceFile(filename, buf, sizeof(buf), io); if (binary == NULL) { Py_DECREF(io); - return 0; + return -1; } } @@ -261,6 +297,8 @@ _Py_DisplaySourceLine(PyObject *f, PyObject *filename, int lineno, int indent) return 0; } found_encoding = PyTokenizer_FindEncodingFilename(fd, filename); + if (found_encoding == NULL) + PyErr_Clear(); encoding = (found_encoding != NULL) ? found_encoding : "utf-8"; /* Reset position */ if (lseek(fd, 0, SEEK_SET) == (off_t)-1) { @@ -271,19 +309,27 @@ _Py_DisplaySourceLine(PyObject *f, PyObject *filename, int lineno, int indent) } fob = _PyObject_CallMethodId(io, &PyId_TextIOWrapper, "Os", binary, encoding); Py_DECREF(io); - Py_DECREF(binary); PyMem_FREE(found_encoding); if (fob == NULL) { PyErr_Clear(); + + res = _PyObject_CallMethodId(binary, &PyId_close, ""); + Py_DECREF(binary); + if (res) + Py_DECREF(res); + else + PyErr_Clear(); return 0; } + Py_DECREF(binary); /* get the line number lineno */ for (i = 0; i < lineno; i++) { Py_XDECREF(lineobj); lineobj = PyFile_GetLine(fob, -1); if (!lineobj) { + PyErr_Clear(); err = -1; break; } @@ -469,13 +515,13 @@ dump_decimal(int fd, int value) write(fd, buffer, len); } -/* Format an integer in range [0; 0xffffffff] to hexdecimal of 'width' digits, +/* Format an integer in range [0; 0xffffffff] to hexadecimal of 'width' digits, and write it into the file fd. This function is signal safe. */ static void -dump_hexadecimal(int width, unsigned long value, int fd) +dump_hexadecimal(int fd, unsigned long value, int width) { int len; char buffer[sizeof(unsigned long) * 2 + 1]; @@ -542,15 +588,15 @@ dump_ascii(int fd, PyObject *text) } else if (ch < 0xff) { PUTS(fd, "\\x"); - dump_hexadecimal(2, ch, fd); + dump_hexadecimal(fd, ch, 2); } else if (ch < 0xffff) { PUTS(fd, "\\u"); - dump_hexadecimal(4, ch, fd); + dump_hexadecimal(fd, ch, 4); } else { PUTS(fd, "\\U"); - dump_hexadecimal(8, ch, fd); + dump_hexadecimal(fd, ch, 8); } } if (truncated) @@ -601,7 +647,7 @@ dump_traceback(int fd, PyThreadState *tstate, int write_header) unsigned int depth; if (write_header) - PUTS(fd, "Traceback (most recent call first):\n"); + PUTS(fd, "Stack (most recent call first):\n"); frame = _PyThreadState_GetFrame(tstate); if (frame == NULL) @@ -639,8 +685,8 @@ write_thread_id(int fd, PyThreadState *tstate, int is_current) PUTS(fd, "Current thread 0x"); else PUTS(fd, "Thread 0x"); - dump_hexadecimal(sizeof(long)*2, (unsigned long)tstate->thread_id, fd); - PUTS(fd, ":\n"); + dump_hexadecimal(fd, (unsigned long)tstate->thread_id, sizeof(long)*2); + PUTS(fd, " (most recent call first):\n"); } const char* |