ZGlmZiAtLWdpdCBhL3N0ZC9zaGVsbHMvbWFnaWVyL2FkbWluLmMgYi9zdGQvc2hlbGxzL21hZ2llci9hZG1pbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0MWQxYjcKLS0tIC9kZXYvbnVsbAorKysgYi9zdGQvc2hlbGxzL21hZ2llci9hZG1pbi5jCkBAIC0wLDAgKzEsNDI4IEBACisvLyBNb3JnZW5HcmF1ZW4gTVVEbGliCisvLworLy8gYWRtaW4uYworLy8KKy8vICRJZDogYWRtaW4uYyA4NzU1IDIwMTQtMDQtMjYgMTM6MTM6NDBaIFplc3N0cmEgJAorI3ByYWdtYSBzdHJpY3RfdHlwZXMKKyNwcmFnbWEgc2F2ZV90eXBlcworI3ByYWdtYSByYW5nZV9jaGVjaworI3ByYWdtYSBub19jbG9uZQorI3ByYWdtYSBwZWRhbnRpYworCisjaW5jbHVkZSA8dWRwLmg+CisjaW5jbHVkZSA8d2l6bGV2ZWxzLmg+CisjaW5jbHVkZSA8aW5wdXRfdG8uaD4KKworI2RlZmluZSBORUVEX1BST1RPVFlQRVMKKyNpbmNsdWRlIDxtYWdpZXIuaD4KKyNpbmNsdWRlIDxwbGF5ZXIuaD4KKworaW5oZXJpdCAiL3N0ZC91dGlsL2NpZHIiOworCittaXhlZCBfcXVlcnlfbG9jYWxjbWRzKCkKK3sKKyAgcmV0dXJuICh7KHsidWRwcSIsIl91ZHBxIiwwLExFQVJORVJfTFZMfSksCisgICAgICAgICAgICh7InNodXRkb3duIiwic2h1dF9kb3duX2dhbWUiLDAsQVJDSF9MVkx9KSwKKyAgICAgICAgICAgKHsiYWRkbWFzdGVyIiwiX2FkZG1hc3RlciIsMCxHT0RfTFZMfSksCisgICAgICAgICAgICh7InJlbW92ZW1hc3RlciIsIl9yZW1vdmVtYXN0ZXIiLDAsR09EX0xWTH0pLAorICAgICAgICAgICAoeyJhZGRndWlsZG1hc3RlciIsICJfYWRkZ3VpbGRtYXN0ZXIiLCAwLCBHT0RfTFZMfSksCisgICAgICAgICAgICh7InJlbW92ZWd1aWxkbWFzdGVyIiwgIl9yZW1vdmVndWlsZG1hc3RlciIsIDAsIEdPRF9MVkx9KSwKKyAgICAgICAgICAgKHsic3VlbmRlciIsInNpbm5lcnMiLDAsV0laQVJEX0xWTH0pLAorICAgICAgICAgICAoeyJiYW5pc2giLCJiYW5pc2giLCAwLCBXSVpBUkRfTFZMfSksCisgICAgICAgICAgICh7Im1iYW5pc2giLCJtYmFuaXNoIiwgMCwgV0laQVJEX0xWTH0pLAorICAgICAgICAgICAoeyJ0YmFuaXNoIiwidGJhbmlzaCIsIDAsIFdJWkFSRF9MVkx9KSwKKyAgICAgICAgICAgKHsic2JhbmlzaCIsInNiYW5pc2giLCAwLCBXSVpBUkRfTFZMfSl9KTsKK30KKworc3RhdGljIGludCBfdWRwcShzdHJpbmcgc3RyKQoreworICBzdHJpbmcgcmV0LCBtdWQsIHR5cGU7CisKKyAgaWYgKCEoc3RyPV91bnBhcnNlZF9hcmdzKCkpIHx8IHN0cj09IiIgfHwgc3NjYW5mKHN0ciwiJXMgJXMiLG11ZCx0eXBlKTwyKQorICB7CisgICAgd3JpdGUoIlN5bnRheDogdWRwcSBtdWQgdHlwZVxuIik7CisgICAgcmV0dXJuIDE7CisgIH0KKyAgaWYgKG1lbWJlcigoeyJjb21tYW5kcyIsImVtYWlsIiwiaG9zdHMiLCJpbmV0ZCIsImxpc3QiLCJtdWRfcG9ydCIsInRpbWUiLAorICAgICAgICAgInZlcnNpb24ifSksdHlwZSk9PS0xKQorICAgIHdyaXRlKCJUWVBFczogY29tbWFuZHMsIGVtYWlsLCBob3N0cywgaW5ldGQsIGxpc3QsIG11ZF9wb3J0LCB0aW1lLCB2ZXJzaW9uXG4iKTsKKyAgaWYgKHJldD0oc3RyaW5nKUlORVRELT5fc2VuZF91ZHAobXVkLChbU0VOREVSOmdldHVpZCgpLCBSRVFVRVNUOlFVRVJZLCBEQVRBOnR5cGVdKSwxKSkKKyAgICB3cml0ZShyZXQpOworICBlbHNlCisgICAgd3JpdGUoIkFuZnJhZ2UgYWJnZXNjaGlja3QuXG4iKTsKKyAgcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgc2h1dF9kb3duX2dhbWUoc3RyaW5nIHN0cikKK3sKKyAgaWYgKCFJU19BUkNIKHRoaXNfb2JqZWN0KCkpIHx8IHRoaXNfb2JqZWN0KCkhPXRoaXNfaW50ZXJhY3RpdmUoKSkKKyAgICByZXR1cm4gMDsKKyAgX25vdGlmeV9mYWlsKCJEdSBtdXNzdCBlaW5lbiBHcnVuZCBkYWZ1ZXIgYW5nZWJlbi5cbiIpOworICBpZiAoIXN0cikgcmV0dXJuIDA7CisgIHdyaXRlKCAiRGlyZWt0ZXIgc2h1dGRvd24gbWl0IEdydW5kIFwiIitzdHIrIlwiP1xuIiApOworICBpbnB1dF90bygic2h1dF9kb3duX2dhbWVfMiIsSU5QVVRfUFJPTVBULCAiKGphL25laW4pIDoiLCBzdHIpOworICByZXR1cm4gMTsKK30KKworc3RhdGljIGludCBzaHV0X2Rvd25fZ2FtZV8yKHN0cmluZyBhcmcsc3RyaW5nIHN0cikKK3sKKyAgaWYgKCFJU19BUkNIKHRoaXNfb2JqZWN0KCkpIHx8IHRoaXNfb2JqZWN0KCkhPXRoaXNfaW50ZXJhY3RpdmUoKSkKKyAgICByZXR1cm4gMDsKKyAgaWYoIGFyZyE9ImphIiApIHsKKyAgICB3cml0ZSggIlNodXRkb3duIGFiZ2Vicm9jaGVuLlxuIiApOworICB9IGVsc2UgeworICAgIHNodXRkb3duKHN0cik7CisgIH0KKyAgcmV0dXJuIDE7Cit9CisKKworc3RhdGljIGludCBfYWRkbWFzdGVyKHN0cmluZyBzdHIpCit7CisgIHN0cmluZyBtYXN0ZXIsIGRvbWFpbjsKKworICBpZiAoIUdPRF9TRUNVUklUWSkKKyAgeworICAgIHdyaXRlKCJEYXMgZGFyZnN0IER1IG5pY2h0IVxuIik7CisgICAgcmV0dXJuIDE7CisgIH0KKyAgX25vdGlmeV9mYWlsKCJTeW50YXg6IGFkZG1hc3RlciA8dXNlcj4gPGRvbWFpbj5cbiIpOworICBpZiAoIXN0cikgcmV0dXJuIDA7CisgIGlmIChzc2NhbmYoc3RyLCIlcyAlcyIsbWFzdGVyLGRvbWFpbikhPTIpIHJldHVybiAwOworICBpZiAoIW1hc3RlciB8fCAhZG9tYWluKSByZXR1cm4gMDsKKyAgaWYgKCEiL3NlY3VyZS9tYXN0ZXIiLT5hZGRfZG9tYWluX21hc3RlcihtYXN0ZXIsZG9tYWluKSkKKyAgICB3cml0ZSgiSGF0IG5pY2h0IGZ1bmt0aW9uaWVydC5cbiIpOworICBlbHNlCisgICAgd3JpdGUoIk9rLlxuIik7CisgIHJldHVybiAxOworfQorCitzdGF0aWMgaW50IF9yZW1vdmVtYXN0ZXIoc3RyaW5nIHN0cikKK3sKKyAgc3RyaW5nIG1hc3RlciwgZG9tYWluOworCisgIGlmICghR09EX1NFQ1VSSVRZKQorICB7CisgICAgd3JpdGUoIkRhcyBkYXJmc3QgRHUgbmljaHQhXG4iKTsKKyAgICByZXR1cm4gMTsKKyAgfQorICBfbm90aWZ5X2ZhaWwoIlN5bnRheDogcmVtb3ZlbWFzdGVyIDx1c2VyPiA8ZG9tYWluPlxuIik7CisgIGlmICghc3RyKSByZXR1cm4gMDsKKyAgaWYgKHNzY2FuZihzdHIsIiVzICVzIixtYXN0ZXIsZG9tYWluKSE9MikgcmV0dXJuIDA7CisgIGlmICghbWFzdGVyIHx8ICFkb21haW4pIHJldHVybiAwOworICBpZiAoISIvc2VjdXJlL21hc3RlciItPnJlbW92ZV9kb21haW5fbWFzdGVyKG1hc3Rlcixkb21haW4pKQorICAgIHdyaXRlKCJIYXQgbmljaHQgZnVua3Rpb25pZXJ0LlxuIik7CisgIGVsc2UKKyAgICB3cml0ZSgiT2suXG4iKTsKKyAgcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgX2FkZGd1aWxkbWFzdGVyKHN0cmluZyBzdHIpCit7CisgIHN0cmluZyBtYXN0ZXIsIGd1aWxkOworICAKKyAgaWYgKCFHT0RfU0VDVVJJVFkpCisgIHsKKyAgICB3cml0ZSAoIkRhcyBkYXJmc3QgRHUgbmljaHQhXG4iKTsKKyAgICByZXR1cm4gMTsKKyAgfQorCisgIF9ub3RpZnlfZmFpbCgiU3luYXR4OiBhZGRndWlsZG1hc3RlciA8dXNlcj4gPGd1aWxkPlxuIik7CisgIGlmICghc3RyKSByZXR1cm4gMDsKKyAgaWYgKHNzY2FuZihzdHIsICIlcyAlcyIsIG1hc3RlciwgZ3VpbGQpIT0yKSByZXR1cm4gMDsKKyAgaWYgKCFtYXN0ZXIgfHwgIWd1aWxkKSByZXR1cm4gMDsKKyAgaWYgKCEiL3NlY3VyZS9tYXN0ZXIiLT5hZGRfZ3VpbGRfbWFzdGVyKG1hc3RlcixndWlsZCkpCisgICAgd3JpdGUoIkhhdCBuaWNodCBmdW5rdGlvbmllcnQuXG4iKTsKKyAgZWxzZQorICAgIHdyaXRlICgiT2suXG4iKTsKKyAgcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgX3JlbW92ZWd1aWxkbWFzdGVyKHN0cmluZyBzdHIpCit7CisgIHN0cmluZyBtYXN0ZXIsIGd1aWxkOworICAKKyAgaWYgKCFHT0RfU0VDVVJJVFkpCisgIHsKKyAgICB3cml0ZSAoIkRhcyBkYXJmc3QgRHUgbmljaHQhXG4iKTsKKyAgICByZXR1cm4gMTsKKyAgfQorICBfbm90aWZ5X2ZhaWwoIlN5bnRheDogcmVtb3ZlZ3VpbGRtYXN0ZXIgPHVzZXI+IDxndWlsZD5cbiIpOworICBpZiAoIXN0cikgcmV0dXJuIDA7CisgIGlmIChzc2NhbmYoc3RyLCAiJXMgJXMiLCBtYXN0ZXIsIGd1aWxkKSE9MikgcmV0dXJuIDA7CisgIGlmICghbWFzdGVyIHx8ICFndWlsZCkgcmV0dXJuIDA7CisgIGlmICghIi9zZWN1cmUvbWFzdGVyIi0+cmVtb3ZlX2d1aWxkX21hc3RlcihtYXN0ZXIsZ3VpbGQpKQorICAgIHdyaXRlKCJIYXQgbmljaHQgZnVua3Rpb25pZXJ0LlxuIik7CisgIGVsc2UKKyAgICB3cml0ZSgiT2suXG4iKTsKKyAgcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgc2lubmVycyhzdHJpbmcgYXJnKQoreyAgIHN0cmluZyAqcGFydHM7CisgICAgaW50ICAgIGk7CisKKyAgICBpZiAoICFJU19ERVBVVFkodGhpc19vYmplY3QoKSkgKQorICAgICAgcmV0dXJuIDA7CisKKyAgICBhcmc9X3VucGFyc2VkX2FyZ3MoKXx8YXJnOworCisgICAgbm90aWZ5X2ZhaWwoCisgICAgICAgICJTeW50YXg6IHN1ZW5kZXIgPyAgICAgICAgICAgICAgPT4gTGlzdGUgYWxsZXIgRWluZ2V0cmFnZW5lblxuIisKKyAgICAgICAgIiAgICAgICAgc3VlbmRlciA8bmFtZT4gICAgICAgICA9PiBFaW50cmFlZ2UgbGVzZW5cbiIrCisgICAgICAgICIgICAgICAgIHN1ZW5kZXIgKzxuYW1lPiA8dGV4dD4gPT4gRWludHJhZyBoaW56dWZ1ZWdlblxuIisKKyAgICAgICAgIiAgICAgICAgc3VlbmRlciAtPG5hbWU+IDxucj4gICA9PiBFaW50cmFnIGxvZXNjaGVuXG4iKworICAgICAgICAiICAgICAgICBzdWVuZGVyICEgICAgICAgICAgICAgID0+IEFsbGUgRWludHJhZWdlIGR1bXBlblxuIisKKyAgICAgICAgIiAgICAgICAgc3VlbmRlciAqICAgICAgICAgICAgICA9PiBBbGxlIEVpbnRyYWVnZSBhbnplaWdlblxuIik7CisKKyAgICBpZiAoICFzdHJpbmdwKGFyZykgfHwgKHNpemVvZihhcmcpPDEpICkKKyAgICAgIHJldHVybiAwOworCisgICAgaWYgKCBhcmc9PSI/IiApCisgICAgeworICAgICAgICB3cml0ZShjYWxsX290aGVyKCIvc2VjdXJlL3Npbm1hc3RlciIsIkxpc3RTaW5uZXJzIikpOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisgICAgaWYgKCBhcmc9PSIhIiApCisgICAgeworICAgICAgICB3cml0ZShjYWxsX290aGVyKCIvc2VjdXJlL3Npbm1hc3RlciIsIkR1bXAiKSk7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKyAgICBpZiAoIGFyZz09IioiICkKKyAgICB7CisgICAgICAgIE1vcmUoKHN0cmluZyljYWxsX290aGVyKCIvc2VjdXJlL3Npbm1hc3RlciIsIkR1bXAiLDEpKTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorCisgICAgaWYgKCAoaT1zaXplb2YocGFydHM9ZXhwbG9kZShhcmcsIiAiKSkpPDEgKQorICAgICAgcmV0dXJuIDA7CisKKyAgICBpZiAoIHBhcnRzWzBdWzAuLjBdPT0iLSIgKQorICAgIHsKKyAgICAgIGlmICggaTwyICkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgICB3cml0ZShjYWxsX290aGVyKCIvc2VjdXJlL3Npbm1hc3RlciIsIlJlbW92ZVNpbiIsCisgICAgICAgICAgICBsb3dlcnN0cmluZyhwYXJ0c1swXVsxLi5dKSwKKyAgICAgICAgICAgIHRvX2ludChwYXJ0c1sxXSkpKTsKKyAgICB9CisgICAgZWxzZSBpZiAoIHBhcnRzWzBdWzAuLjBdPT0iKyIgKQorICAgIHsKKyAgICAgIGlmICggaTwyICkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgICB3cml0ZShjYWxsX290aGVyKCIvc2VjdXJlL3Npbm1hc3RlciIsIkFkZFNpbiIsCisgICAgICAgICAgICBsb3dlcnN0cmluZyhwYXJ0c1swXVsxLi5dKSwKKyAgICAgICAgICAgIGltcGxvZGUocGFydHNbMS4uXSwiICIpKSk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICBpZiAoIGk+MSApCisgICAgICAgIHJldHVybiAwOworICAgICAgd3JpdGUoY2FsbF9vdGhlcigiL3NlY3VyZS9zaW5tYXN0ZXIiLCJMaXN0U2lucyIsCisgICAgICAgICAgICBsb3dlcnN0cmluZyhwYXJ0c1swXSkpKTsKKyAgICB9CisgICAgcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgYmFuaXNoKHN0cmluZyBzdHIpCit7CisgIHN0cmluZyBncnVuZCwgbmFtZTsKKyAgaW50IGZvcmNlOworCisgIGlmICggIUxPUkRfU0VDVVJJVFkgJiYgIUlTX0RFUFVUWShzZWN1cmVfZXVpZCgpKSApCisgICAgICByZXR1cm4gMDsKKworICBpZiAoICFzdHIgfHwgIXN0cmluZ3Aoc3RyKSB8fCAhc2l6ZW9mKHN0cikgKSB7CisgICAgICB3cml0ZSgiU3ludGF4OiBiYW5pc2ggWy1mXSA8bmFtZT4gWzxncnVuZD5dXG4iKTsKKyAgICAgIHJldHVybiAxOworICB9CisKKyAgc3RyID0gX3VucGFyc2VkX2FyZ3MoKTsKKworICBpZiAoIGV4cGxvZGUoc3RyLCAiICIpWzBdID09ICItZiIgKXsKKyAgICAgIHN0ciA9IGltcGxvZGUoIGV4cGxvZGUoc3RyLCAiICIpWzEuLl0sICIgIiApOworICAgICAgZm9yY2UgPSAxOworICB9CisKKyAgaWYgKCBzc2NhbmYoIHN0ciwgIiVzICVzIiwgbmFtZSwgZ3J1bmQgKSAhPSAyICkKKyAgICAgIG5hbWU9c3RyOworCisgIGlmICggIW5hbWUgfHwgIXNpemVvZihuYW1lKSApeworICAgIHdyaXRlKCJTeW50YXg6IGJhbmlzaCBbLWZdIDxuYW1lPiBbPGdydW5kPl1cbiIpOworICAgIHJldHVybiAxOworICB9CisKKyAgbmFtZT1sb3dlcl9jYXNlKG5hbWUpOworICAiL3NlY3VyZS9tYXN0ZXIiLT5CYW5pc2hOYW1lKCBuYW1lLCBncnVuZCwgZm9yY2UgKTsKKyAgcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgbWJhbmlzaChzdHJpbmcgc3RyKQoreworICAgIHN0cmluZyBncnVuZCwgbmFtZSwgKm5hbWVuLCB0eHQsICpkdW1teTsKKyAgICBtYXBwaW5nIGxpc3Q7CisgICAgaW50IGk7CisKKyAgICBpZiAoICFJU19ERVBVVFkoc2VjdXJlX2V1aWQoKSkgKQorICAgICAgICByZXR1cm4gMDsKKworICAgIF9ub3RpZnlfZmFpbCggIlN5bnRheDogbWJhbmlzaCA8bmFtZT4gWzxncnVuZD5dXG4iICk7CisKKyAgICBpZiAoICFzdHIgfHwgIXN0cmluZ3Aoc3RyKSB8fCAhc2l6ZW9mKHN0cikgKXsKKyAgICAgICAgaWYgKCAhbWFwcGluZ3AobGlzdCA9IChtYXBwaW5nKSIvc2VjdXJlL21lcmxpbiItPk1CYW5pc2hMaXN0KCkpIHx8CisgICAgICAgICAgICAgIShpID0gc2l6ZW9mKGxpc3QpKSApeworICAgICAgICAgICAgd3JpdGUoICJNb21lbnRhbiBpc3Qga2VpbiBTcGllbGVyIGF1ZiBkZXIgbWJhbmlzaC1MaXN0ZS5cbiIgKTsKKyAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICB9CisKKyAgICAgICAgdHh0ID0gIiAgICAgIE5hbWUgICAgIHwgZ2ViYW5pc2h0IHZvbiB8ICAgICAgICAgICAgICAgICAgICBHcnVuZFxuIiArCisgICAgICAgICAgICAiPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSIgKworICAgICAgICAgICAgIj09PT09PT09PT09PT09PT09PVxuIjsKKworICAgICAgICBuYW1lbiA9IHNvcnRfYXJyYXkoIG1faW5kaWNlcyhsaXN0KSwgIyc8LyonKi8gKTsKKworICAgICAgICBmb3IgKCA7IGktLTsgKXsKKyAgICAgICAgICAgIGR1bW15ID0gZXhwbG9kZSggYnJlYWtfc3RyaW5nKCBsaXN0W25hbWVuW2ldLDBdIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi0tIGtlaW5lIEJlZ3J1ZW5kdW5nIC0tIiwgNDUgKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlxuIiApIC0gKHsiIn0pOworCisgICAgICAgICAgICB0eHQgKz0gc3ByaW50ZiggIiAgJS0xMXMgIHwgICUtMTFzICB8ICAlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXBpdGFsaXplKCBuYW1lbltpXSApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhcGl0YWxpemUoIGxpc3RbbmFtZW5baV0sMV0gfHwgIiIgKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXBpdGFsaXplKCBpbXBsb2RlKCBkdW1teSwgIlxuICAgICAgICAgICAgICAgfCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICAgICAgICAgICAgICAgfCAgIiApICkgKTsKKyAgICAgICAgfQorCisgICAgICAgIE1vcmUodHh0KTsKKworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgICBpZiAoIHNzY2FuZiggc3RyLCAiJXMgJXMiLCBuYW1lLCBncnVuZCApICE9MiApCisgICAgICAgIG5hbWUgPSBzdHI7CisKKyAgICBpZiAoICFuYW1lIHx8ICFzaXplb2YobmFtZSkgKQorICAgICAgICByZXR1cm4gMDsKKworICAgIG5hbWUgPSBsb3dlcl9jYXNlKG5hbWUpOworCisgICAgaWYgKCAhZ3J1bmQgfHwgIXN0cmluZ3AoZ3J1bmQpIHx8IGxvd2VyX2Nhc2UoZ3J1bmQpICE9ICJsb2VzY2hlbiIgKXsKKyAgICAgICAgIi9zZWN1cmUvbWVybGluIi0+TUJhbmlzaEluc2VydCggbmFtZSwgZ3J1bmQsIHRoaXNfaW50ZXJhY3RpdmUoKSApOworICAgICAgICB3cml0ZSggIkR1IHNldHp0ICIrY2FwaXRhbGl6ZShuYW1lKSsiIGF1ZiBkaWUgTUJhbmlzaC1MaXN0ZS5cbiIgKTsKKyAgICB9CisgICAgZWxzZXsKKyAgICAgICAgaWYgKCAhQVJDSF9TRUNVUklUWSApeworICAgICAgICAgICAgd3JpdGUoICJEYXMgZHVlcmZlbiBudXIgRXJ6bWFnaWVyLlxuIiApOworICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIH0KKyAgICAgICAgIi9zZWN1cmUvbWVybGluIi0+TUJhbmlzaERlbGV0ZSggbmFtZSApOworICAgICAgICB3cml0ZSggIkR1IGxvZXNjaHQgIitjYXBpdGFsaXplKG5hbWUpKyIgdm9uIGRlciBNQmFuaXNoLUxpc3RlLlxuIiApOworICAgIH0KKworICAgIHJldHVybiAxOworfQorCisKK3N0YXRpYyBpbnQgdGJhbmlzaCggc3RyaW5nIHN0ciApCit7CisgIHN0cmluZyBuYW1lOworICBpbnQgZGF5czsKKworICBpZiAoICFJU19ERVBVVFkoc2VjdXJlX2V1aWQoKSkgKQorICAgICAgcmV0dXJuIDA7CisKKyAgX25vdGlmeV9mYWlsKCJTeW50YXg6IHRiYW5pc2ggPG5hbWU+IDx0YWdlPlxuIik7CisKKyAgaWYgKCAhc3RyIHx8ICFzdHJpbmdwKHN0cikgfHwgIXNpemVvZihzdHIpICkKKyAgICByZXR1cm4gMDsKKworICBpZiAoIHNzY2FuZihzdHIsIiVzICVkIixuYW1lLGRheXMpICE9IDIgKQorICAgICAgcmV0dXJuIDA7CisKKyAgaWYgKCAhbmFtZSB8fCAhc2l6ZW9mKG5hbWUpICkKKyAgICByZXR1cm4gMDsKKworICBuYW1lID0gbG93ZXJfY2FzZShuYW1lKTsKKworICBpZiAoICEiL3NlY3VyZS9tYXN0ZXIiLT5UQmFuaXNoTmFtZSggbmFtZSwgZGF5cyApICkKKyAgICAgIHJldHVybiAxOworCisgIGlmICggIWRheXMgKQorICAgICAgd3JpdGUoICJPa2F5LCBrZWluZSBTcGllbHBhdXNlIGZ1ZXIgIitjYXBpdGFsaXplKG5hbWUpKyIgbWVoci5cbiIgKTsKKyAgZWxzZQorICAgICAgd3JpdGUoICJEdSB2ZXJwYXNzdCAiK2NhcGl0YWxpemUobmFtZSkrIiBlaW5lIFNwaWVscGF1c2UgZnVlciAiKworICAgICAgICAgICAgIChkYXlzPjAgPyBkYXlzKyIgVGFnZSIgOiAibGFhYWFuZ2UgWmVpdCIpKyIuXG4iICk7CisgIHJldHVybiAxOworfQorCitzdGF0aWMgaW50IHNiYW5pc2goIHN0cmluZyBzdHIgKQoreworICAgIHN0cmluZyBpcDsKKyAgICBpbnQgZGF5czsKKyAgICBtYXBwaW5nIHNpdGVzOworCisgICAgLy8gTWluZGVzdGVucyBMMjYgZnVlciBkaWVzZW4gQmVmZWhsCisgICAgaWYgKCBzZWN1cmVfbGV2ZWwoKSA8PSBET01BSU5NRU1CRVJfTFZMICkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBpZiAoICFzdHIgfHwgIXN0cmluZ3Aoc3RyKSB8fCAhc2l6ZW9mKHN0cikgKXsKKyAgICAgICAgaWYgKCAhc2l6ZW9mKHNpdGVzID0gKG1hcHBpbmcpTUFTVEVSLT5TaXRlQmFuaXNoKCAwLCAwICkpICl7CisgICAgICAgICAgICB3cml0ZSggIkVzIHNpbmQgenVyIFplaXQga2VpbmUgQWRyZXNzZW4gZ2VzcGVycnQhXG4iICk7CisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgfQorCisgICAgICAgIGlwID0gIiAgICAgIEFkcmVzc2UgICAgICB8ICBnZXNwZXJydCBiaXMgICAgICAgICAgICAgICAgIHwgIGdlc3BlcnJ0ICIKKyAgICAgICAgICAgICsgImR1cmNoXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSIKKyAgICAgICAgICAgICsgIj09PT09PT09PT09PT09XG4iOworCisgICAgICAgIGludCAqa2V5cyA9IHNvcnRfYXJyYXkoIG1faW5kaWNlcyhzaXRlcyksICMnPC8qJyovICk7CisKKyAgICAgICAgZm9yZWFjaChpbnQga2V5IDoga2V5cykgeworICAgICAgICAgICAgaXAgKz0gc3ByaW50ZiggIiAgJToxNS1zICB8ICAlOjI3LXMgIHwgICUtc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIElQdjRfaW50MmFkZHIoa2V5KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpdGVzW2tleV0gPiAwID8gZHRpbWUoc2l0ZXNba2V5XSkgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIlN0LiBOaW1tZXJsZWluc3RhZyIsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FwaXRhbGl6ZShzaXRlc1trZXksIDFdKSApOworICAgICAgICB9CisgICAgICAgIHdyaXRlKCBpcCArICJcbiIgKTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorCisgICAgX25vdGlmeV9mYWlsKCJTeW50YXg6IHNiYW5pc2ggPG51bWVyaXNjaGUgaXA+IDx0YWdlPlxuIik7CisKKyAgICBpZiAoIHNzY2FuZiggdGhpc19wbGF5ZXIoKS0+X3VucGFyc2VkX2FyZ3MoKSwgIiVzICVkIiwgaXAsIGRheXMgKSAhPSAyICkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBpZiAoICFpcCB8fCAhc2l6ZW9mKGlwKSApCisgICAgICAgIHJldHVybiAwOworCisvLyAgICBfbm90aWZ5X2ZhaWwoICJVbmd1ZWx0aWdlcyBBZHJlc3MtRm9ybWF0IVxuIiApOworCisgICAgaWYgKCAhZGF5cyApeworICAgICAgICBpbnQgcmVzPShpbnQpTUFTVEVSLT5TaXRlQmFuaXNoKGlwLCAwKTsKKyAgICAgICAgaWYgKCByZXMgPT0gMSApCisgICAgICAgICAgICAgcHJpbnRmKCAiRGllIEFkcmVzc2UgJyVzJyBpc3QgamV0enQgbmljaHQgbWVociBnZXNwZXJydC5cbiIsCisgICAgICAgICAgICAgICAgICAgICBpcCApOworICAgICAgICBlbHNlIGlmICggcmVzID09IDAgKQorICAgICAgICAgICAgIHByaW50ZiggIkRpZSBBZHJlc3NlICclcycgd2FyIGdhciBuaWNodCBnZXNwZXJydCFcbiIsCisgICAgICAgICAgICAgICAgICAgICBpcCApOworICAgICAgICBlbHNlCisgICAgICAgICAgICBwcmludGYoICJEdSBkYXJmc3QgbnVyIGVpZ2VuZSBTcGVycnVuZ2VuIHdpZWRlciBhdWZoZWJlbiFcbiIgKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIGludCByZXM7CisgICAgICAgIGlmICggZGF5cyAhPSAxICYmICFJU19ERVBVVFkoc2VjdXJlX2V1aWQoKSkgKQorICAgICAgICAgICAgd3JpdGUoICJEdSBkYXJmc3QgQWRyZXNzZW4gbnVyIGZ1ZXIgZWluZW4gVGFnIHNwZXJyZW4hXG4iICk7CisgICAgICAgIGVsc2UgaWYgKCAocmVzID0gKGludClNQVNURVItPlNpdGVCYW5pc2goaXAsIGRheXMpKSA9PSAxICkKKyAgICAgICAgICAgICBwcmludGYoICJEaWUgQWRyZXNzZSAnJXMnIGlzdCBqZXR6dCBmdWVyICVzIGdlc3BlcnJ0LlxuIiwKKyAgICAgICAgICAgICAgICAgICAgIGlwLCAoZGF5cyA+IDEgPyBzcHJpbnRmKCAiJWQgVGFnZSIsIGRheXMgKSA6CisgICAgICAgICAgICAgICAgICAgICAgKGRheXMgPiAwID8gImVpbmVuIFRhZyIgOiAiaW1tZXIiKSkgKTsKKyAgICAgICAgZWxzZSBpZiAoIHJlcyA9PSAtMSApCisgICAgICAgICAgICB3cml0ZSggIkR1IGRhcmZzdCAiICsgKExPUkRfU0VDVVJJVFkgPyAiMjU1IElQLUFkcmVzc2VuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICJudXIgZWluemVsbmUgSVAtQWRyZXNzZW4iKSArICIgc3BlcnJlbiFcbiIgKTsKKyAgICAgICAgZWxzZSBpZiAoIHJlcyA9PSAtMiApCisgICAgICAgICAgICB3cml0ZSggIkR1IGhhc3Qgc2Nob24gZ2VudWcgQWRyZXNzZW4gZ2VzcGVycnQhXG4iICk7CisgICAgfQorCisgICAgcmV0dXJuIDE7Cit9CisKZGlmZiAtLWdpdCBhL3N0ZC9zaGVsbHMvbWFnaWVyL2NvbW0uYyBiL3N0ZC9zaGVsbHMvbWFnaWVyL2NvbW0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wY2JkMjY2Ci0tLSAvZGV2L251bGwKKysrIGIvc3RkL3NoZWxscy9tYWdpZXIvY29tbS5jCkBAIC0wLDAgKzEsMTQ5IEBACisvLyBNb3JnZW5HcmF1ZW4gTVVEbGliCisvLworLy8gY29tbS5jCisvLworLy8gJElkOiBjb21tLmMgODc1NSAyMDE0LTA0LTI2IDEzOjEzOjQwWiBaZXNzdHJhICQKKyNwcmFnbWEgc3RyaWN0X3R5cGVzCisjcHJhZ21hIHNhdmVfdHlwZXMKKyNwcmFnbWEgcmFuZ2VfY2hlY2sKKyNwcmFnbWEgbm9fY2xvbmUKKyNwcmFnbWEgcGVkYW50aWMKKworI2luY2x1ZGUgPHdpemxldmVscy5oPgorI2luY2x1ZGUgPG1hZ2llci5oPgorI2RlZmluZSBORUVEX1BST1RPVFlQRVMKKyNpbmNsdWRlIDx0aGluZy9wcm9wZXJ0aWVzLmg+CisjaW5jbHVkZSA8dGhpbmcvZGVzY3JpcHRpb24uaD4KKyNpbmNsdWRlIDxwbGF5ZXIuaD4KKyNpbmNsdWRlIDxwcm9wZXJ0aWVzLmg+CisKKworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAjIyMjIyMjIyMjIworLy8jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIEVDSE9BTEwgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgIyMjIyMjIyMjIyMKKworc3RhdGljIGludCBfZWNob2FsbChzdHJpbmcgc3RyKQoreworICBpZiAoIShzdHI9X3VucGFyc2VkX2FyZ3MoKSkpCisgICAgcmV0dXJuIFVTQUdFKCJlY2hvYWxsIDx0ZXh0PlxuIik7CisgIHN0cj1icmVha19zdHJpbmcoc3RyKTsKKyAgc2hvdXQoc3RyKTsKKyAgcHJpbnRmKHN0cik7CisgIHJldHVybiAxOworfQorCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICMjIyMjIyMjIyMKKy8vIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyBFQ0hPVE8gIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICMjIyMjIyMjIyMKKworc3RhdGljIGludCBfZWNob3RvKHN0cmluZyBzdHIpCit7CisgIG9iamVjdCBvYjsKKyAgc3RyaW5nIHdobzsKKyAgc3RyaW5nIG1zZzsKKworICBpZiAoIShzdHI9X3VucGFyc2VkX2FyZ3MoKSl8fHNzY2FuZihzdHIsICIlcyAlcyIsIHdobywgbXNnKSAhPSAyKQorICAgIHJldHVybiBVU0FHRSgiZWNob3RvIDxzcGllbGVyPiA8dGV4dD5cbiIpOworICBvYiA9IGZpbmRfcGxheWVyKGxvd2VyX2Nhc2Uod2hvKSk7CisgIGlmICghb2IpCisgIHsKKyAgICBwcmludGYoImVjaG90bzogRXMgaXN0IGtlaW4gU3BpZWxlciAnJXMnIGVpbmdlbG9nZ3QuXG4iLHdobyk7CisgICAgcmV0dXJuIDE7CisgIH0KKyAgbXNnPWJyZWFrX3N0cmluZyhtc2csNzgpOworICB0ZWxsX29iamVjdChvYixtc2cpOworICBwcmludGYoIiVzLT4lcyIsb2ItPk5hbWUoV0VOKSxtc2cpOworICByZXR1cm4gMTsKK30KKworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAjIyMjIyMjIyMKKy8vIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyBNRUNITyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICMjIyMjIyMjIworCitzdGF0aWMgaW50IF9tZWNobyhzdHJpbmcgc3RyKSAgeworICBvYmplY3QgKndobzsKKyAgaW50IGk7CisKKyAgaWYgKCFzaXplb2Yoc3RyPV91bnBhcnNlZF9hcmdzKCkpKQorICAgIHJldHVybiBVU0FHRSgibWVjaG8gPHRleHQ+XG4iKTsKKyAgd2hvPXVzZXJzKCk7CisgIGk9c2l6ZW9mKHdobyk7CisgIHdoaWxlKGktLSlpZiAoSVNfTEVBUk5FUih3aG9baV0pKQorICAgICAgdGVsbF9vYmplY3Qod2hvW2ldLCBicmVha19zdHJpbmcoc3RyLDc4KSk7CisgIHJldHVybiAxOworfQorCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIyMjIyMjIworLy8jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyBQSU5HICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICMjIyMjIyMjCisKK3N0YXRpYyBpbnQgX3Bpbmcoc3RyaW5nIHN0cikKK3sKKyAgb2JqZWN0IHBsOworCisgIGlmICghc2l6ZW9mKHN0cikpCisgICAgcmV0dXJuIFVTQUdFKCJwaW5nIDxzcGllbGVybmFtZT5cbiIpOworICBpZiAoIShwbD1maW5kX3BsYXllcihsb3dlcl9jYXNlKHN0cikpKSkKKyAgICByZXR1cm4KKyAgICAgIF9ub3RpZnlfZmFpbChzcHJpbnRmKCJwaW5nOiBTcGllbGVyICVzIG5pY2h0IGdlZnVuZGVuLlxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhcGl0YWxpemUoc3RyKSkpLDA7CisgIHRlbGxfb2JqZWN0KHBsLHNwcmludGYoIiVzIHBpbmd0IERpY2ggYW4uXGFcbiIsY2FwaXRhbGl6ZShnZXR1aWQoKSkpKTsKKyAgcmV0dXJuIHByaW50ZigiUElOR0dHR0dHRyEgREFTIHNvbGx0ZSAlcyBhdWYgRGljaCBhdWZtZXJrc2FtICIKKyAgICAgICAgICAgICAgICAiZ2VtYWNodCBoYWJlbi5cbiIsY2FwaXRhbGl6ZShnZXR1aWQocGwpKSksMTsKK30KKworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAjIyMjIyMjIyMjCisvLyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgT1JPUEFYICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAjIyMjIyMjIyMjCisKK2ludCBfb3JvcGF4KHN0cmluZyBjbWRsaW5lKQoreworICBpbnQgbGV2ZWwsb2xkLG5ldzsKKworICBjbWRsaW5lPV91bnBhcnNlZF9hcmdzKCk7CisgIG9sZD1RdWVyeVByb3AoUF9FQVJNVUZGUyk7CisgIGlmICghc2l6ZW9mKGNtZGxpbmUpfHxjbWRsaW5lPT0iMCIpCisgIHsKKyAgICBpZiAob2xkKQorICAgIHsKKyAgICAgIHByaW50ZigiRHUgbmltbXN0IGRhcyBPcm9wYXggYXVzIERlaW5lbiBPaHJlbiB1bmQgaG9lcnN0ICIKKyAgICAgICAgICAgICAid2llZGVyIGFsbGVuIGFuZGVyZW4genUuXG4iKTsKKyAgICAgIFNldFByb3AoUF9FQVJNVUZGUywgMCk7CisgICAgfQorICAgIGVsc2UKKyAgICAgIHByaW50ZigiRHUgaGFzdCBkb2NoIGdhciBrZWluIE9yb3BheCBpbiBkZW4gT2hyZW4uXG4iKTsKKyAgICByZXR1cm4gMTsKKyAgfQorICBpZiAoc3NjYW5mKGNtZGxpbmUsICIlZCIsIGxldmVsKSA9PSAwIHx8IGxldmVsIDwgMSkKKyAgICByZXR1cm4gVVNBR0UoIm9yb3BheCBbPG1hZ2llcmxldmVsPl1cbiIpOworICBpZiAoKG5ldz1TZXRQcm9wKFBfRUFSTVVGRlMsIGxldmVsKSk9PWxldmVsKQorICB7CisgICAgaWYgKG5ldz09b2xkKQorICAgICAgcmV0dXJuIHByaW50ZigiRHUgaGF0dGVzdCBEZWluZSBPcm9wYXhtZW5nZSBzY2hvbiBhdWYgTWFnaWVybGV2ZWwgIgorICAgICAgICAgICAgICAgICAgICAiJWQgYW5nZXBhc3N0LlxuIixsZXZlbCksMTsKKyAgICBpZiAobmV3Pm9sZCkKKyAgICAgIHJldHVybiBwcmludGYoIkR1IHN0b3Bmc3QgRGlyIHNvdmllbCBPcm9wYXggaW4gZGllIE9ocmVuLCBkYXNzICIKKyAgICAgICAgICAgICAgICAgICAgIkR1IG51ciBub2NoICVzIGFiXG5MZXZlbCAlZCBob2Vyc3QuXG4iLAorICAgICAgICAgICAgICAgICAgICBsZXZlbD49TEVBUk5FUl9MVkw/Ik1hZ2llciI6IlNlaGVyIixsZXZlbCksMTsKKyAgICByZXR1cm4gcHJpbnRmKCJEdSBuaW1tc3Qgc292aWVsIE9yb3BheCBhdXMgZGVuIE9ocmVuLCBkYXNzIER1IGFiICIKKyAgICAgICAgICAgICAgICAgICJzb2ZvcnQgd2llZGVyICVzIGFiXG5MZXZlbCAlZCB2ZXJzdGVoc3QuXG4iLAorICAgICAgICAgICAgICAgICAgbGV2ZWw+PUxFQVJORVJfTFZMPyJNYWdpZXIiOiJTZWhlciIsbGV2ZWwpLDE7CisgIH0KKyAgcmV0dXJuIHByaW50ZigiRHUgc3RvcGZzdCB1bmQgc3RvcGZzdCwgYmlzIERpciBkYXMgT3JvcGF4IHdpZWRlciB6dXIgIgorICAgICAgICAgICAgICAgICJOYXNlIGhlcmF1c2tvbW10LlxuTGVpZGVyIG11c3N0IER1IGRhbWl0IE1hZ2llciBhYiBMZXZlbCAiCisgICAgICAgICAgICAgICAgIiVkIHdlaXRlcmhpbiBob2VyZW4uXG4iLG5ldyksMTsKK30KKworLy8gICAgICAgICAgICAgICAgICAgICAgICAgIyMjIyMjIyMjIyMjIyMjIyMjIworLy8jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyBJTklUSUFMSVNJRVJVTkcgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMKKworc3RhdGljIG1peGVkIF9xdWVyeV9sb2NhbGNtZHMoKQoreworICByZXR1cm4KKyAgICAoeyh7Im9yb3BheCIsIl9vcm9wYXgiLDAsTEVBUk5FUl9MVkx9KSwKKyAgICAgICh7ImVjaG90byIsIl9lY2hvdG8iLDAsTEVBUk5FUl9MVkx9KSwKKyAgICAgICh7ImVjaG9hbGwiLCJfZWNob2FsbCIsMCxMRUFSTkVSX0xWTH0pLAorICAgICAgKHsibWVjaG8iLCJfbWVjaG8iLDAsTEVBUk5FUl9MVkx9KSwKKyAgICAgICh7InBpbmciLCJfcGluZyIsMCxMRUFSTkVSX0xWTH0pfSk7Cit9CmRpZmYgLS1naXQgYS9zdGQvc2hlbGxzL21hZ2llci9maWxlZWRpdC5jIGIvc3RkL3NoZWxscy9tYWdpZXIvZmlsZWVkaXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNGRmMGE1Ci0tLSAvZGV2L251bGwKKysrIGIvc3RkL3NoZWxscy9tYWdpZXIvZmlsZWVkaXQuYwpAQCAtMCwwICsxLDcxOCBAQAorLy8gTW9yZ2VuR3JhdWVuIE1VRGxpYgorLy8KKy8vZmlsZWVkaXQuYworLy8KKy8vICRJZDogZmlsZWVkaXQuYyA5MTQyIDIwMTUtMDItMDQgMjI6MTc6MjlaIFplc3N0cmEgJAorI3ByYWdtYSBzdHJpY3RfdHlwZXMKKyNwcmFnbWEgc2F2ZV90eXBlcworLy8jcHJhZ21hIHJhbmdlX2NoZWNrCisjcHJhZ21hIG5vX2Nsb25lCisjcHJhZ21hIHBlZGFudGljCisKKyNpbmNsdWRlIDx3aXpsZXZlbHMuaD4KKyNpbmNsdWRlIDxpbnB1dF90by5oPgorCisjZGVmaW5lIE5FRURfUFJPVE9UWVBFUworI2luY2x1ZGUgPG1hZ2llci5oPgorI2luY2x1ZGUgPHBsYXllci5oPgorI2luY2x1ZGUgPGZpbGVzLmg+CisKKy8vICAgICAgICAgICAgICAgICAgICAgICAgIyMjIyMjIyMjIyMjIyMjIyMjIworLy8jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIElOSVRJQUxJU0lFUlVORyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworLy8gICAgICAgICAgICAgICAgICAgICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjCisKK21peGVkIF9xdWVyeV9sb2NhbGNtZHMoKQoreworICByZXR1cm4gKHsgKHsiY3AiLCJfY3AiLDAsV0laQVJEX0xWTH0pLAorICAgICAgICAgICAgKHsibXYiLCJfY3AiLDAsV0laQVJEX0xWTH0pLAorICAgICAgICAgICAgKHsicm0iLCJfcm0iLDAsV0laQVJEX0xWTH0pLAorICAgICAgICAgICAgKHsicm1kaXIiLCJfcm1kaXIiLDAsV0laQVJEX0xWTH0pLAorICAgICAgICAgICAgKHsibWtkaXIiLCJfbWtkaXIiLDAsV0laQVJEX0xWTH0pLAorICAgICAgICAgICAgKHsiZWQiLCJfZWQiLDAsV0laQVJEX0xWTH0pfSk7Cit9CisKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMjIyMjIworLy8jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyBFRCAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyMjIyMjCisKKworLy8KKy8vIF9lZF9maWxlOiBNZWhyZXJlIEZpbGVzIGhpbnRlcmVpbmFuZGVyIGVkaXRpZXJlbgorLy8KKworcHJpdmF0ZSBub3NhdmUgc3RyaW5nICpfZWRfY2FjaGU7CisKK3ByaXZhdGUgdm9pZCBfZWRfZmlsZSgpCit7CisgIGlmICghc2l6ZW9mKF9lZF9jYWNoZSkpIHJldHVybjsKKyAgcHJpbnRmKCJlZDogTmFlY2hzdGUgRGF0ZWk6ICVzXG4iLF9lZF9jYWNoZVswXSk7CisgIGVkKF9lZF9jYWNoZVswXSwiX2VkX2ZpbGUiKTsKKyAgX2VkX2NhY2hlPV9lZF9jYWNoZVsxLi5dOworICByZXR1cm47Cit9CisKKyNpZiBfX1ZFUlNJT05fXyA8ICIzLjIuOSIKK3ByaXZhdGUgbWl4ZWQgX2VkX3NpemVfZmlsdGVyKG1peGVkICphcmcpCit7CisgIGlmIChhcmdbRklMRVNJWkVdPj0tMSkgcmV0dXJuIGFyZ1tGVUxMTkFNRV07CisgIHByaW50ZigiJXMgaXN0IGVpbiBWZXJ6ZWljaG5pcy5cbiIsYXJnW0ZVTExOQU1FXSk7CisgIHJldHVybiAwOworfQorI2VuZGlmCisKKy8vCisvLyBfbW9yZTogRGF0ZWllbiBhbnplaWdlbgorLy8gY21kbGluZTogS29tbWFuZG96ZWlsZQorLy8KKworc3RhdGljIGludCBfZWQoc3RyaW5nIGNtZGxpbmUpCit7CisgIG1peGVkICphcmdzLCphcmdzMjsKKyAgaW50IGZsYWdzLGksYXJnX3NpemU7CisgIGNtZGxpbmU9X3VucGFyc2VkX2FyZ3MoKTsKKyAgYXJncz1wYXJzZWFyZ3MoY21kbGluZSwmZmxhZ3MsIiIsMSk7CisgIGlmIChmbGFncz09LTF8fCEoYXJnX3NpemU9c2l6ZW9mKGFyZ3MpKSkKKyAgICByZXR1cm4gVVNBR0UoImVkIDxkYXRlaT4gWzxkYXRlaTI+Li5dIik7CisgIHdoaWxlKGFyZ19zaXplLS0pCisgIHsKKyAgICBpZiAoc2l6ZW9mKGFyZ3MyPWZpbGVfbGlzdChhcmdzW2FyZ19zaXplLi5hcmdfc2l6ZV0sTU9ERV9FRCwwLCIvIikpKQorICAgICAgYXJnc1thcmdfc2l6ZS4uYXJnX3NpemVdPWFyZ3MyOworICAgIGVsc2UKKyAgICAgIGFyZ3NbYXJnX3NpemVdPSh7ICIiICwgLTEsIDAgLCAoc3RyaW5nKQorICAgICAgICAgICAgICBjYWxsX290aGVyKG1hc3RlcigpLCJfZ2V0X3BhdGgiLGFyZ3NbYXJnX3NpemVdLAorICAgICAgICAgICAgICAgICAgZ2V0dWlkKCkpfSk7CisgIH0KKyNpZiBfX1ZFUlNJT05fXyA8ICIzLjIuOSIKKyAgYXJncz1tYXAoYXJncywjJ19lZF9zaXplX2ZpbHRlciktKHswfSk7CisjZWxzZQorICBhcmdzPW1hcChhcmdzLCg6CisgICAgICAgICAgaWYgKCQxW0ZJTEVTSVpFXT49LTEpIHJldHVybiAkMVtGVUxMTkFNRV07CisgICAgICAgICAgcHJpbnRmKCIlcyBpc3QgZWluIFZlcnplaWNobmlzLlxuIiwkMVtGVUxMTkFNRV0pOworICAgICAgICAgIHJldHVybiAwOyA6KSktKHswfSk7CisjZW5kaWYKKyAgaWYgKGZsYWdzPT0tMXx8IXNpemVvZihhcmdzKSkgcmV0dXJuIFVTQUdFKCJlZCA8ZGF0ZWk+IFs8ZGF0ZWkyPi4uXSIpOworICBfZWRfY2FjaGU9YXJnczsKKyAgX2VkX2ZpbGUoKTsKKyAgcmV0dXJuIDE7Cit9CisKKworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICMjIyMjIyMjIyMjCisvLyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyBDUCAmIE1WICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyMjIyMjIyMjIyMKKworc3RhdGljIHZvaWQgX2NwX2Fza19jb3B5KG1peGVkICpmaWxlZGF0YSxpbnQgZHVtbXksIGludCBmbGFncyk7CitzdGF0aWMgdm9pZCBfY3BfYXNrX292ZXJ3cml0ZShtaXhlZCAqZmlsZWRhdGEsIGludCBtb2RlLCBpbnQgZmxhZ3MpOworc3RhdGljIHZvaWQgX212X2Fza19vdmVyd3JpdGUobWl4ZWQgKmZpbGVkYXRhLCBpbnQgbW9kZSwgaW50IGZsYWdzKTsKKworc3RhdGljIG1peGVkIGNwX2ZpbGUobWl4ZWQgZmlsZWRhdGEsaW50IG1vdmUsaW50IGZsYWdzLCBtaXhlZCAqZG9fZGVsZXRlKQoreworICBzdHJpbmcgc291cmNlLGRlc3Q7CisgIHNvdXJjZT0oc3RyaW5nKWZpbGVkYXRhW0ZVTExOQU1FXTsKKyAgZGVzdD0oc3RyaW5nKWZpbGVkYXRhW0RFU1ROQU1FXTsKKyAgaWYgKHNvdXJjZT09ZGVzdCkgcmV0dXJuIEVSUk9SKFNBTUVfRklMRSxzb3VyY2UsUkVUX0ZBSUwpOworICBpZiAoIU1BWV9SRUFEKHNvdXJjZSkpIHJldHVybiBFUlJPUihOT19SRUFELHNvdXJjZSxSRVRfSlVNUCk7CisgIGlmICghTUFZX1dSSVRFKGRlc3QpKSByZXR1cm4gRVJST1IoTk9fV1JJVEUsZGVzdCxSRVRfSlVNUCk7CisgIGlmIChmaWxlZGF0YVtGSUxFU0laRV09PS0xKSByZXR1cm4gRVJST1IoRE9FU05UX0VYSVNULHNvdXJjZSxSRVRfSlVNUCk7CisgIGlmIChmaWxlZGF0YVtGSUxFU0laRV09PS0yKSAvLyBRdWVsbGUgaXN0IFZlcnplaWNobmlzCisgIHsKKyAgICBzd2l0Y2goZmlsZV9zaXplKGRlc3QpKQorICAgIHsKKyAgICAgIGNhc2UgLTE6CisgICAgICAgIGlmIChtb3ZlKQorICAgICAgICB7CisgICAgICAgICAgaWYgKHJlbmFtZShzb3VyY2UsZGVzdCkpIHJldHVybiBFUlJPUihOT19DUkVBVEVfRElSLGRlc3QsUkVUX0pVTVApOworICAgICAgICAgIGlmIChmbGFncyZDUF9WKSBwcmludGYoRklMRV9NT1ZFRCxzb3VyY2UpOworICAgICAgICAgIHJldHVybiBSRVRfSlVNUDsKKyAgICAgICAgfQorICAgICAgICBpZiAoIW1rZGlyKGRlc3QpKSByZXR1cm4gRVJST1IoTk9fQ1JFQVRFX0RJUixkZXN0LFJFVF9KVU1QKTsKKyAgICAgICAgaWYgKGZsYWdzJkNQX1YpIHByaW50ZihESVJfQ1JFQVRFRCxkZXN0KTsKKyAgICAgIGNhc2UgLTI6CisgICAgICAgIGlmICghbW92ZSkgcmV0dXJuIFJFVF9PSzsKKyAgICAgICAgaWYgKGZpbGVkYXRhW1NVQkRJUlNJWkVdPjApIHJldHVybiBSRVRfREVMRVRFOworICAgICAgICBpZiAoIXJtZGlyKHNvdXJjZSkpIHJldHVybiBFUlJPUihOT19ERUxFVEUsc291cmNlLFJFVF9GQUlMKTsKKyAgICAgICAgaWYgKGZsYWdzJk1WX1YpIHByaW50ZigibXY6ICVzOiBRdWVsbHZlcnplaWNobmlzIHd1cmRlICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZ2Vsb2VzY2h0LlxuIixzb3VyY2UpOworICAgICAgICByZXR1cm4gUkVUX09LOyAgICAKKyAgICAgIGRlZmF1bHQ6ICByZXR1cm4gRVJST1IoTk9fRElSUyxkZXN0LFJFVF9KVU1QKTsKKyAgICB9CisgIH0KKyAgc3dpdGNoKGZpbGVfc2l6ZShkZXN0KSkKKyAgeworICAgIGNhc2UgLTI6IHJldHVybiBFUlJPUihERVNUX0lTX0RJUixkZXN0LFJFVF9GQUlMKTsKKyAgICBkZWZhdWx0OgorICAgICAgaWYgKGZsYWdzJkNQX0YpCisgICAgICB7CisgICAgICAgIGlmICghcm0oZGVzdCkpIHJldHVybiBFUlJPUihERVNUX05PX0RFTEVURSxkZXN0LFJFVF9GQUlMKTsKKyAgICAgICAgaWYgKGZsYWdzJkNQX1YpIHByaW50ZihGSUxFX0RFTEVURUQsZGVzdCk7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIGlmIChtb3ZlKSByZXR1cm4gIydfbXZfYXNrX292ZXJ3cml0ZTsKKyAgICAgICAgZWxzZSByZXR1cm4gIydfY3BfYXNrX292ZXJ3cml0ZTsKKyAgICAgIH0KKyAgICBjYXNlIC0xOgorICAgICAgaWYgKG1vdmUpCisgICAgICB7CisgICAgICAgIGlmIChyZW5hbWUoc291cmNlLGRlc3QpKSByZXR1cm4gRVJST1IoTk9fTU9WRSxzb3VyY2UsUkVUX0ZBSUwpOworICAgICAgICBpZiAoZmxhZ3MmQ1BfVikgcHJpbnRmKEZJTEVfTU9WRUQsc291cmNlKTsKKyAgICAgICAgcmV0dXJuIFJFVF9PSzsKKyAgICAgIH0KKyAgICAgIGlmIChjb3B5X2ZpbGUoc291cmNlLGRlc3QpKSByZXR1cm4gRVJST1IoTk9fQ09QWSxzb3VyY2UsUkVUX0ZBSUwpOworICAgICAgaWYgKGZsYWdzJkNQX1YpIHByaW50ZihGSUxFX0NPUElFRCxzb3VyY2UpOworICAgICAgcmV0dXJuIFJFVF9PSzsKKyAgfQorICByZXR1cm4gMDsgLy8gbm90LXJlYWNoZWQKK30KKworc3RhdGljIHZvaWQgX2NwX2Fza19vdmVyd3JpdGUyKHN0cmluZyBpbnB1dCwgbWl4ZWQgKmZpbGVkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbnRlcmFjdGl2ZSxpbnQgZmxhZ3MsaW50IG1vdmUpCit7CisgIGlmICghc2l6ZW9mKGlucHV0KSkgaW5wdXQ9IiAiOworICBpbnB1dD1sb3dlcl9jYXNlKGlucHV0KTsKKyAgc3dpdGNoKGlucHV0WzBdKQorICB7CisgICAgY2FzZSAncSc6CisgICAgICBwcmludGYoIiVzIGFiZ2Vicm9jaGVuIVxuIixtb3ZlPyJCZXdlZ2VuIjoiS29waWVyZW4iKTsKKyAgICAgIHJldHVybjsKKyAgICBjYXNlICdhJzoKKyAgICAgIGZsYWdzfD1DUF9GOworICAgICAgaWYgKCEoZmxhZ3MmQ1BfSSkpCisgICAgICB7CisgICAgICAgIGFzeW5jaHJvbihmaWxlZGF0YSwjJ2NwX2ZpbGUsbW92ZSxmbGFncywwKTsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorICAgIGNhc2UgJ3knOgorICAgIGNhc2UgJ2onOgorICAgICAgaWYgKCFybShmaWxlZGF0YVswXVtERVNUTkFNRV0pKQorICAgICAgICBwcmludGYoREVTVF9OT19ERUxFVEUgIlVlYmVyZ2VoZSBEYXRlaS4uLlxuIixmaWxlZGF0YVswXVtERVNUTkFNRV0pOworICAgICAgZWxzZQorICAgICAgeworICAgICAgICBpZiAoZmxhZ3MmQ1BfVikgcHJpbnRmKEZJTEVfREVMRVRFRCxmaWxlZGF0YVswXVtERVNUTkFNRV0pOworICAgICAgICBpZiAobW92ZSkKKyAgICAgICAgeworICAgICAgICAgIGlmIChyZW5hbWUoZmlsZWRhdGFbMF1bRlVMTE5BTUVdLGZpbGVkYXRhWzBdW0RFU1ROQU1FXSkpCisgICAgICAgICAgICBwcmludGYoTk9fTU9WRSAiVWViZXJnZWhlIERhdGVpLi4uXG4iLGZpbGVkYXRhWzBdW0ZVTExOQU1FXSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgaWYgKGNvcHlfZmlsZShmaWxlZGF0YVswXVtGVUxMTkFNRV0sZmlsZWRhdGFbMF1bREVTVE5BTUVdKSkKKyAgICAgICAgICAgIHByaW50ZihOT19DT1BZICJVZWJlcmdlaGUgRGF0ZWkuLi5cbiIsZmlsZWRhdGFbMF1bRlVMTE5BTUVdKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIGNhc2UgJ24nOgorICAgICAgaWYgKGZsYWdzJkNQX0kpCisgICAgICAgIF9jcF9hc2tfY29weShmaWxlZGF0YVsxK2ZpbGVkYXRhWzBdW1NVQkRJUlNJWkVdLi5dLG1vdmUsZmxhZ3MpOworICAgICAgZWxzZQorICAgICAgICBhc3luY2hyb24oZmlsZWRhdGFbMStmaWxlZGF0YVswXVtTVUJESVJTSVpFXS4uXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjJ2NwX2ZpbGUsbW92ZSxmbGFncywwKTsKKyAgICAgIHJldHVybjsKKyAgICBkZWZhdWx0OgorICAgICAgcHJpbnRmKCJLb21tYW5kbyBuaWNodCB2ZXJzdGFuZGVuLlxuIik7CisgICAgICBfY3BfYXNrX292ZXJ3cml0ZShmaWxlZGF0YSxpbnRlcmFjdGl2ZSxmbGFncyk7CisgICAgICByZXR1cm47CisgIH0KKworfQorCitzdGF0aWMgdm9pZCBfY3BfYXNrX292ZXJ3cml0ZShtaXhlZCAqZmlsZWRhdGEsIGludCBpbnRlcmFjdGl2ZSwgaW50IGZsYWdzKQoreworICBwcmludGYoIkRpZSBEYXRlaSAnJXMnIGV4aXN0aWVydCBzY2hvbi5cbiIsCisgICAgICAgICBmaWxlZGF0YVswXVtERVNUTkFNRV0pOworICBpbnB1dF90bygiX2NwX2Fza19vdmVyd3JpdGUyIixJTlBVVF9QUk9NUFQsIlVlYmVyc2NocmVpYmVuPyAoaixuLGEscSk6ICIsCisgICAgICBmaWxlZGF0YSxpbnRlcmFjdGl2ZSxmbGFncywwKTsKKyAgcmV0dXJuOworfQorCitzdGF0aWMgdm9pZCBfbXZfYXNrX292ZXJ3cml0ZShtaXhlZCAqZmlsZWRhdGEsIGludCBpbnRlcmFjdGl2ZSwgaW50IGZsYWdzKQoreworICBwcmludGYoIkRpZSBEYXRlaSAnJXMnIGV4aXN0aWVydCBzY2hvbi4iLAorICAgICAgICAgZmlsZWRhdGFbMF1bREVTVE5BTUVdKTsKKyAgaW5wdXRfdG8oIl9jcF9hc2tfb3ZlcndyaXRlMiIsSU5QVVRfUFJPTVBULCJVZWJlcnNjaHJlaWJlbj8gKGosbixhLHEpOiAiLAorICAgICAgZmlsZWRhdGEsaW50ZXJhY3RpdmUsZmxhZ3MsMSk7CisgIHJldHVybjsKK30KKworc3RhdGljIHZvaWQgX2NwX2Fza19jb3B5MihzdHJpbmcgaW5wdXQsbWl4ZWQgKmZpbGVkYXRhLGludCBtb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZsYWdzLGludCBtb3ZlKQoreworICBpZiAoIXNpemVvZihpbnB1dCkpIGlucHV0PSIgIjsKKyAgaW5wdXQ9bG93ZXJfY2FzZShpbnB1dCk7CisgIHN3aXRjaChpbnB1dFswXSkKKyAgeworICAgIGNhc2UgJ3knOgorICAgIGNhc2UgJ2onOgorICAgICAgaWYgKG1vZGU9PTEpCisgICAgICB7CisgICAgICAgIGlmICghKGZsYWdzJkNQX0YpKQorICAgICAgICB7CisgICAgICAgICAgaWYgKG1vdmUpIF9tdl9hc2tfb3ZlcndyaXRlKGZpbGVkYXRhLDEsZmxhZ3MpOworICAgICAgICAgIGVsc2UgICAgICBfY3BfYXNrX292ZXJ3cml0ZShmaWxlZGF0YSwxLGZsYWdzKTsKKyAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFybShmaWxlZGF0YVswXVtERVNUTkFNRV0pKQorICAgICAgICB7CisgICAgICAgICAgcHJpbnRmKERFU1RfTk9fREVMRVRFICJVZWJlcmdlaGUgRGF0ZWkuLi5cbiIsCisgICAgICAgICAgICAgICAgIGZpbGVkYXRhWzBdW0RFU1ROQU1FXSk7CisgICAgICAgICAgX2NwX2Fza19jb3B5KGZpbGVkYXRhWzEuLl0sbW92ZSxmbGFncyk7CisgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGlmIChmbGFncyZDUF9WKSBwcmludGYoRklMRV9ERUxFVEVELGZpbGVkYXRhWzBdW0RFU1ROQU1FXSk7CisgICAgICB9CisgICAgICBpZiAobW9kZTwyKQorICAgICAgeworICAgICAgICBpZiAobW92ZSkgcmVuYW1lKGZpbGVkYXRhWzBdW0ZVTExOQU1FXSxmaWxlZGF0YVswXVtERVNUTkFNRV0pOworICAgICAgICBlbHNlIGNvcHlfZmlsZShmaWxlZGF0YVswXVtGVUxMTkFNRV0sZmlsZWRhdGFbMF1bREVTVE5BTUVdKTsKKyAgICAgICAgX2NwX2Fza19jb3B5KGZpbGVkYXRhWzEuLl0sbW92ZSxmbGFncyk7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKyAgICAgIGlmIChtb2RlPT0yKQorICAgICAgeworICAgICAgICBpZiAobW92ZSkKKyAgICAgICAgeworICAgICAgICAgIGlmIChyZW5hbWUoZmlsZWRhdGFbMF1bRlVMTE5BTUVdLGZpbGVkYXRhWzBdW0RFU1ROQU1FXSkpCisgICAgICAgICAgICBwcmludGYoTk9fTU9WRSAiVWViZXJnZWhlIFZlcnplaWNobmlzLi4uXG4iLAorICAgICAgICAgICAgICAgICAgIGZpbGVkYXRhWzBdW0ZVTExOQU1FXSk7CisgICAgICAgICAgX2NwX2Fza19jb3B5KGZpbGVkYXRhWzErZmlsZWRhdGFbMF1bU1VCRElSU0laRV0uLl0sbW92ZSxmbGFncyk7CisgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGlmIChta2RpcihmaWxlZGF0YVswXVtERVNUTkFNRV0pKQorICAgICAgICB7CisgICAgICAgICAgX2NwX2Fza19jb3B5KGZpbGVkYXRhWzEuLl0sMCxmbGFncyk7CisgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIHByaW50ZihOT19DUkVBVEVfRElSICJVZWJlcmdlaGUgVmVyemVpY2huaXMuLi5cbiIsCisgICAgICAgICAgICAgICBmaWxlZGF0YVswXVtERVNUTkFNRV0pOworICAgICAgfQorICAgIGNhc2UgJ24nOgorICAgICAgX2NwX2Fza19jb3B5KGZpbGVkYXRhWygxK2ZpbGVkYXRhWzBdW1NVQkRJUlNJWkVdKS4uXSwwLGZsYWdzKTsKKyAgICAgIHJldHVybjsKKyAgICBjYXNlICdxJzoKKyAgICAgIHByaW50ZigiS29waWVyZW4gYWJnZWJyb2NoZW4hXG4iKTsKKyAgICAgIHJldHVybjsKKyAgICBjYXNlICdhJzoKKyAgICAgIGZsYWdzJj1+Q1BfSTsKKyAgICAgIGFzeW5jaHJvbihmaWxlZGF0YSwjJ2NwX2ZpbGUsbW92ZSxmbGFncywwKTsKKyAgICAgIHJldHVybjsKKyAgICBkZWZhdWx0OgorICAgICAgcHJpbnRmKCJLb21tYW5kbyBuaWNodCB2ZXJzdGFuZGVuLlxuIik7CisgICAgICBfY3BfYXNrX2NvcHkoZmlsZWRhdGEsMCxmbGFncyk7CisgICAgICByZXR1cm47CisgIH0KK30KKworc3RhdGljIHZvaWQgX2NwX2Fza19jb3B5KG1peGVkICpmaWxlZGF0YSxpbnQgbW92ZSwgaW50IGZsYWdzKQoreworICBtaXhlZCBkYXRhOworICBzdHJpbmcgZGVzdCxzb3VyY2U7CisgIGludCBkZWxldGVfc3VicyxqdW1wOworCisgIGlmKCFzaXplb2YoZmlsZWRhdGEpKQorICB7CisgICAgcHJpbnRmKCIlczogYWJnZXNjaGxvc3Nlbi5cbiIsbW92ZT8ibXYiOiJjcCIpOworICAgIHJldHVybjsgCisgIH0KKyAgZGVzdD1maWxlZGF0YVswXVtERVNUTkFNRV07CisgIHNvdXJjZT1maWxlZGF0YVswXVtGVUxMTkFNRV07CisgIHN3aXRjaCgwKSAgIC8vIGJyZWFrIHdpcmt0IGRhbWl0IHdpZSBlaW4gZ290byBlbmRfb2Zfc3dpdGNoCisgIHsKKyAgICBkZWZhdWx0OgorICAgIGNhc2UgMDogLy8gU2lubmxvcywgYWJlciBlciBjb21waWxpZXJ0IHNvbnN0IG5pY2h0IDooCisgICAgICBqdW1wPWZpbGVkYXRhWzBdW1NVQkRJUlNJWkVdOworICAgICAgaWYgKHNvdXJjZT09ZGVzdCkKKyAgICAgIHsKKyAgICAgICAgcHJpbnRmKFNBTUVfRklMRSxzb3VyY2UpOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGlmICghTUFZX1JFQUQoc291cmNlKSkKKyAgICAgIHsKKyAgICAgICAgcHJpbnRmKE5PX1JFQUQsc291cmNlKTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBpZiAoIU1BWV9XUklURShkZXN0KSkKKyAgICAgIHsKKyAgICAgICAgcHJpbnRmKE5PX1dSSVRFLGRlc3QpOworICAgICAgICBqdW1wPTA7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgaWYgKGZpbGVkYXRhWzBdW0ZJTEVTSVpFXT09LTEpCisgICAgICB7CisgICAgICAgIHByaW50ZihET0VTTlRfRVhJU1Qsc291cmNlKTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBpZiAoZmlsZWRhdGFbMF1bRklMRVNJWkVdPT0tMikgLy8gUXVlbGxlIGlzdCBWZXJ6ZWljaG5pcworICAgICAgeworICAgICAgICBpZiAoZmlsZV9zaXplKGRlc3QpPi0xKQorICAgICAgICB7CisgICAgICAgICAgcHJpbnRmKE5PX0RJUlMsZGVzdCk7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGZpbGVfc2l6ZShkZXN0KT09LTIpCisgICAgICAgIHsKKyAgICAgICAgICBqdW1wPTA7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgcHJpbnRmKCJWZXJ6ZWljaG5pcyAnJXMnICVzP1xuIixzb3VyY2UsCisgICAgICAgICAgICAgICBtb3ZlPyJiZXdlZ2VuIjoia29waWVyZW4iKTsKKyAgICAgICAgaW5wdXRfdG8oIl9jcF9hc2tfY29weTIiLElOUFVUX1BST01QVCwgIihqLG4sYSxxKSAiLAorICAgICAgICAgICAgZmlsZWRhdGEsMixmbGFncyxtb3ZlKTsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorICAgICAgaWYgKGZpbGVfc2l6ZShkZXN0KT09LTIpCisgICAgICB7CisgICAgICAgIHByaW50ZihERVNUX0lTX0RJUixkZXN0KTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBwcmludGYoIiclcycgJXM/XG4iLHNvdXJjZSxtb3ZlPyJiZXdlZ2VuIjoia29waWVyZW4iKTsKKyAgICAgIGlucHV0X3RvKCJfY3BfYXNrX2NvcHkyIixJTlBVVF9QUk9NUFQsICIoaixuLGEscSkgIiwKKyAgICAgICAgICBmaWxlZGF0YSwoZmlsZV9zaXplKGRlc3QpIT0tMSksZmxhZ3MsbW92ZSk7CisgICAgICByZXR1cm47CisgIH0KKyAgX2NwX2Fza19jb3B5KGZpbGVkYXRhWzEranVtcC4uXSxtb3ZlLGZsYWdzKTsKKyAgcmV0dXJuOworfQorCisKK3N0YXRpYyBpbnQgX2NwKHN0cmluZyBjbWRsaW5lKQoreworICBtaXhlZCAqYXJnczsKKyAgaW50IGZsYWdzOworICBzdHJpbmcgbWFzazsKKyAgc3RyaW5nIGRlc3QsKmRlc3QyOworICBjbWRsaW5lPV91bnBhcnNlZF9hcmdzKCk7CisgIGFyZ3M9cGFyc2VhcmdzKGNtZGxpbmUsJmZsYWdzLENQX09QVFMsMCk7CisgIGlmIChmbGFncz09LTF8fCFzaXplb2YoYXJncykpCisgICAgcmV0dXJuIFVTQUdFKHF1ZXJ5X3ZlcmIoKSsiIFstIiBDUF9PUFRTCisgICAgICAgICAgICAgICAgICJdIDxkYXRlaS92ZXJ6PiBbPGRhdGVpMi92ZXJ6Mj4gLi4uIF0gPHppZWw+IFs8bWFza2U+XSIpOworICBpZiAoZmxhZ3MmQ1BfTSkKKyAgeworICAgIG1hc2s9YXJnc1s8MV07CisgICAgYXJncz1hcmdzWzAuLjwyXTsKKyAgfQorICBpZiAoIWRlc3Q9dG9fZmlsZW5hbWUoYXJnc1s8MV0pKQorICAgICByZXR1cm4gVVNBR0UocXVlcnlfdmVyYigpKyIgWy0iIENQX09QVFMKKyAgICAgICAgICAiXSA8ZGF0ZWkvdmVyej4gWzxkYXRlaTIvdmVyejI+IC4uLiBdIDx6aWVsPiBbPG1hc2tlPl0iKTsKKyAgaWYgKGZpbGVfc2l6ZShkZXN0KT09LTEpCisgIHsKKyAgICBkZXN0Mj1leHBsb2RlKGRlc3QsIi8iKTsKKyAgICBpZiAoZmlsZV9zaXplKGltcGxvZGUoZGVzdDJbMC4uPDJdLCIvIikpPT0tMikKKyAgICB7CisgICAgICBpZiAoZGVzdDJbPDFdPT0iKiIpCisgICAgICAgIGRlc3Q9aW1wbG9kZShkZXN0MlswLi48Ml0sIi8iKTsKKyAgICAgIGVsc2UKKyAgICAgICAgaWYgKG1lbWJlcihkZXN0Mls8MV0sJyonKT4tMXx8CisgICAgICAgICAgICBtZW1iZXIoZGVzdDJbPDFdLCc/Jyk+LTEpCisgICAgICAgICByZXR1cm4gbm90aWZ5X2ZhaWwoCisgICAgICAgICAgc3ByaW50ZigiJXM6IEtlaW5lICogdW5kID8gaW0gWmllbG5hbWVuIGVybGF1YnQuXG4iLHF1ZXJ5X3ZlcmIoKSkpLDA7CisgICAgfQorICAgIGVsc2UKKyAgICAgIHJldHVybiBub3RpZnlfZmFpbCgKKyAgICAgICAgc3ByaW50ZigiJXM6IERlciBhbmdlZ2ViZW5lIFppZWxwZmFkIGV4aXN0aWVydCBuaWNodC5cbiIsCisgICAgICAgICAgICAgICAgcXVlcnlfdmVyYigpKSksMDsKKyAgfQorICBhcmdzPWFyZ3NbMC4uPDJdOworICBpZiAoZmlsZV9zaXplKGRlc3QpIT0tMiYmc2l6ZW9mKGFyZ3MpPjEpCisgICAgcmV0dXJuIG5vdGlmeV9mYWlsKAorICAgICAgICBzcHJpbnRmKCIlczogQmVpIG1laHJlcmVuIFF1ZWxsZW4gbXVzcyBkYXMgWmllbCBlaW4gVmVyemVpY2huaXMgIgorICAgICAgICAgICAgICAgICJzZWluLlxuIixxdWVyeV92ZXJiKCkpKSwwOworICBpZiAoIXNpemVvZihhcmdzPW1hcChhcmdzLCMndG9fZmlsZW5hbWUpLSh7MH0pKSkKKyAgICByZXR1cm4gVVNBR0UocXVlcnlfdmVyYigpKyIgWy0iIENQX09QVFMKKyAgICAgICAgICAiXSA8ZGF0ZWkvdmVyej4gWzxkYXRlaTIvdmVyejI+IC4uLiBdIDx6aWVsPiBbPG1hc2tlPl0iKTsKKyAgLy8gREVCVUcoIkRFU1Q6ICIgKyBkZXN0ICsgIiA6IEZMQUdTOiAiICsgZmxhZ3MpOworICBhcmdzPWZpbGVfbGlzdChhcmdzLE1PREVfQ1AsKGZsYWdzJkNQX1IpLGRlc3QrIi8iLG1hc2spOworICBpZiAoIXNpemVvZihhcmdzKSkKKyAgICByZXR1cm4gbm90aWZ5X2ZhaWwoc3ByaW50ZigiJXM6IEtlaW5lIHBhc3NlbmRlbiBEYXRlaWVuIGdlZnVuZGVuLlxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWVyeV92ZXJiKCkpKSwwOworCisgIGlmIChzaXplb2YoYXJncyk+MSYmKGFyZ3NbMF1bRklMRVNJWkVdPj0wKSYmZmlsZV9zaXplKGRlc3QpIT0tMikKKyAgICAgIHJldHVybiBub3RpZnlfZmFpbCgKKyAgICAgICAgc3ByaW50ZigiJXM6IEJlaSBtZWhyZXJlbiBRdWVsbGVuIG11c3MgZGFzIFppZWwgZWluIFZlcnplaWNobmlzICIKKyAgICAgICAgICAgICAgICAic2Vpbi5cbiIscXVlcnlfdmVyYigpKSksMDsKKyAgaWYgKHNpemVvZihhcmdzKT09MSYmZmlsZV9zaXplKGRlc3QpIT0tMikKKyAgICBhcmdzWzBdW0RFU1ROQU1FXT1kZXN0OworICBpZiAoIShmbGFncyZDUF9JKSkKKyAgeworICAgIGFzeW5jaHJvbihhcmdzLCMnY3BfZmlsZSwocXVlcnlfdmVyYigpPT0ibXYiKSxmbGFncywwKTsKKyAgICByZXR1cm4gMTsKKyAgfQorICBpZiAocXVlcnlfdmVyYigpPT0iY3AiKQorICAgIF9jcF9hc2tfY29weShhcmdzLDAsZmxhZ3MpOworICBlbHNlCisgICAgX2NwX2Fza19jb3B5KGFyZ3MsMSxmbGFncyk7CisgIHJldHVybiAxOworfQorCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMjIyMjIyMjIworLy8jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIFJNRElSICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIyMjIyMjIyMKKworCisvLworLy8gX3JtZGlyOiBWZXJ6ZWljaG5pcyBsb2VzY2hlbgorLy8gY21kbGluZTogS29tbWFuZG96ZWlsZW5hcmd1bWVudGUKKy8vCisKKworI2lmIF9fVkVSU0lPTl9fIDwgIjMuMi45IgorCitwcml2YXRlIGludCBfZGlyX2ZpbHRlcihtaXhlZCBhcmcpCit7CisgIHJldHVybiAoYXJnW0ZJTEVTSVpFXT09LTIpOworfQorCisjZW5kaWYKKworc3RhdGljIGludCBfcm1kaXIoc3RyaW5nIGNtZGxpbmUpCit7CisgIHN0cmluZyBkZXN0LHRtcDsKKyAgaW50IGZsYWdzOworICBtaXhlZCAqYXJnczsKKyAgCisgIGNtZGxpbmU9X3VucGFyc2VkX2FyZ3MoKTsKKyAgYXJncz1wYXJzZWFyZ3MoY21kbGluZSwmZmxhZ3MsUk1ESVJfT1BUUywxKTsKKyAgaWYgKGZsYWdzPT0tMXx8IXNpemVvZihhcmdzKSkKKyAgICByZXR1cm4gVVNBR0UoInJtZGlyIFstIiBSTURJUl9PUFRTICJdIDxWZXJ6ZWljaG5pcz4iKTsKKyAgaWYgKHNpemVvZihhcmdzKT4xKQorICAgIHJldHVybgorICAgIG5vdGlmeV9mYWlsKCJNaXQgJ3JtZGlyJyBrYW5uIG51ciBqZXdlaWxzIEVJTiBWZXJ6ZWljaG5pcyBnZWxvZXNjaHQgIgorICAgICAgICAgIndlcmRlbi5cbkRlciBCZWZlaGwgJ3JtJyBiaWV0ZXQgZXJ3ZWl0ZXJ0ZSBNb2VnbGljaGtlaXRlbi5cbiIpLDA7CisgIGRlc3Q9YXJnc1swXTsKKyAgaWYgKGRlc3QhPSIvIikKKyAgeworICAgIGFyZ3M9ZmlsZV9saXN0KCh7ZGVzdH0pLE1PREVfUk1ESVIsMCwiLyIpOworI2lmIF9fVkVSU0lPTl9fIDwgIjMuMi45IgorICAgIGFyZ3M9ZmlsdGVyKGFyZ3MsIydfZGlyX2ZpbHRlcik7CisjZWxzZQorICAgIGFyZ3M9ZmlsdGVyKGFyZ3MsKDogKCQxW0ZJTEVTSVpFXT09LTIpIDopKTsKKyNlbmRpZgorICAgIGlmICghc2l6ZW9mKGFyZ3MpKQorICAgICAgcmV0dXJuIG5vdGlmeV9mYWlsKAorICAgICAgICBzcHJpbnRmKCJybWRpcjogJXM6IEtlaW4gc29sY2hlcyBWZXJ6ZWljaG5pcyBnZWZ1bmRlbi5cbiIsZGVzdCkpLDA7CisgICAgaWYgKHNpemVvZihhcmdzKT4xKQorICAgICAgcmV0dXJuIG5vdGlmeV9mYWlsKAorICAgICAgICAgICAgICAgIHNwcmludGYoInJtZGlyOiAlczogTWFza2UgaXN0IG5pY2h0IGVpbmRldXRpZy5cbiIsZGVzdCkpLDA7CisgICAgZGVzdD1hcmdzWzBdW0ZVTExOQU1FXTsKKyAgICBpZiAoIU1BWV9XUklURShkZXN0KSkgcmV0dXJuIEVSUk9SKE5PX1dSSVRFLGRlc3QsMSk7CisgICAgaWYgKCFybWRpcihkZXN0KSkKKyAgICB7CisgICAgICBpZiAoc2l6ZW9mKChnZXRfZGlyKGRlc3QrIi8qIil8fCh7fSkpLSh7Ii4iLCIuLiJ9KSkpCisgICAgICAgIHByaW50Zigicm1kaXI6ICVzOiBWZXJ6ZWljaG5pcyBpc3QgbmljaHQgbGVlci5cbiIsZGVzdCk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICBpZiAoZmxhZ3MmJlJNRElSX1YpIHByaW50ZihGSUxFX0RFTEVURUQsZGVzdCk7CisgICAgfQorICAgIHJldHVybiAxOworICB9CisgIHJldHVybiBFUlJPUihOT19ERUxFVEUsZGVzdCwxKTsKK30KKworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIyMjIyMjIyMKKy8vIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyBNS0RJUiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyMjIyMjIyMjCisKKworLy8KKy8vIF9ta2RpcjogVmVyemVpY2huaXMgZXJzdGVsbGVuCisvLyBjbWRsaW5lOiBLb21tYW5kb3plaWxlbmFyZ3VtZW50ZQorLy8KKworc3RhdGljIGludCBfbWtkaXIoc3RyaW5nIGNtZGxpbmUpCit7CisgIHN0cmluZyBkZXN0LHRtcDsKKyAgaW50IGZsYWdzLGk7CisgIHN0cmluZyAqYXJnczsKKyAgCisgIGNtZGxpbmU9X3VucGFyc2VkX2FyZ3MoKTsKKyAgYXJncz1wYXJzZWFyZ3MoY21kbGluZSwmZmxhZ3MsTUtESVJfT1BUUywxKTsKKyAgaWYgKGZsYWdzPT0tMSkgcmV0dXJuIDA7CisgIGlmICghc2l6ZW9mKGFyZ3MpKQorICAgIHJldHVybiBVU0FHRSgibWtkaXIgWy0iIE1LRElSX09QVFMgIl0gPFZlcnplaWNobmlzPiIpOworICBpZiAoc2l6ZW9mKGFyZ3MpPjEpCisgICAgcmV0dXJuIG5vdGlmeV9mYWlsKCJNaXQgJ21rZGlyJyBrYW5uIG51ciBqZXdlaWxzIEVJTiBWZXJ6ZWljaG5pcyAiCisgICAgICAgICAgICAgICAgICAgICAgICJlcnN0ZWxsdCB3ZXJkZW4uXG4iKSwwOworICBkZXN0PWFyZ3NbMF07CisgIAorICBpZiAoKGk9ZmlsZV9zaXplKGltcGxvZGUoKGFyZ3M9ZXhwbG9kZShkZXN0LCIvIikpWzAuLjwyXSwiLyIpKSk9PUZTSVpFX0RJUikKKyAgeworICAgIGlmICghbWtkaXIoZGVzdCkpIHJldHVybiBFUlJPUihOT19DUkVBVEVfRElSLGRlc3QsMSk7CisgICAgaWYgKGZsYWdzJk1LRElSX1YpIHByaW50ZihESVJfQ1JFQVRFRCxkZXN0LDEpOworICAgIHByaW50ZigibWtkaXI6IGFiZ2VzY2hsb3NzZW4uXG4iKTsKKyAgICByZXR1cm4gMTsKKyAgfQorICAKKyAgaWYgKGk9PUZTSVpFX05PRklMRSkKKyAgeworICAgIGlmIChmbGFncyZNS0RJUl9SKQorICAgIHsKKyAgICAgIGlmIChta2RpcnAoZGVzdCkgIT0gMSkKKyAgICAgICAgcmV0dXJuIEVSUk9SKE5PX0NSRUFURV9ESVIsZGVzdCwxKTsKKyAgICAgIGlmIChmbGFncyZNS0RJUl9WKQorICAgICAgICBwcmludGYoRElSX0NSRUFURUQsaW1wbG9kZShhcmdzWzAuLmldLCIvIikpOworICAgICAgcHJpbnRmKCJta2RpcjogYWJnZXNjaGxvc3Nlbi5cbiIpOworICAgICAgcmV0dXJuIDE7CisgICAgfQorICAgIHJldHVybiBFUlJPUihET0VTTlRfRVhJU1QsaW1wbG9kZShhcmdzWzAuLjwyXSwiLyIpLDEpOworICB9CisgIHJldHVybiBFUlJPUihBTFJFQURZX0VYSVNUUyxkZXN0LDEpOworfQorCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIyMjIyMKKy8vIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgUk0gIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMjIyMjIworCitwcml2YXRlIHZvaWQgX3JtX2Fza19kZWxldGUobWl4ZWQgKmZpbGVkYXRhLCBpbnQgZmxhZ3MpOworCitzdGF0aWMgdm9pZCBfcm1fYXNrX2RlbGV0ZTIoc3RyaW5nIGlucHV0LG1peGVkICpmaWxlZGF0YSxpbnQgZmxhZ3MpCit7CisgIGludCBpOworICBpZiAoIXNpemVvZihpbnB1dCkpIGlucHV0PSIgIjsKKyAgaW5wdXQ9bG93ZXJfY2FzZShpbnB1dCk7CisgIHN3aXRjaChpbnB1dFswXSkKKyAgeworICAgIGNhc2UgJ3EnOgorICAgICAgcHJpbnRmKCJMb2VzY2hlbiBhYmdlYnJvY2hlbiFcbiIpOworICAgICAgcmV0dXJuOworICAgIGNhc2UgJ3knOgorICAgIGNhc2UgJ2onOgorICAgICAgaWYgKGZpbGVkYXRhWzBdW0ZJTEVTSVpFXT09LTIpCisgICAgICB7CisgICAgICAgIGlmIChpPWZpbGVkYXRhWzBdW1NVQkRJUlNJWkVdKSAvLyBEaXItRWludHJhZyBuYWNoIGhpbnRlbiBzY2hpZWJlbgorICAgICAgICB7CisgICAgICAgICAgbWl4ZWQgdGVtcDsKKyAgICAgICAgICBpbnQgajsKKyAgICAgICAgICB0ZW1wPWZpbGVkYXRhWzBdOworICAgICAgICAgIHRlbXBbU1VCRElSU0laRV09MDsKKyAgICAgICAgICBmb3Ioaj0wO2o8aTtqKyspIGZpbGVkYXRhW2pdPWZpbGVkYXRhW2orMV07CisgICAgICAgICAgZmlsZWRhdGFbal09dGVtcDsKKyAgICAgICAgICBfcm1fYXNrX2RlbGV0ZShmaWxlZGF0YSxmbGFncyk7CisgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGlmICghcm1kaXIoZmlsZWRhdGFbMF1bRlVMTE5BTUVdKSkKKyAgICAgICAgICBwcmludGYoTk9fREVMRVRFLGZpbGVkYXRhWzBdW0ZVTExOQU1FXSk7CisgICAgICAgIGVsc2UgaWYgKGZsYWdzJlJNX1YpIHByaW50ZihGSUxFX0RFTEVURUQsZmlsZWRhdGFbMF1bRlVMTE5BTUVdKTsKKyAgICAgIH0KKyAgICAgIGVsc2UgLy8gRGF0ZWkgZXhpc3RpZXJ0CisgICAgICB7CisgICAgICAgIGlmICghcm0oZmlsZWRhdGFbMF1bRlVMTE5BTUVdKSkKKyAgICAgICAgICBwcmludGYoREVTVF9OT19ERUxFVEUgIlVlYmVyZ2VoZSBEYXRlaS4uLlxuIiwKKyAgICAgICAgICAgICAgICAgZmlsZWRhdGFbMF1bRlVMTE5BTUVdKTsKKyAgICAgICAgZWxzZSBpZiAoZmxhZ3MmUk1fVikgcHJpbnRmKEZJTEVfREVMRVRFRCxmaWxlZGF0YVswXVtGVUxMTkFNRV0pOworICAgICAgICAKKyAgICAgIH0KKyAgICBjYXNlICduJzoKKyAgICAgIF9ybV9hc2tfZGVsZXRlKGZpbGVkYXRhWzErZmlsZWRhdGFbMF1bU1VCRElSU0laRV0uLl0sZmxhZ3MpOworICAgICAgcmV0dXJuOworICAgIGRlZmF1bHQ6CisgICAgICBwcmludGYoIktvbW1hbmRvIG5pY2h0IHZlcnN0YW5kZW4uXG4iKTsKKyAgICAgIF9ybV9hc2tfZGVsZXRlKGZpbGVkYXRhLGZsYWdzKTsKKyAgICAgIHJldHVybjsKKyAgfQorICByZXR1cm47Cit9CisKK3ByaXZhdGUgdm9pZCBfcm1fYXNrX2RlbGV0ZShtaXhlZCAqZmlsZWRhdGEsIGludCBmbGFncykKK3sKKyAgaW50IGk7CisgIG1peGVkIHRlbXA7CisgIGlmICghc2l6ZW9mKGZpbGVkYXRhKSkKKyAgeworICAgIHByaW50Zigicm06IGFiZ2VzY2hsb3NzZW4uXG4iKTsKKyAgICByZXR1cm47CisgIH0KKyAgc3dpdGNoKGZpbGVkYXRhWzBdW0ZJTEVTSVpFXSkKKyAgeworICAgIGNhc2UgLTE6CisgICAgICBpZiAoZmxhZ3MmUk1fVikgcHJpbnRmKERPRVNOVF9FWElTVCxmaWxlZGF0YVswXVtGVUxMTkFNRV0pOworICAgICAgX3JtX2Fza19kZWxldGUoZmlsZWRhdGFbMS4uXSxmbGFncyk7CisgICAgICByZXR1cm47CisgICAgY2FzZSAtMjoKKyAgICAgIGlmIChpPWZpbGVkYXRhWzBdW1NVQkRJUlNJWkVdKQorICAgICAgICBwcmludGYoIklucyBWZXJ6ZWljaG5pcyAnJXMnIGhpbmFic3RlaWdlbj9cbiIsCisgICAgICAgICAgZmlsZWRhdGFbMF1bRlVMTE5BTUVdKTsKKyAgICAgIGVsc2UKKyAgICAgICAgcHJpbnRmKCJWZXJ6ZWljaG5pcyAnJXMnIGxvZXNjaGVuP1xuIiwKKyAgICAgICAgICAgICAgIGZpbGVkYXRhWzBdW0ZVTExOQU1FXSk7CisgICAgICBpbnB1dF90bygiX3JtX2Fza19kZWxldGUyIixJTlBVVF9QUk9NUFQsICIoaixuLHEpICIsCisgICAgICAgICAgZmlsZWRhdGEsZmxhZ3MpOworICAgICAgcmV0dXJuOworICAgIGRlZmF1bHQ6CisgICAgICBwcmludGYoIiclcycgbG9lc2NoZW4/IChqLG4scSlcbiIsCisgICAgICAgICBmaWxlZGF0YVswXVtGVUxMTkFNRV0pOworICAgICAgaW5wdXRfdG8oIl9ybV9hc2tfZGVsZXRlMiIsSU5QVVRfUFJPTVBULCAiKGosbixxKSAiLAorICAgICAgICAgIGZpbGVkYXRhLGZsYWdzKTsKKyAgICAgIHJldHVybjsKKyAgfQorfQorCisKK3ByaXZhdGUgdm9pZCBybV9maWxlKG1peGVkIGZpbGVkYXRhLCBtaXhlZCBub3R1c2VkLCBpbnQgZmxhZ3MpCit7CisgIHN0cmluZyBkZXN0OworICBkZXN0PWZpbGVkYXRhW0ZVTExOQU1FXTsKKyAgaWYgKCFNQVlfV1JJVEUoZGVzdCkpCisgIHsKKyAgICBwcmludGYoTk9fV1JJVEUsZGVzdCk7CisgICAgcmV0dXJuOworICB9CisgIHN3aXRjaChmaWxlZGF0YVtGSUxFU0laRV0pCisgIHsKKyAgICBjYXNlIC0xOgorICAgICAgaWYgKGZsYWdzJlJNX1YpIHByaW50ZihET0VTTlRfRVhJU1QsZGVzdCk7CisgICAgICByZXR1cm47CisgICAgY2FzZSAtMjoKKyAgICAgIGlmICghcm1kaXIoZGVzdCkpIHByaW50ZihERVNUX05PX0RFTEVURSxkZXN0KTsKKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgaWYgKGZsYWdzJlJNX1YpIHByaW50ZihGSUxFX0RFTEVURUQsZGVzdCk7CisgICAgICB9CisgICAgICByZXR1cm47CisgICAgZGVmYXVsdDoKKyAgICAgIGlmICghcm0oZGVzdCkpIHByaW50ZihERVNUX05PX0RFTEVURSxkZXN0KTsKKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgaWYgKGZsYWdzJlJNX1YpIHByaW50ZihGSUxFX0RFTEVURUQsZGVzdCk7CisgICAgICB9CisgICAgICByZXR1cm47CisgIH0KK30KKworc3RhdGljIGludCBfcm0oc3RyaW5nIGNtZGxpbmUpCit7CisgIG1peGVkICphcmdzLCphcmdzMjsKKyAgaW50IGZsYWdzLGk7CisgIHN0cmluZyBtYXNrOworICAKKyAgY21kbGluZT1fdW5wYXJzZWRfYXJncygpOworICBhcmdzPXBhcnNlYXJncyhjbWRsaW5lLCZmbGFncyxSTV9PUFRTLDApOworICBpZiAoZmxhZ3M9PS0xfHwhc2l6ZW9mKGFyZ3MpKQorICAgIHJldHVybiBVU0FHRSgicm0gWy0iIFJNX09QVFMKKyAgICAgICAgICAgICAgICAgIl0gPGRhdGVpL3Zlcno+IFs8ZGF0ZWkyL3ZlcnoyPiAuLi4gXSBbPG1hc2tlPl0iKTsKKyAgaWYgKGZsYWdzJlJNX00pCisgIHsKKyAgICBtYXNrPWFyZ3NbPDFdOworICAgIGFyZ3M9YXJnc1swLi48Ml07CisgIH0KKyAgYXJncz1tYXAoYXJncywjJ3RvX2ZpbGVuYW1lKS0oezB9KTsKKyAgYXJncz1maWxlX2xpc3QoYXJncyxNT0RFX1JNLChmbGFncyZSTV9SKSwiLyIsbWFzayk7CisgIGlmICghKGk9c2l6ZW9mKGFyZ3MpKSkKKyAgICByZXR1cm4gcHJpbnRmKCJLZWluZSBwYXNzZW5kZSBEYXRlaSBnZWZ1bmRlbi5cbiIpLDE7CisgIGlmICghKGZsYWdzJlJNX0kpKQorICB7CisgICAgaWYgKGk+MSkgLy8gVW1kcmVoZW4KKyAgICB7CisgICAgICBtaXhlZCB0ZW1wOworICAgICAgaT4+PTE7CisgICAgICB3aGlsZShpKQorICAgICAgeworICAgICAgICB0ZW1wPWFyZ3NbPChpLS0pXTsKKyAgICAgICAgYXJnc1s8KGkrMSldPWFyZ3NbaV07CisgICAgICAgIGFyZ3NbaV09dGVtcDsKKyAgICAgIH0KKyAgICB9CisgICAgYXN5bmNocm9uKGFyZ3MsIydybV9maWxlLGFyZ3MsZmxhZ3MsMCk7CisgICAgcmV0dXJuIDE7CisgIH0KKyAgX3JtX2Fza19kZWxldGUoYXJncyxmbGFncyk7CisgIHJldHVybiAxOworfQpkaWZmIC0tZ2l0IGEvc3RkL3NoZWxscy9tYWdpZXIvZmlsZXZpZXcuYyBiL3N0ZC9zaGVsbHMvbWFnaWVyL2ZpbGV2aWV3LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzMxZGU1YQotLS0gL2Rldi9udWxsCisrKyBiL3N0ZC9zaGVsbHMvbWFnaWVyL2ZpbGV2aWV3LmMKQEAgLTAsMCArMSw3MjggQEAKKy8vIE1vcmdlbkdyYXVlbiBNVURsaWIKKy8vCisvLyBmaWxldmlldy5jCisvLworLy8gJElkOiBmaWxldmlldy5jIDkxNDIgMjAxNS0wMi0wNCAyMjoxNzoyOVogWmVzc3RyYSAkCisjcHJhZ21hIHN0cmljdF90eXBlcworI3ByYWdtYSBzYXZlX3R5cGVzCisvLyNwcmFnbWEgcmFuZ2VfY2hlY2sKKyNwcmFnbWEgbm9fY2xvbmUKKyNwcmFnbWEgcGVkYW50aWMKKworI2luY2x1ZGUgPGFuc2kuaD4KKyNpbmNsdWRlIDxwbGF5ZXIvYmFzZS5oPgorI2luY2x1ZGUgPHdpemxldmVscy5oPgorI2luY2x1ZGUgPHNoZWxscy5oPgorI2luY2x1ZGUgPGRhZW1vbi9tYW5kLmg+CisjaW5jbHVkZSA8dWRwLmg+CisjZGVmaW5lIE5FRURfUFJPVE9UWVBFUworI2luY2x1ZGUgPG1hZ2llci5oPgorI2luY2x1ZGUgPHRoaW5nL3Byb3BlcnRpZXMuaD4KKyNpbmNsdWRlIDxwbGF5ZXIuaD4KKworcHJpdmF0ZSBub3NhdmUgbWFwcGluZyBjb2xvcnN0cmluZ3M7Citwcml2YXRlIG5vc2F2ZSBtYXBwaW5nIG9sZG1hbl9yZXN1bHQ7CisKKy8vICAgICAgICAgICAgICAgICAgICAgICAgIyMjIyMjIyMjIyMjIyMjIyMjIworLy8jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIElOSVRJQUxJU0lFUlVORyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworLy8gICAgICAgICAgICAgICAgICAgICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjCisKK21peGVkIF9xdWVyeV9sb2NhbGNtZHMoKQoreworICByZXR1cm4gKHsoeyJscyIsIl9scyIsMCxMRUFSTkVSX0xWTH0pLAorICAgICAgICAgICAoeyJtb3JlIiwiX21vcmUiLDAsTEVBUk5FUl9MVkx9KSwKKyAgICAgICAgICAgKHsiY2F0IiwiX2NhdCIsMCxMRUFSTkVSX0xWTH0pLAorICAgICAgICAgICAoeyJoZWFkIiwiX2NhdCIsMCxMRUFSTkVSX0xWTH0pLAorICAgICAgICAgICAoeyJ0YWlsIiwiX2NhdCIsMCxMRUFSTkVSX0xWTH0pLAorICAgICAgICAgICAoeyJtYW4iLCJfbWFuIiwwLExFQVJORVJfTFZMfSksCisgICAgICAgICAgICh7InJtYW4iLCJfcm1hbiIsMCxMRUFSTkVSX0xWTH0pLAorICAgICAgICAgICAoeyJzaG93cHJvcHMiLCJfc2hvd3Byb3BzIiwwLFdJWkFSRF9MVkx9KSwKKyAgICAgICAgICAgKHsiZ3JlcCIsIl9ncmVwIiwwLExFQVJORVJfTFZMfSl9KTsKK30KKworCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIyMjIyMKKy8vIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgTFMgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMjIyMjIworCisvLworLy8gX2xzOiBEZXIgbHMtQmVmZWhsOiBWZXJ6ZWljaG5pc3NlIHVuZCBEYXRlaWVuIGFuemVpZ2VuCisvLyBjbWRsaW5lOiBLb21tYW5kb3plaWxlCisvLworCisvLworLy8gRnVua3Rpb25lbiB6dW0gU29ydGllcmVuIHVuZCBmdWVyIGZpbHRlcl9sZGZpZWQvbWFwX2xkZmllZAorLy8KKworCitwcml2YXRlIHN0cmluZyBfZ2V0X2NvbG9yKHN0cmluZyBjb2xvcikKK3sKKyAgcmV0dXJuIENPTE9SU1tsb3dlcl9jYXNlKGNvbG9yKV07Cit9CisKKworcHJpdmF0ZSB2b2lkIFNldENvbG9yc3RyaW5ncygpCit7CisgIHN0cmluZyB0bXAsdGVybTsKKyAgbWFwcGluZyB2YXJzOworICB2YXJzPVF1ZXJ5UHJvcChQX1ZBUklBQkxFUyk7CisgIGNvbG9yc3RyaW5ncz1tX2FsbG9jYXRlKDAsMik7CisgIHN3aXRjaCh0ZXJtPVF1ZXJ5UHJvcChQX1RUWSkpCisgIHsKKyAgICBjYXNlICJ2dDEwMCI6CisgICAgY2FzZSAiYW5zaSI6CisgICAgICBpZihzdHJpbmdwKHZhcnNbIkxTX0RJUiJdKSkKKyAgICAgICAgdG1wPWltcGxvZGUobWFwKGV4cGxvZGUodmFyc1siTFNfRElSIl0sIisiKSwjJ19nZXRfY29sb3IpLAorICAgICAgICAgICAgICAgICAgICAiIik7CisgICAgICBlbHNlCisgICAgICAgIHRtcCA9ICh0ZXJtID09ICJhbnNpIikgPyBBTlNJX0JMVUUrQU5TSV9CT0xEOiBBTlNJX0JPTEQ7CisgICAgICBjb2xvcnN0cmluZ3NbRElSXSA9IHRtcCsiJXMiKyh0ZXJtID09ICJ2dDEwMCI/Ii8iOiIiKStBTlNJX05PUk1BTDsKKyAgICAgIGlmKHRlcm0gPT0gInZ0MTAwIikgY29sb3JzdHJpbmdzW0RJUiwgMV0gPSAxOworICAgICAgaWYoc3RyaW5ncCh2YXJzWyJMU19PQkoiXSkpCisgICAgICAgIHRtcD1pbXBsb2RlKG1hcChleHBsb2RlKHZhcnNbIkxTX09CSiJdLCIrIiksIydfZ2V0X2NvbG9yKSwKKyAgICAgICAgICAgICAgICAgICAgIiIpOworICAgICAgZWxzZQorICAgICAgICB0bXAgPSAodGVybSA9PSAiYW5zaSIpID8gQU5TSV9SRUQgOiBBTlNJX0lOVkVSUzsKKyAgICAgIGNvbG9yc3RyaW5nc1tPQkpdID0gdG1wKyIlcyIrQU5TSV9OT1JNQUw7CisgICAgICBpZihzdHJpbmdwKHZhcnNbIkxTX1ZDIl0pKQorICAgICAgICB0bXA9aW1wbG9kZShtYXAoZXhwbG9kZSh2YXJzWyJMU19WQyJdLCIrIiksIydfZ2V0X2NvbG9yKSwKKyAgICAgICAgICAgICAgICAgICAgIiIpOworICAgICAgZWxzZQorICAgICAgICB0bXAgPSAodGVybSA9PSAiYW5zaSIpID8gQU5TSV9QVVJQTEUgOiBBTlNJX0lOVkVSUzsKKyAgICAgIGNvbG9yc3RyaW5nc1tWQ10gPSB0bXArIiVzIitBTlNJX05PUk1BTDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgImR1bWIiOgorICAgICAgY29sb3JzdHJpbmdzW0RJUl0gPSAiJXMvIjsgY29sb3JzdHJpbmdzW0RJUiwgMV0gPSAxOworICAgICAgY29sb3JzdHJpbmdzW09CSl0gPSAiJXMqIjsgY29sb3JzdHJpbmdzW09CSiwgMV0gPSAxOworICAgICAgY29sb3JzdHJpbmdzW1ZDXSAgPSAiJXMqIjsgY29sb3JzdHJpbmdzW1ZDICwgMV0gPSAxOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGNvbG9yc3RyaW5nc1tESVJdID0gIiVzIjsKKyAgICAgIGNvbG9yc3RyaW5nc1tPQkpdID0gIiVzIjsKKyAgICAgIGNvbG9yc3RyaW5nc1tWQ10gID0gIiVzIjsKKyAgfQorICByZXR1cm47Cit9CisKKworcHJpdmF0ZSBzdHJpbmcgX2xzX291dHB1dF9zaG9ydChtaXhlZCBmaWxlZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1heGxlbixpbnQgY291bnRlcixpbnQgbWF4Y291bnQpCit7CisgIHN0cmluZyB0bXA7CisgIHRtcD1maWxlZGF0YVtCQVNFTkFNRV07CisgIG1heGxlbi09c2l6ZW9mKHRtcCk7CisgIHN3aXRjaChmaWxlZGF0YVtGSUxFU0laRV0pCisgIHsKKyAgICBjYXNlIC0yOiB0bXA9c3ByaW50Zihjb2xvcnN0cmluZ3NbRElSXSx0bXApOworICAgICAgICAgICAgIG1heGxlbi09Y29sb3JzdHJpbmdzW0RJUiwxXTsgYnJlYWs7CisgICAgY2FzZSAtMTogdG1wPXNwcmludGYoY29sb3JzdHJpbmdzW1ZDXSx0bXApOworICAgICAgICAgICAgIG1heGxlbi09Y29sb3JzdHJpbmdzW1ZDLDFdOyBicmVhazsKKyAgICBkZWZhdWx0OiBpZiAoZmluZF9vYmplY3QoZmlsZWRhdGFbRlVMTE5BTUVdKSkKKyAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICBtYXhsZW4tPWNvbG9yc3RyaW5nc1tPQkosMV07CisgICAgICAgICAgICAgICB0bXA9c3ByaW50Zihjb2xvcnN0cmluZ3NbT0JKXSx0bXApOyBicmVhazsKKyAgICAgICAgICAgICB9CisgIH0KKyAgaWYgKCFtYXhjb3VudCkgcmV0dXJuIHRtcCsiXG4iOworICByZXR1cm4gc3ByaW50ZigiJS0qcyVzIiwobWF4bGVuK3NpemVvZih0bXApKSx0bXAsCisJKChjb3VudGVyKyspPT1tYXhjb3VudD8oY291bnRlcj0wLCJcbiIpOiIgICIpKTsKK30KKworcHJpdmF0ZSBpbnQgX2xzX21heGxlbihtaXhlZCBmaWxlZGF0YSxpbnQgZmxhZ3MsaW50IG1heGxlbikKK3sKKyAgc3RyaW5nIGJhc2U7CisgIGludCBzaXplOworICBiYXNlPWZpbGVkYXRhW0JBU0VOQU1FXTsKKyAgaWYgKCEoZmxhZ3MmTFNfQSkmJihiYXNlWzBdPT0nLicpKSByZXR1cm4gMDsKKyNpZiBfX1ZFUlNJT05fXyA8ICIzLjIuOSIKKyAgaWYgKHNpemVvZihiYXNlKT5tYXhsZW4pIG1heGxlbj1zaXplb2YoYmFzZSk7CisjZWxzZQorICBtYXhsZW49bWF4KG1heGxlbixzaXplb2YoYmFzZSkpOworI2VuZGlmCisgIHJldHVybiAxOworfQorCitwcml2YXRlIHN0cmluZyBfbHNfb3V0cHV0X2xvbmcobWl4ZWQgZmlsZWRhdGEsIGludCBmbGFncyxjbG9zdXJlIHZhbGlkX3JlYWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xvc3VyZSB2YWxpZF93cml0ZSxjbG9zdXJlIGNyZWF0b3JfZmlsZSkKK3sKKyAgc3RyaW5nICp0bXAsZnVsbCxiYXNlLHBhdGgsZGF0ZSxjcmVhdG9yLGdyb3VwOworICBpbnQgc2l6ZSxkaXIsZnRpbWU7CisgIG9iamVjdCBvYjsKKyAgCisgIGJhc2U9ZmlsZWRhdGFbQkFTRU5BTUVdOworICBpZiAoIShzaXplb2YoYmFzZSkpfHwoKCEoZmxhZ3MmTFNfQSkpJiYoYmFzZVswXT09Jy4nKSkpCisgICAgcmV0dXJuIDA7CisgIHNpemU9ZmlsZWRhdGFbRklMRVNJWkVdOworICBwYXRoPWZpbGVkYXRhW1BBVEhOQU1FXTsKKyAgdG1wPShzdHJpbmcgKiljYWxsX290aGVyKG1hc3RlcigpLCJmdWxsX3BhdGhfYXJyYXkiLAorICAgICAgICAgICAgICAgICBmaWxlZGF0YVtGVUxMTkFNRV0sZ2V0dWlkKCkpOworICBmdWxsPXNwcmludGYoIi8lcyIsaW1wbG9kZSh0bXAsIi8iKSk7CisgIGRpcj0oc2l6ZT09LTIpOworICBvYj1maW5kX29iamVjdChmdWxsKTsKKyAgZnRpbWU9ZmlsZWRhdGFbRklMRURBVEVdOworICBkYXRlPWR0aW1lKGZ0aW1lKTsKKyAgZGF0ZT1zcHJpbnRmKCIlcyAlcyAlcyIsZGF0ZVs5Li4xMV0sZGF0ZVs1Li42XSwKKyAgICAgICAgICAgICAgICgodGltZSgpLWZ0aW1lKTwzMTUzNjAwMD9kYXRlWzE5Li4yM106KCIgIitkYXRlWzEzLi4xNl0pKSk7CisgIGNyZWF0b3I9IiI7CisgIGdyb3VwPSIiOworICBpZiAoZmxhZ3MmTFNfVSkKKyAgeworICAgIGNyZWF0b3I9KHN0cmluZyljYWxsX290aGVyKG1hc3RlcigpLCJjcmVhdG9yX2ZpbGUiLGZ1bGwpOworICAgIHN3aXRjaChjcmVhdG9yKQorICAgIHsKKyAgICAgIGNhc2UgUk9PVElEOiBjcmVhdG9yPSJyb290IjsgYnJlYWs7CisgICAgICBjYXNlIEJBQ0tCT05FSUQ6IGNyZWF0b3I9ImRhZW1vbiI7IGJyZWFrOworICAgICAgZGVmYXVsdDogaWYoIWNyZWF0b3IpIGNyZWF0b3I9Im5vbmUiOyBicmVhazsKKyAgICB9CisgIH0KKyAgaWYgKGZsYWdzJkxTX0cpCisgIHsKKyAgICBpZiAoc2l6ZW9mKHRtcCkpCisgICAgeworICAgICAgc3dpdGNoKHRtcFswXSkKKyAgICAgIHsKKyAgICAgIGNhc2UgV0laQVJERElSOiBncm91cD0ibWFnaWVyIjsgYnJlYWs7CisgICAgICBjYXNlICJuZXdzIjogZ3JvdXA9Im5ld3MiOyBicmVhazsKKyAgICAgIGNhc2UgIm1haWwiOiBncm91cD0ibWFpbCI7IGJyZWFrOworICAgICAgY2FzZSAib3BlbiI6IGdyb3VwPSJwdWJsaWMiOyBicmVhazsKKyAgICAgIGNhc2UgInAiOiBncm91cD0icHJvamVjdCI7IGJyZWFrOworICAgICAgY2FzZSBET01BSU5ESVI6IGlmIChzaXplb2YodG1wKT4xKSB7IGdyb3VwPXRtcFsxXTsgYnJlYWs7IH0KKyAgICAgIGRlZmF1bHQ6IGdyb3VwPSJtdWQiOyBicmVhazsKKyAgICAgIH0KKyAgICB9CisgICAgZWxzZSBncm91cD0ibXVkIjsKKyAgfQorICBpZiAoZGlyKSBiYXNlPXNwcmludGYoY29sb3JzdHJpbmdzW0RJUl0sYmFzZSk7CisgIGVsc2UKKyAgeworICAgIGlmIChvYikKKyAgICB7CisgICAgICBpZiAoc2l6ZT09LTEpCisgICAgICAgIGJhc2U9c3ByaW50Zihjb2xvcnN0cmluZ3NbVkNdLGJhc2UpOworICAgICAgZWxzZQorICAgICAgICBiYXNlPXNwcmludGYoY29sb3JzdHJpbmdzW09CSl0sYmFzZSk7CisgICAgfQorICB9CisgIHJldHVybiBzcHJpbnRmKCgiJWMlYyVjJWMgJTNkIisoKGZsYWdzJkxTX1UpPyIgJS0yNC4yNHMiOiIlLTAuMXMiKSsKKyAgICAgICAgICAgICAgICAgKChmbGFncyZMU19HKT8iICUtOC44cyI6IiUwLjFzIikrIiAlOHMgJXMgJXNcbiIpLAorICAgICAgICAgICAgICAgICAoZGlyPydkJzonLScpLAorICAgICAgICAgICAgICAgICAoIWZ1bmNhbGwodmFsaWRfcmVhZCxmdWxsLGdldHVpZCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgInJlYWRfZmlsZSIsdGhpc19vYmplY3QoKSk/Jy0nOidyJyksCisgICAgICAgICAgICAgICAgICghZnVuY2FsbCh2YWxpZF93cml0ZSxmdWxsLGdldHVpZCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIndyaXRlX2ZpbGUiLHRoaXNfb2JqZWN0KCkpPyctJzondycpLAorICAgICAgICAgICAgICAgICAob2I/J3gnOictJyksCisgICAgICAgICAgICAgICAgIChkaXI/KHNpemVvZigoZ2V0X2RpcihmdWxsKyIvKiIpfHwoe30pKS0oeyIuIiwiLi4ifSkpKTowKSwKKyAgICAgICAgICAgICAgICAgY3JlYXRvcixncm91cCwoZGlyPyItIjpzaXplPT0tMT8iPHZjPiI6dG9fc3RyaW5nKHNpemUpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGUsYmFzZSk7Cit9CisKKworc3RhdGljIGludCBfbHMoc3RyaW5nIGNtZGxpbmUpCit7CisgIGludCBmbGFncyxjbXAsaSxhcmdfc2l6ZSxzaXplOworICBpbnQgbWF4bGVuLGNvdW50ZXIsbWF4Y291bnQ7CisgIHN0cmluZyAqYXJncyxvdXRwdXQ7CisgIG1peGVkICp0bXA7CisgIGNsb3N1cmUgb3V0cHV0X2Z1bix2X3JlYWQsdl93cml0ZSxjcmVhdG9yLHNvcnRfZnVuOworICAKKyAgY21kbGluZT1fdW5wYXJzZWRfYXJncygpfHwiIjsKKyAgYXJncz1wYXJzZWFyZ3MoY21kbGluZSwmZmxhZ3MsTFNfT1BUUywxKTsKKyAgaWYgKGZsYWdzPT0tMSkKKyAgICByZXR1cm4gVVNBR0UoImxzIFstIiBMU19PUFRTICJdIFs8VmVyemVpY2huaXM+XSBbPFZlcnplaWNobmlzMj4gLi5dIik7CisgIFNldENvbG9yc3RyaW5ncygpOworICBvdXRwdXQ9IiI7CisgIGlmICghc2l6ZW9mKGFyZ3MpKSBhcmdzPSh7IFF1ZXJ5UHJvcChQX0NVUlJFTlRESVIpIH0pOworICBpZiAoIXNpemVvZihhcmdzPWZpbGVfbGlzdChhcmdzLE1PREVfTFNBLDAsIi8iKSkpCisgICAgcmV0dXJuIG5vdGlmeV9mYWlsKCJsczogS2VpbmUgcGFzc2VuZGVuIFZlcnplaWNobmlzc2UgZ2VmdW5kZW4uXG4iKSwgMDsKKy8vIEZpbGVzIHNvcnRpZXJlbiBkaWUgZXJzdGUKKyAgaWYgKGZsYWdzJkxTX1QpIGNtcD1GSUxFREFURTsKKyAgZWxzZSBpZiAoZmxhZ3MmTFNfUykgY21wPUZJTEVTSVpFOworICBlbHNlIGNtcD1CQVNFTkFNRTsgLy8gPTAgOi0pCisgIHNvcnRfZnVuPWxhbWJkYSgoeyAnYSwnYiB9KSwoeworICAgICgoIWNtcCYmIShmbGFncyZMU19SKSl8fChjbXAmJihmbGFncyZMU19SKSk/Iyc+OiMnPCksCisgICAgKHsjJ1ssJ2EsY21wfSksKHsjJ1ssJ2IsY21wfSl9KSk7CisgIGFyZ3M9c29ydF9hcnJheShhcmdzLHNvcnRfZnVuKTsKKy8vIEF1c2dhYmVmb3JtYXQgYmVzdGltbWVuCisgIGlmIChmbGFncyZMU19MKQorICB7CisgICAgdl9yZWFkPVZBTElEX1JFQURfQ0w7CisgICAgdl93cml0ZT1WQUxJRF9XUklURV9DTDsKKyAgICBjcmVhdG9yPUNSRUFUT1JfQ0w7CisgIH0KKyAgYXJnX3NpemU9c2l6ZW9mKGFyZ3MpOworICBpZiAoYXJnX3NpemU+MXx8KGFyZ19zaXplJiZhcmdzWzBdW0ZJTEVTSVpFXT49MCkpCisgIHsKKyAgICBpZiAoZmxhZ3MmTFNfTCkKKyAgICAgIHRtcD1tYXAoYXJncywjJ19sc19vdXRwdXRfbG9uZyxmbGFncyx2X3JlYWQsCisgICAgICAgICAgICAgICAgICAgIHZfd3JpdGUsY3JlYXRvciktKHswfSk7CisgICAgZWxzZQorICAgIHsKKyAgICAgIGNvdW50ZXI9MDttYXhsZW49MDsKKyAgICAgIHRtcD1maWx0ZXIoYXJncywjJ19sc19tYXhsZW4sZmxhZ3MsJm1heGxlbik7CisgICAgICBpZiAobWF4bGVuPjc2KSBtYXhsZW49NzY7CisgICAgICBtYXhjb3VudD0oNzgvKG1heGxlbisyKSktMTsKKyAgICAgIHRtcD1tYXAodG1wLCMnX2xzX291dHB1dF9zaG9ydCxtYXhsZW4sJmNvdW50ZXIsbWF4Y291bnQpOworICAgIH0KKyAgICBvdXRwdXQ9c3ByaW50ZigiXG4lZCBEYXRlaWVuL1VudGVydmVyemVpY2huaXNzZTpcbiVzXG4iLAorICAgICAgICAgICAgICAgICAgIHNpemVvZih0bXApLGltcGxvZGUodG1wLCIiKSk7CisgIH0KKyAgZm9yKGk9MDtpPGFyZ19zaXplO2krKykKKyAgeworICAgIHRtcD0oe30pOworICAgIHNpemU9YXJnc1tpXVtGSUxFU0laRV07CisgICAgaWYgKHNpemU9PS0yKQorICAgIHsKKyAgICAgIHRtcD1maWxlX2xpc3QoKHthcmdzW2ldW0ZVTExOQU1FXSsiLyoifSksTU9ERV9MU0IsMCwiLyIpOworICAgICAgdG1wPXNvcnRfYXJyYXkodG1wLHNvcnRfZnVuKTsKKyAgICAgIGlmIChmbGFncyZMU19MKQorICAgICAgICB0bXA9bWFwKHRtcCwjJ19sc19vdXRwdXRfbG9uZyxmbGFncyx2X3JlYWQsCisgICAgICAgICAgICAgICAgICAgICAgdl93cml0ZSxjcmVhdG9yKS0oezB9KTsKKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgY291bnRlcj0wO21heGxlbj0wOworICAgICAgICB0bXA9ZmlsdGVyKHRtcCwjJ19sc19tYXhsZW4sZmxhZ3MsJm1heGxlbik7CisgICAgICAgIG1heGNvdW50PSg3OC8obWF4bGVuKzIpKTsKKyAgICAgICAgaWYgKG1heGNvdW50KSBtYXhjb3VudC0tOworICAgICAgICB0bXA9bWFwKHRtcCwjJ19sc19vdXRwdXRfc2hvcnQsbWF4bGVuLCZjb3VudGVyLG1heGNvdW50KTsKKyAgICAgIH0KKyAgICAgIGlmIChzaXplb2YodG1wKSkKKyAgICAgIHsKKyAgICAgICAgb3V0cHV0Kz1zcHJpbnRmKCJcbiVzOiBWZXJ6ZWljaG5pcywgJWQgRGF0ZWllbi9VbnRlcnZlcnplaWNobmlzc2U6XG4iLAorICAgICAgICAgICAgICAgICAgICAgIGFyZ3NbaV1bRlVMTE5BTUVdLHNpemVvZih0bXApKTsKKyAgICAgICAgb3V0cHV0Kz0oaW1wbG9kZSh0bXAsIiIpKygoc3RyaW5nKSh0bXBbPDFdWzwxLi48MV0pPT0iXG4iPyIiOiJcbiIpKTsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgb3V0cHV0Kz1zcHJpbnRmKCJcbiVzOiBMZWVyZXMgVmVyemVpY2huaXMuXG4iLGFyZ3NbaV1bRlVMTE5BTUVdKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgTW9yZShvdXRwdXQpOworICByZXR1cm4gMTsKK30KKworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIyMjIyMjIworLy8jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIE1PUkUgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyMjIyMjIyMKKy8vCisvLyBfbW9yZV9maWxlOiBNZWhyZXJlIEZpbGVzIGhpbnRlcmVpbmFuZGVyIGF1c2dlYmVuCisvLworCitwcml2YXRlIHZvaWQgX21vcmVfZmlsZShzdHJpbmcgKmFyZykKK3sKKyAgaWYgKCFzaXplb2YoYXJnKSkgcmV0dXJuOworICBwcmludGYoIm1vcmU6IE5hZWNoc3RlIERhdGVpOiAlc1xuIixhcmdbMF0pOworICBNb3JlKGFyZ1swXSwxLCMnX21vcmVfZmlsZSwoeyBhcmdbMS4uXX0pKTsKKyAgcmV0dXJuOworfQorCisKK3ByaXZhdGUgbWl4ZWQgX3NpemVfZmlsdGVyKG1peGVkICphcmcpCit7CisgIGlmIChhcmdbRklMRVNJWkVdPjApIHJldHVybiBhcmdbRlVMTE5BTUVdOworICBpZiAoYXJnW0ZJTEVTSVpFXT09MCkKKyAgeworICAgIHByaW50ZigiJXM6ICVzOiBMZWVyZSBEYXRlaS5cbiIscXVlcnlfdmVyYigpfHwibW9yZSIsYXJnW0ZVTExOQU1FXSk7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgaWYgKGFyZ1tGSUxFU0laRV09PS0yKQorICAgIHByaW50ZigiJXM6ICVzIGlzdCBlaW4gVmVyemVpY2huaXMuXG4iLHF1ZXJ5X3ZlcmIoKXx8Im1vcmUiLGFyZ1tGVUxMTkFNRV0pOworICBlbHNlCisgICAgcHJpbnRmKCIlczogJXM6IERhdGVpIGV4aXN0aWVydCBuaWNodC5cbiIsIHF1ZXJ5X3ZlcmIoKXx8Im1vcmUiLAorICAgICAgICAgICBhcmdbRlVMTE5BTUVdKTsKKyAgcmV0dXJuIDA7Cit9CisKKworLy8KKy8vIF9tb3JlOiBEYXRlaWVuIGFuemVpZ2VuCisvLyBjbWRsaW5lOiBLb21tYW5kb3plaWxlCisvLworCitzdGF0aWMgaW50IF9tb3JlKHN0cmluZyBjbWRsaW5lKQoreworICBtaXhlZCAqYXJnczsKKyAgaW50IGZsYWdzOworICBjbWRsaW5lPV91bnBhcnNlZF9hcmdzKCk7CisgIGFyZ3M9cGFyc2VhcmdzKGNtZGxpbmUsJmZsYWdzLCIiLDEpOworICBpZiAoZmxhZ3M9PS0xfHwhc2l6ZW9mKGFyZ3MpKSByZXR1cm4gVVNBR0UoIm1vcmUgPGRhdGVpPiBbPGRhdGVpMj4uLl0iKTsKKyAgYXJncz1maWxlX2xpc3QoYXJncyxNT0RFX01PUkUsMCwiLyIpOworICBpZiAoIXNpemVvZihhcmdzKSkKKyAgICByZXR1cm4gcHJpbnRmKCJtb3JlOiAlczogS2VpbmUgcGFzc2VuZGUgRGF0ZWkgZ2VmdW5kZW4uXG4iLGNtZGxpbmUpLDE7CisgIGFyZ3M9bWFwKGFyZ3MsIydfc2l6ZV9maWx0ZXIpLSh7MH0pOworICBpZiAoc2l6ZW9mKGFyZ3MpKSBfbW9yZV9maWxlKGFyZ3MpOworICByZXR1cm4gMTsKK30KKworLy8gICAgICAgICAgICAgICAgICAgICAgICAgIyMjIyMjIyMjIyMjIyMjIyMjIworLy8jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyBIRUFELCBUQUlMLCBDQVQgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMKKworc3RhdGljIGludCBfY2F0KHN0cmluZyBjbWRsaW5lKQoreworICBtaXhlZCAqYXJnczsKKyAgaW50IGZsYWdzOworICBjbWRsaW5lPV91bnBhcnNlZF9hcmdzKCk7CisgIGFyZ3M9cGFyc2VhcmdzKGNtZGxpbmUsJmZsYWdzLCIiLDEpOworICBpZihmbGFncz09LTF8fCFzaXplb2YoYXJncykpCisgICAgcmV0dXJuIFVTQUdFKHF1ZXJ5X3ZlcmIoKSsiIDxkYXRlaW5hbWU+IFs8ZGF0ZWkyPi4uXSIpOworICBhcmdzPWZpbGVfbGlzdChhcmdzLE1PREVfQ0FULDAsIi8iKTsKKyAgaWYgKCFzaXplb2YoYXJncykpCisgICAgcmV0dXJuIHByaW50ZigiJXM6ICVzOiBLZWluZSBwYXNzZW5kZSBEYXRlaSBnZWZ1bmRlbi5cbiIscXVlcnlfdmVyYigpLAorICAgICAgICAgICAgICAgIGNtZGxpbmUpLDE7CisgIGFyZ3M9bWFwKGFyZ3MsIydfc2l6ZV9maWx0ZXIpLSh7MH0pOworICBpZiAoIXNpemVvZihhcmdzKSkgcmV0dXJuIDE7CisgIHdoaWxlKHNpemVvZihhcmdzKSkKKyAgeworICAgIHN3aXRjaChxdWVyeV92ZXJiKCkpCisgICAgeworICAgICAgY2FzZSAiY2F0IjoKKyAgICAgICAgaWYgKCFjYXQoYXJnc1swXSkpCisgICAgICAgICAgcHJpbnRmKCJjYXQ6ICVzIGtvbm50ZSBuaWNodCBhbmdlemVpZ3Qgd2VyZGVuLlxuIixhcmdzWzBdKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlICJoZWFkIjoKKyAgICAgICAgaWYgKCFjYXQoYXJnc1swXSwwLDEwKSkKKyAgICAgICAgICBwcmludGYoImhlYWQ6ICVzIGtvbm50ZSBuaWNodCBhbmdlemVpZ3Qgd2VyZGVuLlxuIixhcmdzWzBdKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlICJ0YWlsIjogdGFpbChhcmdzWzBdKTsgYnJlYWs7CisgICAgfQorICAgIGFyZ3M9YXJnc1sxLi5dOworICB9CisgIHJldHVybiAxOworfQorCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMjIyMjIyMKKy8vIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyBNQU4gIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyMjIyMjIworCitzdGF0aWMgaW50IF9tYW4oc3RyaW5nIGNtZGxpbmUpCit7CisgIG1peGVkICphcmdzOworICBpbnQgaSwgZmxhZ3M7CisgIHN0cmluZyAqdG1wLCAqdG1wMjsKKworICBjbWRsaW5lPV91bnBhcnNlZF9hcmdzKCk7CisgIGFyZ3M9cGFyc2VhcmdzKGNtZGxpbmUsJmZsYWdzLE1BTl9PUFRTLDApOworICAKKyAgaWYgKGZsYWdzPT0tMSB8fAorICAgICAgKHNpemVvZihhcmdzKSE9MSAmJgorICAgICAgIChzaXplb2YoYXJncyk8MiB8fCBzaXplb2YoYXJnc1sxXSk+MSB8fCAhKGk9dG9faW50KGFyZ3NbMV0pKSkpKQorICAgIHJldHVybiBVU0FHRSgibWFuIFstIiBNQU5fT1BUUyAiXSA8aGlsZmVzZWl0ZT4iKTsKKyAgdG1wPWV4cGxvZGUoYXJnc1swXSwiLyIpOworCisgIGlmIChvbGRtYW5fcmVzdWx0ICYmIHNpemVvZih0bXApPT0xICYmIHNpemVvZihhcmdzKT09MSAmJgorICAgICAgc2l6ZW9mKHRtcFswXSk9PTEgJiYgKGk9dG9faW50KHRtcFswXSkpICYmIG1lbWJlcihvbGRtYW5fcmVzdWx0LGkpKSB7CisgICB0bXA9KHtvbGRtYW5fcmVzdWx0W2ksMF0sb2xkbWFuX3Jlc3VsdFtpLDFdfSk7CisgICBpPTA7CisgIH0KKyAgZWxzZSBpZiAoIShmbGFncyYoTUFOX018TUFOX1IpKSYmc2l6ZW9mKHRtcCk+MSkKKyAgeworICAgIGlmIChmaWxlX3NpemUoTUFORF9ET0NESVIrYXJnc1swXSk+PTApCisgICAgICB0bXA9KHt0bXBbPDFdLGFyZ3NbMF19KTsKKyAgICBlbHNlCisgICAgICB0bXA9KHt9KTsKKyAgfQorICBlbHNlCisgIHsKKyAgICBpZiAoZmxhZ3MmTUFOX1IpCisgICAgeworICAgICAgZmxhZ3MmPSh+TUFOX00pOworICAgICAgaWYgKGNhdGNoKHJlZ2V4cCgoeyIifSksYXJnc1swXSkpfHwKKyAgICAgICAgICAhcmVnZXhwKCh7IiJ9KSxhcmdzWzBdKSkKKyAgICAgICAgcmV0dXJuIHByaW50ZigibWFuOiBVbmd1ZWx0aWdlciBBdXNkcnVjayBpbiBNYXNrZS5cbiIpLDE7CisgICAgfQorICAgIHRtcD0oc3RyaW5nICopY2FsbF9vdGhlcihNQU5ELCJsb2NhdGUiLGFyZ3NbMF0sZmxhZ3MmKE1BTl9NfE1BTl9SKSk7CisgIH0KKworICBvbGRtYW5fcmVzdWx0PShtYXBwaW5nKTA7CisgIGlmKGkgJiYgc2l6ZW9mKHRtcCk+MiAmJiBzaXplb2YodG1wKT49KGk8PDEpKQorICAgIHRtcD10bXBbKChpPDwxKS0yKS4uKChpPDwxKS0xKV07CisgIHN3aXRjaChzaXplb2YodG1wKSkKKyAgeworICAgIGNhc2UgMDoKKyAgICAgIHByaW50ZigiS2VpbmUgSGlsZmVzZWl0ZSBnZWZ1bmRlbiBmdWVyICclcycuXG4iLGFyZ3NbMF0pOworICAgICAgYnJlYWs7CisgICAgY2FzZSAyOgorICAgICAgIC8qCisgICAgICAgICBpZiAoZmxhZ3MmTUFOX0kpCisgICAgICAgICB7CisgICAgICAgICAvLyBCUkFOQ0ggVE8gTUFOVUFMRAorICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgICB9CisgICAgICAgKi8KKyAgICAgIHByaW50ZigiRm9sZ2VuZGUgSGlsZmVzZWl0ZSB3dXJkZSBnZWZ1bmRlbjogJXNcbiIsdG1wWzFdKTsKKyAgICAgIE1vcmUoTUFORF9ET0NESVIrdG1wWzFdLDEpOworICAgICAgcmV0dXJuIDE7CisgICAgZGVmYXVsdDoKKyAgICAgIGk9c2l6ZW9mKHRtcCk+PjE7CisgICAgICB0bXAyPWFsbG9jYXRlKGkpOworICAgICAgb2xkbWFuX3Jlc3VsdD1tX2FsbG9jYXRlKGksMik7CisgICAgICB3aGlsZShpKQorICAgICAgeworICAgICAgICB0bXAyWyhpLTEpXT1zcHJpbnRmKCIlZDogIixpKSt0bXBbKGk8PDEpLTJdOworCW9sZG1hbl9yZXN1bHRbaSwwXT10bXBbKGk8PDEpLTJdOworCW9sZG1hbl9yZXN1bHRbaSwxXT10bXBbKGk8PDEpLTFdOworICAgICAgICBpLS07CisgICAgICB9CisgICAgICBwcmludGYoIkVzIHd1cmRlbiBmb2xnZW5kZSBwb3RlbnRpZWxsIHBhc3NlbmRlbiBTZWl0ZW4gZ2VmdW5kZW46XG4iCisgICAgICAgICAgICAgIiUnLSc3OC43OHNcbiVzJSctJzc4Ljc4c1xuIiwiIiwKKyAgICAgICAgICAgICBicmVha19zdHJpbmcoaW1wbG9kZSh0bXAyLCIgIiksNzgpLCIiKTsKKyAgICAgIGJyZWFrOworICB9CisgIHJldHVybiAxOworfQorCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMjIyMjIyMjCisvLyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgUk1BTiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMjIyMjIyMjCisKK3N0YXRpYyBpbnQgX3JtYW4oc3RyaW5nIHN0cikKK3sKKyAgaW50IGZsYWdzOworICBzdHJpbmcgKmFyZ3M7CisgIAorICBzdHI9X3VucGFyc2VkX2FyZ3MoKTsKKyAgYXJncz1wYXJzZWFyZ3Moc3RyLCZmbGFncywiIiwwKTsKKyAgaWYgKGZsYWdzPT0tMXx8c2l6ZW9mKGFyZ3MpIT0yKQorICAgIHJldHVybiBVU0FHRSgicm1hbiA8aGlsZmVzZWl0ZT4gPG11ZG5hbWU+Iik7CisgIHdyaXRlKCJtYW46ICIgKworICAgICAgICAoc3RyaW5nKWNhbGxfb3RoZXIoVURQX0NNRF9ESVIrIm1hbiIsInNlbmRfcmVxdWVzdCIsYXJnc1sxXSxhcmdzWzBdKSk7CisgIHJldHVybiAxOworfQorCisKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICMjIyMjIyMjIyMjIyMKKy8vIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgU0hPV1BST1BTICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICMjIyMjIyMjIyMjIyMKKworLy8KKy8vIF9zaG93cHJvcHM6IFplaWd0IFByb3BlcnRpZXMgenUgZWluZW0gT2JqZWt0IGFuCisvLworCitzdGF0aWMgaW50IF9zaG93cHJvcHMoc3RyaW5nIHN0cikKK3sKKyAgIGludCBpOworICAgc3RyaW5nICpsaXN0LCBhdXNnYWJlOworCisgICBpZiAoc3RyKSB7CisgICAgICBpZiAoc3RyWzBdIT0nLycpIHN0cj0iLyIrc3RyOworICAgICAgaWYgKHN0clswLi40XSE9Ii9zdGQvIikKKyAgICAgIHsKKyAgICAgICAgIHByaW50Zigic2hvd3Byb3BzOiBFcyBrb2VubmVuIG51ciBQcm9wZXJ0aWVzIHZvbiBPYmpla3RlbiAiCisgICAgICAgICAgICAgICAgImF1cyAvc3RkLyBhbmdlemVpZ3Qgd2VyZGVuLlxuIik7CisgICAgICAgICByZXR1cm4gMTsKKyAgICAgIH0KKyAgICAgIGlmIChzdHJbPDFdPT0nLicpIHN0cis9ImMiOworICAgICAgaWYgKHN0cls8Mi4uPDFdIT0iLmMiKSBzdHIrPSIuYyI7CisgICAgICBpZiAoZmlsZV9zaXplKHN0cik8MCkKKyAgICAgIHsKKyAgICAgICAgcHJpbnRmKCJzaG93cHJvcHM6ICVzOiBFcyBnaWJ0IGtlaW4gT2JqZWt0IGRpZXNlbiBOYW1lbnMuXG4iLHN0clswLi48M10pOworICAgICAgICByZXR1cm4gMTsKKyAgICAgIH0KKyAgICAgIGlmIChjYXRjaChjYWxsX290aGVyKHN0clswLi48M10sICI/Pz8iKSkpCisgICAgICB7CisgICAgICAgIHByaW50Zigic2hvd3Byb3BzOiAlczogRGF0ZWkga29ubnRlIG5pY2h0IGdlbGFkZW4gd2VyZGVuLlxuIixzdHIpOworICAgICAgICByZXR1cm4gMTsKKyAgICAgIH0KKyAgIH0KKyAgIGlmICghc3RyIHx8ICFmaW5kX29iamVjdChzdHIpKSB7CisgICAgICBub3RpZnlfZmFpbCgiV2VsY2hlIFByb3BlcnRpZXMgbW9lY2h0ZXN0IER1IHNlaGVuPyIKKyAgICAgICAgICAgICAgICAgICIgQnNwLjogPHNob3dwcm9wcyAvc3RkL25wYz5cbiIpOworICAgICAgcmV0dXJuIDA7CisgICB9CisgICBsaXN0PWluaGVyaXRfbGlzdChmaW5kX29iamVjdChzdHIpKTsKKyNpZiBfX1ZFUlNJT05fXyA8ICIzLjIuOSIKKyAgIGxpc3Q9bWFwKGxpc3QsbGFtYmRhKCh7J3h9KSwoeyMnZXh0cmFjdCwneCw0LC0yfSkpKTsKKyAgIGxpc3QrPW1hcChsaXN0LGxhbWJkYSgoeyd4fSksKHsjJ1s8LCh7IydvbGRfZXhwbG9kZSwneCwiLyJ9KSwxfSkpKTsKKyAgIGxpc3Q9bWFwKG1faW5kaWNlcyhta21hcHBpbmcobGlzdCkpLGxhbWJkYSgoeyd4fSksKHsjJyssKHsjJyssIi9zeXMvIiwneH0pLCJoIn0pKSk7CisgICBsaXN0PWZpbHRlcihsaXN0LGxhbWJkYSgoeyd4fSksKHsjJz4sKHsjJ2ZpbGVfc2l6ZSwneH0pLDB9KSkgKTsKKyNlbHNlCisgICBsaXN0PW1hcChsaXN0LCg6IHJldHVybiAkMVs1Li48Ml0rImgiOyA6KSk7CisgICBsaXN0Kz1tYXAobGlzdCwoOiByZXR1cm4gZXhwbG9kZSgkMSwiLyIpWzwxXTsgOikpOworICAgbGlzdD1tYXAobV9pbmRpY2VzKG1rbWFwcGluZyhsaXN0KSksKDogcmV0dXJuICIvc3lzLyIrJDE7IDopKTsKKyAgIGxpc3Q9ZmlsdGVyKGxpc3QsKDogcmV0dXJuIGZpbGVfc2l6ZSgkMSk+MDsgOikpOworI2VuZGlmCisgICBsaXN0PXNvcnRfYXJyYXkobGlzdCwgIyc8KTsKKyAgIGF1c2dhYmU9IiI7CisgICBmb3IgKGk9c2l6ZW9mKGxpc3QpO2ktLTspCisgICB7CisjaWYgX19WRVJTSU9OX18gPCAiMy4yLjkiCisgICAgIHN0cj1pbXBsb2RlKGZpbHRlcihvbGRfZXhwbG9kZShyZWFkX2ZpbGUobGlzdFtpXSksICJcbiIpLAorICAgICAgICBsYW1iZGEoICh7ICd4IH0pLCAoeyMnPT0sICh7IydleHRyYWN0LCAneCwgMCwgOX0pLCAiI2RlZmluZSBQXyJ9KSApKQorICAgICAgICAgICAgICAgICAsICJcbiIpOworI2Vsc2UKKyAgICAgc3RyPWltcGxvZGUoZmlsdGVyKGV4cGxvZGUocmVhZF9maWxlKGxpc3RbaV0pLCJcbiIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDogcmV0dXJuICQxWzAuLjldPT0iI2RlZmluZSBQXyI7OikpLCJcbiIpOworI2VuZGlmCisgICAgIGlmIChzdHIhPSIiKSBhdXNnYWJlKz1zcHJpbnRmKCIlc1xuJXNcblxuIiwgbGlzdFtpXSwgc3RyKTsKKyAgIH0KKyAgIGlmIChhdXNnYWJlIT0iIikKKyAgICAgTW9yZShhdXNnYWJlKTsKKyAgIGVsc2UKKyAgICAgcHJpbnRmKCJLZWluZSBQcm9wZXJ0eS1EZWZpbml0aW9uZW4genUgZGllc2VtIE9iamVrdCBnZWZ1bmRlbiFcbiIpOworICAgcmV0dXJuIDE7Cit9CisKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyMjIyMjIyMKKy8vIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyBHUkVQICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMjIyMjIyMjCisKKyNpZiBfX1ZFUlNJT05fXyA8ICIzLjIuOSIKKworcHJpdmF0ZSBpbnQgX2dyZXBfZmlsdGVyKHN0cmluZyBmaWxlbmFtZSkKK3sKKyAgcmV0dXJuIChjYWxsX290aGVyKCJ2YWxpZF93cml0ZSIsZmlsZW5hbWUsZ2V0dWlkKHRoaXNfb2JqZWN0KCkpLAorICAgICAgICAgICAgICAgICAgICAgICJ3cml0ZV9maWxlIix0aGlzX29iamVjdCgpKSE9MCk7Cit9CisKKyNlbmRpZgorCisvLworLy8gZ3JlcF9maWxlOiBEYXRlaSBncmVwcGVuCisvLyByZXhwcjogUmVndWxhciBFeHByZXNzaW9uCisvLyBmbGFnczogRmxhZ3MKKy8vCisKK3ByaXZhdGUgaW50IGdyZXBfZmlsZShtaXhlZCBmaWxlZGF0YSwgc3RyaW5nIHJleHByLCBpbnQgZmxhZ3MpCit7CisgIHN0cmluZyBmdWxsbmFtZSxkYXRhLGNhcnJ5LCpsaW5lcywqbGluZXNfb3JpZywqdG1wLCpyZXN1bHQ7CisgIGludCBwdHIsY291bnQsaSxub2wsbWF0Y2gsaW5kZXg7CisgIGZ1bGxuYW1lPWZpbGVkYXRhW0ZVTExOQU1FXTsKKyAgaWYgKChmbGFncyZHUkVQX0YpJiZmdWxsbmFtZT09Ii9wbGF5ZXJzLyIrZ2V0dWlkKCkrIi9ncmVwLm91dCIpCisgIHsJIAorCXdyaXRlX2ZpbGUoIi9wbGF5ZXJzLyIrZ2V0dWlkKCkrIi9ncmVwLm91dCIsCisgICAgICAgICAgICAgICAgICAgIlVlYmVyZ2VoZSBncmVwLm91dCAuLi5cbiIpOworCXJldHVybiBSRVRfRkFJTDsKKyAgfQorICBzd2l0Y2goZmlsZWRhdGFbRklMRVNJWkVdKQorICB7CisgICAgY2FzZSAtMjogcmV0dXJuIFJFVF9GQUlMOworICAgIGNhc2UgLTE6IHJldHVybiBFUlJPUihET0VTTlRfRVhJU1QsZnVsbG5hbWUsUkVUX0ZBSUwpOworICAgIGNhc2UgMDogIHJldHVybiBSRVRfRkFJTDsKKyAgICBkZWZhdWx0OiBicmVhazsKKyAgfQorICBpZiAoIU1BWV9SRUFEKGZ1bGxuYW1lKSkgcmV0dXJuIEVSUk9SKE5PX1JFQUQsZnVsbG5hbWUsUkVUX0ZBSUwpOworICBjYXJyeT0iIjsgcmVzdWx0PSh7fSk7CisgIGlmIChmbGFncyZHUkVQX0kpCisgICAgcmV4cHI9bG93ZXJfY2FzZShyZXhwcik7CisgIGRvCisgIHsKKyAgICBkYXRhPXJlYWRfYnl0ZXMoZnVsbG5hbWUscHRyLE1BWExFTil8fCIiOworICAgIHB0cis9TUFYTEVOOworICAgIGxpbmVzPWV4cGxvZGUoY2FycnkrZGF0YSwiXG4iKTsKKyAgICBzd2l0Y2goc2l6ZW9mKGxpbmVzKSkKKyAgICB7CisgICAgICBjYXNlIDA6IGNvbnRpbnVlOworICAgICAgY2FzZSAxOgorICAgICAgICBjYXJyeT0iIjsKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICBjYXJyeT1saW5lc1s8MV07CisgICAgICAgIGxpbmVzPWxpbmVzWzAuLjwyXTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGxpbmVzX29yaWc9bGluZXM7CisgICAgaWYgKGZsYWdzJkdSRVBfSSkKKyAgICAgIGxpbmVzPW1hcChsaW5lcywjJ2xvd2VyX2Nhc2UpOworICAgIG5vbD1zaXplb2YobGluZXMpOworICAgIGZvciAoaT0wO2k8bm9sO2krKykKKyAgICB7CisgICAgICBtYXRjaD1zaXplb2YocmVnZXhwKGxpbmVzW2kuLmldLHJleHByKSk7CisgICAgICBpZiAoZmxhZ3MmR1JFUF9WKSBtYXRjaD0hbWF0Y2g7CisgICAgICBpZiAobWF0Y2gpCisgICAgICB7CisgICAgICAgIGlmICghKGZsYWdzJkdSRVBfQykpCisgICAgICAgIHsKKyAgICAgICAgICBpZiAoZmxhZ3MmR1JFUF9OKQorICAgICAgICAgICAgcmVzdWx0Kz0oeyBzcHJpbnRmKCIlNGQgJXMiLGluZGV4K2krMSxsaW5lc19vcmlnW2ldKX0pOworICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJlc3VsdCs9bGluZXNfb3JpZ1tpLi5pXTsKKyAgICAgICAgfQorICAgICAgICBjb3VudCsrOworICAgICAgfQorICAgIH0KKyAgICBpbmRleCs9bm9sOworICB9CisgIHdoaWxlKHNpemVvZihkYXRhKT09TUFYTEVOKTsKKyAgaWYgKGNhcnJ5IT0iIikKKyAgeworICAgIGlmIChmbGFncyZHUkVQX0kpIGNhcnJ5PWxvd2VyX2Nhc2UoY2FycnkpOworICAgIG1hdGNoPXNpemVvZihyZWdleHAoKHsgY2FycnkgfSkscmV4cHIpKTsKKyAgICBpZiAoZmxhZ3MmR1JFUF9WKSBtYXRjaD0hbWF0Y2g7CisgICAgaWYgKG1hdGNoKQorICAgIHsKKyAgICAgIGlmKCEoZmxhZ3MmR1JFUF9DKSkKKyAgICAgIHsKKyAgICAgICAgaWYoZmxhZ3MmR1JFUF9OKQorICAgICAgICAgICByZXN1bHQrPSh7IHNwcmludGYoIiU0ZCAlcyIsaW5kZXgrMSxjYXJyeSkgfSk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgcmVzdWx0Kz0oe2NhcnJ5fSk7CisgICAgICB9CisgICAgICBjb3VudCsrOworICAgIH0KKyAgfQorICBjYXJyeT0iIjsKKyAgaWYgKGNvdW50KQorICB7CisgICAgaWYgKGZsYWdzJkdSRVBfTCkgY2Fycnk9c3ByaW50ZigiJXNcbiIsZnVsbG5hbWUpOworICAgIGVsc2UgaWYgKGZsYWdzJkdSRVBfSCkgZGF0YT0iIjsKKyAgICBlbHNlIGRhdGE9c3ByaW50ZigiICVzOiIsZnVsbG5hbWUpOworICAgIGlmIChmbGFncyZHUkVQX0MpIGNhcnJ5PXNwcmludGYoIiVzICVkIHBhc3NlbmRlIFplaWxlJXMuXG4iLGRhdGEsY291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb3VudD09MT8iIjoibiIpKTsKKyAgICBlbHNlCisgICAgICBjYXJyeT0oZGF0YSsiXG4iK2ltcGxvZGUocmVzdWx0LCJcbiIpKyJcbiIpOworICB9CisgIGlmIChmbGFncyZHUkVQX0YpCisgICAgcmV0dXJuIHdyaXRlX2ZpbGUoIi9wbGF5ZXJzLyIrZ2V0dWlkKCkrIi9ncmVwLm91dCIsY2FycnkpOworICB3cml0ZShjYXJyeSk7CisgIHJldHVybiBSRVRfT0s7Cit9CisKK3N0YXRpYyBpbnQgX2dyZXAoc3RyaW5nIGNtZGxpbmUpCit7CisgIHN0cmluZyByZXhwcixtYXNrOworICBtaXhlZCAqYXJnczsKKyAgaW50IGZsYWdzOworICBjbWRsaW5lPV91bnBhcnNlZF9hcmdzKCk7CisgIGFyZ3M9cGFyc2VhcmdzKGNtZGxpbmUsJmZsYWdzLEdSRVBfT1BUUywwKTsKKyAgaWYgKChmbGFncz09LTEpfHwhc2l6ZW9mKGFyZ3MpKQorICAgIHJldHVybiBVU0FHRSgiZ3JlcCBbLSIgR1JFUF9PUFRTCisgICAgICAgICAgIl0gPHJlZ2V4cD4gPGRhdGVpL3Zlcno+IFs8ZGF0ZWkyPiAuLi4gXSBbPG1hc2tlPl0iKTsKKyAgcmV4cHI9YXJnc1swXTsKKyAgaWYgKGNhdGNoKHJlZ2V4cCgoeyIifSkscmV4cHIpKXx8IXJlZ2V4cCgoeyIifSkscmV4cHIpKQorICAgIHJldHVybiBwcmludGYoImdyZXA6IFVuZ3VlbHRpZ2VyIFN1Y2hhdXNkcnVjazogJXNcbiIscmV4cHIpICwxOworICBhcmdzPWFyZ3NbMS4uXTsKKyAgaWYgKGZsYWdzJkdSRVBfTSkKKyAgeworICAgIG1hc2s9YXJnc1s8MV07CisgICAgYXJncz1hcmdzWzAuLjwyXTsKKyAgfQorICBpZiAoIXNpemVvZihhcmdzKSkKKyAgICAgIHJldHVybiBVU0FHRSgiZ3JlcCBbLSIgR1JFUF9PUFRTCisgICAgICAgICAgIl0gPHJlZ2V4cD4gPGRhdGVpL3Zlcno+IFs8ZGF0ZWkyPiAuLi4gXSBbPG1hc2tlPl0iKTsKKyAgYXJncz1tYXAoYXJncywjJ3RvX2ZpbGVuYW1lKS0oezB9KTsKKyAgLyoKKyNpZiBfX1ZFUlNJT05fXyA8ICIzLjIuOSIKKyAgYXJncz1maWx0ZXIoYXJncywjJ19ncmVwX2ZpbHRlcik7CisjZWxzZQorICBhcmdzPWZpbHRlcihhcmdzLCg6IHJldHVybiAodmFsaWRfd3JpdGUoJDEsCisgICAgICAgICAgICBnZXR1aWQodGhpc19vYmplY3QoKSksIndyaXRlX2ZpbGUiLHRoaXNfb2JqZWN0KCkpIT0wKTopKTsKKyNlbmRpZgorICAqLworICBhcmdzPWZpbGVfbGlzdChhcmdzLE1PREVfR1JFUCwoZmxhZ3MmR1JFUF9SPzE6MCksIi8iLG1hc2spOworICBpZiAoIXNpemVvZihhcmdzKSkKKyAgICByZXR1cm4gcHJpbnRmKCJLZWluZSBwYXNzZW5kZW4gRGF0ZWllbiBnZWZ1bmRlbi5cbiIpLDE7CisgIGlmIChmbGFncyZHUkVQX0kpIHJleHByPWxvd2VyX2Nhc2UocmV4cHIpOworICBpZiAoZmxhZ3MmR1JFUF9GKQorICB7CisgICAgaWYgKGZpbGVfc2l6ZSgiL3BsYXllcnMvIitnZXR1aWQoKSsiL2dyZXAub3V0Iik9PS0yfHwKKwkgICFNQVlfV1JJVEUoIi9wbGF5ZXJzLyIrZ2V0dWlkKCkrIi9ncmVwLm91dCIpKQorICAgICAgcmV0dXJuIHByaW50ZigiZ3JlcDogRGF0ZWkgL3BsYXllcnMvJXMvZ3JlcC5vdXQga2FubiBuaWNodCAiCisJCSAgICAgICJnZXNjaHJpZWJlbiB3ZXJkZW4uXG4iLGdldHVpZCgpKSwxOworICAgIGVsc2UKKyAgICAgIHdyaXRlX2ZpbGUoIi9wbGF5ZXJzLyIrZ2V0dWlkKCkrIi9ncmVwLm91dCIsCisgICAgICAgICAgICAgICAgICJBdXNnYWJlIHZvbiBcImdyZXAgIiArIF91bnBhcnNlZF9hcmdzKCkgKyAiXCI6XG4iKTsgCisgIH0KKyAgYXN5bmNocm9uKGFyZ3MsIydncmVwX2ZpbGUscmV4cHIsZmxhZ3MsMCk7CisgIHJldHVybiAxOworfQpkaWZmIC0tZ2l0IGEvc3RkL3NoZWxscy9tYWdpZXIvbWFnaWVyX2V4dC5jIGIvc3RkL3NoZWxscy9tYWdpZXIvbWFnaWVyX2V4dC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE1ZDMwYjIKLS0tIC9kZXYvbnVsbAorKysgYi9zdGQvc2hlbGxzL21hZ2llci9tYWdpZXJfZXh0LmMKQEAgLTAsMCArMSw3MzMgQEAKKy8vICRJZDogbWFnaWVyX2V4dC5jIDk1NTUgMjAxNi0wNS0wMyAyMDo0Mjo0NlogWmVzc3RyYSAkCisjcHJhZ21hIHN0cmljdF90eXBlcworI3ByYWdtYSBzYXZlX3R5cGVzCisvLyNwcmFnbWEgcmFuZ2VfY2hlY2sKKyNwcmFnbWEgbm9fY2xvbmUKKyNwcmFnbWEgcGVkYW50aWMKKworI2luY2x1ZGUgPHdpemxldmVscy5oPgorI2luY2x1ZGUgPGxvZ2dpbmcuaD4KKyNpbmNsdWRlIDxtYWdpZXIuaD4KKyNpbmNsdWRlIDxzbm9vcGluZy5oPgorI2luY2x1ZGUgPGRyaXZlcl9pbmZvLmg+CisjZGVmaW5lIE5FRURfUFJPVE9UWVBFUworI2luY2x1ZGUgPHBsYXllci90ZWxuZXRuZWcuaD4KKyNpbmNsdWRlIDxwbGF5ZXIvYmFzZS5oPgorI3VuZGVmIE5FRURfUFJPVE9UWVBFUworI2luY2x1ZGUgPHByb3BlcnRpZXMuaD4KKyNpbmNsdWRlIDxmaWxlcy5oPgorI2luY2x1ZGUgPGV2ZW50cy5oPgorI2luY2x1ZGUgPHBsYXllci9jb21tLmg+CisKK2luaGVyaXQgIi9zdGQvc2hlbGxzL21hZ2llci9wYXJzaW5nIjsKK2luaGVyaXQgIi9zdGQvc2hlbGxzL21hZ2llci91cGQiOworaW5oZXJpdCAiL3N0ZC9zaGVsbHMvbWFnaWVyL2ZpbGV2aWV3IjsKK2luaGVyaXQgIi9zdGQvc2hlbGxzL21hZ2llci9vYmplY3RzIjsKK2luaGVyaXQgIi9zdGQvc2hlbGxzL21hZ2llci9maWxlZWRpdCI7CisvL2luaGVyaXQgIi9zdGQvc2hlbGxzL21hZ2llci90b2RvIjsKK2luaGVyaXQgIi9zdGQvc2hlbGxzL21hZ2llci9wbGF5ZXJzIjsKK2luaGVyaXQgIi9zdGQvc2hlbGxzL21hZ2llci9hZG1pbiI7Citpbmhlcml0ICIvc3RkL3NoZWxscy9tYWdpZXIvbW92aW5nIjsKK2luaGVyaXQgIi9zdGQvc2hlbGxzL21hZ2llci9jb21tIjsKKworCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMjIyMjIyMKKy8vIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyBTRVQgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMjIyMjIyMKKworCisvLworLy8gX3NldCgpOiBTaGVsbC1CZWZlaGwgJ3NldCcKKy8vIGFyZ3M6ICAgS29tbWFuZG96ZWlsZW5hcmd1bWVudGUKKy8vCisKK3N0YXRpYyBpbnQgX3NldChtaXhlZCBhcmdzKQoreworICBpbnQgcG9zOworICBzdHJpbmcgdmFyOworICBtaXhlZCB2YWw7CisgIG1hcHBpbmcgdmFyczsKKworICBpZighYXJncz1fdW5wYXJzZWRfYXJncygpKQorICB7CisgICAgaWYoIXNpemVvZih2YXJzPVF1ZXJ5UHJvcChQX1ZBUklBQkxFUykpKSAKKyAgICAgIHByaW50ZigiRHUgaGFzdCBub2NoIGtlaW5lIFZhcmlhYmxlbiBkZWZpbmllcnQhXG4iKTsKKyAgICBlbHNlCisgICAgeworICAgICAgcHJpbnRmKCJEdSBoYXN0IGRpZSBmb2xnZW5kZW4gVmFyaWFibGVuIGRlZmluaWVydDpcbiIpOworICAgICAgd2Fsa19tYXBwaW5nKHZhcnMsKCg6IHByaW50ZigiICUtMjBzID0gJXNcbiIsJDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb2ludGVycCgkMik/aW1wbG9kZSgkMiwiOiIpOiQyKSA6KSkpOworCisgICAgfQorICAgIHJldHVybiAxOworICB9CisgIHBvcyA9IG1lbWJlcihhcmdzLCcgJyk7CisgIGlmKHBvcyA9PSAtMSkKKyAgICBpZihzaXplb2YoYXJncykpCisgICAgICB7CisgICAgICAgIG1fZGVsZXRlKFF1ZXJ5UHJvcChQX1ZBUklBQkxFUyksIGFyZ3MpOworICAgICAgICBwcmludGYoIlZhcmlhYmxlICVzIHd1cmRlIGdlbG9lc2NodC5cbiIsYXJncyk7CisgICAgICAgIHJldHVybiAxOworICAgICAgfQorICAgIGVsc2UgcmV0dXJuIFVTQUdFKCJzZXQgPHZhcmlhYmxlPiA8d2VydD4iKTsKKyAgdmFyID0gYXJnc1swLi5wb3MtMV07CisgIHZhbCA9IChtZW1iZXIoYXJnc1twb3MrMS4uXSwnOicpPi0xPworICAgICAgICAgZXhwbG9kZShhcmdzW3BvcysxLi5dLCAiOiIpIDoKKyAgICAgICAgIGFyZ3NbcG9zKzEuLl0pOworICB2YXJzPVF1ZXJ5UHJvcChQX1ZBUklBQkxFUyk7CisgIHZhcnMrPSAoW3ZhciA6IHZhbF0pOworICBwcmludGYoIlZhcmlhYmxlIGdlc2V0enQ6ICVzID0gJXNcbiIsdmFyLGFyZ3NbcG9zKzEuLl0pOworICByZXR1cm4gMTsKK30KKworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIyMjIyMjIyMjIyMjCisvLyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIENEICsgUFdEICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIyMjIyMjIyMjIyMKKworc3RhdGljIGludCBfcHdkKCkKK3sKKyAgcHJpbnRmKCJBa3R1ZWxsZXMgVmVyemVpY2huaXM6ICVzXG4iLFF1ZXJ5UHJvcChQX0NVUlJFTlRESVIpKTsKKyAgcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgX2NkMihzdHJpbmcgY21kbGluZSkKK3sKKyAgc3RyaW5nIGRlc3QsdG1wOworICBpbnQgZmxhZ3M7CisgIG1peGVkICphcmdzOworICAKKyAgYXJncz1wYXJzZWFyZ3MoY21kbGluZSwmZmxhZ3MsQ0RfT1BUUywxKTsKKyAgaWYgKGZsYWdzPT0tMSkgcmV0dXJuIDA7CisgIGlmKGZsYWdzJkNEX0IpCisgIHsKKyAgICBkZXN0PVF1ZXJ5UHJvcChQX0xBU1RESVIpOworICB9CisgIGlmIChzaXplb2YoYXJncyk+MSkKKyAgICByZXR1cm4gbm90aWZ5X2ZhaWwoIk1hbiBrYW5uIHNpY2ggKGxlaWRlcikgbnVyIGluIGVpbmVtICIKKyAgICAgICAgICAgICAgICAgICAgICAgIlZlcnplaWNobmlzIGdsZWljaHplaXRpZyBiZWZpbmRlbi5cbiIpLDA7CisgIGlmKCFkZXN0KQorICB7CisgICAgaWYgKCFzaXplb2YoYXJncykpCisgICAgeworICAgICAgaWYgKElTX1dJWkFSRCh0aGlzX29iamVjdCgpKSkKKyAgICAgICAgZGVzdD0iL3BsYXllcnMvIitnZXR1aWQodGhpc19vYmplY3QoKSk7CisgICAgICBlbHNlCisgICAgICAgIGRlc3Q9Ii9kb2MiOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgZGVzdD1hcmdzWzBdOworICAgIH0KKyAgfQorICAKKyAgaWYgKGRlc3QhPSIvIikKKyAgeworICAgIGFyZ3M9ZmlsZV9saXN0KCh7ZGVzdH0pLE1PREVfQ0QsMCwiLyIpOworICAgIGFyZ3MgPSBmaWx0ZXIoYXJncywgZnVuY3Rpb24gaW50IChtaXhlZCBhcnIpCisgICAgICAgIHsgcmV0dXJuIGFycltGSUxFU0laRV0gPT0gRlNJWkVfRElSOyB9ICk7CisKKyAgICBpZiAoIXNpemVvZihhcmdzKSkKKyAgICAgIHJldHVybiBub3RpZnlfZmFpbCgiY2Q6ICIrZGVzdCsKKyAgICAgICAgICAgICAgICAgICAgICAgIjogS2VpbiBzb2xjaGVzIFZlcnplaWNobmlzIGdlZnVuZGVuLlxuIiksMDsKKyAgICBpZiAoc2l6ZW9mKGFyZ3MpPjEpCisgICAgICByZXR1cm4gbm90aWZ5X2ZhaWwoImNkOiAiK2Rlc3QrIjogTWFza2UgaXN0IG5pY2h0IGVpbmRldXRpZy5cbiIpLDA7CisgICAgZGVzdD1hcmdzWzBdW0ZVTExOQU1FXTsKKyAgfQorICBpZiAoIUlTX1dJWkFSRCh0aGlzX29iamVjdCgpKSYmZGVzdFswLi4zXSE9Ii9kb2MiKSBkZXN0PSIvZG9jIjsKKyAgU2V0UHJvcChQX0xBU1RESVIsUXVlcnlQcm9wKFBfQ1VSUkVOVERJUikpOworICBwcmludGYoIkFrdHVlbGxlcyBWZXJ6ZWljaG5pcyBpc3QgamV0enQ6ICVzXG4iLFNldFByb3AoUF9DVVJSRU5URElSLGRlc3QpKTsKKyAgdG1wPSIiOworICBpZiAoKChmbGFncyZDRF9MKXx8CisgICAgICAgKCghbV9jb250YWlucygmdG1wLFF1ZXJ5UHJvcChQX1ZBUklBQkxFUyksIkNEX1NIT1JUIil8fAorICAgICAgICAgdG1wIT0iMSIpJiYoIShmbGFncyZDRF9TKSkpKSkKKyAgICB0ZWxsX29iamVjdCh0aGlzX29iamVjdCgpLAorICAgICAgICAgICAgICAgIHJlYWRfZmlsZShkZXN0KyhkZXN0WzwxXT09Jy8nPyIucmVhZG1lIjoiLy5yZWFkbWUiKSl8fCIiKTsKKyAgcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgX2NkKHN0cmluZyBjbWRsaW5lKQoreworICByZXR1cm4gX2NkMihfdW5wYXJzZWRfYXJncygpKTsKK30KKworc3RhdGljIHN0cmluZyBfc2V0X2N1cnJlbnRkaXIoc3RyaW5nIHBhdGgpCit7CisgIFNldChQX0NVUlJFTlRESVIsIHBhdGgpOworICB0aGlzX29iamVjdCgpLT5tb2RpZnlfcHJvbXB0KCk7ICAvLyBQcm9tcHQgbWl0IG5ldWVtIFBmYWQgc2V0emVuLCB0ZWxuZXRuZWcKKyAgcmV0dXJuIHBhdGg7Cit9CisKK3ByaXZhdGUgc3RyaW5nIF9xdWVyeV9jdXJyZW50ZGlyKCkKK3sKKyAgc3RyaW5nIGM7CisgIGlmKCFjPVF1ZXJ5KFBfQ1VSUkVOVERJUikpCisgICAgcmV0dXJuIFNldChQX0NVUlJFTlRESVIsICIvcGxheWVycy8iK2dldHVpZCh0aGlzX29iamVjdCgpKSxGX1ZBTFVFKTsKKyAgcmV0dXJuIGM7Cit9CisKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgIyMjIyMjIyMjIworLy8jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIFBST01QVCAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgIyMjIyMjIyMjIworCisvLworLy8gX3Byb21wdF9zdWJzdDogTXVkbmFtZW4sIFVzZXJuYW1lbiwgWmVpbGVudm9yc2NodWIgaW4gRWluZ2FiZWF1Zi0KKy8vICAgICAgICAgICAgICAgIGZvcmRlcnVuZyBlaW5iYXVlbgorLy8gc3RyOiAgICAgICAgICAgVWViZXJnZWJlbmVyIEtvbW1hbmRvemVpbGVuYWJzY2huaXR0CisvLworCitwcml2YXRlIHN0cmluZyBfcHJvbXB0X3N1YnN0KHN0cmluZyBzdHIpCit7CisgIHN3aXRjaChzdHIpCisgIHsKKyAgICBjYXNlICJcXGgiOiByZXR1cm4gc2l6ZW9mKE1VRE5BTUUpP01VRE5BTUU6Ik11ZCBvaG5lIE5hbWVuIjsKKyAgICBjYXNlICJcXHUiOiByZXR1cm4gY2FwaXRhbGl6ZShnZXR1aWQodGhpc19vYmplY3QoKSkpOworICAgIGNhc2UgIlxcbiI6IHJldHVybiAiXG4iOworICAgIGNhc2UgIlxcdCI6IHJldHVybiAiXHQiOworICAgIGNhc2UgIlxcdyI6IHJldHVybiAiXHciOworICB9CisgIHJldHVybiBzdHI7Cit9CisKKworLy8KKy8vIF9wcm9tcHQ6IEVpbmdhYmVhdWZmb3JkZXJ1bmcgc2V0emVuCisvLyBhcmc6ICAgICBLb21tYW5kb3plaWxlCisvLworCitzdGF0aWMgaW50IF9wcm9tcHQoc3RyaW5nIGFyZ3MpCit7CisgIHN0cmluZyAqcGFyZ3M7CisKKyAgYXJncz0oZXh0ZXJuX2NhbGwoKT9fdW5wYXJzZWRfYXJncygpOmFyZ3MpOworICBpZiAoIXNpemVvZihhcmdzKSkgYXJncz0iPiAiOworICBpZiAoYXJnc1swXT09JyInKSBhcmdzPWFyZ3NbMS4uPDJdOyAgICAgLy8iKTsKKyAgaWYoIXNpemVvZihwYXJncyA9IHJlZ2V4cGxvZGUoYXJncywgIlxcXFxbdGh1d25dIikpKQorICAgIHJldHVybiBVU0FHRSgicHJvbXB0IFwiPEVpbmdhYmVhdWZmb3JkZXJ1bmdzZGVmaW5pdGlvbj5cIiIpOworICBwYXJncz1tYXAocGFyZ3MsIydfcHJvbXB0X3N1YnN0KTsKKworICBTZXRQcm9wKFBfUFJPTVBULGltcGxvZGUocGFyZ3MsIiIpKTsKKyAgcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBzdHJpbmcgX3NldF9wcm9tcHQoc3RyaW5nIHByb21wdCkgeworICBTZXQoUF9QUk9NUFQsIHByb21wdCwgRl9WQUxVRSk7CisgIHRoaXNfb2JqZWN0KCktPm1vZGlmeV9wcm9tcHQoKTsgLy8gbmV1ZW4gUHJvbXB0IHNldHplbiAodGVsbmV0bmVnLmMpCisgIHJldHVybiBwcm9tcHQ7Cit9CisKKworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAjIyMjIyMjIyMjIyMjIworLy8jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIFNIT1dQUkVTQVkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAjIyMjIyMjIyMjIyMjIworCitzdGF0aWMgaW50IF9zaG93cHJlc2F5KHN0cmluZyBjbWRsaW5lKQoreworICBpbnQgcHJlc2F5OworICBwcmVzYXk9UXVlcnlQcm9wKFBfQ0FOX0ZMQUdTKSZDQU5fUFJFU0FZOworICBjbWRsaW5lPV91bnBhcnNlZF9hcmdzKDApOworICBpZiAoIXNpemVvZihjbWRsaW5lKSkKKyAgeworICAgIHByaW50ZigiRGVpbiBQcmVzYXkgd2lyZCBpbSBNb21lbnQgJXNhbmdlemVpZ3QuXG4iCisgICAgICAgICAgICIlc3NjaGFsdGVuIG1pdCBcJ3Nob3dwcmVzYXkgJXNcJy5cbiIsCisgICAgICAgICAgIHByZXNheT8iIjoibmljaHQgIixwcmVzYXk/IkF1cyI6IkVpbiIsCisgICAgICAgICAgIHByZXNheT8iYXVzIjoiZWluIik7CisgICAgcmV0dXJuIDE7CisgIH0KKyAgaWYgKGNtZGxpbmU9PSJlaW4ifHxjbWRsaW5lPT0iYW4iKQorICB7CisgICAgcHJpbnRmKCJEZWluIFByZXNheSB3aXJkIGpldHp0IGFuZ2V6ZWlndC5cbiIpOworICAgIFNldFByb3AoUF9DQU5fRkxBR1MsUXVlcnlQcm9wKFBfQ0FOX0ZMQUdTKXxDQU5fUFJFU0FZKTsKKyAgICByZXR1cm4gMTsKKyAgfQorICBpZiAoY21kbGluZT09ImF1cyIpCisgIHsKKyAgICBwcmludGYoIkRlaW4gUHJlc2F5IHdpcmQgamV0enQgbmljaHQgbWVociBhbmdlemVpZ3QuXG4iKTsKKyAgICBTZXRQcm9wKFBfQ0FOX0ZMQUdTLFF1ZXJ5UHJvcChQX0NBTl9GTEFHUykmfkNBTl9QUkVTQVkpOworICAgIHJldHVybiAxOworICB9CisgIHJldHVybiBVU0FHRSgic2hvd3ByZXNheSBbZWlufGFufGF1c10iKTsKK30KKworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIyMjIyMjIworLy8jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIEVYRUMgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIyMjIyMjIworCitzdGF0aWMgaW50IF9leGVjKHN0cmluZyBmaWxlbmFtZSkKK3sKKyAgb2JqZWN0IG9iOworICBpZiAoIUlTX0xPUkQodGhpc19vYmplY3QoKSkpIHJldHVybiAwOworICBpZiAodGhpc19wbGF5ZXIoKSE9dGhpc19pbnRlcmFjdGl2ZSgpKSByZXR1cm4gMDsKKyAgaWYgKHRoaXNfcGxheWVyKCkhPXRoaXNfb2JqZWN0KCkpIHJldHVybiAwOworICBpZiAoIShmaWxlbmFtZT1fdW5wYXJzZWRfYXJncygpKSkgcmV0dXJuIFVTQUdFKCJleGVjIDxvYmpla3RuYW1lPiIpOworICBmaWxlbmFtZT0oc3RyaW5nKSJzZWN1cmUvbWFzdGVyIi0+X2dldF9wYXRoKGZpbGVuYW1lLGdldHVpZCgpKTsKKyAgaWYgKGZpbGVfc2l6ZShmaWxlbmFtZSk8MCYmKCF0b19maWxlbmFtZShmaWxlbmFtZSsiLmMiKSl8fAorICAgICAgZmlsZV9zaXplKHRvX2ZpbGVuYW1lKGZpbGVuYW1lKyIuYyIpKTwwKQorICB7CisgICAgcHJpbnRmKCJleGVjOiAlczogRGF0ZWkgbmljaHQgdm9yaGFuZGVuIG9kZXIgZWluIFZlcnplaWNobmlzLlxuIixmaWxlbmFtZSk7CisgICAgcmV0dXJuIDE7CisgIH0KKyAgaWYgKGNhdGNoKGNhbGxfb3RoZXIoZmlsZW5hbWUsIj8/Pz8iKSkpIAorICB7CisgICAgcHJpbnRmKCJleGVjOiBGZWhsZXIgYmVpbSBMYWRlbiB2b24gJXMuXG4iLGZpbGVuYW1lKTsKKyAgICByZXR1cm4gMTsKKyAgfQorICBpZiAoIShvYj1jbG9uZV9vYmplY3QoZmlsZW5hbWUpKSkgcmV0dXJuIDA7CisgIGlmIChnZXR1aWQob2IpICE9IGdldHVpZCh0aGlzX29iamVjdCgpKSkKKyAgeworICAgIHByaW50ZigiZXhlYzogVUlELUtvbmZsaWt0OiAlcyA8LT4gJXMuXG4iLGdldHVpZChvYiksCisgICAgICAgICAgIGdldHVpZCh0aGlzX29iamVjdCgpKSk7CisgICAgZGVzdHJ1Y3Qob2IpOworICAgIHJldHVybiAxOworICB9CisgIGxvZ19maWxlKFNIRUxMTE9HKCJFWEVDIiksCisgICAgICAgICBzcHJpbnRmKCIlMTIuMTJzICU0MC40MHMgJTI1LjI1c1xuIiwKKyAgICAgICAgICAgICAgICAgY2FwaXRhbGl6ZShnZXR1aWQodGhpc19vYmplY3QoKSkpLGZpbGVuYW1lLGR0aW1lKHRpbWUoKSlbNC4uXSkpOworICBkaXNhYmxlX2NvbW1hbmRzKCk7CisgIGV4ZWMob2IsdGhpc19vYmplY3QoKSk7CisgIGlmIChpbnRlcmFjdGl2ZSh0aGlzX29iamVjdCgpKXx8IWludGVyYWN0aXZlKG9iKSkKKyAgeworICAgIGVuYWJsZV9jb21tYW5kcygpOworICAgIHByaW50ZigiRmVobGVyIGJlaSBFWEVDOiBVZWJlcnRyYWd1bmcgZGVyIFNoZWxsICIKKyAgICAgICAgICAgIm5pY2h0IG1vZWdsaWNoLlxuIik7CisgICAgcmV0dXJuIDE7CisgIH0KKyAgb2ItPnN0YXJ0X3BsYXllcihjYXBpdGFsaXplKGdldHVpZCh0aGlzX29iamVjdCgpKSkpOworICByZW1vdmUoKTsKKyAgcmV0dXJuIDE7Cit9CisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIyMjIyMjIyMjIyMKKy8vIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgU05PT1BJTkcgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIyMjIyMjIyMjIyMjCisKK3ByaXZhdGUgbm9zYXZlIHN0cmluZyBzbm9vcF9hbGxvd2VkOworcHJpdmF0ZSBub3NhdmUgb2JqZWN0IHNub29wZWU7CisKK25vbWFzayBpbnQgUXVlcnlBbGxvd1Nub29wKG9iamVjdCB3aG8pCit7CisgIHJldHVybiAoZ2V0dWlkKHdobykgPT0gc25vb3BfYWxsb3dlZCk7Cit9CisKK3N0YXRpYyBpbnQgX3NhbGxvdyhzdHJpbmcgc3RyKQoreworICBvYmplY3Qgb2I7CisKKyAgaWYgKCFzaXplb2Yoc3RyKSkKKyAgeworICAgIGlmICghc25vb3BfYWxsb3dlZCkgcmV0dXJuIFVTQUdFKCJzYWxsb3cgWzxuYW1lPl1cbiIpOworICAgIHN0cj1zbm9vcF9hbGxvd2VkOworICAgIHNub29wX2FsbG93ZWQ9MDsKKyAgICBwcmludGYoIkR1IGVudHppZWhzdCAlcyBkaWUgRXJsYXVibmlzIHp1bSBTbm9vcGVuLlxuIixjYXBpdGFsaXplKHN0cikpOworICAgIG9iPXF1ZXJ5X3Nub29wKHRoaXNfcGxheWVyKCkpOworICAgIGlmICghb2J8fChnZXR1aWQob2IpIT1zdHIpKSByZXR1cm4gMTsKKyAgICB0ZWxsX29iamVjdChvYixicmVha19zdHJpbmcoc3ByaW50ZigiJXMgZW50emllaHQgRGlyIGRpZSAiCisgICAgICAgICAgICAiRXJsYXVibmlzIHp1bSBzbm9vcGVuIHVuZCB6d2luZ3QgRGljaCBzbyBkYXp1LCBtaXQgIgorICAgICAgICAgICAgImRlbSBTbm9vcGVuIGF1Znp1aG9lcmVuLlxuIixjYXBpdGFsaXplKGdldHVpZCgpKSkpKTsKKyAgICBzbm9vcChvYik7CisgICAgcmV0dXJuIDE7CisgIH0KKyAgaWYgKHNub29wX2FsbG93ZWQpIF9zYWxsb3coIiIpOyAvLyBFcnN0bWFsIGFic2NoYWx0ZW4KKyAgb2I9ZmluZF9wbGF5ZXIobG93ZXJfY2FzZShzdHIpKTsKKyAgc3RyPWNhcGl0YWxpemUoc3RyKTsKKyAgaWYgKCFvYikgcmV0dXJuCisgICAgICBwcmludGYoInNhbGxvdzogU3BpZWxlciAlcyBrb25udGUgbmljaHQgZ2VmdW5kZW4gd2VyZGVuLlxuIixzdHIpLDE7CisgIGlmIChxdWVyeV93aXpfZ3JwKG9iKT5xdWVyeV93aXpfZ3JwKHRoaXNfcGxheWVyKCkpKQorICAgIHJldHVybiBwcmludGYoInNhbGxvdzogJXMgaGF0IGVpbmVuIGhvZWhlcmVuIFJhbmcgYWxzIER1IHVuZCBrYW5uICIKKyAgICAgICAgICAgICAgICAgICJEaWNoIGRhaGVyIG9obmVoaW4gc25vb3Blbi5cbiIsc3RyKSwxOworICBzbm9vcF9hbGxvd2VkPWdldHVpZChvYik7CisgIHJldHVybiBwcmludGYoInNhbGxvdzogRHUgZXJsYXVic3QgJXMsIERpY2ggenUgc25vb3Blbi5cbiIsc3RyKSwxOworfQorCitzdGF0aWMgaW50IF9zbm9vcChzdHJpbmcgY21kbGluZSkKK3sKKyAgb2JqZWN0IG9iOworICBpbnQgZmxhZ3M7CisgIHN0cmluZyAqYXJnczsKKworICBpZiAoIXNpemVvZihjbWRsaW5lPV91bnBhcnNlZF9hcmdzKCkpfHwKKyAgICAgIHNpemVvZihhcmdzPXBhcnNlYXJncyhjbWRsaW5lLCZmbGFncyxTTk9PUF9PUFRTLDApKSE9MXx8ZmxhZ3M9PS0xKQorICB7CisgICAgaWYgKCFzbm9vcCh0aGlzX29iamVjdCgpKSkgcmV0dXJuIFVTQUdFKCJzbm9vcCBbLSIgU05PT1BfT1BUUworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXSBbPHNwaWVsZXI+XVxuIik7CisgICAgaWYgKHNub29wZWUpCisgICAgICBwcmludGYoIkR1IHNub29wc3QgJXMgamV0enQgbmljaHQgbWVoci5cbiIsY2FwaXRhbGl6ZShnZXR1aWQoc25vb3BlZSkpKTsKKyAgICBlbHNlCisgICAgeworICAgICAgcHJpbnRmKCJEdSBob2Vyc3QgYXVmIHp1IHNub29wZW4uXG4iKTsKKyAgICAvLyBldnRsLiBpcmdlbmRldHdhcyBsb2dnZW4gLi4uIHNvbGx0ZSBlaWdlbnRsaWNoIG5pY2h0IHBhc3NpZXJlbi4KKyAgICB9CisgICAgc25vb3BlZT0ob2JqZWN0KTA7CisgICAgcmV0dXJuIDE7CisgIH0KKyAgU2V0UHJvcChQX1NOT09QRkxBR1MsZmxhZ3MpOyAvLyBGVU5LVElPTklFUlQgTlVSLCBXRU5OIG1hZ2llci5oIHVuZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNub29waW5nLmggYWJnZWdsaWNoZW4gc2luZAorICBpZiAoIShvYiA9IGZpbmRfcGxheWVyKGFyZ3NbMF0pKSkKKyAgICByZXR1cm4gcHJpbnRmKCJzbm9vcDogS29ubnRlIGtlaW5lbiBTcGllbGVyICclcycgZmluZGVuLlxuIiwKKyAgICAgICAgICAgICAgICAgIGNhcGl0YWxpemUoYXJnc1swXSkpLDE7CisgIGlmICghc25vb3AodGhpc19wbGF5ZXIoKSxvYikpCisgICAgcmV0dXJuIHByaW50Zigic25vb3A6IERlciBWZXJzdWNoLCAlcyB6dSBzbm9vcGVuLCBpc3QgIgorICAgICAgICAgICAgICAgICAgImZlaGxnZXNjaGxhZ2VuLlxuJXMiLGNhcGl0YWxpemUoYXJnc1swXSksCisgICAgICAgICAgICAgICAgICAoKH5mbGFncykmU05PT1BfRik/IkV2ZW50dWVsbCBmdW5rdGlvbmllcnQgZXMgbWl0IGRlbSAiCisgICAgICAgICAgICAgICAgICAiRmxhZyAnLWYnLlxuIjoiIiksMTsKKyAgc25vb3BlZT1vYjsKKyAgcmV0dXJuIHByaW50ZigiRHUgc25vb3BzdCBqZXR6dCAlcy5cbiIsY2FwaXRhbGl6ZShnZXR1aWQob2IpKSksMTsKK30KKworCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICMjIyMjIyMjIyMKKy8vIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyBNU0NIQVUgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICMjIyMjIyMjIyMKKworc3RhdGljIGludCBfbXNjaGF1KHN0cmluZyBzdHIpCit7CisgIGlmICh0aGlzX2ludGVyYWN0aXZlKCkhPXRoaXNfb2JqZWN0KCkpIHJldHVybiAwOworICBpZiAoc3RyPT0iamEifHxzdHI9PSJhbiJ8fHN0cj09ImVpbiIpCisgIHsKKyAgICBpZiAoIFF1ZXJ5UHJvcChQX1dBTlRTX1RPX0xFQVJOKSApCisgICAgICBwcmludGYoIkR1IGhhc3QgZGVuIE1hZ2llci1Nb2R1cyBkb2NoIHNjaG9uIGVpbmdlc2NoYWx0ZXQhXG4iKTsKKyAgICBlbHNlCisgICAgeworICAgICAgcHJpbnRmKCJEdSBoYXN0IGpldHp0IGRlbiBNYWdpZXItTW9kdXMgZWluZ2VzY2hhbHRldC5cbiIgKTsKKyAgICAgIFNldFByb3AoUF9XQU5UU19UT19MRUFSTiwgMSk7CisgICAgfQorICAgIHJldHVybiAxOworICB9CisgIGlmIChzdHI9PSJuZWluInx8c3RyPT0iYXVzIikKKyAgeworICAgIGlmIChRdWVyeVByb3AoUF9XQU5UU19UT19MRUFSTikpCisgICAgeworICAgICAgcHJpbnRmKCAiRHUgc2NoYWx0ZXN0IGRlbiBNYWdpZXItTW9kdXMgYXVzLlxuIik7CisgICAgICBzZXRfaGVhcnRfYmVhdCgxKTsKKyAgICAgIFNldFByb3AoUF9XQU5UU19UT19MRUFSTiwwKTsKKyAgICB9CisgICAgZWxzZQorICAgICAgcHJpbnRmKCJEdSBoYXN0IGRlbiBNYWdpZXItTW9kdXMgZG9jaCBzY2hvbiBhdXNnZXNjaGFsdGV0LlxuIik7CisgICAgcmV0dXJuIDE7CisgIH0KKyAgaWYgKHN0cj09IitkZWJ1ZyIpCisgIHsKKyAgICBwcmludGYoIkR1IG5pbW1zdCBqZXR6dCBEZWJ1Z2F1c2dhYmVuIHdhaHIuXG4iKTsKKyAgICBTZXRQcm9wKFBfV0laX0RFQlVHLDEpOworICAgIHJldHVybiAxOworICB9CisgIGlmIChzdHI9PSItZGVidWciKQorICB7CisgICAgcHJpbnRmKCJEdSBuaW1tc3QgamV0enQga2VpbmUgRGVidWdhdXNnYWJlbiBtZWhyIHdhaHIuXG4iKTsKKyAgICBTZXRQcm9wKFBfV0laX0RFQlVHLDApOworICAgIHJldHVybiAxOworICB9CisgIHJldHVybiBVU0FHRSgibXNjaGF1IFthbnxlaW58amF8YXVzfG5laW58K2RlYnVnfC1kZWJ1Z11cbiIpOworfQorCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICMjIyMjIyMjIyMjCisvLyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgUFJPVEVDVCAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAjIyMjIyMjIyMjIworCitzdGF0aWMgaW50IF9wcm90ZWN0KHN0cmluZyBzdHIpCit7CisgCisgIGlmICh0aGlzX29iamVjdCgpIT10aGlzX2ludGVyYWN0aXZlKCkpIHJldHVybiAwOworICBpZiAoIXNpemVvZihzdHIpKQorICAgIHJldHVybiBVU0FHRSgicHJvdGVjdCA8cHJvcGVydHluYW1lPlxuIik7CisgIFNldChzdHIsIFBST1RFQ1RFRCwgRl9NT0RFKTsKKyAgcmV0dXJuIHByaW50ZigiRGVpbmUgUHJvcGVydHkgJXMgaXN0IGpldHp0ICVzZ2VzY2h1ZXR6dC5cbiIsCisgICAgICAgICAgICAgICAgc3RyLChRdWVyeShzdHIsRl9NT0RFKSAmIFBST1RFQ1RFRD8iIjoibmljaHQgbWVociAiKSksMTsKK30KKworCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAjIyMjIyMjIyMjIyMjIyMKKy8vIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgVklTICsgSU5WSVMgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAjIyMjIyMjIyMjIyMjIyMKKworc3RhdGljIGludCBfaGJzdG9wOworc3RhdGljIGludCBfYWdlOworCitzdGF0aWMgaW50IF9pbnZpcyhzdHJpbmcgaW5mb3JtKQoreworCisgIGlmIChRdWVyeVByb3AoUF9JTlZJUykpCisgICAgcmV0dXJuIHByaW50ZigiRHUgYmlzdCBkb2NoIHNjaG9uIHVuc2ljaHRiYXIhXG4iKSwxOworICB0ZWxsX3Jvb20oZW52aXJvbm1lbnQoKSxzcHJpbnRmKCIlcyAlcy5cbiIsY2FwaXRhbGl6ZShOYW1lKCkpLAorICAgICAgICAgICAgUXVlcnlQcm9wKFBfTU1TR09VVCkpLCh7IHRoaXNfb2JqZWN0KCkgfSkpOworICBpZiAoaW5mb3JtPT0iZSIpIHsKKyAgICAvLyBMb2dvdXQtZXZlbnQgYXVzbG9lc2VuCisgICAgRVZFTlRELT5UcmlnZ2VyRXZlbnQoRVZUX0xJQl9MT0dPVVQsIChbCisgICAgICAgICAgICBFX09CSkVDVDogdGhpc19vYmplY3QoKSwKKyAgICAgICAgICAgIEVfUExOQU1FOiBnZXR1aWQodGhpc19vYmplY3QoKSksCisgICAgICAgICAgICBFX0VOVklST05NRU5UOiBlbnZpcm9ubWVudCgpIF0pICk7CisKKyAgICBjYWxsX25vdGlmeV9wbGF5ZXJfY2hhbmdlKDApOworICB9CisKKyAgU2V0UHJvcChQX0lOVklTLCBRdWVyeVByb3AoUF9BR0UpKTsKKyAgcHJpbnRmKCJEdSBiaXN0IGpldHp0IHVuc2ljaHRiYXIuXG4iKTsKKyAgcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgX3ZpcyhzdHJpbmcgaW5mb3JtKQoreworICBpZiAoIVF1ZXJ5UHJvcChQX0lOVklTKSkKKyAgICByZXR1cm4gcHJpbnRmKCJEdSBiaXN0IGRvY2ggc2Nob24gc2ljaHRiYXIuXG4iKSwxOworICAgdGVsbF9yb29tKGVudmlyb25tZW50KCksc3ByaW50ZigiJXMgJXMuXG4iLGNhcGl0YWxpemUoTmFtZSgpKSwKKyAgICAgICAgICAgIFF1ZXJ5UHJvcChQX01NU0dJTikpLCh7IHRoaXNfb2JqZWN0KCkgfSkpOworICBTZXRQcm9wKFBfSU5WSVMsIDApOworICBpZiAoaW5mb3JtPT0iZSIpIHsKKyAgICAvLyBMb2dpbi1ldmVudCBhdXNsb2VzZW4KKyAgICBFVkVOVEQtPlRyaWdnZXJFdmVudChFVlRfTElCX0xPR0lOLCAoWworICAgICAgICAgIEVfT0JKRUNUOiB0aGlzX29iamVjdCgpLAorICAgICAgICAgIEVfUExOQU1FOiBnZXR1aWQodGhpc19vYmplY3QoKSksCisgICAgICAgICAgRV9FTlZJUk9OTUVOVDogZW52aXJvbm1lbnQoKSBdKSApOworCisgICAgY2FsbF9ub3RpZnlfcGxheWVyX2NoYW5nZSgxKTsKKyAgfQorICBwcmludGYoIkR1IGJpc3QgamV0enQgc2ljaHRiYXIuXG4iKTsKKyAgcmV0dXJuIDE7Cit9CisKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAjIyMjIyMjIyMjIyMKKy8vIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIExPQ0FMQ01EICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAjIyMjIyMjIyMjIyMKKworCitzdGF0aWMgaW50IF9sb2NhbGNtZCgpCit7CisgIGludCBzaXplLG1vcmU7CisgIHN0cmluZyAqdmVyYnMscmVzdWx0OworCisgIC8vIFBlciBVbXdlZyB1ZWJlciBNYXBwaW5nIGRvcHBlbHRlIFdlcnRlIGVpbnN0YW1wZmVuCisgIHNpemU9c2l6ZW9mKHZlcmJzPW1faW5kaWNlcyhta21hcHBpbmcocXVlcnlfYWN0aW9ucyh0aGlzX29iamVjdCgpKSkpKTsKKyAgdmVyYnMtPSh7IiJ9KTsKKyAgbW9yZT0oc2l6ZT5zaXplb2YodmVyYnMpKTsKKyAgaWYgKCFzaXplb2YodmVyYnMpKQorICB7CisgICAgaWYgKG1vcmUpCisgICAgICBwcmludGYoIkRpZSB2b3JoYW5kZW5lbiBCZWZlaGxlIGtvZW5uZW4gbmljaHQgYW5nZXplaWd0IHdlcmRlbiwgIgorICAgICAgICAgICAgICJkYSBzaWUgcGVyICdhZGRfYWN0aW9uKFwiZnVua3Rpb25cIixcIlwiLDEpJyBkZWZpbmllcnQgIgorICAgICAgICAgICAgICJ3dXJkZW4uXG4iKTsKKyAgICBlbHNlCisgICAgICBwcmludGYoIkRpciBzdGVoZW4ga2VpbmUgQmVmZWhsZSB6dXIgVmVyZnVlZ3VuZyAuLi4gZWlnZW5hcnRpZyFcbiIpOworICAgIHJldHVybiAxOworICB9CisgIHZlcmJzPXNvcnRfYXJyYXkodmVyYnMsIyc+KTsKKyAgcmVzdWx0PWJyZWFrX3N0cmluZyhzcHJpbnRmKCJcJyVzXCciLGltcGxvZGUodmVyYnMsIicgJyIpKSw3OCk7CisgIHJldHVybiBwcmludGYoIlxuJSctJzc4Ljc4c1xuRGllIGZ1ZXIgRGljaCBha3R1ZWxsIHZlcmZ1ZWdiYXJlbiAiCisgICAgICAgICAgICAgICAgIkJlZmVobGUgc2luZDpcblxuJXNcbiVzJSctJzc4Ljc4c1xuIiwiIixyZXN1bHQsCisgICAgICAgICAgICAgICAgbW9yZT8iWnVkZW0gd3VyZGVuIEJlZmVobGUgcGVyICdhZGRfYWN0aW9uKCIKKyAgICAgICAgICAgICAgICAiXCJmdW5rdGlvblwiLFwiXCIsMSknIGRlZmluaWVydC5cbiI6IiIsIiIpLDE7Cit9CisKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgIyMjIyMjIyMjIyMKKy8vIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyBUUkFFTktFICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICMjIyMjIyMjIyMjCisKK3N0YXRpYyBpbnQgX3RyYWVua2Uoc3RyaW5nIHN0cikKK3sKKyAgaWYoU2V0UHJvcChQX1RSQU5LX0ZJTkRFTiwgIVF1ZXJ5UHJvcChQX1RSQU5LX0ZJTkRFTikpKQorICAgIHdyaXRlKCJEdSBrYW5uc3QgamV0enQgWmF1YmVydHJhZW5rZSBmaW5kZW4uXG4iKTsKKyAgZWxzZQorICAgIHdyaXRlKCJEdSBmaW5kZXN0IGpldHp0IGtlaW5lIFphdWJlcnRyYWVua2UgbWVoci5cbiIpOworICByZXR1cm4gMTsKK30KKworc3RhdGljIGludCBub3JtX3J1c2FnZSgpIHsKKwltaXhlZCogcjsKKyAgciA9IHJ1c2FnZSgpOworICByZXR1cm4gclswXS8xMDAgKyByWzFdLzEwMDsKK30KKworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAjIyMjIyMjIyMjIyMjCisvLyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgQVNZTkNIUk9OICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAjIyMjIyMjIyMjIyMjCisKKy8vCisvLyBhc3luY2hyb24oKTogQXN5bmNocm9uZSBBYmFyYmVpdHVuZyBlaW5lcyBBcnJheXMKKy8vIGFycmF5OiAgICAgWnUgYmVhcmJlaXRlbmRlcyBBcnJheQorLy8gY21kOiAgICAgICBBdXN6dWZ1ZWhyZW5kZSBDbG9zdXJlCisvLyBkYXRhOiAgICAgIEV4dHJhYXJndW1lbnRlCisvLyBmbGFnczogICAgIFp1c2F0emRhdGVuIChub3JtYWxlcndlaXNlIEZsYWdzKQorLy8gYzogICAgICAgICBzY2hvbiBhc3luY2hyb24/CisvLworCitzdGF0aWMgdmFyYXJncyB2b2lkIGFzeW5jaHJvbihtaXhlZCogYXJyYXksIGNsb3N1cmUgY21kLCBtaXhlZCBkYXRhLCBtaXhlZCBmbGFncyxpbnQgYykKK3sKKyAgaW50IGksIGosIGs7CisgIG1peGVkIHJldF92YWw7CisgIHN0cmluZyBjbWRfc3RyaW5nOworCisgIGsgPSBub3JtX3J1c2FnZSgpKzU7CisgIGogPSBzaXplb2YoYXJyYXkpOworICBpPTA7CisgIAorICBzd2l0Y2ggKGNtZF9zdHJpbmc9ZXhwbG9kZShzcHJpbnRmKCIlTyIsY21kKSwiLT4iKVsxXSkKKyAgeworICAgIGNhc2UgIl9tYWtlIjogICAgIGNtZF9zdHJpbmc9KGRhdGEmVVBEX0xPQUQ/ImxvYWQiOiJ1cGQiKTticmVhazsKKyAgICBjYXNlICJjcF9maWxlIjogICBjbWRfc3RyaW5nID0oZGF0YT8ibXYiOiJjcCIpOyBicmVhazsKKyAgICBjYXNlICJncmVwX2ZpbGUiOiBjbWRfc3RyaW5nID0gImdyZXAiOyBicmVhazsKKyAgICBjYXNlICJybV9maWxlIjogICBjbWRfc3RyaW5nID0gInJtIjsgYnJlYWs7CisgICAgZGVmYXVsdDogYnJlYWs7CisgIH0KKyAgCisgIHdoaWxlKGkgPCBqICYmIGdldF9ldmFsX2Nvc3QoKSA+IDIwMDAwMCAmJiBub3JtX3J1c2FnZSgpPGspCisgICAgLy8gU293b2hsIFRvby1Mb25nLUV2YWwgYWxzIGF1Y2ggTGFnIHZlcmhpbmRlcm4KKyAgeworICAgIHJldF92YWw9YXBwbHkoY21kLGFycmF5W2ldLGRhdGEsIGZsYWdzKTsKKyAgICBpZiAoY2xvc3VyZXAocmV0X3ZhbCkpCisgICAgeworICAgICAgaWYoYykgdGVsbF9vYmplY3QodGhpc19vYmplY3QoKSwKKyAgICAgICAgICAgICAgIHNwcmludGYoIiVzOiBWZXJsYXNzZSBBc3luY2hyb25lbiBNb2R1cy5cbiIsY21kX3N0cmluZykpOworICAgICAgZnVuY2FsbChyZXRfdmFsLGFycmF5W2kuLl0sZGF0YSxmbGFncyk7CisgICAgICByZXR1cm47CisgICAgfQorICAgIGlmIChyZXRfdmFsPT1SRVRfREVMRVRFKQorICAgIHsKKyAgICAgIGFycmF5W2krYXJyYXlbaV1bU1VCRElSU0laRV0rMS4uaSthcnJheVtpXVtTVUJESVJTSVpFXV09CisgICAgICAgICh7IChhcnJheVtpXVswLi41XSsoezB9KSkgfSk7CisgICAgfQorICAgIGlmIChyZXRfdmFsPT1SRVRfSlVNUCkgaSs9YXJyYXlbaV1bU1VCRElSU0laRV07CisgICAgaSsrOworICB9CisgIGlmKHNpemVvZihhcnJheSA9IGFycmF5W2kuLl0pKSAKKyAgeyAgCisgICAgaWYoIWMpIHRlbGxfb2JqZWN0KHRoaXNfb2JqZWN0KCksCisgICAgICAgICAgICAgIHNwcmludGYoIiVzOiBBc3luY2hyb25lciBNb2R1cyBha3RpdmllcnQhXG4iLCBjbWRfc3RyaW5nKSk7CisgICAgY2FsbF9vdXQoIydhc3luY2hyb24sIDEsIGFycmF5LCBjbWQsIGRhdGEsZmxhZ3MsIDEpOworICB9CisgIGVsc2UKKyAgeworICAgIGlmKGMpIHRlbGxfb2JqZWN0KHRoaXNfb2JqZWN0KCksCisgICAgICAgICAgICAgICAgICAgICAgc3ByaW50ZigiJXM6IGFiZ2VzY2hsb3NzZW4uXG4iLGNtZF9zdHJpbmcpKTsKKyAgICAgIGVsc2UgaWYgKHF1ZXJ5X3ZlcmIoKSkgdGVsbF9vYmplY3QodGhpc19vYmplY3QoKSwKKyAgICAgICAgICAgIHNwcmludGYoIiVzOiBhYmdlc2NobG9zc2VuLlxuIixxdWVyeV92ZXJiKCkpKTsKKyAgfQorICByZXR1cm47ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorfQorCisvLworLy8gIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIERyaXZlciBTdGF0dXMgSW5mb3MgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKy8vCitzdGF0aWMgaW50IF9kcml2ZXJfbWFsbG9jKHN0cmluZyBzdHIpCit7CisgICAgaWYoIXNpemVvZihzdHIpKQorICAgIHsKKyAgICAgICAgd3JpdGUoZWZ1bjo6ZHJpdmVyX2luZm8oRElfU1RBVFVTX1RFWFRfTUFMTE9DKSk7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKyAgICBpZihzdHIgPT0gImV4dHN0YXRzIikKKyAgICB7CisgICAgICAgIHdyaXRlKGVmdW46OmRyaXZlcl9pbmZvKERJX1NUQVRVU19URVhUX01BTExPQ19FWFRFTkRFRCkpOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgX2RyaXZlcl9kdW1wYWxsb2JqKHN0cmluZyBzdHIpCit7CisgICAgd3JpdGUoIkR1bXBpbmcgdG8gL09CSl9EVU1QIC4uLiAiKTsKKyAgICBlZnVuOjpkdW1wX2RyaXZlcl9pbmZvKERESV9PQkpFQ1RTKTsKKyAgICBlZnVuOjpkdW1wX2RyaXZlcl9pbmZvKERESV9PQkpFQ1RTX0RFU1RSVUNURUQpOworICAgIHdyaXRlKCJkb25lXG4iKTsKKyAgICByZXR1cm4gMTsKK30KKworc3RhdGljIGludCBfZHJpdmVyX29wY2R1bXAoc3RyaW5nIHN0cikKK3sKKyAgICBlZnVuOjpkdW1wX2RyaXZlcl9pbmZvKERESV9PUENPREVTKTsKKyAgICByZXR1cm4gMTsKK30KKworc3RhdGljIGludCBfZHJpdmVyX3N0YXR1cyhzdHJpbmcgc3RyKQoreworICAgIGludCBvcHQ7CisKKyAgICBzd2l0Y2goc3RyIHx8ICIiKQorICAgIHsKKyAgICAgICAgY2FzZSAiIjoKKyAgICAgICAgICAgIG9wdCA9IERJX1NUQVRVU19URVhUX01FTU9SWTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgInRhYmxlcyI6CisgICAgICAgIGNhc2UgIiB0YWJsZXMiOgorICAgICAgICAgICAgb3B0ID0gRElfU1RBVFVTX1RFWFRfVEFCTEVTOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSAic3dhcCI6CisgICAgICAgIGNhc2UgIiBzd2FwIjoKKyAgICAgICAgICAgIG9wdCA9IERJX1NUQVRVU19URVhUX1NXQVA7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlICJtYWxsb2MiOgorICAgICAgICBjYXNlICIgbWFsbG9jIjoKKyAgICAgICAgICAgIG9wdCA9IERJX1NUQVRVU19URVhUX01BTExPQzsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgIm1hbGxvYyBleHRzdGF0cyI6CisgICAgICAgIGNhc2UgIiBtYWxsb2MgZXh0c3RhdHMiOgorICAgICAgICAgICAgb3B0ID0gRElfU1RBVFVTX1RFWFRfTUFMTE9DX0VYVEVOREVEOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICB3cml0ZShlZnVuOjpkcml2ZXJfaW5mbyhvcHQpKTsKKyAgICByZXR1cm4gMTsKK30KKworLy8gICAgICAgICAgICAgICAgICAgICAgICAgIyMjIyMjIyMjIyMjIyMjIyMjIworLy8jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyBJTklUSUFMSVNJRVJVTkcgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMKKworLy8KKy8vIF9xdWVyeV9sb2NhbGNtZHM6IFdlbGNoZSBLb21tYW5kb3Mgd2VyZGVuIGluIGRpZXNlciBEYXRlaSBpbXBsZW1lbnRpZXJ0PworLy8KKworc3RhdGljIG1peGVkIF9xdWVyeV9sb2NhbGNtZHMoKQoreworICByZXR1cm4gKHsKKyAgICAoeyJzZXQiLCJfc2V0IiwwLExFQVJORVJfTFZMfSksCisgICAgKHsicHdkIiwiX3B3ZCIsMCxMRUFSTkVSX0xWTH0pLAorICAgICh7ImNkIiwiX2NkIiwwLExFQVJORVJfTFZMfSksCisgICAgKHsicHJvbXB0IiwiX3Byb21wdCIsMCxMRUFSTkVSX0xWTH0pLAorICAgICh7InNob3dwcmVzYXkiLCJfc2hvd3ByZXNheSIsMCxMRUFSTkVSX0xWTH0pLAorICAgICh7ImV4ZWMiLCJfZXhlYyIsMCxBUkNIX0xWTH0pLAorICAgICh7InNhbGxvdyIsIl9zYWxsb3ciLDAsTEVBUk5FUl9MVkx9KSwKKyAgICAoeyJzbm9vcCIsIl9zbm9vcCIsMCxXSVpBUkRfTFZMfSksCisgICAgKHsibXNjaGF1IiwiX21zY2hhdSIsMCxMRUFSTkVSX0xWTH0pLAorICAgICh7InByb3RlY3QiLCJfcHJvdGVjdCIsMCxXSVpBUkRfTFZMfSksCisgICAgKHsiaW52aXMiLCJfaW52aXMiLDAsTEVBUk5FUl9MVkx9KSwKKyAgICAoeyJ2aXMiLCJfdmlzIiwwLExFQVJORVJfTFZMfSksCisgICAgKHsibG9jYWxjbWQiLCJfbG9jYWxjbWQiLDAsTEVBUk5FUl9MVkx9KSwKKyAgICAoeyJ0cmFlbmtlIiwiX3RyYWVua2UiLDAsRE9NQUlOTUVNQkVSX0xWTH0pLAorICAgICh7Im1hbGxvYyIsIl9kcml2ZXJfbWFsbG9jIiwwLExFQVJORVJfTFZMfSksCisgICAgKHsiZHVtcGFsbG9iaiIsIl9kcml2ZXJfZHVtcGFsbG9iaiIsMCxBUkNIX0xWTH0pLAorICAgICh7Im9wY2R1bXAiLCJfZHJpdmVyX29wY2R1bXAiLDAsQVJDSF9MVkx9KSwKKyAgICAoeyJzdGF0dXMiLCJfZHJpdmVyX3N0YXR1cyIsMCxMRUFSTkVSX0xWTH0pLAorICB9KQorICAgICtmaWxldmlldzo6X3F1ZXJ5X2xvY2FsY21kcygpCisgICAgK3VwZDo6X3F1ZXJ5X2xvY2FsY21kcygpCisgICAgK29iamVjdHM6Ol9xdWVyeV9sb2NhbGNtZHMoKQorICAgICtmaWxlZWRpdDo6X3F1ZXJ5X2xvY2FsY21kcygpCisvLyAgICArdG9kbzo6X3F1ZXJ5X2xvY2FsY21kcygpCisgICAgK3BsYXllcnM6Ol9xdWVyeV9sb2NhbGNtZHMoKQorICAgICthZG1pbjo6X3F1ZXJ5X2xvY2FsY21kcygpCisgICAgK21vdmluZzo6X3F1ZXJ5X2xvY2FsY21kcygpCisgICAgK2NvbW06Ol9xdWVyeV9sb2NhbGNtZHMoKTsKK30KKworLy8KKy8vIGluaXRpYWxpemU6IEluaXRpYWxpc2llcnVuZyBkZXIgU2hlbGwKKy8vCisKK3N0YXRpYyB2b2lkIGluaXRpYWxpemUoKQoreworICBTZXQoUF9QUk9NUFQsIFNBVkUsIEZfTU9ERV9BUyk7CisgIFNldChQX1ZBUklBQkxFUyxTQVZFLEZfTU9ERV9BUyk7CisgIFNldCgiZmlsZXN5cyIsU0FWRSxGX01PREVfQUQpOyAgIC8vIFBfRklMRVNZUyBpc3Qgb2Jzb2xldAorICBTZXQoInNob3J0X2N3ZCIsU0FWRSxGX01PREVfQUQpOyAvLyBQX1NIT1JUX0NXRCBhdWNoCisgIGlmKCFtYXBwaW5ncChRdWVyeVByb3AoUF9WQVJJQUJMRVMpKSkKKyAgICBTZXRQcm9wKFBfVkFSSUFCTEVTLCAoW10pKTsKKyAgX3Byb21wdChRdWVyeVByb3AoUF9QUk9NUFQpKTsKKy8vICB0b2RvOjppbml0aWFsaXplKCk7CisgIF9jZDIoIiIpOworICByZXR1cm47Cit9CisKK3N0YXRpYyB2b2lkIHJlY29ubmVjdCgpIHsgX2NkKFF1ZXJ5UHJvcChQX0NVUlJFTlRESVIpKTsgfQpkaWZmIC0tZ2l0IGEvc3RkL3NoZWxscy9tYWdpZXIvbW92aW5nLmMgYi9zdGQvc2hlbGxzL21hZ2llci9tb3ZpbmcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMDk1YTNmCi0tLSAvZGV2L251bGwKKysrIGIvc3RkL3NoZWxscy9tYWdpZXIvbW92aW5nLmMKQEAgLTAsMCArMSwyMzIgQEAKKy8vIE1vcmdlbkdyYXVlbiBNVURsaWIKKy8vCisvLyBtb3ZpbmcuYworLy8KKy8vICRJZDogbW92aW5nLmMgOTE0MiAyMDE1LTAyLTA0IDIyOjE3OjI5WiBaZXNzdHJhICQKKyNwcmFnbWEgc3RyaWN0X3R5cGVzCisjcHJhZ21hIHNhdmVfdHlwZXMKKyNwcmFnbWEgcmFuZ2VfY2hlY2sKKyNwcmFnbWEgbm9fY2xvbmUKKyNwcmFnbWEgcGVkYW50aWMKKworI2RlZmluZSBORUVEX1BST1RPVFlQRVMKKyNpbmNsdWRlIDxtYWdpZXIuaD4KKyNpbmNsdWRlIDx0aGluZy9wcm9wZXJ0aWVzLmg+CisjaW5jbHVkZSA8bGl2aW5nL21vdmluZy5oPgorI2luY2x1ZGUgPHBsYXllci5oPgorI3VuZGVmIE5FRURfUFJPVE9UWVBFUworI2luY2x1ZGUgPHdpemxldmVscy5oPgorI2luY2x1ZGUgPG1vdmluZy5oPgorI2luY2x1ZGUgPHByb3BlcnRpZXMuaD4KKworcHJpdmF0ZSBtaXhlZCB2ZXJmb2xnZXIoKQoreworICBtaXhlZCAqcHVyOworCisgIGlmICghcG9pbnRlcnAocHVyPVF1ZXJ5UHJvcChQX1BVUlNVRVJTKSkpIHJldHVybiAwOworICBlbHNlIHJldHVybiBwdXJbMF07Cit9CisKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICMjIyMjIyMjIworLy8jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyBJTitBVCAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAjIyMjIyMjIyMKKworc3RhdGljIGludCBfbW92ZV9iYXNlKG9iamVjdCB0YXJnZXQsIG9iamVjdCBvbGRfcm9vbSwgc3RyaW5nIGNtZCkKK3sKKyAgaWYgKGVudmlyb25tZW50KCkhPXRhcmdldCkKKyAgICBpZiAoSVNfQVJDSCh0aGlzX29iamVjdCgpKSkKKyAgICB7CisgICAgICBfX3NldF9lbnZpcm9ubWVudCh0aGlzX29iamVjdCgpLHRhcmdldCk7CisgICAgICBwcmludGYoIiVzOiBCZXdlZ3VuZyBoYXQgbmljaHQgZ2VrbGFwcHQuIFZlcnN1Y2hlIGVzIG1pdCAiCisgICAgICAgICAgICAgInNldF9lbnZpcm9ubWVudC4uLiAlcy5cbi4iLHF1ZXJ5X3ZlcmIoKSwKKyAgICAgICAgICAgICBlbnZpcm9ubWVudCgpPT10YXJnZXQ/ImhhdCBnZWtsYXBwdCI6ImVyZm9sZ2xvcyIpOworICAgIH0KKyAgZWxzZQorICAgIHByaW50ZigiJXM6IEJld2VndW5nIGhhdCBuaWNodCBnZWtsYXBwdC5cbiIscXVlcnlfdmVyYigpKTsKKyAgaWYgKGVudmlyb25tZW50KCkhPXRhcmdldCkgcmV0dXJuIDE7CisgIGNvbW1hbmQoY21kKTsKKyAgaWYgKG9sZF9yb29tKSBtb3ZlX29iamVjdChvbGRfcm9vbSk7CisgIGVsc2UKKyAgICByZXR1cm4gcHJpbnRmKCIlczogVXJzcHJ1bmdzcmF1bSB3dXJkZSB6ZXJzdG9lcnQuXG4iLHF1ZXJ5X3ZlcmIoKSksMTsgIAorICBpZiAoZW52aXJvbm1lbnQoKSE9b2xkX3Jvb20pCisgIHsKKyAgICBpZiAoSVNfQVJDSCh0aGlzX29iamVjdCgpKSkKKyAgICB7CisgICAgICBfX3NldF9lbnZpcm9ubWVudCh0aGlzX29iamVjdCgpLG9sZF9yb29tKTsKKyAgICAgIHByaW50ZigiJXM6IFp1cnVlY2tiZXdlZ2VuIGhhdCBuaWNodCBnZWtsYXBwdC4gVmVyc3VjaGUgZXMgbWl0ICIKKyAgICAgICAgICAgICAic2V0X2Vudmlyb25tZW50IC4uLiAlcy5cbiIscXVlcnlfdmVyYigpLAorICAgICAgICAgICAgIGVudmlyb25tZW50KCk9PW9sZF9yb29tPyJoYXQgZ2VrbGFwcHQiOiJlcmZvbGdsb3MiKTsKKyAgICB9CisgICAgZWxzZQorICAgICAgcHJpbnRmKCJhdDogWnVydWVja2Jld2VnZW4gaGF0IG5pY2h0IGdla2xhcHB0LlxuIik7CisgIH0KKyAgcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgX2luX3Jvb20oc3RyaW5nIHN0cikKK3sKKyAgc3RyaW5nIHJvb207aW50IHNpemU7CisgIG9iamVjdCBvbGRfcm9vbTsKKyAgc3RyaW5nIGNtZCxlcnI7CisKKyAgaWYgKCFzaXplb2Yoc3RyPV91bnBhcnNlZF9hcmdzKCkpIHx8CisgICAgICAhc2l6ZW9mKHN0cj1yZWdyZXBsYWNlKHN0ciwiXiAqIiwiIiwxKSkgfHwKKyAgICAgIHNzY2FuZihzdHIsICIlcyAlcyIsIHJvb20sIGNtZCkgIT0gMikKKyAgICByZXR1cm4gVVNBR0UoImluIDxyYXVtPiA8YmVmZWhsPlxuIik7CisgIG9sZF9yb29tID0gZW52aXJvbm1lbnQoKTsKKyAgcm9vbT0oc3RyaW5nKWNhbGxfb3RoZXIobWFzdGVyKCksIl9nZXRfcGF0aCIscm9vbSxnZXR1aWQoKSk7CisgIGlmIChlcnI9Y2F0Y2gobW92ZV9vYmplY3Qocm9vbSkpKQorICB7CisgICAgaWYgKGNhdGNoKHNpemU9ZmlsZV9zaXplKHJvb20rIi5jIikpfHxzaXplPDEpCisgICAgICBwcmludGYoIiVzOiAlcy5jOiBEYXRlaSBuaWNodCB2b3JoYW5kZW4uXG4iLHF1ZXJ5X3ZlcmIoKSxyb29tKTsKKyAgICBlbHNlCisgICAgICBwcmludGYoIiVzOiBCZXdlZ3VuZyBuYWNoICVzIGhhdCBuaWNodCBmdW5rdGlvbmllcnQ6ICVzXG4iLAorICAgICAgICAgICAgIHF1ZXJ5X3ZlcmIoKSxyb29tLGVycik7CisgICAgcmV0dXJuIDE7CisgIH0KKyAgcmV0dXJuIF9tb3ZlX2Jhc2UoZmluZF9vYmplY3Qocm9vbSksb2xkX3Jvb20sY21kKTsKK30KKworc3RhdGljIGludCBfYXRfcGxheWVyKHN0cmluZyBkZXN0KQoreworICBvYmplY3Qgb2Isb2xkX3Jvb207CisgIG1peGVkIHRtcDsKKyAgc3RyaW5nIGNtZDsKKworICBpZiAoIXNpemVvZihkZXN0PV91bnBhcnNlZF9hcmdzKCkpIHx8CisgICAgICAhc2l6ZW9mKGRlc3Q9cmVncmVwbGFjZShkZXN0LCJeICoiLCIiLDEpKSB8fAorICAgICAgc3NjYW5mKGRlc3QsICIlcyAlcyIsIGRlc3QsIGNtZCkgIT0gMikKKyAgICByZXR1cm4gVVNBR0UoImF0IDxsZWJld2VzZW4+IDxiZWZlaGw+XG4iKTsKKyAgaWYgKCEob2I9ZmluZF9saXZpbmcoZGVzdCkpKQorICB7CisgICAgdG1wPW1hdGNoX2xpdmluZyhkZXN0LDEpOworICAgIGlmIChzdHJpbmdwKHRtcCkpIG9iID0gZmluZF9saXZpbmcodG1wKTsKKyAgfQorICBpZiAoIW9ifHwhKG9iPWVudmlyb25tZW50KG9iKSkpCisgICAgcmV0dXJuIF9ub3RpZnlfZmFpbChzcHJpbnRmKCJhdDogTGViZXdlc2VuIFwnJXNcJyBuaWNodCBnZWZ1bmRlbi5cbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3QpKSwwOworICBvbGRfcm9vbT1lbnZpcm9ubWVudCgpOworICBtb3ZlX29iamVjdChvYik7CisgIHJldHVybiBfbW92ZV9iYXNlKG9iLG9sZF9yb29tLGNtZCk7Cit9CisKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgIyMjIyMjIyMKKy8vIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyBHT1RPICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgIyMjIyMjIyMKKworc3RhdGljIG9iamVjdCBmaW5kX2xpdmluZ19ucihzdHJpbmcgc3RyKQoreyBzdHJpbmcgbmFtZSxjaGVjazsKKyAgaW50IG5yOworICBvYmplY3QqbGl2aW5nczsKKyAgaWYoc3NjYW5mKHN0ciwiJXMgJWQlcyIsbmFtZSxucixjaGVjayk8Mnx8c2l6ZW9mKGNoZWNrKSkKKyAgICByZXR1cm4gZmluZF9saXZpbmcoc3RyKTsKKyAgaWYoIXNpemVvZihsaXZpbmdzPWZpbHRlcigoZmluZF9saXZpbmdzKG5hbWUpfHwoe30pKSwjJ2Vudmlyb25tZW50KSkKKyAgICAgfHxucjwxfHxzaXplb2YobGl2aW5ncyk8bnIpCisgICAgcmV0dXJuIDA7CisgIHJldHVybiBsaXZpbmdzW25yLTFdOworfQorCitzdGF0aWMgaW50IF9nb3RvKHN0cmluZyBkZXN0KXsKKyAgbWl4ZWQgdGFyZ2V0OworICBzdHJpbmcgdGFyZ2V0MixlcnI7CisKKyAgaWYgKCFzaXplb2YoZGVzdD1fdW5wYXJzZWRfYXJncygpKSkKKyAgICByZXR1cm4gVVNBR0UoImdvdG8gW2xlYmV3ZXNlbnxmaWxlbmFtZV1cbiIpOworICBpZiAoISgodGFyZ2V0PWZpbmRfbGl2aW5nX25yKGRlc3QpKSAmJiAodGFyZ2V0PWVudmlyb25tZW50KHRhcmdldCkpKSkKKyAgeworICAgICB0YXJnZXQyPXRhcmdldD0obWl4ZWQpY2FsbF9vdGhlcihtYXN0ZXIoKSwiX2dldF9wYXRoIixkZXN0LGdldHVpZCgpKTsKKyAgICAgaWYgKCFmaW5kX29iamVjdCh0YXJnZXQpKQorICAgICB7CisgICAgICAgaWYgKHRhcmdldDJbPDFdPT0nLicpIHRhcmdldDIrPSJjIjsKKyAgICAgICBpZiAodGFyZ2V0Mls8Mi4uPDFdIT0iLmMiKSB0YXJnZXQyKz0iLmMiOworICAgICAgIG5vdGlmeV9mYWlsKHNwcmludGYoImdvdG86IERhdGVpICVPIG5pY2h0IHZvcmhhbmRlbi5cbiIsdGFyZ2V0KSk7CisgICAgICAgaWYgKCEoZmlsZV9zaXplKHRhcmdldDIpPi0xfHwKKyAgICAgICAgICAgZmlsZV9zaXplKGltcGxvZGUoZXhwbG9kZSh0YXJnZXQsIi8iKVswLi48Ml0sIi8iKSsKKyAgICAgICAgICAgICAgICIvdmlydHVhbF9jb21waWxlci5jIik+LTEpfHwoZXJyPWNhdGNoKGNhbGxfb3RoZXIodGFyZ2V0LCI/IikpKSkKKyAgICAgICB7CisgICAgICAgICBpZiAoZXJyKQorICAgICAgICAgICAgICBub3RpZnlfZmFpbChzcHJpbnRmKCJnb3RvOiBGZWhsZXIgYmVpbSBUZWxlcG9ydCBuYWNoICVPOlxuJXNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgZGVzdCxpbXBsb2RlKGV4cGxvZGUoZXJyLCJcbiIpLCIgIikpKTsKKyAgICAgICAgIHRhcmdldD1tYXRjaF9saXZpbmcoZGVzdCwxKTsKKyAgICAgICAgIGlmICghKHN0cmluZ3AodGFyZ2V0KSYmKHRhcmdldD1maW5kX2xpdmluZyh0YXJnZXQpKSYmCisgICAgICAgICAgICAgICAodGFyZ2V0PWVudmlyb25tZW50KHRhcmdldCkpKSkKKyAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgfQorICAgICB9CisgIH0KKyAgaWYgKHZlcmZvbGdlcigpKSBfdmVyZm9sZ2UoIiIpOworICBpZiAobW92ZSh0YXJnZXQsTV9UUE9SVHxNX05PQ0hFQ0spPDApCisgICAgcHJpbnRmKCJCZXdlZ3VuZyBmZWhsZ2VzY2hsYWdlbiFcbiIpOworICByZXR1cm4gMTsKK30KKworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAjIyMjIyMjIworLy8jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIEhPTUUgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAjIyMjIyMjIworCitzdGF0aWMgaW50IF9ob21lKCkKK3sKKyAgc3RyaW5nIGRlc3Q7CisgIGlmICh2ZXJmb2xnZXIoKSkgX3ZlcmZvbGdlKCIiKTsKKyAgZGVzdD0iL3BsYXllcnMvIiArIGdldHVpZCgpICsgIi93b3Jrcm9vbSI7CisgIGlmIChmaWxlX3NpemUoZGVzdCsiLmMiKTwxfHxjYXRjaChjYWxsX290aGVyKGRlc3QsIj8/PyIpKSkKKyAgeworICAgIHByaW50ZigiRmVobGVyIGJlaW0gTGFkZW4gRGVpbmVzIFdvcmtyb29tcy5cbiIKKyAgICAgICAgICAgIkdlaGUgenVtIE1hZ2llcnRyZWZmLlxuIik7CisgICAgZGVzdD0iL3NlY3VyZS9tZXJsaW4iOworICB9CisgIAorICBpZiAobW92ZShkZXN0LE1fVFBPUlR8TV9OT0NIRUNLKTwwKQorICAgIHByaW50ZigiQmV3ZWd1bmcgZmVobGdlc2NobGFnZW4hXG4iKTsKKyAgcmV0dXJuIDE7Cit9CisKKy8vICAgICAgICAgICAgICAgICAgICAgICAgIyMjIyMjIyMjIyMjIyMjCisvLyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgK01BR0lFUk5BTUUgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKy8vICAgICAgICAgICAgICAgICAgICAgICAgIyMjIyMjIyMjIyMjIyMjCisKK3N0YXRpYyBpbnQgX2dvX3dpel9ob21lKHN0cmluZyBzdHIpCit7CisgIF9ub3RpZnlfZmFpbCgiU3ludGF4OiAnK21hZ2llcm5hbWUnXG4iKTsKKyAgaWYoc2l6ZW9mKHF1ZXJ5X3ZlcmIoKSk+MSkgc3RyPXF1ZXJ5X3ZlcmIoKVsxLi5dOworICBpZighc2l6ZW9mKHN0cikpIHJldHVybiAwOworICBpZihxdWVyeV92ZXJiKClbMF0hPScrJykgcmV0dXJuIDA7CisgIHN0cj0ob2xkX2V4cGxvZGUoc3RyLCIgIiktKHswfSkpWzBdOworICBpZighc2l6ZW9mKHN0cikpIHJldHVybiAwOworICBzdHI9bG93ZXJfY2FzZShzdHIpOworICBpZiAoc3RyPT0ibWVybGluIikKKyAgeworICAgIG1vdmUoIi9zZWN1cmUvbWVybGluIixNX1RQT1JUfE1fTk9DSEVDSyk7CisgICAgcmV0dXJuIDE7CisgIH0KKyAgaWYgKCghY2FsbF9vdGhlcihtYXN0ZXIoKSwiZ2V0X3VzZXJpbmZvIixzdHIpKXx8CisgICAgICAhSVNfTEVBUk5FUihzdHIpKQorICB7CisgICAgcHJpbnRmKCJFcyBnaWJ0IGtlaW5lbiBNYWdpZXIgbmFtZW5zICVzLlxuIiwKKyAgICAgICAgICAgY2FwaXRhbGl6ZShzdHIpKTsKKyAgICByZXR1cm4gMTsKKyAgfQorICBpZiAoZmlsZV9zaXplKCIvcGxheWVycy8iK3N0cisiL3dvcmtyb29tLmMiKTwxKQorICB7CisgICAgcHJpbnRmKCIlcyBoYXQga2VpbmVuIFdvcmtyb29tLlxuIixjYXBpdGFsaXplKHN0cikpOworICAgIHJldHVybiAxOworICB9CisgIGlmIChjYXRjaChjYWxsX290aGVyKCIvcGxheWVycy8iK3N0cisiL3dvcmtyb29tIiwiPz8/IikpKQorICB7CisgICAgcHJpbnRmKCJEZXIgV29ya3Jvb20gdm9uICVzIGhhdCBGZWhsZXIuXG4iLGNhcGl0YWxpemUoc3RyKSk7CisgICAgcmV0dXJuIDE7CisgIH0KKyAgbW92ZSgiL3BsYXllcnMvIitzdHIrIi93b3Jrcm9vbSIsTV9UUE9SVHxNX05PQ0hFQ0spOworICByZXR1cm4gMTsKK30KKworCitzdGF0aWMgbWl4ZWQgX3F1ZXJ5X2xvY2FsY21kcygpCit7CisgIHJldHVybgorICAgICh7KHsiZ290byIsIl9nb3RvIiwwLExFQVJORVJfTFZMfSksCisgICAgICAoeyJpbiIsIl9pbl9yb29tIiwwLExFQVJORVJfTFZMfSksCisgICAgICAoeyJhdCIsIl9hdF9wbGF5ZXIiLDAsTEVBUk5FUl9MVkx9KSwKKyAgICAgICh7ImhvbWUiLCJfaG9tZSIsMCxXSVpBUkRfTFZMfSksCisgICAgICAoeyIrIiwiX2dvX3dpel9ob21lIiwxLExFQVJORVJfTFZMfSl9KTsKK30KZGlmZiAtLWdpdCBhL3N0ZC9zaGVsbHMvbWFnaWVyL29iamVjdHMuYyBiL3N0ZC9zaGVsbHMvbWFnaWVyL29iamVjdHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZDc0ZjU2Ci0tLSAvZGV2L251bGwKKysrIGIvc3RkL3NoZWxscy9tYWdpZXIvb2JqZWN0cy5jCkBAIC0wLDAgKzEsMTY4IEBACisvLyAkSWQ6IG9iamVjdHMuYyA4ODQ4IDIwMTQtMDYtMTEgMjI6MDU6MDRaIFplc3N0cmEgJAorI3ByYWdtYSBzdHJpY3RfdHlwZXMKKyNwcmFnbWEgc2F2ZV90eXBlcworI3ByYWdtYSByYW5nZV9jaGVjaworI3ByYWdtYSBub19jbG9uZQorI3ByYWdtYSBwZWRhbnRpYworCisjaW5jbHVkZSA8d2l6bGV2ZWxzLmg+CisjaW5jbHVkZSA8bW92aW5nLmg+CisjZGVmaW5lIE5FRURfUFJPVE9UWVBFUworI2luY2x1ZGUgPHRoaW5nL2xhbmd1YWdlLmg+CisjaW5jbHVkZSA8dGhpbmcvcHJvcGVydGllcy5oPgorI2luY2x1ZGUgPHRoaW5nL2Rlc2NyaXB0aW9uLmg+CisjaW5jbHVkZSA8bGl2aW5nL3B1dF9hbmRfZ2V0Lmg+CisjaW5jbHVkZSA8cGxheWVyLmg+CisjaW5jbHVkZSA8bWFnaWVyLmg+CisKKy8vICAgICAgICAgICAgICAgICAgICAgICAgIyMjIyMjIyMjIyMjIyMjIyMjIworLy8jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIElOSVRJQUxJU0lFUlVORyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworLy8gICAgICAgICAgICAgICAgICAgICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjCisKKworc3RhdGljIG1peGVkIF9xdWVyeV9sb2NhbGNtZHMoKQoreworICByZXR1cm4gKHsoeyJjbG9uZSIsIl9jbG9uZSIsMCxXSVpBUkRfTFZMfSksCisgICAgICAgICAgICh7InNldGNtc2ciLCJfc2V0Y21zZyIsMCxXSVpBUkRfTFZMfSksCisgICAgICAgICAgICh7InNldGRtc2ciLCJfc2V0ZG1zZyIsMCxXSVpBUkRfTFZMfSksCisgICAgICAgICAgICh7ImRlc3RydWN0IiwiX2Rlc3RydWN0IiwwLFdJWkFSRF9MVkx9KSwKKyAgICAgICAgICB9KTsKK30KKworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIyMjIyMjIyMKKy8vIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyBDTE9ORSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyMjIyMjIyMjCisKK3N0YXRpYyBpbnQgX2Nsb25lKHN0cmluZyBjbWRsaW5lKQoreworICBtaXhlZCAqdG1wOworICBpbnQgZmxhZ3M7CisgIG9iamVjdCBvYjsKKyAgc3RyaW5nICphcmdzLCphcmdzMixlcnI7CisgIAorICBjbWRsaW5lPV91bnBhcnNlZF9hcmdzKCk7CisgIGFyZ3M9cGFyc2VhcmdzKGNtZGxpbmUsJmZsYWdzLENMT05FX09QVFMsMSk7CisgIGlmIChmbGFncz09LTF8fHNpemVvZihhcmdzKSE9MSkKKyAgICByZXR1cm4gVVNBR0UoImNsb25lIFstIiBDTE9ORV9PUFRTICJdIDxvYmpla3RuYW1lPiIpOworICBpZiAoZmxhZ3MmQ0xPTkVfRikKKyAgICBjbWRsaW5lPWFyZ3NbMF07CisgIGVsc2UKKyAgeworICAgIC8vIGV0d2FzIHVtc3RhZW5kbGljaCwgYWJlciBzbyBrYW5uIG1hbiBhdWNoIERhdGVpZW4gY2xvbmVuLAorICAgIC8vIHdlbm4gbWFuIGtlaW5lIExlc2VyZWNodGUgaGF0LiBNYW4gbXVzcyBhYmVyIGltIFZlcnplaWNobmlzCisgICAgLy8gbGVzZW4ga29lbm5lbgorICAgIGFyZ3MyPWV4cGxvZGUoYXJnc1swXSwiLyIpOworICAgIGlmIChhcmdzMls8MV1bPDFdPT0nLicpIGFyZ3MyWzwxXSs9ImMiOworICAgIGVsc2UgaWYgKGFyZ3MyWzwxXVs8Mi4uPDFdIT0iLmMiKSBhcmdzMls8MV0rPSIuYyI7CisgICAgdG1wPWZpbGVfbGlzdCgoe2ltcGxvZGUoYXJnczJbMC4uPDJdLCIvIikrIi8qIn0pLE1PREVfQ0xPTkUsMCwiIiwKKyAgICAgICAgICAgICAgICAgIGFyZ3MyWzwxXSk7CisgICAgaWYgKCFzaXplb2YodG1wKXx8dG1wWzBdW0ZJTEVTSVpFXTwwKQorICAgICAgcmV0dXJuIHByaW50ZigiY2xvbmU6ICVzOiBEYXRlaSBleGlzdGllcnQgbmljaHQuXG4iLGFyZ3NbMF0pLDE7CisgICAgY21kbGluZT10bXBbMF1bRlVMTE5BTUVdOworICB9CisKKyAgaWYgKGVycj1jYXRjaChvYj1jbG9uZV9vYmplY3QoY21kbGluZSkpfHwhb2IpCisgICAgcmV0dXJuIHByaW50ZigiY2xvbmU6ICVzOiBPYmpla3Qga29ubnRlIG5pY2h0IGVyemV1Z3Qgd2VyZGVuLlxuIgorICAgICAgICAgICAgICAgICAgIkdydW5kOiAlTyIsCisgICAgICAgICAgICAgICAgICBhcmdzWzBdLGVycnx8InVuYmVrYW5udCIpLDE7CisgIGlmICghb2JqZWN0cChvYikpCisgICAgcmV0dXJuIHByaW50ZigiY2xvbmU6ICVzOiBPYmpla3QgYmVpbSBFcnpldWdlbiB6ZXJzdG9lcnQuXG4iLAorICAgICAgICAgICAgICAgICAgYXJnc1swXSksMTsKKyAgaWYgKChvYi0+bW92ZSh0aGlzX29iamVjdCgpLE1fR0VUKT4wKSB8fCAKKyAgICAgICghb2JqZWN0cChvYil8fG9iLT5tb3ZlKGVudmlyb25tZW50KCksTV9OT0NIRUNLKT4wKXx8IW9iamVjdHAob2IpKQorICB7CisgICAgaWYgKCFvYmplY3RwKG9iKSkKKyAgICAgIHJldHVybiBwcmludGYoImNsb25lOiAlczogT2JqZWt0IGJlaW0gRXJ6ZXVnZW4gemVyc3RvZXJ0LlxuIiwKKyAgICAgICAgICAgICAgICAgIGFyZ3NbMF0pLDE7CisgICAgcHJpbnRmKCJDbG9uZTogJXMgZXJ6ZXVndC5cbiIsb2JqZWN0X25hbWUob2IpKTsKKyAgICB0ZWxsX3Jvb20oZW52aXJvbm1lbnQodGhpc19vYmplY3QoKSksCisgICAgICAgICAgICAgIHNwcmludGYoIiVzICVzLlxuIixOYW1lKFdFUiwxKSxRdWVyeVByb3AoUF9DTE9ORV9NU0cpKSwKKyAgICAgICAgICAgICAgICAgICAgICAoeyB0aGlzX29iamVjdCgpfSkpOworICAgIHJldHVybiAxOworICB9CisgIHRlbGxfcm9vbShlbnZpcm9ubWVudCh0aGlzX29iamVjdCgpKSwKKyAgICAgICAgICAgIHNwcmludGYoIiVzIG1hbHQgd2lsZGUgWmVpY2hlbiBpbiBkaWUgTHVmdCB1bmQgIgorICAgICAgICAgICAgICAgICAgICAibXVybWVsdCB2b3Igc2ljaCBoaW4sIGFiZXIgbmljaHRzICIKKyAgICAgICAgICAgICAgICAgICAgInBhc3NpZXJ0Li4uXG4iLE5hbWUoV0VSLDEpKSwKKyAgICAgICAgICAgICh7IHRoaXNfb2JqZWN0KCl9KSk7CisgIGRlc3RydWN0KG9iKTsKKyAgcHJpbnRmKCJDbG9uZTogJXM6IE9iamVrdCBrb25udGUgbmljaHQgYmV3ZWd0IHdlcmRlbi4iLGFyZ3NbMF0pOworICByZXR1cm4gMTsKK30KKworCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIyMjIyMjIyMjIyMKKy8vIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgREVTVFJVQ1QgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIyMjIyMjIyMjIyMKKworLy8KKy8vIF9kZXN0cnVjdDogT2JqZWt0ZSB6ZXJzdG9lcmVuCisvLworCitzdGF0aWMgaW50IF9kZXN0cnVjdChzdHJpbmcgY21kbGluZSkKK3sKKyAgaW50IGZsYWdzOworICBtaXhlZCAqYXJnczsKKyAgb2JqZWN0IG9iOworCisgIGlmICghc2l6ZW9mKGNtZGxpbmU9X3VucGFyc2VkX2FyZ3MoKSkpCisgICAgcmV0dXJuIFVTQUdFKHF1ZXJ5X3ZlcmIoKSsiIDxvYmpla3RuYW1lPiIpOworICBhcmdzPWZpbmRfb2JzKGxvd2VyX2Nhc2UoY21kbGluZSksUFVUX0dFVF9OT05FKTsKKyAgaWYgKCFhcmdzfHwhc2l6ZW9mKGFyZ3MpKQorICB7CisgICAgaWYgKCEob2I9ZmluZF9vYmplY3QoY21kbGluZSkpKQorICAgIHsKKyAgICAgIG5vdGlmeV9mYWlsKHF1ZXJ5X3ZlcmIoKSsiOiBPYmpla3QgXCIiICtjbWRsaW5lKworICAgICAgICAgICAgICAgICAgIlwiIG5pY2h0IGdlZnVuZGVuLlxuIik7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgIH0KKyAgZWxzZQorICAgIG9iPWFyZ3NbMF07CisgIGNtZGxpbmU9Y2FwaXRhbGl6ZSh0b19zdHJpbmcob2ItPm5hbWUoV0VSKSkpOworICBmbGFncz0oaW50KW9iLT5RdWVyeVByb3AoUF9QTFVSQUwpOyAvLyBNaXNzYnJhdWNoIHZvbiBmbGFncyA6bykKKyAgaWYgKHF1ZXJ5X3ZlcmIoKT09ImRlc3RydWN0IikKKyAgeworICAgIGlmICghb2ItPnJlbW92ZSgpKQorICAgIHsKKyAgICAgIG5vdGlmeV9mYWlsKGNtZGxpbmUrIiB3aWxsIG5pY2h0IHplcnN0b2VydCB3ZXJkZW4hXG4iKTsKKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgfQorICBlbHNlIGRlc3RydWN0KG9iKTsKKyAgaWYgKCFvYikKKyAgeworICAgIGlmICghUXVlcnlQcm9wKFBfSU5WSVMpKQorICAgIHsKKyAgICAgIHRlbGxfcm9vbShlbnZpcm9ubWVudCh0aGlzX29iamVjdCgpKSwKKyAgICAgICAgICAgICAgICBzcHJpbnRmKCIlcyAlcy5cbiIsY21kbGluZSxRdWVyeVByb3AoUF9ERVNUUlVDVF9NU0cpKSwKKyAgICAgICAgICAgICAgICAoeyB0aGlzX29iamVjdCgpIH0pKTsKKyAgICB9CisgICAgcHJpbnRmKCIlcyB3JXMgdm9uIERpciB6ZXJzdGFldWJ0LlxuIixjbWRsaW5lLChmbGFncz8iZXJkZW4iOiJpcmQiKSk7CisgIH0KKyAgZWxzZQorICAgIHByaW50ZigiJXMga2FubiBuaWNodCB6ZXJzdG9lcnQgd2VyZGVuLlxuIixjbWRsaW5lKTsKKyAgcmV0dXJuIDE7Cit9CisKKy8vICAgICAgICAgICAgICAgICAgICAgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMKKy8vIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyBTZXRDTXNnLCBTZXRETXNnICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKy8vICAgICAgICAgICAgICAgICAgICAgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworc3RhdGljIGludCBfc2V0Y21zZyhzdHJpbmcgc3RyKQoreworICBwcmludGYoIkJlaW0gQ2xvbmVuIHZvbiBPYmpla3RlbiBzZWhlbiBkaWUgQW5kZXJlbiBudW46XG4iCisgICAgICAgICAiPERlaW4gTmFtZT4gJXMuXG4iLAorICAgICAgICAgKFNldFByb3AoUF9DTE9ORV9NU0csIF91bnBhcnNlZF9hcmdzKCl8fCJ6YXViZXJ0IGV0d2FzIGF1cyAiCisgICAgICAgICAgKyBRdWVyeVBvc3NQcm9ub3VuKE1BTEUsV0VNKSArICIgQWVybWVsIGhlcnZvciIpKSk7CisgIHJldHVybiAxOworfQorCitzdGF0aWMgaW50IF9zZXRkbXNnKHN0cmluZyBzdHIpCit7CisgIHByaW50ZigiQmVpbSBaZXJzdG9lcmVuIHZvbiBPYmpla3RlbiBzZWhlbiBkaWUgQW5kZXJlbiBudW46XG4iCisgICAgICAgICAiPE9iamVrdD4gJXMuXG4iLAorICAgICAgICAgU2V0UHJvcChQX0RFU1RSVUNUX01TRywgX3VucGFyc2VkX2FyZ3MoKXx8IndpcmQgdm9uICIgKyBuYW1lKFdFUiwxKQorICAgICAgICAgICsgIiB6ZXJzdGFldWJ0IikpOworICByZXR1cm4gMTsKK30KZGlmZiAtLWdpdCBhL3N0ZC9zaGVsbHMvbWFnaWVyL3BhcnNpbmcuYyBiL3N0ZC9zaGVsbHMvbWFnaWVyL3BhcnNpbmcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NTUzMzJkCi0tLSAvZGV2L251bGwKKysrIGIvc3RkL3NoZWxscy9tYWdpZXIvcGFyc2luZy5jCkBAIC0wLDAgKzEsMzcwIEBACisvLyAkSWQ6IHBhcnNpbmcuYyA5MTQyIDIwMTUtMDItMDQgMjI6MTc6MjlaIFplc3N0cmEgJAorI3ByYWdtYSBzdHJpY3RfdHlwZXMKKyNwcmFnbWEgc2F2ZV90eXBlcworLy8jcHJhZ21hIHJhbmdlX2NoZWNrCisjcHJhZ21hIG5vX2Nsb25lCisjcHJhZ21hIHBlZGFudGljCisKKyNpbmNsdWRlIDxmaWxlcy5oPgorI2luY2x1ZGUgPHdpemxldmVscy5oPgorI2luY2x1ZGUgPGxvZ2dpbmcuaD4KKyNpbmNsdWRlIDxyZWdleHAuaD4KKyNkZWZpbmUgTkVFRF9QUk9UT1RZUEVTCisjaW5jbHVkZSA8bWFnaWVyLmg+CisjaW5jbHVkZSA8dGhpbmcvcHJvcGVydGllcy5oPgorI2luY2x1ZGUgPHBsYXllci5oPgorCisvLworLy8gZ2xvYjJyZWdleHA6IEFyZ3VtZW50IHZvbiBnbG9iIGluIFJlZ2V4cCB1bXdhbmRlbG4KKy8vIHN0cjogQXJndW1lbnQgKGFscyBSZWZlcmVueikKKy8vCisKK3N0YXRpYyBzdHJpbmcgZ2xvYjJyZWdleHAoc3RyaW5nIHN0cikKK3sKKyAgc3RyPXJlZ3JlcGxhY2Uoc3RyLCIoW1xcLlxcXlxcJFxcW1xcXVxcKFxcKV0pIiwiXFxcXFxcMSIsUkVfVFJBRElUSU9OQUx8MSk7CisgIHN0cj1yZWdyZXBsYWNlKHN0ciwiXFwqIiwiLioiLFJFX1RSQURJVElPTkFMfDEpOworICByZXR1cm4gc3ByaW50ZigiXiVzJCIscmVncmVwbGFjZShzdHIsIj8iLCIuIixSRV9UUkFESVRJT05BTHwxKSk7Cit9CisKKy8vCisvLyB0b19maWxlbmFtZTogQXJndW1lbnQgaW4gRGF0ZWluYW1lbiB1bXdhbmRlbG4KKy8vIHN0cjogIEFyZ3VtZW50CisvLyBSdWVja2dhYmU6IERhdGVpbmFtZQorLy8KKworc3RhdGljIG1peGVkIHRvX2ZpbGVuYW1lKHN0cmluZyBzdHIpCit7CisgIHN0cmluZyAqdG1wLHAsbmV3Zm47CisgIGludCBpOworLy8gVGVzdGVuIG9iIC4uIGluIGVpbmVtIEZpbGVuYW1lbmFic2Nobml0dCwgZmFsbHMgVmVyc2lvbiA8My4yLjUKKyAgdG1wPWV4cGxvZGUoc3RyLCIvIik7CisvLyBUZXN0ZW4gYXVmIFBmYWR2YXJpYWJsZQorICBpZiAoc2l6ZW9mKHRtcFswXSkgJiYgdG1wWzBdWzBdPT0nJCcgCisgICAgICAmJiBtX2NvbnRhaW5zKCZwLFF1ZXJ5UHJvcChQX1ZBUklBQkxFUyksdG1wWzBdWzEuLl0pKQorICAgIHRtcFswXT1wOworLy8gUGZhZCBhYnNvbHV0IG1hY2hlbiAoSGF0IGRhbmFjaCBub2NoIFdpbGRjYXJkcyBkcmlubmVuKSBvZGVyIGF1Y2ggbmljaHQKKyAgcmV0dXJuIG1hc3RlcigpLT5tYWtlX3BhdGhfYWJzb2x1dGUoaW1wbG9kZSh0bXAsIi8iKSk7Cit9CisKKworLy8KKy8vIF9wYXJzZWFyZ3MoKTogS29tbWFuZG96ZWlsZW5hYnNjaG5pdHQgcGFyc2VuCisvLyBzdHI6ICAgICAgICAgS29tbWFuZG96ZWlsZW5hYnNjaG5pdHQKKy8vIGxpbmU6ICAgICAgICBBcnJheSB2b24gZ2VwYXJzdGVuIEtvbW1hbmRvemVpbGVuYWJzY2huaXR0ZW4gKFJlZmVyZW56KQorLy8gZmxhZ3M6ICAgICAgIEFscyBSZWZlcmVueiB1ZWJlcmdlYmVuZXIgRmxhZy1XZXJ0CisvLyBvcHRzOiAgICAgICAgRXJsYXVidGUgRmxhZ3MKKy8vIGJ1aWxkX2ZuOiAgICBGaWxlbmFtZW4gYWVuZGVybgorLy8KKworcHJpdmF0ZSB2b2lkIF9wYXJzZWFyZ3Moc3RyaW5nIHN0ciwgc3RyaW5nICpsaW5lLGludCBmbGFncyxzdHJpbmcgb3B0cywKKyAgICAgICAgICAgICAgICAgICAgIGludCBidWlsZF9mbiApCit7CisKKy8vIFN0cmluZ3MgaW4gIiIgZXJoYWx0ZW4KKyAgaWYoc3RyWzBdID09ICJcIiJbMF0pICAKKyAgeyAKKyAgICBsaW5lICs9ICh7IHN0clsxLi48Ml0gfSk7CisgICAgcmV0dXJuOyAKKyAgfSAgCisvLyAgRmxhZ3MgcGFyc2VuCisgIGlmKHN0clswXSA9PSAnLScpICAKKyAgeyAKKyAgICBpbnQgaSxqOworICAgIGk9c2l6ZW9mKHN0cik7CisgICAgd2hpbGUoaS0tKQorICAgICAgaWYgKHN0cltpXSE9Jy0nKQorICAgICAgeworICAgICAgICBpZigoaiA9IG1lbWJlcihvcHRzLCBzdHJbaV0pKSAhPSAtMSkKKyAgICAgICAgICBmbGFncyB8PSAoMSA8PCBqKTsKKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgZmxhZ3M9LTE7CisgICAgICAgICAgcHJpbnRmKCJEYXMgRmxhZyAnLSVjJyB3aXJkIHZvbiBkZW0gQmVmZWhsICclcycgbmljaHQgIgorICAgICAgICAgICAgICAgICAidW50ZXJzdHVldHp0LlxuIixzdHJbaV0scXVlcnlfdmVyYigpfHwiIik7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICByZXR1cm47CisgIH0KKyAgaWYgKGJ1aWxkX2ZuKQorICB7CisgICAgaWYgKHN0cj0oc3RyaW5nKXRvX2ZpbGVuYW1lKHN0cikpIGxpbmUrPSh7IHN0ciB9KTsKKyAgfSAKKyAgZWxzZQorICAgIGxpbmUrPSAoeyBzdHIgfSk7Cit9CisKKworLy8KKy8vIHBhcnNlYXJncygpIC0gemVybGVndCBLb21tYW5kb3plaWxlIGluIGVpbiBBcnJheToKKy8vIGNtZGxpbmU6ICAgICBLb21tYW5kb3plaWxlCisvLyBmbGFnczogICAgICAgQWxzIFJlZmVyZW56IHVlYmVyZ2ViZW5lciBsZWVyZXIgSW50ZWdlcndlcnQuIEVudGhhZWx0IGRhbmFjaAorLy8gICAgICAgICAgICAgIGRpZSBGbGFncworLy8gb3B0czogICAgICAgIFN0cmluZyBtaXQgZXJsYXVidGVuIE9wdGlvbmVuCisvLyBidWlsZF9mbjogICAgRmlsZW5hbWVuIHVtYmF1ZW4/CisvLyBSdWVja2dhYmU6IEFycmF5IGRlciBLb21tYW5kb3plaWxlbmFyZ3VtZW50ZSAoYXVzc2VyIEZsYWdzKQorLy8KKworc3RhdGljIHN0cmluZyAqcGFyc2VhcmdzKHN0cmluZyBjbWRsaW5lLGludCBmbGFncywgc3RyaW5nIG9wdHMsaW50IGJ1aWxkX2ZuKQoreworICBpbnQgaTsKKyAgc3RyaW5nICpsaW5lOworICBsaW5lPSh7fSk7CisgIGlmICghc2l6ZW9mKGNtZGxpbmUpKSByZXR1cm4gKHt9KTsKKyAgbWFwKHJlZ2V4cGxvZGUoY21kbGluZSwiW1wiXVteXCJdKltcIl18ICIsIFJFX1RSQURJVElPTkFMKS0oeyIgIiwgIiJ9KSwKKyAgICAgICAgICAgICMnX3BhcnNlYXJncywgJmxpbmUsICZmbGFncyxvcHRzLCBidWlsZF9mbik7CisgIHJldHVybiBsaW5lIC0gKHsiIn0pOworfQorCisvLworLy8gX3ZjX21hcDogVkMtT2JqZWt0bmFtZW4genUgQXJyYXlzIHVtd2FuZGVsbiAoeyBuYW1lLCAtMSwgcHJvZ3JhbV90aW1lKCkgfSkKKy8vCisKK3ByaXZhdGUgaW50ICpfdmNfbWFwKG9iamVjdCBvYixtaXhlZCAqbGlzdCkKK3sKKyAgbGlzdCs9KHsgZXhwbG9kZShvYmplY3RfbmFtZShvYiksIi8iKVs8MV0sLTEscHJvZ3JhbV90aW1lKG9iKSB9KTsKKyAgcmV0dXJuIDA7Cit9CisKKworLy8KKy8vIF9nZXRfZmlsZXM6IEZpbGVkYXRlbiBiZWltIFJla3Vyc2l2ZW4ga29waWVyZW4gZXJzdGVsbGVuCisvLyBkaXJuYW1lOiAgICBCZWFyYmVpdGV0ZXMgVmVyemVpY2huaXMKKy8vIG1hc2s6ICAgICAgIE1hc2tlLCBkZXIgRGF0ZWluYW1lbiBnZW51ZWdlbiBtdWVzc2VuCisvLyBtb2RlOiAgICAgICBXZWxjaGUgRGF0ZW4gd2VyZGVuIGJlbm9ldGlndD8gKHNpZWhlIG1hZ2llci5oKQorLy8gZGVzdDogICAgICAgSW4gd2VsY2hlcyBWZXJ6ZWljaG5pcyBzb2xsIGtvcGllcnQgd2VyZGVuPworLy8gUnVlY2tnYWJlOiAgQWxpc3QgbWl0IGRlbiBEYXRlaWluZm9ybWF0aW9uZW4KKy8vCisKK3ByaXZhdGUgdmFyYXJncyBtaXhlZCAqX2dldF9maWxlcyhzdHJpbmcgZGlybmFtZSxzdHJpbmcgbWFzayxpbnQgbW9kZSxzdHJpbmcgZGVzdCkKK3sKKyAgbWl4ZWQgKmZpbGVzLCp0bXAsKmRhdGE7CisgIHN0cmluZyBmdWxsbmFtZSxiYXNlOworCisgIC8vREVCVUcoIl9HRjogRElSTkFNRSAiICsgZGlybmFtZSk7CisgIGRhdGE9Z2V0X2RpcihkaXJuYW1lKyIqIiw3KTsKKyAgaWYoIXNpemVvZihkYXRhKSkgcmV0dXJuICh7fSk7CisgIGZpbGVzPSh7fSk7CisgCisgIHdoaWxlKHNpemVvZihkYXRhKSkKKyAgeworICAgIHRtcD0oe30pOworICAgIGJhc2U9ZGF0YVtCQVNFTkFNRV07CisgICAgZnVsbG5hbWU9ZGlybmFtZStiYXNlOworICAgIGlmIChiYXNlIT0iLiImJmJhc2UhPSIuLiImJighKG1vZGU9PU1PREVfR1JFUCYmYmFzZT09IlJDUyIpKSYmCisgICAgICAgICgoZGF0YVtGSUxFU0laRV09PS0yJiYKKyAgICAgICBzaXplb2YodG1wPV9nZXRfZmlsZXMoZnVsbG5hbWUrIi8iLG1hc2ssbW9kZSwKKyAgICAgIGRlc3QrYmFzZSsiLyIpKSYmbW9kZSE9TU9ERV9STSl8fCFtYXNrfHxzaXplb2YocmVnZXhwKCh7IGJhc2UgfSksbWFzaywgUkVfVFJBRElUSU9OQUwpKSkpCisgICAgeworICAgICAgLy9ERUJVRygiX0dGOiBBRERJTkcgRklMRSAiICsgZnVsbG5hbWUpOworICAgICAgZmlsZXMrPSAoeyBkYXRhWzAuLjJdKyh7IGZ1bGxuYW1lLGRpcm5hbWUsZGVzdCtiYXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZih0bXApIH0pIH0pOworICAgIH0KKyAgICBpZiAoc2l6ZW9mKGZpbGVzKStzaXplb2YodG1wKT5NQVhfQVJSQVlfU0laRSkKKyAgICAgICByYWlzZV9lcnJvcigiWnUgdmllbGUgRmlsZXMgKD4zMDAwKSEhIEFiZ2Vicm9jaGVuIVxuIik7CisgICAgZmlsZXMrPXRtcDsKKyAgICBkYXRhPWRhdGFbMy4uXTsKKyAgfQorICAKKyAgaWYoc2l6ZW9mKGZpbGVzKT4zMDAmJiFJU19BUkNIKHRoaXNfb2JqZWN0KCkpKQorICAgIC8vIFRvZCBhbGxlbiBMYWdnZXJuIDpvKQorICAgIHJhaXNlX2Vycm9yKCJadSB2aWVsZSBGaWxlcyAoPjMwMCkhISBBYmdlYnJvY2hlbiFcbiIpOworICByZXR1cm4gZmlsZXM7Cit9CisgCisKKy8vCisvLyBfZ2V0X21hdGNoaW5nOiBSZWt1cnNpdmUgRnVua3Rpb24genVtIGVybWl0dGVsbiBkZXIgRmlsZXMsIHdlbm4gbWl0IE1hc2tlCisvLyAgICAgICAgICAgICAgICBnZWFyYmVpdGV0IHdpcmQgKHouQi4gY3AgLW0gL2JsYS8qLyogL3ppZWwgKi5jKQorLy8gcGF0aG1hc2s6IEFycmF5LCBkYXMgZGllIGVpbnplbG5lbiBFbGVtZW50ZSBkZXIgTWFza2UgKEFyZzEpIGVudGhhZWx0CisvLyAgICAgICAgICAgICAgICAgICAocGVyIGVmdW46b2xkX2V4cGxvZGUoYXJnMSwiLyIpKQorLy8gZGVwdGg6ICAgICBBa3R1ZWxsZXMgRWxlbWVudCB2b24gcGF0aG1hc2sKKy8vIHBhdGg6ICAgICAgaW1wbG9kZShwYXRobWFza1swLi5kZXB0aF0sIi8iKTsKKy8vIG1vZGU6ICAgICAgV2VsY2hlIERhdGVuIHdlcmRlbiBiZW5vZXRpZ3Q/IChzaWVoZSBtYWdpZXIuaCkKKy8vIGZsYWdzOiAgICAgV2VsY2hlIEZsYWdzIHd1cmRlbiBnZXNldHp0PworLy8gZGVzdDogICAgICBaaWVsdmVyemVpY2huaXMgKGJlaW0ga29waWVyZW4vbW92ZW4pCisvLyBmaWxlbWFzazogIE1hc2tlLCBkZXIgZGllIEZpbGVzIGdlbnVlZ2VuIG11ZXNzZW4KKy8vIFJ1ZWNrZ2FiZTogQWxpc3QgbWl0IGRlbiBEYXRlaWluZm9ybWF0aW9uZW4KKy8vCisKK3ByaXZhdGUgbWl4ZWQgKl9nZXRfbWF0Y2hpbmcoc3RyaW5nICpwYXRobWFzaywgaW50IGRlcHRoLCBzdHJpbmcgcGF0aCwgCisgICAgICAgICAgICAgICAgICAgIGludCBtb2RlLCBpbnQgcmVjdXJzaXZlLCBzdHJpbmcgZGVzdCxzdHJpbmcgZmlsZW1hc2spCit7CisgIG1peGVkICpkYXRhLCp0bXAsKmZpbGVzOworICBzdHJpbmcgYmFzZSxmdWxsOworCisgIC8vREVCVUcoIl9HTTogUE06ICIgKyBwYXRobWFza1tkZXB0aF0pOworICAvL0RFQlVHKCJfR006IEZNOiAiICsgZmlsZW1hc2spOworICBkYXRhPWdldF9kaXIocGF0aCtwYXRobWFza1tkZXB0aCsrXSxHRVRESVJfTkFNRVN8R0VURElSX1NJWkVTfEdFVERJUl9EQVRFUyl8fCh7fSk7CisgIGlmICghc2l6ZW9mKGRhdGEpKSByZXR1cm4gKHt9KTsKKyAgZmlsZXM9KHt9KTsKKyAgd2hpbGUoc2l6ZW9mKGRhdGEpKQorICB7CisgICAgaWYgKChiYXNlPWRhdGFbQkFTRU5BTUVdKT09Ii4ifHxiYXNlPT0iLi4iKQorICAgIHsKKyAgICAgIGRhdGE9ZGF0YVszLi5dOworICAgICAgY29udGludWU7CisgICAgfQorICAgIGZ1bGw9cGF0aCtiYXNlOworICAgIC8vREVCVUcoIl9HTTogRlVMTDogIiArIGZ1bGwpOworICAgIGlmICgoZGF0YVtGSUxFU0laRV09PS0yKSYmKHNpemVvZihwYXRobWFzayk+ZGVwdGgpJiYKKyAgICAgICAgKCEobW9kZT09TU9ERV9HUkVQJiZiYXNlPT0iUkNTIikpKQorICAgIHsKKyAgICAgIC8vREVCVUcoIkRFU0NFTkQgSU5UTyAiICsgZnVsbCk7CisgICAgICB0bXA9X2dldF9tYXRjaGluZyhwYXRobWFzayxkZXB0aCxmdWxsKyIvIixtb2RlLHJlY3Vyc2l2ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIChyZWN1cnNpdmU/ZGVzdCtiYXNlKyIvIjpkZXN0KSxmaWxlbWFzayk7CisgICAgfQorICAgIGVsc2UgdG1wPSh7fSk7CisgICAgLy9ERUJVRygiREVQVEg6ICIgKyBkZXB0aCArICIgOiAiICsgc2l6ZW9mKHBhdGhtYXNrKSk7CisgICAgaWYoKCFmaWxlbWFzayYmKGRlcHRoPT1zaXplb2YocGF0aG1hc2spKSl8fAorICAgICAgICAoZmlsZW1hc2smJihkZXB0aCsyPnNpemVvZihwYXRobWFzaykpJiYKKyAgICAgICAgc2l6ZW9mKHJlZ2V4cCgoeyBiYXNlIH0pLGZpbGVtYXNrLFJFX1RSQURJVElPTkFMKSkpfHwKKyAgICAgICAoKG1vZGU9PU1PREVfQ1B8fG1vZGU9PU1PREVfTVZ8fChmaWxlbWFzayYmCisgICAgICAgIChtb2RlPT1NT0RFX1JNKSYmc2l6ZW9mKHJlZ2V4cCgoeyBiYXNlfSksZmlsZW1hc2ssUkVfVFJBRElUSU9OQUwpKSkpJiYKKyAgICAgICAgc2l6ZW9mKHRtcCkpKQorICAgIHsKKyAgICAgIC8vREVCVUcoIkFERElORzogIiArIGJhc2UrICIgOiAiKyBmdWxsICk7CisgICAgICBmaWxlcys9KHsgZGF0YVswLi4yXSsoeyBmdWxsLCBwYXRoLCBkZXN0K2Jhc2Usc2l6ZW9mKHRtcCl9KSB9KTsKKyAgICB9CisgICAgaWYgKHNpemVvZihmaWxlcykrc2l6ZW9mKHRtcCk+TUFYX0FSUkFZX1NJWkUpCisgICAgICAgcmFpc2VfZXJyb3IoIlp1IHZpZWxlIEZpbGVzICg+MzAwMCkhISBBYmdlYnJvY2hlbiFcbiIpOworICAgIGZpbGVzKz10bXA7CisgICAgZGF0YT1kYXRhWzMuLl07CisgIH0KKyAgaWYoc2l6ZW9mKGZpbGVzKT4zMDAmJiFJU19BUkNIKHRoaXNfb2JqZWN0KCkpKQorICAgIC8vIFRvZCBhbGxlbiBMYWdnZXJuIQorICAgIHJhaXNlX2Vycm9yKCJadSB2aWVsZSBGaWxlcyAoPjMwMCkhISBBYmdlYnJvY2hlbiFcbiIpOworICByZXR1cm4gZmlsZXM7Cit9CisKKworLy8KKy8vIGdldF9maWxlczogQmFzaXNyb3V0aW5lIHp1bSBFcm1pdHRlbG4gZGVyIHp1IGJlYXJiZWl0ZW5kZW4gRGF0ZWllbgorLy8gZmlsZW5hbWU6ICBQZmFkbWFza2UsIFZlcnplaWNobmlzbmFtZSwgRGF0ZWluYW1lLCBkZXIgYmVhcmJlaXRldCB3ZXJkZW4KKy8vICAgICAgICAgICAgc29sbAorLy8gbW9kZTogICAgICBXZWxjaGUgRGF0ZW4gd2VyZGVuIGJlbm9ldGlndD8gKHNpZWhlIG1hZ2llci5oKQorLy8gcmVjdXJzaXZlOiBBdWNoIFVudGVydmVyemVpY2huaXNzZSBiZWFyYmVpdGVuPworLy8gZGVzdDogICAgICBXZW5uIGtvcGllcnQgd2VyZGVuIHNvbGw6IHdvaGluPworLy8gZmlsZW1hc2s6ICBNYXNrZSwgZGVyIGRpZSBEYXRlaW5hbWVuIGdlbnVlZ2VuIG11ZXNzZW4KKy8vIFJ1ZWNrZ2FiZTogQWxpc3QgbWl0IGRlbiBEYXRlaWluZm9ybWF0aW9uZW4KKy8vCisKK3N0YXRpYyB2YXJhcmdzIG1peGVkICpnZXRfZmlsZXMoc3RyaW5nIGZpbGVuYW1lLCBpbnQgbW9kZSwgaW50IHJlY3Vyc2l2ZSwgc3RyaW5nIGRlc3QsIHN0cmluZyBmaWxlbWFzaykKK3sgCisgIHN0cmluZyBmdWxsLHBhdGgsYmFzZSwqcGF0aGFycmF5LCp2cm9vbXMsZGVzdDI7CisgIG9iamVjdCB2Y29tcGlsZXI7CisgIG1peGVkICpmaWxlcywqZGF0YTsKKworICAvLyBERUJVRygiR0Y6ICIgKyBmaWxlbmFtZSk7CisgIC8vIERFQlVHKCJSRUM6ICIgKyByZWN1cnNpdmUgKyAiIE1PREU6ICIgKyBtb2RlKTsKKyAgLy8gaWYgKGRlc3RbPDEuLjwxXSE9Ii8iKSBERUJVRygiREVTVDogIiArIGRlc3QpOworICBpZiAoZmlsZW5hbWU9PSIvIikKKyAgICB7CisgICAgICBzd2l0Y2ggKG1vZGUpCisgICAgICB7CisgICAgICAgIGNhc2UgTU9ERV9MU0E6IHJldHVybiAoeyh7ICIiLCAtMiwgMCwiIiwiIiwiIiwwIH0pfSk7CisgICAgICAgIGRlZmF1bHQ6IGlmICghcmVjdXJzaXZlKSByZXR1cm4gKHt9KTsKKyAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorICBwYXRoYXJyYXk9ZXhwbG9kZShmaWxlbmFtZSwiLyIpOworICBpZighc2l6ZW9mKGRhdGE9Z2V0X2RpcihmaWxlbmFtZSw3KXx8KHt9KSkmJgorICAgICAobW9kZT09TU9ERV9VUER8fG1vZGU9PU1PREVfTU9SRXx8bW9kZT09TU9ERV9FRCkpCisgICAgZGF0YT1nZXRfZGlyKGZpbGVuYW1lKyIuYyIsNyl8fCh7fSk7CisgIGlmICgobW9kZT09TU9ERV9MU0F8fG1vZGU9PU1PREVfTFNCKSYmCisgICAgICAodmNvbXBpbGVyID0gZmluZF9vYmplY3QoaW1wbG9kZShwYXRoYXJyYXlbMC4uPDJdLCIvIikrIi92aXJ0dWFsX2NvbXBpbGVyIikpICYmCisgICAgICBwb2ludGVycCh2cm9vbXM9KG1peGVkICopdmNvbXBpbGVyLT5RdWVyeU9iamVjdHMoKSkpCisgICAgbWFwKHZyb29tcywjJ192Y19tYXAsJmRhdGEpOworICBmaWxlcz0oe30pOworICBpZiAoc2l6ZW9mKGRhdGEpKSAvLyBwYXNzZW5kZSBmaWxlcworICB7CisgICAgbWl4ZWQgKnN1YmZpbGVzOworICAgIHN1YmZpbGVzPSh7fSk7CisgICAgcGF0aD1pbXBsb2RlKHBhdGhhcnJheVswLi48Ml0sIi8iKSsiLyI7CisgICAgd2hpbGUgKHNpemVvZihkYXRhKSkKKyAgICB7CisgICAgICBzdWJmaWxlcz0oe30pOworICAgICAgYmFzZT1kYXRhW0JBU0VOQU1FXTsKKyAgICAgIGlmIChtb2RlPT1NT0RFX0xTQnx8KGJhc2UhPSIuIiYmYmFzZSE9Ii4uIikpCisgICAgICB7CisgICAgICAgIC8vREVCVUcoIlBBVEg6ICIgKyBwYXRoKyIgQkFTRTogIiArIGJhc2UgKyAiIE1PREU6ICIgKyBtb2RlKTsKKyAgICAgICAgZnVsbD1wYXRoK2Jhc2U7CisgICAgICAgIGRlc3QyPSgoZGVzdD09Ii8ifHxmaWxlX3NpemUoZGVzdFswLi48Ml0pPT0tMik/CisgICAgICAgICAgICAgICAoZGVzdCtiYXNlKTooZGVzdD09Ii8iPyIvIjpkZXN0WzAuLjwyXSkpOworICAgICAgICAvL0RFQlVHKCJERVNUOiAiICsgZGVzdCk7CisgICAgICAgIGlmIChyZWN1cnNpdmUmJmRhdGFbRklMRVNJWkVdPT0tMikgLy8gVmVyemVpY2huaXMsIFJla3Vyc2l2CisgICAgICAgICAgc3ViZmlsZXM9X2dldF9maWxlcyhmdWxsKyIvIixmaWxlbWFzayxtb2RlLGRlc3QyKyIvIik7CisgICAgICAgIGlmICghKGZpbGVtYXNrJiYhc2l6ZW9mKHN1YmZpbGVzKSYmIXNpemVvZihyZWdleHAoKHsgYmFzZSB9KSxmaWxlbWFzayxSRV9UUkFESVRJT05BTCkpKSkKKyAgICAgICAgeworICAgICAgICAgIGlmICghZmlsZW1hc2t8fG1vZGUhPU1PREVfUk0pCisgICAgICAgICAgICBmaWxlcys9KHsgZGF0YVswLi4yXSsoeyBmdWxsLCBwYXRoLCBkZXN0MixzaXplb2Yoc3ViZmlsZXMpfSkgfSk7CisgICAgICAgICAgaWYgKHNpemVvZihmaWxlcykrc2l6ZW9mKHN1YmZpbGVzKT5NQVhfQVJSQVlfU0laRSkKKyAgICAgICAgICAgIHJhaXNlX2Vycm9yKCJadSB2aWVsZSBGaWxlcyAoPjMwMDApISEgQWJnZWJyb2NoZW4hXG4iKTsKKyAgICAgICAgICBmaWxlcys9c3ViZmlsZXM7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGRhdGE9ZGF0YVszLi5dOworICAgIH0KKyAgICByZXR1cm4gZmlsZXM7CisgIH0KKy8vIEZpbGUgZXhpc3RpZXJ0IG5pY2h0IC0+IFdpbGRjYXJkIG9kZXIgdGF0c2FlY2hsaWNoIG5pY2h0IGV4aXN0ZW50CisvLyBCZWhhbmRlbG4gamUgbmFjaCBtb2RlCisgIHN3aXRjaChtb2RlKQorICB7CisgICAgY2FzZSBNT0RFX0NQOgorICAgIGNhc2UgTU9ERV9NVjoKKyAgICBjYXNlIE1PREVfQ0Q6CisgICAgY2FzZSBNT0RFX0xTQToKKyAgICAgIGZpbGVzPV9nZXRfbWF0Y2hpbmcocGF0aGFycmF5KyhmaWxlbWFzaz8oeyAiKiIgfSk6KHt9KSksMSwiLyIsbW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY3Vyc2l2ZSxkZXN0LGZpbGVtYXNrKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6IGJyZWFrOyAKKyAgfQorICByZXR1cm4gZmlsZXM7Cit9CisKKworLy8KKy8vIGZpbGVfbGlzdCgpOiBMaXN0ZSBkZXIgRmlsZWluZm9ybWF0aW9uZW4KKy8vIGZpbGVzOiAgICAgQXJyYXkgZGVyIEZpbGVuYW1lbiBNSVQgV2lsZGNhcmRzCisvLyBtb2RlOiAgICAgIFdlbGNoZSBEYXRlbiB3ZXJkZW4gYmVub2V0aWd0CisvLyByZWN1cnNpdmU6IFJla3Vyc2l2IGxpc3Rlbj8KKy8vIGRlc3Q6ICAgICAgWmllbHZlcnplaWNobmlzCisvLyBtYXNrOiAgICAgIE1hc2tlIChyZWdleHAsIHdlbm4gZGVmaW5pZXJ0KQorLy8gUnVlY2tnYWJlOiBMaXN0ZSBkZXIgYmV0cm9mZmVuZW4gRmlsZXMKKy8vCisKK3N0YXRpYyB2YXJhcmdzIG1peGVkICpmaWxlX2xpc3Qoc3RyaW5nICpmaWxlcywgaW50IG1vZGUsIGludCByZWN1cnNpdmUsIHN0cmluZyBkZXN0LCBzdHJpbmcgbWFzaykKK3sKKyAgc3RyaW5nICpsaXN0LGVyciwqcmVzdWx0OworICBpbnQgaSxqOworICBsaXN0PSh7fSk7CisgIGlmIChtYXNrKSBtYXNrPWdsb2IycmVnZXhwKG1hc2spOworICBqPXNpemVvZihmaWxlcyk7CisgIGZvcihpPTA7aTxqO2krKykKKyAgeworICAgIC8vIEFic2NobGllc3NlbmRlbiAvIHZvbiBQZmFkbmFtZW4gYWJzY2huZWlkZW4sIHdlaWwgaW4gZGllc2VtIEZhbGwgCisgICAgLy8gZGllIEluaGFsdGUgZGVyIGVyc3RlbiBVbnRlcnZlcnplaWNobmlzZWJlbmUgbWl0IGF1c2dlZ2ViZW4KKyAgICAvLyB3dXJkZW4uIFVyc2FjaGUgaGllcmZ1ZXIgaXN0IGVpbiBGaXggYW4gZnVsbF9wYXRoX2FycmF5KCkgaW0gCisgICAgLy8gTWFzdGVyb2JqZWt0LCBkZXIgZGF6dSBmdWVocnRlLCBkYXNzIGdldF9kaXIoKSBkZW4gYWJzY2hsaWVzc2VuZGVuIC8KKyAgICAvLyBkZXMgdWViZXJnZWJlbmVuIFBmYWRlcyBqZXR6dCBrb3JyZWt0IGJlaGFuZGVsdC4gXG8vCisgICAgaWYgKCBzaXplb2YoZmlsZXNbaV0pID4gMSAmJiBmaWxlc1tpXVs8MV0gPT0gJy8nICkKKyAgICB7CisgICAgICBmaWxlc1tpXSA9IGZpbGVzW2ldWzAuLjwyXTsKKyAgICAgIGlmICggIXNpemVvZihmaWxlc1tpXSkgKQorICAgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgaWYgKGVycj1jYXRjaChsaXN0Kz1nZXRfZmlsZXMoZmlsZXNbaV0sbW9kZSxyZWN1cnNpdmUsZGVzdCxtYXNrKSkpCisgICAgeworICAgICAgcHJpbnRmKCJGZWhsZXIgYXVmZ2V0cmV0ZW46ICVzXG4iLGVycik7CisgICAgICBsb2dfZmlsZShTSEVMTExPRygiRklMRV9MSVNUIiksCisgICAgICAgICAgICAgICBzcHJpbnRmKCIlcyBmdWVocnRlIGZvbGdlbmRlcyBLb21tYW5kbyBhdXM6IChaZWl0OiAlcylcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgIiAgPj4lcyAlczw8XG4iCisgICAgICAgICAgICAgICAgICAgICAgICIgIEZvbGdlbmRlciBGZWhsZXIgdHJhdCBkYWJlaSBhdWY6XG4iCisgICAgICAgICAgICAgICAgICAgICAgICIgICVzXG5cbiIsCisgICAgICAgICAgICAgICAgICAgICAgIGNhcGl0YWxpemUoZ2V0dWlkKCkpfHwiPFVuYmVrYW5udD4iLGR0aW1lKHRpbWUoKSksCisgICAgICAgICAgICAgICAgICAgICAgIHF1ZXJ5X3ZlcmIoKXx8IioiLF91bnBhcnNlZF9hcmdzKCl8fCIqIixlcnJ8fCIqIikpOworICAgICAgcmV0dXJuICh7fSk7CisgICAgfQorICB9CisgICByZXR1cm4gbGlzdDsKK30KZGlmZiAtLWdpdCBhL3N0ZC9zaGVsbHMvbWFnaWVyL3BsYXllcnMuYyBiL3N0ZC9zaGVsbHMvbWFnaWVyL3BsYXllcnMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNTYzZDlkCi0tLSAvZGV2L251bGwKKysrIGIvc3RkL3NoZWxscy9tYWdpZXIvcGxheWVycy5jCkBAIC0wLDAgKzEsNTI5IEBACisvLyBNb3JnZW5HcmF1ZW4gTVVEbGliCisvLworLy8gcGxheWVycy5jCisvLworLy8gJElkOiBwbGF5ZXJzLmMgOTU1MSAyMDE2LTA0LTIwIDIyOjU0OjU4WiBBcmF0aG9ybiAkCisjcHJhZ21hIHN0cmljdF90eXBlcworI3ByYWdtYSBzYXZlX3R5cGVzCisjcHJhZ21hIHJhbmdlX2NoZWNrCisjcHJhZ21hIG5vX2Nsb25lCisjcHJhZ21hIHBlZGFudGljCisKKyNpbmNsdWRlIDx3aXpsZXZlbHMuaD4KKyNpbmNsdWRlIDxhbnNpLmg+CisjaW5jbHVkZSA8bG9nZ2luZy5oPgorI2RlZmluZSBORUVEX1BST1RPVFlQRVMKKyNpbmNsdWRlIDxtYWdpZXIuaD4KKyNpbmNsdWRlIDx0aGluZy9wcm9wZXJ0aWVzLmg+CisjaW5jbHVkZSA8dGhpbmcvZGVzY3JpcHRpb24uaD4KKyNpbmNsdWRlIDxsaXZpbmcvY29tbS5oPgorI2luY2x1ZGUgPHBsYXllci5oPgorI3VuZGVmIE5FRURfUFJPVE9UWVBFUworI2luY2x1ZGUgPHByb3BlcnRpZXMuaD4KKyNpbmNsdWRlIDxtb3ZpbmcuaD4KKworc3RhdGljIG1peGVkIF9xdWVyeV9sb2NhbGNtZHMoKQoreworICByZXR1cm4gKHsoeyJ6YXAiLCJfemFwIiwwLFdJWkFSRF9MVkx9KSwKKyAgICAgICAgICAgKHsidmVyZm9sZ2UiLCJfdmVyZm9sZ2UiLDAsTEVBUk5FUl9MVkx9KSwKKyAgICAgICAgICAgKHsidHJhbnMiLCJfdHJhbnMiLDAsTEVBUk5FUl9MVkx9KSwKKyAgICAgICAgICAgKHsicGVhY2UiLCJfZnJpZWRlbiIsMCxMRUFSTkVSX0xWTH0pLAorICAgICAgICAgICAoeyJmcmllZGVuIiwiX2ZyaWVkZW4iLDAsTEVBUk5FUl9MVkx9KSwKKyAgICAgICAgICAgKHsicHdobyIsIl9wd2hvIiwwLFdJWkFSRF9MVkx9KSwKKyAgICAgICAgICAgKHsiendpbmdlIiwiX3p3aW5nZSIsMCxXSVpBUkRfTFZMfSksCisgICAgICAgICAgICh7ImhlYWwiLCJfaGVpbGUiLDAsV0laQVJEX0xWTH0pLAorICAgICAgICAgICAoeyJoZWlsIiwiX2hlaWxlIiwxLFdJWkFSRF9MVkx9KSwKKyAgICAgICAgICAgKHsicGVvcGxlIiwiX3Blb3BsZSIsMCxMRUFSTkVSX0xWTH0pLAorICAgICAgICAgICAoeyJzcGllbGVyIiwiX3NwaWVsZXIiLDAsV0laQVJEX0xWTH0pfSk7Cit9CisKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMjIyMjIyMKKy8vIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgWkFQICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMjIyMjIyMKKworcHJpdmF0ZSBzdHJpbmcgX3phcF9tZXNzYWdlKHN0cmluZyBzdHIsIG9iamVjdCBvYmopCit7CisgIHN0cj1yZWdyZXBsYWNlKHN0ciwiQEB3ZXJAQCIsKHN0cmluZylvYmotPm5hbWUoV0VSLDIpLDEpOworICBzdHI9cmVncmVwbGFjZShzdHIsIkBAd2Vzc2VuQEAiLChzdHJpbmcpb2JqLT5uYW1lKFdFU1NFTiwyKSwxKTsKKyAgc3RyPXJlZ3JlcGxhY2Uoc3RyLCJAQHdlbUBAIiwoc3RyaW5nKW9iai0+bmFtZShXRU0sMiksMSk7CisgIHN0cj1yZWdyZXBsYWNlKHN0ciwiQEB3ZW5AQCIsKHN0cmluZylvYmotPm5hbWUoV0VOLDIpLDEpOworICBzdHI9cmVncmVwbGFjZShzdHIsIkBAaWNoQEAiLG5hbWUoV0VSLDIpLDEpOworICByZXR1cm4gY2FwaXRhbGl6ZShzdHIpOworfQorCitzdGF0aWMgaW50IF96YXAoc3RyaW5nIHN0cikKK3sKKyAgICBvYmplY3Qgb3BmZXI7CisgICAgc3RyaW5nICptZXNzYWdlLCBkdW1teTsKKyAgICBpbnQgc3BpZWxlcjsKKworICAgIGlmICghc3RyKSByZXR1cm4gVVNBR0UoInphcCA8bmFtZT4iKTsKKyAgICBpZiAoc3NjYW5mKCBzdHIsICJzcGllbGVyICVzIiwgZHVtbXkgKSkKKyAgICB7CisgICAgICBzdHIgPSBkdW1teTsKKyAgICAgIHNwaWVsZXIgPSAxOworICAgIH0KKyAgICBpZiAob3BmZXI9cHJlc2VudChzdHIsZW52aXJvbm1lbnQoKSkpCisgICAgeworICAgICAgaWYgKCAhbGl2aW5nKG9wZmVyKSApCisgICAgICB7CisgICAgICAgIHByaW50ZigiJXMgaXN0IGRvY2ggZ2FyIGtlaW4gTGViZXdlc2VuIVxuIixjYXBpdGFsaXplKHN0cikgKTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgICB9CisgICAgICBpZiAocXVlcnlfb25jZV9pbnRlcmFjdGl2ZShvcGZlcikmJiFzcGllbGVyICkKKyAgICAgIHsKKyAgICAgICAgcHJpbnRmKCAiU3BpZWxlciBrYW5uc3QgRHUgbnVyIG1pdCBkZXIgU3ludGF4ICd6YXAgc3BpZWxlciA8bmFtZT4nICIKKyAgICAgICAgICAgICAgICAidG9ldGVuIVxuIiApOworICAgICAgICByZXR1cm4gMTsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgaWYgKCAhcXVlcnlfb25jZV9pbnRlcmFjdGl2ZShvcGZlcikgJiYgc3BpZWxlciApCisgICAgICAgIHsKKyAgICAgICAgICBwcmludGYoICJBYmVyICVzIGlzdCBkb2NoIGdhciBrZWluIFNwaWVsZXIhXG4iLGNhcGl0YWxpemUoc3RyKSk7CisgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIH0KKworICAgICAgbWVzc2FnZSA9IFF1ZXJ5UHJvcChQX1pBUF9NU0cpOworCisgICAgICBpZiAoICFwb2ludGVycChtZXNzYWdlKSB8fCBzaXplb2YobWVzc2FnZSkgIT0gMyApeworICAgICAgICAgIHRlbGxfcm9vbShlbnZpcm9ubWVudCgpLHNwcmludGYoIiVzIGJlc2Nod29lcnQgZWluZW4gQmxpdHogIgorICAgICAgICAgICAgICAgICJ2b20gSGltbWVsLlxuIixjYXBpdGFsaXplKGdldHVpZCgpKSksKHsgdGhpc19vYmplY3QoKSB9KSk7CisgICAgICAgICAgcHJpbnRmKCJEdSB0b2V0ZXN0ICVzLlxuIixvcGZlci0+bmFtZSggV0VOLDIpKTsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgcHJpbnRmKF96YXBfbWVzc2FnZShtZXNzYWdlWzBdLG9wZmVyKSk7CisgICAgICAgIHRlbGxfcm9vbShlbnZpcm9ubWVudCgpLF96YXBfbWVzc2FnZShtZXNzYWdlWzFdLG9wZmVyKSwKKyAgICAgICAgICAgICAoe3RoaXNfcGxheWVyKCksb3BmZXJ9KSk7CisgICAgICAgIHRlbGxfb2JqZWN0KG9wZmVyLF96YXBfbWVzc2FnZShtZXNzYWdlWzJdLG9wZmVyKSk7CisgICAgICB9CisKKyAgICAgIG9wZmVyLT5kaWUoKTsKKyAgICAgIHJldHVybiAxOworICB9CisgIGVsc2V7CisgICAgICBwcmludGYoIlNvd2FzIHNpZWhzdCBEdSBoaWVyIG5pY2h0LlxuIik7CisgICAgICByZXR1cm4gMTsKKyAgfQorfQorCisKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIyMjIyMjIyMjIyMKKy8vIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIFZFUkZPTEdFICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyMjIyMjIyMjIyMjCisKK3N0YXRpYyBpbnQgX3ZlcmZvbGdlKHN0cmluZyBzdHIpCit7CisgIC8vIFdlbm4gbmljaHRzIGVpbmdlZ2ViZW4gd3VyZGUsIHdpcmQgdmVyIFZlcmZvbGd1bmdzbW9kdXMgYmVlbmRldCwgc29mZXJuCisgIC8vIGVyIHp1dm9yIGVpbmdlc2NoYWx0ZXQgd2FyLiBBbnNvbnN0ZW4gd2lyZCBlaW5lIEZlaGxlcm1lbGR1bmcgCisgIC8vIGF1c2dlZ2ViZW4uCisgIGlmICghc2l6ZW9mKHN0cikpCisgIHsKKyAgICBtaXhlZCAqcHVyID0gUXVlcnkoUF9QVVJTVUVSUyk7CisgICAgaWYgKCBwb2ludGVycChwdXIpICYmIHNpemVvZihwdXIpICYmIG9iamVjdHAocHVyWzBdKSApCisgICAgeworICAgICAgcHVyWzBdLT5SZW1vdmVQdXJzdWVyKHRoaXNfb2JqZWN0KCkpOworICAgICAgUmVjZWl2ZU1zZygiVmVyZm9sZ3VuZ3Ntb2R1cyBhYmdlc2NoYWx0ZXQuIiwgTVRfTk9USUZJQ0FUSU9OKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIFJlY2VpdmVNc2coIkR1IHZlcmZvbGdzdCBkb2NoIHVlYmVyaGF1cHQgbmllbWFuZGVuLiIsIE1UX05PVElGSUNBVElPTik7CisgICAgfQorICAgIHJldHVybiAxOworICB9CisgIHN0cj1sb3dlcl9jYXNlKHN0cik7CisgIAorICAvLyBtYXRjaF9saXZpbmcoKSBlcmxhdWJ0IGRpZSBQcnVlZnVuZywgb2IgZGllIEFuZ2FiZSBlaW5kZXV0aWcgd2FyLgorICBpbnR8c3RyaW5nIGx2ID0gbWF0Y2hfbGl2aW5nKHN0cik7CisgIGlmICggaW50cChsdikgKQorICB7CisgICAgaWYgKCBsdiA9PSAtMiApCisgICAgICBSZWNlaXZlTXNnKCJLZWluIHNvbGNoZXMgV2VzZW4gZ2VmdW5kZW4uIiwgTVRfTk9USUZJQ0FUSU9OKTsKKyAgICBlbHNlCisgICAgICBSZWNlaXZlTXNnKHNwcmludGYoInZlcmZvbGdlOiAnJXMnIGlzdCBuaWNodCBlaW5kZXV0aWcuXG4iLCBzdHIpLAorICAgICAgICBNVF9OT1RJRklDQVRJT04pOworICAgIHJldHVybiAxOworICB9CisgIAorICAvLyBTcGllbGVyIHp1ZXJzdCBhdXN3YWVobGVuLCBkYW5hY2ggaW0gUmF1bSBhbndlc2VuZGUgTGViZXdlc2VuLgorICBvYmplY3QgemllbCA9IGZpbmRfcGxheWVyKGx2KSB8fCBwcmVzZW50KGx2LCBlbnZpcm9ubWVudCh0aGlzX3BsYXllcigpKSk7CisgIAorICAvLyBXdXJkZSBrZWluIExlYmV3ZXNlbiBnZWZ1bmRlbiwgd2lyZCBkYXMgZXJzdGUgRWxlbWVudCBhdXMgZGVyIExpc3RlIGRlcgorICAvLyBMZWJld2VzZW4gZGllc2VzIE5hbWVucyBnZXdhZWhsdCwgZmFsbHMgdm9yaGFuZGVuLiBOdXIgTGViZXdlc2VuIG1pdAorICAvLyBFbnZpcm9ubWVudCBrb21tZW4gaW4gRnJhZ2UsIGRlbm4gc29uc3QgZ2lidCBlcyBrZWluZW4gUmF1bSwgaW4gZGVuIGRlcgorICAvLyBuZXVlIFZlcmZvbGdlciBiZXdlZ3Qgd2VyZGVuIGtvZW5udGUuCisgIGlmICggIW9iamVjdHAoemllbCkgKSB7CisgICAgb2JqZWN0KiBlbGlnaWJsZV9saXZpbmdzID0gZmlsdGVyKGZpbmRfbGl2aW5ncyhsdiksICMnZW52aXJvbm1lbnQpOworICAgIGlmIChzaXplb2YoZWxpZ2libGVfbGl2aW5ncykpCisgICAgICB6aWVsID0gZWxpZ2libGVfbGl2aW5nc1swXTsKKyAgfQorICAKKyAgLy8gRW5kbGljaCBldHdhcyBnZWZ1bmRlbj8gRGFubiBWZXJmb2xnZXIgZWludHJhZ2VuIHVuZCB6dW0gWmllbCBiZXdlZ2VuLgorICBpZiAoIG9iamVjdHAoemllbCkgKQorICB7CisgICAgaWYgKCB6aWVsID09IHRoaXNfcGxheWVyKCkgKSAKKyAgICB7CisgICAgICBSZWNlaXZlTXNnKCJEdSBrYW5uc3QgRGljaCBuaWNodCBzZWxic3QgdmVyZm9sZ2VuLiIsIE1UX05PVElGSUNBVElPTik7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICBSZWNlaXZlTXNnKHNwcmludGYoCisgICAgICAgICJEdSB2ZXJmb2xnc3QgamV0enQgJXMuIFslc10iLCB6aWVsLT5uYW1lKFdFTiksIG9iamVjdF9uYW1lKHppZWwpKSwKKyAgICAgICAgTVRfTk9USUZJQ0FUSU9OLCBNQV9NT1ZFKTsKKyAgICAgIHppZWwtPkFkZFB1cnN1ZXIodGhpc19vYmplY3QoKSk7CisgICAgICB6aWVsLT5UYWtlRm9sbG93ZXJzKCk7CisgICAgfQorICB9CisgIGVsc2UKKyAgeworICAgIFJlY2VpdmVNc2coIktlaW4gV2VzZW4gbWl0IGRlbSBOYW1lbiAnIitsdisiJyBnZWZ1bmRlbiwgb2RlciBudXIgIgorICAgICAgInNvbGNoZSBvaG5lIEVudmlyb25tZW50LiIsIE1UX05PVElGSUNBVElPTiwgMCwgInZlcmZvbGdlOiAiKTsKKyAgfQorICByZXR1cm4gMTsKK30KKworCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMjIyMjIyMjIworLy8jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIFRSQU5TICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIyMjIyMjIyMKKworc3RhdGljIGludCBfdHJhbnMoc3RyaW5nIHN0cikKK3sKKyAgb2JqZWN0IGxpdmluZzsKKworICBpZiAoIXNpemVvZihzdHIpKQorICAgIHJldHVybiBfbm90aWZ5X2ZhaWwoIlN5bnRheDogdHJhbnMgPHNwaWVsZXJuYW1lPlxuIiksMDsKKyAgc3RyPW1hdGNoX2xpdmluZyhzdHIsMCk7CisgIGlmIChpbnRwKHN0cikpCisgICAgc3dpdGNoIChzdHIpCisgICAgeworICAgICAgY2FzZSAtMTogd3JpdGUoIkRhcyB3YXIgbmljaHQgZWluZGV1dGlnLlxuIik7IHJldHVybiAxOworICAgICAgY2FzZSAtMjogd3JpdGUoIlNvIGVpbiBXZXNlbiBnaWJ0IGVzIG5pY2h0LlxuIik7IHJldHVybiAxOworICAgIH0KKyAgaWYobGl2aW5nPWZpbmRfbGl2aW5nKHN0cikpCisgIHsKKyAgICBpZiAobGl2aW5nLT5tb3ZlKG9iamVjdF9uYW1lKGVudmlyb25tZW50KCkpLAorICAgICAgICAgICAgICAgICAgICAgTV9UUE9SVHxNX05PQ0hFQ0spPD0wKQorICAgIHsKKyAgICAgIHByaW50ZigiVGVsZXBvcnRpZXJlbiB2b24gJXMgZmVobGdlc2NobGFnZW4uXG4iLGxpdmluZy0+TmFtZShXRU0pKTsKKyAgICAgIGlmIChJU19MRUFSTkVSKGxpdmluZykpCisgICAgICAgIHRlbGxfb2JqZWN0KGxpdmluZyxzcHJpbnRmKCIlcyB3b2xsdGUgRGljaCB0ZWxlcG9ydGllcmVuLCAiCisgICAgICAgICAgICAgImhhdCBhYmVyIHZlcnNhZ3QhXG4iLGNhcGl0YWxpemUoZ2V0dWlkKCkpKSk7CisgICAgICByZXR1cm4gMTsKKyAgICB9CisgICAgdGVsbF9vYmplY3QobGl2aW5nLHNwcmludGYoCisgICAgIkVpbiBzZWx0c2FtZXMgR2VmdWVobCB1ZWJlcmtvbW10IERpY2ggLi4uXG4iCisgICAgIkR1IHZlcmxpZXJzdCBkaWUgT3JpZW50aWVydW5nIC4uLlxuIgorICAgICsoUXVlcnlQcm9wKFBfSU5WSVMpPyIiOiIlcyBob2x0IERpY2ggenUgc2ljaC5cbiIpLAorICAgIGNhcGl0YWxpemUoZ2V0dWlkKCkpKSk7CisgICAgcHJpbnRmKCIlcyB3dXJkZSBoZXJiZWl6aXRpZXJ0LlxuIixsaXZpbmctPk5hbWUoV0VSKSk7CisgICAgcmV0dXJuIDE7CisgIH0KKyAgcHJpbnRmKCJEYXMgTGViZXdlc2VuICclcycga29ubnRlIG5pY2h0IGdlZnVuZGVuIHdlcmRlbi5cbiIsCisgICAgICAgICBjYXBpdGFsaXplKHN0cikpOworICByZXR1cm4gMTsKK30KKworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICMjIyMjIyMjIyMjCisvLyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyBGUklFREVOICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICMjIyMjIyMjIyMjCisKK3N0YXRpYyBpbnQgX2ZyaWVkZW4oc3RyaW5nIHNuYW1lKQoreworICBvYmplY3QgKmVuZW0sb2JqOworICBpbnQgaTsKKyAgc3RyaW5nIGhpbTsKKyAgCisgIGlmICghc25hbWUpCisgIHsKKyAgICBlbmVtPWFsbF9pbnZlbnRvcnkoZW52aXJvbm1lbnQoKSk7CisgICAgbWFwX29iamVjdHMoZW5lbSwiU3RvcEh1bnRpbmdNb2RlIik7CisgICAgdGVsbF9yb29tKGVudmlyb25tZW50KCksc3ByaW50ZigiJXMgc3RpZnRldCBGcmllZGVuLlxuIixjYXBpdGFsaXplKGdldHVpZCgpKSksCisgICAgICAgICAgICAgICh7IHRoaXNfb2JqZWN0KCl9KSk7CisgICAgcHJpbnRmKCJEdSBzdGlmdGVzdCBGcmllZGVuLlxuIik7CisgICAgcmV0dXJuIDE7CisgIH0KKyAgZWxzZQorICB7CisgICAgaWYgKCFvYmo9ZmluZF9saXZpbmcoc25hbWUpKQorICAgICAgcmV0dXJuIHByaW50ZigiS2VpbiBzb2xjaGVzIExlYmV3ZXNlbiBpbSBTcGllbC5cbiIpLDE7CisgICAgaGltPShzdHJpbmcpb2JqLT5uYW1lKFdFTSk7CisgICAgaT1zaXplb2YoZW5lbT0ob2JqZWN0ICopKCgobWl4ZWQgKilvYmotPlN0b3BIdW50aW5nTW9kZSgpKVswXSkpOworICAgIC8vIE1pc3Rkcml2ZXIgLi4uIG9iamVjdCoqIHdhZXJlIHJpY2h0aWcgZ2V3ZXNlbiAuLi4gKnNldWZ6KgorICAgIHdoaWxlKGktLSkKKyAgICB7CisgICAgICBlbmVtW2ldLT5TdG9wSHVudEZvcihvYmopOworICAgICAgdGVsbF9vYmplY3Qob2JqLHNwcmludGYoIiVzIGJlZW5kZXQgRGVpbmVuIEthbXBmIG1pdCAlcy5cbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXBpdGFsaXplKGdldHVpZCgpKSxlbmVtW2ldLT5OYW1lKFdFTSkpKTsKKyAgICAgIHRlbGxfb2JqZWN0KGVuZW1bMF0sc3ByaW50ZigiJXMgYmVlbmRldCBEZWluZW4gS2FtcGYgbWl0ICVzLlxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXBpdGFsaXplKGdldHVpZCgpKSxoaW0pKTsKKyAgICB9CisgIH0KKyAgcHJpbnRmKCIlcyB1bmQgYWxsZSBHZWduZXIgd3VyZGVuIGJlZnJpZWRldC5cbiIsb2JqLT5OYW1lKFdFUikpOworICByZXR1cm4gMTsKK30KKworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIyMjIyMjIworLy8jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIFBXSE8gIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIyMjIyMjIworCisjaWYgX19WRVJTSU9OX18gPCAiMy4yLjkiCitwcml2YXRlIGludCBfcHdob19sZWFybmVyX3Rlc3Qob2JqZWN0IG9iKQoreworICByZXR1cm4gIUlTX0xFQVJORVIob2IpOworfQorI2VuZGlmCisKK3N0YXRpYyBpbnQgX3B3aG8oKQoreworICBtaXhlZCogc3BpZWxlciwgcmVzLCAqaGFuZHM7CisgIGludCBpOworI2lmIF9fVkVSU0lPTl9fIDwgIjMuMi45IgorICBzcGllbGVyID0gZmlsdGVyKHVzZXJzKCksIydfcHdob19sZWFybmVyX3Rlc3QpOworI2Vsc2UKKyAgc3BpZWxlciA9IGZpbHRlcih1c2VycygpLCg6IHJldHVybiAhSVNfTEVBUk5FUigkMSk7IDopKTsKKyNlbmRpZgorICBzcGllbGVyID0gc29ydF9hcnJheShzcGllbGVyLCBmdW5jdGlvbiBpbnQgKG9iamVjdCBhLCBvYmplY3QgYikKKyAgICAgIHsgcmV0dXJuIGEtPlF1ZXJ5UHJvcChQX0xFVkVMKSA+IGItPlF1ZXJ5UHJvcChQX0xFVkVMKTsgfSApOworICAKKyAgcmVzID0gIkx2bCBOYW1lICAgICAgICAgRXJmYWhydW5nICAgUVAgIEludCBTdHIgRGV4IENvbiBXQyAgICIKKyAgICAiQUMgICBIQU5EUyBIUCAgKG1heClcbiIKKyAgICAiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iCisgICAgIi0tLS0tLS0tLS0tLS0tLS0tXG4iOworICBmb3IgKGk9c2l6ZW9mKHNwaWVsZXIpLTE7IGk+PTA7IGktLSkKKyAgICByZXMgKz0gc3ByaW50ZigiJTNkICUtMTJzICU5ZCAlNWQgJTNkICUzZCAlM2QgJTNkICU0ZCAlNGQgICU1ZCAiCisgICAgICAgICAgICAgICAgICAgIiU0ZCAoJTRkKVxuIiwKKyAgICAgc3BpZWxlcltpXS0+UXVlcnlQcm9wKFBfTEVWRUwpLAorICAgICBjYXBpdGFsaXplKGdldHVpZChzcGllbGVyW2ldKSksCisgICAgIHNwaWVsZXJbaV0tPlF1ZXJ5UHJvcChQX1hQKSwKKyAgICAgc3BpZWxlcltpXS0+UXVlcnlQcm9wKFBfUVApLAorICAgICBzcGllbGVyW2ldLT5RdWVyeUF0dHJpYnV0ZShBX0lOVCksCisgICAgIHNwaWVsZXJbaV0tPlF1ZXJ5QXR0cmlidXRlKEFfU1RSKSwKKyAgICAgc3BpZWxlcltpXS0+UXVlcnlBdHRyaWJ1dGUoQV9ERVgpLAorICAgICBzcGllbGVyW2ldLT5RdWVyeUF0dHJpYnV0ZShBX0NPTiksCisgICAgIHNwaWVsZXJbaV0tPlF1ZXJ5UHJvcChQX1RPVEFMX1dDKSwKKyAgICAgc3BpZWxlcltpXS0+UXVlcnlQcm9wKFBfVE9UQUxfQUMpLAorICAgICAoc2l6ZW9mKGhhbmRzPSgoaW50ICopc3BpZWxlcltpXS0+UXVlcnlQcm9wKFBfSEFORFMpKSk/aGFuZHNbMV06MCksCisgICAgIHNwaWVsZXJbaV0tPlF1ZXJ5UHJvcChQX0hQKSwKKyAgICAgc3BpZWxlcltpXS0+UXVlcnlQcm9wKFBfTUFYX0hQKSk7CisgIE1vcmUocmVzKTsKKyAgcmV0dXJuIDE7Cit9CisKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIyMjIyMjIyMjCisvLyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyBaV0lOR0UgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyMjIyMjIyMjIworCitzdGF0aWMgaW50IF96d2luZ2Uoc3RyaW5nIHN0cikKK3sKKyAgb2JqZWN0IGxpdmluZzsKKyAgc3RyaW5nIHdoYXQsIHJlc3Q7CisgIHN0cmluZyBsaXZpbmdfbmFtZTsKKworICBzdHIgPSBfdW5wYXJzZWRfYXJncygpOworICBpZighc3RyfHwgc3NjYW5mKCBzdHIsICIlcyAlcyIsIGxpdmluZ19uYW1lLCB3aGF0ICkgIT0gMiApCisgICAgcmV0dXJuIF9ub3RpZnlfZmFpbCgiWndpbmdlIFdFTiB6dSBXQVM/XG4iKSwwOworICBpZiggc3NjYW5mKCB3aGF0LCAienUgJXMiLCByZXN0ICkgPT0gMSApIHdoYXQgPSByZXN0OworICBpZiAoIShsaXZpbmcgPSBmaW5kX2xpdmluZyhsaXZpbmdfbmFtZSkpKQorICAgIHJldHVybiBwcmludGYgKCJFaW4gTGViZXdlc2VuIG5hbWVucyAnJXMnIGtvbm50ZSBuaWNodCBnZWZ1bmRlbiB3ZXJkZW4hXG4iLAorICAgICAgICAgICAgICAgICAgIGNhcGl0YWxpemUobGl2aW5nX25hbWUpKSwxOworICBpZiAobGl2aW5nLT5jb21tYW5kX21lKHdoYXQpKQorICB7CisgICAgcHJpbnRmKCJEdSB6d2luZ3N0ICVzIHp1IFwiJXNcIi5cbiIsY2FwaXRhbGl6ZShsaXZpbmdfbmFtZSksd2hhdCk7CisgICAgaWYgKCFJU19BUkNIKHRoaXNfb2JqZWN0KCkpJiZnZXR1aWQoKSE9KHN0cmluZylsaXZpbmctPlF1ZXJ5UHJvcChQX1RFU1RQTEFZRVIpKQorICAgICAgbG9nX2ZpbGUoU0hFTExMT0coIlpXSU5HRSIpLAorICAgICAgICAgICAgICAgc3ByaW50ZigiJXMgendpbmd0ICVzICglcykgenUgJXMgWyVzXVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgY2FwaXRhbGl6ZShnZXR1aWQoKSksbGl2aW5nLT5OYW1lKCksY2FwaXRhbGl6ZShnZXR1aWQobGl2aW5nKSksCisgICAgICAgICAgICAgICAgICAgICAgIHdoYXQsZHRpbWUodGltZSgpKSkpOworICB9CisgIGVsc2UKKyAgICB3cml0ZSgiSGF0IGxlaWRlciBuaWNodCBnZWtsYXBwdCFcbiIpOworICByZXR1cm4gMTsKK30KKworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIyMjIyMjIyMKKy8vIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyBIRUlMRSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyMjIyMjIyMjCisKK3N0YXRpYyBpbnQgX2hlaWxlKHN0cmluZyBuYW1lKQoreworICBvYmplY3Qgb2I7CisgIGludCBscHYsIG1wdjsKKworICBpZiAoIW5hbWUpIHJldHVybiBVU0FHRSgiaGVpbGUgPG5hbWU+Iik7CisgIG5hbWUgPSBsb3dlcl9jYXNlKG5hbWUpOworICBpZiAoKCEob2IgPSBwcmVzZW50KG5hbWUsZW52aXJvbm1lbnQoKSkpKQorICAgICAgfHwhbGl2aW5nKG9iKSkKKyAgICBvYiA9IGZpbmRfbGl2aW5nKG5hbWUpOworICBpZiAoIW9iKQorICB7CisgICAgcHJpbnRmKCInJXMnIGlzdCBtb21lbnRhbiBuaWNodCBkYS5cbiIsY2FwaXRhbGl6ZShuYW1lKSk7CisgICAgcmV0dXJuIDE7CisgIH0KKyAgbHB2ID0gKGludClvYi0+UXVlcnlQcm9wKFBfSFApOworICBtcHYgPSAoaW50KW9iLT5RdWVyeVByb3AoUF9TUCk7CisgIG9iLT5oZWFsX3NlbGYoMTAwMDAwMCk7CisgIGlmICghSVNfTEVBUk5FUihvYikgJiYgKCFvYi0+UXVlcnlQcm9wKFBfVEVTVFBMQVlFUil8fAorICAgICAgICAgICgoKHN0cmluZylvYi0+UXVlcnlQcm9wKFBfVEVTVFBMQVlFUikpWzw1Li48MV09PSJHaWxkZSIpKSkKKyAgICBsb2dfZmlsZShTSEVMTExPRygiSEVBTCIpLAorICAgICAgIHNwcmludGYoIiVzIGhlaWx0ICVzICglcykgJXMgKExQOiAlZCAtPiAlZCwgTVA6ICVkIC0+ICVkKVxuIiwKKyAgICAgICAgIGNhcGl0YWxpemUoZ2V0ZXVpZCh0aGlzX3BsYXllcigpKSksCisgICAgICAgICBjYWxsX290aGVyKG9iLCJuYW1lIiksIGNhcGl0YWxpemUoZ2V0ZXVpZChvYikpLAorICAgICAgICAgZHRpbWUodGltZSgpKSwgbHB2LCAoaW50KW9iLT5RdWVyeVByb3AoUF9IUCksCisgICAgICAgICAgICAgICBtcHYsKGludClvYi0+UXVlcnlQcm9wKFBfU1ApKSk7CisgIHRlbGxfb2JqZWN0KG9iLCBRdWVyeVByb3AoUF9OQU1FKSArICIgaGVpbHQgRGljaC5cbiIpOworICBwcmludGYoIkR1IGhlaWxzdCAlcy5cbiIsY2FwaXRhbGl6ZShuYW1lKSk7CisgIHJldHVybiAxOworfQorCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyMjIyMjIyMjIworLy8jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgUEVPUExFICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICMjIyMjIyMjIyMKKworcHJpdmF0ZSBzdHJpbmcgX3Blb3BsZV9maWxlbmFtZShvYmplY3Qgb2JqKQoreworICBzdHJpbmcgc3RyOworICBzdHI9b2JqZWN0X25hbWUoZW52aXJvbm1lbnQob2JqKSk7CisgIGlmICghc3RyKSByZXR1cm4gMDsKKyAgaWYgKHN0clswLi4yXSA9PSAiL2QvIikgcmV0dXJuIHNwcmludGYoIislcyIsc3RyWzMuLjwxXSk7CisgIGlmIChzdHJbMC4uOF0gPT0gIi9wbGF5ZXJzLyIpIHJldHVybiBzcHJpbnRmKCJ+JXMiLHN0cls5Li48MV0pOworICByZXR1cm4gc3RyOworfQorCitzdGF0aWMgaW50IF9wZW9wbGUoKQoreworICBtaXhlZCAqbGlzdCwgcmVzOworICBpbnQgaSxqLCBhOworICBzdHJpbmcgYV9hZ2UsYV9pcG51bSxhX25hbWUsYV9sZXZlbCxhX2lkbGUsYV9yb29tLGFfZW5kLCBhX3RpdGxlOworCisgIHN3aXRjaChRdWVyeVByb3AoInR0eSIpKQorICB7CisgICAgY2FzZSAidnQxMDAiOgorICAgICAgYV9pcG51bSA9ICIiOyBhX25hbWUgPSBBTlNJX0JPTEQ7CisgICAgICBhX2xldmVsID0gQU5TSV9OT1JNQUw7IGFfaWRsZSA9IEFOU0lfQkxJTks7CisgICAgICBhX3Jvb20gPSBBTlNJX05PUk1BTDsgYV9lbmQgPSBBTlNJX05PUk1BTDsKKyAgICAgIGFfdGl0bGUgPSBBTlNJX0lOVkVSUzsgYV9hZ2UgPSBBTlNJX05PUk1BTDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgImFuc2kiOgorICAgICAgYV9pcG51bSA9IEFOU0lfQkxVRTsgYV9uYW1lID0gQU5TSV9CT0xEOworICAgICAgYV9sZXZlbCA9IEFOU0lfUkVEOyBhX2lkbGUgPSBBTlNJX0JMQUNLK0FOU0lfQk9MRDsKKyAgICAgIGFfcm9vbSA9IEFOU0lfQk9MRCtBTlNJX0JMVUU7IGFfZW5kID0gQU5TSV9OT1JNQUw7CisgICAgICBhX3RpdGxlID0gQU5TSV9JTlZFUlM7IGFfYWdlID0gQU5TSV9QVVJQTEU7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgYV90aXRsZSA9IGFfaXBudW0gPSBhX25hbWUgPSBhX2xldmVsID0gYV9pZGxlID0gYV9yb29tID0gYV9lbmQgPSAiIjsKKyAgICAgIGFfYWdlID0gIiI7CisgIH0KKyAgbGlzdCA9IHNvcnRfYXJyYXkodXNlcnMoKSwgZnVuY3Rpb24gaW50IChvYmplY3QgYSwgb2JqZWN0IGIpIHsKKyAgICAgIHJldHVybiBxdWVyeV9pcF9udW1iZXIoYSk+cXVlcnlfaXBfbnVtYmVyKGIpO30gKTsgCisKKyAgaj1zaXplb2YobGlzdCk7CisgIGE9MDtyZXM9IiI7CisgIGZvcihpPTA7IGk8c2l6ZW9mKGxpc3QpOyBpKyspIHsKKyAgICBzdHJpbmcgbmFtZV87IAorICAgIG5hbWVfID0gY2FwaXRhbGl6ZShsaXN0W2ldLT5xdWVyeV9yZWFsX25hbWUoKXx8Ijxsb2dvbj4iKTsKKyAgICByZXMgKz0gc3ByaW50ZiggIiVzJS0xNXMlcyAlcyUtMTNzJXMgJXMlM2QlcyAlcyAlcyAlcyVzJXMlcyAlcyVzXG4iLAorICAgICAgICAgICAgICAgICAgICBhX2lwbnVtLCBxdWVyeV9pcF9udW1iZXIobGlzdFtpXSksYV9lbmQsYV9uYW1lLAorICAgICAgICAgICAgICAgICAgICAobGlzdFtpXS0+UXVlcnlQcm9wKFBfSU5WSVMpPyIoIituYW1lXysiKSI6bmFtZV8pLAorICAgICAgICAgICAgICAgICAgICBhX2VuZCxhX2xldmVsLCBNQVNURVItPmdldF93aXpfbGV2ZWwoZ2V0dWlkKGxpc3RbaV0pKSwKKyAgICAgICAgICAgICAgICAgICAgYV9lbmQsYV9hZ2UsCisgICAgICAgICAgICAgICAgICAgIHRpbWUyc3RyaW5nKCIlNHggJTBYIiwoKGludClsaXN0W2ldLT5RdWVyeVByb3AoUF9BR0UpKSoyKSwKKyAgICAgICAgICAgICAgICAgICAgcXVlcnlfaWRsZShsaXN0W2ldKT49MzAwPyhhKyssKGFfaWRsZSsiSSIpKToiICIsCisgICAgICAgICAgICAgICAgICAgIGFfZW5kLAorICAgICAgICAgICAgICAgICAgICBxdWVyeV9lZGl0aW5nKGxpc3RbaV0pP2FfaWRsZSsiRSIrYV9lbmQ6IiAiLAorICAgICAgICAgICAgICAgICAgICBxdWVyeV9pbnB1dF9wZW5kaW5nKGxpc3RbaV0pP2FfaWRsZSsiTSIrYV9lbmQ6IiAiLAorICAgICAgICAgICAgICAgICAgICBlbnZpcm9ubWVudChsaXN0W2ldKT9hX3Jvb20rX3Blb3BsZV9maWxlbmFtZShsaXN0W2ldKToiIiwKKyAgICAgICAgICAgICAgICAgICAgYV9lbmQpOworICB9CisgIGlmIChhKQorICAgIHJlcyA9IHNwcmludGYoIiVzJWQgU3BpZWxlciBhbndlc2VuZCAoJWQgYWt0aXYpLiAlcyVzXG4iLGFfdGl0bGUsaiwKKyAgICAgICAgICAgICAgICAgIChqLWEpLHF1ZXJ5X2xvYWRfYXZlcmFnZSgpLGFfZW5kKStyZXM7CisgIGVsc2UKKyAgICByZXMgPSBzcHJpbnRmKCIlcyVkIFNwaWVsZXIgYW53ZXNlbmQuICVzJXNcbiIsYV90aXRsZSxqLAorICAgICAgICAgICAgICAgICAgcXVlcnlfbG9hZF9hdmVyYWdlKCksYV9lbmQpK3JlczsKKyAgTW9yZShyZXMpOworCisgIHJldHVybiAxOworfQorCisKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIyMjIyMjIyMjIworLy8jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgU1BJRUxFUiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIyMjIyMjIyMjIworCitwcml2YXRlIHN0cmluZyBfc3BpZWxlcl90aW1lMnN0cmluZyhpbnQgdGltZSkKK3sKKyAgc3RyaW5nIHJldDsKKworICByZXQ9IiI7CisgIGlmICh0aW1lPj04NjQwMCkKKyAgeworICAgIHJldCs9dGltZS84NjQwMCsiZCAiOworICAgIHRpbWUlPTg2NDAwOworICB9CisgIGlmKHRpbWU8MzYwMDApIHJldCs9IjAiOworICByZXQrPXRpbWUvMzYwMCsiOiI7CisgIHRpbWUlPTM2MDA7CisgIGlmKHRpbWU8NjAwKSByZXQrPSIwIjsKKyAgcmV0Kz10aW1lLzYwKyI6IjsKKyAgdGltZSU9NjA7CisgIGlmKHRpbWU8MTApIHJldCs9IjAiOworICByZXQrPXRpbWUrIiI7CisgIHJldHVybiByZXQ7Cit9CisKKworc3RhdGljIGludCBfc3BpZWxlcihzdHJpbmcgYXJnKQoreworICBzdHJpbmcgZHVtbXksaXA7CisgIG9iamVjdCAqc3BpZWxlcixwbDsKKyAgaW50IGk7CisgIAorICBhcmc9X3VucGFyc2VkX2FyZ3MoKTsKKyAgaWYoIXNpemVvZihhcmcpIHx8IHNzY2FuZihhcmcsImF1cyBpcCAlcyIsZHVtbXkpIT0xKQorICAgIHJldHVybiBVU0FHRSgic3BpZWxlciBhdXMgaXAgW3ZvbiA8c3BpZWxlcj58PGlwPl0iKTsKKyAgYXJnPWR1bW15OworICBpZiAoc3NjYW5mKGFyZywidm9uICVzIixkdW1teSk9PTEpCisgIHsKKyAgICBkdW1teT1sb3dlcl9jYXNlKGR1bW15KTsKKyAgICBpZiAoIShwbD1maW5kX3BsYXllcihkdW1teSkpKQorICAgICAgcmV0dXJuIG5vdGlmeV9mYWlsKHNwcmludGYoIlNwaWVsZXIgJyVzJyBrb25udGUgbmljaHQgZ2VmdW5kZW4gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIndlcmRlbi5cbiIsY2FwaXRhbGl6ZShkdW1teSkpKSwwOworICAgIGlwPXF1ZXJ5X2lwX251bWJlcihwbCk7CisgIH0KKyAgZWxzZSBpcD1hcmc7CisgIGlwPWltcGxvZGUoKGV4cGxvZGUoaXAsIi4iKS0oeyIifSkrKHsiKiIsIioiLCIqIiwiKiJ9KSlbMC4uM10sIi4iKTsKK2lmIChjYXRjaCgKKyAgc3BpZWxlcj1maWx0ZXIodXNlcnMoKSwKKyAgICAoOiByZXR1cm4gc2l6ZW9mKHJlZ2V4cCgoe3F1ZXJ5X2lwX251bWJlcigkMSl9KSwkMikpOyA6KSwiXiIrZ2xvYjJyZWdleHAoaXApKyIkIikKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApKQorICByZXR1cm4gcHJpbnRmKCJJbiBkZXIgSVAgZHVlcmZlbiBudXIgWmFobGVuKDAtMjU1KSwgUHVua3RlICguKSB1bmQgIgorICAgICAgICAgICAgICAgICJTdGVybmUgKCopIHZvcmtvbW1lbi5cbiIpLDE7CisgIGlmICghc2l6ZW9mKHNwaWVsZXIpKQorICAgIHJldHVybiBwcmludGYoIkVzIGtvbm50ZSBrZWluIFNwaWVsZXIgbWl0IGRlciBJUCAnJXMnIGdlZnVuZGVuICIKKyAgICAgICAgICAgICAgICAgICJ3ZXJkZW4uXG4iLGlwKSwxOworICBhcmc9c3ByaW50ZigiXG5Gb2xnZW5kZSBTcGllbGVyIGhhYmVuIGRpZSBJUCAlczpcbiIKKyAgICAgICAiPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSIKKyAgICAgICAgICAgICAgIj09PT09PT09PT09XG4iCisgICAgICAgIk5hbWU6ICAgICAgIFp3ZWl0aWUgdm9uOiAgICAgIEVpbmdlbG9nZ3Q6ICAgICAgICAgICAgICAgICAgIgorICAgICAgICAgICAgICAiSWRsZSBzZWl0OlxuIgorICAgICAgICItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIgorICAgICAgICAgICAgICAiLS0tLS0tLS0tLS1cbiIsaXApOworICBpPXNpemVvZihzcGllbGVyKTsKKyAgd2hpbGUoaS0tKQorICB7CisgICAgYXJnKz1zcHJpbnRmKCIlLTExcyAlLTE3cyAlMjZzICAlLTE1c1xuIiwKKyAgICAgICAgICAgICAgICAgY2FwaXRhbGl6ZShnZXR1aWQoc3BpZWxlcltpXSkpLAorICAgICAgICAgICAgICAgICAoKGR1bW15PShzdHJpbmcpc3BpZWxlcltpXS0+UXVlcnlQcm9wKFBfU0VDT05EKSk/CisgICAgICAgICAgICAgICAgICAoc2l6ZW9mKChtaXhlZCAqKWNhbGxfb3RoZXIobWFzdGVyKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImdldF91c2VyaW5mbyIsZHVtbXkpKT8KKyAgICAgICAgICAgICAgICAgICBjYXBpdGFsaXplKGR1bW15KToiKnVuZ3VlbHRpZyoiKToiIiksCisgICAgICAgICAgICAgICAgIGR0aW1lKHNwaWVsZXJbaV0tPlF1ZXJ5UHJvcChQX0xBU1RfTE9HSU4pKSwKKyAgICAgICAgICAgICAgICAgX3NwaWVsZXJfdGltZTJzdHJpbmcocXVlcnlfaWRsZShzcGllbGVyW2ldKSkpOworICB9CisgIGFyZys9Ij09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSIKKyAgICAiPT09PT09PT09PT09XG5cbiI7CisgIE1vcmUoYXJnKTsKKyAgcmV0dXJuIDE7Cit9CmRpZmYgLS1naXQgYS9zdGQvc2hlbGxzL21hZ2llci90b2RvLmMgYi9zdGQvc2hlbGxzL21hZ2llci90b2RvLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjQxMjBlNwotLS0gL2Rldi9udWxsCisrKyBiL3N0ZC9zaGVsbHMvbWFnaWVyL3RvZG8uYwpAQCAtMCwwICsxLDIyMiBAQAorLy8gJElkOiB0b2RvLmMgOTE0MiAyMDE1LTAyLTA0IDIyOjE3OjI5WiBaZXNzdHJhICQKKyNwcmFnbWEgc3RyaWN0X3R5cGVzCisjcHJhZ21hIHNhdmVfdHlwZXMKKyNwcmFnbWEgcmFuZ2VfY2hlY2sKKyNwcmFnbWEgbm9fY2xvbmUKKyNwcmFnbWEgcGVkYW50aWMKKworI2luY2x1ZGUgPHdpemxldmVscy5oPgorI2luY2x1ZGUgPGRlZmluZXMuaD4KKyNkZWZpbmUgTkVFRF9QUk9UT1RZUEVTCisjaW5jbHVkZSA8bWFnaWVyLmg+CisjaW5jbHVkZSA8cGxheWVyLmg+CisKKyNkZWZpbmUgU0FWRUZJTEVOQU1FIHNwcmludGYoIi9wbGF5ZXJzLyVzLy50b2RvbGlzdGUiLGdldHVpZCgpKQorCitwcml2YXRlIG5vc2F2ZSBzdGF0dXMgdG9kb19pbml0aWFsaXplZDsKK3ByaXZhdGUgbm9zYXZlIG1peGVkICp0b2RvX2RhdGE7CittaXhlZCAqdG9kb19kYXRhX3B1YmxpYzsKK3N0YXRpYyBtaXhlZCBfcXVlcnlfbG9jYWxjbWRzKCkKK3sKKyAgcmV0dXJuICh7CisgICAgKHsidG9kbyIsIl90b2RvIiwwLFdJWkFSRF9MVkx9KX0pOworfQorCitwcml2YXRlIHZvaWQgdG9kb19zYXZlKCkKK3sKKworICBpbnQgaSxqOworICBzdHJpbmcgYSxiOworICBhPVNBVkVGSUxFTkFNRSsiLm8iOworICBybShhKTsKKyAgaWYgKGo9c2l6ZW9mKHRvZG9fZGF0YSkpCisgIHsKKyNpZiAhX19FRlVOX0RFRklORURfXyhzYXZlX3ZhbHVlKSAgIAorICAgIHdyaXRlX2ZpbGUoYSwiIzA6MFxudG9kb19kYXRhX3B1YmxpYyAoeyIpOworICAgIGZvciAoaT0wO2k8ajtpKyspCisgICAgeworICAgICAgYj1yZWdyZXBsYWNlKHRvZG9fZGF0YVtpXVsxXSwiXCIiLCJcXFwiIiwxKTsKKyAgICAgIGI9cmVncmVwbGFjZShiLCJcbiIsIlxcbiIsMSk7CisgICAgICB3cml0ZV9maWxlKGEsc3ByaW50ZigiKHslZCxcIiVzXCIsfSksIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvZG9fZGF0YVtpXVswXSxiKSk7CisgICAgfQorICAgIHdyaXRlX2ZpbGUoYSwifSlcbiIpOworI2Vsc2UKKyAgICB0b2RvX2RhdGFfcHVibGljPXRvZG9fZGF0YTsKKyAgICB3cml0ZV9maWxlKGEsc2F2ZV92YWx1ZSh0b2RvX2RhdGFfcHVibGljKSk7CisgICAgdG9kb19kYXRhX3B1YmxpYz0wOworI2VuZGlmCisgIH0KKyAgcmV0dXJuOworCit9CisKK3N0YXRpYyB2b2lkIGluaXRpYWxpemUoKQoreworICBpZighSVNfV0laQVJEKHRoaXNfb2JqZWN0KCkpKSByZXR1cm47CisgIGlmICghcmVzdG9yZV9vYmplY3QoU0FWRUZJTEVOQU1FKSkgdG9kb19kYXRhPSh7fSk7CisgIGVsc2UKKyAgICB7CisgICAgICB0b2RvX2RhdGE9dG9kb19kYXRhX3B1YmxpYzsKKyAgICAgIHRvZG9fZGF0YV9wdWJsaWM9MDsKKyAgICB9CisgIHJldHVybjsKK30KKworc3RhdGljIHZvaWQgX3RvZG9fbmV1MihzdHJpbmcgaW5wdXQsc3RyaW5nIGNhcnJ5KQoreworICBpZiAoaW5wdXQ9PSJxInx8KGlucHV0PT0iLiImJiFzaXplb2YoY2FycnkpKSkKKyAgeworICAgIHByaW50ZigiQWJicnVjaCEiKTsKKyAgICByZXR1cm47CisgIH0KKyAgaWYgKGlucHV0IT0iLiIpCisgIHsKKyAgICBwcmludGYoIl0iKTsKKyAgICBpbnB1dF90bygiX3RvZG9fbmV1MiIsMCxjYXJyeStpbnB1dCsiXG4iKTsKKyAgICByZXR1cm47CisgIH0KKyAgdG9kb19kYXRhKz0oeyAoeyB0aW1lKCksIGNhcnJ5IH0pIH0pOworICB0b2RvX3NhdmUoKTsKKyAgcHJpbnRmKCJFaW50cmFnIGFuZ2VsZWd0LiBMYXVmZW5kZSBOdW1tZXIgaXN0ICVkLlxuIixzaXplb2YodG9kb19kYXRhKSk7CisgIHJldHVybjsKK30KKworcHJpdmF0ZSBpbnQgX3RvZG9fbmV1KHN0cmluZyBjbWRsaW5lKQoreworICBpZiAoY21kbGluZSE9Im5ldSIpIHJldHVybiAwOworICBwcmludGYoIldhcyBtdXNzdCBEdSBub2NoIG1hY2hlbj8gKEFiYnJ1Y2ggbWl0ICdxJywgIgorICAgICAgICAgIkVuZGUgbWl0ICcuJylcbl0iKTsKKyAgaW5wdXRfdG8oIl90b2RvX25ldTIiLDAsIiIpOworICByZXR1cm4gMTsKK30KKworcHJpdmF0ZSBpbnQgX3RvZG9fbG9lc2NoZW4oc3RyaW5nIGNtZGxpbmUpCit7CisgIGludCBucjsKKyAgaWYgKCFzc2NhbmYoY21kbGluZSwibG9lc2NoZW4gJWQiLG5yKSkKKyAgICByZXR1cm4gbm90aWZ5X2ZhaWwoIldlbGNoZW4gRWludHJhZyBtb2VjaHRlc3QgRHUgbG9lc2NoZW4/XG4iKSwwOworICBpZiAoIXNpemVvZih0b2RvX2RhdGEpKQorICAgIHJldHVybiBub3RpZnlfZmFpbCgiRGVpbmUgVG9kby1MaXN0ZSBoYXQgamEgdWViZXJoYXVwdCBrZWluZW4gIgorICAgICAgICAgICAgICAgICAgICAgICAiRWludHJhZyFcbiIpLDA7CisgIGlmIChucj5zaXplb2YodG9kb19kYXRhKSkKKyAgeworICAgIHByaW50ZigiRGVpbmUgVG9kby1MaXN0ZSBoYXQgbnVyICVkIEVpbnRyYSVzLlxuIixzaXplb2YodG9kb19kYXRhKSwKKyAgICAgICAgICAgKHNpemVvZih0b2RvX2RhdGEpPT0xPyJnIjoiZWdlIikpOworICAgIHJldHVybiAxOworICB9CisgIHRvZG9fZGF0YVtuci0xXT0wOworICB0b2RvX2RhdGEtPSh7MH0pOworICB0b2RvX3NhdmUoKTsKKyAgcHJpbnRmKCJFaW50cmFnIE51bW1lciAlZCB3dXJkZSBnZWxvZXNjaHQuIERhIGhhc3QgRHUgamEgb3JkZW50bGljaCAiCisgICAgICAgICAid2FzIGdlc2NoYWZmdC4uLlxub2RlciBnZXNjaGlja3QgZGVsZWdpZXJ0IDstKVxuIixucik7CisgIHJldHVybiAxOworfQorCitwcml2YXRlIGludCBfdG9kb19hbnplaWdlbihzdHJpbmcgY21kbGluZSkKK3sKKyAgaW50IG5yMSxucjI7CisgIHN0cmluZyBvdXRwdXQ7CisgIGlmICghc2l6ZW9mKHRvZG9fZGF0YSkpCisgICAgcmV0dXJuIG5vdGlmeV9mYWlsKCJEZWluZSBUb2RvLUxpc3RlIGhhdCBrZWluZSBFaW50cmFlZ2UuXG4iKSwwOworICBzd2l0Y2goc3NjYW5mKGNtZGxpbmUsImFuemVpZ2VuICVkIGJpcyAlZCIsbnIxLG5yMikpIAorICB7CisgIGNhc2UgMDogbnIxPTE7IG5yMj1zaXplb2YodG9kb19kYXRhKTsgYnJlYWs7CisgIGNhc2UgMTogbnIyPW5yMTsgYnJlYWs7CisgIGNhc2UgMjogYnJlYWs7CisgIH0KKyAgaWYgKG5yMTwwKSBucjE9c2l6ZW9mKHRvZG9fZGF0YSkrbnIxKzE7CisgIGlmIChucjI8MCkgbnIyPXNpemVvZih0b2RvX2RhdGEpK25yMisxOworICBpZiAobnIxPDF8fG5yMjwxfHxucjE+c2l6ZW9mKHRvZG9fZGF0YSl8fG5yMj5zaXplb2YodG9kb19kYXRhKSkKKyAgICByZXR1cm4gbm90aWZ5X2ZhaWwoc3ByaW50ZigiRGVpbmUgVG9kby1MaXN0ZSBoYXQgKGdsdWVja2xpY2hlcndlaXNlKSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm51ciAlZCBFaW50cmElcy5cbiIsc2l6ZW9mKHRvZG9fZGF0YSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHNpemVvZih0b2RvX2RhdGEpPjE/ImVnZSI6ImciKSkpLDA7CisgIG91dHB1dD0iXG4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIjsKKyAgaWYgKG5yMT5ucjIpIC8vIFJ1ZWNrd2FlcnRzCisgIHsKKyAgICB3aGlsZShucjE+PW5yMikKKyAgICAgIG91dHB1dCs9c3ByaW50ZigiRWludHJhZyBOci4gJWQgdm9uICVzOlxuJXNcblxuIixucjEtLSwKKyAgICAgICAgICAgZHRpbWUodG9kb19kYXRhW25yMV1bMF0pLGJyZWFrX3N0cmluZyh0b2RvX2RhdGFbbnIxXVsxXSw3OCw1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlNfTEVBVkVfTVlfTEZTKSk7CisgIH0KKyAgZWxzZQorICB7CisgICAgbnIxLS07CisgICAgd2hpbGUgKG5yMTxucjIpCisgICAgICBvdXRwdXQrPXNwcmludGYoIlxuRWludHJhZyBOci4gJWQgdm9uICVzOlxuJXNcbiIsKG5yMSsxKSwKKyAgICAgICAgICAgZHRpbWUodG9kb19kYXRhW25yMV1bMF0pLGJyZWFrX3N0cmluZyh0b2RvX2RhdGFbbnIxKytdWzFdLDc4LDUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCU19MRUFWRV9NWV9MRlMpKTsKKyAgfQorICBNb3JlKG91dHB1dCsiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIpOworICByZXR1cm4gMTsKK30KKworcHJpdmF0ZSBpbnQgX3RvZG9fdmVyc2NoaWViZW4oc3RyaW5nIGNtZGxpbmUpCit7CisgIGludCBmcm9tOworICBtaXhlZCB0byxkdW1teTsKKyAgaWYgKCEoc3NjYW5mKGNtZGxpbmUsInZlcnNjaGllYmVuICVkIG5hY2ggJWQiLGZyb20sdG8pPT0yfHwKKyAgICAgICAgc3NjYW5mKGNtZGxpbmUsInZlcnNjaGllYmVuICVkIG5hY2ggJXMiLGZyb20sdG8pPT0yKSkKKyAgICByZXR1cm4gMDsKKyAgZnJvbS0tOworICBpZiAoc3RyaW5ncCh0bykpCisgIHsKKyAgICBzd2l0Y2godG8pCisgICAgeworICAgICAgY2FzZSAib2JlbiI6IHRvPWZyb20tMTsgYnJlYWs7CisgICAgICBjYXNlICJ1bnRlbiI6IHRvPWZyb20rMTsgYnJlYWs7CisgICAgICBkZWZhdWx0OiByZXR1cm4gMDsKKyAgICB9CisgIH0KKyAgZWxzZSB0by0tOworICBpZiAodG89PWZyb20pIHJldHVybiBub3RpZnlfZmFpbCgiRGEgaXN0IGRlciBFaW50cmFnIGphIHNjaG9uIVxuIiksMDsKKyAgaWYgKGZyb208MHx8ZnJvbT49c2l6ZW9mKHRvZG9fZGF0YSkpIHJldHVybiBub3RpZnlfZmFpbCgKKyAgICAgICAgIldpZSB3aWxsc3QgRHUgZWluZW4gbmljaHQgZXhpc3RlbnRlbiBFaW50cmFnIHZlcnNjaGllYmVuP1xuIiksMDsKKyAgaWYgKHRvPDB8fHRvPj1zaXplb2YodG9kb19kYXRhKSkgcmV0dXJuIG5vdGlmeV9mYWlsKAorICAgICAgICAiRGFoaW4ga2FubnN0IER1IGRlbiBFaW50cmFnIG5pY2h0IHZlcnNjaGllYmVuLlxuIiksMDsKKyAgZHVtbXk9dG9kb19kYXRhW2Zyb21dOworICBpZiAodG8+ZnJvbSkKKyAgICB3aGlsZSAoZnJvbSsrPHRvKSB0b2RvX2RhdGFbZnJvbS0xXT10b2RvX2RhdGFbZnJvbV07CisgIGVsc2UKKyAgICB3aGlsZShmcm9tLS0+dG8pIHRvZG9fZGF0YVtmcm9tKzFdPXRvZG9fZGF0YVtmcm9tXTsKKyAgdG9kb19kYXRhW3RvXT1kdW1teTsKKyAgcHJpbnRmKCJFaW50cmFnIHd1cmRlIHZlcnNjaG9iZW4uXG4iKTsKKyAgcmV0dXJuIDE7Cit9CisKK3ByaXZhdGUgaW50IF90b2RvX2hpbGZlKCkKK3sKKyAgcHJpbnRmKAorICAiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4iCisgICIgRGllIFRvZG8tTGlzdGUgbGFlc3N0IHNpY2ggbWl0IGRlbiBmb2xnZW5kZW4gQmVmZWhsZW4gc3RldWVybjpcblxuIgorICAiIHRvZG8gbmV1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIExlZ3QgZWluZW4gbmV1ZW4gRWludHJhZyBhbi5cbiIKKyAgIiB0b2RvIGxvZXNjaGVuIDxudW1tZXI+ICAgICAgICAgICAgICAgICAgLSBMb2VzY2h0IGVpbmVuIEVpbnRyYWcuXG4iCisgICIgdG9kbyBhbnplaWdlbiBbPG51bW1lcj4gW2JpcyA8bnVtbWVyPl1dIC0gWmVpZ3QgZGllIFRvZG8tTGlzdGUgYW4uXG4iCisgICIgdG9kbyB2ZXJzY2hpZWJlbiA8bnVtbWVyPiBuYWNoIDx6aWVsPiAgIC0gVmVyc2NoaWVidCBlaW5lbiBFaW50cmFnLlxuXG4iCisgICIgPHppZWw+IGthbm4gZWluZSBaYWhsIG9kZXIgZGllIFdvcnRlICdvYmVuJyBvZGVyICd1bnRlbicgc2Vpbi5cbiIKKyAgIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIpOworICByZXR1cm4gMTsKK30KKworCitzdGF0aWMgaW50IF90b2RvKHN0cmluZyBjbWRsaW5lKQoreworICBzdHJpbmcgKmFyZ3M7CisgIAorICBjbWRsaW5lPV91bnBhcnNlZF9hcmdzKDEpOworICBub3RpZnlfZmFpbCgiRmFsc2NoZSBTeW50YXguICd0b2RvIGhpbGZlJyB6ZWlndCBlaW5lIEhpbGZlIGFuLlxuIik7CisgIGlmIChzaXplb2YoY21kbGluZSkpCisgIHsKKyAgICBhcmdzPWV4cGxvZGUoY21kbGluZSwiICIpOworICAgIHN3aXRjaChhcmdzWzBdKQorICAgIHsKKyAgICAgIGNhc2UgIm5ldSI6ICAgICAgICAgcmV0dXJuIF90b2RvX25ldShjbWRsaW5lKTsKKyAgICAgIGNhc2UgImxvZXNjaGVuIjogICAgcmV0dXJuIF90b2RvX2xvZXNjaGVuKGNtZGxpbmUpOworICAgICAgY2FzZSAiYW56ZWlnZW4iOiAgICByZXR1cm4gX3RvZG9fYW56ZWlnZW4oY21kbGluZSk7CisgICAgICBjYXNlICJ2ZXJzY2hpZWJlbiI6IHJldHVybiBfdG9kb192ZXJzY2hpZWJlbihjbWRsaW5lKTsKKyAgICAgIGNhc2UgImhpbGZlIjogICAgICAgcmV0dXJuIF90b2RvX2hpbGZlKCk7CisgICAgIGRlZmF1bHQ6ICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICB9CisgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvc3RkL3NoZWxscy9tYWdpZXIvdXBkLmMgYi9zdGQvc2hlbGxzL21hZ2llci91cGQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMDllYTlhCi0tLSAvZGV2L251bGwKKysrIGIvc3RkL3NoZWxscy9tYWdpZXIvdXBkLmMKQEAgLTAsMCArMSw1NjMgQEAKKy8vIE1vcmdlbkdyYXVlbiBNVURsaWIKKy8vCisvLyB1cGQuYworLy8KKy8vICRJZDogdXBkLmMgODg1MCAyMDE0LTA2LTEzIDIxOjM0OjQ0WiBaZXNzdHJhICQKKyNwcmFnbWEgc3RyaWN0X3R5cGVzCisjcHJhZ21hIHNhdmVfdHlwZXMKKyNwcmFnbWEgcmFuZ2VfY2hlY2sKKyNwcmFnbWEgbm9fY2xvbmUKKyNwcmFnbWEgcGVkYW50aWMKKworI2RlZmluZSBORUVEX1BST1RPVFlQRVMKKyNpbmNsdWRlIDxtYWdpZXIuaD4KKyNpbmNsdWRlIDxwbGF5ZXIuaD4KKyN1bmRlZiBORUVEX1BST1RPVFlQRVMKKyNpbmNsdWRlIDxkZWJ1Z19pbmZvLmg+CisjaW5jbHVkZSA8d2l6bGV2ZWxzLmg+CisjaW5jbHVkZSA8bW92aW5nLmg+CisjaW5jbHVkZSA8cHJvcGVydGllcy5oPgorI2luY2x1ZGUgPGxvZ2dpbmcuaD4KKyNpbmNsdWRlIDx0aGluZy9wcm9wZXJ0aWVzLmg+CisKK3ZhcmFyZ3Mgc3RhdGljIGludCBfbWFrZShzdHJpbmcgZmlsZSwgaW50IGZsYWdzLCBpbnQgcmVjdXJzaXZlKTsKKworc3RhdGljIG1peGVkIF9xdWVyeV9sb2NhbGNtZHMoKQoreworICByZXR1cm4gKHsoeyJ1cGQiLCJfdXBkIiwwLExFQVJORVJfTFZMfSksCisgICAgICAgICAgICh7ImxvYWQiLCJfbG9hZCIsMCxMRUFSTkVSX0xWTH0pfSk7Cit9CisKKy8vCisvLyBfc2F2ZSgpOiBTcGllbGVyIGluIFJldHR1bmdzcmF1bSByZXR0ZW4KKy8vIG9iajogICAgICBTcGllbGVyb2JqZWt0KD8pCisvLyBpbnZfc2F2ZTogUmV0dHVuZ3NyYXVtbmFtZSAKKy8vIFJ1ZWNrZ2FiZTogMCB3ZW5uIGtlaW4gU3BpZWxlcm9iamVrdAorLy8gICAgICAgICAgICBTcGllbGVyb2JqZWt0LCBmYWxscyBkb2NoCisvLworCitzdGF0aWMgbWl4ZWQgX3NhdmUoIG9iamVjdCBvYmosIG9iamVjdCBpbnZfc2F2ZXIgKQoreyAKKyAgICBpZiAoIHF1ZXJ5X29uY2VfaW50ZXJhY3RpdmUob2JqKSApCisgICAgICB7IAorICAgICAgICBvYmotPm1vdmUoIGludl9zYXZlciwgTk9fQ0hFQ0sgKTsKKyAgICAgICAgcmV0dXJuIG9iajsKKyAgICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworCisvLworLy8gX3JlbG9hZCgpOiBPYmpla3QgbGFkZW4KKy8vIGZpbGU6ICBGaWxlbmFtZS4gTXVzcyBpbiBkZXIgRm9ybSAveHgveHgveHguYyB2b3JsaWVnZW4KKy8vIGNsb25lOiAgPiAwIC0+IEVzIHNvbGwgZ2VjbG9udCB3ZXJkZW4sIGVudGhhZWx0IE9iamVrdG51bW1lciBkZXMKKy8vICAgICAgICAgICAgICAgIFZvcmdhZW5nZXJvYmpla3RlcworLy8gZmxhZ3M6IEtvbW1hbmRvemVpbGVub3B0aW9uZW4KKy8vIGVycjogICBMZWVyc3RyaW5nIGFscyBSZWZlcmVueiB1ZWJlcmdlYmVuLiBFbnRoYWVsdCBuYWNoIGRlbQorLy8gICAgICAgIEF1ZnJ1ZiB2b20gX3JlbG9hZCgpIGRpZSBGZWhsZXJtZWxkdW5nZW4gYWxzIFN0cmluZy4KKy8vIFJ1ZWNrZ2FiZTogRGFzIG5ldSBlcnpldWd0ZSBPYmpla3QgYnp3LiBkYXMgc2Nob24gdm9yaGFuZGVuZSBPYmpla3QKKy8vICAgICAgICAgICAgYnp3LiAwLCB3ZW5uIEZlaGxlciBhdWZ0cmF0LgorLy8KKworcHJpdmF0ZSBvYmplY3QgX3JlbG9hZChzdHJpbmcgZmlsZSwgaW50IGNsb25lLCBpbnQgZmxhZ3MsIHN0cmluZyBlcnIpCit7CisgIG9iamVjdCBvYmo7CisgIAorICBpZiAoIW9iaj1maW5kX29iamVjdChmaWxlWzAuLjwzXSsoY2xvbmU/KCIjIitjbG9uZSk6IiIpKSkKKyAgeworICAgIGludCBwb3MscG9zMjsKKyAgICBzdHJpbmcgYnQ7CisKKyAgICBpZihmaWxlX3NpemUoZmlsZSk8MCkKKyAgICB7CisgICAgICBpZiAoZmlsZV9zaXplKGZpbGUpPT0tMSkKKyAgICAgICAgZXJyID0gc3ByaW50ZigidXBkOiAlczogRGF0ZWkgZXhpc3RpZXJ0IG5pY2h0LlxuIiwgZmlsZSk7CisgICAgICBlbHNlIC8vIGRpcmVjdG9yeQorICAgICAgICBlcnIgPSBzcHJpbnRmKCJ1cGQ6ICVzOiBWZXJ6ZWljaG5pc3NlIGtvZW5uZW4gbmljaHQgZ2VsYWRlbiAiCisgICAgICAgICAgICAgICAgICAgICAgIndlcmRlbi5cbiIsZmlsZSk7CisgICAgICByZXR1cm4gb2JqOyAvLyAwCisgICAgfQorICAgIHBvcyA9IG1heChmaWxlX3NpemUoX19ERUJVR19MT0dfXyksMCk7CisKKyAgICBpZiAoKGVyciA9IChjbG9uZT9jYXRjaChvYmogPSBjbG9uZV9vYmplY3QoZmlsZSkpOgorICAgICAgICAgICAgICAgIGNhdGNoKGxvYWRfb2JqZWN0KGZpbGUpKSApKSAmJiAoZmxhZ3MgJiBVUERfQikpICAgICAgICAKKyAgICB7ICAgICAKKyAgICAgIGlmICgoIHBvczI9ZmlsZV9zaXplKF9fREVCVUdfTE9HX18pKSA+IHBvcyApCisgICAgICAgIGVycis9c3ByaW50ZigiXG5CYWNrdHJhY2U6XG4lcyIsCisgICAgICAgICAgICAgICAgICAgICByZWFkX2J5dGVzKF9fREVCVUdfTE9HX18scG9zLCBwb3MyLXBvcyApKTsKKyAgICAgIGVsc2UKKyAgICAgICAgZXJyKz1zcHJpbnRmKCJcbktFSU4gQkFDS1RSQUNFIFZFUkZVRUdCQVIhXG4iKTsKKyAgICB9CisgICAgaWYgKCFlcnImJiFvYmomJighb2JqID0gZmluZF9vYmplY3QoZmlsZVswLi48M10pKSkKKyAgICAgIGVyciArPSBzcHJpbnRmKCAidXBkOiAlczogQmx1ZXByaW50IG5hY2ggZGVtIExhZGVuIHplcnN0b2VydC5cbiIsZmlsZSApOworICB9CisgIGVsc2UKKyAgICBlcnI9c3ByaW50ZigidXBkOiBPYmpla3QgZXhpc3RpZXJ0IHNjaG9uOiAlT1xuIixvYmopOworICByZXR1cm4gb2JqOworfQorCisKKy8vCisvLyBfdXBkYXRlKCk6IEZpbGUgdXBkYXRlbiAtPiBCbHVlcHJpbnQgZGVzdHJ1Y3RlbgorLy8gZmlsZTogIEZpbGVuYW1lCisvLyBkdW1teTogc2ltdWxpZXJlbj8gKDEtPndpcmQgbmljaHQgYWt0dWFsaXNpZXJ0KQorLy8gZmxhZ3M6IEtvbW1hbmRvemVpbGVub3B0aW9uZW4KKy8vIFJ1ZWNrZ2FiZTogLTE6IEtlaW5lIFZvbGx6dWdyaWZmCisvLyAgICAgICAgICAgICAwOiBPYmpla3QgaXN0IG5pY2h0IGdlbGFkZW4KKy8vICAgICAgICAgICAgIDE6IE9wZXJhdGlvbiB3aXJkIGR1cmNoZ2VmdWVocnQKKy8vCisKK3ByaXZhdGUgdmFyYXJncyBpbnQgX3VwZGF0ZShzdHJpbmcgZmlsZSwgaW50IGR1bW15LCBpbnQgZmxhZ3MpCit7CisgIG9iamVjdCBvYmo7CisgIHN0cmluZyBlcnI7CisgIGlmICghZHVtbXkgJiYgIW9iamVjdHAob2JqID0gZmluZF9vYmplY3QoZmlsZSkpKSByZXR1cm4gMDsKKyAgaWYgKCFJU19BUkNIKHRoaXNfb2JqZWN0KCkpKQorICB7CisgICAgLy8gU2NocmVpYnJlY2h0ZSBudXIgcHJ1ZWZlbiwgd2VubiBlY2h0IGFrdHVhbGlzaWVydCB3ZXJkZW4gc29sbC4KKyAgICBpZighZHVtbXkgJiYgIU1BWV9XUklURShmaWxlKSkKKyAgICAgIHJldHVybiAocHJpbnRmKCJ1cGQ6oCVzOiBLZWluZSBTY2hyZWlicmVjaHRlIVxuIixmaWxlKSwgLTEpOworICAgIGlmKCFNQVlfUkVBRChmaWxlKSkgCisgICAgICByZXR1cm4gKHByaW50ZigidXBkOiAlczogS2VpbmUgTGVzZXJlY2h0ZSFcbiIsIGZpbGUpLCAtMSk7CisgIH0KKyAgaWYgKGR1bW15KSByZXR1cm4gMTsKKyAgCisgIGlmICggZmxhZ3MgJiBVUERfRCApCisgIHsKKyAgICBvYmplY3QgKmludjsKKyAgICBpZiAoc2l6ZW9mKGludiA9IGRlZXBfaW52ZW50b3J5KG9iaikpKQorICAgIHsKKyAgICAgIHByaW50ZigidXBkOiAlczogRW50ZmVybmUgT2JqZWt0ZSBpbSBJbnZlbnRhclxuIiwgZmlsZSApOworICAgICAgaWYgKCEoZmxhZ3MmVVBEX0gpKQorICAgICAgeworICAgICAgICBpZihlcnI9Y2F0Y2goZmlsdGVyX29iamVjdHMoIGludiwgInJlbW92ZSIsIDEgKSkpCisgICAgICAgICAgcHJpbnRmKCJ1cGQ6ICVzOiBGZWhsZ2VzY2hsYWdlbi4gR3J1bmQ6XG4lc1xuIiwKKyAgICAgICAgICAgICAgICAgZmlsZSxlcnIpOworICAgICAgfQorICAgICAgaWYgKHNpemVvZihpbnYgPSBkZWVwX2ludmVudG9yeShvYmopKSkKKyAgICAgICAgZmlsdGVyKGludiwgZnVuY3Rpb24gdm9pZCAob2JqZWN0IG9iKQorICAgICAgICAgICAge2Rlc3RydWN0KG9iKTt9KTsKKyAgICB9CisgIH0KKyAgaWYgKCEoZmxhZ3MmVVBEX0gpKQorICB7CisgICAgaWYoZXJyID0gY2F0Y2gob2JqLT5yZW1vdmUoKSkpCisgICAgICBwcmludGYoInVwZDogJXM6IHJlbW92ZSgpIGZlaGxnZXNjaGxhZ2VuLiBBdWZydWYgdm9uICIgKworICAgICAgICAgICAgICJkZXN0cnVjdCgpLlxuIixmaWxlKTsKKyAgfQorICBpZihvYmplY3RwKG9iaikpIGRlc3RydWN0KG9iaik7CisgIHJldHVybiAxOworfQorCisKKy8vCisvLyBfaW5zdGFuY2VfdXBkKCk6IEFsbGUgT2JqZWt0ZSBuYWNoIENsb25lcyBkZXMgT2JqZWt0cyBkdXJjaHN1Y2hlbgorLy8gZmlsZTogIEZpbGVuYW1lIGRlcyBPYmpla3RlcworLy8gZmxhZ3M6IEtvbW1hbmRvemVpbGVuYXJndW1lbnRlCisvLyBvYmo6ICAgQWt0dWVsbGVzIE9iamVrdAorLy8gaW5zdGFuY2VzOiBaYWhsIGRlciBnZWZ1bmRlbmVuIEluc3RhbnplbgorLy8KKworcHJpdmF0ZSB2b2lkIF9pbnN0YW5jZV91cGQoc3RyaW5nIGZpbGUsIGludCBmbGFncywgbWl4ZWQgb2JqLCBpbnQgaW5zdGFuY2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZpcnN0Y2FsbCkKK3sKKyBpbnQgaTsKKyBpZiAoZmlyc3RjYWxsKQorICAgIHByaW50ZigidXBkOiAlczogJXMgSW5zdGFuemVuLlxuIixmaWxlLGZsYWdzJlVQRF9BPyJBa3R1YWxpc2llcmUiOiJTdWNoZSIpOworICAKKyAgd2hpbGUgKGdldF9ldmFsX2Nvc3QoKT4yMjAwMDAgJiYgaSA8IHNpemVvZihvYmopKQorICB7CisgICAgaWYgKCFvYmplY3RwKG9ialtpXSkpCisgICAgICBpbnN0YW5jZXMtLTsKKyAgICBlbHNlCisgICAgeworICAgICAgaWYgKGZsYWdzJlVQRF9GJiYhKGZsYWdzJlVQRF9TKSkKKyAgICAgICAgcHJpbnRmKCAidXBkOiAlTyBnZWZ1bmRlbiBpbiAlc1xuIiwgb2JqW2ldLAorICAgICAgICAgICAgICAgIGVudmlyb25tZW50KG9ialtpXSk/b2JqZWN0X25hbWUoZW52aXJvbm1lbnQob2JqW2ldKSkgCisgICAgICAgICAgICAgICAgOiAia2VpbmVyIFVtZ2VidW5nIiApOworICAgICAgaWYgKGZsYWdzJlVQRF9BKSBfbWFrZShvYmplY3RfbmFtZShvYmpbaV0pLCBmbGFncyAmIH4oVVBEX0F8VVBEX0YpLDEgKTsKKyAgICB9CisgICAgaSsrOworICB9CisgIGlmIChpIDwgc2l6ZW9mKG9iaikpIAorICAgIGNhbGxfb3V0KCAjJ19pbnN0YW5jZV91cGQvKicqLywyLGZpbGUsZmxhZ3Msb2JqW2kuLl0saW5zdGFuY2VzLDApOworICBlbHNlCisgICAgcHJpbnRmKCAidXBkOiAlczogJWQgSW5zdGFuemVuICVzXG4iLCBmaWxlLCBpbnN0YW5jZXMsCisgICAgICAgICAgICAoZmxhZ3MgJiBVUERfQSkgPyAiYWt0dWFsaXNpZXJ0IiA6ICJnZWZ1bmRlbiIgKTsKKyAgcmV0dXJuOworfQorICAKKyAgCisvLworLy8gX2RvX21ha2UoKTogQWxsZSBnZWVyYnRlbiBPYmpla3RlIGJlYXJiZWl0ZW4gKGZ1ZXIgLW0vLXYpCisvLyBmaWxlOiAgTmFtZSBkZXMgRmlsZXMKKy8vIGNsb25lOiAwLCB3ZW5uIGJsdWVwcmludCwgYW5zb25zdGVuIENsb25lbnVtbWVyCisvLyBmbGFnczogS29tbWFuZG96ZWlsZW5wYXJhbWV0ZXIKKy8vIGRlcDogICBnZXNjaGFjaHRlbHRlcyBBcnJheSBtaXQgTWVsZHVuZ2VuICh3Zy4gUmVrdXJzaW9uKQorLy8gcmVhZHk6IEFycmF5IGRlciBzY2hvbiBiZWFyYmVpdGV0ZW4gT2JqZWt0ZSAod2cuIFJla3Vyc2lvbikKKy8vIFJ1ZWNrZ2FiZTogQXJyYXkgZGVyIE9iamVrdG5hbWVuLCBkaWUgYmVhcmJlaXRldCB3dXJkZW4KKy8vICAgICAgICAgICAgKEFycmF5IGluIEFycmF5IGluIC4uLikKKy8vIAorCit2YXJhcmdzIHByaXZhdGUgaW50IF9kb19tYWtlKCBzdHJpbmcgZmlsZSxpbnQgY2xvbmUsaW50IGZsYWdzLG1peGVkIGRlcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyAqcmVhZHkgKQoreworICBvYmplY3Qgb2JqOworICBzdHJpbmcgZXJyOworICBzdHJpbmcgKmlsaXN0OworICBtaXhlZCBkb3duZGVwczsKKyAgaW50IHJldDsKKyAgCisgIGlmICghcG9pbnRlcnAocmVhZHkpKSByZWFkeSA9ICh7fSk7CisgIHJlYWR5ICs9ICh7IGZpbGUgfSk7CisgIAorICBpZiAoICEob2JqID0gX3JlbG9hZChmaWxlLGNsb25lLGZsYWdzLCZlcnIpKSkKKyAgeworICAgIGRlcCArPSAoeyBlcnIgfSk7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgCisgIGlsaXN0ID0gaW5oZXJpdF9saXN0KG9iaiktcmVhZHk7CisgIAorICBkb3duZGVwcyA9ICh7fSk7CisgIAorICB3aGlsZSAoc2l6ZW9mKGlsaXN0KSkKKyAgeworICAgIHJldCA9IF9kb19tYWtlKCBpbGlzdFswXSwwLGZsYWdzLCAmZG93bmRlcHMsICZyZWFkeSApfHxyZXQ7CisgICAgaWxpc3RbMC4uMF0gPSAoe30pOworICAgIGlsaXN0IC09IHJlYWR5OworICB9CisgIAorICBpZiAoIHJldHx8ZmlsZV90aW1lKGZpbGUpPnByb2dyYW1fdGltZShvYmopfHwoZmxhZ3MgJlVQRF9JKSkKKyAgICBpZiAoIF9tYWtlKCBmaWxlLCBmbGFncyAmIH4oVVBEX018VVBEX0kpICwxKSA8IDAgKSAKKyAgICAgIGRlcCA9ICh7ICJ7IiArIGV4cGxvZGUoZmlsZSwiLyIpWzwxXSArICJ9IiwgZG93bmRlcHMgfSk7CisgICAgZWxzZXsKKyAgICAgIGRlcCA9ICh7ICJbIiArIGV4cGxvZGUoZmlsZSwiLyIpWzwxXSArICJdIiwgZG93bmRlcHMgfSk7CisgICAgICByZXQgPSAxOworICAgIH0KKyAgZWxzZSBpZiAoZmxhZ3MmVVBEX1YpIGRlcCArPSAoeyBleHBsb2RlKGZpbGUsIi8iKVs8MV0sIGRvd25kZXBzIH0pOworICByZXR1cm4gcmV0OworfQorCisKKy8vCisvLyBfbWFrZV9kZXAoKTogQXVzZ2FiZSBkZXMgRXJlcmJ1bmdzYmF1bWVzCisvLyBPYmpla3RlIGltIEFycmF5IGRlcAorLy8gcHJlZml4IGVudGhhZWx0IFplaWxlbmFuZmFuZyAoZnVlciBSZWt1cnNpb24pCisvLyBSdWVja2dhYmU6IFN0cmluZyBtaXQgZGVtIFZlcmVyYnVuZ3NiYXVtIGRlcyBPYmpla3RlcworLy8KKworcHJpdmF0ZSBzdHJpbmcgX21ha2VfZGVwKCBtaXhlZCBkZXAsIHN0cmluZyBwcmVmaXggKQoreworICBzdHJpbmcgcmV0OworICBpbnQgaSwgc2l6ZTsKKyAgCisgIHJldD0iIjsKKyAgc2l6ZT1zaXplb2YoZGVwKTsKKyAgZm9yIChpPTA7IGk8c2l6ZTtpKyspCisgICAgaWYgKHBvaW50ZXJwKGRlcFtpXSkpCisgICAgICByZXQgKz0gX21ha2VfZGVwKGRlcFtpXSxwcmVmaXggKyAoaSA8IChzaXplLTEpID8gInwgIjoiICIpKTsKKyAgICBlbHNlIAorICAgICAgcmV0ICs9IHByZWZpeCArICIrLSIgKyBkZXBbaV0gKyAiXG4iOworICByZXR1cm4gcmV0OworfQorCisKKy8vCisvLyBfaWxsZWdhbF9jbG9zdXJlKCk6IGlzdCBjbG9zdXJlIGluIGFyZyBhbiBvYmpla3QgZ2VidW5kZW4/CisvLyBhcmc6IGNsb3N1cmUoLWFycmF5L21hcHBpbmcpCisvLyBSdWVja2dhYmU6IDAgd2VubiBhbGxlcyBva2F5CisvLyAgICAgICAgICAgIDEgd2VubiBjbG9zdXJlIGdlbG9lc2NodCB3ZXJkZW4gbXVzcworLy8KKworcHJpdmF0ZSBpbnQgX2lsbGVnYWxfY2xvc3VyZSggbWl4ZWQgYXJnICkKK3sKKyAgaW50IGksIGo7CisgIHN0cmluZyAqaW5kaWNlczsKKyAgCisgIGlmICggY2xvc3VyZXAoYXJnKSAmJiAhb2JqZWN0cChxdWVyeV9jbG9zdXJlX29iamVjdChhcmcpKSApCisgICAgcmV0dXJuIDE7CisgIAorICBpZiAoIHBvaW50ZXJwKGFyZykgKXsKKyAgICBmb3IgKCBpID0gc2l6ZW9mKGFyZyk7IGktLTsgKQorICAgICAgaWYgKCBfaWxsZWdhbF9jbG9zdXJlKGFyZ1tpXSkgKQorICAgICAgICByZXR1cm4gMTsKKyAgfQorICBlbHNlIGlmICggbWFwcGluZ3AoYXJnKSApeworICAgIGluZGljZXMgPSBtX2luZGljZXMoYXJnKTsKKyAgICBmb3IgKCBpID0gc2l6ZW9mKGluZGljZXMpOyBpLS07ICkKKyAgICAgIGZvciAoIGogPSBnZXRfdHlwZV9pbmZvKCBhcmcsIDEgKTsgai0tOyApCisgICAgICAgIGlmICggX2lsbGVnYWxfY2xvc3VyZShhcmdbaW5kaWNlc1tpXSwgal0pICkKKyAgICAgICAgICByZXR1cm4gMTsKKyAgfQorICByZXR1cm4gMDsKK30KKworLy8KKy8vIF9tYWtlKCk6IFVwZGF0ZSBmaWxlCisvLyBmaWxlOiAgRmlsZW5hbWUKKy8vIGZsYWdzOiBLb21tYW5kb3plaWxlbmFyZ3VtZW50ZQorLy8KKwordmFyYXJncyBzdGF0aWMgaW50IF9tYWtlKHN0cmluZyBmaWxlLCBpbnQgZmxhZ3MsaW50IHJlY3Vyc2l2ZSkKK3sKKyAgc3RyaW5nIG1zZywgZXJyLCBibHVlOworICBpbnQgaW5zdDsKKyAgb2JqZWN0IG9iaiwgaW52X3NhdmVyOworICBtaXhlZCB0bXA7CisgIAorICBtc2cgPSAiIjsKKworICBpZiAoIWZpbGUpIHJldHVybiBwcmludGYoICJ1cGQ6IEtlaW4gRmlsZW5hbWUgdWViZXJnZWJlbiFcbiIgKSwgUkVUX0ZBSUw7CisgICAgCisvLyBGaWxlbmFtZSBpbiBCbHVlLCBPYmpla3RuYW1lIGluIGJsdWUsIEluc3RhbnpudW1tZXIgaW4gaW5zdAorCisgIGlmIChzc2NhbmYoZmlsZSwiJXMjJWQiLGJsdWUsaW5zdCk9PTIpIGJsdWUgKz0gIi5jIjsKKyAgZWxzZSBibHVlID0gZmlsZSArIChmaWxlWzwyLi5dPT0iLmMiID8gIiIgOiAiLmMiKTsKKworLy8gQWxsZSBJbnN0YW56ZW4gZHVyY2hzdWNoZW4gaW0gRmFsbGUgdm9uIC1hIG9kZXIgLWYgCisKKyAgaWYgKChmbGFncyAmIFVQRF9MT0FEKSYmZmluZF9vYmplY3QoZmlsZSkpCisgICAgcmV0dXJuIHByaW50ZigibG9hZDogJXM6IE9iamVrdCBpc3Qgc2Nob24gZ2VsYWRlbi5cbiIsZmlsZSksUkVUX09LOworICAKKyAgaWYgKCBmbGFncyAmIChVUERfRnxVUERfQSkpCisgIHsKKyAgICBpZiAoaW5zdCkgcmV0dXJuIHByaW50ZiggInVwZDogJXM6IEVpbmUgSW5zdGFueiBrYW5uIGtlaW5lICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ2xvbmVzIGhhYmVuLlxuIixmaWxlICksIFJFVF9GQUlMOworICAgIGlmICgodG1wPV91cGRhdGUoZmlsZSwgMSxmbGFncykpPT0tMSkgCisgICAgICByZXR1cm4gcHJpbnRmKCAidXBkOiAlczogS2VpbiBWb2xsenVncmlmZiBhdWYgZGllICIgKworICAgICAgICAgICAgICAgICAgICAgIkRhdGVpIGVybGF1YnQuXG4iLGZpbGUpLCBSRVRfRkFJTDsKKyAgICBpZiAodG1wPT0wKSByZXR1cm4gUkVUX0ZBSUw7CisKKyAgIHRtcD1jbG9uZXMoYmx1ZVswLi48M10sMik7CisgICAgaWYgKHNpemVvZih0bXApKQorICAgICAgY2FsbF9vdXQoICMnX2luc3RhbmNlX3VwZC8qJyovLCAwLCBmaWxlLGZsYWdzLHRtcCxzaXplb2YodG1wKSwxKTsKKyAgICBlbHNlCisgICAgICBwcmludGYoICJ1cGQ6ICVzOiBLZWluZSBDbG9uZXMgdm9yaGFuZGVuIVxuIiwgYmx1ZVswLi48M10pOworCisgICAgaWYgKCAoZmxhZ3MgJiBVUERfRikgJiYgIShmbGFncyAmKFVQRF9SfFVQRF9MfFVQRF9MT0FEKSkpIHJldHVybiBSRVRfT0s7IAorICAgIC8vIE5pY2h0cyBsYWRlbiAtPiBBdWNoIGtlaW4gQmFja3VwCisgIH0KKworLy8gQmFja3VwcmF1bSBmZXN0bGVnZW4KKyAgIAorICBpZiggYmx1ZT09SU5WX1NBVkUgKSB7CisgICAgICAgICAgICAgICAgcHJpbnRmKCJ1cGQ6IEFjaHR1bmc6IFJhdW0genVtIFp3aXNjaGVuc3BlaWNoZXJuIHNvbGwgZ2VsYWRlbiB3ZXJkZW4/IVxuIik7CisgICAgICAgIH0gCisgIGlmICggIShpbnZfc2F2ZXI9bG9hZF9vYmplY3QoSU5WX1NBVkUpKSApCisgIHsKKyAgICBwcmludGYoInVwZDogJXM6IFJhdW0genVtIFp3aXNjaGVuc3BlaWNoZXJuIGRlcyAiICsKKyAgICAgICAgICAgIlJhdW1pbmhhbHRzIGlzdCBuaWNodCBsYWRiYXIuXG4iICsKKyAgICAgICAgICAgIiAgICAgICAgICVzXG4iLGZpbGUsSU5WX1NBVkUpOworICAgIHJldHVybiBSRVRfRkFJTDsKKyAgfQorCisvLyBXZW5uIGRhcyBPYmpla3QgZXhpc3RpZXJ0IGJ6dy4gRGVlcCBha3R1YWxpc2llcnQgd2VyZGVuIHNvbGwKKworICBpZiAoICghKGZsYWdzJlVQRF9MT0FEKSkmJgorICAgICAgICgob2JqID0gZmluZF9vYmplY3QoZmlsZSkpIHx8IChmbGFncyAmIChVUERfTXxVUERfSSkpKSkKKyAgeworICAgIG9iamVjdCAqaW52LCBlbnYsICpwbF9pbnY7CisgICAgbWFwcGluZyBwcm87CisgICAgaW50IGk7CisgICAgbWl4ZWQgY29uZmlnZGF0YTsKKyAgICBpbnQgcmVzdG9yZV9jb25maWc7CisKKyAgICAvLyBXZW5uIE9iamVrdCBleGlzdGllcnQsIGRhbm4gSW5oYWx0IHVuZCBnZ2YuIERhdGVuIGF1cyBDb25maWd1cmUoKSBvZGVyCisgICAgLy8gUHJvcHMgc2ljaGVybjoKKyAgICBpZiAob2JqKQorICAgIHsKKyAgICAgIC8vIGltIEZhbGwgVVBEX0MgZXJmb2xndCBfa2Vpbl8gQXVzbGVzZW4gdW5kIF9rZWluZV8gUmVzdGF1cmF0aW9uCisgICAgICAvLyBtaXR0ZWxzIENvbmZpZ3VyZSgpCisgICAgICBpZiAoICEgKGZsYWdzICYgVVBEX0MgKSApCisgICAgICB7CisgICAgICAgIGNhdGNoKHJlc3RvcmVfY29uZmlnPShtaXhlZCljYWxsX3Jlc29sdmVkKCZjb25maWdkYXRhLG9iaiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNvbmZpZ3VyZSIsMCk7CisgICAgICAgICAgICAgIHB1Ymxpc2gpOworICAgICAgICAvLyBXZW5uIFVQRF9DT05GIGdlc2V0enQgd2lyZCwgX211c3NfIGRhcyBPYmpla3QgZWluIG9lZmZlbnRsaWNoZXMKKyAgICAgICAgLy8gQ29uZmlndXJlKCkgZGVmaW5pZXJlbiwgc29uc3QgZXJmb2xndCBBYmJydWNoLgorICAgICAgICBpZiAoKGZsYWdzICYgVVBEX0NPTkYpICYmICFyZXN0b3JlX2NvbmZpZykKKyAgICAgICAgeworICAgICAgICAgIHByaW50ZigidXBkOiAlczogaGF0IGtlaW4gQ29uZmlndXJlKCksIFplcnN0b2VydW5nIGFiZ2Vicm9jaGVuLlxuIixmaWxlKTsKKyAgICAgICAgICByZXR1cm4gUkVUX0ZBSUw7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGlmICghKGZsYWdzJlVQRF9EKSYmKGZsYWdzJihVUERfTHxVUERfUikpKQorICAgICAgeworICAgICAgICBpZiAoaT1zaXplb2YoaW52PShhbGxfaW52ZW50b3J5KG9iaiktKHswfSkpKSkKKyAgICAgICAgeworICAgICAgICAgIG1peGVkIGl0ZW1zOworICAgICAgICAgIC8vIEhlcmF1c2Jla29tbWVuLCBvYiBoaWVyIEl0ZW1zIGV4aXN0aWVyZW4sIGRpZSBwZXIgQWRkSXRlbSAKKyAgICAgICAgICAvLyBlcnpldWd0IHdlcmRlbi4gRGllIGR1ZXJmZW4gbmljaHQgZ2VzaWNoZXJ0IHdlcmRlbi4KKyAgICAgICAgICBpdGVtcz0obWl4ZWQpb2JqLT5RdWVyeVByb3AoUF9JVEVNUyk7IC8vIG1peGVkLCBkYSBhcnJheSBvZiBhcnJheXMKKyAgICAgICAgICBpZiAocG9pbnRlcnAoaXRlbXMpJiZzaXplb2YoaXRlbXMpKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIGl0ZW1zPXRyYW5zcG9zZV9hcnJheShpdGVtcylbMF07CisgICAgICAgICAgICB3aGlsZSAoaS0tKQorICAgICAgICAgICAgICBpZiAobWVtYmVyKGl0ZW1zLCBpbnZbaV0pPT0tMSkKKyAgICAgICAgICAgICAgICAgICAgaW52W2ldLT5tb3ZlKGludl9zYXZlcixOT19DSEVDSyk7CisgICAgICAgICAgfQorICAgICAgICAgIGVsc2UgLy8gSW4gZGllc2VtIE9iamVrdCBzaW5kIGtlaW5lIEl0ZW1zIGdlc2V0enQuCisgICAgICAgICAgICB3aGlsZSAoaS0tKSBpbnZbaV0tPm1vdmUoaW52X3NhdmVyLE5PX0NIRUNLKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICBpbnY9bWFwKCBkZWVwX2ludmVudG9yeShvYmopLCAjJ19zYXZlLyonKi8sIGludl9zYXZlciApLSh7MH0pOworICAgICAgfQorICAgICAgZW52ID0gZW52aXJvbm1lbnQob2JqKTsKKyAgICAgIGlmICggZmxhZ3MgJiBVUERfQyApCisgICAgICB7CisgICAgICAgIHBybyA9IChtYXBwaW5nKShvYmotPlF1ZXJ5UHJvcGVydGllcygpKTsKKyAgICAgIH0KKyAgICB9CisgICAgZWxzZSBpbnYgPSAoe30pOworCisvLyBFcmVyYnRlIE9iamVrdGUgZHVyY2hzdWNoZW4uCisgICAgaWYgKCBmbGFncyAmIChVUERfTXxVUERfSSkgKQorICAgIHsKKyAgICAgIG1peGVkIGRlcDsKKyAgICAgIGRlcCA9ICh7fSk7CisgICAgICBfZG9fbWFrZSggYmx1ZSwgaW5zdCwgZmxhZ3MgJiB+KFVQRF9NfFVQRF9MfFVQRF9SfFVQRF9GfFVQRF9BKSwgJmRlcCApOworICAgICAgcHJpbnRmKCBfbWFrZV9kZXAoIGRlcCwgIiIgKSArICJcbiIgKTsKKyAgICB9CisgICAKKy8vIFRhdHNhZWNobGljaGVuIFVwZGF0ZSBkdXJjaGZ1ZWhyZW4KKyAgIAorICAgIGlmICggX3VwZGF0ZShmaWxlLCAwLCBmbGFncyk8IDApIHJldHVybiBSRVRfRkFJTDsKKyAgICBtc2cgKz0gKGluc3QgPyAiemVyc3RvZXJ0IiA6ICJha3R1YWxpc2llcnQiKTsKKyAgICAKKy8vIE5ldSBsYWRlbiA/PworICAgIGlmICggZmxhZ3MgJiAoVVBEX1J8VVBEX0wpICkKKyAgICB7CisgICAgICBpZiAoIG9iaiA9IF9yZWxvYWQoIGJsdWUsaW5zdCxmbGFncywgJmVyciApICkKKyAgICAgICAgbXNnICs9ICIsICIgKyAoaW5zdCA/ICJuZXUgZ2VjbG9udCIgOiAibmV1IGdlbGFkZW4iKTsKKyAgICAgCisvLyBOZXUgZ2VsYWRlbjogUHJvcGVydGllcyB3aWVkZXJoZXJzdGVsbGVuLCBDbG9zdXJlcyBmaWx0ZXJuIAorICAgICAgaWYgKCFlcnIpCisgICAgICB7CisgICAgICAgIGlmICghb2JqKSBvYmogPSBmaW5kX29iamVjdChmaWxlKTsKKyAgICAgICAgLy8gV2VubiBnZXd1ZW5zY2h0LCBQcm9wcyB6dXJ1ZWNrc2NocmVpYmVuIChoYXQgUHJpb3JpdGFldCB2b3IKKyAgICAgICAgLy8gQ29uZmlndXJlKCksIHdlaWwgZXhwbGl6aXQgdm9tIE1hZ2llciBhbmdlZm9yZGVydCkuCisgICAgICAgIGlmICggcHJvICYmIChmbGFncyAmIFVQRF9DKSApCisgICAgICAgIHsKKyAgICAgICAgICBzdHJpbmcgKm5hbWVzOworICAgICAgICAgIAorICAgICAgICAgIG5hbWVzID0gbV9pbmRpY2VzKHBybyk7CisgICAgICAgICAgCisgICAgICAgICAgLy8gQ2xvc3VyZXMgaW4gKG1pdHRsZXJ3ZWlsZSkgemVyc3RvZXJ0ZW4gT2JqZWt0ZW4KKyAgICAgICAgICAvLyByYXVzZmlsdGVybiwgZGFtaXQgZGllIChob2ZmZW50bGljaCBrb3JyZWt0ZW4pIENsb3N1cmVzCisgICAgICAgICAgLy8gaW0gbmV1IGdlY2xvbnRlbiBPYmpla3QgZXJoYWx0ZW4gYmxlaWJlbgorICAgICAgICAgIGZvciAoIGkgPSBzaXplb2YobmFtZXMpOyBpLS07ICkKKyAgICAgICAgICAgIGlmICggX2lsbGVnYWxfY2xvc3VyZShwcm9bbmFtZXNbaV0sIEZfVkFMVUVdKSB8fAorICAgICAgICAgICAgICAgICBfaWxsZWdhbF9jbG9zdXJlKHByb1tuYW1lc1tpXSwgRl9RVUVSWV9NRVRIT0RdKSB8fAorICAgICAgICAgICAgICAgICBfaWxsZWdhbF9jbG9zdXJlKHByb1tuYW1lc1tpXSwgRl9TRVRfTUVUSE9EXSkgKQorICAgICAgICAgICAgICBtX2RlbGV0ZSggcHJvLCBuYW1lc1tpXSApOworICAgICAgICAgIAorICAgICAgICAgIG9iai0+U2V0UHJvcGVydGllcyhwcm8pOworICAgICAgICAgIG1zZyArPSAiLCBQcm9wZXJ0aWVzIGdlc2V0enQiOworICAgICAgICB9CisgICAgICAgIC8vIFdlbm4ga2VpbiBVUERfQywgd2lyZCBnZ2YuIGRhcyBFcmdlYm5pcyB2b24gQ29uZmlndXJlKCkgd2llZGVyCisgICAgICAgIC8vIHVlYmVyZ2ViZW4uCisgICAgICAgIGVsc2UgaWYgKHJlc3RvcmVfY29uZmlnKQorICAgICAgICB7CisgICAgICAgICAgaW50IGNvbmZfcmVzOworICAgICAgICAgIGlmICghY2F0Y2goY29uZl9yZXM9KGludClvYmotPkNvbmZpZ3VyZShjb25maWdkYXRhKTsgcHVibGlzaCkKKyAgICAgICAgICAgICAgJiYgY29uZl9yZXMgPT0gMSkKKyAgICAgICAgICB7CisgICAgICAgICAgICBtc2cgKz0gIiwgKHJlLSlrb25maWd1cmllcnQiOworICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlCisgICAgICAgICAgeworICAgICAgICAgICAgbXNnICs9ICIsIChSZS0pS29uZmlndXJhdGlvbiBmZWhsZ2VzY2hsYWdlbiI7CisgICAgICAgICAgICBpZiAoZmxhZ3MgJiBVUERfQ09ORikKKyAgICAgICAgICAgICAgcHJpbnRmKCJ1cGQ6IERhdGVuIHZvbiAlcyBrb25udGVuIG5pY2h0IHJla29uZmlndXJpZXJ0IHdlcmRlbjogIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIiVPXG4iLCBmaWxlLCBjb25maWdkYXRhKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKGVudikKKyAgICAgICAgeworICAgICAgICAgIGlmICggb2JqLT5tb3ZlKCBlbnYsIE5PX0NIRUNLICkgPD0gMCApCisgICAgICAgICAgICBwcmludGYoICJ1cGQ6IC8lTyBrb25udGUgbmljaHQgaW4gLyVPIHp1cnVlY2tiZXdlZ3Qgd2VyZGVuXG4iLAorICAgICAgICAgICAgICAgICAgICBvYmosIGVudiApOworICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIG1zZyArPSAiLCBiZXdlZ3QiOworICAgICAgICB9CisgICAgICAgIGlmIChpPXNpemVvZihpbnYpKQorICAgICAgICB7CisgICAgICAgICAgd2hpbGUoaS0tKSBpZiAoaW52W2ldKSBpbnZbaV0tPm1vdmUob2JqLCBOT19DSEVDSyApOworICAgICAgICAgIG1zZyArPSAiLCBJbmhhbHQgenVydWVja2Jld2VndCI7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGVsc2UgCisgICAgICAgIHJldHVybiBwcmludGYoICJ1cGQ6ICVzOiAlcyIsIGZpbGUsIGVyciApLCBSRVRfRkFJTDsKKyAgICB9CisgIH0KKyAgZWxzZSAKKyAgICBpZiAoICFfdXBkYXRlKGZpbGUsIDAsIGZsYWdzKSAmJiAoZmxhZ3MgJiAoVVBEX0x8VVBEX0xPQUQpKSApCisgICAgICBpZiAoICFfcmVsb2FkKCBibHVlLCBpbnN0LCBmbGFncywgJmVyciApICkKKyAgICAgICAgcmV0dXJuIHByaW50ZiggIiVzOiAlczogJXMiLCAoZmxhZ3MmVVBEX0xPQUQ/ImxvYWQiOiJ1cGQiKSxmaWxlLCBlcnIgKSwKKyAgICAgICAgICBSRVRfRkFJTDsKKyAgICAgIGVsc2UKKyAgICAgICAgbXNnICs9ICJnZWxhZGVuIjsKKyAgCisgIGlmICggc2l6ZW9mKG1zZykmJiEoZmxhZ3MmVVBEX1MmJnJlY3Vyc2l2ZSkgKQorICAgIHByaW50ZigiJXM6ICVzOiAlcy5cbiIsKGZsYWdzJlVQRF9MT0FEPyJsb2FkIjoidXBkIiksZmlsZSxtc2cpOworICByZXR1cm4gUkVUX09LOworfQorCisvLworLy8gX3VwZDogT2JqZWt0ZSBsYWRlbiwgemVyc3RvZXJlbiB1bmQgYWt0dWFsaXNpZXJlbgorLy8KKworc3RhdGljIGludCBfdXBkKHN0cmluZyBjbWRsaW5lKQoreworICBpbnQgZmxhZ3M7CisgIG1peGVkICphcmdzOworCisgIGNtZGxpbmU9X3VucGFyc2VkX2FyZ3MoKTsKKyAgYXJncz1wYXJzZWFyZ3MoY21kbGluZSwmZmxhZ3MsVVBEX09QVFMsMSk7CisgIGlmKGZsYWdzPT0tMXx8IXNpemVvZihhcmdzKSkKKyAgICByZXR1cm4gVVNBR0UoInVwZCBbLSIrVVBEX09QVFMrIl0gPGRhdGVpPiBbPGRhdGVpPiAuLl0iKTsKKyAgaWYgKChmbGFncyAmIFVQRF9DKSAmJiAoZmxhZ3MgJiBVUERfQ09ORikpCisgIHsKKyAgICBwcmludGYoInVwZDogLWMgdW5kIC1DIGdsZWljaHplaXRpZyB3ZXJkZW4gbmljaHQgdW50ZXJzdHVldHp0LlxuIik7CisgICAgcmV0dXJuIDE7CisgIH0KKyAgYXJncz1maWxlX2xpc3QoYXJncyxNT0RFX1VQRCwwLCIvIik7CisgIGlmKCFzaXplb2YoYXJncykpIHJldHVybiBwcmludGYoInVwZDogS2VpbmUgcGFzc2VuZGUgRGF0ZWkgZ2VmdW5kZW4hXG4iKSwxOworCisgIGFyZ3M9bWFwKGFyZ3MsKDogJDFbRlVMTE5BTUVdIDopKS0oezB9KTsKKworICBpZighc2l6ZW9mKGFyZ3MpKQorICB7CisgICAgcHJpbnRmKCJ1cGQ6IFZlcnplaWNobmlzc2Uga29lbm5lbiBuaWNodCBha3R1YWxpc2llcnQgd2VyZGVuIVxuIik7CisgICAgcmV0dXJuIDE7CisgIH0KKyAgYXN5bmNocm9uKGFyZ3MsIydfbWFrZSxmbGFncywwLDApOworICByZXR1cm4gMTsKK30KKworLy8KKy8vIF9sb2FkOiBPYmpla3RlIGxhZGVuCisvLworCitzdGF0aWMgaW50IF9sb2FkKHN0cmluZyBjbWRsaW5lKQoreworICBpbnQgZmxhZ3M7CisgIG1peGVkICphcmdzOworCisgIGNtZGxpbmU9X3VucGFyc2VkX2FyZ3MoKTsKKyAgYXJncz1wYXJzZWFyZ3MoY21kbGluZSwmZmxhZ3MsIiIsMSk7CisgIGlmKGZsYWdzPT0tMXx8IXNpemVvZihhcmdzKSkKKyAgICByZXR1cm4gVVNBR0UoImxvYWQgPGRhdGVpPiBbPGRhdGVpPiAuLl0iKTsKKyAgYXJncz1maWxlX2xpc3QoYXJncyxNT0RFX1VQRCwwLCIvIik7CisgIGlmKCFzaXplb2YoYXJncykpIHJldHVybiBwcmludGYoImxvYWQ6IEtlaW5lIHBhc3NlbmRlIERhdGVpIGdlZnVuZGVuIVxuIiksMTsKKyAgYXJncz1tYXAoYXJncywoOiAoKCQxW0ZJTEVTSVpFXSE9LTJ8fGZpbmRfb2JqZWN0KCQxW0ZVTExOQU1FXSkpPworICAgICAgICAgICAgICAgICAgICAgICAgICAkMVtGVUxMTkFNRV06MCkgOikpLSh7MH0pOworCisgIGlmKCFzaXplb2YoYXJncykpCisgICAgcmV0dXJuIHByaW50ZigibG9hZDogVmVyemVpY2huaXNzZSBrb2VubmVuIG5pY2h0IGdlbGFkZW4gd2VyZGVuIVxuIiksMTsKKyAgYXN5bmNocm9uKGFyZ3MsIydfbWFrZSxVUERfTE9BRCwwLDApOworICByZXR1cm4gMTsKK30K