Merge: Give top-level methods some rules
authorJean Privat <jean@pryen.org>
Tue, 17 Jun 2014 01:14:04 +0000 (21:14 -0400)
committerJean Privat <jean@pryen.org>
Tue, 17 Jun 2014 01:14:04 +0000 (21:14 -0400)
1. explicit `self` is forbidden in top-level method
2. top-level methods can only be called without a explicit receiver

In the code, there is workarounds for 3 hard-coded special cases:
* `sys` and `exit`: because, for an unknown reason, intern method cannot be top-level. #493
* `args` because it is currently both in Sys and Object thus has a crazy status. #461

These rules are only enforced as it in `typing` but does not change the model, tools, or engines.

Note: the first commits fix a bug in the `for` where the implicit `iterator` method was resolved with the `recv_is_self` flag always set to true.

Pull-Request: #494
Reviewed-by: Alexandre Terrasa <alexandre@moz-code.org>
Reviewed-by: Lucas Bajolet <r4pass@hotmail.com>

57 files changed:
examples/mnit_ballz/src/ballz_android.nit
examples/mnit_ballz/src/game_logic.nit
examples/mnit_dino/src/dino.nit
examples/mnit_moles/src/moles.nit
examples/pnacl/converter/converter.nit
examples/pnacl/converter/converter/js/pnacl_js.js
examples/shoot/src/shoot.nit
lib/android/android.nit
lib/android/dalvik.nit [new file with mode: 0644]
lib/android/native_app_glue.nit
lib/android/sensors.nit [moved from lib/mnit_android/android_sensor.nit with 59% similarity]
lib/app.nit
lib/mnit/mnit.nit
lib/mnit/mnit_fps.nit [new file with mode: 0644]
lib/mnit/opengles1.nit
lib/mnit/tileset.nit [new file with mode: 0644]
lib/mnit_android/android_app.nit
lib/mnit_display.nit
lib/mnit_linux/linux_app.nit
lib/mnit_linux/linux_assets.nit
lib/perfect_hashing.nit
lib/pnacl.nit
lib/ropes_debug.nit [new file with mode: 0644]
lib/standard/file.nit
lib/standard/math.nit
lib/standard/ropes.nit
lib/standard/standard.nit
lib/standard/stream.nit
lib/standard/string.nit
src/modelbuilder.nit
src/modelize_class.nit
src/modelize_property.nit
src/nitvm.nit [new file with mode: 0644]
src/parser/nit.sablecc3xx
src/parser/parser.nit
src/parser/tables_nit.c
src/pnacl_platform.nit
src/vm.nit [new file with mode: 0644]
tests/error_defs.nit
tests/niti.skip
tests/nitvm.args [new file with mode: 0644]
tests/sav/error_defs_alt9.res [new file with mode: 0644]
tests/sav/nitlight_args1.res
tests/sav/nitmetrics_args1.res
tests/sav/nitvm.res [new file with mode: 0644]
tests/sav/nitvm_args1.res [new file with mode: 0644]
tests/sav/nitvm_args2.res [new file with mode: 0644]
tests/sav/nitvm_args3.res [new file with mode: 0644]
tests/sav/nitx_args3.res
tests/sav/test_flatrope.res [new file with mode: 0644]
tests/sav/test_ropes.res [new file with mode: 0644]
tests/sav/test_text.res [new file with mode: 0644]
tests/sav/test_text_alt1.res [new file with mode: 0644]
tests/sav/test_text_alt2.res [new file with mode: 0644]
tests/test_flatrope.nit [new file with mode: 0644]
tests/test_ropes.nit [new file with mode: 0644]
tests/test_text.nit [new file with mode: 0644]

index c872b45..823edd9 100644 (file)
 
 module ballz_android
 
-import realtime
-import mnit_android
 import game_logic
 
 redef class App
 
        var screen: nullable Screen
 
-       var target_dt = 20000000
-
        redef fun run
        do
                sensors_support_enabled = true
@@ -35,6 +31,7 @@ redef class App
                gyroscope.enabled = true
                light.enabled = true
                proximity.enabled = true
+               maximum_fps = 50
 
                super
        end
@@ -49,16 +46,8 @@ redef class App
        do
                var screen = self.screen
                if screen != null then
-                       var clock = new Clock
-
                        screen.game.do_turn
                        screen.do_frame(display)
-                       
-                       var dt = clock.lapse
-                       if dt.sec == 0 and dt.nanosec < target_dt then
-                               var sleep_t = target_dt - dt.nanosec
-                               sys.nanosleep(0, sleep_t)
-                       end
                end
        end
 
index 2e64eab..38cf9e5 100644 (file)
@@ -17,6 +17,7 @@
 module game_logic
 
 import mnit_android
+import android::sensors
 
 class Ball
        var x: Float
index 23314f8..11efd91 100644 (file)
@@ -21,7 +21,6 @@ module dino is
 end
 
 import mnit
-import realtime
 
 import graphism
 import fancy_dino
@@ -31,8 +30,6 @@ redef class App
        var cavemen_at_first_level = 6
        var cavemen_incr = 4
 
-       var target_dt = 12000000
-
        var game : nullable Game = null
        var score = new Container[Int](0)
        var imgs : nullable ImageSet = null
@@ -42,6 +39,8 @@ redef class App
        do
                super
 
+               maximum_fps = 80
+
                var display = display
                assert display != null
 
@@ -59,16 +58,8 @@ redef class App
        do
                var game = game
                if game != null then
-                       var clock = new Clock
-
                        var turn = game.do_turn
                        game.draw( display, imgs.as(not null), turn )
-
-                       var dt = clock.lapse
-                       if dt.sec == 0 and dt.nanosec < target_dt then
-                               var sleep_t = target_dt - dt.nanosec
-                               sys.nanosleep(0, sleep_t)
-                       end
                else
                        splash.draw( display, true )
                end
index a0d783a..08642d1 100644 (file)
@@ -20,7 +20,6 @@
 module moles
 
 import mnit
-import realtime
 
 class Hole
        var game: Game
@@ -231,12 +230,11 @@ redef class App
 
        var screen: nullable Screen = null
 
-       var target_dt = 20000000
-
        redef fun window_created
        do
                super
 
+               maximum_fps = 50
                init_screen_and_game
        end
 
@@ -246,16 +244,8 @@ redef class App
        do
                var screen = self.screen
                if screen != null then
-                       var clock = new Clock
-
                        screen.game.do_turn
                        screen.do_frame(display)
-
-                       var dt = clock.lapse
-                       if dt.sec == 0 and dt.nanosec < target_dt then
-                               var sleep_t = target_dt - dt.nanosec
-                               sys.nanosleep(0, sleep_t)
-                       end
                end
        end
 
index 4cbf103..907aaa3 100644 (file)
@@ -18,7 +18,8 @@
 #
 # First imports the pnacl module
 # Then redefines the 'handle_dictionary' method
-# Finally creates a converter and initializes it
+# Creates a converter and initializes it
+# Finally checks for dictionaries
 
 import pnacl
 
@@ -123,5 +124,6 @@ class Converter
        end
 end
 
-var converter = new Converter
-converter.initialize # Needed to correctly set up Nit control over the Pepper API
+redef fun app do return once new Converter
+app.initialize # Needed to correctly set up Nit control over the Pepper API
+app.run # Launches an infinite loop in order to check for dictionaries
index ee3a184..da29a31 100644 (file)
@@ -30,7 +30,12 @@ function moduleDidLoad() {
 // (in C) or pp::Instance.PostMessage() (in C++).  This implementation
 // displays the result in the JS console, puts the result in the '#rez' input and make it visible.
 function handleMessage(message_event) {
-       console.log(message_event.data.value.valueOf());
-       $('#rez').val(message_event.data.value.valueOf().toFixed(2));
-       $('#rez').css('visibility', 'visible');
+       if (message_event.data.hasOwnProperty('exit')){
+               console.log('Nit code exited with value: ' + message_event.data.exit + '.');
+       }
+       else {
+               console.log(message_event.data.value.valueOf());
+               $('#rez').val(message_event.data.value.valueOf().toFixed(2));
+               $('#rez').css('visibility', 'visible');
+       }
 }
index ee41363..48cadaa 100644 (file)
 
 # Space shooter.
 # This program is a fun game but also a good example of the scene2d module
-module shoot
+module shoot is
+       app_name("Space Shooter")
+       app_version(0, 1, git_revision)
+end
 
 import mnit
 import shoot_logic
@@ -23,16 +26,16 @@ redef class Sprite
        # mnit specific method to draw a sprite
        # app is used to optain the assets and the display
        # Each sprite should implements this method
-       fun draw_on_display(app: ShootApp) do end
+       fun draw_on_display(app: App) do end
 
        # Helper function to draw an image centered on the current sprite position
-       fun draw_image(app: ShootApp, img: Image)
+       fun draw_image(app: App, img: Image)
        do
                app.display.blit_centered(img, (self.x.to_f/app.scale).to_i, (self.y.to_f/app.scale).to_i)
        end
 
        # Helper function to draw an image translated and rotated on the current sprite position
-       fun draw_rotated_image(app: ShootApp, img: Image, dx, dy: Int, angle: Float)
+       fun draw_rotated_image(app: App, img: Image, dx, dy: Int, angle: Float)
        do
                app.display.blit_rotated(img, self.x.to_f/app.scale, self.y.to_f/app.scale, angle)
        end
@@ -166,8 +169,8 @@ redef class Star
 end
 
 redef class Scene
-       fun draw_on_display(app: ShootApp) do end
-       fun input(app: ShootApp, input_event: InputEvent): Bool do return false
+       fun draw_on_display(app: App) do end
+       fun input(app: App, input_event: InputEvent): Bool do return false
 end
 
 redef class PlayScene
@@ -265,8 +268,7 @@ end
 
 ###
 
-class ShootApp
-       super App
+redef class App
        super View
 
        var debug: Bool = false
@@ -283,8 +285,6 @@ class ShootApp
                end
        end
 
-       init do super
-
        var scene: ShotScene
 
        var img_hitbox: Image
@@ -321,6 +321,8 @@ class ShootApp
 
                scale = (800.0 * 600.0 / display.width.to_f / display.height.to_f).sqrt * 100.0
 
+               debug = args.length > 0 and args.first == "--debug"
+
                # TODO load assets here
                # ex: img = load_image( "img.png" )
                #     to get file located at assets/img.png before deployement
@@ -378,9 +380,6 @@ class ShootApp
                        if not self.scene.exists then quit = true
                end
                self.scene.draw_on_display(self)
-
-               # Wait the next frame
-               sys.nanosleep(0, 16000000)
        end
 
        var paused: Bool = false
@@ -410,6 +409,5 @@ if args.length > 0 and args.first == "--headless" then
        return
 end
 
-var app = new ShootApp
-app.debug = args.length > 0 and args.first == "--debug"
+app.setup
 app.run
index f3a607b..3fc1a09 100644 (file)
@@ -26,6 +26,7 @@ module android
 
 import platform
 import native_app_glue
+import dalvik
 private import log
 
 # Uses Android logs to print everything
@@ -74,4 +75,18 @@ redef class App
                paused = false
                super
        end
+
+       redef fun lost_focus
+       do
+               paused = true
+               super
+       end
+
+       redef fun gained_focus
+       do
+               paused = false
+               super
+       end
+
+       redef fun destroy do exit 0
 end
diff --git a/lib/android/dalvik.nit b/lib/android/dalvik.nit
new file mode 100644 (file)
index 0000000..a795154
--- /dev/null
@@ -0,0 +1,121 @@
+# This file is part of NIT (http://www.nitlanguage.org).
+#
+# Copyright 2012-2014 Alexis Laferrière <alexis.laf@xymus.net>
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Java related services specific to Android and its Dalvik VM
+module dalvik
+
+import native_app_glue
+
+extern class JavaClassLoader in "Java" `{java.lang.ClassLoader`}
+       super JavaObject
+end
+
+redef class Sys
+       # Get the running JVM
+       redef fun create_default_jvm
+       do
+               var jvm = app.native_app_glue.ndk_native_activity.vm
+               var jni_env = jvm.attach_current_thread
+               if jni_env.address_is_null then jni_env = jvm.env
+
+               self.jvm = jvm
+               self.jni_env = jni_env
+       end
+
+       private var class_loader: nullable JavaObject = null
+       private var class_loader_method: nullable JMethodID = null
+       redef fun load_jclass(name)
+       do
+               var class_loader = self.class_loader
+               if class_loader == null then
+                       find_class_loader(app.native_app_glue.ndk_native_activity.java_native_activity)
+                       class_loader = self.class_loader
+                       assert class_loader != null
+               end
+
+               var class_loader_method = self.class_loader_method
+               assert class_loader_method != null
+
+               return load_jclass_intern(class_loader, class_loader_method, name)
+       end
+
+       private fun find_class_loader(native_activity: NativeActivity) import jni_env, class_loader=, JavaObject.as nullable, class_loader_method=, JMethodID.as nullable `{
+               JNIEnv *env = Sys_jni_env(recv);
+
+               // Retrieve main activity
+               jclass class_activity = (*env)->GetObjectClass(env, native_activity);
+               if (class_activity == NULL) {
+                       __android_log_print(ANDROID_LOG_ERROR, "Nit", "retreiving activity class");
+                       (*env)->ExceptionDescribe(env);
+                       exit(1);
+               }
+
+               jmethodID class_activity_getClassLoader = (*env)->GetMethodID(env, class_activity, "getClassLoader", "()Ljava/lang/ClassLoader;");
+               if (class_activity_getClassLoader == NULL) {
+                       __android_log_print(ANDROID_LOG_ERROR, "Nit", "retreiving 'getClassLoader' method");
+                       (*env)->ExceptionDescribe(env);
+                       exit(1);
+               }
+
+               // Call activity.getClassLoader
+               jobject instance_class_loader = (*env)->CallObjectMethod(env, native_activity, class_activity_getClassLoader);
+               if (instance_class_loader == NULL) {
+                       __android_log_print(ANDROID_LOG_ERROR, "Nit", "retreiving class loader instance");
+                       (*env)->ExceptionDescribe(env);
+                       exit(1);
+               }
+
+               jclass class_class_loader = (*env)->GetObjectClass(env, instance_class_loader);
+               if (class_class_loader == NULL) {
+                       __android_log_print(ANDROID_LOG_ERROR, "Nit", "retreiving class of class loader");
+                       (*env)->ExceptionDescribe(env);
+                       exit(1);
+               }
+
+               // Get the method ClassLoader.findClass
+               jmethodID class_class_loader_findClass = (*env)->GetMethodID(env, class_class_loader, "findClass", "(Ljava/lang/String;)Ljava/lang/Class;");
+               if (class_class_loader_findClass == NULL) {
+                       __android_log_print(ANDROID_LOG_ERROR, "Nit", "retreiving 'findClass' method");
+                       (*env)->ExceptionDescribe(env);
+                       exit(1);
+               }
+
+               // Return the values to Nit
+               Sys_class_loader__assign(recv, JavaObject_as_nullable((*env)->NewGlobalRef(env, instance_class_loader)));
+               Sys_class_loader_method__assign(recv, JMethodID_as_nullable(class_class_loader_findClass));
+
+               // Clean up
+               (*env)->DeleteLocalRef(env, class_activity);
+               (*env)->DeleteLocalRef(env, instance_class_loader);
+               (*env)->DeleteLocalRef(env, class_class_loader);
+       `}
+
+       private fun load_jclass_intern(instance_class_loader: JavaObject, class_loader_findClass: JMethodID, name: NativeString): JClass import jni_env `{
+               JNIEnv *env = Sys_jni_env(recv);
+               jobject class_name = (*env)->NewStringUTF(env, name);
+
+               jclass java_class = (*env)->CallObjectMethod(env, instance_class_loader, class_loader_findClass, class_name);
+               if (java_class == NULL) {
+                       __android_log_print(ANDROID_LOG_ERROR, "Nit", "loading targetted class");
+                       (*env)->ExceptionDescribe(env);
+                       exit(1);
+               }
+
+               (*env)->DeleteLocalRef(env, class_name);
+
+               return java_class;
+       `}
+end
index 8b622f3..50368de 100644 (file)
@@ -123,7 +123,7 @@ extern class NativeActivity in "Java" `{ android.app.NativeActivity `}
 end
 
 redef class App
-       redef init
+       redef fun setup
        do
                var native_app_glue = native_app_glue
                native_app_glue.user_data = self
@@ -207,6 +207,29 @@ redef class App
        # 
        # Raised when the soft input window being shown or hidden, and similar events.
        fun content_rect_changed do end
+
+       # Call the `ALooper` to retrieve events and callback the application
+       fun poll_looper(timeout_ms: Int) import handle_looper_event `{
+               int ident;
+               int event;
+               void* source;
+               while ((ident=ALooper_pollAll(timeout_ms, NULL, &event, &source)) >= 0) {
+                       App_handle_looper_event(recv, ident, event, source);
+               }
+       `}
+
+       # Handle an event retrieved by the `ALooper` and `poll_looper` without a callback
+       protected fun handle_looper_event(ident, event: Int, data: Pointer) import native_app_glue,
+               save_state, init_window, term_window, gained_focus, lost_focus, pause, stop,
+               destroy, start, resume, low_memory, config_changed, input_changed,
+               window_resized, window_redraw_needed, content_rect_changed `{
+
+               struct android_app *app_glue = App_native_app_glue(recv);
+               struct android_poll_source* source = (struct android_poll_source*)data;
+               
+               // Process this event.
+               if (source != NULL) source->process(app_glue, source);
+       `}
 end
 
 # An Android activity implemented in C. This is the C part of `NativeActivity`
@@ -325,6 +348,7 @@ end
 
 # Android NDK's structure to handle events synchronously
 extern class ALooper `{ ALooper* `}
+       # Returns the looper associated with the calling thread, or NULL if there is not one
        new for_thread `{ return ALooper_forThread(); `}
 end
 
similarity index 59%
rename from lib/mnit_android/android_sensor.nit
rename to lib/android/sensors.nit
index 7cb9843..2246298 100644 (file)
@@ -17,7 +17,9 @@
 # This module is used to manipulate android sensors
 # The sensor support is implemented in android_app module, so the user can enable the type of sensor he wants to use.
 # There is an example of how you can use the android sensors in nit/examples/mnit_ballz :
-# `var app = new MyApp
+#
+# ~~~~
+# var app = new MyApp
 # app.sensors_support_enabled = true
 # app.accelerometer.enabled = true
 # app.accelerometer.eventrate = 10000
 # app.gyroscope.enabled = true
 # app.light.enabled = true
 # app.proximity.enabled = true
-# app.main_loop`
+# app.main_loop
+# ~~~~
 #
 # In this example, we enable the sensor support, then enable all types of sensors supported, before running the app.
 # The result is you get all type of SensorEvent (ASensorAccelerometer, ASensorMagneticField ...) in the input method of your app
-module android_sensor
+module sensors
 
 import android
 import mnit
@@ -37,7 +40,6 @@ import mnit
 in "C header" `{
        #include <jni.h>
        #include <android/sensor.h>
-       #include <android_native_app_glue.h>
 `}
 
 extern class ASensorType `{int`}
@@ -223,3 +225,145 @@ extern class ASensorEvents `{ASensorEvent*`}
                return recv+index;
        `}
 end
+
+redef class App
+       var accelerometer = new AndroidSensor
+       var magnetic_field = new AndroidSensor
+       var gyroscope = new AndroidSensor
+       var light = new AndroidSensor
+       var proximity = new AndroidSensor
+       var sensormanager: ASensorManager
+       var eventqueue: ASensorEventQueue
+       var sensors_support_enabled writable = false
+
+       private fun extern_input_sensor_accelerometer(event: ASensorAccelerometer) do input(event)
+       private fun extern_input_sensor_magnetic_field(event: ASensorMagneticField) do input(event)
+       private fun extern_input_sensor_gyroscope(event: ASensorGyroscope) do input(event)
+       private fun extern_input_sensor_light(event: ASensorLight) do input(event)
+       private fun extern_input_sensor_proximity(event: ASensorProximity) do input(event)
+
+       # Sensors support
+       # The user decides which sensors he wants to use by setting them enabled
+       private fun enable_sensors
+       do
+               if sensors_support_enabled then enable_sensors_management else return
+               if accelerometer.enabled then enable_accelerometer
+               if magnetic_field.enabled then enable_magnetic_field
+               if gyroscope.enabled then enable_gyroscope
+               if light.enabled then enable_light
+               if proximity.enabled then enable_proximity
+       end
+
+       private fun enable_sensors_management
+       do
+               sensormanager = new ASensorManager.get_instance
+               #eventqueue = sensormanager.create_event_queue(new NdkAndroidApp)
+               eventqueue = initialize_event_queue(sensormanager, native_app_glue.looper)
+       end
+
+       # HACK: need a nit method to get mnit_java_app, then we can use the appropriate sensormanager.create_event_queue method to initialize the event queue
+       private fun initialize_event_queue(sensormanager: ASensorManager, looper: ALooper): ASensorEventQueue `{
+               return ASensorManager_createEventQueue(sensormanager, looper, LOOPER_ID_USER, NULL, NULL);
+       `}
+
+       private fun enable_accelerometer
+       do
+               accelerometer.asensor = sensormanager.get_default_sensor(new ASensorType.accelerometer)
+               if accelerometer.asensor.address_is_null then 
+                               print "Accelerometer sensor unavailable" 
+               else
+                               if eventqueue.enable_sensor(accelerometer.asensor) < 0 then print "Accelerometer enabling failed"
+                       eventqueue.set_event_rate(accelerometer.asensor, accelerometer.event_rate)
+               end
+       end
+
+       private fun enable_magnetic_field
+       do
+               magnetic_field.asensor = sensormanager.get_default_sensor(new ASensorType.magnetic_field)
+               if magnetic_field.asensor.address_is_null then
+                               print "Magnetic Field unavailable"
+               else
+                       if eventqueue.enable_sensor(magnetic_field.asensor) < 0 then print "Magnetic Field enabling failed"
+                       eventqueue.set_event_rate(magnetic_field.asensor, magnetic_field.event_rate)
+               end
+       end
+
+       private fun enable_gyroscope
+       do
+               gyroscope.asensor = sensormanager.get_default_sensor(new ASensorType.gyroscope)
+               if gyroscope.asensor.address_is_null then
+                               print "Gyroscope sensor unavailable"
+               else
+                       if eventqueue.enable_sensor(gyroscope.asensor) < 0 then print "Gyroscope enabling failed"
+                       eventqueue.set_event_rate(gyroscope.asensor, gyroscope.event_rate)
+               end
+       end
+
+       private fun enable_light
+       do
+               light.asensor = sensormanager.get_default_sensor(new ASensorType.light)
+               if light.asensor.address_is_null then
+                               print "Light sensor unavailable"
+               else
+                       if eventqueue.enable_sensor(light.asensor) < 0 then print "Light enabling failed"
+                       eventqueue.set_event_rate(light.asensor, light.event_rate)
+               end
+       end
+
+       private fun enable_proximity
+       do
+               proximity.asensor = sensormanager.get_default_sensor(new ASensorType.proximity)
+               if proximity.asensor.address_is_null then 
+                               print "Proximity sensor unavailable"
+               else
+                       if eventqueue.enable_sensor(proximity.asensor) < 0 then print "Proximity enabling failed"
+                       eventqueue.set_event_rate(light.asensor, light.event_rate)
+               end
+       end
+
+       redef fun run
+       do
+               enable_sensors
+
+               super
+       end
+
+       redef fun handle_looper_event(ident, event, data)
+       do
+               super
+               handle_sensor_events(ident)
+       end
+
+       private fun handle_sensor_events(ident: Int) import extern_input_sensor_accelerometer, extern_input_sensor_magnetic_field, extern_input_sensor_gyroscope, extern_input_sensor_light, extern_input_sensor_proximity, eventqueue `{
+               //If a sensor has data, process it
+               if(ident == LOOPER_ID_USER) {
+                       //maybe add a boolean to the app to know if we want to use Sensor API or ASensorEvent directly ...
+                       ASensorEvent* events = malloc(sizeof(ASensorEvent)*10);
+                       int nbevents;
+                       ASensorEventQueue* queue = App_eventqueue(recv);
+                       while((nbevents = ASensorEventQueue_getEvents(queue, events, 10)) > 0) {
+                               int i;
+                               for(i = 0; i < nbevents; i++){
+                                       ASensorEvent event = events[i];
+                                       switch (event.type) {
+                                               case ASENSOR_TYPE_ACCELEROMETER:
+                                                       App_extern_input_sensor_accelerometer(recv, &event);
+                                                       break;
+                                               case ASENSOR_TYPE_MAGNETIC_FIELD:
+                                                       App_extern_input_sensor_magnetic_field(recv, &event);
+                                                       break;
+                                               case ASENSOR_TYPE_GYROSCOPE:
+                                                       App_extern_input_sensor_gyroscope(recv, &event);
+                                                       break;
+                                               case ASENSOR_TYPE_LIGHT:
+                                                       App_extern_input_sensor_light(recv, &event);
+                                                       break;
+                                               case ASENSOR_TYPE_PROXIMITY:
+                                                       App_extern_input_sensor_proximity(recv, &event);
+                                                       break;
+                                       }
+                               }
+                       }
+               }
+       `}
+end
index bd74daa..7ee9493 100644 (file)
@@ -27,6 +27,10 @@ module app
 class App
        protected init do end
 
+       # Starts the internal setup of graphical and other stuff
+       # Is called just before run
+       fun setup do end
+
        # Main entry point of your application
        fun run do end
 
@@ -49,4 +53,5 @@ class App
 end
 
 protected fun app: App do return once new App
+app.setup
 app.run
index 3e313d4..53c4681 100644 (file)
@@ -21,3 +21,4 @@ import mnit_app
 import opengles1
 import assets
 import numbers
+import mnit_fps
diff --git a/lib/mnit/mnit_fps.nit b/lib/mnit/mnit_fps.nit
new file mode 100644 (file)
index 0000000..cd30e83
--- /dev/null
@@ -0,0 +1,75 @@
+# This file is part of NIT ( http://www.nitlanguage.org ).
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Frame-rate control for applications
+module mnit_fps
+
+import mnit_app
+private import realtime
+
+redef class App
+       # Limit the frame-rate to a given frequency
+       # This basically limits how much `frame_core` is called per second.
+       # Zero (or a negative value) means no limit.
+       #
+       # Applications can modify this value even during the main-loop.
+       var maximum_fps writable = 60
+
+       # Current frame-rate
+       # Updated each 5 seconds.
+       var current_fps = 0.0
+
+       redef fun full_frame
+       do
+               super
+               limit_fps
+       end
+
+       # The clock for limit_fps
+       private var clock = new Clock
+
+       # Number of frames since the last deadline
+       # Used tocompute `current_fps`.
+       private var frame_count = 0
+
+       # Deadline used to compute `current_fps`
+       private var frame_count_deadline = 0
+
+       # Check and sleep to maitain a frame-rate bellow `maximum_fps`
+       # Also periodically uptate `current_fps`
+       # Is automatically called at the end of `full_frame`.
+       fun limit_fps
+       do
+               var t = clock.total.sec
+               if t >= frame_count_deadline then
+                       var cfps = frame_count_deadline.to_f / 5.0
+                       self.current_fps = cfps
+                       frame_count = 0
+                       frame_count_deadline = t + 5
+               end
+               frame_count += 1
+
+               var mfps = maximum_fps
+               if mfps <= 0 then return
+               var dt = clock.lapse
+               var target_dt = 1000000000 / mfps
+               var sec = dt.sec
+               var nanosec = dt.nanosec
+               if sec == 0 and nanosec < target_dt then
+                       var sleep_t = target_dt - nanosec
+                       sys.nanosleep(0, sleep_t)
+                       dt = clock.lapse
+               end
+       end
+end
index a0233fa..dd5af2d 100644 (file)
@@ -421,6 +421,14 @@ class Opengles1Display
                glClearColor( r, g, b, a );
                glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
        `}
+
+       # Set the current color applied to all drawing
+       #
+       # require: r, g, b, a in [0.0 .. 1.0]
+       fun color(r, g, b, a: Float) `{ glColor4f(r, g, b, a); `}
+
+       # Reset the current color to opaque white
+       fun reset_color `{ glColor4f(1.0f, 1.0f, 1.0f, 1.0f); `}
 end
 
 extern class Opengles1Image in "C" `{struct mnit_opengles_Texture *`}
diff --git a/lib/mnit/tileset.nit b/lib/mnit/tileset.nit
new file mode 100644 (file)
index 0000000..7b473f3
--- /dev/null
@@ -0,0 +1,125 @@
+# This file is part of NIT ( http://www.nitlanguage.org ).
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Manage images that are tileset or glyphset (for bitmap fonts)
+module tileset
+
+import mnit_display
+
+# Efficienly retrieve tiles in a big image
+class TileSet
+       # The image containing the tileset
+       var image: Image
+
+       # The witdh of a tile
+       var width: Int
+
+       # The height of a tile
+       var height: Int
+
+       init(image: Image, width: Int, height: Int)
+       do
+               self.image = image
+               self.width = width
+               self.height = height
+
+               self.nb_cols = image.width / width
+               self.nb_rows = image.height / height
+
+               for j in [0..nb_rows[ do
+                       for i in [0..nb_cols[ do
+                               subimages.add image.subimage(i*width,j*height,width,height)
+                       end
+               end
+       end
+
+       # The number of columns of tiles in the image
+       var nb_cols: Int
+
+       # The number of rows of tiles in the image
+       var nb_rows: Int
+
+       # Cache for images of tiles
+       private var subimages = new Array[Image]
+
+       # The subimage of given tile
+       # Aborts if x or y are out of bound
+       fun [](x,y: Int): Image
+       do
+               assert x >= 0 and x < nb_cols and y >= 0 and y <= nb_rows else print "{x}x{y}<?{nb_cols}x{nb_rows}"
+               var idx = x + y * nb_cols
+               return subimages[idx]
+       end
+end
+
+# A monospace bitmap font where glyphs are stored in a tileset
+class TileSetFont
+       super TileSet
+
+       # Each caracter in the image
+       # in left->right, then top->bottom order
+       # Use space (' ') for holes in the tileset
+       var chars: String
+
+       init(image: Image, width: Int, height: Int, chars: String)
+       do
+               super
+               self.chars = chars
+       end
+
+       # Additional space to insert horizontally between characters
+       # A negave value will display tile overlaped
+       var hspace: Int writable = 0
+
+       # Additional space to insert vertically between characters
+       # A negave value will display tile overlaped
+       var vspace: Int writable = 0
+
+       # The glyph (tile) associated to the caracter `c` according to `chars`
+       # Returns null if `c` is not in `chars`
+       fun char(c: Char): nullable Image
+       do
+               var i = chars.index_of(c)
+               if i == -1 then return null
+               return subimages[i]
+       end
+end
+
+redef class Display
+       # Blit the text using a monospace bitmap font
+       # '\n' are rendered as carriage return
+       fun text(text: String, font: TileSetFont, x, y: Int)
+       do
+               var cx = x
+               var cy = y
+               var sw = font.width + font.hspace
+               var sh = font.height + font.vspace
+               for c in text.chars do
+                       if c == '\n' then
+                               cx = x
+                               cy += sh
+                               continue
+                       end
+                       if c == ' ' then
+                               cx += sw
+                               continue
+                       end
+                       var image = font.char(c)
+                       if image != null then
+                               blit(image, cx, cy)
+                       end
+                       cx += sw
+               end
+       end
+end
index b9dbc3e..3819c25 100644 (file)
@@ -19,14 +19,12 @@ module android_app
 
 import mnit
 import android
-import android_sensor
 
 in "C header" `{
        #include <jni.h>
        #include <errno.h>
        #include <android/log.h>
        #include <android_native_app_glue.h>
-       #include <android/sensor.h>
 
        #define LOGW(...) ((void)__android_log_print(ANDROID_LOG_WARN, "mnit", __VA_ARGS__))
        #ifdef DEBUG
@@ -70,49 +68,6 @@ in "C" `{
 
                return 0;
        }
-
-       void mnit_frame(App nit_app)
-       {
-               if (mnit_display == EGL_NO_DISPLAY) {
-                       LOGI("no frame");
-                       return;
-               }
-
-               /*if (mnit_orientation_changed)
-               {
-                       mnit_orientation_changed = 0;
-
-                       if (mnit_surface != EGL_NO_SURFACE) {
-                               eglDestroySurface(mnit_display,  mnit_surface);
-                       }
-                       EGLSurface surface = eglCreateWindowSurface(mnit_display, mnit_config, mnit_java_app->window, NULL);
-
-                       if (eglMakeCurrent(mnit_display, surface, surface, mnit_context) == EGL_FALSE) {
-                               LOGW("Unable to eglMakeCurrent");
-                       }
-
-                       eglQuerySurface(mnit_display, surface, EGL_WIDTH, &mnit_width);
-                       eglQuerySurface(mnit_display, surface, EGL_HEIGHT, &mnit_height);
-
-                       mnit_surface = surface;
-
-                       glViewport(0, 0, mnit_width, mnit_height);
-                       glMatrixMode(GL_PROJECTION);
-                       glLoadIdentity();
-                       glOrthof(0.0f, mnit_width, mnit_height, 0.0f, 0.0f, 1.0f);
-                       glMatrixMode(GL_MODELVIEW);
-               }
-               */
-
-               LOGI("frame");
-
-               glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
-               glClear(GL_COLOR_BUFFER_BIT); // | GL_DEPTH_BUFFER_BIT);
-
-               App_full_frame(nit_app);
-
-               LOGI("frame b");
-       }
 `}
 
 
@@ -204,7 +159,7 @@ class AndroidPointerEvent
 
        redef fun y: Float do return extern_y(motion_event.inner_event, pointer_id)
        private fun extern_y(motion_event: InnerAndroidMotionEvent, pointer_id: Int): Float is extern `{
-               return ((int) AMotionEvent_getY(motion_event, pointer_id) * mnit_zoom) + 32;
+               return ((int) AMotionEvent_getY(motion_event, pointer_id) * mnit_zoom);
        `}
 
        fun pressure: Float do return extern_pressure(motion_event.inner_event, pointer_id)
@@ -244,7 +199,7 @@ extern class AndroidKeyEvent in "C" `{AInputEvent *`}
                return 0;
        `}
 
-       fun is_back_key: Bool do return key_code == 2
+       fun is_back_key: Bool do return key_code == 4
        fun is_menu_key: Bool do return key_code == 82
        fun is_search_key: Bool do return key_code == 84
 end
@@ -253,15 +208,6 @@ redef class App
        redef type IE: AndroidInputEvent
        redef type D: Opengles1Display
 
-       var accelerometer = new AndroidSensor
-       var magnetic_field = new AndroidSensor
-       var gyroscope = new AndroidSensor
-       var light = new AndroidSensor
-       var proximity = new AndroidSensor
-       var sensormanager: ASensorManager
-       var eventqueue: ASensorEventQueue
-       var sensors_support_enabled writable = false
-
        redef fun init_window
        do
                set_as_input_handler native_app_glue
@@ -270,7 +216,7 @@ redef class App
                super
        end
 
-       private fun set_as_input_handler(app_glue: NativeAppGlue) `{
+       private fun set_as_input_handler(app_glue: NativeAppGlue) import extern_input_key, extern_input_motion `{
                app_glue->onInputEvent = mnit_handle_input;
        `}
 
@@ -295,258 +241,5 @@ redef class App
                return handled
        end
 
-       private fun extern_input_sensor_accelerometer(event: ASensorAccelerometer) do input(event)
-       private fun extern_input_sensor_magnetic_field(event: ASensorMagneticField) do input(event)
-       private fun extern_input_sensor_gyroscope(event: ASensorGyroscope) do input(event)
-       private fun extern_input_sensor_light(event: ASensorLight) do input(event)
-       private fun extern_input_sensor_proximity(event: ASensorProximity) do input(event)
-
-       # Sensors support
-       # The user decides which sensors he wants to use by setting them enabled
-       private fun enable_sensors
-       do
-               if sensors_support_enabled then enable_sensors_management else return
-               if accelerometer.enabled then enable_accelerometer
-               if magnetic_field.enabled then enable_magnetic_field
-               if gyroscope.enabled then enable_gyroscope
-               if light.enabled then enable_light
-               if proximity.enabled then enable_proximity
-       end
-
-       private fun enable_sensors_management
-       do
-               sensormanager = new ASensorManager.get_instance
-               #eventqueue = sensormanager.create_event_queue(new NdkAndroidApp)
-               eventqueue = initialize_event_queue(sensormanager, native_app_glue.looper)
-       end
-
-       # HACK: need a nit method to get mnit_java_app, then we can use the appropriate sensormanager.create_event_queue method to initialize the event queue
-       private fun initialize_event_queue(sensormanager: ASensorManager, looper: ALooper): ASensorEventQueue `{
-               return ASensorManager_createEventQueue(sensormanager, looper, LOOPER_ID_USER, NULL, NULL);
-       `}
-
-       private fun enable_accelerometer
-       do
-               accelerometer.asensor = sensormanager.get_default_sensor(new ASensorType.accelerometer)
-               if accelerometer.asensor.address_is_null then 
-                               print "Accelerometer sensor unavailable" 
-               else
-                               if eventqueue.enable_sensor(accelerometer.asensor) < 0 then print "Accelerometer enabling failed"
-                       eventqueue.set_event_rate(accelerometer.asensor, accelerometer.event_rate)
-               end
-       end
-
-       private fun enable_magnetic_field
-       do
-               magnetic_field.asensor = sensormanager.get_default_sensor(new ASensorType.magnetic_field)
-               if magnetic_field.asensor.address_is_null then
-                               print "Magnetic Field unavailable"
-               else
-                       if eventqueue.enable_sensor(magnetic_field.asensor) < 0 then print "Magnetic Field enabling failed"
-                       eventqueue.set_event_rate(magnetic_field.asensor, magnetic_field.event_rate)
-               end
-       end
-
-       private fun enable_gyroscope
-       do
-               gyroscope.asensor = sensormanager.get_default_sensor(new ASensorType.gyroscope)
-               if gyroscope.asensor.address_is_null then
-                               print "Gyroscope sensor unavailable"
-               else
-                       if eventqueue.enable_sensor(gyroscope.asensor) < 0 then print "Gyroscope enabling failed"
-                       eventqueue.set_event_rate(gyroscope.asensor, gyroscope.event_rate)
-               end
-       end
-
-       private fun enable_light
-       do
-               light.asensor = sensormanager.get_default_sensor(new ASensorType.light)
-               if light.asensor.address_is_null then
-                               print "Light sensor unavailable"
-               else
-                       if eventqueue.enable_sensor(light.asensor) < 0 then print "Light enabling failed"
-                       eventqueue.set_event_rate(light.asensor, light.event_rate)
-               end
-       end
-
-       private fun enable_proximity
-       do
-               proximity.asensor = sensormanager.get_default_sensor(new ASensorType.proximity)
-               if proximity.asensor.address_is_null then 
-                               print "Proximity sensor unavailable"
-               else
-                       if eventqueue.enable_sensor(proximity.asensor) < 0 then print "Proximity enabling failed"
-                       eventqueue.set_event_rate(light.asensor, light.event_rate)
-               end
-       end
-
-       redef fun run is extern import full_frame, generate_input, enable_sensors, native_app_glue `{
-               struct android_app* app_glue = App_native_app_glue(recv);
-               LOGI("nitni loop");
-
-               //Enbales sensors if needed
-               App_enable_sensors(recv);
-
-               while (1) {
-                       App_generate_input(recv);
-
-                       if (app_glue->destroyRequested != 0) return;
-
-                       mnit_frame(recv);
-               }
-               /* App_exit(); // this is unreachable anyway*/
-       `}
-
-       redef fun generate_input import save_state, pause, resume, gained_focus, lost_focus, init_window, term_window, extern_input_key, extern_input_motion, extern_input_sensor_accelerometer, extern_input_sensor_magnetic_field, extern_input_sensor_gyroscope, extern_input_sensor_light, extern_input_sensor_proximity, eventqueue, native_app_glue `{
-               int ident;
-               int events;
-               static int block = 0;
-               struct android_poll_source* source;
-               struct android_app *app_glue = App_native_app_glue(recv);
-
-               while ((ident=ALooper_pollAll(0, NULL, &events,
-                               (void**)&source)) >= 0) { /* first 0 is for non-blocking */
-
-                       // Process this event.
-                       if (source != NULL)
-                               source->process(app_glue, source);
-
-                       //If a sensor has data, process it
-                       if(ident == LOOPER_ID_USER) {
-                               //maybe add a boolean to the app to know if we want to use Sensor API or ASensorEvent directly ...
-                               ASensorEvent* events = malloc(sizeof(ASensorEvent)*10);
-                               int nbevents;
-                               ASensorEventQueue* queue = App_eventqueue(recv);
-                               while((nbevents = ASensorEventQueue_getEvents(queue, events, 10)) > 0) {
-                                       int i;
-                                       for(i = 0; i < nbevents; i++){
-                                               ASensorEvent event = events[i];
-                                               switch (event.type) {
-                                                       case ASENSOR_TYPE_ACCELEROMETER:
-                                                               App_extern_input_sensor_accelerometer(recv, &event);
-                                                               break;
-                                                       case ASENSOR_TYPE_MAGNETIC_FIELD:
-                                                               App_extern_input_sensor_magnetic_field(recv, &event);
-                                                               break;
-                                                       case ASENSOR_TYPE_GYROSCOPE:
-                                                               App_extern_input_sensor_gyroscope(recv, &event);
-                                                               break;
-                                                       case ASENSOR_TYPE_LIGHT:
-                                                               App_extern_input_sensor_light(recv, &event);
-                                                               break;
-                                                       case ASENSOR_TYPE_PROXIMITY:
-                                                               App_extern_input_sensor_proximity(recv, &event);
-                                                               break;
-                                               }
-                                       }
-                               }
-                       }
-
-                       // Check if we are exiting.
-                       if (app_glue->destroyRequested != 0) return;
-               }
-       `}
-end
-
-extern class JavaClassLoader in "Java" `{java.lang.ClassLoader`}
-       super JavaObject
-end
-
-redef class Sys
-       # Get the running JVM
-       redef fun create_default_jvm
-       do
-               var jvm = app.native_app_glue.ndk_native_activity.vm
-               var jni_env = jvm.attach_current_thread
-               if jni_env.address_is_null then jni_env = jvm.env
-
-               self.jvm = jvm
-               self.jni_env = jni_env
-       end
-
-       #protected fun ndk_jvm: JavaVM do`{ return mnit_java_app->activity->vm; `}
-
-       private var class_loader: nullable JavaObject = null
-       private var class_loader_method: nullable JMethodID = null
-       redef fun load_jclass(name)
-       do
-               var class_loader = self.class_loader
-               if class_loader == null then
-                       find_class_loader(app.native_app_glue.ndk_native_activity.java_native_activity)
-                       class_loader = self.class_loader
-                       assert class_loader != null
-               end
-
-               var class_loader_method = self.class_loader_method
-               assert class_loader_method != null
-
-               return load_jclass_intern(class_loader, class_loader_method, name)
-       end
-
-       private fun find_class_loader(native_activity: NativeActivity) import jni_env, class_loader=, JavaObject.as nullable, class_loader_method=, JMethodID.as nullable `{
-               JNIEnv *env = Sys_jni_env(recv);
-
-               // Retrieve main activity
-               jclass class_activity = (*env)->GetObjectClass(env, native_activity);
-               if (class_activity == NULL) {
-                       __android_log_print(ANDROID_LOG_ERROR, "Nit", "retreiving activity class");
-                       (*env)->ExceptionDescribe(env);
-                       exit(1);
-               }
-
-               jmethodID class_activity_getClassLoader = (*env)->GetMethodID(env, class_activity, "getClassLoader", "()Ljava/lang/ClassLoader;");
-               if (class_activity_getClassLoader == NULL) {
-                       __android_log_print(ANDROID_LOG_ERROR, "Nit", "retreiving 'getClassLoader' method");
-                       (*env)->ExceptionDescribe(env);
-                       exit(1);
-               }
-
-               // Call activity.getClassLoader
-               jobject instance_class_loader = (*env)->CallObjectMethod(env, native_activity, class_activity_getClassLoader);
-               if (instance_class_loader == NULL) {
-                       __android_log_print(ANDROID_LOG_ERROR, "Nit", "retreiving class loader instance");
-                       (*env)->ExceptionDescribe(env);
-                       exit(1);
-               }
-
-               jclass class_class_loader = (*env)->GetObjectClass(env, instance_class_loader);
-               if (class_class_loader == NULL) {
-                       __android_log_print(ANDROID_LOG_ERROR, "Nit", "retreiving class of class loader");
-                       (*env)->ExceptionDescribe(env);
-                       exit(1);
-               }
-
-               // Get the method ClassLoader.findClass
-               jmethodID class_class_loader_findClass = (*env)->GetMethodID(env, class_class_loader, "findClass", "(Ljava/lang/String;)Ljava/lang/Class;");
-               if (class_class_loader_findClass == NULL) {
-                       __android_log_print(ANDROID_LOG_ERROR, "Nit", "retreiving 'findClass' method");
-                       (*env)->ExceptionDescribe(env);
-                       exit(1);
-               }
-
-               // Return the values to Nit
-               Sys_class_loader__assign(recv, JavaObject_as_nullable((*env)->NewGlobalRef(env, instance_class_loader)));
-               Sys_class_loader_method__assign(recv, JMethodID_as_nullable(class_class_loader_findClass));
-
-               // Clean up
-               (*env)->DeleteLocalRef(env, class_activity);
-               (*env)->DeleteLocalRef(env, instance_class_loader);
-               (*env)->DeleteLocalRef(env, class_class_loader);
-       `}
-
-       private fun load_jclass_intern(instance_class_loader: JavaObject, class_loader_findClass: JMethodID, name: NativeString): JClass import jni_env `{
-               JNIEnv *env = Sys_jni_env(recv);
-               jobject class_name = (*env)->NewStringUTF(env, name);
-
-               jclass java_class = (*env)->CallObjectMethod(env, instance_class_loader, class_loader_findClass, class_name);
-               if (java_class == NULL) {
-                       __android_log_print(ANDROID_LOG_ERROR, "Nit", "loading targetted class");
-                       (*env)->ExceptionDescribe(env);
-                       exit(1);
-               }
-
-               (*env)->DeleteLocalRef(env, class_name);
-
-               return java_class;
-       `}
+       redef fun generate_input do poll_looper 0
 end
index 26a4bde..f04dadc 100644 (file)
@@ -61,6 +61,17 @@ interface Drawable
        # Draw image on self, for top left position
        fun blit( image: I, x, y: Int ) is abstract
 
+       # Draw image on self, for top left position but scaled
+       # the width and height of the target rectangle is specified
+       fun blit_scaled(image: Image, x, y, w, h: Int)
+       do
+               var fx = x.to_f
+               var fy = y.to_f
+               var fx2 = fx + w.to_f
+               var fy2 = fy + h.to_f
+               blit_stretched(image, fx, fy, fx, fy2, fx2, fy2, fx2, fy)
+       end
+
        # Draw image, centered at position
        fun blit_centered( image: I, x, y: Int ) is abstract
 
@@ -71,8 +82,13 @@ interface Drawable
        fun blit_rotated_scaled( image: I, x, y, angle, scale: Float ) is abstract
 
        # Draw image by specifying the positon of each image corners
-       # Corners are in clockwise order stating top right
-       # a is top right, b is bottom right, c is bottom left and d is top left
+       # Corners are in counter-clockwise order stating top left
+       # a is top left, b is bottom left, c is bottom right and d is top right
+       # ~~~
+       # a-d
+       # | |
+       # b-c
+       # ~~~
        fun blit_stretched( image: I, ax, ay, bx, by, cx, cy, dx, dy: Float )
                is abstract
 
index 5534d5a..4b599ed 100644 (file)
@@ -29,7 +29,7 @@ redef class App
        redef type D: Opengles1Display
        redef type I: Opengles1Image
 
-       redef init
+       redef fun setup
        do
                display = new Opengles1Display
 
index 9247991..2c75bb5 100644 (file)
@@ -22,7 +22,7 @@ import linux_app
 redef class App
        var assets_dir: String
 
-       redef init
+       redef fun setup
        do
                assets_dir = sys.program_name.dirname + "/../assets/"
 
index 9ac59f3..a4b8417 100644 (file)
@@ -35,7 +35,7 @@ class Perfecthashing
        do
                # By default, all identifiers are available
                interval = new List[Couple[nullable Int, nullable Int]]
-               interval.push(new Couple[nullable Int, nullable Int](0, null))
+               interval.push(new Couple[nullable Int, nullable Int](1, null))
                tempht = new Array[nullable Int]
        end
        
index ef149b1..fde40f3 100644 (file)
 # If NACL_SDK_ROOT is not set in your PATH, you have to work in
 # 'nacl_sdk/pepper_your_pepper_version/getting_started/your_project_folder'.
 #
-# Provides PNaCl support for Nit
+# Provides PNaCl support for Nit.
 module pnacl is platform
 `{
        #include <unistd.h>
        #include <stddef.h>
+       #include <stdio.h>
        #include <string.h>
        #include <stdlib.h>
+       #include <pthread.h>
        #include "ppapi/c/pp_errors.h"
        #include "ppapi/c/ppp.h"
        #include "ppapi/c/ppp_instance.h"
@@ -38,8 +40,49 @@ module pnacl is platform
        #include "ppapi/c/ppb_var_dictionary.h"
        #include "ppapi/c/ppb_var_array.h"
 
+       #define MAX_DICTIONARY_QUEUE_SIZE 200
+       #define MAX_MESSAGE_QUEUE_SIZE 10
+
        extern int nit_main(int, char**);
 
+       /* A working thread for Nit. */
+       static pthread_t g_nit_thread;
+
+       /* Mutex that guards the queues. */
+       static pthread_mutex_t g_dictionary_queue_mutex;
+       static pthread_mutex_t g_message_queue_mutex;
+
+       /* Condition variables that are signalled when the queues are not empty. */
+       static pthread_cond_t g_dictionary_queue_not_empty_cond;
+       static pthread_cond_t g_message_queue_not_empty_cond;
+
+       /** Circular queues of dictionaries and messages from JavaScript to be handled.
+        *
+        * If g_queue_start < g_queue_end:
+        *   all elements in the range [g_queue_start, g_queue_end) are valid.
+        * If g_queue_start > g_queue_end:
+        *   all elements in the ranges [0, g_queue_end) and
+        *   [g_queue_start, MAX_QUEUE_SIZE) are valid.
+        * If g_queue_start == g_queue_end, and g_queue_size > 0:
+        *   all elements in the g_queue are valid.
+        * If g_queue_start == g_queue_end, and g_queue_size == 0:
+        *   No elements are valid. */
+       static struct PP_Var g_dictionary_queue[MAX_DICTIONARY_QUEUE_SIZE];
+       static char* g_message_queue[MAX_MESSAGE_QUEUE_SIZE];
+
+       /* The index of the head of the queues. */
+       static int g_dictionary_queue_start = 0;
+       static int g_message_queue_start = 0;
+
+       /* The index of the tail of the queues, non-inclusive. */
+       static int g_dictionary_queue_end = 0;
+       static int g_message_queue_end = 0;
+
+       /* The size of the queues. */
+       static int g_dictionary_queue_size = 0;
+       static int g_message_queue_size = 0;
+
+       /* PNaCl interfaces. */
        const PPB_Messaging* g_varMessagingInterface;
        const PPB_Var* g_varInterface;
        const PPB_VarDictionary* g_varDictionaryInterface;
@@ -48,6 +91,140 @@ module pnacl is platform
        PP_Instance g_instance;
        PnaclApp app;
 
+       /* A wrapper to launch the Nit main on a new thread. */
+       void* WrapperNitMain(void* arg) {
+               nit_main(0, NULL);
+               return NULL;
+       }
+
+       /** Return whether the queues are empty.
+        *
+        * NOTE: this function assumes g_queue_mutex lock is held.
+        * @return non-zero if the queue is empty. */
+       static int IsDictionaryQueueEmpty() { return g_dictionary_queue_size == 0; }
+       static int IsMessageQueueEmpty() { return g_message_queue_size == 0; }
+
+       /** Return whether the queues are full.
+        *
+        * NOTE: this function assumes g_queue_mutex lock is held.
+        * @return non-zero if the queue is full. */
+       static int IsDictionaryQueueFull() { return g_dictionary_queue_size == MAX_DICTIONARY_QUEUE_SIZE; }
+       static int IsMessageQueueFull() { return g_message_queue_size == MAX_MESSAGE_QUEUE_SIZE; }
+
+       /* Initialize the queues. */
+       void InitializeQueues() {
+           pthread_mutex_init(&g_dictionary_queue_mutex, NULL);
+           pthread_cond_init(&g_dictionary_queue_not_empty_cond, NULL);
+           pthread_mutex_init(&g_message_queue_mutex, NULL);
+           pthread_cond_init(&g_message_queue_not_empty_cond, NULL);
+       }
+
+       /** Enqueue a dictionary (i.e. add to the end)
+        *
+        * If the queue is full, the dictionary will be dropped.
+        *
+        * NOTE: this function assumes g_dictionary_queue_mutex is _NOT_ held.
+        * @param[in] dictionary, the dictionary to enqueue.
+        * @return non-zero if the dictionary was added to the queue. */
+       int EnqueueDictionary(struct PP_Var dictionary) {
+           pthread_mutex_lock(&g_dictionary_queue_mutex);
+
+         /* We shouldn't block the main thread waiting for the queue to not be full,
+          * so just drop the dictionary. */
+           if (IsDictionaryQueueFull()) {
+               pthread_mutex_unlock(&g_dictionary_queue_mutex);
+               return 0;
+           }
+
+           g_dictionary_queue[g_dictionary_queue_end] = dictionary;
+           g_dictionary_queue_end = (g_dictionary_queue_end + 1) % MAX_DICTIONARY_QUEUE_SIZE;
+           g_dictionary_queue_size++;
+
+           pthread_cond_signal(&g_dictionary_queue_not_empty_cond);
+
+           pthread_mutex_unlock(&g_dictionary_queue_mutex);
+
+           return 1;
+       }
+
+       /** Enqueue a message (i.e. add to the end)
+        *
+        * If the queue is full, the message will be dropped.
+        *
+        * NOTE: this function assumes g_message_queue_mutex is _NOT_ held.
+        * @param[in] message The message to enqueue.
+        * @return non-zero if the message was added to the queue. */
+       int EnqueueMessage(char* message) {
+           pthread_mutex_lock(&g_message_queue_mutex);
+
+         /* We shouldn't block the main thread waiting for the queue to not be full,
+          * so just drop the message. */
+           if (IsMessageQueueFull()) {
+               pthread_mutex_unlock(&g_message_queue_mutex);
+               return 0;
+           }
+
+           g_message_queue[g_message_queue_end] = message;
+           g_message_queue_end = (g_message_queue_end + 1) % MAX_MESSAGE_QUEUE_SIZE;
+           g_message_queue_size++;
+
+           pthread_cond_signal(&g_message_queue_not_empty_cond);
+
+           pthread_mutex_unlock(&g_message_queue_mutex);
+
+           return 1;
+       }
+
+       /** Dequeue a dictionary and return it.
+        *
+        * This function blocks until a dictionary is available. It should not be called
+        * on the main thread.
+        *
+        * NOTE: this function assumes g_dictionary_queue_mutex is _NOT_ held.
+        * @return The dictionary at the head of the queue. */
+       struct PP_Var DequeueDictionary() {
+           struct PP_Var dictionary = g_varDictionaryInterface->Create();
+
+           pthread_mutex_lock(&g_dictionary_queue_mutex);
+
+           while (IsDictionaryQueueEmpty()) {
+               pthread_cond_wait(&g_dictionary_queue_not_empty_cond, &g_dictionary_queue_mutex);
+           }
+
+           dictionary = g_dictionary_queue[g_dictionary_queue_start];
+           g_dictionary_queue_start = (g_dictionary_queue_start + 1) % MAX_DICTIONARY_QUEUE_SIZE;
+           g_dictionary_queue_size--;
+
+           pthread_mutex_unlock(&g_dictionary_queue_mutex);
+
+           return dictionary;
+       }
+
+       /** Dequeue a message and return it.
+        *
+        * This function blocks until a message is available. It should not be called
+        * on the main thread.
+        *
+        * NOTE: this function assumes g_queue_mutex is _NOT_ held.
+        * @return The message at the head of the queue. */
+       char* DequeueMessage() {
+           char* message = NULL;
+
+           pthread_mutex_lock(&g_message_queue_mutex);
+
+           while (IsMessageQueueEmpty()) {
+               pthread_cond_wait(&g_message_queue_not_empty_cond, &g_message_queue_mutex);
+           }
+
+           message = g_message_queue[g_message_queue_start];
+           g_message_queue_start = (g_message_queue_start + 1) % MAX_MESSAGE_QUEUE_SIZE;
+           g_message_queue_size--;
+
+           pthread_mutex_unlock(&g_message_queue_mutex);
+
+           return message;
+       }
+
        /* Posts a string message to JS. */
        void PostMessage(char* message) {
            /* Create PP_Var containing the message body. */
@@ -69,9 +246,21 @@ module pnacl is platform
            g_varMessagingInterface->PostMessage(g_instance, v);
        }
 
+       /* char* to PP_Var. */
+       static struct PP_Var CStrToVar(const char* str) {
+           if (g_varInterface != NULL) {
+               return g_varInterface->VarFromUtf8(str, strlen(str));
+           }
+           return PP_MakeUndefined();
+       }
+
        static PP_Bool Instance_DidCreate(PP_Instance instance, uint32_t argc, const char* argn[], const char* argv[]) {
            g_instance = instance;
-           nit_main(0, NULL);
+
+           /* Initialization of the queues and creation of the thread for Nit. */
+           InitializeQueues();
+           pthread_create(&g_nit_thread, NULL, &WrapperNitMain, NULL);
+
            return PP_TRUE;
        }
 
@@ -92,24 +281,22 @@ module pnacl is platform
                return PP_FALSE;
        }
 
-       /* char* to PP_Var. */
-       static struct PP_Var CStrToVar(const char* str) {
-         if (g_varInterface != NULL) {
-           return g_varInterface->VarFromUtf8(str, strlen(str));
-         }
-         return PP_MakeUndefined();
-       }
-
        /* Called when JS sends something, is set to accept Strings or Dictionaries,
           returns an error if received object is not a String or Dictionary. */
        void Messaging_HandleMessage(PP_Instance instance, struct PP_Var varMessage) {
            if(varMessage.type == PP_VARTYPE_DICTIONARY) {
-               PnaclApp_handle_dictionary(app, &varMessage);
+               if(!EnqueueDictionary(varMessage)) {
+                       struct PP_Var errorMessage = CStrToVar("QueueFull : dropped dictionary because the queue was full.");
+                       g_varMessagingInterface->PostMessage(g_instance, errorMessage);
+               }
            }
            else if(varMessage.type == PP_VARTYPE_STRING) {
                uint32_t len;
                char* message = (char*)g_varInterface->VarToUtf8(varMessage, &len);
-               PnaclApp_handle_message(app, NativeString_to_s_with_length(message, len));
+               if(!EnqueueMessage(message)) {
+                       struct PP_Var errorMessage = CStrToVar("QueueFull : dropped message because the queue was full.");
+                       g_varMessagingInterface->PostMessage(g_instance, errorMessage);
+               }
            }
            else {
                struct PP_Var errorMessage = CStrToVar("TypeError : only accepts JS objects or Strings");
@@ -117,9 +304,22 @@ module pnacl is platform
            }
        }
 
+       /* This function is called by Nit when using check_dictionary,
+       returns the dictionary at the head of the queue. */
+       void* NitHandleDictionary() {
+               struct PP_Var dictionary = DequeueDictionary();
+               PnaclApp_handle_dictionary(app, &dictionary);
+               return 0;
+       }
+
+       /* This function is called By Nit when waiting for a user input. */
+       char* NitHandleMessage() {
+               return DequeueMessage();
+       }
+
        /* Entry point */
        PP_EXPORT int32_t PPP_InitializeModule(PP_Module module_id, PPB_GetInterface get_browser_interface) {
-           /* Initializing global pointers */
+           /* Initializing global pointers. */
            g_varMessagingInterface = (const PPB_Messaging*) get_browser_interface(PPB_MESSAGING_INTERFACE);
            g_varInterface = (const PPB_Var*) get_browser_interface(PPB_VAR_INTERFACE);
            g_varDictionaryInterface = (const PPB_VarDictionary*) get_browser_interface(PPB_VAR_DICTIONARY_INTERFACE);
@@ -152,7 +352,7 @@ module pnacl is platform
            return NULL;
        }
 
-       // Hack poll
+       /* Hack in order to avoid the problem with file. */
        int poll(void *fds, int nfds, int timeout) { return 0; }
 `}
 
@@ -422,6 +622,51 @@ redef class String
        `}
 end
 
+# A stream for PNaCl, redefines basic input and output methods.
+class PnaclStream
+       super PollableIStream
+       super OStream
+       super BufferedIStream
+
+       init do prepare_buffer(10)
+
+       redef var end_reached: Bool = false
+
+       redef fun eof do return end_reached
+
+       # Redefintion of 'write' to send messages to the browser.
+       redef fun write(s: Text) do app.post_message s.to_s
+
+       redef fun is_writable: Bool do return true
+
+       # Checks if there is a message in the queue, and if so the message is handled automatically.
+       fun check_message: NativeString `{
+               return NitHandleMessage();
+       `}
+
+       # fill_buffer now checks for a message in the message queue which is filled by user inputs.
+       redef fun fill_buffer
+       do
+               _buffer.clear
+               _buffer_pos = 0
+               _buffer.append check_message.to_s
+       end
+end
+
+# For a PNaCl app, Sys uses PnaclStreams.
+redef class Sys
+       fun pnacl_stdstr: PnaclStream do return once new PnaclStream
+
+       # NaCl input.
+       redef fun stdin do return pnacl_stdstr
+
+       # NaCl output.
+       redef fun stdout do return pnacl_stdstr
+
+       # NaCl output for errors.
+       redef fun stderr do return pnacl_stdstr
+end
+
 # Class that provides the tools to interact with PNaCl.
 class PnaclApp
 
@@ -464,4 +709,35 @@ class PnaclApp
        do
                # To be Implemented by user.
        end
+
+       # Checks if there is a dictionary in the queue, and if so the dictionary is handled automatically.
+       fun check_dictionary `{
+               NitHandleDictionary();
+       `}
+
+       # Infinite loop on check_dictionary
+       fun run
+       do
+               loop
+                       check_dictionary
+               end
+       end
 end
+
+redef interface Object
+       # Calls 'pthread_exit on current thread
+        fun exit_thread(exit_value: Int) `{
+               pthread_exit((void*) exit_value);
+       `}
+
+       # Redef of exit in order to avoid the module to crash by terminating only the Nit thread.
+       redef fun exit(exit_value: Int)
+       do
+               var dictionary = new PepperDictionary
+               dictionary["exit"] = exit_value
+               app.post_dictionary dictionary
+               exit_thread exit_value
+       end
+end
+
+fun app: PnaclApp do return once new PnaclApp
diff --git a/lib/ropes_debug.nit b/lib/ropes_debug.nit
new file mode 100644 (file)
index 0000000..b9ba5ab
--- /dev/null
@@ -0,0 +1,76 @@
+# This file is part of NIT ( http://www.nitlanguage.org ).
+#
+# Copyright 2004-2008 Jean Privat <jean@pryen.org>
+# Copyright 2006-2008 Floréal Morandat <morandat@lirmm.fr>
+#
+# This file is free software, which comes along with NIT.  This software is
+# distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
+# without  even  the implied warranty of  MERCHANTABILITY or  FITNESS FOR A
+# PARTICULAR PURPOSE.  You can modify it is you want,  provided this header
+# is kept unaltered, and a notification of the changes is added.
+# You  are  allowed  to  redistribute it and sell it, alone or is a part of
+# another product.
+
+# Exposes methods for debugging ropes when needed.
+module ropes_debug
+
+intrude import ::standard::ropes
+import ::standard
+
+redef class Rope
+       # Writes self as a dot file on the hard drive
+       fun to_dot(filepath: String): String is abstract
+end
+
+redef class RopeNode
+       # Generates a dot string
+       fun to_dot(s: String): String is abstract
+end
+
+redef class Leaf
+       redef fun to_dot(s): String
+       do
+               s += "n{object_id} [label = \"{str}\" shape = rect];\n"
+               s += "n{str.object_id} -> n{object_id} [label = \"contains\"];\n"
+               s = str.to_dot(s)
+               return s
+       end
+end
+
+redef class Concat
+       redef fun to_dot(s): String
+       do
+               s += "n{object_id} [label = {length}];\n"
+               if left != null then
+                       s += "n{object_id} -> n{left.object_id} [label = \"left\"];\n"
+                       s = left.to_dot(s)
+               end
+               if right != null then
+                       s += "n{object_id} -> n{right.object_id} [label = \"right\"];\n"
+                       s = right.to_dot(s)
+               end
+               return s
+       end
+end
+
+redef class FlatString
+       fun to_dot(s: String): String
+       do
+               return s + "n{object_id} [label=\"FlatString\\nindex_from = {index_from}\\nindex_to = {index_to}\\nNativeString = {items.to_s_with_length(items.cstring_length)}\"];\n"
+       end
+end
+
+redef class RopeString
+       redef fun to_dot(filepath: String)
+       do
+               var of = new OFStream.open(filepath)
+               var ret: String = new RopeString.from("digraph g \{\n")
+               ret = root.to_dot(ret).as(RopeString)
+               ret += "\}\n"
+               ret.write_to(of)
+               of.close
+               return ret
+       end
+end
+
+
index 7a8a846..b797da1 100644 (file)
@@ -16,7 +16,7 @@
 module file
 
 intrude import stream
-intrude import string
+intrude import ropes
 import string_search
 import time
 
@@ -101,7 +101,11 @@ class OFStream
        redef fun write(s)
        do
                assert _writable
-               write_native(s.to_cstring, s.length)
+               if s isa FlatText then
+                       write_native(s.to_cstring, s.length)
+               else
+                       for i in s.substrings do write_native(i.to_cstring, i.length)
+               end
        end
 
        redef fun is_writable do return _writable
index b7e1ae7..7db6fa3 100644 (file)
@@ -27,6 +27,30 @@ redef class Int
        fun bin_or(i: Int): Int is extern "kernel_Int_Int_binor_0"
        fun bin_xor(i: Int): Int is extern "kernel_Int_Int_binxor_0"
        fun sqrt: Int `{ return sqrt(recv); `}
+       # Returns the greatest common divisor of `self` and `o`
+       #
+       #     assert 54.gcd(24)   == 6
+       #     assert -54.gcd(-24) == 6
+       #     assert 54.gcd(-24)  == -6
+       #     assert -54.gcd(24)  == -6
+       #     assert 12.gcd(6)    == 6
+       fun gcd(o: Int): Int
+       do
+               if self < 0 then return -(-self).gcd(o)
+               if o < 0 then return -(self.gcd(-o))
+               if self == 0 or o == self then return o
+               if o == 0 then return self
+               if self.bin_and(1) == 0 then
+                       if o.bin_and(1) == 1 then
+                               return self.rshift(1).gcd(o)
+                       else
+                               return self.rshift(1).gcd(o.rshift(1)).lshift(1)
+                       end
+               end
+               if o.bin_and(1) == 0 then return self.gcd(o.rshift(1))
+               if self > o then return (self - o).rshift(1).gcd(o)
+               return (o - self).rshift(1).gcd(self)
+       end
 end
 
 redef class Float
index 5758afd..45c1cbd 100644 (file)
 # A rope is a kind of string but instead of being flat, it relies on a binary tree structure to store data.
 module ropes
 
-import file
 intrude import string
 
-# Structure, tuple containing a LeafNode and an Int
-# Used for methods like [] or has/has_only
-private class TupleLeafNodePos
-       private var curr_node: LeafNode
-       private var corrected_pos: Int
-       private var visit_stack: List[TupleVisitNode]
+# Used when searching for a particular node
+# Returns the path to the node from the root of the rope
+# Also, the node and the offset for seeked position in the rope
+private class Path
+       # Leaf found
+       var leaf: Leaf
+       # Offset in leaf
+       var offset: Int
+       # Stack of the nodes traversed, and the path used
+       var stack: List[PathElement]
 end
 
-# Abstract class, represents all the services offered by both mutable and immutable ropes
-abstract class Rope
-       super Comparable
-       super StringCapable
-
-       # Cached version of self as a flat String
-       private var str_representation: nullable String = null
-
-       redef type OTHER: Rope
+# An element for a Path, has the concat node and whether or not
+# left or right child was visited.
+private class PathElement
+       # Visited node
+       var node: Concat
+       # Was the left child visited ?
+       var left = false
+       # Was the right child visited ?
+       var right = false
+end
 
-       # The first node of the hierarchy
-       private var parent_node: RopeNode
+# A node for a Rope
+private abstract class RopeNode
+       # Length of the node
+       var length = 0
+end
 
-       # Needed by the compiler to avoid producing an error with constructors in subclasses
-       init do
-               self.parent_node = new ConcatNode
-       end
+# Node that represents a concatenation between two nodes (of any RopeNode type)
+private class Concat
+       super RopeNode
 
-       # Initializes a new Rope with a text embedded in directly
-       init with_string(str: String) do
-               self.parent_node = new ConcatNode
-               parent_node.as(ConcatNode).right_child = new LeafNode(str)
-               parent_node.as(ConcatNode).update_data
-       end
+       # Left child of the node
+       var _left: nullable RopeNode = null
+       # Right child of the node
+       var _right: nullable RopeNode = null
 
-       # Returns a view on the rope
-       fun chars: SequenceRead[Char]
-       do
-               return new CharRopeView(self)
-       end
+       fun left: nullable RopeNode do return _left
+       fun right: nullable RopeNode do return _right
 
-       # Gets the total length of the Rope
-       fun length: Int
+       fun left=(l: RopeNode)
        do
-               return parent_node.length
+               _left = l
+               length = l.length
+               if _right != null then length += _right.length
        end
 
-       # Returns a flat version of self
-       redef fun to_s
+       fun right=(r: RopeNode)
        do
-               if self.str_representation == null then flatten
-               return str_representation.as(not null)
+               _right = r
+               length = r.length
+               if _left != null then length += _left.length
        end
+end
 
-       # Stores a flat version of self in cache
-       private fun flatten: FlatString
-       do
-               var native_final_str = calloc_string(length + 1)
-
-               native_final_str[length] = '\0'
-
-               var offset = 0
-
-               var iter = new DFSRopeLeafIterator(self)
-
-               while iter.is_ok do
-                       iter.item.value.as(FlatString).items.copy_to(native_final_str, iter.item.value.length, 0, offset)
-                       offset += iter.item.value.length
-                       iter.next
-               end
+# Leaf of a Rope, contains a FlatString
+private class Leaf
+       super RopeNode
 
-               return native_final_str.to_s_with_length(length)
-       end
+       # Encapsulated FlatString in the leaf node
+       var str: FlatString
 
-       # Gets a node containing the substring to seek the char at the require position
-       private fun get_node_for_pos(position: Int): TupleLeafNodePos
-       do
-               assert position >= 0 and position < self.length
-
-               var curr_node: nullable RopeNode = parent_node
-
-               var visit_stack = new List[TupleVisitNode]
-
-               var curr_visit_tuple: TupleVisitNode
-
-               loop
-                       if curr_node isa ConcatNode then
-                               curr_visit_tuple = new TupleVisitNode(curr_node)
-                               if curr_node.left_child != null and position < curr_node.left_child.length then
-                                       curr_visit_tuple.left_visited = true
-                                       curr_node = curr_node.left_child
-                               else if curr_node.right_child != null then
-                                       curr_visit_tuple.left_visited = true
-                                       curr_visit_tuple.right_visited = true
-                                       if curr_node.left_child != null then position -= curr_node.left_child.length
-                                       curr_node = curr_node.right_child
-                               else
-                                       print "Fatal Error"
-                                       abort
-                               end
-                               visit_stack.push(curr_visit_tuple)
-                       else if curr_node isa LeafNode then
-                               return new TupleLeafNodePos(curr_node, position, visit_stack)
-                       end
-               end
+       init(val: FlatString) do
+               self.str = val
+               length = str.length
        end
 
-       # Concats two ropes and returns a new one
-       fun +(other: Rope): Rope do
-               var new_rope = new BufferRope
+end
 
-               var first_iter = new DFSRopeLeafIterator(self)
+# Basic structure, binary tree with a root node.
+#
+# Also shared services by subsequent implementations.
+abstract class Rope
+       super Text
 
-               while first_iter.is_ok do
-                       new_rope.append(first_iter.item.value)
-                       first_iter.next
-               end
+       # Root node, entry point of a Rope.
+       private var root: RopeNode
 
-               var second_iter = new DFSRopeLeafIterator(other)
+       # Cached version of self as a flat String
+       private var str_representation: nullable NativeString = null
 
-               while second_iter.is_ok do
-                       new_rope.append(second_iter.item.value)
-                       second_iter.next
-               end
+       # Empty Rope
+       init do from("")
 
-               return new_rope
+       # Creates a new Rope with `s` as root
+       init from(s: String) do
+               if s isa RopeString then root = s.root else root = new Leaf(s.as(FlatString))
        end
 
-       # Returns a copy of several ropes concatenated
-       #
-       # Is equivalent to a chain of + operations
-       # Except this one is optimized for performance
-       fun multi_concat(ropes: Rope...): Rope
+       private init from_root(r: RopeNode)
        do
-               var new_rope = new BufferRope
+               root = r
+       end
 
-               var self_iter = self.iterator
-               while self_iter.is_ok do
-                       new_rope.append(self_iter.item.value)
-                       self_iter.next
-               end
+       redef fun length do return root.length
 
-               for i in ropes do
-                       var iter = i.iterator
-                       while iter.is_ok do
-                               new_rope.append(iter.item.value)
-                               iter.next
-                       end
-               end
+       # Iterator on the nodes of the rope, in forward postfix order
+       private fun postfix(from: Int): Postfix do return new Postfix.from(self, from)
 
-               return new_rope
-       end
+       # Iterator on the leaves of the rope, forward order
+       private fun leaves(from: Int): LeavesIterator do return new LeavesIterator(self, from)
 
-       # Appends the content of self multiple times in a new Rope object
-       fun *(repeats: Int): Rope do
+       # Iterator on the substrings from 0, in forward order
+       redef fun substrings do return new SubstringsIterator(self, 0)
 
-               var new_rope = new BufferRope
+       # Iterator on the substrings, starting at position `from`, in forward order
+       fun substrings_from(from: Int): IndexedIterator[Text] do return new SubstringsIterator(self, from)
 
-               var str = self.to_s
+       # Iterator on the nodes of the rope, in backwards postfix order
+       private fun reverse_postfix(from: Int): ReversePostfix do return new ReversePostfix.from(self, from)
 
-               for i in [1 .. repeats] do new_rope.append(str)
+       # Iterator on the leaves of the rope, backwards order
+       private fun reverse_leaves(from: Int): ReverseLeavesIterator do return new ReverseLeavesIterator(self,from)
 
-               return new_rope
-       end
+       # Iterator on the substrings, in reverse order
+       fun reverse_substrings: IndexedIterator[Text] do return new ReverseSubstringsIterator(self, length-1)
 
-       # Returns an iterator on self
-       #
-       # Unsafe modifications on a MutableRope
-       #
-       private fun iterator: Iterator[LeafNode] do return new DFSRopeLeafIterator(self)
+       # Iterator on the substrings, in reverse order, starting iteration at position `from`
+       fun reverse_substrings_from(from: Int): IndexedIterator[Text] do return new ReverseSubstringsIterator(self, from)
 
-       # Creates a subrope.
-       #
-       # var rope = (new BufferRope).append("abcd")
-       #
-       #       assert rope.subrope(1, 2)         ==  "bc"
-       #       assert rope.subrope(-1, )         ==  "a"
-       #       assert rope.subrope(1, 0)         ==  ""
-       #       assert rope.subrope(2, 5)         ==  "cd"
-       #
-       # A `index_from` index < 0 will be replaced by 0.
-       # Unless a `count` value is > 0 at the same time.
-       # In this case, `index_from += count` and `count -= index_from`.
-       #
-       fun subrope(index_from: Int, count: Int): Rope
+       redef fun output
        do
-               assert count >= 0
-
-               if index_from < 0 then
-                       count += index_from
-                       if count < 0 then count = 0
-                       index_from = 0
+               for i in substrings do
+                       i.output
                end
+       end
 
-               if count - index_from >= self.length then count = length - index_from
+       redef fun to_cstring
+       do
+               if str_representation != null then return str_representation.as(not null)
 
-               var buffer = new BufferRope
+               var native_final_str = calloc_string(length + 1)
 
-               var iter = new DFSRopeLeafIterator.with_index(self, index_from)
+               native_final_str[length] = '\0'
 
-               var curr_subrope_index = index_from - iter.pos
+               if self.length == 0 then
+                       str_representation = native_final_str
+                       return native_final_str
+               end
 
-               while iter.is_ok do
-                       if count == 0 then break
-                       if curr_subrope_index > 0 then
-                               if count >= iter.item.value.length then
-                                       buffer.append(iter.item.value.substring(curr_subrope_index, count))
-                                       count -= iter.item.value.length - curr_subrope_index
-                                       curr_subrope_index = 0
-                               else
-                                       buffer.append(iter.item.value.substring(curr_subrope_index, count))
-                                       break
-                               end
-                       else
-                               if count >= iter.item.value.length then
-                                       buffer.append(iter.item.value)
-                                       count -= iter.item.value.length
-                               else
-                                       buffer.append(iter.item.value.substring(0, count))
-                                       break
-                               end
-                       end
+               var offset = 0
 
-                       iter.next
+               for i in substrings do
+                       var str = i.flatten
+                       if str isa FlatString then str.items.copy_to(native_final_str, str.length, str.index_from, offset)
+                       offset += i.length
                end
 
-               return buffer
-       end
+               str_representation = native_final_str
 
-       # Returns an upper (capitalized) version of self
-       fun to_upper: Rope
-       do
-               var new_rope = new BufferRope
-               var iter = new DFSRopeLeafIterator(self)
-               while iter.is_ok do
-                       new_rope.append(iter.item.value.to_upper)
-                       iter.next
-               end
-               return new_rope
+               return native_final_str
        end
 
-       # Returns a lower (minuscule) version of self
-       fun to_lower: Rope
+       # Path to the Leaf for `position`
+       private fun node_at(position: Int): Path
        do
-               var new_rope = new BufferRope
-               var iter = new DFSRopeLeafIterator(self)
-               while iter.is_ok do
-                       new_rope.append(iter.item.value.to_lower)
-                       iter.next
-               end
-               return new_rope
+               assert position >= 0 and position < length
+               return get_node_from(root.as(not null), 0, position, new List[PathElement])
        end
 
-       ############################################################################
-       #                       Comparable Refined Methods                         #
-       ############################################################################
-
-       # Compares the current Rope to another object (either another rope or a String)
-       redef fun == (other)
+       # Builds the path to Leaf at position `seek_pos`
+       private fun get_node_from(node: RopeNode, curr_pos: Int, seek_pos: Int, stack: List[PathElement]): Path
        do
-               if other == null or not (other isa Rope or other isa FlatText) then return false
-               var self_iter = new RopeCharIterator(self)
-               if other isa Rope then
-                       if self.length != other.length then return false
-                       var other_iterator = new RopeCharIterator(other)
-                       while self_iter.is_ok do
-                               if self_iter.item != other_iterator.item then return false
-                               self_iter.next
-                               other_iterator.next
-                       end
-               else if other isa FlatText then
-                       var pos = 0
-                       if self.length != other.length then return false
-                       while self_iter.is_ok do
-                               if self_iter.item != other[pos] then return false
-                               pos += 1
-                               self_iter.next
+               assert curr_pos >= 0
+               if node isa Leaf then return new Path(node, seek_pos - curr_pos, stack)
+               node = node.as(Concat)
+
+               if node.left != null then
+                       var next_pos = curr_pos + node.left.length
+                       stack.add(new PathElement(node))
+                       if next_pos > seek_pos then
+                               stack.last.left = true
+                               return get_node_from(node.left.as(not null), curr_pos, seek_pos, stack)
                        end
+                       stack.last.right = true
+                       return get_node_from(node.right.as(not null), next_pos, seek_pos, stack)
+               else
+                       var vis = new PathElement(node)
+                       vis.right = true
+                       stack.add(vis)
+                       return get_node_from(node.right.as(not null), curr_pos, seek_pos, stack)
                end
-               return true
        end
 
-       # Checks if self is lesser than other
-       #
-       # Comparison done in lexicographical order
-       # i.e. 'aa' < 'b'
-       #
-       redef fun <(other)
+       redef fun ==(o)
        do
-               var other_iter = other.chars.iterator
-               for i in self.chars do
-                       if not other_iter.is_ok then return false
-                       if i < other_iter.item then return true
-                       if i > other_iter.item then return false
-                       other_iter.next
+               if not o isa Text then return false
+               if o.length != self.length then return false
+               var oit = o.chars.iterator
+               for i in self.chars.iterator do
+                       if i != oit.item then return false
+                       oit.next
                end
-               if other_iter.is_ok then return true
-               return false
+               return true
        end
-
 end
 
-# Rope that can be modified
-#
-# /!\ Non Thread-safe /!\
-#
-class BufferRope
+# Rope that cannot be modified
+class RopeString
        super Rope
+       super String
 
-       var is_dirty: Bool = false
+       redef fun to_s do return self
 
-       init
-       do
-               super
-       end
+       redef fun empty do return once new RopeString.from("")
 
-       redef init with_string(str)
-       do
-               super
-       end
-
-       ############################################################################
-       #                         Tree Balancing Methods                           #
-       ############################################################################
+       redef var chars: SequenceRead[Char] = new RopeStringChars(self)
 
-       # Performs a right rotation on a node of the Rope
-       #
-       #              Root                Pivot
-       #             /    \              /     \
-       #           Pivot Leaf3     =>  Leaf1  Root
-       #          /     \                    /   \
-       #       Leaf1   Leaf2              Leaf2  Leaf3
-       private fun rotate_right(root: ConcatNode)
+       redef fun reversed
        do
-               assert root.left_child != null
-               var pivot = root.left_child.as(ConcatNode)
-               var root_new_left = pivot.right_child
-               var root_parent = root.parent
-
-               root.left_child = root_new_left
-               pivot.right_child = root
-               if root_parent == null then
-                       self.parent_node = pivot
-                       pivot.parent = null
-                       return
+               var ret = empty.as(RopeString)
+               for i in substrings do
+                       ret = ret.prepend(i.reversed.to_s).as(RopeString)
                end
-
-               if root_parent.left_child == root then
-                       root_parent.left_child = pivot
-               else
-                       root_parent.right_child = pivot
-               end
-
-               root.update_data
-               pivot.update_data
-               root_parent.update_data
+               return ret
        end
 
-       # Performs a left rotation on a node of the Rope
-       #
-       #      Root                    Pivot
-       #     /    \                  /     \
-       #  Leaf1  Pivot        =>   Root   Leaf3
-       #        /     \           /    \
-       #      Leaf2  Leaf3      Leaf1 Leaf2
-       private fun rotate_left(root: ConcatNode)
+       redef fun to_upper
        do
-               assert root.right_child != null
-               var pivot = root.right_child.as(ConcatNode)
-               var root_new_right = pivot.left_child
-               var root_parent = root.parent
-
-               root.right_child = root_new_right
-               pivot.left_child = root
-               if root_parent == null then
-                       self.parent_node = pivot
-                       pivot.parent = null
-                       return
+               var ret = empty
+               for i in substrings do
+                       ret += i.to_upper
                end
-
-               if root_parent.left_child == root then
-                       root_parent.left_child = pivot
-               else
-                       root_parent.right_child = pivot
-               end
-
-               root.update_data
-               pivot.update_data
-               root_parent.update_data
+               return ret
        end
 
-       # Shortcut method to balance a node and its parents
-       # based on the rules of the AVL Tree
-       private fun balance_from_node(parent_node: nullable ConcatNode)
+       redef fun to_lower
        do
-               while parent_node != null do
-                       parent_node.update_data
-                       var node_balance = parent_node.balance_factor
-                       if node_balance < -1 or node_balance > 1 then
-                               balance_node(parent_node)
-                       end
-                       parent_node = parent_node.parent
+               var ret = empty
+               for i in substrings do
+                       ret += i.to_lower
                end
+               return ret
        end
 
-       # Performs rotations to balance a node according to AVL Tree rules
-       private fun balance_node(node: ConcatNode)
+       redef fun +(o) do return insert_at(o.to_s, length)
+
+       redef fun *(n)
        do
-               var balance_factor = node.balance_factor
-               if balance_factor < -1 then
-                       var right_balance = node.right_child.balance_factor
-                       if right_balance < 0 then
-                               rotate_left(node)
-                       else
-                               rotate_right(node.right_child.as(ConcatNode))
-                               rotate_left(node)
-                       end
-               else
-                       var left_balance = node.left_child.balance_factor
-                       if left_balance > 0 then
-                               rotate_right(node)
-                       else
-                               rotate_left(node.left_child.as(ConcatNode))
-                               rotate_right(node)
-                       end
+               var ret = new RopeString.from("")
+               for i in [0..n[ do
+                       ret = (ret + self).as(RopeString)
                end
+               return ret
        end
 
-       ############################################################################
-       #                      BufferRope exclusive Methods                        #
-       ############################################################################
-
-       # Appends a new Collection[Char] at the end of the current rope
-       fun append(str: String): BufferRope
+       # Inserts a String `str` at position `pos`
+       redef fun insert_at(str, pos)
        do
-               var last_node = parent_node
-
-               while last_node isa ConcatNode and last_node.right_child != null do
-                       last_node = last_node.right_child.as(not null)
-               end
-
-               if last_node isa ConcatNode then
-                       last_node.right_child = new LeafNode(str.to_s)
-               else if last_node isa LeafNode then
-                       var last_node_parent = last_node.parent
-                       var new_concat = new ConcatNode
-                       last_node_parent.right_child = new_concat
-                       new_concat.left_child = last_node
-                       new_concat.right_child = new LeafNode(str.to_s)
-                       last_node = new_concat
-               else
-                       print "Fatal Error, please report to the developers for more insight."
-                       abort
-               end
+               if str.length == 0 then return self
+               if self.length == 0 then return new RopeString.from(str)
 
-               balance_from_node(last_node)
+               assert pos >= 0 and pos <= length
 
-               is_dirty = true
+               if pos == length then return append(str).as(RopeString)
 
-               return self
-       end
+               var path = node_at(pos)
 
-       # Variatic function to append several collections of Chars
-       fun append_multi(strs: String...): BufferRope
-       do
-               for i in strs do
-                       append(i)
-               end
-               return self
-       end
+               var last_concat = new Concat
 
-       # Adds a new Collection[Char] at the beginning of the rope
-       fun prepend(str: String): BufferRope
-       do
-               var curr_node = parent_node
-
-               while curr_node isa ConcatNode and curr_node.left_child != null do
-                       curr_node = curr_node.left_child.as(not null)
-               end
-
-               if curr_node isa ConcatNode then
-                       curr_node.left_child = new LeafNode(str.to_s)
-               else if curr_node isa LeafNode then
-                       var parent = curr_node.parent
-                       var new_concat = new ConcatNode
-                       var new_leaf = new LeafNode(str.to_s)
-                       new_concat.left_child = new_leaf
-                       new_concat.right_child = curr_node
-                       parent.left_child = new_concat
-                       curr_node = new_concat
+               if path.offset == 0 then
+                       last_concat.right = path.leaf
+                       if str isa FlatString then last_concat.left = new Leaf(str) else last_concat.left = str.as(RopeString).root
+               else if path.offset == path.leaf.length then
+                       if str isa FlatString then last_concat.right = new Leaf(str) else last_concat.right = str.as(RopeString).root
+                       last_concat.left = path.leaf
                else
-                       print "Fatal Error"
-                       abort
+                       var s = path.leaf.str
+                       var l_half = s.substring(0, s.length - path.offset)
+                       var r_half = s.substring_from(s.length - path.offset)
+                       var cct = new Concat
+                       cct.right = new Leaf(r_half.as(FlatString))
+                       last_concat.left = new Leaf(l_half.as(FlatString))
+                       if str isa FlatString then last_concat.right = new Leaf(str) else last_concat.right = str.as(RopeString).root
+                       cct.left = last_concat
+                       last_concat = cct
+               end
+
+               for i in path.stack.reverse_iterator do
+                       var nod = new Concat
+                       if i.left then
+                               nod.right = i.node.right.as(not null)
+                               nod.left = last_concat
+                       else
+                               nod.left = i.node.left.as(not null)
+                               nod.right = last_concat
+                       end
+                       last_concat = nod
                end
 
-               balance_from_node(curr_node)
+               return new RopeString.from_root(last_concat)
+       end
 
-               is_dirty = true
+       # Adds `s` at the beginning of self
+       redef fun prepend(s) do return insert_at(s, 0)
 
-               return self
+       # Adds `s` at the end of self
+       redef fun append(s)
+       do
+               if self.is_empty then return s
+               return new RopeString.from_root(append_to_path(root,s))
        end
 
-       # Variatic function to prepend several collections of Chars
-       fun prepend_multi(strs: String...): BufferRope
+       # Builds a new path from root to the rightmost node with s appended
+       private fun append_to_path(node: RopeNode, s: String): RopeNode
        do
-               for i in strs do
-                       prepend(i)
+               var cct = new Concat
+               if node isa Leaf then
+                       cct.left = node
+                       if s isa FlatString then cct.right = new Leaf(s) else cct.right = s.as(RopeString).root
+               else if node isa Concat then
+                       var right = node.right
+                       if node.left != null then cct.left = node.left.as(not null)
+                       if right == null then
+                               if s isa FlatString then cct.right = new Leaf(s) else cct.right = s.as(RopeString).root
+                       else
+                               cct.right = append_to_path(right, s)
+                       end
                end
-               return self
+               return cct
        end
 
-       # Adds the content of `str` after self, does not create a new rope object
-       fun concat(str: Rope): Rope
+       # O(log(n))
+       #
+       #     var rope = new RopeString.from("abcd")
+       #     assert rope.substring(1, 2)         ==  "bc"
+       #     assert rope.substring(-1, 2)         ==  "a"
+       #     assert rope.substring(1, 0)         ==  ""
+       #     assert rope.substring(2, 5)         ==  "cd"
+       #
+       redef fun substring(pos, len)
        do
-               var other_iter = new DFSRopeLeafIterator(str)
-
-               var modif_list = new List[String]
-
-               while other_iter.is_ok do
-                       modif_list.push(other_iter.item.value)
-                       other_iter.next
+               if pos < 0 then
+                       len += pos
+                       pos = 0
                end
 
-               while modif_list.length > 0 do
-                       self.append(modif_list.shift)
-               end
+               if pos + len > length then len = length - pos
 
-               if not is_dirty then is_dirty = true
+               if len <= 0 then return new RopeString.from("")
 
-               return self
-       end
+               var path = node_at(pos)
 
-       # Returns the content of the current BufferRope object as an ImmutableRope
-       fun freeze: ImmutableRope
-       do
-               var buffer_rope = new BufferRope
-               var new_rope = new ImmutableRope
+               var lf = path.leaf
+               var offset = path.offset
+
+               if path.leaf.str.length - offset > len then lf = new Leaf(lf.str.substring(offset,len).as(FlatString)) else lf = new Leaf(lf.str.substring_from(offset).as(FlatString))
 
-               var iter = new DFSRopeLeafIterator(self)
+               var nod: RopeNode = lf
 
-               while iter.is_ok do
-                       buffer_rope.append(iter.item.value)
-                       iter.next
+               for i in path.stack.reverse_iterator do
+                       if i.right then continue
+                       var tmp = new Concat
+                       tmp.left = nod
+                       var r = i.node.right
+                       if r != null then tmp.right = r
+                       nod = tmp
                end
 
-               new_rope.parent_node = buffer_rope.parent_node
+               var ret = new RopeString
+               ret.root = nod
 
-               if not is_dirty then new_rope.str_representation = self.str_representation
+               path = ret.node_at(len-1)
 
-               return new_rope
-       end
+               offset = path.offset
+               nod = new Leaf(path.leaf.str.substring(0, offset+1).as(FlatString))
 
-       # Unsafe method to convert self as an ImmutableRope
-       #
-       # To be used internally only
-       private fun to_immutable: ImmutableRope
-       do
-               var immutable_self = new ImmutableRope
-               immutable_self.parent_node = self.parent_node
-               return immutable_self
-       end
+               for i in path.stack.reverse_iterator do
+                       if i.left then continue
+                       var tmp = new Concat
+                       tmp.right = nod
+                       var l = i.node.left
+                       if l != null then tmp.left = l
+                       nod = tmp
+               end
 
-       ############################################################################
-       #                          Rope refined Methods                            #
-       ############################################################################
+               ret.root = nod
 
-       redef fun subrope(index_from: Int, count: Int): BufferRope
-       do
-               return super.as(BufferRope)
+               return ret
        end
+end
 
-       redef fun *(repeats: Int): BufferRope
-       do
-               return super.as(BufferRope)
-       end
+redef class FlatString
 
-       redef fun +(other: Rope): BufferRope
-       do
-               return super.as(BufferRope)
-       end
+       redef fun append(s) do return (new RopeString.from(self)) + s
 
-       redef fun multi_concat(ropes: Rope...): BufferRope
-       do
-               return super.as(BufferRope)
-       end
+       redef fun prepend(s) do return (new RopeString.from(self)).prepend(s)
 
-       # Refines to add a cache method, calculates only once for every modification
-       # the string representation for self
-       redef fun to_s
+       redef fun insert_at(s, pos)
        do
-               if self.str_representation == null or is_dirty then
-                       self.str_representation = flatten
-                       is_dirty = false
-               end
-               return self.str_representation.as(not null)
+               if pos == 0 then return prepend(s)
+               if pos == length then return append(s)
+
+               var l = substring(0,pos)
+               var r = substring_from(pos)
+               var ret: String = new RopeString.from(l)
+               ret += s
+               return ret + r
        end
 
 end
 
-# Rope that cannot be modified
-class ImmutableRope
-       super Rope
+private class RopeStringChars
+       super SequenceRead[Char]
 
-       init
-       do
-               super
-       end
+       var tgt: Rope
 
-       redef init with_string(str)
+       redef fun [](pos)
        do
-               super
+               assert pos < tgt.length
+               var path = tgt.node_at(pos)
+               return path.leaf.str.chars[path.offset]
        end
 
-       ############################################################################
-       #                          Rope refined Methods                            #
-       ############################################################################
+       redef fun iterator do return iterator_from(0)
 
-       redef fun subrope(index_from: Int, count: Int): ImmutableRope
-       do
-               return (super.as(BufferRope)).to_immutable
-       end
+       redef fun iterator_from(pos) do return new RopeCharIterator(tgt, pos)
 
-       redef fun *(repeats: Int): ImmutableRope
-       do
-               return (super.as(BufferRope)).to_immutable
-       end
+       redef fun reverse_iterator do return reverse_iterator_from(tgt.length-1)
 
-       redef fun +(other: Rope): ImmutableRope
-       do
-               return (super.as(BufferRope)).to_immutable
-       end
+       redef fun reverse_iterator_from(pos) do return new ReverseRopeCharIterator(tgt, pos)
+end
 
-       redef fun multi_concat(ropes: Rope...): ImmutableRope
+# Used to iterate on a Rope
+private class IteratorElement
+
+       init(e: RopeNode)
        do
-               return (super.as(BufferRope)).to_immutable
+               if e isa Leaf then
+                       left = true
+                       right = true
+               end
+               node = e
        end
 
+       # The node being visited
+       var node: RopeNode
+       # If the node has a left child, was it visited ?
+       var left = false
+       # If the node has a right child, was it visited ?
+       var right = false
+       # Was the current node visited ?
+       var done = false
 end
 
-############################################
-#            Rope view classes             #
-############################################
+# Simple Postfix iterator on the nodes of a Rope
+private class Postfix
+       super IndexedIterator[RopeNode]
 
-class CharRopeView
-       super SequenceRead[Char]
+       # Target Rope to iterate on
+       var target: Rope
+
+       # Current position in Rope
+       var pos: Int
 
-       # Targeted Rope for the view
-       private var target: Rope
+       # Visited nodes
+       var stack = new List[IteratorElement]
 
-       init(tgt: Rope)
+       init from(tgt: Rope, pos: Int)
        do
                self.target = tgt
+               self.pos = pos
+               if pos < 0 or pos >= tgt.length then return
+               var path = tgt.node_at(pos)
+               self.pos -= path.offset
+               for i in path.stack do
+                       var item = new IteratorElement(i.node)
+                       item.left = true
+                       if i.right then item.right = true
+                       stack.push item
+               end
+               var item = new IteratorElement(path.leaf)
+               item.done = true
+               stack.push item
        end
 
-       redef fun [](position)
+       redef fun item
        do
-               var tuple = target.get_node_for_pos(position)
-               return tuple.curr_node.value[tuple.corrected_pos]
+               assert is_ok
+               return stack.last.node
        end
 
-       redef fun first do return self[0]
+       redef fun is_ok do return not stack.is_empty
 
-       redef fun index_of(char)
-       do
-               var intern_iter = new RopeCharIterator(target)
-               while intern_iter.is_ok do
-                       if intern_iter.item == char then return intern_iter.index
-                       intern_iter.next
-               end
-               return -1
-       end
+       redef fun index do return pos
 
-       redef fun iterator do
-               return new RopeCharIterator(target)
+       redef fun next do
+               if stack.is_empty then return
+               if pos > target.length-1 then
+                       stack.clear
+                       return
+               end
+               var lst = stack.last
+               if lst.done then
+                       if lst.node isa Leaf then
+                               pos += lst.node.length
+                       end
+                       stack.pop
+                       next
+                       return
+               end
+               if not lst.left then
+                       lst.left = true
+                       var nod = lst.node
+                       if nod isa Concat and nod.left != null then
+                               stack.push(new IteratorElement(nod.left.as(not null)))
+                               next
+                               return
+                       end
+               end
+               if not lst.right then
+                       lst.right = true
+                       var nod = lst.node
+                       if nod isa Concat and nod.right != null then
+                               stack.push(new IteratorElement(nod.right.as(not null)))
+                               next
+                               return
+                       end
+               end
+               lst.done = true
        end
+end
 
-       redef fun last do return self[self.length-1]
+# Iterates on the leaves (substrings) of the Rope
+class LeavesIterator
+       super IndexedIterator[Leaf]
 
-       redef fun length do return target.length
+       private var nodes: Postfix
 
-       redef fun count(item)
+       init(tgt: Rope, pos: Int)
        do
-               var count = 0
-               var iter = self.iterator
-
-               for i in self do
-                       if i == item then count += 1
-               end
-
-               return count
+               nodes = tgt.postfix(pos)
        end
 
-       redef fun has_only(item)
-       do
-               for i in self do
-                       if i != item then return false
-               end
-               return true
-       end
-
-       redef fun is_empty do return length == 0
+       redef fun is_ok do return nodes.is_ok
 
-       redef fun to_a do
-               return to_s.to_a
+       redef fun item
+       do
+               assert is_ok
+               return nodes.item.as(Leaf)
        end
 
-       redef fun to_s do
-               return target.to_s
-       end
+       redef fun index do return nodes.index
 
-       redef fun ==(other)
+       redef fun next
        do
-               if not other isa SequenceRead[Char] then return false
-
-               if self.length != other then return false
-
-               var iter = other.iterator
-
-               for i in self do
-                       if i != iter.item then return false
-                       iter.next
+               while nodes.is_ok do
+                       nodes.next
+                       if nodes.is_ok and nodes.item isa Leaf then break
                end
-
-               return true
        end
-
 end
 
-###########################################
-#            Iterator classes             #
-###########################################
-
-# A tuple representing the state of a node for a tree parsing algorithm
-private class TupleVisitNode
+# Uses the leaves and calculates a new substring on each iteration
+class SubstringsIterator
+       super IndexedIterator[Text]
 
-       init(tgt: ConcatNode)
-       do
-               self.node = tgt
-       end
-
-       private var node: ConcatNode
+       private var nodes: IndexedIterator[Leaf]
 
-       private var left_visited = false
-       private var right_visited = false
-
-end
+       # Current position in Rope
+       var pos: Int
 
-# Any kind of iterator parsing a Rope for LeafNodes
-private abstract class RopeIterator
-       super IndexedIterator[LeafNode]
+       # Current substring, computed from the current Leaf and indexes
+       var substring: Text
 
-       # Rope meant to be visited
-       private var _target: Rope
+       init(tgt: Rope, pos: Int)
+       do
+               nodes = tgt.leaves(pos)
+               self.pos = pos
+               if pos < 0 or pos >= tgt.length then return
+               make_substring
+       end
 
-       private fun target: Rope do return self._target
+       # Compute the bounds of the current substring and makes the substring
+       private fun make_substring
+       do
+               substring = nodes.item.str
+               var min = 0
+               var length = substring.length
+               if nodes.index < pos then
+                       min = pos - nodes.index
+               end
+               substring = substring.substring(min, length)
+       end
 
-       # Position in target
-       private var pos = 0
+       redef fun is_ok do return nodes.is_ok
 
-       init(tgt: Rope)
+       redef fun item
        do
-               self._target = tgt
+               assert is_ok
+               return substring
        end
 
-       init with_index(tgt: Rope, index: Int)
+       redef fun index do return pos
+
+       redef fun next
        do
-               self._target = tgt
+               pos += substring.length
+               nodes.next
+               if nodes.is_ok then make_substring
        end
 
 end
 
-# Iterator returning the content of a rope one char at a time
 class RopeCharIterator
        super IndexedIterator[Char]
 
-       # The iterator used to visit the rope
-       private var sub_str_iter: DFSRopeLeafIterator
+       var substrings: IndexedIterator[Text]
 
-       # The current position in the rope
-       private var abs_pos = 0
+       var pos: Int
 
-       # The position in the current substring
-       private var sub_pos: Int = 0
+       var max: Int
 
-       # The substring contained in the current node visited by `sub_str_iter`
-       private var curr_substring: nullable String
+       var substr_iter: IndexedIterator[Char]
 
-       init(tgt: Rope)
+       init(tgt: Rope, from: Int)
        do
-               sub_str_iter = new DFSRopeLeafIterator(tgt)
-               if sub_str_iter.is_ok then curr_substring = sub_str_iter.item.value
+               substrings = tgt.substrings_from(from)
+               max = tgt.length - 1
+               if not substrings.is_ok then
+                       pos = tgt.length
+                       return
+               end
+               pos = from
+               substr_iter = substrings.item.chars.iterator
        end
 
-       redef fun item do return curr_substring[sub_pos]
+       redef fun item do return substr_iter.item
 
-       redef fun is_ok
-       do
-               if sub_str_iter.is_ok then return true
-               if not sub_str_iter.is_ok and curr_substring != null and sub_pos < curr_substring.length then return true
-               return false
-       end
+       redef fun is_ok do return pos <= max
+
+       redef fun index do return pos
 
        redef fun next
        do
-               assert is_ok
-               if sub_pos < curr_substring.length - 1 then
-                       sub_pos += 1
-               else
-                       sub_str_iter.next
-                       if sub_str_iter.is_ok then
-                               curr_substring = sub_str_iter.item.value
-                               sub_pos = 0
-                       else
-                               sub_pos = curr_substring.length
+               pos += 1
+               if substr_iter.is_ok then
+                       substr_iter.next
+               end
+               if not substr_iter.is_ok then
+                       substrings.next
+                       if substrings.is_ok then
+                               substr_iter = substrings.item.chars.iterator
                        end
                end
-               abs_pos += 1
        end
-
-       redef fun index do return abs_pos
-
 end
 
-# Special kind of iterator
-#
-# Performs a Depth-First Search on RopeLeaf items
-#
-private class DFSRopeLeafIterator
-       super RopeIterator
+private class ReversePostfix
+       super IndexedIterator[RopeNode]
 
-       # Stack of the visited nodes in the rope
-       private var visit_stack = new List[TupleVisitNode]
+       var target: Rope
 
-       # The leaf node being visited by the iterator
-       private var curr_leaf: nullable LeafNode
+       var pos: Int
 
-       init(tgt: Rope)
-       do
-               super
+       var min = 0
 
-               var first_node = target.parent_node
+       var stack = new List[IteratorElement]
 
-               if first_node isa ConcatNode then
-                       visit_stack.push(new TupleVisitNode(first_node))
-               else if first_node isa LeafNode then
-                       curr_leaf = first_node
-                       return
+       init from(tgt: Rope, pos: Int)
+       do
+               self.pos = pos
+               target = tgt
+               if pos < 0 or pos >= tgt.length then return
+               var path = tgt.node_at(pos)
+               self.pos -= path.offset
+               for i in path.stack do
+                       var elemt = new IteratorElement(i.node)
+                       elemt.right = true
+                       if i.left then
+                               elemt.left = true
+                       end
+                       stack.push elemt
                end
-
-               next_body
+               stack.push(new IteratorElement(path.leaf))
+               stack.last.done = true
        end
 
-       # Creates a new iterator on `tgt` starting at `index`
-       redef init with_index(tgt: Rope, index: Int)
-       do
-               super
-
-               var returned_tuple = target.get_node_for_pos(index)
-               curr_leaf = returned_tuple.curr_node
-               visit_stack = returned_tuple.visit_stack
-               pos = index - returned_tuple.corrected_pos
+       redef fun item do
+               assert is_ok
+               return stack.last.node
        end
 
-       redef fun is_ok do return curr_leaf != null
+       redef fun is_ok do return not stack.is_empty
+
+       redef fun index do return pos
 
        redef fun next
        do
-               assert is_ok
-               pos += curr_leaf.value.length
-               next_body
+               if stack.is_empty then return
+               if pos < min then
+                       stack.clear
+                       return
+               end
+               var lst = stack.last
+               if lst.done then
+                       stack.pop
+                       next
+                       return
+               end
+               if not lst.right then
+                       var nod = lst.node.as(Concat)
+                       var rgt = nod.right
+                       lst.right = true
+                       if rgt != null then
+                               stack.push(new IteratorElement(rgt))
+                               next
+                               return
+                       end
+               end
+               if not lst.left then
+                       var nod = lst.node.as(Concat)
+                       var lft = nod.left
+                       lst.left = true
+                       if lft != null then
+                               stack.push(new IteratorElement(lft))
+                               next
+                               return
+                       end
+               end
+               if lst.node isa Leaf then pos -= lst.node.length
+               lst.done = true
        end
+end
 
-       private fun next_body
-       do
-               var next_node: nullable RopeNode
-               while not visit_stack.is_empty do
-                       var curr_concat_tuple = visit_stack.last
-                       if not curr_concat_tuple.left_visited then
-
-                               curr_concat_tuple.left_visited = true
-
-                               next_node = curr_concat_tuple.node.left_child
-
-                               if next_node == null then continue
-
-                               if next_node isa ConcatNode then
-                                       visit_stack.push(new TupleVisitNode(next_node))
-                               else if next_node isa LeafNode then
-                                       curr_leaf = next_node
-                                       return
-                               end
-
-                       else if not curr_concat_tuple.right_visited then
+private class ReverseLeavesIterator
+       super IndexedIterator[Leaf]
 
-                               curr_concat_tuple.right_visited = true
+       var nodes: ReversePostfix
 
-                               next_node = curr_concat_tuple.node.right_child
+       init(tgt: Rope, from: Int)
+       do
+               nodes = tgt.reverse_postfix(from)
+       end
 
-                               if next_node == null then continue
+       redef fun is_ok do return nodes.is_ok
 
-                               if next_node isa ConcatNode then
-                                       visit_stack.push(new TupleVisitNode(next_node))
-                               else if next_node isa LeafNode then
-                                       curr_leaf = next_node
-                                       return
-                               end
+       redef fun item do
+               assert is_ok
+               return nodes.item.as(Leaf)
+       end
 
-                       else
-                               visit_stack.pop
-                       end
+       redef fun next do
+               while nodes.is_ok do
+                       nodes.next
+                       if nodes.is_ok then if nodes.item isa Leaf then break
                end
-               self.curr_leaf = null
        end
 
-       redef fun item
-       do
-               assert is_ok
-               return curr_leaf.as(not null)
-       end
+       redef fun index do return nodes.index
 
 end
 
-###########################################
-#              Node classes               #
-###########################################
-
-# A node for a Rope
-private abstract class RopeNode
-
-       private var _length = 0
-
-       private var parent: nullable ConcatNode = null
-
-       private var height = 0
-
-       # The balance factor of a node, if it is a Leaf, it equals its length
-       # Else, it will be equal to the difference between the height on the left and on the right
-       private fun balance_factor: Int do return height end
+private class ReverseSubstringsIterator
+       super IndexedIterator[Text]
 
-       fun length: Int do return _length
+       var leaves: ReverseLeavesIterator
 
-       private fun length=(len: Int)
-       do
-               _length = len
-       end
-end
-
-# Node that represents a concatenation between two nodes (of any RopeNode type)
-private class ConcatNode
-       super RopeNode
+       var pos: Int
 
-       private var _left_child: nullable RopeNode = null
-       private var _right_child: nullable RopeNode = null
+       var str: Text
 
-       private fun left_child: nullable RopeNode
+       init(tgt: Rope, from: Int)
        do
-               if _left_child != null then
-                       return _left_child
-               else
-                       return null
-               end
+               leaves = tgt.reverse_leaves(from)
+               pos = from
+               if not leaves.is_ok then return
+               str = leaves.item.str
+               make_substring
        end
 
-       private fun right_child: nullable RopeNode
+       fun make_substring
        do
-               if _right_child != null then
-                       return _right_child
-               else
-                       return null
-               end
+               if pos >= (leaves.index + str.length - 1) then return
+               str = str.substring(0, (pos - leaves.index + 1))
        end
 
-       private fun left_child=(new_node: nullable RopeNode)
-       do
-               self._left_child = new_node
-               new_node.parent = self
-               update_data
-       end
+       redef fun is_ok do return leaves.is_ok
 
-       private fun right_child=(new_node: nullable RopeNode)
-       do
-               self._right_child = new_node
-               new_node.parent = self
-               update_data
+       redef fun item do
+               assert is_ok
+               return str
        end
 
-       # Updates the internal data of the current node
-       #
-       # Concretely, updates the length and the height of the node
-       private fun update_data
-       do
-               self.length = 0
-               self.height = 1
-               if left_child != null then
-                       self.length += left_child.length
-                       if left_child.height + 1 > self.height then self.height = left_child.height + 1
-               end
-               if right_child != null then
-                       self.length += right_child.length
-                       if right_child.height + 1 > self.height then self.height = right_child.height + 1
-               end
-       end
+       redef fun index do return pos
 
-       # Computes and returns the balance factor (used for AVL trees)
-       #
-       # Formula : left.height - right.height
-       redef private fun balance_factor
-       do
-               var left_height = 0
-               var right_height = 0
-               if left_child != null then left_height = left_child.height
-               if right_child != null then right_height = right_child.height
-               return left_height - right_height
+       redef fun next do
+               pos -= str.length
+               leaves.next
+               if not leaves.is_ok then return
+               str = leaves.item.str
+               make_substring
        end
 end
 
-# A leaf node contains a substring of some sort
-private class LeafNode
-       super RopeNode
+private class ReverseRopeCharIterator
+       super IndexedIterator[Char]
 
-       # Encapsulated string in the leaf node
-       private var _value: String
+       var substrs: IndexedIterator[Text]
 
-       init(val: String)
-       do
-               self._value = val.to_s
-               self.length = val.length
-       end
+       var pos: Int
 
-       private fun value: String do return self._value
+       var subiter: IndexedIterator[Char]
 
-       private fun value= (val: String)
+       init(tgt: Rope, from: Int)
        do
-               _value = val
+               substrs = tgt.reverse_substrings_from(from)
+               if not substrs.is_ok then
+                       pos = -1
+                       return
+               end
+               subiter = substrs.item.chars.reverse_iterator
+               pos = from
        end
-end
 
-#####################################################
-#            Foreign classes refinement             #
-#####################################################
+       redef fun is_ok do return pos >= 0
 
-redef class String
-       redef fun ==(other)
-       do
-               if other isa Rope then
-                       return other == self
-               else
-                       return super
-               end
+       redef fun item do
+               assert is_ok
+               return subiter.item
        end
-end
 
-redef class Buffer
-       redef fun ==(other)
-       do
-               if other isa Rope then
-                       return other == self
-               else
-                       return super
+       redef fun index do return pos
+
+       redef fun next do
+               pos -= 1
+               if subiter.is_ok then subiter.next
+               if not subiter.is_ok then
+                       if substrs.is_ok then substrs.next
+                       if substrs.is_ok then subiter = substrs.item.chars.reverse_iterator
                end
        end
 end
+
index 6297038..85d28c9 100644 (file)
@@ -22,7 +22,7 @@ import string_search
 import file
 import exec
 import stream
-import string
+import ropes
 import collection
 import math
 import kernel
index 507ba8d..504396a 100644 (file)
@@ -13,7 +13,7 @@
 # Input and output streams of characters
 module stream
 
-import string
+intrude import ropes
 
 in "C" `{
        #include <unistd.h>
@@ -136,6 +136,29 @@ redef class Text
        redef fun write_to(stream) do stream.write(self)
 end
 
+redef class RopeNode
+       super Streamable
+end
+
+redef class Leaf
+
+       redef fun write_to(s) do s.write(str)
+end
+
+redef class Concat
+
+       redef fun write_to(s)
+       do
+               if left != null then left.write_to(s)
+               if right != null then right.write_to(s)
+       end
+end
+
+redef class RopeString
+
+       redef fun write_to(s) do root.write_to(s)
+end
+
 # Input streams with a buffer
 abstract class BufferedIStream
        super IStream
index 59a286d..fcc1f1b 100644 (file)
@@ -59,6 +59,9 @@ abstract class Text
        # In this case, `from += count` and `count -= from`.
        fun substring(from: Int, count: Int): SELFTYPE is abstract
 
+       # Iterates on the substrings of self if any
+       fun substrings: Iterator[Text] is abstract
+
        # Concatenates `o` to `self`
        #
        #     assert "hello" + "world"  == "helloworld"
@@ -609,6 +612,28 @@ abstract class String
 
        redef fun to_s do return self
 
+       fun append(s: String): SELFTYPE is abstract
+
+       fun prepend(s: String): SELFTYPE is abstract
+
+       fun insert_at(s: String, pos: Int): SELFTYPE is abstract
+end
+
+private class FlatSubstringsIter
+       super Iterator[FlatText]
+
+       var tgt: nullable FlatText
+
+       init(tgt: FlatText) do self.tgt = tgt
+
+       redef fun item do
+               assert is_ok
+               return tgt.as(not null)
+       end
+
+       redef fun is_ok do return tgt != null
+
+       redef fun next do tgt = null
 end
 
 # Immutable strings of characters.
@@ -616,8 +641,6 @@ class FlatString
        super FlatText
        super String
 
-       redef type SELFTYPE: FlatString
-
        # Index in _items of the start of the string
        private var index_from: Int
 
@@ -876,6 +899,8 @@ class FlatString
 
                return hash_cache.as(not null)
        end
+
+       redef fun substrings do return new FlatSubstringsIter(self)
 end
 
 private class FlatStringReverseIterator
@@ -1011,6 +1036,8 @@ class FlatBuffer
 
        private var capacity: Int = 0
 
+       redef fun substrings do return new FlatSubstringsIter(self)
+
        redef fun []=(index, item)
        do
                is_dirty = true
index 85f9443..3dbd389 100644 (file)
@@ -474,10 +474,12 @@ class ModelBuilder
                var pn = rdp.basename(".nit")
                var mp = dirpath.join_path(pn + ".nit").simplify_path
 
+               var dirpath2 = dirpath
                if not mp.file_exists then
                        if pn == "src" then
                                # With a src directory, the group name is the name of the parent directory
-                               pn = rdp.dirname.basename("")
+                               dirpath2 = rdp.dirname
+                               pn = dirpath2.basename("")
                        else
                                return null
                        end
@@ -498,7 +500,8 @@ class ModelBuilder
                        mgroup = new MGroup(pn, parent.mproject, parent)
                        toolcontext.info("found sub group `{mgroup.full_name}` at {dirpath}", 2)
                end
-               var readme = dirpath.join_path("README")
+               var readme = dirpath2.join_path("README.md")
+               if not readme.file_exists then readme = dirpath2.join_path("README")
                if readme.file_exists then
                        var mdoc = new MDoc
                        var s = new IFStream.open(readme)
index 4cd9475..09b7081 100644 (file)
@@ -97,7 +97,12 @@ redef class ModelBuilder
                        error(nvisibility, "Error: refinement changed the visibility from a {mclass.visibility} to a {mvisibility}")
                end
                nclassdef.mclass = mclass
-               nmodule.mclass2nclassdef[mclass] = nclassdef
+               if not nmodule.mclass2nclassdef.has_key(mclass) then
+                       nmodule.mclass2nclassdef[mclass] = nclassdef
+                       nclassdef.all_defs = [nclassdef]
+               else
+                       nmodule.mclass2nclassdef[mclass].all_defs.add(nclassdef)
+               end
        end
 
        # Visit the AST and create the `MClassDef` objects
@@ -107,7 +112,14 @@ redef class ModelBuilder
                var objectclass = try_get_mclass_by_name(nmodule, mmodule, "Object")
                var mclass = nclassdef.mclass
                if mclass == null then return # Skip error
-               #var mclassdef = nclassdef.mclassdef.as(not null)
+
+               # In case of non-standard AClassdef, try to attach to an already existing mclassdef
+               var other_nclassdef = nmodule.mclass2nclassdef[mclass]
+               if other_nclassdef != nclassdef then
+                       assert not nclassdef isa AStdClassdef
+                       nclassdef.mclassdef = other_nclassdef.mclassdef
+                       return
+               end
 
                var names = new Array[String]
                var bounds = new Array[MType]
@@ -281,8 +293,7 @@ redef class ModelBuilder
                if errcount != toolcontext.error_count then return
 
                # Create the mclassdef hierarchy
-               for nclassdef in nmodule.n_classdefs do
-                       var mclassdef = nclassdef.mclassdef.as(not null)
+               for mclassdef in mmodule.mclassdefs do
                        mclassdef.add_in_hierarchy
                end
 
@@ -505,6 +516,8 @@ redef class AClassdef
        var mclass: nullable MClass
        # The associated MClassDef once build by a `ModelBuilder`
        var mclassdef: nullable MClassDef
+       # All (self and other) definitions for the same mclassdef
+       var all_defs: nullable Array[AClassdef]
 end
 
 redef class AClasskind
index e24541e..3563862 100644 (file)
@@ -28,6 +28,7 @@ private class ModelizePropertyPhase
        redef fun process_nmodule(nmodule)
        do
                for nclassdef in nmodule.n_classdefs do
+                       if nclassdef.all_defs == null then continue # skip non principal classdef
                        toolcontext.modelbuilder.build_properties(nclassdef)
                end
        end
@@ -52,14 +53,16 @@ redef class ModelBuilder
                        build_properties(mclassdef2nclassdef[superclassdef])
                end
 
-               for npropdef in nclassdef.n_propdefs do
-                       npropdef.build_property(self, nclassdef)
-               end
-               for npropdef in nclassdef.n_propdefs do
-                       npropdef.build_signature(self)
-               end
-               for npropdef in nclassdef.n_propdefs do
-                       npropdef.check_signature(self)
+               for nclassdef2 in nclassdef.all_defs do
+                       for npropdef in nclassdef2.n_propdefs do
+                               npropdef.build_property(self, mclassdef)
+                       end
+                       for npropdef in nclassdef2.n_propdefs do
+                               npropdef.build_signature(self)
+                       end
+                       for npropdef in nclassdef2.n_propdefs do
+                               npropdef.check_signature(self)
+                       end
                end
                process_default_constructors(nclassdef)
        end
@@ -225,7 +228,9 @@ redef class AClassdef
 
        # The free init (implicitely constructed by the class if required)
        var mfree_init: nullable MMethodDef = null
+end
 
+redef class MClassDef
        # What is the `APropdef` associated to a `MProperty`?
        # Used to check multiple definition of a property.
        var mprop2npropdef: Map[MProperty, APropdef] = new HashMap[MProperty, APropdef]
@@ -260,7 +265,7 @@ redef class APropdef
        # The associated propdef once build by a `ModelBuilder`
        var mpropdef: nullable MPROPDEF writable
 
-       private fun build_property(modelbuilder: ModelBuilder, nclassdef: AClassdef) is abstract
+       private fun build_property(modelbuilder: ModelBuilder, mclassdef: MClassDef) is abstract
        private fun build_signature(modelbuilder: ModelBuilder) is abstract
        private fun check_signature(modelbuilder: ModelBuilder) is abstract
        private fun new_property_visibility(modelbuilder: ModelBuilder, mclassdef: MClassDef, nvisibility: nullable AVisibility): MVisibility
@@ -306,13 +311,13 @@ redef class APropdef
                end
        end
 
-       private fun check_redef_keyword(modelbuilder: ModelBuilder, nclassdef: AClassdef, kwredef: nullable Token, need_redef: Bool, mprop: MProperty): Bool
+       private fun check_redef_keyword(modelbuilder: ModelBuilder, mclassdef: MClassDef, kwredef: nullable Token, need_redef: Bool, mprop: MProperty): Bool
        do
-               if nclassdef.mprop2npropdef.has_key(mprop) then
-                       modelbuilder.error(self, "Error: A property {mprop} is already defined in class {nclassdef.mclassdef.mclass} at line {nclassdef.mprop2npropdef[mprop].location.line_start}.")
+               if mclassdef.mprop2npropdef.has_key(mprop) then
+                       modelbuilder.error(self, "Error: A property {mprop} is already defined in class {mclassdef.mclass} at line {mclassdef.mprop2npropdef[mprop].location.line_start}.")
                        return false
                end
-               if mprop isa MMethod and mprop.is_toplevel != (nclassdef isa ATopClassdef) then
+               if mprop isa MMethod and mprop.is_toplevel != (parent isa ATopClassdef) then
                        if mprop.is_toplevel then
                                modelbuilder.error(self, "Error: {mprop} is a top level method.")
                        else
@@ -323,12 +328,12 @@ redef class APropdef
                end
                if kwredef == null then
                        if need_redef then
-                               modelbuilder.error(self, "Redef error: {nclassdef.mclassdef.mclass}::{mprop.name} is an inherited property. To redefine it, add the redef keyword.")
+                               modelbuilder.error(self, "Redef error: {mclassdef.mclass}::{mprop.name} is an inherited property. To redefine it, add the redef keyword.")
                                return false
                        end
                else
                        if not need_redef then
-                               modelbuilder.error(self, "Error: No property {nclassdef.mclassdef.mclass}::{mprop.name} is inherited. Remove the redef keyword to define a new property.")
+                               modelbuilder.error(self, "Error: No property {mclassdef.mclass}::{mprop.name} is inherited. Remove the redef keyword to define a new property.")
                                return false
                        end
                end
@@ -416,12 +421,11 @@ end
 redef class AMethPropdef
        redef type MPROPDEF: MMethodDef
 
-       redef fun build_property(modelbuilder, nclassdef)
+       redef fun build_property(modelbuilder, mclassdef)
        do
                var n_kwinit = n_kwinit
                var n_kwnew = n_kwnew
                var is_init = n_kwinit != null or n_kwnew != null
-               var mclassdef = nclassdef.mclassdef.as(not null)
                var name: String
                var amethodid = self.n_methid
                var name_node: ANode
@@ -458,13 +462,13 @@ redef class AMethPropdef
                        mprop = new MMethod(mclassdef, name, mvisibility)
                        mprop.is_init = is_init
                        mprop.is_new = n_kwnew != null
-                       if nclassdef isa ATopClassdef then mprop.is_toplevel = true
-                       if not self.check_redef_keyword(modelbuilder, nclassdef, n_kwredef, false, mprop) then return
+                       if parent isa ATopClassdef then mprop.is_toplevel = true
+                       if not self.check_redef_keyword(modelbuilder, mclassdef, n_kwredef, false, mprop) then return
                else
-                       if not self.check_redef_keyword(modelbuilder, nclassdef, n_kwredef, not self isa AMainMethPropdef, mprop) then return
+                       if not self.check_redef_keyword(modelbuilder, mclassdef, n_kwredef, not self isa AMainMethPropdef, mprop) then return
                        check_redef_property_visibility(modelbuilder, self.n_visibility, mprop)
                end
-               nclassdef.mprop2npropdef[mprop] = self
+               mclassdef.mprop2npropdef[mprop] = self
 
                var mpropdef = new MMethodDef(mclassdef, mprop, self.location)
 
@@ -624,9 +628,8 @@ redef class AAttrPropdef
        var mreadpropdef: nullable MMethodDef writable
        # The associated setter (write accessor) if any
        var mwritepropdef: nullable MMethodDef writable
-       redef fun build_property(modelbuilder, nclassdef)
+       redef fun build_property(modelbuilder, mclassdef)
        do
-               var mclassdef = nclassdef.mclassdef.as(not null)
                var mclass = mclassdef.mclass
 
                var name: String
@@ -651,13 +654,13 @@ redef class AAttrPropdef
                        if mprop == null then
                                var mvisibility = new_property_visibility(modelbuilder, mclassdef, self.n_visibility)
                                mprop = new MAttribute(mclassdef, name, mvisibility)
-                               if not self.check_redef_keyword(modelbuilder, nclassdef, self.n_kwredef, false, mprop) then return
+                               if not self.check_redef_keyword(modelbuilder, mclassdef, self.n_kwredef, false, mprop) then return
                        else
                                assert mprop isa MAttribute
                                check_redef_property_visibility(modelbuilder, self.n_visibility, mprop)
-                               if not self.check_redef_keyword(modelbuilder, nclassdef, self.n_kwredef, true, mprop) then return
+                               if not self.check_redef_keyword(modelbuilder, mclassdef, self.n_kwredef, true, mprop) then return
                        end
-                       nclassdef.mprop2npropdef[mprop] = self
+                       mclassdef.mprop2npropdef[mprop] = self
 
                        var mpropdef = new MAttributeDef(mclassdef, mprop, self.location)
                        self.mpropdef = mpropdef
@@ -671,12 +674,12 @@ redef class AAttrPropdef
                                if mreadprop == null then
                                        var mvisibility = new_property_visibility(modelbuilder, mclassdef, nreadable.n_visibility)
                                        mreadprop = new MMethod(mclassdef, readname, mvisibility)
-                                       if not self.check_redef_keyword(modelbuilder, nclassdef, nreadable.n_kwredef, false, mreadprop) then return
+                                       if not self.check_redef_keyword(modelbuilder, mclassdef, nreadable.n_kwredef, false, mreadprop) then return
                                else
-                                       if not self.check_redef_keyword(modelbuilder, nclassdef, nreadable.n_kwredef, true, mreadprop) then return
+                                       if not self.check_redef_keyword(modelbuilder, mclassdef, nreadable.n_kwredef, true, mreadprop) then return
                                        check_redef_property_visibility(modelbuilder, nreadable.n_visibility, mreadprop)
                                end
-                               nclassdef.mprop2npropdef[mreadprop] = self
+                               mclassdef.mprop2npropdef[mreadprop] = self
 
                                var mreadpropdef = new MMethodDef(mclassdef, mreadprop, self.location)
                                self.mreadpropdef = mreadpropdef
@@ -691,12 +694,12 @@ redef class AAttrPropdef
                                if mwriteprop == null then
                                        var mvisibility = new_property_visibility(modelbuilder, mclassdef, nwritable.n_visibility)
                                        mwriteprop = new MMethod(mclassdef, writename, mvisibility)
-                                       if not self.check_redef_keyword(modelbuilder, nclassdef, nwritable.n_kwredef, false, mwriteprop) then return
+                                       if not self.check_redef_keyword(modelbuilder, mclassdef, nwritable.n_kwredef, false, mwriteprop) then return
                                else
-                                       if not self.check_redef_keyword(modelbuilder, nclassdef, nwritable.n_kwredef, true, mwriteprop) then return
+                                       if not self.check_redef_keyword(modelbuilder, mclassdef, nwritable.n_kwredef, true, mwriteprop) then return
                                        check_redef_property_visibility(modelbuilder, nwritable.n_visibility, mwriteprop)
                                end
-                               nclassdef.mprop2npropdef[mwriteprop] = self
+                               mclassdef.mprop2npropdef[mwriteprop] = self
 
                                var mwritepropdef = new MMethodDef(mclassdef, mwriteprop, self.location)
                                self.mwritepropdef = mwritepropdef
@@ -717,12 +720,12 @@ redef class AAttrPropdef
                        if mreadprop == null then
                                var mvisibility = new_property_visibility(modelbuilder, mclassdef, self.n_visibility)
                                mreadprop = new MMethod(mclassdef, readname, mvisibility)
-                               if not self.check_redef_keyword(modelbuilder, nclassdef, n_kwredef, false, mreadprop) then return
+                               if not self.check_redef_keyword(modelbuilder, mclassdef, n_kwredef, false, mreadprop) then return
                        else
-                               if not self.check_redef_keyword(modelbuilder, nclassdef, n_kwredef, true, mreadprop) then return
+                               if not self.check_redef_keyword(modelbuilder, mclassdef, n_kwredef, true, mreadprop) then return
                                check_redef_property_visibility(modelbuilder, self.n_visibility, mreadprop)
                        end
-                       nclassdef.mprop2npropdef[mreadprop] = self
+                       mclassdef.mprop2npropdef[mreadprop] = self
 
                        var mreadpropdef = new MMethodDef(mclassdef, mreadprop, self.location)
                        self.mreadpropdef = mreadpropdef
@@ -742,14 +745,14 @@ redef class AAttrPropdef
                                        mvisibility = private_visibility
                                end
                                mwriteprop = new MMethod(mclassdef, writename, mvisibility)
-                               if not self.check_redef_keyword(modelbuilder, nclassdef, nwkwredef, false, mwriteprop) then return
+                               if not self.check_redef_keyword(modelbuilder, mclassdef, nwkwredef, false, mwriteprop) then return
                        else
-                               if not self.check_redef_keyword(modelbuilder, nclassdef, nwkwredef, true, mwriteprop) then return
+                               if not self.check_redef_keyword(modelbuilder, mclassdef, nwkwredef, true, mwriteprop) then return
                                if nwritable != null then
                                        check_redef_property_visibility(modelbuilder, nwritable.n_visibility, mwriteprop)
                                end
                        end
-                       nclassdef.mprop2npropdef[mwriteprop] = self
+                       mclassdef.mprop2npropdef[mwriteprop] = self
 
                        var mwritepropdef = new MMethodDef(mclassdef, mwriteprop, self.location)
                        self.mwritepropdef = mwritepropdef
@@ -934,9 +937,8 @@ end
 redef class ATypePropdef
        redef type MPROPDEF: MVirtualTypeDef
 
-       redef fun build_property(modelbuilder, nclassdef)
+       redef fun build_property(modelbuilder, mclassdef)
        do
-               var mclassdef = nclassdef.mclassdef.as(not null)
                var name = self.n_id.text
                var mprop = modelbuilder.try_get_mproperty_by_name(self.n_id, mclassdef, name)
                if mprop == null then
@@ -946,13 +948,13 @@ redef class ATypePropdef
                                modelbuilder.warning(n_id, "Warning: lowercase in the virtual type {name}")
                                break
                        end
-                       if not self.check_redef_keyword(modelbuilder, nclassdef, self.n_kwredef, false, mprop) then return
+                       if not self.check_redef_keyword(modelbuilder, mclassdef, self.n_kwredef, false, mprop) then return
                else
-                       if not self.check_redef_keyword(modelbuilder, nclassdef, self.n_kwredef, true, mprop) then return
+                       if not self.check_redef_keyword(modelbuilder, mclassdef, self.n_kwredef, true, mprop) then return
                        assert mprop isa MVirtualTypeProp
                        check_redef_property_visibility(modelbuilder, self.n_visibility, mprop)
                end
-               nclassdef.mprop2npropdef[mprop] = self
+               mclassdef.mprop2npropdef[mprop] = self
 
                var mpropdef = new MVirtualTypeDef(mclassdef, mprop, self.location)
                self.mpropdef = mpropdef
diff --git a/src/nitvm.nit b/src/nitvm.nit
new file mode 100644 (file)
index 0000000..9a62208
--- /dev/null
@@ -0,0 +1,62 @@
+# This file is part of NIT ( http://www.nitlanguage.org ).
+#
+# Copyright 2012 Jean Privat <jean@pryen.org>
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# The Nit virtual machine launcher
+module nitvm
+
+import vm
+
+# Create a tool context to handle options and paths
+var toolcontext = new ToolContext
+toolcontext.tooldescription = "Usage: nitvm [OPTION]... <file.nit>...\nExecutes Nit programs with a virtual machine."
+# Add an option "-o" to enable compatibility with the tests.sh script
+var opt = new OptionString("compatibility (does nothing)", "-o")
+toolcontext.option_context.add_option(opt)
+var opt_mixins = new OptionArray("Additional modules to min-in", "-m")
+toolcontext.option_context.add_option(opt_mixins)
+# We do not add other options, so process them now!
+toolcontext.process_options(args)
+
+# We need a model to collect stufs
+var model = new Model
+
+# Add a model builder to parse files
+var modelbuilder = new ModelBuilder(model, toolcontext.as(not null))
+
+var arguments = toolcontext.option_context.rest
+var progname = arguments.first
+
+# Here we load and process all modules passed on the command line
+var mmodules = modelbuilder.parse([progname])
+mmodules.add_all modelbuilder.parse(opt_mixins.value)
+modelbuilder.run_phases
+
+if toolcontext.opt_only_metamodel.value then exit(0)
+
+var mainmodule: nullable MModule
+
+# Here we launch the interpreter on the main module
+if mmodules.length == 1 then
+       mainmodule = mmodules.first
+else
+       mainmodule = new MModule(model, null, mmodules.first.name, mmodules.first.location)
+       mainmodule.set_imported_mmodules(mmodules)
+end
+
+var self_mm = mainmodule.as(not null)
+var self_args = arguments.as(not null)
+
+modelbuilder.run_naive_interpreter(self_mm, self_args)
index a6251b6..02b5fa2 100644 (file)
@@ -366,7 +366,7 @@ extern_call_cast {-> extern_call}
 
 string_o {->string?} = string? {-> string};
 
-in_language = kwin string;
+in_language = kwin no string [n1]:no {-> New in_language(kwin, string)};
 extern_code_block = in_language? extern_code_segment;
 extern_code_block_o {-> extern_code_block?}
        = extern_code_block {-> extern_code_block}
index d2599f5..28fab11 100644 (file)
@@ -5007,11 +5007,13 @@ private class ReduceAction145
        redef fun action(p: Parser)
        do
                                        var node_list: nullable Object = null
+                                       var nodearraylist4 = p.pop
+                                       var nodearraylist3 = p.pop
                                        var nodearraylist2 = p.pop
                                        var nodearraylist1 = p.pop
                                        var tkwinnode2 = nodearraylist1
                                        assert tkwinnode2 isa nullable TKwin
-                                       var tstringnode3 = nodearraylist2
+                                       var tstringnode3 = nodearraylist3
                                        assert tstringnode3 isa nullable TString
                                        var pinlanguagenode1: nullable AInLanguage = new AInLanguage.init_ainlanguage(
                                                tkwinnode2,
index fc403a2..02a655b 100644 (file)
@@ -2637,9 +2637,10 @@ static int parser_action_row35[] = {
        1, 0, 2
 };
 static int parser_action_row36[] = {
-       2,
-       -1, 3, 35,
-       89, 0, 152
+       3,
+       -1, 1, 378,
+       0, 0, 1,
+       1, 0, 2
 };
 static int parser_action_row37[] = {
        24,
@@ -3490,8 +3491,9 @@ static int parser_action_row152[] = {
        84, 0, 297
 };
 static int parser_action_row153[] = {
-       1,
-       -1, 1, 145
+       2,
+       -1, 3, 152,
+       89, 0, 299
 };
 static int parser_action_row154[] = {
        2,
@@ -3559,9 +3561,9 @@ static int parser_action_row162[] = {
 static int parser_action_row163[] = {
        4,
        -1, 1, 244,
-       32, 0, 306,
-       33, 0, 307,
-       35, 0, 308
+       32, 0, 307,
+       33, 0, 308,
+       35, 0, 309
 };
 static int parser_action_row164[] = {
        1,
@@ -3570,29 +3572,29 @@ static int parser_action_row164[] = {
 static int parser_action_row165[] = {
        3,
        -1, 1, 251,
-       76, 0, 309,
-       79, 0, 310
+       76, 0, 310,
+       79, 0, 311
 };
 static int parser_action_row166[] = {
        11,
        -1, 1, 253,
-       42, 0, 311,
-       67, 0, 312,
-       68, 0, 313,
-       72, 0, 314,
-       73, 0, 315,
-       74, 0, 316,
-       75, 0, 317,
-       77, 0, 318,
-       78, 0, 319,
-       80, 0, 320
+       42, 0, 312,
+       67, 0, 313,
+       68, 0, 314,
+       72, 0, 315,
+       73, 0, 316,
+       74, 0, 317,
+       75, 0, 318,
+       77, 0, 319,
+       78, 0, 320,
+       80, 0, 321
 };
 static int parser_action_row167[] = {
        4,
        -1, 1, 264,
-       69, 0, 321,
-       70, 0, 322,
-       71, 0, 323
+       69, 0, 322,
+       70, 0, 323,
+       71, 0, 324
 };
 static int parser_action_row168[] = {
        1,
@@ -3606,13 +3608,13 @@ static int parser_action_row170[] = {
        3,
        -1, 1, 274,
        56, 0, 207,
-       66, 0, 324
+       66, 0, 325
 };
 static int parser_action_row171[] = {
        3,
        -1, 3, 170,
-       44, 0, 326,
-       85, 0, 327
+       44, 0, 327,
+       85, 0, 328
 };
 static int parser_action_row172[] = {
        2,
@@ -3622,7 +3624,7 @@ static int parser_action_row172[] = {
 static int parser_action_row173[] = {
        2,
        -1, 3, 172,
-       84, 0, 329
+       84, 0, 330
 };
 static int parser_action_row174[] = {
        24,
@@ -3689,7 +3691,7 @@ static int parser_action_row177[] = {
 static int parser_action_row178[] = {
        3,
        -1, 1, 361,
-       59, 0, 332,
+       59, 0, 333,
        60, 0, 193
 };
 static int parser_action_row179[] = {
@@ -3729,22 +3731,22 @@ static int parser_action_row181[] = {
 static int parser_action_row182[] = {
        2,
        -1, 3, 181,
-       27, 0, 335
+       27, 0, 336
 };
 static int parser_action_row183[] = {
        3,
        -1, 3, 182,
-       50, 0, 336,
-       83, 0, 337
+       50, 0, 337,
+       83, 0, 338
 };
 static int parser_action_row184[] = {
        6,
        -1, 3, 183,
-       4, 0, 339,
-       16, 0, 340,
-       17, 0, 341,
-       54, 0, 342,
-       84, 0, 343
+       4, 0, 340,
+       16, 0, 341,
+       17, 0, 342,
+       54, 0, 343,
+       84, 0, 344
 };
 static int parser_action_row185[] = {
        1,
@@ -3769,8 +3771,8 @@ static int parser_action_row189[] = {
 static int parser_action_row190[] = {
        3,
        -1, 3, 189,
-       50, 0, 346,
-       83, 0, 347
+       50, 0, 347,
+       83, 0, 348
 };
 static int parser_action_row191[] = {
        22,
@@ -3875,13 +3877,13 @@ static int parser_action_row202[] = {
 static int parser_action_row203[] = {
        8,
        -1, 3, 202,
-       4, 0, 357,
-       5, 0, 358,
-       6, 0, 359,
-       7, 0, 360,
-       8, 0, 361,
-       10, 0, 362,
-       20, 0, 363
+       4, 0, 358,
+       5, 0, 359,
+       6, 0, 360,
+       7, 0, 361,
+       8, 0, 362,
+       10, 0, 363,
+       20, 0, 364
 };
 static int parser_action_row204[] = {
        1,
@@ -3946,9 +3948,9 @@ static int parser_action_row209[] = {
 static int parser_action_row210[] = {
        4,
        -1, 1, 285,
-       61, 0, 370,
-       62, 0, 371,
-       63, 0, 372
+       61, 0, 371,
+       62, 0, 372,
+       63, 0, 373
 };
 static int parser_action_row211[] = {
        1,
@@ -4041,16 +4043,16 @@ static int parser_action_row219[] = {
 static int parser_action_row220[] = {
        4,
        -1, 1, 279,
-       61, 0, 381,
-       62, 0, 371,
-       63, 0, 372
+       61, 0, 382,
+       62, 0, 372,
+       63, 0, 373
 };
 static int parser_action_row221[] = {
        4,
        -1, 1, 281,
-       61, 0, 383,
-       62, 0, 371,
-       63, 0, 372
+       61, 0, 384,
+       62, 0, 372,
+       63, 0, 373
 };
 static int parser_action_row222[] = {
        1,
@@ -4070,7 +4072,7 @@ static int parser_action_row223[] = {
        47, 0, 115,
        48, 0, 116,
        51, 0, 117,
-       54, 0, 385,
+       54, 0, 386,
        68, 0, 119,
        83, 0, 49,
        84, 0, 50,
@@ -4100,7 +4102,7 @@ static int parser_action_row225[] = {
        47, 0, 115,
        48, 0, 116,
        51, 0, 117,
-       54, 0, 385,
+       54, 0, 386,
        68, 0, 119,
        83, 0, 49,
        84, 0, 50,
@@ -4124,8 +4126,8 @@ static int parser_action_row227[] = {
 static int parser_action_row228[] = {
        3,
        -1, 1, 358,
-       12, 0, 388,
-       84, 0, 389
+       12, 0, 389,
+       84, 0, 390
 };
 static int parser_action_row229[] = {
        2,
@@ -4191,12 +4193,12 @@ static int parser_action_row240[] = {
 static int parser_action_row241[] = {
        2,
        -1, 1, 87,
-       14, 0, 394
+       14, 0, 395
 };
 static int parser_action_row242[] = {
        2,
        -1, 3, 241,
-       84, 0, 396
+       84, 0, 397
 };
 static int parser_action_row243[] = {
        3,
@@ -4258,8 +4260,8 @@ static int parser_action_row246[] = {
 static int parser_action_row247[] = {
        3,
        -1, 3, 246,
-       50, 0, 336,
-       83, 0, 337
+       50, 0, 337,
+       83, 0, 338
 };
 static int parser_action_row248[] = {
        18,
@@ -4308,13 +4310,13 @@ static int parser_action_row254[] = {
        3,
        -1, 3, 253,
        44, 0, 262,
-       85, 0, 403
+       85, 0, 404
 };
 static int parser_action_row255[] = {
        3,
        -1, 3, 254,
        56, 0, 207,
-       66, 0, 404
+       66, 0, 405
 };
 static int parser_action_row256[] = {
        23,
@@ -4330,7 +4332,7 @@ static int parser_action_row256[] = {
        48, 0, 45,
        51, 0, 158,
        54, 0, 47,
-       55, 0, 405,
+       55, 0, 406,
        56, 0, 48,
        68, 0, 159,
        83, 0, 49,
@@ -4407,7 +4409,7 @@ static int parser_action_row267[] = {
        -1, 1, 378,
        0, 0, 1,
        1, 0, 2,
-       27, 0, 411
+       27, 0, 412
 };
 static int parser_action_row268[] = {
        3,
@@ -4518,7 +4520,7 @@ static int parser_action_row285[] = {
 static int parser_action_row286[] = {
        2,
        -1, 1, 358,
-       84, 0, 389
+       84, 0, 390
 };
 static int parser_action_row287[] = {
        2,
@@ -4549,7 +4551,7 @@ static int parser_action_row291[] = {
 static int parser_action_row292[] = {
        2,
        -1, 1, 205,
-       61, 0, 433
+       61, 0, 434
 };
 static int parser_action_row293[] = {
        2,
@@ -4589,6 +4591,12 @@ static int parser_action_row299[] = {
        1, 0, 2
 };
 static int parser_action_row300[] = {
+       3,
+       -1, 1, 378,
+       0, 0, 1,
+       1, 0, 2
+};
+static int parser_action_row301[] = {
        22,
        -1, 1, 360,
        12, 0, 153,
@@ -4613,7 +4621,7 @@ static int parser_action_row300[] = {
        90, 0, 55,
        93, 0, 56
 };
-static int parser_action_row301[] = {
+static int parser_action_row302[] = {
        21,
        -1, 1, 360,
        12, 0, 153,
@@ -4637,13 +4645,13 @@ static int parser_action_row301[] = {
        90, 0, 55,
        93, 0, 56
 };
-static int parser_action_row302[] = {
+static int parser_action_row303[] = {
        3,
-       -1, 3, 301,
-       50, 0, 336,
-       83, 0, 337
+       -1, 3, 302,
+       50, 0, 337,
+       83, 0, 338
 };
-static int parser_action_row303[] = {
+static int parser_action_row304[] = {
        20,
        -1, 1, 360,
        12, 0, 153,
@@ -4666,19 +4674,19 @@ static int parser_action_row303[] = {
        90, 0, 55,
        93, 0, 56
 };
-static int parser_action_row304[] = {
-       3,
-       -1, 3, 303,
-       56, 0, 207,
-       66, 0, 443
-};
 static int parser_action_row305[] = {
        3,
        -1, 3, 304,
-       44, 0, 326,
-       85, 0, 444
+       56, 0, 207,
+       66, 0, 445
 };
 static int parser_action_row306[] = {
+       3,
+       -1, 3, 305,
+       44, 0, 327,
+       85, 0, 446
+};
+static int parser_action_row307[] = {
        20,
        -1, 1, 360,
        12, 0, 153,
@@ -4701,24 +4709,18 @@ static int parser_action_row306[] = {
        90, 0, 55,
        93, 0, 56
 };
-static int parser_action_row307[] = {
+static int parser_action_row308[] = {
        3,
        -1, 1, 378,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row308[] = {
+static int parser_action_row309[] = {
        4,
        -1, 1, 378,
        0, 0, 1,
        1, 0, 2,
-       27, 0, 447
-};
-static int parser_action_row309[] = {
-       3,
-       -1, 1, 378,
-       0, 0, 1,
-       1, 0, 2
+       27, 0, 449
 };
 static int parser_action_row310[] = {
        3,
@@ -4817,53 +4819,59 @@ static int parser_action_row325[] = {
        1, 0, 2
 };
 static int parser_action_row326[] = {
+       3,
+       -1, 1, 378,
+       0, 0, 1,
+       1, 0, 2
+};
+static int parser_action_row327[] = {
        1,
        -1, 1, 285
 };
-static int parser_action_row327[] = {
+static int parser_action_row328[] = {
        2,
        -1, 1, 342,
        54, 0, 242
 };
-static int parser_action_row328[] = {
+static int parser_action_row329[] = {
        1,
        -1, 1, 279
 };
-static int parser_action_row329[] = {
+static int parser_action_row330[] = {
        1,
        -1, 1, 281
 };
-static int parser_action_row330[] = {
+static int parser_action_row331[] = {
        1,
        -1, 1, 203
 };
-static int parser_action_row331[] = {
+static int parser_action_row332[] = {
        1,
        -1, 1, 184
 };
-static int parser_action_row332[] = {
+static int parser_action_row333[] = {
        1,
        -1, 1, 179
 };
-static int parser_action_row333[] = {
+static int parser_action_row334[] = {
        1,
        -1, 1, 242
 };
-static int parser_action_row334[] = {
+static int parser_action_row335[] = {
        1,
        -1, 1, 241
 };
-static int parser_action_row335[] = {
+static int parser_action_row336[] = {
        2,
-       -1, 3, 334,
-       27, 0, 466
+       -1, 3, 335,
+       27, 0, 468
 };
-static int parser_action_row336[] = {
+static int parser_action_row337[] = {
        32,
        -1, 1, 360,
        0, 0, 1,
        1, 0, 2,
-       9, 0, 467,
+       9, 0, 469,
        12, 0, 27,
        15, 0, 29,
        18, 0, 30,
@@ -4893,170 +4901,170 @@ static int parser_action_row336[] = {
        90, 0, 55,
        93, 0, 56
 };
-static int parser_action_row337[] = {
+static int parser_action_row338[] = {
        2,
-       -1, 3, 336,
-       83, 0, 470
+       -1, 3, 337,
+       83, 0, 472
 };
-static int parser_action_row338[] = {
+static int parser_action_row339[] = {
        3,
        -1, 1, 555,
-       56, 0, 471,
-       82, 0, 472
+       56, 0, 473,
+       82, 0, 474
 };
-static int parser_action_row339[] = {
+static int parser_action_row340[] = {
        2,
-       -1, 3, 338,
-       66, 0, 475
+       -1, 3, 339,
+       66, 0, 477
 };
-static int parser_action_row340[] = {
+static int parser_action_row341[] = {
        1,
        -1, 1, 339
 };
-static int parser_action_row341[] = {
+static int parser_action_row342[] = {
        1,
        -1, 1, 337
 };
-static int parser_action_row342[] = {
+static int parser_action_row343[] = {
        1,
        -1, 1, 338
 };
-static int parser_action_row343[] = {
+static int parser_action_row344[] = {
        3,
        -1, 1, 378,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row344[] = {
+static int parser_action_row345[] = {
        1,
        -1, 1, 336
 };
-static int parser_action_row345[] = {
+static int parser_action_row346[] = {
        1,
        -1, 1, 313
 };
-static int parser_action_row346[] = {
+static int parser_action_row347[] = {
        3,
        -1, 1, 316,
-       54, 0, 477,
+       54, 0, 479,
        82, 0, 183
 };
-static int parser_action_row347[] = {
+static int parser_action_row348[] = {
        2,
-       -1, 3, 346,
-       83, 0, 479
+       -1, 3, 347,
+       83, 0, 481
 };
-static int parser_action_row348[] = {
+static int parser_action_row349[] = {
        3,
        -1, 1, 316,
-       56, 0, 480,
+       56, 0, 482,
        82, 0, 183
 };
-static int parser_action_row349[] = {
+static int parser_action_row350[] = {
        2,
-       -1, 3, 348,
-       59, 0, 482
+       -1, 3, 349,
+       59, 0, 484
 };
-static int parser_action_row350[] = {
+static int parser_action_row351[] = {
        3,
        -1, 1, 378,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row351[] = {
+static int parser_action_row352[] = {
        3,
        -1, 1, 378,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row352[] = {
+static int parser_action_row353[] = {
        2,
-       -1, 3, 351,
-       57, 0, 485
+       -1, 3, 352,
+       57, 0, 487
 };
-static int parser_action_row353[] = {
+static int parser_action_row354[] = {
        1,
        -1, 1, 370
 };
-static int parser_action_row354[] = {
+static int parser_action_row355[] = {
        1,
        -1, 1, 369
 };
-static int parser_action_row355[] = {
+static int parser_action_row356[] = {
        1,
        -1, 1, 94
 };
-static int parser_action_row356[] = {
+static int parser_action_row357[] = {
        1,
        -1, 1, 93
 };
-static int parser_action_row357[] = {
+static int parser_action_row358[] = {
        1,
        -1, 1, 95
 };
-static int parser_action_row358[] = {
+static int parser_action_row359[] = {
        3,
        -1, 1, 378,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row359[] = {
+static int parser_action_row360[] = {
        1,
        -1, 1, 44
 };
-static int parser_action_row360[] = {
+static int parser_action_row361[] = {
        2,
-       -1, 3, 359,
-       5, 0, 487
+       -1, 3, 360,
+       5, 0, 489
 };
-static int parser_action_row361[] = {
+static int parser_action_row362[] = {
        1,
        -1, 1, 46
 };
-static int parser_action_row362[] = {
+static int parser_action_row363[] = {
        1,
        -1, 1, 47
 };
-static int parser_action_row363[] = {
-       17,
-       -1, 3, 362,
-       56, 0, 488,
-       67, 0, 489,
-       68, 0, 490,
-       69, 0, 491,
-       70, 0, 492,
-       71, 0, 493,
-       72, 0, 494,
-       73, 0, 495,
-       74, 0, 496,
-       75, 0, 497,
-       76, 0, 498,
-       77, 0, 499,
-       78, 0, 500,
-       79, 0, 501,
-       80, 0, 502,
-       84, 0, 503
-};
 static int parser_action_row364[] = {
-       2,
+       17,
        -1, 3, 363,
-       5, 0, 505
+       56, 0, 490,
+       67, 0, 491,
+       68, 0, 492,
+       69, 0, 493,
+       70, 0, 494,
+       71, 0, 495,
+       72, 0, 496,
+       73, 0, 497,
+       74, 0, 498,
+       75, 0, 499,
+       76, 0, 500,
+       77, 0, 501,
+       78, 0, 502,
+       79, 0, 503,
+       80, 0, 504,
+       84, 0, 505
 };
 static int parser_action_row365[] = {
+       2,
+       -1, 3, 364,
+       5, 0, 507
+};
+static int parser_action_row366[] = {
        3,
        -1, 1, 378,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row366[] = {
+static int parser_action_row367[] = {
        1,
        -1, 1, 171
 };
-static int parser_action_row367[] = {
+static int parser_action_row368[] = {
        1,
        -1, 1, 834
 };
-static int parser_action_row368[] = {
+static int parser_action_row369[] = {
        31,
        -1, 1, 168,
        12, 0, 27,
@@ -5090,7 +5098,7 @@ static int parser_action_row368[] = {
        90, 0, 55,
        93, 0, 56
 };
-static int parser_action_row369[] = {
+static int parser_action_row370[] = {
        22,
        -1, 1, 360,
        12, 0, 153,
@@ -5115,15 +5123,15 @@ static int parser_action_row369[] = {
        90, 0, 55,
        93, 0, 56
 };
-static int parser_action_row370[] = {
+static int parser_action_row371[] = {
        5,
        -1, 1, 360,
-       12, 0, 507,
-       49, 0, 508,
+       12, 0, 509,
+       49, 0, 510,
        83, 0, 49,
        84, 0, 50
 };
-static int parser_action_row371[] = {
+static int parser_action_row372[] = {
        22,
        -1, 1, 360,
        12, 0, 153,
@@ -5148,15 +5156,15 @@ static int parser_action_row371[] = {
        90, 0, 55,
        93, 0, 56
 };
-static int parser_action_row372[] = {
+static int parser_action_row373[] = {
        1,
        -1, 1, 219
 };
-static int parser_action_row373[] = {
+static int parser_action_row374[] = {
        1,
        -1, 1, 220
 };
-static int parser_action_row374[] = {
+static int parser_action_row375[] = {
        22,
        -1, 1, 360,
        12, 0, 153,
@@ -5181,7 +5189,7 @@ static int parser_action_row374[] = {
        90, 0, 55,
        93, 0, 56
 };
-static int parser_action_row375[] = {
+static int parser_action_row376[] = {
        24,
        -1, 1, 360,
        12, 0, 153,
@@ -5208,34 +5216,34 @@ static int parser_action_row375[] = {
        92, 1, 310,
        93, 0, 56
 };
-static int parser_action_row376[] = {
+static int parser_action_row377[] = {
        1,
        -1, 1, 304
 };
-static int parser_action_row377[] = {
+static int parser_action_row378[] = {
        1,
        -1, 1, 836
 };
-static int parser_action_row378[] = {
+static int parser_action_row379[] = {
        2,
        -1, 1, 316,
        82, 0, 183
 };
-static int parser_action_row379[] = {
+static int parser_action_row380[] = {
        3,
        -1, 1, 378,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row380[] = {
+static int parser_action_row381[] = {
        1,
        -1, 1, 282
 };
-static int parser_action_row381[] = {
+static int parser_action_row382[] = {
        1,
        -1, 1, 193
 };
-static int parser_action_row382[] = {
+static int parser_action_row383[] = {
        22,
        -1, 1, 360,
        12, 0, 153,
@@ -5260,7 +5268,7 @@ static int parser_action_row382[] = {
        90, 0, 55,
        93, 0, 56
 };
-static int parser_action_row383[] = {
+static int parser_action_row384[] = {
        22,
        -1, 1, 360,
        12, 0, 153,
@@ -5285,7 +5293,7 @@ static int parser_action_row383[] = {
        90, 0, 55,
        93, 0, 56
 };
-static int parser_action_row384[] = {
+static int parser_action_row385[] = {
        22,
        -1, 1, 360,
        12, 0, 153,
@@ -5310,7 +5318,7 @@ static int parser_action_row384[] = {
        90, 0, 55,
        93, 0, 56
 };
-static int parser_action_row385[] = {
+static int parser_action_row386[] = {
        22,
        -1, 1, 360,
        12, 0, 153,
@@ -5335,21 +5343,21 @@ static int parser_action_row385[] = {
        90, 0, 55,
        93, 0, 56
 };
-static int parser_action_row386[] = {
+static int parser_action_row387[] = {
        3,
        -1, 1, 378,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row387[] = {
+static int parser_action_row388[] = {
        1,
        -1, 1, 199
 };
-static int parser_action_row388[] = {
+static int parser_action_row389[] = {
        1,
        -1, 1, 201
 };
-static int parser_action_row389[] = {
+static int parser_action_row390[] = {
        23,
        -1, 1, 346,
        12, 0, 108,
@@ -5363,7 +5371,7 @@ static int parser_action_row389[] = {
        47, 0, 115,
        48, 0, 116,
        51, 0, 117,
-       54, 0, 385,
+       54, 0, 386,
        68, 0, 119,
        83, 0, 49,
        84, 0, 50,
@@ -5375,55 +5383,55 @@ static int parser_action_row389[] = {
        90, 0, 55,
        93, 0, 124
 };
-static int parser_action_row390[] = {
+static int parser_action_row391[] = {
        1,
        -1, 1, 363
 };
-static int parser_action_row391[] = {
+static int parser_action_row392[] = {
        1,
        -1, 1, 14
 };
-static int parser_action_row392[] = {
+static int parser_action_row393[] = {
        7,
-       -1, 3, 391,
-       5, 0, 358,
-       6, 0, 359,
-       7, 0, 360,
-       8, 0, 361,
-       10, 0, 362,
-       20, 0, 363
+       -1, 3, 392,
+       5, 0, 359,
+       6, 0, 360,
+       7, 0, 361,
+       8, 0, 362,
+       10, 0, 363,
+       20, 0, 364
 };
-static int parser_action_row393[] = {
+static int parser_action_row394[] = {
        1,
        -1, 1, 15
 };
-static int parser_action_row394[] = {
+static int parser_action_row395[] = {
        2,
-       -1, 3, 393,
-       84, 0, 524
+       -1, 3, 394,
+       84, 0, 526
 };
-static int parser_action_row395[] = {
+static int parser_action_row396[] = {
        7,
-       -1, 3, 394,
+       -1, 3, 395,
        0, 0, 83,
        1, 0, 84,
-       4, 0, 339,
-       16, 0, 340,
-       17, 0, 341,
-       84, 0, 343
+       4, 0, 340,
+       16, 0, 341,
+       17, 0, 342,
+       84, 0, 344
 };
-static int parser_action_row396[] = {
+static int parser_action_row397[] = {
        3,
-       -1, 3, 395,
+       -1, 3, 396,
        0, 0, 83,
        1, 0, 84
 };
-static int parser_action_row397[] = {
+static int parser_action_row398[] = {
        2,
        -1, 1, 354,
        60, 0, 193
 };
-static int parser_action_row398[] = {
+static int parser_action_row399[] = {
        23,
        -1, 1, 360,
        12, 0, 153,
@@ -5437,7 +5445,7 @@ static int parser_action_row398[] = {
        48, 0, 45,
        51, 0, 158,
        54, 0, 47,
-       55, 0, 531,
+       55, 0, 533,
        56, 0, 48,
        68, 0, 159,
        83, 0, 49,
@@ -5449,45 +5457,45 @@ static int parser_action_row398[] = {
        90, 0, 55,
        93, 0, 56
 };
-static int parser_action_row399[] = {
+static int parser_action_row400[] = {
        3,
        -1, 1, 378,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row400[] = {
+static int parser_action_row401[] = {
        1,
        -1, 1, 504
 };
-static int parser_action_row401[] = {
+static int parser_action_row402[] = {
        3,
        -1, 1, 342,
        54, 0, 242,
-       66, 0, 534
+       66, 0, 536
 };
-static int parser_action_row402[] = {
+static int parser_action_row403[] = {
        1,
        -1, 1, 525
 };
-static int parser_action_row403[] = {
+static int parser_action_row404[] = {
        3,
-       -1, 3, 402,
-       50, 0, 336,
-       83, 0, 337
+       -1, 3, 403,
+       50, 0, 337,
+       83, 0, 338
 };
-static int parser_action_row404[] = {
+static int parser_action_row405[] = {
        3,
        -1, 1, 529,
        56, 1, 531,
        66, 1, 531
 };
-static int parser_action_row405[] = {
+static int parser_action_row406[] = {
        3,
        -1, 1, 378,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row406[] = {
+static int parser_action_row407[] = {
        6,
        -1, 1, 345,
        56, 1, 341,
@@ -5496,26 +5504,26 @@ static int parser_action_row406[] = {
        63, 1, 341,
        66, 1, 341
 };
-static int parser_action_row407[] = {
+static int parser_action_row408[] = {
        3,
        -1, 1, 378,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row408[] = {
+static int parser_action_row409[] = {
        2,
-       -1, 3, 407,
-       55, 0, 539
+       -1, 3, 408,
+       55, 0, 541
 };
-static int parser_action_row409[] = {
+static int parser_action_row410[] = {
        1,
        -1, 1, 524
 };
-static int parser_action_row410[] = {
+static int parser_action_row411[] = {
        1,
        -1, 1, 534
 };
-static int parser_action_row411[] = {
+static int parser_action_row412[] = {
        19,
        -1, 1, 360,
        12, 0, 108,
@@ -5537,13 +5545,13 @@ static int parser_action_row411[] = {
        90, 0, 55,
        93, 0, 124
 };
-static int parser_action_row412[] = {
+static int parser_action_row413[] = {
        3,
        -1, 1, 378,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row413[] = {
+static int parser_action_row414[] = {
        19,
        -1, 1, 360,
        12, 0, 108,
@@ -5565,7 +5573,7 @@ static int parser_action_row413[] = {
        90, 0, 55,
        93, 0, 124
 };
-static int parser_action_row414[] = {
+static int parser_action_row415[] = {
        19,
        -1, 1, 360,
        12, 0, 108,
@@ -5587,7 +5595,7 @@ static int parser_action_row414[] = {
        90, 0, 55,
        93, 0, 124
 };
-static int parser_action_row415[] = {
+static int parser_action_row416[] = {
        18,
        -1, 1, 360,
        12, 0, 108,
@@ -5608,7 +5616,7 @@ static int parser_action_row415[] = {
        90, 0, 55,
        93, 0, 124
 };
-static int parser_action_row416[] = {
+static int parser_action_row417[] = {
        18,
        -1, 1, 360,
        12, 0, 108,
@@ -5629,13 +5637,13 @@ static int parser_action_row416[] = {
        90, 0, 55,
        93, 0, 124
 };
-static int parser_action_row417[] = {
+static int parser_action_row418[] = {
        3,
-       -1, 3, 416,
-       50, 0, 346,
-       83, 0, 347
+       -1, 3, 417,
+       50, 0, 347,
+       83, 0, 348
 };
-static int parser_action_row418[] = {
+static int parser_action_row419[] = {
        18,
        -1, 1, 360,
        12, 0, 108,
@@ -5656,7 +5664,7 @@ static int parser_action_row418[] = {
        90, 0, 55,
        93, 0, 124
 };
-static int parser_action_row419[] = {
+static int parser_action_row420[] = {
        18,
        -1, 1, 360,
        12, 0, 108,
@@ -5677,7 +5685,7 @@ static int parser_action_row419[] = {
        90, 0, 55,
        93, 0, 124
 };
-static int parser_action_row420[] = {
+static int parser_action_row421[] = {
        18,
        -1, 1, 360,
        12, 0, 108,
@@ -5698,7 +5706,7 @@ static int parser_action_row420[] = {
        90, 0, 55,
        93, 0, 124
 };
-static int parser_action_row421[] = {
+static int parser_action_row422[] = {
        18,
        -1, 1, 360,
        12, 0, 108,
@@ -5719,7 +5727,7 @@ static int parser_action_row421[] = {
        90, 0, 55,
        93, 0, 124
 };
-static int parser_action_row422[] = {
+static int parser_action_row423[] = {
        18,
        -1, 1, 360,
        12, 0, 108,
@@ -5740,7 +5748,7 @@ static int parser_action_row422[] = {
        90, 0, 55,
        93, 0, 124
 };
-static int parser_action_row423[] = {
+static int parser_action_row424[] = {
        18,
        -1, 1, 360,
        12, 0, 108,
@@ -5761,7 +5769,7 @@ static int parser_action_row423[] = {
        90, 0, 55,
        93, 0, 124
 };
-static int parser_action_row424[] = {
+static int parser_action_row425[] = {
        18,
        -1, 1, 360,
        12, 0, 108,
@@ -5782,7 +5790,7 @@ static int parser_action_row424[] = {
        90, 0, 55,
        93, 0, 124
 };
-static int parser_action_row425[] = {
+static int parser_action_row426[] = {
        18,
        -1, 1, 360,
        12, 0, 108,
@@ -5803,7 +5811,7 @@ static int parser_action_row425[] = {
        90, 0, 55,
        93, 0, 124
 };
-static int parser_action_row426[] = {
+static int parser_action_row427[] = {
        18,
        -1, 1, 360,
        12, 0, 108,
@@ -5824,7 +5832,7 @@ static int parser_action_row426[] = {
        90, 0, 55,
        93, 0, 124
 };
-static int parser_action_row427[] = {
+static int parser_action_row428[] = {
        18,
        -1, 1, 360,
        12, 0, 108,
@@ -5845,7 +5853,7 @@ static int parser_action_row427[] = {
        90, 0, 55,
        93, 0, 124
 };
-static int parser_action_row428[] = {
+static int parser_action_row429[] = {
        18,
        -1, 1, 360,
        12, 0, 108,
@@ -5866,7 +5874,7 @@ static int parser_action_row428[] = {
        90, 0, 55,
        93, 0, 124
 };
-static int parser_action_row429[] = {
+static int parser_action_row430[] = {
        18,
        -1, 1, 360,
        12, 0, 108,
@@ -5887,18 +5895,18 @@ static int parser_action_row429[] = {
        90, 0, 55,
        93, 0, 124
 };
-static int parser_action_row430[] = {
+static int parser_action_row431[] = {
        5,
        -1, 1, 360,
-       12, 0, 559,
-       49, 0, 560,
+       12, 0, 561,
+       49, 0, 562,
        83, 0, 49,
        84, 0, 50
 };
-static int parser_action_row431[] = {
+static int parser_action_row432[] = {
        30,
        -1, 1, 360,
-       9, 0, 563,
+       9, 0, 565,
        12, 0, 27,
        15, 0, 29,
        18, 0, 30,
@@ -5928,87 +5936,91 @@ static int parser_action_row431[] = {
        90, 0, 55,
        93, 0, 56
 };
-static int parser_action_row432[] = {
+static int parser_action_row433[] = {
        3,
-       -1, 3, 431,
+       -1, 3, 432,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row433[] = {
+static int parser_action_row434[] = {
        3,
-       -1, 3, 432,
-       50, 0, 346,
-       83, 0, 347
+       -1, 3, 433,
+       50, 0, 347,
+       83, 0, 348
 };
-static int parser_action_row434[] = {
+static int parser_action_row435[] = {
        3,
        -1, 1, 378,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row435[] = {
-       2,
-       -1, 1, 206,
-       61, 0, 567
-};
 static int parser_action_row436[] = {
        2,
-       -1, 3, 435,
-       26, 0, 568
+       -1, 1, 206,
+       61, 0, 569
 };
 static int parser_action_row437[] = {
        2,
        -1, 3, 436,
-       15, 0, 569
+       26, 0, 570
 };
 static int parser_action_row438[] = {
        2,
        -1, 3, 437,
-       84, 0, 297
+       15, 0, 571
 };
 static int parser_action_row439[] = {
-       3,
+       2,
        -1, 3, 438,
-       31, 0, 571,
-       58, 0, 572
+       84, 0, 297
 };
 static int parser_action_row440[] = {
        3,
+       -1, 3, 439,
+       31, 0, 573,
+       58, 0, 574
+};
+static int parser_action_row441[] = {
+       1,
+       -1, 1, 145
+};
+static int parser_action_row442[] = {
+       3,
        -1, 1, 378,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row441[] = {
+static int parser_action_row443[] = {
        1,
        -1, 1, 252
 };
-static int parser_action_row442[] = {
+static int parser_action_row444[] = {
        3,
        -1, 1, 342,
        54, 0, 242,
-       66, 0, 475
+       66, 0, 477
 };
-static int parser_action_row443[] = {
+static int parser_action_row445[] = {
        1,
        -1, 1, 273
 };
-static int parser_action_row444[] = {
+static int parser_action_row446[] = {
        3,
        -1, 1, 378,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row445[] = {
+static int parser_action_row447[] = {
        3,
        -1, 1, 277,
        56, 1, 279,
        66, 1, 279
 };
-static int parser_action_row446[] = {
+static int parser_action_row448[] = {
        1,
        -1, 1, 272
 };
-static int parser_action_row447[] = {
+static int parser_action_row449[] = {
        21,
        -1, 1, 360,
        12, 0, 153,
@@ -6032,13 +6044,13 @@ static int parser_action_row447[] = {
        90, 0, 55,
        93, 0, 56
 };
-static int parser_action_row448[] = {
+static int parser_action_row450[] = {
        3,
        -1, 1, 378,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row449[] = {
+static int parser_action_row451[] = {
        21,
        -1, 1, 360,
        12, 0, 153,
@@ -6062,7 +6074,7 @@ static int parser_action_row449[] = {
        90, 0, 55,
        93, 0, 56
 };
-static int parser_action_row450[] = {
+static int parser_action_row452[] = {
        21,
        -1, 1, 360,
        12, 0, 153,
@@ -6086,7 +6098,7 @@ static int parser_action_row450[] = {
        90, 0, 55,
        93, 0, 56
 };
-static int parser_action_row451[] = {
+static int parser_action_row453[] = {
        20,
        -1, 1, 360,
        12, 0, 153,
@@ -6109,7 +6121,7 @@ static int parser_action_row451[] = {
        90, 0, 55,
        93, 0, 56
 };
-static int parser_action_row452[] = {
+static int parser_action_row454[] = {
        20,
        -1, 1, 360,
        12, 0, 153,
@@ -6132,13 +6144,13 @@ static int parser_action_row452[] = {
        90, 0, 55,
        93, 0, 56
 };
-static int parser_action_row453[] = {
+static int parser_action_row455[] = {
        3,
-       -1, 3, 452,
-       50, 0, 346,
-       83, 0, 347
+       -1, 3, 454,
+       50, 0, 347,
+       83, 0, 348
 };
-static int parser_action_row454[] = {
+static int parser_action_row456[] = {
        20,
        -1, 1, 360,
        12, 0, 153,
@@ -6161,7 +6173,7 @@ static int parser_action_row454[] = {
        90, 0, 55,
        93, 0, 56
 };
-static int parser_action_row455[] = {
+static int parser_action_row457[] = {
        20,
        -1, 1, 360,
        12, 0, 153,
@@ -6184,7 +6196,7 @@ static int parser_action_row455[] = {
        90, 0, 55,
        93, 0, 56
 };
-static int parser_action_row456[] = {
+static int parser_action_row458[] = {
        20,
        -1, 1, 360,
        12, 0, 153,
@@ -6207,7 +6219,7 @@ static int parser_action_row456[] = {
        90, 0, 55,
        93, 0, 56
 };
-static int parser_action_row457[] = {
+static int parser_action_row459[] = {
        20,
        -1, 1, 360,
        12, 0, 153,
@@ -6230,7 +6242,7 @@ static int parser_action_row457[] = {
        90, 0, 55,
        93, 0, 56
 };
-static int parser_action_row458[] = {
+static int parser_action_row460[] = {
        20,
        -1, 1, 360,
        12, 0, 153,
@@ -6253,7 +6265,7 @@ static int parser_action_row458[] = {
        90, 0, 55,
        93, 0, 56
 };
-static int parser_action_row459[] = {
+static int parser_action_row461[] = {
        20,
        -1, 1, 360,
        12, 0, 153,
@@ -6276,7 +6288,7 @@ static int parser_action_row459[] = {
        90, 0, 55,
        93, 0, 56
 };
-static int parser_action_row460[] = {
+static int parser_action_row462[] = {
        20,
        -1, 1, 360,
        12, 0, 153,
@@ -6299,7 +6311,7 @@ static int parser_action_row460[] = {
        90, 0, 55,
        93, 0, 56
 };
-static int parser_action_row461[] = {
+static int parser_action_row463[] = {
        20,
        -1, 1, 360,
        12, 0, 153,
@@ -6322,7 +6334,7 @@ static int parser_action_row461[] = {
        90, 0, 55,
        93, 0, 56
 };
-static int parser_action_row462[] = {
+static int parser_action_row464[] = {
        20,
        -1, 1, 360,
        12, 0, 153,
@@ -6345,7 +6357,7 @@ static int parser_action_row462[] = {
        90, 0, 55,
        93, 0, 56
 };
-static int parser_action_row463[] = {
+static int parser_action_row465[] = {
        20,
        -1, 1, 360,
        12, 0, 153,
@@ -6368,7 +6380,7 @@ static int parser_action_row463[] = {
        90, 0, 55,
        93, 0, 56
 };
-static int parser_action_row464[] = {
+static int parser_action_row466[] = {
        20,
        -1, 1, 360,
        12, 0, 153,
@@ -6391,7 +6403,7 @@ static int parser_action_row464[] = {
        90, 0, 55,
        93, 0, 56
 };
-static int parser_action_row465[] = {
+static int parser_action_row467[] = {
        20,
        -1, 1, 360,
        12, 0, 153,
@@ -6414,20 +6426,20 @@ static int parser_action_row465[] = {
        90, 0, 55,
        93, 0, 56
 };
-static int parser_action_row466[] = {
+static int parser_action_row468[] = {
        5,
        -1, 1, 360,
-       12, 0, 595,
-       49, 0, 508,
+       12, 0, 597,
+       49, 0, 510,
        83, 0, 49,
        84, 0, 50
 };
-static int parser_action_row467[] = {
+static int parser_action_row469[] = {
        32,
        -1, 1, 360,
        0, 0, 1,
        1, 0, 2,
-       9, 0, 467,
+       9, 0, 469,
        12, 0, 27,
        15, 0, 29,
        18, 0, 30,
@@ -6457,18 +6469,18 @@ static int parser_action_row467[] = {
        90, 0, 55,
        93, 0, 56
 };
-static int parser_action_row468[] = {
+static int parser_action_row470[] = {
        1,
        -1, 1, 163
 };
-static int parser_action_row469[] = {
+static int parser_action_row471[] = {
        1,
        -1, 1, 238
 };
-static int parser_action_row470[] = {
+static int parser_action_row472[] = {
        30,
        -1, 1, 360,
-       9, 0, 599,
+       9, 0, 601,
        12, 0, 27,
        15, 0, 29,
        18, 0, 30,
@@ -6498,76 +6510,76 @@ static int parser_action_row470[] = {
        90, 0, 55,
        93, 0, 56
 };
-static int parser_action_row471[] = {
+static int parser_action_row473[] = {
        3,
        -1, 1, 555,
-       56, 0, 601,
-       82, 0, 472
+       56, 0, 603,
+       82, 0, 474
 };
-static int parser_action_row472[] = {
+static int parser_action_row474[] = {
        3,
        -1, 1, 378,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row473[] = {
+static int parser_action_row475[] = {
        6,
-       -1, 3, 472,
-       4, 0, 339,
-       16, 0, 340,
-       17, 0, 341,
-       54, 0, 604,
-       84, 0, 343
+       -1, 3, 474,
+       4, 0, 340,
+       16, 0, 341,
+       17, 0, 342,
+       54, 0, 606,
+       84, 0, 344
 };
-static int parser_action_row474[] = {
+static int parser_action_row476[] = {
        1,
        -1, 1, 554
 };
-static int parser_action_row475[] = {
+static int parser_action_row477[] = {
        1,
        -1, 1, 450
 };
-static int parser_action_row476[] = {
+static int parser_action_row478[] = {
        3,
        -1, 1, 378,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row477[] = {
+static int parser_action_row479[] = {
        5,
-       -1, 3, 476,
-       4, 0, 339,
-       16, 0, 340,
-       17, 0, 341,
-       84, 0, 343
+       -1, 3, 478,
+       4, 0, 340,
+       16, 0, 341,
+       17, 0, 342,
+       84, 0, 344
 };
-static int parser_action_row478[] = {
+static int parser_action_row480[] = {
        3,
        -1, 1, 378,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row479[] = {
+static int parser_action_row481[] = {
        1,
        -1, 1, 317
 };
-static int parser_action_row480[] = {
+static int parser_action_row482[] = {
        3,
        -1, 1, 316,
-       56, 0, 610,
+       56, 0, 612,
        82, 0, 183
 };
-static int parser_action_row481[] = {
+static int parser_action_row483[] = {
        3,
        -1, 1, 378,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row482[] = {
+static int parser_action_row484[] = {
        1,
        -1, 1, 151
 };
-static int parser_action_row483[] = {
+static int parser_action_row485[] = {
        22,
        -1, 1, 360,
        12, 0, 153,
@@ -6592,117 +6604,117 @@ static int parser_action_row483[] = {
        90, 0, 55,
        93, 0, 56
 };
-static int parser_action_row484[] = {
+static int parser_action_row486[] = {
        2,
-       -1, 3, 483,
-       55, 0, 614
+       -1, 3, 485,
+       55, 0, 616
 };
-static int parser_action_row485[] = {
+static int parser_action_row487[] = {
        3,
        -1, 1, 348,
-       58, 0, 615,
-       65, 0, 616
+       58, 0, 617,
+       65, 0, 618
 };
-static int parser_action_row486[] = {
+static int parser_action_row488[] = {
        1,
        -1, 1, 347
 };
-static int parser_action_row487[] = {
+static int parser_action_row489[] = {
        4,
-       -1, 3, 486,
-       9, 0, 619,
+       -1, 3, 488,
+       9, 0, 621,
        60, 0, 238,
        84, 0, 239
 };
-static int parser_action_row488[] = {
+static int parser_action_row490[] = {
        1,
        -1, 1, 45
 };
-static int parser_action_row489[] = {
+static int parser_action_row491[] = {
        2,
-       -1, 3, 488,
-       57, 0, 621
+       -1, 3, 490,
+       57, 0, 623
 };
-static int parser_action_row490[] = {
+static int parser_action_row492[] = {
        1,
        -1, 1, 97
 };
-static int parser_action_row491[] = {
+static int parser_action_row493[] = {
        1,
        -1, 1, 98
 };
-static int parser_action_row492[] = {
+static int parser_action_row494[] = {
        1,
        -1, 1, 99
 };
-static int parser_action_row493[] = {
+static int parser_action_row495[] = {
        1,
        -1, 1, 100
 };
-static int parser_action_row494[] = {
+static int parser_action_row496[] = {
        1,
        -1, 1, 101
 };
-static int parser_action_row495[] = {
+static int parser_action_row497[] = {
        1,
        -1, 1, 102
 };
-static int parser_action_row496[] = {
+static int parser_action_row498[] = {
        1,
        -1, 1, 103
 };
-static int parser_action_row497[] = {
+static int parser_action_row499[] = {
        1,
        -1, 1, 106
 };
-static int parser_action_row498[] = {
+static int parser_action_row500[] = {
        1,
        -1, 1, 104
 };
-static int parser_action_row499[] = {
+static int parser_action_row501[] = {
        1,
        -1, 1, 108
 };
-static int parser_action_row500[] = {
+static int parser_action_row502[] = {
        1,
        -1, 1, 107
 };
-static int parser_action_row501[] = {
+static int parser_action_row503[] = {
        1,
        -1, 1, 105
 };
-static int parser_action_row502[] = {
+static int parser_action_row504[] = {
        1,
        -1, 1, 109
 };
-static int parser_action_row503[] = {
+static int parser_action_row505[] = {
        1,
        -1, 1, 111
 };
-static int parser_action_row504[] = {
+static int parser_action_row506[] = {
        2,
        -1, 1, 96,
-       61, 0, 622
+       61, 0, 624
 };
-static int parser_action_row505[] = {
+static int parser_action_row507[] = {
        5,
        -1, 1, 378,
        0, 0, 1,
        1, 0, 2,
-       54, 0, 623,
-       59, 0, 624
+       54, 0, 625,
+       59, 0, 626
 };
-static int parser_action_row506[] = {
+static int parser_action_row508[] = {
        1,
        -1, 1, 48
 };
-static int parser_action_row507[] = {
+static int parser_action_row509[] = {
        3,
-       -1, 3, 506,
-       83, 0, 628,
-       84, 0, 629
+       -1, 3, 508,
+       83, 0, 630,
+       84, 0, 631
 };
-static int parser_action_row508[] = {
+static int parser_action_row510[] = {
        25,
        -1, 1, 346,
        12, 0, 108,
@@ -6730,18 +6742,18 @@ static int parser_action_row508[] = {
        90, 0, 55,
        93, 0, 124
 };
-static int parser_action_row509[] = {
+static int parser_action_row511[] = {
        3,
        -1, 1, 378,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row510[] = {
+static int parser_action_row512[] = {
        2,
-       -1, 3, 509,
-       85, 0, 636
+       -1, 3, 511,
+       85, 0, 638
 };
-static int parser_action_row511[] = {
+static int parser_action_row513[] = {
        28,
        -1, 1, 346,
        12, 0, 108,
@@ -6772,58 +6784,58 @@ static int parser_action_row511[] = {
        90, 0, 55,
        93, 0, 124
 };
-static int parser_action_row512[] = {
+static int parser_action_row514[] = {
        3,
        -1, 1, 357,
-       12, 0, 639,
+       12, 0, 641,
        84, 0, 223
 };
-static int parser_action_row513[] = {
+static int parser_action_row515[] = {
        4,
        -1, 1, 359,
-       12, 0, 640,
+       12, 0, 642,
        83, 0, 49,
        84, 0, 225
 };
-static int parser_action_row514[] = {
+static int parser_action_row516[] = {
        1,
        -1, 1, 213
 };
-static int parser_action_row515[] = {
+static int parser_action_row517[] = {
        1,
        -1, 1, 218
 };
-static int parser_action_row516[] = {
+static int parser_action_row518[] = {
        3,
        -1, 1, 378,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row517[] = {
+static int parser_action_row519[] = {
        1,
        -1, 1, 305
 };
-static int parser_action_row518[] = {
+static int parser_action_row520[] = {
        1,
        -1, 1, 306
 };
-static int parser_action_row519[] = {
+static int parser_action_row521[] = {
        1,
        -1, 1, 210
 };
-static int parser_action_row520[] = {
+static int parser_action_row522[] = {
        1,
        -1, 1, 215
 };
-static int parser_action_row521[] = {
+static int parser_action_row523[] = {
        1,
        -1, 1, 212
 };
-static int parser_action_row522[] = {
+static int parser_action_row524[] = {
        1,
        -1, 1, 217
 };
-static int parser_action_row523[] = {
+static int parser_action_row525[] = {
        23,
        -1, 1, 360,
        12, 0, 153,
@@ -6837,7 +6849,7 @@ static int parser_action_row523[] = {
        48, 0, 45,
        51, 0, 158,
        54, 0, 47,
-       55, 0, 643,
+       55, 0, 645,
        56, 0, 48,
        68, 0, 159,
        83, 0, 49,
@@ -6849,86 +6861,86 @@ static int parser_action_row523[] = {
        90, 0, 55,
        93, 0, 56
 };
-static int parser_action_row524[] = {
+static int parser_action_row526[] = {
        1,
        -1, 1, 200
 };
-static int parser_action_row525[] = {
+static int parser_action_row527[] = {
        2,
        -1, 1, 355,
        60, 0, 193
 };
-static int parser_action_row526[] = {
+static int parser_action_row528[] = {
        2,
-       -1, 3, 525,
-       84, 0, 645
+       -1, 3, 527,
+       84, 0, 647
 };
-static int parser_action_row527[] = {
+static int parser_action_row529[] = {
        2,
        -1, 1, 320,
-       58, 0, 646
+       58, 0, 648
 };
-static int parser_action_row528[] = {
+static int parser_action_row530[] = {
        1,
        -1, 1, 85
 };
-static int parser_action_row529[] = {
+static int parser_action_row531[] = {
        1,
        -1, 1, 319
 };
-static int parser_action_row530[] = {
+static int parser_action_row532[] = {
        3,
        -1, 1, 378,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row531[] = {
+static int parser_action_row533[] = {
        1,
        -1, 1, 16
 };
-static int parser_action_row532[] = {
+static int parser_action_row534[] = {
        1,
        -1, 1, 341
 };
-static int parser_action_row533[] = {
+static int parser_action_row535[] = {
        2,
-       -1, 3, 532,
-       55, 0, 653
+       -1, 3, 534,
+       55, 0, 655
 };
-static int parser_action_row534[] = {
+static int parser_action_row536[] = {
        2,
-       -1, 3, 533,
-       26, 0, 654
+       -1, 3, 535,
+       26, 0, 656
 };
-static int parser_action_row535[] = {
+static int parser_action_row537[] = {
        3,
        -1, 1, 378,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row536[] = {
+static int parser_action_row538[] = {
        1,
        -1, 1, 527
 };
-static int parser_action_row537[] = {
+static int parser_action_row539[] = {
        2,
-       -1, 3, 536,
-       66, 0, 534
+       -1, 3, 538,
+       66, 0, 536
 };
-static int parser_action_row538[] = {
+static int parser_action_row540[] = {
        5,
        -1, 1, 360,
-       12, 0, 559,
-       49, 0, 560,
+       12, 0, 561,
+       49, 0, 562,
        83, 0, 49,
        84, 0, 50
 };
-static int parser_action_row539[] = {
+static int parser_action_row541[] = {
        2,
        -1, 1, 348,
-       58, 0, 615
+       58, 0, 617
 };
-static int parser_action_row540[] = {
+static int parser_action_row542[] = {
        6,
        -1, 1, 343,
        56, 1, 340,
@@ -6937,11 +6949,11 @@ static int parser_action_row540[] = {
        63, 1, 340,
        66, 1, 340
 };
-static int parser_action_row541[] = {
+static int parser_action_row543[] = {
        1,
        -1, 1, 500
 };
-static int parser_action_row542[] = {
+static int parser_action_row544[] = {
        19,
        -1, 1, 360,
        12, 0, 108,
@@ -6963,127 +6975,127 @@ static int parser_action_row542[] = {
        90, 0, 55,
        93, 0, 124
 };
-static int parser_action_row543[] = {
+static int parser_action_row545[] = {
        1,
        -1, 1, 499
 };
-static int parser_action_row544[] = {
+static int parser_action_row546[] = {
        1,
        -1, 1, 502
 };
-static int parser_action_row545[] = {
+static int parser_action_row547[] = {
        3,
        -1, 1, 510,
        67, 0, 271,
        68, 0, 272
 };
-static int parser_action_row546[] = {
+static int parser_action_row548[] = {
        3,
        -1, 1, 513,
        67, 0, 271,
        68, 0, 272
 };
-static int parser_action_row547[] = {
+static int parser_action_row549[] = {
        1,
        -1, 1, 515
 };
-static int parser_action_row548[] = {
+static int parser_action_row550[] = {
        4,
        -1, 1, 517,
        69, 0, 280,
        70, 0, 281,
        71, 0, 282
 };
-static int parser_action_row549[] = {
+static int parser_action_row551[] = {
        4,
        -1, 1, 518,
        69, 0, 280,
        70, 0, 281,
        71, 0, 282
 };
-static int parser_action_row550[] = {
+static int parser_action_row552[] = {
        3,
        -1, 1, 506,
        67, 0, 271,
        68, 0, 272
 };
-static int parser_action_row551[] = {
+static int parser_action_row553[] = {
        3,
        -1, 1, 507,
        67, 0, 271,
        68, 0, 272
 };
-static int parser_action_row552[] = {
+static int parser_action_row554[] = {
        3,
        -1, 1, 508,
        67, 0, 271,
        68, 0, 272
 };
-static int parser_action_row553[] = {
+static int parser_action_row555[] = {
        3,
        -1, 1, 509,
        67, 0, 271,
        68, 0, 272
 };
-static int parser_action_row554[] = {
+static int parser_action_row556[] = {
        3,
        -1, 1, 511,
        67, 0, 271,
        68, 0, 272
 };
-static int parser_action_row555[] = {
+static int parser_action_row557[] = {
        3,
        -1, 1, 512,
        67, 0, 271,
        68, 0, 272
 };
-static int parser_action_row556[] = {
+static int parser_action_row558[] = {
        3,
        -1, 1, 514,
        67, 0, 271,
        68, 0, 272
 };
-static int parser_action_row557[] = {
+static int parser_action_row559[] = {
        1,
        -1, 1, 520
 };
-static int parser_action_row558[] = {
+static int parser_action_row560[] = {
        1,
        -1, 1, 521
 };
-static int parser_action_row559[] = {
+static int parser_action_row561[] = {
        1,
        -1, 1, 522
 };
-static int parser_action_row560[] = {
+static int parser_action_row562[] = {
        2,
        -1, 1, 342,
        54, 0, 242
 };
-static int parser_action_row561[] = {
+static int parser_action_row563[] = {
        3,
        -1, 1, 378,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row562[] = {
+static int parser_action_row564[] = {
        2,
-       -1, 3, 561,
-       85, 0, 660
+       -1, 3, 563,
+       85, 0, 662
 };
-static int parser_action_row563[] = {
+static int parser_action_row565[] = {
        2,
        -1, 1, 342,
        54, 0, 242
 };
-static int parser_action_row564[] = {
+static int parser_action_row566[] = {
        1,
        -1, 1, 169
 };
-static int parser_action_row565[] = {
+static int parser_action_row567[] = {
        30,
        -1, 1, 360,
-       9, 0, 662,
+       9, 0, 664,
        12, 0, 27,
        15, 0, 29,
        18, 0, 30,
@@ -7113,11 +7125,11 @@ static int parser_action_row565[] = {
        90, 0, 55,
        93, 0, 56
 };
-static int parser_action_row566[] = {
+static int parser_action_row568[] = {
        1,
        -1, 1, 159
 };
-static int parser_action_row567[] = {
+static int parser_action_row569[] = {
        22,
        -1, 1, 360,
        12, 0, 153,
@@ -7142,37 +7154,37 @@ static int parser_action_row567[] = {
        90, 0, 55,
        93, 0, 56
 };
-static int parser_action_row568[] = {
+static int parser_action_row570[] = {
        3,
        -1, 1, 378,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row569[] = {
+static int parser_action_row571[] = {
        33,
        -1, 1, 360,
        0, 0, 1,
        1, 0, 2,
-       9, 0, 665,
-       12, 0, 666,
-       15, 0, 667,
-       18, 0, 668,
-       25, 0, 669,
-       27, 0, 670,
-       28, 0, 671,
-       29, 0, 672,
-       30, 0, 673,
-       36, 0, 674,
-       37, 0, 675,
-       38, 0, 676,
-       39, 0, 677,
-       40, 0, 678,
+       9, 0, 667,
+       12, 0, 668,
+       15, 0, 669,
+       18, 0, 670,
+       25, 0, 671,
+       27, 0, 672,
+       28, 0, 673,
+       29, 0, 674,
+       30, 0, 675,
+       36, 0, 676,
+       37, 0, 677,
+       38, 0, 678,
+       39, 0, 679,
+       40, 0, 680,
        41, 0, 41,
        45, 0, 42,
        46, 0, 43,
        47, 0, 44,
        48, 0, 45,
-       53, 0, 679,
+       53, 0, 681,
        54, 0, 47,
        56, 0, 48,
        83, 0, 49,
@@ -7184,7 +7196,7 @@ static int parser_action_row569[] = {
        90, 0, 55,
        93, 0, 56
 };
-static int parser_action_row570[] = {
+static int parser_action_row572[] = {
        32,
        -1, 1, 360,
        0, 0, 1,
@@ -7219,46 +7231,46 @@ static int parser_action_row570[] = {
        90, 0, 55,
        93, 0, 56
 };
-static int parser_action_row571[] = {
+static int parser_action_row573[] = {
        3,
        -1, 1, 378,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row572[] = {
+static int parser_action_row574[] = {
        3,
        -1, 1, 378,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row573[] = {
+static int parser_action_row575[] = {
        3,
        -1, 1, 378,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row574[] = {
+static int parser_action_row576[] = {
        2,
-       -1, 3, 573,
-       26, 0, 702
+       -1, 3, 575,
+       26, 0, 704
 };
-static int parser_action_row575[] = {
+static int parser_action_row577[] = {
        1,
        -1, 1, 275
 };
-static int parser_action_row576[] = {
+static int parser_action_row578[] = {
        5,
        -1, 1, 360,
-       12, 0, 595,
-       49, 0, 508,
+       12, 0, 597,
+       49, 0, 510,
        83, 0, 49,
        84, 0, 50
 };
-static int parser_action_row577[] = {
+static int parser_action_row579[] = {
        1,
        -1, 1, 248
 };
-static int parser_action_row578[] = {
+static int parser_action_row580[] = {
        21,
        -1, 1, 360,
        12, 0, 153,
@@ -7282,169 +7294,169 @@ static int parser_action_row578[] = {
        90, 0, 55,
        93, 0, 56
 };
-static int parser_action_row579[] = {
+static int parser_action_row581[] = {
        1,
        -1, 1, 247
 };
-static int parser_action_row580[] = {
+static int parser_action_row582[] = {
        1,
        -1, 1, 250
 };
-static int parser_action_row581[] = {
+static int parser_action_row583[] = {
        3,
        -1, 1, 258,
-       67, 0, 312,
-       68, 0, 313
+       67, 0, 313,
+       68, 0, 314
 };
-static int parser_action_row582[] = {
+static int parser_action_row584[] = {
        3,
        -1, 1, 261,
-       67, 0, 312,
-       68, 0, 313
+       67, 0, 313,
+       68, 0, 314
 };
-static int parser_action_row583[] = {
+static int parser_action_row585[] = {
        1,
        -1, 1, 263
 };
-static int parser_action_row584[] = {
+static int parser_action_row586[] = {
        4,
        -1, 1, 265,
-       69, 0, 321,
-       70, 0, 322,
-       71, 0, 323
+       69, 0, 322,
+       70, 0, 323,
+       71, 0, 324
 };
-static int parser_action_row585[] = {
+static int parser_action_row587[] = {
        4,
        -1, 1, 266,
-       69, 0, 321,
-       70, 0, 322,
-       71, 0, 323
+       69, 0, 322,
+       70, 0, 323,
+       71, 0, 324
 };
-static int parser_action_row586[] = {
+static int parser_action_row588[] = {
        3,
        -1, 1, 254,
-       67, 0, 312,
-       68, 0, 313
+       67, 0, 313,
+       68, 0, 314
 };
-static int parser_action_row587[] = {
+static int parser_action_row589[] = {
        3,
        -1, 1, 255,
-       67, 0, 312,
-       68, 0, 313
+       67, 0, 313,
+       68, 0, 314
 };
-static int parser_action_row588[] = {
+static int parser_action_row590[] = {
        3,
        -1, 1, 256,
-       67, 0, 312,
-       68, 0, 313
+       67, 0, 313,
+       68, 0, 314
 };
-static int parser_action_row589[] = {
+static int parser_action_row591[] = {
        3,
        -1, 1, 257,
-       67, 0, 312,
-       68, 0, 313
+       67, 0, 313,
+       68, 0, 314
 };
-static int parser_action_row590[] = {
+static int parser_action_row592[] = {
        3,
        -1, 1, 259,
-       67, 0, 312,
-       68, 0, 313
+       67, 0, 313,
+       68, 0, 314
 };
-static int parser_action_row591[] = {
+static int parser_action_row593[] = {
        3,
        -1, 1, 260,
-       67, 0, 312,
-       68, 0, 313
+       67, 0, 313,
+       68, 0, 314
 };
-static int parser_action_row592[] = {
+static int parser_action_row594[] = {
        3,
        -1, 1, 262,
-       67, 0, 312,
-       68, 0, 313
+       67, 0, 313,
+       68, 0, 314
 };
-static int parser_action_row593[] = {
+static int parser_action_row595[] = {
        1,
        -1, 1, 268
 };
-static int parser_action_row594[] = {
+static int parser_action_row596[] = {
        1,
        -1, 1, 269
 };
-static int parser_action_row595[] = {
+static int parser_action_row597[] = {
        1,
        -1, 1, 270
 };
-static int parser_action_row596[] = {
+static int parser_action_row598[] = {
        2,
        -1, 1, 342,
        54, 0, 242
 };
-static int parser_action_row597[] = {
+static int parser_action_row599[] = {
        2,
-       -1, 3, 596,
-       85, 0, 705
+       -1, 3, 598,
+       85, 0, 707
 };
-static int parser_action_row598[] = {
+static int parser_action_row600[] = {
        2,
        -1, 1, 342,
        54, 0, 242
 };
-static int parser_action_row599[] = {
+static int parser_action_row601[] = {
        1,
        -1, 1, 239
 };
-static int parser_action_row600[] = {
+static int parser_action_row602[] = {
        1,
        -1, 1, 162
 };
-static int parser_action_row601[] = {
+static int parser_action_row603[] = {
        1,
        -1, 1, 161
 };
-static int parser_action_row602[] = {
+static int parser_action_row604[] = {
        3,
        -1, 1, 378,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row603[] = {
+static int parser_action_row605[] = {
        1,
        -1, 1, 451
 };
-static int parser_action_row604[] = {
+static int parser_action_row606[] = {
        3,
-       -1, 3, 603,
-       50, 0, 346,
-       83, 0, 347
+       -1, 3, 605,
+       50, 0, 347,
+       83, 0, 348
 };
-static int parser_action_row605[] = {
+static int parser_action_row607[] = {
        3,
        -1, 1, 378,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row606[] = {
+static int parser_action_row608[] = {
        2,
        -1, 1, 555,
-       82, 0, 472
+       82, 0, 474
 };
-static int parser_action_row607[] = {
+static int parser_action_row609[] = {
        1,
        -1, 1, 552
 };
-static int parser_action_row608[] = {
+static int parser_action_row610[] = {
        3,
-       -1, 3, 607,
+       -1, 3, 609,
        83, 0, 49,
        84, 0, 50
 };
-static int parser_action_row609[] = {
+static int parser_action_row611[] = {
        3,
        -1, 1, 378,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row610[] = {
+static int parser_action_row612[] = {
        35,
        -1, 1, 360,
        12, 0, 153,
@@ -7455,10 +7467,10 @@ static int parser_action_row610[] = {
        29, 0, 33,
        30, 0, 34,
        34, 0, 155,
-       36, 0, 716,
-       37, 0, 717,
-       38, 0, 718,
-       39, 0, 719,
+       36, 0, 718,
+       37, 0, 719,
+       38, 0, 720,
+       39, 0, 721,
        40, 0, 40,
        41, 0, 156,
        43, 0, 157,
@@ -7466,14 +7478,14 @@ static int parser_action_row610[] = {
        46, 0, 43,
        47, 0, 44,
        48, 0, 45,
-       50, 0, 346,
+       50, 0, 347,
        51, 0, 158,
-       53, 0, 720,
+       53, 0, 722,
        54, 0, 47,
        56, 0, 48,
        68, 0, 159,
        82, 0, 183,
-       83, 0, 721,
+       83, 0, 723,
        84, 0, 50,
        86, 0, 51,
        87, 0, 52,
@@ -7482,160 +7494,160 @@ static int parser_action_row610[] = {
        90, 0, 55,
        93, 0, 56
 };
-static int parser_action_row611[] = {
+static int parser_action_row613[] = {
        3,
        -1, 1, 378,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row612[] = {
+static int parser_action_row614[] = {
        1,
        -1, 1, 152
 };
-static int parser_action_row613[] = {
+static int parser_action_row615[] = {
        3,
-       -1, 3, 612,
-       50, 0, 346,
-       83, 0, 347
+       -1, 3, 614,
+       50, 0, 347,
+       83, 0, 348
 };
-static int parser_action_row614[] = {
+static int parser_action_row616[] = {
        1,
        -1, 1, 202
 };
-static int parser_action_row615[] = {
+static int parser_action_row617[] = {
        2,
        -1, 1, 316,
        82, 0, 183
 };
-static int parser_action_row616[] = {
+static int parser_action_row618[] = {
        3,
        -1, 1, 378,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row617[] = {
+static int parser_action_row619[] = {
        3,
        -1, 1, 378,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row618[] = {
+static int parser_action_row620[] = {
        1,
        -1, 1, 843
 };
-static int parser_action_row619[] = {
+static int parser_action_row621[] = {
        2,
        -1, 1, 349,
-       58, 0, 615
+       58, 0, 617
 };
-static int parser_action_row620[] = {
+static int parser_action_row622[] = {
        3,
-       -1, 3, 619,
+       -1, 3, 621,
        0, 0, 83,
        1, 0, 84
 };
-static int parser_action_row621[] = {
+static int parser_action_row623[] = {
        2,
        -1, 1, 87,
-       14, 0, 394
+       14, 0, 395
 };
-static int parser_action_row622[] = {
+static int parser_action_row624[] = {
        2,
        -1, 1, 110,
-       61, 0, 746
+       61, 0, 748
 };
-static int parser_action_row623[] = {
+static int parser_action_row625[] = {
        1,
        -1, 1, 112
 };
-static int parser_action_row624[] = {
+static int parser_action_row626[] = {
        3,
        -1, 1, 378,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row625[] = {
+static int parser_action_row627[] = {
        3,
        -1, 1, 378,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row626[] = {
+static int parser_action_row628[] = {
        4,
        -1, 1, 129,
-       4, 0, 749,
-       14, 0, 750,
-       15, 0, 751
+       4, 0, 751,
+       14, 0, 752,
+       15, 0, 753
 };
-static int parser_action_row627[] = {
+static int parser_action_row629[] = {
        3,
        -1, 1, 378,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row628[] = {
+static int parser_action_row630[] = {
        1,
        -1, 1, 117
 };
-static int parser_action_row629[] = {
+static int parser_action_row631[] = {
        2,
        -1, 1, 365,
        60, 0, 192
 };
-static int parser_action_row630[] = {
+static int parser_action_row632[] = {
        2,
-       -1, 3, 629,
+       -1, 3, 631,
        60, 0, 193
 };
-static int parser_action_row631[] = {
+static int parser_action_row633[] = {
        2,
        -1, 1, 51,
-       56, 0, 756
+       56, 0, 758
 };
-static int parser_action_row632[] = {
+static int parser_action_row634[] = {
        2,
-       -1, 3, 631,
-       83, 0, 758
+       -1, 3, 633,
+       83, 0, 760
 };
-static int parser_action_row633[] = {
+static int parser_action_row635[] = {
        3,
-       -1, 3, 632,
-       83, 0, 759,
-       84, 0, 629
+       -1, 3, 634,
+       83, 0, 761,
+       84, 0, 631
 };
-static int parser_action_row634[] = {
+static int parser_action_row636[] = {
        1,
        -1, 1, 283
 };
-static int parser_action_row635[] = {
+static int parser_action_row637[] = {
        1,
        -1, 1, 194
 };
-static int parser_action_row636[] = {
+static int parser_action_row638[] = {
        3,
-       -1, 3, 635,
-       34, 0, 761,
-       54, 0, 762
+       -1, 3, 637,
+       34, 0, 763,
+       54, 0, 764
 };
-static int parser_action_row637[] = {
+static int parser_action_row639[] = {
        4,
        -1, 1, 278,
-       61, 0, 763,
-       62, 0, 371,
-       63, 0, 372
+       61, 0, 765,
+       62, 0, 372,
+       63, 0, 373
 };
-static int parser_action_row638[] = {
+static int parser_action_row640[] = {
        4,
        -1, 1, 280,
-       61, 0, 765,
-       62, 0, 371,
-       63, 0, 372
+       61, 0, 767,
+       62, 0, 372,
+       63, 0, 373
 };
-static int parser_action_row639[] = {
+static int parser_action_row641[] = {
        1,
        -1, 1, 191
 };
-static int parser_action_row640[] = {
+static int parser_action_row642[] = {
        23,
        -1, 1, 346,
        12, 0, 108,
@@ -7649,7 +7661,7 @@ static int parser_action_row640[] = {
        47, 0, 115,
        48, 0, 116,
        51, 0, 117,
-       54, 0, 385,
+       54, 0, 386,
        68, 0, 119,
        83, 0, 49,
        84, 0, 50,
@@ -7661,7 +7673,7 @@ static int parser_action_row640[] = {
        90, 0, 55,
        93, 0, 124
 };
-static int parser_action_row641[] = {
+static int parser_action_row643[] = {
        23,
        -1, 1, 346,
        12, 0, 108,
@@ -7675,7 +7687,7 @@ static int parser_action_row641[] = {
        47, 0, 115,
        48, 0, 116,
        51, 0, 117,
-       54, 0, 385,
+       54, 0, 386,
        68, 0, 119,
        83, 0, 49,
        84, 0, 50,
@@ -7687,63 +7699,63 @@ static int parser_action_row641[] = {
        90, 0, 55,
        93, 0, 124
 };
-static int parser_action_row642[] = {
+static int parser_action_row644[] = {
        3,
        -1, 1, 358,
-       12, 0, 769,
-       84, 0, 389
+       12, 0, 771,
+       84, 0, 390
 };
-static int parser_action_row643[] = {
+static int parser_action_row645[] = {
        1,
        -1, 1, 309
 };
-static int parser_action_row644[] = {
+static int parser_action_row646[] = {
        1,
        -1, 1, 345
 };
-static int parser_action_row645[] = {
+static int parser_action_row647[] = {
        2,
-       -1, 3, 644,
-       55, 0, 770
+       -1, 3, 646,
+       55, 0, 772
 };
-static int parser_action_row646[] = {
+static int parser_action_row648[] = {
        2,
        -1, 1, 356,
        60, 0, 193
 };
-static int parser_action_row647[] = {
+static int parser_action_row649[] = {
        3,
        -1, 1, 378,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row648[] = {
+static int parser_action_row650[] = {
        1,
        -1, 1, 837
 };
-static int parser_action_row649[] = {
+static int parser_action_row651[] = {
        2,
        -1, 1, 321,
-       58, 0, 646
+       58, 0, 648
 };
-static int parser_action_row650[] = {
+static int parser_action_row652[] = {
        2,
-       -1, 3, 649,
-       9, 0, 773
+       -1, 3, 651,
+       9, 0, 775
 };
-static int parser_action_row651[] = {
+static int parser_action_row653[] = {
        1,
        -1, 1, 839
 };
-static int parser_action_row652[] = {
+static int parser_action_row654[] = {
        5,
-       -1, 3, 651,
-       4, 0, 339,
-       16, 0, 340,
-       17, 0, 341,
-       84, 0, 343
+       -1, 3, 653,
+       4, 0, 340,
+       16, 0, 341,
+       17, 0, 342,
+       84, 0, 344
 };
-static int parser_action_row653[] = {
+static int parser_action_row655[] = {
        5,
        -1, 1, 378,
        0, 0, 1,
@@ -7751,58 +7763,58 @@ static int parser_action_row653[] = {
        9, 1, 322,
        15, 1, 322
 };
-static int parser_action_row654[] = {
+static int parser_action_row656[] = {
        1,
        -1, 1, 340
 };
-static int parser_action_row655[] = {
+static int parser_action_row657[] = {
        3,
        -1, 1, 378,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row656[] = {
+static int parser_action_row658[] = {
        3,
-       -1, 3, 655,
+       -1, 3, 657,
        83, 0, 49,
        84, 0, 50
 };
-static int parser_action_row657[] = {
+static int parser_action_row659[] = {
        2,
-       -1, 3, 656,
-       85, 0, 778
+       -1, 3, 658,
+       85, 0, 780
 };
-static int parser_action_row658[] = {
+static int parser_action_row660[] = {
        1,
        -1, 1, 501
 };
-static int parser_action_row659[] = {
+static int parser_action_row661[] = {
        1,
        -1, 1, 535
 };
-static int parser_action_row660[] = {
+static int parser_action_row662[] = {
        3,
-       -1, 3, 659,
-       34, 0, 779,
-       54, 0, 780
+       -1, 3, 661,
+       34, 0, 781,
+       54, 0, 782
 };
-static int parser_action_row661[] = {
+static int parser_action_row663[] = {
        1,
        -1, 1, 530
 };
-static int parser_action_row662[] = {
+static int parser_action_row664[] = {
        1,
        -1, 1, 532
 };
-static int parser_action_row663[] = {
+static int parser_action_row665[] = {
        1,
        -1, 1, 170
 };
-static int parser_action_row664[] = {
+static int parser_action_row666[] = {
        1,
        -1, 1, 207
 };
-static int parser_action_row665[] = {
+static int parser_action_row667[] = {
        22,
        -1, 1, 360,
        12, 0, 153,
@@ -7827,11 +7839,11 @@ static int parser_action_row665[] = {
        90, 0, 55,
        93, 0, 56
 };
-static int parser_action_row666[] = {
+static int parser_action_row668[] = {
        1,
        -1, 1, 229
 };
-static int parser_action_row667[] = {
+static int parser_action_row669[] = {
        25,
        -1, 1, 346,
        12, 0, 108,
@@ -7859,30 +7871,30 @@ static int parser_action_row667[] = {
        90, 0, 55,
        93, 0, 124
 };
-static int parser_action_row668[] = {
+static int parser_action_row670[] = {
        32,
        -1, 1, 360,
        0, 0, 1,
        1, 0, 2,
-       9, 0, 783,
-       12, 0, 666,
-       15, 0, 667,
-       18, 0, 668,
-       25, 0, 669,
-       28, 0, 671,
-       29, 0, 672,
-       30, 0, 673,
-       36, 0, 674,
-       37, 0, 675,
-       38, 0, 676,
-       39, 0, 677,
-       40, 0, 678,
+       9, 0, 785,
+       12, 0, 668,
+       15, 0, 669,
+       18, 0, 670,
+       25, 0, 671,
+       28, 0, 673,
+       29, 0, 674,
+       30, 0, 675,
+       36, 0, 676,
+       37, 0, 677,
+       38, 0, 678,
+       39, 0, 679,
+       40, 0, 680,
        41, 0, 41,
        45, 0, 42,
        46, 0, 43,
        47, 0, 44,
        48, 0, 45,
-       53, 0, 679,
+       53, 0, 681,
        54, 0, 47,
        56, 0, 48,
        83, 0, 49,
@@ -7894,23 +7906,23 @@ static int parser_action_row668[] = {
        90, 0, 55,
        93, 0, 56
 };
-static int parser_action_row669[] = {
+static int parser_action_row671[] = {
        2,
-       -1, 3, 668,
-       84, 0, 788
+       -1, 3, 670,
+       84, 0, 790
 };
-static int parser_action_row670[] = {
+static int parser_action_row672[] = {
        3,
        -1, 1, 378,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row671[] = {
+static int parser_action_row673[] = {
        32,
        -1, 1, 360,
        0, 0, 1,
        1, 0, 2,
-       9, 0, 467,
+       9, 0, 469,
        12, 0, 27,
        15, 0, 29,
        18, 0, 30,
@@ -7940,36 +7952,36 @@ static int parser_action_row671[] = {
        90, 0, 55,
        93, 0, 56
 };
-static int parser_action_row672[] = {
+static int parser_action_row674[] = {
        3,
        -1, 1, 378,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row673[] = {
+static int parser_action_row675[] = {
        32,
        -1, 1, 360,
        0, 0, 1,
        1, 0, 2,
-       9, 0, 783,
-       12, 0, 666,
-       15, 0, 667,
-       18, 0, 668,
-       25, 0, 669,
-       28, 0, 671,
-       29, 0, 672,
-       30, 0, 673,
-       36, 0, 674,
-       37, 0, 675,
-       38, 0, 676,
-       39, 0, 677,
-       40, 0, 678,
+       9, 0, 785,
+       12, 0, 668,
+       15, 0, 669,
+       18, 0, 670,
+       25, 0, 671,
+       28, 0, 673,
+       29, 0, 674,
+       30, 0, 675,
+       36, 0, 676,
+       37, 0, 677,
+       38, 0, 678,
+       39, 0, 679,
+       40, 0, 680,
        41, 0, 41,
        45, 0, 42,
        46, 0, 43,
        47, 0, 44,
        48, 0, 45,
-       53, 0, 679,
+       53, 0, 681,
        54, 0, 47,
        56, 0, 48,
        83, 0, 49,
@@ -7981,13 +7993,13 @@ static int parser_action_row673[] = {
        90, 0, 55,
        93, 0, 56
 };
-static int parser_action_row674[] = {
+static int parser_action_row676[] = {
        3,
        -1, 1, 378,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row675[] = {
+static int parser_action_row677[] = {
        25,
        -1, 1, 174,
        12, 0, 153,
@@ -8015,7 +8027,7 @@ static int parser_action_row675[] = {
        90, 0, 55,
        93, 0, 56
 };
-static int parser_action_row676[] = {
+static int parser_action_row678[] = {
        26,
        -1, 1, 181,
        12, 0, 153,
@@ -8044,7 +8056,7 @@ static int parser_action_row676[] = {
        90, 0, 55,
        93, 0, 56
 };
-static int parser_action_row677[] = {
+static int parser_action_row679[] = {
        26,
        -1, 1, 176,
        12, 0, 153,
@@ -8073,12 +8085,12 @@ static int parser_action_row677[] = {
        90, 0, 55,
        93, 0, 56
 };
-static int parser_action_row678[] = {
+static int parser_action_row680[] = {
        2,
        -1, 1, 180,
        27, 1, 630
 };
-static int parser_action_row679[] = {
+static int parser_action_row681[] = {
        22,
        -1, 1, 360,
        12, 0, 153,
@@ -8103,32 +8115,32 @@ static int parser_action_row679[] = {
        90, 0, 55,
        93, 0, 56
 };
-static int parser_action_row680[] = {
+static int parser_action_row682[] = {
        2,
-       -1, 3, 679,
-       11, 0, 802
+       -1, 3, 681,
+       11, 0, 804
 };
-static int parser_action_row681[] = {
+static int parser_action_row683[] = {
        1,
        -1, 1, 224
 };
-static int parser_action_row682[] = {
+static int parser_action_row684[] = {
        1,
        -1, 1, 226
 };
-static int parser_action_row683[] = {
+static int parser_action_row685[] = {
        3,
-       -1, 3, 682,
+       -1, 3, 684,
        56, 0, 207,
-       66, 0, 803
+       66, 0, 805
 };
-static int parser_action_row684[] = {
+static int parser_action_row686[] = {
        3,
-       -1, 3, 683,
-       44, 0, 805,
-       85, 0, 806
+       -1, 3, 685,
+       44, 0, 807,
+       85, 0, 808
 };
-static int parser_action_row685[] = {
+static int parser_action_row687[] = {
        28,
        -1, 1, 346,
        12, 0, 108,
@@ -8159,21 +8171,21 @@ static int parser_action_row685[] = {
        90, 0, 55,
        93, 0, 124
 };
-static int parser_action_row686[] = {
+static int parser_action_row688[] = {
        3,
        -1, 1, 357,
-       12, 0, 809,
+       12, 0, 811,
        84, 0, 223
 };
-static int parser_action_row687[] = {
+static int parser_action_row689[] = {
        31,
        -1, 1, 360,
-       9, 0, 665,
+       9, 0, 667,
        12, 0, 27,
        15, 0, 29,
        18, 0, 30,
        25, 0, 31,
-       27, 0, 670,
+       27, 0, 672,
        28, 0, 32,
        29, 0, 33,
        30, 0, 34,
@@ -8199,66 +8211,66 @@ static int parser_action_row687[] = {
        90, 0, 55,
        93, 0, 56
 };
-static int parser_action_row688[] = {
+static int parser_action_row690[] = {
        2,
-       -1, 3, 687,
-       27, 0, 813
+       -1, 3, 689,
+       27, 0, 815
 };
-static int parser_action_row689[] = {
+static int parser_action_row691[] = {
        1,
        -1, 1, 622
 };
-static int parser_action_row690[] = {
+static int parser_action_row692[] = {
        1,
        -1, 1, 623
 };
-static int parser_action_row691[] = {
+static int parser_action_row693[] = {
        1,
        -1, 1, 635
 };
-static int parser_action_row692[] = {
+static int parser_action_row694[] = {
        1,
        -1, 1, 636
 };
-static int parser_action_row693[] = {
+static int parser_action_row695[] = {
        1,
        -1, 1, 638
 };
-static int parser_action_row694[] = {
+static int parser_action_row696[] = {
        1,
        -1, 1, 637
 };
-static int parser_action_row695[] = {
+static int parser_action_row697[] = {
        1,
        -1, 1, 639
 };
-static int parser_action_row696[] = {
+static int parser_action_row698[] = {
        1,
        -1, 1, 640
 };
-static int parser_action_row697[] = {
+static int parser_action_row699[] = {
        4,
        -1, 1, 359,
-       12, 0, 814,
+       12, 0, 816,
        83, 0, 49,
        84, 0, 225
 };
-static int parser_action_row698[] = {
+static int parser_action_row700[] = {
        1,
        -1, 1, 233
 };
-static int parser_action_row699[] = {
+static int parser_action_row701[] = {
        2,
-       -1, 3, 698,
+       -1, 3, 700,
        52, 0, 172
 };
-static int parser_action_row700[] = {
+static int parser_action_row702[] = {
        3,
-       -1, 3, 699,
-       55, 0, 817,
-       58, 0, 572
+       -1, 3, 701,
+       55, 0, 819,
+       58, 0, 574
 };
-static int parser_action_row701[] = {
+static int parser_action_row703[] = {
        22,
        -1, 1, 360,
        12, 0, 153,
@@ -8283,85 +8295,85 @@ static int parser_action_row701[] = {
        90, 0, 55,
        93, 0, 56
 };
-static int parser_action_row702[] = {
+static int parser_action_row704[] = {
        2,
-       -1, 3, 701,
-       84, 0, 819
+       -1, 3, 703,
+       84, 0, 821
 };
-static int parser_action_row703[] = {
+static int parser_action_row705[] = {
        3,
        -1, 1, 378,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row704[] = {
+static int parser_action_row706[] = {
        2,
-       -1, 3, 703,
-       85, 0, 821
+       -1, 3, 705,
+       85, 0, 823
 };
-static int parser_action_row705[] = {
+static int parser_action_row707[] = {
        1,
        -1, 1, 249
 };
-static int parser_action_row706[] = {
+static int parser_action_row708[] = {
        1,
        -1, 1, 278
 };
-static int parser_action_row707[] = {
+static int parser_action_row709[] = {
        1,
        -1, 1, 280
 };
-static int parser_action_row708[] = {
+static int parser_action_row710[] = {
        3,
-       -1, 3, 707,
-       50, 0, 346,
-       83, 0, 347
+       -1, 3, 709,
+       50, 0, 347,
+       83, 0, 348
 };
-static int parser_action_row709[] = {
+static int parser_action_row711[] = {
        2,
        -1, 1, 155,
-       58, 0, 823
+       58, 0, 825
 };
-static int parser_action_row710[] = {
+static int parser_action_row712[] = {
        3,
        -1, 1, 378,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row711[] = {
+static int parser_action_row713[] = {
        5,
-       -1, 3, 710,
-       4, 0, 339,
-       16, 0, 340,
-       17, 0, 341,
-       84, 0, 343
+       -1, 3, 712,
+       4, 0, 340,
+       16, 0, 341,
+       17, 0, 342,
+       84, 0, 344
 };
-static int parser_action_row712[] = {
+static int parser_action_row714[] = {
        1,
        -1, 1, 556
 };
-static int parser_action_row713[] = {
+static int parser_action_row715[] = {
        2,
        -1, 1, 342,
        54, 0, 242
 };
-static int parser_action_row714[] = {
+static int parser_action_row716[] = {
        2,
-       -1, 3, 713,
+       -1, 3, 715,
        84, 0, 223
 };
-static int parser_action_row715[] = {
+static int parser_action_row717[] = {
        3,
-       -1, 3, 714,
+       -1, 3, 716,
        83, 0, 49,
        84, 0, 225
 };
-static int parser_action_row716[] = {
+static int parser_action_row718[] = {
        2,
-       -1, 3, 715,
-       55, 0, 830
+       -1, 3, 717,
+       55, 0, 832
 };
-static int parser_action_row717[] = {
+static int parser_action_row719[] = {
        24,
        -1, 1, 734,
        12, 0, 153,
@@ -8388,7 +8400,7 @@ static int parser_action_row717[] = {
        90, 0, 55,
        93, 0, 56
 };
-static int parser_action_row718[] = {
+static int parser_action_row720[] = {
        25,
        -1, 1, 741,
        12, 0, 153,
@@ -8416,7 +8428,7 @@ static int parser_action_row718[] = {
        90, 0, 55,
        93, 0, 56
 };
-static int parser_action_row719[] = {
+static int parser_action_row721[] = {
        25,
        -1, 1, 736,
        12, 0, 153,
@@ -8444,111 +8456,111 @@ static int parser_action_row719[] = {
        90, 0, 55,
        93, 0, 56
 };
-static int parser_action_row720[] = {
+static int parser_action_row722[] = {
        1,
        -1, 1, 740
 };
-static int parser_action_row721[] = {
+static int parser_action_row723[] = {
        2,
-       -1, 3, 720,
-       11, 0, 836
+       -1, 3, 722,
+       11, 0, 838
 };
-static int parser_action_row722[] = {
+static int parser_action_row724[] = {
        4,
        -1, 1, 316,
-       56, 0, 480,
+       56, 0, 482,
        60, 0, 192,
        82, 0, 183
 };
-static int parser_action_row723[] = {
+static int parser_action_row725[] = {
        1,
        -1, 1, 332
 };
-static int parser_action_row724[] = {
+static int parser_action_row726[] = {
        1,
        -1, 1, 732
 };
-static int parser_action_row725[] = {
+static int parser_action_row727[] = {
        1,
        -1, 1, 733
 };
-static int parser_action_row726[] = {
+static int parser_action_row728[] = {
        1,
        -1, 1, 745
 };
-static int parser_action_row727[] = {
+static int parser_action_row729[] = {
        1,
        -1, 1, 747
 };
-static int parser_action_row728[] = {
+static int parser_action_row730[] = {
        1,
        -1, 1, 746
 };
-static int parser_action_row729[] = {
+static int parser_action_row731[] = {
        1,
        -1, 1, 748
 };
-static int parser_action_row730[] = {
+static int parser_action_row732[] = {
        1,
        -1, 1, 749
 };
-static int parser_action_row731[] = {
+static int parser_action_row733[] = {
        1,
        -1, 1, 333
 };
-static int parser_action_row732[] = {
+static int parser_action_row734[] = {
        3,
        -1, 1, 274,
        56, 0, 207,
-       66, 0, 837
+       66, 0, 839
 };
-static int parser_action_row733[] = {
+static int parser_action_row735[] = {
        1,
        -1, 1, 335
 };
-static int parser_action_row734[] = {
+static int parser_action_row736[] = {
        3,
        -1, 1, 378,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row735[] = {
+static int parser_action_row737[] = {
        2,
        -1, 1, 329,
-       58, 0, 839
+       58, 0, 841
 };
-static int parser_action_row736[] = {
+static int parser_action_row738[] = {
        3,
-       -1, 3, 735,
-       44, 0, 326,
+       -1, 3, 737,
+       44, 0, 327,
        85, 0, 219
 };
-static int parser_action_row737[] = {
+static int parser_action_row739[] = {
        2,
        -1, 1, 342,
        54, 0, 242
 };
-static int parser_action_row738[] = {
+static int parser_action_row740[] = {
        1,
        -1, 1, 334
 };
-static int parser_action_row739[] = {
+static int parser_action_row741[] = {
        3,
-       -1, 3, 738,
-       50, 0, 346,
-       83, 0, 347
+       -1, 3, 740,
+       50, 0, 347,
+       83, 0, 348
 };
-static int parser_action_row740[] = {
+static int parser_action_row742[] = {
        3,
        -1, 1, 378,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row741[] = {
+static int parser_action_row743[] = {
        1,
        -1, 1, 300
 };
-static int parser_action_row742[] = {
+static int parser_action_row744[] = {
        22,
        -1, 1, 360,
        12, 0, 153,
@@ -8573,82 +8585,82 @@ static int parser_action_row742[] = {
        90, 0, 55,
        93, 0, 56
 };
-static int parser_action_row743[] = {
+static int parser_action_row745[] = {
        21,
        -1, 1, 360,
-       12, 0, 845,
-       25, 0, 846,
-       34, 0, 847,
-       41, 0, 848,
-       43, 0, 849,
-       45, 0, 850,
-       46, 0, 851,
-       47, 0, 852,
-       48, 0, 853,
-       51, 0, 854,
-       54, 0, 855,
-       68, 0, 856,
+       12, 0, 847,
+       25, 0, 848,
+       34, 0, 849,
+       41, 0, 850,
+       43, 0, 851,
+       45, 0, 852,
+       46, 0, 853,
+       47, 0, 854,
+       48, 0, 855,
+       51, 0, 856,
+       54, 0, 857,
+       68, 0, 858,
        83, 0, 49,
        84, 0, 50,
-       86, 0, 857,
-       87, 0, 858,
-       88, 0, 859,
-       89, 0, 860,
+       86, 0, 859,
+       87, 0, 860,
+       88, 0, 861,
+       89, 0, 862,
        90, 0, 55,
-       93, 0, 861
+       93, 0, 863
 };
-static int parser_action_row744[] = {
+static int parser_action_row746[] = {
        1,
        -1, 1, 844
 };
-static int parser_action_row745[] = {
+static int parser_action_row747[] = {
        1,
        -1, 1, 18
 };
-static int parser_action_row746[] = {
+static int parser_action_row748[] = {
        3,
-       -1, 3, 745,
+       -1, 3, 747,
        0, 0, 83,
        1, 0, 84
 };
-static int parser_action_row747[] = {
+static int parser_action_row749[] = {
        1,
        -1, 1, 113
 };
-static int parser_action_row748[] = {
+static int parser_action_row750[] = {
        2,
        -1, 1, 120,
-       84, 0, 875
+       84, 0, 877
 };
-static int parser_action_row749[] = {
+static int parser_action_row751[] = {
        3,
-       -1, 3, 748,
-       50, 0, 346,
-       83, 0, 347
+       -1, 3, 750,
+       50, 0, 347,
+       83, 0, 348
 };
-static int parser_action_row750[] = {
+static int parser_action_row752[] = {
        3,
        -1, 1, 378,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row751[] = {
+static int parser_action_row753[] = {
        8,
-       -1, 3, 750,
+       -1, 3, 752,
        0, 0, 83,
        1, 0, 84,
-       4, 0, 339,
-       16, 0, 340,
-       17, 0, 341,
-       20, 0, 880,
-       84, 0, 343
+       4, 0, 340,
+       16, 0, 341,
+       17, 0, 342,
+       20, 0, 882,
+       84, 0, 344
 };
-static int parser_action_row752[] = {
+static int parser_action_row754[] = {
        32,
        -1, 1, 360,
        0, 0, 1,
        1, 0, 2,
-       9, 0, 467,
+       9, 0, 469,
        12, 0, 27,
        15, 0, 29,
        18, 0, 30,
@@ -8678,32 +8690,32 @@ static int parser_action_row752[] = {
        90, 0, 55,
        93, 0, 56
 };
-static int parser_action_row753[] = {
+static int parser_action_row755[] = {
        2,
-       -1, 3, 752,
-       15, 0, 884
+       -1, 3, 754,
+       15, 0, 886
 };
-static int parser_action_row754[] = {
+static int parser_action_row756[] = {
        3,
-       -1, 3, 753,
+       -1, 3, 755,
        31, 0, 35,
        96, 0, 57
 };
-static int parser_action_row755[] = {
+static int parser_action_row757[] = {
        1,
        -1, 1, 386
 };
-static int parser_action_row756[] = {
+static int parser_action_row758[] = {
        1,
        -1, 1, 116
 };
-static int parser_action_row757[] = {
+static int parser_action_row759[] = {
        3,
        -1, 1, 378,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row758[] = {
+static int parser_action_row760[] = {
        5,
        -1, 1, 378,
        0, 0, 1,
@@ -8711,33 +8723,33 @@ static int parser_action_row758[] = {
        31, 0, 35,
        96, 0, 57
 };
-static int parser_action_row759[] = {
+static int parser_action_row761[] = {
        1,
        -1, 1, 366
 };
-static int parser_action_row760[] = {
+static int parser_action_row762[] = {
        2,
        -1, 1, 368,
        60, 0, 192
 };
-static int parser_action_row761[] = {
+static int parser_action_row763[] = {
        2,
-       -1, 3, 760,
-       83, 0, 896
+       -1, 3, 762,
+       83, 0, 898
 };
-static int parser_action_row762[] = {
+static int parser_action_row764[] = {
        3,
        -1, 1, 378,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row763[] = {
+static int parser_action_row765[] = {
        3,
        -1, 1, 378,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row764[] = {
+static int parser_action_row766[] = {
        22,
        -1, 1, 360,
        12, 0, 153,
@@ -8762,7 +8774,7 @@ static int parser_action_row764[] = {
        90, 0, 55,
        93, 0, 56
 };
-static int parser_action_row765[] = {
+static int parser_action_row767[] = {
        22,
        -1, 1, 360,
        12, 0, 153,
@@ -8787,7 +8799,7 @@ static int parser_action_row765[] = {
        90, 0, 55,
        93, 0, 56
 };
-static int parser_action_row766[] = {
+static int parser_action_row768[] = {
        22,
        -1, 1, 360,
        12, 0, 153,
@@ -8812,7 +8824,7 @@ static int parser_action_row766[] = {
        90, 0, 55,
        93, 0, 56
 };
-static int parser_action_row767[] = {
+static int parser_action_row769[] = {
        22,
        -1, 1, 360,
        12, 0, 153,
@@ -8837,15 +8849,15 @@ static int parser_action_row767[] = {
        90, 0, 55,
        93, 0, 56
 };
-static int parser_action_row768[] = {
+static int parser_action_row770[] = {
        1,
        -1, 1, 196
 };
-static int parser_action_row769[] = {
+static int parser_action_row771[] = {
        1,
        -1, 1, 198
 };
-static int parser_action_row770[] = {
+static int parser_action_row772[] = {
        23,
        -1, 1, 346,
        12, 0, 108,
@@ -8859,7 +8871,7 @@ static int parser_action_row770[] = {
        47, 0, 115,
        48, 0, 116,
        51, 0, 117,
-       54, 0, 385,
+       54, 0, 386,
        68, 0, 119,
        83, 0, 49,
        84, 0, 50,
@@ -8871,27 +8883,27 @@ static int parser_action_row770[] = {
        90, 0, 55,
        93, 0, 124
 };
-static int parser_action_row771[] = {
+static int parser_action_row773[] = {
        1,
        -1, 1, 343
 };
-static int parser_action_row772[] = {
+static int parser_action_row774[] = {
        5,
-       -1, 3, 771,
-       4, 0, 339,
-       16, 0, 340,
-       17, 0, 341,
-       84, 0, 343
+       -1, 3, 773,
+       4, 0, 340,
+       16, 0, 341,
+       17, 0, 342,
+       84, 0, 344
 };
-static int parser_action_row773[] = {
+static int parser_action_row775[] = {
        1,
        -1, 1, 838
 };
-static int parser_action_row774[] = {
+static int parser_action_row776[] = {
        1,
        -1, 1, 86
 };
-static int parser_action_row775[] = {
+static int parser_action_row777[] = {
        36,
        -1, 1, 360,
        0, 0, 83,
@@ -8904,10 +8916,10 @@ static int parser_action_row775[] = {
        29, 0, 33,
        30, 0, 34,
        34, 0, 110,
-       36, 0, 905,
-       37, 0, 906,
-       38, 0, 907,
-       39, 0, 908,
+       36, 0, 907,
+       37, 0, 908,
+       38, 0, 909,
+       39, 0, 910,
        40, 0, 40,
        41, 0, 111,
        43, 0, 112,
@@ -8915,13 +8927,13 @@ static int parser_action_row775[] = {
        46, 0, 114,
        47, 0, 115,
        48, 0, 116,
-       50, 0, 346,
+       50, 0, 347,
        51, 0, 117,
-       53, 0, 909,
-       54, 0, 910,
+       53, 0, 911,
+       54, 0, 912,
        68, 0, 119,
        82, 0, 183,
-       83, 0, 721,
+       83, 0, 723,
        84, 0, 50,
        86, 0, 120,
        87, 0, 121,
@@ -8930,11 +8942,11 @@ static int parser_action_row775[] = {
        90, 0, 55,
        93, 0, 124
 };
-static int parser_action_row776[] = {
+static int parser_action_row778[] = {
        1,
        -1, 1, 840
 };
-static int parser_action_row777[] = {
+static int parser_action_row779[] = {
        22,
        -1, 1, 360,
        12, 0, 153,
@@ -8959,48 +8971,48 @@ static int parser_action_row777[] = {
        90, 0, 55,
        93, 0, 56
 };
-static int parser_action_row778[] = {
+static int parser_action_row780[] = {
        2,
        -1, 1, 342,
        54, 0, 242
 };
-static int parser_action_row779[] = {
+static int parser_action_row781[] = {
        3,
        -1, 1, 528,
        56, 1, 530,
        66, 1, 530
 };
-static int parser_action_row780[] = {
+static int parser_action_row782[] = {
        3,
        -1, 1, 378,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row781[] = {
+static int parser_action_row783[] = {
        3,
        -1, 1, 378,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row782[] = {
+static int parser_action_row784[] = {
        1,
        -1, 1, 208
 };
-static int parser_action_row783[] = {
+static int parser_action_row785[] = {
        2,
        -1, 1, 195,
        27, 1, 645
 };
-static int parser_action_row784[] = {
+static int parser_action_row786[] = {
        3,
        -1, 1, 163,
        27, 1, 620,
        52, 1, 728
 };
-static int parser_action_row785[] = {
+static int parser_action_row787[] = {
        30,
        -1, 1, 360,
-       9, 0, 932,
+       9, 0, 934,
        12, 0, 27,
        15, 0, 29,
        18, 0, 30,
@@ -9030,26 +9042,26 @@ static int parser_action_row785[] = {
        90, 0, 55,
        93, 0, 56
 };
-static int parser_action_row786[] = {
+static int parser_action_row788[] = {
        1,
        -1, 1, 669
 };
-static int parser_action_row787[] = {
+static int parser_action_row789[] = {
        1,
        -1, 1, 621
 };
-static int parser_action_row788[] = {
+static int parser_action_row790[] = {
        2,
-       -1, 3, 787,
+       -1, 3, 789,
        52, 0, 172
 };
-static int parser_action_row789[] = {
+static int parser_action_row791[] = {
        3,
        -1, 1, 160,
        59, 0, 290,
        82, 0, 183
 };
-static int parser_action_row790[] = {
+static int parser_action_row792[] = {
        22,
        -1, 1, 360,
        12, 0, 153,
@@ -9074,11 +9086,11 @@ static int parser_action_row790[] = {
        90, 0, 55,
        93, 0, 56
 };
-static int parser_action_row791[] = {
+static int parser_action_row793[] = {
        1,
        -1, 1, 228
 };
-static int parser_action_row792[] = {
+static int parser_action_row794[] = {
        22,
        -1, 1, 360,
        12, 0, 153,
@@ -9103,26 +9115,26 @@ static int parser_action_row792[] = {
        90, 0, 55,
        93, 0, 56
 };
-static int parser_action_row793[] = {
+static int parser_action_row795[] = {
        1,
        -1, 1, 672
 };
-static int parser_action_row794[] = {
+static int parser_action_row796[] = {
        2,
-       -1, 3, 793,
+       -1, 3, 795,
        52, 0, 172
 };
-static int parser_action_row795[] = {
+static int parser_action_row797[] = {
        3,
-       -1, 3, 794,
-       54, 0, 940,
+       -1, 3, 796,
+       54, 0, 942,
        84, 0, 297
 };
-static int parser_action_row796[] = {
+static int parser_action_row798[] = {
        1,
        -1, 1, 625
 };
-static int parser_action_row797[] = {
+static int parser_action_row799[] = {
        25,
        -1, 1, 182,
        12, 0, 153,
@@ -9150,11 +9162,11 @@ static int parser_action_row797[] = {
        90, 0, 55,
        93, 0, 56
 };
-static int parser_action_row798[] = {
+static int parser_action_row800[] = {
        1,
        -1, 1, 633
 };
-static int parser_action_row799[] = {
+static int parser_action_row801[] = {
        25,
        -1, 1, 177,
        12, 0, 153,
@@ -9182,11 +9194,11 @@ static int parser_action_row799[] = {
        90, 0, 55,
        93, 0, 56
 };
-static int parser_action_row800[] = {
+static int parser_action_row802[] = {
        1,
        -1, 1, 628
 };
-static int parser_action_row801[] = {
+static int parser_action_row803[] = {
        22,
        -1, 1, 360,
        12, 0, 153,
@@ -9211,31 +9223,31 @@ static int parser_action_row801[] = {
        90, 0, 55,
        93, 0, 56
 };
-static int parser_action_row802[] = {
+static int parser_action_row804[] = {
        2,
-       -1, 3, 801,
-       27, 0, 945
+       -1, 3, 803,
+       27, 0, 947
 };
-static int parser_action_row803[] = {
+static int parser_action_row805[] = {
        3,
-       -1, 3, 802,
-       50, 0, 346,
-       83, 0, 347
+       -1, 3, 804,
+       50, 0, 347,
+       83, 0, 348
 };
-static int parser_action_row804[] = {
+static int parser_action_row806[] = {
        3,
        -1, 1, 378,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row805[] = {
+static int parser_action_row807[] = {
        4,
        -1, 1, 285,
-       61, 0, 948,
-       62, 0, 371,
-       63, 0, 372
+       61, 0, 950,
+       62, 0, 372,
+       63, 0, 373
 };
-static int parser_action_row806[] = {
+static int parser_action_row808[] = {
        25,
        -1, 1, 346,
        12, 0, 108,
@@ -9263,26 +9275,26 @@ static int parser_action_row806[] = {
        90, 0, 55,
        93, 0, 124
 };
-static int parser_action_row807[] = {
+static int parser_action_row809[] = {
        4,
        -1, 1, 279,
-       61, 0, 951,
-       62, 0, 371,
-       63, 0, 372
+       61, 0, 953,
+       62, 0, 372,
+       63, 0, 373
 };
-static int parser_action_row808[] = {
+static int parser_action_row810[] = {
        4,
        -1, 1, 281,
-       61, 0, 953,
-       62, 0, 371,
-       63, 0, 372
+       61, 0, 955,
+       62, 0, 372,
+       63, 0, 373
 };
-static int parser_action_row809[] = {
+static int parser_action_row811[] = {
        2,
        -1, 1, 192,
        27, 1, 642
 };
-static int parser_action_row810[] = {
+static int parser_action_row812[] = {
        23,
        -1, 1, 346,
        12, 0, 108,
@@ -9296,7 +9308,7 @@ static int parser_action_row810[] = {
        47, 0, 115,
        48, 0, 116,
        51, 0, 117,
-       54, 0, 385,
+       54, 0, 386,
        68, 0, 119,
        83, 0, 49,
        84, 0, 50,
@@ -9308,28 +9320,28 @@ static int parser_action_row810[] = {
        90, 0, 55,
        93, 0, 124
 };
-static int parser_action_row811[] = {
+static int parser_action_row813[] = {
        3,
-       -1, 3, 810,
-       9, 0, 665,
-       27, 0, 670
+       -1, 3, 812,
+       9, 0, 667,
+       27, 0, 672
 };
-static int parser_action_row812[] = {
+static int parser_action_row814[] = {
        3,
-       -1, 3, 811,
+       -1, 3, 813,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row813[] = {
+static int parser_action_row815[] = {
        1,
        -1, 1, 227
 };
-static int parser_action_row814[] = {
+static int parser_action_row816[] = {
        32,
        -1, 1, 360,
        0, 0, 1,
        1, 0, 2,
-       9, 0, 467,
+       9, 0, 469,
        12, 0, 27,
        15, 0, 29,
        18, 0, 30,
@@ -9359,7 +9371,7 @@ static int parser_action_row814[] = {
        90, 0, 55,
        93, 0, 56
 };
-static int parser_action_row815[] = {
+static int parser_action_row817[] = {
        23,
        -1, 1, 346,
        12, 0, 108,
@@ -9373,7 +9385,7 @@ static int parser_action_row815[] = {
        47, 0, 115,
        48, 0, 116,
        51, 0, 117,
-       54, 0, 385,
+       54, 0, 386,
        68, 0, 119,
        83, 0, 49,
        84, 0, 50,
@@ -9385,33 +9397,33 @@ static int parser_action_row815[] = {
        90, 0, 55,
        93, 0, 124
 };
-static int parser_action_row816[] = {
+static int parser_action_row818[] = {
        3,
        -1, 1, 358,
-       12, 0, 960,
-       84, 0, 389
+       12, 0, 962,
+       84, 0, 390
 };
-static int parser_action_row817[] = {
+static int parser_action_row819[] = {
        1,
        -1, 1, 232
 };
-static int parser_action_row818[] = {
+static int parser_action_row820[] = {
        3,
        -1, 1, 378,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row819[] = {
+static int parser_action_row821[] = {
        3,
        -1, 1, 378,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row820[] = {
+static int parser_action_row822[] = {
        1,
        -1, 1, 352
 };
-static int parser_action_row821[] = {
+static int parser_action_row823[] = {
        22,
        -1, 1, 360,
        12, 0, 153,
@@ -9436,62 +9448,62 @@ static int parser_action_row821[] = {
        90, 0, 55,
        93, 0, 56
 };
-static int parser_action_row822[] = {
+static int parser_action_row824[] = {
        3,
        -1, 1, 276,
        56, 1, 278,
        66, 1, 278
 };
-static int parser_action_row823[] = {
+static int parser_action_row825[] = {
        3,
        -1, 1, 378,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row824[] = {
+static int parser_action_row826[] = {
        3,
        -1, 1, 378,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row825[] = {
+static int parser_action_row827[] = {
        1,
        -1, 1, 831
 };
-static int parser_action_row826[] = {
+static int parser_action_row828[] = {
        2,
        -1, 1, 156,
-       58, 0, 823
+       58, 0, 825
 };
-static int parser_action_row827[] = {
+static int parser_action_row829[] = {
        2,
-       -1, 3, 826,
-       57, 0, 967
+       -1, 3, 828,
+       57, 0, 969
 };
-static int parser_action_row828[] = {
+static int parser_action_row830[] = {
        3,
        -1, 1, 378,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row829[] = {
+static int parser_action_row831[] = {
        1,
        -1, 1, 286
 };
-static int parser_action_row830[] = {
+static int parser_action_row832[] = {
        2,
-       -1, 3, 829,
-       84, 0, 389
+       -1, 3, 831,
+       84, 0, 390
 };
-static int parser_action_row831[] = {
+static int parser_action_row833[] = {
        1,
        -1, 1, 314
 };
-static int parser_action_row832[] = {
+static int parser_action_row834[] = {
        1,
        -1, 1, 735
 };
-static int parser_action_row833[] = {
+static int parser_action_row835[] = {
        24,
        -1, 1, 742,
        12, 0, 153,
@@ -9518,11 +9530,11 @@ static int parser_action_row833[] = {
        90, 0, 55,
        93, 0, 56
 };
-static int parser_action_row834[] = {
+static int parser_action_row836[] = {
        1,
        -1, 1, 743
 };
-static int parser_action_row835[] = {
+static int parser_action_row837[] = {
        24,
        -1, 1, 737,
        12, 0, 153,
@@ -9549,312 +9561,312 @@ static int parser_action_row835[] = {
        90, 0, 55,
        93, 0, 56
 };
-static int parser_action_row836[] = {
+static int parser_action_row838[] = {
        1,
        -1, 1, 738
 };
-static int parser_action_row837[] = {
+static int parser_action_row839[] = {
        3,
-       -1, 3, 836,
-       50, 0, 346,
-       83, 0, 347
+       -1, 3, 838,
+       50, 0, 347,
+       83, 0, 348
 };
-static int parser_action_row838[] = {
+static int parser_action_row840[] = {
        3,
        -1, 1, 378,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row839[] = {
+static int parser_action_row841[] = {
        2,
-       -1, 3, 838,
-       55, 0, 973
+       -1, 3, 840,
+       55, 0, 975
 };
-static int parser_action_row840[] = {
+static int parser_action_row842[] = {
        3,
        -1, 1, 378,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row841[] = {
+static int parser_action_row843[] = {
        1,
        -1, 1, 841
 };
-static int parser_action_row842[] = {
+static int parser_action_row844[] = {
        2,
        -1, 1, 330,
-       58, 0, 839
+       58, 0, 841
 };
-static int parser_action_row843[] = {
+static int parser_action_row845[] = {
        3,
        -1, 1, 378,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row844[] = {
+static int parser_action_row846[] = {
        2,
-       -1, 3, 843,
-       57, 0, 977
+       -1, 3, 845,
+       57, 0, 979
 };
-static int parser_action_row845[] = {
+static int parser_action_row847[] = {
        3,
        -1, 1, 378,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row846[] = {
+static int parser_action_row848[] = {
        2,
        -1, 1, 342,
        54, 0, 242
 };
-static int parser_action_row847[] = {
+static int parser_action_row849[] = {
        3,
        -1, 1, 378,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row848[] = {
+static int parser_action_row850[] = {
        3,
        -1, 1, 378,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row849[] = {
+static int parser_action_row851[] = {
        3,
        -1, 1, 378,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row850[] = {
+static int parser_action_row852[] = {
        3,
        -1, 1, 378,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row851[] = {
+static int parser_action_row853[] = {
        2,
        -1, 1, 316,
        82, 0, 183
 };
-static int parser_action_row852[] = {
+static int parser_action_row854[] = {
        2,
        -1, 1, 316,
        82, 0, 183
 };
-static int parser_action_row853[] = {
+static int parser_action_row855[] = {
        2,
        -1, 1, 316,
        82, 0, 183
 };
-static int parser_action_row854[] = {
+static int parser_action_row856[] = {
        2,
        -1, 1, 316,
        82, 0, 183
 };
-static int parser_action_row855[] = {
+static int parser_action_row857[] = {
        16,
        -1, 1, 360,
-       12, 0, 845,
-       41, 0, 988,
-       45, 0, 850,
-       46, 0, 851,
-       47, 0, 852,
-       48, 0, 853,
-       54, 0, 855,
+       12, 0, 847,
+       41, 0, 990,
+       45, 0, 852,
+       46, 0, 853,
+       47, 0, 854,
+       48, 0, 855,
+       54, 0, 857,
        83, 0, 49,
        84, 0, 50,
-       86, 0, 857,
-       87, 0, 858,
-       88, 0, 859,
-       89, 0, 860,
+       86, 0, 859,
+       87, 0, 860,
+       88, 0, 861,
+       89, 0, 862,
        90, 0, 55,
-       93, 0, 861
+       93, 0, 863
 };
-static int parser_action_row856[] = {
+static int parser_action_row858[] = {
        3,
        -1, 1, 378,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row857[] = {
+static int parser_action_row859[] = {
        3,
        -1, 1, 378,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row858[] = {
+static int parser_action_row860[] = {
        2,
        -1, 1, 316,
        82, 0, 183
 };
-static int parser_action_row859[] = {
+static int parser_action_row861[] = {
        2,
        -1, 1, 316,
        82, 0, 183
 };
-static int parser_action_row860[] = {
+static int parser_action_row862[] = {
        2,
        -1, 1, 316,
        82, 0, 183
 };
-static int parser_action_row861[] = {
+static int parser_action_row863[] = {
        2,
        -1, 1, 316,
        82, 0, 183
 };
-static int parser_action_row862[] = {
+static int parser_action_row864[] = {
        2,
        -1, 1, 316,
        82, 0, 183
 };
-static int parser_action_row863[] = {
+static int parser_action_row865[] = {
        1,
        -1, 1, 445
 };
-static int parser_action_row864[] = {
+static int parser_action_row866[] = {
        3,
-       -1, 3, 863,
-       44, 0, 998,
-       85, 0, 999
+       -1, 3, 865,
+       44, 0, 1000,
+       85, 0, 1001
 };
-static int parser_action_row865[] = {
+static int parser_action_row867[] = {
        2,
        -1, 1, 342,
        54, 0, 242
 };
-static int parser_action_row866[] = {
+static int parser_action_row868[] = {
        3,
        -1, 1, 378,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row867[] = {
+static int parser_action_row869[] = {
        4,
        -1, 1, 394,
-       32, 0, 1002,
-       33, 0, 1003,
-       35, 0, 1004
+       32, 0, 1004,
+       33, 0, 1005,
+       35, 0, 1006
 };
-static int parser_action_row868[] = {
+static int parser_action_row870[] = {
        1,
        -1, 1, 396
 };
-static int parser_action_row869[] = {
+static int parser_action_row871[] = {
        3,
        -1, 1, 401,
-       76, 0, 1005,
-       79, 0, 1006
+       76, 0, 1007,
+       79, 0, 1008
 };
-static int parser_action_row870[] = {
+static int parser_action_row872[] = {
        11,
        -1, 1, 403,
-       42, 0, 1007,
-       67, 0, 1008,
-       68, 0, 1009,
-       72, 0, 1010,
-       73, 0, 1011,
-       74, 0, 1012,
-       75, 0, 1013,
-       77, 0, 1014,
-       78, 0, 1015,
-       80, 0, 1016
+       42, 0, 1009,
+       67, 0, 1010,
+       68, 0, 1011,
+       72, 0, 1012,
+       73, 0, 1013,
+       74, 0, 1014,
+       75, 0, 1015,
+       77, 0, 1016,
+       78, 0, 1017,
+       80, 0, 1018
 };
-static int parser_action_row871[] = {
+static int parser_action_row873[] = {
        4,
        -1, 1, 414,
-       69, 0, 1017,
-       70, 0, 1018,
-       71, 0, 1019
+       69, 0, 1019,
+       70, 0, 1020,
+       71, 0, 1021
 };
-static int parser_action_row872[] = {
+static int parser_action_row874[] = {
        1,
        -1, 1, 417
 };
-static int parser_action_row873[] = {
+static int parser_action_row875[] = {
        1,
        -1, 1, 421
 };
-static int parser_action_row874[] = {
+static int parser_action_row876[] = {
        2,
        -1, 1, 424,
-       66, 0, 1020
+       66, 0, 1022
 };
-static int parser_action_row875[] = {
+static int parser_action_row877[] = {
        1,
        -1, 1, 17
 };
-static int parser_action_row876[] = {
+static int parser_action_row878[] = {
        3,
        -1, 1, 316,
-       59, 0, 624,
+       59, 0, 626,
        82, 0, 183
 };
-static int parser_action_row877[] = {
+static int parser_action_row879[] = {
        2,
-       -1, 3, 876,
-       55, 0, 1024
+       -1, 3, 878,
+       55, 0, 1026
 };
-static int parser_action_row878[] = {
+static int parser_action_row880[] = {
        4,
        -1, 1, 378,
        0, 0, 1,
        1, 0, 2,
-       58, 0, 1025
+       58, 0, 1027
 };
-static int parser_action_row879[] = {
+static int parser_action_row881[] = {
        1,
        -1, 1, 158
 };
-static int parser_action_row880[] = {
+static int parser_action_row882[] = {
        20,
-       -1, 3, 879,
-       44, 0, 1029,
-       50, 0, 346,
-       56, 0, 488,
-       67, 0, 489,
-       68, 0, 490,
-       69, 0, 491,
-       70, 0, 492,
-       71, 0, 493,
-       72, 0, 494,
-       73, 0, 495,
-       74, 0, 496,
-       75, 0, 497,
-       76, 0, 498,
-       77, 0, 499,
-       78, 0, 500,
-       79, 0, 501,
-       80, 0, 502,
-       83, 0, 347,
-       84, 0, 503
+       -1, 3, 881,
+       44, 0, 1031,
+       50, 0, 347,
+       56, 0, 490,
+       67, 0, 491,
+       68, 0, 492,
+       69, 0, 493,
+       70, 0, 494,
+       71, 0, 495,
+       72, 0, 496,
+       73, 0, 497,
+       74, 0, 498,
+       75, 0, 499,
+       76, 0, 500,
+       77, 0, 501,
+       78, 0, 502,
+       79, 0, 503,
+       80, 0, 504,
+       83, 0, 348,
+       84, 0, 505
 };
-static int parser_action_row881[] = {
+static int parser_action_row883[] = {
        2,
        -1, 1, 143,
-       89, 0, 1035
+       89, 0, 1037
 };
-static int parser_action_row882[] = {
+static int parser_action_row884[] = {
        2,
        -1, 1, 389,
        15, 1, 88
 };
-static int parser_action_row883[] = {
+static int parser_action_row885[] = {
        3,
        -1, 1, 378,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row884[] = {
+static int parser_action_row886[] = {
        2,
        -1, 1, 371,
-       9, 0, 1038
+       9, 0, 1040
 };
-static int parser_action_row885[] = {
+static int parser_action_row887[] = {
        32,
        -1, 1, 360,
        0, 0, 1,
        1, 0, 2,
-       9, 0, 467,
+       9, 0, 469,
        12, 0, 27,
        15, 0, 29,
        18, 0, 30,
@@ -9884,61 +9896,61 @@ static int parser_action_row885[] = {
        90, 0, 55,
        93, 0, 56
 };
-static int parser_action_row886[] = {
+static int parser_action_row888[] = {
        1,
        -1, 1, 388
 };
-static int parser_action_row887[] = {
+static int parser_action_row889[] = {
        2,
-       -1, 3, 886,
-       83, 0, 1041
+       -1, 3, 888,
+       83, 0, 1043
 };
-static int parser_action_row888[] = {
+static int parser_action_row890[] = {
        1,
        -1, 1, 821
 };
-static int parser_action_row889[] = {
+static int parser_action_row891[] = {
        1,
        -1, 1, 823
 };
-static int parser_action_row890[] = {
+static int parser_action_row892[] = {
        3,
-       -1, 3, 889,
+       -1, 3, 891,
        0, 0, 83,
        1, 0, 84
 };
-static int parser_action_row891[] = {
+static int parser_action_row893[] = {
        3,
        -1, 1, 378,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row892[] = {
+static int parser_action_row894[] = {
        6,
        -1, 1, 42,
-       4, 0, 1047,
-       9, 0, 1048,
+       4, 0, 1049,
+       9, 0, 1050,
        13, 0, 28,
-       44, 0, 1049,
-       84, 0, 1050
+       44, 0, 1051,
+       84, 0, 1052
 };
-static int parser_action_row893[] = {
+static int parser_action_row895[] = {
        1,
        -1, 1, 851
 };
-static int parser_action_row894[] = {
+static int parser_action_row896[] = {
        3,
        -1, 1, 378,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row895[] = {
+static int parser_action_row897[] = {
        3,
        -1, 1, 378,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row896[] = {
+static int parser_action_row898[] = {
        5,
        -1, 1, 378,
        0, 0, 1,
@@ -9946,47 +9958,47 @@ static int parser_action_row896[] = {
        31, 0, 35,
        96, 0, 57
 };
-static int parser_action_row897[] = {
+static int parser_action_row899[] = {
        1,
        -1, 1, 367
 };
-static int parser_action_row898[] = {
+static int parser_action_row900[] = {
        2,
-       -1, 3, 897,
-       48, 0, 1065
+       -1, 3, 899,
+       48, 0, 1067
 };
-static int parser_action_row899[] = {
+static int parser_action_row901[] = {
        4,
-       -1, 3, 898,
-       34, 0, 1066,
-       50, 0, 346,
-       83, 0, 347
+       -1, 3, 900,
+       34, 0, 1068,
+       50, 0, 347,
+       83, 0, 348
 };
-static int parser_action_row900[] = {
+static int parser_action_row902[] = {
        1,
        -1, 1, 209
 };
-static int parser_action_row901[] = {
+static int parser_action_row903[] = {
        1,
        -1, 1, 214
 };
-static int parser_action_row902[] = {
+static int parser_action_row904[] = {
        1,
        -1, 1, 211
 };
-static int parser_action_row903[] = {
+static int parser_action_row905[] = {
        1,
        -1, 1, 216
 };
-static int parser_action_row904[] = {
+static int parser_action_row906[] = {
        1,
        -1, 1, 197
 };
-static int parser_action_row905[] = {
+static int parser_action_row907[] = {
        1,
        -1, 1, 328
 };
-static int parser_action_row906[] = {
+static int parser_action_row908[] = {
        24,
        -1, 1, 753,
        12, 0, 153,
@@ -10013,7 +10025,7 @@ static int parser_action_row906[] = {
        90, 0, 55,
        93, 0, 56
 };
-static int parser_action_row907[] = {
+static int parser_action_row909[] = {
        25,
        -1, 1, 760,
        12, 0, 153,
@@ -10041,7 +10053,7 @@ static int parser_action_row907[] = {
        90, 0, 55,
        93, 0, 56
 };
-static int parser_action_row908[] = {
+static int parser_action_row910[] = {
        25,
        -1, 1, 755,
        12, 0, 153,
@@ -10069,215 +10081,215 @@ static int parser_action_row908[] = {
        90, 0, 55,
        93, 0, 56
 };
-static int parser_action_row909[] = {
+static int parser_action_row911[] = {
        1,
        -1, 1, 759
 };
-static int parser_action_row910[] = {
+static int parser_action_row912[] = {
        2,
-       -1, 3, 909,
-       11, 0, 1073
+       -1, 3, 911,
+       11, 0, 1075
 };
-static int parser_action_row911[] = {
+static int parser_action_row913[] = {
        3,
        -1, 1, 378,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row912[] = {
+static int parser_action_row914[] = {
        1,
        -1, 1, 559
 };
-static int parser_action_row913[] = {
+static int parser_action_row915[] = {
        1,
        -1, 1, 751
 };
-static int parser_action_row914[] = {
+static int parser_action_row916[] = {
        1,
        -1, 1, 764
 };
-static int parser_action_row915[] = {
+static int parser_action_row917[] = {
        1,
        -1, 1, 766
 };
-static int parser_action_row916[] = {
+static int parser_action_row918[] = {
        1,
        -1, 1, 765
 };
-static int parser_action_row917[] = {
+static int parser_action_row919[] = {
        1,
        -1, 1, 767
 };
-static int parser_action_row918[] = {
+static int parser_action_row920[] = {
        1,
        -1, 1, 768
 };
-static int parser_action_row919[] = {
+static int parser_action_row921[] = {
        3,
-       -1, 3, 918,
+       -1, 3, 920,
        0, 0, 83,
        1, 0, 84
 };
-static int parser_action_row920[] = {
+static int parser_action_row922[] = {
        3,
-       -1, 3, 919,
+       -1, 3, 921,
        44, 0, 262,
-       85, 0, 1076
+       85, 0, 1078
 };
-static int parser_action_row921[] = {
+static int parser_action_row923[] = {
        2,
        -1, 1, 342,
        54, 0, 242
 };
-static int parser_action_row922[] = {
+static int parser_action_row924[] = {
        1,
        -1, 1, 323
 };
-static int parser_action_row923[] = {
+static int parser_action_row925[] = {
        1,
        -1, 1, 752
 };
-static int parser_action_row924[] = {
+static int parser_action_row926[] = {
        1,
        -1, 1, 560
 };
-static int parser_action_row925[] = {
+static int parser_action_row927[] = {
        3,
        -1, 1, 526,
        56, 0, 207,
-       66, 0, 1078
+       66, 0, 1080
 };
-static int parser_action_row926[] = {
+static int parser_action_row928[] = {
        3,
-       -1, 3, 925,
+       -1, 3, 927,
        0, 0, 83,
        1, 0, 84
 };
-static int parser_action_row927[] = {
+static int parser_action_row929[] = {
        2,
        -1, 1, 557,
-       58, 0, 839
+       58, 0, 841
 };
-static int parser_action_row928[] = {
+static int parser_action_row930[] = {
        1,
        -1, 1, 561
 };
-static int parser_action_row929[] = {
+static int parser_action_row931[] = {
        3,
        -1, 1, 378,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row930[] = {
+static int parser_action_row932[] = {
        1,
        -1, 1, 538
 };
-static int parser_action_row931[] = {
+static int parser_action_row933[] = {
        2,
-       -1, 3, 930,
-       48, 0, 1083
+       -1, 3, 932,
+       48, 0, 1085
 };
-static int parser_action_row932[] = {
+static int parser_action_row934[] = {
        4,
-       -1, 3, 931,
-       34, 0, 1084,
-       50, 0, 346,
-       83, 0, 347
+       -1, 3, 933,
+       34, 0, 1086,
+       50, 0, 347,
+       83, 0, 348
 };
-static int parser_action_row933[] = {
+static int parser_action_row935[] = {
        3,
        -1, 1, 162,
        27, 1, 619,
        52, 1, 727
 };
-static int parser_action_row934[] = {
+static int parser_action_row936[] = {
        3,
        -1, 1, 161,
        27, 1, 618,
        52, 1, 726
 };
-static int parser_action_row935[] = {
+static int parser_action_row937[] = {
        2,
        -1, 1, 221,
        27, 1, 668
 };
-static int parser_action_row936[] = {
+static int parser_action_row938[] = {
        3,
        -1, 1, 205,
        27, 1, 654,
-       61, 0, 1086
+       61, 0, 1088
 };
-static int parser_action_row937[] = {
+static int parser_action_row939[] = {
        2,
        -1, 1, 160,
        59, 0, 290
 };
-static int parser_action_row938[] = {
+static int parser_action_row940[] = {
        3,
        -1, 1, 378,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row939[] = {
+static int parser_action_row941[] = {
        3,
        -1, 1, 378,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row940[] = {
+static int parser_action_row942[] = {
        2,
        -1, 1, 230,
        27, 1, 671
 };
-static int parser_action_row941[] = {
+static int parser_action_row943[] = {
        3,
        -1, 1, 378,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row942[] = {
+static int parser_action_row944[] = {
        3,
        -1, 1, 378,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row943[] = {
+static int parser_action_row945[] = {
        1,
        -1, 1, 634
 };
-static int parser_action_row944[] = {
+static int parser_action_row946[] = {
        1,
        -1, 1, 629
 };
-static int parser_action_row945[] = {
+static int parser_action_row947[] = {
        2,
-       -1, 3, 944,
-       27, 0, 1092
+       -1, 3, 946,
+       27, 0, 1094
 };
-static int parser_action_row946[] = {
+static int parser_action_row948[] = {
        32,
        -1, 1, 360,
        0, 0, 1,
        1, 0, 2,
-       9, 0, 1093,
-       12, 0, 666,
-       15, 0, 667,
-       18, 0, 668,
-       25, 0, 669,
-       28, 0, 671,
-       29, 0, 672,
-       30, 0, 673,
-       36, 0, 674,
-       37, 0, 675,
-       38, 0, 676,
-       39, 0, 677,
-       40, 0, 678,
+       9, 0, 1095,
+       12, 0, 668,
+       15, 0, 669,
+       18, 0, 670,
+       25, 0, 671,
+       28, 0, 673,
+       29, 0, 674,
+       30, 0, 675,
+       36, 0, 676,
+       37, 0, 677,
+       38, 0, 678,
+       39, 0, 679,
+       40, 0, 680,
        41, 0, 41,
        45, 0, 42,
        46, 0, 43,
        47, 0, 44,
        48, 0, 45,
-       53, 0, 679,
+       53, 0, 681,
        54, 0, 47,
        56, 0, 48,
        83, 0, 49,
@@ -10289,20 +10301,20 @@ static int parser_action_row946[] = {
        90, 0, 55,
        93, 0, 56
 };
-static int parser_action_row947[] = {
+static int parser_action_row949[] = {
        2,
-       -1, 3, 946,
-       59, 0, 1096
+       -1, 3, 948,
+       59, 0, 1098
 };
-static int parser_action_row948[] = {
+static int parser_action_row950[] = {
        5,
        -1, 1, 360,
-       12, 0, 1097,
-       49, 0, 508,
+       12, 0, 1099,
+       49, 0, 510,
        83, 0, 49,
        84, 0, 50
 };
-static int parser_action_row949[] = {
+static int parser_action_row951[] = {
        22,
        -1, 1, 360,
        12, 0, 153,
@@ -10327,7 +10339,7 @@ static int parser_action_row949[] = {
        90, 0, 55,
        93, 0, 56
 };
-static int parser_action_row950[] = {
+static int parser_action_row952[] = {
        22,
        -1, 1, 360,
        12, 0, 153,
@@ -10352,12 +10364,12 @@ static int parser_action_row950[] = {
        90, 0, 55,
        93, 0, 56
 };
-static int parser_action_row951[] = {
+static int parser_action_row953[] = {
        2,
        -1, 1, 193,
        27, 1, 643
 };
-static int parser_action_row952[] = {
+static int parser_action_row954[] = {
        22,
        -1, 1, 360,
        12, 0, 153,
@@ -10382,7 +10394,7 @@ static int parser_action_row952[] = {
        90, 0, 55,
        93, 0, 56
 };
-static int parser_action_row953[] = {
+static int parser_action_row955[] = {
        22,
        -1, 1, 360,
        12, 0, 153,
@@ -10407,7 +10419,7 @@ static int parser_action_row953[] = {
        90, 0, 55,
        93, 0, 56
 };
-static int parser_action_row954[] = {
+static int parser_action_row956[] = {
        22,
        -1, 1, 360,
        12, 0, 153,
@@ -10432,7 +10444,7 @@ static int parser_action_row954[] = {
        90, 0, 55,
        93, 0, 56
 };
-static int parser_action_row955[] = {
+static int parser_action_row957[] = {
        22,
        -1, 1, 360,
        12, 0, 153,
@@ -10457,31 +10469,31 @@ static int parser_action_row955[] = {
        90, 0, 55,
        93, 0, 56
 };
-static int parser_action_row956[] = {
+static int parser_action_row958[] = {
        2,
        -1, 1, 199,
        27, 1, 649
 };
-static int parser_action_row957[] = {
+static int parser_action_row959[] = {
        1,
        -1, 1, 225
 };
-static int parser_action_row958[] = {
+static int parser_action_row960[] = {
        3,
-       -1, 3, 957,
+       -1, 3, 959,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row959[] = {
+static int parser_action_row961[] = {
        1,
        -1, 1, 223
 };
-static int parser_action_row960[] = {
+static int parser_action_row962[] = {
        2,
        -1, 1, 201,
        27, 1, 651
 };
-static int parser_action_row961[] = {
+static int parser_action_row963[] = {
        23,
        -1, 1, 346,
        12, 0, 108,
@@ -10495,7 +10507,7 @@ static int parser_action_row961[] = {
        47, 0, 115,
        48, 0, 116,
        51, 0, 117,
-       54, 0, 385,
+       54, 0, 386,
        68, 0, 119,
        83, 0, 49,
        84, 0, 50,
@@ -10507,74 +10519,74 @@ static int parser_action_row961[] = {
        90, 0, 55,
        93, 0, 124
 };
-static int parser_action_row962[] = {
+static int parser_action_row964[] = {
        2,
-       -1, 3, 961,
-       31, 0, 1109
+       -1, 3, 963,
+       31, 0, 1111
 };
-static int parser_action_row963[] = {
+static int parser_action_row965[] = {
        2,
-       -1, 3, 962,
-       15, 0, 1110
+       -1, 3, 964,
+       15, 0, 1112
 };
-static int parser_action_row964[] = {
+static int parser_action_row966[] = {
        3,
        -1, 1, 378,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row965[] = {
+static int parser_action_row967[] = {
        2,
-       -1, 3, 964,
-       57, 0, 1112
+       -1, 3, 966,
+       57, 0, 1114
 };
-static int parser_action_row966[] = {
+static int parser_action_row968[] = {
        3,
-       -1, 3, 965,
-       50, 0, 346,
-       83, 0, 347
+       -1, 3, 967,
+       50, 0, 347,
+       83, 0, 348
 };
-static int parser_action_row967[] = {
+static int parser_action_row969[] = {
        1,
        -1, 1, 832
 };
-static int parser_action_row968[] = {
+static int parser_action_row970[] = {
        2,
        -1, 1, 555,
-       82, 0, 472
+       82, 0, 474
 };
-static int parser_action_row969[] = {
+static int parser_action_row971[] = {
        2,
-       -1, 3, 968,
-       55, 0, 1115
+       -1, 3, 970,
+       55, 0, 1117
 };
-static int parser_action_row970[] = {
+static int parser_action_row972[] = {
        1,
        -1, 1, 744
 };
-static int parser_action_row971[] = {
+static int parser_action_row973[] = {
        1,
        -1, 1, 739
 };
-static int parser_action_row972[] = {
+static int parser_action_row974[] = {
        2,
-       -1, 3, 971,
-       59, 0, 1116
+       -1, 3, 973,
+       59, 0, 1118
 };
-static int parser_action_row973[] = {
+static int parser_action_row975[] = {
        5,
        -1, 1, 360,
-       12, 0, 595,
-       49, 0, 508,
+       12, 0, 597,
+       49, 0, 510,
        83, 0, 49,
        84, 0, 50
 };
-static int parser_action_row974[] = {
+static int parser_action_row976[] = {
        2,
        -1, 1, 316,
        82, 0, 183
 };
-static int parser_action_row975[] = {
+static int parser_action_row977[] = {
        35,
        -1, 1, 360,
        12, 0, 153,
@@ -10585,10 +10597,10 @@ static int parser_action_row975[] = {
        29, 0, 33,
        30, 0, 34,
        34, 0, 155,
-       36, 0, 716,
-       37, 0, 717,
-       38, 0, 718,
-       39, 0, 719,
+       36, 0, 718,
+       37, 0, 719,
+       38, 0, 720,
+       39, 0, 721,
        40, 0, 40,
        41, 0, 156,
        43, 0, 157,
@@ -10596,14 +10608,14 @@ static int parser_action_row975[] = {
        46, 0, 43,
        47, 0, 44,
        48, 0, 45,
-       50, 0, 346,
+       50, 0, 347,
        51, 0, 158,
-       53, 0, 720,
+       53, 0, 722,
        54, 0, 47,
        56, 0, 48,
        68, 0, 159,
        82, 0, 183,
-       83, 0, 721,
+       83, 0, 723,
        84, 0, 50,
        86, 0, 51,
        87, 0, 52,
@@ -10612,29 +10624,29 @@ static int parser_action_row975[] = {
        90, 0, 55,
        93, 0, 56
 };
-static int parser_action_row976[] = {
+static int parser_action_row978[] = {
        1,
        -1, 1, 842
 };
-static int parser_action_row977[] = {
+static int parser_action_row979[] = {
        2,
-       -1, 3, 976,
-       57, 0, 1120
+       -1, 3, 978,
+       57, 0, 1122
 };
-static int parser_action_row978[] = {
+static int parser_action_row980[] = {
        2,
        -1, 1, 316,
        82, 0, 183
 };
-static int parser_action_row979[] = {
+static int parser_action_row981[] = {
        1,
        -1, 1, 350
 };
-static int parser_action_row980[] = {
+static int parser_action_row982[] = {
        1,
        -1, 1, 434
 };
-static int parser_action_row981[] = {
+static int parser_action_row983[] = {
        22,
        -1, 1, 360,
        12, 0, 153,
@@ -10659,91 +10671,91 @@ static int parser_action_row981[] = {
        90, 0, 55,
        93, 0, 56
 };
-static int parser_action_row982[] = {
+static int parser_action_row984[] = {
        20,
        -1, 1, 360,
-       12, 0, 845,
-       34, 0, 847,
-       41, 0, 848,
-       43, 0, 849,
-       45, 0, 850,
-       46, 0, 851,
-       47, 0, 852,
-       48, 0, 853,
-       51, 0, 854,
-       54, 0, 855,
-       68, 0, 856,
+       12, 0, 847,
+       34, 0, 849,
+       41, 0, 850,
+       43, 0, 851,
+       45, 0, 852,
+       46, 0, 853,
+       47, 0, 854,
+       48, 0, 855,
+       51, 0, 856,
+       54, 0, 857,
+       68, 0, 858,
        83, 0, 49,
        84, 0, 50,
-       86, 0, 857,
-       87, 0, 858,
-       88, 0, 859,
-       89, 0, 860,
+       86, 0, 859,
+       87, 0, 860,
+       88, 0, 861,
+       89, 0, 862,
        90, 0, 55,
-       93, 0, 861
+       93, 0, 863
 };
-static int parser_action_row983[] = {
+static int parser_action_row985[] = {
        3,
-       -1, 3, 982,
-       50, 0, 1124,
-       83, 0, 1125
+       -1, 3, 984,
+       50, 0, 1126,
+       83, 0, 1127
 };
-static int parser_action_row984[] = {
+static int parser_action_row986[] = {
        19,
        -1, 1, 360,
-       12, 0, 845,
-       41, 0, 848,
-       43, 0, 849,
-       45, 0, 850,
-       46, 0, 851,
-       47, 0, 852,
-       48, 0, 853,
-       51, 0, 854,
-       54, 0, 855,
-       68, 0, 856,
+       12, 0, 847,
+       41, 0, 850,
+       43, 0, 851,
+       45, 0, 852,
+       46, 0, 853,
+       47, 0, 854,
+       48, 0, 855,
+       51, 0, 856,
+       54, 0, 857,
+       68, 0, 858,
        83, 0, 49,
        84, 0, 50,
-       86, 0, 857,
-       87, 0, 858,
-       88, 0, 859,
-       89, 0, 860,
+       86, 0, 859,
+       87, 0, 860,
+       88, 0, 861,
+       89, 0, 862,
        90, 0, 55,
-       93, 0, 861
+       93, 0, 863
 };
-static int parser_action_row985[] = {
+static int parser_action_row987[] = {
        1,
        -1, 1, 436
 };
-static int parser_action_row986[] = {
+static int parser_action_row988[] = {
        1,
        -1, 1, 437
 };
-static int parser_action_row987[] = {
+static int parser_action_row989[] = {
        1,
        -1, 1, 438
 };
-static int parser_action_row988[] = {
+static int parser_action_row990[] = {
        1,
        -1, 1, 439
 };
-static int parser_action_row989[] = {
+static int parser_action_row991[] = {
        3,
        -1, 1, 378,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row990[] = {
+static int parser_action_row992[] = {
        3,
-       -1, 3, 989,
-       44, 0, 998,
-       85, 0, 1129
+       -1, 3, 991,
+       44, 0, 1000,
+       85, 0, 1131
 };
-static int parser_action_row991[] = {
+static int parser_action_row993[] = {
        2,
-       -1, 3, 990,
-       66, 0, 1130
+       -1, 3, 992,
+       66, 0, 1132
 };
-static int parser_action_row992[] = {
+static int parser_action_row994[] = {
        22,
        -1, 1, 360,
        12, 0, 153,
@@ -10768,79 +10780,66 @@ static int parser_action_row992[] = {
        90, 0, 55,
        93, 0, 56
 };
-static int parser_action_row993[] = {
+static int parser_action_row995[] = {
        19,
        -1, 1, 360,
-       12, 0, 845,
-       41, 0, 848,
-       43, 0, 849,
-       45, 0, 850,
-       46, 0, 851,
-       47, 0, 852,
-       48, 0, 853,
-       51, 0, 854,
-       54, 0, 855,
-       68, 0, 856,
+       12, 0, 847,
+       41, 0, 850,
+       43, 0, 851,
+       45, 0, 852,
+       46, 0, 853,
+       47, 0, 854,
+       48, 0, 855,
+       51, 0, 856,
+       54, 0, 857,
+       68, 0, 858,
        83, 0, 49,
        84, 0, 50,
-       86, 0, 857,
-       87, 0, 858,
-       88, 0, 859,
-       89, 0, 860,
+       86, 0, 859,
+       87, 0, 860,
+       88, 0, 861,
+       89, 0, 862,
        90, 0, 55,
-       93, 0, 861
+       93, 0, 863
 };
-static int parser_action_row994[] = {
+static int parser_action_row996[] = {
        1,
        -1, 1, 440
 };
-static int parser_action_row995[] = {
+static int parser_action_row997[] = {
        1,
        -1, 1, 441
 };
-static int parser_action_row996[] = {
+static int parser_action_row998[] = {
        1,
        -1, 1, 442
 };
-static int parser_action_row997[] = {
+static int parser_action_row999[] = {
        1,
        -1, 1, 444
 };
-static int parser_action_row998[] = {
+static int parser_action_row1000[] = {
        1,
        -1, 1, 443
 };
-static int parser_action_row999[] = {
+static int parser_action_row1001[] = {
        2,
        -1, 1, 342,
        54, 0, 242
 };
-static int parser_action_row1000[] = {
+static int parser_action_row1002[] = {
        1,
        -1, 1, 429
 };
-static int parser_action_row1001[] = {
+static int parser_action_row1003[] = {
        1,
        -1, 1, 431
 };
-static int parser_action_row1002[] = {
-       3,
-       -1, 3, 1001,
-       56, 0, 1134,
-       57, 0, 1135
-};
-static int parser_action_row1003[] = {
-       3,
-       -1, 1, 378,
-       0, 0, 1,
-       1, 0, 2
-};
 static int parser_action_row1004[] = {
-       4,
-       -1, 1, 378,
-       0, 0, 1,
-       1, 0, 2,
-       27, 0, 1137
+       3,
+       -1, 3, 1003,
+       56, 0, 1136,
+       57, 0, 1137
 };
 static int parser_action_row1005[] = {
        3,
@@ -10849,10 +10848,11 @@ static int parser_action_row1005[] = {
        1, 0, 2
 };
 static int parser_action_row1006[] = {
-       3,
+       4,
        -1, 1, 378,
        0, 0, 1,
-       1, 0, 2
+       1, 0, 2,
+       27, 0, 1139
 };
 static int parser_action_row1007[] = {
        3,
@@ -10945,172 +10945,184 @@ static int parser_action_row1021[] = {
        1, 0, 2
 };
 static int parser_action_row1022[] = {
+       3,
+       -1, 1, 378,
+       0, 0, 1,
+       1, 0, 2
+};
+static int parser_action_row1023[] = {
+       3,
+       -1, 1, 378,
+       0, 0, 1,
+       1, 0, 2
+};
+static int parser_action_row1024[] = {
        2,
        -1, 1, 123,
-       64, 0, 1156
+       64, 0, 1158
 };
-static int parser_action_row1023[] = {
+static int parser_action_row1025[] = {
        2,
        -1, 1, 315,
-       59, 0, 624
+       59, 0, 626
 };
-static int parser_action_row1024[] = {
+static int parser_action_row1026[] = {
        1,
        -1, 1, 122
 };
-static int parser_action_row1025[] = {
+static int parser_action_row1027[] = {
        4,
        -1, 1, 378,
        0, 0, 1,
        1, 0, 2,
-       59, 0, 624
+       59, 0, 626
 };
-static int parser_action_row1026[] = {
+static int parser_action_row1028[] = {
        3,
        -1, 1, 378,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row1027[] = {
+static int parser_action_row1029[] = {
        1,
        -1, 1, 827
 };
-static int parser_action_row1028[] = {
+static int parser_action_row1030[] = {
        1,
        -1, 1, 118
 };
-static int parser_action_row1029[] = {
+static int parser_action_row1031[] = {
        4,
        -1, 1, 378,
        0, 0, 1,
        1, 0, 2,
-       58, 0, 1025
+       58, 0, 1027
 };
-static int parser_action_row1030[] = {
+static int parser_action_row1032[] = {
        1,
        -1, 1, 133
 };
-static int parser_action_row1031[] = {
+static int parser_action_row1033[] = {
        1,
        -1, 1, 134
 };
-static int parser_action_row1032[] = {
+static int parser_action_row1034[] = {
        2,
        -1, 1, 127,
-       58, 0, 1163
+       58, 0, 1165
 };
-static int parser_action_row1033[] = {
+static int parser_action_row1035[] = {
        1,
        -1, 1, 131
 };
-static int parser_action_row1034[] = {
+static int parser_action_row1036[] = {
        1,
        -1, 1, 132
 };
-static int parser_action_row1035[] = {
+static int parser_action_row1037[] = {
        2,
        -1, 1, 136,
-       66, 0, 1166
+       66, 0, 1168
 };
-static int parser_action_row1036[] = {
+static int parser_action_row1038[] = {
        1,
        -1, 1, 144
 };
-static int parser_action_row1037[] = {
+static int parser_action_row1039[] = {
        2,
        -1, 1, 129,
-       4, 0, 749
+       4, 0, 751
 };
-static int parser_action_row1038[] = {
+static int parser_action_row1040[] = {
        2,
        -1, 1, 89,
-       9, 0, 1168
+       9, 0, 1170
 };
-static int parser_action_row1039[] = {
+static int parser_action_row1041[] = {
        1,
        -1, 1, 372
 };
-static int parser_action_row1040[] = {
+static int parser_action_row1042[] = {
        1,
        -1, 1, 384
 };
-static int parser_action_row1041[] = {
+static int parser_action_row1043[] = {
        2,
        -1, 1, 371,
-       9, 0, 1038
+       9, 0, 1040
 };
-static int parser_action_row1042[] = {
+static int parser_action_row1044[] = {
        3,
        -1, 1, 160,
        59, 0, 290,
        82, 0, 183
 };
-static int parser_action_row1043[] = {
+static int parser_action_row1045[] = {
        4,
        -1, 1, 378,
        0, 0, 1,
        1, 0, 2,
-       58, 0, 1172
+       58, 0, 1174
 };
-static int parser_action_row1044[] = {
+static int parser_action_row1046[] = {
        1,
        -1, 1, 56
 };
-static int parser_action_row1045[] = {
+static int parser_action_row1047[] = {
        4,
        -1, 1, 42,
-       9, 0, 1176,
+       9, 0, 1178,
        13, 0, 28,
-       44, 0, 1049
+       44, 0, 1051
 };
-static int parser_action_row1046[] = {
+static int parser_action_row1048[] = {
        3,
        -1, 1, 378,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row1047[] = {
+static int parser_action_row1049[] = {
        3,
        -1, 1, 378,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row1048[] = {
+static int parser_action_row1050[] = {
        1,
        -1, 1, 814
 };
-static int parser_action_row1049[] = {
+static int parser_action_row1051[] = {
        1,
        -1, 1, 26
 };
-static int parser_action_row1050[] = {
+static int parser_action_row1052[] = {
        3,
        -1, 1, 378,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row1051[] = {
+static int parser_action_row1053[] = {
        1,
        -1, 1, 813
 };
-static int parser_action_row1052[] = {
+static int parser_action_row1054[] = {
        4,
        -1, 1, 92,
        22, 0, 199,
        23, 0, 200,
        24, 0, 201
 };
-static int parser_action_row1053[] = {
+static int parser_action_row1055[] = {
        2,
        -1, 1, 42,
        13, 0, 28
 };
-static int parser_action_row1054[] = {
+static int parser_action_row1056[] = {
        2,
        -1, 1, 42,
        13, 0, 28
 };
-static int parser_action_row1055[] = {
+static int parser_action_row1057[] = {
        36,
        -1, 1, 360,
        0, 0, 83,
@@ -11123,10 +11135,10 @@ static int parser_action_row1055[] = {
        29, 0, 33,
        30, 0, 34,
        34, 0, 110,
-       36, 0, 905,
-       37, 0, 906,
-       38, 0, 907,
-       39, 0, 908,
+       36, 0, 907,
+       37, 0, 908,
+       38, 0, 909,
+       39, 0, 910,
        40, 0, 40,
        41, 0, 111,
        43, 0, 112,
@@ -11134,13 +11146,13 @@ static int parser_action_row1055[] = {
        46, 0, 114,
        47, 0, 115,
        48, 0, 116,
-       50, 0, 346,
+       50, 0, 347,
        51, 0, 117,
-       53, 0, 909,
-       54, 0, 1185,
+       53, 0, 911,
+       54, 0, 1187,
        68, 0, 119,
        82, 0, 183,
-       83, 0, 721,
+       83, 0, 723,
        84, 0, 50,
        86, 0, 120,
        87, 0, 121,
@@ -11149,85 +11161,85 @@ static int parser_action_row1055[] = {
        90, 0, 55,
        93, 0, 124
 };
-static int parser_action_row1056[] = {
+static int parser_action_row1058[] = {
        1,
        -1, 1, 822
 };
-static int parser_action_row1057[] = {
+static int parser_action_row1059[] = {
        4,
        -1, 1, 42,
-       9, 0, 1189,
+       9, 0, 1191,
        13, 0, 28,
-       44, 0, 1049
+       44, 0, 1051
 };
-static int parser_action_row1058[] = {
+static int parser_action_row1060[] = {
        3,
        -1, 1, 378,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row1059[] = {
+static int parser_action_row1061[] = {
        1,
        -1, 1, 824
 };
-static int parser_action_row1060[] = {
+static int parser_action_row1062[] = {
        3,
        -1, 1, 42,
-       9, 0, 1191,
+       9, 0, 1193,
        13, 0, 28
 };
-static int parser_action_row1061[] = {
+static int parser_action_row1063[] = {
        3,
        -1, 1, 378,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row1062[] = {
+static int parser_action_row1064[] = {
        6,
        -1, 1, 42,
-       4, 0, 1047,
-       9, 0, 1195,
+       4, 0, 1049,
+       9, 0, 1197,
        13, 0, 28,
-       44, 0, 1049,
-       84, 0, 1050
+       44, 0, 1051,
+       84, 0, 1052
 };
-static int parser_action_row1063[] = {
+static int parser_action_row1065[] = {
        1,
        -1, 1, 852
 };
-static int parser_action_row1064[] = {
+static int parser_action_row1066[] = {
        3,
        -1, 1, 378,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row1065[] = {
+static int parser_action_row1067[] = {
        3,
        -1, 1, 378,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row1066[] = {
+static int parser_action_row1068[] = {
        1,
        -1, 1, 303
 };
-static int parser_action_row1067[] = {
+static int parser_action_row1069[] = {
        3,
        -1, 1, 378,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row1068[] = {
+static int parser_action_row1070[] = {
        3,
        -1, 1, 378,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row1069[] = {
+static int parser_action_row1071[] = {
        1,
        -1, 1, 754
 };
-static int parser_action_row1070[] = {
+static int parser_action_row1072[] = {
        24,
        -1, 1, 761,
        12, 0, 153,
@@ -11254,11 +11266,11 @@ static int parser_action_row1070[] = {
        90, 0, 55,
        93, 0, 56
 };
-static int parser_action_row1071[] = {
+static int parser_action_row1073[] = {
        1,
        -1, 1, 762
 };
-static int parser_action_row1072[] = {
+static int parser_action_row1074[] = {
        24,
        -1, 1, 756,
        12, 0, 153,
@@ -11285,17 +11297,17 @@ static int parser_action_row1072[] = {
        90, 0, 55,
        93, 0, 56
 };
-static int parser_action_row1073[] = {
+static int parser_action_row1075[] = {
        1,
        -1, 1, 757
 };
-static int parser_action_row1074[] = {
+static int parser_action_row1076[] = {
        3,
-       -1, 3, 1073,
-       50, 0, 346,
-       83, 0, 347
+       -1, 3, 1075,
+       50, 0, 347,
+       83, 0, 348
 };
-static int parser_action_row1075[] = {
+static int parser_action_row1077[] = {
        35,
        -1, 1, 360,
        12, 0, 153,
@@ -11306,10 +11318,10 @@ static int parser_action_row1075[] = {
        29, 0, 33,
        30, 0, 34,
        34, 0, 155,
-       36, 0, 716,
-       37, 0, 717,
-       38, 0, 718,
-       39, 0, 719,
+       36, 0, 718,
+       37, 0, 719,
+       38, 0, 720,
+       39, 0, 721,
        40, 0, 40,
        41, 0, 156,
        43, 0, 157,
@@ -11317,14 +11329,14 @@ static int parser_action_row1075[] = {
        46, 0, 43,
        47, 0, 44,
        48, 0, 45,
-       50, 0, 346,
+       50, 0, 347,
        51, 0, 158,
-       53, 0, 720,
+       53, 0, 722,
        54, 0, 47,
        56, 0, 48,
        68, 0, 159,
        82, 0, 183,
-       83, 0, 721,
+       83, 0, 723,
        84, 0, 50,
        86, 0, 51,
        87, 0, 52,
@@ -11333,124 +11345,124 @@ static int parser_action_row1075[] = {
        90, 0, 55,
        93, 0, 56
 };
-static int parser_action_row1076[] = {
+static int parser_action_row1078[] = {
        1,
        -1, 1, 324
 };
-static int parser_action_row1077[] = {
+static int parser_action_row1079[] = {
        4,
        -1, 1, 531,
-       61, 0, 1205,
-       62, 0, 371,
-       63, 0, 372
+       61, 0, 1207,
+       62, 0, 372,
+       63, 0, 373
 };
-static int parser_action_row1078[] = {
+static int parser_action_row1080[] = {
        4,
        -1, 1, 533,
-       61, 0, 1207,
-       62, 0, 371,
-       63, 0, 372
+       61, 0, 1209,
+       62, 0, 372,
+       63, 0, 373
 };
-static int parser_action_row1079[] = {
+static int parser_action_row1081[] = {
        3,
        -1, 1, 378,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row1080[] = {
+static int parser_action_row1082[] = {
        4,
        -1, 1, 537,
-       61, 0, 1210,
-       62, 0, 371,
-       63, 0, 372
+       61, 0, 1212,
+       62, 0, 372,
+       63, 0, 373
 };
-static int parser_action_row1081[] = {
+static int parser_action_row1083[] = {
        1,
        -1, 1, 327
 };
-static int parser_action_row1082[] = {
+static int parser_action_row1084[] = {
        2,
        -1, 1, 558,
-       58, 0, 839
+       58, 0, 841
 };
-static int parser_action_row1083[] = {
+static int parser_action_row1085[] = {
        2,
-       -1, 3, 1082,
-       27, 0, 1212
+       -1, 3, 1084,
+       27, 0, 1214
 };
-static int parser_action_row1084[] = {
+static int parser_action_row1086[] = {
        1,
        -1, 1, 551
 };
-static int parser_action_row1085[] = {
+static int parser_action_row1087[] = {
        3,
        -1, 1, 378,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row1086[] = {
+static int parser_action_row1088[] = {
        3,
        -1, 1, 378,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row1087[] = {
+static int parser_action_row1089[] = {
        3,
        -1, 1, 378,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row1088[] = {
+static int parser_action_row1090[] = {
        3,
        -1, 1, 206,
        27, 1, 655,
-       61, 0, 1216
+       61, 0, 1218
 };
-static int parser_action_row1089[] = {
+static int parser_action_row1091[] = {
        2,
-       -1, 3, 1088,
-       26, 0, 1217
+       -1, 3, 1090,
+       26, 0, 1219
 };
-static int parser_action_row1090[] = {
+static int parser_action_row1092[] = {
        2,
-       -1, 3, 1089,
-       15, 0, 1218
+       -1, 3, 1091,
+       15, 0, 1220
 };
-static int parser_action_row1091[] = {
+static int parser_action_row1093[] = {
        2,
-       -1, 3, 1090,
+       -1, 3, 1092,
        84, 0, 297
 };
-static int parser_action_row1092[] = {
+static int parser_action_row1094[] = {
        3,
-       -1, 3, 1091,
-       31, 0, 1220,
-       58, 0, 572
+       -1, 3, 1093,
+       31, 0, 1222,
+       58, 0, 574
 };
-static int parser_action_row1093[] = {
+static int parser_action_row1095[] = {
        32,
        -1, 1, 360,
        0, 0, 1,
        1, 0, 2,
-       9, 0, 1093,
-       12, 0, 666,
-       15, 0, 667,
-       18, 0, 668,
-       25, 0, 669,
-       28, 0, 671,
-       29, 0, 672,
-       30, 0, 673,
-       36, 0, 674,
-       37, 0, 675,
-       38, 0, 676,
-       39, 0, 677,
-       40, 0, 678,
+       9, 0, 1095,
+       12, 0, 668,
+       15, 0, 669,
+       18, 0, 670,
+       25, 0, 671,
+       28, 0, 673,
+       29, 0, 674,
+       30, 0, 675,
+       36, 0, 676,
+       37, 0, 677,
+       38, 0, 678,
+       39, 0, 679,
+       40, 0, 680,
        41, 0, 41,
        45, 0, 42,
        46, 0, 43,
        47, 0, 44,
        48, 0, 45,
-       53, 0, 679,
+       53, 0, 681,
        54, 0, 47,
        56, 0, 48,
        83, 0, 49,
@@ -11462,15 +11474,15 @@ static int parser_action_row1093[] = {
        90, 0, 55,
        93, 0, 56
 };
-static int parser_action_row1094[] = {
+static int parser_action_row1096[] = {
        2,
        -1, 1, 163,
        27, 1, 620
 };
-static int parser_action_row1095[] = {
+static int parser_action_row1097[] = {
        30,
        -1, 1, 360,
-       9, 0, 1222,
+       9, 0, 1224,
        12, 0, 27,
        15, 0, 29,
        18, 0, 30,
@@ -11500,11 +11512,11 @@ static int parser_action_row1095[] = {
        90, 0, 55,
        93, 0, 56
 };
-static int parser_action_row1096[] = {
+static int parser_action_row1098[] = {
        1,
        -1, 1, 679
 };
-static int parser_action_row1097[] = {
+static int parser_action_row1099[] = {
        22,
        -1, 1, 360,
        12, 0, 153,
@@ -11529,7 +11541,7 @@ static int parser_action_row1097[] = {
        90, 0, 55,
        93, 0, 56
 };
-static int parser_action_row1098[] = {
+static int parser_action_row1100[] = {
        25,
        -1, 1, 346,
        12, 0, 108,
@@ -11557,12 +11569,12 @@ static int parser_action_row1098[] = {
        90, 0, 55,
        93, 0, 124
 };
-static int parser_action_row1099[] = {
+static int parser_action_row1101[] = {
        2,
-       -1, 3, 1098,
-       85, 0, 1226
+       -1, 3, 1100,
+       85, 0, 1228
 };
-static int parser_action_row1100[] = {
+static int parser_action_row1102[] = {
        28,
        -1, 1, 346,
        12, 0, 108,
@@ -11593,55 +11605,55 @@ static int parser_action_row1100[] = {
        90, 0, 55,
        93, 0, 124
 };
-static int parser_action_row1101[] = {
+static int parser_action_row1103[] = {
        3,
        -1, 1, 357,
-       12, 0, 1229,
+       12, 0, 1231,
        84, 0, 223
 };
-static int parser_action_row1102[] = {
+static int parser_action_row1104[] = {
        4,
        -1, 1, 359,
-       12, 0, 1230,
+       12, 0, 1232,
        83, 0, 49,
        84, 0, 225
 };
-static int parser_action_row1103[] = {
+static int parser_action_row1105[] = {
        1,
        -1, 1, 662
 };
-static int parser_action_row1104[] = {
+static int parser_action_row1106[] = {
        1,
        -1, 1, 667
 };
-static int parser_action_row1105[] = {
+static int parser_action_row1107[] = {
        1,
        -1, 1, 659
 };
-static int parser_action_row1106[] = {
+static int parser_action_row1108[] = {
        1,
        -1, 1, 664
 };
-static int parser_action_row1107[] = {
+static int parser_action_row1109[] = {
        1,
        -1, 1, 661
 };
-static int parser_action_row1108[] = {
+static int parser_action_row1110[] = {
        1,
        -1, 1, 666
 };
-static int parser_action_row1109[] = {
+static int parser_action_row1111[] = {
        2,
        -1, 1, 200,
        27, 1, 650
 };
-static int parser_action_row1110[] = {
+static int parser_action_row1112[] = {
        3,
        -1, 1, 378,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row1111[] = {
+static int parser_action_row1113[] = {
        32,
        -1, 1, 360,
        0, 0, 1,
@@ -11676,29 +11688,29 @@ static int parser_action_row1111[] = {
        90, 0, 55,
        93, 0, 56
 };
-static int parser_action_row1112[] = {
+static int parser_action_row1114[] = {
        2,
-       -1, 3, 1111,
-       27, 0, 1235
+       -1, 3, 1113,
+       27, 0, 1237
 };
-static int parser_action_row1113[] = {
+static int parser_action_row1115[] = {
        2,
        -1, 1, 555,
-       82, 0, 472
+       82, 0, 474
 };
-static int parser_action_row1114[] = {
+static int parser_action_row1116[] = {
        1,
        -1, 1, 157
 };
-static int parser_action_row1115[] = {
+static int parser_action_row1117[] = {
        1,
        -1, 1, 452
 };
-static int parser_action_row1116[] = {
+static int parser_action_row1118[] = {
        1,
        -1, 1, 553
 };
-static int parser_action_row1117[] = {
+static int parser_action_row1119[] = {
        22,
        -1, 1, 360,
        12, 0, 153,
@@ -11723,775 +11735,775 @@ static int parser_action_row1117[] = {
        90, 0, 55,
        93, 0, 56
 };
-static int parser_action_row1118[] = {
+static int parser_action_row1120[] = {
        2,
        -1, 1, 342,
        54, 0, 242
 };
-static int parser_action_row1119[] = {
+static int parser_action_row1121[] = {
        1,
        -1, 1, 318
 };
-static int parser_action_row1120[] = {
+static int parser_action_row1122[] = {
        1,
        -1, 1, 331
 };
-static int parser_action_row1121[] = {
+static int parser_action_row1123[] = {
        2,
        -1, 1, 316,
        82, 0, 183
 };
-static int parser_action_row1122[] = {
+static int parser_action_row1124[] = {
        1,
        -1, 1, 153
 };
-static int parser_action_row1123[] = {
+static int parser_action_row1125[] = {
        3,
        -1, 1, 378,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row1124[] = {
+static int parser_action_row1126[] = {
        1,
        -1, 1, 402
 };
-static int parser_action_row1125[] = {
+static int parser_action_row1127[] = {
        2,
-       -1, 3, 1124,
-       83, 0, 1240
+       -1, 3, 1126,
+       83, 0, 1242
 };
-static int parser_action_row1126[] = {
+static int parser_action_row1128[] = {
        2,
        -1, 1, 555,
-       82, 0, 472
+       82, 0, 474
 };
-static int parser_action_row1127[] = {
+static int parser_action_row1129[] = {
        3,
        -1, 1, 342,
        54, 0, 242,
-       66, 0, 1242
+       66, 0, 1244
 };
-static int parser_action_row1128[] = {
+static int parser_action_row1130[] = {
        1,
        -1, 1, 423
 };
-static int parser_action_row1129[] = {
+static int parser_action_row1131[] = {
        3,
-       -1, 3, 1128,
-       50, 0, 1124,
-       83, 0, 1125
+       -1, 3, 1130,
+       50, 0, 1126,
+       83, 0, 1127
 };
-static int parser_action_row1130[] = {
+static int parser_action_row1132[] = {
        2,
        -1, 1, 427,
        66, 1, 429
 };
-static int parser_action_row1131[] = {
+static int parser_action_row1133[] = {
        3,
        -1, 1, 378,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row1132[] = {
+static int parser_action_row1134[] = {
        3,
        -1, 1, 378,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row1133[] = {
+static int parser_action_row1135[] = {
        1,
        -1, 1, 422
 };
-static int parser_action_row1134[] = {
+static int parser_action_row1136[] = {
        1,
        -1, 1, 432
 };
-static int parser_action_row1135[] = {
+static int parser_action_row1137[] = {
        2,
        -1, 1, 316,
        82, 0, 183
 };
-static int parser_action_row1136[] = {
+static int parser_action_row1138[] = {
        2,
        -1, 1, 316,
        82, 0, 183
 };
-static int parser_action_row1137[] = {
+static int parser_action_row1139[] = {
        20,
        -1, 1, 360,
-       12, 0, 845,
-       34, 0, 847,
-       41, 0, 848,
-       43, 0, 849,
-       45, 0, 850,
-       46, 0, 851,
-       47, 0, 852,
-       48, 0, 853,
-       51, 0, 854,
-       54, 0, 855,
-       68, 0, 856,
+       12, 0, 847,
+       34, 0, 849,
+       41, 0, 850,
+       43, 0, 851,
+       45, 0, 852,
+       46, 0, 853,
+       47, 0, 854,
+       48, 0, 855,
+       51, 0, 856,
+       54, 0, 857,
+       68, 0, 858,
        83, 0, 49,
        84, 0, 50,
-       86, 0, 857,
-       87, 0, 858,
-       88, 0, 859,
-       89, 0, 860,
+       86, 0, 859,
+       87, 0, 860,
+       88, 0, 861,
+       89, 0, 862,
        90, 0, 55,
-       93, 0, 861
+       93, 0, 863
 };
-static int parser_action_row1138[] = {
+static int parser_action_row1140[] = {
        3,
        -1, 1, 378,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row1139[] = {
+static int parser_action_row1141[] = {
        20,
        -1, 1, 360,
-       12, 0, 845,
-       34, 0, 847,
-       41, 0, 848,
-       43, 0, 849,
-       45, 0, 850,
-       46, 0, 851,
-       47, 0, 852,
-       48, 0, 853,
-       51, 0, 854,
-       54, 0, 855,
-       68, 0, 856,
+       12, 0, 847,
+       34, 0, 849,
+       41, 0, 850,
+       43, 0, 851,
+       45, 0, 852,
+       46, 0, 853,
+       47, 0, 854,
+       48, 0, 855,
+       51, 0, 856,
+       54, 0, 857,
+       68, 0, 858,
        83, 0, 49,
        84, 0, 50,
-       86, 0, 857,
-       87, 0, 858,
-       88, 0, 859,
-       89, 0, 860,
+       86, 0, 859,
+       87, 0, 860,
+       88, 0, 861,
+       89, 0, 862,
        90, 0, 55,
-       93, 0, 861
+       93, 0, 863
 };
-static int parser_action_row1140[] = {
+static int parser_action_row1142[] = {
        20,
        -1, 1, 360,
-       12, 0, 845,
-       34, 0, 847,
-       41, 0, 848,
-       43, 0, 849,
-       45, 0, 850,
-       46, 0, 851,
-       47, 0, 852,
-       48, 0, 853,
-       51, 0, 854,
-       54, 0, 855,
-       68, 0, 856,
-       83, 0, 49,
-       84, 0, 50,
-       86, 0, 857,
-       87, 0, 858,
-       88, 0, 859,
-       89, 0, 860,
-       90, 0, 55,
-       93, 0, 861
-};
-static int parser_action_row1141[] = {
-       19,
-       -1, 1, 360,
-       12, 0, 845,
-       41, 0, 848,
-       43, 0, 849,
-       45, 0, 850,
-       46, 0, 851,
-       47, 0, 852,
-       48, 0, 853,
-       51, 0, 854,
-       54, 0, 855,
-       68, 0, 856,
+       12, 0, 847,
+       34, 0, 849,
+       41, 0, 850,
+       43, 0, 851,
+       45, 0, 852,
+       46, 0, 853,
+       47, 0, 854,
+       48, 0, 855,
+       51, 0, 856,
+       54, 0, 857,
+       68, 0, 858,
        83, 0, 49,
        84, 0, 50,
-       86, 0, 857,
-       87, 0, 858,
-       88, 0, 859,
-       89, 0, 860,
+       86, 0, 859,
+       87, 0, 860,
+       88, 0, 861,
+       89, 0, 862,
        90, 0, 55,
-       93, 0, 861
+       93, 0, 863
 };
-static int parser_action_row1142[] = {
+static int parser_action_row1143[] = {
        19,
        -1, 1, 360,
-       12, 0, 845,
-       41, 0, 848,
-       43, 0, 849,
-       45, 0, 850,
-       46, 0, 851,
-       47, 0, 852,
-       48, 0, 853,
-       51, 0, 854,
-       54, 0, 855,
-       68, 0, 856,
+       12, 0, 847,
+       41, 0, 850,
+       43, 0, 851,
+       45, 0, 852,
+       46, 0, 853,
+       47, 0, 854,
+       48, 0, 855,
+       51, 0, 856,
+       54, 0, 857,
+       68, 0, 858,
        83, 0, 49,
        84, 0, 50,
-       86, 0, 857,
-       87, 0, 858,
-       88, 0, 859,
-       89, 0, 860,
+       86, 0, 859,
+       87, 0, 860,
+       88, 0, 861,
+       89, 0, 862,
        90, 0, 55,
-       93, 0, 861
-};
-static int parser_action_row1143[] = {
-       3,
-       -1, 3, 1142,
-       50, 0, 1255,
-       83, 0, 1256
+       93, 0, 863
 };
 static int parser_action_row1144[] = {
        19,
        -1, 1, 360,
-       12, 0, 845,
-       41, 0, 848,
-       43, 0, 849,
-       45, 0, 850,
-       46, 0, 851,
-       47, 0, 852,
-       48, 0, 853,
-       51, 0, 854,
-       54, 0, 855,
-       68, 0, 856,
+       12, 0, 847,
+       41, 0, 850,
+       43, 0, 851,
+       45, 0, 852,
+       46, 0, 853,
+       47, 0, 854,
+       48, 0, 855,
+       51, 0, 856,
+       54, 0, 857,
+       68, 0, 858,
        83, 0, 49,
        84, 0, 50,
-       86, 0, 857,
-       87, 0, 858,
-       88, 0, 859,
-       89, 0, 860,
+       86, 0, 859,
+       87, 0, 860,
+       88, 0, 861,
+       89, 0, 862,
        90, 0, 55,
-       93, 0, 861
+       93, 0, 863
 };
 static int parser_action_row1145[] = {
-       19,
-       -1, 1, 360,
-       12, 0, 845,
-       41, 0, 848,
-       43, 0, 849,
-       45, 0, 850,
-       46, 0, 851,
-       47, 0, 852,
-       48, 0, 853,
-       51, 0, 854,
-       54, 0, 855,
-       68, 0, 856,
-       83, 0, 49,
-       84, 0, 50,
-       86, 0, 857,
-       87, 0, 858,
-       88, 0, 859,
-       89, 0, 860,
-       90, 0, 55,
-       93, 0, 861
+       3,
+       -1, 3, 1144,
+       50, 0, 1257,
+       83, 0, 1258
 };
 static int parser_action_row1146[] = {
        19,
        -1, 1, 360,
-       12, 0, 845,
-       41, 0, 848,
-       43, 0, 849,
-       45, 0, 850,
-       46, 0, 851,
-       47, 0, 852,
-       48, 0, 853,
-       51, 0, 854,
-       54, 0, 855,
-       68, 0, 856,
+       12, 0, 847,
+       41, 0, 850,
+       43, 0, 851,
+       45, 0, 852,
+       46, 0, 853,
+       47, 0, 854,
+       48, 0, 855,
+       51, 0, 856,
+       54, 0, 857,
+       68, 0, 858,
        83, 0, 49,
        84, 0, 50,
-       86, 0, 857,
-       87, 0, 858,
-       88, 0, 859,
-       89, 0, 860,
+       86, 0, 859,
+       87, 0, 860,
+       88, 0, 861,
+       89, 0, 862,
        90, 0, 55,
-       93, 0, 861
+       93, 0, 863
 };
 static int parser_action_row1147[] = {
        19,
        -1, 1, 360,
-       12, 0, 845,
-       41, 0, 848,
-       43, 0, 849,
-       45, 0, 850,
-       46, 0, 851,
-       47, 0, 852,
-       48, 0, 853,
-       51, 0, 854,
-       54, 0, 855,
-       68, 0, 856,
+       12, 0, 847,
+       41, 0, 850,
+       43, 0, 851,
+       45, 0, 852,
+       46, 0, 853,
+       47, 0, 854,
+       48, 0, 855,
+       51, 0, 856,
+       54, 0, 857,
+       68, 0, 858,
        83, 0, 49,
        84, 0, 50,
-       86, 0, 857,
-       87, 0, 858,
-       88, 0, 859,
-       89, 0, 860,
+       86, 0, 859,
+       87, 0, 860,
+       88, 0, 861,
+       89, 0, 862,
        90, 0, 55,
-       93, 0, 861
+       93, 0, 863
 };
 static int parser_action_row1148[] = {
        19,
        -1, 1, 360,
-       12, 0, 845,
-       41, 0, 848,
-       43, 0, 849,
-       45, 0, 850,
-       46, 0, 851,
-       47, 0, 852,
-       48, 0, 853,
-       51, 0, 854,
-       54, 0, 855,
-       68, 0, 856,
+       12, 0, 847,
+       41, 0, 850,
+       43, 0, 851,
+       45, 0, 852,
+       46, 0, 853,
+       47, 0, 854,
+       48, 0, 855,
+       51, 0, 856,
+       54, 0, 857,
+       68, 0, 858,
        83, 0, 49,
        84, 0, 50,
-       86, 0, 857,
-       87, 0, 858,
-       88, 0, 859,
-       89, 0, 860,
+       86, 0, 859,
+       87, 0, 860,
+       88, 0, 861,
+       89, 0, 862,
        90, 0, 55,
-       93, 0, 861
+       93, 0, 863
 };
 static int parser_action_row1149[] = {
        19,
        -1, 1, 360,
-       12, 0, 845,
-       41, 0, 848,
-       43, 0, 849,
-       45, 0, 850,
-       46, 0, 851,
-       47, 0, 852,
-       48, 0, 853,
-       51, 0, 854,
-       54, 0, 855,
-       68, 0, 856,
+       12, 0, 847,
+       41, 0, 850,
+       43, 0, 851,
+       45, 0, 852,
+       46, 0, 853,
+       47, 0, 854,
+       48, 0, 855,
+       51, 0, 856,
+       54, 0, 857,
+       68, 0, 858,
        83, 0, 49,
        84, 0, 50,
-       86, 0, 857,
-       87, 0, 858,
-       88, 0, 859,
-       89, 0, 860,
+       86, 0, 859,
+       87, 0, 860,
+       88, 0, 861,
+       89, 0, 862,
        90, 0, 55,
-       93, 0, 861
+       93, 0, 863
 };
 static int parser_action_row1150[] = {
        19,
        -1, 1, 360,
-       12, 0, 845,
-       41, 0, 848,
-       43, 0, 849,
-       45, 0, 850,
-       46, 0, 851,
-       47, 0, 852,
-       48, 0, 853,
-       51, 0, 854,
-       54, 0, 855,
-       68, 0, 856,
+       12, 0, 847,
+       41, 0, 850,
+       43, 0, 851,
+       45, 0, 852,
+       46, 0, 853,
+       47, 0, 854,
+       48, 0, 855,
+       51, 0, 856,
+       54, 0, 857,
+       68, 0, 858,
        83, 0, 49,
        84, 0, 50,
-       86, 0, 857,
-       87, 0, 858,
-       88, 0, 859,
-       89, 0, 860,
+       86, 0, 859,
+       87, 0, 860,
+       88, 0, 861,
+       89, 0, 862,
        90, 0, 55,
-       93, 0, 861
+       93, 0, 863
 };
 static int parser_action_row1151[] = {
        19,
        -1, 1, 360,
-       12, 0, 845,
-       41, 0, 848,
-       43, 0, 849,
-       45, 0, 850,
-       46, 0, 851,
-       47, 0, 852,
-       48, 0, 853,
-       51, 0, 854,
-       54, 0, 855,
-       68, 0, 856,
+       12, 0, 847,
+       41, 0, 850,
+       43, 0, 851,
+       45, 0, 852,
+       46, 0, 853,
+       47, 0, 854,
+       48, 0, 855,
+       51, 0, 856,
+       54, 0, 857,
+       68, 0, 858,
        83, 0, 49,
        84, 0, 50,
-       86, 0, 857,
-       87, 0, 858,
-       88, 0, 859,
-       89, 0, 860,
+       86, 0, 859,
+       87, 0, 860,
+       88, 0, 861,
+       89, 0, 862,
        90, 0, 55,
-       93, 0, 861
+       93, 0, 863
 };
 static int parser_action_row1152[] = {
        19,
        -1, 1, 360,
-       12, 0, 845,
-       41, 0, 848,
-       43, 0, 849,
-       45, 0, 850,
-       46, 0, 851,
-       47, 0, 852,
-       48, 0, 853,
-       51, 0, 854,
-       54, 0, 855,
-       68, 0, 856,
+       12, 0, 847,
+       41, 0, 850,
+       43, 0, 851,
+       45, 0, 852,
+       46, 0, 853,
+       47, 0, 854,
+       48, 0, 855,
+       51, 0, 856,
+       54, 0, 857,
+       68, 0, 858,
        83, 0, 49,
        84, 0, 50,
-       86, 0, 857,
-       87, 0, 858,
-       88, 0, 859,
-       89, 0, 860,
+       86, 0, 859,
+       87, 0, 860,
+       88, 0, 861,
+       89, 0, 862,
        90, 0, 55,
-       93, 0, 861
+       93, 0, 863
 };
 static int parser_action_row1153[] = {
        19,
        -1, 1, 360,
-       12, 0, 845,
-       41, 0, 848,
-       43, 0, 849,
-       45, 0, 850,
-       46, 0, 851,
-       47, 0, 852,
-       48, 0, 853,
-       51, 0, 854,
-       54, 0, 855,
-       68, 0, 856,
+       12, 0, 847,
+       41, 0, 850,
+       43, 0, 851,
+       45, 0, 852,
+       46, 0, 853,
+       47, 0, 854,
+       48, 0, 855,
+       51, 0, 856,
+       54, 0, 857,
+       68, 0, 858,
        83, 0, 49,
        84, 0, 50,
-       86, 0, 857,
-       87, 0, 858,
-       88, 0, 859,
-       89, 0, 860,
+       86, 0, 859,
+       87, 0, 860,
+       88, 0, 861,
+       89, 0, 862,
        90, 0, 55,
-       93, 0, 861
+       93, 0, 863
 };
 static int parser_action_row1154[] = {
        19,
        -1, 1, 360,
-       12, 0, 845,
-       41, 0, 848,
-       43, 0, 849,
-       45, 0, 850,
-       46, 0, 851,
-       47, 0, 852,
-       48, 0, 853,
-       51, 0, 854,
-       54, 0, 855,
-       68, 0, 856,
+       12, 0, 847,
+       41, 0, 850,
+       43, 0, 851,
+       45, 0, 852,
+       46, 0, 853,
+       47, 0, 854,
+       48, 0, 855,
+       51, 0, 856,
+       54, 0, 857,
+       68, 0, 858,
        83, 0, 49,
        84, 0, 50,
-       86, 0, 857,
-       87, 0, 858,
-       88, 0, 859,
-       89, 0, 860,
+       86, 0, 859,
+       87, 0, 860,
+       88, 0, 861,
+       89, 0, 862,
        90, 0, 55,
-       93, 0, 861
+       93, 0, 863
 };
 static int parser_action_row1155[] = {
        19,
        -1, 1, 360,
-       12, 0, 845,
-       41, 0, 848,
-       43, 0, 849,
-       45, 0, 850,
-       46, 0, 851,
-       47, 0, 852,
-       48, 0, 853,
-       51, 0, 854,
-       54, 0, 855,
-       68, 0, 856,
+       12, 0, 847,
+       41, 0, 850,
+       43, 0, 851,
+       45, 0, 852,
+       46, 0, 853,
+       47, 0, 854,
+       48, 0, 855,
+       51, 0, 856,
+       54, 0, 857,
+       68, 0, 858,
        83, 0, 49,
        84, 0, 50,
-       86, 0, 857,
-       87, 0, 858,
-       88, 0, 859,
-       89, 0, 860,
+       86, 0, 859,
+       87, 0, 860,
+       88, 0, 861,
+       89, 0, 862,
        90, 0, 55,
-       93, 0, 861
+       93, 0, 863
 };
 static int parser_action_row1156[] = {
+       19,
+       -1, 1, 360,
+       12, 0, 847,
+       41, 0, 850,
+       43, 0, 851,
+       45, 0, 852,
+       46, 0, 853,
+       47, 0, 854,
+       48, 0, 855,
+       51, 0, 856,
+       54, 0, 857,
+       68, 0, 858,
+       83, 0, 49,
+       84, 0, 50,
+       86, 0, 859,
+       87, 0, 860,
+       88, 0, 861,
+       89, 0, 862,
+       90, 0, 55,
+       93, 0, 863
+};
+static int parser_action_row1157[] = {
+       19,
+       -1, 1, 360,
+       12, 0, 847,
+       41, 0, 850,
+       43, 0, 851,
+       45, 0, 852,
+       46, 0, 853,
+       47, 0, 854,
+       48, 0, 855,
+       51, 0, 856,
+       54, 0, 857,
+       68, 0, 858,
+       83, 0, 49,
+       84, 0, 50,
+       86, 0, 859,
+       87, 0, 860,
+       88, 0, 861,
+       89, 0, 862,
+       90, 0, 55,
+       93, 0, 863
+};
+static int parser_action_row1158[] = {
        5,
        -1, 1, 360,
-       12, 0, 1270,
-       49, 0, 1271,
+       12, 0, 1272,
+       49, 0, 1273,
        83, 0, 49,
        84, 0, 50
 };
-static int parser_action_row1157[] = {
+static int parser_action_row1159[] = {
        1,
        -1, 1, 125
 };
-static int parser_action_row1158[] = {
+static int parser_action_row1160[] = {
        2,
        -1, 1, 124,
-       64, 0, 1274
+       64, 0, 1276
 };
-static int parser_action_row1159[] = {
+static int parser_action_row1161[] = {
        3,
        -1, 1, 378,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row1160[] = {
+static int parser_action_row1162[] = {
        1,
        -1, 1, 115
 };
-static int parser_action_row1161[] = {
+static int parser_action_row1163[] = {
        2,
-       -1, 3, 1160,
-       84, 0, 875
+       -1, 3, 1162,
+       84, 0, 877
 };
-static int parser_action_row1162[] = {
+static int parser_action_row1164[] = {
        1,
        -1, 1, 828
 };
-static int parser_action_row1163[] = {
+static int parser_action_row1165[] = {
        1,
        -1, 1, 119
 };
-static int parser_action_row1164[] = {
+static int parser_action_row1166[] = {
        3,
        -1, 1, 378,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row1165[] = {
+static int parser_action_row1167[] = {
        1,
        -1, 1, 829
 };
-static int parser_action_row1166[] = {
+static int parser_action_row1168[] = {
        2,
        -1, 1, 128,
-       58, 0, 1163
+       58, 0, 1165
 };
-static int parser_action_row1167[] = {
+static int parser_action_row1169[] = {
        18,
-       -1, 3, 1166,
-       49, 0, 1279,
-       56, 0, 488,
-       67, 0, 489,
-       68, 0, 490,
-       69, 0, 491,
-       70, 0, 492,
-       71, 0, 493,
-       72, 0, 494,
-       73, 0, 495,
-       74, 0, 496,
-       75, 0, 497,
-       76, 0, 498,
-       77, 0, 499,
-       78, 0, 500,
-       79, 0, 501,
-       80, 0, 502,
-       84, 0, 503
+       -1, 3, 1168,
+       49, 0, 1281,
+       56, 0, 490,
+       67, 0, 491,
+       68, 0, 492,
+       69, 0, 493,
+       70, 0, 494,
+       71, 0, 495,
+       72, 0, 496,
+       73, 0, 497,
+       74, 0, 498,
+       75, 0, 499,
+       76, 0, 500,
+       77, 0, 501,
+       78, 0, 502,
+       79, 0, 503,
+       80, 0, 504,
+       84, 0, 505
 };
-static int parser_action_row1168[] = {
+static int parser_action_row1170[] = {
        3,
        -1, 1, 149,
        31, 0, 35,
        96, 0, 57
 };
-static int parser_action_row1169[] = {
+static int parser_action_row1171[] = {
        1,
        -1, 1, 390
 };
-static int parser_action_row1170[] = {
+static int parser_action_row1172[] = {
        1,
        -1, 1, 385
 };
-static int parser_action_row1171[] = {
+static int parser_action_row1173[] = {
        1,
        -1, 1, 53
 };
-static int parser_action_row1172[] = {
+static int parser_action_row1174[] = {
        2,
        -1, 1, 160,
        59, 0, 290
 };
-static int parser_action_row1173[] = {
+static int parser_action_row1175[] = {
        3,
        -1, 1, 378,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row1174[] = {
+static int parser_action_row1176[] = {
        1,
        -1, 1, 825
 };
-static int parser_action_row1175[] = {
+static int parser_action_row1177[] = {
        2,
-       -1, 3, 1174,
-       57, 0, 1285
+       -1, 3, 1176,
+       57, 0, 1287
 };
-static int parser_action_row1176[] = {
+static int parser_action_row1178[] = {
        4,
        -1, 1, 378,
        0, 0, 1,
        1, 0, 2,
-       58, 0, 1172
+       58, 0, 1174
 };
-static int parser_action_row1177[] = {
+static int parser_action_row1179[] = {
        1,
        -1, 1, 28
 };
-static int parser_action_row1178[] = {
+static int parser_action_row1180[] = {
        4,
        -1, 1, 42,
-       9, 0, 1288,
+       9, 0, 1290,
        13, 0, 28,
-       44, 0, 1049
+       44, 0, 1051
 };
-static int parser_action_row1179[] = {
+static int parser_action_row1181[] = {
        3,
        -1, 1, 378,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row1180[] = {
+static int parser_action_row1182[] = {
        3,
        -1, 1, 42,
-       9, 0, 1290,
+       9, 0, 1292,
        13, 0, 28
 };
-static int parser_action_row1181[] = {
+static int parser_action_row1183[] = {
        3,
-       -1, 3, 1180,
-       50, 0, 346,
-       83, 0, 347
+       -1, 3, 1182,
+       50, 0, 347,
+       83, 0, 348
 };
-static int parser_action_row1182[] = {
+static int parser_action_row1184[] = {
        8,
-       -1, 3, 1181,
-       10, 0, 1292,
-       11, 0, 1293,
-       12, 0, 1294,
-       16, 0, 1295,
-       17, 0, 1296,
-       18, 0, 1297,
-       41, 0, 1298
+       -1, 3, 1183,
+       10, 0, 1294,
+       11, 0, 1295,
+       12, 0, 1296,
+       16, 0, 1297,
+       17, 0, 1298,
+       18, 0, 1299,
+       41, 0, 1300
 };
-static int parser_action_row1183[] = {
+static int parser_action_row1185[] = {
        4,
        -1, 1, 92,
        22, 0, 199,
        23, 0, 200,
        24, 0, 201
 };
-static int parser_action_row1184[] = {
+static int parser_action_row1186[] = {
        2,
        -1, 1, 42,
        13, 0, 28
 };
-static int parser_action_row1185[] = {
+static int parser_action_row1187[] = {
        4,
        -1, 1, 92,
        22, 0, 199,
        23, 0, 200,
        24, 0, 201
 };
-static int parser_action_row1186[] = {
+static int parser_action_row1188[] = {
        3,
        -1, 1, 378,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row1187[] = {
+static int parser_action_row1189[] = {
        3,
-       -1, 3, 1186,
+       -1, 3, 1188,
        0, 0, 83,
        1, 0, 84
 };
-static int parser_action_row1188[] = {
+static int parser_action_row1190[] = {
        1,
        -1, 1, 808
 };
-static int parser_action_row1189[] = {
+static int parser_action_row1191[] = {
        3,
-       -1, 3, 1188,
+       -1, 3, 1190,
        0, 0, 83,
        1, 0, 84
 };
-static int parser_action_row1190[] = {
+static int parser_action_row1192[] = {
        1,
        -1, 1, 30
 };
-static int parser_action_row1191[] = {
+static int parser_action_row1193[] = {
        3,
        -1, 1, 42,
-       9, 0, 1305,
+       9, 0, 1307,
        13, 0, 28
 };
-static int parser_action_row1192[] = {
+static int parser_action_row1194[] = {
        1,
        -1, 1, 34
 };
-static int parser_action_row1193[] = {
+static int parser_action_row1195[] = {
        4,
        -1, 1, 42,
-       9, 0, 1306,
+       9, 0, 1308,
        13, 0, 28,
-       44, 0, 1049
+       44, 0, 1051
 };
-static int parser_action_row1194[] = {
+static int parser_action_row1196[] = {
        3,
        -1, 1, 378,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row1195[] = {
+static int parser_action_row1197[] = {
        3,
        -1, 1, 378,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row1196[] = {
+static int parser_action_row1198[] = {
        1,
        -1, 1, 27
 };
-static int parser_action_row1197[] = {
+static int parser_action_row1199[] = {
        4,
        -1, 1, 42,
-       9, 0, 1310,
+       9, 0, 1312,
        13, 0, 28,
-       44, 0, 1049
+       44, 0, 1051
 };
-static int parser_action_row1198[] = {
+static int parser_action_row1200[] = {
        3,
        -1, 1, 378,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row1199[] = {
+static int parser_action_row1201[] = {
        3,
        -1, 1, 42,
-       9, 0, 1312,
+       9, 0, 1314,
        13, 0, 28
 };
-static int parser_action_row1200[] = {
+static int parser_action_row1202[] = {
        2,
-       -1, 3, 1199,
-       48, 0, 1313
+       -1, 3, 1201,
+       48, 0, 1315
 };
-static int parser_action_row1201[] = {
+static int parser_action_row1203[] = {
        2,
-       -1, 3, 1200,
-       55, 0, 1314
+       -1, 3, 1202,
+       55, 0, 1316
 };
-static int parser_action_row1202[] = {
+static int parser_action_row1204[] = {
        1,
        -1, 1, 763
 };
-static int parser_action_row1203[] = {
+static int parser_action_row1205[] = {
        1,
        -1, 1, 758
 };
-static int parser_action_row1204[] = {
+static int parser_action_row1206[] = {
        2,
-       -1, 3, 1203,
-       59, 0, 1315
+       -1, 3, 1205,
+       59, 0, 1317
 };
-static int parser_action_row1205[] = {
+static int parser_action_row1207[] = {
        2,
-       -1, 3, 1204,
-       55, 0, 1316
+       -1, 3, 1206,
+       55, 0, 1318
 };
-static int parser_action_row1206[] = {
+static int parser_action_row1208[] = {
        22,
        -1, 1, 360,
        12, 0, 153,
@@ -12516,7 +12528,7 @@ static int parser_action_row1206[] = {
        90, 0, 55,
        93, 0, 56
 };
-static int parser_action_row1207[] = {
+static int parser_action_row1209[] = {
        22,
        -1, 1, 360,
        12, 0, 153,
@@ -12541,7 +12553,7 @@ static int parser_action_row1207[] = {
        90, 0, 55,
        93, 0, 56
 };
-static int parser_action_row1208[] = {
+static int parser_action_row1210[] = {
        22,
        -1, 1, 360,
        12, 0, 153,
@@ -12566,7 +12578,7 @@ static int parser_action_row1208[] = {
        90, 0, 55,
        93, 0, 56
 };
-static int parser_action_row1209[] = {
+static int parser_action_row1211[] = {
        22,
        -1, 1, 360,
        12, 0, 153,
@@ -12591,15 +12603,15 @@ static int parser_action_row1209[] = {
        90, 0, 55,
        93, 0, 56
 };
-static int parser_action_row1210[] = {
+static int parser_action_row1212[] = {
        5,
        -1, 1, 360,
-       12, 0, 559,
-       49, 0, 560,
+       12, 0, 561,
+       49, 0, 562,
        83, 0, 49,
        84, 0, 50
 };
-static int parser_action_row1211[] = {
+static int parser_action_row1213[] = {
        22,
        -1, 1, 360,
        12, 0, 153,
@@ -12624,7 +12636,7 @@ static int parser_action_row1211[] = {
        90, 0, 55,
        93, 0, 56
 };
-static int parser_action_row1212[] = {
+static int parser_action_row1214[] = {
        22,
        -1, 1, 360,
        12, 0, 153,
@@ -12649,23 +12661,23 @@ static int parser_action_row1212[] = {
        90, 0, 55,
        93, 0, 56
 };
-static int parser_action_row1213[] = {
+static int parser_action_row1215[] = {
        3,
        -1, 1, 378,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row1214[] = {
+static int parser_action_row1216[] = {
        2,
-       -1, 3, 1213,
-       48, 0, 1326
+       -1, 3, 1215,
+       48, 0, 1328
 };
-static int parser_action_row1215[] = {
+static int parser_action_row1217[] = {
        2,
-       -1, 3, 1214,
-       55, 0, 1327
+       -1, 3, 1216,
+       55, 0, 1329
 };
-static int parser_action_row1216[] = {
+static int parser_action_row1218[] = {
        22,
        -1, 1, 360,
        12, 0, 153,
@@ -12690,37 +12702,37 @@ static int parser_action_row1216[] = {
        90, 0, 55,
        93, 0, 56
 };
-static int parser_action_row1217[] = {
+static int parser_action_row1219[] = {
        3,
        -1, 1, 378,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row1218[] = {
+static int parser_action_row1220[] = {
        33,
        -1, 1, 360,
        0, 0, 1,
        1, 0, 2,
-       9, 0, 665,
-       12, 0, 666,
-       15, 0, 667,
-       18, 0, 668,
-       25, 0, 669,
-       27, 0, 670,
-       28, 0, 671,
-       29, 0, 672,
-       30, 0, 673,
-       36, 0, 674,
-       37, 0, 675,
-       38, 0, 676,
-       39, 0, 677,
-       40, 0, 678,
+       9, 0, 667,
+       12, 0, 668,
+       15, 0, 669,
+       18, 0, 670,
+       25, 0, 671,
+       27, 0, 672,
+       28, 0, 673,
+       29, 0, 674,
+       30, 0, 675,
+       36, 0, 676,
+       37, 0, 677,
+       38, 0, 678,
+       39, 0, 679,
+       40, 0, 680,
        41, 0, 41,
        45, 0, 42,
        46, 0, 43,
        47, 0, 44,
        48, 0, 45,
-       53, 0, 679,
+       53, 0, 681,
        54, 0, 47,
        56, 0, 48,
        83, 0, 49,
@@ -12732,30 +12744,30 @@ static int parser_action_row1218[] = {
        90, 0, 55,
        93, 0, 56
 };
-static int parser_action_row1219[] = {
+static int parser_action_row1221[] = {
        32,
        -1, 1, 360,
        0, 0, 1,
        1, 0, 2,
-       9, 0, 783,
-       12, 0, 666,
-       15, 0, 667,
-       18, 0, 668,
-       25, 0, 669,
-       28, 0, 671,
-       29, 0, 672,
-       30, 0, 673,
-       36, 0, 674,
-       37, 0, 675,
-       38, 0, 676,
-       39, 0, 677,
-       40, 0, 678,
+       9, 0, 785,
+       12, 0, 668,
+       15, 0, 669,
+       18, 0, 670,
+       25, 0, 671,
+       28, 0, 673,
+       29, 0, 674,
+       30, 0, 675,
+       36, 0, 676,
+       37, 0, 677,
+       38, 0, 678,
+       39, 0, 679,
+       40, 0, 680,
        41, 0, 41,
        45, 0, 42,
        46, 0, 43,
        47, 0, 44,
        48, 0, 45,
-       53, 0, 679,
+       53, 0, 681,
        54, 0, 47,
        56, 0, 48,
        83, 0, 49,
@@ -12767,61 +12779,61 @@ static int parser_action_row1219[] = {
        90, 0, 55,
        93, 0, 56
 };
-static int parser_action_row1220[] = {
+static int parser_action_row1222[] = {
        3,
        -1, 1, 378,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row1221[] = {
+static int parser_action_row1223[] = {
        3,
        -1, 1, 378,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row1222[] = {
+static int parser_action_row1224[] = {
        1,
        -1, 1, 680
 };
-static int parser_action_row1223[] = {
+static int parser_action_row1225[] = {
        2,
        -1, 1, 162,
        27, 1, 619
 };
-static int parser_action_row1224[] = {
+static int parser_action_row1226[] = {
        2,
        -1, 1, 161,
        27, 1, 618
 };
-static int parser_action_row1225[] = {
+static int parser_action_row1227[] = {
        1,
        -1, 1, 652
 };
-static int parser_action_row1226[] = {
+static int parser_action_row1228[] = {
        2,
        -1, 1, 194,
        27, 1, 644
 };
-static int parser_action_row1227[] = {
+static int parser_action_row1229[] = {
        4,
        -1, 1, 278,
-       61, 0, 1335,
-       62, 0, 371,
-       63, 0, 372
+       61, 0, 1337,
+       62, 0, 372,
+       63, 0, 373
 };
-static int parser_action_row1228[] = {
+static int parser_action_row1230[] = {
        4,
        -1, 1, 280,
-       61, 0, 1337,
-       62, 0, 371,
-       63, 0, 372
+       61, 0, 1339,
+       62, 0, 372,
+       63, 0, 373
 };
-static int parser_action_row1229[] = {
+static int parser_action_row1231[] = {
        2,
        -1, 1, 191,
        27, 1, 641
 };
-static int parser_action_row1230[] = {
+static int parser_action_row1232[] = {
        23,
        -1, 1, 346,
        12, 0, 108,
@@ -12835,7 +12847,7 @@ static int parser_action_row1230[] = {
        47, 0, 115,
        48, 0, 116,
        51, 0, 117,
-       54, 0, 385,
+       54, 0, 386,
        68, 0, 119,
        83, 0, 49,
        84, 0, 50,
@@ -12847,7 +12859,7 @@ static int parser_action_row1230[] = {
        90, 0, 55,
        93, 0, 124
 };
-static int parser_action_row1231[] = {
+static int parser_action_row1233[] = {
        23,
        -1, 1, 346,
        12, 0, 108,
@@ -12861,7 +12873,7 @@ static int parser_action_row1231[] = {
        47, 0, 115,
        48, 0, 116,
        51, 0, 117,
-       54, 0, 385,
+       54, 0, 386,
        68, 0, 119,
        83, 0, 49,
        84, 0, 50,
@@ -12873,13 +12885,13 @@ static int parser_action_row1231[] = {
        90, 0, 55,
        93, 0, 124
 };
-static int parser_action_row1232[] = {
+static int parser_action_row1234[] = {
        3,
        -1, 1, 358,
-       12, 0, 1341,
-       84, 0, 389
+       12, 0, 1343,
+       84, 0, 390
 };
-static int parser_action_row1233[] = {
+static int parser_action_row1235[] = {
        22,
        -1, 1, 360,
        12, 0, 153,
@@ -12904,437 +12916,437 @@ static int parser_action_row1233[] = {
        90, 0, 55,
        93, 0, 56
 };
-static int parser_action_row1234[] = {
+static int parser_action_row1236[] = {
        1,
        -1, 1, 237
 };
-static int parser_action_row1235[] = {
+static int parser_action_row1237[] = {
        2,
-       -1, 3, 1234,
+       -1, 3, 1236,
        52, 0, 172
 };
-static int parser_action_row1236[] = {
+static int parser_action_row1238[] = {
        3,
        -1, 1, 378,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row1237[] = {
+static int parser_action_row1239[] = {
        1,
        -1, 1, 453
 };
-static int parser_action_row1238[] = {
+static int parser_action_row1240[] = {
        1,
        -1, 1, 750
 };
-static int parser_action_row1239[] = {
+static int parser_action_row1241[] = {
        1,
        -1, 1, 154
 };
-static int parser_action_row1240[] = {
+static int parser_action_row1242[] = {
        2,
-       -1, 3, 1239,
-       26, 0, 1345
+       -1, 3, 1241,
+       26, 0, 1347
 };
-static int parser_action_row1241[] = {
+static int parser_action_row1243[] = {
        2,
        -1, 1, 555,
-       82, 0, 472
+       82, 0, 474
 };
-static int parser_action_row1242[] = {
+static int parser_action_row1244[] = {
        1,
        -1, 1, 562
 };
-static int parser_action_row1243[] = {
+static int parser_action_row1245[] = {
        3,
        -1, 1, 378,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row1244[] = {
+static int parser_action_row1246[] = {
        1,
        -1, 1, 425
 };
-static int parser_action_row1245[] = {
+static int parser_action_row1247[] = {
        2,
-       -1, 3, 1244,
-       66, 0, 1242
+       -1, 3, 1246,
+       66, 0, 1244
 };
-static int parser_action_row1246[] = {
+static int parser_action_row1248[] = {
        5,
        -1, 1, 360,
-       12, 0, 1270,
-       49, 0, 1271,
+       12, 0, 1272,
+       49, 0, 1273,
        83, 0, 49,
        84, 0, 50
 };
-static int parser_action_row1247[] = {
+static int parser_action_row1249[] = {
        2,
-       -1, 3, 1246,
-       55, 0, 1349
+       -1, 3, 1248,
+       55, 0, 1351
 };
-static int parser_action_row1248[] = {
+static int parser_action_row1250[] = {
        1,
        -1, 1, 288
 };
-static int parser_action_row1249[] = {
+static int parser_action_row1251[] = {
        1,
        -1, 1, 287
 };
-static int parser_action_row1250[] = {
+static int parser_action_row1252[] = {
        1,
        -1, 1, 398
 };
-static int parser_action_row1251[] = {
+static int parser_action_row1253[] = {
        20,
        -1, 1, 360,
-       12, 0, 845,
-       34, 0, 847,
-       41, 0, 848,
-       43, 0, 849,
-       45, 0, 850,
-       46, 0, 851,
-       47, 0, 852,
-       48, 0, 853,
-       51, 0, 854,
-       54, 0, 855,
-       68, 0, 856,
+       12, 0, 847,
+       34, 0, 849,
+       41, 0, 850,
+       43, 0, 851,
+       45, 0, 852,
+       46, 0, 853,
+       47, 0, 854,
+       48, 0, 855,
+       51, 0, 856,
+       54, 0, 857,
+       68, 0, 858,
        83, 0, 49,
        84, 0, 50,
-       86, 0, 857,
-       87, 0, 858,
-       88, 0, 859,
-       89, 0, 860,
+       86, 0, 859,
+       87, 0, 860,
+       88, 0, 861,
+       89, 0, 862,
        90, 0, 55,
-       93, 0, 861
+       93, 0, 863
 };
-static int parser_action_row1252[] = {
+static int parser_action_row1254[] = {
        1,
        -1, 1, 397
 };
-static int parser_action_row1253[] = {
+static int parser_action_row1255[] = {
        1,
        -1, 1, 400
 };
-static int parser_action_row1254[] = {
+static int parser_action_row1256[] = {
        3,
        -1, 1, 408,
-       67, 0, 1008,
-       68, 0, 1009
+       67, 0, 1010,
+       68, 0, 1011
 };
-static int parser_action_row1255[] = {
+static int parser_action_row1257[] = {
        3,
        -1, 1, 411,
-       67, 0, 1008,
-       68, 0, 1009
+       67, 0, 1010,
+       68, 0, 1011
 };
-static int parser_action_row1256[] = {
+static int parser_action_row1258[] = {
        2,
-       -1, 3, 1255,
-       83, 0, 1351
+       -1, 3, 1257,
+       83, 0, 1353
 };
-static int parser_action_row1257[] = {
+static int parser_action_row1259[] = {
        2,
        -1, 1, 316,
        82, 0, 183
 };
-static int parser_action_row1258[] = {
+static int parser_action_row1260[] = {
        1,
        -1, 1, 413
 };
-static int parser_action_row1259[] = {
+static int parser_action_row1261[] = {
        4,
        -1, 1, 415,
-       69, 0, 1017,
-       70, 0, 1018,
-       71, 0, 1019
+       69, 0, 1019,
+       70, 0, 1020,
+       71, 0, 1021
 };
-static int parser_action_row1260[] = {
+static int parser_action_row1262[] = {
        4,
        -1, 1, 416,
-       69, 0, 1017,
-       70, 0, 1018,
-       71, 0, 1019
+       69, 0, 1019,
+       70, 0, 1020,
+       71, 0, 1021
 };
-static int parser_action_row1261[] = {
+static int parser_action_row1263[] = {
        3,
        -1, 1, 404,
-       67, 0, 1008,
-       68, 0, 1009
+       67, 0, 1010,
+       68, 0, 1011
 };
-static int parser_action_row1262[] = {
+static int parser_action_row1264[] = {
        3,
        -1, 1, 405,
-       67, 0, 1008,
-       68, 0, 1009
+       67, 0, 1010,
+       68, 0, 1011
 };
-static int parser_action_row1263[] = {
+static int parser_action_row1265[] = {
        3,
        -1, 1, 406,
-       67, 0, 1008,
-       68, 0, 1009
+       67, 0, 1010,
+       68, 0, 1011
 };
-static int parser_action_row1264[] = {
+static int parser_action_row1266[] = {
        3,
        -1, 1, 407,
-       67, 0, 1008,
-       68, 0, 1009
+       67, 0, 1010,
+       68, 0, 1011
 };
-static int parser_action_row1265[] = {
+static int parser_action_row1267[] = {
        3,
        -1, 1, 409,
-       67, 0, 1008,
-       68, 0, 1009
+       67, 0, 1010,
+       68, 0, 1011
 };
-static int parser_action_row1266[] = {
+static int parser_action_row1268[] = {
        3,
        -1, 1, 410,
-       67, 0, 1008,
-       68, 0, 1009
+       67, 0, 1010,
+       68, 0, 1011
 };
-static int parser_action_row1267[] = {
+static int parser_action_row1269[] = {
        3,
        -1, 1, 412,
-       67, 0, 1008,
-       68, 0, 1009
+       67, 0, 1010,
+       68, 0, 1011
 };
-static int parser_action_row1268[] = {
+static int parser_action_row1270[] = {
        1,
        -1, 1, 418
 };
-static int parser_action_row1269[] = {
+static int parser_action_row1271[] = {
        1,
        -1, 1, 419
 };
-static int parser_action_row1270[] = {
+static int parser_action_row1272[] = {
        1,
        -1, 1, 420
 };
-static int parser_action_row1271[] = {
+static int parser_action_row1273[] = {
        2,
        -1, 1, 342,
        54, 0, 242
 };
-static int parser_action_row1272[] = {
+static int parser_action_row1274[] = {
        3,
        -1, 1, 378,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row1273[] = {
+static int parser_action_row1275[] = {
        2,
-       -1, 3, 1272,
-       85, 0, 1355
+       -1, 3, 1274,
+       85, 0, 1357
 };
-static int parser_action_row1274[] = {
+static int parser_action_row1276[] = {
        2,
        -1, 1, 342,
        54, 0, 242
 };
-static int parser_action_row1275[] = {
+static int parser_action_row1277[] = {
        1,
        -1, 1, 126
 };
-static int parser_action_row1276[] = {
+static int parser_action_row1278[] = {
        1,
        -1, 1, 114
 };
-static int parser_action_row1277[] = {
+static int parser_action_row1279[] = {
        1,
        -1, 1, 121
 };
-static int parser_action_row1278[] = {
+static int parser_action_row1280[] = {
        20,
-       -1, 3, 1277,
-       44, 0, 1029,
-       50, 0, 346,
-       56, 0, 488,
-       67, 0, 489,
-       68, 0, 490,
-       69, 0, 491,
-       70, 0, 492,
-       71, 0, 493,
-       72, 0, 494,
-       73, 0, 495,
-       74, 0, 496,
-       75, 0, 497,
-       76, 0, 498,
-       77, 0, 499,
-       78, 0, 500,
-       79, 0, 501,
-       80, 0, 502,
-       83, 0, 347,
-       84, 0, 503
+       -1, 3, 1279,
+       44, 0, 1031,
+       50, 0, 347,
+       56, 0, 490,
+       67, 0, 491,
+       68, 0, 492,
+       69, 0, 493,
+       70, 0, 494,
+       71, 0, 495,
+       72, 0, 496,
+       73, 0, 497,
+       74, 0, 498,
+       75, 0, 499,
+       76, 0, 500,
+       77, 0, 501,
+       78, 0, 502,
+       79, 0, 503,
+       80, 0, 504,
+       83, 0, 348,
+       84, 0, 505
 };
-static int parser_action_row1279[] = {
+static int parser_action_row1281[] = {
        1,
        -1, 1, 830
 };
-static int parser_action_row1280[] = {
+static int parser_action_row1282[] = {
        3,
        -1, 1, 378,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row1281[] = {
+static int parser_action_row1283[] = {
        1,
        -1, 1, 135
 };
-static int parser_action_row1282[] = {
+static int parser_action_row1284[] = {
        1,
        -1, 1, 148
 };
-static int parser_action_row1283[] = {
+static int parser_action_row1285[] = {
        1,
        -1, 1, 387
 };
-static int parser_action_row1284[] = {
+static int parser_action_row1286[] = {
        1,
        -1, 1, 54
 };
-static int parser_action_row1285[] = {
+static int parser_action_row1287[] = {
        2,
-       -1, 3, 1284,
-       83, 0, 1041
+       -1, 3, 1286,
+       83, 0, 1043
 };
-static int parser_action_row1286[] = {
+static int parser_action_row1288[] = {
        1,
        -1, 1, 49
 };
-static int parser_action_row1287[] = {
+static int parser_action_row1289[] = {
        1,
        -1, 1, 826
 };
-static int parser_action_row1288[] = {
+static int parser_action_row1290[] = {
        2,
-       -1, 3, 1287,
-       57, 0, 1360
+       -1, 3, 1289,
+       57, 0, 1362
 };
-static int parser_action_row1289[] = {
+static int parser_action_row1291[] = {
        1,
        -1, 1, 32
 };
-static int parser_action_row1290[] = {
+static int parser_action_row1292[] = {
        3,
        -1, 1, 42,
-       9, 0, 1361,
+       9, 0, 1363,
        13, 0, 28
 };
-static int parser_action_row1291[] = {
+static int parser_action_row1293[] = {
        1,
        -1, 1, 36
 };
-static int parser_action_row1292[] = {
+static int parser_action_row1294[] = {
        2,
        -1, 1, 87,
-       14, 0, 394
+       14, 0, 395
 };
-static int parser_action_row1293[] = {
+static int parser_action_row1295[] = {
        17,
-       -1, 3, 1292,
-       56, 0, 488,
-       67, 0, 489,
-       68, 0, 490,
-       69, 0, 491,
-       70, 0, 492,
-       71, 0, 493,
-       72, 0, 494,
-       73, 0, 495,
-       74, 0, 496,
-       75, 0, 497,
-       76, 0, 498,
-       77, 0, 499,
-       78, 0, 500,
-       79, 0, 501,
-       80, 0, 502,
-       84, 0, 503
+       -1, 3, 1294,
+       56, 0, 490,
+       67, 0, 491,
+       68, 0, 492,
+       69, 0, 493,
+       70, 0, 494,
+       71, 0, 495,
+       72, 0, 496,
+       73, 0, 497,
+       74, 0, 498,
+       75, 0, 499,
+       76, 0, 500,
+       77, 0, 501,
+       78, 0, 502,
+       79, 0, 503,
+       80, 0, 504,
+       84, 0, 505
 };
-static int parser_action_row1294[] = {
+static int parser_action_row1296[] = {
        2,
-       -1, 3, 1293,
-       83, 0, 1364
+       -1, 3, 1295,
+       83, 0, 1366
 };
-static int parser_action_row1295[] = {
+static int parser_action_row1297[] = {
        21,
        -1, 1, 378,
        0, 0, 1,
        1, 0, 2,
-       54, 0, 623,
-       56, 0, 488,
-       59, 0, 624,
-       67, 0, 489,
-       68, 0, 490,
-       69, 0, 491,
-       70, 0, 492,
-       71, 0, 493,
-       72, 0, 494,
-       73, 0, 495,
-       74, 0, 496,
-       75, 0, 497,
-       76, 0, 498,
-       77, 0, 499,
-       78, 0, 500,
-       79, 0, 501,
-       80, 0, 502,
-       84, 0, 503
+       54, 0, 625,
+       56, 0, 490,
+       59, 0, 626,
+       67, 0, 491,
+       68, 0, 492,
+       69, 0, 493,
+       70, 0, 494,
+       71, 0, 495,
+       72, 0, 496,
+       73, 0, 497,
+       74, 0, 498,
+       75, 0, 499,
+       76, 0, 500,
+       77, 0, 501,
+       78, 0, 502,
+       79, 0, 503,
+       80, 0, 504,
+       84, 0, 505
 };
-static int parser_action_row1296[] = {
+static int parser_action_row1298[] = {
        1,
        -1, 1, 90
 };
-static int parser_action_row1297[] = {
+static int parser_action_row1299[] = {
        1,
        -1, 1, 91
 };
-static int parser_action_row1298[] = {
+static int parser_action_row1300[] = {
        3,
-       -1, 3, 1297,
-       84, 0, 1367,
-       85, 0, 1368
+       -1, 3, 1299,
+       84, 0, 1369,
+       85, 0, 1370
 };
-static int parser_action_row1299[] = {
+static int parser_action_row1301[] = {
        21,
        -1, 1, 378,
        0, 0, 1,
        1, 0, 2,
-       54, 0, 623,
-       56, 0, 488,
-       59, 0, 624,
-       67, 0, 489,
-       68, 0, 490,
-       69, 0, 491,
-       70, 0, 492,
-       71, 0, 493,
-       72, 0, 494,
-       73, 0, 495,
-       74, 0, 496,
-       75, 0, 497,
-       76, 0, 498,
-       77, 0, 499,
-       78, 0, 500,
-       79, 0, 501,
-       80, 0, 502,
-       84, 0, 503
+       54, 0, 625,
+       56, 0, 490,
+       59, 0, 626,
+       67, 0, 491,
+       68, 0, 492,
+       69, 0, 493,
+       70, 0, 494,
+       71, 0, 495,
+       72, 0, 496,
+       73, 0, 497,
+       74, 0, 498,
+       75, 0, 499,
+       76, 0, 500,
+       77, 0, 501,
+       78, 0, 502,
+       79, 0, 503,
+       80, 0, 504,
+       84, 0, 505
 };
-static int parser_action_row1300[] = {
+static int parser_action_row1302[] = {
        3,
-       -1, 3, 1299,
-       17, 0, 1296,
-       18, 0, 1371
+       -1, 3, 1301,
+       17, 0, 1298,
+       18, 0, 1373
 };
-static int parser_action_row1301[] = {
+static int parser_action_row1303[] = {
        4,
        -1, 1, 92,
        22, 0, 199,
        23, 0, 200,
        24, 0, 201
 };
-static int parser_action_row1302[] = {
+static int parser_action_row1304[] = {
        2,
-       -1, 3, 1301,
-       18, 0, 1373
+       -1, 3, 1303,
+       18, 0, 1375
 };
-static int parser_action_row1303[] = {
+static int parser_action_row1305[] = {
        35,
        -1, 1, 360,
        12, 0, 153,
@@ -13345,10 +13357,10 @@ static int parser_action_row1303[] = {
        29, 0, 33,
        30, 0, 34,
        34, 0, 155,
-       36, 0, 716,
-       37, 0, 717,
-       38, 0, 718,
-       39, 0, 719,
+       36, 0, 718,
+       37, 0, 719,
+       38, 0, 720,
+       39, 0, 721,
        40, 0, 40,
        41, 0, 156,
        43, 0, 157,
@@ -13356,14 +13368,14 @@ static int parser_action_row1303[] = {
        46, 0, 43,
        47, 0, 44,
        48, 0, 45,
-       50, 0, 346,
+       50, 0, 347,
        51, 0, 158,
-       53, 0, 720,
+       53, 0, 722,
        54, 0, 47,
        56, 0, 48,
        68, 0, 159,
        82, 0, 183,
-       83, 0, 721,
+       83, 0, 723,
        84, 0, 50,
        86, 0, 51,
        87, 0, 52,
@@ -13372,66 +13384,66 @@ static int parser_action_row1303[] = {
        90, 0, 55,
        93, 0, 56
 };
-static int parser_action_row1304[] = {
+static int parser_action_row1306[] = {
        1,
        -1, 1, 809
 };
-static int parser_action_row1305[] = {
+static int parser_action_row1307[] = {
        1,
        -1, 1, 812
 };
-static int parser_action_row1306[] = {
+static int parser_action_row1308[] = {
        1,
        -1, 1, 38
 };
-static int parser_action_row1307[] = {
+static int parser_action_row1309[] = {
        1,
        -1, 1, 29
 };
-static int parser_action_row1308[] = {
+static int parser_action_row1310[] = {
        4,
        -1, 1, 42,
-       9, 0, 1375,
+       9, 0, 1377,
        13, 0, 28,
-       44, 0, 1049
+       44, 0, 1051
 };
-static int parser_action_row1309[] = {
+static int parser_action_row1311[] = {
        3,
        -1, 1, 378,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row1310[] = {
+static int parser_action_row1312[] = {
        3,
        -1, 1, 42,
-       9, 0, 1377,
+       9, 0, 1379,
        13, 0, 28
 };
-static int parser_action_row1311[] = {
+static int parser_action_row1313[] = {
        1,
        -1, 1, 31
 };
-static int parser_action_row1312[] = {
+static int parser_action_row1314[] = {
        3,
        -1, 1, 42,
-       9, 0, 1378,
+       9, 0, 1380,
        13, 0, 28
 };
-static int parser_action_row1313[] = {
+static int parser_action_row1315[] = {
        1,
        -1, 1, 35
 };
-static int parser_action_row1314[] = {
+static int parser_action_row1316[] = {
        3,
        -1, 1, 378,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row1315[] = {
+static int parser_action_row1317[] = {
        1,
        -1, 1, 301
 };
-static int parser_action_row1316[] = {
+static int parser_action_row1318[] = {
        22,
        -1, 1, 360,
        12, 0, 153,
@@ -13456,48 +13468,48 @@ static int parser_action_row1316[] = {
        90, 0, 55,
        93, 0, 56
 };
-static int parser_action_row1317[] = {
+static int parser_action_row1319[] = {
        4,
-       -1, 3, 1316,
+       -1, 3, 1318,
        0, 0, 83,
        1, 0, 84,
        82, 0, 183
 };
-static int parser_action_row1318[] = {
+static int parser_action_row1320[] = {
        1,
        -1, 1, 486
 };
-static int parser_action_row1319[] = {
+static int parser_action_row1321[] = {
        1,
        -1, 1, 491
 };
-static int parser_action_row1320[] = {
+static int parser_action_row1322[] = {
        1,
        -1, 1, 488
 };
-static int parser_action_row1321[] = {
+static int parser_action_row1323[] = {
        1,
        -1, 1, 493
 };
-static int parser_action_row1322[] = {
+static int parser_action_row1324[] = {
        2,
-       -1, 3, 1321,
-       85, 0, 1383
+       -1, 3, 1323,
+       85, 0, 1385
 };
-static int parser_action_row1323[] = {
+static int parser_action_row1325[] = {
        2,
        -1, 1, 342,
        54, 0, 242
 };
-static int parser_action_row1324[] = {
+static int parser_action_row1326[] = {
        1,
        -1, 1, 489
 };
-static int parser_action_row1325[] = {
+static int parser_action_row1327[] = {
        1,
        -1, 1, 494
 };
-static int parser_action_row1326[] = {
+static int parser_action_row1328[] = {
        20,
        -1, 1, 360,
        12, 0, 108,
@@ -13520,21 +13532,21 @@ static int parser_action_row1326[] = {
        90, 0, 55,
        93, 0, 124
 };
-static int parser_action_row1327[] = {
+static int parser_action_row1329[] = {
        3,
        -1, 1, 378,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row1328[] = {
+static int parser_action_row1330[] = {
        1,
        -1, 1, 549
 };
-static int parser_action_row1329[] = {
+static int parser_action_row1331[] = {
        1,
        -1, 1, 656
 };
-static int parser_action_row1330[] = {
+static int parser_action_row1332[] = {
        22,
        -1, 1, 360,
        12, 0, 153,
@@ -13559,27 +13571,27 @@ static int parser_action_row1330[] = {
        90, 0, 55,
        93, 0, 56
 };
-static int parser_action_row1331[] = {
+static int parser_action_row1333[] = {
        2,
-       -1, 3, 1330,
-       27, 0, 1388
+       -1, 3, 1332,
+       27, 0, 1390
 };
-static int parser_action_row1332[] = {
+static int parser_action_row1334[] = {
        1,
        -1, 1, 674
 };
-static int parser_action_row1333[] = {
+static int parser_action_row1335[] = {
        2,
-       -1, 3, 1332,
+       -1, 3, 1334,
        52, 0, 172
 };
-static int parser_action_row1334[] = {
+static int parser_action_row1336[] = {
        3,
-       -1, 3, 1333,
-       55, 0, 1390,
-       58, 0, 572
+       -1, 3, 1335,
+       55, 0, 1392,
+       58, 0, 574
 };
-static int parser_action_row1335[] = {
+static int parser_action_row1337[] = {
        22,
        -1, 1, 360,
        12, 0, 153,
@@ -13604,7 +13616,7 @@ static int parser_action_row1335[] = {
        90, 0, 55,
        93, 0, 56
 };
-static int parser_action_row1336[] = {
+static int parser_action_row1338[] = {
        22,
        -1, 1, 360,
        12, 0, 153,
@@ -13629,7 +13641,7 @@ static int parser_action_row1336[] = {
        90, 0, 55,
        93, 0, 56
 };
-static int parser_action_row1337[] = {
+static int parser_action_row1339[] = {
        22,
        -1, 1, 360,
        12, 0, 153,
@@ -13654,7 +13666,7 @@ static int parser_action_row1337[] = {
        90, 0, 55,
        93, 0, 56
 };
-static int parser_action_row1338[] = {
+static int parser_action_row1340[] = {
        22,
        -1, 1, 360,
        12, 0, 153,
@@ -13679,7 +13691,7 @@ static int parser_action_row1338[] = {
        90, 0, 55,
        93, 0, 56
 };
-static int parser_action_row1339[] = {
+static int parser_action_row1341[] = {
        22,
        -1, 1, 360,
        12, 0, 153,
@@ -13704,17 +13716,17 @@ static int parser_action_row1339[] = {
        90, 0, 55,
        93, 0, 56
 };
-static int parser_action_row1340[] = {
+static int parser_action_row1342[] = {
        2,
        -1, 1, 196,
        27, 1, 646
 };
-static int parser_action_row1341[] = {
+static int parser_action_row1343[] = {
        2,
        -1, 1, 198,
        27, 1, 648
 };
-static int parser_action_row1342[] = {
+static int parser_action_row1344[] = {
        23,
        -1, 1, 346,
        12, 0, 108,
@@ -13728,7 +13740,7 @@ static int parser_action_row1342[] = {
        47, 0, 115,
        48, 0, 116,
        51, 0, 117,
-       54, 0, 385,
+       54, 0, 386,
        68, 0, 119,
        83, 0, 49,
        84, 0, 50,
@@ -13740,17 +13752,17 @@ static int parser_action_row1342[] = {
        90, 0, 55,
        93, 0, 124
 };
-static int parser_action_row1343[] = {
+static int parser_action_row1345[] = {
        3,
        -1, 1, 378,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row1344[] = {
+static int parser_action_row1346[] = {
        1,
        -1, 1, 235
 };
-static int parser_action_row1345[] = {
+static int parser_action_row1347[] = {
        22,
        -1, 1, 360,
        12, 0, 153,
@@ -13775,151 +13787,141 @@ static int parser_action_row1345[] = {
        90, 0, 55,
        93, 0, 56
 };
-static int parser_action_row1346[] = {
+static int parser_action_row1348[] = {
        3,
        -1, 1, 378,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row1347[] = {
+static int parser_action_row1349[] = {
        1,
        -1, 1, 563
 };
-static int parser_action_row1348[] = {
+static int parser_action_row1350[] = {
        3,
-       -1, 3, 1347,
+       -1, 3, 1349,
        83, 0, 49,
        84, 0, 50
 };
-static int parser_action_row1349[] = {
+static int parser_action_row1351[] = {
        2,
-       -1, 3, 1348,
-       85, 0, 1401
+       -1, 3, 1350,
+       85, 0, 1403
 };
-static int parser_action_row1350[] = {
+static int parser_action_row1352[] = {
        2,
        -1, 1, 316,
        82, 0, 183
 };
-static int parser_action_row1351[] = {
+static int parser_action_row1353[] = {
        1,
        -1, 1, 399
 };
-static int parser_action_row1352[] = {
+static int parser_action_row1354[] = {
        2,
        -1, 1, 316,
        82, 0, 183
 };
-static int parser_action_row1353[] = {
+static int parser_action_row1355[] = {
        1,
        -1, 1, 391
 };
-static int parser_action_row1354[] = {
+static int parser_action_row1356[] = {
        1,
        -1, 1, 433
 };
-static int parser_action_row1355[] = {
+static int parser_action_row1357[] = {
        3,
-       -1, 3, 1354,
-       34, 0, 1404,
-       54, 0, 1405
+       -1, 3, 1356,
+       34, 0, 1406,
+       54, 0, 1407
 };
-static int parser_action_row1356[] = {
+static int parser_action_row1358[] = {
        1,
        -1, 1, 428
 };
-static int parser_action_row1357[] = {
+static int parser_action_row1359[] = {
        1,
        -1, 1, 430
 };
-static int parser_action_row1358[] = {
+static int parser_action_row1360[] = {
        1,
        -1, 1, 130
 };
-static int parser_action_row1359[] = {
+static int parser_action_row1361[] = {
        5,
-       -1, 3, 1358,
-       34, 0, 1406,
-       50, 0, 1407,
-       54, 0, 1408,
-       83, 0, 347
+       -1, 3, 1360,
+       34, 0, 1408,
+       50, 0, 1409,
+       54, 0, 1410,
+       83, 0, 348
 };
-static int parser_action_row1360[] = {
+static int parser_action_row1362[] = {
        1,
        -1, 1, 52
 };
-static int parser_action_row1361[] = {
+static int parser_action_row1363[] = {
        1,
        -1, 1, 50
 };
-static int parser_action_row1362[] = {
+static int parser_action_row1364[] = {
        1,
        -1, 1, 40
 };
-static int parser_action_row1363[] = {
+static int parser_action_row1365[] = {
        1,
        -1, 1, 55
 };
-static int parser_action_row1364[] = {
+static int parser_action_row1366[] = {
        5,
        -1, 1, 378,
        0, 0, 1,
        1, 0, 2,
-       54, 0, 623,
-       59, 0, 624
+       54, 0, 625,
+       59, 0, 626
 };
-static int parser_action_row1365[] = {
+static int parser_action_row1367[] = {
        2,
-       -1, 3, 1364,
-       59, 0, 624
+       -1, 3, 1366,
+       59, 0, 626
 };
-static int parser_action_row1366[] = {
+static int parser_action_row1368[] = {
        5,
        -1, 1, 378,
        0, 0, 1,
        1, 0, 2,
-       54, 0, 623,
-       59, 0, 624
+       54, 0, 625,
+       59, 0, 626
 };
-static int parser_action_row1367[] = {
+static int parser_action_row1369[] = {
        3,
-       -1, 3, 1366,
-       14, 0, 1413,
-       15, 0, 1414
+       -1, 3, 1368,
+       14, 0, 1415,
+       15, 0, 1416
 };
-static int parser_action_row1368[] = {
+static int parser_action_row1370[] = {
        2,
        -1, 1, 160,
        59, 0, 290
 };
-static int parser_action_row1369[] = {
+static int parser_action_row1371[] = {
        2,
        -1, 1, 160,
        59, 0, 290
 };
-static int parser_action_row1370[] = {
+static int parser_action_row1372[] = {
        5,
        -1, 1, 378,
        0, 0, 1,
        1, 0, 2,
-       54, 0, 623,
-       59, 0, 624
+       54, 0, 625,
+       59, 0, 626
 };
-static int parser_action_row1371[] = {
+static int parser_action_row1373[] = {
        3,
        -1, 1, 143,
-       14, 0, 1419,
-       89, 0, 1035
-};
-static int parser_action_row1372[] = {
-       2,
-       -1, 3, 1371,
-       85, 0, 1421
-};
-static int parser_action_row1373[] = {
-       2,
-       -1, 3, 1372,
-       18, 0, 1422
+       14, 0, 1421,
+       89, 0, 1037
 };
 static int parser_action_row1374[] = {
        2,
@@ -13929,96 +13931,106 @@ static int parser_action_row1374[] = {
 static int parser_action_row1375[] = {
        2,
        -1, 3, 1374,
-       55, 0, 1424
+       18, 0, 1424
 };
 static int parser_action_row1376[] = {
+       2,
+       -1, 3, 1375,
+       85, 0, 1425
+};
+static int parser_action_row1377[] = {
+       2,
+       -1, 3, 1376,
+       55, 0, 1426
+};
+static int parser_action_row1378[] = {
        1,
        -1, 1, 33
 };
-static int parser_action_row1377[] = {
+static int parser_action_row1379[] = {
        3,
        -1, 1, 42,
-       9, 0, 1425,
+       9, 0, 1427,
        13, 0, 28
 };
-static int parser_action_row1378[] = {
+static int parser_action_row1380[] = {
        1,
        -1, 1, 37
 };
-static int parser_action_row1379[] = {
+static int parser_action_row1381[] = {
        1,
        -1, 1, 39
 };
-static int parser_action_row1380[] = {
+static int parser_action_row1382[] = {
        2,
-       -1, 3, 1379,
-       55, 0, 1426
+       -1, 3, 1381,
+       55, 0, 1428
 };
-static int parser_action_row1381[] = {
+static int parser_action_row1383[] = {
        1,
        -1, 1, 769
 };
-static int parser_action_row1382[] = {
+static int parser_action_row1384[] = {
        3,
-       -1, 3, 1381,
+       -1, 3, 1383,
        0, 0, 83,
        1, 0, 84
 };
-static int parser_action_row1383[] = {
+static int parser_action_row1385[] = {
        1,
        -1, 1, 325
 };
-static int parser_action_row1384[] = {
+static int parser_action_row1386[] = {
        4,
        -1, 1, 530,
-       61, 0, 1428,
-       62, 0, 371,
-       63, 0, 372
+       61, 0, 1430,
+       62, 0, 372,
+       63, 0, 373
 };
-static int parser_action_row1385[] = {
+static int parser_action_row1387[] = {
        4,
        -1, 1, 532,
-       61, 0, 1430,
-       62, 0, 371,
-       63, 0, 372
+       61, 0, 1432,
+       62, 0, 372,
+       63, 0, 373
 };
-static int parser_action_row1386[] = {
+static int parser_action_row1388[] = {
        1,
        -1, 1, 497
 };
-static int parser_action_row1387[] = {
+static int parser_action_row1389[] = {
        2,
-       -1, 3, 1386,
-       55, 0, 1432
+       -1, 3, 1388,
+       55, 0, 1434
 };
-static int parser_action_row1388[] = {
+static int parser_action_row1390[] = {
        1,
        -1, 1, 657
 };
-static int parser_action_row1389[] = {
+static int parser_action_row1391[] = {
        32,
        -1, 1, 360,
        0, 0, 1,
        1, 0, 2,
-       9, 0, 1093,
-       12, 0, 666,
-       15, 0, 667,
-       18, 0, 668,
-       25, 0, 669,
-       28, 0, 671,
-       29, 0, 672,
-       30, 0, 673,
-       36, 0, 674,
-       37, 0, 675,
-       38, 0, 676,
-       39, 0, 677,
-       40, 0, 678,
+       9, 0, 1095,
+       12, 0, 668,
+       15, 0, 669,
+       18, 0, 670,
+       25, 0, 671,
+       28, 0, 673,
+       29, 0, 674,
+       30, 0, 675,
+       36, 0, 676,
+       37, 0, 677,
+       38, 0, 678,
+       39, 0, 679,
+       40, 0, 680,
        41, 0, 41,
        45, 0, 42,
        46, 0, 43,
        47, 0, 44,
        48, 0, 45,
-       53, 0, 679,
+       53, 0, 681,
        54, 0, 47,
        56, 0, 48,
        83, 0, 49,
@@ -14030,54 +14042,54 @@ static int parser_action_row1389[] = {
        90, 0, 55,
        93, 0, 56
 };
-static int parser_action_row1390[] = {
+static int parser_action_row1392[] = {
        2,
        -1, 1, 232,
        27, 1, 673
 };
-static int parser_action_row1391[] = {
+static int parser_action_row1393[] = {
        3,
        -1, 1, 378,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row1392[] = {
+static int parser_action_row1394[] = {
        3,
        -1, 1, 378,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row1393[] = {
+static int parser_action_row1395[] = {
        1,
        -1, 1, 658
 };
-static int parser_action_row1394[] = {
+static int parser_action_row1396[] = {
        1,
        -1, 1, 663
 };
-static int parser_action_row1395[] = {
+static int parser_action_row1397[] = {
        1,
        -1, 1, 660
 };
-static int parser_action_row1396[] = {
+static int parser_action_row1398[] = {
        1,
        -1, 1, 665
 };
-static int parser_action_row1397[] = {
+static int parser_action_row1399[] = {
        2,
        -1, 1, 197,
        27, 1, 647
 };
-static int parser_action_row1398[] = {
+static int parser_action_row1400[] = {
        2,
-       -1, 3, 1397,
-       15, 0, 1436
+       -1, 3, 1399,
+       15, 0, 1438
 };
-static int parser_action_row1399[] = {
+static int parser_action_row1401[] = {
        1,
        -1, 1, 245
 };
-static int parser_action_row1400[] = {
+static int parser_action_row1402[] = {
        22,
        -1, 1, 360,
        12, 0, 153,
@@ -14102,91 +14114,91 @@ static int parser_action_row1400[] = {
        90, 0, 55,
        93, 0, 56
 };
-static int parser_action_row1401[] = {
+static int parser_action_row1403[] = {
        2,
        -1, 1, 342,
        54, 0, 242
 };
-static int parser_action_row1402[] = {
+static int parser_action_row1404[] = {
        2,
        -1, 1, 426,
        66, 1, 428
 };
-static int parser_action_row1403[] = {
+static int parser_action_row1405[] = {
        1,
        -1, 1, 446
 };
-static int parser_action_row1404[] = {
+static int parser_action_row1406[] = {
        1,
        -1, 1, 392
 };
-static int parser_action_row1405[] = {
+static int parser_action_row1407[] = {
        3,
        -1, 1, 378,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row1406[] = {
+static int parser_action_row1408[] = {
        3,
        -1, 1, 378,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row1407[] = {
+static int parser_action_row1409[] = {
        3,
        -1, 1, 378,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row1408[] = {
+static int parser_action_row1410[] = {
        2,
        -1, 1, 140,
-       83, 0, 479
+       83, 0, 481
 };
-static int parser_action_row1409[] = {
+static int parser_action_row1411[] = {
        3,
        -1, 1, 378,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row1410[] = {
+static int parser_action_row1412[] = {
        1,
        -1, 1, 138
 };
-static int parser_action_row1411[] = {
+static int parser_action_row1413[] = {
        4,
        -1, 1, 129,
-       4, 0, 749,
-       14, 0, 1443,
-       15, 0, 1444
+       4, 0, 751,
+       14, 0, 1445,
+       15, 0, 1446
 };
-static int parser_action_row1412[] = {
+static int parser_action_row1414[] = {
        2,
        -1, 1, 87,
-       14, 0, 394
+       14, 0, 395
 };
-static int parser_action_row1413[] = {
+static int parser_action_row1415[] = {
        3,
-       -1, 3, 1412,
-       14, 0, 1413,
-       15, 0, 1449
+       -1, 3, 1414,
+       14, 0, 1415,
+       15, 0, 1451
 };
-static int parser_action_row1414[] = {
+static int parser_action_row1416[] = {
        7,
-       -1, 3, 1413,
+       -1, 3, 1415,
        0, 0, 83,
        1, 0, 84,
-       4, 0, 339,
-       16, 0, 340,
-       17, 0, 341,
-       84, 0, 343
+       4, 0, 340,
+       16, 0, 341,
+       17, 0, 342,
+       84, 0, 344
 };
-static int parser_action_row1415[] = {
+static int parser_action_row1417[] = {
        32,
        -1, 1, 360,
        0, 0, 1,
        1, 0, 2,
-       9, 0, 467,
+       9, 0, 469,
        12, 0, 27,
        15, 0, 29,
        18, 0, 30,
@@ -14216,76 +14228,76 @@ static int parser_action_row1415[] = {
        90, 0, 55,
        93, 0, 56
 };
-static int parser_action_row1416[] = {
+static int parser_action_row1418[] = {
        2,
-       -1, 3, 1415,
-       15, 0, 1454
+       -1, 3, 1417,
+       15, 0, 1456
 };
-static int parser_action_row1417[] = {
+static int parser_action_row1419[] = {
        6,
        -1, 1, 42,
        0, 1, 87,
        1, 1, 87,
        13, 0, 28,
-       14, 0, 394,
-       61, 0, 1455
+       14, 0, 395,
+       61, 0, 1457
 };
-static int parser_action_row1418[] = {
+static int parser_action_row1420[] = {
        2,
        -1, 1, 64,
-       61, 0, 1459
+       61, 0, 1461
 };
-static int parser_action_row1419[] = {
+static int parser_action_row1421[] = {
        3,
        -1, 1, 143,
-       14, 0, 1460,
-       89, 0, 1035
+       14, 0, 1462,
+       89, 0, 1037
 };
-static int parser_action_row1420[] = {
+static int parser_action_row1422[] = {
        2,
-       -1, 3, 1419,
-       20, 0, 1462
+       -1, 3, 1421,
+       20, 0, 1464
 };
-static int parser_action_row1421[] = {
+static int parser_action_row1423[] = {
        2,
        -1, 1, 129,
-       4, 0, 749
+       4, 0, 751
 };
-static int parser_action_row1422[] = {
+static int parser_action_row1424[] = {
        2,
        -1, 1, 160,
        59, 0, 290
 };
-static int parser_action_row1423[] = {
+static int parser_action_row1425[] = {
        2,
-       -1, 3, 1422,
-       85, 0, 1465
+       -1, 3, 1424,
+       85, 0, 1467
 };
-static int parser_action_row1424[] = {
+static int parser_action_row1426[] = {
        2,
        -1, 1, 160,
        59, 0, 290
 };
-static int parser_action_row1425[] = {
+static int parser_action_row1427[] = {
        4,
-       -1, 3, 1424,
+       -1, 3, 1426,
        0, 0, 83,
        1, 0, 84,
        82, 0, 183
 };
-static int parser_action_row1426[] = {
+static int parser_action_row1428[] = {
        1,
        -1, 1, 41
 };
-static int parser_action_row1427[] = {
+static int parser_action_row1429[] = {
        1,
        -1, 1, 302
 };
-static int parser_action_row1428[] = {
+static int parser_action_row1430[] = {
        1,
        -1, 1, 326
 };
-static int parser_action_row1429[] = {
+static int parser_action_row1431[] = {
        22,
        -1, 1, 360,
        12, 0, 153,
@@ -14310,7 +14322,7 @@ static int parser_action_row1429[] = {
        90, 0, 55,
        93, 0, 56
 };
-static int parser_action_row1430[] = {
+static int parser_action_row1432[] = {
        22,
        -1, 1, 360,
        12, 0, 153,
@@ -14335,7 +14347,7 @@ static int parser_action_row1430[] = {
        90, 0, 55,
        93, 0, 56
 };
-static int parser_action_row1431[] = {
+static int parser_action_row1433[] = {
        22,
        -1, 1, 360,
        12, 0, 153,
@@ -14360,7 +14372,7 @@ static int parser_action_row1431[] = {
        90, 0, 55,
        93, 0, 56
 };
-static int parser_action_row1432[] = {
+static int parser_action_row1434[] = {
        22,
        -1, 1, 360,
        12, 0, 153,
@@ -14385,25 +14397,25 @@ static int parser_action_row1432[] = {
        90, 0, 55,
        93, 0, 56
 };
-static int parser_action_row1433[] = {
+static int parser_action_row1435[] = {
        1,
        -1, 1, 550
 };
-static int parser_action_row1434[] = {
+static int parser_action_row1436[] = {
        1,
        -1, 1, 670
 };
-static int parser_action_row1435[] = {
+static int parser_action_row1437[] = {
        2,
-       -1, 3, 1434,
-       31, 0, 1473
+       -1, 3, 1436,
+       31, 0, 1475
 };
-static int parser_action_row1436[] = {
+static int parser_action_row1438[] = {
        2,
-       -1, 3, 1435,
-       15, 0, 1474
+       -1, 3, 1437,
+       15, 0, 1476
 };
-static int parser_action_row1437[] = {
+static int parser_action_row1439[] = {
        32,
        -1, 1, 360,
        0, 0, 1,
@@ -14438,59 +14450,59 @@ static int parser_action_row1437[] = {
        90, 0, 55,
        93, 0, 56
 };
-static int parser_action_row1438[] = {
+static int parser_action_row1440[] = {
        3,
        -1, 1, 378,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row1439[] = {
+static int parser_action_row1441[] = {
        1,
        -1, 1, 435
 };
-static int parser_action_row1440[] = {
-       2,
-       -1, 3, 1439,
-       48, 0, 1478
-};
-static int parser_action_row1441[] = {
-       4,
-       -1, 3, 1440,
-       34, 0, 1479,
-       50, 0, 346,
-       83, 0, 347
-};
 static int parser_action_row1442[] = {
        2,
        -1, 3, 1441,
-       50, 0, 1481
+       48, 0, 1480
 };
 static int parser_action_row1443[] = {
        4,
        -1, 3, 1442,
-       34, 0, 1482,
-       50, 0, 1483,
-       83, 0, 347
+       34, 0, 1481,
+       50, 0, 347,
+       83, 0, 348
 };
 static int parser_action_row1444[] = {
-       10,
+       2,
        -1, 3, 1443,
+       50, 0, 1483
+};
+static int parser_action_row1445[] = {
+       4,
+       -1, 3, 1444,
+       34, 0, 1484,
+       50, 0, 1485,
+       83, 0, 348
+};
+static int parser_action_row1446[] = {
+       10,
+       -1, 3, 1445,
        0, 0, 83,
        1, 0, 84,
-       4, 0, 339,
-       6, 0, 1485,
-       16, 0, 340,
-       17, 0, 341,
-       19, 0, 1486,
-       20, 0, 1487,
-       84, 0, 343
+       4, 0, 340,
+       6, 0, 1487,
+       16, 0, 341,
+       17, 0, 342,
+       19, 0, 1488,
+       20, 0, 1489,
+       84, 0, 344
 };
-static int parser_action_row1445[] = {
+static int parser_action_row1447[] = {
        32,
        -1, 1, 360,
        0, 0, 1,
        1, 0, 2,
-       9, 0, 467,
+       9, 0, 469,
        12, 0, 27,
        15, 0, 29,
        18, 0, 30,
@@ -14520,31 +14532,31 @@ static int parser_action_row1445[] = {
        90, 0, 55,
        93, 0, 56
 };
-static int parser_action_row1446[] = {
+static int parser_action_row1448[] = {
        2,
-       -1, 3, 1445,
-       15, 0, 1489
+       -1, 3, 1447,
+       15, 0, 1491
 };
-static int parser_action_row1447[] = {
+static int parser_action_row1449[] = {
        3,
-       -1, 3, 1446,
+       -1, 3, 1448,
        31, 0, 35,
        96, 0, 57
 };
-static int parser_action_row1448[] = {
+static int parser_action_row1450[] = {
        1,
        -1, 1, 59
 };
-static int parser_action_row1449[] = {
+static int parser_action_row1451[] = {
        1,
        -1, 1, 80
 };
-static int parser_action_row1450[] = {
+static int parser_action_row1452[] = {
        32,
        -1, 1, 360,
        0, 0, 1,
        1, 0, 2,
-       9, 0, 467,
+       9, 0, 469,
        12, 0, 27,
        15, 0, 29,
        18, 0, 30,
@@ -14574,32 +14586,32 @@ static int parser_action_row1450[] = {
        90, 0, 55,
        93, 0, 56
 };
-static int parser_action_row1451[] = {
+static int parser_action_row1453[] = {
        2,
-       -1, 3, 1450,
-       15, 0, 1492
+       -1, 3, 1452,
+       15, 0, 1494
 };
-static int parser_action_row1452[] = {
+static int parser_action_row1454[] = {
        1,
        -1, 1, 88
 };
-static int parser_action_row1453[] = {
+static int parser_action_row1455[] = {
        3,
        -1, 1, 378,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row1454[] = {
+static int parser_action_row1456[] = {
        2,
        -1, 1, 371,
-       9, 0, 1038
+       9, 0, 1040
 };
-static int parser_action_row1455[] = {
+static int parser_action_row1457[] = {
        32,
        -1, 1, 360,
        0, 0, 1,
        1, 0, 2,
-       9, 0, 467,
+       9, 0, 469,
        12, 0, 27,
        15, 0, 29,
        18, 0, 30,
@@ -14629,127 +14641,127 @@ static int parser_action_row1455[] = {
        90, 0, 55,
        93, 0, 56
 };
-static int parser_action_row1456[] = {
+static int parser_action_row1458[] = {
        3,
        -1, 1, 378,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row1457[] = {
+static int parser_action_row1459[] = {
        4,
        -1, 1, 92,
        22, 0, 199,
        23, 0, 200,
        24, 0, 201
 };
-static int parser_action_row1458[] = {
+static int parser_action_row1460[] = {
        1,
        -1, 1, 72
 };
-static int parser_action_row1459[] = {
+static int parser_action_row1461[] = {
        3,
        -1, 1, 87,
-       14, 0, 394,
-       61, 0, 1498
+       14, 0, 395,
+       61, 0, 1500
 };
-static int parser_action_row1460[] = {
+static int parser_action_row1462[] = {
        3,
        -1, 1, 378,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row1461[] = {
+static int parser_action_row1463[] = {
        2,
-       -1, 3, 1460,
-       20, 0, 1501
+       -1, 3, 1462,
+       20, 0, 1503
 };
-static int parser_action_row1462[] = {
+static int parser_action_row1464[] = {
        2,
        -1, 1, 129,
-       4, 0, 749
+       4, 0, 751
 };
-static int parser_action_row1463[] = {
+static int parser_action_row1465[] = {
        2,
        -1, 1, 143,
-       89, 0, 1035
+       89, 0, 1037
 };
-static int parser_action_row1464[] = {
+static int parser_action_row1466[] = {
        3,
-       -1, 3, 1463,
+       -1, 3, 1465,
        31, 0, 35,
        96, 0, 57
 };
-static int parser_action_row1465[] = {
+static int parser_action_row1467[] = {
        2,
        -1, 1, 65,
-       61, 0, 1505
+       61, 0, 1507
 };
-static int parser_action_row1466[] = {
+static int parser_action_row1468[] = {
        2,
        -1, 1, 160,
        59, 0, 290
 };
-static int parser_action_row1467[] = {
+static int parser_action_row1469[] = {
        2,
        -1, 1, 66,
-       61, 0, 1507
+       61, 0, 1509
 };
-static int parser_action_row1468[] = {
+static int parser_action_row1470[] = {
        3,
-       -1, 3, 1467,
+       -1, 3, 1469,
        0, 0, 83,
        1, 0, 84
 };
-static int parser_action_row1469[] = {
+static int parser_action_row1471[] = {
        1,
        -1, 1, 810
 };
-static int parser_action_row1470[] = {
+static int parser_action_row1472[] = {
        1,
        -1, 1, 485
 };
-static int parser_action_row1471[] = {
+static int parser_action_row1473[] = {
        1,
        -1, 1, 490
 };
-static int parser_action_row1472[] = {
+static int parser_action_row1474[] = {
        1,
        -1, 1, 487
 };
-static int parser_action_row1473[] = {
+static int parser_action_row1475[] = {
        1,
        -1, 1, 492
 };
-static int parser_action_row1474[] = {
+static int parser_action_row1476[] = {
        3,
        -1, 1, 378,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row1475[] = {
+static int parser_action_row1477[] = {
        32,
        -1, 1, 360,
        0, 0, 1,
        1, 0, 2,
-       9, 0, 783,
-       12, 0, 666,
-       15, 0, 667,
-       18, 0, 668,
-       25, 0, 669,
-       28, 0, 671,
-       29, 0, 672,
-       30, 0, 673,
-       36, 0, 674,
-       37, 0, 675,
-       38, 0, 676,
-       39, 0, 677,
-       40, 0, 678,
+       9, 0, 785,
+       12, 0, 668,
+       15, 0, 669,
+       18, 0, 670,
+       25, 0, 671,
+       28, 0, 673,
+       29, 0, 674,
+       30, 0, 675,
+       36, 0, 676,
+       37, 0, 677,
+       38, 0, 678,
+       39, 0, 679,
+       40, 0, 680,
        41, 0, 41,
        45, 0, 42,
        46, 0, 43,
        47, 0, 44,
        48, 0, 45,
-       53, 0, 679,
+       53, 0, 681,
        54, 0, 47,
        56, 0, 48,
        83, 0, 49,
@@ -14761,83 +14773,83 @@ static int parser_action_row1475[] = {
        90, 0, 55,
        93, 0, 56
 };
-static int parser_action_row1476[] = {
+static int parser_action_row1478[] = {
        1,
        -1, 1, 236
 };
-static int parser_action_row1477[] = {
+static int parser_action_row1479[] = {
        2,
-       -1, 3, 1476,
+       -1, 3, 1478,
        52, 0, 172
 };
-static int parser_action_row1478[] = {
+static int parser_action_row1480[] = {
        2,
-       -1, 3, 1477,
-       27, 0, 1513
+       -1, 3, 1479,
+       27, 0, 1515
 };
-static int parser_action_row1479[] = {
+static int parser_action_row1481[] = {
        1,
        -1, 1, 449
 };
-static int parser_action_row1480[] = {
+static int parser_action_row1482[] = {
        3,
        -1, 1, 378,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row1481[] = {
+static int parser_action_row1483[] = {
        3,
        -1, 1, 378,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row1482[] = {
+static int parser_action_row1484[] = {
        1,
        -1, 1, 142
 };
-static int parser_action_row1483[] = {
+static int parser_action_row1485[] = {
        3,
        -1, 1, 378,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row1484[] = {
+static int parser_action_row1486[] = {
        4,
        -1, 1, 378,
        0, 0, 1,
        1, 0, 2,
-       83, 0, 479
+       83, 0, 481
 };
-static int parser_action_row1485[] = {
+static int parser_action_row1487[] = {
        3,
        -1, 1, 378,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row1486[] = {
+static int parser_action_row1488[] = {
        1,
        -1, 1, 60
 };
-static int parser_action_row1487[] = {
+static int parser_action_row1489[] = {
        1,
        -1, 1, 61
 };
-static int parser_action_row1488[] = {
+static int parser_action_row1490[] = {
        2,
        -1, 1, 143,
-       89, 0, 1035
+       89, 0, 1037
 };
-static int parser_action_row1489[] = {
+static int parser_action_row1491[] = {
        2,
        -1, 1, 371,
-       9, 0, 1038
+       9, 0, 1040
 };
-static int parser_action_row1490[] = {
+static int parser_action_row1492[] = {
        32,
        -1, 1, 360,
        0, 0, 1,
        1, 0, 2,
-       9, 0, 467,
+       9, 0, 469,
        12, 0, 27,
        15, 0, 29,
        18, 0, 30,
@@ -14867,21 +14879,21 @@ static int parser_action_row1490[] = {
        90, 0, 55,
        93, 0, 56
 };
-static int parser_action_row1491[] = {
+static int parser_action_row1493[] = {
        1,
        -1, 1, 63
 };
-static int parser_action_row1492[] = {
+static int parser_action_row1494[] = {
        2,
        -1, 1, 371,
-       9, 0, 1038
+       9, 0, 1040
 };
-static int parser_action_row1493[] = {
+static int parser_action_row1495[] = {
        32,
        -1, 1, 360,
        0, 0, 1,
        1, 0, 2,
-       9, 0, 467,
+       9, 0, 469,
        12, 0, 27,
        15, 0, 29,
        18, 0, 30,
@@ -14911,20 +14923,20 @@ static int parser_action_row1493[] = {
        90, 0, 55,
        93, 0, 56
 };
-static int parser_action_row1494[] = {
+static int parser_action_row1496[] = {
        1,
        -1, 1, 89
 };
-static int parser_action_row1495[] = {
+static int parser_action_row1497[] = {
        1,
        -1, 1, 76
 };
-static int parser_action_row1496[] = {
+static int parser_action_row1498[] = {
        2,
        -1, 1, 371,
-       9, 0, 1038
+       9, 0, 1040
 };
-static int parser_action_row1497[] = {
+static int parser_action_row1499[] = {
        22,
        -1, 1, 360,
        12, 0, 153,
@@ -14949,22 +14961,22 @@ static int parser_action_row1497[] = {
        90, 0, 55,
        93, 0, 56
 };
-static int parser_action_row1498[] = {
+static int parser_action_row1500[] = {
        2,
-       -1, 3, 1497,
-       17, 0, 1296
+       -1, 3, 1499,
+       17, 0, 1298
 };
-static int parser_action_row1499[] = {
+static int parser_action_row1501[] = {
        3,
        -1, 1, 378,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row1500[] = {
+static int parser_action_row1502[] = {
        1,
        -1, 1, 73
 };
-static int parser_action_row1501[] = {
+static int parser_action_row1503[] = {
        22,
        -1, 1, 360,
        12, 0, 153,
@@ -14989,48 +15001,48 @@ static int parser_action_row1501[] = {
        90, 0, 55,
        93, 0, 56
 };
-static int parser_action_row1502[] = {
+static int parser_action_row1504[] = {
        2,
        -1, 1, 143,
-       89, 0, 1035
+       89, 0, 1037
 };
-static int parser_action_row1503[] = {
+static int parser_action_row1505[] = {
        3,
-       -1, 3, 1502,
+       -1, 3, 1504,
        31, 0, 35,
        96, 0, 57
 };
-static int parser_action_row1504[] = {
+static int parser_action_row1506[] = {
        2,
        -1, 1, 129,
-       4, 0, 749
+       4, 0, 751
 };
-static int parser_action_row1505[] = {
+static int parser_action_row1507[] = {
        1,
        -1, 1, 83
 };
-static int parser_action_row1506[] = {
+static int parser_action_row1508[] = {
        3,
        -1, 1, 378,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row1507[] = {
+static int parser_action_row1509[] = {
        2,
        -1, 1, 67,
-       61, 0, 1532
+       61, 0, 1534
 };
-static int parser_action_row1508[] = {
+static int parser_action_row1510[] = {
        3,
        -1, 1, 378,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row1509[] = {
+static int parser_action_row1511[] = {
        1,
        -1, 1, 811
 };
-static int parser_action_row1510[] = {
+static int parser_action_row1512[] = {
        22,
        -1, 1, 360,
        12, 0, 153,
@@ -15055,39 +15067,29 @@ static int parser_action_row1510[] = {
        90, 0, 55,
        93, 0, 56
 };
-static int parser_action_row1511[] = {
+static int parser_action_row1513[] = {
        1,
        -1, 1, 678
 };
-static int parser_action_row1512[] = {
+static int parser_action_row1514[] = {
        2,
-       -1, 3, 1511,
+       -1, 3, 1513,
        52, 0, 172
 };
-static int parser_action_row1513[] = {
+static int parser_action_row1515[] = {
        1,
        -1, 1, 234
 };
-static int parser_action_row1514[] = {
+static int parser_action_row1516[] = {
        3,
        -1, 1, 378,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row1515[] = {
-       2,
-       -1, 3, 1514,
-       48, 0, 1537
-};
-static int parser_action_row1516[] = {
-       2,
-       -1, 3, 1515,
-       55, 0, 1538
-};
 static int parser_action_row1517[] = {
        2,
        -1, 3, 1516,
-       50, 0, 1539
+       48, 0, 1539
 };
 static int parser_action_row1518[] = {
        2,
@@ -15097,41 +15099,51 @@ static int parser_action_row1518[] = {
 static int parser_action_row1519[] = {
        2,
        -1, 3, 1518,
-       55, 0, 1541
+       50, 0, 1541
 };
 static int parser_action_row1520[] = {
        2,
-       -1, 1, 129,
-       4, 0, 749
+       -1, 3, 1519,
+       55, 0, 1542
 };
 static int parser_action_row1521[] = {
-       1,
-       -1, 1, 57
+       2,
+       -1, 3, 1520,
+       55, 0, 1543
 };
 static int parser_action_row1522[] = {
        2,
-       -1, 1, 371,
-       9, 0, 1038
+       -1, 1, 129,
+       4, 0, 751
 };
 static int parser_action_row1523[] = {
        1,
-       -1, 1, 77
+       -1, 1, 57
 };
 static int parser_action_row1524[] = {
        2,
        -1, 1, 371,
-       9, 0, 1038
+       9, 0, 1040
 };
 static int parser_action_row1525[] = {
        1,
-       -1, 1, 78
+       -1, 1, 77
 };
 static int parser_action_row1526[] = {
        2,
-       -1, 1, 87,
-       14, 0, 394
+       -1, 1, 371,
+       9, 0, 1040
 };
 static int parser_action_row1527[] = {
+       1,
+       -1, 1, 78
+};
+static int parser_action_row1528[] = {
+       2,
+       -1, 1, 87,
+       14, 0, 395
+};
+static int parser_action_row1529[] = {
        22,
        -1, 1, 360,
        12, 0, 153,
@@ -15156,26 +15168,26 @@ static int parser_action_row1527[] = {
        90, 0, 55,
        93, 0, 56
 };
-static int parser_action_row1528[] = {
+static int parser_action_row1530[] = {
        1,
        -1, 1, 68
 };
-static int parser_action_row1529[] = {
+static int parser_action_row1531[] = {
        2,
        -1, 1, 129,
-       4, 0, 749
+       4, 0, 751
 };
-static int parser_action_row1530[] = {
+static int parser_action_row1532[] = {
        1,
        -1, 1, 84
 };
-static int parser_action_row1531[] = {
+static int parser_action_row1533[] = {
        3,
        -1, 1, 149,
        31, 0, 35,
        96, 0, 57
 };
-static int parser_action_row1532[] = {
+static int parser_action_row1534[] = {
        22,
        -1, 1, 360,
        12, 0, 153,
@@ -15200,13 +15212,13 @@ static int parser_action_row1532[] = {
        90, 0, 55,
        93, 0, 56
 };
-static int parser_action_row1533[] = {
+static int parser_action_row1535[] = {
        3,
        -1, 1, 378,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row1534[] = {
+static int parser_action_row1536[] = {
        22,
        -1, 1, 360,
        12, 0, 153,
@@ -15231,103 +15243,103 @@ static int parser_action_row1534[] = {
        90, 0, 55,
        93, 0, 56
 };
-static int parser_action_row1535[] = {
+static int parser_action_row1537[] = {
        3,
        -1, 1, 378,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row1536[] = {
+static int parser_action_row1538[] = {
        2,
        -1, 1, 235,
        27, 1, 676
 };
-static int parser_action_row1537[] = {
+static int parser_action_row1539[] = {
        21,
        -1, 1, 360,
-       12, 0, 845,
-       25, 0, 846,
-       34, 0, 847,
-       41, 0, 848,
-       43, 0, 849,
-       45, 0, 850,
-       46, 0, 851,
-       47, 0, 852,
-       48, 0, 853,
-       51, 0, 854,
-       54, 0, 855,
-       68, 0, 856,
+       12, 0, 847,
+       25, 0, 848,
+       34, 0, 849,
+       41, 0, 850,
+       43, 0, 851,
+       45, 0, 852,
+       46, 0, 853,
+       47, 0, 854,
+       48, 0, 855,
+       51, 0, 856,
+       54, 0, 857,
+       68, 0, 858,
        83, 0, 49,
        84, 0, 50,
-       86, 0, 857,
-       87, 0, 858,
-       88, 0, 859,
-       89, 0, 860,
+       86, 0, 859,
+       87, 0, 860,
+       88, 0, 861,
+       89, 0, 862,
        90, 0, 55,
-       93, 0, 861
+       93, 0, 863
 };
-static int parser_action_row1538[] = {
+static int parser_action_row1540[] = {
        3,
        -1, 1, 378,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row1539[] = {
+static int parser_action_row1541[] = {
        1,
        -1, 1, 447
 };
-static int parser_action_row1540[] = {
+static int parser_action_row1542[] = {
        3,
        -1, 1, 378,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row1541[] = {
+static int parser_action_row1543[] = {
        1,
        -1, 1, 139
 };
-static int parser_action_row1542[] = {
+static int parser_action_row1544[] = {
        1,
        -1, 1, 137
 };
-static int parser_action_row1543[] = {
+static int parser_action_row1545[] = {
        3,
        -1, 1, 149,
        31, 0, 35,
        96, 0, 57
 };
-static int parser_action_row1544[] = {
+static int parser_action_row1546[] = {
        1,
        -1, 1, 58
 };
-static int parser_action_row1545[] = {
+static int parser_action_row1547[] = {
        1,
        -1, 1, 79
 };
-static int parser_action_row1546[] = {
+static int parser_action_row1548[] = {
        1,
        -1, 1, 74
 };
-static int parser_action_row1547[] = {
+static int parser_action_row1549[] = {
        2,
        -1, 1, 87,
-       14, 0, 394
+       14, 0, 395
 };
-static int parser_action_row1548[] = {
+static int parser_action_row1550[] = {
        3,
        -1, 1, 149,
        31, 0, 35,
        96, 0, 57
 };
-static int parser_action_row1549[] = {
+static int parser_action_row1551[] = {
        1,
        -1, 1, 81
 };
-static int parser_action_row1550[] = {
+static int parser_action_row1552[] = {
        1,
        -1, 1, 69
 };
-static int parser_action_row1551[] = {
+static int parser_action_row1553[] = {
        22,
        -1, 1, 360,
        12, 0, 153,
@@ -15352,69 +15364,69 @@ static int parser_action_row1551[] = {
        90, 0, 55,
        93, 0, 56
 };
-static int parser_action_row1552[] = {
+static int parser_action_row1554[] = {
        1,
        -1, 1, 70
 };
-static int parser_action_row1553[] = {
+static int parser_action_row1555[] = {
        2,
-       -1, 3, 1552,
-       15, 0, 1560
+       -1, 3, 1554,
+       15, 0, 1562
 };
-static int parser_action_row1554[] = {
+static int parser_action_row1556[] = {
        1,
        -1, 1, 395
 };
-static int parser_action_row1555[] = {
+static int parser_action_row1557[] = {
        2,
-       -1, 3, 1554,
-       55, 0, 1561
+       -1, 3, 1556,
+       55, 0, 1563
 };
-static int parser_action_row1556[] = {
+static int parser_action_row1558[] = {
        2,
-       -1, 3, 1555,
-       55, 0, 1562
+       -1, 3, 1557,
+       55, 0, 1564
 };
-static int parser_action_row1557[] = {
+static int parser_action_row1559[] = {
        1,
        -1, 1, 62
 };
-static int parser_action_row1558[] = {
+static int parser_action_row1560[] = {
        1,
        -1, 1, 75
 };
-static int parser_action_row1559[] = {
+static int parser_action_row1561[] = {
        1,
        -1, 1, 82
 };
-static int parser_action_row1560[] = {
+static int parser_action_row1562[] = {
        1,
        -1, 1, 71
 };
-static int parser_action_row1561[] = {
+static int parser_action_row1563[] = {
        32,
        -1, 1, 360,
        0, 0, 1,
        1, 0, 2,
-       9, 0, 783,
-       12, 0, 666,
-       15, 0, 667,
-       18, 0, 668,
-       25, 0, 669,
-       28, 0, 671,
-       29, 0, 672,
-       30, 0, 673,
-       36, 0, 674,
-       37, 0, 675,
-       38, 0, 676,
-       39, 0, 677,
-       40, 0, 678,
+       9, 0, 785,
+       12, 0, 668,
+       15, 0, 669,
+       18, 0, 670,
+       25, 0, 671,
+       28, 0, 673,
+       29, 0, 674,
+       30, 0, 675,
+       36, 0, 676,
+       37, 0, 677,
+       38, 0, 678,
+       39, 0, 679,
+       40, 0, 680,
        41, 0, 41,
        45, 0, 42,
        46, 0, 43,
        47, 0, 44,
        48, 0, 45,
-       53, 0, 679,
+       53, 0, 681,
        54, 0, 47,
        56, 0, 48,
        83, 0, 49,
@@ -15426,24 +15438,24 @@ static int parser_action_row1561[] = {
        90, 0, 55,
        93, 0, 56
 };
-static int parser_action_row1562[] = {
+static int parser_action_row1564[] = {
        1,
        -1, 1, 448
 };
-static int parser_action_row1563[] = {
+static int parser_action_row1565[] = {
        1,
        -1, 1, 141
 };
-static int parser_action_row1564[] = {
+static int parser_action_row1566[] = {
        1,
        -1, 1, 677
 };
-static int parser_action_row1565[] = {
+static int parser_action_row1567[] = {
        2,
-       -1, 3, 1564,
+       -1, 3, 1566,
        52, 0, 172
 };
-static int parser_action_row1566[] = {
+static int parser_action_row1568[] = {
        2,
        -1, 1, 234,
        27, 1, 675
@@ -17015,7 +17027,9 @@ const int* const parser_action_table[] = {
        parser_action_row1563,
        parser_action_row1564,
        parser_action_row1565,
-       parser_action_row1566
+       parser_action_row1566,
+       parser_action_row1567,
+       parser_action_row1568
 };
 
 static int parser_goto_row1[] = {
@@ -17060,8 +17074,8 @@ static int parser_goto_row5[] = {
        101, 234,
        102, 236,
        104, 237,
-       230, 390,
-       235, 392
+       230, 391,
+       235, 393
 };
 static int parser_goto_row6[] = {
        1,
@@ -17073,165 +17087,165 @@ static int parser_goto_row7[] = {
 };
 static int parser_goto_row8[] = {
        9,
-       -1, 1051,
+       -1, 1053,
        12, 58,
        22, 58,
        92, 232,
        96, 232,
-       1052, 1182,
-       1053, 1184,
-       1183, 1300,
-       1416, 1456
+       1054, 1184,
+       1055, 1186,
+       1185, 1302,
+       1418, 1458
 };
 static int parser_goto_row9[] = {
        1,
-       -1, 364
+       -1, 365
 };
 static int parser_goto_row10[] = {
        1,
-       -1, 757
+       -1, 759
 };
 static int parser_goto_row11[] = {
        2,
-       -1, 1173,
-       1175, 1286
+       -1, 1175,
+       1177, 1288
 };
 static int parser_goto_row12[] = {
        2,
-       -1, 1042,
-       1284, 1359
+       -1, 1044,
+       1286, 1361
 };
 static int parser_goto_row13[] = {
        5,
-       -1, 887,
-       893, 1055,
-       1045, 1055,
-       1063, 1055,
-       1193, 1055
+       -1, 889,
+       895, 1057,
+       1047, 1057,
+       1065, 1057,
+       1195, 1057
 };
 static int parser_goto_row14[] = {
        9,
-       -1, 888,
-       894, 1058,
-       1046, 1058,
-       1057, 1058,
-       1064, 1058,
-       1178, 1058,
-       1194, 1058,
-       1197, 1058,
-       1308, 1058
+       -1, 890,
+       896, 1060,
+       1048, 1060,
+       1059, 1060,
+       1066, 1060,
+       1180, 1060,
+       1196, 1060,
+       1199, 1060,
+       1310, 1060
 };
 static int parser_goto_row15[] = {
        1,
-       -1, 889
+       -1, 891
 };
 static int parser_goto_row16[] = {
        8,
-       -1, 395,
-       620, 745,
-       1291, 1362,
-       1411, 1448,
-       1416, 1457,
-       1458, 1499,
-       1525, 1545,
-       1546, 1557
+       -1, 396,
+       622, 747,
+       1293, 1364,
+       1413, 1450,
+       1418, 1459,
+       1460, 1501,
+       1527, 1547,
+       1548, 1559
 };
 static int parser_goto_row17[] = {
        4,
-       -1, 752,
-       1366, 1415,
-       1410, 1445,
-       1412, 1450
+       -1, 754,
+       1368, 1417,
+       1412, 1447,
+       1414, 1452
 };
 static int parser_goto_row18[] = {
        1,
-       -1, 1052
+       -1, 1054
 };
 static int parser_goto_row19[] = {
        3,
-       -1, 1053,
-       1052, 1183,
-       1416, 1458
+       -1, 1055,
+       1054, 1185,
+       1418, 1460
 };
 static int parser_goto_row20[] = {
        7,
        -1, 202,
-       232, 391,
-       1051, 1181,
-       1182, 1299,
+       232, 392,
+       1053, 1183,
        1184, 1301,
-       1300, 1372,
-       1456, 1497
+       1186, 1303,
+       1302, 1374,
+       1458, 1499
 };
 static int parser_goto_row21[] = {
        6,
-       -1, 1030,
-       362, 504,
-       1166, 1280,
-       1292, 1363,
+       -1, 1032,
+       363, 506,
+       1168, 1282,
        1294, 1365,
-       1298, 1369
+       1296, 1367,
+       1300, 1371
 };
 static int parser_goto_row22[] = {
        6,
-       -1, 625,
-       1294, 1366,
-       1298, 1370,
-       1363, 1410,
+       -1, 627,
+       1296, 1368,
+       1300, 1372,
        1365, 1412,
-       1369, 1418
+       1367, 1414,
+       1371, 1420
 };
 static int parser_goto_row23[] = {
        1,
-       -1, 876
+       -1, 878
 };
 static int parser_goto_row24[] = {
        2,
-       -1, 1026,
-       1028, 1161
+       -1, 1028,
+       1030, 1163
 };
 static int parser_goto_row25[] = {
        2,
-       -1, 877,
-       1160, 1276
+       -1, 879,
+       1162, 1278
 };
 static int parser_goto_row26[] = {
        8,
-       -1, 753,
-       1036, 1167,
-       1410, 1446,
-       1420, 1463,
-       1461, 1502,
-       1503, 1530,
-       1519, 1542,
-       1528, 1547
+       -1, 755,
+       1038, 1169,
+       1412, 1448,
+       1422, 1465,
+       1463, 1504,
+       1505, 1532,
+       1521, 1544,
+       1530, 1549
 };
 static int parser_goto_row27[] = {
        2,
-       -1, 1164,
-       1165, 1278
+       -1, 1166,
+       1167, 1280
 };
 static int parser_goto_row28[] = {
        2,
-       -1, 1031,
-       1277, 1357
+       -1, 1033,
+       1279, 1359
 };
 static int parser_goto_row29[] = {
        1,
-       -1, 1032
+       -1, 1034
 };
 static int parser_goto_row30[] = {
        1,
-       -1, 1033
+       -1, 1035
 };
 static int parser_goto_row31[] = {
        6,
-       -1, 1036,
-       1370, 1420,
-       1418, 1461,
-       1462, 1503,
-       1487, 1519,
-       1501, 1528
+       -1, 1038,
+       1372, 1422,
+       1420, 1463,
+       1464, 1505,
+       1489, 1521,
+       1503, 1530
 };
 static int parser_goto_row32[] = {
        1,
@@ -17239,23 +17253,23 @@ static int parser_goto_row32[] = {
 };
 static int parser_goto_row33[] = {
        10,
-       -1, 1281,
+       -1, 1283,
        12, 60,
        22, 60,
        92, 60,
-       753, 885,
-       757, 890,
-       895, 1060,
-       1446, 1490,
-       1463, 1504,
-       1502, 1529
+       755, 887,
+       759, 892,
+       897, 1062,
+       1448, 1492,
+       1465, 1506,
+       1504, 1531
 };
 static int parser_goto_row34[] = {
        4,
-       -1, 1282,
-       1530, 1548,
-       1542, 1556,
-       1547, 1558
+       -1, 1284,
+       1532, 1550,
+       1544, 1558,
+       1549, 1560
 };
 static int parser_goto_row35[] = {
        5,
@@ -17267,91 +17281,91 @@ static int parser_goto_row35[] = {
 };
 static int parser_goto_row36[] = {
        24,
-       -1, 708,
-       189, 348,
-       416, 546,
-       432, 565,
-       452, 582,
-       609, 722,
-       748, 878,
-       774, 911,
-       802, 946,
-       836, 971,
-       879, 1034,
-       898, 1067,
-       931, 1085,
-       965, 1113,
-       974, 722,
-       1054, 911,
-       1073, 1203,
-       1074, 722,
-       1180, 1291,
-       1277, 1034,
-       1302, 722,
-       1358, 1409,
-       1440, 1480,
-       1442, 1484
+       -1, 710,
+       189, 349,
+       417, 548,
+       433, 567,
+       454, 584,
+       611, 724,
+       750, 880,
+       776, 913,
+       804, 948,
+       838, 973,
+       881, 1036,
+       900, 1069,
+       933, 1087,
+       967, 1115,
+       976, 724,
+       1056, 913,
+       1075, 1205,
+       1076, 724,
+       1182, 1293,
+       1279, 1036,
+       1304, 724,
+       1360, 1411,
+       1442, 1482,
+       1444, 1486
 };
 static int parser_goto_row37[] = {
        4,
-       -1, 709,
-       612, 739,
-       707, 822,
-       738, 842
+       -1, 711,
+       614, 741,
+       709, 824,
+       740, 844
 };
 static int parser_goto_row38[] = {
        2,
-       -1, 824,
-       825, 966
+       -1, 826,
+       827, 968
 };
 static int parser_goto_row39[] = {
        5,
-       -1, 626,
-       875, 1021,
-       1022, 1157,
-       1024, 1158,
-       1364, 1411
+       -1, 628,
+       877, 1023,
+       1024, 1159,
+       1026, 1160,
+       1366, 1413
 };
 static int parser_goto_row40[] = {
        11,
        -1, 291,
-       292, 434,
-       788, 935,
-       936, 1087,
-       1041, 1170,
-       1171, 1283,
-       1367, 1416,
-       1368, 1417,
-       1421, 1464,
+       292, 435,
+       790, 937,
+       938, 1089,
+       1043, 1172,
+       1173, 1285,
+       1369, 1418,
+       1370, 1419,
        1423, 1466,
-       1465, 1506
+       1425, 1468,
+       1467, 1508
 };
 static int parser_goto_row41[] = {
        24,
        -1, 142,
        33, 149,
-       335, 468,
-       466, 598,
-       569, 697,
-       670, 790,
-       672, 149,
-       751, 883,
-       813, 958,
-       884, 1040,
-       945, 468,
-       1092, 598,
-       1110, 1233,
-       1218, 697,
-       1388, 958,
-       1414, 1453,
-       1436, 1475,
-       1444, 1488,
-       1449, 1491,
-       1454, 1495,
-       1474, 1233,
-       1489, 1521,
-       1492, 1523,
-       1560, 1475
+       336, 470,
+       468, 600,
+       571, 699,
+       672, 792,
+       674, 149,
+       753, 885,
+       815, 960,
+       886, 1042,
+       947, 470,
+       1094, 600,
+       1112, 1235,
+       1220, 699,
+       1390, 960,
+       1416, 1455,
+       1438, 1477,
+       1446, 1490,
+       1451, 1493,
+       1456, 1497,
+       1476, 1235,
+       1491, 1523,
+       1494, 1525,
+       1562, 1477
 };
 static int parser_goto_row42[] = {
        1,
@@ -17360,21 +17374,21 @@ static int parser_goto_row42[] = {
 static int parser_goto_row43[] = {
        2,
        -1, 62,
-       686, 810
+       688, 812
 };
 static int parser_goto_row44[] = {
        4,
        -1, 287,
-       469, 600,
-       784, 933,
-       1094, 1223
+       471, 602,
+       786, 935,
+       1096, 1225
 };
 static int parser_goto_row45[] = {
        4,
        -1, 204,
-       206, 366,
-       431, 366,
-       957, 366
+       206, 367,
+       432, 367,
+       959, 367
 };
 static int parser_goto_row46[] = {
        16,
@@ -17384,16 +17398,16 @@ static int parser_goto_row46[] = {
        92, 63,
        96, 63,
        144, 288,
-       205, 365,
-       367, 365,
-       430, 365,
-       469, 288,
-       564, 365,
-       568, 680,
-       686, 811,
-       784, 288,
-       1094, 288,
-       1217, 680
+       205, 366,
+       368, 366,
+       431, 366,
+       471, 288,
+       566, 366,
+       570, 682,
+       688, 813,
+       786, 288,
+       1096, 288,
+       1219, 682
 };
 static int parser_goto_row47[] = {
        18,
@@ -17401,20 +17415,20 @@ static int parser_goto_row47[] = {
        38, 175,
        145, 289,
        150, 295,
-       675, 796,
-       676, 798,
-       698, 816,
-       717, 832,
-       718, 834,
-       787, 934,
-       793, 939,
-       906, 1069,
-       907, 1071,
-       1234, 1343,
-       1332, 1389,
-       1476, 1512,
-       1511, 1535,
-       1564, 1565
+       677, 798,
+       678, 800,
+       700, 818,
+       719, 834,
+       720, 836,
+       789, 936,
+       795, 941,
+       908, 1071,
+       909, 1073,
+       1236, 1345,
+       1334, 1391,
+       1478, 1514,
+       1513, 1537,
+       1566, 1567
 };
 static int parser_goto_row48[] = {
        1,
@@ -17423,48 +17437,48 @@ static int parser_goto_row48[] = {
 static int parser_goto_row49[] = {
        7,
        -1, 64,
-       609, 723,
-       774, 912,
-       974, 723,
-       1054, 912,
-       1074, 723,
-       1302, 723
+       611, 725,
+       776, 914,
+       976, 725,
+       1056, 914,
+       1076, 725,
+       1304, 725
 };
 static int parser_goto_row50[] = {
        5,
        -1, 65,
-       609, 724,
-       974, 724,
-       1074, 724,
-       1302, 724
+       611, 726,
+       976, 726,
+       1076, 726,
+       1304, 726
 };
 static int parser_goto_row51[] = {
        15,
-       -1, 373,
-       219, 382,
-       220, 384,
-       636, 764,
-       637, 766,
-       804, 949,
-       806, 952,
-       807, 954,
-       1076, 1206,
-       1077, 1208,
-       1079, 1211,
-       1226, 1336,
-       1227, 1338,
-       1383, 1429,
-       1384, 1431
+       -1, 374,
+       219, 383,
+       220, 385,
+       638, 766,
+       639, 768,
+       806, 951,
+       808, 954,
+       809, 956,
+       1078, 1208,
+       1079, 1210,
+       1081, 1213,
+       1228, 1338,
+       1229, 1340,
+       1385, 1431,
+       1386, 1433
 };
 static int parser_goto_row52[] = {
        7,
        -1, 66,
-       609, 725,
-       774, 913,
-       974, 725,
-       1054, 913,
-       1074, 725,
-       1302, 725
+       611, 727,
+       776, 915,
+       976, 727,
+       1056, 915,
+       1076, 727,
+       1304, 727
 };
 static int parser_goto_row53[] = {
        1,
@@ -17472,54 +17486,54 @@ static int parser_goto_row53[] = {
 };
 static int parser_goto_row54[] = {
        3,
-       -1, 681,
-       686, 812,
-       810, 956
+       -1, 683,
+       688, 814,
+       812, 958
 };
 static int parser_goto_row55[] = {
        7,
        -1, 68,
-       609, 726,
-       774, 914,
-       974, 726,
-       1054, 914,
-       1074, 726,
-       1302, 726
+       611, 728,
+       776, 916,
+       976, 728,
+       1056, 916,
+       1076, 728,
+       1304, 728
 };
 static int parser_goto_row56[] = {
        7,
        -1, 69,
-       609, 727,
-       774, 915,
-       974, 727,
-       1054, 915,
-       1074, 727,
-       1302, 727
+       611, 729,
+       776, 917,
+       976, 729,
+       1056, 917,
+       1076, 729,
+       1304, 729
 };
 static int parser_goto_row57[] = {
        7,
        -1, 70,
-       609, 728,
-       774, 916,
-       974, 728,
-       1054, 916,
-       1074, 728,
-       1302, 728
+       611, 730,
+       776, 918,
+       976, 730,
+       1056, 918,
+       1076, 730,
+       1304, 730
 };
 static int parser_goto_row58[] = {
        7,
        -1, 71,
-       609, 729,
-       774, 917,
-       974, 729,
-       1054, 917,
-       1074, 729,
-       1302, 729
+       611, 731,
+       776, 919,
+       976, 731,
+       1056, 919,
+       1076, 731,
+       1304, 731
 };
 static int parser_goto_row59[] = {
        2,
        -1, 178,
-       678, 800
+       680, 802
 };
 static int parser_goto_row60[] = {
        61,
@@ -17527,63 +17541,63 @@ static int parser_goto_row60[] = {
        37, 174,
        38, 176,
        40, 179,
-       173, 330,
-       175, 331,
-       178, 333,
-       370, 513,
-       373, 514,
-       381, 518,
-       382, 519,
-       383, 520,
-       384, 521,
-       482, 613,
-       566, 663,
-       664, 781,
-       675, 174,
-       676, 176,
-       678, 179,
-       716, 831,
-       717, 833,
-       718, 835,
-       763, 899,
-       764, 900,
+       173, 331,
+       175, 332,
+       178, 334,
+       371, 515,
+       374, 516,
+       382, 520,
+       383, 521,
+       384, 522,
+       385, 523,
+       484, 615,
+       568, 665,
+       666, 783,
+       677, 174,
+       678, 176,
+       680, 179,
+       718, 833,
+       719, 835,
+       720, 837,
        765, 901,
        766, 902,
-       796, 330,
+       767, 903,
+       768, 904,
        798, 331,
-       800, 333,
-       832, 969,
-       834, 970,
-       905, 1068,
-       906, 1070,
-       907, 1072,
-       948, 513,
-       949, 514,
-       951, 518,
-       952, 519,
+       800, 332,
+       802, 334,
+       834, 971,
+       836, 972,
+       907, 1070,
+       908, 1072,
+       909, 1074,
+       950, 515,
+       951, 516,
        953, 520,
        954, 521,
-       1069, 1201,
-       1071, 1202,
-       1096, 613,
-       1116, 1237,
-       1205, 1317,
-       1206, 1318,
+       955, 522,
+       956, 523,
+       1071, 1203,
+       1073, 1204,
+       1098, 615,
+       1118, 1239,
        1207, 1319,
        1208, 1320,
-       1210, 1323,
-       1211, 1324,
-       1215, 663,
-       1315, 1380,
-       1329, 781,
-       1335, 899,
-       1336, 900,
+       1209, 1321,
+       1210, 1322,
+       1212, 1325,
+       1213, 1326,
+       1217, 665,
+       1317, 1382,
+       1331, 783,
        1337, 901,
        1338, 902,
-       1428, 1469,
-       1429, 1470,
+       1339, 903,
+       1340, 904,
        1430, 1471,
-       1431, 1472
+       1431, 1472,
+       1432, 1473,
+       1433, 1474
 };
 static int parser_goto_row61[] = {
        58,
@@ -17592,59 +17606,59 @@ static int parser_goto_row61[] = {
        147, 293,
        148, 294,
        178, 180,
-       190, 349,
-       191, 350,
-       216, 378,
-       244, 398,
-       255, 406,
-       299, 439,
-       368, 406,
-       374, 515,
-       397, 406,
-       522, 406,
-       609, 730,
-       674, 180,
-       675, 180,
+       190, 350,
+       191, 351,
+       216, 379,
+       244, 399,
+       255, 407,
+       300, 441,
+       369, 407,
+       375, 517,
+       398, 407,
+       524, 407,
+       611, 732,
        676, 180,
+       677, 180,
        678, 180,
-       700, 818,
-       741, 844,
-       776, 928,
-       789, 937,
-       791, 938,
-       796, 180,
+       680, 180,
+       702, 820,
+       743, 846,
+       778, 930,
+       791, 939,
+       793, 940,
        798, 180,
        800, 180,
-       820, 963,
-       948, 180,
-       949, 180,
+       802, 180,
+       822, 965,
+       950, 180,
        951, 180,
-       952, 180,
        953, 180,
        954, 180,
-       974, 730,
-       980, 1122,
-       991, 1131,
-       1074, 730,
-       1096, 180,
-       1215, 180,
-       1232, 1342,
-       1302, 730,
-       1329, 180,
-       1334, 1391,
-       1335, 180,
-       1336, 180,
+       955, 180,
+       956, 180,
+       976, 732,
+       982, 1124,
+       993, 1133,
+       1076, 732,
+       1098, 180,
+       1217, 180,
+       1234, 1344,
+       1304, 732,
+       1331, 180,
+       1336, 1393,
        1337, 180,
        1338, 180,
-       1344, 1398,
-       1399, 1437,
-       1496, 1525,
-       1500, 1527,
-       1509, 1534,
-       1526, 1546,
-       1531, 1549,
+       1339, 180,
+       1340, 180,
+       1346, 1400,
+       1401, 1439,
+       1498, 1527,
+       1502, 1529,
+       1511, 1536,
+       1528, 1548,
        1533, 1551,
-       1550, 1559
+       1535, 1553,
+       1552, 1561
 };
 static int parser_goto_row62[] = {
        1,
@@ -17653,11 +17667,11 @@ static int parser_goto_row62[] = {
 static int parser_goto_row63[] = {
        6,
        -1, 163,
-       300, 440,
-       446, 576,
+       301, 442,
        448, 578,
-       449, 579,
-       577, 704
+       450, 580,
+       451, 581,
+       579, 706
 };
 static int parser_goto_row64[] = {
        1,
@@ -17666,30 +17680,30 @@ static int parser_goto_row64[] = {
 static int parser_goto_row65[] = {
        10,
        -1, 165,
-       450, 580,
-       451, 581,
-       455, 585,
-       456, 586,
+       452, 582,
+       453, 583,
        457, 587,
        458, 588,
        459, 589,
        460, 590,
-       461, 591
+       461, 591,
+       462, 592,
+       463, 593
 };
 static int parser_goto_row66[] = {
        3,
        -1, 166,
-       453, 583,
-       454, 584
+       455, 585,
+       456, 586
 };
 static int parser_goto_row67[] = {
        6,
        -1, 167,
-       302, 442,
-       305, 445,
-       462, 592,
-       463, 593,
-       464, 594
+       303, 444,
+       306, 447,
+       464, 594,
+       465, 595,
+       466, 596
 };
 static int parser_goto_row68[] = {
        1,
@@ -17705,44 +17719,44 @@ static int parser_goto_row69[] = {
        92, 72,
        96, 72,
        144, 72,
-       158, 303,
+       158, 304,
        205, 72,
-       335, 72,
-       367, 72,
-       430, 72,
-       466, 72,
-       469, 72,
-       564, 72,
-       568, 682,
-       569, 72,
-       609, 731,
-       667, 682,
-       670, 72,
-       672, 682,
-       686, 72,
-       751, 72,
-       784, 72,
-       813, 72,
-       884, 72,
-       945, 682,
-       974, 731,
-       1074, 731,
-       1092, 682,
-       1094, 72,
-       1110, 72,
-       1217, 682,
-       1218, 682,
-       1302, 731,
-       1388, 682,
-       1414, 72,
-       1436, 72,
-       1444, 72,
-       1449, 72,
-       1454, 72,
-       1474, 682,
-       1489, 72,
-       1492, 72,
-       1560, 682
+       336, 72,
+       368, 72,
+       431, 72,
+       468, 72,
+       471, 72,
+       566, 72,
+       570, 684,
+       571, 72,
+       611, 733,
+       669, 684,
+       672, 72,
+       674, 684,
+       688, 72,
+       753, 72,
+       786, 72,
+       815, 72,
+       886, 72,
+       947, 684,
+       976, 733,
+       1076, 733,
+       1094, 684,
+       1096, 72,
+       1112, 72,
+       1219, 684,
+       1220, 684,
+       1304, 733,
+       1390, 684,
+       1416, 72,
+       1438, 72,
+       1446, 72,
+       1451, 72,
+       1456, 72,
+       1476, 684,
+       1491, 72,
+       1494, 72,
+       1562, 684
 };
 static int parser_goto_row70[] = {
        72,
@@ -17756,13 +17770,12 @@ static int parser_goto_row70[] = {
        245, 125,
        247, 125,
        256, 125,
-       388, 125,
-       410, 125,
-       412, 125,
+       389, 125,
+       411, 125,
        413, 125,
        414, 125,
        415, 125,
-       417, 125,
+       416, 125,
        418, 125,
        419, 125,
        420, 125,
@@ -17774,50 +17787,51 @@ static int parser_goto_row70[] = {
        426, 125,
        427, 125,
        428, 125,
-       507, 125,
-       510, 125,
-       541, 125,
-       639, 125,
-       640, 125,
-       666, 125,
-       684, 125,
-       742, 862,
-       769, 125,
-       774, 125,
-       805, 125,
-       809, 125,
-       814, 125,
-       854, 862,
-       960, 125,
-       981, 862,
-       983, 862,
-       992, 862,
-       1054, 125,
-       1097, 125,
+       429, 125,
+       509, 125,
+       512, 125,
+       543, 125,
+       641, 125,
+       642, 125,
+       668, 125,
+       686, 125,
+       744, 864,
+       771, 125,
+       776, 125,
+       807, 125,
+       811, 125,
+       816, 125,
+       856, 864,
+       962, 125,
+       983, 864,
+       985, 864,
+       994, 864,
+       1056, 125,
        1099, 125,
-       1136, 862,
-       1138, 862,
-       1139, 862,
-       1140, 862,
-       1141, 862,
-       1143, 862,
-       1144, 862,
-       1145, 862,
-       1146, 862,
-       1147, 862,
-       1148, 862,
-       1149, 862,
-       1150, 862,
-       1151, 862,
-       1152, 862,
-       1153, 862,
-       1154, 862,
-       1229, 125,
-       1230, 125,
-       1250, 862,
-       1325, 125,
-       1341, 125,
-       1536, 862
+       1101, 125,
+       1138, 864,
+       1140, 864,
+       1141, 864,
+       1142, 864,
+       1143, 864,
+       1145, 864,
+       1146, 864,
+       1147, 864,
+       1148, 864,
+       1149, 864,
+       1150, 864,
+       1151, 864,
+       1152, 864,
+       1153, 864,
+       1154, 864,
+       1155, 864,
+       1156, 864,
+       1231, 125,
+       1232, 125,
+       1252, 864,
+       1327, 125,
+       1343, 125,
+       1538, 864
 };
 static int parser_goto_row71[] = {
        1,
@@ -17830,7 +17844,7 @@ static int parser_goto_row72[] = {
 static int parser_goto_row73[] = {
        2,
        -1, 212,
-       215, 376
+       215, 377
 };
 static int parser_goto_row74[] = {
        1,
@@ -17839,27 +17853,27 @@ static int parser_goto_row74[] = {
 static int parser_goto_row75[] = {
        2,
        -1, 214,
-       215, 377
+       215, 378
 };
 static int parser_goto_row76[] = {
        13,
        -1, 184,
        146, 292,
-       609, 732,
-       774, 918,
-       788, 936,
-       875, 1022,
-       974, 732,
-       1041, 1171,
-       1054, 1186,
-       1074, 732,
-       1302, 732,
-       1316, 1381,
-       1424, 1467
+       611, 734,
+       776, 920,
+       790, 938,
+       877, 1024,
+       976, 734,
+       1043, 1173,
+       1056, 1188,
+       1076, 734,
+       1304, 734,
+       1318, 1383,
+       1426, 1469
 };
 static int parser_goto_row77[] = {
        43,
-       -1, 481,
+       -1, 483,
        42, 185,
        43, 186,
        44, 187,
@@ -17879,86 +17893,86 @@ static int parser_goto_row77[] = {
        122, 259,
        123, 260,
        124, 261,
-       214, 375,
-       345, 478,
-       377, 516,
-       479, 611,
-       614, 740,
-       850, 984,
-       851, 985,
+       214, 376,
+       346, 480,
+       378, 518,
+       481, 613,
+       616, 742,
        852, 986,
        853, 987,
-       857, 993,
-       858, 994,
+       854, 988,
+       855, 989,
        859, 995,
        860, 996,
        861, 997,
-       875, 1023,
-       973, 1118,
-       977, 1121,
-       1120, 1238,
-       1134, 1247,
-       1135, 1248,
-       1256, 1352,
-       1349, 1402,
-       1351, 1403
+       862, 998,
+       863, 999,
+       877, 1025,
+       975, 1120,
+       979, 1123,
+       1122, 1240,
+       1136, 1249,
+       1137, 1250,
+       1258, 1354,
+       1351, 1404,
+       1353, 1405
 };
 static int parser_goto_row78[] = {
        3,
-       -1, 526,
-       183, 344,
-       771, 904
+       -1, 528,
+       183, 345,
+       773, 906
 };
 static int parser_goto_row79[] = {
        3,
-       -1, 881,
-       394, 527,
-       1413, 1451
+       -1, 883,
+       395, 529,
+       1415, 1453
 };
 static int parser_goto_row80[] = {
        3,
-       -1, 528,
-       476, 608,
-       710, 827
+       -1, 530,
+       478, 610,
+       712, 829
 };
 static int parser_goto_row81[] = {
        3,
-       -1, 649,
-       882, 1037,
-       1452, 1493
+       -1, 651,
+       884, 1039,
+       1454, 1495
 };
 static int parser_goto_row82[] = {
        2,
-       -1, 650,
-       652, 775
+       -1, 652,
+       654, 777
 };
 static int parser_goto_row83[] = {
        2,
-       -1, 647,
-       648, 772
+       -1, 649,
+       650, 774
 };
 static int parser_goto_row84[] = {
        3,
-       -1, 733,
-       1074, 1204,
-       1302, 1374
+       -1, 735,
+       1076, 1206,
+       1304, 1376
 };
 static int parser_goto_row85[] = {
        3,
-       -1, 840,
-       841, 975,
-       1081, 975
+       -1, 842,
+       843, 977,
+       1083, 977
 };
 static int parser_goto_row86[] = {
        2,
-       -1, 734,
-       974, 1119
+       -1, 736,
+       976, 1121
 };
 static int parser_goto_row87[] = {
        3,
-       -1, 345,
-       472, 605,
-       651, 774
+       -1, 346,
+       474, 607,
+       653, 776
 };
 static int parser_goto_row88[] = {
        33,
@@ -17966,96 +17980,96 @@ static int parser_goto_row88[] = {
        78, 220,
        108, 243,
        129, 264,
-       171, 328,
-       218, 379,
-       262, 409,
-       326, 379,
-       400, 535,
-       441, 574,
-       507, 633,
-       510, 637,
-       559, 658,
-       562, 661,
-       595, 633,
-       597, 706,
-       684, 807,
-       712, 828,
-       736, 220,
-       777, 929,
-       805, 379,
-       845, 979,
-       864, 1000,
-       920, 1077,
-       998, 1133,
-       1097, 633,
-       1099, 1227,
-       1117, 637,
-       1126, 1243,
-       1270, 1353,
-       1273, 1356,
-       1322, 1384,
-       1400, 1438
+       171, 329,
+       218, 380,
+       262, 410,
+       327, 380,
+       401, 537,
+       443, 576,
+       509, 635,
+       512, 639,
+       561, 660,
+       564, 663,
+       597, 635,
+       599, 708,
+       686, 809,
+       714, 830,
+       738, 220,
+       779, 931,
+       807, 380,
+       847, 981,
+       866, 1002,
+       922, 1079,
+       1000, 1135,
+       1099, 635,
+       1101, 1229,
+       1119, 639,
+       1128, 1245,
+       1272, 1355,
+       1275, 1358,
+       1324, 1386,
+       1402, 1440
 };
 static int parser_goto_row89[] = {
        22,
        -1, 127,
        78, 221,
-       218, 380,
-       222, 386,
-       224, 387,
-       388, 523,
-       507, 634,
-       510, 638,
-       639, 767,
-       640, 768,
-       666, 782,
-       684, 808,
-       769, 903,
-       805, 950,
-       809, 955,
-       814, 959,
-       960, 1108,
-       1097, 1225,
-       1099, 1228,
-       1229, 1339,
-       1230, 1340,
-       1341, 1396
+       218, 381,
+       222, 387,
+       224, 388,
+       389, 525,
+       509, 636,
+       512, 640,
+       641, 769,
+       642, 770,
+       668, 784,
+       686, 810,
+       771, 905,
+       807, 952,
+       811, 957,
+       816, 961,
+       962, 1110,
+       1099, 1227,
+       1101, 1230,
+       1231, 1341,
+       1232, 1342,
+       1343, 1398
 };
 static int parser_goto_row90[] = {
        9,
        -1, 76,
        72, 209,
        139, 284,
-       169, 325,
+       169, 326,
        254, 284,
-       303, 325,
-       682, 804,
-       731, 209,
-       924, 1079
+       304, 326,
+       684, 806,
+       733, 209,
+       926, 1081
 };
 static int parser_goto_row91[] = {
        4,
-       -1, 351,
-       255, 407,
-       397, 532,
-       522, 644
+       -1, 352,
+       255, 408,
+       398, 534,
+       524, 646
 };
 static int parser_goto_row92[] = {
        2,
-       -1, 617,
-       618, 743
+       -1, 619,
+       620, 745
 };
 static int parser_goto_row93[] = {
        4,
        -1, 298,
-       437, 570,
-       794, 941,
-       1090, 1219
+       438, 572,
+       796, 943,
+       1092, 1221
 };
 static int parser_goto_row94[] = {
        2,
        -1, 240,
-       486, 620
+       488, 622
 };
 static int parser_goto_row95[] = {
        127,
@@ -18070,7 +18084,7 @@ static int parser_goto_row95[] = {
        96, 77,
        117, 253,
        144, 77,
-       158, 304,
+       158, 305,
        205, 77,
        218, 128,
        222, 128,
@@ -18078,16 +18092,15 @@ static int parser_goto_row95[] = {
        245, 128,
        247, 128,
        256, 128,
-       335, 77,
-       367, 77,
-       369, 509,
-       388, 128,
-       410, 128,
-       412, 128,
+       336, 77,
+       368, 77,
+       370, 511,
+       389, 128,
+       411, 128,
        413, 128,
        414, 128,
        415, 128,
-       417, 128,
+       416, 128,
        418, 128,
        419, 128,
        420, 128,
@@ -18099,93 +18112,94 @@ static int parser_goto_row95[] = {
        426, 128,
        427, 128,
        428, 128,
-       429, 561,
-       430, 77,
-       465, 596,
-       466, 77,
-       469, 77,
-       507, 128,
-       510, 128,
-       537, 656,
-       541, 128,
-       564, 77,
-       568, 683,
-       569, 77,
-       575, 703,
-       609, 735,
-       639, 128,
-       640, 128,
-       666, 128,
-       667, 683,
-       670, 77,
-       672, 683,
-       684, 128,
-       686, 77,
-       742, 863,
-       751, 77,
-       769, 128,
-       774, 919,
-       784, 77,
-       805, 128,
-       809, 128,
-       813, 77,
-       814, 128,
-       854, 989,
-       884, 77,
-       945, 683,
-       947, 1098,
-       960, 128,
-       972, 509,
-       974, 735,
-       981, 863,
-       983, 863,
-       992, 863,
-       1054, 919,
-       1074, 735,
-       1092, 683,
-       1094, 77,
-       1097, 128,
+       429, 128,
+       430, 563,
+       431, 77,
+       467, 598,
+       468, 77,
+       471, 77,
+       509, 128,
+       512, 128,
+       539, 658,
+       543, 128,
+       566, 77,
+       570, 685,
+       571, 77,
+       577, 705,
+       611, 737,
+       641, 128,
+       642, 128,
+       668, 128,
+       669, 685,
+       672, 77,
+       674, 685,
+       686, 128,
+       688, 77,
+       744, 865,
+       753, 77,
+       771, 128,
+       776, 921,
+       786, 77,
+       807, 128,
+       811, 128,
+       815, 77,
+       816, 128,
+       856, 991,
+       886, 77,
+       947, 685,
+       949, 1100,
+       962, 128,
+       974, 511,
+       976, 737,
+       983, 865,
+       985, 865,
+       994, 865,
+       1056, 921,
+       1076, 737,
+       1094, 685,
+       1096, 77,
        1099, 128,
-       1110, 77,
-       1136, 863,
-       1138, 863,
-       1139, 863,
-       1140, 863,
-       1141, 863,
-       1143, 863,
-       1144, 863,
-       1145, 863,
-       1146, 863,
-       1147, 863,
-       1148, 863,
-       1149, 863,
-       1150, 863,
-       1151, 863,
-       1152, 863,
-       1153, 863,
-       1154, 863,
-       1155, 1272,
-       1209, 1321,
-       1217, 683,
-       1218, 683,
-       1229, 128,
-       1230, 128,
-       1245, 1348,
-       1250, 863,
-       1302, 735,
-       1325, 128,
-       1341, 128,
-       1388, 683,
-       1414, 77,
-       1436, 77,
-       1444, 77,
-       1449, 77,
-       1454, 77,
-       1474, 683,
-       1489, 77,
-       1492, 77,
-       1536, 863,
-       1560, 683
+       1101, 128,
+       1112, 77,
+       1138, 865,
+       1140, 865,
+       1141, 865,
+       1142, 865,
+       1143, 865,
+       1145, 865,
+       1146, 865,
+       1147, 865,
+       1148, 865,
+       1149, 865,
+       1150, 865,
+       1151, 865,
+       1152, 865,
+       1153, 865,
+       1154, 865,
+       1155, 865,
+       1156, 865,
+       1157, 1274,
+       1211, 1323,
+       1219, 685,
+       1220, 685,
+       1231, 128,
+       1232, 128,
+       1247, 1350,
+       1252, 865,
+       1304, 737,
+       1327, 128,
+       1343, 128,
+       1390, 685,
+       1416, 77,
+       1438, 77,
+       1446, 77,
+       1451, 77,
+       1456, 77,
+       1476, 685,
+       1491, 77,
+       1494, 77,
+       1538, 865,
+       1562, 685
 };
 static int parser_goto_row96[] = {
        129,
@@ -18207,16 +18221,15 @@ static int parser_goto_row96[] = {
        245, 129,
        247, 129,
        256, 129,
-       335, 78,
-       367, 78,
-       369, 510,
-       388, 129,
-       410, 129,
-       412, 129,
+       336, 78,
+       368, 78,
+       370, 512,
+       389, 129,
+       411, 129,
        413, 129,
        414, 129,
        415, 129,
-       417, 129,
+       416, 129,
        418, 129,
        419, 129,
        420, 129,
@@ -18228,100 +18241,101 @@ static int parser_goto_row96[] = {
        426, 129,
        427, 129,
        428, 129,
-       429, 562,
-       430, 78,
-       465, 597,
-       466, 78,
-       469, 78,
-       507, 129,
-       510, 129,
-       537, 562,
-       541, 129,
-       564, 78,
-       568, 684,
-       569, 78,
-       575, 597,
-       607, 712,
-       609, 736,
-       639, 129,
-       640, 129,
-       655, 777,
-       666, 129,
-       667, 684,
-       670, 78,
-       672, 684,
-       684, 129,
-       686, 78,
-       742, 864,
-       751, 78,
-       769, 129,
-       774, 920,
-       784, 78,
-       805, 129,
-       809, 129,
-       813, 78,
-       814, 129,
-       854, 864,
-       884, 78,
-       945, 684,
-       947, 1099,
-       960, 129,
-       972, 1117,
-       974, 736,
-       981, 864,
-       983, 864,
-       992, 864,
-       1054, 920,
-       1074, 736,
-       1092, 684,
-       1094, 78,
-       1097, 129,
+       429, 129,
+       430, 564,
+       431, 78,
+       467, 599,
+       468, 78,
+       471, 78,
+       509, 129,
+       512, 129,
+       539, 564,
+       543, 129,
+       566, 78,
+       570, 686,
+       571, 78,
+       577, 599,
+       609, 714,
+       611, 738,
+       641, 129,
+       642, 129,
+       657, 779,
+       668, 129,
+       669, 686,
+       672, 78,
+       674, 686,
+       686, 129,
+       688, 78,
+       744, 866,
+       753, 78,
+       771, 129,
+       776, 922,
+       786, 78,
+       807, 129,
+       811, 129,
+       815, 78,
+       816, 129,
+       856, 866,
+       886, 78,
+       947, 686,
+       949, 1101,
+       962, 129,
+       974, 1119,
+       976, 738,
+       983, 866,
+       985, 866,
+       994, 866,
+       1056, 922,
+       1076, 738,
+       1094, 686,
+       1096, 78,
        1099, 129,
-       1110, 78,
-       1136, 864,
-       1138, 864,
-       1139, 864,
-       1140, 864,
-       1141, 864,
-       1143, 864,
-       1144, 864,
-       1145, 864,
-       1146, 864,
-       1147, 864,
-       1148, 864,
-       1149, 864,
-       1150, 864,
-       1151, 864,
-       1152, 864,
-       1153, 864,
-       1154, 864,
-       1155, 1273,
-       1209, 1322,
-       1217, 684,
-       1218, 684,
-       1229, 129,
-       1230, 129,
-       1245, 1273,
-       1250, 864,
-       1302, 736,
-       1325, 129,
-       1341, 129,
-       1347, 1400,
-       1388, 684,
-       1414, 78,
-       1436, 78,
-       1444, 78,
-       1449, 78,
-       1454, 78,
-       1474, 684,
-       1489, 78,
-       1492, 78,
-       1536, 864,
-       1560, 684
+       1101, 129,
+       1112, 78,
+       1138, 866,
+       1140, 866,
+       1141, 866,
+       1142, 866,
+       1143, 866,
+       1145, 866,
+       1146, 866,
+       1147, 866,
+       1148, 866,
+       1149, 866,
+       1150, 866,
+       1151, 866,
+       1152, 866,
+       1153, 866,
+       1154, 866,
+       1155, 866,
+       1156, 866,
+       1157, 1275,
+       1211, 1324,
+       1219, 686,
+       1220, 686,
+       1231, 129,
+       1232, 129,
+       1247, 1275,
+       1252, 866,
+       1304, 738,
+       1327, 129,
+       1343, 129,
+       1349, 1402,
+       1390, 686,
+       1416, 78,
+       1438, 78,
+       1446, 78,
+       1451, 78,
+       1456, 78,
+       1476, 686,
+       1491, 78,
+       1494, 78,
+       1538, 866,
+       1562, 686
 };
 static int parser_goto_row97[] = {
        1,
-       -1, 630
+       -1, 632
 };
 static int parser_goto_row98[] = {
        10,
@@ -18329,12 +18343,12 @@ static int parser_goto_row98[] = {
        81, 226,
        140, 226,
        241, 226,
-       512, 226,
-       525, 226,
-       632, 226,
-       696, 226,
-       714, 226,
-       1101, 226
+       514, 226,
+       527, 226,
+       634, 226,
+       698, 226,
+       716, 226,
+       1103, 226
 };
 static int parser_goto_row99[] = {
        54,
@@ -18349,81 +18363,81 @@ static int parser_goto_row99[] = {
        140, 285,
        144, 80,
        205, 80,
-       335, 80,
-       367, 80,
-       369, 511,
-       430, 80,
-       466, 80,
-       469, 80,
-       506, 631,
-       512, 641,
-       564, 80,
-       568, 685,
-       569, 80,
-       607, 713,
-       632, 760,
-       655, 713,
-       667, 685,
-       670, 80,
-       672, 685,
-       686, 80,
-       696, 815,
-       714, 829,
-       751, 80,
-       784, 80,
-       813, 80,
-       884, 80,
-       945, 685,
-       947, 1100,
-       1092, 685,
-       1094, 80,
-       1101, 1231,
-       1110, 80,
-       1217, 685,
-       1218, 685,
-       1347, 713,
-       1388, 685,
-       1414, 80,
-       1436, 80,
-       1444, 80,
-       1449, 80,
-       1454, 80,
-       1474, 685,
-       1489, 80,
-       1492, 80,
-       1560, 685
+       336, 80,
+       368, 80,
+       370, 513,
+       431, 80,
+       468, 80,
+       471, 80,
+       508, 633,
+       514, 643,
+       566, 80,
+       570, 687,
+       571, 80,
+       609, 715,
+       634, 762,
+       657, 715,
+       669, 687,
+       672, 80,
+       674, 687,
+       688, 80,
+       698, 817,
+       716, 831,
+       753, 80,
+       786, 80,
+       815, 80,
+       886, 80,
+       947, 687,
+       949, 1102,
+       1094, 687,
+       1096, 80,
+       1103, 1233,
+       1112, 80,
+       1219, 687,
+       1220, 687,
+       1349, 715,
+       1390, 687,
+       1416, 80,
+       1438, 80,
+       1446, 80,
+       1451, 80,
+       1456, 80,
+       1476, 687,
+       1491, 80,
+       1494, 80,
+       1562, 687
 };
 static int parser_goto_row100[] = {
        8,
-       -1, 1039,
-       1040, 1169,
-       1453, 1494,
-       1488, 1520,
-       1491, 1522,
-       1495, 1524,
-       1521, 1543,
-       1523, 1544
+       -1, 1041,
+       1042, 1171,
+       1455, 1496,
+       1490, 1522,
+       1493, 1524,
+       1497, 1526,
+       1523, 1545,
+       1525, 1546
 };
 static int parser_goto_row101[] = {
        18,
-       -1, 882,
+       -1, 884,
        15, 85,
-       394, 529,
-       395, 530,
-       619, 744,
-       745, 874,
-       774, 921,
-       889, 1043,
-       918, 1075,
-       925, 1080,
-       1054, 1187,
-       1186, 1303,
-       1188, 1304,
-       1316, 1382,
-       1381, 1427,
-       1413, 1452,
-       1424, 1468,
-       1467, 1508
+       395, 531,
+       396, 532,
+       621, 746,
+       747, 876,
+       776, 923,
+       891, 1045,
+       920, 1077,
+       927, 1082,
+       1056, 1189,
+       1188, 1305,
+       1190, 1306,
+       1318, 1384,
+       1383, 1429,
+       1415, 1454,
+       1426, 1470,
+       1469, 1510
 };
 static int parser_goto_row102[] = {
        50,
@@ -18445,41 +18459,41 @@ static int parser_goto_row102[] = {
        101, 11,
        102, 11,
        104, 11,
-       206, 367,
+       206, 368,
        230, 11,
        235, 11,
-       288, 430,
-       335, 469,
-       431, 564,
-       466, 469,
-       568, 686,
-       569, 144,
-       667, 784,
-       670, 469,
-       672, 784,
-       751, 469,
-       811, 205,
-       813, 469,
-       884, 469,
-       945, 1094,
-       957, 367,
-       1092, 1094,
-       1110, 144,
-       1217, 686,
-       1218, 784,
-       1388, 1094,
-       1414, 469,
-       1436, 144,
-       1444, 469,
-       1449, 469,
-       1454, 469,
-       1474, 784,
-       1489, 469,
-       1492, 469,
-       1560, 784
+       288, 431,
+       336, 471,
+       432, 566,
+       468, 471,
+       570, 688,
+       571, 144,
+       669, 786,
+       672, 471,
+       674, 786,
+       753, 471,
+       813, 205,
+       815, 471,
+       886, 471,
+       947, 1096,
+       959, 368,
+       1094, 1096,
+       1112, 144,
+       1219, 688,
+       1220, 786,
+       1390, 1096,
+       1416, 471,
+       1438, 144,
+       1446, 471,
+       1451, 471,
+       1456, 471,
+       1476, 786,
+       1491, 471,
+       1494, 471,
+       1562, 786
 };
 static int parser_goto_row103[] = {
-       260,
+       262,
        -1, 96,
        0, 12,
        4, 22,
@@ -18491,6 +18505,7 @@ static int parser_goto_row103[] = {
        31, 147,
        32, 148,
        34, 151,
+       35, 152,
        41, 182,
        47, 190,
        48, 191,
@@ -18503,154 +18518,153 @@ static int parser_goto_row103[] = {
        112, 247,
        118, 255,
        119, 256,
-       154, 299,
-       155, 300,
-       156, 301,
-       157, 302,
-       159, 305,
-       192, 352,
-       193, 353,
-       199, 354,
-       200, 355,
-       201, 356,
-       207, 368,
-       208, 369,
-       213, 374,
-       238, 393,
-       242, 397,
-       252, 402,
-       265, 410,
-       266, 412,
-       267, 413,
-       268, 414,
-       269, 415,
-       270, 416,
-       271, 417,
-       272, 418,
-       273, 419,
-       274, 420,
-       275, 421,
-       276, 422,
-       277, 423,
-       278, 424,
-       279, 425,
-       280, 426,
-       281, 427,
-       282, 428,
-       283, 429,
-       290, 432,
-       293, 435,
-       294, 436,
-       296, 437,
-       298, 438,
-       306, 446,
+       154, 300,
+       155, 301,
+       156, 302,
+       157, 303,
+       159, 306,
+       192, 353,
+       193, 354,
+       199, 355,
+       200, 356,
+       201, 357,
+       207, 369,
+       208, 370,
+       213, 375,
+       238, 394,
+       242, 398,
+       252, 403,
+       265, 411,
+       266, 413,
+       267, 414,
+       268, 415,
+       269, 416,
+       270, 417,
+       271, 418,
+       272, 419,
+       273, 420,
+       274, 421,
+       275, 422,
+       276, 423,
+       277, 424,
+       278, 425,
+       279, 426,
+       280, 427,
+       281, 428,
+       282, 429,
+       283, 430,
+       290, 433,
+       293, 436,
+       294, 437,
+       296, 438,
+       298, 439,
+       299, 440,
        307, 448,
-       308, 449,
-       309, 450,
-       310, 451,
-       311, 452,
-       312, 453,
-       313, 454,
-       314, 455,
-       315, 456,
-       316, 457,
-       317, 458,
-       318, 459,
-       319, 460,
-       320, 461,
-       321, 462,
-       322, 463,
-       323, 464,
-       324, 465,
-       342, 476,
-       349, 483,
-       350, 484,
-       357, 486,
-       364, 506,
-       378, 517,
-       385, 522,
-       398, 533,
-       404, 537,
-       406, 538,
-       411, 541,
-       433, 566,
-       439, 573,
-       443, 575,
-       447, 577,
-       471, 603,
-       475, 607,
+       308, 450,
+       309, 451,
+       310, 452,
+       311, 453,
+       312, 454,
+       313, 455,
+       314, 456,
+       315, 457,
+       316, 458,
+       317, 459,
+       318, 460,
+       319, 461,
+       320, 462,
+       321, 463,
+       322, 464,
+       323, 465,
+       324, 466,
+       325, 467,
+       343, 478,
+       350, 485,
+       351, 486,
+       358, 488,
+       365, 508,
+       379, 519,
+       386, 524,
+       399, 535,
+       405, 539,
+       407, 540,
+       412, 543,
+       434, 568,
+       441, 575,
+       445, 577,
+       449, 579,
+       473, 605,
        477, 609,
-       480, 612,
-       504, 627,
-       508, 635,
-       515, 642,
-       529, 651,
-       534, 655,
-       560, 659,
-       567, 664,
-       570, 699,
-       571, 700,
+       479, 611,
+       482, 614,
+       506, 629,
+       510, 637,
+       517, 644,
+       531, 653,
+       536, 657,
+       562, 661,
+       569, 666,
        572, 701,
-       601, 707,
-       604, 710,
-       608, 715,
-       610, 738,
-       615, 741,
-       616, 742,
-       623, 747,
-       624, 748,
-       626, 755,
-       646, 771,
-       652, 651,
-       654, 776,
-       669, 789,
+       573, 702,
+       574, 703,
+       603, 709,
+       606, 712,
+       610, 717,
+       612, 740,
+       617, 743,
+       618, 744,
+       625, 749,
+       626, 750,
+       628, 757,
+       648, 773,
+       654, 653,
+       656, 778,
        671, 791,
-       673, 794,
-       702, 820,
-       709, 826,
-       733, 838,
-       739, 843,
-       749, 879,
-       756, 886,
-       757, 891,
-       761, 897,
-       762, 898,
-       779, 930,
-       780, 931,
-       803, 947,
-       817, 961,
-       818, 962,
-       822, 964,
-       823, 965,
-       827, 968,
-       837, 972,
+       673, 793,
+       675, 796,
+       704, 822,
+       711, 828,
+       735, 840,
+       741, 845,
+       751, 881,
+       758, 888,
+       759, 893,
+       763, 899,
+       764, 900,
+       781, 932,
+       782, 933,
+       805, 949,
+       819, 963,
+       820, 964,
+       824, 966,
+       825, 967,
+       829, 970,
        839, 974,
-       842, 976,
+       841, 976,
        844, 978,
        846, 980,
-       847, 981,
        848, 982,
        849, 983,
-       855, 991,
-       856, 992,
-       865, 1001,
-       877, 1027,
-       882, 651,
-       890, 1044,
-       893, 1056,
-       894, 1059,
-       895, 1061,
-       910, 1074,
-       928, 1082,
-       937, 1088,
-       938, 1089,
-       940, 1090,
-       941, 1091,
-       963, 1111,
-       988, 1128,
-       1002, 1136,
-       1003, 1138,
-       1004, 1139,
+       850, 984,
+       851, 985,
+       857, 993,
+       858, 994,
+       867, 1003,
+       879, 1029,
+       884, 653,
+       892, 1046,
+       895, 1058,
+       896, 1061,
+       897, 1063,
+       912, 1076,
+       930, 1084,
+       939, 1090,
+       940, 1091,
+       942, 1092,
+       943, 1093,
+       965, 1113,
+       990, 1130,
+       1004, 1138,
        1005, 1140,
        1006, 1141,
        1007, 1142,
@@ -18667,79 +18681,81 @@ static int parser_goto_row103[] = {
        1018, 1153,
        1019, 1154,
        1020, 1155,
-       1024, 1159,
-       1025, 1160,
-       1028, 1162,
-       1042, 1174,
-       1045, 1177,
-       1046, 1179,
-       1049, 1180,
-       1057, 1190,
-       1060, 1192,
-       1063, 1196,
-       1064, 1198,
-       1066, 1199,
-       1067, 1200,
-       1078, 1209,
-       1084, 1213,
-       1085, 1214,
+       1021, 1156,
+       1022, 1157,
+       1026, 1161,
+       1027, 1162,
+       1030, 1164,
+       1044, 1176,
+       1047, 1179,
+       1048, 1181,
+       1051, 1182,
+       1059, 1192,
+       1062, 1194,
+       1065, 1198,
+       1066, 1200,
+       1068, 1201,
+       1069, 1202,
+       1080, 1211,
        1086, 1215,
-       1109, 1232,
-       1122, 1239,
-       1130, 1245,
-       1131, 1246,
-       1137, 1250,
-       1158, 1275,
-       1163, 1277,
-       1172, 1284,
-       1175, 1287,
-       1178, 1289,
-       1185, 1302,
-       1193, 1307,
-       1194, 1309,
-       1197, 1311,
-       1212, 1325,
-       1216, 1329,
-       1219, 1333,
-       1220, 1334,
-       1235, 1344,
-       1242, 1347,
-       1271, 1354,
-       1279, 1358,
-       1294, 627,
-       1298, 627,
-       1308, 1376,
-       1313, 1379,
-       1326, 1386,
-       1342, 1397,
-       1345, 1399,
-       1363, 627,
-       1365, 627,
-       1369, 627,
-       1390, 1434,
-       1391, 1435,
-       1404, 1439,
-       1405, 1440,
+       1087, 1216,
+       1088, 1217,
+       1111, 1234,
+       1124, 1241,
+       1132, 1247,
+       1133, 1248,
+       1139, 1252,
+       1160, 1277,
+       1165, 1279,
+       1174, 1286,
+       1177, 1289,
+       1180, 1291,
+       1187, 1304,
+       1195, 1309,
+       1196, 1311,
+       1199, 1313,
+       1214, 1327,
+       1218, 1331,
+       1221, 1335,
+       1222, 1336,
+       1237, 1346,
+       1244, 1349,
+       1273, 1356,
+       1281, 1360,
+       1296, 629,
+       1300, 629,
+       1310, 1378,
+       1315, 1381,
+       1328, 1388,
+       1344, 1399,
+       1347, 1401,
+       1365, 629,
+       1367, 629,
+       1371, 629,
+       1392, 1436,
+       1393, 1437,
        1406, 1441,
-       1408, 1442,
-       1437, 1477,
-       1452, 651,
-       1455, 1496,
-       1459, 1500,
-       1473, 1509,
-       1479, 1514,
-       1480, 1515,
-       1482, 1516,
-       1483, 1517,
+       1407, 1442,
+       1408, 1443,
+       1410, 1444,
+       1439, 1479,
+       1454, 653,
+       1457, 1498,
+       1461, 1502,
+       1475, 1511,
+       1481, 1516,
+       1482, 1517,
        1484, 1518,
-       1498, 1526,
-       1505, 1531,
+       1485, 1519,
+       1486, 1520,
+       1500, 1528,
        1507, 1533,
-       1513, 1536,
-       1532, 1550,
+       1509, 1535,
+       1515, 1538,
        1534, 1552,
-       1537, 1554,
-       1539, 1555
+       1536, 1554,
+       1539, 1556,
+       1541, 1557
 };
 static int parser_goto_row104[] = {
        1,
@@ -18755,12 +18771,12 @@ static int parser_goto_row106[] = {
 };
 static int parser_goto_row107[] = {
        2,
-       -1, 754,
-       1410, 1447
+       -1, 756,
+       1412, 1449
 };
 static int parser_goto_row108[] = {
        1,
-       -1, 1257
+       -1, 1259
 };
 static int parser_goto_row109[] = {
        1,
@@ -18768,69 +18784,69 @@ static int parser_goto_row109[] = {
 };
 static int parser_goto_row110[] = {
        2,
-       -1, 865,
-       1536, 1553
+       -1, 867,
+       1538, 1555
 };
 static int parser_goto_row111[] = {
        1,
-       -1, 866
+       -1, 868
 };
 static int parser_goto_row112[] = {
        6,
-       -1, 867,
-       981, 1123,
-       1136, 1249,
+       -1, 869,
+       983, 1125,
        1138, 1251,
-       1139, 1252,
-       1250, 1350
+       1140, 1253,
+       1141, 1254,
+       1252, 1352
 };
 static int parser_goto_row113[] = {
        1,
-       -1, 868
+       -1, 870
 };
 static int parser_goto_row114[] = {
        10,
-       -1, 869,
-       1140, 1253,
-       1141, 1254,
-       1145, 1260,
-       1146, 1261,
+       -1, 871,
+       1142, 1255,
+       1143, 1256,
        1147, 1262,
        1148, 1263,
        1149, 1264,
        1150, 1265,
-       1151, 1266
+       1151, 1266,
+       1152, 1267,
+       1153, 1268
 };
 static int parser_goto_row115[] = {
        3,
-       -1, 870,
-       1143, 1258,
-       1144, 1259
+       -1, 872,
+       1145, 1260,
+       1146, 1261
 };
 static int parser_goto_row116[] = {
        6,
-       -1, 871,
-       983, 1127,
-       992, 1132,
-       1152, 1267,
-       1153, 1268,
-       1154, 1269
+       -1, 873,
+       985, 1129,
+       994, 1134,
+       1154, 1269,
+       1155, 1270,
+       1156, 1271
 };
 static int parser_goto_row117[] = {
        1,
-       -1, 872
+       -1, 874
 };
 static int parser_goto_row118[] = {
        2,
-       -1, 873,
-       854, 990
+       -1, 875,
+       856, 992
 };
 static int parser_goto_row119[] = {
        4,
-       -1, 338,
-       246, 400,
-       301, 441,
-       402, 536
+       -1, 339,
+       246, 401,
+       302, 443,
+       403, 538
 };
 static int parser_goto_row120[] = {
        1,
@@ -18838,7 +18854,7 @@ static int parser_goto_row120[] = {
 };
 static int parser_goto_row121[] = {
        1,
-       -1, 922
+       -1, 924
 };
 static int parser_goto_row122[] = {
        1,
@@ -18847,9 +18863,9 @@ static int parser_goto_row122[] = {
 static int parser_goto_row123[] = {
        4,
        -1, 131,
-       774, 923,
-       1054, 923,
-       1325, 1385
+       776, 925,
+       1056, 925,
+       1327, 1387
 };
 static int parser_goto_row124[] = {
        1,
@@ -18858,11 +18874,11 @@ static int parser_goto_row124[] = {
 static int parser_goto_row125[] = {
        6,
        -1, 133,
-       245, 399,
-       410, 540,
-       412, 542,
-       413, 543,
-       541, 657
+       245, 400,
+       411, 542,
+       413, 544,
+       414, 545,
+       543, 659
 };
 static int parser_goto_row126[] = {
        1,
@@ -18871,30 +18887,30 @@ static int parser_goto_row126[] = {
 static int parser_goto_row127[] = {
        10,
        -1, 135,
-       414, 544,
-       415, 545,
-       419, 549,
-       420, 550,
-       421, 551,
-       422, 552,
-       423, 553,
-       424, 554,
-       425, 555
+       415, 546,
+       416, 547,
+       420, 551,
+       421, 552,
+       422, 553,
+       423, 554,
+       424, 555,
+       425, 556,
+       426, 557
 };
 static int parser_goto_row128[] = {
        3,
        -1, 136,
-       417, 547,
-       418, 548
+       418, 549,
+       419, 550
 };
 static int parser_goto_row129[] = {
        6,
        -1, 137,
-       247, 401,
-       256, 408,
-       426, 556,
-       427, 557,
-       428, 558
+       247, 402,
+       256, 409,
+       427, 558,
+       428, 559,
+       429, 560
 };
 static int parser_goto_row130[] = {
        1,
@@ -18904,40 +18920,40 @@ static int parser_goto_row131[] = {
        4,
        -1, 139,
        117, 254,
-       774, 924,
-       1054, 924
+       776, 926,
+       1056, 926
 };
 static int parser_goto_row132[] = {
        1,
-       -1, 473
+       -1, 475
 };
 static int parser_goto_row133[] = {
        7,
-       -1, 474,
-       470, 602,
-       605, 711,
-       967, 1114,
-       1112, 1236,
-       1125, 1241,
-       1240, 1346
+       -1, 476,
+       472, 604,
+       607, 713,
+       969, 1116,
+       1114, 1238,
+       1127, 1243,
+       1242, 1348
 };
 static int parser_goto_row134[] = {
        1,
-       -1, 606
+       -1, 608
 };
 static int parser_goto_row135[] = {
        2,
-       -1, 925,
-       1054, 1188
+       -1, 927,
+       1056, 1190
 };
 static int parser_goto_row136[] = {
        1,
-       -1, 926
+       -1, 928
 };
 static int parser_goto_row137[] = {
        2,
-       -1, 1126,
-       1128, 1244
+       -1, 1128,
+       1130, 1246
 };
 static int parser_goto_row138[] = {
        1,
@@ -18985,20 +19001,20 @@ static int parser_goto_row148[] = {
 };
 static int parser_goto_row149[] = {
        8,
-       -1, 785,
-       672, 792,
-       945, 1095,
-       1092, 1221,
-       1218, 1331,
-       1388, 1433,
-       1474, 1510,
-       1560, 1563
+       -1, 787,
+       674, 794,
+       947, 1097,
+       1094, 1223,
+       1220, 1333,
+       1390, 1435,
+       1476, 1512,
+       1562, 1565
 };
 static int parser_goto_row150[] = {
        3,
-       -1, 786,
-       568, 687,
-       1217, 1330
+       -1, 788,
+       570, 689,
+       1219, 1332
 };
 static int parser_goto_row151[] = {
        1,
@@ -19006,60 +19022,60 @@ static int parser_goto_row151[] = {
 };
 static int parser_goto_row152[] = {
        1,
-       -1, 688
+       -1, 690
 };
 static int parser_goto_row153[] = {
        1,
-       -1, 689
+       -1, 691
 };
 static int parser_goto_row154[] = {
        1,
-       -1, 690
+       -1, 692
 };
 static int parser_goto_row155[] = {
        1,
-       -1, 691
+       -1, 693
 };
 static int parser_goto_row156[] = {
        1,
-       -1, 692
+       -1, 694
 };
 static int parser_goto_row157[] = {
        1,
-       -1, 693
+       -1, 695
 };
 static int parser_goto_row158[] = {
        1,
-       -1, 694
+       -1, 696
 };
 static int parser_goto_row159[] = {
        1,
-       -1, 695
+       -1, 697
 };
 static int parser_goto_row160[] = {
        22,
        -1, 181,
-       178, 334,
-       674, 795,
-       675, 797,
-       676, 799,
+       178, 335,
+       676, 797,
+       677, 799,
        678, 801,
-       796, 942,
-       798, 943,
-       800, 944,
-       948, 1102,
-       949, 1103,
-       951, 1104,
-       952, 1105,
+       680, 803,
+       798, 944,
+       800, 945,
+       802, 946,
+       950, 1104,
+       951, 1105,
        953, 1106,
        954, 1107,
-       1096, 1224,
-       1215, 1328,
-       1329, 1387,
-       1335, 1392,
-       1336, 1393,
+       955, 1108,
+       956, 1109,
+       1098, 1226,
+       1217, 1330,
+       1331, 1389,
        1337, 1394,
-       1338, 1395
+       1338, 1395,
+       1339, 1396,
+       1340, 1397
 };
 static int parser_goto_row161[] = {
        1,
@@ -19085,14 +19101,14 @@ static int parser_goto_row166[] = {
        10,
        -1, 145,
        33, 150,
-       569, 698,
-       667, 787,
-       672, 793,
-       1110, 1234,
-       1218, 1332,
-       1436, 1476,
-       1474, 1511,
-       1560, 1564
+       571, 700,
+       669, 789,
+       674, 795,
+       1112, 1236,
+       1220, 1334,
+       1438, 1478,
+       1476, 1513,
+       1562, 1566
 };
 static int parser_goto_row167[] = {
        1,
@@ -19100,11 +19116,11 @@ static int parser_goto_row167[] = {
 };
 static int parser_goto_row168[] = {
        1,
-       -1, 737
+       -1, 739
 };
 static int parser_goto_row169[] = {
        1,
-       -1, 927
+       -1, 929
 };
 static int parser_goto_row170[] = {
        1,
@@ -19116,12 +19132,12 @@ static int parser_goto_row171[] = {
 };
 static int parser_goto_row172[] = {
        2,
-       -1, 892,
-       895, 1062
+       -1, 894,
+       897, 1064
 };
 static int parser_goto_row173[] = {
        1,
-       -1, 1054
+       -1, 1056
 };
 static int parser_goto_row174[] = {
        2,
@@ -19148,43 +19164,43 @@ static int parser_goto_row176[] = {
 };
 static int parser_goto_row177[] = {
        4,
-       -1, 893,
-       890, 1045,
-       895, 1063,
-       1060, 1193
+       -1, 895,
+       892, 1047,
+       897, 1065,
+       1062, 1195
 };
 static int parser_goto_row178[] = {
        8,
-       -1, 894,
-       890, 1046,
-       893, 1057,
-       895, 1064,
-       1045, 1178,
-       1060, 1194,
-       1063, 1197,
-       1193, 1308
+       -1, 896,
+       892, 1048,
+       895, 1059,
+       897, 1066,
+       1047, 1180,
+       1062, 1196,
+       1065, 1199,
+       1195, 1310
 };
 static int parser_goto_row179[] = {
        1,
-       -1, 1175
+       -1, 1177
 };
 static int parser_goto_row180[] = {
        1,
-       -1, 1028
+       -1, 1030
 };
 static int parser_goto_row181[] = {
        1,
-       -1, 1165
+       -1, 1167
 };
 static int parser_goto_row182[] = {
        1,
-       -1, 825
+       -1, 827
 };
 static int parser_goto_row183[] = {
        3,
        -1, 206,
-       288, 431,
-       811, 957
+       288, 432,
+       813, 959
 };
 static int parser_goto_row184[] = {
        1,
@@ -19192,20 +19208,20 @@ static int parser_goto_row184[] = {
 };
 static int parser_goto_row185[] = {
        1,
-       -1, 648
+       -1, 650
 };
 static int parser_goto_row186[] = {
        1,
-       -1, 652
+       -1, 654
 };
 static int parser_goto_row187[] = {
        2,
-       -1, 841,
-       926, 1081
+       -1, 843,
+       928, 1083
 };
 static int parser_goto_row188[] = {
        1,
-       -1, 618
+       -1, 620
 };
 static int parser_goto_row189[] = {
        50,
@@ -19219,46 +19235,46 @@ static int parser_goto_row189[] = {
        107, 241,
        144, 81,
        205, 81,
-       335, 81,
-       367, 81,
-       369, 512,
-       393, 525,
-       430, 81,
-       466, 81,
-       469, 81,
-       486, 241,
-       506, 632,
-       564, 81,
-       568, 696,
-       569, 81,
-       607, 714,
-       655, 714,
-       667, 696,
-       670, 81,
-       672, 696,
-       686, 81,
-       751, 81,
-       784, 81,
-       813, 81,
-       884, 81,
-       945, 696,
-       947, 1101,
-       1092, 696,
-       1094, 81,
-       1110, 81,
-       1217, 696,
-       1218, 696,
-       1347, 714,
-       1388, 696,
-       1414, 81,
-       1436, 81,
-       1444, 81,
-       1449, 81,
-       1454, 81,
-       1474, 696,
-       1489, 81,
-       1492, 81,
-       1560, 696
+       336, 81,
+       368, 81,
+       370, 514,
+       394, 527,
+       431, 81,
+       468, 81,
+       471, 81,
+       488, 241,
+       508, 634,
+       566, 81,
+       570, 698,
+       571, 81,
+       609, 716,
+       657, 716,
+       669, 698,
+       672, 81,
+       674, 698,
+       688, 81,
+       753, 81,
+       786, 81,
+       815, 81,
+       886, 81,
+       947, 698,
+       949, 1103,
+       1094, 698,
+       1096, 81,
+       1112, 81,
+       1219, 698,
+       1220, 698,
+       1349, 716,
+       1390, 698,
+       1416, 81,
+       1438, 81,
+       1446, 81,
+       1451, 81,
+       1456, 81,
+       1476, 698,
+       1491, 81,
+       1494, 81,
+       1562, 698
 };
 static int parser_goto_row190[] = {
        2,
@@ -19273,7 +19289,7 @@ static int parser_goto_row191[] = {
 };
 static int parser_goto_row192[] = {
        1,
-       -1, 895
+       -1, 897
 };
 
 const int* const parser_goto_table[] = {
index 6dfdc3a..62c2f60 100644 (file)
@@ -77,7 +77,7 @@ THIS_MAKEFILE := $(abspath $(lastword $(MAKEFILE_LIST)))
 NACL_SDK_ROOT ?= $(abspath $(dir $(THIS_MAKEFILE))../../../..)
 
 # Project Build flags
-WARNINGS := -Wall -pedantic -Werror -Wno-long-long -Wno-unused-value -Wno-unused-label -Wno-duplicate-decl-specifier -Wno-switch -Wno-embedded-directive
+WARNINGS := -Wall -pedantic -Wno-long-long -Wno-unused-value -Wno-unused-label -Wno-duplicate-decl-specifier -Wno-switch -Wno-embedded-directive
 CXXFLAGS := -pthread $(WARNINGS)
 
 CXXFLAGS += -g -O0 # Debug
@@ -244,6 +244,6 @@ function updateStatus(opt_message) {
        redef fun compile_c_code(compiler, compile_dir)
        do
                # Generate the pexe
-               toolcontext.exec_and_check(["make", "-C", compile_dir], "PNaCl project error")
+               toolcontext.exec_and_check(["make", "-C", compile_dir, "-j", "4"], "PNaCl project error")
        end
 end
diff --git a/src/vm.nit b/src/vm.nit
new file mode 100644 (file)
index 0000000..3c8f048
--- /dev/null
@@ -0,0 +1,314 @@
+# This file is part of NIT ( http://www.nitlanguage.org ).
+#
+# Copyright 2014 Julien Pagès <julien.pages@lirmm.fr>
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Implementation of the Nit virtual machine
+module vm
+
+intrude import naive_interpreter
+import model_utils
+import perfect_hashing
+
+redef class ModelBuilder
+       redef fun run_naive_interpreter(mainmodule: MModule, arguments: Array[String])
+       do
+               var time0 = get_time
+               self.toolcontext.info("*** NITVM STARTING ***", 1)
+
+               var interpreter = new VirtualMachine(self, mainmodule, arguments)
+               init_naive_interpreter(interpreter, mainmodule)
+
+               var time1 = get_time
+               self.toolcontext.info("*** NITVM STOPPING : {time1-time0} ***", 2)
+       end
+end
+
+# A virtual machine based on the naive_interpreter
+class VirtualMachine super NaiveInterpreter
+
+       # Perfect hashing and perfect numbering
+       var ph: Perfecthashing = new Perfecthashing
+
+       # Handles memory and garbage collection
+       var memory_manager: MemoryManager = new MemoryManager
+
+       # Subtyping test for the virtual machine
+       redef fun is_subtype(sub, sup: MType): Bool
+       do
+               var anchor = self.frame.arguments.first.mtype.as(MClassType)
+               var sup_accept_null = false
+               if sup isa MNullableType then
+                       sup_accept_null = true
+                       sup = sup.mtype
+               else if sup isa MNullType then
+                       sup_accept_null = true
+               end
+
+               # Can `sub` provides null or not?
+               # Thus we can match with `sup_accept_null`
+               # Also discard the nullable marker if it exists
+               if sub isa MNullableType then
+                       if not sup_accept_null then return false
+                       sub = sub.mtype
+               else if sub isa MNullType then
+                       return sup_accept_null
+               end
+               # Now the case of direct null and nullable is over
+
+               # An unfixed formal type can only accept itself
+               if sup isa MParameterType or sup isa MVirtualType then
+                       return sub == sup
+               end
+               
+               if sub isa MParameterType or sub isa MVirtualType then
+                       sub = sub.anchor_to(mainmodule, anchor)
+                       # Manage the second layer of null/nullable
+                       if sub isa MNullableType then
+                               if not sup_accept_null then return false
+                               sub = sub.mtype
+                       else if sub isa MNullType then
+                               return sup_accept_null
+                       end
+               end
+
+               assert sub isa MClassType
+
+               # `sup` accepts only null
+               if sup isa MNullType then return false
+
+               assert sup isa MClassType
+
+               # Create the sup vtable if not create
+               if not sup.mclass.loaded then create_class(sup.mclass)
+
+               # Sub can be discovered inside a Generic type during the subtyping test
+               if not sub.mclass.loaded then create_class(sub.mclass)
+
+               if anchor == null then anchor = sub
+               if sup isa MGenericType then
+                       var sub2 = sub.supertype_to(mainmodule, anchor, sup.mclass)
+                       assert sub2.mclass == sup.mclass
+
+                       for i in [0..sup.mclass.arity[ do
+                               var sub_arg = sub2.arguments[i]
+                               var sup_arg = sup.arguments[i]
+                               var res = is_subtype(sub_arg, sup_arg)
+
+                               if res == false then return false
+                       end
+                       return true
+               end
+
+               var super_id = sup.mclass.vtable.id
+               var mask = sub.mclass.vtable.mask
+
+               return inter_is_subtype(super_id, mask, sub.mclass.vtable.internal_vtable)
+       end
+
+       # Subtyping test with perfect hashing
+       private fun inter_is_subtype(id: Int, mask:Int, vtable: Pointer): Bool `{
+               // hv is the position in hashtable
+               int hv = id & mask;
+
+               // Follow the pointer to somewhere in the vtable
+               long unsigned int *offset = (long unsigned int*)(((long int *)vtable)[-hv]);
+               
+               // If the pointed value is corresponding to the identifier, the test is true, otherwise false
+               return *offset == id;
+       `}
+       
+       # Redef init_instance to simulate the loading of a class
+       redef fun init_instance(recv: Instance)
+       do
+               if not recv.mtype.as(MClassType).mclass.loaded then create_class(recv.mtype.as(MClassType).mclass)
+               super
+
+               recv.vtable = recv.mtype.as(MClassType).mclass.vtable
+       end
+       
+       # Creates the runtime structures for this class
+       fun create_class(mclass: MClass) do     mclass.make_vt(self)
+end
+
+redef class MClass
+       # A reference to the virtual table of this class
+       var vtable: nullable VTable
+
+       # True when the class is effectively loaded by the vm, false otherwise
+       var loaded: Bool = false
+
+       # Allocates a VTable for this class and gives it an id
+       private fun make_vt(v: VirtualMachine)
+       do
+               if loaded then return
+
+               # Superclasses contains all superclasses except self
+               var superclasses = new Array[MClass]
+               superclasses.add_all(ancestors)
+               superclasses.remove(self)
+               v.mainmodule.linearize_mclasses(superclasses)
+
+               # Make_vt for super-classes
+               var ids = new Array[Int]
+               var nb_methods = new Array[Int]
+
+               for parent in superclasses do
+                       if parent.vtable == null then parent.make_vt(v)
+                       
+                       # Get the number of introduced methods for this class
+                       var count = 0
+                       var min_visibility = public_visibility
+                       for p in parent.intro_mproperties(min_visibility) do
+                               if p isa MMethod then
+                                       count += 1
+                               end
+                       end
+                       
+                       ids.push(parent.vtable.id)
+                       nb_methods.push(count)
+               end
+               
+               # When all super-classes have their identifiers and vtables, allocate current one
+               allocate_vtable(v, ids, nb_methods)
+               loaded = true
+               # The virtual table now needs to be filled with pointer to methods
+       end
+
+       # Allocate a single vtable
+       #       ids : Array of superclasses identifiers
+       #       nb_methods : Array which contain the number of methods for each class in ids
+       private fun allocate_vtable(v: VirtualMachine, ids: Array[Int], nb_methods: Array[Int])
+       do
+               vtable = new VTable
+               var idc = new Array[Int]
+
+               vtable.mask = v.ph.pnand(ids, 1, idc) - 1
+               vtable.id = idc[0]
+               vtable.classname = name
+
+               # Add current id to Array of super-ids
+               var ids_total = new Array[Int]
+               ids_total.add_all(ids)
+               ids_total.push(vtable.id)
+
+               var nb_methods_total = new Array[Int]
+               var count = 0
+               var min_visibility = public_visibility
+               for p in intro_mproperties(min_visibility) do
+                       if p isa MMethod then
+                               count += 1
+                       end
+               end
+               nb_methods_total.add_all(nb_methods)
+               nb_methods_total.push(count)
+               
+               vtable.internal_vtable = v.memory_manager.init_vtable(ids_total, nb_methods_total, vtable.mask)
+       end
+end
+
+# A VTable contains the virtual method table for the dispatch
+# and informations to perform subtyping tests
+class VTable
+       # The mask to perform perfect hashing
+       var mask: Int
+
+       # Unique identifier given by perfect hashing
+       var id: Int
+
+       # Pointer to the c-allocated area, represents the virtual table
+       var internal_vtable: Pointer
+
+       # The short classname of this class
+       var classname: String
+
+       init do end
+end
+
+redef class Instance
+       
+       var vtable: nullable VTable
+
+       init(mt: MType)
+       do
+               mtype = mt
+
+               # An instance is associated to its class virtual table
+               if mt isa MClassType then
+                       vtable = mt.mclass.vtable
+               end
+       end
+end
+
+# Handle memory, used for allocate virtual table and associated structures
+class MemoryManager
+
+       # Allocate and fill a virtual table
+       fun init_vtable(ids: Array[Int], nb_methods: Array[Int], mask: Int): Pointer 
+       do
+               # Allocate in C current virtual table
+               var res = intern_init_vtable(ids, nb_methods, mask)
+
+               return res
+       end
+
+       # Construct virtual tables with a bi-dimensional layout
+       private fun intern_init_vtable(ids: Array[Int], nb_methods: Array[Int], mask: Int): Pointer 
+               import Array[Int].length, Array[Int].[] `{
+
+               // Allocate and fill current virtual table
+               int i;
+               int total_size = 0; // total size of this virtual table
+               int nb_classes = Array_of_Int_length(nb_methods);
+               for(i = 0; i<nb_classes; i++) {
+                       /* - One for each method of this class
+                       *  - One for the delta (pointer to attributes)
+                       *  - One for the id 
+                       */
+                       total_size += Array_of_Int__index(nb_methods, i);
+                       total_size += 2;
+               }
+
+               // And the size of the perfect hashtable
+               total_size += mask+1;
+               long unsigned int* vtable = malloc(sizeof(long unsigned int)*total_size);
+               
+               // Initialisation to the first position of the virtual table (ie : Object)
+               long unsigned int *init = vtable + mask + 2;
+               for(i=0; i<total_size; i++)
+                       vtable[i] = (long unsigned int)init;
+
+               // Set the virtual table to its position 0 
+               // ie: after the hashtable
+               vtable = vtable + mask + 1;
+               
+               int current_size = 1;
+               for(i = 0; i < nb_classes; i++) {
+                       /*
+                               vtable[hv] contains a pointer to the group of introducted methods
+                               For each superclasse we have in virtual table :
+                                       (id | delta (attributes) | introduced methods)
+                       */
+                       int hv = mask & Array_of_Int__index(ids, i);
+
+                       vtable[current_size] = Array_of_Int__index(ids, i);
+                       vtable[-hv] = (long unsigned int)&(vtable[current_size]);
+                       
+                       current_size += 2;
+                       current_size += Array_of_Int__index(nb_methods, i);
+               }
+
+               return vtable;
+       `}
+end
index 4a5036c..ee4652c 100644 (file)
@@ -42,7 +42,7 @@ end
 #alt8# redef fun foo: Int do return 300 + bar
 #alt8#end
 
-
+#alt9#fun baz do abort
 fun baz: Int do return 1
 
 baz.output
index 0cdafa4..f9489e3 100644 (file)
@@ -6,6 +6,8 @@ shoot_logic
 bench_
 nit_args1
 nit_args3
+nitvm_args1
+nitvm_args3
 nitc_args1
 nitg_args1
 nitg_args3
diff --git a/tests/nitvm.args b/tests/nitvm.args
new file mode 100644 (file)
index 0000000..3011fc1
--- /dev/null
@@ -0,0 +1,3 @@
+--log --log-dir out/test_nitc_logs ../examples/hello_world.nit
+base_simple3.nit
+-m test_mixin.nit ../examples/hello_world.nit
diff --git a/tests/sav/error_defs_alt9.res b/tests/sav/error_defs_alt9.res
new file mode 100644 (file)
index 0000000..8c547a1
--- /dev/null
@@ -0,0 +1 @@
+alt/error_defs_alt9.nit:46,5--7: Error: A property baz is already defined in class Object at line 45.
index 0b82282..f14eb40 100644 (file)
@@ -16,7 +16,7 @@
 </span></span><span class="line" id="L16">
 </span><span class="line" id="L17"><span class="nc_k">import</span> <span class="nc_k">end</span>
 </span><span class="line" id="L18">
-</span><span class="nc_cdef foldable" id="base_simple3#Object"><span class="line" id="L19"><span class="nc_k">interface</span> <span class="nc_def nc_t popupable" title="class Object" data-title="&lt;a href=&quot;base_simple3.html#base_simple3#Object&quot;&gt;class Object&lt;/a&gt;" data-content="&lt;div&gt;&lt;b&gt;class&lt;/b&gt; &lt;span&gt;Object&lt;/span&gt;&lt;br/&gt;&lt;div class=&quot;dropdown&quot;&gt; &lt;a data-toggle=&quot;dropdown&quot; href=&quot;#&quot;&gt;&lt;b&gt;hier&lt;/b&gt; super-classes&lt;span class=&quot;caret&quot;&gt;&lt;/span&gt;&lt;/a&gt;&lt;ul class=&quot;dropdown-menu&quot; role=&quot;menu&quot; aria-labelledby=&quot;dLabel&quot;&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div class=&quot;dropdown&quot;&gt; &lt;a data-toggle=&quot;dropdown&quot; href=&quot;#&quot;&gt;&lt;b&gt;hier&lt;/b&gt; sub-classes&lt;span class=&quot;caret&quot;&gt;&lt;/span&gt;&lt;/a&gt;&lt;ul class=&quot;dropdown-menu&quot; role=&quot;menu&quot; aria-labelledby=&quot;dLabel&quot;&gt;&lt;li&gt;&lt;a href=&quot;base_simple3.html#base_simple3#Bool&quot;&gt;Bool&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;base_simple3.html#base_simple3#Int&quot;&gt;Int&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;base_simple3.html#base_simple3#A&quot;&gt;A&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;base_simple3.html#base_simple3#B&quot;&gt;B&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;base_simple3.html#base_simple3#C&quot;&gt;C&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;base_simple3.html#base_simple3#Sys&quot;&gt;Sys&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div class=&quot;dropdown&quot;&gt; &lt;a data-toggle=&quot;dropdown&quot; href=&quot;#&quot;&gt;&lt;b&gt;redefs&lt;/b&gt; refinements&lt;span class=&quot;caret&quot;&gt;&lt;/span&gt;&lt;/a&gt;&lt;ul class=&quot;dropdown-menu&quot; role=&quot;menu&quot; aria-labelledby=&quot;dLabel&quot;&gt;&lt;li&gt;&lt;a href=&quot;base_simple3.html#base_simple3#Object&quot;&gt;in base_simple3&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;base_simple3.html#base_simple3#Object&quot;&gt;in base_simple3&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;base_simple3.html#base_simple3#Object&quot;&gt;in base_simple3&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;/div&gt;" data-toggle="popover">Object</span>
+</span><span class="nc_cdef foldable" id="base_simple3#Object"><span class="line" id="L19"><span class="nc_k">interface</span> <span class="nc_def nc_t popupable" title="class Object" data-title="&lt;a href=&quot;base_simple3.html#base_simple3#Object&quot;&gt;class Object&lt;/a&gt;" data-content="&lt;div&gt;&lt;b&gt;class&lt;/b&gt; &lt;span&gt;Object&lt;/span&gt;&lt;br/&gt;&lt;div class=&quot;dropdown&quot;&gt; &lt;a data-toggle=&quot;dropdown&quot; href=&quot;#&quot;&gt;&lt;b&gt;hier&lt;/b&gt; sub-classes&lt;span class=&quot;caret&quot;&gt;&lt;/span&gt;&lt;/a&gt;&lt;ul class=&quot;dropdown-menu&quot; role=&quot;menu&quot; aria-labelledby=&quot;dLabel&quot;&gt;&lt;li&gt;&lt;a href=&quot;base_simple3.html#base_simple3#Bool&quot;&gt;Bool&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;base_simple3.html#base_simple3#Int&quot;&gt;Int&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;base_simple3.html#base_simple3#A&quot;&gt;A&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;base_simple3.html#base_simple3#B&quot;&gt;B&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;base_simple3.html#base_simple3#C&quot;&gt;C&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;base_simple3.html#base_simple3#Sys&quot;&gt;Sys&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;/div&gt;" data-toggle="popover">Object</span>
 </span><span class="line" id="L20"><span class="nc_k">end</span>
 </span></span><span class="line" id="L21">
 </span><span class="nc_cdef foldable" id="base_simple3#Bool"><span class="line" id="L22"><span class="nc_k">enum</span> <span class="nc_def nc_t popupable" title="class Bool" data-title="&lt;a href=&quot;base_simple3.html#base_simple3#Bool&quot;&gt;class Bool&lt;/a&gt;" data-content="&lt;div&gt;&lt;b&gt;class&lt;/b&gt; &lt;span&gt;Bool&lt;/span&gt;&lt;br/&gt;&lt;div class=&quot;dropdown&quot;&gt; &lt;a data-toggle=&quot;dropdown&quot; href=&quot;#&quot;&gt;&lt;b&gt;hier&lt;/b&gt; super-classes&lt;span class=&quot;caret&quot;&gt;&lt;/span&gt;&lt;/a&gt;&lt;ul class=&quot;dropdown-menu&quot; role=&quot;menu&quot; aria-labelledby=&quot;dLabel&quot;&gt;&lt;li&gt;&lt;a href=&quot;base_simple3.html#base_simple3#Object&quot;&gt;Object&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;/div&gt;" data-toggle="popover">Bool</span>
index 0c177f8..4540753 100644 (file)
          std: 0.0
          sum: 7
        mnbr: number of refinement in module
-         avg: 3.0
-         max: base_simple3 (3)
-         min: base_simple3 (3)
+         avg: 0.0
+         max: base_simple3 (0)
+         min: base_simple3 (0)
          std: 0.0
-         sum: 3
+         sum: 0
        mnbcc: number of concrete class in module (intro + redef)
          avg: 4.0
          max: base_simple3 (4)
          std: 0.0
          sum: 0
        mnbic: number of interface in module (intro + redef)
-         avg: 4.0
-         max: base_simple3 (4)
-         min: base_simple3 (4)
+         avg: 1.0
+         max: base_simple3 (1)
+         min: base_simple3 (1)
          std: 0.0
-         sum: 4
+         sum: 1
 
  ## project base_empty_module
   `- group base_empty_module
          std: 3.0
          sum: 8
        mnbr: number of refinement in module
-         avg: 1.0
-         max: base_simple3 (3)
-         min: base_empty_module (0)
-         std: 1.581
-         sum: 3
+         avg: 0.0
+         max: base_simple3 (0)
+         min: base_simple3 (0)
+         std: 0.0
+         sum: 0
        mnbcc: number of concrete class in module (intro + redef)
          avg: 2.0
          max: base_simple3 (4)
          std: 0.0
          sum: 0
        mnbic: number of interface in module (intro + redef)
-         avg: 2.0
-         max: base_simple3 (4)
+         avg: 0.0
+         max: base_simple3 (1)
          min: base_empty_module (0)
-         std: 2.0
-         sum: 4
+         std: 0.707
+         sum: 1
 
 # MClasses metrics
 
@@ -421,48 +421,45 @@ Distribution of direct smallers
   <=0: sub-population=1 (33.33%); cumulated value=0 (0.0%)
   <=1: sub-population=2 (66.66%); cumulated value=2 (100.00%)
 ## Classdef hierarchy
-Number of nodes: 11
-Number of edges: 47 (4.27 per node)
-Number of direct edges: 9 (0.81 per node)
+Number of nodes: 8
+Number of edges: 14 (1.75 per node)
+Number of direct edges: 6 (0.75 per node)
 Distribution of greaters
- population: 11
+ population: 8
  minimum value: 1
- maximum value: 5
- total value: 47
- average value: 4.27
+ maximum value: 2
+ total value: 14
+ average value: 1.75
  distribution:
-  <=1: sub-population=1 (9.09%); cumulated value=1 (2.12%)
-  <=4: sub-population=4 (36.36%); cumulated value=16 (34.04%)
-  <=8: sub-population=6 (54.54%); cumulated value=30 (63.82%)
+  <=1: sub-population=2 (25.00%); cumulated value=2 (14.28%)
+  <=2: sub-population=6 (75.00%); cumulated value=12 (85.71%)
 Distribution of direct greaters
- population: 11
+ population: 8
  minimum value: 0
- maximum value: 3
- total value: 9
- average value: 0.81
+ maximum value: 1
+ total value: 6
+ average value: 0.75
  distribution:
-  <=0: sub-population=4 (36.36%); cumulated value=0 (0.0%)
-  <=1: sub-population=6 (54.54%); cumulated value=6 (66.66%)
-  <=4: sub-population=1 (9.09%); cumulated value=3 (33.33%)
+  <=0: sub-population=2 (25.00%); cumulated value=0 (0.0%)
+  <=1: sub-population=6 (75.00%); cumulated value=6 (100.00%)
 Distribution of smallers
- population: 11
+ population: 8
  minimum value: 1
- maximum value: 10
- total value: 47
- average value: 4.27
+ maximum value: 7
+ total value: 14
+ average value: 1.75
  distribution:
-  <=1: sub-population=7 (63.63%); cumulated value=7 (14.89%)
-  <=16: sub-population=4 (36.36%); cumulated value=40 (85.10%)
+  <=1: sub-population=7 (87.50%); cumulated value=7 (50.00%)
+  <=8: sub-population=1 (12.50%); cumulated value=7 (50.00%)
 Distribution of direct smallers
- population: 11
+ population: 8
  minimum value: 0
  maximum value: 6
- total value: 9
- average value: 0.81
+ total value: 6
+ average value: 0.75
  distribution:
-  <=0: sub-population=7 (63.63%); cumulated value=0 (0.0%)
-  <=1: sub-population=3 (27.27%); cumulated value=3 (33.33%)
-  <=8: sub-population=1 (9.09%); cumulated value=6 (66.66%)
+  <=0: sub-population=7 (87.50%); cumulated value=0 (0.0%)
+  <=8: sub-population=1 (12.50%); cumulated value=6 (100.00%)
 ## Class hierarchy
 Number of nodes: 8
 Number of edges: 14 (1.75 per node)
@@ -580,10 +577,10 @@ Number of classes: 8
   Number of enum kind: 2 (25.00%)
   Number of class kind: 5 (62.50%)
 
-Number of class definitions: 11
-Number of refined classes: 1 (12.50%)
-Average number of class refinments by classes: 0.37
-Average number of class refinments by refined classes: 3.00
+Number of class definitions: 8
+Number of refined classes: 0 (0.0%)
+Average number of class refinments by classes: 0.0
+Average number of class refinments by refined classes: na
 
 Number of properties: 20
   Number of MAttribute: 3 (15.00%)
@@ -614,7 +611,7 @@ Total number of self: 5
 Total number of implicit self: 4 (80.00%)
 --- Construction of tables ---
 Number of runtime classes: 7 (excluding interfaces and abstract classes)
-Average number of composing class definition by runtime class: 4.42
+Average number of composing class definition by runtime class: 1.85
 Total size of tables (classes and instances): 35 (not including stuff like info for subtyping or call-next-method)
 Average size of table by runtime class: 5.00
 Values never redefined: 35 (100.00%)
@@ -632,6 +629,8 @@ Values never redefined: 35 (100.00%)
        blooming mclasses (threshold: 2.388)
           B: 3.0
           C: 3.0
+generating out/nitmetrics_args1.write/project_hierarchy.dot
+generating out/nitmetrics_args1.write/module_hierarchy.dot
 
 # Nullable metrics
 
@@ -1075,8 +1074,6 @@ MMethodDef possibly invoked at runtime (by number of CallSites)
   base_simple3#Object#bar: 1 (4.54%)
   base_simple3#Object#foo: 1 (4.54%)
   base_simple3#C#init: 1 (4.54%)
-generating out/nitmetrics_args1.write/project_hierarchy.dot
-generating out/nitmetrics_args1.write/module_hierarchy.dot
 class_hierarchy.dot
 classdef_hierarchy.dot
 inheritance/
diff --git a/tests/sav/nitvm.res b/tests/sav/nitvm.res
new file mode 100644 (file)
index 0000000..742b9e8
--- /dev/null
@@ -0,0 +1,3 @@
+Usage: nitvm [OPTION]... <file.nit>...
+Executes Nit programs with a virtual machine.
+Use --help for help
diff --git a/tests/sav/nitvm_args1.res b/tests/sav/nitvm_args1.res
new file mode 100644 (file)
index 0000000..3b18e51
--- /dev/null
@@ -0,0 +1 @@
+hello world
diff --git a/tests/sav/nitvm_args2.res b/tests/sav/nitvm_args2.res
new file mode 100644 (file)
index 0000000..f00c965
--- /dev/null
@@ -0,0 +1,10 @@
+1
+2
+3
+4
+5
+6
+7
+8
+9
+10
diff --git a/tests/sav/nitvm_args3.res b/tests/sav/nitvm_args3.res
new file mode 100644 (file)
index 0000000..c76ebf3
--- /dev/null
@@ -0,0 +1,3 @@
+MIX: Before
+MIX: hello world
+MIX: After
index 264e277..e3174b3 100644 (file)
       
       class \e[32m\e[1mSys\e[0m\e[0m
       \e[30m\e[1mbase_simple3::Sys\e[0m\e[0m\e[30m (lines 53-66)\e[0m
-    
-    \e[1m== refined classes\e[0m
-      
-      redef interface \e[32m\e[1mObject\e[0m\e[0m
-      \e[30m\e[1mbase_simple3::Object\e[0m\e[0m\e[30m (lines 49-49)\e[0m
-      
-      redef interface \e[32m\e[1mObject\e[0m\e[0m
-      \e[30m\e[1mbase_simple3::Object\e[0m\e[0m\e[30m (lines 50-50)\e[0m
-      
-      redef interface \e[32m\e[1mObject\e[0m\e[0m
-      \e[30m\e[1mbase_simple3::Object\e[0m\e[0m\e[30m (lines 51-51)\e[0m
 
diff --git a/tests/sav/test_flatrope.res b/tests/sav/test_flatrope.res
new file mode 100644 (file)
index 0000000..5ec30ac
--- /dev/null
@@ -0,0 +1,5 @@
+quick brown fox over the lazy dog
+The quick brown fox over the lazy dog
+quick brown fox jumps over the lazy dog
+quick brown fox over the lazy dog.
+The quick brown fox jumps over the lazy dog.
diff --git a/tests/sav/test_ropes.res b/tests/sav/test_ropes.res
new file mode 100644 (file)
index 0000000..7e4b7c1
--- /dev/null
@@ -0,0 +1,26 @@
+NODEATTEST
+INZZ
+INDDZZ
+EEINDDZZ
+EEINDDZZFF
+eeinddzzff
+EEINDDZZFF
+FFZZDDNIEE
+hello_world.types.1.o
+now step live...
+...evil pets won
+now step live...
+now step live...
+ live...
+.
+ live stepnow
+...evil pets won
+n
+now step live... step live...
+w s
+ZZ
+ZZZZZZZZZZ
+ZZAAZZZZZZZZ
+NNZZAAZZZZZZZZ
+NIINZZAAZZZZZZZZ
+NINIINZZAAZZZZZZZZINZZAAZZZZZZZZ
diff --git a/tests/sav/test_text.res b/tests/sav/test_text.res
new file mode 100644 (file)
index 0000000..fc9283b
--- /dev/null
@@ -0,0 +1,15 @@
+WOE TO YOU, OH EARTH AND SEA FOR THE DEVIL SENDS THE BEAST WITH WRATH BECAUSE HE KNOWS THE TIME IS SHORT. LET HIM WHO HATH UNDERSTANDING RECKON THE NUMBER OF THE BEAST, FOR IT IS A HUMAN NUMBER, ITS NUMBER IS SIX HUNDRED AND SIXTY-SIX.
+woe to you, oh earth and sea for the devil sends the beast with wrath because he knows the time is short. let him who hath understanding reckon the number of the beast, for it is a human number, its number is six hundred and sixty-six.
+Woe to you, oh earth and sea for the Devil sends the beast with wrath because he knows the time is short.
+Let him who hath understanding reckon the number of the beast, for it is a human number, its number is Six Hundred and Sixty-Six.
+.xiS-ytxiS dna derdnuH xiS si rebmun sti ,rebmun namuh a si ti rof ,tsaeb eht fo rebmun eht nokcer gnidnatsrednu htah ohw mih teL .trohs si emit eht swonk eh esuaceb htarw htiw tsaeb eht sdnes liveD eht rof aes dna htrae ho ,uoy ot eoW
+235
+13
+110
+-1
+106
+37
+true
+true
+Woe to you, oh earth and sea for the Devil sends the beast with wrath because he knows the time is short. Let him who hath understanding reckon the number of the beast, for it is a human number, its number is Six Hundred and Sixty-Six.
+W o e   t o   y o u ,   o h   e a r t h   a n d   s e a   f o r   t h e   D e v i l   s e n d s   t h e   b e a s t   w i t h   w r a t h   b e c a u s e   h e   k n o w s   t h e   t i m e   i s   s h o r t .   L e t   h i m   w h o   h a t h   u n d e r s t a n d i n g   r e c k o n   t h e   n u m b e r   o f   t h e   b e a s t ,   f o r   i t   i s   a   h u m a n   n u m b e r ,   i t s   n u m b e r   i s   S i x   H u n d r e d   a n d   S i x t y - S i x .
diff --git a/tests/sav/test_text_alt1.res b/tests/sav/test_text_alt1.res
new file mode 100644 (file)
index 0000000..fc9283b
--- /dev/null
@@ -0,0 +1,15 @@
+WOE TO YOU, OH EARTH AND SEA FOR THE DEVIL SENDS THE BEAST WITH WRATH BECAUSE HE KNOWS THE TIME IS SHORT. LET HIM WHO HATH UNDERSTANDING RECKON THE NUMBER OF THE BEAST, FOR IT IS A HUMAN NUMBER, ITS NUMBER IS SIX HUNDRED AND SIXTY-SIX.
+woe to you, oh earth and sea for the devil sends the beast with wrath because he knows the time is short. let him who hath understanding reckon the number of the beast, for it is a human number, its number is six hundred and sixty-six.
+Woe to you, oh earth and sea for the Devil sends the beast with wrath because he knows the time is short.
+Let him who hath understanding reckon the number of the beast, for it is a human number, its number is Six Hundred and Sixty-Six.
+.xiS-ytxiS dna derdnuH xiS si rebmun sti ,rebmun namuh a si ti rof ,tsaeb eht fo rebmun eht nokcer gnidnatsrednu htah ohw mih teL .trohs si emit eht swonk eh esuaceb htarw htiw tsaeb eht sdnes liveD eht rof aes dna htrae ho ,uoy ot eoW
+235
+13
+110
+-1
+106
+37
+true
+true
+Woe to you, oh earth and sea for the Devil sends the beast with wrath because he knows the time is short. Let him who hath understanding reckon the number of the beast, for it is a human number, its number is Six Hundred and Sixty-Six.
+W o e   t o   y o u ,   o h   e a r t h   a n d   s e a   f o r   t h e   D e v i l   s e n d s   t h e   b e a s t   w i t h   w r a t h   b e c a u s e   h e   k n o w s   t h e   t i m e   i s   s h o r t .   L e t   h i m   w h o   h a t h   u n d e r s t a n d i n g   r e c k o n   t h e   n u m b e r   o f   t h e   b e a s t ,   f o r   i t   i s   a   h u m a n   n u m b e r ,   i t s   n u m b e r   i s   S i x   H u n d r e d   a n d   S i x t y - S i x .
diff --git a/tests/sav/test_text_alt2.res b/tests/sav/test_text_alt2.res
new file mode 100644 (file)
index 0000000..fc9283b
--- /dev/null
@@ -0,0 +1,15 @@
+WOE TO YOU, OH EARTH AND SEA FOR THE DEVIL SENDS THE BEAST WITH WRATH BECAUSE HE KNOWS THE TIME IS SHORT. LET HIM WHO HATH UNDERSTANDING RECKON THE NUMBER OF THE BEAST, FOR IT IS A HUMAN NUMBER, ITS NUMBER IS SIX HUNDRED AND SIXTY-SIX.
+woe to you, oh earth and sea for the devil sends the beast with wrath because he knows the time is short. let him who hath understanding reckon the number of the beast, for it is a human number, its number is six hundred and sixty-six.
+Woe to you, oh earth and sea for the Devil sends the beast with wrath because he knows the time is short.
+Let him who hath understanding reckon the number of the beast, for it is a human number, its number is Six Hundred and Sixty-Six.
+.xiS-ytxiS dna derdnuH xiS si rebmun sti ,rebmun namuh a si ti rof ,tsaeb eht fo rebmun eht nokcer gnidnatsrednu htah ohw mih teL .trohs si emit eht swonk eh esuaceb htarw htiw tsaeb eht sdnes liveD eht rof aes dna htrae ho ,uoy ot eoW
+235
+13
+110
+-1
+106
+37
+true
+true
+Woe to you, oh earth and sea for the Devil sends the beast with wrath because he knows the time is short. Let him who hath understanding reckon the number of the beast, for it is a human number, its number is Six Hundred and Sixty-Six.
+W o e   t o   y o u ,   o h   e a r t h   a n d   s e a   f o r   t h e   D e v i l   s e n d s   t h e   b e a s t   w i t h   w r a t h   b e c a u s e   h e   k n o w s   t h e   t i m e   i s   s h o r t .   L e t   h i m   w h o   h a t h   u n d e r s t a n d i n g   r e c k o n   t h e   n u m b e r   o f   t h e   b e a s t ,   f o r   i t   i s   a   h u m a n   n u m b e r ,   i t s   n u m b e r   i s   S i x   H u n d r e d   a n d   S i x t y - S i x .
diff --git a/tests/test_flatrope.nit b/tests/test_flatrope.nit
new file mode 100644 (file)
index 0000000..79b719f
--- /dev/null
@@ -0,0 +1,31 @@
+# This file is part of NIT ( http://www.nitlanguage.org ).
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+var st = "quick brown fox over the lazy dog"
+
+print st
+
+var pr = st.prepend("The ")
+
+print pr
+
+pr = st.insert_at(" jumps", 15)
+
+print pr
+
+pr = st.append(".")
+
+print pr
+
+print st.insert_at(" jumps", 15). prepend("The ").append(".")
diff --git a/tests/test_ropes.nit b/tests/test_ropes.nit
new file mode 100644 (file)
index 0000000..3040d12
--- /dev/null
@@ -0,0 +1,118 @@
+# This file is part of NIT ( http://www.nitlanguage.org ).
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+var x :String = new RopeString
+
+x = x + "NODE"
+x = x + "AT"
+x = x + "TEST"
+
+print x
+
+var lst = new List[String]
+
+lst.push(new RopeString.from("ZZ"))
+
+lst.push((lst.last * 5))
+
+lst.push(lst.last.insert_at("AA", 2))
+
+lst.push(lst.last.insert_at("NN", 0))
+
+lst.push(lst.last.insert_at("II", 1))
+
+lst.push(lst.last.insert_at(lst.last, 2))
+
+var ss = lst.last.substring(4,4)
+
+print ss
+
+ss = ss.as(RopeString).insert_at("DD", 2)
+
+print ss
+
+ss = ss.insert_at("EE", 0)
+
+print ss
+
+ss = ss.insert_at("FF", ss.length)
+
+print ss
+
+ss = ss.to_lower
+
+print ss
+
+ss = ss.to_upper
+
+print ss
+
+ss = ss.reversed
+
+print ss
+
+var atb = new Array[String]
+
+var s = new RopeString
+s = s.prepend(".types").as(RopeString)
+s = s.prepend("./examples/hello_world.nit".substring(11,11)).as(RopeString)
+s = s.append(".").as(RopeString)
+s = s.append("1").as(RopeString)
+s = s.append(".o").as(RopeString)
+
+print s
+
+var str = new RopeString.from("now") + " step" + " live..."
+
+print str
+
+print str.reversed
+
+for i in str.chars do printn i
+printn "\n"
+
+for i in [0..str.length[ do printn str.chars[i]
+printn "\n"
+
+var iter = str.chars.iterator
+for i in [0..str.length[ do
+       assert str.chars[i] == iter.item
+       iter.next
+end
+
+assert "now step live...".hash == str.hash
+
+for i in str.chars.iterator_from(8) do printn i
+printn "\n"
+
+for i in str.chars.iterator_from(str.length-1) do printn i
+printn "\n"
+
+for i in str.as(RopeString).reverse_substrings_from(12) do printn i
+printn "\n"
+
+for i in str.chars.reverse_iterator do printn i
+printn "\n"
+
+for i in str.chars.reverse_iterator_from(0) do printn i
+printn "\n"
+
+var str2 = str.as(RopeString).insert_at(str.substring_from(3), 3)
+
+print str2
+
+print str2.substring(2,3)
+
+for i in lst do print i
+
diff --git a/tests/test_text.nit b/tests/test_text.nit
new file mode 100644 (file)
index 0000000..4a27158
--- /dev/null
@@ -0,0 +1,99 @@
+# This file is part of NIT ( http://www.nitlanguage.org ).
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+var str = "Woe to you, oh earth and sea for the Devil sends the beast with wrath because he knows the time is short. Let him who hath understanding reckon the number of the beast, for it is a human number, its number is Six Hundred and Sixty-Six."
+var spaces = "           "
+var numstr = "1001"
+
+var txt: Text
+var trimable: Text
+var num: Text
+
+txt = str
+trimable = spaces + str + spaces
+num = numstr
+
+#alt1 txt = new FlatBuffer.from(str)
+#alt1 trimable = new FlatBuffer.from(spaces)
+#alt1 trimable.append(str)
+#alt1 trimable.append(spaces)
+#alt1 num = new FlatBuffer.from(numstr)
+
+#alt2 txt = new RopeString.from(str)
+#alt2 trimable = new RopeString.from(spaces)
+#alt2 trimable = trimable + str
+#alt2 trimable = trimable + spaces
+#alt2 num = new RopeString.from(numstr)
+
+# Test Text methods on all types of receivers
+
+print txt.to_upper
+print txt.to_lower
+assert txt * 2 == txt + txt
+print txt.substring(0, 105)
+print txt.substring_from(106)
+print txt.reversed
+print txt.length
+assert not txt.is_empty
+print txt.index_of('h')
+print txt.index_of_from('h', 105)
+print txt.index_of('Z')
+print txt.last_index_of('L')
+print txt.last_index_of_from('D', 105)
+print txt.has_substring("Woe", 0)
+print txt.has_substring("Let", 106)
+assert trimable != txt
+assert trimable.trim == txt
+assert num.is_numeric
+assert txt.has_prefix("Woe")
+assert txt.has_suffix("Six.")
+assert txt.hash == trimable.trim.hash
+
+# Test Text.chars (SequenceRead[Char]) methods on all receivers
+
+var chars = txt.chars
+
+assert chars != txt.substring_from(106).chars
+assert (txt.substring(0,105) + txt.substring_from(105)).chars == txt.chars
+assert chars[0] == 'W'
+assert chars.count('o') == 11
+assert chars.first == chars[0]
+assert chars.has('L')
+assert spaces.chars.has_only(' ')
+assert chars.index_of('D') == 37
+assert not chars.is_empty
+var count = 0
+for i in chars do
+       assert i != '!'
+       printn i
+       count += 1
+end
+printn "\n"
+assert count == txt.length
+var iter_from = txt.substring_from(105).chars.iterator
+var txt_iter_from = chars.iterator_from(105)
+while iter_from.is_ok do
+       assert iter_from.item == txt_iter_from.item
+       iter_from.next
+       txt_iter_from.next
+end
+assert not iter_from.is_ok and not txt_iter_from.is_ok
+var txt_reviter = chars.reverse_iterator_from(104)
+var sub_reviter = txt.substring(0,105).chars.reverse_iterator
+while txt_reviter.is_ok do
+       assert txt_reviter.item == sub_reviter.item
+       txt_reviter.next
+       sub_reviter.next
+end
+print chars.join(" ")