From feade9985cfcf9e916a6b534c47570737bbc4b35 Mon Sep 17 00:00:00 2001 From: erititan <elemer.lelik@ericsson.com> Date: Sat, 5 Mar 2016 15:49:22 +0100 Subject: [PATCH] Sync with 5.4.3 --- common/config_preproc_p.y | 4 +- common/path.c | 14 +- common/path.h | 6 +- common/version.h | 4 +- compiler2/Type.cc | 14 +- compiler2/Type_chk.cc | 31 ++- compiler2/Value.cc | 25 +- compiler2/Value.hh | 1 - compiler2/compiler.1 | 6 +- compiler2/encdec.c | 4 +- compiler2/enum.c | 2 +- compiler2/main.cc | 19 +- compiler2/main.hh | 2 +- compiler2/makefile.c | 72 +++++- compiler2/record.c | 139 +++++------ compiler2/record_of.c | 124 +++++++--- compiler2/ttcn3/AST_ttcn3.cc | 2 + compiler2/ttcn3/TtcnTemplate.cc | 2 + compiler2/ttcn3/compiler.l | 7 +- compiler2/ttcn3/compiler.y | 35 ++- compiler2/ttcn3/rawAST.l | 12 +- compiler2/ttcn3/rawAST.y | 17 +- compiler2/ttcn3_makefilegen.1 | 21 +- compiler2/union.c | 17 +- compiler2/xpather.cc | 160 +++++++++--- compiler2/xpather.h | 8 +- core/ASN_CharacterString.cc | 36 +-- core/ASN_CharacterString.hh | 8 +- core/ASN_EmbeddedPDV.cc | 36 +-- core/ASN_EmbeddedPDV.hh | 8 +- core/ASN_External.cc | 28 +-- core/ASN_External.hh | 2 +- core/ASN_Null.cc | 4 +- core/ASN_Null.hh | 2 +- core/Array.hh | 52 +++- core/Basetype.cc | 4 +- core/Basetype.hh | 14 +- core/Bitstring.cc | 4 +- core/Bitstring.hh | 2 +- core/Boolean.cc | 4 +- core/Boolean.hh | 2 +- core/Charstring.cc | 4 +- core/Charstring.hh | 2 +- core/Float.cc | 4 +- core/Float.hh | 2 +- core/Hexstring.cc | 4 +- core/Hexstring.hh | 2 +- core/Integer.cc | 4 +- core/Integer.hh | 2 +- core/JSON.hh | 8 +- core/Objid.cc | 4 +- core/Objid.hh | 2 +- core/Octetstring.cc | 4 +- core/Octetstring.hh | 2 +- core/Optional.hh | 11 +- core/Port.hh | 1 + core/Universal_charstring.cc | 4 +- core/Universal_charstring.hh | 2 +- core/Verdicttype.cc | 4 +- core/Verdicttype.hh | 2 +- core/XER.hh | 4 + core/XmlReader.hh | 2 +- core2/Basetype2.cc | 151 +++++++----- etc/xsd/TPD.xsd | 2 + .../Semantic_Analyser/TTCN3_SA_1_TD.script | 2 +- .../Semantic_Analyser/xer/bogus_SE.ttcn | 2 +- .../XML/EXER-whitepaper/UseNil.ttcnpp | 232 ++++++++++++++++++ .../XML/HR49727/UsefulTtcn3Types.ttcn | 27 +- regression_test/XML/HR49727/XSD.ttcn | 27 +- .../XML/XmlWorkflow/Tgc/UsefulTtcn3Types.ttcn | 27 +- regression_test/XML/XmlWorkflow/Tgc/XSD.ttcn | 27 +- .../www_example_org_including_module_e.ttcn | 63 +++++ .../XmlTest_xsds/UsefulTtcn3Types.ttcn | 27 +- .../XML/XmlWorkflow/XmlTest_xsds/XSD.ttcn | 27 +- .../XML/XmlWorkflow/src/UsefulTtcn3Types.ttcn | 27 +- regression_test/XML/XmlWorkflow/src/XSD.ttcn | 27 +- .../XML/XmlWorkflow/src/xmlTest.prj | 3 + .../XmlWorkflow/src/xmlTest_Testcases.ttcn | 30 +++ .../xsd/included_without_namespace.xsd | 12 + .../XML/XmlWorkflow/xsd/including_module.xsd | 12 + regression_test/charstrOper/TcharstrOper.ttcn | 9 + .../compileonly/mfgen-tpd/Makefile | 15 +- .../search_paths/dep1/Test/src/MyExample.cfg | 8 + .../search_paths/dep1/Test/src/MyExample.ttcn | 51 ++++ .../search_paths/dep1/Test/src/PCOType.cc | 108 ++++++++ .../search_paths/dep1/Test/src/PCOType.hh | 48 ++++ .../search_paths/dep1/Test1/DepTpd1.tpd | 45 ++++ .../dep2/Test/src/MyExample2.ttcn | 11 + .../search_paths/dep2/Test2/DepTpd2.tpd | 45 ++++ .../dep2/dep2_1/Test/src/MyExample2_1.ttcn | 11 + .../dep2/dep2_1/Test2_1/DepTpd2_1.tpd | 42 ++++ .../dep3/Test/src/MyExample3.ttcn | 11 + .../search_paths/dep3/Test3/DepTpd3.tpd | 42 ++++ .../mfgen-tpd/search_paths/main/Main.tpd | 39 +++ .../search_paths/main/src/MyMain.ttcn | 13 + regression_test/implicitOmit/IOAsn.asn | 26 ++ regression_test/implicitOmit/Makefile | 2 +- regression_test/implicitOmit/io.ttcn | 14 ++ regression_test/json/AttributeTestcases.ttcn | 48 ++++ regression_test/json/Functions.ttcn | 30 +++ regression_test/json/Types.ttcn | 50 ++++ .../negativeTest/UsefulTtcn3Types.ttcn | 27 +- regression_test/negativeTest/XSD.ttcn | 27 +- regression_test/predefFunction/regex_OK.ttcn | 4 +- regression_test/recordOper/TrecordOper.ttcn | 27 -- .../templateCharstr/TtemplateCharstr.ttcn | 28 +++ .../LegacyTests/LegacyTestcases.ttcn | 8 + .../templateRecof/TtemplateRecof.ttcn | 11 + regression_test/unionOper/TunionOper.ttcn | 93 +++++++ regression_test/unionOper/config.cfg | 9 + usrguide/referenceguide.doc | Bin 1698816 -> 1710080 bytes usrguide/userguide.doc | Bin 849920 -> 850432 bytes xsdconvert/GeneralFunctions.cc | 78 +++++- xsdconvert/GeneralFunctions.hh | 2 + xsdconvert/ImportStatement.hh | 2 + xsdconvert/TTCN3Module.cc | 56 ----- xsdconvert/TTCN3Module.hh | 1 - xsdconvert/TTCN3ModuleInventory.cc | 2 +- xsdconvert/converter.cc | 11 +- 119 files changed, 2267 insertions(+), 540 deletions(-) create mode 100644 regression_test/XML/XmlWorkflow/XmlTest_expectedTtcns/www_example_org_including_module_e.ttcn create mode 100644 regression_test/XML/XmlWorkflow/xsd/included_without_namespace.xsd create mode 100644 regression_test/XML/XmlWorkflow/xsd/including_module.xsd create mode 100644 regression_test/compileonly/mfgen-tpd/search_paths/dep1/Test/src/MyExample.cfg create mode 100644 regression_test/compileonly/mfgen-tpd/search_paths/dep1/Test/src/MyExample.ttcn create mode 100644 regression_test/compileonly/mfgen-tpd/search_paths/dep1/Test/src/PCOType.cc create mode 100644 regression_test/compileonly/mfgen-tpd/search_paths/dep1/Test/src/PCOType.hh create mode 100644 regression_test/compileonly/mfgen-tpd/search_paths/dep1/Test1/DepTpd1.tpd create mode 100644 regression_test/compileonly/mfgen-tpd/search_paths/dep2/Test/src/MyExample2.ttcn create mode 100644 regression_test/compileonly/mfgen-tpd/search_paths/dep2/Test2/DepTpd2.tpd create mode 100644 regression_test/compileonly/mfgen-tpd/search_paths/dep2/dep2_1/Test/src/MyExample2_1.ttcn create mode 100644 regression_test/compileonly/mfgen-tpd/search_paths/dep2/dep2_1/Test2_1/DepTpd2_1.tpd create mode 100644 regression_test/compileonly/mfgen-tpd/search_paths/dep3/Test/src/MyExample3.ttcn create mode 100644 regression_test/compileonly/mfgen-tpd/search_paths/dep3/Test3/DepTpd3.tpd create mode 100644 regression_test/compileonly/mfgen-tpd/search_paths/main/Main.tpd create mode 100644 regression_test/compileonly/mfgen-tpd/search_paths/main/src/MyMain.ttcn create mode 100644 regression_test/implicitOmit/IOAsn.asn diff --git a/common/config_preproc_p.y b/common/config_preproc_p.y index e76ee4f07..bd8e5cedd 100644 --- a/common/config_preproc_p.y +++ b/common/config_preproc_p.y @@ -256,7 +256,7 @@ extern int add_include_file(const std::string& filename) expstring_t currdirname, dirname, filenamepart, basedir; currdirname = get_dir_from_path(get_cfg_preproc_current_file().c_str()); dirname = get_dir_from_path(filename.c_str()); - basedir = get_absolute_dir(dirname, currdirname); + basedir = get_absolute_dir(dirname, currdirname, 1); Free(currdirname); Free(dirname); filenamepart = get_file_from_path(filename.c_str()); @@ -294,7 +294,7 @@ extern int preproc_parse_file(const char *filename, string_chain_t **filenames, config_preproc_defines=string_map_new(); { expstring_t dirname=get_dir_from_path(filename); - expstring_t basedir=get_absolute_dir(dirname, NULL); + expstring_t basedir=get_absolute_dir(dirname, NULL, 1); expstring_t filenamepart=get_file_from_path(filename); Free(dirname); if (basedir == NULL) { diff --git a/common/path.c b/common/path.c index d9c4f3d27..201e2153e 100644 --- a/common/path.c +++ b/common/path.c @@ -129,7 +129,7 @@ expstring_t compose_path_name(const char *dir_name, } else return mcopystr(file_name); } -expstring_t get_absolute_dir(const char *dir_name, const char *base_dir) +expstring_t get_absolute_dir(const char *dir_name, const char *base_dir, const int with_error) { expstring_t ret_val; /* save the working directory */ @@ -142,12 +142,18 @@ expstring_t get_absolute_dir(const char *dir_name, const char *base_dir) return NULL; } } - if (dir_name != NULL && set_working_dir(dir_name)) { + if (dir_name != NULL && with_error && set_working_dir(dir_name)) { /* there was an error: go back to initial_dir */ set_working_dir(initial_dir); Free(initial_dir); return NULL; } + if (dir_name != NULL && !with_error && chdir(dir_name)) { + //No error sign + errno = 0; + Free(initial_dir); + return NULL; + } ret_val = get_working_dir(); /* restore the working directory */ set_working_dir(initial_dir); @@ -174,9 +180,9 @@ expstring_t get_relative_dir(const char *dir_name, const char *base_dir) { expstring_t ret_val = NULL; /* canonize dir_name and the base directory */ - expstring_t canonized_dir_name = get_absolute_dir(dir_name, base_dir); + expstring_t canonized_dir_name = get_absolute_dir(dir_name, base_dir, 1); expstring_t canonized_base_dir = base_dir != NULL ? - get_absolute_dir(base_dir, NULL) : get_working_dir(); + get_absolute_dir(base_dir, NULL, 1) : get_working_dir(); size_t i, last_slash = 0; if (canonized_dir_name == NULL || canonized_base_dir == NULL) { /* an error occurred */ diff --git a/common/path.h b/common/path.h index e72b743f1..549633ab0 100644 --- a/common/path.h +++ b/common/path.h @@ -68,8 +68,10 @@ extern expstring_t compose_path_name(const char *dir_name, * (i.e. symlinks in it are resolved). NULL pointer returned in case of error. * The string returned shall be deallocated by the caller using \a Free(). * Note: The working directory of the current process might change during the - * function call, but it is restored before the function returns. */ -extern expstring_t get_absolute_dir(const char *dir_name, const char *base_dir); + * function call, but it is restored before the function returns. + * If the with_error is true, then it won't sign error when set_working_dir + * is called.*/ +extern expstring_t get_absolute_dir(const char *dir_name, const char *base_dir, const int with_error); /** Converts \a dir_name to a relative path name based on \a working_dir. If * \a working_dir is NULL the current working directory of the process is used. diff --git a/common/version.h b/common/version.h index 959454a68..d8aaafbf8 100644 --- a/common/version.h +++ b/common/version.h @@ -11,7 +11,7 @@ /* Version numbers */ #define TTCN3_MAJOR 5 #define TTCN3_MINOR 4 -#define TTCN3_PATCHLEVEL 2 +#define TTCN3_PATCHLEVEL 3 //#define TTCN3_BUILDNUMBER 0 /* The aggregated version number must be set manually since some stupid @@ -22,7 +22,7 @@ * TTCN3_VERSION = TTCN3_MAJOR * 1000000 + TTCN3_MINOR * 10000 + * TTCN3_PATCHLEVEL * 100 + TTCN3_BUILDNUMBER */ -#define TTCN3_VERSION 50402 +#define TTCN3_VERSION 50403 /* A monotonically increasing version number. * An official release is deemed to have the highest possible build number (99) diff --git a/compiler2/Type.cc b/compiler2/Type.cc index cc5b039d1..d99d14a08 100644 --- a/compiler2/Type.cc +++ b/compiler2/Type.cc @@ -1610,6 +1610,9 @@ namespace Common { case T_SET_T: case T_ANYTYPE: break; + case T_COMPONENT: + ref->error("Referencing fields of a component is not allowed"); + return 0; default: ref->error("Invalid field reference `%s': type `%s' " "does not have fields", id.get_dispname().c_str(), @@ -2777,11 +2780,14 @@ namespace Common { comp_type->jsonattrib->metainfo_unbound = true; } } - else if (NULL == parent || (T_SEQ_T != parent->typetype && - T_SET_T != parent->typetype)) { - // only allowed if it's a field of a record/set + else if (T_SEQOF != get_type_refd_last()->typetype && + T_SETOF != get_type_refd_last()->typetype && + T_ARRAY != get_type_refd_last()->typetype && + (NULL == parent || (T_SEQ_T != parent->typetype && + T_SET_T != parent->typetype))) { + // only allowed if it's an array type or a field of a record/set error("Invalid attribute 'metainfo for unbound', requires record, set, " - "or field of a record or set"); + "record of, set of, array or field of a record or set"); } } } diff --git a/compiler2/Type_chk.cc b/compiler2/Type_chk.cc index 759fab13a..99f0da247 100644 --- a/compiler2/Type_chk.cc +++ b/compiler2/Type_chk.cc @@ -395,6 +395,7 @@ void Type::parse_attributes() case T_SEQ_T: case T_SET_T: case T_ANYTYPE: + case T_ARRAY: if(rawattrib==NULL) {rawattrib= new RawAST; new_raw=true;} if(textattrib==NULL){textattrib= new TextAST; new_text=true;} if(xerattrib==NULL) {xerattrib = new XerAttributes; new_xer = true;} @@ -459,7 +460,8 @@ void Type::parse_attributes() // This should be bool, but gcc 4.1.2-sol8 generates incorrect code // with -O2 :( - const int se_of = (typetype == T_SEQOF || typetype == T_SETOF); + const int se_of = (typetype == T_SEQOF || typetype == T_SETOF || + typetype == T_ARRAY); const size_t nof_comps = se_of ? 1 : get_nof_comps(); // Distribute the attributes with qualifiers to the components. @@ -4070,6 +4072,9 @@ bool Type::chk_this_value_Choice(Value *value, Common::Assignment *lhs, alt_type->chk_this_value_ref(alt_value); self_ref |= alt_type->chk_this_value(alt_value, lhs, expected_value, incomplete_allowed, OMIT_NOT_ALLOWED, SUB_CHK, implicit_omit); + if (alt_value->get_valuetype() == Value::V_NOTUSED) { + value->set_valuetype(Value::V_NOTUSED); + } break;} default: value->error("%s value was expected for type `%s'", @@ -4159,6 +4164,7 @@ bool Type::chk_this_value_Seq_T(Value *value, Common::Assignment *lhs, expected_ CompField *last_cf = 0; size_t next_index = 0; size_t seq_index = 0; + bool is_empty = n_type_comps > 0; // don't do this check if the record type has no fields for (size_t v_i = 0; v_i < n_value_comps; v_i++, seq_index++) { NamedValue *nv = value->get_se_comp_byIndex(v_i); const Identifier& value_id = nv->get_name(); @@ -4226,8 +4232,16 @@ bool Type::chk_this_value_Seq_T(Value *value, Common::Assignment *lhs, expected_ type->chk_this_value_ref(comp_value); self_ref |= type->chk_this_value(comp_value, lhs, expected_value, incomplete_allowed, cf->get_is_optional() ? OMIT_ALLOWED : OMIT_NOT_ALLOWED, SUB_CHK, implicit_omit); + if (comp_value->get_valuetype() != Value::V_NOTUSED) { + is_empty = false; + } + } + if (is_empty) { + // all of the record's fields are unused (-), set the record to unused + // to avoid unnecessary code generation + value->set_valuetype(Value::V_NOTUSED); } - if (!incomplete_allowed || implicit_omit) { + else if (!incomplete_allowed || implicit_omit) { for (size_t i = 0; i < n_type_comps; i++) { const Identifier& id = get_comp_byIndex(i)->get_name(); if (!comp_map.has_key(id.get_name())) { @@ -4251,6 +4265,7 @@ bool Type::chk_this_value_Set_T(Value *value, Common::Assignment *lhs, expected_ map<string, NamedValue> comp_map; size_t n_type_comps = get_nof_comps(); size_t n_value_comps = value->get_nof_comps(); + bool is_empty = n_type_comps > 0; // don't do this check if the set type has no fields for(size_t v_i = 0; v_i < n_value_comps; v_i++) { NamedValue *nv = value->get_se_comp_byIndex(v_i); const Identifier& value_id = nv->get_name(); @@ -4282,8 +4297,16 @@ bool Type::chk_this_value_Set_T(Value *value, Common::Assignment *lhs, expected_ type->chk_this_value_ref(comp_value); self_ref |= type->chk_this_value(comp_value, lhs, expected_value, incomplete_allowed, cf->get_is_optional() ? OMIT_ALLOWED : OMIT_NOT_ALLOWED, SUB_CHK, implicit_omit); + if (comp_value->get_valuetype() != Value::V_NOTUSED) { + is_empty = false; + } + } + if (is_empty) { + // all of the set's fields are unused (-), set the set to unused to avoid + // unnecessary code generation + value->set_valuetype(Value::V_NOTUSED); } - if (!incomplete_allowed || implicit_omit) { + else if (!incomplete_allowed || implicit_omit) { for (size_t i = 0; i < n_type_comps; i++) { const Identifier& id = get_comp_byIndex(i)->get_name(); if(!comp_map.has_key(id.get_name())) { @@ -5460,7 +5483,7 @@ bool Type::chk_this_template_generic(Template *t, namedbool incomplete_allowed, t_comp->set_my_governor(this); chk_this_template_ref(t_comp); self_ref |= chk_this_template_generic(t_comp, INCOMPLETE_NOT_ALLOWED, - omit_in_value_list ? OMIT_ALLOWED : OMIT_NOT_ALLOWED, + omit_in_value_list ? allow_omit : OMIT_NOT_ALLOWED, ANY_OR_OMIT_ALLOWED, sub_chk, implicit_omit, lhs); if(temptype==Ttcn::Template::COMPLEMENTED_LIST && t_comp->get_template_refd_last()->get_templatetype() == diff --git a/compiler2/Value.cc b/compiler2/Value.cc index 3a8ade195..1f9de506a 100644 --- a/compiler2/Value.cc +++ b/compiler2/Value.cc @@ -2467,6 +2467,9 @@ namespace Common { u.val_Real = i_mant * pow(static_cast<double>(i_base), static_cast<double>(i_exp)); break; } + case V_NOTUSED: + clean_up(); + break; default: FATAL_ERROR("Value::set_valuetype()"); } // switch @@ -2535,6 +2538,15 @@ namespace Common { FATAL_ERROR("Value::set_valuetype()"); } break; + case V_SET: + case V_CHOICE: + if (p_valuetype == V_NOTUSED) { + clean_up(); + } + else { + FATAL_ERROR("Value::set_valuetype()"); + } + break; case V_TTCN3_NULL: switch (p_valuetype) { case V_DEFAULT_NULL: @@ -5927,8 +5939,8 @@ error: if (!governor) { string str; ti->append_stringRepr( str); - ti->error("Cannot determine the argument type of %s in the`%s' operation.\n" - "If type is known, use valuof(<type>: %s) as argument.", + ti->error("Cannot determine the argument type of %s in the `%s' operation.\n" + "If type is known, use valueof(<type>: %s) as argument.", str.c_str(), get_opname(), str.c_str()); set_valuetype(V_ERROR); } @@ -11097,6 +11109,9 @@ error: FATAL_ERROR("Value::generate_code_init()"); } break; + case V_NOTUSED: + // unbound value, don't generate anything + break; default: FATAL_ERROR("Value::generate_code_init()"); } @@ -11672,8 +11687,7 @@ error: expr->expr=mputstr(expr->expr, ".is_bound()"); break; case OPTYPE_ISPRESENT: - expr->expr=mputprintf(expr->expr, ".is_present(%s)", - omit_in_value_list ? "TRUE" : ""); + expr->expr=mputprintf(expr->expr, ".is_present()"); break; case OPTYPE_SIZEOF: expr->expr=mputstr(expr->expr, ".size_of()"); @@ -12878,6 +12892,9 @@ error: FATAL_ERROR("Value::has_single_expr()"); case V_INT: return u.val_Int->is_native_fit(); + case V_NOTUSED: + // should only happen when generating code for an unbound record/set value + return false; default: // other value types (literal values) do not need temporary reference return true; diff --git a/compiler2/Value.hh b/compiler2/Value.hh index 38e83875c..fa98bb8f0 100644 --- a/compiler2/Value.hh +++ b/compiler2/Value.hh @@ -66,7 +66,6 @@ namespace Common { /** value type */ - enum valuetype_t { V_ERROR, /**< erroneous */ V_NULL, /**< NULL (for ASN.1 NULL type, also in TTCN-3) */ diff --git a/compiler2/compiler.1 b/compiler2/compiler.1 index 9739703d7..1a7ca4c1e 100644 --- a/compiler2/compiler.1 +++ b/compiler2/compiler.1 @@ -3,7 +3,7 @@ compiler \- TTCN-3 and ASN.1 to C++ translator .SH SYNOPSIS .B compiler -.RB "[\| " \-abcdfgijlLMpqrRsStuwxXyY " \|]" +.RB "[\| " \-abcdEfgijlLMpqrRsStuwxXyY " \|]" .RB "[\| " \-V .IR " verb_level" " \|]" .RB "[\| " \-K @@ -81,6 +81,10 @@ fields with DEFAULT values as .I omit in TTCN-3. .TP +.B \-E +Instructs the variant attribute parser to display warnings instead of errors +for unrecognized/erroneous attributes. +.TP .B \-f Forces the compiler to .I overwrite diff --git a/compiler2/encdec.c b/compiler2/encdec.c index 6b90b1377..d93612e2f 100644 --- a/compiler2/encdec.c +++ b/compiler2/encdec.c @@ -53,7 +53,7 @@ void def_encdec(const char *p_classname, "int XER_encode(const XERdescriptor_t&, TTCN_Buffer&, unsigned int, int, " "embed_values_enc_struct_t*) const;\n" "int XER_decode(const XERdescriptor_t&, XmlReaderWrap&, unsigned int, " - "embed_values_dec_struct_t*);\n" + "unsigned int, embed_values_dec_struct_t*);\n" "static boolean can_start(const char *name, const char *uri, " "XERdescriptor_t const& xd, unsigned int);\n" "%s" @@ -217,7 +217,7 @@ void def_encdec(const char *p_classname, " for (int rd_ok=reader.Read(); rd_ok==1; rd_ok=reader.Read()) {\n" " if (reader.NodeType() == XML_READER_TYPE_ELEMENT) break;\n" " }\n" - " XER_decode(*(p_td.xer), reader, XER_coding | XER_TOPLEVEL, 0);\n" + " XER_decode(*(p_td.xer), reader, XER_coding | XER_TOPLEVEL, XER_NONE, 0);\n" " size_t bytes = reader.ByteConsumed();\n" " p_buf.set_pos(bytes);\n" " break;}\n" diff --git a/compiler2/enum.c b/compiler2/enum.c index 0d995c74c..601aa8661 100644 --- a/compiler2/enum.c +++ b/compiler2/enum.c @@ -677,7 +677,7 @@ void defEnumClass(const enum_def *edef, output_struct *output) "// written by %s in " __FILE__ " at %d\n" #endif "int %s::XER_decode(const XERdescriptor_t& p_td, XmlReaderWrap& p_reader," - " unsigned int p_flavor, embed_values_dec_struct_t*)\n" + " unsigned int p_flavor, unsigned int /*p_flavor2*/, embed_values_dec_struct_t*)\n" "{\n" " int rd_ok = 1, type;\n" diff --git a/compiler2/main.cc b/compiler2/main.cc index c4e8ff387..28a4ba756 100644 --- a/compiler2/main.cc +++ b/compiler2/main.cc @@ -71,7 +71,8 @@ boolean generate_skeleton = FALSE, force_overwrite = FALSE, use_runtime_2 = FALSE, gcc_compat = FALSE, asn1_xer = FALSE, check_subtype = TRUE, suppress_context = FALSE, display_up_to_date = FALSE, implicit_json_encoding = FALSE, json_refs_for_all_types = TRUE, - force_gen_seof = FALSE, omit_in_value_list = FALSE; + force_gen_seof = FALSE, omit_in_value_list = FALSE, + warnings_for_bad_variants = FALSE; // Default code splitting mode is set to 'no splitting'. CodeGenHelper::split_type code_splitting_mode = CodeGenHelper::SPLIT_NONE; @@ -224,7 +225,7 @@ char *canonize_input_file(const char *path_name) break; } char *dir_name = get_dir_from_path(path_name); - char *abs_dir = get_absolute_dir(dir_name, NULL); + char *abs_dir = get_absolute_dir(dir_name, NULL, true); Free(dir_name); char *file_name = get_file_from_path(path_name); char *ret_val = compose_path_name(abs_dir, file_name); @@ -360,7 +361,7 @@ static boolean is_valid_asn1_filename(const char* file_name) static void usage() { fprintf(stderr, "\n" - "usage: %s [-abcdfgijlLOpqrRsStuwxXyY] [-K file] [-z file] [-V verb_level]\n" + "usage: %s [-abcdEfgijlLOpqrRsStuwxXyY] [-K file] [-z file] [-V verb_level]\n" " [-o dir] [-U none|type] [-P modulename.top_level_pdu_name] [-Q number] ...\n" " [-T] module.ttcn [-A] module.asn ...\n" " or %s -v\n" @@ -371,6 +372,7 @@ static void usage() " -b: disable BER encoder/decoder functions\n" " -c: write out checksums in case of error\n" " -d: treat default fields as omit\n" + " -E: display only warnings for unrecognized encoding variants\n" " -f: force overwriting of output files\n" " -g: emulate GCC error/warning message format\n" " -i: use only line numbers in error/warning messages\n" @@ -455,7 +457,8 @@ int main(int argc, char *argv[]) dflag = false, Xflag = false, Rflag = false, gflag = false, aflag = false, s0flag = false, Cflag = false, yflag = false, Uflag = false, Qflag = false, Sflag = false, Kflag = false, jflag = false, zflag = false, Fflag = false, - Mflag = false, errflag = false, print_usage = false, ttcn2json = false; + Mflag = false, Eflag = false, errflag = false, print_usage = false, + ttcn2json = false; CodeGenHelper cgh; @@ -547,7 +550,7 @@ int main(int argc, char *argv[]) if (!ttcn2json) { for ( ; ; ) { - int c = getopt(argc, argv, "aA:C:K:LP:T:V:bcdfFgilMo:YpqQ:rRs0StuU:vwxXjyz:-"); + int c = getopt(argc, argv, "aA:bcC:dEfFgijK:lLMo:pP:qQ:rRsStT:uU:vV:wxXyYz:0-"); if (c == -1) break; switch (c) { case 'a': @@ -714,6 +717,10 @@ int main(int argc, char *argv[]) SET_FLAG(M); omit_in_value_list = TRUE; break; + case 'E': + SET_FLAG(E); + warnings_for_bad_variants = TRUE; + break; case 'Q': { long max_errs; @@ -758,7 +765,7 @@ int main(int argc, char *argv[]) if (Aflag || Lflag || Pflag || Tflag || Vflag || Yflag || bflag || fflag || iflag || lflag || oflag || pflag || qflag || rflag || sflag || tflag || uflag || wflag || xflag || Xflag || Rflag || - Uflag || yflag || Kflag || jflag || zflag || Fflag || Mflag) { + Uflag || yflag || Kflag || jflag || zflag || Fflag || Mflag || Eflag) { errflag = true; print_usage = true; } diff --git a/compiler2/main.hh b/compiler2/main.hh index 10192d71d..23e1b30df 100644 --- a/compiler2/main.hh +++ b/compiler2/main.hh @@ -36,7 +36,7 @@ extern boolean generate_skeleton, force_overwrite, include_line_info, output_only_linenum, default_as_optional, use_runtime_2, gcc_compat, asn1_xer, check_subtype, suppress_context, enable_set_bound_out_param, display_up_to_date, implicit_json_encoding, json_refs_for_all_types, force_gen_seof, - omit_in_value_list; + omit_in_value_list, warnings_for_bad_variants; extern const char *expected_platform; diff --git a/compiler2/makefile.c b/compiler2/makefile.c index 3bf80cfe5..7c2f90598 100644 --- a/compiler2/makefile.c +++ b/compiler2/makefile.c @@ -238,6 +238,8 @@ struct makefile_struct { boolean suppresswarnings; boolean outparamboundness; boolean omit_in_value_list; + boolean warnings_for_bad_variants; + boolean disable_predef_ext_folder; struct string_list* solspeclibraries; /* not owned */ struct string_list* sol8speclibraries; /* not owned */ struct string_list* linuxspeclibraries; /* not owned */ @@ -301,6 +303,7 @@ static void init_makefile_struct(struct makefile_struct *makefile) makefile->prep_defines = NULL; makefile->outparamboundness = FALSE; makefile->omit_in_value_list = FALSE; + makefile->warnings_for_bad_variants = FALSE; makefile->solspeclibraries = NULL; makefile->sol8speclibraries = NULL; makefile->linuxspeclibraries = NULL; @@ -518,7 +521,7 @@ static char *get_dir_name(const char *path_name, const char *working_dir) { char *dir_name = get_dir_from_path(path_name); if (dir_name != NULL) { - char *absolute_dir = get_absolute_dir(dir_name, working_dir); + char *absolute_dir = get_absolute_dir(dir_name, working_dir, TRUE); Free(dir_name); if (absolute_dir == NULL || working_dir == NULL) { /* an error occurred */ @@ -1975,13 +1978,13 @@ static void print_makefile(struct makefile_struct *makefile) "AR = ar\n" "ARFLAGS = \n\n" "# Flags for the TTCN-3 and ASN.1 compiler:\n" - "COMPILER_FLAGS =%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s\n\n" + "COMPILER_FLAGS =%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s\n\n" "# Execution mode: (either ttcn3 or ttcn3-parallel)\n" "TTCN3_LIB = ttcn3%s%s%s\n\n" #ifdef LICENSE "# The path of your OpenSSL installation:\n" "# If you do not have your own one, leave it unchanged.\n" - "OPENSSL_DIR = $(TTCN3_DIR)\n\n" + "%sOPENSSL_DIR = $(TTCN3_DIR)\n\n" #endif "# The path of your libxml2 installation:\n" "# If you do not have your own one, leave it unchanged.\n" @@ -2012,12 +2015,16 @@ static void print_makefile(struct makefile_struct *makefile) (makefile->suppresswarnings ? " -w" : ""), (makefile->outparamboundness ? " -Y" : ""), (makefile->omit_in_value_list ? " -M" : ""), + (makefile->warnings_for_bad_variants ? " -E" : ""), (makefile->tcov_file_name ? makefile->tcov_file_name : ""), (makefile->profiled_file_list ? " -z $(PROFILED_FILE_LIST)" : ""), /* end of COMPILER FLAGS */ (makefile->use_runtime_2 ? "-rt2" : ""), /* TTCN3_LIB */ (makefile->single_mode ? "" : "-parallel"), (makefile->dynamic ? "-dynamic": "") +#ifdef LICENSE + ,(makefile->disable_predef_ext_folder ? "# " : "") +#endif ); if (!makefile->gnu_make) { fputs("# Note: you can set any directory except ./archive\n", fp); @@ -3719,8 +3726,8 @@ static void generate_makefile(size_t n_arguments, char *arguments[], const char* cxxcompiler, const char* optlevel, const char* optflags, boolean disableber, boolean disableraw, boolean disabletext, boolean disablexer, boolean disablejson, boolean forcexerinasn, boolean defaultasomit, boolean gccmsgformat, boolean linenumbersonlymsg, boolean includesourceinfo, boolean addsourcelineinfo, boolean suppresswarnings, - boolean outparamboundness, boolean omit_in_value_list, struct string_list* solspeclibraries, struct string_list* sol8speclibraries, - struct string_list* linuxspeclibraries, struct string_list* freebsdspeclibraries, + boolean outparamboundness, boolean omit_in_value_list, boolean warnings_for_bad_variants, boolean disable_predef_ext_folder, struct string_list* solspeclibraries, + struct string_list* sol8speclibraries, struct string_list* linuxspeclibraries, struct string_list* freebsdspeclibraries, struct string_list* win32speclibraries, const char* ttcn3preprocessor, struct string_list* linkerlibraries, struct string_list* additionalObjects, struct string_list* linkerlibsearchpath, char* generatorCommandOutput, struct string2_list* target_placement_list) @@ -3770,6 +3777,8 @@ static void generate_makefile(size_t n_arguments, char *arguments[], makefile.suppresswarnings = suppresswarnings; makefile.outparamboundness = outparamboundness; makefile.omit_in_value_list = omit_in_value_list; + makefile.warnings_for_bad_variants = warnings_for_bad_variants; + makefile.disable_predef_ext_folder = disable_predef_ext_folder; makefile.solspeclibraries = solspeclibraries; makefile.sol8speclibraries = sol8speclibraries; makefile.linuxspeclibraries = linuxspeclibraries; @@ -3904,7 +3913,7 @@ static void generate_makefile(size_t n_arguments, char *arguments[], static void usage(void) { fprintf(stderr, "\n" - "usage: %s [-abc" C_flag "dDfFglLmMprRstTVwWXZ] [-K file] [-z file ] [-P dir]" + "usage: %s [-abc" C_flag "dDEfFglLmMprRstTVwWXZ] [-K file] [-z file ] [-P dir]" " [-U none|type] [-e ets_name] [-o dir|file]\n" " [-t project_descriptor.tpd [-b buildconfig]]\n" " [-O file] ... module_name ... testport_name ...\n" @@ -3918,8 +3927,10 @@ static void usage(void) #endif " -d: dump the data used for Makefile generation\n" " -e ets_name: name of the target executable\n" + " -E: display only warnings for unrecognized encoding variants\n" " -f: force overwriting of the output Makefile\n" " -g: generate Makefile for use with GNU make\n" + " -I path: Add path to the search paths when using TPD files\n" " -K file: enable selective code coverage\n" " -l: use dynamic linking\n" " -L: create makefile with library archive as the default target\n" @@ -3992,7 +4003,7 @@ int main(int argc, char *argv[]) gfflag = FALSE, lnflag = FALSE, isflag = FALSE, asflag = FALSE, swflag = FALSE, Vflag = FALSE, Dflag = FALSE, Wflag = FALSE, djflag = FALSE, Zflag = FALSE, Hflag = FALSE, Mflag = FALSE, - zflag = FALSE; + diflag = FALSE, zflag = FALSE, Eflag = FALSE; boolean error_flag = FALSE; char *output_file = NULL; char *ets_name = NULL; @@ -4003,6 +4014,8 @@ int main(int argc, char *argv[]) const char *tpd_file_name = NULL; const char *tpd_build_config = NULL; const char *tcov_file_name = NULL; + size_t n_search_paths = 0; + const char **search_paths = NULL; struct string_list* profiled_file_list = NULL; const char *profiled_file_list_zflag = NULL; const char *file_list_path = NULL; @@ -4047,7 +4060,7 @@ int main(int argc, char *argv[]) } for ( ; ; ) { - int c = getopt(argc, argv, "O:ab:c" C_flag "dDe:fFgK:o:lLmMpP:rRst:TU:vVwWXYz:ZH"); + int c = getopt(argc, argv, "O:ab:c" C_flag "dDe:EfFgI:K:o:lLmMpP:rRst:TU:vVwWXYz:ZH"); if (c == -1) break; switch (c) { case 'O': @@ -4056,6 +4069,12 @@ int main(int argc, char *argv[]) Realloc(other_files, n_other_files * sizeof(*other_files)); other_files[n_other_files - 1] = optarg; break; + case 'I': + n_search_paths++; + search_paths = (const char**) + Realloc(search_paths, n_search_paths * sizeof(*search_paths)); + search_paths[n_search_paths - 1] = optarg; + break; case 'a': SET_FLAG(a); break; @@ -4085,6 +4104,9 @@ int main(int argc, char *argv[]) SET_FLAG(e); ets_name = optarg; break; + case 'E': + SET_FLAG(E); + break; case 'f': SET_FLAG(f); break; @@ -4189,7 +4211,7 @@ int main(int argc, char *argv[]) if ( aflag || bflag || cflag || Cflag || dflag || eflag || fflag || Fflag || gflag || mflag || oflag || lflag || pflag || Pflag || rflag || Rflag || sflag || tflag || Tflag || Vflag || wflag || Xflag || Kflag || Dflag || Wflag || Yflag - || Zflag || Hflag || Mflag || zflag || n_other_files > 0) + || Zflag || Hflag || Mflag || zflag || Eflag || n_other_files > 0 || n_search_paths > 0) error_flag = TRUE; } @@ -4239,6 +4261,30 @@ int main(int argc, char *argv[]) error_flag = TRUE; } + if (n_search_paths > 0 && !tflag) { + ERROR("Using the '-I' option requires use of the '-t' option."); + error_flag = TRUE; + } + + for (size_t i = 0; i < n_search_paths; i++) { + boolean is_abs_path = +#if defined WIN32 && defined MINGW + /* On native Windows the absolute path name shall begin with + * a drive letter, colon and backslash */ + (((search_paths[i][0] < 'A' || search_paths[i][0] > 'Z') && + (search_paths[i][0] < 'a' || search_paths[i][0] > 'z')) || + search_paths[i][1] != ':' || search_paths[i][2] != '\\'); +#else + /* On UNIX-like systems the absolute path name shall begin with + * a slash */ + search_paths[i][0] != '/'; +#endif + if (is_abs_path) { + ERROR("The path after the -I flag must be an absolute path."); + error_flag = TRUE; + } + } + if (error_flag) { usage(); return EXIT_FAILURE; @@ -4351,9 +4397,9 @@ int main(int argc, char *argv[]) &Rflag, &lflag, &mflag, &Pflag, &Lflag, rflag, Fflag, Tflag, output_file, &abs_work_dir, sub_project_dirs, program_name, prj_graph_fp, create_symlink_list,ttcn3_prep_includes, ttcn3_prep_defines,ttcn3_prep_undefines, prep_includes, prep_defines, prep_undefines, &csflag, &quflag, &dsflag, &cxxcompiler, &optlevel, &optflags, &dbflag, &drflag, &dtflag, &dxflag, &djflag, &fxflag, &doflag, &gfflag, &lnflag, &isflag, - &asflag, &swflag, &Yflag, &Mflag, solspeclibraries, sol8speclibraries, linuxspeclibraries, freebsdspeclibraries, win32speclibraries, &ttcn3prep, + &asflag, &swflag, &Yflag, &Mflag, &Eflag, &diflag, solspeclibraries, sol8speclibraries, linuxspeclibraries, freebsdspeclibraries, win32speclibraries, &ttcn3prep, linkerlibraries, additionalObjects, linkerlibsearchpath, Vflag, Dflag, &Zflag, &Hflag, - &generatorCommandOutput, target_placement_list, Wflag, run_command_list, required_configs, &profiled_file_list); + &generatorCommandOutput, target_placement_list, Wflag, run_command_list, required_configs, &profiled_file_list, search_paths, n_search_paths); Free(abs_work_dir); if (prj_graph_fp) { @@ -4390,7 +4436,7 @@ int main(int argc, char *argv[]) Rflag, lflag, mflag, Cflag, code_splitting_mode, tcov_file_name, profiled_file_list, Lflag, Zflag, Hflag, rflag ? sub_project_dirs : NULL, ttcn3_prep_includes, ttcn3_prep_defines, ttcn3_prep_undefines, prep_includes, prep_defines, prep_undefines, csflag, quflag, dsflag, cxxcompiler, optlevel, optflags, dbflag, - drflag, dtflag, dxflag, djflag, fxflag, doflag, gfflag, lnflag, isflag, asflag, swflag, Yflag, Mflag, solspeclibraries, + drflag, dtflag, dxflag, djflag, fxflag, doflag, gfflag, lnflag, isflag, asflag, swflag, Yflag, Mflag, Eflag, diflag, solspeclibraries, sol8speclibraries, linuxspeclibraries, freebsdspeclibraries, win32speclibraries, ttcn3prep, linkerlibraries, additionalObjects, linkerlibsearchpath, generatorCommandOutput, target_placement_list); } @@ -4412,6 +4458,8 @@ int main(int argc, char *argv[]) free_string_list(linkerlibsearchpath); free_string_list(profiled_file_list); + Free(search_paths); + Free(generatorCommandOutput); free_string2_list(target_placement_list); free_string2_list(required_configs); diff --git a/compiler2/record.c b/compiler2/record.c index 1a029b9c3..1eecf4c7b 100644 --- a/compiler2/record.c +++ b/compiler2/record.c @@ -190,7 +190,6 @@ char* generate_raw_coding(char* src, "p_td, TTCN_Buffer& p_buf, int limit, raw_order_t top_bit_ord, " "boolean, int, boolean)\n" "{\n" - "bound_flag = TRUE;\n" "int prepaddlength = p_buf.increase_pos_padd(p_td.raw->prepadding);\n" "limit -= prepaddlength;\n" "int decoded_length = 0;\n" @@ -421,7 +420,6 @@ char* generate_raw_coding(char* src, "TTCN_Buffer& p_buf, int limit, raw_order_t top_bit_ord, boolean no_err, " "int, boolean)\n" "{ (void)no_err;\n" - " bound_flag = TRUE;\n" " int prepaddlength=p_buf.increase_pos_padd(p_td.raw->prepadding);\n" " limit-=prepaddlength;\n" " size_t last_decoded_pos = p_buf.get_pos_bit();\n" @@ -1965,7 +1963,7 @@ void gen_xer(const struct_def *sdef, char **pdef, char **psrc) " p_buf.put_s((size_t)p_td.namelens[e_xer]%s-(!is_indented%s), " "(cbyte*)p_td.names[e_xer]);\n" " }\n" - " else if (p_flavor & USE_TYPE_ATTR) {\n" + " else if (p_flavor & (USE_NIL|USE_TYPE_ATTR)) {\n" " size_t buf_len = p_buf.get_len();\n" " const unsigned char * const buf_data = p_buf.get_data();\n" " if (buf_data[buf_len-1-chopped_chars] == '\\n') ++chopped_chars;\n" @@ -2082,7 +2080,7 @@ void gen_xer(const struct_def *sdef, char **pdef, char **psrc) , sdef->elements[sdef->nElements-1].name ); } - + if (want_namespaces) { /* there were some attributes. close the start tag left open */ src = mputprintf(src, @@ -2366,9 +2364,8 @@ void gen_xer(const struct_def *sdef, char **pdef, char **psrc) src = mputprintf(src, /* XERSTUFF decodegen for record/SEQUENCE*/ "int %s::XER_decode(const XERdescriptor_t& p_td, XmlReaderWrap& p_reader," - " unsigned int p_flavor, embed_values_dec_struct_t*)\n" + " unsigned int p_flavor, unsigned int p_flavor2, embed_values_dec_struct_t*)\n" "{\n" - " bound_flag = TRUE;\n" /* Remove XER_LIST, XER_RECOF from p_flavor. This is not required * for is_exer (which tests another bit), but for subsequent code. */ " int e_xer = is_exer(p_flavor);\n" @@ -2377,9 +2374,10 @@ void gen_xer(const struct_def *sdef, char **pdef, char **psrc) " const boolean omit_tag = e_xer && ((xerbits & (UNTAGGED|XER_ATTRIBUTE)) " "|| (p_flavor & (USE_NIL|USE_TYPE_ATTR)));\n" "%s" - " const boolean parent_tag = e_xer && (p_flavor & (USE_TYPE_ATTR));\n" + " const boolean parent_tag = e_xer && ((p_flavor & USE_TYPE_ATTR)|| (p_flavor2 & USE_NIL_PARENT_TAG));\n" " (void)parent_tag;\n" " p_flavor &= XER_MASK;\n" /* also removes "toplevel" bit */ + " p_flavor2 = XER_NONE;\n" /* Remove only bit: USE_NIL_PARENT_TAG (for now) */ " int rd_ok, xml_depth=-1, type;\n" " {\n" /* scope for the error contexts */ , name @@ -2389,8 +2387,10 @@ void gen_xer(const struct_def *sdef, char **pdef, char **psrc) * or if EMBED-VALUES is possible, but isn't. */ ); - if (sdef->xerUseNilPossible) src = mputstr(src, - " boolean nil_attribute = FALSE;\n"); + if (sdef->xerUseNilPossible) { src = mputstr(src, + " boolean nil_attribute = FALSE;\n" + " boolean already_processed = FALSE;\n"); + } src = mputprintf(src, " TTCN_EncDec_ErrorContext ec_0(\"Component '\");\n" @@ -2449,12 +2449,11 @@ void gen_xer(const struct_def *sdef, char **pdef, char **psrc) /* ******************************************************************** * ATTRIBUTES - ***************************/ + ***************************/ if (num_attributes || sdef->xerUseNilPossible /* maybe QNAME too ? */) { size_t aaa; - src = mputstr(src, " if (!omit_tag || parent_tag) {\n"); - /* Prepare for attributes not present in the XML. + /* Prepare for attributes not present in the XML. * Set all attributes with defaultForEmpty to the D-F-E value. * Set all optional components with ATTRIBUTE to omit. * @@ -2477,6 +2476,8 @@ void gen_xer(const struct_def *sdef, char **pdef, char **psrc) , sdef->elements[aaa].isOptional ? " = OMIT_VALUE" : ".set_size(0)"); } } + + src = mputstr(src, " if (!omit_tag || parent_tag) {\n"); if (num_attributes==0 /* therefore sdef->xerUseNilPossible is true */ ) { /* Only the "nil" attribute may be present. If there is no USE-NIL, @@ -2492,7 +2493,12 @@ void gen_xer(const struct_def *sdef, char **pdef, char **psrc) } src = mputstr(src, - " for (rd_ok = p_reader.MoveToFirstAttribute(); rd_ok==1 && " + " if(parent_tag && p_reader.NodeType() == XML_READER_TYPE_ATTRIBUTE) {\n" + " rd_ok = p_reader.Ok();\n" + " } else {\n" + " rd_ok = p_reader.MoveToFirstAttribute();\n" + " }\n" + " for (; rd_ok==1 && " "p_reader.NodeType()==XML_READER_TYPE_ATTRIBUTE; " "rd_ok = p_reader.AdvanceAttribute()) {\n" " if (p_reader.IsNamespaceDecl()) continue;\n"); @@ -2525,13 +2531,24 @@ void gen_xer(const struct_def *sdef, char **pdef, char **psrc) src = mputprintf(src, " if (check_name(attr_name, %s_xer_, 1) && check_namespace(ns_uri, %s_xer_)) {\n" " ec_1.set_msg(\"%s': \");\n" - " field_%s.XER_decode(%s_xer_, p_reader, p_flavor | (p_td.xer_bits & USE_NIL), 0);\n" + " field_%s.XER_decode(%s_xer_, p_reader, p_flavor | (p_td.xer_bits & USE_NIL), p_flavor2, 0);\n" " } else" , sdef->elements[i].typegen, sdef->elements[i].typegen , sdef->elements[i].dispname /* set_msg */ , sdef->elements[i].name, sdef->elements[i].typegen ); } + + if(sdef->xerUseNilPossible) { + src = mputprintf(src, + " if(p_td.xer_bits & USE_NIL) {\n" + " field_%s.XER_decode(%s_xer_, p_reader, p_flavor | USE_NIL, p_flavor2 | USE_NIL_PARENT_TAG, 0);\n" + " already_processed = TRUE;\n" + " } else" + , sdef->elements[sdef->nElements-1].name + , sdef->elements[sdef->nElements-1].typegen + ); + } if (sdef->control_ns_prefix && !(num_attributes==1 && aa_index!=-1)) { src = mputprintf(src, @@ -2617,7 +2634,7 @@ void gen_xer(const struct_def *sdef, char **pdef, char **psrc) " if (!(p_td.xer_bits & EMBED_VALUES)) {\n" " ec_1.set_msg(\"%s': \");\n" " field_%s.XER_decode(%s_xer_, p_reader, " - "p_flavor | (p_td.xer_bits & USE_NIL)| (tag_closed ? PARENT_CLOSED : XER_NONE), 0);\n" + "p_flavor | (p_td.xer_bits & USE_NIL)| (tag_closed ? PARENT_CLOSED : XER_NONE), p_flavor2, 0);\n" " }\n" , sdef->elements[0].dispname , sdef->elements[0].name, sdef->elements[0].typegen @@ -2651,7 +2668,7 @@ void gen_xer(const struct_def *sdef, char **pdef, char **psrc) src = mputprintf(src, " {\n" " ec_1.set_msg(\"%s': \");\n" - " field_%s.XER_decode(%s_xer_, p_reader, p_flavor | (p_td.xer_bits & USE_NIL), 0);\n" + " field_%s.XER_decode(%s_xer_, p_reader, p_flavor | (p_td.xer_bits & USE_NIL), p_flavor2, 0);\n" " }\n" , sdef->elements[i].dispname , sdef->elements[i].name, sdef->elements[i].typegen @@ -2777,7 +2794,7 @@ void gen_xer(const struct_def *sdef, char **pdef, char **psrc) src = mputprintf(src, " if (check_name(x_name, %s_xer_, 1)) {\n" " ec_1.set_msg(\"%s': \");\n" - " field_%s%s%s%s.XER_decode(%s_xer_, p_reader, p_flavor, %s);\n" + " field_%s%s%s%s.XER_decode(%s_xer_, p_reader, p_flavor, p_flavor2, %s);\n" , sdef->elements[i].typegen , sdef->elements[i].dispname , (sdef->xerUseNilPossible ? sdef->elements[sdef->nElements-1].name: sdef->elements[i].name) @@ -2814,7 +2831,7 @@ void gen_xer(const struct_def *sdef, char **pdef, char **psrc) " }\n" " if (!next_any) {\n" " ec_1.set_msg(\"%s': \");\n" - " field_%s%s%s%s.XER_decode(%s_xer_, p_reader, p_flavor, 0);\n" + " field_%s%s%s%s.XER_decode(%s_xer_, p_reader, p_flavor, p_flavor2, 0);\n" " field_%s[i] = e_val;\n" " any_found = true;\n" " }\n" @@ -2921,8 +2938,9 @@ void gen_xer(const struct_def *sdef, char **pdef, char **psrc) " if (e_xer && p_td.dfeValue && p_reader.IsEmptyElement()) {\n" " field_%s = *static_cast<const %s*>(p_td.dfeValue);\n" " }\n" - " else" - , sdef->elements[i].name, sdef->elements[i].type); + " else%s" + , sdef->elements[i].name, sdef->elements[i].type + , sdef->xerUseNilPossible ? " if (!already_processed)" : ""); } /* Decode the field */ src = mputprintf(src, @@ -2946,7 +2964,7 @@ void gen_xer(const struct_def *sdef, char **pdef, char **psrc) src = mputprintf(src, " field_%s.XER_decode(%s_xer_, p_reader, p_flavor" - " | (p_td.xer_bits & USE_NIL)| (tag_closed ? PARENT_CLOSED : XER_NONE), %s);\n" + " | (p_td.xer_bits & USE_NIL)| (tag_closed ? PARENT_CLOSED : XER_NONE), p_flavor2, %s);\n" " }\n" , sdef->elements[i].name, sdef->elements[i].typegen , sdef->xerEmbedValuesPossible ? "emb_val" : "0"); @@ -3111,7 +3129,6 @@ void defRecordClass1(const struct_def *sdef, output_struct *output) def=mputprintf(def, "class %s {\n", name); } - /* fields */ for (i = 0; i < sdef->nElements; i++) { if(sdef->elements[i].isOptional) def = mputprintf(def, " OPTIONAL<%s> field_%s;\n", @@ -3121,16 +3138,12 @@ void defRecordClass1(const struct_def *sdef, output_struct *output) def = mputprintf(def, " %s field_%s;\n", sdef->elements[i].type, sdef->elements[i].name); } - - /* bound flag */ - def = mputstr(def, " boolean bound_flag;\n"); /* default constructor */ def = mputprintf(def, "public:\n" " %s();\n", name); src = mputprintf(src, "%s::%s()\n" "{\n" - " bound_flag = FALSE;\n" "}\n\n", name, name); /* constructor by fields */ @@ -3164,7 +3177,6 @@ void defRecordClass1(const struct_def *sdef, output_struct *output) } src = mputstr(src, "\n" "{\n" - " bound_flag = TRUE;\n" "}\n\n"); /* copy constructor */ @@ -3172,8 +3184,7 @@ void defRecordClass1(const struct_def *sdef, output_struct *output) src = mputprintf(src, "%s::%s(const %s& other_value)\n" "{\n" "if(!other_value.is_bound()) " - "TTCN_error(\"Copying an unbound value of type %s.\");\n" - "bound_flag = TRUE;\n", + "TTCN_error(\"Copying an unbound value of type %s.\");\n", name, name, name, dispname); for (i = 0; i < sdef->nElements; i++) { src = mputprintf(src, @@ -3196,7 +3207,6 @@ void defRecordClass1(const struct_def *sdef, output_struct *output) "field_%s.clean_up();\n", sdef->elements[i].name); } src = mputstr(src, - "bound_flag = FALSE;\n" "}\n\n"); /* = operator */ @@ -3205,8 +3215,7 @@ void defRecordClass1(const struct_def *sdef, output_struct *output) "{\n" "if (this != &other_value) {\n" " if(!other_value.is_bound()) " - "TTCN_error(\"Assignment of an unbound value of type %s.\");\n" - " bound_flag = TRUE;\n", + "TTCN_error(\"Assignment of an unbound value of type %s.\");\n", name, name, name, dispname); for (i = 0; i < sdef->nElements; i++) { src = mputprintf(src, @@ -3226,7 +3235,6 @@ void defRecordClass1(const struct_def *sdef, output_struct *output) src = mputprintf(src, "boolean %s::operator==(const %s& other_value) const\n" "{\n" - "if (!is_bound() && !other_value.is_bound()) return TRUE;\n" "return ", name, name); for (i = 0; i < sdef->nElements; i++) { if (i > 0) src = mputstr(src, "\n && "); @@ -3245,8 +3253,7 @@ void defRecordClass1(const struct_def *sdef, output_struct *output) " boolean is_bound() const;\n\n"); src = mputprintf(src, "boolean %s::is_bound() const\n" - "{\n" - "if (bound_flag) return TRUE;\n", name); + "{\n", name); for(i=0; i < sdef->nElements; i++) { if(sdef->elements[i].isOptional) { src = mputprintf(src, @@ -3271,8 +3278,7 @@ void defRecordClass1(const struct_def *sdef, output_struct *output) " boolean is_value() const;\n\n"); src = mputprintf(src, "boolean %s::is_value() const\n" - "{\n" - "if (!is_bound()) return FALSE;\n", name); + "{\n", name); for(i=0; i < sdef->nElements; i++) { if(sdef->elements[i].isOptional) { src = mputprintf(src, @@ -3316,18 +3322,17 @@ void defRecordClass1(const struct_def *sdef, output_struct *output) mandatory_fields_count = 0; for (i = 0; i < sdef->nElements; i++) if (!sdef->elements[i].isOptional) mandatory_fields_count++; - - def = mputstr(def, " int size_of() const;\n"); - src = mputprintf(src, - "int %s::size_of() const\n" - "{\n" - " if (!is_bound()) " - "TTCN_error(\"Calculating the size of an unbound record/set value of type %s\");\n" - , name, dispname); - if (sdef->nElements == mandatory_fields_count) { - src = mputprintf(src, " return %lu;\n", (unsigned long) mandatory_fields_count); - } - else { + + if(sdef->nElements == mandatory_fields_count){ + def = mputprintf(def, + " inline int size_of() const\n" + " {return %lu;}\n", (unsigned long) mandatory_fields_count); + }else{ + def = mputstr(def, " int size_of() const;\n"); + src = mputprintf(src, + "int %s::size_of() const\n" + "{\n", + name); src = mputprintf(src, " int ret_val = %lu;\n", (unsigned long) mandatory_fields_count); for (i = 0; i < sdef->nElements; i++) @@ -3335,9 +3340,10 @@ void defRecordClass1(const struct_def *sdef, output_struct *output) src = mputprintf(src, " if (field_%s.ispresent()) ret_val++;\n", sdef->elements[i].name); - src = mputstr(src, " return ret_val;\n"); + src = mputstr(src, + " return ret_val;\n" + "}\n\n"); } - src = mputstr(src, "}\n\n"); /* log function */ def = mputstr(def, " void log() const;\n"); @@ -3362,7 +3368,6 @@ void defRecordClass1(const struct_def *sdef, output_struct *output) src = mputprintf (src, "void %s::set_param(Module_Param& param)\n{\n" - " bound_flag = TRUE;\n" " if (dynamic_cast<Module_Param_Name*>(param.get_id()) != NULL &&\n" " param.get_id()->next_name()) {\n" // Haven't reached the end of the module parameter name @@ -3491,11 +3496,8 @@ void defRecordClass1(const struct_def *sdef, output_struct *output) /* text encoder function */ def = mputstr(def, " void encode_text(Text_Buf& text_buf) const;\n"); - src = mputprintf(src, - "void %s::encode_text(Text_Buf& text_buf) const\n{\n" - "if (!is_bound()) " - "TTCN_error(\"Text encoder: Encoding an unbound record/set value of type %s.\");\n" - , name, dispname); + src = mputprintf(src,"void %s::encode_text(Text_Buf& text_buf) const\n{\n", + name); for (i = 0; i < sdef->nElements; i++) { src = mputprintf(src, "field_%s.encode_text(text_buf);\n", sdef->elements[i].name); @@ -3504,9 +3506,8 @@ void defRecordClass1(const struct_def *sdef, output_struct *output) /* text decoder function */ def = mputstr(def, " void decode_text(Text_Buf& text_buf);\n"); - src = mputprintf(src, - "void %s::decode_text(Text_Buf& text_buf)\n{\n" - "bound_flag = TRUE;\n", name); + src = mputprintf(src, "void %s::decode_text(Text_Buf& text_buf)\n{\n", + name); for (i = 0; i < sdef->nElements; i++) { src = mputprintf(src, "field_%s.decode_text(text_buf);\n", sdef->elements[i].name); @@ -3580,7 +3581,6 @@ void defRecordClass1(const struct_def *sdef, output_struct *output) "boolean %s::BER_decode_TLV(const TTCN_Typedescriptor_t& p_td," " const ASN_BER_TLV_t& p_tlv, unsigned L_form)\n" "{\n" - " bound_flag = TRUE;\n" " BER_chk_descr(p_td);\n" " ASN_BER_TLV_t stripped_tlv;\n" " BER_decode_strip_tags(*p_td.ber, p_tlv, L_form, stripped_tlv);\n" @@ -3782,7 +3782,6 @@ void defRecordClass1(const struct_def *sdef, output_struct *output) "void %s::BER_decode_opentypes(TTCN_Type_list& p_typelist," " unsigned L_form)\n" "{\n" - " bound_flag = TRUE;\n" " p_typelist.push(this);\n" " TTCN_EncDec_ErrorContext ec_0(\"Component '\");\n" " TTCN_EncDec_ErrorContext ec_1;\n" @@ -3869,7 +3868,6 @@ void defRecordClass1(const struct_def *sdef, output_struct *output) src = mputprintf(src, "int %s::TEXT_decode(const TTCN_Typedescriptor_t& p_td," " TTCN_Buffer& p_buf, Limit_Token_List& limit, boolean no_err, boolean){\n" - " bound_flag = TRUE;\n" " int decoded_length=0;\n" " int decoded_field_length=0;\n" " size_t pos=p_buf.get_pos();\n" @@ -4135,7 +4133,6 @@ void defRecordClass1(const struct_def *sdef, output_struct *output) src = mputprintf(src, "int %s::TEXT_decode(const TTCN_Typedescriptor_t& p_td," " TTCN_Buffer& p_buf, Limit_Token_List& limit, boolean no_err, boolean){\n" - " bound_flag = TRUE;\n" " int decoded_length=0;\n" " int decoded_field_length=0;\n" "%s" @@ -4418,10 +4415,10 @@ void defRecordClass1(const struct_def *sdef, output_struct *output) " else if (JSON_TOKEN_OBJECT_START != j_token) {\n" " return JSON_ERROR_INVALID_TOKEN;\n" " }\n" - " bound_flag = TRUE;\n\n" , name); boolean has_metainfo_enabled = FALSE; for (i = 0; i < sdef->nElements; ++i) { + src = mputprintf(src, " boolean %s_found = FALSE;\n", sdef->elements[i].name); if (sdef->elements[i].jsonMetainfoUnbound) { // initialize meta info states src = mputprintf(src, @@ -4461,8 +4458,10 @@ void defRecordClass1(const struct_def *sdef, output_struct *output) src = mputprintf(src, // check field name "if (%d == name_len && 0 == strncmp(fld_name, \"%s\", name_len)) {\n" + " %s_found = TRUE;\n" , (int)strlen(sdef->elements[i].jsonAlias ? sdef->elements[i].jsonAlias : sdef->elements[i].dispname) - , sdef->elements[i].jsonAlias ? sdef->elements[i].jsonAlias : sdef->elements[i].dispname); + , sdef->elements[i].jsonAlias ? sdef->elements[i].jsonAlias : sdef->elements[i].dispname + , sdef->elements[i].name); if (has_metainfo_enabled) { src = mputstr(src, " if (is_metainfo) {\n"); if (sdef->elements[i].jsonMetainfoUnbound) { @@ -4571,7 +4570,7 @@ void defRecordClass1(const struct_def *sdef, output_struct *output) , sdef->elements[i].name, sdef->elements[i].dispname); } src = mputprintf(src, - "if (!field_%s.is_bound()) {\n" + "if (!%s_found) {\n" , sdef->elements[i].name); if (sdef->elements[i].jsonDefaultValue) { src = mputprintf(src, @@ -6145,7 +6144,7 @@ static void defEmptyRecordClass(const struct_def *sdef, "// written by %s in " __FILE__ " at %d\n" #endif "int %s::XER_decode(const XERdescriptor_t& p_td, XmlReaderWrap& p_reader, " - "unsigned int p_flavor, embed_values_dec_struct_t*)\n" + "unsigned int p_flavor, unsigned int /*p_flavor2*/, embed_values_dec_struct_t*)\n" "{\n" " int e_xer = is_exer(p_flavor);\n" " bound_flag = true;\n" @@ -6824,8 +6823,7 @@ void defRecordClass2(const struct_def *sdef, output_struct *output) src = mputprintf(src, "%s::%s(const %s& other_value) : Record_Type(other_value)\n", name, name, name); src = mputstr(src, "{\n" " if(!other_value.is_bound()) " - "TTCN_error(\"Copying an unbound record/set value.\");\n" - "bound_flag = TRUE;\n"); + "TTCN_error(\"Copying an unbound record/set value.\");\n"); for (i = 0; i < sdef->nElements; i++) { src = mputprintf(src, "if (other_value.field_%s.is_bound() )\n" @@ -6870,7 +6868,6 @@ void defRecordClass2(const struct_def *sdef, output_struct *output) src = mputstr(src, "\n" "{\n" "init_vec();\n" - "bound_flag = TRUE;\n" "}\n\n"); } else { /* constructor from null */ def = mputprintf(def, " %s(null_type) {bound_flag = TRUE;}\n", name); diff --git a/compiler2/record_of.c b/compiler2/record_of.c index e72d8d99e..8ac681cd3 100644 --- a/compiler2/record_of.c +++ b/compiler2/record_of.c @@ -1373,7 +1373,7 @@ void defRecordOfClass1(const struct_of_def *sdef, output_struct *output) "// written by %s in " __FILE__ " at %d\n" #endif "int %s::XER_decode(const XERdescriptor_t& p_td, XmlReaderWrap& p_reader, " - "unsigned int p_flavor, embed_values_dec_struct_t* emb_val)\n{\n" + "unsigned int p_flavor, unsigned int p_flavor2, embed_values_dec_struct_t* emb_val)\n{\n" " boolean e_xer = is_exer(p_flavor);\n" " int xerbits = p_td.xer_bits;\n" " if (p_flavor & XER_TOPLEVEL) xerbits &= ~UNTAGGED;\n" @@ -1453,7 +1453,7 @@ void defRecordOfClass1(const struct_of_def *sdef, output_struct *output) /* Don't move to the #text, that's the callee's responsibility. */ /* The call to the non-const operator[] creates a new element object, * then we call its XER_decode with the temporary XML reader. */ - " (*this)[val_ptr->n_elements].XER_decode(*p_td.oftype_descr, reader_2, p_flavor, 0);\n" + " (*this)[val_ptr->n_elements].XER_decode(*p_td.oftype_descr, reader_2, p_flavor, p_flavor2, 0);\n" " if (p_flavor & EXIT_ON_ERROR && !(*this)[val_ptr->n_elements - 1].is_bound()) {\n" " if (1 == val_ptr->n_elements) {\n" // Failed to decode even the first element @@ -1515,10 +1515,10 @@ void defRecordOfClass1(const struct_of_def *sdef, output_struct *output) " }\n" " ec_1.set_msg(\"%d: \", val_ptr->n_elements);\n" /* The call to the non-const operator[] creates the element */ - " (*this)[val_ptr->n_elements].XER_decode(*p_td.oftype_descr, p_reader, p_flavor, emb_val);\n" - " if (0 != emb_val && !own_tag && val_ptr->n_elements > 1) {\n" - " ++emb_val->embval_index;\n" - " }\n" + " (*this)[val_ptr->n_elements].XER_decode(*p_td.oftype_descr, p_reader, p_flavor, p_flavor2, emb_val);\n" + " }\n" + " if (0 != emb_val && !own_tag && val_ptr->n_elements > 1) {\n" + " ++emb_val->embval_index;\n" " }\n" " }\n" " else if (XML_READER_TYPE_END_ELEMENT == type) {\n" @@ -1563,10 +1563,19 @@ void defRecordOfClass1(const struct_of_def *sdef, output_struct *output) " return -1;\n" " }\n\n" " int enc_len = p_tok.put_next_token(JSON_TOKEN_ARRAY_START, NULL);\n" - " for(int i = 0; i < val_ptr->n_elements; ++i) {\n" - " int ret_val = (*this)[i].JSON_encode(*p_td.oftype_descr, p_tok);\n" - " if (0 > ret_val) break;\n" - " enc_len += ret_val;\n" + " for (int i = 0; i < val_ptr->n_elements; ++i) {\n" + " if (NULL != p_td.json && p_td.json->metainfo_unbound && !(*this)[i].is_bound()) {\n" + // unbound elements are encoded as { "metainfo []" : "unbound" } + " enc_len += p_tok.put_next_token(JSON_TOKEN_OBJECT_START, NULL);\n" + " enc_len += p_tok.put_next_token(JSON_TOKEN_NAME, \"metainfo []\");\n" + " enc_len += p_tok.put_next_token(JSON_TOKEN_STRING, \"\\\"unbound\\\"\");\n" + " enc_len += p_tok.put_next_token(JSON_TOKEN_OBJECT_END, NULL);\n" + " }\n" + " else {\n" + " int ret_val = (*this)[i].JSON_encode(*p_td.oftype_descr, p_tok);\n" + " if (0 > ret_val) break;\n" + " enc_len += ret_val;\n" + " }\n" " }\n" " enc_len += p_tok.put_next_token(JSON_TOKEN_ARRAY_END, NULL);\n" " return enc_len;\n" @@ -1587,10 +1596,34 @@ void defRecordOfClass1(const struct_of_def *sdef, output_struct *output) " return JSON_ERROR_INVALID_TOKEN;\n" " }\n\n" " set_size(0);\n" - " while (true) {\n" + " for (int nof_elements = 0; true; ++nof_elements) {\n" " size_t buf_pos = p_tok.get_buf_pos();\n" + " int ret_val;\n" + " if (NULL != p_td.json && p_td.json->metainfo_unbound) {\n" + // check for metainfo object + " ret_val = p_tok.get_next_token(&token, NULL, NULL);\n" + " if (JSON_TOKEN_OBJECT_START == token) {\n" + " char* value = NULL;\n" + " size_t value_len = 0;\n" + " ret_val += p_tok.get_next_token(&token, &value, &value_len);\n" + " if (JSON_TOKEN_NAME == token && 11 == value_len &&\n" + " 0 == strncmp(value, \"metainfo []\", 11)) {\n" + " ret_val += p_tok.get_next_token(&token, &value, &value_len);\n" + " if (JSON_TOKEN_STRING == token && 9 == value_len &&\n" + " 0 == strncmp(value, \"\\\"unbound\\\"\", 9)) {\n" + " ret_val = p_tok.get_next_token(&token, NULL, NULL);\n" + " if (JSON_TOKEN_OBJECT_END == token) {\n" + " dec_len += ret_val;\n" + " continue;\n" + " }\n" + " }\n" + " }\n" + " }\n" + // metainfo object not found, jump back and let the element type decode it + " p_tok.set_buf_pos(buf_pos);\n" + " }\n" " %s* val = new %s;\n" - " int ret_val = val->JSON_decode(*p_td.oftype_descr, p_tok, p_silent);\n" + " ret_val = val->JSON_decode(*p_td.oftype_descr, p_tok, p_silent);\n" " if (JSON_ERROR_INVALID_TOKEN == ret_val) {\n" " p_tok.set_buf_pos(buf_pos);\n" " delete val;\n" @@ -1604,9 +1637,9 @@ void defRecordOfClass1(const struct_of_def *sdef, output_struct *output) " return JSON_ERROR_FATAL;\n" " }\n" " val_ptr->value_elements = (%s**)reallocate_pointers(\n" - " (void**)val_ptr->value_elements, val_ptr->n_elements, val_ptr->n_elements + 1);\n" - " val_ptr->value_elements[val_ptr->n_elements] = val;\n" - " val_ptr->n_elements++;\n" + " (void**)val_ptr->value_elements, val_ptr->n_elements, nof_elements + 1);\n" + " val_ptr->value_elements[nof_elements] = val;\n" + " val_ptr->n_elements = nof_elements + 1;\n" " dec_len += ret_val;\n" " }\n\n" " dec_len += p_tok.get_next_token(&token, NULL, NULL);\n" @@ -2849,7 +2882,7 @@ void defRecordOfClassMemAllocOptimized(const struct_of_def *sdef, output_struct "// written by %s in " __FILE__ " at %d\n" #endif "int %s::XER_decode(const XERdescriptor_t& p_td, XmlReaderWrap& p_reader, " - "unsigned int p_flavor, embed_values_dec_struct_t* emb_val)\n{\n" + "unsigned int p_flavor, unsigned int p_flavor2, embed_values_dec_struct_t* emb_val)\n{\n" " boolean e_xer = is_exer(p_flavor);\n" " int xerbits = p_td.xer_bits;\n" " if (p_flavor & XER_TOPLEVEL) xerbits &= ~UNTAGGED;\n" @@ -2926,7 +2959,7 @@ void defRecordOfClassMemAllocOptimized(const struct_of_def *sdef, output_struct /* Don't move to the #text, that's the callee's responsibility. */ /* The call to the non-const operator[] creates a new element object, * then we call its XER_decode with the temporary XML reader. */ - " (*this)[n_elements].XER_decode(*p_td.oftype_descr, reader_2, p_flavor, 0);\n" + " (*this)[n_elements].XER_decode(*p_td.oftype_descr, reader_2, p_flavor, p_flavor2, 0);\n" " if (p_flavor & EXIT_ON_ERROR && !(*this)[n_elements - 1].is_bound()) {\n" " if (1 == n_elements) {\n" // Failed to decode even the first element @@ -2987,10 +3020,10 @@ void defRecordOfClassMemAllocOptimized(const struct_of_def *sdef, output_struct " break;\n" " }\n" /* The call to the non-const operator[] creates the element */ - " operator [](n_elements).XER_decode(*p_td.oftype_descr, p_reader, p_flavor, emb_val);\n" - " if (0 != emb_val && !own_tag && n_elements > 1) {\n" - " ++emb_val->embval_index;\n" - " }\n" + " operator [](n_elements).XER_decode(*p_td.oftype_descr, p_reader, p_flavor, p_flavor2, emb_val);\n" + " }\n" + " if (0 != emb_val && !own_tag && n_elements > 1) {\n" + " ++emb_val->embval_index;\n" " }\n" " }\n" " else if (XML_READER_TYPE_END_ELEMENT == type) {\n" @@ -3032,10 +3065,19 @@ void defRecordOfClassMemAllocOptimized(const struct_of_def *sdef, output_struct " return -1;\n" " }\n\n" " int enc_len = p_tok.put_next_token(JSON_TOKEN_ARRAY_START, NULL);\n" - " for(int i = 0; i < n_elements; ++i) {\n" - " int ret_val = value_elements[i].JSON_encode(*p_td.oftype_descr, p_tok);\n" - " if (0 > ret_val) break;\n" - " enc_len += ret_val;\n" + " for (int i = 0; i < n_elements; ++i) {\n" + " if (NULL != p_td.json && p_td.json->metainfo_unbound && !value_elements[i].is_bound()) {\n" + // unbound elements are encoded as { "metainfo []" : "unbound" } + " enc_len += p_tok.put_next_token(JSON_TOKEN_OBJECT_START, NULL);\n" + " enc_len += p_tok.put_next_token(JSON_TOKEN_NAME, \"metainfo []\");\n" + " enc_len += p_tok.put_next_token(JSON_TOKEN_STRING, \"\\\"unbound\\\"\");\n" + " enc_len += p_tok.put_next_token(JSON_TOKEN_OBJECT_END, NULL);\n" + " }\n" + " else {\n" + " int ret_val = value_elements[i].JSON_encode(*p_td.oftype_descr, p_tok);\n" + " if (0 > ret_val) break;\n" + " enc_len += ret_val;\n" + " }\n" " }\n" " enc_len += p_tok.put_next_token(JSON_TOKEN_ARRAY_END, NULL);\n" " return enc_len;\n" @@ -3056,10 +3098,34 @@ void defRecordOfClassMemAllocOptimized(const struct_of_def *sdef, output_struct " return JSON_ERROR_INVALID_TOKEN;\n" " }\n\n" " set_size(0);\n" - " while (true) {\n" + " for (int nof_elements = 0; true; ++nof_elements) {\n" " size_t buf_pos = p_tok.get_buf_pos();\n" + " int ret_val;\n" + " if (NULL != p_td.json && p_td.json->metainfo_unbound) {\n" + // check for metainfo object + " ret_val = p_tok.get_next_token(&token, NULL, NULL);\n" + " if (JSON_TOKEN_OBJECT_START == token) {\n" + " char* value = NULL;\n" + " size_t value_len = 0;\n" + " ret_val += p_tok.get_next_token(&token, &value, &value_len);\n" + " if (JSON_TOKEN_NAME == token && 11 == value_len &&\n" + " 0 == strncmp(value, \"metainfo []\", 11)) {\n" + " ret_val += p_tok.get_next_token(&token, &value, &value_len);\n" + " if (JSON_TOKEN_STRING == token && 9 == value_len &&\n" + " 0 == strncmp(value, \"\\\"unbound\\\"\", 9)) {\n" + " ret_val = p_tok.get_next_token(&token, NULL, NULL);\n" + " if (JSON_TOKEN_OBJECT_END == token) {\n" + " dec_len += ret_val;\n" + " continue;\n" + " }\n" + " }\n" + " }\n" + " }\n" + // metainfo object not found, jump back and let the element type decode it + " p_tok.set_buf_pos(buf_pos);\n" + " }\n" " %s val;\n" - " int ret_val = val.JSON_decode(*p_td.oftype_descr, p_tok, p_silent);\n" + " ret_val = val.JSON_decode(*p_td.oftype_descr, p_tok, p_silent);\n" " if (JSON_ERROR_INVALID_TOKEN == ret_val) {\n" " p_tok.set_buf_pos(buf_pos);\n" " break;\n" @@ -3070,8 +3136,8 @@ void defRecordOfClassMemAllocOptimized(const struct_of_def *sdef, output_struct " }\n" " return JSON_ERROR_FATAL;\n" " }\n" - " set_size(n_elements + 1);\n" - " value_elements[n_elements - 1] = val;\n" + " set_size(nof_elements + 1);\n" + " value_elements[nof_elements] = val;\n" " dec_len += ret_val;\n" " }\n\n" " dec_len += p_tok.get_next_token(&token, NULL, NULL);\n" diff --git a/compiler2/ttcn3/AST_ttcn3.cc b/compiler2/ttcn3/AST_ttcn3.cc index 67be6443c..bed275f0f 100644 --- a/compiler2/ttcn3/AST_ttcn3.cc +++ b/compiler2/ttcn3/AST_ttcn3.cc @@ -4376,6 +4376,8 @@ namespace Ttcn { // the object is initialized by the constructor str = mputprintf(str, "%s %s(%s);\n", type_genname_str, genname_str, body->get_single_expr(false).c_str()); + // make sure the template's code is not generated twice (TR: HU56425) + body->set_code_generated(); } else { // the default constructor is used str = mputprintf(str, "%s %s;\n", type_genname_str, genname_str); diff --git a/compiler2/ttcn3/TtcnTemplate.cc b/compiler2/ttcn3/TtcnTemplate.cc index c136fccf6..d4b86c666 100644 --- a/compiler2/ttcn3/TtcnTemplate.cc +++ b/compiler2/ttcn3/TtcnTemplate.cc @@ -731,6 +731,7 @@ namespace Ttcn { bool allow_fewer = false; switch (my_governor->get_typetype()) { case Type::T_SEQ_T: case Type::T_SET_T: + case Type::T_SEQ_A: case Type::T_SET_A: allow_fewer = true; break; case Type::T_SIGNATURE: // be precise @@ -1810,6 +1811,7 @@ namespace Ttcn { if (t->templatetype == SPECIFIC_VALUE) break; else if (!refch.add(t->get_fullname())) goto end; else if (t->templatetype != TEMPLATE_REFD) break; + t->u.ref.ref->get_refd_assignment(true); // make sure the parameter list is checked ActualParList *parlist = t->u.ref.ref->get_parlist(); if (parlist) parlist->chk_recursions(refch); Template *t_refd = t->get_template_refd(&refch); diff --git a/compiler2/ttcn3/compiler.l b/compiler2/ttcn3/compiler.l index 063baffe5..1915fbf25 100644 --- a/compiler2/ttcn3/compiler.l +++ b/compiler2/ttcn3/compiler.l @@ -495,13 +495,18 @@ with RETURN(WithKeyword); xor RETURN(XorKeyword); xor4b RETURN(Xor4bKeyword); + /* modifier keywords */ + +"@nocase" RETURN(NocaseKeyword); +"@lazy" RETURN(LazyKeyword); + /* special TITAN specific keywords */ "@try" RETURN(TitanSpecificTryKeyword); "@catch" RETURN(TitanSpecificCatchKeyword); -"@lazy" RETURN(TitanSpecificLazyKeyword); "@profiler" RETURN(TitanSpecificProfilerKeyword); + /* Predefined function identifiers */ bit2hex RETURN(bit2hexKeyword); diff --git a/compiler2/ttcn3/compiler.y b/compiler2/ttcn3/compiler.y index 65dca47a4..b7b45b6a0 100644 --- a/compiler2/ttcn3/compiler.y +++ b/compiler2/ttcn3/compiler.y @@ -702,10 +702,13 @@ static const string anyname("anytype"); %token XorKeyword %token Xor4bKeyword +/* modifier keywords */ +%token NocaseKeyword +%token LazyKeyword + /* TITAN specific keywords */ %token TitanSpecificTryKeyword %token TitanSpecificCatchKeyword -%token TitanSpecificLazyKeyword %token TitanSpecificProfilerKeyword /* Keywords combined with a leading dot */ @@ -3417,6 +3420,13 @@ CharStringMatch: // 124 $$ = parse_pattern($2, loc); Free($2); } +| PatternKeyword NocaseKeyword PatternChunkList + { + // @nocase is ignored for now + Location loc(infile, @3); + $$ = parse_pattern($3, loc); + Free($3); + } ; PatternChunkList: @@ -7134,7 +7144,7 @@ Reference: // 490 ValueReference optLazyEval: /* empty */ { $$ = false; } -| TitanSpecificLazyKeyword { $$ = true; } +| LazyKeyword { $$ = true; } ; FormalValuePar: // 516 @@ -8453,6 +8463,12 @@ PredefinedOps: $$ = new Value(Value::OPTYPE_REGEXP, $4, $8, $12); $$->set_location(infile, @$); } +| regexpKeyword NocaseKeyword '(' optError TemplateInstance optError ',' optError + TemplateInstance optError ',' optError Expression optError ')' + { + $$ = new Value(Value::OPTYPE_REGEXP, $5, $9, $13); + $$->set_location(infile, @$); + } | regexpKeyword '(' error ')' { Template *t1 = new Template(Template::TEMPLATE_ERROR); @@ -8468,6 +8484,21 @@ PredefinedOps: $$ = new Value(Value::OPTYPE_REGEXP, ti1, ti2, v3); $$->set_location(infile, @$); } +| regexpKeyword NocaseKeyword '(' error ')' + { + Template *t1 = new Template(Template::TEMPLATE_ERROR); + t1->set_location(infile, @4); + TemplateInstance *ti1 = new TemplateInstance(0, 0, t1); + ti1->set_location(infile, @4); + Template *t2 = new Template(Template::TEMPLATE_ERROR); + t2->set_location(infile, @4); + TemplateInstance *ti2 = new TemplateInstance(0, 0, t2); + ti2->set_location(infile, @4); + Value *v3 = new Value(Value::V_ERROR); + v3->set_location(infile, @4); + $$ = new Value(Value::OPTYPE_REGEXP, ti1, ti2, v3); + $$->set_location(infile, @$); + } | encvalueKeyword '(' optError TemplateInstance optError ')' { $$ = new Value(Value::OPTYPE_ENCODE, $4); diff --git a/compiler2/ttcn3/rawAST.l b/compiler2/ttcn3/rawAST.l index ede1166e3..5f1eba0d3 100644 --- a/compiler2/ttcn3/rawAST.l +++ b/compiler2/ttcn3/rawAST.l @@ -680,10 +680,18 @@ void rawAST_error(const char *str) Location loc(infile, yylloc); if (*yytext) { // the most recently parsed token is known - loc.warning("in variant attribute, at or before token `%s': %s", yytext, str); + if (warnings_for_bad_variants) { + loc.warning("in variant attribute, at or before token `%s': %s", yytext, str); + } else { + loc.error("in variant attribute, at or before token `%s': %s", yytext, str); + } } else { // the most recently parsed token is unknown - loc.warning("in variant attribute: %s", str); + if (warnings_for_bad_variants) { + loc.warning("in variant attribute: %s", str); + } else { + loc.error("in variant attribute: %s", str); + } } } diff --git a/compiler2/ttcn3/rawAST.y b/compiler2/ttcn3/rawAST.y index dcc2c8b46..0b703d328 100644 --- a/compiler2/ttcn3/rawAST.y +++ b/compiler2/ttcn3/rawAST.y @@ -289,7 +289,7 @@ static void yyprint(FILE *file, int type, const YYSTYPE& value); XDecodeToken %type <cstr> - XTextReservedWord + XTextReservedWord XJsonAlias %type <identifier> XPointerToDef XRecordFieldRef XIdentifierOrReserved @@ -1547,9 +1547,22 @@ XOmitAsNull: ; XNameAs: - XKWname XSpaces XKWas XSpaces XAliasToken { jsonstruct->alias = mcopystr($5); } + XKWname XSpaces XKWas XSpaces XJsonAlias { jsonstruct->alias = mcopystr($5); } ; +XJsonAlias: // include all keywords, so they can be used as aliases for fields, too + XAliasToken { $$ = $1; } +| XKWomit { $$ = "omit"; } +| XKWas { $$ = "as"; } +| XKWnull { $$ = "null"; } +| XKWname { $$ = "name"; } +| XKWvalue { $$ = "value"; } +| XKWdefault { $$ = "default"; } +| XKWextend { $$ = "extend"; } +| XKWmetainfo { $$ = "metainfo"; } +| XKWfor { $$ = "for"; } +| XKWunbound { $$ = "unbound"; } + XAsValue: XKWas XSpaces XKWvalue { jsonstruct->as_value = true; } ; diff --git a/compiler2/ttcn3_makefilegen.1 b/compiler2/ttcn3_makefilegen.1 index 4c41a154c..fb1c164f9 100644 --- a/compiler2/ttcn3_makefilegen.1 +++ b/compiler2/ttcn3_makefilegen.1 @@ -3,7 +3,7 @@ ttcn3_makefilegen \- Makefile Generator .SH SYNOPSIS .B ttcn3_makefilegen -.RB "[\| " \-acdfglMpRsw " \|]" +.RB "[\| " \-acdEfglMpRsw " \|]" .RB "[\| " \-e .IR " ETS_name" " \|]" .RB "[\| " \-o @@ -52,6 +52,10 @@ suite) to in the generated Makefile. If this option is omitted, the name of the first TTCN-3 module will be used as default. .TP +.B \-E +Instructs the variant attribute parser to display warnings instead of errors +for unrecognized/erroneous attributes. +.TP .B \-f Forces the Makefile Generator to .I overwrite @@ -64,6 +68,21 @@ only. The resulting Makefile will be smaller and less redundant. It exploits the pattern substitution features of GNU make, which may cause syntax errors with other versions of make. .TP +.BI \-I " path" +Adds the path to the list of search paths. +.I path +must be an +absolute path. Used with the +.B -t +option when the referenced projects +can not be found at the projectRelativeURI location. In that case the +tool will try to find the referenced TPD file using the search paths. +The first TPD file found is taken. If the tpdName attribute is present in + ReferencedProject then the value of tpdName will be used as a TPD name +during search. However if the tpdName attribute is missing then the value +of the name attribute is taken with the .tpd suffix and used during the +search. +.TP .BI \-o " dir|file" Write the Makefile to the given directory or file. The current working directory is the default otherwise. diff --git a/compiler2/union.c b/compiler2/union.c index 6075e7787..ec34d0ddb 100644 --- a/compiler2/union.c +++ b/compiler2/union.c @@ -366,8 +366,11 @@ void defUnionClass(struct_def const *sdef, output_struct *output) src = mputprintf(src, " if (!strcmp(mp_last->get_id()->get_name(), \"%s\")) {\n" " %s%s().set_param(*mp_last);\n" + // a union's alternative cannot be unbound + " if (!%s%s().is_bound()) clean_up();\n" " return;\n" - " }\n", sdef->elements[i].dispname, at_field, sdef->elements[i].name); + " }\n", sdef->elements[i].dispname, at_field, sdef->elements[i].name, + at_field, sdef->elements[i].name); } src = mputprintf(src, " mp_last->error(\"Field %%s does not exist in type %s.\", mp_last->get_id()->get_name());\n" @@ -1592,7 +1595,7 @@ void defUnionClass(struct_def const *sdef, output_struct *output) #endif src = mputprintf(src, /* XERSTUFF decoder functions for union */ "int %s::XER_decode(const XERdescriptor_t& p_td, XmlReaderWrap& p_reader," - " unsigned int p_flavor, embed_values_dec_struct_t*)\n" + " unsigned int p_flavor, unsigned int p_flavor2, embed_values_dec_struct_t*)\n" "{\n" " int e_xer = is_exer(p_flavor);\n" " int type = 0;\n" /* None */ @@ -1709,7 +1712,7 @@ void defUnionClass(struct_def const *sdef, output_struct *output) " ec_2.set_msg(\"%s': \");\n" " if (%s==union_selection) {\n" " matched = %d;\n" - " %s().XER_decode(%s_xer_, p_reader, flavor_1, 0);\n" + " %s().XER_decode(%s_xer_, p_reader, flavor_1, p_flavor2, 0);\n" " }\n" " if (field_%s->is_bound()) break; else clean_up();\n" " }\n", @@ -1766,7 +1769,7 @@ void defUnionClass(struct_def const *sdef, output_struct *output) " TTCN_EncDec_ErrorContext::error(TTCN_EncDec::ET_INVAL_MSG,\n" " \"Attempting to decode blocked or abstract field.\");\n" " }\n" - " %s%s().XER_decode(%s_xer_, p_reader, flavor_1, 0);\n" + " %s%s().XER_decode(%s_xer_, p_reader, flavor_1, p_flavor2, 0);\n" " if (!%s%s().is_bound()) {\n" " TTCN_EncDec_ErrorContext::error(TTCN_EncDec::ET_INVAL_MSG, \"Failed to decode field.\");\n" " }\n" @@ -1788,7 +1791,7 @@ void defUnionClass(struct_def const *sdef, output_struct *output) " TTCN_EncDec_ErrorContext::error(TTCN_EncDec::ET_INVAL_MSG,\n" " \"Attempting to decode blocked or abstract field.\");\n" " }\n" - " %s%s().XER_decode(%s_xer_, p_reader, flavor_1, 0);\n" + " %s%s().XER_decode(%s_xer_, p_reader, flavor_1, p_flavor2, 0);\n" " if (!%s%s().is_bound()) {\n" " TTCN_EncDec_ErrorContext::error(TTCN_EncDec::ET_INVAL_MSG, \"Failed to decode field.\");\n" " }\n" @@ -1832,8 +1835,8 @@ void defUnionClass(struct_def const *sdef, output_struct *output) if (json_needed) { // JSON encode src = mputprintf(src, - "int %s::JSON_encode(const TTCN_Typedescriptor_t& p_td, JSON_Tokenizer& p_tok) const\n" - "{\n", name); + "int %s::JSON_encode(const TTCN_Typedescriptor_t&%s, JSON_Tokenizer& p_tok) const\n" + "{\n", name, use_runtime_2 ? " p_td" : ""); if (use_runtime_2) { src = mputstr(src, " if (err_descr) return JSON_encode_negtest(err_descr, p_td, p_tok);\n"); } diff --git a/compiler2/xpather.cc b/compiler2/xpather.cc index 829303c1d..d1ac0a0c4 100644 --- a/compiler2/xpather.cc +++ b/compiler2/xpather.cc @@ -605,7 +605,7 @@ const char* get_act_config(struct string2_list* cfg, const char* project_name) { return NULL; } -static tpd_result process_tpd_internal(const char *p_tpd_name, const char *actcfg, +static tpd_result process_tpd_internal(const char *p_tpd_name, char* tpdName, const char *actcfg, const char *file_list_path, int *p_argc, char ***p_argv, int *p_optind, char **p_ets_name, char **p_project_name, boolean *p_gflag, boolean *p_sflag, boolean *p_cflag, boolean *p_aflag, boolean *preprocess, @@ -617,11 +617,12 @@ static tpd_result process_tpd_internal(const char *p_tpd_name, const char *actcf struct string_list* prep_defines, struct string_list* prep_undefines, boolean *p_csflag, boolean *p_quflag, boolean* p_dsflag, char** cxxcompiler, char** optlevel, char** optflags, boolean* p_dbflag, boolean* p_drflag, boolean* p_dtflag, boolean* p_dxflag, boolean* p_djflag, boolean* p_fxflag, boolean* p_doflag, boolean* p_gfflag, boolean* p_lnflag, boolean* p_isflag, - boolean* p_asflag, boolean* p_swflag, boolean* p_Yflag, boolean* p_Mflag, struct string_list* solspeclibs, struct string_list* sol8speclibs, + boolean* p_asflag, boolean* p_swflag, boolean* p_Yflag, boolean* p_Mflag, boolean *p_Eflag, boolean* p_diflag, struct string_list* solspeclibs, struct string_list* sol8speclibs, struct string_list* linuxspeclibs, struct string_list* freebsdspeclibs, struct string_list* win32speclibs, char** ttcn3prep, struct string_list* linkerlibs, struct string_list* additionalObjects, struct string_list* linkerlibsearchp, boolean Vflag, boolean Dflag, boolean *p_Zflag, boolean *p_Hflag, char** generatorCommandOutput, struct string2_list* target_placement_list, boolean prefix_workdir, - struct string2_list* run_command_list, map<cstring, int>& seen_tpd_files, struct string2_list* required_configs, struct string_list** profiled_file_list); + struct string2_list* run_command_list, map<cstring, int>& seen_tpd_files, struct string2_list* required_configs, struct string_list** profiled_file_list, + const char **search_paths, size_t n_search_paths); extern "C" tpd_result process_tpd(const char *p_tpd_name, const char *actcfg, const char *file_list_path, int *p_argc, char ***p_argv, @@ -635,18 +636,19 @@ extern "C" tpd_result process_tpd(const char *p_tpd_name, const char *actcfg, struct string_list* prep_defines, struct string_list* prep_undefines, boolean *p_csflag, boolean *p_quflag, boolean* p_dsflag, char** cxxcompiler, char** optlevel, char** optflags, boolean* p_dbflag, boolean* p_drflag, boolean* p_dtflag, boolean* p_dxflag, boolean* p_djflag, boolean* p_fxflag, boolean* p_doflag, boolean* p_gfflag, boolean* p_lnflag, boolean* p_isflag, - boolean* p_asflag, boolean* p_swflag, boolean* p_Yflag, boolean* p_Mflag, struct string_list* solspeclibs, struct string_list* sol8speclibs, + boolean* p_asflag, boolean* p_swflag, boolean* p_Yflag, boolean* p_Mflag, boolean* p_Eflag, boolean* p_diflag, struct string_list* solspeclibs, struct string_list* sol8speclibs, struct string_list* linuxspeclibs, struct string_list* freebsdspeclibs, struct string_list* win32speclibs, char** ttcn3prep, string_list* linkerlibs, string_list* additionalObjects, string_list* linkerlibsearchp, boolean Vflag, boolean Dflag, boolean *p_Zflag, boolean *p_Hflag, char** generatorCommandOutput, struct string2_list* target_placement_list, boolean prefix_workdir, - struct string2_list* run_command_list, struct string2_list* required_configs, struct string_list** profiled_file_list) { + struct string2_list* run_command_list, struct string2_list* required_configs, struct string_list** profiled_file_list, + const char **search_paths, size_t n_search_paths) { map<cstring, int> seen_tpd_files; + char *tpdName = NULL; projGenHelper.setZflag(*p_Zflag); projGenHelper.setWflag(prefix_workdir); projGenHelper.setHflag(*p_Hflag); - - tpd_result success = process_tpd_internal(p_tpd_name, + tpd_result success = process_tpd_internal(p_tpd_name, tpdName, actcfg, file_list_path, p_argc, p_argv, p_optind, p_ets_name, p_project_name, p_gflag, p_sflag, p_cflag, p_aflag, preprocess, p_Rflag, p_lflag, p_mflag, p_Pflag, @@ -657,11 +659,12 @@ extern "C" tpd_result process_tpd(const char *p_tpd_name, const char *actcfg, prep_undefines, p_csflag, p_quflag, p_dsflag, cxxcompiler, optlevel, optflags, p_dbflag, p_drflag, p_dtflag, p_dxflag, p_djflag, p_fxflag, p_doflag, p_gfflag, p_lnflag, p_isflag, - p_asflag, p_swflag, p_Yflag, p_Mflag, solspeclibs, sol8speclibs, + p_asflag, p_swflag, p_Yflag, p_Mflag, p_Eflag, p_diflag, solspeclibs, sol8speclibs, linuxspeclibs, freebsdspeclibs, win32speclibs, ttcn3prep, linkerlibs, additionalObjects, linkerlibsearchp, Vflag, Dflag, p_Zflag, p_Hflag, generatorCommandOutput, target_placement_list, prefix_workdir, - run_command_list, seen_tpd_files, required_configs, profiled_file_list); + run_command_list, seen_tpd_files, required_configs, profiled_file_list, + search_paths, n_search_paths); if (TPD_FAILED == success) exit(EXIT_FAILURE); @@ -693,7 +696,7 @@ extern "C" tpd_result process_tpd(const char *p_tpd_name, const char *actcfg, // process_tpd() may alter these strings; new values will be on the heap. // If process_tpd() preserves the content of such a string (e.g. ets_name), // it must nevertheless make a copy on the heap via mcopystr(). -static tpd_result process_tpd_internal(const char *p_tpd_name, const char *actcfg, +static tpd_result process_tpd_internal(const char *p_tpd_name, char *tpdName, const char *actcfg, const char *file_list_path, int *p_argc, char ***p_argv, int *p_optind, char **p_ets_name, char **p_project_name, boolean *p_gflag, boolean *p_sflag, boolean *p_cflag, boolean *p_aflag, boolean *preprocess, @@ -705,11 +708,12 @@ static tpd_result process_tpd_internal(const char *p_tpd_name, const char *actcf struct string_list* prep_defines, struct string_list* prep_undefines, boolean *p_csflag, boolean *p_quflag, boolean* p_dsflag, char** cxxcompiler, char** optlevel, char** optflags, boolean* p_dbflag, boolean* p_drflag, boolean* p_dtflag, boolean* p_dxflag, boolean* p_djflag, boolean* p_fxflag, boolean* p_doflag, boolean* p_gfflag, boolean* p_lnflag, boolean* p_isflag, - boolean* p_asflag, boolean* p_swflag, boolean* p_Yflag, boolean* p_Mflag, struct string_list* solspeclibs, struct string_list* sol8speclibs, + boolean* p_asflag, boolean* p_swflag, boolean* p_Yflag, boolean* p_Mflag, boolean* p_Eflag, boolean* p_diflag, struct string_list* solspeclibs, struct string_list* sol8speclibs, struct string_list* linuxspeclibs, struct string_list* freebsdspeclibs, struct string_list* win32speclibs, char** ttcn3prep, string_list* linkerlibs, string_list* additionalObjects, string_list* linkerlibsearchp, boolean Vflag, boolean Dflag, boolean *p_Zflag, boolean *p_Hflag, char** generatorCommandOutput, struct string2_list* target_placement_list, boolean prefix_workdir, - struct string2_list* run_command_list, map<cstring, int>& seen_tpd_files, struct string2_list* required_configs, struct string_list** profiled_file_list) + struct string2_list* run_command_list, map<cstring, int>& seen_tpd_files, struct string2_list* required_configs, struct string_list** profiled_file_list, + const char **search_paths, size_t n_search_paths) { tpd_result result = TPD_SUCCESS; // read-only non-pointer aliases @@ -724,7 +728,47 @@ static tpd_result process_tpd_internal(const char *p_tpd_name, const char *actcf assert(local_argc >= local_optind); autostring tpd_dir(get_dir_from_path(p_tpd_name)); - autostring abs_tpd_dir(get_absolute_dir(tpd_dir, NULL)); + autostring abs_tpd_dir(get_absolute_dir(tpd_dir, NULL, FALSE)); + boolean free_name = FALSE; + struct stat buf; + //Only referenced project, when first try is failed, and when not absolute path + if(0 == local_optind && p_tpd_name != NULL && stat(p_tpd_name, &buf) && tpdName != NULL) { + //Find the first search_path that has the tpd + for(size_t i = 0; i<n_search_paths; i++) { + boolean need_slash = search_paths[i][strlen(search_paths[i]) - 1] != '/'; + NOTIFY("Cannot find %s, trying with %s%s%s\n", p_tpd_name, search_paths[i], need_slash ? "/" : "", tpdName); + //Create path + char * prefixed_file_path = (char*)Malloc((strlen(search_paths[i]) + strlen(tpdName) + 1 + need_slash) * sizeof(char)); + strcpy(prefixed_file_path, search_paths[i]); + if(need_slash) { + strcat(prefixed_file_path, "/"); + } + strcat(prefixed_file_path, tpdName); + + tpd_dir = get_dir_from_path(prefixed_file_path); + abs_tpd_dir = get_absolute_dir(tpd_dir, NULL, FALSE); + + if(!stat(prefixed_file_path, &buf)){ + //Ok, tpd found + p_tpd_name = prefixed_file_path; + free_name = TRUE; + NOTIFY("TPD with name %s found at %s.", tpdName, search_paths[i]); + break; + }else { + //tpd not found, continue search + abs_tpd_dir = NULL; + Free(prefixed_file_path); + } + } + //Error if tpd is not found in either search paths + if(NULL == (const char*)abs_tpd_dir) { + //Only write out the name in the error message (without .tpd) + tpdName[strlen(tpdName)-4] ='\0'; + ERROR("Unable to find ReferencedProject with name: %s", (const char*)tpdName); + return TPD_FAILED; + } + } + if (NULL == (const char*)abs_tpd_dir) { ERROR("absolute TPD directory could not be retrieved from %s", (const char*)tpd_dir); return TPD_FAILED; @@ -994,7 +1038,7 @@ static tpd_result process_tpd_internal(const char *p_tpd_name, const char *actcf set_working_dir(real_workdir); // go into the working dir } if (hasWorkDir) { //we created working directory, or its already been created (from a parent makefilegen process maybe) - *abs_work_dir_p = get_absolute_dir(real_workdir, abs_tpd_dir); + *abs_work_dir_p = get_absolute_dir(real_workdir, abs_tpd_dir, TRUE); abs_workdir = (mcopystr(*abs_work_dir_p)); proj_abs_workdir = mcopystr(*abs_work_dir_p); } @@ -1044,9 +1088,12 @@ static tpd_result process_tpd_internal(const char *p_tpd_name, const char *actcf xmlNodeSetPtr nodes = theConfigEx->nodesetval; if (nodes) for (int i = 0; i < nodes->nodeNr; ++i) { xmlNodePtr curnode = nodes->nodeTab[i]; - cstring aa((const char*)curnode->content); - excluded_files.add(aa, *p_project_name); + if (!excluded_files.has_key(aa)) { + excluded_files.add(aa, *p_project_name); + } else { + WARNING("Multiple exclusion of file %s", (const char*)curnode->content); + } } } @@ -1102,7 +1149,7 @@ static tpd_result process_tpd_internal(const char *p_tpd_name, const char *actcf const char* file_path = ruri; expstring_t rel_file_dir = get_dir_from_path(file_path); expstring_t file_name = get_file_from_path(file_path); - expstring_t abs_dir_path = get_absolute_dir(rel_file_dir, abs_tpd_dir); + expstring_t abs_dir_path = get_absolute_dir(rel_file_dir, abs_tpd_dir, TRUE); expstring_t abs_file_name = compose_path_name(abs_dir_path, file_name); if (abs_file_name != NULL) { if (get_path_status(abs_file_name) == PS_FILE) { @@ -1132,7 +1179,7 @@ static tpd_result process_tpd_internal(const char *p_tpd_name, const char *actcf }else { drop = true; ERROR("%s does not exist", abs_file_name); - } + } } if(abs_dir_path != NULL && !drop){ files.add(cpath, ruri); // relativeURI to the TPD location @@ -1181,6 +1228,8 @@ static tpd_result process_tpd_internal(const char *p_tpd_name, const char *actcf xsdbool2boolean(xpathCtx, actcfg, "outParamBoundness", p_Yflag); //not documented, obsolete xsdbool2boolean(xpathCtx, actcfg, "forceOldFuncOutParHandling", p_Yflag); xsdbool2boolean(xpathCtx, actcfg, "omitInValueList", p_Mflag); + xsdbool2boolean(xpathCtx, actcfg, "warningsForBadVariants", p_Eflag); + xsdbool2boolean(xpathCtx, actcfg, "disablePredefinedExternalFolder", p_diflag); projDesc = projGenHelper.getTargetOfProject(*p_project_name); if (projDesc) projDesc->setLinkingStrategy(*p_lflag); @@ -1951,10 +2000,12 @@ static tpd_result process_tpd_internal(const char *p_tpd_name, const char *actcf // Referenced projects { XPathObject subprojects(run_xpath(xpathCtx, - "/TITAN_Project_File_Information/ReferencedProjects/ReferencedProject/attribute::*")); + "/TITAN_Project_File_Information/ReferencedProjects/ReferencedProject")); xmlNodeSetPtr nodes = subprojects->nodesetval; - const char *name = NULL, *projectLocationURI = NULL; + //Go through ReferencedProjects if (nodes) for (int i = 0; i < nodes->nodeNr; ++i) { + const char *name = NULL, *projectLocationURI = NULL; + char *tpdName_loc = NULL; // FIXME: this assumes every ReferencedProject has name and URI. // This is not necessarily so if the referenced project was closed // when the project was exported to TPD. @@ -1963,13 +2014,44 @@ static tpd_result process_tpd_internal(const char *p_tpd_name, const char *actcf // changes the next ReferencedProject to have the projectLocationURI // as the first attribute, it will be joined to the name // of the previous, closed, ReferencedProject. - if (!strcmp((const char*)nodes->nodeTab[i]->name, "name")) { - name = (const char*)nodes->nodeTab[i]->children->content; + + //Go through attributes + for (xmlAttrPtr attr = nodes->nodeTab[i]->properties; attr; attr = attr->next) { + if (!strcmp((const char*)attr->name, "name")) { + name = (const char*)attr->children->content; + } + else if (!strcmp((const char*)attr->name,"projectLocationURI")) { + projectLocationURI = (const char*)attr->children->content; + } + else if (!strcmp((const char*)attr->name, "tpdName")) { + //Allocate memory + tpdName_loc = mcopystr((char*)attr->children->content); + } } - else if (!strcmp((const char*)nodes->nodeTab[i]->name,"projectLocationURI")) { - projectLocationURI = (const char*)nodes->nodeTab[i]->children->content; + //We don't want to orerride an absolute location with -I, tpdName remains NULL + boolean not_abs_path = projectLocationURI && +#if defined WIN32 && defined MINGW + /* On native Windows the absolute path name shall begin with + * a drive letter, colon and backslash */ + (((projectLocationURI[0] < 'A' || projectLocationURI[0] > 'Z') && + (projectLocationURI[0] < 'a' || projectLocationURI[0] > 'z')) || + projectLocationURI[1] != ':' || projectLocationURI[2] != '\\'); +#else + /* On UNIX-like systems the absolute path name shall begin with + * a slash */ + projectLocationURI[0] != '/'; +#endif + if (!tpdName_loc && not_abs_path) { + //Allocate memory: +5 because .tpd + closing 0 + tpdName_loc = (char*)Malloc((strlen(name) + 5) * sizeof(char)); + //Default name: name + .tpd + strcpy(tpdName_loc, name); + strcat(tpdName_loc, ".tpd"); + }else if (!not_abs_path) { + Free(tpdName_loc); + tpdName_loc = NULL; } - + if (name && projectLocationURI) { // collected both // see if there is a specified configuration for the project @@ -1987,16 +2069,21 @@ static tpd_result process_tpd_internal(const char *p_tpd_name, const char *actcf my_quflag = 0, my_dsflag = 0, my_dbflag = 0, my_drflag = 0, my_dtflag = 0, my_dxflag = 0, my_djflag = 0, my_fxflag = 0, my_doflag = 0, my_gfflag = 0, my_lnflag = 0, my_isflag = 0, my_asflag = 0, - my_swflag = 0, my_Yflag = 0, my_Mflag = *p_Mflag; + my_swflag = 0, my_Yflag = 0, my_Mflag = *p_Mflag, my_Eflag = 0, my_diflag = *p_diflag; char *my_ets = NULL; char *my_proj_name = NULL; - autostring abs_projectLocationURI( - compose_path_name(abs_tpd_dir, projectLocationURI)); + autostring abs_projectLocationURI; + if (not_abs_path) { + abs_projectLocationURI = compose_path_name(abs_tpd_dir, projectLocationURI); + } else { + //If absolute directory, then just copy the URI + abs_projectLocationURI = mcopystr(projectLocationURI); + } char* sub_proj_abs_work_dir = NULL; - tpd_result success = process_tpd_internal((const char*)abs_projectLocationURI, + tpd_result success = process_tpd_internal((const char*)abs_projectLocationURI, tpdName_loc, my_actcfg, file_list_path, &my_argc, &my_argv, &my_optind, &my_ets, &my_proj_name, &my_gflag, &my_sflag, &my_cflag, &my_aflag, preprocess, &my_Rflag, &my_lflag, &my_mflag, &my_Pflag, &my_Lflag, recursive, force_overwrite, gen_only_top_level, NULL, &sub_proj_abs_work_dir, @@ -2004,10 +2091,11 @@ static tpd_result process_tpd_internal(const char *p_tpd_name, const char *actcf prep_includes, prep_defines, prep_undefines, &my_csflag, &my_quflag, &my_dsflag, cxxcompiler, optlevel, optflags, &my_dbflag, &my_drflag, &my_dtflag, &my_dxflag, &my_djflag, &my_fxflag, &my_doflag, - &my_gfflag, &my_lnflag, &my_isflag, &my_asflag, &my_swflag, &my_Yflag, &my_Mflag, + &my_gfflag, &my_lnflag, &my_isflag, &my_asflag, &my_swflag, &my_Yflag, &my_Mflag, &my_Eflag, &my_diflag, solspeclibs, sol8speclibs, linuxspeclibs, freebsdspeclibs, win32speclibs, ttcn3prep, linkerlibs, additionalObjects, linkerlibsearchp, Vflag, FALSE, &my_Zflag, - &my_Hflag, NULL, NULL, prefix_workdir, run_command_list, seen_tpd_files, required_configs, profiled_file_list); + &my_Hflag, NULL, NULL, prefix_workdir, run_command_list, seen_tpd_files, required_configs, profiled_file_list, + search_paths, n_search_paths); autostring sub_proj_abs_work_dir_as(sub_proj_abs_work_dir); // ?! @@ -2092,8 +2180,8 @@ static tpd_result process_tpd_internal(const char *p_tpd_name, const char *actcf result = TPD_FAILED; } // else TPD_SKIPPED, keep quiet - - name = projectLocationURI = NULL; // forget both + Free(tpdName_loc); + name = projectLocationURI = tpdName_loc = NULL; // forget all } } // next referenced project } @@ -2122,7 +2210,7 @@ static tpd_result process_tpd_internal(const char *p_tpd_name, const char *actcf const char *fn = files.get_nth_elem(n); // relativeURI to the TPD location autostring dir_n (get_dir_from_path (fn)); autostring file_n(get_file_from_path(fn)); - autostring rel_n (get_absolute_dir(dir_n, abs_tpd_dir)); + autostring rel_n (get_absolute_dir(dir_n, abs_tpd_dir, TRUE)); autostring abs_n (compose_path_name(rel_n, file_n)); if (local_argc == 0) { @@ -2238,6 +2326,10 @@ static tpd_result process_tpd_internal(const char *p_tpd_name, const char *actcf Free(const_cast<char*>(folders.get_nth_elem(i))); } folders.clear(); + + if(free_name) { + Free((char*)p_tpd_name); + } excluded_files.clear(); excluded_folders.clear(); diff --git a/compiler2/xpather.h b/compiler2/xpather.h index a9f6e8c5f..51454bc91 100644 --- a/compiler2/xpather.h +++ b/compiler2/xpather.h @@ -184,6 +184,8 @@ boolean buildObjects(const char* projName, boolean add_referenced); * @param suppresswarnings suppressWarnings -S * @param outparamboundness outParamBoundness -Y * @param omit_in_value_list omitInValueList -M + * @param warnings_for_bad_variants warningsForBadVariants -E + * @param disable_predef_exp_folder disablePredefinedExternalFolder * @param solspeclibs SolarisSpecificLibraries * @param sol8speclibs Solaris8SpecificLibraries * @param linuxspeclibs LinuxSpecificLibraries @@ -198,6 +200,8 @@ boolean buildObjects(const char* projName, boolean add_referenced); * @param target_placement_list a list of (target,placement) strings pairs from the TPD * @param prefix_workdir prefix working directory with project name * @param run_command_list contains the working directories and the makefilegen commands to be called there + * @param search_paths contains the paths that can be tried if a file is not found + * @param n_search_paths contains the size of relative_prefixes * @return TPD_SUCCESS if parsing successful, TPD_SKIPPED if the tpd * was seen already, or TPD_FAILED on error. */ @@ -222,10 +226,10 @@ tpd_result process_tpd(const char *p_tpd_name, const char *actcfg, char** cxxcompiler, char** optlevel, char** optflags, boolean *disableber, boolean *disableraw, boolean *disabletext, boolean *disablexer, boolean *disablejson, boolean *forcexerinasn, boolean *defaultasomit, boolean *gccmessageformat, boolean *linenumber, boolean *includesourceinfo, boolean *addsourcelineinfo, boolean *suppresswarnings, - boolean *outparamboundness, boolean *omit_in_value_list, struct string_list* solspeclibs, struct string_list* sol8speclibs, + boolean *outparamboundness, boolean *omit_in_value_list, boolean *warnings_for_bad_variants, boolean *disable_predef_exp_folder, struct string_list* solspeclibs, struct string_list* sol8speclibs, struct string_list* linuxspeclibs, struct string_list* freebsdspeclibs, struct string_list* win32speclibs, char** ttcn3preprocessor, struct string_list* linkerlibs, struct string_list* additionalObjects, struct string_list* linkerlibsearchpath, boolean Vflag, boolean Dflag, boolean *Zflag, boolean *Hflag, char** generatorCommandOutput, struct string2_list* target_placement_list, boolean prefix_workdir, struct string2_list* run_command_list, - struct string2_list* required_configs, struct string_list** profiled_file_list); + struct string2_list* required_configs, struct string_list** profiled_file_list, const char **search_paths, size_t n_search_paths); #endif /* XPATHER_H_ */ diff --git a/core/ASN_CharacterString.cc b/core/ASN_CharacterString.cc index f1b871527..2b5621b28 100644 --- a/core/ASN_CharacterString.cc +++ b/core/ASN_CharacterString.cc @@ -803,7 +803,7 @@ int CHARACTER_STRING_identification::XER_encode(const XERdescriptor_t& p_td, } int CHARACTER_STRING_identification::XER_decode(const XERdescriptor_t& p_td, - XmlReaderWrap& reader, unsigned int flavor, embed_values_dec_struct_t*) + XmlReaderWrap& reader, unsigned int flavor, unsigned int flavor2, embed_values_dec_struct_t*) { int exer = is_exer(flavor); // we are supposed to be parked on our element @@ -824,27 +824,27 @@ int CHARACTER_STRING_identification::XER_decode(const XERdescriptor_t& p_td, size_t namelen = strlen(name); switch (namelen) { case 8: // syntaxes - syntaxes().XER_decode(EMBEDDED_PDV_identification_sxs_xer_, reader, flavor, 0); + syntaxes().XER_decode(EMBEDDED_PDV_identification_sxs_xer_, reader, flavor, flavor2, 0); break; case 6: // syntax - syntax().XER_decode(EMBEDDED_PDV_identification_sx_xer_, reader, flavor, 0); + syntax().XER_decode(EMBEDDED_PDV_identification_sx_xer_, reader, flavor, flavor2, 0); break; case 23: // presentation-context-id - presentation__context__id().XER_decode(EMBEDDED_PDV_identification_pci_xer_, reader, flavor, 0); + presentation__context__id().XER_decode(EMBEDDED_PDV_identification_pci_xer_, reader, flavor, flavor2, 0); break; case 19: // context-negotiation - context__negotiation().XER_decode(EMBEDDED_PDV_identification_cn_xer_, reader, flavor, 0); + context__negotiation().XER_decode(EMBEDDED_PDV_identification_cn_xer_, reader, flavor, flavor2, 0); break; case 15: // transfer-syntax - transfer__syntax().XER_decode(EMBEDDED_PDV_identification_ts_xer_, reader, flavor, 0); + transfer__syntax().XER_decode(EMBEDDED_PDV_identification_ts_xer_, reader, flavor, flavor2, 0); break; case 5: // fixed - fixed().XER_decode(EMBEDDED_PDV_identification_fix_xer_, reader, flavor, 0); + fixed().XER_decode(EMBEDDED_PDV_identification_fix_xer_, reader, flavor, flavor2, 0); break; default: @@ -1776,7 +1776,7 @@ int CHARACTER_STRING_identification_syntaxes::XER_encode(const XERdescriptor_t& } int CHARACTER_STRING_identification_syntaxes::XER_decode( - const XERdescriptor_t& /*p_td*/, XmlReaderWrap& reader, unsigned int flavor, embed_values_dec_struct_t*) + const XERdescriptor_t& /*p_td*/, XmlReaderWrap& reader, unsigned int flavor, unsigned int flavor2, embed_values_dec_struct_t*) { // we stand on <syntaxes>, move ahead first for (int success = reader.Read(); success == 1; success = reader.Read()) { @@ -1786,8 +1786,8 @@ int CHARACTER_STRING_identification_syntaxes::XER_decode( break; } // FIXME this assumes the right element - field_abstract.XER_decode(EMBEDDED_PDV_identification_sxs_abs_xer_, reader, flavor, 0); - field_transfer.XER_decode(EMBEDDED_PDV_identification_sxs_xfr_xer_, reader, flavor, 0); + field_abstract.XER_decode(EMBEDDED_PDV_identification_sxs_abs_xer_, reader, flavor, flavor2, 0); + field_transfer.XER_decode(EMBEDDED_PDV_identification_sxs_xfr_xer_, reader, flavor, flavor2, 0); for (int success = 1; success == 1; success = reader.Read()) { int type = reader.NodeType(); @@ -2499,7 +2499,7 @@ int CHARACTER_STRING_identification_context__negotiation::XER_encode(const XERde } int CHARACTER_STRING_identification_context__negotiation::XER_decode( - const XERdescriptor_t& p_td, XmlReaderWrap& reader, unsigned int flavor, embed_values_dec_struct_t*) + const XERdescriptor_t& p_td, XmlReaderWrap& reader, unsigned int flavor, unsigned int flavor2, embed_values_dec_struct_t*) { int exer = is_exer(flavor); int type = reader.NodeType(), depth = -1; @@ -2510,8 +2510,8 @@ int CHARACTER_STRING_identification_context__negotiation::XER_decode( depth = reader.Depth(); success = reader.Read(); } - field_presentation__context__id.XER_decode(EMBEDDED_PDV_identification_cn_pci_xer_, reader, flavor, 0); - field_transfer__syntax .XER_decode(EMBEDDED_PDV_identification_cn_tsx_xer_, reader, flavor, 0); + field_presentation__context__id.XER_decode(EMBEDDED_PDV_identification_cn_pci_xer_, reader, flavor, flavor2, 0); + field_transfer__syntax .XER_decode(EMBEDDED_PDV_identification_cn_tsx_xer_, reader, flavor, flavor2, 0); for (; success == 1; success = reader.Read()) { type = reader.NodeType(); if (XML_READER_TYPE_END_ELEMENT == type) { @@ -3256,7 +3256,7 @@ void CHARACTER_STRING::decode(const TTCN_Typedescriptor_t& p_td, TTCN_Buffer& p_ if (type==XML_READER_TYPE_ELEMENT) break; } - XER_decode(*p_td.xer, reader, XER_coding, 0); + XER_decode(*p_td.xer, reader, XER_coding, XER_NONE, 0); size_t bytes = reader.ByteConsumed(); p_buf.set_pos(bytes); break;} @@ -3345,7 +3345,7 @@ int CHARACTER_STRING::XER_encode(const XERdescriptor_t& p_td, TTCN_Buffer& p_buf } int CHARACTER_STRING::XER_decode(const XERdescriptor_t& p_td, - XmlReaderWrap& reader, unsigned int flavor, embed_values_dec_struct_t*) + XmlReaderWrap& reader, unsigned int flavor, unsigned int flavor2, embed_values_dec_struct_t*) { int exer = is_exer(flavor); int success = reader.Ok(), depth = -1, type; @@ -3358,13 +3358,13 @@ int CHARACTER_STRING::XER_decode(const XERdescriptor_t& p_td, break; } } - field_identification .XER_decode(CHARACTER_STRING_identification_xer_ , reader, flavor, 0); - field_data__value__descriptor.XER_decode(CHARACTER_STRING_data_value_descriptor_xer_, reader, flavor, 0); + field_identification .XER_decode(CHARACTER_STRING_identification_xer_ , reader, flavor, flavor2, 0); + field_data__value__descriptor.XER_decode(CHARACTER_STRING_data_value_descriptor_xer_, reader, flavor, flavor2, 0); if (field_data__value__descriptor.is_value()) { TTCN_EncDec_ErrorContext::error(TTCN_EncDec::ET_INVAL_MSG, "data-value-descriptor not allowed for EMBEDDED PDV"); } - field_string__value .XER_decode(CHARACTER_STRING_data_value_xer_ , reader, flavor, 0); + field_string__value .XER_decode(CHARACTER_STRING_data_value_xer_ , reader, flavor, flavor2, 0); for (success = reader.Read(); success == 1; success = reader.Read()) { type = reader.NodeType(); if (XML_READER_TYPE_END_ELEMENT == type) { diff --git a/core/ASN_CharacterString.hh b/core/ASN_CharacterString.hh index f1cd8f666..1ca8aad63 100644 --- a/core/ASN_CharacterString.hh +++ b/core/ASN_CharacterString.hh @@ -89,7 +89,7 @@ public: int XER_encode(const XERdescriptor_t& p_td, TTCN_Buffer& p_buf, unsigned int flavor, int indent, embed_values_enc_struct_t*) const; int XER_decode(const XERdescriptor_t& p_td, - XmlReaderWrap& reader, unsigned int flavor, embed_values_dec_struct_t*); + XmlReaderWrap& reader, unsigned int flavor, unsigned int flavor2, embed_values_dec_struct_t*); private: boolean BER_decode_set_selection(const ASN_BER_TLV_t& p_tlv); public: @@ -213,7 +213,7 @@ public: int XER_encode(const XERdescriptor_t& p_td, TTCN_Buffer& p_buf, unsigned int flavor, int indent, embed_values_enc_struct_t*) const; int XER_decode(const XERdescriptor_t& p_td, - XmlReaderWrap& reader, unsigned int flavor, embed_values_dec_struct_t*); + XmlReaderWrap& reader, unsigned int flavor, unsigned int flavor2, embed_values_dec_struct_t*); }; class CHARACTER_STRING_identification_syntaxes_template : public Base_Template { @@ -322,7 +322,7 @@ public: int XER_encode(const XERdescriptor_t& p_td, TTCN_Buffer& p_buf, unsigned int flavor, int indent, embed_values_enc_struct_t*) const; int XER_decode(const XERdescriptor_t& p_td, - XmlReaderWrap& reader, unsigned int flavor, embed_values_dec_struct_t*); + XmlReaderWrap& reader, unsigned int flavor, unsigned int flavor2, embed_values_dec_struct_t*); }; class CHARACTER_STRING_identification_context__negotiation_template : public Base_Template { @@ -438,7 +438,7 @@ public: ASN_BER_TLV_t* BER_encode_TLV(const TTCN_Typedescriptor_t& p_td, unsigned p_coding) const; boolean BER_decode_TLV(const TTCN_Typedescriptor_t& p_td, const ASN_BER_TLV_t& p_tlv, unsigned L_form); int XER_encode(const XERdescriptor_t&, TTCN_Buffer&, unsigned int, int, embed_values_enc_struct_t*) const; - int XER_decode(const XERdescriptor_t&, XmlReaderWrap& reader, unsigned int, embed_values_dec_struct_t*); + int XER_decode(const XERdescriptor_t&, XmlReaderWrap& reader, unsigned int, unsigned int, embed_values_dec_struct_t*); }; class CHARACTER_STRING_template : public Base_Template { diff --git a/core/ASN_EmbeddedPDV.cc b/core/ASN_EmbeddedPDV.cc index c0bb57718..e068c708d 100644 --- a/core/ASN_EmbeddedPDV.cc +++ b/core/ASN_EmbeddedPDV.cc @@ -797,7 +797,7 @@ int EMBEDDED_PDV_identification::XER_encode(const XERdescriptor_t& p_td, } int EMBEDDED_PDV_identification::XER_decode(const XERdescriptor_t& p_td, - XmlReaderWrap& reader, unsigned int flavor, embed_values_dec_struct_t*) + XmlReaderWrap& reader, unsigned int flavor, unsigned int flavor2, embed_values_dec_struct_t*) { int exer = is_exer(flavor); // we are supposed to be parked on our element @@ -817,27 +817,27 @@ int EMBEDDED_PDV_identification::XER_decode(const XERdescriptor_t& p_td, size_t namelen = strlen(name); switch (namelen) { case 8: // syntaxes - syntaxes().XER_decode(EMBEDDED_PDV_identification_sxs_xer_, reader, flavor, 0); + syntaxes().XER_decode(EMBEDDED_PDV_identification_sxs_xer_, reader, flavor, flavor2, 0); break; case 6: // syntax - syntax().XER_decode(EMBEDDED_PDV_identification_sx_xer_, reader, flavor, 0); + syntax().XER_decode(EMBEDDED_PDV_identification_sx_xer_, reader, flavor, flavor2, 0); break; case 23: // presentation-context-id - presentation__context__id().XER_decode(EMBEDDED_PDV_identification_pci_xer_, reader, flavor, 0); + presentation__context__id().XER_decode(EMBEDDED_PDV_identification_pci_xer_, reader, flavor, flavor2, 0); break; case 19: // context-negotiation - context__negotiation().XER_decode(EMBEDDED_PDV_identification_cn_xer_, reader, flavor, 0); + context__negotiation().XER_decode(EMBEDDED_PDV_identification_cn_xer_, reader, flavor, flavor2, 0); break; case 15: // transfer-syntax - transfer__syntax().XER_decode(EMBEDDED_PDV_identification_ts_xer_, reader, flavor, 0); + transfer__syntax().XER_decode(EMBEDDED_PDV_identification_ts_xer_, reader, flavor, flavor2, 0); break; case 5: // fixed - fixed().XER_decode(EMBEDDED_PDV_identification_fix_xer_, reader, flavor, 0); + fixed().XER_decode(EMBEDDED_PDV_identification_fix_xer_, reader, flavor, flavor2, 0); break; default: @@ -1778,7 +1778,7 @@ int EMBEDDED_PDV_identification_syntaxes::XER_encode(const XERdescriptor_t& p_td } int EMBEDDED_PDV_identification_syntaxes::XER_decode(const XERdescriptor_t& /*p_td*/, - XmlReaderWrap& reader, unsigned int flavor, embed_values_dec_struct_t*) + XmlReaderWrap& reader, unsigned int flavor, unsigned int flavor2, embed_values_dec_struct_t*) { // we stand on <syntaxes>, move ahead first int type; for (int success = reader.Read(); success == 1; success = reader.Read()) @@ -1789,8 +1789,8 @@ int EMBEDDED_PDV_identification_syntaxes::XER_decode(const XERdescriptor_t& /*p_ break; } // FIXME this assumes the right element - field_abstract.XER_decode(EMBEDDED_PDV_identification_sxs_abs_xer_, reader, flavor, 0); - field_transfer.XER_decode(EMBEDDED_PDV_identification_sxs_xfr_xer_, reader, flavor, 0); + field_abstract.XER_decode(EMBEDDED_PDV_identification_sxs_abs_xer_, reader, flavor, flavor2, 0); + field_transfer.XER_decode(EMBEDDED_PDV_identification_sxs_xfr_xer_, reader, flavor, flavor2, 0); for (int success = 1; success == 1; success = reader.Read()) { type = reader.NodeType(); @@ -2511,7 +2511,7 @@ int EMBEDDED_PDV_identification_context__negotiation::XER_encode(const XERdescri } int EMBEDDED_PDV_identification_context__negotiation::XER_decode( - const XERdescriptor_t& p_td, XmlReaderWrap& reader, unsigned int flavor, embed_values_dec_struct_t*) + const XERdescriptor_t& p_td, XmlReaderWrap& reader, unsigned int flavor, unsigned int flavor2, embed_values_dec_struct_t*) { int exer = is_exer(flavor); int type = reader.NodeType(), depth = -1; @@ -2522,8 +2522,8 @@ int EMBEDDED_PDV_identification_context__negotiation::XER_decode( depth = reader.Depth(); success = reader.Read(); } - field_presentation__context__id.XER_decode(EMBEDDED_PDV_identification_cn_pci_xer_, reader, flavor, 0); - field_transfer__syntax .XER_decode(EMBEDDED_PDV_identification_cn_tsx_xer_, reader, flavor, 0); + field_presentation__context__id.XER_decode(EMBEDDED_PDV_identification_cn_pci_xer_, reader, flavor, flavor2, 0); + field_transfer__syntax .XER_decode(EMBEDDED_PDV_identification_cn_tsx_xer_, reader, flavor, flavor2, 0); for (; success == 1; success = reader.Read()) { type = reader.NodeType(); if (XML_READER_TYPE_END_ELEMENT == type) { @@ -3267,7 +3267,7 @@ void EMBEDDED_PDV::decode(const TTCN_Typedescriptor_t& p_td, TTCN_Buffer& p_buf, if (type==XML_READER_TYPE_ELEMENT) break; } - XER_decode(*p_td.xer, reader, XER_coding, 0); + XER_decode(*p_td.xer, reader, XER_coding, XER_NONE, 0); size_t bytes = reader.ByteConsumed(); p_buf.set_pos(bytes); break;} @@ -3364,7 +3364,7 @@ int EMBEDDED_PDV::XER_encode(const XERdescriptor_t& p_td, return (int)p_buf.get_len() - encoded_length; } -int EMBEDDED_PDV::XER_decode(const XERdescriptor_t& p_td, XmlReaderWrap& reader, unsigned int flavor, embed_values_dec_struct_t*) +int EMBEDDED_PDV::XER_decode(const XERdescriptor_t& p_td, XmlReaderWrap& reader, unsigned int flavor, unsigned int flavor2, embed_values_dec_struct_t*) { int exer = is_exer(flavor); int depth = 1, type, success; @@ -3377,13 +3377,13 @@ int EMBEDDED_PDV::XER_decode(const XERdescriptor_t& p_td, XmlReaderWrap& reader, break; } } - field_identification .XER_decode(EMBEDDED_PDV_identification_xer_ , reader, flavor, 0); - field_data__value__descriptor.XER_decode(EMBEDDED_PDV_data_value_descriptor_xer_, reader, flavor, 0); + field_identification .XER_decode(EMBEDDED_PDV_identification_xer_ , reader, flavor, flavor2, 0); + field_data__value__descriptor.XER_decode(EMBEDDED_PDV_data_value_descriptor_xer_, reader, flavor, flavor2, 0); if (field_data__value__descriptor.is_value()) { TTCN_EncDec_ErrorContext::error(TTCN_EncDec::ET_INVAL_MSG, "data-value-descriptor not allowed for EMBEDDED PDV"); } - field_data__value .XER_decode(EMBEDDED_PDV_data_value_xer_ , reader, flavor, 0); + field_data__value .XER_decode(EMBEDDED_PDV_data_value_xer_ , reader, flavor, flavor2, 0); for (success = reader.Read(); success == 1; success = reader.Read()) { type = reader.NodeType(); if (XML_READER_TYPE_END_ELEMENT == type) { diff --git a/core/ASN_EmbeddedPDV.hh b/core/ASN_EmbeddedPDV.hh index 5e0c9aa67..951f7ba9d 100644 --- a/core/ASN_EmbeddedPDV.hh +++ b/core/ASN_EmbeddedPDV.hh @@ -89,7 +89,7 @@ public: int XER_encode(const XERdescriptor_t& p_td, TTCN_Buffer& p_buf, unsigned int flavor, int indent, embed_values_enc_struct_t*) const; int XER_decode(const XERdescriptor_t& p_td, XmlReaderWrap& reader, - unsigned int flavor, embed_values_dec_struct_t*); + unsigned int flavor, unsigned int flavor2, embed_values_dec_struct_t*); private: boolean BER_decode_set_selection(const ASN_BER_TLV_t& p_tlv); public: @@ -211,7 +211,7 @@ public: ASN_BER_TLV_t* BER_encode_TLV(const TTCN_Typedescriptor_t& p_td, unsigned p_coding) const; boolean BER_decode_TLV(const TTCN_Typedescriptor_t& p_td, const ASN_BER_TLV_t& p_tlv, unsigned L_form); int XER_encode(const XERdescriptor_t&, TTCN_Buffer&, unsigned int, int, embed_values_enc_struct_t*) const; - int XER_decode(const XERdescriptor_t&, XmlReaderWrap& reader, unsigned int, embed_values_dec_struct_t*); + int XER_decode(const XERdescriptor_t&, XmlReaderWrap& reader, unsigned int, unsigned int, embed_values_dec_struct_t*); }; class EMBEDDED_PDV_identification_syntaxes_template : public Base_Template { @@ -318,7 +318,7 @@ public: ASN_BER_TLV_t* BER_encode_TLV(const TTCN_Typedescriptor_t& p_td, unsigned p_coding) const; boolean BER_decode_TLV(const TTCN_Typedescriptor_t& p_td, const ASN_BER_TLV_t& p_tlv, unsigned L_form); int XER_encode(const XERdescriptor_t&, TTCN_Buffer&, unsigned int, int, embed_values_enc_struct_t*) const; - int XER_decode(const XERdescriptor_t&, XmlReaderWrap& reader, unsigned int, embed_values_dec_struct_t*); + int XER_decode(const XERdescriptor_t&, XmlReaderWrap& reader, unsigned int, unsigned int, embed_values_dec_struct_t*); }; class EMBEDDED_PDV_identification_context__negotiation_template : public Base_Template { @@ -431,7 +431,7 @@ public: ASN_BER_TLV_t* BER_encode_TLV(const TTCN_Typedescriptor_t& p_td, unsigned p_coding) const; boolean BER_decode_TLV(const TTCN_Typedescriptor_t& p_td, const ASN_BER_TLV_t& p_tlv, unsigned L_form); int XER_encode(const XERdescriptor_t&, TTCN_Buffer&, unsigned int, int, embed_values_enc_struct_t*) const; - int XER_decode(const XERdescriptor_t&, XmlReaderWrap&, unsigned int, embed_values_dec_struct_t*); + int XER_decode(const XERdescriptor_t&, XmlReaderWrap&, unsigned int, unsigned int, embed_values_dec_struct_t*); }; class EMBEDDED_PDV_template : public Base_Template { diff --git a/core/ASN_External.cc b/core/ASN_External.cc index ff6e0d5d8..cf9d90251 100644 --- a/core/ASN_External.cc +++ b/core/ASN_External.cc @@ -105,7 +105,7 @@ namespace { /* anonymous namespace */ int XER_encode(const XERdescriptor_t& p_td, TTCN_Buffer& p_buf, unsigned int flavor, int indent, embed_values_enc_struct_t*) const; int XER_decode(const XERdescriptor_t& p_td, XmlReaderWrap& reader, - unsigned int flavor, embed_values_dec_struct_t*); + unsigned int flavor, unsigned int flavor2, embed_values_dec_struct_t*); private: boolean BER_decode_set_selection(const ASN_BER_TLV_t& p_tlv); public: @@ -163,7 +163,7 @@ namespace { /* anonymous namespace */ int XER_encode(const XERdescriptor_t& p_td, TTCN_Buffer& p_buf, unsigned int flavor, int indent, embed_values_enc_struct_t*) const; int XER_decode(const XERdescriptor_t& p_td, XmlReaderWrap& reader, - unsigned int flavor, embed_values_dec_struct_t*); + unsigned int flavor, unsigned int flavor2, embed_values_dec_struct_t*); }; /** Transform the information from the visible format to the encoding format @@ -440,7 +440,7 @@ namespace { /* anonymous namespace */ } int EXTERNALtransfer_encoding::XER_decode(const XERdescriptor_t& p_td, - XmlReaderWrap& reader, unsigned int flavor, embed_values_dec_struct_t*) + XmlReaderWrap& reader, unsigned int flavor, unsigned int flavor2, embed_values_dec_struct_t*) { int exer = is_exer(flavor); int success = reader.Ok(), type, depth = -1; @@ -463,15 +463,15 @@ namespace { /* anonymous namespace */ switch (*name) { case 's': // single-ASN1-type - single__ASN1__type().XER_decode(EXTERNAL_encoding_singleASN_xer_, reader, flavor, 0); + single__ASN1__type().XER_decode(EXTERNAL_encoding_singleASN_xer_, reader, flavor, flavor2, 0); break; case 'o': // octet-aligned - octet__aligned().XER_decode(EXTERNAL_encoding_octet_aligned_xer_, reader, flavor, 0); + octet__aligned().XER_decode(EXTERNAL_encoding_octet_aligned_xer_, reader, flavor, flavor2, 0); break; case 'a': // arbitrary - arbitrary().XER_decode(EXTERNAL_encoding_arbitrary_xer_, reader, flavor, 0); + arbitrary().XER_decode(EXTERNAL_encoding_arbitrary_xer_, reader, flavor, flavor2, 0); break; default: @@ -582,7 +582,7 @@ namespace { /* anonymous namespace */ } int EXTERNALtransfer::XER_decode(const XERdescriptor_t& p_td, XmlReaderWrap& reader, - unsigned int flavor, embed_values_dec_struct_t*) + unsigned int flavor, unsigned int flavor2, embed_values_dec_struct_t*) { int exer = is_exer(flavor); int success = reader.Ok(), depth = -1; @@ -596,10 +596,10 @@ namespace { /* anonymous namespace */ } } - field_direct__reference .XER_decode(EXTERNAL_direct_reference_xer_ , reader, flavor, 0); - field_indirect__reference .XER_decode(EXTERNAL_indirect_reference_xer_ , reader, flavor, 0); - field_data__value__descriptor.XER_decode(EXTERNAL_data_value_descriptor_xer_, reader, flavor, 0); - field_encoding .XER_decode(EXTERNAL_encoding_xer_ , reader, flavor, 0); + field_direct__reference .XER_decode(EXTERNAL_direct_reference_xer_ , reader, flavor, flavor2, 0); + field_indirect__reference .XER_decode(EXTERNAL_indirect_reference_xer_ , reader, flavor, flavor2, 0); + field_data__value__descriptor.XER_decode(EXTERNAL_data_value_descriptor_xer_, reader, flavor, flavor2, 0); + field_encoding .XER_decode(EXTERNAL_encoding_xer_ , reader, flavor, flavor2, 0); for (success = reader.Read(); success == 1; success = reader.Read()) { int type = reader.NodeType(); @@ -709,10 +709,10 @@ int EXTERNAL::XER_encode(const XERdescriptor_t& p_td, } int EXTERNAL::XER_decode(const XERdescriptor_t& p_td, XmlReaderWrap& reader, - unsigned int flavor, embed_values_dec_struct_t*) + unsigned int flavor, unsigned int flavor2, embed_values_dec_struct_t*) { EXTERNALtransfer xfer; - xfer.XER_decode(p_td, reader, flavor, 0); + xfer.XER_decode(p_td, reader, flavor, flavor2, 0); transfer(&xfer); return 1; // decode successful } @@ -3469,7 +3469,7 @@ void EXTERNAL::decode(const TTCN_Typedescriptor_t& p_td, TTCN_Buffer& p_buf, TTC if (type==XML_READER_TYPE_ELEMENT) break; } - XER_decode(*p_td.xer, reader, XER_coding, 0); + XER_decode(*p_td.xer, reader, XER_coding, XER_NONE, 0); size_t bytes = reader.ByteConsumed(); p_buf.set_pos(bytes); break;} diff --git a/core/ASN_External.hh b/core/ASN_External.hh index 609a1ba1f..f2bcca0ce 100644 --- a/core/ASN_External.hh +++ b/core/ASN_External.hh @@ -412,7 +412,7 @@ public: int XER_encode(const XERdescriptor_t& p_td, TTCN_Buffer& p_buf, unsigned int flavor, int indent, embed_values_enc_struct_t*) const; int XER_decode(const XERdescriptor_t& p_td, XmlReaderWrap& reader, - unsigned int flavor, embed_values_dec_struct_t*); + unsigned int flavor, unsigned int flavor2, embed_values_dec_struct_t*); }; class EXTERNAL_template : public Base_Template { diff --git a/core/ASN_Null.cc b/core/ASN_Null.cc index 36616c1a7..994b81dda 100644 --- a/core/ASN_Null.cc +++ b/core/ASN_Null.cc @@ -160,7 +160,7 @@ void ASN_NULL::decode(const TTCN_Typedescriptor_t& p_td, TTCN_Buffer& p_buf, if (type==XML_READER_TYPE_ELEMENT) break; } - XER_decode(*p_td.xer, reader, XER_coding, 0); + XER_decode(*p_td.xer, reader, XER_coding, XER_NONE, 0); size_t bytes = reader.ByteConsumed(); p_buf.set_pos(bytes); break;} @@ -239,7 +239,7 @@ int ASN_NULL::XER_encode(const XERdescriptor_t& p_td, } int ASN_NULL::XER_decode(const XERdescriptor_t& p_td, XmlReaderWrap& reader, - unsigned int flavor, embed_values_dec_struct_t*) + unsigned int flavor, unsigned int /*flavor2*/, embed_values_dec_struct_t*) { int exer = is_exer(flavor); TTCN_EncDec_ErrorContext ec("While XER decoding NULL type: "); diff --git a/core/ASN_Null.hh b/core/ASN_Null.hh index f2ed45698..cef26477b 100644 --- a/core/ASN_Null.hh +++ b/core/ASN_Null.hh @@ -72,7 +72,7 @@ public: int XER_encode(const XERdescriptor_t& p_td, TTCN_Buffer& p_buf, unsigned int flavor, int indent, embed_values_enc_struct_t*) const; int XER_decode(const XERdescriptor_t& p_td, XmlReaderWrap& reader, - unsigned int flavor, embed_values_dec_struct_t*); + unsigned int flavor, unsigned int flavor2, embed_values_dec_struct_t*); /** Encodes accordingly to the JSON encoding rules. * Returns the length of the encoded data. */ diff --git a/core/Array.hh b/core/Array.hh index 0db8bc79f..516068850 100644 --- a/core/Array.hh +++ b/core/Array.hh @@ -495,9 +495,9 @@ void VALUE_ARRAY<T_type,array_size,index_offset>::decode( template <typename T_type, unsigned int array_size, int index_offset> int VALUE_ARRAY<T_type,array_size,index_offset>::JSON_encode( - const TTCN_Typedescriptor_t&, JSON_Tokenizer& p_tok) const + const TTCN_Typedescriptor_t& p_td, JSON_Tokenizer& p_tok) const { - if (!is_bound()) { + if (!is_bound() && (NULL == p_td.json || !p_td.json->metainfo_unbound)) { TTCN_EncDec_ErrorContext::error(TTCN_EncDec::ET_UNBOUND, "Encoding an unbound array value."); return -1; @@ -505,10 +505,19 @@ int VALUE_ARRAY<T_type,array_size,index_offset>::JSON_encode( int enc_len = p_tok.put_next_token(JSON_TOKEN_ARRAY_START, NULL); - for(unsigned int i = 0; i < array_size; ++i) { - int ret_val = array_elements[i].JSON_encode(*get_elem_descr(), p_tok); - if (0 > ret_val) break; - enc_len += ret_val; + for (unsigned int i = 0; i < array_size; ++i) { + if (NULL != p_td.json && p_td.json->metainfo_unbound && !array_elements[i].is_bound()) { + // unbound elements are encoded as { "metainfo []" : "unbound" } + enc_len += p_tok.put_next_token(JSON_TOKEN_OBJECT_START, NULL); + enc_len += p_tok.put_next_token(JSON_TOKEN_NAME, "metainfo []"); + enc_len += p_tok.put_next_token(JSON_TOKEN_STRING, "\"unbound\""); + enc_len += p_tok.put_next_token(JSON_TOKEN_OBJECT_END, NULL); + } + else { + int ret_val = array_elements[i].JSON_encode(*get_elem_descr(), p_tok); + if (0 > ret_val) break; + enc_len += ret_val; + } } enc_len += p_tok.put_next_token(JSON_TOKEN_ARRAY_END, NULL); @@ -517,7 +526,7 @@ int VALUE_ARRAY<T_type,array_size,index_offset>::JSON_encode( template <typename T_type, unsigned int array_size, int index_offset> int VALUE_ARRAY<T_type,array_size,index_offset>::JSON_decode( - const TTCN_Typedescriptor_t&, JSON_Tokenizer& p_tok, boolean p_silent) + const TTCN_Typedescriptor_t& p_td, JSON_Tokenizer& p_tok, boolean p_silent) { json_token_t token = JSON_TOKEN_NONE; int dec_len = p_tok.get_next_token(&token, NULL, NULL); @@ -529,8 +538,33 @@ int VALUE_ARRAY<T_type,array_size,index_offset>::JSON_decode( return JSON_ERROR_INVALID_TOKEN; } - for(unsigned int i = 0; i < array_size; ++i) { - int ret_val = array_elements[i].JSON_decode(*get_elem_descr(), p_tok, p_silent); + for (unsigned int i = 0; i < array_size; ++i) { + size_t buf_pos = p_tok.get_buf_pos(); + int ret_val; + if (NULL != p_td.json && p_td.json->metainfo_unbound) { + // check for metainfo object + ret_val = p_tok.get_next_token(&token, NULL, NULL); + if (JSON_TOKEN_OBJECT_START == token) { + char* value = NULL; + size_t value_len = 0; + ret_val += p_tok.get_next_token(&token, &value, &value_len); + if (JSON_TOKEN_NAME == token && 11 == value_len && + 0 == strncmp(value, "metainfo []", 11)) { + ret_val += p_tok.get_next_token(&token, &value, &value_len); + if (JSON_TOKEN_STRING == token && 9 == value_len && + 0 == strncmp(value, "\"unbound\"", 9)) { + ret_val = p_tok.get_next_token(&token, NULL, NULL); + if (JSON_TOKEN_OBJECT_END == token) { + dec_len += ret_val; + continue; + } + } + } + } + // metainfo object not found, jump back and let the element type decode it + p_tok.set_buf_pos(buf_pos); + } + ret_val = array_elements[i].JSON_decode(*get_elem_descr(), p_tok, p_silent); if (JSON_ERROR_INVALID_TOKEN == ret_val) { JSON_ERROR(TTCN_EncDec::ET_INVAL_MSG, JSON_DEC_ARRAY_ELEM_TOKEN_ERROR, array_size - i, (array_size - i > 1) ? "s" : ""); diff --git a/core/Basetype.cc b/core/Basetype.cc index 37511128f..68448fb66 100644 --- a/core/Basetype.cc +++ b/core/Basetype.cc @@ -149,7 +149,7 @@ void Base_Type::decode(const TTCN_Typedescriptor_t& p_td, TTCN_Buffer& p_buf, for (int success=reader.Read(); success==1; success=reader.Read()) { if (reader.NodeType() == XML_READER_TYPE_ELEMENT) break; } - XER_decode(*(p_td.xer), reader, XER_coding, 0); + XER_decode(*(p_td.xer), reader, XER_coding, XER_NONE, 0); size_t bytes = reader.ByteConsumed(); p_buf.set_pos(bytes); break;} @@ -975,7 +975,7 @@ int Base_Type::XER_encode(const XERdescriptor_t& p_td, } int Base_Type::XER_decode(const XERdescriptor_t& p_td, XmlReaderWrap&, - unsigned int, embed_values_dec_struct_t*) { + unsigned int, unsigned int, embed_values_dec_struct_t*) { TTCN_error("XER decoding requested for type '%-.*s' which has no" " XER decoding method.", p_td.namelens[0]-2, p_td.names[0]); return 0; diff --git a/core/Basetype.hh b/core/Basetype.hh index 6c7e77b1b..e4c8323a3 100644 --- a/core/Basetype.hh +++ b/core/Basetype.hh @@ -499,11 +499,12 @@ public: * @param p_td type descriptor * @param reader Wrapper around the XML processor * @param flavor one of XER_flavor values + * @param flavor2 one of XER_flavor2 values * @param emb_val embed values data (only relevant for record of types) * @return number of bytes "consumed" */ VIRTUAL_IF_RUNTIME_2 int XER_decode(const XERdescriptor_t& p_td, - XmlReaderWrap& reader, unsigned int flavor, embed_values_dec_struct_t* emb_val); + XmlReaderWrap& reader, unsigned int flavor, unsigned int flavor2, embed_values_dec_struct_t* emb_val); /** Return an array of namespace declarations. * @@ -804,7 +805,7 @@ public: int encode_element(int i, const XERdescriptor_t& p_td, const Erroneous_values_t* err_vals, const Erroneous_descriptor_t* emb_descr, TTCN_Buffer& p_buf, unsigned int flavor, int indent, embed_values_enc_struct_t* emb_val) const; - virtual int XER_decode(const XERdescriptor_t& p_td, XmlReaderWrap& reader, unsigned int, embed_values_dec_struct_t*); + virtual int XER_decode(const XERdescriptor_t& p_td, XmlReaderWrap& reader, unsigned int, unsigned int, embed_values_dec_struct_t*); virtual boolean isXerAttribute() const; virtual boolean isXmlValueList() const; @@ -864,16 +865,15 @@ protected: const Base_Type* value; }; Erroneous_descriptor_t* err_descr; - boolean bound_flag; public: - Record_Type() : err_descr(NULL), bound_flag(false) {} + Record_Type() : err_descr(NULL) {} /// @{ /** get pointer to a field */ virtual Base_Type* get_at(int index_value) = 0; virtual const Base_Type* get_at(int index_value) const = 0; /// @} - + /** get the index to a field based on its name and namespace URI, or -1 */ int get_index_byname(const char *name, const char *uri) const; @@ -946,7 +946,7 @@ public: const XERdescriptor_t& p_td, TTCN_Buffer& p_buf, unsigned int flavor, int indent, embed_values_enc_struct_t*) const; virtual int XER_decode(const XERdescriptor_t& p_td, XmlReaderWrap& reader, - unsigned int, embed_values_dec_struct_t*); + unsigned int, unsigned int, embed_values_dec_struct_t*); /// @{ /// Methods overridden in the derived (generated) class virtual int get_xer_num_attr() const { return 0; /* default */ } @@ -1023,7 +1023,7 @@ public: virtual int XER_encode(const XERdescriptor_t& p_td, TTCN_Buffer& p_buf, unsigned int flavor, int indent, embed_values_enc_struct_t*) const; virtual int XER_decode(const XERdescriptor_t& p_td, XmlReaderWrap& reader, - unsigned int, embed_values_dec_struct_t*); + unsigned int, unsigned int, embed_values_dec_struct_t*); /** Encodes accordingly to the JSON encoding rules. * Returns the length of the encoded data. */ diff --git a/core/Bitstring.cc b/core/Bitstring.cc index a178fb2d9..50e897a1d 100644 --- a/core/Bitstring.cc +++ b/core/Bitstring.cc @@ -711,7 +711,7 @@ void BITSTRING::decode(const TTCN_Typedescriptor_t& p_td, TTCN_Buffer& p_buf, if (type==XML_READER_TYPE_ELEMENT) break; } - XER_decode(*p_td.xer, reader, XER_coding, 0); + XER_decode(*p_td.xer, reader, XER_coding, XER_NONE, 0); size_t bytes = reader.ByteConsumed(); p_buf.set_pos(bytes); break;} @@ -1069,7 +1069,7 @@ int BITSTRING::XER_encode(const XERdescriptor_t& p_td, } int BITSTRING::XER_decode(const XERdescriptor_t& p_td, XmlReaderWrap& reader, - unsigned int flavor, embed_values_dec_struct_t*) + unsigned int flavor, unsigned int /*flavor2*/, embed_values_dec_struct_t*) { int exer = is_exer(flavor); int success = reader.Ok(), depth = -1, type; diff --git a/core/Bitstring.hh b/core/Bitstring.hh index b890333a9..f9b53d30a 100644 --- a/core/Bitstring.hh +++ b/core/Bitstring.hh @@ -175,7 +175,7 @@ public: boolean no_err=FALSE, int sel_field=-1, boolean first_call=TRUE); int XER_encode(const XERdescriptor_t&, TTCN_Buffer&, unsigned int, int, embed_values_enc_struct_t*) const; - int XER_decode(const XERdescriptor_t&, XmlReaderWrap& reader, unsigned int, embed_values_dec_struct_t*); + int XER_decode(const XERdescriptor_t&, XmlReaderWrap& reader, unsigned int, unsigned int, embed_values_dec_struct_t*); /** Encodes accordingly to the JSON encoding rules. * Returns the length of the encoded data. */ diff --git a/core/Boolean.cc b/core/Boolean.cc index 5dd0ca355..e519012fd 100644 --- a/core/Boolean.cc +++ b/core/Boolean.cc @@ -295,7 +295,7 @@ void BOOLEAN::decode(const TTCN_Typedescriptor_t& p_td, TTCN_Buffer& p_buf, if (type==XML_READER_TYPE_ELEMENT) break; } - XER_decode(*p_td.xer, reader, XER_coding, 0); + XER_decode(*p_td.xer, reader, XER_coding, XER_NONE, 0); size_t bytes = reader.ByteConsumed(); p_buf.set_pos(bytes); break;} @@ -624,7 +624,7 @@ int BOOLEAN::XER_encode(const XERdescriptor_t& p_td, } int BOOLEAN::XER_decode(const XERdescriptor_t& p_td, XmlReaderWrap& reader, - unsigned int flavor, embed_values_dec_struct_t*) + unsigned int flavor, unsigned int /*flavor2*/, embed_values_dec_struct_t*) { const boolean exer = is_exer(flavor); int XMLValueList = !exer && is_record_of(flavor); diff --git a/core/Boolean.hh b/core/Boolean.hh index 2a7a60e66..95d0414ba 100644 --- a/core/Boolean.hh +++ b/core/Boolean.hh @@ -105,7 +105,7 @@ public: int XER_encode(const XERdescriptor_t& p_td, TTCN_Buffer& p_buf, unsigned int flavor, int indent, embed_values_enc_struct_t*) const; int XER_decode(const XERdescriptor_t& p_td, XmlReaderWrap& reader, - unsigned int flavor, embed_values_dec_struct_t*); + unsigned int flavor, unsigned int flavor2, embed_values_dec_struct_t*); /** Encodes accordingly to the JSON encoding rules. * Returns the length of the encoded data. */ diff --git a/core/Charstring.cc b/core/Charstring.cc index 48fccff29..9e23390d5 100644 --- a/core/Charstring.cc +++ b/core/Charstring.cc @@ -855,7 +855,7 @@ void CHARSTRING::decode(const TTCN_Typedescriptor_t& p_td, if (type==XML_READER_TYPE_ELEMENT) break; } - XER_decode(*p_td.xer, reader, XER_coding, 0); + XER_decode(*p_td.xer, reader, XER_coding, XER_NONE, 0); size_t bytes = reader.ByteConsumed(); p_buf.set_pos(bytes); break;} @@ -1321,7 +1321,7 @@ unsigned int xlate(cbyte*in, int phase, unsigned char*dest) { } int CHARSTRING::XER_decode(const XERdescriptor_t& p_td, XmlReaderWrap& reader, - unsigned int flavor, embed_values_dec_struct_t*) { + unsigned int flavor, unsigned int /*flavor2*/, embed_values_dec_struct_t*) { int exer = is_exer(flavor); int success = reader.Ok(), depth = -1; diff --git a/core/Charstring.hh b/core/Charstring.hh index 196745007..0322e572b 100644 --- a/core/Charstring.hh +++ b/core/Charstring.hh @@ -214,7 +214,7 @@ public: int TEXT_decode(const TTCN_Typedescriptor_t&, TTCN_Buffer&, Limit_Token_List&, boolean no_err=FALSE, boolean first_call=TRUE); int XER_encode(const XERdescriptor_t&, TTCN_Buffer&, unsigned int, int, embed_values_enc_struct_t*) const; - int XER_decode(const XERdescriptor_t&, XmlReaderWrap& reader, unsigned int, embed_values_dec_struct_t*); + int XER_decode(const XERdescriptor_t&, XmlReaderWrap& reader, unsigned int, unsigned int, embed_values_dec_struct_t*); /** Returns the charstring in the format a string would appear in C or TTCN-3 code. * Inserts double quotation marks to the beginning and end of the string and diff --git a/core/Float.cc b/core/Float.cc index ea3f06b0a..e082fa162 100644 --- a/core/Float.cc +++ b/core/Float.cc @@ -409,7 +409,7 @@ void FLOAT::decode(const TTCN_Typedescriptor_t& p_td, TTCN_Buffer& p_buf, if (type==XML_READER_TYPE_ELEMENT) break; } - XER_decode(*p_td.xer, reader, XER_coding, 0); + XER_decode(*p_td.xer, reader, XER_coding, XER_NONE, 0); size_t bytes = reader.ByteConsumed(); p_buf.set_pos(bytes); break;} @@ -908,7 +908,7 @@ boolean FLOAT::is_float(const char* p_str) } int FLOAT::XER_decode(const XERdescriptor_t& p_td, XmlReaderWrap& reader, - unsigned int flavor, embed_values_dec_struct_t*) + unsigned int flavor, unsigned int /*flavor2*/, embed_values_dec_struct_t*) { bound_flag = false; int exer = is_exer(flavor); diff --git a/core/Float.hh b/core/Float.hh index 01b162f45..879f15333 100644 --- a/core/Float.hh +++ b/core/Float.hh @@ -136,7 +136,7 @@ public: int XER_encode(const XERdescriptor_t& p_td, TTCN_Buffer& p_buf, unsigned int flavor, int indent, embed_values_enc_struct_t*) const; int XER_decode(const XERdescriptor_t& p_td, XmlReaderWrap& reader, - unsigned int flavor, embed_values_dec_struct_t*); + unsigned int flavor, unsigned int flavor2, embed_values_dec_struct_t*); /** Encodes accordingly to the JSON encoding rules. * Returns the length of the encoded data. */ diff --git a/core/Hexstring.cc b/core/Hexstring.cc index c61c13f4c..2ab090e91 100644 --- a/core/Hexstring.cc +++ b/core/Hexstring.cc @@ -711,7 +711,7 @@ void HEXSTRING::decode(const TTCN_Typedescriptor_t& p_td, TTCN_Buffer& p_buf, if (type==XML_READER_TYPE_ELEMENT) break; } - XER_decode(*p_td.xer, reader, XER_coding, 0); + XER_decode(*p_td.xer, reader, XER_coding, XER_NONE, 0); size_t bytes = reader.ByteConsumed(); p_buf.set_pos(bytes); break;} @@ -901,7 +901,7 @@ Because of this, the bit shifting is different. The first three bytes */ int HEXSTRING::XER_decode(const XERdescriptor_t& p_td, XmlReaderWrap& reader, - unsigned int flavor, embed_values_dec_struct_t*) + unsigned int flavor, unsigned int /*flavor2*/, embed_values_dec_struct_t*) { int exer = is_exer(flavor); int success = reader.Ok(), depth = -1, type; diff --git a/core/Hexstring.hh b/core/Hexstring.hh index 7f1ff249d..ff21120b5 100644 --- a/core/Hexstring.hh +++ b/core/Hexstring.hh @@ -129,7 +129,7 @@ public: int XER_encode(const XERdescriptor_t& p_td, TTCN_Buffer& p_buf, unsigned int flavor, int indent, embed_values_enc_struct_t*) const; int XER_decode(const XERdescriptor_t& p_td, XmlReaderWrap& reader, - unsigned int flavor, embed_values_dec_struct_t*); + unsigned int flavor, unsigned int flavor2, embed_values_dec_struct_t*); /** Encodes accordingly to the JSON encoding rules. * Returns the length of the encoded data. */ diff --git a/core/Integer.cc b/core/Integer.cc index c209315b0..51da9911c 100644 --- a/core/Integer.cc +++ b/core/Integer.cc @@ -855,7 +855,7 @@ void INTEGER::decode(const TTCN_Typedescriptor_t& p_td, TTCN_Buffer& p_buf, if (type==XML_READER_TYPE_ELEMENT) break; } - XER_decode(*p_td.xer, reader, XER_coding, 0); + XER_decode(*p_td.xer, reader, XER_coding, XER_NONE, 0); size_t bytes = reader.ByteConsumed(); p_buf.set_pos(bytes); break;} @@ -1593,7 +1593,7 @@ int INTEGER::XER_encode(const XERdescriptor_t& p_td, TTCN_Buffer& p_buf, } int INTEGER::XER_decode(const XERdescriptor_t& p_td, XmlReaderWrap& reader, - unsigned int flavor, embed_values_dec_struct_t*) + unsigned int flavor, unsigned int /*flavor2*/, embed_values_dec_struct_t*) { const boolean exer = is_exer(flavor); int depth = -1, success = reader.Ok(), type; diff --git a/core/Integer.hh b/core/Integer.hh index 54cf6478d..6b4c33420 100644 --- a/core/Integer.hh +++ b/core/Integer.hh @@ -166,7 +166,7 @@ public: /** @brief Decode according to XML Encoding Rules. **/ int XER_decode(const XERdescriptor_t& p_td, XmlReaderWrap& reader, - unsigned int flavor, embed_values_dec_struct_t*); + unsigned int flavor, unsigned int flavor2, embed_values_dec_struct_t*); /** Encodes accordingly to the JSON encoding rules. * Returns the length of the encoded data. */ diff --git a/core/JSON.hh b/core/JSON.hh index 662884b44..53f371bc5 100644 --- a/core/JSON.hh +++ b/core/JSON.hh @@ -42,7 +42,13 @@ struct TTCN_JSONdescriptor_t * The decoder sets the field to unbound if the meta info field is present and * the field's value in the JSON code is either null or a valid value for that * field. - * Example: { "field1" : null, "metainfo field1" : "unbound" } */ + * Example: { "field1" : null, "metainfo field1" : "unbound" } + * + * Also usable on record of/set of/array types to indicate that an element is + * unbound. Unbound elements are encoded as a JSON object containing one + * metainfo member. The decoder sets the element to unbound if the object + * with the meta information is found. + * Example: [ value1, value2, { "metainfo []" : "unbound" }, value3 ] */ boolean metainfo_unbound; }; diff --git a/core/Objid.cc b/core/Objid.cc index 77a06a2e7..b7b105722 100644 --- a/core/Objid.cc +++ b/core/Objid.cc @@ -325,7 +325,7 @@ void OBJID::decode(const TTCN_Typedescriptor_t& p_td, TTCN_Buffer& p_buf, if (type==XML_READER_TYPE_ELEMENT) break; } - XER_decode(*p_td.xer, reader, XER_coding, 0); + XER_decode(*p_td.xer, reader, XER_coding, XER_NONE, 0); size_t bytes = reader.ByteConsumed(); p_buf.set_pos(bytes); break;} @@ -540,7 +540,7 @@ void OBJID::from_string(char* p_str) } int OBJID::XER_decode(const XERdescriptor_t& p_td, XmlReaderWrap& reader, - unsigned int flavor, embed_values_dec_struct_t*) + unsigned int flavor, unsigned int /*flavor2*/, embed_values_dec_struct_t*) { int exer = is_exer(flavor); int success = reader.Ok(), depth = -1; diff --git a/core/Objid.hh b/core/Objid.hh index 0a51d1eb7..38c0a0011 100644 --- a/core/Objid.hh +++ b/core/Objid.hh @@ -92,7 +92,7 @@ public: int XER_encode(const XERdescriptor_t& p_td, TTCN_Buffer& p_buf, unsigned int flavor, int indent, embed_values_enc_struct_t*) const; int XER_decode(const XERdescriptor_t& p_td, XmlReaderWrap& reader, - unsigned int flavor, embed_values_dec_struct_t*); + unsigned int flavor, unsigned int flavor2, embed_values_dec_struct_t*); /** Encodes accordingly to the JSON encoding rules. * Returns the length of the encoded data. */ diff --git a/core/Octetstring.cc b/core/Octetstring.cc index 18daa773a..3756c4d78 100644 --- a/core/Octetstring.cc +++ b/core/Octetstring.cc @@ -690,7 +690,7 @@ void OCTETSTRING::decode(const TTCN_Typedescriptor_t& p_td, if (type==XML_READER_TYPE_ELEMENT) break; } - XER_decode(*p_td.xer, reader, XER_coding, 0); + XER_decode(*p_td.xer, reader, XER_coding, XER_NONE, 0); size_t bytes = reader.ByteConsumed(); p_buf.set_pos(bytes); break;} @@ -939,7 +939,7 @@ int OCTETSTRING::XER_encode(const XERdescriptor_t& p_td, } int OCTETSTRING::XER_decode(const XERdescriptor_t& p_td, XmlReaderWrap& reader, - unsigned int flavor, embed_values_dec_struct_t*) + unsigned int flavor, unsigned int /*flavor2*/, embed_values_dec_struct_t*) { int exer = is_exer(flavor); int success = reader.Ok(), depth = -1, type; diff --git a/core/Octetstring.hh b/core/Octetstring.hh index ca10f66f2..a4f03f1c2 100644 --- a/core/Octetstring.hh +++ b/core/Octetstring.hh @@ -157,7 +157,7 @@ public: int XER_encode(const XERdescriptor_t& p_td, TTCN_Buffer& p_buf, unsigned int flavor, int indent, embed_values_enc_struct_t*) const; int XER_decode(const XERdescriptor_t& p_td, XmlReaderWrap& reader, - unsigned int flavor, embed_values_dec_struct_t*); + unsigned int flavor, unsigned int flavor2, embed_values_dec_struct_t*); /** Encodes accordingly to the JSON encoding rules. * Returns the length of the encoded data. */ diff --git a/core/Optional.hh b/core/Optional.hh index c640b0099..9d84211da 100644 --- a/core/Optional.hh +++ b/core/Optional.hh @@ -281,7 +281,7 @@ public: * @param parent_tag_closed true, if the record's XML tag is closed (is an empty element)*/ bool XER_check_any_elem(XmlReaderWrap& reader, const char* next_field_name, bool parent_tag_closed); int XER_decode(const XERdescriptor_t& p_td, XmlReaderWrap& reader, - unsigned int flavor, embed_values_dec_struct_t* emb_val); + unsigned int flavor, unsigned int flavor2, embed_values_dec_struct_t* emb_val); char ** collect_ns(const XERdescriptor_t& p_td, size_t& num, bool& def_ns) const; @@ -1030,7 +1030,7 @@ OPTIONAL<T_type>::XER_check_any_elem(XmlReaderWrap& reader, const char* next_fie template<typename T_type> int OPTIONAL<T_type>::XER_decode(const XERdescriptor_t& p_td, XmlReaderWrap& reader, - unsigned int flavor, embed_values_dec_struct_t* emb_val) + unsigned int flavor, unsigned int flavor2, embed_values_dec_struct_t* emb_val) { int exer = is_exer(flavor); for (int success = reader.Ok(); success==1; success=reader.Read()) { @@ -1058,11 +1058,14 @@ OPTIONAL<T_type>::XER_decode(const XERdescriptor_t& p_td, XmlReaderWrap& reader, } set_to_present(); - optional_value->XER_decode(p_td, reader, flavor, emb_val); + optional_value->XER_decode(p_td, reader, flavor, flavor2, emb_val); goto finished; } else break; } + else if(XML_READER_TYPE_ATTRIBUTE == type && (flavor & USE_NIL)){ + goto found_it; + } else { // not attribute if (XML_READER_TYPE_ELEMENT == type) { // we are at an element name = (const char*)reader.LocalName(); @@ -1075,7 +1078,7 @@ OPTIONAL<T_type>::XER_decode(const XERdescriptor_t& p_td, XmlReaderWrap& reader, found_it: set_to_present(); //success = reader.Read(); // move to next thing TODO should it loop till an element ? - optional_value->XER_decode(p_td, reader, flavor, emb_val); + optional_value->XER_decode(p_td, reader, flavor, flavor2, emb_val); if (!optional_value->is_bound()) { set_to_omit(); } diff --git a/core/Port.hh b/core/Port.hh index 35d2e5123..0c13b3fc3 100644 --- a/core/Port.hh +++ b/core/Port.hh @@ -13,6 +13,7 @@ #include "Types.h" #include "Event_Handler.hh" #include <stddef.h> // only for NULL +#include <sys/select.h> class COMPONENT; class COMPONENT_template; diff --git a/core/Universal_charstring.cc b/core/Universal_charstring.cc index 4eda2c1e9..acbcc5434 100644 --- a/core/Universal_charstring.cc +++ b/core/Universal_charstring.cc @@ -1157,7 +1157,7 @@ void UNIVERSAL_CHARSTRING::decode(const TTCN_Typedescriptor_t& p_td, if (type==XML_READER_TYPE_ELEMENT) break; } - XER_decode(*p_td.xer, reader, XER_coding, 0); + XER_decode(*p_td.xer, reader, XER_coding, XER_NONE, 0); size_t bytes = reader.ByteConsumed(); p_buf.set_pos(bytes); break; } @@ -2030,7 +2030,7 @@ in_word_set (const char *str, unsigned int len) universal_char const uspace = {0,0,0,32}; int UNIVERSAL_CHARSTRING::XER_decode(const XERdescriptor_t& p_td, - XmlReaderWrap& reader, unsigned int flavor, embed_values_dec_struct_t*) + XmlReaderWrap& reader, unsigned int flavor, unsigned int /*flavor2*/, embed_values_dec_struct_t*) { int exer = is_exer(flavor); int success = reader.Ok(), depth = -1; diff --git a/core/Universal_charstring.hh b/core/Universal_charstring.hh index bda37a04e..6e7448847 100644 --- a/core/Universal_charstring.hh +++ b/core/Universal_charstring.hh @@ -330,7 +330,7 @@ public: int TEXT_decode(const TTCN_Typedescriptor_t&, TTCN_Buffer&, Limit_Token_List&, boolean no_err=FALSE, boolean first_call=TRUE); int XER_encode(const XERdescriptor_t&, TTCN_Buffer&, unsigned int, int, embed_values_enc_struct_t*) const; - int XER_decode(const XERdescriptor_t&, XmlReaderWrap& reader, unsigned int, embed_values_dec_struct_t*); + int XER_decode(const XERdescriptor_t&, XmlReaderWrap& reader, unsigned int, unsigned int, embed_values_dec_struct_t*); /** Decodes UTF-8 into the internal representation (UCS4-BE) * * @param n_octets number of UTF-8 bytes (not characters) diff --git a/core/Verdicttype.cc b/core/Verdicttype.cc index d74aff451..d5607e0f2 100644 --- a/core/Verdicttype.cc +++ b/core/Verdicttype.cc @@ -239,7 +239,7 @@ void VERDICTTYPE::decode(const TTCN_Typedescriptor_t& p_td, TTCN_Buffer& p_buf, if (type==XML_READER_TYPE_ELEMENT) break; } - XER_decode(*p_td.xer, reader, XER_coding, 0); + XER_decode(*p_td.xer, reader, XER_coding, XER_NONE, 0); size_t bytes = reader.ByteConsumed(); p_buf.set_pos(bytes); break;} @@ -297,7 +297,7 @@ verdicttype VERDICTTYPE::str_to_verdict(const char *v, boolean silent) } int VERDICTTYPE::XER_decode(const XERdescriptor_t& p_td, XmlReaderWrap& p_reader, - unsigned int p_flavor, embed_values_dec_struct_t*) + unsigned int p_flavor, unsigned int /*flavor2*/, embed_values_dec_struct_t*) { int rd_ok = 1, type; const int e_xer = is_exer(p_flavor); diff --git a/core/Verdicttype.hh b/core/Verdicttype.hh index 0faba13bd..eedef1548 100644 --- a/core/Verdicttype.hh +++ b/core/Verdicttype.hh @@ -85,7 +85,7 @@ public: int XER_encode(const XERdescriptor_t& p_td, TTCN_Buffer& p_buf, unsigned int flavor, int indent, embed_values_enc_struct_t*) const; int XER_decode(const XERdescriptor_t& p_td, XmlReaderWrap& reader, - unsigned int flavor, embed_values_dec_struct_t*); + unsigned int flavor, unsigned int flavor2, embed_values_dec_struct_t*); /** Encodes accordingly to the JSON encoding rules. * Returns the length of the encoded data. */ diff --git a/core/XER.hh b/core/XER.hh index 9f56aac54..f77176980 100644 --- a/core/XER.hh +++ b/core/XER.hh @@ -96,6 +96,10 @@ enum XER_flavor { BLOCKED = 1U << 31 // 0x80000000 either ABSTRACT or BLOCK }; +enum XER_flavor2 { + USE_NIL_PARENT_TAG = 1U << 0 // Content field has attribute that was read by parent +}; + /** WHITESPACE actions. * Note that WHITESPACE_COLLAPSE includes the effect of WHITESPACE_REPLACE * and the code relies on WHITESPACE_COLLAPSE having the higher value. */ diff --git a/core/XmlReader.hh b/core/XmlReader.hh index c6c480fd4..eaefece20 100644 --- a/core/XmlReader.hh +++ b/core/XmlReader.hh @@ -76,7 +76,7 @@ public: * @return 1 on success, 0 if no more nodes to read, -1 on error */ int Read(); int ReadDbg(const char *where); - + #if 0 /** Return the child nodes of the current node. * diff --git a/core2/Basetype2.cc b/core2/Basetype2.cc index e9d18e49c..b94c5bcb9 100644 --- a/core2/Basetype2.cc +++ b/core2/Basetype2.cc @@ -1450,9 +1450,18 @@ int Record_Of_Type::JSON_encode(const TTCN_Typedescriptor_t& p_td, JSON_Tokenize int enc_len = p_tok.put_next_token(JSON_TOKEN_ARRAY_START, NULL); for (int i = 0; i < get_nof_elements(); ++i) { - int ret_val = get_at(i)->JSON_encode(*p_td.oftype_descr, p_tok); - if (0 > ret_val) break; - enc_len += ret_val; + if (NULL != p_td.json && p_td.json->metainfo_unbound && !get_at(i)->is_bound()) { + // unbound elements are encoded as { "metainfo []" : "unbound" } + enc_len += p_tok.put_next_token(JSON_TOKEN_OBJECT_START, NULL); + enc_len += p_tok.put_next_token(JSON_TOKEN_NAME, "metainfo []"); + enc_len += p_tok.put_next_token(JSON_TOKEN_STRING, "\"unbound\""); + enc_len += p_tok.put_next_token(JSON_TOKEN_OBJECT_END, NULL); + } + else { + int ret_val = get_at(i)->JSON_encode(*p_td.oftype_descr, p_tok); + if (0 > ret_val) break; + enc_len += ret_val; + } } enc_len += p_tok.put_next_token(JSON_TOKEN_ARRAY_END, NULL); @@ -1507,7 +1516,15 @@ int Record_Of_Type::JSON_encode_negtest(const Erroneous_descriptor_t* p_err_desc enc_len += err_vals->value->errval->JSON_encode(*(err_vals->value->type_descr), p_tok); } } - } else { + } + else if (NULL != p_td.json && p_td.json->metainfo_unbound && !get_at(i)->is_bound()) { + // unbound elements are encoded as { "metainfo []" : "unbound" } + enc_len += p_tok.put_next_token(JSON_TOKEN_OBJECT_START, NULL); + enc_len += p_tok.put_next_token(JSON_TOKEN_NAME, "metainfo []"); + enc_len += p_tok.put_next_token(JSON_TOKEN_STRING, "\"unbound\""); + enc_len += p_tok.put_next_token(JSON_TOKEN_OBJECT_END, NULL); + } + else { int ret_val; if (NULL != emb_descr) { ret_val = get_at(i)->JSON_encode_negtest(emb_descr, *p_td.oftype_descr, p_tok); @@ -1554,11 +1571,35 @@ int Record_Of_Type::JSON_decode(const TTCN_Typedescriptor_t& p_td, JSON_Tokenize } set_size(0); - while (true) { + for (int nof_elements = 0; true; ++nof_elements) { // Read value tokens until we reach some other token size_t buf_pos = p_tok.get_buf_pos(); + int ret_val; + if (NULL != p_td.json && p_td.json->metainfo_unbound) { + // check for metainfo object + ret_val = p_tok.get_next_token(&token, NULL, NULL); + if (JSON_TOKEN_OBJECT_START == token) { + char* value = NULL; + size_t value_len = 0; + ret_val += p_tok.get_next_token(&token, &value, &value_len); + if (JSON_TOKEN_NAME == token && 11 == value_len && + 0 == strncmp(value, "metainfo []", 11)) { + ret_val += p_tok.get_next_token(&token, &value, &value_len); + if (JSON_TOKEN_STRING == token && 9 == value_len && + 0 == strncmp(value, "\"unbound\"", 9)) { + ret_val = p_tok.get_next_token(&token, NULL, NULL); + if (JSON_TOKEN_OBJECT_END == token) { + dec_len += ret_val; + continue; + } + } + } + } + // metainfo object not found, jump back and let the element type decode it + p_tok.set_buf_pos(buf_pos); + } Base_Type* val = create_elem(); - int ret_val = val->JSON_decode(*p_td.oftype_descr, p_tok, p_silent); + ret_val = val->JSON_decode(*p_td.oftype_descr, p_tok, p_silent); if (JSON_ERROR_INVALID_TOKEN == ret_val) { // undo the last action on the buffer p_tok.set_buf_pos(buf_pos); @@ -1574,12 +1615,12 @@ int Record_Of_Type::JSON_decode(const TTCN_Typedescriptor_t& p_td, JSON_Tokenize } if (NULL == refd_ind_ptr) { val_ptr->value_elements = (Base_Type**)reallocate_pointers( - (void**)val_ptr->value_elements, val_ptr->n_elements, val_ptr->n_elements + 1); - val_ptr->value_elements[val_ptr->n_elements] = val; - val_ptr->n_elements++; + (void**)val_ptr->value_elements, val_ptr->n_elements, nof_elements + 1); + val_ptr->value_elements[nof_elements] = val; + val_ptr->n_elements = nof_elements + 1; } else { - get_at(get_nof_elements())->set_value(val); + get_at(nof_elements)->set_value(val); delete val; } dec_len += ret_val; @@ -1701,7 +1742,7 @@ void Record_Of_Type::decode(const TTCN_Typedescriptor_t& p_td, for (int success=reader.Read(); success==1; success=reader.Read()) { if (reader.NodeType() == XML_READER_TYPE_ELEMENT) break; } - XER_decode(*(p_td.xer), reader, XER_coding | XER_TOPLEVEL, 0); + XER_decode(*(p_td.xer), reader, XER_coding | XER_TOPLEVEL, XER_NONE, 0); size_t bytes = reader.ByteConsumed(); p_buf.set_pos(bytes); break;} @@ -2199,7 +2240,7 @@ int Record_Of_Type::XER_encode_negtest(const Erroneous_descriptor_t* p_err_descr } int Record_Of_Type::XER_decode(const XERdescriptor_t& p_td, - XmlReaderWrap& reader, unsigned int flavor, embed_values_dec_struct_t* emb_val) + XmlReaderWrap& reader, unsigned int flavor, unsigned int flavor2, embed_values_dec_struct_t* emb_val) { int exer = is_exer(flavor); int xerbits = p_td.xer_bits; @@ -2278,7 +2319,7 @@ int Record_Of_Type::XER_decode(const XERdescriptor_t& p_td, // The call to the non-const operator[], I mean get_at(), creates // a new element (because it is indexing one past the last element). // Then we call its XER_decode with the temporary XML reader. - get_at(get_nof_elements())->XER_decode(sub_xer, reader2, flavor, 0); + get_at(get_nof_elements())->XER_decode(sub_xer, reader2, flavor, flavor2, 0); if (flavor & EXIT_ON_ERROR && !is_elem_bound(get_nof_elements() - 1)) { if (1 == get_nof_elements()) { // Failed to decode even the first element @@ -2344,10 +2385,10 @@ int Record_Of_Type::XER_decode(const XERdescriptor_t& p_td, } ec_1.set_msg("%d: ", get_nof_elements()); /* The call to the non-const get_at() creates the element */ - get_at(get_nof_elements())->XER_decode(*p_td.oftype_descr, reader, flavor, emb_val); - if (0 != emb_val && !own_tag && get_nof_elements() > 1) { - ++emb_val->embval_index; - } + get_at(get_nof_elements())->XER_decode(*p_td.oftype_descr, reader, flavor, flavor2, emb_val); + } + if (0 != emb_val && !own_tag && get_nof_elements() > 1) { + ++emb_val->embval_index; } } else if (XML_READER_TYPE_END_ELEMENT == type) { @@ -2534,7 +2575,6 @@ boolean operator!=(null_type null_value, boolean Record_Type::is_bound() const { - if (bound_flag) return TRUE; int field_cnt = get_count(); for (int field_idx=0; field_idx<field_cnt; field_idx++) { const Base_Type* temp = get_at(field_idx); @@ -2548,9 +2588,6 @@ boolean Record_Type::is_bound() const boolean Record_Type::is_value() const { - if (!is_bound()) { - return FALSE; - } int field_cnt = get_count(); for (int field_idx=0; field_idx<field_cnt; field_idx++) { const Base_Type* temp = get_at(field_idx); @@ -2570,7 +2607,6 @@ void Record_Type::clean_up() for (int field_idx=0; field_idx<field_cnt; field_idx++) { get_at(field_idx)->clean_up(); } - bound_flag = FALSE; } void Record_Type::log() const @@ -2592,7 +2628,6 @@ void Record_Type::log() const } void Record_Type::set_param(Module_Param& param) { - bound_flag = TRUE; if (dynamic_cast<Module_Param_Name*>(param.get_id()) != NULL && param.get_id()->next_name()) { // Haven't reached the end of the module parameter name @@ -2703,10 +2738,6 @@ void Record_Type::set_implicit_omit() int Record_Type::size_of() const { - if (!is_bound()) { - TTCN_error("Calculating the size of an unbound record/set value of type %s", - get_descriptor()->name); - } int opt_count = optional_count(); if (opt_count==0) return get_count(); const int* optional_indexes = get_optional_indexes(); @@ -2730,7 +2761,6 @@ void Record_Type::encode_text(Text_Buf& text_buf) const void Record_Type::decode_text(Text_Buf& text_buf) { - bound_flag = TRUE; int field_cnt = get_count(); for (int field_idx=0; field_idx<field_cnt; field_idx++) get_at(field_idx)->decode_text(text_buf); @@ -2739,9 +2769,6 @@ void Record_Type::decode_text(Text_Buf& text_buf) boolean Record_Type::is_equal(const Base_Type* other_value) const { const Record_Type* other_record = static_cast<const Record_Type*>(other_value); - if (!is_bound() && !other_record->is_bound()) { - return TRUE; - } int field_cnt = get_count(); for (int field_idx=0; field_idx<field_cnt; field_idx++) { const Base_Type* elem = get_at(field_idx); @@ -2773,7 +2800,6 @@ void Record_Type::set_value(const Base_Type* other_value) } } err_descr = other_record->err_descr; - bound_flag = TRUE; } void Record_Type::encode(const TTCN_Typedescriptor_t& p_td, @@ -2896,7 +2922,7 @@ void Record_Type::decode(const TTCN_Typedescriptor_t& p_td, for (int success=reader.Read(); success==1; success=reader.Read()) { if (reader.NodeType() == XML_READER_TYPE_ELEMENT) break; } - XER_decode(*(p_td.xer), reader, XER_coding | XER_TOPLEVEL, 0); + XER_decode(*(p_td.xer), reader, XER_coding | XER_TOPLEVEL, XER_NONE, 0); size_t bytes = reader.ByteConsumed(); p_buf.set_pos(bytes); break;} @@ -3054,7 +3080,6 @@ ASN_BER_TLV_t* Record_Type::BER_encode_TLV_negtest(const Erroneous_descriptor_t* boolean Record_Type::BER_decode_TLV(const TTCN_Typedescriptor_t& p_td, const ASN_BER_TLV_t& p_tlv, unsigned L_form) { - bound_flag = TRUE; BER_chk_descr(p_td); ASN_BER_TLV_t stripped_tlv; BER_decode_strip_tags(*p_td.ber, p_tlv, L_form, stripped_tlv); @@ -3161,7 +3186,6 @@ boolean Record_Type::BER_decode_TLV(const TTCN_Typedescriptor_t& p_td, void Record_Type::BER_decode_opentypes(TTCN_Type_list& p_typelist, unsigned L_form) { - bound_flag = TRUE; p_typelist.push(this); TTCN_EncDec_ErrorContext ec_0("Component '"); TTCN_EncDec_ErrorContext ec_1; @@ -3358,7 +3382,6 @@ int Record_Type::RAW_encode_negtest(const Erroneous_descriptor_t *p_err_descr, int Record_Type::RAW_decode(const TTCN_Typedescriptor_t& p_td, TTCN_Buffer& buff, int limit, raw_order_t top_bit_ord, boolean no_err, int, boolean) { - bound_flag = TRUE; int field_cnt = get_count(); int opt_cnt = optional_count(); int mand_num = field_cnt - opt_cnt; // expected mandatory fields @@ -3632,7 +3655,6 @@ int Record_Type::TEXT_encode_negtest(const Erroneous_descriptor_t* p_err_descr, int Record_Type::TEXT_decode(const TTCN_Typedescriptor_t& p_td, TTCN_Buffer& buff, Limit_Token_List& limit, boolean no_err, boolean /*first_call*/) { - bound_flag = TRUE; if (is_set()) { int decoded_length=0; int decoded_field_length=0; @@ -4166,7 +4188,7 @@ int Record_Type::XER_encode(const XERdescriptor_t& p_td, TTCN_Buffer& p_buf, - (!indenting || delay_close || (exer && (p_td.xer_bits & HAS_1UNTAGGED))), (cbyte*)p_td.names[exer]); } - else if (flavor & USE_TYPE_ATTR) { + else if (flavor & (USE_NIL|USE_TYPE_ATTR)) { // reopen the parent's start tag by overwriting the '>' size_t buf_len = p_buf.get_len(); const unsigned char * const buf_data = p_buf.get_data(); @@ -5082,9 +5104,8 @@ int Record_Type::XER_encode_negtest(const Erroneous_descriptor_t* p_err_descr, } int Record_Type::XER_decode(const XERdescriptor_t& p_td, XmlReaderWrap& reader, - unsigned int flavor, embed_values_dec_struct_t*) + unsigned int flavor, unsigned int flavor2, embed_values_dec_struct_t*) { - bound_flag = TRUE; int exer = is_exer(flavor); int success, type; int depth=-1; // depth of the start tag @@ -5096,10 +5117,11 @@ int Record_Type::XER_decode(const XERdescriptor_t& p_td, XmlReaderWrap& reader, boolean tag_closed = (flavor & PARENT_CLOSED) != 0; // If the parent has USE-TYPE, our ATTRIBUTE members can be found // in the parent's tag (the reader is sitting on it). - const boolean parent_tag = exer && (flavor & (/*USE_NIL|*/ USE_TYPE_ATTR)); + const boolean parent_tag = exer && ((flavor & USE_TYPE_ATTR) || (flavor2 & USE_NIL_PARENT_TAG)); // Filter out flags passed by our parent. These are not for the fields. flavor &= XER_MASK; // also removes XER_TOPLEVEL + flavor2 = XER_NONE; // Remove only bit: USE_NIL_PARENT_TAG (for now) const int field_cnt = get_count(); const int num_attributes = get_xer_num_attr(); @@ -5112,7 +5134,7 @@ int Record_Type::XER_decode(const XERdescriptor_t& p_td, XmlReaderWrap& reader, // fields); normal processing start at this field. const int start_at = uo_index + ((p_td.xer_bits & USE_ORDER) != 0); const int first_nonattr = start_at + num_attributes; - + // The index of the ANY-ATTRIBUTES member, if any int aa_index = -1; for (int k = 0; k < first_nonattr; ++k) { @@ -5180,12 +5202,15 @@ int Record_Type::XER_decode(const XERdescriptor_t& p_td, XmlReaderWrap& reader, TTCN_EncDec_ErrorContext ec_0("Component '"); TTCN_EncDec_ErrorContext ec_1; boolean usenil_attribute = FALSE; // true if found and said yes + // If nillable and the nillable field is a record type, that has attributes + // then it will become true, and skips the processing of the fields after + boolean already_processed = FALSE; if (!exer) { if (!reader.IsEmptyElement()) reader.Read(); // First, the (would-be) attributes (unaffected by USE-ORDER) for (i = 0; i < first_nonattr; i++) { ec_1.set_msg("%s': ", fld_name(i)); - get_at(i)->XER_decode(*xer_descr(i), reader, flavor, 0); + get_at(i)->XER_decode(*xer_descr(i), reader, flavor, flavor2, 0); } // next field } else if (own_tag || parent_tag) { // EXER and not UNTAGGED: do attributes @@ -5213,7 +5238,12 @@ int Record_Type::XER_decode(const XERdescriptor_t& p_td, XmlReaderWrap& reader, } /* * * * * * * * * Attributes * * * * * * * * * * * * * */ - for (success = reader.MoveToFirstAttribute(); + if(parent_tag && reader.NodeType() == XML_READER_TYPE_ATTRIBUTE) { + success = reader.Ok(); + } else { + success = reader.MoveToFirstAttribute(); + } + for (; success == 1 && reader.NodeType() == XML_READER_TYPE_ATTRIBUTE; success = reader.AdvanceAttribute()) { @@ -5227,7 +5257,7 @@ int Record_Type::XER_decode(const XERdescriptor_t& p_td, XmlReaderWrap& reader, if (field_index != -1) { // There is a field. Let it decode the attribute. ec_1.set_msg("%s': ", fld_name(field_index)); - get_at(field_index)->XER_decode(*xer_descr(field_index), reader, flavor, 0); + get_at(field_index)->XER_decode(*xer_descr(field_index), reader, flavor, flavor2, 0); continue; } @@ -5249,8 +5279,13 @@ int Record_Type::XER_decode(const XERdescriptor_t& p_td, XmlReaderWrap& reader, continue; } // it is the "nil" attribute + // else, let the nillable field decode the next attributes, it is possible + // that it belongs to him + get_at(field_cnt-1)->XER_decode(*xer_descr(field_cnt-1), reader, flavor | USE_NIL, flavor2 | USE_NIL_PARENT_TAG, 0); + already_processed = TRUE; + continue; } // type has USE-NIL - + if (parent_tag) { const char *prefix = (const char*)reader.Prefix(); // prefix may be NULL, control_ns->px is never NULL or empty @@ -5311,7 +5346,7 @@ int Record_Type::XER_decode(const XERdescriptor_t& p_td, XmlReaderWrap& reader, continue; } } - + // Nobody wanted the attribute. That is an error. ec_0.set_msg(" "); ec_1.set_msg(" "); TTCN_EncDec_ErrorContext::error(TTCN_EncDec::ET_INVAL_MSG, @@ -5333,7 +5368,7 @@ int Record_Type::XER_decode(const XERdescriptor_t& p_td, XmlReaderWrap& reader, // AdvanceAttribute did MoveToElement. Move into the content (if any). if (!reader.IsEmptyElement()) reader.Read(); } // end if (own_tag) - + /* * * * * * * * Non-attributes (elements) * * * * * * * * * * * */ embed_values_dec_struct_t* emb_val = 0; bool emb_val_optional = false; @@ -5450,7 +5485,7 @@ int Record_Type::XER_decode(const XERdescriptor_t& p_td, XmlReaderWrap& reader, static_cast<Enum_Type*>(use_order->get_at(i - begin)) ->from_int(in_dex); Base_Type *b = jumbled->get_at(k); - b->XER_decode(*jumbled->xer_descr(k), reader, flavor, emb_val); + b->XER_decode(*jumbled->xer_descr(k), reader, flavor, flavor2, emb_val); field_name_found = true; break; } @@ -5476,7 +5511,7 @@ int Record_Type::XER_decode(const XERdescriptor_t& p_td, XmlReaderWrap& reader, static_cast<Enum_Type*>(use_order->get_at(i - begin)) ->from_int(in_dex); Base_Type *b = jumbled->get_at(k); - b->XER_decode(*jumbled->xer_descr(k), reader, flavor, emb_val); + b->XER_decode(*jumbled->xer_descr(k), reader, flavor, flavor2, emb_val); last_any_elem = k; field_name_found = true; break; @@ -5561,12 +5596,12 @@ int Record_Type::XER_decode(const XERdescriptor_t& p_td, XmlReaderWrap& reader, optional_any_elem_check = opt_field->XER_check_any_elem(reader, next_field_name, tag_closed); } } - if (optional_any_elem_check) { + if (optional_any_elem_check && !already_processed) { int new_flavor = flavor ; if (i == field_cnt-1) new_flavor |= (p_td.xer_bits & USE_NIL); if (tag_closed) new_flavor |= PARENT_CLOSED; - get_at(i)->XER_decode(*xer_descr(i), reader, new_flavor, emb_val); + get_at(i)->XER_decode(*xer_descr(i), reader, new_flavor, flavor2, emb_val); } } if (!get_at(i)->is_present()) { @@ -5808,14 +5843,15 @@ int Record_Type::JSON_decode(const TTCN_Typedescriptor_t& p_td, JSON_Tokenizer& } else if (JSON_TOKEN_OBJECT_START != token) { return JSON_ERROR_INVALID_TOKEN; - } - bound_flag = TRUE; + } const int field_count = get_count(); // initialize meta info states int* metainfo = new int[field_count]; + boolean* field_found = new boolean[field_count]; for (int i = 0; i < field_count; ++i) { + field_found[i] = FALSE; metainfo[i] = (NULL != fld_descr(i)->json && fld_descr(i)->json->metainfo_unbound) ? JSON_METAINFO_NONE : JSON_METAINFO_NOT_APPLICABLE; } @@ -5855,6 +5891,7 @@ int Record_Type::JSON_decode(const TTCN_Typedescriptor_t& p_td, JSON_Tokenizer& } if (strlen(expected_name) == name_len && 0 == strncmp(expected_name, name, name_len)) { + field_found[field_idx] = TRUE; break; } } @@ -5942,7 +5979,7 @@ int Record_Type::JSON_decode(const TTCN_Typedescriptor_t& p_td, JSON_Tokenizer& // no meta info was found for this field, report the delayed error JSON_ERROR(TTCN_EncDec::ET_INVAL_MSG, JSON_DEC_FIELD_TOKEN_ERROR, fld_name(field_idx)); } - else if (!field->is_bound()) { + else if (!field_found[field_idx]) { if (NULL != fld_descr(field_idx)->json && NULL != fld_descr(field_idx)->json->default_value) { get_at(field_idx)->JSON_decode(*fld_descr(field_idx), DUMMY_BUFFER, p_silent); } @@ -6145,7 +6182,7 @@ void Empty_Record_Type::decode(const TTCN_Typedescriptor_t& p_td, for (int success=reader.Read(); success==1; success=reader.Read()) { if (reader.NodeType() == XML_READER_TYPE_ELEMENT) break; } - XER_decode(*(p_td.xer), reader, XER_coding | XER_TOPLEVEL, 0); + XER_decode(*(p_td.xer), reader, XER_coding | XER_TOPLEVEL, XER_NONE, 0); size_t bytes = reader.ByteConsumed(); p_buf.set_pos(bytes); break;} @@ -6268,7 +6305,7 @@ int Empty_Record_Type::XER_encode(const XERdescriptor_t& p_td, } int Empty_Record_Type::XER_decode(const XERdescriptor_t& p_td, - XmlReaderWrap& reader, unsigned int flavor, embed_values_dec_struct_t*) + XmlReaderWrap& reader, unsigned int flavor, unsigned int /*flavor2*/, embed_values_dec_struct_t*) { int exer = is_exer(flavor); bound_flag = true; diff --git a/etc/xsd/TPD.xsd b/etc/xsd/TPD.xsd index 7d952d119..81d6d5550 100644 --- a/etc/xsd/TPD.xsd +++ b/etc/xsd/TPD.xsd @@ -105,6 +105,7 @@ XML Schema for TITAN_Project_File_Information <xs:element name="suppressWarnings" minOccurs="0" maxOccurs="1" type="xs:boolean" /> <xs:element name="outParamBoundness" minOccurs="0" maxOccurs="1" type="xs:boolean" /> <xs:element name="omitInValueList" minOccurs="0" maxOccurs="1" type="xs:boolean" /> + <xs:element name="warningsForBadVariants" minOccurs="0" maxOccurs="1" type="xs:boolean" /> <xs:element name="quietly" minOccurs="0" maxOccurs="1" type="xs:boolean" /> <xs:element name="namingRules" minOccurs="0" maxOccurs="1" type="xs:normalizedString" /> <xs:element name="disableSubtypeChecking" minOccurs="0" maxOccurs="1" type="xs:boolean" /> @@ -408,6 +409,7 @@ XML Schema for TITAN_Project_File_Information <xs:complexType> <xs:attribute name="name" type="xs:normalizedString" use="required" /> <xs:attribute name="projectLocationURI" type="xs:normalizedString" use="required" /> + <xs:attribute name="tpdName" type="xs:normalizedString" use="optional" /> </xs:complexType> </xs:element> </xs:sequence> diff --git a/function_test/Semantic_Analyser/TTCN3_SA_1_TD.script b/function_test/Semantic_Analyser/TTCN3_SA_1_TD.script index 2d389814d..2bf1fac40 100644 --- a/function_test/Semantic_Analyser/TTCN3_SA_1_TD.script +++ b/function_test/Semantic_Analyser/TTCN3_SA_1_TD.script @@ -7077,7 +7077,7 @@ module ModuleA { } <END_MODULE> <RESULT IF_PASS COUNT 1> -(?im)\berror\b.+?invalid.+?field.+?reference.+?Nonexi08 +(?im)\berror\b.+?Referencing.+?fields.+?component.+?not.+?allowed <END_RESULT> <RESULT IF_PASS COUNT 1> (?is)\berror: diff --git a/function_test/Semantic_Analyser/xer/bogus_SE.ttcn b/function_test/Semantic_Analyser/xer/bogus_SE.ttcn index 191d38250..c531ba810 100644 --- a/function_test/Semantic_Analyser/xer/bogus_SE.ttcn +++ b/function_test/Semantic_Analyser/xer/bogus_SE.ttcn @@ -8,7 +8,7 @@ module bogus { //^In TTCN-3 module `bogus':// type integer i //^In type definition// - with { variant "variant" } //^warning: in variant attribute.+?syntax error, unexpected XIdentifier, expecting \$end// + with { variant "variant" } //^error: in variant attribute.+?syntax error, unexpected XIdentifier, expecting \$end// } with { diff --git a/regression_test/XML/EXER-whitepaper/UseNil.ttcnpp b/regression_test/XML/EXER-whitepaper/UseNil.ttcnpp index e857b51ce..3cd779dfe 100644 --- a/regression_test/XML/EXER-whitepaper/UseNil.ttcnpp +++ b/regression_test/XML/EXER-whitepaper/UseNil.ttcnpp @@ -536,6 +536,229 @@ testcase decode_multi_nil() runs on Nil { /* ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** */ +// Encoding nillable field, which is a record type without attributes + +type record NilTypeRec { + record { + TypeWithoutAttr nil optional + } field +} with { + variant(field) "useNil"; +} + +type record TypeWithoutAttr { + charstring inner_field +} + +const NilTypeRec c_nil_rec_absent := { + field := { + nil := omit + } +}; + +const universal charstring str_nil_rec_absent := +"<NilTypeRec xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'>\n" & +"\t<field xsi:nil='true'/>\n" & +"</NilTypeRec>\n\n"; + +const NilTypeRec c_nil_rec_present_no_attr := { + field := { + nil := { + inner_field := "field" + } + } +}; + +const universal charstring str_nil_rec_present_no_attr := +"<NilTypeRec>\n" & +"\t<field>\n" & +"\t\t<inner_field>field</inner_field>\n" & +"\t</field>\n" & +"</NilTypeRec>\n\n"; + +DECLARE_EXER_ENCODERS(NilTypeRec, typerec); + +testcase encode_NilTypeRec() runs on Nil { + CHECK_METHOD(exer_enc_typerec, c_nil_rec_absent, str_nil_rec_absent); + CHECK_METHOD(exer_enc_typerec, c_nil_rec_present_no_attr, str_nil_rec_present_no_attr); +} + +testcase decode_NilTypeRec() runs on Nil { + CHECK_DECODE(exer_dec_typerec, str_nil_rec_absent, NilTypeRec, c_nil_rec_absent); + CHECK_DECODE(exer_dec_typerec, str_nil_rec_present_no_attr, NilTypeRec, c_nil_rec_present_no_attr); +} + +/* ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** */ + +// Encoding nillable field, which is a record type with attributes + +type record NilTypeRecInAttr { + record { + TypeWithAttr nil optional + } field +} with { + variant(field) "useNil"; +} + +type record TypeWithAttr { + charstring attr1 optional, + charstring inner_field +} with { + variant (attr1) "attribute"; +} + +const NilTypeRecInAttr c_nil_rec_absent2 := { + field := { + nil := omit + } +}; + +const universal charstring str_nil_rec_absent2 := +"<NilTypeRecInAttr xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'>\n" & +"\t<field xsi:nil='true'/>\n" & +"</NilTypeRecInAttr>\n\n"; + +const NilTypeRecInAttr c_nil_rec_present_attr_omit := { + field := { + nil := { + attr1 := omit, + inner_field := "field" + } + } +}; + +const universal charstring str_nil_rec_present_attr_omit := +"<NilTypeRecInAttr>\n" & +"\t<field>\n" & +"\t\t<inner_field>field</inner_field>\n" & +"\t</field>\n" & +"</NilTypeRecInAttr>\n\n"; + +const NilTypeRecInAttr c_nil_rec_present_attr_present := { + field := { + nil := { + attr1 := "attr", + inner_field := "field" + } + } +}; + +const universal charstring str_nil_rec_present_attr_present := +"<NilTypeRecInAttr>\n" & +"\t<field attr1='attr'>\n" & +"\t\t<inner_field>field</inner_field>\n" & +"\t</field>\n" & +"</NilTypeRecInAttr>\n\n"; + +DECLARE_EXER_ENCODERS(NilTypeRecInAttr, typerecinattr); + +testcase encode_NilTypeRecInAttr() runs on Nil { + CHECK_METHOD(exer_enc_typerecinattr, c_nil_rec_absent2, str_nil_rec_absent2); + CHECK_METHOD(exer_enc_typerecinattr, c_nil_rec_present_attr_omit, str_nil_rec_present_attr_omit); + CHECK_METHOD(exer_enc_typerecinattr, c_nil_rec_present_attr_present, str_nil_rec_present_attr_present); +} + +testcase decode_NilTypeRecInAttr() runs on Nil { + CHECK_DECODE(exer_dec_typerecinattr, str_nil_rec_absent2, NilTypeRecInAttr, c_nil_rec_absent2); + CHECK_DECODE(exer_dec_typerecinattr, str_nil_rec_present_attr_omit, NilTypeRecInAttr, c_nil_rec_present_attr_omit); + //CHECK_DECODE(exer_dec_typerecinattr, str_nil_rec_present_attr_present, NilTypeRecInAttr, c_nil_rec_present_attr_present); +} + +/* ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** */ + +// Encoding nillable field with attribute, which is a record type that has attributes + +type record NilTypeRecAttr { + record { + charstring outer_attr optional, + TypeWithAttr nil optional + } field +} with { + variant(field.outer_attr) "attribute"; + variant(field) "useNil"; +} + +const NilTypeRecAttr c_nil_absent := { + field := { + outer_attr := "outer", + nil := omit + } +}; + +const universal charstring str_nil_absent := +"<NilTypeRecAttr xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'>\n" & +"\t<field outer_attr='outer' xsi:nil='true'/>\n" & +"</NilTypeRecAttr>\n\n"; + +const NilTypeRecAttr c_nil_present := { + field := { + outer_attr := "outer", + nil := { + attr1 := "a", + inner_field := "field" + } + } +}; + +const universal charstring str_nil_present := +"<NilTypeRecAttr>\n" & +"\t<field outer_attr='outer' attr1='a'>\n" & +"\t\t<inner_field>field</inner_field>\n" & +"\t</field>\n" & +"</NilTypeRecAttr>\n\n"; + +const NilTypeRecAttr c_nil_present2 := { + field := { + outer_attr := omit, + nil := { + attr1 := "a", + inner_field := "field" + } + } +}; + +const universal charstring str_nil_present2 := +"<NilTypeRecAttr>\n" & +"\t<field attr1='a'>\n" & +"\t\t<inner_field>field</inner_field>\n" & +"\t</field>\n" & +"</NilTypeRecAttr>\n\n"; + +const NilTypeRecAttr c_nil_present_attr_absent := { + field := { + outer_attr := "outer", + nil := { + attr1 := omit, + inner_field := "field" + } + } +}; + +const universal charstring str_nil_present_attr_absent := +"<NilTypeRecAttr>\n" & +"\t<field outer_attr='outer'>\n" & +"\t\t<inner_field>field</inner_field>\n" & +"\t</field>\n" & +"</NilTypeRecAttr>\n\n"; + +DECLARE_EXER_ENCODERS(NilTypeRecAttr, typeattr); + +testcase encode_NilTypeRecAttr() runs on Nil { + CHECK_METHOD(exer_enc_typeattr, c_nil_absent, str_nil_absent); + CHECK_METHOD(exer_enc_typeattr, c_nil_present, str_nil_present); + CHECK_METHOD(exer_enc_typeattr, c_nil_present2, str_nil_present2); + CHECK_METHOD(exer_enc_typeattr, c_nil_present_attr_absent, str_nil_present_attr_absent); +} + +testcase decode_NilTypeRecAttr() runs on Nil { + CHECK_DECODE(exer_dec_typeattr, str_nil_absent, NilTypeRecAttr, c_nil_absent); + CHECK_DECODE(exer_dec_typeattr, str_nil_present, NilTypeRecAttr, c_nil_present); + CHECK_DECODE(exer_dec_typeattr, str_nil_present2, NilTypeRecAttr, c_nil_present2); + CHECK_DECODE(exer_dec_typeattr, str_nil_present_attr_absent, NilTypeRecAttr, c_nil_present_attr_absent); +} + +/* ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** */ + control { execute(encode_nil_absent()); execute(encode_nil_present()); @@ -561,6 +784,15 @@ control { execute(encode_multi_nil()); execute(decode_multi_nil()); + + execute(encode_NilTypeRec()); + execute(decode_NilTypeRec()); + + execute(encode_NilTypeRecInAttr()); + execute(decode_NilTypeRecInAttr()); + + execute(encode_NilTypeRecAttr()); + execute(decode_NilTypeRecAttr()); } } diff --git a/regression_test/XML/HR49727/UsefulTtcn3Types.ttcn b/regression_test/XML/HR49727/UsefulTtcn3Types.ttcn index bac9ef501..2f45065b9 100644 --- a/regression_test/XML/HR49727/UsefulTtcn3Types.ttcn +++ b/regression_test/XML/HR49727/UsefulTtcn3Types.ttcn @@ -1,10 +1,23 @@ -/****************************************************************************** - * Copyright (c) 2000-2015 Ericsson Telecom AB - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/epl-v10.html - ******************************************************************************/ +/******************************************************************************* +* Copyright (c) 2000-2016 Ericsson Telecom AB +* +* XSD to TTCN-3 Translator version: CRL 113 200/5 R4C +* +* All rights reserved. This program and the accompanying materials +* are made available under the terms of the Eclipse Public License v1.0 +* which accompanies this distribution, and is available at +* http://www.eclipse.org/legal/epl-v10.html +*******************************************************************************/ +// +// File: UsefulTtcn3Types.ttcn +// Description: +// References: +// Rev: +// Prodnr: +// Updated: +// Contact: http://ttcn.ericsson.se +// +//////////////////////////////////////////////////////////////////////////////// module UsefulTtcn3Types { diff --git a/regression_test/XML/HR49727/XSD.ttcn b/regression_test/XML/HR49727/XSD.ttcn index fe79336e9..972cf6686 100644 --- a/regression_test/XML/HR49727/XSD.ttcn +++ b/regression_test/XML/HR49727/XSD.ttcn @@ -1,10 +1,23 @@ -/****************************************************************************** - * Copyright (c) 2000-2015 Ericsson Telecom AB - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/epl-v10.html - ******************************************************************************/ +/******************************************************************************* +* Copyright (c) 2000-2016 Ericsson Telecom AB +* +* XSD to TTCN-3 Translator version: CRL 113 200/5 R4C +* +* All rights reserved. This program and the accompanying materials +* are made available under the terms of the Eclipse Public License v1.0 +* which accompanies this distribution, and is available at +* http://www.eclipse.org/legal/epl-v10.html +*******************************************************************************/ +// +// File: XSD.ttcn +// Description: +// References: +// Rev: +// Prodnr: +// Updated: +// Contact: http://ttcn.ericsson.se +// +//////////////////////////////////////////////////////////////////////////////// module XSD { import from UsefulTtcn3Types all; diff --git a/regression_test/XML/XmlWorkflow/Tgc/UsefulTtcn3Types.ttcn b/regression_test/XML/XmlWorkflow/Tgc/UsefulTtcn3Types.ttcn index bac9ef501..2f45065b9 100644 --- a/regression_test/XML/XmlWorkflow/Tgc/UsefulTtcn3Types.ttcn +++ b/regression_test/XML/XmlWorkflow/Tgc/UsefulTtcn3Types.ttcn @@ -1,10 +1,23 @@ -/****************************************************************************** - * Copyright (c) 2000-2015 Ericsson Telecom AB - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/epl-v10.html - ******************************************************************************/ +/******************************************************************************* +* Copyright (c) 2000-2016 Ericsson Telecom AB +* +* XSD to TTCN-3 Translator version: CRL 113 200/5 R4C +* +* All rights reserved. This program and the accompanying materials +* are made available under the terms of the Eclipse Public License v1.0 +* which accompanies this distribution, and is available at +* http://www.eclipse.org/legal/epl-v10.html +*******************************************************************************/ +// +// File: UsefulTtcn3Types.ttcn +// Description: +// References: +// Rev: +// Prodnr: +// Updated: +// Contact: http://ttcn.ericsson.se +// +//////////////////////////////////////////////////////////////////////////////// module UsefulTtcn3Types { diff --git a/regression_test/XML/XmlWorkflow/Tgc/XSD.ttcn b/regression_test/XML/XmlWorkflow/Tgc/XSD.ttcn index fe79336e9..972cf6686 100644 --- a/regression_test/XML/XmlWorkflow/Tgc/XSD.ttcn +++ b/regression_test/XML/XmlWorkflow/Tgc/XSD.ttcn @@ -1,10 +1,23 @@ -/****************************************************************************** - * Copyright (c) 2000-2015 Ericsson Telecom AB - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/epl-v10.html - ******************************************************************************/ +/******************************************************************************* +* Copyright (c) 2000-2016 Ericsson Telecom AB +* +* XSD to TTCN-3 Translator version: CRL 113 200/5 R4C +* +* All rights reserved. This program and the accompanying materials +* are made available under the terms of the Eclipse Public License v1.0 +* which accompanies this distribution, and is available at +* http://www.eclipse.org/legal/epl-v10.html +*******************************************************************************/ +// +// File: XSD.ttcn +// Description: +// References: +// Rev: +// Prodnr: +// Updated: +// Contact: http://ttcn.ericsson.se +// +//////////////////////////////////////////////////////////////////////////////// module XSD { import from UsefulTtcn3Types all; diff --git a/regression_test/XML/XmlWorkflow/XmlTest_expectedTtcns/www_example_org_including_module_e.ttcn b/regression_test/XML/XmlWorkflow/XmlTest_expectedTtcns/www_example_org_including_module_e.ttcn new file mode 100644 index 000000000..a84927226 --- /dev/null +++ b/regression_test/XML/XmlWorkflow/XmlTest_expectedTtcns/www_example_org_including_module_e.ttcn @@ -0,0 +1,63 @@ +/******************************************************************************* +* Copyright (c) 2000-2016 Ericsson Telecom AB +* +* XSD to TTCN-3 Translator version: CRL 113 200/5 R3C +* +* All rights reserved. This program and the accompanying materials +* are made available under the terms of the Eclipse Public License v1.0 +* which accompanies this distribution, and is available at +* http://www.eclipse.org/legal/epl-v10.html +*******************************************************************************/ +// +// File: www_example_org_including_module_e.ttcn +// Description: +// References: +// Rev: +// Prodnr: +// Updated: Thu Feb 25 18:57:57 2015 +// Contact: http://ttcn.ericsson.se +// +//////////////////////////////////////////////////////////////////////////////// +// Generated from file(s): +// - including_module_e.xsd +// /* xml version = "1.0" encoding = "UTF-8" */ +// /* targetnamespace = "www.example.org/including/module/e" */ +//////////////////////////////////////////////////////////////////////////////// +// Modification header(s): +//----------------------------------------------------------------------------- +// Modified by: +// Modification date: +// Description: +// Modification contact: +//------------------------------------------------------------------------------ +//////////////////////////////////////////////////////////////////////////////// + + +module www_example_org_including_module { + + +import from XSD all; + + +type record Type +{ + XSD.String base +} +with { + variant (base) "untagged"; +}; + + +type Type Elem +with { + variant "element"; +}; + + +} +with { + encode "XML"; + variant "namespace as 'www.example.org/including/module'"; + variant "controlNamespace 'http://www.w3.org/2001/XMLSchema-instance' prefix 'xsi'"; + variant "elementFormQualified"; +} diff --git a/regression_test/XML/XmlWorkflow/XmlTest_xsds/UsefulTtcn3Types.ttcn b/regression_test/XML/XmlWorkflow/XmlTest_xsds/UsefulTtcn3Types.ttcn index bac9ef501..2f45065b9 100644 --- a/regression_test/XML/XmlWorkflow/XmlTest_xsds/UsefulTtcn3Types.ttcn +++ b/regression_test/XML/XmlWorkflow/XmlTest_xsds/UsefulTtcn3Types.ttcn @@ -1,10 +1,23 @@ -/****************************************************************************** - * Copyright (c) 2000-2015 Ericsson Telecom AB - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/epl-v10.html - ******************************************************************************/ +/******************************************************************************* +* Copyright (c) 2000-2016 Ericsson Telecom AB +* +* XSD to TTCN-3 Translator version: CRL 113 200/5 R4C +* +* All rights reserved. This program and the accompanying materials +* are made available under the terms of the Eclipse Public License v1.0 +* which accompanies this distribution, and is available at +* http://www.eclipse.org/legal/epl-v10.html +*******************************************************************************/ +// +// File: UsefulTtcn3Types.ttcn +// Description: +// References: +// Rev: +// Prodnr: +// Updated: +// Contact: http://ttcn.ericsson.se +// +//////////////////////////////////////////////////////////////////////////////// module UsefulTtcn3Types { diff --git a/regression_test/XML/XmlWorkflow/XmlTest_xsds/XSD.ttcn b/regression_test/XML/XmlWorkflow/XmlTest_xsds/XSD.ttcn index 5205cfda3..59c9f3640 100644 --- a/regression_test/XML/XmlWorkflow/XmlTest_xsds/XSD.ttcn +++ b/regression_test/XML/XmlWorkflow/XmlTest_xsds/XSD.ttcn @@ -1,10 +1,23 @@ -/****************************************************************************** - * Copyright (c) 2000-2015 Ericsson Telecom AB - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/epl-v10.html - ******************************************************************************/ +/******************************************************************************* +* Copyright (c) 2000-2016 Ericsson Telecom AB +* +* XSD to TTCN-3 Translator version: CRL 113 200/5 R4C +* +* All rights reserved. This program and the accompanying materials +* are made available under the terms of the Eclipse Public License v1.0 +* which accompanies this distribution, and is available at +* http://www.eclipse.org/legal/epl-v10.html +*******************************************************************************/ +// +// File: XSD.ttcn +// Description: +// References: +// Rev: +// Prodnr: +// Updated: +// Contact: http://ttcn.ericsson.se +// +//////////////////////////////////////////////////////////////////////////////// module XSD { import from UsefulTtcn3Types all; diff --git a/regression_test/XML/XmlWorkflow/src/UsefulTtcn3Types.ttcn b/regression_test/XML/XmlWorkflow/src/UsefulTtcn3Types.ttcn index bac9ef501..2f45065b9 100644 --- a/regression_test/XML/XmlWorkflow/src/UsefulTtcn3Types.ttcn +++ b/regression_test/XML/XmlWorkflow/src/UsefulTtcn3Types.ttcn @@ -1,10 +1,23 @@ -/****************************************************************************** - * Copyright (c) 2000-2015 Ericsson Telecom AB - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/epl-v10.html - ******************************************************************************/ +/******************************************************************************* +* Copyright (c) 2000-2016 Ericsson Telecom AB +* +* XSD to TTCN-3 Translator version: CRL 113 200/5 R4C +* +* All rights reserved. This program and the accompanying materials +* are made available under the terms of the Eclipse Public License v1.0 +* which accompanies this distribution, and is available at +* http://www.eclipse.org/legal/epl-v10.html +*******************************************************************************/ +// +// File: UsefulTtcn3Types.ttcn +// Description: +// References: +// Rev: +// Prodnr: +// Updated: +// Contact: http://ttcn.ericsson.se +// +//////////////////////////////////////////////////////////////////////////////// module UsefulTtcn3Types { diff --git a/regression_test/XML/XmlWorkflow/src/XSD.ttcn b/regression_test/XML/XmlWorkflow/src/XSD.ttcn index fe79336e9..972cf6686 100644 --- a/regression_test/XML/XmlWorkflow/src/XSD.ttcn +++ b/regression_test/XML/XmlWorkflow/src/XSD.ttcn @@ -1,10 +1,23 @@ -/****************************************************************************** - * Copyright (c) 2000-2015 Ericsson Telecom AB - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/epl-v10.html - ******************************************************************************/ +/******************************************************************************* +* Copyright (c) 2000-2016 Ericsson Telecom AB +* +* XSD to TTCN-3 Translator version: CRL 113 200/5 R4C +* +* All rights reserved. This program and the accompanying materials +* are made available under the terms of the Eclipse Public License v1.0 +* which accompanies this distribution, and is available at +* http://www.eclipse.org/legal/epl-v10.html +*******************************************************************************/ +// +// File: XSD.ttcn +// Description: +// References: +// Rev: +// Prodnr: +// Updated: +// Contact: http://ttcn.ericsson.se +// +//////////////////////////////////////////////////////////////////////////////// module XSD { import from UsefulTtcn3Types all; diff --git a/regression_test/XML/XmlWorkflow/src/xmlTest.prj b/regression_test/XML/XmlWorkflow/src/xmlTest.prj index 61f6eb52c..7626b6be9 100644 --- a/regression_test/XML/XmlWorkflow/src/xmlTest.prj +++ b/regression_test/XML/XmlWorkflow/src/xmlTest.prj @@ -155,6 +155,8 @@ <File path="../xsd/type_substitution_complex_cascade.xsd" /> <File path="../xsd/type_substitution_simple_cascade.xsd" /> <File path="../xsd/attribute_enumeration_variant.xsd" /> + <File path="../xsd/including_module.xsd" /> + <File path="../xsd/included_without_namespace.xsd" /> </File_Group> <File_Group name="XmlTest_xsds" > <File path="../XmlTest_xsds/XmlTest_boolean.xsd" /> @@ -386,6 +388,7 @@ <File path="../XmlTest_expectedTtcns/www_XmlTest_org_complex_unique_e.ttcn" /> <File path="../XmlTest_expectedTtcns/www_XmlTest_org_element_nameInheritance_e.ttcn" /> <File path="../XmlTest_expectedTtcns/www_example_org_attribute_enumeration_variant_e.ttcn" /> + <File path="../XmlTest_expectedTtcns/www_example_org_including_module_e.ttcn" /> </File_Group> <File_Group name="XmlTest_src" > <File path="xmlTest_Shell.ttcn" /> diff --git a/regression_test/XML/XmlWorkflow/src/xmlTest_Testcases.ttcn b/regression_test/XML/XmlWorkflow/src/xmlTest_Testcases.ttcn index bf5f0da33..0f3edcfeb 100644 --- a/regression_test/XML/XmlWorkflow/src/xmlTest_Testcases.ttcn +++ b/regression_test/XML/XmlWorkflow/src/xmlTest_Testcases.ttcn @@ -1607,6 +1607,19 @@ group ComplexType { } }//tc_ + //========================================================================= + // tc_complex_include_without_namespace + //========================================================================= + //Positive test: The including schema includes a schema without a namespace + testcase tc_complex_include_without_namespace() runs on xmlTest_CT { + f_shellCommandWithVerdict("xsd2ttcn including_module.xsd included_without_namespace.xsd","",c_shell_successWithoutWarningAndError); + + if(getverdict==pass) { + f_compareFiles( + "www_example_org_including_module_e.ttcn","www_example_org_including_module.ttcn", c_numOfDiff_headerAndModuleName); + } + }//tc_ + //========================================================================= // tc_complex_include_neg1_converter //========================================================================= @@ -1895,6 +1908,21 @@ group Elements{ f_encDecTest_Anything1(vl_pdu,vl_expectedEncodedPdu,vl_expectedDecodedPdu); }//tc_ + testcase tc_element_anyType_embed_encDec() runs on xmlTest_CT { + var Anything1 vl_pdu:= { + embed_values := {"The ordered ", " has arrived ", "Wait for further information.", "Ok"}, + attr :={"someattr=\"1\""}, + elem_list := { + "<ns:a xmlns:ns=\"http://www.example.org/other\">product</ns:a>", + "<ns:b xmlns:ns=\"http://www.example.org/other_1\">2</ns:b>", + "<ns:c xmlns:ns=\"http://www.example.org/other_13\">2</ns:c>" + } + } + var charstring vl_expectedEncodedPdu:= + "<ns31:anything1 xmlns:ns31='www.XmlTest.org/element_anyType' someattr=\"1\">The ordered <ns:a xmlns:ns=\"http://www.example.org/other\">product</ns:a> has arrived <ns:b xmlns:ns=\"http://www.example.org/other_1\">2</ns:b>Wait for further information.<ns:c xmlns:ns=\"http://www.example.org/other_13\">2</ns:c>Ok</ns31:anything1>\n"; + f_encDecTest_Anything1(vl_pdu,vl_expectedEncodedPdu,vl_pdu); + }//tc_ + //=============================================================== // tc_element_anyType_deeper_encDec //=============================================================== @@ -2602,6 +2630,7 @@ control { execute(tc_complex_unique_converter()); execute(tc_complex_include_converter()); execute(tc_complex_include_neg1_converter()); + execute(tc_complex_include_without_namespace()); execute(tc_complex_import_pos1_converter()); execute(tc_complex_import_pos2_converter()); execute(tc_complex_import_neg1_converter()); @@ -2623,6 +2652,7 @@ control { execute(tc_element_anyType_2attrOnly_encDec());//Passed execute(tc_element_anyType_elemOnly_encDec());//Passed, TR: HL29711 execute(tc_element_anyType_encDec());//Passed, HL29711 + execute(tc_element_anyType_embed_encDec()); execute(tc_element_anyType_deeper_encDec()); execute(tc_element_anyType_longer_encDec()); execute(tc_element_recOfElements_converter()); //Passed: TR: HL27438 diff --git a/regression_test/XML/XmlWorkflow/xsd/included_without_namespace.xsd b/regression_test/XML/XmlWorkflow/xsd/included_without_namespace.xsd new file mode 100644 index 000000000..d8da3d39c --- /dev/null +++ b/regression_test/XML/XmlWorkflow/xsd/included_without_namespace.xsd @@ -0,0 +1,12 @@ +<?xml version="1.0" encoding="UTF-8"?> +<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" + elementFormDefault="qualified" attributeFormDefault="unqualified"> + +<xs:complexType name="Type"> + <xs:simpleContent> + <xs:extension base="xs:string"> + </xs:extension> + </xs:simpleContent> +</xs:complexType> + +</xs:schema> diff --git a/regression_test/XML/XmlWorkflow/xsd/including_module.xsd b/regression_test/XML/XmlWorkflow/xsd/including_module.xsd new file mode 100644 index 000000000..b4ee23bc9 --- /dev/null +++ b/regression_test/XML/XmlWorkflow/xsd/including_module.xsd @@ -0,0 +1,12 @@ +<?xml version="1.0" encoding="UTF-8"?> +<xs:schema targetNamespace="www.example.org/including/module" + xmlns="www.example.org/including/module" + xmlns:xs="http://www.w3.org/2001/XMLSchema" + elementFormDefault="qualified" + attributeFormDefault="unqualified"> + +<xs:include schemaLocation="included_without_namespace.xsd"/> + +<xs:element name="Elem" type="Type"/> + +</xs:schema> diff --git a/regression_test/charstrOper/TcharstrOper.ttcn b/regression_test/charstrOper/TcharstrOper.ttcn index f35d373e1..7bbd0c6af 100644 --- a/regression_test/charstrOper/TcharstrOper.ttcn +++ b/regression_test/charstrOper/TcharstrOper.ttcn @@ -387,6 +387,9 @@ type mycstr7 mycstr8 length(1) type charstring mycstr9 (mycstr2) type charstring mycstr10 length(0..infinity) // Full set. +type charstring mycstr11 (pattern "abc?xyz"); +type charstring mycstr12 (pattern @nocase "abc*xyz"); + const mycstr7 c_mycstr1 := "a" const mycstr9 c_mycstr2 := "abcd" @@ -405,15 +408,21 @@ testcase charstrSubtypes() runs on charstrOper_comptype { var template mycstr4 vt_mycstr2 := "ab" // Length with range. var template mycstr6 vt_mycstr3 := "a" // Value range list. var template mycstr7 vt_mycstr4 := vt_mycstr3 // Value range with length. + var template mycstr11 vt_mycstr5 := "abc1xyz"; // Pattern (case sensitive) + var template mycstr12 vt_mycstr6 := "abc123xyz"; // Pattern (case insensitive) var mycstr2 v_mycstr1 := valueof(vt_mycstr1) var mycstr4 v_mycstr2 := valueof(vt_mycstr2) var mycstr6 v_mycstr3 := valueof(vt_mycstr3) var mycstr7 v_mycstr4 := valueof(vt_mycstr4) + var mycstr11 v_mycstr5 := valueof(vt_mycstr5) + var mycstr12 v_mycstr6 := valueof(vt_mycstr6) if (valueof(vt_mycstr1) == v_mycstr1 and v_mycstr2 == valueof(vt_mycstr2)) { setverdict(pass) } else { setverdict(fail) } if (valueof(vt_mycstr3) == v_mycstr3 and v_mycstr4 == valueof(vt_mycstr4)) { setverdict(pass) } else { setverdict(fail) } + if (valueof(vt_mycstr5) == v_mycstr5 and v_mycstr6 == valueof(vt_mycstr6)) { setverdict(pass) } + else { setverdict(fail) } if (c_mycstr1 == f_cstr2() and " " == f_cstr1()) { setverdict(pass) } else { setverdict(fail) } } diff --git a/regression_test/compileonly/mfgen-tpd/Makefile b/regression_test/compileonly/mfgen-tpd/Makefile index 2a04889d7..680e14aa9 100644 --- a/regression_test/compileonly/mfgen-tpd/Makefile +++ b/regression_test/compileonly/mfgen-tpd/Makefile @@ -23,15 +23,17 @@ DIRLIST := buildconfig_param invalid_buildconfig_param invalid_buildconfig_tpd H # The default target. ifeq ($(findstring c,$(MFGEN_FLAGS)),) # no -c # Build in "reverse" order to reduce false positives -all: BuildConsumer BuildSupplier BuildSubplier HP35732 HQ56829 BuildDirs HQ60308 +all: BuildConsumer BuildSupplier BuildSubplier HP35732 HQ56829 BuildDirs HQ60308 SearchPaths else # Build from supplier to consumer because central dirs must be ready # when the toplevel is built -all: BuildSubplier BuildSupplier BuildConsumer COMMON NAS HP35732 HQ56829 BuildDirs +all: BuildSubplier BuildSupplier BuildConsumer COMMON NAS HP35732 HQ56829 BuildDirs SearchPaths .NOTPARALLEL: endif +WORKING_DIR := $(shell pwd) + # The run target is not normally used in compileonly. # It can be built manually. run: @@ -82,16 +84,21 @@ NAS: && $(TTCN3_DIR)/bin/ttcn3_makefilegen -fD $(MFGEN_FLAGS) $(COVERAGE_FLAG) -t ../NAS_EPS_v9.7.0_CNL113729.tpd \ && $(MAKEPROG) +SearchPaths: + cd search_paths/main && \ + $(TTCN3_DIR)/bin/ttcn3_makefilegen -fg -t Main.tpd -I/something -I$(WORKING_DIR)/search_paths/dep3/Test3/ -I$(WORKING_DIR)/search_paths/dep2/Test2 -I$(WORKING_DIR)/search_paths/dep2/dep2_1/Test2_1 && \ + cd bin && $(MAKEPROG) + /tmp/issue: -touch $@ clean: @for dir in $(DIRLIST); do $(MAKE) -C $$dir $@ || exit; done if [ -f HQ60308/Makefile ]; then $(MAKEPROG) -C HQ60308 $@ || exit ; else : ; fi - -rm -rf consumer/bin supplier/bin subplier/bin HP35732 COMMON/bin NAS_EPS_v9.7.0_CNL113729/bin HQ60308/Makefile + -rm -rf consumer/bin supplier/bin subplier/bin HP35732 COMMON/bin NAS_EPS_v9.7.0_CNL113729/bin HQ60308/Makefile search_paths/main/bin distclean: clean -rm -f *.out -.PHONY: all clean distclean run BuildDirs BuildConsumer BuildSupplier BuildSubplier HP35732 HQ56829 HQ56834 HQ56848 COMMON NAS HQ60308 +.PHONY: all clean distclean run BuildDirs BuildConsumer BuildSupplier BuildSubplier HP35732 HQ56829 HQ56834 HQ56848 COMMON NAS HQ60308 SearchPaths diff --git a/regression_test/compileonly/mfgen-tpd/search_paths/dep1/Test/src/MyExample.cfg b/regression_test/compileonly/mfgen-tpd/search_paths/dep1/Test/src/MyExample.cfg new file mode 100644 index 000000000..8fe1bdf00 --- /dev/null +++ b/regression_test/compileonly/mfgen-tpd/search_paths/dep1/Test/src/MyExample.cfg @@ -0,0 +1,8 @@ +[LOGGING] +LogFile := "../log/MyExample-%n.log" +FileMask := LOG_ALL +ConsoleMask := ERROR | TESTCASE | STATISTICS +LogSourceInfo := Stack + +[EXECUTE] +MyExample.control diff --git a/regression_test/compileonly/mfgen-tpd/search_paths/dep1/Test/src/MyExample.ttcn b/regression_test/compileonly/mfgen-tpd/search_paths/dep1/Test/src/MyExample.ttcn new file mode 100644 index 000000000..d2eace0bc --- /dev/null +++ b/regression_test/compileonly/mfgen-tpd/search_paths/dep1/Test/src/MyExample.ttcn @@ -0,0 +1,51 @@ +/****************************************************************************** + * Copyright (c) 2000-2016 Ericsson Telecom AB + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + ******************************************************************************/ +// TTCN-3 version of "Hello, world!" +module MyExample +{ + +import from MyExample2 all; +import from MyExample2_1 all; +import from MyExample3 all; + +type port PCOType message +{ + inout charstring; +} + +type component MTCType +{ + port PCOType MyPCO_PT; +} + +testcase tc_HelloW() runs on MTCType system MTCType +{ + map(mtc:MyPCO_PT, system:MyPCO_PT); + MyPCO_PT.send("Hello, world!"); + setverdict(pass); +} + +testcase tc_HelloW2() runs on MTCType system MTCType +{ + timer TL_T := 15.0; + map(mtc:MyPCO_PT, system:MyPCO_PT); + MyPCO_PT.send("Hello, world!"); + TL_T.start; + alt { + [] MyPCO_PT.receive("Hello, TTCN-3!") { TL_T.stop; setverdict(pass); } + [] TL_T.timeout { setverdict(inconc); } + [] MyPCO_PT.receive { TL_T.stop; setverdict(fail); } + } +} + +control +{ + execute(tc_HelloW()); + execute(tc_HelloW2()); +} +} diff --git a/regression_test/compileonly/mfgen-tpd/search_paths/dep1/Test/src/PCOType.cc b/regression_test/compileonly/mfgen-tpd/search_paths/dep1/Test/src/PCOType.cc new file mode 100644 index 000000000..456c41d30 --- /dev/null +++ b/regression_test/compileonly/mfgen-tpd/search_paths/dep1/Test/src/PCOType.cc @@ -0,0 +1,108 @@ +// This Test Port skeleton source file was generated by the +// TTCN-3 Compiler of the TTCN-3 Test Executor version CRL 113 200/4 R2A +// for Arpad Lovassy (earplov@esekilxxen1841) on Tue Jul 22 16:49:55 2014 + +// Copyright Ericsson Telecom AB 2000-2016 + +// You may modify this file. Complete the body of empty functions and// add your member functions here. + +#include "PCOType.hh" +#include "memory.h" + +#include <stdio.h> + +namespace MyExample { + +PCOType::PCOType(const char *par_port_name) + : PCOType_BASE(par_port_name) +{ + +} + +PCOType::~PCOType() +{ + +} + +void PCOType::set_parameter(const char * /*parameter_name*/, + const char * /*parameter_value*/) +{ + +} + +void PCOType::Event_Handler(const fd_set *read_fds, + const fd_set *write_fds, const fd_set *error_fds, + double time_since_last_call) +{ + size_t buf_len = 0, buf_size = 32; + char *buf = (char*)Malloc(buf_size); + for ( ; ; ) { + int c = getc(stdin); + if (c == EOF) { + if (buf_len > 0) incoming_message(CHARSTRING(buf_len, buf)); + Uninstall_Handler(); + break; + } else if (c == '\n') { + incoming_message(CHARSTRING(buf_len, buf)); + break; + } else { + if (buf_len >= buf_size) { + buf_size *= 2; + buf = (char*)Realloc(buf, buf_size); + } + buf[buf_len++] = c; + } + } + Free(buf); +} + +/*void PCOType::Handle_Fd_Event(int fd, boolean is_readable, + boolean is_writable, boolean is_error) {}*/ + +void PCOType::Handle_Fd_Event_Error(int /*fd*/) +{ + +} + +void PCOType::Handle_Fd_Event_Writable(int /*fd*/) +{ + +} + +void PCOType::Handle_Fd_Event_Readable(int /*fd*/) +{ + +} + +/*void PCOType::Handle_Timeout(double time_since_last_call) {}*/ + +void PCOType::user_map(const char *system_port) +{ + fd_set readfds; + FD_ZERO(&readfds); + FD_SET(fileno(stdin), &readfds); + Install_Handler(&readfds, NULL, NULL, 0.0); +} + +void PCOType::user_unmap(const char *system_port) +{ + Uninstall_Handler(); +} + +void PCOType::user_start() +{ + +} + +void PCOType::user_stop() +{ + +} + +void PCOType::outgoing_send(const CHARSTRING& send_par) +{ + puts((const char*)send_par); + fflush(stdout); +} + +} /* end of namespace */ diff --git a/regression_test/compileonly/mfgen-tpd/search_paths/dep1/Test/src/PCOType.hh b/regression_test/compileonly/mfgen-tpd/search_paths/dep1/Test/src/PCOType.hh new file mode 100644 index 000000000..b86781a55 --- /dev/null +++ b/regression_test/compileonly/mfgen-tpd/search_paths/dep1/Test/src/PCOType.hh @@ -0,0 +1,48 @@ +// This Test Port skeleton header file was generated by the +// TTCN-3 Compiler of the TTCN-3 Test Executor version CRL 113 200/4 R2A +// for Arpad Lovassy (earplov@esekilxxen1841) on Tue Jul 22 16:49:55 2014 + +// Copyright Ericsson Telecom AB 2000-2016 + +// You may modify this file. Add your attributes and prototypes of your +// member functions here. + +#ifndef PCOType_HH +#define PCOType_HH + +#include "MyExample.hh" + +namespace MyExample { + +class PCOType : public PCOType_BASE { +public: + PCOType(const char *par_port_name = NULL); + ~PCOType(); + + void set_parameter(const char *parameter_name, + const char *parameter_value); + + void Event_Handler(const fd_set *read_fds, + const fd_set *write_fds, const fd_set *error_fds, + double time_since_last_call); + +private: + /* void Handle_Fd_Event(int fd, boolean is_readable, + boolean is_writable, boolean is_error); */ + void Handle_Fd_Event_Error(int fd); + void Handle_Fd_Event_Writable(int fd); + void Handle_Fd_Event_Readable(int fd); + /* void Handle_Timeout(double time_since_last_call); */ +protected: + void user_map(const char *system_port); + void user_unmap(const char *system_port); + + void user_start(); + void user_stop(); + + void outgoing_send(const CHARSTRING& send_par); +}; + +} /* end of namespace */ + +#endif diff --git a/regression_test/compileonly/mfgen-tpd/search_paths/dep1/Test1/DepTpd1.tpd b/regression_test/compileonly/mfgen-tpd/search_paths/dep1/Test1/DepTpd1.tpd new file mode 100644 index 000000000..12b46977d --- /dev/null +++ b/regression_test/compileonly/mfgen-tpd/search_paths/dep1/Test1/DepTpd1.tpd @@ -0,0 +1,45 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + Copyright (c) 2000-2016 Ericsson Telecom AB + + All rights reserved. This program and the accompanying materials + are made available under the terms of the Eclipse Public License v1.0 + which accompanies this distribution, and is available at + http://www.eclipse.org/legal/epl-v10.html + --> +<TITAN_Project_File_Information version="1.0"> + <ProjectName>DepTpd1</ProjectName> + <Folders> + <FolderResource projectRelativePath="src" relativeURI="../Test/src"/> + </Folders> + <Files> + <FileResource projectRelativePath="src/MyExample.cfg" relativeURI="../Test/src/MyExample.cfg"/> + <FileResource projectRelativePath="src/MyExample.ttcn" relativeURI="../Test/src/MyExample.ttcn"/> + <FileResource projectRelativePath="src/PCOType.cc" relativeURI="../Test/src/PCOType.cc"/> + <FileResource projectRelativePath="src/PCOType.hh" relativeURI="../Test/src/PCOType.hh"/> + </Files> + <ActiveConfiguration>Default</ActiveConfiguration> + <Configurations> + <Configuration name="Default"> + <ProjectProperties> + <MakefileSettings> + <singleMode>true</singleMode> + <targetExecutable>bin\DepTpd1.exe</targetExecutable> + <useGoldLinker>false</useGoldLinker> + <freeTextLinkerOptions></freeTextLinkerOptions> + </MakefileSettings> + <LocalBuildSettings> + <workingDirectory>bin</workingDirectory> + </LocalBuildSettings> + </ProjectProperties> + <FileProperties> + <FileResource> + <FilePath>src/MyExample.cfg</FilePath> + <FileProperties> + <ExcludeFromBuild>true</ExcludeFromBuild> + </FileProperties> + </FileResource> + </FileProperties> + </Configuration> + </Configurations> +</TITAN_Project_File_Information> diff --git a/regression_test/compileonly/mfgen-tpd/search_paths/dep2/Test/src/MyExample2.ttcn b/regression_test/compileonly/mfgen-tpd/search_paths/dep2/Test/src/MyExample2.ttcn new file mode 100644 index 000000000..e362aae50 --- /dev/null +++ b/regression_test/compileonly/mfgen-tpd/search_paths/dep2/Test/src/MyExample2.ttcn @@ -0,0 +1,11 @@ +/****************************************************************************** + * Copyright (c) 2000-2016 Ericsson Telecom AB + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + ******************************************************************************/ +module MyExample2 +{ + +} diff --git a/regression_test/compileonly/mfgen-tpd/search_paths/dep2/Test2/DepTpd2.tpd b/regression_test/compileonly/mfgen-tpd/search_paths/dep2/Test2/DepTpd2.tpd new file mode 100644 index 000000000..0f2802fb1 --- /dev/null +++ b/regression_test/compileonly/mfgen-tpd/search_paths/dep2/Test2/DepTpd2.tpd @@ -0,0 +1,45 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + Copyright (c) 2000-2016 Ericsson Telecom AB + + All rights reserved. This program and the accompanying materials + are made available under the terms of the Eclipse Public License v1.0 + which accompanies this distribution, and is available at + http://www.eclipse.org/legal/epl-v10.html + --> +<TITAN_Project_File_Information version="1.0"> + <ProjectName>DepTpd2</ProjectName> + <ReferencedProjects> + <ReferencedProject name="DepTpd2_1" projectLocationURI="bad/dir/DepTpd2_1.tpd" /> + </ReferencedProjects> + <Folders> + <FolderResource projectRelativePath="src" relativeURI="../Test/src"/> + </Folders> + <Files> + <FileResource projectRelativePath="src/MyExample2.ttcn" relativeURI="../Test/src/MyExample2.ttcn"/> + </Files> + <ActiveConfiguration>Default</ActiveConfiguration> + <Configurations> + <Configuration name="Default"> + <ProjectProperties> + <MakefileSettings> + <singleMode>true</singleMode> + <targetExecutable>bin\Test.exe</targetExecutable> + <useGoldLinker>false</useGoldLinker> + <freeTextLinkerOptions></freeTextLinkerOptions> + </MakefileSettings> + <LocalBuildSettings> + <workingDirectory>bin</workingDirectory> + </LocalBuildSettings> + </ProjectProperties> + <FileProperties> + <FileResource> + <FilePath>src/MyExample.cfg</FilePath> + <FileProperties> + <ExcludeFromBuild>true</ExcludeFromBuild> + </FileProperties> + </FileResource> + </FileProperties> + </Configuration> + </Configurations> +</TITAN_Project_File_Information> diff --git a/regression_test/compileonly/mfgen-tpd/search_paths/dep2/dep2_1/Test/src/MyExample2_1.ttcn b/regression_test/compileonly/mfgen-tpd/search_paths/dep2/dep2_1/Test/src/MyExample2_1.ttcn new file mode 100644 index 000000000..f54430c92 --- /dev/null +++ b/regression_test/compileonly/mfgen-tpd/search_paths/dep2/dep2_1/Test/src/MyExample2_1.ttcn @@ -0,0 +1,11 @@ +/****************************************************************************** + * Copyright (c) 2000-2016 Ericsson Telecom AB + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + ******************************************************************************/ +module MyExample2_1 +{ + +} diff --git a/regression_test/compileonly/mfgen-tpd/search_paths/dep2/dep2_1/Test2_1/DepTpd2_1.tpd b/regression_test/compileonly/mfgen-tpd/search_paths/dep2/dep2_1/Test2_1/DepTpd2_1.tpd new file mode 100644 index 000000000..fa00cd263 --- /dev/null +++ b/regression_test/compileonly/mfgen-tpd/search_paths/dep2/dep2_1/Test2_1/DepTpd2_1.tpd @@ -0,0 +1,42 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + Copyright (c) 2000-2016 Ericsson Telecom AB + + All rights reserved. This program and the accompanying materials + are made available under the terms of the Eclipse Public License v1.0 + which accompanies this distribution, and is available at + http://www.eclipse.org/legal/epl-v10.html + --> +<TITAN_Project_File_Information version="1.0"> + <ProjectName>DepTpd2_1</ProjectName> + <Folders> + <FolderResource projectRelativePath="src" relativeURI="../Test/src"/> + </Folders> + <Files> + <FileResource projectRelativePath="src/MyExample2_1.ttcn" relativeURI="../Test/src/MyExample2_1.ttcn"/> + </Files> + <ActiveConfiguration>Default</ActiveConfiguration> + <Configurations> + <Configuration name="Default"> + <ProjectProperties> + <MakefileSettings> + <singleMode>true</singleMode> + <targetExecutable>bin\Test.exe</targetExecutable> + <useGoldLinker>false</useGoldLinker> + <freeTextLinkerOptions></freeTextLinkerOptions> + </MakefileSettings> + <LocalBuildSettings> + <workingDirectory>bin</workingDirectory> + </LocalBuildSettings> + </ProjectProperties> + <FileProperties> + <FileResource> + <FilePath>src/MyExample.cfg</FilePath> + <FileProperties> + <ExcludeFromBuild>true</ExcludeFromBuild> + </FileProperties> + </FileResource> + </FileProperties> + </Configuration> + </Configurations> +</TITAN_Project_File_Information> diff --git a/regression_test/compileonly/mfgen-tpd/search_paths/dep3/Test/src/MyExample3.ttcn b/regression_test/compileonly/mfgen-tpd/search_paths/dep3/Test/src/MyExample3.ttcn new file mode 100644 index 000000000..1d647a50a --- /dev/null +++ b/regression_test/compileonly/mfgen-tpd/search_paths/dep3/Test/src/MyExample3.ttcn @@ -0,0 +1,11 @@ +/****************************************************************************** + * Copyright (c) 2000-2016 Ericsson Telecom AB + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + ******************************************************************************/ +module MyExample3 +{ + +} diff --git a/regression_test/compileonly/mfgen-tpd/search_paths/dep3/Test3/DepTpd3.tpd b/regression_test/compileonly/mfgen-tpd/search_paths/dep3/Test3/DepTpd3.tpd new file mode 100644 index 000000000..222b8e54f --- /dev/null +++ b/regression_test/compileonly/mfgen-tpd/search_paths/dep3/Test3/DepTpd3.tpd @@ -0,0 +1,42 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + Copyright (c) 2000-2016 Ericsson Telecom AB + + All rights reserved. This program and the accompanying materials + are made available under the terms of the Eclipse Public License v1.0 + which accompanies this distribution, and is available at + http://www.eclipse.org/legal/epl-v10.html + --> +<TITAN_Project_File_Information version="1.0"> + <ProjectName>DepTpd3</ProjectName> + <Folders> + <FolderResource projectRelativePath="src" relativeURI="../Test/src"/> + </Folders> + <Files> + <FileResource projectRelativePath="src/MyExample3.ttcn" relativeURI="../Test/src/MyExample3.ttcn"/> + </Files> + <ActiveConfiguration>Default</ActiveConfiguration> + <Configurations> + <Configuration name="Default"> + <ProjectProperties> + <MakefileSettings> + <singleMode>true</singleMode> + <targetExecutable>bin\Test.exe</targetExecutable> + <useGoldLinker>false</useGoldLinker> + <freeTextLinkerOptions></freeTextLinkerOptions> + </MakefileSettings> + <LocalBuildSettings> + <workingDirectory>bin</workingDirectory> + </LocalBuildSettings> + </ProjectProperties> + <FileProperties> + <FileResource> + <FilePath>src/MyExample.cfg</FilePath> + <FileProperties> + <ExcludeFromBuild>true</ExcludeFromBuild> + </FileProperties> + </FileResource> + </FileProperties> + </Configuration> + </Configurations> +</TITAN_Project_File_Information> diff --git a/regression_test/compileonly/mfgen-tpd/search_paths/main/Main.tpd b/regression_test/compileonly/mfgen-tpd/search_paths/main/Main.tpd new file mode 100644 index 000000000..bca675feb --- /dev/null +++ b/regression_test/compileonly/mfgen-tpd/search_paths/main/Main.tpd @@ -0,0 +1,39 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + Copyright (c) 2000-2016 Ericsson Telecom AB + + All rights reserved. This program and the accompanying materials + are made available under the terms of the Eclipse Public License v1.0 + which accompanies this distribution, and is available at + http://www.eclipse.org/legal/epl-v10.html + --> +<TITAN_Project_File_Information version="1.0"> + <ProjectName>Main</ProjectName> + <ReferencedProjects> + <ReferencedProject name="DepTpd1" projectLocationURI="../dep1/Test1/DepTpd1.tpd" /> + <ReferencedProject name="Second" tpdName="DepTpd2.tpd" projectLocationURI="../bad/path/Test.tpd" /> + <ReferencedProject name="DepTpd3" projectLocationURI="../bad/path/Test.tpd" /> + </ReferencedProjects> + <Folders> + <FolderResource projectRelativePath="src" relativeURI="src"/> + </Folders> + <Files> + <FileResource projectRelativePath="src/MyMain.ttcn" relativeURI="src/MyMain.ttcn"/> + </Files> + <ActiveConfiguration>Default</ActiveConfiguration> + <Configurations> + <Configuration name="Default"> + <ProjectProperties> + <MakefileSettings> + <singleMode>true</singleMode> + <targetExecutable>bin\TpdEnvVarTestMain.exe</targetExecutable> + <useGoldLinker>false</useGoldLinker> + <freeTextLinkerOptions></freeTextLinkerOptions> + </MakefileSettings> + <LocalBuildSettings> + <workingDirectory>bin</workingDirectory> + </LocalBuildSettings> + </ProjectProperties> + </Configuration> + </Configurations> +</TITAN_Project_File_Information> diff --git a/regression_test/compileonly/mfgen-tpd/search_paths/main/src/MyMain.ttcn b/regression_test/compileonly/mfgen-tpd/search_paths/main/src/MyMain.ttcn new file mode 100644 index 000000000..f6aa78fc3 --- /dev/null +++ b/regression_test/compileonly/mfgen-tpd/search_paths/main/src/MyMain.ttcn @@ -0,0 +1,13 @@ +/****************************************************************************** + * Copyright (c) 2000-2016 Ericsson Telecom AB + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + ******************************************************************************/ +module MyMain { + import from MyExample all; + import from MyExample2 all; + import from MyExample2_1 all; + import from MyExample3 all; +} diff --git a/regression_test/implicitOmit/IOAsn.asn b/regression_test/implicitOmit/IOAsn.asn new file mode 100644 index 000000000..14685d45f --- /dev/null +++ b/regression_test/implicitOmit/IOAsn.asn @@ -0,0 +1,26 @@ +--***************************************************************************** +-- Copyright (c) 2000-2015 Ericsson Telecom AB +-- All rights reserved. This program and the accompanying materials +-- are made available under the terms of the Eclipse Public License v1.0 +-- which accompanies this distribution, and is available at +-- http://www.eclipse.org/legal/epl-v10.html +--***************************************************************************** +IOAsn +DEFINITIONS + +AUTOMATIC TAGS ::= + +BEGIN + +AsnSequence ::= SEQUENCE { + field1 ENUMERATED { enumVal } OPTIONAL, + field2 CHOICE { + alt1 INTEGER, + alt2 INTEGER + } OPTIONAL, + field3 INTEGER OPTIONAL, + field4 INTEGER OPTIONAL +} + + +END diff --git a/regression_test/implicitOmit/Makefile b/regression_test/implicitOmit/Makefile index a892b09fd..991ba9d51 100644 --- a/regression_test/implicitOmit/Makefile +++ b/regression_test/implicitOmit/Makefile @@ -38,7 +38,7 @@ TTCN3_LIB = ttcn3$(RT2_SUFFIX)$(DYNAMIC_SUFFIX) TTCN3_MODULES = io.ttcn # ASN.1 modules of this project: -ASN1_MODULES = +ASN1_MODULES = IOAsn.asn # C++ source & header files generated from the TTCN-3 & ASN.1 modules of # this project: diff --git a/regression_test/implicitOmit/io.ttcn b/regression_test/implicitOmit/io.ttcn index f326c6d11..1e20b6add 100644 --- a/regression_test/implicitOmit/io.ttcn +++ b/regression_test/implicitOmit/io.ttcn @@ -6,6 +6,9 @@ * http://www.eclipse.org/legal/epl-v10.html ******************************************************************************/ module io { + +import from IOAsn all; + type component O {} @@ -542,6 +545,16 @@ testcase tc_io_notused() runs on O else { setverdict(fail, c_notused_value); } } +// Implicit omit on an ASN.1 record, with only empty brackets (which is considered as value list notation) +template AsnSequence t_asn_rec_empty := { } with { optional "implicit omit" }; +template AsnSequence t_asn_rec_empty_exp := { omit, omit, omit, omit }; + +testcase tc_io_asn_record_empty() runs on O +{ + if (log2str(t_asn_rec_empty) == log2str(t_asn_rec_empty_exp)) { setverdict(pass); } + else { setverdict(fail, t_asn_rec_empty); } +} + control { execute(tc12()); execute(tc1ab()); @@ -584,6 +597,7 @@ execute(tc_HQ30261()) execute(tc_io_embedded()); execute(tc_io_notused()); +execute(tc_io_asn_record_empty()); } with { optional "implicit omit" diff --git a/regression_test/json/AttributeTestcases.ttcn b/regression_test/json/AttributeTestcases.ttcn index 2c529e67f..c371411dd 100755 --- a/regression_test/json/AttributeTestcases.ttcn +++ b/regression_test/json/AttributeTestcases.ttcn @@ -58,6 +58,14 @@ testcase tc_name_as() runs on MTC { f_bool2verdict( match(f_dec_profile(f_enc_profile(p)), p) ); } +// testing attribute "name as ..." when the aliases are keywords of the JSON variant syntax +testcase tc_name_as_with_keywords() runs on MTC { + var KeywordFields p := { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 }; + var octetstring os := char2oct("{\"omit\":1,\"as\":2,\"null\":3,\"name\":4,\"value\":5,\"default\":6,\"extend\":7,\"metainfo\":8,\"for\":9,\"unbound\":10,\"JSON\":11}"); + f_check_encoding(encoded := f_enc_kw_fld(p), expected := os); + f_bool2verdict( match(f_dec_kw_fld(os), p) ); +} + //tests in case of selecting attributes: //if omit fields appear in the encoded //if all not omitted field value appear in the correct form @@ -302,11 +310,49 @@ testcase tc_attribute_metainfo_for_unbound_negtest() runs on MTC { setverdict(pass); } +// Decoding test for the 'metainfo for unbound' attribute, where all fields of an embedded record are +// set to unbound by meta info. The decoded embedded record should be unbound. +testcase tc_attribute_metainfo_for_unbound_empty_rec() runs on MTC { + var charstring dec_str := "{\"mynum\":99,\"mystr\":\"aa\", \"myRec\": {\"num\":null,\"metainfo num\":\"unbound\",\"str\":null,\"metainfo str\":\"unbound\" } }"; + var MetainfoOuterRecord dec_val := f_dec_meta_outer_rec(char2oct(dec_str)); + if (isbound(dec_val.myRec)) { + setverdict(fail, "Field myrec should be unbound after decoding, instead of ", dec_val.myRec); + } + var MetainfoOuterRecord dec_val_exp := { mynum := 99, mystr := "aa", myRec := - }; + if (log2str(dec_val) != log2str(dec_val_exp)) { + setverdict(fail, "Invalid value after decoding. Expected: ", dec_val_exp, ", got: ", dec_val); + } + setverdict(pass); +} + +// Encoding array types with unbound elements with meta info (attribute 'metainfo for unbound') +// A JSON object with one key-value pair (containing the meta info) specifies that an element is unbound. +testcase tc_attribute_metainfo_for_unbound_arrays() runs on MTC { + // test 1: pre-generated array type (record of integer) + var MetainfoRecOf recof := { 1, 2, -, 4 }; + var octetstring os := char2oct("[1,2,{\"metainfo []\":\"unbound\"},4]"); + f_check_encoding(encoded := f_enc_meta_recof(recof), expected := os); + f_bool2verdict( log2str(f_dec_meta_recof(os)) == log2str(recof) ); + + // test 2: array of a structured type (set of MetainfoRecord) + var MetainfoSetOf setof := { { num := 3, str := "abc" }, -, { num := 6 } }; + os := char2oct("[{\"num\":3,\"str\":\"abc\"},{\"metainfo []\":\"unbound\"},{\"num\":6,\"str\":null,\"metainfo str\":\"unbound\"}]"); + f_check_encoding(encoded := f_enc_meta_setof(setof), expected := os); + f_bool2verdict( log2str(f_dec_meta_setof(os)) == log2str(setof) ); + + // test 3: TTCN-3 array (float [3]) + var MetainfoArray arr := { 3.0, 6.0, - }; + os := char2oct("[3.000000,6.000000,{\"metainfo []\":\"unbound\"}]"); + f_check_encoding(encoded := f_enc_meta_arr(arr), expected := os); + f_bool2verdict( log2str(f_dec_meta_arr(os)) == log2str(arr) ); +} + control { execute(tc_NoAttributeOnUpperLevel()) execute(tc_name_as_omit_as_null()); execute(tc_name_as()); + execute(tc_name_as_with_keywords()); execute(tc_attribute_compactprint1()); execute(tc_attribute_compactprint2()); execute(tc_attribute_compactprintp()); @@ -319,5 +365,7 @@ control { execute(tc_attribute_optional_as_value()); execute(tc_attribute_metainfo_for_unbound()); execute(tc_attribute_metainfo_for_unbound_negtest()); + execute(tc_attribute_metainfo_for_unbound_empty_rec()); + execute(tc_attribute_metainfo_for_unbound_arrays()); } } diff --git a/regression_test/json/Functions.ttcn b/regression_test/json/Functions.ttcn index 912df569b..5993c6714 100755 --- a/regression_test/json/Functions.ttcn +++ b/regression_test/json/Functions.ttcn @@ -98,6 +98,9 @@ external function f_enc_profile0(in Profile0 u) return octetstring external function f_enc_cba(in CBA u) return octetstring with { extension "prototype(convert)"; extension "encode(JSON)"; } +external function f_enc_kw_fld(in KeywordFields u) return octetstring + with { extension "prototype(convert)"; extension "encode(JSON)"; } + external function f_enc_stuff(in Stuff x) return octetstring with { extension "prototype(convert) encode(JSON)" } @@ -115,6 +118,18 @@ external function f_enc_meta_rec(in MetainfoRecord x) return octetstring external function f_enc_meta_set(in MetainfoSet x) return octetstring with { extension "prototype(convert) encode(JSON)" } + +external function f_enc_meta_outer_rec(in MetainfoOuterRecord x) return octetstring + with { extension "prototype(convert) encode(JSON)" } + +external function f_enc_meta_recof(in MetainfoRecOf x) return octetstring + with { extension "prototype(convert) encode(JSON)" } + +external function f_enc_meta_setof(in MetainfoSetOf x) return octetstring + with { extension "prototype(convert) encode(JSON)" } + +external function f_enc_meta_arr(in MetainfoArray x) return octetstring + with { extension "prototype(convert) encode(JSON)" } // for ASN.1 types external function f_enc_seqofint(in SeqOfInt x) return octetstring @@ -213,6 +228,9 @@ external function f_dec_profile0(in octetstring u) return Profile0 external function f_dec_cba(in octetstring u) return CBA with { extension "prototype(convert)"; extension "decode(JSON)"; } +external function f_dec_kw_fld(in octetstring u) return KeywordFields + with { extension "prototype(convert)"; extension "decode(JSON)"; } + external function f_dec_stuff(in octetstring x) return Stuff with { extension "prototype(convert) decode(JSON)" } @@ -233,6 +251,18 @@ external function f_dec_meta_rec(in octetstring x) return MetainfoRecord external function f_dec_meta_set(in octetstring x) return MetainfoSet with { extension "prototype(convert) decode(JSON)" } + +external function f_dec_meta_outer_rec(in octetstring x) return MetainfoOuterRecord + with { extension "prototype(convert) decode(JSON)" } + +external function f_dec_meta_recof(in octetstring x) return MetainfoRecOf + with { extension "prototype(convert) decode(JSON)" } + +external function f_dec_meta_setof(in octetstring x) return MetainfoSetOf + with { extension "prototype(convert) decode(JSON)" } + +external function f_dec_meta_arr(in octetstring x) return MetainfoArray + with { extension "prototype(convert) decode(JSON)" } // for ASN.1 types external function f_dec_seqofint(in octetstring x) return SeqOfInt diff --git a/regression_test/json/Types.ttcn b/regression_test/json/Types.ttcn index b3ed9a21a..c75b83cda 100755 --- a/regression_test/json/Types.ttcn +++ b/regression_test/json/Types.ttcn @@ -106,6 +106,33 @@ type set Product { variant(price) "JSON:omit as null" } +type record KeywordFields { + integer a1, + integer a2, + integer a3, + integer a4, + integer a5, + integer a6, + integer a7, + integer a8, + integer a9, + integer a10, + integer a11 +} +with { + variant(a1) "JSON: name as omit"; + variant(a2) "JSON: name as as"; + variant(a3) "JSON: name as null"; + variant(a4) "JSON: name as name"; + variant(a5) "JSON: name as value"; + variant(a6) "JSON: name as default"; + variant(a7) "JSON: name as extend"; + variant(a8) "JSON: name as metainfo"; + variant(a9) "JSON: name as for"; + variant(a10) "JSON: name as unbound"; + variant(a11) "JSON: name as JSON"; +} + type union Thing { integer ival, float fval, @@ -203,6 +230,29 @@ with { variant (num) " JSON : name as int "; } +type record MetainfoInnerRecord { + integer num, + charstring str +} +with { + variant "JSON: metainfo for unbound"; +} + +type record MetainfoOuterRecord { + integer mynum, + charstring mystr, + MetainfoInnerRecord myRec +} + +type record of integer MetainfoRecOf +with { variant "JSON: metainfo for unbound"; } + +type set of MetainfoRecord MetainfoSetOf +with { variant "JSON: metainfo for unbound"; } + +type float MetainfoArray[3] +with { variant "JSON: metainfo for unbound"; } + } with { encode "JSON"; } diff --git a/regression_test/negativeTest/UsefulTtcn3Types.ttcn b/regression_test/negativeTest/UsefulTtcn3Types.ttcn index bac9ef501..2f45065b9 100644 --- a/regression_test/negativeTest/UsefulTtcn3Types.ttcn +++ b/regression_test/negativeTest/UsefulTtcn3Types.ttcn @@ -1,10 +1,23 @@ -/****************************************************************************** - * Copyright (c) 2000-2015 Ericsson Telecom AB - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/epl-v10.html - ******************************************************************************/ +/******************************************************************************* +* Copyright (c) 2000-2016 Ericsson Telecom AB +* +* XSD to TTCN-3 Translator version: CRL 113 200/5 R4C +* +* All rights reserved. This program and the accompanying materials +* are made available under the terms of the Eclipse Public License v1.0 +* which accompanies this distribution, and is available at +* http://www.eclipse.org/legal/epl-v10.html +*******************************************************************************/ +// +// File: UsefulTtcn3Types.ttcn +// Description: +// References: +// Rev: +// Prodnr: +// Updated: +// Contact: http://ttcn.ericsson.se +// +//////////////////////////////////////////////////////////////////////////////// module UsefulTtcn3Types { diff --git a/regression_test/negativeTest/XSD.ttcn b/regression_test/negativeTest/XSD.ttcn index fe79336e9..972cf6686 100644 --- a/regression_test/negativeTest/XSD.ttcn +++ b/regression_test/negativeTest/XSD.ttcn @@ -1,10 +1,23 @@ -/****************************************************************************** - * Copyright (c) 2000-2015 Ericsson Telecom AB - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/epl-v10.html - ******************************************************************************/ +/******************************************************************************* +* Copyright (c) 2000-2016 Ericsson Telecom AB +* +* XSD to TTCN-3 Translator version: CRL 113 200/5 R4C +* +* All rights reserved. This program and the accompanying materials +* are made available under the terms of the Eclipse Public License v1.0 +* which accompanies this distribution, and is available at +* http://www.eclipse.org/legal/epl-v10.html +*******************************************************************************/ +// +// File: XSD.ttcn +// Description: +// References: +// Rev: +// Prodnr: +// Updated: +// Contact: http://ttcn.ericsson.se +// +//////////////////////////////////////////////////////////////////////////////// module XSD { import from UsefulTtcn3Types all; diff --git a/regression_test/predefFunction/regex_OK.ttcn b/regression_test/predefFunction/regex_OK.ttcn index da2131fa5..61e4ab099 100644 --- a/regression_test/predefFunction/regex_OK.ttcn +++ b/regression_test/predefFunction/regex_OK.ttcn @@ -65,8 +65,8 @@ reg[34] := regexp("333\rhhh " ,"*\r(*) " ,0) reg[35] := regexp("333\"hhh " ,"*\"(???)(?)*" ,0) reg[36] := regexp("333\"hhh " ,"*3?(?*??)[ ,1]" ,0) reg[37] := regexp("333\"hhh " ,"*3?(???)[1, ,2]" ,0) //In variable assignment// //In operation `regexp\(\)'// //In character string pattern// //Charstring pattern: Duplicate character `.' in the character set// -reg[38] := regexp("333\"hhh " ,"*33?(???)[^a,1]" ,0) -reg[39] := regexp("333\"hhh " ,"333\"(???)*" ,0) +reg[38] := regexp @nocase ("333\"hhh " ,"*33?(???)[^a,1]" ,0) +reg[39] := regexp @nocase ("333\"hhh " ,"333\"(???)*" ,0) for (var integer j:=0; j<=39; j:=j+1) { diff --git a/regression_test/recordOper/TrecordOper.ttcn b/regression_test/recordOper/TrecordOper.ttcn index 8e35633ce..5ece0f955 100644 --- a/regression_test/recordOper/TrecordOper.ttcn +++ b/regression_test/recordOper/TrecordOper.ttcn @@ -1532,32 +1532,6 @@ testcase tc_record_partiallyInit13() runs on recordOper_mycomp { if(ispresent(vl_r.roi[0])){setverdict(fail)}else {setverdict(pass)}; if(ispresent(vl_r.roi[90])){setverdict(fail)}else {setverdict(pass)}; } - -// Must be able to make a difference between an unbound record and a bound record with unbound elements (TR: HT25776) -type record TheRec { - integer num, - charstring str -} with { - encode "JSON" -} - -external function f_dec(in octetstring x) return TheRec - with { extension "prototype(convert) decode(JSON) errorbehavior(ALL:WARNING)" } - -testcase tc_record_unbound_diff() runs on recordOper_mycomp -{ - // Unbound record - var TheRec v1; - log(v1); - if (not isbound(v1)) { setverdict(pass); } - else { setverdict(fail, "expected unbound record, got: ", v1); } - - // Create a bound, but empty record with the JSON decoder (decoding errors will only display warnings) - v1 := f_dec(char2oct("{}")); - log(v1); - if (isbound(v1)) { setverdict(pass); } - else { setverdict(fail, "record is unbound, expected bound record with unbound fields"); } -} control { const recordOper_trecord cl_temp1:={ x1:=omit, x2:=3.4 }; // can constants be declared in the control part @@ -1629,6 +1603,5 @@ control { execute(tc_record_omit2()); execute(tc_record_omit_HQ51693()); execute(tc_recordOf_omit()); - execute(tc_record_unbound_diff()); } } diff --git a/regression_test/templateCharstr/TtemplateCharstr.ttcn b/regression_test/templateCharstr/TtemplateCharstr.ttcn index b91d83867..e4be883e0 100644 --- a/regression_test/templateCharstr/TtemplateCharstr.ttcn +++ b/regression_test/templateCharstr/TtemplateCharstr.ttcn @@ -87,6 +87,10 @@ template templateCharstr_rec templateCharstr_tRepeatFull := { x1:= pattern "6#(3,)", // at least 3 x2:= pattern "6#(,3)", // at most 3 x3:= pattern "6#(3,3)" }; // precisely 3 +template templateCharstr_rec templateCharstr_tPattern := { + x1 := pattern "abc?xyz", + x2 := pattern @nocase "abc?xyz", + x3 := pattern @nocase "abc*xyz" }; testcase templateCharstrSpec() runs on templateCharstr_mycomp { var templateCharstr_rec x1,x2; //specific value @@ -468,6 +472,29 @@ if (not(match(x4,templateCharstr_tRepeatFull))) {setverdict(pass);} else {setverdict(fail);} } +testcase templateCharstrPattern() runs on templateCharstr_mycomp { + var templateCharstr_rec x0, x1, x2, x3, x4; // pattern + x0 := { x1 := "abc,xyz", x2 := "abc1xyz", x3 := "abcxyz" }; + x1 := { x1 := "abcpxyz", x2 := "abcPxyz", x3 := "abc123abcJKL.? \txyz" }; + x2 := { x1 := "abcxyz", x2 := "abcPxyz", x3 := "abc123xyz" }; // fail first + x3 := { x1 := "abcpxyz", x2 := "abc123xyz", x3 := "abc123xyz" }; // fail second + x4 := { x1 := "abcpxyz", x2 := "abcPxyz", x3 := "abc123xy z" }; // fail third + + // match + if (match(x0, templateCharstr_tPattern)) { setverdict(pass); } + else { setverdict(fail); } + if (match(x1, templateCharstr_tPattern)) { setverdict(pass); } + else { setverdict(fail); } + + // not match + if (not match(x2, templateCharstr_tPattern)) { setverdict(pass); } + else { setverdict(fail); } + if (not match(x3, templateCharstr_tPattern)) { setverdict(pass); } + else { setverdict(fail); } + if (not match(x4, templateCharstr_tPattern)) { setverdict(pass); } + else { setverdict(fail); } +} + testcase TR920() runs on templateCharstr_mycomp { var template charstring temp := pattern "[0-9]|[0-9][0-9]"; const charstring x := "10a"; @@ -694,6 +721,7 @@ control { execute(templateCharstrEmptyPattern()); execute(templateCharstrRepeat()); execute(templateCharstrRepeatFull()); + execute(templateCharstrPattern()); execute(TR920()); execute(templateCharstrPatternCat()); execute(CatBasic()) diff --git a/regression_test/templateOmit/LegacyTests/LegacyTestcases.ttcn b/regression_test/templateOmit/LegacyTests/LegacyTestcases.ttcn index 866571726..e028108d9 100644 --- a/regression_test/templateOmit/LegacyTests/LegacyTestcases.ttcn +++ b/regression_test/templateOmit/LegacyTests/LegacyTestcases.ttcn @@ -106,6 +106,14 @@ testcase tc_ispresent_legacy() runs on CT if (ispresent(t_enum_comp_list)) { setverdict(fail, t_enum_comp_list, " should not be present"); } + + var template Everything vt_present := { 1, "a", { 1.0, '10AB'O }, { '110'B, '101'B }, { b := true }, Second }; + if (not ispresent(vt_present)) { + setverdict(fail, vt_present, " should be present"); + } + if (not ispresent(valueof(vt_present))) { + setverdict(fail, "value of ", vt_present, " should be present"); + } setverdict(pass); } diff --git a/regression_test/templateRecof/TtemplateRecof.ttcn b/regression_test/templateRecof/TtemplateRecof.ttcn index ef9d65b1b..2ef04d300 100644 --- a/regression_test/templateRecof/TtemplateRecof.ttcn +++ b/regression_test/templateRecof/TtemplateRecof.ttcn @@ -624,6 +624,17 @@ testcase tc_isbound4ROI4() runs on mycomp { f(t_il4,5); } +template integer tpard(template integer i) := i; + +testcase tc_HU56425() runs on mycomp { + template integer t_i := tpard(3); + template templateRecof_myrecof t_list := { tpard(t_i) }; + // HU56425 refers to a code generation error (which caused a C++ compilation error), but let's check the resulting template anyway + template templateRecof_myrecof t_list_exp := { 3 }; + if (log2str(t_list) == log2str(t_list_exp)) { setverdict(pass); } + else { setverdict(fail); } +} + control { execute(templateRecofSpec()); diff --git a/regression_test/unionOper/TunionOper.ttcn b/regression_test/unionOper/TunionOper.ttcn index ac552deb8..eb52058c3 100644 --- a/regression_test/unionOper/TunionOper.ttcn +++ b/regression_test/unionOper/TunionOper.ttcn @@ -1003,6 +1003,98 @@ testcase tc_sideeffect2() runs on unionOper_mycomp { if(vl_newsize == vl_oldsize) {setverdict(pass)}else {setverdict(fail)} //log(vl_u.i); } + +type set InnerSet { + integer num, + charstring str +} + +type record InnerRec { + integer num, + charstring str +} + +type union InnerUni { + InnerSet s, + InnerRec r +} + +type record Outer { + InnerUni uni1, + InnerUni uni2, + record of InnerUni unis +} + +modulepar Outer mp; + +// Test case for artf703093 : A union with an unbound alternative should itself be unbound +// All unions in the module parameter and the variable declared in the test case should +// be unbound (instead of being bound with an unbound alternative). +// Copying the record containing the unions should be possible, too, without errors. +testcase tc_union_with_unbound_alternative() runs on unionOper_mycomp { + if (isbound(mp.uni1)) { + setverdict(fail, "mp.uni1 is bound: ", mp.uni1); + } + if (isbound(mp.uni2)) { + setverdict(fail, "mp.uni2 is bound: ", mp.uni2); + } + if (isbound(mp.unis[0])) { + setverdict(fail, "mp.unis[0] is bound: ", mp.unis[0]); + } + if (isbound(mp.unis[1])) { + setverdict(fail, "mp.unis[1] is bound: ", mp.unis[1]); + } + + var Outer x := { + uni1 := { r := { num := -, str := - } }, + uni2 := { s := { num := -, str := - } }, + unis := { + { r := { num := -, str := - } }, + { s := { num := -, str := - } } + } + }; + if (isbound(x.uni1)) { + setverdict(fail, "x.uni1 is bound: ", x.uni1); + } + if (isbound(x.uni2)) { + setverdict(fail, "x.uni2 is bound: ", x.uni2); + } + if (isbound(x.unis[0])) { + setverdict(fail, "x.unis[0] is bound: ", x.unis[0]); + } + if (isbound(x.unis[1])) { + setverdict(fail, "x.unis[1] is bound: ", x.unis[1]); + } + + var Outer copy := x; + if (isbound(copy.uni1)) { + setverdict(fail, "copied x.uni1 is bound: ", copy.uni1); + } + if (isbound(copy.uni2)) { + setverdict(fail, "copied x.uni2 is bound: ", copy.uni2); + } + if (isbound(copy.unis[0])) { + setverdict(fail, "copied x.unis[0] is bound: ", copy.unis[0]); + } + if (isbound(copy.unis[1])) { + setverdict(fail, "copied x.unis[1] is bound: ", copy.unis[1]); + } + + copy := mp; + if (isbound(copy.uni1)) { + setverdict(fail, "copied mp.uni1 is bound: ", copy.uni1); + } + if (isbound(copy.uni2)) { + setverdict(fail, "copied mp.uni2 is bound: ", copy.uni2); + } + if (isbound(copy.unis[0])) { + setverdict(fail, "copied mp.unis[0] is bound: ", copy.unis[0]); + } + if (isbound(copy.unis[1])) { + setverdict(fail, "copied mp.unis[1] is bound: ", copy.unis[1]); + } + setverdict(pass); +} control { const typedefunionComp_myunion cl_1:= { x1:={ x1:=1, x2:=1.2 }}; // constant in control part @@ -1062,5 +1154,6 @@ control { execute(tc_union_modify_ispresent()); execute(tc_sideeffect1_ispresent()); execute(tc_sideeffect2_ispresent()); + execute(tc_union_with_unbound_alternative()); } } diff --git a/regression_test/unionOper/config.cfg b/regression_test/unionOper/config.cfg index 8642eee12..2a491e116 100644 --- a/regression_test/unionOper/config.cfg +++ b/regression_test/unionOper/config.cfg @@ -6,6 +6,15 @@ # http://www.eclipse.org/legal/epl-v10.html ############################################################################### [MODULE_PARAMETERS] +mp := { + uni1 := { r := { } }, + uni2 := { s := { } }, + unis := { + { r := { } }, + { s := { } } + } +}; + [LOGGING] Logfile := "unionOper.log" FileMask := LOG_ALL diff --git a/usrguide/referenceguide.doc b/usrguide/referenceguide.doc index d780c326a9c56919c5c3d74f2a10445c235dc95e..42b3db6cb419c868904b2dc8b99dd1b64d91128c 100644 GIT binary patch delta 189677 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	bbDRXX&D{N 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 SNhc8wFR!o2+`MXL=Kl-OI7}b_ delta 181977 zcmcfK2V4}_`tb4D1<SIF4N(D6uopynvBlmMd+&%{LF{!EdoQbwUF^L_$KGS?E%vBU zqsHDVvAn;tvjYoC?!E8l{%`zz*<s2#&w0+7GqbZmhHdIJ>}toUKDpc_NqT1Di}){- zB)wu;$Kuy--@ZwbTse(<qpS~E_Xv;i1W%#(r**HXo376p5a{nBWsur+Y1hSni~kmD zImx~l9J5K$vs|S5S9MkoTrIWro6M&&O45wpl2kK?B>A;hk9bi>FFkaWq}vlEDNhke z(kqg5j!hSM&Bp6PUd4af>y4d~w5ppVjVz#(a^{w#_)0oyD&_W%&`Wyu8_28p?+34x zo?=5jzQ58?FKywNaZU768`7|l0`6F*Il4IAh_oIc`8AZwEy&@LpYL{2dmdgz6yiU> zh9YrEuL~nApB-|UwP3B=_#(c)z@BCr8^rhRTd9Yod=<r&aG-cw&00ArzZZ?Q|4%E& zwob0SAV*rc>{F+_zFL5(9U+eVnog4XX3|Uj)5`u&ovNFAc&VjpwKFUj7m~E8`i@;s z8=O}|=X-5^mnJ%?0c)RU(@V2$A&8guM46S>t+cunucE8Pf1|V0<>?t;P1W!BHPuOF zSQOv;=_E&q07N8}s*6Y#k`HZ9>*0LS@?pxSmzoq!O25`xEg#zVwjQ*^JG$geTBkNd z`(E_B_>Wh5KY!ZK&2>^Iv6v@Z+a=|z)}WN@6Ti23q+1lA1)sP!#hCeiy>+;W{wtdK zyNz2*rr+Y2&Og9EG|<n_^43&1gKgQXMJF#^)?kZ&CO6w=e@hK#FWYAS?>7fn<~SFy zZ4UT;bD-s!bAWAg;P;z@EVVL(+bRmOOv>Qpti}<XhbRIKmRwEqTmHz9*|tZprBz06 z+j58{cgC>9W!7g@j|{aQ=^J3M)NPr~vMi%^Y^dF_VU~Lt%h-+$vrNmRl^JfSn@Ni% zJZZhZpJivJ((3*!C+_d>Z^@szpxQWpTWb8}JH7_D^g-5O`~xh5GUr#D<ZnxkWmrxR zTTy|Qvze<TE_-INh2bA$sgy;lF36I!KG?E3i@(}T|6nzj{-H@d<sV|n>{7(GJ>&=5 zLoHogirMN5wJdbe>I<_Rb;)O2A7*)#xIWzCmNmq-KHRb=t8M=PKg-apq3U{;S+CX^ z;4e}i<QrnJY&zkZ+u-6=r(Bgv^(s~NYTY0@GDuBHfGtk}_IU~ju#|K4RTCLt%Ts`5 zcusd)C4rWOuElMY*alI6-4G23vV3;6HH>AyY+9hfmL}PX+R6yFJWE_3V%d@{$hJPj zZhff5HM_5EeW;~+cCDN+OKkRVwHpJ%)WllK1=_kXAl!02ds*92;TG>4wxa_5EY)&U zRoAnewBFxxAcw7%K!3aS0TxfUKs5=0wj=~vre(7wAu!NlcB^39Y)e9*rEYd@bCBhg zTY1~&AT>t&&B2y-?geeZ1Y4%MYe9xscDRSAsSUJ^nIOB=28LQZJpygpL)Bt~?8aPR zn8objZ>!dpnh=X$CM~LP%O4&AnXD&6V7P5a`h_Ho*&shlxt#uLTr3aBnMd6@$TpS& zLJV@|g$_BU=d_*2LH?HCbLO!f5MXii3`krq?WwH~v~=*aod`j;RB@stj;Ej?%K=Z@ zi4<hZl|S=<mTD5<ovWnU=pgMx3ros%P>5w>u0UI$+KCqKXV<Dw%ZprXZ3Wn}<{zGv zmY^`pu-w76z{4zia%+KyTkhvBXImd`DduHcAM9so<Q1-#7wo5|F~HCM3<~zQ?Dz7q z?V+7w$@d7bczD;c?V+7x$<D&yK+9}z+w{kBw6|7!kVTiLn%c*~wsZwpre?E^|KMQD zz&y5Tg5|n-w8KIyxASNr*|HQ6n3ROzP)n)2w(btLB`F}#ZfpdHStjT8Rnr`78(RS( z_B(`Ip62zo?O+>S0U>syGsMqQI-f0^5I?z_uff|kGl%$FrsON4W;(<_*_HsyqkKNL zEdla1yJG?^mGWz)1<D7DCzTdtk@NejfrMxo3bl(gB-rvXzb!{B_ed-z#L}ujNn2$h zma~cLLoLS(<WoB<M9WQR(g+L*vv?LPZ`-b=CM;=$hlE?E6b!Qkq-7?|E;FHimJbE< zs}-|+rl74|q5hVdg>0>7Ica@>WmTafYJs8J=&>L2p@9~CVcP`5vbm5}V34J0VXeR* zv0jZj)Ov*v6Bi4=thsH01lt`KVlfr5onxW4(G$q6O5%M<Xs9K+i0vc|wWWw@Ht{46 z4YOP?VjDf7wiE^W*{2}f5>_;ytx2{VCEFp)&oZ%SVReTv+gX=<2Y<``qP7tpW;^K! zA#olF<Fe-SliD_xGZwYwBrMRf$tS;>hcIm__qW_BWScd^f-Gr@h1#}jb9u5Gi?Coz zw_*XdJ!~^nVDddeEN6<@u0CNQmK#1=-JzDsz9noih1#tTvuyIsZ)>cUE`Pf#L0GsY zO>x_0i{%@>wgMRhk;QEt&vMdwf6K1oHPnj2{q5EVSc3g3tD%Q$mpT8Wq=g4s*7`NI z9mn;rxK>Y)CCJ}4JB0_?tq-;=@GqwZ9<HUr{_Y?=#F8PvHqV4>BPqacAcTin+63fQ z=eKZeBw6ZYx6N<iVU~>nwmaN#Ei-nT$xEPZoP}${h*6*o)F1|JWMBbngT!))K(#?Z ze*Tu7fojHCwq3CU14ld$RGtUwoR=z%uIkdZ%^~?o{!st<v+Tutzd*@Z`4+B!sFT|i z)aQ`D<<@7B&lc4?k11M8zp`j4hm5m+a+qa`>K4^Ksz-0H-fcVf8q=+&gVL?0<IL>2 ziZ^f3qgadBmMvnNx9H7+SIZVN`nQ<Tg8$m*n;}o`<yfp(!ycU@quWQ-?;YE@N5^_? zdvuKIHKT-c@#0>VA8e6(MmoC7uR1t-$~!tZ#wc5&93%8*se=?P#S(6Bsgo4NYn0Rt z-O+<}V*LOqhVPscm%P|NN{X}|*PcDZ{yn6Q))Ks=LNwc#f1O#^!TPnc^~l2P8O<6m zsSdBbq-xgk&B?#5$pO9Cy=1cLdQpK0C1phcQc|I!y58*95u!N}d>=(w<#=r`HIVvQ zD;44SOFnED$5M;@Ta;q~d2v_AtYcPoa#U7!O4Br>cr!MAd;c_5v!pB5!MSpDY@|GG zS(>cM-SKI1<(9*qI+?exNi#X4JY{E^0y-~w`_44&m3+I>)JUtmIFRP1PA)Pz&0Qtv z*EFZo%6sHAnU%a}(%jN{(=rjiNNBY6tD5ePtnbVE9+HyzT$+=0$C!Q6DrTQ_{oW`$ zz0x=IC=%79Pxq>ABfHj#jgE<m?LEM&P_as0k<r~_I(LhT^@@(^-8s5P;dI5)6|1B; zmP(&9jS^KZeZB-URfv=%^=k*I58p>peP;qtw}=FZ#Ku~;6|-&=J?}-z`q%|4`ajk- zQo2iRt>uWl#2Dy78J*c*?9n!{baO8@7h+|9c8X#EsnysI8!;G)bFkXC>d?>zn>bn< znBw?Yj&EygP-+9Tm$hF-d4#59EM?H^%)O(%+C_Oq_3YERZ`*FxlPub+cc-Y%v0i<8 z#76bvyou}`)!r*MI-2uuKulCGU$2UtJ9LPO75lQePh{^tvFu>o=G8Vf%Byn^k^8p2 zJGbi=<wfyPZ6iB*MN?+1uUCV9(d-l3c7V3O+_a1#gOaU`A(ufs<7lYpsv7p`9EOMW zQw~)#)J@ZrC8=S0U2c8);SOCM>m(^{dYx;hcVz}j**b}Be$~r}?XK4C-PP^t7S?8T z=pvqBBz~XMwNs=iSp8n^7GdzN@LfTfQWh?`sfDCmPw{E31uN$w4B<NScO|JIHRoX- zAt#2QHslshaemy8@9S5~X{#QQSWe2Onblw<$-a$JM0E$LE?QNWq_)+0fS5I9GwM_) zz|@<lhI@}^K|c;x@|nh?(CH>gNmow{r&O{~jc01#XW>-Z)QVNx9HDMcY_l57g*2%h zmB}?{ijk2l8}iid29J{8MW`h%Wk%H)8mhIaJ)KbBkX>g^HY9f$Qj11CzO=eMMH>$A zyzj>eO}#7B@+zd4r#3XCYitW5Wzbq<a-{6%i0Ww=2{h*W0cJm9l;;f%{<@#OOOjf7 zQTqD(Zror@*%-N1V?*|qsf4KZ;?GVg57JI$tqK1esI@Z<iE%3L8ynnoxs!Fx{0u3p zkbRpPvb)%JvQLrRq^ZHPcw%W<DE~$X|LJ(j@0^rEC84PyW2)zjbLONylcvC_d_wW# zk@J19YNxrVM<kBGltbqKf9BxyOntbj-8_rWB7PjM<g<hZF3l{-=~@_`cTCoELtRok zN^O!(-JaMaMsV`J6QjLO^|b1Ux1aOm7A*~K|C5eRmnEtD<b;-n7pcvSFI<y$OzP)Y zb#2OqC0^>@@lk^PshF}?y;2?-AzwJ{<WeE=`uA^L8-Ccs^1jxF?1hsjoVdOpf9jbm ze{F5}q@8s3JtaG}HF&3%l|Qp5Z=X7xI;d+?w(W<tr#>{*LG*~rVcPUHlP=9EQ>aZu z_VeREXH9wE*5K-pT9eN6Nuzz2sZDC2uKhui)G)8OB|pl3G+XB>G0r8mtY+4I1AcUa z^nLHxH_JMk7W}SDf1DBJYZRBkYRS&n@}AZxQ*FgBIa6<i+^XaM=Q&yWyNK1Co%Bdv z+mG8Jf9+^^mRe_R<-^qPJ1az8`-5hFpI<eUow<^ilQI<h**AG>lFecEo%PRSFlkJr zegdeYrIZNGIoa*B{Jyi{O=>Aw>7BeO_UE#-)?^WXKLOdz$*shlNNOWl?$p)b{9l@* z)lOLNl{|9o%(m|gC84XqBgM^K4n7h8@zqN$cV6D)<*IqjrLO(A21&|(m1lG}WUrBY zASBNDi}NI}&OUr`<<OdCpIGI6cY{l+_ZZ^}Brj2IfJt5ZZ#6(o#FYHW%SjoT{V4x0 zT!FOvGd0{SYUMu&SMtfp?CR;xyOS7$DaDkPP{<nd4-Qk?G(_E=c#~nDRk=ma|IaDw zKfPZZQ7|d9N<z<nxL@qbC;#8iSkL(}j~@@=)Ml)n>Jf?U{-5^c+rp`ZEBSn8R{!Eb zU-tg4FK-k}?J%`3TdUg>+myU7`}~jkGRh~Zhm?dq^ku_j7ts@b|J;gN>h{D|sKftU z@svl&t@;_V7qu0gvir12!hYtF<NFz0%O#(6{^hOxW#5$bD)0Llil+MJv1DLU>yz$t z_XVUZMQ$^|kX?I|oicj0$w&NC9;D3(TI;?a+^Js;?K7cWTb1_%3@)kO$rTRyQB&3h zrxuku2#c%RQ*_@JegZ1B6ZF6TI3rlC%^HJ}Fyy-{-rTU%qEXx6scuivhWOCbj{4XA z&@Saeyu4~*iB+T=0$LaUsM~)0pi6mgHn^sG4K$Xt2A^1;I>aWINUcd~A~LJn6Oa1W zQJQJ!zw<oqhwr(x@vR0oBRsX>zRP#9F5EP9MK{F|XK+e!4IErLwSv@Ee&Yw#?5`=w z=gkrSqj@upT@-S{2*drP=RWeok*U9jeD+iF=+)%KsB3?4-Ty9mlA47#Ws;YZvakP7 z?{504mH!}Isc0_lPjlzvia7eaD`Kni|J<{8$|Y}8@}3>@U+Y;lgMXDxUYm9f+h<Zq z81oNzH)ks*FG20gdg|IABqz1Lyi_51Irb5VtJ42zUp7%I|3SEtPeE?F3l*R*$N$4~ z^u1M*N3Uj~th)9G#j4pqT=_>wRaV#j;HdwL=jg{PCB>j5OyD82c8OQp;L9fzKfVmA zZP;8b>G-6(hah$B589CW<z6jMshVOyr5p&_5dD52*<W~+=aaaGCcll#S?iyhvZ&^d znvzFdYu6OH)s+9iZCs%mDWg^1Pcb+<1SY>7OnehMDI$6FWFv7;ImBY{wws*WSpL<W zT(;UNYuB!HspmiSuC?zO?OLn6w-`KAT=u@!O|4dSa12+sCtlo>PmVMH%ah}nI>|Gt zwcLJ0DhV_HVRDRakh}!-lzLr1wN`#Vrqy=$QIAM$w|xZv=ab{ddZ~pg`FQirDUS~y z70fm~PW~a!?M5k&k~7UQWDmBz`}xnFLdh-W{MY*SN4+R=sAjrz!=xTl66P2(r<g;| zG)>to?YvNrud8lP>?yU!FE&Yel-y>XA$#6b-U`~EE-5}wllO64{=^eot6Xc8{Qy!D z<{66Vv<LjjK2<BRz~E^=9V{?puaxW^@3Cen1J-J?ufe+R`;T(}{pZyS48|1s-P9_z ziq-rEs@qfKcYDi}N6D=g{SW5oJuOn!tGr+I4{x=-+gkTe5&g0@DNB*tEdEy$^qSTw z57K(*M`J<lssD6>UTg?VaW^nMGPPRO?r~MOr)c2pcBvip&!b6PDy$D)|I>$a9%_Zw zFvcV-H7E&7of^eubiAaKqH!CMmv!=Ry_1I=zue?3-z>rxu{6u<Tu$EjHG{J}EWuDv zKKGRMpWB(-<?j2Pon@azPR?@azcU2M3;r;rQ>GU*p3s-qN?lE<Yw(Ay2A|71sTkTJ z;}xBh3E7bY-pB(V^tvK%C}MQWv}B6*Z}c$!_2PGWa?1f3ojm1f`HdcOLJ?zSxqVUN zygCJmUFwKq5T%MzO7c5wVb}OQw(B}c|GQ3_gwi*3QrcTOsW2A(p_8uR0bU~GZJp$c za<_Hz!OKp;a(u4L&hkPZ<7(OKox$0%z|l#r5n}X_hZHl8F!!Q{!5D%#Ou$4;!W2x! zVl06ZQ5caEo(MuPLh%P~;}u>*PqYq5gWT|fKLQYr5~zG#XO^n45P>?Vhm*L8TX={^ zc!&4+if_=7f++Mue~iO;OvC}4#|1pYbG(F+l;wmc!tm<GnSE#WmD#fI%#G#qUM&~@ zlE0|yQu!)n$=0ds&`q-p&e`Q?SEtPKsS-}}%%w%a;V6mBH)%1<SdVQ`updWo0(bBj zqA#706|TsJT*wWrkC)T8E3g}TuowGq6{7#E+;-PVRq6Ohw8sz(#dyfu{fq@H(;aik zx2`%Fl>2^0cU{)}3=s}fkE+9KV}^`ZfU%Gqf7HoYsTyG1p>tuK)EuqQ4wNpx%9k-% z-Z#zQs>JlooL(n>II)LyOl5P_D(}v&vFL-6a`AfxH^n!^ctPhPR`kbU*dmm@e|0LP zlngWeqVo^|kH%$O$1U8&pK7%cDXOh$t=61Yv~dEKVL7&8J9c3=I9$4iS9lHM9i3!C zPI$r_c~A+JF#y96hY^^KIoN`Smv&!zxc1@v5%V8j>TF$7hL$qM=`w4TJfnheb}TJt z4l#CB2A468)MYNsin6E(Yb|o-Fyl{3owCMFIyX^e6SPDdM4}_#-cNF|#!?UE- z0-V9#U!j*Xml1VVq)xMlb}J6!2#(=6jCW~0s-Z6Gp+2U=g0r}c-|;8z;XWSVF`nQh z-r^nZU)a5NH~ENx_{wW!v$|Ckb7kXjU1mLdq=gf#HOraHik4RuEf-<rfG50B908~& zcKXMbYe9En@9v1PwY;Xtb_^?ep)ahhvej8z)G3;{66>%DKSRO2e^IAPTKhzN<A@@E zDp~3opYx=XZ^Vjvf9j;p@VZZPP!0QW2#4`2j^W!QM!^%NRV>9G?8RxE!FgQ3MchEq z=L`ybc=_n%{p)9s>^!pb?8|jC<2uF7Y%+6QO~u@ROq+{Pa~E{Q3b@{5DnU6c#uD6u z7F|^$5fM(qalFJUgg;<{#v)wASCsrqCzV1=w89V!#Udo|BcJ@I%xPq7!Vi`YH|COC z?{;$P<S91B;}&u~<o8*z6(wkXNyOqSL^|C0SyK-*z(#Ds6FfyhQcwsYWm-!9X4&H@ zSD~jmWm+R+8lCJnArlw;6Gmrw!B9?^+s`tjk?V}elvO_3)L6pIeo`$A#}Pb7zGs|g zuwVu*L!`O_TB0AOVhgt79V)#b0qBjXSdW`<dC3`%NX*6|JVGkTF?)*s6oqX>{a0La zk$}(ee@(-%9-D9<&+q~t(CG~W9t*Jszu+`FzGd8F4YuGC?x4v#CKhbQejIt{rIUVR zA;Wv_7?26skpsRc{$5$w!q`sNS~TGap2CsH+~9$n2tyszgVus6EbqWhT!+@8vP9=Z zBq9P)si?60d!0<z-IB|G$>J<$x<aSzIbm>?hqgAxnTxZ7AN<uFrOLckK|Rz*GhF_l zldj+;UP1Sf84&4VKr#5D3aX+BnxZw@;KlV52Y2&tgFLd!NV%EJYgzFs2D7;hr&J^% zT5CGPYbk12juRXi_=(;|CDcK4v_)6+f*GSR8}qRg5AYXSC+MUsf75wb^tVp#+0Eo( zZT&3ojP7#T#l|VK)@E^+&s{dU%To?=>w3i`ZrhyY)se==W)b%c%)|z4#C{yWQT&SI zNExMwY!qZH#uA9AL_}UhR1#%T1y#`!t<W9AFb3}vbPm#&1SPJ$aj4Gxg*BOJgFB{U zK5T80x_)Nz#W>7B`Y*H@gRu=?zH;Ux-8Y5;GQ$%!&;X+`2Ju*o&Der%`26wnlh1#B zRLmXdp^juw`iM^`L{0tBA1>6A6?u^ly|D?K@de@3UIJ~<76UO1%W)ik;vQ^~s=Z{r zm(KKsHw!o48lCATXF28)?<CGK>nP_s8U1vPMXN+hy7T8C24SpDFZI#uB`*iPG#8Z| z^-?>OOQV;nr`1b0@Dcse>7_V)L8<h5X%1H78$1m9r1}+e7ctq3Ol-$vyg>wYHG!zN z5BfsXKOE!n8Xu8>FVGQJTI4|?_@Foz6YFZM#dhq#ZtTS`_!VdM`Wn)C7B1lmZsRVV zAPbFife(tIG|HenDnKNl25O=inmZ~dx*0=s=H`4OGIJWg;Sz4(7Vh9rJi$wRL_IRt z6s^!6L&)MNjKO$Jfs6w<hSRtJk?}jYi<fu>dZ35YfYdieQ?x|~^nlhiqgbAd<G29P zRq5#-1G2yc1yKkA2!wrC?&kXwIEfGPs~$$zS<yyEIc>Bt!7SFj#4CJ-=yn%_UUCQB zFBOF^qR<u5h(&J<$0?jeAt(05aKvFMmSI1B$6qLJ;?IDfGODA7NncWmVxa?ip*O~2 zAvRzmw&7PC!!x|W2PBx3T`|VWy2c{P;t&xHpq87q+WzKMZ`4b9ksp;&1;Y`C1z3h( z@GD+Ji;zGV_!&H8=e4{eF~>6STZ-ToVLLv<kbz90G$POlJuwkeFcmAX62IUwuD~&) zUJ6DX)JFq6mvw8M+;~>tEK}Jz`9Q3(AX9H<aX({_XY?_4Gbd1GYiDwWahQg+*owz^ zh4+xCLWFh6R-FUIiz+8#Hr8Mpw&MgY;R>$eJ`$kkucA03EAqi7lfI}F#6n3lK~pqC zbF@QyM4<y>GAV2N8XM`Vh=z4VH)yp#VA++Os^AG$W#Qy>(Mz>36f-and$At}T=a6? z^TuFhaDVa6B8Ed^(F?s{#&E=81SVk$reYfAVm=mNAy#5F)?h6*V;6Q~5BB32j^hM= z!|%9(o0<3(!9Q8}2#3s^o*0T@7>|jViCI{HRoH^vIF7S8himYl-T5&9!?6jQu?+_h zLfgwh<Yib^8i+TyW&I!?+_()g{uM!Dq~~y8gA)p%5XzxG8lnZXgU7La8eie*%KU&S z{Nb88_$8ZOZu^JRRN2qM<>cvLV^*D6R49&_hs9Weeb|pv5M|xLLp;J4I8$Z@<V11! zAsE#Vfu86KGbX`;*+@?euJC{th|6dVYyf{TXJmF|{7_?GU2~$8ZsH!&vLQVT2u3Y5 zKtG6scEUA>Udn|Ih{G)0z;JiHGy(D0hCS|j+53@kf&4j+>#OMlU!1w~k#i3>-Z77) zpi!8LX;_Fw*oaNAugH(W!w`;IXo$vWf+&bU24Xm-VLE2wG=9SsTt~1Q<zSkdKBF{) zg*W($#_r1GIAg5N+?cSNLNw#02j@N<bLyou$O%v6MLv{7DU?PTv_>0DhXoBiDHvVQ z6{9f*o3I&MuoVTp^pZa+c<DW)nk>{pTXaD;bjLt1W$s902c4OuN|$jJ*YF-6P=rXM z&;c{C1RJpjdm&mPS|M5>q8E{is71sg+B5i!^hA^uUhqaEh*qTfu19PX%@a)%%@R$z zf-fkVizyCG&>k^}!w&4kX*@-?+<GYo+)y4B&>1pj<0vlR7G6Q5Obtkx-N@L~?k#Ey zPc5B;*k>*_;XO8c>!lZHo0oWD#th8E4(!5J81r#QgPs_IahQqI`8bzXabq99n>VEE z=Q}$qQ^y-)bmoB+E-IUXIarM~*oeRI46pDORSBRLh9VB{;FgCTL1FkI6yq@yM{yc| z;tl>rT7oQ!5-6XSsk0gjT_9RD6ryDoh}O-8XrThp%AF7`y#mo%Ct4<2ToIzxF%T^u z4AJ_r5E+;OTNb1@53W2oeT6U9f6CX1Mt*IP^hjrL7YT6B&sak){DiXTg$>w<n|O@( z&=+93MG2Hd1iE4l=HUPyAZtO&K}|G47o<8awSdAoP!w7lqTntNh0lhlU@k-@`ynd2 z4^dgB!pxf}hERl|CK{m$nxX>+Ar8|q6RWYYu$dEqh3$BW_lPONeLON1WeUYpyhkY? zuG$y}3n~<2j9@GR{n?J%XoSY-ieBi0z8HZ|uap0~t9+SibkMaH8H&fx_zk*3WEzg} zK{3?FaKvE~_TU(<LrX$O;va!o_=ru!J*1dkyxBi5E^g<{d}ob#KCeIH2rl9t-on9` z`3Hqi7!}bOQ?MPkkiIyB5q_wIW@wIRjKyrM!VVmRt?$L7DtSmZQ%3Qg`<(a^C*Qu} z<kej4a}~ei8zeu*B+8=`ra-|R+=GEk=7N^>kt{F9HvEMQfgFckfqHrKYvYkwE`0jb z`aGAkmd|<0QRjxiU2Y>A<ISQ=W+NV(uo*w&7|!DoZsRT9!83r#7UM7(*{CGDT9LFj zjJs$Y!%3XNZ@7qC*j<8~ApDMpcvOOG{1+CSO6nz3NoD+OuJL9<md0Qa_TvEVB6ARf z4^`0@qc8(Yu?^4g9Qt4;Duf{%%`grJa1bx>749M2FQ7jjB9+s#iKp237*CNklxq=& zVi<NI9Zd^E2lT~gh*XFs7YR>lwg;^&gL+t9l76}Ev_?FBa+j^|>aDjP*1L|UZ|S0l z1;)*06T3RY9pdofC=F3WdqklFdZHJ4V+6)w0w!V-reZoQn1KaYgm^5*O6<ll{D#ZO zRf-9lKg}V9pfq;i7o5Wd<S5NhKmqt5219Tf*I_8b@IW;BV+clI5!T@>8dTstz>Twq zwjNqNi!UiCUl%fAN0TfmK~!!#=uckXBIi$xN0dY<bVYxR!gOrM3%tZDq$$hDKw*?X zeRM-KW<kc<vU+9sMWc^yR-`dVKD*fHZ)TNr2p91LpYaV+IXVQTPz^n>1WU0DJ8%*= z@C48C0><*p8}LU}^uj_c#uA*zEu=Ca+jxqNPw){rNuWq#CtQSoMJ6QlM06!Op)zj; zQ2-&Rj^-Eu3zkB`F+6}&MK9ku!bi7EmF~)hWyX3svsV5<%AbVESb}X(umczH5HIi& zX{kRQ{2*eAL}$cdCa&Nn-ry7dhLLzfP#ODh1jL?Q8dQbLJf>m>mS9B{W!4H~7hN<F zO9qt3K!_cuVJY_EJRah2I9Fv_M+r1SCv-(O%)?4-#eST`75t5`YFy9|UrjF__*dq0 zM{(YsUCr=VLAiS&>N*Ee-(L`QK0yLR-6qNr^%sPQAsiwO5yKj+#UUKV8JvZvw*o36 z0(D@ELt4S|j%s9QFAMu{4cGA(9#&Iktsy(DiP*a5LtfKW=d4D1_}4@&&K*Rc1G-~0 zmS7o{<2X*>E%ManEd@f+1|4hb<(OjJXFBKRK6A)6^@(IbW%oK`C7oH+_!()bEgN#c z6AjTEt<es5@Dycg&{oXHV*G_CI8UUP?V@#!pd1uO2tv^S4bcvL(Jz9hN&{FJjG>6b zNQ}osSTGawA^!U5ayZsuia?J#%B~IcackNq4a0ma#Bsca7C|Hj{ed?q#(~Z1@hq-B z=Op~l9#I&Bu~2Xr*O8$C=h<{)XL-SRa@VahlZ{g#kAC?0sE_#gD6KrjEpr<A+)9(9 zJa@CPgSiJ4^u%X4)TIDqMlTG+D2%}=g7^(raTg+(bWONOqcFk{j#_AeR%nfGn2Uut zi3_-l+o;!6-&|_cls;^xmvSQ?d{F`?TT&tJ<0+oOsTF54a=-@x2thb%pdKc{0=boP zeT%Vx&P+<AjL3@;sE(!>h(VZz)!2_iIE>f$3a5q~ho)$TIPAqf+{1ljZNz&;_#g}w z(Hg1Dvz<J}Mj5lQ4o7hr_u<r-7NQ7Bqdpp;F-BuL7Ge#y<1Dmp=uS!}U=i*%vCb&s zBSZ^hAYL)HiDsR2h-~}WGF+S2E?9s?h{qP3z#Y8D2bh}EI|xA-!qEx6F$}A*2Dfns zcj43`<@K&3tE7BrfmUdZ7>tCBby$z1xQ3T_gSW^_=lh{Fs-rR5V-hAq8!T?Etj+eZ zHrt)YoSEd-I+LrsZ-FtNJh7KCy;*W&AE_j6qI+vD?U;zA*os5Ahx?G)aH&9H_@EeC zpc8sy5+>sp9L04!$5%MFC0%$e?#{LU<S9pt?z1+EDeWL%&RsO#<c^@6dPg7=(Oig# z3b$hrpbUOOZA73ITBAF9U^eDp3%24Ye#H&k#2dWDdwf9tNG{sw5yizC6EG9AqVy5c z8Ww)Wb|^T4tGI^WaSOL`4-fDZ&+!f)@D)-AMkKa&P|oZ#2I$Np2jQrPC=9|-n6Ux7 za1=Li6IqGU71<y%AX+b4E?O;GELtmCDq1O8C|W04CR!DUvZ#er&cAM+Vq<$mVIdYF z9_MfmZ{gUUjz?*9L?@Ur9V@XH2XGKCk&Tw;K`6ptORw#!E*^f$XC0i=^XIZN$;19O zWsncNGkSD!7d`L`%8{^!h()H(+&19?9w1j2PCxjeEE=K<x?&hCScCQ0fSY)P_sHFq zxe2f3mvK&R@{m1z{u*;XgS+~n^hQ3JR?Z#aBR=z1D&B$e9eIzB#%P8&_=5DEIHwUu zK;tkOvmt`??as|AN}~#@A_8^L5XW&Ax*n8+p6G`Gh{KE?`r^`j78YPLc49a7;5h0= z6A&`QaH9>67-hpzaR(`y))-AN4EwMj=kNq+y73+d9`HpuG(mH;zy!!xijCNfV|azv z5G@leIFBL(A|kd8D{(?A3mO@V+3wkRujMY^K5q2ts5R>(J4-~J3jt_~N<F#0^y0k? z?%)ladh>n<p(ug!=!CJDfQg95R-DA2Na$_5MdG8{+6o`l(uE#m#v6H27`_NXNmRyI zOvZU!!FAk5abgO_SWLuR%)`&vhF@?Lzv392V!1<rE8I~OezDvbO=V#o-r^hdG%h`i z$P9PnhG_iY0aS>&SUy16b&4A!Gp&-oAWa`Kfzl|0dWgah%)~kz#!;NX-*D;6Nr>#o zfof=n;aG@OxCW<w%*@D*VAMw{Gesv)v9S|kF%f(4969<krjQej&>Iu54JU9KXONcG z<wHrd#{g(8zs$0JAouJ8xl-=pouSN!?WtU{mb32)?7}bj6~}N1%_*ZTCcpyIAf`}M zLtR9n1I!qPshEc8uwX0pA>CkZlaLc(LpXnKp1%2H-{yUrl_3|5BXk{!Q!0f>c(MOu zh<$w#j5?@?`sj)Q7=$U9ifLGdgSdpNxQ5#>P+u^pR~~-E82sG@(p_GE$ymRmh^ss% zVh2v)4GIjSjNuFd<VOI0LQOPB7xc#<#9<ZA;0@m6159z8Iw%pBbZV6oKLv49jz4K^ zW7g_!Kz%LI3b7c3AsC7Yc!F2xJd}$xqR|U|FaU!v93wCe6EF>x%-qAGChDL*T3|i4 zoAsVj4H_ANx~PY)cyaf)eVgJp?UUoL8nelpt{NSc?N^P}b<M=aZWxRq7z#5+VKSy- z8rEPfc4H6rVjup7o~($Bjv2weSc-KclxEkBD|8)6lT;U-V8%?$#vI&2es-=6?cm>8 z&Nz~xgDUVC#pE!WH#W!zf0RZ|G($_YA8q~caD;jf%jv-nxnJf=%A1+y$=}SRk@wy- zRxq!llJz)<6F7y_xDFA(3%tiq1W*ZI;6@<RF%Ju{5DIqS7>?rvPU1W+!FFyen`!$u zv}@h2L(2_S%(wV7zmeGE3a;W6UPDiF9N>sF5Y4VUh8{;tv_(4%#t@9h1T4fNEFPmY zx@}yeYfVn1@z{Wi_=L~U3KIw2#(Q{<Wp*D&v+)T*<Jk`_5QAPAh<F^v(eeM`o5#ge zvI48H5u33CyKoSPaT2F-30Lt4TnWqrMc|93Xp2a+#}Ev~WK6+SOv5ZJ!eT5L%MT9h zW?>Ib;WW<REE>?-7HEqum^n^abB`Y!Fwf+h1-OpexPyBT=@~SU)M7d;n2!ZmiB(vK z_1FTxNxUCI7)s(NR77P&pe;J13x;Ae#!k{#k;btw3+u5Tj+2>s;D+4DivqA<9&X?s z9H+1!iXw1|a`b_*gsv+cCjE+I&`)6AM-h}kIaEatOu%GJ!Bkwu8@xptT9X|GP#DG0 z0R15{B3etU#GPz-((|b-+{tE6e3p<_zHKn2?<zT7;%0e=^EOFx*AgMq#+!JBLbPM( zRBjGnn8px*4=ST7A}|DI48v3`!dhI$b>x^%&rVO}0nuaefGCg*RYW6<z)Z}+AIM0} zuE-8|<U(GwM+bC5cl5*{On?O<S}lU7EWf}@7>LFR*&!keny!zMs<JQw<1h(Ru?PF{ z5r5+g94y@I!xe>46lG8m)lmy`Fdu8M5nqsb26wG5UmCM12~Uk_b<w0liotXQ&mvIV z#wTQwxk{rjisC1fML9G;PfW%dtix9PhBwGMn}#6=0#O|;XQy(7wmsAqvALlb+MzdQ zLB>36z;2wzdAQBwP6ZLDiw0<dmY9Xvn2SYNiuJgPJ19f@%3%SPWA!YOznKNmc+sG{ zm_*Rmk!CLMAK-;TD2&pmges_thUkxp_!Xyc1vjCa$1M`dK_uT*{`S(CR^f|I7fDv6 z7{p;DCSWa2;yGTS+#K#*PywwGi&2Qj60E`nT!a>EBPx!^&vWgb=D5o|J{LEN>BO^* zH1dW=JmA>-##o^vyGgepE#$C8<N*6{4tMbe?_i8)E<rw&Kvh&nU5v(lyg{MGOeYA& za4f*)#nu5(DA_IAIrV4Mt#2>m-*K}fvQ!N{F#ubz3&(LDFX1?!J8^iU3YuaN24fhe zBOY6@9iQQ|fSWr6ArvK17Q-<DqcDDfzM(Xkh1uAMgE)*+$VX}l!UsX9gZh|@B@iiF zo1*DeXm(x5x8ED{$S>a;O|t%j@vB*^tA`GVK`eS<7(}{eVm9VtK91l7PT~yy!~^7C z!mNu{Xpc_lif)L8jJbG@EX#S$0N>^O08e=qs-OnyFIOgi<Og^<(m~Qg>}2nIwxhh4 zaufnk4z<u917N`nEXOt+!ZSR_S2!=@EJa0BLIXrCOBw{q`~+irT{Nqtz8H;h_!)me z1RRJ4=z|%Mu?#zK9A|L@FQHq(d4{YAK@$wX5STFxQ&#XJl#NWm^0y_X+H!n))ApIe z__fD~#(WNayNXL%Ir<kq3P13-(ZlRfpEBE^JvyNqV$d5}JO;`vfk9}tl1@ZF^v8Hi z#!~!@ZP<goID~W1ts-UDtpAQ~J^JkE`uM3M`gLj3r9l^E=vRJ?ss;f|^RXH`u^abr zA9*N1t5j4t1){RU2&CYx$hd|ZIt*Q_mtTE025%c?8m2RgYO}%{e(*;C#8LfMt4HPF zs5)qlUg(1X7=e+Ph-rw&GOWaUY{xF_$2*AH)2`)Whx{nKR$ox^VZj#xD1mYqguxgB z!j&ejRaWRt&2;98d@~)hAY%^ZV+mGZH8x@=cHtn7;1=#8(>i8+lt&lDpeK5xABJNh zreG?jVICG@^*Zhqudr|xkMJ6%^<4Xr4-YmlTCrfGUMjmuS>tGGr0Xie*Gdrw8re}C zBo6RHKlI0Rti)TqLvad<Mhqrk9rocmeuoE@G(&Ur#e|KVO$o*pa(r6T2YFvQQ~9o} zvc|HI*Za_KqC4RUANV2|^$>?$IFHwOi+3oonM7eb#Q%=b2gNWH8*v!Dx9XLHm0fa+ z8#^8imRiXfWc~f(v!zXGzrV%vYF3tl>tY%d?7&WhP*^vN!Ul*6c3>xL6-gtuGUl)v zYp@nKa1XDyD$SfsD|GdV$hx7;&rGQJ1$XckIkqt@a00*KG5&^eJJ)uUL_@Sf2Xsc4 z?Rt5tkI_TvVKPnERew$KZ(yQ0XLuqPa>EPNQ4d=6BUzq^Nmz{4Sc`Q(E7dcYw(HF6 z_~r;ioY!z0FYyLFiLEy-K*ak9BIX2$xSfbk#O@3c|12!PLaf9ptj7lIfSbaIMR9~7 zT+u7$Os3(w#<bFUwEbR_cQ8BcWZ1#5i)jHtXo_YShgn#PWjKelyP17a5QTR0vm~oB z6;jMusKQKTQW;c1Ra8R_)I>|P!gG8;HmdeUHPl7}v_>ojVI(GE307hiR$~ng;|MO| z5?<YTb?4HZS8~5RrVPrYtfpQ%vsir@S8x^AaTkB$9`55Sz9A#6&xFj#0vEU<AM&FB z3Zg8^p)Ts7J{q7Q8lw%`qTNn?Iw_Kc!8?`F*-Qg<=D~b31d}isQ!o|NV8KExLOd2@ z7k1+$PT@4p;4HMh()yzY{m>82duWyTmDG64NK5?g3tiOZMim-WP|P{#p4Rl1R2|w8 zGRuc>7?1E6q7+v|?PXTL0epbVJ}xBigFiZ89_C{QcJAZn+^+EV2M(0s!OQ0YJc60h znwi3{8ed)}@bNNpMnT!n!*tH9)!|J&g-{s22u27(5snh5ftsj~#%PNubVV!%U?|35 zBBo(Je!+2E!gZ9V4Yg2jFF&@>l!XBpiBTAhF?*F+IZa)3<;U<%JQia!wqPrM#x`gf z(Xw!Z*8hd{2N*qYIiQr!W!k4}O-dwf<4ZOK9OCIHx?vio;}~w?4`evZJOf{pL2a}` zYfQvp+(X_Yq~?fzR#$!)pP#E!e_Kxe>}3j)UwE0yi7)Q5pErqiq1GJ8gS^Ox0w{<u zgrf-}F#%Jt5UX(j$8ZMM;CPTJ0!}c(g#0Lg5QM^Z9v;}b%=%9;=Ml4l*b;_tlt3v| zL?u*46|_NH^h7Lrp*Q-VA4X#g#$p_nU@5lZXKcfEDA<WZIE*6)ITe3l;nqQAbUseS zMz{Fp54^xjyuxd|!8=IwgbsQ*ASXOg48AB1KlnrI&6bCiMg>f3bmo?HkLa!m5M6c% zqTBw2=(;>~o#?)BwF{+Aymm%^48Tcz#PeV1{-eyph(a`C&<D@1{j%km-M?#F7EOuk z)rvpv#BXmFBH<kw9M)1riQ_N_tFaTuaRORRZq!r(710r$uoC;QA0m>k$Ux1x;EOUK zI&r=i66d@1w02j{6*2kgT5Dmq|CLL|F)mDagvW3=&NxCbR7VGl#3=lRi+GL~$Z>)Z zg0>irF&KL)>AAc5+lTUtc4Ag3rVe|in@E=U)?I$#!^C6#b&8?IOmSwBIWvY~I7VP3 zW?~lJ;u{<ZI|J&W1^Qzch9eI1Fdyr%9viR`o3I%N@#4;lOE2zdXTh>LanTJGv#&T6 z#MVPNj3c;-TX>Eac!^hdjW_s$ulNRu1iHZ;MNkwzC<b2?M-YM$f>6{!U9?5JW84Y& z5k)hWq)4<!6gnUlz0ezdFd0*@2=Q2qC0GirTeWVn&^5C$=Y-NMfEzUP9KKnIrC5gL zScz5GiCuV$1XMoBMHJ_76YWoNLx%ZShLu=_)i{L1_zf44V!mP4nLDL_R1L)(B$6%m zxP;5Nf@^q)M|g}Ua6HYE6u2TAvLgrF;DLN7h(aig@~D9NXn=-jgvMx!)@X;w(<D2D zD5|q0wZ{+)#bivuR7}HkSTG+K@eS+Ga?^r{^IY;#_5$}w7nJH@+)Z}mBuG49Ej#bW zZx9DdXJ`VvP!W|;1<{DX20X<x<fH<BR7P{epeNRW0L0skU}b&@6K~u_JlF6NpOEVu zRlpmyP#c{w0&8#{ACa5by&&4r9s@B2%drchZTIjA2`EH6X{+t+hTj0rW!_}?o2#+D zI+~&xTA(F*AQ~~~`WugBQSl=6p&tfgJZ2&utFZ;UZ~~X$c!}#8G9V)|;jc>vHy^z8 z*WwwYX7uHsVlG2ZHWs}gYI@006)w|q48|hF;~0+PBhp=AJfS=WU?ApUK91uAJ|X>8 z+l+SVs)^t9EGx#Xh@dcvpae>y6iTBE%AyLYq84f+0-ewq127PSFc?E%#$-&xbXf50 zw`Y6S?V*u<J1pMwtfuXo@`|~<h(heK4(qWO`>-Dea1e)a3g>YFzu_sK;S0Xv8zi!! zg99=k3tW&D#gG_9AA)FZ3!?5~#axjnDvLdQQ3gMuEXtugwESy%cDu?I1OC^zz@i;G zqsuj=a%IylU2BppWk(KZJ4dlR71OW{+wmvv!G(kKKr8Uhbvoq+vnraRJBDL9R@_Ls z9@duq`fxMGy)J)j%l=OIT$e5s7mdE?hyECdL70e1xP)u?1c@rUqAw<64z^(zuHp~8 z!xu=ulWFMT@w?n3k14w{yt>KEkA1KvCwx#0z9<eq1fU$sqXH_TC0d~eq7j3hh(&J< z!7vO*9OglL>(QIH9?fiTL&UQ6wxp&QQDU$8Scmo4fQ{IME!d8o*oED=h)cMS2lxvQ z@d%Ic9v|@u32>ns{xOQ$L{U%dl@<Ar9|celg-{rxgNvd#0uYEGR7VZeL@m@t1nS&S z>eVrA(3$N=MdzC&3Da*eGO+m%P9ki+&67dw#UY%=8Jxv=T)>~W2ZuYHFbF|OR6_%_ zMi=zLAPmNkJ9-ys0t>Tn2*2XQ9c6kwQx9D<V^cbSgLn)#BFhhdbVMg;5nEXP1xN81 zPvAle%A+=#VJfCUYuzrEpW!)7e^?(sM)0(?p!)2UX`BbJHTk^~9>tbReE8}jKP+v^ z(U|=uX9OV<(HI0RV;gA5hr0~yKj{uMMKg@SSSUD(OSlZjdrX%1_^s{brii4IPdU)Y zR90s`L18Cx3it5<@9_a2@d*j|3`Z(Whx9NY5Aq@qK?p_&LJ^LtsD|pOf%bTJ>*VH> zw-(=eH)B*EmKAdoaUO^*QRsud=!gCofI%3EF&K++Sc0Y4il4C!+o515j^HSM#WCE$ zkIsWS+S%BQD9Vey?&3Ax;4R+aJ+x$N34Kjcz3y|)Jm6eGA^1N~%D3QcZY0^3N~0B8 zV+Lm82!6v|yn<Fpc?#-|9+--0IEr8K9%(2%D@0{g5%CwlAl=#2H*pNr77rrJF~E{$ z*Pdp7_6$G}f>9Y&AWE1D3r77#QgI4rvF9O|G<<^o5#t=$a0VA~33qT8_i!KY@c|#v z?=h1%20zvZN+Veqi>bKsgoh5efqSU-l-qC=c*Z+n)I;-U%9b{!+Pb#1&sw7>u?IVA zJAGiMOfNV9HC{3pU-N_tdEkpu_z7jv0PPTiq40RaO&YxLTJE_mi|yw+t-mN?{Rl2; ziC+M4R(KngnLkBBl`YT~UC<TX&;!vJhT#~637Cj!kTDx`Fc0&w9vhJ1ITu}cz#HAs zAHU)pF5)_9s<Y%uTeHC%vS*Z2c4cXMQ%hYl@qHfTLw<xH6e2ehFd0+Hkp&O&1R__{ zuo)r`)ll*+?{?7R9Tzk7dZ#q&z&n<%+74~mX&feE5|-f@p1_?0i=YIwg3K(h!dk4u zVLXC2h1WrAh|0#m_@1Hk-a0*wVD!2tPLJi(KibKk>2#O(bvBhZ_hRqfFk=|R(UBhr z847mbJTBla{=_3ZhU-UCh~n@=S(HN+RK;N&!A&H*N_che(!G6ar>)&LeBZr&JsR{7 zul%VUW{AebD)pws8tnNVx=);5*qFc^gsgwlMwI_dNng2OeIwEEMhNPnJ_cYlF5~ZS zdiBq9mfguOG1b=bn2<+U1?A7~oXrPv@@<RmEJbuDJ;}aoHj997;W=L54c<b8CJ~kh z&k@dOhe!;@5KO{kOv7|6#X7u20s?4G7__GCXW2T1E}S`W;gE&9FGOBY%ss^9Ew&uN zFSw3Ba0hphlVn7|n}ifV1X^J-=AzaYuA%6NPUw#T7>ps<fnV_gA25ofT5uFsK#~=6 z3{kYw(mkG(KEyl8LHYy-{!mp~q(e^RhBxw{1ty|_-a%@NVVHuwIDx?q4$=_Ja!^{u znwIEV(^t}0d_z78&yQx9fnT9j+JHhQp%;aCrg4x8paLqQ5}Kh8`e6Z1<5L<3@%Sh> z@$pg8TyA}4%mYmO2giNH`@ppFB)81z#P21gkr#NFBAd-3S{W;`3Tv?rH}Mpi937+_ zScz?Tgip|d+(014v<^}oWJyQH;D_*ZO0&Mq3ayD!%5B@B9<P1T51XJJFrEWWU_*Kb zskV{Sq6>yY#vClcA^d?mxC@iXLEhYo52&rTMtm;qo^-n+8gHM0_32H`tuu!9@pbyd zAFCo215A<Ta3Uyy2sA-cG{ba==*AJ<bnM1Se1L<&LD~)l=Wrf(a2NOS0Og$=r0Tea zhj1tIqR?7u{VB%-n-%jwhGi&il0p!QHW-T;$l%QI!+Jz#a*%dnA5P(VChJJBesDn7 z^PWlRHrO;n*GeQ(D_|9cY{kzwj*GaAE68Rmd>60BkR^kI<b^Ki2ltE)k_Unij7q4S zQE4@lG2W;$-&8|&M4}rK;6!94Q3E34KIn@Hn21T3j5%0=wGgeMHT=aMrO_~+2Ip75 zA(5<f$V?QdgmxH+h3F^O8EdK~*O|!A=pTp^H>tm~_kG(D?(E@<AcUX{%Az7fDFZMG z7R<x~h*B3}1&-klyul}YhGP~^QItj<G(uxELF+6IW~mPg126<5FafJ@6esWoA5qYS zu>d~=BNVY%j3royb9jy(SskP`xQ^fP1UX$Dq(D?c1nQu!D+6;F3&UOIw4+Q3`L))p zBy!Q3+eky@q6K9jB2SjX(d00{)}A(O72&T&8p04E)<-Wamc8RlU6rY0O))xeE#~!X z5HY_%Rbmuzuf=uQd$j2{<?VQrN$06G;wc;chG<BTtpV0pV#MDD4pa_IBo<e-S@ais z^n_?#Ke>2LC;m3@WYYzmx7u6>DUJ<Sa03tV8d5f~^G}U3yU8tPXK_}lOf~J~Z<w=1 z>^&Caun>z7kHt`M1jlh1qEu0m4(ZScjnNuwa0usc9+#0jyMvS$wa^ir&>6AVncX2! zI>o|iT*U*tgli55{@@YU8WciZG(azm&Y^6X&dsiy7Dak$2|yS`G|lC*GfZysPcxYJ z_~I<LIp$Ja=7jK7w$CtC*SVz@@;@CoOB`t5F43Myi1z%`fwRSdDH<&u<si}Se>!lk zIM6;hqVdD539ueGU$k+)Xybg^So*0`fHGmesgEx2X!aR{v6zm7xB-(JvnMjTImmuH z_;}SE#-BB>*?}*0s($xHnYhr@TW9`JVdW^K7w*I8PG#7Ravlzn85weN(Z)x(dOAq+ zumUTw8N<C8W*C~6Ndc2F1+y?9AKMX!3Hcn1(nJ<!qgZ}re7uQ2tU>rv9+ZU^$rP41 zV=Io~IPO7<un5uBL~TT%Ge$#;{4&dqM4lFTP!?Ki-ilwn(*Aoa$p;#kjOy)n*`=mV zGG7jK6s=x_i@1y{cnN1Rpk*VH<t12#<=Btk@c~+<vXPwtL?Q|uV1~#bnNy!cXwN@* z?<xX_>CE%Nef%Vi`tvg*ocML?<tD$bBGY?u47yyLfQZII9D^aZgVYl1VW2m(UfIp^ zQ+RtbjbapjMvpvPfN>TX=_%2BwjPtcSDHr1@heQ*6aQ}ke3ESY#c#hVqEAH^#^-n7 z4*_vuL_eIuCA@-LK`xwy9HjTq7iOU2BC-^9kX%r+s6*1<@05q-;O&j|Pu^Pp+O6{& zei?4<3jP?3_1hNx_`_#kS8?^{i(c2N81?$13aX+BnxX|-Ld0bthHNN;qNs=ZXn;=W zjFhooWZk6#N~<+o{mr5wf8hnv(-_g90tiA)M57-L;{(2-8jX#`K)Z$)rO|<Ci_VBa ze;mU}XbEv6Defo^zoHHfl7CSpZk>rgD(lah0FW}NCstr3*5fj+;3{t8HQwNFIQVda zU;!3l1)Pg9fRP(sD1cb>Mjx!eI-J1Mo2L)2J<QYg4cx!EX|*q+WcvvIl>PtCP(b-< zlj)$&?METK;()udS0AIBT=F)*F#6LL_RJ>M+6Nn94OGeYv+1!ei+#j9tx+pkwws>o zvS{Ip(0ieGF(u0mvB5rmH(xU8t7O^52D50$Dde!O<UWhnobW2{ApPV|g3t#2V8%Qw z#TsnE&p3rIFa$VAnb8JAF*1<z059<g<{)MuTn}c*ggEe5c^nk;9+KznPK{d4IjC9G z9)=odjV^M_*;(9_68lU?b&+DlAPm7s9KlPxhS84+4gRoTCT3wJw&DbCqB!A}g4V=s zEN3BPTZr<(8OD!thOXLMZ2qQlPqPSp8&2ak-XN`L3NoS|%ovV1%)?4th9k|*g&>qe z1yn>sw82bV$16C7l17jo-X|vhr<|T)bkWH%A2Ku*KY*LHSx&KoD{`YGwjeN!gy0lT z<4-(>6wW+@9PmK}G(u-|MJ#4u79Ptl3oshBpFy&JH?=Z>5qjW=xYxF?-JhCEpdJ=t zB{oBgL`3iuqIP$9AwNVUz7Ww=f{3UI+8`1ls@@oa(a<97T*4tj8dieqJyzioww7c# z;u1bVSBmif7nDVr(oBb_12a}(KYqoN(#n~mrT|@Q(S8}5a2VI|3<>xQ6BPxaDw?AM zh{hVsYF>{)3&NF317RxTAk9U58Q!)YFx^uBn3wh0%{e_&_t4|~ki`?Ccm*RnR!0qV zL??7c40>V?L}80SfzlQzIEOoUj@&;{F~U$0BcNbE3}u-u{~u@f0oFv*HhO#`#DZBA zQB)MWV(-0oMZ{h~MJ$M2!QLX+v4MrPVa19H)}YetilW#+5fnQX5CK84o&SWyhv)si z^IqpVuD@gxlG&MiW@l$N$u3&r6s{t!y$QA6Ugs4>e>zyCdd`rVS)NyAG4I}iB6ehH zc#mHw+Q~$!f|h8FP8bV+?80tb=wzaFD9RX2oRwF9vfTPt&E(B@7|DsRT<IcjizfAf zC458%zM=t3Yl*h#f<bVCGhDG0YcPpi%z(&ML}zLg)w(c-!az7-V^?Y%=Wz#j@v<A+ zFW7e{?e6Tp4QFN|mSPp=+A$u$ew@Jio~+i`i+za0TfBpd0~LjgHyH`{^Gp#z`UgP? zdomJoXYVI$(oah><}J;*Z&|{vo_T-C%B`LmcYS)~mxdMeRCYhmv{X9Y)r7g#Cw5W{ z-r*-oQo7Qx#t6*DYV5&rgu)nwm&}i)^w0A|Acm5E&Qp4G3c91ap=s8?$>&V^lg;VB z9ye6Q;E!Lx6z6<*n)1rWdzumxd97580;_t_y<>TA26T}6kS}z{B>3Vq&LRwt5QoRe zK-<3TNnskiu?B15k2d{SXZxAxf32+B{ZKPfr4_MVjP>wAWfolpr*Im*$wD72Gh~Ig zOI;9->yZ01;(;|P;>rNV%_udHO$H(c@ffN22HU~xi=jTw4K|r5g)=i`2tz6C#vwR5 zvU3U#%!mDO8pH_Vi!^j_Hj&04<NcG2+$kpPSj;~CB<?pbWr(LT3{PgntO}c@wC`kA zQPDot6i_Zbkc%k^FEo{uj>o8lj@JuUQ2K;vnu`WfL2-YesWYaov83}TW$ipAdqL^i zP%>jFdQyP?7z0;~!vd^_FE(H=&Vmx_3oHt2Hq<2dgi)Lg!TRs_!u02{=b8hY$KKDx ze1|ycE?rq2)@c3t?ZY2w3Nb=A)o-hmUE!KS%8sj=7Otg8P3lIdG)@fguwhtk*xuy{ zn?%TpqB5GIIoe?qym1O=a2C=?UW?+WhBio7`u1T9##L|{E63_{BGrh;nhq*w@u&V6 zf}t3OnK*?k7X~|H=m#(u<Di8fPT&-N;}5EiWl?AfS1f`5Si@1-e~lXWF|{~R)S}_C z?Dtu7SlJO~u2BLKHN&)`RT!7QndSTA8&u>YKZ>C|YN9I!U<@W8443g9Um=fTAOKH< z;tIauHyp^Xu}n+J=MCH%YtmOrWTvkx!GNn9t0t200u~dACt4#V@nO{em@Y;=)Lndd zJY~E7uinhfQ%+ngRzY9m?k{MXxox(SS^4~yrXJlbO_hreWJ~44Q`(2^Q+DM)++wcx zF-;56oU4whLHwkMfAXi#UN(<MlfB1zvi5~})A7Ux710W<F%WK81aGXtS{%Ve+#7GA zytttmri*w+Q_%8IdV_aJM*a!(45*3LXp45}fbJNA;|Rtr6ecni(F6_{f}wE7NnFJf z<Ul=%^pR&Ur%ZjODf{<qqMSPHvZjJoM7teCIvz;ED~R_tz$u)?1=O2N&xD?EKral$ zAShGVO5r_HP-Gf|Aaq7gL`<hg#1nT0!?5(A7xXY`D_vsd8e;GW-)AsXn?+BScr$l8 z7rZZc<G!`~f|vZAJc4tlM6OX+LwWX&s@L~aSCTYcm8gxHVv5@_o~!vnQ(f6Gi*1OH zyIKAMQaLNP?Tzayk#=UKM^+UDtdD6}0tJVVx4=Uv*fI)}NWQ+1FOjz#w3^A0cDP{+ zB5(<pk%-qbO~hz^Sf0_me$XW@lcM}Q%F1bTP^JRn%nB=hZ!{A|^9JcFvhfWC2|zhC zLkqM-PmIAF%)@-F#(D(eDxwgLSi~V6wdb&FFh`#u!|p}BbDZIo(}#*{2Jm^F;RmPv zv?A=ikT-=RygLv<2*z1NA_@=i7%%Y&Kkx^pb7`xnjyfnXk9#!7pal#daCaeX0ZkXt z-eI@MWSG>Gna@Z^b1mH}-r^&cFXkW?26&MGe38P1aY7Dnj{o-*5*4yCJ}P99ewq?8 zMgK@ie5a|H+e%X3YDO#DZ<-ZR>h398Od0u3(@x(&6zA(SnqBWS`Nz~EV3M)u;mqGd z623zeGatpO3R{R`w!v`Bz!q%7QJg{yKEagY=Lv-pvyv-D?0(Hr7IDfjW#mPf13Diy z)5nQ84aChn@p2|++pq^ZoWptC#~b{B8S&IWhAmpb9&VU``B;JNIJQtf(8>MHuNWXJ zlTsLkaly&Uv<fq^1?@IgD$UEJaNNRe7_03o^Fyg6W33#ZW}YJrCZ3EJQ4_V%2zIbX zPq<<&{Bgqbf8T<!encxib6JyjW@tFQ)?v<Vm^&K0s43yZyQIr_h*-Qs22`|(5~znx z=!3p6wwZa%KZI^M>+A})x2xE{!AkfcV3mF~@&CKtS}Wx<G%vKGtv$eoCF~AjGyHHG zXAzETxCz^(tS~r=;|PZNGCDlC;U(T74d3w#YVy+*?a&E!=#RnhSZ?AfEoLSH;bdB5 z{5D?WJxo?o^Du`M9N>si$ocZ|&BrevW0~H3c@y*H;+L3{d8VT=2V!>T`0A(C3+PNO zl?7il_R52=tSbwCF?@<k)67(6{V^-1HM4TFFiFtwE7TE5kH#2`g)6ZWv7CZw5Ha0? zP)zbBzPOAi+(tAW;~8Ec73t8drte23WWGs=jlL3oC2&jNvcTx@LecJ{n0mX9BAb<z z&`dJ->O0%BbKmLn*DfqtQ;9fkR#s7c)zryPUdyOADbxO#l~US&)f5v?)EH4;>G@St zN|dmi)=K{b7kE|cOVpS95hz6qkWSzf&f_lb;XXb<MJ_E-4b@Q#6R`rja0ZbOr4^+V zrAvc~5}CjZ<yV`SN)=b@o7%_R>z?X&ex_w>eERdezW7bJ?}XuShAX_V13R$`CvX#m z*3jR=90M>7b1)xE*XUO;E|$4d?xob*CEM!Kax_I%S`p(e7>HpI3-X6Zd_NB32m)~m zXAz1BT*g)0LO~WHG9VT{2(uv;ti=+L0ck7zaTcLSOG>jzN{c?9mS;M+$@Bd5G1Hv} zI&mR+Wy>#3?fj*!+<eV0Dlxu=iz}huG~074oL<^Y8T_5DI_$f~Mw#(lQ+{MQv6Nj1 zLnj~l8aTrP%dr^>wjc;s@E9MEf#SZbJSd4;XpcT{hMRAm;|RGI=jAN69HIK7anj%T zmDgW>r&8{3)I<MhI%`EK=dWdCh#lC812~QoD7=o=jymXr0XPXAk|3?8&7cNqp*!qg zEZbo6JRBn+$~g(5tV=<8wbCYL{9r6}0P~{Ymmmrs3lV_#_=t3fKp2Bioq~%%G=T_) z9YjDzU?j4?WPf?dl>H^)OZLm`gxu-D<zW3}Bkugy1{<c!YyZx3XtA7fQ7xBOW~k(9 z%6XMsL-AM1Hp+-!ns!>MTfaU^T$nlc0EO|HW@4e^Ky65?u?7nE;0S_o3KtNHtGI)Q zc!~t1BLm-{+CaaHf{;-RT1#$<!wMx~16$NX12jczv_lv4KyUOze+<D;42LVGV?MTH z2f`5vR)FX{jXx>vVA>`orKCzOVkKrh#X}}>B(_Qkw>Le{E0HR>f^uF>&_-UT^BXL} zcUeS^Kz3D<RC0N3LlK-+Fa}5jM+8O$;{ikv(qIfkVe(QM4bc??Aj;qfQ3jFMM|g`b z$i!D@Hu65?*}IUWkBYXKxu>6nY%BVi#!BP_&Qi;D3%IiNP9Acu%m!MK;3bGe<B*07 zh=g-sLZSs=26I@VI7*--O2Gz|(Ev@+0^MMbz8HXk7=od2h8sLKnsksBGUJb3*n`tJ zi@Ugo4@f~OJ|o{Ij=JF(bem~%X{K`R0?XzuqhhQ$FTaNU%R+JqW!y0~nXT3G<v#U9 zVCtYd2Eh@-Ao3v=D;6mhmxPbVyQo$y=8R!cKUmy0KYjPzTZFKK?s<N>qDm{WkpuDf zl71W-MpLwg1NvhzmSa6gLwbXc$iy#{R@e@qIvSuS`oRff;EsjR;RR-IVNW00t@JHh zw$hsL6~(tvIVg?lXog<s2Tyom2~OfH9v}g!$hV!!|L}jC;%>xUh&vN>Kuo*E?U{|M zHm=gHQo@UHjda^W@@Azj+jiyXb&gTR6q3~w8j6y77;?Uzdq13ku@r+SfiuQnB4)r? zvW?7d!+C__EgUJ}2u#3iEC3OZJ}dWXayTK;jAk8UMsB#VRwi|$sh2A(zjP9>5kV3K z7lo_{Z*0I8?8OnBK_spr29NO!ACQHDJ6H=)8TC+qhlzf#;qQrhbUqrHi}e_n@t^67 zG~*!BO@v504FyO`M%{nXm6kHU5*x4)+Yx~M2t)!B@eau__ow1v<xh(!!%PjdL@RVd zcMO3G#$YTaV=CO?f#q0%+la;;6x+#B5tKuDRKReIz-;7XrGI>#^*Sr*iMV~8^(d*w zqdSk%uU}4jboo*G<wr^BNl%!G5VvAVzkDI<c);<jM>`&g-t^!9ikM6gPguDvXq_kx z<RansOUQMUMnz=rF)fMq->4WPBBCLpAR>?jQ!*?fK@|Q5K?J~9cu{CkP*KRu*pFaD zfCB5Uy(D@}{Y6*G{o(Y{?f1y*m0lL|Ne5#<_Uxj?z;-vQ7=jUs&rtS|AI#XxR&F25 z4Ir2>+s~?ZfSN?{gRExCp89fWMf_?_Y4gL}Rw-*qi>+bF@BGD$?oKh8(>jar&cR%0 zu^67%h%98|5Au<lf+&t2=nIj<6F7%3gd-Bw$fd~nas)x-{sN38=uPei!)XugXbdwG zF&m<2QMiLgh=(X@L5f-dRZ$C>pOQblPD*&3@c7~5grtO|>tWZE63!)^NutY0*qX40 zDQF?n+{e=%Gpso0QJm_oJiI>xe!hsD-^wjz{AP*ogt?_CZ%Y!RkHzHx?cLhv^?!>j zd|iJpnumDp57PsZ^q-BUM81NaCKHlg@`{40zfDQ1EpjI+W-<JrLkTLWF~-0Zp|}N6 zc`4{d<#i9x=GLMKwO9b6Ha+2u)$qk`9D_YIJOrY)H$c?*c66lH<M0@}5ApFRf^ijX z4s);(c36k4;BvL!erEoB_w&`ySI;ZG`uY6+^USM;DdKE!#L=He_iov{W%aT-Q}nBl z5?Dqapk!FdN`B%(Je8Ft<=TA>@vJEtopI5|MP;#=5rGWj(Do=<#{}%hsbj<f&c`Vt zIt8&YL$)$Kl%wkPAMj<msikCJeymI?nGmV9Izj_PRZ<)dS3~OSxc9+99Kr>JA_5n2 z4UdqIC7Yum8pD_?C+3GC>(k4-FR#A55a1KAfXRocfVi3D+>hPRa>{KRxslRldSNqV zkF}hm1eK93lr3dsORcqdw<ucxMEQbYM)}O)ff<;KlQ5P&lKG3cft!fN9mFCT-(W^; zEKm_G(GlIy1HCaCV~)3A#KX*ZctZp<BjweTyP<ba9tya-bIn5iG-Zu`8fJL7P}HmP zq`X{JWuv?(FWcy@m6g>hZDsNHAcWu?qHzb$k%Z6qg+kO<F%(BhR6s>EL?d*BsMnql zb?b=Xn2ae{hJ!eSQ#g&!LCx7_G4lm?gBiNMc%YxsUx-P}N1oc}ulTR?U%6<;BF@k? zOy4|3QMOf<$111F$*+4>5{nay5J|ryl{8#D!B!sqPf|rVjvIK3pQq`O&Js$bo}(e4 z)OoUd-thV0;tKL&l~!cvHQvIQ><{KmNj5(Uzyj7NgR&@xx~PZxXoC*uh#s)VK#af? zOoKZ-un-EiV%rHi%m8K%Aq1faM+71v$`^wth{tQZfhh9_Wa2BnLq(ZO!Uj#y3J&N8 z5ufj0KfQf;_2G$soZvy_tN%RK&xyb1zDnGSX&38>jWVsOTtzuqRj#hott^k!(n-`) zmy#q+3AY7q&&9{kJZd49GZ6t0^>GZMPA(uE*CFcX4MZJ%!G%-wl!(S1yn;mCl|)6f z!4U-F2gaRY8MfTafg_ds@lnLdy*vDNtlhC>?vhDjn(M5e2F@Kw)~yvETY0LIQjb-9 zV--0;TUNZu*fKnrUyXRYz%LZnu@YheP9Oxo@dr{!Zfp8#Xi@oTQ6(W-Rz1{50}R7> zEWAMf3?KMHxzLJwXC@mzU=k`;>}PkMMH<|Fc2}$o>sTR_rSqogr{VK**9gU<hCEtH ztyj2^^09_oT)A0IzNW1#lCVTc%*GseVmW?89mX~swa^Zo&>KU-*}H-xM#2T&IE*7W zgR^KA!JY}SUS-8Uyre(R%;r;@m&_P9xUYRjd(*!554mtk9r=)Qq`JJQFbC=;&Hbf6 z2B6s1kb8D5%^LSNPhwfd<%ng7bl;=UMLH2o#ZnwWDxP1WMPH%M&|fcEH=?G@mk5n- z5^tCS@unpZZ%l!B;|AWi1zWKLMJ^L0Ovf_ZM?4bo1riG>fU>BGyNJb%t7IMraR?`_ znpBk%n90d}^WfUq;Df<ijMJLn<+GOy+)j59TbKNNUUkx?zOuLpL$#IlIDGfA9=rSd zYs)*e@l#vo9w;GTo62m`&sPvdH7rHHkW?1*3+C7Ov>GMR8C}s0^AL!m$U&j&G)2@z zcl1DCEI<Gb;2<)tt8za)(D6C9g-Y37pA3dKkUMHc(YlaQ4-CL?xWWzNF%b)K1Y(K% zN$m)Z;uOLWg-3|Rb0pyfUg9;f(BuZY{TPUI2t~o0^oM0{(r2MRhF}TyVjpx!K`K5& z6~zDm4Uv+Vk{Hc@?hLajVm|kA^!X#_qmOWN<h-(OrFO1y1EasE0@hiy%dHHha}#-} za=8h$biRo=uqEc)>T%qrV?DX*fI1muy(w88guz&i5QriaB1a<E0}udXE=3MU!UffC zvEO!^(%>i5(HunX%$1nA+_kJrYbbMESCpnLI-xiE!Wkls9XNqoc#JoA3z>AyQ3RDy z1!7r!;DT|Ojk#EYQ#glb(2x(2Cks@(%?G-U%$!09p5hgL;0qr_yb*)++mEk2K6fSf z%Hw@LOv{-T>~q&oZu@BWmddnd@_Ln|1T>asi6i%fS1H~^uB@#pk};H<Gr+Ld1qTd; z3r1loW?&{(Vio+LU>mk$KMvtA0uhO;xP~a)!hJkI93CSndKByV9hwY^qYP@HA!cC_ zwD83S9Ka!DeTu)uq~kx6VTNb+`{kXMPFp(7Z>ch^mAp<F*@g|Jbu+n(Hn2b;eao8M zy--09NX4w&s@IwSujgvh3iKrxB@rbU&q5pBWo1Gn>|)p=!R0=mUZLs(R+fjfI26GN z=pGTdSbEVo<{z_x(YI~oP;;51S_k<C&g3~o8!P@R`QTXp^>6)UX40CA1}DmR7#9$M zNL<7{+($f~A`u^9N|w|pf%<5Gh7egEjq!+p$odt;;2~b)2MSRXGju}d7?YM#7iPMl zJ49JUyg%Lg6rX#~-KSfjw+{K;@{3;)ul1Ygx56)Xh-jm<YsUI1qHR&6gj<se&lrg; znwurQ3umKzY0cl7H)Gtw3koTXTFGsc&{l*aq766HldZP0SXzHL!U@ip26v1k(jwv> zScr`f(Z7So5VcSX=W!jkaStz$iVS>50cyusTa}rA|KNSt`-2-+c+M~8>Fzn-bCT;| z!{j;1Q*1UA?{<8*U|ehYDczxXM_mlZN^C;__9F<v5cMC5aKz&*Z9%k$i@1z?_>ESg zeP9YiTbYjqSO_mHMHnLR5V2ZrM1xw4Rq)0-9Kk7^Mi_3R5{<4JYN8%`p+DBZ7iS?p z%zXaw`J3l&V%|i(iMkMVChAO3)bo9tp65>DkNRnyRzKy_u2Xh*kZUS0JIFQ#BtG+# zd+L<k^*CH>(oP;(hDW*mHl57n3IA+RUs_gGT-(v%G!#p{f~&ZWxA=t5$VLtdK4DCc zifDnBXbpRez<8|1QH0<<J|Goo_>LTuil^kL4?E;!md$y6PfVQLXlG7l&f1*JMRPK9 z+;b-7xDIpGSM@YIxw5jNi`-6m)`eD?(Oy2Lgm;ijx|I_vvB=3lQgX(AY)YUc&uD^3 zLb2x@uf;KxPvZ4RdP5UL4o<)2`HwV^Pi(4EsS6xMt<Us$*qxU9dlA2iMXdb-b1&)0 zc_T9m&s26i<O4EsrUE7Mq`A!H(5%H%jrCV=+x46u1YhbTx7CVb_JBS5q8|o8{gj>w zFOZK+r{gEg5*db}I>ulu7GM$9VmksLQMfU1#TAGGi^3L1B{TvBuPvn~zf4YujfsuI z6>)ziiu<701F;(yj~_Tb&xXF5;?hAbr!4Fydnt*X<uOHQB!3%ENOi3e?jYAz`gD<t zYx!<G>9-JGum<4~Vqpxf1A*-YM=ZfIEXN82;{@8jqXH0$3|J;}G#^2Dg<trMKX`xt z!u^2zith^FMZVK5R=BS49X@!tubBFFqYMhoq^)w^PPVcxtv^&X?zQ1i)rjGx^@ZTb zr_QmfY{IFBM0%y(b3h-~sD#R>ibFVzBe;w!xQb}p!Ck~)_y?LkW@8TK!V_Ltjulvm zJ=lwV2*lA3lW2|1h*nn}_2G`^c!yTB#7^joe&~-$n2agNNqLp{D(+6stDK9>+=;uR zI}xBu)Wz|HBA)P#TOH@Mnu#Z7zEY;yGjR2@mn#-LG5M=L5X#f;?C$NbqpGhs$kp<7 zexuB>mu)806{*j{Y%IV+_(8!I?8YAKMKHuVvoeJa7s0S&z3G9`7=y8xj4AMjasAq^ zH0U8$?p=e`ORQ#1&<Bg)hka?Za9l-B+K03ciD}$DymRByjY}by0z+~_F5S3u=?;I` z$saD=S+|I3$|A+yL3SyaTlqoB$_RV8lwxHsw->`J(cAfmCkBaVc-zYw(Oya_4t8=u zw_2>@oSlOOf1yn23@tNgl9-xFnc?=8W{7gx?EQRWcMBbH^*b5NVQc?`RTte=rjl<y zQ|Vj*Q^~TRspNp=xCyC{sq$h(;qkhdUUGevR+Q}<hO@}?aAC2*5Q`7PQ~W>~vQZDs z(F6V9jtw|~vxve2yh9eO$Z~V^L@)HlSh!+5D3*iNi1KuVC|kQM_F6C#i{X#G;1gW& z8E#TqSlSW8?Y5+C`bS52X4{HwX|vOk#-%Ac`^#08!F}a5N+Ab6r=98`x7Jn{DICBd z9L8~+#2JJj6cM<B8;C*-((o1E@e?Ydu0}x=MiCT4NtA)8mBCnp-8hXh-zNQ2RkaP( z^^<#3s;mZ8)&T9%0}HVXCRCxQN(-bV#U!QW{!faGi46YxKQb+b$zSnRR(csGC5i2n zwbHr2>})c<QmELMwGlC>pp@*(&3XqOM)v2U>$)Ok8<aysG(s12#Q+S%R7`^>ys!kK zajAc@4}z*_h^FX?KA3<h@WOIz!48~9I9}o1Pc5ShX1=1}FLr8B8MbJFHW-a@n2Uv2 zhYbkAX~f|va_}4Zep45)K?O8KQ*=gO3`AN|bnetd+@&RjB^~*Howg;>vG;J0D=Fs( zva9*jk#N4~$9DqsG2J$pn6?&+7>n`n#4`9{E5Z<o2Z%#5KBCwkvWV_*#4s$wD(t{+ z9LGuAM=X-?8d=CeDalkSD``!o_RMsK1NvexoUjO9@WWOd#!-YJ5_fP9NqB`1NQFc% zVggH8!4@^q0<F;zUC|A84Y;w#AWXqL9K&%uMFLXs8NZN{s1%*er+*{I$(F^!at{Qg zh#>&SVWyei%5A%>#5PJ&U%tO`ZlGLE+e5tZH~v8MZ@X~_5x9*Qyu}BoOiU#;O2Y<C z&>Vx|h_M(CPb|Ye9K;RWMlwDjzp1HYh8m`$O{F@_IG_*QFdpuhiCI_&KWsw~nyYy| z`eHQ3VF|Y30FEINmynhioff9J3}(PQZLpmG?~S_fv2AIIOy1n&Ho_T0WjoObZ4{c` zSZ!1B_G@^E$1urnDiuIwG(}tVg(Jpe5~jf${@9NYTtp1+BNor`3h$AEqHIr!qdFR) z19}#q=?!IOBt~N#=3*%}z#m6&0;ixu2*k!I6xZ<?VnbC9Js~z&W8n&S%)k;Xh1ihY zfIcQ7F3N<#Vl$dIX1UQT5|tK}c3#}*Cvm*PN~zyXuB*&&V(Y-F+(p}3BxTqxO7jbu zN(-<K70pbgsjxMtyl4hTIN>sGVQdkyh<ivtB0eAspPt-&a_)fNfwe0Z&6zrW>gcI+ z9DB4B4V-_p@x<0oq)t7GDgi^~rpiiZdA8!~D34Q>Q~o&8+`l=>4kJsjsg_zAvSiGL zSbQUrzmEqHi)>faloO#)11MRH)d7nvO(pB%6s?4*6a|eHQ7p;x7*~p#DsQS-XgNjo z?ko;7?4D7SkE)&d3enV3>_#wWn`ch{lAl=&ScV_qOohfDym)CvIg7LKwy;BAjKx%V zU?tYzFpeP<k%-4{<RimoD38jhj@qb$mgo*U^nf$QV>*_@$HJ5^-Z66+#}J7th{IES zKq?9n4Gk<%0#>Mo2Izw!7z#&tfCG_X(J991SoE>nd2x6$?;m)9rQucntNe58m0M-H z3+v{~5pw(7j;ot9yNc&s<f_`nBJmlRiG^4MEmmVU!f^+&_<&4&gG^Ogpcd+(EjnT< zJTM0fun_BU9@p>@rD*~+(4hDPQ>hCxz0n_Tn1to<##Z=4hYNUwCrEyH<>Bc7-+<Ge zr+xoDP4}JtA5ZEVc5>abxt+IuBN^txM$+Dy!#P!4*k-!BaImeji(FSL)fTCL!B?2k zLW{xzC18cpu!arlqbZu9C0e5$I-m=Bqd(?h5jJ5PwqqxDVJ{9N2*FdiIfe5G$7NiH zadnAd{t4b91*!OqUntC~Bvz-!Xb%s=YURtlKY|d9P=p~0ip6NTYMHoux9-JVy%%vc z?(EgGaft^uCNlAj!z*1zD<eB_bYbmS`t+!=a*2Y!CXCD7N3t8u_ntO-5<FsAN!wDS zb_-9DfN%JY9EcTrI_6>>w!$Ar5sY&P!&5xR5Bz~uY1TQkM}G{&P>jPw_+cAPm!_}3 z&de>uBLPYHfK+7T2TEI0Z)kxw7=Vdb1Yc}~g8ev*hj@&1sLPm2g-{CCD2M8(jV6P* zX@S9T!ffPj2-tYCEAan0aXLl0o02q@u6OiUj$tvZE354!5}%KaID#-dLJFj^bYIAi z;wXhq=mr<ez+9|^H`ZYbwqghN<1nt{7T)0_Ol|0~P}hb~H)O^M&RBvKIE3qn$5&+I z2Q135>YzJ%VhUDaJr3Y7jv*YE5QB&K1C#Pp7wV%ax}aM<ZtO7tLoggJ7=<}l0bgvu zW{9CnamCSt9|5-aU|UgCEvxf~v4IxHL?$zI-sV9IuQ!>YjqTXn-I21|9^##T*oj@Z zjvM%n92Bp>=oWQR5B1R=-7yT~F&PW67^|=rfe6Aa+{GuDRHUh+25O;RMJ>&fnGTqQ zY4C<W4&p3A5Q=Mv!UM$NE54&dC7L^0pbti495&(r4&f-yBOLFMf&!Ik-fg(CMN>3K zYjlAfdZ8csV*pmbIOd5K<DTgMWw7|qurYV8YGT^uzuP9m3?FM4dl&JoESDZue$MPR z|7XoGLXa8|HL>iAh(duX<g+S$FkDfp8ml18Y<UgR(4;!;rUv<iFOH&SP1b-q1Owk; zUypGe+SDf~jcAB4TtqxKlR3(?=Vt8{n-sn?H@pu+l9Xp=*~;CCe5+Z+VZ9+gR^+D~ zx?l)~VJ7BcEqt*VTd);-aRkS394BxRS8yA55rcbpgr|6pe3Ui6C~sBM(NYCwDx(T& zpaB}98ANa#F#_AL9a*0eZYP|}oeuk*OE~P8duw=#$IKmGvT*jo>4q9oYEG5U<qq&g zpJXXMiTaN!Q+y`NCA76f`a5t2XQ4wF!Vv)zD#r>XVU21Sj9CyBHy2(I6{taRG{8`Z z3cZXde1@ppbbNzEB{!}<F1NOu@t_?#ike3cYFxAc2e=?_OZfWv<=2F-u`y9Gv5~r1 zow$kAozUM0?g`w!fk!;G#%oQi``>n3P8<#{uZ)>4Z&aR6kxQ9~qiAUxik4FHO{L2r zSQ@RR@w=r1+oc<ivP!i?+Y3WD9w8Rrk%N4+NfX$jI%=RXTBA3HU>Mvn3+u5F2N8%+ zL?RAPwcLDyNiB9{Pz^Ou2W>GBZkUgS@Wgs-#7Ue*B(C5Qo*)gGP}imlL~XP~M|8zt zOo1o*F5^bQR$Rax#NZ)b;w|#C=9$3~C1HbdsEE!m?1krkD6f2($B_<p&n*guCFbs# zD}7yLE5*4Udt0+-8u!d?ri(pu@%HW*hH;pJxzJ)cR$>j-LUaOI$i_E_4#A`@<0{yo z96F#QoG=U?n1R*UjuSYAb9hvjZu|u^FYytdP>kNi64g-)t<er$&=ox(dZ49P248Hz zF6>4yP9Pe05Q{iuAQM*fTqV&Gt*UX;8r{$vV_@v6jrY-sVM>F6vbD|sHbjX|6F)pz zTH$c+FwlQC+ebpon9qYRdUO)$O@#-%upB<vgflpYI6TE0yhl2+P_lukR0gf#fDsst z$(WA$SdBf{k88Mv_eeo{1EOoukch$x6;KgXPzP-=07Ebf^RNTE5sFAWK^jcx=dDl* zWl<A#F%-iw8{Y82F6_mDTHFNT6haV+Fo=!D8@xp(zCw(%D=TGY%hd|eeGt=na=_o1 zj?&tR*A!{Y&IU@MG+Lt##$YU5F$;^}i*4A6(+I&mJi>dV;5YI$At<Pdw&;kS=mQsw z#gZmOas@MIaUM^Qh`0EFG-RS=Q>qO0&=4Ka8T~L2!!Q!=n2DuWfz8;0o!E<g2*5eC zZBAy*^sBa5&7=RW-Uai89p}JECGj=Xh2n_Pd;<8->ixW@tX7`Qmn)8JE8;zlvKo`T zL$V2YgCfn??qL@m!;;07fE8N79%JE!Z3x1B{6U=-tVS&iha>dAj@G(!%8@wDOvuXQ z2*v>Q=gKi!Q3jDvFZ6>*&<&Fy5?+Q?5DW0feuxE~L^#9(AK?YWg7dLpbBGMoM{|%7 zsSP@yGrGYZ6I*b&VG1+u@WfKA!3J!`R_wqo>_Z4HAOcSij})XK6O~%hT2KugF#&6_ z3r7)y41C2es9WV{g>6L>|FVD&jQ%X(dlJT*{7S)vvIVtRQ<<_*_8rq+ltSd5T<bF{ zGAS}AG9@x07H*5`Xa{fXMjG<7jQ((k2X>-SYdRN{ZNokGwKe7Bh5VvkJ4u|~fM2xx zeKvPOFJ)NGBGyXeCO(JG;M^=bwDK6O$hAmq9{gcU@i-}-HKcrxRG%QB9qR+q@fG>o zGwMVk6h=vuf;GybDypL<YGWi^Fb)%Os6F)-$jmVW;T2xv13n=IpJCO3kf0w1Vi1O4 zBwR2J)8P&eWa2AqI<mz=2Xw?JEQAjZ;z&nl#tY2c#A{^3yc1mzQr^9I_Z0VE+<zAl z^#3_2>pkUeMa7Re<p91^WB9CGskBhGZ{CHPlFW!>B1Bw8oJ1%@5gK%35CQk@Y(CJ) zj<ybGJ5$Bwxmj;<LdwSaAIor|9=??{%OX~>UtPpPxv@lUt`+&WKsDH6C>*g6o3I@x zaTYgm8_`IGx--K~lt%?rfh}61HQK-dz2FEZjKNsU#+=U7>QZKw;SA2=0Uja?au=Ej z>Y+J$qd#0R9uu$u8xes0xP;4igP$<%N;ixuXodC|3@1$K%FT4RV+*$85-#I2(qKw# z)hGcgR6=FcLT%JXo_)C9gXO|Xg=KQh0=XmKa=GKJ&yI|@!j>@(=p)`>tTb2Vrwde^ zu>upBe})WXA`97QNTrI(?O~|k5!{c&5-i19_+dK&a16&0jQe<i1UoJ5mznqYf*kz7 zFPQaU?Su`w!UbdDigB2VIarNAoI={C<fqA>;*#$s-@SG>IU+7ZKLy4G#vK&1e`of^ z1s+V^wPDvf6HksLv|J&dRr)NG?TR#{nd(a+N)TkHm~WC_>(W=s<|^|bo)LK$`TlAA zi#LBM_LFBshDByY#`4*V_tns~S|eXoX+^fKLuD`i!f*xUQ4O`x01eRy?a>WA(I1Q9 zgU#5Fl0E65uomkPh%>l=yNJO(<a3~5poRlYx+XKVP#fLQ9j9;}(|b|T@W4l;U}bOi ztFay%un|AMefjYA3DbwSxBpJYXKq}$ar#5>2hQ^2w`S#smGhY-sZ<HKP1A4k3)`~3 zvcK}cS1vh{r&LWI(wm4|apDH!NgKrPvcz-Z=L8PTF7b++4ncVy={kPV|90z7&*J)f z@wmP*mLhJCv970xdRb2KE#Ftk>xhDgkcdVt#bOP|-#Gd65#>*K5er@V22r8Ln230M z>ZRk&>8b{w3_*C-hsM^I@mD`KFF1<w1L@)6G?<ziO3TM`#o|(tYKqOJBG$U;ethdy zE5fw}$MG8`q?8Deq8BNy!3HSUiNgrO8HC^hF5()*(%YafjJb$p{wjVz>d!U;cIb%# z{i*Mv%#6h(OoR0RvJOW~gb76`fN~H;8U<Ip!aIl}+6-ca|NQaU$ItQ6`YAGAOrb%c z9|Ly=?%cNaUsIs|(JFlpv(eAAxYBE@+*8@RRUWQ<@!?x|RIhsW!GGF>{!!ir&_FD& zB4%PPmSY9>ApmD_9=!;CKR7~E!%Fy|?hp=@pdUuU4eh8NQB8J}40UDC{S<75AI>13 zBi$^%I<bZh<1tc@iXy}5W?_wt&l#UTe16Go#^-1Hh};al86Wcb$c}aTY4N(n>)gk< zOV-MZZG82p%yzym60}|Jqm<q%mk|LFE5qNFLjNdl0Bl8D68SUc>k0EJ@+I=u039$4 z?%0Se5c$4?*T{w`WoV5a7>wyy0e^FDPT?lvolF&<{Bm#c3so-Mx`bamAKSrTSo~_0 z-?8#D0DrmTL|!GmLmEVAve1!`^o2K$!WgEqgr^_o;{;CPJyavu)S)#7U=qBs9zKY| zn-Qk^tCHyWbv$Ql6p^+;c~n7F)PzW0B%KVAbSGz$!$n-jZA9ZKUf?Z0ArqRB42|H2 z9ng&8vEWJ#qYTQTk*jH2sWCGHunRvCF`g|j(qE@PNPm4*cU5;lm;TSRDScD=gXQVV z=PaKvXTluD$|V)eK7Lf`wU2KdKikKrbiKE;!`*B<ze*jskHgiawsXws&o;S~wkk!J z{-6SRoPu@Oh)sw=3Pirg-~fVg5*1w71H@9qqb_A>j+O{V!O`q#A_31(X$*&g@vk#I zd{tsL6+V-DN||Z?azEwWLAj{%YL9F)RlK%0roszn5s6qlMFNVBrEbs`PMCtV*oQN? zh6hMQCd>$>h;>mI!+V=~LagI7YvuU`3TH=9?(XMMtO)xrG#SV04i`*;4+0U1mnh)I zCJlWt0gJI2m+=*5R9hL;KvVRA2R2|If^iPv$P=4?PMADI`EXFSnk@b<n!#6SCa~Q` zCyc>(Ou%mFa1%+$hBT3Z8uG&dp725l?&1Y9QD7213@W3#Zu$XvluCbIIZldLRQYgN zw$h3Qm}N-Sf_D@{arA^pxd!iSj3#J?*_eac)7T9~U1Y=2o!Y`MO!Z*k1V1PUM$$YY zi&q#hpAK0|8d}q4QXOX0i}h<kZ2FD#8|P!sAH8vOr(yDm_3@hFHN$m?>kz}yRck9Z zv&yE*;;ZJRl>)~^Pk2mjuEgz?%Zj#NRw=TNn~c4z1r@84PmzC--=nyO2Y8LQNI}8L z)Fuj}A=;xq24OI~um$^Z2#4_unJ6%YSfK@+kf)}N=Q}ZWeYC$o+MjsUc+7%7BJd8G z_=S8^*@U7k95EU55Q1xXfE1Vz@v?^KJ8(Y=o=|WU_wW{?X7c3ff3!dGchl+YeV`aD z(GTueh7E|pGkk=a+AV`7=mAmN^WlRaTtz(opaivE6LuJZsmk=@a<klSL4O*9Jbl9n z`UcTz7GN2?AzDy8O3z@Fh3*)EP4I(1uHY?_@gBcnIg_@Imgt4P=!ZpEjs3VZQ@?32 zocBtf8*ZGGyQiom{wT#G9r7$XIoQD&>+lfo@dM>&vl^fy#=#qh@Bm*>W)4jdZ7>9r zu^EAg#0Qj}`(G<bEB-zLi?I*akPH>8k`=0>Cx&7)ys;NL+{6=z)$TjYSoJJX3Z>Bj zVs#vc88{3b@-`anY1xzW%JA$JJVORbEg-~j#!Pr42=|Z$%|cdkbj3I<#0Kc_1V2%1 z5qr_FgEMAe2g2|G|H{Q#a^WPNO@<l0hUhsuVF(suFRmgUAMp(;dY1eskM&-RRM341 zV^U06O5B#QUx?DnO_eVJ@(~Uma8|zy@(Zo#lf*kUkWmVyVN6LOr7bvy<1nV&kCgkv z5l#?GipNuA;w#iFIX}!$7$PStS2AK*#iqoYSa>tk9?8r&G+NDQ3({J)b0~_+sDhfX zUPsl#dp+BDY{DLVew)M;m-qH+$i9%PTd&5giPMTd%`yB@e=qirIFS_lN8;34l2Rc| z4puHLD^fz~UDBeAa_y*GaacXVBqhLv%!&*bAj6v>GTxiKip=ND^YAsf`4;&sN*+tY znBUWeJf9%1;XbBH-)@|YJ#q`*>pFhTT-N!7i*whAg6zc+1VX&{h7SV-Usmo7L>W#P z2RBTIJ7(d%AH!RP7Py0qp)XvpYZsd&oW^y8?cp<1wBJih#5}CR+P$W((q?89^xH?% zMjYe-`h67KPie6C01Xe<(C#1!L0pV6`9(6f`nfyFUv7L!4re-{zZLg^$zPK9B>Q;z zcqr3vF?1_-Sq{%nEriHtl*oz})=Jb1PGHotq($LjbqJ7j9mcZnH<VwLv-L)X;&_AZ zo5<p3))C5XEdTH=6k&UA9EKQT5bsZiOqnTro{PHh;~Z;cT4785k8^Bw&m!eYs@@_z zS8xOO@dP4V4Gobw#{D~#Au=LLNAg5y4^bLSR76C2VB8^7#nVjgs4ULmQZd8C)hzyf zqkDcuoW#obde=kx_ee9i&&D?l3Z%oqEbPTToIul~j8M=V^^S3{3NDxqPk3P)wj&jv zk%n|wA1D7Pi|o|oGO2MlQX`U6Lyo5=r~2PW-H^IQKP{Z#=%5_ECcoBj@G^I0DdaI$ z37%TGq*C9qa6zSLP+?Og@j8R?^|$!s@$SGP8YTLL#(YvaO0Lhn$hF9ECPZ#UE=5kn z(!EhVh^{i2=$;^Vczu!$#VH!Ej*ZVbA|1vSJDkTjj_+s?!Rw*ENVjtFpF^RtIKLWK z={Z-dgW|J@gWH;Hak@1xcEo(V3BCU!{;GeDGfb9M_~lh$<?&6qx>kh2mW+tZ)W8BV zBr?^242g_2!e@vK>d0U$;_wP0!*38lrbWivo?-1H^P&K2DS#-1g0~bz6ow2-710I@ zu<#;%-!^8pV<$RXV)KeFIF3q}>Hkm#ZWxb6SJ<t`3V35RI0s?UJ#lj>`y3}C6c6}+ zO56km1np+Z{<3w0usYjof!6{tzT^ilKW2L>-97oJ-s+Y-OxbZuuCLq(GPB52zjZG2 zfs@ZIzV=N0793Mwl%N0#qbQ1_6l~BI?O+cF^hRIw$3P6m5RAeYjD;)4!3`5Ikt+4P zQn-mS?Txvu{^VY}KZp-8qN&H2u2gH#aUOCV;JnYRkCvyq@J?wKW@9eqL&SIyv{;PI z@PmS_5TV}ze~9pl(2KB(kc&{q8N%&Dh|`t&1vHK#Cx+#>F2L2n^=CS(f0xg{L^X)l z9mU$KEDL_vh21!S8`s!nK@1+?A>#4sI-?_eL^?9?2h(p*1}ua(R>KFMFz6-`#VCxv zNjsXz%p}ahY%GQ+R>2$VaTATA*vmmHv_>Yf;CqLSJhoyRf^h=pFf)d9k)8S``#IC& z|8ZL`_03KFlj6_Md0lE`cIw&GW7!9pQvDR4WP1JQlg-SO-Z#w(DZL)Zqe{{LJK5$l zZiRE(qxgD=a{K{bOl6B;F{Zf)sR*YCpBbTYhX|tx+bTjNLT3z>2#pAdD5)r+D4iR+ z-=g=#7i_uBS{9vKT2V61-MkxxqQB@Rv=eAuyUTHnIv&b-9_s(VFSFzW_hgk;#A7{t zup4_2fc=<vkFf*(pzeLvRTO=|YJj1b1b57U7VRFgX~!X4K_Xt^HQwU`J|pN6!{b;6 zQL&~D(h_F&p+p?L6?WkW!m;u(tpyp+GwxiubKx}8o(re9p1$CnXF9!P{u2GeJ#I=` zyr!~p_laCU$$Ti^Q2Ioh=g-&cw^DSlSxHf2R!aE?e37R*;gWh$sJSo}^0%R&CKOT> zc6pux51??O(4w%>I8FhKg_vl_f0!Z9E6A_Nw+_eRc`g3qduK7RX4U>(HP(3^vPqY9 ze_~~oN-N5)7}65ybbCs^F$J5@ErI?CQ?Ug{5sb@7hDjp(8>kH(q7j4m=ZtQVhQ&!7 zgoZD6Apl{xlw?{@y35Q%n7m-@gc7huFN{aYm()5YVa7|{@yBvM)mV{JV-7{mR^zT= z$uGFKe#XWVwb2g!;R-iQ#ZqiTJQ9!y6*+B-o*0R*iYi(zty>f?d#MJCC)}|NE3gia zVJzln=0#D<Qj!{I3n$Ek79s?#@|0%(8`gujhOM&x`+-w-FusjUkh#9l42n7nTDZUF z9>;JT*Kq?kaS!+L6Xi&-Hu^w|y$Ha9xAcnegMuyCiCrKAQV0sZBU;G*kp28|^d+74 z8GBX3jejk`U&JdKV-RK|65r4*nI+%|j=d*`cn;MEwhiclaae^TxQ>D!*~Tjk>^K{y z{sPdEgSaA~Pm&nei%gV-G0ABpHQkWxMeZ-5BuOM9`4i(D{6?`9K6pswlR#YkLd~FC z20H?%naOi#`jy~d09?@`i~bEM@i#*QL${>FFN@b{Uy9vHkwH65f)}Fk2lZLfXdH%E zx+P1U$`ZwrcOepAQROqM4750gcx0na8dn$TY&J_tjH2Hh`Hn61v$vdgp=cK~nP0gV zP%hh8R8<bVksY0QsWb}9upOD`M4?u~Sir6nP84z$wjc~IAPPLoQ0T&W3Otv>&dbtg zVc0)e(2<2oDy@hFf0XKdr=6lb`l5ag+d(u(d(1<?ZzBJPE<jRCS8x@nD6djWmC+2{ zV21%1j|p(jr<Poijc>?Ex|@+ZCF!)uBJv^!hY<x;HcLl8%*A$Gh1EB52rtAS6C&6B zFxQwv?yuq}s{LTQ_CsH6-9N<^k?)Wv=pSWAEw7R$U^Nn9`;+6hIEY&?{Y5M=5VLR` zPmzy!REIOxAsF|OjpD><BsSm`>Jz8YSOF0`K4vuj(?xeS<HC8ghF(fiid?}yZ)`;@ zMGU{Ap{ZJGg|6tJCLP?x>-=hd-=>zD7Enti3KD086jDo3h1AN(9emAYeOI>9@zcy? z-QrYnDmqaK7A9(`7%HJMs=*eE(SQZyUD!?@@5ccgLL_b?3N6Wi$V_MSKwr$md@ROh zY{MSx#WA(oQqnPV36~*CaYwD&kS0%2Y47kr6e$M^MLL9|h`=itiz<rQh9b6yBZgxZ z=3+g3up4`@7pHI<Iv7GDeR-Go@Q(O7{K>uR^wYe(I&C`5QA^;YMrLZRkgk^OF&lH> z2`?<i3i#kRObV-|)fzR|Lsv^xWmW=Y7opNHs3<vvGhAV7p_V>laxrp(QDtZth$=_P zai+YwuynROSw)2kI`2$*mdaV=NaR2)u_a6S&!v?k#k4%BmbRp3VN87?OBhLlB4Muz z<fMvPlB%jD73`|26`PAR6aAG1^cQ^L!#b`nVj;e{mdz=;W3KRnI?mu@t+c(xFX(tK zMq7bY?BEHJ;v1~3q?Y!ff8~EtFU=C_p;7LVq;=f;Ap!4^j!ZPJrk0wZ7kZ-)24Elt zVK7Ex5`3$vTS*(3*@_+5j~j@>E!;sYp5iAK+p48ixQEBKy7S-UuBw5QTc4^(sAP45 zjn>G-H}tHbmYix5YdF+aOGj`G<LXemcvM#{Wg)a4jTpCKI0Y$Ze3bPk+WNa+W}UlV zw!0Ny31n}`nky@a6Cyn(Lt?qJFdK6)7pt)bTX7WUaRE1Q4_}au449G6I;abKh<uO6 zBxK<a@>2$LSfc`}z_zBkoz#JuE^vggup5{^f)jXxB)q^!d_oR>AYUzA_)obb=ajCc zmQ0~WeiTPZltBfwLwBsl7JNh|N)gS9ut!gbDEnXo{BaN>>VYUk#LXb0zZZuQh(~o; zU$U4HRkF0M&igm(i*_mX@(`kq-r_SvU0G5`Wl<5fxByXq#p<j1PBfb`R7MRfh9_P_ z)qt3xDjK0NI-xWAp+8(O3hoWm^&}5w7Ge?B<8VVdAw*zSBmRaHxP{7%&m1@Jry4C9 z(0wG}Ez<D|B6A`mtKbVi?7?w_;x=L-GMbNNnZX*>&;(sD0HYhI#W<w5q91Zb<TLM} z8qIUk3~1qtvxYn-aQ_`SkjY~?)In>sMLRfQJ8mNy1santgkf6~su??*s>R3dh9BxO z%ym+B=jSTf#=`>oi??#ZAGP@yZDroK+mJ@FW;7%0!(p7jN&JDTIb}jO^hXTtqeTmz z#~=)bC%kYS_fV`Q4FI)K2X&GDA~7cMaztXp$q1b`zqzMs966T4AePpiR73I6kh(~% zDetn!s8*B?F|Aoe+cFZuFIcprd0;bIwx>;EIkv&7qna-o^7_u|+yku~lIx|5DQM2A zOhj%Pq7lS0jOh;|{o!!NT})vaa}kLDT&^w4Yy>CF!fedJa%{wL+`?@{<0aDYtsPA^ zKN&0n8`MN|bi!!NfESh_w=lZnX0%zYC{^VSblcdEV+cbwN>Ex+;)0ZT2t>(;A+WPP z0@C#^bZEF{N3QSyu`uhQmNaOA*_eZ~(BUhxU}I04v{!eM?3w8a56r+eY{x}hLJCq* zq9>U_8??m&c;cml?vlp5t!gxNBHczOa&!yBy0PY>O?MI|S0Xp!4X0qzo7UckwFB+? zQXi<@Pc3~wxBiUSP<DV?3c&h-<Qhu{{Zr>|oCZtwD`MUO{6b9pEM4rHb7CwG;<<6y zJtnrW*fl6A4#TRIkRs;YwJ#lrWG^~G^v59NBOkkQAJ6d>*-(=&nLHFhR~Yl;!~9N^ zAzvbYb{K-C*au^NGYxqzFo;eX0|u#Wr6J5r!gNp=spw!<5KM(TwqWaE-GQR!j;hhd z7l=P>#dbs^37?T~2-N{=l!Xnt;xkSUr9_UjRww$e;cDp|?!(!cdGsEsmL`rgM3b*` z^y1q@jSpCwbG~m<_Q!49#dEwwD!xEP>iJOu#--Xa-vwgnsSr8H#y9+eirkn&jr^E^ z$v6d(Q#W!t1ydc>y`_81h^#jy>#cDNq8Jglj1Sm7jO{rt;xe8g2}LMkQPe<9)Ech4 zQ{0?W?bqT#12jZqh?ulMcZ5L1Ck(eC;uMQFP>-O$!+2yN8zP1Uh+jE4zz|F6H1j%~ zLnv+|8h1yk%S+BKj2^KFD{%xNIEVW#x}8?$qg3|P$lrJKF8v!UMysWnn1h5d)CYRF zvdP4earCk1Jf7YIP7}GV7JMeM#kg6xiEeQzbM{s4vy2CLh{t$>cs#>z6duJ^8>27- zv*3jlP*9Xbi)>7V$jU6thRBj9Zjq&UJcY<&BA!8HwS}v?o7A4Xc8AEfJ^DiAe-L>e zg)umU!w_W(#0iM9g}Jc+M7!y(S(~?1X`^{yMPY5x5uG3c&;<?<ff#{BSd69<*sX>G zdZ9N4VlakaI7VOwW?~i=U=g&qfOO;|u%;8$&A2WoJsLV<2!_HDBKpHH9EMtue3{>d zy%Tk3%bNF4b)jnXPlj?|cM|(}=royC3{R)9-#3jVO($`8x<o9+CLDwgA;?n7Uo>wd zE`4jQ{Pg1U3jJ=z1uk@{ODbnxL8aYG;=wopv7iW~A_qV46D3%%6{^7&HBk$-Q3nGs z3?tx*X_yNOGFl9^P#dk$2JO)S6sCaGnHk5)y5$wj=c%-gJaEE9Ou`Jz!~!hDJ_O(( z4&euWqaxv`0}bJ@#1brpKXzgl_F^B-<04X#1rfgPuya=zkw!4%3>S=Y*R88$?yk~~ z;=yQ$AV=XT=FMQ;K@9HWA);ooCL<mRc!nJOgxM@|2XmByHOitk>Y_E;qCI9|4(8#| zEVWiT!pu=LpUof#eb5i?$Tx=#BzmG3X2NSO#m8Fg!fu$)qt8PzSfV(VVJ$)tg#z>G zwmv5(GCjPNe9Lg7`(4F6pUPS^r*k+DV-(&q|IJ-zUCsQhs>nAU6!cI_rBTI0Y%t8r z==jagWR=qXli5J!Qw{Uth4_P16(#smWhGs$n&yvGRmJ0)FeQcsp+Qj;M=6v=rm|-T zU$zwAThdLNWx@4eNVBa-(^7d~$GntyUpeu5(ygv*P}e+0RfUIj(GX415^d2DUC{&o zHQ5Ha$@b)RhGZKWk{!lVBQXYUn1pGVfjRiE$u`MNR<s~PvP})iiUzd_Td)JW5r9KD zivOByi`-<7^EyMaEe*+r@Kh)waRoPU8=~#T;=d-_CO6r~yv~qp+y6t^T>wO}HICmO zP!}X-7Zep#?7HT)yRO~ceN9BMTi5QuJO(Oup<-g7qNpf}iLGD<f`SDqUjN@SJF8s1 z55M<y{Ok_9XU?3OGqDqTv~T$69X{a;{(&t`-5{GgQjN9-(Gtc9dbBlVwEUSLf1nsj zqAV(+DrzFtXlq-dtwlIJ+B$l)efh{6gD?!EFb)$j6{$vB-xBR~!s*dA(4+O|qm9^# z00d$`4j~w+M%&mD?Qz2C(KgYey~Ib?a1*jSd5EWYiCCl>ZF5VsZwRMH+k$9w^5;LW zr6Vyw_DCjVgzS+#gK`y7qixcAGM-a@W?7Qj$VvIL1WKbkWM@?qb<hA!^hujA-VFMr z9rQ`N@KF!+h8G562xLDuPM>rf;}f7y+J#AlO?fqk%`QE_F1`%>8K8$2pfUj>^#GB4 zdGlw0-UJA;sjil>4JzxUUa)bZuk?T?atoVUYGyISn-k8oixU6iMfO~iZPF83_PWhR z2008=6K#4hJ_xecl|8QPZCBtDK4S_!?G_m5O+6rc*!j2!*}FbR3_hXFI99vksfY<I zn&@d}$IF~fUQO3eUQOpL@7^nK&g*<|u*z?UOp*<r$bp<Ff}$vn5~zfFXoI%sjvnyB z3@nEq&fpx*Lnh@jT9X`^q^r1z=ZJv^Nz4lKMqaic0J~A1^j1VAR6%ESM-UF-FbosP zH@xu`-|!DyCbK3&Mz~=DCgLMLfBc;AIqvf-eR%fy+2^RcQ8$CW4`DS_R*!f9kqpNU z?1GG3Ml2(h5muhcrXHH2?bLLl`7pI#kpD2XyN#J|6A?d!?h7{4S%D%OJW&gEP!G*! zumy^iXoc2jgPHKhdThpa>_Z45@CnUlvXaJ3%*GtFpG7%#;H48rVH|cK0Q;~X&k=)I z#G~eH5`=k}k7&rtRUT`@y~rzX@BKDhJah8Q$^F|m3WnJmC*8CD`oX&cIE5;?Np?lt zo1^9xh1RL9MT?PYO#>Hlt;}*+tUHlDgLp7f&7G+PMW?hw9}K~G3=_?cnDUFJ_WaDj zwO7-{mEo#K(92P(yG=&Eo`AVni@o?C!N=&q_Yvd}f^qqO2Omf9EPQ<hS8)%|@dm?$ z%YKu)Xf%PJcB@TLPie_`%NK@eY`7vn{zoz<%4G0$0aQU748;EkK3Na$Ly(bJi1q(F z_*8<I;Oh<8h!c?Qsv%m?Mr506i<Y#FS(pngH#|yoI>#zHnJ8nKFG0Ri{+WG0=W1%- z?wqdX42tH(ri-JTT(+*xkS$8KCfQ;ZqR0Ze34B;c^M}V0Hk)w*r!ZY`*Z_BzvsVVg z3ikF;b0zyrNE9w{Y=Fswnc6knV$E!NCmufFECzMtCD@P7bS}So$%ijGi;gWBn>&Pq zE1jw_rv3TLm^Lk+d5Sr+=#66+s;byLOLej5wmE%zawe=eFiXvEwsTd|<W18(Z<;<m z*Jb9htC?i`e~M>#ixR#ZazP`sM=uP-8mz@39L9NsBLbK3o>KUvmqx)wln~0G0h(YU zjxVCWiD2XsOpEET&>7t^22&7;2Z%=^+$qjU_!##*`lB{nI=S=Yr45&&*DhZ&W69bv zYnO~zGNRv)AzEHP)-Q7)XCBGdl-G|b2614v8Y#v`q<0k4=cuL3g=EZAQGFSegYi_F z84-8_g-WwU8l;7+NC#Lea}kxf6wB}w&*0|AIt3+A9+goQ<1qnuR<p#R{2Gd*@){a3 z24D~dV+iJB0n)7HHwF0kQ(Ws<0ui;I-=7eJsT(=Oi&&J}#8w5A&8(=lu#jLYN^IqG zlt&dbKohjc!b@AUM+c0?SbP+NU#J->#5}PKZ$7?>u@3iQ^uOe1kylP$*{=^f-*A#U zCw+}<x>*s?i`AT>>pZoi7`26l7_&-s^Qt8q{$j|olI1W7K6-X-$)e0^add#p@^>g? zdk}`=Gg-GG%jHlJ4<L(R8d;x-;|RqUvCf_oH99?D$=PYok5=0AJhU<Y`7CgpLFz30 zzHrM;?Yz-J3%GXzFCLcD|M-lBZ~@^S*3FQf>x<I;T!cawsFgdp%X!FRZjRm<gPs(# zEWy&-NFTi6gX1^}<91p+GGGA~q2dnO9P9&VQ!wxPd6ZQ@^U41Z$<n%jH%UBr;P)}T zm+0D*ylVZ0Ha5}2$P)>;6NF`oPD@ocGU6=uO;=rn|57!rSh-NmW-$D%81iye*)7*h z;_N~-i&;tQYUwQK7-Tybhw*SH2Oh|Z>?np3_!A}38-39aUO0vj+($H2a+@;uzWlvV zFNFZ!cjMl6_Ra4z@&%bFmRu-|@{mPU2{j;#Y$oR7Jg&ix;*-TVVV72n%4FWBU>@e< z%x;<rULzLYVH3#WjL&bZLvd{+<}<^S7@o8lc|{*?pFeZ{%%L;;&+Pmhvu!=Y8is}2 zM3_*^i$aUl%^fOGdD>j%+{zPcCCtV=#Nh+{_HqyfWA^bmN*rJXh295gFc^z*$Qne0 zImG4{-V5JI$NWEjkp217Y|63wV>k-0J@nLEo%XJcX*X}_Chy=9Qe8gSMvn1?hgkj4 zSvx-OXsLe7%E4!;I?U`Qi^C4~C<~d93aAKchUPFn7cyh9kePdf_mG*)zlSY9GMNX3 zP!!cr3k}f>t6(jR>=Z;HblPX;zz`!-FcmM51o!=HP@oLTq8!SjC0bzs24Vutc>nxy z)UC&sL5^H`{9YffoIe%Buups4eQNiqH4DctTw~dqD`0CcPOea^itk&~=Ml|>+NB`Z zBj0tMu3bytzS(;1x@7ro`836PMFa>ntGR@n_Y_P;PHHtbhUzuEg!iS0#w)}i6E&R~ zIgtz2RxpO~lr3Q~tzjvaVL1*X7>kb3o#G769-;8U7-@HuZ6C}*pI{OLw__9{e6a*q z@DZQ!4W*A$L#TmI&!VnJT@KkFvehp{4$DK9FTBi0a^RtR4D#Lb*Y(TOFaOvSUc54` zQA}K=a>MZDs!2RruGSV+SEvm{iwkOQksPjOXj4MA=hGxoCbT^X?4&1F@ZOVz$^<{b zbI8QhL<3Aa!4i*qr|41;jU}NRBgb!@z1Hn(XAQ}#Z!9YS`P?wen6?7oo+{2FFbfNW z7C6|?<RL0%r_0PKUk21*1)!}h^c8@;2;0DNK4rD);^L8WJ`KWE$*?hA->llVTFob3 zE>K;~+6GldYr^a6i66)NL`=qX+{S(MBtt_m71j)1W;_zhPqK{Q7G59?8Fs~W+=jIf z7E=JSAePC($j{4qe0ufi$xVjyPlBHu+Hq*jp@oO09vXSb>(JkaIx%n{!d=YYq&5@f zcd&Bt_g4euu1doUb+ug;v%KS>yl^T-16Oj$cmwbV&+rNjPP0H`8T_#Y+prz?5RGrJ zIm2ohVaRzlol+1T;0-m5&rk=gurkcdrY0kMu^&<AXbx~W&$<)M&<>5lnE-y+fY*pc zx(jsb$b`(uifqV^j|nl+2{8#D6YfRc3;Wj)9djrq+A=uuwq@n?m0QMbi4lQ0RZrWi zS;Uo`YA2C#liE{UnWws#wd=|<y7iqrYO#KPdx-{rac(=O%E=}v3qlscO41(!nf9!x zM*3>PleFYQ0Cr>AMHXhbM6ij6255|d7>oj!*b@G+pm9apxL`-s(sZ?kt!?^ik1Ny0 zoO95+<&P3V8%zE%_Vcs<ImR=yoyC?f>E#N-LtNjcx^YFm>Xy#3p)hcR+Q_W9$+FA| zYaWg=9*P0vVIW3A=4m0;U^7A>^EW`xmk;lQV9j4a@>mSTF&v{2jRa)B%=R=&p|qJ7 zfvq@>cznTE*j`~#L0XvL0(W>|2$Da(`S|4H%_kp|c}xD7eEGuV3#UU)bH9!q!E1s= z^4#Q^$&<z;kI)9az*z}Q&9G0~vW*#chC8*ayr3FI*bX(1xN<ao`gDWpJ)%ZVZB}<# zHg)3<sCFHS$|{ptDNU-Zscc9JHeO{Vd7YK!P4>1Bk8QVTE;x0YW$PX*$_K0vAF|SY z#5(RVDaS}G$7jo?t@fz82Y;}tXEU~d<;iv0RWuV9aX+v-awRV>iz1k_C^DQe*7*gf z(kx;@n3_&p*{!;%-0G-YUZs3qy0IJ{g~a%6Y8$hgETyT~jRSZK7t-7t{V^OPumHYT zh^1HtferW!!!=er$Q;SyhuJq+XCVr9<XPtb4XkC*hy2gF#j<ZLjFS|GERcH?$bCFO zG@jroWI_4g=bRnL0&5n<_BPB|f~62RhPOyg`j8Z#lpOms`OecDPp`%%oj#IuP#bn7 z#qu62Urk8|w<m4hzJ7bshcydld`S8rR_s(Odh{AsT-ylnEqOzGzfom`_HgtI?!sk< z+Say-yYSkfR<Lvnw3iniYj~g$GmS^hX!fVk1zq8d0hocAn1zDWwyg0AsE_3+PwiKL zwG|Ae_J?8wtgT@)<9iW_8;?71q>+(ZNJJ98;>Z(90e?MZDaB<xN2X_5sl0e_^TEXj zACgWa9ZK3Cm=w5aHN&z+40DpEPD~n?G-_C%VPf_k*5vp1(CA+WsJjP{N!pB77+PP* z-+^6+DFtN{wWdMNzZCN*jlZxP`;dSysP%$FA*hdOn1x&~`LPQf(FI4LpO&btsd-p} z{<t-s$jZ)*JSTm@NgBB}rhVotZ(PW(kB9itmszgNTxBA#c8%seSEgMV?c~5I%dY7} z*gjV7{dcR~%o$~wl!Q#TOm86eAZ5CnJZH^=))<Zv7>jvWfIGN{dV1a(@IDnXk24_i zIUk#_4+n7;VK2=5;LeC0na+tkuogyV#;pZ%jPc`G`HIyaR^wv~P5!l3p>auacz7r2 z#@VEYNr#gT>`B_bY5^~nVbz?ZRc8JF*q?n|>6VogvEhK4%fRCU1Byk9D-jNE;z^*I z)roz2%k8G*L8RnBb&l6Nl?kbHYu#_pv`i^3>&lv}lu24nvYN%xm7&NR_6JZ7<uMOI zc!0ETS$m@crr;1hSq_tp&&y_+b}wpvde`@9x$ZXQnD%Y3ynN8|jEu!pwz`i$FD>H7 z`si##&@_TQXl*mE;ZgE-`><LdTUsOCU)2Gh6eX?f2upSQ&Y0W><})#VpW47|Z&Zv^ zHyFA=51COGbjn<{BWLeXm|R$MSeo%Nu;#QP<BiY^b0KrS9M;@FWIP6G$h9m91ME<< zJuk9IdZ8b@A&ciYuHZxbhuHX+@lWqZ-hUeL^!(FPM|MBm=(ll+?=0WRV|>Q=^lvAc z1*x+|d=RUxJ3$;8v^}5>NT=mlcpp%Un{&%(-Xa-|<5^w4qf3I*dw!0=0X)Pbyu>S% z{XpJO8+A|@4KW|9@Ck`fKe8(e6Wov&`S1{N@c2ZlFYt-Q2vaZzo3RgvV3Wvt9mjAS znUa_Yo+ykeXo!xVIRt@zU+7;k7!$Ar>oMgkiy@L<CEpIe&1>kZ(B$A(!O4Y#`QyN= z1DaQize?WoV|bOkM*CZS%F$BcdsM9{Vh*ZH%@t+)l%*w0N#=G0xe35f5-k&KP3&Y6 zH%d>~T@rGYL=^akUyQzUkWMiuEo=<RZJ2BgN<B0{LOO#IY%nP2k&OO!hF>q1EAh&4 z(vJ(GJBl~^`GrfKkT>Wgt=#{Hqfy*D#?IKe!>ZAoRc3rYPD0NA2A&`u0m<xAA`<U0 z;~RwrnZ^<rj0sqVjktt+_zXMp@F%LG8M;8`sW)!pIkMWA4N5*TC^OmyzE}d8+4`6O zUwDww3aErCsE_vOfWa7okr)M8IL9ChsB(IPQrMA#dX@YPme&W`n58;%yh^^4e3ju& z^7-VGd~xjXfy2prwrxy4oV->nULd?rsJ+t}(|A2ODjFYE|1!|Ez02ENE;q&dmX~FJ z8ge${(U4gM;j^=WC*>Fvw~Pj*iJL+3!49;_WKde8GfpC3W`nX6YvGUUc#ia03`!nU zMb|6_dEQu4c}csoXtI>GoOWX6_yg9bjcRuvGrO{G^G{DL|Nnh)7i*8Hb<FOvoMZ+D z-~bLnW@eFUP+lXg$)H3c4;d?u3XqwMKpfhV!ETTl4AC>VM$cG(GUA7N?gnK!HXs}q za1mGBX$V&txrh6BfY0~>$7}}08Lr5P3fXB0_~J>$CcRFQ<dB^7g0<S^lMDfuleQ-L zbJ6?MMac}KwIRiBl0M3QnsxOh%vU)Wz4U_mN3Ov<YfWE)@l0gP9T4O?u&n(gYM;G) z5gDo$rcq|<Te_tfyo&q&W;~&`Hp?(_)hGA$i%@OKBJ9U)*pZPUu$F)|=QbV&WgeNT zLWTyyAHleVugF0r>tFz;qjqkCaxITRamjB`l2Ya<N%)4S)rIeRej+lBWd&IHBpW)M zipEw^UDk|To#DLf9_Oj^k=)*Ql-v82EE}fUs?L&pBZn^(R&v^3S!5A^MaCR7X5>SD z6v7{<i+bpe9vFh57=e+Pj4ANLYV5==?7?2_GxM?^5x9gXMB_1@;3=NrAAE-~C%qvu zAS2w63B~c|QN*J+p>KlUJld+iFVWv8>hIqAyP|MNZ&DhsBjrSi2sOWL70Ww!L*RIn zyaGDSUuA8@)tq#aqaxDh7N!e)bheE4QAh3vD(6-L)lmbrP#cr;8kE`a$8NmFCwzq= zpFs&jBwpb&{((wGe!*94|AT%4AvlRpoW>dSD#GGf)WFFLy!66R1Y<-oW{MKU4a#tw zMHrIt4HHTj6f<1@q_~h1c~Ks(qas2hg7^F~Y!2SMdh?24-{83n(}E{xU(eNEX>nrq zRSppO-!U4+rJd>RMAbZMCb_?>ikU0avLZew&F=Wt^ajx;Ld{)N`BS#kyakyrnb?R} zyu)XFfgOvIJ)8?0#Jci4iAuZ4gSOGu?UGtU?7GAi>1qYx8?6o$&919iZ1<O!e`FL_ z?yHl;^~-9}TuiIDz!e_IjXWrfQurjA-{w|oY%F?+hL7nawK0BEuV~kp`^@#+uSHLc z*VKvjJgSk8`u_ZAv8SDkq%^9b0UDwi+F*|*@|+)8=&Ic(_u3edH?&0FsG^?SYwB`a z<>wz0b0`KmeOvT^HwIt~rsMyL_vz25mfJ4>`G<^GPCo-HuonK<iGBFL;vH8hMS4s8 z{6oeor{9lbIEVANh8Ot1;>}n&MZD)y#G6$y$mw4q0R~#S9WvpUILF!sSR=VlVRp0r zLAB*j(#Z)j!xMRt55-Uhr$w_G{P5Sb2CK<NquAtc7Nz>ycB}FuNsH}x4q*SD2JMqU z+2u54Q4v*94Gqy6za;9n3QzhO>vG$GpMOj&pcv%zZO|D#As6d;xP@FS&2ka{C4P2I z8*xvHW+hqSn`PtWrIL-Wcod~>HE3<MmK<L?K(Uuod*dL&Ap3@iDf)*h^ar)k5}nWs z126=#?-)ftF&j_y{zCQ<J@608mZbS0M=7eiltEmXsb>9gqn055r)oDFvkYGiHBcM% z(F8IMZ;ZhtOu=l(cpZq-1zC^{c_8Oi2aVARZO{>&(Hp+l0GXa6kZH<O%3xM%Gg1fj z&>C&g3zIMlBwR^C=F&`rTqukpsEWVP6vi@imheD+w8l`(#cFgaOF|HUy{J>ppfoRM zCZ&vY!g!bwjTh)#o`j$u24Ncl@D_>q3fl?>r4I&TD8^$KcH?kGRtIQViLG92Mj-4f z8@NbcA4L5Z^m5H!sIEU=R9E?<yd31lf@SMO++C&S^X??eLgqu}L8f0ORVJ$mv)hIv zsL3qltmSOwEVET%1%pLZ>1?YRl+p0TYHY_o1mg@Ma1D2=8N{9*rZPePFJ&8%DNYX= zRc<}HOT52EEM(M6u>-qMfhek>2I`{;nqyIQgCejTE3h6Lumb@oU4tbbvud%OS%>7- zrMm0VMpiQNydDwPCt}RQGKAwg9^xsUAr5cw70FN<kT;x%TO-;LvcVJe(Ev@*47r<9 zet7r#A%o@h;p@`!kNf)Y?)8oE8?QsP01sau*{=;d{C^B9^({OxCP8f_kG9kp(9N=K zDwe!Z^V{iLo8s#B^qDQ|;OcwQdkj!2QRYfC9_s}aN`YLbFbe!-P-apfvQYf70pYlh zXLyd6aH`D;83j=YHBb}1(FZdz3+rne<O55y3g4MLTVl7Xa}c*}qLTSs*?`SBj+=Oc zv{Xbo*dsmiATJ7_7p7ts!eFAFJS~-`tl(YN+kPCzTbQWB%qW4nNO8*;vAT_8tmVXw z5}O?V7BAz}EPu-|O)(Jj5P)!8$79Gg5v|wp1?qQnLpo3DF{Ux)(}a4YE(4phShwVJ zEJ62H#M6dtS7c~wu$)qAEem0}g%!`?*!-5OxMW+Xjd8>=9?KxG1zQn-o!AXIpKG{{ zSBOEH7L*^-!5-=1fClJ?X_$);oX1PNLM&`s8cHb!66^w3d`XD9eE4$I&ZvYf>z1sW zy>9&Mk+TP{>%VUBx?Y3(5ANE&e|y>VM9=qX6WjLH#Qyhc{w(|y=vL@1?Qd7+Ogttx zqxE+{aVcIcpXPp5TjA2yA-jlgXJYNJ%v4vLnPzk~8@sL79{rVD&NeHup(IM7H0q)r znxH9qp*Q+q9L8e;tmPg@nZLnzOlnPjaSE~?0<i~Ya26NanCXZZkrh;+Et}|=hLt#o zaNL1=J5~ZHfkx<tq4*O2<w^YAc-|u9TiEdfTMw*1AP&r*$*^_)r11=+CygFHdi*4w z6UXvcu>lW6;C(>{ckNw_{>Z6L&p*;J&#*IQ5J~S;*NoiqN|qtFyiyc*ZC9jab>aG6 z{loTVHBt4wTF5-3_EhcbBD5-{6IMYc_&XYtu+HsSdOC1y0j)YxVwiy42*YE1gGVQp zUL40;<mzlt%ApT-AigUZ@5Tlael9^`oVSxnyR%*p&lzTcmSwR3otW(rMBoK%n0;>K zML7(FOp-sgU>m+6JxOT^nbe**3wM$ulh*+QFa+zc8HX{A<ZZVk)6C7!$sZ<T2?RoL z5|?p}eB8%d$UGG$KeZ65=j|r%uVB-ir2#om2IWx!_0bnz7}|^7SB%9(EbGOGs~9<h z%eaoGaO^D)K`<o5B**akadLtjXNXBi(gsGKYePcv<K%nVSC6&VgliYCoe2Cfu&Ay3 z#!k+`&uT80;rWZQkXa8W(2zuvk7^b%{iCY-q-bF>Ky6uVGCML0GU*w6Q0~b4H)V;O zJ*hABB(+nJjN+tvHm<<F57m#x7>3iZ?@RWvy>E)n{l_gIhRgf$6_7ungqmgkjc|b* zG9x>3AP)+l2;|&WVJ+4}&N&it?oP;se2^(Afil=;Ndeas8kC|ai85FTf2`|gXu*BR z4az2L#Ww6fAP(Rlg5crBe#KMkaO>PHeLRFieNPj%i>C>*#ca#h6NhpNgq!H_O|2*H zR&mHDUhU)#XyZR}XuRxaJ}YVDaLTTEj@erkqHvUQ`W#9yhYjdCfGy5}v_l`(rpPyl zHj6u`F@&rRWn&M|hZ(p_Gg%tJkt|e3vk?Z-ys%SE;lIhrd70VSIcWDkYIE-BPrP|h z5XG<_rx1s?=+d9H5FVn8H=E9ICLKK>)8mKLXhXVW+D2d`JW1be+`&Cq(>$KE#yyOC zc=O`Ti-#}nc6qpI_d~zM3+BuiGlTPJXN>4b3FQ|PY>bn{nb!1Y$CK3&vcNn<>2GR2 zb2d4>%=0E}#y;%FAsohWoInV|aRJwG9rG!ZMOcpwIEe(jLpI8&I7;A8$g-;lYx$|; zXo};Su(`rWIh03T)I$q&L?^`J?duoX@Wk>K{n|R*zIHJ*(BF5wWf(?Yvx$IYwx?Ix z8GG5uN7r$5PXx-FV;XIYjpgBB7DLg&#+b)kkSbI<VltLtCnCY2X(bD?qYx^fG5TNv zR$wo}VLyr$I-0{9!{CR*xQ!3^4!hADI>OImfI$~+jTvpkpuwij;%z#ki&=i14b{*d z-k5^b*pCZ{L7FkNRMbXC^u+|MK?vR;8TMn@bbtqPA|DE(7Usi9!TwB+5)@%;<o-`T z($i9YFDpk@LT~tvr*h1+On6LW3BUqr5^+wZg-&60GL!wXS**?GaKLdM6^EYl>4X>X z_d<i16v7RDIObVEdmxtQcYf*MqIuzel<RKe?Ty@uMpkzmjxe`SwASb7&YVi2DF$O4 zR$>z(@e!Y3BsC_uAQLj9KfEyw(=h{cFc<S7bMO~AAQx?v;fzei0{Fp!Y-NVb-dv=g zN_(AVP~LNP(ajhh!Kw`*;rl{%hJ=TN`^&d0%NA&-AkB&y*I&Dbt5`VNp^Dh*$gOwp zI~sG_TQ(vZ*AR~l#=N5Pdo{f<+8MiwZnKQ8+Qx^ukeo+FoWfNsqiFZy1rm^%V$Kg) z+~K$do7rR@7jPTdsD^?Fp3C7Mbf!AI;766LhCS7i9>slGP*EQZ(7~5d@5o4Z^ne#8 zVm_8&2ll{e5hV>*^v5dPSZwLPuRoPT_^}_uUTths_|gTNW^K|xH4kSbgInJtS+ZJo zl;mN1d27)X&PKPK@>Zj1H(R#57{6QA%`%=t+Xf4-A#!GQDJcx=Oqs+VolQl=qR|eO zwf??YF<P6JI+?OFq$n1BmXJc^T1vaZe6(3cTR?=MPe#CUR>~__6XEtsI)hcT_Ep-U z&aB#@PVE?q_JGA5o4H?fyc4JBXn)F+4TGXpV=f!BEP|W3j|X^yr;rI)gyksA%!{Hs zdO{{96j$&T@yJ8MN<t>G2mVGscwrC*V-!Y1W+Dd}C@u`0l)8+xfy~t%+=a|t5_XV7 znag-2z=51v?g&nGokqgpgaB;#q7Mm6_?z+h2{R{;nk;PAs-B{si?O(Hy}^@zJpXcV z6(wdFONgA##t!0;_5R@I!ZKn<IKc(3$N*Wqg;5KWA&dG3MST;uAdCGm{=s+1DsY4| zG9wG95~aEyt7-g&T4;lI=!$NB<tZ{o>aJ!(6?5_K<>Qz4uZQ0cKN)^#Z@_xLWqx~? z&04m1;>f<8{21|@xJ*9MNo;g8cC?q5o=obxoJY&KvDS<-8H*d`ITG3~08R1mKqoQi zy90M*b}?oZJ6f8YOqO4sHfLR^2NK0yjO^t%<`I*WmZRCS%-5}Hs~GHUGWE3vY;A9& z<dNAaB(sDr7zuxD#1@=E6dcHriY)j8l~EPdAd5m4gUq!zCczI^VYAv`Qi@XqB~TId zR`WAu8^<W^dP=$Dzypzf+>-lY24l{ygiz)q61mr~e#T5}#ut=c%OM7ILl6>>-=A$r zG=UE$U@lf55X0Az97L_te<Uq2+SG){lJcV6!dJT}LOUI#Nf<{@CuBBGHp_~W={SsQ zxDJ`7Bp6ADOxtpO9xL_v3}YU0UYoEP0k{l(-pbDP^rg6l>xja06x%?);DzCc++ZlK z++gI>yJzpBZeKVS_3rTQP0Qy@*feL;Ak678h?h-stj~dwt!Jvcv57njw{^{UaV4WM zqX^7sT$zg|Q?hZKrDbqjNVcp@+UvjCSwFT<<X7^<UHSf31Cw>9UCBwIDOpHleaH;R zgv&%{CVgem0wW>Q`vh<C4OKSMm*X~`;SD&|x&*gwmKVqbafQi5x-5OFH@{5TfzT&5 zvt@xxc#T-tZef9hitOl&E*JnG9Km_Sz+o#3Fb3f>z99cLR!yji+S?3$l=h5tgzI*C z2~6F|ZUGMBBu*g|r*R&Skr?wZ@#guPygbxL&)+<HbI;AqYghdke5Z^VCI@+Zgz5>* zV{9ti-HkQGL3d*|(ZQXcn4VHi28x{Zi@5D>EFgxu8(o_fkp=Y$-{G=}J_plr4xK21 zC9oEYwMbGH$DkC&K=$SCLK(}CyE}?-s%OYWnmDI36$pyW#+IO2mQX45hd1V8FTTQ! zf++x5VjUn0YBbj31#I*}%gB2fG(lek;vf0<4ptmEh<{KgfCU#rpdUpDTG7U_osH-= z$<b4EJ?fCIA2*#>l<YFZP%OnRoP#?>UmD}E3|p}cvZ}(dY!}=4yV;7xA)LZ3yhFi2 zI%!Nt?>+3_>@kSJevYd*=Q7%uWt}c%;`?}jPe_D26MCR2+CWB{hY0dwnjV?|UiL8& zjtjVgQu}B_hiLZrgt3Q7G)^HDr;&_rNKAN<E#XDfi-fB@72{mO@jVG!6IL&qGkLW4 z<WAm=y|amgA?#arZE3Rev}}Hyw)EsYF_!fLr-}~Er!C&C#jeFpImC_bCZpwH8Iie- z7tJjH!@av%mj55mX|R6cNg*iyxQ~payDns2tocY{yaahEiKg(uE}X(uT!-y`4mTnP zs$l{aVI4N8yqrWNp6#c^e>`^h=N0~(fZ!Z-Jg>2)jSoSTTnE_Rz!n_FH&i}I8Das} zz#k`Y4Np)oh_wsGAP9*lL%9#bK7`>WZo^t9gO3=3SQFLZ#wC_Z`<=z*0>(ehvQGF; zu|LXsCYZH6{>ESo!8A<AD)`|PLg8?X&IW&?DTcxq2N8)RxE-g{L0@dg4us(xJ|Xcq zzdIB<!8#Vzuo|C`hyo#G6lKv3{V@=}ScrYtk2|=FG$*MT6h$$V#~_TsSge8{uHqW( zPLb(TW)?9<%AhftVgP(F1=A3U({K!B8w*)b4CPS?-r%0vPaod-kKx+Ge-9TP{(H#$ z?>~S1B?=ZY_Al5>*35it$5}jqtSMPb_0R@Af(@d^A4YDv_~SgMCLAac$!FC9@;S%} z!hZ>uD{d@o?Bqt+AGN!haao()L^UrSHCk*x8z=lc-^CI<xQNlg_QYRek2jA2dbrEv z5tLZOnBK<CTK|zuc@MH3q!Po3TEE3$Z8=$)QnsEZsmD;X_HQxBDP)`L0@>~sAeA&c z{XGUbg>0?<kS+E)Qi)+zo!`<Rr;zRZ31nN(NPA8th8A^yi$P8ymykaomy$k6C5H6% zQpV80=wKrwkc*ZNRzoggsYDR+uL!E@5y)k7FAhU4o2f)FvVO`GXsyAzG+$=Qn~+O& zDlrsm@LLReKcM`>lo?s<Wp|KD49|X#!P<dTVoKSG_@y3$U&G(hAg7RBPXIz7yP#Ck z(6Z5QF<3h-8#<zlkeyd5F*r2-EryicoexvXZZ4G=PW~Q)wPO@axel^}OeKa<O@2#* zwMz|V$_U7=HI*2OH~lRJYiIm~DPKT#%BjTg{P!5F-MBMTx<Gd4sl>3l*>7n`xdIr+ z)UxAGC5Bebe~ZDos@Teu#~@c3sl?#e;<p&AE14*!d=I&@NhO9;zsF!%J+a%tl-VKI zQmMo+y5(<au&&ptGo@U&HAy{&60LrVK~5pph@BzViUW~K8eaS!gPcOHOGiPjPp2Z4 z7}m7@Ee&!CxfY&>jgV{ORAOk|=C>HE>+cIp`3Q17o=OZ(ZGVd)<(j{dzQ#`_hS1+* zklP3YFa{H_4ynX2rrob;Fk54gQ?ADbWIW3n1bM>f{ILgnaTp=Ed5#?d#NiG8!FSl5 zXDb5JF#~^uv)zk7Q3rLw#eT6*9&lCcg(o3TcCJxpuGu+yC!=0%>$YY8uAz^ymw4C8 zm^aPK_O_z=pHBJ@+?87!L-S`%naF~tN#L2E3Ef7*WMawwAqRI+)yp{3_Rsby^XtWS zMjjbN=0)Z~rq7J|*o4j47H$xOg4KeS3z@3a=L9zGIV0_y*o-lI8%x;s>JY@nOH&)O z%uanYfQ;r89zngpZZOs(5LqHP{EVU~g<j}`jo1S95?vD7q9eLpW@8Gy&<Fi77^AMR zg^G0uxWXpx9!9Ps=T)}%Q4Gc5be-eKh`<dLi)3>b)zJul!wc(gkO+k04DRAS)SDcB zxF2!$)Y-!f0s0`v<*<Rz<&g34+0{#C{W1tsdsAWKKQ{M&>?@5ZtZ*JZ8-lhzY)f{U z<m4%C?{;z%4JSFdh%xRCxiXcd%#|m2iWeA8p?wf8OSmsju|dWN+pisDHO7gU!NyER z`Q-?VM%)F1FfMV<DvHf#!<3E85b^!E(akVgo?Ez31Tv8+4S|$5NPx%1|D3>1o1j1^ zIh$Bh8bT>q;fc`HrZ{GqB1;-VDW?&J4piw1e2LKKrJVrTtvtVFlEO*i?kHn9+m@Xz z^GZi3<tzTd*h{IT?v*}88bT@KV8+7BsZ3$+qUVQD$|5Yquq&xd;nr23f>1n+%+lmC zTuo()9o8ubrDQ~A6uoK)GHy58+Su0UrbSpb4Ilkzo+W6KvuS?GG_~Qk$i!`a3xeGp zmM09n%O2J}x)I@W%E+(r(~Y6Fw=5Bvon+fIAs-6h8;nGf8M#mZ1yKvNQ3s9D1TE19 z{V@Q8F%)aC3EOZ0=W!3~NYpkxVVOu+<~wF~&>6{zvM7hTs0W$yrf7~9c!e0aksD96 zM>mAs=hv>-kFk$&BlgUV6E_%1IUL-1@W#Q_2X8EyGv4}@<=|IVx4vTdJmX(>G2OL; z(BkS1hYaH4EMt06Zkn;E?SSr<A5@l4<FMuYkIt^5(>$Y_xrChKWkljWlm~RvsE1~7 ziekY)R^&o%6hJ}ziKmFc7ktC{Xf|CCj|4n?NWX_f*gm2UgBSW^=p!?2j*;1zgH`au zYHYwJY(|yG985$%3_~F9;C+l7_^s}WHt2s@J_|b@wkK>|*q-GJChZB6cMafbU@kI| zzcc;3bAlK!&)CqePmdHu7XQ#GeHwYR@c1ka@l$r5qNoj}=qZ1`3lXM*!uzVLdy8VS z5z4}mg|LK-e!x>Q84sCBnTHpo@zoQKtv_ci{DOmI$o!J=R~!RFL=2t#YmRk6zks&H zb&ee7oWohs{*5?^U7mpu#9haF*qCL8t3RV=&={>T8k2Am7g2{9)I~RR$6yS>2#kbG zfI<RnU<Z3RLxoIOIIiF!o?thLJc2u~3@w$rjGQOM;gBi6j!3*h3}O)nj!VcPI`LZK zsl;o+*An;b)CT=i`Q4g1W9N9yQA9x><4ns>r&{rrZ*OuE59b;UwoiNf`}e=X=0Y-R zSy*LI7UfVLBQOEy5srs=gao|97ktGxq>W{bi=4=fA}EH^XpAQ4iC!3v5tsmTY+VYP zk-2z*IJ`mDIDUymLd=7h8!_i%g0?T)9yBY6v5DFcwB1|(``q6#LGmEA^HQU`t$#1k zY>%;wn6{KQCNF8Ro!3)-l2cx@kzTxAYBY(W-_x7Kj-~uUrF}MMkI_Xuo^LEKSCiQ@ z<(F+HWf6?$Z*9GpUsUonhNS8Kw=L(XbN8%=-o|vI@nYj%@oJ$lvr&eV#U+a)P3(X6 z-uBuWFY(t1_8AGU6`?GNIjK$S(Ce3(?=uoUW$FFbs@XE%?7e@R)>_(4Dd~1`sib+| zZ_}D(?UY0*{DoR*gvOBZwMQS!!+dPSCLF*)97QlLBi$Re<lzhzCU~F<YNG*~q8Zv_ z;2Tc$9LvZ}+(I1W;~-C7I<j-ykxTEFzQ43^=GcY9X7cxu{tP=AE{Q#k88UGvFja0A zxr%mcjWz8pS4nm1tF;mvgNSZv$|;J@aCQ*mmm2HZ*6;I6^U0Wpg3>Z46D<?!{zfaf zf})b2@n)K{eg0L-tBw1N1kiFLQ{T=K_}7gmOAX!W`>$yiGcDn*IabEJ(bw>4eER(> z;7;RyS!%LC9NzLv&|7P`bYA}oM}%fsQg84NzQc|Q>>(%2h<50LZs>{L7yus(!9py; zR&2vz9Kk7s;tVe1J|5yRUcok=#UkF&Q*md+1Am|}N})8$qB?3|24-RnxPB`n;&8y> z4f+rfwIIbO5m93;e+@Yt5oK9pTl<2O-j=G<9{0Jczx-pjIJPyto$V?w?Hd=RFh!;1 zTBiEak7CQx|JPzO@}-t7J(ZR%tu%$be+y{M!cmfbHr`qhRR{bU&@A(|7P}FMLpTgM zVHn&JI2i{;P!v^A6?IS-_0bZ&;013C!VrwcSeUUKE3g}Z2*Jq&LwDsoBjLD+8&Ka- z7AT04D2=LUi*^_YYh^@4E!Qhy!C}krqavs(`AI|+CzfT>7q2fqvcOB~f4$%uw;x?H z-S03<twavcYo!R~rWJwAVv7W888#pIYZ)5(QY!<Qg~%TPd;0tqkS~AaF~d7+j3WpA z7LYHsLYTw*(jNhx2mcz-EK9=&W=zCP%z{3lvW)RKd_p3=;U8pp&kT?WnNbyg;VQ1- zIv(ONULqa|$p3-0GOD5a2SZ7vH6v}%4tlk0I2^F}@XW(A%`*@C9PU9y1hj+p2|tgE z?sA<s|Cq6nys|NqcoS$WDJJhRj<*#5hQWIA=O*7jlK=5X8RQ)DYZ<un<&XT;B8?s3 zjp?HLDE1*r9x+CzIr#6%j?$;eAOoOhHOTmf$<fBP(NMY9Qd%@SVGK0N5_kkz3gkY> zc*;nSJ1K+6LU{+hVDuophy9EtgDkHKm<@mI{a^^naN1~RWBcA3?6NV?EK9IGCSn$j z;1r_p3@`8n&L62dxZw{B!EkKEcElkb$#DEcHK7eUqYH*&7)D?u)?o7|4k^52ByA$; z#47k94EJy!6_TiCw8sDp#B8j=T3p9Vyuw@9ex|LUDypFsTB9x6!HgNWj_A+qE4Y0j zM<|RxQ4)1g4-L=|AL1UwUHOmUL)?cj{ktP^SB}ITlrP%<gI5m5{p(xp4^G#RM=Inw z9F_~yMOZ$Qizs<7y{qtbGgTCKj~Vls>QPt9zMqA!H<F3N_3BM$+N1LASLoHDhj1RD zhp;0A6;b$Sh3FwxT0_W&ChN%wdR^(QsKCe+tw>g3TWrBGT>fNjMf<J6XhlXoR<1x+ zX1YY0tk$Y)jM8IrCplE50eUs-Aud@%$mIM|`+AU$qkksH#o8#WjbXNEI-P~>kDJDL z+m|T={@PMf1{^*{kI{u>(PC1xBE1M~$Lb+o8TVw;+m>uoGqDDNpAA8oql{^6Y!_HV zMw0<PR`x(Pt%n4$ltQ*~KQmzDW91R_MyJnjn>7ga=1OyuO>rz1V#60}iI*L(M<kb9 z*(!%%3=ZN5&fq%od}Yf5rBMb$Fcs4<9cOS8w{RO-l34;!7)3A;W=zB+1mhAe;|iR= zvD|uo<H!VZq6-FLFos|+LU9^ra1XB$i#X)^hlHUl%ApFXq9t0P4ccM?rsF#tzjKTe z?(qE1a$As*(x{C(sEbBuidJZkUKkGUfPY^bF7x{T&FRmlkDmT9on<QGaLLs7eB<4U zSbE3UT5NYS<;?!$9!YY^Za{S@8-Lb?-UdRgRrk@jN9Ef{y_TpUJw&q!dgUe%f;zF* z8+E3Kcwh}7mz9)NNj2(0yv!+@TFTm`X7wP6DTAb}a4K65GIe5#SW>nD>R%7yGATun z6wN}m2tCM}ltEH96dH*hr10bvv7~G}v>QFhp_D;VHYb{rV8xhK{E^JEUweukQz)gE zqLI<S^hNBNHAGPsF`AQXb~CUVy9s4kHFlk<$0Iv6KIYlTme%L=-I}6UYY<rte5^P_ zwnN&Wp6JojQsm3pG-Xp9@gs;~`p+O{*+ThB8HpV@fe@TT7|!7VqVN!pV6WIICR9Xa z)IvQpMl*Cncl-?>48|y!;fuBK$2!H%tlVJa6=Luj33vxP8#~1w4sb+CRKj&UMRi*{ zr8!!lCwieTyfF|%F&v{Y5!0{|+pz<W@Y2@6j2RIXzZ&yo{~Y-_@<Qb2qo1QcN5_8N zAm1!QEN^1&F;2nj_SLx7R6S*ZQCNC4FSeFz8q*#Zib)os3ppu(3QCacX`{W3ZO$1# zYgw(pH?k0$qni?>{$X;mvE6A6K_#o!qLjtvZw*m#rXI&P;~r<epd7Vgj3K}&BT<A| z1AI5`ktvYnTA4Cyfu1&cN?OfIk&>Q#(+if;)l>4w8bYQ-miaSS%3TjJaQ4rpq*`mk zQp$RWuPH-V%icDP9S_siL(H6`$3bGv)Wth|z-N4gLSV}Tc07ICPN|LhXozNLfwpLe z_UH#MY`}H|U_TDxD30M2PUAWvkv^@R;taEqmyF1StjLD!D2ig}fqv+ZAsB|y7=y8x zi+MPXQwYUr+`vsZrz3u3LU!apUgSgmbSw_#7%7kb@WCJq#$-&v2YiG*EjK;JU@Yci z0Zt(lcW@UE@jg}?qHn&}hS>MfmJj4>iVyj+m<(b0@Yk>8-zmh(eSQ&;j|&-Yw=@+n zwsN5uW%XF9K(AZ3xhdL*wPGv<uZLJ~4Z+&US+5OCf$IT^&r1=7wHho%t%nFs8Nylt zmO|G<)SsUs4r^6V+?2K+;%3Sa);h41yB^~21u5dN)`q1f^bqkWLs;v_Qa5^t@xCeI zu-2HRw)7>}Vd2jZF4j6MVrQq+M5`c|OZ=*9E3AR!#+a<&NBD$9e8v~#VuHeGjp>+; zx$wmzEXPW$fj>53Gq&Iej^Yj8!eCF!g^E1Li~J~HPm68BNNboe9lltJRoH@U2*gpG z!C73#4LGEyBS1D}#~&zyQmBHusE1Z)gTC;=W^BR1^quT@I6XZaV(}ez4lE{dAD(`Q zi;TN){KpV?Jnll=PPt=b{YHLr{K9{~@+s~6cqLPAxvTDB;yhT(UX$F?>e9egc;8{4 zS?)3!Yqg??WHDQcPOs~{i+<LmYAsMpVd{0gCq)QXS;Tf|18+>Q*SqPei}iS@Y;^+P z$a0otyVYKw(*<h?*-dZd8(HGAlq0Pn+AT?umPo#lWiQLSaC$wCXDLGz<{McHvgBJ^ zLkwA(B97L4BkM!fL69}X_mm-m_(oQYtQ5sT&+*)4KjUy!s3se<Kwpe;&~xlAe&*OL zE7Km?;fb8cg?ea?v6zgxSO$Rr?8JT?$2pwG14P5wk*197$blAUiN5f{FpR@=N4rjn z$;nR1fXr~mA1H!}MmuE^R$>+Yvt4Oz?s(jRfOYyX-`r0rtX&Y+XXP)qG^iy4H}PZK zvR)=PF>Q}Ab81bl&=|5Ivu??*UWuEn1t%MVwGd>+qo@FF+oIHRy=b2p4;f?;cslCe zgjm0k(|YoaEEriR{Rp9LR5V`kv+}C;;~QC2!!eQ4nBYuYCf1SY=*qegD>KkYaUmnU zkM$6-e4i#<wsVR^_U-&A7}kIv1t+vI`PtsJ#^2TyXqF|q0|5xc9-P2=lwlsVunwCL zj0jxDEj)qZVyDc&d>ljwYLcerXpQ#h0GZYv7>$WofDNwPTk9nwuMmf1e1k$}?2sD; zkPvk(>iqHl7!K{-wr26Rz4P`io;Ggp;JxyItQgYXR7;#{Z>l0*x8ONf{8*jIas}n6 zwWg}_mKNE~1!bfKQ3Eyc7wVxtRzQ~MZUkcqrMeEAu?;)06T1<FV4TNY+(%kB5|8Sr zfwpLezUYTRZWXCEMuuV%=3@gszJ2`h{>Qi1!%yhL-tfKJ*jnE)zH9q;Udx|i&@6sd z9@5$5xhz37h}<nrUZUN3&LKK+)zu)(=UwgOsWJtfeq2p3e|T3BzsQuu{B)&$i5Z_* zE=jPr;ravXUrL5FUb4yj{6t=YmRB~ZBzTd&;mDuKPAQ&+%;B>;O(YvzLFndbr(Dcw zr)0^^)>0l8Vyw<ffnjw%HokKgpnYL*K}r{Pf6$gOurOT!h8MBZ?=RHB#GNW+dF()4 z=F=ASm{)x~MFNU@u<k+`R6=#sMhmn<Fiv7gR(dO3#SLU7t%Xq>rSK6+$dR2M4;4@` zJ1g4;j5I_OG)4U!c1k1k!9e(67{+1|7NZ;mP##rK3mwr3EpxGphT#|sGp0hGfbic# zj_8<cF{gsB9lRz3Y+AKo)utHBs}^1nK4VQy#mep`Pur+fKYs6a7bm)MeTh8Fz+7I= zU@iPngj%V9X;^_BID;E_iMOz$#yn9NUKoO57>5a%h9`KAPSk1_jKf?AtU@4;q885~ zQ(ER{;~G;j3+s`d7T|z9$cxe_gR&@xZWw^E7>A`;hRxW5o!Eszv>@4%%$SJjn1RGt zeJE`mN%<blnFVs->;hS|+Sq1oY(-*lVz446Wp>Ia+IQ#Xn-4p2i&j~_HXX&IPNq^~ zVs}1Z(JElBENA44g;<JZ@GeA&VG5?BGEKWK#$YVGXyW}b1-`h8dpK5vH77120@o3V z2Z+LRyuj(Ac1k$z6{TdO7+F$`UI~%7fosK?7&mYePw@<K_=;vF*to+cY{%w5>A?_< z=P;IHe+fPCH@q<zLof=XF&R_LymT+kf`CyNi$BZQDb+9pLou){Rgu8(G{tZ$F<krX z*UwL;2=g>C{E!~VI;rfG=*{w~H!Wx1h|`apvWS2%rwsOL+M)H-v`Q9XbCPRr_gr<& zDArzfbr8o|8$Ej0qesz-HjekMl+bO+l6j7bl)ws{Cg+JIEjgY;#*)d*2$>NwFcGuL z5eNE}rwZYXA()MI&`-UYn3MAac{YcB%{OP=aQ@9pu4mCs$C1~sZvLCQ7|3Grfmx4z z2JcHyf;p5&8~lwan1QX>jr|Bl7%oGmWOpSy#i=q|Ot7uWI<^{12lgWp_YnpA>g=`P zO?A7z$~#6rqfjmS157~#+-tK;qc28a0Zt-U9ob1e($0>uoG~R|?;=9`?1=WdEygcq z!2|~VYDz`q>TjAS7CmyxF9L6He&V=ZCRL=(<LD}ituwh=`llkY__ksf&f)={AQtc7 zP=WcQAc~<5I^%En;RfQ6wjw+EXo^0V0AHNIW!!|3!pe;juw2*}w7iXD`xMtTc9!i+ z$u0wQ#R9Cx7VLy9?KFBxdsEsWdWl<0_#%b+6;3rsSWQ-gdcnT16t29ZSX1rpYC<-Z zppd?%>NaLsx`j{_6;K6L(E{Bt2#4#^J0l5(daS2V0gcfFX&cxn>5vO$Fdtj79YHvR z!?=rg4T<a7?Ps^caAce5$hISXi;qknKgcrl5rae0yBoMW%KoyMEq6yT`<PmbH$MD$ zwav@aK~(5(svvUrH)R%S`kOo(WRuNCCQv58BgKqVX4De?c!=zc*b>4d_~9Aeqg-QF zE4a_?dR^VMTlWX~c$*g5m}OGm<0F#cNa$?v#6(QNDy+d;?8aVPz$H9}u^9(Xkr_o$ z3L`MKCF>T9NBo2M2jNHLuw5Ks2%j;sXRDs!4l`=WZij!K;^av7Ovev3O%_HUlY`hd z(9~OW^)Y1^CLdF6Z+Dsg4S0sMO<46|3=Sd+ZcX_N;}HZKQXo^+S5M6;-fyB%bGlHN zu@A3NvIXUXP&l=;6DMtr+eP*`XAe<)u<2@lK2nOM$jnT}7a;<%aBfA5hZn{|;2<vG zIljWJHF2OdMqnf+V=lJfINrCm6WpSOv#fdGB2NXD+h?-yro%c<IS(1PjHeBTL&h}` zGQK&Gafagt_O)S40mpD0Puj8<fEc{RM>w@356Fka*SF8?y}kbSdPdeSSnsr8{q5=F zhjee-ux<D8Vtf+!E}S@)ikUo;eY#^KO*O^5@l;mmNbUg=G{iKnTUIimI5MN0sEDTM zjYSBCOh_blw`cRH6NS=+Fjxt-D;a|qrePPZAORV>(K5SPwp}fKzEdKb<JSAU7ZBR> zN^(r%(XK!5XfR>4X|h>nD?h5CI+~$5TA?)rmg60g(TS9G#&Mj+8HD2sUf?B0lk#yG zkI9$@Kdi>r&cp*Za+IlyU1cRdBLz?xMIf^r`ylK=?9tf0oA$1h!z}Yq^DOII?1RqQ zcZyP2bnkA;A})6}We|hLntF<XcE%#&WxVQ{ruFJy_qM&1yfWsJD22MH2W#QVf|UiD zfr6BUnblIDN(bIMqBr_r7UrOCcZvYoW<u13Ls6Sn%!?X7pu>Q=QB~Rh%c$MyDJWo^ zsiln=?aYd}$t06Yr;OB*QW7#s8O<Ktf|00Xl+Ez42g_$qN*9g$&@bTyKESCjC5vPI zSkApU{)I0CD71mv!qG|IzsSRKXa7MrEDvEUAhetMYj^wSvjXDy4JQJdO=h#qKp5m4 zWXz8JIXnk<w1zFQr@?9F5Mh~%GJ7Cf3z+3YpND@2v6(rTeOElj3z&znSmGo8!LXsU z1-!)<OdZB5Vi>zO{fD!>W5NiQVdNUg#yF1SENYIj;|^Br@}M0$V<4X61wJ7W-=U0V z!yXREifrhBF6fG(7>2R<7#kgX^GZ2Ry5{8c=#vbw@+I{lFgh@L%Q^;eY>cTeHzP1r z7mp{=1&7)>X0_Z~MxK)1tO}K(yoI%BWU<I1k;Ng4LKcH80-1Z6bD3M2Qkk;d$Ula6 z*pH=?9&0C>*LBDm<Tcr}jK|5#Abhn?|JrB?qAVFlL77?W;4)q!37?U5B87pclUYCD zAE;AkbNCY_u>h;!C;y(tiXVe91b<DZRm^1FI@7MOl4TZ=Av^v=NmRfDoW=!QgwyPx z?Nd!{Y|LapaYqT%MJZC+8#2Y4a0plN7$2dICuOLE@i>S$<eR`o7gpmk(vdTnV_$fZ zyPRl;1vroYap#BumMtt9!e$cNyBL8$JVqAErZY-Y4rR~>vTS6z1mYTOr;=?n!x$Vz z9KOR^cCy^YOtX_)T)y(@2|O=og2QCd#D?buX^&9wpJnRSl@Q7__+dZJAqmNFq13CO z24oF1#*rDMkiwM(-W%3Jmj!+kad4VVc_3_#ok)1@y4rI8C+`2}EO@pr-TxfZmDYTz zRGG`Nffd+;M0`i~d9*+@#V81@$J+&T2ENq(VrI64@TjzuMBp4OJ0aYG%ER(-7@id9 z5wv@*iTe)9G|Ac3KuxqkTgcg4XPv~joV}cFGkumfncV~2UC82&SR`WDA{HnF;W%V+ z?&2QaA|5h%Z%NjtrL@{aMh-2bVc-g0V5MN^2^p5tv{4wvmIrO0PpfS&Gjt0w205`K z6V$*kY=DeRMxrv2?+OZHC5tmgU?dh|5jJB7PU12WmnCxfo_vB>klEKX$;Moa2x_AZ z_TdO#;~ngYI2-z7FrFYDAHi=qiW7362l_!KAQV|v(PYpOJ<t;uG0~518(X2Q=IGOE zyGlwKM#`cbnxQ#bpbgrhE4rfxe6R@bkY$ZHvdGlLw&@z-u-NqJZ<)L6h(so4mLEk? z3^Fk?5k44%*_ea1*oY%I2bsv5kn!hROE>S&X4*Qo8BlONTb@fCI|+YJZeVZra;zcm z3{_f$c(F*aa@%XpvW8rsJjOBgR8%8|>Ut~>h$RZ|@c}Z{x9e#kNJOs<9QDBjTt_r2 zZDj3+)@Xy?=!5?F@<F@T_N}W7$M<d)=4GrE3}ZPIno*cy+mc|VGiGBWA|PicXJtdw z8Bq?6A!jXTJCJA}ZzB9=wmG-ZS)voRAO!EW*ojA{9ct=b3irttA<IqNu4g$1i?rv^ zY7ghu9#E#PFugO&bb2EikMI@AkdeC~6AGgUN<z*s^HzEg<Um1m!cwfmUS!=)v&8Wo ztfX-TR}uT<HpAuf3?Vz$EuHK$xkr$BC5^l_$<|^`8RHB+RvDuwv84&1{_%bn%k^&N zyoc?`y|fWTBF8?KK#ayDB#L!@&h9}2{Y;B&%yRZIc#W?}#&;-0*cR<jZzqROv49!) z;uJHvghzptITU7SgNc}gmDr9Q2*7RxLMAHVUc$NHbNjaLTg9+-pD?d6m9jm%HfaAE zlf6xv`fGpL_{?t3DyN!+$q-l$nKf&c#^~94#QQs>+0R}$nqoAjVKx>b-2qk)7=j7t zaF9h5je^+W#Wc);+aW3o8xCb53yd7WQAFYfo*fd){7seZ{__9j`Y};0+Sx_kyYNd# zS=RHh7uO&YC=)jrb(pCSGs=C0-tZ_(#&OPuz%ArIL2<(uq4<CbA?!0_8s>*+TdZY* z*kT=IV}3?*p5ql_Q06cTAJ$?6wjuy;@D}#WGCkbk0Z-&WeiX-c>_ASERR|yO4V{8n z+K}TIO$-n4{Fq%<E$u#}dl05!I%Hm^gou?JO#x{_{C}xb?f1K8W@~=tS@NXVo}_$m z5}|m9WVoDS8wh`53Kn54HXvgtTO25ZvZ#gnXn^+U4KECWAJ!rO;h}b=l&g$9#22JH zO~;A+D1b7kh)VbiEztIK(B93aCN_Ul1ByR_aS^xi3NrPoo?>fiWlCfuo@dz1L-n&X z-7wZ^=yi^59qc?$FOFj2G)1^y(6)b?%6lhS?y2hCk6!yqU+yn<<tDwhe5B^GTTZ2U zf|RpZ8|{=%?Am5(VQ$NOdSeJi;5P0eJM)$EFO2f2jN=G}Ow$cK#&c98ebpe-*#d3R z6@MfA|1owK08wS{!^dX^V*rDh0ToaL3={*q19M&1?rvRM*Y2^qMX%k7im~e0Vt2bH zDq>)u*opdnpP9LMt>6D$_rqM6bIyIvbIy&qQ@93iVlRpk2!-^g>QT-X8nMs}$8iSI z$=is-b2O*3ZP50ZEj(P#aU}!&Az2uL@i+$q*+_wuSPRL}PVB}}T*f^}#!BKZXXdJM z+Xj(Hcha6ooe#HpkQez-1jSJNWb)Ly5-jY%PBb~COkU^F!%%XGVp#9-C4gbjH9bYD za2oe;9}m&zwCqU#+3oJFEN~u7_)42099D|8;walS!lSWa=Ms4y*vrPp8Tsq2O{gWU zwMHBC#{dk%U<|=@?18K?HEXb788%_<86IcjHQpo3S!OHpqX7OwV|2%Rd_anGq!884 zG2J_{&>3?u4+YPY3zR|!bVNT4ffZrrZJReT-BU?l`(gl|omNt9@pxjWx76M@#p7R( z=c%4?M?79aIpZksQd>YF-r1OkbY~p}CNKNef+-!rdLupZVSwVdo#%dow|ks51TX(q zFuUBT_V^E$htZLzkid6hKhDD0K-rxhHp3CMfn6TYtzq0b6AETyE!JZPq=86CBgb$C z(%5Z8;|`u79v|=#=`XN-!4KIHi~=Z#miQa((E+_KBrm7y&4Lv}u@;-K8UJE0_Te~A z;2s|13F7b$?=RR6?Di<7_m;@is3anZMk0w*Lc{oyCHwdBMn>_(hW!VhF_0(uD)|6} zRx4~%_j2U$Qp1*zC0q%!zN2#KuoQptHbj%Ma3?288?JjKvrXCS@uxnmE{WP1>4)?| zV*homD34_NRkE&1Qcvxp^iTRGefo91Ti?}F`~IHtE*E*~5x=e%O}*8Q^;vaEq`ZN$ zQYSqEA$2pO2#TT{%A+2d;2-orPmIA>OveoDLnQX&KU_vM?!e^|$5pt(4enNcWQ0G0 zkpopw6SYtqb<iFi&=b9|605KpyRipHaSR{u5ucFyKQ3^<2fiqaKTrwJqc0t^B^>ie zqW4n!D}9xIO5c8+yBKn}CULCP97zAA@6zvI*Skl(@Wgs*ek3=N7s<u1>ph^}+QfSH zoKaTNC8?71{JP%5@9L>(loU$(Bz3>8_n3O?64$4uSkf!0m9+l4-ZSd0Ppqe=Us5k= z{}aEi_ndkWj(W^R85Sv98O_if9ncX|F%z?(U^c?B7F)3m_wfL+_<)Z{a+$Lh<VOJ% z#2=`HTBwb_7-Z$gU<`pQPs4P~#{xv+Fpl6Tj^Q${;0|Jt^a_KCbnu1`vLQS2qX6om zF*=|lI-x(Z4&cW~j6x*#;{eX#JZ>QBiV}Fu<Cd42CCQLvM>6v348J798xluG&75RS zGA7yjb-mZr+n88S&8lQnvMHJTb-hTBq=sAHDyk`$bW5rwyT7lvaZ}<N)nSk!kn~H+ ze_wI<=EREX*vPoZn8-N%zG9t!6Dz6%CW9pdC4=+(idnZLR#Zn(22ci12JZJ2-+!y9 zj<Aew6w+M%UlmVmb*zyMMG6}zoE%<|ifNGvnUNbIsEr0_hriJtz0ez048=06#x~fn z9S3m;XK)tLxPutP{l$-`c!&2eUSp3AH+aB=tO!DO1fvS7q8EB&0<J?jALn7Q-H7wZ zqW4leAsvw5CE(wuasIZ%{Hr~aUP+In7r(FA)s|RM?XGlHx+z`!eZ|o2i51mcNE##s z(*568H1BX!^wuR&^CY>bgH|9XO3_v(U!}@hF0zz<>(SeA&sig_E~%Qap_Ej!R$B>q z&uL%o_Z~wG+jc6PI^?q5crQ7WoZdh@KBDq<CV{5(gk74_R<*QR@-Iqv#18DlHDtcQ zIW)>+GNxb+T%y>w!Vi7X57Y1gA7Q!4t___r3Q@R;H)wo|^N3qKJ@YpU|DXq^VLE1D z78ESOQmn-~tVizKJeENvR6$L&L}&EJK^(#<oJI`p;xS%A7tJmV32}=4vxl$Z{n;bd zOY$VWZw@sB+Pt;ct;w60nx8Y2R&%5+U2u=Kw3@-9WKGSYwzS*c#L`*yp3W36)TCKk z`1ZHL47WN6780%wgtqjSeThv|S{<g*lvamITY6liwzN8sMg~kBOl|3A`?aOjp&meK zb-1;q^B>TbRwu(_&4kdFHXhWLc1{=jY>}BFvqW3^=69vlIVAH(=8nu8ZRyR2G;If{ zvr1-+%#aMsjHf7chdm@}D|Ox6vMN==_#`{d_I>0>N~OgyODg;4ge#LhO@4+khn-D& znzHDvGPzQ~7wHiPX>v~t*Y)6XmkEeKWJVCG-e*;)gSx1P255;^XphdYViXo&A$DLV z&fy{A?<cRVd(MK}15U3|1VvFF4bUC`pg#s+JSJc|W?(KtV_6yIViS@+vRz1H%B^oM z2{{ZmdQk^UAkqIAu|z7-No40C0ZA|thy)=4$ch4KeB?t}0Y{2Qytu%hkEgd^ez#vN zNXW`HoUSS4GX(A5l;CYTXLT0UEu+eE40_Bah}+2VgsT@Qk6NgMW@wHU_#5rf1^?kP z{)poeC~BZS8lWk*Bj_o6n`ay$(I%eDG4aV8=uWZF{yB|cHP)cm3!YoWNA!Kk2)$w# z1_g654~wuE%kdJgkm5Dh9gymEa^;GT=?_DbBl05G=+-1d*Ad!YZl#CPqaUN!M!W3i zi0uLYB2dRSVV+8F@{wl_`QG)zd<)UO^rkZUPHH#O5u!JwI}&y<p|-<31ihhan1}h; zhw!&tt$oM*dCy_sBYWBe4gm=N!c`>R<T(bZ^+sJwTmjz+!e_Ck@O6H5pPz{r+>i>L z1)fmXH<;xin1ZR81qBkv2Yf^t)}I#XkQrH^#whVEz!I#)Dy&8XHee%mV%MAGMeH59 zz%MUgp+la?h1@8G(kO@W@cO`t5%M9qV)HlEH`F_-cm$Yw7_QmJF`Y6$z|_Xdy}CRI zMHy5;MFf+g94L<psEc}NgvJ>EiA@vBu>xDM4ZE-#R?@l#lHPWtb|g}fR!Ol3La{<` z{6n{rh27YL(>Q}m_z&p}_Hoepa~ps{D2$>ghPLR4J_hATpsAgq@^K}1CR68hr;j;b zW}mwFTi&gu_p-kSrN%MkL~m2U5<17P7mqp%-ESHug>-ota-EO8Iiqeox6?5T3YMY2 zi&5F%%GFmXmD%*S;plP4B`x`&bLDFjQ&QWF%(92=LrJMQ6WZDhT#US3(5UNyp6G?X z=!bzAgu$2!&m=~j7jh#6d5|9kPzZ%l1fe*N6S#|eNsNtk_gQ#|M|g@?=$Dl6Fy z1_iS*7xOS5;V7MqhS3m>&=}3oJehJmtErT}suB`p@-n15qvQ!Pc^dAXa@<CoRGI{t zf(`vo$TSO3Hq0<*RBq)prBE&fnR0rQyzjbLkf@{^@k+=Ro)oUqPQIAC5<jYBGc`B7 zJ@G?w6_T4<NuAyF!b{uv$FvZK)=J1wUcHz**tEcq<J2$fhU74v_mZ+|PUblKt*zVQ z^zZ9xbJT)-w1Qf<mU*F`5B^d=_})Gr93jhUt<5RgQmw*mU%bW}q)N_K0S{Q<i8M%y zbO^!)Ttpn6;u&7xC0^qV-XgWpsH=ji=#E{e<7%|>#x|p_E4raOdZHKlpfCDiD28Dq zqHzZw@d*j|j4yC?V^SgyilYQ7A%XYKBwSB8d;R2f=VGLDQTdX`RLT%=Nhy_=2@-cf z>6q7)-e5bg<Y~z5@N+U@{FFm^O(neSNp)t(iylc9)FjK`o;ds4EPH7)_KJFv6}9eY z2I$=Ht7;S2n?6cT)T)J8ZGj8Ft(!&7-ze(n$b;lZa#J1+-PyR&S}9%6#3vUQF-<ab zxcKX~iZW3okB!g=V=#=m!?6mh5stOkiIX^mCwPW<JjWaKNkJdb4-*iY(x@wgvZ#!| z@C?uK5udO+6%%D$Dx+>a4&p3s;U4be6I@dpb@@;V<xmr|F$a6G53k~1#mC0;g)Q7( zK7ah+w)hQp@oSf^jb9i)ZA|<C$BzLlP>|2)=|AvK-dS*8*;&Elp$zS9POChsU`nH8 zcw=@|9v0&?pjmO#68}7sO6l@lNVm0J?w!J@<jHL6ZolNcII}6KVd1485^cLtf<3f1 zCBI8fX*w^-`Sq@-#(zJwqR<MvqSB@p0cuJmjRvx_9G+xgI^M!L>`i9#sh~}&n1Yn9 zWlc>D#>>BKF{B(5K=QXA2k;;6-~nFa4Ww0154H=WgEw-a8@gi<W|}ziU;z%88B0Xt z34AO@T^8g<0o1`^PowS#PI@u{PO)$a*YE%aFLqG~!%T!@E!HCfdvF{l@DNWBho^Y^ zjL+4)dGYbdBPS#OeeC@I@k;x@rE?z7ocwqg|DHX5M!{kBQttA4Z|1|Z6pM6<zKhAC zMD*s1ND5RiWpL?|x3coQm${D8rmZQh@^1xG#xkkZ_scnt;m*&D=~79Tq$_%JRL>_F zOF>p7Yub!;;rEw{eyy9gd`GNO%u^0P6*<q1{Bd|}rz@KB>oZ6NZJOJW-WiZ||1@<t zlr=W=xbovb(-KqXPtyx;?H~m+Fp-eK`nK2MF<oWTL__e^Up5j_)pRa6sXDxWIft?t zw=3`pI!4b8oxnu2e{%YEUKU-wifND`=C`e$&m<LgLgvMPn9NYh@J2(1nBkQZ^lY;N zcxA8s!I1rRH;ehsP=y~}w(fmQMm^hMI{99htjhK3rmQA)PQ0W6a~g(2G37MvG|avB zWAF5}O<%1td!(cXB~4NqUhqXpltM*hPRn#g5Q?FDI-~9%jK>5_#57FDN~}U8_TvB! z;|R{-JY2kux+LCg24)u0A`42R3iA7~BSlNJg@V~wj|gnUCY-{n_$TrAU&Y_Qd?Ehe z?)WY7YqqS|!p&T{xiBq$cl=1_KmIy!OT0{b{!{0#k}8wQP1)Pf<l~e0wkvt*W}eDd zbk5V)qEYsvXNui7zMbnT8}phxmB5;&S{B|_D%*tpOA+}jv<;>E>y)**%z@?*Z7PdP zIvoR1<@!$pQP=b}i<<2ElnjH}negJ=hLNyiu<zxvDy8bNpH_EuY)kpfDZjn8VPQQ} zE<=(VKdqy_>1!rwgQV*$2qAaVoH>l<_95bY91q20zRgN4uO^je>;I2A*VvTRDgz-6 zJaIIld&=!sO!8$?V-;3o4I;1s|6&UcV`zGgz?h49n2#k`ij`P}ZRnK2sOyYT7>zNQ zn1NX|iG^vHj=7kJ<v8ibEWv#|KrEgh4$trft{K_8!xy;_f;@Ql@?G5R8y9aJyLjm0 z4g1oL#H9%P(v9$C+&}wbDhh<%7{k9XnOw@$wx-N!91ngzMSuU`NAcruYjoUq{I=tS zUb*EsKWlqab3$LLtto3-K5&^Vs@dG+%vu{IcPq|uayKz8Hf)RfHqtg89O?C5+Qcq* zCQw@?=BBnvGpVA@@f6Y~snk~Sy!~SpKQ-GcC@PthjP=GiOv|YFwK8oqRE*YEYsH$Z zQmg|0Km+uIRGWq{%)~6L#3~s4*;gPvGQba6kQLbxj1nk`5g3UDScpYfiB$;4T7P3( zT_g+p@fvTCDuA<jcpxp(!5hAK6(4i;(y61T_Q!0wwC>W9bqm&Aax6}_FTNTTKe&I_ z!3zfWckWgk!y0x^S=hytRXNqg<l`La=64+<930~~1JB&n6snxyz^ZiW!Xb8DTaz(A z2V>cJICde`D<{>}L^A|SZq&R;PJ#$q`u@`KSZwfa-fq*iklBv|L7+0ZiOE0te0k|Y zzdPTu?|9rC+s@>z_fpd)DO(Lmje0PYGyhdFKh#sGms<(xz{5Ic8tobMab`(dH|p;1 z>q<t`BR9ri9JF;!_kUa0s@BcrtlvuNVh{#n2u5Kvq}}mYhUIvQXGk7s)EVIl518Ny zFJy#2reYexu@<|qJCGgBeija(a3(GYpeAaeHtM4RTA?*Mpd+jpis2Z6k58kcE=3)` zbof%#zO7GL47V>vtz>bYBFmSeCd$ny7A_6C^zA^UtnO{{FSYUE_xlnKH~q6bSC3Qq zf4<lL^_7lE`Q?G~va>0-2X#IrS*g}JeqXc4Y2U?^B~2bRdy+Xb9hMAfN2%h2-;Pp% zn$0xS$%c1QmyWMMIDR-wXV#XLmw)x(RDEFVubb`3sk-DY49lT5wTI=sIEzpCg0J91 zgmfM-As2EZ9}1%=ilG*|;~(_KKn%tZOu}SLK^W#{HrCS3XJG-BV+F#o5u5QZ&LRp4 z@d>dvFWo$GICkH<`Qrv%>Y2dpcQ?*oc<Yvza$umztgKT^8I&vo*<Cc3rLhA|`ILpF zd0Tg>-ljInWM6ag^w}kKYJbnLtoE7yDjPHNfq{ufXj_dwrj2?xH4(WpD{lQvja+g) zvVYdEr)^+A(<r?~a*_v{yeI*yQux|(4>DcQyQyjVhuT9-Z47~rzYUFTQMjp<-c045 z&?HaWfSSuG&IVFG(Kax|)KYJe^iGE}#gbuX3r6!ry({-fzE?OKc>i+)G7PJs847I( z>c|wz;^@QOxF18X%78^99tE-(bp=rf#Sn_JD2IAzfDssp(HMhq7>}u#ju}{jrC5#? zScz3wj}6#}o!FIyUCJI7_F^9*aRkS39G7twDYJ5fLTZ>`h9|t>gY?LNMtC0mJo@5^ z{d;W7qo*yOaAJae@#0Sl(bJ;kk4fe3XeOdXNh6bvnb%jDkjosPG+ANF=$T(qQ3RTF zXcMevXQVU1XP*9;V2dP65~WF!wgok3OPww3c=l5Zl1fRVCWYD-)Qs+Owy-?@rxr-G zJ;$2-YFkj#&Bq4Wr}~uVKeZs4m#k|tu5CdbfFaHn2E6#O1*?orWAs9A^ua(3!e9)+ zPz=LxjKE|}#WXCzQY^;`ti&p;#d<_wANJz|KH?J+@HwloyzUDNh9FM;krWx>j{rQm zap=jGCpVVNn?7&)xKY+6J=BF(-~Kjlx=v}lf-B9f2J;|u=Ri|VrA10}J|%LNDXXFF zOXVTAdOs!a70ze2r!;5t(q)xCNq;nb(PmBU+EQoMVqX53HH-9EdaLQFwgt80ADu0n ze)Urek_X9wru*6!zGcHP_S;|o)Pf{Rl9UPAkt0amOUaJXDt85bf443tzn4Kdlt%?r zL={v+bu>gf48<@E#|VtXXpF%mOu<yl#VYK_0UX4kAod`KSvZPgID>OIk0{(il57k( zk|8;aaDzKcu)q@;;g0}hLS_UbCvu?#N}(R=qX8ObtHExEg(hf<k1rnHyLIy83&-uQ z)w}-B<sZu`)%KVw$&QGxxm8T=?q$ihGog+lTK49rA(C86o;5kv4zil^;X#fTCcpiu z1<Af-UXyig3+f;obhgm{-A^sZc*sy_hC$ncIx5MsIbvw@UfaTOIi8X}85_;GI2#yg z;%LY{j!|;dul_+>-+nli0hGbh44gIsbsQTwBPjOqrxs*LWi(|ZTcd3@b*d-ffNcHt zS6w@ndtxlcVLT>a5+)-Iv!GxVc4H6rVjuS70FL1VPT~e`B58IeE0V(qSGdEPf*)ph z!V9^P2hGs}Ezt_C(H8B{8C}s0R;<EmtU)-|VLkrER&2vjynFTZ`ibj&RQ9gKrC`V6 zYR#WD%QF)T%Y*-JSGfFKV-II^wR&@c$4pM4to&?hsGN;Anca(#SbGY`ImaT)r=P|` zvML$XWK%nuYI65DTkuHusRhZm<XV$wXA5!82_;!ip4~B_KK<N)41gqGlXq<h>M*o) zw(#JyHiQ_N(o~kg&<upO0d-tfI~zFvMcaUVPRmfqFlmNJ+k!e`Pn<36{`zAJRvFCW zc!bAzf;c=yJf7n%-s1yYgPCnej|}jGKLU^mnGuYf$b|x^h6ZSeMre#CXco-=xj74M z@i*F|Cq`j3#$YVQVLWDGHs)XhHsLr<;3Q7rG|u82F5@b$fe&^$A@g-}#Of2zXR6CN z_(gliw<6#EDi1N`Kbf^tmFn@Pik?L!O_Cx_dYp-mlF8#tmS3=a^0=(hx!C?0Vw$42 zNV+6dnlxz#OwC#&XT|AywW8!ra;8a_wxXK7(aws44OE<OnyNQbM^dOspSGTw&6Cc0 z?OoIrN<Jl*nmlSNs%fp6!_mdsNt_j}lI&Lq&0*BlKut73Q#3~lbb^A}n1i{Phxu5H zrC5e7ID(@%hT}MalZe4R+{Y&*AZ1QtK3%GuJQjcl_yP}x)V68i<b`}ijI~dX&f2Ah z{80vWT1s<}5;4$JBymslr?T~#X|89W1YZaB;p~7j3vcCNpxU3=jw~2TCAD>bPu4Bc zG3k`1L(X~|WqxpvbnmD$d6|-_S(lDVCp8_^W?k)Xs+^9!QmW*(?$1rr^k!#w<u)CB za;irr`$?E&!UWCTI$wS-hT^D#s;GwQsDYZOkA`T3HfW39Sb>$;he+(lVI09x9K&&( zz{#A(hJ2VEW0Q-AX-Ewd%m_gqsOLl4)1k0kgTuOnt#<sWE$2<UPBK=h98V>btL$n2 zDB!)bOxcp3b#>7tGwPL)&zyg!QcO9N+Mi9Clp0s~F=3#ovExiBh@{wiUDc61mk-I+ ztV`de-<m#av#zG#n6u(NqgqiqDxH-6Is2upsCF|?F2_bv#ZBEvq|<qk5BX6512F_= za0%CN9XIg?$#Qe7!5Q2~Jl-HI4;vDeVl#T=<<vSKr+f&_�mnTA~fw<~MfH^=4r@ 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 QYt^Zol;nAoFUn#5U)TGZBLDyZ diff --git a/usrguide/userguide.doc b/usrguide/userguide.doc index c329ef15705fe47031787ead346734086eda850c..8d16e8b72c5a81902de5f2c9d75fddf2d28832c4 100644 GIT binary patch delta 25944 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%0A%IB5I-$Mq@lq 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 delta 25691 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 IH6~d82Q|8*$N&HU diff --git a/xsdconvert/GeneralFunctions.cc b/xsdconvert/GeneralFunctions.cc index f4817a658..c1dd36f99 100644 --- a/xsdconvert/GeneralFunctions.cc +++ b/xsdconvert/GeneralFunctions.cc @@ -8,6 +8,7 @@ #include "GeneralFunctions.hh" #include "SimpleType.hh" #include "TTCN3Module.hh" +#include "ImportStatement.hh" #include <cctype> // for using "toupper" function #include <cstring> @@ -15,7 +16,18 @@ #include <cmath> #include <regex.h> +#include "../common/version_internal.h" + +#include <ctime> + +#if defined(WIN32) && !defined(MINGW) +#include <cygwin/version.h> +#include <sys/cygwin.h> +#include <limits.h> +#endif + extern bool w_flag_used; +extern bool t_flag_used; // XSDName2TTCN3Name function: // Parameters: @@ -656,7 +668,7 @@ RootType * lookup(const List<TTCN3Module*> mods, RootType *lookup1(const TTCN3Module *module, const Mstring& name, const Mstring& nsuri, const RootType *reference, wanted w) { if (nsuri != module->getTargetNamespace()) return NULL; - + for (List<RootType*>::iterator type = module->getDefinedTypes().begin(); type; type = type->Next) { switch (type->Data->getConstruct()) { case c_simpleType: @@ -685,7 +697,16 @@ RootType *lookup1(const TTCN3Module *module, break; } } - + + //Check for an include with NoTargetNamespace to look for the type + //XSD to TTCN ETSI standard 5.1.2 + for(List<RootType*>::iterator it = module->getDefinedTypes().begin(); it; it = it->Next) { + if (it->Data != NULL && it->Data->getConstruct() == c_include && + ((ImportStatement*)(it->Data))->getSourceModule() != NULL && + ((ImportStatement*)(it->Data))->getSourceModule()->getTargetNamespace() == Mstring("NoTargetNamespace")) { + return lookup1(((ImportStatement*)(it->Data))->getSourceModule(), name, Mstring("NoTargetNamespace"), reference, w); + } + } return NULL; } @@ -707,3 +728,56 @@ int multi(const TTCN3Module *module, ReferenceData const& outside_reference, } return multiplicity; } + +void generate_TTCN3_header(FILE * file, const char * modulename, const bool timestamp /* = true */) { + time_t time_current = time(NULL); + fprintf(file, + "/*******************************************************************************\n" + ); + if (t_flag_used) { + fprintf(file, + "* Copyright Ericsson Telecom AB\n" + "*\n" + "* XSD to TTCN-3 Translator\n" + "*\n" + ); + } else { + fprintf(file, + "* Copyright (c) 2000-%-4d Ericsson Telecom AB\n" + "*\n" + "* XSD to TTCN-3 Translator version: %-40s\n" + "*\n", + 1900 + (localtime(&time_current))->tm_year, + PRODUCT_NUMBER + ); + } + fprintf(file, + "* All rights reserved. This program and the accompanying materials\n" + "* are made available under the terms of the Eclipse Public License v1.0\n" + "* which accompanies this distribution, and is available at\n" + "* http://www.eclipse.org/legal/epl-v10.html\n" + "*******************************************************************************/\n" + "//\n" + "// File: %s.ttcn\n" + "// Description:\n" + "// References:\n" + "// Rev:\n" + "// Prodnr:\n", + modulename + ); + if (t_flag_used || !timestamp) { + fprintf(file, + "// Updated:\n" + ); + } else { + fprintf(file, + "// Updated: %s", + ctime(&time_current) + ); + } + fprintf(file, + "// Contact: http://ttcn.ericsson.se\n" + "//\n" + "////////////////////////////////////////////////////////////////////////////////\n" + ); +} \ No newline at end of file diff --git a/xsdconvert/GeneralFunctions.hh b/xsdconvert/GeneralFunctions.hh index ac98df655..e89145987 100644 --- a/xsdconvert/GeneralFunctions.hh +++ b/xsdconvert/GeneralFunctions.hh @@ -67,6 +67,8 @@ RootType *lookup1(const TTCN3Module *module, int multi(const TTCN3Module *module, ReferenceData const& outside_reference, const RootType *obj); +void generate_TTCN3_header(FILE * file, const char* modulename, const bool timestamp = true); + inline unsigned long long llmin(unsigned long long l, unsigned long long r) { return l < r ? l : r; } diff --git a/xsdconvert/ImportStatement.hh b/xsdconvert/ImportStatement.hh index 829631892..03990a573 100644 --- a/xsdconvert/ImportStatement.hh +++ b/xsdconvert/ImportStatement.hh @@ -48,6 +48,8 @@ public: void validityChecking() { } void printToFile(FILE * file); + + const TTCN3Module* getSourceModule() { return source_module; } void dump(unsigned int depth) const; }; diff --git a/xsdconvert/TTCN3Module.cc b/xsdconvert/TTCN3Module.cc index 896e36f51..8f84e10cb 100644 --- a/xsdconvert/TTCN3Module.cc +++ b/xsdconvert/TTCN3Module.cc @@ -15,8 +15,6 @@ #include "../common/version_internal.h" -#include <ctime> - #if defined(WIN32) && !defined(MINGW) #include <cygwin/version.h> #include <sys/cygwin.h> @@ -24,7 +22,6 @@ #endif extern bool e_flag_used; -extern bool t_flag_used; extern bool z_flag_used; TTCN3Module::TTCN3Module(const char * a_filename, XMLParser * a_parser) @@ -206,59 +203,6 @@ void TTCN3Module::replaceLastMainType(RootType * t) { actualXsdConstruct = t->getConstruct(); } -void TTCN3Module::generate_TTCN3_header(FILE * file) { - time_t time_current = time(NULL); - fprintf(file, - "/*******************************************************************************\n" - ); - if (t_flag_used) { - fprintf(file, - "* Copyright Ericsson Telecom AB\n" - "*\n" - "* XSD to TTCN-3 Translator\n" - "*\n" - ); - } else { - fprintf(file, - "* Copyright (c) 2000-%-4d Ericsson Telecom AB\n" - "*\n" - "* XSD to TTCN-3 Translator version: %-40s\n" - "*\n", - 1900 + (localtime(&time_current))->tm_year, - PRODUCT_NUMBER - ); - } - fprintf(file, - "* All rights reserved. This program and the accompanying materials\n" - "* are made available under the terms of the Eclipse Public License v1.0\n" - "* which accompanies this distribution, and is available at\n" - "* http://www.eclipse.org/legal/epl-v10.html\n" - "*******************************************************************************/\n" - "//\n" - "// File: %s.ttcn\n" - "// Description:\n" - "// References:\n" - "// Rev:\n" - "// Prodnr:\n", - modulename.c_str() - ); - if (t_flag_used) { - fprintf(file, - "// Updated:\n" - ); - } else { - fprintf(file, - "// Updated: %s", - ctime(&time_current) - ); - } - fprintf(file, - "// Contact: http://ttcn.ericsson.se\n" - "//\n" - "////////////////////////////////////////////////////////////////////////////////\n" - ); -} - void TTCN3Module::generate_TTCN3_fileinfo(FILE * file) { fprintf(file, "//\t- %s\n" diff --git a/xsdconvert/TTCN3Module.hh b/xsdconvert/TTCN3Module.hh index 96887c99e..3b33d2c61 100644 --- a/xsdconvert/TTCN3Module.hh +++ b/xsdconvert/TTCN3Module.hh @@ -101,7 +101,6 @@ public: FormValue a_attributeFormDefault, BlockValue a_blockDefault); - void generate_TTCN3_header(FILE * file); void generate_TTCN3_fileinfo(FILE * file); void generate_TTCN3_modulestart(FILE * file); void generate_TTCN3_included_types(FILE * file); diff --git a/xsdconvert/TTCN3ModuleInventory.cc b/xsdconvert/TTCN3ModuleInventory.cc index 53b031d98..794849608 100644 --- a/xsdconvert/TTCN3ModuleInventory.cc +++ b/xsdconvert/TTCN3ModuleInventory.cc @@ -231,7 +231,7 @@ void TTCN3ModuleInventory::moduleGeneration() { setvbuf(file, NULL, _IONBF, 0); #endif - module->Data->generate_TTCN3_header(file); + generate_TTCN3_header(file, module->Data->getModulename().c_str()); fprintf(file, "//\tGenerated from file(s):\n"); diff --git a/xsdconvert/converter.cc b/xsdconvert/converter.cc index f41827d00..f2dbc288b 100644 --- a/xsdconvert/converter.cc +++ b/xsdconvert/converter.cc @@ -269,21 +269,23 @@ static bool checkFailure() { } static bool generatePredefinedModules() { - struct stat stFileInfo; - // Only generate the missing predefined modules. - if (stat("UsefulTtcn3Types.ttcn", &stFileInfo) != 0) { + //struct stat stFileInfo; + // Only generate the missing predefined modules. + // Generate, because the copyright is now generated into the modules. + //if (stat("UsefulTtcn3Types.ttcn", &stFileInfo) != 0) { extern const char *moduleUsefulTtcn3Types; FILE *fileUsefulTtcn3Types = fopen("UsefulTtcn3Types.ttcn", "w"); if (fileUsefulTtcn3Types == NULL) { fprintf(stderr, "ERROR:\nCannot create file UsefulTtcn3Types.ttcn!\n"); return false; } + generate_TTCN3_header(fileUsefulTtcn3Types, "UsefulTtcn3Types", false); fprintf(fileUsefulTtcn3Types, "%s", moduleUsefulTtcn3Types); if (!q_flag_used) { fprintf(stderr, "Notify: File \'UsefulTtcn3Types.ttcn\' was generated.\n"); } fclose(fileUsefulTtcn3Types); - } + //} //XSD.ttcn changed //if (stat("XSD.ttcn", &stFileInfo) != 0) { @@ -293,6 +295,7 @@ static bool generatePredefinedModules() { fprintf(stderr, "ERROR:\nCannot create file XSD.ttcn!\n"); return false; } + generate_TTCN3_header(fileXsd, "XSD", false); fprintf(fileXsd, "%s", moduleXSD); if (!q_flag_used) { fprintf(stderr, "Notify: File \'XSD.ttcn\' was generated.\n"); -- GitLab