LyoKICogIGxpbnV4L2ZzL2JpbmZtdF9zY3JpcHQuYwogKgogKiAgQ29weXJpZ2h0IChDKSAxOTk2ICBNYXJ0aW4gdm9uIEz2d2lzCiAqICBvcmlnaW5hbCAjIS1jaGVja2luZyBpbXBsZW1lbnRlZCBieSB0eXRzby4KICovCgojaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KI2luY2x1ZGUgPGxpbnV4L3N0YXQuaD4KI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KI2luY2x1ZGUgPGxpbnV4L2JpbmZtdHMuaD4KI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KI2luY2x1ZGUgPGxpbnV4L2ZpbGUuaD4KI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgojaW5jbHVkZSA8bGludXgvZnMuaD4KCnN0YXRpYyBpbnQgbG9hZF9zY3JpcHQoc3RydWN0IGxpbnV4X2JpbnBybSAqYnBybSxzdHJ1Y3QgcHRfcmVncyAqcmVncykKewoJY2hhciAqY3AsICppX25hbWUsICppX2FyZzsKCXN0cnVjdCBmaWxlICpmaWxlOwoJY2hhciBpbnRlcnBbQklOUFJNX0JVRl9TSVpFXTsKCWludCByZXR2YWw7CgoJaWYgKChicHJtLT5idWZbMF0gIT0gJyMnKSB8fCAoYnBybS0+YnVmWzFdICE9ICchJykgfHwgKGJwcm0tPnNoX2JhbmcpKSAKCQlyZXR1cm4gLUVOT0VYRUM7CgkvKgoJICogVGhpcyBzZWN0aW9uIGRvZXMgdGhlICMhIGludGVycHJldGF0aW9uLgoJICogU29ydGEgY29tcGxpY2F0ZWQsIGJ1dCBob3BlZnVsbHkgaXQgd2lsbCB3b3JrLiAgLVRZVAoJICovCgoJYnBybS0+c2hfYmFuZysrOwoJYWxsb3dfd3JpdGVfYWNjZXNzKGJwcm0tPmZpbGUpOwoJZnB1dChicHJtLT5maWxlKTsKCWJwcm0tPmZpbGUgPSBOVUxMOwoKCWJwcm0tPmJ1ZltCSU5QUk1fQlVGX1NJWkUgLSAxXSA9ICdcMCc7CglpZiAoKGNwID0gc3RyY2hyKGJwcm0tPmJ1ZiwgJ1xuJykpID09IE5VTEwpCgkJY3AgPSBicHJtLT5idWYrQklOUFJNX0JVRl9TSVpFLTE7CgkqY3AgPSAnXDAnOwoJd2hpbGUgKGNwID4gYnBybS0+YnVmKSB7CgkJY3AtLTsKCQlpZiAoKCpjcCA9PSAnICcpIHx8ICgqY3AgPT0gJ1x0JykpCgkJCSpjcCA9ICdcMCc7CgkJZWxzZQoJCQlicmVhazsKCX0KCWZvciAoY3AgPSBicHJtLT5idWYrMjsgKCpjcCA9PSAnICcpIHx8ICgqY3AgPT0gJ1x0Jyk7IGNwKyspOwoJaWYgKCpjcCA9PSAnXDAnKSAKCQlyZXR1cm4gLUVOT0VYRUM7IC8qIE5vIGludGVycHJldGVyIG5hbWUgZm91bmQgKi8KCWlfbmFtZSA9IGNwOwoJaV9hcmcgPSBOVUxMOwoJZm9yICggOyAqY3AgJiYgKCpjcCAhPSAnICcpICYmICgqY3AgIT0gJ1x0Jyk7IGNwKyspCgkJLyogbm90aGluZyAqLyA7Cgl3aGlsZSAoKCpjcCA9PSAnICcpIHx8ICgqY3AgPT0gJ1x0JykpCgkJKmNwKysgPSAnXDAnOwoJaWYgKCpjcCkKCQlpX2FyZyA9IGNwOwoJc3RyY3B5IChpbnRlcnAsIGlfbmFtZSk7CgkvKgoJICogT0ssIHdlJ3ZlIHBhcnNlZCBvdXQgdGhlIGludGVycHJldGVyIG5hbWUgYW5kCgkgKiAob3B0aW9uYWwpIGFyZ3VtZW50LgoJICogU3BsaWNlIGluICgxKSB0aGUgaW50ZXJwcmV0ZXIncyBuYW1lIGZvciBhcmd2WzBdCgkgKiAgICAgICAgICAgKDIpIChvcHRpb25hbCkgYXJndW1lbnQgdG8gaW50ZXJwcmV0ZXIKCSAqICAgICAgICAgICAoMykgZmlsZW5hbWUgb2Ygc2hlbGwgc2NyaXB0IChyZXBsYWNlIGFyZ3ZbMF0pCgkgKgoJICogVGhpcyBpcyBkb25lIGluIHJldmVyc2Ugb3JkZXIsIGJlY2F1c2Ugb2YgaG93IHRoZQoJICogdXNlciBlbnZpcm9ubWVudCBhbmQgYXJndW1lbnRzIGFyZSBzdG9yZWQuCgkgKi8KCXJldHZhbCA9IHJlbW92ZV9hcmdfemVybyhicHJtKTsKCWlmIChyZXR2YWwpCgkJcmV0dXJuIHJldHZhbDsKCXJldHZhbCA9IGNvcHlfc3RyaW5nc19rZXJuZWwoMSwgJmJwcm0tPmludGVycCwgYnBybSk7CglpZiAocmV0dmFsIDwgMCkgcmV0dXJuIHJldHZhbDsgCglicHJtLT5hcmdjKys7CglpZiAoaV9hcmcpIHsKCQlyZXR2YWwgPSBjb3B5X3N0cmluZ3Nfa2VybmVsKDEsICZpX2FyZywgYnBybSk7CgkJaWYgKHJldHZhbCA8IDApIHJldHVybiByZXR2YWw7IAoJCWJwcm0tPmFyZ2MrKzsKCX0KCXJldHZhbCA9IGNvcHlfc3RyaW5nc19rZXJuZWwoMSwgJmlfbmFtZSwgYnBybSk7CglpZiAocmV0dmFsKSByZXR1cm4gcmV0dmFsOyAKCWJwcm0tPmFyZ2MrKzsKCWJwcm0tPmludGVycCA9IGludGVycDsKCgkvKgoJICogT0ssIG5vdyByZXN0YXJ0IHRoZSBwcm9jZXNzIHdpdGggdGhlIGludGVycHJldGVyJ3MgZGVudHJ5LgoJICovCglmaWxlID0gb3Blbl9leGVjKGludGVycCk7CglpZiAoSVNfRVJSKGZpbGUpKQoJCXJldHVybiBQVFJfRVJSKGZpbGUpOwoKCWJwcm0tPmZpbGUgPSBmaWxlOwoJcmV0dmFsID0gcHJlcGFyZV9iaW5wcm0oYnBybSk7CglpZiAocmV0dmFsIDwgMCkKCQlyZXR1cm4gcmV0dmFsOwoJcmV0dXJuIHNlYXJjaF9iaW5hcnlfaGFuZGxlcihicHJtLHJlZ3MpOwp9CgpzdGF0aWMgc3RydWN0IGxpbnV4X2JpbmZtdCBzY3JpcHRfZm9ybWF0ID0gewoJLm1vZHVsZQkJPSBUSElTX01PRFVMRSwKCS5sb2FkX2JpbmFyeQk9IGxvYWRfc2NyaXB0LAp9OwoKc3RhdGljIGludCBfX2luaXQgaW5pdF9zY3JpcHRfYmluZm10KHZvaWQpCnsKCXJldHVybiByZWdpc3Rlcl9iaW5mbXQoJnNjcmlwdF9mb3JtYXQpOwp9CgpzdGF0aWMgdm9pZCBfX2V4aXQgZXhpdF9zY3JpcHRfYmluZm10KHZvaWQpCnsKCXVucmVnaXN0ZXJfYmluZm10KCZzY3JpcHRfZm9ybWF0KTsKfQoKY29yZV9pbml0Y2FsbChpbml0X3NjcmlwdF9iaW5mbXQpOwptb2R1bGVfZXhpdChleGl0X3NjcmlwdF9iaW5mbXQpOwpNT0RVTEVfTElDRU5TRSgiR1BMIik7Cg==