ZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcva3Rlc3QvY29tcGFyZS1rdGVzdC1zYW1wbGUucGwgYi90b29scy90ZXN0aW5nL2t0ZXN0L2NvbXBhcmUta3Rlc3Qtc2FtcGxlLnBsCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjlhNTcxZTcKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy90ZXN0aW5nL2t0ZXN0L2NvbXBhcmUta3Rlc3Qtc2FtcGxlLnBsCkBAIC0wLDAgKzEsMzAgQEAKKyMhL3Vzci9iaW4vcGVybAorCitvcGVuIChJTiwia3Rlc3QucGwiKTsKK3doaWxlICg8SU4+KSB7CisgICAgaWYgKC9cJG9wdFx7Ij8oW0EtWl0uKj8pKFxbLipcXSk/Ij9cfS8gfHwKKwkvc2V0X3Rlc3Rfb3B0aW9uXCgiKC4qPykiLykgeworCSRvcHR7JDF9ID0gMTsKKyAgICB9Cit9CitjbG9zZSBJTjsKKworb3BlbiAoSU4sICJzYW1wbGUuY29uZiIpOword2hpbGUgKDxJTj4pIHsKKyAgICBpZiAoL15ccyojP1xzKihcUyspXHMqPS8pIHsKKwkkc2FtcHskMX0gPSAxOworICAgIH0KK30KK2Nsb3NlIElOOworCitmb3JlYWNoICRvcHQgKGtleXMgJW9wdCkgeworICAgIGlmICghZGVmaW5lZCgkc2FtcHskb3B0fSkpIHsKKwlwcmludCAib3B0ID0gJG9wdFxuIjsKKyAgICB9Cit9CisKK2ZvcmVhY2ggJHNhbXAgKGtleXMgJXNhbXApIHsKKyAgICBpZiAoIWRlZmluZWQoJG9wdHskc2FtcH0pKSB7CisJcHJpbnQgInNhbXAgPSAkc2FtcFxuIjsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL2t0ZXN0L2t0ZXN0LnBsIGIvdG9vbHMvdGVzdGluZy9rdGVzdC9rdGVzdC5wbApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5lMWM2MmVlCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvdGVzdGluZy9rdGVzdC9rdGVzdC5wbApAQCAtMCwwICsxLDIwMjMgQEAKKyMhL3Vzci9iaW4vcGVybCAtdworIworIyBDb3B5d3JpdGUgMjAxMCAtIFN0ZXZlbiBSb3N0ZWR0IDxzcm9zdGVkdEByZWRoYXQuY29tPiwgUmVkIEhhdCBJbmMuCisjIExpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdQTCBMaWNlbnNlIHZlcnNpb24gMgorIworCit1c2Ugc3RyaWN0OwordXNlIElQQzo6T3BlbjI7Cit1c2UgRmNudGwgcXcoRl9HRVRGTCBGX1NFVEZMIE9fTk9OQkxPQ0spOwordXNlIEZpbGU6OlBhdGggcXcobWtwYXRoKTsKK3VzZSBGaWxlOjpDb3B5IHF3KGNwKTsKK3VzZSBGaWxlSGFuZGxlOworCitteSAkVkVSU0lPTiA9ICIwLjIiOworCiskfCA9IDE7CisKK215ICVvcHQ7CitteSAlcmVwZWF0X3Rlc3RzOworbXkgJXJlcGVhdHM7CitteSAlZGVmYXVsdDsKKworI2RlZmF1bHQgb3B0cworJGRlZmF1bHR7Ik5VTV9URVNUUyJ9CQk9IDE7CiskZGVmYXVsdHsiUkVCT09UX1RZUEUifQkJPSAiZ3J1YiI7CiskZGVmYXVsdHsiVEVTVF9UWVBFIn0JCT0gInRlc3QiOworJGRlZmF1bHR7IkJVSUxEX1RZUEUifQkJPSAicmFuZGNvbmZpZyI7CiskZGVmYXVsdHsiTUFLRV9DTUQifQkJPSAibWFrZSI7CiskZGVmYXVsdHsiVElNRU9VVCJ9CQk9IDEyMDsKKyRkZWZhdWx0eyJUTVBfRElSIn0JCT0gIi90bXAva3Rlc3QiOworJGRlZmF1bHR7IlNMRUVQX1RJTUUifQkJPSA2MDsJIyBzbGVlcCB0aW1lIGJldHdlZW4gdGVzdHMKKyRkZWZhdWx0eyJCVUlMRF9OT0NMRUFOIn0JPSAwOworJGRlZmF1bHR7IlJFQk9PVF9PTl9FUlJPUiJ9CT0gMDsKKyRkZWZhdWx0eyJQT1dFUk9GRl9PTl9FUlJPUiJ9CT0gMDsKKyRkZWZhdWx0eyJSRUJPT1RfT05fU1VDQ0VTUyJ9CT0gMTsKKyRkZWZhdWx0eyJQT1dFUk9GRl9PTl9TVUNDRVNTIn0JPSAwOworJGRlZmF1bHR7IkJVSUxEX09QVElPTlMifQk9ICIiOworJGRlZmF1bHR7IkJJU0VDVF9TTEVFUF9USU1FIn0JPSA2MDsgICAjIHNsZWVwIHRpbWUgYmV0d2VlbiBiaXNlY3RzCiskZGVmYXVsdHsiQ0xFQVJfTE9HIn0JCT0gMDsKKyRkZWZhdWx0eyJTVUNDRVNTX0xJTkUifQk9ICJsb2dpbjoiOworJGRlZmF1bHR7IkJPT1RFRF9USU1FT1VUIn0JPSAxOworJGRlZmF1bHR7IkRJRV9PTl9GQUlMVVJFIn0JPSAxOworJGRlZmF1bHR7IlNTSF9FWEVDIn0JCT0gInNzaCBcJFNTSF9VU0VSXEBcJE1BQ0hJTkUgXCRTU0hfQ09NTUFORCI7CiskZGVmYXVsdHsiU0NQX1RPX1RBUkdFVCJ9CT0gInNjcCBcJFNSQ19GSUxFIFwkU1NIX1VTRVJcQFwkTUFDSElORTpcJERTVF9GSUxFIjsKKyRkZWZhdWx0eyJSRUJPT1QifQkJPSAic3NoIFwkU1NIX1VTRVJcQFwkTUFDSElORSByZWJvb3QiOworJGRlZmF1bHR7IlNUT1BfQUZURVJfU1VDQ0VTUyJ9CT0gMTA7CiskZGVmYXVsdHsiU1RPUF9BRlRFUl9GQUlMVVJFIn0JPSA2MDsKKyRkZWZhdWx0eyJMT0NBTFZFUlNJT04ifQk9ICItdGVzdCI7CisKK215ICRrdGVzdF9jb25maWc7CitteSAkdmVyc2lvbjsKK215ICRtYWNoaW5lOworbXkgJHNzaF91c2VyOworbXkgJHRtcGRpcjsKK215ICRidWlsZGRpcjsKK215ICRvdXRwdXRkaXI7CitteSAkb3V0cHV0X2NvbmZpZzsKK215ICR0ZXN0X3R5cGU7CitteSAkYnVpbGRfdHlwZTsKK215ICRidWlsZF9vcHRpb25zOworbXkgJHJlYm9vdF90eXBlOworbXkgJHJlYm9vdF9zY3JpcHQ7CitteSAkcG93ZXJfY3ljbGU7CitteSAkcmVib290OworbXkgJHJlYm9vdF9vbl9lcnJvcjsKK215ICRwb3dlcm9mZl9vbl9lcnJvcjsKK215ICRkaWVfb25fZmFpbHVyZTsKK215ICRwb3dlcmN5Y2xlX2FmdGVyX3JlYm9vdDsKK215ICRwb3dlcm9mZl9hZnRlcl9oYWx0OworbXkgJHNzaF9leGVjOworbXkgJHNjcF90b190YXJnZXQ7CitteSAkcG93ZXJfb2ZmOworbXkgJGdydWJfbWVudTsKK215ICRncnViX251bWJlcjsKK215ICR0YXJnZXQ7CitteSAkbWFrZTsKK215ICRwb3N0X2luc3RhbGw7CitteSAkbm9jbGVhbjsKK215ICRtaW5jb25maWc7CitteSAkYWRkY29uZmlnOworbXkgJGluX2Jpc2VjdCA9IDA7CitteSAkYmlzZWN0X2JhZCA9ICIiOworbXkgJHJldmVyc2VfYmlzZWN0OworbXkgJGluX3BhdGNoY2hlY2sgPSAwOworbXkgJHJ1bl90ZXN0OworbXkgJHJlZGlyZWN0OworbXkgJGJ1aWxkbG9nOworbXkgJGRtZXNnOworbXkgJG1vbml0b3JfZnA7CitteSAkbW9uaXRvcl9waWQ7CitteSAkbW9uaXRvcl9jbnQgPSAwOworbXkgJHNsZWVwX3RpbWU7CitteSAkYmlzZWN0X3NsZWVwX3RpbWU7CitteSAkc3RvcmVfZmFpbHVyZXM7CitteSAkdGltZW91dDsKK215ICRib290ZWRfdGltZW91dDsKK215ICRjb25zb2xlOworbXkgJHN1Y2Nlc3NfbGluZTsKK215ICRzdG9wX2FmdGVyX3N1Y2Nlc3M7CitteSAkc3RvcF9hZnRlcl9mYWlsdXJlOworbXkgJGJ1aWxkX3RhcmdldDsKK215ICR0YXJnZXRfaW1hZ2U7CitteSAkbG9jYWx2ZXJzaW9uOworbXkgJGl0ZXJhdGlvbiA9IDA7CitteSAkc3VjY2Vzc2VzID0gMDsKKworbXkgJWVudGVyZWRfY29uZmlnczsKK215ICVjb25maWdfaGVscDsKKworJGNvbmZpZ19oZWxweyJNQUNISU5FIn0gPSA8PCAiRU9GIgorIFRoZSBtYWNoaW5lIGhvc3RuYW1lIHRoYXQgeW91IHdpbGwgdGVzdC4KK0VPRgorICAgIDsKKyRjb25maWdfaGVscHsiU1NIX1VTRVIifSA9IDw8ICJFT0YiCisgVGhlIGJveCBpcyBleHBlY3RlZCB0byBoYXZlIHNzaCBvbiBub3JtYWwgYm9vdHVwLCBwcm92aWRlIHRoZSB1c2VyCisgIChtb3N0IGxpa2VseSByb290LCBzaW5jZSB5b3UgbmVlZCBwcml2aWxlZ2VkIG9wZXJhdGlvbnMpCitFT0YKKyAgICA7CiskY29uZmlnX2hlbHB7IkJVSUxEX0RJUiJ9ID0gPDwgIkVPRiIKKyBUaGUgZGlyZWN0b3J5IHRoYXQgY29udGFpbnMgdGhlIExpbnV4IHNvdXJjZSBjb2RlIChmdWxsIHBhdGgpLgorRU9GCisgICAgOworJGNvbmZpZ19oZWxweyJPVVRQVVRfRElSIn0gPSA8PCAiRU9GIgorIFRoZSBkaXJlY3RvcnkgdGhhdCB0aGUgb2JqZWN0cyB3aWxsIGJlIGJ1aWx0IChmdWxsIHBhdGgpLgorIChjYW4gbm90IGJlIHNhbWUgYXMgQlVJTERfRElSKQorRU9GCisgICAgOworJGNvbmZpZ19oZWxweyJCVUlMRF9UQVJHRVQifSA9IDw8ICJFT0YiCisgVGhlIGxvY2F0aW9uIG9mIHRoZSBjb21waWxlZCBmaWxlIHRvIGNvcHkgdG8gdGhlIHRhcmdldC4KKyAocmVsYXRpdmUgdG8gT1VUUFVUX0RJUikKK0VPRgorICAgIDsKKyRjb25maWdfaGVscHsiVEFSR0VUX0lNQUdFIn0gPSA8PCAiRU9GIgorIFRoZSBwbGFjZSB0byBwdXQgeW91ciBpbWFnZSBvbiB0aGUgdGVzdCBtYWNoaW5lLgorRU9GCisgICAgOworJGNvbmZpZ19oZWxweyJQT1dFUl9DWUNMRSJ9ID0gPDwgIkVPRiIKKyBBIHNjcmlwdCBvciBjb21tYW5kIHRvIHJlYm9vdCB0aGUgYm94LgorCisgSGVyZSBpcyBhIGRpZ2l0YWwgbG9nZ2VycyBwb3dlciBzd2l0Y2ggZXhhbXBsZQorIFBPV0VSX0NZQ0xFID0gd2dldCAtLW5vLXByb3h5IC1PIC9kZXYvbnVsbCAtcSAgLS1hdXRoLW5vLWNoYWxsZW5nZSAnaHR0cDovL2FkbWluOmFkbWluXEBwb3dlci9vdXRsZXQ/NT1DQ0wnCisKKyBIZXJlIGlzIGFuIGV4YW1wbGUgdG8gcmVib290IGEgdmlydHVhbCBib3ggb24gdGhlIGN1cnJlbnQgaG9zdAorIHdpdGggdGhlIG5hbWUgIkd1ZXN0Ii4KKyBQT1dFUl9DWUNMRSA9IHZpcnNoIGRlc3Ryb3kgR3Vlc3Q7IHNsZWVwIDU7IHZpcnNoIHN0YXJ0IEd1ZXN0CitFT0YKKyAgICA7CiskY29uZmlnX2hlbHB7IkNPTlNPTEUifSA9IDw8ICJFT0YiCisgVGhlIHNjcmlwdCBvciBjb21tYW5kIHRoYXQgcmVhZHMgdGhlIGNvbnNvbGUKKworICBJZiB5b3UgdXNlIHR0eXdhdGNoIHNlcnZlciwgc29tZXRoaW5nIGxpa2UgdGhlIGZvbGxvd2luZyB3b3VsZCB3b3JrLgorQ09OU09MRSA9IG5jIC1kIGxvY2FsaG9zdCAzMDAxCisKKyBGb3IgYSB2aXJ0dWFsIG1hY2hpbmUgd2l0aCBndWVzdCBuYW1lICJHdWVzdCIuCitDT05TT0xFID0gIHZpcnNoIGNvbnNvbGUgR3Vlc3QKK0VPRgorICAgIDsKKyRjb25maWdfaGVscHsiTE9DQUxWRVJTSU9OIn0gPSA8PCAiRU9GIgorIFJlcXVpcmVkIHZlcnNpb24gZW5kaW5nIHRvIGRpZmZlcmVudGlhdGUgdGhlIHRlc3QKKyBmcm9tIG90aGVyIGxpbnV4IGJ1aWxkcyBvbiB0aGUgc3lzdGVtLgorRU9GCisgICAgOworJGNvbmZpZ19oZWxweyJSRUJPT1RfVFlQRSJ9ID0gPDwgIkVPRiIKKyBXYXkgdG8gcmVib290IHRoZSBib3ggdG8gdGhlIHRlc3Qga2VybmVsLgorIE9ubHkgdmFsaWQgb3B0aW9ucyBzbyBmYXIgYXJlICJncnViIiBhbmQgInNjcmlwdCIuCisKKyBJZiB5b3Ugc3BlY2lmeSBncnViLCBpdCB3aWxsIGFzc3VtZSBncnViIHZlcnNpb24gMQorIGFuZCB3aWxsIHNlYXJjaCBpbiAvYm9vdC9ncnViL21lbnUubHN0IGZvciB0aGUgdGl0bGUgXCRHUlVCX01FTlUKKyBhbmQgc2VsZWN0IHRoYXQgdGFyZ2V0IHRvIHJlYm9vdCB0byB0aGUga2VybmVsLiBJZiB0aGlzIGlzIG5vdAorIHlvdXIgc2V0dXAsIHRoZW4gc3BlY2lmeSAic2NyaXB0IiBhbmQgaGF2ZSBhIGNvbW1hbmQgb3Igc2NyaXB0Cisgc3BlY2lmaWVkIGluIFJFQk9PVF9TQ1JJUFQgdG8gYm9vdCB0byB0aGUgdGFyZ2V0LgorCisgVGhlIGVudHJ5IGluIC9ib290L2dydWIvbWVudS5sc3QgbXVzdCBiZSBlbnRlcmVkIGluIG1hbnVhbGx5LgorIFRoZSB0ZXN0IHdpbGwgbm90IG1vZGlmeSB0aGF0IGZpbGUuCitFT0YKKyAgICA7CiskY29uZmlnX2hlbHB7IkdSVUJfTUVOVSJ9ID0gPDwgIkVPRiIKKyBUaGUgZ3J1YiB0aXRsZSBuYW1lIGZvciB0aGUgdGVzdCBrZXJuZWwgdG8gYm9vdAorIChPbmx5IG1hbmRhdG9yeSBpZiBSRUJPT1RfVFlQRSA9IGdydWIpCisKKyBOb3RlLCBrdGVzdC5wbCB3aWxsIG5vdCB1cGRhdGUgdGhlIGdydWIgbWVudS5sc3QsIHlvdSBuZWVkIHRvCisgbWFudWFsbHkgYWRkIGFuIG9wdGlvbiBmb3IgdGhlIHRlc3QuIGt0ZXN0LnBsIHdpbGwgc2VhcmNoCisgdGhlIGdydWIgbWVudS5sc3QgZm9yIHRoaXMgb3B0aW9uIHRvIGZpbmQgd2hhdCBrZXJuZWwgdG8KKyByZWJvb3QgaW50by4KKworIEZvciBleGFtcGxlLCBpZiBpbiB0aGUgL2Jvb3QvZ3J1Yi9tZW51LmxzdCB0aGUgdGVzdCBrZXJuZWwgdGl0bGUgaGFzOgorIHRpdGxlIFRlc3QgS2VybmVsCisga2VybmVsIHZtbGludXotdGVzdAorIEdSVUJfTUVOVSA9IFRlc3QgS2VybmVsCitFT0YKKyAgICA7CiskY29uZmlnX2hlbHB7IlJFQk9PVF9TQ1JJUFQifSA9IDw8ICJFT0YiCisgQSBzY3JpcHQgdG8gcmVib290IHRoZSB0YXJnZXQgaW50byB0aGUgdGVzdCBrZXJuZWwKKyAoT25seSBtYW5kYXRvcnkgaWYgUkVCT09UX1RZUEUgPSBzY3JpcHQpCitFT0YKKyAgICA7CisKKworc3ViIGdldF9rdGVzdF9jb25maWcgeworICAgIG15ICgkY29uZmlnKSA9IEBfOworCisgICAgcmV0dXJuIGlmIChkZWZpbmVkKCRvcHR7JGNvbmZpZ30pKTsKKworICAgIGlmIChkZWZpbmVkKCRjb25maWdfaGVscHskY29uZmlnfSkpIHsKKwlwcmludCAiXG4iOworCXByaW50ICRjb25maWdfaGVscHskY29uZmlnfTsKKyAgICB9CisKKyAgICBmb3IgKDs7KSB7CisJcHJpbnQgIiRjb25maWcgPSAiOworCWlmIChkZWZpbmVkKCRkZWZhdWx0eyRjb25maWd9KSkgeworCSAgICBwcmludCAiXFskZGVmYXVsdHskY29uZmlnfVxdICI7CisJfQorCSRlbnRlcmVkX2NvbmZpZ3N7JGNvbmZpZ30gPSA8U1RESU4+OworCSRlbnRlcmVkX2NvbmZpZ3N7JGNvbmZpZ30gPX4gcy9eXHMqKC4qXFMpXHMqJC8kMS87CisJaWYgKCRlbnRlcmVkX2NvbmZpZ3N7JGNvbmZpZ30gPX4gL15ccyokLykgeworCSAgICBpZiAoJGRlZmF1bHR7JGNvbmZpZ30pIHsKKwkJJGVudGVyZWRfY29uZmlnc3skY29uZmlnfSA9ICRkZWZhdWx0eyRjb25maWd9OworCSAgICB9IGVsc2UgeworCQlwcmludCAiWW91ciBhbnN3ZXIgY2FuIG5vdCBiZSBibGFua1xuIjsKKwkJbmV4dDsKKwkgICAgfQorCX0KKwlsYXN0OworICAgIH0KK30KKworc3ViIGdldF9rdGVzdF9jb25maWdzIHsKKyAgICBnZXRfa3Rlc3RfY29uZmlnKCJNQUNISU5FIik7CisgICAgZ2V0X2t0ZXN0X2NvbmZpZygiU1NIX1VTRVIiKTsKKyAgICBnZXRfa3Rlc3RfY29uZmlnKCJCVUlMRF9ESVIiKTsKKyAgICBnZXRfa3Rlc3RfY29uZmlnKCJPVVRQVVRfRElSIik7CisgICAgZ2V0X2t0ZXN0X2NvbmZpZygiQlVJTERfVEFSR0VUIik7CisgICAgZ2V0X2t0ZXN0X2NvbmZpZygiVEFSR0VUX0lNQUdFIik7CisgICAgZ2V0X2t0ZXN0X2NvbmZpZygiUE9XRVJfQ1lDTEUiKTsKKyAgICBnZXRfa3Rlc3RfY29uZmlnKCJDT05TT0xFIik7CisgICAgZ2V0X2t0ZXN0X2NvbmZpZygiTE9DQUxWRVJTSU9OIik7CisKKyAgICBteSAkcnR5cGUgPSAkb3B0eyJSRUJPT1RfVFlQRSJ9OworCisgICAgaWYgKCFkZWZpbmVkKCRydHlwZSkpIHsKKwlpZiAoIWRlZmluZWQoJG9wdHsiR1JVQl9NRU5VIn0pKSB7CisJICAgIGdldF9rdGVzdF9jb25maWcoIlJFQk9PVF9UWVBFIik7CisJICAgICRydHlwZSA9ICRlbnRlcmVkX2NvbmZpZ3N7IlJFQk9PVF9UWVBFIn07CisJfSBlbHNlIHsKKwkgICAgJHJ0eXBlID0gImdydWIiOworCX0KKyAgICB9CisKKyAgICBpZiAoJHJ0eXBlIGVxICJncnViIikgeworCWdldF9rdGVzdF9jb25maWcoIkdSVUJfTUVOVSIpOworICAgIH0gZWxzZSB7CisJZ2V0X2t0ZXN0X2NvbmZpZygiUkVCT09UX1NDUklQVCIpOworICAgIH0KK30KKworc3ViIHNldF92YWx1ZSB7CisgICAgbXkgKCRsdmFsdWUsICRydmFsdWUpID0gQF87CisKKyAgICBpZiAoZGVmaW5lZCgkb3B0eyRsdmFsdWV9KSkgeworCWRpZSAiRXJyb3I6IE9wdGlvbiAkbHZhbHVlIGRlZmluZWQgbW9yZSB0aGFuIG9uY2UhXG4iOworICAgIH0KKyAgICBpZiAoJHJ2YWx1ZSA9fiAvXlxzKiQvKSB7CisJZGVsZXRlICRvcHR7JGx2YWx1ZX07CisgICAgfSBlbHNlIHsKKwkkb3B0eyRsdmFsdWV9ID0gJHJ2YWx1ZTsKKyAgICB9Cit9CisKK3N1YiByZWFkX2NvbmZpZyB7CisgICAgbXkgKCRjb25maWcpID0gQF87CisKKyAgICBvcGVuKElOLCAkY29uZmlnKSB8fCBkaWUgImNhbid0IHJlYWQgZmlsZSAkY29uZmlnIjsKKworICAgIG15ICRuYW1lID0gJGNvbmZpZzsKKyAgICAkbmFtZSA9fiBzLC4qLyguKiksJDEsOworCisgICAgbXkgJHRlc3RfbnVtID0gMDsKKyAgICBteSAkZGVmYXVsdCA9IDE7CisgICAgbXkgJHJlcGVhdCA9IDE7CisgICAgbXkgJG51bV90ZXN0c19zZXQgPSAwOworICAgIG15ICRza2lwID0gMDsKKyAgICBteSAkcmVzdDsKKworICAgIHdoaWxlICg8SU4+KSB7CisKKwkjIGlnbm9yZSBibGFuayBsaW5lcyBhbmQgY29tbWVudHMKKwluZXh0IGlmICgvXlxzKiQvIHx8IC9ccypcIy8pOworCisJaWYgKC9eXHMqVEVTVF9TVEFSVCguKikvKSB7CisKKwkgICAgJHJlc3QgPSAkMTsKKworCSAgICBpZiAoJG51bV90ZXN0c19zZXQpIHsKKwkJZGllICIkbmFtZTogJC46IENhbiBub3Qgc3BlY2lmeSBib3RoIE5VTV9URVNUUyBhbmQgVEVTVF9TVEFSVFxuIjsKKwkgICAgfQorCisJICAgIG15ICRvbGRfdGVzdF9udW0gPSAkdGVzdF9udW07CisJICAgIG15ICRvbGRfcmVwZWF0ID0gJHJlcGVhdDsKKworCSAgICAkdGVzdF9udW0gKz0gJHJlcGVhdDsKKwkgICAgJGRlZmF1bHQgPSAwOworCSAgICAkcmVwZWF0ID0gMTsKKworCSAgICBpZiAoJHJlc3QgPX4gL1xzK1NLSVAoLiopLykgeworCQkkcmVzdCA9ICQxOworCQkkc2tpcCA9IDE7CisJICAgIH0gZWxzZSB7CisJCSRza2lwID0gMDsKKwkgICAgfQorCisJICAgIGlmICgkcmVzdCA9fiAvXHMrSVRFUkFURVxzKyhcZCspKC4qKSQvKSB7CisJCSRyZXBlYXQgPSAkMTsKKwkJJHJlc3QgPSAkMjsKKwkJJHJlcGVhdF90ZXN0c3siJHRlc3RfbnVtIn0gPSAkcmVwZWF0OworCSAgICB9CisKKwkgICAgaWYgKCRyZXN0ID1+IC9ccytTS0lQKC4qKS8pIHsKKwkJJHJlc3QgPSAkMTsKKwkJJHNraXAgPSAxOworCSAgICB9CisKKwkgICAgaWYgKCRyZXN0ICF+IC9eXHMqJC8pIHsKKwkJZGllICIkbmFtZTogJC46IEdhcmdiYWdlIGZvdW5kIGFmdGVyIFRFU1RfU1RBUlRcbiRfIjsKKwkgICAgfQorCisJICAgIGlmICgkc2tpcCkgeworCQkkdGVzdF9udW0gPSAkb2xkX3Rlc3RfbnVtOworCQkkcmVwZWF0ID0gJG9sZF9yZXBlYXQ7CisJICAgIH0KKworCX0gZWxzaWYgKC9eXHMqREVGQVVMVFMoLiopJC8pIHsKKwkgICAgJGRlZmF1bHQgPSAxOworCisJICAgICRyZXN0ID0gJDE7CisKKwkgICAgaWYgKCRyZXN0ID1+IC9ccytTS0lQKC4qKS8pIHsKKwkJJHJlc3QgPSAkMTsKKwkJJHNraXAgPSAxOworCSAgICB9IGVsc2UgeworCQkkc2tpcCA9IDA7CisJICAgIH0KKworCSAgICBpZiAoJHJlc3QgIX4gL15ccyokLykgeworCQlkaWUgIiRuYW1lOiAkLjogR2FyZ2JhZ2UgZm91bmQgYWZ0ZXIgREVGQVVMVFNcbiRfIjsKKwkgICAgfQorCisJfSBlbHNpZiAoL15ccyooW0EtWl9cW1xdXGRdKylccyo9XHMqKC4qPylccyokLykgeworCisJICAgIG5leHQgaWYgKCRza2lwKTsKKworCSAgICBteSAkbHZhbHVlID0gJDE7CisJICAgIG15ICRydmFsdWUgPSAkMjsKKworCSAgICBpZiAoISRkZWZhdWx0ICYmCisJCSgkbHZhbHVlIGVxICJOVU1fVEVTVFMiIHx8CisJCSAkbHZhbHVlIGVxICJMT0dfRklMRSIgfHwKKwkJICRsdmFsdWUgZXEgIkNMRUFSX0xPRyIpKSB7CisJCWRpZSAiJG5hbWU6ICQuOiAkbHZhbHVlIG11c3QgYmUgc2V0IGluIERFRkFVTFRTIHNlY3Rpb25cbiI7CisJICAgIH0KKworCSAgICBpZiAoJGx2YWx1ZSBlcSAiTlVNX1RFU1RTIikgeworCQlpZiAoJHRlc3RfbnVtKSB7CisJCSAgICBkaWUgIiRuYW1lOiAkLjogQ2FuIG5vdCBzcGVjaWZ5IGJvdGggTlVNX1RFU1RTIGFuZCBURVNUX1NUQVJUXG4iOworCQl9CisJCWlmICghJGRlZmF1bHQpIHsKKwkJICAgIGRpZSAiJG5hbWU6ICQuOiBOVU1fVEVTVFMgbXVzdCBiZSBzZXQgaW4gZGVmYXVsdCBzZWN0aW9uXG4iOworCQl9CisJCSRudW1fdGVzdHNfc2V0ID0gMTsKKwkgICAgfQorCisJICAgIGlmICgkZGVmYXVsdCB8fCAkbHZhbHVlID1+IC9cW1xkK1xdJC8pIHsKKwkJc2V0X3ZhbHVlKCRsdmFsdWUsICRydmFsdWUpOworCSAgICB9IGVsc2UgeworCQlteSAkdmFsID0gIiRsdmFsdWVcWyR0ZXN0X251bVxdIjsKKwkJc2V0X3ZhbHVlKCR2YWwsICRydmFsdWUpOworCisJCWlmICgkcmVwZWF0ID4gMSkgeworCQkgICAgJHJlcGVhdHN7JHZhbH0gPSAkcmVwZWF0OworCQl9CisJICAgIH0KKwl9IGVsc2UgeworCSAgICBkaWUgIiRuYW1lOiAkLjogR2FyYmFnZSBmb3VuZCBpbiBjb25maWdcbiRfIjsKKwl9CisgICAgfQorCisgICAgY2xvc2UoSU4pOworCisgICAgaWYgKCR0ZXN0X251bSkgeworCSR0ZXN0X251bSArPSAkcmVwZWF0IC0gMTsKKwkkb3B0eyJOVU1fVEVTVFMifSA9ICR0ZXN0X251bTsKKyAgICB9CisKKyAgICAjIG1ha2Ugc3VyZSB3ZSBoYXZlIGFsbCBtYW5kYXRvcnkgY29uZmlncworICAgIGdldF9rdGVzdF9jb25maWdzOworCisgICAgIyBzZXQgYW55IGRlZmF1bHRzCisKKyAgICBmb3JlYWNoIG15ICRkZWZhdWx0IChrZXlzICVkZWZhdWx0KSB7CisJaWYgKCFkZWZpbmVkKCRvcHR7JGRlZmF1bHR9KSkgeworCSAgICAkb3B0eyRkZWZhdWx0fSA9ICRkZWZhdWx0eyRkZWZhdWx0fTsKKwl9CisgICAgfQorfQorCitzdWIgX2xvZ2l0IHsKKyAgICBpZiAoZGVmaW5lZCgkb3B0eyJMT0dfRklMRSJ9KSkgeworCW9wZW4oT1VULCAiPj4gJG9wdHtMT0dfRklMRX0iKSBvciBkaWUgIkNhbid0IHdyaXRlIHRvICRvcHR7TE9HX0ZJTEV9IjsKKwlwcmludCBPVVQgQF87CisJY2xvc2UoT1VUKTsKKyAgICB9Cit9CisKK3N1YiBsb2dpdCB7CisgICAgaWYgKGRlZmluZWQoJG9wdHsiTE9HX0ZJTEUifSkpIHsKKwlfbG9naXQgQF87CisgICAgfSBlbHNlIHsKKwlwcmludCBAXzsKKyAgICB9Cit9CisKK3N1YiBkb3ByaW50IHsKKyAgICBwcmludCBAXzsKKyAgICBfbG9naXQgQF87Cit9CisKK3N1YiBydW5fY29tbWFuZDsKKworc3ViIHJlYm9vdCB7CisgICAgIyB0cnkgdG8gcmVib290IG5vcm1hbGx5CisgICAgaWYgKHJ1bl9jb21tYW5kICRyZWJvb3QpIHsKKwlpZiAoZGVmaW5lZCgkcG93ZXJjeWNsZV9hZnRlcl9yZWJvb3QpKSB7CisJICAgIHNsZWVwICRwb3dlcmN5Y2xlX2FmdGVyX3JlYm9vdDsKKwkgICAgcnVuX2NvbW1hbmQgIiRwb3dlcl9jeWNsZSI7CisJfQorICAgIH0gZWxzZSB7CisJIyBub3BlPyBwb3dlciBjeWNsZSBpdC4KKwlydW5fY29tbWFuZCAiJHBvd2VyX2N5Y2xlIjsKKyAgICB9Cit9CisKK3N1YiBkb19ub3RfcmVib290IHsKKyAgICBteSAkaSA9ICRpdGVyYXRpb247CisKKyAgICByZXR1cm4gJHRlc3RfdHlwZSBlcSAiYnVpbGQiIHx8CisJKCR0ZXN0X3R5cGUgZXEgInBhdGNoY2hlY2siICYmICRvcHR7IlBBVENIQ0hFQ0tfVFlQRVskaV0ifSBlcSAiYnVpbGQiKSB8fAorCSgkdGVzdF90eXBlIGVxICJiaXNlY3QiICYmICRvcHR7IkJJU0VDVF9UWVBFWyRpXSJ9IGVxICJidWlsZCIpOworfQorCitzdWIgZG9kaWUgeworICAgIGRvcHJpbnQgIkNSSVRJQ0FMIEZBSUxVUkUuLi4gIiwgQF8sICJcbiI7CisKKyAgICBteSAkaSA9ICRpdGVyYXRpb247CisKKyAgICBpZiAoJHJlYm9vdF9vbl9lcnJvciAmJiAhZG9fbm90X3JlYm9vdCkgeworCisJZG9wcmludCAiUkVCT09USU5HXG4iOworCXJlYm9vdDsKKworICAgIH0gZWxzaWYgKCRwb3dlcm9mZl9vbl9lcnJvciAmJiBkZWZpbmVkKCRwb3dlcl9vZmYpKSB7CisJZG9wcmludCAiUE9XRVJJTkcgT0ZGXG4iOworCWAkcG93ZXJfb2ZmYDsKKyAgICB9CisKKyAgICBkaWUgQF8sICJcbiI7Cit9CisKK3N1YiBvcGVuX2NvbnNvbGUgeworICAgIG15ICgkZnApID0gQF87CisKKyAgICBteSAkZmxhZ3M7CisKKyAgICBteSAkcGlkID0gb3BlbigkZnAsICIkY29uc29sZXwiKSBvcgorCWRvZGllICJDYW4ndCBvcGVuIGNvbnNvbGUgJGNvbnNvbGUiOworCisgICAgJGZsYWdzID0gZmNudGwoJGZwLCBGX0dFVEZMLCAwKSBvcgorCWRvZGllICJDYW4ndCBnZXQgZmxhZ3MgZm9yIHRoZSBzb2NrZXQ6ICQhIjsKKyAgICAkZmxhZ3MgPSBmY250bCgkZnAsIEZfU0VURkwsICRmbGFncyB8IE9fTk9OQkxPQ0spIG9yCisJZG9kaWUgIkNhbid0IHNldCBmbGFncyBmb3IgdGhlIHNvY2tldDogJCEiOworCisgICAgcmV0dXJuICRwaWQ7Cit9CisKK3N1YiBjbG9zZV9jb25zb2xlIHsKKyAgICBteSAoJGZwLCAkcGlkKSA9IEBfOworCisgICAgZG9wcmludCAia2lsbCBjaGlsZCBwcm9jZXNzICRwaWRcbiI7CisgICAga2lsbCAyLCAkcGlkOworCisgICAgcHJpbnQgImNsb3NpbmchXG4iOworICAgIGNsb3NlKCRmcCk7Cit9CisKK3N1YiBzdGFydF9tb25pdG9yIHsKKyAgICBpZiAoJG1vbml0b3JfY250KyspIHsKKwlyZXR1cm47CisgICAgfQorICAgICRtb25pdG9yX2ZwID0gXCpNT05GRDsKKyAgICAkbW9uaXRvcl9waWQgPSBvcGVuX2NvbnNvbGUgJG1vbml0b3JfZnA7CisKKyAgICByZXR1cm47CisKKyAgICBvcGVuKE1PTkZELCAiU3RvcCBwZXJsIGZyb20gd2FybmluZyBhYm91dCBzaW5nbGUgdXNlIG9mIE1PTkZEIik7Cit9CisKK3N1YiBlbmRfbW9uaXRvciB7CisgICAgaWYgKC0tJG1vbml0b3JfY250KSB7CisJcmV0dXJuOworICAgIH0KKyAgICBjbG9zZV9jb25zb2xlKCRtb25pdG9yX2ZwLCAkbW9uaXRvcl9waWQpOworfQorCitzdWIgd2FpdF9mb3JfbW9uaXRvciB7CisgICAgbXkgKCR0aW1lKSA9IEBfOworICAgIG15ICRsaW5lOworCisgICAgZG9wcmludCAiKiogV2FpdCBmb3IgbW9uaXRvciB0byBzZXR0bGUgZG93biAqKlxuIjsKKworICAgICMgcmVhZCB0aGUgbW9uaXRvciBhbmQgd2FpdCBmb3IgdGhlIHN5c3RlbSB0byBjYWxtIGRvd24KKyAgICBkbyB7CisJJGxpbmUgPSB3YWl0X2Zvcl9pbnB1dCgkbW9uaXRvcl9mcCwgJHRpbWUpOworCXByaW50ICIkbGluZSIgaWYgKGRlZmluZWQoJGxpbmUpKTsKKyAgICB9IHdoaWxlIChkZWZpbmVkKCRsaW5lKSk7CisgICAgcHJpbnQgIioqIE1vbml0b3IgZmx1c2hlZCAqKlxuIjsKK30KKworc3ViIGZhaWwgeworCisJaWYgKCRkaWVfb25fZmFpbHVyZSkgeworCQlkb2RpZSBAXzsKKwl9CisKKwlkb3ByaW50ICJGQUlMRURcbiI7CisKKwlteSAkaSA9ICRpdGVyYXRpb247CisKKwkjIG5vIG5lZWQgdG8gcmVib290IGZvciBqdXN0IGJ1aWxkaW5nLgorCWlmICghZG9fbm90X3JlYm9vdCkgeworCSAgICBkb3ByaW50ICJSRUJPT1RJTkdcbiI7CisJICAgIHJlYm9vdDsKKwkgICAgc3RhcnRfbW9uaXRvcjsKKwkgICAgd2FpdF9mb3JfbW9uaXRvciAkc2xlZXBfdGltZTsKKwkgICAgZW5kX21vbml0b3I7CisJfQorCisJZG9wcmludCAiJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJVxuIjsKKwlkb3ByaW50ICIlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlXG4iOworCWRvcHJpbnQgIktURVNUIFJFU1VMVDogVEVTVCAkaSBGYWlsZWQ6ICIsIEBfLCAiXG4iOworCWRvcHJpbnQgIiUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSVcbiI7CisJZG9wcmludCAiJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJVxuIjsKKworCXJldHVybiAxIGlmICghZGVmaW5lZCgkc3RvcmVfZmFpbHVyZXMpKTsKKworCW15IEB0ID0gbG9jYWx0aW1lOworCW15ICRkYXRlID0gc3ByaW50ZiAiJTA0ZCUwMmQlMDJkJTAyZCUwMmQlMDJkIiwKKwkJMTkwMCskdFs1XSwkdFs0XSwkdFszXSwkdFsyXSwkdFsxXSwkdFswXTsKKworCW15ICR0eXBlID0gJGJ1aWxkX3R5cGU7CisJaWYgKCR0eXBlID1+IC91c2Vjb25maWcvKSB7CisJICAgICR0eXBlID0gInVzZWNvbmZpZyI7CisJfQorCisJbXkgJGRpciA9ICIkbWFjaGluZS0kdGVzdF90eXBlLSR0eXBlLWZhaWwtJGRhdGUiOworCW15ICRmYWlsZGlyID0gIiRzdG9yZV9mYWlsdXJlcy8kZGlyIjsKKworCWlmICghLWQgJGZhaWxkaXIpIHsKKwkgICAgbWtwYXRoKCRmYWlsZGlyKSBvcgorCQlkaWUgImNhbid0IGNyZWF0ZSAkZmFpbGRpciI7CisJfQorCWlmICgtZiAiJG91dHB1dF9jb25maWciKSB7CisJICAgIGNwICIkb3V0cHV0X2NvbmZpZyIsICIkZmFpbGRpci9jb25maWciIG9yCisJCWRpZSAiZmFpbGVkIHRvIGNvcHkgLmNvbmZpZyI7CisJfQorCWlmICgtZiAkYnVpbGRsb2cpIHsKKwkgICAgY3AgJGJ1aWxkbG9nLCAiJGZhaWxkaXIvYnVpbGRsb2ciIG9yCisJCWRpZSAiZmFpbGVkIHRvIG1vdmUgJGJ1aWxkbG9nIjsKKwl9CisJaWYgKC1mICRkbWVzZykgeworCSAgICBjcCAkZG1lc2csICIkZmFpbGRpci9kbWVzZyIgb3IKKwkJZGllICJmYWlsZWQgdG8gbW92ZSAkZG1lc2ciOworCX0KKworCWRvcHJpbnQgIioqKiBTYXZlZCBpbmZvIHRvICRmYWlsZGlyICoqKlxuIjsKKworCXJldHVybiAxOworfQorCitzdWIgcnVuX2NvbW1hbmQgeworICAgIG15ICgkY29tbWFuZCkgPSBAXzsKKyAgICBteSAkZG9sb2cgPSAwOworICAgIG15ICRkb3JkID0gMDsKKyAgICBteSAkcGlkOworCisgICAgJGNvbW1hbmQgPX4gcy9cJFNTSF9VU0VSLyRzc2hfdXNlci9nOworICAgICRjb21tYW5kID1+IHMvXCRNQUNISU5FLyRtYWNoaW5lL2c7CisKKyAgICBkb3ByaW50KCIkY29tbWFuZCAuLi4gIik7CisKKyAgICAkcGlkID0gb3BlbihDTUQsICIkY29tbWFuZCAyPiYxIHwiKSBvcgorCShmYWlsICJ1bmFibGUgdG8gZXhlYyAkY29tbWFuZCIgYW5kIHJldHVybiAwKTsKKworICAgIGlmIChkZWZpbmVkKCRvcHR7IkxPR19GSUxFIn0pKSB7CisJb3BlbihMT0csICI+PiRvcHR7TE9HX0ZJTEV9Iikgb3IKKwkgICAgZG9kaWUgImZhaWxlZCB0byB3cml0ZSB0byBsb2ciOworCSRkb2xvZyA9IDE7CisgICAgfQorCisgICAgaWYgKGRlZmluZWQoJHJlZGlyZWN0KSkgeworCW9wZW4gKFJELCAiPiRyZWRpcmVjdCIpIG9yCisJICAgIGRvZGllICJmYWlsZWQgdG8gd3JpdGUgdG8gcmVkaXJlY3QgJHJlZGlyZWN0IjsKKwkkZG9yZCA9IDE7CisgICAgfQorCisgICAgd2hpbGUgKDxDTUQ+KSB7CisJcHJpbnQgTE9HIGlmICgkZG9sb2cpOworCXByaW50IFJEICBpZiAoJGRvcmQpOworICAgIH0KKworICAgIHdhaXRwaWQoJHBpZCwgMCk7CisgICAgbXkgJGZhaWxlZCA9ICQ/OworCisgICAgY2xvc2UoQ01EKTsKKyAgICBjbG9zZShMT0cpIGlmICgkZG9sb2cpOworICAgIGNsb3NlKFJEKSAgaWYgKCRkb3JkKTsKKworICAgIGlmICgkZmFpbGVkKSB7CisJZG9wcmludCAiRkFJTEVEIVxuIjsKKyAgICB9IGVsc2UgeworCWRvcHJpbnQgIlNVQ0NFU1NcbiI7CisgICAgfQorCisgICAgcmV0dXJuICEkZmFpbGVkOworfQorCitzdWIgcnVuX3NzaCB7CisgICAgbXkgKCRjbWQpID0gQF87CisgICAgbXkgJGNwX2V4ZWMgPSAkc3NoX2V4ZWM7CisKKyAgICAkY3BfZXhlYyA9fiBzL1wkU1NIX0NPTU1BTkQvJGNtZC9nOworICAgIHJldHVybiBydW5fY29tbWFuZCAiJGNwX2V4ZWMiOworfQorCitzdWIgcnVuX3NjcCB7CisgICAgbXkgKCRzcmMsICRkc3QpID0gQF87CisgICAgbXkgJGNwX3NjcCA9ICRzY3BfdG9fdGFyZ2V0OworCisgICAgJGNwX3NjcCA9fiBzL1wkU1JDX0ZJTEUvJHNyYy9nOworICAgICRjcF9zY3AgPX4gcy9cJERTVF9GSUxFLyRkc3QvZzsKKworICAgIHJldHVybiBydW5fY29tbWFuZCAiJGNwX3NjcCI7Cit9CisKK3N1YiBnZXRfZ3J1Yl9pbmRleCB7CisKKyAgICBpZiAoJHJlYm9vdF90eXBlIG5lICJncnViIikgeworCXJldHVybjsKKyAgICB9CisgICAgcmV0dXJuIGlmIChkZWZpbmVkKCRncnViX251bWJlcikpOworCisgICAgZG9wcmludCAiRmluZCBncnViIG1lbnUgLi4uICI7CisgICAgJGdydWJfbnVtYmVyID0gLTE7CisKKyAgICBteSAkc3NoX2dydWIgPSAkc3NoX2V4ZWM7CisgICAgJHNzaF9ncnViID1+IHMsXCRTU0hfQ09NTUFORCxjYXQgL2Jvb3QvZ3J1Yi9tZW51LmxzdCxnOworCisgICAgb3BlbihJTiwgIiRzc2hfZ3J1YiB8IikKKwlvciBkaWUgInVuYWJsZSB0byBnZXQgbWVudS5sc3QiOworCisgICAgd2hpbGUgKDxJTj4pIHsKKwlpZiAoL15ccyp0aXRsZVxzKyRncnViX21lbnVccyokLykgeworCSAgICAkZ3J1Yl9udW1iZXIrKzsKKwkgICAgbGFzdDsKKwl9IGVsc2lmICgvXlxzKnRpdGxlXHMvKSB7CisJICAgICRncnViX251bWJlcisrOworCX0KKyAgICB9CisgICAgY2xvc2UoSU4pOworCisgICAgZGllICJDb3VsZCBub3QgZmluZCAnJGdydWJfbWVudScgaW4gL2Jvb3QvZ3J1Yi9tZW51IG9uICRtYWNoaW5lIgorCWlmICgkZ3J1Yl9udW1iZXIgPCAwKTsKKyAgICBkb3ByaW50ICIkZ3J1Yl9udW1iZXJcbiI7Cit9CisKK3N1YiB3YWl0X2Zvcl9pbnB1dAoreworICAgIG15ICgkZnAsICR0aW1lKSA9IEBfOworICAgIG15ICRyaW47CisgICAgbXkgJHJlYWR5OworICAgIG15ICRsaW5lOworICAgIG15ICRjaDsKKworICAgIGlmICghZGVmaW5lZCgkdGltZSkpIHsKKwkkdGltZSA9ICR0aW1lb3V0OworICAgIH0KKworICAgICRyaW4gPSAnJzsKKyAgICB2ZWMoJHJpbiwgZmlsZW5vKCRmcCksIDEpID0gMTsKKyAgICAkcmVhZHkgPSBzZWxlY3QoJHJpbiwgdW5kZWYsIHVuZGVmLCAkdGltZSk7CisKKyAgICAkbGluZSA9ICIiOworCisgICAgIyB0cnkgdG8gcmVhZCBvbmUgY2hhciBhdCBhIHRpbWUKKyAgICB3aGlsZSAoc3lzcmVhZCAkZnAsICRjaCwgMSkgeworCSRsaW5lIC49ICRjaDsKKwlsYXN0IGlmICgkY2ggZXEgIlxuIik7CisgICAgfQorCisgICAgaWYgKCFsZW5ndGgoJGxpbmUpKSB7CisJcmV0dXJuIHVuZGVmOworICAgIH0KKworICAgIHJldHVybiAkbGluZTsKK30KKworc3ViIHJlYm9vdF90byB7CisgICAgaWYgKCRyZWJvb3RfdHlwZSBlcSAiZ3J1YiIpIHsKKwlydW5fc3NoICInKGVjaG8gXCJzYXZlZGVmYXVsdCAtLWRlZmF1bHQ9JGdydWJfbnVtYmVyIC0tb25jZVwiIHwgZ3J1YiAtLWJhdGNoOyByZWJvb3QpJyI7CisJcmV0dXJuOworICAgIH0KKworICAgIHJ1bl9jb21tYW5kICIkcmVib290X3NjcmlwdCI7Cit9CisKK3N1YiBnZXRfc2hhMSB7CisgICAgbXkgKCRjb21taXQpID0gQF87CisKKyAgICBkb3ByaW50ICJnaXQgcmV2LWxpc3QgLS1tYXgtY291bnQ9MSAkY29tbWl0IC4uLiAiOworICAgIG15ICRzaGExID0gYGdpdCByZXYtbGlzdCAtLW1heC1jb3VudD0xICRjb21taXRgOworICAgIG15ICRyZXQgPSAkPzsKKworICAgIGxvZ2l0ICRzaGExOworCisgICAgaWYgKCRyZXQpIHsKKwlkb3ByaW50ICJGQUlMRURcbiI7CisJZG9kaWUgIkZhaWxlZCB0byBnZXQgZ2l0ICRjb21taXQiOworICAgIH0KKworICAgIHByaW50ICJTVUNDRVNTXG4iOworCisgICAgY2hvbXAgJHNoYTE7CisKKyAgICByZXR1cm4gJHNoYTE7Cit9CisKK3N1YiBtb25pdG9yIHsKKyAgICBteSAkYm9vdGVkID0gMDsKKyAgICBteSAkYnVnID0gMDsKKyAgICBteSAkc2tpcF9jYWxsX3RyYWNlID0gMDsKKyAgICBteSAkbG9vcHM7CisKKyAgICB3YWl0X2Zvcl9tb25pdG9yIDU7CisKKyAgICBteSAkbGluZTsKKyAgICBteSAkZnVsbF9saW5lID0gIiI7CisKKyAgICBvcGVuKERNRVNHLCAiPiAkZG1lc2ciKSBvcgorCWRpZSAidW5hYmxlIHRvIHdyaXRlIHRvICRkbWVzZyI7CisKKyAgICByZWJvb3RfdG87CisKKyAgICBteSAkc3VjY2Vzc19zdGFydDsKKyAgICBteSAkZmFpbHVyZV9zdGFydDsKKworICAgIGZvciAoOzspIHsKKworCWlmICgkYm9vdGVkKSB7CisJICAgICRsaW5lID0gd2FpdF9mb3JfaW5wdXQoJG1vbml0b3JfZnAsICRib290ZWRfdGltZW91dCk7CisJfSBlbHNlIHsKKwkgICAgJGxpbmUgPSB3YWl0X2Zvcl9pbnB1dCgkbW9uaXRvcl9mcCk7CisJfQorCisJbGFzdCBpZiAoIWRlZmluZWQoJGxpbmUpKTsKKworCWRvcHJpbnQgJGxpbmU7CisJcHJpbnQgRE1FU0cgJGxpbmU7CisKKwkjIHdlIGFyZSBub3QgZ3VhcmFudGVlZCB0byBnZXQgYSBmdWxsIGxpbmUKKwkkZnVsbF9saW5lIC49ICRsaW5lOworCisJaWYgKCRmdWxsX2xpbmUgPX4gLyRzdWNjZXNzX2xpbmUvKSB7CisJICAgICRib290ZWQgPSAxOworCSAgICAkc3VjY2Vzc19zdGFydCA9IHRpbWU7CisJfQorCisJaWYgKCRib290ZWQgJiYgZGVmaW5lZCgkc3RvcF9hZnRlcl9zdWNjZXNzKSAmJgorCSAgICAkc3RvcF9hZnRlcl9zdWNjZXNzID49IDApIHsKKwkgICAgbXkgJG5vdyA9IHRpbWU7CisJICAgIGlmICgkbm93IC0gJHN1Y2Nlc3Nfc3RhcnQgPj0gJHN0b3BfYWZ0ZXJfc3VjY2VzcykgeworCQlkb3ByaW50ICJUZXN0IGZvcmNlZCB0byBzdG9wIGFmdGVyICRzdG9wX2FmdGVyX3N1Y2Nlc3Mgc2Vjb25kcyBhZnRlciBzdWNjZXNzXG4iOworCQlsYXN0OworCSAgICB9CisJfQorCisJaWYgKCRmdWxsX2xpbmUgPX4gL1xbIGJhY2t0cmFjZSB0ZXN0aW5nIFxdLykgeworCSAgICAkc2tpcF9jYWxsX3RyYWNlID0gMTsKKwl9CisKKwlpZiAoJGZ1bGxfbGluZSA9fiAvY2FsbCB0cmFjZTovaSkgeworCSAgICBpZiAoISRza2lwX2NhbGxfdHJhY2UpIHsKKwkJJGJ1ZyA9IDE7CisJCSRmYWlsdXJlX3N0YXJ0ID0gdGltZTsKKwkgICAgfQorCX0KKworCWlmICgkYnVnICYmIGRlZmluZWQoJHN0b3BfYWZ0ZXJfZmFpbHVyZSkgJiYKKwkgICAgJHN0b3BfYWZ0ZXJfZmFpbHVyZSA+PSAwKSB7CisJICAgIG15ICRub3cgPSB0aW1lOworCSAgICBpZiAoJG5vdyAtICRmYWlsdXJlX3N0YXJ0ID49ICRzdG9wX2FmdGVyX2ZhaWx1cmUpIHsKKwkJZG9wcmludCAiVGVzdCBmb3JjZWQgdG8gc3RvcCBhZnRlciAkc3RvcF9hZnRlcl9mYWlsdXJlIHNlY29uZHMgYWZ0ZXIgZmFpbHVyZVxuIjsKKwkJbGFzdDsKKwkgICAgfQorCX0KKworCWlmICgkZnVsbF9saW5lID1+IC9cWyBlbmQgb2YgYmFja3RyYWNlIHRlc3RpbmcgXF0vKSB7CisJICAgICRza2lwX2NhbGxfdHJhY2UgPSAwOworCX0KKworCWlmICgkZnVsbF9saW5lID1+IC9LZXJuZWwgcGFuaWMgLS8pIHsKKwkgICAgJGJ1ZyA9IDE7CisJfQorCisJaWYgKCRsaW5lID1+IC9cbi8pIHsKKwkgICAgJGZ1bGxfbGluZSA9ICIiOworCX0KKyAgICB9CisKKyAgICBjbG9zZShETUVTRyk7CisKKyAgICBpZiAoJGJ1ZykgeworCXJldHVybiAwIGlmICgkaW5fYmlzZWN0KTsKKwlmYWlsICJmYWlsZWQgLSBnb3QgYSBidWcgcmVwb3J0IiBhbmQgcmV0dXJuIDA7CisgICAgfQorCisgICAgaWYgKCEkYm9vdGVkKSB7CisJcmV0dXJuIDAgaWYgKCRpbl9iaXNlY3QpOworCWZhaWwgImZhaWxlZCAtIG5ldmVyIGdvdCBhIGJvb3QgcHJvbXB0LiIgYW5kIHJldHVybiAwOworICAgIH0KKworICAgIHJldHVybiAxOworfQorCitzdWIgaW5zdGFsbCB7CisKKyAgICBydW5fc2NwICIkb3V0cHV0ZGlyLyRidWlsZF90YXJnZXQiLCAiJHRhcmdldF9pbWFnZSIgb3IKKwlkb2RpZSAiZmFpbGVkIHRvIGNvcHkgaW1hZ2UiOworCisgICAgbXkgJGluc3RhbGxfbW9kcyA9IDA7CisKKyAgICAjIHNob3VsZCB3ZSBwcm9jZXNzIG1vZHVsZXM/CisgICAgJGluc3RhbGxfbW9kcyA9IDA7CisgICAgb3BlbihJTiwgIiRvdXRwdXRfY29uZmlnIikgb3IgZG9kaWUoIkNhbid0IHJlYWQgY29uZmlnIGZpbGUiKTsKKyAgICB3aGlsZSAoPElOPikgeworCWlmICgvQ09ORklHX01PRFVMRVMoPXkpPy8pIHsKKwkgICAgJGluc3RhbGxfbW9kcyA9IDEgaWYgKGRlZmluZWQoJDEpKTsKKwkgICAgbGFzdDsKKwl9CisgICAgfQorICAgIGNsb3NlKElOKTsKKworICAgIGlmICghJGluc3RhbGxfbW9kcykgeworCWRvcHJpbnQgIk5vIG1vZHVsZXMgbmVlZGVkXG4iOworCXJldHVybjsKKyAgICB9CisKKyAgICBydW5fY29tbWFuZCAiJG1ha2UgSU5TVEFMTF9NT0RfUEFUSD0kdG1wZGlyIG1vZHVsZXNfaW5zdGFsbCIgb3IKKwlkb2RpZSAiRmFpbGVkIHRvIGluc3RhbGwgbW9kdWxlcyI7CisKKyAgICBteSAkbW9kbGliID0gIi9saWIvbW9kdWxlcy8kdmVyc2lvbiI7CisgICAgbXkgJG1vZHRhciA9ICJrdGVzdC1tb2RzLnRhci5iejIiOworCisgICAgcnVuX3NzaCAicm0gLXJmICRtb2RsaWIiIG9yCisJZG9kaWUgImZhaWxlZCB0byByZW1vdmUgb2xkIG1vZHM6ICRtb2RsaWIiOworCisgICAgIyB3b3VsZCBiZSBuaWNlIGlmIHNjcCAtciBkaWQgbm90IGZvbGxvdyBzeW1ib2xpYyBsaW5rcworICAgIHJ1bl9jb21tYW5kICJjZCAkdG1wZGlyICYmIHRhciAtY2pmICRtb2R0YXIgbGliL21vZHVsZXMvJHZlcnNpb24iIG9yCisJZG9kaWUgIm1ha2luZyB0YXJiYWxsIjsKKworICAgIHJ1bl9zY3AgIiR0bXBkaXIvJG1vZHRhciIsICIvdG1wIiBvcgorCWRvZGllICJmYWlsZWQgdG8gY29weSBtb2R1bGVzIjsKKworICAgIHVubGluayAiJHRtcGRpci8kbW9kdGFyIjsKKworICAgIHJ1bl9zc2ggIicoY2QgLyAmJiB0YXIgeGYgL3RtcC8kbW9kdGFyKSciIG9yCisJZG9kaWUgImZhaWxlZCB0byB0YXIgbW9kdWxlcyI7CisKKyAgICBydW5fc3NoICJybSAtZiAvdG1wLyRtb2R0YXIiOworCisgICAgcmV0dXJuIGlmICghZGVmaW5lZCgkcG9zdF9pbnN0YWxsKSk7CisKKyAgICBteSAkY3BfcG9zdF9pbnN0YWxsID0gJHBvc3RfaW5zdGFsbDsKKyAgICAkY3BfcG9zdF9pbnN0YWxsID0gcy9cJEtFUk5FTF9WRVJTSU9OLyR2ZXJzaW9uL2c7CisgICAgcnVuX2NvbW1hbmQgIiRjcF9wb3N0X2luc3RhbGwiIG9yCisJZG9kaWUgIkZhaWxlZCB0byBydW4gcG9zdCBpbnN0YWxsIjsKK30KKworc3ViIGNoZWNrX2J1aWxkbG9nIHsKKyAgICBteSAoJHBhdGNoKSA9IEBfOworCisgICAgbXkgQGZpbGVzID0gYGdpdCBzaG93ICRwYXRjaCB8IGRpZmZzdGF0IC1sYDsKKworICAgIG9wZW4oSU4sICJnaXQgc2hvdyAkcGF0Y2ggfCIpIG9yCisJZG9kaWUgImZhaWxlZCB0byBzaG93ICRwYXRjaCI7CisgICAgd2hpbGUgKDxJTj4pIHsKKwlpZiAobSxeLS0tIGEvKC4qKSwpIHsKKwkgICAgY2hvbXAgJDE7CisJICAgICRmaWxlc1skI2ZpbGVzXSA9ICQxOworCX0KKyAgICB9CisgICAgY2xvc2UoSU4pOworCisgICAgb3BlbihJTiwgJGJ1aWxkbG9nKSBvciBkb2RpZSAiQ2FuJ3Qgb3BlbiAkYnVpbGRsb2ciOworICAgIHdoaWxlICg8SU4+KSB7CisJaWYgKC9eXHMqKC4qPyk6Liood2FybmluZ3xlcnJvcikvKSB7CisJICAgIG15ICRlcnIgPSAkMTsKKwkgICAgZm9yZWFjaCBteSAkZmlsZSAoQGZpbGVzKSB7CisJCW15ICRmdWxscGF0aCA9ICIkYnVpbGRkaXIvJGZpbGUiOworCQlpZiAoJGZpbGUgZXEgJGVyciB8fCAkZnVsbHBhdGggZXEgJGVycikgeworCQkgICAgZmFpbCAiJGZpbGUgYnVpbHQgd2l0aCB3YXJuaW5ncyIgYW5kIHJldHVybiAwOworCQl9CisJICAgIH0KKwl9CisgICAgfQorICAgIGNsb3NlKElOKTsKKworICAgIHJldHVybiAxOworfQorCitzdWIgYnVpbGQgeworICAgIG15ICgkdHlwZSkgPSBAXzsKKyAgICBteSAkZGVmY29uZmlnID0gIiI7CisKKyAgICB1bmxpbmsgJGJ1aWxkbG9nOworCisgICAgaWYgKCR0eXBlID1+IC9edXNlY29uZmlnOiguKikvKSB7CisJcnVuX2NvbW1hbmQgImNwICQxICRvdXRwdXRfY29uZmlnIiBvcgorCSAgICBkb2RpZSAiY291bGQgbm90IGNvcHkgJDEgdG8gLmNvbmZpZyI7CisKKwkkdHlwZSA9ICJvbGRjb25maWciOworICAgIH0KKworICAgICMgb2xkIGNvbmZpZyBjYW4gYXNrIHF1ZXN0aW9ucworICAgIGlmICgkdHlwZSBlcSAib2xkY29uZmlnIikgeworCSR0eXBlID0gIm9sZG5vY29uZmlnIjsKKworCSMgYWxsb3cgZm9yIGVtcHR5IGNvbmZpZ3MKKwlydW5fY29tbWFuZCAidG91Y2ggJG91dHB1dF9jb25maWciOworCisJcnVuX2NvbW1hbmQgIm12ICRvdXRwdXRfY29uZmlnICRvdXRwdXRkaXIvY29uZmlnX3RlbXAiIG9yCisJICAgIGRvZGllICJtb3ZpbmcgLmNvbmZpZyI7CisKKwlpZiAoISRub2NsZWFuICYmICFydW5fY29tbWFuZCAiJG1ha2UgbXJwcm9wZXIiKSB7CisJICAgIGRvZGllICJtYWtlIG1ycHJvcGVyIjsKKwl9CisKKwlydW5fY29tbWFuZCAibXYgJG91dHB1dGRpci9jb25maWdfdGVtcCAkb3V0cHV0X2NvbmZpZyIgb3IKKwkgICAgZG9kaWUgIm1vdmluZyBjb25maWdfdGVtcCI7CisKKyAgICB9IGVsc2lmICghJG5vY2xlYW4pIHsKKwl1bmxpbmsgIiRvdXRwdXRfY29uZmlnIjsKKwlydW5fY29tbWFuZCAiJG1ha2UgbXJwcm9wZXIiIG9yCisJICAgIGRvZGllICJtYWtlIG1ycHJvcGVyIjsKKyAgICB9CisKKyAgICAjIGFkZCBzb21ldGhpbmcgdG8gZGlzdGluZ3Vpc2ggdGhpcyBidWlsZAorICAgIG9wZW4oT1VULCAiPiAkb3V0cHV0ZGlyL2xvY2FsdmVyc2lvbiIpIG9yIGRvZGllKCJDYW4ndCBtYWtlIGxvY2FsdmVyc2lvbiBmaWxlIik7CisgICAgcHJpbnQgT1VUICIkbG9jYWx2ZXJzaW9uXG4iOworICAgIGNsb3NlKE9VVCk7CisKKyAgICBpZiAoZGVmaW5lZCgkbWluY29uZmlnKSkgeworCSRkZWZjb25maWcgPSAiS0NPTkZJR19BTExDT05GSUc9JG1pbmNvbmZpZyI7CisgICAgfQorCisgICAgcnVuX2NvbW1hbmQgIiRkZWZjb25maWcgJG1ha2UgJHR5cGUiIG9yCisJZG9kaWUgImZhaWxlZCBtYWtlIGNvbmZpZyI7CisKKyAgICAkcmVkaXJlY3QgPSAiJGJ1aWxkbG9nIjsKKyAgICBpZiAoIXJ1bl9jb21tYW5kICIkbWFrZSAkYnVpbGRfb3B0aW9ucyIpIHsKKwl1bmRlZiAkcmVkaXJlY3Q7CisJIyBiaXNlY3QgbWF5IG5lZWQgdGhpcyB0byBwYXNzCisJcmV0dXJuIDAgaWYgKCRpbl9iaXNlY3QpOworCWZhaWwgImZhaWxlZCBidWlsZCIgYW5kIHJldHVybiAwOworICAgIH0KKyAgICB1bmRlZiAkcmVkaXJlY3Q7CisKKyAgICByZXR1cm4gMTsKK30KKworc3ViIGhhbHQgeworICAgIGlmICghcnVuX3NzaCAiaGFsdCIgb3IgZGVmaW5lZCgkcG93ZXJfb2ZmKSkgeworCWlmIChkZWZpbmVkKCRwb3dlcm9mZl9hZnRlcl9oYWx0KSkgeworCSAgICBzbGVlcCAkcG93ZXJvZmZfYWZ0ZXJfaGFsdDsKKwkgICAgcnVuX2NvbW1hbmQgIiRwb3dlcl9vZmYiOworCX0KKyAgICB9IGVsc2UgeworCSMgbm9wZT8gdGhlIHphcCBpdCEKKwlydW5fY29tbWFuZCAiJHBvd2VyX29mZiI7CisgICAgfQorfQorCitzdWIgc3VjY2VzcyB7CisgICAgbXkgKCRpKSA9IEBfOworCisgICAgJHN1Y2Nlc3NlcysrOworCisgICAgZG9wcmludCAiXG5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiI7CisgICAgZG9wcmludCAgICAgIioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiI7CisgICAgZG9wcmludCAgICAgIktURVNUIFJFU1VMVDogVEVTVCAkaSBTVUNDRVNTISEhISAgICAgICAgICoqXG4iOworICAgIGRvcHJpbnQgICAgICIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4iOworICAgIGRvcHJpbnQgICAgICIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4iOworCisgICAgaWYgKCRpICE9ICRvcHR7Ik5VTV9URVNUUyJ9ICYmICFkb19ub3RfcmVib290KSB7CisJZG9wcmludCAiUmVib290IGFuZCB3YWl0ICRzbGVlcF90aW1lIHNlY29uZHNcbiI7CisJcmVib290OworCXN0YXJ0X21vbml0b3I7CisJd2FpdF9mb3JfbW9uaXRvciAkc2xlZXBfdGltZTsKKwllbmRfbW9uaXRvcjsKKyAgICB9Cit9CisKK3N1YiBnZXRfdmVyc2lvbiB7CisgICAgIyBnZXQgdGhlIHJlbGVhc2UgbmFtZQorICAgIGRvcHJpbnQgIiRtYWtlIGtlcm5lbHJlbGVhc2UgLi4uICI7CisgICAgJHZlcnNpb24gPSBgJG1ha2Uga2VybmVscmVsZWFzZSB8IHRhaWwgLTFgOworICAgIGNob21wKCR2ZXJzaW9uKTsKKyAgICBkb3ByaW50ICIkdmVyc2lvblxuIjsKK30KKworc3ViIGNoaWxkX3J1bl90ZXN0IHsKKyAgICBteSAkZmFpbGVkID0gMDsKKworICAgICMgY2hpbGQgc2hvdWxkIGhhdmUgbm8gcG93ZXIKKyAgICAkcmVib290X29uX2Vycm9yID0gMDsKKyAgICAkcG93ZXJvZmZfb25fZXJyb3IgPSAwOworICAgICRkaWVfb25fZmFpbHVyZSA9IDE7CisKKyAgICBydW5fY29tbWFuZCAkcnVuX3Rlc3Qgb3IgJGZhaWxlZCA9IDE7CisgICAgZXhpdCAkZmFpbGVkOworfQorCitteSAkY2hpbGRfZG9uZTsKKworc3ViIGNoaWxkX2ZpbmlzaGVkIHsKKyAgICAkY2hpbGRfZG9uZSA9IDE7Cit9CisKK3N1YiBkb19ydW5fdGVzdCB7CisgICAgbXkgJGNoaWxkX3BpZDsKKyAgICBteSAkY2hpbGRfZXhpdDsKKyAgICBteSAkbGluZTsKKyAgICBteSAkZnVsbF9saW5lOworICAgIG15ICRidWcgPSAwOworCisgICAgd2FpdF9mb3JfbW9uaXRvciAxOworCisgICAgZG9wcmludCAicnVuIHRlc3QgJHJ1bl90ZXN0XG4iOworCisgICAgJGNoaWxkX2RvbmUgPSAwOworCisgICAgJFNJR3tDSExEfSA9IHF3KGNoaWxkX2ZpbmlzaGVkKTsKKworICAgICRjaGlsZF9waWQgPSBmb3JrOworCisgICAgY2hpbGRfcnVuX3Rlc3QgaWYgKCEkY2hpbGRfcGlkKTsKKworICAgICRmdWxsX2xpbmUgPSAiIjsKKworICAgIGRvIHsKKwkkbGluZSA9IHdhaXRfZm9yX2lucHV0KCRtb25pdG9yX2ZwLCAxKTsKKwlpZiAoZGVmaW5lZCgkbGluZSkpIHsKKworCSAgICAjIHdlIGFyZSBub3QgZ3VhcmFudGVlZCB0byBnZXQgYSBmdWxsIGxpbmUKKwkgICAgJGZ1bGxfbGluZSAuPSAkbGluZTsKKworCSAgICBpZiAoJGZ1bGxfbGluZSA9fiAvY2FsbCB0cmFjZTovaSkgeworCQkkYnVnID0gMTsKKwkgICAgfQorCisJICAgIGlmICgkZnVsbF9saW5lID1+IC9LZXJuZWwgcGFuaWMgLS8pIHsKKwkJJGJ1ZyA9IDE7CisJICAgIH0KKworCSAgICBpZiAoJGxpbmUgPX4gL1xuLykgeworCQkkZnVsbF9saW5lID0gIiI7CisJICAgIH0KKwl9CisgICAgfSB3aGlsZSAoISRjaGlsZF9kb25lICYmICEkYnVnKTsKKworICAgIGlmICgkYnVnKSB7CisJZG9wcmludCAiRGV0ZWN0ZWQga2VybmVsIGNyYXNoIVxuIjsKKwkjIGtpbGwgdGhlIGNoaWxkIHdpdGggZXh0cmVtZSBwcmVqdWRpY2UKKwlraWxsIDksICRjaGlsZF9waWQ7CisgICAgfQorCisgICAgd2FpdHBpZCAkY2hpbGRfcGlkLCAwOworICAgICRjaGlsZF9leGl0ID0gJD87CisKKyAgICBpZiAoJGJ1ZyB8fCAkY2hpbGRfZXhpdCkgeworCXJldHVybiAwIGlmICRpbl9iaXNlY3Q7CisJZmFpbCAidGVzdCBmYWlsZWQiIGFuZCByZXR1cm4gMDsKKyAgICB9CisgICAgcmV0dXJuIDE7Cit9CisKK3N1YiBydW5fZ2l0X2Jpc2VjdCB7CisgICAgbXkgKCRjb21tYW5kKSA9IEBfOworCisgICAgZG9wcmludCAiJGNvbW1hbmQgLi4uICI7CisKKyAgICBteSAkb3V0cHV0ID0gYCRjb21tYW5kIDI+JjFgOworICAgIG15ICRyZXQgPSAkPzsKKworICAgIGxvZ2l0ICRvdXRwdXQ7CisKKyAgICBpZiAoJHJldCkgeworCWRvcHJpbnQgIkZBSUxFRFxuIjsKKwlkb2RpZSAiRmFpbGVkIHRvIGdpdCBiaXNlY3QiOworICAgIH0KKworICAgIGRvcHJpbnQgIlNVQ0NFU1NcbiI7CisgICAgaWYgKCRvdXRwdXQgPX4gbS9eKEJpc2VjdGluZzogLipcKHJvdWdobHkgXGQrIHN0ZXBzP1wpKVxzK1xbKFtbOnhkaWdpdDpdXSspXF0vKSB7CisJZG9wcmludCAiJDEgWyQyXVxuIjsKKyAgICB9IGVsc2lmICgkb3V0cHV0ID1+IG0vXihbWzp4ZGlnaXQ6XV0rKSBpcyB0aGUgZmlyc3QgYmFkIGNvbW1pdC8pIHsKKwkkYmlzZWN0X2JhZCA9ICQxOworCWRvcHJpbnQgIkZvdW5kIGJhZCBjb21taXQuLi4gJDFcbiI7CisJcmV0dXJuIDA7CisgICAgfSBlbHNlIHsKKwkjIHdlIGFscmVhZHkgbG9nZ2VkIGl0LCBqdXN0IHByaW50IGl0IG5vdy4KKwlwcmludCAkb3V0cHV0OworICAgIH0KKworICAgIHJldHVybiAxOworfQorCisjIHJldHVybnMgMSBvbiBzdWNjZXNzLCAwIG9uIGZhaWx1cmUKK3N1YiBydW5fYmlzZWN0X3Rlc3QgeworICAgIG15ICgkdHlwZSwgJGJ1aWxkdHlwZSkgPSBAXzsKKworICAgIG15ICRmYWlsZWQgPSAwOworICAgIG15ICRyZXN1bHQ7CisgICAgbXkgJG91dHB1dDsKKyAgICBteSAkcmV0OworCisgICAgJGluX2Jpc2VjdCA9IDE7CisKKyAgICBidWlsZCAkYnVpbGR0eXBlIG9yICRmYWlsZWQgPSAxOworCisgICAgaWYgKCR0eXBlIG5lICJidWlsZCIpIHsKKwlkb2RpZSAiRmFpbGVkIG9uIGJ1aWxkIiBpZiAkZmFpbGVkOworCisJIyBOb3cgYm9vdCB0aGUgYm94CisJZ2V0X2dydWJfaW5kZXg7CisJZ2V0X3ZlcnNpb247CisJaW5zdGFsbDsKKworCXN0YXJ0X21vbml0b3I7CisJbW9uaXRvciBvciAkZmFpbGVkID0gMTsKKworCWlmICgkdHlwZSBuZSAiYm9vdCIpIHsKKwkgICAgZG9kaWUgIkZhaWxlZCBvbiBib290IiBpZiAkZmFpbGVkOworCisJICAgIGRvX3J1bl90ZXN0IG9yICRmYWlsZWQgPSAxOworCX0KKwllbmRfbW9uaXRvcjsKKyAgICB9CisKKyAgICBpZiAoJGZhaWxlZCkgeworCSRyZXN1bHQgPSAwOworCisJIyByZWJvb3QgdGhlIGJveCB0byBhIGdvb2Qga2VybmVsCisJaWYgKCR0eXBlIG5lICJidWlsZCIpIHsKKwkgICAgZG9wcmludCAiUmVib290IGFuZCBzbGVlcCAkYmlzZWN0X3NsZWVwX3RpbWUgc2Vjb25kc1xuIjsKKwkgICAgcmVib290OworCSAgICBzdGFydF9tb25pdG9yOworCSAgICB3YWl0X2Zvcl9tb25pdG9yICRiaXNlY3Rfc2xlZXBfdGltZTsKKwkgICAgZW5kX21vbml0b3I7CisJfQorICAgIH0gZWxzZSB7CisJJHJlc3VsdCA9IDE7CisgICAgfQorICAgICRpbl9iaXNlY3QgPSAwOworCisgICAgcmV0dXJuICRyZXN1bHQ7Cit9CisKK3N1YiBydW5fYmlzZWN0IHsKKyAgICBteSAoJHR5cGUpID0gQF87CisgICAgbXkgJGJ1aWxkdHlwZSA9ICJvbGRjb25maWciOworCisgICAgIyBXZSBzaG91bGQgaGF2ZSBhIG1pbmNvbmZpZyB0byB1c2U/CisgICAgaWYgKGRlZmluZWQoJG1pbmNvbmZpZykpIHsKKwkkYnVpbGR0eXBlID0gInVzZWNvbmZpZzokbWluY29uZmlnIjsKKyAgICB9CisKKyAgICBteSAkcmV0ID0gcnVuX2Jpc2VjdF90ZXN0ICR0eXBlLCAkYnVpbGR0eXBlOworCisKKyAgICAjIEFyZSB3ZSBsb29raW5nIGZvciB3aGVyZSBpdCB3b3JrZWQsIG5vdCBmYWlsZWQ/CisgICAgaWYgKCRyZXZlcnNlX2Jpc2VjdCkgeworCSRyZXQgPSAhJHJldDsKKyAgICB9CisKKyAgICBpZiAoJHJldCkgeworCXJldHVybiAiZ29vZCI7CisgICAgfSBlbHNlIHsKKwlyZXR1cm4gICJiYWQiOworICAgIH0KK30KKworc3ViIGJpc2VjdCB7CisgICAgbXkgKCRpKSA9IEBfOworCisgICAgbXkgJHJlc3VsdDsKKworICAgIGRpZSAiQklTRUNUX0dPT0RbJGldIG5vdCBkZWZpbmVkXG4iCWlmICghZGVmaW5lZCgkb3B0eyJCSVNFQ1RfR09PRFskaV0ifSkpOworICAgIGRpZSAiQklTRUNUX0JBRFskaV0gbm90IGRlZmluZWRcbiIJaWYgKCFkZWZpbmVkKCRvcHR7IkJJU0VDVF9CQURbJGldIn0pKTsKKyAgICBkaWUgIkJJU0VDVF9UWVBFWyRpXSBub3QgZGVmaW5lZFxuIglpZiAoIWRlZmluZWQoJG9wdHsiQklTRUNUX1RZUEVbJGldIn0pKTsKKworICAgIG15ICRnb29kID0gJG9wdHsiQklTRUNUX0dPT0RbJGldIn07CisgICAgbXkgJGJhZCA9ICRvcHR7IkJJU0VDVF9CQURbJGldIn07CisgICAgbXkgJHR5cGUgPSAkb3B0eyJCSVNFQ1RfVFlQRVskaV0ifTsKKyAgICBteSAkc3RhcnQgPSAkb3B0eyJCSVNFQ1RfU1RBUlRbJGldIn07CisgICAgbXkgJHJlcGxheSA9ICRvcHR7IkJJU0VDVF9SRVBMQVlbJGldIn07CisKKyAgICAjIGNvbnZlcnQgdG8gdHJ1ZSBzaGExJ3MKKyAgICAkZ29vZCA9IGdldF9zaGExKCRnb29kKTsKKyAgICAkYmFkID0gZ2V0X3NoYTEoJGJhZCk7CisKKyAgICBpZiAoZGVmaW5lZCgkb3B0eyJCSVNFQ1RfUkVWRVJTRVskaV0ifSkgJiYKKwkkb3B0eyJCSVNFQ1RfUkVWRVJTRVskaV0ifSA9PSAxKSB7CisJZG9wcmludCAiUGVyZm9ybWluZyBhIHJldmVyc2UgYmlzZWN0IChiYWQgaXMgZ29vZCwgZ29vZCBpcyBiYWQhKVxuIjsKKwkkcmV2ZXJzZV9iaXNlY3QgPSAxOworICAgIH0gZWxzZSB7CisJJHJldmVyc2VfYmlzZWN0ID0gMDsKKyAgICB9CisKKyAgICAjIENhbid0IGhhdmUgYSB0ZXN0IHdpdGhvdXQgaGF2aW5nIGEgdGVzdCB0byBydW4KKyAgICBpZiAoJHR5cGUgZXEgInRlc3QiICYmICFkZWZpbmVkKCRydW5fdGVzdCkpIHsKKwkkdHlwZSA9ICJib290IjsKKyAgICB9CisKKyAgICBteSAkY2hlY2sgPSAkb3B0eyJCSVNFQ1RfQ0hFQ0tbJGldIn07CisgICAgaWYgKGRlZmluZWQoJGNoZWNrKSAmJiAkY2hlY2sgbmUgIjAiKSB7CisKKwkjIGdldCBjdXJyZW50IEhFQUQKKwlteSAkaGVhZCA9IGdldF9zaGExKCJIRUFEIik7CisKKwlpZiAoJGNoZWNrIG5lICJnb29kIikgeworCSAgICBkb3ByaW50ICJURVNUSU5HIEJJU0VDVCBCQUQgWyRiYWRdXG4iOworCSAgICBydW5fY29tbWFuZCAiZ2l0IGNoZWNrb3V0ICRiYWQiIG9yCisJCWRpZSAiRmFpbGVkIHRvIGNoZWNrb3V0ICRiYWQiOworCisJICAgICRyZXN1bHQgPSBydW5fYmlzZWN0ICR0eXBlOworCisJICAgIGlmICgkcmVzdWx0IG5lICJiYWQiKSB7CisJCWZhaWwgIlRlc3RlZCBCSVNFQ1RfQkFEIFskYmFkXSBhbmQgaXQgc3VjY2VlZGVkIiBhbmQgcmV0dXJuIDA7CisJICAgIH0KKwl9CisKKwlpZiAoJGNoZWNrIG5lICJiYWQiKSB7CisJICAgIGRvcHJpbnQgIlRFU1RJTkcgQklTRUNUIEdPT0QgWyRnb29kXVxuIjsKKwkgICAgcnVuX2NvbW1hbmQgImdpdCBjaGVja291dCAkZ29vZCIgb3IKKwkJZGllICJGYWlsZWQgdG8gY2hlY2tvdXQgJGdvb2QiOworCisJICAgICRyZXN1bHQgPSBydW5fYmlzZWN0ICR0eXBlOworCisJICAgIGlmICgkcmVzdWx0IG5lICJnb29kIikgeworCQlmYWlsICJUZXN0ZWQgQklTRUNUX0dPT0QgWyRnb29kXSBhbmQgaXQgZmFpbGVkIiBhbmQgcmV0dXJuIDA7CisJICAgIH0KKwl9CisKKwkjIGNoZWNrb3V0IHdoZXJlIHdlIHN0YXJ0ZWQKKwlydW5fY29tbWFuZCAiZ2l0IGNoZWNrb3V0ICRoZWFkIiBvcgorCSAgICBkaWUgIkZhaWxlZCB0byBjaGVja291dCAkaGVhZCI7CisgICAgfQorCisgICAgcnVuX2NvbW1hbmQgImdpdCBiaXNlY3Qgc3RhcnQiIG9yCisJZG9kaWUgImNvdWxkIG5vdCBzdGFydCBiaXNlY3QiOworCisgICAgcnVuX2NvbW1hbmQgImdpdCBiaXNlY3QgZ29vZCAkZ29vZCIgb3IKKwlkb2RpZSAiY291bGQgbm90IHNldCBiaXNlY3QgZ29vZCB0byAkZ29vZCI7CisKKyAgICBydW5fZ2l0X2Jpc2VjdCAiZ2l0IGJpc2VjdCBiYWQgJGJhZCIgb3IKKwlkb2RpZSAiY291bGQgbm90IHNldCBiaXNlY3QgYmFkIHRvICRiYWQiOworCisgICAgaWYgKGRlZmluZWQoJHJlcGxheSkpIHsKKwlydW5fY29tbWFuZCAiZ2l0IGJpc2VjdCByZXBsYXkgJHJlcGxheSIgb3IKKwkgICAgZG9kaWUgImZhaWxlZCB0byBydW4gcmVwbGF5IjsKKyAgICB9CisKKyAgICBpZiAoZGVmaW5lZCgkc3RhcnQpKSB7CisJcnVuX2NvbW1hbmQgImdpdCBjaGVja291dCAkc3RhcnQiIG9yCisJICAgIGRvZGllICJmYWlsZWQgdG8gY2hlY2tvdXQgJHN0YXJ0IjsKKyAgICB9CisKKyAgICBteSAkdGVzdDsKKyAgICBkbyB7CisJJHJlc3VsdCA9IHJ1bl9iaXNlY3QgJHR5cGU7CisJJHRlc3QgPSBydW5fZ2l0X2Jpc2VjdCAiZ2l0IGJpc2VjdCAkcmVzdWx0IjsKKyAgICB9IHdoaWxlICgkdGVzdCk7CisKKyAgICBydW5fY29tbWFuZCAiZ2l0IGJpc2VjdCBsb2ciIG9yCisJZG9kaWUgImNvdWxkIG5vdCBjYXB0dXJlIGdpdCBiaXNlY3QgbG9nIjsKKworICAgIHJ1bl9jb21tYW5kICJnaXQgYmlzZWN0IHJlc2V0IiBvcgorCWRvZGllICJjb3VsZCBub3QgcmVzZXQgZ2l0IGJpc2VjdCI7CisKKyAgICBkb3ByaW50ICJCYWQgY29tbWl0IHdhcyBbJGJpc2VjdF9iYWRdXG4iOworCisgICAgc3VjY2VzcyAkaTsKK30KKworbXkgJWNvbmZpZ19pZ25vcmU7CitteSAlY29uZmlnX3NldDsKKworbXkgJWNvbmZpZ19saXN0OworbXkgJW51bGxfY29uZmlnOworCitteSAlZGVwZW5kZW5jeTsKKworc3ViIHByb2Nlc3NfY29uZmlnX2lnbm9yZSB7CisgICAgbXkgKCRjb25maWcpID0gQF87CisKKyAgICBvcGVuIChJTiwgJGNvbmZpZykKKwlvciBkb2RpZSAiRmFpbGVkIHRvIHJlYWQgJGNvbmZpZyI7CisKKyAgICB3aGlsZSAoPElOPikgeworCWlmICgvXiguKj8oQ09ORklHXFMqKSg9Lip8IGlzIG5vdCBzZXQpKS8pIHsKKwkgICAgJGNvbmZpZ19pZ25vcmV7JDJ9ID0gJDE7CisJfQorICAgIH0KKworICAgIGNsb3NlKElOKTsKK30KKworc3ViIHJlYWRfY3VycmVudF9jb25maWcgeworICAgIG15ICgkY29uZmlnX3JlZikgPSBAXzsKKworICAgICV7JGNvbmZpZ19yZWZ9ID0gKCk7CisgICAgdW5kZWYgJXskY29uZmlnX3JlZn07CisKKyAgICBteSBAa2V5ID0ga2V5cyAleyRjb25maWdfcmVmfTsKKyAgICBpZiAoJCNrZXkgPj0gMCkgeworCXByaW50ICJkaWQgbm90IGRlbGV0ZSFcbiI7CisJZXhpdDsKKyAgICB9CisgICAgb3BlbiAoSU4sICIkb3V0cHV0X2NvbmZpZyIpOworCisgICAgd2hpbGUgKDxJTj4pIHsKKwlpZiAoL14oQ09ORklHXFMrKT0oLiopLykgeworCSAgICAkeyRjb25maWdfcmVmfXskMX0gPSAkMjsKKwl9CisgICAgfQorICAgIGNsb3NlKElOKTsKK30KKworc3ViIGdldF9kZXBlbmRlbmNpZXMgeworICAgIG15ICgkY29uZmlnKSA9IEBfOworCisgICAgbXkgJGFyciA9ICRkZXBlbmRlbmN5eyRjb25maWd9OworICAgIGlmICghZGVmaW5lZCgkYXJyKSkgeworCXJldHVybiAoKTsKKyAgICB9CisKKyAgICBteSBAZGVwcyA9IEB7JGFycn07CisKKyAgICBmb3JlYWNoIG15ICRkZXAgKEB7JGFycn0pIHsKKwlwcmludCAiQUREIERFUCAkZGVwXG4iOworCUBkZXBzID0gKEBkZXBzLCBnZXRfZGVwZW5kZW5jaWVzICRkZXApOworICAgIH0KKworICAgIHJldHVybiBAZGVwczsKK30KKworc3ViIGNyZWF0ZV9jb25maWcgeworICAgIG15IEBjb25maWdzID0gQF87CisKKyAgICBvcGVuKE9VVCwgIj4kb3V0cHV0X2NvbmZpZyIpIG9yIGRvZGllICJDYW4gbm90IHdyaXRlIHRvICRvdXRwdXRfY29uZmlnIjsKKworICAgIGZvcmVhY2ggbXkgJGNvbmZpZyAoQGNvbmZpZ3MpIHsKKwlwcmludCBPVVQgIiRjb25maWdfc2V0eyRjb25maWd9XG4iOworCW15IEBkZXBzID0gZ2V0X2RlcGVuZGVuY2llcyAkY29uZmlnOworCWZvcmVhY2ggbXkgJGRlcCAoQGRlcHMpIHsKKwkgICAgcHJpbnQgT1VUICIkY29uZmlnX3NldHskZGVwfVxuIjsKKwl9CisgICAgfQorCisgICAgZm9yZWFjaCBteSAkY29uZmlnIChrZXlzICVjb25maWdfaWdub3JlKSB7CisJcHJpbnQgT1VUICIkY29uZmlnX2lnbm9yZXskY29uZmlnfVxuIjsKKyAgICB9CisgICAgY2xvc2UoT1VUKTsKKworIyAgICBleGl0OworICAgIHJ1bl9jb21tYW5kICIkbWFrZSBvbGRub2NvbmZpZyIgb3IKKwlkb2RpZSAiZmFpbGVkIG1ha2UgY29uZmlnIG9sZGNvbmZpZyI7CisKK30KKworc3ViIGNvbXBhcmVfY29uZmlncyB7CisgICAgbXkgKCVhLCAlYikgPSBAXzsKKworICAgIGZvcmVhY2ggbXkgJGl0ZW0gKGtleXMgJWEpIHsKKwlpZiAoIWRlZmluZWQoJGJ7JGl0ZW19KSkgeworCSAgICBwcmludCAiZGlmZiAkaXRlbVxuIjsKKwkgICAgcmV0dXJuIDE7CisJfQorCWRlbGV0ZSAkYnskaXRlbX07CisgICAgfQorCisgICAgbXkgQGtleXMgPSBrZXlzICViOworICAgIGlmICgkI2tleXMpIHsKKwlwcmludCAiZGlmZjIgJGtleXNbMF1cbiI7CisgICAgfQorICAgIHJldHVybiAtMSBpZiAoJCNrZXlzID49IDApOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N1YiBydW5fY29uZmlnX2Jpc2VjdF90ZXN0IHsKKyAgICBteSAoJHR5cGUpID0gQF87CisKKyAgICByZXR1cm4gcnVuX2Jpc2VjdF90ZXN0ICR0eXBlLCAib2xkY29uZmlnIjsKK30KKworc3ViIHByb2Nlc3NfcGFzc2VkIHsKKyAgICBteSAoJWNvbmZpZ3MpID0gQF87CisKKyAgICBkb3ByaW50ICJUaGVzZSBjb25maWdzIGhhZCBubyBmYWlsdXJlOiAoRW5hYmxpbmcgdGhlbSBmb3IgZnVydGhlciBjb21waWxlcylcbiI7CisgICAgIyBQYXNzZWQhIEFsbCB0aGVzZSBjb25maWdzIGFyZSBwYXJ0IG9mIGEgZ29vZCBjb21waWxlLgorICAgICMgQWRkIHRoZW0gdG8gdGhlIG1pbiBvcHRpb25zLgorICAgIGZvcmVhY2ggbXkgJGNvbmZpZyAoa2V5cyAlY29uZmlncykgeworCWlmIChkZWZpbmVkKCRjb25maWdfbGlzdHskY29uZmlnfSkpIHsKKwkgICAgZG9wcmludCAiIHJlbW92aW5nICRjb25maWdcbiI7CisJICAgICRjb25maWdfaWdub3JleyRjb25maWd9ID0gJGNvbmZpZ19saXN0eyRjb25maWd9OworCSAgICBkZWxldGUgJGNvbmZpZ19saXN0eyRjb25maWd9OworCX0KKyAgICB9CisgICAgZG9wcmludCAiY29uZmlnIGNvcGllZCB0byAkb3V0cHV0ZGlyL2NvbmZpZ19nb29kXG4iOworICAgIHJ1bl9jb21tYW5kICJjcCAtZiAkb3V0cHV0X2NvbmZpZyAkb3V0cHV0ZGlyL2NvbmZpZ19nb29kIjsKK30KKworc3ViIHByb2Nlc3NfZmFpbGVkIHsKKyAgICBteSAoJGNvbmZpZykgPSBAXzsKKworICAgIGRvcHJpbnQgIlxuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiI7CisgICAgZG9wcmludCAiRm91bmQgYmFkIGNvbmZpZzogJGNvbmZpZ1xuIjsKKyAgICBkb3ByaW50ICIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcblxuIjsKK30KKworc3ViIHJ1bl9jb25maWdfYmlzZWN0IHsKKworICAgIG15IEBzdGFydF9saXN0ID0ga2V5cyAlY29uZmlnX2xpc3Q7CisKKyAgICBpZiAoJCNzdGFydF9saXN0IDwgMCkgeworCWRvcHJpbnQgIk5vIG1vcmUgY29uZmlncyB0byB0ZXN0ISEhXG4iOworCXJldHVybiAtMTsKKyAgICB9CisKKyAgICBkb3ByaW50ICIqKioqKiBSVU4gVEVTVCAqKipcbiI7CisgICAgbXkgJHR5cGUgPSAkb3B0eyJDT05GSUdfQklTRUNUX1RZUEVbJGl0ZXJhdGlvbl0ifTsKKyAgICBteSAkcmV0OworICAgIG15ICVjdXJyZW50X2NvbmZpZzsKKworICAgIG15ICRjb3VudCA9ICQjc3RhcnRfbGlzdCArIDE7CisgICAgZG9wcmludCAiICAkY291bnQgY29uZmlncyB0byB0ZXN0XG4iOworCisgICAgbXkgJGhhbGYgPSBpbnQoJCNzdGFydF9saXN0IC8gMik7CisKKyAgICBkbyB7CisJbXkgQHRvcGhhbGYgPSBAc3RhcnRfbGlzdFswIC4uICRoYWxmXTsKKworCWNyZWF0ZV9jb25maWcgQHRvcGhhbGY7CisJcmVhZF9jdXJyZW50X2NvbmZpZyBcJWN1cnJlbnRfY29uZmlnOworCisJJGNvdW50ID0gJCN0b3BoYWxmICsgMTsKKwlkb3ByaW50ICJUZXN0aW5nICRjb3VudCBjb25maWdzXG4iOworCW15ICRmb3VuZCA9IDA7CisJIyBtYWtlIHN1cmUgd2UgdGVzdCBzb21ldGhpbmcKKwlmb3JlYWNoIG15ICRjb25maWcgKEB0b3BoYWxmKSB7CisJICAgIGlmIChkZWZpbmVkKCRjdXJyZW50X2NvbmZpZ3skY29uZmlnfSkpIHsKKwkJbG9naXQgIiAkY29uZmlnXG4iOworCQkkZm91bmQgPSAxOworCSAgICB9CisJfQorCWlmICghJGZvdW5kKSB7CisJICAgICMgdHJ5IHRoZSBvdGhlciBoYWxmCisJICAgIGRvcHJpbnQgIlRvcCBoYWxmIHByb2R1Y2VkIG5vIHNldCBjb25maWdzLCB0cnlpbmcgYm90dG9tIGhhbGZcbiI7CisJICAgIEB0b3BoYWxmID0gQHN0YXJ0X2xpc3RbJGhhbGYgLi4gJCNzdGFydF9saXN0XTsKKwkgICAgY3JlYXRlX2NvbmZpZyBAdG9waGFsZjsKKwkgICAgcmVhZF9jdXJyZW50X2NvbmZpZyBcJWN1cnJlbnRfY29uZmlnOworCSAgICBmb3JlYWNoIG15ICRjb25maWcgKEB0b3BoYWxmKSB7CisJCWlmIChkZWZpbmVkKCRjdXJyZW50X2NvbmZpZ3skY29uZmlnfSkpIHsKKwkJICAgIGxvZ2l0ICIgJGNvbmZpZ1xuIjsKKwkJICAgICRmb3VuZCA9IDE7CisJCX0KKwkgICAgfQorCSAgICBpZiAoISRmb3VuZCkgeworCQlkb3ByaW50ICJGYWlsZWQ6IENhbid0IG1ha2UgbmV3IGNvbmZpZyB3aXRoIGN1cnJlbnQgY29uZmlnc1xuIjsKKwkJZm9yZWFjaCBteSAkY29uZmlnIChAc3RhcnRfbGlzdCkgeworCQkgICAgZG9wcmludCAiICBDT05GSUc6ICRjb25maWdcbiI7CisJCX0KKwkJcmV0dXJuIC0xOworCSAgICB9CisJICAgICRjb3VudCA9ICQjdG9waGFsZiArIDE7CisJICAgIGRvcHJpbnQgIlRlc3RpbmcgJGNvdW50IGNvbmZpZ3NcbiI7CisJfQorCisJJHJldCA9IHJ1bl9jb25maWdfYmlzZWN0X3Rlc3QgJHR5cGU7CisKKwlpZiAoJHJldCkgeworCSAgICBwcm9jZXNzX3Bhc3NlZCAlY3VycmVudF9jb25maWc7CisJICAgIHJldHVybiAwOworCX0KKworCWRvcHJpbnQgIlRoaXMgY29uZmlnIGhhZCBhIGZhaWx1cmUuXG4iOworCWRvcHJpbnQgIlJlbW92aW5nIHRoZXNlIGNvbmZpZ3MgdGhhdCB3ZXJlIG5vdCBzZXQgaW4gdGhpcyBjb25maWc6XG4iOworCWRvcHJpbnQgImNvbmZpZyBjb3BpZWQgdG8gJG91dHB1dGRpci9jb25maWdfYmFkXG4iOworCXJ1bl9jb21tYW5kICJjcCAtZiAkb3V0cHV0X2NvbmZpZyAkb3V0cHV0ZGlyL2NvbmZpZ19iYWQiOworCisJIyBBIGNvbmZpZyBleGlzdHMgaW4gdGhpcyBncm91cCB0aGF0IHdhcyBiYWQuCisJZm9yZWFjaCBteSAkY29uZmlnIChrZXlzICVjb25maWdfbGlzdCkgeworCSAgICBpZiAoIWRlZmluZWQoJGN1cnJlbnRfY29uZmlneyRjb25maWd9KSkgeworCQlkb3ByaW50ICIgcmVtb3ZpbmcgJGNvbmZpZ1xuIjsKKwkJZGVsZXRlICRjb25maWdfbGlzdHskY29uZmlnfTsKKwkgICAgfQorCX0KKworCUBzdGFydF9saXN0ID0gQHRvcGhhbGY7CisKKwlpZiAoJCNzdGFydF9saXN0ID09IDApIHsKKwkgICAgcHJvY2Vzc19mYWlsZWQgJHN0YXJ0X2xpc3RbMF07CisJICAgIHJldHVybiAxOworCX0KKworCSMgcmVtb3ZlIGhhbGYgdGhlIGNvbmZpZ3Mgd2UgYXJlIGxvb2tpbmcgYXQgYW5kIHNlZSBpZgorCSMgdGhleSBhcmUgZ29vZC4KKwkkaGFsZiA9IGludCgkI3N0YXJ0X2xpc3QgLyAyKTsKKyAgICB9IHdoaWxlICgkaGFsZiA+IDApOworCisgICAgIyB3ZSBmb3VuZCBhIHNpbmdsZSBjb25maWcsIHRyeSBpdCBhZ2FpbgorICAgIG15IEB0b3BoYWxmID0gQHN0YXJ0X2xpc3RbMCAuLiAwXTsKKworICAgICRyZXQgPSBydW5fY29uZmlnX2Jpc2VjdF90ZXN0ICR0eXBlOworICAgIGlmICgkcmV0KSB7CisJcHJvY2Vzc19wYXNzZWQgJWN1cnJlbnRfY29uZmlnOworCXJldHVybiAwOworICAgIH0KKworICAgIHByb2Nlc3NfZmFpbGVkICRzdGFydF9saXN0WzBdOworICAgIHJldHVybiAxOworfQorCitzdWIgY29uZmlnX2Jpc2VjdCB7CisgICAgbXkgKCRpKSA9IEBfOworCisgICAgbXkgJHN0YXJ0X2NvbmZpZyA9ICRvcHR7IkNPTkZJR19CSVNFQ1RbJGldIn07CisKKyAgICBteSAkdG1wY29uZmlnID0gIiR0bXBkaXIvdXNlX2NvbmZpZyI7CisKKyAgICAjIE1ha2UgdGhlIGZpbGUgd2l0aCB0aGUgYmFkIGNvbmZpZyBhbmQgdGhlIG1pbiBjb25maWcKKyAgICBpZiAoZGVmaW5lZCgkbWluY29uZmlnKSkgeworCSMgcmVhZCB0aGUgbWluIGNvbmZpZyBmb3IgdGhpbmdzIHRvIGlnbm9yZQorCXJ1bl9jb21tYW5kICJjcCAkbWluY29uZmlnICR0bXBjb25maWciIG9yCisJICAgIGRvZGllICJmYWlsZWQgdG8gY29weSAkbWluY29uZmlnIHRvICR0bXBjb25maWciOworICAgIH0gZWxzZSB7CisJdW5saW5rICR0bXBjb25maWc7CisgICAgfQorCisgICAgIyBBZGQgb3RoZXIgY29uZmlncworICAgIGlmIChkZWZpbmVkKCRhZGRjb25maWcpKSB7CisJcnVuX2NvbW1hbmQgImNhdCAkYWRkY29uZmlnID4+ICR0bXBjb25maWciIG9yCisJICAgIGRvZGllICJmYWlsZWQgdG8gYXBwZW5kICRhZGRjb25maWciOworICAgIH0KKworICAgIG15ICRkZWZjb25maWcgPSAiIjsKKyAgICBpZiAoLWYgJHRtcGNvbmZpZykgeworCSRkZWZjb25maWcgPSAiS0NPTkZJR19BTExDT05GSUc9JHRtcGNvbmZpZyI7CisJcHJvY2Vzc19jb25maWdfaWdub3JlICR0bXBjb25maWc7CisgICAgfQorCisgICAgIyBub3cgcHJvY2VzcyB0aGUgc3RhcnQgY29uZmlnCisgICAgcnVuX2NvbW1hbmQgImNwICRzdGFydF9jb25maWcgJG91dHB1dF9jb25maWciIG9yCisJZG9kaWUgImZhaWxlZCB0byBjb3B5ICRzdGFydF9jb25maWcgdG8gJG91dHB1dF9jb25maWciOworCisgICAgIyByZWFkIGRpcmVjdGx5IHdoYXQgd2Ugd2FudCB0byBjaGVjaworICAgIG15ICVjb25maWdfY2hlY2s7CisgICAgb3BlbiAoSU4sICRvdXRwdXRfY29uZmlnKQorCW9yIGRvZGllICJmYWllZCB0byBvcGVuICRvdXRwdXRfY29uZmlnIjsKKworICAgIHdoaWxlICg8SU4+KSB7CisJaWYgKC9eKChDT05GSUdcUyopPS4qKS8pIHsKKwkgICAgJGNvbmZpZ19jaGVja3skMn0gPSAkMTsKKwl9CisgICAgfQorICAgIGNsb3NlKElOKTsKKworICAgICMgTm93IHJ1biBvbGRjb25maWcgd2l0aCB0aGUgbWluY29uZmlnIChhbmQgYWRkY29uZmlncykKKyAgICBydW5fY29tbWFuZCAiJGRlZmNvbmZpZyAkbWFrZSBvbGRub2NvbmZpZyIgb3IKKwlkb2RpZSAiZmFpbGVkIG1ha2UgY29uZmlnIG9sZGNvbmZpZyI7CisKKyAgICAjIGNoZWNrIHRvIHNlZSB3aGF0IHdlIGxvc3QgKG9yIGdhaW5lZCkKKyAgICBvcGVuIChJTiwgJG91dHB1dF9jb25maWcpCisJb3IgZG9kaWUgIkZhaWxlZCB0byByZWFkICRzdGFydF9jb25maWciOworCisgICAgbXkgJXJlbW92ZWRfY29uZmlnczsKKyAgICBteSAlYWRkZWRfY29uZmlnczsKKworICAgIHdoaWxlICg8SU4+KSB7CisJaWYgKC9eKChDT05GSUdcUyopPS4qKS8pIHsKKwkgICAgIyBzYXZlIG9mZiBhbGwgb3B0aW9ucworCSAgICAkY29uZmlnX3NldHskMn0gPSAkMTsKKwkgICAgaWYgKGRlZmluZWQoJGNvbmZpZ19jaGVja3skMn0pKSB7CisJCWlmIChkZWZpbmVkKCRjb25maWdfaWdub3JleyQyfSkpIHsKKwkJICAgICRyZW1vdmVkX2NvbmZpZ3N7JDJ9ID0gJDE7CisJCX0gZWxzZSB7CisJCSAgICAkY29uZmlnX2xpc3R7JDJ9ID0gJDE7CisJCX0KKwkgICAgfSBlbHNpZiAoIWRlZmluZWQoJGNvbmZpZ19pZ25vcmV7JDJ9KSkgeworCQkkYWRkZWRfY29uZmlnc3skMn0gPSAkMTsKKwkJJGNvbmZpZ19saXN0eyQyfSA9ICQxOworCSAgICB9CisJfQorICAgIH0KKyAgICBjbG9zZShJTik7CisKKyAgICBteSBAY29uZnMgPSBrZXlzICVyZW1vdmVkX2NvbmZpZ3M7CisgICAgaWYgKCQjY29uZnMgPj0gMCkgeworCWRvcHJpbnQgIkNvbmZpZ3Mgb3ZlcnJpZGRlbiBieSBkZWZhdWx0IGNvbmZpZ3MgYW5kIHJlbW92ZWQgZnJvbSBjaGVjazpcbiI7CisJZm9yZWFjaCBteSAkY29uZmlnIChAY29uZnMpIHsKKwkgICAgZG9wcmludCAiICRjb25maWdcbiI7CisJfQorICAgIH0KKyAgICBAY29uZnMgPSBrZXlzICVhZGRlZF9jb25maWdzOworICAgIGlmICgkI2NvbmZzID49IDApIHsKKwlkb3ByaW50ICJDb25maWdzIGFwcGVhcmluZyBpbiBtYWtlIG9sZGNvbmZpZyBhbmQgYWRkZWQ6XG4iOworCWZvcmVhY2ggbXkgJGNvbmZpZyAoQGNvbmZzKSB7CisJICAgIGRvcHJpbnQgIiAkY29uZmlnXG4iOworCX0KKyAgICB9CisKKyAgICBteSAlY29uZmlnX3Rlc3Q7CisgICAgbXkgJG9uY2UgPSAwOworCisgICAgIyBTb21ldGltZXMga2NvbmZpZyBkb2VzIHdlaXJkIHRoaW5ncy4gV2UgbXVzdCBtYWtlIHN1cmUKKyAgICAjIHRoYXQgdGhlIGNvbmZpZyB3ZSBhdXRvY3JlYXRlIGhhcyBldmVyeXRoaW5nIHdlIG5lZWQKKyAgICAjIHRvIHRlc3QsIG90aGVyd2lzZSB3ZSBtYXkgbWlzcyB0ZXN0aW5nIGNvbmZpZ3MsIG9yCisgICAgIyBtYXkgbm90IGJlIGFibGUgdG8gY3JlYXRlIGEgbmV3IGNvbmZpZy4KKyAgICAjIEhlcmUgd2UgY3JlYXRlIGEgY29uZmlnIHdpdGggZXZlcnl0aGluZyBzZXQuCisgICAgY3JlYXRlX2NvbmZpZyAoa2V5cyAlY29uZmlnX2xpc3QpOworICAgIHJlYWRfY3VycmVudF9jb25maWcgXCVjb25maWdfdGVzdDsKKyAgICBmb3JlYWNoIG15ICRjb25maWcgKGtleXMgJWNvbmZpZ19saXN0KSB7CisJaWYgKCFkZWZpbmVkKCRjb25maWdfdGVzdHskY29uZmlnfSkpIHsKKwkgICAgaWYgKCEkb25jZSkgeworCQkkb25jZSA9IDE7CisJCWRvcHJpbnQgIkNvbmZpZ3Mgbm90IHByb2R1Y2VkIGJ5IGtjb25maWcgKHdpbGwgbm90IGJlIGNoZWNrZWQpOlxuIjsKKwkgICAgfQorCSAgICBkb3ByaW50ICIgICRjb25maWdcbiI7CisJICAgIGRlbGV0ZSAkY29uZmlnX2xpc3R7JGNvbmZpZ307CisJfQorICAgIH0KKyAgICBteSAkcmV0OworICAgIGRvIHsKKwkkcmV0ID0gcnVuX2NvbmZpZ19iaXNlY3Q7CisgICAgfSB3aGlsZSAoISRyZXQpOworCisgICAgcmV0dXJuICRyZXQgaWYgKCRyZXQgPCAwKTsKKworICAgIHN1Y2Nlc3MgJGk7Cit9CisKK3N1YiBwYXRjaGNoZWNrIHsKKyAgICBteSAoJGkpID0gQF87CisKKyAgICBkaWUgIlBBVENIQ0hFQ0tfU1RBUlRbJGldIG5vdCBkZWZpbmVkXG4iCisJaWYgKCFkZWZpbmVkKCRvcHR7IlBBVENIQ0hFQ0tfU1RBUlRbJGldIn0pKTsKKyAgICBkaWUgIlBBVENIQ0hFQ0tfVFlQRVskaV0gbm90IGRlZmluZWRcbiIKKwlpZiAoIWRlZmluZWQoJG9wdHsiUEFUQ0hDSEVDS19UWVBFWyRpXSJ9KSk7CisKKyAgICBteSAkc3RhcnQgPSAkb3B0eyJQQVRDSENIRUNLX1NUQVJUWyRpXSJ9OworCisgICAgbXkgJGVuZCA9ICJIRUFEIjsKKyAgICBpZiAoZGVmaW5lZCgkb3B0eyJQQVRDSENIRUNLX0VORFskaV0ifSkpIHsKKwkkZW5kID0gJG9wdHsiUEFUQ0hDSEVDS19FTkRbJGldIn07CisgICAgfQorCisgICAgIyBHZXQgdGhlIHRydWUgc2hhMSdzIHNpbmNlIHdlIGNhbiB1c2UgdGhpbmdzIGxpa2UgSEVBRH4zCisgICAgJHN0YXJ0ID0gZ2V0X3NoYTEoJHN0YXJ0KTsKKyAgICAkZW5kID0gZ2V0X3NoYTEoJGVuZCk7CisKKyAgICBteSAkdHlwZSA9ICRvcHR7IlBBVENIQ0hFQ0tfVFlQRVskaV0ifTsKKworICAgICMgQ2FuJ3QgaGF2ZSBhIHRlc3Qgd2l0aG91dCBoYXZpbmcgYSB0ZXN0IHRvIHJ1bgorICAgIGlmICgkdHlwZSBlcSAidGVzdCIgJiYgIWRlZmluZWQoJHJ1bl90ZXN0KSkgeworCSR0eXBlID0gImJvb3QiOworICAgIH0KKworICAgIG9wZW4gKElOLCAiZ2l0IGxvZyAtLXByZXR0eT1vbmVsaW5lICRlbmR8Iikgb3IKKwlkb2RpZSAiY291bGQgbm90IGdldCBnaXQgbGlzdCI7CisKKyAgICBteSBAbGlzdDsKKworICAgIHdoaWxlICg8SU4+KSB7CisJY2hvbXA7CisJJGxpc3RbJCNsaXN0KzFdID0gJF87CisJbGFzdCBpZiAoL14kc3RhcnQvKTsKKyAgICB9CisgICAgY2xvc2UoSU4pOworCisgICAgaWYgKCRsaXN0WyQjbGlzdF0gIX4gL14kc3RhcnQvKSB7CisJZmFpbCAiU0hBMSAkc3RhcnQgbm90IGZvdW5kIjsKKyAgICB9CisKKyAgICAjIGdvIGJhY2t3YXJkcyBpbiB0aGUgbGlzdAorICAgIEBsaXN0ID0gcmV2ZXJzZSBAbGlzdDsKKworICAgIG15ICRzYXZlX2NsZWFuID0gJG5vY2xlYW47CisKKyAgICAkaW5fcGF0Y2hjaGVjayA9IDE7CisgICAgZm9yZWFjaCBteSAkaXRlbSAoQGxpc3QpIHsKKwlteSAkc2hhMSA9ICRpdGVtOworCSRzaGExID1+IHMvXihbWzp4ZGlnaXQ6XV0rKS4qLyQxLzsKKworCWRvcHJpbnQgIlxuUHJvY2Vzc2luZyBjb21taXQgJGl0ZW1cblxuIjsKKworCXJ1bl9jb21tYW5kICJnaXQgY2hlY2tvdXQgJHNoYTEiIG9yCisJICAgIGRpZSAiRmFpbGVkIHRvIGNoZWNrb3V0ICRzaGExIjsKKworCSMgb25seSBjbGVhbiBvbiB0aGUgZmlyc3QgYW5kIGxhc3QgcGF0Y2gKKwlpZiAoJGl0ZW0gZXEgJGxpc3RbMF0gfHwKKwkgICAgJGl0ZW0gZXEgJGxpc3RbJCNsaXN0XSkgeworCSAgICAkbm9jbGVhbiA9ICRzYXZlX2NsZWFuOworCX0gZWxzZSB7CisJICAgICRub2NsZWFuID0gMTsKKwl9CisKKwlpZiAoZGVmaW5lZCgkbWluY29uZmlnKSkgeworCSAgICBidWlsZCAidXNlY29uZmlnOiRtaW5jb25maWciIG9yIHJldHVybiAwOworCX0gZWxzZSB7CisJICAgICMgPz8gbm8gY29uZmlnIHRvIHVzZT8KKwkgICAgYnVpbGQgIm9sZGNvbmZpZyIgb3IgcmV0dXJuIDA7CisJfQorCisJY2hlY2tfYnVpbGRsb2cgJHNoYTEgb3IgcmV0dXJuIDA7CisKKwluZXh0IGlmICgkdHlwZSBlcSAiYnVpbGQiKTsKKworCWdldF9ncnViX2luZGV4OworCWdldF92ZXJzaW9uOworCWluc3RhbGw7CisKKwlteSAkZmFpbGVkID0gMDsKKworCXN0YXJ0X21vbml0b3I7CisJbW9uaXRvciBvciAkZmFpbGVkID0gMTsKKworCWlmICghJGZhaWxlZCAmJiAkdHlwZSBuZSAiYm9vdCIpeworCSAgICBkb19ydW5fdGVzdCBvciAkZmFpbGVkID0gMTsKKwl9CisJZW5kX21vbml0b3I7CisJcmV0dXJuIDAgaWYgKCRmYWlsZWQpOworCisgICAgfQorICAgICRpbl9wYXRjaGNoZWNrID0gMDsKKyAgICBzdWNjZXNzICRpOworCisgICAgcmV0dXJuIDE7Cit9CisKKyQjQVJHViA8IDEgb3IgZGllICJrdGVzdC5wbCB2ZXJzaW9uOiAkVkVSU0lPTlxuICAgdXNhZ2U6IGt0ZXN0LnBsIGNvbmZpZy1maWxlXG4iOworCitpZiAoJCNBUkdWID09IDApIHsKKyAgICAka3Rlc3RfY29uZmlnID0gJEFSR1ZbMF07CisgICAgaWYgKCEgLWYgJGt0ZXN0X2NvbmZpZykgeworCXByaW50ICIka3Rlc3RfY29uZmlnIGRvZXMgbm90IGV4aXN0LlxuIjsKKwlteSAkYW5zOworICAgICAgICBmb3IgKDs7KSB7CisJICAgIHByaW50ICJDcmVhdGUgaXQ/IFtZL25dICI7CisJICAgICRhbnMgPSA8U1RESU4+OworCSAgICBjaG9tcCAkYW5zOworCSAgICBpZiAoJGFucyA9fiAvXlxzKiQvKSB7CisJCSRhbnMgPSAieSI7CisJICAgIH0KKwkgICAgbGFzdCBpZiAoJGFucyA9fiAvXnkkL2kgfHwgJGFucyA9fiAvXm4kL2kpOworCSAgICBwcmludCAiUGxlYXNlIGFuc3dlciBlaXRoZXIgJ3knIG9yICduJy5cbiI7CisJfQorCWlmICgkYW5zICF+IC9eeSQvaSkgeworCSAgICBleGl0IDA7CisJfQorICAgIH0KK30gZWxzZSB7CisgICAgJGt0ZXN0X2NvbmZpZyA9ICJrdGVzdC5jb25mIjsKK30KKworaWYgKCEgLWYgJGt0ZXN0X2NvbmZpZykgeworICAgIG9wZW4oT1VULCAiPiRrdGVzdF9jb25maWciKSBvciBkaWUgIkNhbiBub3QgY3JlYXRlICRrdGVzdF9jb25maWciOworICAgIHByaW50IE9VVCA8PCAiRU9GIgorIyBHZW5lcmF0ZWQgYnkga3Rlc3QucGwKKyMKKyMgRGVmaW5lIGVhY2ggdGVzdCB3aXRoIFRFU1RfU1RBUlQKKyMgVGhlIGNvbmZpZyBvcHRpb25zIGJlbG93IGl0IHdpbGwgb3ZlcnJpZGUgdGhlIGRlZmF1bHRzCitURVNUX1NUQVJUCisKK0RFRkFVTFRTCitFT0YKKzsKKyAgICBjbG9zZShPVVQpOworfQorcmVhZF9jb25maWcgJGt0ZXN0X2NvbmZpZzsKKworIyBBcHBlbmQgYW55IGNvbmZpZ3MgZW50ZXJlZCBpbiBtYW51YWxseSB0byB0aGUgY29uZmlnIGZpbGUuCitteSBAbmV3X2NvbmZpZ3MgPSBrZXlzICVlbnRlcmVkX2NvbmZpZ3M7CitpZiAoJCNuZXdfY29uZmlncyA+PSAwKSB7CisgICAgcHJpbnQgIlxuQXBwZW5kaW5nIGVudGVyZWQgaW4gY29uZmlncyB0byAka3Rlc3RfY29uZmlnXG4iOworICAgIG9wZW4oT1VULCAiPj4ka3Rlc3RfY29uZmlnIikgb3IgZGllICJDYW4gbm90IGFwcGVuZCB0byAka3Rlc3RfY29uZmlnIjsKKyAgICBmb3JlYWNoIG15ICRjb25maWcgKEBuZXdfY29uZmlncykgeworCXByaW50IE9VVCAiJGNvbmZpZyA9ICRlbnRlcmVkX2NvbmZpZ3N7JGNvbmZpZ31cbiI7CisJJG9wdHskY29uZmlnfSA9ICRlbnRlcmVkX2NvbmZpZ3N7JGNvbmZpZ307CisgICAgfQorfQorCitpZiAoJG9wdHsiQ0xFQVJfTE9HIn0gJiYgZGVmaW5lZCgkb3B0eyJMT0dfRklMRSJ9KSkgeworICAgIHVubGluayAkb3B0eyJMT0dfRklMRSJ9OworfQorCitkb3ByaW50ICJcblxuU1RBUlRJTkcgQVVUT01BVEVEIFRFU1RTXG5cbiI7CisKK2ZvciAobXkgJGkgPSAwLCBteSAkcmVwZWF0ID0gMTsgJGkgPD0gJG9wdHsiTlVNX1RFU1RTIn07ICRpICs9ICRyZXBlYXQpIHsKKworICAgIGlmICghJGkpIHsKKwlkb3ByaW50ICJERUZBVUxUIE9QVElPTlM6XG4iOworICAgIH0gZWxzZSB7CisJZG9wcmludCAiXG5URVNUICRpIE9QVElPTlMiOworCWlmIChkZWZpbmVkKCRyZXBlYXRfdGVzdHN7JGl9KSkgeworCSAgICAkcmVwZWF0ID0gJHJlcGVhdF90ZXN0c3skaX07CisJICAgIGRvcHJpbnQgIiBJVEVSQVRFICRyZXBlYXQiOworCX0KKwlkb3ByaW50ICJcbiI7CisgICAgfQorCisgICAgZm9yZWFjaCBteSAkb3B0aW9uIChzb3J0IGtleXMgJW9wdCkgeworCisJaWYgKCRvcHRpb24gPX4gL1xbKFxkKylcXSQvKSB7CisJICAgIG5leHQgaWYgKCRpICE9ICQxKTsKKwl9IGVsc2UgeworCSAgICBuZXh0IGlmICgkaSk7CisJfQorCisJZG9wcmludCAiJG9wdGlvbiA9ICRvcHR7JG9wdGlvbn1cbiI7CisgICAgfQorfQorCitzdWIgc2V0X3Rlc3Rfb3B0aW9uIHsKKyAgICBteSAoJG5hbWUsICRpKSA9IEBfOworCisgICAgbXkgJG9wdGlvbiA9ICIkbmFtZVxbJGlcXSI7CisKKyAgICBpZiAoZGVmaW5lZCgkb3B0eyRvcHRpb259KSkgeworCXJldHVybiAkb3B0eyRvcHRpb259OworICAgIH0KKworICAgIGZvcmVhY2ggbXkgJHRlc3QgKGtleXMgJXJlcGVhdF90ZXN0cykgeworCWlmICgkaSA+PSAkdGVzdCAmJgorCSAgICAkaSA8ICR0ZXN0ICsgJHJlcGVhdF90ZXN0c3skdGVzdH0pIHsKKwkgICAgJG9wdGlvbiA9ICIkbmFtZVxbJHRlc3RcXSI7CisJICAgIGlmIChkZWZpbmVkKCRvcHR7JG9wdGlvbn0pKSB7CisJCXJldHVybiAkb3B0eyRvcHRpb259OworCSAgICB9CisJfQorICAgIH0KKworICAgIGlmIChkZWZpbmVkKCRvcHR7JG5hbWV9KSkgeworCXJldHVybiAkb3B0eyRuYW1lfTsKKyAgICB9CisKKyAgICByZXR1cm4gdW5kZWY7Cit9CisKKyMgRmlyc3Qgd2UgbmVlZCB0byBkbyBpcyB0aGUgYnVpbGRzCitmb3IgKG15ICRpID0gMTsgJGkgPD0gJG9wdHsiTlVNX1RFU1RTIn07ICRpKyspIHsKKworICAgICRpdGVyYXRpb24gPSAkaTsKKworICAgIG15ICRtYWtlY21kID0gc2V0X3Rlc3Rfb3B0aW9uKCJNQUtFX0NNRCIsICRpKTsKKworICAgICRtYWNoaW5lID0gc2V0X3Rlc3Rfb3B0aW9uKCJNQUNISU5FIiwgJGkpOworICAgICRzc2hfdXNlciA9IHNldF90ZXN0X29wdGlvbigiU1NIX1VTRVIiLCAkaSk7CisgICAgJHRtcGRpciA9IHNldF90ZXN0X29wdGlvbigiVE1QX0RJUiIsICRpKTsKKyAgICAkb3V0cHV0ZGlyID0gc2V0X3Rlc3Rfb3B0aW9uKCJPVVRQVVRfRElSIiwgJGkpOworICAgICRidWlsZGRpciA9IHNldF90ZXN0X29wdGlvbigiQlVJTERfRElSIiwgJGkpOworICAgICR0ZXN0X3R5cGUgPSBzZXRfdGVzdF9vcHRpb24oIlRFU1RfVFlQRSIsICRpKTsKKyAgICAkYnVpbGRfdHlwZSA9IHNldF90ZXN0X29wdGlvbigiQlVJTERfVFlQRSIsICRpKTsKKyAgICAkYnVpbGRfb3B0aW9ucyA9IHNldF90ZXN0X29wdGlvbigiQlVJTERfT1BUSU9OUyIsICRpKTsKKyAgICAkcG93ZXJfY3ljbGUgPSBzZXRfdGVzdF9vcHRpb24oIlBPV0VSX0NZQ0xFIiwgJGkpOworICAgICRyZWJvb3QgPSBzZXRfdGVzdF9vcHRpb24oIlJFQk9PVCIsICRpKTsKKyAgICAkbm9jbGVhbiA9IHNldF90ZXN0X29wdGlvbigiQlVJTERfTk9DTEVBTiIsICRpKTsKKyAgICAkbWluY29uZmlnID0gc2V0X3Rlc3Rfb3B0aW9uKCJNSU5fQ09ORklHIiwgJGkpOworICAgICRydW5fdGVzdCA9IHNldF90ZXN0X29wdGlvbigiVEVTVCIsICRpKTsKKyAgICAkYWRkY29uZmlnID0gc2V0X3Rlc3Rfb3B0aW9uKCJBRERfQ09ORklHIiwgJGkpOworICAgICRyZWJvb3RfdHlwZSA9IHNldF90ZXN0X29wdGlvbigiUkVCT09UX1RZUEUiLCAkaSk7CisgICAgJGdydWJfbWVudSA9IHNldF90ZXN0X29wdGlvbigiR1JVQl9NRU5VIiwgJGkpOworICAgICRwb3N0X2luc3RhbGwgPSBzZXRfdGVzdF9vcHRpb24oIlBPU1RfSU5TVEFMTCIsICRpKTsKKyAgICAkcmVib290X3NjcmlwdCA9IHNldF90ZXN0X29wdGlvbigiUkVCT09UX1NDUklQVCIsICRpKTsKKyAgICAkcmVib290X29uX2Vycm9yID0gc2V0X3Rlc3Rfb3B0aW9uKCJSRUJPT1RfT05fRVJST1IiLCAkaSk7CisgICAgJHBvd2Vyb2ZmX29uX2Vycm9yID0gc2V0X3Rlc3Rfb3B0aW9uKCJQT1dFUk9GRl9PTl9FUlJPUiIsICRpKTsKKyAgICAkZGllX29uX2ZhaWx1cmUgPSBzZXRfdGVzdF9vcHRpb24oIkRJRV9PTl9GQUlMVVJFIiwgJGkpOworICAgICRwb3dlcl9vZmYgPSBzZXRfdGVzdF9vcHRpb24oIlBPV0VSX09GRiIsICRpKTsKKyAgICAkcG93ZXJjeWNsZV9hZnRlcl9yZWJvb3QgPSBzZXRfdGVzdF9vcHRpb24oIlBPV0VSQ1lDTEVfQUZURVJfUkVCT09UIiwgJGkpOworICAgICRwb3dlcm9mZl9hZnRlcl9oYWx0ID0gc2V0X3Rlc3Rfb3B0aW9uKCJQT1dFUk9GRl9BRlRFUl9IQUxUIiwgJGkpOworICAgICRzbGVlcF90aW1lID0gc2V0X3Rlc3Rfb3B0aW9uKCJTTEVFUF9USU1FIiwgJGkpOworICAgICRiaXNlY3Rfc2xlZXBfdGltZSA9IHNldF90ZXN0X29wdGlvbigiQklTRUNUX1NMRUVQX1RJTUUiLCAkaSk7CisgICAgJHN0b3JlX2ZhaWx1cmVzID0gc2V0X3Rlc3Rfb3B0aW9uKCJTVE9SRV9GQUlMVVJFUyIsICRpKTsKKyAgICAkdGltZW91dCA9IHNldF90ZXN0X29wdGlvbigiVElNRU9VVCIsICRpKTsKKyAgICAkYm9vdGVkX3RpbWVvdXQgPSBzZXRfdGVzdF9vcHRpb24oIkJPT1RFRF9USU1FT1VUIiwgJGkpOworICAgICRjb25zb2xlID0gc2V0X3Rlc3Rfb3B0aW9uKCJDT05TT0xFIiwgJGkpOworICAgICRzdWNjZXNzX2xpbmUgPSBzZXRfdGVzdF9vcHRpb24oIlNVQ0NFU1NfTElORSIsICRpKTsKKyAgICAkc3RvcF9hZnRlcl9zdWNjZXNzID0gc2V0X3Rlc3Rfb3B0aW9uKCJTVE9QX0FGVEVSX1NVQ0NFU1MiLCAkaSk7CisgICAgJHN0b3BfYWZ0ZXJfZmFpbHVyZSA9IHNldF90ZXN0X29wdGlvbigiU1RPUF9BRlRFUl9GQUlMVVJFIiwgJGkpOworICAgICRidWlsZF90YXJnZXQgPSBzZXRfdGVzdF9vcHRpb24oIkJVSUxEX1RBUkdFVCIsICRpKTsKKyAgICAkc3NoX2V4ZWMgPSBzZXRfdGVzdF9vcHRpb24oIlNTSF9FWEVDIiwgJGkpOworICAgICRzY3BfdG9fdGFyZ2V0ID0gc2V0X3Rlc3Rfb3B0aW9uKCJTQ1BfVE9fVEFSR0VUIiwgJGkpOworICAgICR0YXJnZXRfaW1hZ2UgPSBzZXRfdGVzdF9vcHRpb24oIlRBUkdFVF9JTUFHRSIsICRpKTsKKyAgICAkbG9jYWx2ZXJzaW9uID0gc2V0X3Rlc3Rfb3B0aW9uKCJMT0NBTFZFUlNJT04iLCAkaSk7CisKKyAgICBjaGRpciAkYnVpbGRkaXIgfHwgZGllICJjYW4ndCBjaGFuZ2UgZGlyZWN0b3J5IHRvICRidWlsZGRpciI7CisKKyAgICBpZiAoIS1kICR0bXBkaXIpIHsKKwlta3BhdGgoJHRtcGRpcikgb3IKKwkgICAgZGllICJjYW4ndCBjcmVhdGUgJHRtcGRpciI7CisgICAgfQorCisgICAgJEVOVnsiU1NIX1VTRVIifSA9ICRzc2hfdXNlcjsKKyAgICAkRU5WeyJNQUNISU5FIn0gPSAkbWFjaGluZTsKKworICAgICR0YXJnZXQgPSAiJHNzaF91c2VyXEAkbWFjaGluZSI7CisKKyAgICAkYnVpbGRsb2cgPSAiJHRtcGRpci9idWlsZGxvZy0kbWFjaGluZSI7CisgICAgJGRtZXNnID0gIiR0bXBkaXIvZG1lc2ctJG1hY2hpbmUiOworICAgICRtYWtlID0gIiRtYWtlY21kIE89JG91dHB1dGRpciI7CisgICAgJG91dHB1dF9jb25maWcgPSAiJG91dHB1dGRpci8uY29uZmlnIjsKKworICAgIGlmICgkcmVib290X3R5cGUgZXEgImdydWIiKSB7CisJZG9kaWUgIkdSVUJfTUVOVSBub3QgZGVmaW5lZCIgaWYgKCFkZWZpbmVkKCRncnViX21lbnUpKTsKKyAgICB9IGVsc2lmICghZGVmaW5lZCgkcmVib290X3NjcmlwdCkpIHsKKwlkb2RpZSAiUkVCT09UX1NDUklQVCBub3QgZGVmaW5lZCIKKyAgICB9CisKKyAgICBteSAkcnVuX3R5cGUgPSAkYnVpbGRfdHlwZTsKKyAgICBpZiAoJHRlc3RfdHlwZSBlcSAicGF0Y2hjaGVjayIpIHsKKwkkcnVuX3R5cGUgPSAkb3B0eyJQQVRDSENIRUNLX1RZUEVbJGldIn07CisgICAgfSBlbHNpZiAoJHRlc3RfdHlwZSBlcSAiYmlzZWN0IikgeworCSRydW5fdHlwZSA9ICRvcHR7IkJJU0VDVF9UWVBFWyRpXSJ9OworICAgIH0gZWxzaWYgKCR0ZXN0X3R5cGUgZXEgImNvbmZpZ19iaXNlY3QiKSB7CisJJHJ1bl90eXBlID0gJG9wdHsiQ09ORklHX0JJU0VDVF9UWVBFWyRpXSJ9OworICAgIH0KKworICAgICMgbWlzdGFrZSBpbiBjb25maWcgZmlsZT8KKyAgICBpZiAoIWRlZmluZWQoJHJ1bl90eXBlKSkgeworCSRydW5fdHlwZSA9ICJFUlJPUiI7CisgICAgfQorCisgICAgZG9wcmludCAiXG5cbiI7CisgICAgZG9wcmludCAiUlVOTklORyBURVNUICRpIG9mICRvcHR7TlVNX1RFU1RTfSB3aXRoIG9wdGlvbiAkdGVzdF90eXBlICRydW5fdHlwZVxuXG4iOworCisgICAgdW5saW5rICRkbWVzZzsKKyAgICB1bmxpbmsgJGJ1aWxkbG9nOworCisgICAgaWYgKCFkZWZpbmVkKCRtaW5jb25maWcpKSB7CisJJG1pbmNvbmZpZyA9ICRhZGRjb25maWc7CisKKyAgICB9IGVsc2lmIChkZWZpbmVkKCRhZGRjb25maWcpKSB7CisJcnVuX2NvbW1hbmQgImNhdCAkYWRkY29uZmlnICRtaW5jb25maWcgPiAkdG1wZGlyL2FkZF9jb25maWciIG9yCisJICAgIGRvZGllICJGYWlsZWQgdG8gY3JlYXRlIHRlbXAgY29uZmlnIjsKKwkkbWluY29uZmlnID0gIiR0bXBkaXIvYWRkX2NvbmZpZyI7CisgICAgfQorCisgICAgbXkgJGNoZWNrb3V0ID0gJG9wdHsiQ0hFQ0tPVVRbJGldIn07CisgICAgaWYgKGRlZmluZWQoJGNoZWNrb3V0KSkgeworCXJ1bl9jb21tYW5kICJnaXQgY2hlY2tvdXQgJGNoZWNrb3V0IiBvcgorCSAgICBkaWUgImZhaWxlZCB0byBjaGVja291dCAkY2hlY2tvdXQiOworICAgIH0KKworICAgIGlmICgkdGVzdF90eXBlIGVxICJiaXNlY3QiKSB7CisJYmlzZWN0ICRpOworCW5leHQ7CisgICAgfSBlbHNpZiAoJHRlc3RfdHlwZSBlcSAiY29uZmlnX2Jpc2VjdCIpIHsKKwljb25maWdfYmlzZWN0ICRpOworCW5leHQ7CisgICAgfSBlbHNpZiAoJHRlc3RfdHlwZSBlcSAicGF0Y2hjaGVjayIpIHsKKwlwYXRjaGNoZWNrICRpOworCW5leHQ7CisgICAgfQorCisgICAgaWYgKCRidWlsZF90eXBlIG5lICJub2J1aWxkIikgeworCWJ1aWxkICRidWlsZF90eXBlIG9yIG5leHQ7CisgICAgfQorCisgICAgaWYgKCR0ZXN0X3R5cGUgbmUgImJ1aWxkIikgeworCWdldF9ncnViX2luZGV4OworCWdldF92ZXJzaW9uOworCWluc3RhbGw7CisKKwlteSAkZmFpbGVkID0gMDsKKwlzdGFydF9tb25pdG9yOworCW1vbml0b3Igb3IgJGZhaWxlZCA9IDE7OworCisJaWYgKCEkZmFpbGVkICYmICR0ZXN0X3R5cGUgbmUgImJvb3QiICYmIGRlZmluZWQoJHJ1bl90ZXN0KSkgeworCSAgICBkb19ydW5fdGVzdCBvciAkZmFpbGVkID0gMTsKKwl9CisJZW5kX21vbml0b3I7CisJbmV4dCBpZiAoJGZhaWxlZCk7CisgICAgfQorCisgICAgc3VjY2VzcyAkaTsKK30KKworaWYgKCRvcHR7IlBPV0VST0ZGX09OX1NVQ0NFU1MifSkgeworICAgIGhhbHQ7Cit9IGVsc2lmICgkb3B0eyJSRUJPT1RfT05fU1VDQ0VTUyJ9ICYmICFkb19ub3RfcmVib290KSB7CisgICAgcmVib290OworfQorCitkb3ByaW50ICJcbiAgICAkc3VjY2Vzc2VzIG9mICRvcHR7TlVNX1RFU1RTfSB0ZXN0cyB3ZXJlIHN1Y2Nlc3NmdWxcblxuIjsKKworZXhpdCAwOwpkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9rdGVzdC9zYW1wbGUuY29uZiBiL3Rvb2xzL3Rlc3Rpbmcva3Rlc3Qvc2FtcGxlLmNvbmYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzQwOGM1OQotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL3Rlc3Rpbmcva3Rlc3Qvc2FtcGxlLmNvbmYKQEAgLTAsMCArMSw2MjIgQEAKKyMKKyMgQ29uZmlnIGZpbGUgZm9yIGt0ZXN0LnBsCisjCisjIE5vdGUsIGFsbCBwYXRocyBtdXN0IGJlIGFic29sdXRlCisjCisKKyMgT3B0aW9ucyBzZXQgaW4gdGhlIGJlZ2lubmluZyBvZiB0aGUgZmlsZSBhcmUgY29uc2lkZXJlZCB0byBiZQorIyBkZWZhdWx0IG9wdGlvbnMuIFRoZXNlIG9wdGlvbnMgY2FuIGJlIG92ZXJyaWRlbiBieSB0ZXN0IHNwZWNpZmljCisjIG9wdGlvbnMsIHdpdGggdGhlIGZvbGxvd2luZyBleGNlcHRpb25zOgorIworIyAgTE9HX0ZJTEUKKyMgIENMRUFSX0xPRworIyAgUE9XRVJPRkZfT05fU1VDQ0VTUworIyAgUkVCT09UX09OX1NVQ0NFU1MKKyMKKyMgVGVzdCBzcGVjaWZpYyBvcHRpb25zIGFyZSBzZXQgYWZ0ZXIgdGhlIGxhYmVsOgorIworIyBURVNUX1NUQVJUCisjCisjIFRoZSBvcHRpb25zIGFmdGVyIGEgVEVTVF9TVEFSVCBsYWJlbCBhcmUgc3BlY2lmaWMgdG8gdGhhdCB0ZXN0LgorIyBFYWNoIFRFU1RfU1RBUlQgbGFiZWwgd2lsbCBzZXQgdXAgYSBuZXcgdGVzdC4gSWYgeW91IHdhbnQgdG8KKyMgcGVyZm9ybSBhIHRlc3QgbW9yZSB0aGFuIG9uY2UsIHlvdSBjYW4gYWRkIHRoZSBJVEVSQVRFIGxhYmVsCisjIHRvIGl0IGZvbGxvd2VkIGJ5IHRoZSBudW1iZXIgb2YgdGltZXMgeW91IHdhbnQgdGhhdCB0ZXN0CisjIHRvIGl0ZXJhdGUuIElmIHRoZSBJVEVSQVRFIGlzIGxlZnQgb2ZmLCB0aGUgdGVzdCB3aWxsIG9ubHkKKyMgYmUgcGVyZm9ybWVkIG9uY2UuCisjCisjIFRFU1RfU1RBUlQgSVRFUkFURSAxMAorIworIyBZb3UgY2FuIHNraXAgYSB0ZXN0IGJ5IGFkZGluZyBTS0lQIChiZWZvcmUgb3IgYWZ0ZXIgdGhlIElURVJBVEUKKyMgYW5kIG51bWJlcikKKyMKKyMgVEVTVF9TVEFSVCBTS0lQCisjCisjIFRFU1RfU1RBUlQgU0tJUCBJVEVSQVRFIDEwCisjCisjIFRFU1RfU1RBUlQgSVRFUkFURSAxMCBTS0lQCisjCisjIFRoZSBTS0lQIGxhYmVsIGNhdXNlcyB0aGUgb3B0aW9ucyBhbmQgdGhlIHRlc3QgaXRzZWxmIHRvIGJlIGlnbm9yZWQuCisjIFRoaXMgaXMgdXNlZnVsIHRvIHNldCB1cCBzZXZlcmFsIGRpZmZlcmVudCB0ZXN0cyBpbiBvbmUgY29uZmlnIGZpbGUsIGFuZAorIyBvbmx5IGVuYWJsaW5nIHRoZSBvbmVzIHlvdSB3YW50IHRvIHVzZSBmb3IgYSBjdXJyZW50IHRlc3QgcnVuLgorIworIyBZb3UgY2FuIGFkZCBkZWZhdWx0IG9wdGlvbnMgYW55d2hlcmUgaW4gdGhlIGZpbGUgYXMgd2VsbAorIyB3aXRoIHRoZSBERUZBVUxUUyB0YWcuIFRoaXMgYWxsb3dzIHlvdSB0byBoYXZlIGRlZmF1bHQgb3B0aW9ucworIyBhZnRlciB0aGUgdGVzdCBvcHRpb25zIHRvIGtlZXAgdGhlIHRlc3Qgb3B0aW9ucyBhdCB0aGUgdG9wCisjIG9mIHRoZSBmaWxlLiBZb3UgY2FuIGV2ZW4gcGxhY2UgdGhlIERFRkFVTFRTIHRhZyBiZXR3ZWVuCisjIHRlc3QgY2FzZXMgKGJ1dCBub3QgaW4gdGhlIG1pZGRsZSBvZiBhIHNpbmdsZSB0ZXN0IGNhc2UpCisjCisjIFRFU1RfU1RBUlQKKyMgTUlOX0NPTkZJRyA9IC9ob21lL3Rlc3QvY29uZmlnLXRlc3QxCisjCisjIERFRkFVTFRTCisjIE1JTl9DT05GSUcgPSAvaG9tZS90ZXN0L2NvbmZpZy1kZWZhdWx0CisjCisjIFRFU1RfU1RBUlQgSVRFUkFURSAxMAorIworIyBUaGUgYWJvdmUgd2lsbCBydW4gdGhlIGZpcnN0IHRlc3Qgd2l0aCBNSU5fQ09ORklHIHNldCB0bworIyAvaG9tZS90ZXN0L2NvbmZpZy10ZXN0LTEuIFRoZW4gMTAgdGVzdHMgd2lsbCBiZSBleGVjdXRlZAorIyB3aXRoIE1JTl9DT05GSUcgd2l0aCAvaG9tZS90ZXN0L2NvbmZpZy1kZWZhdWx0LgorIworIyBZb3UgY2FuIGFsc28gZGlzYWJsZSBkZWZhdWx0cyB3aXRoIHRoZSBTS0lQIG9wdGlvbgorIworIyBERUZBVUxUUyBTS0lQCisjIE1JTl9DT05GSUcgPSAvaG9tZS90ZXN0L2NvbmZpZy11c2Utc29tZXRpbWVzCisjCisjIERFRkFVTFRTCisjIE1JTl9DT05GSUcgPSAvaG9tZS90ZXN0L2NvbmZpZy1tb3N0LXRpbWVzCisjCisjIFRoZSBhYm92ZSB3aWxsIGlnbm9yZSB0aGUgZmlyc3QgTUlOX0NPTkZJRy4gSWYgeW91IHdhbnQgdG8KKyMgdXNlIHRoZSBmaXJzdCBNSU5fQ09ORklHLCByZW1vdmUgdGhlIFNLSVAgZnJvbSB0aGUgZmlyc3QKKyMgREVGQVVMVFMgdGFnIGFuZCBhZGQgaXQgdG8gdGhlIHNlY29uZC4gQmUgY2FyZWZ1bCwgb3B0aW9ucworIyBtYXkgb25seSBiZSBkZWNsYXJlZCBvbmNlIHBlciB0ZXN0IG9yIGRlZmF1bHQuIElmIHlvdSBoYXZlCisjIHRoZSBzYW1lIG9wdGlvbiBuYW1lIHVuZGVyIHRoZSBzYW1lIHRlc3Qgb3IgYXMgZGVmYXVsdAorIyBrdGVzdCB3aWxsIGZhaWwgdG8gZXhlY3V0ZSwgYW5kIG5vIHRlc3RzIHdpbGwgcnVuLgorIworCisKKyMjIyMgTWFuZGF0b3J5IERlZmF1bHQgT3B0aW9ucyAjIyMjCisKKyMgVGhlc2Ugb3B0aW9ucyBtdXN0IGJlIGluIHRoZSBkZWZhdWx0IHNlY3Rpb24sIGFsdGhvdWdoIG1vc3QKKyMgbWF5IGJlIG92ZXJyaWRkZW4gYnkgdGVzdCBvcHRpb25zLgorCisjIFRoZSBtYWNoaW5lIGhvc3RuYW1lIHRoYXQgeW91IHdpbGwgdGVzdAorI01BQ0hJTkUgPSB0YXJnZXQKKworIyBUaGUgYm94IGlzIGV4cGVjdGVkIHRvIGhhdmUgc3NoIG9uIG5vcm1hbCBib290dXAsIHByb3ZpZGUgdGhlIHVzZXIKKyMgIChtb3N0IGxpa2VseSByb290LCBzaW5jZSB5b3UgbmVlZCBwcml2aWxlZ2VkIG9wZXJhdGlvbnMpCisjU1NIX1VTRVIgPSByb290CisKKyMgVGhlIGRpcmVjdG9yeSB0aGF0IGNvbnRhaW5zIHRoZSBMaW51eCBzb3VyY2UgY29kZQorI0JVSUxEX0RJUiA9IC9ob21lL3Rlc3QvbGludXguZ2l0CisKKyMgVGhlIGRpcmVjdG9yeSB0aGF0IHRoZSBvYmplY3RzIHdpbGwgYmUgYnVpbHQKKyMgKGNhbiBub3QgYmUgc2FtZSBhcyBCVUlMRF9ESVIpCisjT1VUUFVUX0RJUiA9IC9ob21lL3Rlc3QvYnVpbGQvdGFyZ2V0CisKKyMgVGhlIGxvY2F0aW9uIG9mIHRoZSBjb21waWxlZCBmaWxlIHRvIGNvcHkgdG8gdGhlIHRhcmdldAorIyAocmVsYXRpdmUgdG8gT1VUUFVUX0RJUikKKyNCVUlMRF9UQVJHRVQgPSBhcmNoL3g4Ni9ib290L2J6SW1hZ2UKKworIyBUaGUgcGxhY2UgdG8gcHV0IHlvdXIgaW1hZ2Ugb24gdGhlIHRlc3QgbWFjaGluZQorI1RBUkdFVF9JTUFHRSA9IC9ib290L3ZtbGludXotdGVzdAorCisjIEEgc2NyaXB0IG9yIGNvbW1hbmQgdG8gcmVib290IHRoZSBib3gKKyMKKyMgSGVyZSBpcyBhIGRpZ2l0YWwgbG9nZ2VycyBwb3dlciBzd2l0Y2ggZXhhbXBsZQorI1BPV0VSX0NZQ0xFID0gd2dldCAtLW5vLXByb3h5IC1PIC9kZXYvbnVsbCAtcSAgLS1hdXRoLW5vLWNoYWxsZW5nZSAnaHR0cDovL2FkbWluOmFkbWluQHBvd2VyL291dGxldD81PUNDTCcKKyMKKyMgSGVyZSBpcyBhbiBleGFtcGxlIHRvIHJlYm9vdCBhIHZpcnR1YWwgYm94IG9uIHRoZSBjdXJyZW50IGhvc3QKKyMgd2l0aCB0aGUgbmFtZSAiR3Vlc3QiLgorI1BPV0VSX0NZQ0xFID0gdmlyc2ggZGVzdHJveSBHdWVzdDsgc2xlZXAgNTsgdmlyc2ggc3RhcnQgR3Vlc3QKKworIyBUaGUgc2NyaXB0IG9yIGNvbW1hbmQgdGhhdCByZWFkcyB0aGUgY29uc29sZQorIworIyAgSWYgeW91IHVzZSB0dHl3YXRjaCBzZXJ2ZXIsIHNvbWV0aGluZyBsaWtlIHRoZSBmb2xsb3dpbmcgd291bGQgd29yay4KKyNDT05TT0xFID0gbmMgLWQgbG9jYWxob3N0IDMwMDEKKyMKKyMgRm9yIGEgdmlydHVhbCBtYWNoaW5lIHdpdGggZ3Vlc3QgbmFtZSAiR3Vlc3QiLgorI0NPTlNPTEUgPSAgdmlyc2ggY29uc29sZSBHdWVzdAorCisjIFJlcXVpcmVkIHZlcnNpb24gZW5kaW5nIHRvIGRpZmZlcmVudGlhdGUgdGhlIHRlc3QKKyMgZnJvbSBvdGhlciBsaW51eCBidWlsZHMgb24gdGhlIHN5c3RlbS4KKyNMT0NBTFZFUlNJT04gPSAtdGVzdAorCisjIFRoZSBncnViIHRpdGxlIG5hbWUgZm9yIHRoZSB0ZXN0IGtlcm5lbCB0byBib290CisjIChPbmx5IG1hbmRhdG9yeSBpZiBSRUJPT1RfVFlQRSA9IGdydWIpCisjCisjIE5vdGUsIGt0ZXN0LnBsIHdpbGwgbm90IHVwZGF0ZSB0aGUgZ3J1YiBtZW51LmxzdCwgeW91IG5lZWQgdG8KKyMgbWFudWFsbHkgYWRkIGFuIG9wdGlvbiBmb3IgdGhlIHRlc3QuIGt0ZXN0LnBsIHdpbGwgc2VhcmNoCisjIHRoZSBncnViIG1lbnUubHN0IGZvciB0aGlzIG9wdGlvbiB0byBmaW5kIHdoYXQga2VybmVsIHRvCisjIHJlYm9vdCBpbnRvLgorIworIyBGb3IgZXhhbXBsZSwgaWYgaW4gdGhlIC9ib290L2dydWIvbWVudS5sc3QgdGhlIHRlc3Qga2VybmVsIHRpdGxlIGhhczoKKyMgdGl0bGUgVGVzdCBLZXJuZWwKKyMga2VybmVsIHZtbGludXotdGVzdAorI0dSVUJfTUVOVSA9IFRlc3QgS2VybmVsCisKKyMgQSBzY3JpcHQgdG8gcmVib290IHRoZSB0YXJnZXQgaW50byB0aGUgdGVzdCBrZXJuZWwKKyMgKE9ubHkgbWFuZGF0b3J5IGlmIFJFQk9PVF9UWVBFID0gc2NyaXB0KQorI1JFQk9PVF9TQ1JJUFQgPQorCisjIyMjIE9wdGlvbmFsIENvbmZpZyBPcHRpb25zIChhbGwgaGF2ZSBkZWZhdWx0cykgIyMjIworCisjIFN0YXJ0IGEgdGVzdCBzZXR1cC4gSWYgeW91IGxlYXZlIHRoaXMgb2ZmLCBhbGwgb3B0aW9ucworIyB3aWxsIGJlIGRlZmF1bHQgYW5kIHRoZSB0ZXN0IHdpbGwgcnVuIG9uY2UuCisjIFRoaXMgaXMgYSBsYWJlbCBhbmQgbm90IHJlYWxseSBhbiBvcHRpb24gKGl0IHRha2VzIG5vIHZhbHVlKS4KKyMgWW91IGNhbiBhcHBlbmQgSVRFUkFURSBhbmQgYSBudW1iZXIgYWZ0ZXIgaXQgdG8gaXRlcmF0ZSB0aGUKKyMgdGVzdCBhIG51bWJlciBvZiB0aW1lcywgb3IgU0tJUCB0byBpZ25vcmUgdGhpcyB0ZXN0LgorIworI1RFU1RfU1RBUlQKKyNURVNUX1NUQVJUIElURVJBVEUgNQorI1RFU1RfU1RBUlQgU0tJUAorCisjIEhhdmUgdGhlIGZvbGxvd2luZyBvcHRpb25zIGFzIGRlZmF1bHQgYWdhaW4uIFVzZWQgYWZ0ZXIgdGVzdHMKKyMgaGF2ZSBhbHJlYWR5IGJlZW4gZGVmaW5lZCBieSBURVNUX1NUQVJULiBPcHRpb25hbGx5LCB5b3UgY2FuCisjIGp1c3QgZGVmaW5lIGFsbCBkZWZhdWx0IG9wdGlvbnMgYmVmb3JlIHRoZSBmaXJzdCBURVNUX1NUQVJUCisjIGFuZCB5b3UgZG8gbm90IG5lZWQgdGhpcyBvcHRpb24uCisjCisjIFRoaXMgaXMgYSBsYWJlbCBhbmQgbm90IHJlYWxseSBhbiBvcHRpb24gKGl0IHRha2VzIG5vIHZhbHVlKS4KKyMgWW91IGNhbiBhcHBlbmQgU0tJUCB0byB0aGlzIGxhYmVsIGFuZCB0aGUgb3B0aW9ucyB3aXRoaW4gdGhpcworIyBzZWN0aW9uIHdpbGwgYmUgaWdub3JlZC4KKyMKKyMgREVGQVVMVFMKKyMgREVGQVVMVFMgU0tJUAorCisjIFRoZSBkZWZhdWx0IHRlc3QgdHlwZSAoZGVmYXVsdCB0ZXN0KQorIyBUaGUgdGVzdCB0eXBlcyBtYXkgYmU6CisjICAgYnVpbGQgLSBvbmx5IGJ1aWxkIHRoZSBrZXJuZWwsIGRvIG5vdGhpbmcgZWxzZQorIyAgIGJvb3QgLSBidWlsZCBhbmQgYm9vdCB0aGUga2VybmVsCisjICAgdGVzdCAtIGJ1aWxkLCBib290IGFuZCBpZiBURVNUIGlzIHNldCwgcnVuIHRoZSB0ZXN0IHNjcmlwdAorIyAgICAgICAgICAoSWYgVEVTVCBpcyBub3Qgc2V0LCBpdCBkZWZhdWx0cyBiYWNrIHRvIGJvb3QpCisjICAgYmlzZWN0IC0gUGVyZm9ybSBhIGJpc2VjdCBvbiB0aGUga2VybmVsIChzZWUgQklTRUNUX1RZUEUgYmVsb3cpCisjICAgcGF0Y2hjaGVjayAtIERvIGEgdGVzdCBvbiBhIHNlcmllcyBvZiBjb21taXRzIGluIGdpdCAoc2VlIFBBVENIQ0hFQ0sgYmVsb3cpCisjVEVTVF9UWVBFID0gdGVzdAorCisjIFRlc3QgdG8gcnVuIGlmIHRoZXJlIGlzIGEgc3VjY2Vzc2Z1bCBib290IGFuZCBURVNUX1RZUEUgaXMgdGVzdC4KKyMgTXVzdCBleGl0IHdpdGggMCBvbiBzdWNjZXNzIGFuZCBub24gemVybyBvbiBlcnJvcgorIyBkZWZhdWx0ICh1bmRlZmluZWQpCisjVEVTVCA9IHNzaCB1c2VyQG1hY2hpbmUgL3Jvb3QvcnVuX3Rlc3QKKworIyBUaGUgYnVpbGQgdHlwZSBpcyBhbnkgbWFrZSBjb25maWcgdHlwZSBvciBzcGVjaWFsIGNvbW1hbmQKKyMgIChkZWZhdWx0IHJhbmRjb25maWcpCisjICAgbm9idWlsZCAtIHNraXAgdGhlIGNsZWFuIGFuZCBidWlsZCBzdGVwCisjICAgdXNlY29uZmlnOi9wYXRoL3RvL2NvbmZpZyAtIHVzZSB0aGUgZ2l2ZW4gY29uZmlnIGFuZCBydW4KKyMgICAgICAgICAgICAgIG9sZGNvbmZpZyBvbiBpdC4KKyMgVGhpcyBvcHRpb24gaXMgaWdub3JlZCBpZiBURVNUX1RZUEUgaXMgcGF0Y2hjaGVjayBvciBiaXNlY3QKKyNCVUlMRF9UWVBFID0gcmFuZGNvbmZpZworCisjIFRoZSBtYWtlIGNvbW1hbmQgKGRlZmF1bHQgbWFrZSkKKyMgSWYgeW91IGFyZSBidWlsZGluZyBhIDMyYml0IHg4NiBvbiBhIDY0IGJpdCBob3N0CisjTUFLRV9DTUQgPSBDQz1pMzg2LWdjYyBBUz1pMzg2LWFzIG1ha2UgQVJDSD1pMzg2CisKKyMgQW55IGJ1aWxkIG9wdGlvbnMgZm9yIHRoZSBtYWtlIG9mIHRoZSBrZXJuZWwgKG5vdCBmb3Igb3RoZXIgbWFrZXMsIGxpa2UgY29uZmlncykKKyMgKGRlZmF1bHQgIiIpCisjQlVJTERfT1BUSU9OUyA9IC1qMjAKKworIyBJZiB5b3UgbmVlZCBhbiBpbml0cmQsIHlvdSBjYW4gYWRkIGEgc2NyaXB0IG9yIGNvZGUgaGVyZSB0byBpbnN0YWxsCisjIGl0LiBUaGUgZW52aXJvbm1lbnQgdmFyaWFibGUgS0VSTkVMX1ZFUlNJT04gd2lsbCBiZSBzZXQgdG8gdGhlCisjIGtlcm5lbCB2ZXJzaW9uIHRoYXQgaXMgdXNlZC4gUmVtZW1iZXIgdG8gYWRkIHRoZSBpbml0cmQgbGluZQorIyB0byB5b3VyIGdydWIgbWVudS5sc3QgZmlsZS4KKyMKKyMgSGVyZSdzIGEgY291cGxlIG9mIGV4YW1wbGVzIHRvIHVzZToKKyNQT1NUX0lOU1RBTEwgPSBzc2ggdXNlckB0YXJnZXQgL3NiaW4vbWtpbml0cmQgLS1hbGxvdy1taXNzaW5nIC1mIC9ib290L2luaXRyYW1mcy10ZXN0LmltZyAkS0VSTkVMX1ZFUlNJT04KKyMKKyMgb3Igb24gc29tZSBzeXN0ZW1zOgorI1BPU1RfSU5TVEFMTCA9IHNzaCB1c2VyQHRhcmdldCAvc2Jpbi9kcmFjdXQgLWYgL2Jvb3QvaW5pdHJhbWZzLXRlc3QuaW1nICRLRVJORUxfVkVSU0lPTgorCisjIFdheSB0byByZWJvb3QgdGhlIGJveCB0byB0aGUgdGVzdCBrZXJuZWwuCisjIE9ubHkgdmFsaWQgb3B0aW9ucyBzbyBmYXIgYXJlICJncnViIiBhbmQgInNjcmlwdCIKKyMgKGRlZmF1bHQgZ3J1YikKKyMgSWYgeW91IHNwZWNpZnkgZ3J1YiwgaXQgd2lsbCBhc3N1bWUgZ3J1YiB2ZXJzaW9uIDEKKyMgYW5kIHdpbGwgc2VhcmNoIGluIC9ib290L2dydWIvbWVudS5sc3QgZm9yIHRoZSB0aXRsZSAkR1JVQl9NRU5VCisjIGFuZCBzZWxlY3QgdGhhdCB0YXJnZXQgdG8gcmVib290IHRvIHRoZSBrZXJuZWwuIElmIHRoaXMgaXMgbm90CisjIHlvdXIgc2V0dXAsIHRoZW4gc3BlY2lmeSAic2NyaXB0IiBhbmQgaGF2ZSBhIGNvbW1hbmQgb3Igc2NyaXB0CisjIHNwZWNpZmllZCBpbiBSRUJPT1RfU0NSSVBUIHRvIGJvb3QgdG8gdGhlIHRhcmdldC4KKyMKKyMgVGhlIGVudHJ5IGluIC9ib290L2dydWIvbWVudS5sc3QgbXVzdCBiZSBlbnRlcmVkIGluIG1hbnVhbGx5LgorIyBUaGUgdGVzdCB3aWxsIG5vdCBtb2RpZnkgdGhhdCBmaWxlLgorI1JFQk9PVF9UWVBFID0gZ3J1YgorCisjIFRoZSBtaW4gY29uZmlnIHRoYXQgaXMgbmVlZGVkIHRvIGJ1aWxkIGZvciB0aGUgbWFjaGluZQorIyBBIG5pY2Ugd2F5IHRvIGNyZWF0ZSB0aGlzIGlzIHdpdGggdGhlIGZvbGxvd2luZzoKKyMKKyMgICAkIHNzaCB0YXJnZXQKKyMgICAkIGxzbW9kID4gbXltb2RzCisjICAgJCBzY3AgbXltb2RzIGhvc3Q6L3RtcAorIyAgICQgZXhpdAorIyAgICQgY2QgbGludXguZ2l0CisjICAgJCBybSAuY29uZmlnCisjICAgJCBtYWtlIExTTU9EPW15bW9kcyBsb2NhbHllc2NvbmZpZworIyAgICQgZ3JlcCAnXkNPTkZJRycgLmNvbmZpZyA+IC9ob21lL3Rlc3QvY29uZmlnLW1pbgorIworIyBJZiB5b3Ugd2FudCBldmVuIGxlc3MgY29uZmlnczoKKyMKKyMgICBsb2cgaW4gZGlyZWN0bHkgdG8gdGFyZ2V0IChkbyBub3Qgc3NoKQorIworIyAgICQgc3UKKyMgICAjIGxzbW9kIHwgY3V0IC1kJyAnIC1mMSB8IHhhcmdzIHJtbW9kCisjCisjICAgcmVwZWF0IHRoZSBhYm92ZSBzZXZlcmFsIHRpbWVzCisjCisjICAgIyBsc21vZCA+IG15bW9kcworIyAgICMgcmVib290CisjCisjIE1heSBuZWVkIHRvIHJlYm9vdCB0byBnZXQgeW91ciBuZXR3b3JrIGJhY2sgdG8gY29weSB0aGUgbXltb2RzCisjIHRvIHRoZSBob3N0LCBhbmQgdGhlbiByZW1vdmUgdGhlIHByZXZpb3VzIC5jb25maWcgYW5kIHJ1biB0aGUKKyMgbG9jYWx5ZXNjb25maWcgYWdhaW4uIFRoZSBDT05GSUdfTUlOIGdlbmVyYXRlZCBsaWtlIHRoaXMgd2lsbAorIyBub3QgZ3VhcmFudGVlIG5ldHdvcmsgYWN0aXZpdHkgdG8gdGhlIGJveCBzbyB0aGUgVEVTVF9UWVBFIG9mCisjIHRlc3QgbWF5IGZhaWwuCisjCisjIFlvdSBtaWdodCBhbHNvIHdhbnQgdG8gc2V0OgorIyAgIENPTkZJR19DTURMSU5FPSI8eW91ciBvcHRpb25zIGhlcmU+IgorIyAgcmFuZGNvbmZpZyBtYXkgc2V0IHRoZSBhYm92ZSBhbmQgb3ZlcnJpZGUgeW91ciByZWFsIGNvbW1hbmQKKyMgIGxpbmUgb3B0aW9ucy4KKyMgKGRlZmF1bHQgdW5kZWZpbmVkKQorI01JTl9DT05GSUcgPSAvaG9tZS90ZXN0L2NvbmZpZy1taW4KKworIyBTb21ldGltZXMgdGhlcmUncyBvcHRpb25zIHRoYXQganVzdCBicmVhayB0aGUgYm9vdCBhbmQKKyMgeW91IGRvIG5vdCBjYXJlIGFib3V0LiBIZXJlIGFyZSBhIGZldzoKKyMgICAjIENPTkZJR19TVEFHSU5HIGlzIG5vdCBzZXQKKyMgIFN0YWdpbmcgZHJpdmVycyBhcmUgaG9ycmlibGUsIGFuZCBjYW4gYnJlYWsgdGhlIGJ1aWxkLgorIyAgICMgQ09ORklHX1NDU0lfREVCVUcgaXMgbm90IHNldAorIyAgU0NTSV9ERUJVRyBtYXkgY2hhbmdlIHlvdXIgcm9vdCBwYXJ0aXRpb24KKyMgICAjIENPTkZJR19LR0RCX1NFUklBTF9DT05TT0xFIGlzIG5vdCBzZXQKKyMgIEtHREIgbWF5IGNhdXNlIG9vcHMgd2FpdGluZyBmb3IgYSBjb25uZWN0aW9uIHRoYXQncyBub3QgdGhlcmUuCisjIFRoaXMgb3B0aW9uIHBvaW50cyB0byB0aGUgZmlsZSBjb250YWluaW5nIGNvbmZpZyBvcHRpb25zIHRoYXQgd2lsbCBiZSBwcmVwZW5kZWQKKyMgdG8gdGhlIE1JTl9DT05GSUcgKG9yIGJlIHRoZSBNSU5fQ09ORklHIGlmIGl0IGlzIG5vdCBzZXQpCisjCisjIE5vdGUsIGNvbmZpZyBvcHRpb25zIGluIE1JTl9DT05GSUcgd2lsbCBvdmVycmlkZSB0aGVzZSBvcHRpb25zLgorIworIyAoZGVmYXVsdCB1bmRlZmluZWQpCisjQUREX0NPTkZJRyA9IC9ob21lL3Rlc3QvY29uZmlnLWJyb2tlbgorCisjIFRoZSBsb2NhdGlvbiBvbiB0aGUgaG9zdCB3aGVyZSB0byB3cml0ZSB0ZW1wIGZpbGVzCisjIChkZWZhdWx0IC90bXAva3Rlc3QpCisjVE1QX0RJUiA9IC90bXAva3Rlc3QKKworIyBPcHRpb25hbCBsb2cgZmlsZSB0byB3cml0ZSB0aGUgc3RhdHVzIChyZWNvbW1lbmRlZCkKKyMgIE5vdGUsIHRoaXMgaXMgYSBERUZBVUxUIHNlY3Rpb24gb25seSBvcHRpb24uCisjIChkZWZhdWx0IHVuZGVmaW5lZCkKKyNMT0dfRklMRSA9IC9ob21lL3Rlc3QvbG9nZmlsZXMvdGFyZ2V0LmxvZworCisjIFJlbW92ZSBvbGQgbG9nZmlsZSBpZiBpdCBleGlzdHMgYmVmb3JlIHN0YXJ0aW5nIGFsbCB0ZXN0cy4KKyMgIE5vdGUsIHRoaXMgaXMgYSBERUZBVUxUIHNlY3Rpb24gb25seSBvcHRpb24uCisjIChkZWZhdWx0IDApCisjQ0xFQVJfTE9HID0gMAorCisjIExpbmUgdG8gZGVmaW5lIGEgc3VjY2Vzc2Z1bCBib290IHVwIGluIGNvbnNvbGUgb3V0cHV0LgorIyBUaGlzIGlzIHdoYXQgdGhlIGxpbmUgY29udGFpbnMsIG5vdCB0aGUgZW50aXJlIGxpbmUuIElmIHlvdSBuZWVkCisjIHRoZSBlbnRpcmUgbGluZSB0byBtYXRjaCwgdGhlbiB1c2UgcmVndXJhbCBleHByZXNzaW9uIHN5bnRheCBsaWtlOgorIyAgKGRvIG5vdCBhZGQgYW55IHF1b3RlcyBhcm91bmQgaXQpCisjCisjICBTVUNDRVNTX0xJTkUgPSBeTXlCb3ggTG9naW46JAorIworIyAoZGVmYXVsdCAibG9naW46IikKKyNTVUNDRVNTX0xJTkUgPSBsb2dpbjoKKworIyBJbiBjYXNlIHRoZSBjb25zb2xlIGNvbnN0YW50bHkgZmlsbHMgdGhlIHNjcmVlbiwgaGF2aW5nCisjIGEgc3BlY2lmaWVkIHRpbWUgdG8gc3RvcCB0aGUgdGVzdCBhZnRlciBzdWNjZXNzIGlzIHJlY29tbWVuZGVkLgorIyAoaW4gc2Vjb25kcykKKyMgKGRlZmF1bHQgMTApCisjU1RPUF9BRlRFUl9TVUNDRVNTID0gMTAKKworIyBJbiBjYXNlIHRoZSBjb25zb2xlIGNvbnN0YW50bHkgZmlsbHMgdGhlIHNjcmVlbiwgaGF2aW5nCisjIGEgc3BlY2lmaWVkIHRpbWUgdG8gc3RvcCB0aGUgdGVzdCBhZnRlciBmYWlsdXJlIGlzIHJlY29tbWVuZGVkLgorIyAoaW4gc2Vjb25kcykKKyMgKGRlZmF1bHQgNjApCisjU1RPUF9BRlRFUl9GQUlMVVJFID0gNjAKKworIyBTdG9wIHRlc3RpbmcgaWYgYSBidWlsZCBmYWlscy4gSWYgc2V0LCB0aGUgc2NyaXB0IHdpbGwgZW5kIGlmCisjIGEgZmFpbHVyZSBpcyBkZXRlY3RlZCwgb3RoZXJ3aXNlIGl0IHdpbGwgc2F2ZSBvZmYgdGhlIC5jb25maWcsCisjIGRtZXNnIGFuZCBib290bG9nIGluIGEgZGlyZWN0b3J5IGNhbGxlZAorIyBNQUNISU5FLVRFU1RfVFlQRV9CVUlMRF9UWVBFLWZhaWwteXl5eW1tZGRoaG1tc3MKKyMgaWYgdGhlIFNUT1JFX0ZBSUxVUkVTIGRpcmVjdG9yeSBpcyBzZXQuCisjIChkZWZhdWx0IDEpCisjIE5vdGUsIGV2ZW4gaWYgdGhpcyBpcyBzZXQgdG8gemVybywgdGhlcmUgYXJlIHNvbWUgZXJyb3JzIHRoYXQgc3RpbGwKKyMgc3RvcCB0aGUgdGVzdHMuCisjRElFX09OX0ZBSUxVUkUgPSAxCisKKyMgRGlyZWN0b3J5IHRvIHN0b3JlIGZhaWx1cmUgZGlyZWN0b3JpZXMgb24gZmFpbHVyZS4gSWYgdGhpcyBpcyBub3QKKyMgc2V0LCBESUVfT05fRkFJTFVSRT0wIHdpbGwgbm90IHNhdmUgb2ZmIHRoZSAuY29uZmlnLCBkbWVzZyBhbmQKKyMgYm9vdGxvZy4gVGhpcyBvcHRpb24gaXMgaWdub3JlZCBpZiBESUVfT05fRkFJTFVSRSBpcyBub3Qgc2V0LgorIyAoZGVmYXVsdCB1bmRlZmluZWQpCisjU1RPUkVfRkFJTFVSRVMgPSAvaG9tZS90ZXN0L2ZhaWx1cmVzCisKKyMgQnVpbGQgd2l0aG91dCBkb2luZyBhIG1ha2UgbXJwcm9wZXIsIG9yIHJlbW92aW5nIC5jb25maWcKKyMgKGRlZmF1bHQgMCkKKyNCVUlMRF9OT0NMRUFOID0gMAorCisjIEFzIHRoZSB0ZXN0IHJlYWRzIHRoZSBjb25zb2xlLCBhZnRlciBpdCBoaXRzIHRoZSBTVUNDRVNTX0xJTkUKKyMgdGhlIHRpbWUgaXQgd2FpdHMgZm9yIHRoZSBtb25pdG9yIHRvIHNldHRsZSBkb3duIGJldHdlZW4gcmVhZHMKKyMgY2FuIHVzdWFsbHkgYmUgbG93ZXJlZC4KKyMgKGluIHNlY29uZHMpIChkZWZhdWx0IDEpCisjQk9PVEVEX1RJTUVPVVQgPSAxCisKKyMgVGhlIHRpbWVvdXQgaW4gc2Vjb25kcyB3aGVuIHdlIGNvbnNpZGVyIHRoZSBib3ggaHVuZyBhZnRlcgorIyB0aGUgY29uc29sZSBzdG9wIHByb2R1Y2luZyBvdXRwdXQuIEJlIHN1cmUgdG8gbGVhdmUgZW5vdWdoCisjIHRpbWUgaGVyZSB0byBnZXQgcGFzcyBhIHJlYm9vdC4gU29tZSBtYWNoaW5lcyBtYXkgbm90IHByb2R1Y2UKKyMgYW55IGNvbnNvbGUgb3V0cHV0IGZvciBhIGxvbmcgdGltZSBkdXJpbmcgYSByZWJvb3QuIFlvdSBkbworIyBub3Qgd2FudCB0aGUgdGVzdCB0byBmYWlsIGp1c3QgYmVjYXVzZSB0aGUgc3lzdGVtIHdhcyBpbgorIyB0aGUgcHJvY2VzcyBvZiByZWJvb3RpbmcgdG8gdGhlIHRlc3Qga2VybmVsLgorIyAoZGVmYXVsdCAxMjApCisjVElNRU9VVCA9IDEyMAorCisjIEluIGJldHdlZW4gdGVzdHMsIGEgcmVib290IG9mIHRoZSBib3ggbWF5IG9jY3VyLCBhbmQgdGhpcworIyBpcyB0aGUgdGltZSB0byB3YWl0IGZvciB0aGUgY29uc29sZSBhZnRlciBpdCBzdG9wcyBwcm9kdWNpbmcKKyMgb3V0cHV0LiBTb21lIG1hY2hpbmVzIG1heSBub3QgcHJvZHVjZSBhIGxhcmdlIGxhZyBvbiByZWJvb3QKKyMgc28gdGhpcyBzaG91bGQgYWNjb21tb2RhdGUgaXQuCisjIFRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhpcyBhbmQgVElNRU9VVCwgaXMgdGhhdCBUSU1FT1VUIGhhcHBlbnMKKyMgd2hlbiByZWJvb3RpbmcgdG8gdGhlIHRlc3Qga2VybmVsLiBUaGlzIHNsZWVwIHRpbWUgaGFwcGVucworIyBhZnRlciBhIHRlc3QgaGFzIGNvbXBsZXRlZCBhbmQgd2UgYXJlIGFib3V0IHRvIHN0YXJ0IHJ1bm5pbmcKKyMgYW5vdGhlciB0ZXN0LiBJZiBhIHJlYm9vdCB0byB0aGUgcmVsaWFibGUga2VybmVsIGhhcHBlbnMsCisjIHdlIHdhaXQgU0xFRVBfVElNRSBmb3IgdGhlIGNvbnNvbGUgdG8gc3RvcCBwcm9kdWNpbmcgb3V0cHV0CisjIGJlZm9yZSBzdGFydGluZyB0aGUgbmV4dCB0ZXN0LgorIyAoZGVmYXVsdCA2MCkKKyNTTEVFUF9USU1FID0gNjAKKworIyBUaGUgdGltZSBpbiBiZXR3ZWVuIGJpc2VjdHMgdG8gc2xlZXAgKGluIHNlY29uZHMpCisjIChkZWZhdWx0IDYwKQorI0JJU0VDVF9TTEVFUF9USU1FID0gNjAKKworIyBSZWJvb3QgdGhlIHRhcmdldCBib3ggb24gZXJyb3IgKGRlZmF1bHQgMCkKKyNSRUJPT1RfT05fRVJST1IgPSAwCisKKyMgUG93ZXIgb2ZmIHRoZSB0YXJnZXQgb24gZXJyb3IgKGlnbm9yZWQgaWYgUkVCT09UX09OX0VSUk9SIGlzIHNldCkKKyMgIE5vdGUsIHRoaXMgaXMgYSBERUZBVUxUIHNlY3Rpb24gb25seSBvcHRpb24uCisjIChkZWZhdWx0IDApCisjUE9XRVJPRkZfT05fRVJST1IgPSAwCisKKyMgUG93ZXIgb2ZmIHRoZSB0YXJnZXQgYWZ0ZXIgYWxsIHRlc3RzIGhhdmUgY29tcGxldGVkIHN1Y2Nlc3NmdWxseQorIyAgTm90ZSwgdGhpcyBpcyBhIERFRkFVTFQgc2VjdGlvbiBvbmx5IG9wdGlvbi4KKyMgKGRlZmF1bHQgMCkKKyNQT1dFUk9GRl9PTl9TVUNDRVNTID0gMAorCisjIFJlYm9vdCB0aGUgdGFyZ2V0IGFmdGVyIGFsbCB0ZXN0IGNvbXBsZXRlZCBzdWNjZXNzZnVsbHkgKGRlZmF1bHQgMSkKKyMgKGlnbm9yZWQgaWYgUE9XRVJPRkZfT05fU1VDQ0VTUyBpcyBzZXQpCisjUkVCT09UX09OX1NVQ0NFU1MgPSAxCisKKyMgSW4gY2FzZSB0aGVyZSBhcmUgaXNzZXMgd2l0aCByZWJvb3RpbmcsIHlvdSBjYW4gc3BlY2lmeSB0aGlzCisjIHRvIGFsd2F5cyBwb3dlcmN5Y2xlIGFmdGVyIHRoaXMgYW1vdW50IG9mIHRpbWUgYWZ0ZXIgY2FsbGluZworIyByZWJvb3QuCisjIE5vdGUsIFBPV0VSQ1lDTEVfQUZURVJfUkVCT09UID0gMCBkb2VzIE5PVCBkaXNhYmxlIGl0LiBJdCBqdXN0CisjIG1ha2VzIGl0IHBvd2VyY3ljbGUgaW1tZWRpYXRlbHkgYWZ0ZXIgcmVib290aW5nLiBEbyBub3QgZGVmaW5lCisjIGl0IGlmIHlvdSBkbyBub3Qgd2FudCBpdC4KKyMgKGRlZmF1bHQgdW5kZWZpbmVkKQorI1BPV0VSQ1lDTEVfQUZURVJfUkVCT09UID0gNQorCisjIEluIGNhc2UgdGhlcmUncyBpc3NlcyB3aXRoIGhhbHRpbmcsIHlvdSBjYW4gc3BlY2lmeSB0aGlzCisjIHRvIGFsd2F5cyBwb3dlcm9mZiBhZnRlciB0aGlzIGFtb3VudCBvZiB0aW1lIGFmdGVyIGNhbGxpbmcKKyMgaGFsdC4KKyMgTm90ZSwgUE9XRVJPRkZfQUZURVJfSEFMVCA9IDAgZG9lcyBOT1QgZGlzYWJsZSBpdC4gSXQganVzdAorIyBtYWtlcyBpdCBwb3dlcm9mZiBpbW1lZGlhdGVseSBhZnRlciBoYWx0aW5nLiBEbyBub3QgZGVmaW5lCisjIGl0IGlmIHlvdSBkbyBub3Qgd2FudCBpdC4KKyMgKGRlZmF1bHQgdW5kZWZpbmVkKQorI1BPV0VST0ZGX0FGVEVSX0hBTFQgPSAyMAorCisjIEEgc2NyaXB0IG9yIGNvbW1hbmQgdG8gcG93ZXIgb2ZmIHRoZSBib3ggKGRlZmF1bHQgdW5kZWZpbmVkKQorIyBOZWVkZWQgZm9yIFBPV0VST0ZGX09OX0VSUk9SIGFuZCBTVUNDRVNTCisjCisjIEV4YW1wbGUgZm9yIGRpZ2l0YWwgbG9nZ2VycyBwb3dlciBzd2l0Y2g6CisjUE9XRVJfT0ZGID0gd2dldCAtLW5vLXByb3h5IC1PIC9kZXYvbnVsbCAtcSAgLS1hdXRoLW5vLWNoYWxsZW5nZSAnaHR0cDovL2FkbWluOmFkbWluQHBvd2VyL291dGxldD81PU9GRicKKyMKKyMgRXhhbXBsZSBmb3IgYSB2aXJ0dWFsIGd1ZXN0IGNhbGwgIkd1ZXN0Ii4KKyNQT1dFUl9PRkYgPSB2aXJzaCBkZXN0cm95IEd1ZXN0CisKKyMgVGhlIHdheSB0byBleGVjdXRlIGEgY29tbWFuZCBvbiB0aGUgdGFyZ2V0CisjIChkZWZhdWx0IHNzaCAkU1NIX1VTRVJAJE1BQ0hJTkUgJFNTSF9DT01NQU5EIjspCisjIFRoZSB2YXJpYWJsZXMgU1NIX1VTRVIsIE1BQ0hJTkUgYW5kIFNTSF9DT01NQU5EIGFyZSBkZWZpbmVkCisjU1NIX0VYRUMgPSBzc2ggJFNTSF9VU0VSQCRNQUNISU5FICRTU0hfQ09NTUFORCI7CisKKyMgVGhlIHdheSB0byBjb3B5IGEgZmlsZSB0byB0aGUgdGFyZ2V0CisjIChkZWZhdWx0IHNjcCAkU1JDX0ZJTEUgJFNTSF9VU0VSQCRNQUNISU5FOiREU1RfRklMRSkKKyMgVGhlIHZhcmlhYmxlcyBTU0hfVVNFUiwgTUFDSElORSwgU1JDX0ZJTEUgYW5kIERTVF9GSUxFIGFyZSBkZWZpbmVkLgorI1NDUF9UT19UQVJHRVQgPSBzY3AgJFNSQ19GSUxFICRTU0hfVVNFUkAkTUFDSElORTokRFNUX0ZJTEUKKworIyBUaGUgbmljZSB3YXkgdG8gcmVib290IHRoZSB0YXJnZXQKKyMgKGRlZmF1bHQgc3NoICRTU0hfVVNFUkAkTUFDSElORSByZWJvb3QpCisjIFRoZSB2YXJpYWJsZXMgU1NIX1VTRVIgYW5kIE1BQ0hJTkUgYXJlIGRlZmluZWQuCisjUkVCT09UID0gc3NoICRTU0hfVVNFUkAkTUFDSElORSByZWJvb3QKKworIyMjIyBQZXIgdGVzdCBydW4gb3B0aW9ucyAjIyMjCisjIFRoZSBmb2xsb3dpbmcgb3B0aW9ucyBhcmUgb25seSBhbGxvd2VkIGluIFRFU1RfU1RBUlQgc2VjdGlvbnMuCisjIFRoZXkgYXJlIGlnbm9yZWQgaW4gdGhlIERFRkFVTFRTIHNlY3Rpb25zLgorIworIyBBbGwgb2YgdGhlc2UgYXJlIG9wdGlvbmFsIGFuZCB1bmRlZmluZWQgYnkgZGVmYXVsdCwgYWx0aG91Z2gKKyMgIHNvbWUgb2YgdGhlc2Ugb3B0aW9ucyBhcmUgcmVxdWlyZWQgZm9yIFRFU1RfVFlQRSBvZiBwYXRjaGNoZWNrCisjICBhbmQgYmlzZWN0LgorIworIworIyBDSEVDS09VVCA9IGJyYW5jaAorIworIyAgSWYgdGhlIEJVSUxEX0RJUiBpcyBhIGdpdCByZXBvc2l0b3J5LCB0aGVuIHlvdSBjYW4gc2V0IHRoaXMgb3B0aW9uCisjICB0byBjaGVja291dCB0aGUgZ2l2ZW4gYnJhbmNoIGJlZm9yZSBydW5uaW5nIHRoZSBURVNULiBJZiB5b3UKKyMgIHNwZWNpZnkgdGhpcyBmb3IgdGhlIGZpcnN0IHJ1biwgdGhhdCBicmFuY2ggd2lsbCBiZSB1c2VkIGZvcgorIyAgYWxsIHByZWNlZGluZyB0ZXN0cyB1bnRpbCBhIG5ldyBDSEVDS09VVCBpcyBzZXQuCisjCisjCisjCisjIEZvciBURVNUX1RZUEUgPSBwYXRjaGNoZWNrCisjCisjICBUaGlzIGV4cGVjdHMgdGhlIEJVSUxEX0RJUiB0byBiZSBhIGdpdCByZXBvc2l0b3J5LCBhbmQKKyMgIHdpbGwgY2hlY2tvdXQgdGhlIFBBVENIQ0hFQ0tfU1RBUlQgY29tbWl0LgorIworIyAgVGhlIG9wdGlvbiBCVUlMRF9UWVBFIHdpbGwgYmUgaWdub3JlZC4KKyMKKyMgIFRoZSBNSU5fQ09ORklHIHdpbGwgYmUgdXNlZCBmb3IgYWxsIGJ1aWxkcyBvZiB0aGUgcGF0Y2hjaGVjay4gVGhlIGJ1aWxkIHR5cGUKKyMgIHVzZWQgZm9yIHBhdGNoY2hlY2sgaXMgb2xkY29uZmlnLgorIworIyAgUEFUQ0hDSEVDS19TVEFSVCBpcyByZXF1aXJlZCBhbmQgaXMgdGhlIGZpcnN0IHBhdGNoIHRvCisjICAgdGVzdCAodGhlIFNIQTEgb2YgdGhlIGNvbW1pdCkuIFlvdSBtYXkgYWxzbyBzcGVjaWZ5IGFueXRoaW5nCisjICAgdGhhdCBnaXQgY2hlY2tvdXQgYWxsb3dzIChicmFuY2ggbmFtZSwgdGFnZSwgSEVBRH4zKS4KKyMKKyMgIFBBVENIQ0hFQ0tfRU5EIGlzIHRoZSBsYXN0IHBhdGNoIHRvIGNoZWNrIChkZWZhdWx0IEhFQUQpCisjCisjICBQQVRDSENIRUNLX1RZUEUgaXMgcmVxdWlyZWQgYW5kIGlzIHRoZSB0eXBlIG9mIHRlc3QgdG8gcnVuOgorIyAgICAgIGJ1aWxkLCBib290LCB0ZXN0LgorIworIyAgIE5vdGUsIHRoZSBidWlsZCB0ZXN0IHdpbGwgbG9vayBmb3Igd2FybmluZ3MsIGlmIGEgd2FybmluZyBvY2N1cnJlZAorIyAgICAgaW4gYSBmaWxlIHRoYXQgYSBjb21taXQgdG91Y2hlcywgdGhlIGJ1aWxkIHdpbGwgZmFpbC4KKyMKKyMgICBJZiBCVUlMRF9OT0NMRUFOIGlzIHNldCwgdGhlbiBtYWtlIG1ycHJvcGVyIHdpbGwgbm90IGJlIHJ1biBvbgorIyAgIGFueSBvZiB0aGUgYnVpbGRzLCBqdXN0IGxpa2UgYWxsIG90aGVyIFRFU1RfVFlQRSB0ZXN0cy4gQnV0CisjICAgd2hhdCBtYWtlcyBwYXRjaGNoZWNrIGRpZmZlcmVudCBmcm9tIHRoZSBvdGhlciB0ZXN0cywgaXMgaWYKKyMgICBCVUlMRF9OT0NMRUFOIGlzIG5vdCBzZXQsIG9ubHkgdGhlIGZpcnN0IGFuZCBsYXN0IHBhdGNoIHJ1bgorIyAgIG1ha2UgbXJwcm9wZXIuIFRoaXMgaGVscHMgc3BlZWQgdXAgdGhlIHRlc3QuCisjCisjIEV4YW1wbGU6CisjICAgVEVTVF9TVEFSVAorIyAgIFRFU1RfVFlQRSA9IHBhdGNoY2hlY2sKKyMgICBDSEVDS09VVCA9IG15YnJhbmNoCisjICAgUEFUQ0hDSEVDS19UWVBFID0gYm9vdAorIyAgIFBBVENIQ0hFQ0tfU1RBUlQgPSA3NDdlOTRhZTNkMWI0YzliZjUzODBlNTY5ZjYxNGViOTA0MGI3OWU3CisjICAgUEFUQ0hDSEVDS19FTkQgPSBIRUFEfjIKKyMKKyMKKyMKKyMgRm9yIFRFU1RfVFlQRSA9IGJpc2VjdAorIworIyAgWW91IGNhbiBzcGVjaWZ5IGEgZ2l0IGJpc2VjdCBpZiB0aGUgQlVJTERfRElSIGlzIGEgZ2l0IHJlcG9zaXRvcnkuCisjICBUaGUgTUlOX0NPTkZJRyB3aWxsIGJlIHVzZWQgZm9yIGFsbCBidWlsZHMgb2YgdGhlIGJpc2VjdC4gVGhlIGJ1aWxkIHR5cGUKKyMgIHVzZWQgZm9yIGJpc2VjdGluZyBpcyBvbGRjb25maWcuCisjCisjICBUaGUgb3B0aW9uIEJVSUxEX1RZUEUgd2lsbCBiZSBpZ25vcmVkLgorIworIyAgQklTRUNUX1RZUEUgaXMgdGhlIHR5cGUgb2YgdGVzdCB0byBwZXJmb3JtOgorIwlidWlsZAktIGJhZCBmYWlscyB0byBidWlsZAorIwlib290CS0gYmFkIGJ1aWxkcyBidXQgZmFpbHMgdG8gYm9vdAorIwl0ZXN0CS0gYmFkIGJvb3RzIGJ1dCBmYWlscyBhIHRlc3QKKyMKKyMgQklTRUNUX0dPT0QgaXMgdGhlIGNvbW1pdCAoU0hBMSkgdG8gbGFiZWwgYXMgZ29vZCAoYWNjZXB0cyBhbGwgZ2l0IGdvb2QgY29tbWl0IHR5cGVzKQorIyBCSVNFQ1RfQkFEIGlzIHRoZSBjb21taXQgdG8gbGFiZWwgYXMgYmFkIChhY2NlcHRzIGFsbCBnaXQgYmFkIGNvbW1pdCB0eXBlcykKKyMKKyMgVGhlIGFib3ZlIHRocmVlIG9wdGlvbnMgYXJlIHJlcXVpcmVkIGZvciBhIGJpc2VjdCBvcGVyYXRpb24uCisjCisjIEJJU0VDVF9SRVBMQVkgPSAvcGF0aC90by9yZXBsYXkvZmlsZSAob3B0aW9uYWwsIGRlZmF1bHQgdW5kZWZpbmVkKQorIworIyAgIElmIGFuIG9wZXJhdGlvbiBmYWlsZWQgaW4gdGhlIGJpc2VjdCB0aGF0IHdhcyBub3QgZXhwZWN0ZWQgdG8KKyMgICBmYWlsLiBUaGVuIHRoZSB0ZXN0IGVuZHMuIFRoZSBzdGF0ZSBvZiB0aGUgQlVJTERfRElSIHdpbGwgYmUKKyMgICBsZWZ0IG9mZiBhdCB3aGVyZSB0aGUgZmFpbHVyZSBvY2N1cnJlZC4gWW91IGNhbiBleGFtaW5lIHRoZQorIyAgIHJlYXNvbiBmb3IgdGhlIGZhaWx1cmUsIGFuZCBwZXJoYXBzIGV2ZW4gZmluZCBhIGdpdCBjb21taXQKKyMgICB0aGF0IHdvdWxkIHdvcmsgdG8gY29udGludWUgd2l0aC4gWW91IGNhbiBydW46CisjCisjICAgZ2l0IGJpc2VjdCBsb2cgPiAvcGF0aC90by9yZXBsYXkvZmlsZQorIworIyAgIFRoZSBhZGRpbmc6CisjCisjICAgIEJJU0VDVF9SRVBMQVk9IC9wYXRoL3RvL3JlcGxheS9maWxlCisjCisjICAgQW5kIHJ1bm5pbmcgdGhlIHRlc3QgYWdhaW4uIFRoZSB0ZXN0IHdpbGwgcGVyZm9ybSB0aGUgaW5pdGlhbAorIyAgICBnaXQgYmlzZWN0IHN0YXJ0LCBnaXQgYmlzZWN0IGdvb2QsIGFuZCBnaXQgYmlzZWN0IGJhZCwgYW5kCisjICAgIHRoZW4gaXQgd2lsbCBydW4gZ2l0IGJpc2VjdCByZXBsYXkgb24gdGhpcyBmaWxlLCBiZWZvcmUKKyMgICAgY29udGludWluZyB3aXRoIHRoZSBiaXNlY3QuCisjCisjIEJJU0VDVF9TVEFSVCA9IGNvbW1pdCAob3B0aW9uYWwsIGRlZmF1bHQgdW5kZWZpbmVkKQorIworIyAgIEFzIHdpdGggQklTRUNUX1JFUExBWSwgaWYgdGhlIHRlc3QgZmFpbGVkIG9uIGEgY29tbWl0IHRoYXQKKyMgICBqdXN0IGhhcHBlbiB0byBoYXZlIGEgYmFkIGNvbW1pdCBpbiB0aGUgbWlkZGxlIG9mIHRoZSBiaXNlY3QsCisjICAgYW5kIHlvdSBuZWVkIHRvIHNraXAgaXQuIElmIEJJU0VDVF9TVEFSVCBpcyBkZWZpbmVkLCBpdAorIyAgIHdpbGwgY2hlY2tvdXQgdGhhdCBjb21taXQgYWZ0ZXIgZG9pbmcgdGhlIGluaXRpYWwgZ2l0IGJpc2VjdCBzdGFydCwKKyMgICBnaXQgYmlzZWN0IGdvb2QsIGdpdCBiaXNlY3QgYmFkLCBhbmQgcnVubmluZyB0aGUgZ2l0IGJpc2VjdCByZXBsYXkKKyMgICBpZiB0aGUgQklTRUNUX1JFUExBWSBpcyBzZXQuCisjCisjIEJJU0VDVF9SRVZFUlNFID0gMSAob3B0aW9uYWwsIGRlZmF1bHQgMCkKKyMKKyMgICBJbiB0aG9zZSBzdHJhbmdlIGluc3RhbmNlcyB3aGVyZSBpdCB3YXMgYnJva2VuIGZvcmV2ZXIKKyMgICBhbmQgeW91IGFyZSB0cnlpbmcgdG8gZmluZCB3aGVyZSBpdCBzdGFydGVkIHRvIHdvcmshCisjICAgU2V0IEJJU0VDVF9HT09EIHRvIHRoZSBjb21taXQgdGhhdCB3YXMgbGFzdCBrbm93biB0byBmYWlsCisjICAgU2V0IEJJU0VDVF9CQUQgdG8gdGhlIGNvbW1pdCB0aGF0IGlzIGtub3duIHRvIHN0YXJ0IHdvcmtpbmcuCisjICAgV2l0aCBCSVNFQ1RfUkVWRVJTRSA9IDEsIFRoZSB0ZXN0IHdpbGwgY29uc2lkZXIgZmFpbHVyZXMgYXMKKyMgICBnb29kLCBhbmQgc3VjY2VzcyBhcyBiYWQuCisjCisjIEJJU0VDVF9DSEVDSyA9IDEgKG9wdGlvbmFsLCBkZWZhdWx0IDApCisjCisjICAgSnVzdCB0byBiZSBzdXJlIHRoZSBnb29kIGlzIGdvb2QgYW5kIGJhZCBpcyBiYWQsIHNldHRpbmcKKyMgICBCSVNFQ1RfQ0hFQ0sgdG8gMSB3aWxsIHN0YXJ0IHRoZSBiaXNlY3QgYnkgZmlyc3QgY2hlY2tpbmcKKyMgICBvdXQgQklTRUNUX0JBRCBhbmQgbWFrZXMgc3VyZSBpdCBmYWlscywgdGhlbiBpdCB3aWxsIGNoZWNrCisjICAgb3V0IEJJU0VDVF9HT09EIGFuZCBtYWtlcyBzdXJlIGl0IHN1Y2NlZWRzIGJlZm9yZSBzdGFydGluZworIyAgIHRoZSBiaXNlY3QgKGl0IHdvcmtzIGZvciBCSVNFQ1RfUkVWRVJTRSB0b28pLgorIworIyAgIFlvdSBjYW4gbGltaXQgdGhlIHRlc3QgdG8ganVzdCBjaGVjayBCSVNFQ1RfR09PRCBvcgorIyAgIEJJU0VDVF9CQUQgd2l0aCBCSVNFQ1RfQ0hFQ0sgPSBnb29kIG9yCisjICAgQklTRUNUX0NIRUNLID0gYmFkLCByZXNwZWN0aXZlbHkuCisjCisjIEV4YW1wbGU6CisjICAgVEVTVF9TVEFSVAorIyAgIFRFU1RfVFlQRSA9IGJpc2VjdAorIyAgIEJJU0VDVF9HT09EID0gdjIuNi4zNgorIyAgIEJJU0VDVF9CQUQgPSBiNTE1MzE2M2VkNTgwZTAwYzY3YmRmZWNiMDJiMmUzODQzODE3YjNlCisjICAgQklTRUNUX1RZUEUgPSBidWlsZAorIyAgIE1JTl9DT05GSUcgPSAvaG9tZS90ZXN0L2NvbmZpZy1iaXNlY3QKKyMKKyMKKyMKKyMgRm9yIFRFU1RfVFlQRSA9IGNvbmZpZ19iaXNlY3QKKyMKKyMgIEluIHRob3NlIGNhc2VzIHRoYXQgeW91IGhhdmUgdHdvIGRpZmZlcmVudCBjb25maWdzLiBPbmUgb2YgdGhlbQorIyAgd29yaywgdGhlIG90aGVyIGRvZXMgbm90LCBhbmQgeW91IGRvIG5vdCBrbm93IHdoYXQgY29uZmlnIGNhdXNlcworIyAgdGhlIHByb2JsZW0uCisjICBUaGUgVEVTVF9UWVBFIGNvbmZpZ19iaXNlY3Qgd2lsbCBiaXNlY3QgdGhlIGJhZCBjb25maWcgbG9va2luZyBmb3IKKyMgIHdoYXQgY29uZmlnIGNhdXNlcyB0aGUgZmFpbHVyZS4KKyMKKyMgIFRoZSB3YXkgaXQgd29ya3MgaXMgdGhpczoKKyMKKyMgICBGaXJzdCBpdCBmaW5kcyBhIGNvbmZpZyB0byB3b3JrIHdpdGguIFNpbmNlIGEgZGlmZmVyZW50IHZlcnNpb24sIG9yCisjICAgTUlOX0NPTkZJRyBtYXkgY2F1c2UgZGlmZmVyZW50IGRlcGVuZGVjaWVzLCBpdCBtdXN0IHJ1biB0aHJvdWdoIHRoaXMKKyMgICBwcmVwYXJhdGlvbi4KKyMKKyMgICBPdmVyd3JpdGVzIGFueSBjb25maWcgc2V0IGluIHRoZSBiYWQgY29uZmlnIHdpdGggYSBjb25maWcgc2V0IGluCisjICAgZWl0aGVyIHRoZSBNSU5fQ09ORklHIG9yIEFERF9DT05GSUcuIFRodXMsIG1ha2Ugc3VyZSB0aGVzZSBjb25maWdzCisjICAgYXJlIG1pbmltYWwgYW5kIGRvIG5vdCBkaXNhYmxlIGNvbmZpZ3MgeW91IHdhbnQgdG8gdGVzdDoKKyMgICAoaWUuICAjIENPTkZJR19GT08gaXMgbm90IHNldCkuCisjCisjICAgQW4gb2xkY29uZmlnIGlzIHJ1biBvbiB0aGUgYmFkIGNvbmZpZyBhbmQgYW55IG5ldyBjb25maWcgdGhhdAorIyAgIGFwcGVhcnMgd2lsbCBiZSBhZGRlZCB0byB0aGUgY29uZmlncyB0byB0ZXN0LgorIworIyAgIEZpbmFsbHksIGl0IGdlbmVyYXRlcyBhIGNvbmZpZyB3aXRoIHRoZSBhYm92ZSByZXN1bHQgYW5kIHJ1bnMgaXQKKyMgICBhZ2FpbiB0aHJvdWdoIG1ha2Ugb2xkY29uZmlnIHRvIHByb2R1Y2UgYSBjb25maWcgdGhhdCBzaG91bGQgYmUKKyMgICBzYXRpc2ZpZWQgYnkga2NvbmZpZy4KKyMKKyMgICBUaGVuIGl0IHN0YXJ0cyB0aGUgYmlzZWN0LgorIworIyAgIFRoZSBjb25maWdzIHRvIHRlc3QgYXJlIGN1dCBpbiBoYWxmLiBJZiBhbGwgdGhlIGNvbmZpZ3MgaW4gdGhpcworIyAgIGhhbGYgZGVwZW5kIG9uIGEgY29uZmlnIGluIHRoZSBvdGhlciBoYWxmLCB0aGVuIHRoZSBvdGhlciBoYWxmCisjICAgaXMgdGVzdGVkIGluc3RlYWQuIElmIG5vIGNvbmZpZ3MgYXJlIGVuYWJsZWQgYnkgZWl0aGVyIGhhbGYsIHRoZW4KKyMgICB0aGlzIG1lYW5zIGEgY2lyY3VsYXIgZGVwZW5kZW5jeSBleGlzdHMgYW5kIHRoZSB0ZXN0IGZhaWxzLgorIworIyAgIEEgY29uZmlnIGlzIGNyZWF0ZWQgd2l0aCB0aGUgdGVzdCBoYWxmLCBhbmQgdGhlIGJpc2VjdCB0ZXN0IGlzIHJ1bi4KKyMKKyMgICBJZiB0aGUgYmlzZWN0IHN1Y2NlZWRzLCB0aGVuIGFsbCBjb25maWdzIGluIHRoZSBnZW5lcmF0ZWQgY29uZmlnCisjICAgYXJlIHJlbW92ZWQgZnJvbSB0aGUgY29uZmlncyB0byB0ZXN0IGFuZCBhZGRlZCB0byB0aGUgY29uZmlncyB0aGF0CisjICAgd2lsbCBiZSBlbmFibGVkIGZvciBhbGwgYnVpbGRzICh0aGV5IHdpbGwgYmUgZW5hYmxlZCwgYnV0IG5vdCBiZSBwYXJ0CisjICAgb2YgdGhlIGNvbmZpZ3MgdG8gZXhhbWluZSkuCisjCisjICAgSWYgdGhlIGJpc2VjdCBmYWlscywgdGhlbiBhbGwgdGVzdCBjb25maWdzIHRoYXQgd2VyZSBub3QgZW5hYmxlZCBieQorIyAgIHRoZSBjb25maWcgZmlsZSBhcmUgcmVtb3ZlZCBmcm9tIHRoZSB0ZXN0LiBUaGVzZSBjb25maWdzIHdpbGwgbm90CisjICAgYmUgZW5hYmxlZCBpbiBmdXR1cmUgdGVzdHMuIFNpbmNlIGN1cnJlbnQgY29uZmlnIGZhaWxlZCwgd2UgY29uc2lkZXIKKyMgICB0aGlzIHRvIGJlIGEgc3Vic2V0IG9mIHRoZSBjb25maWcgdGhhdCB3ZSBzdGFydGVkIHdpdGguCisjCisjICAgV2hlbiB3ZSBhcmUgZG93biB0byBvbmUgY29uZmlnLCBpdCBpcyBjb25zaWRlcmVkIHRoZSBiYWQgY29uZmlnLgorIworIyAgIE5vdGUsIHRoZSBjb25maWcgY2hvc2VuIG1heSBub3QgYmUgdGhlIHRydWUgYmFkIGNvbmZpZy4gRHVlIHRvCisjICAgZGVwZW5kZW5jaWVzIGFuZCBzZWxlY3Rpb25zIG9mIHRoZSBrYnVpbGQgc3lzdGVtLCBtdWxpdHBsZQorIyAgIGNvbmZpZ3MgbWF5IGJlIG5lZWRlZCB0byBjYXVzZSBhIGZhaWx1cmUuIElmIHlvdSBkaXNhYmxlIHRoZQorIyAgIGNvbmZpZyB0aGF0IHdhcyBmb3VuZCBhbmQgcmVzdGFydCB0aGUgdGVzdCwgaWYgdGhlIHRlc3QgZmFpbHMKKyMgICBhZ2FpbiwgaXQgaXMgcmVjb21tZW5kZWQgdG8gcmVydW4gdGhlIGNvbmZpZ19iaXNlY3Qgd2l0aCBhIG5ldworIyAgIGJhZCBjb25maWcgd2l0aG91dCB0aGUgZm91bmQgY29uZmlnIGVuYWJsZWQuCisjCisjICBUaGUgb3B0aW9uIEJVSUxEX1RZUEUgd2lsbCBiZSBpZ25vcmVkLgorIworIyAgQ09ORklHX0JJU0VDVF9UWVBFIGlzIHRoZSB0eXBlIG9mIHRlc3QgdG8gcGVyZm9ybToKKyMJYnVpbGQJLSBiYWQgZmFpbHMgdG8gYnVpbGQKKyMJYm9vdAktIGJhZCBidWlsZHMgYnV0IGZhaWxzIHRvIGJvb3QKKyMJdGVzdAktIGJhZCBib290cyBidXQgZmFpbHMgYSB0ZXN0CisjCisjICAgQ09ORklHX0JJU0VDVCBpcyB0aGUgY29uZmlnIHRoYXQgZmFpbGVkIHRvIGJvb3QKKyMKKyMgRXhhbXBsZToKKyMgICBURVNUX1NUQVJUCisjICAgVEVTVF9UWVBFID0gY29uZmlnX2Jpc2VjdAorIyAgIENPTkZJR19CSVNFQ1RfVFlQRSA9IGJ1aWxkCisjICAgQ09ORklHX0JJU0VDVCA9IC9ob21lL3Rlc3Qvom9uZmlnLWJhZAorIyAgIE1JTl9DT05GSUcgPSAvaG9tZS90ZXN0L2NvbmZpZy1taW4KKyMK