Ly8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQovLyBUYWcgdG8gc3RyaW5nIGNvbnZlcnNpb24gZnVuY3Rpb25zCi8vCi8vIERlc2lnbiBhbmQgaW1wbGVtZW50YXRpb24gYnkKLy8gLSBIZXJ26SBEcm9sb24gPGRyb2xvbkBpbmZvbmllLmZyPgovLwovLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBGcmVlSW1hZ2UgMwovLwovLyBDT1ZFUkVEIENPREUgSVMgUFJPVklERUQgVU5ERVIgVEhJUyBMSUNFTlNFIE9OIEFOICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVFkKLy8gT0YgQU5ZIEtJTkQsIEVJVEhFUiBFWFBSRVNTRUQgT1IgSU1QTElFRCwgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFdBUlJBTlRJRVMKLy8gVEhBVCBUSEUgQ09WRVJFRCBDT0RFIElTIEZSRUUgT0YgREVGRUNUUywgTUVSQ0hBTlRBQkxFLCBGSVQgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCi8vIE9SIE5PTi1JTkZSSU5HSU5HLiBUSEUgRU5USVJFIFJJU0sgQVMgVE8gVEhFIFFVQUxJVFkgQU5EIFBFUkZPUk1BTkNFIE9GIFRIRSBDT1ZFUkVECi8vIENPREUgSVMgV0lUSCBZT1UuIFNIT1VMRCBBTlkgQ09WRVJFRCBDT0RFIFBST1ZFIERFRkVDVElWRSBJTiBBTlkgUkVTUEVDVCwgWU9VIChOT1QKLy8gVEhFIElOSVRJQUwgREVWRUxPUEVSIE9SIEFOWSBPVEhFUiBDT05UUklCVVRPUikgQVNTVU1FIFRIRSBDT1NUIE9GIEFOWSBORUNFU1NBUlkKLy8gU0VSVklDSU5HLCBSRVBBSVIgT1IgQ09SUkVDVElPTi4gVEhJUyBESVNDTEFJTUVSIE9GIFdBUlJBTlRZIENPTlNUSVRVVEVTIEFOIEVTU0VOVElBTAovLyBQQVJUIE9GIFRISVMgTElDRU5TRS4gTk8gVVNFIE9GIEFOWSBDT1ZFUkVEIENPREUgSVMgQVVUSE9SSVpFRCBIRVJFVU5ERVIgRVhDRVBUIFVOREVSCi8vIFRISVMgRElTQ0xBSU1FUi4KLy8KLy8gVXNlIGF0IHlvdXIgb3duIHJpc2shCi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCiNpZmRlZiBfTVNDX1ZFUiAKI3ByYWdtYSB3YXJuaW5nIChkaXNhYmxlIDogNDc4NikgLy8gaWRlbnRpZmllciB3YXMgdHJ1bmNhdGVkIHRvICdudW1iZXInIGNoYXJhY3RlcnMKI2VuZGlmCgojaW5jbHVkZSAiRnJlZUltYWdlLmgiCiNpbmNsdWRlICJVdGlsaXRpZXMuaCIKI2luY2x1ZGUgIkZyZWVJbWFnZVRhZy5oIgojaW5jbHVkZSAiRklSYXRpb25hbC5oIgoKI2RlZmluZSBNQVhfVEVYVF9FWFRFTlQJNTEyCgovKioKQ29udmVydCBhIHRhZyB0byBhIEMgc3RyaW5nCiovCnN0YXRpYyBjb25zdCBjaGFyKiAKQ29udmVydEFueVRhZyhGSVRBRyAqdGFnKSB7CgljaGFyIGZvcm1hdFtNQVhfVEVYVF9FWFRFTlRdOwoJc3RhdGljIHN0ZDo6c3RyaW5nIGJ1ZmZlcjsKCURXT1JEIGk7CgoJaWYoIXRhZykKCQlyZXR1cm4gTlVMTDsKCglidWZmZXIuZXJhc2UoKTsKCQoJLy8gY29udmVydCB0aGUgdGFnIHZhbHVlIHRvIGEgc3RyaW5nIGJ1ZmZlcgoKCUZSRUVfSU1BR0VfTURUWVBFIHRhZ190eXBlID0gRnJlZUltYWdlX0dldFRhZ1R5cGUodGFnKTsKCURXT1JEIHRhZ19jb3VudCA9IEZyZWVJbWFnZV9HZXRUYWdDb3VudCh0YWcpOwoKCXN3aXRjaCh0YWdfdHlwZSkgewoJCWNhc2UgRklEVF9CWVRFOgkJLy8gTiB4IDgtYml0IHVuc2lnbmVkIGludGVnZXIgCgkJewoJCQlCWVRFICpwdmFsdWUgPSAoQllURSopRnJlZUltYWdlX0dldFRhZ1ZhbHVlKHRhZyk7CgoJCQlzcHJpbnRmKGZvcm1hdCwgIiVsZCIsCShMT05HKSBwdmFsdWVbMF0pOwoJCQlidWZmZXIgKz0gZm9ybWF0OwoJCQlmb3IoaSA9IDE7IGkgPCB0YWdfY291bnQ7IGkrKykgewoJCQkJc3ByaW50Zihmb3JtYXQsICIgJWxkIiwJKExPTkcpIHB2YWx1ZVtpXSk7CgkJCQlidWZmZXIgKz0gZm9ybWF0OwoJCQl9CgkJCWJyZWFrOwoJCX0KCQljYXNlIEZJRFRfU0hPUlQ6CS8vIE4geCAxNi1iaXQgdW5zaWduZWQgaW50ZWdlciAKCQl7CgkJCXVuc2lnbmVkIHNob3J0ICpwdmFsdWUgPSAodW5zaWduZWQgc2hvcnQgKilGcmVlSW1hZ2VfR2V0VGFnVmFsdWUodGFnKTsKCgkJCXNwcmludGYoZm9ybWF0LCAiJWh1IiwgcHZhbHVlWzBdKTsKCQkJYnVmZmVyICs9IGZvcm1hdDsKCQkJZm9yKGkgPSAxOyBpIDwgdGFnX2NvdW50OyBpKyspIHsKCQkJCXNwcmludGYoZm9ybWF0LCAiICVodSIsCXB2YWx1ZVtpXSk7CgkJCQlidWZmZXIgKz0gZm9ybWF0OwoJCQl9CgkJCWJyZWFrOwoJCX0KCQljYXNlIEZJRFRfTE9ORzoJCS8vIE4geCAzMi1iaXQgdW5zaWduZWQgaW50ZWdlciAKCQl7CgkJCURXT1JEICpwdmFsdWUgPSAoRFdPUkQgKilGcmVlSW1hZ2VfR2V0VGFnVmFsdWUodGFnKTsKCgkJCXNwcmludGYoZm9ybWF0LCAiJWx1IiwgcHZhbHVlWzBdKTsKCQkJYnVmZmVyICs9IGZvcm1hdDsKCQkJZm9yKGkgPSAxOyBpIDwgdGFnX2NvdW50OyBpKyspIHsKCQkJCXNwcmludGYoZm9ybWF0LCAiICVsdSIsCXB2YWx1ZVtpXSk7CgkJCQlidWZmZXIgKz0gZm9ybWF0OwoJCQl9CgkJCWJyZWFrOwoJCX0KCQljYXNlIEZJRFRfUkFUSU9OQUw6IC8vIE4geCA2NC1iaXQgdW5zaWduZWQgZnJhY3Rpb24gCgkJewoJCQlEV09SRCAqcHZhbHVlID0gKERXT1JEKilGcmVlSW1hZ2VfR2V0VGFnVmFsdWUodGFnKTsKCgkJCXNwcmludGYoZm9ybWF0LCAiJWxkLyVsZCIsIHB2YWx1ZVswXSwgcHZhbHVlWzFdKTsKCQkJYnVmZmVyICs9IGZvcm1hdDsKCQkJZm9yKGkgPSAxOyBpIDwgdGFnX2NvdW50OyBpKyspIHsKCQkJCXNwcmludGYoZm9ybWF0LCAiICVsZC8lbGQiLCBwdmFsdWVbMippXSwgcHZhbHVlWzIqaSsxXSk7CgkJCQlidWZmZXIgKz0gZm9ybWF0OwoJCQl9CgkJCWJyZWFrOwoJCX0KCQljYXNlIEZJRFRfU0JZVEU6CS8vIE4geCA4LWJpdCBzaWduZWQgaW50ZWdlciAKCQl7CgkJCWNoYXIgKnB2YWx1ZSA9IChjaGFyKilGcmVlSW1hZ2VfR2V0VGFnVmFsdWUodGFnKTsKCgkJCXNwcmludGYoZm9ybWF0LCAiJWxkIiwJKExPTkcpIHB2YWx1ZVswXSk7CgkJCWJ1ZmZlciArPSBmb3JtYXQ7CgkJCWZvcihpID0gMTsgaSA8IHRhZ19jb3VudDsgaSsrKSB7CgkJCQlzcHJpbnRmKGZvcm1hdCwgIiAlbGQiLAkoTE9ORykgcHZhbHVlW2ldKTsKCQkJCWJ1ZmZlciArPSBmb3JtYXQ7CgkJCX0KCQkJYnJlYWs7CgkJfQoJCWNhc2UgRklEVF9TU0hPUlQ6CS8vIE4geCAxNi1iaXQgc2lnbmVkIGludGVnZXIgCgkJewoJCQlzaG9ydCAqcHZhbHVlID0gKHNob3J0ICopRnJlZUltYWdlX0dldFRhZ1ZhbHVlKHRhZyk7CgoJCQlzcHJpbnRmKGZvcm1hdCwgIiVoZCIsIHB2YWx1ZVswXSk7CgkJCWJ1ZmZlciArPSBmb3JtYXQ7CgkJCWZvcihpID0gMTsgaSA8IHRhZ19jb3VudDsgaSsrKSB7CgkJCQlzcHJpbnRmKGZvcm1hdCwgIiAlaGQiLAlwdmFsdWVbaV0pOwoJCQkJYnVmZmVyICs9IGZvcm1hdDsKCQkJfQoJCQlicmVhazsKCQl9CgkJY2FzZSBGSURUX1NMT05HOgkvLyBOIHggMzItYml0IHNpZ25lZCBpbnRlZ2VyIAoJCXsKCQkJTE9ORyAqcHZhbHVlID0gKExPTkcgKilGcmVlSW1hZ2VfR2V0VGFnVmFsdWUodGFnKTsKCgkJCXNwcmludGYoZm9ybWF0LCAiJWxkIiwgcHZhbHVlWzBdKTsKCQkJYnVmZmVyICs9IGZvcm1hdDsKCQkJZm9yKGkgPSAxOyBpIDwgdGFnX2NvdW50OyBpKyspIHsKCQkJCXNwcmludGYoZm9ybWF0LCAiICVsZCIsCXB2YWx1ZVtpXSk7CgkJCQlidWZmZXIgKz0gZm9ybWF0OwoJCQl9CgkJCWJyZWFrOwoJCX0KCQljYXNlIEZJRFRfU1JBVElPTkFMOi8vIE4geCA2NC1iaXQgc2lnbmVkIGZyYWN0aW9uIAoJCXsKCQkJTE9ORyAqcHZhbHVlID0gKExPTkcqKUZyZWVJbWFnZV9HZXRUYWdWYWx1ZSh0YWcpOwoKCQkJc3ByaW50Zihmb3JtYXQsICIlbGQvJWxkIiwgcHZhbHVlWzBdLCBwdmFsdWVbMV0pOwoJCQlidWZmZXIgKz0gZm9ybWF0OwoJCQlmb3IoaSA9IDE7IGkgPCB0YWdfY291bnQ7IGkrKykgewoJCQkJc3ByaW50Zihmb3JtYXQsICIgJWxkLyVsZCIsIHB2YWx1ZVsyKmldLCBwdmFsdWVbMippKzFdKTsKCQkJCWJ1ZmZlciArPSBmb3JtYXQ7CgkJCX0KCQkJYnJlYWs7CgkJfQoJCWNhc2UgRklEVF9GTE9BVDoJLy8gTiB4IDMyLWJpdCBJRUVFIGZsb2F0aW5nIHBvaW50IAoJCXsKCQkJZmxvYXQgKnB2YWx1ZSA9IChmbG9hdCAqKUZyZWVJbWFnZV9HZXRUYWdWYWx1ZSh0YWcpOwoKCQkJc3ByaW50Zihmb3JtYXQsICIlZiIsIChkb3VibGUpIHB2YWx1ZVswXSk7CgkJCWJ1ZmZlciArPSBmb3JtYXQ7CgkJCWZvcihpID0gMTsgaSA8IHRhZ19jb3VudDsgaSsrKSB7CgkJCQlzcHJpbnRmKGZvcm1hdCwgIiVmIiwgKGRvdWJsZSkgcHZhbHVlW2ldKTsKCQkJCWJ1ZmZlciArPSBmb3JtYXQ7CgkJCX0KCQkJYnJlYWs7CgkJfQoJCWNhc2UgRklEVF9ET1VCTEU6CS8vIE4geCA2NC1iaXQgSUVFRSBmbG9hdGluZyBwb2ludCAKCQl7CgkJCWRvdWJsZSAqcHZhbHVlID0gKGRvdWJsZSAqKUZyZWVJbWFnZV9HZXRUYWdWYWx1ZSh0YWcpOwoKCQkJc3ByaW50Zihmb3JtYXQsICIlZiIsIHB2YWx1ZVswXSk7CgkJCWJ1ZmZlciArPSBmb3JtYXQ7CgkJCWZvcihpID0gMTsgaSA8IHRhZ19jb3VudDsgaSsrKSB7CgkJCQlzcHJpbnRmKGZvcm1hdCwgIiVmIiwgcHZhbHVlW2ldKTsKCQkJCWJ1ZmZlciArPSBmb3JtYXQ7CgkJCX0KCQkJYnJlYWs7CgkJfQoJCWNhc2UgRklEVF9JRkQ6CQkvLyBOIHggMzItYml0IHVuc2lnbmVkIGludGVnZXIgKG9mZnNldCkgCgkJewoJCQlEV09SRCAqcHZhbHVlID0gKERXT1JEICopRnJlZUltYWdlX0dldFRhZ1ZhbHVlKHRhZyk7CgoJCQlzcHJpbnRmKGZvcm1hdCwgIiVYIiwgcHZhbHVlWzBdKTsKCQkJYnVmZmVyICs9IGZvcm1hdDsKCQkJZm9yKGkgPSAxOyBpIDwgdGFnX2NvdW50OyBpKyspIHsKCQkJCXNwcmludGYoZm9ybWF0LCAiICVYIiwJcHZhbHVlW2ldKTsKCQkJCWJ1ZmZlciArPSBmb3JtYXQ7CgkJCX0KCQkJYnJlYWs7CgkJfQoJCWNhc2UgRklEVF9QQUxFVFRFOgkvLyBOIHggMzItYml0IFJHQlFVQUQgCgkJewoJCQlSR0JRVUFEICpwdmFsdWUgPSAoUkdCUVVBRCAqKUZyZWVJbWFnZV9HZXRUYWdWYWx1ZSh0YWcpOwoKCQkJc3ByaW50Zihmb3JtYXQsICIoJWQsJWQsJWQsJWQpIiwgcHZhbHVlWzBdLnJnYlJlZCwgcHZhbHVlWzBdLnJnYkdyZWVuLCBwdmFsdWVbMF0ucmdiQmx1ZSwgcHZhbHVlWzBdLnJnYlJlc2VydmVkKTsKCQkJYnVmZmVyICs9IGZvcm1hdDsKCQkJZm9yKGkgPSAxOyBpIDwgdGFnX2NvdW50OyBpKyspIHsKCQkJCXNwcmludGYoZm9ybWF0LCAiICglZCwlZCwlZCwlZCkiLCBwdmFsdWVbaV0ucmdiUmVkLCBwdmFsdWVbaV0ucmdiR3JlZW4sIHB2YWx1ZVtpXS5yZ2JCbHVlLCBwdmFsdWVbaV0ucmdiUmVzZXJ2ZWQpOwoJCQkJYnVmZmVyICs9IGZvcm1hdDsKCQkJfQoJCQlicmVhazsKCQl9CgkJCgkJY2FzZSBGSURUX0xPTkc4OgkvLyBOIHggNjQtYml0IHVuc2lnbmVkIGludGVnZXIgCgkJewoJCQlVSU5UNjQgKnB2YWx1ZSA9IChVSU5UNjQgKilGcmVlSW1hZ2VfR2V0VGFnVmFsdWUodGFnKTsKCgkJCXNwcmludGYoZm9ybWF0LCAiJWxkIiwgcHZhbHVlWzBdKTsKCQkJYnVmZmVyICs9IGZvcm1hdDsKCQkJZm9yKGkgPSAxOyBpIDwgdGFnX2NvdW50OyBpKyspIHsKCQkJCXNwcmludGYoZm9ybWF0LCAiJWxkIiwgcHZhbHVlW2ldKTsKCQkJCWJ1ZmZlciArPSBmb3JtYXQ7CgkJCX0KCQkJYnJlYWs7CgkJfQoKCQljYXNlIEZJRFRfSUZEODoJCS8vIE4geCA2NC1iaXQgdW5zaWduZWQgaW50ZWdlciAob2Zmc2V0KQoJCXsKCQkJVUlOVDY0ICpwdmFsdWUgPSAoVUlOVDY0ICopRnJlZUltYWdlX0dldFRhZ1ZhbHVlKHRhZyk7CgoJCQlzcHJpbnRmKGZvcm1hdCwgIiVYIiwgcHZhbHVlWzBdKTsKCQkJYnVmZmVyICs9IGZvcm1hdDsKCQkJZm9yKGkgPSAxOyBpIDwgdGFnX2NvdW50OyBpKyspIHsKCQkJCXNwcmludGYoZm9ybWF0LCAiJVgiLCBwdmFsdWVbaV0pOwoJCQkJYnVmZmVyICs9IGZvcm1hdDsKCQkJfQoJCQlicmVhazsKCQl9CgoJCWNhc2UgRklEVF9TTE9ORzg6CS8vIE4geCA2NC1iaXQgc2lnbmVkIGludGVnZXIKCQl7CgkJCUlOVDY0ICpwdmFsdWUgPSAoSU5UNjQgKilGcmVlSW1hZ2VfR2V0VGFnVmFsdWUodGFnKTsKCgkJCXNwcmludGYoZm9ybWF0LCAiJWxkIiwgcHZhbHVlWzBdKTsKCQkJYnVmZmVyICs9IGZvcm1hdDsKCQkJZm9yKGkgPSAxOyBpIDwgdGFnX2NvdW50OyBpKyspIHsKCQkJCXNwcmludGYoZm9ybWF0LCAiJWxkIiwgcHZhbHVlW2ldKTsKCQkJCWJ1ZmZlciArPSBmb3JtYXQ7CgkJCX0KCQkJYnJlYWs7CgkJfQoKCQljYXNlIEZJRFRfQVNDSUk6CS8vIDgtYml0IGJ5dGVzIHcvIGxhc3QgYnl0ZSBudWxsIAoJCWNhc2UgRklEVF9VTkRFRklORUQ6Ly8gOC1iaXQgdW50eXBlZCBkYXRhIAoJCWRlZmF1bHQ6CgkJewoJCQlpbnQgbWF4X3NpemUgPSBNSU4oKGludClGcmVlSW1hZ2VfR2V0VGFnTGVuZ3RoKHRhZyksIChpbnQpTUFYX1RFWFRfRVhURU5UKTsKCQkJaWYobWF4X3NpemUgPT0gTUFYX1RFWFRfRVhURU5UKQoJCQkJbWF4X3NpemUtLTsKCQkJbWVtY3B5KGZvcm1hdCwgKGNoYXIqKUZyZWVJbWFnZV9HZXRUYWdWYWx1ZSh0YWcpLCBtYXhfc2l6ZSk7CgkJCWZvcm1hdFttYXhfc2l6ZV0gPSAnXDAnOwoJCQlidWZmZXIgKz0gZm9ybWF0OwoJCQlicmVhazsKCQl9Cgl9CgoJcmV0dXJuIGJ1ZmZlci5jX3N0cigpOwp9CgovKioKQ29udmVydCBhIEV4aWYgdGFnIHRvIGEgQyBzdHJpbmcKKi8Kc3RhdGljIGNvbnN0IGNoYXIqIApDb252ZXJ0RXhpZlRhZyhGSVRBRyAqdGFnKSB7CgljaGFyIGZvcm1hdFtNQVhfVEVYVF9FWFRFTlRdOwoJc3RhdGljIHN0ZDo6c3RyaW5nIGJ1ZmZlcjsKCglpZighdGFnKQoJCXJldHVybiBOVUxMOwoKCWJ1ZmZlci5lcmFzZSgpOwoKCS8vIGNvbnZlcnQgdGhlIHRhZyB2YWx1ZSB0byBhIHN0cmluZyBidWZmZXIKCglzd2l0Y2goRnJlZUltYWdlX0dldFRhZ0lEKHRhZykpIHsKCQljYXNlIFRBR19PUklFTlRBVElPTjoKCQl7CgkJCXVuc2lnbmVkIHNob3J0IG9yaWVudGF0aW9uID0gKigodW5zaWduZWQgc2hvcnQgKilGcmVlSW1hZ2VfR2V0VGFnVmFsdWUodGFnKSk7CgkJCXN3aXRjaCAob3JpZW50YXRpb24pIHsKCQkJCWNhc2UgMToKCQkJCQlyZXR1cm4gInRvcCwgbGVmdCBzaWRlIjsKCQkJCWNhc2UgMjoKCQkJCQlyZXR1cm4gInRvcCwgcmlnaHQgc2lkZSI7CgkJCQljYXNlIDM6CgkJCQkJcmV0dXJuICJib3R0b20sIHJpZ2h0IHNpZGUiOwoJCQkJY2FzZSA0OgoJCQkJCXJldHVybiAiYm90dG9tLCBsZWZ0IHNpZGUiOwoJCQkJY2FzZSA1OgoJCQkJCXJldHVybiAibGVmdCBzaWRlLCB0b3AiOwoJCQkJY2FzZSA2OgoJCQkJCXJldHVybiAicmlnaHQgc2lkZSwgdG9wIjsKCQkJCWNhc2UgNzoKCQkJCQlyZXR1cm4gInJpZ2h0IHNpZGUsIGJvdHRvbSI7CgkJCQljYXNlIDg6CgkJCQkJcmV0dXJuICJsZWZ0IHNpZGUsIGJvdHRvbSI7CgkJCQlkZWZhdWx0OgoJCQkJCWJyZWFrOwoJCQl9CgkJfQoJCWJyZWFrOwoKCQljYXNlIFRBR19SRUZFUkVOQ0VfQkxBQ0tfV0hJVEU6CgkJewoJCQlEV09SRCAqcHZhbHVlID0gKERXT1JEKilGcmVlSW1hZ2VfR2V0VGFnVmFsdWUodGFnKTsKCQkJaWYoRnJlZUltYWdlX0dldFRhZ0xlbmd0aCh0YWcpID09IDQ4KSB7CgkJCQkvLyByZWZlcmVuY2UgYmxhY2sgcG9pbnQgdmFsdWUgYW5kIHJlZmVyZW5jZSB3aGl0ZSBwb2ludCB2YWx1ZSAoUmVmZXJlbmNlQmxhY2tXaGl0ZSkKCQkJCWludCBibGFja1IgPSAwLCB3aGl0ZVIgPSAwLCBibGFja0cgPSAwLCB3aGl0ZUcgPSAwLCBibGFja0IgPSAwLCB3aGl0ZUIgPSAwOwoJCQkJaWYocHZhbHVlWzFdKQoJCQkJCWJsYWNrUiA9IChpbnQpKHB2YWx1ZVswXSAvIHB2YWx1ZVsxXSk7CgkJCQlpZihwdmFsdWVbM10pCgkJCQkJd2hpdGVSID0gKGludCkocHZhbHVlWzJdIC8gcHZhbHVlWzNdKTsKCQkJCWlmKHB2YWx1ZVs1XSkKCQkJCQlibGFja0cgPSAoaW50KShwdmFsdWVbNF0gLyBwdmFsdWVbNV0pOwoJCQkJaWYocHZhbHVlWzddKQoJCQkJCXdoaXRlRyA9IChpbnQpKHB2YWx1ZVs2XSAvIHB2YWx1ZVs3XSk7CgkJCQlpZihwdmFsdWVbOV0pCgkJCQkJYmxhY2tCID0gKGludCkocHZhbHVlWzhdIC8gcHZhbHVlWzldKTsKCQkJCWlmKHB2YWx1ZVsxMV0pCgkJCQkJd2hpdGVCID0gKGludCkocHZhbHVlWzEwXSAvIHB2YWx1ZVsxMV0pOwoKCQkJCXNwcmludGYoZm9ybWF0LCAiWyVkLCVkLCVkXSBbJWQsJWQsJWRdIiwgYmxhY2tSLCBibGFja0csIGJsYWNrQiwgd2hpdGVSLCB3aGl0ZUcsIHdoaXRlQik7CgkJCQlidWZmZXIgKz0gZm9ybWF0OwoJCQkJcmV0dXJuIGJ1ZmZlci5jX3N0cigpOwoJCQl9CgoJCX0KCQlicmVhazsKCgkJY2FzZSBUQUdfQ09MT1JfU1BBQ0U6CgkJewoJCQl1bnNpZ25lZCBzaG9ydCBjb2xvclNwYWNlID0gKigodW5zaWduZWQgc2hvcnQgKilGcmVlSW1hZ2VfR2V0VGFnVmFsdWUodGFnKSk7CgkJCWlmIChjb2xvclNwYWNlID09IDEpIHsKCQkJCXJldHVybiAic1JHQiI7CgkJCX0gZWxzZSBpZiAoY29sb3JTcGFjZSA9PSA2NTUzNSkgewoJCQkJcmV0dXJuICJVbmRlZmluZWQiOwoJCQl9IGVsc2UgewoJCQkJcmV0dXJuICJVbmtub3duIjsKCQkJfQoJCX0KCQlicmVhazsKCgkJY2FzZSBUQUdfQ09NUE9ORU5UU19DT05GSUdVUkFUSU9OOgoJCXsKCQkJY29uc3QgY2hhciAqY29tcG9uZW50U3RyaW5nc1s3XSA9IHsiIiwgIlkiLCAiQ2IiLCAiQ3IiLCAiUiIsICJHIiwgIkIifTsKCQkJQllURSAqcHZhbHVlID0gKEJZVEUqKUZyZWVJbWFnZV9HZXRUYWdWYWx1ZSh0YWcpOwoJCQlmb3IoRFdPUkQgaSA9IDA7IGkgPCBNSU4oKERXT1JEKTQsIEZyZWVJbWFnZV9HZXRUYWdDb3VudCh0YWcpKTsgaSsrKSB7CgkJCQlpbnQgaiA9IHB2YWx1ZVtpXTsKCQkJCWlmKGogPiAwICYmIGogPCA3KQoJCQkJCWJ1ZmZlciArPSBjb21wb25lbnRTdHJpbmdzW2pdOwoJCQl9CgkJCXJldHVybiBidWZmZXIuY19zdHIoKTsKCQl9CgkJYnJlYWs7CgoJCWNhc2UgVEFHX0NPTVBSRVNTRURfQklUU19QRVJfUElYRUw6CgkJewoJCQlGSVJhdGlvbmFsIHIodGFnKTsKCQkJYnVmZmVyID0gci50b1N0cmluZygpOwoJCQlpZihidWZmZXIgPT0gIjEiKQoJCQkJYnVmZmVyICs9ICIgYml0L3BpeGVsIjsKCQkJZWxzZSAKCQkJCWJ1ZmZlciArPSAiIGJpdHMvcGl4ZWwiOwoJCQlyZXR1cm4gYnVmZmVyLmNfc3RyKCk7CgkJfQoJCWJyZWFrOwoKCQljYXNlIFRBR19YX1JFU09MVVRJT046CgkJY2FzZSBUQUdfWV9SRVNPTFVUSU9OOgoJCWNhc2UgVEFHX0ZPQ0FMX1BMQU5FX1hfUkVTOgoJCWNhc2UgVEFHX0ZPQ0FMX1BMQU5FX1lfUkVTOgoJCWNhc2UgVEFHX0JSSUdIVE5FU1NfVkFMVUU6CgkJY2FzZSBUQUdfRVhQT1NVUkVfQklBU19WQUxVRToKCQl7CgkJCUZJUmF0aW9uYWwgcih0YWcpOwoJCQlidWZmZXIgPSByLnRvU3RyaW5nKCk7CgkJCXJldHVybiBidWZmZXIuY19zdHIoKTsKCQl9CgkJYnJlYWs7CgoJCWNhc2UgVEFHX1JFU09MVVRJT05fVU5JVDoKCQljYXNlIFRBR19GT0NBTF9QTEFORV9VTklUOgoJCXsKCQkJdW5zaWduZWQgc2hvcnQgcmVzb2x1dGlvblVuaXQgPSAqKCh1bnNpZ25lZCBzaG9ydCAqKUZyZWVJbWFnZV9HZXRUYWdWYWx1ZSh0YWcpKTsKCQkJc3dpdGNoIChyZXNvbHV0aW9uVW5pdCkgewoJCQkJY2FzZSAxOgoJCQkJCXJldHVybiAiKE5vIHVuaXQpIjsKCQkJCWNhc2UgMjoKCQkJCQlyZXR1cm4gImluY2hlcyI7CgkJCQljYXNlIDM6CgkJCQkJcmV0dXJuICJjbSI7CgkJCQlkZWZhdWx0OgoJCQkJCWJyZWFrOwoJCQl9CgkJfQoJCWJyZWFrOwoKCQljYXNlIFRBR19ZQ0JDUl9QT1NJVElPTklORzoKCQl7CgkJCXVuc2lnbmVkIHNob3J0IHlDYkNyUG9zaXRpb24gPSAqKCh1bnNpZ25lZCBzaG9ydCAqKUZyZWVJbWFnZV9HZXRUYWdWYWx1ZSh0YWcpKTsKCQkJc3dpdGNoICh5Q2JDclBvc2l0aW9uKSB7CgkJCQljYXNlIDE6CgkJCQkJcmV0dXJuICJDZW50ZXIgb2YgcGl4ZWwgYXJyYXkiOwoJCQkJY2FzZSAyOgoJCQkJCXJldHVybiAiRGF0dW0gcG9pbnQiOwoJCQkJZGVmYXVsdDoKCQkJCQlicmVhazsKCQkJfQoJCX0gCgkJYnJlYWs7CgoJCWNhc2UgVEFHX0VYUE9TVVJFX1RJTUU6CgkJewoJCQlGSVJhdGlvbmFsIHIodGFnKTsKCQkJYnVmZmVyID0gci50b1N0cmluZygpOwoJCQlidWZmZXIgKz0gIiBzZWMiOwoJCQlyZXR1cm4gYnVmZmVyLmNfc3RyKCk7CgkJfQoJCWJyZWFrOwoKCQljYXNlIFRBR19TSFVUVEVSX1NQRUVEX1ZBTFVFOgoJCXsKCQkJRklSYXRpb25hbCByKHRhZyk7CgkJCUxPTkcgYXBleFZhbHVlID0gci5sb25nVmFsdWUoKTsKCQkJTE9ORyBhcGV4UG93ZXIgPSAxIDw8IGFwZXhWYWx1ZTsKCQkJc3ByaW50Zihmb3JtYXQsICIxLyVkIHNlYyIsIChpbnQpYXBleFBvd2VyKTsKCQkJYnVmZmVyICs9IGZvcm1hdDsKCQkJcmV0dXJuIGJ1ZmZlci5jX3N0cigpOwoJCX0KCQlicmVhazsKCgkJY2FzZSBUQUdfQVBFUlRVUkVfVkFMVUU6CgkJY2FzZSBUQUdfTUFYX0FQRVJUVVJFX1ZBTFVFOgoJCXsKCQkJRklSYXRpb25hbCByKHRhZyk7CgkJCWRvdWJsZSBhcGVydHVyZUFwZXggPSByLmRvdWJsZVZhbHVlKCk7CgkgICAgICAgIGRvdWJsZSByb290VHdvID0gc3FydCgoZG91YmxlKTIpOwoJCQlkb3VibGUgZlN0b3AgPSBwb3cocm9vdFR3bywgYXBlcnR1cmVBcGV4KTsKCQkJc3ByaW50Zihmb3JtYXQsICJGJS4xZiIsIGZTdG9wKTsKCQkJYnVmZmVyICs9IGZvcm1hdDsKCQkJcmV0dXJuIGJ1ZmZlci5jX3N0cigpOwoJCX0KCQlicmVhazsKCgkJY2FzZSBUQUdfRk5VTUJFUjoKCQl7CgkJCUZJUmF0aW9uYWwgcih0YWcpOwoJCQlkb3VibGUgZm51bWJlciA9IHIuZG91YmxlVmFsdWUoKTsKCQkJc3ByaW50Zihmb3JtYXQsICJGJS4xZiIsIGZudW1iZXIpOwoJCQlidWZmZXIgKz0gZm9ybWF0OwoJCQlyZXR1cm4gYnVmZmVyLmNfc3RyKCk7CgkJfQoJCWJyZWFrOwoKCQljYXNlIFRBR19GT0NBTF9MRU5HVEg6CgkJewoJCQlGSVJhdGlvbmFsIHIodGFnKTsKCQkJZG91YmxlIGZvY2FsTGVuZ3RoID0gci5kb3VibGVWYWx1ZSgpOwoJCQlzcHJpbnRmKGZvcm1hdCwgIiUuMWYgbW0iLCBmb2NhbExlbmd0aCk7CgkJCWJ1ZmZlciArPSBmb3JtYXQ7CgkJCXJldHVybiBidWZmZXIuY19zdHIoKTsKCQl9CgkJYnJlYWs7CgoJCWNhc2UgVEFHX0ZPQ0FMX0xFTkdUSF9JTl8zNU1NX0ZJTE06CgkJewoJCQl1bnNpZ25lZCBzaG9ydCBmb2NhbExlbmd0aCA9ICooKHVuc2lnbmVkIHNob3J0ICopRnJlZUltYWdlX0dldFRhZ1ZhbHVlKHRhZykpOwoJCQlzcHJpbnRmKGZvcm1hdCwgIiVodSBtbSIsIGZvY2FsTGVuZ3RoKTsKCQkJYnVmZmVyICs9IGZvcm1hdDsKCQkJcmV0dXJuIGJ1ZmZlci5jX3N0cigpOwoJCX0KCQlicmVhazsKCgkJY2FzZSBUQUdfRkxBU0g6CgkJewoJCQl1bnNpZ25lZCBzaG9ydCBmbGFzaCA9ICooKHVuc2lnbmVkIHNob3J0ICopRnJlZUltYWdlX0dldFRhZ1ZhbHVlKHRhZykpOwoJCQlzd2l0Y2goZmxhc2gpIHsKCQkJCWNhc2UgMHgwMDAwOgoJCQkJCXJldHVybiAiRmxhc2ggZGlkIG5vdCBmaXJlIjsKCQkJCWNhc2UgMHgwMDAxOgoJCQkJCXJldHVybiAiRmxhc2ggZmlyZWQiOwoJCQkJY2FzZSAweDAwMDU6CgkJCQkJcmV0dXJuICJTdHJvYmUgcmV0dXJuIGxpZ2h0IG5vdCBkZXRlY3RlZCI7CgkJCQljYXNlIDB4MDAwNzoKCQkJCQlyZXR1cm4gIlN0cm9iZSByZXR1cm4gbGlnaHQgZGV0ZWN0ZWQiOwoJCQkJY2FzZSAweDAwMDk6CgkJCQkJcmV0dXJuICJGbGFzaCBmaXJlZCwgY29tcHVsc29yeSBmbGFzaCBtb2RlIjsKCQkJCWNhc2UgMHgwMDBEOgoJCQkJCXJldHVybiAiRmxhc2ggZmlyZWQsIGNvbXB1bHNvcnkgZmxhc2ggbW9kZSwgcmV0dXJuIGxpZ2h0IG5vdCBkZXRlY3RlZCI7CgkJCQljYXNlIDB4MDAwRjoKCQkJCQlyZXR1cm4gIkZsYXNoIGZpcmVkLCBjb21wdWxzb3J5IGZsYXNoIG1vZGUsIHJldHVybiBsaWdodCBkZXRlY3RlZCI7CgkJCQljYXNlIDB4MDAxMDoKCQkJCQlyZXR1cm4gIkZsYXNoIGRpZCBub3QgZmlyZSwgY29tcHVsc29yeSBmbGFzaCBtb2RlIjsKCQkJCWNhc2UgMHgwMDE4OgoJCQkJCXJldHVybiAiRmxhc2ggZGlkIG5vdCBmaXJlLCBhdXRvIG1vZGUiOwoJCQkJY2FzZSAweDAwMTk6CgkJCQkJcmV0dXJuICJGbGFzaCBmaXJlZCwgYXV0byBtb2RlIjsKCQkJCWNhc2UgMHgwMDFEOgoJCQkJCXJldHVybiAiRmxhc2ggZmlyZWQsIGF1dG8gbW9kZSwgcmV0dXJuIGxpZ2h0IG5vdCBkZXRlY3RlZCI7CgkJCQljYXNlIDB4MDAxRjoKCQkJCQlyZXR1cm4gIkZsYXNoIGZpcmVkLCBhdXRvIG1vZGUsIHJldHVybiBsaWdodCBkZXRlY3RlZCI7CgkJCQljYXNlIDB4MDAyMDoKCQkJCQlyZXR1cm4gIk5vIGZsYXNoIGZ1bmN0aW9uIjsKCQkJCWNhc2UgMHgwMDQxOgoJCQkJCXJldHVybiAiRmxhc2ggZmlyZWQsIHJlZC1leWUgcmVkdWN0aW9uIG1vZGUiOwoJCQkJY2FzZSAweDAwNDU6CgkJCQkJcmV0dXJuICJGbGFzaCBmaXJlZCwgcmVkLWV5ZSByZWR1Y3Rpb24gbW9kZSwgcmV0dXJuIGxpZ2h0IG5vdCBkZXRlY3RlZCI7CgkJCQljYXNlIDB4MDA0NzoKCQkJCQlyZXR1cm4gIkZsYXNoIGZpcmVkLCByZWQtZXllIHJlZHVjdGlvbiBtb2RlLCByZXR1cm4gbGlnaHQgZGV0ZWN0ZWQiOwoJCQkJY2FzZSAweDAwNDk6CgkJCQkJcmV0dXJuICJGbGFzaCBmaXJlZCwgY29tcHVsc29yeSBmbGFzaCBtb2RlLCByZWQtZXllIHJlZHVjdGlvbiBtb2RlIjsKCQkJCWNhc2UgMHgwMDREOgoJCQkJCXJldHVybiAiRmxhc2ggZmlyZWQsIGNvbXB1bHNvcnkgZmxhc2ggbW9kZSwgcmVkLWV5ZSByZWR1Y3Rpb24gbW9kZSwgcmV0dXJuIGxpZ2h0IG5vdCBkZXRlY3RlZCI7CgkJCQljYXNlIDB4MDA0RjoKCQkJCQlyZXR1cm4gIkZsYXNoIGZpcmVkLCBjb21wdWxzb3J5IGZsYXNoIG1vZGUsIHJlZC1leWUgcmVkdWN0aW9uIG1vZGUsIHJldHVybiBsaWdodCBkZXRlY3RlZCI7CgkJCQljYXNlIDB4MDA1OToKCQkJCQlyZXR1cm4gIkZsYXNoIGZpcmVkLCBhdXRvIG1vZGUsIHJlZC1leWUgcmVkdWN0aW9uIG1vZGUiOwoJCQkJY2FzZSAweDAwNUQ6CgkJCQkJcmV0dXJuICJGbGFzaCBmaXJlZCwgYXV0byBtb2RlLCByZXR1cm4gbGlnaHQgbm90IGRldGVjdGVkLCByZWQtZXllIHJlZHVjdGlvbiBtb2RlIjsKCQkJCWNhc2UgMHgwMDVGOgoJCQkJCXJldHVybiAiRmxhc2ggZmlyZWQsIGF1dG8gbW9kZSwgcmV0dXJuIGxpZ2h0IGRldGVjdGVkLCByZWQtZXllIHJlZHVjdGlvbiBtb2RlIjsKCQkJCWRlZmF1bHQ6CgkJCQkJc3ByaW50Zihmb3JtYXQsICJVbmtub3duICglZCkiLCBmbGFzaCk7CgkJCQkJYnVmZmVyICs9IGZvcm1hdDsKCQkJCQlyZXR1cm4gYnVmZmVyLmNfc3RyKCk7CgkJCX0KCQl9CgkJYnJlYWs7CgoJCWNhc2UgVEFHX1NDRU5FX1RZUEU6CgkJewoJCQlCWVRFIHNjZW5lVHlwZSA9ICooKEJZVEUqKUZyZWVJbWFnZV9HZXRUYWdWYWx1ZSh0YWcpKTsKCQkJaWYgKHNjZW5lVHlwZSA9PSAxKSB7CgkJCQlyZXR1cm4gIkRpcmVjdGx5IHBob3RvZ3JhcGhlZCBpbWFnZSI7CgkJCX0gZWxzZSB7CgkJCQlzcHJpbnRmKGZvcm1hdCwgIlVua25vd24gKCVkKSIsIHNjZW5lVHlwZSk7CgkJCQlidWZmZXIgKz0gZm9ybWF0OwoJCQkJcmV0dXJuIGJ1ZmZlci5jX3N0cigpOwoJCQl9CgkJfQoJCWJyZWFrOwoKCQljYXNlIFRBR19TVUJKRUNUX0RJU1RBTkNFOgoJCXsKCQkJRklSYXRpb25hbCByKHRhZyk7CgkJCWlmKHIuZ2V0TnVtZXJhdG9yKCkgPT0gMHhGRkZGRkZGRikgewoJCQkJcmV0dXJuICJJbmZpbml0eSI7CgkJCX0gZWxzZSBpZihyLmdldE51bWVyYXRvcigpID09IDApIHsKCQkJCXJldHVybiAiRGlzdGFuY2UgdW5rbm93biI7CgkJCX0gZWxzZSB7CgkJCQlkb3VibGUgZGlzdGFuY2UgPSByLmRvdWJsZVZhbHVlKCk7CgkJCQlzcHJpbnRmKGZvcm1hdCwgIiUuM2YgbWV0ZXJzIiwgZGlzdGFuY2UpOwoJCQkJYnVmZmVyICs9IGZvcm1hdDsKCQkJCXJldHVybiBidWZmZXIuY19zdHIoKTsKCQkJfQoJCX0KCQlicmVhazsKCQkJCgkJY2FzZSBUQUdfTUVURVJJTkdfTU9ERToKCQl7CgkJCXVuc2lnbmVkIHNob3J0IG1ldGVyaW5nTW9kZSA9ICooKHVuc2lnbmVkIHNob3J0ICopRnJlZUltYWdlX0dldFRhZ1ZhbHVlKHRhZykpOwoJCQlzd2l0Y2ggKG1ldGVyaW5nTW9kZSkgewoJCQkJY2FzZSAwOgoJCQkJCXJldHVybiAiVW5rbm93biI7CgkJCQljYXNlIDE6CgkJCQkJcmV0dXJuICJBdmVyYWdlIjsKCQkJCWNhc2UgMjoKCQkJCQlyZXR1cm4gIkNlbnRlciB3ZWlnaHRlZCBhdmVyYWdlIjsKCQkJCWNhc2UgMzoKCQkJCQlyZXR1cm4gIlNwb3QiOwoJCQkJY2FzZSA0OgoJCQkJCXJldHVybiAiTXVsdGktc3BvdCI7CgkJCQljYXNlIDU6CgkJCQkJcmV0dXJuICJNdWx0aS1zZWdtZW50IjsKCQkJCWNhc2UgNjoKCQkJCQlyZXR1cm4gIlBhcnRpYWwiOwoJCQkJY2FzZSAyNTU6CgkJCQkJcmV0dXJuICIoT3RoZXIpIjsKCQkJCWRlZmF1bHQ6CgkJCQkJcmV0dXJuICIiOwoJCQl9CgkJfQoJCWJyZWFrOwoKCQljYXNlIFRBR19MSUdIVF9TT1VSQ0U6CgkJewoJCQl1bnNpZ25lZCBzaG9ydCBsaWdodFNvdXJjZSA9ICooKHVuc2lnbmVkIHNob3J0ICopRnJlZUltYWdlX0dldFRhZ1ZhbHVlKHRhZykpOwoJCQlzd2l0Y2ggKGxpZ2h0U291cmNlKSB7CgkJCQljYXNlIDA6CgkJCQkJcmV0dXJuICJVbmtub3duIjsKCQkJCWNhc2UgMToKCQkJCQlyZXR1cm4gIkRheWxpZ2h0IjsKCQkJCWNhc2UgMjoKCQkJCQlyZXR1cm4gIkZsdW9yZXNjZW50IjsKCQkJCWNhc2UgMzoKCQkJCQlyZXR1cm4gIlR1bmdzdGVuIChpbmNhbmRlc2NlbnQgbGlnaHQpIjsKCQkJCWNhc2UgNDoKCQkJCQlyZXR1cm4gIkZsYXNoIjsKCQkJCWNhc2UgOToKCQkJCQlyZXR1cm4gIkZpbmUgd2VhdGhlciI7CgkJCQljYXNlIDEwOgoJCQkJCXJldHVybiAiQ2xvdWR5IHdlYXRoZXIiOwoJCQkJY2FzZSAxMToKCQkJCQlyZXR1cm4gIlNoYWRlIjsKCQkJCWNhc2UgMTI6CgkJCQkJcmV0dXJuICJEYXlsaWdodCBmbHVvcmVzY2VudCAoRCA1NzAwIC0gNzEwMEspIjsKCQkJCWNhc2UgMTM6CgkJCQkJcmV0dXJuICJEYXkgd2hpdGUgZmx1b3Jlc2NlbnQgKE4gNDYwMCAtIDU0MDBLKSI7CgkJCQljYXNlIDE0OgoJCQkJCXJldHVybiAiQ29vbCB3aGl0ZSBmbHVvcmVzY2VudCAoVyAzOTAwIC0gNDUwMEspIjsKCQkJCWNhc2UgMTU6CgkJCQkJcmV0dXJuICJXaGl0ZSBmbHVvcmVzY2VudCAoV1cgMzIwMCAtIDM3MDBLKSI7CgkJCQljYXNlIDE3OgoJCQkJCXJldHVybiAiU3RhbmRhcmQgbGlnaHQgQSI7CgkJCQljYXNlIDE4OgoJCQkJCXJldHVybiAiU3RhbmRhcmQgbGlnaHQgQiI7CgkJCQljYXNlIDE5OgoJCQkJCXJldHVybiAiU3RhbmRhcmQgbGlnaHQgQyI7CgkJCQljYXNlIDIwOgoJCQkJCXJldHVybiAiRDU1IjsKCQkJCWNhc2UgMjE6CgkJCQkJcmV0dXJuICJENjUiOwoJCQkJY2FzZSAyMjoKCQkJCQlyZXR1cm4gIkQ3NSI7CgkJCQljYXNlIDIzOgoJCQkJCXJldHVybiAiRDUwIjsKCQkJCWNhc2UgMjQ6CgkJCQkJcmV0dXJuICJJU08gc3R1ZGlvIHR1bmdzdGVuIjsKCQkJCWNhc2UgMjU1OgoJCQkJCXJldHVybiAiKE90aGVyKSI7CgkJCQlkZWZhdWx0OgoJCQkJCXJldHVybiAiIjsKCQkJfQoJCX0KCQlicmVhazsKCgkJY2FzZSBUQUdfU0VOU0lOR19NRVRIT0Q6CgkJewoJCQl1bnNpZ25lZCBzaG9ydCBzZW5zaW5nTWV0aG9kID0gKigodW5zaWduZWQgc2hvcnQgKilGcmVlSW1hZ2VfR2V0VGFnVmFsdWUodGFnKSk7CgoJCQlzd2l0Y2ggKHNlbnNpbmdNZXRob2QpIHsKCQkJCWNhc2UgMToKCQkJCQlyZXR1cm4gIihOb3QgZGVmaW5lZCkiOwoJCQkJY2FzZSAyOgoJCQkJCXJldHVybiAiT25lLWNoaXAgY29sb3IgYXJlYSBzZW5zb3IiOwoJCQkJY2FzZSAzOgoJCQkJCXJldHVybiAiVHdvLWNoaXAgY29sb3IgYXJlYSBzZW5zb3IiOwoJCQkJY2FzZSA0OgoJCQkJCXJldHVybiAiVGhyZWUtY2hpcCBjb2xvciBhcmVhIHNlbnNvciI7CgkJCQljYXNlIDU6CgkJCQkJcmV0dXJuICJDb2xvciBzZXF1ZW50aWFsIGFyZWEgc2Vuc29yIjsKCQkJCWNhc2UgNzoKCQkJCQlyZXR1cm4gIlRyaWxpbmVhciBzZW5zb3IiOwoJCQkJY2FzZSA4OgoJCQkJCXJldHVybiAiQ29sb3Igc2VxdWVudGlhbCBsaW5lYXIgc2Vuc29yIjsKCQkJCWRlZmF1bHQ6CgkJCQkJcmV0dXJuICIiOwoJCQl9CgkJfQoJCWJyZWFrOwoKCQljYXNlIFRBR19GSUxFX1NPVVJDRToKCQl7CgkJCUJZVEUgZmlsZVNvdXJjZSA9ICooKEJZVEUqKUZyZWVJbWFnZV9HZXRUYWdWYWx1ZSh0YWcpKTsKCQkJaWYgKGZpbGVTb3VyY2UgPT0gMykgewoJCQkJcmV0dXJuICJEaWdpdGFsIFN0aWxsIENhbWVyYSAoRFNDKSI7CgkJCX0gZWxzZSB7CgkJCQlzcHJpbnRmKGZvcm1hdCwgIlVua25vd24gKCVkKSIsIGZpbGVTb3VyY2UpOwoJCQkJYnVmZmVyICs9IGZvcm1hdDsKCQkJCXJldHVybiBidWZmZXIuY19zdHIoKTsKCQkJfQogICAgICAgIH0KCQlicmVhazsKCgkJY2FzZSBUQUdfRVhQT1NVUkVfUFJPR1JBTToKCQl7CgkJCXVuc2lnbmVkIHNob3J0IGV4cG9zdXJlUHJvZ3JhbSA9ICooKHVuc2lnbmVkIHNob3J0ICopRnJlZUltYWdlX0dldFRhZ1ZhbHVlKHRhZykpOwoKCQkJc3dpdGNoIChleHBvc3VyZVByb2dyYW0pIHsKCQkJCWNhc2UgMToKCQkJCQlyZXR1cm4gIk1hbnVhbCBjb250cm9sIjsKCQkJCWNhc2UgMjoKCQkJCQlyZXR1cm4gIlByb2dyYW0gbm9ybWFsIjsKCQkJCWNhc2UgMzoKCQkJCQlyZXR1cm4gIkFwZXJ0dXJlIHByaW9yaXR5IjsKCQkJCWNhc2UgNDoKCQkJCQlyZXR1cm4gIlNodXR0ZXIgcHJpb3JpdHkiOwoJCQkJY2FzZSA1OgoJCQkJCXJldHVybiAiUHJvZ3JhbSBjcmVhdGl2ZSAoc2xvdyBwcm9ncmFtKSI7CgkJCQljYXNlIDY6CgkJCQkJcmV0dXJuICJQcm9ncmFtIGFjdGlvbiAoaGlnaC1zcGVlZCBwcm9ncmFtKSI7CgkJCQljYXNlIDc6CgkJCQkJcmV0dXJuICJQb3J0cmFpdCBtb2RlIjsKCQkJCWNhc2UgODoKCQkJCQlyZXR1cm4gIkxhbmRzY2FwZSBtb2RlIjsKCQkJCWRlZmF1bHQ6CgkJCQkJc3ByaW50Zihmb3JtYXQsICJVbmtub3duIHByb2dyYW0gKCVkKSIsIGV4cG9zdXJlUHJvZ3JhbSk7CgkJCQkJYnVmZmVyICs9IGZvcm1hdDsKCQkJCQlyZXR1cm4gYnVmZmVyLmNfc3RyKCk7CgkJCX0KCQl9CgkJYnJlYWs7CgoJCWNhc2UgVEFHX0NVU1RPTV9SRU5ERVJFRDoKCQl7CgkJCXVuc2lnbmVkIHNob3J0IGN1c3RvbVJlbmRlcmVkID0gKigodW5zaWduZWQgc2hvcnQgKilGcmVlSW1hZ2VfR2V0VGFnVmFsdWUodGFnKSk7CgoJCQlzd2l0Y2ggKGN1c3RvbVJlbmRlcmVkKSB7CgkJCQljYXNlIDA6CgkJCQkJcmV0dXJuICJOb3JtYWwgcHJvY2VzcyI7CgkJCQljYXNlIDE6CgkJCQkJcmV0dXJuICJDdXN0b20gcHJvY2VzcyI7CgkJCQlkZWZhdWx0OgoJCQkJCXNwcmludGYoZm9ybWF0LCAiVW5rbm93biByZW5kZXJpbmcgKCVkKSIsIGN1c3RvbVJlbmRlcmVkKTsKCQkJCQlidWZmZXIgKz0gZm9ybWF0OwoJCQkJCXJldHVybiBidWZmZXIuY19zdHIoKTsKCQkJfQoJCX0KCQlicmVhazsKCgkJY2FzZSBUQUdfRVhQT1NVUkVfTU9ERToKCQl7CgkJCXVuc2lnbmVkIHNob3J0IGV4cG9zdXJlTW9kZSA9ICooKHVuc2lnbmVkIHNob3J0ICopRnJlZUltYWdlX0dldFRhZ1ZhbHVlKHRhZykpOwoKCQkJc3dpdGNoIChleHBvc3VyZU1vZGUpIHsKCQkJCWNhc2UgMDoKCQkJCQlyZXR1cm4gIkF1dG8gZXhwb3N1cmUiOwoJCQkJY2FzZSAxOgoJCQkJCXJldHVybiAiTWFudWFsIGV4cG9zdXJlIjsKCQkJCWNhc2UgMjoKCQkJCQlyZXR1cm4gIkF1dG8gYnJhY2tldCI7CgkJCQlkZWZhdWx0OgoJCQkJCXNwcmludGYoZm9ybWF0LCAiVW5rbm93biBtb2RlICglZCkiLCBleHBvc3VyZU1vZGUpOwoJCQkJCWJ1ZmZlciArPSBmb3JtYXQ7CgkJCQkJcmV0dXJuIGJ1ZmZlci5jX3N0cigpOwoJCQl9CgkJfQoJCWJyZWFrOwoKCQljYXNlIFRBR19XSElURV9CQUxBTkNFOgoJCXsKCQkJdW5zaWduZWQgc2hvcnQgd2hpdGVCYWxhbmNlID0gKigodW5zaWduZWQgc2hvcnQgKilGcmVlSW1hZ2VfR2V0VGFnVmFsdWUodGFnKSk7CgoJCQlzd2l0Y2ggKHdoaXRlQmFsYW5jZSkgewoJCQkJY2FzZSAwOgoJCQkJCXJldHVybiAiQXV0byB3aGl0ZSBiYWxhbmNlIjsKCQkJCWNhc2UgMToKCQkJCQlyZXR1cm4gIk1hbnVhbCB3aGl0ZSBiYWxhbmNlIjsKCQkJCWRlZmF1bHQ6CgkJCQkJc3ByaW50Zihmb3JtYXQsICJVbmtub3duICglZCkiLCB3aGl0ZUJhbGFuY2UpOwoJCQkJCWJ1ZmZlciArPSBmb3JtYXQ7CgkJCQkJcmV0dXJuIGJ1ZmZlci5jX3N0cigpOwoJCQl9CgkJfQoJCWJyZWFrOwoKCQljYXNlIFRBR19TQ0VORV9DQVBUVVJFX1RZUEU6CgkJewoJCQl1bnNpZ25lZCBzaG9ydCBzY2VuZVR5cGUgPSAqKCh1bnNpZ25lZCBzaG9ydCAqKUZyZWVJbWFnZV9HZXRUYWdWYWx1ZSh0YWcpKTsKCgkJCXN3aXRjaCAoc2NlbmVUeXBlKSB7CgkJCQljYXNlIDA6CgkJCQkJcmV0dXJuICJTdGFuZGFyZCI7CgkJCQljYXNlIDE6CgkJCQkJcmV0dXJuICJMYW5kc2NhcGUiOwoJCQkJY2FzZSAyOgoJCQkJCXJldHVybiAiUG9ydHJhaXQiOwoJCQkJY2FzZSAzOgoJCQkJCXJldHVybiAiTmlnaHQgc2NlbmUiOwoJCQkJZGVmYXVsdDoKCQkJCQlzcHJpbnRmKGZvcm1hdCwgIlVua25vd24gKCVkKSIsIHNjZW5lVHlwZSk7CgkJCQkJYnVmZmVyICs9IGZvcm1hdDsKCQkJCQlyZXR1cm4gYnVmZmVyLmNfc3RyKCk7CgkJCX0KCQl9CgkJYnJlYWs7CgoJCWNhc2UgVEFHX0dBSU5fQ09OVFJPTDoKCQl7CgkJCXVuc2lnbmVkIHNob3J0IGdhaW5Db250cm9sID0gKigodW5zaWduZWQgc2hvcnQgKilGcmVlSW1hZ2VfR2V0VGFnVmFsdWUodGFnKSk7CgoJCQlzd2l0Y2ggKGdhaW5Db250cm9sKSB7CgkJCQljYXNlIDA6CgkJCQkJcmV0dXJuICJOb25lIjsKCQkJCWNhc2UgMToKCQkJCQlyZXR1cm4gIkxvdyBnYWluIHVwIjsKCQkJCWNhc2UgMjoKCQkJCQlyZXR1cm4gIkhpZ2ggZ2FpbiB1cCI7CgkJCQljYXNlIDM6CgkJCQkJcmV0dXJuICJMb3cgZ2FpbiBkb3duIjsKCQkJCWNhc2UgNDoKCQkJCQlyZXR1cm4gIkhpZ2ggZ2FpbiBkb3duIjsKCQkJCWRlZmF1bHQ6CgkJCQkJc3ByaW50Zihmb3JtYXQsICJVbmtub3duICglZCkiLCBnYWluQ29udHJvbCk7CgkJCQkJYnVmZmVyICs9IGZvcm1hdDsKCQkJCQlyZXR1cm4gYnVmZmVyLmNfc3RyKCk7CgkJCX0KCQl9CgkJYnJlYWs7CgoJCWNhc2UgVEFHX0NPTlRSQVNUOgoJCXsKCQkJdW5zaWduZWQgc2hvcnQgY29udHJhc3QgPSAqKCh1bnNpZ25lZCBzaG9ydCAqKUZyZWVJbWFnZV9HZXRUYWdWYWx1ZSh0YWcpKTsKCgkJCXN3aXRjaCAoY29udHJhc3QpIHsKCQkJCWNhc2UgMDoKCQkJCQlyZXR1cm4gIk5vcm1hbCI7CgkJCQljYXNlIDE6CgkJCQkJcmV0dXJuICJTb2Z0IjsKCQkJCWNhc2UgMjoKCQkJCQlyZXR1cm4gIkhhcmQiOwoJCQkJZGVmYXVsdDoKCQkJCQlzcHJpbnRmKGZvcm1hdCwgIlVua25vd24gKCVkKSIsIGNvbnRyYXN0KTsKCQkJCQlidWZmZXIgKz0gZm9ybWF0OwoJCQkJCXJldHVybiBidWZmZXIuY19zdHIoKTsKCQkJfQoJCX0KCQlicmVhazsKCgkJY2FzZSBUQUdfU0FUVVJBVElPTjoKCQl7CgkJCXVuc2lnbmVkIHNob3J0IHNhdHVyYXRpb24gPSAqKCh1bnNpZ25lZCBzaG9ydCAqKUZyZWVJbWFnZV9HZXRUYWdWYWx1ZSh0YWcpKTsKCgkJCXN3aXRjaCAoc2F0dXJhdGlvbikgewoJCQkJY2FzZSAwOgoJCQkJCXJldHVybiAiTm9ybWFsIjsKCQkJCWNhc2UgMToKCQkJCQlyZXR1cm4gIkxvdyBzYXR1cmF0aW9uIjsKCQkJCWNhc2UgMjoKCQkJCQlyZXR1cm4gIkhpZ2ggc2F0dXJhdGlvbiI7CgkJCQlkZWZhdWx0OgoJCQkJCXNwcmludGYoZm9ybWF0LCAiVW5rbm93biAoJWQpIiwgc2F0dXJhdGlvbik7CgkJCQkJYnVmZmVyICs9IGZvcm1hdDsKCQkJCQlyZXR1cm4gYnVmZmVyLmNfc3RyKCk7CgkJCX0KCQl9CgkJYnJlYWs7CgoJCWNhc2UgVEFHX1NIQVJQTkVTUzoKCQl7CgkJCXVuc2lnbmVkIHNob3J0IHNoYXJwbmVzcyA9ICooKHVuc2lnbmVkIHNob3J0ICopRnJlZUltYWdlX0dldFRhZ1ZhbHVlKHRhZykpOwoKCQkJc3dpdGNoIChzaGFycG5lc3MpIHsKCQkJCWNhc2UgMDoKCQkJCQlyZXR1cm4gIk5vcm1hbCI7CgkJCQljYXNlIDE6CgkJCQkJcmV0dXJuICJTb2Z0IjsKCQkJCWNhc2UgMjoKCQkJCQlyZXR1cm4gIkhhcmQiOwoJCQkJZGVmYXVsdDoKCQkJCQlzcHJpbnRmKGZvcm1hdCwgIlVua25vd24gKCVkKSIsIHNoYXJwbmVzcyk7CgkJCQkJYnVmZmVyICs9IGZvcm1hdDsKCQkJCQlyZXR1cm4gYnVmZmVyLmNfc3RyKCk7CgkJCX0KCQl9CgkJYnJlYWs7CgoJCWNhc2UgVEFHX1NVQkpFQ1RfRElTVEFOQ0VfUkFOR0U6CgkJewoJCQl1bnNpZ25lZCBzaG9ydCBkaXN0YW5jZVJhbmdlID0gKigodW5zaWduZWQgc2hvcnQgKilGcmVlSW1hZ2VfR2V0VGFnVmFsdWUodGFnKSk7CgoJCQlzd2l0Y2ggKGRpc3RhbmNlUmFuZ2UpIHsKCQkJCWNhc2UgMDoKCQkJCQlyZXR1cm4gInVua25vd24iOwoJCQkJY2FzZSAxOgoJCQkJCXJldHVybiAiTWFjcm8iOwoJCQkJY2FzZSAyOgoJCQkJCXJldHVybiAiQ2xvc2UgdmlldyI7CgkJCQljYXNlIDM6CgkJCQkJcmV0dXJuICJEaXN0YW50IHZpZXciOwoJCQkJZGVmYXVsdDoKCQkJCQlzcHJpbnRmKGZvcm1hdCwgIlVua25vd24gKCVkKSIsIGRpc3RhbmNlUmFuZ2UpOwoJCQkJCWJ1ZmZlciArPSBmb3JtYXQ7CgkJCQkJcmV0dXJuIGJ1ZmZlci5jX3N0cigpOwoJCQl9CgkJfQoJCWJyZWFrOwoKCQljYXNlIFRBR19JU09fU1BFRURfUkFUSU5HUzoKCQl7CgkJCXVuc2lnbmVkIHNob3J0IGlzb0VxdWl2ID0gKigodW5zaWduZWQgc2hvcnQgKilGcmVlSW1hZ2VfR2V0VGFnVmFsdWUodGFnKSk7CgkJCWlmIChpc29FcXVpdiA8IDUwKSB7CgkJCQlpc29FcXVpdiAqPSAyMDA7CgkJCX0KCQkJc3ByaW50Zihmb3JtYXQsICIlZCIsIGlzb0VxdWl2KTsKCQkJYnVmZmVyICs9IGZvcm1hdDsKCQkJcmV0dXJuIGJ1ZmZlci5jX3N0cigpOwoJCX0KCQlicmVhazsKCgkJY2FzZSBUQUdfVVNFUl9DT01NRU5UOgoJCXsKCQkJLy8gZmlyc3QgOCBieXRlcyBhcmUgdXNlZCB0byBkZWZpbmUgYW4gSUQgY29kZQoJCQkvLyB3ZSBhc3N1bWUgdGhpcyBpcyBhbiBBU0NJSSBzdHJpbmcKCQkJY29uc3QgQllURSAqdXNlckNvbW1lbnQgPSAoQllURSopRnJlZUltYWdlX0dldFRhZ1ZhbHVlKHRhZyk7CgkJCWZvcihEV09SRCBpID0gODsgaSA8IEZyZWVJbWFnZV9HZXRUYWdMZW5ndGgodGFnKTsgaSsrKSB7CgkJCQlidWZmZXIgKz0gdXNlckNvbW1lbnRbaV07CgkJCX0KCQkJYnVmZmVyICs9ICdcMCc7CgkJCXJldHVybiBidWZmZXIuY19zdHIoKTsKCQl9CgkJYnJlYWs7CgoJCWNhc2UgVEFHX0NPTVBSRVNTSU9OOgoJCXsKCQkJV09SRCBjb21wcmVzc2lvbiA9ICooKFdPUkQqKUZyZWVJbWFnZV9HZXRUYWdWYWx1ZSh0YWcpKTsKCQkJc3dpdGNoKGNvbXByZXNzaW9uKSB7CgkJCQljYXNlIFRBR19DT01QUkVTU0lPTl9OT05FOgoJCQkJCXNwcmludGYoZm9ybWF0LCAiZHVtcCBtb2RlICglZCkiLCBjb21wcmVzc2lvbik7CgkJCQkJYnJlYWs7CgkJCQljYXNlIFRBR19DT01QUkVTU0lPTl9DQ0lUVFJMRToKCQkJCQlzcHJpbnRmKGZvcm1hdCwgIkNDSVRUIG1vZGlmaWVkIEh1ZmZtYW4gUkxFICglZCkiLCBjb21wcmVzc2lvbik7CgkJCQkJYnJlYWs7CgkJCQljYXNlIFRBR19DT01QUkVTU0lPTl9DQ0lUVEZBWDM6CgkJCQkJc3ByaW50Zihmb3JtYXQsICJDQ0lUVCBHcm91cCAzIGZheCBlbmNvZGluZyAoJWQpIiwgY29tcHJlc3Npb24pOwoJCQkJCWJyZWFrOwoJCQkJLyoKCQkJCWNhc2UgVEFHX0NPTVBSRVNTSU9OX0NDSVRUX1Q0OgoJCQkJCXNwcmludGYoZm9ybWF0LCAiQ0NJVFQgVC40IChUSUZGIDYgbmFtZSkgKCVkKSIsIGNvbXByZXNzaW9uKTsKCQkJCQlicmVhazsKCQkJCSovCgkJCQljYXNlIFRBR19DT01QUkVTU0lPTl9DQ0lUVEZBWDQ6CgkJCQkJc3ByaW50Zihmb3JtYXQsICJDQ0lUVCBHcm91cCA0IGZheCBlbmNvZGluZyAoJWQpIiwgY29tcHJlc3Npb24pOwoJCQkJCWJyZWFrOwoJCQkJLyoKCQkJCWNhc2UgVEFHX0NPTVBSRVNTSU9OX0NDSVRUX1Q2OgoJCQkJCXNwcmludGYoZm9ybWF0LCAiQ0NJVFQgVC42IChUSUZGIDYgbmFtZSkgKCVkKSIsIGNvbXByZXNzaW9uKTsKCQkJCQlicmVhazsKCQkJCSovCgkJCQljYXNlIFRBR19DT01QUkVTU0lPTl9MWlc6CgkJCQkJc3ByaW50Zihmb3JtYXQsICJMWlcgKCVkKSIsIGNvbXByZXNzaW9uKTsKCQkJCQlicmVhazsKCQkJCWNhc2UgVEFHX0NPTVBSRVNTSU9OX09KUEVHOgoJCQkJCXNwcmludGYoZm9ybWF0LCAiITYuMCBKUEVHICglZCkiLCBjb21wcmVzc2lvbik7CgkJCQkJYnJlYWs7CgkJCQljYXNlIFRBR19DT01QUkVTU0lPTl9KUEVHOgoJCQkJCXNwcmludGYoZm9ybWF0LCAiSlBFRyAoJWQpIiwgY29tcHJlc3Npb24pOwoJCQkJCWJyZWFrOwoJCQkJY2FzZSBUQUdfQ09NUFJFU1NJT05fTkVYVDoKCQkJCQlzcHJpbnRmKGZvcm1hdCwgIk5lWFQgMi1iaXQgUkxFICglZCkiLCBjb21wcmVzc2lvbik7CgkJCQkJYnJlYWs7CgkJCQljYXNlIFRBR19DT01QUkVTU0lPTl9DQ0lUVFJMRVc6CgkJCQkJc3ByaW50Zihmb3JtYXQsICJDQ0lUVFJMRVcgKCVkKSIsIGNvbXByZXNzaW9uKTsKCQkJCQlicmVhazsKCQkJCWNhc2UgVEFHX0NPTVBSRVNTSU9OX1BBQ0tCSVRTOgoJCQkJCXNwcmludGYoZm9ybWF0LCAiUGFja0JpdHMgTWFjaW50b3NoIFJMRSAoJWQpIiwgY29tcHJlc3Npb24pOwoJCQkJCWJyZWFrOwoJCQkJY2FzZSBUQUdfQ09NUFJFU1NJT05fVEhVTkRFUlNDQU46CgkJCQkJc3ByaW50Zihmb3JtYXQsICJUaHVuZGVyU2NhbiBSTEUgKCVkKSIsIGNvbXByZXNzaW9uKTsKCQkJCQlicmVhazsKCQkJCWNhc2UgVEFHX0NPTVBSRVNTSU9OX1BJWEFSRklMTToKCQkJCQlzcHJpbnRmKGZvcm1hdCwgIlBpeGFyIGNvbXBhbmRlZCAxMGJpdCBMWlcgKCVkKSIsIGNvbXByZXNzaW9uKTsKCQkJCQlicmVhazsKCQkJCWNhc2UgVEFHX0NPTVBSRVNTSU9OX1BJWEFSTE9HOgoJCQkJCXNwcmludGYoZm9ybWF0LCAiUGl4YXIgY29tcGFuZGVkIDExYml0IFpJUCAoJWQpIiwgY29tcHJlc3Npb24pOwoJCQkJCWJyZWFrOwoJCQkJY2FzZSBUQUdfQ09NUFJFU1NJT05fREVGTEFURToKCQkJCQlzcHJpbnRmKGZvcm1hdCwgIkRlZmxhdGUgY29tcHJlc3Npb24gKCVkKSIsIGNvbXByZXNzaW9uKTsKCQkJCQlicmVhazsKCQkJCWNhc2UgVEFHX0NPTVBSRVNTSU9OX0FET0JFX0RFRkxBVEU6CgkJCQkJc3ByaW50Zihmb3JtYXQsICJBZG9iZSBEZWZsYXRlIGNvbXByZXNzaW9uICglZCkiLCBjb21wcmVzc2lvbik7CgkJCQkJYnJlYWs7CgkJCQljYXNlIFRBR19DT01QUkVTU0lPTl9EQ1M6CgkJCQkJc3ByaW50Zihmb3JtYXQsICJLb2RhayBEQ1MgZW5jb2RpbmcgKCVkKSIsIGNvbXByZXNzaW9uKTsKCQkJCQlicmVhazsKCQkJCWNhc2UgVEFHX0NPTVBSRVNTSU9OX0pCSUc6CgkJCQkJc3ByaW50Zihmb3JtYXQsICJJU08gSkJJRyAoJWQpIiwgY29tcHJlc3Npb24pOwoJCQkJCWJyZWFrOwoJCQkJY2FzZSBUQUdfQ09NUFJFU1NJT05fU0dJTE9HOgoJCQkJCXNwcmludGYoZm9ybWF0LCAiU0dJIExvZyBMdW1pbmFuY2UgUkxFICglZCkiLCBjb21wcmVzc2lvbik7CgkJCQkJYnJlYWs7CgkJCQljYXNlIFRBR19DT01QUkVTU0lPTl9TR0lMT0cyNDoKCQkJCQlzcHJpbnRmKGZvcm1hdCwgIlNHSSBMb2cgMjQtYml0IHBhY2tlZCAoJWQpIiwgY29tcHJlc3Npb24pOwoJCQkJCWJyZWFrOwoJCQkJY2FzZSBUQUdfQ09NUFJFU1NJT05fSlAyMDAwOgoJCQkJCXNwcmludGYoZm9ybWF0LCAiTGVhZHRvb2xzIEpQRUcyMDAwICglZCkiLCBjb21wcmVzc2lvbik7CgkJCQkJYnJlYWs7CgkJCQljYXNlIFRBR19DT01QUkVTU0lPTl9MWk1BOgoJCQkJCXNwcmludGYoZm9ybWF0LCAiTFpNQTIgKCVkKSIsIGNvbXByZXNzaW9uKTsKCQkJCQlicmVhazsKCQkJCWRlZmF1bHQ6CgkJCQkJc3ByaW50Zihmb3JtYXQsICJVbmtub3duIHR5cGUgKCVkKSIsIGNvbXByZXNzaW9uKTsKCQkJCQlicmVhazsKCQkJfQoKCQkJYnVmZmVyICs9IGZvcm1hdDsKCQkJcmV0dXJuIGJ1ZmZlci5jX3N0cigpOwoJCX0KCQlicmVhazsKCX0KCglyZXR1cm4gQ29udmVydEFueVRhZyh0YWcpOwp9CgovKioKQ29udmVydCBhIEV4aWYgR1BTIHRhZyB0byBhIEMgc3RyaW5nCiovCnN0YXRpYyBjb25zdCBjaGFyKiAKQ29udmVydEV4aWZHUFNUYWcoRklUQUcgKnRhZykgewoJY2hhciBmb3JtYXRbTUFYX1RFWFRfRVhURU5UXTsKCXN0YXRpYyBzdGQ6OnN0cmluZyBidWZmZXI7CgoJaWYoIXRhZykKCQlyZXR1cm4gTlVMTDsKCglidWZmZXIuZXJhc2UoKTsKCgkvLyBjb252ZXJ0IHRoZSB0YWcgdmFsdWUgdG8gYSBzdHJpbmcgYnVmZmVyCgoJc3dpdGNoKEZyZWVJbWFnZV9HZXRUYWdJRCh0YWcpKSB7CgkJY2FzZSBUQUdfR1BTX0xBVElUVURFOgoJCWNhc2UgVEFHX0dQU19MT05HSVRVREU6CgkJY2FzZSBUQUdfR1BTX1RJTUVfU1RBTVA6CgkJewoJCQlEV09SRCAqcHZhbHVlID0gKERXT1JEKilGcmVlSW1hZ2VfR2V0VGFnVmFsdWUodGFnKTsKCQkJaWYoRnJlZUltYWdlX0dldFRhZ0xlbmd0aCh0YWcpID09IDI0KSB7CgkJCQkvLyBkZDptbTpzcyBvciBoaDptbTpzcwoJCQkJaW50IGRkID0gMCwgbW0gPSAwOwoJCQkJZG91YmxlIHNzID0gMDsKCgkJCQkvLyBjb252ZXJ0IHRvIHNlY29uZHMKCQkJCWlmKHB2YWx1ZVsxXSkKCQkJCQlzcyArPSAoKGRvdWJsZSlwdmFsdWVbMF0gLyAoZG91YmxlKXB2YWx1ZVsxXSkgKiAzNjAwOwoJCQkJaWYocHZhbHVlWzNdKQoJCQkJCXNzICs9ICgoZG91YmxlKXB2YWx1ZVsyXSAvIChkb3VibGUpcHZhbHVlWzNdKSAqIDYwOwoJCQkJaWYocHZhbHVlWzVdKQoJCQkJCXNzICs9ICgoZG91YmxlKXB2YWx1ZVs0XSAvIChkb3VibGUpcHZhbHVlWzVdKTsKCQkJCQoJCQkJLy8gY29udmVydCB0byBkZDptbTpzcy5zcwoJCQkJZGQgPSAoaW50KShzcyAvIDM2MDApOwoJCQkJbW0gPSAoaW50KShzcyAvIDYwKSAtIGRkICogNjA7CgkJCQlzcyA9IHNzIC0gZGQgKiAzNjAwIC0gbW0gKiA2MDsKCgkJCQlzcHJpbnRmKGZvcm1hdCwgIiVkOiVkOiUuMmYiLCBkZCwgbW0sIHNzKTsKCQkJCWJ1ZmZlciArPSBmb3JtYXQ7CgkJCQlyZXR1cm4gYnVmZmVyLmNfc3RyKCk7CgkJCX0KCQl9CgkJYnJlYWs7CgoJCWNhc2UgVEFHX0dQU19WRVJTSU9OX0lEOgoJCWNhc2UgVEFHX0dQU19MQVRJVFVERV9SRUY6CgkJY2FzZSBUQUdfR1BTX0xPTkdJVFVERV9SRUY6CgkJY2FzZSBUQUdfR1BTX0FMVElUVURFX1JFRjoKCQljYXNlIFRBR19HUFNfQUxUSVRVREU6CgkJY2FzZSBUQUdfR1BTX1NBVEVMTElURVM6CgkJY2FzZSBUQUdfR1BTX1NUQVRVUzoKCQljYXNlIFRBR19HUFNfTUVBU1VSRV9NT0RFOgoJCWNhc2UgVEFHX0dQU19ET1A6CgkJY2FzZSBUQUdfR1BTX1NQRUVEX1JFRjoKCQljYXNlIFRBR19HUFNfU1BFRUQ6CgkJY2FzZSBUQUdfR1BTX1RSQUNLX1JFRjoKCQljYXNlIFRBR19HUFNfVFJBQ0s6CgkJY2FzZSBUQUdfR1BTX0lNR19ESVJFQ1RJT05fUkVGOgoJCWNhc2UgVEFHX0dQU19JTUdfRElSRUNUSU9OOgoJCWNhc2UgVEFHX0dQU19NQVBfREFUVU06CgkJY2FzZSBUQUdfR1BTX0RFU1RfTEFUSVRVREVfUkVGOgoJCWNhc2UgVEFHX0dQU19ERVNUX0xBVElUVURFOgoJCWNhc2UgVEFHX0dQU19ERVNUX0xPTkdJVFVERV9SRUY6CgkJY2FzZSBUQUdfR1BTX0RFU1RfTE9OR0lUVURFOgoJCWNhc2UgVEFHX0dQU19ERVNUX0JFQVJJTkdfUkVGOgoJCWNhc2UgVEFHX0dQU19ERVNUX0JFQVJJTkc6CgkJY2FzZSBUQUdfR1BTX0RFU1RfRElTVEFOQ0VfUkVGOgoJCWNhc2UgVEFHX0dQU19ERVNUX0RJU1RBTkNFOgoJCWNhc2UgVEFHX0dQU19QUk9DRVNTSU5HX01FVEhPRDoKCQljYXNlIFRBR19HUFNfQVJFQV9JTkZPUk1BVElPTjoKCQljYXNlIFRBR19HUFNfREFURV9TVEFNUDoKCQljYXNlIFRBR19HUFNfRElGRkVSRU5USUFMOgoJCQlicmVhazsKCX0KCglyZXR1cm4gQ29udmVydEFueVRhZyh0YWcpOwp9CgovLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci8vIFRhZyB0byBzdHJpbmcgY29udmVyc2lvbiBmdW5jdGlvbgovLwoKY29uc3QgY2hhciogRExMX0NBTExDT05WIApGcmVlSW1hZ2VfVGFnVG9TdHJpbmcoRlJFRV9JTUFHRV9NRE1PREVMIG1vZGVsLCBGSVRBRyAqdGFnLCBjaGFyICpNYWtlKSB7Cglzd2l0Y2gobW9kZWwpIHsKCQljYXNlIEZJTURfRVhJRl9NQUlOOgoJCWNhc2UgRklNRF9FWElGX0VYSUY6CgkJCXJldHVybiBDb252ZXJ0RXhpZlRhZyh0YWcpOwoKCQljYXNlIEZJTURfRVhJRl9HUFM6CgkJCXJldHVybiBDb252ZXJ0RXhpZkdQU1RhZyh0YWcpOwoKCQljYXNlIEZJTURfRVhJRl9NQUtFUk5PVEU6CgkJCS8vIFdlIHNob3VsZCB1c2UgdGhlIE1ha2Ugc3RyaW5nIHRvIHNlbGVjdCBhbiBhcHByb3ByaWF0ZSBjb252ZXJzaW9uIGZ1bmN0aW9uCgkJCS8vIFRPIERPIC4uLgoJCQlicmVhazsKCgkJY2FzZSBGSU1EX0VYSUZfSU5URVJPUDoKCQlkZWZhdWx0OgoJCQlicmVhazsKCX0KCglyZXR1cm4gQ29udmVydEFueVRhZyh0YWcpOwp9Cgo=