blob: 20eec4b7421ccbaec73446c5b2876e0cd34419d0 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
/*
* DO NOT MODIFY THIS MANUALLY! This file was generated using pypy.
* To generate this file:
* 1. Get mesapy code from https://github.com/mesalock-linux/mesapy/tree/947fb3f598eede83ba0e33b5b5655b9a9597c2d8
* 2. Run `PYTHONPATH=mesapy/sgx pypy ffi.py`.
*/
#define _CFFI_USE_EMBEDDING
#define _CFFI_
/* We try to define Py_LIMITED_API before including Python.h.
Mess: we can only define it if Py_DEBUG, Py_TRACE_REFS and
Py_REF_DEBUG are not defined. This is a best-effort approximation:
we can learn about Py_DEBUG from pyconfig.h, but it is unclear if
the same works for the other two macros. Py_DEBUG implies them,
but not the other way around.
Issue #350 is still open: on Windows, the code here causes it to link
with PYTHON36.DLL (for example) instead of PYTHON3.DLL. A fix was
attempted in 164e526a5515 and 14ce6985e1c3, but reverted: virtualenv
does not make PYTHON3.DLL available, and so the "correctly" compiled
version would not run inside a virtualenv. We will re-apply the fix
after virtualenv has been fixed for some time. For explanation, see
issue #355. For a workaround if you want PYTHON3.DLL and don't worry
about virtualenv, see issue #350. See also 'py_limited_api' in
setuptools_ext.py.
*/
#if !defined(_CFFI_USE_EMBEDDING) && !defined(Py_LIMITED_API)
# include <pyconfig.h>
# if !defined(Py_DEBUG) && !defined(Py_TRACE_REFS) && !defined(Py_REF_DEBUG)
# define Py_LIMITED_API
# endif
#endif
#include <Python.h>
#ifdef __cplusplus
extern "C" {
#endif
#include <stddef.h>
/* This part is from file 'cffi/parse_c_type.h'. It is copied at the
beginning of C sources generated by CFFI's ffi.set_source(). */
typedef void *_cffi_opcode_t;
#define _CFFI_OP(opcode, arg) (_cffi_opcode_t)(opcode | (((uintptr_t)(arg)) << 8))
#define _CFFI_GETOP(cffi_opcode) ((unsigned char)(uintptr_t)cffi_opcode)
#define _CFFI_GETARG(cffi_opcode) (((intptr_t)cffi_opcode) >> 8)
#define _CFFI_OP_PRIMITIVE 1
#define _CFFI_OP_POINTER 3
#define _CFFI_OP_ARRAY 5
#define _CFFI_OP_OPEN_ARRAY 7
#define _CFFI_OP_STRUCT_UNION 9
#define _CFFI_OP_ENUM 11
#define _CFFI_OP_FUNCTION 13
#define _CFFI_OP_FUNCTION_END 15
#define _CFFI_OP_NOOP 17
#define _CFFI_OP_BITFIELD 19
#define _CFFI_OP_TYPENAME 21
#define _CFFI_OP_CPYTHON_BLTN_V 23 // varargs
#define _CFFI_OP_CPYTHON_BLTN_N 25 // noargs
#define _CFFI_OP_CPYTHON_BLTN_O 27 // O (i.e. a single arg)
#define _CFFI_OP_CONSTANT 29
#define _CFFI_OP_CONSTANT_INT 31
#define _CFFI_OP_GLOBAL_VAR 33
#define _CFFI_OP_DLOPEN_FUNC 35
#define _CFFI_OP_DLOPEN_CONST 37
#define _CFFI_OP_GLOBAL_VAR_F 39
#define _CFFI_OP_EXTERN_PYTHON 41
#define _CFFI_PRIM_VOID 0
#define _CFFI_PRIM_BOOL 1
#define _CFFI_PRIM_CHAR 2
#define _CFFI_PRIM_SCHAR 3
#define _CFFI_PRIM_UCHAR 4
#define _CFFI_PRIM_SHORT 5
#define _CFFI_PRIM_USHORT 6
#define _CFFI_PRIM_INT 7
#define _CFFI_PRIM_UINT 8
#define _CFFI_PRIM_LONG 9
#define _CFFI_PRIM_ULONG 10
#define _CFFI_PRIM_LONGLONG 11
#define _CFFI_PRIM_ULONGLONG 12
#define _CFFI_PRIM_FLOAT 13
#define _CFFI_PRIM_DOUBLE 14
#define _CFFI_PRIM_LONGDOUBLE 15
#define _CFFI_PRIM_WCHAR 16
#define _CFFI_PRIM_INT8 17
#define _CFFI_PRIM_UINT8 18
#define _CFFI_PRIM_INT16 19
#define _CFFI_PRIM_UINT16 20
#define _CFFI_PRIM_INT32 21
#define _CFFI_PRIM_UINT32 22
#define _CFFI_PRIM_INT64 23
#define _CFFI_PRIM_UINT64 24
#define _CFFI_PRIM_INTPTR 25
#define _CFFI_PRIM_UINTPTR 26
#define _CFFI_PRIM_PTRDIFF 27
#define _CFFI_PRIM_SIZE 28
#define _CFFI_PRIM_SSIZE 29
#define _CFFI_PRIM_INT_LEAST8 30
#define _CFFI_PRIM_UINT_LEAST8 31
#define _CFFI_PRIM_INT_LEAST16 32
#define _CFFI_PRIM_UINT_LEAST16 33
#define _CFFI_PRIM_INT_LEAST32 34
#define _CFFI_PRIM_UINT_LEAST32 35
#define _CFFI_PRIM_INT_LEAST64 36
#define _CFFI_PRIM_UINT_LEAST64 37
#define _CFFI_PRIM_INT_FAST8 38
#define _CFFI_PRIM_UINT_FAST8 39
#define _CFFI_PRIM_INT_FAST16 40
#define _CFFI_PRIM_UINT_FAST16 41
#define _CFFI_PRIM_INT_FAST32 42
#define _CFFI_PRIM_UINT_FAST32 43
#define _CFFI_PRIM_INT_FAST64 44
#define _CFFI_PRIM_UINT_FAST64 45
#define _CFFI_PRIM_INTMAX 46
#define _CFFI_PRIM_UINTMAX 47
#define _CFFI_PRIM_FLOATCOMPLEX 48
#define _CFFI_PRIM_DOUBLECOMPLEX 49
#define _CFFI_PRIM_CHAR16 50
#define _CFFI_PRIM_CHAR32 51
#define _CFFI__NUM_PRIM 52
#define _CFFI__UNKNOWN_PRIM (-1)
#define _CFFI__UNKNOWN_FLOAT_PRIM (-2)
#define _CFFI__UNKNOWN_LONG_DOUBLE (-3)
#define _CFFI__IO_FILE_STRUCT (-1)
struct _cffi_global_s {
const char *name;
void *address;
_cffi_opcode_t type_op;
void *size_or_direct_fn; // OP_GLOBAL_VAR: size, or 0 if unknown
// OP_CPYTHON_BLTN_*: addr of direct function
};
struct _cffi_getconst_s {
unsigned long long value;
const struct _cffi_type_context_s *ctx;
int gindex;
};
struct _cffi_struct_union_s {
const char *name;
int type_index; // -> _cffi_types, on a OP_STRUCT_UNION
int flags; // _CFFI_F_* flags below
size_t size;
int alignment;
int first_field_index; // -> _cffi_fields array
int num_fields;
};
#define _CFFI_F_UNION 0x01 // is a union, not a struct
#define _CFFI_F_CHECK_FIELDS 0x02 // complain if fields are not in the
// "standard layout" or if some are missing
#define _CFFI_F_PACKED 0x04 // for CHECK_FIELDS, assume a packed struct
#define _CFFI_F_EXTERNAL 0x08 // in some other ffi.include()
#define _CFFI_F_OPAQUE 0x10 // opaque
struct _cffi_field_s {
const char *name;
size_t field_offset;
size_t field_size;
_cffi_opcode_t field_type_op;
};
struct _cffi_enum_s {
const char *name;
int type_index; // -> _cffi_types, on a OP_ENUM
int type_prim; // _CFFI_PRIM_xxx
const char *enumerators; // comma-delimited string
};
struct _cffi_typename_s {
const char *name;
int type_index; /* if opaque, points to a possibly artificial
OP_STRUCT which is itself opaque */
};
struct _cffi_type_context_s {
_cffi_opcode_t *types;
const struct _cffi_global_s *globals;
const struct _cffi_field_s *fields;
const struct _cffi_struct_union_s *struct_unions;
const struct _cffi_enum_s *enums;
const struct _cffi_typename_s *typenames;
int num_globals;
int num_struct_unions;
int num_enums;
int num_typenames;
const char *const *includes;
int num_types;
int flags; /* future extension */
};
struct _cffi_parse_info_s {
const struct _cffi_type_context_s *ctx;
_cffi_opcode_t *output;
unsigned int output_size;
size_t error_location;
const char *error_message;
};
struct _cffi_externpy_s {
const char *name;
size_t size_of_result;
void *reserved1, *reserved2;
};
#ifdef _CFFI_INTERNAL
static int parse_c_type(struct _cffi_parse_info_s *info, const char *input);
static int search_in_globals(const struct _cffi_type_context_s *ctx,
const char *search, size_t search_len);
static int search_in_struct_unions(const struct _cffi_type_context_s *ctx,
const char *search, size_t search_len);
#endif
/* this block of #ifs should be kept exactly identical between
c/_cffi_backend.c, cffi/vengine_cpy.py, cffi/vengine_gen.py
and cffi/_cffi_include.h */
#if defined(_MSC_VER)
# include <malloc.h> /* for alloca() */
# if _MSC_VER < 1600 /* MSVC < 2010 */
typedef __int8 int8_t;
typedef __int16 int16_t;
typedef __int32 int32_t;
typedef __int64 int64_t;
typedef unsigned __int8 uint8_t;
typedef unsigned __int16 uint16_t;
typedef unsigned __int32 uint32_t;
typedef unsigned __int64 uint64_t;
typedef __int8 int_least8_t;
typedef __int16 int_least16_t;
typedef __int32 int_least32_t;
typedef __int64 int_least64_t;
typedef unsigned __int8 uint_least8_t;
typedef unsigned __int16 uint_least16_t;
typedef unsigned __int32 uint_least32_t;
typedef unsigned __int64 uint_least64_t;
typedef __int8 int_fast8_t;
typedef __int16 int_fast16_t;
typedef __int32 int_fast32_t;
typedef __int64 int_fast64_t;
typedef unsigned __int8 uint_fast8_t;
typedef unsigned __int16 uint_fast16_t;
typedef unsigned __int32 uint_fast32_t;
typedef unsigned __int64 uint_fast64_t;
typedef __int64 intmax_t;
typedef unsigned __int64 uintmax_t;
# else
# include <stdint.h>
# endif
# if _MSC_VER < 1800 /* MSVC < 2013 */
# ifndef __cplusplus
typedef unsigned char _Bool;
# endif
# endif
#else
# include <stdint.h>
# if (defined (__SVR4) && defined (__sun)) || defined(_AIX) || defined(__hpux)
# include <alloca.h>
# endif
#endif
#ifdef __GNUC__
# define _CFFI_UNUSED_FN __attribute__((unused))
#else
# define _CFFI_UNUSED_FN /* nothing */
#endif
#ifdef __cplusplus
# ifndef _Bool
typedef bool _Bool; /* semi-hackish: C++ has no _Bool; bool is builtin */
# endif
#endif
/********** CPython-specific section **********/
#ifndef PYPY_VERSION
#if PY_MAJOR_VERSION >= 3
# define PyInt_FromLong PyLong_FromLong
#endif
#define _cffi_from_c_double PyFloat_FromDouble
#define _cffi_from_c_float PyFloat_FromDouble
#define _cffi_from_c_long PyInt_FromLong
#define _cffi_from_c_ulong PyLong_FromUnsignedLong
#define _cffi_from_c_longlong PyLong_FromLongLong
#define _cffi_from_c_ulonglong PyLong_FromUnsignedLongLong
#define _cffi_from_c__Bool PyBool_FromLong
#define _cffi_to_c_double PyFloat_AsDouble
#define _cffi_to_c_float PyFloat_AsDouble
#define _cffi_from_c_int(x, type) \
(((type)-1) > 0 ? /* unsigned */ \
(sizeof(type) < sizeof(long) ? \
PyInt_FromLong((long)x) : \
sizeof(type) == sizeof(long) ? \
PyLong_FromUnsignedLong((unsigned long)x) : \
PyLong_FromUnsignedLongLong((unsigned long long)x)) : \
(sizeof(type) <= sizeof(long) ? \
PyInt_FromLong((long)x) : \
PyLong_FromLongLong((long long)x)))
#define _cffi_to_c_int(o, type) \
((type)( \
sizeof(type) == 1 ? (((type)-1) > 0 ? (type)_cffi_to_c_u8(o) \
: (type)_cffi_to_c_i8(o)) : \
sizeof(type) == 2 ? (((type)-1) > 0 ? (type)_cffi_to_c_u16(o) \
: (type)_cffi_to_c_i16(o)) : \
sizeof(type) == 4 ? (((type)-1) > 0 ? (type)_cffi_to_c_u32(o) \
: (type)_cffi_to_c_i32(o)) : \
sizeof(type) == 8 ? (((type)-1) > 0 ? (type)_cffi_to_c_u64(o) \
: (type)_cffi_to_c_i64(o)) : \
(Py_FatalError("unsupported size for type " #type), (type)0)))
#define _cffi_to_c_i8 \
((int(*)(PyObject *))_cffi_exports[1])
#define _cffi_to_c_u8 \
((int(*)(PyObject *))_cffi_exports[2])
#define _cffi_to_c_i16 \
((int(*)(PyObject *))_cffi_exports[3])
#define _cffi_to_c_u16 \
((int(*)(PyObject *))_cffi_exports[4])
#define _cffi_to_c_i32 \
((int(*)(PyObject *))_cffi_exports[5])
#define _cffi_to_c_u32 \
((unsigned int(*)(PyObject *))_cffi_exports[6])
#define _cffi_to_c_i64 \
((long long(*)(PyObject *))_cffi_exports[7])
#define _cffi_to_c_u64 \
((unsigned long long(*)(PyObject *))_cffi_exports[8])
#define _cffi_to_c_char \
((int(*)(PyObject *))_cffi_exports[9])
#define _cffi_from_c_pointer \
((PyObject *(*)(char *, struct _cffi_ctypedescr *))_cffi_exports[10])
#define _cffi_to_c_pointer \
((char *(*)(PyObject *, struct _cffi_ctypedescr *))_cffi_exports[11])
#define _cffi_get_struct_layout \
not used any more
#define _cffi_restore_errno \
((void(*)(void))_cffi_exports[13])
#define _cffi_save_errno \
((void(*)(void))_cffi_exports[14])
#define _cffi_from_c_char \
((PyObject *(*)(char))_cffi_exports[15])
#define _cffi_from_c_deref \
((PyObject *(*)(char *, struct _cffi_ctypedescr *))_cffi_exports[16])
#define _cffi_to_c \
((int(*)(char *, struct _cffi_ctypedescr *, PyObject *))_cffi_exports[17])
#define _cffi_from_c_struct \
((PyObject *(*)(char *, struct _cffi_ctypedescr *))_cffi_exports[18])
#define _cffi_to_c_wchar_t \
((_cffi_wchar_t(*)(PyObject *))_cffi_exports[19])
#define _cffi_from_c_wchar_t \
((PyObject *(*)(_cffi_wchar_t))_cffi_exports[20])
#define _cffi_to_c_long_double \
((long double(*)(PyObject *))_cffi_exports[21])
#define _cffi_to_c__Bool \
((_Bool(*)(PyObject *))_cffi_exports[22])
#define _cffi_prepare_pointer_call_argument \
((Py_ssize_t(*)(struct _cffi_ctypedescr *, \
PyObject *, char **))_cffi_exports[23])
#define _cffi_convert_array_from_object \
((int(*)(char *, struct _cffi_ctypedescr *, PyObject *))_cffi_exports[24])
#define _CFFI_CPIDX 25
#define _cffi_call_python \
((void(*)(struct _cffi_externpy_s *, char *))_cffi_exports[_CFFI_CPIDX])
#define _cffi_to_c_wchar3216_t \
((int(*)(PyObject *))_cffi_exports[26])
#define _cffi_from_c_wchar3216_t \
((PyObject *(*)(int))_cffi_exports[27])
#define _CFFI_NUM_EXPORTS 28
struct _cffi_ctypedescr;
static void *_cffi_exports[_CFFI_NUM_EXPORTS];
#define _cffi_type(index) ( \
assert((((uintptr_t)_cffi_types[index]) & 1) == 0), \
(struct _cffi_ctypedescr *)_cffi_types[index])
static PyObject *_cffi_init(const char *module_name, Py_ssize_t version,
const struct _cffi_type_context_s *ctx)
{
PyObject *module, *o_arg, *new_module;
void *raw[] = {
(void *)module_name,
(void *)version,
(void *)_cffi_exports,
(void *)ctx,
};
module = PyImport_ImportModule("_cffi_backend");
if (module == NULL)
goto failure;
o_arg = PyLong_FromVoidPtr((void *)raw);
if (o_arg == NULL)
goto failure;
new_module = PyObject_CallMethod(
module, (char *)"_init_cffi_1_0_external_module", (char *)"O", o_arg);
Py_DECREF(o_arg);
Py_DECREF(module);
return new_module;
failure:
Py_XDECREF(module);
return NULL;
}
#ifdef HAVE_WCHAR_H
typedef wchar_t _cffi_wchar_t;
#else
typedef uint16_t _cffi_wchar_t; /* same random pick as _cffi_backend.c */
#endif
_CFFI_UNUSED_FN static uint16_t _cffi_to_c_char16_t(PyObject *o)
{
if (sizeof(_cffi_wchar_t) == 2)
return (uint16_t)_cffi_to_c_wchar_t(o);
else
return (uint16_t)_cffi_to_c_wchar3216_t(o);
}
_CFFI_UNUSED_FN static PyObject *_cffi_from_c_char16_t(uint16_t x)
{
if (sizeof(_cffi_wchar_t) == 2)
return _cffi_from_c_wchar_t((_cffi_wchar_t)x);
else
return _cffi_from_c_wchar3216_t((int)x);
}
_CFFI_UNUSED_FN static int _cffi_to_c_char32_t(PyObject *o)
{
if (sizeof(_cffi_wchar_t) == 4)
return (int)_cffi_to_c_wchar_t(o);
else
return (int)_cffi_to_c_wchar3216_t(o);
}
_CFFI_UNUSED_FN static PyObject *_cffi_from_c_char32_t(int x)
{
if (sizeof(_cffi_wchar_t) == 4)
return _cffi_from_c_wchar_t((_cffi_wchar_t)x);
else
return _cffi_from_c_wchar3216_t(x);
}
/********** end CPython-specific section **********/
#else
_CFFI_UNUSED_FN
static void (*_cffi_call_python_org)(struct _cffi_externpy_s *, char *);
# define _cffi_call_python _cffi_call_python_org
#endif
#define _cffi_array_len(array) (sizeof(array) / sizeof((array)[0]))
#define _cffi_prim_int(size, sign) \
((size) == 1 ? ((sign) ? _CFFI_PRIM_INT8 : _CFFI_PRIM_UINT8) : \
(size) == 2 ? ((sign) ? _CFFI_PRIM_INT16 : _CFFI_PRIM_UINT16) : \
(size) == 4 ? ((sign) ? _CFFI_PRIM_INT32 : _CFFI_PRIM_UINT32) : \
(size) == 8 ? ((sign) ? _CFFI_PRIM_INT64 : _CFFI_PRIM_UINT64) : \
_CFFI__UNKNOWN_PRIM)
#define _cffi_prim_float(size) \
((size) == sizeof(float) ? _CFFI_PRIM_FLOAT : \
(size) == sizeof(double) ? _CFFI_PRIM_DOUBLE : \
(size) == sizeof(long double) ? _CFFI__UNKNOWN_LONG_DOUBLE : \
_CFFI__UNKNOWN_FLOAT_PRIM)
#define _cffi_check_int(got, got_nonpos, expected) \
((got_nonpos) == (expected <= 0) && \
(got) == (unsigned long long)expected)
#ifdef MS_WIN32
# define _cffi_stdcall __stdcall
#else
# define _cffi_stdcall /* nothing */
#endif
#ifdef __cplusplus
}
#endif
#define _CFFI_MODULE_NAME "acs_py_enclave"
static const char _CFFI_PYTHON_STARTUP_CODE[] = {
// # NB. this is not a string because of a size limit in MSVC
// # Licensed to the Apache Software Foundation (ASF) under one
35,32,76,105,99,101,110,115,101,100,32,116,111,32,116,104,101,32,65,112,97,99,
104,101,32,83,111,102,116,119,97,114,101,32,70,111,117,110,100,97,116,105,111,
110,32,40,65,83,70,41,32,117,110,100,101,114,32,111,110,101,10,
// # or more contributor license agreements. See the NOTICE file
35,32,111,114,32,109,111,114,101,32,99,111,110,116,114,105,98,117,116,111,114,
32,108,105,99,101,110,115,101,32,97,103,114,101,101,109,101,110,116,115,46,32,
32,83,101,101,32,116,104,101,32,78,79,84,73,67,69,32,102,105,108,101,10,
// # distributed with this work for additional information
35,32,100,105,115,116,114,105,98,117,116,101,100,32,119,105,116,104,32,116,104,
105,115,32,119,111,114,107,32,102,111,114,32,97,100,100,105,116,105,111,110,
97,108,32,105,110,102,111,114,109,97,116,105,111,110,10,
// # regarding copyright ownership. The ASF licenses this file
35,32,114,101,103,97,114,100,105,110,103,32,99,111,112,121,114,105,103,104,116,
32,111,119,110,101,114,115,104,105,112,46,32,32,84,104,101,32,65,83,70,32,108,
105,99,101,110,115,101,115,32,116,104,105,115,32,102,105,108,101,10,
// # to you under the Apache License, Version 2.0 (the
35,32,116,111,32,121,111,117,32,117,110,100,101,114,32,116,104,101,32,65,112,
97,99,104,101,32,76,105,99,101,110,115,101,44,32,86,101,114,115,105,111,110,
32,50,46,48,32,40,116,104,101,10,
// # "License"); you may not use this file except in compliance
35,32,34,76,105,99,101,110,115,101,34,41,59,32,121,111,117,32,109,97,121,32,
110,111,116,32,117,115,101,32,116,104,105,115,32,102,105,108,101,32,101,120,
99,101,112,116,32,105,110,32,99,111,109,112,108,105,97,110,99,101,10,
// # with the License. You may obtain a copy of the License at
35,32,119,105,116,104,32,116,104,101,32,76,105,99,101,110,115,101,46,32,32,89,
111,117,32,109,97,121,32,111,98,116,97,105,110,32,97,32,99,111,112,121,32,111,
102,32,116,104,101,32,76,105,99,101,110,115,101,32,97,116,10,
// #
35,10,
// # http://www.apache.org/licenses/LICENSE-2.0
35,32,32,32,104,116,116,112,58,47,47,119,119,119,46,97,112,97,99,104,101,46,
111,114,103,47,108,105,99,101,110,115,101,115,47,76,73,67,69,78,83,69,45,50,
46,48,10,
// #
35,10,
// # Unless required by applicable law or agreed to in writing,
35,32,85,110,108,101,115,115,32,114,101,113,117,105,114,101,100,32,98,121,32,
97,112,112,108,105,99,97,98,108,101,32,108,97,119,32,111,114,32,97,103,114,101,
101,100,32,116,111,32,105,110,32,119,114,105,116,105,110,103,44,10,
// # software distributed under the License is distributed on an
35,32,115,111,102,116,119,97,114,101,32,100,105,115,116,114,105,98,117,116,101,
100,32,117,110,100,101,114,32,116,104,101,32,76,105,99,101,110,115,101,32,105,
115,32,100,105,115,116,114,105,98,117,116,101,100,32,111,110,32,97,110,10,
// # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
35,32,34,65,83,32,73,83,34,32,66,65,83,73,83,44,32,87,73,84,72,79,85,84,32,87,
65,82,82,65,78,84,73,69,83,32,79,82,32,67,79,78,68,73,84,73,79,78,83,32,79,70,
32,65,78,89,10,
// # KIND, either express or implied. See the License for the
35,32,75,73,78,68,44,32,101,105,116,104,101,114,32,101,120,112,114,101,115,115,
32,111,114,32,105,109,112,108,105,101,100,46,32,32,83,101,101,32,116,104,101,
32,76,105,99,101,110,115,101,32,102,111,114,32,116,104,101,10,
// # specific language governing permissions and limitations
35,32,115,112,101,99,105,102,105,99,32,108,97,110,103,117,97,103,101,32,103,
111,118,101,114,110,105,110,103,32,112,101,114,109,105,115,115,105,111,110,115,
32,97,110,100,32,108,105,109,105,116,97,116,105,111,110,115,10,
// # under the License.
35,32,117,110,100,101,114,32,116,104,101,32,76,105,99,101,110,115,101,46,10,
//
10,
// ###############################################################################
35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,
35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,
35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,
35,10,
// # Parser Combinators
35,32,80,97,114,115,101,114,32,67,111,109,98,105,110,97,116,111,114,115,10,
// ###############################################################################
35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,
35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,
35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,
35,10,
// class Pair(tuple):
99,108,97,115,115,32,80,97,105,114,40,116,117,112,108,101,41,58,10,
// def __new__(cls, a, b):
32,32,32,32,100,101,102,32,95,95,110,101,119,95,95,40,99,108,115,44,32,97,44,
32,98,41,58,10,
// return super(Pair, cls).__new__(cls, [a, b])
32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,115,117,112,101,114,40,80,
97,105,114,44,32,99,108,115,41,46,95,95,110,101,119,95,95,40,99,108,115,44,32,
91,97,44,32,98,93,41,10,
//
10,
// class Either(object):
99,108,97,115,115,32,69,105,116,104,101,114,40,111,98,106,101,99,116,41,58,10,
// def __init__(self, left, right):
32,32,32,32,100,101,102,32,95,95,105,110,105,116,95,95,40,115,101,108,102,44,
32,108,101,102,116,44,32,114,105,103,104,116,41,58,10,
// self.__left = left
32,32,32,32,32,32,32,32,115,101,108,102,46,95,95,108,101,102,116,32,61,32,108,
101,102,116,10,
// self.__right = right
32,32,32,32,32,32,32,32,115,101,108,102,46,95,95,114,105,103,104,116,32,61,32,
114,105,103,104,116,10,
//
10,
// def left(self):
32,32,32,32,100,101,102,32,108,101,102,116,40,115,101,108,102,41,58,10,
// if not self.is_left():
32,32,32,32,32,32,32,32,105,102,32,110,111,116,32,115,101,108,102,46,105,115,
95,108,101,102,116,40,41,58,10,
// raise ValueError('wrong extractor for either')
32,32,32,32,32,32,32,32,32,32,32,32,114,97,105,115,101,32,86,97,108,117,101,
69,114,114,111,114,40,39,119,114,111,110,103,32,101,120,116,114,97,99,116,111,
114,32,102,111,114,32,101,105,116,104,101,114,39,41,10,
// return self.__left
32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,115,101,108,102,46,95,95,
108,101,102,116,10,
//
10,
// def right(self):
32,32,32,32,100,101,102,32,114,105,103,104,116,40,115,101,108,102,41,58,10,
// if not self.is_right():
32,32,32,32,32,32,32,32,105,102,32,110,111,116,32,115,101,108,102,46,105,115,
95,114,105,103,104,116,40,41,58,10,
// raise ValueError('wrong extractor for either')
32,32,32,32,32,32,32,32,32,32,32,32,114,97,105,115,101,32,86,97,108,117,101,
69,114,114,111,114,40,39,119,114,111,110,103,32,101,120,116,114,97,99,116,111,
114,32,102,111,114,32,101,105,116,104,101,114,39,41,10,
// return self.__right
32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,115,101,108,102,46,95,95,
114,105,103,104,116,10,
//
10,
// def is_right(self):
32,32,32,32,100,101,102,32,105,115,95,114,105,103,104,116,40,115,101,108,102,
41,58,10,
// return False
32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,70,97,108,115,101,10,
//
10,
// def is_left(self):
32,32,32,32,100,101,102,32,105,115,95,108,101,102,116,40,115,101,108,102,41,
58,10,
// return False
32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,70,97,108,115,101,10,
//
10,
// def get(self):
32,32,32,32,100,101,102,32,103,101,116,40,115,101,108,102,41,58,10,
// if self.is_right():
32,32,32,32,32,32,32,32,105,102,32,115,101,108,102,46,105,115,95,114,105,103,
104,116,40,41,58,10,
// return self.right()
32,32,32,32,32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,115,101,108,102,
46,114,105,103,104,116,40,41,10,
// if self.is_left():
32,32,32,32,32,32,32,32,105,102,32,115,101,108,102,46,105,115,95,108,101,102,
116,40,41,58,10,
// return self.left()
32,32,32,32,32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,115,101,108,102,
46,108,101,102,116,40,41,10,
// raise ValueError('incomplete Either object')
32,32,32,32,32,32,32,32,114,97,105,115,101,32,86,97,108,117,101,69,114,114,111,
114,40,39,105,110,99,111,109,112,108,101,116,101,32,69,105,116,104,101,114,32,
111,98,106,101,99,116,39,41,10,
//
10,
// def __str__(self):
32,32,32,32,100,101,102,32,95,95,115,116,114,95,95,40,115,101,108,102,41,58,
10,
// if self.is_left():
32,32,32,32,32,32,32,32,105,102,32,115,101,108,102,46,105,115,95,108,101,102,
116,40,41,58,10,
// return 'Left(' + str(self.left()) + ')'
32,32,32,32,32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,39,76,101,102,
116,40,39,32,43,32,115,116,114,40,115,101,108,102,46,108,101,102,116,40,41,41,
32,43,32,39,41,39,10,
// else:
32,32,32,32,32,32,32,32,101,108,115,101,58,10,
// return 'Right(' + str(self.right()) + ')'
32,32,32,32,32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,39,82,105,103,
104,116,40,39,32,43,32,115,116,114,40,115,101,108,102,46,114,105,103,104,116,
40,41,41,32,43,32,39,41,39,10,
//
10,
// def __repr__(self):
32,32,32,32,100,101,102,32,95,95,114,101,112,114,95,95,40,115,101,108,102,41,
58,10,
// if self.is_left():
32,32,32,32,32,32,32,32,105,102,32,115,101,108,102,46,105,115,95,108,101,102,
116,40,41,58,10,
// return 'Left(' + repr(self.left()) + ')'
32,32,32,32,32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,39,76,101,102,
116,40,39,32,43,32,114,101,112,114,40,115,101,108,102,46,108,101,102,116,40,
41,41,32,43,32,39,41,39,10,
// else:
32,32,32,32,32,32,32,32,101,108,115,101,58,10,
// return 'Right(' + repr(self.right()) + ')'
32,32,32,32,32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,39,82,105,103,
104,116,40,39,32,43,32,114,101,112,114,40,115,101,108,102,46,114,105,103,104,
116,40,41,41,32,43,32,39,41,39,10,
//
10,
// class Left(Either):
99,108,97,115,115,32,76,101,102,116,40,69,105,116,104,101,114,41,58,10,
// def __init__(self, payload):
32,32,32,32,100,101,102,32,95,95,105,110,105,116,95,95,40,115,101,108,102,44,
32,112,97,121,108,111,97,100,41,58,10,
// super(Left, self).__init__(payload, None)
32,32,32,32,32,32,32,32,115,117,112,101,114,40,76,101,102,116,44,32,115,101,
108,102,41,46,95,95,105,110,105,116,95,95,40,112,97,121,108,111,97,100,44,32,
78,111,110,101,41,10,
//
10,
// def is_left(self):
32,32,32,32,100,101,102,32,105,115,95,108,101,102,116,40,115,101,108,102,41,
58,10,
// return True
32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,84,114,117,101,10,
//
10,
// class Right(Either):
99,108,97,115,115,32,82,105,103,104,116,40,69,105,116,104,101,114,41,58,10,
// def __init__(self, payload):
32,32,32,32,100,101,102,32,95,95,105,110,105,116,95,95,40,115,101,108,102,44,
32,112,97,121,108,111,97,100,41,58,10,
// super(Right, self).__init__(None, payload)
32,32,32,32,32,32,32,32,115,117,112,101,114,40,82,105,103,104,116,44,32,115,
101,108,102,41,46,95,95,105,110,105,116,95,95,40,78,111,110,101,44,32,112,97,
121,108,111,97,100,41,10,
//
10,
// def is_right(self):
32,32,32,32,100,101,102,32,105,115,95,114,105,103,104,116,40,115,101,108,102,
41,58,10,
// return True
32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,84,114,117,101,10,
//
10,
// class Stream(object):
99,108,97,115,115,32,83,116,114,101,97,109,40,111,98,106,101,99,116,41,58,10,
// WHITESPACES = [' ', '\t', '\r']
32,32,32,32,87,72,73,84,69,83,80,65,67,69,83,32,61,32,91,39,32,39,44,32,39,92,
116,39,44,32,39,92,114,39,93,10,
// def __init__(self, items, pos = 0):
32,32,32,32,100,101,102,32,95,95,105,110,105,116,95,95,40,115,101,108,102,44,
32,105,116,101,109,115,44,32,112,111,115,32,61,32,48,41,58,10,
// self.__items = items
32,32,32,32,32,32,32,32,115,101,108,102,46,95,95,105,116,101,109,115,32,61,32,
105,116,101,109,115,10,
// self.__pos = pos
32,32,32,32,32,32,32,32,115,101,108,102,46,95,95,112,111,115,32,61,32,112,111,
115,10,
//
10,
// def accept_strlit(self, string):
32,32,32,32,100,101,102,32,97,99,99,101,112,116,95,115,116,114,108,105,116,40,
115,101,108,102,44,32,115,116,114,105,110,103,41,58,10,
// # Typically parsers want to skip white spaces except line breaks
32,32,32,32,32,32,32,32,35,32,84,121,112,105,99,97,108,108,121,32,112,97,114,
115,101,114,115,32,119,97,110,116,32,116,111,32,115,107,105,112,32,119,104,105,
116,101,32,115,112,97,99,101,115,32,101,120,99,101,112,116,32,108,105,110,101,
32,98,114,101,97,107,115,10,
// # In the future this should be configurable
32,32,32,32,32,32,32,32,35,32,73,110,32,116,104,101,32,102,117,116,117,114,101,
32,116,104,105,115,32,115,104,111,117,108,100,32,98,101,32,99,111,110,102,105,
103,117,114,97,98,108,101,10,
// pos = self.__pos
32,32,32,32,32,32,32,32,112,111,115,32,61,32,115,101,108,102,46,95,95,112,111,
115,10,
// l = len(self.__items)
32,32,32,32,32,32,32,32,108,32,61,32,108,101,110,40,115,101,108,102,46,95,95,
105,116,101,109,115,41,10,
// while pos < l and self.__items[pos] in self.WHITESPACES:
32,32,32,32,32,32,32,32,119,104,105,108,101,32,112,111,115,32,60,32,108,32,97,
110,100,32,115,101,108,102,46,95,95,105,116,101,109,115,91,112,111,115,93,32,
105,110,32,115,101,108,102,46,87,72,73,84,69,83,80,65,67,69,83,58,10,
// pos += 1
32,32,32,32,32,32,32,32,32,32,32,32,112,111,115,32,43,61,32,49,10,
//
10,
// match_pos = 0
32,32,32,32,32,32,32,32,109,97,116,99,104,95,112,111,115,32,61,32,48,10,
// l = len(string)
32,32,32,32,32,32,32,32,108,32,61,32,108,101,110,40,115,116,114,105,110,103,
41,32,32,32,32,32,32,32,32,10,
// while match_pos < l and string[match_pos] in self.WHITESPACES:
32,32,32,32,32,32,32,32,119,104,105,108,101,32,109,97,116,99,104,95,112,111,
115,32,60,32,108,32,97,110,100,32,115,116,114,105,110,103,91,109,97,116,99,104,
95,112,111,115,93,32,105,110,32,115,101,108,102,46,87,72,73,84,69,83,80,65,67,
69,83,58,10,
// match_pos += 1
32,32,32,32,32,32,32,32,32,32,32,32,109,97,116,99,104,95,112,111,115,32,43,61,
32,49,10,
// if pos < match_pos:
32,32,32,32,32,32,32,32,105,102,32,112,111,115,32,60,32,109,97,116,99,104,95,
112,111,115,58,10,
// raise ParsingError(self, 'expecting "{}"'.format(string))
32,32,32,32,32,32,32,32,32,32,32,32,114,97,105,115,101,32,80,97,114,115,105,
110,103,69,114,114,111,114,40,115,101,108,102,44,32,39,101,120,112,101,99,116,
105,110,103,32,34,123,125,34,39,46,102,111,114,109,97,116,40,115,116,114,105,
110,103,41,41,10,
// if match_pos:
32,32,32,32,32,32,32,32,105,102,32,109,97,116,99,104,95,112,111,115,58,10,
// string = string[match_pos:]
32,32,32,32,32,32,32,32,32,32,32,32,115,116,114,105,110,103,32,61,32,115,116,
114,105,110,103,91,109,97,116,99,104,95,112,111,115,58,93,10,
// if self.__items.startswith(string, pos):
32,32,32,32,32,32,32,32,105,102,32,115,101,108,102,46,95,95,105,116,101,109,
115,46,115,116,97,114,116,115,119,105,116,104,40,115,116,114,105,110,103,44,
32,112,111,115,41,58,10,
// return Stream(self.__items, pos + len(string))
32,32,32,32,32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,83,116,114,101,
97,109,40,115,101,108,102,46,95,95,105,116,101,109,115,44,32,112,111,115,32,
43,32,108,101,110,40,115,116,114,105,110,103,41,41,10,
// raise ParsingError(self, 'expecting "{}"'.format(string))
32,32,32,32,32,32,32,32,114,97,105,115,101,32,80,97,114,115,105,110,103,69,114,
114,111,114,40,115,101,108,102,44,32,39,101,120,112,101,99,116,105,110,103,32,
34,123,125,34,39,46,102,111,114,109,97,116,40,115,116,114,105,110,103,41,41,
10,
//
10,
// def accept_matcher(self, matcher):
32,32,32,32,100,101,102,32,97,99,99,101,112,116,95,109,97,116,99,104,101,114,
40,115,101,108,102,44,32,109,97,116,99,104,101,114,41,58,10,
// pos = self.__pos
32,32,32,32,32,32,32,32,112,111,115,32,61,32,115,101,108,102,46,95,95,112,111,
115,10,
// l = len(self.__items)
32,32,32,32,32,32,32,32,108,32,61,32,108,101,110,40,115,101,108,102,46,95,95,
105,116,101,109,115,41,10,
// while pos < l and self.__items[pos] in self.WHITESPACES:
32,32,32,32,32,32,32,32,119,104,105,108,101,32,112,111,115,32,60,32,108,32,97,
110,100,32,115,101,108,102,46,95,95,105,116,101,109,115,91,112,111,115,93,32,
105,110,32,115,101,108,102,46,87,72,73,84,69,83,80,65,67,69,83,58,10,
// pos += 1
32,32,32,32,32,32,32,32,32,32,32,32,112,111,115,32,43,61,32,49,10,
//
10,
// res = matcher(self.__items, pos)
32,32,32,32,32,32,32,32,114,101,115,32,61,32,109,97,116,99,104,101,114,40,115,
101,108,102,46,95,95,105,116,101,109,115,44,32,112,111,115,41,10,
// if res is None:
32,32,32,32,32,32,32,32,105,102,32,114,101,115,32,105,115,32,78,111,110,101,
58,10,
// raise ParsingError(self, 'matcher for {} failed'.format(matcher.__doc__))
32,32,32,32,32,32,32,32,32,32,32,32,114,97,105,115,101,32,80,97,114,115,105,
110,103,69,114,114,111,114,40,115,101,108,102,44,32,39,109,97,116,99,104,101,
114,32,102,111,114,32,123,125,32,102,97,105,108,101,100,39,46,102,111,114,109,
97,116,40,109,97,116,99,104,101,114,46,95,95,100,111,99,95,95,41,41,10,
// obj, npos = res
32,32,32,32,32,32,32,32,111,98,106,44,32,110,112,111,115,32,61,32,114,101,115,
10,
// return obj, Stream(self.__items, npos)
32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,111,98,106,44,32,83,116,114,
101,97,109,40,115,101,108,102,46,95,95,105,116,101,109,115,44,32,110,112,111,
115,41,10,
//
10,
// def end(self):
32,32,32,32,100,101,102,32,101,110,100,40,115,101,108,102,41,58,10,
// return self.__pos == len(self.__items)
32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,115,101,108,102,46,95,95,
112,111,115,32,61,61,32,108,101,110,40,115,101,108,102,46,95,95,105,116,101,
109,115,41,10,
//
10,
// def pos(self):
32,32,32,32,100,101,102,32,112,111,115,40,115,101,108,102,41,58,10,
// return self.__pos
32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,115,101,108,102,46,95,95,
112,111,115,10,
//
10,
// def __repr__(self):
32,32,32,32,100,101,102,32,95,95,114,101,112,114,95,95,40,115,101,108,102,41,
58,10,
// line_start = self.__items.rfind('\n', 0, self.__pos) + 1
32,32,32,32,32,32,32,32,108,105,110,101,95,115,116,97,114,116,32,61,32,115,101,
108,102,46,95,95,105,116,101,109,115,46,114,102,105,110,100,40,39,92,110,39,
44,32,48,44,32,115,101,108,102,46,95,95,112,111,115,41,32,43,32,49,10,
// line_end = self.__items.find('\n', self.__pos)
32,32,32,32,32,32,32,32,108,105,110,101,95,101,110,100,32,61,32,115,101,108,
102,46,95,95,105,116,101,109,115,46,102,105,110,100,40,39,92,110,39,44,32,115,
101,108,102,46,95,95,112,111,115,41,10,
// if line_end == -1:
32,32,32,32,32,32,32,32,105,102,32,108,105,110,101,95,101,110,100,32,61,61,32,
45,49,58,10,
// line_end = self.__pos
32,32,32,32,32,32,32,32,32,32,32,32,108,105,110,101,95,101,110,100,32,61,32,
115,101,108,102,46,95,95,112,111,115,10,
//
10,
// if line_end - line_start > 80:
32,32,32,32,32,32,32,32,105,102,32,108,105,110,101,95,101,110,100,32,45,32,108,
105,110,101,95,115,116,97,114,116,32,62,32,56,48,58,10,
// line_start = max(line_start, self.__pos - 40)
32,32,32,32,32,32,32,32,32,32,32,32,108,105,110,101,95,115,116,97,114,116,32,
61,32,109,97,120,40,108,105,110,101,95,115,116,97,114,116,44,32,115,101,108,
102,46,95,95,112,111,115,32,45,32,52,48,41,10,
// line_end = min(line_start + 80, len(self.__items))
32,32,32,32,32,32,32,32,32,32,32,32,108,105,110,101,95,101,110,100,32,61,32,
109,105,110,40,108,105,110,101,95,115,116,97,114,116,32,43,32,56,48,44,32,108,
101,110,40,115,101,108,102,46,95,95,105,116,101,109,115,41,41,10,
//
10,
// return ''.join([
32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,39,39,46,106,111,105,110,
40,91,10,
// self.__items[line_start:line_end],
32,32,32,32,32,32,32,32,32,32,32,32,115,101,108,102,46,95,95,105,116,101,109,
115,91,108,105,110,101,95,115,116,97,114,116,58,108,105,110,101,95,101,110,100,
93,44,10,
// '\n',
32,32,32,32,32,32,32,32,32,32,32,32,39,92,110,39,44,10,
// ' ' * (self.__pos - line_start),
32,32,32,32,32,32,32,32,32,32,32,32,39,32,39,32,42,32,40,115,101,108,102,46,
95,95,112,111,115,32,45,32,108,105,110,101,95,115,116,97,114,116,41,44,10,
// '^',
32,32,32,32,32,32,32,32,32,32,32,32,39,94,39,44,10,
// ' ' * (line_end - self.__pos),
32,32,32,32,32,32,32,32,32,32,32,32,39,32,39,32,42,32,40,108,105,110,101,95,
101,110,100,32,45,32,115,101,108,102,46,95,95,112,111,115,41,44,10,
// '\nerror at character ',
32,32,32,32,32,32,32,32,32,32,32,32,39,92,110,101,114,114,111,114,32,97,116,
32,99,104,97,114,97,99,116,101,114,32,39,44,10,
// str(self.__pos),
32,32,32,32,32,32,32,32,32,32,32,32,115,116,114,40,115,101,108,102,46,95,95,
112,111,115,41,44,10,
// ])
32,32,32,32,32,32,32,32,93,41,10,
//
10,
// class State(object):
99,108,97,115,115,32,83,116,97,116,101,40,111,98,106,101,99,116,41,58,10,
// def __init__(self, stream, payload = None, success = True):
32,32,32,32,100,101,102,32,95,95,105,110,105,116,95,95,40,115,101,108,102,44,
32,115,116,114,101,97,109,44,32,112,97,121,108,111,97,100,32,61,32,78,111,110,
101,44,32,115,117,99,99,101,115,115,32,61,32,84,114,117,101,41,58,10,
// self.stream = stream
32,32,32,32,32,32,32,32,115,101,108,102,46,115,116,114,101,97,109,32,61,32,115,
116,114,101,97,109,10,
// self.payload = payload
32,32,32,32,32,32,32,32,115,101,108,102,46,112,97,121,108,111,97,100,32,61,32,
112,97,121,108,111,97,100,10,
// self.success = success
32,32,32,32,32,32,32,32,115,101,108,102,46,115,117,99,99,101,115,115,32,61,32,
115,117,99,99,101,115,115,10,
//
10,
// def __bool__(self):
32,32,32,32,100,101,102,32,95,95,98,111,111,108,95,95,40,115,101,108,102,41,
58,10,
// return self.success
32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,115,101,108,102,46,115,117,
99,99,101,115,115,10,
//
10,
// def __nonzero__(self):
32,32,32,32,100,101,102,32,95,95,110,111,110,122,101,114,111,95,95,40,115,101,
108,102,41,58,10,
// return self.__bool__()
32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,115,101,108,102,46,95,95,
98,111,111,108,95,95,40,41,10,
//
10,
// def fmap(self, f):
32,32,32,32,100,101,102,32,102,109,97,112,40,115,101,108,102,44,32,102,41,58,
10,
// if self:
32,32,32,32,32,32,32,32,105,102,32,115,101,108,102,58,10,
// return State(self.stream, f(self.payload))
32,32,32,32,32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,83,116,97,116,
101,40,115,101,108,102,46,115,116,114,101,97,109,44,32,102,40,115,101,108,102,
46,112,97,121,108,111,97,100,41,41,10,
// return self
32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,115,101,108,102,10,
//
10,
// class ParsingError(Exception):
99,108,97,115,115,32,80,97,114,115,105,110,103,69,114,114,111,114,40,69,120,
99,101,112,116,105,111,110,41,58,10,
// def __init__(self, stream, msg = ''):
32,32,32,32,100,101,102,32,95,95,105,110,105,116,95,95,40,115,101,108,102,44,
32,115,116,114,101,97,109,44,32,109,115,103,32,61,32,39,39,41,58,10,
// super(ParsingError, self).__init__(msg)
32,32,32,32,32,32,32,32,115,117,112,101,114,40,80,97,114,115,105,110,103,69,
114,114,111,114,44,32,115,101,108,102,41,46,95,95,105,110,105,116,95,95,40,109,
115,103,41,10,
// self.stream = stream
32,32,32,32,32,32,32,32,115,101,108,102,46,115,116,114,101,97,109,32,61,32,115,
116,114,101,97,109,10,
//
10,
// def __repr__(self):
32,32,32,32,100,101,102,32,95,95,114,101,112,114,95,95,40,115,101,108,102,41,
58,10,
// return repr(self.stream)
32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,114,101,112,114,40,115,101,
108,102,46,115,116,114,101,97,109,41,10,
//
10,
// class Parser(object):
99,108,97,115,115,32,80,97,114,115,101,114,40,111,98,106,101,99,116,41,58,10,
// def __init__(self):
32,32,32,32,100,101,102,32,95,95,105,110,105,116,95,95,40,115,101,108,102,41,
58,10,
// pass
32,32,32,32,32,32,32,32,112,97,115,115,10,
//
10,
// def __call__(self, stream):
32,32,32,32,100,101,102,32,95,95,99,97,108,108,95,95,40,115,101,108,102,44,32,
115,116,114,101,97,109,41,58,10,
// raise NotImplementedError("pure abstract parser cannot be called")
32,32,32,32,32,32,32,32,114,97,105,115,101,32,78,111,116,73,109,112,108,101,
109,101,110,116,101,100,69,114,114,111,114,40,34,112,117,114,101,32,97,98,115,
116,114,97,99,116,32,112,97,114,115,101,114,32,99,97,110,110,111,116,32,98,101,
32,99,97,108,108,101,100,34,41,10,
//
10,
// def parse_from(self, stream):
32,32,32,32,100,101,102,32,112,97,114,115,101,95,102,114,111,109,40,115,101,
108,102,44,32,115,116,114,101,97,109,41,58,10,
// n_state = self(stream)
32,32,32,32,32,32,32,32,110,95,115,116,97,116,101,32,61,32,115,101,108,102,40,
115,116,114,101,97,109,41,10,
// if not n_state:
32,32,32,32,32,32,32,32,105,102,32,110,111,116,32,110,95,115,116,97,116,101,
58,10,
// raise ParsingError(n_state.stream, n_state.payload)
32,32,32,32,32,32,32,32,32,32,32,32,114,97,105,115,101,32,80,97,114,115,105,
110,103,69,114,114,111,114,40,110,95,115,116,97,116,101,46,115,116,114,101,97,
109,44,32,110,95,115,116,97,116,101,46,112,97,121,108,111,97,100,41,10,
// elif not n_state.stream.end():
32,32,32,32,32,32,32,32,101,108,105,102,32,110,111,116,32,110,95,115,116,97,
116,101,46,115,116,114,101,97,109,46,101,110,100,40,41,58,10,
// raise ParsingError(n_state.stream, 'trailing unparsable input')
32,32,32,32,32,32,32,32,32,32,32,32,114,97,105,115,101,32,80,97,114,115,105,
110,103,69,114,114,111,114,40,110,95,115,116,97,116,101,46,115,116,114,101,97,
109,44,32,39,116,114,97,105,108,105,110,103,32,117,110,112,97,114,115,97,98,
108,101,32,105,110,112,117,116,39,41,10,
// return n_state
32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,110,95,115,116,97,116,101,
10,
//
10,
// def fail(self, exception):
32,32,32,32,100,101,102,32,102,97,105,108,40,115,101,108,102,44,32,101,120,99,
101,112,116,105,111,110,41,58,10,
// return State(exception.stream, str(exception), False)
32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,83,116,97,116,101,40,101,
120,99,101,112,116,105,111,110,46,115,116,114,101,97,109,44,32,115,116,114,40,
101,120,99,101,112,116,105,111,110,41,44,32,70,97,108,115,101,41,10,
//
10,
// def ignore(self):
32,32,32,32,100,101,102,32,105,103,110,111,114,101,40,115,101,108,102,41,58,
10,
// return Ignore(self)
32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,73,103,110,111,114,101,40,
115,101,108,102,41,10,
//
10,
// def __or__(self, p):
32,32,32,32,100,101,102,32,95,95,111,114,95,95,40,115,101,108,102,44,32,112,
41,58,10,
// return Or(self, p)
32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,79,114,40,115,101,108,102,
44,32,112,41,10,
//
10,
// def __add__(self, p):
32,32,32,32,100,101,102,32,95,95,97,100,100,95,95,40,115,101,108,102,44,32,112,
41,58,10,
// if isinstance(self, Ignore) and isinstance(p, Ignore):
32,32,32,32,32,32,32,32,105,102,32,105,115,105,110,115,116,97,110,99,101,40,
115,101,108,102,44,32,73,103,110,111,114,101,41,32,97,110,100,32,105,115,105,
110,115,116,97,110,99,101,40,112,44,32,73,103,110,111,114,101,41,58,10,
// return Ignore(Concat(self, p))
32,32,32,32,32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,73,103,110,111,
114,101,40,67,111,110,99,97,116,40,115,101,108,102,44,32,112,41,41,10,
// else:
32,32,32,32,32,32,32,32,101,108,115,101,58,10,
// return Concat(self, p)
32,32,32,32,32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,67,111,110,99,
97,116,40,115,101,108,102,44,32,112,41,10,
//
10,
// def __invert__(self):
32,32,32,32,100,101,102,32,95,95,105,110,118,101,114,116,95,95,40,115,101,108,
102,41,58,10,
// return Rep(self)
32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,82,101,112,40,115,101,108,
102,41,10,
//
10,
// def __neg__(self):
32,32,32,32,100,101,102,32,95,95,110,101,103,95,95,40,115,101,108,102,41,58,
10,
// return Optional(self)
32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,79,112,116,105,111,110,97,
108,40,115,101,108,102,41,10,
//
10,
// def __pow__(self, f):
32,32,32,32,100,101,102,32,95,95,112,111,119,95,95,40,115,101,108,102,44,32,
102,41,58,10,
// return Apply(self, f)
32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,65,112,112,108,121,40,115,
101,108,102,44,32,102,41,10,
//
10,
// class Optional(Parser):
99,108,97,115,115,32,79,112,116,105,111,110,97,108,40,80,97,114,115,101,114,
41,58,10,
// def __init__(self, opt):
32,32,32,32,100,101,102,32,95,95,105,110,105,116,95,95,40,115,101,108,102,44,
32,111,112,116,41,58,10,
// super(Optional, self).__init__()
32,32,32,32,32,32,32,32,115,117,112,101,114,40,79,112,116,105,111,110,97,108,
44,32,115,101,108,102,41,46,95,95,105,110,105,116,95,95,40,41,10,
// self.__opt = opt
32,32,32,32,32,32,32,32,115,101,108,102,46,95,95,111,112,116,32,61,32,111,112,
116,10,
//
10,
// def __call__(self, stream):
32,32,32,32,100,101,102,32,95,95,99,97,108,108,95,95,40,115,101,108,102,44,32,
115,116,114,101,97,109,41,58,10,
// n_state = self.__opt(stream)
32,32,32,32,32,32,32,32,110,95,115,116,97,116,101,32,61,32,115,101,108,102,46,
95,95,111,112,116,40,115,116,114,101,97,109,41,10,
// if n_state:
32,32,32,32,32,32,32,32,105,102,32,110,95,115,116,97,116,101,58,10,
// return n_state.fmap(lambda x: Left(x))
32,32,32,32,32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,110,95,115,116,
97,116,101,46,102,109,97,112,40,108,97,109,98,100,97,32,120,58,32,76,101,102,
116,40,120,41,41,10,
// return State(stream, Right(None))
32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,83,116,97,116,101,40,115,
116,114,101,97,109,44,32,82,105,103,104,116,40,78,111,110,101,41,41,10,
//
10,
// class StrLiteral(Parser):
99,108,97,115,115,32,83,116,114,76,105,116,101,114,97,108,40,80,97,114,115,101,
114,41,58,10,
// def __init__(self, string):
32,32,32,32,100,101,102,32,95,95,105,110,105,116,95,95,40,115,101,108,102,44,
32,115,116,114,105,110,103,41,58,10,
// super(StrLiteral, self).__init__()
32,32,32,32,32,32,32,32,115,117,112,101,114,40,83,116,114,76,105,116,101,114,
97,108,44,32,115,101,108,102,41,46,95,95,105,110,105,116,95,95,40,41,10,
// self.__string = string
32,32,32,32,32,32,32,32,115,101,108,102,46,95,95,115,116,114,105,110,103,32,
61,32,115,116,114,105,110,103,10,
//
10,
// def __call__(self, stream):
32,32,32,32,100,101,102,32,95,95,99,97,108,108,95,95,40,115,101,108,102,44,32,
115,116,114,101,97,109,41,58,10,
// if stream.end():
32,32,32,32,32,32,32,32,105,102,32,115,116,114,101,97,109,46,101,110,100,40,
41,58,10,
// return self.fail(ParsingError(
32,32,32,32,32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,115,101,108,102,
46,102,97,105,108,40,80,97,114,115,105,110,103,69,114,114,111,114,40,10,
// stream, 'insufficient input, expecting {}'.format(self.__string))
32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,115,116,114,101,97,109,44,32,
39,105,110,115,117,102,102,105,99,105,101,110,116,32,105,110,112,117,116,44,
32,101,120,112,101,99,116,105,110,103,32,123,125,39,46,102,111,114,109,97,116,
40,115,101,108,102,46,95,95,115,116,114,105,110,103,41,41,10,
// )
32,32,32,32,32,32,32,32,32,32,32,32,41,10,
// try:
32,32,32,32,32,32,32,32,116,114,121,58,10,
// n_stream = stream.accept_strlit(self.__string)
32,32,32,32,32,32,32,32,32,32,32,32,110,95,115,116,114,101,97,109,32,61,32,115,
116,114,101,97,109,46,97,99,99,101,112,116,95,115,116,114,108,105,116,40,115,
101,108,102,46,95,95,115,116,114,105,110,103,41,10,
// except ParsingError as e:
32,32,32,32,32,32,32,32,101,120,99,101,112,116,32,80,97,114,115,105,110,103,
69,114,114,111,114,32,97,115,32,101,58,10,
// return self.fail(e)
32,32,32,32,32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,115,101,108,102,
46,102,97,105,108,40,101,41,10,
//
10,
// return State(n_stream, self.__string)
32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,83,116,97,116,101,40,110,
95,115,116,114,101,97,109,44,32,115,101,108,102,46,95,95,115,116,114,105,110,
103,41,10,
//
10,
// class CustomMatcher(Parser):
99,108,97,115,115,32,67,117,115,116,111,109,77,97,116,99,104,101,114,40,80,97,
114,115,101,114,41,58,10,
// def __init__(self, matcher):
32,32,32,32,100,101,102,32,95,95,105,110,105,116,95,95,40,115,101,108,102,44,
32,109,97,116,99,104,101,114,41,58,10,
// super(CustomMatcher, self).__init__()
32,32,32,32,32,32,32,32,115,117,112,101,114,40,67,117,115,116,111,109,77,97,
116,99,104,101,114,44,32,115,101,108,102,41,46,95,95,105,110,105,116,95,95,40,
41,10,
// self.__matcher = matcher
32,32,32,32,32,32,32,32,115,101,108,102,46,95,95,109,97,116,99,104,101,114,32,
61,32,109,97,116,99,104,101,114,10,
//
10,
// def __call__(self, stream):
32,32,32,32,100,101,102,32,95,95,99,97,108,108,95,95,40,115,101,108,102,44,32,
115,116,114,101,97,109,41,58,10,
// try:
32,32,32,32,32,32,32,32,116,114,121,58,10,
// res = stream.accept_matcher(self.__matcher)
32,32,32,32,32,32,32,32,32,32,32,32,114,101,115,32,61,32,115,116,114,101,97,
109,46,97,99,99,101,112,116,95,109,97,116,99,104,101,114,40,115,101,108,102,
46,95,95,109,97,116,99,104,101,114,41,10,
// except ParsingError as e:
32,32,32,32,32,32,32,32,101,120,99,101,112,116,32,80,97,114,115,105,110,103,
69,114,114,111,114,32,97,115,32,101,58,10,
// return self.fail(e)
32,32,32,32,32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,115,101,108,102,
46,102,97,105,108,40,101,41,10,
//
10,
// obj, n_stream = res
32,32,32,32,32,32,32,32,111,98,106,44,32,110,95,115,116,114,101,97,109,32,61,
32,114,101,115,10,
// return State(n_stream, obj)
32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,83,116,97,116,101,40,110,
95,115,116,114,101,97,109,44,32,111,98,106,41,10,
//
10,
// class Concat(Parser):
99,108,97,115,115,32,67,111,110,99,97,116,40,80,97,114,115,101,114,41,58,10,
// def __init__(self, c1, c2):
32,32,32,32,100,101,102,32,95,95,105,110,105,116,95,95,40,115,101,108,102,44,
32,99,49,44,32,99,50,41,58,10,
// super(Concat, self).__init__()
32,32,32,32,32,32,32,32,115,117,112,101,114,40,67,111,110,99,97,116,44,32,115,
101,108,102,41,46,95,95,105,110,105,116,95,95,40,41,10,
// assert not isinstance(self, Ignore) or not isinstance(p, Ignore)
32,32,32,32,32,32,32,32,97,115,115,101,114,116,32,110,111,116,32,105,115,105,
110,115,116,97,110,99,101,40,115,101,108,102,44,32,73,103,110,111,114,101,41,
32,111,114,32,110,111,116,32,105,115,105,110,115,116,97,110,99,101,40,112,44,
32,73,103,110,111,114,101,41,10,
// self.__first = c1
32,32,32,32,32,32,32,32,115,101,108,102,46,95,95,102,105,114,115,116,32,61,32,
99,49,10,
// self.__second = c2
32,32,32,32,32,32,32,32,115,101,108,102,46,95,95,115,101,99,111,110,100,32,61,
32,99,50,10,
//
10,
// def __call__(self, stream):
32,32,32,32,100,101,102,32,95,95,99,97,108,108,95,95,40,115,101,108,102,44,32,
115,116,114,101,97,109,41,58,10,
// n_state = self.__first(stream)
32,32,32,32,32,32,32,32,110,95,115,116,97,116,101,32,61,32,115,101,108,102,46,
95,95,102,105,114,115,116,40,115,116,114,101,97,109,41,10,
// if not n_state:
32,32,32,32,32,32,32,32,105,102,32,110,111,116,32,110,95,115,116,97,116,101,
58,10,
// return n_state
32,32,32,32,32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,110,95,115,116,
97,116,101,10,
// p1 = n_state.payload
32,32,32,32,32,32,32,32,112,49,32,61,32,110,95,115,116,97,116,101,46,112,97,
121,108,111,97,100,10,
// n_state = self.__second(n_state.stream)
32,32,32,32,32,32,32,32,110,95,115,116,97,116,101,32,61,32,115,101,108,102,46,
95,95,115,101,99,111,110,100,40,110,95,115,116,97,116,101,46,115,116,114,101,
97,109,41,10,
// if not n_state:
32,32,32,32,32,32,32,32,105,102,32,110,111,116,32,110,95,115,116,97,116,101,
58,10,
// return n_state
32,32,32,32,32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,110,95,115,116,
97,116,101,10,
// p2 = n_state.payload
32,32,32,32,32,32,32,32,112,50,32,61,32,110,95,115,116,97,116,101,46,112,97,
121,108,111,97,100,10,
//
10,
// if isinstance(self.__first, Ignore):
32,32,32,32,32,32,32,32,105,102,32,105,115,105,110,115,116,97,110,99,101,40,
115,101,108,102,46,95,95,102,105,114,115,116,44,32,73,103,110,111,114,101,41,
58,10,
// return State(n_state.stream, p2)
32,32,32,32,32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,83,116,97,116,
101,40,110,95,115,116,97,116,101,46,115,116,114,101,97,109,44,32,112,50,41,10,
// if isinstance(self.__second, Ignore):
32,32,32,32,32,32,32,32,105,102,32,105,115,105,110,115,116,97,110,99,101,40,
115,101,108,102,46,95,95,115,101,99,111,110,100,44,32,73,103,110,111,114,101,
41,58,10,
// return State(n_state.stream, p1)
32,32,32,32,32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,83,116,97,116,
101,40,110,95,115,116,97,116,101,46,115,116,114,101,97,109,44,32,112,49,41,10,
// # The construction of Concat ensures that at least
32,32,32,32,32,32,32,32,35,32,84,104,101,32,99,111,110,115,116,114,117,99,116,
105,111,110,32,111,102,32,67,111,110,99,97,116,32,101,110,115,117,114,101,115,
32,116,104,97,116,32,97,116,32,108,101,97,115,116,10,
// # one of this children is not Ignore
32,32,32,32,32,32,32,32,35,32,111,110,101,32,111,102,32,116,104,105,115,32,99,
104,105,108,100,114,101,110,32,105,115,32,110,111,116,32,73,103,110,111,114,
101,10,
// return State(n_state.stream, Pair(p1, p2))
32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,83,116,97,116,101,40,110,
95,115,116,97,116,101,46,115,116,114,101,97,109,44,32,80,97,105,114,40,112,49,
44,32,112,50,41,41,10,
//
10,
// class Or(Parser):
99,108,97,115,115,32,79,114,40,80,97,114,115,101,114,41,58,10,
// def __init__(self, c1, c2):
32,32,32,32,100,101,102,32,95,95,105,110,105,116,95,95,40,115,101,108,102,44,
32,99,49,44,32,99,50,41,58,10,
// super(Or, self).__init__()
32,32,32,32,32,32,32,32,115,117,112,101,114,40,79,114,44,32,115,101,108,102,
41,46,95,95,105,110,105,116,95,95,40,41,10,
// self.__if = c1
32,32,32,32,32,32,32,32,115,101,108,102,46,95,95,105,102,32,61,32,99,49,10,
// self.__else = c2
32,32,32,32,32,32,32,32,115,101,108,102,46,95,95,101,108,115,101,32,61,32,99,
50,10,
//
10,
// def __call__(self, stream):
32,32,32,32,100,101,102,32,95,95,99,97,108,108,95,95,40,115,101,108,102,44,32,
115,116,114,101,97,109,41,58,10,
// n_state = self.__if(stream)
32,32,32,32,32,32,32,32,110,95,115,116,97,116,101,32,61,32,115,101,108,102,46,
95,95,105,102,40,115,116,114,101,97,109,41,10,
// if n_state:
32,32,32,32,32,32,32,32,105,102,32,110,95,115,116,97,116,101,58,10,
// return n_state.fmap(lambda x: Left(x))
32,32,32,32,32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,110,95,115,116,
97,116,101,46,102,109,97,112,40,108,97,109,98,100,97,32,120,58,32,76,101,102,
116,40,120,41,41,10,
// n_state = self.__else(stream)
32,32,32,32,32,32,32,32,110,95,115,116,97,116,101,32,61,32,115,101,108,102,46,
95,95,101,108,115,101,40,115,116,114,101,97,109,41,10,
// if n_state:
32,32,32,32,32,32,32,32,105,102,32,110,95,115,116,97,116,101,58,10,
// return n_state.fmap(lambda x: Right(x))
32,32,32,32,32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,110,95,115,116,
97,116,101,46,102,109,97,112,40,108,97,109,98,100,97,32,120,58,32,82,105,103,
104,116,40,120,41,41,10,
// return n_state
32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,110,95,115,116,97,116,101,
10,
//
10,
// class Rep(Parser):
99,108,97,115,115,32,82,101,112,40,80,97,114,115,101,114,41,58,10,
// def __init__(self, c):
32,32,32,32,100,101,102,32,95,95,105,110,105,116,95,95,40,115,101,108,102,44,
32,99,41,58,10,
// super(Rep, self).__init__()
32,32,32,32,32,32,32,32,115,117,112,101,114,40,82,101,112,44,32,115,101,108,
102,41,46,95,95,105,110,105,116,95,95,40,41,10,
// self.__loop = c
32,32,32,32,32,32,32,32,115,101,108,102,46,95,95,108,111,111,112,32,61,32,99,
10,
//
10,
// def __call__(self, stream):
32,32,32,32,100,101,102,32,95,95,99,97,108,108,95,95,40,115,101,108,102,44,32,
115,116,114,101,97,109,41,58,10,
// payload = []
32,32,32,32,32,32,32,32,112,97,121,108,111,97,100,32,61,32,91,93,10,
//
10,
// n_state = self.__loop(stream)
32,32,32,32,32,32,32,32,110,95,115,116,97,116,101,32,61,32,115,101,108,102,46,
95,95,108,111,111,112,40,115,116,114,101,97,109,41,10,
// if n_state:
32,32,32,32,32,32,32,32,105,102,32,110,95,115,116,97,116,101,58,10,
// payload.append(n_state.payload)
32,32,32,32,32,32,32,32,32,32,32,32,112,97,121,108,111,97,100,46,97,112,112,
101,110,100,40,110,95,115,116,97,116,101,46,112,97,121,108,111,97,100,41,10,
// stream = n_state.stream
32,32,32,32,32,32,32,32,32,32,32,32,115,116,114,101,97,109,32,61,32,110,95,115,
116,97,116,101,46,115,116,114,101,97,109,10,
// n_state = self(stream)
32,32,32,32,32,32,32,32,32,32,32,32,110,95,115,116,97,116,101,32,61,32,115,101,
108,102,40,115,116,114,101,97,109,41,10,
// if n_state:
32,32,32,32,32,32,32,32,32,32,32,32,105,102,32,110,95,115,116,97,116,101,58,
10,
// payload = payload + n_state.payload
32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,112,97,121,108,111,97,100,32,
61,32,112,97,121,108,111,97,100,32,43,32,110,95,115,116,97,116,101,46,112,97,
121,108,111,97,100,10,
// stream = n_state.stream
32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,115,116,114,101,97,109,32,61,
32,110,95,115,116,97,116,101,46,115,116,114,101,97,109,10,
// return State(stream, payload)
32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,83,116,97,116,101,40,115,
116,114,101,97,109,44,32,112,97,121,108,111,97,100,41,10,
//
10,
// class Apply(Parser):
99,108,97,115,115,32,65,112,112,108,121,40,80,97,114,115,101,114,41,58,10,
// def __init__(self, base, f):
32,32,32,32,100,101,102,32,95,95,105,110,105,116,95,95,40,115,101,108,102,44,
32,98,97,115,101,44,32,102,41,58,10,
// super(Apply, self).__init__()
32,32,32,32,32,32,32,32,115,117,112,101,114,40,65,112,112,108,121,44,32,115,
101,108,102,41,46,95,95,105,110,105,116,95,95,40,41,10,
// self.__base = base
32,32,32,32,32,32,32,32,115,101,108,102,46,95,95,98,97,115,101,32,61,32,98,97,
115,101,10,
// self.__trans = f
32,32,32,32,32,32,32,32,115,101,108,102,46,95,95,116,114,97,110,115,32,61,32,
102,10,
//
10,
// def __call__(self, stream):
32,32,32,32,100,101,102,32,95,95,99,97,108,108,95,95,40,115,101,108,102,44,32,
115,116,114,101,97,109,41,58,10,
// return self.__base(stream).fmap(self.__trans)
32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,115,101,108,102,46,95,95,
98,97,115,101,40,115,116,114,101,97,109,41,46,102,109,97,112,40,115,101,108,
102,46,95,95,116,114,97,110,115,41,10,
//
10,
// class Ignore(Parser):
99,108,97,115,115,32,73,103,110,111,114,101,40,80,97,114,115,101,114,41,58,10,
// def __init__(self, base):
32,32,32,32,100,101,102,32,95,95,105,110,105,116,95,95,40,115,101,108,102,44,
32,98,97,115,101,41,58,10,
// super(Ignore, self).__init__()
32,32,32,32,32,32,32,32,115,117,112,101,114,40,73,103,110,111,114,101,44,32,
115,101,108,102,41,46,95,95,105,110,105,116,95,95,40,41,10,
// self.__base = base
32,32,32,32,32,32,32,32,115,101,108,102,46,95,95,98,97,115,101,32,61,32,98,97,
115,101,10,
//
10,
// def __call__(self, stream):
32,32,32,32,100,101,102,32,95,95,99,97,108,108,95,95,40,115,101,108,102,44,32,
115,116,114,101,97,109,41,58,10,
// return self.__base(stream)
32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,115,101,108,102,46,95,95,
98,97,115,101,40,115,116,114,101,97,109,41,10,
//
10,
// ###############################################################################
35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,
35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,
35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,
35,10,
// # Grammars for PERM model configuration
35,32,71,114,97,109,109,97,114,115,32,102,111,114,32,80,69,82,77,32,109,111,
100,101,108,32,99,111,110,102,105,103,117,114,97,116,105,111,110,32,10,
// ###############################################################################
35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,
35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,
35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,
35,10,
// from operator import or_, add
102,114,111,109,32,111,112,101,114,97,116,111,114,32,105,109,112,111,114,116,
32,111,114,95,44,32,97,100,100,10,
//
10,
// def extract(nested_or):
100,101,102,32,101,120,116,114,97,99,116,40,110,101,115,116,101,100,95,111,114,
41,58,10,
// while isinstance(nested_or, Either):
32,32,32,32,119,104,105,108,101,32,105,115,105,110,115,116,97,110,99,101,40,
110,101,115,116,101,100,95,111,114,44,32,69,105,116,104,101,114,41,58,10,
// nested_or = nested_or.left() if nested_or.is_left() else nested_or.right()
32,32,32,32,32,32,32,32,110,101,115,116,101,100,95,111,114,32,61,32,110,101,
115,116,101,100,95,111,114,46,108,101,102,116,40,41,32,105,102,32,110,101,115,
116,101,100,95,111,114,46,105,115,95,108,101,102,116,40,41,32,101,108,115,101,
32,110,101,115,116,101,100,95,111,114,46,114,105,103,104,116,40,41,10,
// return nested_or
32,32,32,32,114,101,116,117,114,110,32,110,101,115,116,101,100,95,111,114,10,
//
10,
// def flatten(nested_concat):
100,101,102,32,102,108,97,116,116,101,110,40,110,101,115,116,101,100,95,99,111,
110,99,97,116,41,58,10,
// res = []
32,32,32,32,114,101,115,32,61,32,91,93,10,
//
10,
// def pre_order(pair, res):
32,32,32,32,100,101,102,32,112,114,101,95,111,114,100,101,114,40,112,97,105,
114,44,32,114,101,115,41,58,10,
// if isinstance(pair, Pair):
32,32,32,32,32,32,32,32,105,102,32,105,115,105,110,115,116,97,110,99,101,40,
112,97,105,114,44,32,80,97,105,114,41,58,10,
// pre_order(pair[0], res)
32,32,32,32,32,32,32,32,32,32,32,32,112,114,101,95,111,114,100,101,114,40,112,
97,105,114,91,48,93,44,32,114,101,115,41,10,
// pre_order(pair[1], res)
32,32,32,32,32,32,32,32,32,32,32,32,112,114,101,95,111,114,100,101,114,40,112,
97,105,114,91,49,93,44,32,114,101,115,41,10,
// else:
32,32,32,32,32,32,32,32,101,108,115,101,58,10,
// res.append(pair)
32,32,32,32,32,32,32,32,32,32,32,32,114,101,115,46,97,112,112,101,110,100,40,
112,97,105,114,41,10,
//
10,
// pre_order(nested_concat, res)
32,32,32,32,112,114,101,95,111,114,100,101,114,40,110,101,115,116,101,100,95,
99,111,110,99,97,116,44,32,114,101,115,41,10,
// return res
32,32,32,32,114,101,116,117,114,110,32,114,101,115,10,
//
10,
// def one_of(parsers):
100,101,102,32,111,110,101,95,111,102,40,112,97,114,115,101,114,115,41,58,10,
// nested = reduce(or_, parsers)
32,32,32,32,110,101,115,116,101,100,32,61,32,114,101,100,117,99,101,40,111,114,
95,44,32,112,97,114,115,101,114,115,41,10,
// return nested ** extract
32,32,32,32,114,101,116,117,114,110,32,110,101,115,116,101,100,32,42,42,32,101,
120,116,114,97,99,116,10,
//
10,
// def join(sl):
100,101,102,32,106,111,105,110,40,115,108,41,58,10,
// return ''.join(sl)
32,32,32,32,114,101,116,117,114,110,32,39,39,46,106,111,105,110,40,115,108,41,
10,
//
10,
// def rep_with_sep(to_rep, sep):
100,101,102,32,114,101,112,95,119,105,116,104,95,115,101,112,40,116,111,95,114,
101,112,44,32,115,101,112,41,58,10,
// if not isinstance(sep, Ignore):
32,32,32,32,105,102,32,110,111,116,32,105,115,105,110,115,116,97,110,99,101,
40,115,101,112,44,32,73,103,110,111,114,101,41,58,10,
// sep = sep.ignore()
32,32,32,32,32,32,32,32,115,101,112,32,61,32,115,101,112,46,105,103,110,111,
114,101,40,41,10,
// r = to_rep + ~(sep + to_rep)
32,32,32,32,114,32,61,32,116,111,95,114,101,112,32,43,32,126,40,115,101,112,
32,43,32,116,111,95,114,101,112,41,10,
// r = r ** (lambda x: [x[0]] + x[1])
32,32,32,32,114,32,61,32,114,32,42,42,32,40,108,97,109,98,100,97,32,120,58,32,
91,120,91,48,93,93,32,43,32,120,91,49,93,41,10,
// return r
32,32,32,32,114,101,116,117,114,110,32,114,10,
//
10,
// ALPHA = set('abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ')
65,76,80,72,65,32,61,32,115,101,116,40,39,97,98,99,100,101,102,103,104,105,106,
107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,65,66,67,68,
69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,39,41,10,
// DIGIT = set('0123456789')
68,73,71,73,84,32,61,32,115,101,116,40,39,48,49,50,51,52,53,54,55,56,57,39,41,
10,
// ALPHA_DIGIT = ALPHA | DIGIT
65,76,80,72,65,95,68,73,71,73,84,32,61,32,65,76,80,72,65,32,124,32,68,73,71,
73,84,10,
//
10,
// Alpha = one_of(map(StrLiteral, ALPHA))
65,108,112,104,97,32,61,32,111,110,101,95,111,102,40,109,97,112,40,83,116,114,
76,105,116,101,114,97,108,44,32,65,76,80,72,65,41,41,10,
// Digit = one_of(map(StrLiteral, DIGIT))
68,105,103,105,116,32,61,32,111,110,101,95,111,102,40,109,97,112,40,83,116,114,
76,105,116,101,114,97,108,44,32,68,73,71,73,84,41,41,10,
//
10,
// Equal, Comma, Dot = [StrLiteral(c).ignore() for c in ['=', ',', '.']]
69,113,117,97,108,44,32,67,111,109,109,97,44,32,68,111,116,32,61,32,91,83,116,
114,76,105,116,101,114,97,108,40,99,41,46,105,103,110,111,114,101,40,41,32,102,
111,114,32,99,32,105,110,32,91,39,61,39,44,32,39,44,39,44,32,39,46,39,93,93,
10,
// Underscore = StrLiteral('_')
85,110,100,101,114,115,99,111,114,101,32,61,32,83,116,114,76,105,116,101,114,
97,108,40,39,95,39,41,10,
// NewLine = (~ StrLiteral('\n')).ignore()
78,101,119,76,105,110,101,32,61,32,40,126,32,83,116,114,76,105,116,101,114,97,
108,40,39,92,110,39,41,41,46,105,103,110,111,114,101,40,41,10,
//
10,
// def identifier_matcher(text, pos):
100,101,102,32,105,100,101,110,116,105,102,105,101,114,95,109,97,116,99,104,
101,114,40,116,101,120,116,44,32,112,111,115,41,58,10,
// """identifier"""
32,32,32,32,34,34,34,105,100,101,110,116,105,102,105,101,114,34,34,34,10,
// end = len(text)
32,32,32,32,101,110,100,32,61,32,108,101,110,40,116,101,120,116,41,10,
// start = pos
32,32,32,32,115,116,97,114,116,32,61,32,112,111,115,10,
// if pos >= end:
32,32,32,32,105,102,32,112,111,115,32,62,61,32,101,110,100,58,10,
// return None
32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,78,111,110,101,10,
// first = text[pos]
32,32,32,32,102,105,114,115,116,32,61,32,116,101,120,116,91,112,111,115,93,10,
// if first != '_' and first not in ALPHA:
32,32,32,32,105,102,32,102,105,114,115,116,32,33,61,32,39,95,39,32,97,110,100,
32,102,105,114,115,116,32,110,111,116,32,105,110,32,65,76,80,72,65,58,10,
// return None
32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,78,111,110,101,10,
// pos += 1
32,32,32,32,112,111,115,32,43,61,32,49,10,
// while pos < end:
32,32,32,32,119,104,105,108,101,32,112,111,115,32,60,32,101,110,100,58,10,
// char = text[pos]
32,32,32,32,32,32,32,32,99,104,97,114,32,61,32,116,101,120,116,91,112,111,115,
93,10,
// if char == '_' or char in ALPHA_DIGIT:
32,32,32,32,32,32,32,32,105,102,32,99,104,97,114,32,61,61,32,39,95,39,32,111,
114,32,99,104,97,114,32,105,110,32,65,76,80,72,65,95,68,73,71,73,84,58,10,
// pos += 1
32,32,32,32,32,32,32,32,32,32,32,32,112,111,115,32,43,61,32,49,10,
// else:
32,32,32,32,32,32,32,32,101,108,115,101,58,10,
// break
32,32,32,32,32,32,32,32,32,32,32,32,98,114,101,97,107,10,
// return text[start:pos], pos
32,32,32,32,114,101,116,117,114,110,32,116,101,120,116,91,115,116,97,114,116,
58,112,111,115,93,44,32,112,111,115,10,
//
10,
// Identifier = CustomMatcher(identifier_matcher)
73,100,101,110,116,105,102,105,101,114,32,61,32,67,117,115,116,111,109,77,97,
116,99,104,101,114,40,105,100,101,110,116,105,102,105,101,114,95,109,97,116,
99,104,101,114,41,10,
//
10,
// IdTuple = rep_with_sep(Identifier, Comma)
73,100,84,117,112,108,101,32,61,32,114,101,112,95,119,105,116,104,95,115,101,
112,40,73,100,101,110,116,105,102,105,101,114,44,32,67,111,109,109,97,41,10,
//
10,
// Definition = Identifier + Equal + IdTuple + NewLine
68,101,102,105,110,105,116,105,111,110,32,61,32,73,100,101,110,116,105,102,105,
101,114,32,43,32,69,113,117,97,108,32,43,32,73,100,84,117,112,108,101,32,43,
32,78,101,119,76,105,110,101,10,
//
10,
// Relation = Identifier + Equal + IdTuple + NewLine
82,101,108,97,116,105,111,110,32,61,32,73,100,101,110,116,105,102,105,101,114,
32,43,32,69,113,117,97,108,32,43,32,73,100,84,117,112,108,101,32,43,32,78,101,
119,76,105,110,101,10,
// Relation = Relation ** (lambda x: (x[0], 1 + len(x[1][1])))
82,101,108,97,116,105,111,110,32,61,32,82,101,108,97,116,105,111,110,32,42,42,
32,40,108,97,109,98,100,97,32,120,58,32,40,120,91,48,93,44,32,49,32,43,32,108,
101,110,40,120,91,49,93,91,49,93,41,41,41,10,
//
10,
// def pyparser_matcher(text, pos):
100,101,102,32,112,121,112,97,114,115,101,114,95,109,97,116,99,104,101,114,40,
116,101,120,116,44,32,112,111,115,41,58,10,
// """syntactically correct python code"""
32,32,32,32,34,34,34,115,121,110,116,97,99,116,105,99,97,108,108,121,32,99,111,
114,114,101,99,116,32,112,121,116,104,111,110,32,99,111,100,101,34,34,34,10,
// line_end = text.find('\n', pos)
32,32,32,32,108,105,110,101,95,101,110,100,32,61,32,116,101,120,116,46,102,105,
110,100,40,39,92,110,39,44,32,112,111,115,41,10,
// if line_end == -1:
32,32,32,32,105,102,32,108,105,110,101,95,101,110,100,32,61,61,32,45,49,58,10,
// return None
32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,78,111,110,101,10,
// try:
32,32,32,32,116,114,121,58,10,
// c = compile(text[pos:line_end], '__abac_model__.py', 'eval')
32,32,32,32,32,32,32,32,99,32,61,32,99,111,109,112,105,108,101,40,116,101,120,
116,91,112,111,115,58,108,105,110,101,95,101,110,100,93,44,32,39,95,95,97,98,
97,99,95,109,111,100,101,108,95,95,46,112,121,39,44,32,39,101,118,97,108,39,
41,10,
// except SyntaxError:
32,32,32,32,101,120,99,101,112,116,32,83,121,110,116,97,120,69,114,114,111,114,
58,10,
// return None
32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,78,111,110,101,10,
// return c, line_end
32,32,32,32,114,101,116,117,114,110,32,99,44,32,108,105,110,101,95,101,110,100,
10,
//
10,
// PyExpr = CustomMatcher(pyparser_matcher)
80,121,69,120,112,114,32,61,32,67,117,115,116,111,109,77,97,116,99,104,101,114,
40,112,121,112,97,114,115,101,114,95,109,97,116,99,104,101,114,41,10,
// Matcher = Identifier + Equal + PyExpr + NewLine
77,97,116,99,104,101,114,32,61,32,73,100,101,110,116,105,102,105,101,114,32,
43,32,69,113,117,97,108,32,43,32,80,121,69,120,112,114,32,43,32,78,101,119,76,
105,110,101,10,
//
10,
// RequestDefHeader = StrLiteral('[requests]') + NewLine
82,101,113,117,101,115,116,68,101,102,72,101,97,100,101,114,32,61,32,83,116,
114,76,105,116,101,114,97,108,40,39,91,114,101,113,117,101,115,116,115,93,39,
41,32,43,32,78,101,119,76,105,110,101,10,
// TermDefHeader = StrLiteral('[terms]') + NewLine
84,101,114,109,68,101,102,72,101,97,100,101,114,32,32,32,32,61,32,83,116,114,
76,105,116,101,114,97,108,40,39,91,116,101,114,109,115,93,39,41,32,43,32,78,
101,119,76,105,110,101,10,
// MatchersHeader = StrLiteral('[matchers]') + NewLine
77,97,116,99,104,101,114,115,72,101,97,100,101,114,32,32,32,61,32,83,116,114,
76,105,116,101,114,97,108,40,39,91,109,97,116,99,104,101,114,115,93,39,41,32,
43,32,78,101,119,76,105,110,101,10,
//
10,
// RequestDefSec = RequestDefHeader.ignore() + ~Definition
82,101,113,117,101,115,116,68,101,102,83,101,99,32,61,32,82,101,113,117,101,
115,116,68,101,102,72,101,97,100,101,114,46,105,103,110,111,114,101,40,41,32,
43,32,126,68,101,102,105,110,105,116,105,111,110,10,
// TermDefSec = TermDefHeader.ignore() + ~Definition
84,101,114,109,68,101,102,83,101,99,32,61,32,84,101,114,109,68,101,102,72,101,
97,100,101,114,46,105,103,110,111,114,101,40,41,32,43,32,126,68,101,102,105,
110,105,116,105,111,110,10,
// MatchersSec = MatchersHeader.ignore() + ~Matcher
77,97,116,99,104,101,114,115,83,101,99,32,61,32,77,97,116,99,104,101,114,115,
72,101,97,100,101,114,46,105,103,110,111,114,101,40,41,32,43,32,126,77,97,116,
99,104,101,114,10,
//
10,
// ModelDef = (RequestDefSec + TermDefSec + MatchersSec) ** flatten
77,111,100,101,108,68,101,102,32,61,32,40,82,101,113,117,101,115,116,68,101,
102,83,101,99,32,43,32,84,101,114,109,68,101,102,83,101,99,32,43,32,77,97,116,
99,104,101,114,115,83,101,99,41,32,42,42,32,102,108,97,116,116,101,110,10,
//
10,
// def preprocess(conf):
100,101,102,32,112,114,101,112,114,111,99,101,115,115,40,99,111,110,102,41,58,
10,
// # process escaped line breaks
32,32,32,32,35,32,112,114,111,99,101,115,115,32,101,115,99,97,112,101,100,32,
108,105,110,101,32,98,114,101,97,107,115,10,
// conf = conf.replace('\\\n', '')
32,32,32,32,99,111,110,102,32,61,32,99,111,110,102,46,114,101,112,108,97,99,
101,40,39,92,92,92,110,39,44,32,39,39,41,10,
// # remove comments
32,32,32,32,35,32,114,101,109,111,118,101,32,99,111,109,109,101,110,116,115,
32,32,32,32,10,
// conf = '\n'.join(line.partition('#')[0] for line in conf.splitlines())
32,32,32,32,99,111,110,102,32,61,32,39,92,110,39,46,106,111,105,110,40,108,105,
110,101,46,112,97,114,116,105,116,105,111,110,40,39,35,39,41,91,48,93,32,102,
111,114,32,108,105,110,101,32,105,110,32,99,111,110,102,46,115,112,108,105,116,
108,105,110,101,115,40,41,41,10,
// # remove redundant new lines
32,32,32,32,35,32,114,101,109,111,118,101,32,114,101,100,117,110,100,97,110,
116,32,110,101,119,32,108,105,110,101,115,10,
// conf = conf.strip()
32,32,32,32,99,111,110,102,32,61,32,99,111,110,102,46,115,116,114,105,112,40,
41,10,
//
10,
// return conf + '\n'
32,32,32,32,114,101,116,117,114,110,32,99,111,110,102,32,43,32,39,92,110,39,
10,
//
10,
// def parse_model(text):
100,101,102,32,112,97,114,115,101,95,109,111,100,101,108,40,116,101,120,116,
41,58,10,
// text = preprocess(text)
32,32,32,32,116,101,120,116,32,61,32,112,114,101,112,114,111,99,101,115,115,
40,116,101,120,116,41,10,
// raw_model = ModelDef.parse_from(Stream(text)).payload
32,32,32,32,114,97,119,95,109,111,100,101,108,32,61,32,77,111,100,101,108,68,
101,102,46,112,97,114,115,101,95,102,114,111,109,40,83,116,114,101,97,109,40,
116,101,120,116,41,41,46,112,97,121,108,111,97,100,10,
// return raw_model
32,32,32,32,114,101,116,117,114,110,32,114,97,119,95,109,111,100,101,108,10,
//
10,
// class InvalidModelDefinition(Exception):
99,108,97,115,115,32,73,110,118,97,108,105,100,77,111,100,101,108,68,101,102,
105,110,105,116,105,111,110,40,69,120,99,101,112,116,105,111,110,41,58,10,
// def __init__(self, msg = ''):
32,32,32,32,100,101,102,32,95,95,105,110,105,116,95,95,40,115,101,108,102,44,
32,109,115,103,32,61,32,39,39,41,58,10,
// super(InvalidModelDefinition, self).__init__(msg)
32,32,32,32,32,32,32,32,115,117,112,101,114,40,73,110,118,97,108,105,100,77,
111,100,101,108,68,101,102,105,110,105,116,105,111,110,44,32,115,101,108,102,
41,46,95,95,105,110,105,116,95,95,40,109,115,103,41,32,32,32,32,32,32,32,32,
10,
//
10,
// @staticmethod
32,32,32,32,64,115,116,97,116,105,99,109,101,116,104,111,100,10,
// def redundant_def(redefined_vars, g1, g2):
32,32,32,32,100,101,102,32,114,101,100,117,110,100,97,110,116,95,100,101,102,
40,114,101,100,101,102,105,110,101,100,95,118,97,114,115,44,32,103,49,44,32,
103,50,41,58,10,
// msg_parts = [
32,32,32,32,32,32,32,32,109,115,103,95,112,97,114,116,115,32,61,32,91,10,
// 'multiple definition(s) of identifiers(s)',
32,32,32,32,32,32,32,32,32,32,32,32,39,109,117,108,116,105,112,108,101,32,100,
101,102,105,110,105,116,105,111,110,40,115,41,32,111,102,32,105,100,101,110,
116,105,102,105,101,114,115,40,115,41,39,44,10,
// ', '.join(redfined_vars),
32,32,32,32,32,32,32,32,32,32,32,32,39,44,32,39,46,106,111,105,110,40,114,101,
100,102,105,110,101,100,95,118,97,114,115,41,44,10,
// 'found in sections',
32,32,32,32,32,32,32,32,32,32,32,32,39,102,111,117,110,100,32,105,110,32,115,
101,99,116,105,111,110,115,39,44,10,
// g1, g2
32,32,32,32,32,32,32,32,32,32,32,32,103,49,44,32,103,50,10,
// ]
32,32,32,32,32,32,32,32,93,10,
// return InvalidModelDefinition(''.join(msg_parts))
32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,73,110,118,97,108,105,100,
77,111,100,101,108,68,101,102,105,110,105,116,105,111,110,40,39,39,46,106,111,
105,110,40,109,115,103,95,112,97,114,116,115,41,41,10,
//
10,
// @staticmethod
32,32,32,32,64,115,116,97,116,105,99,109,101,116,104,111,100,10,
// def missing_matchers(missing_matchers):
32,32,32,32,100,101,102,32,109,105,115,115,105,110,103,95,109,97,116,99,104,
101,114,115,40,109,105,115,115,105,110,103,95,109,97,116,99,104,101,114,115,
41,58,10,
// msg = 'missing matcher(s) for request type(s): {}'
32,32,32,32,32,32,32,32,109,115,103,32,61,32,39,109,105,115,115,105,110,103,
32,109,97,116,99,104,101,114,40,115,41,32,102,111,114,32,114,101,113,117,101,
115,116,32,116,121,112,101,40,115,41,58,32,123,125,39,10,
// return InvalidModelDefinition(msg.format(', '.join(missing_matchers)))
32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,73,110,118,97,108,105,100,
77,111,100,101,108,68,101,102,105,110,105,116,105,111,110,40,109,115,103,46,
102,111,114,109,97,116,40,39,44,32,39,46,106,111,105,110,40,109,105,115,115,
105,110,103,95,109,97,116,99,104,101,114,115,41,41,41,10,
//
10,
// @staticmethod
32,32,32,32,64,115,116,97,116,105,99,109,101,116,104,111,100,10,
// def unknown_requests(unknown_requests):
32,32,32,32,100,101,102,32,117,110,107,110,111,119,110,95,114,101,113,117,101,
115,116,115,40,117,110,107,110,111,119,110,95,114,101,113,117,101,115,116,115,
41,58,10,
// msg = 'matcher(s) defined for unknown request type(s): {}'
32,32,32,32,32,32,32,32,109,115,103,32,61,32,39,109,97,116,99,104,101,114,40,
115,41,32,100,101,102,105,110,101,100,32,102,111,114,32,117,110,107,110,111,
119,110,32,114,101,113,117,101,115,116,32,116,121,112,101,40,115,41,58,32,123,
125,39,10,
// return InvalidModelDefinition(msg.format(', '.join(unknown_requests)))
32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,73,110,118,97,108,105,100,
77,111,100,101,108,68,101,102,105,110,105,116,105,111,110,40,109,115,103,46,
102,111,114,109,97,116,40,39,44,32,39,46,106,111,105,110,40,117,110,107,110,
111,119,110,95,114,101,113,117,101,115,116,115,41,41,41,10,
//
10,
// class Request(object):
99,108,97,115,115,32,82,101,113,117,101,115,116,40,111,98,106,101,99,116,41,
58,10,
// def __init__(self, attrs, vals):
32,32,32,32,100,101,102,32,95,95,105,110,105,116,95,95,40,115,101,108,102,44,
32,97,116,116,114,115,44,32,118,97,108,115,41,58,10,
// assert len(attrs) == len(vals)
32,32,32,32,32,32,32,32,97,115,115,101,114,116,32,108,101,110,40,97,116,116,
114,115,41,32,61,61,32,108,101,110,40,118,97,108,115,41,10,
// self.__named_attrs = attrs
32,32,32,32,32,32,32,32,115,101,108,102,46,95,95,110,97,109,101,100,95,97,116,
116,114,115,32,61,32,97,116,116,114,115,10,
// for attr, val in zip(attrs, vals):
32,32,32,32,32,32,32,32,102,111,114,32,97,116,116,114,44,32,118,97,108,32,105,
110,32,122,105,112,40,97,116,116,114,115,44,32,118,97,108,115,41,58,10,
// setattr(self, attr, val)
32,32,32,32,32,32,32,32,32,32,32,32,115,101,116,97,116,116,114,40,115,101,108,
102,44,32,97,116,116,114,44,32,118,97,108,41,10,
//
10,
// def __repr__(self):
32,32,32,32,100,101,102,32,95,95,114,101,112,114,95,95,40,115,101,108,102,41,
58,10,
// parts = ['Request {\n']
32,32,32,32,32,32,32,32,112,97,114,116,115,32,61,32,91,39,82,101,113,117,101,
115,116,32,123,92,110,39,93,10,
// for attr in self.__named_attrs:
32,32,32,32,32,32,32,32,102,111,114,32,97,116,116,114,32,105,110,32,115,101,
108,102,46,95,95,110,97,109,101,100,95,97,116,116,114,115,58,10,
// parts.append(' ')
32,32,32,32,32,32,32,32,32,32,32,32,112,97,114,116,115,46,97,112,112,101,110,
100,40,39,32,32,39,41,10,
// parts.append(attr)
32,32,32,32,32,32,32,32,32,32,32,32,112,97,114,116,115,46,97,112,112,101,110,
100,40,97,116,116,114,41,10,
// parts.append(': ')
32,32,32,32,32,32,32,32,32,32,32,32,112,97,114,116,115,46,97,112,112,101,110,
100,40,39,58,32,39,41,10,
// parts.append(repr(getattr(self, attr)))
32,32,32,32,32,32,32,32,32,32,32,32,112,97,114,116,115,46,97,112,112,101,110,
100,40,114,101,112,114,40,103,101,116,97,116,116,114,40,115,101,108,102,44,32,
97,116,116,114,41,41,41,10,
// parts.append('\n')
32,32,32,32,32,32,32,32,32,32,32,32,112,97,114,116,115,46,97,112,112,101,110,
100,40,39,92,110,39,41,10,
// parts.append('}\n')
32,32,32,32,32,32,32,32,112,97,114,116,115,46,97,112,112,101,110,100,40,39,125,
92,110,39,41,10,
// return ''.join(parts)
32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,39,39,46,106,111,105,110,
40,112,97,114,116,115,41,10,
//
10,
// class QueryResult(object):
99,108,97,115,115,32,81,117,101,114,121,82,101,115,117,108,116,40,111,98,106,
101,99,116,41,58,10,
// def __init__(self, generator):
32,32,32,32,100,101,102,32,95,95,105,110,105,116,95,95,40,115,101,108,102,44,
32,103,101,110,101,114,97,116,111,114,41,58,10,
// self.__gen = generator
32,32,32,32,32,32,32,32,115,101,108,102,46,95,95,103,101,110,32,61,32,103,101,
110,101,114,97,116,111,114,10,
//
10,
// def __iter__(self):
32,32,32,32,100,101,102,32,95,95,105,116,101,114,95,95,40,115,101,108,102,41,
58,10,
// return self.__gen
32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,115,101,108,102,46,95,95,
103,101,110,10,
//
10,
// def __le__(self, iterable):
32,32,32,32,100,101,102,32,95,95,108,101,95,95,40,115,101,108,102,44,32,105,
116,101,114,97,98,108,101,41,58,10,
// return set(self) <= set(iterable)
32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,115,101,116,40,115,101,108,
102,41,32,60,61,32,115,101,116,40,105,116,101,114,97,98,108,101,41,10,
//
10,
// def __lt__(self, iterable):
32,32,32,32,100,101,102,32,95,95,108,116,95,95,40,115,101,108,102,44,32,105,
116,101,114,97,98,108,101,41,58,10,
// return set(self) < set(iterable)
32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,115,101,116,40,115,101,108,
102,41,32,60,32,115,101,116,40,105,116,101,114,97,98,108,101,41,10,
//
10,
// def __ge__(self, iterable):
32,32,32,32,100,101,102,32,95,95,103,101,95,95,40,115,101,108,102,44,32,105,
116,101,114,97,98,108,101,41,58,10,
// return set(self) >= set(iterable)
32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,115,101,116,40,115,101,108,
102,41,32,62,61,32,115,101,116,40,105,116,101,114,97,98,108,101,41,10,
//
10,
// def __gt__(self, iterable):
32,32,32,32,100,101,102,32,95,95,103,116,95,95,40,115,101,108,102,44,32,105,
116,101,114,97,98,108,101,41,58,10,
// return set(self) > set(iterable)
32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,115,101,116,40,115,101,108,
102,41,32,62,32,115,101,116,40,105,116,101,114,97,98,108,101,41,10,
//
10,
// class Term(object):
99,108,97,115,115,32,84,101,114,109,40,111,98,106,101,99,116,41,58,10,
// PLACEHOLDER = object()
32,32,32,32,80,76,65,67,69,72,79,76,68,69,82,32,61,32,111,98,106,101,99,116,
40,41,10,
// WILDCARD = None
32,32,32,32,87,73,76,68,67,65,82,68,32,61,32,78,111,110,101,10,
// def __init__(self, arity):
32,32,32,32,100,101,102,32,95,95,105,110,105,116,95,95,40,115,101,108,102,44,
32,97,114,105,116,121,41,58,10,
// self.__arity = arity
32,32,32,32,32,32,32,32,115,101,108,102,46,95,95,97,114,105,116,121,32,61,32,
97,114,105,116,121,10,
// self.__facts = set()
32,32,32,32,32,32,32,32,115,101,108,102,46,95,95,102,97,99,116,115,32,61,32,
115,101,116,40,41,10,
//
10,
// def add_facts(self, facts):
32,32,32,32,100,101,102,32,97,100,100,95,102,97,99,116,115,40,115,101,108,102,
44,32,102,97,99,116,115,41,58,10,
// for fact in facts:
32,32,32,32,32,32,32,32,102,111,114,32,102,97,99,116,32,105,110,32,102,97,99,
116,115,58,10,
// self.add_fact(fact)
32,32,32,32,32,32,32,32,32,32,32,32,115,101,108,102,46,97,100,100,95,102,97,
99,116,40,102,97,99,116,41,10,
//
10,
// def add_fact(self, fact):
32,32,32,32,100,101,102,32,97,100,100,95,102,97,99,116,40,115,101,108,102,44,
32,102,97,99,116,41,58,10,
// assert len(fact) == self.__arity
32,32,32,32,32,32,32,32,97,115,115,101,114,116,32,108,101,110,40,102,97,99,116,
41,32,61,61,32,115,101,108,102,46,95,95,97,114,105,116,121,10,
// if not isinstance(fact, tuple):
32,32,32,32,32,32,32,32,105,102,32,110,111,116,32,105,115,105,110,115,116,97,
110,99,101,40,102,97,99,116,44,32,116,117,112,108,101,41,58,10,
// fact = tuple(fact)
32,32,32,32,32,32,32,32,32,32,32,32,102,97,99,116,32,61,32,116,117,112,108,101,
40,102,97,99,116,41,10,
// self.__facts.add(fact)
32,32,32,32,32,32,32,32,115,101,108,102,46,95,95,102,97,99,116,115,46,97,100,
100,40,102,97,99,116,41,10,
//
10,
// def __call__(self, *args):
32,32,32,32,100,101,102,32,95,95,99,97,108,108,95,95,40,115,101,108,102,44,32,
42,97,114,103,115,41,58,10,
// assert len(args) == self.__arity
32,32,32,32,32,32,32,32,97,115,115,101,114,116,32,108,101,110,40,97,114,103,
115,41,32,61,61,32,115,101,108,102,46,95,95,97,114,105,116,121,10,
// # When all arguments are concrete, calling a term just returns boolean results
32,32,32,32,32,32,32,32,35,32,87,104,101,110,32,97,108,108,32,97,114,103,117,
109,101,110,116,115,32,97,114,101,32,99,111,110,99,114,101,116,101,44,32,99,
97,108,108,105,110,103,32,97,32,116,101,114,109,32,106,117,115,116,32,114,101,
116,117,114,110,115,32,98,111,111,108,101,97,110,32,114,101,115,117,108,116,
115,10,
// # indicating whether the called tuple is part of the known facts
32,32,32,32,32,32,32,32,35,32,105,110,100,105,99,97,116,105,110,103,32,119,104,
101,116,104,101,114,32,116,104,101,32,99,97,108,108,101,100,32,116,117,112,108,
101,32,105,115,32,112,97,114,116,32,111,102,32,116,104,101,32,107,110,111,119,
110,32,102,97,99,116,115,10,
// n_placeholders = sum(arg is Term.PLACEHOLDER for arg in args)
32,32,32,32,32,32,32,32,110,95,112,108,97,99,101,104,111,108,100,101,114,115,
32,61,32,115,117,109,40,97,114,103,32,105,115,32,84,101,114,109,46,80,76,65,
67,69,72,79,76,68,69,82,32,102,111,114,32,97,114,103,32,105,110,32,97,114,103,
115,41,10,
// if not n_placeholders:
32,32,32,32,32,32,32,32,105,102,32,110,111,116,32,110,95,112,108,97,99,101,104,
111,108,100,101,114,115,58,10,
// return any(all(a == b for a, b in zip(fact, args)) for fact in self.__facts)
32,32,32,32,32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,97,110,121,40,
97,108,108,40,97,32,61,61,32,98,32,102,111,114,32,97,44,32,98,32,105,110,32,
122,105,112,40,102,97,99,116,44,32,97,114,103,115,41,41,32,102,111,114,32,102,
97,99,116,32,105,110,32,115,101,108,102,46,95,95,102,97,99,116,115,41,10,
// # If arguments contain one or more placeholders, calling a term is more like a
32,32,32,32,32,32,32,32,35,32,73,102,32,97,114,103,117,109,101,110,116,115,32,
99,111,110,116,97,105,110,32,111,110,101,32,111,114,32,109,111,114,101,32,112,
108,97,99,101,104,111,108,100,101,114,115,44,32,99,97,108,108,105,110,103,32,
97,32,116,101,114,109,32,105,115,32,109,111,114,101,32,108,105,107,101,32,97,
10,
// # query. The call returns a generator that iterates all facts that match with
32,32,32,32,32,32,32,32,35,32,113,117,101,114,121,46,32,84,104,101,32,99,97,
108,108,32,114,101,116,117,114,110,115,32,97,32,103,101,110,101,114,97,116,111,
114,32,116,104,97,116,32,105,116,101,114,97,116,101,115,32,97,108,108,32,102,
97,99,116,115,32,116,104,97,116,32,109,97,116,99,104,32,119,105,116,104,10,
// # the pattern described by the arguments
32,32,32,32,32,32,32,32,35,32,116,104,101,32,112,97,116,116,101,114,110,32,100,
101,115,99,114,105,98,101,100,32,98,121,32,116,104,101,32,97,114,103,117,109,
101,110,116,115,10,
// def gen():
32,32,32,32,32,32,32,32,100,101,102,32,103,101,110,40,41,58,10,
// for fact in self.__facts:
32,32,32,32,32,32,32,32,32,32,32,32,102,111,114,32,102,97,99,116,32,105,110,
32,115,101,108,102,46,95,95,102,97,99,116,115,58,10,
// rns = []
32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,114,110,115,32,61,32,91,93,10,
// matched = True
32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,109,97,116,99,104,101,100,32,
61,32,84,114,117,101,10,
// for a, b in zip(fact, args):
32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,102,111,114,32,97,44,32,98,32,
105,110,32,122,105,112,40,102,97,99,116,44,32,97,114,103,115,41,58,10,
// if b is Term.PLACEHOLDER:
32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,105,102,32,98,32,
105,115,32,84,101,114,109,46,80,76,65,67,69,72,79,76,68,69,82,58,10,
// rns.append(a)
32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,114,
110,115,46,97,112,112,101,110,100,40,97,41,10,
// else:
32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,101,108,115,101,
58,10,
// if a != b:
32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,105,
102,32,97,32,33,61,32,98,58,10,
// matched = False
32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,
32,32,109,97,116,99,104,101,100,32,61,32,70,97,108,115,101,10,
// break
32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,
32,32,98,114,101,97,107,10,
// if matched:
32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,105,102,32,109,97,116,99,104,
101,100,58,10,
// if n_placeholders == 1:
32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,105,102,32,110,95,
112,108,97,99,101,104,111,108,100,101,114,115,32,61,61,32,49,58,10,
// yield rns[0]
32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,121,
105,101,108,100,32,114,110,115,91,48,93,10,
// else:
32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,101,108,115,101,
58,10,
// yield tuple(rns)
32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,121,
105,101,108,100,32,116,117,112,108,101,40,114,110,115,41,10,
// return QueryResult(gen())
32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,81,117,101,114,121,82,101,
115,117,108,116,40,103,101,110,40,41,41,10,
//
10,
// class Model(object):
99,108,97,115,115,32,77,111,100,101,108,40,111,98,106,101,99,116,41,58,10,
// def __init__(self, raw_model):
32,32,32,32,100,101,102,32,95,95,105,110,105,116,95,95,40,115,101,108,102,44,
32,114,97,119,95,109,111,100,101,108,41,58,10,
// request_def, term_def, matchers = raw_model
32,32,32,32,32,32,32,32,114,101,113,117,101,115,116,95,100,101,102,44,32,116,
101,114,109,95,100,101,102,44,32,109,97,116,99,104,101,114,115,32,61,32,114,
97,119,95,109,111,100,101,108,10,
// self.__request_template = { r[0]:r[1] for r in request_def }
32,32,32,32,32,32,32,32,115,101,108,102,46,95,95,114,101,113,117,101,115,116,
95,116,101,109,112,108,97,116,101,32,61,32,123,32,114,91,48,93,58,114,91,49,
93,32,102,111,114,32,114,32,105,110,32,114,101,113,117,101,115,116,95,100,101,
102,32,125,10,
// self.__term_template = { t[0]:t[1] for t in term_def }
32,32,32,32,32,32,32,32,115,101,108,102,46,95,95,116,101,114,109,95,116,101,
109,112,108,97,116,101,32,61,32,123,32,116,91,48,93,58,116,91,49,93,32,102,111,
114,32,116,32,105,110,32,116,101,114,109,95,100,101,102,32,125,10,
// self.__matchers = { m[0]:m[1] for m in matchers }
32,32,32,32,32,32,32,32,115,101,108,102,46,95,95,109,97,116,99,104,101,114,115,
32,61,32,123,32,109,91,48,93,58,109,91,49,93,32,102,111,114,32,109,32,105,110,
32,109,97,116,99,104,101,114,115,32,125,10,
//
10,
// def_sections = zip(
32,32,32,32,32,32,32,32,100,101,102,95,115,101,99,116,105,111,110,115,32,61,
32,122,105,112,40,10,
// ['[requests]', '[terms]'],
32,32,32,32,32,32,32,32,32,32,32,32,91,39,91,114,101,113,117,101,115,116,115,
93,39,44,32,39,91,116,101,114,109,115,93,39,93,44,10,
// [self.__request_template, self.__term_template],
32,32,32,32,32,32,32,32,32,32,32,32,91,115,101,108,102,46,95,95,114,101,113,
117,101,115,116,95,116,101,109,112,108,97,116,101,44,32,115,101,108,102,46,95,
95,116,101,114,109,95,116,101,109,112,108,97,116,101,93,44,10,
// )
32,32,32,32,32,32,32,32,41,10,
//
10,
// n_sec = len(def_sections)
32,32,32,32,32,32,32,32,110,95,115,101,99,32,61,32,108,101,110,40,100,101,102,
95,115,101,99,116,105,111,110,115,41,10,
// for i in range(n_sec):
32,32,32,32,32,32,32,32,102,111,114,32,105,32,105,110,32,114,97,110,103,101,
40,110,95,115,101,99,41,58,10,
// for j in range(i + 1, n_sec):
32,32,32,32,32,32,32,32,32,32,32,32,102,111,114,32,106,32,105,110,32,114,97,
110,103,101,40,105,32,43,32,49,44,32,110,95,115,101,99,41,58,10,
// overlap = set(def_sections[i][1].keys()) & set(def_sections[j][1].keys())
32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,111,118,101,114,108,97,112,32,
61,32,115,101,116,40,100,101,102,95,115,101,99,116,105,111,110,115,91,105,93,
91,49,93,46,107,101,121,115,40,41,41,32,38,32,115,101,116,40,100,101,102,95,
115,101,99,116,105,111,110,115,91,106,93,91,49,93,46,107,101,121,115,40,41,41,
10,
// if overlap:
32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,105,102,32,111,118,101,114,108,
97,112,58,10,
// raise InvalidModelDefinition.redundant_def(
32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,114,97,105,115,101,
32,73,110,118,97,108,105,100,77,111,100,101,108,68,101,102,105,110,105,116,105,
111,110,46,114,101,100,117,110,100,97,110,116,95,100,101,102,40,10,
// overalp, def_sections[i][0], def_sections[j][0]
32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,111,
118,101,114,97,108,112,44,32,100,101,102,95,115,101,99,116,105,111,110,115,91,
105,93,91,48,93,44,32,100,101,102,95,115,101,99,116,105,111,110,115,91,106,93,
91,48,93,10,
// )
32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,41,10,
//
10,
// missing_matchers = set(self.__request_template.keys()) - set(self.__matchers.keys())
32,32,32,32,32,32,32,32,109,105,115,115,105,110,103,95,109,97,116,99,104,101,
114,115,32,61,32,115,101,116,40,115,101,108,102,46,95,95,114,101,113,117,101,
115,116,95,116,101,109,112,108,97,116,101,46,107,101,121,115,40,41,41,32,45,
32,115,101,116,40,115,101,108,102,46,95,95,109,97,116,99,104,101,114,115,46,
107,101,121,115,40,41,41,10,
// if missing_matchers:
32,32,32,32,32,32,32,32,105,102,32,109,105,115,115,105,110,103,95,109,97,116,
99,104,101,114,115,58,10,
// raise InvalidModelDefinition.missing_matchers(missing_matchers)
32,32,32,32,32,32,32,32,32,32,32,32,114,97,105,115,101,32,73,110,118,97,108,
105,100,77,111,100,101,108,68,101,102,105,110,105,116,105,111,110,46,109,105,
115,115,105,110,103,95,109,97,116,99,104,101,114,115,40,109,105,115,115,105,
110,103,95,109,97,116,99,104,101,114,115,41,10,
//
10,
// unknown_requests = set(self.__matchers.keys()) - set(self.__request_template.keys())
32,32,32,32,32,32,32,32,117,110,107,110,111,119,110,95,114,101,113,117,101,115,
116,115,32,61,32,115,101,116,40,115,101,108,102,46,95,95,109,97,116,99,104,101,
114,115,46,107,101,121,115,40,41,41,32,45,32,115,101,116,40,115,101,108,102,
46,95,95,114,101,113,117,101,115,116,95,116,101,109,112,108,97,116,101,46,107,
101,121,115,40,41,41,10,
// if unknown_requests:
32,32,32,32,32,32,32,32,105,102,32,117,110,107,110,111,119,110,95,114,101,113,
117,101,115,116,115,58,10,
// raise InvalidModelDefinition.unknown_requests(unknown_requests)
32,32,32,32,32,32,32,32,32,32,32,32,114,97,105,115,101,32,73,110,118,97,108,
105,100,77,111,100,101,108,68,101,102,105,110,105,116,105,111,110,46,117,110,
107,110,111,119,110,95,114,101,113,117,101,115,116,115,40,117,110,107,110,111,
119,110,95,114,101,113,117,101,115,116,115,41,10,
//
10,
// self.__term_knowledge_base = {
32,32,32,32,32,32,32,32,115,101,108,102,46,95,95,116,101,114,109,95,107,110,
111,119,108,101,100,103,101,95,98,97,115,101,32,61,32,123,10,
// term_name:Term(len(term_tpl)) for term_name, term_tpl in self.__term_template.items()
32,32,32,32,32,32,32,32,32,32,32,32,116,101,114,109,95,110,97,109,101,58,84,
101,114,109,40,108,101,110,40,116,101,114,109,95,116,112,108,41,41,32,102,111,
114,32,116,101,114,109,95,110,97,109,101,44,32,116,101,114,109,95,116,112,108,
32,105,110,32,115,101,108,102,46,95,95,116,101,114,109,95,116,101,109,112,108,
97,116,101,46,105,116,101,109,115,40,41,10,
// }
32,32,32,32,32,32,32,32,125,10,
//
10,
// def add_term_items(self, term_items):
32,32,32,32,100,101,102,32,97,100,100,95,116,101,114,109,95,105,116,101,109,
115,40,115,101,108,102,44,32,116,101,114,109,95,105,116,101,109,115,41,58,10,
// for ti in term_items:
32,32,32,32,32,32,32,32,102,111,114,32,116,105,32,105,110,32,116,101,114,109,
95,105,116,101,109,115,58,10,
// self.add_term_item(ti[0], ti[1:])
32,32,32,32,32,32,32,32,32,32,32,32,115,101,108,102,46,97,100,100,95,116,101,
114,109,95,105,116,101,109,40,116,105,91,48,93,44,32,116,105,91,49,58,93,41,
10,
//
10,
// def add_term_item(self, term_name, fact):
32,32,32,32,100,101,102,32,97,100,100,95,116,101,114,109,95,105,116,101,109,
40,115,101,108,102,44,32,116,101,114,109,95,110,97,109,101,44,32,102,97,99,116,
41,58,10,
// term = self.__term_knowledge_base[term_name]
32,32,32,32,32,32,32,32,116,101,114,109,32,61,32,115,101,108,102,46,95,95,116,
101,114,109,95,107,110,111,119,108,101,100,103,101,95,98,97,115,101,91,116,101,
114,109,95,110,97,109,101,93,10,
// term.add_fact(fact)
32,32,32,32,32,32,32,32,116,101,114,109,46,97,100,100,95,102,97,99,116,40,102,
97,99,116,41,10,
//
10,
// def get_matcher_proxy(self, request_type, env):
32,32,32,32,100,101,102,32,103,101,116,95,109,97,116,99,104,101,114,95,112,114,
111,120,121,40,115,101,108,102,44,32,114,101,113,117,101,115,116,95,116,121,
112,101,44,32,101,110,118,41,58,10,
// def matcher_proxy():
32,32,32,32,32,32,32,32,100,101,102,32,109,97,116,99,104,101,114,95,112,114,
111,120,121,40,41,58,10,
// return eval(self.__matchers[request_type], env)
32,32,32,32,32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,101,118,97,108,
40,115,101,108,102,46,95,95,109,97,116,99,104,101,114,115,91,114,101,113,117,
101,115,116,95,116,121,112,101,93,44,32,101,110,118,41,10,
// return matcher_proxy
32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,109,97,116,99,104,101,114,
95,112,114,111,120,121,10,
//
10,
// def enforce(self, request_type, request_content):
32,32,32,32,100,101,102,32,101,110,102,111,114,99,101,40,115,101,108,102,44,
32,114,101,113,117,101,115,116,95,116,121,112,101,44,32,114,101,113,117,101,
115,116,95,99,111,110,116,101,110,116,41,58,10,
// tpl = self.__request_template[request_type]
32,32,32,32,32,32,32,32,116,112,108,32,61,32,115,101,108,102,46,95,95,114,101,
113,117,101,115,116,95,116,101,109,112,108,97,116,101,91,114,101,113,117,101,
115,116,95,116,121,112,101,93,10,
// request = Request(tpl, request_content)
32,32,32,32,32,32,32,32,114,101,113,117,101,115,116,32,61,32,82,101,113,117,
101,115,116,40,116,112,108,44,32,114,101,113,117,101,115,116,95,99,111,110,116,
101,110,116,41,10,
//
10,
// enforcer_env = {
32,32,32,32,32,32,32,32,101,110,102,111,114,99,101,114,95,101,110,118,32,61,
32,123,10,
// request_type: request,
32,32,32,32,32,32,32,32,32,32,32,32,114,101,113,117,101,115,116,95,116,121,112,
101,58,32,114,101,113,117,101,115,116,44,10,
// 'true': True, 'false': False, 'null': None,
32,32,32,32,32,32,32,32,32,32,32,32,39,116,114,117,101,39,58,32,84,114,117,101,
44,32,39,102,97,108,115,101,39,58,32,70,97,108,115,101,44,32,39,110,117,108,
108,39,58,32,78,111,110,101,44,10,
// '_': Term.PLACEHOLDER,
32,32,32,32,32,32,32,32,32,32,32,32,39,95,39,58,32,84,101,114,109,46,80,76,65,
67,69,72,79,76,68,69,82,44,10,
// 'X': Term.WILDCARD,
32,32,32,32,32,32,32,32,32,32,32,32,39,88,39,58,32,84,101,114,109,46,87,73,76,
68,67,65,82,68,44,10,
// }
32,32,32,32,32,32,32,32,125,10,
// enforcer_env.update(self.__term_knowledge_base)
32,32,32,32,32,32,32,32,101,110,102,111,114,99,101,114,95,101,110,118,46,117,
112,100,97,116,101,40,115,101,108,102,46,95,95,116,101,114,109,95,107,110,111,
119,108,101,100,103,101,95,98,97,115,101,41,10,
//
10,
// return eval(self.__matchers[request_type], enforcer_env)
32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,101,118,97,108,40,115,101,
108,102,46,95,95,109,97,116,99,104,101,114,115,91,114,101,113,117,101,115,116,
95,116,121,112,101,93,44,32,101,110,102,111,114,99,101,114,95,101,110,118,41,
10,
//
10,
// global_perm_model = None
103,108,111,98,97,108,95,112,101,114,109,95,109,111,100,101,108,32,61,32,78,
111,110,101,10,
//
10,
// if __name__ == '__builtin__':
105,102,32,95,95,110,97,109,101,95,95,32,61,61,32,39,95,95,98,117,105,108,116,
105,110,95,95,39,58,10,
// from acs_py_enclave import ffi
32,32,32,32,102,114,111,109,32,97,99,115,95,112,121,95,101,110,99,108,97,118,
101,32,105,109,112,111,114,116,32,102,102,105,10,
// else:
101,108,115,101,58,10,
// class ffi:
32,32,32,32,99,108,97,115,115,32,102,102,105,58,10,
// @staticmethod
32,32,32,32,32,32,32,32,64,115,116,97,116,105,99,109,101,116,104,111,100,10,
// def def_extern():
32,32,32,32,32,32,32,32,100,101,102,32,100,101,102,95,101,120,116,101,114,110,
40,41,58,10,
// return lambda x: x
32,32,32,32,32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,108,97,109,98,
100,97,32,120,58,32,120,10,
//
10,
// @staticmethod
32,32,32,32,32,32,32,32,64,115,116,97,116,105,99,109,101,116,104,111,100,10,
// def string(s):
32,32,32,32,32,32,32,32,100,101,102,32,115,116,114,105,110,103,40,115,41,58,
10,
// return s
32,32,32,32,32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,115,10,
//
10,
// @ffi.def_extern()
64,102,102,105,46,100,101,102,95,101,120,116,101,114,110,40,41,10,
// def acs_setup_model(conf):
100,101,102,32,97,99,115,95,115,101,116,117,112,95,109,111,100,101,108,40,99,
111,110,102,41,58,10,
// try:
32,32,32,32,116,114,121,58,10,
// global global_perm_model
32,32,32,32,32,32,32,32,103,108,111,98,97,108,32,103,108,111,98,97,108,95,112,
101,114,109,95,109,111,100,101,108,10,
// conf = ffi.string(conf)
32,32,32,32,32,32,32,32,99,111,110,102,32,61,32,102,102,105,46,115,116,114,105,
110,103,40,99,111,110,102,41,10,
// global_perm_model = Model(parse_model(conf))
32,32,32,32,32,32,32,32,103,108,111,98,97,108,95,112,101,114,109,95,109,111,
100,101,108,32,61,32,77,111,100,101,108,40,112,97,114,115,101,95,109,111,100,
101,108,40,99,111,110,102,41,41,10,
// except:
32,32,32,32,101,120,99,101,112,116,58,10,
// return -1
32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,45,49,10,
// return 0
32,32,32,32,114,101,116,117,114,110,32,48,10,
//
10,
// @ffi.def_extern()
64,102,102,105,46,100,101,102,95,101,120,116,101,114,110,40,41,10,
// def acs_enforce_request(request_type, request_content):
100,101,102,32,97,99,115,95,101,110,102,111,114,99,101,95,114,101,113,117,101,
115,116,40,114,101,113,117,101,115,116,95,116,121,112,101,44,32,114,101,113,
117,101,115,116,95,99,111,110,116,101,110,116,41,58,10,
// try:
32,32,32,32,116,114,121,58,10,
// request_type = ffi.string(request_type)
32,32,32,32,32,32,32,32,114,101,113,117,101,115,116,95,116,121,112,101,32,61,
32,102,102,105,46,115,116,114,105,110,103,40,114,101,113,117,101,115,116,95,
116,121,112,101,41,10,
// # request_content is a list of ffi c strings which are syntactically valid
32,32,32,32,32,32,32,32,35,32,114,101,113,117,101,115,116,95,99,111,110,116,
101,110,116,32,105,115,32,97,32,108,105,115,116,32,111,102,32,102,102,105,32,
99,32,115,116,114,105,110,103,115,32,119,104,105,99,104,32,97,114,101,32,115,
121,110,116,97,99,116,105,99,97,108,108,121,32,118,97,108,105,100,10,
// # python primitive-type objects, including strings, integers, foating point
32,32,32,32,32,32,32,32,35,32,112,121,116,104,111,110,32,112,114,105,109,105,
116,105,118,101,45,116,121,112,101,32,111,98,106,101,99,116,115,44,32,105,110,
99,108,117,100,105,110,103,32,115,116,114,105,110,103,115,44,32,105,110,116,
101,103,101,114,115,44,32,102,111,97,116,105,110,103,32,112,111,105,110,116,
10,
// # numbers, and lists/dictionaries of primitive-type objects
32,32,32,32,32,32,32,32,35,32,110,117,109,98,101,114,115,44,32,97,110,100,32,
108,105,115,116,115,47,100,105,99,116,105,111,110,97,114,105,101,115,32,111,
102,32,112,114,105,109,105,116,105,118,101,45,116,121,112,101,32,111,98,106,
101,99,116,115,10,
// request_content = eval(ffi.string(request_content))
32,32,32,32,32,32,32,32,114,101,113,117,101,115,116,95,99,111,110,116,101,110,
116,32,61,32,101,118,97,108,40,102,102,105,46,115,116,114,105,110,103,40,114,
101,113,117,101,115,116,95,99,111,110,116,101,110,116,41,41,10,
// return global_perm_model.enforce(request_type, request_content)
32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,103,108,111,98,97,108,95,
112,101,114,109,95,109,111,100,101,108,46,101,110,102,111,114,99,101,40,114,
101,113,117,101,115,116,95,116,121,112,101,44,32,114,101,113,117,101,115,116,
95,99,111,110,116,101,110,116,41,10,
// except:
32,32,32,32,101,120,99,101,112,116,58,10,
// return -1
32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,45,49,10,
//
10,
// @ffi.def_extern()
64,102,102,105,46,100,101,102,95,101,120,116,101,114,110,40,41,10,
// def acs_announce_fact(term_type, term_fact):
100,101,102,32,97,99,115,95,97,110,110,111,117,110,99,101,95,102,97,99,116,40,
116,101,114,109,95,116,121,112,101,44,32,116,101,114,109,95,102,97,99,116,41,
58,10,
// try:
32,32,32,32,116,114,121,58,10,
// term_type = ffi.string(term_type)
32,32,32,32,32,32,32,32,116,101,114,109,95,116,121,112,101,32,61,32,102,102,
105,46,115,116,114,105,110,103,40,116,101,114,109,95,116,121,112,101,41,10,
// term_fact = eval(ffi.string(term_fact))
32,32,32,32,32,32,32,32,116,101,114,109,95,102,97,99,116,32,61,32,101,118,97,
108,40,102,102,105,46,115,116,114,105,110,103,40,116,101,114,109,95,102,97,99,
116,41,41,10,
// global_perm_model.add_term_item(term_type, term_fact)
32,32,32,32,32,32,32,32,103,108,111,98,97,108,95,112,101,114,109,95,109,111,
100,101,108,46,97,100,100,95,116,101,114,109,95,105,116,101,109,40,116,101,114,
109,95,116,121,112,101,44,32,116,101,114,109,95,102,97,99,116,41,10,
// except:
32,32,32,32,101,120,99,101,112,116,58,10,
// return -1
32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,45,49,10,
// return 0
32,32,32,32,114,101,116,117,114,110,32,48,10,
0 };
#ifdef PYPY_VERSION
# define _CFFI_PYTHON_STARTUP_FUNC _cffi_pypyinit_acs_py_enclave
#elif PY_MAJOR_VERSION >= 3
# define _CFFI_PYTHON_STARTUP_FUNC PyInit_acs_py_enclave
#else
# define _CFFI_PYTHON_STARTUP_FUNC initacs_py_enclave
#endif
/***** Support code for embedding *****/
#ifdef __cplusplus
extern "C" {
#endif
#if defined(_WIN32)
# define CFFI_DLLEXPORT __declspec(dllexport)
#elif defined(__GNUC__)
# define CFFI_DLLEXPORT __attribute__((visibility("default")))
#else
# define CFFI_DLLEXPORT /* nothing */
#endif
/* There are two global variables of type _cffi_call_python_fnptr:
* _cffi_call_python, which we declare just below, is the one called
by ``extern "Python"`` implementations.
* _cffi_call_python_org, which on CPython is actually part of the
_cffi_exports[] array, is the function pointer copied from
_cffi_backend.
After initialization is complete, both are equal. However, the
first one remains equal to &_cffi_start_and_call_python until the
very end of initialization, when we are (or should be) sure that
concurrent threads also see a completely initialized world, and
only then is it changed.
*/
#undef _cffi_call_python
typedef void (*_cffi_call_python_fnptr)(struct _cffi_externpy_s *, char *);
static void _cffi_start_and_call_python(struct _cffi_externpy_s *, char *);
static _cffi_call_python_fnptr _cffi_call_python = &_cffi_start_and_call_python;
#ifndef _MSC_VER
/* --- Assuming a GCC not infinitely old --- */
# define cffi_compare_and_swap(l,o,n) __sync_bool_compare_and_swap(l,o,n)
# define cffi_write_barrier() __sync_synchronize()
# if !defined(__amd64__) && !defined(__x86_64__) && \
!defined(__i386__) && !defined(__i386)
# define cffi_read_barrier() __sync_synchronize()
# else
# define cffi_read_barrier() (void)0
# endif
#else
/* --- Windows threads version --- */
# include <Windows.h>
# define cffi_compare_and_swap(l,o,n) \
(InterlockedCompareExchangePointer(l,n,o) == (o))
# define cffi_write_barrier() InterlockedCompareExchange(&_cffi_dummy,0,0)
# define cffi_read_barrier() (void)0
static volatile LONG _cffi_dummy;
#endif
#ifdef WITH_THREAD
# ifndef _MSC_VER
# include <pthread.h>
static pthread_mutex_t _cffi_embed_startup_lock;
# else
static CRITICAL_SECTION _cffi_embed_startup_lock;
# endif
static char _cffi_embed_startup_lock_ready = 0;
#endif
static void _cffi_acquire_reentrant_mutex(void)
{
static void *volatile lock = NULL;
while (!cffi_compare_and_swap(&lock, NULL, (void *)1)) {
/* should ideally do a spin loop instruction here, but
hard to do it portably and doesn't really matter I
think: pthread_mutex_init() should be very fast, and
this is only run at start-up anyway. */
}
#ifdef WITH_THREAD
if (!_cffi_embed_startup_lock_ready) {
# ifndef _MSC_VER
pthread_mutexattr_t attr;
pthread_mutexattr_init(&attr);
pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE);
pthread_mutex_init(&_cffi_embed_startup_lock, &attr);
# else
InitializeCriticalSection(&_cffi_embed_startup_lock);
# endif
_cffi_embed_startup_lock_ready = 1;
}
#endif
while (!cffi_compare_and_swap(&lock, (void *)1, NULL))
;
#ifndef _MSC_VER
pthread_mutex_lock(&_cffi_embed_startup_lock);
#else
EnterCriticalSection(&_cffi_embed_startup_lock);
#endif
}
static void _cffi_release_reentrant_mutex(void)
{
#ifndef _MSC_VER
pthread_mutex_unlock(&_cffi_embed_startup_lock);
#else
LeaveCriticalSection(&_cffi_embed_startup_lock);
#endif
}
/********** CPython-specific section **********/
#ifndef PYPY_VERSION
#ifndef CFFI_MESSAGEBOX
# ifdef _MSC_VER
# define CFFI_MESSAGEBOX 1
# else
# define CFFI_MESSAGEBOX 0
# endif
#endif
#if CFFI_MESSAGEBOX
/* Windows only: logic to take the Python-CFFI embedding logic
initialization errors and display them in a background thread
with MessageBox. The idea is that if the whole program closes
as a result of this problem, then likely it is already a console
program and you can read the stderr output in the console too.
If it is not a console program, then it will likely show its own
dialog to complain, or generally not abruptly close, and for this
case the background thread should stay alive.
*/
static void *volatile _cffi_bootstrap_text;
static PyObject *_cffi_start_error_capture(void)
{
PyObject *result = NULL;
PyObject *x, *m, *bi;
if (InterlockedCompareExchangePointer(&_cffi_bootstrap_text,
(void *)1, NULL) != NULL)
return (PyObject *)1;
m = PyImport_AddModule("_cffi_error_capture");
if (m == NULL)
goto error;
result = PyModule_GetDict(m);
if (result == NULL)
goto error;
#if PY_MAJOR_VERSION >= 3
bi = PyImport_ImportModule("builtins");
#else
bi = PyImport_ImportModule("__builtin__");
#endif
if (bi == NULL)
goto error;
PyDict_SetItemString(result, "__builtins__", bi);
Py_DECREF(bi);
x = PyRun_String(
"import sys\n"
"class FileLike:\n"
" def write(self, x):\n"
" of.write(x)\n"
" self.buf += x\n"
"fl = FileLike()\n"
"fl.buf = ''\n"
"of = sys.stderr\n"
"sys.stderr = fl\n"
"def done():\n"
" sys.stderr = of\n"
" return fl.buf\n", /* make sure the returned value stays alive */
Py_file_input,
result, result);
Py_XDECREF(x);
error:
if (PyErr_Occurred())
{
PyErr_WriteUnraisable(Py_None);
PyErr_Clear();
}
return result;
}
#pragma comment(lib, "user32.lib")
static DWORD WINAPI _cffi_bootstrap_dialog(LPVOID ignored)
{
Sleep(666); /* may be interrupted if the whole process is closing */
#if PY_MAJOR_VERSION >= 3
MessageBoxW(NULL, (wchar_t *)_cffi_bootstrap_text,
L"Python-CFFI error",
MB_OK | MB_ICONERROR);
#else
MessageBoxA(NULL, (char *)_cffi_bootstrap_text,
"Python-CFFI error",
MB_OK | MB_ICONERROR);
#endif
_cffi_bootstrap_text = NULL;
return 0;
}
static void _cffi_stop_error_capture(PyObject *ecap)
{
PyObject *s;
void *text;
if (ecap == (PyObject *)1)
return;
if (ecap == NULL)
goto error;
s = PyRun_String("done()", Py_eval_input, ecap, ecap);
if (s == NULL)
goto error;
/* Show a dialog box, but in a background thread, and
never show multiple dialog boxes at once. */
#if PY_MAJOR_VERSION >= 3
text = PyUnicode_AsWideCharString(s, NULL);
#else
text = PyString_AsString(s);
#endif
_cffi_bootstrap_text = text;
if (text != NULL)
{
HANDLE h;
h = CreateThread(NULL, 0, _cffi_bootstrap_dialog,
NULL, 0, NULL);
if (h != NULL)
CloseHandle(h);
}
/* decref the string, but it should stay alive as 'fl.buf'
in the small module above. It will really be freed only if
we later get another similar error. So it's a leak of at
most one copy of the small module. That's fine for this
situation which is usually a "fatal error" anyway. */
Py_DECREF(s);
PyErr_Clear();
return;
error:
_cffi_bootstrap_text = NULL;
PyErr_Clear();
}
#else
static PyObject *_cffi_start_error_capture(void) { return NULL; }
static void _cffi_stop_error_capture(PyObject *ecap) { }
#endif
#define _cffi_call_python_org _cffi_exports[_CFFI_CPIDX]
PyMODINIT_FUNC _CFFI_PYTHON_STARTUP_FUNC(void); /* forward */
static void _cffi_py_initialize(void)
{
/* XXX use initsigs=0, which "skips initialization registration of
signal handlers, which might be useful when Python is
embedded" according to the Python docs. But review and think
if it should be a user-controllable setting.
XXX we should also give a way to write errors to a buffer
instead of to stderr.
XXX if importing 'site' fails, CPython (any version) calls
exit(). Should we try to work around this behavior here?
*/
Py_InitializeEx(0);
}
static int _cffi_initialize_python(void)
{
/* This initializes Python, imports _cffi_backend, and then the
present .dll/.so is set up as a CPython C extension module.
*/
int result;
PyGILState_STATE state;
PyObject *pycode=NULL, *global_dict=NULL, *x;
state = PyGILState_Ensure();
/* Call the initxxx() function from the present module. It will
create and initialize us as a CPython extension module, instead
of letting the startup Python code do it---it might reimport
the same .dll/.so and get maybe confused on some platforms.
It might also have troubles locating the .dll/.so again for all
I know.
*/
(void)_CFFI_PYTHON_STARTUP_FUNC();
if (PyErr_Occurred())
goto error;
/* Now run the Python code provided to ffi.embedding_init_code().
*/
pycode = Py_CompileString(_CFFI_PYTHON_STARTUP_CODE,
"<init code for '" _CFFI_MODULE_NAME "'>",
Py_file_input);
if (pycode == NULL)
goto error;
global_dict = PyDict_New();
if (global_dict == NULL)
goto error;
if (PyDict_SetItemString(global_dict, "__builtins__",
PyThreadState_GET()->interp->builtins) < 0)
goto error;
x = PyEval_EvalCode(
#if PY_MAJOR_VERSION < 3
(PyCodeObject *)
#endif
pycode, global_dict, global_dict);
if (x == NULL)
goto error;
Py_DECREF(x);
/* Done! Now if we've been called from
_cffi_start_and_call_python() in an ``extern "Python"``, we can
only hope that the Python code did correctly set up the
corresponding @ffi.def_extern() function. Otherwise, the
general logic of ``extern "Python"`` functions (inside the
_cffi_backend module) will find that the reference is still
missing and print an error.
*/
result = 0;
done:
Py_XDECREF(pycode);
Py_XDECREF(global_dict);
PyGILState_Release(state);
return result;
error:;
{
/* Print as much information as potentially useful.
Debugging load-time failures with embedding is not fun
*/
PyObject *ecap;
PyObject *exception, *v, *tb, *f, *modules, *mod;
PyErr_Fetch(&exception, &v, &tb);
ecap = _cffi_start_error_capture();
f = PySys_GetObject((char *)"stderr");
if (f != NULL && f != Py_None) {
PyFile_WriteString(
"Failed to initialize the Python-CFFI embedding logic:\n\n", f);
}
if (exception != NULL) {
PyErr_NormalizeException(&exception, &v, &tb);
PyErr_Display(exception, v, tb);
}
Py_XDECREF(exception);
Py_XDECREF(v);
Py_XDECREF(tb);
if (f != NULL && f != Py_None) {
PyFile_WriteString("\nFrom: " _CFFI_MODULE_NAME
"\ncompiled with cffi version: 1.11.5"
"\n_cffi_backend module: ", f);
modules = PyImport_GetModuleDict();
mod = PyDict_GetItemString(modules, "_cffi_backend");
if (mod == NULL) {
PyFile_WriteString("not loaded", f);
}
else {
v = PyObject_GetAttrString(mod, "__file__");
PyFile_WriteObject(v, f, 0);
Py_XDECREF(v);
}
PyFile_WriteString("\nsys.path: ", f);
PyFile_WriteObject(PySys_GetObject((char *)"path"), f, 0);
PyFile_WriteString("\n\n", f);
}
_cffi_stop_error_capture(ecap);
}
result = -1;
goto done;
}
PyAPI_DATA(char *) _PyParser_TokenNames[]; /* from CPython */
static int _cffi_carefully_make_gil(void)
{
/* This does the basic initialization of Python. It can be called
completely concurrently from unrelated threads. It assumes
that we don't hold the GIL before (if it exists), and we don't
hold it afterwards.
(What it really does used to be completely different in Python 2
and Python 3, with the Python 2 solution avoiding the spin-lock
around the Py_InitializeEx() call. However, after recent changes
to CPython 2.7 (issue #358) it no longer works. So we use the
Python 3 solution everywhere.)
This initializes Python by calling Py_InitializeEx().
Important: this must not be called concurrently at all.
So we use a global variable as a simple spin lock. This global
variable must be from 'libpythonX.Y.so', not from this
cffi-based extension module, because it must be shared from
different cffi-based extension modules. We choose
_PyParser_TokenNames[0] as a completely arbitrary pointer value
that is never written to. The default is to point to the
string "ENDMARKER". We change it temporarily to point to the
next character in that string. (Yes, I know it's REALLY
obscure.)
*/
#ifdef WITH_THREAD
char *volatile *lock = (char *volatile *)_PyParser_TokenNames;
char *old_value;
while (1) { /* spin loop */
old_value = *lock;
if (old_value[0] == 'E') {
assert(old_value[1] == 'N');
if (cffi_compare_and_swap(lock, old_value, old_value + 1))
break;
}
else {
assert(old_value[0] == 'N');
/* should ideally do a spin loop instruction here, but
hard to do it portably and doesn't really matter I
think: PyEval_InitThreads() should be very fast, and
this is only run at start-up anyway. */
}
}
#endif
/* call Py_InitializeEx() */
{
PyGILState_STATE state = PyGILState_UNLOCKED;
if (!Py_IsInitialized())
_cffi_py_initialize();
else
state = PyGILState_Ensure();
PyEval_InitThreads();
PyGILState_Release(state);
}
#ifdef WITH_THREAD
/* release the lock */
while (!cffi_compare_and_swap(lock, old_value + 1, old_value))
;
#endif
return 0;
}
/********** end CPython-specific section **********/
#else
/********** PyPy-specific section **********/
PyMODINIT_FUNC _CFFI_PYTHON_STARTUP_FUNC(const void *[]); /* forward */
static struct _cffi_pypy_init_s {
const char *name;
void (*func)(const void *[]);
const char *code;
} _cffi_pypy_init = {
_CFFI_MODULE_NAME,
(void(*)(const void *[]))_CFFI_PYTHON_STARTUP_FUNC,
_CFFI_PYTHON_STARTUP_CODE,
};
extern int pypy_carefully_make_gil(const char *);
extern int pypy_init_embedded_cffi_module(int, struct _cffi_pypy_init_s *);
static int _cffi_carefully_make_gil(void)
{
return pypy_carefully_make_gil(_CFFI_MODULE_NAME);
}
static int _cffi_initialize_python(void)
{
return pypy_init_embedded_cffi_module(0xB011, &_cffi_pypy_init);
}
/********** end PyPy-specific section **********/
#endif
#ifdef __GNUC__
__attribute__((noinline))
#endif
static _cffi_call_python_fnptr _cffi_start_python(void)
{
/* Delicate logic to initialize Python. This function can be
called multiple times concurrently, e.g. when the process calls
its first ``extern "Python"`` functions in multiple threads at
once. It can also be called recursively, in which case we must
ignore it. We also have to consider what occurs if several
different cffi-based extensions reach this code in parallel
threads---it is a different copy of the code, then, and we
can't have any shared global variable unless it comes from
'libpythonX.Y.so'.
Idea:
* _cffi_carefully_make_gil(): "carefully" call
PyEval_InitThreads() (possibly with Py_InitializeEx() first).
* then we use a (local) custom lock to make sure that a call to this
cffi-based extension will wait if another call to the *same*
extension is running the initialization in another thread.
It is reentrant, so that a recursive call will not block, but
only one from a different thread.
* then we grab the GIL and (Python 2) we call Py_InitializeEx().
At this point, concurrent calls to Py_InitializeEx() are not
possible: we have the GIL.
* do the rest of the specific initialization, which may
temporarily release the GIL but not the custom lock.
Only release the custom lock when we are done.
*/
static char called = 0;
if (_cffi_carefully_make_gil() != 0)
return NULL;
#ifndef SGX
_cffi_acquire_reentrant_mutex();
#endif
/* Here the GIL exists, but we don't have it. We're only protected
from concurrency by the reentrant mutex. */
/* This file only initializes the embedded module once, the first
time this is called, even if there are subinterpreters. */
if (!called) {
called = 1; /* invoke _cffi_initialize_python() only once,
but don't set '_cffi_call_python' right now,
otherwise concurrent threads won't call
this function at all (we need them to wait) */
if (_cffi_initialize_python() == 0) {
/* now initialization is finished. Switch to the fast-path. */
/* We would like nobody to see the new value of
'_cffi_call_python' without also seeing the rest of the
data initialized. However, this is not possible. But
the new value of '_cffi_call_python' is the function
'cffi_call_python()' from _cffi_backend. So: */
cffi_write_barrier();
/* ^^^ we put a write barrier here, and a corresponding
read barrier at the start of cffi_call_python(). This
ensures that after that read barrier, we see everything
done here before the write barrier.
*/
assert(_cffi_call_python_org != NULL);
_cffi_call_python = (_cffi_call_python_fnptr)_cffi_call_python_org;
}
else {
/* initialization failed. Reset this to NULL, even if it was
already set to some other value. Future calls to
_cffi_start_python() are still forced to occur, and will
always return NULL from now on. */
_cffi_call_python_org = NULL;
}
}
#ifndef SGX
_cffi_release_reentrant_mutex();
#endif
return (_cffi_call_python_fnptr)_cffi_call_python_org;
}
static
void _cffi_start_and_call_python(struct _cffi_externpy_s *externpy, char *args)
{
_cffi_call_python_fnptr fnptr;
int current_err = errno;
#ifdef _MSC_VER
int current_lasterr = GetLastError();
#endif
fnptr = _cffi_start_python();
if (fnptr == NULL) {
fprintf(stderr, "function %s() called, but initialization code "
"failed. Returning 0.\n", externpy->name);
memset(args, 0, externpy->size_of_result);
}
#ifdef _MSC_VER
SetLastError(current_lasterr);
#endif
errno = current_err;
if (fnptr != NULL)
fnptr(externpy, args);
}
/* The cffi_start_python() function makes sure Python is initialized
and our cffi module is set up. It can be called manually from the
user C code. The same effect is obtained automatically from any
dll-exported ``extern "Python"`` function. This function returns
-1 if initialization failed, 0 if all is OK. */
_CFFI_UNUSED_FN
static int cffi_start_python(void)
{
if (_cffi_call_python == &_cffi_start_and_call_python) {
if (_cffi_start_python() == NULL)
return -1;
}
cffi_read_barrier();
return 0;
}
#undef cffi_compare_and_swap
#undef cffi_write_barrier
#undef cffi_read_barrier
#ifdef __cplusplus
}
#endif
/************************************************************/
/************************************************************/
static void *_cffi_types[] = {
/* 0 */ _CFFI_OP(_CFFI_OP_FUNCTION, 10), // int()(char const *)
/* 1 */ _CFFI_OP(_CFFI_OP_POINTER, 7), // char const *
/* 2 */ _CFFI_OP(_CFFI_OP_FUNCTION_END, 0),
/* 3 */ _CFFI_OP(_CFFI_OP_FUNCTION, 10), // int()(char const *, char const *)
/* 4 */ _CFFI_OP(_CFFI_OP_NOOP, 1),
/* 5 */ _CFFI_OP(_CFFI_OP_NOOP, 1),
/* 6 */ _CFFI_OP(_CFFI_OP_FUNCTION_END, 0),
/* 7 */ _CFFI_OP(_CFFI_OP_PRIMITIVE, 2), // char
/* 8 */ _CFFI_OP(_CFFI_OP_POINTER, 0), // int(*)(char const *)
/* 9 */ _CFFI_OP(_CFFI_OP_POINTER, 3), // int(*)(char const *, char const *)
/* 10 */ _CFFI_OP(_CFFI_OP_PRIMITIVE, 7), // int
};
static struct _cffi_externpy_s _cffi_externpy__acs_announce_fact =
{ "acs_py_enclave.acs_announce_fact", (int)sizeof(int) };
CFFI_DLLEXPORT int acs_announce_fact(char const * a0, char const * a1)
{
char a[16];
char *p = a;
*(char const * *)(p + 0) = a0;
*(char const * *)(p + 8) = a1;
_cffi_call_python(&_cffi_externpy__acs_announce_fact, p);
return *(int *)p;
}
static struct _cffi_externpy_s _cffi_externpy__acs_enforce_request =
{ "acs_py_enclave.acs_enforce_request", (int)sizeof(int) };
CFFI_DLLEXPORT int acs_enforce_request(char const * a0, char const * a1)
{
char a[16];
char *p = a;
*(char const * *)(p + 0) = a0;
*(char const * *)(p + 8) = a1;
_cffi_call_python(&_cffi_externpy__acs_enforce_request, p);
return *(int *)p;
}
static struct _cffi_externpy_s _cffi_externpy__acs_setup_model =
{ "acs_py_enclave.acs_setup_model", (int)sizeof(int) };
CFFI_DLLEXPORT int acs_setup_model(char const * a0)
{
char a[8];
char *p = a;
*(char const * *)(p + 0) = a0;
_cffi_call_python(&_cffi_externpy__acs_setup_model, p);
return *(int *)p;
}
static const struct _cffi_global_s _cffi_globals[] = {
{ "acs_announce_fact", (void *)&_cffi_externpy__acs_announce_fact, _CFFI_OP(_CFFI_OP_EXTERN_PYTHON, 9), (void *)acs_announce_fact },
{ "acs_enforce_request", (void *)&_cffi_externpy__acs_enforce_request, _CFFI_OP(_CFFI_OP_EXTERN_PYTHON, 9), (void *)acs_enforce_request },
{ "acs_setup_model", (void *)&_cffi_externpy__acs_setup_model, _CFFI_OP(_CFFI_OP_EXTERN_PYTHON, 8), (void *)acs_setup_model },
};
static const struct _cffi_type_context_s _cffi_type_context = {
_cffi_types,
_cffi_globals,
NULL, /* no fields */
NULL, /* no struct_unions */
NULL, /* no enums */
NULL, /* no typenames */
3, /* num_globals */
0, /* num_struct_unions */
0, /* num_enums */
0, /* num_typenames */
NULL, /* no includes */
11, /* num_types */
1, /* flags */
};
#ifdef __GNUC__
# pragma GCC visibility push(default) /* for -fvisibility= */
#endif
#ifdef PYPY_VERSION
PyMODINIT_FUNC
_cffi_pypyinit_acs_py_enclave(const void *p[])
{
if (((intptr_t)p[0]) >= 0x0A03) {
_cffi_call_python_org = (void(*)(struct _cffi_externpy_s *, char *))p[1];
}
p[0] = (const void *)0x2701;
p[1] = &_cffi_type_context;
#if PY_MAJOR_VERSION >= 3
return NULL;
#endif
}
# ifdef _MSC_VER
PyMODINIT_FUNC
# if PY_MAJOR_VERSION >= 3
PyInit_acs_py_enclave(void) { return NULL; }
# else
initacs_py_enclave(void) { }
# endif
# endif
#elif PY_MAJOR_VERSION >= 3
PyMODINIT_FUNC
PyInit_acs_py_enclave(void)
{
return _cffi_init("acs_py_enclave", 0x2701, &_cffi_type_context);
}
#else
PyMODINIT_FUNC
initacs_py_enclave(void)
{
_cffi_init("acs_py_enclave", 0x2701, &_cffi_type_context);
}
#endif
#ifdef __GNUC__
# pragma GCC visibility pop
#endif