[Swfdec] 15 commits - libswfdec/swfdec_as_strings.c libswfdec/swfdec_initialize.as libswfdec/swfdec_initialize.h libswfdec/swfdec_movie.c libswfdec/swfdec_movie.h libswfdec/swfdec_sprite.c libswfdec/swfdec_sprite_movie.c libswfdec/swfdec_system_as.c libswfdec/swfdec_system.c libswfdec/swfdec_system.h libswfdec/swfdec_tag.c player/swfdebug.c player/swfdec_debug_widget.c player/swfdec_debug_widget.h test/trace vivified/ui

Benjamin Otte company at kemper.freedesktop.org
Wed Aug 29 14:57:21 PDT 2007


 libswfdec/swfdec_as_strings.c                    |    1 
 libswfdec/swfdec_initialize.as                   |    1 
 libswfdec/swfdec_initialize.h                    |  210 +++++------
 libswfdec/swfdec_movie.c                         |   71 +++
 libswfdec/swfdec_movie.h                         |    4 
 libswfdec/swfdec_sprite.c                        |    1 
 libswfdec/swfdec_sprite_movie.c                  |   22 -
 libswfdec/swfdec_system.c                        |   17 
 libswfdec/swfdec_system.h                        |    1 
 libswfdec/swfdec_system_as.c                     |   10 
 libswfdec/swfdec_tag.c                           |   14 
 player/swfdebug.c                                |  426 -----------------------
 player/swfdec_debug_widget.c                     |  155 --------
 player/swfdec_debug_widget.h                     |   55 --
 test/trace/Makefile.am                           |    9 
 test/trace/system-capabilities-query-5.swf       |binary
 test/trace/system-capabilities-query-5.swf.trace |   33 +
 test/trace/system-capabilities-query-6.swf       |binary
 test/trace/system-capabilities-query-6.swf.trace |   33 +
 test/trace/system-capabilities-query-7.swf       |binary
 test/trace/system-capabilities-query-7.swf.trace |   33 +
 test/trace/system-capabilities-query-8.swf       |binary
 test/trace/system-capabilities-query-8.swf.trace |   33 +
 test/trace/system-capabilities-query.as          |   13 
 vivified/ui/Makefile.am                          |    2 
 vivified/ui/vivi_player.c                        |   28 -
 vivified/ui/vivi_player.xml                      |    3 
 vivified/ui/vivi_widget.c                        |  239 ++++++++++++
 vivified/ui/vivi_widget.h                        |   62 +++
 29 files changed, 677 insertions(+), 799 deletions(-)

New commits:
diff-tree da2933ac249d01058d9cf2e5b24a79e00e756fa3 (from 2c1b79c0da63c520d630d0417af98bc4ef89e180)
Author: Benjamin Otte <otte at gnome.org>
Date:   Wed Aug 29 13:43:03 2007 +0200

    no need to throw errors for blend modes anymore

diff --git a/libswfdec/swfdec_sprite_movie.c b/libswfdec/swfdec_sprite_movie.c
index 56878c9..15d005b 100644
--- a/libswfdec/swfdec_sprite_movie.c
+++ b/libswfdec/swfdec_sprite_movie.c
@@ -184,7 +184,7 @@ swfdec_sprite_movie_perform_place (Swfde
 
   if (has_blend_mode) {
     blend_mode = swfdec_bits_get_u8 (bits);
-    SWFDEC_ERROR ("  blend mode = %u", blend_mode);
+    SWFDEC_LOG ("  blend mode = %u", blend_mode);
   } else {
     blend_mode = 0;
   }
diff-tree 2c1b79c0da63c520d630d0417af98bc4ef89e180 (from 61b11b6d0a82bcca7b4cca3c0b3b82e4f6f7f6c5)
Author: Benjamin Otte <otte at gnome.org>
Date:   Wed Aug 29 13:36:31 2007 +0200

    alpha blend mode is supported by cairo, too

diff --git a/libswfdec/swfdec_movie.c b/libswfdec/swfdec_movie.c
index 60b34b0..c9755ea 100644
--- a/libswfdec/swfdec_movie.c
+++ b/libswfdec/swfdec_movie.c
@@ -702,6 +702,8 @@ swfdec_movie_get_operator_for_blend_mode
       return CAIRO_OPERATOR_OVER;
     case 8:
       return CAIRO_OPERATOR_ADD;
+    case 11:
+      return CAIRO_OPERATOR_DEST_IN;
     case 12:
       return CAIRO_OPERATOR_DEST_OUT;
     case 3:
@@ -711,7 +713,6 @@ swfdec_movie_get_operator_for_blend_mode
     case 7:
     case 9:
     case 10:
-    case 11:
     case 13:
     case 14:
       SWFDEC_WARNING ("blend mode %u unimplemented in cairo", blend_mode);
diff-tree 61b11b6d0a82bcca7b4cca3c0b3b82e4f6f7f6c5 (from 1b153f39f46ef7ad302dbb7782034fa358eb4939)
Author: Benjamin Otte <otte at gnome.org>
Date:   Wed Aug 29 13:35:03 2007 +0200

    use the right operator for erase

diff --git a/libswfdec/swfdec_movie.c b/libswfdec/swfdec_movie.c
index 6b9ce4b..60b34b0 100644
--- a/libswfdec/swfdec_movie.c
+++ b/libswfdec/swfdec_movie.c
@@ -703,7 +703,7 @@ swfdec_movie_get_operator_for_blend_mode
     case 8:
       return CAIRO_OPERATOR_ADD;
     case 12:
-      return CAIRO_OPERATOR_CLEAR;
+      return CAIRO_OPERATOR_DEST_OUT;
     case 3:
     case 4:
     case 5:
diff-tree 1b153f39f46ef7ad302dbb7782034fa358eb4939 (from ea0162e4d86d6eae98bf575897ab3bb9a5bb482d)
Author: Benjamin Otte <otte at gnome.org>
Date:   Wed Aug 29 13:31:59 2007 +0200

    handle blend modes when drawing
    
    Well, cairo only supports two of those, but still :)

diff --git a/libswfdec/swfdec_movie.c b/libswfdec/swfdec_movie.c
index f6b8f55..6b9ce4b 100644
--- a/libswfdec/swfdec_movie.c
+++ b/libswfdec/swfdec_movie.c
@@ -685,6 +685,43 @@ swfdec_movie_get_movie_at (SwfdecMovie *
   return NULL;
 }
 
+static gboolean
+swfdec_movie_needs_group (SwfdecMovie *movie)
+{
+  return (movie->blend_mode > 1);
+}
+
+static cairo_operator_t
+swfdec_movie_get_operator_for_blend_mode (guint blend_mode)
+{
+  switch (blend_mode) {
+    case 0:
+    case 1:
+      SWFDEC_ERROR ("shouldn't need to get operator without blend mode?!");
+    case 2:
+      return CAIRO_OPERATOR_OVER;
+    case 8:
+      return CAIRO_OPERATOR_ADD;
+    case 12:
+      return CAIRO_OPERATOR_CLEAR;
+    case 3:
+    case 4:
+    case 5:
+    case 6:
+    case 7:
+    case 9:
+    case 10:
+    case 11:
+    case 13:
+    case 14:
+      SWFDEC_WARNING ("blend mode %u unimplemented in cairo", blend_mode);
+      return CAIRO_OPERATOR_OVER;
+    default:
+      SWFDEC_WARNING ("invalid blend mode %u", blend_mode);
+      return CAIRO_OPERATOR_OVER;
+  }
+}
+
 void
 swfdec_movie_render (SwfdecMovie *movie, cairo_t *cr,
     const SwfdecColorTransform *color_transform, const SwfdecRect *inval, gboolean fill)
@@ -694,6 +731,7 @@ swfdec_movie_render (SwfdecMovie *movie,
   int clip_depth = 0;
   SwfdecColorTransform trans;
   SwfdecRect rect;
+  gboolean group;
 
   g_return_if_fail (SWFDEC_IS_MOVIE (movie));
   g_return_if_fail (cr != NULL);
@@ -717,6 +755,11 @@ swfdec_movie_render (SwfdecMovie *movie,
   }
 
   cairo_save (cr);
+  group = swfdec_movie_needs_group (movie);
+  if (group) {
+    SWFDEC_DEBUG ("pushing group for blend mode %u", movie->blend_mode);
+    cairo_push_group (cr);
+  }
 
   SWFDEC_LOG ("transforming movie, transform: %g %g  %g %g   %g %g",
       movie->matrix.xx, movie->matrix.yy,
@@ -789,6 +832,14 @@ swfdec_movie_render (SwfdecMovie *movie,
   if (cairo_status (cr) != CAIRO_STATUS_SUCCESS) {
     g_warning ("error rendering with cairo: %s", cairo_status_to_string (cairo_status (cr)));
   }
+  if (group) {
+    cairo_pattern_t *pattern;
+
+    pattern = cairo_pop_group (cr);
+    cairo_set_source (cr, pattern);
+    cairo_set_operator (cr, swfdec_movie_get_operator_for_blend_mode (movie->blend_mode));
+    cairo_paint (cr);
+  }
   cairo_restore (cr);
 }
 
diff-tree ea0162e4d86d6eae98bf575897ab3bb9a5bb482d (from ba620e7dd08210039197fcb89bb2265856ada6a4)
Author: Benjamin Otte <otte at gnome.org>
Date:   Wed Aug 29 13:09:52 2007 +0200

    parse blend modes and put them in a proper variable

diff --git a/libswfdec/swfdec_movie.c b/libswfdec/swfdec_movie.c
index 02904d0..f6b8f55 100644
--- a/libswfdec/swfdec_movie.c
+++ b/libswfdec/swfdec_movie.c
@@ -1098,7 +1098,8 @@ swfdec_movie_new (SwfdecPlayer *player, 
  */
 void
 swfdec_movie_set_static_properties (SwfdecMovie *movie, const cairo_matrix_t *transform,
-    const SwfdecColorTransform *ctrans, int ratio, int clip_depth, SwfdecEventList *events)
+    const SwfdecColorTransform *ctrans, int ratio, int clip_depth, guint blend_mode,
+    SwfdecEventList *events)
 {
   g_return_if_fail (SWFDEC_IS_MOVIE (movie));
   g_return_if_fail (clip_depth >= -16384 || clip_depth <= 0);
@@ -1130,6 +1131,10 @@ swfdec_movie_set_static_properties (Swfd
     /* FIXME: is this correct? */
     swfdec_movie_invalidate (movie->parent ? movie->parent : movie);
   }
+  if (blend_mode != movie->blend_mode) {
+    movie->blend_mode = blend_mode;
+    swfdec_movie_invalidate (movie);
+  }
   if (events) {
     if (movie->events)
       swfdec_event_list_free (movie->events);
@@ -1172,7 +1177,8 @@ swfdec_movie_duplicate (SwfdecMovie *mov
   if (copy == NULL)
     return NULL;
   swfdec_movie_set_static_properties (copy, &movie->original_transform,
-      &movie->original_ctrans, movie->original_ratio, movie->clip_depth, movie->events);
+      &movie->original_ctrans, movie->original_ratio, movie->clip_depth, 
+      movie->blend_mode, movie->events);
   return copy;
 }
 
@@ -1193,7 +1199,7 @@ swfdec_movie_new_for_content (SwfdecMovi
 
   swfdec_movie_set_static_properties (movie, content->has_transform ? &content->transform : NULL,
       content->has_color_transform ? &content->color_transform : NULL, 
-      content->ratio, content->clip_depth, content->events);
+      content->ratio, content->clip_depth, content->blend_mode, content->events);
   if (SWFDEC_IS_SPRITE_MOVIE (movie)) {
     g_queue_push_tail (player->init_queue, movie);
     g_queue_push_tail (player->construct_queue, movie);
diff --git a/libswfdec/swfdec_movie.h b/libswfdec/swfdec_movie.h
index 41e99fa..d383c98 100644
--- a/libswfdec/swfdec_movie.h
+++ b/libswfdec/swfdec_movie.h
@@ -58,7 +58,7 @@ struct _SwfdecContent {
   gboolean		has_color_transform : 1;
   char *		name;
   SwfdecEventList *	events;
-  cairo_operator_t	operator;	/* operator to use when painting (aka blend mode) */   
+  guint			blend_mode;	/* operator to use when painting (aka blend mode) */   
 
   /* only used by buttons */
   SwfdecContent *	sequence;
@@ -114,6 +114,7 @@ struct _SwfdecMovie {
   cairo_matrix_t	matrix;			/* cairo matrix computed from above and content->transform */
   cairo_matrix_t	inverse_matrix;		/* the inverse of the cairo matrix */
   SwfdecColorTransform	color_transform;	/* scripted color transformation */
+  guint			blend_mode;		/* blend mode to use - see to-cairo conversion code for what they mean */
 
   /* iteration state */
   gboolean		visible;		/* whether we currently can be seen or iterate */
@@ -181,6 +182,7 @@ void		swfdec_movie_set_static_properties
 						 const SwfdecColorTransform *ctrans,
 						 int			ratio,
 						 int			clip_depth,
+						 guint			blend_mode,
 						 SwfdecEventList *	events);
 void		swfdec_movie_invalidate		(SwfdecMovie *		movie);
 void		swfdec_movie_queue_update	(SwfdecMovie *		movie,
diff --git a/libswfdec/swfdec_sprite.c b/libswfdec/swfdec_sprite.c
index c525fc1..d5f2f11 100644
--- a/libswfdec/swfdec_sprite.c
+++ b/libswfdec/swfdec_sprite.c
@@ -164,7 +164,6 @@ swfdec_content_new (int depth)
   cairo_matrix_init_identity (&content->transform);
   swfdec_color_transform_init_identity (&content->color_transform);
   content->depth = depth;
-  content->operator = CAIRO_OPERATOR_OVER;
   return content;
 }
 
diff --git a/libswfdec/swfdec_sprite_movie.c b/libswfdec/swfdec_sprite_movie.c
index 5bce6fa..56878c9 100644
--- a/libswfdec/swfdec_sprite_movie.c
+++ b/libswfdec/swfdec_sprite_movie.c
@@ -58,12 +58,6 @@ swfdec_sprite_movie_run_script (gpointer
   swfdec_as_object_run (movie, data);
 }
 
-static cairo_operator_t
-swfdec_sprite_convert_operator (guint operator)
-{
-  return CAIRO_OPERATOR_OVER;
-}
-
 static int
 swfdec_get_clipeventflags (SwfdecMovie *movie, SwfdecBits * bits)
 {
@@ -98,6 +92,7 @@ swfdec_sprite_movie_perform_place (Swfde
   guint ratio, id, version;
   SwfdecEventList *events;
   const char *name;
+  guint blend_mode;
   SwfdecGraphic *graphic;
 
   version = SWFDEC_SWF_DECODER (mov->swf->decoder)->version;
@@ -188,10 +183,10 @@ swfdec_sprite_movie_perform_place (Swfde
     swfdec_filters_parse (bits);
 
   if (has_blend_mode) {
-    /* FIXME: implement */
-    guint operator = swfdec_bits_get_u8 (bits);
-    swfdec_sprite_convert_operator (operator);
-    SWFDEC_ERROR ("  operator = %u", operator);
+    blend_mode = swfdec_bits_get_u8 (bits);
+    SWFDEC_ERROR ("  blend mode = %u", blend_mode);
+  } else {
+    blend_mode = 0;
   }
 
   if (has_clip_actions) {
@@ -251,7 +246,7 @@ swfdec_sprite_movie_perform_place (Swfde
 	klass->replace (cur, graphic);
     }
     swfdec_movie_set_static_properties (cur, has_transform ? &transform : NULL, 
-	has_ctrans ? &ctrans : NULL, ratio, clip_depth, events);
+	has_ctrans ? &ctrans : NULL, ratio, clip_depth, blend_mode, events);
   } else {
     if (cur != NULL && version > 5) {
       SWFDEC_INFO ("depth %d is already occupied by movie %s, not placing", depth, cur->name);
@@ -265,7 +260,7 @@ swfdec_sprite_movie_perform_place (Swfde
     }
     cur = swfdec_movie_new (player, depth, mov, graphic, name);
     swfdec_movie_set_static_properties (cur, has_transform ? &transform : NULL, 
-	has_ctrans ? &ctrans : NULL, ratio, clip_depth, events);
+	has_ctrans ? &ctrans : NULL, ratio, clip_depth, blend_mode, events);
     if (SWFDEC_IS_SPRITE_MOVIE (cur)) {
       g_queue_push_tail (player->init_queue, cur);
       g_queue_push_tail (player->construct_queue, cur);
@@ -454,7 +449,8 @@ swfdec_sprite_movie_goto (SwfdecSpriteMo
 	if (klass->replace)
 	  klass->replace (prev, cur->graphic);
 	swfdec_movie_set_static_properties (prev, &cur->original_transform,
-	    &cur->original_ctrans, cur->original_ratio, cur->clip_depth, cur->events);
+	    &cur->original_ctrans, cur->original_ratio, cur->clip_depth, 
+	    cur->blend_mode, cur->events);
 	swfdec_movie_destroy (cur);
 	cur = prev;
 	continue;
diff --git a/libswfdec/swfdec_tag.c b/libswfdec/swfdec_tag.c
index d07bb89..2fe1a04 100644
--- a/libswfdec/swfdec_tag.c
+++ b/libswfdec/swfdec_tag.c
@@ -416,19 +416,19 @@ tag_func_define_button_2 (SwfdecSwfDecod
     guint character;
     guint depth;
     guint states;
-    gboolean blend_mode, has_filters;
+    gboolean has_blend_mode, has_filters;
     SwfdecContent *content;
 
     if (s->version >= 8) {
       reserved = swfdec_bits_getbits (&bits, 2);
-      blend_mode = swfdec_bits_getbit (&bits);
+      has_blend_mode = swfdec_bits_getbit (&bits);
       has_filters = swfdec_bits_getbit (&bits);
       SWFDEC_LOG ("  reserved = %d", reserved);
-      SWFDEC_LOG ("  blend_mode = %d", blend_mode);
+      SWFDEC_LOG ("  has_blend_mode = %d", has_blend_mode);
       SWFDEC_LOG ("  has_filters = %d", has_filters);
     } else {
       reserved = swfdec_bits_getbits (&bits, 4);
-      blend_mode = 0;
+      has_blend_mode = 0;
       has_filters = 0;
       SWFDEC_LOG ("  reserved = %d", reserved);
     }
@@ -454,9 +454,9 @@ tag_func_define_button_2 (SwfdecSwfDecod
     content->has_color_transform = TRUE;
 
     content->graphic = swfdec_swf_decoder_get_character (s, character);
-    if (blend_mode) {
-      guint mode = swfdec_bits_get_u8 (&bits);
-      SWFDEC_WARNING ("  blend mode = %u", mode);
+    if (has_blend_mode) {
+      content->blend_mode = swfdec_bits_get_u8 (&bits);
+      SWFDEC_LOG ("  blend mode = %u", content->blend_mode);
     }
     if (has_filters)
       swfdec_filters_parse (&bits);
diff-tree ba620e7dd08210039197fcb89bb2265856ada6a4 (from 4dd4aecd5c797383927fa3aaed95c6deb049f357)
Author: Benjamin Otte <otte at gnome.org>
Date:   Wed Aug 29 12:34:38 2007 +0200

    add test for System.capabilites.Query ()
    
    note that this test needs to be doctored when we support more features or
    change defaults

diff --git a/test/trace/Makefile.am b/test/trace/Makefile.am
index af93a1f..22b7a95 100644
--- a/test/trace/Makefile.am
+++ b/test/trace/Makefile.am
@@ -1196,6 +1196,15 @@ EXTRA_DIST = \
 	super-this-7.swf.trace \
 	super-this-8.swf \
 	super-this-8.swf.trace \
+	system-capabilities-query.as \
+	system-capabilities-query-5.swf \
+	system-capabilities-query-5.swf.trace \
+	system-capabilities-query-6.swf \
+	system-capabilities-query-6.swf.trace \
+	system-capabilities-query-7.swf \
+	system-capabilities-query-7.swf.trace \
+	system-capabilities-query-8.swf \
+	system-capabilities-query-8.swf.trace \
 	targetpath.as \
 	targetpath-5.swf \
 	targetpath-5.swf.trace \
diff --git a/test/trace/system-capabilities-query-5.swf b/test/trace/system-capabilities-query-5.swf
new file mode 100644
index 0000000..dbc9e12
Binary files /dev/null and b/test/trace/system-capabilities-query-5.swf differ
diff --git a/test/trace/system-capabilities-query-5.swf.trace b/test/trace/system-capabilities-query-5.swf.trace
new file mode 100644
index 0000000..557e098
--- /dev/null
+++ b/test/trace/system-capabilities-query-5.swf.trace
@@ -0,0 +1,33 @@
+test System.capabilites.Query
+undefined
+. = _global.Object.prototype
+  __proto__ (hp) = _global.Object.prototype
+  avHardwareDisable = boolean : false
+  constructor (hp) = _global.Object
+  hasAccessibility = boolean : false
+  hasAudio = boolean : true
+  hasAudioEncoder = boolean : false
+  hasEmbeddedVideo = boolean : true
+  hasIME = boolean : false
+  hasMP3 = boolean : true
+  hasPrinting = boolean : false
+  hasScreenBroadcast = boolean : false
+  hasScreenPlayback = boolean : false
+  hasStreamingAudio = boolean : true
+  hasStreamingVideo = boolean : true
+  hasTLS = boolean : false
+  hasVideoEncoder = boolean : false
+  isDebugger = boolean : false
+  language = string : "en"
+  localFileReadDisable = boolean : false
+  manufacturer = string : "Macromedia Windows"
+  os = string : "Windows XP"
+  pixelAspectRatio = number : 1
+  playerType = string : "StandAlone"
+  screenColor = string : "color"
+  screenDPI = number : 96
+  screenResolutionX = number : 1024
+  screenResolutionY = number : 768
+  serverString = string : "A=t&SA=t&SV=t&EV=t&MP3=t&AE=f&VE=f&ACC=f&PR=f&SP=f&SB=f&DEB=f&V=WIN%209%2C0%2C100%2C0&M=Adobe%20Windows&R=1024x768&DP=96&COL=color&AR=1.0&OS=Windows%20XP&L=en&IME=f&PT=StandAlone&AVD=f&LFD=f&WD=f&TLS=f"
+  version = string : "WIN 9,0,100,0"
+  windowlessDisable = boolean : false
diff --git a/test/trace/system-capabilities-query-6.swf b/test/trace/system-capabilities-query-6.swf
new file mode 100644
index 0000000..8631eea
Binary files /dev/null and b/test/trace/system-capabilities-query-6.swf differ
diff --git a/test/trace/system-capabilities-query-6.swf.trace b/test/trace/system-capabilities-query-6.swf.trace
new file mode 100644
index 0000000..557e098
--- /dev/null
+++ b/test/trace/system-capabilities-query-6.swf.trace
@@ -0,0 +1,33 @@
+test System.capabilites.Query
+undefined
+. = _global.Object.prototype
+  __proto__ (hp) = _global.Object.prototype
+  avHardwareDisable = boolean : false
+  constructor (hp) = _global.Object
+  hasAccessibility = boolean : false
+  hasAudio = boolean : true
+  hasAudioEncoder = boolean : false
+  hasEmbeddedVideo = boolean : true
+  hasIME = boolean : false
+  hasMP3 = boolean : true
+  hasPrinting = boolean : false
+  hasScreenBroadcast = boolean : false
+  hasScreenPlayback = boolean : false
+  hasStreamingAudio = boolean : true
+  hasStreamingVideo = boolean : true
+  hasTLS = boolean : false
+  hasVideoEncoder = boolean : false
+  isDebugger = boolean : false
+  language = string : "en"
+  localFileReadDisable = boolean : false
+  manufacturer = string : "Macromedia Windows"
+  os = string : "Windows XP"
+  pixelAspectRatio = number : 1
+  playerType = string : "StandAlone"
+  screenColor = string : "color"
+  screenDPI = number : 96
+  screenResolutionX = number : 1024
+  screenResolutionY = number : 768
+  serverString = string : "A=t&SA=t&SV=t&EV=t&MP3=t&AE=f&VE=f&ACC=f&PR=f&SP=f&SB=f&DEB=f&V=WIN%209%2C0%2C100%2C0&M=Adobe%20Windows&R=1024x768&DP=96&COL=color&AR=1.0&OS=Windows%20XP&L=en&IME=f&PT=StandAlone&AVD=f&LFD=f&WD=f&TLS=f"
+  version = string : "WIN 9,0,100,0"
+  windowlessDisable = boolean : false
diff --git a/test/trace/system-capabilities-query-7.swf b/test/trace/system-capabilities-query-7.swf
new file mode 100644
index 0000000..c39a653
Binary files /dev/null and b/test/trace/system-capabilities-query-7.swf differ
diff --git a/test/trace/system-capabilities-query-7.swf.trace b/test/trace/system-capabilities-query-7.swf.trace
new file mode 100644
index 0000000..0ff3057
--- /dev/null
+++ b/test/trace/system-capabilities-query-7.swf.trace
@@ -0,0 +1,33 @@
+test System.capabilites.Query
+undefined
+undefined.undefined = _global.Object.prototype
+  __proto__ (hp) = _global.Object.prototype
+  avHardwareDisable = boolean : false
+  constructor (hp) = _global.Object
+  hasAccessibility = boolean : false
+  hasAudio = boolean : true
+  hasAudioEncoder = boolean : false
+  hasEmbeddedVideo = boolean : true
+  hasIME = boolean : false
+  hasMP3 = boolean : true
+  hasPrinting = boolean : false
+  hasScreenBroadcast = boolean : false
+  hasScreenPlayback = boolean : false
+  hasStreamingAudio = boolean : true
+  hasStreamingVideo = boolean : true
+  hasTLS = boolean : false
+  hasVideoEncoder = boolean : false
+  isDebugger = boolean : false
+  language = string : "en"
+  localFileReadDisable = boolean : false
+  manufacturer = string : "Macromedia Windows"
+  os = string : "Windows XP"
+  pixelAspectRatio = number : 1
+  playerType = string : "StandAlone"
+  screenColor = string : "color"
+  screenDPI = number : 96
+  screenResolutionX = number : 1024
+  screenResolutionY = number : 768
+  serverString = string : "A=t&SA=t&SV=t&EV=t&MP3=t&AE=f&VE=f&ACC=f&PR=f&SP=f&SB=f&DEB=f&V=WIN%209%2C0%2C100%2C0&M=Adobe%20Windows&R=1024x768&DP=96&COL=color&AR=1.0&OS=Windows%20XP&L=en&IME=f&PT=StandAlone&AVD=f&LFD=f&WD=f&TLS=f"
+  version = string : "WIN 9,0,100,0"
+  windowlessDisable = boolean : false
diff --git a/test/trace/system-capabilities-query-8.swf b/test/trace/system-capabilities-query-8.swf
new file mode 100644
index 0000000..f426a0e
Binary files /dev/null and b/test/trace/system-capabilities-query-8.swf differ
diff --git a/test/trace/system-capabilities-query-8.swf.trace b/test/trace/system-capabilities-query-8.swf.trace
new file mode 100644
index 0000000..0ff3057
--- /dev/null
+++ b/test/trace/system-capabilities-query-8.swf.trace
@@ -0,0 +1,33 @@
+test System.capabilites.Query
+undefined
+undefined.undefined = _global.Object.prototype
+  __proto__ (hp) = _global.Object.prototype
+  avHardwareDisable = boolean : false
+  constructor (hp) = _global.Object
+  hasAccessibility = boolean : false
+  hasAudio = boolean : true
+  hasAudioEncoder = boolean : false
+  hasEmbeddedVideo = boolean : true
+  hasIME = boolean : false
+  hasMP3 = boolean : true
+  hasPrinting = boolean : false
+  hasScreenBroadcast = boolean : false
+  hasScreenPlayback = boolean : false
+  hasStreamingAudio = boolean : true
+  hasStreamingVideo = boolean : true
+  hasTLS = boolean : false
+  hasVideoEncoder = boolean : false
+  isDebugger = boolean : false
+  language = string : "en"
+  localFileReadDisable = boolean : false
+  manufacturer = string : "Macromedia Windows"
+  os = string : "Windows XP"
+  pixelAspectRatio = number : 1
+  playerType = string : "StandAlone"
+  screenColor = string : "color"
+  screenDPI = number : 96
+  screenResolutionX = number : 1024
+  screenResolutionY = number : 768
+  serverString = string : "A=t&SA=t&SV=t&EV=t&MP3=t&AE=f&VE=f&ACC=f&PR=f&SP=f&SB=f&DEB=f&V=WIN%209%2C0%2C100%2C0&M=Adobe%20Windows&R=1024x768&DP=96&COL=color&AR=1.0&OS=Windows%20XP&L=en&IME=f&PT=StandAlone&AVD=f&LFD=f&WD=f&TLS=f"
+  version = string : "WIN 9,0,100,0"
+  windowlessDisable = boolean : false
diff --git a/test/trace/system-capabilities-query.as b/test/trace/system-capabilities-query.as
new file mode 100644
index 0000000..8a7dffb
--- /dev/null
+++ b/test/trace/system-capabilities-query.as
@@ -0,0 +1,13 @@
+// makeswf -v 7 -s 200x150 -r 1 -o system-capabilities-query.swf system-capabilities-query.as
+
+#include "trace_properties.as"
+
+trace ("test System.capabilites.Query");
+
+o = {};
+o.Query = ASnative (11, 0);
+trace (o.Query());
+delete o.Query;
+trace_properties (o);
+
+loadMovie ("FSCommand:quit", "");
diff-tree 4dd4aecd5c797383927fa3aaed95c6deb049f357 (from 1b78c01077678375f35478925172ea57ae7003ea)
Author: Benjamin Otte <otte at gnome.org>
Date:   Wed Aug 29 12:32:43 2007 +0200

    add server-manufacturer property
    
    Adobe nicely differentiates between manufacturer as seen in
    System.capabilities.manufacturer and System.capabilities.serverString.
    
    If Adobe can do this, we can do, too.

diff --git a/libswfdec/swfdec_system.c b/libswfdec/swfdec_system.c
index 6c7aa04..dfc65d7 100644
--- a/libswfdec/swfdec_system.c
+++ b/libswfdec/swfdec_system.c
@@ -64,6 +64,7 @@ enum {
   PROP_0,
   PROP_DEBUGGER,
   PROP_MANUFACTURER,
+  PROP_SERVER_MANUFACTURER,
   PROP_OS,
   PROP_OS_TYPE,
   PROP_PLAYER_TYPE,
@@ -91,6 +92,9 @@ swfdec_system_get_property (GObject *obj
     case PROP_MANUFACTURER:
       g_value_set_string (value, system->manufacturer);
       break;
+    case PROP_SERVER_MANUFACTURER:
+      g_value_set_string (value, system->server_manufacturer);
+      break;
     case PROP_OS:
       g_value_set_string (value, system->os);
       break;
@@ -145,6 +149,13 @@ swfdec_system_set_property (GObject *obj
 	system->manufacturer = s;
       }
       break;
+    case PROP_SERVER_MANUFACTURER:
+      s = g_value_dup_string (value);
+      if (s) {
+	g_free (system->server_manufacturer);
+	system->server_manufacturer = s;
+      }
+      break;
     case PROP_OS:
       s = g_value_dup_string (value);
       if (s) {
@@ -211,6 +222,7 @@ swfdec_system_finalize (GObject *object)
   SwfdecSystem *system = SWFDEC_SYSTEM (object);
 
   g_free (system->manufacturer);
+  g_free (system->server_manufacturer);
   g_free (system->os);
   g_free (system->os_type);
   g_free (system->player_type);
@@ -236,6 +248,9 @@ swfdec_system_class_init (SwfdecSystemCl
   g_object_class_install_property (object_class, PROP_MANUFACTURER,
       g_param_spec_string ("manufacturer", "manufacturer", "string describing the manufacturer of this system",
 	  "Macromedia Windows", G_PARAM_READWRITE | G_PARAM_CONSTRUCT));
+  g_object_class_install_property (object_class, PROP_SERVER_MANUFACTURER,
+      g_param_spec_string ("server-manufacturer", "server-manufacturer", "manufacturer of this system as used in serverString",
+	  "Adobe Windows", G_PARAM_READWRITE | G_PARAM_CONSTRUCT));
   g_object_class_install_property (object_class, PROP_OS,
       g_param_spec_string ("os", "os", "description of the operating system",
 	  "Windows XP", G_PARAM_READWRITE | G_PARAM_CONSTRUCT));
diff --git a/libswfdec/swfdec_system.h b/libswfdec/swfdec_system.h
index 51c4bbc..b16da65 100644
--- a/libswfdec/swfdec_system.h
+++ b/libswfdec/swfdec_system.h
@@ -42,6 +42,7 @@ struct _SwfdecSystem
   /* player engine */
   gboolean		debugger;	/* TRUE if this engine is debugging */
   char *		manufacturer;	/* note that this includes OS information */
+  char *		server_manufacturer; /* manufacturer as reported in serverString */
   char *		os;		/* supposed to identify the operating system */
   char *		os_type;	/* usually WIN, LIN or MAC */
   char *		player_type;	/* "StandAlone", "External", "PlugIn" or "ActiveX" */
diff --git a/libswfdec/swfdec_system_as.c b/libswfdec/swfdec_system_as.c
index fff177c..1849a32 100644
--- a/libswfdec/swfdec_system_as.c
+++ b/libswfdec/swfdec_system_as.c
@@ -225,7 +225,7 @@ const struct {
   { SWFDEC_AS_STR_hasScreenBroadcast,  	"SB",	swfdec_system_has_screen_broadcast },
   { SWFDEC_AS_STR_isDebugger,   	"DEB",	swfdec_system_is_debugger },
   { SWFDEC_AS_STR_version,       	"V",	swfdec_system_version },
-  { SWFDEC_AS_STR_manufacturer,       	"M",	swfdec_system_manufacturer },
+  { SWFDEC_AS_STR_manufacturer,       	NULL,	swfdec_system_manufacturer },
   { SWFDEC_AS_STR_screenResolutionX,   	"R",	swfdec_system_screen_width },
   { SWFDEC_AS_STR_screenResolutionY,   	NULL,	swfdec_system_screen_height },
   { SWFDEC_AS_STR_screenDPI,	   	"DP",	swfdec_system_screen_dpi },
@@ -264,6 +264,10 @@ swfdec_system_query (SwfdecAsContext *cx
       g_string_append_printf (server, "x%d", (int) SWFDEC_AS_VALUE_GET_NUMBER (&val));
     } else if (queries[i].name == SWFDEC_AS_STR_pixelAspectRatio) {
       g_string_append_printf (server, "&AR=%.1f", SWFDEC_AS_VALUE_GET_NUMBER (&val));
+    } else if (queries[i].name == SWFDEC_AS_STR_manufacturer) {
+      char *s = swfdec_as_string_escape (cx, player->system->server_manufacturer);
+      g_string_append_printf (server, "&M=%s", s);
+      g_free (s);
     } else {
       g_assert (queries[i].server_string);
       if (i > 0)
diff-tree 1b78c01077678375f35478925172ea57ae7003ea (from a3bf094161ce6fbc97a2b59b154b3b2f7e307dca)
Author: Benjamin Otte <otte at gnome.org>
Date:   Wed Aug 29 12:26:19 2007 +0200

    print the asect ratio as 1.0

diff --git a/libswfdec/swfdec_system_as.c b/libswfdec/swfdec_system_as.c
index 4a2332b..fff177c 100644
--- a/libswfdec/swfdec_system_as.c
+++ b/libswfdec/swfdec_system_as.c
@@ -263,7 +263,7 @@ swfdec_system_query (SwfdecAsContext *cx
     if (queries[i].name == SWFDEC_AS_STR_screenResolutionY) {
       g_string_append_printf (server, "x%d", (int) SWFDEC_AS_VALUE_GET_NUMBER (&val));
     } else if (queries[i].name == SWFDEC_AS_STR_pixelAspectRatio) {
-      g_string_append_printf (server, "&AR=%.1g", SWFDEC_AS_VALUE_GET_NUMBER (&val));
+      g_string_append_printf (server, "&AR=%.1f", SWFDEC_AS_VALUE_GET_NUMBER (&val));
     } else {
       g_assert (queries[i].server_string);
       if (i > 0)
diff-tree a3bf094161ce6fbc97a2b59b154b3b2f7e307dca (from 71ee42795c8947ad0593c68d4cb9ea507a00b3a2)
Author: Benjamin Otte <otte at gnome.org>
Date:   Wed Aug 29 12:20:41 2007 +0200

    correct wrong server string

diff --git a/libswfdec/swfdec_system_as.c b/libswfdec/swfdec_system_as.c
index f9e4e5b..4a2332b 100644
--- a/libswfdec/swfdec_system_as.c
+++ b/libswfdec/swfdec_system_as.c
@@ -215,7 +215,7 @@ const struct {
   { SWFDEC_AS_STR_hasAudio,		"A",	swfdec_system_has_audio },
   { SWFDEC_AS_STR_hasStreamingAudio,	"SA",	swfdec_system_has_streaming_audio },
   { SWFDEC_AS_STR_hasStreamingVideo,	"SV",	swfdec_system_has_streaming_video },
-  { SWFDEC_AS_STR_hasEmbeddedVideo,	"SV",	swfdec_system_has_embedded_video },
+  { SWFDEC_AS_STR_hasEmbeddedVideo,	"EV",	swfdec_system_has_embedded_video },
   { SWFDEC_AS_STR_hasMP3,		"MP3",	swfdec_system_has_mp3 },
   { SWFDEC_AS_STR_hasAudioEncoder,    	"AE",	swfdec_system_has_audio_encoder },
   { SWFDEC_AS_STR_hasVideoEncoder,    	"VE",	swfdec_system_has_video_encoder },
diff-tree 71ee42795c8947ad0593c68d4cb9ea507a00b3a2 (from 2d54ac8bb41c41c9d512c64a194a0eee573f58e4)
Author: Benjamin Otte <otte at gnome.org>
Date:   Wed Aug 29 12:20:30 2007 +0200

    version number uses commas, not dots

diff --git a/libswfdec/swfdec_system.c b/libswfdec/swfdec_system.c
index 78049fb..6c7aa04 100644
--- a/libswfdec/swfdec_system.c
+++ b/libswfdec/swfdec_system.c
@@ -247,7 +247,7 @@ swfdec_system_class_init (SwfdecSystemCl
 	  "StandAlone", G_PARAM_READWRITE | G_PARAM_CONSTRUCT));
   g_object_class_install_property (object_class, PROP_VERSION,
       g_param_spec_string ("version", "version", "version string",
-	  "WIN 9.0.100.0", G_PARAM_READWRITE | G_PARAM_CONSTRUCT));
+	  "WIN 9,0,100,0", G_PARAM_READWRITE | G_PARAM_CONSTRUCT));
   g_object_class_install_property (object_class, PROP_LANGUAGE,
       g_param_spec_string ("language", "language", "ISO 639-1 language code",
 	  "en", G_PARAM_READWRITE | G_PARAM_CONSTRUCT));
diff-tree 2d54ac8bb41c41c9d512c64a194a0eee573f58e4 (from 02eea3ef446151ed742f1f1689f3119aa9a609de)
Author: Benjamin Otte <otte at gnome.org>
Date:   Wed Aug 29 10:03:41 2007 +0200

    delete file that isn't used anymore

diff --git a/player/swfdebug.c b/player/swfdebug.c
deleted file mode 100644
index 2f52401..0000000
--- a/player/swfdebug.c
+++ /dev/null
@@ -1,426 +0,0 @@
-#include <gtk/gtk.h>
-#include <math.h>
-#include <libswfdec/swfdec.h>
-#include <libswfdec/swfdec_debugger.h>
-#include "swfdec_debug_movies.h"
-#include "swfdec_debug_script.h"
-#include "swfdec_debug_scripts.h"
-#include "swfdec_debug_stack.h"
-#include "swfdec_debug_widget.h"
-#include "swfdec_player_manager.h"
-#ifdef CAIRO_HAS_SVG_SURFACE
-#include <cairo-svg.h>
-
-static void
-save_to_svg (GtkWidget *button, SwfdecPlayer *player)
-{
-  GtkWidget *dialog = gtk_file_chooser_dialog_new ("Save current frame as",
-      GTK_WINDOW (gtk_widget_get_toplevel (button)), GTK_FILE_CHOOSER_ACTION_SAVE, 
-      GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
-      GTK_STOCK_SAVE, GTK_RESPONSE_ACCEPT, NULL);
-
-  if (gtk_dialog_run (GTK_DIALOG (dialog)) == GTK_RESPONSE_ACCEPT) {
-    int w, h;
-    cairo_t *cr;
-    cairo_surface_t *surface;
-
-    swfdec_player_get_image_size (player, &w, &h);
-    if (w == 0 || h == 0) {
-      return;
-    }
-    surface = cairo_svg_surface_create (
-	gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (dialog)),
-	w, h);
-    cr = cairo_create (surface);
-    cairo_surface_destroy (surface);
-    swfdec_player_render (player, cr, 0.0, 0.0, 0.0, 0.0);
-    cairo_show_page (cr);
-    cairo_destroy (cr);
-  }
-  gtk_widget_destroy (dialog);
-}
-#endif /* CAIRO_HAS_SVG_SURFACE */
-
-static void
-step_clicked_cb (GtkButton *button, SwfdecPlayerManager *manager)
-{
-  swfdec_player_manager_iterate (manager);
-}
-
-static void
-step_disable_cb (SwfdecPlayerManager *manager, GParamSpec *pspec, GtkWidget *widget)
-{
-  gtk_widget_set_sensitive (widget, !swfdec_player_manager_get_interrupted (manager));
-}
-
-static void
-select_scripts (GtkTreeSelection *select, SwfdecDebugScript *script)
-{
-  GtkTreeModel *model;
-  GtkTreeIter iter;
-
-  if (gtk_tree_selection_get_selected (select, &model, &iter)) {
-    SwfdecDebuggerScript *dscript;
-    gtk_tree_model_get (model, &iter, 0, &dscript, -1);
-    swfdec_debug_script_set_script (script, dscript);
-  } else {
-    swfdec_debug_script_set_script (script, NULL);
-  }
-}
-
-static void
-toggle_play_cb (SwfdecPlayerManager *manager, GParamSpec *pspec, GtkToggleButton *button)
-{
-  gtk_toggle_button_set_active (button,
-      swfdec_player_manager_get_playing (manager));
-}
-
-static void
-play_toggled_cb (GtkToggleButton *button, SwfdecPlayerManager *manager)
-{
-  swfdec_player_manager_set_playing (manager,
-      gtk_toggle_button_get_active (button));
-}
-
-static void
-entry_activate_cb (GtkEntry *entry, SwfdecPlayerManager *manager)
-{
-  const char *text = gtk_entry_get_text (entry);
-
-  if (text[0] == '\0')
-    return;
-
-  swfdec_player_manager_execute (manager, text);
-  gtk_editable_select_region (GTK_EDITABLE (entry), 0, -1);
-}
-
-static void
-message_display_cb (SwfdecPlayerManager *manager, guint type, const char *message, GtkTextView *view)
-{
-  GtkTextBuffer *buffer = gtk_text_view_get_buffer (view);
-  GtkTextIter iter;
-  GtkTextMark *mark;
-  const char *tag_name = "output";
-
-  if (type == 0)
-    tag_name = "input";
-  else if (type == 2)
-    tag_name = "error";
-
-  gtk_text_buffer_get_end_iter (buffer, &iter);
-  mark = gtk_text_buffer_get_mark (buffer, "end");
-  if (mark == NULL)
-    mark = gtk_text_buffer_create_mark (buffer, "end", &iter, FALSE);
-  if (gtk_text_buffer_get_char_count (buffer) > 0)
-    gtk_text_buffer_insert (buffer, &iter, "\n", 1);
-  gtk_text_buffer_insert_with_tags_by_name (buffer, &iter, message, -1, tag_name, NULL);
-  gtk_text_view_scroll_to_mark (view, mark, 0.0, TRUE, 0.0, 0.0);
-}
-
-static void
-interrupt_widget_cb (SwfdecPlayerManager *manager, GParamSpec *pspec, SwfdecGtkWidget *widget)
-{
-  swfdec_gtk_widget_set_interactive (widget,
-      !swfdec_player_manager_get_interrupted (manager));
-}
-
-static void
-select_scripts_cb (SwfdecPlayerManager *manager, GParamSpec *pspec, SwfdecDebugScripts *debug)
-{
-  GtkTreeModel *model;
-  GtkTreeIter iter;
-  SwfdecDebuggerScript *script;
-
-  if (!swfdec_player_manager_get_interrupted (manager))
-    return;
-
-  swfdec_player_manager_get_interrupt (manager, &script, NULL);
-  model = gtk_tree_view_get_model (GTK_TREE_VIEW (debug));
-  gtk_tree_model_get_iter_first (model, &iter);
-  do {
-    SwfdecDebuggerScript *cur;
-    gtk_tree_model_get (model, &iter, 0, &cur, -1);
-    if (cur == script) {
-      gtk_tree_selection_select_iter (
-	  gtk_tree_view_get_selection (GTK_TREE_VIEW (debug)),
-	  &iter);
-      return;
-    }
-  } while (gtk_tree_model_iter_next (model, &iter));
-  g_assert_not_reached ();
-}
-
-static void
-select_script_cb (SwfdecPlayerManager *manager, GParamSpec *pspec, SwfdecDebugScript *debug)
-{
-  GtkTreePath *path;
-  SwfdecDebuggerScript *script;
-  guint line;
-
-  if (!swfdec_player_manager_get_interrupted (manager))
-    return;
-
-  swfdec_player_manager_get_interrupt (manager, &script, &line);
-  swfdec_debug_script_set_script (debug, script);
-
-  path = gtk_tree_path_new_from_indices (line, -1);
-  gtk_tree_selection_select_path (gtk_tree_view_get_selection (GTK_TREE_VIEW (debug)),
-      path);
-  gtk_tree_view_scroll_to_cell (GTK_TREE_VIEW (debug), path, NULL, TRUE, 0.0, 0.5);
-  gtk_tree_path_free (path);
-}
-
-static void
-force_continue (SwfdecPlayerManager *manager, GParamSpec *pspec, gpointer unused)
-{
-  g_signal_stop_emission_by_name (manager, "notify::interrupted");
-  if (swfdec_player_manager_get_interrupted (manager))
-    swfdec_player_manager_continue (manager);
-}
-
-static void
-destroyed_cb (GtkWindow *window, SwfdecPlayerManager *manager)
-{
-  g_signal_connect (manager, "notify::interrupted", G_CALLBACK (force_continue), NULL);
-  if (swfdec_player_manager_get_interrupted (manager))
-    swfdec_player_manager_continue (manager);
-  g_object_unref (manager);
-  gtk_main_quit ();
-}
-
-static void
-disconnect_all (gpointer from, GObject *object)
-{
-  g_signal_handlers_disconnect_matched (from, G_SIGNAL_MATCH_DATA,
-      0, 0, NULL, NULL, object);
-  g_object_weak_unref (G_OBJECT (from), disconnect_all, object);
-}
-
-static void
-signal_auto_connect (gpointer object, const char *signal, GCallback closure, gpointer data)
-{
-  g_assert (G_IS_OBJECT (data));
-
-  g_signal_connect (object, signal, closure, data);
-  g_object_weak_ref (G_OBJECT (object), disconnect_all, data);
-  g_object_weak_ref (G_OBJECT (data), disconnect_all, object);
-}
-
-static GtkWidget *
-create_movieview (SwfdecPlayer *player)
-{
-  GtkWidget *treeview;
-  GtkTreeViewColumn *column;
-  GtkCellRenderer *renderer;
-  SwfdecDebugMovies *movies;
-
-  movies = swfdec_debug_movies_new (player);
-  treeview = gtk_tree_view_new_with_model (GTK_TREE_MODEL (movies));
-  renderer = gtk_cell_renderer_text_new ();
-
-  column = gtk_tree_view_column_new_with_attributes ("Movie", renderer,
-    "text", SWFDEC_DEBUG_MOVIES_COLUMN_NAME, NULL);
-  gtk_tree_view_column_set_resizable (column, TRUE);
-  gtk_tree_view_append_column (GTK_TREE_VIEW (treeview), column);
-
-  column = gtk_tree_view_column_new_with_attributes ("Type", renderer,
-    "text", SWFDEC_DEBUG_MOVIES_COLUMN_TYPE, NULL);
-  gtk_tree_view_column_set_resizable (column, TRUE);
-  gtk_tree_view_append_column (GTK_TREE_VIEW (treeview), column);
-
-  renderer = gtk_cell_renderer_text_new ();
-  column = gtk_tree_view_column_new_with_attributes ("Depth", renderer,
-    "text", SWFDEC_DEBUG_MOVIES_COLUMN_DEPTH, NULL);
-  gtk_tree_view_column_set_resizable (column, TRUE);
-  gtk_tree_view_append_column (GTK_TREE_VIEW (treeview), column);
-
-  return treeview;
-}
-
-static void
-view_swf (SwfdecPlayer *player, gboolean use_image)
-{
-  SwfdecPlayerManager *manager;
-  GtkWidget *window, *widget, *vpaned, *hpaned, *vbox, *hbox, *scroll, *scripts;
-
-  manager = swfdec_player_manager_new (player);
-  window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
-  
-  hpaned = gtk_hpaned_new ();
-  gtk_container_add (GTK_CONTAINER (window), hpaned);
-
-  /* left side */
-  vpaned = gtk_vpaned_new ();
-  gtk_paned_add1 (GTK_PANED (hpaned), vpaned);
-
-  scroll = gtk_scrolled_window_new (NULL, NULL);
-  gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scroll), 
-      GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
-  gtk_paned_add1 (GTK_PANED (vpaned), scroll);
-  widget = create_movieview (player);
-  gtk_container_add (GTK_CONTAINER (scroll), widget);
-
-  vbox = gtk_vbox_new (FALSE, 3);
-  gtk_paned_add2 (GTK_PANED (vpaned), vbox);
-
-  scroll = gtk_scrolled_window_new (NULL, NULL);
-  gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scroll), 
-      GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
-  gtk_box_pack_start (GTK_BOX (vbox), scroll, TRUE, TRUE, 0);
-  scripts = swfdec_debug_scripts_new (SWFDEC_DEBUGGER (player));
-  gtk_container_add (GTK_CONTAINER (scroll), scripts);
-  signal_auto_connect (manager, "notify::interrupted", G_CALLBACK (select_scripts_cb), scripts);
-
-  widget = gtk_toggle_button_new_with_mnemonic ("_Play");
-  signal_auto_connect (widget, "toggled", G_CALLBACK (play_toggled_cb), manager);
-  signal_auto_connect (manager, "notify::playing", G_CALLBACK (toggle_play_cb), widget);
-  gtk_box_pack_end (GTK_BOX (vbox), widget, FALSE, TRUE, 0);
-  
-  widget = gtk_button_new_from_stock ("_Step");
-  signal_auto_connect (widget, "clicked", G_CALLBACK (step_clicked_cb), manager);
-  signal_auto_connect (manager, "notify::interrupted", G_CALLBACK (step_disable_cb), widget);
-  gtk_box_pack_end (GTK_BOX (vbox), widget, FALSE, TRUE, 0);
-
-#ifdef CAIRO_HAS_SVG_SURFACE
-  widget = gtk_button_new_with_mnemonic ("_Save frame");
-  g_signal_connect (widget, "clicked", G_CALLBACK (save_to_svg), player);
-  gtk_box_pack_end (GTK_BOX (vbox), widget, FALSE, TRUE, 0);
-#endif
-
-  /* right side */
-  vbox = gtk_vbox_new (FALSE, 3);
-  gtk_paned_add2 (GTK_PANED (hpaned), vbox);
-
-  widget = swfdec_debug_widget_new (player);
-  if (use_image)
-    swfdec_gtk_widget_set_renderer (SWFDEC_GTK_WIDGET (widget), CAIRO_SURFACE_TYPE_IMAGE);
-  gtk_box_pack_start (GTK_BOX (vbox), widget, FALSE, TRUE, 0);
-  signal_auto_connect (manager, "notify::interrupted", G_CALLBACK (interrupt_widget_cb), widget);
-
-  hbox = gtk_hbox_new (FALSE, 3);
-  gtk_box_pack_start (GTK_BOX (vbox), hbox, TRUE, TRUE, 0);
-
-  scroll = gtk_scrolled_window_new (NULL, NULL);
-  gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scroll), 
-      GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
-  gtk_box_pack_start (GTK_BOX (hbox), scroll, TRUE, TRUE, 0);
-  widget = swfdec_debug_script_new (SWFDEC_DEBUGGER (player));
-  gtk_container_add (GTK_CONTAINER (scroll), widget);
-  g_signal_connect (gtk_tree_view_get_selection (GTK_TREE_VIEW (scripts)),
-      "changed", G_CALLBACK (select_scripts), widget);
-  signal_auto_connect (manager, "notify::interrupted", G_CALLBACK (select_script_cb), widget);
-
-  scroll = gtk_scrolled_window_new (NULL, NULL);
-  gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scroll), 
-      GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
-  gtk_box_pack_start (GTK_BOX (hbox), scroll, TRUE, TRUE, 0);
-  widget = swfdec_debug_stack_new (manager);
-  gtk_container_add (GTK_CONTAINER (scroll), widget);
-
-  scroll = gtk_scrolled_window_new (NULL, NULL);
-  gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scroll), 
-      GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
-  gtk_box_pack_start (GTK_BOX (vbox), scroll, TRUE, TRUE, 0);
-  widget = gtk_text_view_new ();
-  gtk_text_view_set_editable (GTK_TEXT_VIEW (widget), FALSE);
-  gtk_text_view_set_wrap_mode (GTK_TEXT_VIEW (widget), GTK_WRAP_WORD_CHAR);
-  gtk_text_buffer_create_tag (gtk_text_view_get_buffer (GTK_TEXT_VIEW (widget)),
-      "error", "foreground", "red", "left-margin", 15, NULL);
-  gtk_text_buffer_create_tag (gtk_text_view_get_buffer (GTK_TEXT_VIEW (widget)),
-      "input", "foreground", "dark grey", NULL);
-  gtk_text_buffer_create_tag (gtk_text_view_get_buffer (GTK_TEXT_VIEW (widget)),
-      "output", "left-margin", 15, NULL);
-  signal_auto_connect (manager, "message", G_CALLBACK (message_display_cb), widget);
-  gtk_container_add (GTK_CONTAINER (scroll), widget);
-
-  widget = gtk_entry_new ();
-  signal_auto_connect (widget, "activate", G_CALLBACK (entry_activate_cb), manager);
-  gtk_box_pack_start (GTK_BOX (vbox), widget, FALSE, TRUE, 0);
-  gtk_widget_grab_focus (widget);
-
-  g_signal_connect (window, "destroy", G_CALLBACK (destroyed_cb), manager);
-  gtk_widget_show_all (window);
-}
-
-static void
-do_break_cb (SwfdecDebugger *debugger, SwfdecDebuggerScript *script, gpointer unused)
-{
-  /* no need tobreak on scripts that don't do anything, so no special case needed */
-  if (script->n_commands > 0)
-    swfdec_debugger_set_breakpoint (debugger, script, 0);
-}
-
-static gboolean
-add_variables (gpointer player)
-{
-  const char *variables = g_object_get_data (player, "variables");
-  SwfdecLoader *loader = g_object_get_data (player, "loader");
-
-  swfdec_player_set_loader_with_variables (player, loader, variables);
-  if (!swfdec_player_is_initialized (player)) {
-    g_printerr ("File \"%s\" is not a file Swfdec can play\n", 
-	swfdec_url_get_url (swfdec_loader_get_url (loader)));
-    g_object_unref (player);
-    gtk_main_quit ();
-    return FALSE;
-  }
-  return FALSE;
-}
-
-int 
-main (int argc, char *argv[])
-{
-  gboolean do_break = FALSE;
-  SwfdecLoader *loader;
-  SwfdecPlayer *player;
-  GError *error = NULL;
-  gboolean use_image = FALSE;
-  char *variables = NULL;
-
-  GOptionEntry options[] = {
-    { "image", 'i', 0, G_OPTION_ARG_NONE, &use_image, "use an intermediate image surface for drawing", NULL },
-    { "break", 'b', 0, G_OPTION_ARG_NONE, &do_break, "break at the beginning of every script", NULL },
-    { "variables", 'v', 0, G_OPTION_ARG_STRING, &variables, "variables to pass to player", "VAR=NAME[&VAR=NAME..]" },
-    { NULL }
-  };
-  GOptionContext *ctx;
-
-  ctx = g_option_context_new ("");
-  g_option_context_add_main_entries (ctx, options, "options");
-  g_option_context_add_group (ctx, gtk_get_option_group (TRUE));
-  g_option_context_parse (ctx, &argc, &argv, &error);
-  g_option_context_free (ctx);
-
-  if (error) {
-    g_printerr ("Error parsing command line arguments: %s\n", error->message);
-    g_error_free (error);
-    return 1;
-  }
-
-  swfdec_init ();
-
-  if (argc < 2) {
-    g_printerr ("Usage: %s [OPTIONS] filename\n", argv[0]);
-    return 1;
-  }
-
-  loader = swfdec_file_loader_new (argv[1]);
-  if (loader->error) {
-    g_printerr ("Couldn't open file \"%s\": %s\n", argv[1], loader->error);
-    g_object_unref (loader);
-    return 1;
-  }
-  player = swfdec_debugger_new ();
-  if (do_break)
-    g_signal_connect (player, "script-added", G_CALLBACK (do_break_cb), NULL);
-  view_swf (player, use_image);
-  g_object_set_data (G_OBJECT (player), "loader", loader);
-  g_object_set_data (G_OBJECT (player), "variables", variables);
-  g_idle_add_full (G_PRIORITY_HIGH, add_variables, player, NULL);
-
-  gtk_main ();
-
-  player = NULL;
-  return 0;
-}
-
diff-tree 02eea3ef446151ed742f1f1689f3119aa9a609de (from ef0772d72cd948c2511f8e6b7e07393f803f31fc)
Author: Benjamin Otte <otte at gnome.org>
Date:   Tue Aug 28 15:05:19 2007 +0200

    hook in ViviWidget and make it work

diff --git a/vivified/ui/vivi_player.c b/vivified/ui/vivi_player.c
index 6fcfee2..e8134b2 100644
--- a/vivified/ui/vivi_player.c
+++ b/vivified/ui/vivi_player.c
@@ -23,36 +23,14 @@
 
 #include <libswfdec-gtk/swfdec-gtk.h>
 #include "vivi_vivi_docklet.h"
-
-static void
-vivi_player_notify_app (ViviApplication *app, GParamSpec *pspec, SwfdecGtkWidget *player)
-{
-  if (g_str_equal (pspec->name, "player")) {
-    swfdec_gtk_widget_set_player (player, vivi_application_get_player (app));
-  } else if (g_str_equal (pspec->name, "interrupted")) {
-    swfdec_gtk_widget_set_interactive (player, !vivi_application_get_interrupted (app));
-  }
-}
+#include "vivi_widget.h"
 
 void
 vivi_player_application_set (ViviViviDocklet *docklet, ViviApplication *app);
 void
 vivi_player_application_set (ViviViviDocklet *docklet, ViviApplication *app)
 {
-  SwfdecGtkWidget *widget = SWFDEC_GTK_WIDGET (vivi_vivi_docklet_find_widget_by_type (docklet, SWFDEC_TYPE_GTK_WIDGET));
-
-  g_signal_connect (app, "notify", G_CALLBACK (vivi_player_notify_app), widget);
-  swfdec_gtk_widget_set_player (widget, vivi_application_get_player (app));
-  swfdec_gtk_widget_set_interactive (widget, !vivi_application_get_interrupted (app));
-}
-
-void
-vivi_player_application_unset (ViviViviDocklet *docklet, ViviApplication *app);
-void
-vivi_player_application_unset (ViviViviDocklet *docklet, ViviApplication *app)
-{
-  SwfdecGtkWidget *widget = SWFDEC_GTK_WIDGET (vivi_vivi_docklet_find_widget_by_type (docklet, SWFDEC_TYPE_GTK_WIDGET));
+  ViviWidget *widget = VIVI_WIDGET (vivi_vivi_docklet_find_widget_by_type (docklet, VIVI_TYPE_WIDGET));
 
-  g_signal_handlers_disconnect_by_func (app, vivi_player_notify_app, widget);
+  vivi_widget_set_application (widget, app);
 }
-
diff --git a/vivified/ui/vivi_player.xml b/vivified/ui/vivi_player.xml
index bb1c630..1c63819 100644
--- a/vivified/ui/vivi_player.xml
+++ b/vivified/ui/vivi_player.xml
@@ -2,13 +2,12 @@
   <object class="ViviViviDocklet" id="player">
     <property name="title">Player</property>
     <signal name="application-set" handler="vivi_player_application_set" />
-    <signal name="application-unset" handler="vivi_player_application_unset" />
     <child>
       <object class="GtkAlignment" id="1">
 	<property name="xscale">0.0</property>
 	<property name="yscale">0.0</property>
 	<child>
-	  <object class="SwfdecGtkWidget" id="2">
+	  <object class="ViviWidget" id="2">
 	  </object>
 	</child>
       </object>
diff --git a/vivified/ui/vivi_widget.c b/vivified/ui/vivi_widget.c
index 7d3901c..fa9c2ac 100644
--- a/vivified/ui/vivi_widget.c
+++ b/vivified/ui/vivi_widget.c
@@ -24,9 +24,44 @@
 #include <math.h>
 #include "vivi_widget.h"
 
+enum {
+  PROP_0,
+  PROP_APP
+};
 
 G_DEFINE_TYPE (ViviWidget, vivi_widget, SWFDEC_TYPE_GTK_WIDGET)
 
+static void
+vivi_widget_get_property (GObject *object, guint param_id, GValue *value, 
+    GParamSpec * pspec)
+{
+  ViviWidget *widget = VIVI_WIDGET (object);
+  
+  switch (param_id) {
+    case PROP_APP:
+      g_value_set_object (value, widget->app);
+      break;
+    default:
+      G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);
+      break;
+  }
+}
+
+static void
+vivi_widget_set_property (GObject *object, guint param_id, const GValue *value,
+    GParamSpec *pspec)
+{
+  ViviWidget *widget = VIVI_WIDGET (object);
+  
+  switch (param_id) {
+    case PROP_APP:
+      vivi_widget_set_application (widget, VIVI_APPLICATION (g_value_get_object (value)));
+      break;
+    default:
+      G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);
+      break;
+  }
+}
 
 static gboolean
 vivi_widget_motion_notify (GtkWidget *gtkwidget, GdkEventMotion *event)
@@ -118,27 +153,12 @@ vivi_widget_expose (GtkWidget *gtkwidget
 }
 
 static void
-vivi_widget_app_notify (ViviApplication *app, GParamSpec *pspec, ViviWidget *widget)
-{
-  if (g_str_equal (pspec->name, "interrupted")) {
-    swfdec_gtk_widget_set_interactive (SWFDEC_GTK_WIDGET (widget),
-	vivi_application_get_interrupted (widget->app));
-  } else if (g_str_equal (pspec->name, "player")) {
-    swfdec_gtk_widget_set_player (SWFDEC_GTK_WIDGET (widget),
-	vivi_application_get_player (widget->app));
-  }
-}
-
-static void
 vivi_widget_dispose (GObject *object)
 {
   ViviWidget *widget = VIVI_WIDGET (object);
 
-  if (widget->app) {
-    g_signal_handlers_disconnect_by_func (widget->app, vivi_widget_app_notify, widget);
-    g_object_unref (widget->app);
-    widget->app = NULL;
-  }
+  vivi_widget_set_application (widget, NULL);
+
   G_OBJECT_CLASS (vivi_widget_parent_class)->dispose (object);
 }
 
@@ -149,6 +169,12 @@ vivi_widget_class_init (ViviWidgetClass 
   GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (g_class);
 
   object_class->dispose = vivi_widget_dispose;
+  object_class->get_property = vivi_widget_get_property;
+  object_class->set_property = vivi_widget_set_property;
+
+  g_object_class_install_property (object_class, PROP_APP,
+      g_param_spec_object ("application", "application", "application that is playing",
+	  VIVI_TYPE_APPLICATION, G_PARAM_READWRITE));
 
   widget_class->expose_event = vivi_widget_expose;
   widget_class->button_press_event = vivi_widget_button_press;
@@ -170,9 +196,44 @@ vivi_widget_new (ViviApplication *app)
   g_return_val_if_fail (VIVI_IS_APPLICATION (app), NULL);
 
   widget = g_object_new (VIVI_TYPE_WIDGET, "player", vivi_application_get_player (app), NULL);
-  widget->app = g_object_ref (app);
-  g_signal_connect (app, "notify", G_CALLBACK (vivi_widget_app_notify), widget);
 
   return GTK_WIDGET (widget);
 }
 
+static void
+vivi_widget_app_notify (ViviApplication *app, GParamSpec *pspec, ViviWidget *widget)
+{
+  if (g_str_equal (pspec->name, "interrupted")) {
+    swfdec_gtk_widget_set_interactive (SWFDEC_GTK_WIDGET (widget),
+	!vivi_application_get_interrupted (widget->app));
+  } else if (g_str_equal (pspec->name, "player")) {
+    swfdec_gtk_widget_set_player (SWFDEC_GTK_WIDGET (widget),
+	vivi_application_get_player (widget->app));
+  }
+}
+
+void
+vivi_widget_set_application (ViviWidget *widget, ViviApplication *app)
+{
+  g_return_if_fail (VIVI_IS_WIDGET (widget));
+  g_return_if_fail (app == NULL || VIVI_IS_APPLICATION (app));
+
+  if (widget->app) {
+    g_signal_handlers_disconnect_by_func (widget->app, vivi_widget_app_notify, widget);
+    g_object_unref (widget->app);
+  }
+  widget->app = app;
+  if (app) {
+    g_object_ref (app);
+    g_signal_connect (app, "notify", G_CALLBACK (vivi_widget_app_notify), widget);
+    swfdec_gtk_widget_set_interactive (SWFDEC_GTK_WIDGET (widget),
+	!vivi_application_get_interrupted (app));
+    swfdec_gtk_widget_set_player (SWFDEC_GTK_WIDGET (widget),
+	vivi_application_get_player (app));
+  } else {
+    swfdec_gtk_widget_set_interactive (SWFDEC_GTK_WIDGET (widget), TRUE);
+    swfdec_gtk_widget_set_player (SWFDEC_GTK_WIDGET (widget), NULL);
+  }
+  g_object_notify (G_OBJECT (widget), "application");
+}
+
diff --git a/vivified/ui/vivi_widget.h b/vivified/ui/vivi_widget.h
index d6097d4..b861ed1 100644
--- a/vivified/ui/vivi_widget.h
+++ b/vivified/ui/vivi_widget.h
@@ -54,6 +54,9 @@ GType		vivi_widget_get_type		(void);
 
 GtkWidget *	vivi_widget_new			(ViviApplication *	app);
 
+void		vivi_widget_set_application	(ViviWidget *		widget,
+						 ViviApplication *	app);
+
 
 G_END_DECLS
 #endif
diff-tree ef0772d72cd948c2511f8e6b7e07393f803f31fc (from 7d7b5b829997da04b885cff8ff106792b818b63c)
Author: Benjamin Otte <otte at gnome.org>
Date:   Tue Aug 28 14:53:18 2007 +0200

    port to ViviApplication framework

diff --git a/vivified/ui/vivi_widget.c b/vivified/ui/vivi_widget.c
index 2b23ec6..7d3901c 100644
--- a/vivified/ui/vivi_widget.c
+++ b/vivified/ui/vivi_widget.c
@@ -118,10 +118,27 @@ vivi_widget_expose (GtkWidget *gtkwidget
 }
 
 static void
+vivi_widget_app_notify (ViviApplication *app, GParamSpec *pspec, ViviWidget *widget)
+{
+  if (g_str_equal (pspec->name, "interrupted")) {
+    swfdec_gtk_widget_set_interactive (SWFDEC_GTK_WIDGET (widget),
+	vivi_application_get_interrupted (widget->app));
+  } else if (g_str_equal (pspec->name, "player")) {
+    swfdec_gtk_widget_set_player (SWFDEC_GTK_WIDGET (widget),
+	vivi_application_get_player (widget->app));
+  }
+}
+
+static void
 vivi_widget_dispose (GObject *object)
 {
-  //SwfdecWidget *widget = SWFDEC_WIDGET (object);
+  ViviWidget *widget = VIVI_WIDGET (object);
 
+  if (widget->app) {
+    g_signal_handlers_disconnect_by_func (widget->app, vivi_widget_app_notify, widget);
+    g_object_unref (widget->app);
+    widget->app = NULL;
+  }
   G_OBJECT_CLASS (vivi_widget_parent_class)->dispose (object);
 }
 
@@ -146,10 +163,16 @@ vivi_widget_init (ViviWidget *widget)
 }
 
 GtkWidget *
-vivi_widget_new (SwfdecPlayer *player)
+vivi_widget_new (ViviApplication *app)
 {
-  g_return_val_if_fail (SWFDEC_IS_PLAYER (player), NULL);
+  ViviWidget *widget;
+
+  g_return_val_if_fail (VIVI_IS_APPLICATION (app), NULL);
+
+  widget = g_object_new (VIVI_TYPE_WIDGET, "player", vivi_application_get_player (app), NULL);
+  widget->app = g_object_ref (app);
+  g_signal_connect (app, "notify", G_CALLBACK (vivi_widget_app_notify), widget);
 
-  return g_object_new (VIVI_TYPE_WIDGET, "player", player, NULL);
+  return GTK_WIDGET (widget);
 }
 
diff --git a/vivified/ui/vivi_widget.h b/vivified/ui/vivi_widget.h
index 5348a33..d6097d4 100644
--- a/vivified/ui/vivi_widget.h
+++ b/vivified/ui/vivi_widget.h
@@ -21,6 +21,7 @@
 #define _VIVI_WIDGET_H_
 
 #include <libswfdec-gtk/swfdec-gtk.h>
+#include <vivified/core/vivified-core.h>
 
 G_BEGIN_DECLS
 
@@ -37,6 +38,8 @@ struct _ViviWidget
 {
   SwfdecGtkWidget     	widget;
 
+  ViviApplication *	app;
+
   int			x;
   int			y;
   int			button;
@@ -49,7 +52,7 @@ struct _ViviWidgetClass
 
 GType		vivi_widget_get_type		(void);
 
-GtkWidget *	vivi_widget_new			(SwfdecPlayer *	player);
+GtkWidget *	vivi_widget_new			(ViviApplication *	app);
 
 
 G_END_DECLS
diff-tree 7d7b5b829997da04b885cff8ff106792b818b63c (from f9d06c40d6ce63504d5f2ae79a042373d07da9ce)
Author: Benjamin Otte <otte at gnome.org>
Date:   Tue Aug 28 14:45:15 2007 +0200

    move the debug widget here

diff --git a/player/swfdec_debug_widget.c b/player/swfdec_debug_widget.c
deleted file mode 100644
index 65cfa4d..0000000
--- a/player/swfdec_debug_widget.c
+++ /dev/null
@@ -1,155 +0,0 @@
-/* Swfdec
- * Copyright (C) 2006 Benjamin Otte <otte at gnome.org>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- * 
- * This library 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.  See the GNU
- * Lesser General Public License for more details.
- * 
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, 
- * Boston, MA  02110-1301  USA
- */
-
-#ifdef HAVE_CONFIG_H
-#include "config.h"
-#endif
-
-#include <math.h>
-#include "swfdec_debug_widget.h"
-
-
-G_DEFINE_TYPE (SwfdecDebugWidget, swfdec_debug_widget, SWFDEC_TYPE_GTK_WIDGET)
-
-
-static gboolean
-swfdec_debug_widget_motion_notify (GtkWidget *gtkwidget, GdkEventMotion *event)
-{
-  return FALSE;
-}
-
-static gboolean
-swfdec_debug_widget_leave_notify (GtkWidget *gtkwidget, GdkEventCrossing *event)
-{
-  return FALSE;
-}
-
-#define RADIUS 10
-static void
-swfdec_debug_widget_invalidate_click_area (SwfdecDebugWidget *widget)
-{
-  GtkWidget *gtkwidget = GTK_WIDGET (widget);
-  GdkRectangle rect = { widget->x - RADIUS, widget->y - RADIUS, 2 * RADIUS, 2 * RADIUS };
-
-  gdk_window_invalidate_rect (gtkwidget->window, &rect, FALSE);
-}
-
-static gboolean
-swfdec_debug_widget_button_press (GtkWidget *gtkwidget, GdkEventButton *event)
-{
-  SwfdecGtkWidget *widget = SWFDEC_GTK_WIDGET (gtkwidget);
-  SwfdecDebugWidget *debug = SWFDEC_DEBUG_WIDGET (gtkwidget);
-
-  if (event->window != gtkwidget->window)
-    return FALSE;
-
-  if (event->button == 1 && swfdec_gtk_widget_get_interactive (widget)) {
-    SwfdecPlayer *player = swfdec_gtk_widget_get_player (widget);
-    switch (event->type) {
-      case GDK_BUTTON_PRESS:
-	swfdec_debug_widget_invalidate_click_area (debug);
-	debug->x = event->x;
-	debug->y = event->y;
-	swfdec_player_handle_mouse (player, debug->x, debug->y, debug->button);
-	swfdec_debug_widget_invalidate_click_area (debug);
-	break;
-      case GDK_2BUTTON_PRESS:
-	debug->button = 1 - debug->button;
-	swfdec_player_handle_mouse (player, debug->x, debug->y, debug->button);
-	swfdec_debug_widget_invalidate_click_area (debug);
-	break;
-      default:
-	break;
-    }
-  }
-  return FALSE;
-}
-
-static gboolean
-swfdec_debug_widget_button_release (GtkWidget *gtkwidget, GdkEventButton *event)
-{
-  return FALSE;
-}
-
-static gboolean
-swfdec_debug_widget_expose (GtkWidget *gtkwidget, GdkEventExpose *event)
-{
-  SwfdecDebugWidget *debug = SWFDEC_DEBUG_WIDGET (gtkwidget);
-  cairo_t *cr;
-
-  if (event->window != gtkwidget->window)
-    return FALSE;
-
-  if (GTK_WIDGET_CLASS (swfdec_debug_widget_parent_class)->expose_event (gtkwidget, event))
-    return TRUE;
-
-  cr = gdk_cairo_create (gtkwidget->window);
-
-  cairo_arc (cr, debug->x, debug->y, RADIUS - 1.5, 0.0, 2 * G_PI);
-  if (debug->button) {
-    cairo_set_source_rgba (cr, 0.25, 0.25, 0.25, 0.5);
-    cairo_fill_preserve (cr);
-  }
-  cairo_set_line_width (cr, 3);
-  cairo_set_source_rgb (cr, 1.0, 1.0, 1.0);
-  cairo_stroke_preserve (cr);
-  cairo_set_line_width (cr, 1);
-  cairo_set_source_rgb (cr, 0.0, 0.0, 0.0);
-  cairo_stroke (cr);
-  cairo_destroy (cr);
-
-  return FALSE;
-}
-
-static void
-swfdec_debug_widget_dispose (GObject *object)
-{
-  //SwfdecWidget *widget = SWFDEC_WIDGET (object);
-
-  G_OBJECT_CLASS (swfdec_debug_widget_parent_class)->dispose (object);
-}
-
-static void
-swfdec_debug_widget_class_init (SwfdecDebugWidgetClass * g_class)
-{
-  GObjectClass *object_class = G_OBJECT_CLASS (g_class);
-  GtkWidgetClass *debug_widget_class = GTK_WIDGET_CLASS (g_class);
-
-  object_class->dispose = swfdec_debug_widget_dispose;
-
-  debug_widget_class->expose_event = swfdec_debug_widget_expose;
-  debug_widget_class->button_press_event = swfdec_debug_widget_button_press;
-  debug_widget_class->button_release_event = swfdec_debug_widget_button_release;
-  debug_widget_class->motion_notify_event = swfdec_debug_widget_motion_notify;
-  debug_widget_class->leave_notify_event = swfdec_debug_widget_leave_notify;
-}
-
-static void
-swfdec_debug_widget_init (SwfdecDebugWidget *widget)
-{
-}
-
-GtkWidget *
-swfdec_debug_widget_new (SwfdecPlayer *player)
-{
-  g_return_val_if_fail (SWFDEC_IS_PLAYER (player), NULL);
-
-  return g_object_new (SWFDEC_TYPE_DEBUG_WIDGET, "player", player, NULL);
-}
-
diff --git a/player/swfdec_debug_widget.h b/player/swfdec_debug_widget.h
deleted file mode 100644
index b00117d..0000000
--- a/player/swfdec_debug_widget.h
+++ /dev/null
@@ -1,55 +0,0 @@
-/* Swfdec
- * Copyright (C) 2006 Benjamin Otte <otte at gnome.org>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- * 
- * This library 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.  See the GNU
- * Lesser General Public License for more details.
- * 
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, 
- * Boston, MA  02110-1301  USA
- */
-
-#ifndef _SWFDEC_DEBUG_WIDGET_H_
-#define _SWFDEC_DEBUG_WIDGET_H_
-
-#include <libswfdec-gtk/swfdec_gtk_widget.h>
-
-G_BEGIN_DECLS
-
-typedef struct _SwfdecDebugWidget SwfdecDebugWidget;
-typedef struct _SwfdecDebugWidgetClass SwfdecDebugWidgetClass;
-
-#define SWFDEC_TYPE_DEBUG_WIDGET                    (swfdec_debug_widget_get_type())
-#define SWFDEC_IS_DEBUG_WIDGET(obj)                 (G_TYPE_CHECK_INSTANCE_TYPE ((obj), SWFDEC_TYPE_DEBUG_WIDGET))
-#define SWFDEC_IS_DEBUG_WIDGET_CLASS(klass)         (G_TYPE_CHECK_CLASS_TYPE ((klass), SWFDEC_TYPE_DEBUG_WIDGET))
-#define SWFDEC_DEBUG_WIDGET(obj)                    (G_TYPE_CHECK_INSTANCE_CAST ((obj), SWFDEC_TYPE_DEBUG_WIDGET, SwfdecDebugWidget))
-#define SWFDEC_DEBUG_WIDGET_CLASS(klass)            (G_TYPE_CHECK_CLASS_CAST ((klass), SWFDEC_TYPE_DEBUG_WIDGET, SwfdecDebugWidgetClass))
-
-struct _SwfdecDebugWidget
-{
-  SwfdecGtkWidget     	widget;
-
-  int			x;
-  int			y;
-  int			button;
-};
-
-struct _SwfdecDebugWidgetClass
-{
-  SwfdecGtkWidgetClass	debug_widget_class;
-};
-
-GType		swfdec_debug_widget_get_type		(void);
-
-GtkWidget *	swfdec_debug_widget_new			(SwfdecPlayer *	player);
-
-G_END_DECLS
-#endif
diff --git a/vivified/ui/Makefile.am b/vivified/ui/Makefile.am
index c88facd..d9d0c15 100644
--- a/vivified/ui/Makefile.am
+++ b/vivified/ui/Makefile.am
@@ -12,9 +12,11 @@ vivified_SOURCES = \
 	vivi_movies.c \
 	vivi_player.c \
 	vivi_vivi_docklet.c \
+	vivi_widget.c \
 	main.c
 
 noinst_HEADERS = \
 	vivi_movie_list.h \
+	vivi_widget.h \
 	vivi_vivi_docklet.h
 
diff --git a/vivified/ui/vivi_widget.c b/vivified/ui/vivi_widget.c
new file mode 100644
index 0000000..2b23ec6
--- /dev/null
+++ b/vivified/ui/vivi_widget.c
@@ -0,0 +1,155 @@
+/* Swfdec
+ * Copyright (C) 2006-2007 Benjamin Otte <otte at gnome.org>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ * 
+ * This library 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.  See the GNU
+ * Lesser General Public License for more details.
+ * 
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, 
+ * Boston, MA  02110-1301  USA
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <math.h>
+#include "vivi_widget.h"
+
+
+G_DEFINE_TYPE (ViviWidget, vivi_widget, SWFDEC_TYPE_GTK_WIDGET)
+
+
+static gboolean
+vivi_widget_motion_notify (GtkWidget *gtkwidget, GdkEventMotion *event)
+{
+  return FALSE;
+}
+
+static gboolean
+vivi_widget_leave_notify (GtkWidget *gtkwidget, GdkEventCrossing *event)
+{
+  return FALSE;
+}
+
+#define RADIUS 10
+static void
+vivi_widget_invalidate_click_area (ViviWidget *widget)
+{
+  GtkWidget *gtkwidget = GTK_WIDGET (widget);
+  GdkRectangle rect = { widget->x - RADIUS, widget->y - RADIUS, 2 * RADIUS, 2 * RADIUS };
+
+  gdk_window_invalidate_rect (gtkwidget->window, &rect, FALSE);
+}
+
+static gboolean
+vivi_widget_button_press (GtkWidget *gtkwidget, GdkEventButton *event)
+{
+  SwfdecGtkWidget *widget = SWFDEC_GTK_WIDGET (gtkwidget);
+  ViviWidget *debug = VIVI_WIDGET (gtkwidget);
+
+  if (event->window != gtkwidget->window)
+    return FALSE;
+
+  if (event->button == 1 && swfdec_gtk_widget_get_interactive (widget)) {
+    SwfdecPlayer *player = swfdec_gtk_widget_get_player (widget);
+    switch (event->type) {
+      case GDK_BUTTON_PRESS:
+	vivi_widget_invalidate_click_area (debug);
+	debug->x = event->x;
+	debug->y = event->y;
+	swfdec_player_handle_mouse (player, debug->x, debug->y, debug->button);
+	vivi_widget_invalidate_click_area (debug);
+	break;
+      case GDK_2BUTTON_PRESS:
+	debug->button = 1 - debug->button;
+	swfdec_player_handle_mouse (player, debug->x, debug->y, debug->button);
+	vivi_widget_invalidate_click_area (debug);
+	break;
+      default:
+	break;
+    }
+  }
+  return FALSE;
+}
+
+static gboolean
+vivi_widget_button_release (GtkWidget *gtkwidget, GdkEventButton *event)
+{
+  return FALSE;
+}
+
+static gboolean
+vivi_widget_expose (GtkWidget *gtkwidget, GdkEventExpose *event)
+{
+  ViviWidget *debug = VIVI_WIDGET (gtkwidget);
+  cairo_t *cr;
+
+  if (event->window != gtkwidget->window)
+    return FALSE;
+
+  if (GTK_WIDGET_CLASS (vivi_widget_parent_class)->expose_event (gtkwidget, event))
+    return TRUE;
+
+  cr = gdk_cairo_create (gtkwidget->window);
+
+  cairo_arc (cr, debug->x, debug->y, RADIUS - 1.5, 0.0, 2 * G_PI);
+  if (debug->button) {
+    cairo_set_source_rgba (cr, 0.25, 0.25, 0.25, 0.5);
+    cairo_fill_preserve (cr);
+  }
+  cairo_set_line_width (cr, 3);
+  cairo_set_source_rgb (cr, 1.0, 1.0, 1.0);
+  cairo_stroke_preserve (cr);
+  cairo_set_line_width (cr, 1);
+  cairo_set_source_rgb (cr, 0.0, 0.0, 0.0);
+  cairo_stroke (cr);
+  cairo_destroy (cr);
+
+  return FALSE;
+}
+
+static void
+vivi_widget_dispose (GObject *object)
+{
+  //SwfdecWidget *widget = SWFDEC_WIDGET (object);
+
+  G_OBJECT_CLASS (vivi_widget_parent_class)->dispose (object);
+}
+
+static void
+vivi_widget_class_init (ViviWidgetClass * g_class)
+{
+  GObjectClass *object_class = G_OBJECT_CLASS (g_class);
+  GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (g_class);
+
+  object_class->dispose = vivi_widget_dispose;
+
+  widget_class->expose_event = vivi_widget_expose;
+  widget_class->button_press_event = vivi_widget_button_press;
+  widget_class->button_release_event = vivi_widget_button_release;
+  widget_class->motion_notify_event = vivi_widget_motion_notify;
+  widget_class->leave_notify_event = vivi_widget_leave_notify;
+}
+
+static void
+vivi_widget_init (ViviWidget *widget)
+{
+}
+
+GtkWidget *
+vivi_widget_new (SwfdecPlayer *player)
+{
+  g_return_val_if_fail (SWFDEC_IS_PLAYER (player), NULL);
+
+  return g_object_new (VIVI_TYPE_WIDGET, "player", player, NULL);
+}
+
diff --git a/vivified/ui/vivi_widget.h b/vivified/ui/vivi_widget.h
new file mode 100644
index 0000000..5348a33
--- /dev/null
+++ b/vivified/ui/vivi_widget.h
@@ -0,0 +1,56 @@
+/* Vivi
+ * Copyright (C) 2006-2007 Benjamin Otte <otte at gnome.org>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ * 
+ * This library 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.  See the GNU
+ * Lesser General Public License for more details.
+ * 
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, 
+ * Boston, MA  02110-1301  USA
+ */
+
+#ifndef _VIVI_WIDGET_H_
+#define _VIVI_WIDGET_H_
+
+#include <libswfdec-gtk/swfdec-gtk.h>
+
+G_BEGIN_DECLS
+
+typedef struct _ViviWidget ViviWidget;
+typedef struct _ViviWidgetClass ViviWidgetClass;
+
+#define VIVI_TYPE_WIDGET                    (vivi_widget_get_type())
+#define VIVI_IS_WIDGET(obj)                 (G_TYPE_CHECK_INSTANCE_TYPE ((obj), VIVI_TYPE_WIDGET))
+#define VIVI_IS_WIDGET_CLASS(klass)         (G_TYPE_CHECK_CLASS_TYPE ((klass), VIVI_TYPE_WIDGET))
+#define VIVI_WIDGET(obj)                    (G_TYPE_CHECK_INSTANCE_CAST ((obj), VIVI_TYPE_WIDGET, ViviWidget))
+#define VIVI_WIDGET_CLASS(klass)            (G_TYPE_CHECK_CLASS_CAST ((klass), VIVI_TYPE_WIDGET, ViviWidgetClass))
+
+struct _ViviWidget
+{
+  SwfdecGtkWidget     	widget;
+
+  int			x;
+  int			y;
+  int			button;
+};
+
+struct _ViviWidgetClass
+{
+  SwfdecGtkWidgetClass	widget_class;
+};
+
+GType		vivi_widget_get_type		(void);
+
+GtkWidget *	vivi_widget_new			(SwfdecPlayer *	player);
+
+
+G_END_DECLS
+#endif
diff-tree f9d06c40d6ce63504d5f2ae79a042373d07da9ce (from 3b74be34227d1b1f6167daa2bef7282eedfc23e7)
Author: Benjamin Otte <otte at gnome.org>
Date:   Tue Aug 28 13:25:13 2007 +0200

    @version is a movie property - but only for root movies
    
    I don't think this is entirely correct but works for now

diff --git a/libswfdec/swfdec_as_strings.c b/libswfdec/swfdec_as_strings.c
index 661cfd0..9fb0169 100644
--- a/libswfdec/swfdec_as_strings.c
+++ b/libswfdec/swfdec_as_strings.c
@@ -282,6 +282,7 @@ const char swfdec_as_strings[] = 
   SWFDEC_AS_CONSTANT_STRING ("windowlessDisable")
   SWFDEC_AS_CONSTANT_STRING ("hasTLS")
   SWFDEC_AS_CONSTANT_STRING ("serverString")
+  SWFDEC_AS_CONSTANT_STRING ("$version")
   /* add more here */
 ;
 
diff --git a/libswfdec/swfdec_initialize.as b/libswfdec/swfdec_initialize.as
index c32a042..edfb2e0 100644
--- a/libswfdec/swfdec_initialize.as
+++ b/libswfdec/swfdec_initialize.as
@@ -134,7 +134,6 @@ System.capabilities = {};
 System.capabilities.Query = ASnative (11, 0);
 System.capabilities.Query ();
 delete System.capabilities.Query;
-$version = System.capabilities.version;
 
 /*** OH THE HUMANITY ***/
 
diff --git a/libswfdec/swfdec_initialize.h b/libswfdec/swfdec_initialize.h
index c7ae7a6..715e81e 100644
--- a/libswfdec/swfdec_initialize.h
+++ b/libswfdec/swfdec_initialize.h
@@ -2,7 +2,7 @@
 
 /* compiled from swfdec_initialize.as */
 const unsigned char swfdec_initialize[] = {
-  0x88, 0x93, 0x02, 0x48,  0x00, 0x41, 0x53, 0x53,  0x65, 0x74, 0x4E, 0x61,  0x74, 0x69, 0x76, 0x65,
+  0x88, 0x82, 0x02, 0x46,  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, 0x41, 0x73,
   0x42, 0x72, 0x6F, 0x61,  0x64, 0x63, 0x61, 0x73,  0x74, 0x65, 0x72, 0x00,  0x62, 0x72, 0x6F, 0x61,
@@ -42,111 +42,109 @@ const unsigned char swfdec_initialize[] 
   0x42, 0x79, 0x74, 0x65,  0x73, 0x54, 0x6F, 0x74,  0x61, 0x6C, 0x00, 0x5F,  0x62, 0x79, 0x74, 0x65,
   0x73, 0x54, 0x6F, 0x74,  0x61, 0x6C, 0x00, 0x58,  0x4D, 0x4C, 0x00, 0x53,  0x79, 0x73, 0x74, 0x65,
   0x6D, 0x00, 0x63, 0x61,  0x70, 0x61, 0x62, 0x69,  0x6C, 0x69, 0x74, 0x69,  0x65, 0x73, 0x00, 0x51,
-  0x75, 0x65, 0x72, 0x79,  0x00, 0x24, 0x76, 0x65,  0x72, 0x73, 0x69, 0x6F,  0x6E, 0x00, 0x76, 0x65,
-  0x72, 0x73, 0x69, 0x6F,  0x6E, 0x00, 0x9B, 0x12,  0x00, 0x41, 0x73, 0x42,  0x72, 0x6F, 0x61, 0x64,
-  0x63, 0x61, 0x73, 0x74,  0x65, 0x72, 0x00, 0x00,  0x00, 0x00, 0x00, 0x9B,  0x0D, 0x00, 0x4C, 0x6F,
-  0x61, 0x64, 0x56, 0x61,  0x72, 0x73, 0x00, 0x00,  0x00, 0x00, 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,  0x02, 0x00, 0x08, 0x03,
-  0x1C, 0x96, 0x13, 0x00,  0x08, 0x04, 0x07, 0x0C,  0x00, 0x00, 0x00, 0x07,  0x65, 0x00, 0x00, 0x00,
-  0x07, 0x02, 0x00, 0x00,  0x00, 0x08, 0x01, 0x3D,  0x4F, 0x96, 0x02, 0x00,  0x08, 0x03, 0x1C, 0x96,
-  0x02, 0x00, 0x08, 0x05,  0x9B, 0x07, 0x00, 0x00,  0x01, 0x00, 0x78, 0x00,  0x3C, 0x00, 0x96, 0x02,
-  0x00, 0x08, 0x07, 0x1C,  0x96, 0x07, 0x00, 0x07,  0x01, 0x00, 0x00, 0x00,  0x08, 0x06, 0x1C, 0x96,
-  0x02, 0x00, 0x08, 0x08,  0x52, 0x17, 0x96, 0x02,  0x00, 0x08, 0x07, 0x1C,  0x96, 0x07, 0x00, 0x07,
-  0x01, 0x00, 0x00, 0x00,  0x08, 0x06, 0x1C, 0x96,  0x02, 0x00, 0x08, 0x09,  0x4E, 0x96, 0x02, 0x00,
-  0x08, 0x0A, 0x52, 0x17,  0x96, 0x02, 0x00, 0x05,  0x01, 0x3E, 0x4F, 0x96,  0x02, 0x00, 0x08, 0x03,
-  0x1C, 0x96, 0x02, 0x00,  0x08, 0x08, 0x9B, 0x07,  0x00, 0x00, 0x01, 0x00,  0x78, 0x00, 0x8F, 0x00,
-  0x96, 0x04, 0x00, 0x08,  0x0B, 0x08, 0x06, 0x1C,  0x96, 0x02, 0x00, 0x08,  0x09, 0x4E, 0x3C, 0x96,
-  0x02, 0x00, 0x08, 0x0C,  0x41, 0x96, 0x07, 0x00,  0x08, 0x0C, 0x07, 0x00,  0x00, 0x00, 0x00, 0x3C,
-  0x99, 0x02, 0x00, 0x09,  0x00, 0x96, 0x02, 0x00,  0x08, 0x0C, 0x4C, 0x1C,  0x50, 0x1D, 0x96, 0x02,
-  0x00, 0x08, 0x0C, 0x1C,  0x96, 0x02, 0x00, 0x08,  0x0B, 0x1C, 0x96, 0x02,  0x00, 0x08, 0x0D, 0x4E,
-  0x48, 0x12, 0x9D, 0x02,  0x00, 0x42, 0x00, 0x96,  0x02, 0x00, 0x08, 0x0B,  0x1C, 0x96, 0x02, 0x00,
-  0x08, 0x0C, 0x1C, 0x4E,  0x96, 0x02, 0x00, 0x08,  0x07, 0x1C, 0x49, 0x12,  0x9D, 0x02, 0x00, 0x23,
-  0x00, 0x96, 0x07, 0x00,  0x07, 0x01, 0x00, 0x00,  0x00, 0x08, 0x0C, 0x1C,  0x96, 0x07, 0x00, 0x07,
-  0x02, 0x00, 0x00, 0x00,  0x08, 0x0B, 0x1C, 0x96,  0x02, 0x00, 0x08, 0x0E,  0x52, 0x17, 0x96, 0x02,
-  0x00, 0x05, 0x01, 0x3E,  0x99, 0x02, 0x00, 0x9C,  0xFF, 0x96, 0x02, 0x00,  0x05, 0x00, 0x3E, 0x4F,
-  0x96, 0x02, 0x00, 0x08,  0x03, 0x1C, 0x96, 0x02,  0x00, 0x08, 0x0F, 0x9B,  0x07, 0x00, 0x00, 0x01,
-  0x00, 0x6F, 0x00, 0x75,  0x00, 0x96, 0x02, 0x00,  0x08, 0x10, 0x1C, 0x96,  0x13, 0x00, 0x08, 0x04,
-  0x07, 0x0C, 0x00, 0x00,  0x00, 0x07, 0x65, 0x00,  0x00, 0x00, 0x07, 0x02,  0x00, 0x00, 0x00, 0x08,
-  0x01, 0x3D, 0x4F, 0x96,  0x02, 0x00, 0x08, 0x10,  0x1C, 0x96, 0x04, 0x00,  0x08, 0x05, 0x08, 0x03,
-  0x1C, 0x96, 0x02, 0x00,  0x08, 0x05, 0x4E, 0x4F,  0x96, 0x02, 0x00, 0x08,  0x10, 0x1C, 0x96, 0x04,
-  0x00, 0x08, 0x08, 0x08,  0x03, 0x1C, 0x96, 0x02,  0x00, 0x08, 0x08, 0x4E,  0x4F, 0x96, 0x02, 0x00,
-  0x08, 0x10, 0x1C, 0x96,  0x09, 0x00, 0x08, 0x09,  0x07, 0x00, 0x00, 0x00,  0x00, 0x08, 0x11, 0x40,
-  0x4F, 0x96, 0x09, 0x00,  0x07, 0x83, 0x00, 0x00,  0x00, 0x08, 0x12, 0x08,  0x10, 0x1C, 0x96, 0x07,
-  0x00, 0x07, 0x03, 0x00,  0x00, 0x00, 0x08, 0x13,  0x3D, 0x17, 0x4F, 0x96,  0x08, 0x00, 0x07, 0x83,
-  0x00, 0x00, 0x00, 0x02,  0x08, 0x03, 0x1C, 0x96,  0x07, 0x00, 0x07, 0x03,  0x00, 0x00, 0x00, 0x08,
-  0x13, 0x3D, 0x17, 0x96,  0x8C, 0x00, 0x08, 0x14,  0x08, 0x15, 0x07, 0x12,  0x00, 0x00, 0x00, 0x08,
-  0x16, 0x07, 0x08, 0x00,  0x00, 0x00, 0x08, 0x17,  0x07, 0x14, 0x00, 0x00,  0x00, 0x08, 0x18, 0x07,
-  0x11, 0x00, 0x00, 0x00,  0x08, 0x19, 0x07, 0x2E,  0x00, 0x00, 0x00, 0x08,  0x1A, 0x07, 0x28, 0x00,
-  0x00, 0x00, 0x08, 0x1B,  0x07, 0x23, 0x00, 0x00,  0x00, 0x08, 0x1C, 0x07,  0x0D, 0x00, 0x00, 0x00,
-  0x08, 0x1D, 0x07, 0x1B,  0x00, 0x00, 0x00, 0x08,  0x1E, 0x07, 0x24, 0x00,  0x00, 0x00, 0x08, 0x1F,
-  0x07, 0x2D, 0x00, 0x00,  0x00, 0x08, 0x20, 0x07,  0x25, 0x00, 0x00, 0x00,  0x08, 0x21, 0x07, 0x22,
-  0x00, 0x00, 0x00, 0x08,  0x22, 0x07, 0x21, 0x00,  0x00, 0x00, 0x08, 0x23,  0x07, 0x27, 0x00, 0x00,
-  0x00, 0x08, 0x24, 0x07,  0x10, 0x00, 0x00, 0x00,  0x08, 0x25, 0x07, 0x20,  0x00, 0x00, 0x00, 0x08,
-  0x26, 0x07, 0x09, 0x00,  0x00, 0x00, 0x08, 0x27,  0x07, 0x26, 0x00, 0x00,  0x00, 0x07, 0x13, 0x00,
-  0x00, 0x00, 0x43, 0x1D,  0x96, 0x09, 0x00, 0x08,  0x28, 0x07, 0x20, 0x03,  0x00, 0x00, 0x08, 0x14,
-  0x1C, 0x96, 0x07, 0x00,  0x07, 0x03, 0x00, 0x00,  0x00, 0x08, 0x00, 0x3D,  0x17, 0x96, 0x02, 0x00,
-  0x08, 0x14, 0x1C, 0x96,  0x07, 0x00, 0x07, 0x01,  0x00, 0x00, 0x00, 0x08,  0x03, 0x1C, 0x96, 0x02,
-  0x00, 0x08, 0x0F, 0x52,  0x17, 0x96, 0x08, 0x00,  0x07, 0x07, 0x00, 0x00,  0x00, 0x02, 0x08, 0x14,
-  0x1C, 0x96, 0x07, 0x00,  0x07, 0x03, 0x00, 0x00,  0x00, 0x08, 0x13, 0x3D,  0x17, 0x96, 0x09, 0x00,
-  0x08, 0x29, 0x07, 0x00,  0x00, 0x00, 0x00, 0x08,  0x2A, 0x40, 0x1D, 0x96,  0x02, 0x00, 0x08, 0x29,
-  0x1C, 0x96, 0x13, 0x00,  0x08, 0x2B, 0x07, 0x00,  0x00, 0x00, 0x00, 0x07,  0x05, 0x00, 0x00, 0x00,
-  0x07, 0x02, 0x00, 0x00,  0x00, 0x08, 0x01, 0x3D,  0x4F, 0x96, 0x02, 0x00,  0x08, 0x29, 0x1C, 0x96,
-  0x13, 0x00, 0x08, 0x2C,  0x07, 0x01, 0x00, 0x00,  0x00, 0x07, 0x05, 0x00,  0x00, 0x00, 0x07, 0x02,
-  0x00, 0x00, 0x00, 0x08,  0x01, 0x3D, 0x4F, 0x96,  0x02, 0x00, 0x08, 0x29,  0x1C, 0x96, 0x07, 0x00,
-  0x07, 0x01, 0x00, 0x00,  0x00, 0x08, 0x03, 0x1C,  0x96, 0x02, 0x00, 0x08,  0x0F, 0x52, 0x17, 0x96,
-  0x08, 0x00, 0x07, 0x07,  0x00, 0x00, 0x00, 0x02,  0x08, 0x29, 0x1C, 0x96,  0x07, 0x00, 0x07, 0x03,
-  0x00, 0x00, 0x00, 0x08,  0x13, 0x3D, 0x17, 0x96,  0x09, 0x00, 0x08, 0x2D,  0x07, 0x00, 0x00, 0x00,
-  0x00, 0x08, 0x2A, 0x40,  0x1D, 0x96, 0x02, 0x00,  0x08, 0x2D, 0x1C, 0x96,  0x07, 0x00, 0x07, 0x01,
-  0x00, 0x00, 0x00, 0x08,  0x03, 0x1C, 0x96, 0x02,  0x00, 0x08, 0x0F, 0x52,  0x17, 0x96, 0x0E, 0x00,
-  0x07, 0x01, 0x00, 0x00,  0x00, 0x08, 0x2E, 0x07,  0x9A, 0x02, 0x00, 0x00,  0x08, 0x2D, 0x1C, 0x96,
-  0x07, 0x00, 0x07, 0x04,  0x00, 0x00, 0x00, 0x08,  0x02, 0x3D, 0x17, 0x96,  0x02, 0x00, 0x08, 0x2F,
-  0x1C, 0x96, 0x02, 0x00,  0x08, 0x30, 0x4E, 0x96,  0x04, 0x00, 0x08, 0x31,  0x08, 0x32, 0x4F, 0x96,
-  0x02, 0x00, 0x08, 0x2F,  0x1C, 0x96, 0x02, 0x00,  0x08, 0x30, 0x4E, 0x96,  0x13, 0x00, 0x08, 0x33,
-  0x07, 0x00, 0x00, 0x00,  0x00, 0x07, 0x2D, 0x01,  0x00, 0x00, 0x07, 0x02,  0x00, 0x00, 0x00, 0x08,
-  0x01, 0x3D, 0x4F, 0x96,  0x02, 0x00, 0x08, 0x2F,  0x1C, 0x96, 0x02, 0x00,  0x08, 0x30, 0x4E, 0x96,
-  0x13, 0x00, 0x08, 0x34,  0x07, 0x03, 0x00, 0x00,  0x00, 0x07, 0x2D, 0x01,  0x00, 0x00, 0x07, 0x02,
-  0x00, 0x00, 0x00, 0x08,  0x01, 0x3D, 0x4F, 0x96,  0x02, 0x00, 0x08, 0x2F,  0x1C, 0x96, 0x02, 0x00,
-  0x08, 0x30, 0x4E, 0x96,  0x02, 0x00, 0x08, 0x35,  0x9B, 0x05, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
-  0x4F, 0x96, 0x02, 0x00,  0x08, 0x2F, 0x1C, 0x96,  0x02, 0x00, 0x08, 0x30,  0x4E, 0x96, 0x02, 0x00,
-  0x08, 0x36, 0x9B, 0x09,  0x00, 0x00, 0x01, 0x00,  0x73, 0x72, 0x63, 0x00,  0x64, 0x00, 0x96, 0x02,
-  0x00, 0x08, 0x06, 0x1C,  0x96, 0x04, 0x00, 0x08,  0x37, 0x05, 0x01, 0x4F,  0x96, 0x02, 0x00, 0x08,
-  0x38, 0x1C, 0x96, 0x01,  0x00, 0x02, 0x49, 0x12,  0x9D, 0x02, 0x00, 0x19,  0x00, 0x96, 0x09, 0x00,
-  0x05, 0x00, 0x07, 0x01,  0x00, 0x00, 0x00, 0x08,  0x06, 0x1C, 0x96, 0x02,  0x00, 0x08, 0x35, 0x52,
-  0x17, 0x99, 0x02, 0x00,  0x2C, 0x00, 0x96, 0x02,  0x00, 0x08, 0x38, 0x1C,  0x96, 0x07, 0x00, 0x07,
-  0x01, 0x00, 0x00, 0x00,  0x08, 0x06, 0x1C, 0x96,  0x02, 0x00, 0x08, 0x34,  0x52, 0x17, 0x96, 0x09,
-  0x00, 0x05, 0x01, 0x07,  0x01, 0x00, 0x00, 0x00,  0x08, 0x06, 0x1C, 0x96,  0x02, 0x00, 0x08, 0x35,
-  0x52, 0x17, 0x4F, 0x96,  0x02, 0x00, 0x08, 0x2F,  0x1C, 0x96, 0x02, 0x00,  0x08, 0x30, 0x4E, 0x96,
-  0x02, 0x00, 0x08, 0x39,  0x9B, 0x05, 0x00, 0x00,  0x00, 0x00, 0xB3, 0x00,  0x96, 0x03, 0x00, 0x08,
-  0x3A, 0x02, 0x3C, 0x96,  0x02, 0x00, 0x08, 0x06,  0x46, 0x87, 0x01, 0x00,  0x00, 0x96, 0x01, 0x00,
-  0x02, 0x49, 0x9D, 0x02,  0x00, 0x91, 0x00, 0x96,  0x04, 0x00, 0x08, 0x07,  0x04, 0x00, 0x3C, 0x96,
-  0x02, 0x00, 0x08, 0x3A,  0x1C, 0x96, 0x01, 0x00,  0x02, 0x49, 0x9D, 0x02,  0x00, 0x41, 0x00, 0x96,
-  0x02, 0x00, 0x08, 0x3A,  0x4C, 0x1C, 0x96, 0x04,  0x00, 0x08, 0x3D, 0x08,  0x07, 0x1C, 0x96, 0x07,
-  0x00, 0x07, 0x01, 0x00,  0x00, 0x00, 0x08, 0x3B,  0x3D, 0x47, 0x96, 0x02,  0x00, 0x08, 0x3C, 0x47,
-  0x96, 0x02, 0x00, 0x08,  0x06, 0x1C, 0x96, 0x02,  0x00, 0x08, 0x07, 0x1C,  0x4E, 0x96, 0x07, 0x00,
-  0x07, 0x01, 0x00, 0x00,  0x00, 0x08, 0x3B, 0x3D,  0x47, 0x47, 0x1D, 0x99,  0x02, 0x00, 0x33, 0x00,
-  0x96, 0x04, 0x00, 0x08,  0x3A, 0x08, 0x07, 0x1C,  0x96, 0x07, 0x00, 0x07,  0x01, 0x00, 0x00, 0x00,
-  0x08, 0x3B, 0x3D, 0x96,  0x02, 0x00, 0x08, 0x3C,  0x47, 0x96, 0x02, 0x00,  0x08, 0x06, 0x1C, 0x96,
-  0x02, 0x00, 0x08, 0x07,  0x1C, 0x4E, 0x96, 0x07,  0x00, 0x07, 0x01, 0x00,  0x00, 0x00, 0x08, 0x3B,
-  0x3D, 0x47, 0x1D, 0x99,  0x02, 0x00, 0x61, 0xFF,  0x96, 0x02, 0x00, 0x08,  0x3A, 0x1C, 0x3E, 0x4F,
+  0x75, 0x65, 0x72, 0x79,  0x00, 0x9B, 0x12, 0x00,  0x41, 0x73, 0x42, 0x72,  0x6F, 0x61, 0x64, 0x63,
+  0x61, 0x73, 0x74, 0x65,  0x72, 0x00, 0x00, 0x00,  0x00, 0x00, 0x9B, 0x0D,  0x00, 0x4C, 0x6F, 0x61,
+  0x64, 0x56, 0x61, 0x72,  0x73, 0x00, 0x00, 0x00,  0x00, 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, 0x02,  0x00, 0x08, 0x03, 0x1C,
+  0x96, 0x13, 0x00, 0x08,  0x04, 0x07, 0x0C, 0x00,  0x00, 0x00, 0x07, 0x65,  0x00, 0x00, 0x00, 0x07,
+  0x02, 0x00, 0x00, 0x00,  0x08, 0x01, 0x3D, 0x4F,  0x96, 0x02, 0x00, 0x08,  0x03, 0x1C, 0x96, 0x02,
+  0x00, 0x08, 0x05, 0x9B,  0x07, 0x00, 0x00, 0x01,  0x00, 0x78, 0x00, 0x3C,  0x00, 0x96, 0x02, 0x00,
+  0x08, 0x07, 0x1C, 0x96,  0x07, 0x00, 0x07, 0x01,  0x00, 0x00, 0x00, 0x08,  0x06, 0x1C, 0x96, 0x02,
+  0x00, 0x08, 0x08, 0x52,  0x17, 0x96, 0x02, 0x00,  0x08, 0x07, 0x1C, 0x96,  0x07, 0x00, 0x07, 0x01,
+  0x00, 0x00, 0x00, 0x08,  0x06, 0x1C, 0x96, 0x02,  0x00, 0x08, 0x09, 0x4E,  0x96, 0x02, 0x00, 0x08,
+  0x0A, 0x52, 0x17, 0x96,  0x02, 0x00, 0x05, 0x01,  0x3E, 0x4F, 0x96, 0x02,  0x00, 0x08, 0x03, 0x1C,
+  0x96, 0x02, 0x00, 0x08,  0x08, 0x9B, 0x07, 0x00,  0x00, 0x01, 0x00, 0x78,  0x00, 0x8F, 0x00, 0x96,
+  0x04, 0x00, 0x08, 0x0B,  0x08, 0x06, 0x1C, 0x96,  0x02, 0x00, 0x08, 0x09,  0x4E, 0x3C, 0x96, 0x02,
+  0x00, 0x08, 0x0C, 0x41,  0x96, 0x07, 0x00, 0x08,  0x0C, 0x07, 0x00, 0x00,  0x00, 0x00, 0x3C, 0x99,
+  0x02, 0x00, 0x09, 0x00,  0x96, 0x02, 0x00, 0x08,  0x0C, 0x4C, 0x1C, 0x50,  0x1D, 0x96, 0x02, 0x00,
+  0x08, 0x0C, 0x1C, 0x96,  0x02, 0x00, 0x08, 0x0B,  0x1C, 0x96, 0x02, 0x00,  0x08, 0x0D, 0x4E, 0x48,
+  0x12, 0x9D, 0x02, 0x00,  0x42, 0x00, 0x96, 0x02,  0x00, 0x08, 0x0B, 0x1C,  0x96, 0x02, 0x00, 0x08,
+  0x0C, 0x1C, 0x4E, 0x96,  0x02, 0x00, 0x08, 0x07,  0x1C, 0x49, 0x12, 0x9D,  0x02, 0x00, 0x23, 0x00,
+  0x96, 0x07, 0x00, 0x07,  0x01, 0x00, 0x00, 0x00,  0x08, 0x0C, 0x1C, 0x96,  0x07, 0x00, 0x07, 0x02,
+  0x00, 0x00, 0x00, 0x08,  0x0B, 0x1C, 0x96, 0x02,  0x00, 0x08, 0x0E, 0x52,  0x17, 0x96, 0x02, 0x00,
+  0x05, 0x01, 0x3E, 0x99,  0x02, 0x00, 0x9C, 0xFF,  0x96, 0x02, 0x00, 0x05,  0x00, 0x3E, 0x4F, 0x96,
+  0x02, 0x00, 0x08, 0x03,  0x1C, 0x96, 0x02, 0x00,  0x08, 0x0F, 0x9B, 0x07,  0x00, 0x00, 0x01, 0x00,
+  0x6F, 0x00, 0x75, 0x00,  0x96, 0x02, 0x00, 0x08,  0x10, 0x1C, 0x96, 0x13,  0x00, 0x08, 0x04, 0x07,
+  0x0C, 0x00, 0x00, 0x00,  0x07, 0x65, 0x00, 0x00,  0x00, 0x07, 0x02, 0x00,  0x00, 0x00, 0x08, 0x01,
+  0x3D, 0x4F, 0x96, 0x02,  0x00, 0x08, 0x10, 0x1C,  0x96, 0x04, 0x00, 0x08,  0x05, 0x08, 0x03, 0x1C,
+  0x96, 0x02, 0x00, 0x08,  0x05, 0x4E, 0x4F, 0x96,  0x02, 0x00, 0x08, 0x10,  0x1C, 0x96, 0x04, 0x00,
+  0x08, 0x08, 0x08, 0x03,  0x1C, 0x96, 0x02, 0x00,  0x08, 0x08, 0x4E, 0x4F,  0x96, 0x02, 0x00, 0x08,
+  0x10, 0x1C, 0x96, 0x09,  0x00, 0x08, 0x09, 0x07,  0x00, 0x00, 0x00, 0x00,  0x08, 0x11, 0x40, 0x4F,
+  0x96, 0x09, 0x00, 0x07,  0x83, 0x00, 0x00, 0x00,  0x08, 0x12, 0x08, 0x10,  0x1C, 0x96, 0x07, 0x00,
+  0x07, 0x03, 0x00, 0x00,  0x00, 0x08, 0x13, 0x3D,  0x17, 0x4F, 0x96, 0x08,  0x00, 0x07, 0x83, 0x00,
+  0x00, 0x00, 0x02, 0x08,  0x03, 0x1C, 0x96, 0x07,  0x00, 0x07, 0x03, 0x00,  0x00, 0x00, 0x08, 0x13,
+  0x3D, 0x17, 0x96, 0x8C,  0x00, 0x08, 0x14, 0x08,  0x15, 0x07, 0x12, 0x00,  0x00, 0x00, 0x08, 0x16,
+  0x07, 0x08, 0x00, 0x00,  0x00, 0x08, 0x17, 0x07,  0x14, 0x00, 0x00, 0x00,  0x08, 0x18, 0x07, 0x11,
+  0x00, 0x00, 0x00, 0x08,  0x19, 0x07, 0x2E, 0x00,  0x00, 0x00, 0x08, 0x1A,  0x07, 0x28, 0x00, 0x00,
+  0x00, 0x08, 0x1B, 0x07,  0x23, 0x00, 0x00, 0x00,  0x08, 0x1C, 0x07, 0x0D,  0x00, 0x00, 0x00, 0x08,
+  0x1D, 0x07, 0x1B, 0x00,  0x00, 0x00, 0x08, 0x1E,  0x07, 0x24, 0x00, 0x00,  0x00, 0x08, 0x1F, 0x07,
+  0x2D, 0x00, 0x00, 0x00,  0x08, 0x20, 0x07, 0x25,  0x00, 0x00, 0x00, 0x08,  0x21, 0x07, 0x22, 0x00,
+  0x00, 0x00, 0x08, 0x22,  0x07, 0x21, 0x00, 0x00,  0x00, 0x08, 0x23, 0x07,  0x27, 0x00, 0x00, 0x00,
+  0x08, 0x24, 0x07, 0x10,  0x00, 0x00, 0x00, 0x08,  0x25, 0x07, 0x20, 0x00,  0x00, 0x00, 0x08, 0x26,
+  0x07, 0x09, 0x00, 0x00,  0x00, 0x08, 0x27, 0x07,  0x26, 0x00, 0x00, 0x00,  0x07, 0x13, 0x00, 0x00,
+  0x00, 0x43, 0x1D, 0x96,  0x09, 0x00, 0x08, 0x28,  0x07, 0x20, 0x03, 0x00,  0x00, 0x08, 0x14, 0x1C,
+  0x96, 0x07, 0x00, 0x07,  0x03, 0x00, 0x00, 0x00,  0x08, 0x00, 0x3D, 0x17,  0x96, 0x02, 0x00, 0x08,
+  0x14, 0x1C, 0x96, 0x07,  0x00, 0x07, 0x01, 0x00,  0x00, 0x00, 0x08, 0x03,  0x1C, 0x96, 0x02, 0x00,
+  0x08, 0x0F, 0x52, 0x17,  0x96, 0x08, 0x00, 0x07,  0x07, 0x00, 0x00, 0x00,  0x02, 0x08, 0x14, 0x1C,
+  0x96, 0x07, 0x00, 0x07,  0x03, 0x00, 0x00, 0x00,  0x08, 0x13, 0x3D, 0x17,  0x96, 0x09, 0x00, 0x08,
+  0x29, 0x07, 0x00, 0x00,  0x00, 0x00, 0x08, 0x2A,  0x40, 0x1D, 0x96, 0x02,  0x00, 0x08, 0x29, 0x1C,
+  0x96, 0x13, 0x00, 0x08,  0x2B, 0x07, 0x00, 0x00,  0x00, 0x00, 0x07, 0x05,  0x00, 0x00, 0x00, 0x07,
+  0x02, 0x00, 0x00, 0x00,  0x08, 0x01, 0x3D, 0x4F,  0x96, 0x02, 0x00, 0x08,  0x29, 0x1C, 0x96, 0x13,
+  0x00, 0x08, 0x2C, 0x07,  0x01, 0x00, 0x00, 0x00,  0x07, 0x05, 0x00, 0x00,  0x00, 0x07, 0x02, 0x00,
+  0x00, 0x00, 0x08, 0x01,  0x3D, 0x4F, 0x96, 0x02,  0x00, 0x08, 0x29, 0x1C,  0x96, 0x07, 0x00, 0x07,
+  0x01, 0x00, 0x00, 0x00,  0x08, 0x03, 0x1C, 0x96,  0x02, 0x00, 0x08, 0x0F,  0x52, 0x17, 0x96, 0x08,
+  0x00, 0x07, 0x07, 0x00,  0x00, 0x00, 0x02, 0x08,  0x29, 0x1C, 0x96, 0x07,  0x00, 0x07, 0x03, 0x00,
+  0x00, 0x00, 0x08, 0x13,  0x3D, 0x17, 0x96, 0x09,  0x00, 0x08, 0x2D, 0x07,  0x00, 0x00, 0x00, 0x00,
+  0x08, 0x2A, 0x40, 0x1D,  0x96, 0x02, 0x00, 0x08,  0x2D, 0x1C, 0x96, 0x07,  0x00, 0x07, 0x01, 0x00,
+  0x00, 0x00, 0x08, 0x03,  0x1C, 0x96, 0x02, 0x00,  0x08, 0x0F, 0x52, 0x17,  0x96, 0x0E, 0x00, 0x07,
+  0x01, 0x00, 0x00, 0x00,  0x08, 0x2E, 0x07, 0x9A,  0x02, 0x00, 0x00, 0x08,  0x2D, 0x1C, 0x96, 0x07,
+  0x00, 0x07, 0x04, 0x00,  0x00, 0x00, 0x08, 0x02,  0x3D, 0x17, 0x96, 0x02,  0x00, 0x08, 0x2F, 0x1C,
+  0x96, 0x02, 0x00, 0x08,  0x30, 0x4E, 0x96, 0x04,  0x00, 0x08, 0x31, 0x08,  0x32, 0x4F, 0x96, 0x02,
+  0x00, 0x08, 0x2F, 0x1C,  0x96, 0x02, 0x00, 0x08,  0x30, 0x4E, 0x96, 0x13,  0x00, 0x08, 0x33, 0x07,
+  0x00, 0x00, 0x00, 0x00,  0x07, 0x2D, 0x01, 0x00,  0x00, 0x07, 0x02, 0x00,  0x00, 0x00, 0x08, 0x01,
+  0x3D, 0x4F, 0x96, 0x02,  0x00, 0x08, 0x2F, 0x1C,  0x96, 0x02, 0x00, 0x08,  0x30, 0x4E, 0x96, 0x13,
+  0x00, 0x08, 0x34, 0x07,  0x03, 0x00, 0x00, 0x00,  0x07, 0x2D, 0x01, 0x00,  0x00, 0x07, 0x02, 0x00,
+  0x00, 0x00, 0x08, 0x01,  0x3D, 0x4F, 0x96, 0x02,  0x00, 0x08, 0x2F, 0x1C,  0x96, 0x02, 0x00, 0x08,
+  0x30, 0x4E, 0x96, 0x02,  0x00, 0x08, 0x35, 0x9B,  0x05, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x4F,
   0x96, 0x02, 0x00, 0x08,  0x2F, 0x1C, 0x96, 0x02,  0x00, 0x08, 0x30, 0x4E,  0x96, 0x02, 0x00, 0x08,
-  0x3E, 0x9B, 0x05, 0x00,  0x00, 0x00, 0x00, 0x0D,  0x00, 0x96, 0x02, 0x00,  0x08, 0x06, 0x1C, 0x96,
-  0x02, 0x00, 0x08, 0x3F,  0x4E, 0x3E, 0x4F, 0x96,  0x02, 0x00, 0x08, 0x2F,  0x1C, 0x96, 0x02, 0x00,
-  0x08, 0x30, 0x4E, 0x96,  0x02, 0x00, 0x08, 0x40,  0x9B, 0x05, 0x00, 0x00,  0x00, 0x00, 0x0D, 0x00,
-  0x96, 0x02, 0x00, 0x08,  0x06, 0x1C, 0x96, 0x02,  0x00, 0x08, 0x41, 0x4E,  0x3E, 0x4F, 0x96, 0x08,
-  0x00, 0x07, 0x83, 0x00,  0x00, 0x00, 0x02, 0x08,  0x2F, 0x1C, 0x96, 0x02,  0x00, 0x08, 0x30, 0x4E,
-  0x96, 0x07, 0x00, 0x07,  0x03, 0x00, 0x00, 0x00,  0x08, 0x13, 0x3D, 0x17,  0x96, 0x02, 0x00, 0x08,
-  0x42, 0x1C, 0x96, 0x02,  0x00, 0x08, 0x30, 0x4E,  0x96, 0x13, 0x00, 0x08,  0x33, 0x07, 0x00, 0x00,
-  0x00, 0x00, 0x07, 0x2D,  0x01, 0x00, 0x00, 0x07,  0x02, 0x00, 0x00, 0x00,  0x08, 0x01, 0x3D, 0x4F,
-  0x96, 0x07, 0x00, 0x08,  0x43, 0x07, 0x00, 0x00,  0x00, 0x00, 0x43, 0x1D,  0x96, 0x02, 0x00, 0x08,
-  0x43, 0x1C, 0x96, 0x07,  0x00, 0x08, 0x44, 0x07,  0x00, 0x00, 0x00, 0x00,  0x43, 0x4F, 0x96, 0x02,
-  0x00, 0x08, 0x43, 0x1C,  0x96, 0x02, 0x00, 0x08,  0x44, 0x4E, 0x96, 0x13,  0x00, 0x08, 0x45, 0x07,
-  0x00, 0x00, 0x00, 0x00,  0x07, 0x0B, 0x00, 0x00,  0x00, 0x07, 0x02, 0x00,  0x00, 0x00, 0x08, 0x01,
-  0x3D, 0x4F, 0x96, 0x07,  0x00, 0x07, 0x00, 0x00,  0x00, 0x00, 0x08, 0x43,  0x1C, 0x96, 0x02, 0x00,
-  0x08, 0x44, 0x4E, 0x96,  0x02, 0x00, 0x08, 0x45,  0x52, 0x17, 0x96, 0x02,  0x00, 0x08, 0x43, 0x1C,
-  0x96, 0x02, 0x00, 0x08,  0x44, 0x4E, 0x96, 0x02,  0x00, 0x08, 0x45, 0x3A,  0x17, 0x96, 0x04, 0x00,
-  0x08, 0x46, 0x08, 0x43,  0x1C, 0x96, 0x02, 0x00,  0x08, 0x44, 0x4E, 0x96,  0x02, 0x00, 0x08, 0x47,
-  0x4E, 0x1D, 0x96, 0x03,  0x00, 0x08, 0x10, 0x02,  0x1D, 0x00
+  0x36, 0x9B, 0x09, 0x00,  0x00, 0x01, 0x00, 0x73,  0x72, 0x63, 0x00, 0x64,  0x00, 0x96, 0x02, 0x00,
+  0x08, 0x06, 0x1C, 0x96,  0x04, 0x00, 0x08, 0x37,  0x05, 0x01, 0x4F, 0x96,  0x02, 0x00, 0x08, 0x38,
+  0x1C, 0x96, 0x01, 0x00,  0x02, 0x49, 0x12, 0x9D,  0x02, 0x00, 0x19, 0x00,  0x96, 0x09, 0x00, 0x05,
+  0x00, 0x07, 0x01, 0x00,  0x00, 0x00, 0x08, 0x06,  0x1C, 0x96, 0x02, 0x00,  0x08, 0x35, 0x52, 0x17,
+  0x99, 0x02, 0x00, 0x2C,  0x00, 0x96, 0x02, 0x00,  0x08, 0x38, 0x1C, 0x96,  0x07, 0x00, 0x07, 0x01,
+  0x00, 0x00, 0x00, 0x08,  0x06, 0x1C, 0x96, 0x02,  0x00, 0x08, 0x34, 0x52,  0x17, 0x96, 0x09, 0x00,
+  0x05, 0x01, 0x07, 0x01,  0x00, 0x00, 0x00, 0x08,  0x06, 0x1C, 0x96, 0x02,  0x00, 0x08, 0x35, 0x52,
+  0x17, 0x4F, 0x96, 0x02,  0x00, 0x08, 0x2F, 0x1C,  0x96, 0x02, 0x00, 0x08,  0x30, 0x4E, 0x96, 0x02,
+  0x00, 0x08, 0x39, 0x9B,  0x05, 0x00, 0x00, 0x00,  0x00, 0xB3, 0x00, 0x96,  0x03, 0x00, 0x08, 0x3A,
+  0x02, 0x3C, 0x96, 0x02,  0x00, 0x08, 0x06, 0x46,  0x87, 0x01, 0x00, 0x00,  0x96, 0x01, 0x00, 0x02,
+  0x49, 0x9D, 0x02, 0x00,  0x91, 0x00, 0x96, 0x04,  0x00, 0x08, 0x07, 0x04,  0x00, 0x3C, 0x96, 0x02,
+  0x00, 0x08, 0x3A, 0x1C,  0x96, 0x01, 0x00, 0x02,  0x49, 0x9D, 0x02, 0x00,  0x41, 0x00, 0x96, 0x02,
+  0x00, 0x08, 0x3A, 0x4C,  0x1C, 0x96, 0x04, 0x00,  0x08, 0x3D, 0x08, 0x07,  0x1C, 0x96, 0x07, 0x00,
+  0x07, 0x01, 0x00, 0x00,  0x00, 0x08, 0x3B, 0x3D,  0x47, 0x96, 0x02, 0x00,  0x08, 0x3C, 0x47, 0x96,
+  0x02, 0x00, 0x08, 0x06,  0x1C, 0x96, 0x02, 0x00,  0x08, 0x07, 0x1C, 0x4E,  0x96, 0x07, 0x00, 0x07,
+  0x01, 0x00, 0x00, 0x00,  0x08, 0x3B, 0x3D, 0x47,  0x47, 0x1D, 0x99, 0x02,  0x00, 0x33, 0x00, 0x96,
+  0x04, 0x00, 0x08, 0x3A,  0x08, 0x07, 0x1C, 0x96,  0x07, 0x00, 0x07, 0x01,  0x00, 0x00, 0x00, 0x08,
+  0x3B, 0x3D, 0x96, 0x02,  0x00, 0x08, 0x3C, 0x47,  0x96, 0x02, 0x00, 0x08,  0x06, 0x1C, 0x96, 0x02,
+  0x00, 0x08, 0x07, 0x1C,  0x4E, 0x96, 0x07, 0x00,  0x07, 0x01, 0x00, 0x00,  0x00, 0x08, 0x3B, 0x3D,
+  0x47, 0x1D, 0x99, 0x02,  0x00, 0x61, 0xFF, 0x96,  0x02, 0x00, 0x08, 0x3A,  0x1C, 0x3E, 0x4F, 0x96,
+  0x02, 0x00, 0x08, 0x2F,  0x1C, 0x96, 0x02, 0x00,  0x08, 0x30, 0x4E, 0x96,  0x02, 0x00, 0x08, 0x3E,
+  0x9B, 0x05, 0x00, 0x00,  0x00, 0x00, 0x0D, 0x00,  0x96, 0x02, 0x00, 0x08,  0x06, 0x1C, 0x96, 0x02,
+  0x00, 0x08, 0x3F, 0x4E,  0x3E, 0x4F, 0x96, 0x02,  0x00, 0x08, 0x2F, 0x1C,  0x96, 0x02, 0x00, 0x08,
+  0x30, 0x4E, 0x96, 0x02,  0x00, 0x08, 0x40, 0x9B,  0x05, 0x00, 0x00, 0x00,  0x00, 0x0D, 0x00, 0x96,
+  0x02, 0x00, 0x08, 0x06,  0x1C, 0x96, 0x02, 0x00,  0x08, 0x41, 0x4E, 0x3E,  0x4F, 0x96, 0x08, 0x00,
+  0x07, 0x83, 0x00, 0x00,  0x00, 0x02, 0x08, 0x2F,  0x1C, 0x96, 0x02, 0x00,  0x08, 0x30, 0x4E, 0x96,
+  0x07, 0x00, 0x07, 0x03,  0x00, 0x00, 0x00, 0x08,  0x13, 0x3D, 0x17, 0x96,  0x02, 0x00, 0x08, 0x42,
+  0x1C, 0x96, 0x02, 0x00,  0x08, 0x30, 0x4E, 0x96,  0x13, 0x00, 0x08, 0x33,  0x07, 0x00, 0x00, 0x00,
+  0x00, 0x07, 0x2D, 0x01,  0x00, 0x00, 0x07, 0x02,  0x00, 0x00, 0x00, 0x08,  0x01, 0x3D, 0x4F, 0x96,
+  0x07, 0x00, 0x08, 0x43,  0x07, 0x00, 0x00, 0x00,  0x00, 0x43, 0x1D, 0x96,  0x02, 0x00, 0x08, 0x43,
+  0x1C, 0x96, 0x07, 0x00,  0x08, 0x44, 0x07, 0x00,  0x00, 0x00, 0x00, 0x43,  0x4F, 0x96, 0x02, 0x00,
+  0x08, 0x43, 0x1C, 0x96,  0x02, 0x00, 0x08, 0x44,  0x4E, 0x96, 0x13, 0x00,  0x08, 0x45, 0x07, 0x00,
+  0x00, 0x00, 0x00, 0x07,  0x0B, 0x00, 0x00, 0x00,  0x07, 0x02, 0x00, 0x00,  0x00, 0x08, 0x01, 0x3D,
+  0x4F, 0x96, 0x07, 0x00,  0x07, 0x00, 0x00, 0x00,  0x00, 0x08, 0x43, 0x1C,  0x96, 0x02, 0x00, 0x08,
+  0x44, 0x4E, 0x96, 0x02,  0x00, 0x08, 0x45, 0x52,  0x17, 0x96, 0x02, 0x00,  0x08, 0x43, 0x1C, 0x96,
+  0x02, 0x00, 0x08, 0x44,  0x4E, 0x96, 0x02, 0x00,  0x08, 0x45, 0x3A, 0x17,  0x96, 0x03, 0x00, 0x08,
+  0x10, 0x02, 0x1D, 0x00
 };
 
diff --git a/libswfdec/swfdec_movie.c b/libswfdec/swfdec_movie.c
index ca76cc5..02904d0 100644
--- a/libswfdec/swfdec_movie.c
+++ b/libswfdec/swfdec_movie.c
@@ -39,6 +39,7 @@
 #include "swfdec_sprite.h"
 #include "swfdec_sprite_movie.h"
 #include "swfdec_swf_instance.h"
+#include "swfdec_system.h"
 
 /*** MOVIE ***/
 
@@ -914,6 +915,12 @@ swfdec_movie_get_variable (SwfdecAsObjec
     *flags = 0;
     return TRUE;
   }
+  if (movie->parent == NULL && variable == SWFDEC_AS_STR__version) {
+    SWFDEC_AS_VALUE_SET_STRING (val, swfdec_as_context_get_string (object->context,
+	  SWFDEC_PLAYER (object->context)->system->version));
+    *flags = 0;
+    return TRUE;
+  }
   
   movie = swfdec_movie_get_by_name (SWFDEC_PLAYER (object->context), variable);
   if (movie) {


More information about the Swfdec mailing list