Lyogdmk6IHNldCBzdz00IHRzPTQ6ICovCi8qCiAqIGlwY3JtLmMgLS0gdXRpbGl0eSB0byBhbGxvdyByZW1vdmFsIG9mIElQQyBvYmplY3RzIGFuZCBkYXRhIHN0cnVjdHVyZXMuCiAqCiAqIDAxIFNlcHQgMjAwNCAtIFJvZG5leSBSYWRmb3JkIDxycmFkZm9yZEBtaW5kc3ByaW5nLmNvbT4KICogQWRhcHRlZCBmb3IgYnVzeWJveCBmcm9tIHV0aWwtbGludXgtMi4xMmEuCiAqCiAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CiAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCiAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAqCiAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VCiAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICoKICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EKICoKICogLS0tIFByZS1idXN5Ym94IGhpc3RvcnkgZnJvbSB1dGlsLWxpbnV4LTIuMTJhIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogKgogKiAxOTk5LTA0LTAyIGZyYW5rIHphZ28KICogLSBjYW4gbm93IHJlbW92ZSBzZXZlcmFsIGlkJ3MgaW4gdGhlIHNhbWUgY2FsbAogKgogKiAxOTk5LTAyLTIyIEFya2FkaXVzeiBNaf9raWV3aWN6IDxtaXNpZWtAcGxkLk9SRy5QTD4KICogLSBhZGRlZCBOYXRpdmUgTGFuZ3VhZ2UgU3VwcG9ydAogKgogKiBPcmlnaW5hbCBhdXRob3IgLSBrcmlzaG5hIGJhbGFzdWJyYW1hbmlhbiAxOTkzCiAqLwoKI2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KI2luY2x1ZGUgPHN0cmluZy5oPgojaW5jbHVkZSA8ZXJybm8uaD4KCiNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KI2luY2x1ZGUgPHN5cy9pcGMuaD4KI2luY2x1ZGUgPHN5cy9zaG0uaD4KI2luY2x1ZGUgPHN5cy9tc2cuaD4KI2luY2x1ZGUgPHN5cy9zZW0uaD4KCi8qIFgvT1BFTiB0ZWxscyB1cyB0byB1c2UgPHN5cy97dHlwZXMsaXBjLHNlbX0uaD4gZm9yIHNlbWN0bCgpICovCi8qIFgvT1BFTiB0ZWxscyB1cyB0byB1c2UgPHN5cy97dHlwZXMsaXBjLG1zZ30uaD4gZm9yIG1zZ2N0bCgpICovCi8qIGZvciBnZXRvcHQgKi8KI2luY2x1ZGUgPHVuaXN0ZC5oPgoKLyogZm9yIHRvbG93ZXIgYW5kIGlzdXBwZXIgKi8KI2luY2x1ZGUgPGN0eXBlLmg+CgojaW5jbHVkZSAiYnVzeWJveC5oIgoKI2lmIGRlZmluZWQgKF9fR05VX0xJQlJBUllfXykgJiYgIWRlZmluZWQoX1NFTV9TRU1VTl9VTkRFRklORUQpCi8qIHVuaW9uIHNlbXVuIGlzIGRlZmluZWQgYnkgaW5jbHVkaW5nIDxzeXMvc2VtLmg+ICovCiNlbHNlCi8qIGFjY29yZGluZyB0byBYL09QRU4gd2UgaGF2ZSB0byBkZWZpbmUgaXQgb3Vyc2VsdmVzICovCnVuaW9uIHNlbXVuIHsKCWludCB2YWw7CglzdHJ1Y3Qgc2VtaWRfZHMgKmJ1ZjsKCXVuc2lnbmVkIHNob3J0IGludCAqYXJyYXk7CglzdHJ1Y3Qgc2VtaW5mbyAqX19idWY7Cn07CiNlbmRpZgoKdHlwZWRlZiBlbnVtIHR5cGVfaWQgewoJU0hNLAoJU0VNLAoJTVNHCn0gdHlwZV9pZDsKCnN0YXRpYyBpbnQKcmVtb3ZlX2lkcyh0eXBlX2lkIHR5cGUsIGludCBhcmdjLCBjaGFyICoqYXJndikgewoJaW50IGlkOwoJaW50IHJldCA9IDA7CQkvKiBmb3IgZ2NjICovCgljaGFyICplbmQ7CglpbnQgbmJfZXJyb3JzID0gMDsKCXVuaW9uIHNlbXVuIGFyZzsKCglhcmcudmFsID0gMDsKCgl3aGlsZShhcmdjKSB7CgoJCWlkID0gc3RydG91bChhcmd2WzBdLCAmZW5kLCAxMCk7CgoJCWlmICgqZW5kICE9IDApIHsKCQkJYmJfcHJpbnRmICgiaW52YWxpZCBpZDogJXNcbiIsIGFyZ3ZbMF0pOwoJCQluYl9lcnJvcnMgKys7CgkJfSBlbHNlIHsKCQkJc3dpdGNoKHR5cGUpIHsKCQkJY2FzZSBTRU06CgkJCQlyZXQgPSBzZW1jdGwgKGlkLCAwLCBJUENfUk1JRCwgYXJnKTsKCQkJCWJyZWFrOwoKCQkJY2FzZSBNU0c6CgkJCQlyZXQgPSBtc2djdGwgKGlkLCBJUENfUk1JRCwgTlVMTCk7CgkJCQlicmVhazsKCgkJCWNhc2UgU0hNOgoJCQkJcmV0ID0gc2htY3RsIChpZCwgSVBDX1JNSUQsIE5VTEwpOwoJCQkJYnJlYWs7CgkJCX0KCgkJCWlmIChyZXQpIHsKCQkJCWJiX3ByaW50ZiAoImNhbm5vdCByZW1vdmUgaWQgJXMgKCVzKVxuIiwKCQkJCQlhcmd2WzBdLCBzdHJlcnJvcihlcnJubykpOwoJCQkJbmJfZXJyb3JzICsrOwoJCQl9CgkJfQoJCWFyZ2MtLTsKCQlhcmd2Kys7Cgl9CgoJcmV0dXJuKG5iX2Vycm9ycyk7Cn0KCnN0YXRpYyBpbnQgZGVwcmVjYXRlZF9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKewoJaWYgKGFyZ2MgPCAzKSB7CgkJYmJfc2hvd191c2FnZSgpOwoJCWJiX2ZmbHVzaF9zdGRvdXRfYW5kX2V4aXQoMSk7Cgl9CgoJaWYgKCFzdHJjbXAoYXJndlsxXSwgInNobSIpKSB7CgkJaWYgKHJlbW92ZV9pZHMoU0hNLCBhcmdjLTIsICZhcmd2WzJdKSkKCQkJYmJfZmZsdXNoX3N0ZG91dF9hbmRfZXhpdCgxKTsKCX0KCWVsc2UgaWYgKCFzdHJjbXAoYXJndlsxXSwgIm1zZyIpKSB7CgkJaWYgKHJlbW92ZV9pZHMoTVNHLCBhcmdjLTIsICZhcmd2WzJdKSkKCQkJYmJfZmZsdXNoX3N0ZG91dF9hbmRfZXhpdCgxKTsKCX0KCWVsc2UgaWYgKCFzdHJjbXAoYXJndlsxXSwgInNlbSIpKSB7CgkJaWYgKHJlbW92ZV9pZHMoU0VNLCBhcmdjLTIsICZhcmd2WzJdKSkKCQkJYmJfZmZsdXNoX3N0ZG91dF9hbmRfZXhpdCgxKTsKCX0KCWVsc2UgewoJCWJiX3ByaW50ZiAoInVua25vd24gcmVzb3VyY2UgdHlwZTogJXNcbiIsIGFyZ3ZbMV0pOwoJCWJiX3Nob3dfdXNhZ2UoKTsKCQliYl9mZmx1c2hfc3Rkb3V0X2FuZF9leGl0KDEpOwoJfQoKCWJiX3ByaW50ZiAoInJlc291cmNlKHMpIGRlbGV0ZWRcbiIpOwoJcmV0dXJuIDA7Cn0KCgppbnQgaXBjcm1fbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCnsKCWludCAgIGM7CglpbnQgICBlcnJvciA9IDA7CgljaGFyICpwcm9nID0gYXJndlswXTsKCgkvKiBpZiB0aGUgY29tbWFuZCBpcyBleGVjdXRlZCB3aXRob3V0IHBhcmFtZXRlcnMsIGRvIG5vdGhpbmcgKi8KCWlmIChhcmdjID09IDEpCgkJcmV0dXJuIDA7CgoJLyogY2hlY2sgdG8gc2VlIGlmIHRoZSBjb21tYW5kIGlzIGJlaW5nIGludm9rZWQgaW4gdGhlIG9sZCB3YXkgaWYgc28KCSAgIHRoZW4gcnVuIHRoZSBvbGQgY29kZSAqLwoJaWYgKHN0cmNtcChhcmd2WzFdLCAic2htIikgPT0gMCB8fAoJCXN0cmNtcChhcmd2WzFdLCAibXNnIikgPT0gMCB8fAoJCXN0cmNtcChhcmd2WzFdLCAic2VtIikgPT0gMCkKCQlyZXR1cm4gZGVwcmVjYXRlZF9tYWluKGFyZ2MsIGFyZ3YpOwoKCS8qIHByb2Nlc3MgbmV3IHN5bnRheCB0byBjb25mb3JtIHdpdGggU1lTViBpcGNybSAqLwoJd2hpbGUgKChjID0gZ2V0b3B0KGFyZ2MsIGFyZ3YsICJxOm06czpROk06UzpoPyIpKSAhPSAtMSkgewoJCWludCByZXN1bHQ7CgkJaW50IGlkID0gMDsKCQlpbnQgaXNrZXkgPSBpc3VwcGVyKGMpOwoKCQkvKiBuZWVkZWQgdG8gZGVsZXRlIHNlbWFwaG9yZXMgKi8KCQl1bmlvbiBzZW11biBhcmc7CgkJYXJnLnZhbCA9IDA7CgoJCWlmICgoYyA9PSAnPycpIHx8IChjID09ICdoJykpCgkJewoJCQliYl9zaG93X3VzYWdlKCk7CgkJCXJldHVybiAwOwoJCX0KCgkJLyogd2UgZG9uJ3QgbmVlZCBjYXNlIGluZm9ybWF0aW9uIGFueSBtb3JlICovCgkJYyA9IHRvbG93ZXIoYyk7CgoJCS8qIG1ha2Ugc3VyZSB0aGUgb3B0aW9uIGlzIGluIHJhbmdlICovCgkJaWYgKGMgIT0gJ3EnICYmIGMgIT0gJ20nICYmIGMgIT0gJ3MnKSB7CgkJCWJiX3Nob3dfdXNhZ2UoKTsKCQkJZXJyb3IrKzsKCQkJcmV0dXJuIGVycm9yOwoJCX0KCgkJaWYgKGlza2V5KSB7CgkJCS8qIGtleXMgYXJlIGluIGhleCBvciBkZWNpbWFsICovCgkJCWtleV90IGtleSA9IHN0cnRvdWwob3B0YXJnLCBOVUxMLCAwKTsKCQkJaWYgKGtleSA9PSBJUENfUFJJVkFURSkgewoJCQkJZXJyb3IrKzsKCQkJCWJiX2ZwcmludGYoc3RkZXJyLCAiJXM6IGlsbGVnYWwga2V5ICglcylcbiIsCgkJCQkJcHJvZywgb3B0YXJnKTsKCQkJCWNvbnRpbnVlOwoJCQl9CgoJCQkvKiBjb252ZXJ0IGtleSB0byBpZCAqLwoJCQlpZCA9ICgoYyA9PSAncScpID8gbXNnZ2V0KGtleSwgMCkgOgoJCQkJICAoYyA9PSAnbScpID8gc2htZ2V0KGtleSwgMCwgMCkgOgoJCQkJICBzZW1nZXQoa2V5LCAwLCAwKSk7CgoJCQlpZiAoaWQgPCAwKSB7CgkJCQljaGFyICplcnJtc2c7CgkJCQllcnJvcisrOwoJCQkJc3dpdGNoKGVycm5vKSB7CgkJCQljYXNlIEVBQ0NFUzoKCQkJCQllcnJtc2cgPSAicGVybWlzc2lvbiBkZW5pZWQgZm9yIGtleSI7CgkJCQkJYnJlYWs7CgkJCQljYXNlIEVJRFJNOgoJCQkJCWVycm1zZyA9ICJhbHJlYWR5IHJlbW92ZWQga2V5IjsKCQkJCQlicmVhazsKCQkJCWNhc2UgRU5PRU5UOgoJCQkJCWVycm1zZyA9ICJpbnZhbGlkIGtleSI7CgkJCQkJYnJlYWs7CgkJCQlkZWZhdWx0OgoJCQkJCWVycm1zZyA9ICJ1bmtub3duIGVycm9yIGluIGtleSI7CgkJCQkJYnJlYWs7CgkJCQl9CgkJCQliYl9mcHJpbnRmKHN0ZGVyciwgIiVzOiAlcyAoJXMpXG4iLAoJCQkJCXByb2csIGVycm1zZywgb3B0YXJnKTsKCQkJCWNvbnRpbnVlOwoJCQl9CgkJfSBlbHNlIHsKCQkJLyogaWRzIGFyZSBpbiBkZWNpbWFsICovCgkJCWlkID0gc3RydG91bChvcHRhcmcsIE5VTEwsIDEwKTsKCQl9CgoJCXJlc3VsdCA9ICgoYyA9PSAncScpID8gbXNnY3RsKGlkLCBJUENfUk1JRCwgTlVMTCkgOgoJCQkgIChjID09ICdtJykgPyBzaG1jdGwoaWQsIElQQ19STUlELCBOVUxMKSA6CgkJCSAgc2VtY3RsKGlkLCAwLCBJUENfUk1JRCwgYXJnKSk7CgoJCWlmIChyZXN1bHQgPCAwKSB7CgkJCWNoYXIgKmVycm1zZzsKCQkJZXJyb3IrKzsKCQkJc3dpdGNoKGVycm5vKSB7CgkJCWNhc2UgRUFDQ0VTOgoJCQljYXNlIEVQRVJNOgoJCQkJZXJybXNnID0gaXNrZXkKCQkJCQk/ICJwZXJtaXNzaW9uIGRlbmllZCBmb3Iga2V5IgoJCQkJCTogInBlcm1pc3Npb24gZGVuaWVkIGZvciBpZCI7CgkJCQlicmVhazsKCQkJY2FzZSBFSU5WQUw6CgkJCQllcnJtc2cgPSBpc2tleQoJCQkJCT8gImludmFsaWQga2V5IgoJCQkJCTogImludmFsaWQgaWQiOwoJCQkJYnJlYWs7CgkJCWNhc2UgRUlEUk06CgkJCQllcnJtc2cgPSBpc2tleQoJCQkJCT8gImFscmVhZHkgcmVtb3ZlZCBrZXkiCgkJCQkJOiAiYWxyZWFkeSByZW1vdmVkIGlkIjsKCQkJCWJyZWFrOwoJCQlkZWZhdWx0OgoJCQkJZXJybXNnID0gaXNrZXkKCQkJCQk/ICJ1bmtub3duIGVycm9yIGluIGtleSIKCQkJCQk6ICJ1bmtub3duIGVycm9yIGluIGlkIjsKCQkJCWJyZWFrOwoJCQl9CgkJCWJiX2ZwcmludGYoc3RkZXJyLCAiJXM6ICVzICglcylcbiIsCgkJCQlwcm9nLCBlcnJtc2csIG9wdGFyZyk7CgkJCWNvbnRpbnVlOwoJCX0KCX0KCgkvKiBwcmludCB1c2FnZSBpZiB3ZSBzdGlsbCBoYXZlIHNvbWUgYXJndW1lbnRzIGxlZnQgb3ZlciAqLwoJaWYgKG9wdGluZCAhPSBhcmdjKSB7CgkJYmJfc2hvd191c2FnZSgpOwoJfQoKCS8qIGV4aXQgdmFsdWUgcmVmbGVjdHMgdGhlIG51bWJlciBvZiBlcnJvcnMgZW5jb3VudGVyZWQgKi8KCXJldHVybiBlcnJvcjsKfQo=