Lyogb2JqLWV2YXguYyAtIEVWQVggKG9wZW5WTVMvQWxwaGEpIG9iamVjdCBmaWxlIGZvcm1hdC4KICAgQ29weXJpZ2h0IDE5OTYsIDE5OTcsIDIwMDcsIDIwMDggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCiAgIENvbnRyaWJ1dGVkIGJ5IEtsYXVzIEvkbXBmIChra2FlbXBmQHByb2dpcy5kZSkgb2YKICAgICBwcm9HSVMgU29mdHdhcmUsIEFhY2hlbiwgR2VybWFueS4KICAgRXh0ZW5zaXZlbHkgZW5oYW5jZWQgYnkgRG91Z2xhcyBSdXBwIG9mIEFkYUNvcmUuCgogICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyCgogICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQogICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCiAgIGFueSBsYXRlciB2ZXJzaW9uLgoKICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KCiAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8KICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgNTEgRnJhbmtsaW4gU3RyZWV0IC0gRmlmdGggRmxvb3IsIEJvc3RvbiwKICAgTUEgMDIxMTAtMTMwMSwgVVNBLiAgKi8KCiNkZWZpbmUgT0JKX0hFQURFUiAib2JqLWV2YXguaCIKCiNpbmNsdWRlICJiZmQuaCIKI2luY2x1ZGUgInZtcy5oIgojaW5jbHVkZSAiYXMuaCIKI2luY2x1ZGUgInN1YnNlZ3MuaCIKI2luY2x1ZGUgInN0cnVjLXN5bWJvbC5oIgojaW5jbHVkZSAic2FmZS1jdHlwZS5oIgoKc3RhdGljIHZvaWQgc19ldmF4X3dlYWsgKGludCk7CnN0YXRpYyB1bnNpZ25lZCBpbnQgY3JjMzIgKHVuc2lnbmVkIGNoYXIgKiwgaW50KTsKc3RhdGljIGNoYXIgKmVuY29kZV8zMiAodW5zaWduZWQgaW50KTsKc3RhdGljIGNoYXIgKmVuY29kZV8xNiAodW5zaWduZWQgaW50KTsKc3RhdGljIGludCBkZWNvZGVfMTYgKGNvbnN0IGNoYXIgKik7Cgpjb25zdCBwc2V1ZG9fdHlwZVMgb2JqX3BzZXVkb190YWJsZVtdID0KewogIHsgIndlYWsiLCBzX2V2YXhfd2VhaywgMH0sCiAgezAsIDAsIDB9LAp9OwkJCQkvKiBvYmpfcHNldWRvX3RhYmxlICovCgp2b2lkIG9ial9yZWFkX2JlZ2luX2hvb2sgKCkge30KCi8qIEhhbmRsZSB0aGUgd2VhayBzcGVjaWZpYyBwc2V1ZG8tb3AuICAqLwoKc3RhdGljIHZvaWQKc19ldmF4X3dlYWsgKGludCBpZ25vcmUgQVRUUklCVVRFX1VOVVNFRCkKewogIGNoYXIgKm5hbWU7CiAgaW50IGM7CiAgc3ltYm9sUyAqc3ltYm9sUDsKICBjaGFyICpzdG9wID0gTlVMTDsKICBjaGFyIHN0b3BjOwoKICBpZiAoZmxhZ19tcmkpCiAgICBzdG9wID0gbXJpX2NvbW1lbnRfZmllbGQgKCZzdG9wYyk7CgogIGRvCiAgICB7CiAgICAgIG5hbWUgPSBpbnB1dF9saW5lX3BvaW50ZXI7CiAgICAgIGMgPSBnZXRfc3ltYm9sX2VuZCAoKTsKICAgICAgc3ltYm9sUCA9IHN5bWJvbF9maW5kX29yX21ha2UgKG5hbWUpOwogICAgICAqaW5wdXRfbGluZV9wb2ludGVyID0gYzsKICAgICAgU0tJUF9XSElURVNQQUNFICgpOwogICAgICBTX1NFVF9XRUFLIChzeW1ib2xQKTsKICAgICAgaWYgKGMgPT0gJywnKQoJewoJICBpbnB1dF9saW5lX3BvaW50ZXIrKzsKCSAgU0tJUF9XSElURVNQQUNFICgpOwoJICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnXG4nKQoJICAgIGMgPSAnXG4nOwoJfQogICAgfQogIHdoaWxlIChjID09ICcsJyk7CgogIGlmIChmbGFnX21yaSkKICAgIG1yaV9jb21tZW50X2VuZCAoc3RvcCwgc3RvcGMpOwoKICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwp9Cgp2b2lkCmV2YXhfc3ltYm9sX25ld19ob29rIChzeW1ib2xTICpzeW0pCnsKICBzdHJ1Y3QgZXZheF9wcml2YXRlX3VkYXRhX3N0cnVjdCAqdWRhdGE7CgogIHVkYXRhID0gKHN0cnVjdCBldmF4X3ByaXZhdGVfdWRhdGFfc3RydWN0ICopCiAgICB4bWFsbG9jIChzaXplb2YgKHN0cnVjdCBldmF4X3ByaXZhdGVfdWRhdGFfc3RydWN0KSk7CgogIHVkYXRhLT5ic3ltID0gc3ltYm9sX2dldF9iZmRzeW0gKHN5bSk7CiAgdWRhdGEtPmVuYnN5bSA9IE5VTEw7CiAgdWRhdGEtPm9yaWduYW1lID0geHN0cmR1cCAoU19HRVRfTkFNRSAoc3ltKSk7CiAgdWRhdGEtPmxraW5kZXggPSAwOwogIHN5bWJvbF9nZXRfYmZkc3ltKHN5bSktPnVkYXRhLnAgPSAoUFRSKSB1ZGF0YTsKfQoKdm9pZApldmF4X2Zyb2Jfc3ltYm9sIChzeW1ib2xTICpzeW0sIGludCAqcHVudCkKewogIGNvbnN0IGNoYXIgKnN5bW5hbWUgPSBTX0dFVF9OQU1FIChzeW0pOwogIGludCBzeW1sZW4gPSBzdHJsZW4gKHN5bW5hbWUpOwogIGFzeW1ib2wgKnN5bWJvbCA9IHN5bWJvbF9nZXRfYmZkc3ltIChzeW0pOwoKICBpZiAoc3ltbGVuID4gNAogICAgICAmJiBzdHJjbXAgKHN5bW5hbWUgKyBzeW1sZW4gLSA0LCAiLi5lbiIpID09IDAKICAgICAgJiYgU19HRVRfU0VHTUVOVCAoc3ltKSA9PSB1bmRlZmluZWRfc2VjdGlvbikKICAgIHsKICAgICAgc3ltYm9sX2NsZWFyX3VzZWRfaW5fcmVsb2MgKHN5bSk7CiAgICAgICpwdW50ID0gMTsKICAgIH0KCiAgZWxzZSBpZiAoKHN5bWJvbC0+ZmxhZ3MgJiBCU0ZfR0xPQkFMKSAmJiAoc3ltYm9sLT5mbGFncyAmIEJTRl9GVU5DVElPTikpCiAgICB7CiAgICAgIHN0cnVjdCBldmF4X3ByaXZhdGVfdWRhdGFfc3RydWN0ICp1ZGF0YQoJPSAoc3RydWN0IGV2YXhfcHJpdmF0ZV91ZGF0YV9zdHJ1Y3QgKilzeW1ib2wtPnVkYXRhLnA7CgogICAgICAvKiBGaXggdXAgZXF1YXRlcyBvZiBmdW5jdGlvbiBkZWZpbml0aW9ucy4gICovCiAgICAgIHdoaWxlICh1ZGF0YS0+ZW5ic3ltID09IE5VTEwpCgl7CgkgIC8qID8/PyBFcXVhdGVzIGhhdmUgYmVlbiByZXNvbHZlZCBhdCB0aGlzIHBvaW50IHNvIHRoZWlyCgkgICAgIGV4cHJlc3Npb24gaXMgT19jb25zdGFudDsgYnV0IHRoZXkgcHJldmlvdXNseSB3ZXJlCgkgICAgIE9fc3ltYm9sIGFuZCB3ZSBob3BlIHRoZSBlcXVhdGVkIHN5bWJvbCBpcyBzdGlsbCB0aGVyZS4gICovCgkgIHN5bSA9IHN5bWJvbF9nZXRfdmFsdWVfZXhwcmVzc2lvbiAoc3ltKS0+WF9hZGRfc3ltYm9sOwoJICBpZiAoc3ltID09IE5VTEwpCgkgICAgYWJvcnQgKCk7CgkgIHN5bWJvbCA9IHN5bWJvbF9nZXRfYmZkc3ltIChzeW0pOwoJICB1ZGF0YS0+ZW5ic3ltCgkgICAgPSAoKHN0cnVjdCBldmF4X3ByaXZhdGVfdWRhdGFfc3RydWN0ICopc3ltYm9sLT51ZGF0YS5wKS0+ZW5ic3ltOwoJfQogICAgfQp9Cgp2b2lkCmV2YXhfZnJvYl9maWxlX2JlZm9yZV9hZGp1c3QgKHZvaWQpCnsKICBzdHJ1Y3QgYWxwaGFfbGlua2FnZV9maXh1cHMgKmw7CiAgc2VnVCBjdXJyZW50X3NlY3Rpb24gPSBub3dfc2VnOwogIGludCBjdXJyZW50X3N1YnNlYyA9IG5vd19zdWJzZWc7CiAgc2VnbWVudF9pbmZvX3R5cGUgKnNlZ2luZm87CiAgaW50IGxpbmthZ2VfaW5kZXggPSAxOwoKICBzdWJzZWdfc2V0IChhbHBoYV9saW5rX3NlY3Rpb24sIDApOwogIHNlZ2luZm8gPSBzZWdfaW5mbyAoYWxwaGFfbGlua19zZWN0aW9uKTsKCiAgZm9yIChsID0gYWxwaGFfbGlua2FnZV9maXh1cF9yb290OyBsICE9IE5VTEw7IGwgPSBsLT5uZXh0KQogICAgewogICAgICBpZiAoU19HRVRfU0VHTUVOVCAobC0+Zml4cC0+ZnhfYWRkc3kpID09IGFscGhhX2xpbmtfc2VjdGlvbikKCXsKCSAgc3ltYm9sUyAqIGVudHJ5X3N5bTsKCSAgZml4UyAqZml4cGVudHJ5LCAqZml4cHBkZXNjLCAqZml4dGFpbDsKCgkgIGZpeHRhaWwgPSBzZWdpbmZvLT5maXhfdGFpbDsKCgkgIC8qIFJlcGxhY2UgdGhlIGxpbmthZ2Ugd2l0aCB0aGUgbG9jYWwgc3ltYm9scyAqLwoJICBlbnRyeV9zeW0gPSBzeW1ib2xfZmluZAoJICAgICgoKHN0cnVjdCBldmF4X3ByaXZhdGVfdWRhdGFfc3RydWN0ICopc3ltYm9sX2dldF9iZmRzeW0gKGwtPmZpeHAtPmZ4X2FkZHN5KS0+dWRhdGEucCktPmVuYnN5bS0+bmFtZSk7CgkgIGlmICghZW50cnlfc3ltKQoJICAgIGFib3J0ICgpOwoJICBmaXhwZW50cnkgPSBmaXhfbmV3IChsLT5maXhwLT5meF9mcmFnLCBsLT5maXhwLT5meF93aGVyZSwgOCwKCQkJICAgICAgIGVudHJ5X3N5bSwgbC0+Zml4cC0+Znhfb2Zmc2V0LCAwLAoJCQkgICAgICAgQkZEX1JFTE9DXzY0KTsKCSAgZml4cHBkZXNjID0gZml4X25ldyAobC0+Zml4cC0+ZnhfZnJhZywgbC0+Zml4cC0+Znhfd2hlcmUrOCwgOCwKCQkJICAgICAgIGwtPmZpeHAtPmZ4X2FkZHN5LCBsLT5maXhwLT5meF9vZmZzZXQsIDAsCgkJCSAgICAgICBCRkRfUkVMT0NfNjQpOwoJICBsLT5maXhwLT5meF9zaXplID0gMDsKCSAgbC0+Zml4cC0+ZnhfZG9uZSA9IDE7CgoJICAvKiBJZiBub3QgYWxyZWFkeSBhdCB0aGUgdGFpbCwgc3BsaWNlIHRoZSBuZXcgZml4dXBzIGludG8KCSAgICAgdGhlIGNoYWluIHJpZ2h0IGFmdGVyIHRoZSBvbmUgd2UgYXJlIG51bGxpbmcgb3V0ICovCgkgIGlmIChmaXh0YWlsICE9IGwtPmZpeHApCgkgICAgewoJICAgICAgZml4cHBkZXNjLT5meF9uZXh0ID0gbC0+Zml4cC0+ZnhfbmV4dDsKCSAgICAgIGwtPmZpeHAtPmZ4X25leHQgPSBmaXhwZW50cnk7CgkgICAgICBmaXh0YWlsLT5meF9uZXh0ID0gMDsKCSAgICAgIHNlZ2luZm8tPmZpeF90YWlsID0gZml4dGFpbDsKCSAgICB9Cgl9CiAgICAgIGVsc2UKCXsKCSAgKChzdHJ1Y3QgZXZheF9wcml2YXRlX3VkYXRhX3N0cnVjdCAqKQoJICAgc3ltYm9sX2dldF9iZmRzeW0gKGwtPmxhYmVsKS0+dWRhdGEucCktPmxraW5kZXggPSBsaW5rYWdlX2luZGV4OwoKCSAgbC0+Zml4cC0+ZnhfYWRkbnVtYmVyID0gbGlua2FnZV9pbmRleDsKCgkgIGxpbmthZ2VfaW5kZXggKz0gMjsKCX0KICAgIH0KCiAgc3Vic2VnX3NldCAoY3VycmVudF9zZWN0aW9uLCBjdXJyZW50X3N1YnNlYyk7Cn0KCnZvaWQKZXZheF9mcm9iX2ZpbGVfYmVmb3JlX2ZpeCAodm9pZCkKewogIC8qIE5vdyB0aGF0IHRoZSBmaXh1cHMgYXJlIGRvbmUgZWFybGllciwgd2UgbmVlZCB0byB0cmFuc2ZlciB0aGUgdmFsdWVzCiAgICAgaW50byB0aGUgQkZEIHN5bWJvbHMgYmVmb3JlIGNhbGxpbmcgZml4X3NlZ21lbnQgKGlkZWFsbHkgc2hvdWxkIG5vdAogICAgIGJlIGRvbmUgYWxzbyBsYXRlcikuICAqLwogIGlmIChzeW1ib2xfcm9vdFApCiAgICB7CiAgICAgIHN5bWJvbFMgKnN5bXA7CgogICAgICAvKiBTZXQgdGhlIHZhbHVlIGludG8gdGhlIEJGRCBzeW1ib2wuICBVcCB0aWwgbm93IHRoZSB2YWx1ZQoJIGhhcyBvbmx5IGJlZW4ga2VwdCBpbiB0aGUgZ2FzIHN5bWJvbFMgc3RydWN0LiAgKi8KICAgICAgZm9yIChzeW1wID0gc3ltYm9sX3Jvb3RQOyBzeW1wOyBzeW1wID0gc3ltYm9sX25leHQgKHN5bXApKQoJc3ltYm9sX2dldF9iZmRzeW0gKHN5bXApLT52YWx1ZSA9IFNfR0VUX1ZBTFVFIChzeW1wKTsKICAgIH0KfQoKLyogVGhlIGxlbmd0aCBpcyBjb21wdXRlZCBmcm9tIHRoZSBtYXhpbXVtIGFsbG93YWJsZSBsZW5ndGggb2YgNjQgbGVzcyB0aGUKICAgNCBjaGFyYWN0ZXIgLi54eCBleHRlbnNpb24gdGhhdCBtdXN0IGJlIHByZXNlcnZlZCAocmVtb3ZlZCBiZWZvcmUKICAga3J1bmNoaW5nIGFuZCBhcHBlbmRlZCBiYWNrIG9uIGFmdGVyd2FyZHMpLiAgVGhlICQ8bm5uPi4uIHByZWZpeCBpcwogICBhbHNvIHJlbW92ZWQgYW5kIHByZXBlbmVkIGJhY2sgb24sIGJ1dCBkb2Vzbid0IGVudGVyIGludG8gdGhlIGxlbmd0aAogICBjb21wdXRhdGlvbiBiZWNhdXNlIHN5bWJvbHMgd2l0aCB0aGF0IHByZWZpeCBhcmUgYWx3YXlzIHJlc29sdmVkCiAgIGJ5IHRoZSBhc3NlbWJsZXIgYW5kIHdpbGwgbmV2ZXIgYXBwZWFyIGluIHRoZSBzeW1ib2wgdGFibGUuIEF0IGxlYXN0CiAgIEkgaG9wZSB0aGF0J3MgdHJ1ZSwgVEJELiAgKi8KI2RlZmluZSBNQVhfTEFCRUxfTEVOR1RIIDYwCgpzdGF0aWMgY2hhciAqc2hvcnRlbl9pZGVudGlmaWVyIChjaGFyICopOwpzdGF0aWMgaW50IGlzX3RydW5jYXRlZF9pZGVudGlmaWVyIChjaGFyICopOwoKY2hhciAqCmV2YXhfc2hvcnRlbl9uYW1lIChjaGFyICppZCkKewogIGludCBwcmVmaXhfZG90ZG90ID0gMDsKICBjaGFyIHByZWZpeCBbNjRdOwogIGludCBsZW4gPSBzdHJsZW4gKGlkKTsKICBpbnQgc3VmZml4X2RvdGRvdCA9IGxlbjsKICBjaGFyIHN1ZmZpeCBbNjRdOwogIGNoYXIgKmJhc2VfaWQ7CgogIC8qIFRoaXMgdGVzdCBtYXkgYmUgdG9vIGNvbnNlcnZhdGl2ZS4gICovCiAgaWYgKGxlbiA8PSBNQVhfTEFCRUxfTEVOR1RIKQogICAgcmV0dXJuIGlkOwoKICBzdWZmaXggWzBdID0gMDsKICBwcmVmaXggWzBdID0gMDsKCiAgLyogQ2hlY2sgZm9yIC4ueHggc3VmZml4IGFuZCBzYXZlIGl0LiAgKi8KICBpZiAoc3RybmNtcCAoJmlkW2xlbi00XSwgIi4uIiwgMikgPT0gMCkKICAgIHsKICAgICAgc3VmZml4X2RvdGRvdCA9IGxlbiAtIDQ7CiAgICAgIHN0cm5jcHkgKHN1ZmZpeCwgJmlkW2xlbi00XSwgNCk7CiAgICAgIHN1ZmZpeCBbNF0gPSAwOwogICAgfQoKICAvKiBDaGVjayBmb3IgJDxubm4+Li4gcHJlZml4IGFuZCBzYXZlIGl0LiAgKi8KICBpZiAoKGlkWzBdID09ICckJykgJiYgSVNESUdJVCAoaWRbMV0pKQogICAgewogICAgICBpbnQgaTsKCiAgICAgIGZvciAoaT0yOyBpIDwgbGVuOyBpKyspCiAgICAgICAgewoJICBpZiAoIUlTRElHSVQgKGlkW2ldKSkKICAgICAgICAgICAgewoJICAgICAgaWYgKGlkW2ldID09ICcuJyAmJiBpZCBbaSsxXSA9PSAnLicpCiAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgcHJlZml4X2RvdGRvdCA9IGkrMjsKICAgICAgICAgICAgICAgICAgIHN0cm5jcHkgKHByZWZpeCwgaWQsIHByZWZpeF9kb3Rkb3QpOwogICAgICAgICAgICAgICAgICAgcHJlZml4IFtwcmVmaXhfZG90ZG90XSA9IDA7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgLyogV2Ugb25seSBuZWVkIHdvcnJ5IGFib3V0IGtydW5jaGluZyB0aGUgYmFzZSBzeW1ib2wuICAqLwogIGJhc2VfaWQgPSB4bWFsbG9jIChzdWZmaXhfZG90ZG90IC0gcHJlZml4X2RvdGRvdCArIDEpOwogIHN0cm5jcHkgKGJhc2VfaWQsICZpZFtwcmVmaXhfZG90ZG90XSwgc3VmZml4X2RvdGRvdCAtIHByZWZpeF9kb3Rkb3QpOwogIGJhc2VfaWQgW3N1ZmZpeF9kb3Rkb3QgLSBwcmVmaXhfZG90ZG90XSA9IDA7CgogIGlmIChzdHJsZW4gKGJhc2VfaWQpID4gTUFYX0xBQkVMX0xFTkdUSCkKICAgIHsKICAgICAgY2hhciBuZXdfaWQgWzQwOTZdOwogICAgICBjaGFyICpyZXR1cm5faWQ7CgogICAgICBzdHJjcHkgKG5ld19pZCwgYmFzZV9pZCk7CgogICAgICAvKiBTaG9ydGVuIGl0LiAgKi8KICAgICAgc3RyY3B5IChuZXdfaWQsIHNob3J0ZW5faWRlbnRpZmllciAobmV3X2lkKSk7CgogICAgICAvKiBQcmVwZW5kIGJhY2sgdGhlIHByZWZpeCBpZiB0aGVyZSB3YXMgb25lLiAgKi8KICAgICAgaWYgKHByZWZpeF9kb3Rkb3QpCiAgICAgICAgewogICAgICAgICAgbWVtbW92ZSAoJm5ld19pZCBbcHJlZml4X2RvdGRvdF0sIG5ld19pZCwgc3RybGVuIChuZXdfaWQpICsgMSk7CiAgICAgICAgICBzdHJuY3B5IChuZXdfaWQsIHByZWZpeCwgcHJlZml4X2RvdGRvdCk7CiAgICAgICAgfQoKICAgICAgLyogQXBwZW5kIGJhY2sgdGhlIHN1ZmZpeCBpZiB0aGVyZSB3YXMgb25lLiAgKi8KICAgICAgaWYgKHN0cmxlbiAoc3VmZml4KSkKCXN0cmNhdCAobmV3X2lkLCBzdWZmaXgpOwoKICAgICAgLyogU2F2ZSBpdCBvbiB0aGUgaGVhcCBhbmQgcmV0dXJuLiAgKi8KICAgICAgcmV0dXJuX2lkID0geG1hbGxvYyAoc3RybGVuIChuZXdfaWQpICsgMSk7CiAgICAgIHN0cmNweSAocmV0dXJuX2lkLCBuZXdfaWQpOwoKICAgICAgcmV0dXJuIHJldHVybl9pZDsKICAgIH0KICBlbHNlCiAgICByZXR1cm4gaWQ7Cn0KCi8qIFRoZSBjb2RlIGJlbG93IGltcGxlbWVudHMgYSBtZWNoYW5pc20gZm9yIHRydW5jYXRpbmcgbG9uZwogICBpZGVudGlmaWVycyB0byBhbiBhcmJpdHJhcnkgbGVuZ3RoIChzZXQgYnkgTUFYX0xBQkVMX0xFTkdUSCkuCgogICBJdCBhdHRlbXB0cyB0byBtYWtlIGVhY2ggdHJ1bmNhdGVkIGlkZW50aWZpZXIgdW5pcXVlIGJ5IHJlcGxhY2luZwogICBwYXJ0IG9mIHRoZSBpZGVudGlmaWVyIHdpdGggYW4gZW5jb2RlZCAzMi1iaXQgQ1JDIGFuZCBhbiBhc3NvY2lhdGVkCiAgIGNoZWNrc3VtICh0aGUgY2hlY2tzdW0gaXMgdXNlZCBhcyBhIHdheSB0byBkZXRlcm1pbmUgdGhhdCB0aGUgbmFtZQogICB3YXMgdHJ1bmNhdGVkKS4KCiAgIE5vdGUgdGhhdCBib3RoIGEgcG9ydGlvbiBvZiB0aGUgc3RhcnQgYW5kIG9mIHRoZSBlbmQgb2YgdGhlCiAgIGlkZW50aWZpZXIgbWF5IGJlIGtlcHQuICBUaGUgbWFjcm8gSURfU1VGRklYX0xFTkdUSCB3aWxsIHJldHVybiB0aGUKICAgbnVtYmVyIG9mIGNoYXJhY3RlcnMgaW4gdGhlIHN1ZmZpeCBvZiB0aGUgaWRlbnRpZmllciB0aGF0IHNob3VsZCBiZQogICBrZXB0LgoKICAgVGhlIHBvcnRpb24gb2YgdGhlIGlkZW50aWZpZXIgdGhhdCBpcyBnb2luZyB0byBiZSByZW1vdmVkIGlzCiAgIGNoZWNrc3VtbWVkLiAgVGhlIGNoZWNrc3VtIGlzIHRoZW4gZW5jb2RlZCBhcyBhIDUtY2hhcmFjdGVyIHN0cmluZywKICAgdGhlIGNoYXJhY3RlcnMgb2Ygd2hpY2ggYXJlIHRoZW4gc3VtbWVkLiAgVGhpcyBzdW0gaXMgdGhlbiBlbmNvZGVkCiAgIGFzIGEgMy1jaGFyYWN0ZXIgc3RyaW5nLiAgRmluYWxseSwgdGhlIG9yaWdpbmFsIGxlbmd0aCBvZiB0aGUKICAgaWRlbnRpZmllciBpcyBlbmNvZGVkIGFzIGEgMy1jaGFyYWN0ZXIgc3RyaW5nLgoKICAgVGhlc2UgdGhyZWUgc3RyaW5ncyBhcmUgdGhlbiBjb25jYXRlbmF0ZWQgdG9nZXRoZXIgKGFsb25nIHdpdGggYW4gX2gKICAgd2hpY2ggZnVydGhlciBkZXNpZ25hdGVzIHRoYXQgdGhlIG5hbWUgd2FzIHRydW5jYXRlZCk6CgogICAib3JpZ2luYWxfaWRlbnRpZmllciJfaGFhYWFhYmJiY2NjCiAgIAogICBhYWFhYSA9IDMyLWJpdCBDUkMKICAgYmJiID0gbGVuZ3RoIG9mIG9yaWdpbmFsIGlkZW50aWZpZXIKICAgY2NjID0gc3VtIG9mIDMyLWJpdCBDUkMgY2hhcmFjdGVycwoKICAgVGhlIHJlc3VsdGluZyBpZGVudGlmaWVyIHdpbGwgYmUgTUFYX0xBQkVMX0xFTkdUSCBjaGFyYWN0ZXJzIGxvbmcuCgogICAqLwoKCi8qIFRhYmxlIHVzZWQgdG8gY29udmVydCBhbiBpbnRlZ2VyIGludG8gYSBzdHJpbmcuICAqLwoKc3RhdGljIGNvbnN0IGNoYXIgY29kaW5nc1tdID0gewogICdhJywgJ2InLCAnYycsICdkJywgJ2UnLCAnZicsICdnJywgJ2gnLCAnaScsICdqJywgJ2snLCAnbCcsICdtJywgJ24nLCAnbycsCiAgJ3AnLCAncScsICdyJywgJ3MnLCAndCcsICd1JywgJ3YnLCAndycsICd4JywgJ3knLCAneicsCiAgJ0EnLCAnQicsICdDJywgJ0QnLCAnRScsICdGJywgJ0cnLCAnSCcsICdJJywgJ0onLCAnSycsICdMJywgJ00nLCAnTicsICdPJywKICAnUCcsICdRJywgJ1InLCAnUycsICdUJywgJ1UnLCAnVicsICdXJywgJ1gnLCAnWScsICdaJywKICAnMCcsICcxJywgJzInLCAnMycsICc0JywgJzUnLCAnNicsICc3JywgJzgnLCAnOScsICdfJ307CgovKiBUaGUgbnVtYmVyIG9mIGNvZGluZ3MgaW4gdGhlIGFib3ZlIHRhYmxlLiAgKi8Kc3RhdGljIGNvbnN0IGludCBudW1iZXJfb2ZfY29kaW5ncyA9IHNpemVvZiAoY29kaW5ncykgLyBzaXplb2YgKGNoYXIpOwoKLyogVGFibGUgdXNlZCBieSBkZWNvZGVfMTYgKCkgdG8gY29udmVydCBhbiBlbmNvZGVkIHN0cmluZyBiYWNrIGludG8KICAgYW4gaW50ZWdlci4gICovCnN0YXRpYyBjaGFyIGRlY29kaW5nc1syNTZdOwoKLyogVGFibGUgdXNlZCBieSB0aGUgY3JjMzIgZnVuY3Rpb24gdG8gY2FsY3VhdGUgdGhlIGNoZWNrc3VtLiAgKi8Kc3RhdGljIHVuc2lnbmVkIGludCBjcmMzMl90YWJsZVsyNTZdID0gezAsIDB9OwoKLyogR2l2ZW4gYSBzdHJpbmcgaW4gQlVGLCBjYWxjdWxhdGUgYSAzMi1iaXQgQ1JDIGZvciBpdC4gCgogICBUaGlzIGlzIHVzZWQgYXMgYSByZWFzb25hYmx5IHVuaXF1ZSBoYXNoIGZvciB0aGUgZ2l2ZW4gc3RyaW5nLiAgKi8KCnN0YXRpYyB1bnNpZ25lZCBpbnQKY3JjMzIgKHVuc2lnbmVkIGNoYXIgKmJ1ZiwgaW50IGxlbikKewogIHVuc2lnbmVkIGludCBjcmMgPSAweGZmZmZmZmZmOwoKICBpZiAoISBjcmMzMl90YWJsZVsxXSkKICAgIHsKICAgICAgLyogSW5pdGlhbGl6ZSB0aGUgQ1JDIHRhYmxlIGFuZCB0aGUgZGVjb2RpbmcgdGFibGUuICovCiAgICAgIGludCBpLCBqOwogICAgICB1bnNpZ25lZCBpbnQgYzsKCiAgICAgIGZvciAoaSA9IDA7IGkgPCAyNTY7IGkrKykKCXsKCSAgZm9yIChjID0gaSA8PCAyNCwgaiA9IDg7IGogPiAwOyAtLWopCgkgICAgYyA9IGMgJiAweDgwMDAwMDAwID8gKGMgPDwgMSkgXiAweDA0YzExZGI3IDogKGMgPDwgMSk7CgkgIGNyYzMyX3RhYmxlW2ldID0gYzsKCSAgZGVjb2RpbmdzW2ldID0gMDsKCX0KICAgICAgZm9yIChpID0gMDsgaSA8IG51bWJlcl9vZl9jb2RpbmdzOyBpKyspCglkZWNvZGluZ3NbY29kaW5nc1tpXSAmIDI1NV0gPSBpOwogICAgfQoKICB3aGlsZSAobGVuLS0pCiAgICB7CiAgICAgIGNyYyA9IChjcmMgPDwgOCkgXiBjcmMzMl90YWJsZVsoY3JjID4+IDI0KSBeICpidWZdOwogICAgICBidWYrKzsKICAgIH0KICByZXR1cm4gY3JjOwp9CgovKiBFbmNvZGUgdGhlIGxvd2VyIDMyIGJpdHMgb2YgVkFMVUUgYXMgYSA1LWNoYXJhY3RlciBzdHJpbmcuICAqLwoKc3RhdGljIGNoYXIgKgplbmNvZGVfMzIgKHVuc2lnbmVkIGludCB2YWx1ZSkKewogIHN0YXRpYyBjaGFyIHJlc1s2XTsKICBpbnQgeDsKCiAgcmVzWzVdID0gMDsKICBmb3IoeCA9IDA7IHggPCA1OyB4KyspCiAgICB7CiAgICAgIHJlc1t4XSA9IGNvZGluZ3NbdmFsdWUgJSBudW1iZXJfb2ZfY29kaW5nc107CiAgICAgIHZhbHVlID0gdmFsdWUgLyBudW1iZXJfb2ZfY29kaW5nczsKICAgIH0KICByZXR1cm4gcmVzOwp9CgovKiBFbmNvZGUgdGhlIGxvd2VyIDE2IGJpdHMgb2YgVkFMVUUgYXMgYSAzLWNoYXJhY3RlciBzdHJpbmcuICAqLwoKc3RhdGljIGNoYXIgKgplbmNvZGVfMTYgKHVuc2lnbmVkIGludCB2YWx1ZSkKewogIHN0YXRpYyBjaGFyIHJlc1s0XTsKICBpbnQgeDsKCiAgcmVzWzNdID0gMDsKICBmb3IoeCA9IDA7IHggPCAzOyB4KyspCiAgICB7CiAgICAgIHJlc1t4XSA9IGNvZGluZ3NbdmFsdWUgJSBudW1iZXJfb2ZfY29kaW5nc107CiAgICAgIHZhbHVlID0gdmFsdWUgLyBudW1iZXJfb2ZfY29kaW5nczsKICAgIH0KICByZXR1cm4gcmVzOwp9CgovKiBDb252ZXJ0IHRoZSBlbmNvZGVkIHN0cmluZyBvYnRhaW5lZCBmcm9tIGVuY29kZV8xNiAoKSBiYWNrIGludG8gYQogICAxNi1iaXQgaW50ZWdlci4gICovCgpzdGF0aWMgaW50CmRlY29kZV8xNiAoY29uc3QgY2hhciAqc3RyaW5nKQp7CiAgcmV0dXJuIGRlY29kaW5nc1soaW50KSBzdHJpbmdbMl1dICogbnVtYmVyX29mX2NvZGluZ3MgKiBudW1iZXJfb2ZfY29kaW5ncwogICAgKyBkZWNvZGluZ3NbKGludCkgc3RyaW5nWzFdXSAqIG51bWJlcl9vZl9jb2RpbmdzCiAgICArIGRlY29kaW5nc1soaW50KSBzdHJpbmdbMF1dOwp9CgovKiBJRF9TVUZGSVhfTEVOR1RIIGlzIHVzZWQgdG8gZGV0ZXJtaW5lIGhvdyBtYW55IGNoYXJhY3RlcnMgaW4gdGhlCiAgIHN1ZmZpeCBvZiB0aGUgaWRlbnRpZmllciBhcmUgdG8gYmUgcHJlc2VydmVkLCBpZiBhbnkuICAqLwoKI2lmbmRlZiBJRF9TVUZGSVhfTEVOR1RICiNkZWZpbmUgSURfU1VGRklYX0xFTkdUSChJRCkgKDApCiNlbmRpZgoKLyogUmV0dXJuIGEgcmVhc29uYWJseS11bmlxdWUgdmVyc2lvbiBvZiBOQU1FIHRoYXQgaXMgbGVzcyB0aGFuIG9yCiAgIGVxdWFsIHRvIE1BWF9MQUJFTF9MRU5HVEggY2hhcmFjdGVycyBsb25nLiAgVGhlIHN0cmluZyByZXR1cm5lZCBmcm9tCiAgIHRoaXMgZnVuY3Rpb24gbWF5IGJlIGEgY29weSBvZiBOQU1FOyB0aGUgZnVuY3Rpb24gd2lsbCBuZXZlcgogICBhY3R1YWxseSBtb2RpZnkgdGhlIGNvbnRlbnRzIG9mIE5BTUUuICAqLwoKc3RhdGljIGNoYXIgbmV3bmFtZVtNQVhfTEFCRUxfTEVOR1RIICsgMV07CgpzdGF0aWMgY2hhciAqCnNob3J0ZW5faWRlbnRpZmllciAoY2hhciAqbmFtZSkKewogIGludCBjcmMsIGxlbiwgc3VtLCB4LCBmaW5hbF9sZW47CiAgY2hhciAqY3JjX2NoYXJzOwogIGludCBzdWZmaXhfbGVuZ3RoID0gSURfU1VGRklYX0xFTkdUSCAobmFtZSk7CgogIGlmICgobGVuID0gc3RybGVuIChuYW1lKSkgPD0gTUFYX0xBQkVMX0xFTkdUSCkKICAgIHJldHVybiBuYW1lOwoKICBmaW5hbF9sZW4gPSBNQVhfTEFCRUxfTEVOR1RIIC0gMiAtIDUgLSAzIC0gMyAtIHN1ZmZpeF9sZW5ndGg7CiAgY3JjID0gY3JjMzIgKCh1bnNpZ25lZCBjaGFyICopbmFtZSArIGZpbmFsX2xlbiwKCSAgICAgICBsZW4gLSBmaW5hbF9sZW4gLSBzdWZmaXhfbGVuZ3RoKTsKICBjcmNfY2hhcnMgPSBlbmNvZGVfMzIgKGNyYyk7CiAgc3VtID0gMDsKICBmb3IgKHggPSAwOyB4IDwgNTsgeCsrKQogICAgc3VtICs9IGNyY19jaGFycyBbeF07CiAgc3RybmNweSAobmV3bmFtZSwgbmFtZSwgZmluYWxfbGVuKTsKICBuZXduYW1lIFtNQVhfTEFCRUxfTEVOR1RIXSA9IDA7CiAgLyogTm93IGFwcGVuZCB0aGUgc3VmZml4IG9mIHRoZSBvcmlnaW5hbCBpZGVudGlmaWVyLCBpZiBhbnkuICAqLwogIGlmIChzdWZmaXhfbGVuZ3RoKQogIHN0cm5jcHkgKG5ld25hbWUgKyBNQVhfTEFCRUxfTEVOR1RIIC0gc3VmZml4X2xlbmd0aCwKCSAgIG5hbWUgKyBsZW4gLSBzdWZmaXhfbGVuZ3RoLAoJICAgc3VmZml4X2xlbmd0aCk7CiAgc3RybmNweSAobmV3bmFtZSArIGZpbmFsX2xlbiwgIl9oIiwgMik7CiAgc3RybmNweSAobmV3bmFtZSArIGZpbmFsX2xlbiArIDIgLCBjcmNfY2hhcnMsIDUpOwogIHN0cm5jcHkgKG5ld25hbWUgKyBmaW5hbF9sZW4gKyAyICsgNSwgZW5jb2RlXzE2IChsZW4pLCAzKTsKICBzdHJuY3B5IChuZXduYW1lICsgZmluYWxfbGVuICsgMiArIDUgKyAzLCBlbmNvZGVfMTYgKHN1bSksIDMpOwogIGlmICghaXNfdHJ1bmNhdGVkX2lkZW50aWZpZXIgKG5ld25hbWUpKQogICAgYWJvcnQgKCk7CiAgcmV0dXJuIG5ld25hbWU7Cn0KCi8qIERldGVybWluZSB3aGV0aGVyIG9yIG5vdCBJRCBpcyBhIHRydW5jYXRlZCBpZGVudGlmaWVyLCBhbmQgcmV0dXJuIGEKICAgbm9uLXplcm8gdmFsdWUgaWYgaXQgaXMuICAqLwoKc3RhdGljIGludAppc190cnVuY2F0ZWRfaWRlbnRpZmllciAoY2hhciAqaWQpCnsKICBjaGFyICpwdHI7CiAgaW50IGxlbiA9IHN0cmxlbiAoaWQpOwogIC8qIElmIGl0J3Mgbm90IGV4YWN0bHkgTUFYX0xBQkVMX0xFTkdUSCBjaGFyYWN0ZXJzIGxvbmcsIGl0IGNhbid0IGJlCiAgICAgYSB0cnVuY2F0ZWQgaWRlbnRpZmllci4gICovCiAgaWYgKGxlbiAhPSBNQVhfTEFCRUxfTEVOR1RIKQogICAgcmV0dXJuIDA7CiAgCiAgLyogU3RhcnQgc2Nhbm5pbmcgYmFja3dhcmRzIGZvciBhIF9oLiAgKi8KICBsZW4gPSBsZW4gLSAzIC0gMyAtIDUgLSAyOwogIHB0ciA9IGlkICsgbGVuOwogIHdoaWxlIChwdHIgPj0gaWQpCiAgICB7CiAgICAgIGlmIChwdHJbMF0gPT0gJ18nICYmIHB0clsxXSA9PSAnaCcpCgl7CgkgIC8qIE5vdyBzZWUgaWYgdGhlIHN1bSBlbmNvZGVkIGluIHRoZSBpZGVudGlmZXIgbWF0Y2hlcy4gICovCgkgIGludCB4LCBzdW07CgkgIHN1bSA9IDA7CgkgIGZvciAoeCA9IDA7IHggPCA1OyB4KyspCgkgICAgc3VtICs9IHB0clt4ICsgMl07CgkgIC8qIElmIGl0IG1hdGNoZXMsIHRoaXMgaXMgcHJvYmFibHkgYSB0cnVuY2F0ZWQgaWRlbnRpZmllci4gICovCgkgIGlmIChzdW0gPT0gZGVjb2RlXzE2IChwdHIgKyA1ICsgMiArIDMpKQoJICAgIHJldHVybiAxOwoJfQogICAgICBwdHItLTsKICAgIH0KICByZXR1cm4gMDsKfQoKLyogZW5kIG9mIG9iai1ldmF4LmMgKi8K