bpo-41323: Perform 'peephole' optimizations directly on the CFG. (GH-21517)

* Move 'peephole' optimizations into compile.c and perform them directly on the CFG.
This commit is contained in:
Mark Shannon 2020-07-30 10:03:00 +01:00 committed by GitHub
parent ba18c0b13b
commit 6e8128f02e
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
12 changed files with 4365 additions and 4584 deletions

View File

@ -360,8 +360,6 @@ dis_tryfinally = """\
16 CALL_FUNCTION 0 16 CALL_FUNCTION 0
18 POP_TOP 18 POP_TOP
20 RERAISE 20 RERAISE
22 LOAD_CONST 0 (None)
24 RETURN_VALUE
""" % (_tryfinally.__code__.co_firstlineno + 1, """ % (_tryfinally.__code__.co_firstlineno + 1,
_tryfinally.__code__.co_firstlineno + 2, _tryfinally.__code__.co_firstlineno + 2,
_tryfinally.__code__.co_firstlineno + 4, _tryfinally.__code__.co_firstlineno + 4,
@ -385,8 +383,6 @@ dis_tryfinallyconst = """\
16 CALL_FUNCTION 0 16 CALL_FUNCTION 0
18 POP_TOP 18 POP_TOP
20 RERAISE 20 RERAISE
22 LOAD_CONST 0 (None)
24 RETURN_VALUE
""" % (_tryfinallyconst.__code__.co_firstlineno + 1, """ % (_tryfinallyconst.__code__.co_firstlineno + 1,
_tryfinallyconst.__code__.co_firstlineno + 2, _tryfinallyconst.__code__.co_firstlineno + 2,
_tryfinallyconst.__code__.co_firstlineno + 4, _tryfinallyconst.__code__.co_firstlineno + 4,

View File

@ -416,9 +416,9 @@ class TestTranforms(BytecodeTestCase):
if cond1: return 4 if cond1: return 4
self.assertNotInBytecode(f, 'JUMP_FORWARD') self.assertNotInBytecode(f, 'JUMP_FORWARD')
# There should be one jump for the while loop. # There should be one jump for the while loop.
returns = [instr for instr in dis.get_instructions(f) jumps = [instr for instr in dis.get_instructions(f)
if instr.opname == 'JUMP_ABSOLUTE'] if 'JUMP' in instr.opname]
self.assertEqual(len(returns), 1) self.assertEqual(len(jumps), 1)
returns = [instr for instr in dis.get_instructions(f) returns = [instr for instr in dis.get_instructions(f)
if instr.opname == 'RETURN_VALUE'] if instr.opname == 'RETURN_VALUE']
self.assertLessEqual(len(returns), 2) self.assertLessEqual(len(returns), 2)

View File

@ -948,7 +948,7 @@ class JumpTestCase(unittest.TestCase):
output.append(11) output.append(11)
output.append(12) output.append(12)
@jump_test(5, 11, [2, 4], (ValueError, 'unreachable')) @jump_test(5, 11, [2, 4], (ValueError, 'after'))
def test_no_jump_over_return_try_finally_in_finally_block(output): def test_no_jump_over_return_try_finally_in_finally_block(output):
try: try:
output.append(2) output.append(2)
@ -1457,7 +1457,7 @@ class JumpTestCase(unittest.TestCase):
async with asynctracecontext(output, 4): async with asynctracecontext(output, 4):
output.append(5) output.append(5)
@jump_test(5, 7, [2, 4], (ValueError, "unreachable")) @jump_test(5, 7, [2, 4], (ValueError, "after"))
def test_no_jump_over_return_out_of_finally_block(output): def test_no_jump_over_return_out_of_finally_block(output):
try: try:
output.append(2) output.append(2)

View File

@ -354,7 +354,6 @@ PYTHON_OBJS= \
Python/mysnprintf.o \ Python/mysnprintf.o \
Python/mystrtoul.o \ Python/mystrtoul.o \
Python/pathconfig.o \ Python/pathconfig.o \
Python/peephole.o \
Python/preconfig.o \ Python/preconfig.o \
Python/pyarena.o \ Python/pyarena.o \
Python/pyctype.o \ Python/pyctype.o \

View File

@ -0,0 +1,3 @@
Bytecode optimizations are performed directly on the control flow graph.
This will result in slightly more compact code objects in some
circumstances.

View File

@ -460,7 +460,6 @@
<ClCompile Include="..\Python\mysnprintf.c" /> <ClCompile Include="..\Python\mysnprintf.c" />
<ClCompile Include="..\Python\mystrtoul.c" /> <ClCompile Include="..\Python\mystrtoul.c" />
<ClCompile Include="..\Python\pathconfig.c" /> <ClCompile Include="..\Python\pathconfig.c" />
<ClCompile Include="..\Python\peephole.c" />
<ClCompile Include="..\Python\preconfig.c" /> <ClCompile Include="..\Python\preconfig.c" />
<ClCompile Include="..\Python\pyarena.c" /> <ClCompile Include="..\Python\pyarena.c" />
<ClCompile Include="..\Python\pyctype.c" /> <ClCompile Include="..\Python\pyctype.c" />

View File

@ -1028,9 +1028,6 @@
<ClCompile Include="..\Python\pathconfig.c"> <ClCompile Include="..\Python\pathconfig.c">
<Filter>Python</Filter> <Filter>Python</Filter>
</ClCompile> </ClCompile>
<ClCompile Include="..\Python\peephole.c">
<Filter>Python</Filter>
</ClCompile>
<ClCompile Include="..\Python\preconfig.c"> <ClCompile Include="..\Python\preconfig.c">
<Filter>Python</Filter> <Filter>Python</Filter>
</ClCompile> </ClCompile>

View File

@ -9,7 +9,7 @@
* 3. Generate code for basic blocks. See compiler_mod() in this file. * 3. Generate code for basic blocks. See compiler_mod() in this file.
* 4. Assemble the basic blocks into final code. See assemble() in * 4. Assemble the basic blocks into final code. See assemble() in
* this file. * this file.
* 5. Optimize the byte code (peephole optimizations). See peephole.c * 5. Optimize the byte code (peephole optimizations).
* *
* Note that compiler_mod() suggests module, but the module ast type * Note that compiler_mod() suggests module, but the module ast type
* (mod_ty) has cases for expressions and interactive statements. * (mod_ty) has cases for expressions and interactive statements.
@ -69,6 +69,7 @@ typedef struct basicblock_ {
struct basicblock_ *b_next; struct basicblock_ *b_next;
/* b_return is true if a RETURN_VALUE opcode is inserted. */ /* b_return is true if a RETURN_VALUE opcode is inserted. */
unsigned b_return : 1; unsigned b_return : 1;
unsigned b_reachable : 1;
/* depth of stack upon entry of block, computed by stackdepth() */ /* depth of stack upon entry of block, computed by stackdepth() */
int b_startdepth; int b_startdepth;
/* instruction offset for block, computed by assemble_jump_offsets() */ /* instruction offset for block, computed by assemble_jump_offsets() */
@ -499,7 +500,7 @@ compiler_unit_check(struct compiler_unit *u)
assert((uintptr_t)block != 0xdbdbdbdbU); assert((uintptr_t)block != 0xdbdbdbdbU);
if (block->b_instr != NULL) { if (block->b_instr != NULL) {
assert(block->b_ialloc > 0); assert(block->b_ialloc > 0);
assert(block->b_iused > 0); assert(block->b_iused >= 0);
assert(block->b_ialloc >= block->b_iused); assert(block->b_ialloc >= block->b_iused);
} }
else { else {
@ -3645,6 +3646,11 @@ compiler_boolop(struct compiler *c, expr_ty e)
for (i = 0; i < n; ++i) { for (i = 0; i < n; ++i) {
VISIT(c, expr, (expr_ty)asdl_seq_GET(s, i)); VISIT(c, expr, (expr_ty)asdl_seq_GET(s, i));
ADDOP_JABS(c, jumpi, end); ADDOP_JABS(c, jumpi, end);
basicblock *next = compiler_new_block(c);
if (next == NULL) {
return 0;
}
compiler_use_next_block(c, next);
} }
VISIT(c, expr, (expr_ty)asdl_seq_GET(s, n)); VISIT(c, expr, (expr_ty)asdl_seq_GET(s, n));
compiler_use_next_block(c, end); compiler_use_next_block(c, end);
@ -5861,28 +5867,24 @@ merge_const_tuple(struct compiler *c, PyObject **tuple)
} }
static PyCodeObject * static PyCodeObject *
makecode(struct compiler *c, struct assembler *a) makecode(struct compiler *c, struct assembler *a, PyObject *consts)
{ {
PyObject *tmp;
PyCodeObject *co = NULL; PyCodeObject *co = NULL;
PyObject *consts = NULL;
PyObject *names = NULL; PyObject *names = NULL;
PyObject *varnames = NULL; PyObject *varnames = NULL;
PyObject *name = NULL; PyObject *name = NULL;
PyObject *freevars = NULL; PyObject *freevars = NULL;
PyObject *cellvars = NULL; PyObject *cellvars = NULL;
PyObject *bytecode = NULL;
Py_ssize_t nlocals; Py_ssize_t nlocals;
int nlocals_int; int nlocals_int;
int flags; int flags;
int posorkeywordargcount, posonlyargcount, kwonlyargcount, maxdepth; int posorkeywordargcount, posonlyargcount, kwonlyargcount, maxdepth;
consts = consts_dict_keys_inorder(c->u->u_consts);
names = dict_keys_inorder(c->u->u_names, 0); names = dict_keys_inorder(c->u->u_names, 0);
varnames = dict_keys_inorder(c->u->u_varnames, 0); varnames = dict_keys_inorder(c->u->u_varnames, 0);
if (!consts || !names || !varnames) if (!names || !varnames) {
goto error; goto error;
}
cellvars = dict_keys_inorder(c->u->u_cellvars, 0); cellvars = dict_keys_inorder(c->u->u_cellvars, 0);
if (!cellvars) if (!cellvars)
goto error; goto error;
@ -5906,16 +5908,12 @@ makecode(struct compiler *c, struct assembler *a)
if (flags < 0) if (flags < 0)
goto error; goto error;
bytecode = PyCode_Optimize(a->a_bytecode, consts, names, a->a_lnotab); consts = PyList_AsTuple(consts); /* PyCode_New requires a tuple */
if (!bytecode) if (consts == NULL) {
goto error; goto error;
}
tmp = PyList_AsTuple(consts); /* PyCode_New requires a tuple */
if (!tmp)
goto error;
Py_DECREF(consts);
consts = tmp;
if (!merge_const_tuple(c, &consts)) { if (!merge_const_tuple(c, &consts)) {
Py_DECREF(consts);
goto error; goto error;
} }
@ -5924,21 +5922,21 @@ makecode(struct compiler *c, struct assembler *a)
kwonlyargcount = Py_SAFE_DOWNCAST(c->u->u_kwonlyargcount, Py_ssize_t, int); kwonlyargcount = Py_SAFE_DOWNCAST(c->u->u_kwonlyargcount, Py_ssize_t, int);
maxdepth = stackdepth(c); maxdepth = stackdepth(c);
if (maxdepth < 0) { if (maxdepth < 0) {
Py_DECREF(consts);
goto error; goto error;
} }
co = PyCode_NewWithPosOnlyArgs(posonlyargcount+posorkeywordargcount, co = PyCode_NewWithPosOnlyArgs(posonlyargcount+posorkeywordargcount,
posonlyargcount, kwonlyargcount, nlocals_int, posonlyargcount, kwonlyargcount, nlocals_int,
maxdepth, flags, bytecode, consts, names, maxdepth, flags, a->a_bytecode, consts, names,
varnames, freevars, cellvars, c->c_filename, varnames, freevars, cellvars, c->c_filename,
c->u->u_name, c->u->u_firstlineno, a->a_lnotab); c->u->u_name, c->u->u_firstlineno, a->a_lnotab);
Py_DECREF(consts);
error: error:
Py_XDECREF(consts);
Py_XDECREF(names); Py_XDECREF(names);
Py_XDECREF(varnames); Py_XDECREF(varnames);
Py_XDECREF(name); Py_XDECREF(name);
Py_XDECREF(freevars); Py_XDECREF(freevars);
Py_XDECREF(cellvars); Py_XDECREF(cellvars);
Py_XDECREF(bytecode);
return co; return co;
} }
@ -5976,6 +5974,9 @@ dump_basicblock(const basicblock *b)
} }
#endif #endif
static int
optimize_cfg(struct assembler *a, PyObject *consts);
static PyCodeObject * static PyCodeObject *
assemble(struct compiler *c, int addNone) assemble(struct compiler *c, int addNone)
{ {
@ -5983,6 +5984,7 @@ assemble(struct compiler *c, int addNone)
struct assembler a; struct assembler a;
int i, j, nblocks; int i, j, nblocks;
PyCodeObject *co = NULL; PyCodeObject *co = NULL;
PyObject *consts = NULL;
/* Make sure every block that falls off the end returns None. /* Make sure every block that falls off the end returns None.
XXX NEXT_BLOCK() isn't quite right, because if the last XXX NEXT_BLOCK() isn't quite right, because if the last
@ -6013,6 +6015,14 @@ assemble(struct compiler *c, int addNone)
goto error; goto error;
dfs(c, entryblock, &a, nblocks); dfs(c, entryblock, &a, nblocks);
consts = consts_dict_keys_inorder(c->u->u_consts);
if (consts == NULL) {
goto error;
}
if (optimize_cfg(&a, consts)) {
goto error;
}
/* Can't modify the bytecode after computing jump offsets. */ /* Can't modify the bytecode after computing jump offsets. */
assemble_jump_offsets(&a, c); assemble_jump_offsets(&a, c);
@ -6029,8 +6039,9 @@ assemble(struct compiler *c, int addNone)
if (_PyBytes_Resize(&a.a_bytecode, a.a_offset * sizeof(_Py_CODEUNIT)) < 0) if (_PyBytes_Resize(&a.a_bytecode, a.a_offset * sizeof(_Py_CODEUNIT)) < 0)
goto error; goto error;
co = makecode(c, &a); co = makecode(c, &a, consts);
error: error:
Py_XDECREF(consts);
assemble_free(&a); assemble_free(&a);
return co; return co;
} }
@ -6042,3 +6053,324 @@ PyAST_Compile(mod_ty mod, const char *filename, PyCompilerFlags *flags,
{ {
return PyAST_CompileEx(mod, filename, flags, -1, arena); return PyAST_CompileEx(mod, filename, flags, -1, arena);
} }
/* Replace LOAD_CONST c1, LOAD_CONST c2 ... LOAD_CONST cn, BUILD_TUPLE n
with LOAD_CONST (c1, c2, ... cn).
The consts table must still be in list form so that the
new constant (c1, c2, ... cn) can be appended.
Called with codestr pointing to the first LOAD_CONST.
*/
static int
fold_tuple_on_constants(struct instr *inst,
int n, PyObject *consts)
{
/* Pre-conditions */
assert(PyList_CheckExact(consts));
assert(inst[n].i_opcode == BUILD_TUPLE);
assert(inst[n].i_oparg == n);
for (int i = 0; i < n; i++) {
if (inst[i].i_opcode != LOAD_CONST) {
return 0;
}
}
/* Buildup new tuple of constants */
PyObject *newconst = PyTuple_New(n);
if (newconst == NULL) {
return -1;
}
for (int i = 0; i < n; i++) {
int arg = inst[i].i_oparg;
PyObject *constant = PyList_GET_ITEM(consts, arg);
Py_INCREF(constant);
PyTuple_SET_ITEM(newconst, i, constant);
}
Py_ssize_t index = PyList_GET_SIZE(consts);
#if SIZEOF_SIZE_T > SIZEOF_INT
if ((size_t)index >= UINT_MAX - 1) {
Py_DECREF(newconst);
PyErr_SetString(PyExc_OverflowError, "too many constants");
return -1;
}
#endif
if (PyList_Append(consts, newconst)) {
Py_DECREF(newconst);
return -1;
}
Py_DECREF(newconst);
for (int i = 0; i < n; i++) {
inst[i].i_opcode = NOP;
}
inst[n].i_opcode = LOAD_CONST;
inst[n].i_oparg = index;
return 0;
}
/* Optimization */
static int
optimize_basic_block(basicblock *bb, PyObject *consts)
{
assert(PyList_CheckExact(consts));
struct instr nop;
nop.i_opcode = NOP;
struct instr *target;
int lineno;
for (int i = 0; i < bb->b_iused; i++) {
struct instr *inst = &bb->b_instr[i];
int oparg = inst->i_oparg;
int nextop = i+1 < bb->b_iused ? bb->b_instr[i+1].i_opcode : 0;
if (inst->i_jabs || inst->i_jrel) {
/* Skip over empty basic blocks. */
while (inst->i_target->b_iused == 0) {
inst->i_target = inst->i_target->b_next;
}
target = &inst->i_target->b_instr[0];
}
else {
target = &nop;
}
switch (inst->i_opcode) {
/* Skip over LOAD_CONST trueconst
POP_JUMP_IF_FALSE xx. This improves
"while 1" performance. */
case LOAD_CONST:
if (nextop != POP_JUMP_IF_FALSE) {
break;
}
PyObject* cnt = PyList_GET_ITEM(consts, oparg);
int is_true = PyObject_IsTrue(cnt);
if (is_true == -1) {
goto error;
}
if (is_true == 1) {
inst->i_opcode = NOP;
bb->b_instr[i+1].i_opcode = NOP;
bb->b_instr[i+1].i_jabs = 0;
}
break;
/* Try to fold tuples of constants.
Skip over BUILD_SEQN 1 UNPACK_SEQN 1.
Replace BUILD_SEQN 2 UNPACK_SEQN 2 with ROT2.
Replace BUILD_SEQN 3 UNPACK_SEQN 3 with ROT3 ROT2. */
case BUILD_TUPLE:
if (nextop == UNPACK_SEQUENCE && oparg == bb->b_instr[i+1].i_oparg) {
switch(oparg) {
case 1:
inst->i_opcode = NOP;
bb->b_instr[i+1].i_opcode = NOP;
break;
case 2:
inst->i_opcode = ROT_TWO;
bb->b_instr[i+1].i_opcode = NOP;
break;
case 3:
inst->i_opcode = ROT_THREE;
bb->b_instr[i+1].i_opcode = ROT_TWO;
}
break;
}
if (i >= oparg) {
if (fold_tuple_on_constants(inst-oparg, oparg, consts)) {
goto error;
}
}
break;
/* Simplify conditional jump to conditional jump where the
result of the first test implies the success of a similar
test or the failure of the opposite test.
Arises in code like:
"a and b or c"
"(a and b) and c"
"(a or b) or c"
"(a or b) and c"
x:JUMP_IF_FALSE_OR_POP y y:JUMP_IF_FALSE_OR_POP z
--> x:JUMP_IF_FALSE_OR_POP z
x:JUMP_IF_FALSE_OR_POP y y:JUMP_IF_TRUE_OR_POP z
--> x:POP_JUMP_IF_FALSE y+1
where y+1 is the instruction following the second test.
*/
case JUMP_IF_FALSE_OR_POP:
switch(target->i_opcode) {
case POP_JUMP_IF_FALSE:
*inst = *target;
break;
case JUMP_ABSOLUTE:
case JUMP_FORWARD:
case JUMP_IF_FALSE_OR_POP:
inst->i_target = target->i_target;
break;
case JUMP_IF_TRUE_OR_POP:
assert (inst->i_target->b_iused == 1);
inst->i_opcode = POP_JUMP_IF_FALSE;
inst->i_target = inst->i_target->b_next;
break;
}
break;
case JUMP_IF_TRUE_OR_POP:
switch(target->i_opcode) {
case POP_JUMP_IF_TRUE:
*inst = *target;
break;
case JUMP_ABSOLUTE:
case JUMP_FORWARD:
case JUMP_IF_TRUE_OR_POP:
inst->i_target = target->i_target;
break;
case JUMP_IF_FALSE_OR_POP:
assert (inst->i_target->b_iused == 1);
inst->i_opcode = POP_JUMP_IF_TRUE;
inst->i_target = inst->i_target->b_next;
break;
}
break;
case POP_JUMP_IF_FALSE:
switch(target->i_opcode) {
case JUMP_ABSOLUTE:
case JUMP_FORWARD:
inst->i_target = target->i_target;
break;
}
break;
case POP_JUMP_IF_TRUE:
switch(target->i_opcode) {
case JUMP_ABSOLUTE:
case JUMP_FORWARD:
inst->i_target = target->i_target;
break;
}
break;
case JUMP_ABSOLUTE:
case JUMP_FORWARD:
switch(target->i_opcode) {
case JUMP_FORWARD:
inst->i_target = target->i_target;
break;
case JUMP_ABSOLUTE:
case RETURN_VALUE:
case RERAISE:
case RAISE_VARARGS:
lineno = inst->i_lineno;
*inst = *target;
inst->i_lineno = lineno;
break;
}
break;
}
}
return 0;
error:
return -1;
}
static void
clean_basic_block(basicblock *bb) {
/* Remove NOPs and any code following a return or re-raise. */
int dest = 0;
for (int src = 0; src < bb->b_iused; src++) {
switch(bb->b_instr[src].i_opcode) {
case NOP:
/* skip */
break;
case RETURN_VALUE:
case RERAISE:
bb->b_next = NULL;
bb->b_instr[dest] = bb->b_instr[src];
dest++;
goto end;
default:
if (dest != src) {
bb->b_instr[dest] = bb->b_instr[src];
}
dest++;
break;
}
}
end:
assert(dest <= bb->b_iused);
bb->b_iused = dest;
}
static int
mark_reachable(struct assembler *a) {
basicblock **stack, **sp;
sp = stack = (basicblock **)PyObject_Malloc(sizeof(basicblock *) * a->a_nblocks);
if (stack == NULL) {
return -1;
}
basicblock *entry = a->a_reverse_postorder[0];
entry->b_reachable = 1;
*sp++ = entry;
while (sp > stack) {
basicblock *b = *(--sp);
if (b->b_next && b->b_next->b_reachable == 0) {
b->b_next->b_reachable = 1;
*sp++ = b->b_next;
}
for (int i = 0; i < b->b_iused; i++) {
basicblock *target;
if (b->b_instr[i].i_jrel || b->b_instr[i].i_jabs) {
target = b->b_instr[i].i_target;
if (target->b_reachable == 0) {
target->b_reachable = 1;
*sp++ = target;
}
}
}
}
PyObject_Free(stack);
return 0;
}
/* Perform basic peephole optimizations on a control flow graph.
The consts object should still be in list form to allow new constants
to be appended.
All transformations keep the code size the same or smaller.
For those that reduce size, the gaps are initially filled with
NOPs. Later those NOPs are removed.
*/
static int
optimize_cfg(struct assembler *a, PyObject *consts)
{
for (int i = 0; i < a->a_nblocks; i++) {
if (optimize_basic_block(a->a_reverse_postorder[i], consts)) {
return -1;
}
clean_basic_block(a->a_reverse_postorder[i]);
assert(a->a_reverse_postorder[i]->b_reachable == 0);
}
if (mark_reachable(a)) {
return -1;
}
/* Delete unreachable instructions */
for (int i = 0; i < a->a_nblocks; i++) {
if (a->a_reverse_postorder[i]->b_reachable == 0) {
a->a_reverse_postorder[i]->b_iused = 0;
}
}
return 0;
}
/* Retained for API compatibility.
* Optimization is now done in optimize_cfg */
PyObject *
PyCode_Optimize(PyObject *code, PyObject* Py_UNUSED(consts),
PyObject *Py_UNUSED(names), PyObject *Py_UNUSED(lnotab_obj))
{
Py_INCREF(code);
return code;
}

2200
Python/importlib.h generated

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -502,460 +502,459 @@ const unsigned char _Py_M__zipimport[] = {
0,0,114,9,0,0,0,114,10,0,0,0,114,37,0,0, 0,0,114,9,0,0,0,114,10,0,0,0,114,37,0,0,
0,53,1,0,0,115,4,0,0,0,0,4,8,2,114,37, 0,53,1,0,0,115,4,0,0,0,0,4,8,2,114,37,
0,0,0,99,2,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,99,2,0,0,0,0,0,0,0,0,0,0,0,
7,0,0,0,4,0,0,0,67,0,0,0,115,56,0,0, 7,0,0,0,4,0,0,0,67,0,0,0,115,54,0,0,
0,116,0,124,0,124,1,131,2,125,2,116,1,68,0,93, 0,116,0,124,0,124,1,131,2,125,2,116,1,68,0,93,
36,92,3,125,3,125,4,125,5,124,2,124,3,23,0,125, 34,92,3,125,3,125,4,125,5,124,2,124,3,23,0,125,
6,124,6,124,0,106,2,118,0,114,14,124,5,2,0,1, 6,124,6,124,0,106,2,118,0,114,14,124,5,2,0,1,
0,83,0,113,14,100,0,83,0,114,86,0,0,0,41,3, 0,83,0,100,0,83,0,114,86,0,0,0,41,3,114,36,
114,36,0,0,0,218,16,95,122,105,112,95,115,101,97,114, 0,0,0,218,16,95,122,105,112,95,115,101,97,114,99,104,
99,104,111,114,100,101,114,114,28,0,0,0,41,7,114,32, 111,114,100,101,114,114,28,0,0,0,41,7,114,32,0,0,
0,0,0,114,38,0,0,0,114,13,0,0,0,218,6,115, 0,114,38,0,0,0,114,13,0,0,0,218,6,115,117,102,
117,102,102,105,120,218,10,105,115,98,121,116,101,99,111,100, 102,105,120,218,10,105,115,98,121,116,101,99,111,100,101,114,
101,114,47,0,0,0,114,63,0,0,0,114,9,0,0,0, 47,0,0,0,114,63,0,0,0,114,9,0,0,0,114,9,
114,9,0,0,0,114,10,0,0,0,114,35,0,0,0,62, 0,0,0,114,10,0,0,0,114,35,0,0,0,62,1,0,
1,0,0,115,12,0,0,0,0,1,10,1,14,1,8,1, 0,115,12,0,0,0,0,1,10,1,14,1,8,1,10,1,
10,1,10,1,114,35,0,0,0,99,1,0,0,0,0,0, 8,1,114,35,0,0,0,99,1,0,0,0,0,0,0,0,
0,0,0,0,0,0,26,0,0,0,9,0,0,0,67,0, 0,0,0,0,26,0,0,0,9,0,0,0,67,0,0,0,
0,0,115,2,5,0,0,122,14,116,0,160,1,124,0,161, 115,2,5,0,0,122,14,116,0,160,1,124,0,161,1,125,
1,125,1,87,0,110,36,4,0,116,2,121,50,1,0,1, 1,87,0,110,36,4,0,116,2,121,50,1,0,1,0,1,
0,1,0,116,3,100,1,124,0,155,2,157,2,124,0,100, 0,116,3,100,1,124,0,155,2,157,2,124,0,100,2,141,
2,141,2,130,1,89,0,110,2,48,0,124,1,144,4,143, 2,130,1,89,0,110,2,48,0,124,1,144,4,143,164,1,
164,1,0,122,36,124,1,160,4,116,5,11,0,100,3,161, 0,122,36,124,1,160,4,116,5,11,0,100,3,161,2,1,
2,1,0,124,1,160,6,161,0,125,2,124,1,160,7,116, 0,124,1,160,6,161,0,125,2,124,1,160,7,116,5,161,
5,161,1,125,3,87,0,110,36,4,0,116,2,121,132,1, 1,125,3,87,0,110,36,4,0,116,2,121,132,1,0,1,
0,1,0,1,0,116,3,100,4,124,0,155,2,157,2,124,
0,100,2,141,2,130,1,89,0,110,2,48,0,116,8,124,
3,131,1,116,5,107,3,114,164,116,3,100,4,124,0,155,
2,157,2,124,0,100,2,141,2,130,1,124,3,100,0,100,
5,133,2,25,0,116,9,107,3,144,1,114,170,122,24,124,
1,160,4,100,6,100,3,161,2,1,0,124,1,160,6,161,
0,125,4,87,0,110,36,4,0,116,2,121,242,1,0,1,
0,1,0,116,3,100,4,124,0,155,2,157,2,124,0,100, 0,1,0,116,3,100,4,124,0,155,2,157,2,124,0,100,
2,141,2,130,1,89,0,110,2,48,0,116,10,124,4,116, 2,141,2,130,1,89,0,110,2,48,0,116,8,124,3,131,
11,24,0,116,5,24,0,100,6,131,2,125,5,122,22,124, 1,116,5,107,3,114,164,116,3,100,4,124,0,155,2,157,
1,160,4,124,5,161,1,1,0,124,1,160,7,161,0,125, 2,124,0,100,2,141,2,130,1,124,3,100,0,100,5,133,
6,87,0,110,38,4,0,116,2,144,1,121,66,1,0,1, 2,25,0,116,9,107,3,144,1,114,170,122,24,124,1,160,
0,1,0,116,3,100,4,124,0,155,2,157,2,124,0,100, 4,100,6,100,3,161,2,1,0,124,1,160,6,161,0,125,
2,141,2,130,1,89,0,110,2,48,0,124,6,160,12,116, 4,87,0,110,36,4,0,116,2,121,242,1,0,1,0,1,
9,161,1,125,7,124,7,100,6,107,0,144,1,114,106,116, 0,116,3,100,4,124,0,155,2,157,2,124,0,100,2,141,
3,100,7,124,0,155,2,157,2,124,0,100,2,141,2,130, 2,130,1,89,0,110,2,48,0,116,10,124,4,116,11,24,
1,124,6,124,7,124,7,116,5,23,0,133,2,25,0,125, 0,116,5,24,0,100,6,131,2,125,5,122,22,124,1,160,
3,116,8,124,3,131,1,116,5,107,3,144,1,114,154,116, 4,124,5,161,1,1,0,124,1,160,7,161,0,125,6,87,
3,100,8,124,0,155,2,157,2,124,0,100,2,141,2,130, 0,110,38,4,0,116,2,144,1,121,66,1,0,1,0,1,
1,124,4,116,8,124,6,131,1,24,0,124,7,23,0,125, 0,116,3,100,4,124,0,155,2,157,2,124,0,100,2,141,
2,116,13,124,3,100,9,100,10,133,2,25,0,131,1,125, 2,130,1,89,0,110,2,48,0,124,6,160,12,116,9,161,
8,116,13,124,3,100,10,100,11,133,2,25,0,131,1,125, 1,125,7,124,7,100,6,107,0,144,1,114,106,116,3,100,
9,124,2,124,8,107,0,144,1,114,230,116,3,100,12,124, 7,124,0,155,2,157,2,124,0,100,2,141,2,130,1,124,
0,155,2,157,2,124,0,100,2,141,2,130,1,124,2,124, 6,124,7,124,7,116,5,23,0,133,2,25,0,125,3,116,
9,107,0,144,2,114,2,116,3,100,13,124,0,155,2,157, 8,124,3,131,1,116,5,107,3,144,1,114,154,116,3,100,
2,124,0,100,2,141,2,130,1,124,2,124,8,56,0,125, 8,124,0,155,2,157,2,124,0,100,2,141,2,130,1,124,
2,124,2,124,9,24,0,125,10,124,10,100,6,107,0,144, 4,116,8,124,6,131,1,24,0,124,7,23,0,125,2,116,
2,114,46,116,3,100,14,124,0,155,2,157,2,124,0,100, 13,124,3,100,9,100,10,133,2,25,0,131,1,125,8,116,
2,141,2,130,1,105,0,125,11,100,6,125,12,122,14,124, 13,124,3,100,10,100,11,133,2,25,0,131,1,125,9,124,
1,160,4,124,2,161,1,1,0,87,0,110,38,4,0,116, 2,124,8,107,0,144,1,114,230,116,3,100,12,124,0,155,
2,144,2,121,106,1,0,1,0,1,0,116,3,100,4,124, 2,157,2,124,0,100,2,141,2,130,1,124,2,124,9,107,
0,144,2,114,2,116,3,100,13,124,0,155,2,157,2,124,
0,100,2,141,2,130,1,124,2,124,8,56,0,125,2,124,
2,124,9,24,0,125,10,124,10,100,6,107,0,144,2,114,
46,116,3,100,14,124,0,155,2,157,2,124,0,100,2,141,
2,130,1,105,0,125,11,100,6,125,12,122,14,124,1,160,
4,124,2,161,1,1,0,87,0,110,38,4,0,116,2,144,
2,121,106,1,0,1,0,1,0,116,3,100,4,124,0,155,
2,157,2,124,0,100,2,141,2,130,1,89,0,110,2,48,
0,124,1,160,7,100,15,161,1,125,3,116,8,124,3,131,
1,100,5,107,0,144,2,114,140,116,14,100,16,131,1,130,
1,124,3,100,0,100,5,133,2,25,0,100,17,107,3,144,
2,114,162,144,4,113,208,116,8,124,3,131,1,100,15,107,
3,144,2,114,184,116,14,100,16,131,1,130,1,116,15,124,
3,100,18,100,19,133,2,25,0,131,1,125,13,116,15,124,
3,100,19,100,9,133,2,25,0,131,1,125,14,116,15,124,
3,100,9,100,20,133,2,25,0,131,1,125,15,116,15,124,
3,100,20,100,10,133,2,25,0,131,1,125,16,116,13,124,
3,100,10,100,11,133,2,25,0,131,1,125,17,116,13,124,
3,100,11,100,21,133,2,25,0,131,1,125,18,116,13,124,
3,100,21,100,22,133,2,25,0,131,1,125,4,116,15,124,
3,100,22,100,23,133,2,25,0,131,1,125,19,116,15,124,
3,100,23,100,24,133,2,25,0,131,1,125,20,116,15,124,
3,100,24,100,25,133,2,25,0,131,1,125,21,116,13,124,
3,100,26,100,15,133,2,25,0,131,1,125,22,124,19,124,
20,23,0,124,21,23,0,125,8,124,22,124,9,107,4,144,
3,114,144,116,3,100,27,124,0,155,2,157,2,124,0,100,
2,141,2,130,1,124,22,124,10,55,0,125,22,122,14,124,
1,160,7,124,19,161,1,125,23,87,0,110,38,4,0,116,
2,144,3,121,204,1,0,1,0,1,0,116,3,100,4,124,
0,155,2,157,2,124,0,100,2,141,2,130,1,89,0,110, 0,155,2,157,2,124,0,100,2,141,2,130,1,89,0,110,
2,48,0,124,1,160,7,100,15,161,1,125,3,116,8,124, 2,48,0,116,8,124,23,131,1,124,19,107,3,144,3,114,
3,131,1,100,5,107,0,144,2,114,140,116,14,100,16,131, 238,116,3,100,4,124,0,155,2,157,2,124,0,100,2,141,
1,130,1,124,3,100,0,100,5,133,2,25,0,100,17,107, 2,130,1,122,50,116,8,124,1,160,7,124,8,124,19,24,
3,144,2,114,162,144,4,113,208,116,8,124,3,131,1,100, 0,161,1,131,1,124,8,124,19,24,0,107,3,144,4,114,
15,107,3,144,2,114,184,116,14,100,16,131,1,130,1,116, 30,116,3,100,4,124,0,155,2,157,2,124,0,100,2,141,
15,124,3,100,18,100,19,133,2,25,0,131,1,125,13,116, 2,130,1,87,0,110,38,4,0,116,2,144,4,121,70,1,
15,124,3,100,19,100,9,133,2,25,0,131,1,125,14,116, 0,1,0,1,0,116,3,100,4,124,0,155,2,157,2,124,
15,124,3,100,9,100,20,133,2,25,0,131,1,125,15,116, 0,100,2,141,2,130,1,89,0,110,2,48,0,124,13,100,
15,124,3,100,20,100,10,133,2,25,0,131,1,125,16,116, 28,64,0,144,4,114,92,124,23,160,16,161,0,125,23,110,
13,124,3,100,10,100,11,133,2,25,0,131,1,125,17,116, 52,122,14,124,23,160,16,100,29,161,1,125,23,87,0,110,
13,124,3,100,11,100,21,133,2,25,0,131,1,125,18,116, 36,4,0,116,17,144,4,121,142,1,0,1,0,1,0,124,
13,124,3,100,21,100,22,133,2,25,0,131,1,125,4,116, 23,160,16,100,30,161,1,160,18,116,19,161,1,125,23,89,
15,124,3,100,22,100,23,133,2,25,0,131,1,125,19,116, 0,110,2,48,0,124,23,160,20,100,31,116,21,161,2,125,
15,124,3,100,23,100,24,133,2,25,0,131,1,125,20,116, 23,116,22,160,23,124,0,124,23,161,2,125,24,124,24,124,
15,124,3,100,24,100,25,133,2,25,0,131,1,125,21,116, 14,124,18,124,4,124,22,124,15,124,16,124,17,102,8,125,
13,124,3,100,26,100,15,133,2,25,0,131,1,125,22,124, 25,124,25,124,11,124,23,60,0,124,12,100,32,55,0,125,
19,124,20,23,0,124,21,23,0,125,8,124,22,124,9,107, 12,144,2,113,108,87,0,100,0,4,0,4,0,131,3,1,
4,144,3,114,144,116,3,100,27,124,0,155,2,157,2,124, 0,110,18,49,0,144,4,115,230,48,0,1,0,1,0,1,
0,100,2,141,2,130,1,124,22,124,10,55,0,125,22,122, 0,89,0,1,0,116,24,160,25,100,33,124,12,124,0,161,
14,124,1,160,7,124,19,161,1,125,23,87,0,110,38,4, 3,1,0,124,11,83,0,41,34,78,122,21,99,97,110,39,
0,116,2,144,3,121,204,1,0,1,0,1,0,116,3,100, 116,32,111,112,101,110,32,90,105,112,32,102,105,108,101,58,
4,124,0,155,2,157,2,124,0,100,2,141,2,130,1,89, 32,114,12,0,0,0,114,84,0,0,0,250,21,99,97,110,
0,110,2,48,0,116,8,124,23,131,1,124,19,107,3,144, 39,116,32,114,101,97,100,32,90,105,112,32,102,105,108,101,
3,114,238,116,3,100,4,124,0,155,2,157,2,124,0,100, 58,32,233,4,0,0,0,114,0,0,0,0,122,16,110,111,
2,141,2,130,1,122,50,116,8,124,1,160,7,124,8,124, 116,32,97,32,90,105,112,32,102,105,108,101,58,32,122,18,
19,24,0,161,1,131,1,124,8,124,19,24,0,107,3,144, 99,111,114,114,117,112,116,32,90,105,112,32,102,105,108,101,
4,114,30,116,3,100,4,124,0,155,2,157,2,124,0,100, 58,32,233,12,0,0,0,233,16,0,0,0,233,20,0,0,
2,141,2,130,1,87,0,110,38,4,0,116,2,144,4,121, 0,122,28,98,97,100,32,99,101,110,116,114,97,108,32,100,
70,1,0,1,0,1,0,116,3,100,4,124,0,155,2,157, 105,114,101,99,116,111,114,121,32,115,105,122,101,58,32,122,
2,124,0,100,2,141,2,130,1,89,0,110,2,48,0,124, 30,98,97,100,32,99,101,110,116,114,97,108,32,100,105,114,
13,100,28,64,0,144,4,114,92,124,23,160,16,161,0,125, 101,99,116,111,114,121,32,111,102,102,115,101,116,58,32,122,
23,110,52,122,14,124,23,160,16,100,29,161,1,125,23,87, 38,98,97,100,32,99,101,110,116,114,97,108,32,100,105,114,
0,110,36,4,0,116,17,144,4,121,142,1,0,1,0,1, 101,99,116,111,114,121,32,115,105,122,101,32,111,114,32,111,
0,124,23,160,16,100,30,161,1,160,18,116,19,161,1,125, 102,102,115,101,116,58,32,233,46,0,0,0,250,27,69,79,
23,89,0,110,2,48,0,124,23,160,20,100,31,116,21,161, 70,32,114,101,97,100,32,119,104,101,114,101,32,110,111,116,
2,125,23,116,22,160,23,124,0,124,23,161,2,125,24,124, 32,101,120,112,101,99,116,101,100,115,4,0,0,0,80,75,
24,124,14,124,18,124,4,124,22,124,15,124,16,124,17,102, 1,2,233,8,0,0,0,233,10,0,0,0,233,14,0,0,
8,125,25,124,25,124,11,124,23,60,0,124,12,100,32,55, 0,233,24,0,0,0,233,28,0,0,0,233,30,0,0,0,
0,125,12,144,2,113,108,87,0,100,0,4,0,4,0,131, 233,32,0,0,0,233,34,0,0,0,233,42,0,0,0,122,
3,1,0,110,18,49,0,144,4,115,230,48,0,1,0,1, 25,98,97,100,32,108,111,99,97,108,32,104,101,97,100,101,
0,1,0,89,0,1,0,116,24,160,25,100,33,124,12,124, 114,32,111,102,102,115,101,116,58,32,105,0,8,0,0,218,
0,161,3,1,0,124,11,83,0,41,34,78,122,21,99,97, 5,97,115,99,105,105,90,6,108,97,116,105,110,49,250,1,
110,39,116,32,111,112,101,110,32,90,105,112,32,102,105,108, 47,114,5,0,0,0,122,33,122,105,112,105,109,112,111,114,
101,58,32,114,12,0,0,0,114,84,0,0,0,250,21,99, 116,58,32,102,111,117,110,100,32,123,125,32,110,97,109,101,
97,110,39,116,32,114,101,97,100,32,90,105,112,32,102,105, 115,32,105,110,32,123,33,114,125,41,26,218,3,95,105,111,
108,101,58,32,233,4,0,0,0,114,0,0,0,0,122,16, 218,9,111,112,101,110,95,99,111,100,101,114,22,0,0,0,
110,111,116,32,97,32,90,105,112,32,102,105,108,101,58,32, 114,3,0,0,0,218,4,115,101,101,107,218,20,69,78,68,
122,18,99,111,114,114,117,112,116,32,90,105,112,32,102,105, 95,67,69,78,84,82,65,76,95,68,73,82,95,83,73,90,
108,101,58,32,233,12,0,0,0,233,16,0,0,0,233,20, 69,90,4,116,101,108,108,218,4,114,101,97,100,114,51,0,
0,0,0,122,28,98,97,100,32,99,101,110,116,114,97,108, 0,0,218,18,83,84,82,73,78,71,95,69,78,68,95,65,
32,100,105,114,101,99,116,111,114,121,32,115,105,122,101,58, 82,67,72,73,86,69,218,3,109,97,120,218,15,77,65,88,
32,122,30,98,97,100,32,99,101,110,116,114,97,108,32,100, 95,67,79,77,77,69,78,84,95,76,69,78,218,5,114,102,
105,114,101,99,116,111,114,121,32,111,102,102,115,101,116,58, 105,110,100,114,2,0,0,0,218,8,69,79,70,69,114,114,
32,122,38,98,97,100,32,99,101,110,116,114,97,108,32,100, 111,114,114,1,0,0,0,114,62,0,0,0,218,18,85,110,
105,114,101,99,116,111,114,121,32,115,105,122,101,32,111,114, 105,99,111,100,101,68,101,99,111,100,101,69,114,114,111,114,
32,111,102,102,115,101,116,58,32,233,46,0,0,0,250,27, 218,9,116,114,97,110,115,108,97,116,101,218,11,99,112,52,
69,79,70,32,114,101,97,100,32,119,104,101,114,101,32,110, 51,55,95,116,97,98,108,101,114,19,0,0,0,114,20,0,
111,116,32,101,120,112,101,99,116,101,100,115,4,0,0,0, 0,0,114,21,0,0,0,114,30,0,0,0,114,76,0,0,
80,75,1,2,233,8,0,0,0,233,10,0,0,0,233,14, 0,114,77,0,0,0,41,26,114,29,0,0,0,218,2,102,
0,0,0,233,24,0,0,0,233,28,0,0,0,233,30,0, 112,90,15,104,101,97,100,101,114,95,112,111,115,105,116,105,
0,0,233,32,0,0,0,233,34,0,0,0,233,42,0,0, 111,110,218,6,98,117,102,102,101,114,218,9,102,105,108,101,
0,122,25,98,97,100,32,108,111,99,97,108,32,104,101,97, 95,115,105,122,101,90,17,109,97,120,95,99,111,109,109,101,
100,101,114,32,111,102,102,115,101,116,58,32,105,0,8,0, 110,116,95,115,116,97,114,116,218,4,100,97,116,97,90,3,
0,218,5,97,115,99,105,105,90,6,108,97,116,105,110,49, 112,111,115,218,11,104,101,97,100,101,114,95,115,105,122,101,
250,1,47,114,5,0,0,0,122,33,122,105,112,105,109,112, 90,13,104,101,97,100,101,114,95,111,102,102,115,101,116,90,
111,114,116,58,32,102,111,117,110,100,32,123,125,32,110,97, 10,97,114,99,95,111,102,102,115,101,116,114,33,0,0,0,
109,101,115,32,105,110,32,123,33,114,125,41,26,218,3,95, 218,5,99,111,117,110,116,218,5,102,108,97,103,115,218,8,
105,111,218,9,111,112,101,110,95,99,111,100,101,114,22,0, 99,111,109,112,114,101,115,115,218,4,116,105,109,101,218,4,
0,0,114,3,0,0,0,218,4,115,101,101,107,218,20,69, 100,97,116,101,218,3,99,114,99,218,9,100,97,116,97,95,
78,68,95,67,69,78,84,82,65,76,95,68,73,82,95,83, 115,105,122,101,218,9,110,97,109,101,95,115,105,122,101,218,
73,90,69,90,4,116,101,108,108,218,4,114,101,97,100,114, 10,101,120,116,114,97,95,115,105,122,101,90,12,99,111,109,
51,0,0,0,218,18,83,84,82,73,78,71,95,69,78,68, 109,101,110,116,95,115,105,122,101,218,11,102,105,108,101,95,
95,65,82,67,72,73,86,69,218,3,109,97,120,218,15,77, 111,102,102,115,101,116,114,59,0,0,0,114,13,0,0,0,
65,88,95,67,79,77,77,69,78,84,95,76,69,78,218,5, 218,1,116,114,9,0,0,0,114,9,0,0,0,114,10,0,
114,102,105,110,100,114,2,0,0,0,218,8,69,79,70,69, 0,0,114,27,0,0,0,93,1,0,0,115,212,0,0,0,
114,114,111,114,114,1,0,0,0,114,62,0,0,0,218,18, 0,1,2,1,14,1,12,1,24,2,8,1,2,1,14,1,
85,110,105,99,111,100,101,68,101,99,111,100,101,69,114,114, 8,1,14,1,12,1,24,1,12,1,18,1,18,3,2,1,
111,114,218,9,116,114,97,110,115,108,97,116,101,218,11,99, 12,1,12,1,12,1,10,1,2,255,12,2,8,1,2,255,
112,52,51,55,95,116,97,98,108,101,114,19,0,0,0,114, 2,1,2,255,4,2,2,1,10,1,12,1,14,1,10,1,
20,0,0,0,114,21,0,0,0,114,30,0,0,0,114,76, 2,255,12,2,10,1,10,1,10,1,2,255,6,2,16,1,
0,0,0,114,77,0,0,0,41,26,114,29,0,0,0,218, 14,1,10,1,2,255,6,2,16,2,16,1,16,1,10,1,
2,102,112,90,15,104,101,97,100,101,114,95,112,111,115,105, 18,1,10,1,18,1,8,1,8,1,10,1,18,2,4,2,
116,105,111,110,218,6,98,117,102,102,101,114,218,9,102,105, 4,1,2,1,14,1,14,1,24,2,10,1,14,1,8,2,
108,101,95,115,105,122,101,90,17,109,97,120,95,99,111,109, 18,1,4,1,14,1,8,1,16,1,16,1,16,1,16,1,
109,101,110,116,95,115,116,97,114,116,218,4,100,97,116,97, 16,1,16,1,16,1,16,1,16,1,16,1,16,1,12,1,
90,3,112,111,115,218,11,104,101,97,100,101,114,95,115,105, 10,1,18,1,8,2,2,1,14,1,14,1,24,1,14,1,
122,101,90,13,104,101,97,100,101,114,95,111,102,102,115,101, 18,4,2,1,28,1,22,1,14,1,24,2,10,2,10,3,
116,90,10,97,114,99,95,111,102,102,115,101,116,114,33,0, 2,1,14,1,14,1,22,2,12,1,12,1,20,1,8,1,
0,0,218,5,99,111,117,110,116,218,5,102,108,97,103,115, 44,1,14,1,114,27,0,0,0,117,190,1,0,0,0,1,
218,8,99,111,109,112,114,101,115,115,218,4,116,105,109,101, 2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,
218,4,100,97,116,101,218,3,99,114,99,218,9,100,97,116, 18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,
97,95,115,105,122,101,218,9,110,97,109,101,95,115,105,122, 34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,
101,218,10,101,120,116,114,97,95,115,105,122,101,90,12,99, 50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,
111,109,109,101,110,116,95,115,105,122,101,218,11,102,105,108, 66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,
101,95,111,102,102,115,101,116,114,59,0,0,0,114,13,0, 82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,
0,0,218,1,116,114,9,0,0,0,114,9,0,0,0,114, 98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,
10,0,0,0,114,27,0,0,0,93,1,0,0,115,212,0, 114,115,116,117,118,119,120,121,122,123,124,125,126,127,195,135,
0,0,0,1,2,1,14,1,12,1,24,2,8,1,2,1, 195,188,195,169,195,162,195,164,195,160,195,165,195,167,195,170,
14,1,8,1,14,1,12,1,24,1,12,1,18,1,18,3, 195,171,195,168,195,175,195,174,195,172,195,132,195,133,195,137,
2,1,12,1,12,1,12,1,10,1,2,255,12,2,8,1, 195,166,195,134,195,180,195,182,195,178,195,187,195,185,195,191,
2,255,2,1,2,255,4,2,2,1,10,1,12,1,14,1, 195,150,195,156,194,162,194,163,194,165,226,130,167,198,146,195,
10,1,2,255,12,2,10,1,10,1,10,1,2,255,6,2, 161,195,173,195,179,195,186,195,177,195,145,194,170,194,186,194,
16,1,14,1,10,1,2,255,6,2,16,2,16,1,16,1, 191,226,140,144,194,172,194,189,194,188,194,161,194,171,194,187,
10,1,18,1,10,1,18,1,8,1,8,1,10,1,18,2, 226,150,145,226,150,146,226,150,147,226,148,130,226,148,164,226,
4,2,4,1,2,1,14,1,14,1,24,2,10,1,14,1, 149,161,226,149,162,226,149,150,226,149,149,226,149,163,226,149,
8,2,18,1,4,1,14,1,8,1,16,1,16,1,16,1, 145,226,149,151,226,149,157,226,149,156,226,149,155,226,148,144,
16,1,16,1,16,1,16,1,16,1,16,1,16,1,16,1, 226,148,148,226,148,180,226,148,172,226,148,156,226,148,128,226,
12,1,10,1,18,1,8,2,2,1,14,1,14,1,24,1, 148,188,226,149,158,226,149,159,226,149,154,226,149,148,226,149,
14,1,18,4,2,1,28,1,22,1,14,1,24,2,10,2, 169,226,149,166,226,149,160,226,149,144,226,149,172,226,149,167,
10,3,2,1,14,1,14,1,22,2,12,1,12,1,20,1, 226,149,168,226,149,164,226,149,165,226,149,153,226,149,152,226,
8,1,44,1,14,1,114,27,0,0,0,117,190,1,0,0, 149,146,226,149,147,226,149,171,226,149,170,226,148,152,226,148,
0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15, 140,226,150,136,226,150,132,226,150,140,226,150,144,226,150,128,
16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31, 206,177,195,159,206,147,207,128,206,163,207,131,194,181,207,132,
32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47, 206,166,206,152,206,169,206,180,226,136,158,207,134,206,181,226,
48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63, 136,169,226,137,161,194,177,226,137,165,226,137,164,226,140,160,
64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79, 226,140,161,195,183,226,137,136,194,176,226,136,153,194,183,226,
80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95, 136,154,226,129,191,194,178,226,150,160,194,160,99,0,0,0,
96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111, 0,0,0,0,0,0,0,0,0,1,0,0,0,8,0,0,
112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127, 0,67,0,0,0,115,110,0,0,0,116,0,114,22,116,1,
195,135,195,188,195,169,195,162,195,164,195,160,195,165,195,167, 160,2,100,1,161,1,1,0,116,3,100,2,131,1,130,1,
195,170,195,171,195,168,195,175,195,174,195,172,195,132,195,133, 100,3,97,0,122,62,122,16,100,4,100,5,108,4,109,5,
195,137,195,166,195,134,195,180,195,182,195,178,195,187,195,185, 125,0,1,0,87,0,110,36,4,0,116,6,121,80,1,0,
195,191,195,150,195,156,194,162,194,163,194,165,226,130,167,198, 1,0,1,0,116,1,160,2,100,1,161,1,1,0,116,3,
146,195,161,195,173,195,179,195,186,195,177,195,145,194,170,194, 100,2,131,1,130,1,89,0,110,2,48,0,87,0,100,6,
186,194,191,226,140,144,194,172,194,189,194,188,194,161,194,171, 97,0,110,6,100,6,97,0,48,0,116,1,160,2,100,7,
194,187,226,150,145,226,150,146,226,150,147,226,148,130,226,148, 161,1,1,0,124,0,83,0,41,8,78,122,27,122,105,112,
164,226,149,161,226,149,162,226,149,150,226,149,149,226,149,163, 105,109,112,111,114,116,58,32,122,108,105,98,32,85,78,65,
226,149,145,226,149,151,226,149,157,226,149,156,226,149,155,226, 86,65,73,76,65,66,76,69,250,41,99,97,110,39,116,32,
148,144,226,148,148,226,148,180,226,148,172,226,148,156,226,148, 100,101,99,111,109,112,114,101,115,115,32,100,97,116,97,59,
128,226,148,188,226,149,158,226,149,159,226,149,154,226,149,148, 32,122,108,105,98,32,110,111,116,32,97,118,97,105,108,97,
226,149,169,226,149,166,226,149,160,226,149,144,226,149,172,226, 98,108,101,84,114,0,0,0,0,169,1,218,10,100,101,99,
149,167,226,149,168,226,149,164,226,149,165,226,149,153,226,149, 111,109,112,114,101,115,115,70,122,25,122,105,112,105,109,112,
152,226,149,146,226,149,147,226,149,171,226,149,170,226,148,152, 111,114,116,58,32,122,108,105,98,32,97,118,97,105,108,97,
226,148,140,226,150,136,226,150,132,226,150,140,226,150,144,226, 98,108,101,41,7,218,15,95,105,109,112,111,114,116,105,110,
150,128,206,177,195,159,206,147,207,128,206,163,207,131,194,181, 103,95,122,108,105,98,114,76,0,0,0,114,77,0,0,0,
207,132,206,166,206,152,206,169,206,180,226,136,158,207,134,206, 114,3,0,0,0,90,4,122,108,105,98,114,139,0,0,0,
181,226,136,169,226,137,161,194,177,226,137,165,226,137,164,226, 218,9,69,120,99,101,112,116,105,111,110,114,138,0,0,0,
140,160,226,140,161,195,183,226,137,136,194,176,226,136,153,194, 114,9,0,0,0,114,9,0,0,0,114,10,0,0,0,218,
183,226,136,154,226,129,191,194,178,226,150,160,194,160,99,0, 20,95,103,101,116,95,100,101,99,111,109,112,114,101,115,115,
0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,8, 95,102,117,110,99,251,1,0,0,115,24,0,0,0,0,2,
0,0,0,67,0,0,0,115,110,0,0,0,116,0,114,22, 4,3,10,1,8,2,4,1,4,1,16,1,12,1,10,1,
116,1,160,2,100,1,161,1,1,0,116,3,100,2,131,1, 16,2,12,2,10,1,114,142,0,0,0,99,2,0,0,0,
130,1,100,3,97,0,122,62,122,16,100,4,100,5,108,4, 0,0,0,0,0,0,0,0,17,0,0,0,9,0,0,0,
109,5,125,0,1,0,87,0,110,36,4,0,116,6,121,80, 67,0,0,0,115,144,1,0,0,124,1,92,8,125,2,125,
1,0,1,0,1,0,116,1,160,2,100,1,161,1,1,0, 3,125,4,125,5,125,6,125,7,125,8,125,9,124,4,100,
116,3,100,2,131,1,130,1,89,0,110,2,48,0,87,0, 1,107,0,114,36,116,0,100,2,131,1,130,1,116,1,160,
100,6,97,0,110,6,100,6,97,0,48,0,116,1,160,2, 2,124,0,161,1,144,1,143,14,125,10,122,14,124,10,160,
100,7,161,1,1,0,124,0,83,0,41,8,78,122,27,122, 3,124,6,161,1,1,0,87,0,110,36,4,0,116,4,121,
105,112,105,109,112,111,114,116,58,32,122,108,105,98,32,85, 100,1,0,1,0,1,0,116,0,100,3,124,0,155,2,157,
78,65,86,65,73,76,65,66,76,69,250,41,99,97,110,39, 2,124,0,100,4,141,2,130,1,89,0,110,2,48,0,124,
116,32,100,101,99,111,109,112,114,101,115,115,32,100,97,116, 10,160,5,100,5,161,1,125,11,116,6,124,11,131,1,100,
97,59,32,122,108,105,98,32,110,111,116,32,97,118,97,105, 5,107,3,114,132,116,7,100,6,131,1,130,1,124,11,100,
108,97,98,108,101,84,114,0,0,0,0,169,1,218,10,100, 0,100,7,133,2,25,0,100,8,107,3,114,166,116,0,100,
101,99,111,109,112,114,101,115,115,70,122,25,122,105,112,105, 9,124,0,155,2,157,2,124,0,100,4,141,2,130,1,116,
109,112,111,114,116,58,32,122,108,105,98,32,97,118,97,105, 8,124,11,100,10,100,11,133,2,25,0,131,1,125,12,116,
108,97,98,108,101,41,7,218,15,95,105,109,112,111,114,116, 8,124,11,100,11,100,5,133,2,25,0,131,1,125,13,100,
105,110,103,95,122,108,105,98,114,76,0,0,0,114,77,0, 5,124,12,23,0,124,13,23,0,125,14,124,6,124,14,55,
0,0,114,3,0,0,0,90,4,122,108,105,98,114,139,0, 0,125,6,122,14,124,10,160,3,124,6,161,1,1,0,87,
0,0,218,9,69,120,99,101,112,116,105,111,110,114,138,0, 0,110,38,4,0,116,4,144,1,121,14,1,0,1,0,1,
0,0,114,9,0,0,0,114,9,0,0,0,114,10,0,0, 0,116,0,100,3,124,0,155,2,157,2,124,0,100,4,141,
0,218,20,95,103,101,116,95,100,101,99,111,109,112,114,101, 2,130,1,89,0,110,2,48,0,124,10,160,5,124,4,161,
115,115,95,102,117,110,99,251,1,0,0,115,24,0,0,0, 1,125,15,116,6,124,15,131,1,124,4,107,3,144,1,114,
0,2,4,3,10,1,8,2,4,1,4,1,16,1,12,1, 48,116,4,100,12,131,1,130,1,87,0,100,0,4,0,4,
10,1,16,2,12,2,10,1,114,142,0,0,0,99,2,0, 0,131,3,1,0,110,18,49,0,144,1,115,70,48,0,1,
0,0,0,0,0,0,0,0,0,0,17,0,0,0,9,0, 0,1,0,1,0,89,0,1,0,124,3,100,1,107,2,144,
0,0,67,0,0,0,115,144,1,0,0,124,1,92,8,125, 1,114,94,124,15,83,0,122,10,116,9,131,0,125,16,87,
2,125,3,125,4,125,5,125,6,125,7,125,8,125,9,124, 0,110,28,4,0,116,10,144,1,121,132,1,0,1,0,1,
4,100,1,107,0,114,36,116,0,100,2,131,1,130,1,116, 0,116,0,100,13,131,1,130,1,89,0,110,2,48,0,124,
1,160,2,124,0,161,1,144,1,143,14,125,10,122,14,124, 16,124,15,100,14,131,2,83,0,41,15,78,114,0,0,0,
10,160,3,124,6,161,1,1,0,87,0,110,36,4,0,116, 0,122,18,110,101,103,97,116,105,118,101,32,100,97,116,97,
4,121,100,1,0,1,0,1,0,116,0,100,3,124,0,155, 32,115,105,122,101,114,90,0,0,0,114,12,0,0,0,114,
2,157,2,124,0,100,4,141,2,130,1,89,0,110,2,48, 102,0,0,0,114,96,0,0,0,114,91,0,0,0,115,4,
0,124,10,160,5,100,5,161,1,125,11,116,6,124,11,131, 0,0,0,80,75,3,4,122,23,98,97,100,32,108,111,99,
1,100,5,107,3,114,132,116,7,100,6,131,1,130,1,124, 97,108,32,102,105,108,101,32,104,101,97,100,101,114,58,32,
11,100,0,100,7,133,2,25,0,100,8,107,3,114,166,116, 233,26,0,0,0,114,101,0,0,0,122,26,122,105,112,105,
0,100,9,124,0,155,2,157,2,124,0,100,4,141,2,130, 109,112,111,114,116,58,32,99,97,110,39,116,32,114,101,97,
1,116,8,124,11,100,10,100,11,133,2,25,0,131,1,125, 100,32,100,97,116,97,114,137,0,0,0,105,241,255,255,255,
12,116,8,124,11,100,11,100,5,133,2,25,0,131,1,125, 41,11,114,3,0,0,0,114,108,0,0,0,114,109,0,0,
13,100,5,124,12,23,0,124,13,23,0,125,14,124,6,124, 0,114,110,0,0,0,114,22,0,0,0,114,112,0,0,0,
14,55,0,125,6,122,14,124,10,160,3,124,6,161,1,1, 114,51,0,0,0,114,117,0,0,0,114,1,0,0,0,114,
0,87,0,110,38,4,0,116,4,144,1,121,14,1,0,1, 142,0,0,0,114,141,0,0,0,41,17,114,29,0,0,0,
0,1,0,116,0,100,3,124,0,155,2,157,2,124,0,100, 114,54,0,0,0,90,8,100,97,116,97,112,97,116,104,114,
4,141,2,130,1,89,0,110,2,48,0,124,10,160,5,124, 128,0,0,0,114,132,0,0,0,114,123,0,0,0,114,135,
4,161,1,125,15,116,6,124,15,131,1,124,4,107,3,144, 0,0,0,114,129,0,0,0,114,130,0,0,0,114,131,0,
1,114,48,116,4,100,12,131,1,130,1,87,0,100,0,4, 0,0,114,121,0,0,0,114,122,0,0,0,114,133,0,0,
0,4,0,131,3,1,0,110,18,49,0,144,1,115,70,48, 0,114,134,0,0,0,114,125,0,0,0,90,8,114,97,119,
0,1,0,1,0,1,0,89,0,1,0,124,3,100,1,107, 95,100,97,116,97,114,139,0,0,0,114,9,0,0,0,114,
2,144,1,114,94,124,15,83,0,122,10,116,9,131,0,125, 9,0,0,0,114,10,0,0,0,114,52,0,0,0,16,2,
16,87,0,110,28,4,0,116,10,144,1,121,132,1,0,1, 0,0,115,62,0,0,0,0,1,20,1,8,1,8,2,14,
0,1,0,116,0,100,13,131,1,130,1,89,0,110,2,48, 2,2,1,14,1,12,1,24,1,10,1,12,1,8,2,16,
0,124,16,124,15,100,14,131,2,83,0,41,15,78,114,0, 2,18,2,16,1,16,1,12,1,8,1,2,1,14,1,14,
0,0,0,122,18,110,101,103,97,116,105,118,101,32,100,97, 1,24,1,10,1,14,1,40,2,10,2,4,3,2,1,10,
116,97,32,115,105,122,101,114,90,0,0,0,114,12,0,0, 1,14,1,14,1,114,52,0,0,0,99,2,0,0,0,0,
0,114,102,0,0,0,114,96,0,0,0,114,91,0,0,0, 0,0,0,0,0,0,0,2,0,0,0,3,0,0,0,67,
115,4,0,0,0,80,75,3,4,122,23,98,97,100,32,108, 0,0,0,115,16,0,0,0,116,0,124,0,124,1,24,0,
111,99,97,108,32,102,105,108,101,32,104,101,97,100,101,114, 131,1,100,1,107,1,83,0,41,2,78,114,5,0,0,0,
58,32,233,26,0,0,0,114,101,0,0,0,122,26,122,105, 41,1,218,3,97,98,115,41,2,90,2,116,49,90,2,116,
112,105,109,112,111,114,116,58,32,99,97,110,39,116,32,114, 50,114,9,0,0,0,114,9,0,0,0,114,10,0,0,0,
101,97,100,32,100,97,116,97,114,137,0,0,0,105,241,255, 218,9,95,101,113,95,109,116,105,109,101,62,2,0,0,115,
255,255,41,11,114,3,0,0,0,114,108,0,0,0,114,109, 2,0,0,0,0,2,114,145,0,0,0,99,5,0,0,0,
0,0,0,114,110,0,0,0,114,22,0,0,0,114,112,0, 0,0,0,0,0,0,0,0,14,0,0,0,8,0,0,0,
0,0,114,51,0,0,0,114,117,0,0,0,114,1,0,0, 67,0,0,0,115,60,1,0,0,124,3,124,2,100,1,156,
0,114,142,0,0,0,114,141,0,0,0,41,17,114,29,0, 2,125,5,122,18,116,0,160,1,124,4,124,3,124,5,161,
0,0,114,54,0,0,0,90,8,100,97,116,97,112,97,116, 3,125,6,87,0,110,20,4,0,116,2,121,48,1,0,1,
104,114,128,0,0,0,114,132,0,0,0,114,123,0,0,0, 0,1,0,89,0,100,0,83,0,48,0,124,6,100,2,64,
114,135,0,0,0,114,129,0,0,0,114,130,0,0,0,114, 0,100,3,107,3,125,7,124,7,114,182,124,6,100,4,64,
131,0,0,0,114,121,0,0,0,114,122,0,0,0,114,133, 0,100,3,107,3,125,8,116,3,106,4,100,5,107,3,144,
0,0,0,114,134,0,0,0,114,125,0,0,0,90,8,114, 1,114,10,124,8,115,106,116,3,106,4,100,6,107,2,144,
97,119,95,100,97,116,97,114,139,0,0,0,114,9,0,0, 1,114,10,116,5,124,0,124,2,131,2,125,9,124,9,100,
0,114,9,0,0,0,114,10,0,0,0,114,52,0,0,0, 0,117,1,144,1,114,10,116,3,160,6,116,0,106,7,124,
16,2,0,0,115,62,0,0,0,0,1,20,1,8,1,8, 9,161,2,125,10,122,20,116,0,160,8,124,4,124,10,124,
2,14,2,2,1,14,1,12,1,24,1,10,1,12,1,8, 3,124,5,161,4,1,0,87,0,110,104,4,0,116,2,121,
2,16,2,18,2,16,1,16,1,12,1,8,1,2,1,14, 180,1,0,1,0,1,0,89,0,100,0,83,0,48,0,116,
1,14,1,24,1,10,1,14,1,40,2,10,2,4,3,2, 9,124,0,124,2,131,2,92,2,125,11,125,12,124,11,144,
1,10,1,14,1,14,1,114,52,0,0,0,99,2,0,0, 1,114,10,116,10,116,11,124,4,100,7,100,8,133,2,25,
0,0,0,0,0,0,0,0,0,2,0,0,0,3,0,0, 0,131,1,124,11,131,2,114,246,116,11,124,4,100,8,100,
0,67,0,0,0,115,16,0,0,0,116,0,124,0,124,1, 9,133,2,25,0,131,1,124,12,107,3,144,1,114,10,116,
24,0,131,1,100,1,107,1,83,0,41,2,78,114,5,0, 12,160,13,100,10,124,3,155,2,157,2,161,1,1,0,100,
0,0,41,1,218,3,97,98,115,41,2,90,2,116,49,90, 0,83,0,116,14,160,15,124,4,100,9,100,0,133,2,25,
2,116,50,114,9,0,0,0,114,9,0,0,0,114,10,0, 0,161,1,125,13,116,16,124,13,116,17,131,2,144,1,115,
0,0,218,9,95,101,113,95,109,116,105,109,101,62,2,0, 56,116,18,100,11,124,1,155,2,100,12,157,3,131,1,130,
0,115,2,0,0,0,0,2,114,145,0,0,0,99,5,0, 1,124,13,83,0,41,13,78,41,2,114,59,0,0,0,114,
0,0,0,0,0,0,0,0,0,0,14,0,0,0,8,0, 13,0,0,0,114,5,0,0,0,114,0,0,0,0,114,84,
0,0,67,0,0,0,115,56,1,0,0,124,3,124,2,100, 0,0,0,90,5,110,101,118,101,114,90,6,97,108,119,97,
1,156,2,125,5,122,18,116,0,160,1,124,4,124,3,124, 121,115,114,97,0,0,0,114,92,0,0,0,114,93,0,0,
5,161,3,125,6,87,0,110,20,4,0,116,2,121,48,1, 0,122,22,98,121,116,101,99,111,100,101,32,105,115,32,115,
0,1,0,1,0,89,0,100,0,83,0,48,0,124,6,100, 116,97,108,101,32,102,111,114,32,122,16,99,111,109,112,105,
2,64,0,100,3,107,3,125,7,124,7,114,178,124,6,100, 108,101,100,32,109,111,100,117,108,101,32,122,21,32,105,115,
4,64,0,100,3,107,3,125,8,116,3,106,4,100,5,107, 32,110,111,116,32,97,32,99,111,100,101,32,111,98,106,101,
3,114,176,124,8,115,102,116,3,106,4,100,6,107,2,114, 99,116,41,19,114,21,0,0,0,90,13,95,99,108,97,115,
176,116,5,124,0,124,2,131,2,125,9,124,9,100,0,117, 115,105,102,121,95,112,121,99,114,75,0,0,0,218,4,95,
1,114,176,116,3,160,6,116,0,106,7,124,9,161,2,125, 105,109,112,90,21,99,104,101,99,107,95,104,97,115,104,95,
10,122,20,116,0,160,8,124,4,124,10,124,3,124,5,161, 98,97,115,101,100,95,112,121,99,115,218,15,95,103,101,116,
4,1,0,87,0,110,20,4,0,116,2,121,174,1,0,1, 95,112,121,99,95,115,111,117,114,99,101,218,11,115,111,117,
0,1,0,89,0,100,0,83,0,48,0,110,84,116,9,124, 114,99,101,95,104,97,115,104,90,17,95,82,65,87,95,77,
0,124,2,131,2,92,2,125,11,125,12,124,11,144,1,114, 65,71,73,67,95,78,85,77,66,69,82,90,18,95,118,97,
6,116,10,116,11,124,4,100,7,100,8,133,2,25,0,131, 108,105,100,97,116,101,95,104,97,115,104,95,112,121,99,218,
1,124,11,131,2,114,242,116,11,124,4,100,8,100,9,133, 29,95,103,101,116,95,109,116,105,109,101,95,97,110,100,95,
2,25,0,131,1,124,12,107,3,144,1,114,6,116,12,160, 115,105,122,101,95,111,102,95,115,111,117,114,99,101,114,145,
13,100,10,124,3,155,2,157,2,161,1,1,0,100,0,83, 0,0,0,114,2,0,0,0,114,76,0,0,0,114,77,0,
0,116,14,160,15,124,4,100,9,100,0,133,2,25,0,161, 0,0,218,7,109,97,114,115,104,97,108,90,5,108,111,97,
1,125,13,116,16,124,13,116,17,131,2,144,1,115,52,116, 100,115,114,15,0,0,0,218,10,95,99,111,100,101,95,116,
18,100,11,124,1,155,2,100,12,157,3,131,1,130,1,124, 121,112,101,218,9,84,121,112,101,69,114,114,111,114,41,14,
13,83,0,41,13,78,41,2,114,59,0,0,0,114,13,0, 114,32,0,0,0,114,53,0,0,0,114,63,0,0,0,114,
0,0,114,5,0,0,0,114,0,0,0,0,114,84,0,0, 38,0,0,0,114,124,0,0,0,90,11,101,120,99,95,100,
0,90,5,110,101,118,101,114,90,6,97,108,119,97,121,115, 101,116,97,105,108,115,114,127,0,0,0,90,10,104,97,115,
114,97,0,0,0,114,92,0,0,0,114,93,0,0,0,122, 104,95,98,97,115,101,100,90,12,99,104,101,99,107,95,115,
22,98,121,116,101,99,111,100,101,32,105,115,32,115,116,97, 111,117,114,99,101,90,12,115,111,117,114,99,101,95,98,121,
108,101,32,102,111,114,32,122,16,99,111,109,112,105,108,101, 116,101,115,114,148,0,0,0,90,12,115,111,117,114,99,101,
100,32,109,111,100,117,108,101,32,122,21,32,105,115,32,110, 95,109,116,105,109,101,90,11,115,111,117,114,99,101,95,115,
111,116,32,97,32,99,111,100,101,32,111,98,106,101,99,116, 105,122,101,114,46,0,0,0,114,9,0,0,0,114,9,0,
41,19,114,21,0,0,0,90,13,95,99,108,97,115,115,105, 0,0,114,10,0,0,0,218,15,95,117,110,109,97,114,115,
102,121,95,112,121,99,114,75,0,0,0,218,4,95,105,109, 104,97,108,95,99,111,100,101,72,2,0,0,115,82,0,0,
112,90,21,99,104,101,99,107,95,104,97,115,104,95,98,97, 0,0,2,2,1,2,254,6,5,2,1,18,1,12,1,8,
115,101,100,95,112,121,99,115,218,15,95,103,101,116,95,112, 2,12,1,4,1,12,1,12,1,2,255,2,1,8,255,4,
121,99,95,115,111,117,114,99,101,218,11,115,111,117,114,99, 2,10,1,10,1,4,1,4,1,2,254,4,5,2,1,4,
101,95,104,97,115,104,90,17,95,82,65,87,95,77,65,71, 1,8,255,8,2,12,1,8,3,8,255,6,3,6,3,22,
73,67,95,78,85,77,66,69,82,90,18,95,118,97,108,105, 1,18,255,4,2,4,1,8,255,4,2,4,2,18,1,12,
100,97,116,101,95,104,97,115,104,95,112,121,99,218,29,95, 1,16,1,114,153,0,0,0,99,1,0,0,0,0,0,0,
103,101,116,95,109,116,105,109,101,95,97,110,100,95,115,105, 0,0,0,0,0,1,0,0,0,4,0,0,0,67,0,0,
122,101,95,111,102,95,115,111,117,114,99,101,114,145,0,0, 0,115,28,0,0,0,124,0,160,0,100,1,100,2,161,2,
0,114,2,0,0,0,114,76,0,0,0,114,77,0,0,0, 125,0,124,0,160,0,100,3,100,2,161,2,125,0,124,0,
218,7,109,97,114,115,104,97,108,90,5,108,111,97,100,115, 83,0,41,4,78,115,2,0,0,0,13,10,243,1,0,0,
114,15,0,0,0,218,10,95,99,111,100,101,95,116,121,112, 0,10,243,1,0,0,0,13,41,1,114,19,0,0,0,41,
101,218,9,84,121,112,101,69,114,114,111,114,41,14,114,32, 1,218,6,115,111,117,114,99,101,114,9,0,0,0,114,9,
0,0,0,114,53,0,0,0,114,63,0,0,0,114,38,0, 0,0,0,114,10,0,0,0,218,23,95,110,111,114,109,97,
0,0,114,124,0,0,0,90,11,101,120,99,95,100,101,116, 108,105,122,101,95,108,105,110,101,95,101,110,100,105,110,103,
97,105,108,115,114,127,0,0,0,90,10,104,97,115,104,95, 115,123,2,0,0,115,6,0,0,0,0,1,12,1,12,1,
98,97,115,101,100,90,12,99,104,101,99,107,95,115,111,117, 114,157,0,0,0,99,2,0,0,0,0,0,0,0,0,0,
114,99,101,90,12,115,111,117,114,99,101,95,98,121,116,101, 0,0,2,0,0,0,6,0,0,0,67,0,0,0,115,24,
115,114,148,0,0,0,90,12,115,111,117,114,99,101,95,109, 0,0,0,116,0,124,1,131,1,125,1,116,1,124,1,124,
116,105,109,101,90,11,115,111,117,114,99,101,95,115,105,122, 0,100,1,100,2,100,3,141,4,83,0,41,4,78,114,74,
101,114,46,0,0,0,114,9,0,0,0,114,9,0,0,0, 0,0,0,84,41,1,90,12,100,111,110,116,95,105,110,104,
114,10,0,0,0,218,15,95,117,110,109,97,114,115,104,97, 101,114,105,116,41,2,114,157,0,0,0,218,7,99,111,109,
108,95,99,111,100,101,72,2,0,0,115,82,0,0,0,0, 112,105,108,101,41,2,114,53,0,0,0,114,156,0,0,0,
2,2,1,2,254,6,5,2,1,18,1,12,1,8,2,12, 114,9,0,0,0,114,9,0,0,0,114,10,0,0,0,218,
1,4,1,12,1,10,1,2,255,2,1,8,255,2,2,10, 15,95,99,111,109,112,105,108,101,95,115,111,117,114,99,101,
1,8,1,4,1,4,1,2,254,4,5,2,1,4,1,8, 130,2,0,0,115,4,0,0,0,0,1,8,1,114,159,0,
255,8,2,12,1,10,3,8,255,6,3,6,3,22,1,18, 0,0,99,2,0,0,0,0,0,0,0,0,0,0,0,2,
255,4,2,4,1,8,255,4,2,4,2,18,1,12,1,16, 0,0,0,11,0,0,0,67,0,0,0,115,68,0,0,0,
1,114,153,0,0,0,99,1,0,0,0,0,0,0,0,0, 116,0,160,1,124,0,100,1,63,0,100,2,23,0,124,0,
0,0,0,1,0,0,0,4,0,0,0,67,0,0,0,115, 100,3,63,0,100,4,64,0,124,0,100,5,64,0,124,1,
28,0,0,0,124,0,160,0,100,1,100,2,161,2,125,0, 100,6,63,0,124,1,100,3,63,0,100,7,64,0,124,1,
124,0,160,0,100,3,100,2,161,2,125,0,124,0,83,0, 100,5,64,0,100,8,20,0,100,9,100,9,100,9,102,9,
41,4,78,115,2,0,0,0,13,10,243,1,0,0,0,10, 161,1,83,0,41,10,78,233,9,0,0,0,105,188,7,0,
243,1,0,0,0,13,41,1,114,19,0,0,0,41,1,218, 0,233,5,0,0,0,233,15,0,0,0,233,31,0,0,0,
6,115,111,117,114,99,101,114,9,0,0,0,114,9,0,0, 233,11,0,0,0,233,63,0,0,0,114,84,0,0,0,114,
0,114,10,0,0,0,218,23,95,110,111,114,109,97,108,105, 14,0,0,0,41,2,114,129,0,0,0,90,6,109,107,116,
122,101,95,108,105,110,101,95,101,110,100,105,110,103,115,123, 105,109,101,41,2,218,1,100,114,136,0,0,0,114,9,0,
2,0,0,115,6,0,0,0,0,1,12,1,12,1,114,157, 0,0,114,9,0,0,0,114,10,0,0,0,218,14,95,112,
0,0,0,99,2,0,0,0,0,0,0,0,0,0,0,0, 97,114,115,101,95,100,111,115,116,105,109,101,136,2,0,0,
2,0,0,0,6,0,0,0,67,0,0,0,115,24,0,0, 115,18,0,0,0,0,1,4,1,10,1,10,1,6,1,6,
0,116,0,124,1,131,1,125,1,116,1,124,1,124,0,100, 1,10,1,10,1,6,249,114,167,0,0,0,99,2,0,0,
1,100,2,100,3,141,4,83,0,41,4,78,114,74,0,0, 0,0,0,0,0,0,0,0,0,6,0,0,0,10,0,0,
0,84,41,1,90,12,100,111,110,116,95,105,110,104,101,114, 0,67,0,0,0,115,110,0,0,0,122,82,124,1,100,1,
105,116,41,2,114,157,0,0,0,218,7,99,111,109,112,105, 100,0,133,2,25,0,100,2,118,0,115,22,74,0,130,1,
108,101,41,2,114,53,0,0,0,114,156,0,0,0,114,9, 124,1,100,0,100,1,133,2,25,0,125,1,124,0,106,0,
0,0,0,114,9,0,0,0,114,10,0,0,0,218,15,95, 124,1,25,0,125,2,124,2,100,3,25,0,125,3,124,2,
99,111,109,112,105,108,101,95,115,111,117,114,99,101,130,2, 100,4,25,0,125,4,124,2,100,5,25,0,125,5,116,1,
0,0,115,4,0,0,0,0,1,8,1,114,159,0,0,0, 124,4,124,3,131,2,124,5,102,2,87,0,83,0,4,0,
99,2,0,0,0,0,0,0,0,0,0,0,0,2,0,0, 116,2,116,3,116,4,102,3,121,108,1,0,1,0,1,0,
0,11,0,0,0,67,0,0,0,115,68,0,0,0,116,0, 89,0,100,6,83,0,48,0,41,7,78,114,14,0,0,0,
160,1,124,0,100,1,63,0,100,2,23,0,124,0,100,3, 169,2,218,1,99,218,1,111,114,161,0,0,0,233,6,0,
63,0,100,4,64,0,124,0,100,5,64,0,124,1,100,6, 0,0,233,3,0,0,0,41,2,114,0,0,0,0,114,0,
63,0,124,1,100,3,63,0,100,7,64,0,124,1,100,5, 0,0,0,41,5,114,28,0,0,0,114,167,0,0,0,114,
64,0,100,8,20,0,100,9,100,9,100,9,102,9,161,1, 26,0,0,0,218,10,73,110,100,101,120,69,114,114,111,114,
83,0,41,10,78,233,9,0,0,0,105,188,7,0,0,233, 114,152,0,0,0,41,6,114,32,0,0,0,114,13,0,0,
5,0,0,0,233,15,0,0,0,233,31,0,0,0,233,11, 0,114,54,0,0,0,114,129,0,0,0,114,130,0,0,0,
0,0,0,233,63,0,0,0,114,84,0,0,0,114,14,0, 90,17,117,110,99,111,109,112,114,101,115,115,101,100,95,115,
0,0,41,2,114,129,0,0,0,90,6,109,107,116,105,109, 105,122,101,114,9,0,0,0,114,9,0,0,0,114,10,0,
101,41,2,218,1,100,114,136,0,0,0,114,9,0,0,0, 0,0,114,149,0,0,0,149,2,0,0,115,20,0,0,0,
114,9,0,0,0,114,10,0,0,0,218,14,95,112,97,114, 0,1,2,2,20,1,12,1,10,3,8,1,8,1,8,1,
115,101,95,100,111,115,116,105,109,101,136,2,0,0,115,18, 16,1,18,1,114,149,0,0,0,99,2,0,0,0,0,0,
0,0,0,0,1,4,1,10,1,10,1,6,1,6,1,10, 0,0,0,0,0,0,3,0,0,0,8,0,0,0,67,0,
1,10,1,6,249,114,167,0,0,0,99,2,0,0,0,0, 0,0,115,80,0,0,0,124,1,100,1,100,0,133,2,25,
0,0,0,0,0,0,0,6,0,0,0,10,0,0,0,67, 0,100,2,118,0,115,20,74,0,130,1,124,1,100,0,100,
0,0,0,115,114,0,0,0,122,82,124,1,100,1,100,0, 1,133,2,25,0,125,1,122,14,124,0,106,0,124,1,25,
133,2,25,0,100,2,118,0,115,22,74,0,130,1,124,1, 0,125,2,87,0,110,20,4,0,116,1,121,66,1,0,1,
100,0,100,1,133,2,25,0,125,1,124,0,106,0,124,1, 0,1,0,89,0,100,0,83,0,48,0,116,2,124,0,106,
25,0,125,2,124,2,100,3,25,0,125,3,124,2,100,4, 3,124,2,131,2,83,0,41,3,78,114,14,0,0,0,114,
25,0,125,4,124,2,100,5,25,0,125,5,116,1,124,4, 168,0,0,0,41,4,114,28,0,0,0,114,26,0,0,0,
124,3,131,2,124,5,102,2,87,0,83,0,4,0,116,2, 114,52,0,0,0,114,29,0,0,0,41,3,114,32,0,0,
116,3,116,4,102,3,121,108,1,0,1,0,1,0,89,0, 0,114,13,0,0,0,114,54,0,0,0,114,9,0,0,0,
100,6,83,0,48,0,100,0,83,0,41,7,78,114,14,0, 114,9,0,0,0,114,10,0,0,0,114,147,0,0,0,168,
0,0,169,2,218,1,99,218,1,111,114,161,0,0,0,233, 2,0,0,115,14,0,0,0,0,2,20,1,12,2,2,1,
6,0,0,0,233,3,0,0,0,41,2,114,0,0,0,0, 14,1,12,1,8,2,114,147,0,0,0,99,2,0,0,0,
114,0,0,0,0,41,5,114,28,0,0,0,114,167,0,0, 0,0,0,0,0,0,0,0,11,0,0,0,9,0,0,0,
0,114,26,0,0,0,218,10,73,110,100,101,120,69,114,114, 67,0,0,0,115,194,0,0,0,116,0,124,0,124,1,131,
111,114,114,152,0,0,0,41,6,114,32,0,0,0,114,13, 2,125,2,116,1,68,0,93,156,92,3,125,3,125,4,125,
0,0,0,114,54,0,0,0,114,129,0,0,0,114,130,0, 5,124,2,124,3,23,0,125,6,116,2,106,3,100,1,124,
0,0,90,17,117,110,99,111,109,112,114,101,115,115,101,100, 0,106,4,116,5,124,6,100,2,100,3,141,5,1,0,122,
95,115,105,122,101,114,9,0,0,0,114,9,0,0,0,114, 14,124,0,106,6,124,6,25,0,125,7,87,0,110,18,4,
10,0,0,0,114,149,0,0,0,149,2,0,0,115,20,0, 0,116,7,121,86,1,0,1,0,1,0,89,0,113,14,48,
0,0,0,1,2,2,20,1,12,1,10,3,8,1,8,1, 0,124,7,100,4,25,0,125,8,116,8,124,0,106,4,124,
8,1,16,1,18,1,114,149,0,0,0,99,2,0,0,0, 7,131,2,125,9,124,4,114,130,116,9,124,0,124,8,124,
0,0,0,0,0,0,0,0,3,0,0,0,8,0,0,0, 6,124,1,124,9,131,5,125,10,110,10,116,10,124,8,124,
67,0,0,0,115,84,0,0,0,124,1,100,1,100,0,133, 9,131,2,125,10,124,10,100,0,117,0,114,150,113,14,124,
2,25,0,100,2,118,0,115,20,74,0,130,1,124,1,100, 7,100,4,25,0,125,8,124,10,124,5,124,8,102,3,2,
0,100,1,133,2,25,0,125,1,122,14,124,0,106,0,124, 0,1,0,83,0,116,11,100,5,124,1,155,2,157,2,124,
1,25,0,125,2,87,0,110,20,4,0,116,1,121,66,1, 1,100,6,141,2,130,1,100,0,83,0,41,7,78,122,13,
0,1,0,1,0,89,0,100,0,83,0,48,0,116,2,124, 116,114,121,105,110,103,32,123,125,123,125,123,125,114,84,0,
0,106,3,124,2,131,2,83,0,100,0,83,0,41,3,78, 0,0,41,1,90,9,118,101,114,98,111,115,105,116,121,114,
114,14,0,0,0,114,168,0,0,0,41,4,114,28,0,0, 0,0,0,0,114,57,0,0,0,114,58,0,0,0,41,12,
0,114,26,0,0,0,114,52,0,0,0,114,29,0,0,0, 114,36,0,0,0,114,87,0,0,0,114,76,0,0,0,114,
41,3,114,32,0,0,0,114,13,0,0,0,114,54,0,0, 77,0,0,0,114,29,0,0,0,114,20,0,0,0,114,28,
0,114,9,0,0,0,114,9,0,0,0,114,10,0,0,0, 0,0,0,114,26,0,0,0,114,52,0,0,0,114,153,0,
114,147,0,0,0,168,2,0,0,115,14,0,0,0,0,2, 0,0,114,159,0,0,0,114,3,0,0,0,41,11,114,32,
20,1,12,2,2,1,14,1,12,1,8,2,114,147,0,0, 0,0,0,114,38,0,0,0,114,13,0,0,0,114,88,0,
0,99,2,0,0,0,0,0,0,0,0,0,0,0,11,0, 0,0,114,89,0,0,0,114,47,0,0,0,114,63,0,0,
0,0,9,0,0,0,67,0,0,0,115,196,0,0,0,116, 0,114,54,0,0,0,114,40,0,0,0,114,124,0,0,0,
0,124,0,124,1,131,2,125,2,116,1,68,0,93,158,92, 114,46,0,0,0,114,9,0,0,0,114,9,0,0,0,114,
3,125,3,125,4,125,5,124,2,124,3,23,0,125,6,116, 10,0,0,0,114,44,0,0,0,183,2,0,0,115,36,0,
2,106,3,100,1,124,0,106,4,116,5,124,6,100,2,100, 0,0,0,1,10,1,14,1,8,1,22,1,2,1,14,1,
3,141,5,1,0,122,14,124,0,106,6,124,6,25,0,125, 12,1,6,2,8,1,12,1,4,1,18,2,10,1,8,3,
7,87,0,110,18,4,0,116,7,121,86,1,0,1,0,1, 2,1,8,1,14,2,114,44,0,0,0,41,44,114,82,0,
0,89,0,113,14,48,0,124,7,100,4,25,0,125,8,116, 0,0,90,26,95,102,114,111,122,101,110,95,105,109,112,111,
8,124,0,106,4,124,7,131,2,125,9,124,4,114,130,116, 114,116,108,105,98,95,101,120,116,101,114,110,97,108,114,21,
9,124,0,124,8,124,6,124,1,124,9,131,5,125,10,110, 0,0,0,114,1,0,0,0,114,2,0,0,0,90,17,95,
10,116,10,124,8,124,9,131,2,125,10,124,10,100,0,117, 102,114,111,122,101,110,95,105,109,112,111,114,116,108,105,98,
0,114,150,113,14,124,7,100,4,25,0,125,8,124,10,124, 114,76,0,0,0,114,146,0,0,0,114,108,0,0,0,114,
5,124,8,102,3,2,0,1,0,83,0,113,14,116,11,100, 150,0,0,0,114,67,0,0,0,114,129,0,0,0,90,7,
5,124,1,155,2,157,2,124,1,100,6,141,2,130,1,100, 95,95,97,108,108,95,95,114,20,0,0,0,90,15,112,97,
0,83,0,41,7,78,122,13,116,114,121,105,110,103,32,123, 116,104,95,115,101,112,97,114,97,116,111,114,115,114,18,0,
125,123,125,123,125,114,84,0,0,0,41,1,90,9,118,101, 0,0,114,75,0,0,0,114,3,0,0,0,114,25,0,0,
114,98,111,115,105,116,121,114,0,0,0,0,114,57,0,0, 0,218,4,116,121,112,101,114,70,0,0,0,114,111,0,0,
0,114,58,0,0,0,41,12,114,36,0,0,0,114,87,0, 0,114,113,0,0,0,114,115,0,0,0,114,4,0,0,0,
0,0,114,76,0,0,0,114,77,0,0,0,114,29,0,0, 114,87,0,0,0,114,36,0,0,0,114,37,0,0,0,114,
0,114,20,0,0,0,114,28,0,0,0,114,26,0,0,0, 35,0,0,0,114,27,0,0,0,114,120,0,0,0,114,140,
114,52,0,0,0,114,153,0,0,0,114,159,0,0,0,114, 0,0,0,114,142,0,0,0,114,52,0,0,0,114,145,0,
3,0,0,0,41,11,114,32,0,0,0,114,38,0,0,0, 0,0,114,153,0,0,0,218,8,95,95,99,111,100,101,95,
114,13,0,0,0,114,88,0,0,0,114,89,0,0,0,114, 95,114,151,0,0,0,114,157,0,0,0,114,159,0,0,0,
47,0,0,0,114,63,0,0,0,114,54,0,0,0,114,40, 114,167,0,0,0,114,149,0,0,0,114,147,0,0,0,114,
0,0,0,114,124,0,0,0,114,46,0,0,0,114,9,0, 44,0,0,0,114,9,0,0,0,114,9,0,0,0,114,9,
0,0,114,9,0,0,0,114,10,0,0,0,114,44,0,0, 0,0,0,114,10,0,0,0,218,8,60,109,111,100,117,108,
0,183,2,0,0,115,36,0,0,0,0,1,10,1,14,1, 101,62,1,0,0,0,115,84,0,0,0,4,16,8,1,16,
8,1,22,1,2,1,14,1,12,1,6,2,8,1,12,1, 1,8,1,8,1,8,1,8,1,8,1,8,2,8,3,6,
4,1,18,2,10,1,8,3,2,1,8,1,16,2,114,44, 1,14,3,16,4,4,2,8,2,4,1,4,1,4,2,14,
0,0,0,41,44,114,82,0,0,0,90,26,95,102,114,111, 127,0,125,12,1,12,1,2,1,2,252,4,9,8,4,8,
122,101,110,95,105,109,112,111,114,116,108,105,98,95,101,120, 9,8,31,8,126,2,254,2,29,4,5,8,21,8,46,8,
116,101,114,110,97,108,114,21,0,0,0,114,1,0,0,0, 10,8,46,10,5,8,7,8,6,8,13,8,19,8,15,
114,2,0,0,0,90,17,95,102,114,111,122,101,110,95,105,
109,112,111,114,116,108,105,98,114,76,0,0,0,114,146,0,
0,0,114,108,0,0,0,114,150,0,0,0,114,67,0,0,
0,114,129,0,0,0,90,7,95,95,97,108,108,95,95,114,
20,0,0,0,90,15,112,97,116,104,95,115,101,112,97,114,
97,116,111,114,115,114,18,0,0,0,114,75,0,0,0,114,
3,0,0,0,114,25,0,0,0,218,4,116,121,112,101,114,
70,0,0,0,114,111,0,0,0,114,113,0,0,0,114,115,
0,0,0,114,4,0,0,0,114,87,0,0,0,114,36,0,
0,0,114,37,0,0,0,114,35,0,0,0,114,27,0,0,
0,114,120,0,0,0,114,140,0,0,0,114,142,0,0,0,
114,52,0,0,0,114,145,0,0,0,114,153,0,0,0,218,
8,95,95,99,111,100,101,95,95,114,151,0,0,0,114,157,
0,0,0,114,159,0,0,0,114,167,0,0,0,114,149,0,
0,0,114,147,0,0,0,114,44,0,0,0,114,9,0,0,
0,114,9,0,0,0,114,9,0,0,0,114,10,0,0,0,
218,8,60,109,111,100,117,108,101,62,1,0,0,0,115,84,
0,0,0,4,16,8,1,16,1,8,1,8,1,8,1,8,
1,8,1,8,2,8,3,6,1,14,3,16,4,4,2,8,
2,4,1,4,1,4,2,14,127,0,125,12,1,12,1,2,
1,2,252,4,9,8,4,8,9,8,31,8,126,2,254,2,
29,4,5,8,21,8,46,8,10,8,46,10,5,8,7,8,
6,8,13,8,19,8,15,
}; };

View File

@ -1,537 +0,0 @@
/* Peephole optimizations for bytecode compiler. */
#include "Python.h"
#include "Python-ast.h"
#include "ast.h"
#include "code.h"
#include "symtable.h"
#include "opcode.h"
#include "wordcode_helpers.h"
#define UNCONDITIONAL_JUMP(op) (op==JUMP_ABSOLUTE || op==JUMP_FORWARD)
#define CONDITIONAL_JUMP(op) (op==POP_JUMP_IF_FALSE || op==POP_JUMP_IF_TRUE \
|| op==JUMP_IF_FALSE_OR_POP || op==JUMP_IF_TRUE_OR_POP || op==JUMP_IF_NOT_EXC_MATCH)
#define ABSOLUTE_JUMP(op) (op==JUMP_ABSOLUTE \
|| op==POP_JUMP_IF_FALSE || op==POP_JUMP_IF_TRUE \
|| op==JUMP_IF_FALSE_OR_POP || op==JUMP_IF_TRUE_OR_POP || op==JUMP_IF_NOT_EXC_MATCH)
#define JUMPS_ON_TRUE(op) (op==POP_JUMP_IF_TRUE || op==JUMP_IF_TRUE_OR_POP)
#define GETJUMPTGT(arr, i) (get_arg(arr, i) / sizeof(_Py_CODEUNIT) + \
(ABSOLUTE_JUMP(_Py_OPCODE(arr[i])) ? 0 : i+1))
#define ISBASICBLOCK(blocks, start, end) \
(blocks[start]==blocks[end])
/* Scans back N consecutive LOAD_CONST instructions, skipping NOPs,
returns index of the Nth last's LOAD_CONST's EXTENDED_ARG prefix.
Callers are responsible to check CONST_STACK_LEN beforehand.
*/
static Py_ssize_t
lastn_const_start(const _Py_CODEUNIT *codestr, Py_ssize_t i, Py_ssize_t n)
{
assert(n > 0);
for (;;) {
i--;
assert(i >= 0);
if (_Py_OPCODE(codestr[i]) == LOAD_CONST) {
if (!--n) {
while (i > 0 && _Py_OPCODE(codestr[i-1]) == EXTENDED_ARG) {
i--;
}
return i;
}
}
else {
assert(_Py_OPCODE(codestr[i]) == EXTENDED_ARG);
}
}
}
/* Scans through EXTENDED ARGs, seeking the index of the effective opcode */
static Py_ssize_t
find_op(const _Py_CODEUNIT *codestr, Py_ssize_t codelen, Py_ssize_t i)
{
while (i < codelen && _Py_OPCODE(codestr[i]) == EXTENDED_ARG) {
i++;
}
return i;
}
/* Given the index of the effective opcode,
scan back to construct the oparg with EXTENDED_ARG */
static unsigned int
get_arg(const _Py_CODEUNIT *codestr, Py_ssize_t i)
{
_Py_CODEUNIT word;
unsigned int oparg = _Py_OPARG(codestr[i]);
if (i >= 1 && _Py_OPCODE(word = codestr[i-1]) == EXTENDED_ARG) {
oparg |= _Py_OPARG(word) << 8;
if (i >= 2 && _Py_OPCODE(word = codestr[i-2]) == EXTENDED_ARG) {
oparg |= _Py_OPARG(word) << 16;
if (i >= 3 && _Py_OPCODE(word = codestr[i-3]) == EXTENDED_ARG) {
oparg |= _Py_OPARG(word) << 24;
}
}
}
return oparg;
}
/* Fill the region with NOPs. */
static void
fill_nops(_Py_CODEUNIT *codestr, Py_ssize_t start, Py_ssize_t end)
{
memset(codestr + start, NOP, (end - start) * sizeof(_Py_CODEUNIT));
}
/* Given the index of the effective opcode,
attempt to replace the argument, taking into account EXTENDED_ARG.
Returns -1 on failure, or the new op index on success */
static Py_ssize_t
set_arg(_Py_CODEUNIT *codestr, Py_ssize_t i, unsigned int oparg)
{
unsigned int curarg = get_arg(codestr, i);
int curilen, newilen;
if (curarg == oparg)
return i;
curilen = instrsize(curarg);
newilen = instrsize(oparg);
if (curilen < newilen) {
return -1;
}
write_op_arg(codestr + i + 1 - curilen, _Py_OPCODE(codestr[i]), oparg, newilen);
fill_nops(codestr, i + 1 - curilen + newilen, i + 1);
return i-curilen+newilen;
}
/* Attempt to write op/arg at end of specified region of memory.
Preceding memory in the region is overwritten with NOPs.
Returns -1 on failure, op index on success */
static Py_ssize_t
copy_op_arg(_Py_CODEUNIT *codestr, Py_ssize_t i, unsigned char op,
unsigned int oparg, Py_ssize_t maxi)
{
int ilen = instrsize(oparg);
if (i + ilen > maxi) {
return -1;
}
write_op_arg(codestr + maxi - ilen, op, oparg, ilen);
fill_nops(codestr, i, maxi - ilen);
return maxi - 1;
}
/* Replace LOAD_CONST c1, LOAD_CONST c2 ... LOAD_CONST cn, BUILD_TUPLE n
with LOAD_CONST (c1, c2, ... cn).
The consts table must still be in list form so that the
new constant (c1, c2, ... cn) can be appended.
Called with codestr pointing to the first LOAD_CONST.
*/
static Py_ssize_t
fold_tuple_on_constants(_Py_CODEUNIT *codestr, Py_ssize_t codelen,
Py_ssize_t c_start, Py_ssize_t opcode_end,
PyObject *consts, int n)
{
/* Pre-conditions */
assert(PyList_CheckExact(consts));
/* Buildup new tuple of constants */
PyObject *newconst = PyTuple_New(n);
if (newconst == NULL) {
return -1;
}
for (Py_ssize_t i = 0, pos = c_start; i < n; i++, pos++) {
assert(pos < opcode_end);
pos = find_op(codestr, codelen, pos);
assert(_Py_OPCODE(codestr[pos]) == LOAD_CONST);
unsigned int arg = get_arg(codestr, pos);
PyObject *constant = PyList_GET_ITEM(consts, arg);
Py_INCREF(constant);
PyTuple_SET_ITEM(newconst, i, constant);
}
Py_ssize_t index = PyList_GET_SIZE(consts);
#if SIZEOF_SIZE_T > SIZEOF_INT
if ((size_t)index >= UINT_MAX - 1) {
Py_DECREF(newconst);
PyErr_SetString(PyExc_OverflowError, "too many constants");
return -1;
}
#endif
/* Append folded constant onto consts */
if (PyList_Append(consts, newconst)) {
Py_DECREF(newconst);
return -1;
}
Py_DECREF(newconst);
return copy_op_arg(codestr, c_start, LOAD_CONST,
(unsigned int)index, opcode_end);
}
static unsigned int *
markblocks(_Py_CODEUNIT *code, Py_ssize_t len)
{
unsigned int *blocks = PyMem_New(unsigned int, len);
int i, j, opcode, blockcnt = 0;
if (blocks == NULL) {
PyErr_NoMemory();
return NULL;
}
memset(blocks, 0, len*sizeof(int));
/* Mark labels in the first pass */
for (i = 0; i < len; i++) {
opcode = _Py_OPCODE(code[i]);
switch (opcode) {
case FOR_ITER:
case JUMP_FORWARD:
case JUMP_IF_FALSE_OR_POP:
case JUMP_IF_TRUE_OR_POP:
case POP_JUMP_IF_FALSE:
case POP_JUMP_IF_TRUE:
case JUMP_IF_NOT_EXC_MATCH:
case JUMP_ABSOLUTE:
case SETUP_FINALLY:
case SETUP_WITH:
case SETUP_ASYNC_WITH:
j = GETJUMPTGT(code, i);
assert(j < len);
blocks[j] = 1;
break;
}
}
/* Build block numbers in the second pass */
for (i = 0; i < len; i++) {
blockcnt += blocks[i]; /* increment blockcnt over labels */
blocks[i] = blockcnt;
}
return blocks;
}
/* 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.
To keep the optimizer simple, it bails when the lineno table has complex
encoding for gaps >= 255.
Optimizations are restricted to simple transformations occurring within a
single basic block. All transformations keep the code size the same or
smaller. For those that reduce size, the gaps are initially filled with
NOPs. Later those NOPs are removed and the jump addresses retargeted in
a single pass. */
PyObject *
PyCode_Optimize(PyObject *code, PyObject* consts, PyObject *names,
PyObject *lnotab_obj)
{
Py_ssize_t h, i, nexti, op_start, tgt;
unsigned int j, nops;
unsigned char opcode, nextop;
_Py_CODEUNIT *codestr = NULL;
unsigned char *lnotab;
unsigned int cum_orig_offset, last_offset;
Py_ssize_t tabsiz;
// Count runs of consecutive LOAD_CONSTs
unsigned int cumlc = 0, lastlc = 0;
unsigned int *blocks = NULL;
/* Bail out if an exception is set */
if (PyErr_Occurred())
goto exitError;
/* Bypass optimization when the lnotab table is too complex */
assert(PyBytes_Check(lnotab_obj));
lnotab = (unsigned char*)PyBytes_AS_STRING(lnotab_obj);
tabsiz = PyBytes_GET_SIZE(lnotab_obj);
assert(tabsiz == 0 || Py_REFCNT(lnotab_obj) == 1);
/* Don't optimize if lnotab contains instruction pointer delta larger
than +255 (encoded as multiple bytes), just to keep the peephole optimizer
simple. The optimizer leaves line number deltas unchanged. */
for (i = 0; i < tabsiz; i += 2) {
if (lnotab[i] == 255) {
goto exitUnchanged;
}
}
assert(PyBytes_Check(code));
Py_ssize_t codesize = PyBytes_GET_SIZE(code);
assert(codesize % sizeof(_Py_CODEUNIT) == 0);
Py_ssize_t codelen = codesize / sizeof(_Py_CODEUNIT);
if (codelen > INT_MAX) {
/* Python assembler is limited to INT_MAX: see assembler.a_offset in
compile.c. */
goto exitUnchanged;
}
/* Make a modifiable copy of the code string */
codestr = (_Py_CODEUNIT *)PyMem_Malloc(codesize);
if (codestr == NULL) {
PyErr_NoMemory();
goto exitError;
}
memcpy(codestr, PyBytes_AS_STRING(code), codesize);
blocks = markblocks(codestr, codelen);
if (blocks == NULL)
goto exitError;
assert(PyList_Check(consts));
for (i=find_op(codestr, codelen, 0) ; i<codelen ; i=nexti) {
opcode = _Py_OPCODE(codestr[i]);
op_start = i;
while (op_start >= 1 && _Py_OPCODE(codestr[op_start-1]) == EXTENDED_ARG) {
op_start--;
}
nexti = i + 1;
while (nexti < codelen && _Py_OPCODE(codestr[nexti]) == EXTENDED_ARG)
nexti++;
nextop = nexti < codelen ? _Py_OPCODE(codestr[nexti]) : 0;
lastlc = cumlc;
cumlc = 0;
switch (opcode) {
/* Skip over LOAD_CONST trueconst
POP_JUMP_IF_FALSE xx. This improves
"while 1" performance. */
case LOAD_CONST:
cumlc = lastlc + 1;
if (nextop != POP_JUMP_IF_FALSE ||
!ISBASICBLOCK(blocks, op_start, i + 1)) {
break;
}
PyObject* cnt = PyList_GET_ITEM(consts, get_arg(codestr, i));
int is_true = PyObject_IsTrue(cnt);
if (is_true == -1) {
goto exitError;
}
if (is_true == 1) {
fill_nops(codestr, op_start, nexti + 1);
cumlc = 0;
}
break;
/* Try to fold tuples of constants.
Skip over BUILD_SEQN 1 UNPACK_SEQN 1.
Replace BUILD_SEQN 2 UNPACK_SEQN 2 with ROT2.
Replace BUILD_SEQN 3 UNPACK_SEQN 3 with ROT3 ROT2. */
case BUILD_TUPLE:
j = get_arg(codestr, i);
if (j > 0 && lastlc >= j) {
h = lastn_const_start(codestr, op_start, j);
if (ISBASICBLOCK(blocks, h, op_start)) {
h = fold_tuple_on_constants(codestr, codelen,
h, i+1, consts, j);
break;
}
}
if (nextop != UNPACK_SEQUENCE ||
!ISBASICBLOCK(blocks, op_start, i + 1) ||
j != get_arg(codestr, nexti))
break;
if (j < 2) {
fill_nops(codestr, op_start, nexti + 1);
} else if (j == 2) {
codestr[op_start] = PACKOPARG(ROT_TWO, 0);
fill_nops(codestr, op_start + 1, nexti + 1);
} else if (j == 3) {
codestr[op_start] = PACKOPARG(ROT_THREE, 0);
codestr[op_start + 1] = PACKOPARG(ROT_TWO, 0);
fill_nops(codestr, op_start + 2, nexti + 1);
}
break;
/* Simplify conditional jump to conditional jump where the
result of the first test implies the success of a similar
test or the failure of the opposite test.
Arises in code like:
"a and b or c"
"(a and b) and c"
"(a or b) or c"
"(a or b) and c"
x:JUMP_IF_FALSE_OR_POP y y:JUMP_IF_FALSE_OR_POP z
--> x:JUMP_IF_FALSE_OR_POP z
x:JUMP_IF_FALSE_OR_POP y y:JUMP_IF_TRUE_OR_POP z
--> x:POP_JUMP_IF_FALSE y+1
where y+1 is the instruction following the second test.
*/
case JUMP_IF_FALSE_OR_POP:
case JUMP_IF_TRUE_OR_POP:
h = get_arg(codestr, i) / sizeof(_Py_CODEUNIT);
tgt = find_op(codestr, codelen, h);
j = _Py_OPCODE(codestr[tgt]);
if (CONDITIONAL_JUMP(j)) {
/* NOTE: all possible jumps here are absolute. */
if (JUMPS_ON_TRUE(j) == JUMPS_ON_TRUE(opcode)) {
/* The second jump will be taken iff the first is.
The current opcode inherits its target's
stack effect */
h = set_arg(codestr, i, get_arg(codestr, tgt));
} else {
/* The second jump is not taken if the first is (so
jump past it), and all conditional jumps pop their
argument when they're not taken (so change the
first jump to pop its argument when it's taken). */
Py_ssize_t arg = (tgt + 1);
/* cannot overflow: codelen <= INT_MAX */
assert((size_t)arg <= UINT_MAX / sizeof(_Py_CODEUNIT));
arg *= sizeof(_Py_CODEUNIT);
h = set_arg(codestr, i, (unsigned int)arg);
j = opcode == JUMP_IF_TRUE_OR_POP ?
POP_JUMP_IF_TRUE : POP_JUMP_IF_FALSE;
}
if (h >= 0) {
nexti = h;
codestr[nexti] = PACKOPARG(j, _Py_OPARG(codestr[nexti]));
break;
}
}
/* Intentional fallthrough */
/* Replace jumps to unconditional jumps */
case POP_JUMP_IF_FALSE:
case POP_JUMP_IF_TRUE:
case JUMP_FORWARD:
case JUMP_ABSOLUTE:
h = GETJUMPTGT(codestr, i);
tgt = find_op(codestr, codelen, h);
/* Replace JUMP_* to a RETURN into just a RETURN */
if (UNCONDITIONAL_JUMP(opcode) &&
_Py_OPCODE(codestr[tgt]) == RETURN_VALUE) {
codestr[op_start] = PACKOPARG(RETURN_VALUE, 0);
fill_nops(codestr, op_start + 1, i + 1);
} else if (UNCONDITIONAL_JUMP(_Py_OPCODE(codestr[tgt]))) {
size_t arg = GETJUMPTGT(codestr, tgt);
if (opcode == JUMP_FORWARD) { /* JMP_ABS can go backwards */
opcode = JUMP_ABSOLUTE;
} else if (!ABSOLUTE_JUMP(opcode)) {
if (arg < (size_t)(i + 1)) {
break; /* No backward relative jumps */
}
arg -= i + 1; /* Calc relative jump addr */
}
/* cannot overflow: codelen <= INT_MAX */
assert(arg <= (UINT_MAX / sizeof(_Py_CODEUNIT)));
arg *= sizeof(_Py_CODEUNIT);
copy_op_arg(codestr, op_start, opcode,
(unsigned int)arg, i + 1);
}
break;
/* Remove unreachable ops after RETURN */
case RETURN_VALUE:
h = i + 1;
while (h < codelen && ISBASICBLOCK(blocks, i, h))
{
/* Leave SETUP_FINALLY and RERAISE in place to help find block limits. */
if (_Py_OPCODE(codestr[h]) == SETUP_FINALLY || _Py_OPCODE(codestr[h]) == RERAISE) {
while (h > i + 1 &&
_Py_OPCODE(codestr[h - 1]) == EXTENDED_ARG)
{
h--;
}
break;
}
h++;
}
if (h > i + 1) {
fill_nops(codestr, i + 1, h);
nexti = find_op(codestr, codelen, h);
}
break;
}
}
/* Fixup lnotab */
for (i = 0, nops = 0; i < codelen; i++) {
size_t block = (size_t)i - nops;
/* cannot overflow: codelen <= INT_MAX */
assert(block <= UINT_MAX);
/* original code offset => new code offset */
blocks[i] = (unsigned int)block;
if (_Py_OPCODE(codestr[i]) == NOP) {
nops++;
}
}
cum_orig_offset = 0;
last_offset = 0;
for (i=0 ; i < tabsiz ; i+=2) {
unsigned int offset_delta, new_offset;
cum_orig_offset += lnotab[i];
assert(cum_orig_offset % sizeof(_Py_CODEUNIT) == 0);
new_offset = blocks[cum_orig_offset / sizeof(_Py_CODEUNIT)] *
sizeof(_Py_CODEUNIT);
offset_delta = new_offset - last_offset;
assert(offset_delta <= 255);
lnotab[i] = (unsigned char)offset_delta;
last_offset = new_offset;
}
/* Remove NOPs and fixup jump targets */
for (op_start = i = h = 0; i < codelen; i++, op_start = i) {
j = _Py_OPARG(codestr[i]);
while (_Py_OPCODE(codestr[i]) == EXTENDED_ARG) {
i++;
j = j<<8 | _Py_OPARG(codestr[i]);
}
opcode = _Py_OPCODE(codestr[i]);
switch (opcode) {
case NOP:continue;
case JUMP_ABSOLUTE:
case POP_JUMP_IF_FALSE:
case POP_JUMP_IF_TRUE:
case JUMP_IF_FALSE_OR_POP:
case JUMP_IF_TRUE_OR_POP:
case JUMP_IF_NOT_EXC_MATCH:
j = blocks[j / sizeof(_Py_CODEUNIT)] * sizeof(_Py_CODEUNIT);
break;
case FOR_ITER:
case JUMP_FORWARD:
case SETUP_FINALLY:
case SETUP_WITH:
case SETUP_ASYNC_WITH:
j = blocks[j / sizeof(_Py_CODEUNIT) + i + 1] - blocks[i] - 1;
j *= sizeof(_Py_CODEUNIT);
break;
}
Py_ssize_t ilen = i - op_start + 1;
if (instrsize(j) > ilen) {
goto exitUnchanged;
}
/* If instrsize(j) < ilen, we'll emit EXTENDED_ARG 0 */
if (ilen > 4) {
/* Can only happen when PyCode_Optimize() is called with
malformed bytecode. */
goto exitUnchanged;
}
write_op_arg(codestr + h, opcode, j, (int)ilen);
h += ilen;
}
assert(h + (Py_ssize_t)nops == codelen);
PyMem_Free(blocks);
code = PyBytes_FromStringAndSize((char *)codestr, h * sizeof(_Py_CODEUNIT));
PyMem_Free(codestr);
return code;
exitError:
code = NULL;
exitUnchanged:
Py_XINCREF(code);
PyMem_Free(blocks);
PyMem_Free(codestr);
return code;
}