I2luY2x1ZGUgIm1sdGFsbi5oIgojaW5jbHVkZSAibWl5YXRhLmgiCiNpbmNsdWRlICJtaXlhdGE1LmgiCiNpbmNsdWRlICJETkEuaCIKCiNpbmNsdWRlICJKVFQuYyIKI2luY2x1ZGUgImJsb3N1bS5jIgoKI2RlZmluZSBERUJVRyAwCiNkZWZpbmUgVEVTVCAwCgojZGVmaW5lIE5PUk1BTElaRTEgMQoKc3RhdGljIGludCBzaGlzaGFnb255dXUoIGRvdWJsZSBpbiApCnsKCWludCBvdXQ7CglpZiAgICAgKCBpbiA+ICAwLjAgKSBvdXQgPSAoIChpbnQpKCBpbiArIDAuNSApICk7CgllbHNlIGlmKCBpbiA9PSAwLjAgKSBvdXQgPSAoIDAgKTsKCWVsc2UgaWYoIGluIDwgIDAuMCApIG91dCA9ICggKGludCkoIGluIC0gMC41ICkgKTsKCWVsc2UgICAgICAgICAgICAgICAgIG91dCA9IDA7CglyZXR1cm4oIG91dCApOwp9CgpzdGF0aWMgdm9pZCBjYWxjZnJlcV9udWMoIGludCBuc2VxLCBjaGFyICoqc2VxLCBkb3VibGUgKmRhdGFmcmVxICkKewoJaW50IGksIGosIGw7CglpbnQgYWFuOwoJZG91YmxlIHRvdGFsOwoJZm9yKCBpPTA7IGk8NDsgaSsrICkKCQlkYXRhZnJlcVtpXSA9IDAuMDsKCXRvdGFsID0gMC4wOwoJZm9yKCBpPTA7IGk8bnNlcTsgaSsrICkKCXsKCQlsID0gc3RybGVuKCBzZXFbaV0gKTsKCQlmb3IoIGo9MDsgajxsOyBqKysgKQoJCXsKCQkJYWFuID0gYW1pbm9fblsoaW50KXNlcVtpXVtqXV07CgkJCWlmKCBhYW4gPT0gNCApIGFhbiA9IDM7CgkJCWlmKCBhYW4gPj0gMCAmJiBhYW4gPCA0ICkKCQkJewoJCQkJZGF0YWZyZXFbYWFuXSArPSAxLjA7CgkJCQl0b3RhbCArPSAxLjA7CgkJCX0KCQl9Cgl9Cglmb3IoIGk9MDsgaTw0OyBpKysgKQoJCWlmKCBkYXRhZnJlcVtpXSA8IDAuMDAwMSApIGRhdGFmcmVxW2ldID0gMC4wMDAxOwoKI2lmIDAKCWZwcmludGYoIHN0ZGVyciwgIlxuZGF0YWZyZXEgPSAiICk7Cglmb3IoIGk9MDsgaTw0OyBpKysgKQoJCWZwcmludGYoIHN0ZGVyciwgIiUxMC4wZiAiLCBkYXRhZnJlcVtpXSApOwoJZnByaW50Ziggc3RkZXJyLCAiXG4iICk7CiNlbmRpZgoKCXRvdGFsID0gMC4wOyBmb3IoIGk9MDsgaTw0OyBpKysgKSB0b3RhbCArPSBkYXRhZnJlcVtpXTsKLy8JZnByaW50Ziggc3RkZXJyLCAidG90YWwgPSAlZlxuIiwgdG90YWwgKTsKCWZvciggaT0wOyBpPDQ7IGkrKyApIGRhdGFmcmVxW2ldIC89IChkb3VibGUpdG90YWw7Cn0KCnN0YXRpYyB2b2lkIGNhbGNmcmVxKCBpbnQgbnNlcSwgY2hhciAqKnNlcSwgZG91YmxlICpkYXRhZnJlcSApCnsKCWludCBpLCBqLCBsOwoJaW50IGFhbjsKCWRvdWJsZSB0b3RhbDsKCWZvciggaT0wOyBpPDIwOyBpKysgKQoJCWRhdGFmcmVxW2ldID0gMC4wOwoJdG90YWwgPSAwLjA7Cglmb3IoIGk9MDsgaTxuc2VxOyBpKysgKQoJewoJCWwgPSBzdHJsZW4oIHNlcVtpXSApOwoJCWZvciggaj0wOyBqPGw7IGorKyApCgkJewoJCQlhYW4gPSBhbWlub19uWyhpbnQpc2VxW2ldW2pdXTsKCQkJaWYoIGFhbiA+PSAwICYmIGFhbiA8IDIwICkKCQkJewoJCQkJZGF0YWZyZXFbYWFuXSArPSAxLjA7CgkJCQl0b3RhbCArPSAxLjA7CgkJCX0KCQl9Cgl9Cglmb3IoIGk9MDsgaTwyMDsgaSsrICkKCQlpZiggZGF0YWZyZXFbaV0gPCAwLjAwMDEgKSBkYXRhZnJlcVtpXSA9IDAuMDAwMTsKCglmcHJpbnRmKCBzdGRlcnIsICJkYXRhZnJlcSA9IFxuIiApOwoJZm9yKCBpPTA7IGk8MjA7IGkrKyApCgkJZnByaW50Ziggc3RkZXJyLCAiJWZcbiIsIGRhdGFmcmVxW2ldICk7CgoJdG90YWwgPSAwLjA7IGZvciggaT0wOyBpPDIwOyBpKysgKSB0b3RhbCArPSBkYXRhZnJlcVtpXTsKCWZwcmludGYoIHN0ZGVyciwgInRvdGFsID0gJWZcbiIsIHRvdGFsICk7Cglmb3IoIGk9MDsgaTwyMDsgaSsrICkgZGF0YWZyZXFbaV0gLz0gKGRvdWJsZSl0b3RhbDsKfQoKdm9pZCBjb25zdGFudHMoIGludCBuc2VxLCBjaGFyICoqc2VxICkKewoJaW50IGksIGosIHg7Ci8vCWRvdWJsZSB0bXA7CgoJaWYoIGRvcnAgPT0gJ2QnICkgIC8qIEROQSAqLwoJewoJCWludCBrLCBtOwoJCWRvdWJsZSBhdmVyYWdlOwoJCWRvdWJsZSAqKnBhbXggPSBBbGxvY2F0ZURvdWJsZU10eCggMTEsMTEgKTsKCQlkb3VibGUgKipwYW0xID0gQWxsb2NhdGVEb3VibGVNdHgoIDQsIDQgKTsKCQlkb3VibGUgKmZyZXEgPSBBbGxvY2F0ZURvdWJsZVZlYyggNCApOwoKCgkJc2NvcmVtdHggPSAtMTsKCQlpZiggUk5BcHBlbmFsdHkgPT0gTk9UU1BFQ0lGSUVEICkgUk5BcHBlbmFsdHkgPSBERUZBVUxUUk5BR09QX047CgkJaWYoIFJOQXBwZW5hbHR5X2V4ID09IE5PVFNQRUNJRklFRCApIFJOQXBwZW5hbHR5X2V4ID0gREVGQVVMVFJOQUdFUF9OOwoJCWlmKCBwcGVuYWx0eSA9PSBOT1RTUEVDSUZJRUQgKSBwcGVuYWx0eSA9IERFRkFVTFRHT1BfTjsKCQlpZiggcHBlbmFsdHlfT1AgPT0gTk9UU1BFQ0lGSUVEICkgcHBlbmFsdHlfT1AgPSBERUZBVUxUR09QX047CgkJaWYoIHBwZW5hbHR5X2V4ID09IE5PVFNQRUNJRklFRCApIHBwZW5hbHR5X2V4ID0gREVGQVVMVEdFUF9OOwoJCWlmKCBwcGVuYWx0eV9FWCA9PSBOT1RTUEVDSUZJRUQgKSBwcGVuYWx0eV9FWCA9IERFRkFVTFRHRVBfTjsKCQlpZiggcG9mZnNldCA9PSBOT1RTUEVDSUZJRUQgKSBwb2Zmc2V0ID0gREVGQVVMVE9GU19OOwoJCWlmKCBSTkFwdGhyID09IE5PVFNQRUNJRklFRCApIFJOQXB0aHIgPSBERUZBVUxUUk5BVEhSX047CgkJaWYoIHBhbU4gPT0gTk9UU1BFQ0lGSUVEICkgcGFtTiA9IERFRkFVTFRQQU1OOwoJCWlmKCBraW11cmFSID09IE5PVFNQRUNJRklFRCApIGtpbXVyYVIgPSAyOwoKCQlSTkFwZW5hbHR5ID0gKGludCkoIDMgKiA2MDAuMCAvIDEwMDAuMCAqIFJOQXBwZW5hbHR5ICsgMC41ICk7CgkJUk5BcGVuYWx0eV9leCA9IChpbnQpKCAzICogNjAwLjAgLyAxMDAwLjAgKiBSTkFwcGVuYWx0eV9leCArIDAuNSApOwovLwkJZnByaW50Ziggc3RkZXJyLCAiREVGQVVMVFJOQUdPUF9OID0gJWRcbiIsIERFRkFVTFRSTkFHT1BfTiApOwovLwkJZnByaW50Ziggc3RkZXJyLCAiUk5BcHBlbmFsdHkgPSAlZFxuIiwgUk5BcHBlbmFsdHkgKTsKLy8JCWZwcmludGYoIHN0ZGVyciwgIlJOQXBlbmFsdHkgPSAlZFxuIiwgUk5BcGVuYWx0eSApOwoKCgkJUk5BdGhyID0gKGludCkoIDMgKiA2MDAuMCAvIDEwMDAuMCAqIFJOQXB0aHIgKyAwLjUgKTsKCQlwZW5hbHR5ID0gKGludCkoIDMgKiA2MDAuMCAvIDEwMDAuMCAqIHBwZW5hbHR5ICsgMC41KTsKCQlwZW5hbHR5X09QID0gKGludCkoIDMgKiA2MDAuMCAvIDEwMDAuMCAqIHBwZW5hbHR5X09QICsgMC41KTsKCQlwZW5hbHR5X2V4ID0gKGludCkoIDMgKiA2MDAuMCAvIDEwMDAuMCAqIHBwZW5hbHR5X2V4ICsgMC41KTsKCQlwZW5hbHR5X0VYID0gKGludCkoIDMgKiA2MDAuMCAvIDEwMDAuMCAqIHBwZW5hbHR5X0VYICsgMC41KTsKCQlvZmZzZXQgPSAoaW50KSggMyAqIDYwMC4wIC8gMTAwMC4wICogcG9mZnNldCArIDAuNSk7CgkJb2Zmc2V0RkZUID0gKGludCkoIDMgKiA2MDAuMCAvIDEwMDAuMCAqICgtMCkgKyAwLjUpOwoJCW9mZnNldExOID0gKGludCkoIDMgKiA2MDAuMCAvIDEwMDAuMCAqIDEwMCArIDAuNSk7CgkJcGVuYWx0eUxOID0gKGludCkoIDMgKiA2MDAuMCAvIDEwMDAuMCAqIC0yMDAwICsgMC41KTsKCQlwZW5hbHR5X2V4TE4gPSAoaW50KSggMyAqIDYwMC4wIC8gMTAwMC4wICogLTEwMCArIDAuNSk7CgkJc3ByaW50ZiggbW9kZWxuYW1lLCAiJXMlZCAoJWQpLCAlNi4zZiAoJTYuM2YpLCAlNi4zZiAoJTYuM2YpIiwgcm5ha296bz8iUk5BIjoiRE5BIiwgcGFtTiwga2ltdXJhUiwKICAgICAgICAtKGRvdWJsZSlwcGVuYWx0eSowLjAwMSwgLShkb3VibGUpcHBlbmFsdHkqMC4wMDMsIC0oZG91YmxlKXBvZmZzZXQqMC4wMDEsIC0oZG91YmxlKXBvZmZzZXQqMC4wMDMgKTsKCgkJaWYoIGtpbXVyYVIgPT0gOTk5OSApIAoJCXsKCQkJZm9yKCBpPTA7IGk8NDsgaSsrICkgZm9yKCBqPTA7IGo8NDsgaisrICkgCgkJCQlwYW14W2ldW2pdID0gKGRvdWJsZSlsb2NuX2Rpc25baV1bal07CiNpZiBOT1JNQUxJWkUxCgkJCWF2ZXJhZ2UgPSAwLjA7CgkJCWZvciggaT0wOyBpPDQ7IGkrKyApIGZvciggaj0wOyBqPDQ7IGorKyApIAoJCQkJYXZlcmFnZSArPSBwYW14W2ldW2pdOwoJCQlhdmVyYWdlIC89IDE2LjA7CgkKICAgCSAgICAgaWYoIGRpc3AgKQoJCQkJZnByaW50Ziggc3RkZXJyLCAiYXZlcmFnZSA9ICVmXG4iLCBhdmVyYWdlICk7CgkKCQkJZm9yKCBpPTA7IGk8NDsgaSsrICkgZm9yKCBqPTA7IGo8NDsgaisrICkgCgkJCQlwYW14W2ldW2pdIC09IGF2ZXJhZ2U7CgkKCQkJZm9yKCBpPTA7IGk8NDsgaSsrICkgZm9yKCBqPTA7IGo8NDsgaisrICkKCQkJCXBhbXhbaV1bal0gKj0gNjAwLjAgLyBhdmVyYWdlOwoJCQkKCQkJZm9yKCBpPTA7IGk8NDsgaSsrICkgZm9yKCBqPTA7IGo8NDsgaisrICkKCQkJCXBhbXhbaV1bal0gLT0gb2Zmc2V0OyAKI2VuZGlmCgkJfQoJCWVsc2UKCQl7CgkJCQlkb3VibGUgZiA9IDAuOTk7CgkJCQlkb3VibGUgcyA9IChkb3VibGUpa2ltdXJhUiAvICggMiArIGtpbXVyYVIgKSAqIDAuMDE7CgkJCQlkb3VibGUgdiA9IChkb3VibGUpMSAgICAgICAvICggMiArIGtpbXVyYVIgKSAqIDAuMDE7CgkJCQlwYW0xWzBdWzBdID0gZjsgcGFtMVswXVsxXSA9IHM7IHBhbTFbMF1bMl0gPSB2OyBwYW0xWzBdWzNdID0gdjsKCQkJCXBhbTFbMV1bMF0gPSBzOyBwYW0xWzFdWzFdID0gZjsgcGFtMVsxXVsyXSA9IHY7IHBhbTFbMV1bM10gPSB2OwoJCQkJcGFtMVsyXVswXSA9IHY7IHBhbTFbMl1bMV0gPSB2OyBwYW0xWzJdWzJdID0gZjsgcGFtMVsyXVszXSA9IHM7CgkJCQlwYW0xWzNdWzBdID0gdjsgcGFtMVszXVsxXSA9IHY7IHBhbTFbM11bMl0gPSBzOyBwYW0xWzNdWzNdID0gZjsKCQoJCQkJZnByaW50Ziggc3RkZXJyLCAiZ2VuZXJhdGluZyAlZFBBTSBzY29yaW5nIG1hdHJpeCBmb3IgbnVjbGVvdGlkZXMgLi4uICIsIHBhbU4gKTsKCQoJCSAgICAgICAJaWYoIGRpc3AgKQogICAJCSAgICAJewogICAJCSAgICAgCQlmcHJpbnRmKCBzdGRlcnIsICIgVFBNIFxuIiApOwogICAJCSAgICAgICAgCWZvciggaT0wOyBpPDQ7IGkrKyApCiAgIAkJCSAgICAgICAJewogICAJCSAgICAgICAgICAgIAlmb3IoIGo9MDsgajw0OyBqKysgKQogICAJCSAgICAgICAgICAgICAgICAJZnByaW50Ziggc3RkZXJyLCAiJSsjNi4xMGYiLCBwYW0xW2ldW2pdICk7CiAgIAkJICAgICAgICAgICAgCWZwcmludGYoIHN0ZGVyciwgIlxuIiApOwogICAJCSAgICAgICAgCX0KICAgCQkgICAgICAgIAlmcHJpbnRmKCBzdGRlcnIsICJcbiIgKTsKICAgCQkgICAgIAl9CgkKCQoJCQkJTXR4dW50RG91YmxlKCBwYW14LCA0ICk7CgkJCQlmb3IoIHg9MDsgeCA8IHBhbU47IHgrKyApIE10eG1sdERvdWJsZSggcGFteCwgcGFtMSwgNCApOwoJCQkJZm9yKCBpPTA7IGk8NDsgaSsrICkgZm9yKCBqPTA7IGo8NDsgaisrICkKCQkJCQlwYW14W2ldW2pdIC89IDEuMCAvIDQuMDsKCQoJCQkJZm9yKCBpPTA7IGk8NDsgaSsrICkgZm9yKCBqPTA7IGo8NDsgaisrICkKCQkJCXsKCQkJCQlpZiggcGFteFtpXVtqXSA9PSAwLjAgKSAKCQkJCQl7CgkJCQkJCWZwcmludGYoIHN0ZGVyciwgIldBUk5JTkc6IHBhbXhbaV1bal0gPSAwLjAgP1xuIiApOwoJCQkJCQlwYW14W2ldW2pdID0gMC4wMDAwMTsgLyogYnkgSi4gVGhvbXBzb24gKi8KCQkJCQl9CgkJCQkJcGFteFtpXVtqXSA9IGxvZzEwKCBwYW14W2ldW2pdICkgKiAxMDAwLjA7CgkJCQl9CgkKICAgCSAgICAJCWlmKCBkaXNwICkKICAgCSAgICAJCXsKICAgCQkgICAgIAkJZnByaW50Ziggc3RkZXJyLCAiIGFmdGVyIGxvZ1xuIiApOwogICAJICAgICAgICAJCWZvciggaT0wOyBpPDQ7IGkrKyApCiAgIAkJICAgICAgIAkJewogICAJICAgICAgICAJICAgIAlmb3IoIGo9MDsgajw0OyBqKysgKQogICAJICAgICAgICAJICAgICAgICAJZnByaW50Ziggc3RkZXJyLCAiJSsjNi4xMGYiLCBwYW14W2ldW2pdICk7CiAgIAkgICAgICAgIAkgICAgCWZwcmludGYoIHN0ZGVyciwgIlxuIiApOwogICAJICAgICAgICAJCX0KICAgCSAgICAgICAgCQlmcHJpbnRmKCBzdGRlcnIsICJcbiIgKTsKICAgCQkgICAgIAl9CgoKLy8gPz8/Pz8KCQkJZm9yKCBpPTA7IGk8MjY7IGkrKyApIGFtaW5vW2ldID0gbG9jYW1pbm9uW2ldOwoJCQlmb3IoIGk9MDsgaTwweDgwOyBpKysgKSBhbWlub19uW2ldID0gLTE7CgkJCWZvciggaT0wOyBpPDI2OyBpKysgKSBhbWlub19uWyhpbnQpYW1pbm9baV1dID0gaTsKCQkJaWYoIGZtb2RlbCA9PSAxICkKCQkJCWNhbGNmcmVxX251YyggbnNlcSwgc2VxLCBmcmVxICk7CgkJCWVsc2UKCQkJewoJCQkJZnJlcVswXSA9IDAuMjU7CgkJCQlmcmVxWzFdID0gMC4yNTsKCQkJCWZyZXFbMl0gPSAwLjI1OwoJCQkJZnJlcVszXSA9IDAuMjU7CgkJCX0KLy8JCQlmcHJpbnRmKCBzdGRlcnIsICJhLCBmcmVxWzBdID0gJWZcbiIsIGZyZXFbMF0gKTsKLy8JCQlmcHJpbnRmKCBzdGRlcnIsICJnLCBmcmVxWzFdID0gJWZcbiIsIGZyZXFbMV0gKTsKLy8JCQlmcHJpbnRmKCBzdGRlcnIsICJjLCBmcmVxWzJdID0gJWZcbiIsIGZyZXFbMl0gKTsKLy8JCQlmcHJpbnRmKCBzdGRlcnIsICJ0LCBmcmVxWzNdID0gJWZcbiIsIGZyZXFbM10gKTsKCgkJCQoJCQlhdmVyYWdlID0gMC4wOwoJCQlmb3IoIGk9MDsgaTw0OyBpKysgKSBmb3IoIGo9MDsgajw0OyBqKysgKQoJCQkJYXZlcmFnZSArPSBwYW14W2ldW2pdICogZnJlcVtpXSAqIGZyZXFbal07CgkJCWZvciggaT0wOyBpPDQ7IGkrKyApIGZvciggaj0wOyBqPDQ7IGorKyApCgkJCQlwYW14W2ldW2pdIC09IGF2ZXJhZ2U7CgoJCQlhdmVyYWdlID0gMC4wOwoJCQlmb3IoIGk9MDsgaTw0OyBpKysgKQoJCQkJYXZlcmFnZSArPSBwYW14W2ldW2ldICogMS4wIC8gNC4wOwoKCQkJZm9yKCBpPTA7IGk8NDsgaSsrICkgZm9yKCBqPTA7IGo8NDsgaisrICkKCQkJCXBhbXhbaV1bal0gKj0gNjAwLjAgLyBhdmVyYWdlOwoKCgkJCWZvciggaT0wOyBpPDQ7IGkrKyApIGZvciggaj0wOyBqPDQ7IGorKyApCgkJCQlwYW14W2ldW2pdIC09IG9mZnNldDsgICAgICAgIC8qIGV4dGVuZGluZyBnYXAgY29zdCAqLwoKCQkJZm9yKCBpPTA7IGk8NDsgaSsrICkgZm9yKCBqPTA7IGo8NDsgaisrICkKCQkJCXBhbXhbaV1bal0gPSBzaGlzaGFnb255dXUoIHBhbXhbaV1bal0gKTsKCiAgICAgICAJCWlmKCBkaXNwICkKICAgICAgIAkJewogICAgICAgIAkJZnByaW50Ziggc3RkZXJyLCAiIGFmdGVyIHNoaXNoYWdvbnl1dVxuIiApOwogICAgICAgICAgIAkJZm9yKCBpPTA7IGk8NDsgaSsrICkKICAgCSAgICAgICAJCXsKICAgICAgICAgICAJICAgIAlmb3IoIGo9MDsgajw0OyBqKysgKQogICAgICAgICAgIAkgICAgICAgIAlmcHJpbnRmKCBzdGRlcnIsICIlKyM2LjEwZiIsIHBhbXhbaV1bal0gKTsKICAgICAgICAgICAJICAgIAlmcHJpbnRmKCBzdGRlcnIsICJcbiIgKTsKICAgICAgICAgICAJCX0KICAgICAgICAgICAJCWZwcmludGYoIHN0ZGVyciwgIlxuIiApOwogICAgICAgIAl9CgkJCWZwcmludGYoIHN0ZGVyciwgImRvbmVcbiIgKTsKCQl9CgkKCQlmb3IoIGk9MDsgaTw1OyBpKysgKSAKCQl7CgkJCXBhbXhbNF1baV0gPSBwYW14WzNdW2ldOwoJCQlwYW14W2ldWzRdID0gcGFteFtpXVszXTsKCQl9CQoKCQlmb3IoIGk9NTsgaTwxMDsgaSsrICkgZm9yKCBqPTU7IGo8MTA7IGorKyApCgkJewoJCQlwYW14W2ldW2pdID0gcGFteFtpLTVdW2otNV07CgkJfQoJCiAgICAgICAJaWYoIGRpc3AgKQogICAgICAgCXsKICAgICAgIAkJZnByaW50Ziggc3RkZXJyLCAiIGJlZm9yZSBkaXNcbiIgKTsKICAgICAgICAgIAlmb3IoIGk9MDsgaTw0OyBpKysgKQogICAJICAgICAgIAl7CiAgICAgICAgICAgCSAgIAlmb3IoIGo9MDsgajw0OyBqKysgKQogICAgICAgICAgIAkgICAgICAgCWZwcmludGYoIHN0ZGVyciwgIiUrIzYuMTBmIiwgcGFteFtpXVtqXSApOwogICAgICAgICAgIAkgICAJZnByaW50Ziggc3RkZXJyLCAiXG4iICk7CiAgICAgICAgICAgCX0KICAgICAgICAgICAJZnByaW50Ziggc3RkZXJyLCAiXG4iICk7CiAgICAgICAgfQoKICAgICAgIAlpZiggZGlzcCApCiAgICAgICAJewogICAgICAgIAlmcHJpbnRmKCBzdGRlcnIsICIgc2NvcmUgbWF0cml4ICBcbiIgKTsKICAgICAgICAgICAJZm9yKCBpPTA7IGk8NDsgaSsrICkKICAgCSAgICAgICAJewogICAgICAgICAgICAgICAJZm9yKCBqPTA7IGo8NDsgaisrICkKICAgICAgICAgICAgICAgICAgIAlmcHJpbnRmKCBzdGRlcnIsICIlKyM2LjEwZiIsIHBhbXhbaV1bal0gKTsKICAgICAgICAgICAgICAgCWZwcmludGYoIHN0ZGVyciwgIlxuIiApOwogICAgICAgICAgIAl9CiAgICAgICAgICAgCWZwcmludGYoIHN0ZGVyciwgIlxuIiApOwogICAgICAgIH0KCgkJZm9yKCBpPTA7IGk8MjY7IGkrKyApIGFtaW5vW2ldID0gbG9jYW1pbm9uW2ldOwoJCWZvciggaT0wOyBpPDI2OyBpKysgKSBhbWlub19ncnBbKGludClhbWlub1tpXV0gPSBsb2NncnBuW2ldOwoJCWZvciggaT0wOyBpPDI2OyBpKysgKSBmb3IoIGo9MDsgajwyNjsgaisrICkgbl9kaXNbaV1bal0gPSAwOwoJCWZvciggaT0wOyBpPDEwOyBpKysgKSBmb3IoIGo9MDsgajwxMDsgaisrICkgbl9kaXNbaV1bal0gPSBzaGlzaGFnb255dXUoIHBhbXhbaV1bal0gKTsKICAgICAgICBpZiggZGlzcCApCiAgICAgICAgewogICAgICAgICAgICBmcHJpbnRmKCBzdGRlcnIsICIgc2NvcmUgbWF0cml4ICBcbiIgKTsKICAgICAgICAgICAgZm9yKCBpPTA7IGk8MjY7IGkrKyApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGZvciggaj0wOyBqPDI2OyBqKysgKQogICAgICAgICAgICAgICAgICAgIGZwcmludGYoIHN0ZGVyciwgIiUrNmQiLCBuX2Rpc1tpXVtqXSApOwogICAgICAgICAgICAgICAgZnByaW50Ziggc3RkZXJyLCAiXG4iICk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZnByaW50Ziggc3RkZXJyLCAiXG4iICk7CiAgICAgICAgfQoKLy8gUklCT1NVTQojaWYgMQoJCWF2ZXJhZ2UgPSAwLjA7CgkJZm9yKCBpPTA7IGk8NDsgaSsrICkgZm9yKCBqPTA7IGo8NDsgaisrICkKCQkJYXZlcmFnZSArPSByaWJvc3VtNFtpXVtqXSAqIGZyZXFbaV0gKiBmcmVxW2pdOwoJCWZvciggaT0wOyBpPDQ7IGkrKyApIGZvciggaj0wOyBqPDQ7IGorKyApCgkJCXJpYm9zdW00W2ldW2pdIC09IGF2ZXJhZ2U7CgoJCWF2ZXJhZ2UgPSAwLjA7CgkJZm9yKCBpPTA7IGk8NDsgaSsrICkgZm9yKCBqPTA7IGo8NDsgaisrICkgZm9yKCBrPTA7IGs8NDsgaysrICkgZm9yKCBtPTA7IG08NDsgbSsrICkKCQl7Ci8vCQkJaWYoIGklND09MCYmaiU0PT0zIHx8IGklND09MyYmaiU0PT0wIHx8IGklND09MSYmaiU0PT0yIHx8IGklND09MiYmaiU0PT0xIHx8IGklND09MSYmaiU0PT0zIHx8IGklND09MyYmaiU0PT0xICkKLy8JCQlpZiggayU0PT0wJiZtJTQ9PTMgfHwgayU0PT0zJiZtJTQ9PTAgfHwgayU0PT0xJiZtJTQ9PTIgfHwgayU0PT0yJiZtJTQ9PTEgfHwgayU0PT0xJiZtJTQ9PTMgfHwgayU0PT0zJiZtJTQ9PTEgKQoJCQkJYXZlcmFnZSArPSByaWJvc3VtMTZbaSo0K2pdW2sqNCttXSAqIGZyZXFbaV0gKiBmcmVxW2pdICogZnJlcVtrXSAqIGZyZXFbbV07CgkJfQoJCWZvciggaT0wOyBpPDE2OyBpKysgKSBmb3IoIGo9MDsgajwxNjsgaisrICkKCQkJcmlib3N1bTE2W2ldW2pdIC09IGF2ZXJhZ2U7CgoJCWF2ZXJhZ2UgPSAwLjA7CgkJZm9yKCBpPTA7IGk8NDsgaSsrICkKCQkJYXZlcmFnZSArPSByaWJvc3VtNFtpXVtpXSAqIGZyZXFbaV07CgkJZm9yKCBpPTA7IGk8NDsgaSsrICkgZm9yKCBqPTA7IGo8NDsgaisrICkKCQkJcmlib3N1bTRbaV1bal0gKj0gNjAwLjAgLyBhdmVyYWdlOwoKCQlhdmVyYWdlID0gMC4wOwoJCWF2ZXJhZ2UgKz0gcmlib3N1bTE2WzAqNCszXVswKjQrM10gKiBmcmVxWzBdICogZnJlcVszXTsgLy8gQVUKCQlhdmVyYWdlICs9IHJpYm9zdW0xNlszKjQrMF1bMyo0KzBdICogZnJlcVszXSAqIGZyZXFbMF07IC8vIFVBCgkJYXZlcmFnZSArPSByaWJvc3VtMTZbMSo0KzJdWzEqNCsyXSAqIGZyZXFbMV0gKiBmcmVxWzJdOyAvLyBDRwoJCWF2ZXJhZ2UgKz0gcmlib3N1bTE2WzIqNCsxXVsyKjQrMV0gKiBmcmVxWzJdICogZnJlcVsxXTsgLy8gR0MKCQlhdmVyYWdlICs9IHJpYm9zdW0xNlsxKjQrM11bMSo0KzNdICogZnJlcVsxXSAqIGZyZXFbM107IC8vIEdVCgkJYXZlcmFnZSArPSByaWJvc3VtMTZbMyo0KzFdWzMqNCsxXSAqIGZyZXFbM10gKiBmcmVxWzFdOyAvLyBVRwoJCWZvciggaT0wOyBpPDE2OyBpKysgKSBmb3IoIGo9MDsgajwxNjsgaisrICkKCQkJcmlib3N1bTE2W2ldW2pdICo9IDYwMC4wIC8gYXZlcmFnZTsKCgojaWYgMQoJCWZvciggaT0wOyBpPDQ7IGkrKyApIGZvciggaj0wOyBqPDQ7IGorKyApCgkJCXJpYm9zdW00W2ldW2pdIC09IG9mZnNldDsgICAgICAgIC8qIGV4dGVuZGluZyBnYXAgY29zdCA/Pz8/PyovCgkJZm9yKCBpPTA7IGk8MTY7IGkrKyApIGZvciggaj0wOyBqPDE2OyBqKysgKQoJCQlyaWJvc3VtMTZbaV1bal0gLT0gb2Zmc2V0OyAgICAgICAgLyogZXh0ZW5kaW5nIGdhcCBjb3N0ID8/Pz8/Ki8KI2VuZGlmCgoJCWZvciggaT0wOyBpPDQ7IGkrKyApIGZvciggaj0wOyBqPDQ7IGorKyApCgkJCXJpYm9zdW00W2ldW2pdID0gc2hpc2hhZ29ueXV1KCByaWJvc3VtNFtpXVtqXSApOwoJCWZvciggaT0wOyBpPDE2OyBpKysgKSBmb3IoIGo9MDsgajwxNjsgaisrICkKCQkJcmlib3N1bTE2W2ldW2pdID0gc2hpc2hhZ29ueXV1KCByaWJvc3VtMTZbaV1bal0gKTsKCiAgCQlpZiggZGlzcCApCiAgIAkJewogICAgIAkJZnByaW50Ziggc3RkZXJyLCAicmlib3N1bSBhZnRlciBzaGlzaGFnb255dXVcbiIgKTsKICAgICAgIAkJZm9yKCBpPTA7IGk8NDsgaSsrICkKICAgICAgIAkJewogICAgICAgCSAgICAJZm9yKCBqPTA7IGo8NDsgaisrICkKICAgICAgIAkgICAgICAgIAlmcHJpbnRmKCBzdGRlcnIsICIlKyM2LjEwZiIsIHJpYm9zdW00W2ldW2pdICk7CiAgICAgICAJICAgIAlmcHJpbnRmKCBzdGRlcnIsICJcbiIgKTsKICAgICAgIAkJfQogICAgICAgCQlmcHJpbnRmKCBzdGRlcnIsICJcbiIgKTsKICAgICAJCWZwcmludGYoIHN0ZGVyciwgInJpYm9zdW0xNiBhZnRlciBzaGlzaGFnb255dXVcbiIgKTsKICAgICAgIAkJZm9yKCBpPTA7IGk8MTY7IGkrKyApCiAgICAgICAJCXsKICAgICAgIAkgICAgCWZvciggaj0wOyBqPDE2OyBqKysgKQogICAgICAgCSAgICAgICAgCWZwcmludGYoIHN0ZGVyciwgIiUrIzcuMGYiLCByaWJvc3VtMTZbaV1bal0gKTsKICAgICAgIAkgICAgCWZwcmludGYoIHN0ZGVyciwgIlxuIiApOwogICAgICAgCQl9CiAgICAgICAJCWZwcmludGYoIHN0ZGVyciwgIlxuIiApOwogICAgICAJfQoJCWZwcmludGYoIHN0ZGVyciwgImRvbmVcbiIgKTsKCiNpZiAxCgkJZm9yKCBpPTA7IGk8Mzc7IGkrKyApIGZvciggaj0wOyBqPDM3OyBqKysgKSByaWJvc3VtZGlzW2ldW2pdID0gMC4wOyAvL2lydQoJCWZvciggbT0wOyBtPDk7IG0rKyApIGZvciggaT0wOyBpPDQ7IGkrKyApIC8vIGxvb3AKCQkJZm9yKCBrPTA7IGs8OTsgaysrICkgZm9yKCBqPTA7IGo8NDsgaisrICkgcmlib3N1bWRpc1ttKjQraV1bayo0K2pdID0gcmlib3N1bTRbaV1bal07IC8vIGxvb3AtbG9vcAovLwkJCWZvciggaz0wOyBrPDk7IGsrKyApIGZvciggaj0wOyBqPDQ7IGorKyApIHJpYm9zdW1kaXNbbSo0K2ldW2sqNCtqXSA9IG5fZGlzW2ldW2pdOyAvLyBsb29wLWxvb3AKCgkJZm9yKCBpPTA7IGk8MTY7IGkrKyApIGZvciggaj0wOyBqPDE2OyBqKysgKSByaWJvc3VtZGlzW2krNF1bais0XSA9IHJpYm9zdW0xNltpXVtqXTsgLy8gc3RlbTUtc3RlbTUKCQlmb3IoIGk9MDsgaTwxNjsgaSsrICkgZm9yKCBqPTA7IGo8MTY7IGorKyApIHJpYm9zdW1kaXNbaSsyMF1baisyMF0gPSByaWJvc3VtMTZbaV1bal07IC8vIHN0ZW01LXN0ZW01CiNlbHNlIC8vIGRvIG5vdCB1c2Ugcmlib3N1bQoJCWZvciggaT0wOyBpPDM3OyBpKysgKSBmb3IoIGo9MDsgajwzNzsgaisrICkgcmlib3N1bWRpc1tpXVtqXSA9IDAuMDsgLy9pcnUKCQlmb3IoIG09MDsgbTw5OyBtKysgKSBmb3IoIGk9MDsgaTw0OyBpKysgKSAvLyBsb29wCgkJCWZvciggaz0wOyBrPDk7IGsrKyApIGZvciggaj0wOyBqPDQ7IGorKyApIHJpYm9zdW1kaXNbbSo0K2ldW2sqNCtqXSA9IG5fZGlzW2ldW2pdOyAvLyBsb29wLWxvb3AKI2VuZGlmCgogIAkJaWYoIGRpc3AgKQogICAJCXsKICAgICAJCWZwcmludGYoIHN0ZGVyciwgInJpYm9zdW1kaXNcbiIgKTsKICAgICAgIAkJZm9yKCBpPTA7IGk8Mzc7IGkrKyApCiAgICAgICAJCXsKICAgICAgIAkgICAgCWZvciggaj0wOyBqPDM3OyBqKysgKQogICAgICAgCSAgICAgICAgCWZwcmludGYoIHN0ZGVyciwgIiUrNWQiLCByaWJvc3VtZGlzW2ldW2pdICk7CiAgICAgICAJICAgIAlmcHJpbnRmKCBzdGRlcnIsICJcbiIgKTsKICAgICAgIAkJfQogICAgICAgCQlmcHJpbnRmKCBzdGRlcnIsICJcbiIgKTsKICAgICAgCX0KCQlmcHJpbnRmKCBzdGRlcnIsICJkb25lXG4iICk7CiNlbmRpZgoKCQlGcmVlRG91YmxlTXR4KCBwYW0xICk7CgkJRnJlZURvdWJsZU10eCggcGFteCApOwoJCWZyZWUoIGZyZXEgKTsKCgl9CgllbHNlIGlmKCBkb3JwID09ICdwJyAmJiBzY29yZW10eCA9PSAxICkgIC8qIEJsb3N1bSAqLwoJewoJCWRvdWJsZSAqZnJlcTsKCQlkb3VibGUgKmZyZXExOwoJCWRvdWJsZSAqZGF0YWZyZXE7CgkJZG91YmxlIGF2ZXJhZ2U7Ci8vCQlkb3VibGUgdG1wOwoJCWRvdWJsZSAqKm5fZGlzdG1wOwoKCQluX2Rpc3RtcCA9IEFsbG9jYXRlRG91YmxlTXR4KCAyMCwgMjAgKTsKCQlkYXRhZnJlcSA9IEFsbG9jYXRlRG91YmxlVmVjKCAyMCApOwoJCWZyZXEgPSBBbGxvY2F0ZURvdWJsZVZlYyggMjAgKTsKCgkJaWYoIHBwZW5hbHR5ID09IE5PVFNQRUNJRklFRCApIHBwZW5hbHR5ID0gREVGQVVMVEdPUF9COwoJCWlmKCBwcGVuYWx0eV9PUCA9PSBOT1RTUEVDSUZJRUQgKSBwcGVuYWx0eV9PUCA9IERFRkFVTFRHT1BfQjsKCQlpZiggcHBlbmFsdHlfZXggPT0gTk9UU1BFQ0lGSUVEICkgcHBlbmFsdHlfZXggPSBERUZBVUxUR0VQX0I7CgkJaWYoIHBwZW5hbHR5X0VYID09IE5PVFNQRUNJRklFRCApIHBwZW5hbHR5X0VYID0gREVGQVVMVEdFUF9COwoJCWlmKCBwb2Zmc2V0ID09IE5PVFNQRUNJRklFRCApIHBvZmZzZXQgPSBERUZBVUxUT0ZTX0I7CgkJaWYoIHBhbU4gPT0gTk9UU1BFQ0lGSUVEICkgcGFtTiA9IDA7CgkJaWYoIGtpbXVyYVIgPT0gTk9UU1BFQ0lGSUVEICkga2ltdXJhUiA9IDE7CgkJcGVuYWx0eSA9IChpbnQpKCA2MDAuMCAvIDEwMDAuMCAqIHBwZW5hbHR5ICsgMC41ICk7CgkJcGVuYWx0eV9PUCA9IChpbnQpKCA2MDAuMCAvIDEwMDAuMCAqIHBwZW5hbHR5X09QICsgMC41ICk7CgkJcGVuYWx0eV9leCA9IChpbnQpKCA2MDAuMCAvIDEwMDAuMCAqIHBwZW5hbHR5X2V4ICsgMC41ICk7CgkJcGVuYWx0eV9FWCA9IChpbnQpKCA2MDAuMCAvIDEwMDAuMCAqIHBwZW5hbHR5X0VYICsgMC41ICk7CgkJb2Zmc2V0ID0gKGludCkoIDYwMC4wIC8gMTAwMC4wICogcG9mZnNldCArIDAuNSApOwoJCW9mZnNldEZGVCA9IChpbnQpKCA2MDAuMCAvIDEwMDAuMCAqICgtMCkgKyAwLjUpOwoJCW9mZnNldExOID0gKGludCkoIDYwMC4wIC8gMTAwMC4wICogMTAwICsgMC41KTsKCQlwZW5hbHR5TE4gPSAoaW50KSggNjAwLjAgLyAxMDAwLjAgKiAtMjAwMCArIDAuNSk7CgkJcGVuYWx0eV9leExOID0gKGludCkoIDYwMC4wIC8gMTAwMC4wICogLTEwMCArIDAuNSk7CgoJCUJMT1NVTW10eCggbmJsb3N1bSwgbl9kaXN0bXAsIGZyZXEsIGFtaW5vLCBhbWlub19ncnAgKTsKCQlpZiggbmJsb3N1bSA9PSAtMSApCgkJCXNwcmludGYoIG1vZGVsbmFtZSwgIlVzZXItZGVmaW5lZCwgJTYuM2YsICUrNi4zZiwgJSs2LjNmIiwgLShkb3VibGUpcHBlbmFsdHkvMTAwMCwgLShkb3VibGUpcG9mZnNldC8xMDAwLCAtKGRvdWJsZSlwcGVuYWx0eV9leC8xMDAwICk7CgkJZWxzZQoJCQlzcHJpbnRmKCBtb2RlbG5hbWUsICJCTE9TVU0lZCwgJTYuM2YsICUrNi4zZiwgJSs2LjNmIiwgbmJsb3N1bSwgLShkb3VibGUpcHBlbmFsdHkvMTAwMCwgLShkb3VibGUpcG9mZnNldC8xMDAwLCAtKGRvdWJsZSlwcGVuYWx0eV9leC8xMDAwICk7CiNpZiAwCgkJZm9yKCBpPTA7IGk8MjY7IGkrKyApIGFtaW5vW2ldID0gbG9jYW1pbm9kW2ldOwoJCWZvciggaT0wOyBpPDI2OyBpKysgKSBhbWlub19ncnBbKGludClhbWlub1tpXV0gPSBsb2NncnBkW2ldOwoJCWZvciggaT0wOyBpPDB4ODA7IGkrKyApIGFtaW5vX25baV0gPSAwOwoJCWZvciggaT0wOyBpPDI2OyBpKysgKSBhbWlub19uWyhpbnQpYW1pbm9baV1dID0gaTsKI2VuZGlmCgkJZm9yKCBpPTA7IGk8MHg4MDsgaSsrIClhbWlub19uW2ldID0gLTE7CgkJZm9yKCBpPTA7IGk8MjY7IGkrKykgYW1pbm9fblsoaW50KWFtaW5vW2ldXSA9IGk7CgkJaWYoIGZtb2RlbCA9PSAxICkKCQl7CgkJCWNhbGNmcmVxKCBuc2VxLCBzZXEsIGRhdGFmcmVxICk7CgkJCWZyZXExID0gZGF0YWZyZXE7CgkJfQoJCWVsc2UKCQkJZnJlcTEgPSBmcmVxOwojaWYgVEVTVAoJCWZwcmludGYoIHN0ZGVyciwgInJhdyBzY29yZWluZyBtYXRyaXggOiBcbiIgKTsKCQlmb3IoIGk9MDsgaTwyMDsgaSsrICkKCQl7CgkJCWZvciggaj0wOyBqPDIwOyBqKysgKSAKCQkJewoJCQkJZnByaW50Ziggc3Rkb3V0LCAiJTYuMmYiLCBuX2Rpc3RtcFtpXVtqXSApOwoJCQl9CgkJCWZwcmludGYoIHN0ZG91dCwgIlxuIiApOwoJCX0KI2VuZGlmCgkJaWYoIGZtb2RlbCA9PSAtMSApCgkJCWF2ZXJhZ2UgPSAwLjA7CgkJZWxzZQoJCXsKCQkJZm9yKCBpPTA7IGk8MjA7IGkrKyApCiNpZiBURVNUIAoJCQkJZnByaW50Ziggc3Rkb3V0LCAiZnJlcVslY10gPSAlZiwgZGF0YWZyZXFbJWNdID0gJWYsIGZyZXExW10gPSAlZlxuIiwgYW1pbm9baV0sIGZyZXFbaV0sIGFtaW5vW2ldLCBkYXRhZnJlcVtpXSwgZnJlcTFbaV0gKTsKI2VuZGlmCgkJCWF2ZXJhZ2UgPSAwLjA7CgkJCWZvciggaT0wOyBpPDIwOyBpKysgKSBmb3IoIGo9MDsgajwyMDsgaisrICkKCQkJCWF2ZXJhZ2UgKz0gbl9kaXN0bXBbaV1bal0gKiBmcmVxMVtpXSAqIGZyZXExW2pdOwoJCX0KI2lmIFRFU1QKCQlmcHJpbnRmKCBzdGRvdXQsICIjIyMjIyMjIGF2ZXJhZ2UyICA9ICVmXG4iLCBhdmVyYWdlICk7CiNlbmRpZgoKCQlmb3IoIGk9MDsgaTwyMDsgaSsrICkgZm9yKCBqPTA7IGo8MjA7IGorKyApIAoJCQluX2Rpc3RtcFtpXVtqXSAtPSBhdmVyYWdlOwojaWYgVEVTVAoJCWZwcmludGYoIHN0ZG91dCwgImF2ZXJhZ2UyID0gJWZcbiIsIGF2ZXJhZ2UgKTsKCQlmcHJpbnRmKCBzdGRvdXQsICJhZnRlciBhdmVyYWdlIHN1YnN0cnVjdGlvbiA6IFxuIiApOwoJCWZvciggaT0wOyBpPDIwOyBpKysgKQoJCXsKCQkJZm9yKCBqPTA7IGo8MjA7IGorKyApIAoJCQl7CgkJCQlmcHJpbnRmKCBzdGRvdXQsICIlNi4yZiIsIG5fZGlzdG1wW2ldW2pdICk7CgkJCX0KCQkJZnByaW50Ziggc3Rkb3V0LCAiXG4iICk7CgkJfQojZW5kaWYKCQkKCQlhdmVyYWdlID0gMC4wOwoJCWZvciggaT0wOyBpPDIwOyBpKysgKSAKCQkJYXZlcmFnZSArPSBuX2Rpc3RtcFtpXVtpXSAqIGZyZXExW2ldOwojaWYgVEVTVAoJCWZwcmludGYoIHN0ZG91dCwgIiMjIyMjIyMgYXZlcmFnZTEgID0gJWZcbiIsIGF2ZXJhZ2UgKTsKI2VuZGlmCgoJCWZvciggaT0wOyBpPDIwOyBpKysgKSBmb3IoIGo9MDsgajwyMDsgaisrICkgCgkJCW5fZGlzdG1wW2ldW2pdICo9IDYwMC4wIC8gYXZlcmFnZTsKI2lmIFRFU1QKICAgICAgICBmcHJpbnRmKCBzdGRvdXQsICJhZnRlciBhdmVyYWdlIGRpdmlzaW9uIDogXG4iICk7CiAgICAgICAgZm9yKCBpPTA7IGk8MjA7IGkrKyApCiAgICAgICAgewogICAgICAgICAgICBmb3IoIGo9MDsgajw9aTsgaisrICkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgZnByaW50Ziggc3Rkb3V0LCAiJTcuMWYiLCBuX2Rpc3RtcFtpXVtqXSApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZwcmludGYoIHN0ZG91dCwgIlxuIiApOwogICAgICAgIH0KI2VuZGlmCgoJCWZvciggaT0wOyBpPDIwOyBpKysgKSBmb3IoIGo9MDsgajwyMDsgaisrICkgCgkJCW5fZGlzdG1wW2ldW2pdIC09IG9mZnNldDsgIAojaWYgVEVTVAoJCWZwcmludGYoIHN0ZG91dCwgImFmdGVyIG9mZnNldCBzdWJzdHJ1Y3Rpb24gKG9mZnNldCA9ICVkKTogXG4iLCBvZmZzZXQgKTsKCQlmb3IoIGk9MDsgaTwyMDsgaSsrICkKCQl7CgkJCWZvciggaj0wOyBqPD1pOyBqKysgKSAKCQkJewoJCQkJZnByaW50Ziggc3Rkb3V0LCAiJTcuMWYiLCBuX2Rpc3RtcFtpXVtqXSApOwoJCQl9CgkJCWZwcmludGYoIHN0ZG91dCwgIlxuIiApOwoJCX0KI2VuZGlmCiNpZiAwCi8qIMPtsNUgoaqhqqGqoaqhqqGqoaqhqqGqoaogKi8KCQkJcGVuYWx0eSAtPSBvZmZzZXQ7CiNlbmRpZgoKCgkJZm9yKCBpPTA7IGk8MjA7IGkrKyApIGZvciggaj0wOyBqPDIwOyBqKysgKSAKCQkJbl9kaXN0bXBbaV1bal0gPSBzaGlzaGFnb255dXUoIG5fZGlzdG1wW2ldW2pdICk7CgogICAgICAgIGlmKCBkaXNwICkKICAgICAgICB7CiAgICAgICAgICAgIGZwcmludGYoIHN0ZG91dCwgIiBzY29yaW5nIG1hdHJpeCAgXG4iICk7CiAgICAgICAgICAgIGZvciggaT0wOyBpPDIwOyBpKysgKQogICAgICAgICAgICB7CgkJCQlmcHJpbnRmKCBzdGRvdXQsICIlYyAgICAiLCBhbWlub1tpXSApOwogICAgICAgICAgICAgICAgZm9yKCBqPTA7IGo8MjA7IGorKyApCiAgICAgICAgICAgICAgICAgICAgZnByaW50Ziggc3Rkb3V0LCAiJTUuMGYiLCBuX2Rpc3RtcFtpXVtqXSApOwogICAgICAgICAgICAgICAgZnByaW50Ziggc3Rkb3V0LCAiXG4iICk7CiAgICAgICAgICAgIH0KCQkJZnByaW50Ziggc3Rkb3V0LCAiICAgICAiICk7CiAgICAgICAgICAgIGZvciggaT0wOyBpPDIwOyBpKysgKQoJCQkJZnByaW50Ziggc3Rkb3V0LCAiICAgICVjIiwgYW1pbm9baV0gKTsKCgkJCWF2ZXJhZ2UgPSAwLjA7CiAgICAgICAgCWZvciggaT0wOyBpPDIwOyBpKysgKSBmb3IoIGo9MDsgajwyMDsgaisrICkKCQkJCWF2ZXJhZ2UgKz0gbl9kaXN0bXBbaV1bal0gKiBmcmVxMVtpXSAqIGZyZXExW2pdOwoJCQlmcHJpbnRmKCBzdGRvdXQsICJhdmVyYWdlID0gJWZcbiIsIGF2ZXJhZ2UgKTsKCgkJCWF2ZXJhZ2UgPSAwLjA7CiAgICAgICAgCWZvciggaT0wOyBpPDIwOyBpKysgKQoJCQkJYXZlcmFnZSArPSBuX2Rpc3RtcFtpXVtpXSAqIGZyZXExW2ldOwoJCQlmcHJpbnRmKCBzdGRvdXQsICJpdGNoIGF2ZXJhZ2UgPSAlZlxuIiwgYXZlcmFnZSApOwoJCQlmcHJpbnRmKCBzdGRlcnIsICJwYXJhbWV0ZXJzOiAlZCwgJWQsICVkXG4iLCBwZW5hbHR5LCBwZW5hbHR5X2V4LCBvZmZzZXQgKTsKCgkJCQogIAkJCWV4aXQoIDEgKTsKICAgICAgICB9CgoJCWZvciggaT0wOyBpPDI2OyBpKysgKSBmb3IoIGo9MDsgajwyNjsgaisrICkgbl9kaXNbaV1bal0gPSAwOwoJCWZvciggaT0wOyBpPDIwOyBpKysgKSBmb3IoIGo9MDsgajwyMDsgaisrICkgbl9kaXNbaV1bal0gPSAoaW50KW5fZGlzdG1wW2ldW2pdOwoKCQlGcmVlRG91YmxlTXR4KCBuX2Rpc3RtcCApOwoJCUZyZWVEb3VibGVWZWMoIGRhdGFmcmVxICk7CgkJRnJlZURvdWJsZVZlYyggZnJlcSApOwoKCQlmcHJpbnRmKCBzdGRlcnIsICJkb25lLlxuIiApOwoKCX0KCWVsc2UgaWYoIGRvcnAgPT0gJ3AnICYmIHNjb3JlbXR4ID09IDIgKSAvKiBNaXlhdGEtWWFzdW5hZ2EgKi8KCXsKCQlmcHJpbnRmKCBzdGRlcnIsICJOb3Qgc3VwcG9ydGVkXG4iICk7CgkJZXhpdCggMSApOwoJCWZvciggaT0wOyBpPDI2OyBpKysgKSBmb3IoIGo9MDsgajwyNjsgaisrICkgbl9kaXNbaV1bal0gPSBsb2NuX2Rpc21baV1bal07CgkJZm9yKCBpPTA7IGk8MjY7IGkrKyApIGlmKCBpICE9IDI0ICkgbl9kaXNbaV1bMjRdID0gbl9kaXNbMjRdW2ldID0gZXhncG07CgkJbl9kaXNbMjRdWzI0XSA9IDA7CgkJaWYoIHBwZW5hbHR5ID09IE5PVFNQRUNJRklFRCApIHBwZW5hbHR5ID0gbG9jcGVuYWx0eW07CgkJaWYoIHBvZmZzZXQgPT0gTk9UU1BFQ0lGSUVEICkgcG9mZnNldCA9IC0yMDsKCQlpZiggcGFtTiA9PSBOT1RTUEVDSUZJRUQgKSBwYW1OID0gMDsKCQlpZigga2ltdXJhUiA9PSBOT1RTUEVDSUZJRUQgKSBraW11cmFSID0gMTsKCgkJcGVuYWx0eSA9IHBwZW5hbHR5OwoJCW9mZnNldCA9IHBvZmZzZXQ7CgoJCXNwcmludGYoIG1vZGVsbmFtZSwgIk1peWF0YS1ZYXN1bmFnYSwgJTYuM2YsICU2LjNmIiwgLShkb3VibGUpcHBlbmFsdHkvMTAwMCwgLShkb3VibGUpcG9mZnNldC8xMDAwICk7CgkJZm9yKCBpPTA7IGk8MjY7IGkrKyApIGFtaW5vW2ldID0gbG9jYW1pbm9tW2ldOwoJCWZvciggaT0wOyBpPDI2OyBpKysgKSBhbWlub19ncnBbKGludClhbWlub1tpXV0gPSBsb2NncnBtW2ldOwojaWYgREVCVUcKCQlmcHJpbnRmKCBzdGRvdXQsICJzY29yZWluZyBtYXRyaXggOiBcbiIgKTsKCQlmb3IoIGk9MDsgaTwyNjsgaSsrICkKCQl7CgkJCWZvciggaj0wOyBqPDI2OyBqKysgKSAKCQkJewoJCQkJZnByaW50Ziggc3Rkb3V0LCAiJSM1ZCIsIG5fZGlzW2ldW2pdICk7CgkJCX0KCQkJZnByaW50Ziggc3Rkb3V0LCAiXG4iICk7CgkJfQojZW5kaWYKCX0KCWVsc2UgICAgICAgICAvKiBKVFQgKi8KCXsKCQlkb3VibGUgKipyc3I7CgkJZG91YmxlICoqcGFtMTsKCQlkb3VibGUgKipwYW14OwoJCWRvdWJsZSAqZnJlcTsKCQlkb3VibGUgKmZyZXExOwoJCWRvdWJsZSAqbXV0YWI7CgkJZG91YmxlICpkYXRhZnJlcTsKCQlkb3VibGUgYXZlcmFnZTsKCQlkb3VibGUgdG1wOwoJCWRvdWJsZSBkZWx0YTsKCgkJcnNyID0gQWxsb2NhdGVEb3VibGVNdHgoIDIwLCAyMCApOwoJCXBhbTEgPSBBbGxvY2F0ZURvdWJsZU10eCggMjAsIDIwICk7CgkJcGFteCA9IEFsbG9jYXRlRG91YmxlTXR4KCAyMCwgMjAgKTsKCQlmcmVxID0gQWxsb2NhdGVEb3VibGVWZWMoIDIwICk7CgkJbXV0YWIgPSBBbGxvY2F0ZURvdWJsZVZlYyggMjAgKTsKCQlkYXRhZnJlcSA9IEFsbG9jYXRlRG91YmxlVmVjKCAyMCApOwoKCQlpZiggcHBlbmFsdHkgPT0gTk9UU1BFQ0lGSUVEICkgcHBlbmFsdHkgPSBERUZBVUxUR09QX0o7CgkJaWYoIHBwZW5hbHR5X09QID09IE5PVFNQRUNJRklFRCApIHBwZW5hbHR5X09QID0gREVGQVVMVEdPUF9KOwoJCWlmKCBwcGVuYWx0eV9leCA9PSBOT1RTUEVDSUZJRUQgKSBwcGVuYWx0eV9leCA9IERFRkFVTFRHRVBfSjsKCQlpZiggcHBlbmFsdHlfRVggPT0gTk9UU1BFQ0lGSUVEICkgcHBlbmFsdHlfRVggPSBERUZBVUxUR0VQX0o7CgkJaWYoIHBvZmZzZXQgPT0gTk9UU1BFQ0lGSUVEICkgcG9mZnNldCA9IERFRkFVTFRPRlNfSjsKCQlpZiggcGFtTiA9PSBOT1RTUEVDSUZJRUQgKSAgICBwYW1OICAgID0gREVGQVVMVFBBTU47CgkJaWYoIGtpbXVyYVIgPT0gTk9UU1BFQ0lGSUVEICkga2ltdXJhUiA9IDE7CgoJCXBlbmFsdHkgPSAoaW50KSggNjAwLjAgLyAxMDAwLjAgKiBwcGVuYWx0eSArIDAuNSApOwoJCXBlbmFsdHlfT1AgPSAoaW50KSggNjAwLjAgLyAxMDAwLjAgKiBwcGVuYWx0eV9PUCArIDAuNSApOwoJCXBlbmFsdHlfZXggPSAoaW50KSggNjAwLjAgLyAxMDAwLjAgKiBwcGVuYWx0eV9leCArIDAuNSApOwoJCXBlbmFsdHlfRVggPSAoaW50KSggNjAwLjAgLyAxMDAwLjAgKiBwcGVuYWx0eV9FWCArIDAuNSApOwoJCW9mZnNldCA9IChpbnQpKCA2MDAuMCAvIDEwMDAuMCAqIHBvZmZzZXQgKyAwLjUgKTsKCQlvZmZzZXRGRlQgPSAoaW50KSggNjAwLjAgLyAxMDAwLjAgKiAoLTApICsgMC41ICk7CgkJb2Zmc2V0TE4gPSAoaW50KSggNjAwLjAgLyAxMDAwLjAgKiAxMDAgKyAwLjUpOwoJCXBlbmFsdHlMTiA9IChpbnQpKCA2MDAuMCAvIDEwMDAuMCAqIC0yMDAwICsgMC41KTsKCQlwZW5hbHR5X2V4TE4gPSAoaW50KSggNjAwLjAgLyAxMDAwLjAgKiAtMTAwICsgMC41KTsKCgkJc3ByaW50ZiggbW9kZWxuYW1lLCAiJXMgJWRQQU0sICU2LjNmLCAlNi4zZiIsIChUTW9ySlRUPT1UTSk/IlRyYW5zbWVtYnJhbmUiOiJKVFQiLCBwYW1OLCAtKGRvdWJsZSlwcGVuYWx0eS8xMDAwLCAtKGRvdWJsZSlwb2Zmc2V0LzEwMDAgKTsKCgkJSlRUbXR4KCByc3IsIGZyZXEsIGFtaW5vLCBhbWlub19ncnAsIChpbnQpKFRNb3JKVFQ9PVRNKSApOwoKI2lmIFRFU1QKCQlmcHJpbnRmKCBzdGRvdXQsICJyc3IgPSBcbiIgKTsKCQlmb3IoIGk9MDsgaTwyMDsgaSsrICkKCQl7CgkJCWZvciggaj0wOyBqPDIwOyBqKysgKQoJCQl7CgkJCQlmcHJpbnRmKCBzdGRvdXQsICIlOS4yZiAiLCByc3JbaV1bal0gKTsKCQkJfQoJCQlmcHJpbnRmKCBzdGRvdXQsICJcbiIgKTsKCQl9CiNlbmRpZgoKCQlmb3IoIGk9MDsgaTwweDgwOyBpKysgKSBhbWlub19uW2ldID0gLTE7CgkJZm9yKCBpPTA7IGk8MjY7IGkrKyApIGFtaW5vX25bKGludClhbWlub1tpXV0gPSBpOwoKCQlpZiggZm1vZGVsID09IDEgKQoJCXsKCQkJY2FsY2ZyZXEoIG5zZXEsIHNlcSwgZGF0YWZyZXEgKTsKCQkJZnJlcTEgPSBkYXRhZnJlcTsKCQl9CgkJZWxzZQoJCQlmcmVxMSA9IGZyZXE7CgoJCWZwcmludGYoIHN0ZGVyciwgImdlbmVyYXRpbmcgJWRQQU0gJXMgc2NvcmluZyBtYXRyaXggZm9yIGFtaW5vIGFjaWRzIC4uLiAiLCBwYW1OLCAoVE1vckpUVD09VE0pPyJUcmFuc21lbWJyYW5lIjoiSlRUIiApOwoKCQl0bXAgPSAwLjA7CgkJZm9yKCBpPTA7IGk8MjA7IGkrKyApCgkJewoJCQltdXRhYltpXSA9IDAuMDsKCQkJZm9yKCBqPTA7IGo8MjA7IGorKyApCgkJCQltdXRhYltpXSArPSByc3JbaV1bal0gKiBmcmVxW2pdOwoJCQl0bXAgKz0gbXV0YWJbaV0gKiBmcmVxW2ldOwoJCX0KI2lmIFRFU1QKCQlmcHJpbnRmKCBzdGRvdXQsICJtdXRhYmlsaXR5ID0gXG4iICk7CgkJZm9yKCBpPTA7IGk8MjA7IGkrKyApCgkJCWZwcmludGYoIHN0ZG91dCwgIiU1LjNmXG4iLCBtdXRhYltpXSApOwoKCQlmcHJpbnRmKCBzdGRvdXQsICJ0bXAgPSAlZlxuIiwgdG1wICk7CiNlbmRpZgoJCWRlbHRhID0gMC4wMSAvIHRtcDsKCQlmb3IoIGk9MDsgaTwyMDsgaSsrICkKCQl7CgkJCWZvciggaj0wOyBqPDIwOyBqKysgKQoJCQl7CgkJCQlpZiggaSAhPSBqICkKCQkJCQlwYW0xW2ldW2pdID0gZGVsdGEgKiByc3JbaV1bal0gKiBmcmVxW2ldOwoJCQkJZWxzZQoJCQkJCXBhbTFbaV1bal0gPSAxLjAgLSBkZWx0YSAqIG11dGFiW2ldOwoJCQl9CgkJfQoKCQlpZiggZGlzcCApCgkJewoJCQlmcHJpbnRmKCBzdGRvdXQsICJwYW0xID0gXG4iICk7CgkJCWZvciggaT0wOyBpPDIwOyBpKysgKQoJCQl7CgkJCQlmb3IoIGo9MDsgajwyMDsgaisrICkKCQkJCXsKCQkJCQlmcHJpbnRmKCBzdGRvdXQsICIlOS42ZiAiLCBwYW0xW2ldW2pdICk7CgkJCQl9CgkJCQlmcHJpbnRmKCBzdGRvdXQsICJcbiIgKTsKCQkJfQoJCX0KCgkJTXR4dW50RG91YmxlKCBwYW14LCAyMCApOwoJCWZvciggeD0wOyB4IDwgcGFtTjsgeCsrICkgTXR4bWx0RG91YmxlKCBwYW14LCBwYW0xLCAyMCApOwoKCQlmb3IoIGk9MDsgaTwyMDsgaSsrICkgZm9yKCBqPTA7IGo8MjA7IGorKyApIAoJCQlwYW14W2ldW2pdIC89IGZyZXFbal07CgogICAgICAgIGZvciggaT0wOyBpPDIwOyBpKysgKSBmb3IoIGo9MDsgajwyMDsgaisrICkKCQl7CgkJCWlmKCBwYW14W2ldW2pdID09IDAuMCApIAoJCQl7CgkJCQlmcHJpbnRmKCBzdGRlcnIsICJXQVJOSU5HOiBwYW14WyVkXVslZF0gPSAwLjA/XG4iLCBpLCBqICk7CgkJCQlwYW14W2ldW2pdID0gMC4wMDAwMTsgLyogYnkgSi4gVGhvbXBzb24gKi8KCQkJfQogICAgICAgICAgICBwYW14W2ldW2pdID0gbG9nMTAoIHBhbXhbaV1bal0gKSAqIDEwMDAuMDsKCQl9CiAKI2lmIFRFU1QKCQlmcHJpbnRmKCBzdGRvdXQsICJyYXcgc2NvcmluZyBtYXRyaXggOiBcbiIgKTsKCQlmb3IoIGk9MDsgaTwyMDsgaSsrICkKCQl7CgkJCWZvciggaj0wOyBqPDIwOyBqKysgKSAKCQkJewoJCQkJZnByaW50Ziggc3Rkb3V0LCAiJTUuMGYiLCBwYW14W2ldW2pdICk7CgkJCX0KCQkJZnByaW50Ziggc3Rkb3V0LCAiXG4iICk7CgkJfQogICAgICAgIGF2ZXJhZ2UgPSB0bXAgPSAwLjA7CiAgICAgICAgZm9yKCBpPTA7IGk8MjA7IGkrKyApIGZvciggaj0wOyBqPDIwOyBqKysgKQoJCXsKICAgICAgICAgICBhdmVyYWdlICs9IHBhbXhbaV1bal0gKiBmcmVxMVtpXSAqIGZyZXExW2pdOwoJCSAgIHRtcCArPSBmcmVxMVtpXSAqIGZyZXExW2pdOwoJCX0KCQlhdmVyYWdlIC89IHRtcDsKCQlmcHJpbnRmKCBzdGRvdXQsICJaZW5idSBhdmVyYWdlID0gJWYsIHRtcCA9ICVmIFxuIiwgYXZlcmFnZSwgdG1wICk7CiAgICAgICAgYXZlcmFnZSA9IHRtcCA9IDAuMDsKICAgICAgICBmb3IoIGk9MDsgaTwyMDsgaSsrICkgZm9yKCBqPWk7IGo8MjA7IGorKyApCgkJewogICAgICAgICAgIGF2ZXJhZ2UgKz0gcGFteFtpXVtqXSAqIGZyZXExW2ldICogZnJlcTFbal07CgkJICAgdG1wICs9IGZyZXExW2ldICogZnJlcTFbal07CgkJfQoJCWF2ZXJhZ2UgLz0gdG1wOwoJCWZwcmludGYoIHN0ZG91dCwgIlplbmJ1IGF2ZXJhZ2UyID0gJWYsIHRtcCA9ICVmIFxuIiwgYXZlcmFnZSwgdG1wICk7CgkJYXZlcmFnZSA9IHRtcCA9IDAuMDsKCQlmb3IoIGk9MDsgaTwyMDsgaSsrICkKCQl7CgkJCWF2ZXJhZ2UgKz0gcGFteFtpXVtpXSAqIGZyZXExW2ldOwoJCQl0bXAgKz0gZnJlcTFbaV07CgkJfQoJCWF2ZXJhZ2UgLz0gdG1wOwoJCWZwcmludGYoIHN0ZG91dCwgIkl0Y2ggYXZlcmFnZSA9ICVmLCB0bXAgPSAlZiBcbiIsIGF2ZXJhZ2UsIHRtcCApOwojZW5kaWYKCiNpZiBOT1JNQUxJWkUxCgkJaWYoIGZtb2RlbCA9PSAtMSApCgkJCWF2ZXJhZ2UgPSAwLjA7CgkJZWxzZQoJCXsKI2lmIFRFU1QKCQkJZm9yKCBpPTA7IGk8MjA7IGkrKyApCgkJCQlmcHJpbnRmKCBzdGRvdXQsICJmcmVxWyVjXSA9ICVmLCBkYXRhZnJlcVslY10gPSAlZiwgZnJlcTFbXSA9ICVmXG4iLCBhbWlub1tpXSwgZnJlcVtpXSwgYW1pbm9baV0sIGRhdGFmcmVxW2ldLCBmcmVxMVtpXSApOwojZW5kaWYKCQkJYXZlcmFnZSA9IDAuMDsKCQkJZm9yKCBpPTA7IGk8MjA7IGkrKyApIGZvciggaj0wOyBqPDIwOyBqKysgKQoJCQkJYXZlcmFnZSArPSBwYW14W2ldW2pdICogZnJlcTFbaV0gKiBmcmVxMVtqXTsKCQl9CiNpZiBURVNUCgkJZnByaW50Ziggc3Rkb3V0LCAiIyMjIyMjIyBhdmVyYWdlMiAgPSAlZlxuIiwgYXZlcmFnZSApOwojZW5kaWYKCgkJZm9yKCBpPTA7IGk8MjA7IGkrKyApIGZvciggaj0wOyBqPDIwOyBqKysgKSAKCQkJcGFteFtpXVtqXSAtPSBhdmVyYWdlOwojaWYgVEVTVAoJCWZwcmludGYoIHN0ZG91dCwgImF2ZXJhZ2UyID0gJWZcbiIsIGF2ZXJhZ2UgKTsKCQlmcHJpbnRmKCBzdGRvdXQsICJhZnRlciBhdmVyYWdlIHN1YnN0cnVjdGlvbiA6IFxuIiApOwoJCWZvciggaT0wOyBpPDIwOyBpKysgKQoJCXsKCQkJZm9yKCBqPTA7IGo8MjA7IGorKyApIAoJCQl7CgkJCQlmcHJpbnRmKCBzdGRvdXQsICIlNS4wZiIsIHBhbXhbaV1bal0gKTsKCQkJfQoJCQlmcHJpbnRmKCBzdGRvdXQsICJcbiIgKTsKCQl9CiNlbmRpZgoJCQoJCWF2ZXJhZ2UgPSAwLjA7CgkJZm9yKCBpPTA7IGk8MjA7IGkrKyApIAoJCQlhdmVyYWdlICs9IHBhbXhbaV1baV0gKiBmcmVxMVtpXTsKI2lmIFRFU1QKCQlmcHJpbnRmKCBzdGRvdXQsICIjIyMjIyMjIGF2ZXJhZ2UxICA9ICVmXG4iLCBhdmVyYWdlICk7CiNlbmRpZgoKCQlmb3IoIGk9MDsgaTwyMDsgaSsrICkgZm9yKCBqPTA7IGo8MjA7IGorKyApIAoJCQlwYW14W2ldW2pdICo9IDYwMC4wIC8gYXZlcmFnZTsKI2lmIFRFU1QKICAgICAgICBmcHJpbnRmKCBzdGRvdXQsICJhZnRlciBhdmVyYWdlIGRpdmlzaW9uIDogXG4iICk7CiAgICAgICAgZm9yKCBpPTA7IGk8MjA7IGkrKyApCiAgICAgICAgewogICAgICAgICAgICBmb3IoIGo9MDsgajw9aTsgaisrICkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgZnByaW50Ziggc3Rkb3V0LCAiJTUuMGYiLCBwYW14W2ldW2pdICk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZnByaW50Ziggc3Rkb3V0LCAiXG4iICk7CiAgICAgICAgfQojZW5kaWYKCgkJZm9yKCBpPTA7IGk8MjA7IGkrKyApIGZvciggaj0wOyBqPDIwOyBqKysgKSAKCQkJcGFteFtpXVtqXSAtPSBvZmZzZXQ7ICAKI2lmIFRFU1QKCQlmcHJpbnRmKCBzdGRvdXQsICJhZnRlciBvZmZzZXQgc3Vic3RydWN0aW9uIChvZmZzZXQgPSAlZCk6IFxuIiwgb2Zmc2V0ICk7CgkJZm9yKCBpPTA7IGk8MjA7IGkrKyApCgkJewoJCQlmb3IoIGo9MDsgajw9aTsgaisrICkgCgkJCXsKCQkJCWZwcmludGYoIHN0ZG91dCwgIiU1LjBmIiwgcGFteFtpXVtqXSApOwoJCQl9CgkJCWZwcmludGYoIHN0ZG91dCwgIlxuIiApOwoJCX0KI2VuZGlmCiNpZiAwCi8qIMPtsNUgoaqhqqGqoaqhqqGqoaqhqqGqoaogKi8KCQkJcGVuYWx0eSAtPSBvZmZzZXQ7CiNlbmRpZgoKCgkJZm9yKCBpPTA7IGk8MjA7IGkrKyApIGZvciggaj0wOyBqPDIwOyBqKysgKSAKCQkJcGFteFtpXVtqXSA9IHNoaXNoYWdvbnl1dSggcGFteFtpXVtqXSApOwoKI2Vsc2UKCiAgICAgICAgYXZlcmFnZSA9IDAuMDsKICAgICAgICBmb3IoIGk9MDsgaTwyMDsgaSsrICkgZm9yKCBqPTA7IGo8MjA7IGorKyApCiAgICAgICAgICAgYXZlcmFnZSArPSBwYW14W2ldW2pdOwogICAgICAgIGF2ZXJhZ2UgLz0gNDAwLjA7CgogICAgICAgIGZvciggaT0wOyBpPDIwOyBpKysgKSBmb3IoIGo9MDsgajwyMDsgaisrICkKICAgICAgICB7CiAgICAgICAgICAgIHBhbXhbaV1bal0gLT0gYXZlcmFnZTsKICAgICAgICAgICAgcGFteFtpXVtqXSA9IHNoaXNoYWdvbnl1dSggcGFteFtpXVtqXSApOwogICAgICAgIH0KI2VuZGlmCiAgICAgICAgaWYoIGRpc3AgKQogICAgICAgIHsKICAgICAgICAgICAgZnByaW50Ziggc3Rkb3V0LCAiIHNjb3JpbmcgbWF0cml4ICBcbiIgKTsKICAgICAgICAgICAgZm9yKCBpPTA7IGk8MjA7IGkrKyApCiAgICAgICAgICAgIHsKCQkJCWZwcmludGYoIHN0ZG91dCwgIiVjICAgICIsIGFtaW5vW2ldICk7CiAgICAgICAgICAgICAgICBmb3IoIGo9MDsgajwyMDsgaisrICkKICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKCBzdGRvdXQsICIlNS4wZiIsIHBhbXhbaV1bal0gKTsKICAgICAgICAgICAgICAgIGZwcmludGYoIHN0ZG91dCwgIlxuIiApOwogICAgICAgICAgICB9CgkJCWZwcmludGYoIHN0ZG91dCwgIiAgICAgIiApOwogICAgICAgICAgICBmb3IoIGk9MDsgaTwyMDsgaSsrICkKCQkJCWZwcmludGYoIHN0ZG91dCwgIiAgICAlYyIsIGFtaW5vW2ldICk7CgoJCQlhdmVyYWdlID0gMC4wOwogICAgICAgIAlmb3IoIGk9MDsgaTwyMDsgaSsrICkgZm9yKCBqPTA7IGo8MjA7IGorKyApCgkJCQlhdmVyYWdlICs9IHBhbXhbaV1bal0gKiBmcmVxMVtpXSAqIGZyZXExW2pdOwoJCQlmcHJpbnRmKCBzdGRvdXQsICJhdmVyYWdlID0gJWZcbiIsIGF2ZXJhZ2UgKTsKCgkJCWF2ZXJhZ2UgPSAwLjA7CiAgICAgICAgCWZvciggaT0wOyBpPDIwOyBpKysgKQoJCQkJYXZlcmFnZSArPSBwYW14W2ldW2ldICogZnJlcTFbaV07CgkJCWZwcmludGYoIHN0ZG91dCwgIml0Y2ggYXZlcmFnZSA9ICVmXG4iLCBhdmVyYWdlICk7CgkJCWZwcmludGYoIHN0ZGVyciwgInBhcmFtZXRlcnM6ICVkLCAlZCwgJWRcbiIsIHBlbmFsdHksIHBlbmFsdHlfZXgsIG9mZnNldCApOwoKCQkJCiAgCQkJZXhpdCggMSApOwogICAgICAgIH0KCgkJZm9yKCBpPTA7IGk8MjY7IGkrKyApIGZvciggaj0wOyBqPDI2OyBqKysgKSBuX2Rpc1tpXVtqXSA9IDA7CgkJZm9yKCBpPTA7IGk8MjA7IGkrKyApIGZvciggaj0wOyBqPDIwOyBqKysgKSBuX2Rpc1tpXVtqXSA9IChpbnQpcGFteFtpXVtqXTsKCgkJZnByaW50Ziggc3RkZXJyLCAiZG9uZS5cbiIgKTsKCQlGcmVlRG91YmxlTXR4KCByc3IgKTsKCQlGcmVlRG91YmxlTXR4KCBwYW0xICk7CgkJRnJlZURvdWJsZU10eCggcGFteCApOwoJCUZyZWVEb3VibGVWZWMoIGZyZXEgKTsKCQlGcmVlRG91YmxlVmVjKCBtdXRhYiApOwoJCUZyZWVEb3VibGVWZWMoIGRhdGFmcmVxICk7Cgl9CglmcHJpbnRmKCBzdGRlcnIsICJzY29yZW10eCA9ICVkXG4iLCBzY29yZW10eCApOwoKI2lmIERFQlVHCglmcHJpbnRmKCBzdGRlcnIsICJzY29yZW10eCA9ICVkXG4iLCBzY29yZW10eCApOwoJZnByaW50Ziggc3RkZXJyLCAiYW1pbm9bXSA9ICVzXG4iLCBhbWlubyApOwojZW5kaWYKCglmb3IoIGk9MDsgaTwweDgwOyBpKysgKWFtaW5vX25baV0gPSAtMTsKCWZvciggaT0wOyBpPDI2OyBpKyspIGFtaW5vX25bKGludClhbWlub1tpXV0gPSBpOwogICAgZm9yKCBpPTA7IGk8MHg4MDsgaSsrICkgZm9yKCBqPTA7IGo8MHg4MDsgaisrICkgYW1pbm9fZGlzW2ldW2pdID0gMDsKICAgIGZvciggaT0wOyBpPDB4ODA7IGkrKyApIGZvciggaj0wOyBqPDB4ODA7IGorKyApIGFtaW5vX2Rpc0xOW2ldW2pdID0gMDsKICAgIGZvciggaT0wOyBpPDB4ODA7IGkrKyApIGZvciggaj0wOyBqPDB4ODA7IGorKyApIGFtaW5vX2Rpc19jb25zd2VpZ2h0X211bHRpW2ldW2pdID0gMC4wOwogICAgZm9yKCBpPTA7IGk8MjY7IGkrKykgZm9yKCBqPTA7IGo8MjY7IGorKyApCgl7CiAgICAgICAgYW1pbm9fZGlzWyhpbnQpYW1pbm9baV1dWyhpbnQpYW1pbm9bal1dID0gbl9kaXNbaV1bal07CgkJbl9kaXNfY29uc3dlaWdodF9tdWx0aVtpXVtqXSA9IChmbG9hdCluX2Rpc1tpXVtqXSAqIGNvbnN3ZWlnaHRfbXVsdGk7CgkJYW1pbm9fZGlzX2NvbnN3ZWlnaHRfbXVsdGlbKGludClhbWlub1tpXV1bKGludClhbWlub1tqXV0gPSAoZG91YmxlKW5fZGlzW2ldW2pdICogY29uc3dlaWdodF9tdWx0aTsKCX0KCglpZiggZG9ycCA9PSAnZCcgKSAgLyogRE5BICovCgl7CgkgICAgZm9yKCBpPTA7IGk8NTsgaSsrKSBmb3IoIGo9MDsgajw1OyBqKysgKQogICAgICAgIAlhbWlub19kaXNMTlsoaW50KWFtaW5vW2ldXVsoaW50KWFtaW5vW2pdXSA9IG5fZGlzW2ldW2pdICsgb2Zmc2V0IC0gb2Zmc2V0TE47CgkgICAgZm9yKCBpPTU7IGk8MTA7IGkrKykgZm9yKCBqPTU7IGo8MTA7IGorKyApCiAgICAgICAgCWFtaW5vX2Rpc0xOWyhpbnQpYW1pbm9baV1dWyhpbnQpYW1pbm9bal1dID0gbl9kaXNbaV1bal0gKyBvZmZzZXQgLSBvZmZzZXRMTjsKCSAgICBmb3IoIGk9MDsgaTw1OyBpKyspIGZvciggaj0wOyBqPDU7IGorKyApCiAgICAgICAgCW5fZGlzRkZUW2ldW2pdID0gbl9kaXNbaV1bal0gKyBvZmZzZXQgLSBvZmZzZXRGRlQ7CgkgICAgZm9yKCBpPTU7IGk8MTA7IGkrKykgZm9yKCBqPTU7IGo8MTA7IGorKyApCiAgICAgICAgCW5fZGlzRkZUW2ldW2pdID0gbl9kaXNbaV1bal0gKyBvZmZzZXQgLSBvZmZzZXRGRlQ7Cgl9CgllbHNlIC8vIHByb3RlaW4KCXsKCSAgICBmb3IoIGk9MDsgaTwyMDsgaSsrKSBmb3IoIGo9MDsgajwyMDsgaisrICkKICAgICAgICAJYW1pbm9fZGlzTE5bKGludClhbWlub1tpXV1bKGludClhbWlub1tqXV0gPSBuX2Rpc1tpXVtqXSArIG9mZnNldCAtIG9mZnNldExOOwoJICAgIGZvciggaT0wOyBpPDIwOyBpKyspIGZvciggaj0wOyBqPDIwOyBqKysgKQogICAgICAgIAluX2Rpc0ZGVFtpXVtqXSA9IG5fZGlzW2ldW2pdICsgb2Zmc2V0IC0gb2Zmc2V0RkZUOwoJfQoKI2lmIDAKCQlmcHJpbnRmKCBzdGRlcnIsICJhbWlub19kaXMgKG9mZnNldCA9ICVkKTogXG4iLCBvZmZzZXQgKTsKCQlmb3IoIGk9MDsgaTwyMDsgaSsrICkKCQl7CgkJCWZvciggaj0wOyBqPDIwOyBqKysgKSAKCQkJewoJCQkJZnByaW50Ziggc3RkZXJyLCAiJTVkIiwgYW1pbm9fZGlzWyhpbnQpYW1pbm9baV1dWyhpbnQpYW1pbm9bal1dICk7CgkJCX0KCQkJZnByaW50Ziggc3RkZXJyLCAiXG4iICk7CgkJfQoKCQlmcHJpbnRmKCBzdGRlcnIsICJhbWlub19kaXNMTiAob2Zmc2V0TE4gPSAlZCk6IFxuIiwgb2Zmc2V0TE4gKTsKCQlmb3IoIGk9MDsgaTwyMDsgaSsrICkKCQl7CgkJCWZvciggaj0wOyBqPDIwOyBqKysgKSAKCQkJewoJCQkJZnByaW50Ziggc3RkZXJyLCAiJTVkIiwgYW1pbm9fZGlzTE5bKGludClhbWlub1tpXV1bKGludClhbWlub1tqXV0gKTsKCQkJfQoJCQlmcHJpbnRmKCBzdGRlcnIsICJcbiIgKTsKCQl9CgoJCWZwcmludGYoIHN0ZGVyciwgIm5fZGlzIChvZmZzZXQgPSAlZCk6IFxuIiwgb2Zmc2V0ICk7CgkJZm9yKCBpPTA7IGk8MjY7IGkrKyApCgkJewoJCQlmb3IoIGo9MDsgajwyNjsgaisrICkgCgkJCXsKCQkJCWZwcmludGYoIHN0ZGVyciwgIiU1ZCIsIG5fZGlzW2ldW2pdICk7CgkJCX0KCQkJZnByaW50Ziggc3RkZXJyLCAiXG4iICk7CgkJfQoKCQlmcHJpbnRmKCBzdGRlcnIsICJuX2Rpc0ZGVCAob2Zmc2V0RkZUID0gJWQpOiBcbiIsIG9mZnNldEZGVCApOwoJCWZvciggaT0wOyBpPDI2OyBpKysgKQoJCXsKCQkJZm9yKCBqPTA7IGo8MjY7IGorKyApIAoJCQl7CgkJCQlmcHJpbnRmKCBzdGRlcnIsICIlNWQiLCBuX2Rpc0ZGVFtpXVtqXSApOwoJCQl9CgkJCWZwcmludGYoIHN0ZGVyciwgIlxuIiApOwoJCX0KZXhpdCggMSApOwojZW5kaWYKCgoJcHBpZCA9IDA7CgoKCWlmKCBmZnRUaHJlc2hvbGQgPT0gTk9UU1BFQ0lGSUVEICkKCXsKCQlmZnRUaHJlc2hvbGQgPSBGRlRfVEhSRVNIT0xEOwoJfQoJaWYoIGZmdFdpblNpemUgPT0gTk9UU1BFQ0lGSUVEICkKCXsKCQlpZiggZG9ycCA9PSAnZCcgKSAKCQkJZmZ0V2luU2l6ZSA9IEZGVF9XSU5TSVpFX0Q7CgkJZWxzZSAgICAKCQkJZmZ0V2luU2l6ZSA9IEZGVF9XSU5TSVpFX1A7Cgl9CgoKCWlmKCBmZnRzY29yZSApCgl7CgkJZG91YmxlIGF2LCBzZDsKCgkJZm9yKCBpPTA7IGk8MjA7IGkrKyApIHBvbGFyaXR5W2ldID0gcG9sYXJpdHlfW2ldOwoJCWZvciggYXY9MC4wLCBpPTA7IGk8MjA7IGkrKyApIGF2ICs9IHBvbGFyaXR5W2ldOwoJCWF2IC89IDIwLjA7CgkJZm9yKCBzZD0wLjAsIGk9MDsgaTwyMDsgaSsrICkgc2QgKz0gKCBwb2xhcml0eVtpXS1hdiApICogKCBwb2xhcml0eVtpXS1hdiApOwoJCXNkIC89IDIwLjA7IHNkID0gc3FydCggc2QgKTsKCQlmb3IoIGk9MDsgaTwyMDsgaSsrICkgcG9sYXJpdHlbaV0gLT0gYXY7CgkJZm9yKCBpPTA7IGk8MjA7IGkrKyApIHBvbGFyaXR5W2ldIC89IHNkOwoJCgkJZm9yKCBpPTA7IGk8MjA7IGkrKyApIHZvbHVtZVtpXSA9IHZvbHVtZV9baV07CgkJZm9yKCBhdj0wLjAsIGk9MDsgaTwyMDsgaSsrICkgYXYgKz0gdm9sdW1lW2ldOwoJCWF2IC89IDIwLjA7CgkJZm9yKCBzZD0wLjAsIGk9MDsgaTwyMDsgaSsrICkgc2QgKz0gKCB2b2x1bWVbaV0tYXYgKSAqICggdm9sdW1lW2ldLWF2ICk7CgkJc2QgLz0gMjAuMDsgc2QgPSBzcXJ0KCBzZCApOwoJCWZvciggaT0wOyBpPDIwOyBpKysgKSB2b2x1bWVbaV0gLT0gYXY7CgkJZm9yKCBpPTA7IGk8MjA7IGkrKyApIHZvbHVtZVtpXSAvPSBzZDsKCiNpZiAwCgkJZm9yKCBpPTA7IGk8MjA7IGkrKyApIGZwcmludGYoIHN0ZG91dCwgImFtaW5vPSVjLCBwb2wgPSAlZjwtJWYsIHZvbCA9ICVmPC0lZlxuIiwgYW1pbm9baV0sIHBvbGFyaXR5W2ldLCBwb2xhcml0eV9baV0sIHZvbHVtZVtpXSwgdm9sdW1lX1tpXSApOwoJCWZvciggaT0wOyBpPDIwOyBpKysgKSBmcHJpbnRmKCBzdGRvdXQsICIlYyAlKzUuM2YgJSs1LjNmXG4iLCBhbWlub1tpXSwgdm9sdW1lW2ldLCBwb2xhcml0eVtpXSApOwojZW5kaWYKCX0KfQo=