# Name: tru_tags v3.1 # Type: Admin/Client side plugin # Article tagging # Author: Nathan Arthur # URL: http://www.truist.com/ # Recommended load order: 5 # ..................................................................... # This is a plugin for Textpattern - http://textpattern.com/ # To install: textpattern > admin > plugins # Paste the following text into the 'Install plugin' box: # ..................................................................... YToxMDp7czo0OiJuYW1lIjtzOjg6InRydV90YWdzIjtzOjY6ImF1dGhvciI7czoxMzoiTmF0 aGFuIEFydGh1ciI7czoxMDoiYXV0aG9yX3VyaSI7czoyMjoiaHR0cDovL3d3dy50cnVpc3Qu Y29tLyI7czo3OiJ2ZXJzaW9uIjtzOjM6IjMuMSI7czoxMToiZGVzY3JpcHRpb24iO3M6MTU6 IkFydGljbGUgdGFnZ2luZyI7czo0OiJjb2RlIjtzOjMzNjgxOiIKI0NvcHlyaWdodCAyMDA3 IE5hdGhhbiBBcnRodXIKI1JlbGVhc2VkIHVuZGVyIHRoZSBHTlUgUHVibGljIExpY2Vuc2Us IHNlZSBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2dwbC1saWNlbnNlLnBo cCBmb3IgZGV0YWlscwojVGhpcyB3b3JrIGlzIGluc3BpcmVkIGJ5IHJhbl90YWdzIGJ5IFJh biBBcm91c3NpLCBvcmlnaW5hbGx5IGZvdW5kIGF0IGh0dHA6Ly9hcm91c3NpLmNvbS9hcnRp Y2xlLzQ1L3RhZ2dpbmctdGV4dHBhdHRlcm4KCgojIyMgQ09ORklHVVJBVElPTiAjIyMKIyMj IyMjIyMjIyMjIyMjIyMjIyMjCgojIFRVUk4gQkFDSyEgIENvbmZpZ3VyYXRpb24gaXMgbm8g bG9uZ2VyIGhhbmRsZWQgYnkgZWRpdGluZyB0aGUgcGx1Z2luLgojIENoZWNrIG91dCB0aGUg J0V4dGVuc2lvbnMnIHRhYiBpbiB0aGUgVGV4dHBhdHRlcm4gYWRtaW4gOikKCgojIENoYW5n aW5nIHRoZXNlIHdvbid0IGRvIGFueSBnb29kLiAgVGhleSdyZSBqdXN0IGhlcmUgYXMgYSBj b252ZW5pZW5jZSBmb3IgZGV2ZWxvcG1lbnQuCmRlZmluZSgnVFJVX1RBR1NfRklFTEQnLCAn S2V5d29yZHMnKTsKZGVmaW5lKCdDTEVBTl9VUkxTJywgJ2NsZWFuX3VybHMnKTsKZGVmaW5l KCdUQUdfU0VDVElPTicsICd0YWdfc2VjdGlvbicpOwpkZWZpbmUoJ1BBUk1fTkFNRScsICdw YXJtJyk7CmRlZmluZSgnVEFHU19JTl9GRUVEX0NBVEVHT1JJRVMnLCAndGFnc19pbl9mZWVk X2NhdGVnb3JpZXMnKTsKZGVmaW5lKCdUQUdTX0lOX0ZFRURfQk9EWScsICd0YWdzX2luX2Zl ZWRfYm9keScpOwpkZWZpbmUoJ1RBR1NfSU5fV1JJVEVfVEFCJywgJ3RhZ3NfaW5fd3JpdGVf dGFiJyk7CgpnbG9iYWwgJHRydV90YWdzX3ByZWZzOwokdHJ1X3RhZ3NfcHJlZnMgPSB0cnVf dGFnc19sb2FkX3ByZWZzKCk7CgoKIyMjIFBSSU1BUlkgVEFHIEZVTkNUSU9OUyAjIyMKIyMj IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKCmZ1bmN0aW9uIHRydV90YWdzX2hhbmRsZXIo JGF0dHMpIHsKCSR0YWdfcGFyYW1ldGVyID0gdHJ1X3RhZ3NfdGFnX3BhcmFtZXRlcihhcnJh eSgpLCBmYWxzZSk7CglpZiAoIWVtcHR5KCR0YWdfcGFyYW1ldGVyKSkgewoJCWlmICh0cnVf dGFnc19yZWRpcmVjdF9pZl9uZWVkZWQoJHRhZ19wYXJhbWV0ZXIpKSB7CgkJCXJldHVybiAn JzsKCQl9CgkJJGNsZWFuX2F0dHMgPSB0cnVfdGFnc19maXh1cF9xdWVyeV9hdHRzKCRhdHRz LCAkdGFnX3BhcmFtZXRlcik7CgkJJHJlc3VsdCA9IGRvQXJ0aWNsZXMoJGNsZWFuX2F0dHMs IHRydWUpOwkJI2Z1bmN0aW9uIGluIFRYUCBjb2RlCgkJaWYgKHRyaW0oJHJlc3VsdCkgPT0g JycpIHsKCQkJaWYgKGlzc2V0KCRhdHRzWydub2FydGljbGVzJ10pKSB7CgkJCQl0cnVfdGFn c19yZWRpcmVjdCgkYXR0c1snbm9hcnRpY2xlcyddLCB0cnVlKTsKCQkJfSBlbHNlIHsKCQkJ CXR4cF9kaWUoZ1R4dCgnNDA0X25vdF9mb3VuZCcpLCAnNDA0Jyk7CgkJCX0KCQl9IGVsc2Ug ewoJCQlyZXR1cm4gJHJlc3VsdDsKCQl9Cgl9IGVsc2UgewoJCXJldHVybiB0cnVfdGFnc19j bG91ZCgkYXR0cyk7Cgl9Cn0KCgpmdW5jdGlvbiB0cnVfdGFnc19jbG91ZCgkYXR0cykgewoJ cmV0dXJuIHRydV90YWdzX2xpc3QodHJ1X3RhZ3NfZ2V0X3N0YW5kYXJkX2Nsb3VkX2F0dHMo JGF0dHMsIGZhbHNlLCBmYWxzZSkpOwp9CgoKZnVuY3Rpb24gdHJ1X3RhZ3NfbGlzdCgkYXR0 cykgewoJJGF0dHMgPSB0cnVfdGFnc19nZXRfc3RhbmRhcmRfY2xvdWRfYXR0cygkYXR0cywg dHJ1ZSwgZmFsc2UpOwoJJGFsbF90YWdzID0gdHJ1X3RhZ3NfY2xvdWRfcXVlcnkoJGF0dHMp OwoKCXJldHVybiB0cnVfdGFnc19yZW5kZXJfY2xvdWQoJGF0dHMsICRhbGxfdGFncywgJGFs bF90YWdzKTsKfQoKCmZ1bmN0aW9uIHRydV90YWdzX2Zyb21fYXJ0aWNsZSgkYXR0cykgewoJ Z2xvYmFsICR0aGlzYXJ0aWNsZTsKCWV4dHJhY3QoJHRoaXNhcnRpY2xlKTsKCgkkYWxsX3Rh Z3MgPSB0cnVfdGFnc19nZXRfdGFnc19mb3JfYXJ0aWNsZSgkdGhpc2lkKTsKCgkkYXR0cyA9 IHRydV90YWdzX2dldF9zdGFuZGFyZF9jbG91ZF9hdHRzKCRhdHRzLCBmYWxzZSwgdHJ1ZSk7 CgkkYWxsX3RhZ3NfZm9yX3dlaWdodCA9ICRhbGxfdGFnczsKCWlmICgkYXR0c1sndXNlb3Zl cmFsbGNvdW50cyddKSB7CgkJJGFsbF90YWdzX2Zvcl93ZWlnaHQgPSB0cnVfdGFnc19jbG91 ZF9xdWVyeSgkYXR0cyk7Cgl9CgoJcmV0dXJuIHRydV90YWdzX3JlbmRlcl9jbG91ZCgkYXR0 cywgJGFsbF90YWdzLCAkYWxsX3RhZ3NfZm9yX3dlaWdodCk7Cn0KCgpmdW5jdGlvbiB0cnVf dGFnc19pZl9oYXNfdGFncygkYXR0cywgJHRoaW5nKSB7CglnbG9iYWwgJHRoaXNhcnRpY2xl OwoJZXh0cmFjdCgkdGhpc2FydGljbGUpOwoKCSR0YWdzX2ZpZWxkID0gVFJVX1RBR1NfRklF TEQ7CgoJJHJzID0gc2FmZV9yb3coJHRhZ3NfZmllbGQsICJ0ZXh0cGF0dGVybiIsICJJRD0n JHRoaXNpZCcgQU5EICR0YWdzX2ZpZWxkIDw+ICcnIik7CglyZXR1cm4gcGFyc2UoRXZhbEVs c2UoJHRoaW5nLCAkcnMpKTsKfQoKCmZ1bmN0aW9uIHRydV90YWdzX2lmX3RhZ19zZWFyY2go JGF0dHMsICR0aGluZykgewoJJHRhZ19wYXJhbWV0ZXIgPSB0cnVfdGFnc190YWdfcGFyYW1l dGVyKGFycmF5KCksIGZhbHNlKTsKCSRjb25kaXRpb24gPSAoIWVtcHR5KCR0YWdfcGFyYW1l dGVyKSkgPyB0cnVlIDogZmFsc2U7CglyZXR1cm4gcGFyc2UoRXZhbEVsc2UoJHRoaW5nLCAk Y29uZGl0aW9uKSk7Cn0KCgpmdW5jdGlvbiB0cnVfdGFnc190YWdfcGFyYW1ldGVyKCRhdHRz LCAkc2FmZWh0bWwgPSB0cnVlKSB7CglnbG9iYWwgJHRydV90YWdzX3ByZWZzOwoJZXh0cmFj dChsQXR0cyhhcnJheSgnc3RyaXBoeXBoZW5zJyA9PiAwLCAndXJsZW5jb2RlJyA9PiAwKSwg ICRhdHRzLCAwKSk7CgoJJHBhcm0gPSB1cmxkZWNvZGUoc3RyaXBfdGFncyhncHMoJHRydV90 YWdzX3ByZWZzW1BBUk1fTkFNRV0tPnZhbHVlKSkpOwoJJHBhcm0gPSAoJHN0cmlwaHlwaGVu cyA/IHN0cl9yZXBsYWNlKCctJywgJyAnLCAkcGFybSkgOiAkcGFybSk7CglpZiAoJHVybGVu Y29kZSkgewoJCSRwYXJtID0gdXJsZW5jb2RlKCRwYXJtKTsKCSB9IGVsc2UgaWYgKCRzYWZl aHRtbCkgewoJCSRwYXJtID0gaHRtbHNwZWNpYWxjaGFycygkcGFybSk7Cgl9CgoJcmV0dXJu ICRwYXJtOwp9CgoKZnVuY3Rpb24gdHJ1X3RhZ3Nfc2VhcmNoX3BhcmFtZXRlcigpIHsKCXJl dHVybiBzdHJpcF90YWdzKGdwcygncScpKTsKfQoKCmZ1bmN0aW9uIHRydV90YWdzX3JlbGF0 ZWRfdGFnc19mcm9tX3NlYXJjaCgkYXR0cykgewoJJHRhZ19wYXJhbWV0ZXIgPSB0cnVfdGFn c190YWdfcGFyYW1ldGVyKGFycmF5KCksIGZhbHNlKTsKCWlmICghZW1wdHkoJHRhZ19wYXJh bWV0ZXIpKSB7CgkgICAgICAgICR0YWdzX2ZpZWxkID0gVFJVX1RBR1NfRklFTEQ7CgkJJGFs bF90YWdzID0gYXJyYXkoKTsKCgkJJHF1ZXJ5X2F0dHMgPSB0cnVfdGFnc19maXh1cF9xdWVy eV9hdHRzKCRhdHRzLCAkdGFnX3BhcmFtZXRlcik7CgkJJHJzID0gdHJ1X3RhZ3NfcmVkb19h cnRpY2xlX3NlYXJjaCgkcXVlcnlfYXR0cyk7CgkJaWYgKCRycykgewoJCQl3aGlsZSAoJGEg PSBuZXh0Um93KCRycykpIHsKCQkJCSRhcnRpY2xlX3RhZ3MgPSBhcnJheSgpOwoJCQkJaWYg KGFycmF5X2tleV9leGlzdHMoJHRhZ3NfZmllbGQsICRhKSkgewoJCQkJCSRhcnRpY2xlX3Rh Z3MgPSBleHBsb2RlKCIsIiwgdHJpbSh0cnVfdGFnc19zdHJ0b2xvd2VyKCRhWyR0YWdzX2Zp ZWxkXSkpKTsKCQkJCX0KCQkJCSRhbGxfdGFncyA9IGFycmF5X21lcmdlKCRhbGxfdGFncywg dHJ1X3RhZ3NfdHJpbV90YWdzKCRhcnRpY2xlX3RhZ3MpKTsKCQkJfQoJCX0KCgkJJGFsdF90 YWdfcGFyYW1ldGVyID0gc3RyX3JlcGxhY2UoJy0nLCAnICcsICR0YWdfcGFyYW1ldGVyKTsK CQlmb3JlYWNoICgkYWxsX3RhZ3MgYXMgJGtleSA9PiAkdGFnKSB7CgkJCWlmICgkdGFnID09 ICR0YWdfcGFyYW1ldGVyIHx8ICR0YWcgPT0gJGFsdF90YWdfcGFyYW1ldGVyKSB7CgkJCQl1 bnNldCgkYWxsX3RhZ3NbJGtleV0pOwoJCQl9CgkJfQoKCQkkY2xvdWRfYXR0cyA9IHRydV90 YWdzX2dldF9zdGFuZGFyZF9jbG91ZF9hdHRzKCRhdHRzLCBmYWxzZSwgZmFsc2UpOwoJCSRh bGxfdGFnc19mb3Jfd2VpZ2h0ID0gJGFsbF90YWdzOwoJCWlmICgkY2xvdWRfYXR0c1sndXNl b3ZlcmFsbGNvdW50cyddKSB7CgkJCSRhbGxfdGFnc19mb3Jfd2VpZ2h0ID0gdHJ1X3RhZ3Nf Y2xvdWRfcXVlcnkoJGNsb3VkX2F0dHMpOwoJCX0KCgkJcmV0dXJuIHRydV90YWdzX3JlbmRl cl9jbG91ZCgkY2xvdWRfYXR0cywgJGFsbF90YWdzLCAkYWxsX3RhZ3NfZm9yX3dlaWdodCk7 Cgl9IGVsc2UgewoJCXJldHVybiAnJzsKCX0KfQoKCiMjIyBDTE9VRCBTVVBQT1JUIEZVTkNU SU9OUyAjIyMKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwoKZnVuY3Rpb24gdHJ1 X3RhZ3NfZ2V0X3N0YW5kYXJkX2Nsb3VkX2F0dHMoJGF0dHMsICRpc0xpc3QsICRpc0FydGlj bGUpIHsKCXJldHVybiBsQXR0cyhhcnJheSgnd3JhcHRhZycJPT4gKCRpc0xpc3QgPyAndWwn IDogJycpLAoJCQknYnJlYWsnCQk9PiAoJGlzTGlzdCA/ICdsaScgOiAnLCAnKSwKCQkJJ2Ns YXNzJwkJPT4gJycsCgkJCSdicmVha2NsYXNzJwk9PiAnJywKCQkJJ3NlY3Rpb24nCT0+ICcn LAoJCQknbWlucGVyY2VudCcJPT4gJzEwMCcsCgkJCSdtYXhwZXJjZW50Jwk9PiAoJGlzTGlz dCB8fCAkaXNBcnRpY2xlID8gJzEwMCcgOiAnMjAwJyksCgkJCSdzaG93Y291bnRzJwk9PiAn JywKCQkJJ2NvdW50d3JhcGNoYXJzJwk9PiAnW10nLAoJCQkndXNlcmVsdGFnJwk9PiAoJGlz QXJ0aWNsZSA/ICcxJyA6ICcnKSwKCQkJJ2dlbmVyYXRlbGlua3MnCT0+ICcxJywKCQkJJ21p bnRhZ2NvdW50Jwk9PiAnMCcsCgkJCSdtYXh0YWdjb3VudCcJPT4gJzEwMDAnLAoJCQknc2V0 c2l6ZXMnCT0+ICgkaXNBcnRpY2xlID8gJzAnIDogJzEnKSwKCQkJJ3VzZW5vZm9sbG93Jwk9 PiAnJywKCQkJJ3NvcnQnCQk9PiAnYWxwaGEnLAoJCQkndXNlb3ZlcmFsbGNvdW50cycJPT4g JycsCgkJCSdzZXRjbGFzc2VzJwk9PiAoJGlzQXJ0aWNsZSA/ICcwJyA6ICcxJyksCgkJCSd0 aXRsZScJCT0+ICcnLAoJCQknbGlzdGxpbWl0Jwk9PiAnJywKCQkJJ2tlZXAnCQk9PiAnbGFy Z2VzdCcsCgkJCSdjdXRvZmYnCT0+ICdjaHVuaycsCgkJCSd0ZXh0dHJhbnNmb3JtJwk9PiAn bm9uZScsCgkJCSdsaW5rcGF0aCcJPT4gJycsCgkJCSdsaW5rcGF0aHRhaWwnCT0+ICcnLAoJ CQknZmlsdGVyc2VhcmNoJwk9PiAnMScsCgkJCSdleGNsdWRlc2VjdGlvbic9PiAnJywKCQkJ J2FjdGl2ZWNsYXNzJwk9PiAndGFnQWN0aXZlJwoJCSksJGF0dHMsIDApOwp9CgoKZnVuY3Rp b24gdHJ1X3RhZ3NfY2xvdWRfcXVlcnkoJGF0dHMpIHsKCWV4dHJhY3QoJGF0dHMpOwoKCSRz ZWN0aW9uX2NsYXVzZSA9ICcnOwoJaWYgKCRzZWN0aW9uIDw+ICcnKSB7CgkJJGtleXMgPSBz cGxpdCgnLCcsICRzZWN0aW9uKTsKCQlmb3JlYWNoICgka2V5cyBhcyAka2V5KSB7CgkJCSRr ZXlwYXJ0c1tdID0gIiBTZWN0aW9uID0gJyIgLiB0cmltKCRrZXkpIC4gIiciOwoJCX0KCQkk c2VjdGlvbl9jbGF1c2UgPSAiIEFORCAoIiAuIGpvaW4oJyBvciAnLCAka2V5cGFydHMpIC4g IikiOwoJfQoKCSR0YWdzX2ZpZWxkID0gVFJVX1RBR1NfRklFTEQ7CglpbmNsdWRlX29uY2Ug dHhwYXRoLicvcHVibGlzaC9zZWFyY2gucGhwJzsKCgkkZmlsdGVyID0gdHJ1X3RhZ3NfZmls dGVyX3NlY3Rpb25zKCRleGNsdWRlc2VjdGlvbik7CgkkZmlsdGVyIC49ICgkZmlsdGVyc2Vh cmNoID8gZmlsdGVyU2VhcmNoKCkgOiAnJyk7CgoJJGFsbF90YWdzID0gYXJyYXkoKTsKCSRy cyA9IHNhZmVfcm93cygiJHRhZ3NfZmllbGQiLCAidGV4dHBhdHRlcm4iLCAiJHRhZ3NfZmll bGQgPD4gJyciIC4gJHNlY3Rpb25fY2xhdXNlIC4gJGZpbHRlciAuICIgYW5kIFN0YXR1cyA+ PSAnNCcgYW5kIFBvc3RlZCA8IG5vdygpIik7Cglmb3JlYWNoICgkcnMgYXMgJHJvdykgewoJ CSR0ZW1wX2FycmF5ID0gYXJyYXkoKTsKCQlpZiAoYXJyYXlfa2V5X2V4aXN0cygkdGFnc19m aWVsZCwgJHJvdykpIHsKCQkJJHRlbXBfYXJyYXkgPSBleHBsb2RlKCIsIiwgdHJpbSh0cnVf dGFnc19zdHJ0b2xvd2VyKCRyb3dbJHRhZ3NfZmllbGRdKSkpOwoJCX0KCQkkYWxsX3RhZ3Mg PSBhcnJheV9tZXJnZSgkYWxsX3RhZ3MsIHRydV90YWdzX3RyaW1fdGFncygkdGVtcF9hcnJh eSkpOwoJfQoKCXJldHVybiAkYWxsX3RhZ3M7Cn0KCgpmdW5jdGlvbiB0cnVfdGFnc19maWx0 ZXJfc2VjdGlvbnMoJGV4Y2x1ZGVzZWN0aW9uKSB7Cgkkc2VjdGlvbnMgPSBleHBsb2RlKCcs JywgJGV4Y2x1ZGVzZWN0aW9uKTsKCSRmaWx0ZXJzID0gYXJyYXkoKTsKCWZvcmVhY2ggKCRz ZWN0aW9ucyBhcyAkc2VjdGlvbikgewoJCSRmaWx0ZXJzW10gPSAiYW5kIFNlY3Rpb24gIT0g JyIuZG9TbGFzaCgkc2VjdGlvbikuIiciOwoJfQoJcmV0dXJuIGpvaW4oJyAnLCAkZmlsdGVy cyk7Cn0KCgpmdW5jdGlvbiB0cnVfdGFnc19yZW5kZXJfY2xvdWQoJGF0dHMsICRhbGxfdGFn cywgJGFsbF90YWdzX2Zvcl93ZWlnaHQpIHsKCWdsb2JhbCAkdHJ1X3RhZ3NfcHJlZnM7Cgll eHRyYWN0KCRhdHRzKTsKCgkkdGFnc193ZWlnaHQgPSBhcnJheV9jb3VudF92YWx1ZXMoJGFs bF90YWdzX2Zvcl93ZWlnaHQpOwoKCWZvcmVhY2ggKCR0YWdzX3dlaWdodCBhcyAkdGFnID0+ ICR3ZWlnaHQpIHsKCQlpZiAoIWluX2FycmF5KCR0YWcsICRhbGxfdGFncykKCQkgICB8fCAk dGFnc193ZWlnaHRbJHRhZ10gPCAkbWludGFnY291bnQKCQkgICB8fCAkdGFnc193ZWlnaHRb JHRhZ10gPiAkbWF4dGFnY291bnQpIHsKCQkJdW5zZXQoJHRhZ3Nfd2VpZ2h0WyR0YWddKTsK CQl9Cgl9CgoJJHNvcnRfYnlfY291bnQgPSAoc3RycG9zKCRzb3J0LCAnY291bnQnKSAhPT0g ZmFsc2UpOwoJJHNvcnRfYXNjZW5kaW5nID0gKHN0cnBvcygkc29ydCwgJ2FzYycpICE9PSBm YWxzZSk7CgkkdGFnc193ZWlnaHQgPSB0cnVfdGFnc19zb3J0X3RhZ3MoJHRhZ3Nfd2VpZ2h0 LCAkc29ydF9ieV9jb3VudCwgJHNvcnRfYXNjZW5kaW5nKTsKCglpZiAoJGxpc3RsaW1pdCA+ IDAgJiYgJGxpc3RsaW1pdCA8IGNvdW50KCR0YWdzX3dlaWdodCkpIHsKCQkkcmVzb3J0ZWRf dGFncyA9IGFycmF5KCk7CgkJaWYgKCRrZWVwID09ICdsYXJnZXN0JykgewoJCQkkcmVzb3J0 ZWRfdGFncyA9IGFycmF5X2tleXModHJ1X3RhZ3Nfc29ydF90YWdzKCR0YWdzX3dlaWdodCwg dHJ1ZSwgZmFsc2UpKTsKCQl9IGVsc2UgewoJCQlpZiAoJGtlZXAgPT0gJ3JhbmRvbScpIHsK CQkJCWZvcmVhY2ggKCR0YWdzX3dlaWdodCBhcyAkdGFnID0+ICR3ZWlnaHQpIHsKCQkJCQkk cmVzb3J0ZWRfdGFnc1skdGFnXSA9IHJhbmQoMCwgJHdlaWdodCk7CgkJCQl9CgkJCQkkcmVz b3J0ZWRfdGFncyA9IGFycmF5X2tleXModHJ1X3RhZ3Nfc29ydF90YWdzKCRyZXNvcnRlZF90 YWdzLCB0cnVlLCBmYWxzZSkpOwoJCQl9IGVsc2UgaWYgKCRrZWVwID09ICdhbHBoYScpIHsK CQkJCSRyZXNvcnRlZF90YWdzID0gYXJyYXlfa2V5cygkdGFnc193ZWlnaHQpOwoJCQkJbmF0 Y2FzZXNvcnQoJHJlc29ydGVkX3RhZ3MpOwoJCQl9CgkJCSRjdXRvZmYgPSAnZXhhY3QnOwoJ CX0KCgkJJGxhc3RfZ29vZF9pbmRleCA9ICRsaXN0bGltaXQgLSAxOwoJCWlmICgkY3V0b2Zm ID09ICdjaHVuaycpIHsgLy9hbHRlcm5hdGl2ZSBpcyAnZXhhY3QnCgkJCSRsYXN0X3dlaWdo dCA9IC0xOwoJCQlmb3IgKCRpID0gMDsgJGkgPCAkbGlzdGxpbWl0ICsgMTsgJGkrKykgewoJ CQkJJG5ld193ZWlnaHQgPSAkdGFnc193ZWlnaHRbJHJlc29ydGVkX3RhZ3NbJGldXTsKCQkJ CWlmICgkbmV3X3dlaWdodCAhPSAkbGFzdF93ZWlnaHQpIHsKCQkJCQkkbGFzdF9nb29kX2lu ZGV4ID0gJGkgLSAxOwoJCQkJCSRsYXN0X3dlaWdodCA9ICRuZXdfd2VpZ2h0OwoJCQkJfQoJ CQl9CgkJCWlmICgkbGFzdF9nb29kX2luZGV4IDwgMCkgewoJCQkJJGxhc3RfZ29vZF9pbmRl eCA9ICRsaXN0bGltaXQgLSAxOwoJCQl9CgkJfQoKCQkkcmVzb3J0ZWRfdGFncyA9IGFycmF5 X2NodW5rKCRyZXNvcnRlZF90YWdzLCAkbGFzdF9nb29kX2luZGV4ICsgMSk7CgkJJHJlc29y dGVkX3RhZ3MgPSAkcmVzb3J0ZWRfdGFnc1swXTsKCgkJZm9yZWFjaCAoJHRhZ3Nfd2VpZ2h0 IGFzICR0YWcgPT4gJHdlaWdodCkgewoJCQlpZiAoIWluX2FycmF5KCR0YWcsICRyZXNvcnRl ZF90YWdzKSkgewoJCQkJdW5zZXQoJHRhZ3Nfd2VpZ2h0WyR0YWddKTsKCQkJfQoJCX0KCX0K CglpZiAoJGdlbmVyYXRlbGlua3MpIHsKCQlpZiAoJGxpbmtwYXRoKSB7CgkJCSR1cmxwcmVm aXggPSAkbGlua3BhdGg7CgkJCSR1cmxzdWZmaXggPSAkbGlua3BhdGh0YWlsOwoJCX0gZWxz ZSB7CgkJCWlmICh0cnVfdGFnc19jbGVhbl91cmxzKCkpIHsKCQkJCSR1cmxwcmVmaXggPSBo dSAuICR0cnVfdGFnc19wcmVmc1tUQUdfU0VDVElPTl0tPnZhbHVlIC4gJy8nOwoJCQl9IGVs c2UgewoJCQkJJHVybHByZWZpeCA9IGh1IC4gJz9zPScgLiAkdHJ1X3RhZ3NfcHJlZnNbVEFH X1NFQ1RJT05dLT52YWx1ZSAuICcmYW1wOycgLiAkdHJ1X3RhZ3NfcHJlZnNbUEFSTV9OQU1F XS0+dmFsdWUgLiAnPSc7CgkJCX0KCQkJJHVybHN1ZmZpeCA9ICh0cnVfdGFnc19jbGVhbl91 cmxzKCkgPyAnLycgOiAnJyk7CgkJfQoKCQlpZiAoJHVzZXJlbHRhZykgewoJCQlpZiAoJHVz ZW5vZm9sbG93KSB7CgkJCQkkdXJsc3VmZml4IC49ICciIHJlbD0idGFnIG5vZm9sbG93JzsK CQkJfSBlbHNlIHsKCQkJCSR1cmxzdWZmaXggLj0gJyIgcmVsPSJ0YWcnOwoJCQl9CgkJfSBl bHNlIGlmICgkdXNlbm9mb2xsb3cpIHsKCQkJJHVybHN1ZmZpeCAuPSAnIiByZWw9Im5vZm9s bG93JzsKCQl9Cgl9CgoJaWYgKGNvdW50KCR0YWdzX3dlaWdodCkgPiAwKSB7CgkJJG1heCA9 IG1heCgkdGFnc193ZWlnaHQpOwoJCSRtaW4gPSBtaW4oJHRhZ3Nfd2VpZ2h0KTsKCX0gZWxz ZSB7CgkJJG1heCA9ICRtaW4gPSAwOwoJfQoJJHN0ZXB2YWx1ZSA9ICgkbWF4ID09ICRtaW4p ID8gMCA6ICgkbWF4cGVyY2VudCAtICRtaW5wZXJjZW50KSAvICgkbWF4IC0gJG1pbik7CgoJ JHRhZ3NfaHRtbCA9IGFycmF5KCk7CgkkdGFnX3NlYXJjaF90YWcgPSB0cnVfdGFnc190YWdf cGFyYW1ldGVyKGFycmF5KCdzdHJpcGh5cGhlbnMnID0+ICcxJykpOwoJJHRhZ19zZWFyY2hf dGFnID0gZnVuY3Rpb25fZXhpc3RzKCJodG1sc3BlY2lhbGNoYXJzX2RlY29kZSIpID8gaHRt bHNwZWNpYWxjaGFyc19kZWNvZGUoJHRhZ19zZWFyY2hfdGFnKSA6IGh0bWxfZW50aXR5X2Rl Y29kZSgkdGFnX3NlYXJjaF90YWcpOwoJZm9yZWFjaCAoJHRhZ3Nfd2VpZ2h0IGFzICR0YWcg PT4gJHdlaWdodCkgewoJCSR0YWdfd2VpZ2h0ID0gZmxvb3IoJG1pbnBlcmNlbnQgKyAoJHdl aWdodCAtICRtaW4pICogJHN0ZXB2YWx1ZSk7CgoJCSRzdHlsZSA9ICcnOwoJCWlmICgkc2V0 c2l6ZXMpCgkJCSRzdHlsZSA9ICcgc3R5bGU9ImZvbnQtc2l6ZTogJyAuICR0YWdfd2VpZ2h0 IC4gJyU7Iic7CgoJCSR0YWdfY2xhc3MgPSAnJzsKCQlpZiAoJHNldGNsYXNzZXMpIHsKCQkJ JHRhZ19jbGFzcyA9ICcgY2xhc3M9Iic7CgkJCWlmICgkd2VpZ2h0ID09ICRtaW4pIHsKCQkJ CSR0YWdfY2xhc3MgLj0gInRhZ1NpemVTbWFsbGVzdCI7CgkJCX0gZWxzZSBpZiAoJHdlaWdo dCA9PSAkbWF4KSB7CgkJCQkkdGFnX2NsYXNzIC49ICJ0YWdTaXplTGFyZ2VzdCI7CgkJCX0g ZWxzZSB7CgkJCQkkdGFnX2NsYXNzIC49ICJ0YWdTaXplTWVkaXVtIjsKCQkJfQoJCQkkdGFn X2NsYXNzIC49ICcgdGFnU2l6ZScgLiAoJHdlaWdodCArIDEgLSAkbWluKTsKCQkJaWYgKCR0 YWcgPT0gJHRhZ19zZWFyY2hfdGFnKSB7CgkJCQkkdGFnX2NsYXNzIC49ICcgJyAuICRhY3Rp dmVjbGFzczsKCQkJfQoJCQkkdGFnX2NsYXNzIC49ICciJzsKCQl9CgoJCS8vYWRhcHRlZCBm cm9tIGNvZGUgYnkgZ2R0cm9pYW5vLCBzZWUgaHR0cDovL2ZvcnVtLnRleHRwYXR0ZXJuLmNv bS92aWV3dG9waWMucGhwP3BpZD0xMDI4NzUjcDEwMjg3NQoJCSR0aXRsZWNvdW50ID0gJyc7 CgkJaWYgKCR0aXRsZSkKCQkJJHRpdGxlY291bnQgPSAnIHRpdGxlPSInIC4gJHRpdGxlIC4g JyInOwoJCSRkaXNwbGF5Y291bnQ9ICcnOwoJCSRjb3VudCA9ICRjb3VudHdyYXBjaGFyc3sw fSAuICR3ZWlnaHQgLiAkY291bnR3cmFwY2hhcnN7MX07CgkJaWYgKCRzaG93Y291bnRzID09 ICd0aXRsZScgfHwgJHNob3djb3VudHMgPT0gJ2JvdGgnKQoJCQkkdGl0bGVjb3VudCA9ICcg dGl0bGU9IicgLiAkdGl0bGUgLiAkY291bnQgLiAnIic7CgkJaWYgKCRzaG93Y291bnRzICYm ICRzaG93Y291bnRzICE9ICd0aXRsZScpCgkJCSRkaXNwbGF5Y291bnQgPSAnICcgLiAkY291 bnQ7CgoJCWlmICgkdGV4dHRyYW5zZm9ybSA9PSAnY2FwaXRhbGl6ZScpIHsKCQkJJHRhZyA9 IHVjd29yZHMoJHRhZyk7CgkJfSBlbHNlIGlmICgkdGV4dHRyYW5zZm9ybSA9PSAndXBwZXJj YXNlJykgewoJCQkkdGFnID0gc3RydG91cHBlcigkdGFnKTsKCQl9IGVsc2UgaWYgKCR0ZXh0 dHJhbnNmb3JtID09ICdsb3dlcmNhc2UnKSB7CgkJCSR0YWcgPSBzdHJ0b2xvd2VyKCR0YWcp OwoJCX0gZWxzZSBpZiAoJHRleHR0cmFuc2Zvcm0gPT0gJ2NhcGZpcnN0JykgewoJCQkkdGFn ID0gdWNmaXJzdCgkdGFnKTsKCQl9CgoJCWlmICgkZ2VuZXJhdGVsaW5rcykgewoJCQkkd2hv bGV1cmwgPSAnIicgLiAkdXJscHJlZml4IC4gdXJsZW5jb2RlKHN0cl9yZXBsYWNlKCcgJywg Jy0nLCAkdGFnKSkgLiAkdXJsc3VmZml4IC4gJyInOwoJCQkkdGFnc19odG1sW10gPSAnPGEg aHJlZj0nIC4gJHdob2xldXJsIC4gJHRhZ19jbGFzcyAuICRzdHlsZSAuICR0aXRsZWNvdW50 IC4gJz4nIC4gaHRtbHNwZWNpYWxjaGFycygkdGFnKSAuICc8L2E+JyAuICRkaXNwbGF5Y291 bnQ7CgkJfSBlbHNlIGlmICgkdGFnX2NsYXNzIHx8ICRzdHlsZSB8fCAkdGl0bGVjb3VudCkg ewoJCQkkdGFnc19odG1sW10gPSAnPHNwYW4nIC4gJHRhZ19jbGFzcyAuICRzdHlsZSAuICR0 aXRsZWNvdW50IC4gJz4nIC4gaHRtbHNwZWNpYWxjaGFycygkdGFnKSAuICc8L3NwYW4+JyAu ICRkaXNwbGF5Y291bnQ7CgkJfSBlbHNlIHsKCQkJJHRhZ3NfaHRtbFtdID0gaHRtbHNwZWNp YWxjaGFycygkdGFnKSAuICRkaXNwbGF5Y291bnQ7CgkJfQoJfQoJcmV0dXJuIHRydV90YWdz X2RvX3dyYXAoJHRhZ3NfaHRtbCwgJHdyYXB0YWcsICRicmVhaywgJGNsYXNzLCAkYnJlYWtj bGFzcyk7Cn0KCgojIyMgQ0xFQU4gVVJMIEZVTkNUSU9OUyAjIyMKIyMjIyMjIyMjIyMjIyMj IyMjIyMjIyMjIyMjCgppZiAodHJ1X3RhZ3NfY2xlYW5fdXJscygpKSB7CglyZWdpc3Rlcl9j YWxsYmFjaygndHJ1X3RhZ3NfY2xlYW5fdXJsX2hhbmRsZXInLCAncHJldGV4dCcpOwp9CgoK ZnVuY3Rpb24gdHJ1X3RhZ3NfY2xlYW5fdXJsX2hhbmRsZXIoJGV2ZW50LCAkc3RlcCkgewoJ Z2xvYmFsICR0cnVfdGFnc19wcmVmczsKCSRzdWJwYXRoID0gcHJlZ19yZXBsYWNlKCIvaHR0 cHM/OlwvXC8uKihcLy4qKS9VaSIsIiQxIixodSk7CgkkcmVnc2FmZXN1YnBhdGggPSBwcmVn X3F1b3RlKCRzdWJwYXRoLCAnLycpOwoJJHJlcSA9IHByZWdfcmVwbGFjZSgiL14kcmVnc2Fm ZXN1YnBhdGgvaSIsJy8nLCRfU0VSVkVSWydSRVFVRVNUX1VSSSddKTsKCgkkcXMgPSBzdHJw b3MoJHJlcSwgJz8nKTsKCSRxYXR0cyA9ICgkcXMgPyAnJicuc3Vic3RyKCRyZXEsICRxcyAr IDEpIDogJycpOwoJaWYgKCRxcykgJHJlcSA9IHN1YnN0cigkcmVxLCAwLCAkcXMpOwoKCSRw YXJ0cyA9IGFycmF5X3ZhbHVlcyhhcnJheV9maWx0ZXIoc3BsaXQoJy8nLCAkcmVxKSkpOwoJ aWYgKGNvdW50KCRwYXJ0cykgPT0gMiAmJiAkcGFydHNbMF0gPT0gJHRydV90YWdzX3ByZWZz W1RBR19TRUNUSU9OXS0+dmFsdWUpIHsKCQkkdGFnID0gJHBhcnRzWzFdOwoJCSRfU0VSVkVS WydRVUVSWV9TVFJJTkcnXSA9ICR0cnVfdGFnc19wcmVmc1tQQVJNX05BTUVdLT52YWx1ZSAu ICc9JyAuICR0YWcgLiAkcWF0dHM7CgkJJF9TRVJWRVJbJ1JFUVVFU1RfVVJJJ10gPSAkc3Vi cGF0aCAuICR0cnVfdGFnc19wcmVmc1tUQUdfU0VDVElPTl0tPnZhbHVlIC4gJy8/JyAuICRf U0VSVkVSWydRVUVSWV9TVFJJTkcnXTsKCQlpZiAoY291bnQoJF9QT1NUKSA+IDApIHsKCQkJ JF9QT1NUWydzZWN0aW9uJ10gPSAkdHJ1X3RhZ3NfcHJlZnNbVEFHX1NFQ1RJT05dLT52YWx1 ZTsKCQkJJF9QT1NUWyR0cnVfdGFnc19wcmVmc1tQQVJNX05BTUVdLT52YWx1ZV0gPSAkdGFn OwoJCX0gZWxzZSB7CgkJCSRfR0VUWydzZWN0aW9uJ10gPSAkdHJ1X3RhZ3NfcHJlZnNbVEFH X1NFQ1RJT05dLT52YWx1ZTsKCQkJJF9HRVRbJHRydV90YWdzX3ByZWZzW1BBUk1fTkFNRV0t PnZhbHVlXSA9ICR0YWc7CgkJfQoJfQp9CgoKZnVuY3Rpb24gdHJ1X3RhZ3NfY2xlYW5fdXJs cygpIHsKCWdsb2JhbCAkdHJ1X3RhZ3NfcHJlZnM7CglyZXR1cm4gKCdjbGVhbicgPT0gJHRy dV90YWdzX3ByZWZzW0NMRUFOX1VSTFNdLT52YWx1ZSk7Cn0KCgojIyMgQURNSU4gU0lERSBG VU5DVElPTlMgIyMjCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKCmlmIChAdHhwaW50 ZXJmYWNlID09ICdhZG1pbicpIHsKCWFkZF9wcml2cygndHJ1X3RhZ3MnLCAnMSwyJyk7Cgly ZWdpc3Rlcl90YWIoJ2V4dGVuc2lvbnMnLCAndHJ1X3RhZ3MnLCAndHJ1X3RhZ3MnKTsKCXJl Z2lzdGVyX2NhbGxiYWNrKCd0cnVfdGFnc19hZG1pbl90YWInLCAndHJ1X3RhZ3MnKTsKCglp ZiAoJHRydV90YWdzX3ByZWZzW1RBR1NfSU5fV1JJVEVfVEFCXS0+dmFsdWUpIHsKCQlyZWdp c3Rlcl9jYWxsYmFjaygndHJ1X3RhZ3NfYWRtaW5fd3JpdGVfdGFiX2hhbmRsZXInLCAnYXJ0 aWNsZScpOwoJfQp9CgoKZnVuY3Rpb24gdHJ1X3RhZ3NfYWRtaW5fdGFiKCRldmVudCwgJHN0 ZXApIHsKCXJlcXVpcmVfcHJpdnMoJ3RydV90YWdzJyk7CgoJJHJlc3VsdHMgPSB0cnVfdGFn c19hZG1pbl90YWJfaGFuZGxlX2lucHV0KCk7CgoJJGF0dHMgPSB0cnVfdGFnc19nZXRfc3Rh bmRhcmRfY2xvdWRfYXR0cyhhcnJheSgpLCBmYWxzZSwgZmFsc2UpOwoJJGFsbF90YWdzID0g dHJ1X3RhZ3NfY2xvdWRfcXVlcnkoJGF0dHMpOwoJJGNsb3VkID0gdHJ1X3RhZ3NfcmVuZGVy X2Nsb3VkKCRhdHRzLCAkYWxsX3RhZ3MsICRhbGxfdGFncyk7CgoJJHJlZGlyZWN0cyA9IHRy dV90YWdzX2xvYWRfcmVkaXJlY3RzKCk7CgoJdHJ1X3RhZ3NfYWRtaW5fdGFiX3JlbmRlcl9w YWdlKCRyZXN1bHRzLCAkY2xvdWQsICRyZWRpcmVjdHMpOwp9CgoKZnVuY3Rpb24gdHJ1X3Rh Z3NfYWRtaW5fdGFiX3JlbmRlcl9wYWdlKCRyZXN1bHRzLCAkY2xvdWQsICRyZWRpcmVjdHMp IHsKCWdsb2JhbCAkZXZlbnQ7CglwYWdldG9wKCd0cnVfdGFncycsICcnKTsKCglpbmNsdWRl KHR4cGF0aCAuICcvaW5jbHVkZS90eHBfcHJlZnMucGhwJyk7CglnbG9iYWwgJHRydV90YWdz X3ByZWZzOwoKCWVjaG8gc3RhcnRUYWJsZSgnbGF5b3V0JywgJycsICcnLCAnMTBweCcpLic8 dHI+PHRkIHJvd3NwYW49IjQiIHN0eWxlPSJib3JkZXItcmlnaHQ6MnB4IHNvbGlkIGdyYXki PicuICAjIEkga25vdywgSSBrbm93Li4uCgkJc3RhcnRUYWJsZSgnbGlzdCcsICcnLCAnJywg JycsICczMDBweCcpLgoJCQl0cihoQ2VsbChnVHh0KCdDdXJyZW50IHRhZ3MnKSkpLgoJCQl0 cih0ZCgkY2xvdWQpKS4KCQllbmRUYWJsZSgpLgoJJzwvdGQ+PHRkIHN0eWxlPSJib3JkZXIt Ym90dG9tOjJweCBzb2xpZCBncmF5O3dpZHRoOjQwMHB4Ij4nOwoKCQlpZiAoJHJlc3VsdHMp IHsKCQkJZWNobyBzdGFydFRhYmxlKCdsaXN0JywgJycsICcnLCAnJywgJzEwMCUnKS4KCQkJ CXRyKGhDZWxsKGdUeHQoJ1Jlc3VsdHMnKSkpLgoJCQkJdHIodGRhKCRyZXN1bHRzKSwgJyBz dHlsZT0iY29sb3I6cmVkIicpLgoJCQllbmRUYWJsZSgpOwoJCQllY2hvICc8L3RkPjwvdHI+ PHRyPjx0ZCBzdHlsZT0iYm9yZGVyLWJvdHRvbToycHggc29saWQgZ3JheSI+JzsKCQl9CgoK CQllY2hvIHN0YXJ0VGFibGUoJ2xpc3QnLCAnJywgJycsICcnLCAnMTAwJScpLgoJCQl0cih0 YWcoZ1R4dCgnQXJ0aWNsZSBUYWcgTWFpbnRlbmFuY2UnKS4nICgnLmdUeHQoJ0Nhc2UgU2Vu c2l0aXZlJykuJyEpJywgJ3RoJywgJyBjb2xzcGFuPSI1IicpKS4KCQkJdHIoCgkJCQlmb3Jt KAoJCQkJCXRkYShnVHh0KCdSZW5hbWUnKS4nOiAnLCAnIHN0eWxlPSJ2ZXJ0aWNhbC1hbGln bjptaWRkbGUiJykuCgkJCQkJdGQodGV4dF9pbnB1dCgnbWF0Y2h0YWcnLCAnJywgJzE1Jykp LgoJCQkJCXRkYShnVHh0KCd0bycpLic6JywgJyBzdHlsZT0idmVydGljYWwtYWxpZ246bWlk ZGxlIicpLgoJCQkJCXRkKHRleHRfaW5wdXQoJ3JlcGxhY2V0YWcnLCAnJywgJzE1JykpLgoJ CQkJCXRkKGZJbnB1dCgnc3VibWl0JywgJ3JlcGxhY2UnLCBnVHh0KCdSdW4nKSwgJ3B1Ymxp c2gnKS5lSW5wdXQoJ3RydV90YWdzJykpLAoJCQkJCScnLCAnIHZlcmlmeShcJycgLiBnVHh0 KCdhcmVfeW91X3N1cmUnKSAuICdcJykiJwoJCQkJKQoJCQkpLgoJCQl0cigKCQkJCWZvcm0o CgkJCQkJdGRhKGdUeHQoJ0RlbGV0ZScpLic6ICcsICcgc3R5bGU9InZlcnRpY2FsLWFsaWdu Om1pZGRsZSInKS4KCQkJCQl0ZCh0ZXh0X2lucHV0KCdkZWxldGV0YWcnLCAnJywgJzE1Jykp LgoJCQkJCXRkY3MoJycsIDIpLgoJCQkJCXRkKGZJbnB1dCgnc3VibWl0JywgJ2RlbGV0ZScs IGdUeHQoJ1J1bicpLCAncHVibGlzaCcpLmVJbnB1dCgndHJ1X3RhZ3MnKSksCgkJCQkJJycs ICcgdmVyaWZ5KFwnJyAuIGdUeHQoJ2FyZV95b3Vfc3VyZScpIC4gJ1wnKSInCgkJCQkpCgkJ CSkuCgkJZW5kVGFibGUoKTsKCgllY2hvICc8L3RkPjwvdHI+PHRyPjx0ZCBzdHlsZT0iYm9y ZGVyLWJvdHRvbToycHggc29saWQgZ3JheSI+JzsKCgkJZWNobyBzdGFydFRhYmxlKCdsaXN0 JywgJycsICcnLCAnJywgJzEwMCUnKS4KCQkJdHIodGFnKGdUeHQoJ1JlZGlyZWN0aW9ucycp LCAndGgnLCAnIGNvbHNwYW49IjQiJykpOwoJCQlmb3JlYWNoICgkcmVkaXJlY3RzIGFzICRs ZWZ0dGFnID0+ICRyaWdodHRhZykgewoJCQkJZWNobyB0cigKCQkJCQl0ZGEoaHJlZigkbGVm dHRhZywgdHJ1X3RhZ3NfbGlua2lmeV90YWcoJGxlZnR0YWcpKSwgJyBzdHlsZT0idGV4dC1h bGlnbjogY2VudGVyIicpLgoJCQkJCXRkYShodG1sc3BlY2lhbGNoYXJzKCc9PicpLCAnIHN0 eWxlPSJ0ZXh0LWFsaWduOiBjZW50ZXIiJykuCgkJCQkJdGRhKGhyZWYoJHJpZ2h0dGFnLCB0 cnVfdGFnc19saW5raWZ5X3RhZygkcmlnaHR0YWcpKSwgJyBzdHlsZT0idGV4dC1hbGlnbjog Y2VudGVyIicpLgoJCQkJCXRkKCc8YSBocmVmPSJpbmRleC5waHA/ZXZlbnQ9dHJ1X3RhZ3Mm YW1wO2RlbGV0ZV9yZWRpcmVjdD0nLnVybGVuY29kZSgkbGVmdHRhZykuJyIgIG9uY2xpY2s9 InJldHVybiB2ZXJpZnkoXCcnLmdUeHQoJ2FyZV95b3Vfc3VyZScpLidcJykiPkRlbGV0ZTwv YT4nKQoJCQkJKTsKCQkJfQoJCQllY2hvIHRyKAoJCQkJJzxmb3JtIG5hbWU9InJlZGlyZWN0 IiBpZD0icmVkaXJlY3QiIG1ldGhvZD0icG9zdCIgYWN0aW9uPSJpbmRleC5waHA/ZXZlbnQ9 dHJ1X3RhZ3MiIG9uc3VibWl0PSJyZXR1cm4gdmVyaWZ5KFwnJy5nVHh0KCdhcmVfeW91X3N1 cmUnKS4nXCcpIj4nLgoJCQkJCXRkYSh0ZXh0X2lucHV0KCdsZWZ0dGFnJywgJycsICcxNScp LCAnIHN0eWxlPSJ0ZXh0LWFsaWduOmNlbnRlciInKS4KCQkJCQl0ZGEoaHRtbHNwZWNpYWxj aGFycygnPT4nKSwgJyBzdHlsZT0idmVydGljYWwtYWxpZ246bWlkZGxlO3RleHQtYWxpZ246 Y2VudGVyIicpLgoJCQkJCXRkYSh0ZXh0X2lucHV0KCdyaWdodHRhZycsICcnLCAnMTUnKSwg JyBzdHlsZT0idGV4dC1hbGlnbjpjZW50ZXIiJykuCgkJCQkJdGRhKCc8YSBocmVmPSIjIiBv bmNsaWNrPSJpZiAodmVyaWZ5KFwnJy5nVHh0KCdhcmVfeW91X3N1cmUnKS4nXCcpKSBkb2N1 bWVudC5nZXRFbGVtZW50QnlJZChcJ3JlZGlyZWN0XCcpLnN1Ym1pdCgpOyByZXR1cm4gZmFs c2U7Ij5BZGQgbmV3PC9hPicsICcgc3R5bGU9InZlcnRpY2FsLWFsaWduOm1pZGRsZSInKS4K CQkJCQlmSW5wdXQoJ2hpZGRlbicsICdyZWRpcmVjdCcsICcxJykuCgkJCQknPC9mb3JtPicK CgkJCSkuCgkJZW5kVGFibGUoKTsKCgllY2hvICc8L3RkPjwvdHI+PHRyPjx0ZD4nOwoKCQll Y2hvIHN0YXJ0VGFibGUoJ2xpc3QnKS4KCQkJdHIodGFnKGdUeHQoJ1ByZWZlcmVuY2VzJyks ICd0aCcsICcgY29sc3Bhbj0iMiInKSkuCgkJCWZvcm0oCgkJCQl0cigKCQkJCQl0ZGEoZ1R4 dCgnVXNlIGNsZWFuIFVSTHMnKS4nICgnLmdUeHQoJ2RlZmF1bHQgaXMnKS4nICcuJHRydV90 YWdzX3ByZWZzW0NMRUFOX1VSTFNdLT5kZWZhdWx0X3ZhbHVlLicpOiAnLCAnIHN0eWxlPSJ2 ZXJ0aWNhbC1hbGlnbjptaWRkbGUiJykuCgkJCQkJdGQocmFkaW9fbGlzdChDTEVBTl9VUkxT LAoJCQkJCQkJYXJyYXkoJ2NsZWFuJz0+Z1R4dCgnY2xlYW4nKSwgJ21lc3N5Jz0+Z1R4dCgn bWVzc3knKSksCgkJCQkJCQkkdHJ1X3RhZ3NfcHJlZnNbQ0xFQU5fVVJMU10tPnZhbHVlKSkK CQkJCSkuCgkJCQl0cigKCQkJCQl0ZGEoZ1R4dCgnVGFnIHNlY3Rpb24gbmFtZScpLicgKGRl ZmF1bHQgaXMgIicuJHRydV90YWdzX3ByZWZzW1RBR19TRUNUSU9OXS0+ZGVmYXVsdF92YWx1 ZS4nIik6ICcsICcgc3R5bGU9InZlcnRpY2FsLWFsaWduOm1pZGRsZSInKS4KCQkJCQl0ZCh0 ZXh0X2lucHV0KFRBR19TRUNUSU9OLCAkdHJ1X3RhZ3NfcHJlZnNbVEFHX1NFQ1RJT05dLT52 YWx1ZSwgJzE1JykpCgkJCQkpLgoJCQkJdHIoCgkJCQkJdGRhKGdUeHQoJ1VSTCBwYXJhbWV0 ZXIgZm9yIHRhZyBzZWFyY2gnKS4nIChkZWZhdWx0IGlzICInLiR0cnVfdGFnc19wcmVmc1tQ QVJNX05BTUVdLT5kZWZhdWx0X3ZhbHVlLiciKTogJy4KCQkJCQkJJzxicj4oeW91IHNob3Vs ZG5cJ3QgY2hhbmdlIHRoaXMgdW5sZXNzIHlvdSByZWFsbHkga25vdyB3aGF0IHlvdSBhcmUg ZG9pbmcpJywgJyBzdHlsZT0idmVydGljYWwtYWxpZ246bWlkZGxlIicpLgoJCQkJCXRkKHRl eHRfaW5wdXQoUEFSTV9OQU1FLCAkdHJ1X3RhZ3NfcHJlZnNbUEFSTV9OQU1FXS0+dmFsdWUs ICcxNScpKQoJCQkJKS4KCQkJCXRyKAoJCQkJCXRkYShnVHh0KCdQdXQgdGFncyBpbnRvIFJT Uy9BdG9tIGZlZWRzLCBpbiAiQ2F0ZWdvcnkiIGVsZW1lbnRzJykuCgkJCQkJCSc6IDxicj4o eW91IHByb2JhYmx5IHdhbnQgdGhpcyknLCAnIHN0eWxlPSJ2ZXJ0aWNhbC1hbGlnbjptaWRk bGUiJykuCgkJCQkJdGQoeWVzbm9SYWRpbyhUQUdTX0lOX0ZFRURfQ0FURUdPUklFUywgJHRy dV90YWdzX3ByZWZzW1RBR1NfSU5fRkVFRF9DQVRFR09SSUVTXS0+dmFsdWUpKQoJCQkJKS4K CQkJCXRyKAoJCQkJCXRkYSgnQXBwZW5kIHRoZSB0YWcgbGlzdCB0byB0aGUgYm9keSBvZiBS U1MvQXRvbSBmZWVkcywgJy4KCQkJCQkJJ3dpdGggbGlua3MsIGFuZCB3aXRoIHJlbD0idGFn Ijo8YnI+SWYgdGhpcyBpcyB0dXJuZWQgb24sJy4KCQkJCQkJJ3lvdSBjYW4gZGVmaW5lIGEg Im1pc2MiIGZvcm0gbmFtZWQgdHJ1X3RhZ3NfZmVlZF90YWdzICcuCgkJCQkJCSd0aGF0IHdp bGwgYmUgdXNlZCB0byByZW5kZXIgdGhlIHRhZ3MgaW4gdGhlIGZlZWQuJywKCQkJCQkJJyBz dHlsZT0idmVydGljYWwtYWxpZ246bWlkZGxlIicpLgoJCQkJCXRkKHllc25vUmFkaW8oVEFH U19JTl9GRUVEX0JPRFksICR0cnVfdGFnc19wcmVmc1tUQUdTX0lOX0ZFRURfQk9EWV0tPnZh bHVlKSkKCQkJCSkuCgkJCQl0cigKCQkJCQl0ZGEoZ1R4dCgnU2hvdyBhIGNsaWNrYWJsZSBs aXN0IG9mIHRhZ3Mgb24gdGhlICJXcml0ZSIgcGFnZScpLic6ICcsCgkJCQkJCScgc3R5bGU9 InZlcnRpY2FsLWFsaWduOm1pZGRsZSInKS4KCQkJCQl0ZCh5ZXNub1JhZGlvKFRBR1NfSU5f V1JJVEVfVEFCLCAkdHJ1X3RhZ3NfcHJlZnNbVEFHU19JTl9XUklURV9UQUJdLT52YWx1ZSkp CgkJCQkpLgoJCQkJdHIoCgkJCQkJdGQoJycpLgoJCQkJCXRkYShmSW5wdXQoJ3N1Ym1pdCcs ICdwcmVmcycsIGdUeHQoJ1NhdmUnKSwgJ3B1Ymxpc2gnKS5lSW5wdXQoJ3RydV90YWdzJyks ICcgc3R5bGU9InRleHQtYWxpZ246cmlnaHQiJykKCQkJCSksCgkJCQknJywgJyB2ZXJpZnko XCcnIC4gZ1R4dCgnYXJlX3lvdV9zdXJlJykgLiAnXCcpIicKCQkJKS4KCQllbmRUYWJsZSgp OwoKCWVjaG8gJzwvdGQ+PC90cj4nLmVuZFRhYmxlKCk7Cn0KCgpmdW5jdGlvbiB0cnVfdGFn c19hZG1pbl90YWJfaGFuZGxlX2lucHV0KCkgewoJaWYgKGdwcygncHJlZnMnKSkgewoJCXJl dHVybiB0cnVfdGFnc19hZG1pbl91cGRhdGVfcHJlZnMoKTsKCX0gZWxzZSBpZiAoZ3BzKCdk ZWxldGUnKSkgewoJCXJldHVybiB0cnVfdGFnc19hZG1pbl9kZWxldGVfdGFnKGdwcygnZGVs ZXRldGFnJykpOwoJfSBlbHNlIGlmIChncHMoJ3JlcGxhY2UnKSkgewoJCSRyZXN1bHQgPSB0 cnVfdGFnc19hZG1pbl9yZXBsYWNlX3RhZyhncHMoJ21hdGNodGFnJyksIGdwcygncmVwbGFj ZXRhZycpLCBmYWxzZSk7CgkJcmV0dXJuICRyZXN1bHQgLiAnPGJyPicgLiB0cnVfdGFnc19h ZG1pbl9yZWRpcmVjdF90YWcoZ3BzKCdtYXRjaHRhZycpLCBncHMoJ3JlcGxhY2V0YWcnKSk7 Cgl9IGVsc2UgaWYgKGdwcygncmVkaXJlY3QnKSkgewoJCXJldHVybiB0cnVfdGFnc19hZG1p bl9yZWRpcmVjdF90YWcoZ3BzKCdsZWZ0dGFnJyksIGdwcygncmlnaHR0YWcnKSk7Cgl9IGVs c2UgaWYgKGdwcygnZGVsZXRlX3JlZGlyZWN0JykpIHsKCQlyZXR1cm4gdHJ1X3RhZ3NfYWRt aW5fZGVsZXRlX3JlZGlyZWN0KGdwcygnZGVsZXRlX3JlZGlyZWN0JykpOwoJfSBlbHNlIHsK CQlyZXR1cm4gJyc7Cgl9Cn0KCgpmdW5jdGlvbiB0cnVfdGFnc19hZG1pbl91cGRhdGVfcHJl ZnMoKSB7CglnbG9iYWwgJHRydV90YWdzX3ByZWZzOwoJJHJlc3VsdHMgPSBhcnJheSgpOwoJ Zm9yZWFjaCAoJHRydV90YWdzX3ByZWZzIGFzICRwcmVmKSB7CgkJJHZhbGlkX3ZhbHVlID0g JHByZWYtPnZhbGlkYXRlX3ZhbHVlKGdwcygkcHJlZi0+bmFtZSkpOwoJCWlmICgkdmFsaWRf dmFsdWUgJiYgJHZhbGlkX3ZhbHVlIDw+IGdwcygkcHJlZi0+bmFtZSkpIHsKCQkJcmV0dXJu ICR2YWxpZF92YWx1ZTsgICMjIyB0aGlzIGlzIGEgc25lYWt5IHdheSB0byBoYW5kbGUgdmFs aWRhdGlvbiAtIHNvcnJ5IDspCgkJfQoJCWlmICgkdmFsaWRfdmFsdWUgPD4gJHByZWYtPnZh bHVlKSB7CgkJCWlmICgkdmFsaWRfdmFsdWUgPT0gJHByZWYtPmRlZmF1bHRfdmFsdWUpIHsK CQkJCSRyZXN1bHQgPSB0cnVfdGFnc19kZWxldGVfcHJlZigkcHJlZi0+bmFtZSk7CgkJCX0g ZWxzZSB7CgkJCQkkcmVzdWx0ID0gdHJ1X3RhZ3NfdXBzZXJ0X3ByZWYoJHByZWYtPm5hbWUs ICR2YWxpZF92YWx1ZSk7CgkJCX0KCQkJaWYgKCRyZXN1bHQpIHsKCQkJCSRyZXN1bHRzW10g PSAnVXBkYXRlZCAnIC4gJHByZWYtPm5hbWU7CgkJCQkkcHJlZi0+dmFsdWUgPSAkdmFsaWRf dmFsdWU7CgkJCX0gZWxzZSB7CgkJCQkkcmVzdWx0c1tdID0gJ0Vycm9yIHVwZGF0aW5nICcg LiAkcHJlZi0+bmFtZTsKCQkJfQoJCX0KCX0KCWlmIChjb3VudCgkcmVzdWx0cykgPT0gMCkg ewoJCXJldHVybiAnTm8gcmVjb3JkcyBuZWVkIHVwZGF0aW5nJzsKCX0gZWxzZSB7CgkJcmV0 dXJuIGpvaW4oJzxicj4nLCAkcmVzdWx0cyk7Cgl9Cn0KCgpmdW5jdGlvbiB0cnVfdGFnc191 cHNlcnRfcHJlZigkbmFtZSwgJHZhbHVlKSB7CglpZiAoIXNhZmVfcXVlcnkoJ2NyZWF0ZSB0 YWJsZSBpZiBub3QgZXhpc3RzICcgLiBzYWZlX3BmeCgndHJ1X3RhZ3NfcHJlZnMnKS4KCQkn IChuYW1lIHZhcmNoYXIoMjU1KSBwcmltYXJ5IGtleSwgJy4KCQkndmFsdWUgdmFyY2hhcigy NTUpIG5vdCBudWxsKScpKSB7CgkJcmV0dXJuICdTZXJpb3VzIGVycm9yIC0gdW5hYmxlIHRv IGNyZWF0ZSB0aGUgJyAuIHNhZmVfcGZ4KCd0cnVfdGFnc19wcmVmcycpIC4gJyB0YWJsZS4n OwoJfQoKCXJldHVybiBzYWZlX3Vwc2VydCgndHJ1X3RhZ3NfcHJlZnMnLCAndmFsdWU9Iicu JHZhbHVlLiciJywgJ25hbWU9IicuJG5hbWUuJyInKTsKfQoKCmZ1bmN0aW9uIHRydV90YWdz X2RlbGV0ZV9wcmVmKCRuYW1lKSB7CglpZiAoc2FmZV9kZWxldGUoJ3RydV90YWdzX3ByZWZz JywgJ25hbWU9IicuJG5hbWUuJyInKSkgewoJCWlmIChzYWZlX2NvdW50KCd0cnVfdGFnc19w cmVmcycsICcxJykgPT0gMCAmJiAhc2FmZV9xdWVyeSgnZHJvcCB0YWJsZSAnIC4gc2FmZV9w ZngoJ3RydV90YWdzX3ByZWZzJykpKSB7CgkJCXJldHVybiBmYWxzZTsKCQl9CgkJcmV0dXJu IHRydWU7Cgl9IGVsc2UgewoJCXJldHVybiBmYWxzZTsKCX0KfQoKCmZ1bmN0aW9uIHRydV90 YWdzX2FkbWluX2RlbGV0ZV90YWcoJGRlbGV0ZXRhZykgewoJaWYgKHRyaW0oJGRlbGV0ZXRh ZykpIHsKCQlyZXR1cm4gdHJ1X3RhZ3NfYWRtaW5fcmVwbGFjZV90YWcoJGRlbGV0ZXRhZywg JycsIHRydWUpOwoJfSBlbHNlIHsKCQlyZXR1cm4gJ1BsZWFzZSBlbnRlciBhIHZhbHVlJzsK CX0KfQoKCmZ1bmN0aW9uIHRydV90YWdzX2FkbWluX3JlcGxhY2VfdGFnKCRtYXRjaHRhZywg JHJlcGxhY2V0YWcsICRhbGxvd19ibGFua19yZXBsYWNldGFnKSB7CgkkbWF0Y2h0YWcgPSB0 cmltKCRtYXRjaHRhZyk7CgkkcmVwbGFjZXRhZyA9IHRyaW0oJHJlcGxhY2V0YWcpOwoJaWYg KCRtYXRjaHRhZyAmJiAoJGFsbG93X2JsYW5rX3JlcGxhY2V0YWcgfHwgJHJlcGxhY2V0YWcp KSB7CgkJaWYgKHNhZmVfdXBkYXRlKCd0ZXh0cGF0dGVybicsIFRSVV9UQUdTX0ZJRUxELic9 dHJpbShib3RoIFwnLFwnIGZyb20gcmVwbGFjZShjb25jYXQoIiwiLCAnLlRSVV9UQUdTX0ZJ RUxELicsICIsIiksIGNvbmNhdCgiLCIsIFwnJy5hZGRzbGFzaGVzKCRtYXRjaHRhZykuJ1wn LCAiLCIpLCBcJywnLmFkZHNsYXNoZXMoJHJlcGxhY2V0YWcpLicsXCcpKScsICcxJykpIHsK CQkJcmV0dXJuICdVcGRhdGVkICcubXlzcWxfYWZmZWN0ZWRfcm93cygpLicgcm93cyAoIicu aHRtbHNwZWNpYWxjaGFycygkbWF0Y2h0YWcpLiciPT4iJy5odG1sc3BlY2lhbGNoYXJzKCRy ZXBsYWNldGFnKS4nIiknOwoJCX0gZWxzZSB7CgkJCXJldHVybiAnRXJyb3I6ICcgLiBteXNx bF9lcnJvcigpOwoJCX0KCX0gZWxzZSB7CgkJcmV0dXJuICdQbGVhc2UgZW50ZXIgYSB2YWx1 ZSBpbiBib3RoIGZpZWxkcyc7Cgl9Cn0KCgpmdW5jdGlvbiB0cnVfdGFnc19hZG1pbl9yZWRp cmVjdF90YWcoJGxlZnR0YWcsICRyaWdodHRhZykgewoJJGxlZnR0YWcgPSBhZGRzbGFzaGVz KHRydV90YWdzX3N0cnRvbG93ZXIodHJpbSgkbGVmdHRhZykpKTsKCSRyaWdodHRhZyA9IGFk ZHNsYXNoZXModHJ1X3RhZ3Nfc3RydG9sb3dlcih0cmltKCRyaWdodHRhZykpKTsKCWlmICgh JGxlZnR0YWcgfHwgISRyaWdodHRhZykgewoJCXJldHVybiAnUGxlYXNlIGVudGVyIGEgdmFs dWUgaW4gYm90aCBmaWVsZHMnOwoJfQoKCWlmICghc2FmZV9xdWVyeSgnY3JlYXRlIHRhYmxl IGlmIG5vdCBleGlzdHMgJyAuIHNhZmVfcGZ4KCd0cnVfdGFnc19yZWRpcmVjdHMnKS4KCQkn IChsZWZ0dGFnIHZhcmNoYXIoMjU1KSBwcmltYXJ5IGtleSwgJy4KCQkncmlnaHR0YWcgdmFy Y2hhcigyNTUpIG5vdCBudWxsKScpKSB7CgkJcmV0dXJuICdTZXJpb3VzIGVycm9yIC0gdW5h YmxlIHRvIGNyZWF0ZSB0aGUgJyAuIHNhZmVfcGZ4KCd0cnVfdGFnc19yZWRpcmVjdHMnKSAu ICcgdGFibGUuJzsKCX0KCglpZiAoc2FmZV9pbnNlcnQoJ3RydV90YWdzX3JlZGlyZWN0cycs ICdsZWZ0dGFnPSInLiRsZWZ0dGFnLiciLHJpZ2h0dGFnPSInLiRyaWdodHRhZy4nIicpKSB7 CgkJcmV0dXJuICdSZWRpcmVjdCBhZGRlZCAoIicuaHRtbHNwZWNpYWxjaGFycygkbGVmdHRh ZykuJyI9PiInLmh0bWxzcGVjaWFsY2hhcnMoJHJpZ2h0dGFnKS4nIikgLSBwbGVhc2UgdGVz dCBpdCEnOwoJfSBlbHNlIHsKCQlyZXR1cm4gJ0Vycm9yIGFkZGluZyByZWNvcmQgLSBkb2Vz IGl0IGFscmVhZHkgZXhpc3Q/JzsKCX0KfQoKCmZ1bmN0aW9uIHRydV90YWdzX2FkbWluX2Rl bGV0ZV9yZWRpcmVjdCgkbGVmdHRhZykgewoJaWYgKHNhZmVfZGVsZXRlKCd0cnVfdGFnc19y ZWRpcmVjdHMnLCAnbGVmdHRhZz0iJy5hZGRzbGFzaGVzKCRsZWZ0dGFnKS4nIicpKSB7CgkJ aWYgKHNhZmVfY291bnQoJ3RydV90YWdzX3JlZGlyZWN0cycsICcxJykgPT0gMCAmJiAhc2Fm ZV9xdWVyeSgnZHJvcCB0YWJsZSAnIC4gc2FmZV9wZngoJ3RydV90YWdzX3JlZGlyZWN0cycp KSkgewoJCQlyZXR1cm4gJ1JlZGlyZWN0IGRlbGV0ZWQsIGJ1dCB1bmFibGUgdG8gZHJvcCB0 YWJsZSAnIC4gc2FmZV9wZngoJ3RydV90YWdzX3JlZGlyZWN0cycpOwoJCX0KCQlyZXR1cm4g J1JlZGlyZWN0IGRlbGV0ZWQgKCInLmh0bWxzcGVjaWFsY2hhcnMoJGxlZnR0YWcpLiciKSc7 Cgl9IGVsc2UgewoJCXJldHVybiAnRXJyb3IgZGVsZXRpbmcgcmVkaXJlY3QnOwoJfQp9CgoK ZnVuY3Rpb24gdHJ1X3RhZ3NfYWRtaW5fd3JpdGVfdGFiX2hhbmRsZXIoJGV2ZW50LCAkc3Rl cCkgewoJJGNsb3VkID0gYXJyYXlfdW5pcXVlKHRydV90YWdzX2Nsb3VkX3F1ZXJ5KHRydV90 YWdzX2dldF9zdGFuZGFyZF9jbG91ZF9hdHRzKGFycmF5KCksIHRydWUsIHRydWUpKSk7Cglz b3J0KCRjbG91ZCk7CgoJJGlkID0gKGVtcHR5KCRHTE9CQUxTWydJRCddKSA/IGdwcygnSUQn KSA6ICRHTE9CQUxTWydJRCddKTsKCSRhcnRpY2xlX3RhZ3MgPSAoZW1wdHkoJGlkKSA/IGFy cmF5KCkgOiB0cnVfdGFnc19nZXRfdGFnc19mb3JfYXJ0aWNsZSgkaWQpKTsKCgkkbGlua3Mg PSBhcnJheSgpOwoJZm9yZWFjaCAoJGNsb3VkIGFzICR0YWcpIHsKCQkkc3R5bGUgPSAoaW5f YXJyYXkoJHRhZywgJGFydGljbGVfdGFncykgPyAnIGNsYXNzPSJ0YWdfY2hvc2VuIicgOiAn Jyk7CgkJJGxpbmtzW10gPSAnPGEgaHJlZj0iI2FkdmFuY2VkIicuJHN0eWxlLicgb25jbGlj az0idGhpcy5zZXRBdHRyaWJ1dGUoXFxcJ2NsYXNzXFxcJywgdG9nZ2xlVGFnKFxcXCcnLmFk ZHNsYXNoZXMoYWRkc2xhc2hlcygkdGFnKSkuJ1xcXCcpKTsgcmV0dXJuIGZhbHNlOyI+JyAu IGFkZHNsYXNoZXMoaHRtbHNwZWNpYWxjaGFycygkdGFnKSkgLiAnPFwvYT4nOwoJfQoJJHRv X2luc2VydCA9IGpvaW4oJywgJywgJGxpbmtzKTsKCSR0b19pbnNlcnQgPSAiPHN0eWxlPmEu dGFnX2Nob3NlbntiYWNrZ3JvdW5kLWNvbG9yOiAjRkVCOyBjb2xvcjogYmxhY2s7fTwvc3R5 bGU+IiAuICR0b19pbnNlcnQ7CgoJJGpzID0gPDw8RU9GCgkJdmFyIGtleXdvcmRzRmllbGQg PSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgna2V5d29yZHMnKTsKCQl2YXIgcGFyZW50ID0g a2V5d29yZHNGaWVsZC5wYXJlbnROb2RlOwoJCXBhcmVudC5hcHBlbmRDaGlsZChkb2N1bWVu dC5jcmVhdGVFbGVtZW50KCdicicpKTsKCQl2YXIgY2xvdWQgPSBkb2N1bWVudC5jcmVhdGVF bGVtZW50KCdzcGFuJyk7CgkJY2xvdWQuc2V0QXR0cmlidXRlKCdjbGFzcycsICd0cnVfdGFn c19hZG1pbl90YWdzJyk7CgkJY2xvdWQuaW5uZXJIVE1MID0gJ3skdG9faW5zZXJ0fSc7CgkJ cGFyZW50LmFwcGVuZENoaWxkKGNsb3VkKTsKCgkJZnVuY3Rpb24gdG9nZ2xlVGFnKHRhZ05h bWUpIHsKCQkJdmFyIHJlZ2V4VGFnID0gdGFnTmFtZS5yZXBsYWNlKC8oW1xcXFxcXlxcJCor W1xcXT97fS49IToofCldKS9nLCJcXFxcJDEiKTsKCQkJdmFyIHRhZ1JlZ2V4ID0gbmV3IFJl Z0V4cCgiKChefCwpXFxccyopIiArIHJlZ2V4VGFnICsgIlxcXHMqKCxcXFxzKnwkKSIpOwoJ CQl2YXIgdGV4dGFyZWEgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgna2V5d29yZHMnKTsK CQkJdmFyIGN1cnZhbCA9IHRleHRhcmVhLnZhbHVlLnJlcGxhY2UoLyw/XHMrJC8sICcnKTsK CQkJaWYgKCcnID09IGN1cnZhbCkgewoJCQkJdGV4dGFyZWEudmFsdWUgPSB0YWdOYW1lOwoJ CQl9IGVsc2UgaWYgKGN1cnZhbC5tYXRjaCh0YWdSZWdleCkpIHsKCQkJCXRleHRhcmVhLnZh bHVlID0gY3VydmFsLnJlcGxhY2UodGFnUmVnZXgsICckMScpLnJlcGxhY2UoLyw/XHMrJC8s ICcnKTsKCQkJCXJldHVybiAnJzsKCQkJfSBlbHNlIGlmICgnLCcgPT0gY3VydmFsLmNoYXJB dChjdXJ2YWwubGVuZ3RoIC0gMSkpIHsKCQkJCXRleHRhcmVhLnZhbHVlICs9ICcgJyArIHRh Z05hbWU7CgkJCX0gZWxzZSB7CgkJCQl0ZXh0YXJlYS52YWx1ZSArPSAnLCAnICsgdGFnTmFt ZTsKCQkJfQoJCQlyZXR1cm4gJ3RhZ19jaG9zZW4nOwoJCX0KRU9GOwoKCWVjaG8gc2NyaXB0 X2pzKCRqcyk7Cn0KCgojIyMgQVRPTS9SU1MgRkVFRCBGVU5DVElPTlMgIyMjCiMjIyMjIyMj IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKCnJlZ2lzdGVyX2NhbGxiYWNrKCd0cnVfdGFnc19h dG9tX2hhbmRsZXInLCAnYXRvbV9lbnRyeScpOwpmdW5jdGlvbiB0cnVfdGFnc19hdG9tX2hh bmRsZXIoJGV2ZW50LCAkc3RlcCkgeyByZXR1cm4gdHJ1X3RhZ3NfZmVlZF9oYW5kbGVyKHRy dWUpOyB9CnJlZ2lzdGVyX2NhbGxiYWNrKCd0cnVfdGFnc19yc3NfaGFuZGxlcicsICdyc3Nf ZW50cnknKTsKZnVuY3Rpb24gdHJ1X3RhZ3NfcnNzX2hhbmRsZXIoJGV2ZW50LCAkc3RlcCkg eyByZXR1cm4gdHJ1X3RhZ3NfZmVlZF9oYW5kbGVyKGZhbHNlKTsgfQoKZnVuY3Rpb24gdHJ1 X3RhZ3NfZmVlZF9oYW5kbGVyKCRhdG9tKSB7CglnbG9iYWwgJHRoaXNhcnRpY2xlLCAkdHJ1 X3RhZ3NfcHJlZnM7CglleHRyYWN0KCR0aGlzYXJ0aWNsZSk7CgoJJHRhZ3MgPSB0cnVfdGFn c19nZXRfdGFnc19mb3JfYXJ0aWNsZSgkdGhpc2lkKTsKCglpZiAoJHRydV90YWdzX3ByZWZz W1RBR1NfSU5fRkVFRF9CT0RZXS0+dmFsdWUpIHsKCQkkZXh0cmFib2R5ID0gJyc7CgkJJEZP Uk1fTkFNRSA9ICd0cnVfdGFnc19mZWVkX3RhZ3MnOwoJCWlmIChmZXRjaCgnZm9ybScsICd0 eHBfZm9ybScsICduYW1lJywgJEZPUk1fTkFNRSkpIHsKCQkJJGZvcm0gPSBmZXRjaF9mb3Jt KCRGT1JNX05BTUUpOwoJCQkkZXh0cmFib2R5ID0gdHJpbShwYXJzZSgkZm9ybSkpOwoJCX0g ZWxzZSB7CgkJCSRhdHRzID0gdHJ1X3RhZ3NfZ2V0X3N0YW5kYXJkX2Nsb3VkX2F0dHMoYXJy YXkoKSwgZmFsc2UsIHRydWUpOwoJCQkkZXh0cmFib2R5ID0gJzxwPnRhZ3M6ICcgLiB0cnVf dGFnc19yZW5kZXJfY2xvdWQoJGF0dHMsICR0YWdzLCAkdGFncykgLiAnPC9wPic7CgkJfQoJ CWdsb2JhbCAkdGhpc2FydGljbGU7CgkJaWYgKHRyaW0oJHRoaXNhcnRpY2xlWydleGNlcnB0 J10pKSB7CgkJCSR0aGlzYXJ0aWNsZVsnZXhjZXJwdCddID0gdHJpbSgkdGhpc2FydGljbGVb J2V4Y2VycHQnXSkubi4kZXh0cmFib2R5Lm47CgkJfQoJCSR0aGlzYXJ0aWNsZVsnYm9keSdd ID0gdHJpbSgkdGhpc2FydGljbGVbJ2JvZHknXSkubi4kZXh0cmFib2R5Lm47Cgl9CgoJaWYg KCR0cnVfdGFnc19wcmVmc1tUQUdTX0lOX0ZFRURfQ0FURUdPUklFU10tPnZhbHVlKSB7CgkJ JG91dHB1dCA9IGFycmF5KCk7CgkJZm9yZWFjaCAoJHRhZ3MgYXMgJHRhZykgewoJCQlpZiAo JGF0b20pIHsKCQkJCSRvdXRwdXRbXSA9ICc8Y2F0ZWdvcnkgdGVybT0iJyAuIGh0bWxzcGVj aWFsY2hhcnMoJHRhZykgLiAnIiAvPic7CgkJCX0gZWxzZSB7CgkJCQkkb3V0cHV0W10gPSAn PGNhdGVnb3J5PicgLiBodG1sc3BlY2lhbGNoYXJzKCR0YWcpIC4gJzwvY2F0ZWdvcnk+JzsK CQkJfQoJCX0KCQlyZXR1cm4gbi5qb2luKG4sICRvdXRwdXQpLm47Cgl9Cn0KCgojIyMgUFJF RlMgRlVOQ1RJT05TIC8gQ0xBU1NFUyAjIyMKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj IyMjIyMjCgpjbGFzcyB0cnVfdGFnc19wcmVmIHsKCWZ1bmN0aW9uIHRydV90YWdzX3ByZWYo JG5hbWUsICRkZWZhdWx0X3ZhbHVlLCAkdHlwZSkgewoJCSR0aGlzLT5uYW1lID0gJG5hbWU7 CgkJJHRoaXMtPnZhbHVlID0gJGRlZmF1bHRfdmFsdWU7CgkJJHRoaXMtPmRlZmF1bHRfdmFs dWUgPSAkZGVmYXVsdF92YWx1ZTsKCQkkdGhpcy0+dHlwZSA9ICR0eXBlOwoJfQoKCWZ1bmN0 aW9uIHZhbGlkYXRlX3ZhbHVlKCR2YWx1ZSkgewoJCWlmICgkdmFsdWUpIHsKCQkJcmV0dXJu ICR2YWx1ZTsKCQl9IGVsc2UgaWYgKCR0aGlzLT50eXBlID09ICdib29sZWFuJykgewoJCQly ZXR1cm4gJzAnOwoJCX0gZWxzZSB7CgkJCXJldHVybiAnUGxlYXNlIGVudGVyIGEgdmFsdWUg Zm9yICcgLiAkdGhpcy0+bmFtZTsKCQl9Cgl9Cn0KCmZ1bmN0aW9uIHRydV90YWdzX2xvYWRf cHJlZnMoKSB7CgkkcHJlZnMgPSBhcnJheSgpOwoKCWdsb2JhbCAkcGVybWxpbmtfbW9kZTsK CSRwcmVmc1tDTEVBTl9VUkxTXSA9IG5ldyB0cnVfdGFnc19wcmVmKENMRUFOX1VSTFMsICgk cGVybWxpbmtfbW9kZSAhPSAnbWVzc3knID8gJ2NsZWFuJyA6ICdtZXNzeScpLCAnc3RyaW5n Jyk7CgkkcHJlZnNbVEFHX1NFQ1RJT05dID0gbmV3IHRydV90YWdzX3ByZWYoVEFHX1NFQ1RJ T04sICd0YWcnLCAnc3RyaW5nJyk7CgkkcHJlZnNbUEFSTV9OQU1FXSA9IG5ldyB0cnVfdGFn c19wcmVmKFBBUk1fTkFNRSwgJ3QnLCAnc3RyaW5nJyk7CgkkcHJlZnNbVEFHU19JTl9GRUVE X0NBVEVHT1JJRVNdID0gbmV3IHRydV90YWdzX3ByZWYoVEFHU19JTl9GRUVEX0NBVEVHT1JJ RVMsICcxJywgJ2Jvb2xlYW4nKTsKCSRwcmVmc1tUQUdTX0lOX0ZFRURfQk9EWV0gPSBuZXcg dHJ1X3RhZ3NfcHJlZihUQUdTX0lOX0ZFRURfQk9EWSwgJzAnLCAnYm9vbGVhbicpOwoJJHBy ZWZzW1RBR1NfSU5fV1JJVEVfVEFCXSA9IG5ldyB0cnVfdGFnc19wcmVmKFRBR1NfSU5fV1JJ VEVfVEFCLCAnMScsICdib29sZWFuJyk7CgoJaWYgKG15c3FsX3F1ZXJ5KCJkZXNjcmliZSAi IC4gUEZYIC4gInRydV90YWdzX3ByZWZzIikpIHsKCQkkcnMgPSBzYWZlX3Jvd3MoJyonLCAn dHJ1X3RhZ3NfcHJlZnMnLCAnMScpOwoJCWZvcmVhY2ggKCRycyBhcyAkcm93KSB7CgkJCSRw cmVmc1skcm93WyduYW1lJ11dLT52YWx1ZSA9ICRyb3dbJ3ZhbHVlJ107CgkJfQoJfQoKCXJl dHVybiAkcHJlZnM7Cn0KCgojIyMgT1RIRVIgU1VQUE9SVCBGVU5DVElPTlMgIyMjCiMjIyMj IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKCmZ1bmN0aW9uIHRydV90YWdzX3JlZGlyZWN0 X2lmX25lZWRlZCgkdGFnX3BhcmFtZXRlcikgewoJJHJlZGlyZWN0cyA9IHRydV90YWdzX2xv YWRfcmVkaXJlY3RzKCk7Cglmb3JlYWNoICgkcmVkaXJlY3RzIGFzICRsZWZ0dGFnID0+ICRy aWdodHRhZykgewoJCWlmICgkbGVmdHRhZyA9PSAkdGFnX3BhcmFtZXRlciB8fCAkbGVmdHRh ZyA9PSBzdHJfcmVwbGFjZSgnLScsICcgJywgJHRhZ19wYXJhbWV0ZXIpKSB7CgkJCXRydV90 YWdzX3JlZGlyZWN0KCRyaWdodHRhZywgZmFsc2UpOwoJCQlyZXR1cm4gdHJ1ZTsKCQl9Cgl9 CgoJcmV0dXJuIGZhbHNlOwp9CgoKZnVuY3Rpb24gdHJ1X3RhZ3NfbG9hZF9yZWRpcmVjdHMo KSB7CgkkcmVkaXJlY3RzID0gYXJyYXkoKTsKCWlmIChteXNxbF9xdWVyeSgiZGVzY3JpYmUg IiAuIFBGWCAuICJ0cnVfdGFnc19yZWRpcmVjdHMiKSkgewoJCSRycyA9IHNhZmVfcm93cygn KicsICd0cnVfdGFnc19yZWRpcmVjdHMnLCAnMSBvcmRlciBieSBsZWZ0dGFnJyk7CgkJZm9y ZWFjaCAoJHJzIGFzICRyb3cpIHsKCQkJJHJlZGlyZWN0c1skcm93WydsZWZ0dGFnJ11dID0g JHJvd1sncmlnaHR0YWcnXTsKCQl9Cgl9CglyZXR1cm4gJHJlZGlyZWN0czsKfQoKCmZ1bmN0 aW9uIHRydV90YWdzX3JlZGlyZWN0KCRkZXN0aW5hdGlvbiwgJGlzX2Z1bGxfdXJsKSB7Cgln bG9iYWwgJHRydV90YWdzX3ByZWZzOwoJaWYgKCRpc19mdWxsX3VybCkgewoJCSR1cmwgPSAk ZGVzdGluYXRpb247CgkJJG1lc3NhZ2UgPSAnVGhlIHJlc291cmNlIHlvdSByZXF1ZXN0ZWQg aGFzIG1vdmVkIHRvICcgLiAkZGVzdGluYXRpb247Cgl9IGVsc2UgewoJCSR1cmwgPSB0cnVf dGFnc19saW5raWZ5X3RhZygkZGVzdGluYXRpb24pOwoJCSRtZXNzYWdlID0gJ1RoZSByZXF1 ZXN0ZWQgdGFnIGhhcyBiZWVuIHJlcGxhY2VkIGJ5ICcgLiAkZGVzdGluYXRpb247Cgl9CgoJ aGVhZGVyKCdMb2NhdGlvbjogJyAuICR1cmwpOwoJdHhwX2RpZSgkbWVzc2FnZSwgJzMwMScp Owp9CgoKZnVuY3Rpb24gdHJ1X3RhZ3NfbGlua2lmeV90YWcoJHRhZykgewoJZ2xvYmFsICR0 cnVfdGFnc19wcmVmczsKCWlmICh0cnVfdGFnc19jbGVhbl91cmxzKCkpIHsKCQkkdXJscHJl Zml4ID0gaHUgLiAkdHJ1X3RhZ3NfcHJlZnNbVEFHX1NFQ1RJT05dLT52YWx1ZSAuICcvJzsK CX0gZWxzZSB7CgkJJHVybHByZWZpeCA9IGh1IC4gJz9zPScgLiAkdHJ1X3RhZ3NfcHJlZnNb VEFHX1NFQ1RJT05dLT52YWx1ZSAuICcmYW1wOycgLiAkdHJ1X3RhZ3NfcHJlZnNbUEFSTV9O QU1FXS0+dmFsdWUgLiAnPSc7Cgl9CgkkdXJsc3VmZml4ID0gKHRydV90YWdzX2NsZWFuX3Vy bHMoKSA/ICcvJyA6ICcnKTsKCXJldHVybiAkdXJscHJlZml4IC4gdXJsZW5jb2RlKHN0cl9y ZXBsYWNlKCcgJywgJy0nLCAkdGFnKSkgLiAkdXJsc3VmZml4Owp9CgoKZnVuY3Rpb24gdHJ1 X3RhZ3NfZ2V0X3RhZ3NfZm9yX2FydGljbGUoJGFydGljbGVJRCkgewoJJHRhZ3NfZmllbGQg PSBUUlVfVEFHU19GSUVMRDsKCSRycyA9IHNhZmVfcm93KCR0YWdzX2ZpZWxkLCAidGV4dHBh dHRlcm4iLCAiSUQ9JyRhcnRpY2xlSUQnIEFORCAkdGFnc19maWVsZCA8PiAnJyIpOwoJJGFs bF90YWdzID0gYXJyYXkoKTsKCWlmIChhcnJheV9rZXlfZXhpc3RzKCR0YWdzX2ZpZWxkLCAk cnMpKSB7CgkJJGFsbF90YWdzID0gZXhwbG9kZSgiLCIsIHRyaW0odHJ1X3RhZ3Nfc3RydG9s b3dlcigkcnNbJHRhZ3NfZmllbGRdKSkpOwoJfQoKCXJldHVybiB0cnVfdGFnc190cmltX3Rh Z3MoJGFsbF90YWdzKTsKfQoKCiMgZml4ZXMgYnVnIHdpdGggNC4wLjQncyB2ZXJzaW9uIG9m IGRvV3JhcCB0aGF0IGNhdXNlZCBzcGFjZXMgdG8gc2hvdyB1cCBiZWZvcmUgdGhlIGNvbW1h cwpmdW5jdGlvbiB0cnVfdGFnc19kb193cmFwKCRsaXN0LCAkd3JhcHRhZywgJGJyZWFrLCAk Y2xhc3MsICRicmVha2NsYXNzKSB7CglpZiAoISR3cmFwdGFnICYmICFwcmVnX21hdGNoKCcv Xlx3KyQvJywgJGJyZWFrKSkgewoJCXJldHVybiBqb2luKCRicmVhay5uLCAkbGlzdCk7Cgl9 IGVsc2UgewoJCXJldHVybiBkb1dyYXAoJGxpc3QsICR3cmFwdGFnLCAkYnJlYWssICRjbGFz cywgJGJyZWFrY2xhc3MpOwoJfQp9CgoKZnVuY3Rpb24gdHJ1X3RhZ3NfdHJpbV90YWdzKCR0 YWdfYXJyYXkpIHsKCSR0cmltbWVkID0gYXJyYXkoKTsKCWZvcmVhY2ggKCR0YWdfYXJyYXkg YXMgJHRhZykgewoJCWlmICgiIiAhPSB0cmltKCR0YWcpKSB7CgkJCSR0cmltbWVkW10gPSB0 cmltKCR0YWcpOwoJCX0KCX0KCXJldHVybiAkdHJpbW1lZDsKfQoKCmZ1bmN0aW9uIHRydV90 YWdzX2ZpeHVwX3F1ZXJ5X2F0dHMoJGF0dHMsICR0YWdfcGFyYW1ldGVyKSB7Cgkka2V5d29y ZHMgPSBleHBsb2RlKCcsJywgJHRhZ19wYXJhbWV0ZXIpOwoJZm9yZWFjaCAoJGtleXdvcmRz IGFzICRrZXl3b3JkKSB7CgkJaWYgKHN0cnBvcygka2V5d29yZCwgJy0nKSAhPT0gZmFsc2Up IHsKCQkJJGtleXdvcmRzW10gPSBzdHJfcmVwbGFjZSgnLScsICcgJywgJGtleXdvcmQpOwoJ CX0KCX0KCSRhdHRzWydrZXl3b3JkcyddID0gaW1wbG9kZSgnLCcsICRrZXl3b3Jkcyk7CgoJ aWYgKGlzc2V0KCRhdHRzWydzZWN0aW9uJ10pICYmIHN0cnBvcygkYXR0c1snc2VjdGlvbidd LCAnLCcpICE9PSBmYWxzZSkgewoJCSRhdHRzWydzZWN0aW9uJ10gPSAnJzsKCX0KCglpZiAo aXNzZXQoJGF0dHNbJ2V4Y2x1ZGVzZWN0aW9uJ10pKSB7CgkJdW5zZXQoJGF0dHNbJ2V4Y2x1 ZGVzZWN0aW9uJ10pOwoJfQoKCWlmIChpc3NldCgkYXR0c1snbm9hcnRpY2xlcyddKSkgewoJ CXVuc2V0KCRhdHRzWydub2FydGljbGVzJ10pOwoJfQoKCWlmICghaXNzZXQoJGF0dHNbJ2xp bWl0J10pKSB7CgkJJGF0dHNbJ2xpbWl0J10gPSAnMTAwMCc7Cgl9CgoJaWYgKCFpc3NldCgk YXR0c1snYWxsb3dvdmVycmlkZSddKSkgewoJCSRhdHRzWydhbGxvd292ZXJyaWRlJ10gPSB0 cnVlOwoJfQoKCXJldHVybiAkYXR0czsKfQoKCmZ1bmN0aW9uIHRydV90YWdzX3N0cnRvbG93 ZXIoJHN0cikgewoJaWYgKGZ1bmN0aW9uX2V4aXN0cygibWJfc3RydG9sb3dlciIpKSB7CgkJ cmV0dXJuIG1iX3N0cnRvbG93ZXIoJHN0ciwgIlVURi04Iik7Cgl9IGVsc2UgewoJCXJldHVy biBzdHJ0b2xvd2VyKCRzdHIpOwoJfQp9CgoKLy90aGVzZSBuZXh0IHR3byBmdW5jdGlvbnMg YXJlIGdyb3NzLCBidXQgSSBjYW4ndCBmaWd1cmUgb3V0IGFub3RoZXIgd2F5IHRvIGRvIGl0 CmZ1bmN0aW9uIHRydV90YWdzX3NvcnRfdGFncygkdGFnc193ZWlnaHQsICRzb3J0X2J5X2Nv dW50LCAkc29ydF9hc2NlbmRpbmcpIHsKCWdsb2JhbCAkdHJ1X3RhZ3NfdGFnc193ZWlnaHQs ICR0cnVfdGFnc19zb3J0X2J5X2NvdW50LCAkdHJ1X3RhZ3Nfc29ydF9hc2NlbmRpbmc7CgoJ JHRydV90YWdzX3RhZ3Nfd2VpZ2h0ID0gJHRhZ3Nfd2VpZ2h0OwoJJHRydV90YWdzX3NvcnRf YnlfY291bnQgPSAkc29ydF9ieV9jb3VudDsKCSR0cnVfdGFnc19zb3J0X2FzY2VuZGluZyA9 ICRzb3J0X2FzY2VuZGluZzsKCgkkdGVtcF9hcnJheSA9IGFycmF5X2tleXMoJHRhZ3Nfd2Vp Z2h0KTsKCXVzb3J0KCR0ZW1wX2FycmF5LCAidHJ1X3RhZ3Nfc29ydF90YWdzX2NvbXBhcmF0 b3IiKTsKCgkkc29ydGVkX2FycmF5ID0gYXJyYXkoKTsKCWZvcmVhY2ggKCR0ZW1wX2FycmF5 IGFzICR0YWcpIHsKCQkkc29ydGVkX2FycmF5WyR0YWddID0gJHRhZ3Nfd2VpZ2h0WyR0YWdd OwoJfQoKCXJldHVybiAkc29ydGVkX2FycmF5Owp9CgoKZnVuY3Rpb24gdHJ1X3RhZ3Nfc29y dF90YWdzX2NvbXBhcmF0b3IoJGxlZnQsICRyaWdodCkgewoJZ2xvYmFsICR0cnVfdGFnc190 YWdzX3dlaWdodCwgJHRydV90YWdzX3NvcnRfYnlfY291bnQsICR0cnVfdGFnc19zb3J0X2Fz Y2VuZGluZzsKCglpZiAoJHRydV90YWdzX3NvcnRfYnlfY291bnQpIHsKCQkkbGVmdF93ZWln aHQgPSAkdHJ1X3RhZ3NfdGFnc193ZWlnaHRbJGxlZnRdOwoJCSRyaWdodF93ZWlnaHQgPSAk dHJ1X3RhZ3NfdGFnc193ZWlnaHRbJHJpZ2h0XTsKCQlpZiAoJGxlZnRfd2VpZ2h0ID09ICRy aWdodF93ZWlnaHQpIHsKCQkJcmV0dXJuIHN0cm5hdGNhc2VjbXAoJGxlZnQsICRyaWdodCk7 CgkJfSBlbHNlIGlmICgkdHJ1X3RhZ3Nfc29ydF9hc2NlbmRpbmcpIHsKCQkJcmV0dXJuICRs ZWZ0X3dlaWdodCAtICRyaWdodF93ZWlnaHQ7CgkJfSBlbHNlIHsKCQkJcmV0dXJuICRyaWdo dF93ZWlnaHQgLSAkbGVmdF93ZWlnaHQ7CgkJfQoJfSBlbHNlIHsKCQlyZXR1cm4gc3RybmF0 Y2FzZWNtcCgkbGVmdCwgJHJpZ2h0KTsKCX0KfQoKCgojIyMgQkFTVEFSRCBGVU5DVElPTlMg VEhBVCBTSE9VTEROJ1QgSEFWRSBUTyBFWElTVCAjIyMKIyMjIyMjIyMjIyMjIyMjIyMjIyMj IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgoKZnVuY3Rpb24gdHJ1X3RhZ3Nf cmVkb19hcnRpY2xlX3NlYXJjaCgkYXR0cykgewoJJHRoZUF0dHMgPSBsQXR0cyhhcnJheSgn bGltaXQnICAgICA9PiAxMDAwLAoJCQkJJ2NhdGVnb3J5JyAgPT4gJycsCgkJCQknc2VjdGlv bicgICA9PiAnJywKCQkJCSdleGNlcnB0ZWQnID0+ICcnLAoJCQkJJ2F1dGhvcicgICAgPT4g JycsCgkJCQknc29ydGJ5JyAgICA9PiAnUG9zdGVkJywKCQkJCSdzb3J0ZGlyJyAgID0+ICdk ZXNjJywKCQkJCSdtb250aCcgICAgID0+ICcnLAoJCQkJJ2tleXdvcmRzJyAgPT4gJycsCgkJ CQknZnJvbnRwYWdlJyA9PiAnJywKCQkJCSdpZCcgICAgICAgID0+ICcnLAoJCQkJJ3RpbWUn ICAgICAgPT4gJ3Bhc3QnLAoJCQkJJ3N0YXR1cycgICAgPT4gJzQnLAoJCQkJJ29mZnNldCcg ICAgPT4gMAoJCQkpLCRhdHRzLCAwKTsKCWV4dHJhY3QoJHRoZUF0dHMpOwoKCS8vQnVpbGRp bmcgcXVlcnkgcGFydHMKCSRmcm9udHBhZ2UgPSAoJGZyb250cGFnZSkgPyBmaWx0ZXJGcm9u dFBhZ2UoKSA6ICcnOwoJJGNhdGVnb3J5ICA9ICghJGNhdGVnb3J5KSAgPyAnJyA6ICIgYW5k ICgoQ2F0ZWdvcnkxPSciLmRvc2xhc2goJGNhdGVnb3J5KS4iJykgb3IgKENhdGVnb3J5Mj0n Ii5kb1NsYXNoKCRjYXRlZ29yeSkuIicpKSAiOwoJJHNlY3Rpb24gICA9ICghJHNlY3Rpb24p ICAgPyAnJyA6ICIgYW5kIFNlY3Rpb24gPSAnIi5kb3NsYXNoKCRzZWN0aW9uKS4iJyI7Cgkk ZXhjZXJwdGVkID0gKCRleGNlcnB0ZWQ9PSd5JykgID8gIiBhbmQgRXhjZXJwdCAhPScnIiA6 ICcnOwoJJGF1dGhvciAgICA9ICghJGF1dGhvcikgICAgPyAnJyA6ICIgYW5kIEF1dGhvcklE ID0gJyIuZG9zbGFzaCgkYXV0aG9yKS4iJyI7CgkkbW9udGggICAgID0gKCEkbW9udGgpICAg ICA/ICcnIDogIiBhbmQgUG9zdGVkIGxpa2UgJyIuZG9TbGFzaCgkbW9udGgpLiIlJyI7Cgkk aWQgICAgICAgID0gKCEkaWQpICAgICAgICA/ICcnIDogIiBhbmQgSUQgPSAnIi5pbnR2YWwo JGlkKS4iJyI7Cglzd2l0Y2ggKCR0aW1lKSB7CgkJY2FzZSAnYW55JzoKCQkJJHRpbWUgPSAi IjsgYnJlYWs7CgkJY2FzZSAnZnV0dXJlJzoKCQkJJHRpbWUgPSAiIGFuZCBQb3N0ZWQgPiBu b3coKSI7IGJyZWFrOwoJCWRlZmF1bHQ6CgkJCSR0aW1lID0gIiBhbmQgUG9zdGVkIDwgbm93 KCkiOwoJfQoJaWYgKCFpc19udW1lcmljKCRzdGF0dXMpKQoJCSRzdGF0dXMgPSBnZXRTdGF0 dXNOdW0oJHN0YXR1cyk7CgoJJGN1c3RvbSA9ICcnOwoJLy8gdHJ5aW5nIGN1c3RvbSBmaWVs ZHMgaGVyZQoJJGN1c3RvbUZpZWxkcyA9IGdldEN1c3RvbUZpZWxkcygpOwoJaWYgKCRjdXN0 b21GaWVsZHMpIHsKCQlmb3JlYWNoKCRjdXN0b21GaWVsZHMgYXMgJGNGaWVsZCkgewoJCQlp ZiAoaXNzZXQoJGF0dHNbJGNGaWVsZF0pKQoJCQkJJGN1c3RvbVBhaXJzWyRjRmllbGRdID0g JGF0dHNbJGNGaWVsZF07CgkJfQoJCWlmKCFlbXB0eSgkY3VzdG9tUGFpcnMpKQoJCQkkY3Vz dG9tID0gIGJ1aWxkQ3VzdG9tU3FsKCRjdXN0b21GaWVsZHMsJGN1c3RvbVBhaXJzKTsKCQll bHNlCgkJCSRjdXN0b20gPSAnJzsKCX0KCgkvL0FsbG93IGtleXdvcmRzIGZvciBuby1jdXN0 b20gYXJ0aWNsZXMuIFRoYXQgdGFnZ2luZyBtb2RlLCB5b3Uga25vdwoJaWYgKCRrZXl3b3Jk cykgewoJCSRrZXlzID0gZG9TbGFzaChhcnJheV9tYXAoJ3RyaW0nLCBzcGxpdCgnLCcsICRr ZXl3b3JkcykpKTsKCQlmb3JlYWNoICgka2V5cyBhcyAka2V5KSB7CgkJCSRrZXlwYXJ0c1td ID0gIkZJTkRfSU5fU0VUKCciLiRrZXkuIicsS2V5d29yZHMpIjsKCQl9CgkJJGtleXdvcmRz ID0gIiBhbmQgKCIgLiBqb2luKCcgb3IgJywka2V5cGFydHMpIC4gIikiOwoJfQoKCWlmICgk aWQpCgkJJHN0YXR1c3EgPSAiIGFuZCBTdGF0dXMgPj0gJzQnIjsKCWVsc2UKCQkkc3RhdHVz cSA9ICIgYW5kIFN0YXR1cz0nIi5kb1NsYXNoKCRzdGF0dXMpLiInIjsKCgkkd2hlcmUgPSAi MSIgLiAkc3RhdHVzcS4gJHRpbWUuCgkJJGlkIC4gJGNhdGVnb3J5IC4gJHNlY3Rpb24gLiAk ZXhjZXJwdGVkIC4gJG1vbnRoIC4gJGF1dGhvciAuICRrZXl3b3JkcyAuICRjdXN0b20gLiAk ZnJvbnRwYWdlOwoKCQkkcGdvZmZzZXQgPSAkb2Zmc2V0IC4gJywgJzsKCgkkcnMgPSBzYWZl X3Jvd3Nfc3RhcnQoIiosIHVuaXhfdGltZXN0YW1wKFBvc3RlZCkgYXMgdVBvc3RlZCIsICd0 ZXh0cGF0dGVybicsCgkJJHdoZXJlLiAnIG9yZGVyIGJ5ICcgLiBkb3NsYXNoKCRzb3J0Ynkp IC4gJyAnIC4gZG9TbGFzaCgkc29ydGRpcikgLiAnIGxpbWl0ICcgLiBkb1NsYXNoKCRsaW1p dCkpOwoKCXJldHVybiAkcnM7Cn0KCgoiO3M6NDoidHlwZSI7czoxOiIxIjtzOjU6Im9yZGVy IjtzOjE6IjUiO3M6NDoiaGVscCI7czo2Mjc6IjxwPlRvIGxlYXJuIG1vcmUgYWJvdXQgdHJ1 X3RhZ3MsIGNoZWNrIG91dCB0aGUgPGEgaHJlZj0iL2Jsb2cvNDkzL3RydXRhZ3MtYS10YWdn aW5nLXBsdWdpbi1mb3ItdGV4dHBhdHRlcm4iIHJlbD0ibm9mb2xsb3ciPmludHJvZHVjdG9y eSBhcnRpY2xlPC9hPiwgPGEgaHJlZj0iaHR0cDovL3d3dy50cnVpc3QuY29tL3JlZmVyZW5j ZS81MzcvdHJ1X3RhZ3MtcmVsZWFzZXMiIHJlbD0ibm9mb2xsb3ciPnJlbGVhc2VzIHBhZ2U8 L2E+LCA8YSBocmVmPSJodHRwOi8vd3d3LnRydWlzdC5jb20vcmVmZXJlbmNlLzQ5NS90cnV0 YWdzLWZlYXR1cmUtbGlzdCIgcmVsPSJub2ZvbGxvdyI+ZmVhdHVyZSBsaXN0PC9hPiwgYW5k IDxhIGhyZWY9Imh0dHA6Ly93d3cudHJ1aXN0LmNvbS9yZWZlcmVuY2UvNDk3L3RydXRhZ3Mt dXNhZ2UtaW5zdHJ1Y3Rpb25zIiByZWw9Im5vZm9sbG93Ij51c2FnZSBpbnN0cnVjdGlvbnM8 L2E+LjwvcD4KCgk8cD5JJiM4MjE3O3ZlIHRha2VuIHRoZSBkZXRhaWxlZCBoZWxwIG91dCBv ZiB0aGUgcGx1Z2luOyBteSBhcG9sb2dpZXMuICBJdCB3YXMgdG9vIGJpZyBhbmQgdG9vIGRp ZmZpY3VsdCB0byBrZWVwIG1haW50YWluaW5nIG9uIG15IHNpdGUgYW5kIGluIHRoZSBwbHVn aW4uPC9wPiI7czozOiJtZDUiO3M6MzI6IjIwMDNmMmM4NjhiNzRjN2U5NjllMDE3MDdiMTgz MGFmIjt9