Ly8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQovLyBHMyBGYXggTG9hZGVyCi8vCi8vIERlc2lnbiBhbmQgaW1wbGVtZW50YXRpb24gYnkKLy8gLSBIZXJ26SBEcm9sb24gKGRyb2xvbkBpbmZvbmllLmZyKQovLyAtIFBldHIgUHl0ZWxrYSAocHl0YUBsaWdodGNvbXAuY29tKQovLwovLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBGcmVlSW1hZ2UgMwovLwovLyBDT1ZFUkVEIENPREUgSVMgUFJPVklERUQgVU5ERVIgVEhJUyBMSUNFTlNFIE9OIEFOICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVFkKLy8gT0YgQU5ZIEtJTkQsIEVJVEhFUiBFWFBSRVNTRUQgT1IgSU1QTElFRCwgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFdBUlJBTlRJRVMKLy8gVEhBVCBUSEUgQ09WRVJFRCBDT0RFIElTIEZSRUUgT0YgREVGRUNUUywgTUVSQ0hBTlRBQkxFLCBGSVQgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCi8vIE9SIE5PTi1JTkZSSU5HSU5HLiBUSEUgRU5USVJFIFJJU0sgQVMgVE8gVEhFIFFVQUxJVFkgQU5EIFBFUkZPUk1BTkNFIE9GIFRIRSBDT1ZFUkVECi8vIENPREUgSVMgV0lUSCBZT1UuIFNIT1VMRCBBTlkgQ09WRVJFRCBDT0RFIFBST1ZFIERFRkVDVElWRSBJTiBBTlkgUkVTUEVDVCwgWU9VIChOT1QKLy8gVEhFIElOSVRJQUwgREVWRUxPUEVSIE9SIEFOWSBPVEhFUiBDT05UUklCVVRPUikgQVNTVU1FIFRIRSBDT1NUIE9GIEFOWSBORUNFU1NBUlkKLy8gU0VSVklDSU5HLCBSRVBBSVIgT1IgQ09SUkVDVElPTi4gVEhJUyBESVNDTEFJTUVSIE9GIFdBUlJBTlRZIENPTlNUSVRVVEVTIEFOIEVTU0VOVElBTAovLyBQQVJUIE9GIFRISVMgTElDRU5TRS4gTk8gVVNFIE9GIEFOWSBDT1ZFUkVEIENPREUgSVMgQVVUSE9SSVpFRCBIRVJFVU5ERVIgRVhDRVBUIFVOREVSCi8vIFRISVMgRElTQ0xBSU1FUi4KLy8KLy8gVXNlIGF0IHlvdXIgb3duIHJpc2shCi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCiNpbmNsdWRlICIuLi9MaWJUSUZGL3RpZmZpb3AuaCIKCiNpbmNsdWRlICJGcmVlSW1hZ2UuaCIKI2luY2x1ZGUgIlV0aWxpdGllcy5oIgoKLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQovLyBQbHVnaW4gSW50ZXJmYWNlCi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCnN0YXRpYyBpbnQgc19mb3JtYXRfaWQ7CgovLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci8vICAgQ29uc3RhbnQvTWFjcm8gZGVjbGFyYXRpb25zCi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCiNkZWZpbmUgRzNfREVGQVVMVF9XSURUSAkxNzI4CgojZGVmaW5lIFRJRkZob3dtYW55OCh4KSAoKCh4KSYweDA3KT8oKHVpbnQzMikoeCk+PjMpKzE6KHVpbnQzMikoeCk+PjMpCgovLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci8vICAgbGlidGlmZiBpbnRlcmZhY2UgCi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCnN0YXRpYyB0c2l6ZV90IApfZzNSZWFkUHJvYyh0aGFuZGxlX3QgZmQsIHRkYXRhX3QgYnVmLCB0c2l6ZV90IHNpemUpIHsKCS8vIHJldHVybnMgYW4gZXJyb3Igd2hlbiByZWFkaW5nIHRoZSBUSUZGIGhlYWRlcgoJcmV0dXJuIDA7Cn0KCnN0YXRpYyB0c2l6ZV90Cl9nM1dyaXRlUHJvYyh0aGFuZGxlX3QgZmQsIHRkYXRhX3QgYnVmLCB0c2l6ZV90IHNpemUpIHsKCS8vIHJldHVybnMgb2sgd2hlbiB3cml0aW5nIHRoZSBUSUZGIGhlYWRlcgoJcmV0dXJuIHNpemU7Cn0KCnN0YXRpYyB0b2ZmX3QKX2czU2Vla1Byb2ModGhhbmRsZV90IGZkLCB0b2ZmX3Qgb2ZmLCBpbnQgd2hlbmNlKSB7CglyZXR1cm4gMDsKfQoKc3RhdGljIGludApfZzNDbG9zZVByb2ModGhhbmRsZV90IGZkKSB7CglyZXR1cm4gMDsKfQoKc3RhdGljIHRvZmZfdApfZzNTaXplUHJvYyh0aGFuZGxlX3QgZmQpIHsKCXJldHVybiAwOwp9CgpzdGF0aWMgaW50Cl9nM01hcFByb2ModGhhbmRsZV90IGZkLCB0ZGF0YV90KiBwYmFzZSwgdG9mZl90KiBwc2l6ZSkgewoJcmV0dXJuIDA7Cn0KCnN0YXRpYyB2b2lkCl9nM1VubWFwUHJvYyh0aGFuZGxlX3QgZmQsIHRkYXRhX3QgYmFzZSwgdG9mZl90IHNpemUpIHsKfQoKLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCnN0YXRpYyB0b2ZmX3QKRzNHZXRGaWxlU2l6ZShGcmVlSW1hZ2VJTyAqaW8sIGZpX2hhbmRsZSBoYW5kbGUpIHsKICAgIGxvbmcgY3VycmVudFBvcyA9IGlvLT50ZWxsX3Byb2MoaGFuZGxlKTsKICAgIGlvLT5zZWVrX3Byb2MoaGFuZGxlLCAwLCBTRUVLX0VORCk7CiAgICBsb25nIGZpbGVTaXplID0gaW8tPnRlbGxfcHJvYyhoYW5kbGUpOwogICAgaW8tPnNlZWtfcHJvYyhoYW5kbGUsIGN1cnJlbnRQb3MsIFNFRUtfU0VUKTsKICAgIHJldHVybiBmaWxlU2l6ZTsKfQoKc3RhdGljIEJPT0wgCkczUmVhZEZpbGUoRnJlZUltYWdlSU8gKmlvLCBmaV9oYW5kbGUgaGFuZGxlLCB0aWRhdGFfdCB0aWZfcmF3ZGF0YSwgdHNpemVfdCB0aWZfcmF3ZGF0YXNpemUpIHsKCXJldHVybiAoKHRzaXplX3QpKGlvLT5yZWFkX3Byb2ModGlmX3Jhd2RhdGEsIHRpZl9yYXdkYXRhc2l6ZSwgMSwgaGFuZGxlKSAqIHRpZl9yYXdkYXRhc2l6ZSkgPT0gdGlmX3Jhd2RhdGFzaXplKTsKfQoKLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQovLyBJbnRlcm5hbCBmdW5jdGlvbnMKLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKc3RhdGljIGludCAKY29weUZheEZpbGUoRnJlZUltYWdlSU8gKmlvLCBmaV9oYW5kbGUgaGFuZGxlLCBUSUZGKiB0aWZpbiwgdWludDMyIHhzaXplLCBpbnQgc3RyZXRjaCwgRklNRU1PUlkgKm1lbW9yeSkgewoJQllURSAqcm93YnVmID0gTlVMTDsKCUJZVEUgKnJlZmJ1ZiA9IE5VTEw7Cgl1aW50MzIgcm93OwoJdWludDE2IGJhZHJ1bjsKCXVpbnQxNgliYWRmYXhydW47Cgl1aW50MzIJYmFkZmF4bGluZXM7CglpbnQgb2s7CgoJdHJ5IHsKCgkJdWludDMyIGxpbmVzaXplID0gVElGRmhvd21hbnk4KHhzaXplKTsKCQlyb3didWYgPSAoQllURSopIF9USUZGbWFsbG9jKGxpbmVzaXplKTsKCQlyZWZidWYgPSAoQllURSopIF9USUZGbWFsbG9jKGxpbmVzaXplKTsKCQlpZiAocm93YnVmID09IE5VTEwgfHwgcmVmYnVmID09IE5VTEwpIHsKCQkJdGhyb3cgRklfTVNHX0VSUk9SX01FTU9SWTsKCQl9CgoJCXRpZmluLT50aWZfcmF3ZGF0YXNpemUgPSBHM0dldEZpbGVTaXplKGlvLCBoYW5kbGUpOwoJCXRpZmluLT50aWZfcmF3ZGF0YSA9ICh0aWRhdGFfdCkgX1RJRkZtYWxsb2ModGlmaW4tPnRpZl9yYXdkYXRhc2l6ZSk7CgkJaWYgKHRpZmluLT50aWZfcmF3ZGF0YSA9PSBOVUxMKSB7CgkJCXRocm93IEZJX01TR19FUlJPUl9NRU1PUlk7CgkJfQoJCQkKCQlpZighRzNSZWFkRmlsZShpbywgaGFuZGxlLCB0aWZpbi0+dGlmX3Jhd2RhdGEsIHRpZmluLT50aWZfcmF3ZGF0YXNpemUpKSB7CgkJCXRocm93ICJSZWFkIGVycm9yIGF0IHNjYW5saW5lIDAiOwoJCX0KCQl0aWZpbi0+dGlmX3Jhd2NwID0gdGlmaW4tPnRpZl9yYXdkYXRhOwoJCXRpZmluLT50aWZfcmF3Y2MgPSB0aWZpbi0+dGlmX3Jhd2RhdGFzaXplOwoKCQkoKnRpZmluLT50aWZfc2V0dXBkZWNvZGUpKHRpZmluKTsKCQkoKnRpZmluLT50aWZfcHJlZGVjb2RlKSh0aWZpbiwgKHRzYW1wbGVfdCkgMCk7CgkJdGlmaW4tPnRpZl9yb3cgPSAwOwoJCWJhZGZheGxpbmVzID0gMDsKCQliYWRmYXhydW4gPSAwOwoKCQlfVElGRm1lbXNldChyZWZidWYsIDAsIGxpbmVzaXplKTsKCQlyb3cgPSAwOwoJCWJhZHJ1biA9IDA7CQkvLyBjdXJyZW50IHJ1biBvZiBiYWQgbGluZXMgCgkJd2hpbGUgKHRpZmluLT50aWZfcmF3Y2MgPiAwKSB7CgkJCW9rID0gKCp0aWZpbi0+dGlmX2RlY29kZXJvdykodGlmaW4sIHJvd2J1ZiwgbGluZXNpemUsIDApOwoJCQlpZiAoIW9rKSB7CgkJCQliYWRmYXhsaW5lcysrOwoJCQkJYmFkcnVuKys7CgkJCQkvLyByZWdlbmVyYXRlIGxpbmUgZnJvbSBwcmV2aW91cyBnb29kIGxpbmUgCgkJCQlfVElGRm1lbWNweShyb3didWYsIHJlZmJ1ZiwgbGluZXNpemUpOwoJCQl9IGVsc2UgewoJCQkJaWYgKGJhZHJ1biA+IGJhZGZheHJ1bikKCQkJCQliYWRmYXhydW4gPSBiYWRydW47CgkJCQliYWRydW4gPSAwOwoJCQkJX1RJRkZtZW1jcHkocmVmYnVmLCByb3didWYsIGxpbmVzaXplKTsKCQkJfQoJCQl0aWZpbi0+dGlmX3JvdysrOwoKCQkJRnJlZUltYWdlX1dyaXRlTWVtb3J5KHJvd2J1ZiwgbGluZXNpemUsIDEsIG1lbW9yeSk7CgkJCXJvdysrOwoJCQlpZiAoc3RyZXRjaCkgewoJCQkJRnJlZUltYWdlX1dyaXRlTWVtb3J5KHJvd2J1ZiwgbGluZXNpemUsIDEsIG1lbW9yeSk7CgkJCQlyb3crKzsKCQkJfQoJCX0KCQlpZiAoYmFkcnVuID4gYmFkZmF4cnVuKQoJCQliYWRmYXhydW4gPSBiYWRydW47CgoJCV9USUZGZnJlZSh0aWZpbi0+dGlmX3Jhd2RhdGEpOwoJCXRpZmluLT50aWZfcmF3ZGF0YSA9IE5VTEw7CgoJCV9USUZGZnJlZShyb3didWYpOwoJCV9USUZGZnJlZShyZWZidWYpOwoKCQkvKgoJCWlmICh2ZXJib3NlKSB7CgkJCWZwcmludGYoc3RkZXJyLCAiJWQgcm93cyBpbiBpbnB1dFxuIiwgcm93cyk7CgkJCWZwcmludGYoc3RkZXJyLCAiJWxkIHRvdGFsIGJhZCByb3dzXG4iLCAobG9uZykgYmFkZmF4bGluZXMpOwoJCQlmcHJpbnRmKHN0ZGVyciwgIiVkIG1heCBjb25zZWN1dGl2ZSBiYWQgcm93c1xuIiwgYmFkZmF4cnVuKTsKCQl9CgkJKi8KCgl9IGNhdGNoKGNvbnN0IGNoYXIgKm1lc3NhZ2UpIHsKCQlpZihyb3didWYpIF9USUZGZnJlZShyb3didWYpOwoJCWlmKHJlZmJ1ZikgX1RJRkZmcmVlKHJlZmJ1Zik7CgkJaWYodGlmaW4tPnRpZl9yYXdkYXRhKSB7CgkJCV9USUZGZnJlZSh0aWZpbi0+dGlmX3Jhd2RhdGEpOwoJCQl0aWZpbi0+dGlmX3Jhd2RhdGEgPSBOVUxMOwoJCX0KCQlGcmVlSW1hZ2VfT3V0cHV0TWVzc2FnZVByb2Moc19mb3JtYXRfaWQsIG1lc3NhZ2UpOwoKCQlyZXR1cm4gLTE7Cgl9CgoJcmV0dXJuIChyb3cpOwp9CgoKLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQovLyBQbHVnaW4gSW1wbGVtZW50YXRpb24KLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKc3RhdGljIGNvbnN0IGNoYXIgKiBETExfQ0FMTENPTlYKRm9ybWF0KCkgewoJcmV0dXJuICJHMyI7Cn0KCnN0YXRpYyBjb25zdCBjaGFyICogRExMX0NBTExDT05WIApEZXNjcmlwdGlvbigpIHsKCXJldHVybiAiUmF3IGZheCBmb3JtYXQgQ0NJVFQgRy4zIjsKfQoKc3RhdGljIGNvbnN0IGNoYXIgKiBETExfQ0FMTENPTlYgCkV4dGVuc2lvbigpIHsKCXJldHVybiAiZzMiOwp9CgpzdGF0aWMgY29uc3QgY2hhciAqIERMTF9DQUxMQ09OViAKUmVnRXhwcigpIHsKCXJldHVybiBOVUxMOyAvLyB0aGVyZSBpcyBub3cgcmVhc29uYWJsZSByZWdleHAgZm9yIHJhdyBHMwp9CgpzdGF0aWMgY29uc3QgY2hhciAqIERMTF9DQUxMQ09OViAKTWltZVR5cGUoKSB7CglyZXR1cm4gImltYWdlL2ZheC1nMyI7Cn0KCnN0YXRpYyBCT09MIERMTF9DQUxMQ09OViAKU3VwcG9ydHNFeHBvcnREZXB0aChpbnQgZGVwdGgpIHsKCXJldHVybglGQUxTRTsKfQoKLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKc3RhdGljIEZJQklUTUFQICogRExMX0NBTExDT05WCkxvYWQoRnJlZUltYWdlSU8gKmlvLCBmaV9oYW5kbGUgaGFuZGxlLCBpbnQgcGFnZSwgaW50IGZsYWdzLCB2b2lkICpkYXRhKSB7CglUSUZGICpmYXhUSUZGID0gTlVMTDsKCUZJQklUTUFQICpkaWIgPSBOVUxMOwoJRklNRU1PUlkgKm1lbW9yeSA9IE5VTEw7CgoJLy9pbnQgdmVyYm9zZSA9IDA7CglpbnQJc3RyZXRjaCA9IDA7CglpbnQgcm93czsKCWZsb2F0IHJlc1ggPSAyMDQuMDsKCWZsb2F0IHJlc1kgPSAxOTYuMDsKCgl1aW50MzIgeHNpemUgPSBHM19ERUZBVUxUX1dJRFRIOwoJaW50IGNvbXByZXNzaW9uX2luID0gQ09NUFJFU1NJT05fQ0NJVFRGQVgzOwoJaW50IGZpbGxvcmRlcl9pbiA9IEZJTExPUkRFUl9MU0IyTVNCOwoJdWludDMyIGdyb3VwM29wdGlvbnNfaW4gPSAwOwkvLyAxZC1lbmNvZGVkIAoJdWludDMyIGdyb3VwNG9wdGlvbnNfaW4gPSAwOwkvLyBjb21wcmVzc2VkIAoJaW50IHBob3RvbWV0cmljX2luID0gUEhPVE9NRVRSSUNfTUlOSVNXSElURTsKCglpZihoYW5kbGU9PU5VTEwpIHJldHVybiBOVUxMOwoKCXRyeSB7CgkJLy8gc2V0IGRlZmF1bHQgbG9hZCBvcHRpb25zCgoJCWNvbXByZXNzaW9uX2luID0gQ09NUFJFU1NJT05fQ0NJVFRGQVgzOwkJCS8vIGlucHV0IGlzIGczLWVuY29kZWQgCgkJZ3JvdXAzb3B0aW9uc19pbiAmPSB+R1JPVVAzT1BUXzJERU5DT0RJTkc7CQkvLyBpbnB1dCBpcyAxZC1lbmNvZGVkIChnMyBvbmx5KSAKCQlmaWxsb3JkZXJfaW4gPSBGSUxMT1JERVJfTVNCMkxTQjsJCQkJLy8gaW5wdXQgaGFzIG1zYi10by1sc2IgZmlsbG9yZGVyIAoKCQkvKgoJCU9yaWdpbmFsIGlucHV0LXJlbGF0ZWQgZmF4MnRpZmYgb3B0aW9ucwoKCQl3aGlsZSAoKGMgPSBnZXRvcHQoYXJnYywgYXJndiwgIlI6WDpvOjEyMzRBQkxNUFVXNTY3OGFiY2ZsbXByc3V2d3o/IikpICE9IC0xKSB7CgkJCXN3aXRjaCAoYykgewoJCQkJCS8vIGlucHV0LXJlbGF0ZWQgb3B0aW9ucyAKCQkJCWNhc2UgJzMnOgkJLy8gaW5wdXQgaXMgZzMtZW5jb2RlZCAKCQkJCQljb21wcmVzc2lvbl9pbiA9IENPTVBSRVNTSU9OX0NDSVRURkFYMzsKCQkJCQlicmVhazsKCQkJCWNhc2UgJzQnOgkJLy8gaW5wdXQgaXMgZzQtZW5jb2RlZCAKCQkJCQljb21wcmVzc2lvbl9pbiA9IENPTVBSRVNTSU9OX0NDSVRURkFYNDsKCQkJCQlicmVhazsKCQkJCWNhc2UgJ1UnOgkJLy8gaW5wdXQgaXMgdW5jb21wcmVzc2VkIChnMyBhbmQgZzQpIAoJCQkJCWdyb3VwM29wdGlvbnNfaW4gfD0gR1JPVVAzT1BUX1VOQ09NUFJFU1NFRDsKCQkJCQlncm91cDRvcHRpb25zX2luIHw9IEdST1VQNE9QVF9VTkNPTVBSRVNTRUQ7CgkJCQkJYnJlYWs7CgkJCQljYXNlICcxJzoJCS8vIGlucHV0IGlzIDFkLWVuY29kZWQgKGczIG9ubHkpIAoJCQkJCWdyb3VwM29wdGlvbnNfaW4gJj0gfkdST1VQM09QVF8yREVOQ09ESU5HOwoJCQkJCWJyZWFrOwoJCQkJY2FzZSAnMic6CQkvLyBpbnB1dCBpcyAyZC1lbmNvZGVkIChnMyBvbmx5KSAKCQkJCQlncm91cDNvcHRpb25zX2luIHw9IEdST1VQM09QVF8yREVOQ09ESU5HOwoJCQkJCWJyZWFrOwoJCQkJY2FzZSAnUCc6CS8vIGlucHV0IGhhcyBub3QtYWxpZ25lZCBFT0wgKGczIG9ubHkpIAoJCQkJCWdyb3VwM29wdGlvbnNfaW4gJj0gfkdST1VQM09QVF9GSUxMQklUUzsKCQkJCQlicmVhazsKCQkJCWNhc2UgJ0EnOgkJLy8gaW5wdXQgaGFzIGFsaWduZWQgRU9MIChnMyBvbmx5KSAKCQkJCQlncm91cDNvcHRpb25zX2luIHw9IEdST1VQM09QVF9GSUxMQklUUzsKCQkJCQlicmVhazsKCQkJCWNhc2UgJ1cnOgkJLy8gaW5wdXQgaGFzIDAgbWVhbiB3aGl0ZSAKCQkJCQlwaG90b21ldHJpY19pbiA9IFBIT1RPTUVUUklDX01JTklTV0hJVEU7CgkJCQkJYnJlYWs7CgkJCQljYXNlICdCJzoJCS8vIGlucHV0IGhhcyAwIG1lYW4gYmxhY2sgCgkJCQkJcGhvdG9tZXRyaWNfaW4gPSBQSE9UT01FVFJJQ19NSU5JU0JMQUNLOwoJCQkJCWJyZWFrOwoJCQkJY2FzZSAnTCc6CQkvLyBpbnB1dCBoYXMgbHNiLXRvLW1zYiBmaWxsb3JkZXIgCgkJCQkJZmlsbG9yZGVyX2luID0gRklMTE9SREVSX0xTQjJNU0I7CgkJCQkJYnJlYWs7CgkJCQljYXNlICdNJzoJCS8vIGlucHV0IGhhcyBtc2ItdG8tbHNiIGZpbGxvcmRlciAKCQkJCQlmaWxsb3JkZXJfaW4gPSBGSUxMT1JERVJfTVNCMkxTQjsKCQkJCQlicmVhazsKCQkJCWNhc2UgJ1InOgkJLy8gaW5wdXQgcmVzb2x1dGlvbiAKCQkJCQlyZXNZID0gKGZsb2F0KSBhdG9mKG9wdGFyZyk7CgkJCQkJYnJlYWs7CgkJCQljYXNlICdYJzoJCS8vIGlucHV0IHdpZHRoIAoJCQkJCXhzaXplID0gKHVpbnQzMikgYXRvaShvcHRhcmcpOwoJCQkJCWJyZWFrOwoKCQkJCQkvLyBvdXRwdXQtcmVsYXRlZCBvcHRpb25zIAoJCQkJY2FzZSAncyc6CQkvLyBzdHJldGNoIGltYWdlIGJ5IGR1cCduZyBzY2FubGluZXMgCgkJCQkJc3RyZXRjaCA9IDE7CgkJCQkJYnJlYWs7CgkJCQljYXNlICd2JzoJCS8vIC12IGZvciBpbmZvIAoJCQkJCXZlcmJvc2UrKzsKCQkJCQlicmVhazsKCQkJfQoJCX0KCgkJKi8KCgkJLy8gb3BlbiBhIHRlbXBvcmFyeSBtZW1vcnkgYnVmZmVyIHRvIHNhdmUgZGVjb2RlZCBzY2FubGluZXMKCQltZW1vcnkgPSBGcmVlSW1hZ2VfT3Blbk1lbW9yeSgpOwoJCWlmKCFtZW1vcnkpIHRocm93IEZJX01TR19FUlJPUl9NRU1PUlk7CgkJCgkJLy8gd3JhcCB0aGUgcmF3IGZheCBmaWxlCgkJZmF4VElGRiA9IFRJRkZDbGllbnRPcGVuKCIoRmFrZUlucHV0KSIsICJ3IiwKCQkJLy8gVElGRkNsaWVudE9wZW4oKSBmYWlscyBpZiB3ZSBkb24ndCBzZXQgZXhpc3RpbmcgdmFsdWUgaGVyZSAKCQkJTlVMTCwKCQkJX2czUmVhZFByb2MsIF9nM1dyaXRlUHJvYywKCQkJX2czU2Vla1Byb2MsIF9nM0Nsb3NlUHJvYywKCQkJX2czU2l6ZVByb2MsIF9nM01hcFByb2MsCgkJCV9nM1VubWFwUHJvYyk7CgoJCWlmIChmYXhUSUZGID09IE5VTEwpIHsKCQkJdGhyb3cgIkNhbiBub3QgY3JlYXRlIGZha2UgaW5wdXQgZmlsZSI7CgkJfQoJCVRJRkZTZXRNb2RlKGZheFRJRkYsIE9fUkRPTkxZKTsKCQlUSUZGU2V0RmllbGQoZmF4VElGRiwgVElGRlRBR19JTUFHRVdJRFRILCB4c2l6ZSk7CgkJVElGRlNldEZpZWxkKGZheFRJRkYsIFRJRkZUQUdfU0FNUExFU1BFUlBJWEVMLCAxKTsKCQlUSUZGU2V0RmllbGQoZmF4VElGRiwgVElGRlRBR19CSVRTUEVSU0FNUExFLCAxKTsKCQlUSUZGU2V0RmllbGQoZmF4VElGRiwgVElGRlRBR19GSUxMT1JERVIsIGZpbGxvcmRlcl9pbik7CgkJVElGRlNldEZpZWxkKGZheFRJRkYsIFRJRkZUQUdfUExBTkFSQ09ORklHLCBQTEFOQVJDT05GSUdfQ09OVElHKTsKCQlUSUZGU2V0RmllbGQoZmF4VElGRiwgVElGRlRBR19QSE9UT01FVFJJQywgcGhvdG9tZXRyaWNfaW4pOwoJCVRJRkZTZXRGaWVsZChmYXhUSUZGLCBUSUZGVEFHX1lSRVNPTFVUSU9OLCByZXNZKTsKCQlUSUZGU2V0RmllbGQoZmF4VElGRiwgVElGRlRBR19SRVNPTFVUSU9OVU5JVCwgUkVTVU5JVF9JTkNIKTsKCgkJLy8gTkI6IHRoaXMgbXVzdCBiZSBkb25lIGFmdGVyIGRpcmVjdG9yeSBpbmZvIGlzIHNldHVwIAoJCVRJRkZTZXRGaWVsZChmYXhUSUZGLCBUSUZGVEFHX0NPTVBSRVNTSU9OLCBjb21wcmVzc2lvbl9pbik7CgkJaWYgKGNvbXByZXNzaW9uX2luID09IENPTVBSRVNTSU9OX0NDSVRURkFYMykKCQkJVElGRlNldEZpZWxkKGZheFRJRkYsIFRJRkZUQUdfR1JPVVAzT1BUSU9OUywgZ3JvdXAzb3B0aW9uc19pbik7CgkJZWxzZSBpZiAoY29tcHJlc3Npb25faW4gPT0gQ09NUFJFU1NJT05fQ0NJVFRGQVg0KQoJCQlUSUZGU2V0RmllbGQoZmF4VElGRiwgVElGRlRBR19HUk9VUDRPUFRJT05TLCBncm91cDRvcHRpb25zX2luKTsKCQkKCQlyZXNYID0gMjA0OwoJCWlmICghc3RyZXRjaCkgewoJCQlUSUZGR2V0RmllbGQoZmF4VElGRiwgVElGRlRBR19ZUkVTT0xVVElPTiwgJnJlc1kpOwoJCX0gZWxzZSB7CgkJCXJlc1kgPSAxOTY7CgkJfQoKCQkvLyBkZWNvZGUgdGhlIHJhdyBmYXggZGF0YQoJCXJvd3MgPSBjb3B5RmF4RmlsZShpbywgaGFuZGxlLCBmYXhUSUZGLCB4c2l6ZSwgc3RyZXRjaCwgbWVtb3J5KTsKCQlpZihyb3dzIDw9IDApIHRocm93ICJFcnJvciB3aGVuIGRlY29kaW5nIHJhdyBmYXggZmlsZSA6IGNoZWNrIHRoZSBkZWNvZGVyIG9wdGlvbnMiOwoKCgkJLy8gYWxsb2NhdGUgdGhlIG91dHB1dCBkaWIKCQlkaWIgPSBGcmVlSW1hZ2VfQWxsb2NhdGUoeHNpemUsIHJvd3MsIDEpOwoJCXVuc2lnbmVkIHBpdGNoID0gRnJlZUltYWdlX0dldFBpdGNoKGRpYik7CgkJdWludDMyIGxpbmVzaXplID0gVElGRmhvd21hbnk4KHhzaXplKTsKCgkJLy8gZmlsbCB0aGUgYml0bWFwIHN0cnVjdHVyZSAuLi4KCQkvLyAuLi4gcGFsZXR0ZQoJCVJHQlFVQUQgKnBhbCA9IEZyZWVJbWFnZV9HZXRQYWxldHRlKGRpYik7CgkJaWYocGhvdG9tZXRyaWNfaW4gPT0gUEhPVE9NRVRSSUNfTUlOSVNXSElURSkgewoJCQlwYWxbMF0ucmdiUmVkID0gcGFsWzBdLnJnYkdyZWVuID0gcGFsWzBdLnJnYkJsdWUgPSAyNTU7CgkJCXBhbFsxXS5yZ2JSZWQgPSBwYWxbMV0ucmdiR3JlZW4gPSBwYWxbMV0ucmdiQmx1ZSA9IDA7CgkJfSBlbHNlIHsKCQkJcGFsWzBdLnJnYlJlZCA9IHBhbFswXS5yZ2JHcmVlbiA9IHBhbFswXS5yZ2JCbHVlID0gMDsKCQkJcGFsWzFdLnJnYlJlZCA9IHBhbFsxXS5yZ2JHcmVlbiA9IHBhbFsxXS5yZ2JCbHVlID0gMjU1OwoJCX0KCQkvLyAuLi4gcmVzb2x1dGlvbgoJCUZyZWVJbWFnZV9TZXREb3RzUGVyTWV0ZXJYKGRpYiwgKHVuc2lnbmVkKShyZXNYLzAuMDI1NDAwMCArIDAuNSkpOwoJCUZyZWVJbWFnZV9TZXREb3RzUGVyTWV0ZXJZKGRpYiwgKHVuc2lnbmVkKShyZXNZLzAuMDI1NDAwMCArIDAuNSkpOwoKCQkvLyByZWFkIHRoZSBkZWNvZGVkIHNjYW5saW5lIGFuZCBmaWxsIHRoZSBiaXRtYXAgZGF0YQoJCUZyZWVJbWFnZV9TZWVrTWVtb3J5KG1lbW9yeSwgMCwgU0VFS19TRVQpOwoJCUJZVEUgKmJpdHMgPSBGcmVlSW1hZ2VfR2V0U2NhbkxpbmUoZGliLCByb3dzIC0gMSk7CgkJZm9yKGludCBrID0gMDsgayA8IHJvd3M7IGsrKykgewoJCQlGcmVlSW1hZ2VfUmVhZE1lbW9yeShiaXRzLCBsaW5lc2l6ZSwgMSwgbWVtb3J5KTsKCQkJYml0cyAtPSBwaXRjaDsKCQl9CgoJCS8vIGZyZWUgdGhlIFRJRkYgd3JhcHBlcgoJCVRJRkZDbG9zZShmYXhUSUZGKTsKCgkJLy8gZnJlZSB0aGUgbWVtb3J5IGJ1ZmZlcgoJCUZyZWVJbWFnZV9DbG9zZU1lbW9yeShtZW1vcnkpOwoKCX0gY2F0Y2goY29uc3QgY2hhciAqbWVzc2FnZSkgewoJCWlmKG1lbW9yeSkgRnJlZUltYWdlX0Nsb3NlTWVtb3J5KG1lbW9yeSk7CgkJaWYoZmF4VElGRikgVElGRkNsb3NlKGZheFRJRkYpOwoJCWlmKGRpYikgRnJlZUltYWdlX1VubG9hZChkaWIpOwoJCUZyZWVJbWFnZV9PdXRwdXRNZXNzYWdlUHJvYyhzX2Zvcm1hdF9pZCwgbWVzc2FnZSk7CgkJcmV0dXJuIE5VTEw7Cgl9CgoJcmV0dXJuIGRpYjsKCn0KCi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLy8gICBJbml0Ci8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCnZvaWQgRExMX0NBTExDT05WCkluaXRHMyhQbHVnaW4gKnBsdWdpbiwgaW50IGZvcm1hdF9pZCkgewoJc19mb3JtYXRfaWQgPSBmb3JtYXRfaWQ7CgoJcGx1Z2luLT5mb3JtYXRfcHJvYyA9IEZvcm1hdDsKCXBsdWdpbi0+ZGVzY3JpcHRpb25fcHJvYyA9IERlc2NyaXB0aW9uOwoJcGx1Z2luLT5leHRlbnNpb25fcHJvYyA9IEV4dGVuc2lvbjsKCXBsdWdpbi0+cmVnZXhwcl9wcm9jID0gUmVnRXhwcjsKCXBsdWdpbi0+b3Blbl9wcm9jID0gTlVMTDsKCXBsdWdpbi0+Y2xvc2VfcHJvYyA9IE5VTEw7CglwbHVnaW4tPnBhZ2Vjb3VudF9wcm9jID0gTlVMTDsKCXBsdWdpbi0+cGFnZWNhcGFiaWxpdHlfcHJvYyA9IE5VTEw7CglwbHVnaW4tPmxvYWRfcHJvYyA9IExvYWQ7CglwbHVnaW4tPnNhdmVfcHJvYyA9IE5VTEw7CglwbHVnaW4tPnZhbGlkYXRlX3Byb2MgPSBOVUxMOwoJcGx1Z2luLT5taW1lX3Byb2MgPSBNaW1lVHlwZTsKCXBsdWdpbi0+c3VwcG9ydHNfZXhwb3J0X2JwcF9wcm9jID0gU3VwcG9ydHNFeHBvcnREZXB0aDsKCXBsdWdpbi0+c3VwcG9ydHNfZXhwb3J0X3R5cGVfcHJvYyA9IE5VTEw7CglwbHVnaW4tPnN1cHBvcnRzX2ljY19wcm9maWxlc19wcm9jID0gTlVMTDsKfQo=