From fb0765f5285b8518b3336a6aa36de1adc37bc1fc Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Jan-Arve=20S=C3=A6ther?= <jan-arve.saether@nokia.com>
Date: Thu, 11 Nov 2010 07:13:35 +0100
Subject: Fix a behaviour change of sizeHint() introduced by 6d4d265e7e67dde58

Commit 6d4d265e7e67dde58e45d7d89f4974d0bd8b70e4 added a behaviour change
in the cases if there was an item with height-for-width and sizeHint()
was called with no constraint.  The commit tried to return the height
needed for the preferred width, but it still did not satisfy the
constraints, since the width used as the constraint could be less than
the preferred width.  This also meant that the sizeHint(Qt::MinimumSize)
could actually be larger than the smallest possible size.

The behaviour should be that it should return the smallest width
possible regardless of height. For instance, for a label it could return
the size of the longest word (to avoid hyphenation issues).

The same logic applies for the height: It should return the smallest
height possible regardless of width. For instance, for a label it could
then return the height of the font.

I also had to fix some stuff in the heightForWidthWithSpanning()
autotest since it wrongly expected the maximum size to be
QWIDGETSIZE_MAX in several of the cases.  However, that is the current
behaviour (and it is a bug), but it is unrelated to the problem with
spans so I simply fix the test and mark them with QEXPECT_FAIL.

Reviewed-by: John Tapsell
---
 src/gui/graphicsview/qgridlayoutengine.cpp         | 95 ++++++++++------------
 .../tst_qgraphicsgridlayout.cpp                    | 19 +++--
 2 files changed, 57 insertions(+), 57 deletions(-)

diff --git a/src/gui/graphicsview/qgridlayoutengine.cpp b/src/gui/graphicsview/qgridlayoutengine.cpp
index e486b4d..9785b15 100644
--- a/src/gui/graphicsview/qgridlayoutengine.cpp
+++ b/src/gui/graphicsview/qgridlayoutengine.cpp
@@ -1107,7 +1107,50 @@ QSizeF QGridLayoutEngine::sizeHint(const QLayoutStyleInfo &styleInfo, Qt::SizeHi
 {
     QGridLayoutBox sizehint_totalBoxes[NOrientations];
 
-    if(rowCount() < 1 || columnCount() < 1 || !hasDynamicConstraint()) {
+    bool sizeHintCalculated = false;
+
+    if (hasDynamicConstraint() && rowCount() > 0 && columnCount() > 0) {
+        if (constraintOrientation() == Qt::Vertical) {
+            //We have items whose height depends on their width
+            if (constraint.width() >= 0) {
+                if(q_cachedDataForStyleInfo != styleInfo)
+                    ensureColumnAndRowData(&q_columnData, &sizehint_totalBoxes[Hor], styleInfo, NULL, NULL, Qt::Horizontal);
+                else
+                    sizehint_totalBoxes[Hor] = q_totalBoxes[Hor];
+                QVector<qreal> sizehint_xx;
+                QVector<qreal> sizehint_widths;
+
+                sizehint_xx.resize(columnCount());
+                sizehint_widths.resize(columnCount());
+                qreal width = constraint.width();
+                //Calculate column widths and positions, and put results in q_xx.data() and q_widths.data() so that we can use this information as
+                //constraints to find the row heights
+                q_columnData.calculateGeometries(0, columnCount(), width, sizehint_xx.data(), sizehint_widths.data(),
+                        0, sizehint_totalBoxes[Hor]);
+                ensureColumnAndRowData(&q_rowData, &sizehint_totalBoxes[Ver], styleInfo, sizehint_xx.data(), sizehint_widths.data(), Qt::Vertical);
+                sizeHintCalculated = true;
+            }
+        } else {
+            if (constraint.height() >= 0) {
+                //We have items whose width depends on their height
+                ensureColumnAndRowData(&q_rowData, &sizehint_totalBoxes[Ver], styleInfo, NULL, NULL, Qt::Vertical);
+                QVector<qreal> sizehint_yy;
+                QVector<qreal> sizehint_heights;
+
+                sizehint_yy.resize(rowCount());
+                sizehint_heights.resize(rowCount());
+                qreal height = constraint.height();
+                //Calculate row heights and positions, and put results in q_yy.data() and q_heights.data() so that we can use this information as
+                //constraints to find the column widths
+                q_rowData.calculateGeometries(0, rowCount(), height, sizehint_yy.data(), sizehint_heights.data(),
+                        0, sizehint_totalBoxes[Ver]);
+                ensureColumnAndRowData(&q_columnData, &sizehint_totalBoxes[Hor], styleInfo, sizehint_yy.data(), sizehint_heights.data(), Qt::Vertical);
+                sizeHintCalculated = true;
+            }
+        }
+    }
+
+    if (!sizeHintCalculated) {
         //No items with height for width, so it doesn't matter which order we do these in
         if(q_cachedDataForStyleInfo != styleInfo) {
             ensureColumnAndRowData(&q_columnData, &sizehint_totalBoxes[Hor], styleInfo, NULL, NULL, Qt::Horizontal);
@@ -1116,55 +1159,7 @@ QSizeF QGridLayoutEngine::sizeHint(const QLayoutStyleInfo &styleInfo, Qt::SizeHi
             sizehint_totalBoxes[Hor] = q_totalBoxes[Hor];
             sizehint_totalBoxes[Ver] = q_totalBoxes[Ver];
         }
-    } else if(constraintOrientation() == Qt::Vertical) {
-        //We have items whose width depends on their height
-        if(q_cachedDataForStyleInfo != styleInfo)
-            ensureColumnAndRowData(&q_columnData, &sizehint_totalBoxes[Hor], styleInfo, NULL, NULL, Qt::Horizontal);
-        else
-            sizehint_totalBoxes[Hor] = q_totalBoxes[Hor];
-        QVector<qreal> sizehint_xx;
-        QVector<qreal> sizehint_widths;
-
-        sizehint_xx.resize(columnCount());
-        sizehint_widths.resize(columnCount());
-        qreal width = constraint.width();
-        if(width < 0) {
-            /* It's not obvious what the behaviour should be. */
-/*            if(which == Qt::MaximumSize)
-                width = sizehint_totalBoxes[Hor].q_maximumSize;
-            else if(which == Qt::MinimumSize)
-                width = sizehint_totalBoxes[Hor].q_minimumSize;
-            else*/
-                width = sizehint_totalBoxes[Hor].q_preferredSize;
-        }
-        //Calculate column widths and positions, and put results in q_xx.data() and q_widths.data() so that we can use this information as
-        //constraints to find the row heights
-        q_columnData.calculateGeometries(0, columnCount(), width, sizehint_xx.data(), sizehint_widths.data(),
-                0, sizehint_totalBoxes[Hor]);
-        ensureColumnAndRowData(&q_rowData, &sizehint_totalBoxes[Ver], styleInfo, sizehint_xx.data(), sizehint_widths.data(), Qt::Vertical);
-    } else {
-        //We have items whose height depends on their width
-        ensureColumnAndRowData(&q_rowData, &sizehint_totalBoxes[Ver], styleInfo, NULL, NULL, Qt::Vertical);
-        QVector<qreal> sizehint_yy;
-        QVector<qreal> sizehint_heights;
-
-        sizehint_yy.resize(rowCount());
-        sizehint_heights.resize(rowCount());
-        qreal height = constraint.height();
-        if(height < 0) {
-/*            if(which == Qt::MaximumSize)
-                height = sizehint_totalBoxes[Ver].q_maximumSize;
-            else if(which == Qt::MinimumSize)
-                height = sizehint_totalBoxes[Ver].q_minimumSize;
-            else*/
-                height = sizehint_totalBoxes[Ver].q_preferredSize;
-        }
-        //Calculate row heights and positions, and put results in q_yy.data() and q_heights.data() so that we can use this information as
-        //constraints to find the column widths
-        q_rowData.calculateGeometries(0, rowCount(), height, sizehint_yy.data(), sizehint_heights.data(),
-                0, sizehint_totalBoxes[Ver]);
-        ensureColumnAndRowData(&q_columnData, &sizehint_totalBoxes[Hor], styleInfo, sizehint_yy.data(), sizehint_heights.data(), Qt::Vertical);
-    }
+     }
 
     switch (which) {
     case Qt::MinimumSize:
diff --git a/tests/auto/qgraphicsgridlayout/tst_qgraphicsgridlayout.cpp b/tests/auto/qgraphicsgridlayout/tst_qgraphicsgridlayout.cpp
index 174e4aa..ff49b27 100644
--- a/tests/auto/qgraphicsgridlayout/tst_qgraphicsgridlayout.cpp
+++ b/tests/auto/qgraphicsgridlayout/tst_qgraphicsgridlayout.cpp
@@ -2556,8 +2556,9 @@ void tst_QGraphicsGridLayout::heightForWidth()
     w11->setSizePolicy(sp);
     layout->addItem(w11, 1, 1);
 
-    QSizeF prefSize = layout->effectiveSizeHint(Qt::PreferredSize, QSizeF(-1, -1));
-    QCOMPARE(prefSize, QSizeF(10+200, 10+100));
+    QCOMPARE(layout->effectiveSizeHint(Qt::MinimumSize, QSizeF(-1, -1)), QSizeF(2, 2));
+    QCOMPARE(layout->effectiveSizeHint(Qt::PreferredSize, QSizeF(-1, -1)), QSizeF(210, 110));
+    QCOMPARE(layout->effectiveSizeHint(Qt::MaximumSize, QSizeF(-1, -1)), QSizeF(30100, 30100));
 
     QCOMPARE(layout->effectiveSizeHint(Qt::MinimumSize, QSizeF(2, -1)), QSizeF(2, 20001));
     QCOMPARE(layout->effectiveSizeHint(Qt::PreferredSize, QSizeF(2, -1)), QSizeF(2, 20010));
@@ -2610,21 +2611,25 @@ void tst_QGraphicsGridLayout::heightForWidthWithSpanning()
     w->setSizePolicy(sp);
     layout->addItem(w, 0,0,2,2);
 
-    QCOMPARE(layout->effectiveSizeHint(Qt::MinimumSize, QSizeF(-1, -1)), QSizeF(1, 100));
+    QCOMPARE(layout->effectiveSizeHint(Qt::MinimumSize, QSizeF(-1, -1)), QSizeF(1, 1));
     QCOMPARE(layout->effectiveSizeHint(Qt::PreferredSize, QSizeF(-1, -1)), QSizeF(200, 100));
-    QCOMPARE(layout->effectiveSizeHint(Qt::MaximumSize, QSizeF(-1, -1)), QSizeF(QWIDGETSIZE_MAX, QWIDGETSIZE_MAX));
+    QEXPECT_FAIL("", "Due to an old bug this wrongly returns QWIDGETSIZE_MAX", Continue);
+    QCOMPARE(layout->effectiveSizeHint(Qt::MaximumSize, QSizeF(-1, -1)), QSizeF(30000, 30000));
 
     QCOMPARE(layout->effectiveSizeHint(Qt::MinimumSize, QSizeF(200, -1)), QSizeF(200, 100));
     QCOMPARE(layout->effectiveSizeHint(Qt::PreferredSize, QSizeF(200, -1)), QSizeF(200, 100));
-    QCOMPARE(layout->effectiveSizeHint(Qt::MaximumSize, QSizeF(200, -1)), QSizeF(200, QWIDGETSIZE_MAX));
+    QEXPECT_FAIL("", "Due to an old bug this wrongly returns QWIDGETSIZE_MAX", Continue);
+    QCOMPARE(layout->effectiveSizeHint(Qt::MaximumSize, QSizeF(200, -1)), QSizeF(200, 100));
 
     QCOMPARE(layout->effectiveSizeHint(Qt::MinimumSize, QSizeF(2, -1)), QSizeF(2, 10000));
     QCOMPARE(layout->effectiveSizeHint(Qt::PreferredSize, QSizeF(2, -1)), QSizeF(2, 10000));
-    QCOMPARE(layout->effectiveSizeHint(Qt::MaximumSize, QSizeF(2, -1)), QSizeF(2, QWIDGETSIZE_MAX));
+    QEXPECT_FAIL("", "Due to an old bug this wrongly returns QWIDGETSIZE_MAX", Continue);
+    QCOMPARE(layout->effectiveSizeHint(Qt::MaximumSize, QSizeF(2, -1)), QSizeF(2, 10000));
 
     QCOMPARE(layout->effectiveSizeHint(Qt::MinimumSize, QSizeF(200, -1)), QSizeF(200, 100));
     QCOMPARE(layout->effectiveSizeHint(Qt::PreferredSize, QSizeF(200, -1)), QSizeF(200, 100));
-    QCOMPARE(layout->effectiveSizeHint(Qt::MaximumSize, QSizeF(200, -1)), QSizeF(200, QWIDGETSIZE_MAX));
+    QEXPECT_FAIL("", "Due to an old bug this wrongly returns QWIDGETSIZE_MAX", Continue);
+    QCOMPARE(layout->effectiveSizeHint(Qt::MaximumSize, QSizeF(200, -1)), QSizeF(200, 10000));
 }
 
 QTEST_MAIN(tst_QGraphicsGridLayout)
-- 
cgit v0.12


From 5c129ceed8cb157354250e1a938f0b8af5dfe507 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Jan-Arve=20S=C3=A6ther?= <jan-arve.saether@nokia.com>
Date: Fri, 12 Nov 2010 12:14:11 +0100
Subject: Add back the tests that were removed by commit
 fcda1b785bd7d86011f49bfe96cb22b04202933f

Also add a proper test for the alignment problem
---
 .../tst_qgraphicsgridlayout.cpp                    | 174 +++++++++++++++++++++
 1 file changed, 174 insertions(+)

diff --git a/tests/auto/qgraphicsgridlayout/tst_qgraphicsgridlayout.cpp b/tests/auto/qgraphicsgridlayout/tst_qgraphicsgridlayout.cpp
index ff49b27..e448e4c 100644
--- a/tests/auto/qgraphicsgridlayout/tst_qgraphicsgridlayout.cpp
+++ b/tests/auto/qgraphicsgridlayout/tst_qgraphicsgridlayout.cpp
@@ -2306,6 +2306,11 @@ static QSizeF hfw1(Qt::SizeHint, const QSizeF &constraint)
     return result;
 }
 
+static QSizeF hfw2(Qt::SizeHint /*which*/, const QSizeF &constraint)
+{
+    return QSizeF(constraint.width(), constraint.width());
+}
+
 void tst_QGraphicsGridLayout::geometries_data()
 {
 
@@ -2361,6 +2366,31 @@ void tst_QGraphicsGridLayout::geometries_data()
                                 << QRectF(0, 1, 50,100) << QRectF(50, 1, 50,400)
                             );
 
+
+    QTest::newRow("hfw-h408") << (ItemList()
+                                    << ItemDesc(0,0)
+                                        .minSize(QSizeF(1,1))
+                                        .preferredSize(QSizeF(50,10))
+                                        .maxSize(QSizeF(100, 100))
+                                    << ItemDesc(0,1)
+                                        .minSize(QSizeF(1,1))
+                                        .preferredSize(QSizeF(50,10))
+                                        .maxSize(QSizeF(100, 100))
+                                    << ItemDesc(1,0)
+                                        .minSize(QSizeF(1,1))
+                                        .preferredSize(QSizeF(50,10))
+                                        .maxSize(QSizeF(100, 100))
+                                    << ItemDesc(1,1)
+                                        .sizeHint(Qt::MinimumSize, QSizeF(40,40))
+                                        .sizeHint(Qt::PreferredSize, QSizeF(50,400))
+                                        .sizeHint(Qt::MaximumSize, QSizeF(500, 500))
+                                        .heightForWidth(hfw1)
+                                )
+                            << QSizeF(100, 408)
+                            << (RectList()
+                                << QRectF(0, 0, 50,  8) << QRectF(50,  0, 50,  8)
+                                << QRectF(0, 8, 50,100) << QRectF(50,  8, 50,400)
+                            );
     QTest::newRow("hfw-h410") << (ItemList()
                                     << ItemDesc(0,0)
                                         .minSize(QSizeF(1,1))
@@ -2386,6 +2416,150 @@ void tst_QGraphicsGridLayout::geometries_data()
                                 << QRectF(0, 10, 50,100) << QRectF(50, 10, 50,400)
                             );
 
+    QTest::newRow("hfw-h470") << (ItemList()
+                                    << ItemDesc(0,0)
+                                        .minSize(QSizeF(1,1))
+                                        .preferredSize(QSizeF(50,10))
+                                        .maxSize(QSizeF(100, 100))
+                                    << ItemDesc(0,1)
+                                        .minSize(QSizeF(1,1))
+                                        .preferredSize(QSizeF(50,10))
+                                        .maxSize(QSizeF(100, 100))
+                                    << ItemDesc(1,0)
+                                        .minSize(QSizeF(1,1))
+                                        .preferredSize(QSizeF(50,10))
+                                        .maxSize(QSizeF(100, 100))
+                                    << ItemDesc(1,1)
+                                        .sizeHint(Qt::MinimumSize, QSizeF(40,40))
+                                        .sizeHint(Qt::PreferredSize, QSizeF(50,400))
+                                        .sizeHint(Qt::MaximumSize, QSizeF(500,500))
+                                        .heightForWidth(hfw1)
+                                )
+                            << QSizeF(100, 470)
+                            << (RectList()
+                                << QRectF(0, 0, 50,70) << QRectF(50, 0, 50,70)
+                                << QRectF(0, 70, 50,100) << QRectF(50, 70, 50,400)
+                            );
+
+
+    // change layout width and verify
+    QTest::newRow("hfw-w100") << (ItemList()
+                                    << ItemDesc(0,0)
+                                        .minSize(QSizeF(1,1))
+                                        .preferredSize(QSizeF(50,10))
+                                        .maxSize(QSizeF(100, 100))
+                                    << ItemDesc(0,1)
+                                        .minSize(QSizeF(1,1))
+                                        .preferredSize(QSizeF(50,10))
+                                        .maxSize(QSizeF(100, 100))
+                                    << ItemDesc(1,0)
+                                        .minSize(QSizeF(1,1))
+                                        .preferredSize(QSizeF(50,10))
+                                        .maxSize(QSizeF(100, 100))
+                                    << ItemDesc(1,1)
+                                        .sizeHint(Qt::MinimumSize, QSizeF(40,40))
+                                        .sizeHint(Qt::PreferredSize, QSizeF(50,400))
+                                        .sizeHint(Qt::MaximumSize, QSizeF(5000,5000))
+                                        .heightForWidth(hfw1)
+                                )
+                            << QSizeF(100, 401)
+                            << (RectList()
+                                << QRectF( 0, 0,  50,   1) << QRectF( 50,  0,  50,   1)
+                                << QRectF( 0, 1,  50, 100) << QRectF( 50,  1,  50, 400)
+                            );
+
+    QTest::newRow("hfw-w160") << (ItemList()
+                                     << ItemDesc(0,0)
+                                         .minSize(QSizeF(1,1))
+                                         .preferredSize(QSizeF(50,10))
+                                         .maxSize(QSizeF(100, 100))
+                                     << ItemDesc(0,1)
+                                         .minSize(QSizeF(1,1))
+                                         .preferredSize(QSizeF(50,10))
+                                         .maxSize(QSizeF(100, 100))
+                                     << ItemDesc(1,0)
+                                         .minSize(QSizeF(1,1))
+                                         .preferredSize(QSizeF(50,10))
+                                         .maxSize(QSizeF(100, 100))
+                                     << ItemDesc(1,1)
+                                         .sizeHint(Qt::MinimumSize, QSizeF(40,40))
+                                         .sizeHint(Qt::PreferredSize, QSizeF(50,400))
+                                         .sizeHint(Qt::MaximumSize, QSizeF(5000,5000))
+                                         .heightForWidth(hfw1)
+                                 )
+                             << QSizeF(160, 401)
+                             << (RectList()
+                                 << QRectF( 0,   0,  80, 100) << QRectF( 80,   0,  80, 100)
+                                 << QRectF( 0, 100,  80, 100) << QRectF( 80, 100,  80, 250)
+                             );
+
+    QTest::newRow("hfw-w500") << (ItemList()
+                                    << ItemDesc(0,0)
+                                        .minSize(QSizeF(1,1))
+                                        .preferredSize(QSizeF(50,10))
+                                        .maxSize(QSizeF(100, 100))
+                                    << ItemDesc(0,1)
+                                        .minSize(QSizeF(1,1))
+                                        .preferredSize(QSizeF(50,10))
+                                        .maxSize(QSizeF(100, 100))
+                                    << ItemDesc(1,0)
+                                        .minSize(QSizeF(1,1))
+                                        .preferredSize(QSizeF(50,10))
+                                        .maxSize(QSizeF(100, 100))
+                                    << ItemDesc(1,1)
+                                        .sizeHint(Qt::MinimumSize, QSizeF(40,40))
+                                        .sizeHint(Qt::PreferredSize, QSizeF(50,400))
+                                        .sizeHint(Qt::MaximumSize, QSizeF(5000,5000))
+                                        .heightForWidth(hfw1)
+                                )
+                            << QSizeF(500, 401)
+                            << (RectList()
+                                << QRectF( 0,   0, 100, 100) << QRectF(100,   0, 100, 100)
+                                << QRectF( 0, 100, 100, 100) << QRectF(100, 100, 400,  50)
+                            );
+
+    QTest::newRow("hfw-alignment-defaults") << (ItemList()
+                                    << ItemDesc(0,0)
+                                        .minSize(QSizeF(100, 100))
+                                        .maxSize(QSizeF(100, 100))
+                                        .heightForWidth(hfw2)
+                                    << ItemDesc(1,0)
+                                        .minSize(QSizeF(200, 200))
+                                        .maxSize(QSizeF(200, 200))
+                                        .heightForWidth(hfw2)
+                                    << ItemDesc(2,0)
+                                        .minSize(QSizeF(300, 300))
+                                        .maxSize(QSizeF(300, 300))
+                                )
+                            << QSizeF(300, 600)
+                            << (RectList()
+                                << QRectF(0, 0,   100, 100)
+                                << QRectF(0, 100, 200, 200)
+                                << QRectF(0, 300, 300, 300)
+                            );
+
+    QTest::newRow("hfw-alignment2") << (ItemList()
+                                    << ItemDesc(0,0)
+                                        .minSize(QSizeF(100, 100))
+                                        .maxSize(QSizeF(100, 100))
+                                        .heightForWidth(hfw2)
+                                        .alignment(Qt::AlignRight)
+                                    << ItemDesc(1,0)
+                                        .minSize(QSizeF(200, 200))
+                                        .maxSize(QSizeF(200, 200))
+                                        .heightForWidth(hfw2)
+                                        .alignment(Qt::AlignHCenter)
+                                    << ItemDesc(2,0)
+                                        .minSize(QSizeF(300, 300))
+                                        .maxSize(QSizeF(300, 300))
+                                )
+                            << QSizeF(300, 600)
+                            << (RectList()
+                                << QRectF(200, 0,   100, 100)
+                                << QRectF( 50, 100, 200, 200)
+                                << QRectF(  0, 300, 300, 300)
+                            );
+
 }
 
 void tst_QGraphicsGridLayout::geometries()
-- 
cgit v0.12


From 8f23788ec21896135f182778cf48362162b88969 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Jan-Arve=20S=C3=A6ther?= <jan-arve.saether@nokia.com>
Date: Fri, 12 Nov 2010 13:16:53 +0100
Subject: Code style cleanup for merge request 847

---
 src/gui/graphicsview/qgridlayoutengine.cpp | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)

diff --git a/src/gui/graphicsview/qgridlayoutengine.cpp b/src/gui/graphicsview/qgridlayoutengine.cpp
index 9785b15..b7fe5a0 100644
--- a/src/gui/graphicsview/qgridlayoutengine.cpp
+++ b/src/gui/graphicsview/qgridlayoutengine.cpp
@@ -637,7 +637,7 @@ QRectF QGridLayoutItem::geometryWithin(qreal x, qreal y, qreal width, qreal heig
             if (dynamicConstraintOrientation() == Qt::Vertical) {
                if (size.width() > cellWidth)
                    size = effectiveMaxSize(QSizeF(cellWidth, -1));
-            } else if(size.height() > cellHeight) {
+            } else if (size.height() > cellHeight) {
                 size = effectiveMaxSize(QSizeF(-1, cellHeight));
             }
         }
@@ -1113,7 +1113,7 @@ QSizeF QGridLayoutEngine::sizeHint(const QLayoutStyleInfo &styleInfo, Qt::SizeHi
         if (constraintOrientation() == Qt::Vertical) {
             //We have items whose height depends on their width
             if (constraint.width() >= 0) {
-                if(q_cachedDataForStyleInfo != styleInfo)
+                if (q_cachedDataForStyleInfo != styleInfo)
                     ensureColumnAndRowData(&q_columnData, &sizehint_totalBoxes[Hor], styleInfo, NULL, NULL, Qt::Horizontal);
                 else
                     sizehint_totalBoxes[Hor] = q_totalBoxes[Hor];
@@ -1152,7 +1152,7 @@ QSizeF QGridLayoutEngine::sizeHint(const QLayoutStyleInfo &styleInfo, Qt::SizeHi
 
     if (!sizeHintCalculated) {
         //No items with height for width, so it doesn't matter which order we do these in
-        if(q_cachedDataForStyleInfo != styleInfo) {
+        if (q_cachedDataForStyleInfo != styleInfo) {
             ensureColumnAndRowData(&q_columnData, &sizehint_totalBoxes[Hor], styleInfo, NULL, NULL, Qt::Horizontal);
             ensureColumnAndRowData(&q_rowData, &sizehint_totalBoxes[Ver], styleInfo, NULL, NULL, Qt::Vertical);
         } else {
@@ -1680,7 +1680,7 @@ void QGridLayoutEngine::ensureGeometries(const QLayoutStyleInfo &styleInfo,
     q_heights.resize(rowCount());
     q_descents.resize(rowCount());
 
-    if(constraintOrientation() != Qt::Horizontal) {
+    if (constraintOrientation() != Qt::Horizontal) {
         //We might have items whose width depends on their height
         ensureColumnAndRowData(&q_columnData, &q_totalBoxes[Hor], styleInfo, NULL, NULL, Qt::Horizontal);
         //Calculate column widths and positions, and put results in q_xx.data() and q_widths.data() so that we can use this information as
-- 
cgit v0.12


From 659c889f64e76ec9aece2dd9e24a7f65875c46ad Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Jan-Arve=20S=C3=A6ther?= <jan-arve.saether@nokia.com>
Date: Mon, 15 Nov 2010 08:56:58 +0100
Subject: Add autotest to test a issue with stretches and preferred width.

The issue seemed to claim that the preferred size was not respected
when there was another item that could stretch along the same axis:
"A widget with a horizontal stretch next to it should get its
preferredWidth()".
This seems to works as expected, so nothing to fix.

Task-number: QTBUG-12835
---
 .../tst_qgraphicsgridlayout.cpp                    | 62 ++++++++++++++++++++++
 1 file changed, 62 insertions(+)

diff --git a/tests/auto/qgraphicsgridlayout/tst_qgraphicsgridlayout.cpp b/tests/auto/qgraphicsgridlayout/tst_qgraphicsgridlayout.cpp
index e448e4c..7170059 100644
--- a/tests/auto/qgraphicsgridlayout/tst_qgraphicsgridlayout.cpp
+++ b/tests/auto/qgraphicsgridlayout/tst_qgraphicsgridlayout.cpp
@@ -122,6 +122,7 @@ private slots:
     void task236367_maxSizeHint();
     void heightForWidth();
     void heightForWidthWithSpanning();
+    void stretchAndHeightForWidth();
 };
 
 class RectWidget : public QGraphicsWidget
@@ -2806,6 +2807,67 @@ void tst_QGraphicsGridLayout::heightForWidthWithSpanning()
     QCOMPARE(layout->effectiveSizeHint(Qt::MaximumSize, QSizeF(200, -1)), QSizeF(200, 10000));
 }
 
+
+void tst_QGraphicsGridLayout::stretchAndHeightForWidth()
+{
+    QGraphicsWidget *widget = new QGraphicsWidget(0, Qt::Window);
+    QGraphicsGridLayout *layout = new QGraphicsGridLayout;
+    widget->setLayout(layout);
+    layout->setContentsMargins(0, 0, 0, 0);
+    layout->setSpacing(0);
+
+    RectWidget *w1 = new RectWidget;
+    w1->setSizeHint(Qt::MinimumSize, QSizeF(10, 10));
+    w1->setSizeHint(Qt::PreferredSize, QSizeF(100, 100));
+    w1->setSizeHint(Qt::MaximumSize, QSizeF(500, 500));
+    layout->addItem(w1, 0,0,1,1);
+
+    RectWidget *w2 = new RectWidget;
+    w2->setSizeHint(Qt::MinimumSize, QSizeF(10, 10));
+    w2->setSizeHint(Qt::PreferredSize, QSizeF(100, 100));
+    w2->setSizeHint(Qt::MaximumSize, QSizeF(500, 500));
+    layout->addItem(w2, 0,1,1,1);
+    layout->setColumnStretchFactor(1, 2);
+
+    QApplication::sendPostedEvents();
+    QGraphicsScene scene;
+    QGraphicsView *view = new QGraphicsView(&scene);
+
+    scene.addItem(widget);
+
+    view->show();
+
+    widget->resize(500, 100);
+    // w1 should stay at its preferred size
+    QCOMPARE(w1->geometry(), QRectF(0, 0, 100, 100));
+    QCOMPARE(w2->geometry(), QRectF(100, 0, 400, 100));
+
+
+    // only w1 has hfw
+    w1->setConstraintFunction(hfw);
+    QSizePolicy sp(QSizePolicy::Preferred, QSizePolicy::Preferred);
+    sp.setHeightForWidth(true);
+    w1->setSizePolicy(sp);
+    QApplication::sendPostedEvents();
+
+    QCOMPARE(w1->geometry(), QRectF(0, 0, 100, 200));
+    QCOMPARE(w2->geometry(), QRectF(100, 0, 400, 200));
+
+    // only w2 has hfw
+    w2->setConstraintFunction(hfw);
+    w2->setSizePolicy(sp);
+
+    w1->setConstraintFunction(0);
+    sp.setHeightForWidth(false);
+    w1->setSizePolicy(sp);
+    QApplication::sendPostedEvents();
+
+    QCOMPARE(w1->geometry(), QRectF(0, 0, 100, 100));
+    QCOMPARE(w2->geometry(), QRectF(100, 0, 400, 50));
+
+}
+
+
 QTEST_MAIN(tst_QGraphicsGridLayout)
 #include "tst_qgraphicsgridlayout.moc"
 
-- 
cgit v0.12


From 604c51f1fc5c79b7fad12cda911b06b9e6e5005f Mon Sep 17 00:00:00 2001
From: John Tapsell <john.tapsell.ext@basyskom.de>
Date: Mon, 15 Nov 2010 12:55:06 +0100
Subject: Fix item alignment in layouts bigger than the items thay they contain
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Task-number: QTBUG-13551
Task-number: QTBUG-7756

Merge-request: 894
Reviewed-by: Jan-Arve Sæther <jan-arve.saether@nokia.com>
---
 src/gui/graphicsview/qgridlayoutengine.cpp         | 92 ++++++++++++++--------
 src/gui/graphicsview/qgridlayoutengine_p.h         |  7 +-
 .../tst_qgraphicsgridlayout.cpp                    | 70 +++++++++++++---
 .../tst_qgraphicslinearlayout.cpp                  | 85 ++++++++++++++++++++
 4 files changed, 208 insertions(+), 46 deletions(-)

diff --git a/src/gui/graphicsview/qgridlayoutengine.cpp b/src/gui/graphicsview/qgridlayoutengine.cpp
index b7fe5a0..f1055ba 100644
--- a/src/gui/graphicsview/qgridlayoutengine.cpp
+++ b/src/gui/graphicsview/qgridlayoutengine.cpp
@@ -166,7 +166,7 @@ void QGridLayoutRowData::reset(int count)
     hasIgnoreFlag = false;
 }
 
-void QGridLayoutRowData::distributeMultiCells()
+void QGridLayoutRowData::distributeMultiCells(const QGridLayoutRowInfo &rowInfo)
 {
     MultiCellMap::const_iterator i = multiCellMap.constBegin();
     for (; i != multiCellMap.constEnd(); ++i) {
@@ -185,7 +185,7 @@ void QGridLayoutRowData::distributeMultiCells()
             qreal extra = compare(box, totalBox, j);
             if (extra > 0.0) {
                 calculateGeometries(start, end, box.q_sizes(j), dummy.data(), newSizes.data(),
-                                    0, totalBox);
+                                    0, totalBox, rowInfo);
 
                 for (int k = 0; k < span; ++k)
                     extras[k].q_sizes(j) = newSizes[k];
@@ -202,11 +202,12 @@ void QGridLayoutRowData::distributeMultiCells()
 
 void QGridLayoutRowData::calculateGeometries(int start, int end, qreal targetSize, qreal *positions,
                                              qreal *sizes, qreal *descents,
-                                             const QGridLayoutBox &totalBox)
+                                             const QGridLayoutBox &totalBox,
+                                             const QGridLayoutRowInfo &rowInfo)
 {
     Q_ASSERT(end > start);
 
-    targetSize = qBound(totalBox.q_minimumSize, targetSize, totalBox.q_maximumSize);
+    targetSize = qMax(totalBox.q_minimumSize, targetSize);
 
     int n = end - start;
     QVarLengthArray<qreal> newSizes(n);
@@ -246,16 +247,22 @@ void QGridLayoutRowData::calculateGeometries(int start, int end, qreal targetSiz
             }
         }
     } else {
-        stealBox(start, end, PreferredSize, positions, sizes);
+        bool isLargerThanMaximum = (targetSize > totalBox.q_maximumSize);
+        if (isLargerThanMaximum) {
+            stealBox(start, end, MaximumSize, positions, sizes);
+            sumAvailable = targetSize - totalBox.q_maximumSize;
+        } else {
+            stealBox(start, end, PreferredSize, positions, sizes);
+            sumAvailable = targetSize - totalBox.q_preferredSize;
+        }
 
-        sumAvailable = targetSize - totalBox.q_preferredSize;
         if (sumAvailable > 0.0) {
             qreal sumCurrentAvailable = sumAvailable;
             bool somethingHasAMaximumSize = false;
 
-            qreal sumPreferredSizes = 0.0;
+            qreal sumSizes = 0.0;
             for (int i = 0; i < n; ++i)
-                sumPreferredSizes += sizes[i];
+                sumSizes += sizes[i];
 
             for (int i = 0; i < n; ++i) {
                 if (ignore.testBit(start + i)) {
@@ -265,7 +272,16 @@ void QGridLayoutRowData::calculateGeometries(int start, int end, qreal targetSiz
                 }
 
                 const QGridLayoutBox &box = boxes.at(start + i);
-                qreal desired = box.q_maximumSize - box.q_preferredSize;
+                qreal boxSize;
+
+                qreal desired;
+                if (isLargerThanMaximum) {
+                    boxSize = box.q_maximumSize;
+                    desired = rowInfo.boxes.value(start + i).q_maximumSize - boxSize;
+                } else {
+                    boxSize = box.q_preferredSize;
+                    desired = box.q_maximumSize - boxSize;
+                }
                 if (desired == 0.0) {
                     newSizes[i] = sizes[i];
                     factors[i] = 0.0;
@@ -284,17 +300,17 @@ void QGridLayoutRowData::calculateGeometries(int start, int end, qreal targetSiz
                     } else if (stretch <= 0) {
                         factors[i] = 0.0;
                     } else {
-                        qreal ultimatePreferredSize;
-                        qreal ultimateSumPreferredSizes;
-                        qreal x = ((stretch * sumPreferredSizes)
-                                   - (sumStretches * box.q_preferredSize))
+                        qreal ultimateSize;
+                        qreal ultimateSumSizes;
+                        qreal x = ((stretch * sumSizes)
+                                   - (sumStretches * boxSize))
                                   / (sumStretches - stretch);
                         if (x >= 0.0) {
-                            ultimatePreferredSize = box.q_preferredSize + x;
-                            ultimateSumPreferredSizes = sumPreferredSizes + x;
+                            ultimateSize = boxSize + x;
+                            ultimateSumSizes = sumSizes + x;
                         } else {
-                            ultimatePreferredSize = box.q_preferredSize;
-                            ultimateSumPreferredSizes = (sumStretches * box.q_preferredSize)
+                            ultimateSize = boxSize;
+                            ultimateSumSizes = (sumStretches * boxSize)
                                                         / stretch;
                         }
 
@@ -303,17 +319,17 @@ void QGridLayoutRowData::calculateGeometries(int start, int end, qreal targetSiz
                             (at the expense of the stretch factors, which are not fully respected
                             during the transition).
                         */
-                        ultimatePreferredSize = ultimatePreferredSize * 3 / 2;
-                        ultimateSumPreferredSizes = ultimateSumPreferredSizes * 3 / 2;
+                        ultimateSize = ultimateSize * 3 / 2;
+                        ultimateSumSizes = ultimateSumSizes * 3 / 2;
 
-                        qreal beta = ultimateSumPreferredSizes - sumPreferredSizes;
+                        qreal beta = ultimateSumSizes - sumSizes;
                         if (!beta) {
                             factors[i] = 1;
                         } else {
                             qreal alpha = qMin(sumCurrentAvailable, beta);
-                            qreal ultimateFactor = (stretch * ultimateSumPreferredSizes / sumStretches)
-                                                   - (box.q_preferredSize);
-                            qreal transitionalFactor = sumCurrentAvailable * (ultimatePreferredSize - box.q_preferredSize) / beta;
+                            qreal ultimateFactor = (stretch * ultimateSumSizes / sumStretches)
+                                                   - (boxSize);
+                            qreal transitionalFactor = sumCurrentAvailable * (ultimateSize - boxSize) / beta;
 
                             factors[i] = ((alpha * ultimateFactor)
                                           + ((beta - alpha) * transitionalFactor)) / beta;
@@ -336,11 +352,16 @@ void QGridLayoutRowData::calculateGeometries(int start, int end, qreal targetSiz
                     if (newSizes[i] >= 0.0)
                         continue;
 
-                    const QGridLayoutBox &box = boxes.at(start + i);
+                    qreal maxBoxSize;
+                    if (isLargerThanMaximum)
+                        maxBoxSize = rowInfo.boxes.value(start + i).q_maximumSize;
+                    else
+                        maxBoxSize = boxes.at(start + i).q_maximumSize;
+
                     qreal avail = sumCurrentAvailable * factors[i] / sumFactors;
-                    if (sizes[i] + avail >= box.q_maximumSize) {
-                        newSizes[i] = box.q_maximumSize;
-                        sumCurrentAvailable -= box.q_maximumSize - sizes[i];
+                    if (sizes[i] + avail >= maxBoxSize) {
+                        newSizes[i] = maxBoxSize;
+                        sumCurrentAvailable -= maxBoxSize - sizes[i];
                         sumFactors -= factors[i];
                         keepGoing = (sumCurrentAvailable > 0.0);
                         if (!keepGoing)
@@ -1126,7 +1147,7 @@ QSizeF QGridLayoutEngine::sizeHint(const QLayoutStyleInfo &styleInfo, Qt::SizeHi
                 //Calculate column widths and positions, and put results in q_xx.data() and q_widths.data() so that we can use this information as
                 //constraints to find the row heights
                 q_columnData.calculateGeometries(0, columnCount(), width, sizehint_xx.data(), sizehint_widths.data(),
-                        0, sizehint_totalBoxes[Hor]);
+                        0, sizehint_totalBoxes[Hor], q_infos[Hor]);
                 ensureColumnAndRowData(&q_rowData, &sizehint_totalBoxes[Ver], styleInfo, sizehint_xx.data(), sizehint_widths.data(), Qt::Vertical);
                 sizeHintCalculated = true;
             }
@@ -1143,7 +1164,7 @@ QSizeF QGridLayoutEngine::sizeHint(const QLayoutStyleInfo &styleInfo, Qt::SizeHi
                 //Calculate row heights and positions, and put results in q_yy.data() and q_heights.data() so that we can use this information as
                 //constraints to find the column widths
                 q_rowData.calculateGeometries(0, rowCount(), height, sizehint_yy.data(), sizehint_heights.data(),
-                        0, sizehint_totalBoxes[Ver]);
+                        0, sizehint_totalBoxes[Ver], q_infos[Ver]);
                 ensureColumnAndRowData(&q_columnData, &sizehint_totalBoxes[Hor], styleInfo, sizehint_yy.data(), sizehint_heights.data(), Qt::Vertical);
                 sizeHintCalculated = true;
             }
@@ -1159,7 +1180,7 @@ QSizeF QGridLayoutEngine::sizeHint(const QLayoutStyleInfo &styleInfo, Qt::SizeHi
             sizehint_totalBoxes[Hor] = q_totalBoxes[Hor];
             sizehint_totalBoxes[Ver] = q_totalBoxes[Ver];
         }
-     }
+    }
 
     switch (which) {
     case Qt::MinimumSize:
@@ -1617,7 +1638,8 @@ void QGridLayoutEngine::ensureColumnAndRowData(QGridLayoutRowData *rowData, QGri
 {
     rowData->reset(rowCount(orientation));
     fillRowData(rowData, styleInfo, colPositions, colSizes, orientation);
-    rowData->distributeMultiCells();
+    const QGridLayoutRowInfo &rowInfo = q_infos[orientation == Qt::Vertical];
+    rowData->distributeMultiCells(rowInfo);
     *totalBox = rowData->totalBox(0, rowCount(orientation));
         //We have items whose width depends on their height
 }
@@ -1686,22 +1708,22 @@ void QGridLayoutEngine::ensureGeometries(const QLayoutStyleInfo &styleInfo,
         //Calculate column widths and positions, and put results in q_xx.data() and q_widths.data() so that we can use this information as
         //constraints to find the row heights
         q_columnData.calculateGeometries(0, columnCount(), size.width(), q_xx.data(), q_widths.data(),
-                0, q_totalBoxes[Hor]);
+                0, q_totalBoxes[Hor], q_infos[Hor] );
         ensureColumnAndRowData(&q_rowData, &q_totalBoxes[Ver], styleInfo, q_xx.data(), q_widths.data(), Qt::Vertical);
         //Calculate row heights and positions, and put results in q_yy.data() and q_heights.data()
         q_rowData.calculateGeometries(0, rowCount(), size.height(), q_yy.data(), q_heights.data(),
-                q_descents.data(), q_totalBoxes[Ver]);
+                q_descents.data(), q_totalBoxes[Ver], q_infos[Ver]);
     } else {
         //We have items whose height depends on their width
         ensureColumnAndRowData(&q_rowData, &q_totalBoxes[Ver], styleInfo, NULL, NULL, Qt::Vertical);
         //Calculate row heights and positions, and put results in q_yy.data() and q_heights.data() so that we can use this information as
         //constraints to find the column widths
         q_rowData.calculateGeometries(0, rowCount(), size.height(), q_yy.data(), q_heights.data(),
-                q_descents.data(), q_totalBoxes[Ver]);
+                q_descents.data(), q_totalBoxes[Ver], q_infos[Ver]);
         ensureColumnAndRowData(&q_columnData, &q_totalBoxes[Hor], styleInfo, q_yy.data(), q_heights.data(), Qt::Horizontal);
         //Calculate row heights and positions, and put results in q_yy.data() and q_heights.data()
         q_columnData.calculateGeometries(0, columnCount(), size.width(), q_xx.data(), q_widths.data(),
-                0, q_totalBoxes[Hor]);
+                0, q_totalBoxes[Hor], q_infos[Hor]);
     }
 }
 
diff --git a/src/gui/graphicsview/qgridlayoutengine_p.h b/src/gui/graphicsview/qgridlayoutengine_p.h
index 02c74b0..44efbba 100644
--- a/src/gui/graphicsview/qgridlayoutengine_p.h
+++ b/src/gui/graphicsview/qgridlayoutengine_p.h
@@ -224,13 +224,16 @@ public:
 
 typedef QMap<QPair<int, int>, QGridLayoutMultiCellData> MultiCellMap;
 
+class QGridLayoutRowInfo;
+
 class QGridLayoutRowData
 {
 public:
     void reset(int count);
-    void distributeMultiCells();
+    void distributeMultiCells(const QGridLayoutRowInfo &rowInfo);
     void calculateGeometries(int start, int end, qreal targetSize, qreal *positions, qreal *sizes,
-                             qreal *descents, const QGridLayoutBox &totalBox);
+                             qreal *descents, const QGridLayoutBox &totalBox,
+                             const QGridLayoutRowInfo &rowInfo);
     QGridLayoutBox totalBox(int start, int end) const;
     void stealBox(int start, int end, int which, qreal *positions, qreal *sizes);
 
diff --git a/tests/auto/qgraphicsgridlayout/tst_qgraphicsgridlayout.cpp b/tests/auto/qgraphicsgridlayout/tst_qgraphicsgridlayout.cpp
index 7170059..248778f 100644
--- a/tests/auto/qgraphicsgridlayout/tst_qgraphicsgridlayout.cpp
+++ b/tests/auto/qgraphicsgridlayout/tst_qgraphicsgridlayout.cpp
@@ -700,6 +700,10 @@ void tst_QGraphicsGridLayout::columnMaximumWidth()
     layout->setContentsMargins(0, 0, 0, 0);
     layout->setSpacing(0);
 
+    QCOMPARE(layout->minimumSize(), QSizeF(10+10+10, 10+10));
+    QCOMPARE(layout->preferredSize(), QSizeF(25+25+25, 25+25));
+    QCOMPARE(layout->maximumSize(), QSizeF(50+50+50, 50+50));
+    
     // should at least be a very large number
     QVERIFY(layout->columnMaximumWidth(0) >= 10000);
     QCOMPARE(layout->columnMaximumWidth(0), layout->columnMaximumWidth(1));
@@ -707,17 +711,65 @@ void tst_QGraphicsGridLayout::columnMaximumWidth()
     layout->setColumnMaximumWidth(0, 20);
     layout->setColumnMaximumWidth(2, 60);
 
-    view.show();
-    widget->show();
+    QCOMPARE(layout->minimumSize(), QSizeF(10+10+10, 10+10));
+    QCOMPARE(layout->preferredSize(), QSizeF(20+25+25, 25+25));
+    QCOMPARE(layout->maximumSize(), QSizeF(20+50+60, 50+50));
+    QCOMPARE(layout->maximumSize(), widget->maximumSize());
+
     widget->resize(widget->effectiveSizeHint(Qt::PreferredSize));
-    QApplication::processEvents();
+    layout->activate();
 
-    QCOMPARE(layout->itemAt(0,0)->geometry().width(), 20.0);
-    QCOMPARE(layout->itemAt(1,0)->geometry().width(), 20.0);
-    QCOMPARE(layout->itemAt(0,1)->geometry().width(), 25.0);
-    QCOMPARE(layout->itemAt(1,1)->geometry().width(), 25.0);
-    QCOMPARE(layout->itemAt(0,2)->geometry().width(), 25.0);
-    QCOMPARE(layout->itemAt(1,2)->geometry().width(), 25.0);
+    QCOMPARE(layout->itemAt(0,0)->geometry(), QRectF(0, 0, 20, 25));
+    QCOMPARE(layout->itemAt(1,0)->geometry(), QRectF(0, 25, 20, 25));
+    QCOMPARE(layout->itemAt(0,1)->geometry(), QRectF(20, 0, 25, 25));
+    QCOMPARE(layout->itemAt(1,1)->geometry(), QRectF(20, 25, 25, 25));
+    QCOMPARE(layout->itemAt(0,2)->geometry(), QRectF(45, 0, 25, 25));
+    QCOMPARE(layout->itemAt(1,2)->geometry(), QRectF(45, 25, 25, 25));
+
+    layout->setColumnAlignment(2, Qt::AlignCenter); //FIXME This shouldn't be needed because the documentation says that center is default
+    widget->resize(widget->effectiveSizeHint(Qt::MaximumSize));
+    layout->activate();
+    QCOMPARE(layout->geometry(), QRectF(0,0,20+50+60, 50+50));
+    QCOMPARE(layout->itemAt(0,0)->geometry(), QRectF(0, 0, 20, 50));
+    QCOMPARE(layout->itemAt(1,0)->geometry(), QRectF(0, 50, 20, 50));
+    QCOMPARE(layout->itemAt(0,1)->geometry(), QRectF(20, 0, 50, 50));
+    QCOMPARE(layout->itemAt(1,1)->geometry(), QRectF(20, 50, 50, 50));
+    QCOMPARE(layout->itemAt(0,2)->geometry(), QRectF(75, 0, 50, 50));
+    QCOMPARE(layout->itemAt(1,2)->geometry(), QRectF(75, 50, 50, 50));
+
+    for(int i = 0; i < layout->count(); i++)
+        layout->setAlignment(layout->itemAt(i), Qt::AlignRight | Qt::AlignBottom);
+    layout->activate();
+    QCOMPARE(layout->itemAt(0,0)->geometry(), QRectF(0, 0, 20, 50));
+    QCOMPARE(layout->itemAt(1,0)->geometry(), QRectF(0, 50, 20, 50));
+    QCOMPARE(layout->itemAt(0,1)->geometry(), QRectF(20, 0, 50, 50));
+    QCOMPARE(layout->itemAt(1,1)->geometry(), QRectF(20, 50, 50, 50));
+    QCOMPARE(layout->itemAt(0,2)->geometry(), QRectF(80, 0, 50, 50));
+    QCOMPARE(layout->itemAt(1,2)->geometry(), QRectF(80, 50, 50, 50));
+    for(int i = 0; i < layout->count(); i++)
+        layout->setAlignment(layout->itemAt(i), Qt::AlignCenter);
+
+    layout->setMaximumSize(layout->maximumSize() + QSizeF(60,60));
+    widget->resize(widget->effectiveSizeHint(Qt::MaximumSize));
+    layout->activate();
+    
+    QCOMPARE(layout->itemAt(0,0)->geometry(), QRectF(0, 15, 20, 50));
+    QCOMPARE(layout->itemAt(1,0)->geometry(), QRectF(0, 95, 20, 50));
+    QCOMPARE(layout->itemAt(0,1)->geometry(), QRectF(20+30, 15, 50, 50));
+    QCOMPARE(layout->itemAt(1,1)->geometry(), QRectF(20+30, 95, 50, 50));
+    QCOMPARE(layout->itemAt(0,2)->geometry(), QRectF(20+60+50+5, 15, 50, 50));
+    QCOMPARE(layout->itemAt(1,2)->geometry(), QRectF(20+60+50+5, 95, 50, 50));
+
+    layout->setMaximumSize(layout->preferredSize() + QSizeF(20,20));
+    widget->resize(widget->effectiveSizeHint(Qt::MaximumSize));
+    layout->activate();
+
+    QCOMPARE(layout->itemAt(0,0)->geometry(), QRectF(0, 0, 20, 35));
+    QCOMPARE(layout->itemAt(1,0)->geometry(), QRectF(0, 35, 20, 35));
+    QCOMPARE(layout->itemAt(0,1)->geometry(), QRectF(20, 0, 35, 35));
+    QCOMPARE(layout->itemAt(1,1)->geometry(), QRectF(20, 35, 35, 35));
+    QCOMPARE(layout->itemAt(0,2)->geometry(), QRectF(55, 0, 35, 35));
+    QCOMPARE(layout->itemAt(1,2)->geometry(), QRectF(55, 35, 35, 35));
 
     delete widget;
 }
diff --git a/tests/auto/qgraphicslinearlayout/tst_qgraphicslinearlayout.cpp b/tests/auto/qgraphicslinearlayout/tst_qgraphicslinearlayout.cpp
index 6107fa1..e271aee 100644
--- a/tests/auto/qgraphicslinearlayout/tst_qgraphicslinearlayout.cpp
+++ b/tests/auto/qgraphicslinearlayout/tst_qgraphicslinearlayout.cpp
@@ -103,6 +103,8 @@ private slots:
     void removeLayout();
     void avoidRecursionInInsertItem();
     void styleInfoLeak();
+    void testAlignmentInLargerLayout();
+    void testOffByOneInLargerLayout();
 
     // Task specific tests
     void task218400_insertStretchCrash();
@@ -1465,6 +1467,89 @@ void tst_QGraphicsLinearLayout::task218400_insertStretchCrash()
     form->setLayout(layout); // crash
 }
 
+void tst_QGraphicsLinearLayout::testAlignmentInLargerLayout()
+{
+    QGraphicsScene *scene = new QGraphicsScene;
+    QGraphicsWidget *form = new QGraphicsWidget;
+    scene->addItem(form);
+    QGraphicsLinearLayout *layout = new QGraphicsLinearLayout(Qt::Vertical, form);
+    layout->setSpacing(0);
+    layout->setContentsMargins(0,0,0,0);
+
+    QGraphicsWidget *a = new QGraphicsWidget;
+    a->setMaximumSize(100,100);
+    layout->addItem(a);
+
+    QCOMPARE(form->maximumSize(), QSizeF(100,100));
+    QCOMPARE(layout->maximumSize(), QSizeF(100,100));
+    layout->setMinimumSize(QSizeF(200,200));
+    layout->setMaximumSize(QSizeF(200,200));
+
+    layout->setAlignment(a, Qt::AlignCenter);
+    layout->activate();
+    QCOMPARE(a->geometry(), QRectF(50,50,100,100));
+
+    layout->setAlignment(a, Qt::AlignRight | Qt::AlignBottom);
+    layout->activate();
+    QCOMPARE(a->geometry(), QRectF(100,100,100,100));
+
+    layout->setAlignment(a, Qt::AlignHCenter | Qt::AlignTop);
+    layout->activate();
+    QCOMPARE(a->geometry(), QRectF(50,0,100,100));
+
+    QGraphicsWidget *b = new QGraphicsWidget;
+    b->setMaximumSize(100,100);
+    layout->addItem(b);
+
+    layout->setAlignment(a, Qt::AlignCenter);
+    layout->setAlignment(b, Qt::AlignCenter);
+    layout->activate();
+    QCOMPARE(a->geometry(), QRectF(50,0,100,100));
+    QCOMPARE(b->geometry(), QRectF(50,100,100,100));
+
+    layout->setAlignment(a, Qt::AlignRight | Qt::AlignBottom);
+    layout->setAlignment(b, Qt::AlignLeft | Qt::AlignTop);
+    layout->activate();
+    QCOMPARE(a->geometry(), QRectF(100,0,100,100));
+    QCOMPARE(b->geometry(), QRectF(0,100,100,100));
+}
+
+void tst_QGraphicsLinearLayout::testOffByOneInLargerLayout() {
+    QGraphicsScene *scene = new QGraphicsScene;
+    QGraphicsWidget *form = new QGraphicsWidget;
+    scene->addItem(form);
+    QGraphicsLinearLayout *layout = new QGraphicsLinearLayout(Qt::Vertical, form);
+    layout->setSpacing(0);
+    layout->setContentsMargins(0,0,0,0);
+
+    QGraphicsWidget *a = new QGraphicsWidget;
+    QGraphicsWidget *b = new QGraphicsWidget;
+    a->setMaximumSize(100,100);
+    b->setMaximumSize(100,100);
+    layout->addItem(a);
+    layout->addItem(b);
+
+    layout->setAlignment(a, Qt::AlignRight | Qt::AlignBottom);
+    layout->setAlignment(b, Qt::AlignLeft | Qt::AlignTop);
+    layout->setMinimumSize(QSizeF(101,201));
+    layout->setMaximumSize(QSizeF(101,201));
+    layout->activate();
+    QCOMPARE(a->geometry(), QRectF(1,0.5,100,100));
+    QCOMPARE(b->geometry(), QRectF(0,100.5,100,100));
+
+    layout->setMinimumSize(QSizeF(100,200));
+    layout->setMaximumSize(QSizeF(100,200));
+    layout->activate();
+    QCOMPARE(a->geometry(), QRectF(0,0,100,100));
+    QCOMPARE(b->geometry(), QRectF(0,100,100,100));
+ 
+    layout->setMinimumSize(QSizeF(99,199));
+    layout->setMaximumSize(QSizeF(99,199));
+    layout->activate();
+    QCOMPARE(a->geometry(), QRectF(0,0,99,99.5));
+    QCOMPARE(b->geometry(), QRectF(0,99.5,99,99.5));
+}
+
 QTEST_MAIN(tst_QGraphicsLinearLayout)
 #include "tst_qgraphicslinearlayout.moc"
 
-- 
cgit v0.12


From 1781b3c876b4e1025b2a85f4e7975c171b1a1404 Mon Sep 17 00:00:00 2001
From: John Tapsell <john.tapsell.ext@basyskom.de>
Date: Mon, 15 Nov 2010 12:55:13 +0100
Subject: Change the QGraphics*Layout documentation to match the code - that
 the default alignment is top-left.
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

This includes unit tests to confirm that the alignment is top-left in a
variety of different cases.

Merge-request: 894
Reviewed-by: Jan-Arve Sæther <jan-arve.saether@nokia.com>
---
 src/gui/graphicsview/qgraphicsgridlayout.cpp       | 11 ++++++
 src/gui/graphicsview/qgraphicslinearlayout.cpp     |  4 +-
 .../tst_qgraphicsgridlayout.cpp                    | 45 +++++++++++++++++++++-
 .../tst_qgraphicslinearlayout.cpp                  | 33 ++++++++++++++++
 4 files changed, 89 insertions(+), 4 deletions(-)

diff --git a/src/gui/graphicsview/qgraphicsgridlayout.cpp b/src/gui/graphicsview/qgraphicsgridlayout.cpp
index 3fc7f10..c3bb6c3 100644
--- a/src/gui/graphicsview/qgraphicsgridlayout.cpp
+++ b/src/gui/graphicsview/qgraphicsgridlayout.cpp
@@ -64,6 +64,17 @@
     removeAt() will remove an item from the layout, without
     destroying it.
 
+    \section1 Size Hints and Size Policies in QGraphicsGridLayout
+
+    QGraphicsGridLayout respects each item's size hints and size policies,
+    and when the layout contains more space than the items can fill, each item
+    is arranged according to the layout's alignment for that item. You can set
+    an alignment for each item by calling setAlignment(), and check the
+    alignment for any item by calling alignment(). You can also set the alignment
+    for an entire row or column by calling setRowAlignment() and setColumnAlignment()
+    respectively.  By default, items are aligned to the top left.
+
+
     \sa QGraphicsLinearLayout, QGraphicsWidget
 */
 
diff --git a/src/gui/graphicsview/qgraphicslinearlayout.cpp b/src/gui/graphicsview/qgraphicslinearlayout.cpp
index 7e8d19f..244a728 100644
--- a/src/gui/graphicsview/qgraphicslinearlayout.cpp
+++ b/src/gui/graphicsview/qgraphicslinearlayout.cpp
@@ -75,7 +75,7 @@
     is arranged according to the layout's alignment for that item. You can set
     an alignment for each item by calling setAlignment(), and check the
     alignment for any item by calling alignment(). By default, items are
-    centered both vertically and horizontally.
+    aligned to the top left.
 
     \section1 Spacing within QGraphicsLinearLayout
 
@@ -446,7 +446,7 @@ void QGraphicsLinearLayout::setAlignment(QGraphicsLayoutItem *item, Qt::Alignmen
 
 /*!
     Returns the alignment for \a item. The default alignment is
-    Qt::AlignCenter.
+    Qt::AlignTop | Qt::AlignLeft.
 
     The alignment decides how the item is positioned within its assigned space
     in the case where there's more space available in the layout than the
diff --git a/tests/auto/qgraphicsgridlayout/tst_qgraphicsgridlayout.cpp b/tests/auto/qgraphicsgridlayout/tst_qgraphicsgridlayout.cpp
index 248778f..8d1f282 100644
--- a/tests/auto/qgraphicsgridlayout/tst_qgraphicsgridlayout.cpp
+++ b/tests/auto/qgraphicsgridlayout/tst_qgraphicsgridlayout.cpp
@@ -123,6 +123,7 @@ private slots:
     void heightForWidth();
     void heightForWidthWithSpanning();
     void stretchAndHeightForWidth();
+    void testDefaultAlignment();
 };
 
 class RectWidget : public QGraphicsWidget
@@ -726,7 +727,7 @@ void tst_QGraphicsGridLayout::columnMaximumWidth()
     QCOMPARE(layout->itemAt(0,2)->geometry(), QRectF(45, 0, 25, 25));
     QCOMPARE(layout->itemAt(1,2)->geometry(), QRectF(45, 25, 25, 25));
 
-    layout->setColumnAlignment(2, Qt::AlignCenter); //FIXME This shouldn't be needed because the documentation says that center is default
+    layout->setColumnAlignment(2, Qt::AlignCenter);
     widget->resize(widget->effectiveSizeHint(Qt::MaximumSize));
     layout->activate();
     QCOMPARE(layout->geometry(), QRectF(0,0,20+50+60, 50+50));
@@ -2859,7 +2860,6 @@ void tst_QGraphicsGridLayout::heightForWidthWithSpanning()
     QCOMPARE(layout->effectiveSizeHint(Qt::MaximumSize, QSizeF(200, -1)), QSizeF(200, 10000));
 }
 
-
 void tst_QGraphicsGridLayout::stretchAndHeightForWidth()
 {
     QGraphicsWidget *widget = new QGraphicsWidget(0, Qt::Window);
@@ -2919,7 +2919,48 @@ void tst_QGraphicsGridLayout::stretchAndHeightForWidth()
 
 }
 
+void tst_QGraphicsGridLayout::testDefaultAlignment()
+{
+    QGraphicsWidget *widget = new QGraphicsWidget;
+    QGraphicsGridLayout *layout = new QGraphicsGridLayout(widget);
+    layout->setContentsMargins(0, 0, 0, 0);
+    layout->setSpacing(0);
+
+    QGraphicsWidget *w = new QGraphicsWidget;
+    w->setMinimumSize(50,50);
+    w->setMaximumSize(50,50);
+    layout->addItem(w,0,0);
+
+    //Default alignment should be to the top-left
 
+    //First, check by forcing the layout to be bigger
+    layout->setMinimumSize(100,100);
+    layout->activate();
+    QCOMPARE(layout->geometry(), QRectF(0,0,100,100));
+    QCOMPARE(w->geometry(), QRectF(0,0,50,50));
+    layout->setMinimumSize(-1,-1);
+
+    //Second, check by forcing the column and row to be bigger instead
+    layout->setColumnMinimumWidth(0, 100);
+    layout->setRowMinimumHeight(0, 100);
+    layout->activate();
+    QCOMPARE(layout->geometry(), QRectF(0,0,100,100));
+    QCOMPARE(w->geometry(), QRectF(0,0,50,50));
+    layout->setMinimumSize(-1,-1);
+    layout->setColumnMinimumWidth(0, 0);
+    layout->setRowMinimumHeight(0, 0);
+
+
+    //Third, check by adding a larger item in the column
+    QGraphicsWidget *w2 = new QGraphicsWidget;
+    w2->setMinimumSize(100,100);
+    w2->setMaximumSize(100,100);
+    layout->addItem(w2,1,0);
+    layout->activate();
+    QCOMPARE(layout->geometry(), QRectF(0,0,100,150));
+    QCOMPARE(w->geometry(), QRectF(0,0,50,50));
+    QCOMPARE(w2->geometry(), QRectF(0,50,100,100));
+}
 QTEST_MAIN(tst_QGraphicsGridLayout)
 #include "tst_qgraphicsgridlayout.moc"
 
diff --git a/tests/auto/qgraphicslinearlayout/tst_qgraphicslinearlayout.cpp b/tests/auto/qgraphicslinearlayout/tst_qgraphicslinearlayout.cpp
index e271aee..cbc90be 100644
--- a/tests/auto/qgraphicslinearlayout/tst_qgraphicslinearlayout.cpp
+++ b/tests/auto/qgraphicslinearlayout/tst_qgraphicslinearlayout.cpp
@@ -105,6 +105,7 @@ private slots:
     void styleInfoLeak();
     void testAlignmentInLargerLayout();
     void testOffByOneInLargerLayout();
+    void testDefaultAlignment();
 
     // Task specific tests
     void task218400_insertStretchCrash();
@@ -1549,6 +1550,38 @@ void tst_QGraphicsLinearLayout::testOffByOneInLargerLayout() {
     QCOMPARE(a->geometry(), QRectF(0,0,99,99.5));
     QCOMPARE(b->geometry(), QRectF(0,99.5,99,99.5));
 }
+void tst_QGraphicsLinearLayout::testDefaultAlignment()
+{
+    QGraphicsWidget *widget = new QGraphicsWidget;
+    QGraphicsLinearLayout *layout = new QGraphicsLinearLayout(Qt::Vertical, widget);
+    layout->setContentsMargins(0, 0, 0, 0);
+    layout->setSpacing(0);
+
+    QGraphicsWidget *w = new QGraphicsWidget;
+    w->setMinimumSize(50,50);
+    w->setMaximumSize(50,50);
+    layout->addItem(w);
+
+    //Default alignment should be to the top-left
+    QCOMPARE(layout->alignment(w), 0);
+
+    //First, check by forcing the layout to be bigger
+    layout->setMinimumSize(100,100);
+    layout->activate();
+    QCOMPARE(layout->geometry(), QRectF(0,0,100,100));
+    QCOMPARE(w->geometry(), QRectF(0,0,50,50));
+    layout->setMinimumSize(-1,-1);
+
+    //Second, check by adding a larger item in the column
+    QGraphicsWidget *w2 = new QGraphicsWidget;
+    w2->setMinimumSize(100,100);
+    w2->setMaximumSize(100,100);
+    layout->addItem(w2);
+    layout->activate();
+    QCOMPARE(layout->geometry(), QRectF(0,0,100,150));
+    QCOMPARE(w->geometry(), QRectF(0,0,50,50));
+    QCOMPARE(w2->geometry(), QRectF(0,50,100,100));
+}
 
 QTEST_MAIN(tst_QGraphicsLinearLayout)
 #include "tst_qgraphicslinearlayout.moc"
-- 
cgit v0.12


From f0990583431166e721d038e150ba00b0edc4e105 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Jan-Arve=20S=C3=A6ther?= <jan-arve.saether@nokia.com>
Date: Mon, 15 Nov 2010 14:28:59 +0100
Subject: Some improvements to the docs that was added in merge request 894

---
 src/gui/graphicsview/qgraphicsgridlayout.cpp | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/gui/graphicsview/qgraphicsgridlayout.cpp b/src/gui/graphicsview/qgraphicsgridlayout.cpp
index c3bb6c3..20ebab6 100644
--- a/src/gui/graphicsview/qgraphicsgridlayout.cpp
+++ b/src/gui/graphicsview/qgraphicsgridlayout.cpp
@@ -67,7 +67,7 @@
     \section1 Size Hints and Size Policies in QGraphicsGridLayout
 
     QGraphicsGridLayout respects each item's size hints and size policies,
-    and when the layout contains more space than the items can fill, each item
+    and when a cell in the grid has more space than the items can fill, each item
     is arranged according to the layout's alignment for that item. You can set
     an alignment for each item by calling setAlignment(), and check the
     alignment for any item by calling alignment(). You can also set the alignment
-- 
cgit v0.12


From 68fc0a299b9268007ae68f5d8a8dce40ed1e4e0c Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Jan-Arve=20S=C3=A6ther?= <jan-arve.saether@nokia.com>
Date: Mon, 15 Nov 2010 14:33:51 +0100
Subject: Adhere to code style

---
 tests/auto/qgraphicsgridlayout/tst_qgraphicsgridlayout.cpp     | 8 ++++----
 tests/auto/qgraphicslinearlayout/tst_qgraphicslinearlayout.cpp | 2 +-
 2 files changed, 5 insertions(+), 5 deletions(-)

diff --git a/tests/auto/qgraphicsgridlayout/tst_qgraphicsgridlayout.cpp b/tests/auto/qgraphicsgridlayout/tst_qgraphicsgridlayout.cpp
index 8d1f282..2e52c4e 100644
--- a/tests/auto/qgraphicsgridlayout/tst_qgraphicsgridlayout.cpp
+++ b/tests/auto/qgraphicsgridlayout/tst_qgraphicsgridlayout.cpp
@@ -704,7 +704,7 @@ void tst_QGraphicsGridLayout::columnMaximumWidth()
     QCOMPARE(layout->minimumSize(), QSizeF(10+10+10, 10+10));
     QCOMPARE(layout->preferredSize(), QSizeF(25+25+25, 25+25));
     QCOMPARE(layout->maximumSize(), QSizeF(50+50+50, 50+50));
-    
+
     // should at least be a very large number
     QVERIFY(layout->columnMaximumWidth(0) >= 10000);
     QCOMPARE(layout->columnMaximumWidth(0), layout->columnMaximumWidth(1));
@@ -738,7 +738,7 @@ void tst_QGraphicsGridLayout::columnMaximumWidth()
     QCOMPARE(layout->itemAt(0,2)->geometry(), QRectF(75, 0, 50, 50));
     QCOMPARE(layout->itemAt(1,2)->geometry(), QRectF(75, 50, 50, 50));
 
-    for(int i = 0; i < layout->count(); i++)
+    for (int i = 0; i < layout->count(); i++)
         layout->setAlignment(layout->itemAt(i), Qt::AlignRight | Qt::AlignBottom);
     layout->activate();
     QCOMPARE(layout->itemAt(0,0)->geometry(), QRectF(0, 0, 20, 50));
@@ -747,13 +747,13 @@ void tst_QGraphicsGridLayout::columnMaximumWidth()
     QCOMPARE(layout->itemAt(1,1)->geometry(), QRectF(20, 50, 50, 50));
     QCOMPARE(layout->itemAt(0,2)->geometry(), QRectF(80, 0, 50, 50));
     QCOMPARE(layout->itemAt(1,2)->geometry(), QRectF(80, 50, 50, 50));
-    for(int i = 0; i < layout->count(); i++)
+    for (int i = 0; i < layout->count(); i++)
         layout->setAlignment(layout->itemAt(i), Qt::AlignCenter);
 
     layout->setMaximumSize(layout->maximumSize() + QSizeF(60,60));
     widget->resize(widget->effectiveSizeHint(Qt::MaximumSize));
     layout->activate();
-    
+
     QCOMPARE(layout->itemAt(0,0)->geometry(), QRectF(0, 15, 20, 50));
     QCOMPARE(layout->itemAt(1,0)->geometry(), QRectF(0, 95, 20, 50));
     QCOMPARE(layout->itemAt(0,1)->geometry(), QRectF(20+30, 15, 50, 50));
diff --git a/tests/auto/qgraphicslinearlayout/tst_qgraphicslinearlayout.cpp b/tests/auto/qgraphicslinearlayout/tst_qgraphicslinearlayout.cpp
index cbc90be..965e340 100644
--- a/tests/auto/qgraphicslinearlayout/tst_qgraphicslinearlayout.cpp
+++ b/tests/auto/qgraphicslinearlayout/tst_qgraphicslinearlayout.cpp
@@ -1543,7 +1543,7 @@ void tst_QGraphicsLinearLayout::testOffByOneInLargerLayout() {
     layout->activate();
     QCOMPARE(a->geometry(), QRectF(0,0,100,100));
     QCOMPARE(b->geometry(), QRectF(0,100,100,100));
- 
+
     layout->setMinimumSize(QSizeF(99,199));
     layout->setMaximumSize(QSizeF(99,199));
     layout->activate();
-- 
cgit v0.12


From 2c40c98a5b3ff4f16c4ad71b5707d5271945819e Mon Sep 17 00:00:00 2001
From: Sami Merila <sami.merila@nokia.com>
Date: Thu, 18 Nov 2010 12:15:03 +0200
Subject: QToolbar should fill available width on Symbian

Normally QStyle provides a minimum size for a widget. However, to
imitate native toolbar behavior, QToolBar should occupy available
screen estate on Symbian (with QS60Style). This is only supported
for horizontal QToolBars as native side does not have same
functionality for vertical toolbars.

QToolbar size now tries to take into account available size of
parent reduced by margins (if several parents, then each can reduce
the available space by their margins). Also, toolbar internal
pixel metrics data (item spacing, item margins) are taken into
account.

Task-number: QTBUG-13120
Reviewed-by: Janne Koskinen
---
 src/gui/styles/qs60style.cpp | 50 ++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 50 insertions(+)

diff --git a/src/gui/styles/qs60style.cpp b/src/gui/styles/qs60style.cpp
index 5fe9050..5eddc98 100644
--- a/src/gui/styles/qs60style.cpp
+++ b/src/gui/styles/qs60style.cpp
@@ -2536,6 +2536,56 @@ QSize QS60Style::sizeFromContents(ContentsType ct, const QStyleOption *opt,
             if (const QStyleOptionToolButton *toolBtn = qstyleoption_cast<const QStyleOptionToolButton *>(opt))
                 if (toolBtn->subControls & SC_ToolButtonMenu)
                     sz += QSize(pixelMetric(PM_MenuButtonIndicator), 0);
+
+            //Make toolbuttons in toolbar stretch the whole screen area
+            if (widget && qobject_cast<const QToolBar *>(widget->parentWidget())) {
+                const QToolBar *tb = qobject_cast<const QToolBar *>(widget->parentWidget());
+                const bool parentCanGrowHorizontally = !(tb->sizePolicy().horizontalPolicy() == QSizePolicy::Fixed ||
+                        tb->sizePolicy().horizontalPolicy() == QSizePolicy::Maximum) && tb->orientation() == Qt::Horizontal;
+
+                if (parentCanGrowHorizontally) {
+                    int visibleButtons = 0;
+                    //Make the auto-stretch to happen only for horizontal orientation
+                    if (tb && tb->orientation() == Qt::Horizontal) {
+                        QList<QAction*> actionList =  tb->actions();
+                        for (int i = 0; i < actionList.count(); i++) {
+                            if (actionList.at(i)->isVisible())
+                                visibleButtons++;
+                        }
+                    }
+
+                    if (widget->parentWidget() && visibleButtons > 0) {
+                        QWidget *w = const_cast<QWidget *>(widget);
+                        int toolBarMaxWidth = 0;
+                        int totalMargin = 0;
+                        while (w) {
+                            //honor fixed width parents
+                            if (w->maximumWidth() == w->minimumWidth())
+                                toolBarMaxWidth = qMax(toolBarMaxWidth, w->maximumWidth());
+                            if (w->layout() && w->windowType() == Qt::Widget) {
+                                totalMargin += w->layout()->contentsMargins().left() +
+                                               w->layout()->contentsMargins().right();
+                            }
+                            w = w->parentWidget();
+                        }
+                        totalMargin += 2 * pixelMetric(QStyle::PM_ToolBarFrameWidth);
+
+                        if (toolBarMaxWidth == 0)
+                            toolBarMaxWidth =
+                                QApplication::desktop()->availableGeometry(widget->parentWidget()).width();
+                        //Reduce the margins, toolbar frame, item spacing and internal margin from available area
+                        toolBarMaxWidth -= totalMargin;
+
+                        //ensure that buttons are side-by-side and not on top of each other
+                        const int toolButtonWidth = (toolBarMaxWidth / visibleButtons)
+                                - pixelMetric(QStyle::PM_ToolBarItemSpacing)
+                                - pixelMetric(QStyle::PM_ToolBarItemMargin)
+                        //toolbar frame needs to be reduced again, since QToolBarLayout adds it for each toolbar action
+                                - 2 * pixelMetric(QStyle::PM_ToolBarFrameWidth) - 1;
+                        sz.setWidth(qMax(toolButtonWidth, sz.width()));
+                    }
+                }
+            }
             break;
         case CT_PushButton:
             sz = QCommonStyle::sizeFromContents( ct, opt, csz, widget);
-- 
cgit v0.12


From faf0e9966c319ac774db3d4967d902772c30e526 Mon Sep 17 00:00:00 2001
From: Sami Merila <sami.merila@nokia.com>
Date: Thu, 18 Nov 2010 13:06:10 +0200
Subject: Tactile Feedback plugin is not compiled in latest Sym^3 RnD envs

Due to somewhat questionable .pro-file flagging, the plugin is not
currently compiled at all for latest Sym^3 environments.

Flagging is now more bulletproof (not 3.1 & not 3.2), so even if the
upcoming platform versions change, this should work in the future.

Task-number: QTBUG-15428
Reviewed-by: Mikka Heikkinen
---
 src/plugins/s60/feedback/feedback.pro | 2 +-
 src/plugins/s60/s60.pro               | 2 +-
 src/s60installs/s60installs.pro       | 2 +-
 3 files changed, 3 insertions(+), 3 deletions(-)

diff --git a/src/plugins/s60/feedback/feedback.pro b/src/plugins/s60/feedback/feedback.pro
index 1069220..5e577ec 100644
--- a/src/plugins/s60/feedback/feedback.pro
+++ b/src/plugins/s60/feedback/feedback.pro
@@ -6,7 +6,7 @@ QTDIR_build:DESTDIR = $$QT_BUILD_TREE/plugins/s60/feedback
 
 INCLUDEPATH += $$APP_LAYER_SYSTEMINCLUDE
 
-contains(S60_VERSION, 5.0)|contains(S60_VERSION, symbian3) {
+!contains(S60_VERSION, 3.1):!contains(S60_VERSION, 3.2) {
     HEADERS += qtactileFeedback.h
     SOURCES += qtactileFeedback_s60.cpp
 
diff --git a/src/plugins/s60/s60.pro b/src/plugins/s60/s60.pro
index ffcd170..1ddf326 100644
--- a/src/plugins/s60/s60.pro
+++ b/src/plugins/s60/s60.pro
@@ -6,7 +6,7 @@ symbian {
         SUBDIRS += 3_1 3_2
     }
 
-    contains(S60_VERSION, 5.0)|contains(S60_VERSION, symbian3) {
+    !contains(S60_VERSION, 3.1):!contains(S60_VERSION, 3.2) {
         SUBDIRS += feedback
     }
 
diff --git a/src/s60installs/s60installs.pro b/src/s60installs/s60installs.pro
index 65b8781..7827fb6 100644
--- a/src/s60installs/s60installs.pro
+++ b/src/s60installs/s60installs.pro
@@ -87,7 +87,7 @@ symbian: {
         DEPLOYMENT += bearer_plugin
     }
 
-    contains(S60_VERSION, 5.0)|contains(S60_VERSION, symbian3) {
+    !contains(S60_VERSION, 3.1):!contains(S60_VERSION, 3.2) {
         feedback_plugin.sources = $$QT_BUILD_TREE/plugins/s60/feedback/qtactilefeedback$${QT_LIBINFIX}.dll
         feedback_plugin.path = c:$$QT_PLUGINS_BASE_DIR/feedback
         DEPLOYMENT += feedback_plugin
-- 
cgit v0.12


From 31feffb92570c6e13618cc2d0d03a5f243a7e350 Mon Sep 17 00:00:00 2001
From: Sami Merila <sami.merila@nokia.com>
Date: Thu, 18 Nov 2010 13:06:10 +0200
Subject: Tactile Feedback plugin is not compiled in latest Sym^3 RnD envs

Due to somewhat questionable .pro-file flagging, the plugin is not
currently compiled at all for latest Sym^3 environments.

Flagging is now more bulletproof (not 3.1 & not 3.2), so even if the
upcoming platform versions change, this should work in the future.

Task-number: QTBUG-15428
Reviewed-by: Miikka Heikkinen
---
 src/plugins/s60/feedback/feedback.pro | 2 +-
 src/plugins/s60/s60.pro               | 2 +-
 src/s60installs/s60installs.pro       | 2 +-
 3 files changed, 3 insertions(+), 3 deletions(-)

diff --git a/src/plugins/s60/feedback/feedback.pro b/src/plugins/s60/feedback/feedback.pro
index 1069220..5e577ec 100644
--- a/src/plugins/s60/feedback/feedback.pro
+++ b/src/plugins/s60/feedback/feedback.pro
@@ -6,7 +6,7 @@ QTDIR_build:DESTDIR = $$QT_BUILD_TREE/plugins/s60/feedback
 
 INCLUDEPATH += $$APP_LAYER_SYSTEMINCLUDE
 
-contains(S60_VERSION, 5.0)|contains(S60_VERSION, symbian3) {
+!contains(S60_VERSION, 3.1):!contains(S60_VERSION, 3.2) {
     HEADERS += qtactileFeedback.h
     SOURCES += qtactileFeedback_s60.cpp
 
diff --git a/src/plugins/s60/s60.pro b/src/plugins/s60/s60.pro
index ffcd170..1ddf326 100644
--- a/src/plugins/s60/s60.pro
+++ b/src/plugins/s60/s60.pro
@@ -6,7 +6,7 @@ symbian {
         SUBDIRS += 3_1 3_2
     }
 
-    contains(S60_VERSION, 5.0)|contains(S60_VERSION, symbian3) {
+    !contains(S60_VERSION, 3.1):!contains(S60_VERSION, 3.2) {
         SUBDIRS += feedback
     }
 
diff --git a/src/s60installs/s60installs.pro b/src/s60installs/s60installs.pro
index 65b8781..7827fb6 100644
--- a/src/s60installs/s60installs.pro
+++ b/src/s60installs/s60installs.pro
@@ -87,7 +87,7 @@ symbian: {
         DEPLOYMENT += bearer_plugin
     }
 
-    contains(S60_VERSION, 5.0)|contains(S60_VERSION, symbian3) {
+    !contains(S60_VERSION, 3.1):!contains(S60_VERSION, 3.2) {
         feedback_plugin.sources = $$QT_BUILD_TREE/plugins/s60/feedback/qtactilefeedback$${QT_LIBINFIX}.dll
         feedback_plugin.path = c:$$QT_PLUGINS_BASE_DIR/feedback
         DEPLOYMENT += feedback_plugin
-- 
cgit v0.12


From a26d41fc2732e225dc9a1b5eb5224cc499ae87b4 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Jan-Arve=20S=C3=A6ther?= <jan-arve.saether@nokia.com>
Date: Thu, 18 Nov 2010 15:06:45 +0100
Subject: Improve performance of hfw in qgridlayoutengine by adding more
 caching.

The previous code tried to do caching of queries with constraints too,
but it's usecase was rather limited.
The caching worked for the simple case of
effectiveSizeHint(Qt::PreferredSize, QSize(10, -1));
effectiveSizeHint(Qt::PreferredSize, QSize(10, -1));    // uses cache

The problem was that if somebody called this sequence:
effectiveSizeHint(Qt::PreferredSize, QSize(10, -1));
effectiveSizeHint(Qt::PreferredSize, QSize(-1, -1));
effectiveSizeHint(Qt::PreferredSize, QSize(10, -1));

Each call would disregard the cache because the constraint was
different.

Now the pattern is used in the qgridlayoutengine itself when we
calculate hfw: (yes, height-for-width).
First, we ask for the horizontal size hints with no constraints.
Then, we'll ask for the vertical size hints with constraints.
Since horizontal and vertical ultimately comes from the same function
(effectiveSizeHint) it will invalidate the cache each time.

The solution is to add another cache for the sizeHints with
constraints.

The most notable improvement is in the hfw, nested case. Result:
RESULT : tst_QGraphicsLinearLayout::heightForWidth():"hfw, nested":
     546 msecs per iteration (total: 546, iterations: 1)

RESULT : tst_QGraphicsLinearLayout::heightForWidth():"hfw, nested":
     0.000029 msecs per iteration (total: 62, iterations: 2097152)

Improvement: 18,827,586 times faster (!!)
---
 src/gui/graphicsview/qgraphicslayoutitem.cpp       |  35 ++++--
 src/gui/graphicsview/qgraphicslayoutitem_p.h       |   2 +
 .../qgraphicslinearlayout.pro                      |   6 +
 .../tst_qgraphicslinearlayout.cpp                  | 133 +++++++++++++++++++++
 4 files changed, 165 insertions(+), 11 deletions(-)
 create mode 100644 tests/benchmarks/gui/graphicsview/qgraphicslinearlayout/qgraphicslinearlayout.pro
 create mode 100644 tests/benchmarks/gui/graphicsview/qgraphicslinearlayout/tst_qgraphicslinearlayout.cpp

diff --git a/src/gui/graphicsview/qgraphicslayoutitem.cpp b/src/gui/graphicsview/qgraphicslayoutitem.cpp
index e43f7fa..016cfbf 100644
--- a/src/gui/graphicsview/qgraphicslayoutitem.cpp
+++ b/src/gui/graphicsview/qgraphicslayoutitem.cpp
@@ -137,19 +137,28 @@ void QGraphicsLayoutItemPrivate::init()
 QSizeF *QGraphicsLayoutItemPrivate::effectiveSizeHints(const QSizeF &constraint) const
 {
     Q_Q(const QGraphicsLayoutItem);
-    if (!sizeHintCacheDirty && cachedConstraint == constraint)
-        return cachedSizeHints;
+    QSizeF *sizeHintCache;
+    const bool hasConstraint = constraint.width() >= 0 || constraint.height() >= 0;
+    if (hasConstraint) {
+        if (!sizeHintWithConstraintCacheDirty && constraint == cachedConstraint)
+            return cachedSizeHintsWithConstraints;
+        sizeHintCache = cachedSizeHintsWithConstraints;
+    } else {
+        if (!sizeHintCacheDirty)
+            return cachedSizeHints;
+        sizeHintCache = cachedSizeHints;
+    }
 
     for (int i = 0; i < Qt::NSizeHints; ++i) {
-        cachedSizeHints[i] = constraint;
+        sizeHintCache[i] = constraint;
         if (userSizeHints)
-            combineSize(cachedSizeHints[i], userSizeHints[i]);
+            combineSize(sizeHintCache[i], userSizeHints[i]);
     }
 
-    QSizeF &minS = cachedSizeHints[Qt::MinimumSize];
-    QSizeF &prefS = cachedSizeHints[Qt::PreferredSize];
-    QSizeF &maxS = cachedSizeHints[Qt::MaximumSize];
-    QSizeF &descentS = cachedSizeHints[Qt::MinimumDescent];
+    QSizeF &minS = sizeHintCache[Qt::MinimumSize];
+    QSizeF &prefS = sizeHintCache[Qt::PreferredSize];
+    QSizeF &maxS = sizeHintCache[Qt::MaximumSize];
+    QSizeF &descentS = sizeHintCache[Qt::MinimumDescent];
 
     normalizeHints(minS.rwidth(), prefS.rwidth(), maxS.rwidth(), descentS.rwidth());
     normalizeHints(minS.rheight(), prefS.rheight(), maxS.rheight(), descentS.rheight());
@@ -175,9 +184,13 @@ QSizeF *QGraphicsLayoutItemPrivate::effectiveSizeHints(const QSizeF &constraint)
     // Not supported yet
     // COMBINE_SIZE(descentS, q->sizeHint(Qt::MinimumDescent, constraint));
 
-    cachedConstraint = constraint;
-    sizeHintCacheDirty = false;
-    return cachedSizeHints;
+    if (hasConstraint) {
+        cachedConstraint = constraint;
+        sizeHintWithConstraintCacheDirty = false;
+    } else {
+        sizeHintCacheDirty = false;
+    }
+    return sizeHintCache;
 }
 
 
diff --git a/src/gui/graphicsview/qgraphicslayoutitem_p.h b/src/gui/graphicsview/qgraphicslayoutitem_p.h
index b752e03..d72ee9f 100644
--- a/src/gui/graphicsview/qgraphicslayoutitem_p.h
+++ b/src/gui/graphicsview/qgraphicslayoutitem_p.h
@@ -85,8 +85,10 @@ public:
     QSizeF *userSizeHints;
     mutable QSizeF cachedSizeHints[Qt::NSizeHints];
     mutable QSizeF cachedConstraint;
+    mutable QSizeF cachedSizeHintsWithConstraints[Qt::NSizeHints];
 
     mutable quint32 sizeHintCacheDirty : 1;
+    mutable quint32 sizeHintWithConstraintCacheDirty : 1;
     quint32 isLayout : 1;
     quint32 ownedByLayout : 1;
 
diff --git a/tests/benchmarks/gui/graphicsview/qgraphicslinearlayout/qgraphicslinearlayout.pro b/tests/benchmarks/gui/graphicsview/qgraphicslinearlayout/qgraphicslinearlayout.pro
new file mode 100644
index 0000000..ff85fe8
--- /dev/null
+++ b/tests/benchmarks/gui/graphicsview/qgraphicslinearlayout/qgraphicslinearlayout.pro
@@ -0,0 +1,6 @@
+load(qttest_p4)
+TEMPLATE = app
+TARGET = tst_bench_qgraphicslinearlayout
+
+SOURCES += tst_qgraphicslinearlayout.cpp
+
diff --git a/tests/benchmarks/gui/graphicsview/qgraphicslinearlayout/tst_qgraphicslinearlayout.cpp b/tests/benchmarks/gui/graphicsview/qgraphicslinearlayout/tst_qgraphicslinearlayout.cpp
new file mode 100644
index 0000000..0dd9543
--- /dev/null
+++ b/tests/benchmarks/gui/graphicsview/qgraphicslinearlayout/tst_qgraphicslinearlayout.cpp
@@ -0,0 +1,133 @@
+/****************************************************************************
+**
+** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the test suite of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include <QtTest/QtTest>
+#include <QtGui/qgraphicslinearlayout.h>
+#include <QtGui/qgraphicswidget.h>
+#include <QtGui/qgraphicsview.h>
+
+class tst_QGraphicsLinearLayout : public QObject
+{
+    Q_OBJECT
+public:
+    tst_QGraphicsLinearLayout() {}
+    ~tst_QGraphicsLinearLayout() {}
+
+private slots:
+    void heightForWidth_data();
+    void heightForWidth();
+};
+
+
+struct MySquareWidget : public QGraphicsWidget
+{
+    MySquareWidget() {}
+    virtual QSizeF  sizeHint ( Qt::SizeHint which, const QSizeF & constraint = QSizeF() ) const
+    {
+        if (which != Qt::PreferredSize)
+            return QGraphicsWidget::sizeHint(which, constraint);
+        if (constraint.width() < 0)
+            return QGraphicsWidget::sizeHint(which, constraint);
+        return QSizeF(constraint.width(), constraint.width());
+    }
+};
+
+void tst_QGraphicsLinearLayout::heightForWidth_data()
+{
+    QTest::addColumn<bool>("hfw");
+    QTest::addColumn<bool>("nested");
+
+    QTest::newRow("hfw") << true << false;
+    QTest::newRow("hfw, nested") << true << true;
+    QTest::newRow("not hfw") << false << false;
+    QTest::newRow("not hfw, nested") << false << true;
+}
+
+void tst_QGraphicsLinearLayout::heightForWidth()
+{
+    QFETCH(bool, hfw);
+    QFETCH(bool, nested);
+
+    QGraphicsScene scene;
+    QGraphicsWidget *form = new QGraphicsWidget;
+    scene.addItem(form);
+
+    QGraphicsLinearLayout *outerlayout = 0;
+    if (nested) {
+       outerlayout = new QGraphicsLinearLayout(form);
+       for(int i = 0; i < 8; i++) {
+           QGraphicsLinearLayout *layout = new QGraphicsLinearLayout(Qt::Vertical);
+           outerlayout->addItem(layout);
+           outerlayout = layout;
+       }
+    }
+
+    QGraphicsLinearLayout *qlayout = 0;
+    qlayout = new QGraphicsLinearLayout(Qt::Vertical);
+    if (nested)
+        outerlayout->addItem(qlayout);
+    else
+        form->setLayout(qlayout);
+
+    MySquareWidget *widget = new MySquareWidget;
+    for (int i = 0; i < 1; i++) {
+        widget = new MySquareWidget;
+        QSizePolicy sizepolicy = widget->sizePolicy();
+        sizepolicy.setHeightForWidth(hfw);
+        widget->setSizePolicy(sizepolicy);
+        qlayout->addItem(widget);
+    }
+    // make sure only one iteration is done.
+    // run with tst_QGraphicsLinearLayout.exe "heightForWidth" -tickcounter -iterations 6
+    // this will iterate 6 times the whole test, (not only the benchmark)
+    // which should reduce warmup time and give a realistic picture of the performance of
+    // effectiveSizeHint()
+    QSizeF constraint(hfw ? 100 : -1, -1);
+    QBENCHMARK {
+        (void)form->effectiveSizeHint(Qt::PreferredSize, constraint);
+    }
+
+}
+
+
+QTEST_MAIN(tst_QGraphicsLinearLayout)
+
+#include "tst_qgraphicslinearlayout.moc"
-- 
cgit v0.12


From 4258dd04e25c8831be9e8a7dc45b52d34782cb35 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Jan-Arve=20S=C3=A6ther?= <jan-arve.saether@nokia.com>
Date: Fri, 19 Nov 2010 11:19:32 +0100
Subject: Fix the tests that got affected by the behaviour added in
 604c51f1fc5c79

Task-number: QTBUG-13551
Task-number: QTBUG-7756
---
 tests/auto/qgraphicsgridlayout/tst_qgraphicsgridlayout.cpp | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/tests/auto/qgraphicsgridlayout/tst_qgraphicsgridlayout.cpp b/tests/auto/qgraphicsgridlayout/tst_qgraphicsgridlayout.cpp
index 2e52c4e..35ea059 100644
--- a/tests/auto/qgraphicsgridlayout/tst_qgraphicsgridlayout.cpp
+++ b/tests/auto/qgraphicsgridlayout/tst_qgraphicsgridlayout.cpp
@@ -2541,7 +2541,7 @@ void tst_QGraphicsGridLayout::geometries_data()
                                          .sizeHint(Qt::MaximumSize, QSizeF(5000,5000))
                                          .heightForWidth(hfw1)
                                  )
-                             << QSizeF(160, 401)
+                             << QSizeF(160, 350)
                              << (RectList()
                                  << QRectF( 0,   0,  80, 100) << QRectF( 80,   0,  80, 100)
                                  << QRectF( 0, 100,  80, 100) << QRectF( 80, 100,  80, 250)
@@ -2566,7 +2566,7 @@ void tst_QGraphicsGridLayout::geometries_data()
                                         .sizeHint(Qt::MaximumSize, QSizeF(5000,5000))
                                         .heightForWidth(hfw1)
                                 )
-                            << QSizeF(500, 401)
+                            << QSizeF(500, 200)
                             << (RectList()
                                 << QRectF( 0,   0, 100, 100) << QRectF(100,   0, 100, 100)
                                 << QRectF( 0, 100, 100, 100) << QRectF(100, 100, 400,  50)
-- 
cgit v0.12


From b0691b5a95c80ecd94867873e912e6952a2ec1b4 Mon Sep 17 00:00:00 2001
From: Sami Merila <sami.merila@nokia.com>
Date: Fri, 19 Nov 2010 12:45:46 +0200
Subject: QS60Style: Null pointer crash when using itemviews in some cases

QS60Style attempts to use null pointer when drawing CE_ItemViewItem,
if the parameter widget is provided as null.

This leads to, for example, Chart example app crash in startup.

Reviewed-by: Janne Anttila
---
 src/gui/styles/qs60style.cpp | 9 +++++----
 1 file changed, 5 insertions(+), 4 deletions(-)

diff --git a/src/gui/styles/qs60style.cpp b/src/gui/styles/qs60style.cpp
index 5fe9050..22cb7d6 100644
--- a/src/gui/styles/qs60style.cpp
+++ b/src/gui/styles/qs60style.cpp
@@ -1438,10 +1438,11 @@ void QS60Style::drawControl(ControlElement element, const QStyleOption *option,
             const QRect iconRect = subElementRect(SE_ItemViewItemDecoration, &voptAdj, widget);
             QRect textRect = subElementRect(SE_ItemViewItemText, &voptAdj, widget);
             const QAbstractItemView *itemView = qobject_cast<const QAbstractItemView *>(widget);
-            const bool singleSelection =
-                (itemView->selectionMode() == QAbstractItemView::SingleSelection ||
-                 itemView->selectionMode() == QAbstractItemView::NoSelection);
-            const bool selectItems = (itemView->selectionBehavior() == QAbstractItemView::SelectItems);
+            
+            const bool singleSelection = itemView && 
+                ((itemView->selectionMode() == QAbstractItemView::SingleSelection ||
+                 itemView->selectionMode() == QAbstractItemView::NoSelection));
+            const bool selectItems = itemView && (itemView->selectionBehavior() == QAbstractItemView::SelectItems);
 
             // draw themed background for itemview unless background brush has been defined.
             if (vopt->backgroundBrush == Qt::NoBrush) {
-- 
cgit v0.12


From 1be70363b77b0a2ff75a23b5973861922f7a85c7 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Jan-Arve=20S=C3=A6ther?= <jan-arve.saether@nokia.com>
Date: Fri, 19 Nov 2010 11:47:42 +0100
Subject: Fix code style

---
 .../graphicsview/qgraphicslinearlayout/tst_qgraphicslinearlayout.cpp    | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/tests/benchmarks/gui/graphicsview/qgraphicslinearlayout/tst_qgraphicslinearlayout.cpp b/tests/benchmarks/gui/graphicsview/qgraphicslinearlayout/tst_qgraphicslinearlayout.cpp
index 0dd9543..dc415fb 100644
--- a/tests/benchmarks/gui/graphicsview/qgraphicslinearlayout/tst_qgraphicslinearlayout.cpp
+++ b/tests/benchmarks/gui/graphicsview/qgraphicslinearlayout/tst_qgraphicslinearlayout.cpp
@@ -93,7 +93,7 @@ void tst_QGraphicsLinearLayout::heightForWidth()
     QGraphicsLinearLayout *outerlayout = 0;
     if (nested) {
        outerlayout = new QGraphicsLinearLayout(form);
-       for(int i = 0; i < 8; i++) {
+       for (int i = 0; i < 8; i++) {
            QGraphicsLinearLayout *layout = new QGraphicsLinearLayout(Qt::Vertical);
            outerlayout->addItem(layout);
            outerlayout = layout;
-- 
cgit v0.12


From becc25ad78a89199764a54f45248e4113600f0af Mon Sep 17 00:00:00 2001
From: Sami Merila <sami.merila@nokia.com>
Date: Fri, 19 Nov 2010 12:52:06 +0200
Subject: QS60Style: Null pointer crash when using itemviews in some cases
 (pt2)

Also remove accidentally added whitespaces.

Task-number: QTBUG-15455
Reviewed-by: TrustMe
---
 src/gui/styles/qs60style.cpp | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/src/gui/styles/qs60style.cpp b/src/gui/styles/qs60style.cpp
index a58c8e5..2f09529 100644
--- a/src/gui/styles/qs60style.cpp
+++ b/src/gui/styles/qs60style.cpp
@@ -1438,8 +1438,8 @@ void QS60Style::drawControl(ControlElement element, const QStyleOption *option,
             const QRect iconRect = subElementRect(SE_ItemViewItemDecoration, &voptAdj, widget);
             QRect textRect = subElementRect(SE_ItemViewItemText, &voptAdj, widget);
             const QAbstractItemView *itemView = qobject_cast<const QAbstractItemView *>(widget);
-            
-            const bool singleSelection = itemView && 
+
+            const bool singleSelection = itemView &&
                 ((itemView->selectionMode() == QAbstractItemView::SingleSelection ||
                  itemView->selectionMode() == QAbstractItemView::NoSelection));
             const bool selectItems = itemView && (itemView->selectionBehavior() == QAbstractItemView::SelectItems);
-- 
cgit v0.12


From ea440d1897c7c9d69401ac293663fbc4f2866d08 Mon Sep 17 00:00:00 2001
From: Joaquim Rocha <jrocha@igalia.com>
Date: Mon, 15 Nov 2010 13:46:40 +0100
Subject: Fix wrong error assumption when converting "0.0" to double

The function qstrtod calls strtod without first resetting the errno
but verifying it nonetheless. This could lead to situations where
the errno was already set to ERANGE and hence it would mistakenly
assume the conversion could not be done right.

Merge-request: 2507
Reviewed-by: Harald Fernengel <harald.fernengel@nokia.com>
(cherry picked from commit 759c0b5ecf84201f36d44b4e6c46da1886d85dee)
---
 src/corelib/tools/qlocale.cpp | 1 +
 1 file changed, 1 insertion(+)

diff --git a/src/corelib/tools/qlocale.cpp b/src/corelib/tools/qlocale.cpp
index d152682..83d6dcd 100644
--- a/src/corelib/tools/qlocale.cpp
+++ b/src/corelib/tools/qlocale.cpp
@@ -7308,6 +7308,7 @@ Q_CORE_EXPORT char *qdtoa( double d, int mode, int ndigits, int *decpt, int *sig
 
 Q_CORE_EXPORT double qstrtod(const char *s00, const char **se, bool *ok)
 {
+    errno = 0;
     double ret = strtod((char*)s00, (char**)se);
     if (ok) {
       if((ret == 0.0l && errno == ERANGE)
-- 
cgit v0.12


From bafdb949583a3178449f68afe2e2621687e29de7 Mon Sep 17 00:00:00 2001
From: Michael Dominic K <mdk@codethink.co.uk>
Date: Mon, 22 Nov 2010 10:03:00 +0100
Subject: Dynamically register the event number.
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Reviewed-by: Samuel Rødal <samuel.rodal@nokia.com>
---
 tools/qmeegographicssystemhelper/qmeegoswitchevent.cpp | 12 +++++++++++-
 tools/qmeegographicssystemhelper/qmeegoswitchevent.h   | 12 +++++++-----
 2 files changed, 18 insertions(+), 6 deletions(-)

diff --git a/tools/qmeegographicssystemhelper/qmeegoswitchevent.cpp b/tools/qmeegographicssystemhelper/qmeegoswitchevent.cpp
index b136ce8..22ea0fe 100644
--- a/tools/qmeegographicssystemhelper/qmeegoswitchevent.cpp
+++ b/tools/qmeegographicssystemhelper/qmeegoswitchevent.cpp
@@ -41,7 +41,9 @@
 
 #include "qmeegoswitchevent.h"
 
-QMeeGoSwitchEvent::QMeeGoSwitchEvent(const QString &graphicsSystemName, QMeeGoSwitchEvent::State s) : QEvent((QEvent::Type) QMeeGoSwitchEvent::SwitchEvent)
+static int switchEventNumber = -1;
+
+QMeeGoSwitchEvent::QMeeGoSwitchEvent(const QString &graphicsSystemName, QMeeGoSwitchEvent::State s) : QEvent(QMeeGoSwitchEvent::eventNumber())
 {
     name = graphicsSystemName;
     switchState = s;
@@ -55,4 +57,12 @@ QString QMeeGoSwitchEvent::graphicsSystemName() const
 QMeeGoSwitchEvent::State QMeeGoSwitchEvent::state() const
 {
     return switchState;
+}
+
+QEvent::Type QMeeGoSwitchEvent::eventNumber()
+{
+    if (switchEventNumber < 0)
+        switchEventNumber = QEvent::registerEventType();
+
+    return (QEvent::Type) switchEventNumber;
 }
\ No newline at end of file
diff --git a/tools/qmeegographicssystemhelper/qmeegoswitchevent.h b/tools/qmeegographicssystemhelper/qmeegoswitchevent.h
index 2d8371e..0ddbd3d 100644
--- a/tools/qmeegographicssystemhelper/qmeegoswitchevent.h
+++ b/tools/qmeegographicssystemhelper/qmeegoswitchevent.h
@@ -62,11 +62,6 @@ public:
         DidSwitch
     };
 
-    //! The event type id to use to detect this event.
-    enum Type {
-        SwitchEvent = QEvent::User + 1024
-    };
-
     //! Constructor for the event.
     /*!
      Creates a new event with the given name and the given state.
@@ -83,6 +78,13 @@ public:
     //! Returns the state represented by this event.
     State state() const;
 
+    //! Returns the event type/number for QMeeGoSwitchEvent.
+    /*!
+     The type is registered on first access. Use this to detect incoming
+     QMeeGoSwitchEvents.
+    */
+    QEvent::Type eventNumber();
+
 private:
     QString name;
     State switchState;
-- 
cgit v0.12


From 1ab855cd61581a073da86d2c64be0b889f004327 Mon Sep 17 00:00:00 2001
From: Olivier Goffart <olivier.goffart@nokia.com>
Date: Mon, 8 Nov 2010 21:48:52 +0100
Subject: Doc: Q_PROPERTY, implements the setter/getter in the example

Some developer thought the implementation of the getters and
setters needed to have some metaobject magic

Also add a NOTIFY signal in the example

Reviewed-by: Joao
---
 doc/src/snippets/code/doc_src_properties.qdoc | 17 ++++++++++++++---
 doc/src/snippets/moc/myclass2.h               |  7 +++++--
 2 files changed, 19 insertions(+), 5 deletions(-)

diff --git a/doc/src/snippets/code/doc_src_properties.qdoc b/doc/src/snippets/code/doc_src_properties.qdoc
index 7704160..a4ed409 100644
--- a/doc/src/snippets/code/doc_src_properties.qdoc
+++ b/doc/src/snippets/code/doc_src_properties.qdoc
@@ -91,7 +91,7 @@ for (int i=0; i<count; ++i) {
 class MyClass : public QObject
 {
     Q_OBJECT
-    Q_PROPERTY(Priority priority READ priority WRITE setPriority)
+    Q_PROPERTY(Priority priority READ priority WRITE setPriority NOTIFY priorityChanged)
     Q_ENUMS(Priority)
 
 public:
@@ -100,8 +100,19 @@ public:
 
     enum Priority { High, Low, VeryHigh, VeryLow };
 
-    void setPriority(Priority priority);
-    Priority priority() const;
+    void setPriority(Priority priority)
+    {
+        m_priority = priority;
+        emit priorityChanged(priority);
+    }
+    Priority priority() const
+    { return m_priority; }
+
+signals:
+    void priorityChanged(Priority);
+
+private:
+    Priority m_priority;
 };
 //! [5]
 
diff --git a/doc/src/snippets/moc/myclass2.h b/doc/src/snippets/moc/myclass2.h
index ca79515..daea23c 100644
--- a/doc/src/snippets/moc/myclass2.h
+++ b/doc/src/snippets/moc/myclass2.h
@@ -58,8 +58,11 @@ public:
     MyClass(QObject *parent = 0);
     ~MyClass();
 
-    void setPriority(Priority priority);
-    Priority priority() const;
+    void setPriority(Priority priority) { m_priority = priority; }
+    Priority priority() const { return m_priority; }
+
+private:
+    Priority m_priority;
 };
 //! [0]
 
-- 
cgit v0.12


From 89fc2b639ac03fd851dc3a70cdbc530592a700cb Mon Sep 17 00:00:00 2001
From: Olivier Goffart <olivier.goffart@nokia.com>
Date: Tue, 9 Nov 2010 11:17:45 +0100
Subject: Compile on OpenBSD

Fail to compile since f3405a516ac30fc7dee1

Reviewed-by: Joao
---
 src/corelib/thread/qthread_unix.cpp | 13 ++++++++++---
 1 file changed, 10 insertions(+), 3 deletions(-)

diff --git a/src/corelib/thread/qthread_unix.cpp b/src/corelib/thread/qthread_unix.cpp
index a44a0e8..e3b587d 100644
--- a/src/corelib/thread/qthread_unix.cpp
+++ b/src/corelib/thread/qthread_unix.cpp
@@ -97,6 +97,11 @@
 # define SCHED_IDLE    5
 #endif
 
+#if defined(Q_OS_DARWIN) || !defined(Q_OS_OPENBSD) && defined(_POSIX_THREAD_PRIORITY_SCHEDULING) && (_POSIX_THREAD_PRIORITY_SCHEDULING-0 >= 0)
+#define QT_HAS_THREAD_PRIORITY_SCHEDULING
+#endif
+
+
 QT_BEGIN_NAMESPACE
 
 #ifndef QT_NO_THREAD
@@ -503,6 +508,7 @@ void QThread::usleep(unsigned long usecs)
     thread_sleep(&ti);
 }
 
+#ifdef QT_HAS_THREAD_PRIORITY_SCHEDULING
 // Does some magic and calculate the Unix scheduler priorities
 // sched_policy is IN/OUT: it must be set to a valid policy before calling this function
 // sched_priority is OUT only
@@ -533,6 +539,7 @@ static bool calculateUnixPriority(int priority, int *sched_policy, int *sched_pr
     *sched_priority = prio;
     return true;
 }
+#endif
 
 void QThread::start(Priority priority)
 {
@@ -553,7 +560,7 @@ void QThread::start(Priority priority)
 
     d->priority = priority;
 
-#if defined(Q_OS_DARWIN) || !defined(Q_OS_OPENBSD) && !defined(Q_OS_SYMBIAN) && defined(_POSIX_THREAD_PRIORITY_SCHEDULING) && (_POSIX_THREAD_PRIORITY_SCHEDULING-0 >= 0)
+#if defined(QT_HAS_THREAD_PRIORITY_SCHEDULING) && !defined(Q_OS_SYMBIAN)
 // ### Need to implement thread sheduling and priorities for symbian os. Implementation removed for now
     switch (priority) {
     case InheritPriority:
@@ -594,7 +601,7 @@ void QThread::start(Priority priority)
             break;
         }
     }
-#endif // _POSIX_THREAD_PRIORITY_SCHEDULING
+#endif // QT_HAS_THREAD_PRIORITY_SCHEDULING
 
 #ifdef Q_OS_SYMBIAN
     if (d->stackSize == 0)
@@ -757,7 +764,7 @@ void QThread::setPriority(Priority priority)
 
     // copied from start() with a few modifications:
 
-#if defined(Q_OS_DARWIN) || !defined(Q_OS_OPENBSD) && defined(_POSIX_THREAD_PRIORITY_SCHEDULING) && (_POSIX_THREAD_PRIORITY_SCHEDULING-0 >= 0)
+#ifdef QT_HAS_THREAD_PRIORITY_SCHEDULING
     int sched_policy;
     sched_param param;
 
-- 
cgit v0.12


From 98337a5f32e58c0ea14e2b86b9fe8dcb22bfa4e3 Mon Sep 17 00:00:00 2001
From: Olivier Goffart <olivier.goffart@nokia.com>
Date: Fri, 5 Nov 2010 10:05:47 +0100
Subject: QMessageBox: change the documentation to reflect that it is
 application modal

QMessageBox was documented to be window modal, but it is actually
application modal.
Changing the behaviour now would be dangerous, as QMessageBox reenter
the event loop.
So update the documentation.

Task-bumber: QTBUG-14499
Reviewed-by: Joao
Reviewed-by: Denis
---
 src/gui/dialogs/qmessagebox.cpp | 88 ++++++++++++++---------------------------
 1 file changed, 30 insertions(+), 58 deletions(-)

diff --git a/src/gui/dialogs/qmessagebox.cpp b/src/gui/dialogs/qmessagebox.cpp
index fe25b0f..2f8b9e2 100644
--- a/src/gui/dialogs/qmessagebox.cpp
+++ b/src/gui/dialogs/qmessagebox.cpp
@@ -776,10 +776,8 @@ QMessageBox::QMessageBox(QWidget *parent)
     added at any time using addButton(). The \a parent and \a f
     arguments are passed to the QDialog constructor.
 
-    If \a parent is 0, the message box is an \l{Qt::ApplicationModal}
-    {application modal} dialog box. If \a parent is a widget, the
-    message box is \l{Qt::WindowModal} {window modal} relative to \a
-    parent.
+    The message box is an \l{Qt::ApplicationModal} {application modal}
+    dialog box.
 
     On Mac OS X, if \a parent is not 0 and you want your message box
     to appear as a Qt::Sheet of that parent, set the message box's
@@ -1549,10 +1547,8 @@ static QMessageBox::StandardButton showNewMessageBox(QWidget *parent,
     \key Esc was pressed instead, the \l{Default and Escape Keys}
     {escape button} is returned.
 
-    If \a parent is 0, the message box is an \l{Qt::ApplicationModal}
-    {application modal} dialog box. If \a parent is a widget, the
-    message box is \l{Qt::WindowModal} {window modal} relative to \a
-    parent.
+    The message box is an \l{Qt::ApplicationModal} {application modal}
+    dialog box.
 
     \sa question(), warning(), critical()
 */
@@ -1579,10 +1575,8 @@ QMessageBox::StandardButton QMessageBox::information(QWidget *parent, const QStr
     \key Esc was pressed instead, the \l{Default and Escape Keys}
     {escape button} is returned.
 
-    If \a parent is 0, the message box is an \l{Qt::ApplicationModal}
-    {application modal} dialog box. If \a parent is a widget, the
-    message box is \l{Qt::WindowModal} {window modal} relative to \a
-    parent.
+    The message box is an \l{Qt::ApplicationModal} {application modal}
+    dialog box.
 
     \sa information(), warning(), critical()
 */
@@ -1607,10 +1601,8 @@ QMessageBox::StandardButton QMessageBox::question(QWidget *parent, const QString
     \key Esc was pressed instead, the \l{Default and Escape Keys}
     {escape button} is returned.
 
-    If \a parent is 0, the message box is an \l{Qt::ApplicationModal}
-    {application modal} dialog box. If \a parent is a widget, the
-    message box is \l{Qt::WindowModal} {window modal} relative to \a
-    parent.
+    The message box is an \l{Qt::ApplicationModal} {application modal}
+    dialog box.
 
     \sa question(), information(), critical()
 */
@@ -1635,10 +1627,8 @@ QMessageBox::StandardButton QMessageBox::warning(QWidget *parent, const QString
     \key Esc was pressed instead, the \l{Default and Escape Keys}
     {escape button} is returned.
 
-    If \a parent is 0, the message box is an \l{Qt::ApplicationModal}
-    {application modal} dialog box. If \a parent is a widget, the
-    message box is \l{Qt::WindowModal} {window modal} relative to \a
-    parent.
+    The message box is an \l{Qt::ApplicationModal} {application modal}
+    dialog box.
 
   \warning Do not delete \a parent during the execution of the dialog.
            If you want to do this, you should create the dialog
@@ -1670,7 +1660,7 @@ QMessageBox::StandardButton QMessageBox::critical(QWidget *parent, const QString
 
     The about box has a single button labelled "OK". On Mac OS X, the
     about box is popped up as a modeless window; on other platforms,
-    it is currently a window modal.
+    it is currently application modal.
 
     \sa QWidget::windowIcon(), QApplication::activeWindow()
 */
@@ -1723,7 +1713,7 @@ void QMessageBox::about(QWidget *parent, const QString &title, const QString &te
     QApplication provides this functionality as a slot.
 
     On Mac OS X, the about box is popped up as a modeless window; on
-    other platforms, it is currently window modal.
+    other platforms, it is currently application modal.
 
     \sa QApplication::aboutQt()
 */
@@ -1983,10 +1973,8 @@ void QMessageBoxPrivate::retranslateStrings()
 
     \snippet doc/src/snippets/dialogs/dialogs.cpp 2
 
-    If \a parent is 0, the message box is an \l{Qt::ApplicationModal}
-    {application modal} dialog box. If \a parent is a widget, the
-    message box is \l{Qt::WindowModal} {window modal} relative to \a
-    parent.
+    The message box is an \l{Qt::ApplicationModal} {application modal}
+    dialog box.
 
     The \a parent and \a f arguments are passed to
     the QDialog constructor.
@@ -2035,10 +2023,8 @@ QMessageBox::QMessageBox(const QString &title, const QString &text, Icon icon,
     Returns the identity (QMessageBox::Ok, or QMessageBox::No, etc.)
     of the button that was clicked.
 
-    If \a parent is 0, the message box is an \l{Qt::ApplicationModal}
-    {application modal} dialog box. If \a parent is a widget, the
-    message box is \l{Qt::WindowModal} {window modal} relative to \a
-    parent.
+    The message box is an \l{Qt::ApplicationModal} {application modal}
+    dialog box.
 
   \warning Do not delete \a parent during the execution of the dialog.
            If you want to do this, you should create the dialog
@@ -2073,10 +2059,8 @@ int QMessageBox::information(QWidget *parent, const QString &title, const QStrin
     supply 0, 1 or 2 to make pressing \key Esc equivalent to clicking
     the relevant button.
 
-    If \a parent is 0, the message box is an \l{Qt::ApplicationModal}
-    {application modal} dialog box. If \a parent is a widget, the
-    message box is \l{Qt::WindowModal} {window modal} relative to \a
-    parent.
+    The message box is an \l{Qt::ApplicationModal} {application modal}
+    dialog box.
 
   \warning Do not delete \a parent during the execution of the dialog.
            If you want to do this, you should create the dialog
@@ -2125,10 +2109,8 @@ int QMessageBox::information(QWidget *parent, const QString &title, const QStrin
     Returns the identity (QMessageBox::Yes, or QMessageBox::No, etc.)
     of the button that was clicked.
 
-    If \a parent is 0, the message box is an \l{Qt::ApplicationModal}
-    {application modal} dialog box. If \a parent is a widget, the
-    message box is \l{Qt::WindowModal} {window modal} relative to \a
-    parent.
+    The message box is an \l{Qt::ApplicationModal} {application modal}
+    dialog box.
 
   \warning Do not delete \a parent during the execution of the dialog.
            If you want to do this, you should create the dialog
@@ -2163,10 +2145,8 @@ int QMessageBox::question(QWidget *parent, const QString &title, const QString&
     supply 0, 1 or 2 to make pressing Escape equivalent to clicking
     the relevant button.
 
-    If \a parent is 0, the message box is an \l{Qt::ApplicationModal}
-    {application modal} dialog box. If \a parent is a widget, the
-    message box is \l{Qt::WindowModal} {window modal} relative to \a
-    parent.
+    The message box is an \l{Qt::ApplicationModal} {application modal}
+    dialog box.
 
   \warning Do not delete \a parent during the execution of the dialog.
            If you want to do this, you should create the dialog
@@ -2215,10 +2195,8 @@ int QMessageBox::question(QWidget *parent, const QString &title, const QString&
     Returns the identity (QMessageBox::Ok or QMessageBox::No or ...)
     of the button that was clicked.
 
-    If \a parent is 0, the message box is an \l{Qt::ApplicationModal}
-    {application modal} dialog box. If \a parent is a widget, the
-    message box is \l{Qt::WindowModal} {window modal} relative to \a
-    parent.
+    The message box is an \l{Qt::ApplicationModal} {application modal}
+    dialog box.
 
   \warning Do not delete \a parent during the execution of the dialog.
            If you want to do this, you should create the dialog
@@ -2253,10 +2231,8 @@ int QMessageBox::warning(QWidget *parent, const QString &title, const QString& t
     supply 0, 1, or 2 to make pressing Escape equivalent to clicking
     the relevant button.
 
-    If \a parent is 0, the message box is an \l{Qt::ApplicationModal}
-    {application modal} dialog box. If \a parent is a widget, the
-    message box is \l{Qt::WindowModal} {window modal} relative to \a
-    parent.
+    The message box is an \l{Qt::ApplicationModal} {application modal}
+    dialog box.
 
   \warning Do not delete \a parent during the execution of the dialog.
            If you want to do this, you should create the dialog
@@ -2304,10 +2280,8 @@ int QMessageBox::warning(QWidget *parent, const QString &title, const QString& t
     Returns the identity (QMessageBox::Ok, or QMessageBox::No, etc.)
     of the button that was clicked.
 
-    If \a parent is 0, the message box is an \l{Qt::ApplicationModal}
-    {application modal} dialog box. If \a parent is a widget, the
-    message box is \l{Qt::WindowModal} {window modal} relative to \a
-    parent.
+    The message box is an \l{Qt::ApplicationModal} {application modal}
+    dialog box.
 
   \warning Do not delete \a parent during the execution of the dialog.
            If you want to do this, you should create the dialog
@@ -2343,10 +2317,8 @@ int QMessageBox::critical(QWidget *parent, const QString &title, const QString&
     supply 0, 1, or 2 to make pressing Escape equivalent to clicking
     the relevant button.
 
-    If \a parent is 0, the message box is an \l{Qt::ApplicationModal}
-    {application modal} dialog box. If \a parent is a widget, the
-    message box is \l{Qt::WindowModal} {window modal} relative to \a
-    parent.
+    The message box is an \l{Qt::ApplicationModal} {application modal}
+    dialog box.
 
   \warning Do not delete \a parent during the execution of the dialog.
            If you want to do this, you should create the dialog
-- 
cgit v0.12


From 202433ee1fd377ac36dc55fb466b9fc616b4d4fd Mon Sep 17 00:00:00 2001
From: Olivier Goffart <olivier.goffart@nokia.com>
Date: Fri, 19 Nov 2010 09:57:18 +0100
Subject: QThread::exec():  Fix possibility to enter several time the event
 loop

If one call exit() before calling exec(), this should prevent the
event loop from starting once, but later calls to exec() should work.

This is a regression against Qt 4.6 introduced when fixing QTBUG-1184

Task-number: QTBUG-15378
Reviewed-by: Joao
Reviewed-by: Brad
---
 src/corelib/thread/qthread.cpp     |  4 +++-
 tests/auto/qthread/tst_qthread.cpp | 40 ++++++++++++++++++++++++++++++++++++++
 2 files changed, 43 insertions(+), 1 deletion(-)

diff --git a/src/corelib/thread/qthread.cpp b/src/corelib/thread/qthread.cpp
index 69b70cb..6fb182b 100644
--- a/src/corelib/thread/qthread.cpp
+++ b/src/corelib/thread/qthread.cpp
@@ -482,8 +482,10 @@ int QThread::exec()
     Q_D(QThread);
     QMutexLocker locker(&d->mutex);
     d->data->quitNow = false;
-    if (d->exited)
+    if (d->exited) {
+        d->exited = false;
         return d->returnCode;
+    }
     locker.unlock();
 
     QEventLoop eventLoop;
diff --git a/tests/auto/qthread/tst_qthread.cpp b/tests/auto/qthread/tst_qthread.cpp
index 843749a..85b8f04 100644
--- a/tests/auto/qthread/tst_qthread.cpp
+++ b/tests/auto/qthread/tst_qthread.cpp
@@ -106,6 +106,7 @@ private slots:
     void adoptMultipleThreads();
 
     void QTBUG13810_exitAndStart();
+    void QTBUG15378_exitAndExec();
 
     void stressTest();
 };
@@ -976,5 +977,44 @@ void tst_QThread::QTBUG13810_exitAndStart()
 }
 
 
+void tst_QThread::QTBUG15378_exitAndExec()
+{
+    class Thread : public QThread {
+    public:
+        QSemaphore sem1;
+        QSemaphore sem2;
+        volatile int value;
+        void run() {
+            sem1.acquire();
+            value = exec();  //First entrence
+            sem2.release();
+            value = exec(); // Second loop
+        }
+    };
+    Thread thread;
+    thread.value = 0;
+    thread.start();
+    thread.exit(556);
+    thread.sem1.release(); //should exit the first loop
+    thread.sem2.acquire();
+    QCOMPARE(int(thread.value), 556);
+
+    //test that the thread is running by executing queued connected signal there
+    Syncronizer sync1;
+    sync1.moveToThread(&thread);
+    Syncronizer sync2;
+    sync2.moveToThread(&thread);
+    connect(&sync2, SIGNAL(propChanged(int)), &sync1, SLOT(setProp(int)), Qt::QueuedConnection);
+    connect(&sync1, SIGNAL(propChanged(int)), &thread, SLOT(quit()), Qt::QueuedConnection);
+    QMetaObject::invokeMethod(&sync2, "setProp", Qt::QueuedConnection , Q_ARG(int, 89));
+    QTest::qWait(50);
+    while(!thread.wait(10))
+        QTest::qWait(10);
+    QCOMPARE(sync2.m_prop, 89);
+    QCOMPARE(sync1.m_prop, 89);
+}
+
+
+
 QTEST_MAIN(tst_QThread)
 #include "tst_qthread.moc"
-- 
cgit v0.12


From 7abb03d75155cef86df58f117031b092b637876f Mon Sep 17 00:00:00 2001
From: Eskil Abrahamsen Blomfeldt <eskil.abrahamsen-blomfeldt@nokia.com>
Date: Mon, 22 Nov 2010 12:07:01 +0100
Subject: Round origin of text in OpenVG engine

The origin of text needs to be rounded, just like the translation in
the transform because text drawn at subpixel positions is unsupported
on some devices. Since the font is integer-based, the advance-array
does not need to be rounded.

Task-number: QTBUG-15263
Reviewed-by: Jason Barron
---
 src/openvg/qpaintengine_vg.cpp | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/src/openvg/qpaintengine_vg.cpp b/src/openvg/qpaintengine_vg.cpp
index aea203f..430575b 100644
--- a/src/openvg/qpaintengine_vg.cpp
+++ b/src/openvg/qpaintengine_vg.cpp
@@ -3543,8 +3543,8 @@ void QVGPaintEngine::drawStaticTextItem(QStaticTextItem *textItem)
 
     // Set the glyph drawing origin.
     VGfloat origin[2];
-    origin[0] = positions[0].x.toReal();
-    origin[1] = positions[0].y.toReal();
+    origin[0] = positions[0].x.round().toReal();
+    origin[1] = positions[0].y.round().toReal();
     vgSetfv(VG_GLYPH_ORIGIN, 2, origin);
 
     // Fast anti-aliasing for paths, better for images.
-- 
cgit v0.12


From 37f4e51127081f393743b5023f61ec48674cf7a2 Mon Sep 17 00:00:00 2001
From: Olivier Goffart <olivier.goffart@nokia.com>
Date: Mon, 22 Nov 2010 20:37:18 +0100
Subject: tst_qthread: fix compilation

---
 tests/auto/qthread/tst_qthread.cpp | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/tests/auto/qthread/tst_qthread.cpp b/tests/auto/qthread/tst_qthread.cpp
index 85b8f04..b0efb5a 100644
--- a/tests/auto/qthread/tst_qthread.cpp
+++ b/tests/auto/qthread/tst_qthread.cpp
@@ -997,7 +997,8 @@ void tst_QThread::QTBUG15378_exitAndExec()
     thread.exit(556);
     thread.sem1.release(); //should exit the first loop
     thread.sem2.acquire();
-    QCOMPARE(int(thread.value), 556);
+    int v = thread.value;
+    QCOMPARE(v, 556);
 
     //test that the thread is running by executing queued connected signal there
     Syncronizer sync1;
-- 
cgit v0.12


From ea84d7431810951aff2d6f85dca5f4ae4aeb4490 Mon Sep 17 00:00:00 2001
From: Sergio Ahumada <sahumada@gmail.com>
Date: Mon, 22 Nov 2010 22:49:36 +0100
Subject: Doc: Fixing typo

---
 src/gui/text/qfontengine_x11.cpp | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/gui/text/qfontengine_x11.cpp b/src/gui/text/qfontengine_x11.cpp
index b7e4be2..c06be3b 100644
--- a/src/gui/text/qfontengine_x11.cpp
+++ b/src/gui/text/qfontengine_x11.cpp
@@ -429,7 +429,7 @@ void QFontEngineXLFD::recalcAdvances(QGlyphLayout *glyphs, QTextEngine::ShaperFl
 {
     int i = glyphs->numGlyphs;
     XCharStruct *xcs;
-    // inlined for better perfomance
+    // inlined for better performance
     if (!_fs->per_char) {
         xcs = &_fs->min_bounds;
         while (i != 0) {
-- 
cgit v0.12


From 787fd44a917f31d52b35cf168f2821d23d8be694 Mon Sep 17 00:00:00 2001
From: Damian Jansen <damian.jansen@nokia.com>
Date: Tue, 23 Nov 2010 12:04:23 +1000
Subject: Prevent crash when calling reload() from within a .qml

Task-number: QTBUG-15493
---
 tools/qml/qmlruntime.cpp | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/tools/qml/qmlruntime.cpp b/tools/qml/qmlruntime.cpp
index 78bc409..7ea77d1 100644
--- a/tools/qml/qmlruntime.cpp
+++ b/tools/qml/qmlruntime.cpp
@@ -1012,7 +1012,7 @@ void QDeclarativeViewer::addPluginPath(const QString& plugin)
 
 void QDeclarativeViewer::reload()
 {
-    open(currentFileOrUrl);
+    launch(currentFileOrUrl);
 }
 
 void QDeclarativeViewer::openFile()
-- 
cgit v0.12


From 52068f57f9c32098a90cc217730a530f85590f65 Mon Sep 17 00:00:00 2001
From: Martin Jones <martin.jones@nokia.com>
Date: Tue, 23 Nov 2010 13:44:39 +1000
Subject: Ensure WebView press delay timer is cancelled when grab is taken.

Flickable steals the grab, but the timer was not stopped and the
keepGrab flag is set and the mouse grabbed. This means that the WebView
now has the grab and subsequent clicks on another element are ignored.

Task-number: QTBUG-15529
Reviewed-by: Joona Petrell
---
 .../WebKit/qt/declarative/qdeclarativewebview.cpp  |   10 +
 .../WebKit/qt/declarative/qdeclarativewebview_p.h  |    2 +
 .../webview/flickable/data/flickweb.0.png          |  Bin 0 -> 2812 bytes
 .../webview/flickable/data/flickweb.1.png          |  Bin 0 -> 2812 bytes
 .../webview/flickable/data/flickweb.10.png         |  Bin 0 -> 2829 bytes
 .../webview/flickable/data/flickweb.2.png          |  Bin 0 -> 3466 bytes
 .../webview/flickable/data/flickweb.3.png          |  Bin 0 -> 2812 bytes
 .../webview/flickable/data/flickweb.4.png          |  Bin 0 -> 2829 bytes
 .../webview/flickable/data/flickweb.5.png          |  Bin 0 -> 2829 bytes
 .../webview/flickable/data/flickweb.6.png          |  Bin 0 -> 2768 bytes
 .../webview/flickable/data/flickweb.7.png          |  Bin 0 -> 2829 bytes
 .../webview/flickable/data/flickweb.8.png          |  Bin 0 -> 2829 bytes
 .../webview/flickable/data/flickweb.9.png          |  Bin 0 -> 2829 bytes
 .../qmlvisual/webview/flickable/data/flickweb.qml  | 6083 ++++++++++++++++++++
 .../qmlvisual/webview/flickable/flickweb.qml       |   35 +
 .../qmlvisual/webview/flickable/qtlogo.png         |  Bin 0 -> 2738 bytes
 .../qmlvisual/webview/flickable/test.html          |    3 +
 17 files changed, 6133 insertions(+)
 create mode 100644 tests/auto/declarative/qmlvisual/webview/flickable/data/flickweb.0.png
 create mode 100644 tests/auto/declarative/qmlvisual/webview/flickable/data/flickweb.1.png
 create mode 100644 tests/auto/declarative/qmlvisual/webview/flickable/data/flickweb.10.png
 create mode 100644 tests/auto/declarative/qmlvisual/webview/flickable/data/flickweb.2.png
 create mode 100644 tests/auto/declarative/qmlvisual/webview/flickable/data/flickweb.3.png
 create mode 100644 tests/auto/declarative/qmlvisual/webview/flickable/data/flickweb.4.png
 create mode 100644 tests/auto/declarative/qmlvisual/webview/flickable/data/flickweb.5.png
 create mode 100644 tests/auto/declarative/qmlvisual/webview/flickable/data/flickweb.6.png
 create mode 100644 tests/auto/declarative/qmlvisual/webview/flickable/data/flickweb.7.png
 create mode 100644 tests/auto/declarative/qmlvisual/webview/flickable/data/flickweb.8.png
 create mode 100644 tests/auto/declarative/qmlvisual/webview/flickable/data/flickweb.9.png
 create mode 100644 tests/auto/declarative/qmlvisual/webview/flickable/data/flickweb.qml
 create mode 100644 tests/auto/declarative/qmlvisual/webview/flickable/flickweb.qml
 create mode 100644 tests/auto/declarative/qmlvisual/webview/flickable/qtlogo.png
 create mode 100644 tests/auto/declarative/qmlvisual/webview/flickable/test.html

diff --git a/src/3rdparty/webkit/WebKit/qt/declarative/qdeclarativewebview.cpp b/src/3rdparty/webkit/WebKit/qt/declarative/qdeclarativewebview.cpp
index e4f70de..7a8aae7 100644
--- a/src/3rdparty/webkit/WebKit/qt/declarative/qdeclarativewebview.cpp
+++ b/src/3rdparty/webkit/WebKit/qt/declarative/qdeclarativewebview.cpp
@@ -141,6 +141,16 @@ void GraphicsWebView::mouseMoveEvent(QGraphicsSceneMouseEvent* event)
         QGraphicsWebView::mouseMoveEvent(event);
 }
 
+bool GraphicsWebView::sceneEvent(QEvent *event)
+{
+    bool rv = QGraphicsWebView::sceneEvent(event);
+    if (event->type() == QEvent::UngrabMouse) {
+        pressTimer.stop();
+        parent->setKeepMouseGrab(false);
+    }
+    return rv;
+}
+
 /*!
     \qmlclass WebView QDeclarativeWebView
     \ingroup qml-view-elements
diff --git a/src/3rdparty/webkit/WebKit/qt/declarative/qdeclarativewebview_p.h b/src/3rdparty/webkit/WebKit/qt/declarative/qdeclarativewebview_p.h
index b2055bf..ca15a1e 100644
--- a/src/3rdparty/webkit/WebKit/qt/declarative/qdeclarativewebview_p.h
+++ b/src/3rdparty/webkit/WebKit/qt/declarative/qdeclarativewebview_p.h
@@ -70,6 +70,8 @@ protected:
     void mouseMoveEvent(QGraphicsSceneMouseEvent* event);
     void mouseDoubleClickEvent(QGraphicsSceneMouseEvent *event);
     void timerEvent(QTimerEvent* event);
+    bool sceneEvent(QEvent *event);
+
 Q_SIGNALS:
     void doubleClick(int clickX, int clickY);
 private:
diff --git a/tests/auto/declarative/qmlvisual/webview/flickable/data/flickweb.0.png b/tests/auto/declarative/qmlvisual/webview/flickable/data/flickweb.0.png
new file mode 100644
index 0000000..513aab6
Binary files /dev/null and b/tests/auto/declarative/qmlvisual/webview/flickable/data/flickweb.0.png differ
diff --git a/tests/auto/declarative/qmlvisual/webview/flickable/data/flickweb.1.png b/tests/auto/declarative/qmlvisual/webview/flickable/data/flickweb.1.png
new file mode 100644
index 0000000..513aab6
Binary files /dev/null and b/tests/auto/declarative/qmlvisual/webview/flickable/data/flickweb.1.png differ
diff --git a/tests/auto/declarative/qmlvisual/webview/flickable/data/flickweb.10.png b/tests/auto/declarative/qmlvisual/webview/flickable/data/flickweb.10.png
new file mode 100644
index 0000000..bb22d01
Binary files /dev/null and b/tests/auto/declarative/qmlvisual/webview/flickable/data/flickweb.10.png differ
diff --git a/tests/auto/declarative/qmlvisual/webview/flickable/data/flickweb.2.png b/tests/auto/declarative/qmlvisual/webview/flickable/data/flickweb.2.png
new file mode 100644
index 0000000..1357551
Binary files /dev/null and b/tests/auto/declarative/qmlvisual/webview/flickable/data/flickweb.2.png differ
diff --git a/tests/auto/declarative/qmlvisual/webview/flickable/data/flickweb.3.png b/tests/auto/declarative/qmlvisual/webview/flickable/data/flickweb.3.png
new file mode 100644
index 0000000..513aab6
Binary files /dev/null and b/tests/auto/declarative/qmlvisual/webview/flickable/data/flickweb.3.png differ
diff --git a/tests/auto/declarative/qmlvisual/webview/flickable/data/flickweb.4.png b/tests/auto/declarative/qmlvisual/webview/flickable/data/flickweb.4.png
new file mode 100644
index 0000000..bb22d01
Binary files /dev/null and b/tests/auto/declarative/qmlvisual/webview/flickable/data/flickweb.4.png differ
diff --git a/tests/auto/declarative/qmlvisual/webview/flickable/data/flickweb.5.png b/tests/auto/declarative/qmlvisual/webview/flickable/data/flickweb.5.png
new file mode 100644
index 0000000..bb22d01
Binary files /dev/null and b/tests/auto/declarative/qmlvisual/webview/flickable/data/flickweb.5.png differ
diff --git a/tests/auto/declarative/qmlvisual/webview/flickable/data/flickweb.6.png b/tests/auto/declarative/qmlvisual/webview/flickable/data/flickweb.6.png
new file mode 100644
index 0000000..c61ae3f
Binary files /dev/null and b/tests/auto/declarative/qmlvisual/webview/flickable/data/flickweb.6.png differ
diff --git a/tests/auto/declarative/qmlvisual/webview/flickable/data/flickweb.7.png b/tests/auto/declarative/qmlvisual/webview/flickable/data/flickweb.7.png
new file mode 100644
index 0000000..bb22d01
Binary files /dev/null and b/tests/auto/declarative/qmlvisual/webview/flickable/data/flickweb.7.png differ
diff --git a/tests/auto/declarative/qmlvisual/webview/flickable/data/flickweb.8.png b/tests/auto/declarative/qmlvisual/webview/flickable/data/flickweb.8.png
new file mode 100644
index 0000000..bb22d01
Binary files /dev/null and b/tests/auto/declarative/qmlvisual/webview/flickable/data/flickweb.8.png differ
diff --git a/tests/auto/declarative/qmlvisual/webview/flickable/data/flickweb.9.png b/tests/auto/declarative/qmlvisual/webview/flickable/data/flickweb.9.png
new file mode 100644
index 0000000..bb22d01
Binary files /dev/null and b/tests/auto/declarative/qmlvisual/webview/flickable/data/flickweb.9.png differ
diff --git a/tests/auto/declarative/qmlvisual/webview/flickable/data/flickweb.qml b/tests/auto/declarative/qmlvisual/webview/flickable/data/flickweb.qml
new file mode 100644
index 0000000..c248167
--- /dev/null
+++ b/tests/auto/declarative/qmlvisual/webview/flickable/data/flickweb.qml
@@ -0,0 +1,6083 @@
+import Qt.VisualTest 4.7
+
+VisualTest {
+    Frame {
+        msec: 0
+    }
+    Frame {
+        msec: 16
+        image: "flickweb.0.png"
+    }
+    Frame {
+        msec: 32
+        hash: "d045839439e4091210c745f0ea173e52"
+    }
+    Frame {
+        msec: 48
+        hash: "d045839439e4091210c745f0ea173e52"
+    }
+    Frame {
+        msec: 64
+        hash: "d045839439e4091210c745f0ea173e52"
+    }
+    Frame {
+        msec: 80
+        hash: "d045839439e4091210c745f0ea173e52"
+    }
+    Frame {
+        msec: 96
+        hash: "d045839439e4091210c745f0ea173e52"
+    }
+    Frame {
+        msec: 112
+        hash: "d045839439e4091210c745f0ea173e52"
+    }
+    Frame {
+        msec: 128
+        hash: "d045839439e4091210c745f0ea173e52"
+    }
+    Frame {
+        msec: 144
+        hash: "d045839439e4091210c745f0ea173e52"
+    }
+    Frame {
+        msec: 160
+        hash: "d045839439e4091210c745f0ea173e52"
+    }
+    Frame {
+        msec: 176
+        hash: "d045839439e4091210c745f0ea173e52"
+    }
+    Frame {
+        msec: 192
+        hash: "d045839439e4091210c745f0ea173e52"
+    }
+    Frame {
+        msec: 208
+        hash: "d045839439e4091210c745f0ea173e52"
+    }
+    Frame {
+        msec: 224
+        hash: "d045839439e4091210c745f0ea173e52"
+    }
+    Frame {
+        msec: 240
+        hash: "d045839439e4091210c745f0ea173e52"
+    }
+    Frame {
+        msec: 256
+        hash: "d045839439e4091210c745f0ea173e52"
+    }
+    Frame {
+        msec: 272
+        hash: "d045839439e4091210c745f0ea173e52"
+    }
+    Frame {
+        msec: 288
+        hash: "d045839439e4091210c745f0ea173e52"
+    }
+    Frame {
+        msec: 304
+        hash: "d045839439e4091210c745f0ea173e52"
+    }
+    Frame {
+        msec: 320
+        hash: "d045839439e4091210c745f0ea173e52"
+    }
+    Frame {
+        msec: 336
+        hash: "d045839439e4091210c745f0ea173e52"
+    }
+    Frame {
+        msec: 352
+        hash: "d045839439e4091210c745f0ea173e52"
+    }
+    Frame {
+        msec: 368
+        hash: "d045839439e4091210c745f0ea173e52"
+    }
+    Frame {
+        msec: 384
+        hash: "d045839439e4091210c745f0ea173e52"
+    }
+    Frame {
+        msec: 400
+        hash: "d045839439e4091210c745f0ea173e52"
+    }
+    Frame {
+        msec: 416
+        hash: "d045839439e4091210c745f0ea173e52"
+    }
+    Frame {
+        msec: 432
+        hash: "d045839439e4091210c745f0ea173e52"
+    }
+    Frame {
+        msec: 448
+        hash: "d045839439e4091210c745f0ea173e52"
+    }
+    Frame {
+        msec: 464
+        hash: "d045839439e4091210c745f0ea173e52"
+    }
+    Frame {
+        msec: 480
+        hash: "d045839439e4091210c745f0ea173e52"
+    }
+    Frame {
+        msec: 496
+        hash: "d045839439e4091210c745f0ea173e52"
+    }
+    Frame {
+        msec: 512
+        hash: "d045839439e4091210c745f0ea173e52"
+    }
+    Frame {
+        msec: 528
+        hash: "d045839439e4091210c745f0ea173e52"
+    }
+    Frame {
+        msec: 544
+        hash: "d045839439e4091210c745f0ea173e52"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 0; y: 7
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 0; y: 7
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 560
+        hash: "d045839439e4091210c745f0ea173e52"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 12; y: 10
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 576
+        hash: "d045839439e4091210c745f0ea173e52"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 15; y: 11
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 592
+        hash: "d045839439e4091210c745f0ea173e52"
+    }
+    Frame {
+        msec: 608
+        hash: "d045839439e4091210c745f0ea173e52"
+    }
+    Frame {
+        msec: 624
+        hash: "d045839439e4091210c745f0ea173e52"
+    }
+    Frame {
+        msec: 640
+        hash: "d045839439e4091210c745f0ea173e52"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 12; y: 10
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 11; y: 10
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 656
+        hash: "d045839439e4091210c745f0ea173e52"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 9; y: 10
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 672
+        hash: "d045839439e4091210c745f0ea173e52"
+    }
+    Frame {
+        msec: 688
+        hash: "d045839439e4091210c745f0ea173e52"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 9; y: 11
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 704
+        hash: "d045839439e4091210c745f0ea173e52"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 9; y: 12
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 9; y: 15
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 720
+        hash: "d045839439e4091210c745f0ea173e52"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 9; y: 18
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 12; y: 24
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 736
+        hash: "d045839439e4091210c745f0ea173e52"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 14; y: 28
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 18; y: 35
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 752
+        hash: "d045839439e4091210c745f0ea173e52"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 19; y: 39
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 22; y: 43
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 768
+        hash: "d045839439e4091210c745f0ea173e52"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 22; y: 44
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 23; y: 44
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 784
+        hash: "d045839439e4091210c745f0ea173e52"
+    }
+    Frame {
+        msec: 800
+        hash: "d045839439e4091210c745f0ea173e52"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 23; y: 43
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 816
+        hash: "d045839439e4091210c745f0ea173e52"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 24; y: 45
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 832
+        hash: "d045839439e4091210c745f0ea173e52"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 26; y: 47
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 28; y: 49
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 848
+        hash: "d045839439e4091210c745f0ea173e52"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 29; y: 51
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 32; y: 55
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 864
+        hash: "d045839439e4091210c745f0ea173e52"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 34; y: 57
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 36; y: 61
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 880
+        hash: "d045839439e4091210c745f0ea173e52"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 38; y: 62
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 41; y: 66
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 896
+        hash: "d045839439e4091210c745f0ea173e52"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 43; y: 68
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 48; y: 73
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 912
+        hash: "d045839439e4091210c745f0ea173e52"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 50; y: 76
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 57; y: 80
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 928
+        hash: "d045839439e4091210c745f0ea173e52"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 63; y: 85
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 66; y: 87
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 944
+        hash: "d045839439e4091210c745f0ea173e52"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 72; y: 91
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 74; y: 93
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 960
+        hash: "d045839439e4091210c745f0ea173e52"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 80; y: 97
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 82; y: 99
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 976
+        image: "flickweb.1.png"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 86; y: 102
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 88; y: 103
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 992
+        hash: "d045839439e4091210c745f0ea173e52"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 91; y: 103
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 92; y: 104
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 1008
+        hash: "d045839439e4091210c745f0ea173e52"
+    }
+    Frame {
+        msec: 1024
+        hash: "d045839439e4091210c745f0ea173e52"
+    }
+    Frame {
+        msec: 1040
+        hash: "d045839439e4091210c745f0ea173e52"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 92; y: 105
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 1056
+        hash: "d045839439e4091210c745f0ea173e52"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 92; y: 106
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 1072
+        hash: "d045839439e4091210c745f0ea173e52"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 92; y: 107
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 92; y: 108
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 1088
+        hash: "d045839439e4091210c745f0ea173e52"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 92; y: 109
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 1104
+        hash: "d045839439e4091210c745f0ea173e52"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 92; y: 110
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 92; y: 111
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 1120
+        hash: "d045839439e4091210c745f0ea173e52"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 92; y: 112
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 1136
+        hash: "d045839439e4091210c745f0ea173e52"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 92; y: 113
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 92; y: 114
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 1152
+        hash: "d045839439e4091210c745f0ea173e52"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 92; y: 115
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 92; y: 116
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 1168
+        hash: "d045839439e4091210c745f0ea173e52"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 92; y: 117
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 1184
+        hash: "d045839439e4091210c745f0ea173e52"
+    }
+    Frame {
+        msec: 1200
+        hash: "d045839439e4091210c745f0ea173e52"
+    }
+    Mouse {
+        type: 2
+        button: 1
+        buttons: 1
+        x: 92; y: 117
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 1216
+        hash: "d045839439e4091210c745f0ea173e52"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 92; y: 116
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 92; y: 115
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 1232
+        hash: "d045839439e4091210c745f0ea173e52"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 91; y: 112
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 91; y: 111
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 1248
+        hash: "d045839439e4091210c745f0ea173e52"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 90; y: 107
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 90; y: 104
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 1264
+        hash: "e891b00cd44578b4a8e635ffe4c6d3fd"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 90; y: 101
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 89; y: 96
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 1280
+        hash: "61a543282ffb5e751ea1d97f0c95b208"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 89; y: 93
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 89; y: 85
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 1296
+        hash: "102e4b664bade46ab3bbb611acee22c9"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 89; y: 81
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 87; y: 70
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 1312
+        hash: "6bf42ac28a14db681442aeb7ed0c7610"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 85; y: 60
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 3
+        button: 1
+        buttons: 0
+        x: 85; y: 60
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 84; y: 56
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 1328
+        hash: "ef531060d6b75cec8a6e3c01b3f69cc0"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 84; y: 51
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 84; y: 49
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 1344
+        hash: "e839af9d67f6214f0901977b3aa96d1a"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 84; y: 46
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 84; y: 43
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 1360
+        hash: "b2d6b68f1f7229e8e65bb37e4c418a1b"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 84; y: 41
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 85; y: 39
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 1376
+        hash: "e4a562aa35aa532d15c9b129e22797bb"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 83; y: 38
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 1392
+        hash: "029d347e9c99dd4a9cec5120ac7fc25e"
+    }
+    Frame {
+        msec: 1408
+        hash: "3c16a74e18a59630f35511ab5514c769"
+    }
+    Frame {
+        msec: 1424
+        hash: "5dc472d6c5198d5a628510bd45a61a11"
+    }
+    Frame {
+        msec: 1440
+        hash: "430d60127ed59dbc5904647424ead40d"
+    }
+    Frame {
+        msec: 1456
+        hash: "cb27cfcfbbb77b55c2a8bf7e51c0af07"
+    }
+    Frame {
+        msec: 1472
+        hash: "46f2eb33b0e8316c4123ddbee2f60ae2"
+    }
+    Frame {
+        msec: 1488
+        hash: "1df306111ca012c9f405018778c0a12b"
+    }
+    Frame {
+        msec: 1504
+        hash: "1eafab8fd457ad9acda068344178b4a8"
+    }
+    Frame {
+        msec: 1520
+        hash: "286656898100e53d6d7728b51ce93df5"
+    }
+    Frame {
+        msec: 1536
+        hash: "e2a88f0ba3030a430028147930989bbb"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 84; y: 38
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 1552
+        hash: "fb23cf265c4d253470c2515043bc5dd8"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 83; y: 38
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 1568
+        hash: "1dba4f0e5e5948b7133725ea8bbef3e7"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 83; y: 37
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 84; y: 38
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 1584
+        hash: "8578965c5ad012284e4e0a14a42da25e"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 84; y: 34
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 1600
+        hash: "3ef187decae08baa2ec92998c2cbb7f7"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 83; y: 31
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 1616
+        hash: "4e0491128eac0bbfa7a131b1f18f243c"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 83; y: 26
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 1632
+        hash: "c2d0799526e908204efbd3aa980e086c"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 83; y: 23
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 1648
+        hash: "cc87e09a6784d61680f8c6ab0d6a38fa"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 84; y: 22
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 85; y: 16
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 1664
+        hash: "13dec7e835b4f26970f98b66533f84f1"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 85; y: 14
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 1680
+        hash: "e5d2862bee024b64326b7d85e5e45399"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 85; y: 12
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 1696
+        hash: "0b1401ce4a91811ac9c3eec5f94b380d"
+    }
+    Frame {
+        msec: 1712
+        hash: "0de290542c9d3e03ed78f51423011c16"
+    }
+    Frame {
+        msec: 1728
+        hash: "4c9aa06ad1e246b4b026742fc8cf37bc"
+    }
+    Frame {
+        msec: 1744
+        hash: "c33003a8262c2ba25510ece181e61bc9"
+    }
+    Frame {
+        msec: 1760
+        hash: "c33003a8262c2ba25510ece181e61bc9"
+    }
+    Frame {
+        msec: 1776
+        hash: "ad184fa88c4299b8911c9b7ada5b3736"
+    }
+    Mouse {
+        type: 2
+        button: 1
+        buttons: 1
+        x: 85; y: 12
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 85; y: 13
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 85; y: 15
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 1792
+        hash: "ad184fa88c4299b8911c9b7ada5b3736"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 85; y: 17
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 85; y: 23
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 1808
+        hash: "c2d0799526e908204efbd3aa980e086c"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 85; y: 30
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 85; y: 34
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 1824
+        hash: "b343a9ed7e9740ec1725837fad766745"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 85; y: 41
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 85; y: 44
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 1840
+        hash: "b33260ad955474452f204ed5d468ef78"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 85; y: 51
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 86; y: 55
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 1856
+        hash: "9a647c54e378bd0ee35ef4164892722c"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 87; y: 61
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 88; y: 67
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 3
+        button: 1
+        buttons: 0
+        x: 88; y: 67
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 89; y: 73
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 1872
+        hash: "dc553d1a7b678dffea41147fc6b841f6"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 89; y: 74
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 89; y: 78
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 1888
+        hash: "2d61b4fb1e5a8beb6e3c3cb53c21db42"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 89; y: 79
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 89; y: 82
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 1904
+        hash: "209faf0b20fd53d9a1c261c8cae9666f"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 90; y: 82
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 91; y: 83
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 1920
+        hash: "3497258aa07c76f0e31b5a492ee7e7cb"
+    }
+    Frame {
+        msec: 1936
+        image: "flickweb.2.png"
+    }
+    Frame {
+        msec: 1952
+        hash: "64c677ac4fea0e525279e86bf831d5d3"
+    }
+    Frame {
+        msec: 1968
+        hash: "76c6c887fea94288e9fd975655e5181c"
+    }
+    Frame {
+        msec: 1984
+        hash: "71b85e596c88b84a851a52aa3389e63a"
+    }
+    Frame {
+        msec: 2000
+        hash: "e4a562aa35aa532d15c9b129e22797bb"
+    }
+    Frame {
+        msec: 2016
+        hash: "148484dd95c88720cc5ef196334cb9a8"
+    }
+    Frame {
+        msec: 2032
+        hash: "924c6254ffa1707b69174f49e4e95213"
+    }
+    Frame {
+        msec: 2048
+        hash: "9e61907acedb27941d8be2befa364cfb"
+    }
+    Frame {
+        msec: 2064
+        hash: "9e61907acedb27941d8be2befa364cfb"
+    }
+    Frame {
+        msec: 2080
+        hash: "f2c4e99db1bb087a40b277ce8ce628f6"
+    }
+    Frame {
+        msec: 2096
+        hash: "f2c4e99db1bb087a40b277ce8ce628f6"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 91; y: 82
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 2112
+        hash: "b2d6b68f1f7229e8e65bb37e4c418a1b"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 90; y: 82
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 2128
+        hash: "b2d6b68f1f7229e8e65bb37e4c418a1b"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 89; y: 81
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 88; y: 80
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 2144
+        hash: "b2d6b68f1f7229e8e65bb37e4c418a1b"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 87; y: 79
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 86; y: 77
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 2160
+        hash: "b2d6b68f1f7229e8e65bb37e4c418a1b"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 86; y: 76
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 86; y: 75
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 2176
+        hash: "b2d6b68f1f7229e8e65bb37e4c418a1b"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 85; y: 73
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 84; y: 71
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 2192
+        hash: "b2d6b68f1f7229e8e65bb37e4c418a1b"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 82; y: 68
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 81; y: 67
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 2208
+        hash: "b2d6b68f1f7229e8e65bb37e4c418a1b"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 76; y: 61
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 75; y: 59
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 2224
+        hash: "b2d6b68f1f7229e8e65bb37e4c418a1b"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 71; y: 54
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 70; y: 51
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 2240
+        hash: "b2d6b68f1f7229e8e65bb37e4c418a1b"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 70; y: 50
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 70; y: 49
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 2256
+        hash: "b2d6b68f1f7229e8e65bb37e4c418a1b"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 70; y: 47
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 69; y: 46
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 2272
+        hash: "b2d6b68f1f7229e8e65bb37e4c418a1b"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 68; y: 45
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 67; y: 43
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 2288
+        hash: "b2d6b68f1f7229e8e65bb37e4c418a1b"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 66; y: 43
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 65; y: 41
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 2304
+        hash: "b2d6b68f1f7229e8e65bb37e4c418a1b"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 64; y: 40
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 64; y: 39
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 2320
+        hash: "b2d6b68f1f7229e8e65bb37e4c418a1b"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 63; y: 38
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 63; y: 37
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 2336
+        hash: "b2d6b68f1f7229e8e65bb37e4c418a1b"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 63; y: 35
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 63; y: 34
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 2352
+        hash: "b2d6b68f1f7229e8e65bb37e4c418a1b"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 63; y: 33
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 2368
+        hash: "b2d6b68f1f7229e8e65bb37e4c418a1b"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 64; y: 32
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 2384
+        hash: "b2d6b68f1f7229e8e65bb37e4c418a1b"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 65; y: 32
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 65; y: 31
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 2400
+        hash: "b2d6b68f1f7229e8e65bb37e4c418a1b"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 66; y: 31
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 68; y: 31
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 2416
+        hash: "b2d6b68f1f7229e8e65bb37e4c418a1b"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 69; y: 30
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 71; y: 29
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 2432
+        hash: "b2d6b68f1f7229e8e65bb37e4c418a1b"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 73; y: 27
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 73; y: 26
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 2448
+        hash: "b2d6b68f1f7229e8e65bb37e4c418a1b"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 74; y: 24
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 74; y: 22
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 2464
+        hash: "b2d6b68f1f7229e8e65bb37e4c418a1b"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 74; y: 21
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 74; y: 20
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 2480
+        hash: "b2d6b68f1f7229e8e65bb37e4c418a1b"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 74; y: 18
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 74; y: 17
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 2496
+        hash: "b2d6b68f1f7229e8e65bb37e4c418a1b"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 74; y: 16
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 73; y: 15
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 2512
+        hash: "b2d6b68f1f7229e8e65bb37e4c418a1b"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 73; y: 14
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 2528
+        hash: "b2d6b68f1f7229e8e65bb37e4c418a1b"
+    }
+    Frame {
+        msec: 2544
+        hash: "b2d6b68f1f7229e8e65bb37e4c418a1b"
+    }
+    Frame {
+        msec: 2560
+        hash: "b2d6b68f1f7229e8e65bb37e4c418a1b"
+    }
+    Mouse {
+        type: 2
+        button: 1
+        buttons: 1
+        x: 73; y: 14
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 2576
+        hash: "b2d6b68f1f7229e8e65bb37e4c418a1b"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 73; y: 15
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 72; y: 17
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 2592
+        hash: "b2d6b68f1f7229e8e65bb37e4c418a1b"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 72; y: 24
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 72; y: 29
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 2608
+        hash: "b2d6b68f1f7229e8e65bb37e4c418a1b"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 72; y: 40
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 71; y: 47
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 2624
+        hash: "c4dd48fca556c2760c8f81db7fea6938"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 70; y: 60
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 70; y: 78
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 2640
+        hash: "9dbad8cb2692807d67f74e7ac4a4a70e"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 70; y: 88
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 70; y: 96
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 3
+        button: 1
+        buttons: 0
+        x: 70; y: 96
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 2656
+        hash: "152648affe4045a81f0d6ff9150889f1"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 70; y: 99
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 70; y: 102
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 2672
+        hash: "152648affe4045a81f0d6ff9150889f1"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 73; y: 103
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 74; y: 103
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 2688
+        hash: "152648affe4045a81f0d6ff9150889f1"
+    }
+    Frame {
+        msec: 2704
+        hash: "152648affe4045a81f0d6ff9150889f1"
+    }
+    Frame {
+        msec: 2720
+        hash: "152648affe4045a81f0d6ff9150889f1"
+    }
+    Frame {
+        msec: 2736
+        hash: "152648affe4045a81f0d6ff9150889f1"
+    }
+    Frame {
+        msec: 2752
+        hash: "152648affe4045a81f0d6ff9150889f1"
+    }
+    Frame {
+        msec: 2768
+        hash: "c9eee2b7529b07a17151e7140444c099"
+    }
+    Frame {
+        msec: 2784
+        hash: "c9eee2b7529b07a17151e7140444c099"
+    }
+    Frame {
+        msec: 2800
+        hash: "c9eee2b7529b07a17151e7140444c099"
+    }
+    Frame {
+        msec: 2816
+        hash: "c9eee2b7529b07a17151e7140444c099"
+    }
+    Frame {
+        msec: 2832
+        hash: "c9eee2b7529b07a17151e7140444c099"
+    }
+    Frame {
+        msec: 2848
+        hash: "c9eee2b7529b07a17151e7140444c099"
+    }
+    Frame {
+        msec: 2864
+        hash: "d045839439e4091210c745f0ea173e52"
+    }
+    Frame {
+        msec: 2880
+        hash: "d045839439e4091210c745f0ea173e52"
+    }
+    Frame {
+        msec: 2896
+        image: "flickweb.3.png"
+    }
+    Frame {
+        msec: 2912
+        hash: "d045839439e4091210c745f0ea173e52"
+    }
+    Frame {
+        msec: 2928
+        hash: "d045839439e4091210c745f0ea173e52"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 74; y: 102
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 2944
+        hash: "d045839439e4091210c745f0ea173e52"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 74; y: 101
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 73; y: 98
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 2960
+        hash: "d045839439e4091210c745f0ea173e52"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 69; y: 93
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 67; y: 91
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 2976
+        hash: "d045839439e4091210c745f0ea173e52"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 62; y: 85
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 60; y: 83
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 2992
+        hash: "d045839439e4091210c745f0ea173e52"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 56; y: 77
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 55; y: 75
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 3008
+        hash: "d045839439e4091210c745f0ea173e52"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 52; y: 70
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 49; y: 67
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 3024
+        hash: "d045839439e4091210c745f0ea173e52"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 49; y: 65
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 48; y: 61
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 3040
+        hash: "d045839439e4091210c745f0ea173e52"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 48; y: 60
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 46; y: 56
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 3056
+        hash: "d045839439e4091210c745f0ea173e52"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 45; y: 54
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 42; y: 50
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 3072
+        hash: "d045839439e4091210c745f0ea173e52"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 39; y: 47
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 38; y: 45
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 3088
+        hash: "d045839439e4091210c745f0ea173e52"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 37; y: 44
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 36; y: 43
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 3104
+        hash: "d045839439e4091210c745f0ea173e52"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 35; y: 41
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 35; y: 40
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 3120
+        hash: "d045839439e4091210c745f0ea173e52"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 33; y: 39
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 33; y: 38
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 3136
+        hash: "d045839439e4091210c745f0ea173e52"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 32; y: 37
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 3152
+        hash: "d045839439e4091210c745f0ea173e52"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 32; y: 36
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 31; y: 36
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 3168
+        hash: "d045839439e4091210c745f0ea173e52"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 31; y: 35
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 3184
+        hash: "d045839439e4091210c745f0ea173e52"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 30; y: 35
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 30; y: 33
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 3200
+        hash: "d045839439e4091210c745f0ea173e52"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 28; y: 32
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 28; y: 31
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 3216
+        hash: "d045839439e4091210c745f0ea173e52"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 26; y: 29
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 26; y: 28
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 3232
+        hash: "d045839439e4091210c745f0ea173e52"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 25; y: 27
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 3248
+        hash: "d045839439e4091210c745f0ea173e52"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 25; y: 26
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 3264
+        hash: "d045839439e4091210c745f0ea173e52"
+    }
+    Frame {
+        msec: 3280
+        hash: "d045839439e4091210c745f0ea173e52"
+    }
+    Frame {
+        msec: 3296
+        hash: "d045839439e4091210c745f0ea173e52"
+    }
+    Frame {
+        msec: 3312
+        hash: "d045839439e4091210c745f0ea173e52"
+    }
+    Mouse {
+        type: 2
+        button: 1
+        buttons: 1
+        x: 25; y: 26
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 3328
+        hash: "d045839439e4091210c745f0ea173e52"
+    }
+    Frame {
+        msec: 3344
+        hash: "d045839439e4091210c745f0ea173e52"
+    }
+    Frame {
+        msec: 3360
+        hash: "d045839439e4091210c745f0ea173e52"
+    }
+    Frame {
+        msec: 3376
+        hash: "d045839439e4091210c745f0ea173e52"
+    }
+    Mouse {
+        type: 3
+        button: 1
+        buttons: 0
+        x: 25; y: 26
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 3392
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 25; y: 27
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 3408
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 26; y: 27
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 26; y: 28
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 3424
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 27; y: 28
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 27; y: 29
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 3440
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 3456
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 3472
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 3488
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 3504
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 27; y: 30
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 3520
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 28; y: 31
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 29; y: 34
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 3536
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 31; y: 36
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 37; y: 43
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 3552
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 40; y: 48
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 50; y: 59
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 3568
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 55; y: 64
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 65; y: 73
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 3584
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 69; y: 77
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 75; y: 83
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 3600
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 78; y: 85
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 80; y: 86
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 3616
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 82; y: 88
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 83; y: 89
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 3632
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 85; y: 90
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 3648
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 3664
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 3680
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 3696
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 3712
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 3728
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 3744
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 3760
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 85; y: 89
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 3776
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 3792
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 84; y: 88
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 84; y: 87
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 3808
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 85; y: 85
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 84; y: 83
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 3824
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 3840
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 3856
+        image: "flickweb.4.png"
+    }
+    Frame {
+        msec: 3872
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 3888
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 3904
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 3920
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 3936
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 3952
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 3968
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 3984
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 4000
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 4016
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 84; y: 84
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 4032
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 84; y: 87
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 4048
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 83; y: 88
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 4064
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 4080
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 4096
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 4112
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 4128
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 83; y: 89
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 4144
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 82; y: 90
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 4160
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 82; y: 91
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 82; y: 92
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 4176
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 82; y: 93
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 82; y: 95
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 4192
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 82; y: 97
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 83; y: 100
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 4208
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 83; y: 101
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 83; y: 105
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 4224
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 83; y: 107
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 83; y: 110
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 4240
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 83; y: 113
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 83; y: 114
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 4256
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 83; y: 115
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 83; y: 116
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 4272
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 83; y: 117
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 4288
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 4304
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 4320
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 4336
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 4352
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 4368
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 4384
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 4400
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 4416
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 4432
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 4448
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 4464
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 4480
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 83; y: 116
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 4496
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 4512
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 4528
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 4544
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 4560
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 4576
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 4592
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 4608
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 82; y: 116
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 4624
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 4640
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 82; y: 117
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 4656
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 4672
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 4688
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 82; y: 118
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 4704
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 4720
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 4736
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 4752
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 4768
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 4784
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 83; y: 119
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 4800
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 4816
+        image: "flickweb.5.png"
+    }
+    Mouse {
+        type: 2
+        button: 1
+        buttons: 1
+        x: 83; y: 119
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 4832
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 4848
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 84; y: 119
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 4864
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 85; y: 118
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 85; y: 117
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 4880
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 86; y: 113
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 87; y: 111
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 4896
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 89; y: 107
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 90; y: 104
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 4912
+        hash: "f10fa114e248809ed280788d03a3e234"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 92; y: 99
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 93; y: 95
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 4928
+        hash: "442357340d9690811d582f548f933d92"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 95; y: 88
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 98; y: 81
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 3
+        button: 1
+        buttons: 0
+        x: 98; y: 81
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 4944
+        hash: "188b8f78b2a2180a8e96a8a05bb20fe2"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 98; y: 77
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 99; y: 69
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 4960
+        hash: "2b8ee42c5660f4f938cf10507690abbe"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 100; y: 66
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 101; y: 60
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 4976
+        hash: "3d4aab388f62e64c5f72c631fb8584aa"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 103; y: 59
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 104; y: 56
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 4992
+        hash: "439364cea3330411f526093d58ece463"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 104; y: 55
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 104; y: 53
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 5008
+        hash: "27653ec59651e6b3cb2ebf2bc81a975a"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 104; y: 52
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 104; y: 51
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 5024
+        hash: "d9c0fb2cbf968e0524291ae2570ca585"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 105; y: 50
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 105; y: 49
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 5040
+        hash: "ef75df694a972985f410e21182dbb12b"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 105; y: 48
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 5056
+        hash: "adda6aa851c1587c1bb2605809348725"
+    }
+    Frame {
+        msec: 5072
+        hash: "196c12052069f0f8c775aa38d3291bef"
+    }
+    Frame {
+        msec: 5088
+        hash: "eaa025b6aee87edf95643cc46880d0db"
+    }
+    Frame {
+        msec: 5104
+        hash: "edeab897b82df47ae6deb858eca3087e"
+    }
+    Frame {
+        msec: 5120
+        hash: "46e3b5da149cfc40036a860e74e0cd78"
+    }
+    Frame {
+        msec: 5136
+        hash: "46e3b5da149cfc40036a860e74e0cd78"
+    }
+    Frame {
+        msec: 5152
+        hash: "0fe9b13b9b0752ab4ad74f4e43f94d86"
+    }
+    Frame {
+        msec: 5168
+        hash: "0fe9b13b9b0752ab4ad74f4e43f94d86"
+    }
+    Frame {
+        msec: 5184
+        hash: "695e9c7292475cad011ca76799452042"
+    }
+    Frame {
+        msec: 5200
+        hash: "695e9c7292475cad011ca76799452042"
+    }
+    Frame {
+        msec: 5216
+        hash: "695e9c7292475cad011ca76799452042"
+    }
+    Frame {
+        msec: 5232
+        hash: "695e9c7292475cad011ca76799452042"
+    }
+    Frame {
+        msec: 5248
+        hash: "695e9c7292475cad011ca76799452042"
+    }
+    Frame {
+        msec: 5264
+        hash: "695e9c7292475cad011ca76799452042"
+    }
+    Frame {
+        msec: 5280
+        hash: "695e9c7292475cad011ca76799452042"
+    }
+    Frame {
+        msec: 5296
+        hash: "695e9c7292475cad011ca76799452042"
+    }
+    Frame {
+        msec: 5312
+        hash: "695e9c7292475cad011ca76799452042"
+    }
+    Frame {
+        msec: 5328
+        hash: "695e9c7292475cad011ca76799452042"
+    }
+    Frame {
+        msec: 5344
+        hash: "695e9c7292475cad011ca76799452042"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 105; y: 47
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 104; y: 46
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 5360
+        hash: "695e9c7292475cad011ca76799452042"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 103; y: 45
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 102; y: 45
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 5376
+        hash: "695e9c7292475cad011ca76799452042"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 102; y: 44
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 5392
+        hash: "695e9c7292475cad011ca76799452042"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 101; y: 43
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 5408
+        hash: "695e9c7292475cad011ca76799452042"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 101; y: 42
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 100; y: 42
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 5424
+        hash: "695e9c7292475cad011ca76799452042"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 99; y: 41
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 98; y: 40
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 5440
+        hash: "695e9c7292475cad011ca76799452042"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 98; y: 39
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 5456
+        hash: "695e9c7292475cad011ca76799452042"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 98; y: 38
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 98; y: 37
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 5472
+        hash: "695e9c7292475cad011ca76799452042"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 98; y: 36
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 98; y: 35
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 5488
+        hash: "695e9c7292475cad011ca76799452042"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 98; y: 33
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 98; y: 30
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 5504
+        hash: "695e9c7292475cad011ca76799452042"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 98; y: 29
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 98; y: 28
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 5520
+        hash: "695e9c7292475cad011ca76799452042"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 98; y: 26
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 98; y: 25
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 5536
+        hash: "695e9c7292475cad011ca76799452042"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 98; y: 24
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 98; y: 23
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 5552
+        hash: "695e9c7292475cad011ca76799452042"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 97; y: 23
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 97; y: 22
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 5568
+        hash: "695e9c7292475cad011ca76799452042"
+    }
+    Frame {
+        msec: 5584
+        hash: "695e9c7292475cad011ca76799452042"
+    }
+    Frame {
+        msec: 5600
+        hash: "695e9c7292475cad011ca76799452042"
+    }
+    Frame {
+        msec: 5616
+        hash: "695e9c7292475cad011ca76799452042"
+    }
+    Frame {
+        msec: 5632
+        hash: "695e9c7292475cad011ca76799452042"
+    }
+    Mouse {
+        type: 2
+        button: 1
+        buttons: 1
+        x: 97; y: 22
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 5648
+        hash: "695e9c7292475cad011ca76799452042"
+    }
+    Frame {
+        msec: 5664
+        hash: "695e9c7292475cad011ca76799452042"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 97; y: 24
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 97; y: 26
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 5680
+        hash: "695e9c7292475cad011ca76799452042"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 97; y: 28
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 97; y: 31
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 5696
+        hash: "695e9c7292475cad011ca76799452042"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 97; y: 37
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 97; y: 42
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 5712
+        hash: "27653ec59651e6b3cb2ebf2bc81a975a"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 97; y: 50
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 97; y: 58
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 5728
+        hash: "f2a68c3a60002a796b0cd595ae89e477"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 97; y: 63
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 97; y: 71
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 5744
+        hash: "2628ffe66f06c997d9c9b66febc04ce8"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 97; y: 75
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 98; y: 83
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 5760
+        hash: "9b68c76d622f7b883a13927a112179f0"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 99; y: 86
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 101; y: 91
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 3
+        button: 1
+        buttons: 0
+        x: 101; y: 91
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 5776
+        image: "flickweb.6.png"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 103; y: 95
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 104; y: 95
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 5792
+        hash: "6d6d87355037ec4a15b2a81c8d48b74d"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 107; y: 95
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 107; y: 94
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 5808
+        hash: "6d6d87355037ec4a15b2a81c8d48b74d"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 107; y: 93
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 5824
+        hash: "6d6d87355037ec4a15b2a81c8d48b74d"
+    }
+    Frame {
+        msec: 5840
+        hash: "6d6d87355037ec4a15b2a81c8d48b74d"
+    }
+    Frame {
+        msec: 5856
+        hash: "34c3edc4500a268a326b5c2156c12f09"
+    }
+    Frame {
+        msec: 5872
+        hash: "34c3edc4500a268a326b5c2156c12f09"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 106; y: 92
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 105; y: 91
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 5888
+        hash: "34c3edc4500a268a326b5c2156c12f09"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 104; y: 91
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 103; y: 90
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 5904
+        hash: "ac600900160ab37ec8a3e67eb82d0259"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 101; y: 89
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 100; y: 88
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 5920
+        hash: "ac600900160ab37ec8a3e67eb82d0259"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 99; y: 86
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 98; y: 86
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 5936
+        hash: "dc3cef419e3b7d59f450d3307aeebefa"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 97; y: 85
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 96; y: 85
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 5952
+        hash: "dc3cef419e3b7d59f450d3307aeebefa"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 94; y: 84
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 93; y: 83
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 5968
+        hash: "9b68c76d622f7b883a13927a112179f0"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 90; y: 82
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 86; y: 81
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 5984
+        hash: "9b68c76d622f7b883a13927a112179f0"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 85; y: 80
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 81; y: 79
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 6000
+        hash: "9b68c76d622f7b883a13927a112179f0"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 79; y: 78
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 76; y: 76
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 6016
+        hash: "9b68c76d622f7b883a13927a112179f0"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 75; y: 76
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 72; y: 73
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 6032
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 68; y: 70
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 66; y: 68
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 6048
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 63; y: 65
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 61; y: 63
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 6064
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 58; y: 60
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 57; y: 59
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 6080
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 54; y: 56
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 53; y: 54
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 6096
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 51; y: 50
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 48; y: 46
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 6112
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 48; y: 45
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 46; y: 41
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 6128
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 45; y: 39
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 43; y: 36
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 6144
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 43; y: 35
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 41; y: 32
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 6160
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 40; y: 30
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 38; y: 28
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 6176
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 36; y: 26
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 35; y: 24
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 6192
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 33; y: 22
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 32; y: 21
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 6208
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 31; y: 20
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 30; y: 19
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 6224
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 29; y: 19
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 28; y: 18
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 6240
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 27; y: 18
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 26; y: 17
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 6256
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 25; y: 17
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 6272
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 24; y: 17
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 6288
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 6304
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 6320
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 6336
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 6352
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Mouse {
+        type: 2
+        button: 1
+        buttons: 1
+        x: 24; y: 17
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 6368
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 6384
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 6400
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 6416
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Mouse {
+        type: 3
+        button: 1
+        buttons: 0
+        x: 24; y: 17
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 6432
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 24; y: 18
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 6448
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 25; y: 18
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 25; y: 19
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 6464
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 26; y: 19
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 27; y: 20
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 6480
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 28; y: 21
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 6496
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 6512
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 6528
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 29; y: 22
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 6544
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 30; y: 23
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 31; y: 24
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 6560
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 32; y: 25
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 33; y: 25
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 6576
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 34; y: 26
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 34; y: 27
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 6592
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 37; y: 30
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 38; y: 31
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 6608
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 41; y: 35
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 42; y: 37
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 6624
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 45; y: 42
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 50; y: 46
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 6640
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 52; y: 49
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 57; y: 53
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 6656
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 60; y: 55
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 65; y: 58
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 6672
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 66; y: 59
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 71; y: 61
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 6688
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 75; y: 62
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 77; y: 63
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 6704
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 80; y: 64
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 81; y: 64
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 6720
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 83; y: 64
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 84; y: 64
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 6736
+        image: "flickweb.7.png"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 85; y: 64
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 86; y: 64
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 6752
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 87; y: 64
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 88; y: 64
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 6768
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 90; y: 64
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 93; y: 64
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 6784
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 94; y: 64
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 99; y: 63
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 6800
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 102; y: 63
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 106; y: 62
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 6816
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 110; y: 62
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 116; y: 62
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 6832
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 122; y: 62
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 124; y: 62
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 6848
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 125; y: 62
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 6864
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 6880
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 6896
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 6912
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 6928
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 6944
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 6960
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 6976
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 6992
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 7008
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 7024
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 7040
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 7056
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 7072
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 7088
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 126; y: 62
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 7104
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 127; y: 62
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 129; y: 64
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 7120
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 132; y: 65
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 134; y: 66
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 7136
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 139; y: 68
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 144; y: 69
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 7152
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 148; y: 69
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 154; y: 69
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 7168
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 158; y: 68
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 162; y: 66
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 7184
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 164; y: 65
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 165; y: 62
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 7200
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 165; y: 60
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 165; y: 54
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 7216
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 162; y: 45
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 159; y: 39
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 7232
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 151; y: 27
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 146; y: 22
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 7248
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 0
+        x: 129; y: 3
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 7264
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 7280
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 7296
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 7312
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 7328
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 7344
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 7360
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 7376
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 7392
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 7408
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 7424
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 7440
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 7456
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 7472
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 7488
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 7504
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 7520
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 7536
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 7552
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 7568
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 7584
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 7600
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 7616
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 7632
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 7648
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 7664
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 7680
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 7696
+        image: "flickweb.8.png"
+    }
+    Frame {
+        msec: 7712
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 7728
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 7744
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 7760
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 7776
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 7792
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 7808
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 7824
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 7840
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 7856
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 7872
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 7888
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 7904
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 7920
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 7936
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 7952
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 7968
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 7984
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 8000
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 8016
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 8032
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 8048
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 8064
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 8080
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 8096
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 8112
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 8128
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 8144
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 8160
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 8176
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 8192
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 8208
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 8224
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 8240
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 8256
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 8272
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 8288
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 8304
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 8320
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 8336
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 8352
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 8368
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 8384
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 8400
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 8416
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 8432
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 8448
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 8464
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 8480
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 8496
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 8512
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 8528
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 8544
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 8560
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 8576
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 8592
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 8608
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 8624
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 8640
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 8656
+        image: "flickweb.9.png"
+    }
+    Frame {
+        msec: 8672
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 8688
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 8704
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 8720
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 8736
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 8752
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 8768
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 8784
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 8800
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 8816
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 8832
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 8848
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 8864
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 8880
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 8896
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 8912
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 8928
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 8944
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 8960
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 8976
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 8992
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 9008
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 9024
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 9040
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 9056
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 9072
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 9088
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 9104
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 9120
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 9136
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 9152
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 9168
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 9184
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 9200
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 9216
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 9232
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 9248
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 9264
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 9280
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 9296
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 9312
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 9328
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 9344
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 9360
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 9376
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 9392
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 9408
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 9424
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 9440
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 9456
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 9472
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 9488
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 9504
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 9520
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 9536
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 9552
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 9568
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 9584
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 9600
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 9616
+        image: "flickweb.10.png"
+    }
+    Frame {
+        msec: 9632
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 9648
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 9664
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 9680
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 9696
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+    Frame {
+        msec: 9712
+        hash: "98990f624351f88347b2eb010bb5cd13"
+    }
+}
diff --git a/tests/auto/declarative/qmlvisual/webview/flickable/flickweb.qml b/tests/auto/declarative/qmlvisual/webview/flickable/flickweb.qml
new file mode 100644
index 0000000..6063226
--- /dev/null
+++ b/tests/auto/declarative/qmlvisual/webview/flickable/flickweb.qml
@@ -0,0 +1,35 @@
+import QtQuick 1.0
+import QtWebKit 1.0
+
+Flickable {
+    id: flickable
+    width: 320
+    height:  200
+    contentWidth: Math.max(flickable.width,webView.width)
+    contentHeight: Math.max(flickable.height,webView.height)
+    pressDelay: 100
+
+    WebView {
+        id: webView
+        transformOrigin: Item.TopLeft
+        smooth: false // We don't want smooth scaling, since we only scale during (fast) transitions
+        url:  "test.html"
+        preferredWidth: flickable.width
+        preferredHeight: flickable.height
+        contentsScale: 1
+        onContentsSizeChanged: {
+            // zoom out
+            contentsScale = Math.min(1,flickable.width / contentsSize.width)
+        }
+    }
+
+    Rectangle {
+        id: button
+        width: 50; height: 50; color: "red"
+        MouseArea {
+            anchors.fill: parent
+            onPressed: button.color = "blue"
+            onReleased: button.color = "green"
+        }
+    }
+}
diff --git a/tests/auto/declarative/qmlvisual/webview/flickable/qtlogo.png b/tests/auto/declarative/qmlvisual/webview/flickable/qtlogo.png
new file mode 100644
index 0000000..399bd0b
Binary files /dev/null and b/tests/auto/declarative/qmlvisual/webview/flickable/qtlogo.png differ
diff --git a/tests/auto/declarative/qmlvisual/webview/flickable/test.html b/tests/auto/declarative/qmlvisual/webview/flickable/test.html
new file mode 100644
index 0000000..35eb718
--- /dev/null
+++ b/tests/auto/declarative/qmlvisual/webview/flickable/test.html
@@ -0,0 +1,3 @@
+<html>
+    <img width="400" height="400" src="qtlogo.png">
+</html>
-- 
cgit v0.12


From cd7e76b2ac2894c7c18a3806f8074b03f581d5d2 Mon Sep 17 00:00:00 2001
From: Petri Latvala <ext-petri.latvala@nokia.com>
Date: Wed, 13 Oct 2010 10:25:14 +0300
Subject: Ignore .pc/

Reviewed-By: Rohan McGovern

(cherry picked from commit 561a72c2568768f9adf34aa1077717f9311ce56d)
---
 .gitignore | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/.gitignore b/.gitignore
index af52197..f9a4454 100644
--- a/.gitignore
+++ b/.gitignore
@@ -235,3 +235,5 @@ qtc-debugging-helper
 src/corelib/lib
 src/network/lib
 src/xml/lib/
+
+.pc/
-- 
cgit v0.12


From ea41bb4f6e097ee641e5fbee3242ccc5aa7e77b1 Mon Sep 17 00:00:00 2001
From: Joona Petrell <joona.t.petrell@nokia.com>
Date: Tue, 23 Nov 2010 20:13:09 +1000
Subject: Update QtGui emulator def file for bug QT-3971

---
 src/s60installs/bwins/QtGuiu.def | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/src/s60installs/bwins/QtGuiu.def b/src/s60installs/bwins/QtGuiu.def
index dc8a865..6a33fc3 100644
--- a/src/s60installs/bwins/QtGuiu.def
+++ b/src/s60installs/bwins/QtGuiu.def
@@ -12852,7 +12852,7 @@ EXPORTS
 	?drawStaticText@QPainter@@QAEXABVQPointF@@ABVQStaticText@@@Z @ 12851 NONAME ; void QPainter::drawStaticText(class QPointF const &, class QStaticText const &)
 	?updateAll@QGraphicsViewPrivate@@QAEXXZ @ 12852 NONAME ; void QGraphicsViewPrivate::updateAll(void)
 	?updateMicroFocus@QGraphicsItem@@IAEXXZ @ 12853 NONAME ; void QGraphicsItem::updateMicroFocus(void)
-	?populate@QTextureGlyphCache@@QAEXPAVQFontEngine@@HPBIPBUQFixedPoint@@@Z @ 12854 NONAME ; void QTextureGlyphCache::populate(class QFontEngine *, int, unsigned int const *, struct QFixedPoint const *)
+	?populate@QTextureGlyphCache@@QAEXPAVQFontEngine@@HPBIPBUQFixedPoint@@@Z @ 12854 NONAME ABSENT ; void QTextureGlyphCache::populate(class QFontEngine *, int, unsigned int const *, struct QFixedPoint const *)
 	?hasPartialUpdateSupport@QWindowSurface@@QBE_NXZ @ 12855 NONAME ; bool QWindowSurface::hasPartialUpdateSupport(void) const
 	?scroll@QRuntimePixmapData@@UAE_NHHABVQRect@@@Z @ 12856 NONAME ; bool QRuntimePixmapData::scroll(int, int, class QRect const &)
 	?qt_draw_glyphs@@YAXPAVQPainter@@PBIPBVQPointF@@H@Z @ 12857 NONAME ; void qt_draw_glyphs(class QPainter *, unsigned int const *, class QPointF const *, int)
@@ -12904,4 +12904,5 @@ EXPORTS
 	?fontEngine@QStaticTextItem@@QBEPAVQFontEngine@@XZ @ 12903 NONAME ; class QFontEngine * QStaticTextItem::fontEngine(void) const
 	?reactivateDeferredActiveObjects@QEventDispatcherS60@@UAEXXZ @ 12904 NONAME ; void QEventDispatcherS60::reactivateDeferredActiveObjects(void)
 	?userData@QStaticTextItem@@QBEPAVQStaticTextUserData@@XZ @ 12905 NONAME ; class QStaticTextUserData * QStaticTextItem::userData(void) const
+	?populate@QTextureGlyphCache@@QAE_NPAVQFontEngine@@HPBIPBUQFixedPoint@@@Z @ 12906 NONAME ; bool QTextureGlyphCache::populate(class QFontEngine *, int, unsigned int const *, struct QFixedPoint const *)
 
-- 
cgit v0.12


From 5d0be38c15acf28969bd8bf984ab23a29fa8e354 Mon Sep 17 00:00:00 2001
From: Damian Jansen <damian.jansen@nokia.com>
Date: Wed, 24 Nov 2010 10:51:29 +1000
Subject: Fix asynchronous reload call in test, broken by previous submit

Task-number: QTBUG-15493
---
 tests/auto/declarative/qdeclarativeviewer/tst_qdeclarativeviewer.cpp | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/tests/auto/declarative/qdeclarativeviewer/tst_qdeclarativeviewer.cpp b/tests/auto/declarative/qdeclarativeviewer/tst_qdeclarativeviewer.cpp
index 1c1c04b..21c7197 100644
--- a/tests/auto/declarative/qdeclarativeviewer/tst_qdeclarativeviewer.cpp
+++ b/tests/auto/declarative/qdeclarativeviewer/tst_qdeclarativeviewer.cpp
@@ -45,6 +45,7 @@
 #include <QtDeclarative/qdeclarativeitem.h>
 #include <QtDeclarative/qdeclarativecontext.h>
 #include <QtGui/qmenubar.h>
+#include <QSignalSpy>
 #include "../../../shared/util.h"
 #include "qmlruntime.h"
 #include "deviceorientation.h"
@@ -194,7 +195,9 @@ void tst_QDeclarativeViewer::loading()
     QCOMPARE(viewer->size(), QSize(250, 350));
     QCOMPARE(viewer->size(), viewer->sizeHint());
 
+    QSignalSpy statusSpy(viewer->view(), SIGNAL(statusChanged(QDeclarativeView::Status)));
     viewer->reload();
+    QTRY_VERIFY(statusSpy.count() == 1);
     rootItem = qobject_cast<QDeclarativeItem*>(viewer->view()->rootObject());
     QVERIFY(rootItem);
 
-- 
cgit v0.12


From d32360bb33e830f8c17a6db1a31f529436c2915e Mon Sep 17 00:00:00 2001
From: Martin Jones <martin.jones@nokia.com>
Date: Wed, 24 Nov 2010 11:25:07 +1000
Subject: Avoid lockup in ListView when animating delegates.

Animating delegates results in the content height changing, which
may result in fixup being called if at the ends of the view, which
may in turn cause refill to be called, which will change the content
height, which repeats.  Prevent this recusion from happening.

Task-number: QTBUG-14821
Reviewed-by: Bea Lam
---
 .../graphicsitems/qdeclarativelistview.cpp         |  8 ++++++
 .../qdeclarativelistview/data/qtbug14821.qml       | 31 ++++++++++++++++++++++
 .../tst_qdeclarativelistview.cpp                   | 21 +++++++++++++++
 3 files changed, 60 insertions(+)
 create mode 100644 tests/auto/declarative/qdeclarativelistview/data/qtbug14821.qml

diff --git a/src/declarative/graphicsitems/qdeclarativelistview.cpp b/src/declarative/graphicsitems/qdeclarativelistview.cpp
index 6be49ba..450b6af 100644
--- a/src/declarative/graphicsitems/qdeclarativelistview.cpp
+++ b/src/declarative/graphicsitems/qdeclarativelistview.cpp
@@ -183,6 +183,7 @@ public:
         , ownModel(false), wrap(false), autoHighlight(true), haveHighlightRange(false)
         , correctFlick(false), inFlickCorrection(false), lazyRelease(false)
         , deferredRelease(false), layoutScheduled(false), currentIndexCleared(false)
+        , inViewportMoved(false)
         , minExtentDirty(true), maxExtentDirty(true)
     {}
 
@@ -503,6 +504,7 @@ public:
     bool deferredRelease : 1;
     bool layoutScheduled : 1;
     bool currentIndexCleared : 1;
+    bool inViewportMoved : 1;
     mutable bool minExtentDirty : 1;
     mutable bool maxExtentDirty : 1;
 };
@@ -2281,6 +2283,10 @@ void QDeclarativeListView::viewportMoved()
     QDeclarativeFlickable::viewportMoved();
     if (!d->itemCount)
         return;
+    // Recursion can occur due to refill changing the content size.
+    if (d->inViewportMoved)
+        return;
+    d->inViewportMoved = true;
     d->lazyRelease = true;
     refill();
     if (d->flickingHorizontally || d->flickingVertically || d->movingHorizontally || d->movingVertically)
@@ -2294,6 +2300,7 @@ void QDeclarativeListView::viewportMoved()
                 pos = viewPos + d->highlightRangeEnd - d->highlight->size();
             if (pos < viewPos + d->highlightRangeStart)
                 pos = viewPos + d->highlightRangeStart;
+            d->highlightPosAnimator->stop();
             d->highlight->setPosition(qRound(pos));
 
             // update current index
@@ -2341,6 +2348,7 @@ void QDeclarativeListView::viewportMoved()
         }
         d->inFlickCorrection = false;
     }
+    d->inViewportMoved = false;
 }
 
 qreal QDeclarativeListView::minYExtent() const
diff --git a/tests/auto/declarative/qdeclarativelistview/data/qtbug14821.qml b/tests/auto/declarative/qdeclarativelistview/data/qtbug14821.qml
new file mode 100644
index 0000000..e0303ec
--- /dev/null
+++ b/tests/auto/declarative/qdeclarativelistview/data/qtbug14821.qml
@@ -0,0 +1,31 @@
+import QtQuick 1.0
+
+ListView {
+    id: view
+    width: 300; height: 200
+    focus: true
+    keyNavigationWraps: true
+
+    model: 100
+
+    preferredHighlightBegin: 90
+    preferredHighlightEnd:   110
+
+    highlightRangeMode: ListView.StrictlyEnforceRange
+    highlight: Component {
+        Rectangle {
+            border.color: "blue"
+            border.width: 3
+            color: "transparent"
+            width: 300; height: 15
+        }
+    }
+
+    delegate: Component {
+           Item {
+               height: 15 + (view.currentIndex == index ? 20 : 0)
+               width: 200
+               Text { text: 'Index: ' + index; anchors.verticalCenter: parent.verticalCenter }
+           }
+       }
+}
diff --git a/tests/auto/declarative/qdeclarativelistview/tst_qdeclarativelistview.cpp b/tests/auto/declarative/qdeclarativelistview/tst_qdeclarativelistview.cpp
index a4b4f21..37d836d 100644
--- a/tests/auto/declarative/qdeclarativelistview/tst_qdeclarativelistview.cpp
+++ b/tests/auto/declarative/qdeclarativelistview/tst_qdeclarativelistview.cpp
@@ -101,6 +101,7 @@ private slots:
     void footer();
     void resizeView();
     void sizeLessThan1();
+    void QTBUG_14821();
 
 private:
     template <class T> void items();
@@ -1768,6 +1769,26 @@ void tst_QDeclarativeListView::sizeLessThan1()
     delete canvas;
 }
 
+void tst_QDeclarativeListView::QTBUG_14821()
+{
+    QDeclarativeView *canvas = createView();
+
+    canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/qtbug14821.qml"));
+    qApp->processEvents();
+
+    QDeclarativeListView *listview = qobject_cast<QDeclarativeListView*>(canvas->rootObject());
+    QVERIFY(listview != 0);
+
+    QDeclarativeItem *contentItem = listview->contentItem();
+    QVERIFY(contentItem != 0);
+
+    listview->decrementCurrentIndex();
+    QCOMPARE(listview->currentIndex(), 99);
+
+    listview->incrementCurrentIndex();
+    QCOMPARE(listview->currentIndex(), 0);
+}
+
 void tst_QDeclarativeListView::qListModelInterface_items()
 {
     items<TestModel>();
-- 
cgit v0.12


From e3da9407ad85a65abce72f8a32230ec4f2f95369 Mon Sep 17 00:00:00 2001
From: Bea Lam <bea.lam@nokia.com>
Date: Wed, 24 Nov 2010 13:50:27 +1000
Subject: Allow javascript date and regexp objects in WorkerScript messages

Task-number: QTBUG-14666
Reviewed-by: Aaron Kennedy
---
 src/declarative/qml/qdeclarativeworkerscript.cpp            | 13 +++++++++++++
 .../tst_qdeclarativeworkerscript.cpp                        |  5 +++++
 2 files changed, 18 insertions(+)

diff --git a/src/declarative/qml/qdeclarativeworkerscript.cpp b/src/declarative/qml/qdeclarativeworkerscript.cpp
index be7ea0e..4b78020 100644
--- a/src/declarative/qml/qdeclarativeworkerscript.cpp
+++ b/src/declarative/qml/qdeclarativeworkerscript.cpp
@@ -52,6 +52,7 @@
 #include <QtCore/qwaitcondition.h>
 #include <QtScript/qscriptvalueiterator.h>
 #include <QtCore/qfile.h>
+#include <QtCore/qdatetime.h>
 #include <QtNetwork/qnetworkaccessmanager.h>
 #include <QtDeclarative/qdeclarativeinfo.h>
 #include "qdeclarativenetworkaccessmanagerfactory.h"
@@ -314,6 +315,12 @@ QVariant QDeclarativeWorkerScriptEnginePrivate::scriptValueToVariant(const QScri
         return QVariant(value.toString());
     } else if (value.isNumber()) {
         return QVariant((qreal)value.toNumber());
+    } else if (value.isDate()) {
+        return QVariant(value.toDateTime());
+#ifndef QT_NO_REGEXP
+    } else if (value.isRegExp()) {
+        return QVariant(value.toRegExp());
+#endif
     } else if (value.isArray()) {
         QVariantList list;
 
@@ -364,6 +371,12 @@ QScriptValue QDeclarativeWorkerScriptEnginePrivate::variantToScriptValue(const Q
         return QScriptValue(value.toString());
     } else if (value.userType() == QMetaType::QReal) {
         return QScriptValue(value.toReal());
+    } else if (value.userType() == QVariant::DateTime) {
+        return engine->newDate(value.toDateTime());
+#ifndef QT_NO_REGEXP
+    } else if (value.userType() == QVariant::RegExp) {
+        return engine->newRegExp(value.toRegExp());
+#endif
     } else if (value.userType() == qMetaTypeId<QDeclarativeListModelWorkerAgent::VariantRef>()) {
         QDeclarativeListModelWorkerAgent::VariantRef vr = qvariant_cast<QDeclarativeListModelWorkerAgent::VariantRef>(value);
         if (vr.a->scriptEngine() == 0)
diff --git a/tests/auto/declarative/qdeclarativeworkerscript/tst_qdeclarativeworkerscript.cpp b/tests/auto/declarative/qdeclarativeworkerscript/tst_qdeclarativeworkerscript.cpp
index 3140265..5a6cf3c 100644
--- a/tests/auto/declarative/qdeclarativeworkerscript/tst_qdeclarativeworkerscript.cpp
+++ b/tests/auto/declarative/qdeclarativeworkerscript/tst_qdeclarativeworkerscript.cpp
@@ -137,6 +137,11 @@ void tst_QDeclarativeWorkerScript::messaging_data()
     QTest::newRow("real") << qVariantFromValue(10334.375);
     QTest::newRow("string") << qVariantFromValue(QString("More cheeeese, Gromit!"));
     QTest::newRow("variant list") << qVariantFromValue((QVariantList() << "a" << "b" << "c"));
+    QTest::newRow("date time") << qVariantFromValue(QDateTime::currentDateTime());
+#ifndef QT_NO_REGEXP
+    // QtScript's QScriptValue -> QRegExp uses RegExp2 pattern syntax
+    QTest::newRow("regexp") << qVariantFromValue(QRegExp("^\\d\\d?$", Qt::CaseInsensitive, QRegExp::RegExp2));
+#endif
 }
 
 void tst_QDeclarativeWorkerScript::messaging_sendQObjectList()
-- 
cgit v0.12


From 810e21d9e404aa2fcb602cb68bfd892387b234e7 Mon Sep 17 00:00:00 2001
From: Martin Jones <martin.jones@nokia.com>
Date: Wed, 24 Nov 2010 14:28:18 +1000
Subject: Flickable and MouseArea were too eager to take/keep mouse grab.

This meant that they would sometimes act upon a drag immediately,
rather than waiting for a nested area to take the grab.  This resulted
in a short jump before future events were handled by the nested item.

Task-number: QTBUG-15568
Reviewed-by: Bea Lam
---
 .../graphicsitems/qdeclarativeflickable.cpp        |   16 +-
 .../graphicsitems/qdeclarativemousearea.cpp        |   37 +-
 .../tst_qdeclarativemousearea.cpp                  |    7 +
 .../qdeclarativemousearea/data/nested.0.png        |  Bin 0 -> 1360 bytes
 .../qdeclarativemousearea/data/nested.1.png        |  Bin 0 -> 1367 bytes
 .../qdeclarativemousearea/data/nested.2.png        |  Bin 0 -> 1367 bytes
 .../qdeclarativemousearea/data/nested.3.png        |  Bin 0 -> 1372 bytes
 .../qdeclarativemousearea/data/nested.4.png        |  Bin 0 -> 1382 bytes
 .../qdeclarativemousearea/data/nested.5.png        |  Bin 0 -> 1379 bytes
 .../qdeclarativemousearea/data/nested.6.png        |  Bin 0 -> 1390 bytes
 .../qdeclarativemousearea/data/nested.7.png        |  Bin 0 -> 1379 bytes
 .../qdeclarativemousearea/data/nested.8.png        |  Bin 0 -> 1380 bytes
 .../qdeclarativemousearea/data/nested.9.png        |  Bin 0 -> 1379 bytes
 .../qdeclarativemousearea/data/nested.qml          | 5039 ++++++++++++++++++++
 .../qmlvisual/qdeclarativemousearea/nested.qml     |   62 +
 15 files changed, 5142 insertions(+), 19 deletions(-)
 create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/nested.0.png
 create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/nested.1.png
 create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/nested.2.png
 create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/nested.3.png
 create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/nested.4.png
 create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/nested.5.png
 create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/nested.6.png
 create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/nested.7.png
 create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/nested.8.png
 create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/nested.9.png
 create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/nested.qml
 create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativemousearea/nested.qml

diff --git a/src/declarative/graphicsitems/qdeclarativeflickable.cpp b/src/declarative/graphicsitems/qdeclarativeflickable.cpp
index 1870647..377f3b5 100644
--- a/src/declarative/graphicsitems/qdeclarativeflickable.cpp
+++ b/src/declarative/graphicsitems/qdeclarativeflickable.cpp
@@ -281,7 +281,6 @@ void QDeclarativeFlickablePrivate::fixupY()
 
 void QDeclarativeFlickablePrivate::fixup(AxisData &data, qreal minExtent, qreal maxExtent)
 {
-    Q_Q(QDeclarativeFlickable);
     if (data.move.value() > minExtent || maxExtent > minExtent) {
         timeline.reset(data.move);
         if (data.move.value() != minExtent) {
@@ -290,8 +289,7 @@ void QDeclarativeFlickablePrivate::fixup(AxisData &data, qreal minExtent, qreal
                 timeline.move(data.move, minExtent - dist/2, QEasingCurve(QEasingCurve::InQuad), fixupDuration/4);
                 timeline.move(data.move, minExtent, QEasingCurve(QEasingCurve::OutExpo), 3*fixupDuration/4);
             } else {
-                data.move.setValue(minExtent);
-                q->viewportMoved();
+                timeline.set(data.move, minExtent);
             }
         }
     } else if (data.move.value() < maxExtent) {
@@ -301,8 +299,7 @@ void QDeclarativeFlickablePrivate::fixup(AxisData &data, qreal minExtent, qreal
             timeline.move(data.move, maxExtent - dist/2, QEasingCurve(QEasingCurve::InQuad), fixupDuration/4);
             timeline.move(data.move, maxExtent, QEasingCurve(QEasingCurve::OutExpo), 3*fixupDuration/4);
         } else {
-            data.move.setValue(maxExtent);
-            q->viewportMoved();
+            timeline.set(data.move, minExtent);
         }
     }
     vTime = timeline.time();
@@ -703,6 +700,9 @@ void QDeclarativeFlickablePrivate::handleMouseMoveEvent(QGraphicsSceneMouseEvent
     bool rejectY = false;
     bool rejectX = false;
 
+    bool stealY = false;
+    bool stealX = false;
+
     if (q->yflick()) {
         int dy = int(event->pos().y() - pressPos.y());
         if (qAbs(dy) > QApplication::startDragDistance() || QDeclarativeItemPrivate::elapsed(pressTime) > 200) {
@@ -731,7 +731,7 @@ void QDeclarativeFlickablePrivate::handleMouseMoveEvent(QGraphicsSceneMouseEvent
                 vMoved = true;
             }
             if (qAbs(dy) > QApplication::startDragDistance())
-                stealMouse = true;
+                stealY = true;
         }
     }
 
@@ -764,10 +764,12 @@ void QDeclarativeFlickablePrivate::handleMouseMoveEvent(QGraphicsSceneMouseEvent
             }
 
             if (qAbs(dx) > QApplication::startDragDistance())
-                stealMouse = true;
+                stealX = true;
         }
     }
 
+    stealMouse = stealX || stealY;
+
     if (!lastPos.isNull()) {
         qreal elapsed = qreal(QDeclarativeItemPrivate::restart(lastPosTime)) / 1000.;
         if (elapsed <= 0)
diff --git a/src/declarative/graphicsitems/qdeclarativemousearea.cpp b/src/declarative/graphicsitems/qdeclarativemousearea.cpp
index d9edd11..0a043a7 100644
--- a/src/declarative/graphicsitems/qdeclarativemousearea.cpp
+++ b/src/declarative/graphicsitems/qdeclarativemousearea.cpp
@@ -500,17 +500,9 @@ void QDeclarativeMouseArea::mouseMoveEvent(QGraphicsSceneMouseEvent *event)
         const int dragThreshold = QApplication::startDragDistance();
         qreal dx = qAbs(curLocalPos.x() - startLocalPos.x());
         qreal dy = qAbs(curLocalPos.y() - startLocalPos.y());
-        if ((d->dragX && !(dx < dragThreshold)) || (d->dragY && !(dy < dragThreshold))) {
+
+        if (keepMouseGrab() && d->stealMouse)
             d->drag->setActive(true);
-            d->stealMouse = true;
-        }
-        if (!keepMouseGrab()) {
-            if ((!d->dragY && dy < dragThreshold && d->dragX && dx > dragThreshold)
-                || (!d->dragX && dx < dragThreshold && d->dragY && dy > dragThreshold)
-                || (d->dragX && d->dragY)) {
-                setKeepMouseGrab(true);
-            }
-        }
 
         if (d->dragX && d->drag->active()) {
             qreal x = (curLocalPos.x() - startLocalPos.x()) + d->startX;
@@ -528,6 +520,16 @@ void QDeclarativeMouseArea::mouseMoveEvent(QGraphicsSceneMouseEvent *event)
                 y = drag()->ymax();
             drag()->target()->setY(y);
         }
+
+        if (!keepMouseGrab()) {
+            if ((!d->dragY && dy < dragThreshold && d->dragX && dx > dragThreshold)
+                || (!d->dragX && dx < dragThreshold && d->dragY && dy > dragThreshold)
+                || (d->dragX && d->dragY && (dx > dragThreshold || dy > dragThreshold))) {
+                setKeepMouseGrab(true);
+                d->stealMouse = true;
+            }
+        }
+
         d->moved = true;
     }
     QDeclarativeMouseEvent me(d->lastPos.x(), d->lastPos.y(), d->lastButton, d->lastButtons, d->lastModifiers, false, d->longPress);
@@ -618,6 +620,7 @@ bool QDeclarativeMouseArea::sceneEvent(QEvent *event)
             // if our mouse grab has been removed (probably by Flickable), fix our
             // state
             d->pressed = false;
+            d->stealMouse = false;
             setKeepMouseGrab(false);
             emit canceled();
             emit pressedChanged();
@@ -672,8 +675,18 @@ bool QDeclarativeMouseArea::sendMouseEvent(QGraphicsSceneMouseEvent *event)
         return stealThisEvent;
     }
     if (mouseEvent.type() == QEvent::GraphicsSceneMouseRelease) {
-        d->stealMouse = false;
-        ungrabMouse();
+        if (d->pressed) {
+            d->pressed = false;
+            d->stealMouse = false;
+            if (s && s->mouseGrabberItem() == this)
+                ungrabMouse();
+            emit canceled();
+            emit pressedChanged();
+            if (d->hovered) {
+                d->hovered = false;
+                emit hoveredChanged();
+            }
+        }
     }
     return false;
 }
diff --git a/tests/auto/declarative/qdeclarativemousearea/tst_qdeclarativemousearea.cpp b/tests/auto/declarative/qdeclarativemousearea/tst_qdeclarativemousearea.cpp
index 57a58e9..9d7cc05 100644
--- a/tests/auto/declarative/qdeclarativemousearea/tst_qdeclarativemousearea.cpp
+++ b/tests/auto/declarative/qdeclarativemousearea/tst_qdeclarativemousearea.cpp
@@ -216,7 +216,14 @@ void tst_QDeclarativeMouseArea::dragging()
     QCOMPARE(blackRect->x(), 50.0);
     QCOMPARE(blackRect->y(), 50.0);
 
+    // First move event triggers drag, second is acted upon.
+    // This is due to possibility of higher stacked area taking precedence.
     QGraphicsSceneMouseEvent moveEvent(QEvent::GraphicsSceneMouseMove);
+    moveEvent.setScenePos(QPointF(106, 106));
+    moveEvent.setButton(Qt::LeftButton);
+    moveEvent.setButtons(Qt::LeftButton);
+    QApplication::sendEvent(scene, &moveEvent);
+
     moveEvent.setScenePos(QPointF(110, 110));
     moveEvent.setButton(Qt::LeftButton);
     moveEvent.setButtons(Qt::LeftButton);
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/nested.0.png b/tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/nested.0.png
new file mode 100644
index 0000000..793fb0f
Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/nested.0.png differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/nested.1.png b/tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/nested.1.png
new file mode 100644
index 0000000..5935b45
Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/nested.1.png differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/nested.2.png b/tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/nested.2.png
new file mode 100644
index 0000000..a205266
Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/nested.2.png differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/nested.3.png b/tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/nested.3.png
new file mode 100644
index 0000000..3d81ff2
Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/nested.3.png differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/nested.4.png b/tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/nested.4.png
new file mode 100644
index 0000000..ee2076e
Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/nested.4.png differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/nested.5.png b/tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/nested.5.png
new file mode 100644
index 0000000..9017124
Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/nested.5.png differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/nested.6.png b/tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/nested.6.png
new file mode 100644
index 0000000..216dd7e
Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/nested.6.png differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/nested.7.png b/tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/nested.7.png
new file mode 100644
index 0000000..27e8480
Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/nested.7.png differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/nested.8.png b/tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/nested.8.png
new file mode 100644
index 0000000..6b911c5
Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/nested.8.png differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/nested.9.png b/tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/nested.9.png
new file mode 100644
index 0000000..01858a5
Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/nested.9.png differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/nested.qml b/tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/nested.qml
new file mode 100644
index 0000000..cec1558
--- /dev/null
+++ b/tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/nested.qml
@@ -0,0 +1,5039 @@
+import Qt.VisualTest 4.7
+
+VisualTest {
+    Frame {
+        msec: 0
+    }
+    Frame {
+        msec: 16
+        image: "nested.0.png"
+    }
+    Frame {
+        msec: 32
+        hash: "2400cadaaa467cbfb0c7d2ace8137179"
+    }
+    Frame {
+        msec: 48
+        hash: "2400cadaaa467cbfb0c7d2ace8137179"
+    }
+    Frame {
+        msec: 64
+        hash: "2400cadaaa467cbfb0c7d2ace8137179"
+    }
+    Frame {
+        msec: 80
+        hash: "2400cadaaa467cbfb0c7d2ace8137179"
+    }
+    Frame {
+        msec: 96
+        hash: "2400cadaaa467cbfb0c7d2ace8137179"
+    }
+    Frame {
+        msec: 112
+        hash: "2400cadaaa467cbfb0c7d2ace8137179"
+    }
+    Frame {
+        msec: 128
+        hash: "2400cadaaa467cbfb0c7d2ace8137179"
+    }
+    Frame {
+        msec: 144
+        hash: "2400cadaaa467cbfb0c7d2ace8137179"
+    }
+    Frame {
+        msec: 160
+        hash: "2400cadaaa467cbfb0c7d2ace8137179"
+    }
+    Frame {
+        msec: 176
+        hash: "2400cadaaa467cbfb0c7d2ace8137179"
+    }
+    Frame {
+        msec: 192
+        hash: "2400cadaaa467cbfb0c7d2ace8137179"
+    }
+    Frame {
+        msec: 208
+        hash: "2400cadaaa467cbfb0c7d2ace8137179"
+    }
+    Frame {
+        msec: 224
+        hash: "2400cadaaa467cbfb0c7d2ace8137179"
+    }
+    Frame {
+        msec: 240
+        hash: "2400cadaaa467cbfb0c7d2ace8137179"
+    }
+    Frame {
+        msec: 256
+        hash: "2400cadaaa467cbfb0c7d2ace8137179"
+    }
+    Frame {
+        msec: 272
+        hash: "2400cadaaa467cbfb0c7d2ace8137179"
+    }
+    Frame {
+        msec: 288
+        hash: "2400cadaaa467cbfb0c7d2ace8137179"
+    }
+    Frame {
+        msec: 304
+        hash: "2400cadaaa467cbfb0c7d2ace8137179"
+    }
+    Frame {
+        msec: 320
+        hash: "2400cadaaa467cbfb0c7d2ace8137179"
+    }
+    Frame {
+        msec: 336
+        hash: "2400cadaaa467cbfb0c7d2ace8137179"
+    }
+    Frame {
+        msec: 352
+        hash: "2400cadaaa467cbfb0c7d2ace8137179"
+    }
+    Frame {
+        msec: 368
+        hash: "2400cadaaa467cbfb0c7d2ace8137179"
+    }
+    Frame {
+        msec: 384
+        hash: "2400cadaaa467cbfb0c7d2ace8137179"
+    }
+    Frame {
+        msec: 400
+        hash: "2400cadaaa467cbfb0c7d2ace8137179"
+    }
+    Frame {
+        msec: 416
+        hash: "2400cadaaa467cbfb0c7d2ace8137179"
+    }
+    Frame {
+        msec: 432
+        hash: "2400cadaaa467cbfb0c7d2ace8137179"
+    }
+    Frame {
+        msec: 448
+        hash: "2400cadaaa467cbfb0c7d2ace8137179"
+    }
+    Frame {
+        msec: 464
+        hash: "2400cadaaa467cbfb0c7d2ace8137179"
+    }
+    Frame {
+        msec: 480
+        hash: "2400cadaaa467cbfb0c7d2ace8137179"
+    }
+    Frame {
+        msec: 496
+        hash: "2400cadaaa467cbfb0c7d2ace8137179"
+    }
+    Frame {
+        msec: 512
+        hash: "2400cadaaa467cbfb0c7d2ace8137179"
+    }
+    Frame {
+        msec: 528
+        hash: "2400cadaaa467cbfb0c7d2ace8137179"
+    }
+    Frame {
+        msec: 544
+        hash: "2400cadaaa467cbfb0c7d2ace8137179"
+    }
+    Frame {
+        msec: 560
+        hash: "2400cadaaa467cbfb0c7d2ace8137179"
+    }
+    Frame {
+        msec: 576
+        hash: "2400cadaaa467cbfb0c7d2ace8137179"
+    }
+    Frame {
+        msec: 592
+        hash: "2400cadaaa467cbfb0c7d2ace8137179"
+    }
+    Frame {
+        msec: 608
+        hash: "2400cadaaa467cbfb0c7d2ace8137179"
+    }
+    Frame {
+        msec: 624
+        hash: "2400cadaaa467cbfb0c7d2ace8137179"
+    }
+    Frame {
+        msec: 640
+        hash: "2400cadaaa467cbfb0c7d2ace8137179"
+    }
+    Frame {
+        msec: 656
+        hash: "2400cadaaa467cbfb0c7d2ace8137179"
+    }
+    Frame {
+        msec: 672
+        hash: "2400cadaaa467cbfb0c7d2ace8137179"
+    }
+    Frame {
+        msec: 688
+        hash: "2400cadaaa467cbfb0c7d2ace8137179"
+    }
+    Frame {
+        msec: 704
+        hash: "2400cadaaa467cbfb0c7d2ace8137179"
+    }
+    Frame {
+        msec: 720
+        hash: "2400cadaaa467cbfb0c7d2ace8137179"
+    }
+    Frame {
+        msec: 736
+        hash: "2400cadaaa467cbfb0c7d2ace8137179"
+    }
+    Frame {
+        msec: 752
+        hash: "2400cadaaa467cbfb0c7d2ace8137179"
+    }
+    Frame {
+        msec: 768
+        hash: "2400cadaaa467cbfb0c7d2ace8137179"
+    }
+    Frame {
+        msec: 784
+        hash: "2400cadaaa467cbfb0c7d2ace8137179"
+    }
+    Frame {
+        msec: 800
+        hash: "2400cadaaa467cbfb0c7d2ace8137179"
+    }
+    Frame {
+        msec: 816
+        hash: "2400cadaaa467cbfb0c7d2ace8137179"
+    }
+    Frame {
+        msec: 832
+        hash: "2400cadaaa467cbfb0c7d2ace8137179"
+    }
+    Frame {
+        msec: 848
+        hash: "2400cadaaa467cbfb0c7d2ace8137179"
+    }
+    Frame {
+        msec: 864
+        hash: "2400cadaaa467cbfb0c7d2ace8137179"
+    }
+    Mouse {
+        type: 2
+        button: 1
+        buttons: 1
+        x: 25; y: 62
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 880
+        hash: "2400cadaaa467cbfb0c7d2ace8137179"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 26; y: 62
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 896
+        hash: "2400cadaaa467cbfb0c7d2ace8137179"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 27; y: 62
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 912
+        hash: "2400cadaaa467cbfb0c7d2ace8137179"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 28; y: 62
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 29; y: 62
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 928
+        hash: "2400cadaaa467cbfb0c7d2ace8137179"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 30; y: 62
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 33; y: 63
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 944
+        hash: "f5aa6257fd80c1e383bc2db84e41c354"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 35; y: 63
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 40; y: 63
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 960
+        hash: "e96076794d3efc62a8fe2d2e543e97c7"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 42; y: 63
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 48; y: 63
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 976
+        image: "nested.1.png"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 51; y: 63
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 58; y: 63
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 992
+        hash: "ab955f6c6b210b66b27e244dc2150860"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 66; y: 64
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 70; y: 64
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 1008
+        hash: "b655247e73b0b8357dc9d355ba6f49a0"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 79; y: 64
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 83; y: 64
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 1024
+        hash: "08b67b7e28990cac8c9bd354b7d87698"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 91; y: 64
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 95; y: 64
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 1040
+        hash: "69cecfb41899e13c0bc5acb6f9bc666d"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 104; y: 64
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 107; y: 64
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 1056
+        hash: "8d1f0cd85fd3f2654f7c30a6d9ec2b99"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 115; y: 64
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 122; y: 64
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 1072
+        hash: "f8ddda87cfcf5dc9d8c6e940fbd295f3"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 126; y: 64
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 133; y: 64
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 1088
+        hash: "ab9d942c47a2cca5531f7b67df034161"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 136; y: 64
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 143; y: 64
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 1104
+        hash: "7ca5a03fdfac44c389315c3928631a2a"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 146; y: 64
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 151; y: 64
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 1120
+        hash: "ade955ed9d85fbbe72cf18bbc541c8bf"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 153; y: 64
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 158; y: 64
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 1136
+        hash: "6ad4afa3e3fcb578946fccbf4896761c"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 162; y: 64
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 163; y: 64
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 1152
+        hash: "3ebe78e37c1c66d0b8fc86c8191e39de"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 165; y: 64
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 166; y: 64
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 1168
+        hash: "6450917cc89a553cf509265eaf318efb"
+    }
+    Frame {
+        msec: 1184
+        hash: "6450917cc89a553cf509265eaf318efb"
+    }
+    Frame {
+        msec: 1200
+        hash: "6450917cc89a553cf509265eaf318efb"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 166; y: 63
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 1216
+        hash: "6450917cc89a553cf509265eaf318efb"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 164; y: 63
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 161; y: 63
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 1232
+        hash: "adfe54d5d28f7caf9ace117fd3573444"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 159; y: 63
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 156; y: 63
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 1248
+        hash: "f4963636cc4fbd8bfe6baf10540ed7e7"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 154; y: 63
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 149; y: 63
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 1264
+        hash: "1c2d2edb9214cc3857aa221330ee28ba"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 143; y: 63
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 139; y: 63
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 1280
+        hash: "750226c90e6c6cd0b3bdd3c3dc8da18f"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 131; y: 63
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 126; y: 63
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 1296
+        hash: "b6b5d177ab531460dc125afa82489a1d"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 115; y: 63
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 111; y: 63
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 1312
+        hash: "62d411a7b6c404393e4bfafab9c638a3"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 100; y: 63
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 91; y: 63
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 1328
+        hash: "e355997b3decd4deb686fece59c33c7c"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 86; y: 63
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 76; y: 63
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 1344
+        hash: "2ab73c8aac6a0e321686e97c9bb28f28"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 71; y: 63
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 61; y: 63
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 1360
+        hash: "55a887f9f45f71beb6b723191eb60a2f"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 56; y: 63
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 50; y: 63
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 1376
+        hash: "b2d49e34362994739d14fb8231ff82d6"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 47; y: 63
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 43; y: 64
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 1392
+        hash: "3964796876870035794b41501991b527"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 41; y: 64
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 40; y: 64
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 1408
+        hash: "e96076794d3efc62a8fe2d2e543e97c7"
+    }
+    Frame {
+        msec: 1424
+        hash: "e96076794d3efc62a8fe2d2e543e97c7"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 41; y: 64
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 1440
+        hash: "7e524b3c43a987503ef102bdb9f11701"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 42; y: 64
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 1456
+        hash: "2a7c13e97c21e298541bb5ab8169ff13"
+    }
+    Frame {
+        msec: 1472
+        hash: "2a7c13e97c21e298541bb5ab8169ff13"
+    }
+    Frame {
+        msec: 1488
+        hash: "2a7c13e97c21e298541bb5ab8169ff13"
+    }
+    Frame {
+        msec: 1504
+        hash: "2a7c13e97c21e298541bb5ab8169ff13"
+    }
+    Frame {
+        msec: 1520
+        hash: "2a7c13e97c21e298541bb5ab8169ff13"
+    }
+    Frame {
+        msec: 1536
+        hash: "2a7c13e97c21e298541bb5ab8169ff13"
+    }
+    Frame {
+        msec: 1552
+        hash: "2a7c13e97c21e298541bb5ab8169ff13"
+    }
+    Mouse {
+        type: 3
+        button: 1
+        buttons: 0
+        x: 42; y: 64
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 1568
+        hash: "2a7c13e97c21e298541bb5ab8169ff13"
+    }
+    Frame {
+        msec: 1584
+        hash: "2a7c13e97c21e298541bb5ab8169ff13"
+    }
+    Frame {
+        msec: 1600
+        hash: "2a7c13e97c21e298541bb5ab8169ff13"
+    }
+    Frame {
+        msec: 1616
+        hash: "2a7c13e97c21e298541bb5ab8169ff13"
+    }
+    Frame {
+        msec: 1632
+        hash: "2a7c13e97c21e298541bb5ab8169ff13"
+    }
+    Frame {
+        msec: 1648
+        hash: "2a7c13e97c21e298541bb5ab8169ff13"
+    }
+    Frame {
+        msec: 1664
+        hash: "2a7c13e97c21e298541bb5ab8169ff13"
+    }
+    Frame {
+        msec: 1680
+        hash: "2a7c13e97c21e298541bb5ab8169ff13"
+    }
+    Frame {
+        msec: 1696
+        hash: "2a7c13e97c21e298541bb5ab8169ff13"
+    }
+    Frame {
+        msec: 1712
+        hash: "2a7c13e97c21e298541bb5ab8169ff13"
+    }
+    Frame {
+        msec: 1728
+        hash: "2a7c13e97c21e298541bb5ab8169ff13"
+    }
+    Frame {
+        msec: 1744
+        hash: "2a7c13e97c21e298541bb5ab8169ff13"
+    }
+    Frame {
+        msec: 1760
+        hash: "2a7c13e97c21e298541bb5ab8169ff13"
+    }
+    Frame {
+        msec: 1776
+        hash: "2a7c13e97c21e298541bb5ab8169ff13"
+    }
+    Frame {
+        msec: 1792
+        hash: "2a7c13e97c21e298541bb5ab8169ff13"
+    }
+    Frame {
+        msec: 1808
+        hash: "2a7c13e97c21e298541bb5ab8169ff13"
+    }
+    Frame {
+        msec: 1824
+        hash: "2a7c13e97c21e298541bb5ab8169ff13"
+    }
+    Frame {
+        msec: 1840
+        hash: "2a7c13e97c21e298541bb5ab8169ff13"
+    }
+    Frame {
+        msec: 1856
+        hash: "2a7c13e97c21e298541bb5ab8169ff13"
+    }
+    Frame {
+        msec: 1872
+        hash: "2a7c13e97c21e298541bb5ab8169ff13"
+    }
+    Frame {
+        msec: 1888
+        hash: "2a7c13e97c21e298541bb5ab8169ff13"
+    }
+    Frame {
+        msec: 1904
+        hash: "2a7c13e97c21e298541bb5ab8169ff13"
+    }
+    Frame {
+        msec: 1920
+        hash: "2a7c13e97c21e298541bb5ab8169ff13"
+    }
+    Frame {
+        msec: 1936
+        image: "nested.2.png"
+    }
+    Frame {
+        msec: 1952
+        hash: "2a7c13e97c21e298541bb5ab8169ff13"
+    }
+    Mouse {
+        type: 2
+        button: 1
+        buttons: 1
+        x: 38; y: 56
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 1968
+        hash: "2a7c13e97c21e298541bb5ab8169ff13"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 39; y: 57
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 1984
+        hash: "2a7c13e97c21e298541bb5ab8169ff13"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 39; y: 59
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 39; y: 60
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 2000
+        hash: "2a7c13e97c21e298541bb5ab8169ff13"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 40; y: 63
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 40; y: 65
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 2016
+        hash: "9178754b825d60b2174ed9431ea80586"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 41; y: 68
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 41; y: 70
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 45; y: 79
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 2032
+        hash: "89eff8fa9f8710d7cbc50b8d4b751148"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 47; y: 84
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 48; y: 86
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 2048
+        hash: "cdae8b46ecfc2b0c90264c120156cc46"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 50; y: 91
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 51; y: 93
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 2064
+        hash: "cf35919630eab647a28eb91d8a441704"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 53; y: 99
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 53; y: 102
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 2080
+        hash: "283256d50da8c855c50d5f8813d37afd"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 54; y: 107
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 54; y: 109
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 2096
+        hash: "2560cd67d507bc24c1000187f645531c"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 54; y: 113
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 54; y: 117
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 2112
+        hash: "6f6f7c299c4516c5231f5bfcd39b6db3"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 54; y: 119
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 54; y: 122
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 2128
+        hash: "e7989524238996cf59f420f4edf8f982"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 54; y: 124
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 54; y: 126
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 2144
+        hash: "34d8d456848807e854bcb25ffbde37d4"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 54; y: 127
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 54; y: 130
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 2160
+        hash: "433bd3983804b07484d38af2723f519e"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 53; y: 132
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 53; y: 134
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 2176
+        hash: "510e534a8a7b88041f7544e7e4992b8f"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 53; y: 137
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 52; y: 139
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 2192
+        hash: "25f43c457a5bf2b70a66ce91685ad4dc"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 51; y: 141
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 51; y: 142
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 2208
+        hash: "4119ab90627359420e25220618b76a69"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 51; y: 145
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 50; y: 146
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 2224
+        hash: "8a3cc888e96cf3e26e369723b442baf1"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 49; y: 147
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 49; y: 150
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 2240
+        hash: "980552e8ff9d87ccb40127b06b0f846f"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 48; y: 151
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 48; y: 153
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 2256
+        hash: "9ee23fc7cbca4467f984073d2af7cdf6"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 48; y: 154
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 48; y: 155
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 2272
+        hash: "032d65792ac867c9b9acef05bd993c54"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 48; y: 156
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 2288
+        hash: "be2f8d5a64034e75e23527c486e33029"
+    }
+    Frame {
+        msec: 2304
+        hash: "be2f8d5a64034e75e23527c486e33029"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 49; y: 155
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 2320
+        hash: "3f65505e4d1f8534c9123b3dea15d43e"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 49; y: 154
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 49; y: 152
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 2336
+        hash: "e8b1799cf1926cb3b6cbf3adee80cffe"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 49; y: 149
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 49; y: 147
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 2352
+        hash: "31155b14cc0d3d47bbef4e199fdfcb46"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 51; y: 140
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 52; y: 132
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 2368
+        hash: "b89745a9a60a7ebeb1de0a7f96ad2ac3"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 53; y: 128
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 57; y: 118
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 2384
+        hash: "7e99fa1eba369d45f10778fe02356f09"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 59; y: 114
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 64; y: 103
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 2400
+        hash: "cd123f6b332f38f43abbf01469a41301"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 67; y: 98
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 71; y: 90
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 2416
+        hash: "353c0602dd2b670e19988117172855fc"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 76; y: 81
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 78; y: 78
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 2432
+        hash: "20df9d19fd2113fa8f8023d5b4328dc5"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 81; y: 70
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 82; y: 67
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 2448
+        hash: "10b34a758d5b3790dd36c9d95c47b157"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 84; y: 62
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 85; y: 60
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 2464
+        hash: "98a483e1eaa9145fd277fd85a9b0cf03"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 87; y: 57
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 88; y: 55
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 2480
+        hash: "e92edd52ff1ee78456fa1947a46e6570"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 89; y: 53
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 91; y: 52
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 2496
+        hash: "877384496d967f5f0ab1c817a2b316d6"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 92; y: 51
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 93; y: 51
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 2512
+        hash: "15673570ffe9a391f9214601ac9dc86c"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 94; y: 50
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 95; y: 50
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 2528
+        hash: "4b7f0094b19a4495bf913d2994889497"
+    }
+    Frame {
+        msec: 2544
+        hash: "4b7f0094b19a4495bf913d2994889497"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 95; y: 49
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 2560
+        hash: "4b7f0094b19a4495bf913d2994889497"
+    }
+    Frame {
+        msec: 2576
+        hash: "4b7f0094b19a4495bf913d2994889497"
+    }
+    Frame {
+        msec: 2592
+        hash: "4b7f0094b19a4495bf913d2994889497"
+    }
+    Frame {
+        msec: 2608
+        hash: "4b7f0094b19a4495bf913d2994889497"
+    }
+    Frame {
+        msec: 2624
+        hash: "4b7f0094b19a4495bf913d2994889497"
+    }
+    Frame {
+        msec: 2640
+        hash: "4b7f0094b19a4495bf913d2994889497"
+    }
+    Mouse {
+        type: 3
+        button: 1
+        buttons: 0
+        x: 95; y: 49
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 2656
+        hash: "2994e98b8ea9a6883a7324e7e848345c"
+    }
+    Frame {
+        msec: 2672
+        hash: "2994e98b8ea9a6883a7324e7e848345c"
+    }
+    Frame {
+        msec: 2688
+        hash: "2994e98b8ea9a6883a7324e7e848345c"
+    }
+    Frame {
+        msec: 2704
+        hash: "2994e98b8ea9a6883a7324e7e848345c"
+    }
+    Frame {
+        msec: 2720
+        hash: "2994e98b8ea9a6883a7324e7e848345c"
+    }
+    Frame {
+        msec: 2736
+        hash: "2994e98b8ea9a6883a7324e7e848345c"
+    }
+    Frame {
+        msec: 2752
+        hash: "2994e98b8ea9a6883a7324e7e848345c"
+    }
+    Frame {
+        msec: 2768
+        hash: "2994e98b8ea9a6883a7324e7e848345c"
+    }
+    Frame {
+        msec: 2784
+        hash: "2994e98b8ea9a6883a7324e7e848345c"
+    }
+    Frame {
+        msec: 2800
+        hash: "2994e98b8ea9a6883a7324e7e848345c"
+    }
+    Frame {
+        msec: 2816
+        hash: "2994e98b8ea9a6883a7324e7e848345c"
+    }
+    Frame {
+        msec: 2832
+        hash: "2994e98b8ea9a6883a7324e7e848345c"
+    }
+    Frame {
+        msec: 2848
+        hash: "2994e98b8ea9a6883a7324e7e848345c"
+    }
+    Frame {
+        msec: 2864
+        hash: "2994e98b8ea9a6883a7324e7e848345c"
+    }
+    Frame {
+        msec: 2880
+        hash: "2994e98b8ea9a6883a7324e7e848345c"
+    }
+    Frame {
+        msec: 2896
+        image: "nested.3.png"
+    }
+    Frame {
+        msec: 2912
+        hash: "2994e98b8ea9a6883a7324e7e848345c"
+    }
+    Frame {
+        msec: 2928
+        hash: "2994e98b8ea9a6883a7324e7e848345c"
+    }
+    Frame {
+        msec: 2944
+        hash: "2994e98b8ea9a6883a7324e7e848345c"
+    }
+    Frame {
+        msec: 2960
+        hash: "2994e98b8ea9a6883a7324e7e848345c"
+    }
+    Frame {
+        msec: 2976
+        hash: "2994e98b8ea9a6883a7324e7e848345c"
+    }
+    Frame {
+        msec: 2992
+        hash: "2994e98b8ea9a6883a7324e7e848345c"
+    }
+    Frame {
+        msec: 3008
+        hash: "2994e98b8ea9a6883a7324e7e848345c"
+    }
+    Frame {
+        msec: 3024
+        hash: "2994e98b8ea9a6883a7324e7e848345c"
+    }
+    Frame {
+        msec: 3040
+        hash: "2994e98b8ea9a6883a7324e7e848345c"
+    }
+    Frame {
+        msec: 3056
+        hash: "2994e98b8ea9a6883a7324e7e848345c"
+    }
+    Frame {
+        msec: 3072
+        hash: "2994e98b8ea9a6883a7324e7e848345c"
+    }
+    Frame {
+        msec: 3088
+        hash: "2994e98b8ea9a6883a7324e7e848345c"
+    }
+    Frame {
+        msec: 3104
+        hash: "2994e98b8ea9a6883a7324e7e848345c"
+    }
+    Frame {
+        msec: 3120
+        hash: "2994e98b8ea9a6883a7324e7e848345c"
+    }
+    Frame {
+        msec: 3136
+        hash: "2994e98b8ea9a6883a7324e7e848345c"
+    }
+    Frame {
+        msec: 3152
+        hash: "2994e98b8ea9a6883a7324e7e848345c"
+    }
+    Frame {
+        msec: 3168
+        hash: "2994e98b8ea9a6883a7324e7e848345c"
+    }
+    Frame {
+        msec: 3184
+        hash: "2994e98b8ea9a6883a7324e7e848345c"
+    }
+    Frame {
+        msec: 3200
+        hash: "2994e98b8ea9a6883a7324e7e848345c"
+    }
+    Frame {
+        msec: 3216
+        hash: "2994e98b8ea9a6883a7324e7e848345c"
+    }
+    Frame {
+        msec: 3232
+        hash: "2994e98b8ea9a6883a7324e7e848345c"
+    }
+    Mouse {
+        type: 2
+        button: 1
+        buttons: 1
+        x: 156; y: 74
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 3248
+        hash: "2994e98b8ea9a6883a7324e7e848345c"
+    }
+    Frame {
+        msec: 3264
+        hash: "2994e98b8ea9a6883a7324e7e848345c"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 156; y: 73
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 157; y: 73
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 3280
+        hash: "2994e98b8ea9a6883a7324e7e848345c"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 158; y: 73
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 160; y: 73
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 3296
+        hash: "2994e98b8ea9a6883a7324e7e848345c"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 161; y: 73
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 163; y: 73
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 3312
+        hash: "df6cf21e99177a436e356f818996070c"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 166; y: 73
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 171; y: 74
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 3328
+        hash: "86f5e3fee147f47edd4a6d042aff0301"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 178; y: 75
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 181; y: 75
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 3344
+        hash: "589c1418a9179c868d904b1a5169a11b"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 189; y: 75
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 193; y: 75
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 3360
+        hash: "3141ad77d193e145b749759070e1e6ef"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 200; y: 75
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 204; y: 75
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 3376
+        hash: "5e34d4deeb6d80b336cacea39797e0ca"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 211; y: 75
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 217; y: 75
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 3392
+        hash: "b8795d844982bcf60a6713f91717648f"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 220; y: 75
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 224; y: 75
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 3408
+        hash: "857c63b24057ee0186c5136eddb71cb1"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 226; y: 75
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 227; y: 76
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 3424
+        hash: "49222ed0d1ebc8759d0a1dc65c3beec6"
+    }
+    Frame {
+        msec: 3440
+        hash: "49222ed0d1ebc8759d0a1dc65c3beec6"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 227; y: 77
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 226; y: 77
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 3456
+        hash: "751847708a468f4f3e64e7cb5ebd1351"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 225; y: 78
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 224; y: 78
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 3472
+        hash: "4016f80a5219fcba6480645f71998d71"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 221; y: 80
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 220; y: 80
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 3488
+        hash: "beef05cd2a3d20bc66978fa4f0ac1d12"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 216; y: 82
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 214; y: 84
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 3504
+        hash: "e50a2661e93d34b55c8d2d39abc77e5a"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 209; y: 86
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 206; y: 86
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 3520
+        hash: "7beccbc2f091350bb5d9de1e2443021d"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 200; y: 88
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 192; y: 89
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 3536
+        hash: "1d39570bf07392f56b6dd24b0bf9e7bc"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 188; y: 90
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 180; y: 91
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 3552
+        hash: "62565b3e5aad3979b408207bbf36e615"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 176; y: 92
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 167; y: 92
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 3568
+        hash: "d9c6004921847fef16bb8c2f5d6b3b7d"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 162; y: 92
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 152; y: 92
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 3584
+        hash: "53da27301ad97ae52c65928615ec0cd7"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 142; y: 92
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 137; y: 90
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 3600
+        hash: "9772a776e84515984b4eec70dbd1c5a7"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 125; y: 88
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 119; y: 88
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 3616
+        hash: "9caa6583a716443c13e8fef3f2923d6e"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 109; y: 86
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 104; y: 85
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 3632
+        hash: "f162a18b2d3f0d5f6f01fc373c016f68"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 98; y: 84
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 96; y: 84
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 3648
+        hash: "58976e8e31beddf881c7cfa3ede54c09"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 94; y: 84
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 92; y: 83
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 3664
+        hash: "6625f7adb097bc170024083c42d74b4b"
+    }
+    Frame {
+        msec: 3680
+        hash: "6625f7adb097bc170024083c42d74b4b"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 92; y: 82
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 3696
+        hash: "1d63f09ca27e9d70c3c0ea923a6cfba4"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 93; y: 82
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 3712
+        hash: "1d63f09ca27e9d70c3c0ea923a6cfba4"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 94; y: 81
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 96; y: 81
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 3728
+        hash: "a23c75fcaa0a28adb944bf192af65bff"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 98; y: 81
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 100; y: 81
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 3744
+        hash: "2b90fe8937dcc39d1d6add305cf36043"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 107; y: 81
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 111; y: 81
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 3760
+        hash: "7da82cfaf0f826ca9a41128278b6b09c"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 118; y: 81
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 122; y: 81
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 3776
+        hash: "a3f69d13d38b336fda33a86899564996"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 129; y: 80
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 135; y: 79
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 3792
+        hash: "dc562319e1d332ba34ac94bfc0c39c5e"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 138; y: 79
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 140; y: 78
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 3808
+        hash: "756482bee292668f56d813847b0ccd53"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 141; y: 77
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 142; y: 76
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 3824
+        hash: "06d250c4d18a70f8f7b1c10e22a1bc4c"
+    }
+    Frame {
+        msec: 3840
+        hash: "06d250c4d18a70f8f7b1c10e22a1bc4c"
+    }
+    Frame {
+        msec: 3856
+        image: "nested.4.png"
+    }
+    Frame {
+        msec: 3872
+        hash: "06d250c4d18a70f8f7b1c10e22a1bc4c"
+    }
+    Mouse {
+        type: 3
+        button: 1
+        buttons: 0
+        x: 142; y: 76
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 3888
+        hash: "42dc501eb5a34843ef0a8977ff029054"
+    }
+    Frame {
+        msec: 3904
+        hash: "42dc501eb5a34843ef0a8977ff029054"
+    }
+    Frame {
+        msec: 3920
+        hash: "42dc501eb5a34843ef0a8977ff029054"
+    }
+    Frame {
+        msec: 3936
+        hash: "42dc501eb5a34843ef0a8977ff029054"
+    }
+    Frame {
+        msec: 3952
+        hash: "42dc501eb5a34843ef0a8977ff029054"
+    }
+    Frame {
+        msec: 3968
+        hash: "42dc501eb5a34843ef0a8977ff029054"
+    }
+    Frame {
+        msec: 3984
+        hash: "42dc501eb5a34843ef0a8977ff029054"
+    }
+    Frame {
+        msec: 4000
+        hash: "42dc501eb5a34843ef0a8977ff029054"
+    }
+    Frame {
+        msec: 4016
+        hash: "42dc501eb5a34843ef0a8977ff029054"
+    }
+    Frame {
+        msec: 4032
+        hash: "42dc501eb5a34843ef0a8977ff029054"
+    }
+    Frame {
+        msec: 4048
+        hash: "42dc501eb5a34843ef0a8977ff029054"
+    }
+    Frame {
+        msec: 4064
+        hash: "42dc501eb5a34843ef0a8977ff029054"
+    }
+    Frame {
+        msec: 4080
+        hash: "42dc501eb5a34843ef0a8977ff029054"
+    }
+    Frame {
+        msec: 4096
+        hash: "42dc501eb5a34843ef0a8977ff029054"
+    }
+    Frame {
+        msec: 4112
+        hash: "42dc501eb5a34843ef0a8977ff029054"
+    }
+    Frame {
+        msec: 4128
+        hash: "42dc501eb5a34843ef0a8977ff029054"
+    }
+    Frame {
+        msec: 4144
+        hash: "42dc501eb5a34843ef0a8977ff029054"
+    }
+    Frame {
+        msec: 4160
+        hash: "42dc501eb5a34843ef0a8977ff029054"
+    }
+    Frame {
+        msec: 4176
+        hash: "42dc501eb5a34843ef0a8977ff029054"
+    }
+    Frame {
+        msec: 4192
+        hash: "42dc501eb5a34843ef0a8977ff029054"
+    }
+    Frame {
+        msec: 4208
+        hash: "42dc501eb5a34843ef0a8977ff029054"
+    }
+    Frame {
+        msec: 4224
+        hash: "42dc501eb5a34843ef0a8977ff029054"
+    }
+    Frame {
+        msec: 4240
+        hash: "42dc501eb5a34843ef0a8977ff029054"
+    }
+    Frame {
+        msec: 4256
+        hash: "42dc501eb5a34843ef0a8977ff029054"
+    }
+    Frame {
+        msec: 4272
+        hash: "42dc501eb5a34843ef0a8977ff029054"
+    }
+    Frame {
+        msec: 4288
+        hash: "42dc501eb5a34843ef0a8977ff029054"
+    }
+    Frame {
+        msec: 4304
+        hash: "42dc501eb5a34843ef0a8977ff029054"
+    }
+    Frame {
+        msec: 4320
+        hash: "42dc501eb5a34843ef0a8977ff029054"
+    }
+    Frame {
+        msec: 4336
+        hash: "42dc501eb5a34843ef0a8977ff029054"
+    }
+    Frame {
+        msec: 4352
+        hash: "42dc501eb5a34843ef0a8977ff029054"
+    }
+    Frame {
+        msec: 4368
+        hash: "42dc501eb5a34843ef0a8977ff029054"
+    }
+    Frame {
+        msec: 4384
+        hash: "42dc501eb5a34843ef0a8977ff029054"
+    }
+    Frame {
+        msec: 4400
+        hash: "42dc501eb5a34843ef0a8977ff029054"
+    }
+    Frame {
+        msec: 4416
+        hash: "42dc501eb5a34843ef0a8977ff029054"
+    }
+    Frame {
+        msec: 4432
+        hash: "42dc501eb5a34843ef0a8977ff029054"
+    }
+    Frame {
+        msec: 4448
+        hash: "42dc501eb5a34843ef0a8977ff029054"
+    }
+    Frame {
+        msec: 4464
+        hash: "42dc501eb5a34843ef0a8977ff029054"
+    }
+    Frame {
+        msec: 4480
+        hash: "42dc501eb5a34843ef0a8977ff029054"
+    }
+    Frame {
+        msec: 4496
+        hash: "42dc501eb5a34843ef0a8977ff029054"
+    }
+    Frame {
+        msec: 4512
+        hash: "42dc501eb5a34843ef0a8977ff029054"
+    }
+    Frame {
+        msec: 4528
+        hash: "42dc501eb5a34843ef0a8977ff029054"
+    }
+    Frame {
+        msec: 4544
+        hash: "42dc501eb5a34843ef0a8977ff029054"
+    }
+    Mouse {
+        type: 2
+        button: 1
+        buttons: 1
+        x: 16; y: 46
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 4560
+        hash: "42dc501eb5a34843ef0a8977ff029054"
+    }
+    Frame {
+        msec: 4576
+        hash: "42dc501eb5a34843ef0a8977ff029054"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 16; y: 47
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 16; y: 48
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 4592
+        hash: "42dc501eb5a34843ef0a8977ff029054"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 16; y: 49
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 17; y: 50
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 4608
+        hash: "42dc501eb5a34843ef0a8977ff029054"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 17; y: 55
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 18; y: 56
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 4624
+        hash: "42dc501eb5a34843ef0a8977ff029054"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 20; y: 61
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 20; y: 64
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 4640
+        hash: "ff1f86b47e0d1db5db7d939df8349931"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 22; y: 70
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 23; y: 73
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 4656
+        hash: "f13393a4556e9e73c33f2bb74d8f7794"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 26; y: 80
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 28; y: 84
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 4672
+        hash: "8c9aa01516437184eb17d89348cca004"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 33; y: 91
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 40; y: 99
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 4688
+        hash: "8b6848cb722ff5ec02d957da1ee687e5"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 44; y: 102
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 53; y: 109
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 4704
+        hash: "552fde584d128f511788670031d79dd2"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 58; y: 112
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 64; y: 117
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 4720
+        hash: "55dc3a4242b46e602f823c0305e67ad2"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 68; y: 118
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 71; y: 120
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 4736
+        hash: "603b9b2ed6ff4273c3ab1cbe32afb19e"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 73; y: 120
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 3
+        button: 1
+        buttons: 0
+        x: 73; y: 120
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 4752
+        hash: "157eda24ea8452a208aa7a6a22639c73"
+    }
+    Frame {
+        msec: 4768
+        hash: "157eda24ea8452a208aa7a6a22639c73"
+    }
+    Frame {
+        msec: 4784
+        hash: "c5005b83816c18b67448dfbccd0ab0b2"
+    }
+    Frame {
+        msec: 4800
+        hash: "878512df863e5d60437b85fbd2a32eb1"
+    }
+    Frame {
+        msec: 4816
+        image: "nested.5.png"
+    }
+    Frame {
+        msec: 4832
+        hash: "02ab69b67b746ec0021295992a03ada1"
+    }
+    Frame {
+        msec: 4848
+        hash: "c621382766d7bacab87055a73623a8ce"
+    }
+    Frame {
+        msec: 4864
+        hash: "a8d1be78741d9afd88363bd19f1cbc6b"
+    }
+    Frame {
+        msec: 4880
+        hash: "5a70275ff656766d73638d4dd4db4492"
+    }
+    Frame {
+        msec: 4896
+        hash: "892ea0a00553524b79889d437eac9b6f"
+    }
+    Frame {
+        msec: 4912
+        hash: "d818258bffc065430902ffa8f5668f86"
+    }
+    Frame {
+        msec: 4928
+        hash: "6b844523522ace7545705ffb8ffe1da3"
+    }
+    Frame {
+        msec: 4944
+        hash: "3906097bc49bad199b52c99dbf87f98f"
+    }
+    Frame {
+        msec: 4960
+        hash: "a2bd859b5ca7f4fac8d62b1c9ab76aad"
+    }
+    Frame {
+        msec: 4976
+        hash: "f374673e3511b1df8b50ff7ef6002b3a"
+    }
+    Frame {
+        msec: 4992
+        hash: "c2eecfadd19418f469b1ab53a3ecae70"
+    }
+    Frame {
+        msec: 5008
+        hash: "2b481965ece0f2e1795ef56aa5d6a752"
+    }
+    Frame {
+        msec: 5024
+        hash: "c294f28000348365a2c37265132efdb5"
+    }
+    Frame {
+        msec: 5040
+        hash: "c294f28000348365a2c37265132efdb5"
+    }
+    Frame {
+        msec: 5056
+        hash: "4e9c18eab469b2da0cb92526d3d54501"
+    }
+    Frame {
+        msec: 5072
+        hash: "4e9c18eab469b2da0cb92526d3d54501"
+    }
+    Frame {
+        msec: 5088
+        hash: "4e9c18eab469b2da0cb92526d3d54501"
+    }
+    Frame {
+        msec: 5104
+        hash: "4e9c18eab469b2da0cb92526d3d54501"
+    }
+    Frame {
+        msec: 5120
+        hash: "3836449b99d88e2dea9a0eb9417faca5"
+    }
+    Frame {
+        msec: 5136
+        hash: "42dc501eb5a34843ef0a8977ff029054"
+    }
+    Frame {
+        msec: 5152
+        hash: "42dc501eb5a34843ef0a8977ff029054"
+    }
+    Frame {
+        msec: 5168
+        hash: "42dc501eb5a34843ef0a8977ff029054"
+    }
+    Frame {
+        msec: 5184
+        hash: "42dc501eb5a34843ef0a8977ff029054"
+    }
+    Frame {
+        msec: 5200
+        hash: "42dc501eb5a34843ef0a8977ff029054"
+    }
+    Frame {
+        msec: 5216
+        hash: "42dc501eb5a34843ef0a8977ff029054"
+    }
+    Frame {
+        msec: 5232
+        hash: "42dc501eb5a34843ef0a8977ff029054"
+    }
+    Frame {
+        msec: 5248
+        hash: "42dc501eb5a34843ef0a8977ff029054"
+    }
+    Frame {
+        msec: 5264
+        hash: "42dc501eb5a34843ef0a8977ff029054"
+    }
+    Frame {
+        msec: 5280
+        hash: "42dc501eb5a34843ef0a8977ff029054"
+    }
+    Frame {
+        msec: 5296
+        hash: "42dc501eb5a34843ef0a8977ff029054"
+    }
+    Frame {
+        msec: 5312
+        hash: "42dc501eb5a34843ef0a8977ff029054"
+    }
+    Frame {
+        msec: 5328
+        hash: "42dc501eb5a34843ef0a8977ff029054"
+    }
+    Frame {
+        msec: 5344
+        hash: "42dc501eb5a34843ef0a8977ff029054"
+    }
+    Frame {
+        msec: 5360
+        hash: "42dc501eb5a34843ef0a8977ff029054"
+    }
+    Frame {
+        msec: 5376
+        hash: "42dc501eb5a34843ef0a8977ff029054"
+    }
+    Frame {
+        msec: 5392
+        hash: "42dc501eb5a34843ef0a8977ff029054"
+    }
+    Frame {
+        msec: 5408
+        hash: "42dc501eb5a34843ef0a8977ff029054"
+    }
+    Frame {
+        msec: 5424
+        hash: "42dc501eb5a34843ef0a8977ff029054"
+    }
+    Frame {
+        msec: 5440
+        hash: "42dc501eb5a34843ef0a8977ff029054"
+    }
+    Frame {
+        msec: 5456
+        hash: "42dc501eb5a34843ef0a8977ff029054"
+    }
+    Frame {
+        msec: 5472
+        hash: "42dc501eb5a34843ef0a8977ff029054"
+    }
+    Frame {
+        msec: 5488
+        hash: "42dc501eb5a34843ef0a8977ff029054"
+    }
+    Frame {
+        msec: 5504
+        hash: "42dc501eb5a34843ef0a8977ff029054"
+    }
+    Frame {
+        msec: 5520
+        hash: "42dc501eb5a34843ef0a8977ff029054"
+    }
+    Frame {
+        msec: 5536
+        hash: "42dc501eb5a34843ef0a8977ff029054"
+    }
+    Frame {
+        msec: 5552
+        hash: "42dc501eb5a34843ef0a8977ff029054"
+    }
+    Frame {
+        msec: 5568
+        hash: "42dc501eb5a34843ef0a8977ff029054"
+    }
+    Frame {
+        msec: 5584
+        hash: "42dc501eb5a34843ef0a8977ff029054"
+    }
+    Frame {
+        msec: 5600
+        hash: "42dc501eb5a34843ef0a8977ff029054"
+    }
+    Frame {
+        msec: 5616
+        hash: "42dc501eb5a34843ef0a8977ff029054"
+    }
+    Frame {
+        msec: 5632
+        hash: "42dc501eb5a34843ef0a8977ff029054"
+    }
+    Mouse {
+        type: 2
+        button: 1
+        buttons: 1
+        x: 20; y: 238
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 21; y: 238
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 5648
+        hash: "42dc501eb5a34843ef0a8977ff029054"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 22; y: 239
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 23; y: 239
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 5664
+        hash: "42dc501eb5a34843ef0a8977ff029054"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 27; y: 240
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 29; y: 240
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 5680
+        hash: "b56d132ac881e27d308009fb9a9d2d50"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 33; y: 241
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 36; y: 241
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 5696
+        hash: "6c65fca03ea127d554f15c80da76f21f"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 42; y: 242
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 45; y: 243
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 5712
+        hash: "e5d8939135d0e964609a09a437af58bc"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 53; y: 243
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 61; y: 243
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 5728
+        hash: "ab60a45ac475ef8d1177d831a6572d1f"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 66; y: 243
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 75; y: 243
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 5744
+        hash: "78b2e0c7dd8b8bcbd573dac79ff815e4"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 79; y: 243
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 89; y: 243
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 5760
+        hash: "ef9e89650d8e3d572285e2a2e2b09166"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 95; y: 243
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 106; y: 243
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 5776
+        image: "nested.6.png"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 118; y: 243
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 126; y: 243
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 5792
+        hash: "b83136fa3769e30ea47097b489e8f1dc"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 137; y: 241
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 143; y: 240
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 5808
+        hash: "fb892905b790a061ce5985c927db3cf5"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 154; y: 238
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 159; y: 237
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 5824
+        hash: "bc4358e21d2d31942e776adfd32ef1c6"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 170; y: 235
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 184; y: 234
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 5840
+        hash: "b42380a7fcf5e2fbfe4dddbe86ad7287"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 191; y: 232
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 201; y: 231
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 5856
+        hash: "4b3c12beb43a77ebaf458804b03c7b52"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 205; y: 231
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 208; y: 230
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 5872
+        hash: "a18be4d4ab28c0fd0c16696c4ecc03ef"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 209; y: 230
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 209; y: 229
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 5888
+        hash: "c5f100bc4b14e958c7d9bbff84e0a934"
+    }
+    Frame {
+        msec: 5904
+        hash: "c5f100bc4b14e958c7d9bbff84e0a934"
+    }
+    Frame {
+        msec: 5920
+        hash: "c5f100bc4b14e958c7d9bbff84e0a934"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 208; y: 229
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 5936
+        hash: "a18be4d4ab28c0fd0c16696c4ecc03ef"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 207; y: 229
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 207; y: 230
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 5952
+        hash: "a8b23e7dad1bdbaa3452335be0f07658"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 206; y: 230
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 204; y: 231
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 5968
+        hash: "4c1feb559a11912b06ed521bebba43d0"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 200; y: 232
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 194; y: 232
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 5984
+        hash: "ffb97bcedf72e02616272c1cad5c38d7"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 190; y: 232
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 181; y: 231
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 6000
+        hash: "99498ed9b4d519a2f842d407abdef90a"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 175; y: 230
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 163; y: 229
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 6016
+        hash: "1ca3f012adab899eba1dcb63d048345f"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 158; y: 228
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 145; y: 227
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 6032
+        hash: "8a81d49de887f314f67976a65f469169"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 132; y: 227
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 126; y: 227
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 6048
+        hash: "b83136fa3769e30ea47097b489e8f1dc"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 116; y: 227
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 112; y: 227
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 6064
+        hash: "12cdd297407257ae4bb13c87e24537fb"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 103; y: 227
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 99; y: 227
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 6080
+        hash: "a51ac0a1e9432671c88f7649c38d265d"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 90; y: 227
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 86; y: 227
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 6096
+        hash: "4ba4f854659161c765395cdee35594f2"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 77; y: 226
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 70; y: 225
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 6112
+        hash: "9907add9e28b4a8976f3727f99a4b6d4"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 66; y: 224
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 60; y: 223
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 6128
+        hash: "c2cb865c4a766b9c08328b374e940f29"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 59; y: 223
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 56; y: 223
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 6144
+        hash: "c97981263572ded23b328da45cf88012"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 55; y: 223
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 53; y: 223
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 6160
+        hash: "f4bae51c866ba1158f44529208514d6f"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 52; y: 222
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 50; y: 222
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 6176
+        hash: "35b4f1f9bb343f2b22bd7cdad6f28249"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 49; y: 223
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 48; y: 223
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 6192
+        hash: "84eba4cb400e5622463f5a1fa79be72b"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 47; y: 223
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 46; y: 223
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 6208
+        hash: "d38e882728c7efc906befe69b416082a"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 45; y: 223
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 6224
+        hash: "e5d8939135d0e964609a09a437af58bc"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 44; y: 223
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 43; y: 223
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 6240
+        hash: "6b6e06e8473d5703e217accd824b08d5"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 42; y: 223
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 40; y: 223
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 6256
+        hash: "8e38bc5b00e33e24f931b181dc77d3c1"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 39; y: 223
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 38; y: 223
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 6272
+        hash: "a173708b5380f42a2bdbf6ae69cdca20"
+    }
+    Frame {
+        msec: 6288
+        hash: "a173708b5380f42a2bdbf6ae69cdca20"
+    }
+    Frame {
+        msec: 6304
+        hash: "a173708b5380f42a2bdbf6ae69cdca20"
+    }
+    Frame {
+        msec: 6320
+        hash: "a173708b5380f42a2bdbf6ae69cdca20"
+    }
+    Mouse {
+        type: 3
+        button: 1
+        buttons: 0
+        x: 38; y: 223
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 6336
+        hash: "3561eaa9124b96b2a0afa022bc0fe581"
+    }
+    Frame {
+        msec: 6352
+        hash: "3561eaa9124b96b2a0afa022bc0fe581"
+    }
+    Frame {
+        msec: 6368
+        hash: "3561eaa9124b96b2a0afa022bc0fe581"
+    }
+    Frame {
+        msec: 6384
+        hash: "3561eaa9124b96b2a0afa022bc0fe581"
+    }
+    Frame {
+        msec: 6400
+        hash: "3561eaa9124b96b2a0afa022bc0fe581"
+    }
+    Frame {
+        msec: 6416
+        hash: "3561eaa9124b96b2a0afa022bc0fe581"
+    }
+    Frame {
+        msec: 6432
+        hash: "3561eaa9124b96b2a0afa022bc0fe581"
+    }
+    Frame {
+        msec: 6448
+        hash: "3561eaa9124b96b2a0afa022bc0fe581"
+    }
+    Frame {
+        msec: 6464
+        hash: "3561eaa9124b96b2a0afa022bc0fe581"
+    }
+    Frame {
+        msec: 6480
+        hash: "3561eaa9124b96b2a0afa022bc0fe581"
+    }
+    Frame {
+        msec: 6496
+        hash: "3561eaa9124b96b2a0afa022bc0fe581"
+    }
+    Frame {
+        msec: 6512
+        hash: "3561eaa9124b96b2a0afa022bc0fe581"
+    }
+    Frame {
+        msec: 6528
+        hash: "3561eaa9124b96b2a0afa022bc0fe581"
+    }
+    Frame {
+        msec: 6544
+        hash: "3561eaa9124b96b2a0afa022bc0fe581"
+    }
+    Frame {
+        msec: 6560
+        hash: "3561eaa9124b96b2a0afa022bc0fe581"
+    }
+    Frame {
+        msec: 6576
+        hash: "3561eaa9124b96b2a0afa022bc0fe581"
+    }
+    Frame {
+        msec: 6592
+        hash: "3561eaa9124b96b2a0afa022bc0fe581"
+    }
+    Frame {
+        msec: 6608
+        hash: "3561eaa9124b96b2a0afa022bc0fe581"
+    }
+    Frame {
+        msec: 6624
+        hash: "3561eaa9124b96b2a0afa022bc0fe581"
+    }
+    Frame {
+        msec: 6640
+        hash: "3561eaa9124b96b2a0afa022bc0fe581"
+    }
+    Frame {
+        msec: 6656
+        hash: "3561eaa9124b96b2a0afa022bc0fe581"
+    }
+    Frame {
+        msec: 6672
+        hash: "3561eaa9124b96b2a0afa022bc0fe581"
+    }
+    Frame {
+        msec: 6688
+        hash: "3561eaa9124b96b2a0afa022bc0fe581"
+    }
+    Frame {
+        msec: 6704
+        hash: "3561eaa9124b96b2a0afa022bc0fe581"
+    }
+    Frame {
+        msec: 6720
+        hash: "3561eaa9124b96b2a0afa022bc0fe581"
+    }
+    Frame {
+        msec: 6736
+        image: "nested.7.png"
+    }
+    Frame {
+        msec: 6752
+        hash: "3561eaa9124b96b2a0afa022bc0fe581"
+    }
+    Frame {
+        msec: 6768
+        hash: "3561eaa9124b96b2a0afa022bc0fe581"
+    }
+    Frame {
+        msec: 6784
+        hash: "3561eaa9124b96b2a0afa022bc0fe581"
+    }
+    Frame {
+        msec: 6800
+        hash: "3561eaa9124b96b2a0afa022bc0fe581"
+    }
+    Frame {
+        msec: 6816
+        hash: "3561eaa9124b96b2a0afa022bc0fe581"
+    }
+    Frame {
+        msec: 6832
+        hash: "3561eaa9124b96b2a0afa022bc0fe581"
+    }
+    Frame {
+        msec: 6848
+        hash: "3561eaa9124b96b2a0afa022bc0fe581"
+    }
+    Frame {
+        msec: 6864
+        hash: "3561eaa9124b96b2a0afa022bc0fe581"
+    }
+    Frame {
+        msec: 6880
+        hash: "3561eaa9124b96b2a0afa022bc0fe581"
+    }
+    Frame {
+        msec: 6896
+        hash: "3561eaa9124b96b2a0afa022bc0fe581"
+    }
+    Frame {
+        msec: 6912
+        hash: "3561eaa9124b96b2a0afa022bc0fe581"
+    }
+    Frame {
+        msec: 6928
+        hash: "3561eaa9124b96b2a0afa022bc0fe581"
+    }
+    Frame {
+        msec: 6944
+        hash: "3561eaa9124b96b2a0afa022bc0fe581"
+    }
+    Frame {
+        msec: 6960
+        hash: "3561eaa9124b96b2a0afa022bc0fe581"
+    }
+    Frame {
+        msec: 6976
+        hash: "3561eaa9124b96b2a0afa022bc0fe581"
+    }
+    Frame {
+        msec: 6992
+        hash: "3561eaa9124b96b2a0afa022bc0fe581"
+    }
+    Frame {
+        msec: 7008
+        hash: "3561eaa9124b96b2a0afa022bc0fe581"
+    }
+    Frame {
+        msec: 7024
+        hash: "3561eaa9124b96b2a0afa022bc0fe581"
+    }
+    Frame {
+        msec: 7040
+        hash: "3561eaa9124b96b2a0afa022bc0fe581"
+    }
+    Frame {
+        msec: 7056
+        hash: "3561eaa9124b96b2a0afa022bc0fe581"
+    }
+    Frame {
+        msec: 7072
+        hash: "3561eaa9124b96b2a0afa022bc0fe581"
+    }
+    Mouse {
+        type: 2
+        button: 1
+        buttons: 1
+        x: 46; y: 225
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 7088
+        hash: "3561eaa9124b96b2a0afa022bc0fe581"
+    }
+    Frame {
+        msec: 7104
+        hash: "3561eaa9124b96b2a0afa022bc0fe581"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 46; y: 226
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 46; y: 227
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 7120
+        hash: "3561eaa9124b96b2a0afa022bc0fe581"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 46; y: 228
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 46; y: 231
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 7136
+        hash: "3561eaa9124b96b2a0afa022bc0fe581"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 46; y: 233
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 46; y: 238
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 7152
+        hash: "35dd0f784c356be0050936ff75b0cdf7"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 47; y: 240
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 48; y: 245
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 7168
+        hash: "9ac066a700eae45edf9b2f1ba12f0324"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 48; y: 248
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 49; y: 255
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 7184
+        hash: "22a2a8bf257918820b0ab55ecb14b479"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 50; y: 259
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 51; y: 266
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 7200
+        hash: "eb98237e06cde8ed2f18040ce9197d16"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 52; y: 272
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 52; y: 276
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 7216
+        hash: "f0c7afe1bd25b9b573cbc69154c25862"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 53; y: 282
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 54; y: 285
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 7232
+        hash: "d6a681b6de867db47f889e6f1ec03dcf"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 54; y: 291
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 54; y: 293
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 7248
+        hash: "0ee281281c7654567a1debae7a13abe0"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 54; y: 299
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 54; y: 304
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 7264
+        hash: "9d5f1c8cb0953c14bdd49aa88d2b225f"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 54; y: 306
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 54; y: 310
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 7280
+        hash: "ae1c2a3ed67c5c10fc9d19de4de7b7eb"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 54; y: 312
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 53; y: 315
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 7296
+        hash: "8505f9d060fc17fef2e91eb2add206bb"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 53; y: 316
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 53; y: 318
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 7312
+        hash: "c32a6d546a3e4f2ee5349a7dad4b30af"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 53; y: 319
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 52; y: 320
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 7328
+        hash: "222f6e8e8deab567f1e7d0aaf7035b60"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 51; y: 321
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 51; y: 322
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 7344
+        hash: "f7011629f44015187849daad6a53cebf"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 51; y: 323
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 51; y: 324
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 7360
+        hash: "56b00d9116a51c041483dd00db0aca90"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 50; y: 325
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 50; y: 326
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 7376
+        hash: "93232fbcafe8e279b37781f51dfb923a"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 49; y: 328
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 48; y: 329
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 7392
+        hash: "9fcf62eaacfc3477a4550c31f03c4782"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 48; y: 330
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 48; y: 331
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 7408
+        hash: "dd669865fd36e42eec1d69860b29e7ce"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 47; y: 331
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 7424
+        hash: "9247af334483b219ca9bbe98d8fc362e"
+    }
+    Frame {
+        msec: 7440
+        hash: "9247af334483b219ca9bbe98d8fc362e"
+    }
+    Frame {
+        msec: 7456
+        hash: "9247af334483b219ca9bbe98d8fc362e"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 47; y: 330
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 7472
+        hash: "9247af334483b219ca9bbe98d8fc362e"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 47; y: 329
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 47; y: 328
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 7488
+        hash: "69ef9255a29d65f26e5441594ea1bad9"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 48; y: 325
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 48; y: 323
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 7504
+        hash: "055f73dd085d2f65a055ba4d9a8a7539"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 49; y: 318
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 49; y: 316
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 7520
+        hash: "384da5b6a948a52d0519935a8e33f014"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 51; y: 309
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 54; y: 303
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 7536
+        hash: "1caa0049be4033db45f0d2debb25268f"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 55; y: 299
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 3
+        button: 1
+        buttons: 0
+        x: 55; y: 299
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 7552
+        hash: "76b8d00b3a2a68fec277050a442c18ca"
+    }
+    Frame {
+        msec: 7568
+        hash: "0ee281281c7654567a1debae7a13abe0"
+    }
+    Frame {
+        msec: 7584
+        hash: "df1dbb027a8542aa6120cce7b69724a7"
+    }
+    Frame {
+        msec: 7600
+        hash: "06a4d9b1d73362b3e29c6cf52fdb515c"
+    }
+    Frame {
+        msec: 7616
+        hash: "876c0dc8a68a4c1253b7aed6316cb892"
+    }
+    Frame {
+        msec: 7632
+        hash: "b46c74b1a2535099f0cdb8093bd49a4e"
+    }
+    Frame {
+        msec: 7648
+        hash: "0ad09a7638aa6f2affe47db2a810196f"
+    }
+    Frame {
+        msec: 7664
+        hash: "3710dde54d7e4a10a2c3ca2f891da7f5"
+    }
+    Frame {
+        msec: 7680
+        hash: "8426a607c92fbfa508e81c620d90e919"
+    }
+    Frame {
+        msec: 7696
+        image: "nested.8.png"
+    }
+    Frame {
+        msec: 7712
+        hash: "1f38e34787c909d93d567f983a425257"
+    }
+    Frame {
+        msec: 7728
+        hash: "7b09913793d4c79d948fdff1b72c7124"
+    }
+    Frame {
+        msec: 7744
+        hash: "8a0d1484c073d8107b4bf9949edcdb18"
+    }
+    Frame {
+        msec: 7760
+        hash: "4bad25465dfdcc41995216b0f6a5191b"
+    }
+    Frame {
+        msec: 7776
+        hash: "6d39bbeb5f74273c1ed0231ac34fe094"
+    }
+    Frame {
+        msec: 7792
+        hash: "8ccc2e33b8d6c67162326d229e9c17ab"
+    }
+    Frame {
+        msec: 7808
+        hash: "3561eaa9124b96b2a0afa022bc0fe581"
+    }
+    Frame {
+        msec: 7824
+        hash: "b87d739e49f0427d9da577ac5147fd21"
+    }
+    Frame {
+        msec: 7840
+        hash: "7d0efbfceec35e591f9fae650288809b"
+    }
+    Frame {
+        msec: 7856
+        hash: "7d0efbfceec35e591f9fae650288809b"
+    }
+    Frame {
+        msec: 7872
+        hash: "ff5d2037d3cc7bb6930cabc3d53f0196"
+    }
+    Frame {
+        msec: 7888
+        hash: "76624c57195c25b8abd4297e11c55980"
+    }
+    Frame {
+        msec: 7904
+        hash: "76624c57195c25b8abd4297e11c55980"
+    }
+    Frame {
+        msec: 7920
+        hash: "76624c57195c25b8abd4297e11c55980"
+    }
+    Frame {
+        msec: 7936
+        hash: "76624c57195c25b8abd4297e11c55980"
+    }
+    Frame {
+        msec: 7952
+        hash: "76624c57195c25b8abd4297e11c55980"
+    }
+    Frame {
+        msec: 7968
+        hash: "76624c57195c25b8abd4297e11c55980"
+    }
+    Frame {
+        msec: 7984
+        hash: "76624c57195c25b8abd4297e11c55980"
+    }
+    Frame {
+        msec: 8000
+        hash: "76624c57195c25b8abd4297e11c55980"
+    }
+    Frame {
+        msec: 8016
+        hash: "76624c57195c25b8abd4297e11c55980"
+    }
+    Frame {
+        msec: 8032
+        hash: "76624c57195c25b8abd4297e11c55980"
+    }
+    Frame {
+        msec: 8048
+        hash: "76624c57195c25b8abd4297e11c55980"
+    }
+    Frame {
+        msec: 8064
+        hash: "76624c57195c25b8abd4297e11c55980"
+    }
+    Frame {
+        msec: 8080
+        hash: "76624c57195c25b8abd4297e11c55980"
+    }
+    Frame {
+        msec: 8096
+        hash: "76624c57195c25b8abd4297e11c55980"
+    }
+    Frame {
+        msec: 8112
+        hash: "76624c57195c25b8abd4297e11c55980"
+    }
+    Frame {
+        msec: 8128
+        hash: "76624c57195c25b8abd4297e11c55980"
+    }
+    Frame {
+        msec: 8144
+        hash: "76624c57195c25b8abd4297e11c55980"
+    }
+    Frame {
+        msec: 8160
+        hash: "76624c57195c25b8abd4297e11c55980"
+    }
+    Frame {
+        msec: 8176
+        hash: "76624c57195c25b8abd4297e11c55980"
+    }
+    Frame {
+        msec: 8192
+        hash: "76624c57195c25b8abd4297e11c55980"
+    }
+    Frame {
+        msec: 8208
+        hash: "76624c57195c25b8abd4297e11c55980"
+    }
+    Frame {
+        msec: 8224
+        hash: "76624c57195c25b8abd4297e11c55980"
+    }
+    Frame {
+        msec: 8240
+        hash: "76624c57195c25b8abd4297e11c55980"
+    }
+    Frame {
+        msec: 8256
+        hash: "76624c57195c25b8abd4297e11c55980"
+    }
+    Frame {
+        msec: 8272
+        hash: "76624c57195c25b8abd4297e11c55980"
+    }
+    Frame {
+        msec: 8288
+        hash: "76624c57195c25b8abd4297e11c55980"
+    }
+    Frame {
+        msec: 8304
+        hash: "76624c57195c25b8abd4297e11c55980"
+    }
+    Frame {
+        msec: 8320
+        hash: "76624c57195c25b8abd4297e11c55980"
+    }
+    Frame {
+        msec: 8336
+        hash: "76624c57195c25b8abd4297e11c55980"
+    }
+    Frame {
+        msec: 8352
+        hash: "76624c57195c25b8abd4297e11c55980"
+    }
+    Frame {
+        msec: 8368
+        hash: "76624c57195c25b8abd4297e11c55980"
+    }
+    Frame {
+        msec: 8384
+        hash: "76624c57195c25b8abd4297e11c55980"
+    }
+    Frame {
+        msec: 8400
+        hash: "76624c57195c25b8abd4297e11c55980"
+    }
+    Frame {
+        msec: 8416
+        hash: "76624c57195c25b8abd4297e11c55980"
+    }
+    Frame {
+        msec: 8432
+        hash: "76624c57195c25b8abd4297e11c55980"
+    }
+    Frame {
+        msec: 8448
+        hash: "76624c57195c25b8abd4297e11c55980"
+    }
+    Frame {
+        msec: 8464
+        hash: "76624c57195c25b8abd4297e11c55980"
+    }
+    Frame {
+        msec: 8480
+        hash: "76624c57195c25b8abd4297e11c55980"
+    }
+    Frame {
+        msec: 8496
+        hash: "76624c57195c25b8abd4297e11c55980"
+    }
+    Frame {
+        msec: 8512
+        hash: "76624c57195c25b8abd4297e11c55980"
+    }
+    Frame {
+        msec: 8528
+        hash: "76624c57195c25b8abd4297e11c55980"
+    }
+    Frame {
+        msec: 8544
+        hash: "76624c57195c25b8abd4297e11c55980"
+    }
+    Frame {
+        msec: 8560
+        hash: "76624c57195c25b8abd4297e11c55980"
+    }
+    Frame {
+        msec: 8576
+        hash: "76624c57195c25b8abd4297e11c55980"
+    }
+    Frame {
+        msec: 8592
+        hash: "76624c57195c25b8abd4297e11c55980"
+    }
+    Frame {
+        msec: 8608
+        hash: "76624c57195c25b8abd4297e11c55980"
+    }
+    Frame {
+        msec: 8624
+        hash: "76624c57195c25b8abd4297e11c55980"
+    }
+    Frame {
+        msec: 8640
+        hash: "76624c57195c25b8abd4297e11c55980"
+    }
+    Frame {
+        msec: 8656
+        image: "nested.9.png"
+    }
+    Frame {
+        msec: 8672
+        hash: "76624c57195c25b8abd4297e11c55980"
+    }
+    Frame {
+        msec: 8688
+        hash: "76624c57195c25b8abd4297e11c55980"
+    }
+    Frame {
+        msec: 8704
+        hash: "76624c57195c25b8abd4297e11c55980"
+    }
+    Frame {
+        msec: 8720
+        hash: "76624c57195c25b8abd4297e11c55980"
+    }
+    Frame {
+        msec: 8736
+        hash: "76624c57195c25b8abd4297e11c55980"
+    }
+    Frame {
+        msec: 8752
+        hash: "76624c57195c25b8abd4297e11c55980"
+    }
+    Frame {
+        msec: 8768
+        hash: "76624c57195c25b8abd4297e11c55980"
+    }
+    Frame {
+        msec: 8784
+        hash: "76624c57195c25b8abd4297e11c55980"
+    }
+    Frame {
+        msec: 8800
+        hash: "76624c57195c25b8abd4297e11c55980"
+    }
+    Frame {
+        msec: 8816
+        hash: "76624c57195c25b8abd4297e11c55980"
+    }
+    Frame {
+        msec: 8832
+        hash: "76624c57195c25b8abd4297e11c55980"
+    }
+    Frame {
+        msec: 8848
+        hash: "76624c57195c25b8abd4297e11c55980"
+    }
+    Frame {
+        msec: 8864
+        hash: "76624c57195c25b8abd4297e11c55980"
+    }
+    Frame {
+        msec: 8880
+        hash: "76624c57195c25b8abd4297e11c55980"
+    }
+    Frame {
+        msec: 8896
+        hash: "76624c57195c25b8abd4297e11c55980"
+    }
+    Frame {
+        msec: 8912
+        hash: "76624c57195c25b8abd4297e11c55980"
+    }
+    Frame {
+        msec: 8928
+        hash: "76624c57195c25b8abd4297e11c55980"
+    }
+    Frame {
+        msec: 8944
+        hash: "76624c57195c25b8abd4297e11c55980"
+    }
+    Frame {
+        msec: 8960
+        hash: "76624c57195c25b8abd4297e11c55980"
+    }
+    Frame {
+        msec: 8976
+        hash: "76624c57195c25b8abd4297e11c55980"
+    }
+    Frame {
+        msec: 8992
+        hash: "76624c57195c25b8abd4297e11c55980"
+    }
+    Frame {
+        msec: 9008
+        hash: "76624c57195c25b8abd4297e11c55980"
+    }
+    Frame {
+        msec: 9024
+        hash: "76624c57195c25b8abd4297e11c55980"
+    }
+}
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativemousearea/nested.qml b/tests/auto/declarative/qmlvisual/qdeclarativemousearea/nested.qml
new file mode 100644
index 0000000..b2d88d2
--- /dev/null
+++ b/tests/auto/declarative/qmlvisual/qdeclarativemousearea/nested.qml
@@ -0,0 +1,62 @@
+import QtQuick 1.0
+
+/*
+  Test nested MouseArea with different drag axes.
+*/
+
+Rectangle{
+    width:400
+    height:360
+    color: "white"
+    Flickable {
+        anchors.fill: parent
+        contentWidth: 600
+        contentHeight: 600
+        Rectangle{
+            id: draggable
+            width:200; height:200; color: "lightsteelblue"
+            opacity: ma1.drag.active ? 0.5 : 1.0
+            y:20
+            MouseArea{
+                id: ma1
+                objectName: "one"
+                anchors.fill: parent
+                drag.target: draggable
+                drag.axis: "XandYAxis"
+                drag.filterChildren: true
+                drag.minimumX: 0
+                drag.maximumX: 200
+                drag.minimumY: 20
+                drag.maximumY: 220
+                Rectangle{
+                    id: draggable_inner
+                    width:40; height:40; color: "red"
+                        y:20
+                    MouseArea{
+                        objectName: "two"
+                        anchors.fill: parent
+                        drag.target: draggable_inner
+                        drag.axis: "XAxis"
+                        drag.minimumX: 0
+                        drag.maximumX: 360
+                    }
+                }
+            }
+        }
+        Rectangle{
+            id: draggable3
+            width:40; height:40; color: "green"
+            opacity: ma3.drag.active ? 0.5 : 1.0
+            y:210
+            MouseArea{
+                id: ma3
+                objectName: "three"
+                anchors.fill: parent
+                drag.target: draggable3
+                drag.axis: "XAxis"
+                drag.minimumX: 0
+                drag.maximumX: 360
+            }
+        }
+    }
+}
-- 
cgit v0.12


From 5149da5a564c883209566f3baaeea15932eee1c2 Mon Sep 17 00:00:00 2001
From: Bea Lam <bea.lam@nokia.com>
Date: Wed, 24 Nov 2010 15:42:35 +1000
Subject: Fix incorrect example for Qt.rgba()

---
 doc/src/declarative/basictypes.qdoc | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/doc/src/declarative/basictypes.qdoc b/doc/src/declarative/basictypes.qdoc
index 8ab06ab..71192bf 100644
--- a/doc/src/declarative/basictypes.qdoc
+++ b/doc/src/declarative/basictypes.qdoc
@@ -166,7 +166,7 @@
     \l{QML:Qt::lighter()}{Qt.lighter()} or \l{QML:Qt::tint()}{Qt.tint()} functions:
 
     \qml
-    Rectangle { color: Qt.rgba(255, 0, 0, 1) }
+    Rectangle { color: Qt.rgba(0.5, 0.5, 0, 1) }
     \endqml
 
     \sa {QML Basic Types}
-- 
cgit v0.12


From fe8276e812c5fdc690715d7e36a6b6d70cba7d33 Mon Sep 17 00:00:00 2001
From: Jason McDonald <jason.mcdonald@nokia.com>
Date: Wed, 24 Nov 2010 17:00:20 +1000
Subject: Prevent compilers optimizing eval timebomb code out of existence.

The variable that holds the eval license key is a placeholder that is
patched during package installation.  Unfortunately, for a non-final
package build, the placeholder is filled with nulls at compile-time and
a clever compiler will optimize away most of the eval timebomb code due
to a check in the eval code for the first character of the license key
being null.

This commit makes the variable that holds the license key volatile, to
convince compilers that they cannot make assumptions about the contents
of the variable when optimizing.

Task-number: QT-3848
Acked-by: Thiago Macieira
---
 configure                          | 2 +-
 src/corelib/kernel/qtcore_eval.cpp | 4 ++--
 tools/configure/configureapp.cpp   | 2 +-
 3 files changed, 4 insertions(+), 4 deletions(-)

diff --git a/configure b/configure
index 5aab180..059aa1a 100755
--- a/configure
+++ b/configure
@@ -4520,7 +4520,7 @@ if [ -n "$EVALKEY" ]; then
     rm -f "$outpath/src/corelib/global/qconfig_eval.cpp"
     cat > "$outpath/src/corelib/global/qconfig_eval.cpp" <<EOF
 /* Evaluation license key */
-static const char qt_eval_key_data                   [512 + 12] = "$EVALKEY";
+static const volatile char qt_eval_key_data                   [512 + 12] = "$EVALKEY";
 EOF
     chmod -w "$outpath/src/corelib/global/qconfig_eval.cpp"
 fi
diff --git a/src/corelib/kernel/qtcore_eval.cpp b/src/corelib/kernel/qtcore_eval.cpp
index 78556c3..da76b74 100644
--- a/src/corelib/kernel/qtcore_eval.cpp
+++ b/src/corelib/kernel/qtcore_eval.cpp
@@ -90,14 +90,14 @@ static const char will_shutdown_now[] =
 
 static int qt_eval_is_supported()
 {
-    const char *const license_key = qt_eval_key_data + 12;
+    const volatile char *const license_key = qt_eval_key_data + 12;
 
     // fast fail
     if (!qt_eval_key_data[0] || !*license_key)
         return -1;
 
     // is this an unsupported evaluation?
-    const char* typecode = license_key;
+    const volatile char *typecode = license_key;
     int field = 2;
     for ( ; field && *typecode; ++typecode)
         if (*typecode == '-')
diff --git a/tools/configure/configureapp.cpp b/tools/configure/configureapp.cpp
index 3808c4e..5966fd2 100644
--- a/tools/configure/configureapp.cpp
+++ b/tools/configure/configureapp.cpp
@@ -3331,7 +3331,7 @@ void Configure::generateConfigfiles()
     if (tmpFile3.open()) {
         tmpStream.setDevice(&tmpFile3);
         tmpStream << "/* Evaluation license key */" << endl
-                  << "static const char qt_eval_key_data              [512 + 12] = \"qt_qevalkey=" << licenseInfo["LICENSEKEYEXT"] << "\";" << endl;
+                  << "static const volatile char qt_eval_key_data              [512 + 12] = \"qt_qevalkey=" << licenseInfo["LICENSEKEYEXT"] << "\";" << endl;
 
         tmpStream.flush();
         tmpFile3.flush();
-- 
cgit v0.12


From a17a8bfe860b6a055f60068ef04f9e31278cd6c4 Mon Sep 17 00:00:00 2001
From: Olivier Goffart <olivier.goffart@nokia.com>
Date: Tue, 23 Nov 2010 17:11:42 +0100
Subject: Enable the no-undefined flag on the linker for icc

Reviewed-by: Thiago
---
 src/qbase.pri | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/qbase.pri b/src/qbase.pri
index 4217618..8460b9c 100644
--- a/src/qbase.pri
+++ b/src/qbase.pri
@@ -36,7 +36,7 @@ CONFIG		+= qt warn_on depend_includepath
 CONFIG          += qmake_cache target_qt 
 CONFIG          -= fix_output_dirs
 win32|mac:!macx-xcode:CONFIG += debug_and_release
-linux*-g++*:QMAKE_LFLAGS += $$QMAKE_LFLAGS_NOUNDEF
+linux*:QMAKE_LFLAGS += $$QMAKE_LFLAGS_NOUNDEF
 
 contains(QT_CONFIG, reduce_exports):CONFIG += hide_symbols
 unix:contains(QT_CONFIG, reduce_relocations):CONFIG += bsymbolic_functions
-- 
cgit v0.12

