LyoKICogKEMpIENvcHlyaWdodCAyMDAyCiAqIERhbmllbCBFbmdzdHL2bSwgT21pY3JvbiBDZXRpIEFCLCBkYW5pZWxAb21pY3Jvbi5zZS4KICoKICogKEMpIENvcHlyaWdodCAyMDAyCiAqIFN5c2dvIFJlYWwtVGltZSBTb2x1dGlvbnMsIEdtYkggPHd3dy5lbGlub3MuY29tPgogKiBNYXJpdXMgR3JvZWdlciA8bWdyb2VnZXJAc3lzZ28uZGU+CiAqCiAqIChDKSBDb3B5cmlnaHQgMjAwMgogKiBTeXNnbyBSZWFsLVRpbWUgU29sdXRpb25zLCBHbWJIIDx3d3cuZWxpbm9zLmNvbT4KICogQWxleCBadWVwa2UgPGF6dUBzeXNnby5kZT4KICoKICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKICogcHJvamVjdC4KICoKICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwogKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgogKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICoKICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKICogTUEgMDIxMTEtMTMwNyBVU0EKICovCgovKgogKiBDUFUgc3BlY2lmaWMgY29kZQogKi8KCiNpbmNsdWRlIDxjb21tb24uaD4KI2luY2x1ZGUgPGNvbW1hbmQuaD4KI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3ItZmxhZ3MuaD4KI2luY2x1ZGUgPGFzbS9pbnRlcnJ1cHQuaD4KCi8qIENvbnN0cnVjdG9yIGZvciBhIGNvbnZlbnRpb25hbCBzZWdtZW50IEdEVCAob3IgTERUKSBlbnRyeSAqLwovKiBUaGlzIGlzIGEgbWFjcm8gc28gaXQgY2FuIGJlIHVzZWQgaW4gaW5pdGlhbGl6ZXJzICovCiNkZWZpbmUgR0RUX0VOVFJZKGZsYWdzLCBiYXNlLCBsaW1pdCkJCQlcCgkoKCgoYmFzZSkgICYgMHhmZjAwMDAwMFVMTCkgPDwgKDU2LTI0KSkgfAlcCgkgKCgoZmxhZ3MpICYgMHgwMDAwZjBmZlVMTCkgPDwgNDApIHwJCVwKCSAoKChsaW1pdCkgJiAweDAwMGYwMDAwVUxMKSA8PCAoNDgtMTYpKSB8CVwKCSAoKChiYXNlKSAgJiAweDAwZmZmZmZmVUxMKSA8PCAxNikgfAkJXAoJICgoKGxpbWl0KSAmIDB4MDAwMGZmZmZVTEwpKSkKCi8qCiAqIFNldCB1cCB0aGUgR0RUCiAqLwoKc3RydWN0IGdkdF9wdHIgewoJdTE2IGxlbjsKCXUzMiBwdHI7Cn0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CgpzdGF0aWMgdm9pZCByZWxvYWRfZ2R0KHZvaWQpCnsKCS8qIFRoZXJlIGFyZSBtYWNoaW5lcyB3aGljaCBhcmUga25vd24gdG8gbm90IGJvb3Qgd2l0aCB0aGUgR0RUCgkgICBiZWluZyA4LWJ5dGUgdW5hbGlnbmVkLiAgSW50ZWwgcmVjb21tZW5kcyAxNiBieXRlIGFsaWdubWVudC4gKi8KCXN0YXRpYyBjb25zdCB1NjQgYm9vdF9nZHRbXSBfX2F0dHJpYnV0ZV9fKChhbGlnbmVkKDE2KSkpID0gewoJCS8qIENTOiBjb2RlLCByZWFkL2V4ZWN1dGUsIDQgR0IsIGJhc2UgMCAqLwoJCVtHRFRfRU5UUllfMzJCSVRfQ1NdID0gR0RUX0VOVFJZKDB4YzA5YiwgMCwgMHhmZmZmZiksCgkJLyogRFM6IGRhdGEsIHJlYWQvd3JpdGUsIDQgR0IsIGJhc2UgMCAqLwoJCVtHRFRfRU5UUllfMzJCSVRfRFNdID0gR0RUX0VOVFJZKDB4YzA5MywgMCwgMHhmZmZmZiksCgkJLyogMTYtYml0IENTOiBjb2RlLCByZWFkL2V4ZWN1dGUsIDY0IGtCLCBiYXNlIDAgKi8KCQlbR0RUX0VOVFJZXzE2QklUX0NTXSA9IEdEVF9FTlRSWSgweDEwOWIsIDAsIDB4MGZmZmYpLAoJCS8qIDE2LWJpdCBEUzogZGF0YSwgcmVhZC93cml0ZSwgNjQga0IsIGJhc2UgMCAqLwoJCVtHRFRfRU5UUllfMTZCSVRfRFNdID0gR0RUX0VOVFJZKDB4MTA5MywgMCwgMHgwZmZmZiksCgl9OwoJc3RhdGljIHN0cnVjdCBnZHRfcHRyIGdkdDsKCglnZHQubGVuID0gc2l6ZW9mKGJvb3RfZ2R0KS0xOwoJZ2R0LnB0ciA9ICh1MzIpJmJvb3RfZ2R0OwoKCWFzbSB2b2xhdGlsZSgibGdkdGwgJTBcbiIgXAoJCSAgICAgIm1vdmwgJCgoMisxKSo4KSwgJSVlY3hcbiIgXAoJCSAgICAgIm1vdmwgJSVlY3gsICUlZHNcbiIgXAoJCSAgICAgIm1vdmwgJSVlY3gsICUlZXNcbiIgXAoJCSAgICAgIm1vdmwgJSVlY3gsICUlZnNcbiIgXAoJCSAgICAgIm1vdmwgJSVlY3gsICUlZ3NcbiIgXAoJCSAgICAgIm1vdmwgJSVlY3gsICUlc3MiIFwKCQkgICAgIDogOiAibSIgKGdkdCkgOiAiZWN4Iik7Cn0KCgppbnQgY3B1X2luaXRfZih2b2lkKQp7Cgljb25zdCB1MzIgZW1fcnN0ID0gflg4Nl9DUjBfRU07Cgljb25zdCB1MzIgbXBfbmVfc2V0ID0gWDg2X0NSMF9NUCB8IFg4Nl9DUjBfTkU7CgoJLyogaW5pdGlhbGl6ZSBGUFUsIHJlc2V0IEVNLCBzZXQgTVAgYW5kIE5FICovCglhc20gKCJmbmluaXRcbiIgXAoJICAgICAibW92bCAlJWNyMCwgJSVlYXhcbiIgXAoJICAgICAiYW5kbCAlMCwgJSVlYXhcbiIgXAoJICAgICAib3JsICAlMSwgJSVlYXhcbiIgXAoJICAgICAibW92bCAlJWVheCwgJSVjcjBcbiIgXAoJICAgICA6IDogImkiIChlbV9yc3QpLCAiaSIgKG1wX25lX3NldCkgOiAiZWF4Iik7CgoJcmV0dXJuIDA7Cn0KCmludCBjcHVfaW5pdF9yKHZvaWQpCnsKCXJlbG9hZF9nZHQoKTsKCgkvKiBJbml0aWFsaXplIGNvcmUgaW50ZXJydXB0IGFuZCBleGNlcHRpb24gZnVuY3Rpb25hbGl0eSBvZiBDUFUgKi8KCWNwdV9pbml0X2ludGVycnVwdHMgKCk7CglyZXR1cm4gMDsKfQoKaW50IGRvX3Jlc2V0KGNtZF90YmxfdCAqY21kdHAsIGludCBmbGFnLCBpbnQgYXJnYywgY2hhciAqIGNvbnN0IGFyZ3ZbXSkKewoJcHJpbnRmICgicmVzZXR0aW5nIC4uLlxuIik7Cgl1ZGVsYXkoNTAwMDApOwkJCQkvKiB3YWl0IDUwIG1zICovCglkaXNhYmxlX2ludGVycnVwdHMoKTsKCXJlc2V0X2NwdSgwKTsKCgkvKk5PVFJFQUNIRUQqLwoJcmV0dXJuIDA7Cn0KCnZvaWQgIGZsdXNoX2NhY2hlICh1bnNpZ25lZCBsb25nIGR1bW15MSwgdW5zaWduZWQgbG9uZyBkdW1teTIpCnsKCWFzbSgid2JpbnZkXG4iKTsKCXJldHVybjsKfQoKdm9pZCBfX2F0dHJpYnV0ZV9fICgocmVncGFybSgwKSkpIGdlbmVyYXRlX2dwZih2b2lkKTsKCi8qIHNlZ21lbnQgMHg3MCBpcyBhbiBhcmJpdHJhcnkgc2VnbWVudCB3aGljaCBkb2VzIG5vdCBleGlzdCAqLwphc20oIi5nbG9ibCBnZW5lcmF0ZV9ncGZcbiIKICAgICIuaGlkZGVuIGdlbmVyYXRlX2dwZlxuIgogICAgIi50eXBlIGdlbmVyYXRlX2dwZiwgQGZ1bmN0aW9uXG4iCiAgICAiZ2VuZXJhdGVfZ3BmOlxuIgogICAgImxqbXAgICAkMHg3MCwgJDB4NDcxMTQ3MTFcbiIpOwoKdm9pZCBfX3Jlc2V0X2NwdSh1bG9uZyBhZGRyKQp7CglwcmludGYoIlJlc2V0dGluZyB1c2luZyBpMzg2IFRyaXBsZSBGYXVsdFxuIik7CglzZXRfdmVjdG9yKDEzLCBnZW5lcmF0ZV9ncGYpOyAgLyogZ2VuZXJhbCBwcm90ZWN0aW9uIGZhdWx0IGhhbmRsZXIgKi8KCXNldF92ZWN0b3IoOCwgZ2VuZXJhdGVfZ3BmKTsgICAvKiBkb3VibGUgZmF1bHQgaGFuZGxlciAqLwoJZ2VuZXJhdGVfZ3BmKCk7ICAgICAgICAgICAgICAgIC8qIHN0YXJ0IHRoZSBzaG93ICovCn0Kdm9pZCByZXNldF9jcHUodWxvbmcgYWRkcikgX19hdHRyaWJ1dGVfXygod2VhaywgYWxpYXMoIl9fcmVzZXRfY3B1IikpKTsK