# tru_tags v2.0 # Tagging support for Textpattern # Nathan Arthur # http://www.rainskit.com/ # ...................................................................... # This is a plugin for Textpattern - http://textpattern.com/ # To install: textpattern > admin > plugins # Paste the following text into the 'Install plugin' box: # ...................................................................... YToxMTp7czoxNToiYWxsb3dfaHRtbF9oZWxwIjtpOjA7czo3OiJ2ZXJzaW9uIjtzOjM6IjIu MCI7czo2OiJhdXRob3IiO3M6MTM6Ik5hdGhhbiBBcnRodXIiO3M6MTA6ImF1dGhvcl91cmki O3M6MjI6Imh0dHA6Ly93d3cudHJ1aXN0LmNvbS8iO3M6MTE6ImRlc2NyaXB0aW9uIjtzOjMx OiJUYWdnaW5nIHN1cHBvcnQgZm9yIFRleHRwYXR0ZXJuIjtzOjQ6InR5cGUiO2k6MTtzOjQ6 Im5hbWUiO3M6ODoidHJ1X3RhZ3MiO3M6NDoiaGVscCI7czo1Njg6Igk8cD5UbyBsZWFybiBt b3JlIGFib3V0IHRydV90YWdzLCBjaGVjayBvdXQgdGhlIDxhIGhyZWY9Ii9ibG9nLzQ5My90 cnV0YWdzLWEtdGFnZ2luZy1wbHVnaW4tZm9yLXRleHRwYXR0ZXJuIj5pbnRyb2R1Y3Rvcnkg YXJ0aWNsZTwvYT4sIDxhIGhyZWY9Imh0dHA6Ly93d3cudHJ1aXN0LmNvbS9yZWZlcmVuY2Uv NTM3L3RydV90YWdzLXJlbGVhc2VzIj5yZWxlYXNlcyBwYWdlPC9hPiwgPGEgaHJlZj0iaHR0 cDovL3d3dy50cnVpc3QuY29tL3JlZmVyZW5jZS80OTUvdHJ1dGFncy1mZWF0dXJlLWxpc3Qi PmZlYXR1cmUgbGlzdDwvYT4sIGFuZCA8YSBocmVmPSJodHRwOi8vd3d3LnRydWlzdC5jb20v cmVmZXJlbmNlLzQ5Ny90cnV0YWdzLXVzYWdlLWluc3RydWN0aW9ucyI+dXNhZ2UgaW5zdHJ1 Y3Rpb25zPC9hPi48L3A+CgoJPHA+SSYjODIxNzt2ZSB0YWtlbiB0aGUgZGV0YWlsZWQgaGVs cCBvdXQgb2YgdGhlIHBsdWdpbjsgbXkgYXBvbG9naWVzLiAgSXQgd2FzIHRvbyBiaWcgYW5k IHRvbyBkaWZmaWN1bHQgdG8ga2VlcCBtYWludGFpbmluZyBvbiBteSBzaXRlIGFuZCBpbiB0 aGUgcGx1Z2luLjwvcD4iO3M6NDoiY29kZSI7czoxODUxMzoiCiNDb3B5cmlnaHQgMjAwNyBO YXRoYW4gQXJ0aHVyCiNSZWxlYXNlZCB1bmRlciB0aGUgR05VIFB1YmxpYyBMaWNlbnNlLCBz ZWUgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9ncGwtbGljZW5zZS5waHAg Zm9yIGRldGFpbHMKI1RoaXMgd29yayBpcyBpbnNwaXJlZCBieSByYW5fdGFncyBieSBSYW4g QXJvdXNzaSwgb3JpZ2luYWxseSBmb3VuZCBhdCBodHRwOi8vYXJvdXNzaS5jb20vYXJ0aWNs ZS80NS90YWdnaW5nLXRleHRwYXR0ZXJuCgoKIyMjIENPTkZJR1VSQVRJT04gIyMjCiMjIyMj IyMjIyMjIyMjIyMjIyMjIwoKI1NlZSBodHRwOi8vd3d3LnRydWlzdC5jb20vcmVmZXJlbmNl LzQ5Ny90cnV0YWdzLXVzYWdlLWluc3RydWN0aW9ucyBmb3IgaW5zdHJ1Y3Rpb25zCgojIFN3 aXRjaCB0aGlzIHRvICcxJyB0byBnZXQgY2xlYW4gdXJsIHN1cHBvcnQKZGVmaW5lKCdUUlVf VEFHU19VU0VfQ0xFQU5fVVJMUycsIDApOwoKIyBUaGlzIHRlbGxzIHRydV90YWdzIHdoaWNo IHNlY3Rpb24gdG8gdXNlIGZvciB0YWdzLgpkZWZpbmUoJ1RSVV9UQUdTX1NFQ1RJT04nLCAn dGFnJyk7CgojIFRoaXMgdGVsbHMgdHJ1X3RhZ3Mgd2hhdCBhdHRyaWJ1dGUgbmFtZSB0byB1 c2UgZm9yIHRhZyBzZWFyY2hlcy4KZGVmaW5lKCdUUlVfVEFHU19UQUdfUEFSQU1FVEVSX05B TUUnLCAndCcpOwoKIyBUaGlzIHRlbGxzIHRydV90YWdzIHRvIHB1dCB0YWdzIGludG8gdGhl IFJTUyBhbmQgQXRvbSBmZWVkcywgaW4gJ0NhdGVnb3J5JyBlbGVtZW50cy4KIyBZb3UgcHJv YmFibHkgd2FudCB0aGlzLgpkZWZpbmUoJ1RSVV9UQUdTX0FERF9UQUdTX1RPX0ZFRURfWE1M JywgMSk7CgojIEJ5IGRlZmF1bHQsIHRoaXMgd2lsbCBhcHBlbmQgYSB0YWcgbGlzdCBsaWtl ICJ0YWdzOiB0cmVlcywgZmxvd2VycywgYW5pbWFscywgZXRjIgojICh3aXRoIGxpbmtzLCBh bmQgd2l0aCByZWw9InRhZyIpIHRvIHRoZSBib2R5IG9mIFJTUy9BdG9tIGZlZWRzLiBJZiB5 b3UgZGVmaW5lIGEKIyAnbWlzYycgZm9ybSBuYW1lZCB0cnVfdGFnc19mZWVkX3RhZ3MsIHRy dV90YWdzIHdpbGwgdXNlIHRoYXQgZm9ybSB0byByZW5kZXIgdGhlIHRhZ3MKIyBmb3IgdGhl IGZlZWQsIGluc3RlYWQuCmRlZmluZSgnVFJVX1RBR1NfQUREX1RBR1NfVE9fRkVFRF9CT0RZ JywgMCk7CgojIFRoaXMgc2hvd3MgYSBsaXN0IG9mIGNsaWNrYWJsZSB0YWdzIGluIHRoZSBh ZG1pbiBzaWRlIG9uIHRoZSAnV3JpdGUnIHBhZ2UKZGVmaW5lKCdUUlVfVEFHU19TSE9XX1RB R1NfSU5fQURNSU4nLCAxKTsKCiMgQ2hhbmdpbmcgdGhpcyB3b24ndCBkbyBhbnkgZ29vZC4g IEl0J3MganVzdCBoZXJlIGFzIGEgY29udmVuaWVuY2UgZm9yIGRldmVsb3BtZW50LgpkZWZp bmUoJ1RSVV9UQUdTX0ZJRUxEJywgJ0tleXdvcmRzJyk7CgoKIyMjIFBSSU1BUlkgVEFHIEZV TkNUSU9OUyAjIyMKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKCmZ1bmN0aW9uIHRy dV90YWdzX2hhbmRsZXIoJGF0dHMpIHsKCSR0YWdfcGFyYW1ldGVyID0gdHJ1X3RhZ3NfdGFn X3BhcmFtZXRlcihhcnJheSgpLCBmYWxzZSk7CglpZiAoIWVtcHR5KCR0YWdfcGFyYW1ldGVy KSkgewoJCSRhdHRzID0gdHJ1X3RhZ3NfZml4dXBfcXVlcnlfYXR0cygkYXR0cywgJHRhZ19w YXJhbWV0ZXIpOwoJCXJldHVybiBkb0FydGljbGVzKCRhdHRzLCB0cnVlKTsJCSNmdW5jdGlv biBpbiBUWFAgY29kZQoJfSBlbHNlIHsKCQlyZXR1cm4gdHJ1X3RhZ3NfY2xvdWQoJGF0dHMp OwoJfQp9CgoKZnVuY3Rpb24gdHJ1X3RhZ3NfY2xvdWQoJGF0dHMpIHsKCXJldHVybiB0cnVf dGFnc19saXN0KHRydV90YWdzX2dldF9zdGFuZGFyZF9jbG91ZF9hdHRzKCRhdHRzLCBmYWxz ZSwgZmFsc2UpKTsKfQoKCmZ1bmN0aW9uIHRydV90YWdzX2xpc3QoJGF0dHMpIHsKCSRhdHRz ID0gdHJ1X3RhZ3NfZ2V0X3N0YW5kYXJkX2Nsb3VkX2F0dHMoJGF0dHMsIHRydWUsIGZhbHNl KTsKCSRhbGxfdGFncyA9IHRydV90YWdzX2Nsb3VkX3F1ZXJ5KCRhdHRzKTsKCglyZXR1cm4g dHJ1X3RhZ3NfcmVuZGVyX2Nsb3VkKCRhdHRzLCAkYWxsX3RhZ3MsICRhbGxfdGFncyk7Cn0K CgpmdW5jdGlvbiB0cnVfdGFnc19mcm9tX2FydGljbGUoJGF0dHMpIHsKCSRhbGxfdGFncyA9 IHRydV90YWdzX2dldF90YWdzX2Zvcl9hcnRpY2xlKCk7CgoJJGF0dHMgPSB0cnVfdGFnc19n ZXRfc3RhbmRhcmRfY2xvdWRfYXR0cygkYXR0cywgZmFsc2UsIHRydWUpOwoJJGFsbF90YWdz X2Zvcl93ZWlnaHQgPSAkYWxsX3RhZ3M7CglpZiAoJGF0dHNbJ3VzZW92ZXJhbGxjb3VudHMn XSkgewoJCSRhbGxfdGFnc19mb3Jfd2VpZ2h0ID0gdHJ1X3RhZ3NfY2xvdWRfcXVlcnkoJGF0 dHMpOwoJfQoKCXJldHVybiB0cnVfdGFnc19yZW5kZXJfY2xvdWQoJGF0dHMsICRhbGxfdGFn cywgJGFsbF90YWdzX2Zvcl93ZWlnaHQpOwp9CgoKZnVuY3Rpb24gdHJ1X3RhZ3NfaWZfaGFz X3RhZ3MoJGF0dHMsICR0aGluZykgewoJZ2xvYmFsICR0aGlzYXJ0aWNsZTsKCWV4dHJhY3Qo JHRoaXNhcnRpY2xlKTsKCgkkdGFnc19maWVsZCA9IFRSVV9UQUdTX0ZJRUxEOwoKCSRycyA9 IHNhZmVfcm93KCR0YWdzX2ZpZWxkLCAidGV4dHBhdHRlcm4iLCAiSUQ9JyR0aGlzaWQnIEFO RCAkdGFnc19maWVsZCA8PiAnJyIpOwoJcmV0dXJuIHBhcnNlKEV2YWxFbHNlKCR0aGluZywg JHJzKSk7Cn0KCgpmdW5jdGlvbiB0cnVfdGFnc19pZl90YWdfc2VhcmNoKCRhdHRzLCAkdGhp bmcpCnsKCSR0YWdfcGFyYW1ldGVyID0gdHJ1X3RhZ3NfdGFnX3BhcmFtZXRlcihhcnJheSgp LCBmYWxzZSk7CgkkY29uZGl0aW9uID0gKCFlbXB0eSgkdGFnX3BhcmFtZXRlcikpID8gdHJ1 ZSA6IGZhbHNlOwoJcmV0dXJuIHBhcnNlKEV2YWxFbHNlKCR0aGluZywgJGNvbmRpdGlvbikp Owp9CgoKZnVuY3Rpb24gdHJ1X3RhZ3NfdGFnX3BhcmFtZXRlcigkYXR0cywgJHNhZmVodG1s ID0gdHJ1ZSkKewoJZXh0cmFjdChsQXR0cyhhcnJheSgnc3RyaXBoeXBoZW5zJyA9PiAwLCAn dXJsZW5jb2RlJyA9PiAwKSwgICRhdHRzLCAwKSk7CgoJJHBhcm0gPSB1cmxkZWNvZGUoc3Ry aXBfdGFncyhncHMoVFJVX1RBR1NfVEFHX1BBUkFNRVRFUl9OQU1FKSkpOwoJJHBhcm0gPSAo JHN0cmlwaHlwaGVucyA/IHN0cl9yZXBsYWNlKCctJywgJyAnLCAkcGFybSkgOiAkcGFybSk7 CglpZiAoJHVybGVuY29kZSkgewoJCSRwYXJtID0gdXJsZW5jb2RlKCRwYXJtKTsKCSB9IGVs c2UgaWYgKCRzYWZlaHRtbCkgewoJCSRwYXJtID0gaHRtbHNwZWNpYWxjaGFycygkcGFybSk7 Cgl9CgoJcmV0dXJuICRwYXJtOwp9CgoKZnVuY3Rpb24gdHJ1X3RhZ3Nfc2VhcmNoX3BhcmFt ZXRlcigpCnsKCXJldHVybiBzdHJpcF90YWdzKGdwcygncScpKTsKfQoKCmZ1bmN0aW9uIHRy dV90YWdzX3JlbGF0ZWRfdGFnc19mcm9tX3NlYXJjaCgkYXR0cykgewoJJHRhZ19wYXJhbWV0 ZXIgPSB0cnVfdGFnc190YWdfcGFyYW1ldGVyKGFycmF5KCksIGZhbHNlKTsKCWlmICghZW1w dHkoJHRhZ19wYXJhbWV0ZXIpKSB7CgkgICAgICAgICR0YWdzX2ZpZWxkID0gVFJVX1RBR1Nf RklFTEQ7CgkJJGFsbF90YWdzID0gYXJyYXkoKTsKCgkJJHF1ZXJ5X2F0dHMgPSB0cnVfdGFn c19maXh1cF9xdWVyeV9hdHRzKCRhdHRzLCAkdGFnX3BhcmFtZXRlcik7CgkJJHJzID0gdHJ1 X3RhZ3NfcmVkb19hcnRpY2xlX3NlYXJjaCgkcXVlcnlfYXR0cyk7CgkJaWYgKCRycykgewoJ CQl3aGlsZSAoJGEgPSBuZXh0Um93KCRycykpIHsKCQkJCSRhcnRpY2xlX3RhZ3MgPSBleHBs b2RlKCIsIiwgdHJpbSh0cnVfdGFnc19zdHJ0b2xvd2VyKCRhWyR0YWdzX2ZpZWxkXSkpKTsK CQkJCSRhbGxfdGFncyA9IGFycmF5X21lcmdlKCRhbGxfdGFncywgdHJ1X3RhZ3NfdHJpbV90 YWdzKCRhcnRpY2xlX3RhZ3MpKTsKCQkJfQoJCX0KCgkJJGFsdF90YWdfcGFyYW1ldGVyID0g c3RyX3JlcGxhY2UoJy0nLCAnICcsICR0YWdfcGFyYW1ldGVyKTsKCQlmb3JlYWNoICgkYWxs X3RhZ3MgYXMgJGtleSA9PiAkdGFnKSB7CgkJCWlmICgkdGFnID09ICR0YWdfcGFyYW1ldGVy IHx8ICR0YWcgPT0gJGFsdF90YWdfcGFyYW1ldGVyKSB7CgkJCQl1bnNldCgkYWxsX3RhZ3Nb JGtleV0pOwoJCQl9CgkJfQoKCQkkY2xvdWRfYXR0cyA9IHRydV90YWdzX2dldF9zdGFuZGFy ZF9jbG91ZF9hdHRzKCRhdHRzLCBmYWxzZSwgZmFsc2UpOwoJCSRhbGxfdGFnc19mb3Jfd2Vp Z2h0ID0gJGFsbF90YWdzOwoJCWlmICgkY2xvdWRfYXR0c1sndXNlb3ZlcmFsbGNvdW50cydd KSB7CgkJCSRhbGxfdGFnc19mb3Jfd2VpZ2h0ID0gdHJ1X3RhZ3NfY2xvdWRfcXVlcnkoJGNs b3VkX2F0dHMpOwoJCX0KCgkJcmV0dXJuIHRydV90YWdzX3JlbmRlcl9jbG91ZCgkY2xvdWRf YXR0cywgJGFsbF90YWdzLCAkYWxsX3RhZ3NfZm9yX3dlaWdodCk7Cgl9IGVsc2UgewoJCXJl dHVybiAnJzsKCX0KfQoKCiMjIyBDTE9VRCBTVVBQT1JUIEZVTkNUSU9OUyAjIyMKIyMjIyMj IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwoKZnVuY3Rpb24gdHJ1X3RhZ3NfZ2V0X3N0YW5k YXJkX2Nsb3VkX2F0dHMoJGF0dHMsICRpc0xpc3QsICRpc0FydGljbGUpIHsKCXJldHVybiBs QXR0cyhhcnJheSgnd3JhcHRhZycJPT4gKCRpc0xpc3QgPyAndWwnIDogJycpLAoJCQknYnJl YWsnCQk9PiAoJGlzTGlzdCA/ICdsaScgOiAnLCAnKSwKCQkJJ2NsYXNzJwkJPT4gJycsCgkJ CSdicmVha2NsYXNzJwk9PiAnJywKCQkJJ3NlY3Rpb24nCT0+ICcnLAoJCQknbWlucGVyY2Vu dCcJPT4gJzEwMCcsCgkJCSdtYXhwZXJjZW50Jwk9PiAoJGlzTGlzdCB8fCAkaXNBcnRpY2xl ID8gJzEwMCcgOiAnMjAwJyksCgkJCSdzaG93Y291bnRzJwk9PiAnJywKCQkJJ2NvdW50d3Jh cGNoYXJzJwk9PiAnW10nLAoJCQkndXNlcmVsdGFnJwk9PiAoJGlzQXJ0aWNsZSA/ICcxJyA6 ICcnKSwKCQkJJ2dlbmVyYXRlbGlua3MnCT0+ICcxJywKCQkJJ21pbnRhZ2NvdW50Jwk9PiAn MCcsCgkJCSdtYXh0YWdjb3VudCcJPT4gJzEwMDAnLAoJCQknc2V0c2l6ZXMnCT0+ICgkaXNB cnRpY2xlID8gJzAnIDogJzEnKSwKCQkJJ3VzZW5vZm9sbG93Jwk9PiAnJywKCQkJJ3NvcnQn CQk9PiAnYWxwaGEnLAoJCQkndXNlb3ZlcmFsbGNvdW50cycJPT4gJycsCgkJCSdzZXRjbGFz c2VzJwk9PiAoJGlzQXJ0aWNsZSA/ICcwJyA6ICcxJyksCgkJCSd0aXRsZScJCT0+ICcnLAoJ CQknbGlzdGxpbWl0Jwk9PiAnJywKCQkJJ2tlZXAnCQk9PiAnbGFyZ2VzdCcsCgkJCSdjdXRv ZmYnCT0+ICdjaHVuaycKCQkpLCRhdHRzLCAwKTsKfQoKCmZ1bmN0aW9uIHRydV90YWdzX2Ns b3VkX3F1ZXJ5KCRhdHRzKSB7CglleHRyYWN0KCRhdHRzKTsKCgkkc2VjdGlvbl9jbGF1c2Ug PSAnJzsKCWlmICgkc2VjdGlvbiA8PiAnJykgewoJCSRrZXlzID0gc3BsaXQoJywnLCAkc2Vj dGlvbik7CgkJZm9yZWFjaCAoJGtleXMgYXMgJGtleSkgewoJCQkka2V5cGFydHNbXSA9ICIg U2VjdGlvbiA9ICciIC4gdHJpbSgka2V5KSAuICInIjsKCQl9CgkJJHNlY3Rpb25fY2xhdXNl ID0gIiBBTkQgKCIgLiBqb2luKCcgb3IgJywgJGtleXBhcnRzKSAuICIpIjsKCX0KCgkkdGFn c19maWVsZCA9IFRSVV9UQUdTX0ZJRUxEOwoJaW5jbHVkZV9vbmNlIHR4cGF0aC4nL3B1Ymxp c2gvc2VhcmNoLnBocCc7CgkkZmlsdGVyID0gZmlsdGVyU2VhcmNoKCk7CgkkYWxsX3RhZ3Mg PSBhcnJheSgpOwoJJHJzID0gc2FmZV9yb3dzKCIkdGFnc19maWVsZCIsICJ0ZXh0cGF0dGVy biIsICIkdGFnc19maWVsZCA8PiAnJyIgLiAkc2VjdGlvbl9jbGF1c2UgLiAkZmlsdGVyIC4g IiBhbmQgU3RhdHVzID49ICc0JyBhbmQgUG9zdGVkIDwgbm93KCkiKTsKCWZvcmVhY2ggKCRy cyBhcyAkcm93KSB7CgkJJHRlbXBfYXJyYXkgPSBleHBsb2RlKCIsIiwgdHJpbSh0cnVfdGFn c19zdHJ0b2xvd2VyKCRyb3dbJHRhZ3NfZmllbGRdKSkpOwoJCSRhbGxfdGFncyA9IGFycmF5 X21lcmdlKCRhbGxfdGFncywgdHJ1X3RhZ3NfdHJpbV90YWdzKCR0ZW1wX2FycmF5KSk7Cgl9 CgoJcmV0dXJuICRhbGxfdGFnczsKfQoKCmZ1bmN0aW9uIHRydV90YWdzX3JlbmRlcl9jbG91 ZCgkYXR0cywgJGFsbF90YWdzLCAkYWxsX3RhZ3NfZm9yX3dlaWdodCkgewoJZXh0cmFjdCgk YXR0cyk7CgoJJHRhZ3Nfd2VpZ2h0ID0gYXJyYXlfY291bnRfdmFsdWVzKCRhbGxfdGFnc19m b3Jfd2VpZ2h0KTsKCglmb3JlYWNoICgkdGFnc193ZWlnaHQgYXMgJHRhZyA9PiAkd2VpZ2h0 KSB7CgkJaWYgKCFpbl9hcnJheSgkdGFnLCAkYWxsX3RhZ3MpCgkJICAgfHwgJHRhZ3Nfd2Vp Z2h0WyR0YWddIDwgJG1pbnRhZ2NvdW50CgkJICAgfHwgJHRhZ3Nfd2VpZ2h0WyR0YWddID4g JG1heHRhZ2NvdW50KSB7CgkJCXVuc2V0KCR0YWdzX3dlaWdodFskdGFnXSk7CgkJfQoJfQoK CSRzb3J0X2J5X2NvdW50ID0gKHN0cnBvcygkc29ydCwgJ2NvdW50JykgIT09IGZhbHNlKTsK CSRzb3J0X2FzY2VuZGluZyA9IChzdHJwb3MoJHNvcnQsICdhc2MnKSAhPT0gZmFsc2UpOwoJ JHRhZ3Nfd2VpZ2h0ID0gdHJ1X3RhZ3Nfc29ydF90YWdzKCR0YWdzX3dlaWdodCwgJHNvcnRf YnlfY291bnQsICRzb3J0X2FzY2VuZGluZyk7CgoJaWYgKCRsaXN0bGltaXQgPiAwICYmICRs aXN0bGltaXQgPCBjb3VudCgkdGFnc193ZWlnaHQpKSB7CgkJJHJlc29ydGVkX3RhZ3MgPSBh cnJheSgpOwoJCWlmICgka2VlcCA9PSAnbGFyZ2VzdCcpIHsKCQkJJHJlc29ydGVkX3RhZ3Mg PSBhcnJheV9rZXlzKHRydV90YWdzX3NvcnRfdGFncygkdGFnc193ZWlnaHQsIHRydWUsIGZh bHNlKSk7CgkJfSBlbHNlIHsKCQkJaWYgKCRrZWVwID09ICdyYW5kb20nKSB7CgkJCQlmb3Jl YWNoICgkdGFnc193ZWlnaHQgYXMgJHRhZyA9PiAkd2VpZ2h0KSB7CgkJCQkJJHJlc29ydGVk X3RhZ3NbJHRhZ10gPSByYW5kKDAsICR3ZWlnaHQpOwoJCQkJfQoJCQkJJHJlc29ydGVkX3Rh Z3MgPSBhcnJheV9rZXlzKHRydV90YWdzX3NvcnRfdGFncygkcmVzb3J0ZWRfdGFncywgdHJ1 ZSwgZmFsc2UpKTsKCQkJfSBlbHNlIGlmICgka2VlcCA9PSAnYWxwaGEnKSB7CgkJCQkkcmVz b3J0ZWRfdGFncyA9IGFycmF5X2tleXMoJHRhZ3Nfd2VpZ2h0KTsKCQkJCW5hdGNhc2Vzb3J0 KCRyZXNvcnRlZF90YWdzKTsKCQkJfQoJCQkkY3V0b2ZmID0gJ2V4YWN0JzsKCQl9CgoJCSRs YXN0X2dvb2RfaW5kZXggPSAkbGlzdGxpbWl0IC0gMTsKCQlpZiAoJGN1dG9mZiA9PSAnY2h1 bmsnKSB7IC8vYWx0ZXJuYXRpdmUgaXMgJ2V4YWN0JwoJCQkkbGFzdF93ZWlnaHQgPSAtMTsK CQkJZm9yICgkaSA9IDA7ICRpIDwgJGxpc3RsaW1pdCArIDE7ICRpKyspIHsKCQkJCSRuZXdf d2VpZ2h0ID0gJHRhZ3Nfd2VpZ2h0WyRyZXNvcnRlZF90YWdzWyRpXV07CgkJCQlpZiAoJG5l d193ZWlnaHQgIT0gJGxhc3Rfd2VpZ2h0KSB7CgkJCQkJJGxhc3RfZ29vZF9pbmRleCA9ICRp IC0gMTsKCQkJCQkkbGFzdF93ZWlnaHQgPSAkbmV3X3dlaWdodDsKCQkJCX0KCQkJfQoJCQlp ZiAoJGxhc3RfZ29vZF9pbmRleCA8IDApIHsKCQkJCSRsYXN0X2dvb2RfaW5kZXggPSAkbGlz dGxpbWl0IC0gMTsKCQkJfQoJCX0KCgkJJHJlc29ydGVkX3RhZ3MgPSBhcnJheV9jaHVuaygk cmVzb3J0ZWRfdGFncywgJGxhc3RfZ29vZF9pbmRleCArIDEpOwoJCSRyZXNvcnRlZF90YWdz ID0gJHJlc29ydGVkX3RhZ3NbMF07CgoJCWZvcmVhY2ggKCR0YWdzX3dlaWdodCBhcyAkdGFn ID0+ICR3ZWlnaHQpIHsKCQkJaWYgKCFpbl9hcnJheSgkdGFnLCAkcmVzb3J0ZWRfdGFncykp IHsKCQkJCXVuc2V0KCR0YWdzX3dlaWdodFskdGFnXSk7CgkJCX0KCQl9Cgl9CgoJaWYgKCRn ZW5lcmF0ZWxpbmtzKSB7CgkJaWYgKFRSVV9UQUdTX1VTRV9DTEVBTl9VUkxTKSB7CgkJCSR1 cmxwcmVmaXggPSBodSAuIFRSVV9UQUdTX1NFQ1RJT04gLiAnLyc7CgkJCWlmICgkdXNlcmVs dGFnKSB7CgkJCQlpZiAoJHVzZW5vZm9sbG93KSB7CgkJCQkJJHVybHN1ZmZpeCA9ICcvIiBy ZWw9InRhZyBub2ZvbGxvdyc7CgkJCQl9IGVsc2UgewoJCQkJCSR1cmxzdWZmaXggPSAnLyIg cmVsPSJ0YWcnOwoJCQkJfQoJCQl9IGVsc2UgaWYgKCR1c2Vub2ZvbGxvdykgewoJCQkJJHVy bHN1ZmZpeCA9ICcvIiByZWw9Im5vZm9sbG93JzsKCQkJfSBlbHNlIHsKCQkJCSR1cmxzdWZm aXggPSAnLyc7CgkJCX0KCQl9IGVsc2UgewoJCQkkdXJscHJlZml4ID0gaHUgLiAnP3M9JyAu IFRSVV9UQUdTX1NFQ1RJT04gLiAnJmFtcDt0PSc7CgkJCSR1cmxzdWZmaXggPSAnLyIgcmVs PSJub2ZvbGxvdyc7CgkJfQoJfQoKCSRtYXggPSBtYXgoJHRhZ3Nfd2VpZ2h0KTsKCSRtaW4g PSBtaW4oJHRhZ3Nfd2VpZ2h0KTsKCSRzdGVwdmFsdWUgPSAoJG1heCA9PSAkbWluKSA/IDAg OiAoJG1heHBlcmNlbnQgLSAkbWlucGVyY2VudCkgLyAoJG1heCAtICRtaW4pOwoKCWZvcmVh Y2ggKCR0YWdzX3dlaWdodCBhcyAkdGFnID0+ICR3ZWlnaHQpIHsKCQkkdGFnX3dlaWdodCA9 IGZsb29yKCRtaW5wZXJjZW50ICsgKCR3ZWlnaHQgLSAkbWluKSAqICRzdGVwdmFsdWUpOwoK CQkkc3R5bGUgPSAnJzsKCQlpZiAoJHNldHNpemVzKQoJCQkkc3R5bGUgPSAnIHN0eWxlPSJm b250LXNpemU6ICcgLiAkdGFnX3dlaWdodCAuICclOyInOwoKCQkkdGFnX2NsYXNzID0gJyc7 CgkJaWYgKCRzZXRjbGFzc2VzKSB7CgkJCSR0YWdfY2xhc3MgPSAnIGNsYXNzPSInOwoJCQlp ZiAoJHdlaWdodCA9PSAkbWluKQoJCQkJJHRhZ19jbGFzcyAuPSAidGFnU2l6ZVNtYWxsZXN0 IjsKCQkJZWxzZSBpZiAoJHdlaWdodCA9PSAkbWF4KQoJCQkJJHRhZ19jbGFzcyAuPSAidGFn U2l6ZUxhcmdlc3QiOwoJCQllbHNlCgkJCQkkdGFnX2NsYXNzIC49ICJ0YWdTaXplTWVkaXVt IjsKCQkJJHRhZ19jbGFzcyAuPSAnIHRhZ1NpemUnIC4gKCR3ZWlnaHQgKyAxIC0gJG1pbik7 CgkJCSR0YWdfY2xhc3MgLj0gJyInOwoJCX0KCgkJLy9hZGFwdGVkIGZyb20gY29kZSBieSBn ZHRyb2lhbm8sIHNlZSBodHRwOi8vZm9ydW0udGV4dHBhdHRlcm4uY29tL3ZpZXd0b3BpYy5w aHA/cGlkPTEwMjg3NSNwMTAyODc1CgkJJHRpdGxlY291bnQgPSAnJzsKCQlpZiAoJHRpdGxl KQoJCQkkdGl0bGVjb3VudCA9ICcgdGl0bGU9IicgLiAkdGl0bGUgLiAnIic7CgkJJGRpc3Bs YXljb3VudD0gJyc7CgkJJGNvdW50ID0gJGNvdW50d3JhcGNoYXJzezB9IC4gJHdlaWdodCAu ICRjb3VudHdyYXBjaGFyc3sxfTsKCQlpZiAoJHNob3djb3VudHMgPT0gJ3RpdGxlJyB8fCAk c2hvd2NvdW50cyA9PSAnYm90aCcpCgkJCSR0aXRsZWNvdW50ID0gJyB0aXRsZT0iJyAuICR0 aXRsZSAuICRjb3VudCAuICciJzsKCQlpZiAoJHNob3djb3VudHMgJiYgJHNob3djb3VudHMg IT0gJ3RpdGxlJykKCQkJJGRpc3BsYXljb3VudCA9ICcgJyAuICRjb3VudDsKCgkJaWYgKCRn ZW5lcmF0ZWxpbmtzKSB7CgkJCSR3aG9sZXVybCA9ICciJyAuICR1cmxwcmVmaXggLiB1cmxl bmNvZGUoc3RyX3JlcGxhY2UoJyAnLCAnLScsICR0YWcpKSAuICR1cmxzdWZmaXggLiAnIic7 CgkJCSR0YWdzX2h0bWxbXSA9ICc8YSBocmVmPScgLiAkd2hvbGV1cmwgLiAkdGFnX2NsYXNz IC4gJHN0eWxlIC4gJHRpdGxlY291bnQgLiAnPicgLiBodG1sc3BlY2lhbGNoYXJzKCR0YWcp IC4gJzwvYT4nIC4gJGRpc3BsYXljb3VudDsKCQl9IGVsc2UgaWYgKCR0YWdfY2xhc3MgfHwg JHN0eWxlIHx8IHRpdGxlY291bnQpIHsKCQkJJHRhZ3NfaHRtbFtdID0gJzxzcGFuJyAuICR0 YWdfY2xhc3MgLiAkc3R5bGUgLiAkdGl0bGVjb3VudCAuICc+JyAuICR0YWcgLiAnPC9zcGFu PicgLiAkZGlzcGxheWNvdW50OwoJCX0gZWxzZSB7CgkJCSR0YWdzX2h0bWxbXSA9ICR0YWcg LiAkZGlzcGxheWNvdW50OwoJCX0KCX0KCXJldHVybiB0cnVfdGFnc19kb193cmFwKCR0YWdz X2h0bWwsICR3cmFwdGFnLCAkYnJlYWssICRjbGFzcywgJGJyZWFrY2xhc3MpOwp9CgoKIyMj IENMRUFOIFVSTCBGVU5DVElPTlMgIyMjCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwoK aWYgKFRSVV9UQUdTX1VTRV9DTEVBTl9VUkxTKSB7CglyZWdpc3Rlcl9jYWxsYmFjaygndHJ1 X3RhZ3NfY2xlYW5fdXJsX2hhbmRsZXInLCAncHJldGV4dCcpOwp9CgpmdW5jdGlvbiB0cnVf dGFnc19jbGVhbl91cmxfaGFuZGxlcigkZXZlbnQsICRzdGVwKSB7Cgkkc3VicGF0aCA9IHBy ZWdfcXVvdGUocHJlZ19yZXBsYWNlKCIvaHR0cHM/OlwvXC8uKihcLy4qKS9VaSIsIiQxIixo dSksJy8nKTsKCSRyZXEgPSBwcmVnX3JlcGxhY2UoIi9eJHN1YnBhdGgvaSIsJy8nLCRfU0VS VkVSWydSRVFVRVNUX1VSSSddKTsKCgkkcXMgPSBzdHJwb3MoJHJlcSwgJz8nKTsKCSRxYXR0 cyA9ICgkcXMgPyAnJicuc3Vic3RyKCRyZXEsICRxcyArIDEpIDogJycpOwoJaWYgKCRxcykg JHJlcSA9IHN1YnN0cigkcmVxLCAwLCAkcXMpOwoKCSRwYXJ0cyA9IGFycmF5X3ZhbHVlcyhh cnJheV9maWx0ZXIoc3BsaXQoJy8nLCAkcmVxKSkpOwoJaWYgKGNvdW50KCRwYXJ0cykgPT0g MiAmJiAkcGFydHNbMF0gPT0gVFJVX1RBR1NfU0VDVElPTikgewoJCSR0YWcgPSAkcGFydHNb MV07CgkJJF9TRVJWRVJbJ1FVRVJZX1NUUklORyddID0gVFJVX1RBR1NfVEFHX1BBUkFNRVRF Ul9OQU1FIC4gJz0nIC4gJHRhZyAuICRxYXR0czsKCQkkX1NFUlZFUlsnUkVRVUVTVF9VUkkn XSA9ICcvJyAuIFRSVV9UQUdTX1NFQ1RJT04gLiAnLz8nIC4gJF9TRVJWRVJbJ1FVRVJZX1NU UklORyddOwoJCWlmIChjb3VudCgkX1BPU1QpID4gMCkgewoJCQkkX1BPU1RbVFJVX1RBR1Nf VEFHX1BBUkFNRVRFUl9OQU1FXSA9ICR0YWc7CgkJfSBlbHNlIHsKCQkJJF9HRVRbVFJVX1RB R1NfVEFHX1BBUkFNRVRFUl9OQU1FXSA9ICR0YWc7CgkJfQoJfQp9CgoKIyMjIEFETUlOIFNJ REUgRlVOQ1RJT05TICMjIwojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgppZiAoVFJV X1RBR1NfU0hPV19UQUdTX0lOX0FETUlOKQoJcmVnaXN0ZXJfY2FsbGJhY2soJ3RydV90YWdz X2FkbWluX2hhbmRsZXInLCAnYXJ0aWNsZScpOwoKZnVuY3Rpb24gdHJ1X3RhZ3NfYWRtaW5f aGFuZGxlcigkZXZlbnQsICRzdGVwKSB7CgkkY2xvdWQgPSBhcnJheV91bmlxdWUodHJ1X3Rh Z3NfY2xvdWRfcXVlcnkodHJ1X3RhZ3NfZ2V0X3N0YW5kYXJkX2Nsb3VkX2F0dHMoYXJyYXko KSwgdHJ1ZSwgdHJ1ZSkpKTsKCXNvcnQoJGNsb3VkKTsKCSRsaW5rcyA9IGFycmF5KCk7Cglm b3JlYWNoICgkY2xvdWQgYXMgJHRhZykgewoJCSRsaW5rc1tdID0gJzxhIGhyZWY9IiNhZHZh bmNlZCIgb25jbGljaz0iYWRkVGFnKFxcXCcnLiR0YWcuJ1xcXCcpOyByZXR1cm4gZmFsc2U7 Ij4nIC4gaHRtbHNwZWNpYWxjaGFycygkdGFnKSAuICc8XC9hPic7Cgl9CgkkdG9faW5zZXJ0 ID0gam9pbignLCAnLCAkbGlua3MpOwoKCSRqcyA9IDw8PEVPRgp2YXIga2V5d29yZHNGaWVs ZCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdrZXl3b3JkcycpOwp2YXIgcGFyZW50ID0g a2V5d29yZHNGaWVsZC5wYXJlbnROb2RlOwpwYXJlbnQuYXBwZW5kQ2hpbGQoZG9jdW1lbnQu Y3JlYXRlRWxlbWVudCgnYnInKSk7CnZhciBjbG91ZCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1l bnQoJ3NwYW4nKTsKY2xvdWQuc2V0QXR0cmlidXRlKCdjbGFzcycsICd0cnVfdGFnc19hZG1p bl90YWdzJyk7CmNsb3VkLmlubmVySFRNTCA9ICd7JHRvX2luc2VydH0nOwpwYXJlbnQuYXBw ZW5kQ2hpbGQoY2xvdWQpOwoKZnVuY3Rpb24gYWRkVGFnKHRhZ05hbWUpIHsKCXZhciB0ZXh0 YXJlYSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdrZXl3b3JkcycpOwoJdmFyIGN1cnZh bCA9IHRleHRhcmVhLnZhbHVlLnJlcGxhY2UoL1xzKyQvLCAnJyk7CglpZiAoJycgPT0gY3Vy dmFsKQoJCXRleHRhcmVhLnZhbHVlID0gdGFnTmFtZTsKCWVsc2UgaWYgKCcsJyA9PSBjdXJ2 YWwuY2hhckF0KGN1cnZhbC5sZW5ndGggLSAxKSkKCQl0ZXh0YXJlYS52YWx1ZSArPSAnICcg KyB0YWdOYW1lOwoJZWxzZQoJCXRleHRhcmVhLnZhbHVlICs9ICcsICcgKyB0YWdOYW1lOwp9 CkVPRjsKCgllY2hvIHNjcmlwdF9qcygkanMpOwp9CgoKIyMjIEFUT00vUlNTIEZFRUQgRlVO Q1RJT05TICMjIwojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgpyZWdpc3Rlcl9j YWxsYmFjaygndHJ1X3RhZ3NfYXRvbV9oYW5kbGVyJywgJ2F0b21fZW50cnknKTsKZnVuY3Rp b24gdHJ1X3RhZ3NfYXRvbV9oYW5kbGVyKCRldmVudCwgJHN0ZXApIHsgcmV0dXJuIHRydV90 YWdzX2ZlZWRfaGFuZGxlcih0cnVlKTsgfQpyZWdpc3Rlcl9jYWxsYmFjaygndHJ1X3RhZ3Nf cnNzX2hhbmRsZXInLCAncnNzX2VudHJ5Jyk7CmZ1bmN0aW9uIHRydV90YWdzX3Jzc19oYW5k bGVyKCRldmVudCwgJHN0ZXApIHsgcmV0dXJuIHRydV90YWdzX2ZlZWRfaGFuZGxlcihmYWxz ZSk7IH0KCmZ1bmN0aW9uIHRydV90YWdzX2ZlZWRfaGFuZGxlcigkYXRvbSkgewoJJHRhZ3Mg PSB0cnVfdGFnc19nZXRfdGFnc19mb3JfYXJ0aWNsZSgpOwoKCWlmIChUUlVfVEFHU19BRERf VEFHU19UT19GRUVEX0JPRFkpIHsKCQkkZXh0cmFib2R5ID0gJyc7CgkJJEZPUk1fTkFNRSA9 ICd0cnVfdGFnc19mZWVkX3RhZ3MnOwoJCWlmIChmZXRjaCgnZm9ybScsICd0eHBfZm9ybScs ICduYW1lJywgJEZPUk1fTkFNRSkpIHsKCQkJJGZvcm0gPSBmZXRjaF9mb3JtKCRGT1JNX05B TUUpOwoJCQkkZXh0cmFib2R5ID0gdHJpbShwYXJzZSgkZm9ybSkpOwoJCX0gZWxzZSB7CgkJ CSRhdHRzID0gdHJ1X3RhZ3NfZ2V0X3N0YW5kYXJkX2Nsb3VkX2F0dHMoYXJyYXkoKSwgZmFs c2UsIHRydWUpOwoJCQkkZXh0cmFib2R5ID0gJzxwPnRhZ3M6ICcgLiB0cnVfdGFnc19yZW5k ZXJfY2xvdWQoJGF0dHMsICR0YWdzLCAkdGFncykgLiAnPC9wPic7CgkJfQoJCWdsb2JhbCAk dGhpc2FydGljbGU7CgkJaWYgKHRyaW0oJHRoaXNhcnRpY2xlWydleGNlcnB0J10pKSB7CgkJ CSR0aGlzYXJ0aWNsZVsnZXhjZXJwdCddID0gdHJpbSgkdGhpc2FydGljbGVbJ2V4Y2VycHQn XSkubi4kZXh0cmFib2R5Lm47CgkJfQoJCSR0aGlzYXJ0aWNsZVsnYm9keSddID0gdHJpbSgk dGhpc2FydGljbGVbJ2JvZHknXSkubi4kZXh0cmFib2R5Lm47Cgl9CgoJaWYgKFRSVV9UQUdT X0FERF9UQUdTX1RPX0ZFRURfWE1MKSB7CgkJJG91dHB1dCA9IGFycmF5KCk7CgkJZm9yZWFj aCAoJHRhZ3MgYXMgJHRhZykgewoJCQlpZiAoJGF0b20pIHsKCQkJCSRvdXRwdXRbXSA9ICc8 Y2F0ZWdvcnkgdGVybT0iJyAuIGh0bWxzcGVjaWFsY2hhcnMoJHRhZykgLiAnIiAvPic7CgkJ CX0gZWxzZSB7CgkJCQkkb3V0cHV0W10gPSAnPGNhdGVnb3J5PicgLiBodG1sc3BlY2lhbGNo YXJzKCR0YWcpIC4gJzwvY2F0ZWdvcnk+JzsKCQkJfQoJCX0KCQlyZXR1cm4gbi5qb2luKG4s ICRvdXRwdXQpLm47Cgl9Cn0KCgojIyMgT1RIRVIgU1VQUE9SVCBGVU5DVElPTlMgIyMjCiMj IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKCmZ1bmN0aW9uIHRydV90YWdzX2dldF90 YWdzX2Zvcl9hcnRpY2xlKCkgewoJZ2xvYmFsICR0aGlzYXJ0aWNsZTsKCWV4dHJhY3QoJHRo aXNhcnRpY2xlKTsKCgkkdGFnc19maWVsZCA9IFRSVV9UQUdTX0ZJRUxEOwoJJHJzID0gc2Fm ZV9yb3coJHRhZ3NfZmllbGQsICJ0ZXh0cGF0dGVybiIsICJJRD0nJHRoaXNpZCcgQU5EICR0 YWdzX2ZpZWxkIDw+ICcnIik7CgkkYWxsX3RhZ3MgPSBleHBsb2RlKCIsIiwgdHJpbSh0cnVf dGFnc19zdHJ0b2xvd2VyKCRyc1skdGFnc19maWVsZF0pKSk7CgoJcmV0dXJuIHRydV90YWdz X3RyaW1fdGFncygkYWxsX3RhZ3MpOwp9CgoKIyBmaXhlcyBidWcgd2l0aCA0LjAuNCdzIHZl cnNpb24gb2YgZG9XcmFwIHRoYXQgY2F1c2VkIHNwYWNlcyB0byBzaG93IHVwIGJlZm9yZSB0 aGUgY29tbWFzCmZ1bmN0aW9uIHRydV90YWdzX2RvX3dyYXAoJGxpc3QsICR3cmFwdGFnLCAk YnJlYWssICRjbGFzcywgJGJyZWFrY2xhc3MpIHsKCWlmICghJHdyYXB0YWcgJiYgIXByZWdf bWF0Y2goJy9eXHcrJC8nLCAkYnJlYWspKSB7CgkJcmV0dXJuIGpvaW4oJGJyZWFrLm4sICRs aXN0KTsKCX0gZWxzZSB7CgkJcmV0dXJuIGRvV3JhcCgkbGlzdCwgJHdyYXB0YWcsICRicmVh aywgJGNsYXNzLCAkYnJlYWtjbGFzcyk7Cgl9Cn0KCgpmdW5jdGlvbiB0cnVfdGFnc190cmlt X3RhZ3MoJHRhZ19hcnJheSkgewoJJHRyaW1tZWQgPSBhcnJheSgpOwoJZm9yZWFjaCAoJHRh Z19hcnJheSBhcyAkdGFnKSB7CgkJaWYgKCIiICE9IHRyaW0oJHRhZykpIHsKCQkJJHRyaW1t ZWRbXSA9IHRyaW0oJHRhZyk7CgkJfQoJfQoJcmV0dXJuICR0cmltbWVkOwp9CgoKZnVuY3Rp b24gdHJ1X3RhZ3NfZml4dXBfcXVlcnlfYXR0cygkYXR0cywgJHRhZ19wYXJhbWV0ZXIpIHsK CSRrZXl3b3JkcyA9IGV4cGxvZGUoJywnLCAkdGFnX3BhcmFtZXRlcik7Cglmb3JlYWNoICgk a2V5d29yZHMgYXMgJGtleXdvcmQpIHsKCQlpZiAoc3RycG9zKCRrZXl3b3JkLCAnLScpICE9 PSBmYWxzZSkgewoJCQkka2V5d29yZHNbXSA9IHN0cl9yZXBsYWNlKCctJywgJyAnLCAka2V5 d29yZCk7CgkJfQoJfQoJJGF0dHNbJ2tleXdvcmRzJ10gPSBpbXBsb2RlKCcsJywgJGtleXdv cmRzKTsKCglpZiAoJGF0dHNbJ3NlY3Rpb24nXSAmJiBzdHJwb3MoJGF0dHNbJ3NlY3Rpb24n XSwgJywnKSAhPT0gZmFsc2UpCgkJJGF0dHNbJ3NlY3Rpb24nXSA9ICcnOwoKCWlmIChpc19j YWxsYWJsZSgiYXJyYXlfa2V5X2V4aXN0cyIpKSB7CgkJaWYgKCFhcnJheV9rZXlfZXhpc3Rz KCdsaW1pdCcsICRhdHRzKSkKCQkJJGF0dHNbJ2xpbWl0J10gPSAnMTAwMCc7Cgl9IGVsc2Ug ewoJCWlmICghJGF0dHNbJ2xpbWl0J10pCgkJCSRhdHRzWydsaW1pdCddID0gJzEwMDAnOwoJ fQoJJGF0dHNbJ2FsbG93b3ZlcnJpZGUnXSA9IHRydWU7CgoJcmV0dXJuICRhdHRzOwp9CgoK ZnVuY3Rpb24gdHJ1X3RhZ3Nfc3RydG9sb3dlcigkc3RyKSB7CglpZiAoaXNfY2FsbGFibGUo Im1iX3N0cnRvbG93ZXIiKSkgewoJLy9pZiAodmVyc2lvbl9jb21wYXJlKHBocHZlcnNpb24o KSwgIjQuMy4wIiwgIj49IikpIHsKCQlyZXR1cm4gbWJfc3RydG9sb3dlcigkc3RyLCAiVVRG LTgiKTsKCX0gZWxzZSB7CgkJcmV0dXJuIHN0cnRvbG93ZXIoJHN0cik7Cgl9Cn0KCgovL3Ro ZXNlIG5leHQgdHdvIGZ1bmN0aW9ucyBhcmUgZ3Jvc3MsIGJ1dCBJIGNhbid0IGZpZ3VyZSBv dXQgYW5vdGhlciB3YXkgdG8gZG8gaXQKZnVuY3Rpb24gdHJ1X3RhZ3Nfc29ydF90YWdzKCR0 YWdzX3dlaWdodCwgJHNvcnRfYnlfY291bnQsICRzb3J0X2FzY2VuZGluZykgewoJZ2xvYmFs ICR0cnVfdGFnc190YWdzX3dlaWdodCwgJHRydV90YWdzX3NvcnRfYnlfY291bnQsICR0cnVf dGFnc19zb3J0X2FzY2VuZGluZzsKCgkkdHJ1X3RhZ3NfdGFnc193ZWlnaHQgPSAkdGFnc193 ZWlnaHQ7CgkkdHJ1X3RhZ3Nfc29ydF9ieV9jb3VudCA9ICRzb3J0X2J5X2NvdW50OwoJJHRy dV90YWdzX3NvcnRfYXNjZW5kaW5nID0gJHNvcnRfYXNjZW5kaW5nOwoKCSR0ZW1wX2FycmF5 ID0gYXJyYXlfa2V5cygkdGFnc193ZWlnaHQpOwoJdXNvcnQoJHRlbXBfYXJyYXksICJ0cnVf dGFnc19zb3J0X3RhZ3NfY29tcGFyYXRvciIpOwoKCSRzb3J0ZWRfYXJyYXkgPSBhcnJheSgp OwoJZm9yZWFjaCAoJHRlbXBfYXJyYXkgYXMgJHRhZykgewoJCSRzb3J0ZWRfYXJyYXlbJHRh Z10gPSAkdGFnc193ZWlnaHRbJHRhZ107Cgl9CgoJcmV0dXJuICRzb3J0ZWRfYXJyYXk7Cn0K CgpmdW5jdGlvbiB0cnVfdGFnc19zb3J0X3RhZ3NfY29tcGFyYXRvcigkbGVmdCwgJHJpZ2h0 KSB7CglnbG9iYWwgJHRydV90YWdzX3RhZ3Nfd2VpZ2h0LCAkdHJ1X3RhZ3Nfc29ydF9ieV9j b3VudCwgJHRydV90YWdzX3NvcnRfYXNjZW5kaW5nOwoKCWlmICgkdHJ1X3RhZ3Nfc29ydF9i eV9jb3VudCkgewoJCSRsZWZ0X3dlaWdodCA9ICR0cnVfdGFnc190YWdzX3dlaWdodFskbGVm dF07CgkJJHJpZ2h0X3dlaWdodCA9ICR0cnVfdGFnc190YWdzX3dlaWdodFskcmlnaHRdOwoJ CWlmICgkbGVmdF93ZWlnaHQgPT0gJHJpZ2h0X3dlaWdodCkgewoJCQlyZXR1cm4gc3RybmF0 Y2FzZWNtcCgkbGVmdCwgJHJpZ2h0KTsKCQl9IGVsc2UgaWYgKCR0cnVfdGFnc19zb3J0X2Fz Y2VuZGluZykgewoJCQlyZXR1cm4gJGxlZnRfd2VpZ2h0IC0gJHJpZ2h0X3dlaWdodDsKCQl9 IGVsc2UgewoJCQlyZXR1cm4gJHJpZ2h0X3dlaWdodCAtICRsZWZ0X3dlaWdodDsKCQl9Cgl9 IGVsc2UgewoJCXJldHVybiBzdHJuYXRjYXNlY21wKCRsZWZ0LCAkcmlnaHQpOwoJfQp9CgoK CiMjIyBCQVNUQVJEIEZVTkNUSU9OUyBUSEFUIFNIT1VMRE4nVCBIQVZFIFRPIEVYSVNUICMj IwojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj IyMKCgpmdW5jdGlvbiB0cnVfdGFnc19yZWRvX2FydGljbGVfc2VhcmNoKCRhdHRzKSB7Cgkk dGhlQXR0cyA9IGxBdHRzKGFycmF5KCdsaW1pdCcgICAgID0+IDEwMDAsCgkJCQknY2F0ZWdv cnknICA9PiAnJywKCQkJCSdzZWN0aW9uJyAgID0+ICcnLAoJCQkJJ2V4Y2VycHRlZCcgPT4g JycsCgkJCQknYXV0aG9yJyAgICA9PiAnJywKCQkJCSdzb3J0YnknICAgID0+ICdQb3N0ZWQn LAoJCQkJJ3NvcnRkaXInICAgPT4gJ2Rlc2MnLAoJCQkJJ21vbnRoJyAgICAgPT4gJycsCgkJ CQkna2V5d29yZHMnICA9PiAnJywKCQkJCSdmcm9udHBhZ2UnID0+ICcnLAoJCQkJJ2lkJyAg ICAgICAgPT4gJycsCgkJCQkndGltZScgICAgICA9PiAncGFzdCcsCgkJCQknc3RhdHVzJyAg ICA9PiAnNCcsCgkJCQknb2Zmc2V0JyAgICA9PiAwCgkJCSksJGF0dHMsIDApOwoJZXh0cmFj dCgkdGhlQXR0cyk7CgoJLy9CdWlsZGluZyBxdWVyeSBwYXJ0cwoJJGZyb250cGFnZSA9ICgk ZnJvbnRwYWdlKSA/IGZpbHRlckZyb250UGFnZSgpIDogJyc7CgkkY2F0ZWdvcnkgID0gKCEk Y2F0ZWdvcnkpICA/ICcnIDogIiBhbmQgKChDYXRlZ29yeTE9JyIuZG9zbGFzaCgkY2F0ZWdv cnkpLiInKSBvciAoQ2F0ZWdvcnkyPSciLmRvU2xhc2goJGNhdGVnb3J5KS4iJykpICI7Cgkk c2VjdGlvbiAgID0gKCEkc2VjdGlvbikgICA/ICcnIDogIiBhbmQgU2VjdGlvbiA9ICciLmRv c2xhc2goJHNlY3Rpb24pLiInIjsKCSRleGNlcnB0ZWQgPSAoJGV4Y2VycHRlZD09J3knKSAg PyAiIGFuZCBFeGNlcnB0ICE9JyciIDogJyc7CgkkYXV0aG9yICAgID0gKCEkYXV0aG9yKSAg ICA/ICcnIDogIiBhbmQgQXV0aG9ySUQgPSAnIi5kb3NsYXNoKCRhdXRob3IpLiInIjsKCSRt b250aCAgICAgPSAoISRtb250aCkgICAgID8gJycgOiAiIGFuZCBQb3N0ZWQgbGlrZSAnIi5k b1NsYXNoKCRtb250aCkuIiUnIjsKCSRpZCAgICAgICAgPSAoISRpZCkgICAgICAgID8gJycg OiAiIGFuZCBJRCA9ICciLmludHZhbCgkaWQpLiInIjsKCXN3aXRjaCAoJHRpbWUpIHsKCQlj YXNlICdhbnknOgoJCQkkdGltZSA9ICIiOyBicmVhazsKCQljYXNlICdmdXR1cmUnOgoJCQkk dGltZSA9ICIgYW5kIFBvc3RlZCA+IG5vdygpIjsgYnJlYWs7CgkJZGVmYXVsdDoKCQkJJHRp bWUgPSAiIGFuZCBQb3N0ZWQgPCBub3coKSI7Cgl9CglpZiAoIWlzX251bWVyaWMoJHN0YXR1 cykpCgkJJHN0YXR1cyA9IGdldFN0YXR1c051bSgkc3RhdHVzKTsKCgkkY3VzdG9tID0gJyc7 CgkvLyB0cnlpbmcgY3VzdG9tIGZpZWxkcyBoZXJlCgkkY3VzdG9tRmllbGRzID0gZ2V0Q3Vz dG9tRmllbGRzKCk7CglpZiAoJGN1c3RvbUZpZWxkcykgewoJCWZvcmVhY2goJGN1c3RvbUZp ZWxkcyBhcyAkY0ZpZWxkKSB7CgkJCWlmIChpc3NldCgkYXR0c1skY0ZpZWxkXSkpCgkJCQkk Y3VzdG9tUGFpcnNbJGNGaWVsZF0gPSAkYXR0c1skY0ZpZWxkXTsKCQl9CgkJaWYoIWVtcHR5 KCRjdXN0b21QYWlycykpCgkJCSRjdXN0b20gPSAgYnVpbGRDdXN0b21TcWwoJGN1c3RvbUZp ZWxkcywkY3VzdG9tUGFpcnMpOwoJCWVsc2UKCQkJJGN1c3RvbSA9ICcnOwoJfQoKCS8vQWxs b3cga2V5d29yZHMgZm9yIG5vLWN1c3RvbSBhcnRpY2xlcy4gVGhhdCB0YWdnaW5nIG1vZGUs IHlvdSBrbm93CglpZiAoJGtleXdvcmRzKSB7CgkJJGtleXMgPSBzcGxpdCgnLCcsJGtleXdv cmRzKTsKCQlmb3JlYWNoICgka2V5cyBhcyAka2V5KSB7CgkJCSRrZXlwYXJ0c1tdID0gIiBL ZXl3b3JkcyBsaWtlICclIi5kb1NsYXNoKHRyaW0oJGtleSkpLiIlJyI7CgkJfQoJCSRrZXl3 b3JkcyA9ICIgYW5kICgiIC4gam9pbignIG9yICcsJGtleXBhcnRzKSAuICIpIjsKCX0KCglp ZiAoJGlkKQoJCSRzdGF0dXNxID0gIiBhbmQgU3RhdHVzID49ICc0JyI7CgllbHNlCgkJJHN0 YXR1c3EgPSAiIGFuZCBTdGF0dXM9JyIuZG9TbGFzaCgkc3RhdHVzKS4iJyI7CgoJJHdoZXJl ID0gIjEiIC4gJHN0YXR1c3EuICR0aW1lLgoJCSRpZCAuICRjYXRlZ29yeSAuICRzZWN0aW9u IC4gJGV4Y2VycHRlZCAuICRtb250aCAuICRhdXRob3IgLiAka2V5d29yZHMgLiAkY3VzdG9t IC4gJGZyb250cGFnZTsKCgkJJHBnb2Zmc2V0ID0gJG9mZnNldCAuICcsICc7CgoJJHJzID0g c2FmZV9yb3dzX3N0YXJ0KCIqLCB1bml4X3RpbWVzdGFtcChQb3N0ZWQpIGFzIHVQb3N0ZWQi LCAndGV4dHBhdHRlcm4nLAoJCSR3aGVyZS4gJyBvcmRlciBieSAnIC4gZG9zbGFzaCgkc29y dGJ5KSAuICcgJyAuIGRvU2xhc2goJHNvcnRkaXIpIC4gJyBsaW1pdCAnIC4gZG9TbGFzaCgk bGltaXQpKTsKCglyZXR1cm4gJHJzOwp9CgoKIjtzOjg6ImhlbHBfcmF3IjtzOjQ5ODoiVG8g bGVhcm4gbW9yZSBhYm91dCB0cnVfdGFncywgY2hlY2sgb3V0IHRoZSAiaW50cm9kdWN0b3J5 IGFydGljbGUiOi9ibG9nLzQ5My90cnV0YWdzLWEtdGFnZ2luZy1wbHVnaW4tZm9yLXRleHRw YXR0ZXJuLCAicmVsZWFzZXMgcGFnZSI6aHR0cDovL3d3dy50cnVpc3QuY29tL3JlZmVyZW5j ZS81MzcvdHJ1X3RhZ3MtcmVsZWFzZXMsICJmZWF0dXJlIGxpc3QiOmh0dHA6Ly93d3cudHJ1 aXN0LmNvbS9yZWZlcmVuY2UvNDk1L3RydXRhZ3MtZmVhdHVyZS1saXN0LCBhbmQgInVzYWdl IGluc3RydWN0aW9ucyI6aHR0cDovL3d3dy50cnVpc3QuY29tL3JlZmVyZW5jZS80OTcvdHJ1 dGFncy11c2FnZS1pbnN0cnVjdGlvbnMuCgpJJ3ZlIHRha2VuIHRoZSBkZXRhaWxlZCBoZWxw IG91dCBvZiB0aGUgcGx1Z2luOyBteSBhcG9sb2dpZXMuICBJdCB3YXMgdG9vIGJpZyBhbmQg dG9vIGRpZmZpY3VsdCB0byBrZWVwIG1haW50YWluaW5nIG9uIG15IHNpdGUgYW5kIGluIHRo ZSBwbHVnaW4uIjtzOjM6Im1kNSI7czozMjoiODdjOGUzMTI5YmQ0OWYwN2ZhMjM0ZWQ0NWFh ZTcyYzYiO30=