From 81750ed3d8119e8e522e36848367ff61052ececa Mon Sep 17 00:00:00 2001 From: Matthias Koefferlein Date: Sat, 23 May 2020 16:23:40 +0200 Subject: [PATCH] Tiling processor enabling for text input/output, updated tests. --- src/db/db/dbAsIfFlatEdges.cc | 4 +- src/db/db/dbAsIfFlatTexts.cc | 2 +- src/db/db/dbTilingProcessor.cc | 95 +++++++++++++++++++---- src/db/db/dbTilingProcessor.h | 33 +++++++- src/db/db/gsiDeclDbTilingProcessor.cc | 107 +++++++++++++++++++++++--- testdata/drc/.drcSuiteTests.drc.swp | Bin 0 -> 36864 bytes testdata/drc/.drctest.drc.swp | Bin 0 -> 16384 bytes testdata/drc/drcSuiteTests.drc | 40 ++++++++++ testdata/drc/drcSuiteTests_au1.oas | Bin 13529 -> 13710 bytes testdata/drc/drcSuiteTests_au2.oas | Bin 61677 -> 62065 bytes testdata/drc/drcSuiteTests_au3.oas | Bin 1189162 -> 1192903 bytes testdata/drc/drcSuiteTests_au4.oas | Bin 61762 -> 61941 bytes testdata/drc/drcSuiteTests_au5.oas | Bin 13331 -> 13509 bytes testdata/drc/drcSuiteTests_au6.oas | Bin 19829 -> 20007 bytes testdata/drc/drctest.gds | Bin 3064 -> 3128 bytes 15 files changed, 250 insertions(+), 31 deletions(-) create mode 100644 testdata/drc/.drcSuiteTests.drc.swp create mode 100644 testdata/drc/.drctest.drc.swp diff --git a/src/db/db/dbAsIfFlatEdges.cc b/src/db/db/dbAsIfFlatEdges.cc index 9cb62ba1a..588eaf462 100644 --- a/src/db/db/dbAsIfFlatEdges.cc +++ b/src/db/db/dbAsIfFlatEdges.cc @@ -180,7 +180,7 @@ AsIfFlatEdges::pull_generic (const Edges &edges) const { db::box_scanner scanner (report_progress (), progress_desc ()); - AddressableEdgeDelivery e (begin (), true); + AddressableEdgeDelivery e (begin (), has_valid_edges ()); for ( ; ! e.at_end (); ++e) { scanner.insert (e.operator-> (), 1); @@ -507,7 +507,7 @@ AsIfFlatEdges::run_check (db::edge_relation_type rel, const Edges *other, db::Co db::box_scanner scanner (report_progress (), progress_desc ()); scanner.reserve (size () + (other ? other->size () : 0)); - AddressableEdgeDelivery e (begin_merged (), has_valid_edges ()); + AddressableEdgeDelivery e (begin_merged (), has_valid_merged_edges ()); size_t n = 0; for ( ; ! e.at_end (); ++e) { diff --git a/src/db/db/dbAsIfFlatTexts.cc b/src/db/db/dbAsIfFlatTexts.cc index a3b8a1958..fe9c86da3 100644 --- a/src/db/db/dbAsIfFlatTexts.cc +++ b/src/db/db/dbAsIfFlatTexts.cc @@ -342,7 +342,7 @@ AsIfFlatTexts::pull_generic (const Region &other) const db::box_scanner2 scanner (report_progress (), progress_desc ()); - AddressableTextDelivery e (begin (), true); + AddressableTextDelivery e (begin (), has_valid_texts ()); for ( ; ! e.at_end (); ++e) { scanner.insert1 (e.operator-> (), 0); diff --git a/src/db/db/dbTilingProcessor.cc b/src/db/db/dbTilingProcessor.cc index 7682293eb..db3604562 100644 --- a/src/db/db/dbTilingProcessor.cc +++ b/src/db/db/dbTilingProcessor.cc @@ -164,6 +164,34 @@ private: const db::ICplxTrans m_trans; }; +/** + * @brief A helper class for the generic implementation of the text collection insert functionality + */ +class TextsInserter +{ +public: + TextsInserter (db::Texts *texts, const db::ICplxTrans &trans) + : mp_texts (texts), m_trans (trans) + { + // .. nothing yet .. + } + + template + void operator() (const T &) + { + // .. discard anything except Texts .. + } + + void operator() (const db::Text &t) + { + mp_texts->insert (t.transformed (m_trans)); + } + +private: + db::Texts *mp_texts; + const db::ICplxTrans m_trans; +}; + class TileLayoutOutputReceiver : public db::TileOutputReceiver { @@ -271,6 +299,26 @@ private: db::EdgePairs *mp_edge_pairs; }; +class TileTextsOutputReceiver + : public db::TileOutputReceiver +{ +public: + TileTextsOutputReceiver (db::Texts *texts) + : mp_texts (texts) + { + // .. nothing yet .. + } + + void put (size_t /*ix*/, size_t /*iy*/, const db::Box &tile, size_t /*id*/, const tl::Variant &obj, double /*dbu*/, const db::ICplxTrans &trans, bool clip) + { + TextsInserter inserter (mp_texts, trans); + insert_var (inserter, obj, tile, clip); + } + +private: + db::Texts *mp_texts; +}; + class TilingProcessorJob : public tl::JobBase { @@ -395,6 +443,7 @@ private: TilingProcessorJob *mp_job; void do_perform (const TilingProcessorTask *task); + void make_input_var (const TilingProcessor::InputSpec &is, const db::RecursiveShapeIterator *iter, tl::Eval &eval, double sf); }; class TilingProcessorReceiverFunction @@ -452,6 +501,24 @@ public: } }; +void +TilingProcessorWorker::make_input_var (const TilingProcessor::InputSpec &is, const db::RecursiveShapeIterator *iter, tl::Eval &eval, double sf) +{ + if (! iter) { + iter = &is.iter; + } + + if (is.type == TilingProcessor::TypeRegion) { + eval.set_var (is.name, tl::Variant (db::Region (*iter, db::ICplxTrans (sf) * is.trans, is.merged_semantics))); + } else if (is.type == TilingProcessor::TypeEdges) { + eval.set_var (is.name, tl::Variant (db::Edges (*iter, db::ICplxTrans (sf) * is.trans, is.merged_semantics))); + } else if (is.type == TilingProcessor::TypeEdgePairs) { + eval.set_var (is.name, tl::Variant (db::EdgePairs (*iter, db::ICplxTrans (sf) * is.trans))); + } else if (is.type == TilingProcessor::TypeTexts) { + eval.set_var (is.name, tl::Variant (db::Texts (*iter, db::ICplxTrans (sf) * is.trans))); + } +} + void TilingProcessorWorker::do_perform (const TilingProcessorTask *tile_task) { @@ -492,11 +559,7 @@ TilingProcessorWorker::do_perform (const TilingProcessorTask *tile_task) if (! mp_job->has_tiles ()) { - if (i->region) { - eval.set_var (i->name, tl::Variant (db::Region (i->iter, db::ICplxTrans (sf) * i->trans, i->merged_semantics))); - } else { - eval.set_var (i->name, tl::Variant (db::Edges (i->iter, db::ICplxTrans (sf) * i->trans, i->merged_semantics))); - } + make_input_var (*i, 0, eval, sf); } else { @@ -509,11 +572,7 @@ TilingProcessorWorker::do_perform (const TilingProcessorTask *tile_task) iter.confine_region (region_dbu); } - if (i->region) { - eval.set_var (i->name, tl::Variant (db::Region (iter, db::ICplxTrans (sf) * i->trans, i->merged_semantics))); - } else { - eval.set_var (i->name, tl::Variant (db::Edges (iter, db::ICplxTrans (sf) * i->trans, i->merged_semantics))); - } + make_input_var (*i, &iter, eval, sf); } @@ -559,7 +618,7 @@ TilingProcessor::TilingProcessor () } void -TilingProcessor::input (const std::string &name, const db::RecursiveShapeIterator &iter, const db::ICplxTrans &trans, bool as_region, bool merged_semantics) +TilingProcessor::input (const std::string &name, const db::RecursiveShapeIterator &iter, const db::ICplxTrans &trans, Type type, bool merged_semantics) { if (m_inputs.empty () && iter.layout ()) { m_dbu = iter.layout ()->dbu (); @@ -568,7 +627,7 @@ TilingProcessor::input (const std::string &name, const db::RecursiveShapeIterato m_inputs.back ().name = name; m_inputs.back ().iter = iter; m_inputs.back ().trans = trans; - m_inputs.back ().region = as_region; + m_inputs.back ().type = type; m_inputs.back ().merged_semantics = merged_semantics; } @@ -699,7 +758,17 @@ TilingProcessor::output (const std::string &name, db::EdgePairs &edge_pairs) m_outputs.back ().receiver = new TileEdgePairsOutputReceiver (&edge_pairs); } -void +void +TilingProcessor::output (const std::string &name, db::Texts &texts) +{ + m_top_eval.set_var (name, m_outputs.size ()); + m_outputs.push_back (OutputSpec ()); + m_outputs.back ().name = name; + m_outputs.back ().id = 0; + m_outputs.back ().receiver = new TileTextsOutputReceiver (&texts); +} + +void TilingProcessor::output (const std::string &name, db::Edges &edges) { m_top_eval.set_var (name, m_outputs.size ()); diff --git a/src/db/db/dbTilingProcessor.h b/src/db/db/dbTilingProcessor.h index 0419f74a8..7a4359d34 100644 --- a/src/db/db/dbTilingProcessor.h +++ b/src/db/db/dbTilingProcessor.h @@ -346,6 +346,20 @@ void insert (X &inserter, const db::EdgePairs &data, const db::Box &tile, bool c } } +/** + * @brief Delivery of tiling processor output + * This utility is put between the container and the receiver. + * The inserter is an object having an operator() that takes the object. + * This function is responsible for preparing (i.e. clipping) and delivering the output. + */ +template +void insert (X &inserter, const db::Texts &data, const db::Box &tile, bool clip) +{ + for (db::Texts::const_iterator o = data.begin (); ! o.at_end (); ++o) { + insert (inserter, *o, tile, clip); + } +} + /** * @brief Delivery of tiling processor output * This utility is put between the container and the receiver. @@ -364,6 +378,9 @@ bool insert_var (X &inserter, const tl::Variant &obj, const db::Box &tile, bool } else if (obj.is_user ()) { insert (inserter, obj.to_user (), tile, clip); return true; + } else if (obj.is_user ()) { + insert (inserter, obj.to_user (), tile, clip); + return true; } else if (obj.is_user ()) { insert (inserter, obj.to_user (), tile, clip); return true; @@ -417,6 +434,8 @@ bool insert_var (X &inserter, const tl::Variant &obj, const db::Box &tile, bool class DB_PUBLIC TilingProcessor { public: + enum Type { TypeRegion, TypeEdges, TypeEdgePairs, TypeTexts }; + /** * @brief Constructor */ @@ -441,7 +460,7 @@ public: * The transformation can be used to convert between database units. * If "as_region" is false, the input is taken as edge input. */ - void input (const std::string &name, const db::RecursiveShapeIterator &iter, const db::ICplxTrans &trans = db::ICplxTrans (), bool as_region = true, bool merged_semantics = true); + void input (const std::string &name, const db::RecursiveShapeIterator &iter, const db::ICplxTrans &trans = db::ICplxTrans (), Type type = TypeRegion, bool merged_semantics = true); /** * @brief Specifies the output @@ -489,6 +508,14 @@ public: */ void output (const std::string &name, db::EdgePairs &edge_pairs); + /** + * @brief Specifies output to an text collection + * + * This version will specify output to a Texts object. + * Only texts will be stored. + */ + void output (const std::string &name, db::Texts &texts); + /** * @brief Specifies output to an edge collection * @@ -624,11 +651,11 @@ private: struct InputSpec { - InputSpec () : region (false), merged_semantics (false) { } + InputSpec () : type (TilingProcessor::TypeRegion), merged_semantics (false) { } std::string name; db::RecursiveShapeIterator iter; db::ICplxTrans trans; - bool region; + TilingProcessor::Type type; bool merged_semantics; }; diff --git a/src/db/db/gsiDeclDbTilingProcessor.cc b/src/db/db/gsiDeclDbTilingProcessor.cc index bfa92fc79..13e525f19 100644 --- a/src/db/db/gsiDeclDbTilingProcessor.cc +++ b/src/db/db/gsiDeclDbTilingProcessor.cc @@ -255,6 +255,11 @@ static void tp_output_edge_pairs (db::TilingProcessor *proc, const std::string & proc->output (name, edge_pairs); } +static void tp_output_texts (db::TilingProcessor *proc, const std::string &name, db::Texts &texts) +{ + proc->output (name, texts); +} + static void tp_output_double (db::TilingProcessor *proc, const std::string &name, double *v) { proc->output (name, 0, new DoubleCollectingTileOutputReceiver (v), db::ICplxTrans ()); @@ -311,25 +316,49 @@ static void tp_input7 (db::TilingProcessor *proc, const std::string &name, const static void tp_input8 (db::TilingProcessor *proc, const std::string &name, const db::Region ®ion) { std::pair it = region.begin_iter (); - proc->input (name, it.first, it.second, true /*as polygons*/, region.merged_semantics ()); + proc->input (name, it.first, it.second, db::TilingProcessor::TypeRegion, region.merged_semantics ()); } static void tp_input9 (db::TilingProcessor *proc, const std::string &name, const db::Region ®ion, const db::ICplxTrans &trans) { std::pair it = region.begin_iter (); - proc->input (name, it.first, trans * it.second, true /*as polygons*/, region.merged_semantics ()); + proc->input (name, it.first, trans * it.second, db::TilingProcessor::TypeRegion, region.merged_semantics ()); } static void tp_input10 (db::TilingProcessor *proc, const std::string &name, const db::Edges &edges) { std::pair it = edges.begin_iter (); - proc->input (name, it.first, it.second, false /*not as polygons*/, edges.merged_semantics ()); + proc->input (name, it.first, it.second, db::TilingProcessor::TypeEdges, edges.merged_semantics ()); } static void tp_input11 (db::TilingProcessor *proc, const std::string &name, const db::Edges &edges, const db::ICplxTrans &trans) { std::pair it = edges.begin_iter (); - proc->input (name, it.first, trans * it.second, false /*not as polygons*/, edges.merged_semantics ()); + proc->input (name, it.first, trans * it.second, db::TilingProcessor::TypeEdges, edges.merged_semantics ()); +} + +static void tp_input12 (db::TilingProcessor *proc, const std::string &name, const db::EdgePairs &edge_pairs) +{ + std::pair it = edge_pairs.begin_iter (); + proc->input (name, it.first, it.second, db::TilingProcessor::TypeEdgePairs); +} + +static void tp_input13 (db::TilingProcessor *proc, const std::string &name, const db::EdgePairs &edge_pairs, const db::ICplxTrans &trans) +{ + std::pair it = edge_pairs.begin_iter (); + proc->input (name, it.first, trans * it.second, db::TilingProcessor::TypeEdgePairs); +} + +static void tp_input14 (db::TilingProcessor *proc, const std::string &name, const db::Texts &texts) +{ + std::pair it = texts.begin_iter (); + proc->input (name, it.first, it.second, db::TilingProcessor::TypeTexts); +} + +static void tp_input15 (db::TilingProcessor *proc, const std::string &name, const db::Texts &texts, const db::ICplxTrans &trans) +{ + std::pair it = texts.begin_iter (); + proc->input (name, it.first, trans * it.second, db::TilingProcessor::TypeTexts); } Class decl_TilingProcessor ("db", "TilingProcessor", @@ -385,16 +414,16 @@ Class decl_TilingProcessor ("db", "TilingProcessor", method_ext ("input", &tp_input8, gsi::arg ("name"), gsi::arg ("region"), "@brief Specifies input for the tiling processor\n" "This method will establish an input channel for the processor. This version receives input from a \\Region object. " - "Regions don't always come with a database unit, hence a database unit should be specified with the \\dbu= method if only " - "regions and edges are used as input.\n" + "Regions don't always come with a database unit, hence a database unit should be specified with the \\dbu= method unless " + "a layout object is specified as input too.\n" "\n" "The name specifies the variable under which the input can be used in the scripts." ) + method_ext ("input", &tp_input9, gsi::arg ("name"), gsi::arg ("region"), gsi::arg ("trans"), "@brief Specifies input for the tiling processor\n" "This method will establish an input channel for the processor. This version receives input from a \\Region object. " - "Regions don't always come with a database unit, hence a database unit should be specified with the \\dbu= method if only " - "regions and edges are used as input.\n" + "Regions don't always come with a database unit, hence a database unit should be specified with the \\dbu= method unless " + "a layout object is specified as input too.\n" "\n" "The name specifies the variable under which the input can be used in the scripts." "\n" @@ -403,22 +432,62 @@ Class decl_TilingProcessor ("db", "TilingProcessor", method_ext ("input", &tp_input10, gsi::arg ("name"), gsi::arg ("edges"), "@brief Specifies input for the tiling processor\n" "This method will establish an input channel for the processor. This version receives input from an \\Edges object. " - "Edge collections don't always come with a database unit, hence a database unit should be specified with the \\dbu= method if only " - "regions and edges are used as input.\n" + "Edge collections don't always come with a database unit, hence a database unit should be specified with the \\dbu= method unless " + "a layout object is specified as input too.\n" "\n" "The name specifies the variable under which the input can be used in the scripts." ) + method_ext ("input", &tp_input11, gsi::arg ("name"), gsi::arg ("edges"), gsi::arg ("trans"), "@brief Specifies input for the tiling processor\n" "This method will establish an input channel for the processor. This version receives input from an \\Edges object. " - "Edge collections don't always come with a database unit, hence a database unit should be specified with the \\dbu= method if only " - "regions and edges are used as input.\n" + "Edge collections don't always come with a database unit, hence a database unit should be specified with the \\dbu= method unless " + "a layout object is specified as input too.\n" "\n" "The name specifies the variable under which the input can be used in the scripts." "\n" "This variant allows one to specify an additional transformation too. It has been introduced in version 0.23.2.\n" "\n" ) + + method_ext ("input", &tp_input12, gsi::arg ("name"), gsi::arg ("edge_pairs"), + "@brief Specifies input for the tiling processor\n" + "This method will establish an input channel for the processor. This version receives input from an \\EdgePairs object. " + "Edge pair collections don't always come with a database unit, hence a database unit should be specified with the \\dbu= method unless " + "a layout object is specified as input too.\n" + "\n" + "The name specifies the variable under which the input can be used in the scripts." + "\n" + "This variant has been introduced in version 0.27.\n" + ) + + method_ext ("input", &tp_input13, gsi::arg ("name"), gsi::arg ("edge_pairs"), gsi::arg ("trans"), + "@brief Specifies input for the tiling processor\n" + "This method will establish an input channel for the processor. This version receives input from an \\EdgePairs object. " + "Edge pair collections don't always come with a database unit, hence a database unit should be specified with the \\dbu= method unless " + "a layout object is specified as input too.\n" + "\n" + "The name specifies the variable under which the input can be used in the scripts." + "\n" + "This variant has been introduced in version 0.27.\n" + ) + + method_ext ("input", &tp_input14, gsi::arg ("name"), gsi::arg ("texts"), + "@brief Specifies input for the tiling processor\n" + "This method will establish an input channel for the processor. This version receives input from an \\Texts object. " + "Text collections don't always come with a database unit, hence a database unit should be specified with the \\dbu= method unless " + "a layout object is specified as input too.\n" + "\n" + "The name specifies the variable under which the input can be used in the scripts." + "\n" + "This variant has been introduced in version 0.27.\n" + ) + + method_ext ("input", &tp_input15, gsi::arg ("name"), gsi::arg ("texts"), gsi::arg ("trans"), + "@brief Specifies input for the tiling processor\n" + "This method will establish an input channel for the processor. This version receives input from an \\Texts object. " + "Text collections don't always come with a database unit, hence a database unit should be specified with the \\dbu= method unless " + "a layout object is specified as input too.\n" + "\n" + "The name specifies the variable under which the input can be used in the scripts." + "\n" + "This variant has been introduced in version 0.27.\n" + ) + method ("var", &db::TilingProcessor::var, gsi::arg ("name"), gsi::arg ("value"), "@brief Defines a variable for the tiling processor script\n" "\n" @@ -525,6 +594,20 @@ Class decl_TilingProcessor ("db", "TilingProcessor", "@param name The name of the channel\n" "@param edge_pairs The \\EdgePairs object to which the data is sent\n" ) + + method_ext ("output", &tp_output_texts, gsi::arg ("name"), gsi::arg ("texts"), + "@brief Specifies output to an \\Texts object\n" + "This method will establish an output channel to an \\Texts object. The output sent to that channel " + "will be put into the specified edge pair collection.\n" + "Only \\Text objects are accepted. Other objects are discarded.\n" + "\n" + "The name is the name which must be used in the _output function of the scripts in order to " + "address that channel.\n" + "\n" + "@param name The name of the channel\n" + "@param texts The \\Texts object to which the data is sent\n" + "\n" + "This variant has been introduced in version 0.27." + ) + method_ext ("output", &tp_output_double, gsi::arg ("name"), gsi::arg ("sum"), "@brief Specifies output to single value\n" "This method will establish an output channel which sums up float data delivered by calling the _output function.\n" diff --git a/testdata/drc/.drcSuiteTests.drc.swp b/testdata/drc/.drcSuiteTests.drc.swp new file mode 100644 index 0000000000000000000000000000000000000000..fd3a3af2f0e88356c2a0181773152b009977fb83 GIT binary patch literal 36864 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 TdDJGn*%r&-ztti&wY~ilt(p?X literal 0 HcmV?d00001 diff --git a/testdata/drc/drcSuiteTests.drc b/testdata/drc/drcSuiteTests.drc index be4c43ed6..969736ce9 100644 --- a/testdata/drc/drcSuiteTests.drc +++ b/testdata/drc/drcSuiteTests.drc @@ -15,8 +15,10 @@ def run_testsuite(dm, ic, tiled = false, hier = false) lb = 100 a = polygons(RBA::LayerInfo::new(1, 0)) + at = labels(1) b = polygons(2) c = polygons(3) + d = polygons(4) x = polygons(10) y = polygons(11) empty = polygons(1000) @@ -605,6 +607,44 @@ def run_testsuite(dm, ic, tiled = false, hier = false) p = b.edges.intersections(c.edges) p.output(lb + 5, dm) + lb += 10 #450 + message "--- texts and filters #{lb}" + + p = at + p.output(lb, dm) + p = at.texts + p.output(lb + 1, dm) + p = at.texts("A*") + p.output(lb + 2, dm) + p = at.texts(pattern("A*")) + p.output(lb + 3, dm) + p = at.texts(pattern("A*"), as_dots) + p.output(lb + 4, dm) + p = at.texts(text("A*"), as_boxes) + p.output(lb + 5, dm) + p = at.texts_not("A*") + p.output(lb + 6, dm) + p = at.texts_not(pattern("A*")) + p.output(lb + 7, dm) + p = at.texts_not(pattern("A*"), as_dots) + p.output(lb + 8, dm) + p = at.texts_not(text("A*"), as_boxes) + p.output(lb + 9, dm) + + lb += 10 #460 + message "--- texts and polygon booleans and interactions #{lb}" + + p = at & d + p.output(lb, dm) + p = d.interacting(at) + p.output(lb + 1, dm) + p = at.interacting(d) + p.output(lb + 2, dm) + p = d.pull_interacting(at) + p.output(lb + 3, dm) + p = at.pull_interacting(d) + p.output(lb + 4, dm) + end if $drc_test_mode == 1 diff --git a/testdata/drc/drcSuiteTests_au1.oas b/testdata/drc/drcSuiteTests_au1.oas index 2288862ffbd3223fcadbaefb5086810f7f7029ac..4dfbe6425458a07f02db4ec668a7d6e8c8a6b35f 100644 GIT binary patch delta 206 zcmcba*_S<`oST)&(GiHXSQ(u*mM0n43s*B8VrIC=zffMdg5jg+Pi5f(#*6&InM{Y7 z(S#I_Fbfv|l?WFy9%Tk90kOqwk1;bcg7tATOkfrexp|zK=`#OsW#LMu6F@~kBNR_E zi%FgWvqk2fX8tVtTbY|7MUYKc@eH$Yh7RLTWs%CW%zIeRaLg2(sRgw79LVAfpg53y X9>x}7yui#f`JwT*$sdf_nHU%Vv`#=o delta 21 ccmeCnzL`0pd}C9RF(cFDi6*~U8X6cF0BRu!WdHyG diff --git a/testdata/drc/drcSuiteTests_au2.oas b/testdata/drc/drcSuiteTests_au2.oas index f02a197396f48ece455842d5413ae58663dee28c..0f41d4df2b7d60f561d2bb97a554e46f9b90e0a3 100644 GIT binary patch delta 418 zcmZY5Jxjw-6b9gP?=gN=@#9{j)KsDp3jT#67=M7jM8QEfL*kY}Y z(wW;bbVkKy@@fm1zEq2CRAk$!*iTS#*P&Crb&@Z4k#BaB7kbDad&$2A`C1?Oo=JY& zPu>_HUrLg143g(9@=A*QYlwW+Cf^;_>E~`nsCXF#`EZ83?AB~%S!yaw3y&A||IrDY za|APW@jJ=vC2nVGHpum|dq{0bpJbZp%SrDF4~$Z4I8jW}0n70L<4RB0f0HyK1Reyz L%18av&~JbrXqbLV delta 16 YcmezPg!%15<_WbMI||+}F8s&{08_3BRR910 diff --git a/testdata/drc/drcSuiteTests_au3.oas b/testdata/drc/drcSuiteTests_au3.oas index 50f9a2516df232dfea74d9dbfe63ccc0e3895289..19c82e62240c0e049a60d4d0808a2156da74d2b1 100644 GIT binary patch delta 29049 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 delta 26560 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 Ik|`+YpVpQdMgRZ+ diff --git a/testdata/drc/drcSuiteTests_au4.oas b/testdata/drc/drcSuiteTests_au4.oas index 5f3a3ad0f555f70dcc599fb650ad53db0c2482a9..4feb67d3f5781f17df10c865c9729ff9d078ad57 100644 GIT binary patch delta 198 zcmX@~i23Vd<_WdjtW1uMK&-{e=(Mr+==*x%dZt6n3>O>^s4@uGFl?}Xp}-(q!g#@v zK{%J`Ff*p8>Jet30-!<$;Znw<%piqep2*$f%uMGTp8>VkGMxa5gS4uiWM&YVdYXBi zHG{~UbB_B!LT7;ba~Ofvh}52C-lM^KhNHvbgcQiSb71ShazNgB1W$zZ0`q3a4~&ce D`35`- delta 25 hcmezRnEB8n<_WbMJC43*WSY$Q@zZ31kK9ZQ3;?k*3zz@^ diff --git a/testdata/drc/drcSuiteTests_au5.oas b/testdata/drc/drcSuiteTests_au5.oas index c596d626f66f68d2ec28f950bf7a6b9b1d9acebe..c3f8dba2c6ba729109ef711aea9685da1b9d518b 100644 GIT binary patch delta 203 zcmbQ7aWr#6IX5elqazS&u`)VsET3akFI>%Zh?(Ic|3Z1;3WkrOKb3_G7%%b*XEGgT zMiWvz!Yo_>R3co+c$68a1jH7zJ;uz)2-e5VFo9V>1FjZi$v zEGBsh%odq@n)$QnZ)I+V6hSs&#WT#p8Jdhgl|?GgGVftM!!c8ErWVlRb0CW|fa1c6 b=YcAi7Rrk-USMXLtZ4jUvVk!#69WSP`U^dS delta 23 fcmX?_IXPoO`NpO>MvP38FB*TE{J@x-iGcwCgg*&! diff --git a/testdata/drc/drcSuiteTests_au6.oas b/testdata/drc/drcSuiteTests_au6.oas index bf3a28492f4ab8495330340596b4fe3802c805d1..9cd6913eeaf2f5cf822a29eb353679ffa7c272b3 100644 GIT binary patch delta 198 zcmex5i*flJ#tBW_tW1uMK&-{e=(MpZ!LVMqn&}WT!$tmu^1>AiA4PvE3l}h6I6@)VdYGWRs|XVKrv+zcs#Y{H6Xn1wSm7=J2@RGwwt!+M5err=C1pvC7v7H0s( Wg%!^ORWL1-7h$}>y!nygWN84sXg!<& delta 17 ZcmZ2Jhw=*FmRtZ^I+3~ani3@i+6d`t`s3_1eL|NsBq^8f$W z5(xeC!2kdM3jY6x(J=9^B@8Tr3=Ayn4EXGyT*X~2jmLeHuW|L_a^B<$E@x&I76t$w CNJc&Y delta 227 zcmdlX@k2a{fsKKQDS|{L4=vr&auYBy5yxTg