# HG changeset patch
# Parent 151b3edef04b13ede6e60c5567421867ef534b55
diff --git a/layout-set.c b/layout-set.c
--- a/layout-set.c
+++ b/layout-set.c
@@ -126,6 +126,7 @@
struct window_pane *wp;
struct layout_cell *lc, *lcnew;
u_int i, n, width, xoff;
+ int rem;
layout_print_cell(w->layout_root, __func__, 1);
@@ -138,6 +139,7 @@
width = (w->sx - (n - 1)) / n;
if (width < PANE_MINIMUM)
width = PANE_MINIMUM;
+ rem = w->sx - (width + 1) * n + 1;
/* Free the old root and construct a new. */
layout_free(w);
@@ -150,7 +152,7 @@
TAILQ_FOREACH(wp, &w->panes, entry) {
/* Create child cell. */
lcnew = layout_create_cell(lc);
- layout_set_size(lcnew, width, w->sy, xoff, 0);
+ layout_set_size(lcnew, width + (rem-- > 0), w->sy, xoff, 0);
layout_make_leaf(lcnew, wp);
TAILQ_INSERT_TAIL(&lc->cells, lcnew, entry);
@@ -158,12 +160,6 @@
xoff += width + 1;
}
- /* Allocate any remaining space. */
- if (w->sx > xoff - 1) {
- lc = TAILQ_LAST(&lc->cells, layout_cells);
- layout_resize_adjust(lc, LAYOUT_LEFTRIGHT, w->sx - (xoff - 1));
- }
-
/* Fix cell offsets. */
layout_fix_offsets(lc);
layout_fix_panes(w, w->sx, w->sy);
@@ -179,6 +175,7 @@
struct window_pane *wp;
struct layout_cell *lc, *lcnew;
u_int i, n, height, yoff;
+ int rem;
layout_print_cell(w->layout_root, __func__, 1);
@@ -191,6 +188,7 @@
height = (w->sy - (n - 1)) / n;
if (height < PANE_MINIMUM)
height = PANE_MINIMUM;
+ rem = w->sy - (height + 1) * n + 1;
/* Free the old root and construct a new. */
layout_free(w);
@@ -203,7 +201,7 @@
TAILQ_FOREACH(wp, &w->panes, entry) {
/* Create child cell. */
lcnew = layout_create_cell(lc);
- layout_set_size(lcnew, w->sx, height, 0, yoff);
+ layout_set_size(lcnew, w->sx, height + (rem-- > 0), 0, yoff);
layout_make_leaf(lcnew, wp);
TAILQ_INSERT_TAIL(&lc->cells, lcnew, entry);
@@ -211,12 +209,6 @@
yoff += height + 1;
}
- /* Allocate any remaining space. */
- if (w->sy > yoff - 1) {
- lc = TAILQ_LAST(&lc->cells, layout_cells);
- layout_resize_adjust(lc, LAYOUT_TOPBOTTOM, w->sy - (yoff - 1));
- }
-
/* Fix cell offsets. */
layout_fix_offsets(lc);
layout_fix_panes(w, w->sx, w->sy);
@@ -233,6 +225,7 @@
struct layout_cell *lc, *lcmain, *lcrow, *lcchild;
u_int n, mainheight, otherheight, width, height;
u_int used, i, j, columns, rows, totalrows;
+ int rem;
layout_print_cell(w->layout_root, __func__, 1);
@@ -249,6 +242,7 @@
rows = 1 + (n - 1) / columns;
columns = 1 + (n - 1) / rows;
width = (w->sx - (n - 1)) / columns;
+ rem = w->sx - (width + 1) * columns + 1;
/* Get the main pane height and add one for separator line. */
mainheight = options_get_number(&w->options, "main-pane-height") + 1;
@@ -312,7 +306,7 @@
for (i = 0; i < columns; i++) {
/* Create and add a pane cell. */
lcchild = layout_create_cell(lcrow);
- layout_set_size(lcchild, width, height, 0, 0);
+ layout_set_size(lcchild, width + (rem-- > 0), height, 0, 0);
layout_make_leaf(lcchild, wp);
TAILQ_INSERT_TAIL(&lcrow->cells, lcchild, entry);
@@ -320,15 +314,6 @@
if ((wp = TAILQ_NEXT(wp, entry)) == NULL)
break;
}
-
- /* Adjust the row to fit the full width if necessary. */
- if (i == columns)
- i--;
- used = ((i + 1) * (width + 1)) - 1;
- if (w->sx <= used)
- continue;
- lcchild = TAILQ_LAST(&lcrow->cells, layout_cells);
- layout_resize_adjust(lcchild, LAYOUT_LEFTRIGHT, w->sx - used);
}
/* Adjust the last row height to fit if necessary. */
@@ -354,6 +339,7 @@
struct layout_cell *lc, *lcmain, *lccolumn, *lcchild;
u_int n, mainwidth, otherwidth, width, height;
u_int used, i, j, columns, rows, totalcolumns;
+ int rem;
layout_print_cell(w->layout_root, __func__, 1);
@@ -370,6 +356,7 @@
columns = 1 + (n - 1) / rows;
rows = 1 + (n - 1) / columns;
height = (w->sy - (n - 1)) / rows;
+ rem = w->sy - (height + 1) * rows + 1;
/* Get the main pane width and add one for separator line. */
mainwidth = options_get_number(&w->options, "main-pane-width") + 1;
@@ -433,7 +420,7 @@
for (i = 0; i < rows; i++) {
/* Create and add a pane cell. */
lcchild = layout_create_cell(lccolumn);
- layout_set_size(lcchild, width, height, 0, 0);
+ layout_set_size(lcchild, width, height + (rem-- > 0), 0, 0);
layout_make_leaf(lcchild, wp);
TAILQ_INSERT_TAIL(&lccolumn->cells, lcchild, entry);
@@ -441,15 +428,6 @@
if ((wp = TAILQ_NEXT(wp, entry)) == NULL)
break;
}
-
- /* Adjust the column to fit the full height if necessary. */
- if (i == rows)
- i--;
- used = ((i + 1) * (height + 1)) - 1;
- if (w->sy <= used)
- continue;
- lcchild = TAILQ_LAST(&lccolumn->cells, layout_cells);
- layout_resize_adjust(lcchild, LAYOUT_TOPBOTTOM, w->sy - used);
}
/* Adjust the last column width to fit if necessary. */
@@ -475,6 +453,8 @@
struct layout_cell *lc, *lcrow, *lcchild;
u_int n, width, height, used;
u_int i, j, columns, rows;
+ int wrem, wrem1, hrem;
+ u_int width1, height1;
layout_print_cell(w->layout_root, __func__, 1);
@@ -498,12 +478,13 @@
height = (w->sy - (rows - 1)) / rows;
if (height < PANE_MINIMUM)
height = PANE_MINIMUM;
+ wrem = w->sx - (width + 1) * columns + 1;
+ hrem = w->sy - (height + 1) * rows + 1;
/* Free old tree and create a new root. */
layout_free(w);
lc = w->layout_root = layout_create_cell(NULL);
- layout_set_size(lc, (width + 1) * columns - 1,
- (height + 1) * rows - 1, 0, 0);
+ layout_set_size(lc, w->sx, w->sy, 0, 0);
layout_make_node(lc, LAYOUT_TOPBOTTOM);
/* Create a grid of the cells. */
@@ -515,7 +496,8 @@
/* Create the new row. */
lcrow = layout_create_cell(lc);
- layout_set_size(lcrow, w->sx, height, 0, 0);
+ height1 = height + (hrem-- > 0);
+ layout_set_size(lcrow, w->sx, height1, 0, 0);
TAILQ_INSERT_TAIL(&lc->cells, lcrow, entry);
/* If only one column, just use the row directly. */
@@ -526,13 +508,17 @@
}
/* Add in the columns. */
+ wrem1 = wrem;
+ used = 0;
layout_make_node(lcrow, LAYOUT_LEFTRIGHT);
for (i = 0; i < columns; i++) {
/* Create and add a pane cell. */
lcchild = layout_create_cell(lcrow);
- layout_set_size(lcchild, width, height, 0, 0);
+ width1 = width + (wrem1-- > 0);
+ layout_set_size(lcchild, width1, height1, 0, 0);
layout_make_leaf(lcchild, wp);
TAILQ_INSERT_TAIL(&lcrow->cells, lcchild, entry);
+ used += width1 + 1;
/* Move to the next cell. */
if ((wp = TAILQ_NEXT(wp, entry)) == NULL)
@@ -543,22 +529,13 @@
* Adjust the row and columns to fit the full width if
* necessary.
*/
- if (i == columns)
- i--;
- used = ((i + 1) * (width + 1)) - 1;
+ used--;
if (w->sx <= used)
continue;
lcchild = TAILQ_LAST(&lcrow->cells, layout_cells);
layout_resize_adjust(lcchild, LAYOUT_LEFTRIGHT, w->sx - used);
}
- /* Adjust the last row height to fit if necessary. */
- used = (rows * height) + rows - 1;
- if (w->sy > used) {
- lcrow = TAILQ_LAST(&lc->cells, layout_cells);
- layout_resize_adjust(lcrow, LAYOUT_TOPBOTTOM, w->sy - used);
- }
-
/* Fix cell offsets. */
layout_fix_offsets(lc);
layout_fix_panes(w, w->sx, w->sy);
IyBIRyBjaGFuZ2VzZXQgcGF0Y2gKIyBQYXJlbnQgMTUxYjNlZGVmMDRiMTNlZGU2ZTYwYzU1Njc0MjE4NjdlZjUzNGI1NQoKZGlmZiAtLWdpdCBhL2xheW91dC1zZXQuYyBiL2xheW91dC1zZXQuYwotLS0gYS9sYXlvdXQtc2V0LmMKKysrIGIvbGF5b3V0LXNldC5jCkBAIC0xMjYsNiArMTI2LDcgQEAKICAgICBzdHJ1Y3Qgd2luZG93X3BhbmUJKndwOwogCXN0cnVjdCBsYXlvdXRfY2VsbAkqbGMsICpsY25ldzsKIAl1X2ludAkJCSBpLCBuLCB3aWR0aCwgeG9mZjsKKwlpbnQJCQkgcmVtOwogCiAJbGF5b3V0X3ByaW50X2NlbGwody0+bGF5b3V0X3Jvb3QsIF9fZnVuY19fLCAxKTsKIApAQCAtMTM4LDYgKzEzOSw3IEBACiAJd2lkdGggPSAody0+c3ggLSAobiAtIDEpKSAvIG47CiAJaWYgKHdpZHRoIDwgUEFORV9NSU5JTVVNKQogCQl3aWR0aCA9IFBBTkVfTUlOSU1VTTsKKwlyZW0gPSB3LT5zeCAtICh3aWR0aCArIDEpICogbiArIDE7CiAKIAkvKiBGcmVlIHRoZSBvbGQgcm9vdCBhbmQgY29uc3RydWN0IGEgbmV3LiAqLwogCWxheW91dF9mcmVlKHcpOwpAQCAtMTUwLDcgKzE1Miw3IEBACiAJVEFJTFFfRk9SRUFDSCh3cCwgJnctPnBhbmVzLCBlbnRyeSkgewogCQkvKiBDcmVhdGUgY2hpbGQgY2VsbC4gKi8KIAkJbGNuZXcgPSBsYXlvdXRfY3JlYXRlX2NlbGwobGMpOwotCQlsYXlvdXRfc2V0X3NpemUobGNuZXcsIHdpZHRoLCB3LT5zeSwgeG9mZiwgMCk7CisJCWxheW91dF9zZXRfc2l6ZShsY25ldywgd2lkdGggKyAocmVtLS0gPiAwKSwgdy0+c3ksIHhvZmYsIDApOwogCQlsYXlvdXRfbWFrZV9sZWFmKGxjbmV3LCB3cCk7CiAJCVRBSUxRX0lOU0VSVF9UQUlMKCZsYy0+Y2VsbHMsIGxjbmV3LCBlbnRyeSk7CiAKQEAgLTE1OCwxMiArMTYwLDYgQEAKIAkJeG9mZiArPSB3aWR0aCArIDE7CiAJfQogCi0JLyogQWxsb2NhdGUgYW55IHJlbWFpbmluZyBzcGFjZS4gKi8KLQlpZiAody0+c3ggPiB4b2ZmIC0gMSkgewotCQlsYyA9IFRBSUxRX0xBU1QoJmxjLT5jZWxscywgbGF5b3V0X2NlbGxzKTsKLQkJbGF5b3V0X3Jlc2l6ZV9hZGp1c3QobGMsIExBWU9VVF9MRUZUUklHSFQsIHctPnN4IC0gKHhvZmYgLSAxKSk7Ci0JfQotCiAJLyogRml4IGNlbGwgb2Zmc2V0cy4gKi8KIAlsYXlvdXRfZml4X29mZnNldHMobGMpOwogCWxheW91dF9maXhfcGFuZXModywgdy0+c3gsIHctPnN5KTsKQEAgLTE3OSw2ICsxNzUsNyBAQAogCXN0cnVjdCB3aW5kb3dfcGFuZQkqd3A7CiAJc3RydWN0IGxheW91dF9jZWxsCSpsYywgKmxjbmV3OwogCXVfaW50CQkJIGksIG4sIGhlaWdodCwgeW9mZjsKKwlpbnQJCQkgcmVtOwogCiAJbGF5b3V0X3ByaW50X2NlbGwody0+bGF5b3V0X3Jvb3QsIF9fZnVuY19fLCAxKTsKIApAQCAtMTkxLDYgKzE4OCw3IEBACiAJaGVpZ2h0ID0gKHctPnN5IC0gKG4gLSAxKSkgLyBuOwogCWlmIChoZWlnaHQgPCBQQU5FX01JTklNVU0pCiAJCWhlaWdodCA9IFBBTkVfTUlOSU1VTTsKKwlyZW0gPSB3LT5zeSAtIChoZWlnaHQgKyAxKSAqIG4gKyAxOwogCiAJLyogRnJlZSB0aGUgb2xkIHJvb3QgYW5kIGNvbnN0cnVjdCBhIG5ldy4gKi8KIAlsYXlvdXRfZnJlZSh3KTsKQEAgLTIwMyw3ICsyMDEsNyBAQAogCVRBSUxRX0ZPUkVBQ0god3AsICZ3LT5wYW5lcywgZW50cnkpIHsKIAkJLyogQ3JlYXRlIGNoaWxkIGNlbGwuICovCiAJCWxjbmV3ID0gbGF5b3V0X2NyZWF0ZV9jZWxsKGxjKTsKLQkJbGF5b3V0X3NldF9zaXplKGxjbmV3LCB3LT5zeCwgaGVpZ2h0LCAwLCB5b2ZmKTsKKwkJbGF5b3V0X3NldF9zaXplKGxjbmV3LCB3LT5zeCwgaGVpZ2h0ICsgKHJlbS0tID4gMCksIDAsIHlvZmYpOwogCQlsYXlvdXRfbWFrZV9sZWFmKGxjbmV3LCB3cCk7CiAJCVRBSUxRX0lOU0VSVF9UQUlMKCZsYy0+Y2VsbHMsIGxjbmV3LCBlbnRyeSk7CiAKQEAgLTIxMSwxMiArMjA5LDYgQEAKIAkJeW9mZiArPSBoZWlnaHQgKyAxOwogCX0KIAotCS8qIEFsbG9jYXRlIGFueSByZW1haW5pbmcgc3BhY2UuICovCi0JaWYgKHctPnN5ID4geW9mZiAtIDEpIHsKLQkJbGMgPSBUQUlMUV9MQVNUKCZsYy0+Y2VsbHMsIGxheW91dF9jZWxscyk7Ci0JCWxheW91dF9yZXNpemVfYWRqdXN0KGxjLCBMQVlPVVRfVE9QQk9UVE9NLCB3LT5zeSAtICh5b2ZmIC0gMSkpOwotCX0KLQogCS8qIEZpeCBjZWxsIG9mZnNldHMuICovCiAJbGF5b3V0X2ZpeF9vZmZzZXRzKGxjKTsKIAlsYXlvdXRfZml4X3BhbmVzKHcsIHctPnN4LCB3LT5zeSk7CkBAIC0yMzMsNiArMjI1LDcgQEAKIAlzdHJ1Y3QgbGF5b3V0X2NlbGwJKmxjLCAqbGNtYWluLCAqbGNyb3csICpsY2NoaWxkOwogCXVfaW50CQkJIG4sIG1haW5oZWlnaHQsIG90aGVyaGVpZ2h0LCB3aWR0aCwgaGVpZ2h0OwogCXVfaW50CQkJIHVzZWQsIGksIGosIGNvbHVtbnMsIHJvd3MsIHRvdGFscm93czsKKwlpbnQJCQkgcmVtOwogCiAJbGF5b3V0X3ByaW50X2NlbGwody0+bGF5b3V0X3Jvb3QsIF9fZnVuY19fLCAxKTsKIApAQCAtMjQ5LDYgKzI0Miw3IEBACiAJcm93cyA9IDEgKyAobiAtIDEpIC8gY29sdW1uczsKIAljb2x1bW5zID0gMSArIChuIC0gMSkgLyByb3dzOwogCXdpZHRoID0gKHctPnN4IC0gKG4gLSAxKSkgLyBjb2x1bW5zOworCXJlbSA9IHctPnN4IC0gKHdpZHRoICsgMSkgKiBjb2x1bW5zICsgMTsKIAogCS8qIEdldCB0aGUgbWFpbiBwYW5lIGhlaWdodCBhbmQgYWRkIG9uZSBmb3Igc2VwYXJhdG9yIGxpbmUuICovCiAJbWFpbmhlaWdodCA9IG9wdGlvbnNfZ2V0X251bWJlcigmdy0+b3B0aW9ucywgIm1haW4tcGFuZS1oZWlnaHQiKSArIDE7CkBAIC0zMTIsNyArMzA2LDcgQEAKIAkJZm9yIChpID0gMDsgaSA8IGNvbHVtbnM7IGkrKykgewogCQkJLyogQ3JlYXRlIGFuZCBhZGQgYSBwYW5lIGNlbGwuICovCiAJCQlsY2NoaWxkID0gbGF5b3V0X2NyZWF0ZV9jZWxsKGxjcm93KTsKLQkJCWxheW91dF9zZXRfc2l6ZShsY2NoaWxkLCB3aWR0aCwgaGVpZ2h0LCAwLCAwKTsKKwkJCWxheW91dF9zZXRfc2l6ZShsY2NoaWxkLCB3aWR0aCArIChyZW0tLSA+IDApLCBoZWlnaHQsIDAsIDApOwogCQkJbGF5b3V0X21ha2VfbGVhZihsY2NoaWxkLCB3cCk7CiAJCQlUQUlMUV9JTlNFUlRfVEFJTCgmbGNyb3ctPmNlbGxzLCBsY2NoaWxkLCBlbnRyeSk7CiAKQEAgLTMyMCwxNSArMzE0LDYgQEAKIAkJCWlmICgod3AgPSBUQUlMUV9ORVhUKHdwLCBlbnRyeSkpID09IE5VTEwpCiAJCQkJYnJlYWs7CiAJCX0KLQotCQkvKiBBZGp1c3QgdGhlIHJvdyB0byBmaXQgdGhlIGZ1bGwgd2lkdGggaWYgbmVjZXNzYXJ5LiAqLwotCQlpZiAoaSA9PSBjb2x1bW5zKQotCQkJaS0tOwotCQl1c2VkID0gKChpICsgMSkgKiAod2lkdGggKyAxKSkgLSAxOwotCQlpZiAody0+c3ggPD0gdXNlZCkKLQkJCWNvbnRpbnVlOwotCQlsY2NoaWxkID0gVEFJTFFfTEFTVCgmbGNyb3ctPmNlbGxzLCBsYXlvdXRfY2VsbHMpOwotCQlsYXlvdXRfcmVzaXplX2FkanVzdChsY2NoaWxkLCBMQVlPVVRfTEVGVFJJR0hULCB3LT5zeCAtIHVzZWQpOwogCX0KIAogCS8qIEFkanVzdCB0aGUgbGFzdCByb3cgaGVpZ2h0IHRvIGZpdCBpZiBuZWNlc3NhcnkuICovCkBAIC0zNTQsNiArMzM5LDcgQEAKIAlzdHJ1Y3QgbGF5b3V0X2NlbGwJKmxjLCAqbGNtYWluLCAqbGNjb2x1bW4sICpsY2NoaWxkOwogCXVfaW50CQkJIG4sIG1haW53aWR0aCwgb3RoZXJ3aWR0aCwgd2lkdGgsIGhlaWdodDsKIAl1X2ludAkJCSB1c2VkLCBpLCBqLCBjb2x1bW5zLCByb3dzLCB0b3RhbGNvbHVtbnM7CisJaW50CQkJIHJlbTsKIAogCWxheW91dF9wcmludF9jZWxsKHctPmxheW91dF9yb290LCBfX2Z1bmNfXywgMSk7CiAKQEAgLTM3MCw2ICszNTYsNyBAQAogCWNvbHVtbnMgPSAxICsgKG4gLSAxKSAvIHJvd3M7CiAJcm93cyA9IDEgKyAobiAtIDEpIC8gY29sdW1uczsKIAloZWlnaHQgPSAody0+c3kgLSAobiAtIDEpKSAvIHJvd3M7CisJcmVtID0gdy0+c3kgLSAoaGVpZ2h0ICsgMSkgKiByb3dzICsgMTsKIAogCS8qIEdldCB0aGUgbWFpbiBwYW5lIHdpZHRoIGFuZCBhZGQgb25lIGZvciBzZXBhcmF0b3IgbGluZS4gKi8KIAltYWlud2lkdGggPSBvcHRpb25zX2dldF9udW1iZXIoJnctPm9wdGlvbnMsICJtYWluLXBhbmUtd2lkdGgiKSArIDE7CkBAIC00MzMsNyArNDIwLDcgQEAKIAkJZm9yIChpID0gMDsgaSA8IHJvd3M7IGkrKykgewogCQkJLyogQ3JlYXRlIGFuZCBhZGQgYSBwYW5lIGNlbGwuICovCiAJCQlsY2NoaWxkID0gbGF5b3V0X2NyZWF0ZV9jZWxsKGxjY29sdW1uKTsKLQkJCWxheW91dF9zZXRfc2l6ZShsY2NoaWxkLCB3aWR0aCwgaGVpZ2h0LCAwLCAwKTsKKwkJCWxheW91dF9zZXRfc2l6ZShsY2NoaWxkLCB3aWR0aCwgaGVpZ2h0ICsgKHJlbS0tID4gMCksIDAsIDApOwogCQkJbGF5b3V0X21ha2VfbGVhZihsY2NoaWxkLCB3cCk7CiAJCQlUQUlMUV9JTlNFUlRfVEFJTCgmbGNjb2x1bW4tPmNlbGxzLCBsY2NoaWxkLCBlbnRyeSk7CiAKQEAgLTQ0MSwxNSArNDI4LDYgQEAKIAkJCWlmICgod3AgPSBUQUlMUV9ORVhUKHdwLCBlbnRyeSkpID09IE5VTEwpCiAJCQkJYnJlYWs7CiAJCX0KLQotCQkvKiBBZGp1c3QgdGhlIGNvbHVtbiB0byBmaXQgdGhlIGZ1bGwgaGVpZ2h0IGlmIG5lY2Vzc2FyeS4gKi8KLQkJaWYgKGkgPT0gcm93cykKLQkJCWktLTsKLQkJdXNlZCA9ICgoaSArIDEpICogKGhlaWdodCArIDEpKSAtIDE7Ci0JCWlmICh3LT5zeSA8PSB1c2VkKQotCQkJY29udGludWU7Ci0JCWxjY2hpbGQgPSBUQUlMUV9MQVNUKCZsY2NvbHVtbi0+Y2VsbHMsIGxheW91dF9jZWxscyk7Ci0JCWxheW91dF9yZXNpemVfYWRqdXN0KGxjY2hpbGQsIExBWU9VVF9UT1BCT1RUT00sIHctPnN5IC0gdXNlZCk7CiAJfQogCiAJLyogQWRqdXN0IHRoZSBsYXN0IGNvbHVtbiB3aWR0aCB0byBmaXQgaWYgbmVjZXNzYXJ5LiAqLwpAQCAtNDc1LDYgKzQ1Myw4IEBACiAJc3RydWN0IGxheW91dF9jZWxsCSpsYywgKmxjcm93LCAqbGNjaGlsZDsKIAl1X2ludAkJCSBuLCB3aWR0aCwgaGVpZ2h0LCB1c2VkOwogCXVfaW50CQkJIGksIGosIGNvbHVtbnMsIHJvd3M7CisJaW50CQkJIHdyZW0sIHdyZW0xLCBocmVtOworCXVfaW50CQkJIHdpZHRoMSwgaGVpZ2h0MTsKIAogCWxheW91dF9wcmludF9jZWxsKHctPmxheW91dF9yb290LCBfX2Z1bmNfXywgMSk7CiAKQEAgLTQ5OCwxMiArNDc4LDEzIEBACiAJaGVpZ2h0ID0gKHctPnN5IC0gKHJvd3MgLSAxKSkgLyByb3dzOwogCWlmIChoZWlnaHQgPCBQQU5FX01JTklNVU0pCiAJCWhlaWdodCA9IFBBTkVfTUlOSU1VTTsKKwl3cmVtID0gdy0+c3ggLSAod2lkdGggKyAxKSAqIGNvbHVtbnMgKyAxOworCWhyZW0gPSB3LT5zeSAtIChoZWlnaHQgKyAxKSAqIHJvd3MgKyAxOwogCiAJLyogRnJlZSBvbGQgdHJlZSBhbmQgY3JlYXRlIGEgbmV3IHJvb3QuICovCiAJbGF5b3V0X2ZyZWUodyk7CiAJbGMgPSB3LT5sYXlvdXRfcm9vdCA9IGxheW91dF9jcmVhdGVfY2VsbChOVUxMKTsKLQlsYXlvdXRfc2V0X3NpemUobGMsICh3aWR0aCArIDEpICogY29sdW1ucyAtIDEsCi0JICAgIChoZWlnaHQgKyAxKSAqIHJvd3MgLSAxLCAwLCAwKTsKKwlsYXlvdXRfc2V0X3NpemUobGMsIHctPnN4LCB3LT5zeSwgMCwgMCk7CiAJbGF5b3V0X21ha2Vfbm9kZShsYywgTEFZT1VUX1RPUEJPVFRPTSk7CiAKIAkvKiBDcmVhdGUgYSBncmlkIG9mIHRoZSBjZWxscy4gKi8KQEAgLTUxNSw3ICs0OTYsOCBAQAogCiAJCS8qIENyZWF0ZSB0aGUgbmV3IHJvdy4gKi8KIAkJbGNyb3cgPSBsYXlvdXRfY3JlYXRlX2NlbGwobGMpOwotCQlsYXlvdXRfc2V0X3NpemUobGNyb3csIHctPnN4LCBoZWlnaHQsIDAsIDApOworCQloZWlnaHQxID0gaGVpZ2h0ICsgKGhyZW0tLSA+IDApOworCQlsYXlvdXRfc2V0X3NpemUobGNyb3csIHctPnN4LCBoZWlnaHQxLCAwLCAwKTsKIAkJVEFJTFFfSU5TRVJUX1RBSUwoJmxjLT5jZWxscywgbGNyb3csIGVudHJ5KTsKIAogCQkvKiBJZiBvbmx5IG9uZSBjb2x1bW4sIGp1c3QgdXNlIHRoZSByb3cgZGlyZWN0bHkuICovCkBAIC01MjYsMTMgKzUwOCwxNyBAQAogCQl9CiAKIAkJLyogQWRkIGluIHRoZSBjb2x1bW5zLiAqLworCQl3cmVtMSA9IHdyZW07CisJCXVzZWQgPSAwOwogCQlsYXlvdXRfbWFrZV9ub2RlKGxjcm93LCBMQVlPVVRfTEVGVFJJR0hUKTsKIAkJZm9yIChpID0gMDsgaSA8IGNvbHVtbnM7IGkrKykgewogCQkJLyogQ3JlYXRlIGFuZCBhZGQgYSBwYW5lIGNlbGwuICovCiAJCQlsY2NoaWxkID0gbGF5b3V0X2NyZWF0ZV9jZWxsKGxjcm93KTsKLQkJCWxheW91dF9zZXRfc2l6ZShsY2NoaWxkLCB3aWR0aCwgaGVpZ2h0LCAwLCAwKTsKKwkJCXdpZHRoMSA9IHdpZHRoICsgKHdyZW0xLS0gPiAwKTsKKwkJCWxheW91dF9zZXRfc2l6ZShsY2NoaWxkLCB3aWR0aDEsIGhlaWdodDEsIDAsIDApOwogCQkJbGF5b3V0X21ha2VfbGVhZihsY2NoaWxkLCB3cCk7CiAJCQlUQUlMUV9JTlNFUlRfVEFJTCgmbGNyb3ctPmNlbGxzLCBsY2NoaWxkLCBlbnRyeSk7CisJCQl1c2VkICs9IHdpZHRoMSArIDE7CiAKIAkJCS8qIE1vdmUgdG8gdGhlIG5leHQgY2VsbC4gKi8KIAkJCWlmICgod3AgPSBUQUlMUV9ORVhUKHdwLCBlbnRyeSkpID09IE5VTEwpCkBAIC01NDMsMjIgKzUyOSwxMyBAQAogCQkgKiBBZGp1c3QgdGhlIHJvdyBhbmQgY29sdW1ucyB0byBmaXQgdGhlIGZ1bGwgd2lkdGggaWYKIAkJICogbmVjZXNzYXJ5LgogCQkgKi8KLQkJaWYgKGkgPT0gY29sdW1ucykKLQkJCWktLTsKLQkJdXNlZCA9ICgoaSArIDEpICogKHdpZHRoICsgMSkpIC0gMTsKKwkJdXNlZC0tOwogCQlpZiAody0+c3ggPD0gdXNlZCkKIAkJCWNvbnRpbnVlOwogCQlsY2NoaWxkID0gVEFJTFFfTEFTVCgmbGNyb3ctPmNlbGxzLCBsYXlvdXRfY2VsbHMpOwogCQlsYXlvdXRfcmVzaXplX2FkanVzdChsY2NoaWxkLCBMQVlPVVRfTEVGVFJJR0hULCB3LT5zeCAtIHVzZWQpOwogCX0KIAotCS8qIEFkanVzdCB0aGUgbGFzdCByb3cgaGVpZ2h0IHRvIGZpdCBpZiBuZWNlc3NhcnkuICovCi0JdXNlZCA9IChyb3dzICogaGVpZ2h0KSArIHJvd3MgLSAxOwotCWlmICh3LT5zeSA+IHVzZWQpIHsKLQkJbGNyb3cgPSBUQUlMUV9MQVNUKCZsYy0+Y2VsbHMsIGxheW91dF9jZWxscyk7Ci0JCWxheW91dF9yZXNpemVfYWRqdXN0KGxjcm93LCBMQVlPVVRfVE9QQk9UVE9NLCB3LT5zeSAtIHVzZWQpOwotCX0KLQogCS8qIEZpeCBjZWxsIG9mZnNldHMuICovCiAJbGF5b3V0X2ZpeF9vZmZzZXRzKGxjKTsKIAlsYXlvdXRfZml4X3BhbmVzKHcsIHctPnN4LCB3LT5zeSk7Cg==