Ci8qIQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICBcZmlsZQogKiAgICAgaWZ1bmN0aW9ucy5oCiAqCiAqICBcYnJpZWYKICogICAgIGRlZmluZSBzb21lIGlubGluZSBmdW5jdGlvbnMgdGhhdCBhcmUgdXNlZCB3aXRoaW4gdGhlIGVuY29kZXIuCiAqCiAqICBcYXV0aG9yCiAqICAgICAgTWFpbiBjb250cmlidXRvcnMgKHNlZSBjb250cmlidXRvcnMuaCBmb3IgY29weXJpZ2h0LCBhZGRyZXNzIGFuZCBhZmZpbGlhdGlvbiBkZXRhaWxzKQogKiAgICAgIC0gS2Fyc3RlbiBT/GhyaW5nICAgICAgICAgICAgICAgICA8c3VlaHJpbmdAaGhpLmRlPgogKiAgICAgIC0gQWxleGlzIFRvdXJhcGlzICAgICAgICAgICAgICAgICA8YWxleGlzbXRAaWVlZS5vcmc+CiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICovCgojaWZuZGVmIF9JRlVOQ1RJT05TX0hfCiNkZWZpbmUgX0lGVU5DVElPTlNfSF8KCnN0YXRpYyBpbmxpbmUgaW50IGltaW4oaW50IGEsIGludCBiKQp7CiAgcmV0dXJuICgoYSkgPCAoYikpID8gKGEpIDogKGIpOwp9CgpzdGF0aWMgaW5saW5lIGludCBpbWF4KGludCBhLCBpbnQgYikKewogIHJldHVybiAoKGEpID4gKGIpKSA/IChhKSA6IChiKTsKfQoKc3RhdGljIGlubGluZSBkb3VibGUgZG1pbihkb3VibGUgYSwgZG91YmxlIGIpCnsKICByZXR1cm4gKChhKSA8IChiKSkgPyAoYSkgOiAoYik7Cn0KCnN0YXRpYyBpbmxpbmUgZG91YmxlIGRtYXgoZG91YmxlIGEsIGRvdWJsZSBiKQp7CiAgcmV0dXJuICgoYSkgPiAoYikpID8gKGEpIDogKGIpOwp9CgpzdGF0aWMgaW5saW5lIGludDY0IGk2NG1pbihpbnQ2NCBhLCBpbnQ2NCBiKQp7CiAgcmV0dXJuICgoYSkgPCAoYikpID8gKGEpIDogKGIpOwp9CgpzdGF0aWMgaW5saW5lIGludDY0IGk2NG1heChpbnQ2NCBhLCBpbnQ2NCBiKQp7CiAgcmV0dXJuICgoYSkgPiAoYikpID8gKGEpIDogKGIpOwp9CgpzdGF0aWMgaW5saW5lIGludCBpYWJzKGludCB4KQp7CiAgcmV0dXJuICgoeCkgPCAwKSA/IC0oeCkgOiAoeCk7Cn0KCnN0YXRpYyBpbmxpbmUgZG91YmxlIGRhYnMoZG91YmxlIHgpCnsKICByZXR1cm4gKCh4KSA8IDApID8gLSh4KSA6ICh4KTsKfQoKc3RhdGljIGlubGluZSBpbnQgaXNpZ24oaW50IHgpCnsKICByZXR1cm4gKCh4KSA8IDApID8gLTEgOiAxOwp9CgpzdGF0aWMgaW5saW5lIGludCBpc2lnbmFiKGludCBhLCBpbnQgYikKewogIHJldHVybiAoKGIpIDwgMCkgPyAtaWFicyhhKSA6IGlhYnMoYSk7Cn0KCnN0YXRpYyBpbmxpbmUgaW50IHJzaGlmdF9ybmQoaW50IHgsIGludCBhKQp7CiAgcmV0dXJuIChhID4gMCkgPyAoKHggKyAoMSA8PCAoYS0xKSApKSA+PiBhKSA6ICh4IDw8ICgtYSkpOwp9CgpzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCByc2hpZnRfcm5kX3VzKHVuc2lnbmVkIGludCB4LCB1bnNpZ25lZCBpbnQgYSkKewogIHJldHVybiAoYSA+IDApID8gKCh4ICsgKDEgPDwgKGEtMSkpKSA+PiBhKSA6IHg7Cn0KCnN0YXRpYyBpbmxpbmUgaW50IHJzaGlmdF9ybmRfc2YoaW50IHgsIGludCBhKQp7CiAgcmV0dXJuICgoeCArICgxIDw8IChhLTEpICkpID4+IGEpOwp9CgpzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCByc2hpZnRfcm5kX3VzX3NmKHVuc2lnbmVkIGludCB4LCB1bnNpZ25lZCBpbnQgYSkKewogIHJldHVybiAoKHggKyAoMSA8PCAoYS0xKSkpID4+IGEpOwp9CgpzdGF0aWMgaW5saW5lIGludCBpQ2xpcDEoaW50IGhpZ2gsIGludCB4KQp7CiAgeCA9IGltYXgoeCwgMCk7CiAgeCA9IGltaW4oeCwgaGlnaCk7CgogIHJldHVybiB4Owp9CgpzdGF0aWMgaW5saW5lIGludCBpQ2xpcDMoaW50IGxvdywgaW50IGhpZ2gsIGludCB4KQp7CiAgeCA9IGltYXgoeCwgbG93KTsKICB4ID0gaW1pbih4LCBoaWdoKTsKCiAgcmV0dXJuIHg7Cn0KCnN0YXRpYyBpbmxpbmUgZG91YmxlIGRDbGlwMyhkb3VibGUgbG93LCBkb3VibGUgaGlnaCwgZG91YmxlIHgpCnsKICB4ID0gZG1heCh4LCBsb3cpOwogIHggPSBkbWluKHgsIGhpZ2gpOwoKICByZXR1cm4geDsKfQoKc3RhdGljIGlubGluZSBpbnQgUlNEKGludCB4KQp7CiByZXR1cm4gKCh4JjIpPyh4fDEpOih4Jih+MSkpKTsKfQoKI2VuZGlmCgo=