# tru_tags v3.5 # Article tagging # 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: # ...................................................................... YToxMTp7czoxNToiYWxsb3dfaHRtbF9oZWxwIjtpOjA7czo3OiJ2ZXJzaW9uIjtzOjM6IjMu NSI7czo2OiJhdXRob3IiO3M6MTM6Ik5hdGhhbiBBcnRodXIiO3M6MTA6ImF1dGhvcl91cmki O3M6MjQ6Imh0dHA6Ly93d3cucmFpbnNraXQuY29tLyI7czoxMToiZGVzY3JpcHRpb24iO3M6 MTU6IkFydGljbGUgdGFnZ2luZyI7czo0OiJ0eXBlIjtpOjE7czo0OiJuYW1lIjtzOjg6InRy dV90YWdzIjtzOjQ6ImhlbHAiO3M6MTA4NjoiCTxwPlRvIGxlYXJuIG1vcmUgYWJvdXQgdHJ1 X3RhZ3MsIGNoZWNrIG91dCB0aGUgPGEgaHJlZj0iaHR0cDovL3d3dy5yYWluc2tpdC5jb20v YmxvZy80OTMvdHJ1dGFncy1hLXRhZ2dpbmctcGx1Z2luLWZvci10ZXh0cGF0dGVybiI+aW50 cm9kdWN0b3J5IGFydGljbGU8L2E+LCA8YSBocmVmPSJodHRwOi8vd3d3LnJhaW5za2l0LmNv bS9yZWZlcmVuY2UvNTM3L3RydV90YWdzLXJlbGVhc2VzIj5yZWxlYXNlcyBwYWdlPC9hPiwg PGEgaHJlZj0iaHR0cDovL3d3dy5yYWluc2tpdC5jb20vcmVmZXJlbmNlLzQ5NS90cnV0YWdz LWZlYXR1cmUtbGlzdCI+ZmVhdHVyZSBsaXN0PC9hPiwgPGEgaHJlZj0iaHR0cDovL3d3dy5y YWluc2tpdC5jb20vcmVmZXJlbmNlLzU1NC90cnVfdGFncy1yb2FkbWFwIj5yb2FkbWFwPC9h PiwgYW5kIDxhIGhyZWY9Imh0dHA6Ly93d3cucmFpbnNraXQuY29tL3JlZmVyZW5jZS80OTcv dHJ1dGFncy11c2FnZS1pbnN0cnVjdGlvbnMiPnVzYWdlIGluc3RydWN0aW9uczwvYT4uPC9w PgoKCTxwPllvdSBjYW4gYWxzbyBmaW5kIHRoZSBzb3VyY2UgY29kZSBhdCA8YSBocmVmPSJo dHRwOi8vY29kZS5nb29nbGUuY29tL3AvdHJ1LXRhZ3MvIj5odHRwOi8vY29kZS5nb29nbGUu Y29tL3AvdHJ1LXRhZ3MvPC9hPi48L3A+CgoJPHA+SSYjODIxNzt2ZSB0YWtlbiB0aGUgZGV0 YWlsZWQgaGVscCBvdXQgb2YgdGhlIHBsdWdpbjsgbXkgYXBvbG9naWVzLiAgSXQgd2FzIHRv byBiaWcgYW5kIHRvbyBkaWZmaWN1bHQgdG8ga2VlcCBtYWludGFpbmluZyBvbiBteSBzaXRl IGFuZCBpbiB0aGUgcGx1Z2luLiAgSWYsIG15IHNpdGUgaXMgZXZlciBkb3duLCBob3dldmVy LCB0aGUgc291cmNlIDxzcGFuIGNsYXNzPSJjYXBzIj5IVE1MPC9zcGFuPiBvZiB0aGUgdXNh Z2UgaW5zdHJ1Y3Rpb25zIGlzIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vY29kZS5n b29nbGUuY29tL3AvdHJ1LXRhZ3Mvc291cmNlL2Jyb3dzZS90cnVuay90cnVfdGFncy1kb2Nz Lmh0bWwiPmh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC90cnUtdGFncy9zb3VyY2UvYnJvd3Nl L3RydW5rL3RydV90YWdzLWRvY3MuaHRtbDwvYT48L3A+IjtzOjQ6ImNvZGUiO3M6NDI2OTI6 IgojIENvcHlyaWdodCAyMDA5IE5hdGhhbiBBcnRodXIKIyBSZWxlYXNlZCB1bmRlciB0aGUg R05VIFB1YmxpYyBMaWNlbnNlLCBzZWUgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNl bnNlcy9ncGwtbGljZW5zZS5waHAgZm9yIGRldGFpbHMKIyBUaGlzIHdvcmsgd2FzIG9yaWdp bmFsbHkgaW5zcGlyZWQgYnkgcmFuX3RhZ3MgYnkgUmFuIEFyb3Vzc2ksIG9yaWdpbmFsbHkg Zm91bmQgYXQgaHR0cDovL2Fyb3Vzc2kuY29tL2FydGljbGUvNDUvdGFnZ2luZy10ZXh0cGF0 dGVybgojIEphdmFzY3JpcHQgYnVnIGZpeGVzIHdlcmUgcHJvdmlkZWQgYnkgdGhlX2dob3N0 IC0gaHR0cDovL3ZpY3RvcnVzLm5ldAojIEphdmFzY3JpcHQgY29kZSBmb3IgdGhlIHRhZyBh dXRvLWNvbXBsZXRlIGZlYXR1cmUgd2FzIHByb3ZpZGVkIGJ5IEppbSBCaWFuY29sbyAtIGh0 dHA6Ly93d3cuYmlhbmNvbG8uY29tLwoKCiMjIyBDT05GSUdVUkFUSU9OICMjIwojIyMjIyMj IyMjIyMjIyMjIyMjIyMKCiMgVFVSTiBCQUNLISAgQ29uZmlndXJhdGlvbiBpcyBubyBsb25n ZXIgaGFuZGxlZCBieSBlZGl0aW5nIHRoZSBwbHVnaW4uCiMgQ2hlY2sgb3V0IHRoZSAnRXh0 ZW5zaW9ucycgdGFiIGluIHRoZSBUZXh0cGF0dGVybiBhZG1pbiA6KQoKCiMgQ2hhbmdpbmcg dGhlc2Ugd29uJ3QgZG8gYW55IGdvb2QuICBUaGV5J3JlIGp1c3QgaGVyZSBhcyBhIGNvbnZl bmllbmNlIGZvciBkZXZlbG9wbWVudC4KZGVmaW5lKCdUUlVfVEFHU19GSUVMRCcsICdLZXl3 b3JkcycpOwpkZWZpbmUoJ0VOQ09ESU5HJywgJ3V0Zi04Jyk7CgpkZWZpbmUoJ0NMRUFOX1VS TFMnLCAnY2xlYW5fdXJscycpOwpkZWZpbmUoJ1RBR19TRUNUSU9OJywgJ3RhZ19zZWN0aW9u Jyk7CmRlZmluZSgnUEFSTV9OQU1FJywgJ3Bhcm0nKTsKZGVmaW5lKCdUQUdTX0lOX0ZFRURf Q0FURUdPUklFUycsICd0YWdzX2luX2ZlZWRfY2F0ZWdvcmllcycpOwpkZWZpbmUoJ1RBR1Nf SU5fRkVFRF9CT0RZJywgJ3RhZ3NfaW5fZmVlZF9ib2R5Jyk7CmRlZmluZSgnVEFHU19JTl9X UklURV9UQUInLCAndGFnc19pbl93cml0ZV90YWInKTsKZGVmaW5lKCdBVVRPQ09NUExFVEVf SU5fV1JJVEVfVEFCJywgJ2F1dG9jb21wbGV0ZV9pbl93cml0ZV90YWInKTsKZGVmaW5lKCdV VEZfOF9DQVNFJywgJ3V0Zl84X2Nhc2UnKTsKCmdsb2JhbCAkdHJ1X3RhZ3NfcHJlZnM7CiR0 cnVfdGFnc19wcmVmcyA9IHRydV90YWdzX2xvYWRfcHJlZnMoKTsKCgojIyMgUFJJTUFSWSBU QUcgRlVOQ1RJT05TICMjIwojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwoKZnVuY3Rp b24gdHJ1X3RhZ3NfaGFuZGxlcigkYXR0cykgewoJJHRhZ19wYXJhbWV0ZXIgPSB0cnVfdGFn c190YWdfcGFyYW1ldGVyKGFycmF5KCksIGZhbHNlKTsKCWlmICghZW1wdHkoJHRhZ19wYXJh bWV0ZXIpKSB7CgkJaWYgKHRydV90YWdzX3JlZGlyZWN0X2lmX25lZWRlZCgkdGFnX3BhcmFt ZXRlcikpIHsKCQkJcmV0dXJuICcnOwoJCX0KCQkkY2xlYW5fYXR0cyA9IHRydV90YWdzX2Zp eHVwX3F1ZXJ5X2F0dHMoJGF0dHMsICR0YWdfcGFyYW1ldGVyKTsKCQkkcmVzdWx0ID0gZG9B cnRpY2xlcygkY2xlYW5fYXR0cywgdHJ1ZSk7CQkjZnVuY3Rpb24gaW4gVFhQIGNvZGUKCQlp ZiAodHJpbSgkcmVzdWx0KSA9PSAnJykgewoJCQlpZiAoaXNzZXQoJGF0dHNbJ25vYXJ0aWNs ZXMnXSkpIHsKCQkJCXRydV90YWdzX3JlZGlyZWN0KCRhdHRzWydub2FydGljbGVzJ10sIHRy dWUpOwoJCQl9IGVsc2UgewoJCQkJdHhwX2RpZShnVHh0KCc0MDRfbm90X2ZvdW5kJyksICc0 MDQnKTsKCQkJfQoJCX0gZWxzZSB7CgkJCXJldHVybiAkcmVzdWx0OwoJCX0KCX0gZWxzZSB7 CgkJcmV0dXJuIHRydV90YWdzX2Nsb3VkKCRhdHRzKTsKCX0KfQoKCmZ1bmN0aW9uIHRydV90 YWdzX2FyY2hpdmUoJGF0dHMpIHsKCWdsb2JhbCAkdHJ1X3RhZ3NfY3VycmVudF9hcmNoaXZl X3RhZzsKCSR0YWdzID0gYXJyYXlfdW5pcXVlKHRydV90YWdzX2Nsb3VkX3F1ZXJ5KHRydV90 YWdzX2dldF9zdGFuZGFyZF9jbG91ZF9hdHRzKCRhdHRzLCBmYWxzZSwgZmFsc2UpKSk7Cglu YXRjYXNlc29ydCgkdGFncyk7Cglmb3JlYWNoICgkdGFncyBhcyAkdGFnKSB7CgkJJHRydV90 YWdzX2N1cnJlbnRfYXJjaGl2ZV90YWcgPSAkdGFnOwoJCSRjbGVhbl9hdHRzID0gdHJ1X3Rh Z3NfZml4dXBfcXVlcnlfYXR0cygkYXR0cywgJHRhZyk7CgkJJHJlc3VsdHNbXSA9IGRvQXJ0 aWNsZXMoJGNsZWFuX2F0dHMsIHRydWUpOwkJI2Z1bmN0aW9uIGluIFRYUCBjb2RlCgl9Cgly ZXR1cm4gam9pbignICcsICRyZXN1bHRzKTsKfQoKCmZ1bmN0aW9uIHRydV90YWdzX2N1cnJl bnRfYXJjaGl2ZV90YWcoJGF0dHMpIHsKCWdsb2JhbCAkdHJ1X3RhZ3NfY3VycmVudF9hcmNo aXZlX3RhZzsKCWV4dHJhY3QobEF0dHMoYXJyYXkoJ2xpbmsnID0+ICcwJyksICAkYXR0cywg MCkpOwoJaWYgKCRsaW5rKSB7CgkJcmV0dXJuICc8YSBocmVmPSInIC4gdHJ1X3RhZ3NfbGlu a2lmeV90YWcoJHRydV90YWdzX2N1cnJlbnRfYXJjaGl2ZV90YWcpIC4gJyI+JyAuICR0cnVf dGFnc19jdXJyZW50X2FyY2hpdmVfdGFnIC4gJzwvYT4nOwoJfSBlbHNlIHsKCQlyZXR1cm4g JHRydV90YWdzX2N1cnJlbnRfYXJjaGl2ZV90YWc7Cgl9Cn0KCgpmdW5jdGlvbiB0cnVfdGFn c19jbG91ZCgkYXR0cykgewoJcmV0dXJuIHRydV90YWdzX2xpc3QodHJ1X3RhZ3NfZ2V0X3N0 YW5kYXJkX2Nsb3VkX2F0dHMoJGF0dHMsIGZhbHNlLCBmYWxzZSkpOwp9CgoKZnVuY3Rpb24g dHJ1X3RhZ3NfbGlzdCgkYXR0cykgewoJJGF0dHMgPSB0cnVfdGFnc19nZXRfc3RhbmRhcmRf Y2xvdWRfYXR0cygkYXR0cywgdHJ1ZSwgZmFsc2UpOwoJJGFsbF90YWdzID0gdHJ1X3RhZ3Nf Y2xvdWRfcXVlcnkoJGF0dHMpOwoKCXJldHVybiB0cnVfdGFnc19yZW5kZXJfY2xvdWQoJGF0 dHMsICRhbGxfdGFncywgJGFsbF90YWdzKTsKfQoKCmZ1bmN0aW9uIHRydV90YWdzX2Zyb21f YXJ0aWNsZSgkYXR0cykgewoJZ2xvYmFsICR0aGlzYXJ0aWNsZTsKCWV4dHJhY3QoJHRoaXNh cnRpY2xlKTsKCgkkYWxsX3RhZ3MgPSB0cnVfdGFnc19nZXRfdGFnc19mb3JfYXJ0aWNsZSgk dGhpc2lkKTsKCgkkYXR0cyA9IHRydV90YWdzX2dldF9zdGFuZGFyZF9jbG91ZF9hdHRzKCRh dHRzLCBmYWxzZSwgdHJ1ZSk7CgkkYWxsX3RhZ3NfZm9yX3dlaWdodCA9ICRhbGxfdGFnczsK CWlmICgkYXR0c1sndXNlb3ZlcmFsbGNvdW50cyddKSB7CgkJJGFsbF90YWdzX2Zvcl93ZWln aHQgPSB0cnVfdGFnc19jbG91ZF9xdWVyeSgkYXR0cyk7Cgl9CgoJcmV0dXJuIHRydV90YWdz X3JlbmRlcl9jbG91ZCgkYXR0cywgJGFsbF90YWdzLCAkYWxsX3RhZ3NfZm9yX3dlaWdodCk7 Cn0KCgpmdW5jdGlvbiB0cnVfdGFnc19pZl9oYXNfdGFncygkYXR0cywgJHRoaW5nKSB7Cgln bG9iYWwgJHRoaXNhcnRpY2xlOwoJZXh0cmFjdCgkdGhpc2FydGljbGUpOwoKCSR0YWdzX2Zp ZWxkID0gVFJVX1RBR1NfRklFTEQ7CgoJJHJzID0gc2FmZV9yb3coJHRhZ3NfZmllbGQsICJ0 ZXh0cGF0dGVybiIsICJJRD0nJHRoaXNpZCcgQU5EICR0YWdzX2ZpZWxkIDw+ICcnIik7Cgly ZXR1cm4gcGFyc2UoRXZhbEVsc2UoJHRoaW5nLCAkcnMpKTsKfQoKCmZ1bmN0aW9uIHRydV90 YWdzX2lmX3RhZ19zZWFyY2goJGF0dHMsICR0aGluZykgewoJZXh0cmFjdChsQXR0cyhhcnJh eSgndGFnJyA9PiAnJyksICAkYXR0cywgMCkpOwoKCSR0YWdfcGFyYW1ldGVyID0gdHJ1X3Rh Z3NfdGFnX3BhcmFtZXRlcihhcnJheSgnc3RyaXBoeXBoZW5zJyA9PiAxKSwgZmFsc2UpOwoJ JGNvbmRpdGlvbiA9ICghZW1wdHkoJHRhZ19wYXJhbWV0ZXIpKSA/IHRydWUgOiBmYWxzZTsK CWlmICgkY29uZGl0aW9uICYmICFlbXB0eSgkdGFnKSkgewoJCSRjb25kaXRpb24gPSAoJHRh Z19wYXJhbWV0ZXIgPT0gJHRhZyk7Cgl9CglyZXR1cm4gcGFyc2UoRXZhbEVsc2UoJHRoaW5n LCAkY29uZGl0aW9uKSk7Cn0KCgpmdW5jdGlvbiB0cnVfdGFnc190YWdfcGFyYW1ldGVyKCRh dHRzLCAkc2FmZWh0bWwgPSB0cnVlKSB7CglnbG9iYWwgJHRydV90YWdzX3ByZWZzOwoJZXh0 cmFjdChsQXR0cyhhcnJheSgnc3RyaXBoeXBoZW5zJyA9PiAnMCcsICd1cmxlbmNvZGUnID0+ IDApLCAgJGF0dHMsIDApKTsKCgkkcGFybSA9IHVybGRlY29kZShzdHJpcF90YWdzKGdwcygk dHJ1X3RhZ3NfcHJlZnNbUEFSTV9OQU1FXS0+dmFsdWUpKSk7CglpZiAoJ2xvb2t1cCcgPT0g JHN0cmlwaHlwaGVucykgewoJCSRhdHRzID0gdHJ1X3RhZ3NfZ2V0X3N0YW5kYXJkX2Nsb3Vk X2F0dHMoYXJyYXkoKSwgZmFsc2UsIGZhbHNlKTsKCQkkdGFnX2xpc3QgPSBhcnJheV91bmlx dWUodHJ1X3RhZ3NfY2xvdWRfcXVlcnkoJGF0dHMpKTsKCQlmb3JlYWNoICgkdGFnX2xpc3Qg YXMgJGNsb3VkX3RhZykgewoJCQlpZiAoJHBhcm0gPT0gc3RyX3JlcGxhY2UoJyAnLCAnLScs ICRjbG91ZF90YWcpKSB7CgkJCQkkcGFybSA9ICRjbG91ZF90YWc7CgkJCQlicmVhazsKCQkJ fQoJCX0KCX0gZWxzZSBpZiAoJHN0cmlwaHlwaGVucykgewoJCSRwYXJtID0gc3RyX3JlcGxh Y2UoJy0nLCAnICcsICRwYXJtKTsKCX0KCWlmICgkdXJsZW5jb2RlKSB7CgkJJHBhcm0gPSB1 cmxlbmNvZGUoJHBhcm0pOwoJIH0gZWxzZSBpZiAoJHNhZmVodG1sKSB7CgkJJHBhcm0gPSBo dG1sc3BlY2lhbGNoYXJzKCRwYXJtKTsKCX0KCglyZXR1cm4gJHBhcm07Cn0KCgpmdW5jdGlv biB0cnVfdGFnc19zZWFyY2hfcGFyYW1ldGVyKCkgewoJdHJpZ2dlcl9lcnJvcihnVHh0KCdk ZXByZWNhdGVkX3RhZycpLCBFX1VTRVJfTk9USUNFKTsKCXJldHVybiBzdHJpcF90YWdzKGdw cygncScpKTsKfQoKCmZ1bmN0aW9uIHRydV90YWdzX3JlbGF0ZWRfdGFnc19mcm9tX3NlYXJj aCgkYXR0cykgewoJJHRhZ19wYXJhbWV0ZXIgPSB0cnVfdGFnc190YWdfcGFyYW1ldGVyKGFy cmF5KCksIGZhbHNlKTsKCWV4dHJhY3QobEF0dHMoYXJyYXkoJ3RhZ19wYXJhbWV0ZXInID0+ ICR0YWdfcGFyYW1ldGVyKSwgICRhdHRzLCAwKSk7CglpZiAoIWVtcHR5KCR0YWdfcGFyYW1l dGVyKSkgewogICAgICAgICR0YWdzX2ZpZWxkID0gVFJVX1RBR1NfRklFTEQ7CgkJJGFsbF90 YWdzID0gYXJyYXkoKTsKCgkJJHF1ZXJ5X2F0dHMgPSB0cnVfdGFnc19maXh1cF9xdWVyeV9h dHRzKCRhdHRzLCAkdGFnX3BhcmFtZXRlcik7CgkJJHJzID0gdHJ1X3RhZ3NfcmVkb19hcnRp Y2xlX3NlYXJjaCgkcXVlcnlfYXR0cyk7CgkJaWYgKCRycykgewoJCQl3aGlsZSAoJGEgPSBu ZXh0Um93KCRycykpIHsKCQkJCSRhcnRpY2xlX3RhZ3MgPSBhcnJheSgpOwoJCQkJaWYgKGFy cmF5X2tleV9leGlzdHMoJHRhZ3NfZmllbGQsICRhKSkgewoJCQkJCSRhcnRpY2xlX3RhZ3Mg PSBleHBsb2RlKCIsIiwgdHJpbSh0cnVfdGFnc19zdHJ0b2xvd2VyKCRhWyR0YWdzX2ZpZWxk XSkpKTsKCQkJCX0KCQkJCSRhbGxfdGFncyA9IGFycmF5X21lcmdlKCRhbGxfdGFncywgdHJ1 X3RhZ3NfdHJpbV90YWdzKCRhcnRpY2xlX3RhZ3MpKTsKCQkJfQoJCX0KCgkJJGFsdF90YWdf cGFyYW1ldGVyID0gc3RyX3JlcGxhY2UoJy0nLCAnICcsICR0YWdfcGFyYW1ldGVyKTsKCQlm b3JlYWNoICgkYWxsX3RhZ3MgYXMgJGtleSA9PiAkdGFnKSB7CgkJCWlmICgkdGFnID09ICR0 YWdfcGFyYW1ldGVyIHx8ICR0YWcgPT0gJGFsdF90YWdfcGFyYW1ldGVyKSB7CgkJCQl1bnNl dCgkYWxsX3RhZ3NbJGtleV0pOwoJCQl9CgkJfQoKCQkkY2xvdWRfYXR0cyA9IHRydV90YWdz X2dldF9zdGFuZGFyZF9jbG91ZF9hdHRzKCRhdHRzLCBmYWxzZSwgZmFsc2UpOwoJCSRhbGxf dGFnc19mb3Jfd2VpZ2h0ID0gJGFsbF90YWdzOwoJCWlmICgkY2xvdWRfYXR0c1sndXNlb3Zl cmFsbGNvdW50cyddKSB7CgkJCSRhbGxfdGFnc19mb3Jfd2VpZ2h0ID0gdHJ1X3RhZ3NfY2xv dWRfcXVlcnkoJGNsb3VkX2F0dHMpOwoJCX0KCgkJcmV0dXJuIHRydV90YWdzX3JlbmRlcl9j bG91ZCgkY2xvdWRfYXR0cywgJGFsbF90YWdzLCAkYWxsX3RhZ3NfZm9yX3dlaWdodCk7Cgl9 IGVsc2UgewoJCXJldHVybiAnJzsKCX0KfQoKCiMjIyBDTE9VRCBTVVBQT1JUIEZVTkNUSU9O UyAjIyMKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwoKZnVuY3Rpb24gdHJ1X3Rh Z3NfZ2V0X3N0YW5kYXJkX2Nsb3VkX2F0dHMoJGF0dHMsICRpc0xpc3QsICRpc0FydGljbGUp IHsKCXJldHVybiBsQXR0cyhhcnJheSgnd3JhcHRhZycJPT4gKCRpc0xpc3QgPyAndWwnIDog JycpLAoJCQknYnJlYWsnCQk9PiAoJGlzTGlzdCA/ICdsaScgOiAnLCAnKSwKCQkJJ2NsYXNz JwkJPT4gJycsCgkJCSdicmVha2NsYXNzJwk9PiAnJywKCQkJJ3NlY3Rpb24nCT0+ICcnLAoJ CQknbWlucGVyY2VudCcJPT4gJzEwMCcsCgkJCSdtYXhwZXJjZW50Jwk9PiAoJGlzTGlzdCB8 fCAkaXNBcnRpY2xlID8gJzEwMCcgOiAnMjAwJyksCgkJCSdzaG93Y291bnRzJwk9PiAnJywK CQkJJ2NvdW50d3JhcGNoYXJzJwk9PiAnW10nLAoJCQkndXNlcmVsdGFnJwk9PiAoJGlzQXJ0 aWNsZSA/ICcxJyA6ICcnKSwKCQkJJ2dlbmVyYXRlbGlua3MnCT0+ICcxJywKCQkJJ21pbnRh Z2NvdW50Jwk9PiAnMCcsCgkJCSdtYXh0YWdjb3VudCcJPT4gJzEwMDAnLAoJCQknc2V0c2l6 ZXMnCT0+ICgkaXNBcnRpY2xlID8gJzAnIDogJzEnKSwKCQkJJ3VzZW5vZm9sbG93Jwk9PiAn JywKCQkJJ3NvcnQnCQk9PiAnYWxwaGEnLAoJCQkndXNlb3ZlcmFsbGNvdW50cycJPT4gJycs CgkJCSdzZXRjbGFzc2VzJwk9PiAoJGlzQXJ0aWNsZSA/ICcwJyA6ICcxJyksCgkJCSd0aXRs ZScJCT0+ICcnLAoJCQknbGlzdGxpbWl0Jwk9PiAnJywKCQkJJ2tlZXAnCQk9PiAnbGFyZ2Vz dCcsCgkJCSdjdXRvZmYnCT0+ICdjaHVuaycsCgkJCSd0ZXh0dHJhbnNmb3JtJwk9PiAnbm9u ZScsCgkJCSdsaW5rcGF0aCcJPT4gJycsCgkJCSdsaW5rcGF0aHRhaWwnCT0+ICcnLAoJCQkn ZmlsdGVyc2VhcmNoJwk9PiAnMScsCgkJCSdleGNsdWRlc2VjdGlvbic9PiAnJywKCQkJJ2Fj dGl2ZWNsYXNzJwk9PiAndGFnQWN0aXZlJywKCQkJJ3RpbWUnCQk9PiAncGFzdCcKCQkpLCRh dHRzLCAwKTsKfQoKCmZ1bmN0aW9uIHRydV90YWdzX2Nsb3VkX3F1ZXJ5KCRhdHRzKSB7Cgll eHRyYWN0KCRhdHRzKTsKCgkkc2VjdGlvbl9jbGF1c2UgPSAnJzsKCWlmICgkc2VjdGlvbiA8 PiAnJykgewoJCSRrZXlzID0gc3BsaXQoJywnLCAkc2VjdGlvbik7CgkJZm9yZWFjaCAoJGtl eXMgYXMgJGtleSkgewoJCQkka2V5cGFydHNbXSA9ICIgU2VjdGlvbiA9ICciIC4gdHJpbSgk a2V5KSAuICInIjsKCQl9CgkJJHNlY3Rpb25fY2xhdXNlID0gIiBBTkQgKCIgLiBqb2luKCcg b3IgJywgJGtleXBhcnRzKSAuICIpIjsKCX0KCgkkdGFnc19maWVsZCA9IFRSVV9UQUdTX0ZJ RUxEOwoJaW5jbHVkZV9vbmNlIHR4cGF0aC4nL3B1Ymxpc2gvc2VhcmNoLnBocCc7CgoJJGZp bHRlciA9IHRydV90YWdzX2ZpbHRlcl9zZWN0aW9ucygkZXhjbHVkZXNlY3Rpb24pOwoJJGZp bHRlciAuPSAoJGZpbHRlcnNlYXJjaCA/IGZpbHRlclNlYXJjaCgpIDogJycpOwoKCXN3aXRj aCAoJHRpbWUpIHsKCQljYXNlICdhbnknOgoJCQkkdGltZSA9ICIiOyBicmVhazsKCQljYXNl ICdmdXR1cmUnOgoJCQkkdGltZSA9ICIgYW5kIFBvc3RlZCA+IG5vdygpIjsgYnJlYWs7CgkJ ZGVmYXVsdDoKCQkJJHRpbWUgPSAiIGFuZCBQb3N0ZWQgPD0gbm93KCkiOwoJfQoJZ2xvYmFs ICRwcmVmczsKCWV4dHJhY3QoJHByZWZzKTsKCWlmICghJHB1Ymxpc2hfZXhwaXJlZF9hcnRp Y2xlcykgewoJCSR0aW1lIC49ICIgYW5kIChub3coKSA8PSBFeHBpcmVzIG9yIEV4cGlyZXMg PSAiLk5VTExEQVRFVElNRS4iKSI7Cgl9CgoJJGFsbF90YWdzID0gYXJyYXkoKTsKCSRycyA9 IHNhZmVfcm93cygiJHRhZ3NfZmllbGQiLCAidGV4dHBhdHRlcm4iLCAiJHRhZ3NfZmllbGQg PD4gJyciIC4gJHNlY3Rpb25fY2xhdXNlIC4gJGZpbHRlciAuICIgYW5kIFN0YXR1cyA+PSAn NCciIC4gJHRpbWUpOwoJZm9yZWFjaCAoJHJzIGFzICRyb3cpIHsKCQkkdGVtcF9hcnJheSA9 IGFycmF5KCk7CgkJaWYgKGFycmF5X2tleV9leGlzdHMoJHRhZ3NfZmllbGQsICRyb3cpKSB7 CgkJCSR0ZW1wX2FycmF5ID0gZXhwbG9kZSgiLCIsIHRyaW0odHJ1X3RhZ3Nfc3RydG9sb3dl cigkcm93WyR0YWdzX2ZpZWxkXSkpKTsKCQl9CgkJJGFsbF90YWdzID0gYXJyYXlfbWVyZ2Uo JGFsbF90YWdzLCB0cnVfdGFnc190cmltX3RhZ3MoJHRlbXBfYXJyYXkpKTsKCX0KCglyZXR1 cm4gJGFsbF90YWdzOwp9CgoKZnVuY3Rpb24gdHJ1X3RhZ3NfZmlsdGVyX3NlY3Rpb25zKCRl eGNsdWRlc2VjdGlvbikgewoJJHNlY3Rpb25zID0gZXhwbG9kZSgnLCcsICRleGNsdWRlc2Vj dGlvbik7CgkkZmlsdGVycyA9IGFycmF5KCk7Cglmb3JlYWNoICgkc2VjdGlvbnMgYXMgJHNl Y3Rpb24pIHsKCQkkZmlsdGVyc1tdID0gImFuZCBTZWN0aW9uICE9ICciLmRvU2xhc2goJHNl Y3Rpb24pLiInIjsKCX0KCXJldHVybiBqb2luKCcgJywgJGZpbHRlcnMpOwp9CgoKZnVuY3Rp b24gdHJ1X3RhZ3NfcmVuZGVyX2Nsb3VkKCRhdHRzLCAkYWxsX3RhZ3MsICRhbGxfdGFnc19m b3Jfd2VpZ2h0KSB7CglnbG9iYWwgJHRydV90YWdzX3ByZWZzOwoJZXh0cmFjdCgkYXR0cyk7 CgoJJHRhZ3Nfd2VpZ2h0ID0gYXJyYXlfY291bnRfdmFsdWVzKCRhbGxfdGFnc19mb3Jfd2Vp Z2h0KTsKCglmb3JlYWNoICgkdGFnc193ZWlnaHQgYXMgJHRhZyA9PiAkd2VpZ2h0KSB7CgkJ aWYgKCFpbl9hcnJheSgkdGFnLCAkYWxsX3RhZ3MpCgkJICAgfHwgJHRhZ3Nfd2VpZ2h0WyR0 YWddIDwgJG1pbnRhZ2NvdW50CgkJICAgfHwgJHRhZ3Nfd2VpZ2h0WyR0YWddID4gJG1heHRh Z2NvdW50KSB7CgkJCXVuc2V0KCR0YWdzX3dlaWdodFskdGFnXSk7CgkJfQoJfQoKCSRzb3J0 X2J5X2NvdW50ID0gKHN0cnBvcygkc29ydCwgJ2NvdW50JykgIT09IGZhbHNlKTsKCSRzb3J0 X2FzY2VuZGluZyA9IChzdHJwb3MoJHNvcnQsICdhc2MnKSAhPT0gZmFsc2UpOwoJJHRhZ3Nf d2VpZ2h0ID0gdHJ1X3RhZ3Nfc29ydF90YWdzKCR0YWdzX3dlaWdodCwgJHNvcnRfYnlfY291 bnQsICRzb3J0X2FzY2VuZGluZyk7CgoJaWYgKCRsaXN0bGltaXQgPiAwICYmICRsaXN0bGlt aXQgPCBjb3VudCgkdGFnc193ZWlnaHQpKSB7CgkJJHJlc29ydGVkX3RhZ3MgPSBhcnJheSgp OwoJCWlmICgka2VlcCA9PSAnbGFyZ2VzdCcpIHsKCQkJJHJlc29ydGVkX3RhZ3MgPSBhcnJh eV9rZXlzKHRydV90YWdzX3NvcnRfdGFncygkdGFnc193ZWlnaHQsIHRydWUsIGZhbHNlKSk7 CgkJfSBlbHNlIHsKCQkJaWYgKCRrZWVwID09ICdyYW5kb20nKSB7CgkJCQlmb3JlYWNoICgk dGFnc193ZWlnaHQgYXMgJHRhZyA9PiAkd2VpZ2h0KSB7CgkJCQkJJHJlc29ydGVkX3RhZ3Nb JHRhZ10gPSByYW5kKDAsICR3ZWlnaHQpOwoJCQkJfQoJCQkJJHJlc29ydGVkX3RhZ3MgPSBh cnJheV9rZXlzKHRydV90YWdzX3NvcnRfdGFncygkcmVzb3J0ZWRfdGFncywgdHJ1ZSwgZmFs c2UpKTsKCQkJfSBlbHNlIGlmICgka2VlcCA9PSAnYWxwaGEnKSB7CgkJCQkkcmVzb3J0ZWRf dGFncyA9IGFycmF5X2tleXMoJHRhZ3Nfd2VpZ2h0KTsKCQkJCW5hdGNhc2Vzb3J0KCRyZXNv cnRlZF90YWdzKTsKCQkJfQoJCQkkY3V0b2ZmID0gJ2V4YWN0JzsKCQl9CgoJCSRsYXN0X2dv b2RfaW5kZXggPSAkbGlzdGxpbWl0IC0gMTsKCQlpZiAoJGN1dG9mZiA9PSAnY2h1bmsnKSB7 IC8vYWx0ZXJuYXRpdmUgaXMgJ2V4YWN0JwoJCQkkbGFzdF93ZWlnaHQgPSAtMTsKCQkJZm9y ICgkaSA9IDA7ICRpIDwgJGxpc3RsaW1pdCArIDE7ICRpKyspIHsKCQkJCSRuZXdfd2VpZ2h0 ID0gJHRhZ3Nfd2VpZ2h0WyRyZXNvcnRlZF90YWdzWyRpXV07CgkJCQlpZiAoJG5ld193ZWln aHQgIT0gJGxhc3Rfd2VpZ2h0KSB7CgkJCQkJJGxhc3RfZ29vZF9pbmRleCA9ICRpIC0gMTsK CQkJCQkkbGFzdF93ZWlnaHQgPSAkbmV3X3dlaWdodDsKCQkJCX0KCQkJfQoJCQlpZiAoJGxh c3RfZ29vZF9pbmRleCA8IDApIHsKCQkJCSRsYXN0X2dvb2RfaW5kZXggPSAkbGlzdGxpbWl0 IC0gMTsKCQkJfQoJCX0KCgkJJHJlc29ydGVkX3RhZ3MgPSBhcnJheV9jaHVuaygkcmVzb3J0 ZWRfdGFncywgJGxhc3RfZ29vZF9pbmRleCArIDEpOwoJCSRyZXNvcnRlZF90YWdzID0gJHJl c29ydGVkX3RhZ3NbMF07CgoJCWZvcmVhY2ggKCR0YWdzX3dlaWdodCBhcyAkdGFnID0+ICR3 ZWlnaHQpIHsKCQkJaWYgKCFpbl9hcnJheSgkdGFnLCAkcmVzb3J0ZWRfdGFncykpIHsKCQkJ CXVuc2V0KCR0YWdzX3dlaWdodFskdGFnXSk7CgkJCX0KCQl9Cgl9CgoJaWYgKCRnZW5lcmF0 ZWxpbmtzKSB7CgkJaWYgKCRsaW5rcGF0aCkgewoJCQkkdXJscHJlZml4ID0gJGxpbmtwYXRo OwoJCQkkdXJsc3VmZml4ID0gJGxpbmtwYXRodGFpbDsKCQl9IGVsc2UgewoJCQlpZiAodHJ1 X3RhZ3NfY2xlYW5fdXJscygpKSB7CgkJCQkkdXJscHJlZml4ID0gaHUgLiAkdHJ1X3RhZ3Nf cHJlZnNbVEFHX1NFQ1RJT05dLT52YWx1ZSAuICcvJzsKCQkJfSBlbHNlIHsKCQkJCSR1cmxw cmVmaXggPSBodSAuICc/cz0nIC4gJHRydV90YWdzX3ByZWZzW1RBR19TRUNUSU9OXS0+dmFs dWUgLiAnJmFtcDsnIC4gJHRydV90YWdzX3ByZWZzW1BBUk1fTkFNRV0tPnZhbHVlIC4gJz0n OwoJCQl9CgkJCSR1cmxzdWZmaXggPSAodHJ1X3RhZ3NfY2xlYW5fdXJscygpID8gJy8nIDog JycpOwoJCX0KCgkJaWYgKCR1c2VyZWx0YWcpIHsKCQkJaWYgKCR1c2Vub2ZvbGxvdykgewoJ CQkJJHVybHN1ZmZpeCAuPSAnIiByZWw9InRhZyBub2ZvbGxvdyc7CgkJCX0gZWxzZSB7CgkJ CQkkdXJsc3VmZml4IC49ICciIHJlbD0idGFnJzsKCQkJfQoJCX0gZWxzZSBpZiAoJHVzZW5v Zm9sbG93KSB7CgkJCSR1cmxzdWZmaXggLj0gJyIgcmVsPSJub2ZvbGxvdyc7CgkJfQoJfQoK CWlmIChjb3VudCgkdGFnc193ZWlnaHQpID4gMCkgewoJCSRtYXggPSBtYXgoJHRhZ3Nfd2Vp Z2h0KTsKCQkkbWluID0gbWluKCR0YWdzX3dlaWdodCk7Cgl9IGVsc2UgewoJCSRtYXggPSAk bWluID0gMDsKCX0KCSRzdGVwdmFsdWUgPSAoJG1heCA9PSAkbWluKSA/IDAgOiAoJG1heHBl cmNlbnQgLSAkbWlucGVyY2VudCkgLyAoJG1heCAtICRtaW4pOwoKCSR0YWdzX2h0bWwgPSBh cnJheSgpOwoJJHRhZ19zZWFyY2hfdGFnID0gdHJ1X3RhZ3NfdGFnX3BhcmFtZXRlcihhcnJh eSgnc3RyaXBoeXBoZW5zJyA9PiAnbG9va3VwJykpOwoJJHRhZ19zZWFyY2hfdGFnID0gZnVu Y3Rpb25fZXhpc3RzKCJodG1sc3BlY2lhbGNoYXJzX2RlY29kZSIpID8gaHRtbHNwZWNpYWxj aGFyc19kZWNvZGUoJHRhZ19zZWFyY2hfdGFnKSA6IGh0bWxfZW50aXR5X2RlY29kZSgkdGFn X3NlYXJjaF90YWcpOwoJZm9yZWFjaCAoJHRhZ3Nfd2VpZ2h0IGFzICR0YWcgPT4gJHdlaWdo dCkgewoJCSR0YWdfd2VpZ2h0ID0gZmxvb3IoJG1pbnBlcmNlbnQgKyAoJHdlaWdodCAtICRt aW4pICogJHN0ZXB2YWx1ZSk7CgoJCSRzdHlsZSA9ICcnOwoJCWlmICgkc2V0c2l6ZXMpCgkJ CSRzdHlsZSA9ICcgc3R5bGU9ImZvbnQtc2l6ZTogJyAuICR0YWdfd2VpZ2h0IC4gJyU7Iic7 CgoJCSR0YWdfY2xhc3MgPSAnJzsKCQlpZiAoJHNldGNsYXNzZXMpIHsKCQkJJHRhZ19jbGFz cyA9ICcgY2xhc3M9Iic7CgkJCWlmICgkd2VpZ2h0ID09ICRtaW4pIHsKCQkJCSR0YWdfY2xh c3MgLj0gInRhZ1NpemVTbWFsbGVzdCI7CgkJCX0gZWxzZSBpZiAoJHdlaWdodCA9PSAkbWF4 KSB7CgkJCQkkdGFnX2NsYXNzIC49ICJ0YWdTaXplTGFyZ2VzdCI7CgkJCX0gZWxzZSB7CgkJ CQkkdGFnX2NsYXNzIC49ICJ0YWdTaXplTWVkaXVtIjsKCQkJfQoJCQkkdGFnX2NsYXNzIC49 ICcgdGFnU2l6ZScgLiAoJHdlaWdodCArIDEgLSAkbWluKTsKCQkJaWYgKCR0YWcgPT0gJHRh Z19zZWFyY2hfdGFnKSB7CgkJCQkkdGFnX2NsYXNzIC49ICcgJyAuICRhY3RpdmVjbGFzczsK CQkJfQoJCQkkdGFnX2NsYXNzIC49ICciJzsKCQl9CgoJCS8vYWRhcHRlZCBmcm9tIGNvZGUg YnkgZ2R0cm9pYW5vLCBzZWUgaHR0cDovL2ZvcnVtLnRleHRwYXR0ZXJuLmNvbS92aWV3dG9w aWMucGhwP3BpZD0xMDI4NzUjcDEwMjg3NQoJCSR0aXRsZWNvdW50ID0gJyc7CgkJaWYgKCR0 aXRsZSkKCQkJJHRpdGxlY291bnQgPSAnIHRpdGxlPSInIC4gJHRpdGxlIC4gJyInOwoJCSRk aXNwbGF5Y291bnQ9ICcnOwoJCSRjb3VudCA9ICRjb3VudHdyYXBjaGFyc3swfSAuICR3ZWln aHQgLiAkY291bnR3cmFwY2hhcnN7MX07CgkJaWYgKCRzaG93Y291bnRzID09ICd0aXRsZScg fHwgJHNob3djb3VudHMgPT0gJ2JvdGgnKQoJCQkkdGl0bGVjb3VudCA9ICcgdGl0bGU9Iicg LiAkdGl0bGUgLiAkY291bnQgLiAnIic7CgkJaWYgKCRzaG93Y291bnRzICYmICRzaG93Y291 bnRzICE9ICd0aXRsZScpCgkJCSRkaXNwbGF5Y291bnQgPSAnICcgLiAkY291bnQ7CgoJCWlm ICgkdGV4dHRyYW5zZm9ybSA9PSAnY2FwaXRhbGl6ZScpIHsKCQkJJHRhZyA9IHRydV90YWdz X3Vjd29yZHMoJHRhZyk7CgkJfSBlbHNlIGlmICgkdGV4dHRyYW5zZm9ybSA9PSAndXBwZXJj YXNlJykgewoJCQkkdGFnID0gdHJ1X3RhZ3Nfc3RydG91cHBlcigkdGFnKTsKCQl9IGVsc2Ug aWYgKCR0ZXh0dHJhbnNmb3JtID09ICdsb3dlcmNhc2UnKSB7CgkJCSR0YWcgPSB0cnVfdGFn c19zdHJ0b2xvd2VyKCR0YWcpOwoJCX0gZWxzZSBpZiAoJHRleHR0cmFuc2Zvcm0gPT0gJ2Nh cGZpcnN0JykgewoJCQkkdGFnID0gdHJ1X3RhZ3NfdWNmaXJzdCgkdGFnKTsKCQl9CgoJCWlm ICgkZ2VuZXJhdGVsaW5rcykgewoJCQkkd2hvbGV1cmwgPSAnIicgLiAkdXJscHJlZml4IC4g dXJsZW5jb2RlKHN0cl9yZXBsYWNlKCcgJywgJy0nLCAkdGFnKSkgLiAkdXJsc3VmZml4IC4g JyInOwoJCQkkdGFnc19odG1sW10gPSAnPGEgaHJlZj0nIC4gJHdob2xldXJsIC4gJHRhZ19j bGFzcyAuICRzdHlsZSAuICR0aXRsZWNvdW50IC4gJz4nIC4gaHRtbHNwZWNpYWxjaGFycygk dGFnKSAuICc8L2E+JyAuICRkaXNwbGF5Y291bnQ7CgkJfSBlbHNlIGlmICgkdGFnX2NsYXNz IHx8ICRzdHlsZSB8fCAkdGl0bGVjb3VudCkgewoJCQkkdGFnc19odG1sW10gPSAnPHNwYW4n IC4gJHRhZ19jbGFzcyAuICRzdHlsZSAuICR0aXRsZWNvdW50IC4gJz4nIC4gaHRtbHNwZWNp YWxjaGFycygkdGFnKSAuICc8L3NwYW4+JyAuICRkaXNwbGF5Y291bnQ7CgkJfSBlbHNlIHsK CQkJJHRhZ3NfaHRtbFtdID0gaHRtbHNwZWNpYWxjaGFycygkdGFnKSAuICRkaXNwbGF5Y291 bnQ7CgkJfQoJfQoJcmV0dXJuIHRydV90YWdzX2RvX3dyYXAoJHRhZ3NfaHRtbCwgJHdyYXB0 YWcsICRicmVhaywgJGNsYXNzLCAkYnJlYWtjbGFzcyk7Cn0KCgojIyMgQ0xFQU4gVVJMIEZV TkNUSU9OUyAjIyMKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgppZiAodHJ1X3RhZ3Nf Y2xlYW5fdXJscygpKSB7CglyZWdpc3Rlcl9jYWxsYmFjaygndHJ1X3RhZ3NfY2xlYW5fdXJs X2hhbmRsZXInLCAncHJldGV4dCcpOwp9CgoKZnVuY3Rpb24gdHJ1X3RhZ3NfY2xlYW5fdXJs X2hhbmRsZXIoJGV2ZW50LCAkc3RlcCkgewoJZ2xvYmFsICR0cnVfdGFnc19wcmVmczsKCSRz dWJwYXRoID0gcHJlZ19yZXBsYWNlKCIvaHR0cHM/OlwvXC8uKihcLy4qKS9VaSIsIiQxIixo dSk7CgkkcmVnc2FmZXN1YnBhdGggPSBwcmVnX3F1b3RlKCRzdWJwYXRoLCAnLycpOwoJJHJl cSA9IHByZWdfcmVwbGFjZSgiL14kcmVnc2FmZXN1YnBhdGgvaSIsJy8nLCRfU0VSVkVSWydS RVFVRVNUX1VSSSddKTsKCgkkcXMgPSBzdHJwb3MoJHJlcSwgJz8nKTsKCSRxYXR0cyA9ICgk cXMgPyAnJicuc3Vic3RyKCRyZXEsICRxcyArIDEpIDogJycpOwoJaWYgKCRxcykgJHJlcSA9 IHN1YnN0cigkcmVxLCAwLCAkcXMpOwoKCSRwYXJ0cyA9IGFycmF5X3ZhbHVlcyhhcnJheV9m aWx0ZXIoc3BsaXQoJy8nLCAkcmVxKSkpOwoJaWYgKGNvdW50KCRwYXJ0cykgPT0gMiAmJiAk cGFydHNbMF0gPT0gJHRydV90YWdzX3ByZWZzW1RBR19TRUNUSU9OXS0+dmFsdWUpIHsKCQkk dGFnID0gJHBhcnRzWzFdOwoJCSRfU0VSVkVSWydRVUVSWV9TVFJJTkcnXSA9ICR0cnVfdGFn c19wcmVmc1tQQVJNX05BTUVdLT52YWx1ZSAuICc9JyAuICR0YWcgLiAkcWF0dHM7CgkJJF9T RVJWRVJbJ1JFUVVFU1RfVVJJJ10gPSAkc3VicGF0aCAuICR0cnVfdGFnc19wcmVmc1tUQUdf U0VDVElPTl0tPnZhbHVlIC4gJy8/JyAuICRfU0VSVkVSWydRVUVSWV9TVFJJTkcnXTsKCQlp ZiAoY291bnQoJF9QT1NUKSA+IDApIHsKCQkJJF9QT1NUWydzZWN0aW9uJ10gPSAkdHJ1X3Rh Z3NfcHJlZnNbVEFHX1NFQ1RJT05dLT52YWx1ZTsKCQkJJF9QT1NUWyR0cnVfdGFnc19wcmVm c1tQQVJNX05BTUVdLT52YWx1ZV0gPSAkdGFnOwoJCX0gZWxzZSB7CgkJCSRfR0VUWydzZWN0 aW9uJ10gPSAkdHJ1X3RhZ3NfcHJlZnNbVEFHX1NFQ1RJT05dLT52YWx1ZTsKCQkJJF9HRVRb JHRydV90YWdzX3ByZWZzW1BBUk1fTkFNRV0tPnZhbHVlXSA9ICR0YWc7CgkJfQoJfQp9CgoK ZnVuY3Rpb24gdHJ1X3RhZ3NfY2xlYW5fdXJscygpIHsKCWdsb2JhbCAkdHJ1X3RhZ3NfcHJl ZnM7CglyZXR1cm4gKCdjbGVhbicgPT0gJHRydV90YWdzX3ByZWZzW0NMRUFOX1VSTFNdLT52 YWx1ZSk7Cn0KCgojIyMgQURNSU4gU0lERSBGVU5DVElPTlMgIyMjCiMjIyMjIyMjIyMjIyMj IyMjIyMjIyMjIyMjIyMKCmlmIChAdHhwaW50ZXJmYWNlID09ICdhZG1pbicpIHsKCWFkZF9w cml2cygndHJ1X3RhZ3MnLCAnMSwyJyk7CglyZWdpc3Rlcl90YWIoJ2V4dGVuc2lvbnMnLCAn dHJ1X3RhZ3MnLCAndHJ1X3RhZ3MnKTsKCXJlZ2lzdGVyX2NhbGxiYWNrKCd0cnVfdGFnc19h ZG1pbl90YWInLCAndHJ1X3RhZ3MnKTsKCglpZiAoJHRydV90YWdzX3ByZWZzW1RBR1NfSU5f V1JJVEVfVEFCXS0+dmFsdWUgfHwgJHRydV90YWdzX3ByZWZzW0FVVE9DT01QTEVURV9JTl9X UklURV9UQUJdLT52YWx1ZSkgewoJCXJlZ2lzdGVyX2NhbGxiYWNrKCd0cnVfdGFnc19hZG1p bl93cml0ZV90YWJfaGFuZGxlcicsICdhcnRpY2xlJyk7Cgl9Cn0KCgpmdW5jdGlvbiB0cnVf dGFnc19hZG1pbl90YWIoJGV2ZW50LCAkc3RlcCkgewoJcmVxdWlyZV9wcml2cygndHJ1X3Rh Z3MnKTsKCgkkcmVzdWx0cyA9IHRydV90YWdzX2FkbWluX3RhYl9oYW5kbGVfaW5wdXQoKTsK CgkkYXR0cyA9IHRydV90YWdzX2dldF9zdGFuZGFyZF9jbG91ZF9hdHRzKGFycmF5KCksIGZh bHNlLCBmYWxzZSk7CgkkYWxsX3RhZ3MgPSB0cnVfdGFnc19jbG91ZF9xdWVyeSgkYXR0cyk7 CgkkY2xvdWQgPSB0cnVfdGFnc19yZW5kZXJfY2xvdWQoJGF0dHMsICRhbGxfdGFncywgJGFs bF90YWdzKTsKCgkkcmVkaXJlY3RzID0gdHJ1X3RhZ3NfbG9hZF9yZWRpcmVjdHMoKTsKCgl0 cnVfdGFnc19hZG1pbl90YWJfcmVuZGVyX3BhZ2UoJHJlc3VsdHMsICRjbG91ZCwgJHJlZGly ZWN0cyk7Cn0KCgpmdW5jdGlvbiB0cnVfdGFnc19hZG1pbl90YWJfcmVuZGVyX3BhZ2UoJHJl c3VsdHMsICRjbG91ZCwgJHJlZGlyZWN0cykgewoJZ2xvYmFsICRldmVudDsKCXBhZ2V0b3Ao J3RydV90YWdzJywgJycpOwoKCWluY2x1ZGUodHhwYXRoIC4gJy9pbmNsdWRlL3R4cF9wcmVm cy5waHAnKTsKCWdsb2JhbCAkdHJ1X3RhZ3NfcHJlZnM7CgoJZWNobyBzdGFydFRhYmxlKCds YXlvdXQnLCAnJywgJycsICcxMHB4JykuJzx0cj48dGQgc3R5bGU9ImJvcmRlci1yaWdodDoy cHggc29saWQgZ3JheSI+Jy4gICMgSSBrbm93LCBJIGtub3cuLi4KCQlzdGFydFRhYmxlKCds YXlvdXQnLCAnJywgJycsICcnLCAnMTBweCcpLic8dHI+PHRkIHN0eWxlPSJib3JkZXItYm90 dG9tOjJweCBzb2xpZCBncmF5Ij4nLgoJCQlzdGFydFRhYmxlKCdsaXN0JywgJycsICcnLCAn JywgJzMwMHB4JykuCgkJCQl0cihoQ2VsbChnVHh0KCdDdXJyZW50IHRhZ3MnKSkpLgoJCQkJ dHIodGQoJGNsb3VkKSkuCgkJCWVuZFRhYmxlKCkuCgkJJzwvdGQ+PC90cj48dHI+PHRkPicu CgkJCXN0YXJ0VGFibGUoJ2xpc3QnLCAnJywgJycsICcnLCAnMzAwcHgnKS4KCQkJCXRyKGhD ZWxsKGdUeHQoJ3RydV90YWdzIFJlZmVyZW5jZScpKSkuCgkJCQl0cih0ZCgnPGEgaHJlZj0i aHR0cDovL3d3dy5yYWluc2tpdC5jb20vcmVmZXJlbmNlLzQ5Ny90cnV0YWdzLXVzYWdlLWlu c3RydWN0aW9ucyI+VXNhZ2UgaW5zdHJ1Y3Rpb25zPC9hPicuCgkJCQknPGJyPjxhIGhyZWY9 Imh0dHA6Ly9mb3J1bS50ZXh0cGF0dGVybi5jb20vdmlld3RvcGljLnBocD9pZD0xNTA4NCI+ Rm9ydW0gcGFnZXM8L2E+Jy4KCQkJCSc8YnI+PGEgaHJlZj0iaHR0cDovL3d3dy5yYWluc2tp dC5jb20vcmVmZXJlbmNlLzUzNy90cnVfdGFncy1yZWxlYXNlcyI+UmVsZWFzZXMgcGFnZTwv YT4nLgoJCQkJJzxicj48YSBocmVmPSJodHRwOi8vd3d3LnJhaW5za2l0LmNvbS9yZWZlcmVu Y2UvNTU0L3RydV90YWdzLXJvYWRtYXAiPlJlbGVhc2Ugcm9hZG1hcDwvYT4nLgoJCQkJJzxi cj48YSBocmVmPSJodHRwOi8vd3d3LnJhaW5za2l0LmNvbS9yZWZlcmVuY2UvNDk1L3RydXRh Z3MtZmVhdHVyZS1saXN0Ij5GZWF0dXJlIGxpc3Q8L2E+Jy4KCQkJCSc8YnI+PGJyPjxhIGhy ZWY9Imh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC90cnUtdGFncy9zb3VyY2UvYnJvd3NlL3Ry dW5rL3RydV90YWdzLnBocCI+dHJ1X3RhZ3Mgc291cmNlIGNvZGU8L2E+Jy4KCQkJCSc8YnI+ PGEgaHJlZj0iaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3RydS10YWdzL3NvdXJjZS9icm93 c2UvdHJ1bmsvdHJ1X3RhZ3MtZG9jcy5odG1sIj5Tb3VyY2UgSFRNTCBmb3IgdGhlIHVzYWdl IGluc3RydWN0aW9uczwvYT4nLgoJCQkJJzxicj48YnI+PGEgaHJlZj0iaHR0cDovL3d3dy5y YWluc2tpdC5jb20vYmxvZy80OTMvdHJ1dGFncy1hLXRhZ2dpbmctcGx1Z2luLWZvci10ZXh0 cGF0dGVybiI+dHJ1X3RhZ3M8L2E+LCBieSA8YSBocmVmPSJodHRwOi8vd3d3LnJhaW5za2l0 LmNvbS8iPk5hdGhhbiBBcnRodXI8L2E+Jy4KCQkJCSc8YnI+PGJyPicuCgkJCQknPGRpdiBp ZD0icGF5cGFsIj48Zm9ybSBhY3Rpb249Imh0dHBzOi8vd3d3LnBheXBhbC5jb20vY2dpLWJp bi93ZWJzY3IiIG1ldGhvZD0icG9zdCI+PGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iY21k IiB2YWx1ZT0iX3MteGNsaWNrIiAvPjxpbnB1dCB0eXBlPSJpbWFnZSIgc3JjPSJodHRwczov L3d3dy5wYXlwYWwuY29tL2VuX1VTL2kvYnRuL3gtY2xpY2stYnV0MDQuZ2lmIiBuYW1lPSJz dWJtaXQiIGFsdD0iTWFrZSBhIGRvbmF0aW9uIHRvIE5hdGhhbiBBcnRodXIiIC8+PGltZyBh bHQ9IiIgYm9yZGVyPSIwIiBzcmM9Imh0dHBzOi8vd3d3LnBheXBhbC5jb20vZW5fVVMvaS9z Y3IvcGl4ZWwuZ2lmIiB3aWR0aD0iMSIgaGVpZ2h0PSIxIiAvPjxpbnB1dCB0eXBlPSJoaWRk ZW4iIG5hbWU9ImVuY3J5cHRlZCIgdmFsdWU9Ii0tLS0tQkVHSU4gUEtDUzctLS0tLU1JSUhU d1lKS29aSWh2Y05BUWNFb0lJSFFEQ0NCendDQVFFeGdnRXdNSUlCTEFJQkFEQ0JsRENCampF TE1Ba0dBMVVFQmhNQ1ZWTXhDekFKQmdOVkJBZ1RBa05CTVJZd0ZBWURWUVFIRXcxTmIzVnVk R0ZwYmlCV2FXVjNNUlF3RWdZRFZRUUtFd3RRWVhsUVlXd2dTVzVqTGpFVE1CRUdBMVVFQ3hR S2JHbDJaVjlqWlhKMGN6RVJNQThHQTFVRUF4UUliR2wyWlY5aGNHa3hIREFhQmdrcWhraUc5 dzBCQ1FFV0RYSmxRSEJoZVhCaGJDNWpiMjBDQVFBd0RRWUpLb1pJaHZjTkFRRUJCUUFFZ1lD OGkxVDI3bGpLZnBOVEVRaTB3S0hjZEd1bHh4a01xd2RDTW1iR3ZzODduLzRUc0p0aUFzcU1v Mmh5czdac0d5NVJGL083cytCMm9RNzZ6VWxUNTJXVzdRZVhVSzNHcDBucjJjUDNpb0JTdE51 K1JaNmprYW0yRTBGR0xYeVY2K1VOVkVPd2g4bG1vSVNSb3R2U3ZJZ1F5VExuRWVESHFHOXF2 VXpxdkYzU3FqRUxNQWtHQlNzT0F3SWFCUUF3Z2N3R0NTcUdTSWIzRFFFSEFUQVVCZ2dxaGtp Rzl3MERCd1FJcG1QWnJsclpmWm1BZ2FpZVBWYituOXNWZHN1ZmdHcm1BdzJyWEF6UjM5a1lx UFVKN24wTGlORG1kQXE3M0pvUDUza1p5OGdTcG92dWNMMlMwakMxc1hyY3BFTEFwTEw4QkZT SGZkTGlab1pTVi9DWU9wcEg1K2R4MllxRklkeUNDZGpJWDdvT1BnUXlBdWdSYTJRcjNiK3l1 dHVHMERGc2QrTEFKR2I4bDRDbm5yYm13ZFlLM05uVkRCUE9teEVPamxYVWdFemxGTFhtRTN3 NStNb1BLUWNwMm44ZmRKTHNnRzE1eG9WUEZ6Q2QvSzJnZ2dPSE1JSURnekNDQXV5Z0F3SUJB Z0lCQURBTkJna3Foa2lHOXcwQkFRVUZBRENCampFTE1Ba0dBMVVFQmhNQ1ZWTXhDekFKQmdO VkJBZ1RBa05CTVJZd0ZBWURWUVFIRXcxTmIzVnVkR0ZwYmlCV2FXVjNNUlF3RWdZRFZRUUtF d3RRWVhsUVlXd2dTVzVqTGpFVE1CRUdBMVVFQ3hRS2JHbDJaVjlqWlhKMGN6RVJNQThHQTFV RUF4UUliR2wyWlY5aGNHa3hIREFhQmdrcWhraUc5dzBCQ1FFV0RYSmxRSEJoZVhCaGJDNWpi MjB3SGhjTk1EUXdNakV6TVRBeE16RTFXaGNOTXpVd01qRXpNVEF4TXpFMVdqQ0JqakVMTUFr R0ExVUVCaE1DVlZNeEN6QUpCZ05WQkFnVEFrTkJNUll3RkFZRFZRUUhFdzFOYjNWdWRHRnBi aUJXYVdWM01SUXdFZ1lEVlFRS0V3dFFZWGxRWVd3Z1NXNWpMakVUTUJFR0ExVUVDeFFLYkds MlpWOWpaWEowY3pFUk1BOEdBMVVFQXhRSWJHbDJaVjloY0dreEhEQWFCZ2txaGtpRzl3MEJD UUVXRFhKbFFIQmhlWEJoYkM1amIyMHdnWjh3RFFZSktvWklodmNOQVFFQkJRQURnWTBBTUlH SkFvR0JBTUZIVHQzOFJNeExYSnlPMlNtUytOZGw3MlQ3b0tKNHU0dXcrNmF3bnRBTFdoMDNQ ZXdtSUp1emJBTFNjc1RTNHNab1MxZktjaUJHb2gxMWdJZkh6eWx2a2ROZS9oSmw2Ni9SR3Fy ajVyRmIwOHNBQUJOVHpEVGlxcU5wSmVCc1lzL2MyYWlHb3pwdFgyUmxuQmt0SCtTVU5wQWFq VzcyNE52Mld2aGlmNnNGQWdNQkFBR2pnZTR3Z2Vzd0hRWURWUjBPQkJZRUZKYWZmTHZHYnhl OVdUOVMxd29iN0JEV1pKUnJNSUc3QmdOVkhTTUVnYk13Z2JDQUZKYWZmTHZHYnhlOVdUOVMx d29iN0JEV1pKUnJvWUdVcElHUk1JR09NUXN3Q1FZRFZRUUdFd0pWVXpFTE1Ba0dBMVVFQ0JN Q1EwRXhGakFVQmdOVkJBY1REVTF2ZFc1MFlXbHVJRlpwWlhjeEZEQVNCZ05WQkFvVEMxQmhl VkJoYkNCSmJtTXVNUk13RVFZRFZRUUxGQXBzYVhabFgyTmxjblJ6TVJFd0R3WURWUVFERkFo c2FYWmxYMkZ3YVRFY01Cb0dDU3FHU0liM0RRRUpBUllOY21WQWNHRjVjR0ZzTG1OdmJZSUJB REFNQmdOVkhSTUVCVEFEQVFIL01BMEdDU3FHU0liM0RRRUJCUVVBQTRHQkFJRmZPbGFhZ0Zy bDcxK2pxNk9LaWRiV0ZTRStRNEZxUk92ZGdJT050aCs4a1NLLy9ZLzRpaHVFNFltdnpuNWNl RTNTL2lCU1FRTWp5dmIrczJUV2JRWUR3Y3AxMjlPUEliRDllcGRyNHRKT1VOaVNvanc3Qkh3 WVJpUGg1OFMxeEdsRmdIRlh3ckVCYjNkZ05iTVVhK3U0cWVjdHNNQVhwVkhuRDl3SXlmbUhN WUlCbWpDQ0FaWUNBUUV3Z1pRd2dZNHhDekFKQmdOVkJBWVRBbFZUTVFzd0NRWURWUVFJRXdK RFFURVdNQlFHQTFVRUJ4TU5UVzkxYm5SaGFXNGdWbWxsZHpFVU1CSUdBMVVFQ2hNTFVHRjVV R0ZzSUVsdVl5NHhFekFSQmdOVkJBc1VDbXhwZG1WZlkyVnlkSE14RVRBUEJnTlZCQU1VQ0d4 cGRtVmZZWEJwTVJ3d0dnWUpLb1pJaHZjTkFRa0JGZzF5WlVCd1lYbHdZV3d1WTI5dEFnRUFN QWtHQlNzT0F3SWFCUUNnWFRBWUJna3Foa2lHOXcwQkNRTXhDd1lKS29aSWh2Y05BUWNCTUJ3 R0NTcUdTSWIzRFFFSkJURVBGdzB3T0RBM01ETXdOREUwTVRKYU1DTUdDU3FHU0liM0RRRUpC REVXQkJUMHRrajRkWkxlL0U0UXdiaWIyOVhFZEh4QVlqQU5CZ2txaGtpRzl3MEJBUUVGQUFT QmdMNUpzUUhqUTlTZzRZM2VEV0tETzE2cit0ZkV6NFJZQUR0KzZoOTgxZmtWQ3hmTkhGRHhv ZkRjeHl6Uk1Zcjd5OTVjZG5WaTRBTlF3TVVZNnlKVzVqbS9HRDE3cmpnU3haTUV2c0FlNllj Q1NMSzVaYXBDdzFxbHlTcFBHWkJBM01UdDZPRCtvdlZvYS8xdjhDTnNFY0hwN2Y0dE94T1VT dzVQNG5IeUxQV2otLS0tLUVORCBQS0NTNy0tLS0tIj48L2Zvcm0+PC9kaXY+JwoJCQkJKSku CgkJCWVuZFRhYmxlKCkuCgkJJzwvdGQ+PC90cj4nLmVuZFRhYmxlKCkuCgknPC90ZD48dGQ+ Jy4KCQlzdGFydFRhYmxlKCdsYXlvdXQnLCAnJywgJycsICcxMHB4JykuJzx0cj48dGQgc3R5 bGU9ImJvcmRlci1ib3R0b206MnB4IHNvbGlkIGdyYXk7d2lkdGg6NDAwcHgiPic7CgoJCWlm ICgkcmVzdWx0cykgewoJCQllY2hvIHN0YXJ0VGFibGUoJ2xpc3QnLCAnJywgJycsICcnLCAn MTAwJScpLgoJCQkJdHIoaENlbGwoZ1R4dCgnUmVzdWx0cycpKSkuCgkJCQl0cih0ZGEoJHJl c3VsdHMpLCAnIHN0eWxlPSJjb2xvcjpyZWQiJykuCgkJCWVuZFRhYmxlKCk7CgkJCWVjaG8g JzwvdGQ+PC90cj48dHI+PHRkIHN0eWxlPSJib3JkZXItYm90dG9tOjJweCBzb2xpZCBncmF5 Ij4nOwoJCX0KCgoJCWVjaG8gc3RhcnRUYWJsZSgnbGlzdCcsICcnLCAnJywgJycsICcxMDAl JykuCgkJCXRyKHRhZyhnVHh0KCdBcnRpY2xlIFRhZyBNYWludGVuYW5jZScpLicgKCcuZ1R4 dCgnQ2FzZSBTZW5zaXRpdmUnKS4nISknLCAndGgnLCAnIGNvbHNwYW49IjUiJykpLgoJCQl0 cigKCQkJCWZvcm0oCgkJCQkJdGRhKGdUeHQoJ1JlbmFtZScpLic6ICcsICcgc3R5bGU9InZl cnRpY2FsLWFsaWduOm1pZGRsZSInKS4KCQkJCQl0ZCh0ZXh0X2lucHV0KCdtYXRjaHRhZycs ICcnLCAnMTUnKSkuCgkJCQkJdGRhKGdUeHQoJ3RvJykuJzonLCAnIHN0eWxlPSJ2ZXJ0aWNh bC1hbGlnbjptaWRkbGUiJykuCgkJCQkJdGQodGV4dF9pbnB1dCgncmVwbGFjZXRhZycsICcn LCAnMTUnKSkuCgkJCQkJdGQoZklucHV0KCdzdWJtaXQnLCAncmVwbGFjZScsIGdUeHQoJ1J1 bicpLCAncHVibGlzaCcpLmVJbnB1dCgndHJ1X3RhZ3MnKSksCgkJCQkJJycsICcgdmVyaWZ5 KFwnJyAuIGdUeHQoJ2FyZV95b3Vfc3VyZScpIC4gJ1wnKSInCgkJCQkpCgkJCSkuCgkJCXRy KAoJCQkJZm9ybSgKCQkJCQl0ZGEoZ1R4dCgnRGVsZXRlJykuJzogJywgJyBzdHlsZT0idmVy dGljYWwtYWxpZ246bWlkZGxlIicpLgoJCQkJCXRkKHRleHRfaW5wdXQoJ2RlbGV0ZXRhZycs ICcnLCAnMTUnKSkuCgkJCQkJdGRjcygnJywgMikuCgkJCQkJdGQoZklucHV0KCdzdWJtaXQn LCAnZGVsZXRlJywgZ1R4dCgnUnVuJyksICdwdWJsaXNoJykuZUlucHV0KCd0cnVfdGFncycp KSwKCQkJCQknJywgJyB2ZXJpZnkoXCcnIC4gZ1R4dCgnYXJlX3lvdV9zdXJlJykgLiAnXCcp IicKCQkJCSkKCQkJKS4KCQllbmRUYWJsZSgpOwoKCWVjaG8gJzwvdGQ+PC90cj48dHI+PHRk IHN0eWxlPSJib3JkZXItYm90dG9tOjJweCBzb2xpZCBncmF5Ij4nOwoKCQllY2hvIHN0YXJ0 VGFibGUoJ2xpc3QnLCAnJywgJycsICcnLCAnMTAwJScpLgoJCQl0cih0YWcoZ1R4dCgnUmVk aXJlY3Rpb25zJyksICd0aCcsICcgY29sc3Bhbj0iNCInKSk7CgkJCWZvcmVhY2ggKCRyZWRp cmVjdHMgYXMgJGxlZnR0YWcgPT4gJHJpZ2h0dGFnKSB7CgkJCQllY2hvIHRyKAoJCQkJCXRk YShocmVmKCRsZWZ0dGFnLCB0cnVfdGFnc19saW5raWZ5X3RhZygkbGVmdHRhZykpLCAnIHN0 eWxlPSJ0ZXh0LWFsaWduOiBjZW50ZXIiJykuCgkJCQkJdGRhKGh0bWxzcGVjaWFsY2hhcnMo Jz0+JyksICcgc3R5bGU9InRleHQtYWxpZ246IGNlbnRlciInKS4KCQkJCQl0ZGEoaHJlZigk cmlnaHR0YWcsIHRydV90YWdzX2xpbmtpZnlfdGFnKCRyaWdodHRhZykpLCAnIHN0eWxlPSJ0 ZXh0LWFsaWduOiBjZW50ZXIiJykuCgkJCQkJdGQoJzxhIGhyZWY9ImluZGV4LnBocD9ldmVu dD10cnVfdGFncyZhbXA7ZGVsZXRlX3JlZGlyZWN0PScudXJsZW5jb2RlKCRsZWZ0dGFnKS4n IiAgb25jbGljaz0icmV0dXJuIHZlcmlmeShcJycuZ1R4dCgnYXJlX3lvdV9zdXJlJykuJ1wn KSI+RGVsZXRlPC9hPicpCgkJCQkpOwoJCQl9CgkJCWVjaG8gdHIoCgkJCQknPGZvcm0gbmFt ZT0icmVkaXJlY3QiIGlkPSJyZWRpcmVjdCIgbWV0aG9kPSJwb3N0IiBhY3Rpb249ImluZGV4 LnBocD9ldmVudD10cnVfdGFncyIgb25zdWJtaXQ9InJldHVybiB2ZXJpZnkoXCcnLmdUeHQo J2FyZV95b3Vfc3VyZScpLidcJykiPicuCgkJCQkJdGRhKHRleHRfaW5wdXQoJ2xlZnR0YWcn LCAnJywgJzE1JyksICcgc3R5bGU9InRleHQtYWxpZ246Y2VudGVyIicpLgoJCQkJCXRkYSho dG1sc3BlY2lhbGNoYXJzKCc9PicpLCAnIHN0eWxlPSJ2ZXJ0aWNhbC1hbGlnbjptaWRkbGU7 dGV4dC1hbGlnbjpjZW50ZXIiJykuCgkJCQkJdGRhKHRleHRfaW5wdXQoJ3JpZ2h0dGFnJywg JycsICcxNScpLCAnIHN0eWxlPSJ0ZXh0LWFsaWduOmNlbnRlciInKS4KCQkJCQl0ZGEoJzxh IGhyZWY9IiMiIG9uY2xpY2s9ImlmICh2ZXJpZnkoXCcnLmdUeHQoJ2FyZV95b3Vfc3VyZScp LidcJykpIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwncmVkaXJlY3RcJykuc3VibWl0KCk7 IHJldHVybiBmYWxzZTsiPkFkZCBuZXc8L2E+JywgJyBzdHlsZT0idmVydGljYWwtYWxpZ246 bWlkZGxlIicpLgoJCQkJCWZJbnB1dCgnaGlkZGVuJywgJ3JlZGlyZWN0JywgJzEnKS4KCQkJ CSc8L2Zvcm0+JwoKCQkJKS4KCQllbmRUYWJsZSgpOwoKCWVjaG8gJzwvdGQ+PC90cj48dHI+ PHRkPic7CgoJCWVjaG8gc3RhcnRUYWJsZSgnbGlzdCcpLgoJCQl0cih0YWcoZ1R4dCgnUHJl ZmVyZW5jZXMnKSwgJ3RoJywgJyBjb2xzcGFuPSIyIicpKS4KCQkJZm9ybSgKCQkJCXRyKAoJ CQkJCXRkYShnVHh0KCdVc2UgY2xlYW4gVVJMcycpLicgKCcuZ1R4dCgnc2l0ZSBkZWZhdWx0 IGlzJykuJyAnLiR0cnVfdGFnc19wcmVmc1tDTEVBTl9VUkxTXS0+ZGVmYXVsdF92YWx1ZS4n KTogJywgJyBzdHlsZT0idmVydGljYWwtYWxpZ246bWlkZGxlIicpLgoJCQkJCXRkKHJhZGlv X2xpc3QoQ0xFQU5fVVJMUywKCQkJCQkJCWFycmF5KCdjbGVhbic9PmdUeHQoJ2NsZWFuJyks ICdtZXNzeSc9PmdUeHQoJ21lc3N5JykpLAoJCQkJCQkJJHRydV90YWdzX3ByZWZzW0NMRUFO X1VSTFNdLT52YWx1ZSkpCgkJCQkpLgoJCQkJdHIoCgkJCQkJdGRhKGdUeHQoJ1RhZyBzZWN0 aW9uIG5hbWUnKS4nIChkZWZhdWx0IGlzICInLiR0cnVfdGFnc19wcmVmc1tUQUdfU0VDVElP Tl0tPmRlZmF1bHRfdmFsdWUuJyIpOiAnLCAnIHN0eWxlPSJ2ZXJ0aWNhbC1hbGlnbjptaWRk bGUiJykuCgkJCQkJdGQodGV4dF9pbnB1dChUQUdfU0VDVElPTiwgJHRydV90YWdzX3ByZWZz W1RBR19TRUNUSU9OXS0+dmFsdWUsICcxNScpKQoJCQkJKS4KCQkJCXRyKAoJCQkJCXRkYShn VHh0KCdVUkwgcGFyYW1ldGVyIGZvciB0YWcgc2VhcmNoJykuJyAoZGVmYXVsdCBpcyAiJy4k dHJ1X3RhZ3NfcHJlZnNbUEFSTV9OQU1FXS0+ZGVmYXVsdF92YWx1ZS4nIik6ICcuCgkJCQkJ CSc8YnI+PGVtPih5b3Ugc2hvdWxkblwndCBjaGFuZ2UgdGhpcyB1bmxlc3MgeW91IHJlYWxs eSBrbm93IHdoYXQgeW91IGFyZSBkb2luZyk8L2VtPicsICcgc3R5bGU9InZlcnRpY2FsLWFs aWduOm1pZGRsZSInKS4KCQkJCQl0ZCh0ZXh0X2lucHV0KFBBUk1fTkFNRSwgJHRydV90YWdz X3ByZWZzW1BBUk1fTkFNRV0tPnZhbHVlLCAnMTUnKSkKCQkJCSkuCgkJCQl0cigKCQkJCQl0 ZGEoZ1R4dCgnUHV0IHRhZ3MgaW50byBSU1MvQXRvbSBmZWVkcywgaW4gIkNhdGVnb3J5IiBl bGVtZW50cycpLgoJCQkJCQknOiA8YnI+PGVtPih5b3UgcHJvYmFibHkgd2FudCB0aGlzKTwv ZW0+JywgJyBzdHlsZT0idmVydGljYWwtYWxpZ246bWlkZGxlIicpLgoJCQkJCXRkKHllc25v UmFkaW8oVEFHU19JTl9GRUVEX0NBVEVHT1JJRVMsICR0cnVfdGFnc19wcmVmc1tUQUdTX0lO X0ZFRURfQ0FURUdPUklFU10tPnZhbHVlKSkKCQkJCSkuCgkJCQl0cigKCQkJCQl0ZGEoJ0Fw cGVuZCB0aGUgdGFnIGxpc3QgdG8gdGhlIGJvZHkgb2YgUlNTL0F0b20gZmVlZHMsICcuCgkJ CQkJCSd3aXRoIGxpbmtzLCBhbmQgd2l0aCByZWw9InRhZyI6Jy4KCQkJCQkJJzxicj48ZW0+ KGlmIHRoaXMgaXMgdHVybmVkIG9uLCcuCgkJCQkJCSd5b3UgY2FuIGRlZmluZSBhICJtaXNj IiBmb3JtIG5hbWVkIHRydV90YWdzX2ZlZWRfdGFncyAnLgoJCQkJCQkndGhhdCB3aWxsIGJl IHVzZWQgdG8gcmVuZGVyIHRoZSB0YWdzIGluIHRoZSBmZWVkKTwvZW0+JywKCQkJCQkJJyBz dHlsZT0idmVydGljYWwtYWxpZ246bWlkZGxlIicpLgoJCQkJCXRkKHllc25vUmFkaW8oVEFH U19JTl9GRUVEX0JPRFksICR0cnVfdGFnc19wcmVmc1tUQUdTX0lOX0ZFRURfQk9EWV0tPnZh bHVlKSkKCQkJCSkuCgkJCQl0cigKCQkJCQl0ZGEoZ1R4dCgnU2hvdyBhIGNsaWNrYWJsZSBs aXN0IG9mIHRhZ3Mgb24gdGhlICJXcml0ZSIgcGFnZScpLic6ICcsCgkJCQkJCScgc3R5bGU9 InZlcnRpY2FsLWFsaWduOm1pZGRsZSInKS4KCQkJCQl0ZCh5ZXNub1JhZGlvKFRBR1NfSU5f V1JJVEVfVEFCLCAkdHJ1X3RhZ3NfcHJlZnNbVEFHU19JTl9XUklURV9UQUJdLT52YWx1ZSkp CgkJCQkpLgoJCQkJdHIoCgkJCQkJdGRhKGdUeHQoJ0F1dG9jb21wbGV0ZSB0YWdzIG9uIHRo ZSAiV3JpdGUiIHBhZ2UnKS4nOiA8YnI+Jy4KCQkJCQkJJzxlbT4ocmVxdWlyZXMgdGhhdCB0 aGUgPGEgaHJlZj0iaHR0cDovL2Jhc3Npc3RhbmNlLmRlL2pxdWVyeS1wbHVnaW5zL2pxdWVy eS1wbHVnaW4tYXV0b2NvbXBsZXRlLyI+alF1ZXJ5IEF1dG9jb21wbGV0ZSBwbHVnaW48L2E+ IDxjb2RlPi5jc3M8L2NvZGU+IGFuZCA8Y29kZT4ubWluLmpzPC9jb2RlPiBmaWxlcyBiZSB1 cGxvYWRlZCBpbnRvIGEgIjxjb2RlPmpzPC9jb2RlPiIgZm9sZGVyIG9uIHlvdXIgc2l0ZSk8 L2VtPicsCgkJCQkJCScgc3R5bGU9InZlcnRpY2FsLWFsaWduOm1pZGRsZSInKS4KCQkJCQl0 ZCh5ZXNub1JhZGlvKEFVVE9DT01QTEVURV9JTl9XUklURV9UQUIsICR0cnVfdGFnc19wcmVm c1tBVVRPQ09NUExFVEVfSU5fV1JJVEVfVEFCXS0+dmFsdWUpKQoJCQkJKS4KCQkJCXRyKAoJ CQkJCXRkYShnVHh0KCdDb252ZXJ0IHRhZ3MgdG8gbG93ZXJjYXNlIGJ5IGRlZmF1bHQnKS4n OiA8YnI+Jy4KCQkJCQkJJzxlbT4oeW91IHByb2JhYmx5IHdhbnQgdGhpcywgdW5sZXNzIHlv dSBhcmUgaGF2aW5nIHByb2JsZW1zIHdpdGggdXRmLTggY2hhcmFjdGVycyk8L2VtPicsCgkJ CQkJCScgc3R5bGU9InZlcnRpY2FsLWFsaWduOm1pZGRsZSInKS4KCQkJCQl0ZCh5ZXNub1Jh ZGlvKFVURl84X0NBU0UsICR0cnVfdGFnc19wcmVmc1tVVEZfOF9DQVNFXS0+dmFsdWUpKQoJ CQkJKS4KCQkJCXRyKAoJCQkJCXRkKCcnKS4KCQkJCQl0ZGEoZklucHV0KCdzdWJtaXQnLCAn cHJlZnMnLCBnVHh0KCdTYXZlJyksICdwdWJsaXNoJykuZUlucHV0KCd0cnVfdGFncycpLCAn IHN0eWxlPSJ0ZXh0LWFsaWduOnJpZ2h0IicpCgkJCQkpLAoJCQkJJycsICcgdmVyaWZ5KFwn JyAuIGdUeHQoJ2FyZV95b3Vfc3VyZScpIC4gJ1wnKSInCgkJCSkuCgkJZW5kVGFibGUoKS4n PC90ZD48L3RyPicuCgkJZW5kVGFibGUoKTsKCgllY2hvICc8L3RkPjwvdHI+Jy5lbmRUYWJs ZSgpOwp9CgoKZnVuY3Rpb24gdHJ1X3RhZ3NfYWRtaW5fdGFiX2hhbmRsZV9pbnB1dCgpIHsK CWlmIChncHMoJ3ByZWZzJykpIHsKCQlyZXR1cm4gdHJ1X3RhZ3NfYWRtaW5fdXBkYXRlX3By ZWZzKCk7Cgl9IGVsc2UgaWYgKGdwcygnZGVsZXRlJykpIHsKCQlyZXR1cm4gdHJ1X3RhZ3Nf YWRtaW5fZGVsZXRlX3RhZyhncHMoJ2RlbGV0ZXRhZycpKTsKCX0gZWxzZSBpZiAoZ3BzKCdy ZXBsYWNlJykpIHsKCQkkcmVzdWx0ID0gdHJ1X3RhZ3NfYWRtaW5fcmVwbGFjZV90YWcoZ3Bz KCdtYXRjaHRhZycpLCBncHMoJ3JlcGxhY2V0YWcnKSwgZmFsc2UpOwoJCXJldHVybiAkcmVz dWx0IC4gJzxicj4nIC4gdHJ1X3RhZ3NfYWRtaW5fcmVkaXJlY3RfdGFnKGdwcygnbWF0Y2h0 YWcnKSwgZ3BzKCdyZXBsYWNldGFnJykpOwoJfSBlbHNlIGlmIChncHMoJ3JlZGlyZWN0Jykp IHsKCQlyZXR1cm4gdHJ1X3RhZ3NfYWRtaW5fcmVkaXJlY3RfdGFnKGdwcygnbGVmdHRhZycp LCBncHMoJ3JpZ2h0dGFnJykpOwoJfSBlbHNlIGlmIChncHMoJ2RlbGV0ZV9yZWRpcmVjdCcp KSB7CgkJcmV0dXJuIHRydV90YWdzX2FkbWluX2RlbGV0ZV9yZWRpcmVjdChncHMoJ2RlbGV0 ZV9yZWRpcmVjdCcpKTsKCX0gZWxzZSB7CgkJcmV0dXJuICcnOwoJfQp9CgoKZnVuY3Rpb24g dHJ1X3RhZ3NfYWRtaW5fdXBkYXRlX3ByZWZzKCkgewoJZ2xvYmFsICR0cnVfdGFnc19wcmVm czsKCSRyZXN1bHRzID0gYXJyYXkoKTsKCWZvcmVhY2ggKCR0cnVfdGFnc19wcmVmcyBhcyAk cHJlZikgewoJCSR2YWxpZF92YWx1ZSA9ICRwcmVmLT52YWxpZGF0ZV92YWx1ZShncHMoJHBy ZWYtPm5hbWUpKTsKCQlpZiAoJHZhbGlkX3ZhbHVlICYmICR2YWxpZF92YWx1ZSA8PiBncHMo JHByZWYtPm5hbWUpKSB7CgkJCXJldHVybiAkdmFsaWRfdmFsdWU7ICAjIyMgdGhpcyBpcyBh IHNuZWFreSB3YXkgdG8gaGFuZGxlIHZhbGlkYXRpb24gLSBzb3JyeSA7KQoJCX0KCQlpZiAo JHZhbGlkX3ZhbHVlIDw+ICRwcmVmLT52YWx1ZSkgewoJCQlpZiAoJHZhbGlkX3ZhbHVlID09 ICRwcmVmLT5kZWZhdWx0X3ZhbHVlKSB7CgkJCQkkcmVzdWx0ID0gdHJ1X3RhZ3NfZGVsZXRl X3ByZWYoJHByZWYtPm5hbWUpOwoJCQl9IGVsc2UgewoJCQkJJHJlc3VsdCA9IHRydV90YWdz X3Vwc2VydF9wcmVmKCRwcmVmLT5uYW1lLCAkdmFsaWRfdmFsdWUpOwoJCQl9CgkJCWlmICgk cmVzdWx0KSB7CgkJCQkkcmVzdWx0c1tdID0gJ1VwZGF0ZWQgJyAuICRwcmVmLT5uYW1lOwoJ CQkJJHByZWYtPnZhbHVlID0gJHZhbGlkX3ZhbHVlOwoJCQl9IGVsc2UgewoJCQkJJHJlc3Vs dHNbXSA9ICdFcnJvciB1cGRhdGluZyAnIC4gJHByZWYtPm5hbWU7CgkJCX0KCQl9Cgl9Cglp ZiAoY291bnQoJHJlc3VsdHMpID09IDApIHsKCQlyZXR1cm4gJ05vIHJlY29yZHMgbmVlZCB1 cGRhdGluZyc7Cgl9IGVsc2UgewoJCXJldHVybiBqb2luKCc8YnI+JywgJHJlc3VsdHMpOwoJ fQp9CgoKZnVuY3Rpb24gdHJ1X3RhZ3NfdXBzZXJ0X3ByZWYoJG5hbWUsICR2YWx1ZSkgewoJ aWYgKCFzYWZlX3F1ZXJ5KCdjcmVhdGUgdGFibGUgaWYgbm90IGV4aXN0cyAnIC4gc2FmZV9w ZngoJ3RydV90YWdzX3ByZWZzJykuCgkJJyAobmFtZSB2YXJjaGFyKDI1NSkgcHJpbWFyeSBr ZXksICcuCgkJJ3ZhbHVlIHZhcmNoYXIoMjU1KSBub3QgbnVsbCknKSkgewoJCXJldHVybiAn U2VyaW91cyBlcnJvciAtIHVuYWJsZSB0byBjcmVhdGUgdGhlICcgLiBzYWZlX3BmeCgndHJ1 X3RhZ3NfcHJlZnMnKSAuICcgdGFibGUuJzsKCX0KCglyZXR1cm4gc2FmZV91cHNlcnQoJ3Ry dV90YWdzX3ByZWZzJywgJ3ZhbHVlPSInLiR2YWx1ZS4nIicsICduYW1lPSInLiRuYW1lLici Jyk7Cn0KCgpmdW5jdGlvbiB0cnVfdGFnc19kZWxldGVfcHJlZigkbmFtZSkgewoJaWYgKHNh ZmVfZGVsZXRlKCd0cnVfdGFnc19wcmVmcycsICduYW1lPSInLiRuYW1lLiciJykpIHsKCQlp ZiAoc2FmZV9jb3VudCgndHJ1X3RhZ3NfcHJlZnMnLCAnMScpID09IDAgJiYgIXNhZmVfcXVl cnkoJ2Ryb3AgdGFibGUgJyAuIHNhZmVfcGZ4KCd0cnVfdGFnc19wcmVmcycpKSkgewoJCQly ZXR1cm4gZmFsc2U7CgkJfQoJCXJldHVybiB0cnVlOwoJfSBlbHNlIHsKCQlyZXR1cm4gZmFs c2U7Cgl9Cn0KCgpmdW5jdGlvbiB0cnVfdGFnc19hZG1pbl9kZWxldGVfdGFnKCRkZWxldGV0 YWcpIHsKCWlmICh0cmltKCRkZWxldGV0YWcpKSB7CgkJcmV0dXJuIHRydV90YWdzX2FkbWlu X3JlcGxhY2VfdGFnKCRkZWxldGV0YWcsICcnLCB0cnVlKTsKCX0gZWxzZSB7CgkJcmV0dXJu ICdQbGVhc2UgZW50ZXIgYSB2YWx1ZSc7Cgl9Cn0KCgpmdW5jdGlvbiB0cnVfdGFnc19hZG1p bl9yZXBsYWNlX3RhZygkbWF0Y2h0YWcsICRyZXBsYWNldGFnLCAkYWxsb3dfYmxhbmtfcmVw bGFjZXRhZykgewoJJG1hdGNodGFnID0gdHJpbSgkbWF0Y2h0YWcpOwoJJHJlcGxhY2V0YWcg PSB0cmltKCRyZXBsYWNldGFnKTsKCWlmICgkbWF0Y2h0YWcgJiYgKCRhbGxvd19ibGFua19y ZXBsYWNldGFnIHx8ICRyZXBsYWNldGFnKSkgewoJCWlmIChzYWZlX3VwZGF0ZSgndGV4dHBh dHRlcm4nLCBUUlVfVEFHU19GSUVMRC4nPXRyaW0oYm90aCBcJyxcJyBmcm9tIHJlcGxhY2Uo Y29uY2F0KCIsIiwgJy5UUlVfVEFHU19GSUVMRC4nLCAiLCIpLCBjb25jYXQoIiwiLCBcJycu YWRkc2xhc2hlcygkbWF0Y2h0YWcpLidcJywgIiwiKSwgXCcsJy5hZGRzbGFzaGVzKCRyZXBs YWNldGFnKS4nLFwnKSknLCAnMScpKSB7CgkJCXJldHVybiAnVXBkYXRlZCAnLm15c3FsX2Fm ZmVjdGVkX3Jvd3MoKS4nIHJvd3MgKCInLmh0bWxzcGVjaWFsY2hhcnMoJG1hdGNodGFnKS4n Ij0+IicuaHRtbHNwZWNpYWxjaGFycygkcmVwbGFjZXRhZykuJyIpJzsKCQl9IGVsc2UgewoJ CQlyZXR1cm4gJ0Vycm9yOiAnIC4gbXlzcWxfZXJyb3IoKTsKCQl9Cgl9IGVsc2UgewoJCXJl dHVybiAnUGxlYXNlIGVudGVyIGEgdmFsdWUgaW4gYm90aCBmaWVsZHMnOwoJfQp9CgoKZnVu Y3Rpb24gdHJ1X3RhZ3NfYWRtaW5fcmVkaXJlY3RfdGFnKCRsZWZ0dGFnLCAkcmlnaHR0YWcp IHsKCSRsZWZ0dGFnID0gYWRkc2xhc2hlcyh0cnVfdGFnc19zdHJ0b2xvd2VyKHRyaW0oJGxl ZnR0YWcpKSk7CgkkcmlnaHR0YWcgPSBhZGRzbGFzaGVzKHRydV90YWdzX3N0cnRvbG93ZXIo dHJpbSgkcmlnaHR0YWcpKSk7CglpZiAoISRsZWZ0dGFnIHx8ICEkcmlnaHR0YWcpIHsKCQly ZXR1cm4gJ1BsZWFzZSBlbnRlciBhIHZhbHVlIGluIGJvdGggZmllbGRzJzsKCX0KCglpZiAo IXNhZmVfcXVlcnkoJ2NyZWF0ZSB0YWJsZSBpZiBub3QgZXhpc3RzICcgLiBzYWZlX3BmeCgn dHJ1X3RhZ3NfcmVkaXJlY3RzJykuCgkJJyAobGVmdHRhZyB2YXJjaGFyKDI1NSkgcHJpbWFy eSBrZXksICcuCgkJJ3JpZ2h0dGFnIHZhcmNoYXIoMjU1KSBub3QgbnVsbCknKSkgewoJCXJl dHVybiAnU2VyaW91cyBlcnJvciAtIHVuYWJsZSB0byBjcmVhdGUgdGhlICcgLiBzYWZlX3Bm eCgndHJ1X3RhZ3NfcmVkaXJlY3RzJykgLiAnIHRhYmxlLic7Cgl9CgoJaWYgKHNhZmVfaW5z ZXJ0KCd0cnVfdGFnc19yZWRpcmVjdHMnLCAnbGVmdHRhZz0iJy4kbGVmdHRhZy4nIixyaWdo dHRhZz0iJy4kcmlnaHR0YWcuJyInKSkgewoJCXJldHVybiAnUmVkaXJlY3QgYWRkZWQgKCIn Lmh0bWxzcGVjaWFsY2hhcnMoJGxlZnR0YWcpLiciPT4iJy5odG1sc3BlY2lhbGNoYXJzKCRy aWdodHRhZykuJyIpIC0gcGxlYXNlIHRlc3QgaXQhJzsKCX0gZWxzZSB7CgkJcmV0dXJuICdF cnJvciBhZGRpbmcgcmVjb3JkIC0gZG9lcyBpdCBhbHJlYWR5IGV4aXN0Pyc7Cgl9Cn0KCgpm dW5jdGlvbiB0cnVfdGFnc19hZG1pbl9kZWxldGVfcmVkaXJlY3QoJGxlZnR0YWcpIHsKCWlm IChzYWZlX2RlbGV0ZSgndHJ1X3RhZ3NfcmVkaXJlY3RzJywgJ2xlZnR0YWc9IicuYWRkc2xh c2hlcygkbGVmdHRhZykuJyInKSkgewoJCWlmIChzYWZlX2NvdW50KCd0cnVfdGFnc19yZWRp cmVjdHMnLCAnMScpID09IDAgJiYgIXNhZmVfcXVlcnkoJ2Ryb3AgdGFibGUgJyAuIHNhZmVf cGZ4KCd0cnVfdGFnc19yZWRpcmVjdHMnKSkpIHsKCQkJcmV0dXJuICdSZWRpcmVjdCBkZWxl dGVkLCBidXQgdW5hYmxlIHRvIGRyb3AgdGFibGUgJyAuIHNhZmVfcGZ4KCd0cnVfdGFnc19y ZWRpcmVjdHMnKTsKCQl9CgkJcmV0dXJuICdSZWRpcmVjdCBkZWxldGVkICgiJy5odG1sc3Bl Y2lhbGNoYXJzKCRsZWZ0dGFnKS4nIiknOwoJfSBlbHNlIHsKCQlyZXR1cm4gJ0Vycm9yIGRl bGV0aW5nIHJlZGlyZWN0JzsKCX0KfQoKCmZ1bmN0aW9uIHRydV90YWdzX2FkbWluX3dyaXRl X3RhYl9oYW5kbGVyKCRldmVudCwgJHN0ZXApIHsKCWdsb2JhbCAkdHJ1X3RhZ3NfcHJlZnM7 CgkkYXR0cyA9IHRydV90YWdzX2dldF9zdGFuZGFyZF9jbG91ZF9hdHRzKGFycmF5KCksIHRy dWUsIHRydWUpOwoJJGF0dHNbJ3RpbWUnXSA9ICdhbnknOwoJJGNsb3VkID0gYXJyYXlfdW5p cXVlKHRydV90YWdzX2Nsb3VkX3F1ZXJ5KCRhdHRzKSk7CgluYXRjYXNlc29ydCgkY2xvdWQp OwoKCSRpZCA9IChlbXB0eSgkR0xPQkFMU1snSUQnXSkgPyBncHMoJ0lEJykgOiAkR0xPQkFM U1snSUQnXSk7CgkkYXJ0aWNsZV90YWdzID0gKGVtcHR5KCRpZCkgPyBhcnJheSgpIDogdHJ1 X3RhZ3NfZ2V0X3RhZ3NfZm9yX2FydGljbGUoJGlkKSk7CgoJJGxpbmtzID0gYXJyYXkoKTsK CSRyYXdfY2xvdWQgPSAnJzsKCWZvcmVhY2ggKCRjbG91ZCBhcyAkdGFnKSB7CgkJJHN0eWxl ID0gKGluX2FycmF5KCR0YWcsICRhcnRpY2xlX3RhZ3MpID8gJyBjbGFzcz0idGFnX2Nob3Nl biInIDogJycpOwoJCSRsaW5rc1tdID0gJzxhIGhyZWY9IiNhZHZhbmNlZCInLiRzdHlsZS4n IG9uY2xpY2s9InRoaXMuc2V0QXR0cmlidXRlKFxcXCdjbGFzc1xcXCcsIHRvZ2dsZVRhZyhc XFwnJy5hZGRzbGFzaGVzKGFkZHNsYXNoZXMoJHRhZykpLidcXFwnKSk7IHJldHVybiBmYWxz ZTsiPicgLiBhZGRzbGFzaGVzKGh0bWxzcGVjaWFsY2hhcnMoJHRhZykpIC4gJzxcL2E+JzsK CQkkcmF3X2Nsb3VkIC49ICciJyAuIGFkZFNsYXNoZXMoJHRhZykgLiAnIiwnOwoJfQoJJHJh d19jbG91ZCA9IHN1YnN0cigkcmF3X2Nsb3VkLCAwLCBzdHJsZW4oJHJhd19jbG91ZCkgLSAx KTsKCSR0b19pbnNlcnQgPSBqb2luKCcsICcsICRsaW5rcyk7CgkkdG9faW5zZXJ0ID0gIjxz dHlsZT5hLnRhZ19jaG9zZW57YmFja2dyb3VuZC1jb2xvcjogI0ZFQjsgY29sb3I6IGJsYWNr O308L3N0eWxlPiIgLiAkdG9faW5zZXJ0OwoKCWlmICgkdHJ1X3RhZ3NfcHJlZnNbVEFHU19J Tl9XUklURV9UQUJdLT52YWx1ZSkgewoJCSRqcyA9IDw8PEVPRgoJCQl2YXIga2V5d29yZHNG aWVsZCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdrZXl3b3JkcycpOwoJCQlrZXl3b3Jk c0ZpZWxkLnBhcmVudE5vZGUuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgn YnInKSk7CgkJCXZhciBjbG91ZCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTsK CQkJY2xvdWQuc2V0QXR0cmlidXRlKCdjbGFzcycsICd0cnVfdGFnc19hZG1pbl90YWdzJyk7 CgkJCWNsb3VkLmlubmVySFRNTCA9ICd7JHRvX2luc2VydH0nOwoJCQlrZXl3b3Jkc0ZpZWxk LnBhcmVudE5vZGUuYXBwZW5kQ2hpbGQoY2xvdWQpOwoKCQkJZnVuY3Rpb24gdG9nZ2xlVGFn KHRhZ05hbWUpIHsKCQkJCXZhciByZWdleFRhZyA9IHRhZ05hbWUucmVwbGFjZSgvKFtcXFxc XF5cXCQqK1tcXF0/e30uPSE6KHwpXSkvZywiXFxcXCQxIik7CgkJCQl2YXIgdGFnUmVnZXgg PSBuZXcgUmVnRXhwKCIoKF58LClcXFxzKikiICsgcmVnZXhUYWcgKyAiXFxccyooLFxcXHMq fCQpIik7CgkJCQl2YXIgdGV4dGFyZWEgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgna2V5 d29yZHMnKTsKCQkJCXZhciBjdXJ2YWwgPSB0ZXh0YXJlYS52YWx1ZS5yZXBsYWNlKC8sP1xz KyQvLCAnJyk7CgkJCQlpZiAoJycgPT0gY3VydmFsKSB7CgkJCQkJdGV4dGFyZWEudmFsdWUg PSB0YWdOYW1lOwoJCQkJfSBlbHNlIGlmIChjdXJ2YWwubWF0Y2godGFnUmVnZXgpKSB7CgkJ CQkJdGV4dGFyZWEudmFsdWUgPSBjdXJ2YWwucmVwbGFjZSh0YWdSZWdleCwgJyQxJykucmVw bGFjZSgvLD9ccyskLywgJycpOwoJCQkJCXJldHVybiAnJzsKCQkJCX0gZWxzZSBpZiAoJywn ID09IGN1cnZhbC5jaGFyQXQoY3VydmFsLmxlbmd0aCAtIDEpKSB7CgkJCQkJdGV4dGFyZWEu dmFsdWUgKz0gJyAnICsgdGFnTmFtZTsKCQkJCX0gZWxzZSB7CgkJCQkJdGV4dGFyZWEudmFs dWUgKz0gJywgJyArIHRhZ05hbWU7CgkJCQl9CgkJCQlyZXR1cm4gJ3RhZ19jaG9zZW4nOwoJ CQl9CkVPRjsKCQllY2hvIHNjcmlwdF9qcygkanMpOwoJfQoKCWlmICgkdHJ1X3RhZ3NfcHJl ZnNbQVVUT0NPTVBMRVRFX0lOX1dSSVRFX1RBQl0tPnZhbHVlKSB7CgkJZWNobyA8PDxFT0YK CQkJPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi4vanMv anF1ZXJ5LmF1dG9jb21wbGV0ZS5jc3MiIG1lZGlhPSJwcm9qZWN0aW9uLCBzY3JlZW4iIC8+ CgkJCTxzY3JpcHQgc3JjPSIuLi9qcy9qcXVlcnkuYXV0b2NvbXBsZXRlLm1pbi5qcyIgdHlw ZT0idGV4dC9qYXZhc2NyaXB0Ij48L3NjcmlwdD4KCQkJPHNjcmlwdCBsYW5ndWFnZT0iSmF2 YVNjcmlwdCIgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij48IS0tCgkJCQkkKGRvY3VtZW50KS5y ZWFkeShmdW5jdGlvbigpeyB2YXIgdGFncyA9IG5ldyBBcnJheSh7JHJhd19jbG91ZH0pOwoJ CQkJCSQoIiNrZXl3b3JkcyIpLmF1dG9jb21wbGV0ZSh0YWdzLCB7IG11bHRpcGxlOiB0cnVl LCBtdXN0TWF0Y2g6IGZhbHNlLCBhdXRvRmlsbDogZmFsc2UgfSk7CgkJCQl9KTsKCQkJLy8t LT48L3NjcmlwdD4KRU9GOwoJfQoKfQoKCiMjIyBBVE9NL1JTUyBGRUVEIEZVTkNUSU9OUyAj IyMKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwoKcmVnaXN0ZXJfY2FsbGJhY2so J3RydV90YWdzX2F0b21faGFuZGxlcicsICdhdG9tX2VudHJ5Jyk7CmZ1bmN0aW9uIHRydV90 YWdzX2F0b21faGFuZGxlcigkZXZlbnQsICRzdGVwKSB7IHJldHVybiB0cnVfdGFnc19mZWVk X2hhbmRsZXIodHJ1ZSk7IH0KcmVnaXN0ZXJfY2FsbGJhY2soJ3RydV90YWdzX3Jzc19oYW5k bGVyJywgJ3Jzc19lbnRyeScpOwpmdW5jdGlvbiB0cnVfdGFnc19yc3NfaGFuZGxlcigkZXZl bnQsICRzdGVwKSB7IHJldHVybiB0cnVfdGFnc19mZWVkX2hhbmRsZXIoZmFsc2UpOyB9Cgpm dW5jdGlvbiB0cnVfdGFnc19mZWVkX2hhbmRsZXIoJGF0b20pIHsKCWdsb2JhbCAkdGhpc2Fy dGljbGUsICR0cnVfdGFnc19wcmVmczsKCWV4dHJhY3QoJHRoaXNhcnRpY2xlKTsKCgkkdGFn cyA9IHRydV90YWdzX2dldF90YWdzX2Zvcl9hcnRpY2xlKCR0aGlzaWQpOwoKCWlmICgkdHJ1 X3RhZ3NfcHJlZnNbVEFHU19JTl9GRUVEX0JPRFldLT52YWx1ZSkgewoJCSRleHRyYWJvZHkg PSAnJzsKCQkkRk9STV9OQU1FID0gJ3RydV90YWdzX2ZlZWRfdGFncyc7CgkJaWYgKGZldGNo KCdmb3JtJywgJ3R4cF9mb3JtJywgJ25hbWUnLCAkRk9STV9OQU1FKSkgewoJCQkkZm9ybSA9 IGZldGNoX2Zvcm0oJEZPUk1fTkFNRSk7CgkJCSRleHRyYWJvZHkgPSB0cmltKHBhcnNlKCRm b3JtKSk7CgkJfSBlbHNlIHsKCQkJJGF0dHMgPSB0cnVfdGFnc19nZXRfc3RhbmRhcmRfY2xv dWRfYXR0cyhhcnJheSgpLCBmYWxzZSwgdHJ1ZSk7CgkJCSRleHRyYWJvZHkgPSAnPHA+dGFn czogJyAuIHRydV90YWdzX3JlbmRlcl9jbG91ZCgkYXR0cywgJHRhZ3MsICR0YWdzKSAuICc8 L3A+JzsKCQl9CgkJZ2xvYmFsICR0aGlzYXJ0aWNsZTsKCQlpZiAodHJpbSgkdGhpc2FydGlj bGVbJ2V4Y2VycHQnXSkpIHsKCQkJJHRoaXNhcnRpY2xlWydleGNlcnB0J10gPSB0cmltKCR0 aGlzYXJ0aWNsZVsnZXhjZXJwdCddKS5uLiRleHRyYWJvZHkubjsKCQl9CgkJJHRoaXNhcnRp Y2xlWydib2R5J10gPSB0cmltKCR0aGlzYXJ0aWNsZVsnYm9keSddKS5uLiRleHRyYWJvZHku bjsKCX0KCglpZiAoJHRydV90YWdzX3ByZWZzW1RBR1NfSU5fRkVFRF9DQVRFR09SSUVTXS0+ dmFsdWUpIHsKCQkkb3V0cHV0ID0gYXJyYXkoKTsKCQlmb3JlYWNoICgkdGFncyBhcyAkdGFn KSB7CgkJCWlmICgkYXRvbSkgewoJCQkJJG91dHB1dFtdID0gJzxjYXRlZ29yeSB0ZXJtPSIn IC4gaHRtbHNwZWNpYWxjaGFycygkdGFnKSAuICciIC8+JzsKCQkJfSBlbHNlIHsKCQkJCSRv dXRwdXRbXSA9ICc8Y2F0ZWdvcnk+JyAuIGh0bWxzcGVjaWFsY2hhcnMoJHRhZykgLiAnPC9j YXRlZ29yeT4nOwoJCQl9CgkJfQoJCXJldHVybiBuLmpvaW4obiwgJG91dHB1dCkubjsKCX0K fQoKCiMjIyBQUkVGUyBGVU5DVElPTlMgLyBDTEFTU0VTICMjIwojIyMjIyMjIyMjIyMjIyMj IyMjIyMjIyMjIyMjIyMjIyMKCmNsYXNzIHRydV90YWdzX3ByZWYgewoJZnVuY3Rpb24gdHJ1 X3RhZ3NfcHJlZigkbmFtZSwgJGRlZmF1bHRfdmFsdWUsICR0eXBlKSB7CgkJJHRoaXMtPm5h bWUgPSAkbmFtZTsKCQkkdGhpcy0+dmFsdWUgPSAkZGVmYXVsdF92YWx1ZTsKCQkkdGhpcy0+ ZGVmYXVsdF92YWx1ZSA9ICRkZWZhdWx0X3ZhbHVlOwoJCSR0aGlzLT50eXBlID0gJHR5cGU7 Cgl9CgoJZnVuY3Rpb24gdmFsaWRhdGVfdmFsdWUoJHZhbHVlKSB7CgkJaWYgKCR2YWx1ZSkg ewoJCQlyZXR1cm4gJHZhbHVlOwoJCX0gZWxzZSBpZiAoJHRoaXMtPnR5cGUgPT0gJ2Jvb2xl YW4nKSB7CgkJCXJldHVybiAnMCc7CgkJfSBlbHNlIHsKCQkJcmV0dXJuICdQbGVhc2UgZW50 ZXIgYSB2YWx1ZSBmb3IgJyAuICR0aGlzLT5uYW1lOwoJCX0KCX0KfQoKZnVuY3Rpb24gdHJ1 X3RhZ3NfbG9hZF9wcmVmcygpIHsKCSRwcmVmcyA9IGFycmF5KCk7CgoJZ2xvYmFsICRwZXJt bGlua19tb2RlOwoJJHByZWZzW0NMRUFOX1VSTFNdID0gbmV3IHRydV90YWdzX3ByZWYoQ0xF QU5fVVJMUywgKCRwZXJtbGlua19tb2RlICE9ICdtZXNzeScgPyAnY2xlYW4nIDogJ21lc3N5 JyksICdzdHJpbmcnKTsKCSRwcmVmc1tUQUdfU0VDVElPTl0gPSBuZXcgdHJ1X3RhZ3NfcHJl ZihUQUdfU0VDVElPTiwgJ3RhZycsICdzdHJpbmcnKTsKCSRwcmVmc1tQQVJNX05BTUVdID0g bmV3IHRydV90YWdzX3ByZWYoUEFSTV9OQU1FLCAndCcsICdzdHJpbmcnKTsKCSRwcmVmc1tU QUdTX0lOX0ZFRURfQ0FURUdPUklFU10gPSBuZXcgdHJ1X3RhZ3NfcHJlZihUQUdTX0lOX0ZF RURfQ0FURUdPUklFUywgJzEnLCAnYm9vbGVhbicpOwoJJHByZWZzW1RBR1NfSU5fRkVFRF9C T0RZXSA9IG5ldyB0cnVfdGFnc19wcmVmKFRBR1NfSU5fRkVFRF9CT0RZLCAnMCcsICdib29s ZWFuJyk7CgkkcHJlZnNbVEFHU19JTl9XUklURV9UQUJdID0gbmV3IHRydV90YWdzX3ByZWYo VEFHU19JTl9XUklURV9UQUIsICcxJywgJ2Jvb2xlYW4nKTsKCSRwcmVmc1tBVVRPQ09NUExF VEVfSU5fV1JJVEVfVEFCXSA9IG5ldyB0cnVfdGFnc19wcmVmKEFVVE9DT01QTEVURV9JTl9X UklURV9UQUIsICcwJywgJ2Jvb2xlYW4nKTsKCSRwcmVmc1tVVEZfOF9DQVNFXSA9IG5ldyB0 cnVfdGFnc19wcmVmKFVURl84X0NBU0UsICcxJywgJ2Jvb2xlYW4nKTsKCglpZiAobXlzcWxf cXVlcnkoImRlc2NyaWJlICIgLiBQRlggLiAidHJ1X3RhZ3NfcHJlZnMiKSkgewoJCSRycyA9 IHNhZmVfcm93cygnKicsICd0cnVfdGFnc19wcmVmcycsICcxJyk7CgkJZm9yZWFjaCAoJHJz IGFzICRyb3cpIHsKCQkJJHByZWZzWyRyb3dbJ25hbWUnXV0tPnZhbHVlID0gJHJvd1sndmFs dWUnXTsKCQl9Cgl9CgoJcmV0dXJuICRwcmVmczsKfQoKCiMjIyBPVEhFUiBTVVBQT1JUIEZV TkNUSU9OUyAjIyMKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwoKZnVuY3Rpb24g dHJ1X3RhZ3NfcmVkaXJlY3RfaWZfbmVlZGVkKCR0YWdfcGFyYW1ldGVyKSB7CgkkcmVkaXJl Y3RzID0gdHJ1X3RhZ3NfbG9hZF9yZWRpcmVjdHMoKTsKCWZvcmVhY2ggKCRyZWRpcmVjdHMg YXMgJGxlZnR0YWcgPT4gJHJpZ2h0dGFnKSB7CgkJaWYgKCRsZWZ0dGFnID09ICR0YWdfcGFy YW1ldGVyIHx8ICRsZWZ0dGFnID09IHN0cl9yZXBsYWNlKCctJywgJyAnLCAkdGFnX3BhcmFt ZXRlcikpIHsKCQkJdHJ1X3RhZ3NfcmVkaXJlY3QoJHJpZ2h0dGFnLCBmYWxzZSk7CgkJCXJl dHVybiB0cnVlOwoJCX0KCX0KCglyZXR1cm4gZmFsc2U7Cn0KCgpmdW5jdGlvbiB0cnVfdGFn c19sb2FkX3JlZGlyZWN0cygpIHsKCSRyZWRpcmVjdHMgPSBhcnJheSgpOwoJaWYgKG15c3Fs X3F1ZXJ5KCJkZXNjcmliZSAiIC4gUEZYIC4gInRydV90YWdzX3JlZGlyZWN0cyIpKSB7CgkJ JHJzID0gc2FmZV9yb3dzKCcqJywgJ3RydV90YWdzX3JlZGlyZWN0cycsICcxIG9yZGVyIGJ5 IGxlZnR0YWcnKTsKCQlmb3JlYWNoICgkcnMgYXMgJHJvdykgewoJCQkkcmVkaXJlY3RzWyRy b3dbJ2xlZnR0YWcnXV0gPSAkcm93WydyaWdodHRhZyddOwoJCX0KCX0KCXJldHVybiAkcmVk aXJlY3RzOwp9CgoKZnVuY3Rpb24gdHJ1X3RhZ3NfcmVkaXJlY3QoJGRlc3RpbmF0aW9uLCAk aXNfZnVsbF91cmwpIHsKCWdsb2JhbCAkdHJ1X3RhZ3NfcHJlZnM7CglpZiAoJGlzX2Z1bGxf dXJsKSB7CgkJJHVybCA9ICRkZXN0aW5hdGlvbjsKCQkkbWVzc2FnZSA9ICdUaGUgcmVzb3Vy Y2UgeW91IHJlcXVlc3RlZCBoYXMgbW92ZWQgdG8gJyAuICRkZXN0aW5hdGlvbjsKCX0gZWxz ZSB7CgkJJHVybCA9IHRydV90YWdzX2xpbmtpZnlfdGFnKCRkZXN0aW5hdGlvbiwgZmFsc2Up OwoJCSRtZXNzYWdlID0gJ1RoZSByZXF1ZXN0ZWQgdGFnIGhhcyBiZWVuIHJlcGxhY2VkIGJ5 ICcgLiAkZGVzdGluYXRpb247Cgl9CgoJaGVhZGVyKCdMb2NhdGlvbjogJyAuICR1cmwpOwoJ dHhwX2RpZSgkbWVzc2FnZSwgJzMwMScpOwp9CgoKZnVuY3Rpb24gdHJ1X3RhZ3NfbGlua2lm eV90YWcoJHRhZywgJHVzZV9hbXAgPSB0cnVlKSB7CglnbG9iYWwgJHRydV90YWdzX3ByZWZz OwoJaWYgKHRydV90YWdzX2NsZWFuX3VybHMoKSkgewoJCSR1cmxwcmVmaXggPSBodSAuICR0 cnVfdGFnc19wcmVmc1tUQUdfU0VDVElPTl0tPnZhbHVlIC4gJy8nOwoJfSBlbHNlIHsKCQkk dXJscHJlZml4ID0gaHUgLiAnP3M9JyAuICR0cnVfdGFnc19wcmVmc1tUQUdfU0VDVElPTl0t PnZhbHVlIC4gKCR1c2VfYW1wID8gJyZhbXA7JyA6ICcmJykgLiAkdHJ1X3RhZ3NfcHJlZnNb UEFSTV9OQU1FXS0+dmFsdWUgLiAnPSc7Cgl9CgkkdXJsc3VmZml4ID0gKHRydV90YWdzX2Ns ZWFuX3VybHMoKSA/ICcvJyA6ICcnKTsKCXJldHVybiAkdXJscHJlZml4IC4gdXJsZW5jb2Rl KHN0cl9yZXBsYWNlKCcgJywgJy0nLCAkdGFnKSkgLiAkdXJsc3VmZml4Owp9CgoKZnVuY3Rp b24gdHJ1X3RhZ3NfZ2V0X3RhZ3NfZm9yX2FydGljbGUoJGFydGljbGVJRCkgewoJJHRhZ3Nf ZmllbGQgPSBUUlVfVEFHU19GSUVMRDsKCSRycyA9IHNhZmVfcm93KCR0YWdzX2ZpZWxkLCAi dGV4dHBhdHRlcm4iLCAiSUQ9JyRhcnRpY2xlSUQnIEFORCAkdGFnc19maWVsZCA8PiAnJyIp OwoJJGFsbF90YWdzID0gYXJyYXkoKTsKCWlmIChhcnJheV9rZXlfZXhpc3RzKCR0YWdzX2Zp ZWxkLCAkcnMpKSB7CgkJJGFsbF90YWdzID0gZXhwbG9kZSgiLCIsIHRyaW0odHJ1X3RhZ3Nf c3RydG9sb3dlcigkcnNbJHRhZ3NfZmllbGRdKSkpOwoJfQoKCXJldHVybiB0cnVfdGFnc190 cmltX3RhZ3MoJGFsbF90YWdzKTsKfQoKCiMgZml4ZXMgYnVnIHdpdGggNC4wLjQncyB2ZXJz aW9uIG9mIGRvV3JhcCB0aGF0IGNhdXNlZCBzcGFjZXMgdG8gc2hvdyB1cCBiZWZvcmUgdGhl IGNvbW1hcwpmdW5jdGlvbiB0cnVfdGFnc19kb193cmFwKCRsaXN0LCAkd3JhcHRhZywgJGJy ZWFrLCAkY2xhc3MsICRicmVha2NsYXNzKSB7CglpZiAoISR3cmFwdGFnICYmICFwcmVnX21h dGNoKCcvXlx3KyQvJywgJGJyZWFrKSkgewoJCXJldHVybiBqb2luKCRicmVhay5uLCAkbGlz dCk7Cgl9IGVsc2UgewoJCXJldHVybiBkb1dyYXAoJGxpc3QsICR3cmFwdGFnLCAkYnJlYWss ICRjbGFzcywgJGJyZWFrY2xhc3MpOwoJfQp9CgoKZnVuY3Rpb24gdHJ1X3RhZ3NfdHJpbV90 YWdzKCR0YWdfYXJyYXkpIHsKCSR0cmltbWVkID0gYXJyYXkoKTsKCWZvcmVhY2ggKCR0YWdf YXJyYXkgYXMgJHRhZykgewoJCWlmICgiIiAhPSB0cmltKCR0YWcpKSB7CgkJCSR0cmltbWVk W10gPSB0cmltKCR0YWcpOwoJCX0KCX0KCXJldHVybiAkdHJpbW1lZDsKfQoKCmZ1bmN0aW9u IHRydV90YWdzX2ZpeHVwX3F1ZXJ5X2F0dHMoJGF0dHMsICR0YWdfcGFyYW1ldGVyKSB7Cgkk a2V5d29yZHMgPSBleHBsb2RlKCcsJywgJHRhZ19wYXJhbWV0ZXIpOwoJZm9yZWFjaCAoJGtl eXdvcmRzIGFzICRrZXl3b3JkKSB7CgkJaWYgKHN0cnBvcygka2V5d29yZCwgJy0nKSAhPT0g ZmFsc2UpIHsKCQkJJGtleXdvcmRzW10gPSBzdHJfcmVwbGFjZSgnLScsICcgJywgJGtleXdv cmQpOwoJCX0KCX0KCSRhdHRzWydrZXl3b3JkcyddID0gaW1wbG9kZSgnLCcsICRrZXl3b3Jk cyk7CgoJaWYgKGlzc2V0KCRhdHRzWydzZWN0aW9uJ10pICYmIHN0cnBvcygkYXR0c1snc2Vj dGlvbiddLCAnLCcpICE9PSBmYWxzZSkgewoJCSRhdHRzWydzZWN0aW9uJ10gPSAnJzsKCX0K CglpZiAoaXNzZXQoJGF0dHNbJ2V4Y2x1ZGVzZWN0aW9uJ10pKSB7CgkJdW5zZXQoJGF0dHNb J2V4Y2x1ZGVzZWN0aW9uJ10pOwoJfQoKCWlmIChpc3NldCgkYXR0c1snbm9hcnRpY2xlcydd KSkgewoJCXVuc2V0KCRhdHRzWydub2FydGljbGVzJ10pOwoJfQoKCWlmICghaXNzZXQoJGF0 dHNbJ2xpbWl0J10pKSB7CgkJJGF0dHNbJ2xpbWl0J10gPSAnMTAwMCc7Cgl9CgoJaWYgKCFp c3NldCgkYXR0c1snYWxsb3dvdmVycmlkZSddKSkgewoJCSRhdHRzWydhbGxvd292ZXJyaWRl J10gPSB0cnVlOwoJfQoKCWlmIChpc3NldCgkYXR0c1snc2VhcmNoZm9ybSddKSAmJiAhaXNz ZXQoJGF0dHNbJ2xpc3Rmb3JtJ10pKSB7CgkJJGF0dHNbJ2xpc3Rmb3JtJ10gPSAkYXR0c1sn c2VhcmNoZm9ybSddOwoJfQoKCXJldHVybiAkYXR0czsKfQoKCmZ1bmN0aW9uIHRydV90YWdz X3N0cnRvbG93ZXIoJHN0cikgewoJZ2xvYmFsICR0cnVfdGFnc19wcmVmczsKCWlmICgkdHJ1 X3RhZ3NfcHJlZnNbVVRGXzhfQ0FTRV0tPnZhbHVlKSB7CgkJaWYgKGZ1bmN0aW9uX2V4aXN0 cygnbWJfc3RydG9sb3dlcicpKSB7CgkJCXJldHVybiBtYl9zdHJ0b2xvd2VyKCRzdHIsIEVO Q09ESU5HKTsKCQl9IGVsc2UgewoJCQlyZXR1cm4gc3RydG9sb3dlcigkc3RyKTsKCQl9Cgl9 IGVsc2UgewoJCXJldHVybiAkc3RyOwoJfQp9CgpmdW5jdGlvbiB0cnVfdGFnc19zdHJ0b3Vw cGVyKCRzdHIpIHsKCWlmIChmdW5jdGlvbl9leGlzdHMoJ21iX3N0cnRvdXBwZXInKSkgewoJ CXJldHVybiBtYl9zdHJ0b3VwcGVyKCRzdHIsIEVOQ09ESU5HKTsKCX0gZWxzZSB7CgkJcmV0 dXJuIHN0cnRvdXBwZXIoJHN0cik7Cgl9Cn0KCmZ1bmN0aW9uIHRydV90YWdzX3VjZmlyc3Qo JHN0cikgewoJaWYgKGZ1bmN0aW9uX2V4aXN0cygnbWJfc3Vic3RyJykgJiYgZnVuY3Rpb25f ZXhpc3RzKCdtYl9zdHJ0b3VwcGVyJykgJiYgZnVuY3Rpb25fZXhpc3RzKCdtYl9zdHJsZW4n KSAmJiBtYl9zdHJsZW4oJHN0ciwgRU5DT0RJTkcpID4gMSkgewoJCXJldHVybiBtYl9zdHJ0 b3VwcGVyKG1iX3N1YnN0cigkc3RyLCAwLCAxLCBFTkNPRElORyksIEVOQ09ESU5HKSAuIG1i X3N1YnN0cigkc3RyLCAxLCBtYl9zdHJsZW4oJHN0ciwgRU5DT0RJTkcpLCBFTkNPRElORyk7 Cgl9IGVsc2UgewoJCXJldHVybiB1Y2ZpcnN0KCRzdHIpOwoJfQp9CgpmdW5jdGlvbiB0cnVf dGFnc191Y3dvcmRzKCRzdHIpIHsKCWlmIChmdW5jdGlvbl9leGlzdHMoJ21iX2NvbnZlcnRf Y2FzZScpKSB7CgkJcmV0dXJuIG1iX2NvbnZlcnRfY2FzZSgkc3RyLCBNQl9DQVNFX1RJVExF LCBFTkNPRElORyk7Cgl9IGVsc2UgewoJCXJldHVybiB1Y3dvcmRzKCRzdHIpOwoJfQp9CgoK Ly90aGVzZSBuZXh0IHR3byBmdW5jdGlvbnMgYXJlIGdyb3NzLCBidXQgSSBjYW4ndCBmaWd1 cmUgb3V0IGFub3RoZXIgd2F5IHRvIGRvIGl0CmZ1bmN0aW9uIHRydV90YWdzX3NvcnRfdGFn cygkdGFnc193ZWlnaHQsICRzb3J0X2J5X2NvdW50LCAkc29ydF9hc2NlbmRpbmcpIHsKCWds b2JhbCAkdHJ1X3RhZ3NfdGFnc193ZWlnaHQsICR0cnVfdGFnc19zb3J0X2FzY2VuZGluZzsK CgkkdHJ1X3RhZ3NfdGFnc193ZWlnaHQgPSAkdGFnc193ZWlnaHQ7CgkkdHJ1X3RhZ3Nfc29y dF9hc2NlbmRpbmcgPSAkc29ydF9hc2NlbmRpbmc7CgoJJHRlbXBfYXJyYXkgPSBhcnJheV9r ZXlzKCR0YWdzX3dlaWdodCk7CglpZiAoJHNvcnRfYnlfY291bnQpIHsKCQl1c29ydCgkdGVt cF9hcnJheSwgInRydV90YWdzX3NvcnRfdGFnc19jb21wYXJhdG9yIik7Cgl9IGVsc2UgewoJ CW5hdGNhc2Vzb3J0KCR0ZW1wX2FycmF5KTsKCQkkdGVtcF9hcnJheSA9IGFycmF5X3ZhbHVl cygkdGVtcF9hcnJheSk7Cgl9CgoJJHNvcnRlZF9hcnJheSA9IGFycmF5KCk7Cglmb3JlYWNo ICgkdGVtcF9hcnJheSBhcyAkdGFnKSB7CgkJJHNvcnRlZF9hcnJheVskdGFnXSA9ICR0YWdz X3dlaWdodFskdGFnXTsKCX0KCglyZXR1cm4gJHNvcnRlZF9hcnJheTsKfQoKCmZ1bmN0aW9u IHRydV90YWdzX3NvcnRfdGFnc19jb21wYXJhdG9yKCRsZWZ0LCAkcmlnaHQpIHsKCWdsb2Jh bCAkdHJ1X3RhZ3NfdGFnc193ZWlnaHQsICR0cnVfdGFnc19zb3J0X2FzY2VuZGluZzsKCgkk bGVmdF93ZWlnaHQgPSAkdHJ1X3RhZ3NfdGFnc193ZWlnaHRbJGxlZnRdOwoJJHJpZ2h0X3dl aWdodCA9ICR0cnVfdGFnc190YWdzX3dlaWdodFskcmlnaHRdOwoJaWYgKCRsZWZ0X3dlaWdo dCA9PSAkcmlnaHRfd2VpZ2h0KSB7CgkJJHRlbXBfYXJyYXkgPSBhcnJheSgkbGVmdCwgJHJp Z2h0KTsKCQluYXRjYXNlc29ydCgkdGVtcF9hcnJheSk7CgkJJHRlbXBfYXJyYXkgPSBhcnJh eV92YWx1ZXMoJHRlbXBfYXJyYXkpOwoJCXJldHVybiAoJHRlbXBfYXJyYXlbMF0gPT0gJGxl ZnQgPyAtMSA6IDEpOwoJfSBlbHNlIGlmICgkdHJ1X3RhZ3Nfc29ydF9hc2NlbmRpbmcpIHsK CQlyZXR1cm4gJGxlZnRfd2VpZ2h0IC0gJHJpZ2h0X3dlaWdodDsKCX0gZWxzZSB7CgkJcmV0 dXJuICRyaWdodF93ZWlnaHQgLSAkbGVmdF93ZWlnaHQ7Cgl9Cn0KCgoKIyMjIEJBU1RBUkQg RlVOQ1RJT05TIFRIQVQgU0hPVUxETidUIEhBVkUgVE8gRVhJU1QgIyMjCiMjIyMjIyMjIyMj IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwoKCmZ1bmN0aW9u IHRydV90YWdzX3JlZG9fYXJ0aWNsZV9zZWFyY2goJGF0dHMpIHsKCSR0aGVBdHRzID0gbEF0 dHMoYXJyYXkoJ2xpbWl0JyAgICAgPT4gMTAwMCwKCQkJCSdjYXRlZ29yeScgID0+ICcnLAoJ CQkJJ3NlY3Rpb24nICAgPT4gJycsCgkJCQknZXhjZXJwdGVkJyA9PiAnJywKCQkJCSdhdXRo b3InICAgID0+ICcnLAoJCQkJJ3NvcnRieScgICAgPT4gJ1Bvc3RlZCcsCgkJCQknc29ydGRp cicgICA9PiAnZGVzYycsCgkJCQknbW9udGgnICAgICA9PiAnJywKCQkJCSdrZXl3b3Jkcycg ID0+ICcnLAoJCQkJJ2Zyb250cGFnZScgPT4gJycsCgkJCQknaWQnICAgICAgICA9PiAnJywK CQkJCSd0aW1lJyAgICAgID0+ICdwYXN0JywKCQkJCSdzdGF0dXMnICAgID0+ICc0JywKCQkJ CSdvZmZzZXQnICAgID0+IDAKCQkJKSwkYXR0cywgMCk7CglleHRyYWN0KCR0aGVBdHRzKTsK CgkvL0J1aWxkaW5nIHF1ZXJ5IHBhcnRzCgkkZnJvbnRwYWdlID0gKCRmcm9udHBhZ2UpID8g ZmlsdGVyRnJvbnRQYWdlKCkgOiAnJzsKCSRjYXRlZ29yeSAgPSAoISRjYXRlZ29yeSkgID8g JycgOiAiIGFuZCAoKENhdGVnb3J5MT0nIi5kb3NsYXNoKCRjYXRlZ29yeSkuIicpIG9yIChD YXRlZ29yeTI9JyIuZG9TbGFzaCgkY2F0ZWdvcnkpLiInKSkgIjsKCSRzZWN0aW9uICAgPSAo ISRzZWN0aW9uKSAgID8gJycgOiAiIGFuZCBTZWN0aW9uID0gJyIuZG9zbGFzaCgkc2VjdGlv bikuIiciOwoJJGV4Y2VycHRlZCA9ICgkZXhjZXJwdGVkPT0neScpICA/ICIgYW5kIEV4Y2Vy cHQgIT0nJyIgOiAnJzsKCSRhdXRob3IgICAgPSAoISRhdXRob3IpICAgID8gJycgOiAiIGFu ZCBBdXRob3JJRCA9ICciLmRvc2xhc2goJGF1dGhvcikuIiciOwoJJG1vbnRoICAgICA9ICgh JG1vbnRoKSAgICAgPyAnJyA6ICIgYW5kIFBvc3RlZCBsaWtlICciLmRvU2xhc2goJG1vbnRo KS4iJSciOwoJJGlkICAgICAgICA9ICghJGlkKSAgICAgICAgPyAnJyA6ICIgYW5kIElEID0g JyIuaW50dmFsKCRpZCkuIiciOwoJc3dpdGNoICgkdGltZSkgewoJCWNhc2UgJ2FueSc6CgkJ CSR0aW1lID0gIiI7IGJyZWFrOwoJCWNhc2UgJ2Z1dHVyZSc6CgkJCSR0aW1lID0gIiBhbmQg UG9zdGVkID4gbm93KCkiOyBicmVhazsKCQlkZWZhdWx0OgoJCQkkdGltZSA9ICIgYW5kIFBv c3RlZCA8IG5vdygpIjsKCX0KCWlmICghaXNfbnVtZXJpYygkc3RhdHVzKSkKCQkkc3RhdHVz ID0gZ2V0U3RhdHVzTnVtKCRzdGF0dXMpOwoKCSRjdXN0b20gPSAnJzsKCS8vIHRyeWluZyBj dXN0b20gZmllbGRzIGhlcmUKCSRjdXN0b21GaWVsZHMgPSBnZXRDdXN0b21GaWVsZHMoKTsK CWlmICgkY3VzdG9tRmllbGRzKSB7CgkJZm9yZWFjaCgkY3VzdG9tRmllbGRzIGFzICRjRmll bGQpIHsKCQkJaWYgKGlzc2V0KCRhdHRzWyRjRmllbGRdKSkKCQkJCSRjdXN0b21QYWlyc1sk Y0ZpZWxkXSA9ICRhdHRzWyRjRmllbGRdOwoJCX0KCQlpZighZW1wdHkoJGN1c3RvbVBhaXJz KSkKCQkJJGN1c3RvbSA9ICBidWlsZEN1c3RvbVNxbCgkY3VzdG9tRmllbGRzLCRjdXN0b21Q YWlycyk7CgkJZWxzZQoJCQkkY3VzdG9tID0gJyc7Cgl9CgoJLy9BbGxvdyBrZXl3b3JkcyBm b3Igbm8tY3VzdG9tIGFydGljbGVzLiBUaGF0IHRhZ2dpbmcgbW9kZSwgeW91IGtub3cKCWlm ICgka2V5d29yZHMpIHsKCQkka2V5cyA9IGRvU2xhc2goYXJyYXlfbWFwKCd0cmltJywgc3Bs aXQoJywnLCAka2V5d29yZHMpKSk7CgkJZm9yZWFjaCAoJGtleXMgYXMgJGtleSkgewoJCQkk a2V5cGFydHNbXSA9ICJGSU5EX0lOX1NFVCgnIi4ka2V5LiInLEtleXdvcmRzKSI7CgkJfQoJ CSRrZXl3b3JkcyA9ICIgYW5kICgiIC4gam9pbignIG9yICcsJGtleXBhcnRzKSAuICIpIjsK CX0KCglpZiAoJGlkKQoJCSRzdGF0dXNxID0gIiBhbmQgU3RhdHVzID49ICc0JyI7CgllbHNl CgkJJHN0YXR1c3EgPSAiIGFuZCBTdGF0dXM9JyIuZG9TbGFzaCgkc3RhdHVzKS4iJyI7CgoJ JHdoZXJlID0gIjEiIC4gJHN0YXR1c3EuICR0aW1lLgoJCSRpZCAuICRjYXRlZ29yeSAuICRz ZWN0aW9uIC4gJGV4Y2VycHRlZCAuICRtb250aCAuICRhdXRob3IgLiAka2V5d29yZHMgLiAk Y3VzdG9tIC4gJGZyb250cGFnZTsKCgkJJHBnb2Zmc2V0ID0gJG9mZnNldCAuICcsICc7CgoJ JHJzID0gc2FmZV9yb3dzX3N0YXJ0KCIqLCB1bml4X3RpbWVzdGFtcChQb3N0ZWQpIGFzIHVQ b3N0ZWQiLCAndGV4dHBhdHRlcm4nLAoJCSR3aGVyZS4gJyBvcmRlciBieSAnIC4gZG9zbGFz aCgkc29ydGJ5KSAuICcgJyAuIGRvU2xhc2goJHNvcnRkaXIpIC4gJyBsaW1pdCAnIC4gZG9T bGFzaCgkbGltaXQpKTsKCglyZXR1cm4gJHJzOwp9CgoKIjtzOjg6ImhlbHBfcmF3IjtzOjk0 NjoiVG8gbGVhcm4gbW9yZSBhYm91dCB0cnVfdGFncywgY2hlY2sgb3V0IHRoZSAiaW50cm9k dWN0b3J5IGFydGljbGUiOmh0dHA6Ly93d3cucmFpbnNraXQuY29tL2Jsb2cvNDkzL3RydXRh Z3MtYS10YWdnaW5nLXBsdWdpbi1mb3ItdGV4dHBhdHRlcm4sICJyZWxlYXNlcyBwYWdlIjpo dHRwOi8vd3d3LnJhaW5za2l0LmNvbS9yZWZlcmVuY2UvNTM3L3RydV90YWdzLXJlbGVhc2Vz LCAiZmVhdHVyZSBsaXN0IjpodHRwOi8vd3d3LnJhaW5za2l0LmNvbS9yZWZlcmVuY2UvNDk1 L3RydXRhZ3MtZmVhdHVyZS1saXN0LCAicm9hZG1hcCI6aHR0cDovL3d3dy5yYWluc2tpdC5j b20vcmVmZXJlbmNlLzU1NC90cnVfdGFncy1yb2FkbWFwLCBhbmQgInVzYWdlIGluc3RydWN0 aW9ucyI6aHR0cDovL3d3dy5yYWluc2tpdC5jb20vcmVmZXJlbmNlLzQ5Ny90cnV0YWdzLXVz YWdlLWluc3RydWN0aW9ucy4KCllvdSBjYW4gYWxzbyBmaW5kIHRoZSBzb3VyY2UgY29kZSBh dCAiaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3RydS10YWdzLyI6aHR0cDovL2NvZGUuZ29v Z2xlLmNvbS9wL3RydS10YWdzLy4KCkkndmUgdGFrZW4gdGhlIGRldGFpbGVkIGhlbHAgb3V0 IG9mIHRoZSBwbHVnaW47IG15IGFwb2xvZ2llcy4gIEl0IHdhcyB0b28gYmlnIGFuZCB0b28g ZGlmZmljdWx0IHRvIGtlZXAgbWFpbnRhaW5pbmcgb24gbXkgc2l0ZSBhbmQgaW4gdGhlIHBs dWdpbi4gIElmLCBteSBzaXRlIGlzIGV2ZXIgZG93biwgaG93ZXZlciwgdGhlIHNvdXJjZSBI VE1MIG9mIHRoZSB1c2FnZSBpbnN0cnVjdGlvbnMgaXMgYXZhaWxhYmxlIGF0ICJodHRwOi8v Y29kZS5nb29nbGUuY29tL3AvdHJ1LXRhZ3Mvc291cmNlL2Jyb3dzZS90cnVuay90cnVfdGFn cy1kb2NzLmh0bWwiOmh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC90cnUtdGFncy9zb3VyY2Uv YnJvd3NlL3RydW5rL3RydV90YWdzLWRvY3MuaHRtbCI7czozOiJtZDUiO3M6MzI6IjM1MzY0 MTIyOTYxMjNkM2Q1MzM4NGY4YTkyMjU4ZTIyIjt9