[Swfdec] 8 commits - libswfdec/swfdec_as_function.c libswfdec/swfdec_as_initialize.as libswfdec/swfdec_as_initialize.h libswfdec/swfdec_as_object.c libswfdec/swfdec_as_strings.c test/trace

Pekka Lampila medar at kemper.freedesktop.org
Tue Sep 11 06:21:03 PDT 2007


 libswfdec/swfdec_as_function.c             |   55 +++++
 libswfdec/swfdec_as_initialize.as          |    4 
 libswfdec/swfdec_as_initialize.h           |  288 ++++++++++++++---------------
 libswfdec/swfdec_as_object.c               |   57 +++--
 libswfdec/swfdec_as_strings.c              |    1 
 test/trace/Makefile.am                     |   14 -
 test/trace/function-apply-5.swf            |binary
 test/trace/function-apply-5.swf.trace      |  160 ++++++++++++++++
 test/trace/function-apply-6.swf            |binary
 test/trace/function-apply-6.swf.trace      |  194 +++++++++++++++++++
 test/trace/function-apply-7.swf            |binary
 test/trace/function-apply-7.swf.trace      |  194 +++++++++++++++++++
 test/trace/function-apply.as               |   47 ++++
 test/trace/function-properties-5.swf       |binary
 test/trace/function-properties-6.swf       |binary
 test/trace/function-properties-6.swf.trace |   20 +-
 test/trace/function-properties-7.swf       |binary
 test/trace/function-properties-7.swf.trace |   20 +-
 test/trace/object-watch-5.swf              |binary
 test/trace/object-watch-5.swf.trace        |   22 ++
 test/trace/object-watch-6.swf              |binary
 test/trace/object-watch-6.swf.trace        |   37 +++
 test/trace/object-watch-7.swf              |binary
 test/trace/object-watch-7.swf.trace        |   37 +++
 test/trace/object-watch.as                 |   81 +++++++-
 test/trace/trace_properties.as             |    4 
 26 files changed, 1043 insertions(+), 192 deletions(-)

New commits:
diff-tree e1c72a42832cf84d1b7c491fefe2879313415805 (from 05ff9f64432c618ed59680546688b932c59d31ce)
Author: Pekka Lampila <pekka.lampila at iki.fi>
Date:   Tue Sep 11 15:59:00 2007 +0300

    Expand object-watch test for various cases

diff --git a/test/trace/object-watch-5.swf b/test/trace/object-watch-5.swf
index bff16b4..06e28a5 100644
Binary files a/test/trace/object-watch-5.swf and b/test/trace/object-watch-5.swf differ
diff --git a/test/trace/object-watch-5.swf.trace b/test/trace/object-watch-5.swf.trace
index 4600342..3df4a62 100644
--- a/test/trace/object-watch-5.swf.trace
+++ b/test/trace/object-watch-5.swf.trace
@@ -1,15 +1,37 @@
+normal
 undefined
 undefined
 undefined
 undefined
+deleting the variable
 undefined
 undefined
 undefined
 undefined
+missing params
 undefined
 undefined
 undefined
 undefined
+extra params
+undefined
+undefined
+deleting the object
+undefined
+undefined
+loop
+undefined
+undefined
+undefined
+undefined
+undefined
+undefined
+deleting inside watch function
+undefined
+undefined
+undefined
+undefined
+working with native functions
 undefined
 undefined
 undefined
diff --git a/test/trace/object-watch-6.swf b/test/trace/object-watch-6.swf
index 6e70311..6d074a1 100644
Binary files a/test/trace/object-watch-6.swf and b/test/trace/object-watch-6.swf differ
diff --git a/test/trace/object-watch-6.swf.trace b/test/trace/object-watch-6.swf.trace
index ae228ef..05322a3 100644
--- a/test/trace/object-watch-6.swf.trace
+++ b/test/trace/object-watch-6.swf.trace
@@ -1,16 +1,31 @@
+normal
 true
 o.test: 0 -> 1 (user data) : 4
 true
 true
 o.test: 0 -> 1 () : 4
 true
+deleting the variable
+true
+o.test: 0 -> 1 () : 4
+false
+o.test:  -> 2 () : 4
+false
+true
+missing params
 false
 false
 false
 false
+extra params
 true
 o.test: 0 -> 1 (user data) : 4
 true
+deleting the object
+true
+o.test: 0 -> 1 () : 4
+false
+loop
 true
 0 -> 1
 true
@@ -21,3 +36,25 @@ true
 2:  -> 2
 3:  -> 3
 true
+deleting inside watch function
+true
+0 -> 1
+false
+ -> 2
+false
+true
+working with native functions
+true
+o.test: 0 -> 1 () : 4
+o.test: 1 -> 2 () : 4
+set 2
+false
+o.test: 2 -> 3 () : 4
+set 3
+set 1
+true
+o.test2: 1 -> 2 () : 4
+set 2
+false
+o.test2: 2 -> 3 () : 4
+set 3
diff --git a/test/trace/object-watch-7.swf b/test/trace/object-watch-7.swf
index 000dc02..966a93b 100644
Binary files a/test/trace/object-watch-7.swf and b/test/trace/object-watch-7.swf differ
diff --git a/test/trace/object-watch-7.swf.trace b/test/trace/object-watch-7.swf.trace
index d8a5f0b..3ee1d34 100644
--- a/test/trace/object-watch-7.swf.trace
+++ b/test/trace/object-watch-7.swf.trace
@@ -1,16 +1,31 @@
+normal
 true
 o.test: 0 -> 1 (user data) : 4
 true
 true
 o.test: 0 -> 1 (undefined) : 4
 true
+deleting the variable
+true
+o.test: 0 -> 1 (undefined) : 4
+false
+o.test: undefined -> 2 (undefined) : 4
+false
+true
+missing params
 false
 false
 false
 false
+extra params
 true
 o.test: 0 -> 1 (user data) : 4
 true
+deleting the object
+true
+o.test: 0 -> 1 (undefined) : 4
+false
+loop
 true
 0 -> 1
 0 -> 2
@@ -277,3 +292,25 @@ true
 2: undefined -> 194
 3: undefined -> 195
 true
+deleting inside watch function
+true
+0 -> 1
+false
+undefined -> 2
+false
+true
+working with native functions
+true
+o.test: 0 -> 1 (undefined) : 4
+o.test: 1 -> 2 (undefined) : 4
+set 2
+false
+o.test: 2 -> 3 (undefined) : 4
+set 3
+set 1
+true
+o.test2: 1 -> 2 (undefined) : 4
+set 2
+false
+o.test2: 2 -> 3 (undefined) : 4
+set 3
diff --git a/test/trace/object-watch.as b/test/trace/object-watch.as
index 6b0c6c5..1b81f36 100644
--- a/test/trace/object-watch.as
+++ b/test/trace/object-watch.as
@@ -30,11 +30,19 @@ var watch_loop_complex3 = function (prop
   return new_value;
 };
 
-// create an object
+var watch_delete = function (prop, old_value, new_value, user_data) {
+  trace (old_value + " -> " + new_value);
+  delete this[prop];
+  return new_value;
+};
+
+
+// create the object
 var o = new Object();
 o.toString = function () { return "o"; };
 
-// normal
+
+trace ("normal");
 o.test = 0;
 trace (o.watch ("test", watch_test, "user data"));
 o.test = 1;
@@ -47,7 +55,21 @@ o.test = 1;
 trace (o.unwatch ("test"));
 o.test = 2;
 
-// missing params
+
+trace ("deleting the variable");
+o.test = 0;
+trace (o.watch ("test", watch_test));
+o.test = 1;
+delete o.test;
+trace (o.hasOwnProperty ("test"));
+o.test = 2;
+delete o.test;
+trace (o.hasOwnProperty ("test"));
+trace (o.unwatch ("test"));
+o.test = 3;
+
+
+trace ("missing params");
 trace (o.watch ());
 trace (o.unwatch ());
 
@@ -57,14 +79,30 @@ o.test = 1;
 trace (o.unwatch ("test"));
 o.test = 2;
 
-// extra params
+
+trace ("extra params");
 o.test = 0;
 trace (o.watch ("test", watch_test, "user data", "user data2"));
 o.test = 1;
 trace (o.unwatch ("test"));
 o.test = 2;
 
-// loop
+
+trace ("deleting the object");
+o.test = 0;
+trace (o.watch ("test", watch_test));
+o.test = 1;
+
+delete o;
+o = new Object();
+o.toString = function () { return "o"; };
+
+o.test = 2;
+trace (o.unwatch ("test"));
+o.test = 3;
+
+
+trace ("loop");
 o.test = 0;
 trace (o.watch ("test", watch_loop, "user data"));
 o.test = 1;
@@ -79,4 +117,37 @@ o.loop1 = 1;
 trace (o.unwatch ("loop1"));
 o.loop1 = 2;
 
+
+trace ("deleting inside watch function");
+o.test = 0;
+trace (o.watch ("test", watch_delete));
+o.test = 1;
+trace (o.hasOwnProperty ("test"));
+o.test = 2;
+trace (o.hasOwnProperty ("test"));
+trace (o.unwatch ("test"));
+o.test = 3;
+
+
+trace ("working with native functions");
+var test_get = function () { trace ("get"); return "get"; };
+var test_set = function (value) { trace ("set " + value); };
+
+o.test = 0;
+trace (o.watch ("test", watch_test));
+o.test = 1;
+o.addProperty ("test", test_get, test_set);
+o.test = 2;
+trace (o.unwatch ("test"));
+o.test = 3;
+
+o.test2 = 0;
+o.addProperty ("test2", test_get, test_set);
+o.test2 = 1;
+trace (o.watch ("test2", watch_test));
+o.test2 = 2;
+trace (o.unwatch ("test2"));
+o.test2 = 3;
+
+
 loadMovie ("FSCommand:quit", "");
diff-tree 05ff9f64432c618ed59680546688b932c59d31ce (from d258d1a93904a367069ea318719f22f17373b688)
Author: Pekka Lampila <pekka.lampila at iki.fi>
Date:   Tue Sep 11 15:57:40 2007 +0300

    Few (un)watch tweaks
    
    Allow watching native properties
    Don't allow unwatching native properties
    Don't recreate a variable deleted inside a watch function

diff --git a/libswfdec/swfdec_as_object.c b/libswfdec/swfdec_as_object.c
index 5719eaf..d6831f2 100644
--- a/libswfdec/swfdec_as_object.c
+++ b/libswfdec/swfdec_as_object.c
@@ -333,39 +333,36 @@ swfdec_as_object_do_set (SwfdecAsObject 
 	  SWFDEC_AS_VARIABLE_VERSION_8_UP);
     }
   }
+  if (object->watches) {
+    SwfdecAsValue ret = *val;
+    SwfdecAsWatch *watch = g_hash_table_lookup (object->watches, variable);
+    /* FIXME: figure out if this limit here is correct. Add a watch in Flash 7 
+     * and set a variable using Flash 6 */
+    if (watch && swfdec_as_watch_can_recurse (watch)) {
+      SwfdecAsValue args[4];
+      SWFDEC_AS_VALUE_SET_STRING (&args[0], variable);
+      args[1] = var->value;
+      args[2] = *val;
+      args[3] = watch->watch_data;
+      swfdec_as_watch_ref (watch);
+      swfdec_as_function_call (watch->watch, object, 4, args, &ret);
+      swfdec_as_context_run (object->context);
+      swfdec_as_watch_unref (watch);
+      var = swfdec_as_object_hash_lookup (object, variable);
+      if (var == NULL)
+	return;
+    }
+
+    var->value = ret;
+  }
   if (var->get) {
     if (var->set) {
       SwfdecAsValue tmp;
       swfdec_as_function_call (var->set, object, 1, val, &tmp);
       swfdec_as_context_run (object->context);
     }
-  } else { 
-    if (object->watches) {
-      SwfdecAsValue ret = *val;
-      SwfdecAsWatch *watch = g_hash_table_lookup (object->watches, variable);
-      /* FIXME: figure out if this limit here is correct. Add a watch in Flash 7 
-       * and set a variable using Flash 6 */
-      if (watch && swfdec_as_watch_can_recurse (watch)) {
-	SwfdecAsValue args[4];
-	SWFDEC_AS_VALUE_SET_STRING (&args[0], variable);
-	args[1] = var->value;
-	args[2] = *val;
-	args[3] = watch->watch_data;
-	swfdec_as_watch_ref (watch);
-	swfdec_as_function_call (watch->watch, object, 4, args, &ret);
-	swfdec_as_context_run (object->context);
-	swfdec_as_watch_unref (watch);
-	var = swfdec_as_object_hash_lookup (object, variable);
-	if (var == NULL) {
-	  var = swfdec_as_object_hash_create (object, variable, flags);
-	  if (var == NULL)
-	    return;
-	}
-      }
-      var->value = ret;
-    } else {
-      var->value = *val;
-    }
+  } else if (!object->watches) {
+    var->value = *val;
   }
   if (variable == SWFDEC_AS_STR___proto__) {
     if (SWFDEC_AS_VALUE_IS_OBJECT (val) &&
@@ -1340,6 +1337,7 @@ void
 swfdec_as_object_unwatch (SwfdecAsContext *cx, SwfdecAsObject *object,
     guint argc, SwfdecAsValue *argv, SwfdecAsValue *retval)
 {
+  SwfdecAsVariable *var;
   const char *name;
 
   SWFDEC_AS_VALUE_SET_BOOLEAN (retval, FALSE);
@@ -1348,6 +1346,11 @@ swfdec_as_object_unwatch (SwfdecAsContex
     return;
 
   name = swfdec_as_value_to_string (cx, &argv[0]);
+
+  // special case: can't unwatch native properties
+  if ((var = swfdec_as_object_hash_lookup (object, name))&& var->get != NULL)
+      return;
+
   if (object->watches != NULL && 
       g_hash_table_remove (object->watches, name)) {
 
diff-tree d258d1a93904a367069ea318719f22f17373b688 (from 3a69becf53764c298412ab797d2bb5b63d17bca3)
Author: Pekka Lampila <pekka.lampila at iki.fi>
Date:   Tue Sep 11 15:23:14 2007 +0300

    Add Object.prototype.toLocaleString method (just calls this.toString)

diff --git a/libswfdec/swfdec_as_initialize.as b/libswfdec/swfdec_as_initialize.as
index 617889e..bf283c5 100644
--- a/libswfdec/swfdec_as_initialize.as
+++ b/libswfdec/swfdec_as_initialize.as
@@ -24,6 +24,10 @@ ASSetNativeAccessor = ASnative (4, 1);
 
 /*** BASE OBJECTS ***/
 
+Object.prototype.toLocaleString = function () {
+  return this.toString ();
+};
+ASSetPropFlags (Object.prototype, null, 3);
 ASSetPropFlags (Object, null, 7);
 
 Boolean = ASconstructor(107, 2);
diff --git a/libswfdec/swfdec_as_initialize.h b/libswfdec/swfdec_as_initialize.h
index 6cab4c2..2a752dc 100644
--- a/libswfdec/swfdec_as_initialize.h
+++ b/libswfdec/swfdec_as_initialize.h
@@ -2,149 +2,155 @@
 
 /* compiled from swfdec_as_initialize.as */
 const unsigned char swfdec_as_initialize[] = {
-  0x88, 0x54, 0x04, 0x30,  0x00, 0x41, 0x53, 0x53,  0x65, 0x74, 0x4E, 0x61,  0x74, 0x69, 0x76, 0x65,
+  0x88, 0x6C, 0x04, 0x32,  0x00, 0x41, 0x53, 0x53,  0x65, 0x74, 0x4E, 0x61,  0x74, 0x69, 0x76, 0x65,
   0x00, 0x41, 0x53, 0x6E,  0x61, 0x74, 0x69, 0x76,  0x65, 0x00, 0x41, 0x53,  0x53, 0x65, 0x74, 0x4E,
   0x61, 0x74, 0x69, 0x76,  0x65, 0x41, 0x63, 0x63,  0x65, 0x73, 0x73, 0x6F,  0x72, 0x00, 0x4F, 0x62,
-  0x6A, 0x65, 0x63, 0x74,  0x00, 0x41, 0x53, 0x53,  0x65, 0x74, 0x50, 0x72,  0x6F, 0x70, 0x46, 0x6C,
-  0x61, 0x67, 0x73, 0x00,  0x42, 0x6F, 0x6F, 0x6C,  0x65, 0x61, 0x6E, 0x00,  0x41, 0x53, 0x63, 0x6F,
-  0x6E, 0x73, 0x74, 0x72,  0x75, 0x63, 0x74, 0x6F,  0x72, 0x00, 0x70, 0x72,  0x6F, 0x74, 0x6F, 0x74,
-  0x79, 0x70, 0x65, 0x00,  0x76, 0x61, 0x6C, 0x75,  0x65, 0x4F, 0x66, 0x2C,  0x74, 0x6F, 0x53, 0x74,
-  0x72, 0x69, 0x6E, 0x67,  0x00, 0x4E, 0x75, 0x6D,  0x62, 0x65, 0x72, 0x00,  0x4E, 0x61, 0x4E, 0x00,
-  0x50, 0x4F, 0x53, 0x49,  0x54, 0x49, 0x56, 0x45,  0x5F, 0x49, 0x4E, 0x46,  0x49, 0x4E, 0x49, 0x54,
-  0x59, 0x00, 0x49, 0x6E,  0x66, 0x69, 0x6E, 0x69,  0x74, 0x79, 0x00, 0x4E,  0x45, 0x47, 0x41, 0x54,
-  0x49, 0x56, 0x45, 0x5F,  0x49, 0x4E, 0x46, 0x49,  0x4E, 0x49, 0x54, 0x59,  0x00, 0x4D, 0x49, 0x4E,
-  0x5F, 0x56, 0x41, 0x4C,  0x55, 0x45, 0x00, 0x4D,  0x41, 0x58, 0x5F, 0x56,  0x41, 0x4C, 0x55, 0x45,
-  0x00, 0x53, 0x74, 0x72,  0x69, 0x6E, 0x67, 0x00,  0x76, 0x61, 0x6C, 0x75,  0x65, 0x4F, 0x66, 0x2C,
-  0x74, 0x6F, 0x53, 0x74,  0x72, 0x69, 0x6E, 0x67,  0x2C, 0x74, 0x6F, 0x55,  0x70, 0x70, 0x65, 0x72,
-  0x43, 0x61, 0x73, 0x65,  0x2C, 0x74, 0x6F, 0x4C,  0x6F, 0x77, 0x65, 0x72,  0x43, 0x61, 0x73, 0x65,
-  0x2C, 0x63, 0x68, 0x61,  0x72, 0x41, 0x74, 0x2C,  0x63, 0x68, 0x61, 0x72,  0x43, 0x6F, 0x64, 0x65,
-  0x41, 0x74, 0x2C, 0x63,  0x6F, 0x6E, 0x63, 0x61,  0x74, 0x2C, 0x69, 0x6E,  0x64, 0x65, 0x78, 0x4F,
-  0x66, 0x2C, 0x6C, 0x61,  0x73, 0x74, 0x49, 0x6E,  0x64, 0x65, 0x78, 0x4F,  0x66, 0x2C, 0x73, 0x6C,
-  0x69, 0x63, 0x65, 0x2C,  0x73, 0x75, 0x62, 0x73,  0x74, 0x72, 0x69, 0x6E,  0x67, 0x2C, 0x73, 0x70,
-  0x6C, 0x69, 0x74, 0x2C,  0x73, 0x75, 0x62, 0x73,  0x74, 0x72, 0x00, 0x66,  0x72, 0x6F, 0x6D, 0x43,
-  0x68, 0x61, 0x72, 0x43,  0x6F, 0x64, 0x65, 0x00,  0x4D, 0x61, 0x74, 0x68,  0x00, 0x45, 0x00, 0x4C,
-  0x4E, 0x31, 0x30, 0x00,  0x4C, 0x4E, 0x32, 0x00,  0x4C, 0x4F, 0x47, 0x31,  0x30, 0x45, 0x00, 0x4C,
-  0x4F, 0x47, 0x32, 0x45,  0x00, 0x50, 0x49, 0x00,  0x53, 0x51, 0x52, 0x54,  0x31, 0x5F, 0x32, 0x00,
-  0x53, 0x51, 0x52, 0x54,  0x32, 0x00, 0x61, 0x62,  0x73, 0x2C, 0x6D, 0x69,  0x6E, 0x2C, 0x6D, 0x61,
-  0x78, 0x2C, 0x73, 0x69,  0x6E, 0x2C, 0x63, 0x6F,  0x73, 0x2C, 0x61, 0x74,  0x61, 0x6E, 0x32, 0x2C,
-  0x74, 0x61, 0x6E, 0x2C,  0x65, 0x78, 0x70, 0x2C,  0x6C, 0x6F, 0x67, 0x2C,  0x73, 0x71, 0x72, 0x74,
-  0x2C, 0x72, 0x6F, 0x75,  0x6E, 0x64, 0x2C, 0x72,  0x61, 0x6E, 0x64, 0x6F,  0x6D, 0x2C, 0x66, 0x6C,
-  0x6F, 0x6F, 0x72, 0x2C,  0x63, 0x65, 0x69, 0x6C,  0x2C, 0x61, 0x74, 0x61,  0x6E, 0x2C, 0x61, 0x73,
-  0x69, 0x6E, 0x2C, 0x61,  0x63, 0x6F, 0x73, 0x2C,  0x70, 0x6F, 0x77, 0x00,  0x44, 0x61, 0x74, 0x65,
-  0x00, 0x67, 0x65, 0x74,  0x46, 0x75, 0x6C, 0x6C,  0x59, 0x65, 0x61, 0x72,  0x2C, 0x67, 0x65, 0x74,
-  0x59, 0x65, 0x61, 0x72,  0x2C, 0x67, 0x65, 0x74,  0x4D, 0x6F, 0x6E, 0x74,  0x68, 0x2C, 0x67, 0x65,
-  0x74, 0x44, 0x61, 0x74,  0x65, 0x2C, 0x67, 0x65,  0x74, 0x44, 0x61, 0x79,  0x2C, 0x67, 0x65, 0x74,
-  0x48, 0x6F, 0x75, 0x72,  0x73, 0x2C, 0x67, 0x65,  0x74, 0x4D, 0x69, 0x6E,  0x75, 0x74, 0x65, 0x73,
-  0x2C, 0x67, 0x65, 0x74,  0x53, 0x65, 0x63, 0x6F,  0x6E, 0x64, 0x73, 0x2C,  0x67, 0x65, 0x74, 0x4D,
-  0x69, 0x6C, 0x6C, 0x69,  0x73, 0x65, 0x63, 0x6F,  0x6E, 0x64, 0x73, 0x2C,  0x73, 0x65, 0x74, 0x46,
-  0x75, 0x6C, 0x6C, 0x59,  0x65, 0x61, 0x72, 0x2C,  0x73, 0x65, 0x74, 0x4D,  0x6F, 0x6E, 0x74, 0x68,
-  0x2C, 0x73, 0x65, 0x74,  0x44, 0x61, 0x74, 0x65,  0x2C, 0x73, 0x65, 0x74,  0x48, 0x6F, 0x75, 0x72,
-  0x73, 0x2C, 0x73, 0x65,  0x74, 0x4D, 0x69, 0x6E,  0x75, 0x74, 0x65, 0x73,  0x2C, 0x73, 0x65, 0x74,
-  0x53, 0x65, 0x63, 0x6F,  0x6E, 0x64, 0x73, 0x2C,  0x73, 0x65, 0x74, 0x4D,  0x69, 0x6C, 0x6C, 0x69,
-  0x73, 0x65, 0x63, 0x6F,  0x6E, 0x64, 0x73, 0x2C,  0x67, 0x65, 0x74, 0x54,  0x69, 0x6D, 0x65, 0x2C,
-  0x73, 0x65, 0x74, 0x54,  0x69, 0x6D, 0x65, 0x2C,  0x67, 0x65, 0x74, 0x54,  0x69, 0x6D, 0x65, 0x7A,
-  0x6F, 0x6E, 0x65, 0x4F,  0x66, 0x66, 0x73, 0x65,  0x74, 0x2C, 0x74, 0x6F,  0x53, 0x74, 0x72, 0x69,
-  0x6E, 0x67, 0x2C, 0x73,  0x65, 0x74, 0x59, 0x65,  0x61, 0x72, 0x00, 0x67,  0x65, 0x74, 0x55, 0x54,
-  0x43, 0x46, 0x75, 0x6C,  0x6C, 0x59, 0x65, 0x61,  0x72, 0x2C, 0x67, 0x65,  0x74, 0x55, 0x54, 0x43,
-  0x59, 0x65, 0x61, 0x72,  0x2C, 0x67, 0x65, 0x74,  0x55, 0x54, 0x43, 0x4D,  0x6F, 0x6E, 0x74, 0x68,
-  0x2C, 0x67, 0x65, 0x74,  0x55, 0x54, 0x43, 0x44,  0x61, 0x74, 0x65, 0x2C,  0x67, 0x65, 0x74, 0x55,
-  0x54, 0x43, 0x44, 0x61,  0x79, 0x2C, 0x67, 0x65,  0x74, 0x55, 0x54, 0x43,  0x48, 0x6F, 0x75, 0x72,
-  0x73, 0x2C, 0x67, 0x65,  0x74, 0x55, 0x54, 0x43,  0x4D, 0x69, 0x6E, 0x75,  0x74, 0x65, 0x73, 0x2C,
-  0x67, 0x65, 0x74, 0x55,  0x54, 0x43, 0x53, 0x65,  0x63, 0x6F, 0x6E, 0x64,  0x73, 0x2C, 0x67, 0x65,
-  0x74, 0x55, 0x54, 0x43,  0x4D, 0x69, 0x6C, 0x6C,  0x69, 0x73, 0x65, 0x63,  0x6F, 0x6E, 0x64, 0x73,
-  0x2C, 0x73, 0x65, 0x74,  0x55, 0x54, 0x43, 0x46,  0x75, 0x6C, 0x6C, 0x59,  0x65, 0x61, 0x72, 0x2C,
-  0x73, 0x65, 0x74, 0x55,  0x54, 0x43, 0x4D, 0x6F,  0x6E, 0x74, 0x68, 0x2C,  0x73, 0x65, 0x74, 0x55,
-  0x54, 0x43, 0x44, 0x61,  0x74, 0x65, 0x2C, 0x73,  0x65, 0x74, 0x55, 0x54,  0x43, 0x48, 0x6F, 0x75,
-  0x72, 0x73, 0x2C, 0x73,  0x65, 0x74, 0x55, 0x54,  0x43, 0x4D, 0x69, 0x6E,  0x75, 0x74, 0x65, 0x73,
-  0x2C, 0x73, 0x65, 0x74,  0x55, 0x54, 0x43, 0x53,  0x65, 0x63, 0x6F, 0x6E,  0x64, 0x73, 0x2C, 0x73,
-  0x65, 0x74, 0x55, 0x54,  0x43, 0x4D, 0x69, 0x6C,  0x6C, 0x69, 0x73, 0x65,  0x63, 0x6F, 0x6E, 0x64,
-  0x73, 0x00, 0x76, 0x61,  0x6C, 0x75, 0x65, 0x4F,  0x66, 0x00, 0x67, 0x65,  0x74, 0x54, 0x69, 0x6D,
-  0x65, 0x00, 0x55, 0x54,  0x43, 0x00, 0x41, 0x72,  0x72, 0x61, 0x79, 0x00,  0x70, 0x75, 0x73, 0x68,
-  0x2C, 0x70, 0x6F, 0x70,  0x2C, 0x63, 0x6F, 0x6E,  0x63, 0x61, 0x74, 0x2C,  0x73, 0x68, 0x69, 0x66,
-  0x74, 0x2C, 0x75, 0x6E,  0x73, 0x68, 0x69, 0x66,  0x74, 0x2C, 0x73, 0x6C,  0x69, 0x63, 0x65, 0x2C,
-  0x6A, 0x6F, 0x69, 0x6E,  0x2C, 0x73, 0x70, 0x6C,  0x69, 0x63, 0x65, 0x2C,  0x74, 0x6F, 0x53, 0x74,
-  0x72, 0x69, 0x6E, 0x67,  0x2C, 0x73, 0x6F, 0x72,  0x74, 0x2C, 0x72, 0x65,  0x76, 0x65, 0x72, 0x73,
-  0x65, 0x2C, 0x73, 0x6F,  0x72, 0x74, 0x4F, 0x6E,  0x00, 0x43, 0x41, 0x53,  0x45, 0x49, 0x4E, 0x53,
-  0x45, 0x4E, 0x53, 0x49,  0x54, 0x49, 0x56, 0x45,  0x00, 0x44, 0x45, 0x53,  0x43, 0x45, 0x4E, 0x44,
-  0x49, 0x4E, 0x47, 0x00,  0x55, 0x4E, 0x49, 0x51,  0x55, 0x45, 0x53, 0x4F,  0x52, 0x54, 0x00, 0x52,
-  0x45, 0x54, 0x55, 0x52,  0x4E, 0x49, 0x4E, 0x44,  0x45, 0x58, 0x45, 0x44,  0x41, 0x52, 0x52, 0x41,
-  0x59, 0x00, 0x4E, 0x55,  0x4D, 0x45, 0x52, 0x49,  0x43, 0x00, 0x65, 0x73,  0x63, 0x61, 0x70, 0x65,
-  0x00, 0x75, 0x6E, 0x65,  0x73, 0x63, 0x61, 0x70,  0x65, 0x00, 0x70, 0x61,  0x72, 0x73, 0x65, 0x49,
-  0x6E, 0x74, 0x00, 0x69,  0x73, 0x4E, 0x61, 0x4E,  0x00, 0x69, 0x73, 0x46,  0x69, 0x6E, 0x69, 0x74,
-  0x65, 0x00, 0x74, 0x68,  0x69, 0x73, 0x00, 0x96,  0x13, 0x00, 0x08, 0x00,  0x07, 0x00, 0x00, 0x00,
+  0x6A, 0x65, 0x63, 0x74,  0x00, 0x70, 0x72, 0x6F,  0x74, 0x6F, 0x74, 0x79,  0x70, 0x65, 0x00, 0x74,
+  0x6F, 0x4C, 0x6F, 0x63,  0x61, 0x6C, 0x65, 0x53,  0x74, 0x72, 0x69, 0x6E,  0x67, 0x00, 0x74, 0x68,
+  0x69, 0x73, 0x00, 0x74,  0x6F, 0x53, 0x74, 0x72,  0x69, 0x6E, 0x67, 0x00,  0x41, 0x53, 0x53, 0x65,
+  0x74, 0x50, 0x72, 0x6F,  0x70, 0x46, 0x6C, 0x61,  0x67, 0x73, 0x00, 0x42,  0x6F, 0x6F, 0x6C, 0x65,
+  0x61, 0x6E, 0x00, 0x41,  0x53, 0x63, 0x6F, 0x6E,  0x73, 0x74, 0x72, 0x75,  0x63, 0x74, 0x6F, 0x72,
+  0x00, 0x76, 0x61, 0x6C,  0x75, 0x65, 0x4F, 0x66,  0x2C, 0x74, 0x6F, 0x53,  0x74, 0x72, 0x69, 0x6E,
+  0x67, 0x00, 0x4E, 0x75,  0x6D, 0x62, 0x65, 0x72,  0x00, 0x4E, 0x61, 0x4E,  0x00, 0x50, 0x4F, 0x53,
+  0x49, 0x54, 0x49, 0x56,  0x45, 0x5F, 0x49, 0x4E,  0x46, 0x49, 0x4E, 0x49,  0x54, 0x59, 0x00, 0x49,
+  0x6E, 0x66, 0x69, 0x6E,  0x69, 0x74, 0x79, 0x00,  0x4E, 0x45, 0x47, 0x41,  0x54, 0x49, 0x56, 0x45,
+  0x5F, 0x49, 0x4E, 0x46,  0x49, 0x4E, 0x49, 0x54,  0x59, 0x00, 0x4D, 0x49,  0x4E, 0x5F, 0x56, 0x41,
+  0x4C, 0x55, 0x45, 0x00,  0x4D, 0x41, 0x58, 0x5F,  0x56, 0x41, 0x4C, 0x55,  0x45, 0x00, 0x53, 0x74,
+  0x72, 0x69, 0x6E, 0x67,  0x00, 0x76, 0x61, 0x6C,  0x75, 0x65, 0x4F, 0x66,  0x2C, 0x74, 0x6F, 0x53,
+  0x74, 0x72, 0x69, 0x6E,  0x67, 0x2C, 0x74, 0x6F,  0x55, 0x70, 0x70, 0x65,  0x72, 0x43, 0x61, 0x73,
+  0x65, 0x2C, 0x74, 0x6F,  0x4C, 0x6F, 0x77, 0x65,  0x72, 0x43, 0x61, 0x73,  0x65, 0x2C, 0x63, 0x68,
+  0x61, 0x72, 0x41, 0x74,  0x2C, 0x63, 0x68, 0x61,  0x72, 0x43, 0x6F, 0x64,  0x65, 0x41, 0x74, 0x2C,
+  0x63, 0x6F, 0x6E, 0x63,  0x61, 0x74, 0x2C, 0x69,  0x6E, 0x64, 0x65, 0x78,  0x4F, 0x66, 0x2C, 0x6C,
+  0x61, 0x73, 0x74, 0x49,  0x6E, 0x64, 0x65, 0x78,  0x4F, 0x66, 0x2C, 0x73,  0x6C, 0x69, 0x63, 0x65,
+  0x2C, 0x73, 0x75, 0x62,  0x73, 0x74, 0x72, 0x69,  0x6E, 0x67, 0x2C, 0x73,  0x70, 0x6C, 0x69, 0x74,
+  0x2C, 0x73, 0x75, 0x62,  0x73, 0x74, 0x72, 0x00,  0x66, 0x72, 0x6F, 0x6D,  0x43, 0x68, 0x61, 0x72,
+  0x43, 0x6F, 0x64, 0x65,  0x00, 0x4D, 0x61, 0x74,  0x68, 0x00, 0x45, 0x00,  0x4C, 0x4E, 0x31, 0x30,
+  0x00, 0x4C, 0x4E, 0x32,  0x00, 0x4C, 0x4F, 0x47,  0x31, 0x30, 0x45, 0x00,  0x4C, 0x4F, 0x47, 0x32,
+  0x45, 0x00, 0x50, 0x49,  0x00, 0x53, 0x51, 0x52,  0x54, 0x31, 0x5F, 0x32,  0x00, 0x53, 0x51, 0x52,
+  0x54, 0x32, 0x00, 0x61,  0x62, 0x73, 0x2C, 0x6D,  0x69, 0x6E, 0x2C, 0x6D,  0x61, 0x78, 0x2C, 0x73,
+  0x69, 0x6E, 0x2C, 0x63,  0x6F, 0x73, 0x2C, 0x61,  0x74, 0x61, 0x6E, 0x32,  0x2C, 0x74, 0x61, 0x6E,
+  0x2C, 0x65, 0x78, 0x70,  0x2C, 0x6C, 0x6F, 0x67,  0x2C, 0x73, 0x71, 0x72,  0x74, 0x2C, 0x72, 0x6F,
+  0x75, 0x6E, 0x64, 0x2C,  0x72, 0x61, 0x6E, 0x64,  0x6F, 0x6D, 0x2C, 0x66,  0x6C, 0x6F, 0x6F, 0x72,
+  0x2C, 0x63, 0x65, 0x69,  0x6C, 0x2C, 0x61, 0x74,  0x61, 0x6E, 0x2C, 0x61,  0x73, 0x69, 0x6E, 0x2C,
+  0x61, 0x63, 0x6F, 0x73,  0x2C, 0x70, 0x6F, 0x77,  0x00, 0x44, 0x61, 0x74,  0x65, 0x00, 0x67, 0x65,
+  0x74, 0x46, 0x75, 0x6C,  0x6C, 0x59, 0x65, 0x61,  0x72, 0x2C, 0x67, 0x65,  0x74, 0x59, 0x65, 0x61,
+  0x72, 0x2C, 0x67, 0x65,  0x74, 0x4D, 0x6F, 0x6E,  0x74, 0x68, 0x2C, 0x67,  0x65, 0x74, 0x44, 0x61,
+  0x74, 0x65, 0x2C, 0x67,  0x65, 0x74, 0x44, 0x61,  0x79, 0x2C, 0x67, 0x65,  0x74, 0x48, 0x6F, 0x75,
+  0x72, 0x73, 0x2C, 0x67,  0x65, 0x74, 0x4D, 0x69,  0x6E, 0x75, 0x74, 0x65,  0x73, 0x2C, 0x67, 0x65,
+  0x74, 0x53, 0x65, 0x63,  0x6F, 0x6E, 0x64, 0x73,  0x2C, 0x67, 0x65, 0x74,  0x4D, 0x69, 0x6C, 0x6C,
+  0x69, 0x73, 0x65, 0x63,  0x6F, 0x6E, 0x64, 0x73,  0x2C, 0x73, 0x65, 0x74,  0x46, 0x75, 0x6C, 0x6C,
+  0x59, 0x65, 0x61, 0x72,  0x2C, 0x73, 0x65, 0x74,  0x4D, 0x6F, 0x6E, 0x74,  0x68, 0x2C, 0x73, 0x65,
+  0x74, 0x44, 0x61, 0x74,  0x65, 0x2C, 0x73, 0x65,  0x74, 0x48, 0x6F, 0x75,  0x72, 0x73, 0x2C, 0x73,
+  0x65, 0x74, 0x4D, 0x69,  0x6E, 0x75, 0x74, 0x65,  0x73, 0x2C, 0x73, 0x65,  0x74, 0x53, 0x65, 0x63,
+  0x6F, 0x6E, 0x64, 0x73,  0x2C, 0x73, 0x65, 0x74,  0x4D, 0x69, 0x6C, 0x6C,  0x69, 0x73, 0x65, 0x63,
+  0x6F, 0x6E, 0x64, 0x73,  0x2C, 0x67, 0x65, 0x74,  0x54, 0x69, 0x6D, 0x65,  0x2C, 0x73, 0x65, 0x74,
+  0x54, 0x69, 0x6D, 0x65,  0x2C, 0x67, 0x65, 0x74,  0x54, 0x69, 0x6D, 0x65,  0x7A, 0x6F, 0x6E, 0x65,
+  0x4F, 0x66, 0x66, 0x73,  0x65, 0x74, 0x2C, 0x74,  0x6F, 0x53, 0x74, 0x72,  0x69, 0x6E, 0x67, 0x2C,
+  0x73, 0x65, 0x74, 0x59,  0x65, 0x61, 0x72, 0x00,  0x67, 0x65, 0x74, 0x55,  0x54, 0x43, 0x46, 0x75,
+  0x6C, 0x6C, 0x59, 0x65,  0x61, 0x72, 0x2C, 0x67,  0x65, 0x74, 0x55, 0x54,  0x43, 0x59, 0x65, 0x61,
+  0x72, 0x2C, 0x67, 0x65,  0x74, 0x55, 0x54, 0x43,  0x4D, 0x6F, 0x6E, 0x74,  0x68, 0x2C, 0x67, 0x65,
+  0x74, 0x55, 0x54, 0x43,  0x44, 0x61, 0x74, 0x65,  0x2C, 0x67, 0x65, 0x74,  0x55, 0x54, 0x43, 0x44,
+  0x61, 0x79, 0x2C, 0x67,  0x65, 0x74, 0x55, 0x54,  0x43, 0x48, 0x6F, 0x75,  0x72, 0x73, 0x2C, 0x67,
+  0x65, 0x74, 0x55, 0x54,  0x43, 0x4D, 0x69, 0x6E,  0x75, 0x74, 0x65, 0x73,  0x2C, 0x67, 0x65, 0x74,
+  0x55, 0x54, 0x43, 0x53,  0x65, 0x63, 0x6F, 0x6E,  0x64, 0x73, 0x2C, 0x67,  0x65, 0x74, 0x55, 0x54,
+  0x43, 0x4D, 0x69, 0x6C,  0x6C, 0x69, 0x73, 0x65,  0x63, 0x6F, 0x6E, 0x64,  0x73, 0x2C, 0x73, 0x65,
+  0x74, 0x55, 0x54, 0x43,  0x46, 0x75, 0x6C, 0x6C,  0x59, 0x65, 0x61, 0x72,  0x2C, 0x73, 0x65, 0x74,
+  0x55, 0x54, 0x43, 0x4D,  0x6F, 0x6E, 0x74, 0x68,  0x2C, 0x73, 0x65, 0x74,  0x55, 0x54, 0x43, 0x44,
+  0x61, 0x74, 0x65, 0x2C,  0x73, 0x65, 0x74, 0x55,  0x54, 0x43, 0x48, 0x6F,  0x75, 0x72, 0x73, 0x2C,
+  0x73, 0x65, 0x74, 0x55,  0x54, 0x43, 0x4D, 0x69,  0x6E, 0x75, 0x74, 0x65,  0x73, 0x2C, 0x73, 0x65,
+  0x74, 0x55, 0x54, 0x43,  0x53, 0x65, 0x63, 0x6F,  0x6E, 0x64, 0x73, 0x2C,  0x73, 0x65, 0x74, 0x55,
+  0x54, 0x43, 0x4D, 0x69,  0x6C, 0x6C, 0x69, 0x73,  0x65, 0x63, 0x6F, 0x6E,  0x64, 0x73, 0x00, 0x76,
+  0x61, 0x6C, 0x75, 0x65,  0x4F, 0x66, 0x00, 0x67,  0x65, 0x74, 0x54, 0x69,  0x6D, 0x65, 0x00, 0x55,
+  0x54, 0x43, 0x00, 0x41,  0x72, 0x72, 0x61, 0x79,  0x00, 0x70, 0x75, 0x73,  0x68, 0x2C, 0x70, 0x6F,
+  0x70, 0x2C, 0x63, 0x6F,  0x6E, 0x63, 0x61, 0x74,  0x2C, 0x73, 0x68, 0x69,  0x66, 0x74, 0x2C, 0x75,
+  0x6E, 0x73, 0x68, 0x69,  0x66, 0x74, 0x2C, 0x73,  0x6C, 0x69, 0x63, 0x65,  0x2C, 0x6A, 0x6F, 0x69,
+  0x6E, 0x2C, 0x73, 0x70,  0x6C, 0x69, 0x63, 0x65,  0x2C, 0x74, 0x6F, 0x53,  0x74, 0x72, 0x69, 0x6E,
+  0x67, 0x2C, 0x73, 0x6F,  0x72, 0x74, 0x2C, 0x72,  0x65, 0x76, 0x65, 0x72,  0x73, 0x65, 0x2C, 0x73,
+  0x6F, 0x72, 0x74, 0x4F,  0x6E, 0x00, 0x43, 0x41,  0x53, 0x45, 0x49, 0x4E,  0x53, 0x45, 0x4E, 0x53,
+  0x49, 0x54, 0x49, 0x56,  0x45, 0x00, 0x44, 0x45,  0x53, 0x43, 0x45, 0x4E,  0x44, 0x49, 0x4E, 0x47,
+  0x00, 0x55, 0x4E, 0x49,  0x51, 0x55, 0x45, 0x53,  0x4F, 0x52, 0x54, 0x00,  0x52, 0x45, 0x54, 0x55,
+  0x52, 0x4E, 0x49, 0x4E,  0x44, 0x45, 0x58, 0x45,  0x44, 0x41, 0x52, 0x52,  0x41, 0x59, 0x00, 0x4E,
+  0x55, 0x4D, 0x45, 0x52,  0x49, 0x43, 0x00, 0x65,  0x73, 0x63, 0x61, 0x70,  0x65, 0x00, 0x75, 0x6E,
+  0x65, 0x73, 0x63, 0x61,  0x70, 0x65, 0x00, 0x70,  0x61, 0x72, 0x73, 0x65,  0x49, 0x6E, 0x74, 0x00,
+  0x69, 0x73, 0x4E, 0x61,  0x4E, 0x00, 0x69, 0x73,  0x46, 0x69, 0x6E, 0x69,  0x74, 0x65, 0x00, 0x96,
+  0x13, 0x00, 0x08, 0x00,  0x07, 0x00, 0x00, 0x00,  0x00, 0x07, 0x04, 0x00,  0x00, 0x00, 0x07, 0x02,
+  0x00, 0x00, 0x00, 0x08,  0x01, 0x3D, 0x1D, 0x96,  0x13, 0x00, 0x08, 0x02,  0x07, 0x01, 0x00, 0x00,
   0x00, 0x07, 0x04, 0x00,  0x00, 0x00, 0x07, 0x02,  0x00, 0x00, 0x00, 0x08,  0x01, 0x3D, 0x1D, 0x96,
-  0x13, 0x00, 0x08, 0x02,  0x07, 0x01, 0x00, 0x00,  0x00, 0x07, 0x04, 0x00,  0x00, 0x00, 0x07, 0x02,
-  0x00, 0x00, 0x00, 0x08,  0x01, 0x3D, 0x1D, 0x96,  0x08, 0x00, 0x07, 0x07,  0x00, 0x00, 0x00, 0x02,
-  0x08, 0x03, 0x1C, 0x96,  0x07, 0x00, 0x07, 0x03,  0x00, 0x00, 0x00, 0x08,  0x04, 0x3D, 0x17, 0x96,
-  0x13, 0x00, 0x08, 0x05,  0x07, 0x02, 0x00, 0x00,  0x00, 0x07, 0x6B, 0x00,  0x00, 0x00, 0x07, 0x02,
-  0x00, 0x00, 0x00, 0x08,  0x06, 0x3D, 0x1D, 0x96,  0x09, 0x00, 0x08, 0x08,  0x07, 0x6B, 0x00, 0x00,
-  0x00, 0x08, 0x05, 0x1C,  0x96, 0x02, 0x00, 0x08,  0x07, 0x4E, 0x96, 0x07,  0x00, 0x07, 0x03, 0x00,
-  0x00, 0x00, 0x08, 0x00,  0x3D, 0x17, 0x96, 0x08,  0x00, 0x07, 0x03, 0x00,  0x00, 0x00, 0x02, 0x08,
-  0x05, 0x1C, 0x96, 0x02,  0x00, 0x08, 0x07, 0x4E,  0x96, 0x07, 0x00, 0x07,  0x03, 0x00, 0x00, 0x00,
-  0x08, 0x04, 0x3D, 0x17,  0x96, 0x13, 0x00, 0x08,  0x09, 0x07, 0x02, 0x00,  0x00, 0x00, 0x07, 0x6A,
-  0x00, 0x00, 0x00, 0x07,  0x02, 0x00, 0x00, 0x00,  0x08, 0x06, 0x3D, 0x1D,  0x96, 0x09, 0x00, 0x08,
-  0x08, 0x07, 0x6A, 0x00,  0x00, 0x00, 0x08, 0x09,  0x1C, 0x96, 0x02, 0x00,  0x08, 0x07, 0x4E, 0x96,
-  0x07, 0x00, 0x07, 0x03,  0x00, 0x00, 0x00, 0x08,  0x00, 0x3D, 0x17, 0x96,  0x08, 0x00, 0x07, 0x03,
-  0x00, 0x00, 0x00, 0x02,  0x08, 0x09, 0x1C, 0x96,  0x02, 0x00, 0x08, 0x07,  0x4E, 0x96, 0x07, 0x00,
-  0x07, 0x03, 0x00, 0x00,  0x00, 0x08, 0x04, 0x3D,  0x17, 0x96, 0x02, 0x00,  0x08, 0x09, 0x1C, 0x96,
-  0x04, 0x00, 0x08, 0x0A,  0x08, 0x0A, 0x1C, 0x4F,  0x96, 0x02, 0x00, 0x08,  0x09, 0x1C, 0x96, 0x04,
-  0x00, 0x08, 0x0B, 0x08,  0x0C, 0x1C, 0x4F, 0x96,  0x02, 0x00, 0x08, 0x09,  0x1C, 0x96, 0x04, 0x00,
-  0x08, 0x0D, 0x08, 0x0C,  0x1C, 0x96, 0x05, 0x00,  0x07, 0xFF, 0xFF, 0xFF,  0xFF, 0x0C, 0x4F, 0x96,
-  0x02, 0x00, 0x08, 0x09,  0x1C, 0x96, 0x07, 0x00,  0x08, 0x0E, 0x07, 0x00,  0x00, 0x00, 0x00, 0x4F,
-  0x96, 0x02, 0x00, 0x08,  0x09, 0x1C, 0x96, 0x0B,  0x00, 0x08, 0x0F, 0x06,  0xFF, 0xFF, 0xEF, 0x7F,
-  0xE2, 0xFF, 0xFF, 0xFF,  0x4F, 0x96, 0x08, 0x00,  0x07, 0x07, 0x00, 0x00,  0x00, 0x02, 0x08, 0x09,
-  0x1C, 0x96, 0x07, 0x00,  0x07, 0x03, 0x00, 0x00,  0x00, 0x08, 0x04, 0x3D,  0x17, 0x96, 0x13, 0x00,
-  0x08, 0x10, 0x07, 0x00,  0x00, 0x00, 0x00, 0x07,  0xFB, 0x00, 0x00, 0x00,  0x07, 0x02, 0x00, 0x00,
-  0x00, 0x08, 0x06, 0x3D,  0x1D, 0x96, 0x0E, 0x00,  0x07, 0x01, 0x00, 0x00,  0x00, 0x08, 0x11, 0x07,
-  0xFB, 0x00, 0x00, 0x00,  0x08, 0x10, 0x1C, 0x96,  0x02, 0x00, 0x08, 0x07,  0x4E, 0x96, 0x07, 0x00,
-  0x07, 0x04, 0x00, 0x00,  0x00, 0x08, 0x00, 0x3D,  0x17, 0x96, 0x08, 0x00,  0x07, 0x03, 0x00, 0x00,
-  0x00, 0x02, 0x08, 0x10,  0x1C, 0x96, 0x02, 0x00,  0x08, 0x07, 0x4E, 0x96,  0x07, 0x00, 0x07, 0x03,
-  0x00, 0x00, 0x00, 0x08,  0x04, 0x3D, 0x17, 0x96,  0x02, 0x00, 0x08, 0x10,  0x1C, 0x96, 0x13, 0x00,
-  0x08, 0x12, 0x07, 0x0E,  0x00, 0x00, 0x00, 0x07,  0xFB, 0x00, 0x00, 0x00,  0x07, 0x02, 0x00, 0x00,
-  0x00, 0x08, 0x01, 0x3D,  0x4F, 0x96, 0x08, 0x00,  0x07, 0x03, 0x00, 0x00,  0x00, 0x02, 0x08, 0x10,
-  0x1C, 0x96, 0x07, 0x00,  0x07, 0x03, 0x00, 0x00,  0x00, 0x08, 0x04, 0x3D,  0x17, 0x96, 0x5F, 0x00,
-  0x08, 0x13, 0x08, 0x14,  0x06, 0x0A, 0xBF, 0x05,  0x40, 0x74, 0x57, 0x14,  0x8B, 0x08, 0x15, 0x06,
-  0xB1, 0x6B, 0x02, 0x40,  0x1F, 0x55, 0xB5, 0xBB,  0x08, 0x16, 0x06, 0x42,  0x2E, 0xE6, 0x3F, 0xEC,
-  0x39, 0xFA, 0xFE, 0x08,  0x17, 0x06, 0x7B, 0xCB,  0xDB, 0x3F, 0x11, 0xE5,  0x26, 0x15, 0x08, 0x18,
-  0x06, 0x47, 0x15, 0xF7,  0x3F, 0xEF, 0x82, 0x2B,  0x65, 0x08, 0x19, 0x06,  0xFB, 0x21, 0x09, 0x40,
-  0x11, 0x2D, 0x44, 0x54,  0x08, 0x1A, 0x06, 0x9E,  0xA0, 0xE6, 0x3F, 0xD1,  0x3B, 0x7F, 0x66, 0x08,
-  0x1B, 0x06, 0x9E, 0xA0,  0xF6, 0x3F, 0xE3, 0x3B,  0x7F, 0x66, 0x07, 0x08,  0x00, 0x00, 0x00, 0x43,
-  0x1D, 0x96, 0x09, 0x00,  0x08, 0x1C, 0x07, 0xC8,  0x00, 0x00, 0x00, 0x08,  0x13, 0x1C, 0x96, 0x07,
-  0x00, 0x07, 0x03, 0x00,  0x00, 0x00, 0x08, 0x00,  0x3D, 0x17, 0x96, 0x08,  0x00, 0x07, 0x07, 0x00,
-  0x00, 0x00, 0x02, 0x08,  0x13, 0x1C, 0x96, 0x07,  0x00, 0x07, 0x03, 0x00,  0x00, 0x00, 0x08, 0x04,
-  0x3D, 0x17, 0x96, 0x13,  0x00, 0x08, 0x1D, 0x07,  0x00, 0x01, 0x00, 0x00,  0x07, 0x67, 0x00, 0x00,
-  0x00, 0x07, 0x02, 0x00,  0x00, 0x00, 0x08, 0x06,  0x3D, 0x1D, 0x96, 0x09,  0x00, 0x08, 0x1E, 0x07,
-  0x67, 0x00, 0x00, 0x00,  0x08, 0x1D, 0x1C, 0x96,  0x02, 0x00, 0x08, 0x07,  0x4E, 0x96, 0x07, 0x00,
-  0x07, 0x03, 0x00, 0x00,  0x00, 0x08, 0x00, 0x3D,  0x17, 0x96, 0x0E, 0x00,  0x07, 0x80, 0x00, 0x00,
-  0x00, 0x08, 0x1F, 0x07,  0x67, 0x00, 0x00, 0x00,  0x08, 0x1D, 0x1C, 0x96,  0x02, 0x00, 0x08, 0x07,
-  0x4E, 0x96, 0x07, 0x00,  0x07, 0x04, 0x00, 0x00,  0x00, 0x08, 0x00, 0x3D,  0x17, 0x96, 0x02, 0x00,
-  0x08, 0x1D, 0x1C, 0x96,  0x02, 0x00, 0x08, 0x07,  0x4E, 0x96, 0x04, 0x00,  0x08, 0x20, 0x08, 0x1D,
-  0x1C, 0x96, 0x02, 0x00,  0x08, 0x07, 0x4E, 0x96,  0x02, 0x00, 0x08, 0x21,  0x4E, 0x4F, 0x96, 0x02,
-  0x00, 0x08, 0x1D, 0x1C,  0x96, 0x13, 0x00, 0x08,  0x22, 0x07, 0x01, 0x01,  0x00, 0x00, 0x07, 0x67,
-  0x00, 0x00, 0x00, 0x07,  0x02, 0x00, 0x00, 0x00,  0x08, 0x01, 0x3D, 0x4F,  0x96, 0x08, 0x00, 0x07,
-  0x03, 0x00, 0x00, 0x00,  0x02, 0x08, 0x1D, 0x1C,  0x96, 0x02, 0x00, 0x08,  0x07, 0x4E, 0x96, 0x07,
-  0x00, 0x07, 0x03, 0x00,  0x00, 0x00, 0x08, 0x04,  0x3D, 0x17, 0x96, 0x08,  0x00, 0x07, 0x07, 0x00,
-  0x00, 0x00, 0x02, 0x08,  0x1D, 0x1C, 0x96, 0x07,  0x00, 0x07, 0x03, 0x00,  0x00, 0x00, 0x08, 0x04,
-  0x3D, 0x17, 0x96, 0x13,  0x00, 0x08, 0x23, 0x07,  0x00, 0x00, 0x00, 0x00,  0x07, 0xFC, 0x00, 0x00,
-  0x00, 0x07, 0x02, 0x00,  0x00, 0x00, 0x08, 0x06,  0x3D, 0x1D, 0x96, 0x0E,  0x00, 0x07, 0x01, 0x00,
-  0x00, 0x00, 0x08, 0x24,  0x07, 0xFC, 0x00, 0x00,  0x00, 0x08, 0x23, 0x1C,  0x96, 0x02, 0x00, 0x08,
-  0x07, 0x4E, 0x96, 0x07,  0x00, 0x07, 0x04, 0x00,  0x00, 0x00, 0x08, 0x00,  0x3D, 0x17, 0x96, 0x08,
-  0x00, 0x07, 0x03, 0x00,  0x00, 0x00, 0x02, 0x08,  0x23, 0x1C, 0x96, 0x02,  0x00, 0x08, 0x07, 0x4E,
-  0x96, 0x07, 0x00, 0x07,  0x03, 0x00, 0x00, 0x00,  0x08, 0x04, 0x3D, 0x17,  0x96, 0x02, 0x00, 0x08,
-  0x23, 0x1C, 0x96, 0x07,  0x00, 0x08, 0x25, 0x07,  0x01, 0x00, 0x00, 0x00,  0x4F, 0x96, 0x02, 0x00,
-  0x08, 0x23, 0x1C, 0x96,  0x07, 0x00, 0x08, 0x26,  0x07, 0x02, 0x00, 0x00,  0x00, 0x4F, 0x96, 0x02,
-  0x00, 0x08, 0x23, 0x1C,  0x96, 0x07, 0x00, 0x08,  0x27, 0x07, 0x04, 0x00,  0x00, 0x00, 0x4F, 0x96,
-  0x02, 0x00, 0x08, 0x23,  0x1C, 0x96, 0x07, 0x00,  0x08, 0x28, 0x07, 0x08,  0x00, 0x00, 0x00, 0x4F,
-  0x96, 0x02, 0x00, 0x08,  0x23, 0x1C, 0x96, 0x07,  0x00, 0x08, 0x29, 0x07,  0x10, 0x00, 0x00, 0x00,
-  0x4F, 0x96, 0x13, 0x00,  0x08, 0x2A, 0x07, 0x00,  0x00, 0x00, 0x00, 0x07,  0x64, 0x00, 0x00, 0x00,
-  0x07, 0x02, 0x00, 0x00,  0x00, 0x08, 0x01, 0x3D,  0x1D, 0x96, 0x13, 0x00,  0x08, 0x2B, 0x07, 0x01,
-  0x00, 0x00, 0x00, 0x07,  0x64, 0x00, 0x00, 0x00,  0x07, 0x02, 0x00, 0x00,  0x00, 0x08, 0x01, 0x3D,
-  0x1D, 0x96, 0x13, 0x00,  0x08, 0x2C, 0x07, 0x02,  0x00, 0x00, 0x00, 0x07,  0x64, 0x00, 0x00, 0x00,
-  0x07, 0x02, 0x00, 0x00,  0x00, 0x08, 0x01, 0x3D,  0x1D, 0x96, 0x13, 0x00,  0x08, 0x2D, 0x07, 0x12,
-  0x00, 0x00, 0x00, 0x07,  0xC8, 0x00, 0x00, 0x00,  0x07, 0x02, 0x00, 0x00,  0x00, 0x08, 0x01, 0x3D,
-  0x1D, 0x96, 0x13, 0x00,  0x08, 0x2E, 0x07, 0x13,  0x00, 0x00, 0x00, 0x07,  0xC8, 0x00, 0x00, 0x00,
-  0x07, 0x02, 0x00, 0x00,  0x00, 0x08, 0x01, 0x3D,  0x1D, 0x96, 0x0D, 0x00,  0x07, 0x06, 0x00, 0x00,
-  0x00, 0x07, 0x01, 0x00,  0x00, 0x00, 0x02, 0x08,  0x2F, 0x1C, 0x96, 0x07,  0x00, 0x07, 0x04, 0x00,
-  0x00, 0x00, 0x08, 0x04,  0x3D, 0x17, 0x00
+  0x02, 0x00, 0x08, 0x03,  0x1C, 0x96, 0x02, 0x00,  0x08, 0x04, 0x4E, 0x96,  0x02, 0x00, 0x08, 0x05,
+  0x9B, 0x05, 0x00, 0x00,  0x00, 0x00, 0x12, 0x00,  0x96, 0x07, 0x00, 0x07,  0x00, 0x00, 0x00, 0x00,
+  0x08, 0x06, 0x1C, 0x96,  0x02, 0x00, 0x08, 0x07,  0x52, 0x3E, 0x4F, 0x96,  0x08, 0x00, 0x07, 0x03,
+  0x00, 0x00, 0x00, 0x02,  0x08, 0x03, 0x1C, 0x96,  0x02, 0x00, 0x08, 0x04,  0x4E, 0x96, 0x07, 0x00,
+  0x07, 0x03, 0x00, 0x00,  0x00, 0x08, 0x08, 0x3D,  0x17, 0x96, 0x08, 0x00,  0x07, 0x07, 0x00, 0x00,
+  0x00, 0x02, 0x08, 0x03,  0x1C, 0x96, 0x07, 0x00,  0x07, 0x03, 0x00, 0x00,  0x00, 0x08, 0x08, 0x3D,
+  0x17, 0x96, 0x13, 0x00,  0x08, 0x09, 0x07, 0x02,  0x00, 0x00, 0x00, 0x07,  0x6B, 0x00, 0x00, 0x00,
+  0x07, 0x02, 0x00, 0x00,  0x00, 0x08, 0x0A, 0x3D,  0x1D, 0x96, 0x09, 0x00,  0x08, 0x0B, 0x07, 0x6B,
+  0x00, 0x00, 0x00, 0x08,  0x09, 0x1C, 0x96, 0x02,  0x00, 0x08, 0x04, 0x4E,  0x96, 0x07, 0x00, 0x07,
+  0x03, 0x00, 0x00, 0x00,  0x08, 0x00, 0x3D, 0x17,  0x96, 0x08, 0x00, 0x07,  0x03, 0x00, 0x00, 0x00,
+  0x02, 0x08, 0x09, 0x1C,  0x96, 0x02, 0x00, 0x08,  0x04, 0x4E, 0x96, 0x07,  0x00, 0x07, 0x03, 0x00,
+  0x00, 0x00, 0x08, 0x08,  0x3D, 0x17, 0x96, 0x13,  0x00, 0x08, 0x0C, 0x07,  0x02, 0x00, 0x00, 0x00,
+  0x07, 0x6A, 0x00, 0x00,  0x00, 0x07, 0x02, 0x00,  0x00, 0x00, 0x08, 0x0A,  0x3D, 0x1D, 0x96, 0x09,
+  0x00, 0x08, 0x0B, 0x07,  0x6A, 0x00, 0x00, 0x00,  0x08, 0x0C, 0x1C, 0x96,  0x02, 0x00, 0x08, 0x04,
+  0x4E, 0x96, 0x07, 0x00,  0x07, 0x03, 0x00, 0x00,  0x00, 0x08, 0x00, 0x3D,  0x17, 0x96, 0x08, 0x00,
+  0x07, 0x03, 0x00, 0x00,  0x00, 0x02, 0x08, 0x0C,  0x1C, 0x96, 0x02, 0x00,  0x08, 0x04, 0x4E, 0x96,
+  0x07, 0x00, 0x07, 0x03,  0x00, 0x00, 0x00, 0x08,  0x08, 0x3D, 0x17, 0x96,  0x02, 0x00, 0x08, 0x0C,
+  0x1C, 0x96, 0x04, 0x00,  0x08, 0x0D, 0x08, 0x0D,  0x1C, 0x4F, 0x96, 0x02,  0x00, 0x08, 0x0C, 0x1C,
+  0x96, 0x04, 0x00, 0x08,  0x0E, 0x08, 0x0F, 0x1C,  0x4F, 0x96, 0x02, 0x00,  0x08, 0x0C, 0x1C, 0x96,
+  0x04, 0x00, 0x08, 0x10,  0x08, 0x0F, 0x1C, 0x96,  0x05, 0x00, 0x07, 0xFF,  0xFF, 0xFF, 0xFF, 0x0C,
+  0x4F, 0x96, 0x02, 0x00,  0x08, 0x0C, 0x1C, 0x96,  0x07, 0x00, 0x08, 0x11,  0x07, 0x00, 0x00, 0x00,
+  0x00, 0x4F, 0x96, 0x02,  0x00, 0x08, 0x0C, 0x1C,  0x96, 0x0B, 0x00, 0x08,  0x12, 0x06, 0xFF, 0xFF,
+  0xEF, 0x7F, 0xE2, 0xFF,  0xFF, 0xFF, 0x4F, 0x96,  0x08, 0x00, 0x07, 0x07,  0x00, 0x00, 0x00, 0x02,
+  0x08, 0x0C, 0x1C, 0x96,  0x07, 0x00, 0x07, 0x03,  0x00, 0x00, 0x00, 0x08,  0x08, 0x3D, 0x17, 0x96,
+  0x13, 0x00, 0x08, 0x13,  0x07, 0x00, 0x00, 0x00,  0x00, 0x07, 0xFB, 0x00,  0x00, 0x00, 0x07, 0x02,
+  0x00, 0x00, 0x00, 0x08,  0x0A, 0x3D, 0x1D, 0x96,  0x0E, 0x00, 0x07, 0x01,  0x00, 0x00, 0x00, 0x08,
+  0x14, 0x07, 0xFB, 0x00,  0x00, 0x00, 0x08, 0x13,  0x1C, 0x96, 0x02, 0x00,  0x08, 0x04, 0x4E, 0x96,
+  0x07, 0x00, 0x07, 0x04,  0x00, 0x00, 0x00, 0x08,  0x00, 0x3D, 0x17, 0x96,  0x08, 0x00, 0x07, 0x03,
+  0x00, 0x00, 0x00, 0x02,  0x08, 0x13, 0x1C, 0x96,  0x02, 0x00, 0x08, 0x04,  0x4E, 0x96, 0x07, 0x00,
+  0x07, 0x03, 0x00, 0x00,  0x00, 0x08, 0x08, 0x3D,  0x17, 0x96, 0x02, 0x00,  0x08, 0x13, 0x1C, 0x96,
+  0x13, 0x00, 0x08, 0x15,  0x07, 0x0E, 0x00, 0x00,  0x00, 0x07, 0xFB, 0x00,  0x00, 0x00, 0x07, 0x02,
+  0x00, 0x00, 0x00, 0x08,  0x01, 0x3D, 0x4F, 0x96,  0x08, 0x00, 0x07, 0x03,  0x00, 0x00, 0x00, 0x02,
+  0x08, 0x13, 0x1C, 0x96,  0x07, 0x00, 0x07, 0x03,  0x00, 0x00, 0x00, 0x08,  0x08, 0x3D, 0x17, 0x96,
+  0x5F, 0x00, 0x08, 0x16,  0x08, 0x17, 0x06, 0x0A,  0xBF, 0x05, 0x40, 0x74,  0x57, 0x14, 0x8B, 0x08,
+  0x18, 0x06, 0xB1, 0x6B,  0x02, 0x40, 0x1F, 0x55,  0xB5, 0xBB, 0x08, 0x19,  0x06, 0x42, 0x2E, 0xE6,
+  0x3F, 0xEC, 0x39, 0xFA,  0xFE, 0x08, 0x1A, 0x06,  0x7B, 0xCB, 0xDB, 0x3F,  0x11, 0xE5, 0x26, 0x15,
+  0x08, 0x1B, 0x06, 0x47,  0x15, 0xF7, 0x3F, 0xEF,  0x82, 0x2B, 0x65, 0x08,  0x1C, 0x06, 0xFB, 0x21,
+  0x09, 0x40, 0x11, 0x2D,  0x44, 0x54, 0x08, 0x1D,  0x06, 0x9E, 0xA0, 0xE6,  0x3F, 0xD1, 0x3B, 0x7F,
+  0x66, 0x08, 0x1E, 0x06,  0x9E, 0xA0, 0xF6, 0x3F,  0xE3, 0x3B, 0x7F, 0x66,  0x07, 0x08, 0x00, 0x00,
+  0x00, 0x43, 0x1D, 0x96,  0x09, 0x00, 0x08, 0x1F,  0x07, 0xC8, 0x00, 0x00,  0x00, 0x08, 0x16, 0x1C,
+  0x96, 0x07, 0x00, 0x07,  0x03, 0x00, 0x00, 0x00,  0x08, 0x00, 0x3D, 0x17,  0x96, 0x08, 0x00, 0x07,
+  0x07, 0x00, 0x00, 0x00,  0x02, 0x08, 0x16, 0x1C,  0x96, 0x07, 0x00, 0x07,  0x03, 0x00, 0x00, 0x00,
+  0x08, 0x08, 0x3D, 0x17,  0x96, 0x13, 0x00, 0x08,  0x20, 0x07, 0x00, 0x01,  0x00, 0x00, 0x07, 0x67,
+  0x00, 0x00, 0x00, 0x07,  0x02, 0x00, 0x00, 0x00,  0x08, 0x0A, 0x3D, 0x1D,  0x96, 0x09, 0x00, 0x08,
+  0x21, 0x07, 0x67, 0x00,  0x00, 0x00, 0x08, 0x20,  0x1C, 0x96, 0x02, 0x00,  0x08, 0x04, 0x4E, 0x96,
+  0x07, 0x00, 0x07, 0x03,  0x00, 0x00, 0x00, 0x08,  0x00, 0x3D, 0x17, 0x96,  0x0E, 0x00, 0x07, 0x80,
+  0x00, 0x00, 0x00, 0x08,  0x22, 0x07, 0x67, 0x00,  0x00, 0x00, 0x08, 0x20,  0x1C, 0x96, 0x02, 0x00,
+  0x08, 0x04, 0x4E, 0x96,  0x07, 0x00, 0x07, 0x04,  0x00, 0x00, 0x00, 0x08,  0x00, 0x3D, 0x17, 0x96,
+  0x02, 0x00, 0x08, 0x20,  0x1C, 0x96, 0x02, 0x00,  0x08, 0x04, 0x4E, 0x96,  0x04, 0x00, 0x08, 0x23,
+  0x08, 0x20, 0x1C, 0x96,  0x02, 0x00, 0x08, 0x04,  0x4E, 0x96, 0x02, 0x00,  0x08, 0x24, 0x4E, 0x4F,
+  0x96, 0x02, 0x00, 0x08,  0x20, 0x1C, 0x96, 0x13,  0x00, 0x08, 0x25, 0x07,  0x01, 0x01, 0x00, 0x00,
+  0x07, 0x67, 0x00, 0x00,  0x00, 0x07, 0x02, 0x00,  0x00, 0x00, 0x08, 0x01,  0x3D, 0x4F, 0x96, 0x08,
+  0x00, 0x07, 0x03, 0x00,  0x00, 0x00, 0x02, 0x08,  0x20, 0x1C, 0x96, 0x02,  0x00, 0x08, 0x04, 0x4E,
+  0x96, 0x07, 0x00, 0x07,  0x03, 0x00, 0x00, 0x00,  0x08, 0x08, 0x3D, 0x17,  0x96, 0x08, 0x00, 0x07,
+  0x07, 0x00, 0x00, 0x00,  0x02, 0x08, 0x20, 0x1C,  0x96, 0x07, 0x00, 0x07,  0x03, 0x00, 0x00, 0x00,
+  0x08, 0x08, 0x3D, 0x17,  0x96, 0x13, 0x00, 0x08,  0x26, 0x07, 0x00, 0x00,  0x00, 0x00, 0x07, 0xFC,
+  0x00, 0x00, 0x00, 0x07,  0x02, 0x00, 0x00, 0x00,  0x08, 0x0A, 0x3D, 0x1D,  0x96, 0x0E, 0x00, 0x07,
+  0x01, 0x00, 0x00, 0x00,  0x08, 0x27, 0x07, 0xFC,  0x00, 0x00, 0x00, 0x08,  0x26, 0x1C, 0x96, 0x02,
+  0x00, 0x08, 0x04, 0x4E,  0x96, 0x07, 0x00, 0x07,  0x04, 0x00, 0x00, 0x00,  0x08, 0x00, 0x3D, 0x17,
+  0x96, 0x08, 0x00, 0x07,  0x03, 0x00, 0x00, 0x00,  0x02, 0x08, 0x26, 0x1C,  0x96, 0x02, 0x00, 0x08,
+  0x04, 0x4E, 0x96, 0x07,  0x00, 0x07, 0x03, 0x00,  0x00, 0x00, 0x08, 0x08,  0x3D, 0x17, 0x96, 0x02,
+  0x00, 0x08, 0x26, 0x1C,  0x96, 0x07, 0x00, 0x08,  0x28, 0x07, 0x01, 0x00,  0x00, 0x00, 0x4F, 0x96,
+  0x02, 0x00, 0x08, 0x26,  0x1C, 0x96, 0x07, 0x00,  0x08, 0x29, 0x07, 0x02,  0x00, 0x00, 0x00, 0x4F,
+  0x96, 0x02, 0x00, 0x08,  0x26, 0x1C, 0x96, 0x07,  0x00, 0x08, 0x2A, 0x07,  0x04, 0x00, 0x00, 0x00,
+  0x4F, 0x96, 0x02, 0x00,  0x08, 0x26, 0x1C, 0x96,  0x07, 0x00, 0x08, 0x2B,  0x07, 0x08, 0x00, 0x00,
+  0x00, 0x4F, 0x96, 0x02,  0x00, 0x08, 0x26, 0x1C,  0x96, 0x07, 0x00, 0x08,  0x2C, 0x07, 0x10, 0x00,
+  0x00, 0x00, 0x4F, 0x96,  0x13, 0x00, 0x08, 0x2D,  0x07, 0x00, 0x00, 0x00,  0x00, 0x07, 0x64, 0x00,
+  0x00, 0x00, 0x07, 0x02,  0x00, 0x00, 0x00, 0x08,  0x01, 0x3D, 0x1D, 0x96,  0x13, 0x00, 0x08, 0x2E,
+  0x07, 0x01, 0x00, 0x00,  0x00, 0x07, 0x64, 0x00,  0x00, 0x00, 0x07, 0x02,  0x00, 0x00, 0x00, 0x08,
+  0x01, 0x3D, 0x1D, 0x96,  0x13, 0x00, 0x08, 0x2F,  0x07, 0x02, 0x00, 0x00,  0x00, 0x07, 0x64, 0x00,
+  0x00, 0x00, 0x07, 0x02,  0x00, 0x00, 0x00, 0x08,  0x01, 0x3D, 0x1D, 0x96,  0x13, 0x00, 0x08, 0x30,
+  0x07, 0x12, 0x00, 0x00,  0x00, 0x07, 0xC8, 0x00,  0x00, 0x00, 0x07, 0x02,  0x00, 0x00, 0x00, 0x08,
+  0x01, 0x3D, 0x1D, 0x96,  0x13, 0x00, 0x08, 0x31,  0x07, 0x13, 0x00, 0x00,  0x00, 0x07, 0xC8, 0x00,
+  0x00, 0x00, 0x07, 0x02,  0x00, 0x00, 0x00, 0x08,  0x01, 0x3D, 0x1D, 0x96,  0x0D, 0x00, 0x07, 0x06,
+  0x00, 0x00, 0x00, 0x07,  0x01, 0x00, 0x00, 0x00,  0x02, 0x08, 0x06, 0x1C,  0x96, 0x07, 0x00, 0x07,
+  0x04, 0x00, 0x00, 0x00,  0x08, 0x08, 0x3D, 0x17,  0x00
 };
 
diff-tree 3a69becf53764c298412ab797d2bb5b63d17bca3 (from 4328989d1427e8cf2e51a80d3b30ffb4335808b6)
Author: Pekka Lampila <pekka.lampila at iki.fi>
Date:   Tue Sep 11 14:37:13 2007 +0300

    Recompile function-properties test with trace_properties.as changes

diff --git a/test/trace/function-properties-5.swf b/test/trace/function-properties-5.swf
index de06263..f556e5c 100644
Binary files a/test/trace/function-properties-5.swf and b/test/trace/function-properties-5.swf differ
diff --git a/test/trace/function-properties-6.swf b/test/trace/function-properties-6.swf
index baa9301..14fd223 100644
Binary files a/test/trace/function-properties-6.swf and b/test/trace/function-properties-6.swf differ
diff --git a/test/trace/function-properties-6.swf.trace b/test/trace/function-properties-6.swf.trace
index 9a8937f..c68f0ca 100644
--- a/test/trace/function-properties-6.swf.trace
+++ b/test/trace/function-properties-6.swf.trace
@@ -1,11 +1,19 @@
-_global.Function = _global.Object.constructor
-  __proto__ (hp) = _global.Object.__proto__
-  constructor (hp) = _global.Object.constructor
-  prototype (hp) = _global.Object.__proto__
+_global.Function = function
+  __proto__ (hp) = _global.Function.prototype
+  constructor (hp) = _global.Function
+  prototype (hp) = object
+    __proto__ (hp) = _global.Object.prototype
+    apply (hp) = function
+      __proto__ (hp) = _global.Function.prototype
+      constructor (hp) = _global.Function
+    call (hp) = function
+      __proto__ (hp) = _global.Function.prototype
+      constructor (hp) = _global.Function
+    constructor (hp) = _global.Function
 local.a = object
   myFunction = function
-    __proto__ (hp) = _global.Object.__proto__
-    constructor (hp) = _global.Object.constructor
+    __proto__ (hp) = _global.Function.prototype
+    constructor (hp) = _global.Function
     prototype (hp) = object
       __proto__ (hp) = _global.Object.prototype
       constructor (hp) = local.a.myFunction
diff --git a/test/trace/function-properties-7.swf b/test/trace/function-properties-7.swf
index 14d01da..ef22be7 100644
Binary files a/test/trace/function-properties-7.swf and b/test/trace/function-properties-7.swf differ
diff --git a/test/trace/function-properties-7.swf.trace b/test/trace/function-properties-7.swf.trace
index 9a8937f..c68f0ca 100644
--- a/test/trace/function-properties-7.swf.trace
+++ b/test/trace/function-properties-7.swf.trace
@@ -1,11 +1,19 @@
-_global.Function = _global.Object.constructor
-  __proto__ (hp) = _global.Object.__proto__
-  constructor (hp) = _global.Object.constructor
-  prototype (hp) = _global.Object.__proto__
+_global.Function = function
+  __proto__ (hp) = _global.Function.prototype
+  constructor (hp) = _global.Function
+  prototype (hp) = object
+    __proto__ (hp) = _global.Object.prototype
+    apply (hp) = function
+      __proto__ (hp) = _global.Function.prototype
+      constructor (hp) = _global.Function
+    call (hp) = function
+      __proto__ (hp) = _global.Function.prototype
+      constructor (hp) = _global.Function
+    constructor (hp) = _global.Function
 local.a = object
   myFunction = function
-    __proto__ (hp) = _global.Object.__proto__
-    constructor (hp) = _global.Object.constructor
+    __proto__ (hp) = _global.Function.prototype
+    constructor (hp) = _global.Function
     prototype (hp) = object
       __proto__ (hp) = _global.Object.prototype
       constructor (hp) = local.a.myFunction
diff-tree 4328989d1427e8cf2e51a80d3b30ffb4335808b6 (from 476005699d9e4fc7e2585f0908810eab49f16c52)
Author: Pekka Lampila <pekka.lampila at iki.fi>
Date:   Tue Sep 11 14:36:22 2007 +0300

    Add Function.prototype.constructor property

diff --git a/libswfdec/swfdec_as_function.c b/libswfdec/swfdec_as_function.c
index 27a0121..c8f4fbe 100644
--- a/libswfdec/swfdec_as_function.c
+++ b/libswfdec/swfdec_as_function.c
@@ -247,6 +247,9 @@ swfdec_as_function_init_context (SwfdecA
 	&val, SWFDEC_AS_VARIABLE_HIDDEN | SWFDEC_AS_VARIABLE_PERMANENT);
     swfdec_as_object_set_variable_and_flags (function, SWFDEC_AS_STR_prototype,
 	&val, SWFDEC_AS_VARIABLE_HIDDEN | SWFDEC_AS_VARIABLE_PERMANENT);
+    SWFDEC_AS_VALUE_SET_OBJECT (&val, function);
+    swfdec_as_object_set_variable_and_flags (proto, SWFDEC_AS_STR_constructor,
+	&val, SWFDEC_AS_VARIABLE_HIDDEN | SWFDEC_AS_VARIABLE_PERMANENT);
     /* prototype functions */
     swfdec_as_object_add_function (proto, SWFDEC_AS_STR_call,
 	SWFDEC_TYPE_AS_FUNCTION, swfdec_as_function_do_call, 0);
diff-tree 476005699d9e4fc7e2585f0908810eab49f16c52 (from 2317fb49f1f8060fabbb307e802a4a5b058b0430)
Author: Pekka Lampila <pekka.lampila at iki.fi>
Date:   Tue Sep 11 14:28:09 2007 +0300

    Add a test for Function's apply method

diff --git a/test/trace/Makefile.am b/test/trace/Makefile.am
index 5f360cc..c0a12e0 100644
--- a/test/trace/Makefile.am
+++ b/test/trace/Makefile.am
@@ -489,13 +489,13 @@ EXTRA_DIST = \
 	function1.swf.trace \
 	function2.swf \
 	function2.swf.trace \
-	function-properties.as \
-	function-properties-5.swf \
-	function-properties-5.swf.trace \
-	function-properties-6.swf \
-	function-properties-6.swf.trace \
-	function-properties-7.swf \
-	function-properties-7.swf.trace \
+	function-apply.as \
+	function-apply-5.swf \
+	function-apply-5.swf.trace \
+	function-apply-6.swf \
+	function-apply-6.swf.trace \
+	function-apply-7.swf \
+	function-apply-7.swf.trace \
 	function-prototype-chain.swf \
 	function-prototype-chain.swf.trace \
 	function-scope.as \
diff --git a/test/trace/function-apply-5.swf b/test/trace/function-apply-5.swf
new file mode 100644
index 0000000..e478c90
Binary files /dev/null and b/test/trace/function-apply-5.swf differ
diff --git a/test/trace/function-apply-5.swf.trace b/test/trace/function-apply-5.swf.trace
new file mode 100644
index 0000000..e35f023
--- /dev/null
+++ b/test/trace/function-apply-5.swf.trace
@@ -0,0 +1,160 @@
+valueOf called
+toString called
+toString called with 
+valueOf called with 
+0: valueOf!
+1: valueOf!
+2: valueOf!
+3: valueOf!
+4: valueOf!
+5: valueOf!
+6: valueOf!
+7: valueOf!
+8: valueOf!
+9: valueOf!
+10: valueOf!
+11: valueOf!
+12: valueOf!
+13: valueOf!
+14: valueOf!
+15: valueOf!
+16: valueOf!
+17: valueOf!
+18: valueOf!
+19: valueOf!
+20: valueOf!
+21: valueOf!
+21: toString!
+22: valueOf!
+23: valueOf!
+23: toString!
+24: valueOf!
+24: toString!
+25: valueOf!
+25: toString!
+26: valueOf!
+26: toString!
+Testing: (no arguments)
+undefined
+Testing: a
+undefined
+Testing: a, [1, 2, 3]
+undefined
+Testing: a, [1, 2, 3], [4, 5]
+undefined
+Testing: a, 1, [2, 3]
+undefined
+Testing: a, 1, 2, 3
+undefined
+Testing: a, fake_array
+undefined
+Testing: b, [1, 2, 3]
+undefined
+Testing: (0)  (undefined), [1, 2, 3]
+undefined
+Testing: (1) null (null), [1, 2, 3]
+undefined
+Testing: (2) true (boolean), [1, 2, 3]
+undefined
+Testing: (3) false (boolean), [1, 2, 3]
+undefined
+Testing: (4) 0 (number), [1, 2, 3]
+undefined
+Testing: (5) 1 (number), [1, 2, 3]
+undefined
+Testing: (6) 0.5 (number), [1, 2, 3]
+undefined
+Testing: (7) -1 (number), [1, 2, 3]
+undefined
+Testing: (8) -0.5 (number), [1, 2, 3]
+undefined
+Testing: (9) Infinity (number), [1, 2, 3]
+undefined
+Testing: (10) -Infinity (number), [1, 2, 3]
+undefined
+Testing: (11) NaN (number), [1, 2, 3]
+undefined
+Testing: (12)  (string), [1, 2, 3]
+undefined
+Testing: (13) 0 (string), [1, 2, 3]
+undefined
+Testing: (14) -0 (string), [1, 2, 3]
+undefined
+Testing: (15) 0.0 (string), [1, 2, 3]
+undefined
+Testing: (16) 1 (string), [1, 2, 3]
+undefined
+Testing: (17) Hello World! (string), [1, 2, 3]
+undefined
+Testing: (18) true (string), [1, 2, 3]
+undefined
+Testing: (19) _level0 (string), [1, 2, 3]
+undefined
+Testing: (20) _level0 (movieclip), [1, 2, 3]
+undefined
+Testing: (21) [object Object] (object), [1, 2, 3]
+undefined
+Testing: (22)  (undefined), [1, 2, 3]
+undefined
+Testing: (23) [type Object] (object), [1, 2, 3]
+undefined
+Testing: (24) [type Object] (object), [1, 2, 3]
+undefined
+Testing: (25) [object Object] (object), [1, 2, 3]
+undefined
+Testing: (26)  (object), [1, 2, 3]
+undefined
+Testing: (27)  (object), [1, 2, 3]
+undefined
+Testing: (28) null (object), [1, 2, 3]
+undefined
+Testing: (29) true (object), [1, 2, 3]
+undefined
+Testing: (30) false (object), [1, 2, 3]
+undefined
+Testing: (31) 0 (object), [1, 2, 3]
+undefined
+Testing: (32) 1 (object), [1, 2, 3]
+undefined
+Testing: (33) 0.5 (object), [1, 2, 3]
+undefined
+Testing: (34) -1 (object), [1, 2, 3]
+undefined
+Testing: (35) -0.5 (object), [1, 2, 3]
+undefined
+Testing: (36) Infinity (object), [1, 2, 3]
+undefined
+Testing: (37) -Infinity (object), [1, 2, 3]
+undefined
+Testing: (38) NaN (object), [1, 2, 3]
+undefined
+Testing: (39)  (object), [1, 2, 3]
+undefined
+Testing: (40) 0 (object), [1, 2, 3]
+undefined
+Testing: (41) -0 (object), [1, 2, 3]
+undefined
+Testing: (42) 0.0 (object), [1, 2, 3]
+undefined
+Testing: (43) 1 (object), [1, 2, 3]
+undefined
+Testing: (44) Hello World! (object), [1, 2, 3]
+undefined
+Testing: (45) true (object), [1, 2, 3]
+undefined
+Testing: (46) _level0 (object), [1, 2, 3]
+undefined
+Testing: (47) _level0 (object), [1, 2, 3]
+undefined
+Testing: (48) [type Object] (object), [1, 2, 3]
+undefined
+Testing: (49)  (object), [1, 2, 3]
+undefined
+Testing: (50) [type Object] (object), [1, 2, 3]
+undefined
+Testing: (51) [type Object] (object), [1, 2, 3]
+undefined
+Testing: (52) [type Object] (object), [1, 2, 3]
+undefined
+Testing: (53) [type Object] (object), [1, 2, 3]
+undefined
diff --git a/test/trace/function-apply-6.swf b/test/trace/function-apply-6.swf
new file mode 100644
index 0000000..d692744
Binary files /dev/null and b/test/trace/function-apply-6.swf differ
diff --git a/test/trace/function-apply-6.swf.trace b/test/trace/function-apply-6.swf.trace
new file mode 100644
index 0000000..8e977bb
--- /dev/null
+++ b/test/trace/function-apply-6.swf.trace
@@ -0,0 +1,194 @@
+valueOf called
+toString called
+toString called with 
+valueOf called with 
+0: valueOf!
+1: valueOf!
+2: valueOf!
+3: valueOf!
+4: valueOf!
+5: valueOf!
+6: valueOf!
+7: valueOf!
+8: valueOf!
+9: valueOf!
+10: valueOf!
+11: valueOf!
+12: valueOf!
+13: valueOf!
+14: valueOf!
+15: valueOf!
+16: valueOf!
+17: valueOf!
+18: valueOf!
+19: valueOf!
+20: valueOf!
+21: valueOf!
+21: toString!
+22: valueOf!
+22: toString!
+23: valueOf!
+23: toString!
+24: valueOf!
+24: toString!
+25: valueOf!
+25: toString!
+26: valueOf!
+26: toString!
+Testing: (no arguments)
+this: 
+arguments: 0: 
+1
+Testing: a
+this: a
+arguments: 0: 
+2
+Testing: a, [1, 2, 3]
+this: a
+arguments: 3: 1,2,3
+3
+Testing: a, [1, 2, 3], [4, 5]
+this: a
+arguments: 3: 1,2,3
+4
+Testing: a, 1, [2, 3]
+this: a
+arguments: 0: 
+5
+Testing: a, 1, 2, 3
+this: a
+arguments: 0: 
+6
+Testing: a, fake_array
+this: a
+arguments: 3: 1,2,3
+7
+Testing: b, [1, 2, 3]
+this: b
+arguments: 3: 1,2,3
+8
+Testing: (0)  (undefined), [1, 2, 3]
+this: 
+arguments: 3: 1,2,3
+1
+Testing: (2) true (boolean), [1, 2, 3]
+this: true
+arguments: 3: 1,2,3
+3
+Testing: (4) 0 (number), [1, 2, 3]
+this: 0
+arguments: 3: 1,2,3
+5
+Testing: (6) 0.5 (number), [1, 2, 3]
+this: 0.5
+arguments: 3: 1,2,3
+7
+Testing: (8) -0.5 (number), [1, 2, 3]
+this: -0.5
+arguments: 3: 1,2,3
+9
+Testing: (10) -Infinity (number), [1, 2, 3]
+this: -Infinity
+arguments: 3: 1,2,3
+11
+Testing: (12)  (string), [1, 2, 3]
+this: 
+arguments: 3: 1,2,3
+13
+Testing: (14) -0 (string), [1, 2, 3]
+this: -0
+arguments: 3: 1,2,3
+15
+Testing: (16) 1 (string), [1, 2, 3]
+this: 1
+arguments: 3: 1,2,3
+17
+Testing: (18) true (string), [1, 2, 3]
+this: true
+arguments: 3: 1,2,3
+19
+Testing: (20) _level0 (movieclip), [1, 2, 3]
+this: _level0
+arguments: 3: 1,2,3
+21
+Testing: (22) [type Function] (function), [1, 2, 3]
+this: [type Function]
+arguments: 3: 1,2,3
+23
+Testing: (24) [type Object] (object), [1, 2, 3]
+toString called with 
+this: [type Object]
+arguments: 3: 1,2,3
+25
+Testing: (26)  (object), [1, 2, 3]
+this: 
+arguments: 3: 1,2,3
+27
+Testing: (28) null (object), [1, 2, 3]
+1: valueOf!
+this: null
+arguments: 3: 1,2,3
+29
+Testing: (30) false (object), [1, 2, 3]
+3: valueOf!
+this: false
+arguments: 3: 1,2,3
+31
+Testing: (32) 1 (object), [1, 2, 3]
+5: valueOf!
+this: 1
+arguments: 3: 1,2,3
+33
+Testing: (34) -1 (object), [1, 2, 3]
+7: valueOf!
+this: -1
+arguments: 3: 1,2,3
+35
+Testing: (36) Infinity (object), [1, 2, 3]
+9: valueOf!
+this: Infinity
+arguments: 3: 1,2,3
+37
+Testing: (38) NaN (object), [1, 2, 3]
+11: valueOf!
+this: NaN
+arguments: 3: 1,2,3
+39
+Testing: (40) 0 (object), [1, 2, 3]
+13: valueOf!
+this: 0
+arguments: 3: 1,2,3
+41
+Testing: (42) 0.0 (object), [1, 2, 3]
+15: valueOf!
+this: 0.0
+arguments: 3: 1,2,3
+43
+Testing: (44) Hello World! (object), [1, 2, 3]
+17: valueOf!
+this: Hello World!
+arguments: 3: 1,2,3
+45
+Testing: (46) _level0 (object), [1, 2, 3]
+19: valueOf!
+this: _level0
+arguments: 3: 1,2,3
+47
+Testing: (48) [type Object] (object), [1, 2, 3]
+21: valueOf!
+21: toString!
+this: [type Object]
+arguments: 3: 1,2,3
+49
+Testing: (50) [type Object] (object), [1, 2, 3]
+23: valueOf!
+23: toString!
+this: [type Object]
+arguments: 3: 1,2,3
+51
+Testing: (52) [type Object] (object), [1, 2, 3]
+25: valueOf!
+25: toString!
+this: [type Object]
+arguments: 3: 1,2,3
+53
diff --git a/test/trace/function-apply-7.swf b/test/trace/function-apply-7.swf
new file mode 100644
index 0000000..12eaa5e
Binary files /dev/null and b/test/trace/function-apply-7.swf differ
diff --git a/test/trace/function-apply-7.swf.trace b/test/trace/function-apply-7.swf.trace
new file mode 100644
index 0000000..15ba518
--- /dev/null
+++ b/test/trace/function-apply-7.swf.trace
@@ -0,0 +1,194 @@
+valueOf called
+toString called
+toString called with 
+valueOf called with 
+0: valueOf!
+1: valueOf!
+2: valueOf!
+3: valueOf!
+4: valueOf!
+5: valueOf!
+6: valueOf!
+7: valueOf!
+8: valueOf!
+9: valueOf!
+10: valueOf!
+11: valueOf!
+12: valueOf!
+13: valueOf!
+14: valueOf!
+15: valueOf!
+16: valueOf!
+17: valueOf!
+18: valueOf!
+19: valueOf!
+20: valueOf!
+21: valueOf!
+21: toString!
+22: valueOf!
+22: toString!
+23: valueOf!
+23: toString!
+24: valueOf!
+24: toString!
+25: valueOf!
+25: toString!
+26: valueOf!
+26: toString!
+Testing: (no arguments)
+this: undefined
+arguments: 0: 
+1
+Testing: a
+this: a
+arguments: 0: 
+2
+Testing: a, [1, 2, 3]
+this: a
+arguments: 3: 1,2,3
+3
+Testing: a, [1, 2, 3], [4, 5]
+this: a
+arguments: 3: 1,2,3
+4
+Testing: a, 1, [2, 3]
+this: a
+arguments: 0: 
+5
+Testing: a, 1, 2, 3
+this: a
+arguments: 0: 
+6
+Testing: a, fake_array
+this: a
+arguments: 3: 1,2,3
+7
+Testing: b, [1, 2, 3]
+this: b
+arguments: 3: 1,2,3
+8
+Testing: (0) undefined (undefined), [1, 2, 3]
+this: undefined
+arguments: 3: 1,2,3
+1
+Testing: (2) true (boolean), [1, 2, 3]
+this: true
+arguments: 3: 1,2,3
+3
+Testing: (4) 0 (number), [1, 2, 3]
+this: 0
+arguments: 3: 1,2,3
+5
+Testing: (6) 0.5 (number), [1, 2, 3]
+this: 0.5
+arguments: 3: 1,2,3
+7
+Testing: (8) -0.5 (number), [1, 2, 3]
+this: -0.5
+arguments: 3: 1,2,3
+9
+Testing: (10) -Infinity (number), [1, 2, 3]
+this: -Infinity
+arguments: 3: 1,2,3
+11
+Testing: (12)  (string), [1, 2, 3]
+this: 
+arguments: 3: 1,2,3
+13
+Testing: (14) -0 (string), [1, 2, 3]
+this: -0
+arguments: 3: 1,2,3
+15
+Testing: (16) 1 (string), [1, 2, 3]
+this: 1
+arguments: 3: 1,2,3
+17
+Testing: (18) true (string), [1, 2, 3]
+this: true
+arguments: 3: 1,2,3
+19
+Testing: (20) _level0 (movieclip), [1, 2, 3]
+this: _level0
+arguments: 3: 1,2,3
+21
+Testing: (22) [type Function] (function), [1, 2, 3]
+this: [type Function]
+arguments: 3: 1,2,3
+23
+Testing: (24) [type Object] (object), [1, 2, 3]
+toString called with 
+this: [type Object]
+arguments: 3: 1,2,3
+25
+Testing: (26) undefined (object), [1, 2, 3]
+this: undefined
+arguments: 3: 1,2,3
+27
+Testing: (28) null (object), [1, 2, 3]
+1: valueOf!
+this: null
+arguments: 3: 1,2,3
+29
+Testing: (30) false (object), [1, 2, 3]
+3: valueOf!
+this: false
+arguments: 3: 1,2,3
+31
+Testing: (32) 1 (object), [1, 2, 3]
+5: valueOf!
+this: 1
+arguments: 3: 1,2,3
+33
+Testing: (34) -1 (object), [1, 2, 3]
+7: valueOf!
+this: -1
+arguments: 3: 1,2,3
+35
+Testing: (36) Infinity (object), [1, 2, 3]
+9: valueOf!
+this: Infinity
+arguments: 3: 1,2,3
+37
+Testing: (38) NaN (object), [1, 2, 3]
+11: valueOf!
+this: NaN
+arguments: 3: 1,2,3
+39
+Testing: (40) 0 (object), [1, 2, 3]
+13: valueOf!
+this: 0
+arguments: 3: 1,2,3
+41
+Testing: (42) 0.0 (object), [1, 2, 3]
+15: valueOf!
+this: 0.0
+arguments: 3: 1,2,3
+43
+Testing: (44) Hello World! (object), [1, 2, 3]
+17: valueOf!
+this: Hello World!
+arguments: 3: 1,2,3
+45
+Testing: (46) _level0 (object), [1, 2, 3]
+19: valueOf!
+this: _level0
+arguments: 3: 1,2,3
+47
+Testing: (48) [type Object] (object), [1, 2, 3]
+21: valueOf!
+21: toString!
+this: [type Object]
+arguments: 3: 1,2,3
+49
+Testing: (50) [type Object] (object), [1, 2, 3]
+23: valueOf!
+23: toString!
+this: [type Object]
+arguments: 3: 1,2,3
+51
+Testing: (52) [type Object] (object), [1, 2, 3]
+25: valueOf!
+25: toString!
+this: [type Object]
+arguments: 3: 1,2,3
+53
diff --git a/test/trace/function-apply.as b/test/trace/function-apply.as
new file mode 100644
index 0000000..cfc4665
--- /dev/null
+++ b/test/trace/function-apply.as
@@ -0,0 +1,47 @@
+// makeswf -v 7 -r 1 -o function-apply-7.swf function-apply.as
+
+#include "values.as"
+
+var i = 0;
+function test_function () {
+  trace ("this: " + this);
+  trace ("arguments: " + arguments.length + ": " + arguments);
+  return ++i;
+}
+
+var a = new Object ();
+a.toString = function () { return "a"; };
+a.test = test_function;
+
+var b = new Object ();
+b.toString = function () { return "b"; };
+
+var fake_array = new Object ();
+fake_array[0] = 1;
+fake_array[1] = 2;
+fake_array[2] = 3;
+fake_array.length = 3;
+
+trace ("Testing: (no arguments)");
+trace (a.test.apply ());
+trace ("Testing: a");
+trace (a.test.apply (a));
+trace ("Testing: a, [1, 2, 3]");
+trace (a.test.apply (a, [1, 2, 3]));
+trace ("Testing: a, [1, 2, 3], [4, 5]");
+trace (a.test.apply (a, [1, 2, 3], [4, 5]));
+trace ("Testing: a, 1, [2, 3]");
+trace (a.test.apply (a, 1, [2, 3]));
+trace ("Testing: a, 1, 2, 3");
+trace (a.test.apply (a, 1, 2, 3));
+trace ("Testing: a, fake_array");
+trace (a.test.apply (a, fake_array));
+trace ("Testing: b, [1, 2, 3]");
+trace (a.test.apply (b, [1, 2, 3]));
+
+for (var i = 0; i < values.length; i++) {
+  trace ("Testing: " + names[i] + ", [1, 2, 3]");
+  trace (a.test.apply (values[i], [1, 2, 3]));
+}
+
+loadMovie ("FSCommand:quit", "");
diff-tree 2317fb49f1f8060fabbb307e802a4a5b058b0430 (from 51400761671119fb9726de776b4db69a69dbbb9f)
Author: Pekka Lampila <pekka.lampila at iki.fi>
Date:   Tue Sep 11 14:26:12 2007 +0300

    Implement Function's apply method

diff --git a/libswfdec/swfdec_as_function.c b/libswfdec/swfdec_as_function.c
index f89f56c..27a0121 100644
--- a/libswfdec/swfdec_as_function.c
+++ b/libswfdec/swfdec_as_function.c
@@ -166,6 +166,56 @@ swfdec_as_function_do_call (SwfdecAsCont
   swfdec_as_context_run (context);
 }
 
+static void
+swfdec_as_function_apply (SwfdecAsContext *cx, SwfdecAsObject *fun,
+    guint argc, SwfdecAsValue *argv, SwfdecAsValue *ret)
+{
+  SwfdecAsObject *thisp;
+
+  if (argc > 0) {
+    thisp = swfdec_as_value_to_object (cx, &argv[0]);
+  } else {
+    thisp = NULL;
+  }
+  if (thisp == NULL)
+    thisp = swfdec_as_object_new_empty (cx);
+
+  if (argc > 1 && SWFDEC_AS_VALUE_IS_OBJECT (&argv[1]))
+  {
+    int length, i;
+    SwfdecAsObject *array;
+    SwfdecAsValue val, *argv_pass;
+
+    array = SWFDEC_AS_VALUE_GET_OBJECT (&argv[1]);
+
+    swfdec_as_object_get_variable (array, SWFDEC_AS_STR_length, &val);
+    length = swfdec_as_value_to_integer (cx, &val);
+
+    if (length > 0) {
+      argv_pass = g_malloc (sizeof (SwfdecAsValue) * length);
+
+      for (i = 0; i < length; i++) {
+	swfdec_as_object_get_variable (array,
+	    swfdec_as_double_to_string (cx, i), &argv_pass[i]);
+      }
+    } else {
+      argv_pass = NULL;
+    }
+
+    swfdec_as_function_call (SWFDEC_AS_FUNCTION (fun), thisp, length,
+	argv_pass, ret);
+
+    if (argv_pass != NULL)
+      g_free (argv_pass);
+  }
+  else
+  {
+    swfdec_as_function_call (SWFDEC_AS_FUNCTION (fun), thisp, 0, NULL, ret);
+  }
+
+  swfdec_as_context_run (cx);
+}
+
 void
 swfdec_as_function_init_context (SwfdecAsContext *context, guint version)
 {
@@ -200,6 +250,8 @@ swfdec_as_function_init_context (SwfdecA
     /* prototype functions */
     swfdec_as_object_add_function (proto, SWFDEC_AS_STR_call,
 	SWFDEC_TYPE_AS_FUNCTION, swfdec_as_function_do_call, 0);
+    swfdec_as_object_add_function (proto, SWFDEC_AS_STR_apply,
+	SWFDEC_TYPE_AS_FUNCTION, swfdec_as_function_apply, 0);
   }
 }
 
diff --git a/libswfdec/swfdec_as_strings.c b/libswfdec/swfdec_as_strings.c
index c9f244b..ba00073 100644
--- a/libswfdec/swfdec_as_strings.c
+++ b/libswfdec/swfdec_as_strings.c
@@ -353,6 +353,7 @@ const char swfdec_as_strings[] = 
   SWFDEC_AS_CONSTANT_STRING ("isPropertyEnumerable")
   SWFDEC_AS_CONSTANT_STRING ("watch")
   SWFDEC_AS_CONSTANT_STRING ("unwatch")
+  SWFDEC_AS_CONSTANT_STRING ("apply")
   /* add more here */
 ;
 
diff-tree 51400761671119fb9726de776b4db69a69dbbb9f (from 93f0e1b0eaeb04357370f7daf9ea8dbbe3786d3e)
Author: Pekka Lampila <pekka.lampila at iki.fi>
Date:   Tue Sep 11 14:25:37 2007 +0300

    Fix trace_properties.as to name Function and Function.prototype properly

diff --git a/test/trace/trace_properties.as b/test/trace/trace_properties.as
index ec5b08c..7fb630c 100644
--- a/test/trace/trace_properties.as
+++ b/test/trace/trace_properties.as
@@ -406,8 +406,12 @@ function trace_properties (o, prefix, id
 {
   _global["mySecretId"] = "_global";
   _global.Object["mySecretId"] = "_global.Object";
+  _global.Function["mySecretId"] = "_global.Function";
+  _global.Function.prototype["mySecretId"] = "_global.Function.prototype";
   _global.XMLNode["mySecretId"] = "_global.XMLNode";
   generate_names (_global.Object, "_global", "Object");
+  generate_names (_global.Function, "_global", "Function");
+  generate_names (_global.Function.prototype, "_global", "Function.prototype");
   generate_names (_global.XMLNode, "_global", "XMLNode");
   generate_names (_global, "", "_global");
 


More information about the Swfdec mailing list