public class A {
	void f() {
		if (one != 1)
			doSomething();

		for (int i = 0; i < list.size(); i++) list.get(i).print();

		for (Printer printer : list) printer.print(myDocument);

		while (!queue.isEmpty())
			consume(queue.remove());

		do
			list.add(createElement());
		while (list.size() < 100);

		/* */while /* */ (condition)
			/* */ doSomething();
		/* */do
			/* */createElement();
		/* */ while/* */ (condition);
		/* */
		/* */ for /* */ (String s : strings) /* */ System.out.println(s);

		while (!queue.isEmpty())
			for (String s : queue.remove()) if (!s.isEmpty())
				print(s);
		for (int i = 0; i < 10; i++) for (int j = 0; j < 10; j++) sum += i * j;
		while (x-- > 0)
			while (y-- > 0)
				drawPoint(x, y);
		do
			for (String s : queue.remove()) if (!s.isEmpty())
				print(s);
		while (!queue.isEmpty());

		while (!queue.isEmpty()) {
			for (String s : queue.remove()) if (!s.isEmpty())
				print(s);
		}
		;
		for (int i = 0; i < 10; i++) for (int j = 0; j < 10; j++) {
			sum += i * j;
		}
		while (x-- > 0) {
			while (y-- > 0)
				while (z-- > 0)
					drawPoint(x, y, z);
		}
		do
			for (String s : queue.remove()) {
				if (!s.isEmpty())
					print(s);
			}
		while (!queue.isEmpty());

		while (aaaaaaaaaaaaaaaaaaaaaa.bbbbbbbbbbbbbbbbbbb().cccccccccccccccccccccc())
			ddddddddddddddddddddd.eeeeeeeeeeeeeeeee().fffffffffffffffffffff();
		do
			aaaaaaaaaaaaaaaaaaaaaa.bbbbbbbbbbbbbbbbbbb().cccccccccccccccccccccccc();
		while (ddddddddddddddddddddd.eeeeeeeeeeeeeeeee().fffffffffffffffffffff());
	}
}
