I2lmIDAgLy8gVW51c2VkIGJ5IFRQTgovLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci8vIEVYUiBMb2FkZXIgYW5kIHdyaXRlcgovLwovLyBEZXNpZ24gYW5kIGltcGxlbWVudGF0aW9uIGJ5IAovLyAtIEhlcnbpIERyb2xvbiAoZHJvbG9uQGluZm9uaWUuZnIpCi8vCi8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZyZWVJbWFnZSAzCi8vCi8vIENPVkVSRUQgQ09ERSBJUyBQUk9WSURFRCBVTkRFUiBUSElTIExJQ0VOU0UgT04gQU4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5UWQovLyBPRiBBTlkgS0lORCwgRUlUSEVSIEVYUFJFU1NFRCBPUiBJTVBMSUVELCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgV0FSUkFOVElFUwovLyBUSEFUIFRIRSBDT1ZFUkVEIENPREUgSVMgRlJFRSBPRiBERUZFQ1RTLCBNRVJDSEFOVEFCTEUsIEZJVCBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKLy8gT1IgTk9OLUlORlJJTkdJTkcuIFRIRSBFTlRJUkUgUklTSyBBUyBUTyBUSEUgUVVBTElUWSBBTkQgUEVSRk9STUFOQ0UgT0YgVEhFIENPVkVSRUQKLy8gQ09ERSBJUyBXSVRIIFlPVS4gU0hPVUxEIEFOWSBDT1ZFUkVEIENPREUgUFJPVkUgREVGRUNUSVZFIElOIEFOWSBSRVNQRUNULCBZT1UgKE5PVAovLyBUSEUgSU5JVElBTCBERVZFTE9QRVIgT1IgQU5ZIE9USEVSIENPTlRSSUJVVE9SKSBBU1NVTUUgVEhFIENPU1QgT0YgQU5ZIE5FQ0VTU0FSWQovLyBTRVJWSUNJTkcsIFJFUEFJUiBPUiBDT1JSRUNUSU9OLiBUSElTIERJU0NMQUlNRVIgT0YgV0FSUkFOVFkgQ09OU1RJVFVURVMgQU4gRVNTRU5USUFMCi8vIFBBUlQgT0YgVEhJUyBMSUNFTlNFLiBOTyBVU0UgT0YgQU5ZIENPVkVSRUQgQ09ERSBJUyBBVVRIT1JJWkVEIEhFUkVVTkRFUiBFWENFUFQgVU5ERVIKLy8gVEhJUyBESVNDTEFJTUVSLgovLwovLyBVc2UgYXQgeW91ciBvd24gcmlzayEKLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKI2luY2x1ZGUgIkZyZWVJbWFnZS5oIgojaW5jbHVkZSAiVXRpbGl0aWVzLmgiCiNpbmNsdWRlICIuLi9PcGVuRVhSL0lsbUltZi9JbWZJTy5oIgojaW5jbHVkZSAiLi4vT3BlbkVYUi9JZXgvSWV4LmgiCiNpbmNsdWRlICIuLi9PcGVuRVhSL0lsbUltZi9JbWZPdXRwdXRGaWxlLmgiCiNpbmNsdWRlICIuLi9PcGVuRVhSL0lsbUltZi9JbWZJbnB1dEZpbGUuaCIKI2luY2x1ZGUgIi4uL09wZW5FWFIvSWxtSW1mL0ltZlJnYmFGaWxlLmgiCiNpbmNsdWRlICIuLi9PcGVuRVhSL0lsbUltZi9JbWZDaGFubmVsTGlzdC5oIgojaW5jbHVkZSAiLi4vT3BlbkVYUi9JbG1JbWYvSW1mUmdiYS5oIgojaW5jbHVkZSAiLi4vT3BlbkVYUi9JbG1JbWYvSW1mQXJyYXkuaCIKI2luY2x1ZGUgIi4uL09wZW5FWFIvSGFsZi9oYWxmLmgiCgoKLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQovLyBQbHVnaW4gSW50ZXJmYWNlCi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCnN0YXRpYyBpbnQgc19mb3JtYXRfaWQ7CgovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgovKioKRnJlZUltYWdlIGlucHV0IHN0cmVhbSB3cmFwcGVyCiovCmNsYXNzIENfSVN0cmVhbTogcHVibGljIEltZjo6SVN0cmVhbSB7CnB1YmxpYzoKCUNfSVN0cmVhbSAoRnJlZUltYWdlSU8gKmlvLCBmaV9oYW5kbGUgaGFuZGxlKToKCUlTdHJlYW0oIiIpLCBfaW8gKGlvKSwgX2hhbmRsZShoYW5kbGUpIHt9CgoJdmlydHVhbCBib29sCXJlYWQgKGNoYXIgY1svKm4qL10sIGludCBuKTsKCXZpcnR1YWwgSW1mOjpJbnQ2NAl0ZWxsZyAoKTsKCXZpcnR1YWwgdm9pZAlzZWVrZyAoSW1mOjpJbnQ2NCBwb3MpOwoJdmlydHVhbCB2b2lkCWNsZWFyICgpIHt9OwoKcHJpdmF0ZToKICAgIEZyZWVJbWFnZUlPICpfaW87CglmaV9oYW5kbGUgX2hhbmRsZTsKfTsKCgovKioKRnJlZUltYWdlIG91dHB1dCBzdHJlYW0gd3JhcHBlcgoqLwpjbGFzcyBDX09TdHJlYW06IHB1YmxpYyBJbWY6Ok9TdHJlYW0gewpwdWJsaWM6CglDX09TdHJlYW0gKEZyZWVJbWFnZUlPICppbywgZmlfaGFuZGxlIGhhbmRsZSk6CglPU3RyZWFtKCIiKSwgX2lvIChpbyksIF9oYW5kbGUoaGFuZGxlKSB7fQoKICAgIHZpcnR1YWwgdm9pZAl3cml0ZSAoY29uc3QgY2hhciBjWy8qbiovXSwgaW50IG4pOwoJdmlydHVhbCBJbWY6OkludDY0CXRlbGxwICgpOwoJdmlydHVhbCB2b2lkCXNlZWtwIChJbWY6OkludDY0IHBvcyk7Cgpwcml2YXRlOgogICAgRnJlZUltYWdlSU8gKl9pbzsKCWZpX2hhbmRsZSBfaGFuZGxlOwp9OwoKCmJvb2wKQ19JU3RyZWFtOjpyZWFkIChjaGFyIGNbLypuKi9dLCBpbnQgbikgewoJcmV0dXJuICgodW5zaWduZWQpbiAhPSBfaW8tPnJlYWRfcHJvYyhjLCAxLCBuLCBfaGFuZGxlKSk7Cn0KCkltZjo6SW50NjQKQ19JU3RyZWFtOjp0ZWxsZyAoKSB7CglyZXR1cm4gX2lvLT50ZWxsX3Byb2MoX2hhbmRsZSk7Cn0KCnZvaWQKQ19JU3RyZWFtOjpzZWVrZyAoSW1mOjpJbnQ2NCBwb3MpIHsKCV9pby0+c2Vla19wcm9jKF9oYW5kbGUsICh1bnNpZ25lZClwb3MsIFNFRUtfU0VUKTsKfQoKdm9pZApDX09TdHJlYW06OndyaXRlIChjb25zdCBjaGFyIGNbLypuKi9dLCBpbnQgbikgewoJaWYoKHVuc2lnbmVkKW4gIT0gX2lvLT53cml0ZV9wcm9jKCh2b2lkKikmY1swXSwgMSwgbiwgX2hhbmRsZSkpIHsKCQlJZXg6OnRocm93RXJybm9FeGMoKTsKCX0KfQoKSW1mOjpJbnQ2NApDX09TdHJlYW06OnRlbGxwICgpIHsKCXJldHVybiBfaW8tPnRlbGxfcHJvYyhfaGFuZGxlKTsKfQoKdm9pZApDX09TdHJlYW06OnNlZWtwIChJbWY6OkludDY0IHBvcykgewoJX2lvLT5zZWVrX3Byb2MoX2hhbmRsZSwgKHVuc2lnbmVkKXBvcywgU0VFS19TRVQpOwp9CgovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgoKLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQovLyBQbHVnaW4gSW1wbGVtZW50YXRpb24KLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKc3RhdGljIGNvbnN0IGNoYXIgKiBETExfQ0FMTENPTlYKRm9ybWF0KCkgewoJcmV0dXJuICJFWFIiOwp9CgpzdGF0aWMgY29uc3QgY2hhciAqIERMTF9DQUxMQ09OVgpEZXNjcmlwdGlvbigpIHsKCXJldHVybiAiSUxNIE9wZW5FWFIiOwp9CgpzdGF0aWMgY29uc3QgY2hhciAqIERMTF9DQUxMQ09OVgpFeHRlbnNpb24oKSB7CglyZXR1cm4gImV4ciI7Cn0KCnN0YXRpYyBjb25zdCBjaGFyICogRExMX0NBTExDT05WClJlZ0V4cHIoKSB7CglyZXR1cm4gTlVMTDsKfQoKc3RhdGljIGNvbnN0IGNoYXIgKiBETExfQ0FMTENPTlYKTWltZVR5cGUoKSB7CglyZXR1cm4gImltYWdlL2V4ciI7Cn0KCnN0YXRpYyBCT09MIERMTF9DQUxMQ09OVgpWYWxpZGF0ZShGcmVlSW1hZ2VJTyAqaW8sIGZpX2hhbmRsZSBoYW5kbGUpIHsKCUJZVEUgZXhyX3NpZ25hdHVyZVtdID0geyAweDc2LCAweDJGLCAweDMxLCAweDAxIH07CglCWVRFIHNpZ25hdHVyZVtdID0geyAwLCAwLCAwLCAwIH07CgoJaW8tPnJlYWRfcHJvYyhzaWduYXR1cmUsIDEsIDQsIGhhbmRsZSk7CglyZXR1cm4gKG1lbWNtcChleHJfc2lnbmF0dXJlLCBzaWduYXR1cmUsIDQpID09IDApOwp9CgpzdGF0aWMgQk9PTCBETExfQ0FMTENPTlYKU3VwcG9ydHNFeHBvcnREZXB0aChpbnQgZGVwdGgpIHsKCXJldHVybiBGQUxTRTsKfQoKc3RhdGljIEJPT0wgRExMX0NBTExDT05WIApTdXBwb3J0c0V4cG9ydFR5cGUoRlJFRV9JTUFHRV9UWVBFIHR5cGUpIHsKCXJldHVybiAoCgkJKHR5cGUgPT0gRklUX0ZMT0FUKSB8fAoJCSh0eXBlID09IEZJVF9SR0JGKSAgfHwKCQkodHlwZSA9PSBGSVRfUkdCQUYpCgkpOwp9CgovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKc3RhdGljIEZJQklUTUFQICogRExMX0NBTExDT05WCkxvYWQoRnJlZUltYWdlSU8gKmlvLCBmaV9oYW5kbGUgaGFuZGxlLCBpbnQgcGFnZSwgaW50IGZsYWdzLCB2b2lkICpkYXRhKSB7Cglib29sIGJVc2VSZ2JhSW50ZXJmYWNlID0gZmFsc2U7CglGSUJJVE1BUCAqZGliID0gTlVMTDsJCgoJaWYoaGFuZGxlKSB7CgkJdHJ5IHsKCQkJLy8gc2F2ZSB0aGUgc3RyZWFtIHN0YXJ0aW5nIHBvaW50CgkJCWxvbmcgc3RyZWFtX3N0YXJ0ID0gaW8tPnRlbGxfcHJvYyhoYW5kbGUpOwoKCQkJLy8gd3JhcCB0aGUgRnJlZUltYWdlIElPIHN0cmVhbQoJCQlDX0lTdHJlYW0gaXN0cmVhbShpbywgaGFuZGxlKTsKCgkJCS8vIG9wZW4gdGhlIGZpbGUKCQkJSW1mOjpJbnB1dEZpbGUgZmlsZShpc3RyZWFtKTsKCgkJCS8vIGdldCBmaWxlIGluZm8JCQkKCQkJY29uc3QgSW1hdGg6OkJveDJpICZkYXRhV2luZG93ID0gZmlsZS5oZWFkZXIoKS5kYXRhV2luZG93KCk7CgkJCWludCB3aWR0aCAgPSBkYXRhV2luZG93Lm1heC54IC0gZGF0YVdpbmRvdy5taW4ueCArIDE7CgkJCWludCBoZWlnaHQgPSBkYXRhV2luZG93Lm1heC55IC0gZGF0YVdpbmRvdy5taW4ueSArIDE7CgoJCQkvL2NvbnN0IEltZjo6Q29tcHJlc3Npb24gJmNvbXByZXNzaW9uID0gZmlsZS5oZWFkZXIoKS5jb21wcmVzc2lvbigpOwoKCQkJaWYoKGRhdGFXaW5kb3cubWluLnggPiAwKSB8fCAoZGF0YVdpbmRvdy5taW4ueCA8IDApIHx8IChkYXRhV2luZG93Lm1pbi55ID4gMCkgfHwgKGRhdGFXaW5kb3cubWluLnkgPCAwKSkgewoJCQkJVEhST1cgKElleDo6SW5wdXRFeGMsICJJbnZhbGlkIGRhdGEgd2luZG93ICIgPDwgCgkJCQkJIlsiIDw8IGRhdGFXaW5kb3cubWluLnggPDwgIiwiIDw8IGRhdGFXaW5kb3cubWluLnkgPDwgIiwiIDw8IGRhdGFXaW5kb3cubWF4LnggPDwgIiwiIDw8IGRhdGFXaW5kb3cubWF4LnkgPDwgIl0iKTsKCQkJfQogICAgICAgICAgICAJCQkKCQkJY29uc3QgSW1mOjpDaGFubmVsTGlzdCAmY2hhbm5lbHMgPSBmaWxlLmhlYWRlcigpLmNoYW5uZWxzKCk7CgoJCQkvLyBjaGVjayB0aGUgbnVtYmVyIG9mIGNvbXBvbmVudHMgYW5kIGNoZWNrIGZvciBhIGNvaGVyZW50IGZvcm1hdAoKCQkJc3RkOjpzdHJpbmcgZXhyX2NvbG9yX21vZGVsOwoJCQlJbWY6OlBpeGVsVHlwZSBwaXhlbF90eXBlID0gSW1mOjpIQUxGOwoJCQlGUkVFX0lNQUdFX1RZUEUgaW1hZ2VfdHlwZSA9IEZJVF9VTktOT1dOOwoJCQlpbnQgY29tcG9uZW50cyA9IDA7CgkJCWJvb2wgYk1peGVkQ29tcG9uZW50cyA9IGZhbHNlOwoKCQkJZm9yIChJbWY6OkNoYW5uZWxMaXN0OjpDb25zdEl0ZXJhdG9yIGkgPSBjaGFubmVscy5iZWdpbigpOyBpICE9IGNoYW5uZWxzLmVuZCgpOyArK2kpIHsKCQkJCWNvbXBvbmVudHMrKzsKCQkJCWlmKGNvbXBvbmVudHMgPT0gMSkgewoJCQkJCWV4cl9jb2xvcl9tb2RlbCArPSBpLm5hbWUoKTsKCQkJCQlwaXhlbF90eXBlID0gaS5jaGFubmVsKCkudHlwZTsKCQkJCX0gZWxzZSB7CgkJCQkJZXhyX2NvbG9yX21vZGVsICs9ICIvIjsKCQkJCQlleHJfY29sb3JfbW9kZWwgKz0gaS5uYW1lKCk7CgkJCQkJaWYgKGkuY2hhbm5lbCgpLnR5cGUgIT0gcGl4ZWxfdHlwZSkgewoJCQkJCQliTWl4ZWRDb21wb25lbnRzID0gdHJ1ZTsKCQkJCQl9CgkJCQl9CgkJCX0KCQkJaWYoYk1peGVkQ29tcG9uZW50cykgewoJCQkJYm9vbCBiSGFuZGxlZCA9IGZhbHNlOwoJCQkJLy8gd2UgbWF5IGhhdmUgYSBSR0JaIG9yIFJHQkFaIGltYWdlIC4uLiAKCQkJCWlmKGNvbXBvbmVudHMgPiA0KSB7CgkJCQkJaWYoY2hhbm5lbHMuZmluZENoYW5uZWwoIlIiKSAmJiBjaGFubmVscy5maW5kQ2hhbm5lbCgiRyIpICYmIGNoYW5uZWxzLmZpbmRDaGFubmVsKCJCIikgJiYgY2hhbm5lbHMuZmluZENoYW5uZWwoIkEiKSkgewoJCQkJCQlzdGQ6OnN0cmluZyBtc2cgPSAiV2FybmluZzogY29udmVydGluZyBjb2xvciBtb2RlbCAiICsgZXhyX2NvbG9yX21vZGVsICsgIiB0byBSR0JBIGNvbG9yIG1vZGVsIjsKCQkJCQkJRnJlZUltYWdlX091dHB1dE1lc3NhZ2VQcm9jKHNfZm9ybWF0X2lkLCBtc2cuY19zdHIoKSk7CgkJCQkJCWJIYW5kbGVkID0gdHJ1ZTsKCQkJCQl9CgkJCQl9CgkJCQllbHNlIGlmKGNvbXBvbmVudHMgPiAzKSB7CgkJCQkJaWYoY2hhbm5lbHMuZmluZENoYW5uZWwoIlIiKSAmJiBjaGFubmVscy5maW5kQ2hhbm5lbCgiRyIpICYmIGNoYW5uZWxzLmZpbmRDaGFubmVsKCJCIikpIHsKCQkJCQkJc3RkOjpzdHJpbmcgbXNnID0gIldhcm5pbmc6IGNvbnZlcnRpbmcgY29sb3IgbW9kZWwgIiArIGV4cl9jb2xvcl9tb2RlbCArICIgdG8gUkdCIGNvbG9yIG1vZGVsIjsKCQkJCQkJRnJlZUltYWdlX091dHB1dE1lc3NhZ2VQcm9jKHNfZm9ybWF0X2lkLCBtc2cuY19zdHIoKSk7CgkJCQkJCWJIYW5kbGVkID0gdHJ1ZTsKCQkJCQl9CgkJCQl9CgkJCQlpZighYkhhbmRsZWQpIHsKCQkJCQlUSFJPVyAoSWV4OjpJbnB1dEV4YywgIlVuYWJsZSB0byBoYW5kbGUgbWl4ZWQgY29tcG9uZW50IHR5cGVzIChjb2xvciBtb2RlbCA9ICIgPDwgZXhyX2NvbG9yX21vZGVsIDw8ICIpIik7CgkJCQl9IAoJCQl9CgkJCXN3aXRjaChwaXhlbF90eXBlKSB7CgkJCQljYXNlIEltZjo6VUlOVDoKCQkJCQlUSFJPVyAoSWV4OjpJbnB1dEV4YywgIlVuc3VwcG9ydGVkIGZvcm1hdDogVUlOVCIpOwoJCQkJCWJyZWFrOwoJCQkJY2FzZSBJbWY6OkhBTEY6CgkJCQljYXNlIEltZjo6RkxPQVQ6CgkJCQlkZWZhdWx0OgoJCQkJCWJyZWFrOwoJCQl9CgkJCS8vIGNoZWNrIGZvciBzdXBwb3J0ZWQgaW1hZ2UgY29sb3IgbW9kZWxzCgkJCWlmKChjb21wb25lbnRzID09IDEpIHx8IChjb21wb25lbnRzID09IDIpKSB7CQkJCQoJCQkJLy8gaWYgdGhlIGltYWdlIGlzIGdyYXktYWxwaGEgKFlBKSwgaWdub3JlIHRoZSBhbHBoYSBjaGFubmVsCgkJCQlpZihjaGFubmVscy5maW5kQ2hhbm5lbCgiWSIpKSB7CgkJCQkJaW1hZ2VfdHlwZSA9IEZJVF9GTE9BVDsKCQkJCQljb21wb25lbnRzID0gMTsKCQkJCX0gZWxzZSBpZihjb21wb25lbnRzID09IDEpIHsKCQkJCQlzdGQ6OnN0cmluZyBtc2cgPSAiV2FybmluZzogbG9hZGluZyBjb2xvciBtb2RlbCAiICsgZXhyX2NvbG9yX21vZGVsICsgIiBhcyBZIGNvbG9yIG1vZGVsIjsKCQkJCQlGcmVlSW1hZ2VfT3V0cHV0TWVzc2FnZVByb2Moc19mb3JtYXRfaWQsIG1zZy5jX3N0cigpKTsKCQkJCQlpbWFnZV90eXBlID0gRklUX0ZMT0FUOwoJCQkJfQoJCQl9IGVsc2UgaWYoY29tcG9uZW50cyA9PSAzKSB7CgkJCQlpZihjaGFubmVscy5maW5kQ2hhbm5lbCgiUiIpICYmIGNoYW5uZWxzLmZpbmRDaGFubmVsKCJHIikgJiYgY2hhbm5lbHMuZmluZENoYW5uZWwoIkIiKSkgewoJCQkJCWltYWdlX3R5cGUgPSBGSVRfUkdCRjsKCQkJCX0KCQkJCWVsc2UgaWYoY2hhbm5lbHMuZmluZENoYW5uZWwoIkJZIikgJiYgY2hhbm5lbHMuZmluZENoYW5uZWwoIlJZIikgJiYgY2hhbm5lbHMuZmluZENoYW5uZWwoIlkiKSkgewoJCQkJCWltYWdlX3R5cGUgPSBGSVRfUkdCRjsKCQkJCQliVXNlUmdiYUludGVyZmFjZSA9IHRydWU7CgkJCQl9CgkJCX0gZWxzZSBpZihjb21wb25lbnRzID49IDQpIHsJCQkJCgkJCQlpZihjaGFubmVscy5maW5kQ2hhbm5lbCgiUiIpICYmIGNoYW5uZWxzLmZpbmRDaGFubmVsKCJHIikgJiYgY2hhbm5lbHMuZmluZENoYW5uZWwoIkIiKSAmJiBjaGFubmVscy5maW5kQ2hhbm5lbCgiQSIpKSB7CgkJCQkJaW1hZ2VfdHlwZSA9IEZJVF9SR0JBRjsKCQkJCQkvLyBpZ25vcmUgb3RoZXIgbGF5ZXJzIGlmIHRoZXJlIGlzIG1vcmUgdGhhbiBvbmUgYWxwaGEgbGF5ZXIKCQkJCQljb21wb25lbnRzID0gNDsKCQkJCX0KCQkJfQoJCQlpZihpbWFnZV90eXBlID09IEZJVF9VTktOT1dOKSB7CgkJCQlUSFJPVyAoSWV4OjpJbnB1dEV4YywgIlVuc3VwcG9ydGVkIGNvbG9yIG1vZGVsOiAiIDw8IGV4cl9jb2xvcl9tb2RlbCk7CgkJCX0KCgkJCS8vIGFsbG9jYXRlIGEgbmV3IGRpYgoJCQlkaWIgPSBGcmVlSW1hZ2VfQWxsb2NhdGVUKGltYWdlX3R5cGUsIHdpZHRoLCBoZWlnaHQpOwoJCQlpZighZGliKSBUSFJPVyAoSWV4OjpOdWxsRXhjLCBGSV9NU0dfRVJST1JfTUVNT1JZKTsKCgkJCUJZVEUgKmJpdHMgPSBGcmVlSW1hZ2VfR2V0Qml0cyhkaWIpOwkJCS8vIHBvaW50ZXIgdG8gb3VyIHBpeGVsIGJ1ZmZlcgoJCQlzaXplX3QgYnl0ZXNwcCA9IHNpemVvZihmbG9hdCkgKiBjb21wb25lbnRzOwkvLyBzaXplIG9mIG91ciBwaXhlbCBpbiBieXRlcwoJCQl1bnNpZ25lZCBwaXRjaCA9IEZyZWVJbWFnZV9HZXRQaXRjaChkaWIpOwkJLy8gc2l6ZSBvZiBvdXIgeVN0cmlkZSBpbiBieXRlcwoKCQkJSW1mOjpQaXhlbFR5cGUgcGl4ZWxUeXBlID0gSW1mOjpGTE9BVDsJLy8gbG9hZCBhcyBmbG9hdCBkYXRhIHR5cGU7CgkJCQoJCQlpZihiVXNlUmdiYUludGVyZmFjZSkgewoJCQkJLy8gdXNlIHRoZSBSR0JBIGludGVyZmFjZQoKCQkJCWNvbnN0IGludCBjaHVua19zaXplID0gMTY7CgoJCQkJQllURSAqc2NhbmxpbmUgPSAoQllURSopYml0czsKCgkJCQkvLyByZS1vcGVuIHVzaW5nIHRoZSBSR0JBIGludGVyZmFjZQoJCQkJaW8tPnNlZWtfcHJvYyhoYW5kbGUsIHN0cmVhbV9zdGFydCwgU0VFS19TRVQpOwoJCQkJSW1mOjpSZ2JhSW5wdXRGaWxlIHJnYmFGaWxlKGlzdHJlYW0pOwoKCQkJCS8vIHJlYWQgdGhlIGZpbGUgaW4gY2h1bmtzCgkJCQlJbWF0aDo6Qm94MmkgZHcgPSBkYXRhV2luZG93OwoJCQkJSW1mOjpBcnJheTJEPEltZjo6UmdiYT4gY2h1bmsoY2h1bmtfc2l6ZSwgd2lkdGgpOwoJCQkJd2hpbGUgKGR3Lm1pbi55IDw9IGR3Lm1heC55KSB7CgkJCQkJLy8gcmVhZCBhIGNodW5rCgkJCQkJcmdiYUZpbGUuc2V0RnJhbWVCdWZmZXIgKCZjaHVua1swXVswXSAtIGR3Lm1pbi54IC0gZHcubWluLnkgKiB3aWR0aCwgMSwgd2lkdGgpOwoJCQkJCXJnYmFGaWxlLnJlYWRQaXhlbHMgKGR3Lm1pbi55LCBNSU4oZHcubWluLnkgKyBjaHVua19zaXplIC0gMSwgZHcubWF4LnkpKTsKCQkJCQkvLyBmaWxsIHRoZSBkaWIKCQkJCQljb25zdCBpbnQgeV9tYXggPSAoKGR3Lm1heC55IC0gZHcubWluLnkpIDw9IGNodW5rX3NpemUpID8gKGR3Lm1heC55IC0gZHcubWluLnkpIDogY2h1bmtfc2l6ZTsKCQkJCQlmb3IoaW50IHkgPSAwOyB5IDwgeV9tYXg7IHkrKykgewoJCQkJCQlGSVJHQkYgKnBpeGVsID0gKEZJUkdCRiopc2NhbmxpbmU7CgkJCQkJCWNvbnN0IEltZjo6UmdiYSAqaGFsZl9yZ2JhID0gY2h1bmtbeV07CgkJCQkJCWZvcihpbnQgeCA9IDA7IHggPCB3aWR0aDsgeCsrKSB7CgkJCQkJCQkvLyBjb252ZXJ0IGZyb20gaGFsZiB0byBmbG9hdAoJCQkJCQkJcGl4ZWxbeF0ucmVkID0gaGFsZl9yZ2JhW3hdLnI7CgkJCQkJCQlwaXhlbFt4XS5ncmVlbiA9IGhhbGZfcmdiYVt4XS5nOwoJCQkJCQkJcGl4ZWxbeF0uYmx1ZSA9IGhhbGZfcmdiYVt4XS5iOwoJCQkJCQl9CgkJCQkJCS8vIG5leHQgbGluZQoJCQkJCQlzY2FubGluZSArPSBwaXRjaDsKCQkJCQl9CgkJCQkJLy8gbmV4dCBjaHVuawoJCQkJCWR3Lm1pbi55ICs9IGNodW5rX3NpemU7CgkJCQl9CgoJCQl9IGVsc2UgewoJCQkJLy8gdXNlIHRoZSBsb3cgbGV2ZWwgaW50ZXJmYWNlCgoJCQkJLy8gYnVpbGQgYSBmcmFtZSBidWZmZXIgKGkuZS4gd2hhdCB3ZSB3YW50IG9uIG91dHB1dCkKCQkJCUltZjo6RnJhbWVCdWZmZXIgZnJhbWVCdWZmZXI7CgoJCQkJaWYoY29tcG9uZW50cyA9PSAxKSB7CgkJCQkJZnJhbWVCdWZmZXIuaW5zZXJ0ICgiWSIsCS8vIG5hbWUKCQkJCQkJSW1mOjpTbGljZSAocGl4ZWxUeXBlLAkvLyB0eXBlCgkJCQkJCShjaGFyKikoYml0cyksCQkJLy8gYmFzZQoJCQkJCQlieXRlc3BwLAkJCQkvLyB4U3RyaWRlCgkJCQkJCXBpdGNoLAkJCQkJLy8geVN0cmlkZQoJCQkJCQkxLCAxLAkJCQkJLy8geC95IHNhbXBsaW5nCgkJCQkJCTAuMCkpOwkJCQkJLy8gZmlsbFZhbHVlCgkJCQl9IGVsc2UgaWYoKGNvbXBvbmVudHMgPT0gMykgfHwgKGNvbXBvbmVudHMgPT0gNCkpIHsKCQkJCQljb25zdCBjaGFyICpjaGFubmVsX25hbWVbNF0gPSB7ICJSIiwgIkciLCAiQiIsICJBIiB9OwoKCQkJCQlmb3IoaW50IGMgPSAwOyBjIDwgY29tcG9uZW50czsgYysrKSB7CgkJCQkJCWZyYW1lQnVmZmVyLmluc2VydCAoCgkJCQkJCQljaGFubmVsX25hbWVbY10sCQkJCQkvLyBuYW1lCgkJCQkJCQlJbWY6OlNsaWNlIChwaXhlbFR5cGUsCQkJCS8vIHR5cGUKCQkJCQkJCShjaGFyKikoYml0cyArIGMgKiBzaXplb2YoZmxvYXQpKSwJLy8gYmFzZQoJCQkJCQkJYnl0ZXNwcCwJCQkJCQkJLy8geFN0cmlkZQoJCQkJCQkJcGl0Y2gsCQkJCQkJCQkvLyB5U3RyaWRlCgkJCQkJCQkxLCAxLAkJCQkJCQkJLy8geC95IHNhbXBsaW5nCgkJCQkJCQkwLjApKTsJCQkJCQkJCS8vIGZpbGxWYWx1ZQoJCQkJCX0KCQkJCX0KCgkJCQkvLyByZWFkIHRoZSBmaWxlCgkJCQlmaWxlLnNldEZyYW1lQnVmZmVyKGZyYW1lQnVmZmVyKTsKCQkJCWZpbGUucmVhZFBpeGVscyhkYXRhV2luZG93Lm1pbi55LCBkYXRhV2luZG93Lm1heC55KTsKCQkJfQoKCQkJLy8gbGFzdGx5LCBmbGlwIGRpYiBsaW5lcwoJCQlGcmVlSW1hZ2VfRmxpcFZlcnRpY2FsKGRpYik7CgoJCX0KCQljYXRjaChJZXg6OkJhc2VFeGMgJiBlKSB7CgkJCWlmKGRpYiAhPSBOVUxMKSB7CgkJCQlGcmVlSW1hZ2VfVW5sb2FkKGRpYik7CgkJCX0KCQkJRnJlZUltYWdlX091dHB1dE1lc3NhZ2VQcm9jKHNfZm9ybWF0X2lkLCBlLndoYXQoKSk7CgkJCXJldHVybiBOVUxMOwoJCX0KCX0JCgoJcmV0dXJuIGRpYjsKfQoKCi8qKgpTYXZlIHVzaW5nIEVYUl9MQyBjb21wcmVzc2lvbiAod29ya3Mgb25seSB3aXRoIFJHQltBXUYgaW1hZ2VzKQoqLwpzdGF0aWMgQk9PTCAKU2F2ZUFzRVhSX0xDKENfT1N0cmVhbSYgb3N0cmVhbSwgRklCSVRNQVAgKmRpYiwgSW1mOjpIZWFkZXImIGhlYWRlciwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KSB7CglpbnQgeCwgeTsKCUltZjo6UmdiYUNoYW5uZWxzIHJnYmFDaGFubmVsczsKCgl0cnkgewoKCQlGUkVFX0lNQUdFX1RZUEUgaW1hZ2VfdHlwZSA9IEZyZWVJbWFnZV9HZXRJbWFnZVR5cGUoZGliKTsKCgkJLy8gY29udmVydCBmcm9tIGZsb2F0IHRvIGhhbGYKCQlJbWY6OkFycmF5MkQ8SW1mOjpSZ2JhPiBwaXhlbHMoaGVpZ2h0LCB3aWR0aCk7CgkJc3dpdGNoKGltYWdlX3R5cGUpIHsKCQkJY2FzZSBGSVRfUkdCRjoKCQkJCXJnYmFDaGFubmVscyA9IEltZjo6V1JJVEVfWUM7CgkJCQlmb3IoeSA9IDA7IHkgPCBoZWlnaHQ7IHkrKykgewoJCQkJCUZJUkdCRiAqc3JjX2JpdHMgPSAoRklSR0JGKilGcmVlSW1hZ2VfR2V0U2NhbkxpbmUoZGliLCBoZWlnaHQgLSAxIC0geSk7CgkJCQkJZm9yKHggPSAwOyB4IDwgd2lkdGg7IHgrKykgewoJCQkJCQlJbWY6OlJnYmEgJmRzdF9iaXRzID0gcGl4ZWxzW3ldW3hdOwoJCQkJCQlkc3RfYml0cy5yID0gc3JjX2JpdHNbeF0ucmVkOwoJCQkJCQlkc3RfYml0cy5nID0gc3JjX2JpdHNbeF0uZ3JlZW47CgkJCQkJCWRzdF9iaXRzLmIgPSBzcmNfYml0c1t4XS5ibHVlOwoJCQkJCX0KCQkJCX0KCQkJCWJyZWFrOwoJCQljYXNlIEZJVF9SR0JBRjoKCQkJCXJnYmFDaGFubmVscyA9IEltZjo6V1JJVEVfWUNBOwoJCQkJZm9yKHkgPSAwOyB5IDwgaGVpZ2h0OyB5KyspIHsKCQkJCQlGSVJHQkFGICpzcmNfYml0cyA9IChGSVJHQkFGKilGcmVlSW1hZ2VfR2V0U2NhbkxpbmUoZGliLCBoZWlnaHQgLSAxIC0geSk7CgkJCQkJZm9yKHggPSAwOyB4IDwgd2lkdGg7IHgrKykgewoJCQkJCQlJbWY6OlJnYmEgJmRzdF9iaXRzID0gcGl4ZWxzW3ldW3hdOwoJCQkJCQlkc3RfYml0cy5yID0gc3JjX2JpdHNbeF0ucmVkOwoJCQkJCQlkc3RfYml0cy5nID0gc3JjX2JpdHNbeF0uZ3JlZW47CgkJCQkJCWRzdF9iaXRzLmIgPSBzcmNfYml0c1t4XS5ibHVlOwoJCQkJCQlkc3RfYml0cy5hID0gc3JjX2JpdHNbeF0uYWxwaGE7CgkJCQkJfQoJCQkJfQoJCQkJYnJlYWs7CgkJCWRlZmF1bHQ6CgkJCQlUSFJPVyAoSWV4OjpJb0V4YywgIkJhZCBpbWFnZSB0eXBlIik7CgkJCQlicmVhazsKCQl9CgoJCS8vIHdyaXRlIHRoZSBkYXRhCgkJSW1mOjpSZ2JhT3V0cHV0RmlsZSBmaWxlKG9zdHJlYW0sIGhlYWRlciwgcmdiYUNoYW5uZWxzKTsKCQlmaWxlLnNldEZyYW1lQnVmZmVyICgmcGl4ZWxzWzBdWzBdLCAxLCB3aWR0aCk7CgkJZmlsZS53cml0ZVBpeGVscyAoaGVpZ2h0KTsKCgkJcmV0dXJuIFRSVUU7CgoJfSBjYXRjaChJZXg6OkJhc2VFeGMgJiBlKSB7CgkJRnJlZUltYWdlX091dHB1dE1lc3NhZ2VQcm9jKHNfZm9ybWF0X2lkLCBlLndoYXQoKSk7CgoJCXJldHVybiBGQUxTRTsKCX0KCn0KCnN0YXRpYyBCT09MIERMTF9DQUxMQ09OVgpTYXZlKEZyZWVJbWFnZUlPICppbywgRklCSVRNQVAgKmRpYiwgZmlfaGFuZGxlIGhhbmRsZSwgaW50IHBhZ2UsIGludCBmbGFncywgdm9pZCAqZGF0YSkgewoJY29uc3QgY2hhciAqY2hhbm5lbF9uYW1lWzRdID0geyAiUiIsICJHIiwgIkIiLCAiQSIgfTsKCUJPT0wgYklzRmxpcHBlZCA9IEZBTFNFOwoJaGFsZiAqaGFsZkRhdGEgPSBOVUxMOwoKCWlmKCFkaWIgfHwgIWhhbmRsZSkgcmV0dXJuIEZBTFNFOwoKCXRyeSB7CgkJLy8gY2hlY2sgZm9yIEVYUl9MQyBjb21wcmVzc2lvbiBhbmQgdmVyaWZ5IHRoYXQgdGhlIGZvcm1hdCBpcyBSR0IKCQlpZigoZmxhZ3MgJiBFWFJfTEMpID09IEVYUl9MQykgewoJCQlGUkVFX0lNQUdFX1RZUEUgaW1hZ2VfdHlwZSA9IEZyZWVJbWFnZV9HZXRJbWFnZVR5cGUoZGliKTsKCQkJaWYoKChpbWFnZV90eXBlICE9IEZJVF9SR0JGKSAmJiAoaW1hZ2VfdHlwZSAhPSBGSVRfUkdCQUYpKSB8fCAoKGZsYWdzICYgRVhSX0ZMT0FUKSA9PSBFWFJfRkxPQVQpKSB7CgkJCQlUSFJPVyAoSWV4OjpJb0V4YywgIkVYUl9MQyBjb21wcmVzc2lvbiBpcyBvbmx5IGF2YWlsYWJsZSB3aXRoIFJHQltBXUYgaW1hZ2VzIik7CgkJCX0KCQkJaWYoKEZyZWVJbWFnZV9HZXRXaWR0aChkaWIpICUgMikgfHwgKEZyZWVJbWFnZV9HZXRIZWlnaHQoZGliKSAlIDIpKSB7CgkJCQlUSFJPVyAoSWV4OjpJb0V4YywgIkVYUl9MQyBjb21wcmVzc2lvbiBvbmx5IHdvcmtzIHdoZW4gdGhlIHdpZHRoIGFuZCBoZWlnaHQgYXJlIGEgbXVsdGlwbGUgb2YgMiIpOwoJCQl9CgkJfQoKCQkvLyB3cmFwIHRoZSBGcmVlSW1hZ2UgSU8gc3RyZWFtCgkJQ19PU3RyZWFtIG9zdHJlYW0oaW8sIGhhbmRsZSk7CgoJCS8vIGNvbXByZXNzaW9uCgkJSW1mOjpDb21wcmVzc2lvbiBjb21wcmVzczsKCQlpZigoZmxhZ3MgJiBFWFJfTk9ORSkgPT0gRVhSX05PTkUpIHsKCQkJLy8gbm8gY29tcHJlc3Npb24KCQkJY29tcHJlc3MgPSBJbWY6Ok5PX0NPTVBSRVNTSU9OOwoJCX0gZWxzZSBpZigoZmxhZ3MgJiBFWFJfWklQKSA9PSBFWFJfWklQKSB7CgkJCS8vIHpsaWIgY29tcHJlc3Npb24sIGluIGJsb2NrcyBvZiAxNiBzY2FuIGxpbmVzCgkJCWNvbXByZXNzID0gSW1mOjpaSVBfQ09NUFJFU1NJT047CgkJfSBlbHNlIGlmKChmbGFncyAmIEVYUl9QSVopID09IEVYUl9QSVopIHsKCQkJLy8gcGl6LWJhc2VkIHdhdmVsZXQgY29tcHJlc3Npb24KCQkJY29tcHJlc3MgPSBJbWY6OlBJWl9DT01QUkVTU0lPTjsKCQl9IGVsc2UgaWYoKGZsYWdzICYgRVhSX1BYUjI0KSA9PSBFWFJfUFhSMjQpIHsKCQkJLy8gbG9zc3kgMjQtYml0IGZsb2F0IGNvbXByZXNzaW9uCgkJCWNvbXByZXNzID0gSW1mOjpQWFIyNF9DT01QUkVTU0lPTjsKCQl9IGVsc2UgaWYoKGZsYWdzICYgRVhSX0I0NCkgPT0gRVhSX0I0NCkgewoJCQkvLyBsb3NzeSA0NCUgZmxvYXQgY29tcHJlc3Npb24KCQkJY29tcHJlc3MgPSBJbWY6OkI0NF9DT01QUkVTU0lPTjsKCQl9IGVsc2UgewoJCQkvLyBkZWZhdWx0IHZhbHVlCgkJCWNvbXByZXNzID0gSW1mOjpQSVpfQ09NUFJFU1NJT047CgkJfQoKCQkvLyBjcmVhdGUgdGhlIGhlYWRlcgoJCWludCB3aWR0aCAgPSBGcmVlSW1hZ2VfR2V0V2lkdGgoZGliKTsKCQlpbnQgaGVpZ2h0ID0gRnJlZUltYWdlX0dldEhlaWdodChkaWIpOwoJCWludCBkeCA9IDAsIGR5ID0gMDsKCgkJSW1hdGg6OkJveDJpIGRhdGFXaW5kb3cgKEltYXRoOjpWMmkgKDAsIDApLCBJbWF0aDo6VjJpICh3aWR0aCAtIDEsIGhlaWdodCAtIDEpKTsKCQlJbWF0aDo6Qm94MmkgZGlzcGxheVdpbmRvdyAoSW1hdGg6OlYyaSAoLWR4LCAtZHkpLCBJbWF0aDo6VjJpICh3aWR0aCAtIGR4IC0gMSwgaGVpZ2h0IC0gZHkgLSAxKSk7CgoJCUltZjo6SGVhZGVyIGhlYWRlciA9IEltZjo6SGVhZGVyKGRpc3BsYXlXaW5kb3csIGRhdGFXaW5kb3csIDEsIAoJCQlJbWF0aDo6VjJmKDAsMCksIDEsIAoJCQlJbWY6OklOQ1JFQVNJTkdfWSwgY29tcHJlc3MpOyAgICAgICAgCQkKCgkJLy8gY2hlY2sgZm9yIEVYUl9MQyBjb21wcmVzc2lvbgoJCWlmKChmbGFncyAmIEVYUl9MQykgPT0gRVhSX0xDKSB7CgkJCXJldHVybiBTYXZlQXNFWFJfTEMob3N0cmVhbSwgZGliLCBoZWFkZXIsIHdpZHRoLCBoZWlnaHQpOwoJCX0KCgkJLy8gb3V0cHV0IHBpeGVsIHR5cGUKCQlJbWY6OlBpeGVsVHlwZSBwaXhlbFR5cGU7CgkJaWYoKGZsYWdzICYgRVhSX0ZMT0FUKSA9PSBFWFJfRkxPQVQpIHsKCQkJcGl4ZWxUeXBlID0gSW1mOjpGTE9BVDsJLy8gc2F2ZSBhcyBmbG9hdCBkYXRhIHR5cGUKCQl9IGVsc2UgewoJCQkvLyBkZWZhdWx0IHZhbHVlCgkJCXBpeGVsVHlwZSA9IEltZjo6SEFMRjsJLy8gc2F2ZSBhcyBoYWxmIGRhdGEgdHlwZQoJCX0KCgkJLy8gY2hlY2sgdGhlIGRhdGEgdHlwZSBhbmQgbnVtYmVyIG9mIGNoYW5uZWxzCgkJaW50IGNvbXBvbmVudHMgPSAwOwoJCUZSRUVfSU1BR0VfVFlQRSBpbWFnZV90eXBlID0gRnJlZUltYWdlX0dldEltYWdlVHlwZShkaWIpOwoJCXN3aXRjaChpbWFnZV90eXBlKSB7CgkJCWNhc2UgRklUX0ZMT0FUOgoJCQkJY29tcG9uZW50cyA9IDE7CgkJCQkvLyBpbnNlcnQgbHVtaW5hbmNlIGNoYW5uZWwKCQkJCWhlYWRlci5jaGFubmVscygpLmluc2VydCAoIlkiLCBJbWY6OkNoYW5uZWwocGl4ZWxUeXBlKSk7CgkJCQlicmVhazsKCQkJY2FzZSBGSVRfUkdCRjoKCQkJCWNvbXBvbmVudHMgPSAzOwoJCQkJZm9yKGludCBjID0gMDsgYyA8IGNvbXBvbmVudHM7IGMrKykgewoJCQkJCS8vIGluc2VydCBSLCBHIGFuZCBCIGNoYW5uZWxzCgkJCQkJaGVhZGVyLmNoYW5uZWxzKCkuaW5zZXJ0IChjaGFubmVsX25hbWVbY10sIEltZjo6Q2hhbm5lbChwaXhlbFR5cGUpKTsKCQkJCX0KCQkJCWJyZWFrOwoJCQljYXNlIEZJVF9SR0JBRjoKCQkJCWNvbXBvbmVudHMgPSA0OwoJCQkJZm9yKGludCBjID0gMDsgYyA8IGNvbXBvbmVudHM7IGMrKykgewoJCQkJCS8vIGluc2VydCBSLCBHLCBCIGFuZCBBIGNoYW5uZWxzCgkJCQkJaGVhZGVyLmNoYW5uZWxzKCkuaW5zZXJ0IChjaGFubmVsX25hbWVbY10sIEltZjo6Q2hhbm5lbChwaXhlbFR5cGUpKTsKCQkJCX0KCQkJCWJyZWFrOwoJCQlkZWZhdWx0OgoJCQkJVEhST1cgKElleDo6QXJnRXhjLCAiQ2Fubm90IHNhdmU6IGludmFsaWQgZGF0YSB0eXBlLlxuQ29udmVydCB0aGUgaW1hZ2UgdG8gZmxvYXQgYmVmb3JlIHNhdmluZyBhcyBPcGVuRVhSLiIpOwoJCX0KCgkJLy8gYnVpbGQgYSBmcmFtZSBidWZmZXIgKGkuZS4gd2hhdCB3ZSBoYXZlIG9uIGlucHV0KQoJCUltZjo6RnJhbWVCdWZmZXIgZnJhbWVCdWZmZXI7CgoJCUJZVEUgKmJpdHMgPSBOVUxMOwkvLyBwb2ludGVyIHRvIG91ciBwaXhlbCBidWZmZXIKCQlzaXplX3QgYnl0ZXNwcCA9IDA7CS8vIHNpemUgb2Ygb3VyIHBpeGVsIGluIGJ5dGVzCgkJc2l6ZV90IGJ5dGVzcGMgPSAwOwkvLyBzaXplIG9mIG91ciBwaXhlbCBjb21wb25lbnQgaW4gYnl0ZXMKCQl1bnNpZ25lZCBwaXRjaCA9IDA7CS8vIHNpemUgb2Ygb3VyIHlTdHJpZGUgaW4gYnl0ZXMKCgoJCWlmKHBpeGVsVHlwZSA9PSBJbWY6OkhBTEYpIHsKCQkJLy8gY29udmVydCBmcm9tIGZsb2F0IHRvIGhhbGYKCQkJaGFsZkRhdGEgPSBuZXcgaGFsZlt3aWR0aCAqIGhlaWdodCAqIGNvbXBvbmVudHNdOwoJCQlpZighaGFsZkRhdGEpIFRIUk9XIChJZXg6Ok51bGxFeGMsIEZJX01TR19FUlJPUl9NRU1PUlkpOwoJCQlmb3IoaW50IHkgPSAwOyB5IDwgaGVpZ2h0OyB5KyspIHsKCQkJCWZsb2F0ICpzcmNfYml0cyA9IChmbG9hdCopRnJlZUltYWdlX0dldFNjYW5MaW5lKGRpYiwgaGVpZ2h0IC0gMSAtIHkpOwoJCQkJaGFsZiAqZHN0X2JpdHMgPSBoYWxmRGF0YSArIHkgKiB3aWR0aCAqIGNvbXBvbmVudHM7CgkJCQlmb3IoaW50IHggPSAwOyB4IDwgd2lkdGg7IHgrKykgewoJCQkJCWZvcihpbnQgYyA9IDA7IGMgPCBjb21wb25lbnRzOyBjKyspIHsKCQkJCQkJZHN0X2JpdHNbY10gPSBzcmNfYml0c1tjXTsKCQkJCQl9CgkJCQkJc3JjX2JpdHMgKz0gY29tcG9uZW50czsKCQkJCQlkc3RfYml0cyArPSBjb21wb25lbnRzOwoJCQkJfQoJCQl9CgkJCWJpdHMgPSAoQllURSopaGFsZkRhdGE7CgkJCWJ5dGVzcGMgPSBzaXplb2YoaGFsZik7CgkJCWJ5dGVzcHAgPSBzaXplb2YoaGFsZikgKiBjb21wb25lbnRzOwoJCQlwaXRjaCA9IHNpemVvZihoYWxmKSAqIHdpZHRoICogY29tcG9uZW50czsKCQl9IGVsc2UgaWYocGl4ZWxUeXBlID09IEltZjo6RkxPQVQpIHsKCQkJLy8gaW52ZXJ0IGRpYiBzY2FubGluZXMKCQkJYklzRmxpcHBlZCA9IEZyZWVJbWFnZV9GbGlwVmVydGljYWwoZGliKTsKCQkKCQkJYml0cyA9IEZyZWVJbWFnZV9HZXRCaXRzKGRpYik7CgkJCWJ5dGVzcGMgPSBzaXplb2YoZmxvYXQpOwoJCQlieXRlc3BwID0gc2l6ZW9mKGZsb2F0KSAqIGNvbXBvbmVudHM7CgkJCXBpdGNoID0gRnJlZUltYWdlX0dldFBpdGNoKGRpYik7CgkJfQoKCQlpZihpbWFnZV90eXBlID09IEZJVF9GTE9BVCkgewoJCQlmcmFtZUJ1ZmZlci5pbnNlcnQgKCJZIiwJLy8gbmFtZQoJCQkJSW1mOjpTbGljZSAocGl4ZWxUeXBlLAkvLyB0eXBlCgkJCQkoY2hhciopKGJpdHMpLAkJCS8vIGJhc2UKCQkJCWJ5dGVzcHAsCQkJCS8vIHhTdHJpZGUKCQkJCXBpdGNoKSk7CQkJCS8vIHlTdHJpZGUKCQl9IGVsc2UgaWYoKGltYWdlX3R5cGUgPT0gRklUX1JHQkYpIHx8IChpbWFnZV90eXBlID09IEZJVF9SR0JBRikpIHsJCQkKCQkJZm9yKGludCBjID0gMDsgYyA8IGNvbXBvbmVudHM7IGMrKykgewoJCQkJY2hhciAqY2hhbm5lbF9iYXNlID0gKGNoYXIqKShiaXRzKSArIGMqYnl0ZXNwYzsKCQkJCWZyYW1lQnVmZmVyLmluc2VydCAoY2hhbm5lbF9uYW1lW2NdLC8vIG5hbWUKCQkJCQlJbWY6OlNsaWNlIChwaXhlbFR5cGUsCQkJLy8gdHlwZQoJCQkJCWNoYW5uZWxfYmFzZSwJCQkJCS8vIGJhc2UKCQkJCQlieXRlc3BwLAkvLyB4U3RyaWRlCgkJCQkJcGl0Y2gpKTsJLy8geVN0cmlkZQoJCQl9CgkJfQoKCQkvLyB3cml0ZSB0aGUgZGF0YQoJCUltZjo6T3V0cHV0RmlsZSBmaWxlIChvc3RyZWFtLCBoZWFkZXIpOwoJCWZpbGUuc2V0RnJhbWVCdWZmZXIgKGZyYW1lQnVmZmVyKTsKCQlmaWxlLndyaXRlUGl4ZWxzIChoZWlnaHQpOwoKCQlpZihoYWxmRGF0YSAhPSBOVUxMKSBkZWxldGVbXSBoYWxmRGF0YTsKCQlpZihiSXNGbGlwcGVkKSB7CgkJCS8vIGludmVydCBkaWIgc2NhbmxpbmVzCgkJCUZyZWVJbWFnZV9GbGlwVmVydGljYWwoZGliKTsKCQl9CgoJCXJldHVybiBUUlVFOwoKCX0gY2F0Y2goSWV4OjpCYXNlRXhjICYgZSkgewoJCWlmKGhhbGZEYXRhICE9IE5VTEwpIGRlbGV0ZVtdIGhhbGZEYXRhOwoJCWlmKGJJc0ZsaXBwZWQpIHsKCQkJLy8gaW52ZXJ0IGRpYiBzY2FubGluZXMKCQkJRnJlZUltYWdlX0ZsaXBWZXJ0aWNhbChkaWIpOwoJCX0KCgkJRnJlZUltYWdlX091dHB1dE1lc3NhZ2VQcm9jKHNfZm9ybWF0X2lkLCBlLndoYXQoKSk7CgoJCXJldHVybiBGQUxTRTsKCX0JCn0KCi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLy8gICBJbml0Ci8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCnZvaWQgRExMX0NBTExDT05WCkluaXRFWFIoUGx1Z2luICpwbHVnaW4sIGludCBmb3JtYXRfaWQpIHsKCXNfZm9ybWF0X2lkID0gZm9ybWF0X2lkOwoKCXBsdWdpbi0+Zm9ybWF0X3Byb2MgPSBGb3JtYXQ7CglwbHVnaW4tPmRlc2NyaXB0aW9uX3Byb2MgPSBEZXNjcmlwdGlvbjsKCXBsdWdpbi0+ZXh0ZW5zaW9uX3Byb2MgPSBFeHRlbnNpb247CglwbHVnaW4tPnJlZ2V4cHJfcHJvYyA9IFJlZ0V4cHI7CglwbHVnaW4tPm9wZW5fcHJvYyA9IE5VTEw7CglwbHVnaW4tPmNsb3NlX3Byb2MgPSBOVUxMOwoJcGx1Z2luLT5wYWdlY291bnRfcHJvYyA9IE5VTEw7CglwbHVnaW4tPnBhZ2VjYXBhYmlsaXR5X3Byb2MgPSBOVUxMOwoJcGx1Z2luLT5sb2FkX3Byb2MgPSBMb2FkOwoJcGx1Z2luLT5zYXZlX3Byb2MgPSBTYXZlOwoJcGx1Z2luLT52YWxpZGF0ZV9wcm9jID0gVmFsaWRhdGU7CglwbHVnaW4tPm1pbWVfcHJvYyA9IE1pbWVUeXBlOwoJcGx1Z2luLT5zdXBwb3J0c19leHBvcnRfYnBwX3Byb2MgPSBTdXBwb3J0c0V4cG9ydERlcHRoOwoJcGx1Z2luLT5zdXBwb3J0c19leHBvcnRfdHlwZV9wcm9jID0gU3VwcG9ydHNFeHBvcnRUeXBlOwoJcGx1Z2luLT5zdXBwb3J0c19pY2NfcHJvZmlsZXNfcHJvYyA9IE5VTEw7Cn0KI2VuZGlmCg==