bt2: pass custom Python object to Python component's __init__()
[babeltrace.git] / tests / bindings / python / bt2 / test_port.py
index c94bb920ac197393768b9d0845e8fc7d0451944a..7e489d32c9ca350a754360f6446ac66b3a27a1f6 100644 (file)
@@ -35,9 +35,8 @@ class PortTestCase(unittest.TestCase):
             def __next__(self):
                 raise bt2.Stop
 
-        class MySource(bt2._UserSourceComponent,
-                       message_iterator_class=MyIter):
-            def __init__(comp_self, params):
+        class MySource(bt2._UserSourceComponent, message_iterator_class=MyIter):
+            def __init__(comp_self, params, obj):
                 port = comp_self._add_output_port('out')
                 self.assertEqual(port.name, 'out')
 
@@ -49,9 +48,8 @@ class PortTestCase(unittest.TestCase):
             def __next__(self):
                 raise bt2.Stop
 
-        class MyFilter(bt2._UserFilterComponent,
-                       message_iterator_class=MyIter):
-            def __init__(comp_self, params):
+        class MyFilter(bt2._UserFilterComponent, message_iterator_class=MyIter):
+            def __init__(comp_self, params, obj):
                 port = comp_self._add_output_port('out')
                 self.assertEqual(port.name, 'out')
 
@@ -63,9 +61,8 @@ class PortTestCase(unittest.TestCase):
             def __next__(self):
                 raise bt2.Stop
 
-        class MyFilter(bt2._UserFilterComponent,
-                       message_iterator_class=MyIter):
-            def __init__(comp_self, params):
+        class MyFilter(bt2._UserFilterComponent, message_iterator_class=MyIter):
+            def __init__(comp_self, params, obj):
                 port = comp_self._add_input_port('in')
                 self.assertEqual(port.name, 'in')
 
@@ -74,14 +71,11 @@ class PortTestCase(unittest.TestCase):
 
     def test_sink_add_input_port(self):
         class MySink(bt2._UserSinkComponent):
-            def __init__(comp_self, params):
+            def __init__(comp_self, params, obj):
                 port = comp_self._add_input_port('in')
                 self.assertEqual(port.name, 'in')
 
-            def _consume(self):
-                pass
-
-            def _graph_is_configured(self):
+            def _user_consume(self):
                 pass
 
         comp = self._create_comp(MySink)
@@ -92,9 +86,8 @@ class PortTestCase(unittest.TestCase):
             def __next__(self):
                 raise bt2.Stop
 
-        class MySource(bt2._UserSourceComponent,
-                       message_iterator_class=MyIter):
-            def __init__(comp_self, params):
+        class MySource(bt2._UserSourceComponent, message_iterator_class=MyIter):
+            def __init__(comp_self, params, obj):
                 port1 = comp_self._add_output_port('clear')
                 port2 = comp_self._add_output_port('print')
                 port3 = comp_self._add_output_port('insert')
@@ -109,9 +102,8 @@ class PortTestCase(unittest.TestCase):
             def __next__(self):
                 raise bt2.Stop
 
-        class MyFilter(bt2._UserFilterComponent,
-                       message_iterator_class=MyIter):
-            def __init__(comp_self, params):
+        class MyFilter(bt2._UserFilterComponent, message_iterator_class=MyIter):
+            def __init__(comp_self, params, obj):
                 port1 = comp_self._add_output_port('clear')
                 port2 = comp_self._add_output_port('print')
                 port3 = comp_self._add_output_port('insert')
@@ -126,9 +118,8 @@ class PortTestCase(unittest.TestCase):
             def __next__(self):
                 raise bt2.Stop
 
-        class MyFilter(bt2._UserFilterComponent,
-                       message_iterator_class=MyIter):
-            def __init__(comp_self, params):
+        class MyFilter(bt2._UserFilterComponent, message_iterator_class=MyIter):
+            def __init__(comp_self, params, obj):
                 port1 = comp_self._add_input_port('clear')
                 port2 = comp_self._add_input_port('print')
                 port3 = comp_self._add_input_port('insert')
@@ -140,7 +131,7 @@ class PortTestCase(unittest.TestCase):
 
     def test_user_sink_input_ports_getitem(self):
         class MySink(bt2._UserSinkComponent):
-            def __init__(comp_self, params):
+            def __init__(comp_self, params, obj):
                 port1 = comp_self._add_input_port('clear')
                 port2 = comp_self._add_input_port('print')
                 port3 = comp_self._add_input_port('insert')
@@ -148,10 +139,7 @@ class PortTestCase(unittest.TestCase):
                 self.assertEqual(port2.addr, comp_self._input_ports['print'].addr)
                 self.assertEqual(port1.addr, comp_self._input_ports['clear'].addr)
 
-            def _consume(self):
-                pass
-
-            def _graph_is_configured(self):
+            def _user_consume(self):
                 pass
 
         self._create_comp(MySink)
@@ -161,9 +149,8 @@ class PortTestCase(unittest.TestCase):
             def __next__(self):
                 raise bt2.Stop
 
-        class MySource(bt2._UserSourceComponent,
-                       message_iterator_class=MyIter):
-            def __init__(comp_self, params):
+        class MySource(bt2._UserSourceComponent, message_iterator_class=MyIter):
+            def __init__(comp_self, params, obj):
                 comp_self._add_output_port('clear')
                 comp_self._add_output_port('print')
                 comp_self._add_output_port('insert')
@@ -178,9 +165,8 @@ class PortTestCase(unittest.TestCase):
             def __next__(self):
                 raise bt2.Stop
 
-        class MyFilter(bt2._UserFilterComponent,
-                       message_iterator_class=MyIter):
-            def __init__(comp_self, params):
+        class MyFilter(bt2._UserFilterComponent, message_iterator_class=MyIter):
+            def __init__(comp_self, params, obj):
                 comp_self._add_output_port('clear')
                 comp_self._add_output_port('print')
                 comp_self._add_output_port('insert')
@@ -195,9 +181,8 @@ class PortTestCase(unittest.TestCase):
             def __next__(self):
                 raise bt2.Stop
 
-        class MyFilter(bt2._UserFilterComponent,
-                       message_iterator_class=MyIter):
-            def __init__(comp_self, params):
+        class MyFilter(bt2._UserFilterComponent, message_iterator_class=MyIter):
+            def __init__(comp_self, params, obj):
                 comp_self._add_input_port('clear')
                 comp_self._add_input_port('print')
                 comp_self._add_input_port('insert')
@@ -209,7 +194,7 @@ class PortTestCase(unittest.TestCase):
 
     def test_user_sink_input_ports_getitem_invalid_key(self):
         class MySink(bt2._UserSinkComponent):
-            def __init__(comp_self, params):
+            def __init__(comp_self, params, obj):
                 comp_self._add_input_port('clear')
                 comp_self._add_input_port('print')
                 comp_self._add_input_port('insert')
@@ -217,10 +202,7 @@ class PortTestCase(unittest.TestCase):
                 with self.assertRaises(KeyError):
                     comp_self._input_ports['hello']
 
-            def _consume(self):
-                pass
-
-            def _graph_is_configured(self):
+            def _user_consume(self):
                 pass
 
         self._create_comp(MySink)
@@ -230,9 +212,8 @@ class PortTestCase(unittest.TestCase):
             def __next__(self):
                 raise bt2.Stop
 
-        class MySource(bt2._UserSourceComponent,
-                       message_iterator_class=MyIter):
-            def __init__(comp_self, params):
+        class MySource(bt2._UserSourceComponent, message_iterator_class=MyIter):
+            def __init__(comp_self, params, obj):
                 comp_self._add_output_port('clear')
                 comp_self._add_output_port('print')
                 comp_self._add_output_port('insert')
@@ -245,9 +226,8 @@ class PortTestCase(unittest.TestCase):
             def __next__(self):
                 raise bt2.Stop
 
-        class MyFilter(bt2._UserFilterComponent,
-                       message_iterator_class=MyIter):
-            def __init__(comp_self, params):
+        class MyFilter(bt2._UserFilterComponent, message_iterator_class=MyIter):
+            def __init__(comp_self, params, obj):
                 comp_self._add_output_port('clear')
                 comp_self._add_output_port('print')
                 comp_self._add_output_port('insert')
@@ -260,9 +240,8 @@ class PortTestCase(unittest.TestCase):
             def __next__(self):
                 raise bt2.Stop
 
-        class MyFilter(bt2._UserFilterComponent,
-                       message_iterator_class=MyIter):
-            def __init__(comp_self, params):
+        class MyFilter(bt2._UserFilterComponent, message_iterator_class=MyIter):
+            def __init__(comp_self, params, obj):
                 comp_self._add_input_port('clear')
                 comp_self._add_input_port('print')
                 comp_self._add_input_port('insert')
@@ -272,16 +251,13 @@ class PortTestCase(unittest.TestCase):
 
     def test_user_sink_input_ports_len(self):
         class MySink(bt2._UserSinkComponent):
-            def __init__(comp_self, params):
+            def __init__(comp_self, params, obj):
                 comp_self._add_input_port('clear')
                 comp_self._add_input_port('print')
                 comp_self._add_input_port('insert')
                 self.assertEqual(len(comp_self._input_ports), 3)
 
-            def _consume(self):
-                pass
-
-            def _graph_is_configured(self):
+            def _user_consume(self):
                 pass
 
         self._create_comp(MySink)
@@ -291,9 +267,8 @@ class PortTestCase(unittest.TestCase):
             def __next__(self):
                 raise bt2.Stop
 
-        class MySource(bt2._UserSourceComponent,
-                       message_iterator_class=MyIter):
-            def __init__(comp_self, params):
+        class MySource(bt2._UserSourceComponent, message_iterator_class=MyIter):
+            def __init__(comp_self, params, obj):
                 port1 = comp_self._add_output_port('clear')
                 port2 = comp_self._add_output_port('print')
                 port3 = comp_self._add_output_port('insert')
@@ -316,9 +291,8 @@ class PortTestCase(unittest.TestCase):
             def __next__(self):
                 raise bt2.Stop
 
-        class MyFilter(bt2._UserFilterComponent,
-                       message_iterator_class=MyIter):
-            def __init__(comp_self, params):
+        class MyFilter(bt2._UserFilterComponent, message_iterator_class=MyIter):
+            def __init__(comp_self, params, obj):
                 port1 = comp_self._add_output_port('clear')
                 port2 = comp_self._add_output_port('print')
                 port3 = comp_self._add_output_port('insert')
@@ -341,9 +315,8 @@ class PortTestCase(unittest.TestCase):
             def __next__(self):
                 raise bt2.Stop
 
-        class MyFilter(bt2._UserFilterComponent,
-                       message_iterator_class=MyIter):
-            def __init__(comp_self, params):
+        class MyFilter(bt2._UserFilterComponent, message_iterator_class=MyIter):
+            def __init__(comp_self, params, obj):
                 port1 = comp_self._add_input_port('clear')
                 port2 = comp_self._add_input_port('print')
                 port3 = comp_self._add_input_port('insert')
@@ -363,7 +336,7 @@ class PortTestCase(unittest.TestCase):
 
     def test_user_sink_input_ports_iter(self):
         class MySink(bt2._UserSinkComponent):
-            def __init__(comp_self, params):
+            def __init__(comp_self, params, obj):
                 port1 = comp_self._add_input_port('clear')
                 port2 = comp_self._add_input_port('print')
                 port3 = comp_self._add_input_port('insert')
@@ -379,10 +352,7 @@ class PortTestCase(unittest.TestCase):
                 self.assertEqual(ports[2][0], 'insert')
                 self.assertEqual(ports[2][1].addr, port3.addr)
 
-            def _consume(self):
-                pass
-
-            def _graph_is_configured(self):
+            def _user_consume(self):
                 pass
 
         self._create_comp(MySink)
@@ -396,9 +366,8 @@ class PortTestCase(unittest.TestCase):
         port2 = None
         port3 = None
 
-        class MySource(bt2._UserSourceComponent,
-                       message_iterator_class=MyIter):
-            def __init__(comp_self, params):
+        class MySource(bt2._UserSourceComponent, message_iterator_class=MyIter):
+            def __init__(comp_self, params, obj):
                 nonlocal port1, port2, port3
                 port1 = comp_self._add_output_port('clear')
                 port2 = comp_self._add_output_port('print')
@@ -421,9 +390,8 @@ class PortTestCase(unittest.TestCase):
         port2 = None
         port3 = None
 
-        class MyFilter(bt2._UserFilterComponent,
-                       message_iterator_class=MyIter):
-            def __init__(comp_self, params):
+        class MyFilter(bt2._UserFilterComponent, message_iterator_class=MyIter):
+            def __init__(comp_self, params, obj):
                 nonlocal port1, port2, port3
                 port1 = comp_self._add_output_port('clear')
                 port2 = comp_self._add_output_port('print')
@@ -446,9 +414,8 @@ class PortTestCase(unittest.TestCase):
         port2 = None
         port3 = None
 
-        class MyFilter(bt2._UserFilterComponent,
-                       message_iterator_class=MyIter):
-            def __init__(comp_self, params):
+        class MyFilter(bt2._UserFilterComponent, message_iterator_class=MyIter):
+            def __init__(comp_self, params, obj):
                 nonlocal port1, port2, port3
                 port1 = comp_self._add_input_port('clear')
                 port2 = comp_self._add_input_port('print')
@@ -468,16 +435,13 @@ class PortTestCase(unittest.TestCase):
         port3 = None
 
         class MySink(bt2._UserSinkComponent):
-            def __init__(comp_self, params):
+            def __init__(comp_self, params, obj):
                 nonlocal port1, port2, port3
                 port1 = comp_self._add_input_port('clear')
                 port2 = comp_self._add_input_port('print')
                 port3 = comp_self._add_input_port('insert')
 
-            def _consume(self):
-                pass
-
-            def _graph_is_configured(self):
+            def _user_consume(self):
                 pass
 
         comp = self._create_comp(MySink)
@@ -493,9 +457,8 @@ class PortTestCase(unittest.TestCase):
             def __next__(self):
                 raise bt2.Stop
 
-        class MySource(bt2._UserSourceComponent,
-                       message_iterator_class=MyIter):
-            def __init__(comp_self, params):
+        class MySource(bt2._UserSourceComponent, message_iterator_class=MyIter):
+            def __init__(comp_self, params, obj):
                 comp_self._add_output_port('clear')
                 comp_self._add_output_port('print')
                 comp_self._add_output_port('insert')
@@ -510,9 +473,8 @@ class PortTestCase(unittest.TestCase):
             def __next__(self):
                 raise bt2.Stop
 
-        class MyFilter(bt2._UserFilterComponent,
-                       message_iterator_class=MyIter):
-            def __init__(comp_self, params):
+        class MyFilter(bt2._UserFilterComponent, message_iterator_class=MyIter):
+            def __init__(comp_self, params, obj):
                 comp_self._add_output_port('clear')
                 comp_self._add_output_port('print')
                 comp_self._add_output_port('insert')
@@ -527,9 +489,8 @@ class PortTestCase(unittest.TestCase):
             def __next__(self):
                 raise bt2.Stop
 
-        class MyFilter(bt2._UserFilterComponent,
-                       message_iterator_class=MyIter):
-            def __init__(comp_self, params):
+        class MyFilter(bt2._UserFilterComponent, message_iterator_class=MyIter):
+            def __init__(comp_self, params, obj):
                 comp_self._add_input_port('clear')
                 comp_self._add_input_port('print')
                 comp_self._add_input_port('insert')
@@ -541,7 +502,7 @@ class PortTestCase(unittest.TestCase):
 
     def test_gen_sink_input_ports_getitem_invalid_key(self):
         class MySink(bt2._UserSinkComponent):
-            def __init__(comp_self, params):
+            def __init__(comp_self, params, obj):
                 comp_self._add_input_port('clear')
                 comp_self._add_input_port('print')
                 comp_self._add_input_port('insert')
@@ -549,10 +510,7 @@ class PortTestCase(unittest.TestCase):
                 with self.assertRaises(KeyError):
                     comp_self._input_ports['hello']
 
-            def _consume(self):
-                pass
-
-            def _graph_is_configured(self):
+            def _user_consume(self):
                 pass
 
         comp = self._create_comp(MySink)
@@ -565,9 +523,8 @@ class PortTestCase(unittest.TestCase):
             def __next__(self):
                 raise bt2.Stop
 
-        class MySource(bt2._UserSourceComponent,
-                       message_iterator_class=MyIter):
-            def __init__(comp_self, params):
+        class MySource(bt2._UserSourceComponent, message_iterator_class=MyIter):
+            def __init__(comp_self, params, obj):
                 comp_self._add_output_port('clear')
                 comp_self._add_output_port('print')
                 comp_self._add_output_port('insert')
@@ -580,9 +537,8 @@ class PortTestCase(unittest.TestCase):
             def __next__(self):
                 raise bt2.Stop
 
-        class MyFilter(bt2._UserFilterComponent,
-                       message_iterator_class=MyIter):
-            def __init__(comp_self, params):
+        class MyFilter(bt2._UserFilterComponent, message_iterator_class=MyIter):
+            def __init__(comp_self, params, obj):
                 comp_self._add_output_port('clear')
                 comp_self._add_output_port('print')
                 comp_self._add_output_port('insert')
@@ -595,9 +551,8 @@ class PortTestCase(unittest.TestCase):
             def __next__(self):
                 raise bt2.Stop
 
-        class MyFilter(bt2._UserFilterComponent,
-                       message_iterator_class=MyIter):
-            def __init__(comp_self, params):
+        class MyFilter(bt2._UserFilterComponent, message_iterator_class=MyIter):
+            def __init__(comp_self, params, obj):
                 comp_self._add_input_port('clear')
                 comp_self._add_input_port('print')
                 comp_self._add_input_port('insert')
@@ -607,15 +562,12 @@ class PortTestCase(unittest.TestCase):
 
     def test_gen_sink_input_ports_len(self):
         class MySink(bt2._UserSinkComponent):
-            def __init__(comp_self, params):
+            def __init__(comp_self, params, obj):
                 comp_self._add_input_port('clear')
                 comp_self._add_input_port('print')
                 comp_self._add_input_port('insert')
 
-            def _consume(self):
-                pass
-
-            def _graph_is_configured(self):
+            def _user_consume(self):
                 pass
 
         comp = self._create_comp(MySink)
@@ -630,9 +582,8 @@ class PortTestCase(unittest.TestCase):
         port2 = None
         port3 = None
 
-        class MySource(bt2._UserSourceComponent,
-                       message_iterator_class=MyIter):
-            def __init__(comp_self, params):
+        class MySource(bt2._UserSourceComponent, message_iterator_class=MyIter):
+            def __init__(comp_self, params, obj):
                 nonlocal port1, port2, port3
                 port1 = comp_self._add_output_port('clear')
                 port2 = comp_self._add_output_port('print')
@@ -663,9 +614,8 @@ class PortTestCase(unittest.TestCase):
         port2 = None
         port3 = None
 
-        class MyFilter(bt2._UserFilterComponent,
-                       message_iterator_class=MyIter):
-            def __init__(comp_self, params):
+        class MyFilter(bt2._UserFilterComponent, message_iterator_class=MyIter):
+            def __init__(comp_self, params, obj):
                 nonlocal port1, port2, port3
                 port1 = comp_self._add_output_port('clear')
                 port2 = comp_self._add_output_port('print')
@@ -696,9 +646,8 @@ class PortTestCase(unittest.TestCase):
         port2 = None
         port3 = None
 
-        class MyFilter(bt2._UserFilterComponent,
-                       message_iterator_class=MyIter):
-            def __init__(comp_self, params):
+        class MyFilter(bt2._UserFilterComponent, message_iterator_class=MyIter):
+            def __init__(comp_self, params, obj):
                 nonlocal port1, port2, port3
                 port1 = comp_self._add_input_port('clear')
                 port2 = comp_self._add_input_port('print')
@@ -726,16 +675,13 @@ class PortTestCase(unittest.TestCase):
         port3 = None
 
         class MySink(bt2._UserSinkComponent):
-            def __init__(comp_self, params):
+            def __init__(comp_self, params, obj):
                 nonlocal port1, port2, port3
                 port1 = comp_self._add_input_port('clear')
                 port2 = comp_self._add_input_port('print')
                 port3 = comp_self._add_input_port('insert')
 
-            def _consume(self):
-                pass
-
-            def _graph_is_configured(self):
+            def _user_consume(self):
                 pass
 
         comp = self._create_comp(MySink)
@@ -756,13 +702,10 @@ class PortTestCase(unittest.TestCase):
 
     def test_name(self):
         class MySink(bt2._UserSinkComponent):
-            def __init__(comp_self, params):
+            def __init__(comp_self, params, obj):
                 comp_self._add_input_port('clear')
 
-            def _consume(self):
-                pass
-
-            def _graph_is_configured(self):
+            def _user_consume(self):
                 pass
 
         comp = self._create_comp(MySink)
@@ -770,13 +713,10 @@ class PortTestCase(unittest.TestCase):
 
     def test_connection_none(self):
         class MySink(bt2._UserSinkComponent):
-            def __init__(comp_self, params):
+            def __init__(comp_self, params, obj):
                 comp_self._add_input_port('clear')
 
-            def _consume(self):
-                pass
-
-            def _graph_is_configured(self):
+            def _user_consume(self):
                 pass
 
         comp = self._create_comp(MySink)
@@ -784,13 +724,10 @@ class PortTestCase(unittest.TestCase):
 
     def test_is_connected_false(self):
         class MySink(bt2._UserSinkComponent):
-            def __init__(comp_self, params):
+            def __init__(comp_self, params, obj):
                 comp_self._add_input_port('clear')
 
-            def _consume(self):
-                pass
-
-            def _graph_is_configured(self):
+            def _user_consume(self):
                 pass
 
         comp = self._create_comp(MySink)
@@ -798,42 +735,33 @@ class PortTestCase(unittest.TestCase):
 
     def test_self_name(self):
         class MySink(bt2._UserSinkComponent):
-            def __init__(comp_self, params):
+            def __init__(comp_self, params, obj):
                 port = comp_self._add_input_port('clear')
                 self.assertEqual(port.name, 'clear')
 
-            def _consume(self):
-                pass
-
-            def _graph_is_configured(self):
+            def _user_consume(self):
                 pass
 
         self._create_comp(MySink)
 
     def test_self_connection_none(self):
         class MySink(bt2._UserSinkComponent):
-            def __init__(comp_self, params):
+            def __init__(comp_self, params, obj):
                 port = comp_self._add_input_port('clear')
                 self.assertIsNone(port.connection)
 
-            def _consume(self):
-                pass
-
-            def _graph_is_configured(self):
+            def _user_consume(self):
                 pass
 
         self._create_comp(MySink)
 
     def test_self_is_connected_false(self):
         class MySink(bt2._UserSinkComponent):
-            def __init__(comp_self, params):
+            def __init__(comp_self, params, obj):
                 port = comp_self._add_input_port('clear')
                 self.assertFalse(port.is_connected)
 
-            def _consume(self):
-                pass
-
-            def _graph_is_configured(self):
+            def _user_consume(self):
                 pass
 
         self._create_comp(MySink)
@@ -843,9 +771,8 @@ class PortTestCase(unittest.TestCase):
             def __next__(self):
                 raise bt2.Stop
 
-        class MySource(bt2._UserFilterComponent,
-                       message_iterator_class=MyIter):
-            def __init__(comp_self, params):
+        class MySource(bt2._UserFilterComponent, message_iterator_class=MyIter):
+            def __init__(comp_self, params, obj):
                 nonlocal user_datas
 
                 p = comp_self._add_output_port('port1')
@@ -863,9 +790,8 @@ class PortTestCase(unittest.TestCase):
             def __next__(self):
                 raise bt2.Stop
 
-        class MyFilter(bt2._UserFilterComponent,
-                       message_iterator_class=MyIter):
-            def __init__(comp_self, params):
+        class MyFilter(bt2._UserFilterComponent, message_iterator_class=MyIter):
+            def __init__(comp_self, params, obj):
                 nonlocal user_datas
 
                 p = comp_self._add_output_port('port1')
@@ -881,17 +807,17 @@ class PortTestCase(unittest.TestCase):
         user_datas = []
 
         comp = self._create_comp(MyFilter)
-        self.assertEqual(user_datas,
-                         [None, 'user data string', None, {'user data': 'dict'}])
+        self.assertEqual(
+            user_datas, [None, 'user data string', None, {'user data': 'dict'}]
+        )
 
     def test_sink_self_port_user_data(self):
         class MyIter(bt2._UserMessageIterator):
             def __next__(self):
                 raise bt2.Stop
 
-        class MySink(bt2._UserFilterComponent,
-                     message_iterator_class=MyIter):
-            def __init__(comp_self, params):
+        class MySink(bt2._UserFilterComponent, message_iterator_class=MyIter):
+            def __init__(comp_self, params, obj):
                 nonlocal user_datas
 
                 p = comp_self._add_input_port('port1')
This page took 0.031352 seconds and 4 git commands to generate.