ZGlmZiAtLWdpdCBhL2dpdHdlYi9SRUFETUUgYi9naXR3ZWIvUkVBRE1FCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwMTRkNzMKLS0tIC9kZXYvbnVsbAorKysgYi9naXR3ZWIvUkVBRE1FCkBAIC0wLDAgKzEsMTYgQEAKK0dJVCB3ZWIgSW50ZXJmYWNlCisKK1RoZSBvbmUgd29ya2luZyBvbjoKKyAgaHR0cDovL3d3dy5rZXJuZWwub3JnL2dpdC8KKworR2V0IHRoZSBnaXR3ZWIuY2dpIGJ5IGZ0cDoKKyAgZnRwOi8vZnRwLmtlcm5lbC5vcmcvcHViL3NvZnR3YXJlL3NjbS9naXR3ZWIvCisKK0l0IHJlcWlyZXMgdGhlIGdpdC1jb3JlIGJpbmFyaWVzIGluc3RhbGxlZCBvbiB0aGUgc3lzdGVtOgorICBodHRwOi8vd3d3Lmtlcm5lbC5vcmcvZ2l0Lz9wPWdpdC9naXQuZ2l0O2E9c3VtbWFyeQorCitUaGUgZ2l0d2ViIHJlcG9zaXRvcnkgaXMgaGVyZToKKyAgaHR0cDovL3d3dy5rZXJuZWwub3JnL2dpdC8/cD1naXQvZ2l0d2ViLmdpdDthPXN1bW1hcnkKKworQW55IGNvbW1lbnQvcXVlc3Rpb24vY29uY2VybiB0bzoKKyAgS2F5IFNpZXZlcnMgPGtheS5zaWV2ZXJzQHZyZnkub3JnPgpkaWZmIC0tZ2l0IGEvZ2l0d2ViL2dpdHdlYi5jZ2kgYi9naXR3ZWIvZ2l0d2ViLmNnaQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5lYTIxZmJlCi0tLSAvZGV2L251bGwKKysrIGIvZ2l0d2ViL2dpdHdlYi5jZ2kKQEAgLTAsMCArMSwyNDA3IEBACisjIS91c3IvYmluL3BlcmwKKworIyBnaXR3ZWIgLSBzaW1wbGUgd2ViIGludGVyZmFjZSB0byB0cmFjayBjaGFuZ2VzIGluIGdpdCByZXBvc2l0b3JpZXMKKyMKKyMgKEMpIDIwMDUtMjAwNiwgS2F5IFNpZXZlcnMgPGtheS5zaWV2ZXJzQHZyZnkub3JnPgorIyAoQykgMjAwNSwgQ2hyaXN0aWFuIEdpZXJrZQorIworIyBUaGlzIHByb2dyYW0gaXMgbGljZW5zZWQgdW5kZXIgdGhlIEdQTHYyCisKK3VzZSBzdHJpY3Q7Cit1c2Ugd2FybmluZ3M7Cit1c2UgQ0dJIHF3KDpzdGFuZGFyZCA6ZXNjYXBlSFRNTCAtbm9zdGlja3kpOwordXNlIENHSTo6VXRpbCBxdyh1bmVzY2FwZSk7Cit1c2UgQ0dJOjpDYXJwIHF3KGZhdGFsc1RvQnJvd3Nlcik7Cit1c2UgRW5jb2RlOwordXNlIEZjbnRsICc6bW9kZSc7CitiaW5tb2RlIFNURE9VVCwgJzp1dGY4JzsKKworbXkgJGNnaSA9IG5ldyBDR0k7CitteSAkdmVyc2lvbiA9CQkiMjY3IjsKK215ICRteV91cmwgPQkJJGNnaS0+dXJsKCk7CitteSAkbXlfdXJpID0JCSRjZ2ktPnVybCgtYWJzb2x1dGUgPT4gMSk7CitteSAkcnNzX2xpbmsgPQkJIiI7CisKKyMgYWJzb2x1dGUgZnMtcGF0aCB3aGljaCB3aWxsIGJlIHByZXBlbmRlZCB0byB0aGUgcHJvamVjdCBwYXRoCisjbXkgJHByb2plY3Ryb290ID0JIi9wdWIvc2NtIjsKK215ICRwcm9qZWN0cm9vdCA9CSIvaG9tZS9rYXkvcHVibGljX2h0bWwvcHViL3NjbSI7CisKKyMgbG9jYXRpb24gb2YgdGhlIGdpdC1jb3JlIGJpbmFyaWVzCitteSAkZ2l0YmluID0JCSIvdXNyL2JpbiI7CisKKyMgbG9jYXRpb24gZm9yIHRlbXBvcmFyeSBmaWxlcyBuZWVkZWQgZm9yIGRpZmZzCitteSAkZ2l0X3RlbXAgPQkJIi90bXAvZ2l0d2ViIjsKKworIyB0YXJnZXQgb2YgdGhlIGhvbWUgbGluayBvbiB0b3Agb2YgYWxsIHBhZ2VzCitteSAkaG9tZV9saW5rID0JCSRteV91cmk7CisKKyMgaHRtbCB0ZXh0IHRvIGluY2x1ZGUgYXQgaG9tZSBwYWdlCitteSAkaG9tZV90ZXh0ID0JCSJpbmRleHRleHQuaHRtbCI7CisKKyMgc291cmNlIG9mIHByb2plY3RzIGxpc3QKKyNteSAkcHJvamVjdHNfbGlzdCA9CSRwcm9qZWN0cm9vdDsKK215ICRwcm9qZWN0c19saXN0ID0JImluZGV4L2luZGV4LmF1eCI7CisKKyMgaW5wdXQgdmFsaWRhdGlvbiBhbmQgZGlzcGF0Y2gKK215ICRhY3Rpb24gPSAkY2dpLT5wYXJhbSgnYScpOworaWYgKGRlZmluZWQgJGFjdGlvbikgeworCWlmICgkYWN0aW9uID1+IG0vW14wLTlhLXpBLVpcLlwtX10vKSB7CisJCXVuZGVmICRhY3Rpb247CisJCWRpZV9lcnJvcih1bmRlZiwgIkludmFsaWQgYWN0aW9uIHBhcmFtZXRlci4iKTsKKwl9CisJaWYgKCRhY3Rpb24gZXEgImdpdC1sb2dvLnBuZyIpIHsKKwkJZ2l0X2xvZ28oKTsKKwkJZXhpdDsKKwl9IGVsc2lmICgkYWN0aW9uIGVxICJvcG1sIikgeworCQlnaXRfb3BtbCgpOworCQlleGl0OworCX0KK30KKworbXkgJG9yZGVyID0gJGNnaS0+cGFyYW0oJ28nKTsKK2lmIChkZWZpbmVkICRvcmRlcikgeworCWlmICgkb3JkZXIgPX4gbS9bXjAtOWEtekEtWl9dLykgeworCQl1bmRlZiAkb3JkZXI7CisJCWRpZV9lcnJvcih1bmRlZiwgIkludmFsaWQgb3JkZXIgcGFyYW1ldGVyLiIpOworCX0KK30KKworbXkgJHByb2plY3QgPSAkY2dpLT5wYXJhbSgncCcpOworaWYgKGRlZmluZWQgJHByb2plY3QpIHsKKwkkcHJvamVjdCA9IHZhbGlkYXRlX2lucHV0KCRwcm9qZWN0KTsKKwlpZiAoIWRlZmluZWQoJHByb2plY3QpKSB7CisJCWRpZV9lcnJvcih1bmRlZiwgIkludmFsaWQgcHJvamVjdCBwYXJhbWV0ZXIuIik7CisJfQorCWlmICghKC1kICIkcHJvamVjdHJvb3QvJHByb2plY3QiKSkgeworCQl1bmRlZiAkcHJvamVjdDsKKwkJZGllX2Vycm9yKHVuZGVmLCAiTm8gc3VjaCBkaXJlY3RvcnkuIik7CisJfQorCWlmICghKC1lICIkcHJvamVjdHJvb3QvJHByb2plY3QvSEVBRCIpKSB7CisJCXVuZGVmICRwcm9qZWN0OworCQlkaWVfZXJyb3IodW5kZWYsICJObyBzdWNoIHByb2plY3QuIik7CisJfQorCSRyc3NfbGluayA9ICI8bGluayByZWw9XCJhbHRlcm5hdGVcIiB0aXRsZT1cIiIgLiBlc2NfcGFyYW0oJHByb2plY3QpIC4gIiBsb2dcIiBocmVmPVwiIiAuCisJCSAgICAiJG15X3VyaT8iIC4gZXNjX3BhcmFtKCJwPSRwcm9qZWN0O2E9cnNzIikgLiAiXCIgdHlwZT1cImFwcGxpY2F0aW9uL3Jzcyt4bWxcIi8+IjsKKwkkRU5WeydHSVRfRElSJ30gPSAiJHByb2plY3Ryb290LyRwcm9qZWN0IjsKK30gZWxzZSB7CisJZ2l0X3Byb2plY3RfbGlzdCgpOworCWV4aXQ7Cit9CisKK215ICRmaWxlX25hbWUgPSAkY2dpLT5wYXJhbSgnZicpOworaWYgKGRlZmluZWQgJGZpbGVfbmFtZSkgeworCSRmaWxlX25hbWUgPSB2YWxpZGF0ZV9pbnB1dCgkZmlsZV9uYW1lKTsKKwlpZiAoIWRlZmluZWQoJGZpbGVfbmFtZSkpIHsKKwkJZGllX2Vycm9yKHVuZGVmLCAiSW52YWxpZCBmaWxlIHBhcmFtZXRlci4iKTsKKwl9Cit9CisKK215ICRoYXNoID0gJGNnaS0+cGFyYW0oJ2gnKTsKK2lmIChkZWZpbmVkICRoYXNoKSB7CisJJGhhc2ggPSB2YWxpZGF0ZV9pbnB1dCgkaGFzaCk7CisJaWYgKCFkZWZpbmVkKCRoYXNoKSkgeworCQlkaWVfZXJyb3IodW5kZWYsICJJbnZhbGlkIGhhc2ggcGFyYW1ldGVyLiIpOworCX0KK30KKworbXkgJGhhc2hfcGFyZW50ID0gJGNnaS0+cGFyYW0oJ2hwJyk7CitpZiAoZGVmaW5lZCAkaGFzaF9wYXJlbnQpIHsKKwkkaGFzaF9wYXJlbnQgPSB2YWxpZGF0ZV9pbnB1dCgkaGFzaF9wYXJlbnQpOworCWlmICghZGVmaW5lZCgkaGFzaF9wYXJlbnQpKSB7CisJCWRpZV9lcnJvcih1bmRlZiwgIkludmFsaWQgaGFzaCBwYXJlbnQgcGFyYW1ldGVyLiIpOworCX0KK30KKworbXkgJGhhc2hfYmFzZSA9ICRjZ2ktPnBhcmFtKCdoYicpOworaWYgKGRlZmluZWQgJGhhc2hfYmFzZSkgeworCSRoYXNoX2Jhc2UgPSB2YWxpZGF0ZV9pbnB1dCgkaGFzaF9iYXNlKTsKKwlpZiAoIWRlZmluZWQoJGhhc2hfYmFzZSkpIHsKKwkJZGllX2Vycm9yKHVuZGVmLCAiSW52YWxpZCBoYXNoIGJhc2UgcGFyYW1ldGVyLiIpOworCX0KK30KKworbXkgJHBhZ2UgPSAkY2dpLT5wYXJhbSgncGcnKTsKK2lmIChkZWZpbmVkICRwYWdlKSB7CisJaWYgKCRwYWdlID1+IG0vW14wLTldJC8pIHsKKwkJdW5kZWYgJHBhZ2U7CisJCWRpZV9lcnJvcih1bmRlZiwgIkludmFsaWQgcGFnZSBwYXJhbWV0ZXIuIik7CisJfQorfQorCitteSAkc2VhcmNodGV4dCA9ICRjZ2ktPnBhcmFtKCdzJyk7CitpZiAoZGVmaW5lZCAkc2VhcmNodGV4dCkgeworCWlmICgkc2VhcmNodGV4dCA9fiBtL1teYS16QS1aMC05X1wuXC9cLVwrXDpcQCBdLykgeworCQl1bmRlZiAkc2VhcmNodGV4dDsKKwkJZGllX2Vycm9yKHVuZGVmLCAiSW52YWxpZCBzZWFyY2ggcGFyYW1ldGVyLiIpOworCX0KKwkkc2VhcmNodGV4dCA9IHF1b3RlbWV0YSAkc2VhcmNodGV4dDsKK30KKworc3ViIHZhbGlkYXRlX2lucHV0IHsKKwlteSAkaW5wdXQgPSBzaGlmdDsKKworCWlmICgkaW5wdXQgPX4gbS9eWzAtOWEtZkEtRl17NDB9JC8pIHsKKwkJcmV0dXJuICRpbnB1dDsKKwl9CisJaWYgKCRpbnB1dCA9fiBtLyhefFwvKSh8XC58XC5cLikoJHxcLykvKSB7CisJCXJldHVybiB1bmRlZjsKKwl9CisJaWYgKCRpbnB1dCA9fiBtL1teYS16QS1aMC05X1x4ODAtXHhmZlwgXHRcLlwvXC1cK1wjXH5cJV0vKSB7CisJCXJldHVybiB1bmRlZjsKKwl9CisJcmV0dXJuICRpbnB1dDsKK30KKworaWYgKCFkZWZpbmVkICRhY3Rpb24gfHwgJGFjdGlvbiBlcSAic3VtbWFyeSIpIHsKKwlnaXRfc3VtbWFyeSgpOworCWV4aXQ7Cit9IGVsc2lmICgkYWN0aW9uIGVxICJoZWFkcyIpIHsKKwlnaXRfaGVhZHMoKTsKKwlleGl0OworfSBlbHNpZiAoJGFjdGlvbiBlcSAidGFncyIpIHsKKwlnaXRfdGFncygpOworCWV4aXQ7Cit9IGVsc2lmICgkYWN0aW9uIGVxICJibG9iIikgeworCWdpdF9ibG9iKCk7CisJZXhpdDsKK30gZWxzaWYgKCRhY3Rpb24gZXEgImJsb2JfcGxhaW4iKSB7CisJZ2l0X2Jsb2JfcGxhaW4oKTsKKwlleGl0OworfSBlbHNpZiAoJGFjdGlvbiBlcSAidHJlZSIpIHsKKwlnaXRfdHJlZSgpOworCWV4aXQ7Cit9IGVsc2lmICgkYWN0aW9uIGVxICJyc3MiKSB7CisJZ2l0X3JzcygpOworCWV4aXQ7Cit9IGVsc2lmICgkYWN0aW9uIGVxICJjb21taXQiKSB7CisJZ2l0X2NvbW1pdCgpOworCWV4aXQ7Cit9IGVsc2lmICgkYWN0aW9uIGVxICJsb2ciKSB7CisJZ2l0X2xvZygpOworCWV4aXQ7Cit9IGVsc2lmICgkYWN0aW9uIGVxICJibG9iZGlmZiIpIHsKKwlnaXRfYmxvYmRpZmYoKTsKKwlleGl0OworfSBlbHNpZiAoJGFjdGlvbiBlcSAiYmxvYmRpZmZfcGxhaW4iKSB7CisJZ2l0X2Jsb2JkaWZmX3BsYWluKCk7CisJZXhpdDsKK30gZWxzaWYgKCRhY3Rpb24gZXEgImNvbW1pdGRpZmYiKSB7CisJZ2l0X2NvbW1pdGRpZmYoKTsKKwlleGl0OworfSBlbHNpZiAoJGFjdGlvbiBlcSAiY29tbWl0ZGlmZl9wbGFpbiIpIHsKKwlnaXRfY29tbWl0ZGlmZl9wbGFpbigpOworCWV4aXQ7Cit9IGVsc2lmICgkYWN0aW9uIGVxICJoaXN0b3J5IikgeworCWdpdF9oaXN0b3J5KCk7CisJZXhpdDsKK30gZWxzaWYgKCRhY3Rpb24gZXEgInNlYXJjaCIpIHsKKwlnaXRfc2VhcmNoKCk7CisJZXhpdDsKK30gZWxzaWYgKCRhY3Rpb24gZXEgInNob3J0bG9nIikgeworCWdpdF9zaG9ydGxvZygpOworCWV4aXQ7Cit9IGVsc2lmICgkYWN0aW9uIGVxICJ0YWciKSB7CisJZ2l0X3RhZygpOworCWV4aXQ7Cit9IGVsc2UgeworCXVuZGVmICRhY3Rpb247CisJZGllX2Vycm9yKHVuZGVmLCAiVW5rbm93biBhY3Rpb24uIik7CisJZXhpdDsKK30KKworIyBxdW90ZSB1bnNhZmUgY2hhcnMsIGJ1dCBrZWVwIHRoZSBzbGFzaCwgZXZlbiB3aGVuIGl0J3Mgbm90CisjIGNvcnJlY3QsIGJ1dCBxdW90ZWQgc2xhc2hlcyBsb29rIHRvbyBob3JyaWJsZSBpbiBib29rbWFya3MKK3N1YiBlc2NfcGFyYW0geworCW15ICRzdHIgPSBzaGlmdDsKKwkkc3RyID1+IHMvKFteQS1aYS16MC05XC1fLn4oKTtcLzs/OkAmPV0pL3NwcmludGYoIiUlJTAyWCIsIG9yZCgkMSkpL2VnOworCSRzdHIgPX4gcy9cKy8lMkIvZzsKKwkkc3RyID1+IHMvIC9cKy9nOworCXJldHVybiAkc3RyOworfQorCisjIHJlcGxhY2UgaW52YWxpZCB1dGY4IGNoYXJhY3RlciB3aXRoIFNVQlNUSVRVVElPTiBzZXF1ZW5jZQorc3ViIGVzY19odG1sIHsKKwlteSAkc3RyID0gc2hpZnQ7CisJJHN0ciA9IGRlY29kZSgidXRmOCIsICRzdHIsIEVuY29kZTo6RkJfREVGQVVMVCk7CisJJHN0ciA9IGVzY2FwZUhUTUwoJHN0cik7CisJcmV0dXJuICRzdHI7Cit9CisKKyMgZ2l0IG1heSByZXR1cm4gcXVvdGVkIGFuZCBlc2NhcGVkIGZpbGVuYW1lcworc3ViIHVucXVvdGUgeworCW15ICRzdHIgPSBzaGlmdDsKKwlpZiAoJHN0ciA9fiBtL14iKC4qKSIkLykgeworCQkkc3RyID0gJDE7CisJCSRzdHIgPX4gcy9cXChbMC03XXsxLDN9KS9jaHIob2N0KCQxKSkvZWc7CisJfQorCXJldHVybiAkc3RyOworfQorCitzdWIgZ2l0X2hlYWRlcl9odG1sIHsKKwlteSAkc3RhdHVzID0gc2hpZnQgfHwgIjIwMCBPSyI7CisJbXkgJGV4cGlyZXMgPSBzaGlmdDsKKworCW15ICR0aXRsZSA9ICJnaXQiOworCWlmIChkZWZpbmVkICRwcm9qZWN0KSB7CisJCSR0aXRsZSAuPSAiIC0gJHByb2plY3QiOworCQlpZiAoZGVmaW5lZCAkYWN0aW9uKSB7CisJCQkkdGl0bGUgLj0gIi8kYWN0aW9uIjsKKwkJfQorCX0KKwlwcmludCAkY2dpLT5oZWFkZXIoLXR5cGU9Pid0ZXh0L2h0bWwnLCAgLWNoYXJzZXQgPT4gJ3V0Zi04JywgLXN0YXR1cz0+ICRzdGF0dXMsIC1leHBpcmVzID0+ICRleHBpcmVzKTsKKwlwcmludCA8PEVPRjsKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBTdHJpY3QvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtc3RyaWN0LmR0ZCI+Cis8aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuLVVTIiBsYW5nPSJlbi1VUyI+Cis8IS0tIGdpdCB3ZWIgaW50ZXJmYWNlIHYkdmVyc2lvbiwgKEMpIDIwMDUtMjAwNiwgS2F5IFNpZXZlcnMgPGtheS5zaWV2ZXJzXEB2cmZ5Lm9yZz4sIENocmlzdGlhbiBHaWVya2UgLS0+Cis8aGVhZD4KKzxtZXRhIGh0dHAtZXF1aXY9ImNvbnRlbnQtdHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04Ii8+Cis8bWV0YSBuYW1lPSJyb2JvdHMiIGNvbnRlbnQ9ImluZGV4LCBub2ZvbGxvdyIvPgorPHRpdGxlPiR0aXRsZTwvdGl0bGU+CiskcnNzX2xpbmsKKzxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+Citib2R5IHsKKwlmb250LWZhbWlseTogc2Fucy1zZXJpZjsgZm9udC1zaXplOiAxMnB4OyBib3JkZXI6c29saWQgI2Q5ZDhkMTsgYm9yZGVyLXdpZHRoOjFweDsKKwltYXJnaW46MTBweDsgYmFja2dyb3VuZC1jb2xvcjojZmZmZmZmOyBjb2xvcjojMDAwMDAwOworfQorYSB7IGNvbG9yOiMwMDAwY2M7IH0KK2E6aG92ZXIsIGE6dmlzaXRlZCwgYTphY3RpdmUgeyBjb2xvcjojODgwMDAwOyB9CitkaXYucGFnZV9oZWFkZXIgeyBoZWlnaHQ6MjVweDsgcGFkZGluZzo4cHg7IGZvbnQtc2l6ZToxOHB4OyBmb250LXdlaWdodDpib2xkOyBiYWNrZ3JvdW5kLWNvbG9yOiNkOWQ4ZDE7IH0KK2Rpdi5wYWdlX2hlYWRlciBhOnZpc2l0ZWQsIGEuaGVhZGVyIHsgY29sb3I6IzAwMDBjYzsgfQorZGl2LnBhZ2VfaGVhZGVyIGE6aG92ZXIgeyBjb2xvcjojODgwMDAwOyB9CitkaXYucGFnZV9uYXYgeyBwYWRkaW5nOjhweDsgfQorZGl2LnBhZ2VfbmF2IGE6dmlzaXRlZCB7IGNvbG9yOiMwMDAwY2M7IH0KK2Rpdi5wYWdlX3BhdGggeyBwYWRkaW5nOjhweDsgYm9yZGVyOnNvbGlkICNkOWQ4ZDE7IGJvcmRlci13aWR0aDowcHggMHB4IDFweH0KK2Rpdi5wYWdlX2Zvb3RlciB7IGhlaWdodDoxN3B4OyBwYWRkaW5nOjRweCA4cHg7IGJhY2tncm91bmQtY29sb3I6ICNkOWQ4ZDE7IH0KK2Rpdi5wYWdlX2Zvb3Rlcl90ZXh0IHsgZmxvYXQ6bGVmdDsgY29sb3I6IzU1NTU1NTsgZm9udC1zdHlsZTppdGFsaWM7IH0KK2Rpdi5wYWdlX2JvZHkgeyBwYWRkaW5nOjhweDsgfQorZGl2LnRpdGxlLCBhLnRpdGxlIHsKKwlkaXNwbGF5OmJsb2NrOyBwYWRkaW5nOjZweCA4cHg7CisJZm9udC13ZWlnaHQ6Ym9sZDsgYmFja2dyb3VuZC1jb2xvcjojZWRlY2U2OyB0ZXh0LWRlY29yYXRpb246bm9uZTsgY29sb3I6IzAwMDAwMDsKK30KK2EudGl0bGU6aG92ZXIgeyBiYWNrZ3JvdW5kLWNvbG9yOiAjZDlkOGQxOyB9CitkaXYudGl0bGVfdGV4dCB7IHBhZGRpbmc6NnB4IDBweDsgYm9yZGVyOiBzb2xpZCAjZDlkOGQxOyBib3JkZXItd2lkdGg6MHB4IDBweCAxcHg7IH0KK2Rpdi5sb2dfYm9keSB7IHBhZGRpbmc6OHB4IDhweCA4cHggMTUwcHg7IH0KK3NwYW4uYWdlIHsgcG9zaXRpb246cmVsYXRpdmU7IGZsb2F0OmxlZnQ7IHdpZHRoOjE0MnB4OyBmb250LXN0eWxlOml0YWxpYzsgfQorZGl2LmxvZ19saW5rIHsKKwlwYWRkaW5nOjBweCA4cHg7CisJZm9udC1zaXplOjEwcHg7IGZvbnQtZmFtaWx5OnNhbnMtc2VyaWY7IGZvbnQtc3R5bGU6bm9ybWFsOworCXBvc2l0aW9uOnJlbGF0aXZlOyBmbG9hdDpsZWZ0OyB3aWR0aDoxMzZweDsKK30KK2Rpdi5saXN0X2hlYWQgeyBwYWRkaW5nOjZweCA4cHggNHB4OyBib3JkZXI6c29saWQgI2Q5ZDhkMTsgYm9yZGVyLXdpZHRoOjFweCAwcHggMHB4OyBmb250LXN0eWxlOml0YWxpYzsgfQorYS5saXN0IHsgdGV4dC1kZWNvcmF0aW9uOm5vbmU7IGNvbG9yOiMwMDAwMDA7IH0KK2EubGlzdDpob3ZlciB7IHRleHQtZGVjb3JhdGlvbjp1bmRlcmxpbmU7IGNvbG9yOiM4ODAwMDA7IH0KK2EudGV4dCB7IHRleHQtZGVjb3JhdGlvbjpub25lOyBjb2xvcjojMDAwMGNjOyB9CithLnRleHQ6dmlzaXRlZCB7IHRleHQtZGVjb3JhdGlvbjpub25lOyBjb2xvcjojODgwMDAwOyB9CithLnRleHQ6aG92ZXIgeyB0ZXh0LWRlY29yYXRpb246dW5kZXJsaW5lOyBjb2xvcjojODgwMDAwOyB9Cit0YWJsZSB7IHBhZGRpbmc6OHB4IDRweDsgfQordGggeyBwYWRkaW5nOjJweCA1cHg7IGZvbnQtc2l6ZToxMnB4OyB0ZXh0LWFsaWduOmxlZnQ7IH0KK3RyLmxpZ2h0OmhvdmVyIHsgYmFja2dyb3VuZC1jb2xvcjojZWRlY2U2OyB9Cit0ci5kYXJrIHsgYmFja2dyb3VuZC1jb2xvcjojZjZmNmYwOyB9Cit0ci5kYXJrOmhvdmVyIHsgYmFja2dyb3VuZC1jb2xvcjojZWRlY2U2OyB9Cit0ZCB7IHBhZGRpbmc6MnB4IDVweDsgZm9udC1zaXplOjEycHg7IHZlcnRpY2FsLWFsaWduOnRvcDsgfQordGQubGluayB7IHBhZGRpbmc6MnB4IDVweDsgZm9udC1mYW1pbHk6c2Fucy1zZXJpZjsgZm9udC1zaXplOjEwcHg7IH0KK2Rpdi5wcmUgeyBmb250LWZhbWlseTptb25vc3BhY2U7IGZvbnQtc2l6ZToxMnB4OyB3aGl0ZS1zcGFjZTpwcmU7IH0KK2Rpdi5kaWZmX2luZm8geyBmb250LWZhbWlseTptb25vc3BhY2U7IGNvbG9yOiMwMDAwOTk7IGJhY2tncm91bmQtY29sb3I6I2VkZWNlNjsgZm9udC1zdHlsZTppdGFsaWM7IH0KK2Rpdi5pbmRleF9pbmNsdWRlIHsgYm9yZGVyOnNvbGlkICNkOWQ4ZDE7IGJvcmRlci13aWR0aDowcHggMHB4IDFweDsgcGFkZGluZzoxMnB4IDhweDsgfQorZGl2LnNlYXJjaCB7IG1hcmdpbjo0cHggOHB4OyBwb3NpdGlvbjphYnNvbHV0ZTsgdG9wOjU2cHg7IHJpZ2h0OjEycHggfQorYS5saW5lbnIgeyBjb2xvcjojOTk5OTk5OyB0ZXh0LWRlY29yYXRpb246bm9uZSB9CithLnJzc19sb2dvIHsKKwlmbG9hdDpyaWdodDsgcGFkZGluZzozcHggMHB4OyB3aWR0aDozNXB4OyBsaW5lLWhlaWdodDoxMHB4OworCWJvcmRlcjoxcHggc29saWQ7IGJvcmRlci1jb2xvcjojZmNjN2E1ICM3ZDMzMDIgIzNlMWEwMSAjZmY5NTRlOworCWNvbG9yOiNmZmZmZmY7IGJhY2tncm91bmQtY29sb3I6I2ZmNjYwMDsKKwlmb250LXdlaWdodDpib2xkOyBmb250LWZhbWlseTpzYW5zLXNlcmlmOyBmb250LXNpemU6MTBweDsKKwl0ZXh0LWFsaWduOmNlbnRlcjsgdGV4dC1kZWNvcmF0aW9uOm5vbmU7Cit9CithLnJzc19sb2dvOmhvdmVyIHsgYmFja2dyb3VuZC1jb2xvcjojZWU1NTAwOyB9CitzcGFuLnRhZyB7CisJcGFkZGluZzowcHggNHB4OyBmb250LXNpemU6MTBweDsgZm9udC13ZWlnaHQ6bm9ybWFsOworCWJhY2tncm91bmQtY29sb3I6I2ZmZmZhYTsgYm9yZGVyOjFweCBzb2xpZDsgYm9yZGVyLWNvbG9yOiNmZmZmY2MgI2ZmZWUwMCAjZmZlZTAwICNmZmZmY2M7Cit9Cis8L3N0eWxlPgorPC9oZWFkPgorPGJvZHk+CitFT0YKKwlwcmludCAiPGRpdiBjbGFzcz1cInBhZ2VfaGVhZGVyXCI+XG4iIC4KKwkgICAgICAiPGEgaHJlZj1cImh0dHA6Ly93d3cua2VybmVsLm9yZy9wdWIvc29mdHdhcmUvc2NtL2dpdC9kb2NzL1wiIHRpdGxlPVwiZ2l0IGRvY3VtZW50YXRpb25cIj4iIC4KKwkgICAgICAiPGltZyBzcmM9XCIkbXlfdXJpPyIgLiBlc2NfcGFyYW0oImE9Z2l0LWxvZ28ucG5nIikgLiAiXCIgd2lkdGg9XCI3MlwiIGhlaWdodD1cIjI3XCIgYWx0PVwiZ2l0XCIgc3R5bGU9XCJmbG9hdDpyaWdodDsgYm9yZGVyLXdpZHRoOjBweDtcIi8+IiAuCisJICAgICAgIjwvYT5cbiI7CisJcHJpbnQgJGNnaS0+YSh7LWhyZWYgPT4gZXNjX3BhcmFtKCRob21lX2xpbmspfSwgInByb2plY3RzIikgLiAiIC8gIjsKKwlpZiAoZGVmaW5lZCAkcHJvamVjdCkgeworCQlwcmludCAkY2dpLT5hKHstaHJlZiA9PiAiJG15X3VyaT8iIC4gZXNjX3BhcmFtKCJwPSRwcm9qZWN0O2E9c3VtbWFyeSIpfSwgZXNjX2h0bWwoJHByb2plY3QpKTsKKwkJaWYgKGRlZmluZWQgJGFjdGlvbikgeworCQkJcHJpbnQgIiAvICRhY3Rpb24iOworCQl9CisJCXByaW50ICJcbiI7CisJCWlmICghZGVmaW5lZCAkc2VhcmNodGV4dCkgeworCQkJJHNlYXJjaHRleHQgPSAiIjsKKwkJfQorCQlteSAkc2VhcmNoX2hhc2g7CisJCWlmIChkZWZpbmVkICRoYXNoKSB7CisJCQkkc2VhcmNoX2hhc2ggPSAkaGFzaDsKKwkJfSBlbHNlIHsKKwkJCSRzZWFyY2hfaGFzaCAgPSAiSEVBRCI7CisJCX0KKwkJJGNnaS0+cGFyYW0oImEiLCAic2VhcmNoIik7CisJCSRjZ2ktPnBhcmFtKCJoIiwgJHNlYXJjaF9oYXNoKTsKKwkJcHJpbnQgJGNnaS0+c3RhcnRmb3JtKC1tZXRob2QgPT4gImdldCIsIC1hY3Rpb24gPT4gJG15X3VyaSkgLgorCQkgICAgICAiPGRpdiBjbGFzcz1cInNlYXJjaFwiPlxuIiAuCisJCSAgICAgICRjZ2ktPmhpZGRlbigtbmFtZSA9PiAicCIpIC4gIlxuIiAuCisJCSAgICAgICRjZ2ktPmhpZGRlbigtbmFtZSA9PiAiYSIpIC4gIlxuIiAuCisJCSAgICAgICRjZ2ktPmhpZGRlbigtbmFtZSA9PiAiaCIpIC4gIlxuIiAuCisJCSAgICAgICRjZ2ktPnRleHRmaWVsZCgtbmFtZSA9PiAicyIsIC12YWx1ZSA9PiAkc2VhcmNodGV4dCkgLiAiXG4iIC4KKwkJICAgICAgIjwvZGl2PiIgLgorCQkgICAgICAkY2dpLT5lbmRfZm9ybSgpIC4gIlxuIjsKKwl9CisJcHJpbnQgIjwvZGl2PlxuIjsKK30KKworc3ViIGdpdF9mb290ZXJfaHRtbCB7CisJcHJpbnQgIjxkaXYgY2xhc3M9XCJwYWdlX2Zvb3RlclwiPlxuIjsKKwlpZiAoZGVmaW5lZCAkcHJvamVjdCkgeworCQlteSAkZGVzY3IgPSBnaXRfcmVhZF9kZXNjcmlwdGlvbigkcHJvamVjdCk7CisJCWlmIChkZWZpbmVkICRkZXNjcikgeworCQkJcHJpbnQgIjxkaXYgY2xhc3M9XCJwYWdlX2Zvb3Rlcl90ZXh0XCI+IiAuIGVzY19odG1sKCRkZXNjcikgLiAiPC9kaXY+XG4iOworCQl9CisJCXByaW50ICRjZ2ktPmEoey1ocmVmID0+ICIkbXlfdXJpPyIgLiBlc2NfcGFyYW0oInA9JHByb2plY3Q7YT1yc3MiKSwgLWNsYXNzID0+ICJyc3NfbG9nbyJ9LCAiUlNTIikgLiAiXG4iOworCX0gZWxzZSB7CisJCXByaW50ICRjZ2ktPmEoey1ocmVmID0+ICIkbXlfdXJpPyIgLiBlc2NfcGFyYW0oImE9b3BtbCIpLCAtY2xhc3MgPT4gInJzc19sb2dvIn0sICJPUE1MIikgLiAiXG4iOworCX0KKwlwcmludCAiPC9kaXY+XG4iIC4KKwkgICAgICAiPC9ib2R5PlxuIiAuCisJICAgICAgIjwvaHRtbD4iOworfQorCitzdWIgZGllX2Vycm9yIHsKKwlteSAkc3RhdHVzID0gc2hpZnQgfHwgIjQwMyBGb3JiaWRkZW4iOworCW15ICRlcnJvciA9IHNoaWZ0IHx8ICJNYWxmb3JtZWQgcXVlcnksIGZpbGUgbWlzc2luZyBvciBwZXJtaXNzaW9uIGRlbmllZCI7IAorCisJZ2l0X2hlYWRlcl9odG1sKCRzdGF0dXMpOworCXByaW50ICI8ZGl2IGNsYXNzPVwicGFnZV9ib2R5XCI+XG4iIC4KKwkgICAgICAiPGJyLz48YnIvPlxuIiAuCisJICAgICAgIiRzdGF0dXMgLSAkZXJyb3JcbiIgLgorCSAgICAgICI8YnIvPlxuIiAuCisJICAgICAgIjwvZGl2PlxuIjsKKwlnaXRfZm9vdGVyX2h0bWwoKTsKKwlleGl0OworfQorCitzdWIgZ2l0X2dldF90eXBlIHsKKwlteSAkaGFzaCA9IHNoaWZ0OworCisJb3BlbiBteSAkZmQsICItfCIsICIkZ2l0YmluL2dpdC1jYXQtZmlsZSAtdCAkaGFzaCIgb3IgcmV0dXJuOworCW15ICR0eXBlID0gPCRmZD47CisJY2xvc2UgJGZkIG9yIHJldHVybjsKKwljaG9tcCAkdHlwZTsKKwlyZXR1cm4gJHR5cGU7Cit9CisKK3N1YiBnaXRfcmVhZF9oZWFkIHsKKwlteSAkcHJvamVjdCA9IHNoaWZ0OworCW15ICRvRU5WID0gJEVOVnsnR0lUX0RJUid9OworCW15ICRyZXR2YWwgPSB1bmRlZjsKKwkkRU5WeydHSVRfRElSJ30gPSAiJHByb2plY3Ryb290LyRwcm9qZWN0IjsKKwlpZiAob3BlbiBteSAkZmQsICItfCIsICIkZ2l0YmluL2dpdC1yZXYtcGFyc2UiLCAiLS12ZXJpZnkiLCAiSEVBRCIpIHsKKwkJbXkgJGhlYWQgPSA8JGZkPjsKKwkJY2xvc2UgJGZkOworCQlpZiAoZGVmaW5lZCAkaGVhZCAmJiAkaGVhZCA9fiAvXihbMC05YS1mQS1GXXs0MH0pJC8pIHsKKwkJCSRyZXR2YWwgPSAkMTsKKwkJfQorCX0KKwlpZiAoZGVmaW5lZCAkb0VOVikgeworCQkkRU5WeydHSVRfRElSJ30gPSAkb0VOVjsKKwl9CisJcmV0dXJuICRyZXR2YWw7Cit9CisKK3N1YiBnaXRfcmVhZF9oYXNoIHsKKwlteSAkcGF0aCA9IHNoaWZ0OworCisJb3BlbiBteSAkZmQsICIkcHJvamVjdHJvb3QvJHBhdGgiIG9yIHJldHVybiB1bmRlZjsKKwlteSAkaGVhZCA9IDwkZmQ+OworCWNsb3NlICRmZDsKKwljaG9tcCAkaGVhZDsKKwlpZiAoJGhlYWQgPX4gbS9eWzAtOWEtZkEtRl17NDB9JC8pIHsKKwkJcmV0dXJuICRoZWFkOworCX0KK30KKworc3ViIGdpdF9yZWFkX2Rlc2NyaXB0aW9uIHsKKwlteSAkcGF0aCA9IHNoaWZ0OworCisJb3BlbiBteSAkZmQsICIkcHJvamVjdHJvb3QvJHBhdGgvZGVzY3JpcHRpb24iIG9yIHJldHVybiB1bmRlZjsKKwlteSAkZGVzY3IgPSA8JGZkPjsKKwljbG9zZSAkZmQ7CisJY2hvbXAgJGRlc2NyOworCXJldHVybiAkZGVzY3I7Cit9CisKK3N1YiBnaXRfcmVhZF90YWcgeworCW15ICR0YWdfaWQgPSBzaGlmdDsKKwlteSAldGFnOworCW15IEBjb21tZW50OworCisJb3BlbiBteSAkZmQsICItfCIsICIkZ2l0YmluL2dpdC1jYXQtZmlsZSB0YWcgJHRhZ19pZCIgb3IgcmV0dXJuOworCSR0YWd7J2lkJ30gPSAkdGFnX2lkOworCXdoaWxlIChteSAkbGluZSA9IDwkZmQ+KSB7CisJCWNob21wICRsaW5lOworCQlpZiAoJGxpbmUgPX4gbS9eb2JqZWN0IChbMC05YS1mQS1GXXs0MH0pJC8pIHsKKwkJCSR0YWd7J29iamVjdCd9ID0gJDE7CisJCX0gZWxzaWYgKCRsaW5lID1+IG0vXnR5cGUgKC4rKSQvKSB7CisJCQkkdGFneyd0eXBlJ30gPSAkMTsKKwkJfSBlbHNpZiAoJGxpbmUgPX4gbS9edGFnICguKykkLykgeworCQkJJHRhZ3snbmFtZSd9ID0gJDE7CisJCX0gZWxzaWYgKCRsaW5lID1+IG0vXnRhZ2dlciAoLiopIChbMC05XSspICguKikkLykgeworCQkJJHRhZ3snYXV0aG9yJ30gPSAkMTsKKwkJCSR0YWd7J2Vwb2NoJ30gPSAkMjsKKwkJCSR0YWd7J3R6J30gPSAkMzsKKwkJfSBlbHNpZiAoJGxpbmUgPX4gbS8tLUJFR0lOLykgeworCQkJcHVzaCBAY29tbWVudCwgJGxpbmU7CisJCQlsYXN0OworCQl9IGVsc2lmICgkbGluZSBlcSAiIikgeworCQkJbGFzdDsKKwkJfQorCX0KKwlwdXNoIEBjb21tZW50LCA8JGZkPjsKKwkkdGFneydjb21tZW50J30gPSBcQGNvbW1lbnQ7CisJY2xvc2UgJGZkIG9yIHJldHVybjsKKwlpZiAoIWRlZmluZWQgJHRhZ3snbmFtZSd9KSB7CisJCXJldHVybgorCX07CisJcmV0dXJuICV0YWcKK30KKworc3ViIGFnZV9zdHJpbmcgeworCW15ICRhZ2UgPSBzaGlmdDsKKwlteSAkYWdlX3N0cjsKKworCWlmICgkYWdlID4gNjAqNjAqMjQqMzY1KjIpIHsKKwkJJGFnZV9zdHIgPSAoaW50ICRhZ2UvNjAvNjAvMjQvMzY1KTsKKwkJJGFnZV9zdHIgLj0gIiB5ZWFycyBhZ28iOworCX0gZWxzaWYgKCRhZ2UgPiA2MCo2MCoyNCooMzY1LzEyKSoyKSB7CisJCSRhZ2Vfc3RyID0gaW50ICRhZ2UvNjAvNjAvMjQvKDM2NS8xMik7CisJCSRhZ2Vfc3RyIC49ICIgbW9udGhzIGFnbyI7CisJfSBlbHNpZiAoJGFnZSA+IDYwKjYwKjI0KjcqMikgeworCQkkYWdlX3N0ciA9IGludCAkYWdlLzYwLzYwLzI0Lzc7CisJCSRhZ2Vfc3RyIC49ICIgd2Vla3MgYWdvIjsKKwl9IGVsc2lmICgkYWdlID4gNjAqNjAqMjQqMikgeworCQkkYWdlX3N0ciA9IGludCAkYWdlLzYwLzYwLzI0OworCQkkYWdlX3N0ciAuPSAiIGRheXMgYWdvIjsKKwl9IGVsc2lmICgkYWdlID4gNjAqNjAqMikgeworCQkkYWdlX3N0ciA9IGludCAkYWdlLzYwLzYwOworCQkkYWdlX3N0ciAuPSAiIGhvdXJzIGFnbyI7CisJfSBlbHNpZiAoJGFnZSA+IDYwKjIpIHsKKwkJJGFnZV9zdHIgPSBpbnQgJGFnZS82MDsKKwkJJGFnZV9zdHIgLj0gIiBtaW4gYWdvIjsKKwl9IGVsc2lmICgkYWdlID4gMikgeworCQkkYWdlX3N0ciA9IGludCAkYWdlOworCQkkYWdlX3N0ciAuPSAiIHNlYyBhZ28iOworCX0gZWxzZSB7CisJCSRhZ2Vfc3RyIC49ICIgcmlnaHQgbm93IjsKKwl9CisJcmV0dXJuICRhZ2Vfc3RyOworfQorCitzdWIgZ2l0X3JlYWRfY29tbWl0IHsKKwlteSAkY29tbWl0X2lkID0gc2hpZnQ7CisJbXkgJGNvbW1pdF90ZXh0ID0gc2hpZnQ7CisKKwlteSBAY29tbWl0X2xpbmVzOworCW15ICVjbzsKKworCWlmIChkZWZpbmVkICRjb21taXRfdGV4dCkgeworCQlAY29tbWl0X2xpbmVzID0gQCRjb21taXRfdGV4dDsKKwl9IGVsc2UgeworCQkkLyA9ICJcMCI7CisJCW9wZW4gbXkgJGZkLCAiLXwiLCAiJGdpdGJpbi9naXQtcmV2LWxpc3QgLS1oZWFkZXIgLS1wYXJlbnRzIC0tbWF4LWNvdW50PTEgJGNvbW1pdF9pZCIgb3IgcmV0dXJuOworCQlAY29tbWl0X2xpbmVzID0gc3BsaXQgJ1xuJywgPCRmZD47CisJCWNsb3NlICRmZCBvciByZXR1cm47CisJCSQvID0gIlxuIjsKKwkJcG9wIEBjb21taXRfbGluZXM7CisJfQorCW15ICRoZWFkZXIgPSBzaGlmdCBAY29tbWl0X2xpbmVzOworCWlmICghKCRoZWFkZXIgPX4gbS9eWzAtOWEtZkEtRl17NDB9LykpIHsKKwkJcmV0dXJuOworCX0KKwkoJGNveydpZCd9LCBteSBAcGFyZW50cykgPSBzcGxpdCAnICcsICRoZWFkZXI7CisJJGNveydwYXJlbnRzJ30gPSBcQHBhcmVudHM7CisJJGNveydwYXJlbnQnfSA9ICRwYXJlbnRzWzBdOworCXdoaWxlIChteSAkbGluZSA9IHNoaWZ0IEBjb21taXRfbGluZXMpIHsKKwkJbGFzdCBpZiAkbGluZSBlcSAiXG4iOworCQlpZiAoJGxpbmUgPX4gbS9edHJlZSAoWzAtOWEtZkEtRl17NDB9KSQvKSB7CisJCQkkY297J3RyZWUnfSA9ICQxOworCQl9IGVsc2lmICgkbGluZSA9fiBtL15hdXRob3IgKC4qKSAoWzAtOV0rKSAoLiopJC8pIHsKKwkJCSRjb3snYXV0aG9yJ30gPSAkMTsKKwkJCSRjb3snYXV0aG9yX2Vwb2NoJ30gPSAkMjsKKwkJCSRjb3snYXV0aG9yX3R6J30gPSAkMzsKKwkJCWlmICgkY297J2F1dGhvcid9ID1+IG0vXihbXjxdKykgPC8pIHsKKwkJCQkkY297J2F1dGhvcl9uYW1lJ30gPSAkMTsKKwkJCX0gZWxzZSB7CisJCQkJJGNveydhdXRob3JfbmFtZSd9ID0gJGNveydhdXRob3InfTsKKwkJCX0KKwkJfSBlbHNpZiAoJGxpbmUgPX4gbS9eY29tbWl0dGVyICguKikgKFswLTldKykgKC4qKSQvKSB7CisJCQkkY297J2NvbW1pdHRlcid9ID0gJDE7CisJCQkkY297J2NvbW1pdHRlcl9lcG9jaCd9ID0gJDI7CisJCQkkY297J2NvbW1pdHRlcl90eid9ID0gJDM7CisJCQkkY297J2NvbW1pdHRlcl9uYW1lJ30gPSAkY297J2NvbW1pdHRlcid9OworCQkJJGNveydjb21taXR0ZXJfbmFtZSd9ID1+IHMvIDwuKi8vOworCQl9CisJfQorCWlmICghZGVmaW5lZCAkY297J3RyZWUnfSkgeworCQlyZXR1cm47CisJfTsKKworCWZvcmVhY2ggbXkgJHRpdGxlIChAY29tbWl0X2xpbmVzKSB7CisJCSR0aXRsZSA9fiBzL14gICAgLy87CisJCWlmICgkdGl0bGUgbmUgIiIpIHsKKwkJCSRjb3sndGl0bGUnfSA9IGNob3Bfc3RyKCR0aXRsZSwgODAsIDUpOworCQkJIyByZW1vdmUgbGVhZGluZyBzdHVmZiBvZiBtZXJnZXMgdG8gbWFrZSB0aGUgaW50ZXJlc3RpbmcgcGFydCB2aXNpYmxlCisJCQlpZiAobGVuZ3RoKCR0aXRsZSkgPiA1MCkgeworCQkJCSR0aXRsZSA9fiBzL15BdXRvbWF0aWMgLy87CisJCQkJJHRpdGxlID1+IHMvXm1lcmdlIChvZnx3aXRoKSAvTWVyZ2UgLi4uIC9pOworCQkJCWlmIChsZW5ndGgoJHRpdGxlKSA+IDUwKSB7CisJCQkJCSR0aXRsZSA9fiBzLyhodHRwfHJzeW5jKTpcL1wvLy87CisJCQkJfQorCQkJCWlmIChsZW5ndGgoJHRpdGxlKSA+IDUwKSB7CisJCQkJCSR0aXRsZSA9fiBzLyhtYXN0ZXJ8d3d3fHJzeW5jKVwuLy87CisJCQkJfQorCQkJCWlmIChsZW5ndGgoJHRpdGxlKSA+IDUwKSB7CisJCQkJCSR0aXRsZSA9fiBzL2tlcm5lbC5vcmc6Py8vOworCQkJCX0KKwkJCQlpZiAobGVuZ3RoKCR0aXRsZSkgPiA1MCkgeworCQkJCQkkdGl0bGUgPX4gcy9cL3B1Ylwvc2NtLy87CisJCQkJfQorCQkJfQorCQkJJGNveyd0aXRsZV9zaG9ydCd9ID0gY2hvcF9zdHIoJHRpdGxlLCA1MCwgNSk7CisJCQlsYXN0OworCQl9CisJfQorCSMgcmVtb3ZlIGFkZGVkIHNwYWNlcworCWZvcmVhY2ggbXkgJGxpbmUgKEBjb21taXRfbGluZXMpIHsKKwkJJGxpbmUgPX4gcy9eICAgIC8vOworCX0KKwkkY297J2NvbW1lbnQnfSA9IFxAY29tbWl0X2xpbmVzOworCisJbXkgJGFnZSA9IHRpbWUgLSAkY297J2NvbW1pdHRlcl9lcG9jaCd9OworCSRjb3snYWdlJ30gPSAkYWdlOworCSRjb3snYWdlX3N0cmluZyd9ID0gYWdlX3N0cmluZygkYWdlKTsKKwlteSAoJHNlYywgJG1pbiwgJGhvdXIsICRtZGF5LCAkbW9uLCAkeWVhciwgJHdkYXksICR5ZGF5KSA9IGdtdGltZSgkY297J2NvbW1pdHRlcl9lcG9jaCd9KTsKKwlpZiAoJGFnZSA+IDYwKjYwKjI0KjcqMikgeworCQkkY297J2FnZV9zdHJpbmdfZGF0ZSd9ID0gc3ByaW50ZiAiJTRpLSUwMnUtJTAyaSIsIDE5MDAgKyAkeWVhciwgJG1vbisxLCAkbWRheTsKKwkJJGNveydhZ2Vfc3RyaW5nX2FnZSd9ID0gJGNveydhZ2Vfc3RyaW5nJ307CisJfSBlbHNlIHsKKwkJJGNveydhZ2Vfc3RyaW5nX2RhdGUnfSA9ICRjb3snYWdlX3N0cmluZyd9OworCQkkY297J2FnZV9zdHJpbmdfYWdlJ30gPSBzcHJpbnRmICIlNGktJTAydS0lMDJpIiwgMTkwMCArICR5ZWFyLCAkbW9uKzEsICRtZGF5OworCX0KKwlyZXR1cm4gJWNvOworfQorCitzdWIgZ2l0X2RpZmZfcHJpbnQgeworCW15ICRmcm9tID0gc2hpZnQ7CisJbXkgJGZyb21fbmFtZSA9IHNoaWZ0OworCW15ICR0byA9IHNoaWZ0OworCW15ICR0b19uYW1lID0gc2hpZnQ7CisJbXkgJGZvcm1hdCA9IHNoaWZ0IHx8ICJodG1sIjsKKworCW15ICRmcm9tX3RtcCA9ICIvZGV2L251bGwiOworCW15ICR0b190bXAgPSAiL2Rldi9udWxsIjsKKwlteSAkcGlkID0gJCQ7CisKKwkjIGNyZWF0ZSB0bXAgZnJvbS1maWxlCisJaWYgKGRlZmluZWQgJGZyb20pIHsKKwkJJGZyb21fdG1wID0gIiRnaXRfdGVtcC9naXR3ZWJfIiAuICQkIC4gIl9mcm9tIjsKKwkJb3BlbiBteSAkZmQyLCAiPiAkZnJvbV90bXAiOworCQlvcGVuIG15ICRmZCwgIi18IiwgIiRnaXRiaW4vZ2l0LWNhdC1maWxlIGJsb2IgJGZyb20iOworCQlteSBAZmlsZSA9IDwkZmQ+OworCQlwcmludCAkZmQyIEBmaWxlOworCQljbG9zZSAkZmQyOworCQljbG9zZSAkZmQ7CisJfQorCisJIyBjcmVhdGUgdG1wIHRvLWZpbGUKKwlpZiAoZGVmaW5lZCAkdG8pIHsKKwkJJHRvX3RtcCA9ICIkZ2l0X3RlbXAvZ2l0d2ViXyIgLiAkJCAuICJfdG8iOworCQlvcGVuIG15ICRmZDIsICI+ICR0b190bXAiOworCQlvcGVuIG15ICRmZCwgIi18IiwgIiRnaXRiaW4vZ2l0LWNhdC1maWxlIGJsb2IgJHRvIjsKKwkJbXkgQGZpbGUgPSA8JGZkPjsKKwkJcHJpbnQgJGZkMiBAZmlsZTsKKwkJY2xvc2UgJGZkMjsKKwkJY2xvc2UgJGZkOworCX0KKworCW9wZW4gbXkgJGZkLCAiLXwiLCAiL3Vzci9iaW4vZGlmZiAtdSAtcCAtTCBcJyRmcm9tX25hbWVcJyAtTCBcJyR0b19uYW1lXCcgJGZyb21fdG1wICR0b190bXAiOworCWlmICgkZm9ybWF0IGVxICJwbGFpbiIpIHsKKwkJdW5kZWYgJC87CisJCXByaW50IDwkZmQ+OworCQkkLyA9ICJcbiI7CisJfSBlbHNlIHsKKwkJd2hpbGUgKG15ICRsaW5lID0gPCRmZD4pIHsKKwkJCWNob21wKCRsaW5lKTsKKwkJCW15ICRjaGFyID0gc3Vic3RyKCRsaW5lLCAwLCAxKTsKKwkJCW15ICRjb2xvciA9ICIiOworCQkJaWYgKCRjaGFyIGVxICcrJykgeworCQkJCSRjb2xvciA9ICIgc3R5bGU9XCJjb2xvcjojMDA4ODAwO1wiIjsKKwkJCX0gZWxzaWYgKCRjaGFyIGVxICItIikgeworCQkJCSRjb2xvciA9ICIgc3R5bGU9XCJjb2xvcjojY2MwMDAwO1wiIjsKKwkJCX0gZWxzaWYgKCRjaGFyIGVxICJAIikgeworCQkJCSRjb2xvciA9ICIgc3R5bGU9XCJjb2xvcjojOTkwMDk5O1wiIjsKKwkJCX0gZWxzaWYgKCRjaGFyIGVxICJcXCIpIHsKKwkJCQkjIHNraXAgZXJyb3JzCisJCQkJbmV4dDsKKwkJCX0KKwkJCXdoaWxlICgobXkgJHBvcyA9IGluZGV4KCRsaW5lLCAiXHQiKSkgIT0gLTEpIHsKKwkJCQlpZiAobXkgJGNvdW50ID0gKDggLSAoKCRwb3MtMSkgJSA4KSkpIHsKKwkJCQkJbXkgJHNwYWNlcyA9ICcgJyB4ICRjb3VudDsKKwkJCQkJJGxpbmUgPX4gcy9cdC8kc3BhY2VzLzsKKwkJCQl9CisJCQl9CisJCQlwcmludCAiPGRpdiBjbGFzcz1cInByZVwiJGNvbG9yPiIgLiBlc2NfaHRtbCgkbGluZSkgLiAiPC9kaXY+XG4iOworCQl9CisJfQorCWNsb3NlICRmZDsKKworCWlmIChkZWZpbmVkICRmcm9tKSB7CisJCXVubGluaygkZnJvbV90bXApOworCX0KKwlpZiAoZGVmaW5lZCAkdG8pIHsKKwkJdW5saW5rKCR0b190bXApOworCX0KK30KKworc3ViIG1vZGVfc3RyIHsKKwlteSAkbW9kZSA9IG9jdCBzaGlmdDsKKworCWlmIChTX0lTRElSKCRtb2RlICYgU19JRk1UKSkgeworCQlyZXR1cm4gJ2Ryd3hyLXhyLXgnOworCX0gZWxzaWYgKFNfSVNMTksoJG1vZGUpKSB7CisJCXJldHVybiAnbHJ3eHJ3eHJ3eCc7CisJfSBlbHNpZiAoU19JU1JFRygkbW9kZSkpIHsKKwkJIyBnaXQgY2FyZXMgb25seSBhYm91dCB0aGUgZXhlY3V0YWJsZSBiaXQKKwkJaWYgKCRtb2RlICYgU19JWFVTUikgeworCQkJcmV0dXJuICctcnd4ci14ci14JzsKKwkJfSBlbHNlIHsKKwkJCXJldHVybiAnLXJ3LXItLXItLSc7CisJCX07CisJfSBlbHNlIHsKKwkJcmV0dXJuICctLS0tLS0tLS0tJzsKKwl9Cit9CisKK3N1YiBjaG9wX3N0ciB7CisJbXkgJHN0ciA9IHNoaWZ0OworCW15ICRsZW4gPSBzaGlmdDsKKwlteSAkYWRkX2xlbiA9IHNoaWZ0IHx8IDEwOworCisJIyBhbGxvdyBvbmx5ICRsZW4gY2hhcnMsIGJ1dCBkb24ndCBjdXQgYSB3b3JkIGlmIGl0IHdvdWxkIGZpdCBpbiAkYWRkX2xlbgorCSMgaWYgaXQgZG9lc24ndCBmaXQsIGN1dCBpdCBpZiBpdCdzIHN0aWxsIGxvbmdlciB0aGFuIHRoZSBkb3RzIHdlIHdvdWxkIGFkZAorCSRzdHIgPX4gbS9eKC57MCwkbGVufVteIFwvXC1fOlwuQF17MCwkYWRkX2xlbn0pKC4qKS87CisJbXkgJGJvZHkgPSAkMTsKKwlteSAkdGFpbCA9ICQyOworCWlmIChsZW5ndGgoJHRhaWwpID4gNCkgeworCQkkdGFpbCA9ICIgLi4uIjsKKwl9CisJcmV0dXJuICIkYm9keSR0YWlsIjsKK30KKworc3ViIGZpbGVfdHlwZSB7CisJbXkgJG1vZGUgPSBvY3Qgc2hpZnQ7CisKKwlpZiAoU19JU0RJUigkbW9kZSAmIFNfSUZNVCkpIHsKKwkJcmV0dXJuICJkaXJlY3RvcnkiOworCX0gZWxzaWYgKFNfSVNMTksoJG1vZGUpKSB7CisJCXJldHVybiAic3ltbGluayI7CisJfSBlbHNpZiAoU19JU1JFRygkbW9kZSkpIHsKKwkJcmV0dXJuICJmaWxlIjsKKwl9IGVsc2UgeworCQlyZXR1cm4gInVua25vd24iOworCX0KK30KKworc3ViIGZvcm1hdF9sb2dfbGluZV9odG1sIHsKKwlteSAkbGluZSA9IHNoaWZ0OworCisJJGxpbmUgPSBlc2NfaHRtbCgkbGluZSk7CisJJGxpbmUgPX4gcy8gLyZuYnNwOy9nOworCWlmICgkbGluZSA9fiBtLyhbMC05YS1mQS1GXXs0MH0pLykgeworCQlteSAkaGFzaF90ZXh0ID0gJDE7CisJCWlmIChnaXRfZ2V0X3R5cGUoJGhhc2hfdGV4dCkgZXEgImNvbW1pdCIpIHsKKwkJCW15ICRsaW5rID0gJGNnaS0+YSh7LWNsYXNzID0+ICJ0ZXh0IiwgLWhyZWYgPT4gIiRteV91cmk/IiAuIGVzY19wYXJhbSgicD0kcHJvamVjdDthPWNvbW1pdDtoPSRoYXNoX3RleHQiKX0sICRoYXNoX3RleHQpOworCQkJJGxpbmUgPX4gcy8kaGFzaF90ZXh0LyRsaW5rLzsKKwkJfQorCX0KKwlyZXR1cm4gJGxpbmU7Cit9CisKK3N1YiBkYXRlX3N0ciB7CisJbXkgJGVwb2NoID0gc2hpZnQ7CisJbXkgJHR6ID0gc2hpZnQgfHwgIi0wMDAwIjsKKworCW15ICVkYXRlOworCW15IEBtb250aHMgPSAoIkphbiIsICJGZWIiLCAiTWFyIiwgIkFwciIsICJNYXkiLCAiSnVuIiwgIkp1bCIsICJBdWciLCAiU2VwIiwgIk9jdCIsICJOb3YiLCAiRGVjIik7CisJbXkgQGRheXMgPSAoIlN1biIsICJNb24iLCAiVHVlIiwgIldlZCIsICJUaHUiLCAiRnJpIiwgIlNhdCIpOworCW15ICgkc2VjLCAkbWluLCAkaG91ciwgJG1kYXksICRtb24sICR5ZWFyLCAkd2RheSwgJHlkYXkpID0gZ210aW1lKCRlcG9jaCk7CisJJGRhdGV7J2hvdXInfSA9ICRob3VyOworCSRkYXRleydtaW51dGUnfSA9ICRtaW47CisJJGRhdGV7J21kYXknfSA9ICRtZGF5OworCSRkYXRleydkYXknfSA9ICRkYXlzWyR3ZGF5XTsKKwkkZGF0ZXsnbW9udGgnfSA9ICRtb250aHNbJG1vbl07CisJJGRhdGV7J3JmYzI4MjInfSA9IHNwcmludGYgIiVzLCAlZCAlcyAlNGQgJTAyZDolMDJkOiUwMmQgKzAwMDAiLCAkZGF5c1skd2RheV0sICRtZGF5LCAkbW9udGhzWyRtb25dLCAxOTAwKyR5ZWFyLCAkaG91ciAsJG1pbiwgJHNlYzsKKwkkZGF0ZXsnbWRheS10aW1lJ30gPSBzcHJpbnRmICIlZCAlcyAlMDJkOiUwMmQiLCAkbWRheSwgJG1vbnRoc1skbW9uXSwgJGhvdXIgLCRtaW47CisKKwkkdHogPX4gbS9eKFsrXC1dWzAtOV1bMC05XSkoWzAtOV1bMC05XSkkLzsKKwlteSAkbG9jYWwgPSAkZXBvY2ggKyAoKGludCAkMSArICgkMi82MCkpICogMzYwMCk7CisJKCRzZWMsICRtaW4sICRob3VyLCAkbWRheSwgJG1vbiwgJHllYXIsICR3ZGF5LCAkeWRheSkgPSBnbXRpbWUoJGxvY2FsKTsKKwkkZGF0ZXsnaG91cl9sb2NhbCd9ID0gJGhvdXI7CisJJGRhdGV7J21pbnV0ZV9sb2NhbCd9ID0gJG1pbjsKKwkkZGF0ZXsndHpfbG9jYWwnfSA9ICR0ejsKKwlyZXR1cm4gJWRhdGU7Cit9CisKKyMgZ2l0LWxvZ28gKGNhY2hlZCBpbiBicm93c2VyIGZvciBvbmUgZGF5KQorc3ViIGdpdF9sb2dvIHsKKwliaW5tb2RlIFNURE9VVCwgJzpyYXcnOworCXByaW50ICRjZ2ktPmhlYWRlcigtdHlwZSA9PiAnaW1hZ2UvcG5nJywgLWV4cGlyZXMgPT4gJysxZCcpOworCSMgY2F0IGdpdC1sb2dvLnBuZyB8IGhleGR1bXAgLWUgJzE2LzEgIiAlMDJ4IiAgIlxuIicgfCBzZWQgJ3MvIC9cXHgvZycKKwlwcmludAkiXHg4OVx4NTBceDRlXHg0N1x4MGRceDBhXHgxYVx4MGFceDAwXHgwMFx4MDBceDBkXHg0OVx4NDhceDQ0XHg1MiIgLgorCQkiXHgwMFx4MDBceDAwXHg0OFx4MDBceDAwXHgwMFx4MWJceDA0XHgwM1x4MDBceDAwXHgwMFx4MmRceGQ5XHhkNCIgLgorCQkiXHgyZFx4MDBceDAwXHgwMFx4MThceDUwXHg0Y1x4NTRceDQ1XHhmZlx4ZmZceGZmXHg2MFx4NjBceDVkXHhiMCIgLgorCQkiXHhhZlx4YWFceDAwXHg4MFx4MDBceGNlXHhjZFx4YzdceGMwXHgwMFx4MDBceGU4XHhlOFx4ZTZceGY3XHhmNyIgLgorCQkiXHhmNlx4OTVceDBjXHhhN1x4NDdceDAwXHgwMFx4MDBceDczXHg0OVx4NDRceDQxXHg1NFx4MjhceGNmXHg2MyIgLgorCQkiXHg0OFx4NjdceDIwXHgwNFx4NGFceDVjXHgxOFx4MGFceDA4XHgyYVx4NjJceDUzXHg2MVx4MjBceDAyXHgwOCIgLgorCQkiXHgwZFx4NjlceDQ1XHhhY1x4YTFceGExXHgwMVx4MzBceDBjXHg5M1x4NjBceDM2XHgyNlx4NTJceDkxXHhiMSIgLgorCQkiXHgwMVx4MTFceGQ2XHhlMVx4NTVceDY0XHg2Y1x4NmNceGNjXHg2Y1x4NmNceDBjXHhhMlx4MGNceDcwXHgyYSIgLgorCQkiXHg2Mlx4MDZceDJhXHhjMVx4NjJceDFkXHhiM1x4MDFceDAyXHg1M1x4YTRceDA4XHhlOFx4MDBceDAzXHgxOCIgLgorCQkiXHgyNlx4NTZceDExXHhkNFx4ZTFceDIwXHg5N1x4MWJceGUwXHhiNFx4MGVceDM1XHgyNFx4NzFceDI5XHg4MiIgLgorCQkiXHg5OVx4MzBceGI4XHg5M1x4MGFceDExXHhiOVx4NDVceDg4XHhjMVx4OGRceGEwXHhhMlx4NDRceDIxXHgwNiIgLgorCQkiXHgyN1x4NDFceDgyXHg0MFx4ODVceGMxXHg0NVx4ODlceDIwXHg3MFx4MDFceDAwXHhhNFx4M2RceDIxXHhjNSIgLgorCQkiXHgxMlx4MWNceDlhXHhmZVx4MDBceDAwXHgwMFx4MDBceDQ5XHg0NVx4NGVceDQ0XHhhZVx4NDJceDYwXHg4MiI7Cit9CisKK3N1YiBnZXRfZmlsZV9vd25lciB7CisJbXkgJHBhdGggPSBzaGlmdDsKKworCW15ICgkZGV2LCAkaW5vLCAkbW9kZSwgJG5saW5rLCAkc3RfdWlkLCAkc3RfZ2lkLCAkcmRldiwgJHNpemUpID0gc3RhdCgkcGF0aCk7CisJbXkgKCRuYW1lLCAkcGFzc3dkLCAkdWlkLCAkZ2lkLCAkcXVvdGEsICRjb21tZW50LCAkZ2NvcywgJGRpciwgJHNoZWxsKSA9IGdldHB3dWlkKCRzdF91aWQpOworCWlmICghZGVmaW5lZCAkZ2NvcykgeworCQlyZXR1cm4gdW5kZWY7CisJfQorCW15ICRvd25lciA9ICRnY29zOworCSRvd25lciA9fiBzL1ssO10uKiQvLzsKKwlyZXR1cm4gZGVjb2RlKCJ1dGY4IiwgJG93bmVyLCBFbmNvZGU6OkZCX0RFRkFVTFQpOworfQorCitzdWIgZ2l0X3JlYWRfcHJvamVjdHMgeworCW15IEBsaXN0OworCisJaWYgKC1kICRwcm9qZWN0c19saXN0KSB7CisJCSMgc2VhcmNoIGluIGRpcmVjdG9yeQorCQlteSAkZGlyID0gJHByb2plY3RzX2xpc3Q7CisJCW9wZW5kaXIgbXkgJGRoLCAkZGlyIG9yIHJldHVybiB1bmRlZjsKKwkJd2hpbGUgKG15ICRkaXIgPSByZWFkZGlyKCRkaCkpIHsKKwkJCWlmICgtZSAiJHByb2plY3Ryb290LyRkaXIvSEVBRCIpIHsKKwkJCQlteSAkcHIgPSB7CisJCQkJCXBhdGggPT4gJGRpciwKKwkJCQl9OworCQkJCXB1c2ggQGxpc3QsICRwcgorCQkJfQorCQl9CisJCWNsb3NlZGlyKCRkaCk7CisJfSBlbHNpZiAoLWYgJHByb2plY3RzX2xpc3QpIHsKKwkJIyByZWFkIGZyb20gZmlsZSh1cmwtZW5jb2RlZCk6CisJCSMgJ2dpdCUyRmdpdC5naXQgTGludXMrVG9ydmFsZHMnCisJCSMgJ2xpYnMlMkZrbGliYyUyRmtsaWJjLmdpdCBILitQZXRlcitBbnZpbicKKwkJIyAnbGludXglMkZob3RwbHVnJTJGdWRldi5naXQgR3JlZytLcm9haC1IYXJ0bWFuJworCQlvcGVuIG15ICRmZCAsICRwcm9qZWN0c19saXN0IG9yIHJldHVybiB1bmRlZjsKKwkJd2hpbGUgKG15ICRsaW5lID0gPCRmZD4pIHsKKwkJCWNob21wICRsaW5lOworCQkJbXkgKCRwYXRoLCAkb3duZXIpID0gc3BsaXQgJyAnLCAkbGluZTsKKwkJCSRwYXRoID0gdW5lc2NhcGUoJHBhdGgpOworCQkJJG93bmVyID0gdW5lc2NhcGUoJG93bmVyKTsKKwkJCWlmICghZGVmaW5lZCAkcGF0aCkgeworCQkJCW5leHQ7CisJCQl9CisJCQlpZiAoLWUgIiRwcm9qZWN0cm9vdC8kcGF0aC9IRUFEIikgeworCQkJCW15ICRwciA9IHsKKwkJCQkJcGF0aCA9PiAkcGF0aCwKKwkJCQkJb3duZXIgPT4gZGVjb2RlKCJ1dGY4IiwgJG93bmVyLCBFbmNvZGU6OkZCX0RFRkFVTFQpLAorCQkJCX07CisJCQkJcHVzaCBAbGlzdCwgJHByCisJCQl9CisJCX0KKwkJY2xvc2UgJGZkOworCX0KKwlAbGlzdCA9IHNvcnQgeyRhLT57J3BhdGgnfSBjbXAgJGItPnsncGF0aCd9fSBAbGlzdDsKKwlyZXR1cm4gQGxpc3Q7Cit9CisKK3N1YiBnaXRfcHJvamVjdF9saXN0IHsKKwlteSBAbGlzdCA9IGdpdF9yZWFkX3Byb2plY3RzKCk7CisJbXkgQHByb2plY3RzOworCWlmICghQGxpc3QpIHsKKwkJZGllX2Vycm9yKHVuZGVmLCAiTm8gcHJvamVjdCBmb3VuZC4iKTsKKwl9CisJZm9yZWFjaCBteSAkcHIgKEBsaXN0KSB7CisJCW15ICRoZWFkID0gZ2l0X3JlYWRfaGVhZCgkcHItPnsncGF0aCd9KTsKKwkJaWYgKCFkZWZpbmVkICRoZWFkKSB7CisJCQluZXh0OworCQl9CisJCSRFTlZ7J0dJVF9ESVInfSA9ICIkcHJvamVjdHJvb3QvJHByLT57J3BhdGgnfSI7CisJCW15ICVjbyA9IGdpdF9yZWFkX2NvbW1pdCgkaGVhZCk7CisJCWlmICghJWNvKSB7CisJCQluZXh0OworCQl9CisJCSRwci0+eydjb21taXQnfSA9IFwlY287CisJCWlmICghZGVmaW5lZCAkcHItPnsnZGVzY3InfSkgeworCQkJbXkgJGRlc2NyID0gZ2l0X3JlYWRfZGVzY3JpcHRpb24oJHByLT57J3BhdGgnfSkgfHwgIiI7CisJCQkkcHItPnsnZGVzY3InfSA9IGNob3Bfc3RyKCRkZXNjciwgMjUsIDUpOworCQl9CisJCWlmICghZGVmaW5lZCAkcHItPnsnb3duZXInfSkgeworCQkJJHByLT57J293bmVyJ30gPSBnZXRfZmlsZV9vd25lcigiJHByb2plY3Ryb290LyRwci0+eydwYXRoJ30iKSB8fCAiIjsKKwkJfQorCQlwdXNoIEBwcm9qZWN0cywgJHByOworCX0KKwlnaXRfaGVhZGVyX2h0bWwoKTsKKwlpZiAoLWYgJGhvbWVfdGV4dCkgeworCQlwcmludCAiPGRpdiBjbGFzcz1cImluZGV4X2luY2x1ZGVcIj5cbiI7CisJCW9wZW4gKG15ICRmZCwgJGhvbWVfdGV4dCk7CisJCXByaW50IDwkZmQ+OworCQljbG9zZSAkZmQ7CisJCXByaW50ICI8L2Rpdj5cbiI7CisJfQorCXByaW50ICI8dGFibGUgY2VsbHNwYWNpbmc9XCIwXCI+XG4iIC4KKwkgICAgICAiPHRyPlxuIjsKKwlpZiAoIWRlZmluZWQoJG9yZGVyKSB8fCAoZGVmaW5lZCgkb3JkZXIpICYmICgkb3JkZXIgZXEgInByb2plY3QiKSkpIHsKKwkJQHByb2plY3RzID0gc29ydCB7JGEtPnsncGF0aCd9IGNtcCAkYi0+eydwYXRoJ319IEBwcm9qZWN0czsKKwkJcHJpbnQgIjx0aD5Qcm9qZWN0PC90aD5cbiI7CisJfSBlbHNlIHsKKwkJcHJpbnQgIjx0aD4iIC4gJGNnaS0+YSh7LWNsYXNzID0+ICJoZWFkZXIiLCAtaHJlZiA9PiAiJG15X3VyaT8iIC4gZXNjX3BhcmFtKCJvPXByb2plY3QiKX0sICJQcm9qZWN0IikgLiAiPC90aD5cbiI7CisJfQorCWlmIChkZWZpbmVkKCRvcmRlcikgJiYgKCRvcmRlciBlcSAiZGVzY3IiKSkgeworCQlAcHJvamVjdHMgPSBzb3J0IHskYS0+eydkZXNjcid9IGNtcCAkYi0+eydkZXNjcid9fSBAcHJvamVjdHM7CisJCXByaW50ICI8dGg+RGVzY3JpcHRpb248L3RoPlxuIjsKKwl9IGVsc2UgeworCQlwcmludCAiPHRoPiIgLiAkY2dpLT5hKHstY2xhc3MgPT4gImhlYWRlciIsIC1ocmVmID0+ICIkbXlfdXJpPyIgLiBlc2NfcGFyYW0oIm89ZGVzY3IiKX0sICJEZXNjcmlwdGlvbiIpIC4gIjwvdGg+XG4iOworCX0KKwlpZiAoZGVmaW5lZCgkb3JkZXIpICYmICgkb3JkZXIgZXEgIm93bmVyIikpIHsKKwkJQHByb2plY3RzID0gc29ydCB7JGEtPnsnb3duZXInfSBjbXAgJGItPnsnb3duZXInfX0gQHByb2plY3RzOworCQlwcmludCAiPHRoPk93bmVyPC90aD5cbiI7CisJfSBlbHNlIHsKKwkJcHJpbnQgIjx0aD4iIC4gJGNnaS0+YSh7LWNsYXNzID0+ICJoZWFkZXIiLCAtaHJlZiA9PiAiJG15X3VyaT8iIC4gZXNjX3BhcmFtKCJvPW93bmVyIil9LCAiT3duZXIiKSAuICI8L3RoPlxuIjsKKwl9CisJaWYgKGRlZmluZWQoJG9yZGVyKSAmJiAoJG9yZGVyIGVxICJhZ2UiKSkgeworCQlAcHJvamVjdHMgPSBzb3J0IHskYS0+eydjb21taXQnfXsnYWdlJ30gPD0+ICRiLT57J2NvbW1pdCd9eydhZ2UnfX0gQHByb2plY3RzOworCQlwcmludCAiPHRoPkxhc3QgQ2hhbmdlPC90aD5cbiI7CisJfSBlbHNlIHsKKwkJcHJpbnQgIjx0aD4iIC4gJGNnaS0+YSh7LWNsYXNzID0+ICJoZWFkZXIiLCAtaHJlZiA9PiAiJG15X3VyaT8iIC4gZXNjX3BhcmFtKCJvPWFnZSIpfSwgIkxhc3QgQ2hhbmdlIikgLiAiPC90aD5cbiI7CisJfQorCXByaW50ICI8dGg+PC90aD5cbiIgLgorCSAgICAgICI8L3RyPlxuIjsKKwlteSAkYWx0ZXJuYXRlID0gMDsKKwlmb3JlYWNoIG15ICRwciAoQHByb2plY3RzKSB7CisJCWlmICgkYWx0ZXJuYXRlKSB7CisJCQlwcmludCAiPHRyIGNsYXNzPVwiZGFya1wiPlxuIjsKKwkJfSBlbHNlIHsKKwkJCXByaW50ICI8dHIgY2xhc3M9XCJsaWdodFwiPlxuIjsKKwkJfQorCQkkYWx0ZXJuYXRlIF49IDE7CisJCXByaW50ICI8dGQ+IiAuICRjZ2ktPmEoey1ocmVmID0+ICIkbXlfdXJpPyIgLiBlc2NfcGFyYW0oInA9JHByLT57J3BhdGgnfTthPXN1bW1hcnkiKSwgLWNsYXNzID0+ICJsaXN0In0sIGVzY19odG1sKCRwci0+eydwYXRoJ30pKSAuICI8L3RkPlxuIiAuCisJCSAgICAgICI8dGQ+JHByLT57J2Rlc2NyJ308L3RkPlxuIiAuCisJCSAgICAgICI8dGQ+PGk+IiAuIGNob3Bfc3RyKCRwci0+eydvd25lcid9LCAxNSkgLiAiPC9pPjwvdGQ+XG4iOworCQlteSAkY29sb3JlZF9hZ2U7CisJCWlmICgkcHItPnsnY29tbWl0J317J2FnZSd9IDwgNjAqNjAqMikgeworCQkJJGNvbG9yZWRfYWdlID0gIjxzcGFuIHN0eWxlID1cImNvbG9yOiAjMDA5OTAwO1wiPjxiPjxpPiRwci0+eydjb21taXQnfXsnYWdlX3N0cmluZyd9PC9pPjwvYj48L3NwYW4+IjsKKwkJfSBlbHNpZiAoJHByLT57J2NvbW1pdCd9eydhZ2UnfSA8IDYwKjYwKjI0KjIpIHsKKwkJCSRjb2xvcmVkX2FnZSA9ICI8c3BhbiBzdHlsZSA9XCJjb2xvcjogIzAwOTkwMDtcIj48aT4kcHItPnsnY29tbWl0J317J2FnZV9zdHJpbmcnfTwvaT48L3NwYW4+IjsKKwkJfSBlbHNlIHsKKwkJCSRjb2xvcmVkX2FnZSA9ICI8aT4kcHItPnsnY29tbWl0J317J2FnZV9zdHJpbmcnfTwvaT4iOworCQl9CisJCXByaW50ICI8dGQ+JGNvbG9yZWRfYWdlPC90ZD5cbiIgLgorCQkgICAgICAiPHRkIGNsYXNzPVwibGlua1wiPiIgLgorCQkgICAgICAkY2dpLT5hKHstaHJlZiA9PiAiJG15X3VyaT8iIC4gZXNjX3BhcmFtKCJwPSRwci0+eydwYXRoJ307YT1zdW1tYXJ5Iil9LCAic3VtbWFyeSIpIC4KKwkJICAgICAgIiB8ICIgLiAkY2dpLT5hKHstaHJlZiA9PiAiJG15X3VyaT8iIC4gZXNjX3BhcmFtKCJwPSRwci0+eydwYXRoJ307YT1zaG9ydGxvZyIpfSwgInNob3J0bG9nIikgLgorCQkgICAgICAiIHwgIiAuICRjZ2ktPmEoey1ocmVmID0+ICIkbXlfdXJpPyIgLiBlc2NfcGFyYW0oInA9JHByLT57J3BhdGgnfTthPWxvZyIpfSwgImxvZyIpIC4KKwkJICAgICAgIjwvdGQ+XG4iIC4KKwkJICAgICAgIjwvdHI+XG4iOworCX0KKwlwcmludCAiPC90YWJsZT5cbiI7CisJZ2l0X2Zvb3Rlcl9odG1sKCk7Cit9CisKK3N1YiByZWFkX2luZm9fcmVmIHsKKwlteSAkdHlwZSA9IHNoaWZ0IHx8ICIiOworCW15ICVyZWZzOworCSMgNWRjMDFjNTk1ZTZjNmVjOWNjZGE0ZjZmNjljMTMxYzBkZDk0NWY4YwlyZWZzL3RhZ3MvdjIuNi4xMQorCSMgYzM5YWUwN2YzOTM4MDZjY2Y0MDZlZjk2NmU5YTE1YWZjNDNjYzM2YQlyZWZzL3RhZ3MvdjIuNi4xMV57fQorCW9wZW4gbXkgJGZkLCAiJHByb2plY3Ryb290LyRwcm9qZWN0L2luZm8vcmVmcyIgb3IgcmV0dXJuOworCXdoaWxlIChteSAkbGluZSA9IDwkZmQ+KSB7CisJCWNob21wKCRsaW5lKTsKKwkJaWYgKCRsaW5lID1+IG0vXihbMC05YS1mQS1GXXs0MH0pXHQuKiR0eXBlXC8oW15cXl0rKS8pIHsKKwkJCWlmIChkZWZpbmVkICRyZWZzeyQxfSkgeworCQkJCSRyZWZzeyQxfSAuPSAiIC8gJDIiOworCQkJfSBlbHNlIHsKKwkJCQkkcmVmc3skMX0gPSAkMjsKKwkJCX0KKwkJfQorCX0KKwljbG9zZSAkZmQgb3IgcmV0dXJuOworCXJldHVybiBcJXJlZnM7Cit9CisKK3N1YiBnaXRfcmVhZF9yZWZzIHsKKwlteSAkcmVmX2RpciA9IHNoaWZ0OworCW15IEByZWZsaXN0OworCisJbXkgQHJlZnM7CisJb3BlbmRpciBteSAkZGgsICIkcHJvamVjdHJvb3QvJHByb2plY3QvJHJlZl9kaXIiOworCXdoaWxlIChteSAkZGlyID0gcmVhZGRpcigkZGgpKSB7CisJCWlmICgkZGlyID1+IG0vXlwuLykgeworCQkJbmV4dDsKKwkJfQorCQlpZiAoLWQgIiRwcm9qZWN0cm9vdC8kcHJvamVjdC8kcmVmX2Rpci8kZGlyIikgeworCQkJb3BlbmRpciBteSAkZGgyLCAiJHByb2plY3Ryb290LyRwcm9qZWN0LyRyZWZfZGlyLyRkaXIiOworCQkJbXkgQHN1YmRpcnMgPSBncmVwICFtL15cLi8sIHJlYWRkaXIgJGRoMjsKKwkJCWNsb3NlZGlyKCRkaDIpOworCQkJZm9yZWFjaCBteSAkc3ViZGlyIChAc3ViZGlycykgeworCQkJCXB1c2ggQHJlZnMsICIkZGlyLyRzdWJkaXIiCisJCQl9CisJCQluZXh0OworCQl9CisJCXB1c2ggQHJlZnMsICRkaXI7CisJfQorCWNsb3NlZGlyKCRkaCk7CisJZm9yZWFjaCBteSAkcmVmX2ZpbGUgKEByZWZzKSB7CisJCW15ICRyZWZfaWQgPSBnaXRfcmVhZF9oYXNoKCIkcHJvamVjdC8kcmVmX2Rpci8kcmVmX2ZpbGUiKTsKKwkJbXkgJHR5cGUgPSBnaXRfZ2V0X3R5cGUoJHJlZl9pZCkgfHwgbmV4dDsKKwkJbXkgJXJlZl9pdGVtOworCQlteSAlY287CisJCSRyZWZfaXRlbXsndHlwZSd9ID0gJHR5cGU7CisJCSRyZWZfaXRlbXsnaWQnfSA9ICRyZWZfaWQ7CisJCSRyZWZfaXRlbXsnZXBvY2gnfSA9IDA7CisJCSRyZWZfaXRlbXsnYWdlJ30gPSAidW5rbm93biI7CisJCWlmICgkdHlwZSBlcSAidGFnIikgeworCQkJbXkgJXRhZyA9IGdpdF9yZWFkX3RhZygkcmVmX2lkKTsKKwkJCSRyZWZfaXRlbXsnY29tbWVudCd9ID0gJHRhZ3snY29tbWVudCd9OworCQkJaWYgKCR0YWd7J3R5cGUnfSBlcSAiY29tbWl0IikgeworCQkJCSVjbyA9IGdpdF9yZWFkX2NvbW1pdCgkdGFneydvYmplY3QnfSk7CisJCQkJJHJlZl9pdGVteydlcG9jaCd9ID0gJGNveydjb21taXR0ZXJfZXBvY2gnfTsKKwkJCQkkcmVmX2l0ZW17J2FnZSd9ID0gJGNveydhZ2Vfc3RyaW5nJ307CisJCQl9IGVsc2lmIChkZWZpbmVkKCR0YWd7J2Vwb2NoJ30pKSB7CisJCQkJbXkgJGFnZSA9IHRpbWUgLSAkdGFneydlcG9jaCd9OworCQkJCSRyZWZfaXRlbXsnZXBvY2gnfSA9ICR0YWd7J2Vwb2NoJ307CisJCQkJJHJlZl9pdGVteydhZ2UnfSA9IGFnZV9zdHJpbmcoJGFnZSk7CisJCQl9CisJCQkkcmVmX2l0ZW17J3JlZnR5cGUnfSA9ICR0YWd7J3R5cGUnfTsKKwkJCSRyZWZfaXRlbXsnbmFtZSd9ID0gJHRhZ3snbmFtZSd9OworCQkJJHJlZl9pdGVteydyZWZpZCd9ID0gJHRhZ3snb2JqZWN0J307CisJCX0gZWxzaWYgKCR0eXBlIGVxICJjb21taXQiKXsKKwkJCSVjbyA9IGdpdF9yZWFkX2NvbW1pdCgkcmVmX2lkKTsKKwkJCSRyZWZfaXRlbXsncmVmdHlwZSd9ID0gImNvbW1pdCI7CisJCQkkcmVmX2l0ZW17J25hbWUnfSA9ICRyZWZfZmlsZTsKKwkJCSRyZWZfaXRlbXsndGl0bGUnfSA9ICRjb3sndGl0bGUnfTsKKwkJCSRyZWZfaXRlbXsncmVmaWQnfSA9ICRyZWZfaWQ7CisJCQkkcmVmX2l0ZW17J2Vwb2NoJ30gPSAkY297J2NvbW1pdHRlcl9lcG9jaCd9OworCQkJJHJlZl9pdGVteydhZ2UnfSA9ICRjb3snYWdlX3N0cmluZyd9OworCQl9CisKKwkJcHVzaCBAcmVmbGlzdCwgXCVyZWZfaXRlbTsKKwl9CisJIyBzb3J0IHRhZ3MgYnkgYWdlCisJQHJlZmxpc3QgPSBzb3J0IHskYi0+eydlcG9jaCd9IDw9PiAkYS0+eydlcG9jaCd9fSBAcmVmbGlzdDsKKwlyZXR1cm4gXEByZWZsaXN0OworfQorCitzdWIgZ2l0X3N1bW1hcnkgeworCW15ICRkZXNjciA9IGdpdF9yZWFkX2Rlc2NyaXB0aW9uKCRwcm9qZWN0KSB8fCAibm9uZSI7CisJbXkgJGhlYWQgPSBnaXRfcmVhZF9oZWFkKCRwcm9qZWN0KTsKKwlteSAlY28gPSBnaXRfcmVhZF9jb21taXQoJGhlYWQpOworCW15ICVjZCA9IGRhdGVfc3RyKCRjb3snY29tbWl0dGVyX2Vwb2NoJ30sICRjb3snY29tbWl0dGVyX3R6J30pOworCisJbXkgJG93bmVyOworCWlmICgtZiAkcHJvamVjdHNfbGlzdCkgeworCQlvcGVuIChteSAkZmQgLCAkcHJvamVjdHNfbGlzdCk7CisJCXdoaWxlIChteSAkbGluZSA9IDwkZmQ+KSB7CisJCQljaG9tcCAkbGluZTsKKwkJCW15ICgkcHIsICRvdykgPSBzcGxpdCAnICcsICRsaW5lOworCQkJJHByID0gdW5lc2NhcGUoJHByKTsKKwkJCSRvdyA9IHVuZXNjYXBlKCRvdyk7CisJCQlpZiAoJHByIGVxICRwcm9qZWN0KSB7CisJCQkJJG93bmVyID0gZGVjb2RlKCJ1dGY4IiwgJG93LCBFbmNvZGU6OkZCX0RFRkFVTFQpOworCQkJCWxhc3Q7CisJCQl9CisJCX0KKwkJY2xvc2UgJGZkOworCX0KKwlpZiAoIWRlZmluZWQgJG93bmVyKSB7CisJCSRvd25lciA9IGdldF9maWxlX293bmVyKCIkcHJvamVjdHJvb3QvJHByb2plY3QiKTsKKwl9CisKKwlteSAkcmVmcyA9IHJlYWRfaW5mb19yZWYoKTsKKwlnaXRfaGVhZGVyX2h0bWwoKTsKKwlwcmludCAiPGRpdiBjbGFzcz1cInBhZ2VfbmF2XCI+XG4iIC4KKwkgICAgICAic3VtbWFyeSIuCisJICAgICAgIiB8ICIgLiAkY2dpLT5hKHstaHJlZiA9PiAiJG15X3VyaT8iIC4gZXNjX3BhcmFtKCJwPSRwcm9qZWN0O2E9c2hvcnRsb2ciKX0sICJzaG9ydGxvZyIpIC4KKwkgICAgICAiIHwgIiAuICRjZ2ktPmEoey1ocmVmID0+ICIkbXlfdXJpPyIgLiBlc2NfcGFyYW0oInA9JHByb2plY3Q7YT1sb2ciKX0sICJsb2ciKSAuCisJICAgICAgIiB8ICIgLiAkY2dpLT5hKHstaHJlZiA9PiAiJG15X3VyaT8iIC4gZXNjX3BhcmFtKCJwPSRwcm9qZWN0O2E9Y29tbWl0O2g9JGhlYWQiKX0sICJjb21taXQiKSAuCisJICAgICAgIiB8ICIgLiAkY2dpLT5hKHstaHJlZiA9PiAiJG15X3VyaT8iIC4gZXNjX3BhcmFtKCJwPSRwcm9qZWN0O2E9Y29tbWl0ZGlmZjtoPSRoZWFkIil9LCAiY29tbWl0ZGlmZiIpIC4KKwkgICAgICAiIHwgIiAuICRjZ2ktPmEoey1ocmVmID0+ICIkbXlfdXJpPyIgLiBlc2NfcGFyYW0oInA9JHByb2plY3Q7YT10cmVlIil9LCAidHJlZSIpIC4KKwkgICAgICAiPGJyLz48YnIvPlxuIiAuCisJICAgICAgIjwvZGl2PlxuIjsKKwlwcmludCAiPGRpdiBjbGFzcz1cInRpdGxlXCI+Jm5ic3A7PC9kaXY+XG4iOworCXByaW50ICI8dGFibGUgY2VsbHNwYWNpbmc9XCIwXCI+XG4iIC4KKwkgICAgICAiPHRyPjx0ZD5kZXNjcmlwdGlvbjwvdGQ+PHRkPiIgLiBlc2NfaHRtbCgkZGVzY3IpIC4gIjwvdGQ+PC90cj5cbiIgLgorCSAgICAgICI8dHI+PHRkPm93bmVyPC90ZD48dGQ+JG93bmVyPC90ZD48L3RyPlxuIiAuCisJICAgICAgIjx0cj48dGQ+bGFzdCBjaGFuZ2U8L3RkPjx0ZD4kY2R7J3JmYzI4MjInfTwvdGQ+PC90cj5cbiIgLgorCSAgICAgICI8L3RhYmxlPlxuIjsKKwlvcGVuIG15ICRmZCwgIi18IiwgIiRnaXRiaW4vZ2l0LXJldi1saXN0IC0tbWF4LWNvdW50PTE3ICIgLiBnaXRfcmVhZF9oZWFkKCRwcm9qZWN0KSBvciBkaWVfZXJyb3IodW5kZWYsICJPcGVuIGZhaWxlZC4iKTsKKwlteSAoQHJldmxpc3QpID0gbWFwIHsgY2hvbXA7ICRfIH0gPCRmZD47CisJY2xvc2UgJGZkOworCXByaW50ICI8ZGl2PlxuIiAuCisJICAgICAgJGNnaS0+YSh7LWhyZWYgPT4gIiRteV91cmk/IiAuIGVzY19wYXJhbSgicD0kcHJvamVjdDthPXNob3J0bG9nIiksIC1jbGFzcyA9PiAidGl0bGUifSwgInNob3J0bG9nIikgLgorCSAgICAgICI8L2Rpdj5cbiI7CisJbXkgJGkgPSAxNjsKKwlwcmludCAiPHRhYmxlIGNlbGxzcGFjaW5nPVwiMFwiPlxuIjsKKwlteSAkYWx0ZXJuYXRlID0gMDsKKwlmb3JlYWNoIG15ICRjb21taXQgKEByZXZsaXN0KSB7CisJCW15ICVjbyA9IGdpdF9yZWFkX2NvbW1pdCgkY29tbWl0KTsKKwkJbXkgJWFkID0gZGF0ZV9zdHIoJGNveydhdXRob3JfZXBvY2gnfSk7CisJCWlmICgkYWx0ZXJuYXRlKSB7CisJCQlwcmludCAiPHRyIGNsYXNzPVwiZGFya1wiPlxuIjsKKwkJfSBlbHNlIHsKKwkJCXByaW50ICI8dHIgY2xhc3M9XCJsaWdodFwiPlxuIjsKKwkJfQorCQkkYWx0ZXJuYXRlIF49IDE7CisJCWlmICgkaS0tID4gMCkgeworCQkJbXkgJHJlZiA9ICIiOworCQkJaWYgKGRlZmluZWQgJHJlZnMtPnskY29tbWl0fSkgeworCQkJCSRyZWYgPSAiIDxzcGFuIGNsYXNzPVwidGFnXCI+IiAuIGVzY19odG1sKCRyZWZzLT57JGNvbW1pdH0pIC4gIjwvc3Bhbj4iOworCQkJfQorCQkJcHJpbnQgIjx0ZD48aT4kY297J2FnZV9zdHJpbmcnfTwvaT48L3RkPlxuIiAuCisJCQkgICAgICAiPHRkPjxpPiIgLiBlc2NfaHRtbChjaG9wX3N0cigkY297J2F1dGhvcl9uYW1lJ30sIDEwKSkgLiAiPC9pPjwvdGQ+XG4iIC4KKwkJCSAgICAgICI8dGQ+IjsKKwkJCWlmIChsZW5ndGgoJGNveyd0aXRsZV9zaG9ydCd9KSA8IGxlbmd0aCgkY297J3RpdGxlJ30pKSB7CisJCQkJcHJpbnQgJGNnaS0+YSh7LWhyZWYgPT4gIiRteV91cmk/IiAuIGVzY19wYXJhbSgicD0kcHJvamVjdDthPWNvbW1pdDtoPSRjb21taXQiKSwgLWNsYXNzID0+ICJsaXN0IiwgLXRpdGxlID0+ICIkY297J3RpdGxlJ30ifSwKKwkJCSAgICAgICAgICAgICAgIjxiPiIgLiBlc2NfaHRtbCgkY297J3RpdGxlX3Nob3J0J30pIC4gIiRyZWY8L2I+Iik7CisJCQl9IGVsc2UgeworCQkJCXByaW50ICRjZ2ktPmEoey1ocmVmID0+ICIkbXlfdXJpPyIgLiBlc2NfcGFyYW0oInA9JHByb2plY3Q7YT1jb21taXQ7aD0kY29tbWl0IiksIC1jbGFzcyA9PiAibGlzdCJ9LAorCQkJCSAgICAgICI8Yj4iIC4gZXNjX2h0bWwoJGNveyd0aXRsZSd9KSAuICIkcmVmPC9iPiIpOworCQkJfQorCQkJcHJpbnQgIjwvdGQ+XG4iIC4KKwkJCSAgICAgICI8dGQgY2xhc3M9XCJsaW5rXCI+IiAuCisJCQkgICAgICAkY2dpLT5hKHstaHJlZiA9PiAiJG15X3VyaT8iIC4gZXNjX3BhcmFtKCJwPSRwcm9qZWN0O2E9Y29tbWl0O2g9JGNvbW1pdCIpfSwgImNvbW1pdCIpIC4KKwkJCSAgICAgICIgfCAiIC4gJGNnaS0+YSh7LWhyZWYgPT4gIiRteV91cmk/IiAuIGVzY19wYXJhbSgicD0kcHJvamVjdDthPWNvbW1pdGRpZmY7aD0kY29tbWl0Iil9LCAiY29tbWl0ZGlmZiIpIC4KKwkJCSAgICAgICI8L3RkPlxuIiAuCisJCQkgICAgICAiPC90cj4iOworCQl9IGVsc2UgeworCQkJcHJpbnQgIjx0ZD4iIC4gJGNnaS0+YSh7LWhyZWYgPT4gIiRteV91cmk/IiAuIGVzY19wYXJhbSgicD0kcHJvamVjdDthPXNob3J0bG9nIil9LCAiLi4uIikgLiAiPC90ZD5cbiIgLgorCQkJIjwvdHI+IjsKKwkJCWxhc3Q7CisJCX0KKwl9CisJcHJpbnQgIjwvdGFibGVcbj4iOworCisJbXkgJHRhZ2xpc3QgPSBnaXRfcmVhZF9yZWZzKCJyZWZzL3RhZ3MiKTsKKwlpZiAoZGVmaW5lZCBAJHRhZ2xpc3QpIHsKKwkJcHJpbnQgIjxkaXY+XG4iIC4KKwkJICAgICAgJGNnaS0+YSh7LWhyZWYgPT4gIiRteV91cmk/IiAuIGVzY19wYXJhbSgicD0kcHJvamVjdDthPXRhZ3MiKSwgLWNsYXNzID0+ICJ0aXRsZSJ9LCAidGFncyIpIC4KKwkJICAgICAgIjwvZGl2PlxuIjsKKwkJbXkgJGkgPSAxNjsKKwkJcHJpbnQgIjx0YWJsZSBjZWxsc3BhY2luZz1cIjBcIj5cbiI7CisJCW15ICRhbHRlcm5hdGUgPSAwOworCQlmb3JlYWNoIG15ICRlbnRyeSAoQCR0YWdsaXN0KSB7CisJCQlteSAldGFnID0gJSRlbnRyeTsKKwkJCW15ICRjb21tZW50X2xpbmVzID0gJHRhZ3snY29tbWVudCd9OworCQkJbXkgJGNvbW1lbnQgPSBzaGlmdCBAJGNvbW1lbnRfbGluZXM7CisJCQlpZiAoZGVmaW5lZCgkY29tbWVudCkpIHsKKwkJCQkkY29tbWVudCA9IGNob3Bfc3RyKCRjb21tZW50LCAzMCwgNSk7CisJCQl9CisJCQlpZiAoJGFsdGVybmF0ZSkgeworCQkJCXByaW50ICI8dHIgY2xhc3M9XCJkYXJrXCI+XG4iOworCQkJfSBlbHNlIHsKKwkJCQlwcmludCAiPHRyIGNsYXNzPVwibGlnaHRcIj5cbiI7CisJCQl9CisJCQkkYWx0ZXJuYXRlIF49IDE7CisJCQlpZiAoJGktLSA+IDApIHsKKwkJCQlwcmludCAiPHRkPjxpPiR0YWd7J2FnZSd9PC9pPjwvdGQ+XG4iIC4KKwkJCQkgICAgICAiPHRkPiIgLgorCQkJCSAgICAgICRjZ2ktPmEoey1ocmVmID0+ICIkbXlfdXJpPyIgLiBlc2NfcGFyYW0oInA9JHByb2plY3Q7YT0kdGFneydyZWZ0eXBlJ307aD0kdGFneydyZWZpZCd9IiksIC1jbGFzcyA9PiAibGlzdCJ9LAorCQkJCSAgICAgICI8Yj4iIC4gZXNjX2h0bWwoJHRhZ3snbmFtZSd9KSAuICI8L2I+IikgLgorCQkJCSAgICAgICI8L3RkPlxuIiAuCisJCQkJICAgICAgIjx0ZD4iOworCQkJCWlmIChkZWZpbmVkKCRjb21tZW50KSkgeworCQkJCSAgICAgIHByaW50ICRjZ2ktPmEoey1jbGFzcyA9PiAibGlzdCIsIC1ocmVmID0+ICIkbXlfdXJpPyIgLiBlc2NfcGFyYW0oInA9JHByb2plY3Q7YT10YWc7aD0kdGFneydpZCd9Iil9LCAkY29tbWVudCk7CisJCQkJfQorCQkJCXByaW50ICI8L3RkPlxuIiAuCisJCQkJICAgICAgIjx0ZCBjbGFzcz1cImxpbmtcIj4iOworCQkJCWlmICgkdGFneyd0eXBlJ30gZXEgInRhZyIpIHsKKwkJCQkgICAgICBwcmludCAkY2dpLT5hKHstaHJlZiA9PiAiJG15X3VyaT8iIC4gZXNjX3BhcmFtKCJwPSRwcm9qZWN0O2E9dGFnO2g9JHRhZ3snaWQnfSIpfSwgInRhZyIpIC4gIiB8ICI7CisJCQkJfQorCQkJCXByaW50ICRjZ2ktPmEoey1ocmVmID0+ICIkbXlfdXJpPyIgLiBlc2NfcGFyYW0oInA9JHByb2plY3Q7YT0kdGFneydyZWZ0eXBlJ307aD0kdGFneydyZWZpZCd9Iil9LCAkdGFneydyZWZ0eXBlJ30pOworCQkJCWlmICgkdGFneydyZWZ0eXBlJ30gZXEgImNvbW1pdCIpIHsKKwkJCQkgICAgICBwcmludCAiIHwgIiAuICRjZ2ktPmEoey1ocmVmID0+ICIkbXlfdXJpPyIgLiBlc2NfcGFyYW0oInA9JHByb2plY3Q7YT1zaG9ydGxvZztoPSR0YWd7J25hbWUnfSIpfSwgInNob3J0bG9nIikgLgorCQkJCSAgICAgICAgICAgICIgfCAiIC4gJGNnaS0+YSh7LWhyZWYgPT4gIiRteV91cmk/IiAuIGVzY19wYXJhbSgicD0kcHJvamVjdDthPWxvZztoPSR0YWd7J3JlZmlkJ30iKX0sICJsb2ciKTsKKwkJCQl9CisJCQkJcHJpbnQgIjwvdGQ+XG4iIC4KKwkJCQkgICAgICAiPC90cj4iOworCQkJfSBlbHNlIHsKKwkJCQlwcmludCAiPHRkPiIgLiAkY2dpLT5hKHstaHJlZiA9PiAiJG15X3VyaT8iIC4gZXNjX3BhcmFtKCJwPSRwcm9qZWN0O2E9dGFncyIpfSwgIi4uLiIpIC4gIjwvdGQ+XG4iIC4KKwkJCQkiPC90cj4iOworCQkJCWxhc3Q7CisJCQl9CisJCX0KKwkJcHJpbnQgIjwvdGFibGVcbj4iOworCX0KKworCW15ICRoZWFkbGlzdCA9IGdpdF9yZWFkX3JlZnMoInJlZnMvaGVhZHMiKTsKKwlpZiAoZGVmaW5lZCBAJGhlYWRsaXN0KSB7CisJCXByaW50ICI8ZGl2PlxuIiAuCisJCSAgICAgICRjZ2ktPmEoey1ocmVmID0+ICIkbXlfdXJpPyIgLiBlc2NfcGFyYW0oInA9JHByb2plY3Q7YT1oZWFkcyIpLCAtY2xhc3MgPT4gInRpdGxlIn0sICJoZWFkcyIpIC4KKwkJICAgICAgIjwvZGl2PlxuIjsKKwkJbXkgJGkgPSAxNjsKKwkJcHJpbnQgIjx0YWJsZSBjZWxsc3BhY2luZz1cIjBcIj5cbiI7CisJCW15ICRhbHRlcm5hdGUgPSAwOworCQlmb3JlYWNoIG15ICRlbnRyeSAoQCRoZWFkbGlzdCkgeworCQkJbXkgJXRhZyA9ICUkZW50cnk7CisJCQlpZiAoJGFsdGVybmF0ZSkgeworCQkJCXByaW50ICI8dHIgY2xhc3M9XCJkYXJrXCI+XG4iOworCQkJfSBlbHNlIHsKKwkJCQlwcmludCAiPHRyIGNsYXNzPVwibGlnaHRcIj5cbiI7CisJCQl9CisJCQkkYWx0ZXJuYXRlIF49IDE7CisJCQlpZiAoJGktLSA+IDApIHsKKwkJCQlwcmludCAiPHRkPjxpPiR0YWd7J2FnZSd9PC9pPjwvdGQ+XG4iIC4KKwkJCQkgICAgICAiPHRkPiIgLgorCQkJCSAgICAgICRjZ2ktPmEoey1ocmVmID0+ICIkbXlfdXJpPyIgLiBlc2NfcGFyYW0oInA9JHByb2plY3Q7YT1zaG9ydGxvZztoPSR0YWd7J25hbWUnfSIpLCAtY2xhc3MgPT4gImxpc3QifSwKKwkJCQkgICAgICAiPGI+IiAuIGVzY19odG1sKCR0YWd7J25hbWUnfSkgLiAiPC9iPiIpIC4KKwkJCQkgICAgICAiPC90ZD5cbiIgLgorCQkJCSAgICAgICI8dGQgY2xhc3M9XCJsaW5rXCI+IiAuCisJCQkJICAgICAgJGNnaS0+YSh7LWhyZWYgPT4gIiRteV91cmk/IiAuIGVzY19wYXJhbSgicD0kcHJvamVjdDthPXNob3J0bG9nO2g9JHRhZ3snbmFtZSd9Iil9LCAic2hvcnRsb2ciKSAuCisJCQkJICAgICAgIiB8ICIgLiAkY2dpLT5hKHstaHJlZiA9PiAiJG15X3VyaT8iIC4gZXNjX3BhcmFtKCJwPSRwcm9qZWN0O2E9bG9nO2g9JHRhZ3snbmFtZSd9Iil9LCAibG9nIikgLgorCQkJCSAgICAgICI8L3RkPlxuIiAuCisJCQkJICAgICAgIjwvdHI+IjsKKwkJCX0gZWxzZSB7CisJCQkJcHJpbnQgIjx0ZD4iIC4gJGNnaS0+YSh7LWhyZWYgPT4gIiRteV91cmk/IiAuIGVzY19wYXJhbSgicD0kcHJvamVjdDthPWhlYWRzIil9LCAiLi4uIikgLiAiPC90ZD5cbiIgLgorCQkJCSI8L3RyPiI7CisJCQkJbGFzdDsKKwkJCX0KKwkJfQorCQlwcmludCAiPC90YWJsZVxuPiI7CisJfQorCWdpdF9mb290ZXJfaHRtbCgpOworfQorCitzdWIgZ2l0X3RhZyB7CisJbXkgJGhlYWQgPSBnaXRfcmVhZF9oZWFkKCRwcm9qZWN0KTsKKwlnaXRfaGVhZGVyX2h0bWwoKTsKKwlwcmludCAiPGRpdiBjbGFzcz1cInBhZ2VfbmF2XCI+XG4iIC4KKwkgICAgICAkY2dpLT5hKHstaHJlZiA9PiAiJG15X3VyaT8iIC4gZXNjX3BhcmFtKCJwPSRwcm9qZWN0O2E9c3VtbWFyeSIpfSwgInN1bW1hcnkiKSAuCisJICAgICAgIiB8ICIgLiAkY2dpLT5hKHstaHJlZiA9PiAiJG15X3VyaT8iIC4gZXNjX3BhcmFtKCJwPSRwcm9qZWN0O2E9c2hvcnRsb2ciKX0sICJzaG9ydGxvZyIpIC4KKwkgICAgICAiIHwgIiAuICRjZ2ktPmEoey1ocmVmID0+ICIkbXlfdXJpPyIgLiBlc2NfcGFyYW0oInA9JHByb2plY3Q7YT1sb2ciKX0sICJsb2ciKSAuCisJICAgICAgIiB8ICIgLiAkY2dpLT5hKHstaHJlZiA9PiAiJG15X3VyaT8iIC4gZXNjX3BhcmFtKCJwPSRwcm9qZWN0O2E9Y29tbWl0O2g9JGhlYWQiKX0sICJjb21taXQiKSAuCisJICAgICAgIiB8ICIgLiAkY2dpLT5hKHstaHJlZiA9PiAiJG15X3VyaT8iIC4gZXNjX3BhcmFtKCJwPSRwcm9qZWN0O2E9Y29tbWl0ZGlmZjtoPSRoZWFkIil9LCAiY29tbWl0ZGlmZiIpIC4KKwkgICAgICAiIHwgIiAuICRjZ2ktPmEoey1ocmVmID0+ICIkbXlfdXJpPyIgLiBlc2NfcGFyYW0oInA9JHByb2plY3Q7YT10cmVlO2hiPSRoZWFkIil9LCAidHJlZSIpIC4gIjxici8+XG4iIC4KKwkgICAgICAiPGJyLz5cbiIgLgorCSAgICAgICI8L2Rpdj5cbiI7CisJbXkgJXRhZyA9IGdpdF9yZWFkX3RhZygkaGFzaCk7CisJcHJpbnQgIjxkaXY+XG4iIC4KKwkgICAgICAkY2dpLT5hKHstaHJlZiA9PiAiJG15X3VyaT8iIC4gZXNjX3BhcmFtKCJwPSRwcm9qZWN0O2E9Y29tbWl0O2g9JGhhc2giKSwgLWNsYXNzID0+ICJ0aXRsZSJ9LCBlc2NfaHRtbCgkdGFneyduYW1lJ30pKSAuICJcbiIgLgorCSAgICAgICI8L2Rpdj5cbiI7CisJcHJpbnQgIjxkaXYgY2xhc3M9XCJ0aXRsZV90ZXh0XCI+XG4iIC4KKwkgICAgICAiPHRhYmxlIGNlbGxzcGFjaW5nPVwiMFwiPlxuIiAuCisJICAgICAgIjx0cj5cbiIgLgorCSAgICAgICI8dGQ+b2JqZWN0PC90ZD5cbiIgLgorCSAgICAgICI8dGQ+IiAuICRjZ2ktPmEoey1jbGFzcyA9PiAibGlzdCIsIC1ocmVmID0+ICIkbXlfdXJpPyIgLiBlc2NfcGFyYW0oInA9JHByb2plY3Q7YT0kdGFneyd0eXBlJ307aD0kdGFneydvYmplY3QnfSIpfSwgJHRhZ3snb2JqZWN0J30pIC4gIjwvdGQ+XG4iIC4KKwkgICAgICAiPHRkIGNsYXNzPVwibGlua1wiPiIgLiAkY2dpLT5hKHstaHJlZiA9PiAiJG15X3VyaT8iIC4gZXNjX3BhcmFtKCJwPSRwcm9qZWN0O2E9JHRhZ3sndHlwZSd9O2g9JHRhZ3snb2JqZWN0J30iKX0sICR0YWd7J3R5cGUnfSkgLiAiPC90ZD5cbiIgLgorCSAgICAgICI8L3RyPlxuIjsKKwlpZiAoZGVmaW5lZCgkdGFneydhdXRob3InfSkpIHsKKwkJbXkgJWFkID0gZGF0ZV9zdHIoJHRhZ3snZXBvY2gnfSwgJHRhZ3sndHonfSk7CisJCXByaW50ICI8dHI+PHRkPmF1dGhvcjwvdGQ+PHRkPiIgLiBlc2NfaHRtbCgkdGFneydhdXRob3InfSkgLiAiPC90ZD48L3RyPlxuIjsKKwkJcHJpbnQgIjx0cj48dGQ+PC90ZD48dGQ+IiAuICRhZHsncmZjMjgyMid9IC4gc3ByaW50ZigiICglMDJkOiUwMmQgJXMpIiwgJGFkeydob3VyX2xvY2FsJ30sICRhZHsnbWludXRlX2xvY2FsJ30sICRhZHsndHpfbG9jYWwnfSkgLiAiPC90ZD48L3RyPlxuIjsKKwl9CisJcHJpbnQgIjwvdGFibGU+XG5cbiIgLgorCSAgICAgICI8L2Rpdj5cbiI7CisJcHJpbnQgIjxkaXYgY2xhc3M9XCJwYWdlX2JvZHlcIj4iOworCW15ICRjb21tZW50ID0gJHRhZ3snY29tbWVudCd9OworCWZvcmVhY2ggbXkgJGxpbmUgKEAkY29tbWVudCkgeworCQlwcmludCBlc2NfaHRtbCgkbGluZSkgLiAiPGJyLz5cbiI7CisJfQorCXByaW50ICI8L2Rpdj5cbiI7CisJZ2l0X2Zvb3Rlcl9odG1sKCk7Cit9CisKK3N1YiBnaXRfdGFncyB7CisJbXkgJGhlYWQgPSBnaXRfcmVhZF9oZWFkKCRwcm9qZWN0KTsKKwlnaXRfaGVhZGVyX2h0bWwoKTsKKwlwcmludCAiPGRpdiBjbGFzcz1cInBhZ2VfbmF2XCI+XG4iIC4KKwkgICAgICAkY2dpLT5hKHstaHJlZiA9PiAiJG15X3VyaT8iIC4gZXNjX3BhcmFtKCJwPSRwcm9qZWN0O2E9c3VtbWFyeSIpfSwgInN1bW1hcnkiKSAuCisJICAgICAgIiB8ICIgLiAkY2dpLT5hKHstaHJlZiA9PiAiJG15X3VyaT8iIC4gZXNjX3BhcmFtKCJwPSRwcm9qZWN0O2E9c2hvcnRsb2ciKX0sICJzaG9ydGxvZyIpIC4KKwkgICAgICAiIHwgIiAuICRjZ2ktPmEoey1ocmVmID0+ICIkbXlfdXJpPyIgLiBlc2NfcGFyYW0oInA9JHByb2plY3Q7YT1sb2ciKX0sICJsb2ciKSAuCisJICAgICAgIiB8ICIgLiAkY2dpLT5hKHstaHJlZiA9PiAiJG15X3VyaT8iIC4gZXNjX3BhcmFtKCJwPSRwcm9qZWN0O2E9Y29tbWl0O2g9JGhlYWQiKX0sICJjb21taXQiKSAuCisJICAgICAgIiB8ICIgLiAkY2dpLT5hKHstaHJlZiA9PiAiJG15X3VyaT8iIC4gZXNjX3BhcmFtKCJwPSRwcm9qZWN0O2E9Y29tbWl0ZGlmZjtoPSRoZWFkIil9LCAiY29tbWl0ZGlmZiIpIC4KKwkgICAgICAiIHwgIiAuICRjZ2ktPmEoey1ocmVmID0+ICIkbXlfdXJpPyIgLiBlc2NfcGFyYW0oInA9JHByb2plY3Q7YT10cmVlO2hiPSRoZWFkIil9LCAidHJlZSIpIC4gIjxici8+XG4iIC4KKwkgICAgICAiPGJyLz5cbiIgLgorCSAgICAgICI8L2Rpdj5cbiI7CisJbXkgJHRhZ2xpc3QgPSBnaXRfcmVhZF9yZWZzKCJyZWZzL3RhZ3MiKTsKKwlwcmludCAiPGRpdj5cbiIgLgorCSAgICAgICRjZ2ktPmEoey1ocmVmID0+ICIkbXlfdXJpPyIgLiBlc2NfcGFyYW0oInA9JHByb2plY3Q7YT1zdW1tYXJ5IiksIC1jbGFzcyA9PiAidGl0bGUifSwgIiZuYnNwOyIpIC4KKwkgICAgICAiPC9kaXY+XG4iOworCXByaW50ICI8dGFibGUgY2VsbHNwYWNpbmc9XCIwXCI+XG4iOworCW15ICRhbHRlcm5hdGUgPSAwOworCWlmIChkZWZpbmVkIEAkdGFnbGlzdCkgeworCQlmb3JlYWNoIG15ICRlbnRyeSAoQCR0YWdsaXN0KSB7CisJCQlteSAldGFnID0gJSRlbnRyeTsKKwkJCW15ICRjb21tZW50X2xpbmVzID0gJHRhZ3snY29tbWVudCd9OworCQkJbXkgJGNvbW1lbnQgPSBzaGlmdCBAJGNvbW1lbnRfbGluZXM7CisJCQlpZiAoZGVmaW5lZCgkY29tbWVudCkpIHsKKwkJCQkkY29tbWVudCA9IGNob3Bfc3RyKCRjb21tZW50LCAzMCwgNSk7CisJCQl9CisJCQlpZiAoJGFsdGVybmF0ZSkgeworCQkJCXByaW50ICI8dHIgY2xhc3M9XCJkYXJrXCI+XG4iOworCQkJfSBlbHNlIHsKKwkJCQlwcmludCAiPHRyIGNsYXNzPVwibGlnaHRcIj5cbiI7CisJCQl9CisJCQkkYWx0ZXJuYXRlIF49IDE7CisJCQlwcmludCAiPHRkPjxpPiR0YWd7J2FnZSd9PC9pPjwvdGQ+XG4iIC4KKwkJCSAgICAgICI8dGQ+IiAuCisJCQkgICAgICAkY2dpLT5hKHstaHJlZiA9PiAiJG15X3VyaT8iIC4gZXNjX3BhcmFtKCJwPSRwcm9qZWN0O2E9JHRhZ3sncmVmdHlwZSd9O2g9JHRhZ3sncmVmaWQnfSIpLCAtY2xhc3MgPT4gImxpc3QifSwKKwkJCSAgICAgICI8Yj4iIC4gZXNjX2h0bWwoJHRhZ3snbmFtZSd9KSAuICI8L2I+IikgLgorCQkJICAgICAgIjwvdGQ+XG4iIC4KKwkJCSAgICAgICI8dGQ+IjsKKwkJCWlmIChkZWZpbmVkKCRjb21tZW50KSkgeworCQkJICAgICAgcHJpbnQgJGNnaS0+YSh7LWNsYXNzID0+ICJsaXN0IiwgLWhyZWYgPT4gIiRteV91cmk/IiAuIGVzY19wYXJhbSgicD0kcHJvamVjdDthPXRhZztoPSR0YWd7J2lkJ30iKX0sICRjb21tZW50KTsKKwkJCX0KKwkJCXByaW50ICI8L3RkPlxuIiAuCisJCQkgICAgICAiPHRkIGNsYXNzPVwibGlua1wiPiI7CisJCQlpZiAoJHRhZ3sndHlwZSd9IGVxICJ0YWciKSB7CisJCQkgICAgICBwcmludCAkY2dpLT5hKHstaHJlZiA9PiAiJG15X3VyaT8iIC4gZXNjX3BhcmFtKCJwPSRwcm9qZWN0O2E9dGFnO2g9JHRhZ3snaWQnfSIpfSwgInRhZyIpIC4gIiB8ICI7CisJCQl9CisJCQlwcmludCAkY2dpLT5hKHstaHJlZiA9PiAiJG15X3VyaT8iIC4gZXNjX3BhcmFtKCJwPSRwcm9qZWN0O2E9JHRhZ3sncmVmdHlwZSd9O2g9JHRhZ3sncmVmaWQnfSIpfSwgJHRhZ3sncmVmdHlwZSd9KTsKKwkJCWlmICgkdGFneydyZWZ0eXBlJ30gZXEgImNvbW1pdCIpIHsKKwkJCSAgICAgIHByaW50ICIgfCAiIC4gJGNnaS0+YSh7LWhyZWYgPT4gIiRteV91cmk/IiAuIGVzY19wYXJhbSgicD0kcHJvamVjdDthPXNob3J0bG9nO2g9JHRhZ3snbmFtZSd9Iil9LCAic2hvcnRsb2ciKSAuCisJCQkgICAgICAgICAgICAiIHwgIiAuICRjZ2ktPmEoey1ocmVmID0+ICIkbXlfdXJpPyIgLiBlc2NfcGFyYW0oInA9JHByb2plY3Q7YT1sb2c7aD0kdGFneydyZWZpZCd9Iil9LCAibG9nIik7CisJCQl9CisJCQlwcmludCAiPC90ZD5cbiIgLgorCQkJICAgICAgIjwvdHI+IjsKKwkJfQorCX0KKwlwcmludCAiPC90YWJsZVxuPiI7CisJZ2l0X2Zvb3Rlcl9odG1sKCk7Cit9CisKK3N1YiBnaXRfaGVhZHMgeworCW15ICRoZWFkID0gZ2l0X3JlYWRfaGVhZCgkcHJvamVjdCk7CisJZ2l0X2hlYWRlcl9odG1sKCk7CisJcHJpbnQgIjxkaXYgY2xhc3M9XCJwYWdlX25hdlwiPlxuIiAuCisJICAgICAgJGNnaS0+YSh7LWhyZWYgPT4gIiRteV91cmk/IiAuIGVzY19wYXJhbSgicD0kcHJvamVjdDthPXN1bW1hcnkiKX0sICJzdW1tYXJ5IikgLgorCSAgICAgICIgfCAiIC4gJGNnaS0+YSh7LWhyZWYgPT4gIiRteV91cmk/IiAuIGVzY19wYXJhbSgicD0kcHJvamVjdDthPXNob3J0bG9nIil9LCAic2hvcnRsb2ciKSAuCisJICAgICAgIiB8ICIgLiAkY2dpLT5hKHstaHJlZiA9PiAiJG15X3VyaT8iIC4gZXNjX3BhcmFtKCJwPSRwcm9qZWN0O2E9bG9nIil9LCAibG9nIikgLgorCSAgICAgICIgfCAiIC4gJGNnaS0+YSh7LWhyZWYgPT4gIiRteV91cmk/IiAuIGVzY19wYXJhbSgicD0kcHJvamVjdDthPWNvbW1pdDtoPSRoZWFkIil9LCAiY29tbWl0IikgLgorCSAgICAgICIgfCAiIC4gJGNnaS0+YSh7LWhyZWYgPT4gIiRteV91cmk/IiAuIGVzY19wYXJhbSgicD0kcHJvamVjdDthPWNvbW1pdGRpZmY7aD0kaGVhZCIpfSwgImNvbW1pdGRpZmYiKSAuCisJICAgICAgIiB8ICIgLiAkY2dpLT5hKHstaHJlZiA9PiAiJG15X3VyaT8iIC4gZXNjX3BhcmFtKCJwPSRwcm9qZWN0O2E9dHJlZTtoYj0kaGVhZCIpfSwgInRyZWUiKSAuICI8YnIvPlxuIiAuCisJICAgICAgIjxici8+XG4iIC4KKwkgICAgICAiPC9kaXY+XG4iOworCW15ICR0YWdsaXN0ID0gZ2l0X3JlYWRfcmVmcygicmVmcy9oZWFkcyIpOworCXByaW50ICI8ZGl2PlxuIiAuCisJICAgICAgJGNnaS0+YSh7LWhyZWYgPT4gIiRteV91cmk/IiAuIGVzY19wYXJhbSgicD0kcHJvamVjdDthPXN1bW1hcnkiKSwgLWNsYXNzID0+ICJ0aXRsZSJ9LCAiJm5ic3A7IikgLgorCSAgICAgICI8L2Rpdj5cbiI7CisJcHJpbnQgIjx0YWJsZSBjZWxsc3BhY2luZz1cIjBcIj5cbiI7CisJbXkgJGFsdGVybmF0ZSA9IDA7CisJaWYgKGRlZmluZWQgQCR0YWdsaXN0KSB7CisJCWZvcmVhY2ggbXkgJGVudHJ5IChAJHRhZ2xpc3QpIHsKKwkJCW15ICV0YWcgPSAlJGVudHJ5OworCQkJaWYgKCRhbHRlcm5hdGUpIHsKKwkJCQlwcmludCAiPHRyIGNsYXNzPVwiZGFya1wiPlxuIjsKKwkJCX0gZWxzZSB7CisJCQkJcHJpbnQgIjx0ciBjbGFzcz1cImxpZ2h0XCI+XG4iOworCQkJfQorCQkJJGFsdGVybmF0ZSBePSAxOworCQkJcHJpbnQgIjx0ZD48aT4kdGFneydhZ2UnfTwvaT48L3RkPlxuIiAuCisJCQkgICAgICAiPHRkPiIgLgorCQkJICAgICAgJGNnaS0+YSh7LWhyZWYgPT4gIiRteV91cmk/IiAuIGVzY19wYXJhbSgicD0kcHJvamVjdDthPXNob3J0bG9nO2g9JHRhZ3snbmFtZSd9IiksIC1jbGFzcyA9PiAibGlzdCJ9LCAiPGI+IiAuIGVzY19odG1sKCR0YWd7J25hbWUnfSkgLiAiPC9iPiIpIC4KKwkJCSAgICAgICI8L3RkPlxuIiAuCisJCQkgICAgICAiPHRkIGNsYXNzPVwibGlua1wiPiIgLgorCQkJICAgICAgJGNnaS0+YSh7LWhyZWYgPT4gIiRteV91cmk/IiAuIGVzY19wYXJhbSgicD0kcHJvamVjdDthPXNob3J0bG9nO2g9JHRhZ3snbmFtZSd9Iil9LCAic2hvcnRsb2ciKSAuCisJCQkgICAgICAiIHwgIiAuICRjZ2ktPmEoey1ocmVmID0+ICIkbXlfdXJpPyIgLiBlc2NfcGFyYW0oInA9JHByb2plY3Q7YT1sb2c7aD0kdGFneyduYW1lJ30iKX0sICJsb2ciKSAuCisJCQkgICAgICAiPC90ZD5cbiIgLgorCQkJICAgICAgIjwvdHI+IjsKKwkJfQorCX0KKwlwcmludCAiPC90YWJsZVxuPiI7CisJZ2l0X2Zvb3Rlcl9odG1sKCk7Cit9CisKK3N1YiBnaXRfZ2V0X2hhc2hfYnlfcGF0aCB7CisJbXkgJGJhc2UgPSBzaGlmdDsKKwlteSAkcGF0aCA9IHNoaWZ0IHx8IHJldHVybiB1bmRlZjsKKworCW15ICR0cmVlID0gJGJhc2U7CisJbXkgQHBhcnRzID0gc3BsaXQgJy8nLCAkcGF0aDsKKwl3aGlsZSAobXkgJHBhcnQgPSBzaGlmdCBAcGFydHMpIHsKKwkJb3BlbiBteSAkZmQsICItfCIsICIkZ2l0YmluL2dpdC1scy10cmVlICR0cmVlIiBvciBkaWVfZXJyb3IodW5kZWYsICJPcGVuIGdpdC1scy10cmVlIGZhaWxlZC4iKTsKKwkJbXkgKEBlbnRyaWVzKSA9IG1hcCB7IGNob21wOyAkXyB9IDwkZmQ+OworCQljbG9zZSAkZmQgb3IgcmV0dXJuIHVuZGVmOworCQlmb3JlYWNoIG15ICRsaW5lIChAZW50cmllcykgeworCQkJIycxMDA2NDQJYmxvYgkwZmEzZjNhNjZmYjZhMTM3ZjZlYzJjMTkzNTFlZDRkODA3MDcwZmZhCXBhbmljLmMnCisJCQkkbGluZSA9fiBtL14oWzAtOV0rKSAoLispIChbMC05YS1mQS1GXXs0MH0pXHQoLispJC87CisJCQlteSAkdF9tb2RlID0gJDE7CisJCQlteSAkdF90eXBlID0gJDI7CisJCQlteSAkdF9oYXNoID0gJDM7CisJCQlteSAkdF9uYW1lID0gdmFsaWRhdGVfaW5wdXQodW5xdW90ZSgkNCkpOworCQkJaWYgKCR0X25hbWUgZXEgJHBhcnQpIHsKKwkJCQlpZiAoIShAcGFydHMpKSB7CisJCQkJCXJldHVybiAkdF9oYXNoOworCQkJCX0KKwkJCQlpZiAoJHRfdHlwZSBlcSAidHJlZSIpIHsKKwkJCQkJJHRyZWUgPSAkdF9oYXNoOworCQkJCX0KKwkJCQlsYXN0OworCQkJfQorCQl9CisJfQorfQorCitzdWIgZ2l0X2Jsb2IgeworCWlmICghZGVmaW5lZCAkaGFzaCAmJiBkZWZpbmVkICRmaWxlX25hbWUpIHsKKwkJbXkgJGJhc2UgPSAkaGFzaF9iYXNlIHx8IGdpdF9yZWFkX2hlYWQoJHByb2plY3QpOworCQkkaGFzaCA9IGdpdF9nZXRfaGFzaF9ieV9wYXRoKCRiYXNlLCAkZmlsZV9uYW1lLCAiYmxvYiIpIHx8IGRpZV9lcnJvcih1bmRlZiwgIkVycm9yIGxvb2t1cCBmaWxlLiIpOworCX0KKwlvcGVuIG15ICRmZCwgIi18IiwgIiRnaXRiaW4vZ2l0LWNhdC1maWxlIGJsb2IgJGhhc2giIG9yIGRpZV9lcnJvcih1bmRlZiwgIk9wZW4gZmFpbGVkLiIpOworCWdpdF9oZWFkZXJfaHRtbCgpOworCWlmIChkZWZpbmVkICRoYXNoX2Jhc2UgJiYgKG15ICVjbyA9IGdpdF9yZWFkX2NvbW1pdCgkaGFzaF9iYXNlKSkpIHsKKwkJcHJpbnQgIjxkaXYgY2xhc3M9XCJwYWdlX25hdlwiPlxuIiAuCisJCSAgICAgICRjZ2ktPmEoey1ocmVmID0+ICIkbXlfdXJpPyIgLiBlc2NfcGFyYW0oInA9JHByb2plY3Q7YT1zdW1tYXJ5Iil9LCAic3VtbWFyeSIpIC4KKwkJICAgICAgIiB8ICIgLiAkY2dpLT5hKHstaHJlZiA9PiAiJG15X3VyaT8iIC4gZXNjX3BhcmFtKCJwPSRwcm9qZWN0O2E9c2hvcnRsb2ciKX0sICJzaG9ydGxvZyIpIC4KKwkJICAgICAgIiB8ICIgLiAkY2dpLT5hKHstaHJlZiA9PiAiJG15X3VyaT8iIC4gZXNjX3BhcmFtKCJwPSRwcm9qZWN0O2E9bG9nIil9LCAibG9nIikgLgorCQkgICAgICAiIHwgIiAuICRjZ2ktPmEoey1ocmVmID0+ICIkbXlfdXJpPyIgLiBlc2NfcGFyYW0oInA9JHByb2plY3Q7YT1jb21taXQ7aD0kaGFzaF9iYXNlIil9LCAiY29tbWl0IikgLgorCQkgICAgICAiIHwgIiAuICRjZ2ktPmEoey1ocmVmID0+ICIkbXlfdXJpPyIgLiBlc2NfcGFyYW0oInA9JHByb2plY3Q7YT1jb21taXRkaWZmO2g9JGhhc2hfYmFzZSIpfSwgImNvbW1pdGRpZmYiKSAuCisJCSAgICAgICIgfCAiIC4gJGNnaS0+YSh7LWhyZWYgPT4gIiRteV91cmk/IiAuIGVzY19wYXJhbSgicD0kcHJvamVjdDthPXRyZWU7aD0kY297J3RyZWUnfTtoYj0kaGFzaF9iYXNlIil9LCAidHJlZSIpIC4gIjxici8+XG4iOworCQlpZiAoZGVmaW5lZCAkZmlsZV9uYW1lKSB7CisJCQlwcmludCAkY2dpLT5hKHstaHJlZiA9PiAiJG15X3VyaT8iIC4gZXNjX3BhcmFtKCJwPSRwcm9qZWN0O2E9YmxvYl9wbGFpbjtoPSRoYXNoO2Y9JGZpbGVfbmFtZSIpfSwgInBsYWluIikgLgorCQkJIiB8ICIgLiAkY2dpLT5hKHstaHJlZiA9PiAiJG15X3VyaT8iIC4gZXNjX3BhcmFtKCJwPSRwcm9qZWN0O2E9YmxvYjtoYj1IRUFEO2Y9JGZpbGVfbmFtZSIpfSwgImhlYWQiKSAuICI8YnIvPlxuIjsKKwkJfSBlbHNlIHsKKwkJCXByaW50ICRjZ2ktPmEoey1ocmVmID0+ICIkbXlfdXJpPyIgLiBlc2NfcGFyYW0oInA9JHByb2plY3Q7YT1ibG9iX3BsYWluO2g9JGhhc2giKX0sICJwbGFpbiIpIC4gIjxici8+XG4iOworCQl9CisJCXByaW50ICI8L2Rpdj5cbiIuCisJCSAgICAgICAiPGRpdj4iIC4KKwkJICAgICAgJGNnaS0+YSh7LWhyZWYgPT4gIiRteV91cmk/IiAuIGVzY19wYXJhbSgicD0kcHJvamVjdDthPWNvbW1pdDtoPSRoYXNoX2Jhc2UiKSwgLWNsYXNzID0+ICJ0aXRsZSJ9LCBlc2NfaHRtbCgkY297J3RpdGxlJ30pKSAuCisJCSAgICAgICI8L2Rpdj5cbiI7CisJfSBlbHNlIHsKKwkJcHJpbnQgIjxkaXYgY2xhc3M9XCJwYWdlX25hdlwiPlxuIiAuCisJCSAgICAgICI8YnIvPjxici8+PC9kaXY+XG4iIC4KKwkJICAgICAgIjxkaXYgY2xhc3M9XCJ0aXRsZVwiPiRoYXNoPC9kaXY+XG4iOworCX0KKwlpZiAoZGVmaW5lZCAkZmlsZV9uYW1lKSB7CisJCXByaW50ICI8ZGl2IGNsYXNzPVwicGFnZV9wYXRoXCI+PGI+IiAuIGVzY19odG1sKCRmaWxlX25hbWUpIC4gIjwvYj48L2Rpdj5cbiI7CisJfQorCXByaW50ICI8ZGl2IGNsYXNzPVwicGFnZV9ib2R5XCI+XG4iOworCW15ICRucjsKKwl3aGlsZSAobXkgJGxpbmUgPSA8JGZkPikgeworCQljaG9tcCAkbGluZTsKKwkJJG5yKys7CisJCXdoaWxlICgobXkgJHBvcyA9IGluZGV4KCRsaW5lLCAiXHQiKSkgIT0gLTEpIHsKKwkJCWlmIChteSAkY291bnQgPSAoOCAtICgkcG9zICUgOCkpKSB7CisJCQkJbXkgJHNwYWNlcyA9ICcgJyB4ICRjb3VudDsKKwkJCQkkbGluZSA9fiBzL1x0LyRzcGFjZXMvOworCQkJfQorCQl9CisJCXByaW50ZiAiPGRpdiBjbGFzcz1cInByZVwiPjxhIGlkPVwibCVpXCIgaHJlZj1cIiNsJWlcIiBjbGFzcz1cImxpbmVuclwiPiU0aTwvYT4gJXM8L2Rpdj5cbiIsICRuciwgJG5yLCAkbnIsIGVzY19odG1sKCRsaW5lKTsKKwl9CisJY2xvc2UgJGZkIG9yIHByaW50ICJSZWFkaW5nIGJsb2IgZmFpbGVkLlxuIjsKKwlwcmludCAiPC9kaXY+IjsKKwlnaXRfZm9vdGVyX2h0bWwoKTsKK30KKworc3ViIGdpdF9ibG9iX3BsYWluIHsKKwlteSAkc2F2ZV9hcyA9ICIkaGFzaC50eHQiOworCWlmIChkZWZpbmVkICRmaWxlX25hbWUpIHsKKwkJJHNhdmVfYXMgPSAkZmlsZV9uYW1lOworCX0KKwlwcmludCAkY2dpLT5oZWFkZXIoLXR5cGUgPT4gInRleHQvcGxhaW4iLCAtY2hhcnNldCA9PiAndXRmLTgnLCAnLWNvbnRlbnQtZGlzcG9zaXRpb24nID0+ICJpbmxpbmU7IGZpbGVuYW1lPVwiJHNhdmVfYXNcIiIpOworCW9wZW4gbXkgJGZkLCAiLXwiLCAiJGdpdGJpbi9naXQtY2F0LWZpbGUgYmxvYiAkaGFzaCIgb3IgcmV0dXJuOworCXVuZGVmICQvOworCXByaW50IDwkZmQ+OworCSQvID0gIlxuIjsKKwljbG9zZSAkZmQ7Cit9CisKK3N1YiBnaXRfdHJlZSB7CisJaWYgKCFkZWZpbmVkICRoYXNoKSB7CisJCSRoYXNoID0gZ2l0X3JlYWRfaGVhZCgkcHJvamVjdCk7CisJCWlmIChkZWZpbmVkICRmaWxlX25hbWUpIHsKKwkJCW15ICRiYXNlID0gJGhhc2hfYmFzZSB8fCAkaGFzaDsKKwkJCSRoYXNoID0gZ2l0X2dldF9oYXNoX2J5X3BhdGgoJGJhc2UsICRmaWxlX25hbWUsICJ0cmVlIik7CisJCX0KKwkJaWYgKCFkZWZpbmVkICRoYXNoX2Jhc2UpIHsKKwkJCSRoYXNoX2Jhc2UgPSAkaGFzaDsKKwkJfQorCX0KKwkkLyA9ICJcMCI7CisJb3BlbiBteSAkZmQsICItfCIsICIkZ2l0YmluL2dpdC1scy10cmVlIC16ICRoYXNoIiBvciBkaWVfZXJyb3IodW5kZWYsICJPcGVuIGdpdC1scy10cmVlIGZhaWxlZC4iKTsKKwljaG9tcCAobXkgKEBlbnRyaWVzKSA9IDwkZmQ+KTsKKwljbG9zZSAkZmQgb3IgZGllX2Vycm9yKHVuZGVmLCAiUmVhZGluZyB0cmVlIGZhaWxlZC4iKTsKKwkkLyA9ICJcbiI7CisKKwlteSAkcmVmcyA9IHJlYWRfaW5mb19yZWYoKTsKKwlteSAkcmVmID0gIiI7CisJaWYgKGRlZmluZWQgJHJlZnMtPnskaGFzaF9iYXNlfSkgeworCQkkcmVmID0gIiA8c3BhbiBjbGFzcz1cInRhZ1wiPiIgLiBlc2NfaHRtbCgkcmVmcy0+eyRoYXNoX2Jhc2V9KSAuICI8L3NwYW4+IjsKKwl9CisJZ2l0X2hlYWRlcl9odG1sKCk7CisJbXkgJGJhc2Vfa2V5ID0gIiI7CisJbXkgJGJhc2UgPSAiIjsKKwlpZiAoZGVmaW5lZCAkaGFzaF9iYXNlICYmIChteSAlY28gPSBnaXRfcmVhZF9jb21taXQoJGhhc2hfYmFzZSkpKSB7CisJCSRiYXNlX2tleSA9ICI7aGI9JGhhc2hfYmFzZSI7CisJCXByaW50ICI8ZGl2IGNsYXNzPVwicGFnZV9uYXZcIj5cbiIgLgorCQkgICAgICAkY2dpLT5hKHstaHJlZiA9PiAiJG15X3VyaT8iIC4gZXNjX3BhcmFtKCJwPSRwcm9qZWN0O2E9c3VtbWFyeSIpfSwgInN1bW1hcnkiKSAuCisJCSAgICAgICIgfCAiIC4gJGNnaS0+YSh7LWhyZWYgPT4gIiRteV91cmk/IiAuIGVzY19wYXJhbSgicD0kcHJvamVjdDthPXNob3J0bG9nO2g9JGhhc2hfYmFzZSIpfSwgInNob3J0bG9nIikgLgorCQkgICAgICAiIHwgIiAuICRjZ2ktPmEoey1ocmVmID0+ICIkbXlfdXJpPyIgLiBlc2NfcGFyYW0oInA9JHByb2plY3Q7YT1sb2c7aD0kaGFzaF9iYXNlIil9LCAibG9nIikgLgorCQkgICAgICAiIHwgIiAuICRjZ2ktPmEoey1ocmVmID0+ICIkbXlfdXJpPyIgLiBlc2NfcGFyYW0oInA9JHByb2plY3Q7YT1jb21taXQ7aD0kaGFzaF9iYXNlIil9LCAiY29tbWl0IikgLgorCQkgICAgICAiIHwgIiAuICRjZ2ktPmEoey1ocmVmID0+ICIkbXlfdXJpPyIgLiBlc2NfcGFyYW0oInA9JHByb2plY3Q7YT1jb21taXRkaWZmO2g9JGhhc2hfYmFzZSIpfSwgImNvbW1pdGRpZmYiKSAuCisJCSAgICAgICIgfCB0cmVlIiAuCisJCSAgICAgICI8YnIvPjxici8+XG4iIC4KKwkJICAgICAgIjwvZGl2PlxuIjsKKwkJcHJpbnQgIjxkaXY+XG4iIC4KKwkJICAgICAgJGNnaS0+YSh7LWhyZWYgPT4gIiRteV91cmk/IiAuIGVzY19wYXJhbSgicD0kcHJvamVjdDthPWNvbW1pdDtoPSRoYXNoX2Jhc2UiKSwgLWNsYXNzID0+ICJ0aXRsZSJ9LCBlc2NfaHRtbCgkY297J3RpdGxlJ30pIC4gJHJlZikgLiAiXG4iIC4KKwkJICAgICAgIjwvZGl2PlxuIjsKKwl9IGVsc2UgeworCQlwcmludCAiPGRpdiBjbGFzcz1cInBhZ2VfbmF2XCI+XG4iOworCQlwcmludCAiPGJyLz48YnIvPjwvZGl2PlxuIjsKKwkJcHJpbnQgIjxkaXYgY2xhc3M9XCJ0aXRsZVwiPiRoYXNoPC9kaXY+XG4iOworCX0KKwlpZiAoZGVmaW5lZCAkZmlsZV9uYW1lKSB7CisJCSRiYXNlID0gZXNjX2h0bWwoIiRmaWxlX25hbWUvIik7CisJCXByaW50ICI8ZGl2IGNsYXNzPVwicGFnZV9wYXRoXCI+PGI+LyIgLiBlc2NfaHRtbCgkZmlsZV9uYW1lKSAuICI8L2I+PC9kaXY+XG4iOworCX0gZWxzZSB7CisJCXByaW50ICI8ZGl2IGNsYXNzPVwicGFnZV9wYXRoXCI+PGI+LzwvYj48L2Rpdj5cbiI7CisJfQorCXByaW50ICI8ZGl2IGNsYXNzPVwicGFnZV9ib2R5XCI+XG4iOworCXByaW50ICI8dGFibGUgY2VsbHNwYWNpbmc9XCIwXCI+XG4iOworCW15ICRhbHRlcm5hdGUgPSAwOworCWZvcmVhY2ggbXkgJGxpbmUgKEBlbnRyaWVzKSB7CisJCSMnMTAwNjQ0CWJsb2IJMGZhM2YzYTY2ZmI2YTEzN2Y2ZWMyYzE5MzUxZWQ0ZDgwNzA3MGZmYQlwYW5pYy5jJworCQkkbGluZSA9fiBtL14oWzAtOV0rKSAoLispIChbMC05YS1mQS1GXXs0MH0pXHQoLispJC87CisJCW15ICR0X21vZGUgPSAkMTsKKwkJbXkgJHRfdHlwZSA9ICQyOworCQlteSAkdF9oYXNoID0gJDM7CisJCW15ICR0X25hbWUgPSB2YWxpZGF0ZV9pbnB1dCgkNCk7CisJCWlmICgkYWx0ZXJuYXRlKSB7CisJCQlwcmludCAiPHRyIGNsYXNzPVwiZGFya1wiPlxuIjsKKwkJfSBlbHNlIHsKKwkJCXByaW50ICI8dHIgY2xhc3M9XCJsaWdodFwiPlxuIjsKKwkJfQorCQkkYWx0ZXJuYXRlIF49IDE7CisJCXByaW50ICI8dGQgc3R5bGU9XCJmb250LWZhbWlseTptb25vc3BhY2VcIj4iIC4gbW9kZV9zdHIoJHRfbW9kZSkgLiAiPC90ZD5cbiI7CisJCWlmICgkdF90eXBlIGVxICJibG9iIikgeworCQkJcHJpbnQgIjx0ZCBjbGFzcz1cImxpc3RcIj4iIC4KKwkJCSAgICAgICRjZ2ktPmEoey1ocmVmID0+ICIkbXlfdXJpPyIgLiBlc2NfcGFyYW0oInA9JHByb2plY3Q7YT1ibG9iO2g9JHRfaGFzaCRiYXNlX2tleTtmPSRiYXNlJHRfbmFtZSIpLCAtY2xhc3MgPT4gImxpc3QifSwgZXNjX2h0bWwoJHRfbmFtZSkpIC4KKwkJCSAgICAgICI8L3RkPlxuIiAuCisJCQkgICAgICAiPHRkIGNsYXNzPVwibGlua1wiPiIgLgorCQkJICAgICAgJGNnaS0+YSh7LWhyZWYgPT4gIiRteV91cmk/IiAuIGVzY19wYXJhbSgicD0kcHJvamVjdDthPWJsb2I7aD0kdF9oYXNoJGJhc2Vfa2V5O2Y9JGJhc2UkdF9uYW1lIil9LCAiYmxvYiIpIC4KKwkJCSAgICAgICIgfCAiIC4gJGNnaS0+YSh7LWhyZWYgPT4gIiRteV91cmk/IiAuIGVzY19wYXJhbSgicD0kcHJvamVjdDthPWhpc3Rvcnk7aD0kaGFzaF9iYXNlO2Y9JGJhc2UkdF9uYW1lIil9LCAiaGlzdG9yeSIpIC4KKwkJCSAgICAgICI8L3RkPlxuIjsKKwkJfSBlbHNpZiAoJHRfdHlwZSBlcSAidHJlZSIpIHsKKwkJCXByaW50ICI8dGQgY2xhc3M9XCJsaXN0XCI+IiAuCisJCQkgICAgICAkY2dpLT5hKHstaHJlZiA9PiAiJG15X3VyaT8iIC4gZXNjX3BhcmFtKCJwPSRwcm9qZWN0O2E9dHJlZTtoPSR0X2hhc2gkYmFzZV9rZXk7Zj0kYmFzZSR0X25hbWUiKX0sIGVzY19odG1sKCR0X25hbWUpKSAuCisJCQkgICAgICAiPC90ZD5cbiIgLgorCQkJICAgICAgIjx0ZCBjbGFzcz1cImxpbmtcIj4iIC4KKwkJCSAgICAgICRjZ2ktPmEoey1ocmVmID0+ICIkbXlfdXJpPyIgLiBlc2NfcGFyYW0oInA9JHByb2plY3Q7YT10cmVlO2g9JHRfaGFzaCRiYXNlX2tleTtmPSRiYXNlJHRfbmFtZSIpfSwgInRyZWUiKSAuCisJCQkgICAgICAiPC90ZD5cbiI7CisJCX0KKwkJcHJpbnQgIjwvdHI+XG4iOworCX0KKwlwcmludCAiPC90YWJsZT5cbiIgLgorCSAgICAgICI8L2Rpdj4iOworCWdpdF9mb290ZXJfaHRtbCgpOworfQorCitzdWIgZ2l0X3JzcyB7CisJIyBodHRwOi8vd3d3Lm5vdGVzdGlwcy5jb20vODAyNTZCM0EwMDdGMjY5Mi8xL05BTU81UDlVUFEKKwlvcGVuIG15ICRmZCwgIi18IiwgIiRnaXRiaW4vZ2l0LXJldi1saXN0IC0tbWF4LWNvdW50PTE1MCAiIC4gZ2l0X3JlYWRfaGVhZCgkcHJvamVjdCkgb3IgZGllX2Vycm9yKHVuZGVmLCAiT3BlbiBmYWlsZWQuIik7CisJbXkgKEByZXZsaXN0KSA9IG1hcCB7IGNob21wOyAkXyB9IDwkZmQ+OworCWNsb3NlICRmZCBvciBkaWVfZXJyb3IodW5kZWYsICJSZWFkaW5nIHJldi1saXN0IGZhaWxlZC4iKTsKKwlwcmludCAkY2dpLT5oZWFkZXIoLXR5cGUgPT4gJ3RleHQveG1sJywgLWNoYXJzZXQgPT4gJ3V0Zi04Jyk7CisJcHJpbnQgIjw/eG1sIHZlcnNpb249XCIxLjBcIiBlbmNvZGluZz1cInV0Zi04XCI/PlxuIi4KKwkgICAgICAiPHJzcyB2ZXJzaW9uPVwiMi4wXCIgeG1sbnM6Y29udGVudD1cImh0dHA6Ly9wdXJsLm9yZy9yc3MvMS4wL21vZHVsZXMvY29udGVudC9cIj5cbiI7CisJcHJpbnQgIjxjaGFubmVsPlxuIjsKKwlwcmludCAiPHRpdGxlPiRwcm9qZWN0PC90aXRsZT5cbiIuCisJICAgICAgIjxsaW5rPiIgLiBlc2NfaHRtbCgiJG15X3VybD9wPSRwcm9qZWN0O2E9c3VtbWFyeSIpIC4gIjwvbGluaz5cbiIuCisJICAgICAgIjxkZXNjcmlwdGlvbj4kcHJvamVjdCBsb2c8L2Rlc2NyaXB0aW9uPlxuIi4KKwkgICAgICAiPGxhbmd1YWdlPmVuPC9sYW5ndWFnZT5cbiI7CisKKwlmb3IgKG15ICRpID0gMDsgJGkgPD0gJCNyZXZsaXN0OyAkaSsrKSB7CisJCW15ICRjb21taXQgPSAkcmV2bGlzdFskaV07CisJCW15ICVjbyA9IGdpdF9yZWFkX2NvbW1pdCgkY29tbWl0KTsKKwkJIyB3ZSByZWFkIDE1MCwgd2UgYWx3YXlzIHNob3cgMzAgYW5kIHRoZSBvbmVzIG1vcmUgcmVjZW50IHRoYW4gNDggaG91cnMKKwkJaWYgKCgkaSA+PSAyMCkgJiYgKCh0aW1lIC0gJGNveydjb21taXR0ZXJfZXBvY2gnfSkgPiA0OCo2MCo2MCkpIHsKKwkJCWxhc3Q7CisJCX0KKwkJbXkgJWNkID0gZGF0ZV9zdHIoJGNveydjb21taXR0ZXJfZXBvY2gnfSk7CisJCW9wZW4gJGZkLCAiLXwiLCAiJGdpdGJpbi9naXQtZGlmZi10cmVlIC1yICRjb3sncGFyZW50J30gJGNveydpZCd9IiBvciBuZXh0OworCQlteSBAZGlmZnRyZWUgPSBtYXAgeyBjaG9tcDsgJF8gfSA8JGZkPjsKKwkJY2xvc2UgJGZkIG9yIG5leHQ7CisJCXByaW50ICI8aXRlbT5cbiIgLgorCQkgICAgICAiPHRpdGxlPiIgLgorCQkgICAgICBzcHJpbnRmKCIlZCAlcyAlMDJkOiUwMmQiLCAkY2R7J21kYXknfSwgJGNkeydtb250aCd9LCAkY2R7J2hvdXInfSwgJGNkeydtaW51dGUnfSkgLiAiIC0gIiAuIGVzY19odG1sKCRjb3sndGl0bGUnfSkgLgorCQkgICAgICAiPC90aXRsZT5cbiIgLgorCQkgICAgICAiPGF1dGhvcj4iIC4gZXNjX2h0bWwoJGNveydhdXRob3InfSkgLiAiPC9hdXRob3I+XG4iIC4KKwkJICAgICAgIjxwdWJEYXRlPiRjZHsncmZjMjgyMid9PC9wdWJEYXRlPlxuIiAuCisJCSAgICAgICI8Z3VpZCBpc1Blcm1hTGluaz1cInRydWVcIj4iIC4gZXNjX2h0bWwoIiRteV91cmw/cD0kcHJvamVjdDthPWNvbW1pdDtoPSRjb21taXQiKSAuICI8L2d1aWQ+XG4iIC4KKwkJICAgICAgIjxsaW5rPiIgLiBlc2NfaHRtbCgiJG15X3VybD9wPSRwcm9qZWN0O2E9Y29tbWl0O2g9JGNvbW1pdCIpIC4gIjwvbGluaz5cbiIgLgorCQkgICAgICAiPGRlc2NyaXB0aW9uPiIgLiBlc2NfaHRtbCgkY297J3RpdGxlJ30pIC4gIjwvZGVzY3JpcHRpb24+XG4iIC4KKwkJICAgICAgIjxjb250ZW50OmVuY29kZWQ+IiAuCisJCSAgICAgICI8IVtDREFUQVtcbiI7CisJCW15ICRjb21tZW50ID0gJGNveydjb21tZW50J307CisJCWZvcmVhY2ggbXkgJGxpbmUgKEAkY29tbWVudCkgeworCQkJJGxpbmUgPSBkZWNvZGUoInV0ZjgiLCAkbGluZSwgRW5jb2RlOjpGQl9ERUZBVUxUKTsKKwkJCXByaW50ICIkbGluZTxici8+XG4iOworCQl9CisJCXByaW50ICI8YnIvPlxuIjsKKwkJZm9yZWFjaCBteSAkbGluZSAoQGRpZmZ0cmVlKSB7CisJCQlpZiAoISgkbGluZSA9fiBtL146KFswLTddezZ9KSAoWzAtN117Nn0pIChbMC05YS1mQS1GXXs0MH0pIChbMC05YS1mQS1GXXs0MH0pICguKShbMC05XXswLDN9KVx0KC4qKSQvKSkgeworCQkJCW5leHQ7CisJCQl9CisJCQlteSAkZmlsZSA9IHZhbGlkYXRlX2lucHV0KHVucXVvdGUoJDcpKTsKKwkJCSRmaWxlID0gZGVjb2RlKCJ1dGY4IiwgJGZpbGUsIEVuY29kZTo6RkJfREVGQVVMVCk7CisJCQlwcmludCAiJGZpbGU8YnIvPlxuIjsKKwkJfQorCQlwcmludCAiXV0+XG4iIC4KKwkJICAgICAgIjwvY29udGVudDplbmNvZGVkPlxuIiAuCisJCSAgICAgICI8L2l0ZW0+XG4iOworCX0KKwlwcmludCAiPC9jaGFubmVsPjwvcnNzPiI7Cit9CisKK3N1YiBnaXRfb3BtbCB7CisJbXkgQGxpc3QgPSBnaXRfcmVhZF9wcm9qZWN0cygpOworCisJcHJpbnQgJGNnaS0+aGVhZGVyKC10eXBlID0+ICd0ZXh0L3htbCcsIC1jaGFyc2V0ID0+ICd1dGYtOCcpOworCXByaW50ICI8P3htbCB2ZXJzaW9uPVwiMS4wXCIgZW5jb2Rpbmc9XCJ1dGYtOFwiPz5cbiIuCisJICAgICAgIjxvcG1sIHZlcnNpb249XCIxLjBcIj5cbiIuCisJICAgICAgIjxoZWFkPiIuCisJICAgICAgIiAgPHRpdGxlPkdpdCBPUE1MIEV4cG9ydDwvdGl0bGU+XG4iLgorCSAgICAgICI8L2hlYWQ+XG4iLgorCSAgICAgICI8Ym9keT5cbiIuCisJICAgICAgIjxvdXRsaW5lIHRleHQ9XCJnaXQgUlNTIGZlZWRzXCI+XG4iOworCisJZm9yZWFjaCBteSAkcHIgKEBsaXN0KSB7CisJCW15ICVwcm9qID0gJSRwcjsKKwkJbXkgJGhlYWQgPSBnaXRfcmVhZF9oZWFkKCRwcm9qeydwYXRoJ30pOworCQlpZiAoIWRlZmluZWQgJGhlYWQpIHsKKwkJCW5leHQ7CisJCX0KKwkJJEVOVnsnR0lUX0RJUid9ID0gIiRwcm9qZWN0cm9vdC8kcHJvansncGF0aCd9IjsKKwkJbXkgJWNvID0gZ2l0X3JlYWRfY29tbWl0KCRoZWFkKTsKKwkJaWYgKCElY28pIHsKKwkJCW5leHQ7CisJCX0KKworCQlteSAkcGF0aCA9IGVzY19odG1sKGNob3Bfc3RyKCRwcm9qeydwYXRoJ30sIDI1LCA1KSk7CisJCW15ICRyc3MgPSAgIiRteV91cmw/cD0kcHJvansncGF0aCd9O2E9cnNzIjsKKwkJbXkgJGh0bWwgPSAgIiRteV91cmw/cD0kcHJvansncGF0aCd9O2E9c3VtbWFyeSI7CisJCXByaW50ICI8b3V0bGluZSB0eXBlPVwicnNzXCIgdGV4dD1cIiRwYXRoXCIgdGl0bGU9XCIkcGF0aFwiIHhtbFVybD1cIiRyc3NcIiBodG1sVXJsPVwiJGh0bWxcIi8+XG4iOworCX0KKwlwcmludCAiPC9vdXRsaW5lPlxuIi4KKwkgICAgICAiPC9ib2R5PlxuIi4KKwkgICAgICAiPC9vcG1sPlxuIjsKK30KKworc3ViIGdpdF9sb2cgeworCW15ICRoZWFkID0gZ2l0X3JlYWRfaGVhZCgkcHJvamVjdCk7CisJaWYgKCFkZWZpbmVkICRoYXNoKSB7CisJCSRoYXNoID0gJGhlYWQ7CisJfQorCWlmICghZGVmaW5lZCAkcGFnZSkgeworCQkkcGFnZSA9IDA7CisJfQorCW15ICRyZWZzID0gcmVhZF9pbmZvX3JlZigpOworCWdpdF9oZWFkZXJfaHRtbCgpOworCXByaW50ICI8ZGl2IGNsYXNzPVwicGFnZV9uYXZcIj5cbiI7CisJcHJpbnQgJGNnaS0+YSh7LWhyZWYgPT4gIiRteV91cmk/IiAuIGVzY19wYXJhbSgicD0kcHJvamVjdDthPXN1bW1hcnkiKX0sICJzdW1tYXJ5IikgLgorCSAgICAgICIgfCAiIC4gJGNnaS0+YSh7LWhyZWYgPT4gIiRteV91cmk/IiAuIGVzY19wYXJhbSgicD0kcHJvamVjdDthPXNob3J0bG9nO2g9JGhhc2giKX0sICJzaG9ydGxvZyIpIC4KKwkgICAgICAiIHwgbG9nIiAuCisJICAgICAgIiB8ICIgLiAkY2dpLT5hKHstaHJlZiA9PiAiJG15X3VyaT8iIC4gZXNjX3BhcmFtKCJwPSRwcm9qZWN0O2E9Y29tbWl0O2g9JGhhc2giKX0sICJjb21taXQiKSAuCisJICAgICAgIiB8ICIgLiAkY2dpLT5hKHstaHJlZiA9PiAiJG15X3VyaT8iIC4gZXNjX3BhcmFtKCJwPSRwcm9qZWN0O2E9Y29tbWl0ZGlmZjtoPSRoYXNoIil9LCAiY29tbWl0ZGlmZiIpIC4KKwkgICAgICAiIHwgIiAuICRjZ2ktPmEoey1ocmVmID0+ICIkbXlfdXJpPyIgLiBlc2NfcGFyYW0oInA9JHByb2plY3Q7YT10cmVlO2g9JGhhc2g7aGI9JGhhc2giKX0sICJ0cmVlIikgLiAiPGJyLz5cbiI7CisKKwlteSAkbGltaXQgPSBzcHJpbnRmKCItLW1heC1jb3VudD0laSIsICgxMDAgKiAoJHBhZ2UrMSkpKTsKKwlvcGVuIG15ICRmZCwgIi18IiwgIiRnaXRiaW4vZ2l0LXJldi1saXN0ICRsaW1pdCAkaGFzaCIgb3IgZGllX2Vycm9yKHVuZGVmLCAiT3BlbiBmYWlsZWQuIik7CisJbXkgKEByZXZsaXN0KSA9IG1hcCB7IGNob21wOyAkXyB9IDwkZmQ+OworCWNsb3NlICRmZDsKKworCWlmICgkaGFzaCBuZSAkaGVhZCB8fCAkcGFnZSkgeworCQlwcmludCAkY2dpLT5hKHstaHJlZiA9PiAiJG15X3VyaT8iIC4gZXNjX3BhcmFtKCJwPSRwcm9qZWN0O2E9bG9nIil9LCAiSEVBRCIpOworCX0gZWxzZSB7CisJCXByaW50ICJIRUFEIjsKKwl9CisJaWYgKCRwYWdlID4gMCkgeworCQlwcmludCAiICZzZG90OyAiIC4KKwkJJGNnaS0+YSh7LWhyZWYgPT4gIiRteV91cmk/IiAuIGVzY19wYXJhbSgicD0kcHJvamVjdDthPWxvZztoPSRoYXNoO3BnPSIgLiAoJHBhZ2UtMSkpLCAtYWNjZXNza2V5ID0+ICJwIiwgLXRpdGxlID0+ICJBbHQtcCJ9LCAicHJldiIpOworCX0gZWxzZSB7CisJCXByaW50ICIgJnNkb3Q7IHByZXYiOworCX0KKwlpZiAoJCNyZXZsaXN0ID49ICgxMDAgKiAoJHBhZ2UrMSktMSkpIHsKKwkJcHJpbnQgIiAmc2RvdDsgIiAuCisJCSRjZ2ktPmEoey1ocmVmID0+ICIkbXlfdXJpPyIgLiBlc2NfcGFyYW0oInA9JHByb2plY3Q7YT1sb2c7aD0kaGFzaDtwZz0iIC4gKCRwYWdlKzEpKSwgLWFjY2Vzc2tleSA9PiAibiIsIC10aXRsZSA9PiAiQWx0LW4ifSwgIm5leHQiKTsKKwl9IGVsc2UgeworCQlwcmludCAiICZzZG90OyBuZXh0IjsKKwl9CisJcHJpbnQgIjxici8+XG4iIC4KKwkgICAgICAiPC9kaXY+XG4iOworCWlmICghQHJldmxpc3QpIHsKKwkJcHJpbnQgIjxkaXY+XG4iIC4KKwkJICAgICAgJGNnaS0+YSh7LWhyZWYgPT4gIiRteV91cmk/IiAuIGVzY19wYXJhbSgicD0kcHJvamVjdDthPXN1bW1hcnkiKSwgLWNsYXNzID0+ICJ0aXRsZSJ9LCAiJm5ic3A7IikgLgorCQkgICAgICAiPC9kaXY+XG4iOworCQlteSAlY28gPSBnaXRfcmVhZF9jb21taXQoJGhhc2gpOworCQlwcmludCAiPGRpdiBjbGFzcz1cInBhZ2VfYm9keVwiPiBMYXN0IGNoYW5nZSAkY297J2FnZV9zdHJpbmcnfS48YnIvPjxici8+PC9kaXY+XG4iOworCX0KKwlmb3IgKG15ICRpID0gKCRwYWdlICogMTAwKTsgJGkgPD0gJCNyZXZsaXN0OyAkaSsrKSB7CisJCW15ICRjb21taXQgPSAkcmV2bGlzdFskaV07CisJCW15ICRyZWYgPSAiIjsKKwkJaWYgKGRlZmluZWQgJHJlZnMtPnskY29tbWl0fSkgeworCQkJJHJlZiA9ICIgPHNwYW4gY2xhc3M9XCJ0YWdcIj4iIC4gZXNjX2h0bWwoJHJlZnMtPnskY29tbWl0fSkgLiAiPC9zcGFuPiI7CisJCX0KKwkJbXkgJWNvID0gZ2l0X3JlYWRfY29tbWl0KCRjb21taXQpOworCQluZXh0IGlmICElY287CisJCW15ICVhZCA9IGRhdGVfc3RyKCRjb3snYXV0aG9yX2Vwb2NoJ30pOworCQlwcmludCAiPGRpdj5cbiIgLgorCQkgICAgICAkY2dpLT5hKHstaHJlZiA9PiAiJG15X3VyaT8iIC4gZXNjX3BhcmFtKCJwPSRwcm9qZWN0O2E9Y29tbWl0O2g9JGNvbW1pdCIpLCAtY2xhc3MgPT4gInRpdGxlIn0sCisJCSAgICAgICI8c3BhbiBjbGFzcz1cImFnZVwiPiRjb3snYWdlX3N0cmluZyd9PC9zcGFuPiIgLiBlc2NfaHRtbCgkY297J3RpdGxlJ30pIC4gJHJlZikgLiAiXG4iOworCQlwcmludCAiPC9kaXY+XG4iOworCQlwcmludCAiPGRpdiBjbGFzcz1cInRpdGxlX3RleHRcIj5cbiIgLgorCQkgICAgICAiPGRpdiBjbGFzcz1cImxvZ19saW5rXCI+XG4iIC4KKwkJICAgICAgJGNnaS0+YSh7LWhyZWYgPT4gIiRteV91cmk/IiAuIGVzY19wYXJhbSgicD0kcHJvamVjdDthPWNvbW1pdDtoPSRjb21taXQiKX0sICJjb21taXQiKSAuCisJCSAgICAgICIgfCAiIC4gJGNnaS0+YSh7LWhyZWYgPT4gIiRteV91cmk/IiAuIGVzY19wYXJhbSgicD0kcHJvamVjdDthPWNvbW1pdGRpZmY7aD0kY29tbWl0Iil9LCAiY29tbWl0ZGlmZiIpIC4KKwkJICAgICAgIjxici8+XG4iIC4KKwkJICAgICAgIjwvZGl2PlxuIiAuCisJCSAgICAgICI8aT4iIC4gZXNjX2h0bWwoJGNveydhdXRob3JfbmFtZSd9KSAuICAiIFskYWR7J3JmYzI4MjInfV08L2k+PGJyLz5cbiIgLgorCQkgICAgICAiPC9kaXY+XG4iIC4KKwkJICAgICAgIjxkaXYgY2xhc3M9XCJsb2dfYm9keVwiPlxuIjsKKwkJbXkgJGNvbW1lbnQgPSAkY297J2NvbW1lbnQnfTsKKwkJbXkgJGVtcHR5ID0gMDsKKwkJZm9yZWFjaCBteSAkbGluZSAoQCRjb21tZW50KSB7CisJCQlpZiAoJGxpbmUgPX4gbS9eICooc2lnbmVkWyBcLV1vZmZbIFwtXWJ5WyA6XXxhY2tlZFsgXC1dYnlbIDpdfGNjWyA6XSkvaSkgeworCQkJCW5leHQ7CisJCQl9CisJCQlpZiAoJGxpbmUgZXEgIiIpIHsKKwkJCQlpZiAoJGVtcHR5KSB7CisJCQkJCW5leHQ7CisJCQkJfQorCQkJCSRlbXB0eSA9IDE7CisJCQl9IGVsc2UgeworCQkJCSRlbXB0eSA9IDA7CisJCQl9CisJCQlwcmludCBmb3JtYXRfbG9nX2xpbmVfaHRtbCgkbGluZSkgLiAiPGJyLz5cbiI7CisJCX0KKwkJaWYgKCEkZW1wdHkpIHsKKwkJCXByaW50ICI8YnIvPlxuIjsKKwkJfQorCQlwcmludCAiPC9kaXY+XG4iOworCX0KKwlnaXRfZm9vdGVyX2h0bWwoKTsKK30KKworc3ViIGdpdF9jb21taXQgeworCW15ICVjbyA9IGdpdF9yZWFkX2NvbW1pdCgkaGFzaCk7CisJaWYgKCElY28pIHsKKwkJZGllX2Vycm9yKHVuZGVmLCAiVW5rbm93biBjb21taXQgb2JqZWN0LiIpOworCX0KKwlteSAlYWQgPSBkYXRlX3N0cigkY297J2F1dGhvcl9lcG9jaCd9LCAkY297J2F1dGhvcl90eid9KTsKKwlteSAlY2QgPSBkYXRlX3N0cigkY297J2NvbW1pdHRlcl9lcG9jaCd9LCAkY297J2NvbW1pdHRlcl90eid9KTsKKworCW15IEBkaWZmdHJlZTsKKwlteSAkcm9vdCA9ICIiOworCW15ICRwYXJlbnQgPSAkY297J3BhcmVudCd9OworCWlmICghZGVmaW5lZCAkcGFyZW50KSB7CisJCSRyb290ID0gIiAtLXJvb3QiOworCQkkcGFyZW50ID0gIiI7CisJfQorCW9wZW4gbXkgJGZkLCAiLXwiLCAiJGdpdGJpbi9naXQtZGlmZi10cmVlIC1yIC1NICRyb290ICRwYXJlbnQgJGhhc2giIG9yIGRpZV9lcnJvcih1bmRlZiwgIk9wZW4gZmFpbGVkLiIpOworCUBkaWZmdHJlZSA9IG1hcCB7IGNob21wOyAkXyB9IDwkZmQ+OworCWNsb3NlICRmZCBvciBkaWVfZXJyb3IodW5kZWYsICJSZWFkaW5nIGRpZmYtdHJlZSBmYWlsZWQuIik7CisKKwkjIG5vbi10ZXh0dWFsIGhhc2ggaWQncyBjYW4gYmUgY2FjaGVkCisJbXkgJGV4cGlyZXM7CisJaWYgKCRoYXNoID1+IG0vXlswLTlhLWZBLUZdezQwfSQvKSB7CisJCSRleHBpcmVzID0gIisxZCI7CisJfQorCW15ICRyZWZzID0gcmVhZF9pbmZvX3JlZigpOworCW15ICRyZWYgPSAiIjsKKwlpZiAoZGVmaW5lZCAkcmVmcy0+eyRjb3snaWQnfX0pIHsKKwkJJHJlZiA9ICIgPHNwYW4gY2xhc3M9XCJ0YWdcIj4iIC4gZXNjX2h0bWwoJHJlZnMtPnskY297J2lkJ319KSAuICI8L3NwYW4+IjsKKwl9CisJZ2l0X2hlYWRlcl9odG1sKHVuZGVmLCAkZXhwaXJlcyk7CisJcHJpbnQgIjxkaXYgY2xhc3M9XCJwYWdlX25hdlwiPlxuIiAuCisJICAgICAgJGNnaS0+YSh7LWhyZWYgPT4gIiRteV91cmk/IiAuIGVzY19wYXJhbSgicD0kcHJvamVjdDthPXN1bW1hcnkiKX0sICJzdW1tYXJ5IikgLgorCSAgICAgICIgfCAiIC4gJGNnaS0+YSh7LWhyZWYgPT4gIiRteV91cmk/IiAuIGVzY19wYXJhbSgicD0kcHJvamVjdDthPXNob3J0bG9nO2g9JGhhc2giKX0sICJzaG9ydGxvZyIpIC4KKwkgICAgICAiIHwgIiAuICRjZ2ktPmEoey1ocmVmID0+ICIkbXlfdXJpPyIgLiBlc2NfcGFyYW0oInA9JHByb2plY3Q7YT1sb2c7aD0kaGFzaCIpfSwgImxvZyIpIC4KKwkgICAgICAiIHwgY29tbWl0IjsKKwlpZiAoZGVmaW5lZCAkY297J3BhcmVudCd9KSB7CisJCXByaW50ICIgfCAiIC4gJGNnaS0+YSh7LWhyZWYgPT4gIiRteV91cmk/IiAuIGVzY19wYXJhbSgicD0kcHJvamVjdDthPWNvbW1pdGRpZmY7aD0kaGFzaCIpfSwgImNvbW1pdGRpZmYiKTsKKwl9CisJcHJpbnQgIiB8ICIgLiAkY2dpLT5hKHstaHJlZiA9PiAiJG15X3VyaT8iIC4gZXNjX3BhcmFtKCJwPSRwcm9qZWN0O2E9dHJlZTtoPSRjb3sndHJlZSd9O2hiPSRoYXNoIil9LCAidHJlZSIpIC4gIlxuIiAuCisJICAgICAgIjxici8+PGJyLz48L2Rpdj5cbiI7CisJaWYgKGRlZmluZWQgJGNveydwYXJlbnQnfSkgeworCQlwcmludCAiPGRpdj5cbiIgLgorCQkgICAgICAkY2dpLT5hKHstaHJlZiA9PiAiJG15X3VyaT8iIC4gZXNjX3BhcmFtKCJwPSRwcm9qZWN0O2E9Y29tbWl0ZGlmZjtoPSRoYXNoIiksIC1jbGFzcyA9PiAidGl0bGUifSwgZXNjX2h0bWwoJGNveyd0aXRsZSd9KSAuICRyZWYpIC4gIlxuIiAuCisJCSAgICAgICI8L2Rpdj5cbiI7CisJfSBlbHNlIHsKKwkJcHJpbnQgIjxkaXY+XG4iIC4KKwkJICAgICAgJGNnaS0+YSh7LWhyZWYgPT4gIiRteV91cmk/IiAuIGVzY19wYXJhbSgicD0kcHJvamVjdDthPXRyZWU7aD0kY297J3RyZWUnfTtoYj0kaGFzaCIpLCAtY2xhc3MgPT4gInRpdGxlIn0sIGVzY19odG1sKCRjb3sndGl0bGUnfSkpIC4gIlxuIiAuCisJCSAgICAgICI8L2Rpdj5cbiI7CisJfQorCXByaW50ICI8ZGl2IGNsYXNzPVwidGl0bGVfdGV4dFwiPlxuIiAuCisJICAgICAgIjx0YWJsZSBjZWxsc3BhY2luZz1cIjBcIj5cbiI7CisJcHJpbnQgIjx0cj48dGQ+YXV0aG9yPC90ZD48dGQ+IiAuIGVzY19odG1sKCRjb3snYXV0aG9yJ30pIC4gIjwvdGQ+PC90cj5cbiIuCisJICAgICAgIjx0cj4iIC4KKwkgICAgICAiPHRkPjwvdGQ+PHRkPiAkYWR7J3JmYzI4MjInfSI7CisJaWYgKCRhZHsnaG91cl9sb2NhbCd9IDwgNikgeworCQlwcmludGYoIiAoPHNwYW4gc3R5bGU9XCJjb2xvcjogI2NjMDAwMDtcIj4lMDJkOiUwMmQ8L3NwYW4+ICVzKSIsICRhZHsnaG91cl9sb2NhbCd9LCAkYWR7J21pbnV0ZV9sb2NhbCd9LCAkYWR7J3R6X2xvY2FsJ30pOworCX0gZWxzZSB7CisJCXByaW50ZigiICglMDJkOiUwMmQgJXMpIiwgJGFkeydob3VyX2xvY2FsJ30sICRhZHsnbWludXRlX2xvY2FsJ30sICRhZHsndHpfbG9jYWwnfSk7CisJfQorCXByaW50ICI8L3RkPiIgLgorCSAgICAgICI8L3RyPlxuIjsKKwlwcmludCAiPHRyPjx0ZD5jb21taXR0ZXI8L3RkPjx0ZD4iIC4gZXNjX2h0bWwoJGNveydjb21taXR0ZXInfSkgLiAiPC90ZD48L3RyPlxuIjsKKwlwcmludCAiPHRyPjx0ZD48L3RkPjx0ZD4gJGNkeydyZmMyODIyJ30iIC4gc3ByaW50ZigiICglMDJkOiUwMmQgJXMpIiwgJGNkeydob3VyX2xvY2FsJ30sICRjZHsnbWludXRlX2xvY2FsJ30sICRjZHsndHpfbG9jYWwnfSkgLiAiPC90ZD48L3RyPlxuIjsKKwlwcmludCAiPHRyPjx0ZD5jb21taXQ8L3RkPjx0ZCBzdHlsZT1cImZvbnQtZmFtaWx5Om1vbm9zcGFjZVwiPiRjb3snaWQnfTwvdGQ+PC90cj5cbiI7CisJcHJpbnQgIjx0cj4iIC4KKwkgICAgICAiPHRkPnRyZWU8L3RkPiIgLgorCSAgICAgICI8dGQgc3R5bGU9XCJmb250LWZhbWlseTptb25vc3BhY2VcIj4iIC4KKwkgICAgICAkY2dpLT5hKHstaHJlZiA9PiAiJG15X3VyaT8iIC4gZXNjX3BhcmFtKCJwPSRwcm9qZWN0O2E9dHJlZTtoPSRjb3sndHJlZSd9O2hiPSRoYXNoIiksIGNsYXNzID0+ICJsaXN0In0sICRjb3sndHJlZSd9KSAuCisJICAgICAgIjwvdGQ+IiAuCisJICAgICAgIjx0ZCBjbGFzcz1cImxpbmtcIj4iIC4gJGNnaS0+YSh7LWhyZWYgPT4gIiRteV91cmk/IiAuIGVzY19wYXJhbSgicD0kcHJvamVjdDthPXRyZWU7aD0kY297J3RyZWUnfTtoYj0kaGFzaCIpfSwgInRyZWUiKSAuCisJICAgICAgIjwvdGQ+IiAuCisJICAgICAgIjwvdHI+XG4iOworCW15ICRwYXJlbnRzICA9ICRjb3sncGFyZW50cyd9OworCWZvcmVhY2ggbXkgJHBhciAoQCRwYXJlbnRzKSB7CisJCXByaW50ICI8dHI+IiAuCisJCSAgICAgICI8dGQ+cGFyZW50PC90ZD4iIC4KKwkJICAgICAgIjx0ZCBzdHlsZT1cImZvbnQtZmFtaWx5Om1vbm9zcGFjZVwiPiIgLiAkY2dpLT5hKHstaHJlZiA9PiAiJG15X3VyaT8iIC4gZXNjX3BhcmFtKCJwPSRwcm9qZWN0O2E9Y29tbWl0O2g9JHBhciIpLCBjbGFzcyA9PiAibGlzdCJ9LCAkcGFyKSAuICI8L3RkPiIgLgorCQkgICAgICAiPHRkIGNsYXNzPVwibGlua1wiPiIgLgorCQkgICAgICAkY2dpLT5hKHstaHJlZiA9PiAiJG15X3VyaT8iIC4gZXNjX3BhcmFtKCJwPSRwcm9qZWN0O2E9Y29tbWl0O2g9JHBhciIpfSwgImNvbW1pdCIpIC4KKwkJICAgICAgIiB8ICIgLiAkY2dpLT5hKHstaHJlZiA9PiAiJG15X3VyaT8iIC4gZXNjX3BhcmFtKCJwPSRwcm9qZWN0O2E9Y29tbWl0ZGlmZjtoPSRoYXNoO2hwPSRwYXIiKX0sICJjb21taXRkaWZmIikgLgorCQkgICAgICAiPC90ZD4iIC4KKwkJICAgICAgIjwvdHI+XG4iOworCX0KKwlwcmludCAiPC90YWJsZT4iLiAKKwkgICAgICAiPC9kaXY+XG4iOworCXByaW50ICI8ZGl2IGNsYXNzPVwicGFnZV9ib2R5XCI+XG4iOworCW15ICRjb21tZW50ID0gJGNveydjb21tZW50J307CisJbXkgJGVtcHR5ID0gMDsKKwlteSAkc2lnbmVkID0gMDsKKwlmb3JlYWNoIG15ICRsaW5lIChAJGNvbW1lbnQpIHsKKwkJIyBwcmludCBvbmx5IG9uZSBlbXB0eSBsaW5lCisJCWlmICgkbGluZSBlcSAiIikgeworCQkJaWYgKCRlbXB0eSB8fCAkc2lnbmVkKSB7CisJCQkJbmV4dDsKKwkJCX0KKwkJCSRlbXB0eSA9IDE7CisJCX0gZWxzZSB7CisJCQkkZW1wdHkgPSAwOworCQl9CisJCWlmICgkbGluZSA9fiBtL14gKihzaWduZWRbIFwtXW9mZlsgXC1dYnlbIDpdfGFja2VkWyBcLV1ieVsgOl18Y2NbIDpdKS9pKSB7CisJCQkkc2lnbmVkID0gMTsKKwkJCXByaW50ICI8c3BhbiBzdHlsZT1cImNvbG9yOiAjODg4ODg4XCI+IiAuIGVzY19odG1sKCRsaW5lKSAuICI8L3NwYW4+PGJyLz5cbiI7CisJCX0gZWxzZSB7CisJCQkkc2lnbmVkID0gMDsKKwkJCXByaW50IGZvcm1hdF9sb2dfbGluZV9odG1sKCRsaW5lKSAuICI8YnIvPlxuIjsKKwkJfQorCX0KKwlwcmludCAiPC9kaXY+XG4iOworCXByaW50ICI8ZGl2IGNsYXNzPVwibGlzdF9oZWFkXCI+XG4iOworCWlmICgkI2RpZmZ0cmVlID4gMTApIHsKKwkJcHJpbnQoKCQjZGlmZnRyZWUgKyAxKSAuICIgZmlsZXMgY2hhbmdlZDpcbiIpOworCX0KKwlwcmludCAiPC9kaXY+XG4iOworCXByaW50ICI8dGFibGUgY2VsbHNwYWNpbmc9XCIwXCI+XG4iOworCW15ICRhbHRlcm5hdGUgPSAwOworCWZvcmVhY2ggbXkgJGxpbmUgKEBkaWZmdHJlZSkgeworCQkjICc6MTAwNjQ0IDEwMDY0NCAwM2IyMTgyNjBlOTliNzhjNmRmMGVkMzc4ZTU5ZWQ5MjA1Y2NjOTZkIDNiOTNkNWU3Y2M3ZjdkZDRlYmVkMTNhNWNjMWE0YWQ5NzZmYzk0ZDggTSAgICAgIGxzLWZpbGVzLmMnCisJCSMgJzoxMDA2NDQgMTAwNjQ0IDdmOTI4MTk4NTA4Njk3MWQzODc3YWNhMjc3MDRmMmFhZjljNDQ4Y2UgYmMxOTBlYmM3MWJiZDkyM2YyYjcyOGU1MDU0MDhmNWU1NGJkMDczYSBNICAgICAgcmV2LXRyZWUuYycKKwkJaWYgKCEoJGxpbmUgPX4gbS9eOihbMC03XXs2fSkgKFswLTddezZ9KSAoWzAtOWEtZkEtRl17NDB9KSAoWzAtOWEtZkEtRl17NDB9KSAoLikoWzAtOV17MCwzfSlcdCguKikkLykpIHsKKwkJCW5leHQ7CisJCX0KKwkJbXkgJGZyb21fbW9kZSA9ICQxOworCQlteSAkdG9fbW9kZSA9ICQyOworCQlteSAkZnJvbV9pZCA9ICQzOworCQlteSAkdG9faWQgPSAkNDsKKwkJbXkgJHN0YXR1cyA9ICQ1OworCQlteSAkc2ltaWxhcml0eSA9ICQ2OworCQlteSAkZmlsZSA9IHZhbGlkYXRlX2lucHV0KHVucXVvdGUoJDcpKTsKKwkJaWYgKCRhbHRlcm5hdGUpIHsKKwkJCXByaW50ICI8dHIgY2xhc3M9XCJkYXJrXCI+XG4iOworCQl9IGVsc2UgeworCQkJcHJpbnQgIjx0ciBjbGFzcz1cImxpZ2h0XCI+XG4iOworCQl9CisJCSRhbHRlcm5hdGUgXj0gMTsKKwkJaWYgKCRzdGF0dXMgZXEgIkEiKSB7CisJCQlteSAkbW9kZV9jaG5nID0gIiI7CisJCQlpZiAoU19JU1JFRyhvY3QgJHRvX21vZGUpKSB7CisJCQkJJG1vZGVfY2huZyA9IHNwcmludGYoIiB3aXRoIG1vZGU6ICUwNG8iLCAob2N0ICR0b19tb2RlKSAmIDA3NzcpOworCQkJfQorCQkJcHJpbnQgIjx0ZD4iIC4KKwkJCSAgICAgICRjZ2ktPmEoey1ocmVmID0+ICIkbXlfdXJpPyIgLiBlc2NfcGFyYW0oInA9JHByb2plY3Q7YT1ibG9iO2g9JHRvX2lkO2hiPSRoYXNoO2Y9JGZpbGUiKSwgLWNsYXNzID0+ICJsaXN0In0sIGVzY19odG1sKCRmaWxlKSkgLiAiPC90ZD5cbiIgLgorCQkJICAgICAgIjx0ZD48c3BhbiBzdHlsZT1cImNvbG9yOiAjMDA4MDAwO1wiPltuZXcgIiAuIGZpbGVfdHlwZSgkdG9fbW9kZSkgLiAiJG1vZGVfY2huZ108L3NwYW4+PC90ZD5cbiIgLgorCQkJICAgICAgIjx0ZCBjbGFzcz1cImxpbmtcIj4iIC4gJGNnaS0+YSh7LWhyZWYgPT4gIiRteV91cmk/IiAuIGVzY19wYXJhbSgicD0kcHJvamVjdDthPWJsb2I7aD0kdG9faWQ7aGI9JGhhc2g7Zj0kZmlsZSIpfSwgImJsb2IiKSAuICI8L3RkPlxuIjsKKwkJfSBlbHNpZiAoJHN0YXR1cyBlcSAiRCIpIHsKKwkJCXByaW50ICI8dGQ+IiAuCisJCQkgICAgICAkY2dpLT5hKHstaHJlZiA9PiAiJG15X3VyaT8iIC4gZXNjX3BhcmFtKCJwPSRwcm9qZWN0O2E9YmxvYjtoPSRmcm9tX2lkO2hiPSRoYXNoO2Y9JGZpbGUiKSwgLWNsYXNzID0+ICJsaXN0In0sIGVzY19odG1sKCRmaWxlKSkgLiAiPC90ZD5cbiIgLgorCQkJICAgICAgIjx0ZD48c3BhbiBzdHlsZT1cImNvbG9yOiAjYzAwMDAwO1wiPltkZWxldGVkICIgLiBmaWxlX3R5cGUoJGZyb21fbW9kZSkuICJdPC9zcGFuPjwvdGQ+XG4iIC4KKwkJCSAgICAgICI8dGQgY2xhc3M9XCJsaW5rXCI+IiAuCisJCQkgICAgICAkY2dpLT5hKHstaHJlZiA9PiAiJG15X3VyaT8iIC4gZXNjX3BhcmFtKCJwPSRwcm9qZWN0O2E9YmxvYjtoPSRmcm9tX2lkO2hiPSRoYXNoO2Y9JGZpbGUiKX0sICJibG9iIikgLgorCQkJICAgICAgIiB8ICIgLiAkY2dpLT5hKHstaHJlZiA9PiAiJG15X3VyaT8iIC4gZXNjX3BhcmFtKCJwPSRwcm9qZWN0O2E9aGlzdG9yeTtoPSRoYXNoO2Y9JGZpbGUiKX0sICJoaXN0b3J5IikgLgorCQkJICAgICAgIjwvdGQ+XG4iCisJCX0gZWxzaWYgKCRzdGF0dXMgZXEgIk0iIHx8ICRzdGF0dXMgZXEgIlQiKSB7CisJCQlteSAkbW9kZV9jaG5nZSA9ICIiOworCQkJaWYgKCRmcm9tX21vZGUgIT0gJHRvX21vZGUpIHsKKwkJCQkkbW9kZV9jaG5nZSA9ICIgPHNwYW4gc3R5bGU9XCJjb2xvcjogIzc3Nzc3NztcIj5bY2hhbmdlZCI7CisJCQkJaWYgKCgob2N0ICRmcm9tX21vZGUpICYgU19JRk1UKSAhPSAoKG9jdCAkdG9fbW9kZSkgJiBTX0lGTVQpKSB7CisJCQkJCSRtb2RlX2NobmdlIC49ICIgZnJvbSAiIC4gZmlsZV90eXBlKCRmcm9tX21vZGUpIC4gIiB0byAiIC4gZmlsZV90eXBlKCR0b19tb2RlKTsKKwkJCQl9CisJCQkJaWYgKCgob2N0ICRmcm9tX21vZGUpICYgMDc3NykgIT0gKChvY3QgJHRvX21vZGUpICYgMDc3NykpIHsKKwkJCQkJaWYgKFNfSVNSRUcoJGZyb21fbW9kZSkgJiYgU19JU1JFRygkdG9fbW9kZSkpIHsKKwkJCQkJCSRtb2RlX2NobmdlIC49IHNwcmludGYoIiBtb2RlOiAlMDRvLT4lMDRvIiwgKG9jdCAkZnJvbV9tb2RlKSAmIDA3NzcsIChvY3QgJHRvX21vZGUpICYgMDc3Nyk7CisJCQkJCX0gZWxzaWYgKFNfSVNSRUcoJHRvX21vZGUpKSB7CisJCQkJCQkkbW9kZV9jaG5nZSAuPSBzcHJpbnRmKCIgbW9kZTogJTA0byIsIChvY3QgJHRvX21vZGUpICYgMDc3Nyk7CisJCQkJCX0KKwkJCQl9CisJCQkJJG1vZGVfY2huZ2UgLj0gIl08L3NwYW4+XG4iOworCQkJfQorCQkJcHJpbnQgIjx0ZD4iOworCQkJaWYgKCR0b19pZCBuZSAkZnJvbV9pZCkgeworCQkJCXByaW50ICRjZ2ktPmEoey1ocmVmID0+ICIkbXlfdXJpPyIgLiBlc2NfcGFyYW0oInA9JHByb2plY3Q7YT1ibG9iZGlmZjtoPSR0b19pZDtocD0kZnJvbV9pZDtoYj0kaGFzaDtmPSRmaWxlIiksIC1jbGFzcyA9PiAibGlzdCJ9LCBlc2NfaHRtbCgkZmlsZSkpOworCQkJfSBlbHNlIHsKKwkJCQlwcmludCAkY2dpLT5hKHstaHJlZiA9PiAiJG15X3VyaT8iIC4gZXNjX3BhcmFtKCJwPSRwcm9qZWN0O2E9YmxvYjtoPSR0b19pZDtoYj0kaGFzaDtmPSRmaWxlIiksIC1jbGFzcyA9PiAibGlzdCJ9LCBlc2NfaHRtbCgkZmlsZSkpOworCQkJfQorCQkJcHJpbnQgIjwvdGQ+XG4iIC4KKwkJCSAgICAgICI8dGQ+JG1vZGVfY2huZ2U8L3RkPlxuIiAuCisJCQkgICAgICAiPHRkIGNsYXNzPVwibGlua1wiPiI7CisJCQlwcmludCAkY2dpLT5hKHstaHJlZiA9PiAiJG15X3VyaT8iIC4gZXNjX3BhcmFtKCJwPSRwcm9qZWN0O2E9YmxvYjtoPSR0b19pZDtoYj0kaGFzaDtmPSRmaWxlIil9LCAiYmxvYiIpOworCQkJaWYgKCR0b19pZCBuZSAkZnJvbV9pZCkgeworCQkJCXByaW50ICIgfCAiIC4gJGNnaS0+YSh7LWhyZWYgPT4gIiRteV91cmk/IiAuIGVzY19wYXJhbSgicD0kcHJvamVjdDthPWJsb2JkaWZmO2g9JHRvX2lkO2hwPSRmcm9tX2lkO2hiPSRoYXNoO2Y9JGZpbGUiKX0sICJkaWZmIik7CisJCQl9CisJCQlwcmludCAiIHwgIiAuICRjZ2ktPmEoey1ocmVmID0+ICIkbXlfdXJpPyIgLiBlc2NfcGFyYW0oInA9JHByb2plY3Q7YT1oaXN0b3J5O2g9JGhhc2g7Zj0kZmlsZSIpfSwgImhpc3RvcnkiKSAuICJcbiI7CisJCQlwcmludCAiPC90ZD5cbiI7CisJCX0gZWxzaWYgKCRzdGF0dXMgZXEgIlIiKSB7CisJCQlteSAoJGZyb21fZmlsZSwgJHRvX2ZpbGUpID0gc3BsaXQgIlx0IiwgJGZpbGU7CisJCQlteSAkbW9kZV9jaG5nID0gIiI7CisJCQlpZiAoJGZyb21fbW9kZSAhPSAkdG9fbW9kZSkgeworCQkJCSRtb2RlX2NobmcgPSBzcHJpbnRmKCIsIG1vZGU6ICUwNG8iLCAob2N0ICR0b19tb2RlKSAmIDA3NzcpOworCQkJfQorCQkJcHJpbnQgIjx0ZD4iIC4KKwkJCSAgICAgICRjZ2ktPmEoey1ocmVmID0+ICIkbXlfdXJpPyIgLiBlc2NfcGFyYW0oInA9JHByb2plY3Q7YT1ibG9iO2g9JHRvX2lkO2hiPSRoYXNoO2Y9JHRvX2ZpbGUiKSwgLWNsYXNzID0+ICJsaXN0In0sIGVzY19odG1sKCR0b19maWxlKSkgLiAiPC90ZD5cbiIgLgorCQkJICAgICAgIjx0ZD48c3BhbiBzdHlsZT1cImNvbG9yOiAjNzc3Nzc3O1wiPlttb3ZlZCBmcm9tICIgLgorCQkJICAgICAgJGNnaS0+YSh7LWhyZWYgPT4gIiRteV91cmk/IiAuIGVzY19wYXJhbSgicD0kcHJvamVjdDthPWJsb2I7aD0kZnJvbV9pZDtoYj0kaGFzaDtmPSRmcm9tX2ZpbGUiKSwgLWNsYXNzID0+ICJsaXN0In0sIGVzY19odG1sKCRmcm9tX2ZpbGUpKSAuCisJCQkgICAgICAiIHdpdGggIiAuIChpbnQgJHNpbWlsYXJpdHkpIC4gIiUgc2ltaWxhcml0eSRtb2RlX2NobmddPC9zcGFuPjwvdGQ+XG4iIC4KKwkJCSAgICAgICI8dGQgY2xhc3M9XCJsaW5rXCI+IiAuCisJCQkgICAgICAkY2dpLT5hKHstaHJlZiA9PiAiJG15X3VyaT8iIC4gZXNjX3BhcmFtKCJwPSRwcm9qZWN0O2E9YmxvYjtoPSR0b19pZDtoYj0kaGFzaDtmPSR0b19maWxlIil9LCAiYmxvYiIpOworCQkJaWYgKCR0b19pZCBuZSAkZnJvbV9pZCkgeworCQkJCXByaW50ICIgfCAiIC4gJGNnaS0+YSh7LWhyZWYgPT4gIiRteV91cmk/IiAuIGVzY19wYXJhbSgicD0kcHJvamVjdDthPWJsb2JkaWZmO2g9JHRvX2lkO2hwPSRmcm9tX2lkO2hiPSRoYXNoO2Y9JHRvX2ZpbGUiKX0sICJkaWZmIik7CisJCQl9CisJCQlwcmludCAiPC90ZD5cbiI7CisJCX0KKwkJcHJpbnQgIjwvdHI+XG4iOworCX0KKwlwcmludCAiPC90YWJsZT5cbiI7CisJZ2l0X2Zvb3Rlcl9odG1sKCk7Cit9CisKK3N1YiBnaXRfYmxvYmRpZmYgeworCW1rZGlyKCRnaXRfdGVtcCwgMDcwMCk7CisJZ2l0X2hlYWRlcl9odG1sKCk7CisJaWYgKGRlZmluZWQgJGhhc2hfYmFzZSAmJiAobXkgJWNvID0gZ2l0X3JlYWRfY29tbWl0KCRoYXNoX2Jhc2UpKSkgeworCQlwcmludCAiPGRpdiBjbGFzcz1cInBhZ2VfbmF2XCI+XG4iIC4KKwkJICAgICAgJGNnaS0+YSh7LWhyZWYgPT4gIiRteV91cmk/IiAuIGVzY19wYXJhbSgicD0kcHJvamVjdDthPXN1bW1hcnkiKX0sICJzdW1tYXJ5IikgLgorCQkgICAgICAiIHwgIiAuICRjZ2ktPmEoey1ocmVmID0+ICIkbXlfdXJpPyIgLiBlc2NfcGFyYW0oInA9JHByb2plY3Q7YT1zaG9ydGxvZyIpfSwgInNob3J0bG9nIikgLgorCQkgICAgICAiIHwgIiAuICRjZ2ktPmEoey1ocmVmID0+ICIkbXlfdXJpPyIgLiBlc2NfcGFyYW0oInA9JHByb2plY3Q7YT1sb2ciKX0sICJsb2ciKSAuCisJCSAgICAgICIgfCAiIC4gJGNnaS0+YSh7LWhyZWYgPT4gIiRteV91cmk/IiAuIGVzY19wYXJhbSgicD0kcHJvamVjdDthPWNvbW1pdDtoPSRoYXNoX2Jhc2UiKX0sICJjb21taXQiKSAuCisJCSAgICAgICIgfCAiIC4gJGNnaS0+YSh7LWhyZWYgPT4gIiRteV91cmk/IiAuIGVzY19wYXJhbSgicD0kcHJvamVjdDthPWNvbW1pdGRpZmY7aD0kaGFzaF9iYXNlIil9LCAiY29tbWl0ZGlmZiIpIC4KKwkJICAgICAgIiB8ICIgLiAkY2dpLT5hKHstaHJlZiA9PiAiJG15X3VyaT8iIC4gZXNjX3BhcmFtKCJwPSRwcm9qZWN0O2E9dHJlZTtoPSRjb3sndHJlZSd9O2hiPSRoYXNoX2Jhc2UiKX0sICJ0cmVlIikgLgorCQkgICAgICAiPGJyLz5cbiI7CisJCXByaW50ICRjZ2ktPmEoey1ocmVmID0+ICIkbXlfdXJpPyIgLiBlc2NfcGFyYW0oInA9JHByb2plY3Q7YT1ibG9iZGlmZl9wbGFpbjtoPSRoYXNoO2hwPSRoYXNoX3BhcmVudCIpfSwgInBsYWluIikgLgorCQkgICAgICAiPC9kaXY+XG4iOworCQlwcmludCAiPGRpdj5cbiIgLgorCQkgICAgICAkY2dpLT5hKHstaHJlZiA9PiAiJG15X3VyaT8iIC4gZXNjX3BhcmFtKCJwPSRwcm9qZWN0O2E9Y29tbWl0O2g9JGhhc2hfYmFzZSIpLCAtY2xhc3MgPT4gInRpdGxlIn0sIGVzY19odG1sKCRjb3sndGl0bGUnfSkpIC4gIlxuIiAuCisJCSAgICAgICI8L2Rpdj5cbiI7CisJfSBlbHNlIHsKKwkJcHJpbnQgIjxkaXYgY2xhc3M9XCJwYWdlX25hdlwiPlxuIiAuCisJCSAgICAgICI8YnIvPjxici8+PC9kaXY+XG4iIC4KKwkJICAgICAgIjxkaXYgY2xhc3M9XCJ0aXRsZVwiPiRoYXNoIHZzICRoYXNoX3BhcmVudDwvZGl2PlxuIjsKKwl9CisJaWYgKGRlZmluZWQgJGZpbGVfbmFtZSkgeworCQlwcmludCAiPGRpdiBjbGFzcz1cInBhZ2VfcGF0aFwiPjxiPi8iIC4gZXNjX2h0bWwoJGZpbGVfbmFtZSkgLiAiPC9iPjwvZGl2PlxuIjsKKwl9CisJcHJpbnQgIjxkaXYgY2xhc3M9XCJwYWdlX2JvZHlcIj5cbiIgLgorCSAgICAgICI8ZGl2IGNsYXNzPVwiZGlmZl9pbmZvXCI+YmxvYjoiIC4KKwkgICAgICAkY2dpLT5hKHstaHJlZiA9PiAiJG15X3VyaT8iIC4gZXNjX3BhcmFtKCJwPSRwcm9qZWN0O2E9YmxvYjtoPSRoYXNoX3BhcmVudDtoYj0kaGFzaF9iYXNlO2Y9JGZpbGVfbmFtZSIpfSwgJGhhc2hfcGFyZW50KSAuCisJICAgICAgIiAtPiBibG9iOiIgLgorCSAgICAgICRjZ2ktPmEoey1ocmVmID0+ICIkbXlfdXJpPyIgLiBlc2NfcGFyYW0oInA9JHByb2plY3Q7YT1ibG9iO2g9JGhhc2g7aGI9JGhhc2hfYmFzZTtmPSRmaWxlX25hbWUiKX0sICRoYXNoKSAuCisJICAgICAgIjwvZGl2PlxuIjsKKwlnaXRfZGlmZl9wcmludCgkaGFzaF9wYXJlbnQsICRmaWxlX25hbWUgfHwgJGhhc2hfcGFyZW50LCAkaGFzaCwgJGZpbGVfbmFtZSB8fCAkaGFzaCk7CisJcHJpbnQgIjwvZGl2PiI7CisJZ2l0X2Zvb3Rlcl9odG1sKCk7Cit9CisKK3N1YiBnaXRfYmxvYmRpZmZfcGxhaW4geworCW1rZGlyKCRnaXRfdGVtcCwgMDcwMCk7CisJcHJpbnQgJGNnaS0+aGVhZGVyKC10eXBlID0+ICJ0ZXh0L3BsYWluIiwgLWNoYXJzZXQgPT4gJ3V0Zi04Jyk7CisJZ2l0X2RpZmZfcHJpbnQoJGhhc2hfcGFyZW50LCAkZmlsZV9uYW1lIHx8ICRoYXNoX3BhcmVudCwgJGhhc2gsICRmaWxlX25hbWUgfHwgJGhhc2gsICJwbGFpbiIpOworfQorCitzdWIgZ2l0X2NvbW1pdGRpZmYgeworCW1rZGlyKCRnaXRfdGVtcCwgMDcwMCk7CisJbXkgJWNvID0gZ2l0X3JlYWRfY29tbWl0KCRoYXNoKTsKKwlpZiAoISVjbykgeworCQlkaWVfZXJyb3IodW5kZWYsICJVbmtub3duIGNvbW1pdCBvYmplY3QuIik7CisJfQorCWlmICghZGVmaW5lZCAkaGFzaF9wYXJlbnQpIHsKKwkJJGhhc2hfcGFyZW50ID0gJGNveydwYXJlbnQnfTsKKwl9CisJb3BlbiBteSAkZmQsICItfCIsICIkZ2l0YmluL2dpdC1kaWZmLXRyZWUgLXIgJGhhc2hfcGFyZW50ICRoYXNoIiBvciBkaWVfZXJyb3IodW5kZWYsICJPcGVuIGZhaWxlZC4iKTsKKwlteSAoQGRpZmZ0cmVlKSA9IG1hcCB7IGNob21wOyAkXyB9IDwkZmQ+OworCWNsb3NlICRmZCBvciBkaWVfZXJyb3IodW5kZWYsICJSZWFkaW5nIGRpZmYtdHJlZSBmYWlsZWQuIik7CisKKwkjIG5vbi10ZXh0dWFsIGhhc2ggaWQncyBjYW4gYmUgY2FjaGVkCisJbXkgJGV4cGlyZXM7CisJaWYgKCRoYXNoID1+IG0vXlswLTlhLWZBLUZdezQwfSQvKSB7CisJCSRleHBpcmVzID0gIisxZCI7CisJfQorCW15ICRyZWZzID0gcmVhZF9pbmZvX3JlZigpOworCW15ICRyZWYgPSAiIjsKKwlpZiAoZGVmaW5lZCAkcmVmcy0+eyRjb3snaWQnfX0pIHsKKwkJJHJlZiA9ICIgPHNwYW4gY2xhc3M9XCJ0YWdcIj4iIC4gZXNjX2h0bWwoJHJlZnMtPnskY297J2lkJ319KSAuICI8L3NwYW4+IjsKKwl9CisJZ2l0X2hlYWRlcl9odG1sKHVuZGVmLCAkZXhwaXJlcyk7CisJcHJpbnQgIjxkaXYgY2xhc3M9XCJwYWdlX25hdlwiPlxuIiAuCisJICAgICAgJGNnaS0+YSh7LWhyZWYgPT4gIiRteV91cmk/IiAuIGVzY19wYXJhbSgicD0kcHJvamVjdDthPXN1bW1hcnkiKX0sICJzdW1tYXJ5IikgLgorCSAgICAgICIgfCAiIC4gJGNnaS0+YSh7LWhyZWYgPT4gIiRteV91cmk/IiAuIGVzY19wYXJhbSgicD0kcHJvamVjdDthPXNob3J0bG9nO2g9JGhhc2giKX0sICJzaG9ydGxvZyIpIC4KKwkgICAgICAiIHwgIiAuICRjZ2ktPmEoey1ocmVmID0+ICIkbXlfdXJpPyIgLiBlc2NfcGFyYW0oInA9JHByb2plY3Q7YT1sb2c7aD0kaGFzaCIpfSwgImxvZyIpIC4KKwkgICAgICAiIHwgIiAuICRjZ2ktPmEoey1ocmVmID0+ICIkbXlfdXJpPyIgLiBlc2NfcGFyYW0oInA9JHByb2plY3Q7YT1jb21taXQ7aD0kaGFzaCIpfSwgImNvbW1pdCIpIC4KKwkgICAgICAiIHwgY29tbWl0ZGlmZiIgLgorCSAgICAgICIgfCAiIC4gJGNnaS0+YSh7LWhyZWYgPT4gIiRteV91cmk/IiAuIGVzY19wYXJhbSgicD0kcHJvamVjdDthPXRyZWU7aD0kY297J3RyZWUnfTtoYj0kaGFzaCIpfSwgInRyZWUiKSAuICI8YnIvPlxuIjsKKwlwcmludCAkY2dpLT5hKHstaHJlZiA9PiAiJG15X3VyaT8iIC4gZXNjX3BhcmFtKCJwPSRwcm9qZWN0O2E9Y29tbWl0ZGlmZl9wbGFpbjtoPSRoYXNoO2hwPSRoYXNoX3BhcmVudCIpfSwgInBsYWluIikgLiAiXG4iIC4KKwkgICAgICAiPC9kaXY+XG4iOworCXByaW50ICI8ZGl2PlxuIiAuCisJICAgICAgJGNnaS0+YSh7LWhyZWYgPT4gIiRteV91cmk/IiAuIGVzY19wYXJhbSgicD0kcHJvamVjdDthPWNvbW1pdDtoPSRoYXNoIiksIC1jbGFzcyA9PiAidGl0bGUifSwgZXNjX2h0bWwoJGNveyd0aXRsZSd9KSAuICRyZWYpIC4gIlxuIiAuCisJICAgICAgIjwvZGl2PlxuIjsKKwlwcmludCAiPGRpdiBjbGFzcz1cInBhZ2VfYm9keVwiPlxuIjsKKwlteSAkY29tbWVudCA9ICRjb3snY29tbWVudCd9OworCW15ICRlbXB0eSA9IDA7CisJbXkgJHNpZ25lZCA9IDA7CisJbXkgQGxvZyA9IEAkY29tbWVudDsKKwkjIHJlbW92ZSBmaXJzdCBhbmQgZW1wdHkgbGluZXMgYWZ0ZXIgdGhhdAorCXNoaWZ0IEBsb2c7CisJd2hpbGUgKGRlZmluZWQgJGxvZ1swXSAmJiAkbG9nWzBdIGVxICIiKSB7CisJCXNoaWZ0IEBsb2c7CisJfQorCWZvcmVhY2ggbXkgJGxpbmUgKEBsb2cpIHsKKwkJaWYgKCRsaW5lID1+IG0vXiAqKHNpZ25lZFsgXC1db2ZmWyBcLV1ieVsgOl18YWNrZWRbIFwtXWJ5WyA6XXxjY1sgOl0pL2kpIHsKKwkJCW5leHQ7CisJCX0KKwkJaWYgKCRsaW5lIGVxICIiKSB7CisJCQlpZiAoJGVtcHR5KSB7CisJCQkJbmV4dDsKKwkJCX0KKwkJCSRlbXB0eSA9IDE7CisJCX0gZWxzZSB7CisJCQkkZW1wdHkgPSAwOworCQl9CisJCXByaW50IGZvcm1hdF9sb2dfbGluZV9odG1sKCRsaW5lKSAuICI8YnIvPlxuIjsKKwl9CisJcHJpbnQgIjxici8+XG4iOworCWZvcmVhY2ggbXkgJGxpbmUgKEBkaWZmdHJlZSkgeworCQkjICc6MTAwNjQ0IDEwMDY0NCAwM2IyMTgyNjBlOTliNzhjNmRmMGVkMzc4ZTU5ZWQ5MjA1Y2NjOTZkIDNiOTNkNWU3Y2M3ZjdkZDRlYmVkMTNhNWNjMWE0YWQ5NzZmYzk0ZDggTSAgICAgIGxzLWZpbGVzLmMnCisJCSMgJzoxMDA2NDQgMTAwNjQ0IDdmOTI4MTk4NTA4Njk3MWQzODc3YWNhMjc3MDRmMmFhZjljNDQ4Y2UgYmMxOTBlYmM3MWJiZDkyM2YyYjcyOGU1MDU0MDhmNWU1NGJkMDczYSBNICAgICAgcmV2LXRyZWUuYycKKwkJJGxpbmUgPX4gbS9eOihbMC03XXs2fSkgKFswLTddezZ9KSAoWzAtOWEtZkEtRl17NDB9KSAoWzAtOWEtZkEtRl17NDB9KSAoLilcdCguKikkLzsKKwkJbXkgJGZyb21fbW9kZSA9ICQxOworCQlteSAkdG9fbW9kZSA9ICQyOworCQlteSAkZnJvbV9pZCA9ICQzOworCQlteSAkdG9faWQgPSAkNDsKKwkJbXkgJHN0YXR1cyA9ICQ1OworCQlteSAkZmlsZSA9IHZhbGlkYXRlX2lucHV0KHVucXVvdGUoJDYpKTsKKwkJaWYgKCRzdGF0dXMgZXEgIkEiKSB7CisJCQlwcmludCAiPGRpdiBjbGFzcz1cImRpZmZfaW5mb1wiPiIgLiAgZmlsZV90eXBlKCR0b19tb2RlKSAuICI6IiAuCisJCQkgICAgICAkY2dpLT5hKHstaHJlZiA9PiAiJG15X3VyaT8iIC4gZXNjX3BhcmFtKCJwPSRwcm9qZWN0O2E9YmxvYjtoPSR0b19pZDtoYj0kaGFzaDtmPSRmaWxlIil9LCAkdG9faWQpIC4gIihuZXcpIiAuCisJCQkgICAgICAiPC9kaXY+XG4iOworCQkJZ2l0X2RpZmZfcHJpbnQodW5kZWYsICIvZGV2L251bGwiLCAkdG9faWQsICJiLyRmaWxlIik7CisJCX0gZWxzaWYgKCRzdGF0dXMgZXEgIkQiKSB7CisJCQlwcmludCAiPGRpdiBjbGFzcz1cImRpZmZfaW5mb1wiPiIgLiBmaWxlX3R5cGUoJGZyb21fbW9kZSkgLiAiOiIgLgorCQkJICAgICAgJGNnaS0+YSh7LWhyZWYgPT4gIiRteV91cmk/IiAuIGVzY19wYXJhbSgicD0kcHJvamVjdDthPWJsb2I7aD0kZnJvbV9pZDtoYj0kaGFzaDtmPSRmaWxlIil9LCAkZnJvbV9pZCkgLiAiKGRlbGV0ZWQpIiAuCisJCQkgICAgICAiPC9kaXY+XG4iOworCQkJZ2l0X2RpZmZfcHJpbnQoJGZyb21faWQsICJhLyRmaWxlIiwgdW5kZWYsICIvZGV2L251bGwiKTsKKwkJfSBlbHNpZiAoJHN0YXR1cyBlcSAiTSIpIHsKKwkJCWlmICgkZnJvbV9pZCBuZSAkdG9faWQpIHsKKwkJCQlwcmludCAiPGRpdiBjbGFzcz1cImRpZmZfaW5mb1wiPiIgLgorCQkJCSAgICAgIGZpbGVfdHlwZSgkZnJvbV9tb2RlKSAuICI6IiAuICRjZ2ktPmEoey1ocmVmID0+ICIkbXlfdXJpPyIgLiBlc2NfcGFyYW0oInA9JHByb2plY3Q7YT1ibG9iO2g9JGZyb21faWQ7aGI9JGhhc2g7Zj0kZmlsZSIpfSwgJGZyb21faWQpIC4KKwkJCQkgICAgICAiIC0+ICIgLgorCQkJCSAgICAgIGZpbGVfdHlwZSgkdG9fbW9kZSkgLiAiOiIgLiAkY2dpLT5hKHstaHJlZiA9PiAiJG15X3VyaT8iIC4gZXNjX3BhcmFtKCJwPSRwcm9qZWN0O2E9YmxvYjtoPSR0b19pZDtoYj0kaGFzaDtmPSRmaWxlIil9LCAkdG9faWQpOworCQkJCXByaW50ICI8L2Rpdj5cbiI7CisJCQkJZ2l0X2RpZmZfcHJpbnQoJGZyb21faWQsICJhLyRmaWxlIiwgICR0b19pZCwgImIvJGZpbGUiKTsKKwkJCX0KKwkJfQorCX0KKwlwcmludCAiPGJyLz5cbiIgLgorCSAgICAgICI8L2Rpdj4iOworCWdpdF9mb290ZXJfaHRtbCgpOworfQorCitzdWIgZ2l0X2NvbW1pdGRpZmZfcGxhaW4geworCW1rZGlyKCRnaXRfdGVtcCwgMDcwMCk7CisJb3BlbiBteSAkZmQsICItfCIsICIkZ2l0YmluL2dpdC1kaWZmLXRyZWUgLXIgJGhhc2hfcGFyZW50ICRoYXNoIiBvciBkaWVfZXJyb3IodW5kZWYsICJPcGVuIGZhaWxlZC4iKTsKKwlteSAoQGRpZmZ0cmVlKSA9IG1hcCB7IGNob21wOyAkXyB9IDwkZmQ+OworCWNsb3NlICRmZCBvciBkaWVfZXJyb3IodW5kZWYsICJSZWFkaW5nIGRpZmYtdHJlZSBmYWlsZWQuIik7CisKKwkjIHRyeSB0byBmaWd1cmUgb3V0IHRoZSBuZXh0IHRhZyBhZnRlciB0aGlzIGNvbW1pdAorCW15ICR0YWduYW1lOworCW15ICRyZWZzID0gcmVhZF9pbmZvX3JlZigidGFncyIpOworCW9wZW4gJGZkLCAiLXwiLCAiJGdpdGJpbi9naXQtcmV2LWxpc3QgSEVBRCI7CisJY2hvbXAgKG15IChAY29tbWl0cykgPSA8JGZkPik7CisJY2xvc2UgJGZkOworCWZvcmVhY2ggbXkgJGNvbW1pdCAoQGNvbW1pdHMpIHsKKwkJaWYgKGRlZmluZWQgJHJlZnMtPnskY29tbWl0fSkgeworCQkJJHRhZ25hbWUgPSAkcmVmcy0+eyRjb21taXR9CisJCX0KKwkJaWYgKCRjb21taXQgZXEgJGhhc2gpIHsKKwkJCWxhc3Q7CisJCX0KKwl9CisKKwlwcmludCAkY2dpLT5oZWFkZXIoLXR5cGUgPT4gInRleHQvcGxhaW4iLCAtY2hhcnNldCA9PiAndXRmLTgnLCAnLWNvbnRlbnQtZGlzcG9zaXRpb24nID0+ICJpbmxpbmU7IGZpbGVuYW1lPVwiZ2l0LSRoYXNoLnBhdGNoXCIiKTsKKwlteSAlY28gPSBnaXRfcmVhZF9jb21taXQoJGhhc2gpOworCW15ICVhZCA9IGRhdGVfc3RyKCRjb3snYXV0aG9yX2Vwb2NoJ30sICRjb3snYXV0aG9yX3R6J30pOworCW15ICRjb21tZW50ID0gJGNveydjb21tZW50J307CisJcHJpbnQgIkZyb206ICRjb3snYXV0aG9yJ31cbiIgLgorCSAgICAgICJEYXRlOiAkYWR7J3JmYzI4MjInfSAoJGFkeyd0el9sb2NhbCd9KVxuIi4KKwkgICAgICAiU3ViamVjdDogJGNveyd0aXRsZSd9XG4iOworCWlmIChkZWZpbmVkICR0YWduYW1lKSB7CisJICAgICAgcHJpbnQgIlgtR2l0LVRhZzogJHRhZ25hbWVcbiI7CisJfQorCXByaW50ICJYLUdpdC1Vcmw6ICRteV91cmw/cD0kcHJvamVjdDthPWNvbW1pdGRpZmY7aD0kaGFzaFxuIiAuCisJICAgICAgIlxuIjsKKworCWZvcmVhY2ggbXkgJGxpbmUgKEAkY29tbWVudCkgezsKKwkJcHJpbnQgIiRsaW5lXG4iOworCX0KKwlwcmludCAiLS0tXG5cbiI7CisKKwlmb3JlYWNoIG15ICRsaW5lIChAZGlmZnRyZWUpIHsKKwkJJGxpbmUgPX4gbS9eOihbMC03XXs2fSkgKFswLTddezZ9KSAoWzAtOWEtZkEtRl17NDB9KSAoWzAtOWEtZkEtRl17NDB9KSAoLilcdCguKikkLzsKKwkJbXkgJGZyb21faWQgPSAkMzsKKwkJbXkgJHRvX2lkID0gJDQ7CisJCW15ICRzdGF0dXMgPSAkNTsKKwkJbXkgJGZpbGUgPSAkNjsKKwkJaWYgKCRzdGF0dXMgZXEgIkEiKSB7CisJCQlnaXRfZGlmZl9wcmludCh1bmRlZiwgIi9kZXYvbnVsbCIsICR0b19pZCwgImIvJGZpbGUiLCAicGxhaW4iKTsKKwkJfSBlbHNpZiAoJHN0YXR1cyBlcSAiRCIpIHsKKwkJCWdpdF9kaWZmX3ByaW50KCRmcm9tX2lkLCAiYS8kZmlsZSIsIHVuZGVmLCAiL2Rldi9udWxsIiwgInBsYWluIik7CisJCX0gZWxzaWYgKCRzdGF0dXMgZXEgIk0iKSB7CisJCQlnaXRfZGlmZl9wcmludCgkZnJvbV9pZCwgImEvJGZpbGUiLCAgJHRvX2lkLCAiYi8kZmlsZSIsICJwbGFpbiIpOworCQl9CisJfQorfQorCitzdWIgZ2l0X2hpc3RvcnkgeworCWlmICghZGVmaW5lZCAkaGFzaCkgeworCQkkaGFzaCA9IGdpdF9yZWFkX2hlYWQoJHByb2plY3QpOworCX0KKwlteSAlY28gPSBnaXRfcmVhZF9jb21taXQoJGhhc2gpOworCWlmICghJWNvKSB7CisJCWRpZV9lcnJvcih1bmRlZiwgIlVua25vd24gY29tbWl0IG9iamVjdC4iKTsKKwl9CisJbXkgJHJlZnMgPSByZWFkX2luZm9fcmVmKCk7CisJZ2l0X2hlYWRlcl9odG1sKCk7CisJcHJpbnQgIjxkaXYgY2xhc3M9XCJwYWdlX25hdlwiPlxuIiAuCisJICAgICAgJGNnaS0+YSh7LWhyZWYgPT4gIiRteV91cmk/IiAuIGVzY19wYXJhbSgicD0kcHJvamVjdDthPXN1bW1hcnkiKX0sICJzdW1tYXJ5IikgLgorCSAgICAgICIgfCAiIC4gJGNnaS0+YSh7LWhyZWYgPT4gIiRteV91cmk/IiAuIGVzY19wYXJhbSgicD0kcHJvamVjdDthPXNob3J0bG9nIil9LCAic2hvcnRsb2ciKSAuCisJICAgICAgIiB8ICIgLiAkY2dpLT5hKHstaHJlZiA9PiAiJG15X3VyaT8iIC4gZXNjX3BhcmFtKCJwPSRwcm9qZWN0O2E9bG9nIil9LCAibG9nIikgLgorCSAgICAgICIgfCAiIC4gJGNnaS0+YSh7LWhyZWYgPT4gIiRteV91cmk/IiAuIGVzY19wYXJhbSgicD0kcHJvamVjdDthPWNvbW1pdDtoPSRoYXNoIil9LCAiY29tbWl0IikgLgorCSAgICAgICIgfCAiIC4gJGNnaS0+YSh7LWhyZWYgPT4gIiRteV91cmk/IiAuIGVzY19wYXJhbSgicD0kcHJvamVjdDthPWNvbW1pdGRpZmY7aD0kaGFzaCIpfSwgImNvbW1pdGRpZmYiKSAuCisJICAgICAgIiB8ICIgLiAkY2dpLT5hKHstaHJlZiA9PiAiJG15X3VyaT8iIC4gZXNjX3BhcmFtKCJwPSRwcm9qZWN0O2E9dHJlZTtoPSRjb3sndHJlZSd9O2hiPSRoYXNoIil9LCAidHJlZSIpIC4KKwkgICAgICAiPGJyLz48YnIvPlxuIiAuCisJICAgICAgIjwvZGl2PlxuIjsKKwlwcmludCAiPGRpdj5cbiIgLgorCSAgICAgICRjZ2ktPmEoey1ocmVmID0+ICIkbXlfdXJpPyIgLiBlc2NfcGFyYW0oInA9JHByb2plY3Q7YT1jb21taXQ7aD0kaGFzaCIpLCAtY2xhc3MgPT4gInRpdGxlIn0sIGVzY19odG1sKCRjb3sndGl0bGUnfSkpIC4gIlxuIiAuCisJICAgICAgIjwvZGl2PlxuIjsKKwlwcmludCAiPGRpdiBjbGFzcz1cInBhZ2VfcGF0aFwiPjxiPi8iIC4gZXNjX2h0bWwoJGZpbGVfbmFtZSkgLiAiPC9iPjxici8+PC9kaXY+XG4iOworCisJb3BlbiBteSAkZmQsICItfCIsICIkZ2l0YmluL2dpdC1yZXYtbGlzdCAkaGFzaCB8ICRnaXRiaW4vZ2l0LWRpZmYtdHJlZSAtciAtLXN0ZGluIC0tIFwnJGZpbGVfbmFtZVwnIjsKKwlteSAkY29tbWl0OworCXByaW50ICI8dGFibGUgY2VsbHNwYWNpbmc9XCIwXCI+XG4iOworCW15ICRhbHRlcm5hdGUgPSAwOworCXdoaWxlIChteSAkbGluZSA9IDwkZmQ+KSB7CisJCWlmICgkbGluZSA9fiBtL14oWzAtOWEtZkEtRl17NDB9KS8peworCQkJJGNvbW1pdCA9ICQxOworCQkJbmV4dDsKKwkJfQorCQlpZiAoJGxpbmUgPX4gbS9eOihbMC03XXs2fSkgKFswLTddezZ9KSAoWzAtOWEtZkEtRl17NDB9KSAoWzAtOWEtZkEtRl17NDB9KSAoLilcdCguKikkLyAmJiAoZGVmaW5lZCAkY29tbWl0KSkgeworCQkJbXkgJWNvID0gZ2l0X3JlYWRfY29tbWl0KCRjb21taXQpOworCQkJaWYgKCElY28pIHsKKwkJCQluZXh0OworCQkJfQorCQkJbXkgJHJlZiA9ICIiOworCQkJaWYgKGRlZmluZWQgJHJlZnMtPnskY29tbWl0fSkgeworCQkJCSRyZWYgPSAiIDxzcGFuIGNsYXNzPVwidGFnXCI+IiAuIGVzY19odG1sKCRyZWZzLT57JGNvbW1pdH0pIC4gIjwvc3Bhbj4iOworCQkJfQorCQkJaWYgKCRhbHRlcm5hdGUpIHsKKwkJCQlwcmludCAiPHRyIGNsYXNzPVwiZGFya1wiPlxuIjsKKwkJCX0gZWxzZSB7CisJCQkJcHJpbnQgIjx0ciBjbGFzcz1cImxpZ2h0XCI+XG4iOworCQkJfQorCQkJJGFsdGVybmF0ZSBePSAxOworCQkJcHJpbnQgIjx0ZCB0aXRsZT1cIiRjb3snYWdlX3N0cmluZ19hZ2UnfVwiPjxpPiRjb3snYWdlX3N0cmluZ19kYXRlJ308L2k+PC90ZD5cbiIgLgorCQkJICAgICAgIjx0ZD48aT4iIC4gZXNjX2h0bWwoY2hvcF9zdHIoJGNveydhdXRob3JfbmFtZSd9LCAxNSwgMykpIC4gIjwvaT48L3RkPlxuIiAuCisJCQkgICAgICAiPHRkPiIgLiAkY2dpLT5hKHstaHJlZiA9PiAiJG15X3VyaT8iIC4gZXNjX3BhcmFtKCJwPSRwcm9qZWN0O2E9Y29tbWl0O2g9JGNvbW1pdCIpLCAtY2xhc3MgPT4gImxpc3QifSwgIjxiPiIgLgorCQkJICAgICAgZXNjX2h0bWwoY2hvcF9zdHIoJGNveyd0aXRsZSd9LCA1MCkpIC4gIiRyZWY8L2I+IikgLiAiPC90ZD5cbiIgLgorCQkJICAgICAgIjx0ZCBjbGFzcz1cImxpbmtcIj4iIC4KKwkJCSAgICAgICRjZ2ktPmEoey1ocmVmID0+ICIkbXlfdXJpPyIgLiBlc2NfcGFyYW0oInA9JHByb2plY3Q7YT1jb21taXQ7aD0kY29tbWl0Iil9LCAiY29tbWl0IikgLgorCQkJICAgICAgIiB8ICIgLiAkY2dpLT5hKHstaHJlZiA9PiAiJG15X3VyaT8iIC4gZXNjX3BhcmFtKCJwPSRwcm9qZWN0O2E9Y29tbWl0ZGlmZjtoPSRjb21taXQiKX0sICJjb21taXRkaWZmIikgLgorCQkJICAgICAgIiB8ICIgLiAkY2dpLT5hKHstaHJlZiA9PiAiJG15X3VyaT8iIC4gZXNjX3BhcmFtKCJwPSRwcm9qZWN0O2E9YmxvYjtoYj0kY29tbWl0O2Y9JGZpbGVfbmFtZSIpfSwgImJsb2IiKTsKKwkJCW15ICRibG9iID0gZ2l0X2dldF9oYXNoX2J5X3BhdGgoJGhhc2gsICRmaWxlX25hbWUpOworCQkJbXkgJGJsb2JfcGFyZW50ID0gZ2l0X2dldF9oYXNoX2J5X3BhdGgoJGNvbW1pdCwgJGZpbGVfbmFtZSk7CisJCQlpZiAoZGVmaW5lZCAkYmxvYiAmJiBkZWZpbmVkICRibG9iX3BhcmVudCAmJiAkYmxvYiBuZSAkYmxvYl9wYXJlbnQpIHsKKwkJCQlwcmludCAiIHwgIiAuCisJCQkJJGNnaS0+YSh7LWhyZWYgPT4gIiRteV91cmk/IiAuIGVzY19wYXJhbSgicD0kcHJvamVjdDthPWJsb2JkaWZmO2g9JGJsb2I7aHA9JGJsb2JfcGFyZW50O2hiPSRjb21taXQ7Zj0kZmlsZV9uYW1lIil9LAorCQkJCSJkaWZmIHRvIGN1cnJlbnQiKTsKKwkJCX0KKwkJCXByaW50ICI8L3RkPlxuIiAuCisJCQkgICAgICAiPC90cj5cbiI7CisJCQl1bmRlZiAkY29tbWl0OworCQl9CisJfQorCXByaW50ICI8L3RhYmxlPlxuIjsKKwljbG9zZSAkZmQ7CisJZ2l0X2Zvb3Rlcl9odG1sKCk7Cit9CisKK3N1YiBnaXRfc2VhcmNoIHsKKwlpZiAoIWRlZmluZWQgJHNlYXJjaHRleHQpIHsKKwkJZGllX2Vycm9yKCIiLCAiVGV4dCBmaWVsZCBlbXB0eS4iKTsKKwl9CisJaWYgKCFkZWZpbmVkICRoYXNoKSB7CisJCSRoYXNoID0gZ2l0X3JlYWRfaGVhZCgkcHJvamVjdCk7CisJfQorCW15ICVjbyA9IGdpdF9yZWFkX2NvbW1pdCgkaGFzaCk7CisJaWYgKCElY28pIHsKKwkJZGllX2Vycm9yKHVuZGVmLCAiVW5rbm93biBjb21taXQgb2JqZWN0LiIpOworCX0KKwkjIHBpY2theGUgbWF5IHRha2UgYWxsIHJlc291cmNlcyBvZiB5b3VyIGJveCBhbmQgcnVuIGZvciBzZXZlcmFsIG1pbnV0ZXMKKwkjIHdpdGggZXZlcnkgcXVlcnkgLSBzbyBkZWNpZGUgYnkgeW91cnNlbGYgaG93IHB1YmxpYyB5b3UgbWFrZSB0aGlzIGZlYXR1cmUgOikKKwlteSAkY29tbWl0X3NlYXJjaCA9IDE7CisJbXkgJGF1dGhvcl9zZWFyY2ggPSAwOworCW15ICRjb21taXR0ZXJfc2VhcmNoID0gMDsKKwlteSAkcGlja2F4ZV9zZWFyY2ggPSAwOworCWlmICgkc2VhcmNodGV4dCA9fiBzL15hdXRob3JcXDovL2kpIHsKKwkJJGF1dGhvcl9zZWFyY2ggPSAxOworCX0gZWxzaWYgKCRzZWFyY2h0ZXh0ID1+IHMvXmNvbW1pdHRlclxcOi8vaSkgeworCQkkY29tbWl0dGVyX3NlYXJjaCA9IDE7CisJfSBlbHNpZiAoJHNlYXJjaHRleHQgPX4gcy9ecGlja2F4ZVxcOi8vaSkgeworCQkkY29tbWl0X3NlYXJjaCA9IDA7CisJCSRwaWNrYXhlX3NlYXJjaCA9IDE7CisJfQorCWdpdF9oZWFkZXJfaHRtbCgpOworCXByaW50ICI8ZGl2IGNsYXNzPVwicGFnZV9uYXZcIj5cbiIgLgorCSAgICAgICRjZ2ktPmEoey1ocmVmID0+ICIkbXlfdXJpPyIgLiBlc2NfcGFyYW0oInA9JHByb2plY3Q7YT1zdW1tYXJ5O2g9JGhhc2giKX0sICJzdW1tYXJ5IikgLgorCSAgICAgICIgfCAiIC4gJGNnaS0+YSh7LWhyZWYgPT4gIiRteV91cmk/IiAuIGVzY19wYXJhbSgicD0kcHJvamVjdDthPXNob3J0bG9nIil9LCAic2hvcnRsb2ciKSAuCisJICAgICAgIiB8ICIgLiAkY2dpLT5hKHstaHJlZiA9PiAiJG15X3VyaT8iIC4gZXNjX3BhcmFtKCJwPSRwcm9qZWN0O2E9bG9nO2g9JGhhc2giKX0sICJsb2ciKSAuCisJICAgICAgIiB8ICIgLiAkY2dpLT5hKHstaHJlZiA9PiAiJG15X3VyaT8iIC4gZXNjX3BhcmFtKCJwPSRwcm9qZWN0O2E9Y29tbWl0O2g9JGhhc2giKX0sICJjb21taXQiKSAuCisJICAgICAgIiB8ICIgLiAkY2dpLT5hKHstaHJlZiA9PiAiJG15X3VyaT8iIC4gZXNjX3BhcmFtKCJwPSRwcm9qZWN0O2E9Y29tbWl0ZGlmZjtoPSRoYXNoIil9LCAiY29tbWl0ZGlmZiIpIC4KKwkgICAgICAiIHwgIiAuICRjZ2ktPmEoey1ocmVmID0+ICIkbXlfdXJpPyIgLiBlc2NfcGFyYW0oInA9JHByb2plY3Q7YT10cmVlO2g9JGNveyd0cmVlJ307aGI9JGhhc2giKX0sICJ0cmVlIikgLgorCSAgICAgICI8YnIvPjxici8+XG4iIC4KKwkgICAgICAiPC9kaXY+XG4iOworCisJcHJpbnQgIjxkaXY+XG4iIC4KKwkgICAgICAkY2dpLT5hKHstaHJlZiA9PiAiJG15X3VyaT8iIC4gZXNjX3BhcmFtKCJwPSRwcm9qZWN0O2E9Y29tbWl0O2g9JGhhc2giKSwgLWNsYXNzID0+ICJ0aXRsZSJ9LCBlc2NfaHRtbCgkY297J3RpdGxlJ30pKSAuICJcbiIgLgorCSAgICAgICI8L2Rpdj5cbiI7CisJcHJpbnQgIjx0YWJsZSBjZWxsc3BhY2luZz1cIjBcIj5cbiI7CisJbXkgJGFsdGVybmF0ZSA9IDA7CisJaWYgKCRjb21taXRfc2VhcmNoKSB7CisJCSQvID0gIlwwIjsKKwkJb3BlbiBteSAkZmQsICItfCIsICIkZ2l0YmluL2dpdC1yZXYtbGlzdCAtLWhlYWRlciAtLXBhcmVudHMgJGhhc2giIG9yIG5leHQ7CisJCXdoaWxlIChteSAkY29tbWl0X3RleHQgPSA8JGZkPikgeworCQkJaWYgKCFncmVwIG0vJHNlYXJjaHRleHQvaSwgJGNvbW1pdF90ZXh0KSB7CisJCQkJbmV4dDsKKwkJCX0KKwkJCWlmICgkYXV0aG9yX3NlYXJjaCAmJiAhZ3JlcCBtL1xuYXV0aG9yIC4qJHNlYXJjaHRleHQvaSwgJGNvbW1pdF90ZXh0KSB7CisJCQkJbmV4dDsKKwkJCX0KKwkJCWlmICgkY29tbWl0dGVyX3NlYXJjaCAmJiAhZ3JlcCBtL1xuY29tbWl0dGVyIC4qJHNlYXJjaHRleHQvaSwgJGNvbW1pdF90ZXh0KSB7CisJCQkJbmV4dDsKKwkJCX0KKwkJCW15IEBjb21taXRfbGluZXMgPSBzcGxpdCAiXG4iLCAkY29tbWl0X3RleHQ7CisJCQlteSAlY28gPSBnaXRfcmVhZF9jb21taXQodW5kZWYsIFxAY29tbWl0X2xpbmVzKTsKKwkJCWlmICghJWNvKSB7CisJCQkJbmV4dDsKKwkJCX0KKwkJCWlmICgkYWx0ZXJuYXRlKSB7CisJCQkJcHJpbnQgIjx0ciBjbGFzcz1cImRhcmtcIj5cbiI7CisJCQl9IGVsc2UgeworCQkJCXByaW50ICI8dHIgY2xhc3M9XCJsaWdodFwiPlxuIjsKKwkJCX0KKwkJCSRhbHRlcm5hdGUgXj0gMTsKKwkJCXByaW50ICI8dGQgdGl0bGU9XCIkY297J2FnZV9zdHJpbmdfYWdlJ31cIj48aT4kY297J2FnZV9zdHJpbmdfZGF0ZSd9PC9pPjwvdGQ+XG4iIC4KKwkJCSAgICAgICI8dGQ+PGk+IiAuIGVzY19odG1sKGNob3Bfc3RyKCRjb3snYXV0aG9yX25hbWUnfSwgMTUsIDUpKSAuICI8L2k+PC90ZD5cbiIgLgorCQkJICAgICAgIjx0ZD4iIC4KKwkJCSAgICAgICRjZ2ktPmEoey1ocmVmID0+ICIkbXlfdXJpPyIgLiBlc2NfcGFyYW0oInA9JHByb2plY3Q7YT1jb21taXQ7aD0kY297J2lkJ30iKSwgLWNsYXNzID0+ICJsaXN0In0sICI8Yj4iIC4gZXNjX2h0bWwoY2hvcF9zdHIoJGNveyd0aXRsZSd9LCA1MCkpIC4gIjwvYj48YnIvPiIpOworCQkJbXkgJGNvbW1lbnQgPSAkY297J2NvbW1lbnQnfTsKKwkJCWZvcmVhY2ggbXkgJGxpbmUgKEAkY29tbWVudCkgeworCQkJCWlmICgkbGluZSA9fiBtL14oLiopKCRzZWFyY2h0ZXh0KSguKikkL2kpIHsKKwkJCQkJbXkgJGxlYWQgPSBlc2NfaHRtbCgkMSkgfHwgIiI7CisJCQkJCSRsZWFkID0gY2hvcF9zdHIoJGxlYWQsIDMwLCAxMCk7CisJCQkJCW15ICRtYXRjaCA9IGVzY19odG1sKCQyKSB8fCAiIjsKKwkJCQkJbXkgJHRyYWlsID0gZXNjX2h0bWwoJDMpIHx8ICIiOworCQkJCQkkdHJhaWwgPSBjaG9wX3N0cigkdHJhaWwsIDMwLCAxMCk7CisJCQkJCW15ICR0ZXh0ID0gIiRsZWFkPHNwYW4gc3R5bGU9XCJjb2xvcjojZTAwMDAwXCI+JG1hdGNoPC9zcGFuPiR0cmFpbCI7CisJCQkJCXByaW50IGNob3Bfc3RyKCR0ZXh0LCA4MCwgNSkgLiAiPGJyLz5cbiI7CisJCQkJfQorCQkJfQorCQkJcHJpbnQgIjwvdGQ+XG4iIC4KKwkJCSAgICAgICI8dGQgY2xhc3M9XCJsaW5rXCI+IiAuCisJCQkgICAgICAkY2dpLT5hKHstaHJlZiA9PiAiJG15X3VyaT8iIC4gZXNjX3BhcmFtKCJwPSRwcm9qZWN0O2E9Y29tbWl0O2g9JGNveydpZCd9Iil9LCAiY29tbWl0IikgLgorCQkJICAgICAgIiB8ICIgLiAkY2dpLT5hKHstaHJlZiA9PiAiJG15X3VyaT8iIC4gZXNjX3BhcmFtKCJwPSRwcm9qZWN0O2E9dHJlZTtoPSRjb3sndHJlZSd9O2hiPSRjb3snaWQnfSIpfSwgInRyZWUiKTsKKwkJCXByaW50ICI8L3RkPlxuIiAuCisJCQkgICAgICAiPC90cj5cbiI7CisJCX0KKwkJY2xvc2UgJGZkOworCX0KKworCWlmICgkcGlja2F4ZV9zZWFyY2gpIHsKKwkJJC8gPSAiXG4iOworCQlvcGVuIG15ICRmZCwgIi18IiwgIiRnaXRiaW4vZ2l0LXJldi1saXN0ICRoYXNoIHwgJGdpdGJpbi9naXQtZGlmZi10cmVlIC1yIC0tc3RkaW4gLVNcJyRzZWFyY2h0ZXh0XCciOworCQl1bmRlZiAlY287CisJCW15IEBmaWxlczsKKwkJd2hpbGUgKG15ICRsaW5lID0gPCRmZD4pIHsKKwkJCWlmICglY28gJiYgJGxpbmUgPX4gbS9eOihbMC03XXs2fSkgKFswLTddezZ9KSAoWzAtOWEtZkEtRl17NDB9KSAoWzAtOWEtZkEtRl17NDB9KSAoLilcdCguKikkLykgeworCQkJCW15ICVzZXQ7CisJCQkJJHNldHsnZmlsZSd9ID0gJDY7CisJCQkJJHNldHsnZnJvbV9pZCd9ID0gJDM7CisJCQkJJHNldHsndG9faWQnfSA9ICQ0OworCQkJCSRzZXR7J2lkJ30gPSAkc2V0eyd0b19pZCd9OworCQkJCWlmICgkc2V0eydpZCd9ID1+IG0vMHs0MH0vKSB7CisJCQkJCSRzZXR7J2lkJ30gPSAkc2V0eydmcm9tX2lkJ307CisJCQkJfQorCQkJCWlmICgkc2V0eydpZCd9ID1+IG0vMHs0MH0vKSB7CisJCQkJCW5leHQ7CisJCQkJfQorCQkJCXB1c2ggQGZpbGVzLCBcJXNldDsKKwkJCX0gZWxzaWYgKCRsaW5lID1+IG0vXihbMC05YS1mQS1GXXs0MH0pJC8peworCQkJCWlmICglY28pIHsKKwkJCQkJaWYgKCRhbHRlcm5hdGUpIHsKKwkJCQkJCXByaW50ICI8dHIgY2xhc3M9XCJkYXJrXCI+XG4iOworCQkJCQl9IGVsc2UgeworCQkJCQkJcHJpbnQgIjx0ciBjbGFzcz1cImxpZ2h0XCI+XG4iOworCQkJCQl9CisJCQkJCSRhbHRlcm5hdGUgXj0gMTsKKwkJCQkJcHJpbnQgIjx0ZCB0aXRsZT1cIiRjb3snYWdlX3N0cmluZ19hZ2UnfVwiPjxpPiRjb3snYWdlX3N0cmluZ19kYXRlJ308L2k+PC90ZD5cbiIgLgorCQkJCQkgICAgICAiPHRkPjxpPiIgLiBlc2NfaHRtbChjaG9wX3N0cigkY297J2F1dGhvcl9uYW1lJ30sIDE1LCA1KSkgLiAiPC9pPjwvdGQ+XG4iIC4KKwkJCQkJICAgICAgIjx0ZD4iIC4KKwkJCQkJICAgICAgJGNnaS0+YSh7LWhyZWYgPT4gIiRteV91cmk/IiAuIGVzY19wYXJhbSgicD0kcHJvamVjdDthPWNvbW1pdDtoPSRjb3snaWQnfSIpLCAtY2xhc3MgPT4gImxpc3QifSwgIjxiPiIgLgorCQkJCQkgICAgICBlc2NfaHRtbChjaG9wX3N0cigkY297J3RpdGxlJ30sIDUwKSkgLiAiPC9iPjxici8+Iik7CisJCQkJCXdoaWxlIChteSAkc2V0cmVmID0gc2hpZnQgQGZpbGVzKSB7CisJCQkJCQlteSAlc2V0ID0gJSRzZXRyZWY7CisJCQkJCQlwcmludCAkY2dpLT5hKHstaHJlZiA9PiAiJG15X3VyaT8iIC4gZXNjX3BhcmFtKCJwPSRwcm9qZWN0O2E9YmxvYjtoPSRzZXR7J2lkJ307aGI9JGNveydpZCd9O2Y9JHNldHsnZmlsZSd9IiksIGNsYXNzID0+ICJsaXN0In0sCisJCQkJCQkgICAgICAiPHNwYW4gc3R5bGU9XCJjb2xvcjojZTAwMDAwXCI+IiAuIGVzY19odG1sKCRzZXR7J2ZpbGUnfSkgLiAiPC9zcGFuPiIpIC4KKwkJCQkJCSAgICAgICI8YnIvPlxuIjsKKwkJCQkJfQorCQkJCQlwcmludCAiPC90ZD5cbiIgLgorCQkJCQkgICAgICAiPHRkIGNsYXNzPVwibGlua1wiPiIgLgorCQkJCQkgICAgICAkY2dpLT5hKHstaHJlZiA9PiAiJG15X3VyaT8iIC4gZXNjX3BhcmFtKCJwPSRwcm9qZWN0O2E9Y29tbWl0O2g9JGNveydpZCd9Iil9LCAiY29tbWl0IikgLgorCQkJCQkgICAgICAiIHwgIiAuICRjZ2ktPmEoey1ocmVmID0+ICIkbXlfdXJpPyIgLiBlc2NfcGFyYW0oInA9JHByb2plY3Q7YT10cmVlO2g9JGNveyd0cmVlJ307aGI9JGNveydpZCd9Iil9LCAidHJlZSIpOworCQkJCQlwcmludCAiPC90ZD5cbiIgLgorCQkJCQkgICAgICAiPC90cj5cbiI7CisJCQkJfQorCQkJCSVjbyA9IGdpdF9yZWFkX2NvbW1pdCgkMSk7CisJCQl9CisJCX0KKwkJY2xvc2UgJGZkOworCX0KKwlwcmludCAiPC90YWJsZT5cbiI7CisJZ2l0X2Zvb3Rlcl9odG1sKCk7Cit9CisKK3N1YiBnaXRfc2hvcnRsb2cgeworCW15ICRoZWFkID0gZ2l0X3JlYWRfaGVhZCgkcHJvamVjdCk7CisJaWYgKCFkZWZpbmVkICRoYXNoKSB7CisJCSRoYXNoID0gJGhlYWQ7CisJfQorCWlmICghZGVmaW5lZCAkcGFnZSkgeworCQkkcGFnZSA9IDA7CisJfQorCW15ICRyZWZzID0gcmVhZF9pbmZvX3JlZigpOworCWdpdF9oZWFkZXJfaHRtbCgpOworCXByaW50ICI8ZGl2IGNsYXNzPVwicGFnZV9uYXZcIj5cbiIgLgorCSAgICAgICRjZ2ktPmEoey1ocmVmID0+ICIkbXlfdXJpPyIgLiBlc2NfcGFyYW0oInA9JHByb2plY3Q7YT1zdW1tYXJ5Iil9LCAic3VtbWFyeSIpIC4KKwkgICAgICAiIHwgc2hvcnRsb2ciIC4KKwkgICAgICAiIHwgIiAuICRjZ2ktPmEoey1ocmVmID0+ICIkbXlfdXJpPyIgLiBlc2NfcGFyYW0oInA9JHByb2plY3Q7YT1sb2c7aD0kaGFzaCIpfSwgImxvZyIpIC4KKwkgICAgICAiIHwgIiAuICRjZ2ktPmEoey1ocmVmID0+ICIkbXlfdXJpPyIgLiBlc2NfcGFyYW0oInA9JHByb2plY3Q7YT1jb21taXQ7aD0kaGFzaCIpfSwgImNvbW1pdCIpIC4KKwkgICAgICAiIHwgIiAuICRjZ2ktPmEoey1ocmVmID0+ICIkbXlfdXJpPyIgLiBlc2NfcGFyYW0oInA9JHByb2plY3Q7YT1jb21taXRkaWZmO2g9JGhhc2giKX0sICJjb21taXRkaWZmIikgLgorCSAgICAgICIgfCAiIC4gJGNnaS0+YSh7LWhyZWYgPT4gIiRteV91cmk/IiAuIGVzY19wYXJhbSgicD0kcHJvamVjdDthPXRyZWU7aD0kaGFzaDtoYj0kaGFzaCIpfSwgInRyZWUiKSAuICI8YnIvPlxuIjsKKworCW15ICRsaW1pdCA9IHNwcmludGYoIi0tbWF4LWNvdW50PSVpIiwgKDEwMCAqICgkcGFnZSsxKSkpOworCW9wZW4gbXkgJGZkLCAiLXwiLCAiJGdpdGJpbi9naXQtcmV2LWxpc3QgJGxpbWl0ICRoYXNoIiBvciBkaWVfZXJyb3IodW5kZWYsICJPcGVuIGZhaWxlZC4iKTsKKwlteSAoQHJldmxpc3QpID0gbWFwIHsgY2hvbXA7ICRfIH0gPCRmZD47CisJY2xvc2UgJGZkOworCisJaWYgKCRoYXNoIG5lICRoZWFkIHx8ICRwYWdlKSB7CisJCXByaW50ICRjZ2ktPmEoey1ocmVmID0+ICIkbXlfdXJpPyIgLiBlc2NfcGFyYW0oInA9JHByb2plY3Q7YT1zaG9ydGxvZyIpfSwgIkhFQUQiKTsKKwl9IGVsc2UgeworCQlwcmludCAiSEVBRCI7CisJfQorCWlmICgkcGFnZSA+IDApIHsKKwkJcHJpbnQgIiAmc2RvdDsgIiAuCisJCSRjZ2ktPmEoey1ocmVmID0+ICIkbXlfdXJpPyIgLiBlc2NfcGFyYW0oInA9JHByb2plY3Q7YT1zaG9ydGxvZztoPSRoYXNoO3BnPSIgLiAoJHBhZ2UtMSkpLCAtYWNjZXNza2V5ID0+ICJwIiwgLXRpdGxlID0+ICJBbHQtcCJ9LCAicHJldiIpOworCX0gZWxzZSB7CisJCXByaW50ICIgJnNkb3Q7IHByZXYiOworCX0KKwlpZiAoJCNyZXZsaXN0ID49ICgxMDAgKiAoJHBhZ2UrMSktMSkpIHsKKwkJcHJpbnQgIiAmc2RvdDsgIiAuCisJCSRjZ2ktPmEoey1ocmVmID0+ICIkbXlfdXJpPyIgLiBlc2NfcGFyYW0oInA9JHByb2plY3Q7YT1zaG9ydGxvZztoPSRoYXNoO3BnPSIgLiAoJHBhZ2UrMSkpLCAtYWNjZXNza2V5ID0+ICJuIiwgLXRpdGxlID0+ICJBbHQtbiJ9LCAibmV4dCIpOworCX0gZWxzZSB7CisJCXByaW50ICIgJnNkb3Q7IG5leHQiOworCX0KKwlwcmludCAiPGJyLz5cbiIgLgorCSAgICAgICI8L2Rpdj5cbiI7CisJcHJpbnQgIjxkaXY+XG4iIC4KKwkgICAgICAkY2dpLT5hKHstaHJlZiA9PiAiJG15X3VyaT8iIC4gZXNjX3BhcmFtKCJwPSRwcm9qZWN0O2E9c3VtbWFyeSIpLCAtY2xhc3MgPT4gInRpdGxlIn0sICImbmJzcDsiKSAuCisJICAgICAgIjwvZGl2PlxuIjsKKwlwcmludCAiPHRhYmxlIGNlbGxzcGFjaW5nPVwiMFwiPlxuIjsKKwlteSAkYWx0ZXJuYXRlID0gMDsKKwlmb3IgKG15ICRpID0gKCRwYWdlICogMTAwKTsgJGkgPD0gJCNyZXZsaXN0OyAkaSsrKSB7CisJCW15ICRjb21taXQgPSAkcmV2bGlzdFskaV07CisJCW15ICRyZWYgPSAiIjsKKwkJaWYgKGRlZmluZWQgJHJlZnMtPnskY29tbWl0fSkgeworCQkJJHJlZiA9ICIgPHNwYW4gY2xhc3M9XCJ0YWdcIj4iIC4gZXNjX2h0bWwoJHJlZnMtPnskY29tbWl0fSkgLiAiPC9zcGFuPiI7CisJCX0KKwkJbXkgJWNvID0gZ2l0X3JlYWRfY29tbWl0KCRjb21taXQpOworCQlteSAlYWQgPSBkYXRlX3N0cigkY297J2F1dGhvcl9lcG9jaCd9KTsKKwkJaWYgKCRhbHRlcm5hdGUpIHsKKwkJCXByaW50ICI8dHIgY2xhc3M9XCJkYXJrXCI+XG4iOworCQl9IGVsc2UgeworCQkJcHJpbnQgIjx0ciBjbGFzcz1cImxpZ2h0XCI+XG4iOworCQl9CisJCSRhbHRlcm5hdGUgXj0gMTsKKwkJcHJpbnQgIjx0ZCB0aXRsZT1cIiRjb3snYWdlX3N0cmluZ19hZ2UnfVwiPjxpPiRjb3snYWdlX3N0cmluZ19kYXRlJ308L2k+PC90ZD5cbiIgLgorCQkgICAgICAiPHRkPjxpPiIgLiBlc2NfaHRtbChjaG9wX3N0cigkY297J2F1dGhvcl9uYW1lJ30sIDEwKSkgLiAiPC9pPjwvdGQ+XG4iIC4KKwkJICAgICAgIjx0ZD4iOworCQlpZiAobGVuZ3RoKCRjb3sndGl0bGVfc2hvcnQnfSkgPCBsZW5ndGgoJGNveyd0aXRsZSd9KSkgeworCQkJcHJpbnQgJGNnaS0+YSh7LWhyZWYgPT4gIiRteV91cmk/IiAuIGVzY19wYXJhbSgicD0kcHJvamVjdDthPWNvbW1pdDtoPSRjb21taXQiKSwgLWNsYXNzID0+ICJsaXN0IiwgLXRpdGxlID0+ICIkY297J3RpdGxlJ30ifSwKKwkJCSAgICAgICI8Yj4iIC4gZXNjX2h0bWwoJGNveyd0aXRsZV9zaG9ydCd9KSAuICIkcmVmPC9iPiIpOworCQl9IGVsc2UgeworCQkJcHJpbnQgJGNnaS0+YSh7LWhyZWYgPT4gIiRteV91cmk/IiAuIGVzY19wYXJhbSgicD0kcHJvamVjdDthPWNvbW1pdDtoPSRjb21taXQiKSwgLWNsYXNzID0+ICJsaXN0In0sCisJCQkgICAgICAiPGI+IiAuIGVzY19odG1sKCRjb3sndGl0bGVfc2hvcnQnfSkgLiAiJHJlZjwvYj4iKTsKKwkJfQorCQlwcmludCAiPC90ZD5cbiIgLgorCQkgICAgICAiPHRkIGNsYXNzPVwibGlua1wiPiIgLgorCQkgICAgICAkY2dpLT5hKHstaHJlZiA9PiAiJG15X3VyaT8iIC4gZXNjX3BhcmFtKCJwPSRwcm9qZWN0O2E9Y29tbWl0O2g9JGNvbW1pdCIpfSwgImNvbW1pdCIpIC4KKwkJICAgICAgIiB8ICIgLiAkY2dpLT5hKHstaHJlZiA9PiAiJG15X3VyaT8iIC4gZXNjX3BhcmFtKCJwPSRwcm9qZWN0O2E9Y29tbWl0ZGlmZjtoPSRjb21taXQiKX0sICJjb21taXRkaWZmIikgLgorCQkgICAgICAiPC90ZD5cbiIgLgorCQkgICAgICAiPC90cj4iOworCX0KKwlpZiAoJCNyZXZsaXN0ID49ICgxMDAgKiAoJHBhZ2UrMSktMSkpIHsKKwkJcHJpbnQgIjx0cj5cbiIgLgorCQkgICAgICAiPHRkPiIgLgorCQkgICAgICAkY2dpLT5hKHstaHJlZiA9PiAiJG15X3VyaT8iIC4gZXNjX3BhcmFtKCJwPSRwcm9qZWN0O2E9c2hvcnRsb2c7aD0kaGFzaDtwZz0iIC4gKCRwYWdlKzEpKSwgLXRpdGxlID0+ICJBbHQtbiJ9LCAibmV4dCIpIC4KKwkJICAgICAgIjwvdGQ+XG4iIC4KKwkJICAgICAgIjwvdHI+XG4iOworCX0KKwlwcmludCAiPC90YWJsZVxuPiI7CisJZ2l0X2Zvb3Rlcl9odG1sKCk7Cit9CmRpZmYgLS1naXQgImEvZ2l0d2ViL3Rlc3QvTVwzMDNcMjQ0cmNoZW4iICJiL2dpdHdlYi90ZXN0L01cMzAzXDI0NHJjaGVuIgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZjdhMWQzCi0tLSAvZGV2L251bGwKKysrICJiL2dpdHdlYi90ZXN0L01cMzAzXDI0NHJjaGVuIgpAQCAtMCwwICsxLDIgQEAKK03DpHJjaGVuCitN5HJjaGVuCmRpZmYgLS1naXQgYS9naXR3ZWIvdGVzdC9maWxlIHdpdGggc3BhY2VzIGIvZ2l0d2ViL3Rlc3QvZmlsZSB3aXRoIHNwYWNlcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMTA4NTQzCi0tLSAvZGV2L251bGwKKysrIGIvZ2l0d2ViL3Rlc3QvZmlsZSB3aXRoIHNwYWNlcwpAQCAtMCwwICsxLDQgQEAKK1RoaXMKK2ZpbGVuYW1lCitjb250YWlucworc3BhY2VzLgpkaWZmIC0tZ2l0IGEvZ2l0d2ViL3Rlc3QvZmlsZStwbHVzK3NpZ24gYi9naXR3ZWIvdGVzdC9maWxlK3BsdXMrc2lnbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZDA1Mjc4Ci0tLSAvZGV2L251bGwKKysrIGIvZ2l0d2ViL3Rlc3QvZmlsZStwbHVzK3NpZ24KQEAgLTAsMCArMSw2IEBACitUaGlzCitmaWxlbmFtZQorY29udGFpbnMKKysKK3BsdXMKK2NoYXJzLgo=