ZGlmZiAtLWdpdCBhL2puaS9wanByb2plY3QtYW5kcm9pZC8uc3ZuL3ByaXN0aW5lLzA1LzA1MWZlZjg0ODk2ZTc2YzNmNDNjMjdkYWJhODdmZWRhYjUzN2ZhZjUuc3ZuLWJhc2UgYi9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvLnN2bi9wcmlzdGluZS8wNS8wNTFmZWY4NDg5NmU3NmMzZjQzYzI3ZGFiYTg3ZmVkYWI1MzdmYWY1LnN2bi1iYXNlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQyOThhYTMKLS0tIC9kZXYvbnVsbAorKysgYi9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvLnN2bi9wcmlzdGluZS8wNS8wNTFmZWY4NDg5NmU3NmMzZjQzYzI3ZGFiYTg3ZmVkYWI1MzdmYWY1LnN2bi1iYXNlCkBAIC0wLDAgKzEsNzY2IEBACisvKiAkSWQkICovCisvKiAKKyAqIENvcHlyaWdodCAoQykgMjAwOC0yMDExIFRlbHV1IEluYy4gKGh0dHA6Ly93d3cudGVsdXUuY29tKQorICogQ29weXJpZ2h0IChDKSAyMDAzLTIwMDggQmVubnkgUHJpam9ubyA8YmVubnlAcHJpam9uby5vcmc+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQSAKKyAqLworI2luY2x1ZGUgInRlc3QuaCIKKyNpbmNsdWRlIDxwamxpYi11dGlsLmg+CisjaW5jbHVkZSA8cGpsaWIuaD4KKworCisjaWYgSU5DTFVERV9FTkNSWVBUSU9OX1RFU1QKKworLyoKKyAqIEVuY3J5cHRpb24gYWxnb3JpdGhtIHRlc3RzLgorICovCisjZGVmaW5lIFRISVNfRklMRSAgICJlbmNyeXB0aW9uLmMiCisKKworLyoKKyAqIFNIQTEgdGVzdCBmcm9tIHRoZSBvcmlnaW5hbCBzaGExLmMgc291cmNlIGZpbGUuCisgKi8KK3N0YXRpYyBjaGFyICpzaGExX3Rlc3RfZGF0YVtdID0geworICAgICJhYmMiLAorICAgICJhYmNkYmNkZWNkZWZkZWZnZWZnaGZnaGlnaGlqaGlqa2lqa2xqa2xta2xtbmxtbm9tbm9wbm9wcSIsCisgICAgIkEgbWlsbGlvbiByZXBldGl0aW9ucyBvZiAnYSciCit9Oworc3RhdGljIGNoYXIgKnNoYTFfdGVzdF9yZXN1bHRzW10gPSB7CisgICAgIkE5OTkzRTM2IDQ3MDY4MTZBIEJBM0UyNTcxIDc4NTBDMjZDIDlDRDBEODlEIiwKKyAgICAiODQ5ODNFNDQgMUMzQkQyNkUgQkFBRTRBQTEgRjk1MTI5RTUgRTU0NjcwRjEiLAorICAgICIzNEFBOTczQyBENEM0REFBNCBGNjFFRUIyQiBEQkFEMjczMSA2NTM0MDE2RiIKK307CisKKworc3RhdGljIHZvaWQgZGlnZXN0X3RvX2hleChjb25zdCBwal91aW50OF90IGRpZ2VzdFtQSl9TSEExX0RJR0VTVF9TSVpFXSwgCisJCQkgIGNoYXIgKm91dHB1dCkKK3sKKyAgICBpbnQgaSxqOworICAgIGNoYXIgKmMgPSBvdXRwdXQ7CisgICAgCisgICAgZm9yIChpID0gMDsgaSA8IFBKX1NIQTFfRElHRVNUX1NJWkUvNDsgaSsrKSB7CisgICAgICAgIGZvciAoaiA9IDA7IGogPCA0OyBqKyspIHsKKyAgICAgICAgICAgIHNwcmludGYoYywiJTAyWCIsIGRpZ2VzdFtpKjQral0pOworICAgICAgICAgICAgYyArPSAyOworICAgICAgICB9CisgICAgICAgIHNwcmludGYoYywgIiAiKTsKKyAgICAgICAgYyArPSAxOworICAgIH0KKyAgICAqKGMgLSAxKSA9ICdcMCc7Cit9CisKK3N0YXRpYyBpbnQgc2hhMV90ZXN0MSh2b2lkKQoreworICAgIGVudW0geyBNSUxMSU9OID0gMTAwMDAwMCB9OworICAgIGludCBrOworICAgIHBqX3NoYTFfY29udGV4dCBjb250ZXh0OworICAgIHBqX3VpbnQ4X3QgZGlnZXN0WzIwXTsKKyAgICBjaGFyIG91dHB1dFs4MF07CisgICAgcGpfcG9vbF90ICpwb29sOworICAgIHBqX3VpbnQ4X3QgKmJsb2NrOworCisgICAgUEpfTE9HKDMsIChUSElTX0ZJTEUsICIgIFNIQTEgdGVzdCB2ZWN0b3IgMSBmcm9tIHNoYTEuYy4uIikpOworICAgIAorICAgIGZvciAoayA9IDA7IGsgPCAyOyBrKyspeyAKKyAgICAgICAgcGpfc2hhMV9pbml0KCZjb250ZXh0KTsKKyAgICAgICAgcGpfc2hhMV91cGRhdGUoJmNvbnRleHQsIChwal91aW50OF90KilzaGExX3Rlc3RfZGF0YVtrXSwgCisJCSAgICAgICBwal9hbnNpX3N0cmxlbihzaGExX3Rlc3RfZGF0YVtrXSkpOworICAgICAgICBwal9zaGExX2ZpbmFsKCZjb250ZXh0LCBkaWdlc3QpOworCWRpZ2VzdF90b19oZXgoZGlnZXN0LCBvdXRwdXQpOworCisgICAgICAgIGlmIChwal9hbnNpX3N0cmNtcChvdXRwdXQsIHNoYTFfdGVzdF9yZXN1bHRzW2tdKSkgeworCSAgICBQSl9MT0coMywgKFRISVNfRklMRSwgIiAgICBpbmNvcnJlY3QgaGFzaCByZXN1bHQgb24gaz0lZCIsIGspKTsKKyAgICAgICAgICAgIHJldHVybiAtMTA7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBtaWxsaW9uICdhJyB2ZWN0b3Igd2UgZmVlZCBzZXBhcmF0ZWx5ICovCisgICAgcGpfc2hhMV9pbml0KCZjb250ZXh0KTsKKyAgICBmb3IgKGsgPSAwOyBrIDwgTUlMTElPTjsgaysrKQorICAgICAgICBwal9zaGExX3VwZGF0ZSgmY29udGV4dCwgKHBqX3VpbnQ4X3QqKSJhIiwgMSk7CisgICAgcGpfc2hhMV9maW5hbCgmY29udGV4dCwgZGlnZXN0KTsKKyAgICBkaWdlc3RfdG9faGV4KGRpZ2VzdCwgb3V0cHV0KTsKKyAgICBpZiAoc3RyY21wKG91dHB1dCwgc2hhMV90ZXN0X3Jlc3VsdHNbMl0pKSB7CisJUEpfTE9HKDMsIChUSElTX0ZJTEUsICIgICAgaW5jb3JyZWN0IGhhc2ggcmVzdWx0ISIpKTsKKyAgICAgICAgcmV0dXJuIC0yMDsKKyAgICB9CisKKyAgICAvKiBtaWxsaW9uICdhJyB0ZXN0LCB1c2luZyBibG9jayAqLworICAgIHBvb2wgPSBwal9wb29sX2NyZWF0ZShtZW0sICJzaGExdGVzdCIsIDI1NiwgNTEyLCBOVUxMKTsKKyAgICBibG9jayA9IChwal91aW50OF90Kilwal9wb29sX2FsbG9jKHBvb2wsIE1JTExJT04pOworICAgIHBqX21lbXNldChibG9jaywgJ2EnLCBNSUxMSU9OKTsKKworICAgIHBqX3NoYTFfaW5pdCgmY29udGV4dCk7CisgICAgcGpfc2hhMV91cGRhdGUoJmNvbnRleHQsIGJsb2NrLCBNSUxMSU9OKTsKKyAgICBwal9zaGExX2ZpbmFsKCZjb250ZXh0LCBkaWdlc3QpOworICAgIGRpZ2VzdF90b19oZXgoZGlnZXN0LCBvdXRwdXQpOworICAgIGlmIChzdHJjbXAob3V0cHV0LCBzaGExX3Rlc3RfcmVzdWx0c1syXSkpIHsKKwlwal9wb29sX3JlbGVhc2UocG9vbCk7CisJUEpfTE9HKDMsIChUSElTX0ZJTEUsICIgICAgaW5jb3JyZWN0IGhhc2ggcmVzdWx0IGZvciBibG9jayB1cGRhdGUhIikpOworICAgICAgICByZXR1cm4gLTIxOworICAgIH0KKworICAgIC8qIHZlcmlmeSB0aGF0IG9yaWdpbmFsIGJ1ZmZlciB3YXMgbm90IG1vZGlmaWVkICovCisgICAgZm9yIChrPTA7IGs8TUlMTElPTjsgKytrKSB7CisJaWYgKGJsb2NrW2tdICE9ICdhJykgeworCSAgICBwal9wb29sX3JlbGVhc2UocG9vbCk7CisJICAgIFBKX0xPRygzLCAoVEhJU19GSUxFLCAiICAgIGJsb2NrIHdhcyBtb2RpZmllZCEiKSk7CisJICAgIHJldHVybiAtMjI7CisJfQorICAgIH0KKworICAgIHBqX3Bvb2xfcmVsZWFzZShwb29sKTsKKworICAgIC8qIHN1Y2Nlc3MgKi8KKyAgICByZXR1cm4oMCk7Cit9CisKKworLyoKKyAqIFNIQTEgdGVzdCBmcm9tIFJGQyAzMTc0CisgKi8KKy8qCisgKiAgRGVmaW5lIHBhdHRlcm5zIGZvciB0ZXN0aW5nCisgKi8KKyNkZWZpbmUgVEVTVDEgICAiYWJjIgorI2RlZmluZSBURVNUMmEgICJhYmNkYmNkZWNkZWZkZWZnZWZnaGZnaGlnaGlqaGkiCisjZGVmaW5lIFRFU1QyYiAgImpraWprbGprbG1rbG1ubG1ub21ub3Bub3BxIgorI2RlZmluZSBURVNUMiAgIFRFU1QyYSBURVNUMmIKKyNkZWZpbmUgVEVTVDMgICAiYSIKKyNkZWZpbmUgVEVTVDRhICAiMDEyMzQ1NjcwMTIzNDU2NzAxMjM0NTY3MDEyMzQ1NjciCisjZGVmaW5lIFRFU1Q0YiAgIjAxMjM0NTY3MDEyMzQ1NjcwMTIzNDU2NzAxMjM0NTY3IgorICAgIC8qIGFuIGV4YWN0IG11bHRpcGxlIG9mIDUxMiBiaXRzICovCisjZGVmaW5lIFRFU1Q0ICAgVEVTVDRhIFRFU1Q0YgorCitzdGF0aWMgY2hhciAqdGVzdGFycmF5WzRdID0KK3sKKyAgICBURVNUMSwKKyAgICBURVNUMiwKKyAgICBURVNUMywKKyAgICBURVNUNAorfTsKK3N0YXRpYyBpbnQgcmVwZWF0Y291bnRbNF0gPSB7IDEsIDEsIDEwMDAwMDAsIDEwIH07CitzdGF0aWMgY2hhciAqcmVzdWx0YXJyYXlbNF0gPQoreworICAgICJBOTk5M0UzNiA0NzA2ODE2QSBCQTNFMjU3MSA3ODUwQzI2QyA5Q0QwRDg5RCIsCisgICAgIjg0OTgzRTQ0IDFDM0JEMjZFIEJBQUU0QUExIEY5NTEyOUU1IEU1NDY3MEYxIiwKKyAgICAiMzRBQTk3M0MgRDRDNERBQTQgRjYxRUVCMkIgREJBRDI3MzEgNjUzNDAxNkYiLAorICAgICJERUEzNTZBMiBDREREOTBDNyBBN0VDRURDNSBFQkI1NjM5MyA0RjQ2MDQ1MiIKK307CisKK3N0YXRpYyBpbnQgc2hhMV90ZXN0Mih2b2lkKQoreworICAgIHBqX3NoYTFfY29udGV4dCBzaGE7CisgICAgaW50IGk7CisgICAgcGpfdWludDhfdCBkaWdlc3RbMjBdOworICAgIGNoYXIgY2hhcl9kaWdlc3RbNjRdOworCisgICAgUEpfTE9HKDMsIChUSElTX0ZJTEUsICIgIFNIQTEgdGVzdCB2ZWN0b3IgMiBmcm9tIHJmYyAzMTc0Li4iKSk7CisKKyAgICBmb3IoaSA9IDA7IGkgPCA0OyArK2kpIHsKKwlpbnQgajsKKworICAgICAgICBwal9zaGExX2luaXQoJnNoYSk7CisKKyAgICAgICAgZm9yKGogPSAwOyBqIDwgcmVwZWF0Y291bnRbaV07ICsraikgeworICAgICAgICAgICAgcGpfc2hhMV91cGRhdGUoJnNoYSwKKwkJCSAgIChjb25zdCBwal91aW50OF90ICopIHRlc3RhcnJheVtpXSwKKwkJCSAgIHBqX2Fuc2lfc3RybGVuKHRlc3RhcnJheVtpXSkpOworICAgICAgICB9CisKKyAgICAgICAgcGpfc2hhMV9maW5hbCgmc2hhLCBkaWdlc3QpOworCisJZGlnZXN0X3RvX2hleChkaWdlc3QsIGNoYXJfZGlnZXN0KTsKKwlpZiAocGpfYW5zaV9zdHJjbXAoY2hhcl9kaWdlc3QsIHJlc3VsdGFycmF5W2ldKSkgeworCSAgICBQSl9MT0coMywgKFRISVNfRklMRSwgIiAgICBkaWdlc3QgbWlzbWF0Y2ggaW4gdGVzdCAlZCIsIGkpKTsKKwkgICAgcmV0dXJuIC00MDsKKwl9CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKKworLyoKKyAqIEhNQUMtTUQ1IGFuZCBITUFDLVNIQTEgdGVzdCB2ZWN0b3JzIGZyb20gUkZDIDIyMDIKKyAqLworc3RydWN0IHJmYzIyMDJfdGVzdAoreworICAgIGNoYXIgICAgICAgKmtleTsKKyAgICB1bnNpZ25lZAlrZXlfbGVuOworICAgIGNoYXIgICAgICAgKmlucHV0OworICAgIHVuc2lnbmVkCWlucHV0X2xlbjsKKyAgICBjaGFyICAgICAgICptZDVfZGlnZXN0OworICAgIGNoYXIgICAgICAgKnNoYTFfZGlnZXN0OworfTsKKworCitzdHJ1Y3QgcmZjMjIwMl90ZXN0IHJmYzIyMDJfdGVzdF92ZWN0b3JbXSA9IAoreworICAgIHsKKwkiXHgwYlx4MGJceDBiXHgwYlx4MGJceDBiXHgwYlx4MGJceDBiXHgwYlx4MGJceDBiXHgwYlx4MGJceDBiXHgwYiIsCisJMTYsCisJIkhpIFRoZXJlIiwKKwk4LAorCSJceDkyXHg5NFx4NzJceDdhXHgzNlx4MzhceGJiXHgxY1x4MTNceGY0XHg4ZVx4ZjhceDE1XHg4Ylx4ZmNceDlkIiwKKwlOVUxMCisgICAgfSwKKyAgICB7CisJIlx4MGJceDBiXHgwYlx4MGJceDBiXHgwYlx4MGJceDBiXHgwYlx4MGIiCisJIlx4MGJceDBiXHgwYlx4MGJceDBiXHgwYlx4MGJceDBiXHgwYlx4MGIiLAorCTIwLAorCSJIaSBUaGVyZSIsCisJOCwKKwlOVUxMLAorCSJceGI2XHgxN1x4MzFceDg2XHg1NVx4MDVceDcyXHg2NFx4ZTJceDhiXHhjMFx4YjZceGZiXHgzN1x4OGNceDhlXHhmMVx4NDZceGJlXHgwMCIKKyAgICB9LAorICAgIHsKKwkiSmVmZSIsCisJNCwKKwkid2hhdCBkbyB5YSB3YW50IGZvciBub3RoaW5nPyIsCisJMjgsCisJIlx4NzVceDBjXHg3OFx4M2VceDZhXHhiMFx4YjVceDAzXHhlYVx4YThceDZlXHgzMVx4MGFceDVkXHhiN1x4MzgiLAorCSJceGVmXHhmY1x4ZGZceDZhXHhlNVx4ZWJceDJmXHhhMlx4ZDJceDc0XHgxNlx4ZDVceGYxXHg4NFx4ZGZceDljXHgyNVx4OWFceDdjXHg3OSIKKyAgICB9LAorICAgIHsKKwkiXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYSIKKwkiXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhIiwKKwkxNiwKKwkiXHhkZFx4ZGRceGRkXHhkZFx4ZGRceGRkXHhkZFx4ZGRceGRkXHhkZCIKKwkiXHhkZFx4ZGRceGRkXHhkZFx4ZGRceGRkXHhkZFx4ZGRceGRkXHhkZCIKKwkiXHhkZFx4ZGRceGRkXHhkZFx4ZGRceGRkXHhkZFx4ZGRceGRkXHhkZCIKKwkiXHhkZFx4ZGRceGRkXHhkZFx4ZGRceGRkXHhkZFx4ZGRceGRkXHhkZCIKKwkiXHhkZFx4ZGRceGRkXHhkZFx4ZGRceGRkXHhkZFx4ZGRceGRkXHhkZCIsCisJNTAsCisJIlx4NTZceGJlXHgzNFx4NTJceDFkXHgxNFx4NGNceDg4XHhkYlx4YjhceGM3XHgzM1x4ZjBceGU4XHhiM1x4ZjYiLAorCU5VTEwKKyAgICB9LAorICAgIHsKKwkiXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYSIKKwkiXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYSIsCisJMjAsCisJIlx4ZGRceGRkXHhkZFx4ZGRceGRkXHhkZFx4ZGRceGRkXHhkZFx4ZGQiCisJIlx4ZGRceGRkXHhkZFx4ZGRceGRkXHhkZFx4ZGRceGRkXHhkZFx4ZGQiCisJIlx4ZGRceGRkXHhkZFx4ZGRceGRkXHhkZFx4ZGRceGRkXHhkZFx4ZGQiCisJIlx4ZGRceGRkXHhkZFx4ZGRceGRkXHhkZFx4ZGRceGRkXHhkZFx4ZGQiCisJIlx4ZGRceGRkXHhkZFx4ZGRceGRkXHhkZFx4ZGRceGRkXHhkZFx4ZGQiLAorCTUwLAorCU5VTEwsCisJIlx4MTJceDVkXHg3M1x4NDJceGI5XHhhY1x4MTFceGNkXHg5MVx4YTNceDlhXHhmNFx4OGFceGExXHg3Ylx4NGZceDYzXHhmMVx4NzVceGQzIgorICAgIH0sCisgICAgeworCSJceDAxXHgwMlx4MDNceDA0XHgwNVx4MDZceDA3XHgwOFx4MDlceDBhXHgwYlx4MGNceDBkXHgwZVx4MGZceDEwXHgxMVx4MTJceDEzXHgxNFx4MTVceDE2XHgxN1x4MThceDE5IiwKKwkyNSwKKwkiXHhjZFx4Y2RceGNkXHhjZFx4Y2RceGNkXHhjZFx4Y2RceGNkXHhjZCIKKwkiXHhjZFx4Y2RceGNkXHhjZFx4Y2RceGNkXHhjZFx4Y2RceGNkXHhjZCIKKwkiXHhjZFx4Y2RceGNkXHhjZFx4Y2RceGNkXHhjZFx4Y2RceGNkXHhjZCIKKwkiXHhjZFx4Y2RceGNkXHhjZFx4Y2RceGNkXHhjZFx4Y2RceGNkXHhjZCIKKwkiXHhjZFx4Y2RceGNkXHhjZFx4Y2RceGNkXHhjZFx4Y2RceGNkXHhjZCIsCisJNTAsCisJIlx4NjlceDdlXHhhZlx4MGFceGNhXHgzYVx4M2FceGVhXHgzYVx4NzVceDE2XHg0N1x4NDZceGZmXHhhYVx4NzkiLAorCSJceDRjXHg5MFx4MDdceGY0XHgwMlx4NjJceDUwXHhjNlx4YmNceDg0XHgxNFx4ZjlceGJmXHg1MFx4YzhceDZjXHgyZFx4NzJceDM1XHhkYSIKKyAgICB9LAorICAgIHsKKwkiXHgwY1x4MGNceDBjXHgwY1x4MGNceDBjXHgwY1x4MGNceDBjXHgwYyIKKwkiXHgwY1x4MGNceDBjXHgwY1x4MGNceDBjIiwKKwkxNiwKKwkiVGVzdCBXaXRoIFRydW5jYXRpb24iLAorCTIwLAorCSJceDU2XHg0Nlx4MWVceGYyXHgzNFx4MmVceGRjXHgwMFx4ZjlceGJhXHhiOVx4OTVceDY5XHgwZVx4ZmRceDRjIiwKKwlOVUxMCisgICAgfSwKKyAgICB7CisJIlx4MGNceDBjXHgwY1x4MGNceDBjXHgwY1x4MGNceDBjXHgwY1x4MGMiCisJIlx4MGNceDBjXHgwY1x4MGNceDBjXHgwY1x4MGNceDBjXHgwY1x4MGMiLAorCTIwLAorCSJUZXN0IFdpdGggVHJ1bmNhdGlvbiIsCisJMjAsCisJTlVMTCwKKwkiXHg0Y1x4MWFceDAzXHg0Mlx4NGJceDU1XHhlMFx4N2ZceGU3XHhmMlx4N2JceGUxXHhkNVx4OGJceGI5XHgzMlx4NGFceDlhXHg1YVx4MDQiCisgICAgfSwKKyAgICB7CisJIlx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWEiCisJIlx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWEiCisJIlx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWEiCisJIlx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWEiCisJIlx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWEiCisJIlx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWEiCisJIlx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWEiCisJIlx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWEiLAorCTgwLAorCSJUZXN0IFVzaW5nIExhcmdlciBUaGFuIEJsb2NrLVNpemUgS2V5IC0gSGFzaCBLZXkgRmlyc3QiLAorCTU0LAorCSJceDZiXHgxYVx4YjdceGZlXHg0Ylx4ZDdceGJmXHg4Zlx4MGJceDYyXHhlNlx4Y2VceDYxXHhiOVx4ZDBceGNkIiwKKwkiXHhhYVx4NGFceGU1XHhlMVx4NTJceDcyXHhkMFx4MGVceDk1XHg3MFx4NTZceDM3XHhjZVx4OGFceDNiXHg1NVx4ZWRceDQwXHgyMVx4MTIiCisgICAgfSwKKyAgICB7CisJIlx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWEiCisJIlx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWEiCisJIlx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWEiCisJIlx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWEiCisJIlx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWEiCisJIlx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWEiCisJIlx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWEiCisJIlx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWEiLAorCTgwLAorCSJUZXN0IFVzaW5nIExhcmdlciBUaGFuIEJsb2NrLVNpemUgS2V5IGFuZCBMYXJnZXIgVGhhbiBPbmUgQmxvY2stU2l6ZSBEYXRhIiwKKwk3MywKKwkiXHg2Zlx4NjNceDBmXHhhZFx4NjdceGNkXHhhMFx4ZWVceDFmXHhiMVx4ZjVceDYyXHhkYlx4M2FceGE1XHgzZSIsCisJIlx4ZThceGU5XHg5ZFx4MGZceDQ1XHgyM1x4N2RceDc4XHg2ZFx4NmJceGJhXHhhN1x4OTZceDVjXHg3OFx4MDhceGJiXHhmZlx4MWFceDkxIgorICAgIH0KK307CisKKworc3RhdGljIGludCByZmMyMjAyX3Rlc3Qodm9pZCkKK3sKKyAgICB1bnNpZ25lZCBpOworCisgICAgUEpfTE9HKDMsIChUSElTX0ZJTEUsICIgIHZlcmlmeWluZyB0ZXN0IHZlY3RvcnMgZnJvbSByZmMgMjIwMi4uIikpOworCisgICAgLyogVmVyaWZ5IHRoYXQgdGVzdCB2ZWN0b3JzIGFyZSB2YWxpZCAqLworICAgIGZvciAoaT0wOyBpPFBKX0FSUkFZX1NJWkUocmZjMjIwMl90ZXN0X3ZlY3Rvcik7ICsraSkgeworCVBKX0FTU0VSVF9SRVRVUk4ocGpfYW5zaV9zdHJsZW4ocmZjMjIwMl90ZXN0X3ZlY3RvcltpXS5pbnB1dCkgPT0gCisJCQkgICAgcmZjMjIwMl90ZXN0X3ZlY3RvcltpXS5pbnB1dF9sZW4sIC01MCk7CisJUEpfQVNTRVJUX1JFVFVSTihwal9hbnNpX3N0cmxlbihyZmMyMjAyX3Rlc3RfdmVjdG9yW2ldLmtleSkgPT0gCisJCQkgICAgcmZjMjIwMl90ZXN0X3ZlY3RvcltpXS5rZXlfbGVuLCAtNTIpOworCVBKX0FTU0VSVF9SRVRVUk4ocmZjMjIwMl90ZXN0X3ZlY3RvcltpXS5tZDVfZGlnZXN0PT1OVUxMIHx8CisJCQkgICAgcGpfYW5zaV9zdHJsZW4ocmZjMjIwMl90ZXN0X3ZlY3RvcltpXS5tZDVfZGlnZXN0KTw9MTYsCisJCQkgICAgLTU0KTsKKwlQSl9BU1NFUlRfUkVUVVJOKHJmYzIyMDJfdGVzdF92ZWN0b3JbaV0uc2hhMV9kaWdlc3Q9PU5VTEwgfHwKKwkJCSAgICBwal9hbnNpX3N0cmxlbihyZmMyMjAyX3Rlc3RfdmVjdG9yW2ldLnNoYTFfZGlnZXN0KTw9MjAsCisJCQkgICAgLTU2KTsKKyAgICB9CisKKyAgICAvKiBUZXN0IEhNQUMtTUQ1ICovCisgICAgUEpfTE9HKDMsIChUSElTX0ZJTEUsICIgIEhNQUMtTUQ1IHRlc3QgdmVjdG9ycyBmcm9tIHJmYyAyMjAyLi4iKSk7CisgICAgZm9yIChpPTA7IGk8UEpfQVJSQVlfU0laRShyZmMyMjAyX3Rlc3RfdmVjdG9yKTsgKytpKSB7CisJcGpfdWludDhfdCBkaWdlc3RfYnVmWzE4XSwgKmRpZ2VzdDsKKworCWlmIChyZmMyMjAyX3Rlc3RfdmVjdG9yW2ldLm1kNV9kaWdlc3QgPT0gTlVMTCkKKwkgICAgY29udGludWU7CisKKwlkaWdlc3RfYnVmWzBdID0gJ1wwJzsKKwlkaWdlc3RfYnVmWzE3XSA9ICdcMCc7CisKKwlkaWdlc3QgPSBkaWdlc3RfYnVmKzE7CisKKwlwal9obWFjX21kNSgocGpfdWludDhfdCopcmZjMjIwMl90ZXN0X3ZlY3RvcltpXS5pbnB1dCwgCisJCSAgICByZmMyMjAyX3Rlc3RfdmVjdG9yW2ldLmlucHV0X2xlbiwKKwkJICAgIChwal91aW50OF90KilyZmMyMjAyX3Rlc3RfdmVjdG9yW2ldLmtleSwgCisJCSAgICByZmMyMjAyX3Rlc3RfdmVjdG9yW2ldLmtleV9sZW4sCisJCSAgICBkaWdlc3QpOworCisJLyogQ2hlY2sgZm9yIG92ZXJ3cml0ZXMgKi8KKwlpZiAoZGlnZXN0X2J1ZlswXSAhPSAnXDAnIHx8IGRpZ2VzdF9idWZbMTddICE9ICdcMCcpIHsKKwkgICAgUEpfTE9HKDMsIChUSElTX0ZJTEUsICIgICAgZXJyb3I6IG92ZXJ3cml0aW5nIG91dHNpZGUgYnVmZmVyIG9uIHRlc3QgJWQiLCBpKSk7CisJICAgIHJldHVybiAtNjA7CisJfQorCisJLyogQ29tcGFyZSBkaWdlc3QgKi8KKwlpZiAocGpfbWVtY21wKHJmYzIyMDJfdGVzdF92ZWN0b3JbaV0ubWQ1X2RpZ2VzdCwgZGlnZXN0LCAxNikpIHsKKwkgICAgUEpfTE9HKDMsIChUSElTX0ZJTEUsICIgICAgZXJyb3I6IGRpZ2VzdCBtaXNtYXRjaCBvbiB0ZXN0ICVkIiwgaSkpOworCSAgICByZXR1cm4gLTY1OworCX0KKyAgICB9CisKKyAgICAvKiBUZXN0IEhNQUMtU0hBMSAqLworICAgIFBKX0xPRygzLCAoVEhJU19GSUxFLCAiICBITUFDLVNIQTEgdGVzdCB2ZWN0b3JzIGZyb20gcmZjIDIyMDIuLiIpKTsKKyAgICBmb3IgKGk9MDsgaTxQSl9BUlJBWV9TSVpFKHJmYzIyMDJfdGVzdF92ZWN0b3IpOyArK2kpIHsKKwlwal91aW50OF90IGRpZ2VzdF9idWZbMjJdLCAqZGlnZXN0OworCisJaWYgKHJmYzIyMDJfdGVzdF92ZWN0b3JbaV0uc2hhMV9kaWdlc3QgPT0gTlVMTCkKKwkgICAgY29udGludWU7CisKKwlkaWdlc3RfYnVmWzBdID0gJ1wwJzsKKwlkaWdlc3RfYnVmWzIxXSA9ICdcMCc7CisKKwlkaWdlc3QgPSBkaWdlc3RfYnVmKzE7CisKKwlwal9obWFjX3NoYTEoKHBqX3VpbnQ4X3QqKXJmYzIyMDJfdGVzdF92ZWN0b3JbaV0uaW5wdXQsIAorCQkgICAgIHJmYzIyMDJfdGVzdF92ZWN0b3JbaV0uaW5wdXRfbGVuLAorCQkgICAgIChwal91aW50OF90KilyZmMyMjAyX3Rlc3RfdmVjdG9yW2ldLmtleSwgCisJCSAgICAgcmZjMjIwMl90ZXN0X3ZlY3RvcltpXS5rZXlfbGVuLAorCQkgICAgIGRpZ2VzdCk7CisKKwkvKiBDaGVjayBmb3Igb3ZlcndyaXRlcyAqLworCWlmIChkaWdlc3RfYnVmWzBdICE9ICdcMCcgfHwgZGlnZXN0X2J1ZlsyMV0gIT0gJ1wwJykgeworCSAgICBQSl9MT0coMywgKFRISVNfRklMRSwgIiAgICBlcnJvcjogb3ZlcndyaXRpbmcgb3V0c2lkZSBidWZmZXIgb24gdGVzdCAlZCIsIGkpKTsKKwkgICAgcmV0dXJuIC03MDsKKwl9CisKKwkvKiBDb21wYXJlIGRpZ2VzdCAqLworCWlmIChwal9tZW1jbXAocmZjMjIwMl90ZXN0X3ZlY3RvcltpXS5zaGExX2RpZ2VzdCwgZGlnZXN0LCAyMCkpIHsKKwkgICAgUEpfTE9HKDMsIChUSElTX0ZJTEUsICIgICAgZXJyb3I6IGRpZ2VzdCBtaXNtYXRjaCBvbiB0ZXN0ICVkIiwgaSkpOworCSAgICByZXR1cm4gLTc1OworCX0KKyAgICB9CisKKworICAgIC8qIFN1Y2Nlc3MgKi8KKyAgICByZXR1cm4gMDsKK30KKworLyogQ1JDMzIgdGVzdCBkYXRhLCBnZW5lcmF0ZWQgZnJvbSBjcmMzMiB0ZXN0IG9uIGEgTGludXggYm94ICovCitzdHJ1Y3QgY3JjMzJfdGVzdF90Cit7CisgICAgY2hhcgkgICAgKmlucHV0OworICAgIHBqX3VpbnQzMl90CSAgICAgY3JjOworfSBjcmMzMl90ZXN0X2RhdGFbXSA9IAoreworICAgIHsKKwkiIiwKKwkweDAKKyAgICB9LAorICAgIHsKKwkiSGVsbG8gV29ybGQiLAorCTB4NGExN2IxNTYKKyAgICB9LAorICAgIHsKKwkvKiBTb21ldGhpbmcgcmVhZCBmcm9tIC9kZXYvcmFuZG9tICovCisJIlx4MjFceDIxXHg5OFx4MTBceDYyXHg1OVx4YmNceDU4XHg0Mlx4MjRceGU1XHhmM1x4OTJceDBhXHg2OFx4M2NceGE3XHg2N1x4NzNceGMzIiwKKwkweDUwNjY5M2JlCisgICAgfSwKKyAgICB7CisJImFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhIiwKKwkweGNhYjExNzc3CisgICAgfSwKKyAgICB7CisJIjEyMzQ1Njc4OSIsCisJMHhDQkY0MzkyNgorICAgIH0KK307CisKKy8qCisgKiBDUkMzMiB0ZXN0CisgKi8KK3N0YXRpYyBpbnQgY3JjMzJfdGVzdCh2b2lkKQoreworICAgIHVuc2lnbmVkIGk7CisKKyAgICBQSl9MT0coMywgKFRISVNfRklMRSwgIiAgY3JjMzIgdGVzdC4uIikpOworCisgICAgLyogdGVzdGluZyBwal9jcmMzMl9jYWxjICovCisgICAgZm9yIChpPTA7IGk8UEpfQVJSQVlfU0laRShjcmMzMl90ZXN0X2RhdGEpOyArK2kpIHsKKwlwal91aW50MzJfdCBjcmM7CisKKwljcmMgPSBwal9jcmMzMl9jYWxjKChwal91aW50OF90KiljcmMzMl90ZXN0X2RhdGFbaV0uaW5wdXQsCisJCQkgICAgcGpfYW5zaV9zdHJsZW4oY3JjMzJfdGVzdF9kYXRhW2ldLmlucHV0KSk7CisJaWYgKGNyYyAhPSBjcmMzMl90ZXN0X2RhdGFbaV0uY3JjKSB7CisJICAgIFBKX0xPRygzLChUSElTX0ZJTEUsICIgICAgZXJyb3I6IGNyYyBtaXNtYXRjaCBvbiB0ZXN0ICVkIiwgaSkpOworCSAgICByZXR1cm4gLTgwOworCX0KKyAgICB9CisKKyAgICAvKiB0ZXN0aW5nIGluY3JlbWVudGFsIENSQzMyIGNhbGN1bGF0aW9uICovCisgICAgZm9yIChpPTA7IGk8UEpfQVJSQVlfU0laRShjcmMzMl90ZXN0X2RhdGEpOyArK2kpIHsKKwlwal9jcmMzMl9jb250ZXh0IGN0eDsKKwlwal91aW50MzJfdCBjcmMwLCBjcmMxOworCXBqX3NpemVfdCBsZW47CisKKwlsZW4gPSBwal9hbnNpX3N0cmxlbihjcmMzMl90ZXN0X2RhdGFbaV0uaW5wdXQpOworCWNyYzAgPSBwal9jcmMzMl9jYWxjKChwal91aW50OF90KiljcmMzMl90ZXN0X2RhdGFbaV0uaW5wdXQsIGxlbik7CisKKwlwal9jcmMzMl9pbml0KCZjdHgpOworCXBqX2NyYzMyX3VwZGF0ZSgmY3R4LCAocGpfdWludDhfdCopY3JjMzJfdGVzdF9kYXRhW2ldLmlucHV0LAorCQkJbGVuIC8gMik7CisKKwlpZiAobGVuLzIgPiAwKSB7CisJICAgIHBqX2NyYzMyX3VwZGF0ZSgmY3R4LCAocGpfdWludDhfdCopY3JjMzJfdGVzdF9kYXRhW2ldLmlucHV0ICsgbGVuLzIsCisJCQkgICAgbGVuIC0gbGVuLzIpOworCX0KKworCWNyYzEgPSBwal9jcmMzMl9maW5hbCgmY3R4KTsKKworCWlmIChjcmMwICE9IGNyYzEpIHsKKwkgICAgUEpfTE9HKDMsKFRISVNfRklMRSwgCisJCSAgICAgICIgICAgZXJyb3I6IGNyYyBhbGdvcml0aG0gZXJyb3Igb24gdGVzdCAlZCIsIGkpKTsKKwkgICAgcmV0dXJuIC04NTsKKwl9CisKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK2VudW0KK3sKKyAgICBFTkNPREUgPSAxLAorICAgIERFQ09ERSA9IDIsCisgICAgRU5DT0RFX0RFQ09ERSA9IDMKK307CisKKy8qCisgKiBCYXNlNjQgdGVzdCB2ZWN0b3JzIChSRkMgNDY0OCkKKyAqLworc3RhdGljIHN0cnVjdCBiYXNlNjRfdGVzdF92ZWMKK3sKKyAgICBjb25zdCBjaGFyICpiYXNlMjU2OworICAgIGNvbnN0IGNoYXIgKmJhc2U2NDsKKyAgICB1bnNpZ25lZCBmbGFnOworfSBiYXNlNjRfdGVzdF92ZWNbXSA9IAoreworICAgIHsKKwkiIiwKKwkiIiwKKwlFTkNPREVfREVDT0RFCisgICAgfSwKKyAgICB7CisJImYiLAorCSJaZz09IiwKKwlFTkNPREVfREVDT0RFCisgICAgfSwKKyAgICB7CisJImZvIiwKKwkiWm04PSIsCisJRU5DT0RFX0RFQ09ERQorICAgIH0sCisgICAgeworCSJmb28iLAorCSJabTl2IiwKKwlFTkNPREVfREVDT0RFCisgICAgfSwKKyAgICB7CisJImZvb2IiLAorCSJabTl2WWc9PSIsCisJRU5DT0RFX0RFQ09ERQorICAgIH0sCisgICAgeworCSJmb29iYSIsCisJIlptOXZZbUU9IiwKKwlFTkNPREVfREVDT0RFCisgICAgfSwKKyAgICB7CisJImZvb2JhciIsCisJIlptOXZZbUZ5IiwKKwlFTkNPREVfREVDT0RFCisgICAgfSwKKyAgICB7CisJIlx4MTRceGZiXHg5Y1x4MDNceGQ5XHg3ZSIsCisJIkZQdWNBOWwrIiwKKwlFTkNPREVfREVDT0RFCisgICAgfSwKKyAgICB7CisJIlx4MTRceGZiXHg5Y1x4MDNceGQ5IiwKKwkiRlB1Y0E5az0iLAorCUVOQ09ERV9ERUNPREUKKyAgICB9LAorICAgIHsKKwkiXHgxNFx4ZmJceDljXHgwMyIsCisJIkZQdWNBdz09IiwKKwlFTkNPREVfREVDT0RFCisgICAgfSwKKyAgICAvKiB3aXRoIHdoaXRlc3BhY2VzICovCisgICAgeworCSJmb29iYXIiLAorCSJabTl2XHJcblltRnkiLAorCURFQ09ERQorICAgIH0sCisgICAgeworICAgIAkiZm9vYmFyIiwKKyAgICAJIlxuWlxyXG5tIDlcdHZcblltXG5GXG55XG4iLAorICAgIAlERUNPREUKKyAgICB9LAorfTsKKworCitzdGF0aWMgaW50IGJhc2U2NF90ZXN0KHZvaWQpCit7CisgICAgdW5zaWduZWQgaTsKKyAgICBjaGFyIG91dHB1dFs4MF07CisgICAgcGpfc3RhdHVzX3QgcmM7CisKKyAgICBQSl9MT0coMywgKFRISVNfRklMRSwgIiAgYmFzZTY0IHRlc3QuLiIpKTsKKworICAgIGZvciAoaT0wOyBpPFBKX0FSUkFZX1NJWkUoYmFzZTY0X3Rlc3RfdmVjKTsgKytpKSB7CisJcGpfc3RyX3QgaW5wdXQ7CisJaW50IG91dF9sZW47CisKKwkvKiBFbmNvZGUgdGVzdCAqLworCWlmIChiYXNlNjRfdGVzdF92ZWNbaV0uZmxhZyAmIEVOQ09ERSkgeworCSAgICBvdXRfbGVuID0gc2l6ZW9mKG91dHB1dCk7CisJICAgIHJjID0gcGpfYmFzZTY0X2VuY29kZSgocGpfdWludDhfdCopYmFzZTY0X3Rlc3RfdmVjW2ldLmJhc2UyNTYsCisJCQkJICAoaW50KXN0cmxlbihiYXNlNjRfdGVzdF92ZWNbaV0uYmFzZTI1NiksCisJCQkJICBvdXRwdXQsICZvdXRfbGVuKTsKKwkgICAgaWYgKHJjICE9IFBKX1NVQ0NFU1MpCisJCXJldHVybiAtOTA7CisKKwkgICAgaWYgKG91dF9sZW4gIT0gKGludClzdHJsZW4oYmFzZTY0X3Rlc3RfdmVjW2ldLmJhc2U2NCkpCisJCXJldHVybiAtOTE7CisKKwkgICAgb3V0cHV0W291dF9sZW5dID0gJ1wwJzsKKwkgICAgaWYgKHN0cmNtcChvdXRwdXQsIGJhc2U2NF90ZXN0X3ZlY1tpXS5iYXNlNjQpICE9IDApCisJCXJldHVybiAtOTI7CisJfQorCisJLyogRGVjb2RlIHRlc3QgKi8KKwlpZiAoYmFzZTY0X3Rlc3RfdmVjW2ldLmZsYWcgJiBERUNPREUpIHsKKwkgICAgb3V0X2xlbiA9IHNpemVvZihvdXRwdXQpOworCSAgICBpbnB1dC5wdHIgPSAoY2hhciopYmFzZTY0X3Rlc3RfdmVjW2ldLmJhc2U2NDsKKwkgICAgaW5wdXQuc2xlbiA9IHN0cmxlbihiYXNlNjRfdGVzdF92ZWNbaV0uYmFzZTY0KTsKKwkgICAgcmMgPSBwal9iYXNlNjRfZGVjb2RlKCZpbnB1dCwgKHBqX3VpbnQ4X3QqKW91dHB1dCwgJm91dF9sZW4pOworCSAgICBpZiAocmMgIT0gUEpfU1VDQ0VTUykKKwkJcmV0dXJuIC05NTsKKworCSAgICBpZiAob3V0X2xlbiAhPSAoaW50KXN0cmxlbihiYXNlNjRfdGVzdF92ZWNbaV0uYmFzZTI1NikpCisJCXJldHVybiAtOTY7CisKKwkgICAgb3V0cHV0W291dF9sZW5dID0gJ1wwJzsKKworCSAgICBpZiAoc3RyY21wKG91dHB1dCwgYmFzZTY0X3Rlc3RfdmVjW2ldLmJhc2UyNTYpICE9IDApCisJCXJldHVybiAtOTc7CisJfQorICAgIH0KKworICAgIHJldHVybiAwOworfQorCisKK2ludCBlbmNyeXB0aW9uX3Rlc3QoKQoreworICAgIGludCByYzsKKworICAgIHJjID0gYmFzZTY0X3Rlc3QoKTsKKyAgICBpZiAocmMgIT0gMCkKKwlyZXR1cm4gcmM7CisKKyAgICByYyA9IHNoYTFfdGVzdDEoKTsKKyAgICBpZiAocmMgIT0gMCkKKwlyZXR1cm4gcmM7CisKKyAgICByYyA9IHNoYTFfdGVzdDIoKTsKKyAgICBpZiAocmMgIT0gMCkKKwlyZXR1cm4gcmM7CisKKyAgICByYyA9IHJmYzIyMDJfdGVzdCgpOworICAgIGlmIChyYyAhPSAwKQorCXJldHVybiByYzsKKworICAgIHJjID0gY3JjMzJfdGVzdCgpOworICAgIGlmIChyYyAhPSAwKQorCXJldHVybiByYzsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBjcmMzMl91cGRhdGUocGpfY3JjMzJfY29udGV4dCAqYywgY29uc3QgcGpfdWludDhfdCAqZGF0YSwKKwkJCSBwal9zaXplX3QgbmJ5dGVzKQoreworICAgIHBqX2NyYzMyX3VwZGF0ZShjLCBkYXRhLCBuYnl0ZXMpOworfQorCitzdGF0aWMgdm9pZCBjcmMzMl9maW5hbChwal9jcmMzMl9jb250ZXh0ICpjdHgsIHBqX3VpbnQzMl90ICpkaWdlc3QpCit7CisgICAgKmRpZ2VzdCA9IHBqX2NyYzMyX2ZpbmFsKGN0eCk7Cit9CisKK2ludCBlbmNyeXB0aW9uX2JlbmNobWFyaygpCit7CisgICAgcGpfcG9vbF90ICpwb29sOworICAgIHBqX3VpbnQ4X3QgKmlucHV0OworICAgIHVuaW9uIHsKKwlwal9tZDVfY29udGV4dCBtZDVfY29udGV4dDsKKwlwal9zaGExX2NvbnRleHQgc2hhMV9jb250ZXh0OworICAgIH0gY29udGV4dDsKKyAgICBwal91aW50OF90IGRpZ2VzdFszMl07CisgICAgcGpfc2l6ZV90IGlucHV0X2xlbjsKKyAgICBzdHJ1Y3QgYWxnb3JpdGhtCisgICAgeworCWNvbnN0IGNoYXIgKm5hbWU7CisJdm9pZCAoKmluaXRfY29udGV4dCkodm9pZCopOworCXZvaWQgKCp1cGRhdGUpKHZvaWQqLCBjb25zdCBwal91aW50OF90KiwgdW5zaWduZWQpOworCXZvaWQgKCpmaW5hbCkodm9pZCosIHZvaWQqKTsKKwlwal91aW50MzJfdCB0OworICAgIH0gYWxnb3JpdGhtc1tdID0gCisgICAgeworCXsKKwkgICAgIk1ENSAgIiwKKwkgICAgKHZvaWQgKCopKHZvaWQqKSkmcGpfbWQ1X2luaXQsCisJICAgICh2b2lkICgqKSh2b2lkKiwgY29uc3QgcGpfdWludDhfdCosIHVuc2lnbmVkKSkmcGpfbWQ1X3VwZGF0ZSwKKwkgICAgKHZvaWQgKCopKHZvaWQqLCB2b2lkKikpJnBqX21kNV9maW5hbAorCX0sCisJeworCSAgICAiU0hBMSAiLAorCSAgICAodm9pZCAoKikodm9pZCopKSZwal9zaGExX2luaXQsCisJICAgICh2b2lkICgqKSh2b2lkKiwgY29uc3QgcGpfdWludDhfdCosIHVuc2lnbmVkKSkmcGpfc2hhMV91cGRhdGUsCisJICAgICh2b2lkICgqKSh2b2lkKiwgdm9pZCopKSZwal9zaGExX2ZpbmFsCisJfSwKKwl7CisJICAgICJDUkMzMiIsCisJICAgICh2b2lkICgqKSh2b2lkKikpJnBqX2NyYzMyX2luaXQsCisJICAgICh2b2lkICgqKSh2b2lkKiwgY29uc3QgcGpfdWludDhfdCosIHVuc2lnbmVkKSkmY3JjMzJfdXBkYXRlLAorCSAgICAodm9pZCAoKikodm9pZCosIHZvaWQqKSkmY3JjMzJfZmluYWwKKwl9CisgICAgfTsKKyNpZiBkZWZpbmVkKFBKX0RFQlVHKSAmJiBQSl9ERUJVRyE9MAorICAgIGVudW0geyBMT09QID0gMTAwMCB9OworI2Vsc2UKKyAgICBlbnVtIHsgTE9PUCA9IDEwMDAwIH07CisjZW5kaWYKKyAgICB1bnNpZ25lZCBpOworICAgIGRvdWJsZSB0b3RhbF9sZW47CisKKyAgICBpbnB1dF9sZW4gPSAyMDQ4OworICAgIHRvdGFsX2xlbiA9ICh1bnNpZ25lZClpbnB1dF9sZW4gKiBMT09QOworICAgIHBvb2wgPSBwal9wb29sX2NyZWF0ZShtZW0sICJlbmMiLCBpbnB1dF9sZW4rMjU2LCAwLCBOVUxMKTsKKyAgICBpZiAoIXBvb2wpCisJcmV0dXJuIFBKX0VOT01FTTsKKworICAgIGlucHV0ID0gKHBqX3VpbnQ4X3QqKXBqX3Bvb2xfYWxsb2MocG9vbCwgaW5wdXRfbGVuKTsKKyAgICBwal9tZW1zZXQoaW5wdXQsICdceGFhJywgaW5wdXRfbGVuKTsKKyAgICAKKyAgICBQSl9MT0coMywgKFRISVNfRklMRSwgIiAgZmVlZGluZyAlZCBNYnl0ZXMgb2YgZGF0YSIsCisJICAgICAgICh1bnNpZ25lZCkodG90YWxfbGVuLzEwMjQvMTAyNCkpKTsKKworICAgIC8qIERyeSBydW4gKi8KKyAgICBmb3IgKGk9MDsgaTxQSl9BUlJBWV9TSVpFKGFsZ29yaXRobXMpOyArK2kpIHsKKwlhbGdvcml0aG1zW2ldLmluaXRfY29udGV4dCgmY29udGV4dCk7CisJYWxnb3JpdGhtc1tpXS51cGRhdGUoJmNvbnRleHQsIGlucHV0LCAodW5zaWduZWQpaW5wdXRfbGVuKTsKKwlhbGdvcml0aG1zW2ldLmZpbmFsKCZjb250ZXh0LCBkaWdlc3QpOworICAgIH0KKworICAgIC8qIFJ1biAqLworICAgIGZvciAoaT0wOyBpPFBKX0FSUkFZX1NJWkUoYWxnb3JpdGhtcyk7ICsraSkgeworCWludCBqOworCXBqX3RpbWVzdGFtcCB0MSwgdDI7CisKKwlwal9nZXRfdGltZXN0YW1wKCZ0MSk7CisJYWxnb3JpdGhtc1tpXS5pbml0X2NvbnRleHQoJmNvbnRleHQpOworCWZvciAoaj0wOyBqPExPT1A7ICsraikgeworCSAgICBhbGdvcml0aG1zW2ldLnVwZGF0ZSgmY29udGV4dCwgaW5wdXQsICh1bnNpZ25lZClpbnB1dF9sZW4pOworCX0KKwlhbGdvcml0aG1zW2ldLmZpbmFsKCZjb250ZXh0LCBkaWdlc3QpOworCXBqX2dldF90aW1lc3RhbXAoJnQyKTsKKworCWFsZ29yaXRobXNbaV0udCA9IHBqX2VsYXBzZWRfdXNlYygmdDEsICZ0Mik7CisgICAgfQorCisgICAgLyogUmVzdWx0cyAqLworICAgIGZvciAoaT0wOyBpPFBKX0FSUkFZX1NJWkUoYWxnb3JpdGhtcyk7ICsraSkgeworCWRvdWJsZSBieXRlczsKKworCWJ5dGVzID0gKHRvdGFsX2xlbiAqIDEwMDAwMDAgLyBhbGdvcml0aG1zW2ldLnQpOworCVBKX0xPRygzLCAoVEhJU19GSUxFLCAiICAgICVzOiU4ZCB1c2VjICglM2QuJTAzZCBNYnl0ZXMvc2VjKSIsCisJCSAgIGFsZ29yaXRobXNbaV0ubmFtZSwgYWxnb3JpdGhtc1tpXS50LAorCQkgICAodW5zaWduZWQpKGJ5dGVzIC8gMTAyNCAvIDEwMjQpLAorCQkgICAoKHVuc2lnbmVkKShieXRlcykgJSAoMTAyNCAqIDEwMjQpKSAvIDEwMjQpKTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworCisKKyNlbmRpZiAvKiBJTkNMVURFX0VOQ1JZUFRJT05fVEVTVCAqLworCmRpZmYgLS1naXQgYS9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvLnN2bi9wcmlzdGluZS8wNS8wNTRjNDhmZWVlZjc3ZWZhNjQwY2Y3NjNlOGU4YWYxNjA2OTIyZDhjLnN2bi1iYXNlIGIvam5pL3BqcHJvamVjdC1hbmRyb2lkLy5zdm4vcHJpc3RpbmUvMDUvMDU0YzQ4ZmVlZWY3N2VmYTY0MGNmNzYzZThlOGFmMTYwNjkyMmQ4Yy5zdm4tYmFzZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZDg3OGNjCi0tLSAvZGV2L251bGwKKysrIGIvam5pL3BqcHJvamVjdC1hbmRyb2lkLy5zdm4vcHJpc3RpbmUvMDUvMDU0YzQ4ZmVlZWY3N2VmYTY0MGNmNzYzZThlOGFmMTYwNjkyMmQ4Yy5zdm4tYmFzZQpAQCAtMCwwICsxLDExMjUgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqCisqKiAgIElUVS1UIEcuNzIyLjEgKDIwMDUtMDUpIC0gRml4ZWQgcG9pbnQgaW1wbGVtZW50YXRpb24gZm9yIG1haW4gYm9keSBhbmQgQW5uZXggQworKiogICA+IFNvZnR3YXJlIFJlbGVhc2UgMi4xICgyMDA4LTA2KQorKiogICAgIChTaW1wbGUgcmVwYWNrYWdpbmc7IG5vIGNoYW5nZSBmcm9tIDIwMDUtMDUgUmVsZWFzZSAyLjAgY29kZSkKKyoqCisqKiAgIKkgMjAwNCBQb2x5Y29tLCBJbmMuCisqKgorKiogICBBbGwgcmlnaHRzIHJlc2VydmVkLgorKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICBGaWxlbmFtZTogICAgZW5jb2Rlci5jICAgIAorCisgIFB1cnBvc2U6ICAgICBDb250YWlucyBmaWxlcyB1c2VkIHRvIGltcGxlbWVudCB0aGUgRy43MjIuMSBBbm5leCBDIGVuY29kZXIKKworICBEZXNpZ24gTm90ZXM6CisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorIEluY2x1ZGUgZmlsZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxtYXRoLmg+CisjaW5jbHVkZSAiZGVmcy5oIgorI2luY2x1ZGUgImh1ZmZfZGVmLmgiCisjaW5jbHVkZSAidGFibGVzLmgiCisjaW5jbHVkZSAiY291bnQuaCIKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorIEZ1bmN0aW9uOiAgICBlbmNvZGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyBTeW50YXg6ICAgICAgdm9pZCBlbmNvZGVyKFdvcmQxNiBudW1iZXJfb2ZfYXZhaWxhYmxlX2JpdHMsICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgbnVtYmVyX29mX3JlZ2lvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgbWx0X2NvZWZzLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiBtYWdfc2hpZnQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2IG91dF93b3JkcykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgIAorICAgICAgICAgICAgICBpbnB1dHM6ICAgbnVtYmVyX29mX2F2YWlsYWJsZV9iaXRzCisgICAgICAgICAgICAgICAgICAgICAgICBudW1iZXJfb2ZfcmVnaW9ucworICAgICAgICAgICAgICAgICAgICAgICAgbWFnX3NoaWZ0CisgICAgICAgICAgICAgICAgICAgICAgICBtbHRfY29lZnNbRENUX0xFTkdUSF0KKyAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICBvdXRwdXRzOiAgb3V0X3dvcmRzW01BWF9CSVRTX1BFUl9GUkFNRS8xNl0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyBEZXNjcmlwdGlvbjogRW5jb2RlcyB0aGUgbWx0IGNvZWZzIGludG8gb3V0X3dvcmRzIHVzaW5nIEcuNzIyLjEgQW5uZXggQworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyBXTU9QUzogICAgIDdrSHogfCAgICAyNGtiaXQgICAgfCAgICAgMzJrYml0CisgICAgICAgICAgLS0tLS0tLXwtLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tCisgICAgICAgICAgICBBVkcgIHwgICAgMC45MyAgICAgIHwgICAgIDEuMDQKKyAgICAgICAgICAtLS0tLS0tfC0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0gIAorICAgICAgICAgICAgTUFYICB8ICAgIDEuMjAgICAgICB8ICAgICAxLjI4CisgICAgICAgICAgLS0tLS0tLXwtLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgIDE0a0h6IHwgICAgMjRrYml0ICAgIHwgICAgIDMya2JpdCAgICAgfCAgICAgNDhrYml0CisgICAgICAgICAgLS0tLS0tLXwtLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgICAgIEFWRyAgfCAgICAxLjM5ICAgICAgfCAgICAgMS43MSAgICAgICB8ICAgICAyLjAxCisgICAgICAgICAgLS0tLS0tLXwtLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgICAgIE1BWCAgfCAgICAyLjAwICAgICAgfCAgICAgMi4zMCAgICAgICB8ICAgICAyLjUyCisgICAgICAgICAgLS0tLS0tLXwtLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordm9pZCBlbmNvZGVyKFdvcmQxNiAgbnVtYmVyX29mX2F2YWlsYWJsZV9iaXRzLAorICAgICAgICAgICAgIFdvcmQxNiAgbnVtYmVyX29mX3JlZ2lvbnMsCisgICAgICAgICAgICAgV29yZDE2ICAqbWx0X2NvZWZzLAorICAgICAgICAgICAgIFdvcmQxNiAgbWFnX3NoaWZ0LAorICAgICAgICAgICAgIFdvcmQxNiAgKm91dF93b3JkcykKK3sKKworICAgIFdvcmQxNiAgbnVtX2NhdGVnb3JpemF0aW9uX2NvbnRyb2xfYml0czsKKyAgICBXb3JkMTYgIG51bV9jYXRlZ29yaXphdGlvbl9jb250cm9sX3Bvc3NpYmlsaXRpZXM7CisgICAgV29yZDE2ICBudW1iZXJfb2ZfYml0c19wZXJfZnJhbWU7CisgICAgV29yZDE2ICBudW1iZXJfb2ZfZW52ZWxvcGVfYml0czsKKyAgICBXb3JkMTYgIGNhdGVnb3JpemF0aW9uX2NvbnRyb2w7CisgICAgV29yZDE2ICByZWdpb247CisgICAgV29yZDE2ICBhYnNvbHV0ZV9yZWdpb25fcG93ZXJfaW5kZXhbTUFYX05VTUJFUl9PRl9SRUdJT05TXTsKKyAgICBXb3JkMTYgIHBvd2VyX2NhdGVnb3JpZXNbTUFYX05VTUJFUl9PRl9SRUdJT05TXTsKKyAgICBXb3JkMTYgIGNhdGVnb3J5X2JhbGFuY2VzW01BWF9OVU1fQ0FURUdPUklaQVRJT05fQ09OVFJPTF9QT1NTSUJJTElUSUVTLTFdOworICAgIFdvcmQxNiAgZHJwX251bV9iaXRzW01BWF9OVU1CRVJfT0ZfUkVHSU9OUysxXTsKKyAgICBVV29yZDE2IGRycF9jb2RlX2JpdHNbTUFYX05VTUJFUl9PRl9SRUdJT05TKzFdOworICAgIFdvcmQxNiAgcmVnaW9uX21sdF9iaXRfY291bnRzW01BWF9OVU1CRVJfT0ZfUkVHSU9OU107CisgICAgVVdvcmQzMiByZWdpb25fbWx0X2JpdHNbNCpNQVhfTlVNQkVSX09GX1JFR0lPTlNdOworICAgIFdvcmQxNiAgbWFnX3NoaWZ0X29mZnNldDsKKworICAgIFdvcmQxNiB0ZW1wOworCisgICAgLyogaW5pdGlhbGl6ZSB2YXJpYWJsZXMgKi8KKyAgICB0ZXN0KCk7CisgICAgaWYgKG51bWJlcl9vZl9yZWdpb25zID09IE5VTUJFUl9PRl9SRUdJT05TKQorICAgIHsKKyAgICAgICAgbnVtX2NhdGVnb3JpemF0aW9uX2NvbnRyb2xfYml0cyA9IE5VTV9DQVRFR09SSVpBVElPTl9DT05UUk9MX0JJVFM7CisgICAgICAgIG1vdmUxNigpOworICAgICAgICBudW1fY2F0ZWdvcml6YXRpb25fY29udHJvbF9wb3NzaWJpbGl0aWVzID0gTlVNX0NBVEVHT1JJWkFUSU9OX0NPTlRST0xfUE9TU0lCSUxJVElFUzsKKyAgICAgICAgbW92ZTE2KCk7CisgICAgfSAKKyAgICBlbHNlCisgICAgeworICAgICAgICBudW1fY2F0ZWdvcml6YXRpb25fY29udHJvbF9iaXRzID0gTUFYX05VTV9DQVRFR09SSVpBVElPTl9DT05UUk9MX0JJVFM7CisgICAgICAgIG1vdmUxNigpOworICAgICAgICBudW1fY2F0ZWdvcml6YXRpb25fY29udHJvbF9wb3NzaWJpbGl0aWVzID0gTUFYX05VTV9DQVRFR09SSVpBVElPTl9DT05UUk9MX1BPU1NJQklMSVRJRVM7CisgICAgICAgIG1vdmUxNigpOworICAgIH0KKworICAgIG51bWJlcl9vZl9iaXRzX3Blcl9mcmFtZSA9IG51bWJlcl9vZl9hdmFpbGFibGVfYml0czsKKyAgICBtb3ZlMTYoKTsKKworICAgIGZvciAocmVnaW9uPTA7IHJlZ2lvbjxudW1iZXJfb2ZfcmVnaW9uczsgcmVnaW9uKyspCisgICAgeworICAgICAgICByZWdpb25fbWx0X2JpdF9jb3VudHNbcmVnaW9uXSA9IDA7CisgICAgICAgIG1vdmUxNigpOworICAgIH0KKyAgICAKKyAgICAvKiBFc3RpbWF0ZSBwb3dlciBlbnZlbG9wZS4gKi8KKyAgICBudW1iZXJfb2ZfZW52ZWxvcGVfYml0cyA9IGNvbXB1dGVfcmVnaW9uX3Bvd2VycyhtbHRfY29lZnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFnX3NoaWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRycF9udW1fYml0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkcnBfY29kZV9iaXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFic29sdXRlX3JlZ2lvbl9wb3dlcl9pbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1iZXJfb2ZfcmVnaW9ucyk7CisKKyAgICAvKiBBZGp1c3QgbnVtYmVyIG9mIGF2YWlsYWJsZSBiaXRzIGJhc2VkIG9uIHBvd2VyIGVudmVsb3BlIGVzdGltYXRlICovCisgICAgdGVtcCA9IHN1YihudW1iZXJfb2ZfYXZhaWxhYmxlX2JpdHMsbnVtYmVyX29mX2VudmVsb3BlX2JpdHMpOworICAgIG51bWJlcl9vZl9hdmFpbGFibGVfYml0cyA9IHN1Yih0ZW1wLG51bV9jYXRlZ29yaXphdGlvbl9jb250cm9sX2JpdHMpOworCisgICAgLyogZ2V0IGNhdGVnb3JpemF0aW9ucyAqLworICAgIGNhdGVnb3JpemUobnVtYmVyX29mX2F2YWlsYWJsZV9iaXRzLAorICAgICAgICAgICAgICAgbnVtYmVyX29mX3JlZ2lvbnMsCisgICAgICAgICAgICAgICBudW1fY2F0ZWdvcml6YXRpb25fY29udHJvbF9wb3NzaWJpbGl0aWVzLAorICAgICAgICAgICAgICAgYWJzb2x1dGVfcmVnaW9uX3Bvd2VyX2luZGV4LAorICAgICAgICAgICAgICAgcG93ZXJfY2F0ZWdvcmllcywKKyAgICAgICAgICAgICAgIGNhdGVnb3J5X2JhbGFuY2VzKTsKKworICAgIC8qIEFkanVzdCBhYnNvbHV0ZV9yZWdpb25fY2F0ZWdvcnlfaW5kZXhbXSBmb3IgbWFnX3NoaWZ0LgorICAgICAgIFRoaXMgYXNzdW1lcyB0aGF0IFJFR0lPTl9QT1dFUl9TVEVQU0laRV9EQiBpcyBkZWZpbmVkCisgICAgICAgdG8gYmUgZXhhY3RseSAzLjAxMDI5OTk1NyBvciAyMC4wIHRpbWVzIGxvZyBiYXNlIDEwCisgICAgICAgb2Ygc3F1YXJlIHJvb3Qgb2YgMi4gKi8KKyAgICB0ZW1wID0gc2hsX25vY2hlY2sobWFnX3NoaWZ0LDEpOworICAgIG1hZ19zaGlmdF9vZmZzZXQgPSBhZGQodGVtcCxSRUdJT05fUE9XRVJfVEFCTEVfTlVNX05FR0FUSVZFUyk7CisgICAgCisgICAgZm9yIChyZWdpb249MDsgcmVnaW9uPG51bWJlcl9vZl9yZWdpb25zOyByZWdpb24rKykKKyAgICB7CisgICAgICAgIGFic29sdXRlX3JlZ2lvbl9wb3dlcl9pbmRleFtyZWdpb25dID0gYWRkKGFic29sdXRlX3JlZ2lvbl9wb3dlcl9pbmRleFtyZWdpb25dLG1hZ19zaGlmdF9vZmZzZXQpOworICAgICAgICBtb3ZlMTYoKTsKKyAgICB9CisKKyAgICAvKiBhZGp1c3QgdGhlIGFic29sdXRlIHBvd2VyIHJlZ2lvbiBpbmRleCBiYXNlZCBvbiB0aGUgbWx0IGNvZWZzICovCisgICAgYWRqdXN0X2Fic19yZWdpb25fcG93ZXJfaW5kZXgoYWJzb2x1dGVfcmVnaW9uX3Bvd2VyX2luZGV4LG1sdF9jb2VmcyxudW1iZXJfb2ZfcmVnaW9ucyk7CisKKworICAgIC8qIHF1YW50aXplIGFuZCBjb2RlIHRoZSBtbHQgY29lZmZpY2llbnRzIGJhc2VkIG9uIGNhdGVnb3JpemF0aW9ucyAqLworICAgIHZlY3Rvcl9xdWFudGl6ZV9tbHRzKG51bWJlcl9vZl9hdmFpbGFibGVfYml0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICBudW1iZXJfb2ZfcmVnaW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICBudW1fY2F0ZWdvcml6YXRpb25fY29udHJvbF9wb3NzaWJpbGl0aWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgIG1sdF9jb2VmcywKKyAgICAgICAgICAgICAgICAgICAgICAgICBhYnNvbHV0ZV9yZWdpb25fcG93ZXJfaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgcG93ZXJfY2F0ZWdvcmllcywKKyAgICAgICAgICAgICAgICAgICAgICAgICBjYXRlZ29yeV9iYWxhbmNlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAmY2F0ZWdvcml6YXRpb25fY29udHJvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICByZWdpb25fbWx0X2JpdF9jb3VudHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaW9uX21sdF9iaXRzKTsKKworICAgIC8qIHN0dWZmIGJpdHMgaW50byB3b3JkcyAqLworICAgIGJpdHNfdG9fd29yZHMocmVnaW9uX21sdF9iaXRzLAorICAgICAgICAgICAgICAgICAgcmVnaW9uX21sdF9iaXRfY291bnRzLAorICAgICAgICAgICAgICAgICAgZHJwX251bV9iaXRzLAorICAgICAgICAgICAgICAgICAgZHJwX2NvZGVfYml0cywKKyAgICAgICAgICAgICAgICAgIG91dF93b3JkcywKKyAgICAgICAgICAgICAgICAgIGNhdGVnb3JpemF0aW9uX2NvbnRyb2wsCisgICAgICAgICAgICAgICAgICBudW1iZXJfb2ZfcmVnaW9ucywKKyAgICAgICAgICAgICAgICAgIG51bV9jYXRlZ29yaXphdGlvbl9jb250cm9sX2JpdHMsCisgICAgICAgICAgICAgICAgICBudW1iZXJfb2ZfYml0c19wZXJfZnJhbWUpOworCit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyBGdW5jdGlvbjogICAgYml0c190b193b3JkcworCisgU3ludGF4OiAgICAgIGJpdHNfdG9fd29yZHMoVVdvcmQzMiAqcmVnaW9uX21sdF9iaXRzLCAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2ICAqcmVnaW9uX21sdF9iaXRfY291bnRzLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgICpkcnBfbnVtX2JpdHMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVXb3JkMTYgKmRycF9jb2RlX2JpdHMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2ICAqb3V0X3dvcmRzLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgIGNhdGVnb3JpemF0aW9uX2NvbnRyb2wsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiAgbnVtYmVyX29mX3JlZ2lvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2ICBudW1fY2F0ZWdvcml6YXRpb25fY29udHJvbF9iaXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiAgbnVtYmVyX29mX2JpdHNfcGVyX2ZyYW1lKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgRGVzY3JpcHRpb246IFN0dWZmcyB0aGUgYml0cyBpbnRvIHdvcmRzIGZvciBvdXRwdXQKKworIFdNT1BTOiAgICAgN2tIeiB8ICAgIDI0a2JpdCAgICB8ICAgICAgMzJrYml0CisgICAgICAgICAgLS0tLS0tLXwtLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tCisgICAgICAgICAgICBBVkcgIHwgICAgMC4wOSAgICAgIHwgICAgIDAuMTIKKyAgICAgICAgICAtLS0tLS0tfC0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0gIAorICAgICAgICAgICAgTUFYICB8ICAgIDAuMTAgICAgICB8ICAgICAwLjEzCisgICAgICAgICAgLS0tLS0tLXwtLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tIAorICAgICAgICAgIAorICAgICAgICAgICAxNGtIeiB8ICAgIDI0a2JpdCAgICB8ICAgICAzMmtiaXQgICAgIHwgICAgIDQ4a2JpdAorICAgICAgICAgIC0tLS0tLS18LS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tCisgICAgICAgICAgICBBVkcgIHwgICAgMC4xMiAgICAgIHwgICAgIDAuMTUgICAgICAgfCAgICAgMC4xOQorICAgICAgICAgIC0tLS0tLS18LS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tCisgICAgICAgICAgICBNQVggIHwgICAgMC4xNCAgICAgIHwgICAgIDAuMTcgICAgICAgfCAgICAgMC4yMQorICAgICAgICAgIC0tLS0tLS18LS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYml0c190b193b3JkcyhVV29yZDMyICpyZWdpb25fbWx0X2JpdHMsCisgICAgICAgICAgICAgICAgICAgV29yZDE2ICAqcmVnaW9uX21sdF9iaXRfY291bnRzLAorICAgICAgICAgICAgICAgICAgIFdvcmQxNiAgKmRycF9udW1fYml0cywKKyAgICAgICAgICAgICAgICAgICBVV29yZDE2ICpkcnBfY29kZV9iaXRzLAorICAgICAgICAgICAgICAgICAgIFdvcmQxNiAgKm91dF93b3JkcywKKyAgICAgICAgICAgICAgICAgICBXb3JkMTYgIGNhdGVnb3JpemF0aW9uX2NvbnRyb2wsCisgICAgICAgICAgICAgICAgICAgV29yZDE2ICBudW1iZXJfb2ZfcmVnaW9ucywKKyAgICAgICAgICAgICAgICAgICBXb3JkMTYgIG51bV9jYXRlZ29yaXphdGlvbl9jb250cm9sX2JpdHMsCisgICAgICAgICAgICAgICAgICAgV29yZDE2ICBudW1iZXJfb2ZfYml0c19wZXJfZnJhbWUpCit7CisgICAgV29yZDE2ICBvdXRfd29yZF9pbmRleCA9IDA7CisgICAgV29yZDE2ICBqOworICAgIFdvcmQxNiAgcmVnaW9uOworICAgIFdvcmQxNiAgb3V0X3dvcmQ7CisgICAgV29yZDE2ICByZWdpb25fYml0X2NvdW50OworICAgIFdvcmQxNiAgY3VycmVudF93b3JkX2JpdHNfbGVmdDsKKyAgICBVV29yZDE2IHNsaWNlOworICAgIFdvcmQxNiAgb3V0X3dvcmRfYml0c19mcmVlID0gMTY7CisgICAgVVdvcmQzMiAqaW5fd29yZF9wdHI7CisgICAgVVdvcmQzMiBjdXJyZW50X3dvcmQ7CisgICAgCisgICAgV29yZDMyICBhY2NhID0gMDsKKyAgICBXb3JkMzIgIGFjY2I7CisgICAgV29yZDE2ICB0ZW1wOworCisgICAgLyogRmlyc3Qgc2V0IHVwIHRoZSBjYXRlZ29yaXphdGlvbiBjb250cm9sIGJpdHMgdG8gbG9vayBsaWtlIG9uZSBtb3JlIHNldCBvZiByZWdpb24gcG93ZXIgYml0cy4gKi8KKyAgICBvdXRfd29yZCA9IDA7CisgICAgbW92ZTE2KCk7CisKKyAgICBkcnBfbnVtX2JpdHNbbnVtYmVyX29mX3JlZ2lvbnNdID0gbnVtX2NhdGVnb3JpemF0aW9uX2NvbnRyb2xfYml0czsKKyAgICBtb3ZlMTYoKTsKKyAgICAKKyAgICBkcnBfY29kZV9iaXRzW251bWJlcl9vZl9yZWdpb25zXSA9IChVV29yZDE2KWNhdGVnb3JpemF0aW9uX2NvbnRyb2w7CisgICAgbW92ZTE2KCk7CisKKyAgICAvKiBUaGVzZSBjb2RlIGJpdHMgYXJlIHJpZ2h0IGp1c3RpZmllZC4gKi8KKyAgICBmb3IgKHJlZ2lvbj0wOyByZWdpb24gPD0gbnVtYmVyX29mX3JlZ2lvbnM7IHJlZ2lvbisrKQorICAgIHsKKyAgICAgICAgY3VycmVudF93b3JkX2JpdHNfbGVmdCA9IGRycF9udW1fYml0c1tyZWdpb25dOworICAgICAgICBtb3ZlMTYoKTsKKyAgICAgICAgCisgICAgICAgIGN1cnJlbnRfd29yZCA9IChVV29yZDMyKWRycF9jb2RlX2JpdHNbcmVnaW9uXTsKKyAgICAgICAgbW92ZTE2KCk7CisgICAgICAgIAorICAgICAgICBqID0gc3ViKGN1cnJlbnRfd29yZF9iaXRzX2xlZnQsb3V0X3dvcmRfYml0c19mcmVlKTsKKworICAgICAgICB0ZXN0KCk7CisgICAgICAgIGlmIChqID49IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIHRlbXAgPSBleHRyYWN0X2woTF9zaHJfbm9jaGVjayhjdXJyZW50X3dvcmQsaikpOworICAgICAgICAgICAgb3V0X3dvcmQgPSBhZGQob3V0X3dvcmQsdGVtcCk7CisKKyAgICAgICAgICAgIG91dF93b3Jkc1tvdXRfd29yZF9pbmRleCsrXSA9IG91dF93b3JkOworICAgICAgICAgICAgbW92ZTE2KCk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIG91dF93b3JkX2JpdHNfZnJlZSA9IDE2OworICAgICAgICAgICAgbW92ZTE2KCk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIG91dF93b3JkX2JpdHNfZnJlZSA9IHN1YihvdXRfd29yZF9iaXRzX2ZyZWUsaik7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGFjY2EgPSAoY3VycmVudF93b3JkIDw8IG91dF93b3JkX2JpdHNfZnJlZSk7CisgICAgICAgICAgICBvdXRfd29yZCA9IGV4dHJhY3RfbChhY2NhKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGogPSBuZWdhdGUoaik7CisKKyAgICAgICAgICAgIGFjY2EgPSAoY3VycmVudF93b3JkIDw8IGopOworICAgICAgICAgICAgYWNjYiA9IExfZGVwb3NpdF9sKG91dF93b3JkKTsKKyAgICAgICAgICAgIGFjY2EgPSBMX2FkZChhY2NiLGFjY2EpOworICAgICAgICAgICAgb3V0X3dvcmQgPSBleHRyYWN0X2woYWNjYSk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIG91dF93b3JkX2JpdHNfZnJlZSA9IHN1YihvdXRfd29yZF9iaXRzX2ZyZWUsY3VycmVudF93b3JkX2JpdHNfbGVmdCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBUaGVzZSBjb2RlIGJpdHMgYXJlIGxlZnQganVzdGlmaWVkLiAqLworICAgIAorICAgIGZvciAocmVnaW9uPTA7cmVnaW9uPG51bWJlcl9vZl9yZWdpb25zOyByZWdpb24rKykKKyAgICB7CisgICAgICAgIGFjY2IgPSBMX2RlcG9zaXRfbChvdXRfd29yZF9pbmRleCk7CisgICAgICAgIGFjY2IgPSBMX3NobF9ub2NoZWNrKGFjY2IsNCk7CisgICAgICAgIGFjY2IgPSBMX3N1YihhY2NiLG51bWJlcl9vZl9iaXRzX3Blcl9mcmFtZSk7CisgICAgICAgIHRlc3QoKTsKKyAgICAgICAgaWYoYWNjYiA8IDApICAgICAgICAKKyAgICAgICAgeworICAgICAgICAgICAgdGVtcCA9IHNobF9ub2NoZWNrKHJlZ2lvbiwyKTsKKyAgICAgICAgICAgIGluX3dvcmRfcHRyID0gJnJlZ2lvbl9tbHRfYml0c1t0ZW1wXTsKKyAgICAgICAgICAgIHJlZ2lvbl9iaXRfY291bnQgPSByZWdpb25fbWx0X2JpdF9jb3VudHNbcmVnaW9uXTsKKyAgICAgICAgICAgIG1vdmUxNigpOworCisgICAgICAgICAgICB0ZW1wID0gc3ViKDMyLHJlZ2lvbl9iaXRfY291bnQpOworICAgICAgICAgICAgdGVzdCgpOworICAgICAgICAgICAgaWYodGVtcCA+IDApCisgICAgICAgICAgICAgICAgY3VycmVudF93b3JkX2JpdHNfbGVmdCA9IHJlZ2lvbl9iaXRfY291bnQ7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgY3VycmVudF93b3JkX2JpdHNfbGVmdCA9IDMyOworCisgICAgICAgICAgICBjdXJyZW50X3dvcmQgPSAqaW5fd29yZF9wdHIrKzsKKyAgICAKKyAgICAgICAgICAgIGFjY2EgPSBMX2RlcG9zaXRfbChvdXRfd29yZF9pbmRleCk7CisgICAgICAgICAgICBhY2NhID0gTF9zaGxfbm9jaGVjayhhY2NhLDQpOworICAgICAgICAgICAgYWNjYSA9IExfc3ViKGFjY2EsbnVtYmVyX29mX2JpdHNfcGVyX2ZyYW1lKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgLyogZnJvbSB3aGlsZSBsb29wICovCisgICAgICAgICAgICB0ZXN0KCk7CisgICAgICAgICAgICB0ZXN0KCk7CisgICAgICAgICAgICBsb2dpYzE2KCk7IAorICAgICAgICAgICAgd2hpbGUgKChyZWdpb25fYml0X2NvdW50ID4gMCkgJiYgKGFjY2EgPCAwKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKiBmcm9tIHdoaWxlIGxvb3AgKi8KKyAgICAgICAgICAgICAgICB0ZXN0KCk7CisgICAgICAgICAgICAgICAgdGVzdCgpOworICAgICAgICAgICAgICAgIGxvZ2ljMTYoKTsgCisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgdGVtcCA9IHN1YihjdXJyZW50X3dvcmRfYml0c19sZWZ0LG91dF93b3JkX2JpdHNfZnJlZSk7CisgICAgICAgICAgICAgICAgdGVzdCgpOworICAgICAgICAgICAgICAgIGlmICh0ZW1wID49IDApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB0ZW1wID0gc3ViKDMyLG91dF93b3JkX2JpdHNfZnJlZSk7CisgICAgICAgICAgICAgICAgICAgIGFjY2IgPSBMVV9zaHIoY3VycmVudF93b3JkLHRlbXApOworICAgICAgICAgICAgICAgICAgICBzbGljZSA9IChVV29yZDE2KWV4dHJhY3RfbChhY2NiKTsKKyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIG91dF93b3JkID0gYWRkKG91dF93b3JkLHNsaWNlKTsKKyAgICAKKyAgICAgICAgICAgICAgICAgICAgdGVzdCgpOworICAgICAgICAgICAgICAgICAgICBjdXJyZW50X3dvcmQgPDw9IG91dF93b3JkX2JpdHNfZnJlZTsKKworICAgICAgICAgICAgICAgICAgICBjdXJyZW50X3dvcmRfYml0c19sZWZ0ID0gc3ViKGN1cnJlbnRfd29yZF9iaXRzX2xlZnQsb3V0X3dvcmRfYml0c19mcmVlKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0X3dvcmRzW291dF93b3JkX2luZGV4KytdID0gZXh0cmFjdF9sKG91dF93b3JkKTsKKyAgICAgICAgICAgICAgICAgICAgbW92ZTE2KCk7CisKKyAgICAgICAgICAgICAgICAgICAgb3V0X3dvcmQgPSAwOworICAgICAgICAgICAgICAgICAgICBtb3ZlMTYoKTsKKworICAgICAgICAgICAgICAgICAgICBvdXRfd29yZF9iaXRzX2ZyZWUgPSAxNjsKKyAgICAgICAgICAgICAgICAgICAgbW92ZTE2KCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHRlbXAgPSBzdWIoMzIsY3VycmVudF93b3JkX2JpdHNfbGVmdCk7CisgICAgICAgICAgICAgICAgICAgIGFjY2IgPSBMVV9zaHIoY3VycmVudF93b3JkLHRlbXApOworICAgICAgICAgICAgICAgICAgICBzbGljZSA9IChVV29yZDE2KWV4dHJhY3RfbChhY2NiKTsKKyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIHRlbXAgPSBzdWIob3V0X3dvcmRfYml0c19mcmVlLGN1cnJlbnRfd29yZF9iaXRzX2xlZnQpOworICAgICAgICAgICAgICAgICAgICB0ZXN0KCk7CisgICAgICAgICAgICAgICAgICAgIGFjY2IgPSBzbGljZSA8PCB0ZW1wOworICAgICAgICAgICAgICAgICAgICBhY2NhID0gTF9kZXBvc2l0X2wob3V0X3dvcmQpOworICAgICAgICAgICAgICAgICAgICBhY2NhID0gTF9hZGQoYWNjYSxhY2NiKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0X3dvcmQgPSBleHRyYWN0X2woYWNjYSk7CisgICAgICAgICAgICAgICAgICAgIG91dF93b3JkX2JpdHNfZnJlZSA9IHN1YihvdXRfd29yZF9iaXRzX2ZyZWUsY3VycmVudF93b3JkX2JpdHNfbGVmdCk7CisgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICBjdXJyZW50X3dvcmRfYml0c19sZWZ0ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgbW92ZTE2KCk7CisgICAgICAgICAgICAgICAgfQorICAgIAorICAgICAgICAgICAgICAgIHRlc3QoKTsKKyAgICAgICAgICAgICAgICBpZiAoY3VycmVudF93b3JkX2JpdHNfbGVmdCA9PSAwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY3VycmVudF93b3JkID0gKmluX3dvcmRfcHRyKys7CisgICAgICAgICAgICAgICAgICAgIHJlZ2lvbl9iaXRfY291bnQgPSBzdWIocmVnaW9uX2JpdF9jb3VudCwzMik7CisgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAvKiBjdXJyZW50X3dvcmRfYml0c19sZWZ0ID0gTUlOKDMyLHJlZ2lvbl9iaXRfY291bnQpOyAqLworICAgICAgICAgICAgICAgICAgICB0ZW1wID0gc3ViKDMyLHJlZ2lvbl9iaXRfY291bnQpOworICAgICAgICAgICAgICAgICAgICB0ZXN0KCk7CisgICAgICAgICAgICAgICAgICAgIGlmKHRlbXAgPiAwKQorICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudF93b3JkX2JpdHNfbGVmdCA9IHJlZ2lvbl9iaXRfY291bnQ7CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRfd29yZF9iaXRzX2xlZnQgPSAzMjsKKyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGFjY2EgPSBMX2RlcG9zaXRfbChvdXRfd29yZF9pbmRleCk7CisgICAgICAgICAgICAgICAgYWNjYSA9IExfc2hsX25vY2hlY2soYWNjYSw0KTsKKyAgICAgICAgICAgICAgICBhY2NhID0gTF9zdWIoYWNjYSxudW1iZXJfb2ZfYml0c19wZXJfZnJhbWUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYWNjYiA9IExfZGVwb3NpdF9sKG91dF93b3JkX2luZGV4KTsKKyAgICAgICAgICAgIGFjY2IgPSBMX3NobF9ub2NoZWNrKGFjY2IsNCk7CisgICAgICAgICAgICBhY2NiID0gTF9zdWIoYWNjYixudW1iZXJfb2ZfYml0c19wZXJfZnJhbWUpOworICAgICAgICB9CisgICAgfQorCisgICAgLyogRmlsbCBvdXQgd2l0aCAxJ3MuICovCisKKyAgICB0ZXN0KCk7CisgICAgd2hpbGUgKGFjY2EgPCAwKQorICAgIHsKKyAgICAgICAgdGVzdCgpOworICAgICAgICBjdXJyZW50X3dvcmQgPSAweDAwMDBmZmZmOworICAgICAgICBtb3ZlMzIoKTsKKworICAgICAgICB0ZW1wID0gc3ViKDE2LG91dF93b3JkX2JpdHNfZnJlZSk7CisgICAgICAgIGFjY2EgPSBMVV9zaHIoY3VycmVudF93b3JkLHRlbXApOworICAgICAgICBzbGljZSA9IChVV29yZDE2KWV4dHJhY3RfbChhY2NhKTsKKworICAgICAgICBvdXRfd29yZCA9IGFkZChvdXRfd29yZCxzbGljZSk7CisgICAgICAgIG91dF93b3Jkc1tvdXRfd29yZF9pbmRleCsrXSA9IG91dF93b3JkOworICAgICAgICBtb3ZlMTYoKTsKKworICAgICAgICBvdXRfd29yZCA9IDA7CisgICAgICAgIG1vdmUxNigpOworICAgICAgICAKKyAgICAgICAgb3V0X3dvcmRfYml0c19mcmVlID0gMTY7CisgICAgICAgIG1vdmUxNigpOworICAgICAgICAKKyAgICAgICAgYWNjYSA9IExfZGVwb3NpdF9sKG91dF93b3JkX2luZGV4KTsKKyAgICAgICAgYWNjYSA9IExfc2hsX25vY2hlY2soYWNjYSw0KTsKKyAgICAgICAgYWNjYSA9IExfc3ViKGFjY2EsbnVtYmVyX29mX2JpdHNfcGVyX2ZyYW1lKTsKKyAgICB9Cit9CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgRnVuY3Rpb246ICAgIGFkanVzdF9hYnNfcmVnaW9uX3Bvd2VyX2luZGV4CisKKyBTeW50YXg6ICAgICAgYWRqdXN0X2Fic19yZWdpb25fcG93ZXJfaW5kZXgoV29yZDE2ICphYnNvbHV0ZV9yZWdpb25fcG93ZXJfaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiAqbWx0X2NvZWZzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgbnVtYmVyX29mX3JlZ2lvbnMpCisKKyAgICAgICAgICAgICAgaW5wdXRzOiAgICptbHRfY29lZnMKKyAgICAgICAgICAgICAgICAgICAgICAgICphYnNvbHV0ZV9yZWdpb25fcG93ZXJfaW5kZXgKKyAgICAgICAgICAgICAgICAgICAgICAgIG51bWJlcl9vZl9yZWdpb25zCisgICAgICAgICAgICAKKyAgICAgICAgICAgICAgb3V0cHV0czogICphYnNvbHV0ZV9yZWdpb25fcG93ZXJfaW5kZXgKKyAKKyBEZXNjcmlwdGlvbjogQWRqdXN0cyB0aGUgYWJzb2x1dGUgcG93ZXIgaW5kZXgKKyAKKyAKKyBXTU9QUzogICAgIDdrSHogfCAgICAyNGtiaXQgICAgfCAgICAgIDMya2JpdAorICAgICAgICAgIC0tLS0tLS18LS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLQorICAgICAgICAgICAgQVZHICB8ICAgIDAuMDMgICAgICB8ICAgICAgMC4wMworICAgICAgICAgIC0tLS0tLS18LS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLSAgCisgICAgICAgICAgICBNQVggIHwgICAgMC4xMiAgICAgIHwgICAgICAwLjEyCisgICAgICAgICAgLS0tLS0tLXwtLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tIAorCisgICAgICAgICAgIDE0a0h6IHwgICAgMjRrYml0ICAgIHwgICAgIDMya2JpdCAgICAgfCAgICAgNDhrYml0CisgICAgICAgICAgLS0tLS0tLXwtLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgICAgIEFWRyAgfCAgICAwLjAzICAgICAgfCAgICAgMC4wMyAgICAgICB8ICAgICAwLjAzCisgICAgICAgICAgLS0tLS0tLXwtLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgICAgIE1BWCAgfCAgICAwLjE0ICAgICAgfCAgICAgMC4xNCAgICAgICB8ICAgICAwLjE0CisgICAgICAgICAgLS0tLS0tLXwtLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0KKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBhZGp1c3RfYWJzX3JlZ2lvbl9wb3dlcl9pbmRleChXb3JkMTYgKmFic29sdXRlX3JlZ2lvbl9wb3dlcl9pbmRleCxXb3JkMTYgKm1sdF9jb2VmcyxXb3JkMTYgbnVtYmVyX29mX3JlZ2lvbnMpCit7CisgICAgV29yZDE2IG4saTsKKyAgICBXb3JkMTYgcmVnaW9uOworICAgIFdvcmQxNiAqcmF3X21sdF9wdHI7CisgICAgCisgICAgV29yZDMyIGFjY2E7CisgICAgV29yZDE2IHRlbXA7CisKKyAgICBmb3IgKHJlZ2lvbj0wOyByZWdpb248bnVtYmVyX29mX3JlZ2lvbnM7IHJlZ2lvbisrKQorICAgIHsKKyAgICAgICAgbiA9IHN1YihhYnNvbHV0ZV9yZWdpb25fcG93ZXJfaW5kZXhbcmVnaW9uXSwzOSk7CisgICAgICAgIG4gPSBzaHJfbm9jaGVjayhuLDEpOworICAgICAgICAKKyAgICAgICAgdGVzdCgpOworICAgICAgICBpZiAobiA+IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIHRlbXAgPSBleHRyYWN0X2woTF9tdWx0MChyZWdpb24sUkVHSU9OX1NJWkUpKTsKKworICAgICAgICAgICAgcmF3X21sdF9wdHIgPSAmbWx0X2NvZWZzW3RlbXBdOworCisgICAgICAgICAgICBmb3IgKGk9MDsgaTxSRUdJT05fU0laRTsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFjY2EgPSBMX3NobF9ub2NoZWNrKCpyYXdfbWx0X3B0ciwxNik7CisgICAgICAgICAgICAgICAgYWNjYSA9IExfYWRkKGFjY2EsMzI3NjhMKTsKKyAgICAgICAgICAgICAgICBhY2NhID0gTF9zaHJfbm9jaGVjayhhY2NhLG4pOworICAgICAgICAgICAgICAgIGFjY2EgPSBMX3Nocl9ub2NoZWNrKGFjY2EsMTYpOworICAgICAgICAgICAgICAgICpyYXdfbWx0X3B0cisrID0gZXh0cmFjdF9sKGFjY2EpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB0ZW1wID0gc2hsX25vY2hlY2sobiwxKTsKKyAgICAgICAgICAgIHRlbXAgPSBzdWIoYWJzb2x1dGVfcmVnaW9uX3Bvd2VyX2luZGV4W3JlZ2lvbl0sdGVtcCk7CisgICAgICAgICAgICBhYnNvbHV0ZV9yZWdpb25fcG93ZXJfaW5kZXhbcmVnaW9uXSA9IHRlbXA7CisgICAgICAgICAgICBtb3ZlMTYoKTsKKyAgICAgICAgfQorICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorIEZ1bmN0aW9uOiAgICBjb21wdXRlX3JlZ2lvbl9wb3dlcnMKKworIFN5bnRheDogICAgICBXb3JkMTYgY29tcHV0ZV9yZWdpb25fcG93ZXJzKFdvcmQxNiAgKm1sdF9jb2VmcywgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2ICBtYWdfc2hpZnQsICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiAgKmRycF9udW1fYml0cywgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVdvcmQxNiAqZHJwX2NvZGVfYml0cywgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgICphYnNvbHV0ZV9yZWdpb25fcG93ZXJfaW5kZXgsICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiAgbnVtYmVyX29mX3JlZ2lvbnMpCisgICAgICAgICAgICAgICAgbWx0X2NvZWZzW0RDVF9MRU5HVEhdOyAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBtYWdfc2hpZnQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgZHJwX251bV9iaXRzW01BWF9OVU1CRVJfT0ZfUkVHSU9OU107ICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIGRycF9jb2RlX2JpdHNbTUFYX05VTUJFUl9PRl9SRUdJT05TXTsgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBhYnNvbHV0ZV9yZWdpb25fcG93ZXJfaW5kZXhbTUFYX05VTUJFUl9PRl9SRUdJT05TXTsgICAgICAgCisgICAgICAgICAgICAgICAgbnVtYmVyX29mX3JlZ2lvbnM7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgRGVzY3JpcHRpb246IENvbXB1dGVzIHRoZSBwb3dlciBmb3IgZWFjaCBvZiB0aGUgcmVnaW9ucworCisgCisgV01PUFM6ICAgICA3a0h6IHwgICAgMjRrYml0ICAgIHwgICAgMzJrYml0CisgICAgICAgICAgLS0tLS0tLXwtLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tCisgICAgICAgICAgICBBVkcgIHwgICAgMC4wOSAgICAgIHwgICAgMC4wOQorICAgICAgICAgIC0tLS0tLS18LS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLSAgCisgICAgICAgICAgICBNQVggIHwgICAgMC4xMyAgICAgIHwgICAgMC4xMworICAgICAgICAgIC0tLS0tLS18LS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLSAKKworICAgICAgICAgICAxNGtIeiB8ICAgIDI0a2JpdCAgICB8ICAgICAzMmtiaXQgICAgIHwgICAgIDQ4a2JpdAorICAgICAgICAgIC0tLS0tLS18LS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tCisgICAgICAgICAgICBBVkcgIHwgICAgMC4yMCAgICAgIHwgICAgIDAuMjAgICAgICAgfCAgICAgMC4yMAorICAgICAgICAgIC0tLS0tLS18LS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tCisgICAgICAgICAgICBNQVggIHwgICAgMC4yOSAgICAgIHwgICAgIDAuMjkgICAgICAgfCAgICAgMC4yOQorICAgICAgICAgIC0tLS0tLS18LS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworV29yZDE2IGNvbXB1dGVfcmVnaW9uX3Bvd2VycyhXb3JkMTYgICptbHRfY29lZnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiAgbWFnX3NoaWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgICpkcnBfbnVtX2JpdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVXb3JkMTYgKmRycF9jb2RlX2JpdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiAgKmFic29sdXRlX3JlZ2lvbl9wb3dlcl9pbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2ICBudW1iZXJfb2ZfcmVnaW9ucykKK3sKKworICAgIFdvcmQxNiAqaW5wdXRfcHRyOworICAgIFdvcmQzMiBsb25nX2FjY3VtdWxhdG9yOworICAgIFdvcmQxNiBpdGVtcDE7CisgICAgV29yZDE2IHBvd2VyX3NoaWZ0OworICAgIFdvcmQxNiByZWdpb247CisgICAgV29yZDE2IGo7CisgICAgV29yZDE2IGRpZmZlcmVudGlhbF9yZWdpb25fcG93ZXJfaW5kZXhbTUFYX05VTUJFUl9PRl9SRUdJT05TXTsKKyAgICBXb3JkMTYgbnVtYmVyX29mX2JpdHM7CisgICAgCisgICAgV29yZDMyIGFjY2E7CisgICAgV29yZDE2IHRlbXA7CisgICAgV29yZDE2IHRlbXAxOworICAgIFdvcmQxNiB0ZW1wMjsKKworCisgICAgaW5wdXRfcHRyID0gbWx0X2NvZWZzOworICAgIGZvciAocmVnaW9uPTA7IHJlZ2lvbjxudW1iZXJfb2ZfcmVnaW9uczsgcmVnaW9uKyspCisgICAgeworICAgICAgICBsb25nX2FjY3VtdWxhdG9yID0gTF9kZXBvc2l0X2woMCk7CisKKyAgICAgICAgZm9yIChqPTA7IGo8UkVHSU9OX1NJWkU7IGorKykKKyAgICAgICAgeworICAgICAgICAgICAgaXRlbXAxID0gKmlucHV0X3B0cisrOworICAgICAgICAgICAgbW92ZTE2KCk7CisgICAgICAgICAgICBsb25nX2FjY3VtdWxhdG9yID0gTF9tYWMwKGxvbmdfYWNjdW11bGF0b3IsaXRlbXAxLGl0ZW1wMSk7CisgICAgICAgIH0KKworICAgICAgICBwb3dlcl9zaGlmdCA9IDA7CisgICAgICAgIG1vdmUxNigpOworCisgICAgICAgIGFjY2EgPSAobG9uZ19hY2N1bXVsYXRvciAmIDB4N2ZmZjAwMDBMKTsKKyAgICAgICAgbG9naWMzMigpOworCisgICAgICAgIHRlc3QoKTsKKyAgICAgICAgd2hpbGUgKGFjY2EgPiAwKQorICAgICAgICB7CisgICAgICAgICAgICB0ZXN0KCk7CisgICAgICAgICAgICBsb25nX2FjY3VtdWxhdG9yID0gTF9zaHJfbm9jaGVjayhsb25nX2FjY3VtdWxhdG9yLDEpOworICAgICAgICAgICAgCisgICAgICAgICAgICBhY2NhID0gKGxvbmdfYWNjdW11bGF0b3IgJiAweDdmZmYwMDAwTCk7CisgICAgICAgICAgICBsb2dpYzMyKCk7CisKKyAgICAgICAgICAgIHBvd2VyX3NoaWZ0ID0gYWRkKHBvd2VyX3NoaWZ0LDEpOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBhY2NhID0gTF9zdWIobG9uZ19hY2N1bXVsYXRvciwzMjc2Nyk7CisgICAgICAgIAorICAgICAgICB0ZW1wID0gYWRkKHBvd2VyX3NoaWZ0LDE1KTsKKyAgICAgICAgdGVzdCgpOworICAgICAgICB0ZXN0KCk7CisgICAgICAgIGxvZ2ljMTYoKTsKKyAgICAgICAgd2hpbGUgKChhY2NhIDw9IDApICYmICh0ZW1wID49IDApKQorICAgICAgICB7CisgICAgICAgICAgICB0ZXN0KCk7CisgICAgICAgICAgICB0ZXN0KCk7CisgICAgICAgICAgICBsb2dpYzE2KCk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGxvbmdfYWNjdW11bGF0b3IgPSBMX3NobF9ub2NoZWNrKGxvbmdfYWNjdW11bGF0b3IsMSk7CisgICAgICAgICAgICBhY2NhID0gTF9zdWIobG9uZ19hY2N1bXVsYXRvciwzMjc2Nyk7CisgICAgICAgICAgICBwb3dlcl9zaGlmdC0tOworICAgICAgICAgICAgdGVtcCA9IGFkZChwb3dlcl9zaGlmdCwxNSk7CisgICAgICAgIH0KKyAgICAgICAgbG9uZ19hY2N1bXVsYXRvciA9IExfc2hyX25vY2hlY2sobG9uZ19hY2N1bXVsYXRvciwxKTsKKyAgICAgICAgLyogMjg5NjMgY29ycmVzcG9uZHMgdG8gc3F1YXJlIHJvb3Qgb2YgMiB0aW1lcyBSRUdJT05fU0laRSgyMCkuICovCisgICAgICAgIGFjY2EgPSBMX3N1Yihsb25nX2FjY3VtdWxhdG9yLDI4OTYzKTsKKyAgICAgICAgCisgICAgICAgIHRlc3QoKTsKKyAgICAgICAgaWYgKGFjY2EgPj0gMCkKKyAgICAgICAgICAgIHBvd2VyX3NoaWZ0ID0gYWRkKHBvd2VyX3NoaWZ0LDEpOworICAgICAgICAKKyAgICAgICAgYWNjYSA9IExfZGVwb3NpdF9sKG1hZ19zaGlmdCk7CisgICAgICAgIGFjY2EgPSBMX3NobF9ub2NoZWNrKGFjY2EsMSk7CisgICAgICAgIGFjY2EgPSBMX3N1Yihwb3dlcl9zaGlmdCxhY2NhKTsKKyAgICAgICAgYWNjYSA9IExfYWRkKDM1LGFjY2EpOworICAgICAgICBhY2NhID0gTF9zdWIoYWNjYSxSRUdJT05fUE9XRVJfVEFCTEVfTlVNX05FR0FUSVZFUyk7CisgICAgICAgIGFic29sdXRlX3JlZ2lvbl9wb3dlcl9pbmRleFtyZWdpb25dID0gZXh0cmFjdF9sKGFjY2EpOworICAgIH0KKworCisgICAgLyogQmVmb3JlIHdlIGRpZmZlcmVudGlhbGx5IGVuY29kZSB0aGUgcXVhbnRpemVkIHJlZ2lvbiBwb3dlcnMsIGFkanVzdCB1cHdhcmQgdGhlCisgICAgdmFsbGV5cyB0byBtYWtlIHN1cmUgYWxsIHRoZSBwZWFrcyBjYW4gYmUgYWNjdXJhdGVseSByZXByZXNlbnRlZC4gKi8KKyAgICB0ZW1wID0gc3ViKG51bWJlcl9vZl9yZWdpb25zLDIpOworCisgICAgZm9yIChyZWdpb24gPSB0ZW1wOyByZWdpb24gPj0gMDsgcmVnaW9uLS0pCisgICAgeworICAgICAgICB0ZW1wMSA9IHN1YihhYnNvbHV0ZV9yZWdpb25fcG93ZXJfaW5kZXhbcmVnaW9uKzFdLERSUF9ESUZGX01BWCk7CisgICAgICAgIHRlbXAyID0gc3ViKGFic29sdXRlX3JlZ2lvbl9wb3dlcl9pbmRleFtyZWdpb25dLHRlbXAxKTsKKyAgICAgICAgdGVzdCgpOworICAgICAgICBpZiAodGVtcDIgPCAwKQorICAgICAgICB7CisgICAgICAgICAgICBhYnNvbHV0ZV9yZWdpb25fcG93ZXJfaW5kZXhbcmVnaW9uXSA9IHRlbXAxOworICAgICAgICAgICAgbW92ZTE2KCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBUaGUgTUxUIGlzIGN1cnJlbnRseSBzY2FsZWQgdG9vIGxvdyBieSB0aGUgZmFjdG9yCisgICAgICAgRU5DT0RFUl9TQ0FMRV9GQUNUT1IoPTE4MzE4KS8zMjc2OCAqICgxLi9zcXJ0KDE2MCkuCisgICAgICAgVGhpcyBpcyB0aGUgbmludGggcG93ZXIgb2YgMSBvdmVyIHRoZSBzcXVhcmUgcm9vdCBvZiAyLgorICAgICAgIFNvIGxhdGVyIHdlIHdpbGwgYWRkIEVTRl9BREpVU1RNRU5UX1RPX1JNU19JTkRFWCAobm93IDkpCisgICAgICAgdG8gZHJwX2NvZGVfYml0c1swXS4gKi8KKworICAgIC8qIGRycF9jb2RlX2JpdHNbMF0gY2FuIHJhbmdlIGZyb20gMSB0byAzMS4gMCB3aWxsIGJlIHVzZWQgb25seSBhcyBhbiBlc2NhcGUgc2VxdWVuY2UuICovCisgICAgdGVtcDEgPSBzdWIoMSxFU0ZfQURKVVNUTUVOVF9UT19STVNfSU5ERVgpOworICAgIHRlbXAyID0gc3ViKGFic29sdXRlX3JlZ2lvbl9wb3dlcl9pbmRleFswXSx0ZW1wMSk7CisgICAgdGVzdCgpOworICAgIGlmICh0ZW1wMiA8IDApCisgICAgeworICAgICAgICBhYnNvbHV0ZV9yZWdpb25fcG93ZXJfaW5kZXhbMF0gPSB0ZW1wMTsKKyAgICAgICAgbW92ZTE2KCk7CisgICAgfQorICAgIAorICAgIHRlbXAxID0gc3ViKDMxLEVTRl9BREpVU1RNRU5UX1RPX1JNU19JTkRFWCk7CisKKwkvKgorCSAqIFRoZSBuZXh0IGxpbmUgd2FzIGNvcnJlY3RlZCBpbiBSZWxlYXNlIDEuMiAKKwkgKi8KKworICAgIHRlbXAyID0gc3ViKGFic29sdXRlX3JlZ2lvbl9wb3dlcl9pbmRleFswXSwgdGVtcDEpOyAgCisgICAgdGVzdCgpOworICAgIGlmICh0ZW1wMiA+IDApCisgICAgeworICAgICAgICBhYnNvbHV0ZV9yZWdpb25fcG93ZXJfaW5kZXhbMF0gPSB0ZW1wMTsKKyAgICAgICAgbW92ZTE2KCk7CisgICAgfQorCisgICAgZGlmZmVyZW50aWFsX3JlZ2lvbl9wb3dlcl9pbmRleFswXSA9IGFic29sdXRlX3JlZ2lvbl9wb3dlcl9pbmRleFswXTsKKyAgICBtb3ZlMTYoKTsKKyAgICAKKyAgICBudW1iZXJfb2ZfYml0cyA9IDU7CisgICAgbW92ZTE2KCk7CisgICAgCisgICAgZHJwX251bV9iaXRzWzBdID0gNTsKKyAgICBtb3ZlMTYoKTsKKyAgICAKKyAgICBkcnBfY29kZV9iaXRzWzBdID0gKFVXb3JkMTYpYWRkKGFic29sdXRlX3JlZ2lvbl9wb3dlcl9pbmRleFswXSxFU0ZfQURKVVNUTUVOVF9UT19STVNfSU5ERVgpOworICAgIG1vdmUxNigpOworCisgICAgLyogTG93ZXIgbGltaXQgdGhlIGFic29sdXRlIHJlZ2lvbiBwb3dlciBpbmRpY2VzIHRvIC04IGFuZCB1cHBlciBsaW1pdCB0aGVtIHRvIDMxLiBTdWNoIGV4dHJlbWVzCisgICAgIG1heSBiZSBtYXRoZW1hdGljYWxseSBpbXBvc3NpYmxlIGFueXdheS4qLworICAgIGZvciAocmVnaW9uPTE7IHJlZ2lvbjxudW1iZXJfb2ZfcmVnaW9uczsgcmVnaW9uKyspCisgICAgeworICAgICAgICB0ZW1wMSA9IHN1YigtOCxFU0ZfQURKVVNUTUVOVF9UT19STVNfSU5ERVgpOworICAgICAgICB0ZW1wMiA9IHN1YihhYnNvbHV0ZV9yZWdpb25fcG93ZXJfaW5kZXhbcmVnaW9uXSx0ZW1wMSk7CisgICAgICAgIHRlc3QoKTsKKyAgICAgICAgaWYgKHRlbXAyIDwgMCkKKyAgICAgICAgeworICAgICAgICAgICAgYWJzb2x1dGVfcmVnaW9uX3Bvd2VyX2luZGV4W3JlZ2lvbl0gPSB0ZW1wMTsKKyAgICAgICAgICAgIG1vdmUxNigpOworICAgICAgICB9CisKKyAgICAgICAgdGVtcDEgPSBzdWIoMzEsRVNGX0FESlVTVE1FTlRfVE9fUk1TX0lOREVYKTsKKyAgICAgICAgdGVtcDIgPSBzdWIoYWJzb2x1dGVfcmVnaW9uX3Bvd2VyX2luZGV4W3JlZ2lvbl0sdGVtcDEpOworICAgICAgICB0ZXN0KCk7CisgICAgICAgIGlmICh0ZW1wMiA+IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIGFic29sdXRlX3JlZ2lvbl9wb3dlcl9pbmRleFtyZWdpb25dID0gdGVtcDE7CisgICAgICAgICAgICBtb3ZlMTYoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGZvciAocmVnaW9uPTE7IHJlZ2lvbjxudW1iZXJfb2ZfcmVnaW9uczsgcmVnaW9uKyspCisgICAgeworICAgICAgICBqID0gc3ViKGFic29sdXRlX3JlZ2lvbl9wb3dlcl9pbmRleFtyZWdpb25dLGFic29sdXRlX3JlZ2lvbl9wb3dlcl9pbmRleFtyZWdpb24tMV0pOworICAgICAgICB0ZW1wID0gc3ViKGosRFJQX0RJRkZfTUlOKTsKKyAgICAgICAgdGVzdCgpOworICAgICAgICBpZiAodGVtcCA8IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIGogPSBEUlBfRElGRl9NSU47CisgICAgICAgIH0KKyAgICAgICAgaiA9IHN1YihqLERSUF9ESUZGX01JTik7CisgICAgICAgIG1vdmUxNigpOworICAgICAgICBkaWZmZXJlbnRpYWxfcmVnaW9uX3Bvd2VyX2luZGV4W3JlZ2lvbl0gPSBqOworICAgICAgICBtb3ZlMTYoKTsKKyAgICAgICAgCisgICAgICAgIHRlbXAgPSBhZGQoYWJzb2x1dGVfcmVnaW9uX3Bvd2VyX2luZGV4W3JlZ2lvbi0xXSxkaWZmZXJlbnRpYWxfcmVnaW9uX3Bvd2VyX2luZGV4W3JlZ2lvbl0pOworICAgICAgICB0ZW1wID0gYWRkKHRlbXAsRFJQX0RJRkZfTUlOKTsKKyAgICAgICAgYWJzb2x1dGVfcmVnaW9uX3Bvd2VyX2luZGV4W3JlZ2lvbl0gPSB0ZW1wOworICAgICAgICBtb3ZlMTYoKTsKKworICAgICAgICBudW1iZXJfb2ZfYml0cyA9IGFkZChudW1iZXJfb2ZfYml0cyxkaWZmZXJlbnRpYWxfcmVnaW9uX3Bvd2VyX2JpdHNbcmVnaW9uXVtqXSk7CisgICAgICAgIGRycF9udW1fYml0c1tyZWdpb25dID0gZGlmZmVyZW50aWFsX3JlZ2lvbl9wb3dlcl9iaXRzW3JlZ2lvbl1bal07CisgICAgICAgIG1vdmUxNigpOworICAgICAgICBkcnBfY29kZV9iaXRzW3JlZ2lvbl0gPSBkaWZmZXJlbnRpYWxfcmVnaW9uX3Bvd2VyX2NvZGVzW3JlZ2lvbl1bal07CisgICAgICAgIG1vdmUxNigpOworICAgIH0KKworICAgIHJldHVybiAobnVtYmVyX29mX2JpdHMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgRnVuY3Rpb246ICAgIHZlY3Rvcl9xdWFudGl6ZV9tbHRzCisKKyBTeW50YXg6ICAgICAgdm9pZCB2ZWN0b3JfcXVhbnRpemVfbWx0cyhudW1iZXJfb2ZfYXZhaWxhYmxlX2JpdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtYmVyX29mX3JlZ2lvbnMsICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtX2NhdGVnb3JpemF0aW9uX2NvbnRyb2xfcG9zc2liaWxpdGllcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbHRfY29lZnMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJzb2x1dGVfcmVnaW9uX3Bvd2VyX2luZGV4LCAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvd2VyX2NhdGVnb3JpZXMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXRlZ29yeV9iYWxhbmNlcywgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9jYXRlZ29yaXphdGlvbl9jb250cm9sLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpb25fbWx0X2JpdF9jb3VudHMsICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaW9uX21sdF9iaXRzKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgIFdvcmQxNiBudW1iZXJfb2ZfYXZhaWxhYmxlX2JpdHM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICBXb3JkMTYgbnVtYmVyX29mX3JlZ2lvbnM7CisgICAgICAgICAgICAgIFdvcmQxNiBudW1fY2F0ZWdvcml6YXRpb25fY29udHJvbF9wb3NzaWJpbGl0aWVzOworICAgICAgICAgICAgICBXb3JkMTYgbWx0X2NvZWZzW0RDVF9MRU5HVEhdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgIFdvcmQxNiBhYnNvbHV0ZV9yZWdpb25fcG93ZXJfaW5kZXhbTUFYX05VTUJFUl9PRl9SRUdJT05TXTsgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgV29yZDE2IHBvd2VyX2NhdGVnb3JpZXNbTUFYX05VTUJFUl9PRl9SRUdJT05TXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICBXb3JkMTYgY2F0ZWdvcnlfYmFsYW5jZXNbTUFYX05VTV9DQVRFR09SSVpBVElPTl9DT05UUk9MX1BPU1NJQklMSVRJRVMtMV07ICAgICAgICAgCisgICAgICAgICAgICAgIFdvcmQxNiAqcF9jYXRlZ29yaXphdGlvbl9jb250cm9sOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgV29yZDE2IHJlZ2lvbl9tbHRfYml0X2NvdW50c1tNQVhfTlVNQkVSX09GX1JFR0lPTlNdOyAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICBXb3JkMzIgcmVnaW9uX21sdF9iaXRzWzQqTUFYX05VTUJFUl9PRl9SRUdJT05TXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisKKyBEZXNjcmlwdGlvbjogU2NhbGFyIHF1YW50aXplZCB2ZWN0b3IgSHVmZm1hbiBjb2RpbmcgKFNRVkgpCisKKyAKKyBXTU9QUzogICAgIDdrSHogfCAgICAyNGtiaXQgICAgfCAgICAgMzJrYml0CisgICAgICAgICAgLS0tLS0tLXwtLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tCisgICAgICAgICAgICBBVkcgIHwgICAgMC41NyAgICAgIHwgICAgIDAuNjUKKyAgICAgICAgICAtLS0tLS0tfC0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0gIAorICAgICAgICAgICAgTUFYICB8ICAgIDAuNzggICAgICB8ICAgICAwLjgzCisgICAgICAgICAgLS0tLS0tLXwtLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tIAorCisgICAgICAgICAgIDE0a0h6IHwgICAgMjRrYml0ICAgIHwgICAgIDMya2JpdCAgICAgfCAgICAgNDhrYml0CisgICAgICAgICAgLS0tLS0tLXwtLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgICAgIEFWRyAgfCAgICAwLjYyICAgICAgfCAgICAgMC45MCAgICAgICB8ICAgICAxLjExCisgICAgICAgICAgLS0tLS0tLXwtLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgICAgIE1BWCAgfCAgICAxLjE2ICAgICAgfCAgICAgMS4zOSAgICAgICB8ICAgICAxLjU0CisgICAgICAgICAgLS0tLS0tLXwtLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0KKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit2b2lkIHZlY3Rvcl9xdWFudGl6ZV9tbHRzKFdvcmQxNiBudW1iZXJfb2ZfYXZhaWxhYmxlX2JpdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiBudW1iZXJfb2ZfcmVnaW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2IG51bV9jYXRlZ29yaXphdGlvbl9jb250cm9sX3Bvc3NpYmlsaXRpZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiAqbWx0X2NvZWZzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgKmFic29sdXRlX3JlZ2lvbl9wb3dlcl9pbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2ICpwb3dlcl9jYXRlZ29yaWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgKmNhdGVnb3J5X2JhbGFuY2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgKnBfY2F0ZWdvcml6YXRpb25fY29udHJvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2ICpyZWdpb25fbWx0X2JpdF9jb3VudHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFVXb3JkMzIgKnJlZ2lvbl9tbHRfYml0cykKK3sKKworICAgIFdvcmQxNiAqcmF3X21sdF9wdHI7CisgICAgV29yZDE2IHJlZ2lvbjsKKyAgICBXb3JkMTYgY2F0ZWdvcnk7CisgICAgV29yZDE2IHRvdGFsX21sdF9iaXRzID0gMDsKKworICAgIFdvcmQxNiB0ZW1wOworICAgIFdvcmQxNiB0ZW1wMTsKKyAgICBXb3JkMTYgdGVtcDI7CisKKyAgICAvKiBTdGFydCBpbiB0aGUgbWlkZGxlIG9mIHRoZSBjYXRlZ29yaXphdGlvbiBjb250cm9sIHJhbmdlLiAqLworICAgIHRlbXAgPSBzaHJfbm9jaGVjayhudW1fY2F0ZWdvcml6YXRpb25fY29udHJvbF9wb3NzaWJpbGl0aWVzLDEpOworICAgIHRlbXAgPSBzdWIodGVtcCwxKTsKKyAgICBmb3IgKCpwX2NhdGVnb3JpemF0aW9uX2NvbnRyb2wgPSAwOyAqcF9jYXRlZ29yaXphdGlvbl9jb250cm9sIDwgdGVtcDsgKCpwX2NhdGVnb3JpemF0aW9uX2NvbnRyb2wpKyspCisgICAgeworICAgICAgICByZWdpb24gPSBjYXRlZ29yeV9iYWxhbmNlc1sqcF9jYXRlZ29yaXphdGlvbl9jb250cm9sXTsKKyAgICAgICAgbW92ZTE2KCk7CisgICAgICAgIHBvd2VyX2NhdGVnb3JpZXNbcmVnaW9uXSA9IGFkZChwb3dlcl9jYXRlZ29yaWVzW3JlZ2lvbl0sMSk7CisgICAgICAgIG1vdmUxNigpOworICAgIH0KKworICAgIGZvciAocmVnaW9uPTA7IHJlZ2lvbjxudW1iZXJfb2ZfcmVnaW9uczsgcmVnaW9uKyspCisgICAgeworICAgICAgICBjYXRlZ29yeSA9IHBvd2VyX2NhdGVnb3JpZXNbcmVnaW9uXTsKKyAgICAgICAgbW92ZTE2KCk7CisgICAgICAgIHRlbXAgPSBleHRyYWN0X2woTF9tdWx0MChyZWdpb24sUkVHSU9OX1NJWkUpKTsKKyAgICAgICAgcmF3X21sdF9wdHIgPSAmbWx0X2NvZWZzW3RlbXBdOworICAgICAgICBtb3ZlMTYoKTsKKyAgICAgICAgdGVtcCA9IHN1YihjYXRlZ29yeSwoTlVNX0NBVEVHT1JJRVMtMSkpOworICAgICAgICB0ZXN0KCk7CisgICAgICAgIGlmICh0ZW1wIDwgMCkKKyAgICAgICAgeworICAgICAgICAgICAgcmVnaW9uX21sdF9iaXRfY291bnRzW3JlZ2lvbl0gPQorICAgICAgICAgICAgdmVjdG9yX2h1ZmZtYW4oY2F0ZWdvcnksIGFic29sdXRlX3JlZ2lvbl9wb3dlcl9pbmRleFtyZWdpb25dLHJhd19tbHRfcHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlZ2lvbl9tbHRfYml0c1tzaGxfbm9jaGVjayhyZWdpb24sMildKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHJlZ2lvbl9tbHRfYml0X2NvdW50c1tyZWdpb25dID0gMDsKKyAgICAgICAgICAgIG1vdmUxNigpOworICAgICAgICB9CisgICAgICAgIHRvdGFsX21sdF9iaXRzID0gYWRkKHRvdGFsX21sdF9iaXRzLHJlZ2lvbl9tbHRfYml0X2NvdW50c1tyZWdpb25dKTsKKyAgICB9CisKKworICAgIC8qIElmIHRvbyBmZXcgYml0cy4uLiAqLworICAgIHRlbXAgPSBzdWIodG90YWxfbWx0X2JpdHMsbnVtYmVyX29mX2F2YWlsYWJsZV9iaXRzKTsKKyAgICB0ZXN0KCk7CisgICAgdGVzdCgpOworICAgIGxvZ2ljMTYoKTsKKyAgICB3aGlsZSAoKHRlbXAgPCAwKSAmJiAoKnBfY2F0ZWdvcml6YXRpb25fY29udHJvbCA+IDApKQorICAgIHsKKyAgICAgICAgdGVzdCgpOworICAgICAgICB0ZXN0KCk7CisgICAgICAgIGxvZ2ljMTYoKTsKKyAgICAgICAgKCpwX2NhdGVnb3JpemF0aW9uX2NvbnRyb2wpLS07CisgICAgICAgIHJlZ2lvbiA9IGNhdGVnb3J5X2JhbGFuY2VzWypwX2NhdGVnb3JpemF0aW9uX2NvbnRyb2xdOworICAgICAgICBtb3ZlMTYoKTsKKyAgICAgICAgCisgICAgICAgIHBvd2VyX2NhdGVnb3JpZXNbcmVnaW9uXSA9IHN1Yihwb3dlcl9jYXRlZ29yaWVzW3JlZ2lvbl0sMSk7CisgICAgICAgIG1vdmUxNigpOworCisgICAgICAgIHRvdGFsX21sdF9iaXRzID0gc3ViKHRvdGFsX21sdF9iaXRzLHJlZ2lvbl9tbHRfYml0X2NvdW50c1tyZWdpb25dKTsKKyAgICAgICAgY2F0ZWdvcnkgPSBwb3dlcl9jYXRlZ29yaWVzW3JlZ2lvbl07CisgICAgICAgIG1vdmUxNigpOworICAgICAgICAKKyAgICAgICAgcmF3X21sdF9wdHIgPSAmbWx0X2NvZWZzW3JlZ2lvbipSRUdJT05fU0laRV07CisgICAgICAgIG1vdmUxNigpOworICAgICAgICAKKyAgICAgICAgdGVtcCA9IHN1YihjYXRlZ29yeSwoTlVNX0NBVEVHT1JJRVMtMSkpOworICAgICAgICB0ZXN0KCk7CisgICAgICAgIGlmICh0ZW1wIDwgMCkKKyAgICAgICAgeworICAgICAgICAgICAgcmVnaW9uX21sdF9iaXRfY291bnRzW3JlZ2lvbl0gPQorICAgICAgICAgICAgICAgIHZlY3Rvcl9odWZmbWFuKGNhdGVnb3J5LCBhYnNvbHV0ZV9yZWdpb25fcG93ZXJfaW5kZXhbcmVnaW9uXSxyYXdfbWx0X3B0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICZyZWdpb25fbWx0X2JpdHNbc2hsX25vY2hlY2socmVnaW9uLDIpXSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICByZWdpb25fbWx0X2JpdF9jb3VudHNbcmVnaW9uXSA9IDA7CisgICAgICAgICAgICBtb3ZlMTYoKTsKKyAgICAgICAgfQorICAgICAgICB0b3RhbF9tbHRfYml0cyA9IGFkZCh0b3RhbF9tbHRfYml0cyxyZWdpb25fbWx0X2JpdF9jb3VudHNbcmVnaW9uXSk7CisgICAgICAgIHRlbXAgPSBzdWIodG90YWxfbWx0X2JpdHMsbnVtYmVyX29mX2F2YWlsYWJsZV9iaXRzKTsKKyAgICB9CisKKyAgICAvKiBJZiB0b28gbWFueSBiaXRzLi4uICovCisgICAgLyogU2V0IHVwIGZvciB3aGlsZSBsb29wIHRlc3QgKi8KKyAgICB0ZW1wMSA9IHN1Yih0b3RhbF9tbHRfYml0cyxudW1iZXJfb2ZfYXZhaWxhYmxlX2JpdHMpOworICAgIHRlbXAyID0gc3ViKCpwX2NhdGVnb3JpemF0aW9uX2NvbnRyb2wsc3ViKG51bV9jYXRlZ29yaXphdGlvbl9jb250cm9sX3Bvc3NpYmlsaXRpZXMsMSkpOworICAgIHRlc3QoKTsKKyAgICB0ZXN0KCk7CisgICAgbG9naWMxNigpOworICAgIAorICAgIHdoaWxlICgodGVtcDEgPiAwKSAmJiAodGVtcDIgPCAwKSkKKyAgICB7CisgICAgICAgIC8qIG9wZXJhdGlvbnMgZm9yIHdoaWxlIGNvbnRpdGlvbnMgKi8KKyAgICAgICAgdGVzdCgpOworICAgICAgICB0ZXN0KCk7CisgICAgICAgIGxvZ2ljMTYoKTsKKyAgICAgICAgCisgICAgICAgIHJlZ2lvbiA9IGNhdGVnb3J5X2JhbGFuY2VzWypwX2NhdGVnb3JpemF0aW9uX2NvbnRyb2xdOworICAgICAgICBtb3ZlMTYoKTsKKyAgICAgICAgCisgICAgICAgIHBvd2VyX2NhdGVnb3JpZXNbcmVnaW9uXSA9IGFkZChwb3dlcl9jYXRlZ29yaWVzW3JlZ2lvbl0sMSk7CisgICAgICAgIG1vdmUxNigpOworCisgICAgICAgIHRvdGFsX21sdF9iaXRzID0gc3ViKHRvdGFsX21sdF9iaXRzLHJlZ2lvbl9tbHRfYml0X2NvdW50c1tyZWdpb25dKTsKKyAgICAgICAgY2F0ZWdvcnkgPSBwb3dlcl9jYXRlZ29yaWVzW3JlZ2lvbl07CisgICAgICAgIG1vdmUxNigpOworICAgICAgICAKKyAgICAgICAgdGVtcCA9IGV4dHJhY3RfbChMX211bHQwKHJlZ2lvbixSRUdJT05fU0laRSkpOworICAgICAgICByYXdfbWx0X3B0ciA9ICZtbHRfY29lZnNbdGVtcF07CisgICAgICAgIG1vdmUxNigpOworICAgICAgICAKKyAgICAgICAgdGVtcCA9IHN1YihjYXRlZ29yeSwoTlVNX0NBVEVHT1JJRVMtMSkpOworICAgICAgICB0ZXN0KCk7CisgICAgICAgIGlmICh0ZW1wIDwgMCkKKyAgICAgICAgeworICAgICAgICAgICAgcmVnaW9uX21sdF9iaXRfY291bnRzW3JlZ2lvbl0gPQorICAgICAgICAgICAgICAgIHZlY3Rvcl9odWZmbWFuKGNhdGVnb3J5LCBhYnNvbHV0ZV9yZWdpb25fcG93ZXJfaW5kZXhbcmVnaW9uXSxyYXdfbWx0X3B0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICZyZWdpb25fbWx0X2JpdHNbc2hsX25vY2hlY2socmVnaW9uLDIpXSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICByZWdpb25fbWx0X2JpdF9jb3VudHNbcmVnaW9uXSA9IDA7CisgICAgICAgICAgICBtb3ZlMTYoKTsKKyAgICAgICAgfQorICAgICAgICB0b3RhbF9tbHRfYml0cyA9IGFkZCh0b3RhbF9tbHRfYml0cyxyZWdpb25fbWx0X2JpdF9jb3VudHNbcmVnaW9uXSk7CisgICAgICAgICgqcF9jYXRlZ29yaXphdGlvbl9jb250cm9sKSsrOworICAgICAgICAKKyAgICAgICAgdGVtcDEgPSBzdWIodG90YWxfbWx0X2JpdHMsbnVtYmVyX29mX2F2YWlsYWJsZV9iaXRzKTsKKyAgICAgICAgdGVtcDIgPSBzdWIoKnBfY2F0ZWdvcml6YXRpb25fY29udHJvbCxzdWIobnVtX2NhdGVnb3JpemF0aW9uX2NvbnRyb2xfcG9zc2liaWxpdGllcywxKSk7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgRnVuY3Rpb246ICAgIHZlY3Rvcl9odWZmbWFuCisKKyBTeW50YXg6ICAgICAgV29yZDE2IHZlY3Rvcl9odWZmbWFuKFdvcmQxNiAgY2F0ZWdvcnksICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiAgcG93ZXJfaW5kZXgsICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiAgKnJhd19tbHRfcHRyLCAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVV29yZDMyICp3b3JkX3B0cikgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICBpbnB1dHM6ICAgICBXb3JkMTYgIGNhdGVnb3J5CisgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiAgcG93ZXJfaW5kZXgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2ICAqcmF3X21sdF9wdHIKKyAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgb3V0cHV0czogICAgbnVtYmVyX29mX3JlZ2lvbl9iaXRzCisgICAgICAgICAgICAgICAgICAgICAgICAgICp3b3JkX3B0cgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKworIERlc2NyaXB0aW9uOiBIdWZmbWFuIGVuY29kaW5nIGZvciBlYWNoIHJlZ2lvbiBiYXNlZCBvbiBjYXRlZ29yeSBhbmQgcG93ZXJfaW5kZXggIAorCisgV01PUFM6ICAgICA3a0h6IHwgICAgMjRrYml0ICAgIHwgICAgIDMya2JpdAorICAgICAgICAgIC0tLS0tLS18LS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLQorICAgICAgICAgICAgQVZHICB8ICAgIDAuMDMgICAgICB8ICAgICAwLjAzCisgICAgICAgICAgLS0tLS0tLXwtLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tICAKKyAgICAgICAgICAgIE1BWCAgfCAgICAwLjA0ICAgICAgfCAgICAgMC4wNAorICAgICAgICAgIC0tLS0tLS18LS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLSAKKworICAgICAgICAgICAxNGtIeiB8ICAgIDI0a2JpdCAgICB8ICAgICAzMmtiaXQgICAgIHwgICAgIDQ4a2JpdAorICAgICAgICAgIC0tLS0tLS18LS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tCisgICAgICAgICAgICBBVkcgIHwgICAgMC4wMyAgICAgIHwgICAgIDAuMDMgICAgICAgfCAgICAgMC4wMworICAgICAgICAgIC0tLS0tLS18LS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tCisgICAgICAgICAgICBNQVggIHwgICAgMC4wNCAgICAgIHwgICAgIDAuMDQgICAgICAgfCAgICAgMC4wNAorICAgICAgICAgIC0tLS0tLS18LS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK1dvcmQxNiB2ZWN0b3JfaHVmZm1hbihXb3JkMTYgY2F0ZWdvcnksCisgICAgICAgICAgICAgICAgICAgICAgV29yZDE2IHBvd2VyX2luZGV4LAorICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiAqcmF3X21sdF9wdHIsCisgICAgICAgICAgICAgICAgICAgICAgVVdvcmQzMiAqd29yZF9wdHIpCit7CisgCisKKyAgICBXb3JkMTYgIGludl9vZl9zdGVwX3NpemVfdGltZXNfc3RkX2RldjsKKyAgICBXb3JkMTYgIGosbjsKKyAgICBXb3JkMTYgIGs7CisgICAgV29yZDE2ICBudW1iZXJfb2ZfcmVnaW9uX2JpdHM7CisgICAgV29yZDE2ICBudW1iZXJfb2Zfbm9uX3plcm87CisgICAgV29yZDE2ICB2ZWNfZGltOworICAgIFdvcmQxNiAgbnVtX3ZlY3M7CisgICAgV29yZDE2ICBrbWF4LCBrbWF4X3BsdXNfb25lOworICAgIFdvcmQxNiAgaW5kZXgsc2lnbnNfaW5kZXg7CisgICAgV29yZDE2ICAqYml0Y291bnRfdGFibGVfcHRyOworICAgIFVXb3JkMTYgKmNvZGVfdGFibGVfcHRyOworICAgIFdvcmQzMiAgY29kZV9iaXRzOworICAgIFdvcmQxNiAgbnVtYmVyX29mX2NvZGVfYml0czsKKyAgICBVV29yZDMyIGN1cnJlbnRfd29yZDsKKyAgICBXb3JkMTYgIGN1cnJlbnRfd29yZF9iaXRzX2ZyZWU7CisgICAgCisgICAgV29yZDMyIGFjY2E7CisgICAgV29yZDMyIGFjY2I7CisgICAgV29yZDE2IHRlbXA7CisKKyAgICBXb3JkMTYgbXl0ZW1wOwkJCSAvKiBuZXcgdmFyaWFibGUgaW4gUmVsZWFzZSAxLjIgKi8KKyAgICBXb3JkMTYgbXlhY2NhOwkJCSAvKiBuZXcgdmFyaWFibGUgaW4gUmVsZWFzZSAxLjIgKi8KKworCisgICAgLyogaW5pdGlhbGl6ZSB2YXJpYWJsZXMgKi8KKyAgICB2ZWNfZGltID0gdmVjdG9yX2RpbWVuc2lvbltjYXRlZ29yeV07CisgICAgbW92ZTE2KCk7CisKKyAgICBudW1fdmVjcyA9IG51bWJlcl9vZl92ZWN0b3JzW2NhdGVnb3J5XTsKKyAgICBtb3ZlMTYoKTsKKworICAgIGttYXggPSBtYXhfYmluW2NhdGVnb3J5XTsKKyAgICBtb3ZlMTYoKTsKKworICAgIGttYXhfcGx1c19vbmUgPSBhZGQoa21heCwxKTsKKyAgICBtb3ZlMTYoKTsKKworICAgIGN1cnJlbnRfd29yZCA9IDBMOworICAgIG1vdmUxNigpOworCisgICAgY3VycmVudF93b3JkX2JpdHNfZnJlZSA9IDMyOworICAgIG1vdmUxNigpOworCisgICAgbnVtYmVyX29mX3JlZ2lvbl9iaXRzID0gMDsKKyAgICBtb3ZlMTYoKTsKKworICAgIC8qIHNldCB1cCB0YWJsZSBwb2ludGVycyAqLworICAgIGJpdGNvdW50X3RhYmxlX3B0ciA9IChXb3JkMTYgKil0YWJsZV9vZl9iaXRjb3VudF90YWJsZXNbY2F0ZWdvcnldOworICAgIGNvZGVfdGFibGVfcHRyID0gKFVXb3JkMTYgKikgdGFibGVfb2ZfY29kZV90YWJsZXNbY2F0ZWdvcnldOworCisgICAgLyogY29tcHV0ZSBpbnZlcnNlIG9mIHN0ZXAgc2l6ZSAqIHN0YW5kYXJkIGRldmlhdGlvbiAqLworICAgIGFjY2EgPSBMX211bHQoc3RlcF9zaXplX2ludmVyc2VfdGFibGVbY2F0ZWdvcnldLHN0YW5kYXJkX2RldmlhdGlvbl9pbnZlcnNlX3RhYmxlW3Bvd2VyX2luZGV4XSk7CisgICAgYWNjYSA9IExfc2hyX25vY2hlY2soYWNjYSwxKTsKKyAgICBhY2NhID0gTF9hZGQoYWNjYSw0MDk2KTsKKyAgICBhY2NhID0gTF9zaHJfbm9jaGVjayhhY2NhLDEzKTsKKworCS8qCisJICogIFRoZSBuZXh0IHR3byBsaW5lcyBhcmUgbmV3IHRvIFJlbGVhc2UgMS4yIAorCSAqLworICAgICAKKwlteXRlbXAgPSAoV29yZDE2KShhY2NhICYgMHgzKTsKKyAgICBhY2NhID0gTF9zaHJfbm9jaGVjayhhY2NhLDIpOworCisgICAgaW52X29mX3N0ZXBfc2l6ZV90aW1lc19zdGRfZGV2ID0gZXh0cmFjdF9sKGFjY2EpOworCisKKyAgICBmb3IgKG49MDsgbjxudW1fdmVjczsgbisrKQorICAgIHsKKyAgICAgICAgaW5kZXggPSAwOworICAgICAgICBtb3ZlMTYoKTsKKyAgICAgICAgCisgICAgICAgIHNpZ25zX2luZGV4ID0gMDsKKyAgICAgICAgbW92ZTE2KCk7CisgICAgICAgIAorICAgICAgICBudW1iZXJfb2Zfbm9uX3plcm8gPSAwOworICAgICAgICBtb3ZlMTYoKTsKKyAgICAgICAgCisgICAgICAgIGZvciAoaj0wOyBqPHZlY19kaW07IGorKykKKyAgICAgICAgeworICAgICAgICAgICAgayA9IGFic19zKCpyYXdfbWx0X3B0cik7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGFjY2EgPSBMX211bHQoayxpbnZfb2Zfc3RlcF9zaXplX3RpbWVzX3N0ZF9kZXYpOworICAgICAgICAgICAgYWNjYSA9IExfc2hyX25vY2hlY2soYWNjYSwxKTsKKwkJICAgIAorCQkJLyoKKwkJCSAqICBUaGUgbmV4dCBmb3VyIGxpbmVzIGFyZSBuZXcgdG8gUmVsZWFzZSAxLjIKKwkJCSAqLworCisJCQlteWFjY2EgPSAoV29yZDE2KUxfbXVsdChrLG15dGVtcCk7CisJCQlteWFjY2EgPSAoV29yZDE2KUxfc2hyX25vY2hlY2sobXlhY2NhLDEpOworCQkJbXlhY2NhID0gKFdvcmQxNilMX2FkZChteWFjY2EsaW50X2RlYWRfem9uZV9sb3dfYml0c1tjYXRlZ29yeV0pOworCQkJbXlhY2NhID0gKFdvcmQxNilMX3Nocl9ub2NoZWNrKG15YWNjYSwyKTsKKworICAgICAgICAgICAgYWNjYSA9IExfYWRkKGFjY2EsaW50X2RlYWRfem9uZVtjYXRlZ29yeV0pOworCisJCQkvKgorCQkJICogIFRoZSBuZXh0IHR3byBsaW5lcyBhcmUgbmV3IHRvIFJlbGVhc2UgMS4yCisJCQkgKi8KKworCQkJYWNjYSA9IExfYWRkKGFjY2EsbXlhY2NhKTsKKwkJCWFjY2EgPSBMX3Nocl9ub2NoZWNrKGFjY2EsMTMpOworCisgICAgICAgICAgICBrID0gZXh0cmFjdF9sKGFjY2EpOworCisgICAgICAgICAgICB0ZXN0KCk7CisgICAgICAgICAgICBpZiAoayAhPSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG51bWJlcl9vZl9ub25femVybyA9IGFkZChudW1iZXJfb2Zfbm9uX3plcm8sMSk7CisgICAgICAgICAgICAgICAgc2lnbnNfaW5kZXggPSBzaGxfbm9jaGVjayhzaWduc19pbmRleCwxKTsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICB0ZXN0KCk7CisgICAgICAgICAgICAgICAgaWYgKCpyYXdfbWx0X3B0ciA+IDApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBzaWduc19pbmRleCA9IGFkZChzaWduc19pbmRleCwxKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgdGVtcCA9IHN1YihrLGttYXgpOworICAgICAgICAgICAgICAgIHRlc3QoKTsKKyAgICAgICAgICAgICAgICBpZiAodGVtcCA+IDApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBrID0ga21heDsKKyAgICAgICAgICAgICAgICAgICAgbW92ZTE2KCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYWNjYSA9IExfc2hyX25vY2hlY2soTF9tdWx0KGluZGV4LChrbWF4X3BsdXNfb25lKSksMSk7CisgICAgICAgICAgICBpbmRleCA9IGV4dHJhY3RfbChhY2NhKTsKKyAgICAgICAgICAgIGluZGV4ID0gYWRkKGluZGV4LGspOworICAgICAgICAgICAgcmF3X21sdF9wdHIrKzsKKyAgICAgICAgfQorCisgICAgICAgIGNvZGVfYml0cyA9ICooY29kZV90YWJsZV9wdHIraW5kZXgpOworICAgICAgICBudW1iZXJfb2ZfY29kZV9iaXRzID0gYWRkKCgqKGJpdGNvdW50X3RhYmxlX3B0citpbmRleCkpLG51bWJlcl9vZl9ub25femVybyk7CisgICAgICAgIG51bWJlcl9vZl9yZWdpb25fYml0cyA9IGFkZChudW1iZXJfb2ZfcmVnaW9uX2JpdHMsbnVtYmVyX29mX2NvZGVfYml0cyk7CisKKyAgICAgICAgYWNjYSA9IGNvZGVfYml0cyA8PCBudW1iZXJfb2Zfbm9uX3plcm87CisgICAgICAgIGFjY2IgPSBMX2RlcG9zaXRfbChzaWduc19pbmRleCk7CisgICAgICAgIGFjY2EgPSBMX2FkZChhY2NhLGFjY2IpOworICAgICAgICBjb2RlX2JpdHMgPSBhY2NhOworICAgICAgICBtb3ZlMzIoKTsKKworICAgICAgICAvKiBtc2Igb2YgY29kZWJpdHMgaXMgdHJhbnNtaXR0ZWQgZmlyc3QuICovCisgICAgICAgIGogPSBzdWIoY3VycmVudF93b3JkX2JpdHNfZnJlZSxudW1iZXJfb2ZfY29kZV9iaXRzKTsKKyAgICAgICAgdGVzdCgpOworICAgICAgICBpZiAoaiA+PSAwKQorICAgICAgICB7CisgICAgICAgICAgICB0ZXN0KCk7CisgICAgICAgICAgICBhY2NhID0gY29kZV9iaXRzIDw8IGo7CisgICAgICAgICAgICBjdXJyZW50X3dvcmQgPSBMX2FkZChjdXJyZW50X3dvcmQsYWNjYSk7CisgICAgICAgICAgICBjdXJyZW50X3dvcmRfYml0c19mcmVlID0gajsKKyAgICAgICAgICAgIG1vdmUxNigpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgaiA9IG5lZ2F0ZShqKTsKKyAgICAgICAgICAgIGFjY2EgPSBMX3Nocl9ub2NoZWNrKGNvZGVfYml0cyxqKTsKKyAgICAgICAgICAgIGN1cnJlbnRfd29yZCA9IExfYWRkKGN1cnJlbnRfd29yZCxhY2NhKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgKndvcmRfcHRyKysgPSBjdXJyZW50X3dvcmQ7CisgICAgICAgICAgICBtb3ZlMTYoKTsKKworICAgICAgICAgICAgY3VycmVudF93b3JkX2JpdHNfZnJlZSA9IHN1YigzMixqKTsKKyAgICAgICAgICAgIHRlc3QoKTsKKyAgICAgICAgICAgIGN1cnJlbnRfd29yZCA9IGNvZGVfYml0cyA8PCBjdXJyZW50X3dvcmRfYml0c19mcmVlOworICAgICAgICB9CisgICAgfQorCisgICAgKndvcmRfcHRyKysgPSBjdXJyZW50X3dvcmQ7CisgICAgbW92ZTE2KCk7CisKKyAgICByZXR1cm4gKG51bWJlcl9vZl9yZWdpb25fYml0cyk7Cit9CisKKwpkaWZmIC0tZ2l0IGEvam5pL3BqcHJvamVjdC1hbmRyb2lkLy5zdm4vcHJpc3RpbmUvMDUvMDU0ZTEyYjY5NGMyMWExMDU4OTcyYzUxZGQxOTQ2NDcyMmRkYmEyMi5zdm4tYmFzZSBiL2puaS9wanByb2plY3QtYW5kcm9pZC8uc3ZuL3ByaXN0aW5lLzA1LzA1NGUxMmI2OTRjMjFhMTA1ODk3MmM1MWRkMTk0NjQ3MjJkZGJhMjIuc3ZuLWJhc2UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTQyZDI2NgotLS0gL2Rldi9udWxsCisrKyBiL2puaS9wanByb2plY3QtYW5kcm9pZC8uc3ZuL3ByaXN0aW5lLzA1LzA1NGUxMmI2OTRjMjFhMTA1ODk3MmM1MWRkMTk0NjQ3MjJkZGJhMjIuc3ZuLWJhc2UKQEAgLTAsMCArMSwyNTAgQEAKKy8qICRJZCQgKi8KKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDgtMjAxMSBUZWx1dSBJbmMuIChodHRwOi8vd3d3LnRlbHV1LmNvbSkKKyAqIENvcHlyaWdodCAoQykgMjAwMy0yMDA4IEJlbm55IFByaWpvbm8gPGJlbm55QHByaWpvbm8ub3JnPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyAqLworI2luY2x1ZGUgInRlc3QuaCIKKyNpbmNsdWRlIDxwam1lZGlhLWF1ZGlvZGV2L2F1ZGlvZGV2Lmg+CisjaW5jbHVkZSA8cGptZWRpYS1jb2RlYy9mZm1wZWdfdmlkX2NvZGVjcy5oPgorI2luY2x1ZGUgPHBqbWVkaWEvdmlkX2NvZGVjLmg+CisjaW5jbHVkZSA8cGptZWRpYV92aWRlb2Rldi5oPgorCisKKyNpZiBkZWZpbmVkKFBKTUVESUFfSEFTX1ZJREVPKSAmJiAoUEpNRURJQV9IQVNfVklERU8gIT0gMCkKKworCisjZGVmaW5lIFRISVNfRklMRSAJInZpZF9kZXZfdGVzdC5jIgorI2RlZmluZSBMT09QX0RVUkFUSU9OCTYKKworc3RhdGljIHBqX2Jvb2xfdCBpc19xdWl0dGluZyA9IFBKX0ZBTFNFOworCitzdGF0aWMgcGpfc3RhdHVzX3QgdmlkX2V2ZW50X2NiKHBqbWVkaWFfZXZlbnQgKmV2ZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICp1c2VyX2RhdGEpCit7CisgICAgUEpfVU5VU0VEX0FSRyh1c2VyX2RhdGEpOworCisgICAgaWYgKGV2ZW50LT50eXBlID09IFBKTUVESUFfRVZFTlRfV05EX0NMT1NFRCkKKyAgICAgICAgaXNfcXVpdHRpbmcgPSBQSl9UUlVFOworCisgICAgcmV0dXJuIFBKX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBpbnQgY2FwdHVyZV9yZW5kZXJfbG9vcGJhY2socGpfYm9vbF90IGFjdGl2ZSwKKwkJCQkgICBpbnQgY2FwX2Rldl9pZCwgaW50IHJlbmRfZGV2X2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwam1lZGlhX2Zvcm1hdCAqZm10KQoreworICAgIHBqX3Bvb2xfdCAqcG9vbDsKKyAgICBwam1lZGlhX3ZpZF9wb3J0ICpjYXB0dXJlPU5VTEwsICpyZW5kZXJlcj1OVUxMOworICAgIHBqbWVkaWFfdmlkX2Rldl9pbmZvIGNkaSwgcmRpOworICAgIHBqbWVkaWFfdmlkX3BvcnRfcGFyYW0gcGFyYW07CisgICAgcGptZWRpYV92aWRlb19mb3JtYXRfZGV0YWlsICp2ZmQ7CisgICAgcGpfc3RhdHVzX3Qgc3RhdHVzOworICAgIGludCByYyA9IDAsIGk7CisKKyAgICBwb29sID0gcGpfcG9vbF9jcmVhdGUobWVtLCAidmlkcG9ydGxvb3AiLCAxMDAwLCAxMDAwLCBOVUxMKTsKKworICAgIHN0YXR1cyA9IHBqbWVkaWFfdmlkX2Rldl9nZXRfaW5mbyhjYXBfZGV2X2lkLCAmY2RpKTsKKyAgICBpZiAoc3RhdHVzICE9IFBKX1NVQ0NFU1MpCisJZ290byBvbl9yZXR1cm47CisKKyAgICBzdGF0dXMgPSBwam1lZGlhX3ZpZF9kZXZfZ2V0X2luZm8ocmVuZF9kZXZfaWQsICZyZGkpOworICAgIGlmIChzdGF0dXMgIT0gUEpfU1VDQ0VTUykKKwlnb3RvIG9uX3JldHVybjsKKworICAgIFBKX0xPRygzLChUSElTX0ZJTEUsCisJICAgICAgIiAgJXMgKCVzKSA9PT0+ICVzICglcylcdCVzXHQlZHglZFx0QCVkOiVkIGZwcyIsCisJICAgICAgY2RpLm5hbWUsIGNkaS5kcml2ZXIsIHJkaS5uYW1lLCByZGkuZHJpdmVyLAorCSAgICAgIHBqbWVkaWFfZ2V0X3ZpZGVvX2Zvcm1hdF9pbmZvKE5VTEwsIGZtdC0+aWQpLT5uYW1lLAorCSAgICAgIGZtdC0+ZGV0LnZpZC5zaXplLncsIGZtdC0+ZGV0LnZpZC5zaXplLmgsCisJICAgICAgZm10LT5kZXQudmlkLmZwcy5udW0sIGZtdC0+ZGV0LnZpZC5mcHMuZGVudW0pKTsKKworICAgIHBqbWVkaWFfdmlkX3BvcnRfcGFyYW1fZGVmYXVsdCgmcGFyYW0pOworCisgICAgLyogQ3JlYXRlIGNhcHR1cmUsIHNldCBpdCB0byBhY3RpdmUgKG1hc3RlcikgKi8KKyAgICBzdGF0dXMgPSBwam1lZGlhX3ZpZF9kZXZfZGVmYXVsdF9wYXJhbShwb29sLCBjYXBfZGV2X2lkLAorCQkJCQkgICAmcGFyYW0udmlkcGFyYW0pOworICAgIGlmIChzdGF0dXMgIT0gUEpfU1VDQ0VTUykgeworCXJjID0gMTAwOyBnb3RvIG9uX3JldHVybjsKKyAgICB9CisgICAgcGFyYW0udmlkcGFyYW0uZGlyID0gUEpNRURJQV9ESVJfQ0FQVFVSRTsKKyAgICBwYXJhbS52aWRwYXJhbS5mbXQgPSAqZm10OworICAgIHBhcmFtLmFjdGl2ZSA9IChhY3RpdmU/IFBKX1RSVUU6IFBKX0ZBTFNFKTsKKworICAgIGlmIChwYXJhbS52aWRwYXJhbS5mbXQuZGV0YWlsX3R5cGUgIT0gUEpNRURJQV9GT1JNQVRfREVUQUlMX1ZJREVPKSB7CisJcmMgPSAxMDM7IGdvdG8gb25fcmV0dXJuOworICAgIH0KKworICAgIHZmZCA9IHBqbWVkaWFfZm9ybWF0X2dldF92aWRlb19mb3JtYXRfZGV0YWlsKCZwYXJhbS52aWRwYXJhbS5mbXQsIFBKX1RSVUUpOworICAgIGlmICh2ZmQgPT0gTlVMTCkgeworCXJjID0gMTA1OyBnb3RvIG9uX3JldHVybjsKKyAgICB9CisKKyAgICBzdGF0dXMgPSBwam1lZGlhX3ZpZF9wb3J0X2NyZWF0ZShwb29sLCAmcGFyYW0sICZjYXB0dXJlKTsKKyAgICBpZiAoc3RhdHVzICE9IFBKX1NVQ0NFU1MpIHsKKwlyYyA9IDExMDsgZ290byBvbl9yZXR1cm47CisgICAgfQorCisgICAgLyogQ3JlYXRlIHJlbmRlcmVyLCBzZXQgaXQgdG8gcGFzc2l2ZSAoc2xhdmUpICAqLworICAgIHN0YXR1cyA9IHBqbWVkaWFfdmlkX2Rldl9kZWZhdWx0X3BhcmFtKHBvb2wsIHJlbmRfZGV2X2lkLAorCQkJCQkgICAmcGFyYW0udmlkcGFyYW0pOworICAgIGlmIChzdGF0dXMgIT0gUEpfU1VDQ0VTUykgeworCXJjID0gMTIwOyBnb3RvIG9uX3JldHVybjsKKyAgICB9CisKKyAgICBwYXJhbS5hY3RpdmUgPSAoYWN0aXZlPyBQSl9GQUxTRTogUEpfVFJVRSk7CisgICAgcGFyYW0udmlkcGFyYW0uZGlyID0gUEpNRURJQV9ESVJfUkVOREVSOworICAgIHBhcmFtLnZpZHBhcmFtLnJlbmRfaWQgPSByZW5kX2Rldl9pZDsKKyAgICBwYXJhbS52aWRwYXJhbS5mbXQgPSAqZm10OworICAgIHBhcmFtLnZpZHBhcmFtLmRpc3Bfc2l6ZSA9IHZmZC0+c2l6ZTsKKworICAgIHN0YXR1cyA9IHBqbWVkaWFfdmlkX3BvcnRfY3JlYXRlKHBvb2wsICZwYXJhbSwgJnJlbmRlcmVyKTsKKyAgICBpZiAoc3RhdHVzICE9IFBKX1NVQ0NFU1MpIHsKKwlyYyA9IDEzMDsgZ290byBvbl9yZXR1cm47CisgICAgfQorCisgICAgLyogU2V0IGV2ZW50IGhhbmRsZXIgKi8KKyAgICBwam1lZGlhX2V2ZW50X3N1YnNjcmliZShOVUxMLCAmdmlkX2V2ZW50X2NiLCBOVUxMLCByZW5kZXJlcik7CisKKyAgICAvKiBDb25uZWN0IGNhcHR1cmUgdG8gcmVuZGVyZXIgKi8KKyAgICBzdGF0dXMgPSBwam1lZGlhX3ZpZF9wb3J0X2Nvbm5lY3QoCisJICAgICAgICAgKGFjdGl2ZT8gY2FwdHVyZTogcmVuZGVyZXIpLAorCQkgcGptZWRpYV92aWRfcG9ydF9nZXRfcGFzc2l2ZV9wb3J0KGFjdGl2ZT8gcmVuZGVyZXI6IGNhcHR1cmUpLAorCQkgUEpfRkFMU0UpOworICAgIGlmIChzdGF0dXMgIT0gUEpfU1VDQ0VTUykgeworCXJjID0gMTQwOyBnb3RvIG9uX3JldHVybjsKKyAgICB9CisKKyAgICAvKiBTdGFydCBzdHJlYW1pbmcuLiAqLworICAgIHN0YXR1cyA9IHBqbWVkaWFfdmlkX3BvcnRfc3RhcnQocmVuZGVyZXIpOworICAgIGlmIChzdGF0dXMgIT0gUEpfU1VDQ0VTUykgeworCXJjID0gMTUwOyBnb3RvIG9uX3JldHVybjsKKyAgICB9CisgICAgc3RhdHVzID0gcGptZWRpYV92aWRfcG9ydF9zdGFydChjYXB0dXJlKTsKKyAgICBpZiAoc3RhdHVzICE9IFBKX1NVQ0NFU1MpIHsKKwlyYyA9IDE2MDsgZ290byBvbl9yZXR1cm47CisgICAgfQorCisgICAgLyogU2xlZXAgd2hpbGUgdGhlIHdlYmNhbSBpcyBiZWluZyBkaXNwbGF5ZWQuLi4gKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgTE9PUF9EVVJBVElPTioxMCAmJiAoIWlzX3F1aXR0aW5nKTsgaSsrKSB7CisgICAgICAgIHBqX3RocmVhZF9zbGVlcCgxMDApOworICAgIH0KKworb25fcmV0dXJuOgorICAgIGlmIChzdGF0dXMgIT0gUEpfU1VDQ0VTUykKKwlQSl9QRVJST1IoMywgKFRISVNfRklMRSwgc3RhdHVzLCAiICAgZXJyb3IiKSk7CisKKyAgICBpZiAoY2FwdHVyZSkKKyAgICAgICAgcGptZWRpYV92aWRfcG9ydF9zdG9wKGNhcHR1cmUpOworICAgIGlmIChyZW5kZXJlcikKKyAgICAgICAgcGptZWRpYV92aWRfcG9ydF9zdG9wKHJlbmRlcmVyKTsKKyAgICBpZiAoY2FwdHVyZSkKKwlwam1lZGlhX3ZpZF9wb3J0X2Rlc3Ryb3koY2FwdHVyZSk7CisgICAgaWYgKHJlbmRlcmVyKSB7CisgICAgICAgIHBqbWVkaWFfZXZlbnRfdW5zdWJzY3JpYmUoTlVMTCwgJnZpZF9ldmVudF9jYiwgTlVMTCwgcmVuZGVyZXIpOworCXBqbWVkaWFfdmlkX3BvcnRfZGVzdHJveShyZW5kZXJlcik7CisgICAgfQorCisgICAgcGpfcG9vbF9yZWxlYXNlKHBvb2wpOworICAgIHJldHVybiByYzsKK30KKworc3RhdGljIGludCBmaW5kX2RldmljZShwam1lZGlhX2RpciBkaXIsCisJCSAgICAgICBwal9ib29sX3QgaGFzX2NhbGxiYWNrKQoreworICAgIHVuc2lnbmVkIGksIGNvdW50ID0gcGptZWRpYV92aWRfZGV2X2NvdW50KCk7CisgCisgICAgZm9yIChpID0gMDsgaSA8IGNvdW50OyArK2kpIHsKKwlwam1lZGlhX3ZpZF9kZXZfaW5mbyBjZGk7CisKKwlpZiAocGptZWRpYV92aWRfZGV2X2dldF9pbmZvKGksICZjZGkpICE9IFBKX1NVQ0NFU1MpCisJICAgIGNvbnRpbnVlOworCWlmICgoY2RpLmRpciAmIGRpcikgIT0gMCAmJiBjZGkuaGFzX2NhbGxiYWNrID09IGhhc19jYWxsYmFjaykKKwkgICAgcmV0dXJuIGk7CisgICAgfQorICAgIAorICAgIHJldHVybiAtOTk5OworfQorCitzdGF0aWMgaW50IHZpZHBvcnRfdGVzdCh2b2lkKQoreworICAgIGludCBpLCBqLCBrLCBsOworICAgIGludCBjYXBfaWQsIHJlbmRfaWQ7CisgICAgcGptZWRpYV9mb3JtYXRfaWQgdGVzdF9mbXRzW10gPSB7CisgICAgICAgIFBKTUVESUFfRk9STUFUX1JHQkEsCisgICAgICAgIFBKTUVESUFfRk9STUFUX0k0MjAKKyAgICB9OworCisgICAgUEpfTE9HKDMsIChUSElTX0ZJTEUsICIgVmlkZW8gcG9ydCB0ZXN0czoiKSk7CisKKyAgICAvKiBDYXB0dXJlcidzIHJvbGU6IGFjdGl2ZS9wYXNzaXZlLiAqLworICAgIGZvciAoaSA9IDE7IGkgPj0gMDsgaS0tKSB7CisJLyogQ2FwdHVyZXIncyBkZXZpY2UgaGFzX2NhbGxiYWNrOiBUUlVFL0ZBTFNFLiAqLworCWZvciAoaiA9IDE7IGogPj0gMDsgai0tKSB7CisJICAgIGNhcF9pZCA9IGZpbmRfZGV2aWNlKFBKTUVESUFfRElSX0NBUFRVUkUsIGopOworCSAgICBpZiAoY2FwX2lkIDwgMCkKKwkJY29udGludWU7CisKKwkgICAgLyogUmVuZGVyZXIncyBkZXZpY2UgaGFzIGNhbGxiYWNrOiBUUlVFL0ZBTFNFLiAqLworCSAgICBmb3IgKGsgPSAxOyBrID49IDA7IGstLSkgeworCQlyZW5kX2lkID0gZmluZF9kZXZpY2UoUEpNRURJQV9ESVJfUkVOREVSLCBrKTsKKwkJaWYgKHJlbmRfaWQgPCAwKQorCQkgICAgY29udGludWU7CisKKwkJLyogQ2hlY2sgdmFyaW91cyBmb3JtYXRzIHRvIHRlc3QgZm9ybWF0IGNvbnZlcnNpb24uICovCisJCWZvciAobCA9IDA7IGwgPCBQSl9BUlJBWV9TSVpFKHRlc3RfZm10cyk7ICsrbCkgeworCQkgICAgcGptZWRpYV9mb3JtYXQgZm10OworCisJCSAgICBQSl9MT0coMywoVEhJU19GSUxFLAorCQkJICAgICAgImNhcHR1cmVyICVzIChzdHJlYW06ICVzKSA9PT0+ICIKKwkJCSAgICAgICJyZW5kZXJlciAlcyAoc3RyZWFtOiAlcykiLAorCQkJICAgICAgKGk/ICJhY3RpdmUiOiAicGFzc2l2ZSIpLAorCQkJICAgICAgKGo/ICJhY3RpdmUiOiAicGFzc2l2ZSIpLAorCQkJICAgICAgKGk/ICJwYXNzaXZlIjogImFjdGl2ZSIpLAorCQkJICAgICAgKGs/ICJhY3RpdmUiOiAicGFzc2l2ZSIpKSk7CisKKwkJICAgIHBqbWVkaWFfZm9ybWF0X2luaXRfdmlkZW8oJmZtdCwgdGVzdF9mbXRzW2xdLAorCQkJCQkgICAgICA2NDAsIDQ4MCwgMjUsIDEpOworCQkgICAgY2FwdHVyZV9yZW5kZXJfbG9vcGJhY2soaSwgY2FwX2lkLCByZW5kX2lkLCAmZm10KTsKKwkJfQorCSAgICB9CisJfQorICAgIH0KKworICAgIHJldHVybiAwOworfQorCitpbnQgdmlkX3BvcnRfdGVzdCh2b2lkKQoreworICAgIGludCByYyA9IDA7CisgICAgcGpfc3RhdHVzX3Qgc3RhdHVzOworCisgICAgc3RhdHVzID0gcGptZWRpYV92aWRfZGV2X3N1YnN5c19pbml0KG1lbSk7CisgICAgaWYgKHN0YXR1cyAhPSBQSl9TVUNDRVNTKQorICAgICAgICByZXR1cm4gLTEwOworCisgICAgcmMgPSB2aWRwb3J0X3Rlc3QoKTsKKyAgICBpZiAocmMgIT0gMCkKKwlnb3RvIG9uX3JldHVybjsKKworb25fcmV0dXJuOgorICAgIHBqbWVkaWFfdmlkX2Rldl9zdWJzeXNfc2h1dGRvd24oKTsKKworICAgIHJldHVybiByYzsKK30KKworCisjZW5kaWYgLyogUEpNRURJQV9IQVNfVklERU8gKi8KZGlmZiAtLWdpdCBhL2puaS9wanByb2plY3QtYW5kcm9pZC8uc3ZuL3ByaXN0aW5lLzA1LzA1NTM2NTRiNWI2NWU4ZWMxN2VjODI1YTQ0ZmQwNDNmMjk1MzBkY2Muc3ZuLWJhc2UgYi9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvLnN2bi9wcmlzdGluZS8wNS8wNTUzNjU0YjViNjVlOGVjMTdlYzgyNWE0NGZkMDQzZjI5NTMwZGNjLnN2bi1iYXNlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNjZTg3N2EKLS0tIC9kZXYvbnVsbAorKysgYi9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvLnN2bi9wcmlzdGluZS8wNS8wNTUzNjU0YjViNjVlOGVjMTdlYzgyNWE0NGZkMDQzZjI5NTMwZGNjLnN2bi1iYXNlCkBAIC0wLDAgKzEsMTQ3NiBAQAorLyogJElkJCAqLworLyogCisgKiBDb3B5cmlnaHQgKEMpIDIwMDgtMjAxMSBUZWx1dSBJbmMuIChodHRwOi8vd3d3LnRlbHV1LmNvbSkKKyAqIENvcHlyaWdodCAoQykgMjAwMy0yMDA4IEJlbm55IFByaWpvbm8gPGJlbm55QHByaWpvbm8ub3JnPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EgCisgKi8KKyNpZm5kZWYgX19QSl9PU19IX18KKyNkZWZpbmUgX19QSl9PU19IX18KKworLyoqCisgKiBAZmlsZSBvcy5oCisgKiBAYnJpZWYgT1MgZGVwZW5kZW50IGZ1bmN0aW9ucworICovCisjaW5jbHVkZSA8cGovdHlwZXMuaD4KKworUEpfQkVHSU5fREVDTAorCisvKioKKyAqIEBkZWZncm91cCBQSl9PUyBPcGVyYXRpbmcgU3lzdGVtIERlcGVuZGVudCBGdW5jdGlvbmFsaXR5LgorICovCisKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioKKyAqIEBkZWZncm91cCBQSl9TWVNfSU5GTyBTeXN0ZW0gSW5mb3JtYXRpb24KKyAqIEBpbmdyb3VwIFBKX09TCisgKiBAeworICovCisKKy8qKgorICogVGhlc2UgZW51bWVyYXRpb24gY29udGFpbnMgY29uc3RhbnRzIHRvIGluZGljYXRlIHN1cHBvcnQgb2YgbWlzY2VsbGFuZW91cworICogc3lzdGVtIGZlYXR1cmVzLiBUaGVzZSB3aWxsIGdvIGluICJmbGFncyIgZmllbGQgb2YgI3BqX3N5c19pbmZvIHN0cnVjdHVyZS4KKyAqLwordHlwZWRlZiBlbnVtIHBqX3N5c19pbmZvX2ZsYWcKK3sKKyAgICAvKioKKyAgICAgKiBTdXBwb3J0IGZvciBBcHBsZSBpT1MgYmFja2dyb3VuZCBmZWF0dXJlLgorICAgICAqLworICAgIFBKX1NZU19IQVNfSU9TX0JHID0gMQorCit9IHBqX3N5c19pbmZvX2ZsYWc7CisKKworLyoqCisgKiBUaGlzIHN0cnVjdHVyZSBjb250YWlucyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgc3lzdGVtLiBVc2UgI3BqX2dldF9zeXNfaW5mbygpCisgKiB0byBvYnRhaW4gdGhlIHN5c3RlbSBpbmZvcm1hdGlvbi4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgcGpfc3lzX2luZm8KK3sKKyAgICAvKioKKyAgICAgKiBOdWxsIHRlcm1pbmF0ZWQgc3RyaW5nIGNvbnRhaW5pbmcgcHJvY2Vzc29yIGluZm9ybWF0aW9uIChlLmcuICJpMzg2IiwKKyAgICAgKiAieDg2XzY0IikuIEl0IG1heSBjb250YWluIGVtcHR5IHN0cmluZyBpZiB0aGUgdmFsdWUgY2Fubm90IGJlIG9idGFpbmVkLgorICAgICAqLworICAgIHBqX3N0cl90CW1hY2hpbmU7CisKKyAgICAvKioKKyAgICAgKiBOdWxsIHRlcm1pbmF0ZWQgc3RyaW5nIGlkZW50aWZ5aW5nIHRoZSBzeXN0ZW0gb3BlcmF0aW9uIChlLmcuICJMaW51eCIsCisgICAgICogIndpbjMyIiwgIndpbmNlIikuIEl0IG1heSBjb250YWluIGVtcHR5IHN0cmluZyBpZiB0aGUgdmFsdWUgY2Fubm90IGJlCisgICAgICogb2J0YWluZWQuCisgICAgICovCisgICAgcGpfc3RyX3QJb3NfbmFtZTsKKworICAgIC8qKgorICAgICAqIEEgbnVtYmVyIGNvbnRhaW5pbmcgdGhlIG9wZXJhdGluZyBzeXN0ZW0gdmVyc2lvbiBudW1iZXIuIEJ5IGNvbnZlbnRpb24sCisgICAgICogdGhpcyBmaWVsZCBpcyBkaXZpZGVkIGludG8gZm91ciBieXRlcywgd2hlcmUgdGhlIGhpZ2hlc3Qgb3JkZXIgYnl0ZQorICAgICAqIGNvbnRhaW5zIHRoZSBtb3N0IG1ham9yIHZlcnNpb24gb2YgdGhlIE9TLCB0aGUgbmV4dCBsZXNzIHNpZ25pZmljYW50CisgICAgICogYnl0ZSBjb250YWlucyB0aGUgbGVzcyBtYWpvciB2ZXJzaW9uLCBhbmQgc28gb24uIEhvdyB0aGUgT1MgdmVyc2lvbgorICAgICAqIG51bWJlciBpcyBtYXBwZWQgaW50byB0aGVzZSBmb3VyIGJ5dGVzIHdvdWxkIGJlIHNwZWNpZmljIGZvciBlYWNoIE9TLgorICAgICAqIEZvciBleGFtcGxlLCBMaW51eC0yLjYuMzItMjggd291bGQgeWllbGQgIm9zX3ZlciIgdmFsdWUgb2YgMHgwMjA2MjAxYywKKyAgICAgKiB3aGlsZSBmb3IgV2luZG93cyA3IGl0IHdpbGwgYmUgMHgwNjAxMDAwMCAoYmVjYXVzZSBkd01ham9yVmVyc2lvbiBpcworICAgICAqIDYgYW5kIGR3TWlub3JWZXJzaW9uIGlzIDEgZm9yIFdpbmRvd3MgNykuCisgICAgICoKKyAgICAgKiBUaGlzIGZpZWxkIG1heSBjb250YWluIHplcm8gaWYgdGhlIE9TIHZlcnNpb24gY2Fubm90IGJlIG9idGFpbmVkLgorICAgICAqLworICAgIHBqX3VpbnQzMl90CW9zX3ZlcjsKKworICAgIC8qKgorICAgICAqIE51bGwgdGVybWluYXRlZCBzdHJpbmcgaWRlbnRpZnlpbmcgdGhlIFNESyBuYW1lIHRoYXQgaXMgdXNlZCB0byBidWlsZAorICAgICAqIHRoZSBsaWJyYXJ5IChlLmcuICJnbGliYyIsICJ1Y2xpYmMiLCAibXN2YyIsICJ3aW5jZSIpLiBJdCBtYXkgY29udGFpbgorICAgICAqIGVtcHR5IHN0cmluZyBpZiB0aGUgdmFsdWUgY2Fubm90IGViIG9idGFpbmVkLgorICAgICAqLworICAgIHBqX3N0cl90CXNka19uYW1lOworCisgICAgLyoqCisgICAgICogQSBudW1iZXIgY29udGFpbmluZyB0aGUgU0RLIHZlcnNpb24sIHVzaW5nIHRoZSBudW1iZXJpbmcgY29udmVudGlvbiBhcworICAgICAqIHRoZSAib3NfdmVyIiBmaWVsZC4gVGhlIHZhbHVlIHdpbGwgYmUgemVybyBpZiB0aGUgdmVyc2lvbiBjYW5ub3QgYmUKKyAgICAgKiBvYnRhaW5lZC4KKyAgICAgKi8KKyAgICBwal91aW50MzJfdAlzZGtfdmVyOworCisgICAgLyoqCisgICAgICogQSBsb25nZXIgbnVsbCB0ZXJtaW5hdGVkIHN0cmluZyBpZGVudGlmeWluZyB0aGUgdW5kZXJseWluZyBzeXN0ZW0gd2l0aAorICAgICAqIGFzIG11Y2ggaW5mb3JtYXRpb24gYXMgcG9zc2libGUuCisgICAgICovCisgICAgcGpfc3RyX3QJaW5mbzsKKworICAgIC8qKgorICAgICAqIE90aGVyIGZsYWdzIGNvbnRhaW5pbmcgc3lzdGVtIHNwZWNpZmljIGluZm9ybWF0aW9uLiBUaGUgdmFsdWUgaXMKKyAgICAgKiBiaXRtYXNrIG9mICNwal9zeXNfaW5mb19mbGFnIGNvbnN0YW50cy4KKyAgICAgKi8KKyAgICBwal91aW50MzJfdAlmbGFnczsKKworfSBwal9zeXNfaW5mbzsKKworCisvKioKKyAqIE9idGFpbiB0aGUgc3lzdGVtIGluZm9ybWF0aW9uLgorICoKKyAqIEByZXR1cm4JU3lzdGVtIGluZm9ybWF0aW9uIHN0cnVjdHVyZS4KKyAqLworUEpfREVDTChjb25zdCBwal9zeXNfaW5mbyopIHBqX2dldF9zeXNfaW5mbyh2b2lkKTsKKworLyoKKyAqIEB9CisgKi8KKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioKKyAqIEBkZWZncm91cCBQSl9USFJFQUQgVGhyZWFkcworICogQGluZ3JvdXAgUEpfT1MKKyAqIEB7CisgKiBUaGlzIG1vZHVsZSBwcm92aWRlcyBtdWx0aXRocmVhZGluZyBBUEkuCisgKgorICogXHNlY3Rpb24gcGpfdGhyZWFkX2V4YW1wbGVzX3NlYyBFeGFtcGxlcworICoKKyAqIEZvciBleGFtcGxlcywgcGxlYXNlIHNlZToKKyAqICAtIFxyZWYgcGFnZV9wamxpYl90aHJlYWRfdGVzdAorICogIC0gXHJlZiBwYWdlX3BqbGliX3NsZWVwX3Rlc3QKKyAqCisgKi8KKworLyoqCisgKiBUaHJlYWQgY3JlYXRpb24gZmxhZ3M6CisgKiAtIFBKX1RIUkVBRF9TVVNQRU5ERUQ6IHNwZWNpZnkgdGhhdCB0aGUgdGhyZWFkIHNob3VsZCBiZSBjcmVhdGVkIHN1c3BlbmRlZC4KKyAqLwordHlwZWRlZiBlbnVtIHBqX3RocmVhZF9jcmVhdGVfZmxhZ3MKK3sKKyAgICBQSl9USFJFQURfU1VTUEVOREVEID0gMQorfSBwal90aHJlYWRfY3JlYXRlX2ZsYWdzOworCisKKy8qKgorICogVHlwZSBvZiB0aHJlYWQgZW50cnkgZnVuY3Rpb24uCisgKi8KK3R5cGVkZWYgaW50IChQSl9USFJFQURfRlVOQyBwal90aHJlYWRfcHJvYykodm9pZCopOworCisvKioKKyAqIFNpemUgb2YgdGhyZWFkIHN0cnVjdC4KKyAqLworI2lmICFkZWZpbmVkKFBKX1RIUkVBRF9ERVNDX1NJWkUpCisjICAgZGVmaW5lIFBKX1RIUkVBRF9ERVNDX1NJWkUJICAgICg2NCkKKyNlbmRpZgorCisvKioKKyAqIFRocmVhZCBzdHJ1Y3R1cmUsIHRvIHRocmVhZCdzIHN0YXRlIHdoZW4gdGhlIHRocmVhZCBpcyBjcmVhdGVkIGJ5IGV4dGVybmFsCisgKiBvciBuYXRpdmUgQVBJLiAKKyAqLwordHlwZWRlZiBsb25nIHBqX3RocmVhZF9kZXNjW1BKX1RIUkVBRF9ERVNDX1NJWkVdOworCisvKioKKyAqIEdldCBwcm9jZXNzIElELgorICogQHJldHVybiBwcm9jZXNzIElELgorICovCitQSl9ERUNMKHBqX3VpbnQzMl90KSBwal9nZXRwaWQodm9pZCk7CisKKy8qKgorICogQ3JlYXRlIGEgbmV3IHRocmVhZC4KKyAqCisgKiBAcGFyYW0gcG9vbCAgICAgICAgICBUaGUgbWVtb3J5IHBvb2wgZnJvbSB3aGljaCB0aGUgdGhyZWFkIHJlY29yZCAKKyAqICAgICAgICAgICAgICAgICAgICAgIHdpbGwgYmUgYWxsb2NhdGVkIGZyb20uCisgKiBAcGFyYW0gdGhyZWFkX25hbWUgICBUaGUgb3B0aW9uYWwgbmFtZSB0byBiZSBhc3NpZ25lZCB0byB0aGUgdGhyZWFkLgorICogQHBhcmFtIHByb2MgICAgICAgICAgVGhyZWFkIGVudHJ5IGZ1bmN0aW9uLgorICogQHBhcmFtIGFyZyAgICAgICAgICAgQXJndW1lbnQgdG8gYmUgcGFzc2VkIHRvIHRoZSB0aHJlYWQgZW50cnkgZnVuY3Rpb24uCisgKiBAcGFyYW0gc3RhY2tfc2l6ZSAgICBUaGUgc2l6ZSBvZiB0aGUgc3RhY2sgZm9yIHRoZSBuZXcgdGhyZWFkLCBvciBaRVJPIG9yCisgKiAgICAgICAgICAgICAgICAgICAgICBQSl9USFJFQURfREVGQVVMVF9TVEFDS19TSVpFIHRvIGxldCB0aGUgCisgKgkJICAgICAgICBsaWJyYXJ5IGNob29zZSB0aGUgcmVhc29uYWJsZSBzaXplIGZvciB0aGUgc3RhY2suIAorICogICAgICAgICAgICAgICAgICAgICAgRm9yIHNvbWUgc3lzdGVtcywgdGhlIHN0YWNrIHdpbGwgYmUgYWxsb2NhdGVkIGZyb20gCisgKiAgICAgICAgICAgICAgICAgICAgICB0aGUgcG9vbCwgc28gdGhlIHBvb2wgbXVzdCBoYXZlIHN1aXRhYmxlIGNhcGFjaXR5LgorICogQHBhcmFtIGZsYWdzICAgICAgICAgRmxhZ3MgZm9yIHRocmVhZCBjcmVhdGlvbiwgd2hpY2ggaXMgYml0bWFzayBjb21iaW5hdGlvbiAKKyAqICAgICAgICAgICAgICAgICAgICAgIGZyb20gZW51bSBwal90aHJlYWRfY3JlYXRlX2ZsYWdzLgorICogQHBhcmFtIHRocmVhZCAgICAgICAgUG9pbnRlciB0byBob2xkIHRoZSBuZXdseSBjcmVhdGVkIHRocmVhZC4KKyAqCisgKiBAcmV0dXJuCSAgICAgICAgUEpfU1VDQ0VTUyBvbiBzdWNjZXNzLCBvciB0aGUgZXJyb3IgY29kZS4KKyAqLworUEpfREVDTChwal9zdGF0dXNfdCkgcGpfdGhyZWFkX2NyZWF0ZSggIHBqX3Bvb2xfdCAqcG9vbCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqdGhyZWFkX25hbWUsCisJCQkJICAgICAgICBwal90aHJlYWRfcHJvYyAqcHJvYywgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqYXJnLAorCQkJCSAgICAgICAgcGpfc2l6ZV90IHN0YWNrX3NpemUsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGZsYWdzLAorCQkJCQlwal90aHJlYWRfdCAqKnRocmVhZCApOworCisvKioKKyAqIFJlZ2lzdGVyIGEgdGhyZWFkIHRoYXQgd2FzIGNyZWF0ZWQgYnkgZXh0ZXJuYWwgb3IgbmF0aXZlIEFQSSB0byBQSkxJQi4KKyAqIFRoaXMgZnVuY3Rpb24gbXVzdCBiZSBjYWxsZWQgaW4gdGhlIGNvbnRleHQgb2YgdGhlIHRocmVhZCBiZWluZyByZWdpc3RlcmVkLgorICogV2hlbiB0aGUgdGhyZWFkIGlzIGNyZWF0ZWQgYnkgZXh0ZXJuYWwgZnVuY3Rpb24gb3IgQVBJIGNhbGwsCisgKiBpdCBtdXN0IGJlICdyZWdpc3RlcmVkJyB0byBQSkxJQiB1c2luZyBwal90aHJlYWRfcmVnaXN0ZXIoKSwgc28gdGhhdCBpdCBjYW4KKyAqIGNvb3BlcmF0ZSB3aXRoIFBKTElCJ3MgZnJhbWV3b3JrLiBEdXJpbmcgcmVnaXN0cmF0aW9uLCBzb21lIGRhdGEgbmVlZHMgdG8KKyAqIGJlIG1haW50YWluZWQsIGFuZCB0aGlzIGRhdGEgbXVzdCByZW1haW4gYXZhaWxhYmxlIGR1cmluZyB0aGUgdGhyZWFkJ3MgCisgKiBsaWZldGltZS4KKyAqCisgKiBAcGFyYW0gdGhyZWFkX25hbWUgICBUaGUgb3B0aW9uYWwgbmFtZSB0byBiZSBhc3NpZ25lZCB0byB0aGUgdGhyZWFkLgorICogQHBhcmFtIGRlc2MgICAgICAgICAgVGhyZWFkIGRlc2NyaXB0b3IsIHdoaWNoIG11c3QgYmUgYXZhaWxhYmxlIHRocm91Z2hvdXQgCisgKiAgICAgICAgICAgICAgICAgICAgICB0aGUgbGlmZXRpbWUgb2YgdGhlIHRocmVhZC4KKyAqIEBwYXJhbSB0aHJlYWQgICAgICAgIFBvaW50ZXIgdG8gaG9sZCB0aGUgY3JlYXRlZCB0aHJlYWQgaGFuZGxlLgorICoKKyAqIEByZXR1cm4gICAgICAgICAgICAgIFBKX1NVQ0NFU1Mgb24gc3VjY2Vzcywgb3IgdGhlIGVycm9yIGNvZGUuCisgKi8KK1BKX0RFQ0wocGpfc3RhdHVzX3QpIHBqX3RocmVhZF9yZWdpc3RlciAoIGNvbnN0IGNoYXIgKnRocmVhZF9uYW1lLAorCQkJCQkgIHBqX3RocmVhZF9kZXNjIGRlc2MsCisJCQkJCSAgcGpfdGhyZWFkX3QgKip0aHJlYWQpOworCisvKioKKyAqIENoZWNrIGlmIHRoaXMgdGhyZWFkIGhhcyBiZWVuIHJlZ2lzdGVyZWQgdG8gUEpMSUIuCisgKgorICogQHJldHVybgkJTm9uLXplcm8gaWYgaXQgaXMgcmVnaXN0ZXJlZC4KKyAqLworUEpfREVDTChwal9ib29sX3QpIHBqX3RocmVhZF9pc19yZWdpc3RlcmVkKHZvaWQpOworCisKKy8qKgorICogR2V0IHRocmVhZCBwcmlvcml0eSB2YWx1ZSBmb3IgdGhlIHRocmVhZC4KKyAqCisgKiBAcGFyYW0gdGhyZWFkCVRocmVhZCBoYW5kbGUuCisgKgorICogQHJldHVybgkJVGhyZWFkIHByaW9yaXR5IHZhbHVlLCBvciAtMSBvbiBlcnJvci4KKyAqLworUEpfREVDTChpbnQpIHBqX3RocmVhZF9nZXRfcHJpbyhwal90aHJlYWRfdCAqdGhyZWFkKTsKKworCisvKioKKyAqIFNldCB0aGUgdGhyZWFkIHByaW9yaXR5LiBUaGUgcHJpb3JpdHkgdmFsdWUgbXVzdCBiZSBpbiB0aGUgcHJpb3JpdHkKKyAqIHZhbHVlIHJhbmdlLCB3aGljaCBjYW4gYmUgcmV0cmlldmVkIHdpdGggI3BqX3RocmVhZF9nZXRfcHJpb19taW4oKSBhbmQKKyAqICNwal90aHJlYWRfZ2V0X3ByaW9fbWF4KCkgZnVuY3Rpb25zLgorICoKKyAqIEBwYXJhbSB0aHJlYWQJVGhyZWFkIGhhbmRsZS4KKyAqIEBwYXJhbSBwcmlvCQlOZXcgcHJpb3JpdHkgdG8gYmUgc2V0IHRvIHRoZSB0aHJlYWQuCisgKgorICogQHJldHVybgkJUEpfU1VDQ0VTUyBvbiBzdWNjZXNzIG9yIHRoZSBlcnJvciBjb2RlLgorICovCitQSl9ERUNMKHBqX3N0YXR1c190KSBwal90aHJlYWRfc2V0X3ByaW8ocGpfdGhyZWFkX3QgKnRocmVhZCwgIGludCBwcmlvKTsKKworLyoqCisgKiBHZXQgdGhlIGxvd2VzdCBwcmlvcml0eSB2YWx1ZSBhdmFpbGFibGUgZm9yIHRoaXMgdGhyZWFkLgorICoKKyAqIEBwYXJhbSB0aHJlYWQJVGhyZWFkIGhhbmRsZS4KKyAqIEByZXR1cm4JCU1pbmltdW0gdGhyZWFkIHByaW9yaXR5IHZhbHVlLCBvciAtMSBvbiBlcnJvci4KKyAqLworUEpfREVDTChpbnQpIHBqX3RocmVhZF9nZXRfcHJpb19taW4ocGpfdGhyZWFkX3QgKnRocmVhZCk7CisKKworLyoqCisgKiBHZXQgdGhlIGhpZ2hlc3QgcHJpb3JpdHkgdmFsdWUgYXZhaWxhYmxlIGZvciB0aGlzIHRocmVhZC4KKyAqCisgKiBAcGFyYW0gdGhyZWFkCVRocmVhZCBoYW5kbGUuCisgKiBAcmV0dXJuCQlNaW5pbXVtIHRocmVhZCBwcmlvcml0eSB2YWx1ZSwgb3IgLTEgb24gZXJyb3IuCisgKi8KK1BKX0RFQ0woaW50KSBwal90aHJlYWRfZ2V0X3ByaW9fbWF4KHBqX3RocmVhZF90ICp0aHJlYWQpOworCisKKy8qKgorICogUmV0dXJuIG5hdGl2ZSBoYW5kbGUgZnJvbSBwal90aHJlYWRfdCBmb3IgbWFuaXB1bGF0aW9uIHVzaW5nIG5hdGl2ZQorICogT1MgQVBJcy4KKyAqCisgKiBAcGFyYW0gdGhyZWFkCVBKTElCIHRocmVhZCBkZXNjcmlwdG9yLgorICoKKyAqIEByZXR1cm4JCU5hdGl2ZSB0aHJlYWQgaGFuZGxlLiBGb3IgZXhhbXBsZSwgd2hlbiB0aGUKKyAqCQkJYmFja2VuZCB0aHJlYWQgdXNlcyBwdGhyZWFkLCB0aGlzIGZ1bmN0aW9uIHdpbGwKKyAqCQkJcmV0dXJuIHBvaW50ZXIgdG8gcHRocmVhZF90LCBhbmQgb24gV2luZG93cywKKyAqCQkJdGhpcyBmdW5jdGlvbiB3aWxsIHJldHVybiBIQU5ETEUuCisgKi8KK1BKX0RFQ0wodm9pZCopIHBqX3RocmVhZF9nZXRfb3NfaGFuZGxlKHBqX3RocmVhZF90ICp0aHJlYWQpOworCisvKioKKyAqIEdldCB0aHJlYWQgbmFtZS4KKyAqCisgKiBAcGFyYW0gdGhyZWFkICAgIFRoZSB0aHJlYWQgaGFuZGxlLgorICoKKyAqIEByZXR1cm4gVGhyZWFkIG5hbWUgYXMgbnVsbCB0ZXJtaW5hdGVkIHN0cmluZy4KKyAqLworUEpfREVDTChjb25zdCBjaGFyKikgcGpfdGhyZWFkX2dldF9uYW1lKHBqX3RocmVhZF90ICp0aHJlYWQpOworCisvKioKKyAqIFJlc3VtZSBhIHN1c3BlbmRlZCB0aHJlYWQuCisgKgorICogQHBhcmFtIHRocmVhZCAgICBUaGUgdGhyZWFkIGhhbmRsZS4KKyAqCisgKiBAcmV0dXJuIHplcm8gb24gc3VjY2Vzcy4KKyAqLworUEpfREVDTChwal9zdGF0dXNfdCkgcGpfdGhyZWFkX3Jlc3VtZShwal90aHJlYWRfdCAqdGhyZWFkKTsKKworLyoqCisgKiBHZXQgdGhlIGN1cnJlbnQgdGhyZWFkLgorICoKKyAqIEByZXR1cm4gVGhyZWFkIGhhbmRsZSBvZiBjdXJyZW50IHRocmVhZC4KKyAqLworUEpfREVDTChwal90aHJlYWRfdCopIHBqX3RocmVhZF90aGlzKHZvaWQpOworCisvKioKKyAqIEpvaW4gdGhyZWFkLCBhbmQgYmxvY2sgdGhlIGNhbGxlciB0aHJlYWQgdW50aWwgdGhlIHNwZWNpZmllZCB0aHJlYWQgZXhpdHMuCisgKiBJZiB0aGUgc3BlY2lmaWVkIHRocmVhZCBoYXMgYWxyZWFkeSBiZWVuIGRlYWQsIG9yIGl0IGRvZXMgbm90IGV4aXN0LAorICogdGhlIGZ1bmN0aW9uIHdpbGwgcmV0dXJuIGltbWVkaWF0ZWx5IHdpdGggc3VjY2Vzc2Z1bGwgc3RhdHVzLgorICoKKyAqIEBwYXJhbSB0aHJlYWQgICAgVGhlIHRocmVhZCBoYW5kbGUuCisgKgorICogQHJldHVybiBQSl9TVUNDRVNTIG9uIHN1Y2Nlc3MuCisgKi8KK1BKX0RFQ0wocGpfc3RhdHVzX3QpIHBqX3RocmVhZF9qb2luKHBqX3RocmVhZF90ICp0aHJlYWQpOworCisKKy8qKgorICogRGVzdHJveSB0aHJlYWQgYW5kIHJlbGVhc2UgcmVzb3VyY2VzIGFsbG9jYXRlZCBmb3IgdGhlIHRocmVhZC4KKyAqIEhvd2V2ZXIsIHRoZSBtZW1vcnkgYWxsb2NhdGVkIGZvciB0aGUgcGpfdGhyZWFkX3QgaXRzZWxmIHdpbGwgb25seSBiZSByZWxlYXNlZAorICogd2hlbiB0aGUgcG9vbCB1c2VkIHRvIGNyZWF0ZSB0aGUgdGhyZWFkIGlzIGRlc3Ryb3llZC4KKyAqCisgKiBAcGFyYW0gdGhyZWFkICAgIFRoZSB0aHJlYWQgaGFuZGxlLgorICoKKyAqIEByZXR1cm4gemVybyBvbiBzdWNjZXNzLgorICovCitQSl9ERUNMKHBqX3N0YXR1c190KSBwal90aHJlYWRfZGVzdHJveShwal90aHJlYWRfdCAqdGhyZWFkKTsKKworCisvKioKKyAqIFB1dCB0aGUgY3VycmVudCB0aHJlYWQgdG8gc2xlZXAgZm9yIHRoZSBzcGVjaWZpZWQgbWlsaXNlY29uZHMuCisgKgorICogQHBhcmFtIG1zZWMgTWlsaXNlY29uZHMgZGVsYXkuCisgKgorICogQHJldHVybiB6ZXJvIGlmIHN1Y2Nlc3NmdWxsLgorICovCitQSl9ERUNMKHBqX3N0YXR1c190KSBwal90aHJlYWRfc2xlZXAodW5zaWduZWQgbXNlYyk7CisKKy8qKgorICogQGRlZiBQSl9DSEVDS19TVEFDSygpCisgKiBQSl9DSEVDS19TVEFDSygpIG1hY3JvIGlzIHVzZWQgdG8gY2hlY2sgdGhlIHNhbml0eSBvZiB0aGUgc3RhY2suCisgKiBUaGUgT1MgaW1wbGVtZW50YXRpb24gbWF5IGNoZWNrIHRoYXQgbm8gc3RhY2sgb3ZlcmZsb3cgb2NjdXJzLCBhbmQKKyAqIGl0IGFsc28gbWF5IGNvbGxlY3Qgc3RhdGlzdGljIGFib3V0IHN0YWNrIHVzYWdlLgorICovCisjaWYgZGVmaW5lZChQSl9PU19IQVNfQ0hFQ0tfU1RBQ0spICYmIFBKX09TX0hBU19DSEVDS19TVEFDSyE9MAorCisjICBkZWZpbmUgUEpfQ0hFQ0tfU1RBQ0soKSBwal90aHJlYWRfY2hlY2tfc3RhY2soX19GSUxFX18sIF9fTElORV9fKQorCisvKiogQGludGVybmFsCisgKiBUaGUgaW1wbGVtZW50YXRpb24gb2Ygc3RhY2sgY2hlY2tpbmcuIAorICovCitQSl9ERUNMKHZvaWQpIHBqX3RocmVhZF9jaGVja19zdGFjayhjb25zdCBjaGFyICpmaWxlLCBpbnQgbGluZSk7CisKKy8qKiBAaW50ZXJuYWwKKyAqIEdldCBtYXhpbXVtIHN0YWNrIHVzYWdlIHN0YXRpc3RpYy4gCisgKi8KK1BKX0RFQ0wocGpfdWludDMyX3QpIHBqX3RocmVhZF9nZXRfc3RhY2tfbWF4X3VzYWdlKHBqX3RocmVhZF90ICp0aHJlYWQpOworCisvKiogQGludGVybmFsCisgKiBEdW1wIHRocmVhZCBzdGFjayBzdGF0dXMuIAorICovCitQSl9ERUNMKHBqX3N0YXR1c190KSBwal90aHJlYWRfZ2V0X3N0YWNrX2luZm8ocGpfdGhyZWFkX3QgKnRocmVhZCwKKwkJCQkJICAgICAgY29uc3QgY2hhciAqKmZpbGUsCisJCQkJCSAgICAgIGludCAqbGluZSk7CisjZWxzZQorCisjICBkZWZpbmUgUEpfQ0hFQ0tfU1RBQ0soKQorLyoqIHBqX3RocmVhZF9nZXRfc3RhY2tfbWF4X3VzYWdlKCkgZm9yIHRoZSB0aHJlYWQgKi8KKyMgIGRlZmluZSBwal90aHJlYWRfZ2V0X3N0YWNrX21heF91c2FnZSh0aHJlYWQpCSAgICAwCisvKiogcGpfdGhyZWFkX2dldF9zdGFja19pbmZvKCkgZm9yIHRoZSB0aHJlYWQgKi8KKyMgIGRlZmluZSBwal90aHJlYWRfZ2V0X3N0YWNrX2luZm8odGhyZWFkLGYsbCkJICAgICgqKGYpPSIiLCoobCk9MCkKKyNlbmRpZgkvKiBQSl9PU19IQVNfQ0hFQ0tfU1RBQ0sgKi8KKworLyoqCisgKiBAfQorICovCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqCisgKiBAZGVmZ3JvdXAgUEpfU1lNQklBTl9PUyBTeW1iaWFuIE9TIFNwZWNpZmljCisgKiBAaW5ncm91cCBQSl9PUworICogQHsKKyAqIEZ1bmN0aW9uYWxpdGllcyBzcGVjaWZpYyB0byBTeW1iaWFuIE9TLgorICoKKyAqIFN5bWJpYW4gT1Mgc3Ryb25nbHkgZGlzY291cmFnZXMgdGhlIHVzZSBvZiBwb2xsaW5nIHNpbmNlIHRoaXMgd2FzdGVzCisgKiBDUFUgcG93ZXIsIGFuZCBpbnN0ZWFkIHByb3ZpZGVzIEFjdGl2ZSBPYmplY3QgYW5kIEFjdGl2ZSBTY2hlZHVsZXIKKyAqIHBhdHRlcm4gdG8gYWxsb3cgYXBwbGljYXRpb24gKGluIHRoaXMgY2FzZSwgUEpMSUIpIHRvIHJlZ2lzdGVyIGFzeW5jaHJvbm91cworICogdGFza3MuIFBKTElCIHBvcnQgZm9yIFN5bWJpYW4gY29tcGxpZXMgdG8gdGhpcyByZWNvbW1lbmRlZCBiZWhhdmlvci4KKyAqIEFzIHRoZSByZXN1bHQsIGZldyB0aGluZ3MgaGF2ZSBiZWVuIGNoYW5nZWQgaW4gUEpMSUIgZm9yIFN5bWJpYW46CisgKgktIHRoZSB0aW1lciBoZWFwIChzZWUgQHJlZiBQSl9USU1FUikgaXMgaW1wbGVtZW50ZWQgd2l0aCBhY3RpdmUKKyAqCSAgb2JqZWN0IGZyYW1ld29yaywgYW5kIGVhY2ggdGltZXIgZW50cnkgcmVnaXN0ZXJlZCB0byB0aGUgdGltZXIgCisgKgkgIGhlYXAgd2lsbCByZWdpc3RlciBhbiBBY3RpdmUgT2JqZWN0IHRvIHRoZSBBY3RpdmUgU2NoZWR1bGVyLgorICoJICBCZWNhdXNlIG9mIHRoaXMsIHBvbGxpbmcgdGhlIHRpbWVyIGhlYXAgd2l0aCBwal90aW1lcl9oZWFwX3BvbGwoKQorICoJICBpcyBubyBsb25nZXIgbmVjZXNzYXJ5LCBhbmQgdGhpcyBmdW5jdGlvbiB3aWxsIGp1c3QgZXZhbHVhdGUKKyAqCSAgdG8gbm90aGluZy4KKyAqCS0gdGhlIGlvcXVldWUgKHNlZSBAcmVmIFBKX0lPUVVFVUUpIGlzIGFsc28gaW1wbGVtZW50ZWQgd2l0aAorICoJICBhY3RpdmUgb2JqZWN0IGZyYW1ld29yaywgd2l0aCBlYWNoIGFzeW5jaHJvbm91cyBvcGVyYXRpb24gd2lsbAorICoJICByZWdpc3RlciBhbiBBY3RpdmUgT2JqZWN0IHRvIHRoZSBBY3RpdmUgU2NoZWR1bGVyLiBCZWNhdXNlIG9mCisgKgkgIHRoaXMsIHBvbGxpbmcgdGhlIGlvcXVldWUgd2l0aCBwal9pb3F1ZXVlX3BvbGwoKSBpcyBubyBsb25nZXIKKyAqCSAgbmVjZXNzYXJ5LCBhbmQgdGhpcyBmdW5jdGlvbiB3aWxsIGp1c3QgZXZhbHVhdGUgdG8gbm90aGluZy4KKyAqCisgKiBTaW5jZSB0aW1lciBoZWFwIGFuZCBpb3F1ZXVlIHBvbGxpbmcgYXJlIG5vIGxvbmdlciBuZWNlc3NhcnksIFN5bWJpYW4KKyAqIGFwcGxpY2F0aW9uIGNhbiBub3cgcG9sbCBmb3IgYWxsIGV2ZW50cyBieSBjYWxsaW5nIAorICogXGEgVXNlcjo6V2FpdEZvckFueVJlcXVlc3QoKSBhbmQgXGEgQ0FjdGl2ZVNjaGVkdWxlcjo6UnVuSWZSZWFkeSgpLgorICogUEpMSUIgcHJvdmlkZXMgYSB0aGluIHdyYXBwZXIgd2hpY2ggY2FsbHMgdGhlc2UgdHdvIGZ1bmN0aW9ucywKKyAqIGNhbGxlZCBwal9zeW1iaWFub3NfcG9sbCgpLgorICovCisgCisvKioKKyAqIFdhaXQgdGhlIGNvbXBsZXRpb24gb2YgYW55IFN5bWJpYW4gYWN0aXZlIG9iamVjdHMuIFdoZW4gdGhlIHRpbWVvdXQKKyAqIHZhbHVlIGlzIG5vdCBzcGVjaWZpZWQgKHRoZSBcYSBtc190aW1lb3V0IGFyZ3VtZW50IGlzIC0xKSwgdGhpcyAKKyAqIGZ1bmN0aW9uIGlzIGEgdGhpbiB3cmFwcGVyIHdoaWNoIGNhbGxzIFxhIFVzZXI6OldhaXRGb3JBbnlSZXF1ZXN0KCkgCisgKiBhbmQgXGEgQ0FjdGl2ZVNjaGVkdWxlcjo6UnVuSWZSZWFkeSgpLiBJZiB0aGUgdGltZW91dCB2YWx1ZSBpcworICogc3BlY2lmaWVkLCB0aGlzIGZ1bmN0aW9uIHdpbGwgc2NoZWR1bGUgYSB0aW1lciBlbnRyeSB0byB0aGUgdGltZXIKKyAqIGhlYXAgKHdoaWNoIGlzIGFuIEFjdGl2ZSBPYmplY3QpLCB0byBsaW1pdCB0aGUgd2FpdCB0aW1lIGZvciBldmVudAorICogb2NjdXJlbmNlcy4gU2NoZWR1bGluZyBhIHRpbWVyIGVudHJ5IGlzIGFuIGV4cGVuc2l2ZSBvcGVyYXRpb24sCisgKiB0aGVyZWZvcmUgYXBwbGljYXRpb24gc2hvdWxkIG9ubHkgc3BlY2lmeSBhIHRpbWVvdXQgdmFsdWUgd2hlbiBpdCdzCisgKiByZWFsbHkgbmVjZXNzYXJ5IChmb3IgZXhhbXBsZSwgd2hlbiBpdCdzIG5vdCBzdXJlIHRoZXJlIGFyZSBvdGhlcgorICogQWN0aXZlIE9iamVjdHMgY3VycmVudGx5IHJ1bm5pbmcgaW4gdGhlIGFwcGxpY2F0aW9uKS4KKyAqCisgKiBAcGFyYW0gcHJpb3JpdHkJVGhlIG1pbmltdW0gcHJpb3JpdHkgb2YgdGhlIEFjdGl2ZSBPYmplY3RzIHRvCisgKgkJCXBvbGwsIHdoaWNoIHZhbHVlcyBhcmUgZnJvbSBDQWN0aXZlOjpUUHJpb3JpdHkKKyAqCQkJY29uc3RhbnRzLiBJZiAtMSBpcyBnaXZlbiwgQ0FjdGl2ZTo6RVByaW9yaXR5U3RhbmRhcmQuCisgKgkJCXByaW9yaXR5IHdpbGwgYmUgdXNlZC4KKyAqIEBwYXJhbSBtc190aW1lb3V0CU9wdGlvbmFsIHRpbWVvdXQgdG8gd2FpdC4gQXBwbGljYXRpb24gc2hvdWxkCisgKgkJCXNwZWNpZnkgLTEgdG8gbGV0IHRoZSBmdW5jdGlvbiB3YWl0IGluZGVmaW5pdGVseQorICoJCQlmb3IgYW55IGV2ZW50cy4KKyAqCisgKiBAcmV0dXJuCQlQSl9UUlVFIGlmIHRoZXJlIGhhdmUgYmVlbiBhbnkgZXZlbnRzIGV4ZWN1dGVkCisgKgkJCWR1cmluZyB0aGUgcG9sbGluZy4gVGhpcyBmdW5jdGlvbiB3aWxsIG9ubHkgcmV0dXJuCisgKgkJCVBKX0ZBTFNFIGlmIFxhIG1zX3RpbWVvdXQgYXJndW1lbnQgaXMgc3BlY2lmaWVkCisgKgkJCShpLmUuIHRoZSB2YWx1ZSBpcyBub3QgLTEpIGFuZCB0aGVyZSB3YXMgbm8gZXZlbnQKKyAqCQkJZXhlY3V0ZWQgd2hlbiB0aGUgdGltZW91dCB0aW1lciBlbGFwc2VkLgorICovCitQSl9ERUNMKHBqX2Jvb2xfdCkgcGpfc3ltYmlhbm9zX3BvbGwoaW50IHByaW9yaXR5LCBpbnQgbXNfdGltZW91dCk7CisKKworLyoqCisgKiBUaGlzIHN0cnVjdHVyZSBkZWNsYXJlcyBTeW1iaWFuIE9TIHNwZWNpZmljIHBhcmFtZXRlcnMgdGhhdCBjYW4gYmUKKyAqIHNwZWNpZmllZCB3aGVuIGNhbGxpbmcgI3BqX3N5bWJpYW5vc19zZXRfcGFyYW1zKCkuCisgKi8KK3R5cGVkZWYgc3RydWN0IHBqX3N5bWJpYW5vc19wYXJhbXMgCit7CisgICAgLyoqCisgICAgICogT3B0aW9uYWwgUlNvY2tldFNlcnYgaW5zdGFuY2UgdG8gYmUgdXNlZCBieSBQSkxJQi4gSWYgdGhpcworICAgICAqIHZhbHVlIGlzIE5VTEwsIFBKTElCIHdpbGwgY3JlYXRlIGEgbmV3IFJTb2NrZXRTZXJ2IGluc3RhbmNlCisgICAgICogd2hlbiBwal9pbml0KCkgaXMgY2FsbGVkLgorICAgICAqLworICAgIHZvaWQJKnJzb2NrZXRzZXJ2OworICAgIAorICAgIC8qKgorICAgICAqIE9wdGlvbmFsIFJDb25uZWN0aW9uIGluc3RhbmNlIHRvIGJlIHVzZWQgYnkgUEpMSUIgd2hlbiBjcmVhdGluZworICAgICAqIHNvY2tldHMuIElmIHRoaXMgdmFsdWUgaXMgTlVMTCwgbm8gUkNvbm5lY3Rpb24gd2lsbCBiZQorICAgICAqIHNwZWNpZmllZCB3aGVuIGNyZWF0aW5nIHNvY2tldHMuCisgICAgICovCisgICAgdm9pZAkqcmNvbm5lY3Rpb247CisgICAgCisgICAgLyoqCisgICAgICogT3B0aW9uYWwgUkhvc3RSZXNvbHZlciBpbnN0YW5jZSB0byBiZSB1c2VkIGJ5IFBKTElCLiBJZiB0aGlzIHZhbHVlCisgICAgICogaXMgTlVMTCwgYSBuZXcgUkhvc3RSZXNvbHZlciBpbnN0YW5jZSB3aWxsIGJlIGNyZWF0ZWQgd2hlbgorICAgICAqIHBqX2luaXQoKSBpcyBjYWxsZWQuCisgICAgICovCisgICAgdm9pZCAJKnJob3N0cmVzb2x2ZXI7CisgICAgIAorICAgIC8qKgorICAgICAqIE9wdGlvbmFsIFJIb3N0UmVzb2x2ZXIgZm9yIElQdjYgaW5zdGFuY2UgdG8gYmUgdXNlZCBieSBQSkxJQi4gCisgICAgICogSWYgdGhpcyB2YWx1ZSBpcyBOVUxMLCBhIG5ldyBSSG9zdFJlc29sdmVyIGluc3RhbmNlIHdpbGwgYmUgY3JlYXRlZAorICAgICAqIHdoZW4gcGpfaW5pdCgpIGlzIGNhbGxlZC4KKyAgICAgKi8KKyAgICB2b2lkIAkqcmhvc3RyZXNvbHZlcjY7CisgICAgIAorfSBwal9zeW1iaWFub3NfcGFyYW1zOworCisvKioKKyAqIFNwZWNpZnkgU3ltYmlhbiBPUyBwYXJhbWV0ZXJzIHRvIGJlIHVzZWQgYnkgUEpMSUIuIFRoaXMgZnVuY3Rpb24gTVVTVAorICogYmUgY2FsbGVkIGJlZm9yZSAjcGpfaW5pdCgpIGlzIGNhbGxlZC4KKyAqCisgKiBAcGFyYW0gcHJtCQlTeW1iaWFuIHNwZWNpZmljIHBhcmFtZXRlcnMuCisgKgorICogQHJldHVybgkJUEpfU1VDQ0VTUyBpZiB0aGUgcGFyYW1ldGVycyBjYW4gYmUgYXBwbGllZAorICoJCQlzdWNjZXNzZnVsbHkuCisgKi8KK1BKX0RFQ0wocGpfc3RhdHVzX3QpIHBqX3N5bWJpYW5vc19zZXRfcGFyYW1zKHBqX3N5bWJpYW5vc19wYXJhbXMgKnBybSk7CisKKy8qKgorICogIE5vdGlmeSBQSkxJQiB0aGF0IHRoZSBhY2Nlc3MgcG9pbnQgY29ubmVjdGlvbiBoYXMgYmVlbiBkb3duIG9yIHVudXNhYmxlCisgKiAgYW5kIFBKTElCIHNob3VsZCBub3QgdHJ5IHRvIGFjY2VzcyB0aGUgU3ltYmlhbiBzb2NrZXQgQVBJIChlc3BlY2lhbGx5IG9uZXMKKyAqICB0aGF0IHNlbmQgcGFja2V0cykuIFNlbmRpbmcgcGFja2V0IHdoZW4gUkNvbm5lY3Rpb24gaXMgcmVjb25uZWN0ZWQgdG8gCisgKiAgZGlmZmVyZW50IGFjY2VzcyBwb2ludCBtYXkgY2F1c2UgdGhlIFdhaXRGb3JSZXF1ZXN0KCkgZm9yIHRoZSBmdW5jdGlvbiB0byAKKyAqICBibG9jayBpbmRlZmluaXRlbHkuCisgKiAgCisgKiAgQHBhcmFtIHVwCQlJZiBzZXQgdG8gUEpfRkFMU0UgaXQgd2lsbCBjYXVzZSBQSkxJQiB0byBub3QgdHJ5CisgKiAgCQkJdG8gYWNjZXNzIHNvY2tldCBBUEksIGFuZCBlcnJvciB3aWxsIGJlIHJldHVybmVkCisgKiAgCQkJaW1tZWRpYXRlbHkgaW5zdGVhZC4KKyAqLworUEpfREVDTCh2b2lkKSBwal9zeW1iaWFub3Nfc2V0X2Nvbm5lY3Rpb25fc3RhdHVzKHBqX2Jvb2xfdCB1cCk7CisKKy8qKgorICogQH0KKyAqLworIAorLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioKKyAqIEBkZWZncm91cCBQSl9UTFMgVGhyZWFkIExvY2FsIFN0b3JhZ2UuCisgKiBAaW5ncm91cCBQSl9PUworICogQHsKKyAqLworCisvKiogCisgKiBBbGxvY2F0ZSB0aHJlYWQgbG9jYWwgc3RvcmFnZSBpbmRleC4gVGhlIGluaXRpYWwgdmFsdWUgb2YgdGhlIHZhcmlhYmxlIGF0CisgKiB0aGUgaW5kZXggaXMgemVyby4KKyAqCisgKiBAcGFyYW0gaW5kZXgJICAgIFBvaW50ZXIgdG8gaG9sZCB0aGUgcmV0dXJuIHZhbHVlLgorICogQHJldHVybgkgICAgUEpfU1VDQ0VTUyBvbiBzdWNjZXNzLCBvciB0aGUgZXJyb3IgY29kZS4KKyAqLworUEpfREVDTChwal9zdGF0dXNfdCkgcGpfdGhyZWFkX2xvY2FsX2FsbG9jKGxvbmcgKmluZGV4KTsKKworLyoqCisgKiBEZWFsbG9jYXRlIHRocmVhZCBsb2NhbCB2YXJpYWJsZS4KKyAqCisgKiBAcGFyYW0gaW5kZXgJICAgIFRoZSB2YXJpYWJsZSBpbmRleC4KKyAqLworUEpfREVDTCh2b2lkKSBwal90aHJlYWRfbG9jYWxfZnJlZShsb25nIGluZGV4KTsKKworLyoqCisgKiBTZXQgdGhlIHZhbHVlIG9mIHRocmVhZCBsb2NhbCB2YXJpYWJsZS4KKyAqCisgKiBAcGFyYW0gaW5kZXgJICAgIFRoZSBpbmRleCBvZiB0aGUgdmFyaWFibGUuCisgKiBAcGFyYW0gdmFsdWUJICAgIFRoZSB2YWx1ZS4KKyAqLworUEpfREVDTChwal9zdGF0dXNfdCkgcGpfdGhyZWFkX2xvY2FsX3NldChsb25nIGluZGV4LCB2b2lkICp2YWx1ZSk7CisKKy8qKgorICogR2V0IHRoZSB2YWx1ZSBvZiB0aHJlYWQgbG9jYWwgdmFyaWFibGUuCisgKgorICogQHBhcmFtIGluZGV4CSAgICBUaGUgaW5kZXggb2YgdGhlIHZhcmlhYmxlLgorICogQHJldHVybgkgICAgVGhlIHZhbHVlLgorICovCitQSl9ERUNMKHZvaWQqKSBwal90aHJlYWRfbG9jYWxfZ2V0KGxvbmcgaW5kZXgpOworCisKKy8qKgorICogQH0KKyAqLworCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqCisgKiBAZGVmZ3JvdXAgUEpfQVRPTUlDIEF0b21pYyBWYXJpYWJsZXMKKyAqIEBpbmdyb3VwIFBKX09TCisgKiBAeworICoKKyAqIFRoaXMgbW9kdWxlIHByb3ZpZGVzIEFQSSB0byBtYW5pcHVsYXRlIGF0b21pYyB2YXJpYWJsZXMuCisgKgorICogXHNlY3Rpb24gcGpfYXRvbWljX2V4YW1wbGVzX3NlYyBFeGFtcGxlcworICoKKyAqIEZvciBzb21lIGV4YW1wbGUgY29kZXMsIHBsZWFzZSBzZWU6CisgKiAgLSBAcmVmIHBhZ2VfcGpsaWJfYXRvbWljX3Rlc3QKKyAqLworCisKKy8qKgorICogQ3JlYXRlIGF0b21pYyB2YXJpYWJsZS4KKyAqCisgKiBAcGFyYW0gcG9vbAkgICAgVGhlIHBvb2wuCisgKiBAcGFyYW0gaW5pdGlhbCAgIFRoZSBpbml0aWFsIHZhbHVlIG9mIHRoZSBhdG9taWMgdmFyaWFibGUuCisgKiBAcGFyYW0gYXRvbWljICAgIFBvaW50ZXIgdG8gaG9sZCB0aGUgYXRvbWljIHZhcmlhYmxlIHVwb24gcmV0dXJuLgorICoKKyAqIEByZXR1cm4JICAgIFBKX1NVQ0NFU1Mgb24gc3VjY2Vzcywgb3IgdGhlIGVycm9yIGNvZGUuCisgKi8KK1BKX0RFQ0wocGpfc3RhdHVzX3QpIHBqX2F0b21pY19jcmVhdGUoIHBqX3Bvb2xfdCAqcG9vbCwgCisJCQkJICAgICAgIHBqX2F0b21pY192YWx1ZV90IGluaXRpYWwsCisJCQkJICAgICAgIHBqX2F0b21pY190ICoqYXRvbWljICk7CisKKy8qKgorICogRGVzdHJveSBhdG9taWMgdmFyaWFibGUuCisgKgorICogQHBhcmFtIGF0b21pY192YXIJdGhlIGF0b21pYyB2YXJpYWJsZS4KKyAqCisgKiBAcmV0dXJuIFBKX1NVQ0NFU1MgaWYgc3VjY2Vzcy4KKyAqLworUEpfREVDTChwal9zdGF0dXNfdCkgcGpfYXRvbWljX2Rlc3Ryb3koIHBqX2F0b21pY190ICphdG9taWNfdmFyICk7CisKKy8qKgorICogU2V0IHRoZSB2YWx1ZSBvZiBhbiBhdG9taWMgdHlwZSwgYW5kIHJldHVybiB0aGUgcHJldmlvdXMgdmFsdWUuCisgKgorICogQHBhcmFtIGF0b21pY192YXIJdGhlIGF0b21pYyB2YXJpYWJsZS4KKyAqIEBwYXJhbSB2YWx1ZQkJdmFsdWUgdG8gYmUgc2V0IHRvIHRoZSB2YXJpYWJsZS4KKyAqLworUEpfREVDTCh2b2lkKSBwal9hdG9taWNfc2V0KCBwal9hdG9taWNfdCAqYXRvbWljX3ZhciwgCisJCQkgICAgIHBqX2F0b21pY192YWx1ZV90IHZhbHVlKTsKKworLyoqCisgKiBHZXQgdGhlIHZhbHVlIG9mIGFuIGF0b21pYyB0eXBlLgorICoKKyAqIEBwYXJhbSBhdG9taWNfdmFyCXRoZSBhdG9taWMgdmFyaWFibGUuCisgKgorICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlIGF0b21pYyB2YXJpYWJsZS4KKyAqLworUEpfREVDTChwal9hdG9taWNfdmFsdWVfdCkgcGpfYXRvbWljX2dldChwal9hdG9taWNfdCAqYXRvbWljX3Zhcik7CisKKy8qKgorICogSW5jcmVtZW50IHRoZSB2YWx1ZSBvZiBhbiBhdG9taWMgdHlwZS4KKyAqCisgKiBAcGFyYW0gYXRvbWljX3Zhcgl0aGUgYXRvbWljIHZhcmlhYmxlLgorICovCitQSl9ERUNMKHZvaWQpIHBqX2F0b21pY19pbmMocGpfYXRvbWljX3QgKmF0b21pY192YXIpOworCisvKioKKyAqIEluY3JlbWVudCB0aGUgdmFsdWUgb2YgYW4gYXRvbWljIHR5cGUgYW5kIGdldCB0aGUgcmVzdWx0LgorICoKKyAqIEBwYXJhbSBhdG9taWNfdmFyCXRoZSBhdG9taWMgdmFyaWFibGUuCisgKgorICogQHJldHVybiAgICAgICAgICAgICAgVGhlIGluY3JlbWVudGVkIHZhbHVlLgorICovCitQSl9ERUNMKHBqX2F0b21pY192YWx1ZV90KSBwal9hdG9taWNfaW5jX2FuZF9nZXQocGpfYXRvbWljX3QgKmF0b21pY192YXIpOworCisvKioKKyAqIERlY3JlbWVudCB0aGUgdmFsdWUgb2YgYW4gYXRvbWljIHR5cGUuCisgKgorICogQHBhcmFtIGF0b21pY192YXIJdGhlIGF0b21pYyB2YXJpYWJsZS4KKyAqLworUEpfREVDTCh2b2lkKSBwal9hdG9taWNfZGVjKHBqX2F0b21pY190ICphdG9taWNfdmFyKTsKKworLyoqCisgKiBEZWNyZW1lbnQgdGhlIHZhbHVlIG9mIGFuIGF0b21pYyB0eXBlIGFuZCBnZXQgdGhlIHJlc3VsdC4KKyAqCisgKiBAcGFyYW0gYXRvbWljX3Zhcgl0aGUgYXRvbWljIHZhcmlhYmxlLgorICoKKyAqIEByZXR1cm4gICAgICAgICAgICAgIFRoZSBkZWNyZW1lbnRlZCB2YWx1ZS4KKyAqLworUEpfREVDTChwal9hdG9taWNfdmFsdWVfdCkgcGpfYXRvbWljX2RlY19hbmRfZ2V0KHBqX2F0b21pY190ICphdG9taWNfdmFyKTsKKworLyoqCisgKiBBZGQgYSB2YWx1ZSB0byBhbiBhdG9taWMgdHlwZS4KKyAqCisgKiBAcGFyYW0gYXRvbWljX3ZhcglUaGUgYXRvbWljIHZhcmlhYmxlLgorICogQHBhcmFtIHZhbHVlCQlWYWx1ZSB0byBiZSBhZGRlZC4KKyAqLworUEpfREVDTCh2b2lkKSBwal9hdG9taWNfYWRkKCBwal9hdG9taWNfdCAqYXRvbWljX3ZhciwKKwkJCSAgICAgcGpfYXRvbWljX3ZhbHVlX3QgdmFsdWUpOworCisvKioKKyAqIEFkZCBhIHZhbHVlIHRvIGFuIGF0b21pYyB0eXBlIGFuZCBnZXQgdGhlIHJlc3VsdC4KKyAqCisgKiBAcGFyYW0gYXRvbWljX3ZhcglUaGUgYXRvbWljIHZhcmlhYmxlLgorICogQHBhcmFtIHZhbHVlCQlWYWx1ZSB0byBiZSBhZGRlZC4KKyAqCisgKiBAcmV0dXJuICAgICAgICAgICAgICBUaGUgcmVzdWx0IGFmdGVyIHRoZSBhZGRpdGlvbi4KKyAqLworUEpfREVDTChwal9hdG9taWNfdmFsdWVfdCkgcGpfYXRvbWljX2FkZF9hbmRfZ2V0KCBwal9hdG9taWNfdCAqYXRvbWljX3ZhciwKKwkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgcGpfYXRvbWljX3ZhbHVlX3QgdmFsdWUpOworCisvKioKKyAqIEB9CisgKi8KKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioKKyAqIEBkZWZncm91cCBQSl9NVVRFWCBNdXRleGVzLgorICogQGluZ3JvdXAgUEpfT1MKKyAqIEB7CisgKgorICogTXV0ZXggbWFuaXB1bGF0aW9uLiBBbHRlcm5hdGl2ZWx5LCBhcHBsaWNhdGlvbiBjYW4gdXNlIGhpZ2hlciBhYnN0cmFjdGlvbgorICogZm9yIGxvY2sgb2JqZWN0cywgd2hpY2ggcHJvdmlkZXMgdW5pZm9ybSBBUEkgZm9yIGFsbCBraW5kcyBvZiBsb2NrIAorICogbWVjaGFuaXNtcywgaW5jbHVkaW5nIG11dGV4LiBTZWUgQHJlZiBQSl9MT0NLIGZvciBtb3JlIGluZm9ybWF0aW9uLgorICovCisKKy8qKgorICogTXV0ZXggdHlwZXM6CisgKiAgLSBQSl9NVVRFWF9ERUZBVUxUOiBkZWZhdWx0IG11dGV4IHR5cGUsIHdoaWNoIGlzIHN5c3RlbSBkZXBlbmRlbnQuCisgKiAgLSBQSl9NVVRFWF9TSU1QTEU6IG5vbi1yZWN1cnNpdmUgbXV0ZXguCisgKiAgLSBQSl9NVVRFWF9SRUNVUlNFOiByZWN1cnNpdmUgbXV0ZXguCisgKi8KK3R5cGVkZWYgZW51bSBwal9tdXRleF90eXBlX2UKK3sKKyAgICBQSl9NVVRFWF9ERUZBVUxULAorICAgIFBKX01VVEVYX1NJTVBMRSwKKyAgICBQSl9NVVRFWF9SRUNVUlNFCit9IHBqX211dGV4X3R5cGVfZTsKKworCisvKioKKyAqIENyZWF0ZSBtdXRleCBvZiB0aGUgc3BlY2lmaWVkIHR5cGUuCisgKgorICogQHBhcmFtIHBvb2wJICAgIFRoZSBwb29sLgorICogQHBhcmFtIG5hbWUJICAgIE5hbWUgdG8gYmUgYXNzb2NpYXRlZCB3aXRoIHRoZSBtdXRleCAoZm9yIGRlYnVnZ2luZykuCisgKiBAcGFyYW0gdHlwZQkgICAgVGhlIHR5cGUgb2YgdGhlIG11dGV4LCBvZiB0eXBlICNwal9tdXRleF90eXBlX2UuCisgKiBAcGFyYW0gbXV0ZXgJICAgIFBvaW50ZXIgdG8gaG9sZCB0aGUgcmV0dXJuZWQgbXV0ZXggaW5zdGFuY2UuCisgKgorICogQHJldHVybgkgICAgUEpfU1VDQ0VTUyBvbiBzdWNjZXNzLCBvciB0aGUgZXJyb3IgY29kZS4KKyAqLworUEpfREVDTChwal9zdGF0dXNfdCkgcGpfbXV0ZXhfY3JlYXRlKHBqX3Bvb2xfdCAqcG9vbCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqbmFtZSwKKwkJCQkgICAgIGludCB0eXBlLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwal9tdXRleF90ICoqbXV0ZXgpOworCisvKioKKyAqIENyZWF0ZSBzaW1wbGUsIG5vbi1yZWN1cnNpdmUgbXV0ZXguCisgKiBUaGlzIGZ1bmN0aW9uIGlzIGEgc2ltcGxlIHdyYXBwZXIgZm9yICNwal9tdXRleF9jcmVhdGUgdG8gY3JlYXRlIAorICogbm9uLXJlY3Vyc2l2ZSBtdXRleC4KKyAqCisgKiBAcGFyYW0gcG9vbAkgICAgVGhlIHBvb2wuCisgKiBAcGFyYW0gbmFtZQkgICAgTXV0ZXggbmFtZS4KKyAqIEBwYXJhbSBtdXRleAkgICAgUG9pbnRlciB0byBob2xkIHRoZSByZXR1cm5lZCBtdXRleCBpbnN0YW5jZS4KKyAqCisgKiBAcmV0dXJuCSAgICBQSl9TVUNDRVNTIG9uIHN1Y2Nlc3MsIG9yIHRoZSBlcnJvciBjb2RlLgorICovCitQSl9ERUNMKHBqX3N0YXR1c190KSBwal9tdXRleF9jcmVhdGVfc2ltcGxlKCBwal9wb29sX3QgKnBvb2wsIGNvbnN0IGNoYXIgKm5hbWUsCisJCQkJCSAgICAgcGpfbXV0ZXhfdCAqKm11dGV4ICk7CisKKy8qKgorICogQ3JlYXRlIHJlY3Vyc2l2ZSBtdXRleC4KKyAqIFRoaXMgZnVuY3Rpb24gaXMgYSBzaW1wbGUgd3JhcHBlciBmb3IgI3BqX211dGV4X2NyZWF0ZSB0byBjcmVhdGUgCisgKiByZWN1cnNpdmUgbXV0ZXguCisgKgorICogQHBhcmFtIHBvb2wJICAgIFRoZSBwb29sLgorICogQHBhcmFtIG5hbWUJICAgIE11dGV4IG5hbWUuCisgKiBAcGFyYW0gbXV0ZXgJICAgIFBvaW50ZXIgdG8gaG9sZCB0aGUgcmV0dXJuZWQgbXV0ZXggaW5zdGFuY2UuCisgKgorICogQHJldHVybgkgICAgUEpfU1VDQ0VTUyBvbiBzdWNjZXNzLCBvciB0aGUgZXJyb3IgY29kZS4KKyAqLworUEpfREVDTChwal9zdGF0dXNfdCkgcGpfbXV0ZXhfY3JlYXRlX3JlY3Vyc2l2ZSggcGpfcG9vbF90ICpwb29sLAorCQkJCQkgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUsCisJCQkJCQlwal9tdXRleF90ICoqbXV0ZXggKTsKKworLyoqCisgKiBBY3F1aXJlIG11dGV4IGxvY2suCisgKgorICogQHBhcmFtIG11dGV4CSAgICBUaGUgbXV0ZXguCisgKiBAcmV0dXJuCSAgICBQSl9TVUNDRVNTIG9uIHN1Y2Nlc3MsIG9yIHRoZSBlcnJvciBjb2RlLgorICovCitQSl9ERUNMKHBqX3N0YXR1c190KSBwal9tdXRleF9sb2NrKHBqX211dGV4X3QgKm11dGV4KTsKKworLyoqCisgKiBSZWxlYXNlIG11dGV4IGxvY2suCisgKgorICogQHBhcmFtIG11dGV4CSAgICBUaGUgbXV0ZXguCisgKiBAcmV0dXJuCSAgICBQSl9TVUNDRVNTIG9uIHN1Y2Nlc3MsIG9yIHRoZSBlcnJvciBjb2RlLgorICovCitQSl9ERUNMKHBqX3N0YXR1c190KSBwal9tdXRleF91bmxvY2socGpfbXV0ZXhfdCAqbXV0ZXgpOworCisvKioKKyAqIFRyeSB0byBhY3F1aXJlIG11dGV4IGxvY2suCisgKgorICogQHBhcmFtIG11dGV4CSAgICBUaGUgbXV0ZXguCisgKiBAcmV0dXJuCSAgICBQSl9TVUNDRVNTIG9uIHN1Y2Nlc3MsIG9yIHRoZSBlcnJvciBjb2RlIGlmIHRoZQorICoJCSAgICBsb2NrIGNvdWxkbid0IGJlIGFjcXVpcmVkLgorICovCitQSl9ERUNMKHBqX3N0YXR1c190KSBwal9tdXRleF90cnlsb2NrKHBqX211dGV4X3QgKm11dGV4KTsKKworLyoqCisgKiBEZXN0cm95IG11dGV4LgorICoKKyAqIEBwYXJhbSBtdXRleAkgICAgVGUgbXV0ZXguCisgKiBAcmV0dXJuCSAgICBQSl9TVUNDRVNTIG9uIHN1Y2Nlc3MsIG9yIHRoZSBlcnJvciBjb2RlLgorICovCitQSl9ERUNMKHBqX3N0YXR1c190KSBwal9tdXRleF9kZXN0cm95KHBqX211dGV4X3QgKm11dGV4KTsKKworLyoqCisgKiBEZXRlcm1pbmUgd2hldGhlciBjYWxsaW5nIHRocmVhZCBpcyBvd25pbmcgdGhlIG11dGV4IChvbmx5IGF2YWlsYWJsZSB3aGVuCisgKiBQSl9ERUJVRyBpcyBzZXQpLgorICogQHBhcmFtIG11dGV4CSAgICBUaGUgbXV0ZXguCisgKiBAcmV0dXJuCSAgICBOb24temVybyBpZiB5ZXMuCisgKi8KK1BKX0RFQ0wocGpfYm9vbF90KSBwal9tdXRleF9pc19sb2NrZWQocGpfbXV0ZXhfdCAqbXV0ZXgpOworCisvKioKKyAqIEB9CisgKi8KKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioKKyAqIEBkZWZncm91cCBQSl9SV19NVVRFWCBSZWFkZXIvV3JpdGVyIE11dGV4CisgKiBAaW5ncm91cCBQSl9PUworICogQHsKKyAqIFJlYWRlci93cml0ZXIgbXV0ZXggaXMgYSBjbGFzc2ljIHN5bmNocm9uaXphdGlvbiBvYmplY3Qgd2hlcmUgbXVsdGlwbGUKKyAqIHJlYWRlcnMgY2FuIGFjcXVpcmUgdGhlIG11dGV4LCBidXQgb25seSBhIHNpbmdsZSB3cml0ZXIgY2FuIGFjcXVpcmUgdGhlIAorICogbXV0ZXguCisgKi8KKworLyoqCisgKiBPcGFxdWUgZGVjbGFyYXRpb24gZm9yIHJlYWRlci93cml0ZXIgbXV0ZXguCisgKiBSZWFkZXIvd3JpdGVyIG11dGV4IGlzIGEgY2xhc3NpYyBzeW5jaHJvbml6YXRpb24gb2JqZWN0IHdoZXJlIG11bHRpcGxlCisgKiByZWFkZXJzIGNhbiBhY3F1aXJlIHRoZSBtdXRleCwgYnV0IG9ubHkgYSBzaW5nbGUgd3JpdGVyIGNhbiBhY3F1aXJlIHRoZSAKKyAqIG11dGV4LgorICovCit0eXBlZGVmIHN0cnVjdCBwal9yd211dGV4X3QgcGpfcndtdXRleF90OworCisvKioKKyAqIENyZWF0ZSByZWFkZXIvd3JpdGVyIG11dGV4LgorICoKKyAqIEBwYXJhbSBwb29sCSAgICBQb29sIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhlIG11dGV4LgorICogQHBhcmFtIG5hbWUJICAgIE5hbWUgdG8gYmUgYXNzaWduZWQgdG8gdGhlIG11dGV4LgorICogQHBhcmFtIG11dGV4CSAgICBQb2ludGVyIHRvIHJlY2VpdmUgdGhlIG5ld2x5IGNyZWF0ZWQgbXV0ZXguCisgKgorICogQHJldHVybgkgICAgUEpfU1VDQ0VTUyBvbiBzdWNjZXNzLCBvciB0aGUgZXJyb3IgY29kZS4KKyAqLworUEpfREVDTChwal9zdGF0dXNfdCkgcGpfcndtdXRleF9jcmVhdGUocGpfcG9vbF90ICpwb29sLCBjb25zdCBjaGFyICpuYW1lLAorCQkJCSAgICAgICBwal9yd211dGV4X3QgKiptdXRleCk7CisKKy8qKgorICogTG9jayB0aGUgbXV0ZXggZm9yIHJlYWRpbmcuCisgKgorICogQHBhcmFtIG11dGV4CSAgICBUaGUgbXV0ZXguCisgKiBAcmV0dXJuCSAgICBQSl9TVUNDRVNTIG9uIHN1Y2Nlc3MsIG9yIHRoZSBlcnJvciBjb2RlLgorICovCitQSl9ERUNMKHBqX3N0YXR1c190KSBwal9yd211dGV4X2xvY2tfcmVhZChwal9yd211dGV4X3QgKm11dGV4KTsKKworLyoqCisgKiBMb2NrIHRoZSBtdXRleCBmb3Igd3JpdGluZy4KKyAqCisgKiBAcGFyYW0gbXV0ZXgJICAgIFRoZSBtdXRleC4KKyAqIEByZXR1cm4JICAgIFBKX1NVQ0NFU1Mgb24gc3VjY2Vzcywgb3IgdGhlIGVycm9yIGNvZGUuCisgKi8KK1BKX0RFQ0wocGpfc3RhdHVzX3QpIHBqX3J3bXV0ZXhfbG9ja193cml0ZShwal9yd211dGV4X3QgKm11dGV4KTsKKworLyoqCisgKiBSZWxlYXNlIHJlYWQgbG9jay4KKyAqCisgKiBAcGFyYW0gbXV0ZXgJICAgIFRoZSBtdXRleC4KKyAqIEByZXR1cm4JICAgIFBKX1NVQ0NFU1Mgb24gc3VjY2Vzcywgb3IgdGhlIGVycm9yIGNvZGUuCisgKi8KK1BKX0RFQ0wocGpfc3RhdHVzX3QpIHBqX3J3bXV0ZXhfdW5sb2NrX3JlYWQocGpfcndtdXRleF90ICptdXRleCk7CisKKy8qKgorICogUmVsZWFzZSB3cml0ZSBsb2NrLgorICoKKyAqIEBwYXJhbSBtdXRleAkgICAgVGhlIG11dGV4LgorICogQHJldHVybgkgICAgUEpfU1VDQ0VTUyBvbiBzdWNjZXNzLCBvciB0aGUgZXJyb3IgY29kZS4KKyAqLworUEpfREVDTChwal9zdGF0dXNfdCkgcGpfcndtdXRleF91bmxvY2tfd3JpdGUocGpfcndtdXRleF90ICptdXRleCk7CisKKy8qKgorICogRGVzdHJveSByZWFkZXIvd3JpdGVyIG11dGV4LgorICoKKyAqIEBwYXJhbSBtdXRleAkgICAgVGhlIG11dGV4LgorICogQHJldHVybgkgICAgUEpfU1VDQ0VTUyBvbiBzdWNjZXNzLCBvciB0aGUgZXJyb3IgY29kZS4KKyAqLworUEpfREVDTChwal9zdGF0dXNfdCkgcGpfcndtdXRleF9kZXN0cm95KHBqX3J3bXV0ZXhfdCAqbXV0ZXgpOworCisKKy8qKgorICogQH0KKyAqLworCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqCisgKiBAZGVmZ3JvdXAgUEpfQ1JJVF9TRUMgQ3JpdGljYWwgc2VjdGlvbnMuCisgKiBAaW5ncm91cCBQSl9PUworICogQHsKKyAqIENyaXRpY2FsIHNlY3Rpb24gcHJvdGVjdGlvbiBjYW4gYmUgdXNlZCB0byBwcm90ZWN0IHJlZ2lvbnMgd2hlcmU6CisgKiAgLSBtdXR1YWwgZXhjbHVzaW9uIHByb3RlY3Rpb24gaXMgbmVlZGVkLgorICogIC0gaXQncyByYXRoZXIgdG9vIGV4cGVuc2l2ZSB0byBjcmVhdGUgYSBtdXRleC4KKyAqICAtIHRoZSB0aW1lIHNwZW50IGluIHRoZSByZWdpb24gaXMgdmVyeSB2ZXJ5IGJyaWVmLgorICoKKyAqIENyaXRpY2FsIHNlY3Rpb24gaXMgYSBnbG9iYWwgb2JqZWN0LCBhbmQgaXQgcHJldmVudHMgYW55IHRocmVhZHMgZnJvbQorICogZW50ZXJpbmcgYW55IHJlZ2lvbnMgdGhhdCBhcmUgcHJvdGVjdGVkIGJ5IGNyaXRpY2FsIHNlY3Rpb24gb25jZSBhIHRocmVhZAorICogaXMgYWxyZWFkeSBpbiB0aGUgc2VjdGlvbi4KKyAqCisgKiBDcml0aWFsIHNlY3Rpb24gaXMgXGEgbm90IHJlY3Vyc2l2ZSEKKyAqCisgKiBBcHBsaWNhdGlvbiA8Yj5NVVNUIE5PVDwvYj4gY2FsbCBhbnkgZnVuY3Rpb25zIHRoYXQgbWF5IGNhdXNlIGN1cnJlbnQKKyAqIHRocmVhZCB0byBibG9jayAoc3VjaCBhcyBhbGxvY2F0aW5nIG1lbW9yeSwgcGVyZm9ybWluZyBJL08sIGxvY2tpbmcgbXV0ZXgsCisgKiBldGMuKSB3aGlsZSBob2xkaW5nIHRoZSBjcml0aWNhbCBzZWN0aW9uLgorICovCisvKioKKyAqIEVudGVyIGNyaXRpY2FsIHNlY3Rpb24uCisgKi8KK1BKX0RFQ0wodm9pZCkgcGpfZW50ZXJfY3JpdGljYWxfc2VjdGlvbih2b2lkKTsKKworLyoqCisgKiBMZWF2ZSBjcml0aWNhbCBzZWN0aW9uLgorICovCitQSl9ERUNMKHZvaWQpIHBqX2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24odm9pZCk7CisKKy8qKgorICogQH0KKyAqLworCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZiBkZWZpbmVkKFBKX0hBU19TRU1BUEhPUkUpICYmIFBKX0hBU19TRU1BUEhPUkUgIT0gMAorLyoqCisgKiBAZGVmZ3JvdXAgUEpfU0VNIFNlbWFwaG9yZXMuCisgKiBAaW5ncm91cCBQSl9PUworICogQHsKKyAqCisgKiBUaGlzIG1vZHVsZSBwcm92aWRlcyBhYnN0cmFjdGlvbiBmb3Igc2VtYXBob3Jlcywgd2hlcmUgYXZhaWxhYmxlLgorICovCisKKy8qKgorICogQ3JlYXRlIHNlbWFwaG9yZS4KKyAqCisgKiBAcGFyYW0gcG9vbAkgICAgVGhlIHBvb2wuCisgKiBAcGFyYW0gbmFtZQkgICAgTmFtZSB0byBiZSBhc3NpZ25lZCB0byB0aGUgc2VtYXBob3JlIChmb3IgbG9nZ2luZyBwdXJwb3NlKQorICogQHBhcmFtIGluaXRpYWwgICBUaGUgaW5pdGlhbCBjb3VudCBvZiB0aGUgc2VtYXBob3JlLgorICogQHBhcmFtIG1heAkgICAgVGhlIG1heGltdW0gY291bnQgb2YgdGhlIHNlbWFwaG9yZS4KKyAqIEBwYXJhbSBzZW0JICAgIFBvaW50ZXIgdG8gaG9sZCB0aGUgc2VtYXBob3JlIGNyZWF0ZWQuCisgKgorICogQHJldHVybgkgICAgUEpfU1VDQ0VTUyBvbiBzdWNjZXNzLCBvciB0aGUgZXJyb3IgY29kZS4KKyAqLworUEpfREVDTChwal9zdGF0dXNfdCkgcGpfc2VtX2NyZWF0ZSggcGpfcG9vbF90ICpwb29sLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUsCisJCQkJICAgIHVuc2lnbmVkIGluaXRpYWwsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbWF4LAorCQkJCSAgICBwal9zZW1fdCAqKnNlbSk7CisKKy8qKgorICogV2FpdCBmb3Igc2VtYXBob3JlLgorICoKKyAqIEBwYXJhbSBzZW0JVGhlIHNlbWFwaG9yZS4KKyAqCisgKiBAcmV0dXJuCVBKX1NVQ0NFU1Mgb24gc3VjY2Vzcywgb3IgdGhlIGVycm9yIGNvZGUuCisgKi8KK1BKX0RFQ0wocGpfc3RhdHVzX3QpIHBqX3NlbV93YWl0KHBqX3NlbV90ICpzZW0pOworCisvKioKKyAqIFRyeSB3YWl0IGZvciBzZW1hcGhvcmUuCisgKgorICogQHBhcmFtIHNlbQlUaGUgc2VtYXBob3JlLgorICoKKyAqIEByZXR1cm4JUEpfU1VDQ0VTUyBvbiBzdWNjZXNzLCBvciB0aGUgZXJyb3IgY29kZS4KKyAqLworUEpfREVDTChwal9zdGF0dXNfdCkgcGpfc2VtX3RyeXdhaXQocGpfc2VtX3QgKnNlbSk7CisKKy8qKgorICogUmVsZWFzZSBzZW1hcGhvcmUuCisgKgorICogQHBhcmFtIHNlbQlUaGUgc2VtYXBob3JlLgorICoKKyAqIEByZXR1cm4JUEpfU1VDQ0VTUyBvbiBzdWNjZXNzLCBvciB0aGUgZXJyb3IgY29kZS4KKyAqLworUEpfREVDTChwal9zdGF0dXNfdCkgcGpfc2VtX3Bvc3QocGpfc2VtX3QgKnNlbSk7CisKKy8qKgorICogRGVzdHJveSBzZW1hcGhvcmUuCisgKgorICogQHBhcmFtIHNlbQlUaGUgc2VtYXBob3JlLgorICoKKyAqIEByZXR1cm4JUEpfU1VDQ0VTUyBvbiBzdWNjZXNzLCBvciB0aGUgZXJyb3IgY29kZS4KKyAqLworUEpfREVDTChwal9zdGF0dXNfdCkgcGpfc2VtX2Rlc3Ryb3kocGpfc2VtX3QgKnNlbSk7CisKKy8qKgorICogQH0KKyAqLworI2VuZGlmCS8qIFBKX0hBU19TRU1BUEhPUkUgKi8KKworCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZiBkZWZpbmVkKFBKX0hBU19FVkVOVF9PQkopICYmIFBKX0hBU19FVkVOVF9PQkogIT0gMAorLyoqCisgKiBAZGVmZ3JvdXAgUEpfRVZFTlQgRXZlbnQgT2JqZWN0LgorICogQGluZ3JvdXAgUEpfT1MKKyAqIEB7CisgKgorICogVGhpcyBtb2R1bGUgcHJvdmlkZXMgYWJzdHJhY3Rpb24gdG8gZXZlbnQgb2JqZWN0IChlLmcuIFdpbjMyIEV2ZW50KSB3aGVyZQorICogYXZhaWxhYmxlLiBFdmVudCBvYmplY3RzIGNhbiBiZSB1c2VkIGZvciBzeW5jaHJvbml6YXRpb24gYW1vbmcgdGhyZWFkcy4KKyAqLworCisvKioKKyAqIENyZWF0ZSBldmVudCBvYmplY3QuCisgKgorICogQHBhcmFtIHBvb2wJCVRoZSBwb29sLgorICogQHBhcmFtIG5hbWUJCVRoZSBuYW1lIG9mIHRoZSBldmVudCBvYmplY3QgKGZvciBsb2dnaW5nIHB1cnBvc2UpLgorICogQHBhcmFtIG1hbnVhbF9yZXNldAlTcGVjaWZ5IHdoZXRoZXIgdGhlIGV2ZW50IGlzIG1hbnVhbC1yZXNldAorICogQHBhcmFtIGluaXRpYWwJU3BlY2lmeSB0aGUgaW5pdGlhbCBzdGF0ZSBvZiB0aGUgZXZlbnQgb2JqZWN0LgorICogQHBhcmFtIGV2ZW50CQlQb2ludGVyIHRvIGhvbGQgdGhlIHJldHVybmVkIGV2ZW50IG9iamVjdC4KKyAqCisgKiBAcmV0dXJuIGV2ZW50IGhhbmRsZSwgb3IgTlVMTCBpZiBmYWlsZWQuCisgKi8KK1BKX0RFQ0wocGpfc3RhdHVzX3QpIHBqX2V2ZW50X2NyZWF0ZShwal9wb29sX3QgKnBvb2wsIGNvbnN0IGNoYXIgKm5hbWUsCisJCQkJICAgICBwal9ib29sX3QgbWFudWFsX3Jlc2V0LCBwal9ib29sX3QgaW5pdGlhbCwKKwkJCQkgICAgIHBqX2V2ZW50X3QgKipldmVudCk7CisKKy8qKgorICogV2FpdCBmb3IgZXZlbnQgdG8gYmUgc2lnbmFsZWQuCisgKgorICogQHBhcmFtIGV2ZW50CSAgICBUaGUgZXZlbnQgb2JqZWN0LgorICoKKyAqIEByZXR1cm4gemVybyBpZiBzdWNjZXNzZnVsbC4KKyAqLworUEpfREVDTChwal9zdGF0dXNfdCkgcGpfZXZlbnRfd2FpdChwal9ldmVudF90ICpldmVudCk7CisKKy8qKgorICogVHJ5IHdhaXQgZm9yIGV2ZW50IG9iamVjdCB0byBiZSBzaWduYWxsZWQuCisgKgorICogQHBhcmFtIGV2ZW50IFRoZSBldmVudCBvYmplY3QuCisgKgorICogQHJldHVybiB6ZXJvIGlmIHN1Y2Nlc3NmdWxsLgorICovCitQSl9ERUNMKHBqX3N0YXR1c190KSBwal9ldmVudF90cnl3YWl0KHBqX2V2ZW50X3QgKmV2ZW50KTsKKworLyoqCisgKiBTZXQgdGhlIGV2ZW50IG9iamVjdCBzdGF0ZSB0byBzaWduYWxlZC4gRm9yIGF1dG8tcmVzZXQgZXZlbnQsIHRoaXMgCisgKiB3aWxsIG9ubHkgcmVsZWFzZSB0aGUgZmlyc3QgdGhyZWFkIHRoYXQgYXJlIHdhaXRpbmcgb24gdGhlIGV2ZW50LiBGb3IKKyAqIG1hbnVhbCByZXNldCBldmVudCwgdGhlIHN0YXRlIHJlbWFpbnMgc2lnbmFsZWQgdW50aWwgdGhlIGV2ZW50IGlzIHJlc2V0LgorICogSWYgdGhlcmUgaXMgbm8gdGhyZWFkIHdhaXRpbmcgb24gdGhlIGV2ZW50LCB0aGUgZXZlbnQgb2JqZWN0IHN0YXRlIAorICogcmVtYWlucyBzaWduYWxlZC4KKyAqCisgKiBAcGFyYW0gZXZlbnQJICAgIFRoZSBldmVudCBvYmplY3QuCisgKgorICogQHJldHVybiB6ZXJvIGlmIHN1Y2Nlc3NmdWxsLgorICovCitQSl9ERUNMKHBqX3N0YXR1c190KSBwal9ldmVudF9zZXQocGpfZXZlbnRfdCAqZXZlbnQpOworCisvKioKKyAqIFNldCB0aGUgZXZlbnQgb2JqZWN0IHRvIHNpZ25hbGVkIHN0YXRlIHRvIHJlbGVhc2UgYXBwcm9wcmlhdGUgbnVtYmVyIG9mCisgKiB3YWl0aW5nIHRocmVhZHMgYW5kIHRoZW4gcmVzZXQgdGhlIGV2ZW50IG9iamVjdCB0byBub24tc2lnbmFsZWQuIEZvcgorICogbWFudWFsLXJlc2V0IGV2ZW50LCB0aGlzIGZ1bmN0aW9uIHdpbGwgcmVsZWFzZSBhbGwgd2FpdGluZyB0aHJlYWRzLiBGb3IKKyAqIGF1dG8tcmVzZXQgZXZlbnQsIHRoaXMgZnVuY3Rpb24gd2lsbCBvbmx5IHJlbGVhc2Ugb25lIHdhaXRpbmcgdGhyZWFkLgorICoKKyAqIEBwYXJhbSBldmVudAkgICAgVGhlIGV2ZW50IG9iamVjdC4KKyAqCisgKiBAcmV0dXJuIHplcm8gaWYgc3VjY2Vzc2Z1bGwuCisgKi8KK1BKX0RFQ0wocGpfc3RhdHVzX3QpIHBqX2V2ZW50X3B1bHNlKHBqX2V2ZW50X3QgKmV2ZW50KTsKKworLyoqCisgKiBTZXQgdGhlIGV2ZW50IG9iamVjdCBzdGF0ZSB0byBub24tc2lnbmFsZWQuCisgKgorICogQHBhcmFtIGV2ZW50CSAgICBUaGUgZXZlbnQgb2JqZWN0LgorICoKKyAqIEByZXR1cm4gemVybyBpZiBzdWNjZXNzZnVsbC4KKyAqLworUEpfREVDTChwal9zdGF0dXNfdCkgcGpfZXZlbnRfcmVzZXQocGpfZXZlbnRfdCAqZXZlbnQpOworCisvKioKKyAqIERlc3Ryb3kgdGhlIGV2ZW50IG9iamVjdC4KKyAqCisgKiBAcGFyYW0gZXZlbnQJICAgIFRoZSBldmVudCBvYmplY3QuCisgKgorICogQHJldHVybiB6ZXJvIGlmIHN1Y2Nlc3NmdWxsLgorICovCitQSl9ERUNMKHBqX3N0YXR1c190KSBwal9ldmVudF9kZXN0cm95KHBqX2V2ZW50X3QgKmV2ZW50KTsKKworLyoqCisgKiBAfQorICovCisjZW5kaWYJLyogUEpfSEFTX0VWRU5UX09CSiAqLworCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKgorICogQGFkZHRvZ3JvdXAgUEpfVElNRSBUaW1lIERhdGEgVHlwZSBhbmQgTWFuaXB1bGF0aW9uLgorICogQGluZ3JvdXAgUEpfT1MKKyAqIEB7CisgKiBUaGlzIG1vZHVsZSBwcm92aWRlcyBBUEkgZm9yIG1hbmlwdWxhdGluZyB0aW1lLgorICoKKyAqIFxzZWN0aW9uIHBqX3RpbWVfZXhhbXBsZXNfc2VjIEV4YW1wbGVzCisgKgorICogRm9yIGV4YW1wbGVzLCBwbGVhc2Ugc2VlOgorICogIC0gXHJlZiBwYWdlX3BqbGliX3NsZWVwX3Rlc3QKKyAqLworCisvKioKKyAqIEdldCBjdXJyZW50IHRpbWUgb2YgZGF5IGluIGxvY2FsIHJlcHJlc2VudGF0aW9uLgorICoKKyAqIEBwYXJhbSB0dglWYXJpYWJsZSB0byBzdG9yZSB0aGUgcmVzdWx0LgorICoKKyAqIEByZXR1cm4gemVybyBpZiBzdWNjZXNzZnVsbC4KKyAqLworUEpfREVDTChwal9zdGF0dXNfdCkgcGpfZ2V0dGltZW9mZGF5KHBqX3RpbWVfdmFsICp0dik7CisKKworLyoqCisgKiBQYXJzZSB0aW1lIHZhbHVlIGludG8gZGF0ZS90aW1lIHJlcHJlc2VudGF0aW9uLgorICoKKyAqIEBwYXJhbSB0dglUaGUgdGltZS4KKyAqIEBwYXJhbSBwdAlWYXJpYWJsZSB0byBzdG9yZSB0aGUgZGF0ZSB0aW1lIHJlc3VsdC4KKyAqCisgKiBAcmV0dXJuIHplcm8gaWYgc3VjY2Vzc2Z1bGwuCisgKi8KK1BKX0RFQ0wocGpfc3RhdHVzX3QpIHBqX3RpbWVfZGVjb2RlKGNvbnN0IHBqX3RpbWVfdmFsICp0diwgcGpfcGFyc2VkX3RpbWUgKnB0KTsKKworLyoqCisgKiBFbmNvZGUgZGF0ZS90aW1lIHRvIHRpbWUgdmFsdWUuCisgKgorICogQHBhcmFtIHB0CVRoZSBkYXRlL3RpbWUuCisgKiBAcGFyYW0gdHYJVmFyaWFibGUgdG8gc3RvcmUgdGltZSB2YWx1ZSByZXN1bHQuCisgKgorICogQHJldHVybiB6ZXJvIGlmIHN1Y2Nlc3NmdWxsLgorICovCitQSl9ERUNMKHBqX3N0YXR1c190KSBwal90aW1lX2VuY29kZShjb25zdCBwal9wYXJzZWRfdGltZSAqcHQsIHBqX3RpbWVfdmFsICp0dik7CisKKy8qKgorICogQ29udmVydCBsb2NhbCB0aW1lIHRvIEdNVC4KKyAqCisgKiBAcGFyYW0gdHYJVGltZSB0byBjb252ZXJ0LgorICoKKyAqIEByZXR1cm4gemVybyBpZiBzdWNjZXNzZnVsbC4KKyAqLworUEpfREVDTChwal9zdGF0dXNfdCkgcGpfdGltZV9sb2NhbF90b19nbXQocGpfdGltZV92YWwgKnR2KTsKKworLyoqCisgKiBDb252ZXJ0IEdNVCB0byBsb2NhbCB0aW1lLgorICoKKyAqIEBwYXJhbSB0dglUaW1lIHRvIGNvbnZlcnQuCisgKgorICogQHJldHVybiB6ZXJvIGlmIHN1Y2Nlc3NmdWxsLgorICovCitQSl9ERUNMKHBqX3N0YXR1c190KSBwal90aW1lX2dtdF90b19sb2NhbChwal90aW1lX3ZhbCAqdHYpOworCisvKioKKyAqIEB9CisgKi8KKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWYgZGVmaW5lZChQSl9URVJNX0hBU19DT0xPUikgJiYgUEpfVEVSTV9IQVNfQ09MT1IgIT0gMAorCisvKioKKyAqIEBkZWZncm91cCBQSl9URVJNIFRlcm1pbmFsCisgKiBAaW5ncm91cCBQSl9PUworICogQHsKKyAqLworCisvKioKKyAqIFNldCBjdXJyZW50IHRlcm1pbmFsIGNvbG9yLgorICoKKyAqIEBwYXJhbSBjb2xvcgkgICAgVGhlIFJHQiBjb2xvci4KKyAqCisgKiBAcmV0dXJuIHplcm8gb24gc3VjY2Vzcy4KKyAqLworUEpfREVDTChwal9zdGF0dXNfdCkgcGpfdGVybV9zZXRfY29sb3IocGpfY29sb3JfdCBjb2xvcik7CisKKy8qKgorICogR2V0IGN1cnJlbnQgdGVybWluYWwgZm9yZWdyb3VuZCBjb2xvci4KKyAqCisgKiBAcmV0dXJuIFJHQiBjb2xvci4KKyAqLworUEpfREVDTChwal9jb2xvcl90KSBwal90ZXJtX2dldF9jb2xvcih2b2lkKTsKKworLyoqCisgKiBAfQorICovCisKKyNlbmRpZgkvKiBQSl9URVJNX0hBU19DT0xPUiAqLworCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKgorICogQGRlZmdyb3VwIFBKX1RJTUVTVEFNUCBIaWdoIFJlc29sdXRpb24gVGltZXN0YW1wCisgKiBAaW5ncm91cCBQSl9PUworICogQHsKKyAqCisgKiBQSkxJQiBwcm92aWRlcyA8Yj5IaWdoIFJlc29sdXRpb24gVGltZXN0YW1wPC9iPiBBUEkgdG8gYWNjZXNzIGhpZ2hlc3QgCisgKiByZXNvbHV0aW9uIHRpbWVzdGFtcCB2YWx1ZSBwcm92aWRlZCBieSB0aGUgcGxhdGZvcm0uIFRoZSBBUEkgaXMgdXNlZnVsbAorICogdG8gbWVhc3VyZSBwcmVjaXNlIGVsYXBzZWQgdGltZSwgYW5kIGNhbiBiZSB1c2VkIGluIGFwcGxpY2F0aW9ucyBzdWNoCisgKiBhcyBwcm9maWxpbmcuCisgKgorICogVGhlIHRpbWVzdGFtcCB2YWx1ZSBpcyByZXByZXNlbnRlZCBpbiBjeWNsZXMsIGFuZCBjYW4gYmUgcmVsYXRlZCB0bworICogbm9ybWFsIHRpbWUgKGluIHNlY29uZHMgb3Igc3ViLXNlY29uZHMpIHVzaW5nIHZhcmlvdXMgZnVuY3Rpb25zIHByb3ZpZGVkLgorICoKKyAqIFxzZWN0aW9uIHBqX3RpbWVzdGFtcF9leGFtcGxlc19zZWMgRXhhbXBsZXMKKyAqCisgKiBGb3IgZXhhbXBsZXMsIHBsZWFzZSBzZWU6CisgKiAgLSBccmVmIHBhZ2VfcGpsaWJfc2xlZXBfdGVzdAorICogIC0gXHJlZiBwYWdlX3BqbGliX3RpbWVzdGFtcF90ZXN0CisgKi8KKworLyoKKyAqIEhpZ2ggcmVzb2x1dGlvbiB0aW1lci4KKyAqLworI2lmIGRlZmluZWQoUEpfSEFTX0hJR0hfUkVTX1RJTUVSKSAmJiBQSl9IQVNfSElHSF9SRVNfVElNRVIgIT0gMAorCisvKioKKyAqIEdldCBtb25vdG9uaWMgdGltZSBzaW5jZSBzb21lIHVuc3BlY2lmaWVkIHN0YXJ0aW5nIHBvaW50LgorICoKKyAqIEBwYXJhbSB0dglWYXJpYWJsZSB0byBzdG9yZSB0aGUgcmVzdWx0LgorICoKKyAqIEByZXR1cm4gUEpfU1VDQ0VTUyBpZiBzdWNjZXNzZnVsLgorICovCitQSl9ERUNMKHBqX3N0YXR1c190KSBwal9nZXR0aWNrY291bnQocGpfdGltZV92YWwgKnR2KTsKKworLyoqCisgKiBBY3F1aXJlIGhpZ2ggcmVzb2x1dGlvbiB0aW1lciB2YWx1ZS4gVGhlIHRpbWUgdmFsdWUgYXJlIHN0b3JlZAorICogaW4gY3ljbGVzLgorICoKKyAqIEBwYXJhbSB0cwkgICAgSGlnaCByZXNvbHV0aW9uIHRpbWVyIHZhbHVlLgorICogQHJldHVybgkgICAgUEpfU1VDQ0VTUyBvciB0aGUgYXBwcm9wcmlhdGUgZXJyb3IgY29kZS4KKyAqCisgKiBAc2VlIHBqX2dldF90aW1lc3RhbXBfZnJlcSgpLgorICovCitQSl9ERUNMKHBqX3N0YXR1c190KSBwal9nZXRfdGltZXN0YW1wKHBqX3RpbWVzdGFtcCAqdHMpOworCisvKioKKyAqIEdldCBoaWdoIHJlc29sdXRpb24gdGltZXIgZnJlcXVlbmN5LCBpbiBjeWNsZXMgcGVyIHNlY29uZC4KKyAqCisgKiBAcGFyYW0gZnJlcQkgICAgVGltZXIgZnJlcXVlbmN5LCBpbiBjeWNsZXMgcGVyIHNlY29uZC4KKyAqIEByZXR1cm4JICAgIFBKX1NVQ0NFU1Mgb3IgdGhlIGFwcHJvcHJpYXRlIGVycm9yIGNvZGUuCisgKi8KK1BKX0RFQ0wocGpfc3RhdHVzX3QpIHBqX2dldF90aW1lc3RhbXBfZnJlcShwal90aW1lc3RhbXAgKmZyZXEpOworCisvKioKKyAqIFNldCB0aW1lc3RhbXAgZnJvbSAzMmJpdCB2YWx1ZXMuCisgKiBAcGFyYW0gdAkgICAgVGhlIHRpbWVzdGFtcCB0byBiZSBzZXQuCisgKiBAcGFyYW0gaGkJICAgIFRoZSBoaWdoIDMyYml0IHBhcnQuCisgKiBAcGFyYW0gbG8JICAgIFRoZSBsb3cgMzJiaXQgcGFydC4KKyAqLworUEpfSU5MSU5FKHZvaWQpIHBqX3NldF90aW1lc3RhbXAzMihwal90aW1lc3RhbXAgKnQsIHBqX3VpbnQzMl90IGhpLAorCQkJCSAgIHBqX3VpbnQzMl90IGxvKQoreworICAgIHQtPnUzMi5oaSA9IGhpOworICAgIHQtPnUzMi5sbyA9IGxvOworfQorCisKKy8qKgorICogQ29tcGFyZSB0aW1lc3RhbXAgdDEgYW5kIHQyLgorICogQHBhcmFtIHQxCSAgICB0MS4KKyAqIEBwYXJhbSB0MgkgICAgdDIuCisgKiBAcmV0dXJuCSAgICAtMSBpZiAodDEgPCB0MiksIDEgaWYgKHQxID4gdDIpLCBvciAwIGlmICh0MSA9PSB0MikKKyAqLworUEpfSU5MSU5FKGludCkgcGpfY21wX3RpbWVzdGFtcChjb25zdCBwal90aW1lc3RhbXAgKnQxLCBjb25zdCBwal90aW1lc3RhbXAgKnQyKQoreworI2lmIFBKX0hBU19JTlQ2NAorICAgIGlmICh0MS0+dTY0IDwgdDItPnU2NCkKKwlyZXR1cm4gLTE7CisgICAgZWxzZSBpZiAodDEtPnU2NCA+IHQyLT51NjQpCisJcmV0dXJuIDE7CisgICAgZWxzZQorCXJldHVybiAwOworI2Vsc2UKKyAgICBpZiAodDEtPnUzMi5oaSA8IHQyLT51MzIuaGkgfHwKKwkodDEtPnUzMi5oaSA9PSB0Mi0+dTMyLmhpICYmIHQxLT51MzIubG8gPCB0Mi0+dTMyLmxvKSkKKwlyZXR1cm4gLTE7CisgICAgZWxzZSBpZiAodDEtPnUzMi5oaSA+IHQyLT51MzIuaGkgfHwKKwkgICAgICh0MS0+dTMyLmhpID09IHQyLT51MzIuaGkgJiYgdDEtPnUzMi5sbyA+IHQyLT51MzIubG8pKQorCXJldHVybiAxOworICAgIGVsc2UKKwlyZXR1cm4gMDsKKyNlbmRpZgorfQorCisKKy8qKgorICogQWRkIHRpbWVzdGFtcCB0MiB0byB0MS4KKyAqIEBwYXJhbSB0MQkgICAgdDEuCisgKiBAcGFyYW0gdDIJICAgIHQyLgorICovCitQSl9JTkxJTkUodm9pZCkgcGpfYWRkX3RpbWVzdGFtcChwal90aW1lc3RhbXAgKnQxLCBjb25zdCBwal90aW1lc3RhbXAgKnQyKQoreworI2lmIFBKX0hBU19JTlQ2NAorICAgIHQxLT51NjQgKz0gdDItPnU2NDsKKyNlbHNlCisgICAgcGpfdWludDMyX3Qgb2xkID0gdDEtPnUzMi5sbzsKKyAgICB0MS0+dTMyLmhpICs9IHQyLT51MzIuaGk7CisgICAgdDEtPnUzMi5sbyArPSB0Mi0+dTMyLmxvOworICAgIGlmICh0MS0+dTMyLmxvIDwgb2xkKQorCSsrdDEtPnUzMi5oaTsKKyNlbmRpZgorfQorCisvKioKKyAqIEFkZCB0aW1lc3RhbXAgdDIgdG8gdDEuCisgKiBAcGFyYW0gdDEJICAgIHQxLgorICogQHBhcmFtIHQyCSAgICB0Mi4KKyAqLworUEpfSU5MSU5FKHZvaWQpIHBqX2FkZF90aW1lc3RhbXAzMihwal90aW1lc3RhbXAgKnQxLCBwal91aW50MzJfdCB0MikKK3sKKyNpZiBQSl9IQVNfSU5UNjQKKyAgICB0MS0+dTY0ICs9IHQyOworI2Vsc2UKKyAgICBwal91aW50MzJfdCBvbGQgPSB0MS0+dTMyLmxvOworICAgIHQxLT51MzIubG8gKz0gdDI7CisgICAgaWYgKHQxLT51MzIubG8gPCBvbGQpCisJKyt0MS0+dTMyLmhpOworI2VuZGlmCit9CisKKy8qKgorICogU3Vic3RyYWN0IHRpbWVzdGFtcCB0MiBmcm9tIHQxLgorICogQHBhcmFtIHQxCSAgICB0MS4KKyAqIEBwYXJhbSB0MgkgICAgdDIuCisgKi8KK1BKX0lOTElORSh2b2lkKSBwal9zdWJfdGltZXN0YW1wKHBqX3RpbWVzdGFtcCAqdDEsIGNvbnN0IHBqX3RpbWVzdGFtcCAqdDIpCit7CisjaWYgUEpfSEFTX0lOVDY0CisgICAgdDEtPnU2NCAtPSB0Mi0+dTY0OworI2Vsc2UKKyAgICB0MS0+dTMyLmhpIC09IHQyLT51MzIuaGk7CisgICAgaWYgKHQxLT51MzIubG8gPj0gdDItPnUzMi5sbykKKwl0MS0+dTMyLmxvIC09IHQyLT51MzIubG87CisgICAgZWxzZSB7CisJdDEtPnUzMi5sbyAtPSB0Mi0+dTMyLmxvOworCS0tdDEtPnUzMi5oaTsKKyAgICB9CisjZW5kaWYKK30KKworLyoqCisgKiBTdWJzdHJhY3QgdGltZXN0YW1wIHQyIGZyb20gdDEuCisgKiBAcGFyYW0gdDEJICAgIHQxLgorICogQHBhcmFtIHQyCSAgICB0Mi4KKyAqLworUEpfSU5MSU5FKHZvaWQpIHBqX3N1Yl90aW1lc3RhbXAzMihwal90aW1lc3RhbXAgKnQxLCBwal91aW50MzJfdCB0MikKK3sKKyNpZiBQSl9IQVNfSU5UNjQKKyAgICB0MS0+dTY0IC09IHQyOworI2Vsc2UKKyAgICBpZiAodDEtPnUzMi5sbyA+PSB0MikKKwl0MS0+dTMyLmxvIC09IHQyOworICAgIGVsc2UgeworCXQxLT51MzIubG8gLT0gdDI7CisJLS10MS0+dTMyLmhpOworICAgIH0KKyNlbmRpZgorfQorCisvKioKKyAqIEdldCB0aGUgdGltZXN0YW1wIGRpZmZlcmVuY2UgYmV0d2VlbiB0MiBhbmQgdDEgKHRoYXQgaXMgdDIgbWludXMgdDEpLAorICogYW5kIHJldHVybiBhIDMyYml0IHNpZ25lZCBpbnRlZ2VyIGRpZmZlcmVuY2UuCisgKi8KK1BKX0lOTElORShwal9pbnQzMl90KSBwal90aW1lc3RhbXBfZGlmZjMyKGNvbnN0IHBqX3RpbWVzdGFtcCAqdDEsCisJCQkJCSAgY29uc3QgcGpfdGltZXN0YW1wICp0MikKK3sKKyAgICAvKiBCZSBjYXJlZnVsIHdpdGggdGhlIHNpZ25lc3MgKEkgdGhpbmshKSAqLworI2lmIFBKX0hBU19JTlQ2NAorICAgIHBqX2ludDY0X3QgZGlmZiA9IHQyLT51NjQgLSB0MS0+dTY0OworICAgIHJldHVybiAocGpfaW50MzJfdCkgZGlmZjsKKyNlbHNlCisgICAgcGpfaW50MzIgZGlmZiA9IHQyLT51MzIubG8gLSB0MS0+dTMyLmxvOworICAgIHJldHVybiBkaWZmOworI2VuZGlmCit9CisKKworLyoqCisgKiBDYWxjdWxhdGUgdGhlIGVsYXBzZWQgdGltZSwgYW5kIHN0b3JlIGl0IGluIHBqX3RpbWVfdmFsLgorICogVGhpcyBmdW5jdGlvbiBjYWxjdWxhdGVzIHRoZSBlbGFwc2VkIHRpbWUgdXNpbmcgaGlnaGVzdCBwcmVjaXNpb24KKyAqIGNhbGN1bGF0aW9uIHRoYXQgaXMgYXZhaWxhYmxlIGZvciBjdXJyZW50IHBsYXRmb3JtLCBjb25zaWRlcmluZworICogd2hldGhlciBmbG9hdGluZyBwb2ludCBvciA2NC1iaXQgcHJlY2lzaW9uIGFyaXRobWV0aWMgaXMgYXZhaWxhYmxlLiAKKyAqIEZvciBtYXhpbXVtIHBvcnRhYmlsaXR5LCBhcHBsaWNhdGlvbiBzaG91bGQgcHJlZmVyIHRvIHVzZSB0aGlzIGZ1bmN0aW9uCisgKiByYXRoZXIgdGhhbiBjYWxjdWxhdGluZyB0aGUgZWxhcHNlZCB0aW1lIGJ5IGl0c2VsZi4KKyAqCisgKiBAcGFyYW0gc3RhcnQgICAgIFRoZSBzdGFydGluZyB0aW1lc3RhbXAuCisgKiBAcGFyYW0gc3RvcCAgICAgIFRoZSBlbmQgdGltZXN0YW1wLgorICoKKyAqIEByZXR1cm4JICAgIEVsYXBzZWQgdGltZSBhcyAjcGpfdGltZV92YWwuCisgKgorICogQHNlZSBwal9lbGFwc2VkX3VzZWMoKSwgcGpfZWxhcHNlZF9jeWNsZSgpLCBwal9lbGFwc2VkX25hbm9zZWMoKQorICovCitQSl9ERUNMKHBqX3RpbWVfdmFsKSBwal9lbGFwc2VkX3RpbWUoIGNvbnN0IHBqX3RpbWVzdGFtcCAqc3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHBqX3RpbWVzdGFtcCAqc3RvcCApOworCisvKioKKyAqIENhbGN1bGF0ZSB0aGUgZWxhcHNlZCB0aW1lIGFzIDMyLWJpdCBtaWxpc2Vjb25kcy4KKyAqIFRoaXMgZnVuY3Rpb24gY2FsY3VsYXRlcyB0aGUgZWxhcHNlZCB0aW1lIHVzaW5nIGhpZ2hlc3QgcHJlY2lzaW9uCisgKiBjYWxjdWxhdGlvbiB0aGF0IGlzIGF2YWlsYWJsZSBmb3IgY3VycmVudCBwbGF0Zm9ybSwgY29uc2lkZXJpbmcKKyAqIHdoZXRoZXIgZmxvYXRpbmcgcG9pbnQgb3IgNjQtYml0IHByZWNpc2lvbiBhcml0aG1ldGljIGlzIGF2YWlsYWJsZS4gCisgKiBGb3IgbWF4aW11bSBwb3J0YWJpbGl0eSwgYXBwbGljYXRpb24gc2hvdWxkIHByZWZlciB0byB1c2UgdGhpcyBmdW5jdGlvbgorICogcmF0aGVyIHRoYW4gY2FsY3VsYXRpbmcgdGhlIGVsYXBzZWQgdGltZSBieSBpdHNlbGYuCisgKgorICogQHBhcmFtIHN0YXJ0ICAgICBUaGUgc3RhcnRpbmcgdGltZXN0YW1wLgorICogQHBhcmFtIHN0b3AgICAgICBUaGUgZW5kIHRpbWVzdGFtcC4KKyAqCisgKiBAcmV0dXJuCSAgICBFbGFwc2VkIHRpbWUgaW4gbWlsaXNlY29uZC4KKyAqCisgKiBAc2VlIHBqX2VsYXBzZWRfdGltZSgpLCBwal9lbGFwc2VkX2N5Y2xlKCksIHBqX2VsYXBzZWRfbmFub3NlYygpCisgKi8KK1BKX0RFQ0wocGpfdWludDMyX3QpIHBqX2VsYXBzZWRfbXNlYyggY29uc3QgcGpfdGltZXN0YW1wICpzdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcGpfdGltZXN0YW1wICpzdG9wICk7CisKKy8qKgorICogVmFyaWFudCBvZiAjcGpfZWxhcHNlZF9tc2VjKCkgd2hpY2ggcmV0dXJucyA2NGJpdCB2YWx1ZS4KKyAqLworUEpfREVDTChwal91aW50NjRfdCkgcGpfZWxhcHNlZF9tc2VjNjQoY29uc3QgcGpfdGltZXN0YW1wICpzdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHBqX3RpbWVzdGFtcCAqc3RvcCApOworCisvKioKKyAqIENhbGN1bGF0ZSB0aGUgZWxhcHNlZCB0aW1lIGluIDMyLWJpdCBtaWNyb3NlY29uZHMuCisgKiBUaGlzIGZ1bmN0aW9uIGNhbGN1bGF0ZXMgdGhlIGVsYXBzZWQgdGltZSB1c2luZyBoaWdoZXN0IHByZWNpc2lvbgorICogY2FsY3VsYXRpb24gdGhhdCBpcyBhdmFpbGFibGUgZm9yIGN1cnJlbnQgcGxhdGZvcm0sIGNvbnNpZGVyaW5nCisgKiB3aGV0aGVyIGZsb2F0aW5nIHBvaW50IG9yIDY0LWJpdCBwcmVjaXNpb24gYXJpdGhtZXRpYyBpcyBhdmFpbGFibGUuIAorICogRm9yIG1heGltdW0gcG9ydGFiaWxpdHksIGFwcGxpY2F0aW9uIHNob3VsZCBwcmVmZXIgdG8gdXNlIHRoaXMgZnVuY3Rpb24KKyAqIHJhdGhlciB0aGFuIGNhbGN1bGF0aW5nIHRoZSBlbGFwc2VkIHRpbWUgYnkgaXRzZWxmLgorICoKKyAqIEBwYXJhbSBzdGFydCAgICAgVGhlIHN0YXJ0aW5nIHRpbWVzdGFtcC4KKyAqIEBwYXJhbSBzdG9wICAgICAgVGhlIGVuZCB0aW1lc3RhbXAuCisgKgorICogQHJldHVybgkgICAgRWxhcHNlZCB0aW1lIGluIG1pY3Jvc2Vjb25kLgorICoKKyAqIEBzZWUgcGpfZWxhcHNlZF90aW1lKCksIHBqX2VsYXBzZWRfY3ljbGUoKSwgcGpfZWxhcHNlZF9uYW5vc2VjKCkKKyAqLworUEpfREVDTChwal91aW50MzJfdCkgcGpfZWxhcHNlZF91c2VjKCBjb25zdCBwal90aW1lc3RhbXAgKnN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwal90aW1lc3RhbXAgKnN0b3AgKTsKKworLyoqCisgKiBDYWxjdWxhdGUgdGhlIGVsYXBzZWQgdGltZSBpbiAzMi1iaXQgbmFub3NlY29uZHMuCisgKiBUaGlzIGZ1bmN0aW9uIGNhbGN1bGF0ZXMgdGhlIGVsYXBzZWQgdGltZSB1c2luZyBoaWdoZXN0IHByZWNpc2lvbgorICogY2FsY3VsYXRpb24gdGhhdCBpcyBhdmFpbGFibGUgZm9yIGN1cnJlbnQgcGxhdGZvcm0sIGNvbnNpZGVyaW5nCisgKiB3aGV0aGVyIGZsb2F0aW5nIHBvaW50IG9yIDY0LWJpdCBwcmVjaXNpb24gYXJpdGhtZXRpYyBpcyBhdmFpbGFibGUuIAorICogRm9yIG1heGltdW0gcG9ydGFiaWxpdHksIGFwcGxpY2F0aW9uIHNob3VsZCBwcmVmZXIgdG8gdXNlIHRoaXMgZnVuY3Rpb24KKyAqIHJhdGhlciB0aGFuIGNhbGN1bGF0aW5nIHRoZSBlbGFwc2VkIHRpbWUgYnkgaXRzZWxmLgorICoKKyAqIEBwYXJhbSBzdGFydCAgICAgVGhlIHN0YXJ0aW5nIHRpbWVzdGFtcC4KKyAqIEBwYXJhbSBzdG9wICAgICAgVGhlIGVuZCB0aW1lc3RhbXAuCisgKgorICogQHJldHVybgkgICAgRWxhcHNlZCB0aW1lIGluIG5hbm9zZWNvbmRzLgorICoKKyAqIEBzZWUgcGpfZWxhcHNlZF90aW1lKCksIHBqX2VsYXBzZWRfY3ljbGUoKSwgcGpfZWxhcHNlZF91c2VjKCkKKyAqLworUEpfREVDTChwal91aW50MzJfdCkgcGpfZWxhcHNlZF9uYW5vc2VjKCBjb25zdCBwal90aW1lc3RhbXAgKnN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwal90aW1lc3RhbXAgKnN0b3AgKTsKKworLyoqCisgKiBDYWxjdWxhdGUgdGhlIGVsYXBzZWQgdGltZSBpbiAzMi1iaXQgY3ljbGVzLgorICogVGhpcyBmdW5jdGlvbiBjYWxjdWxhdGVzIHRoZSBlbGFwc2VkIHRpbWUgdXNpbmcgaGlnaGVzdCBwcmVjaXNpb24KKyAqIGNhbGN1bGF0aW9uIHRoYXQgaXMgYXZhaWxhYmxlIGZvciBjdXJyZW50IHBsYXRmb3JtLCBjb25zaWRlcmluZworICogd2hldGhlciBmbG9hdGluZyBwb2ludCBvciA2NC1iaXQgcHJlY2lzaW9uIGFyaXRobWV0aWMgaXMgYXZhaWxhYmxlLiAKKyAqIEZvciBtYXhpbXVtIHBvcnRhYmlsaXR5LCBhcHBsaWNhdGlvbiBzaG91bGQgcHJlZmVyIHRvIHVzZSB0aGlzIGZ1bmN0aW9uCisgKiByYXRoZXIgdGhhbiBjYWxjdWxhdGluZyB0aGUgZWxhcHNlZCB0aW1lIGJ5IGl0c2VsZi4KKyAqCisgKiBAcGFyYW0gc3RhcnQgICAgIFRoZSBzdGFydGluZyB0aW1lc3RhbXAuCisgKiBAcGFyYW0gc3RvcCAgICAgIFRoZSBlbmQgdGltZXN0YW1wLgorICoKKyAqIEByZXR1cm4JICAgIEVsYXBzZWQgdGltZSBpbiBjeWNsZXMuCisgKgorICogQHNlZSBwal9lbGFwc2VkX3VzZWMoKSwgcGpfZWxhcHNlZF90aW1lKCksIHBqX2VsYXBzZWRfbmFub3NlYygpCisgKi8KK1BKX0RFQ0wocGpfdWludDMyX3QpIHBqX2VsYXBzZWRfY3ljbGUoIGNvbnN0IHBqX3RpbWVzdGFtcCAqc3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwal90aW1lc3RhbXAgKnN0b3AgKTsKKworCisjZW5kaWYJLyogUEpfSEFTX0hJR0hfUkVTX1RJTUVSICovCisKKy8qKiBAfSAqLworCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqCisgKiBAZGVmZ3JvdXAgUEpfQVBQX09TIEFwcGxpY2F0aW9uIGV4ZWN1dGlvbgorICogQGluZ3JvdXAgUEpfT1MKKyAqIEB7CisgKi8KKworLyogVHlwZSBmb3IgbWFpbiBmdW5jdGlvbi4gKi8KK3R5cGVkZWYgaW50ICgqcGpfbWFpbl9mdW5jX3B0cikoaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSk7CisKKy8qKgorICogUnVuIHRoZSBhcHBsaWNhdGlvbi4gVGhpcyBmdW5jdGlvbiBoYXMgdG8gYmUgY2FsbGVkIGluIHRoZSBtYWluIHRocmVhZAorICogYW5kIGFmdGVyIGRvaW5nIHRoZSBuZWNlc3NhcnkgaW5pdGlhbGl6YXRpb24gYWNjb3JkaW5nIHRvIHRoZSBmbGFncworICogcHJvdmlkZWQsIGl0IHdpbGwgY2FsbCBtYWluX2Z1bmMoKSBmdW5jdGlvbi4KKyAqCisgKiBAcGFyYW0gbWFpbl9mdW5jIEFwcGxpY2F0aW9uJ3MgbWFpbiBmdW5jdGlvbi4KKyAqIEBwYXJhbSBhcmdjCSAgICBOdW1iZXIgb2YgYXJndW1lbnRzIGZyb20gdGhlIG1haW4oKSBmdW5jdGlvbiwgd2hpY2gKKyAqIAkJICAgIHdpbGwgYmUgcGFzc2VkIHRvIG1haW5fZnVuYygpIGZ1bmN0aW9uLgorICogQHBhcmFtIGFyZ3YJICAgIFRoZSBhcmd1bWVudHMgZnJvbSB0aGUgbWFpbigpIGZ1bmN0aW9uLCB3aGljaCB3aWxsCisgKiAJCSAgICBiZSBwYXNzZWQgdG8gbWFpbl9mdW5jKCkgZnVuY3Rpb24uCisgKiBAcGFyYW0gZmxhZ3MgICAgIEZsYWdzIGZvciBhcHBsaWNhdGlvbiBleGVjdXRpb24sIGN1cnJlbnRseSBtdXN0IGJlIDAuCisgKgorICogQHJldHVybiAgICAgICAgICBtYWluX2Z1bmMoKSdzIHJldHVybiB2YWx1ZS4KKyAqLworaW50IHBqX3J1bl9hcHAocGpfbWFpbl9mdW5jX3B0ciBtYWluX2Z1bmMsIGludCBhcmdjLCBjaGFyICphcmd2W10sCisJICAgICAgIHVuc2lnbmVkIGZsYWdzKTsKKworLyoqIEB9ICovCisKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioKKyAqIEludGVybmFsIFBKTElCIGZ1bmN0aW9uIHRvIGluaXRpYWxpemUgdGhlIHRocmVhZGluZyBzdWJzeXN0ZW0uCisgKiBAcmV0dXJuICAgICAgICAgIFBKX1NVQ0NFU1Mgb3IgdGhlIGFwcHJvcHJpYXRlIGVycm9yIGNvZGUuCisgKi8KK3BqX3N0YXR1c190IHBqX3RocmVhZF9pbml0KHZvaWQpOworCisKK1BKX0VORF9ERUNMCisKKyNlbmRpZiAgLyogX19QSl9PU19IX18gKi8KKwpkaWZmIC0tZ2l0IGEvam5pL3BqcHJvamVjdC1hbmRyb2lkLy5zdm4vcHJpc3RpbmUvMDUvMDU4Yzc3MzZiOTQ2OGQ4MmY5OGE5MDhkM2QzYmFlZTkzYTVhOWQxYy5zdm4tYmFzZSBiL2puaS9wanByb2plY3QtYW5kcm9pZC8uc3ZuL3ByaXN0aW5lLzA1LzA1OGM3NzM2Yjk0NjhkODJmOThhOTA4ZDNkM2JhZWU5M2E1YTlkMWMuc3ZuLWJhc2UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDY1YzBlOAotLS0gL2Rldi9udWxsCisrKyBiL2puaS9wanByb2plY3QtYW5kcm9pZC8uc3ZuL3ByaXN0aW5lLzA1LzA1OGM3NzM2Yjk0NjhkODJmOThhOTA4ZDNkM2JhZWU5M2E1YTlkMWMuc3ZuLWJhc2UKQEAgLTAsMCArMSwxNTggQEAKKy8qICRJZCQgKi8KKy8qIAorICogQ29weXJpZ2h0IChDKSAyMDA4LTIwMTEgVGVsdXUgSW5jLiAoaHR0cDovL3d3dy50ZWx1dS5jb20pCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMtMjAwOCBCZW5ueSBQcmlqb25vIDxiZW5ueUBwcmlqb25vLm9yZz4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBIAorICovCisjaWZuZGVmIF9fUEpNRURJQV9WSURfQ09ERUNfVVRJTF9IX18KKyNkZWZpbmUgX19QSk1FRElBX1ZJRF9DT0RFQ19VVElMX0hfXworCisKKy8qKgorICogQGZpbGUgdmlkX2NvZGVjX3V0aWwuaAorICogQGJyaWVmIFZpZGVvIGNvZGVjIHV0aWxpdGllcy4KKyAqLworCisjaW5jbHVkZSA8cGptZWRpYS92aWRfY29kZWMuaD4KKyNpbmNsdWRlIDxwam1lZGlhL3NkcF9uZWcuaD4KKworUEpfQkVHSU5fREVDTAorCisKKy8qKgorICogRGVmaW5pdGlvbiBvZiBILjI2MyBwYXJhbWV0ZXJzLgorICovCit0eXBlZGVmIHN0cnVjdCBwam1lZGlhX3ZpZF9jb2RlY19oMjYzX2ZtdHAKK3sKKyAgICB1bnNpZ25lZCBtcGlfY250OwkJICAgIC8qKjwgIyBvZiBwYXJzZWQgTVBJIHBhcmFtCQkgICAgKi8KKyAgICBzdHJ1Y3QgbXBpIHsKKwlwam1lZGlhX3JlY3Rfc2l6ZSAgIHNpemU7ICAgLyoqPCBQaWN0dXJlIHNpemUvcmVzb2x1dGlvbgkgICAgKi8KKwl1bnNpZ25lZAkgICAgdmFsOyAgICAvKio8IE1QSSB2YWx1ZQkJCSAgICAqLworICAgIH0gbXBpWzMyXTsJCQkgICAgLyoqPCBNaW5pbXVtIFBpY3R1cmUgSW50ZXJ2YWwgcGFyYW1ldGVyICovCisKK30gcGptZWRpYV92aWRfY29kZWNfaDI2M19mbXRwOworCisKKy8qKgorICogUGFyc2UgU0RQIGZtdHAgb2YgSC4yNjMuCisgKgorICogQHBhcmFtIGZtdHAJCVRoZSBILjI2MyBTRFAgZm10cCB0byBiZSBwYXJzZWQuCisgKiBAcGFyYW0gaDI2M19mbXRwCVRoZSBwYXJzaW5nIHJlc3VsdC4KKyAqCisgKiBAcmV0dXJuCQlQSl9TVUNDRVNTIG9uIHN1Y2Nlc3MuCisgKi8KK1BKX0RFQ0wocGpfc3RhdHVzX3QpIHBqbWVkaWFfdmlkX2NvZGVjX2gyNjNfcGFyc2VfZm10cCgKKwkJCQljb25zdCBwam1lZGlhX2NvZGVjX2ZtdHAgKmZtdHAsCisJCQkJcGptZWRpYV92aWRfY29kZWNfaDI2M19mbXRwICpoMjYzX2ZtdHApOworCisKKy8qKgorICogUGFyc2UsIG5lZ290aWF0ZSwgYW5kIGFwcGx5IHRoZSBlbmNvZGluZyBhbmQgZGVjb2RpbmcgU0RQIGZtdHAgb2YgSC4yNjMKKyAqIGluIHRoZSBzcGVjaWZpZWQgY29kZWMgcGFyYW1ldGVyLgorICoKKyAqIEBwYXJhbSBwYXJhbQkJVGhlIGNvZGVjIHBhcmFtZXRlci4KKyAqCisgKiBAcmV0dXJuCQlQSl9TVUNDRVNTIG9uIHN1Y2Nlc3MuCisgKi8KK1BKX0RFQ0wocGpfc3RhdHVzX3QpIHBqbWVkaWFfdmlkX2NvZGVjX2gyNjNfYXBwbHlfZm10cCgKKwkJCQlwam1lZGlhX3ZpZF9jb2RlY19wYXJhbSAqcGFyYW0pOworCisKKy8qKgorICogRGVmaW5pdGlvbiBvZiBILjI2NCBwYXJhbWV0ZXJzLgorICovCit0eXBlZGVmIHN0cnVjdCBwam1lZGlhX3ZpZF9jb2RlY19oMjY0X2ZtdHAKK3sKKyAgICAvKiBwcm9maWxlLWxldmVsLWlkICovCisgICAgcGpfdWludDhfdAkgICAgcHJvZmlsZV9pZGM7ICAgIC8qKjwgUHJvZmlsZSBJRAkJCSAgICAqLworICAgIHBqX3VpbnQ4X3QJICAgIHByb2ZpbGVfaW9wOyAgICAvKio8IFByb2ZpbGUgY29uc3RyYWludHMgYml0cwkgICAgKi8KKyAgICBwal91aW50OF90CSAgICBsZXZlbDsJICAgIC8qKjwgTGV2ZWwJCQkJICAgICovCisKKyAgICAvKiBwYWNrZXRpemF0aW9uLW1vZGUgKi8KKyAgICBwal91aW50OF90CSAgICBwYWNrZXRpemF0aW9uX21vZGU7CS8qKjwgUGFja2V0aXphdGlvbiBtb2RlCQkgICAgKi8KKworICAgIC8qIG1heC1tYnBzLCBtYXgtZnMsIG1heC1jcGIsIG1heC1kcGIsIGFuZCBtYXgtYnIgKi8KKyAgICB1bnNpZ25lZAkgICAgbWF4X21icHM7CSAgICAvKio8IE1heCBtYWNyb2Jsb2NrIHByb2Nlc3NpbmcgcmF0ZQkgICAgKi8KKyAgICB1bnNpZ25lZAkgICAgbWF4X2ZzOwkgICAgLyoqPCBNYXggZnJhbWUgc2l6ZSAoaW4gbWFjcm9ibG9ja3MpICAgICovCisgICAgdW5zaWduZWQJICAgIG1heF9jcGI7CSAgICAvKio8IE1heCBjb2RlZCBwaWN0dXJlIGJ1ZmZlciBzaXplCSAgICAqLworICAgIHVuc2lnbmVkCSAgICBtYXhfZHBiOwkgICAgLyoqPCBNYXggZGVjb2RlZCBwaWN0dXJlIGJ1ZmZlciBzaXplICAgICovCisgICAgdW5zaWduZWQJICAgIG1heF9icjsJICAgIC8qKjwgTWF4IHZpZGVvIGJpdCByYXRlCQkgICAgKi8KKworICAgIC8qIHNwcm9wLXBhcmFtZXRlci1zZXRzLCBpbiBOQUwgdW5pdHMgKi8KKyAgICBwal9zaXplX3QJICAgIHNwcm9wX3BhcmFtX3NldHNfbGVuOyAgIC8qKjwgUGFyYW1ldGVyIHNldCBsZW5ndGgJICAgICovCisgICAgcGpfdWludDhfdAkgICAgc3Byb3BfcGFyYW1fc2V0c1syNTZdOyAgLyoqPCBQYXJhbWV0ZXIgc2V0IChTUFMgJiBQUFMpLAorCQkJCQkJIGluIE5BTCB1bml0IGJpdHN0cmVhbQkgICAgKi8KKworfSBwam1lZGlhX3ZpZF9jb2RlY19oMjY0X2ZtdHA7CisKKworLyoqCisgKiBQYXJzZSBTRFAgZm10cCBvZiBILjI2NC4KKyAqCisgKiBAcGFyYW0gZm10cAkJVGhlIEguMjY0IFNEUCBmbXRwIHRvIGJlIHBhcnNlZC4KKyAqIEBwYXJhbSBoMjY0X2ZtdHAJVGhlIHBhcnNpbmcgcmVzdWx0LgorICoKKyAqIEByZXR1cm4JCVBKX1NVQ0NFU1Mgb24gc3VjY2Vzcy4KKyAqLworUEpfREVDTChwal9zdGF0dXNfdCkgcGptZWRpYV92aWRfY29kZWNfaDI2NF9wYXJzZV9mbXRwKAorCQkJCWNvbnN0IHBqbWVkaWFfY29kZWNfZm10cCAqZm10cCwKKwkJCQlwam1lZGlhX3ZpZF9jb2RlY19oMjY0X2ZtdHAgKmgyNjRfZm10cCk7CisKKworLyoqCisgKiBNYXRjaCBILjI2NCBmb3JtYXQgaW4gdGhlIFNEUCBtZWRpYSBvZmZlciBhbmQgYW5zd2VyLiBUaGlzIHdpbGwgY29tcGFyZQorICogSC4yNjQgaWRlbnRpZmllciBwYXJhbWV0ZXJzIGluIFNEUCBmbXRwLCBpLmU6ICJwcm9maWxlLWxldmVsLWlkIiBhbmQKKyAqICJwYWNrZXRpemF0aW9uLW1vZGUiIGZpZWxkcy4gRm9yIGJldHRlciBpbnRlcm9wZXJhYmlsaXR5LCB3aGVuIHRoZSBvcHRpb24KKyAqICNQSk1FRElBX1NEUF9ORUdfRk1UX01BVENIX0FMTE9XX01PRElGWV9BTlNXRVIgaXMgc2V0LCB0aGlzIGZ1bmN0aW9uCisgKiBtYXkgdXBkYXRlIHRoZSBhbnN3ZXIgc28gdGhlIHBhcmFtZXRlcnMgaW4gdGhlIGFuc3dlciBtYXRjaCB0byBvbmVzCisgKiBpbiB0aGUgb2ZmZXIuCisgKgorICogQHBhcmFtIHBvb2wJCVRoZSBtZW1vcnkgcG9vbC4KKyAqIEBwYXJhbSBvZmZlcgkJVGhlIFNEUCBtZWRpYSBvZmZlci4KKyAqIEBwYXJhbSBvX2ZtdF9pZHgJSW5kZXggb2YgdGhlIEguMjY0IGZvcm1hdCBpbiB0aGUgU0RQIG1lZGlhIG9mZmVyLgorICogQHBhcmFtIGFuc3dlcglUaGUgU0RQIG1lZGlhIGFuc3dlci4KKyAqIEBwYXJhbSBhX2ZtdF9pZHgJSW5kZXggb2YgdGhlIEguMjY0IGZvcm1hdCBpbiB0aGUgU0RQIG1lZGlhIGFuc3dlci4KKyAqIEBwYXJhbSBvcHRpb24JVGhlIGZvcm1hdCBtYXRjaGluZyBvcHRpb24sIHNlZQorICoJCQkjcGptZWRpYV9zZHBfbmVnX2ZtdF9tYXRjaF9mbGFnLgorICoKKyAqIEByZXR1cm4JCVBKX1NVQ0NFU1Mgd2hlbiB0aGUgZm9ybWF0cyBpbiBvZmZlciBhbmQgYW5zd2VyIG1hdGNoLgorICovCitQSl9ERUNMKHBqX3N0YXR1c190KSBwam1lZGlhX3ZpZF9jb2RlY19oMjY0X21hdGNoX3NkcCgKKwkJCQkJCXBqX3Bvb2xfdCAqcG9vbCwKKwkJCQkJCXBqbWVkaWFfc2RwX21lZGlhICpvZmZlciwKKwkJCQkJCXVuc2lnbmVkIG9fZm10X2lkeCwKKwkJCQkJCXBqbWVkaWFfc2RwX21lZGlhICphbnN3ZXIsCisJCQkJCQl1bnNpZ25lZCBhX2ZtdF9pZHgsCisJCQkJCQl1bnNpZ25lZCBvcHRpb24pOworCisKKy8qKgorICogUGFyc2UgYW5kIGFwcGx5IHRoZSBlbmNvZGluZyBhbmQgZGVjb2RpbmcgU0RQIGZtdHAgb2YgSC4yNjQgaW4gdGhlCisgKiBzcGVjaWZpZWQgY29kZWMgcGFyYW1ldGVyLiBUaGlzIHdpbGwgdmFsaWRhdGUgc2l6ZSBhbmQgZnBzIHRvIGNvbmZvcm0KKyAqIHRvIEguMjY0IGxldmVsIHNwZWNpZmllZCBpbiBTRFAgZm10cCAicHJvZmlsZS1sZXZlbC1pZCIuCisgKgorICogQHBhcmFtIHBhcmFtCQlUaGUgY29kZWMgcGFyYW1ldGVyLgorICoKKyAqIEByZXR1cm4JCVBKX1NVQ0NFU1Mgb24gc3VjY2Vzcy4KKyAqLworUEpfREVDTChwal9zdGF0dXNfdCkgcGptZWRpYV92aWRfY29kZWNfaDI2NF9hcHBseV9mbXRwKAorCQkJCXBqbWVkaWFfdmlkX2NvZGVjX3BhcmFtICpwYXJhbSk7CisKKworUEpfRU5EX0RFQ0wKKworCisjZW5kaWYJLyogX19QSk1FRElBX1ZJRF9DT0RFQ19VVElMX0hfXyAqLwpkaWZmIC0tZ2l0IGEvam5pL3BqcHJvamVjdC1hbmRyb2lkLy5zdm4vcHJpc3RpbmUvMDUvMDVlM2QwOTMyNjBjYTg4ZjhlMmFmZGVjMzM4ZWZiMjNlMDllMTk4Mi5zdm4tYmFzZSBiL2puaS9wanByb2plY3QtYW5kcm9pZC8uc3ZuL3ByaXN0aW5lLzA1LzA1ZTNkMDkzMjYwY2E4OGY4ZTJhZmRlYzMzOGVmYjIzZTA5ZTE5ODIuc3ZuLWJhc2UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjM0ZmI2YQotLS0gL2Rldi9udWxsCisrKyBiL2puaS9wanByb2plY3QtYW5kcm9pZC8uc3ZuL3ByaXN0aW5lLzA1LzA1ZTNkMDkzMjYwY2E4OGY4ZTJhZmRlYzMzOGVmYjIzZTA5ZTE5ODIuc3ZuLWJhc2UKQEAgLTAsMCArMSw3IEBACisjaWZuZGVmIFJFU0FNUExFX0hBU19TTUFMTF9GSUxURVIKKyMgICBkZWZpbmUgUkVTQU1QTEVfSEFTX1NNQUxMX0ZJTFRFUgkxCisjZW5kaWYKKworI2lmbmRlZiBSRVNBTVBMRV9IQVNfTEFSR0VfRklMVEVSCisjICAgZGVmaW5lIFJFU0FNUExFX0hBU19MQVJHRV9GSUxURVIJMQorI2VuZGlmCmRpZmYgLS1naXQgYS9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvLnN2bi9wcmlzdGluZS8wNS8wNWVmY2FlYTk3M2Y5Yjc2NTBkMGI2N2UzZWFmMzI2ZTgzN2RlMzk1LnN2bi1iYXNlIGIvam5pL3BqcHJvamVjdC1hbmRyb2lkLy5zdm4vcHJpc3RpbmUvMDUvMDVlZmNhZWE5NzNmOWI3NjUwZDBiNjdlM2VhZjMyNmU4MzdkZTM5NS5zdm4tYmFzZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOTIyOGM4Ci0tLSAvZGV2L251bGwKKysrIGIvam5pL3BqcHJvamVjdC1hbmRyb2lkLy5zdm4vcHJpc3RpbmUvMDUvMDVlZmNhZWE5NzNmOWI3NjUwZDBiNjdlM2VhZjMyNmU4MzdkZTM5NS5zdm4tYmFzZQpAQCAtMCwwICsxLDI3IEBACisjICRJZCQKK2ltcG9ydCBpbmNfc2lwIGFzIHNpcAoraW1wb3J0IGluY19zZHAgYXMgc2RwCisKK3NkcCA9IFwKKyIiIgordj0wCitvPS0gMCAwIElOIElQNCAxMjcuMC4wLjEKK3M9dGVzdGVyCitjPUlOIElQNCAxMjcuMC4wLjEKK3Q9MCAwCittPWF1ZGlvIDQwMDAgUlRQL0FWUCAwIDEwMQorYT1ydHBtYXA6MCBQQ01VLzgwMDAKK2E9c2VuZHJlY3YKK2E9cnRwbWFwOjEwMSB0ZWxlcGhvbmUtZXZlbnQvODAwMAorYT1mbXRwOjEwMSAwLTE1CithPWNyeXB0bzoxIEFFU19DTV8xMjhfSE1BQ19TSEExXzgwIGlubGluZTpXbkQ3YzFrc0RHcytkSWVmQ0VvOG9tUGc0dU84RFlJaW5OR0w1eXhRCithPWNyeXB0bzoxIEFFU19DTV8xMjhfSE1BQ19TSEExXzMyIGlubGluZTp0MHIwL2Fwa3VrVTdKampmUjBtWThHRWltQnE0T2lQRW05ZUtTRk94CisiIiIKKworYXJncyA9ICItLW51bGwtYXVkaW8gLS1hdXRvLWFuc3dlciAyMDAgLS1tYXgtY2FsbHMgMSAtLXVzZS1zcnRwIDEgLS1zcnRwLXNlY3VyZSAwIgoraW5jbHVkZSA9IFtdCitleGNsdWRlID0gW10KKworc2VuZHRvX2NmZyA9IHNpcC5TZW5kdG9DZmcoICJjYWxsZXIgaGFzIHVzZWQgaW52YWxpZCBjcnlwdG8gdGFnLCBjYWxsZWUgbXVzdCBub3QgYWNjZXB0IHRoZSBjYWxsIiwgCisJCQkgICAgcGpzdWFfYXJncz1hcmdzLCBzZHA9c2RwLCByZXNwX2NvZGU9NDA2LCAKKwkJCSAgICByZXNwX2luYz1pbmNsdWRlLCByZXNwX2V4Yz1leGNsdWRlKQo=