cpee 2.0.20 → 2.0.25

Sign up to get free protection for your applications and to get access to all the features.
Files changed (102) hide show
  1. checksums.yaml +4 -4
  2. data/cockpit/CPEE.xml +8 -0
  3. data/cockpit/Signavio.xml +8 -0
  4. data/cockpit/css/model.css +2 -0
  5. data/cockpit/css/replay.css +55 -0
  6. data/cockpit/css/ui.css +3 -1
  7. data/cockpit/edit.html +260 -0
  8. data/cockpit/index.html +2 -2
  9. data/cockpit/js/edit.js +32 -0
  10. data/cockpit/js/instance.js +34 -36
  11. data/cockpit/js/model.js +0 -25
  12. data/cockpit/js/parameters.js +3 -0
  13. data/cockpit/js/replay.js +40 -0
  14. data/cockpit/js/ui.js +7 -0
  15. data/cockpit/model.html +4 -1
  16. data/cockpit/replay.html +52 -0
  17. data/cockpit/templates/instantiate.local/Take_Sub.xml +1 -1
  18. data/cockpit/themes/compact/rngs/call.rng +93 -41
  19. data/cockpit/themes/compact/rngs/callmanipulate.rng +113 -40
  20. data/cockpit/themes/compact/theme.js +57 -25
  21. data/cockpit/themes/{diana → control}/rngs/alternative.rng +0 -0
  22. data/cockpit/themes/control/rngs/call.rng +174 -0
  23. data/cockpit/themes/control/rngs/callmanipulate.rng +218 -0
  24. data/cockpit/themes/{diana → control}/rngs/choose.rng +0 -0
  25. data/cockpit/themes/{diana → control}/rngs/closed_loop.rng +0 -0
  26. data/cockpit/themes/{diana → control}/rngs/closed_loop_cancel.rng +0 -0
  27. data/cockpit/themes/{diana → control}/rngs/closed_loop_control.rng +0 -0
  28. data/cockpit/themes/{diana → control}/rngs/closed_loop_measuring.rng +0 -0
  29. data/cockpit/themes/{diana → control}/rngs/critical.rng +0 -0
  30. data/cockpit/themes/{diana → control}/rngs/escape.rng +0 -0
  31. data/cockpit/themes/{diana → control}/rngs/group.rng +0 -0
  32. data/cockpit/themes/{diana → control}/rngs/loop.rng +0 -0
  33. data/cockpit/themes/{diana → control}/rngs/manipulate.rng +0 -0
  34. data/cockpit/themes/{diana → control}/rngs/otherwise.rng +0 -0
  35. data/cockpit/themes/{diana → control}/rngs/parallel.rng +0 -0
  36. data/cockpit/themes/{diana → control}/rngs/parallel_branch.rng +0 -0
  37. data/cockpit/themes/{diana → control}/rngs/scripts.rng +0 -0
  38. data/cockpit/themes/{diana → control}/rngs/stop.rng +0 -0
  39. data/cockpit/themes/{diana → control}/rngs/terminate.rng +0 -0
  40. data/cockpit/themes/{diana → control}/symbols/alternative.svg +0 -0
  41. data/cockpit/themes/{diana → control}/symbols/arrow.svg +0 -0
  42. data/cockpit/themes/{diana → control}/symbols/call.svg +0 -0
  43. data/cockpit/themes/{diana → control}/symbols/callmanipulate.svg +0 -0
  44. data/cockpit/themes/{diana → control}/symbols/choose.svg +0 -0
  45. data/cockpit/themes/{diana → control}/symbols/choose_exclusive.svg +0 -0
  46. data/cockpit/themes/{diana → control}/symbols/choose_inclusive.svg +0 -0
  47. data/cockpit/themes/{diana → control}/symbols/closed_loop.svg +0 -0
  48. data/cockpit/themes/{diana → control}/symbols/closed_loop_cancel.svg +0 -0
  49. data/cockpit/themes/{diana → control}/symbols/closed_loop_control.svg +0 -0
  50. data/cockpit/themes/{diana → control}/symbols/closed_loop_measuring.svg +0 -0
  51. data/cockpit/themes/{diana → control}/symbols/complex.svg +0 -0
  52. data/cockpit/themes/{diana → control}/symbols/critical.svg +0 -0
  53. data/cockpit/themes/{diana → control}/symbols/end.svg +0 -0
  54. data/cockpit/themes/{diana → control}/symbols/escape.svg +0 -0
  55. data/cockpit/themes/{diana → control}/symbols/event_end.svg +0 -0
  56. data/cockpit/themes/{diana → control}/symbols/loop.svg +0 -0
  57. data/cockpit/themes/{diana → control}/symbols/manipulate.svg +0 -0
  58. data/cockpit/themes/{diana → control}/symbols/otherwise.svg +0 -0
  59. data/cockpit/themes/{diana → control}/symbols/parallel.svg +0 -0
  60. data/cockpit/themes/{diana → control}/symbols/parallel_branch.svg +0 -0
  61. data/cockpit/themes/{diana → control}/symbols/parallel_branch_compact.svg +0 -0
  62. data/cockpit/themes/{diana → control}/symbols/parallel_branch_event.svg +0 -0
  63. data/cockpit/themes/{diana → control}/symbols/parallel_branch_normal.svg +0 -0
  64. data/cockpit/themes/{diana → control}/symbols/scripts.svg +0 -0
  65. data/cockpit/themes/{diana → control}/symbols/start.svg +0 -0
  66. data/cockpit/themes/{diana → control}/symbols/stop.svg +0 -0
  67. data/cockpit/themes/{diana → control}/symbols/terminate.svg +0 -0
  68. data/cockpit/themes/{diana → control}/theme.js +74 -28
  69. data/cockpit/themes/default/rngs/call.rng +93 -41
  70. data/cockpit/themes/default/rngs/callmanipulate.rng +113 -40
  71. data/cockpit/themes/default/theme.js +1318 -0
  72. data/cockpit/themes/extended/rngs/call.rng +93 -41
  73. data/cockpit/themes/extended/rngs/callmanipulate.rng +113 -40
  74. data/cockpit/themes/extended/theme.js +50 -19
  75. data/cockpit/themes/model/rngs/call.rng +21 -20
  76. data/cockpit/themes/model/rngs/callmanipulate.rng +23 -22
  77. data/cockpit/themes/model/theme.js +51 -20
  78. data/cockpit/themes/packed/rngs/call.rng +93 -41
  79. data/cockpit/themes/packed/rngs/callmanipulate.rng +113 -40
  80. data/cockpit/themes/packed/theme.js +50 -19
  81. data/cockpit/themes/preset/rngs/call.rng +93 -41
  82. data/cockpit/themes/preset/rngs/callmanipulate.rng +113 -40
  83. data/cockpit/themes/preset/theme.js +49 -18
  84. data/cockpit/track.html +0 -7
  85. data/cockpit/transformations.xml +4 -0
  86. data/cpee.gemspec +2 -2
  87. data/lib/callbacks.xml +5 -0
  88. data/lib/cpee/controller.rb +29 -27
  89. data/lib/cpee/implementation_callbacks.rb +53 -0
  90. data/server/handlerwrappers/default.rb +17 -5
  91. data/server/resources/notifications/logging/subscription.xml +6 -0
  92. data/server/resources/transformation_dslx.xsl +1 -1
  93. data/server/routing/end.pid +1 -0
  94. data/server/routing/forward-events.pid +1 -0
  95. data/server/routing/forward-votes.pid +1 -0
  96. data/server/routing/persist.pid +1 -0
  97. data/server/routing/persist.rb +3 -3
  98. data/server/server.pid +1 -0
  99. metadata +63 -50
  100. data/cockpit/edit.html +0 -1
  101. data/cockpit/themes/diana/rngs/call.rng +0 -122
  102. data/cockpit/themes/diana/rngs/callmanipulate.rng +0 -145
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
@@ -49,6 +49,16 @@ function WFAdaptorManifestation(adaptor) {
49
49
  });
50
50
  return svgid;
51
51
  }; //}}}
52
+ //{{{ Return the json for all marked tasks
53
+ this.marked_text = function(){
54
+ var nodes = [];
55
+ var markymark = _.uniq(self.marked());
56
+ $(markymark).each(function(key,svgid){
57
+ var node = self.adaptor.description.get_node_by_svg_id(svgid);
58
+ nodes.push($(node).serializePrettyXML());
59
+ });
60
+ return JSON.stringify(nodes);
61
+ }; //}}}
52
62
  //{{{ Render the details from rng (right hand side of graph tab)
53
63
  this.update_details = function(svgid){
54
64
  var tab = $('#dat_details');
@@ -76,35 +86,46 @@ function WFAdaptorManifestation(adaptor) {
76
86
  }; //}}}
77
87
 
78
88
  function copyOrMove(menu,group,xml_node,mode) { //{{{
79
- var markymark = _.uniq(self.marked());
89
+ var nodes = localStorage.getItem('marked');
90
+
91
+ if (typeof(nodes) != "string") { return; }
92
+
93
+ nodes = JSON.parse(nodes);
94
+ $(nodes).each(function(key,str) {
95
+ nodes[key] = $X(str);;
96
+ });
97
+
80
98
  var check1 = [];
81
99
  var check2 = [];
82
- $(markymark).each(function(key,svgid){
83
- var node = self.adaptor.description.get_node_by_svg_id(svgid);
100
+ $(nodes).each(function(key,node){
84
101
  check1.push($(node).attr('svg-type'));
85
102
  });
86
103
  $(group).each(function(key,value){
87
104
  check2.push(value.type);
88
105
  });
89
106
 
90
- if (markymark.length > 0 && _.uniq(check1).length == _.intersection(check1,check2).length) {
91
- var nodes = [];
92
- $(markymark).each(function(key,svgid){
93
- var node = self.adaptor.description.get_node_by_svg_id(svgid);
94
- nodes.unshift(node);
95
- });
96
-
107
+ if (nodes.length > 0 && _.uniq(check1).length == _.intersection(check1,check2).length) {
108
+ if (myid == localStorage.getItem('marked_from')) {
109
+ $(nodes).each(function(key,node){
110
+ nodes[key] = self.adaptor.description.get_node_by_svg_id($(node).attr('svg-id'));
111
+ });
112
+ }
113
+ nodes.reverse();
97
114
  var iconm = self.resources['arrow'].clone();
98
115
  var iconc = self.resources['arrow'].clone();
99
116
  iconm.children('.rfill').addClass('menu');
117
+ if (myid == localStorage.getItem('marked_from')) {
118
+ menu.push(
119
+ {
120
+ 'label': '<em>Move Marked Elements</em>',
121
+ 'function_call': mode,
122
+ 'menu_icon': iconm,
123
+ 'type': undefined,
124
+ 'params': [nodes, xml_node]
125
+ }
126
+ );
127
+ }
100
128
  menu.push(
101
- {
102
- 'label': '<em>Move Marked Elements</em>',
103
- 'function_call': mode,
104
- 'menu_icon': iconm,
105
- 'type': undefined,
106
- 'params': [nodes, xml_node]
107
- },
108
129
  {
109
130
  'label': '<em>Copy Marked Elements</em>',
110
131
  'function_call': mode,
@@ -217,16 +238,26 @@ function WFAdaptorManifestation(adaptor) {
217
238
  self.adaptor.illustrator.get_elements().removeClass('selected');
218
239
  self.adaptor.illustrator.get_labels().removeClass('selected');
219
240
 
220
- if (e && e.ctrlKey) {
241
+ if (e && (e.ctrlKey || e.metaKey)) {
221
242
  if (save['state'] != "ready" && save['state'] != "stopped") { return false; }
222
243
  var tab = $('#dat_details');
223
244
  tab.empty();
224
245
  var vtarget = self.adaptor.illustrator.get_node_by_svg_id(svgid);
225
246
  if (vtarget.length > 0) {
226
- vtarget.parents('g.element[element-id]').toggleClass('marked');
247
+ var vt = vtarget.parents('g.element[element-id]');
248
+ vt.toggleClass('marked');
249
+ if (vt.hasClass('marked')) {
250
+ localStorage.setItem('marked',self.marked_text());
251
+ localStorage.setItem('marked_from',myid);
252
+ } else {
253
+ localStorage.removeItem('marked');
254
+ localStorage.removeItem('marked_from');
255
+ }
227
256
  }
228
257
  } else {
229
258
  self.adaptor.illustrator.get_elements().removeClass('marked');
259
+ localStorage.removeItem('marked');
260
+ localStorage.removeItem('marked_from');
230
261
 
231
262
  var vtarget = self.adaptor.illustrator.get_node_by_svg_id(svgid);
232
263
  if (vtarget.length > 0) {
@@ -866,7 +897,7 @@ function WFAdaptorManifestation(adaptor) {
866
897
  },
867
898
  'label': function(node){
868
899
  var avg = $('> _probability_avg',$(node).children('_probability')).text();
869
- var ret = [ { column: 'Label', value: 'f = ' + $(node).attr('frequency') + ' Hz (' + $(node).attr('overrun') + ')' } ];
900
+ var ret = [ { column: 'Label', value: $(node).attr('overrun') } ];
870
901
  if (avg != '') {
871
902
  ret.push({ column: 'Average', value: avg + '%' });
872
903
  }
@@ -921,8 +952,17 @@ function WFAdaptorManifestation(adaptor) {
921
952
  return false;
922
953
  },
923
954
  'label': function(node){
924
- var vals = $('> value',$(node).children('_expected')).text();
925
- var ret = [ { column: 'Label', value: 'measure ' + vals } ];
955
+ var vals = [];
956
+ $('> value',$(node).children('_expected')).each((k,v) => {
957
+ vals.push($(v).text());
958
+ });
959
+ var valtext = '';
960
+ if (vals.length > 0) {
961
+ valtext = ' (' + vals.join(', ') + ')';
962
+ } else {
963
+ valtext = '';
964
+ }
965
+ var ret = [ { column: 'Label', value: 'measure: f = ' + $(node).attr('frequency') + ' Hz' + valtext } ];
926
966
  return ret;
927
967
  },
928
968
  'svg': self.adaptor.theme_dir + 'symbols/closed_loop_measuring.svg'
@@ -998,7 +1038,13 @@ function WFAdaptorManifestation(adaptor) {
998
1038
  $('> change > value',$(node).children('_expected')).each((k,v) => {
999
1039
  vals.push($(v).text());
1000
1040
  });
1001
- var ret = [ { column: 'Label', value: 'control ' + vals.join(', ') } ];
1041
+ var valtext = '';
1042
+ if (vals.length > 0) {
1043
+ valtext = ' (' + vals.join(', ') + ')';
1044
+ } else {
1045
+ valtext = '';
1046
+ }
1047
+ var ret = [ { column: 'Label', value: 'control: f = ' + $(node).attr('frequency') + ' Hz' + valtext } ];
1002
1048
  return ret;
1003
1049
  },
1004
1050
  'svg': self.adaptor.theme_dir + 'symbols/closed_loop_control.svg'
@@ -1019,6 +1065,11 @@ function WFAdaptorManifestation(adaptor) {
1019
1065
  'menu_icon': self.elements.call.illustrator.svg.clone(),
1020
1066
  'type': 'call',
1021
1067
  'params': [self.adaptor.description.elements.call, node]},
1068
+ {'label': 'Control',
1069
+ 'function_call': func,
1070
+ 'menu_icon': self.elements.closed_loop_control.illustrator.svg.clone(),
1071
+ 'type': 'closed_loop_control',
1072
+ 'params': [self.adaptor.description.elements.closed_loop_control, node]},
1022
1073
  {'label': 'Script',
1023
1074
  'function_call': func,
1024
1075
  'menu_icon': self.elements.manipulate.illustrator.svg.clone(),
@@ -1039,11 +1090,6 @@ function WFAdaptorManifestation(adaptor) {
1039
1090
  'menu_icon': self.elements.loop.illustrator.svg.clone(),
1040
1091
  'type': 'loop',
1041
1092
  'params': [self.adaptor.description.elements.loop, node]},
1042
- {'label': 'Closed Loop',
1043
- 'function_call': func,
1044
- 'menu_icon': self.elements.closed_loop.illustrator.svg.clone(),
1045
- 'type': 'closed_loop',
1046
- 'params': [self.adaptor.description.elements.closed_loop, node]},
1047
1093
  {'label': 'Stop',
1048
1094
  'function_call': func,
1049
1095
  'menu_icon': self.elements.stop.illustrator.svg.clone(),
@@ -26,7 +26,8 @@
26
26
  </zeroOrMore>
27
27
  </element>
28
28
  <element name="stream" rngui:header="Data Stream Handling" rngui:fold="closed">
29
- <element name="sensors" rngui:header="Sensors" rngui:fold="closed">
29
+
30
+ <element name="sensors" rngui:header="Sensor Data Streams" rngui:fold="closed">
30
31
  <zeroOrMore rngui:label="Add Sensor">
31
32
  <element name="sensor">
32
33
  <element name="name" rngui:label="Label">
@@ -35,13 +36,18 @@
35
36
  <element name="extractor_url" rngui:label="Extractor Url">
36
37
  <data type="string" rngui:label="Service Url"/>
37
38
  </element>
38
- <element name="extractor_arg" rngui:label="Extractor Argument">
39
- <data type="string" rngui:label="Value / Json"/>
39
+ <element name="extractor_params" rngui:label="Extractor Arguments:">
40
+ <zeroOrMore rngui:label="Create Extractor Argument Pairs">
41
+ <element rngui:label="Name">
42
+ <anyName/>
43
+ <data type="string" rngui:label="Value / Json"/>
44
+ </element>
45
+ </zeroOrMore>
40
46
  </element>
41
47
  <element name="visualizer_url" rngui:label="Visualizer Url">
42
48
  <data type="string" rngui:label="Service Url"/>
43
49
  </element>
44
- <element name="visualizer_params" rngui:header="Visualizer Arguments">
50
+ <element name="visualizer_params" rngui:label="Visualizer Arguments">
45
51
  <zeroOrMore rngui:label="Create Visualizer Argument Pairs">
46
52
  <element rngui:label="Name">
47
53
  <anyName/>
@@ -52,44 +58,46 @@
52
58
  </element>
53
59
  </zeroOrMore>
54
60
  </element>
55
- <element name="aggregators" rngui:header="Aggregators" rngui:fold="closed">
56
- <zeroOrMore rngui:label="Add Aggregator">
57
- <element name="aggregator">
58
- <element name="name" rngui:label="Label">
59
- <data type="string" rngui:label="Label"/>
60
- </element>
61
- <element name="aggregator_url" rngui:label="Aggregator Url">
62
- <data type="string" rngui:label="Service Url"/>
63
- </element>
64
- <element name="aggregator_arg" rngui:label="Aggregator Argument">
65
- <data type="string" rngui:label="Value / Json"/>
66
- </element>
67
- </element>
68
- </zeroOrMore>
69
- </element>
70
- <element name="costs" rngui:header="Costs" rngui:fold="closed">
71
- <zeroOrMore rngui:label="Create Cost Factor">
72
- <element name="cost_factor">
61
+
62
+ <element name="ips" rngui:header="Impact Profiles" rngui:fold="closed">
63
+ <zeroOrMore rngui:label="Add Impact Profile">
64
+ <element name="ip">
73
65
  <element name="name" rngui:label="Label">
74
66
  <data type="string" rngui:label="Label"/>
75
67
  </element>
76
68
  <element name="target" rngui:label="Target Value">
77
69
  <data type="string" rngui:label="Value"/>
78
70
  </element>
79
- <element name="vfunc_url" rngui:label="Violation Function Url">
80
- <data type="string" rngui:label="Service Url"/>
81
- </element>
82
- <element name="vfunc_arg" rngui:label="Violation Function Argument">
83
- <data type="string" rngui:label="Service Url"/>
71
+ <element name="ifs" rngui:header="Impact Factors">
72
+ <zeroOrMore rngui:label="Add Impact Factor">
73
+ <element name="if">
74
+ <element name="ivs" rngui:header="Impact Values">
75
+ <zeroOrMore rngui:label="Add Impact Value ">
76
+ <element name="iv">
77
+ <element name="extractor_url" rngui:label="Extractor Url">
78
+ <data type="string" rngui:label="Service Url + Parameters"/>
79
+ </element>
80
+ <element name="aggregator_url" rngui:label="Aggregator Url">
81
+ <data type="string" rngui:label="Service Url + Parameters"/>
82
+ </element>
83
+ </element>
84
+ </zeroOrMore>
85
+ </element>
86
+ <element name="aggregator_url" rngui:label="Impact Function Url">
87
+ <data type="string" rngui:label="Service Url + Parameters"/>
88
+ </element>
89
+ </element>
90
+ </zeroOrMore>
84
91
  </element>
85
- <element name="vcost" rngui:label="Violation Cost">
86
- <data type="string" rngui:label="Value"/>
92
+ <element name="vfunc_url" rngui:label="Violation Function Url">
93
+ <data type="string" rngui:label="Service Url + Parameters"/>
87
94
  </element>
88
95
  </element>
89
96
  </zeroOrMore>
90
97
  </element>
98
+
91
99
  </element>
92
- <element name="report" rngui:header="Reporting Annotation" rngui:fold="closed">
100
+ <element name="report" rngui:header="Reporting" rngui:fold="closed">
93
101
  <element name="url" rngui:label='HTML Snippet'>
94
102
  <data type="string" rngui:label="url to report snippet"/>
95
103
  </element>
@@ -97,21 +105,40 @@
97
105
  </element>
98
106
  <element name="annotations" rngui:header="Annotations">
99
107
  <element name="_timing" rngui:header="Timing" rngui:fold="closed">
100
- <element name="_timing_wait" rngui:label="&#x3C9; - Wait">
101
- <data type="float" rngui:label="[0,1]" rngui:default="0.5"/>
102
- </element>
103
- <element name="_timing_threshold" rngui:label="&#x3BA; - Threshold">
104
- <data type="float" rngui:label="[0,3,n]" rngui:default="3"/>
105
- </element>
106
- <element name="_timing_min" rngui:label="Min in min">
107
- <data type="float" rngui:label="Minutes"/>
108
- </element>
109
- <element name="_timing_max" rngui:label="Max in min">
110
- <data type="float" rngui:label="Minutes"/>
108
+ <element name="_timing_weight" rngui:label="&#x3C9; - Weight">
109
+ <data type="float" rngui:label="[0,1]"/>
111
110
  </element>
112
111
  <element name="_timing_avg" rngui:label="Avg in min">
113
112
  <data type="float" rngui:label="Minutes"/>
114
113
  </element>
114
+ <element name="explanations" rngui:header="Explanations">
115
+ <zeroOrMore rngui:label="Add Explanation">
116
+ <element name="explanation">
117
+ <element name="type" rngui:label="Type">
118
+ <choice>
119
+ <value>&gt;</value>
120
+ <value>&lt;</value>
121
+ </choice>
122
+ </element>
123
+ <element name="deviation" rngui:label="Deviation">
124
+ <data type="float" rngui:label="Minutes"/>
125
+ </element>
126
+ <element name="behaviour" rngui:label="Behaviour">
127
+ <choice>
128
+ <value>Immediately</value>
129
+ <value>Wait until next</value>
130
+ <value>Use grace period value</value>
131
+ </choice>
132
+ </element>
133
+ <element name="grace" rngui:label="Grace Period" rngui:default="0.0">
134
+ <data type="float" rngui:label="Minutes"/>
135
+ </element>
136
+ <element name="text" rngui:label="Explanation">
137
+ <data type="string" rngui:label="Patterns"/>
138
+ </element>
139
+ </element>
140
+ </zeroOrMore>
141
+ </element>
115
142
  </element>
116
143
  <element name="_notes" rngui:header="Notes" rngui:fold="closed">
117
144
  <element name="_notes_general" rngui:label="General">
@@ -119,4 +146,29 @@
119
146
  </element>
120
147
  </element>
121
148
  </element>
149
+ <element name="input" rngui:header="Input Arguments Documentation" rngui:fold="closed">
150
+ <zeroOrMore rngui:label="Create Argument">
151
+ <element name="item" rngui:label="Description">
152
+ <attribute name="label" rngui:label="Name">
153
+ <data type="string"/>
154
+ </attribute>
155
+ <text rngui:wrap="true" rngui:label="What does it do?"/>
156
+ </element>
157
+ </zeroOrMore>
158
+ </element>
159
+ <element name="output" rngui:header="Output Elements Documentation" rngui:fold="closed">
160
+ <zeroOrMore rngui:label="Create Element">
161
+ <element name="item" rngui:label="Description">
162
+ <attribute name="label" rngui:label="Name">
163
+ <data type="string"/>
164
+ </attribute>
165
+ <text rngui:wrap="true" rngui:label="What does it do?"/>
166
+ </element>
167
+ </zeroOrMore>
168
+ </element>
169
+ <element name="implementation" rngui:header="Implementation Documentation" rngui:fold="closed">
170
+ <element name="description" rngui:label="Description">
171
+ <text rngui:wrap="true" rngui:label="What is supposed to happen?"/>
172
+ </element>
173
+ </element>
122
174
  </element>