LyogR1NTQVBJL2tyYjUgc3VwcG9ydCBmb3IgRlRQIC0gbG9vc2VseSBiYXNlZCBvbiBvbGQga3JiNC5jCiAqCiAqIENvcHlyaWdodCAoYykgMTk5NSwgMTk5NiwgMTk5NywgMTk5OCwgMTk5OSBLdW5nbGlnYSBUZWtuaXNrYSBI9mdza29sYW4KICogKFJveWFsIEluc3RpdHV0ZSBvZiBUZWNobm9sb2d5LCBTdG9ja2hvbG0sIFN3ZWRlbikuCiAqIENvcHlyaWdodCAoYykgMjAwNCAtIDIwMTIgRGFuaWVsIFN0ZW5iZXJnCiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAqCiAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAogKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKICogYXJlIG1ldDoKICoKICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgogKgogKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAogKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCiAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCiAqCiAqIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIEluc3RpdHV0ZSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMKICogICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCiAqICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgogKgogKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBJTlNUSVRVVEUgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECiAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQogKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQogKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBJTlNUSVRVVEUgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQogKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAogKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUwogKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQogKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCiAqIFNVQ0ggREFNQUdFLiAgKi8KCiNpbmNsdWRlICJjdXJsX3NldHVwLmgiCgojaWZuZGVmIENVUkxfRElTQUJMRV9GVFAKI2lmZGVmIEhBVkVfR1NTQVBJCgojaWZkZWYgSEFWRV9PTERfR1NTTUlUCiNkZWZpbmUgR1NTX0NfTlRfSE9TVEJBU0VEX1NFUlZJQ0UgZ3NzX250X3NlcnZpY2VfbmFtZQojZGVmaW5lIE5DT01QQVQgMQojZW5kaWYKCiNpZmRlZiBIQVZFX05FVERCX0gKI2luY2x1ZGUgPG5ldGRiLmg+CiNlbmRpZgoKI2luY2x1ZGUgInVybGRhdGEuaCIKI2luY2x1ZGUgImN1cmxfYmFzZTY0LmgiCiNpbmNsdWRlICJmdHAuaCIKI2luY2x1ZGUgImN1cmxfZ3NzYXBpLmgiCiNpbmNsdWRlICJzZW5kZi5oIgojaW5jbHVkZSAia3JiNC5oIgojaW5jbHVkZSAiY3VybF9tZW1vcnkuaCIKI2luY2x1ZGUgIndhcm5sZXNzLmgiCgojZGVmaW5lIF9NUFJJTlRGX1JFUExBQ0UgLyogdXNlIG91ciBmdW5jdGlvbnMgb25seSAqLwojaW5jbHVkZSA8Y3VybC9tcHJpbnRmLmg+CgovKiBUaGUgbGFzdCAjaW5jbHVkZSBmaWxlIHNob3VsZCBiZTogKi8KI2luY2x1ZGUgIm1lbWRlYnVnLmgiCgojZGVmaW5lIExPQ0FMX0FERFIgKCZjb25uLT5sb2NhbF9hZGRyKQojZGVmaW5lIFJFTU9URV9BRERSIGNvbm4tPmlwX2FkZHItPmFpX2FkZHIKCnN0YXRpYyBpbnQKa3JiNV9pbml0KHZvaWQgKmFwcF9kYXRhKQp7CiAgZ3NzX2N0eF9pZF90ICpjb250ZXh0ID0gYXBwX2RhdGE7CiAgLyogTWFrZSBzdXJlIG91ciBjb250ZXh0IGlzIGluaXRpYWxpemVkIGZvciBrcmI1X2VuZC4gKi8KICAqY29udGV4dCA9IEdTU19DX05PX0NPTlRFWFQ7CiAgcmV0dXJuIDA7Cn0KCnN0YXRpYyBpbnQKa3JiNV9jaGVja19wcm90KHZvaWQgKmFwcF9kYXRhLCBpbnQgbGV2ZWwpCnsKICAodm9pZClhcHBfZGF0YTsgLyogdW51c2VkICovCiAgaWYobGV2ZWwgPT0gUFJPVF9DT05GSURFTlRJQUwpCiAgICByZXR1cm4gLTE7CiAgcmV0dXJuIDA7Cn0KCnN0YXRpYyBpbnQKa3JiNV9kZWNvZGUodm9pZCAqYXBwX2RhdGEsIHZvaWQgKmJ1ZiwgaW50IGxlbiwKICAgICAgICAgICAgaW50IGxldmVsIFVOVVNFRF9QQVJBTSwKICAgICAgICAgICAgc3RydWN0IGNvbm5lY3RkYXRhICpjb25uIFVOVVNFRF9QQVJBTSkKewogIGdzc19jdHhfaWRfdCAqY29udGV4dCA9IGFwcF9kYXRhOwogIE9NX3VpbnQzMiBtYWosIG1pbjsKICBnc3NfYnVmZmVyX2Rlc2MgZW5jLCBkZWM7CgogICh2b2lkKWxldmVsOwogICh2b2lkKWNvbm47CgogIGVuYy52YWx1ZSA9IGJ1ZjsKICBlbmMubGVuZ3RoID0gbGVuOwogIG1haiA9IGdzc191bnNlYWwoJm1pbiwgKmNvbnRleHQsICZlbmMsICZkZWMsIE5VTEwsIE5VTEwpOwogIGlmKG1haiAhPSBHU1NfU19DT01QTEVURSkgewogICAgaWYobGVuID49IDQpCiAgICAgIHN0cmNweShidWYsICI1OTkgIik7CiAgICByZXR1cm4gLTE7CiAgfQoKICBtZW1jcHkoYnVmLCBkZWMudmFsdWUsIGRlYy5sZW5ndGgpOwogIGxlbiA9IGN1cmx4X3V6dG9zaShkZWMubGVuZ3RoKTsKICBnc3NfcmVsZWFzZV9idWZmZXIoJm1pbiwgJmRlYyk7CgogIHJldHVybiBsZW47Cn0KCnN0YXRpYyBpbnQKa3JiNV9vdmVyaGVhZCh2b2lkICphcHBfZGF0YSwgaW50IGxldmVsLCBpbnQgbGVuKQp7CiAgLyogbm8gYXJndW1lbnRzIGFyZSB1c2VkICovCiAgKHZvaWQpYXBwX2RhdGE7CiAgKHZvaWQpbGV2ZWw7CiAgKHZvaWQpbGVuOwogIHJldHVybiAwOwp9CgpzdGF0aWMgaW50CmtyYjVfZW5jb2RlKHZvaWQgKmFwcF9kYXRhLCBjb25zdCB2b2lkICpmcm9tLCBpbnQgbGVuZ3RoLCBpbnQgbGV2ZWwsIHZvaWQgKip0bywKICAgICAgICAgICAgc3RydWN0IGNvbm5lY3RkYXRhICpjb25uIFVOVVNFRF9QQVJBTSkKewogIGdzc19jdHhfaWRfdCAqY29udGV4dCA9IGFwcF9kYXRhOwogIGdzc19idWZmZXJfZGVzYyBkZWMsIGVuYzsKICBPTV91aW50MzIgbWFqLCBtaW47CiAgaW50IHN0YXRlOwogIGludCBsZW47CgogIC8qIHNodXQgZ2NjIHVwICovCiAgY29ubiA9IE5VTEw7CgogIC8qIE5PVEUgdGhhdCB0aGUgY2FzdCBpcyBzYWZlLCBuZWl0aGVyIG9mIHRoZSBrcmI1LCBnbnUgZ3NzIGFuZCBoZWltZGFsCiAgICogbGlicmFyaWVzIG1vZGlmeSB0aGUgaW5wdXQgYnVmZmVyIGluIGdzc19zZWFsKCkKICAgKi8KICBkZWMudmFsdWUgPSAodm9pZCopZnJvbTsKICBkZWMubGVuZ3RoID0gbGVuZ3RoOwogIG1haiA9IGdzc19zZWFsKCZtaW4sICpjb250ZXh0LAogICAgICAgICAgICAgICAgIGxldmVsID09IFBST1RfUFJJVkFURSwKICAgICAgICAgICAgICAgICBHU1NfQ19RT1BfREVGQVVMVCwKICAgICAgICAgICAgICAgICAmZGVjLCAmc3RhdGUsICZlbmMpOwoKICBpZihtYWogIT0gR1NTX1NfQ09NUExFVEUpCiAgICByZXR1cm4gLTE7CgogIC8qIG1hbGxvYyBhIG5ldyBidWZmZXIsIGluIGNhc2UgZ3NzX3JlbGVhc2VfYnVmZmVyIGRvZXNuJ3Qgd29yayBhcwogICAgIGV4cGVjdGVkICovCiAgKnRvID0gbWFsbG9jKGVuYy5sZW5ndGgpOwogIGlmKCEqdG8pCiAgICByZXR1cm4gLTE7CiAgbWVtY3B5KCp0bywgZW5jLnZhbHVlLCBlbmMubGVuZ3RoKTsKICBsZW4gPSBjdXJseF91enRvc2koZW5jLmxlbmd0aCk7CiAgZ3NzX3JlbGVhc2VfYnVmZmVyKCZtaW4sICZlbmMpOwogIHJldHVybiBsZW47Cn0KCnN0YXRpYyBpbnQKa3JiNV9hdXRoKHZvaWQgKmFwcF9kYXRhLCBzdHJ1Y3QgY29ubmVjdGRhdGEgKmNvbm4pCnsKICBpbnQgcmV0ID0gQVVUSF9PSzsKICBjaGFyICpwOwogIGNvbnN0IGNoYXIgKmhvc3QgPSBjb25uLT5ob3N0Lm5hbWU7CiAgc3NpemVfdCBucmVhZDsKICBjdXJsX3NvY2tsZW5fdCBsID0gc2l6ZW9mKGNvbm4tPmxvY2FsX2FkZHIpOwogIHN0cnVjdCBTZXNzaW9uSGFuZGxlICpkYXRhID0gY29ubi0+ZGF0YTsKICBDVVJMY29kZSByZXN1bHQ7CiAgY29uc3QgY2hhciAqc2VydmljZSA9ICJmdHAiLCAqc3J2X2hvc3QgPSAiaG9zdCI7CiAgZ3NzX2J1ZmZlcl9kZXNjIGlucHV0X2J1ZmZlciwgb3V0cHV0X2J1ZmZlciwgX2dzc3Jlc3AsICpnc3NyZXNwOwogIE9NX3VpbnQzMiBtYWosIG1pbjsKICBnc3NfbmFtZV90IGdzc25hbWU7CiAgZ3NzX2N0eF9pZF90ICpjb250ZXh0ID0gYXBwX2RhdGE7CiAgc3RydWN0IGdzc19jaGFubmVsX2JpbmRpbmdzX3N0cnVjdCBjaGFuOwogIHNpemVfdCBiYXNlNjRfc3ogPSAwOwoKICBpZihnZXRzb2NrbmFtZShjb25uLT5zb2NrW0ZJUlNUU09DS0VUXSwKICAgICAgICAgICAgICAgICAoc3RydWN0IHNvY2thZGRyICopTE9DQUxfQUREUiwgJmwpIDwgMCkKICAgIHBlcnJvcigiZ2V0c29ja25hbWUoKSIpOwoKICBjaGFuLmluaXRpYXRvcl9hZGRydHlwZSA9IEdTU19DX0FGX0lORVQ7CiAgY2hhbi5pbml0aWF0b3JfYWRkcmVzcy5sZW5ndGggPSBsIC0gNDsKICBjaGFuLmluaXRpYXRvcl9hZGRyZXNzLnZhbHVlID0KICAgICYoKHN0cnVjdCBzb2NrYWRkcl9pbiAqKUxPQ0FMX0FERFIpLT5zaW5fYWRkci5zX2FkZHI7CiAgY2hhbi5hY2NlcHRvcl9hZGRydHlwZSA9IEdTU19DX0FGX0lORVQ7CiAgY2hhbi5hY2NlcHRvcl9hZGRyZXNzLmxlbmd0aCA9IGwgLSA0OwogIGNoYW4uYWNjZXB0b3JfYWRkcmVzcy52YWx1ZSA9CiAgICAmKChzdHJ1Y3Qgc29ja2FkZHJfaW4gKilSRU1PVEVfQUREUiktPnNpbl9hZGRyLnNfYWRkcjsKICBjaGFuLmFwcGxpY2F0aW9uX2RhdGEubGVuZ3RoID0gMDsKICBjaGFuLmFwcGxpY2F0aW9uX2RhdGEudmFsdWUgPSBOVUxMOwoKICAvKiB0aGlzIGxvb3Agd2lsbCBleGVjdXRlIHR3aWNlIChvbmNlIGZvciBzZXJ2aWNlLCBvbmNlIGZvciBob3N0KSAqLwogIGZvcig7OykgewogICAgLyogdGhpcyByZWFsbHkgc2hvdWxkbid0IGJlIHJlcGVhdGVkIGhlcmUsIGJ1dCBjYW4ndCBoZWxwIGl0ICovCiAgICBpZihzZXJ2aWNlID09IHNydl9ob3N0KSB7CiAgICAgIHJlc3VsdCA9IEN1cmxfZnRwc2VuZGYoY29ubiwgIkFVVEggR1NTQVBJIik7CgogICAgICBpZihyZXN1bHQpCiAgICAgICAgcmV0dXJuIC0yOwogICAgICBpZihDdXJsX0dldEZUUFJlc3BvbnNlKCZucmVhZCwgY29ubiwgTlVMTCkpCiAgICAgICAgcmV0dXJuIC0xOwoKICAgICAgaWYoZGF0YS0+c3RhdGUuYnVmZmVyWzBdICE9ICczJykKICAgICAgICByZXR1cm4gLTE7CiAgICB9CgogICAgaW5wdXRfYnVmZmVyLnZhbHVlID0gZGF0YS0+c3RhdGUuYnVmZmVyOwogICAgaW5wdXRfYnVmZmVyLmxlbmd0aCA9IHNucHJpbnRmKGlucHV0X2J1ZmZlci52YWx1ZSwgQlVGU0laRSwgIiVzQCVzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlLCBob3N0KTsKICAgIG1haiA9IGdzc19pbXBvcnRfbmFtZSgmbWluLCAmaW5wdXRfYnVmZmVyLCBHU1NfQ19OVF9IT1NUQkFTRURfU0VSVklDRSwKICAgICAgICAgICAgICAgICAgICAgICAgICAmZ3NzbmFtZSk7CiAgICBpZihtYWogIT0gR1NTX1NfQ09NUExFVEUpIHsKICAgICAgZ3NzX3JlbGVhc2VfbmFtZSgmbWluLCAmZ3NzbmFtZSk7CiAgICAgIGlmKHNlcnZpY2UgPT0gc3J2X2hvc3QpIHsKICAgICAgICBDdXJsX2ZhaWxmKGRhdGEsICJFcnJvciBpbXBvcnRpbmcgc2VydmljZSBuYW1lICVzIiwKICAgICAgICAgICAgICAgICAgIGlucHV0X2J1ZmZlci52YWx1ZSk7CiAgICAgICAgcmV0dXJuIEFVVEhfRVJST1I7CiAgICAgIH0KICAgICAgc2VydmljZSA9IHNydl9ob3N0OwogICAgICBjb250aW51ZTsKICAgIH0KICAgIC8qIFdlIHBhc3MgTlVMTCBhcyB8b3V0cHV0X25hbWVfdHlwZXwgdG8gYXZvaWQgYSBsZWFrLiAqLwogICAgZ3NzX2Rpc3BsYXlfbmFtZSgmbWluLCBnc3NuYW1lLCAmb3V0cHV0X2J1ZmZlciwgTlVMTCk7CiAgICBDdXJsX2luZm9mKGRhdGEsICJUcnlpbmcgYWdhaW5zdCAlc1xuIiwgb3V0cHV0X2J1ZmZlci52YWx1ZSk7CiAgICBnc3NyZXNwID0gR1NTX0NfTk9fQlVGRkVSOwogICAgKmNvbnRleHQgPSBHU1NfQ19OT19DT05URVhUOwoKICAgIGRvIHsKICAgICAgLyogUmVsZWFzZSB0aGUgYnVmZmVyIGF0IGVhY2ggaXRlcmF0aW9uIHRvIGF2b2lkIGxlYWtpbmc6IHRoZSBmaXJzdCB0aW1lCiAgICAgICAgIHdlIGFyZSByZWxlYXNpbmcgdGhlIG1lbW9yeSBmcm9tIGdzc19kaXNwbGF5X25hbWUuIFRoZSBsYXN0IGl0ZW0gaXMKICAgICAgICAgdGFrZW4gY2FyZSBieSBhIGZpbmFsIGdzc19yZWxlYXNlX2J1ZmZlci4gKi8KICAgICAgZ3NzX3JlbGVhc2VfYnVmZmVyKCZtaW4sICZvdXRwdXRfYnVmZmVyKTsKICAgICAgcmV0ID0gQVVUSF9PSzsKICAgICAgbWFqID0gQ3VybF9nc3NfaW5pdF9zZWNfY29udGV4dChkYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtaW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnc3NuYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjaGFuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdzc3Jlc3AsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dHB1dF9idWZmZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CgogICAgICBpZihnc3NyZXNwKSB7CiAgICAgICAgZnJlZShfZ3NzcmVzcC52YWx1ZSk7CiAgICAgICAgZ3NzcmVzcCA9IE5VTEw7CiAgICAgIH0KCiAgICAgIGlmKEdTU19FUlJPUihtYWopKSB7CiAgICAgICAgQ3VybF9pbmZvZihkYXRhLCAiRXJyb3IgY3JlYXRpbmcgc2VjdXJpdHkgY29udGV4dFxuIik7CiAgICAgICAgcmV0ID0gQVVUSF9FUlJPUjsKICAgICAgICBicmVhazsKICAgICAgfQoKICAgICAgaWYob3V0cHV0X2J1ZmZlci5sZW5ndGggIT0gMCkgewogICAgICAgIHJlc3VsdCA9IEN1cmxfYmFzZTY0X2VuY29kZShkYXRhLCAoY2hhciAqKW91dHB1dF9idWZmZXIudmFsdWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dF9idWZmZXIubGVuZ3RoLCAmcCwgJmJhc2U2NF9zeik7CiAgICAgICAgaWYocmVzdWx0KSB7CiAgICAgICAgICBDdXJsX2luZm9mKGRhdGEsImJhc2U2NC1lbmNvZGluZzogJXNcbiIsIGN1cmxfZWFzeV9zdHJlcnJvcihyZXN1bHQpKTsKICAgICAgICAgIHJldCA9IEFVVEhfQ09OVElOVUU7CiAgICAgICAgICBicmVhazsKICAgICAgICB9CgogICAgICAgIHJlc3VsdCA9IEN1cmxfZnRwc2VuZGYoY29ubiwgIkFEQVQgJXMiLCBwKTsKCiAgICAgICAgZnJlZShwKTsKCiAgICAgICAgaWYocmVzdWx0KSB7CiAgICAgICAgICByZXQgPSAtMjsKICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KCiAgICAgICAgaWYoQ3VybF9HZXRGVFBSZXNwb25zZSgmbnJlYWQsIGNvbm4sIE5VTEwpKSB7CiAgICAgICAgICByZXQgPSAtMTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KCiAgICAgICAgaWYoZGF0YS0+c3RhdGUuYnVmZmVyWzBdICE9ICcyJyAmJiBkYXRhLT5zdGF0ZS5idWZmZXJbMF0gIT0gJzMnKSB7CiAgICAgICAgICBDdXJsX2luZm9mKGRhdGEsICJTZXJ2ZXIgZGlkbid0IGFjY2VwdCBhdXRoIGRhdGFcbiIpOwogICAgICAgICAgcmV0ID0gQVVUSF9FUlJPUjsKICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KCiAgICAgICAgcCA9IGRhdGEtPnN0YXRlLmJ1ZmZlciArIDQ7CiAgICAgICAgcCA9IHN0cnN0cihwLCAiQURBVD0iKTsKICAgICAgICBpZihwKSB7CiAgICAgICAgICByZXN1bHQgPSBDdXJsX2Jhc2U2NF9kZWNvZGUocCArIDUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGNoYXIgKiopJl9nc3NyZXNwLnZhbHVlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZfZ3NzcmVzcC5sZW5ndGgpOwogICAgICAgICAgaWYocmVzdWx0KSB7CiAgICAgICAgICAgIEN1cmxfZmFpbGYoZGF0YSwiYmFzZTY0LWRlY29kaW5nOiAlcyIsIGN1cmxfZWFzeV9zdHJlcnJvcihyZXN1bHQpKTsKICAgICAgICAgICAgcmV0ID0gQVVUSF9DT05USU5VRTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBnc3NyZXNwID0gJl9nc3NyZXNwOwogICAgICB9CiAgICB9IHdoaWxlKG1haiA9PSBHU1NfU19DT05USU5VRV9ORUVERUQpOwoKICAgIGdzc19yZWxlYXNlX25hbWUoJm1pbiwgJmdzc25hbWUpOwogICAgZ3NzX3JlbGVhc2VfYnVmZmVyKCZtaW4sICZvdXRwdXRfYnVmZmVyKTsKCiAgICBpZihnc3NyZXNwKQogICAgICBmcmVlKF9nc3NyZXNwLnZhbHVlKTsKCiAgICBpZihyZXQgPT0gQVVUSF9PSyB8fCBzZXJ2aWNlID09IHNydl9ob3N0KQogICAgICByZXR1cm4gcmV0OwoKICAgIHNlcnZpY2UgPSBzcnZfaG9zdDsKICB9CiAgcmV0dXJuIHJldDsKfQoKc3RhdGljIHZvaWQga3JiNV9lbmQodm9pZCAqYXBwX2RhdGEpCnsKICAgIE9NX3VpbnQzMiBtaW47CiAgICBnc3NfY3R4X2lkX3QgKmNvbnRleHQgPSBhcHBfZGF0YTsKICAgIGlmKCpjb250ZXh0ICE9IEdTU19DX05PX0NPTlRFWFQpIHsKI2lmZGVmIERFQlVHQlVJTEQKICAgICAgT01fdWludDMyIG1haiA9CiNlbmRpZgogICAgICBnc3NfZGVsZXRlX3NlY19jb250ZXh0KCZtaW4sIGNvbnRleHQsIEdTU19DX05PX0JVRkZFUik7CiAgICAgIERFQlVHQVNTRVJUKG1haiA9PSBHU1NfU19DT01QTEVURSk7CiAgICB9Cn0KCnN0cnVjdCBDdXJsX3NlY19jbGllbnRfbWVjaCBDdXJsX2tyYjVfY2xpZW50X21lY2ggPSB7CiAgICAiR1NTQVBJIiwKICAgIHNpemVvZihnc3NfY3R4X2lkX3QpLAogICAga3JiNV9pbml0LAogICAga3JiNV9hdXRoLAogICAga3JiNV9lbmQsCiAgICBrcmI1X2NoZWNrX3Byb3QsCiAgICBrcmI1X292ZXJoZWFkLAogICAga3JiNV9lbmNvZGUsCiAgICBrcmI1X2RlY29kZQp9OwoKI2VuZGlmIC8qIEhBVkVfR1NTQVBJICovCiNlbmRpZiAvKiBDVVJMX0RJU0FCTEVfRlRQICovCg==