/* paiza POH! vol.2
* result:
* http://p...content-available-to-author-only...a.jp/poh/paizen/result/5111b574f1753713f0393d7e49ba0387
* author: Leonardone @ NEETSDKASU
*/
import java.util.*;
import java.lang.*;
import java.io.*;
class Main
{
public static void main (String[] args) throws java.lang.Exception
{
Paiza.getInstance().resolve(new MyResolver());
}
}
class MyResolver extends Paiza.Resolver
{
private int[][] space2right = null;
private int[][] space2bottom = null;
private int[][] result = null;
private int[] maxSpace2right = null;
private int[] maxSpace2bottom = null;
@Override
public void setHome(Paiza.Home home) {
super.setHome(home);
space2right = new int[home.getH()][home.getW()];
maxSpace2right = new int[home.getH()];
int allSpaceCount = 0;
for (int y = 0; y < home.getH(); y++) {
int count = 0, max = 0;
for (int x = home.getW() - 1; x >= 0; x--) {
if (home.isSpace(x, y)) {
count++;
allSpaceCount++;
if (count > max) {
max = count;
}
} else {
count = 0;
}
space2right[y][x] = count;
}
maxSpace2right[y] = max;
}
space2bottom = new int[home.getH()][home.getW()];
maxSpace2bottom = new int[home.getW()];
for (int x = 0; x < home.getW(); x++) {
int count = 0, max = 0;
for (int y = home.getH() - 1; y >= 0; y--) {
if (home.isSpace(x, y)) {
count++;
if (count > max) {
max = count;
}
} else {
count = 0;
}
space2bottom[y][x] = count;
}
maxSpace2bottom[x] = max;
}
result = new int[301][301];
result[1][1] = allSpaceCount + 1;
}
@Override
public int resolve(Paiza.Widget widget) {
if (result[widget.getS()][widget.getT()] > 0) {
return result[widget.getS()][widget.getT()] - 1;
}
int count;
if (widget.getS() > widget.getT()) {
count = resolve2bottom(widget);
} else {
count = resolve2right(widget);
}
result[widget.getS()][widget.getT()] = count + 1;
return count;
}
private int resolve2right(Paiza.Widget widget) {
int count = 0;
for (int y = 0; y <= home.getH() - widget.getS(); y++) {
for (int yy = y + widget.getS() - 1; yy > y; yy--) {
if (maxSpace2right[yy] < widget.getT()) {
y = yy;
break;
}
}
if (maxSpace2right[y] < widget.getT()) {
continue;
}
for (int x = 0; x <= home.getW() - widget.getT(); x++) {
if (space2bottom[y][x] >= widget.getS()) {
boolean placeable = true;
for (int dy = 0; placeable && dy < widget.getS(); dy++) {
if (space2right[y + dy][x] < widget.getT()) {
placeable = false;
x += space2right[y + dy][x];
}
}
if (placeable) {
count++;
}
} else if (space2right[y][x] < widget.getT()) {
x += space2right[y][x];
}
}
}
return count;
}
private int resolve2bottom(Paiza.Widget widget) {
int count = 0;
for (int x = 0; x <= home.getW() - widget.getT(); x++) {
for (int xx = x + widget.getT() - 1; xx > x; xx--) {
if (maxSpace2bottom[xx] < widget.getS()) {
x = xx;
break;
}
}
if (maxSpace2bottom[x] < widget.getS()) {
continue;
}
for (int y = 0; y <= home.getH() - widget.getS(); y++) {
if (space2right[y][x] >= widget.getT()) {
boolean placeable = true;
for (int dx = 0; placeable && dx < widget.getT(); dx++) {
if (space2bottom[y][x + dx] < widget.getS()) {
placeable = false;
y += space2bottom[y][x + dx];
}
}
if (placeable) {
count++;
}
} else if (space2bottom[y][x] < widget.getS()) {
y += space2bottom[y][x];
}
}
}
return count;
}
}
abstract class Resolver
{
protected Paiza.Home home;
public void setHome(Paiza.Home home) {
this.home = home;
}
public abstract int resolve(Paiza.Widget widget);
}
final class Paiza
{
public static abstract class Resolver
{
protected Paiza.Home home;
public void setHome(Paiza.Home home) {
this.home = home;
}
public abstract int resolve(Paiza.Widget widget);
}
public static Paiza getInstance() throws java.lang.Exception {
if (paiza == null) {
paiza = new Paiza();
}
return paiza;
}
public void resolve(Resolver resolver) {
init(resolver);
for (Widget widget : widgets) {
answer(resolver.resolve(widget));
}
flush();
}
public final class Home
{
private final int H;
private final int W;
private int[][] display;
private Home(int H, int W) {
this.H = H;
this.W = W;
display = new int[H][W];
}
private void setDisplay(int x, int y, int e) throws java.lang.Exception {
if (x < 0 || x >= W) {
throw new ArrayIndexOutOfBoundsException("x : " + x);
}
if (y < 0 || y >= H) {
throw new ArrayIndexOutOfBoundsException("y : " + y);
}
if (e != 0 && e != 1) {
throw new IllegalArgumentException("e");
}
display[y][x] = e;
}
public int getH() {
return H;
}
public int getW() {
return W;
}
public boolean isSpace(int x, int y) {
if (x < 0 || y < 0 || x >= W || y >= H) {
return false;
}
return display[y][x] == 0;
}
}
public final class Widget
{
private final int s;
private final int t;
private Widget(int s, int t) {
this.s = s;
this.t = t;
}
public int getS() {
return s;
}
public int getT() {
return t;
}
}
private static Paiza paiza = null;
private Home home;
private ArrayList<Widget> widgets;
private Paiza() throws java.lang.Exception {
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
String[] hw = in.readLine().split(" ");
home = new Home(Integer.parseInt(hw[0]), Integer.parseInt(hw[1]));
for (int y = 0; y < home.getH(); y++) {
String line = in.readLine();
for (int x = 0; x < home.getW(); x++) {
home.setDisplay(x, y, (int)(line.charAt(x) - '0'));
}
}
int N = Integer.parseInt(in.readLine());
widgets = new ArrayList<Widget>(N);
for (int i = 0; i< N; i++) {
String[] st = in.readLine().split(" ");
widgets.add(new Widget(Integer.parseInt(st[0]), Integer.parseInt(st[1])));
}
}
private StringBuilder output = null;
private static final String NEWLINE = System.getProperty("line.separator");
private void init(Resolver resolver) {
resolver.setHome(home);
output = new StringBuilder(widgets.size() * 6);
}
private void answer(int count) {
output.append(count);
output.append(NEWLINE);
}
private void flush() {
System.out.print(output);
}
}
LyogcGFpemEgUE9IISB2b2wuMgogKiByZXN1bHQ6CiAqIGh0dHA6Ly9wLi4uY29udGVudC1hdmFpbGFibGUtdG8tYXV0aG9yLW9ubHkuLi5hLmpwL3BvaC9wYWl6ZW4vcmVzdWx0LzUxMTFiNTc0ZjE3NTM3MTNmMDM5M2Q3ZTQ5YmEwMzg3CiAqIGF1dGhvcjogTGVvbmFyZG9uZSBAIE5FRVRTREtBU1UKICovCmltcG9ydCBqYXZhLnV0aWwuKjsKaW1wb3J0IGphdmEubGFuZy4qOwppbXBvcnQgamF2YS5pby4qOwoKY2xhc3MgTWFpbgp7CglwdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nW10gYXJncykgdGhyb3dzIGphdmEubGFuZy5FeGNlcHRpb24KCXsKCQlQYWl6YS5nZXRJbnN0YW5jZSgpLnJlc29sdmUobmV3IE15UmVzb2x2ZXIoKSk7Cgl9Cn0KCmNsYXNzIE15UmVzb2x2ZXIgZXh0ZW5kcyBQYWl6YS5SZXNvbHZlcgp7Cglwcml2YXRlIGludFtdW10gc3BhY2UycmlnaHQgPSBudWxsOwoJcHJpdmF0ZSBpbnRbXVtdIHNwYWNlMmJvdHRvbSA9IG51bGw7Cglwcml2YXRlIGludFtdW10gcmVzdWx0ID0gbnVsbDsKCXByaXZhdGUgaW50W10gbWF4U3BhY2UycmlnaHQgPSBudWxsOwoJcHJpdmF0ZSBpbnRbXSBtYXhTcGFjZTJib3R0b20gPSBudWxsOwoJCglAT3ZlcnJpZGUKCXB1YmxpYyB2b2lkIHNldEhvbWUoUGFpemEuSG9tZSBob21lKSB7CgkJc3VwZXIuc2V0SG9tZShob21lKTsKCQkKCQlzcGFjZTJyaWdodCA9IG5ldyBpbnRbaG9tZS5nZXRIKCldW2hvbWUuZ2V0VygpXTsKCQltYXhTcGFjZTJyaWdodCA9IG5ldyBpbnRbaG9tZS5nZXRIKCldOwoJCWludCBhbGxTcGFjZUNvdW50ID0gMDsKCQkKCQlmb3IgKGludCB5ID0gMDsgeSA8IGhvbWUuZ2V0SCgpOyB5KyspIHsKCQkJaW50IGNvdW50ID0gMCwgbWF4ID0gMDsKCQkJZm9yIChpbnQgeCA9IGhvbWUuZ2V0VygpIC0gMTsgeCA+PSAwOyB4LS0pIHsKCQkJCWlmIChob21lLmlzU3BhY2UoeCwgeSkpIHsKCQkJCQljb3VudCsrOwoJCQkJCWFsbFNwYWNlQ291bnQrKzsKCQkJCQlpZiAoY291bnQgPiBtYXgpIHsKCQkJCQkJbWF4ID0gY291bnQ7CgkJCQkJfQoJCQkJfSBlbHNlIHsKCQkJCQljb3VudCA9IDA7CgkJCQl9CgkJCQlzcGFjZTJyaWdodFt5XVt4XSA9IGNvdW50OwoJCQl9CgkJCW1heFNwYWNlMnJpZ2h0W3ldID0gbWF4OwoJCX0KCQkKCQlzcGFjZTJib3R0b20gPSBuZXcgaW50W2hvbWUuZ2V0SCgpXVtob21lLmdldFcoKV07CgkJbWF4U3BhY2UyYm90dG9tID0gbmV3IGludFtob21lLmdldFcoKV07CgkJCgkJZm9yIChpbnQgeCA9IDA7IHggPCBob21lLmdldFcoKTsgeCsrKSB7CgkJCWludCBjb3VudCA9IDAsIG1heCA9IDA7CgkJCWZvciAoaW50IHkgPSBob21lLmdldEgoKSAtIDE7IHkgPj0gMDsgeS0tKSB7CgkJCQlpZiAoaG9tZS5pc1NwYWNlKHgsIHkpKSB7CgkJCQkJY291bnQrKzsKCQkJCQlpZiAoY291bnQgPiBtYXgpIHsKCQkJCQkJbWF4ID0gY291bnQ7CgkJCQkJfQoJCQkJfSBlbHNlIHsKCQkJCQljb3VudCA9IDA7CgkJCQl9CgkJCQlzcGFjZTJib3R0b21beV1beF0gPSBjb3VudDsKCQkJfQoJCQltYXhTcGFjZTJib3R0b21beF0gPSBtYXg7CgkJfQoJCQoJCXJlc3VsdCA9IG5ldyBpbnRbMzAxXVszMDFdOwoJCXJlc3VsdFsxXVsxXSA9IGFsbFNwYWNlQ291bnQgKyAxOwoKCX0KCQoJQE92ZXJyaWRlCglwdWJsaWMgaW50IHJlc29sdmUoUGFpemEuV2lkZ2V0IHdpZGdldCkgewoJCWlmIChyZXN1bHRbd2lkZ2V0LmdldFMoKV1bd2lkZ2V0LmdldFQoKV0gPiAwKSB7CgkJCXJldHVybiByZXN1bHRbd2lkZ2V0LmdldFMoKV1bd2lkZ2V0LmdldFQoKV0gLSAxOwoJCX0KCQlpbnQgY291bnQ7CgkJaWYgKHdpZGdldC5nZXRTKCkgPiB3aWRnZXQuZ2V0VCgpKSB7CgkJCWNvdW50ID0gcmVzb2x2ZTJib3R0b20od2lkZ2V0KTsKCQl9IGVsc2UgewoJCQljb3VudCA9IHJlc29sdmUycmlnaHQod2lkZ2V0KTsKCQl9CgkJcmVzdWx0W3dpZGdldC5nZXRTKCldW3dpZGdldC5nZXRUKCldID0gY291bnQgKyAxOwoJCXJldHVybiBjb3VudDsKCX0KCQoJcHJpdmF0ZSBpbnQgcmVzb2x2ZTJyaWdodChQYWl6YS5XaWRnZXQgd2lkZ2V0KSB7CgkJaW50IGNvdW50ID0gMDsKCQlmb3IgKGludCB5ID0gMDsgeSA8PSBob21lLmdldEgoKSAtIHdpZGdldC5nZXRTKCk7IHkrKykgewoJCQlmb3IgKGludCB5eSA9IHkgKyB3aWRnZXQuZ2V0UygpIC0gMTsgeXkgPiB5OyB5eS0tKSB7CgkJCQlpZiAobWF4U3BhY2UycmlnaHRbeXldIDwgd2lkZ2V0LmdldFQoKSkgewoJCQkJCXkgPSB5eTsKCQkJCQlicmVhazsKCQkJCX0KCQkJfQoJCQlpZiAobWF4U3BhY2UycmlnaHRbeV0gPCB3aWRnZXQuZ2V0VCgpKSB7CgkJCQljb250aW51ZTsKCQkJfQoJCQlmb3IgKGludCB4ID0gMDsgeCA8PSBob21lLmdldFcoKSAtIHdpZGdldC5nZXRUKCk7IHgrKykgewoJCQkJaWYgKHNwYWNlMmJvdHRvbVt5XVt4XSA+PSB3aWRnZXQuZ2V0UygpKSB7CgkJCQkJYm9vbGVhbiBwbGFjZWFibGUgPSB0cnVlOwoJCQkJCWZvciAoaW50IGR5ID0gMDsgcGxhY2VhYmxlICYmIGR5IDwgd2lkZ2V0LmdldFMoKTsgZHkrKykgewoJCQkJCQlpZiAoc3BhY2UycmlnaHRbeSArIGR5XVt4XSA8IHdpZGdldC5nZXRUKCkpIHsKCQkJCQkJCXBsYWNlYWJsZSA9IGZhbHNlOwoJCQkJCQkJeCArPSBzcGFjZTJyaWdodFt5ICsgZHldW3hdOwoJCQkJCQl9CgkJCQkJfQoJCQkJCWlmIChwbGFjZWFibGUpIHsKCQkJCQkJY291bnQrKzsKCQkJCQl9CgkJCQl9IGVsc2UgaWYgKHNwYWNlMnJpZ2h0W3ldW3hdIDwgd2lkZ2V0LmdldFQoKSkgewoJCQkJCXggKz0gc3BhY2UycmlnaHRbeV1beF07CgkJCQl9CgkJCX0KCQl9CgkJcmV0dXJuIGNvdW50OwoJfQoKCXByaXZhdGUgaW50IHJlc29sdmUyYm90dG9tKFBhaXphLldpZGdldCB3aWRnZXQpIHsKCQlpbnQgY291bnQgPSAwOwoJCWZvciAoaW50IHggPSAwOyB4IDw9IGhvbWUuZ2V0VygpIC0gd2lkZ2V0LmdldFQoKTsgeCsrKSB7CgkJCWZvciAoaW50IHh4ID0geCArIHdpZGdldC5nZXRUKCkgLSAxOyB4eCA+IHg7IHh4LS0pIHsKCQkJCWlmIChtYXhTcGFjZTJib3R0b21beHhdIDwgd2lkZ2V0LmdldFMoKSkgewoJCQkJCXggPSB4eDsKCQkJCQlicmVhazsKCQkJCX0KCQkJfQoJCQlpZiAobWF4U3BhY2UyYm90dG9tW3hdIDwgd2lkZ2V0LmdldFMoKSkgewoJCQkJY29udGludWU7CgkJCX0KCQkJZm9yIChpbnQgeSA9IDA7IHkgPD0gaG9tZS5nZXRIKCkgLSB3aWRnZXQuZ2V0UygpOyB5KyspIHsKCQkJCWlmIChzcGFjZTJyaWdodFt5XVt4XSA+PSB3aWRnZXQuZ2V0VCgpKSB7CgkJCQkJYm9vbGVhbiBwbGFjZWFibGUgPSB0cnVlOwoJCQkJCWZvciAoaW50IGR4ID0gMDsgcGxhY2VhYmxlICYmIGR4IDwgd2lkZ2V0LmdldFQoKTsgZHgrKykgewoJCQkJCQlpZiAoc3BhY2UyYm90dG9tW3ldW3ggKyBkeF0gPCB3aWRnZXQuZ2V0UygpKSB7CgkJCQkJCQlwbGFjZWFibGUgPSBmYWxzZTsKCQkJCQkJCXkgKz0gc3BhY2UyYm90dG9tW3ldW3ggKyBkeF07CgkJCQkJCX0KCQkJCQl9CgkJCQkJaWYgKHBsYWNlYWJsZSkgewoJCQkJCQljb3VudCsrOwoJCQkJCX0KCQkJCX0gZWxzZSBpZiAoc3BhY2UyYm90dG9tW3ldW3hdIDwgd2lkZ2V0LmdldFMoKSkgewoJCQkJCXkgKz0gc3BhY2UyYm90dG9tW3ldW3hdOwoJCQkJfQoJCQl9CgkJfQoJCXJldHVybiBjb3VudDsKCX0KCn0KCgkKYWJzdHJhY3QgY2xhc3MgUmVzb2x2ZXIKewoJcHJvdGVjdGVkIFBhaXphLkhvbWUgaG9tZTsKCQoJcHVibGljIHZvaWQgc2V0SG9tZShQYWl6YS5Ib21lIGhvbWUpIHsKCQl0aGlzLmhvbWUgPSBob21lOwoJfQoKCXB1YmxpYyBhYnN0cmFjdCBpbnQgcmVzb2x2ZShQYWl6YS5XaWRnZXQgd2lkZ2V0KTsKfQoKZmluYWwgY2xhc3MgUGFpemEKewoJcHVibGljIHN0YXRpYyBhYnN0cmFjdCBjbGFzcyBSZXNvbHZlcgoJewoJCXByb3RlY3RlZCBQYWl6YS5Ib21lIGhvbWU7CgkJCgkJcHVibGljIHZvaWQgc2V0SG9tZShQYWl6YS5Ib21lIGhvbWUpIHsKCQkJdGhpcy5ob21lID0gaG9tZTsKCQl9CgkKCQlwdWJsaWMgYWJzdHJhY3QgaW50IHJlc29sdmUoUGFpemEuV2lkZ2V0IHdpZGdldCk7Cgl9CgkKCXB1YmxpYyBzdGF0aWMgUGFpemEgZ2V0SW5zdGFuY2UoKSB0aHJvd3MgamF2YS5sYW5nLkV4Y2VwdGlvbiB7CgkJaWYgKHBhaXphID09IG51bGwpIHsKCQkJcGFpemEgPSBuZXcgUGFpemEoKTsKCQl9CgkJcmV0dXJuIHBhaXphOwoJfQkKCglwdWJsaWMgdm9pZCByZXNvbHZlKFJlc29sdmVyIHJlc29sdmVyKSB7CgkJaW5pdChyZXNvbHZlcik7CgkJZm9yIChXaWRnZXQgd2lkZ2V0IDogd2lkZ2V0cykgewoJCQlhbnN3ZXIocmVzb2x2ZXIucmVzb2x2ZSh3aWRnZXQpKTsKCQl9CgkJZmx1c2goKTsKCX0KCgkKCXB1YmxpYyBmaW5hbCBjbGFzcyBIb21lCgl7CgkJcHJpdmF0ZSBmaW5hbCBpbnQgSDsKCQlwcml2YXRlIGZpbmFsIGludCBXOwoJCXByaXZhdGUgaW50W11bXSBkaXNwbGF5OwoJCXByaXZhdGUgSG9tZShpbnQgSCwgaW50IFcpIHsKCQkJdGhpcy5IID0gSDsKCQkJdGhpcy5XID0gVzsKCQkJZGlzcGxheSA9IG5ldyBpbnRbSF1bV107CgkJfQoJCQoJCXByaXZhdGUgdm9pZCBzZXREaXNwbGF5KGludCB4LCBpbnQgeSwgaW50IGUpIHRocm93cyBqYXZhLmxhbmcuRXhjZXB0aW9uIHsKCQkJaWYgKHggPCAwIHx8IHggPj0gVykgewoJCQkJdGhyb3cgbmV3IEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbigieCA6ICIgKyB4KTsKCQkJfQoJCQlpZiAoeSA8IDAgfHwgeSA+PSBIKSB7CgkJCQl0aHJvdyBuZXcgQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKCJ5IDogIiArIHkpOwoJCQl9CgkJCWlmIChlICE9IDAgJiYgZSAhPSAxKSB7CgkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJlIik7CgkJCX0KCQkJZGlzcGxheVt5XVt4XSA9IGU7CgkJfQoJCQoJCXB1YmxpYyBpbnQgZ2V0SCgpIHsKCQkJcmV0dXJuIEg7CgkJfQoJCQoJCXB1YmxpYyBpbnQgZ2V0VygpIHsKCQkJcmV0dXJuIFc7CgkJfQoJCQoJCXB1YmxpYyBib29sZWFuIGlzU3BhY2UoaW50IHgsIGludCB5KSB7CgkJCWlmICh4IDwgMCB8fCB5IDwgMCB8fCB4ID49IFcgfHwgeSA+PSBIKSB7CgkJCQlyZXR1cm4gZmFsc2U7CgkJCX0KCQkJcmV0dXJuIGRpc3BsYXlbeV1beF0gPT0gMDsKCQl9Cgl9CgkKCXB1YmxpYyBmaW5hbCBjbGFzcyBXaWRnZXQKCXsKCQlwcml2YXRlIGZpbmFsIGludCBzOwoJCXByaXZhdGUgZmluYWwgaW50IHQ7CgkJcHJpdmF0ZSBXaWRnZXQoaW50IHMsIGludCB0KSB7CgkJCXRoaXMucyA9IHM7CgkJCXRoaXMudCA9IHQ7CgkJfQoJCQoJCXB1YmxpYyBpbnQgZ2V0UygpIHsKCQkJcmV0dXJuIHM7CgkJfQoJCQoJCXB1YmxpYyBpbnQgZ2V0VCgpIHsKCQkJcmV0dXJuIHQ7CgkJfQoJfQoJCglwcml2YXRlIHN0YXRpYyBQYWl6YSBwYWl6YSA9IG51bGw7CgkKCXByaXZhdGUgSG9tZSBob21lOwoJcHJpdmF0ZSBBcnJheUxpc3Q8V2lkZ2V0PiB3aWRnZXRzOwoJCglwcml2YXRlIFBhaXphKCkgdGhyb3dzIGphdmEubGFuZy5FeGNlcHRpb24gewoJCUJ1ZmZlcmVkUmVhZGVyIGluID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBJbnB1dFN0cmVhbVJlYWRlcihTeXN0ZW0uaW4pKTsKCQlTdHJpbmdbXSBodyA9IGluLnJlYWRMaW5lKCkuc3BsaXQoIiAiKTsKCQlob21lID0gbmV3IEhvbWUoSW50ZWdlci5wYXJzZUludChod1swXSksIEludGVnZXIucGFyc2VJbnQoaHdbMV0pKTsKCQlmb3IgKGludCB5ID0gMDsgeSA8IGhvbWUuZ2V0SCgpOyB5KyspIHsKCQkJU3RyaW5nIGxpbmUgPSBpbi5yZWFkTGluZSgpOwoJCQlmb3IgKGludCB4ID0gMDsgeCA8IGhvbWUuZ2V0VygpOyB4KyspIHsKCQkJCWhvbWUuc2V0RGlzcGxheSh4LCB5LCAoaW50KShsaW5lLmNoYXJBdCh4KSAtICcwJykpOwoJCQl9CgkJfQoJCWludCBOID0gSW50ZWdlci5wYXJzZUludChpbi5yZWFkTGluZSgpKTsKCQl3aWRnZXRzID0gbmV3IEFycmF5TGlzdDxXaWRnZXQ+KE4pOwoJCWZvciAoaW50IGkgPSAwOyBpPCBOOyBpKyspIHsKCQkJU3RyaW5nW10gc3QgPSBpbi5yZWFkTGluZSgpLnNwbGl0KCIgIik7CgkJCXdpZGdldHMuYWRkKG5ldyBXaWRnZXQoSW50ZWdlci5wYXJzZUludChzdFswXSksIEludGVnZXIucGFyc2VJbnQoc3RbMV0pKSk7CgkJfQoJfQoJCglwcml2YXRlIFN0cmluZ0J1aWxkZXIgb3V0cHV0ID0gbnVsbDsKCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBORVdMSU5FID0gU3lzdGVtLmdldFByb3BlcnR5KCJsaW5lLnNlcGFyYXRvciIpOwoJCglwcml2YXRlIHZvaWQgaW5pdChSZXNvbHZlciByZXNvbHZlcikgewoJCXJlc29sdmVyLnNldEhvbWUoaG9tZSk7CgkJb3V0cHV0ID0gbmV3IFN0cmluZ0J1aWxkZXIod2lkZ2V0cy5zaXplKCkgKiA2KTsKCX0KCQoJcHJpdmF0ZSB2b2lkIGFuc3dlcihpbnQgY291bnQpIHsKCQlvdXRwdXQuYXBwZW5kKGNvdW50KTsKCQlvdXRwdXQuYXBwZW5kKE5FV0xJTkUpOwoJfQoKCXByaXZhdGUgdm9pZCBmbHVzaCgpIHsKCQlTeXN0ZW0ub3V0LnByaW50KG91dHB1dCk7Cgl9Cn0K