# tru_tags v3.7-alpha # Tag Plugin # 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: # ...................................................................... YTo5OntzOjc6InZlcnNpb24iO3M6OToiMy43LWFscGhhIjtzOjY6ImF1dGhvciI7czoxMzoi TmF0aGFuIEFydGh1ciI7czoxMDoiYXV0aG9yX3VyaSI7czoyNDoiaHR0cDovL3d3dy5yYWlu c2tpdC5jb20vIjtzOjExOiJkZXNjcmlwdGlvbiI7czoxMDoiVGFnIFBsdWdpbiI7czo0OiJ0 eXBlIjtpOjE7czo0OiJuYW1lIjtzOjg6InRydV90YWdzIjtzOjQ6ImhlbHAiO3M6MTMyOiIJ PGgxPlNlZSA8YSBocmVmPSJodHRwOi8vd3d3LnJhaW5za2l0LmNvbS9yZWZlcmVuY2UvNDk3 L3RydXRhZ3MtdXNhZ2UtaW5zdHJ1Y3Rpb25zIj48c3Ryb25nPlRydSBUYWdzIERvY3VtZW50 YXRpb248L3N0cm9uZz48L2E+PC9oMT4iO3M6NDoiY29kZSI7czo0NTE2NzoiCiMgQ29weXJp Z2h0IDIwMDkgTmF0aGFuIEFydGh1cgojIFJlbGVhc2VkIHVuZGVyIHRoZSBHTlUgUHVibGlj IExpY2Vuc2UsIHNlZSBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2dwbC1s aWNlbnNlLnBocCBmb3IgZGV0YWlscwojIFRoaXMgd29yayB3YXMgb3JpZ2luYWxseSBpbnNw aXJlZCBieSByYW5fdGFncyBieSBSYW4gQXJvdXNzaSwgb3JpZ2luYWxseSBmb3VuZCBhdCBo dHRwOi8vYXJvdXNzaS5jb20vYXJ0aWNsZS80NS90YWdnaW5nLXRleHRwYXR0ZXJuCiMgSmF2 YXNjcmlwdCBidWcgZml4ZXMgd2VyZSBwcm92aWRlZCBieSB0aGVfZ2hvc3QgLSBodHRwOi8v dmljdG9ydXMubmV0CiMgSmF2YXNjcmlwdCBjb2RlIGZvciB0aGUgdGFnIGF1dG8tY29tcGxl dGUgZmVhdHVyZSB3YXMgcHJvdmlkZWQgYnkgSmltIEJpYW5jb2xvIC0gaHR0cDovL3d3dy5i aWFuY29sby5jb20vCgoKIyMjIENPTkZJR1VSQVRJT04gIyMjCiMjIyMjIyMjIyMjIyMjIyMj IyMjIwoKIyBUVVJOIEJBQ0shICBDb25maWd1cmF0aW9uIGlzIG5vIGxvbmdlciBoYW5kbGVk IGJ5IGVkaXRpbmcgdGhlIHBsdWdpbi4KIyBDaGVjayBvdXQgdGhlICdFeHRlbnNpb25zJyB0 YWIgaW4gdGhlIFRleHRwYXR0ZXJuIGFkbWluIDopCgoKIyBDaGFuZ2luZyB0aGVzZSB3b24n dCBkbyBhbnkgZ29vZC4gIFRoZXkncmUganVzdCBoZXJlIGFzIGEgY29udmVuaWVuY2UgZm9y IGRldmVsb3BtZW50LgpkZWZpbmUoJ1RSVV9UQUdTX0ZJRUxEJywgJ0tleXdvcmRzJyk7CmRl ZmluZSgnRU5DT0RJTkcnLCAndXRmLTgnKTsKCmRlZmluZSgnQ0xFQU5fVVJMUycsICdjbGVh bl91cmxzJyk7CmRlZmluZSgnVEFHX1NFQ1RJT04nLCAndGFnX3NlY3Rpb24nKTsKZGVmaW5l KCdQQVJNX05BTUUnLCAncGFybScpOwpkZWZpbmUoJ1RBR1NfSU5fRkVFRF9DQVRFR09SSUVT JywgJ3RhZ3NfaW5fZmVlZF9jYXRlZ29yaWVzJyk7CmRlZmluZSgnVEFHU19JTl9GRUVEX0JP RFknLCAndGFnc19pbl9mZWVkX2JvZHknKTsKZGVmaW5lKCdUQUdTX0lOX1dSSVRFX1RBQics ICd0YWdzX2luX3dyaXRlX3RhYicpOwpkZWZpbmUoJ0FVVE9DT01QTEVURV9JTl9XUklURV9U QUInLCAnYXV0b2NvbXBsZXRlX2luX3dyaXRlX3RhYicpOwpkZWZpbmUoJ1VURl84X0NBU0Un LCAndXRmXzhfY2FzZScpOwoKZ2xvYmFsICR0cnVfdGFnc19wcmVmczsKJHRydV90YWdzX3By ZWZzID0gdHJ1X3RhZ3NfbG9hZF9wcmVmcygpOwoKCiMjIyBQUklNQVJZIFRBRyBGVU5DVElP TlMgIyMjCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgpmdW5jdGlvbiB0cnVfdGFn c19oYW5kbGVyKCRhdHRzKSB7CiAgICAkdGFnX3BhcmFtZXRlciA9IHRydV90YWdzX3RhZ19w YXJhbWV0ZXIoYXJyYXkoKSwgZmFsc2UpOwogICAgaWYgKCFlbXB0eSgkdGFnX3BhcmFtZXRl cikpIHsKCWlmICh0cnVfdGFnc19yZWRpcmVjdF9pZl9uZWVkZWQoJHRhZ19wYXJhbWV0ZXIp KSB7CgkgICAgcmV0dXJuICcnOwoJfQoJJGNsZWFuX2F0dHMgPSB0cnVfdGFnc19maXh1cF9x dWVyeV9hdHRzKCRhdHRzLCAkdGFnX3BhcmFtZXRlcik7CgkkcmVzdWx0ID0gZG9BcnRpY2xl cygkY2xlYW5fYXR0cywgdHJ1ZSk7CQkjZnVuY3Rpb24gaW4gVFhQIGNvZGUKCWlmICh0cmlt KCRyZXN1bHQpID09ICcnKSB7CgkgICAgaWYgKGlzc2V0KCRhdHRzWydub2FydGljbGVzJ10p KSB7CgkJdHJ1X3RhZ3NfcmVkaXJlY3QoJGF0dHNbJ25vYXJ0aWNsZXMnXSwgdHJ1ZSk7Cgkg ICAgfSBlbHNlIGlmIChpc3NldCgkYXR0c1snNDA0cmVkaXJlY3QnXSkgJiYgISRhdHRzWyc0 MDRyZWRpcmVjdCddKSB7CgkJcmV0dXJuICRyZXN1bHQ7CgkgICAgfSBlbHNlIHsKCQl0eHBf ZGllKGdUeHQoJzQwNF9ub3RfZm91bmQnKSwgJzQwNCcpOwoJICAgIH0KCX0gZWxzZSB7Cgkg ICAgcmV0dXJuICRyZXN1bHQ7Cgl9CiAgICB9IGVsc2UgewoJcmV0dXJuIHRydV90YWdzX2Ns b3VkKCRhdHRzKTsKICAgIH0KfQoKCmZ1bmN0aW9uIHRydV90YWdzX2FyY2hpdmUoJGF0dHMp IHsKICAgIGdsb2JhbCAkdHJ1X3RhZ3NfY3VycmVudF9hcmNoaXZlX3RhZzsKICAgICR0YWdz ID0gYXJyYXlfdW5pcXVlKHRydV90YWdzX2Nsb3VkX3F1ZXJ5KHRydV90YWdzX2dldF9zdGFu ZGFyZF9jbG91ZF9hdHRzKCRhdHRzLCBmYWxzZSwgZmFsc2UpKSk7CiAgICBuYXRjYXNlc29y dCgkdGFncyk7CiAgICBmb3JlYWNoICgkdGFncyBhcyAkdGFnKSB7CgkkdHJ1X3RhZ3NfY3Vy cmVudF9hcmNoaXZlX3RhZyA9ICR0YWc7CgkkY2xlYW5fYXR0cyA9IHRydV90YWdzX2ZpeHVw X3F1ZXJ5X2F0dHMoJGF0dHMsICR0YWcpOwoJJHJlc3VsdHNbXSA9IGRvQXJ0aWNsZXMoJGNs ZWFuX2F0dHMsIHRydWUpOwkJI2Z1bmN0aW9uIGluIFRYUCBjb2RlCiAgICB9CiAgICByZXR1 cm4gam9pbignICcsICRyZXN1bHRzKTsKfQoKCmZ1bmN0aW9uIHRydV90YWdzX2N1cnJlbnRf YXJjaGl2ZV90YWcoJGF0dHMpIHsKICAgIGdsb2JhbCAkdHJ1X3RhZ3NfY3VycmVudF9hcmNo aXZlX3RhZzsKICAgIGV4dHJhY3QobEF0dHMoYXJyYXkoJ2xpbmsnID0+ICcwJyksICAkYXR0 cywgMCkpOwogICAgaWYgKCRsaW5rKSB7CglyZXR1cm4gJzxhIGhyZWY9IicgLiB0cnVfdGFn c19saW5raWZ5X3RhZygkdHJ1X3RhZ3NfY3VycmVudF9hcmNoaXZlX3RhZykgLiAnIj4nIC4g JHRydV90YWdzX2N1cnJlbnRfYXJjaGl2ZV90YWcgLiAnPC9hPic7CiAgICB9IGVsc2UgewoJ cmV0dXJuICR0cnVfdGFnc19jdXJyZW50X2FyY2hpdmVfdGFnOwogICAgfQp9CgoKZnVuY3Rp b24gdHJ1X3RhZ3NfY2xvdWQoJGF0dHMpIHsKICAgIHJldHVybiB0cnVfdGFnc19saXN0KHRy dV90YWdzX2dldF9zdGFuZGFyZF9jbG91ZF9hdHRzKCRhdHRzLCBmYWxzZSwgZmFsc2UpKTsK fQoKCmZ1bmN0aW9uIHRydV90YWdzX2xpc3QoJGF0dHMpIHsKICAgICRhdHRzID0gdHJ1X3Rh Z3NfZ2V0X3N0YW5kYXJkX2Nsb3VkX2F0dHMoJGF0dHMsIHRydWUsIGZhbHNlKTsKICAgICRh bGxfdGFncyA9IHRydV90YWdzX2Nsb3VkX3F1ZXJ5KCRhdHRzKTsKCiAgICByZXR1cm4gdHJ1 X3RhZ3NfcmVuZGVyX2Nsb3VkKCRhdHRzLCAkYWxsX3RhZ3MsICRhbGxfdGFncyk7Cn0KCgpm dW5jdGlvbiB0cnVfdGFnc19mcm9tX2FydGljbGUoJGF0dHMpIHsKICAgIGdsb2JhbCAkdGhp c2FydGljbGU7CiAgICBleHRyYWN0KCR0aGlzYXJ0aWNsZSk7CgogICAgJGFsbF90YWdzID0g dHJ1X3RhZ3NfZ2V0X3RhZ3NfZm9yX2FydGljbGUoJHRoaXNpZCk7CgogICAgJGF0dHMgPSB0 cnVfdGFnc19nZXRfc3RhbmRhcmRfY2xvdWRfYXR0cygkYXR0cywgZmFsc2UsIHRydWUpOwog ICAgJGFsbF90YWdzX2Zvcl93ZWlnaHQgPSAkYWxsX3RhZ3M7CiAgICBpZiAoJGF0dHNbJ3Vz ZW92ZXJhbGxjb3VudHMnXSkgewoJJGFsbF90YWdzX2Zvcl93ZWlnaHQgPSB0cnVfdGFnc19j bG91ZF9xdWVyeSgkYXR0cyk7CiAgICB9CgogICAgcmV0dXJuIHRydV90YWdzX3JlbmRlcl9j bG91ZCgkYXR0cywgJGFsbF90YWdzLCAkYWxsX3RhZ3NfZm9yX3dlaWdodCk7Cn0KCgpmdW5j dGlvbiB0cnVfdGFnc19pZl9oYXNfdGFncygkYXR0cywgJHRoaW5nKSB7CiAgICBnbG9iYWwg JHRoaXNhcnRpY2xlOwogICAgZXh0cmFjdCgkdGhpc2FydGljbGUpOwoKICAgICR0YWdzX2Zp ZWxkID0gVFJVX1RBR1NfRklFTEQ7CgogICAgJHJzID0gc2FmZV9yb3coJHRhZ3NfZmllbGQs ICJ0ZXh0cGF0dGVybiIsICJJRD0nJHRoaXNpZCcgQU5EICR0YWdzX2ZpZWxkIDw+ICcnIik7 CiAgICByZXR1cm4gcGFyc2UoRXZhbEVsc2UoJHRoaW5nLCAkcnMpKTsKfQoKCmZ1bmN0aW9u IHRydV90YWdzX2lmX3RhZ19zZWFyY2goJGF0dHMsICR0aGluZykgewogICAgZXh0cmFjdChs QXR0cyhhcnJheSgndGFnJyA9PiAnJyksICAkYXR0cywgMCkpOwoKICAgICR0YWdfcGFyYW1l dGVyID0gdHJ1X3RhZ3NfdGFnX3BhcmFtZXRlcihhcnJheSgnc3RyaXBoeXBoZW5zJyA9PiAx KSwgZmFsc2UpOwogICAgJGNvbmRpdGlvbiA9ICghZW1wdHkoJHRhZ19wYXJhbWV0ZXIpKSA/ IHRydWUgOiBmYWxzZTsKICAgIGlmICgkY29uZGl0aW9uICYmICFlbXB0eSgkdGFnKSkgewoJ JGNvbmRpdGlvbiA9ICgkdGFnX3BhcmFtZXRlciA9PSAkdGFnKTsKICAgIH0KICAgIHJldHVy biBwYXJzZShFdmFsRWxzZSgkdGhpbmcsICRjb25kaXRpb24pKTsKfQoKCmZ1bmN0aW9uIHRy dV90YWdzX3RhZ19wYXJhbWV0ZXIoJGF0dHMsICRzYWZlaHRtbCA9IHRydWUpIHsKICAgIGds b2JhbCAkdHJ1X3RhZ3NfcHJlZnM7CiAgICBleHRyYWN0KGxBdHRzKGFycmF5KCdzdHJpcGh5 cGhlbnMnID0+ICcwJywgJ3VybGVuY29kZScgPT4gMCksICAkYXR0cywgMCkpOwoKICAgICRw YXJtID0gdXJsZGVjb2RlKHN0cmlwX3RhZ3MoZ3BzKCR0cnVfdGFnc19wcmVmc1tQQVJNX05B TUVdLT52YWx1ZSkpKTsKICAgIGlmICgnbG9va3VwJyA9PSAkc3RyaXBoeXBoZW5zKSB7Cgkk YXR0cyA9IHRydV90YWdzX2dldF9zdGFuZGFyZF9jbG91ZF9hdHRzKGFycmF5KCksIGZhbHNl LCBmYWxzZSk7CgkkdGFnX2xpc3QgPSBhcnJheV91bmlxdWUodHJ1X3RhZ3NfY2xvdWRfcXVl cnkoJGF0dHMpKTsKCWZvcmVhY2ggKCR0YWdfbGlzdCBhcyAkY2xvdWRfdGFnKSB7CgkgICAg aWYgKCRwYXJtID09IHN0cl9yZXBsYWNlKCcgJywgJy0nLCAkY2xvdWRfdGFnKSkgewoJCSRw YXJtID0gJGNsb3VkX3RhZzsKCQlicmVhazsKCSAgICB9Cgl9CiAgICB9IGVsc2UgaWYgKCRz dHJpcGh5cGhlbnMpIHsKCSRwYXJtID0gc3RyX3JlcGxhY2UoJy0nLCAnICcsICRwYXJtKTsK ICAgIH0KICAgIGlmICgkdXJsZW5jb2RlKSB7CgkkcGFybSA9IHVybGVuY29kZSgkcGFybSk7 CiAgICAgfSBlbHNlIGlmICgkc2FmZWh0bWwpIHsKCSRwYXJtID0gaHRtbHNwZWNpYWxjaGFy cygkcGFybSk7CiAgICB9CgogICAgcmV0dXJuICRwYXJtOwp9CgoKZnVuY3Rpb24gdHJ1X3Rh Z3Nfc2VhcmNoX3Jlc3VsdF9leGNlcnB0KCRhdHRzKSB7CiAgICBnbG9iYWwgJHByZXRleHQ7 CgogICAgJHRhZ19wYXJhbWV0ZXIgPSB0cnVfdGFnc190YWdfcGFyYW1ldGVyKGFycmF5KCks IGZhbHNlKTsKICAgIGlmICh0cmltKCR0YWdfcGFyYW1ldGVyKSAhPSAnJykgewoJJHEgPSAk cHJldGV4dFsncSddOwoJJHByZXRleHRbJ3EnXSA9ICR0YWdfcGFyYW1ldGVyOwoJJHJlc3Vs dCA9IHNlYXJjaF9yZXN1bHRfZXhjZXJwdCgkYXR0cyk7CgkkcHJldGV4dFsncSddID0gJHE7 CiAgICB9IGVsc2UgewoJJHJlc3VsdCA9IHNlYXJjaF9yZXN1bHRfZXhjZXJwdCgkYXR0cyk7 CiAgICB9CiAgICByZXR1cm4gJHJlc3VsdDsKfQoKCmZ1bmN0aW9uIHRydV90YWdzX3NlYXJj aF9wYXJhbWV0ZXIoKSB7CiAgICB0cmlnZ2VyX2Vycm9yKGdUeHQoJ2RlcHJlY2F0ZWRfdGFn JyksIEVfVVNFUl9OT1RJQ0UpOwogICAgcmV0dXJuIHN0cmlwX3RhZ3MoZ3BzKCdxJykpOwp9 CgoKZnVuY3Rpb24gdHJ1X3RhZ3NfcmVsYXRlZF90YWdzX2Zyb21fc2VhcmNoKCRhdHRzKSB7 CiAgICAkdGFnX3BhcmFtZXRlciA9IHRydV90YWdzX3RhZ19wYXJhbWV0ZXIoYXJyYXkoKSwg ZmFsc2UpOwogICAgZXh0cmFjdChsQXR0cyhhcnJheSgndGFnX3BhcmFtZXRlcicgPT4gJHRh Z19wYXJhbWV0ZXIpLCAgJGF0dHMsIDApKTsKICAgIGlmICghZW1wdHkoJHRhZ19wYXJhbWV0 ZXIpKSB7CiAgICAgICAgJHRhZ3NfZmllbGQgPSBUUlVfVEFHU19GSUVMRDsKCSRhbGxfdGFn cyA9IGFycmF5KCk7CgoJJHF1ZXJ5X2F0dHMgPSB0cnVfdGFnc19maXh1cF9xdWVyeV9hdHRz KCRhdHRzLCAkdGFnX3BhcmFtZXRlcik7CgkkcnMgPSB0cnVfdGFnc19yZWRvX2FydGljbGVf c2VhcmNoKCRxdWVyeV9hdHRzKTsKCWlmICgkcnMpIHsKCSAgICB3aGlsZSAoJGEgPSBuZXh0 Um93KCRycykpIHsKCQkkYXJ0aWNsZV90YWdzID0gYXJyYXkoKTsKCSAgICBpZiAoaXNzZXQo JGFbJHRhZ3NfZmllbGRdKSkgewoJCSAgICAkYXJ0aWNsZV90YWdzID0gZXhwbG9kZSgiLCIs IHRyaW0odHJ1X3RhZ3Nfc3RydG9sb3dlcigkYVskdGFnc19maWVsZF0pKSk7CgoJCX0KCmZv cmVhY2godHJ1X3RhZ3NfdHJpbV90YWdzKCRhcnRpY2xlX3RhZ3MpIGFzICRpKSB7JGFsbF90 YWdzW10gPSAkaTt9CgoKCgkgICAgfQoJfQoKCSRhbHRfdGFnX3BhcmFtZXRlciA9IHN0cl9y ZXBsYWNlKCctJywgJyAnLCAkdGFnX3BhcmFtZXRlcik7Cglmb3JlYWNoICgkYWxsX3RhZ3Mg YXMgJGtleSA9PiAkdGFnKSB7CgkgICAgaWYgKCR0YWcgPT0gJHRhZ19wYXJhbWV0ZXIgfHwg JHRhZyA9PSAkYWx0X3RhZ19wYXJhbWV0ZXIpIHsKCQl1bnNldCgkYWxsX3RhZ3NbJGtleV0p OwoJICAgIH0KCX0KCgkkY2xvdWRfYXR0cyA9IHRydV90YWdzX2dldF9zdGFuZGFyZF9jbG91 ZF9hdHRzKCRhdHRzLCBmYWxzZSwgZmFsc2UpOwoJJGFsbF90YWdzX2Zvcl93ZWlnaHQgPSAk YWxsX3RhZ3M7CglpZiAoJGNsb3VkX2F0dHNbJ3VzZW92ZXJhbGxjb3VudHMnXSkgewoJICAg ICRhbGxfdGFnc19mb3Jfd2VpZ2h0ID0gdHJ1X3RhZ3NfY2xvdWRfcXVlcnkoJGNsb3VkX2F0 dHMpOwoJfQoKCXJldHVybiB0cnVfdGFnc19yZW5kZXJfY2xvdWQoJGNsb3VkX2F0dHMsICRh bGxfdGFncywgJGFsbF90YWdzX2Zvcl93ZWlnaHQpOwogICAgfSBlbHNlIHsKCXJldHVybiAn JzsKICAgIH0KfQoKCiMjIyBDTE9VRCBTVVBQT1JUIEZVTkNUSU9OUyAjIyMKIyMjIyMjIyMj IyMjIyMjIyMjIyMjIyMjIyMjIyMjIwoKZnVuY3Rpb24gdHJ1X3RhZ3NfZ2V0X3N0YW5kYXJk X2Nsb3VkX2F0dHMoJGF0dHMsICRpc0xpc3QsICRpc0FydGljbGUsICRzaG93QWxsPWZhbHNl KSB7CiAgICByZXR1cm4gbEF0dHMoYXJyYXkoJ3dyYXB0YWcnCT0+ICgkaXNMaXN0ID8gJ3Vs JyA6ICcnKSwKCSAgICAnYnJlYWsnCQk9PiAoJGlzTGlzdCA/ICdsaScgOiAnLCAnKSwKCSAg ICAnY2xhc3MnCQk9PiAnJywKCSAgICAnYnJlYWtjbGFzcycJPT4gJycsCgkgICAgJ3NlY3Rp b24nCT0+ICcnLAoJICAgICdtaW5wZXJjZW50Jwk9PiAnMTAwJywKCSAgICAnbWF4cGVyY2Vu dCcJPT4gKCRpc0xpc3QgfHwgJGlzQXJ0aWNsZSA/ICcxMDAnIDogJzIwMCcpLAoJICAgICdz aG93Y291bnRzJwk9PiAnJywKCSAgICAnY291bnR3cmFwY2hhcnMnCT0+ICdbXScsCgkgICAg J3VzZXJlbHRhZycJPT4gKCRpc0FydGljbGUgPyAnMScgOiAnJyksCgkgICAgJ2dlbmVyYXRl bGlua3MnCT0+ICcxJywKCSAgICAnbWludGFnY291bnQnCT0+ICcwJywKCSAgICAnbWF4dGFn Y291bnQnCT0+ICcxMDAwJywKCSAgICAnc2V0c2l6ZXMnCT0+ICgkaXNBcnRpY2xlID8gJzAn IDogJzEnKSwKCSAgICAndXNlbm9mb2xsb3cnCT0+ICcnLAoJICAgICdzb3J0JwkJPT4gJ2Fs cGhhJywKCSAgICAndXNlb3ZlcmFsbGNvdW50cycJPT4gJycsCgkgICAgJ3NldGNsYXNzZXMn CT0+ICgkaXNBcnRpY2xlID8gJzAnIDogJzEnKSwKCSAgICAndGl0bGUnCQk9PiAnJywKCSAg ICAnbGlzdGxpbWl0Jwk9PiAnJywKCSAgICAna2VlcCcJCT0+ICdsYXJnZXN0JywKCSAgICAn Y3V0b2ZmJwk9PiAnY2h1bmsnLAoJICAgICd0ZXh0dHJhbnNmb3JtJwk9PiAnbm9uZScsCgkg ICAgJ2xpbmtwYXRoJwk9PiAnJywKCSAgICAnbGlua3BhdGh0YWlsJwk9PiAnJywKCSAgICAn ZmlsdGVyc2VhcmNoJwk9PiAoJHNob3dBbGwgPyAwIDogJzEnKSwKCSAgICAnZXhjbHVkZXNl Y3Rpb24nPT4gJycsCgkgICAgJ2FjdGl2ZWNsYXNzJwk9PiAndGFnQWN0aXZlJywKCSAgICAn dGltZScJCT0+ICgkc2hvd0FsbCA/ICdhbnknIDogJ3Bhc3QnKQoJKSwkYXR0cywgMCk7Cn0K CgpmdW5jdGlvbiB0cnVfdGFnc19jbG91ZF9xdWVyeSgkYXR0cykgewogICAgZXh0cmFjdCgk YXR0cyk7CgogICAgJHNlY3Rpb25fY2xhdXNlID0gJyc7CiAgICBpZiAoJHNlY3Rpb24gPD4g JycpIHsKCSRrZXlzID0gZXhwbG9kZSgnLCcsICRzZWN0aW9uKTsKCWZvcmVhY2ggKCRrZXlz IGFzICRrZXkpIHsKCSAgICAka2V5cGFydHNbXSA9ICIgU2VjdGlvbiA9ICciIC4gdHJpbSgk a2V5KSAuICInIjsKCX0KCSRzZWN0aW9uX2NsYXVzZSA9ICIgQU5EICgiIC4gam9pbignIG9y ICcsICRrZXlwYXJ0cykgLiAiKSI7CiAgICB9CgogICAgJHRhZ3NfZmllbGQgPSBUUlVfVEFH U19GSUVMRDsKICAgIGluY2x1ZGVfb25jZSB0eHBhdGguJy9wdWJsaXNoL3NlYXJjaC5waHAn OwoKICAgICRmaWx0ZXIgPSB0cnVfdGFnc19maWx0ZXJfc2VjdGlvbnMoJGV4Y2x1ZGVzZWN0 aW9uKTsKICAgICRmaWx0ZXIgLj0gKCRmaWx0ZXJzZWFyY2ggPyBmaWx0ZXJTZWFyY2goKSA6 ICcnKTsKCiAgICBzd2l0Y2ggKCR0aW1lKSB7CgljYXNlICdhbnknOgoJICAgICR0aW1lID0g IiI7IGJyZWFrOwoJY2FzZSAnZnV0dXJlJzoKCSAgICAkdGltZSA9ICIgYW5kIFBvc3RlZCA+ IG5vdygpIjsgYnJlYWs7CglkZWZhdWx0OgoJICAgICR0aW1lID0gIiBhbmQgUG9zdGVkIDw9 IG5vdygpIjsKICAgIH0KICAgIGdsb2JhbCAkcHJlZnM7CiAgICBleHRyYWN0KCRwcmVmcyk7 CiAgICBpZiAoISRwdWJsaXNoX2V4cGlyZWRfYXJ0aWNsZXMpIHsKCSR0aW1lIC49ICIgYW5k IChub3coKSA8PSBFeHBpcmVzIG9yIEV4cGlyZXMgPSAiLk5VTExEQVRFVElNRS4iKSI7CiAg ICB9CgogICAgJGFsbF90YWdzID0gYXJyYXkoKTsKICAgICRycyA9IHNhZmVfcm93cygiJHRh Z3NfZmllbGQiLCAidGV4dHBhdHRlcm4iLCAiJHRhZ3NfZmllbGQgPD4gJyciIC4gJHNlY3Rp b25fY2xhdXNlIC4gJGZpbHRlciAuICIgYW5kIFN0YXR1cyA+PSAnNCciIC4gJHRpbWUpOwog ICAgZm9yZWFjaCAoJHJzIGFzICRyb3cpIHsKCSR0ZW1wX2FycmF5ID0gYXJyYXkoKTsKaWYg KGlzc2V0KCRyb3dbJHRhZ3NfZmllbGRdKSkgewoJICAgICR0ZW1wX2FycmF5ID0gZXhwbG9k ZSgiLCIsIHRyaW0odHJ1X3RhZ3Nfc3RydG9sb3dlcigkcm93WyR0YWdzX2ZpZWxkXSkpKTsK ICAgICAgICAgICAgICAgICAgICAgIH0KCglmb3JlYWNoKHRydV90YWdzX3RyaW1fdGFncygk dGVtcF9hcnJheSkgYXMgJGkpIHskYWxsX3RhZ3NbXSA9ICRpO30KICAgIH0KCiAgICByZXR1 cm4gJGFsbF90YWdzOwp9CgoKZnVuY3Rpb24gdHJ1X3RhZ3NfZmlsdGVyX3NlY3Rpb25zKCRl eGNsdWRlc2VjdGlvbikgewogICAgJHNlY3Rpb25zID0gZXhwbG9kZSgnLCcsICRleGNsdWRl c2VjdGlvbik7CiAgICAkZmlsdGVycyA9IGFycmF5KCk7CiAgICBmb3JlYWNoICgkc2VjdGlv bnMgYXMgJHNlY3Rpb24pIHsKCSRmaWx0ZXJzW10gPSAiYW5kIFNlY3Rpb24gIT0gJyIuZG9T bGFzaCgkc2VjdGlvbikuIiciOwogICAgfQogICAgcmV0dXJuIGpvaW4oJyAnLCAkZmlsdGVy cyk7Cn0KCgpmdW5jdGlvbiB0cnVfdGFnc19yZW5kZXJfY2xvdWQoJGF0dHMsICRhbGxfdGFn cywgJGFsbF90YWdzX2Zvcl93ZWlnaHQpIHsKICAgIGdsb2JhbCAkdHJ1X3RhZ3NfcHJlZnM7 CiAgICBleHRyYWN0KCRhdHRzKTsKCiAgICAkdGFnc193ZWlnaHQgPSBhcnJheV9jb3VudF92 YWx1ZXMoJGFsbF90YWdzX2Zvcl93ZWlnaHQpOwoKICAgIGZvcmVhY2ggKCR0YWdzX3dlaWdo dCBhcyAkdGFnID0+ICR3ZWlnaHQpIHsKCWlmICghaW5fYXJyYXkoJHRhZywgJGFsbF90YWdz KQoJICAgfHwgJHRhZ3Nfd2VpZ2h0WyR0YWddIDwgJG1pbnRhZ2NvdW50CgkgICB8fCAkdGFn c193ZWlnaHRbJHRhZ10gPiAkbWF4dGFnY291bnQpIHsKCSAgICB1bnNldCgkdGFnc193ZWln aHRbJHRhZ10pOwoJfQogICAgfQoKICAgICRzb3J0X2J5X2NvdW50ID0gKHN0cnBvcygkc29y dCwgJ2NvdW50JykgIT09IGZhbHNlKTsKICAgICRzb3J0X2FzY2VuZGluZyA9IChzdHJwb3Mo JHNvcnQsICdhc2MnKSAhPT0gZmFsc2UpOwogICAgJHRhZ3Nfd2VpZ2h0ID0gdHJ1X3RhZ3Nf c29ydF90YWdzKCR0YWdzX3dlaWdodCwgJHNvcnRfYnlfY291bnQsICRzb3J0X2FzY2VuZGlu Zyk7CgogICAgaWYgKCRsaXN0bGltaXQgPiAwICYmICRsaXN0bGltaXQgPCBjb3VudCgkdGFn c193ZWlnaHQpKSB7CgkkcmVzb3J0ZWRfdGFncyA9IGFycmF5KCk7CglpZiAoJGtlZXAgPT0g J2xhcmdlc3QnKSB7CgkgICAgJHJlc29ydGVkX3RhZ3MgPSBhcnJheV9rZXlzKHRydV90YWdz X3NvcnRfdGFncygkdGFnc193ZWlnaHQsIHRydWUsIGZhbHNlKSk7Cgl9IGVsc2UgewoJICAg IGlmICgka2VlcCA9PSAncmFuZG9tJykgewoJCWZvcmVhY2ggKCR0YWdzX3dlaWdodCBhcyAk dGFnID0+ICR3ZWlnaHQpIHsKCQkgICAgJHJlc29ydGVkX3RhZ3NbJHRhZ10gPSByYW5kKDAs ICR3ZWlnaHQpOwoJCX0KCQkkcmVzb3J0ZWRfdGFncyA9IGFycmF5X2tleXModHJ1X3RhZ3Nf c29ydF90YWdzKCRyZXNvcnRlZF90YWdzLCB0cnVlLCBmYWxzZSkpOwoJICAgIH0gZWxzZSBp ZiAoJGtlZXAgPT0gJ2FscGhhJykgewoJCSRyZXNvcnRlZF90YWdzID0gYXJyYXlfa2V5cygk dGFnc193ZWlnaHQpOwoJCW5hdGNhc2Vzb3J0KCRyZXNvcnRlZF90YWdzKTsKCSAgICB9Cgkg ICAgJGN1dG9mZiA9ICdleGFjdCc7Cgl9CgoJJGxhc3RfZ29vZF9pbmRleCA9ICRsaXN0bGlt aXQgLSAxOwoJaWYgKCRjdXRvZmYgPT0gJ2NodW5rJykgeyAvL2FsdGVybmF0aXZlIGlzICdl eGFjdCcKCSAgICAkbGFzdF93ZWlnaHQgPSAtMTsKCSAgICBmb3IgKCRpID0gMDsgJGkgPCAk bGlzdGxpbWl0ICsgMTsgJGkrKykgewoJCSRuZXdfd2VpZ2h0ID0gJHRhZ3Nfd2VpZ2h0WyRy ZXNvcnRlZF90YWdzWyRpXV07CgkJaWYgKCRuZXdfd2VpZ2h0ICE9ICRsYXN0X3dlaWdodCkg ewoJCSAgICAkbGFzdF9nb29kX2luZGV4ID0gJGkgLSAxOwoJCSAgICAkbGFzdF93ZWlnaHQg PSAkbmV3X3dlaWdodDsKCQl9CgkgICAgfQoJICAgIGlmICgkbGFzdF9nb29kX2luZGV4IDwg MCkgewoJCSRsYXN0X2dvb2RfaW5kZXggPSAkbGlzdGxpbWl0IC0gMTsKCSAgICB9Cgl9CgoJ JHJlc29ydGVkX3RhZ3MgPSBhcnJheV9jaHVuaygkcmVzb3J0ZWRfdGFncywgJGxhc3RfZ29v ZF9pbmRleCArIDEpOwoJJHJlc29ydGVkX3RhZ3MgPSAkcmVzb3J0ZWRfdGFnc1swXTsKCglm b3JlYWNoICgkdGFnc193ZWlnaHQgYXMgJHRhZyA9PiAkd2VpZ2h0KSB7CgkgICAgaWYgKCFp bl9hcnJheSgkdGFnLCAkcmVzb3J0ZWRfdGFncykpIHsKCQl1bnNldCgkdGFnc193ZWlnaHRb JHRhZ10pOwoJICAgIH0KCX0KICAgIH0KCiAgICBpZiAoJGdlbmVyYXRlbGlua3MpIHsKCWlm ICgkbGlua3BhdGgpIHsKCSAgICAkdXJscHJlZml4ID0gJGxpbmtwYXRoOwoJICAgICR1cmxz dWZmaXggPSAkbGlua3BhdGh0YWlsOwoJfSBlbHNlIHsKCSAgICBpZiAodHJ1X3RhZ3NfY2xl YW5fdXJscygpKSB7CgkJJHVybHByZWZpeCA9IGh1IC4gJHRydV90YWdzX3ByZWZzW1RBR19T RUNUSU9OXS0+dmFsdWUgLiAnLyc7CgkgICAgfSBlbHNlIHsKCQkkdXJscHJlZml4ID0gaHUg LiAnP3M9JyAuICR0cnVfdGFnc19wcmVmc1tUQUdfU0VDVElPTl0tPnZhbHVlIC4gJyZhbXA7 JyAuICR0cnVfdGFnc19wcmVmc1tQQVJNX05BTUVdLT52YWx1ZSAuICc9JzsKCSAgICB9Cgkg ICAgJHVybHN1ZmZpeCA9ICh0cnVfdGFnc19jbGVhbl91cmxzKCkgPyAnLycgOiAnJyk7Cgl9 CgoJaWYgKCR1c2VyZWx0YWcpIHsKCSAgICBpZiAoJHVzZW5vZm9sbG93KSB7CgkJJHVybHN1 ZmZpeCAuPSAnIiByZWw9InRhZyBub2ZvbGxvdyc7CgkgICAgfSBlbHNlIHsKCQkkdXJsc3Vm Zml4IC49ICciIHJlbD0idGFnJzsKCSAgICB9Cgl9IGVsc2UgaWYgKCR1c2Vub2ZvbGxvdykg ewoJICAgICR1cmxzdWZmaXggLj0gJyIgcmVsPSJub2ZvbGxvdyc7Cgl9CiAgICB9CgogICAg aWYgKGNvdW50KCR0YWdzX3dlaWdodCkgPiAwKSB7CgkkbWF4ID0gbWF4KCR0YWdzX3dlaWdo dCk7CgkkbWluID0gbWluKCR0YWdzX3dlaWdodCk7CiAgICB9IGVsc2UgewoJJG1heCA9ICRt aW4gPSAwOwogICAgfQogICAgJHN0ZXB2YWx1ZSA9ICgkbWF4ID09ICRtaW4pID8gMCA6ICgk bWF4cGVyY2VudCAtICRtaW5wZXJjZW50KSAvICgkbWF4IC0gJG1pbik7CgogICAgJHRhZ3Nf aHRtbCA9IGFycmF5KCk7Ci8vCSR0YWdfc2VhcmNoX3RhZyA9IHRydV90YWdzX3RhZ19wYXJh bWV0ZXIoYXJyYXkoJ3N0cmlwaHlwaGVucycgPT4gJ2xvb2t1cCcpKTsKICAgICR0YWdfc2Vh cmNoX3RhZyA9IHRydV90YWdzX3RhZ19wYXJhbWV0ZXIoYXJyYXkoKSk7CiAgICAkdGFnX3Nl YXJjaF90YWcgPSBmdW5jdGlvbl9leGlzdHMoImh0bWxzcGVjaWFsY2hhcnNfZGVjb2RlIikg PyBodG1sc3BlY2lhbGNoYXJzX2RlY29kZSgkdGFnX3NlYXJjaF90YWcpIDogaHRtbF9lbnRp dHlfZGVjb2RlKCR0YWdfc2VhcmNoX3RhZyk7CiAgICBmb3JlYWNoICgkdGFnc193ZWlnaHQg YXMgJHRhZyA9PiAkd2VpZ2h0KSB7CgkkdGFnX3dlaWdodCA9IGZsb29yKCRtaW5wZXJjZW50 ICsgKCR3ZWlnaHQgLSAkbWluKSAqICRzdGVwdmFsdWUpOwoKCSRzdHlsZSA9ICcnOwoJaWYg KCRzZXRzaXplcykKCSAgICAkc3R5bGUgPSAnIHN0eWxlPSJmb250LXNpemU6ICcgLiAkdGFn X3dlaWdodCAuICclOyInOwoKCSR0YWdfY2xhc3MgPSAnJzsKCWlmICgkc2V0Y2xhc3Nlcykg ewoJICAgICR0YWdfY2xhc3MgPSAnIGNsYXNzPSInOwoJICAgIGlmICgkd2VpZ2h0ID09ICRt aW4pIHsKCQkkdGFnX2NsYXNzIC49ICJ0YWdTaXplU21hbGxlc3QiOwoJICAgIH0gZWxzZSBp ZiAoJHdlaWdodCA9PSAkbWF4KSB7CgkJJHRhZ19jbGFzcyAuPSAidGFnU2l6ZUxhcmdlc3Qi OwoJICAgIH0gZWxzZSB7CgkJJHRhZ19jbGFzcyAuPSAidGFnU2l6ZU1lZGl1bSI7CgkgICAg fQoJICAgICR0YWdfY2xhc3MgLj0gJyB0YWdTaXplJyAuICgkd2VpZ2h0ICsgMSAtICRtaW4p OwoJICAgIGlmICgkdGFnID09ICR0YWdfc2VhcmNoX3RhZykgewoJCSR0YWdfY2xhc3MgLj0g JyAnIC4gJGFjdGl2ZWNsYXNzOwoJICAgIH0KCSAgICAkdGFnX2NsYXNzIC49ICciJzsKCX0K CgkvL2FkYXB0ZWQgZnJvbSBjb2RlIGJ5IGdkdHJvaWFubywgc2VlIGh0dHA6Ly9mb3J1bS50 ZXh0cGF0dGVybi5jb20vdmlld3RvcGljLnBocD9waWQ9MTAyODc1I3AxMDI4NzUKCSR0aXRs ZWNvdW50ID0gJyc7CglpZiAoJHRpdGxlKQoJICAgICR0aXRsZWNvdW50ID0gJyB0aXRsZT0i JyAuICR0aXRsZSAuICciJzsKCSRkaXNwbGF5Y291bnQ9ICcnOwoJJGNvdW50ID0gJGNvdW50 d3JhcGNoYXJzezB9IC4gJHdlaWdodCAuICRjb3VudHdyYXBjaGFyc3sxfTsKCWlmICgkc2hv d2NvdW50cyA9PSAndGl0bGUnIHx8ICRzaG93Y291bnRzID09ICdib3RoJykKCSAgICAkdGl0 bGVjb3VudCA9ICcgdGl0bGU9IicgLiAkdGl0bGUgLiAkY291bnQgLiAnIic7CglpZiAoJHNo b3djb3VudHMgJiYgJHNob3djb3VudHMgIT0gJ3RpdGxlJykKCSAgICAkZGlzcGxheWNvdW50 ID0gJyAnIC4gJGNvdW50OwoKCWlmICgkdGV4dHRyYW5zZm9ybSA9PSAnY2FwaXRhbGl6ZScp IHsKCSAgICAkdGFnID0gdHJ1X3RhZ3NfdWN3b3JkcygkdGFnKTsKCX0gZWxzZSBpZiAoJHRl eHR0cmFuc2Zvcm0gPT0gJ3VwcGVyY2FzZScpIHsKCSAgICAkdGFnID0gdHJ1X3RhZ3Nfc3Ry dG91cHBlcigkdGFnKTsKCX0gZWxzZSBpZiAoJHRleHR0cmFuc2Zvcm0gPT0gJ2xvd2VyY2Fz ZScpIHsKCSAgICAkdGFnID0gdHJ1X3RhZ3Nfc3RydG9sb3dlcigkdGFnKTsKCX0gZWxzZSBp ZiAoJHRleHR0cmFuc2Zvcm0gPT0gJ2NhcGZpcnN0JykgewoJICAgICR0YWcgPSB0cnVfdGFn c191Y2ZpcnN0KCR0YWcpOwoJfQoKCWlmICgkZ2VuZXJhdGVsaW5rcykgewoJICAgICR3aG9s ZXVybCA9ICciJyAuICR1cmxwcmVmaXggLiB1cmxlbmNvZGUoc3RyX3JlcGxhY2UoJyAnLCAn LScsICR0YWcpKSAuICR1cmxzdWZmaXggLiAnIic7CgkgICAgJHRhZ3NfaHRtbFtdID0gJzxh IGhyZWY9JyAuICR3aG9sZXVybCAuICR0YWdfY2xhc3MgLiAkc3R5bGUgLiAkdGl0bGVjb3Vu dCAuICc+JyAuIGh0bWxzcGVjaWFsY2hhcnMoJHRhZykgLiAnPC9hPicgLiAkZGlzcGxheWNv dW50OwoJfSBlbHNlIGlmICgkdGFnX2NsYXNzIHx8ICRzdHlsZSB8fCAkdGl0bGVjb3VudCkg ewoJICAgICR0YWdzX2h0bWxbXSA9ICc8c3BhbicgLiAkdGFnX2NsYXNzIC4gJHN0eWxlIC4g JHRpdGxlY291bnQgLiAnPicgLiBodG1sc3BlY2lhbGNoYXJzKCR0YWcpIC4gJzwvc3Bhbj4n IC4gJGRpc3BsYXljb3VudDsKCX0gZWxzZSB7CgkgICAgJHRhZ3NfaHRtbFtdID0gaHRtbHNw ZWNpYWxjaGFycygkdGFnKSAuICRkaXNwbGF5Y291bnQ7Cgl9CiAgICB9CiAgICByZXR1cm4g dHJ1X3RhZ3NfZG9fd3JhcCgkdGFnc19odG1sLCAkd3JhcHRhZywgJGJyZWFrLCAkY2xhc3Ms ICRicmVha2NsYXNzKTsKfQoKCiMjIyBDTEVBTiBVUkwgRlVOQ1RJT05TICMjIwojIyMjIyMj IyMjIyMjIyMjIyMjIyMjIyMjIyMKCmlmICh0cnVfdGFnc19jbGVhbl91cmxzKCkpIHsKICAg IHJlZ2lzdGVyX2NhbGxiYWNrKCd0cnVfdGFnc19jbGVhbl91cmxfaGFuZGxlcicsICdwcmV0 ZXh0Jyk7Cn0KCgpmdW5jdGlvbiB0cnVfdGFnc19jbGVhbl91cmxfaGFuZGxlcigkZXZlbnQs ICRzdGVwKSB7CiAgICBnbG9iYWwgJHRydV90YWdzX3ByZWZzOwogICAgJHN1YnBhdGggPSBw cmVnX3JlcGxhY2UoIi9odHRwcz86XC9cLy4qKFwvLiopL1VpIiwiJDEiLGh1KTsKICAgICRy ZWdzYWZlc3VicGF0aCA9IHByZWdfcXVvdGUoJHN1YnBhdGgsICcvJyk7CiAgICAkcmVxID0g cHJlZ19yZXBsYWNlKCIvXiRyZWdzYWZlc3VicGF0aC9pIiwnLycsJF9TRVJWRVJbJ1JFUVVF U1RfVVJJJ10pOwoKICAgICRxcyA9IHN0cnBvcygkcmVxLCAnPycpOwogICAgJHFhdHRzID0g KCRxcyA/ICcmJy5zdWJzdHIoJHJlcSwgJHFzICsgMSkgOiAnJyk7CiAgICBpZiAoJHFzKSAk cmVxID0gc3Vic3RyKCRyZXEsIDAsICRxcyk7CgogICAgJHBhcnRzID0gYXJyYXlfdmFsdWVz KGFycmF5X2ZpbHRlcihleHBsb2RlKCcvJywgJHJlcSkpKTsKICAgIGlmIChjb3VudCgkcGFy dHMpID09IDIgJiYgJHBhcnRzWzBdID09ICR0cnVfdGFnc19wcmVmc1tUQUdfU0VDVElPTl0t PnZhbHVlKSB7CgkkdGFnID0gJHBhcnRzWzFdOwoJJF9TRVJWRVJbJ1FVRVJZX1NUUklORydd ID0gJHRydV90YWdzX3ByZWZzW1BBUk1fTkFNRV0tPnZhbHVlIC4gJz0nIC4gJHRhZyAuICRx YXR0czsKCSRfU0VSVkVSWydSRVFVRVNUX1VSSSddID0gJHN1YnBhdGggLiAkdHJ1X3RhZ3Nf cHJlZnNbVEFHX1NFQ1RJT05dLT52YWx1ZSAuICcvPycgLiAkX1NFUlZFUlsnUVVFUllfU1RS SU5HJ107CglpZiAoY291bnQoJF9QT1NUKSA+IDApIHsKCSAgICAkX1BPU1RbJ3NlY3Rpb24n XSA9ICR0cnVfdGFnc19wcmVmc1tUQUdfU0VDVElPTl0tPnZhbHVlOwoJICAgICRfUE9TVFsk dHJ1X3RhZ3NfcHJlZnNbUEFSTV9OQU1FXS0+dmFsdWVdID0gJHRhZzsKCX0gZWxzZSB7Cgkg ICAgJF9HRVRbJ3NlY3Rpb24nXSA9ICR0cnVfdGFnc19wcmVmc1tUQUdfU0VDVElPTl0tPnZh bHVlOwoJICAgICRfR0VUWyR0cnVfdGFnc19wcmVmc1tQQVJNX05BTUVdLT52YWx1ZV0gPSAk dGFnOwoJfQogICAgfQp9CgoKZnVuY3Rpb24gdHJ1X3RhZ3NfY2xlYW5fdXJscygpIHsKICAg IGdsb2JhbCAkdHJ1X3RhZ3NfcHJlZnM7CiAgICByZXR1cm4gKCdjbGVhbicgPT0gJHRydV90 YWdzX3ByZWZzW0NMRUFOX1VSTFNdLT52YWx1ZSk7Cn0KCgojIyMgQURNSU4gU0lERSBGVU5D VElPTlMgIyMjCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKCmlmIChAdHhwaW50ZXJm YWNlID09ICdhZG1pbicpIHsKICAgIGFkZF9wcml2cygndHJ1X3RhZ3MnLCAnMSwyJyk7CiAg ICByZWdpc3Rlcl90YWIoJ2V4dGVuc2lvbnMnLCAndHJ1X3RhZ3MnLCAndHJ1X3RhZ3MnKTsK ICAgIHJlZ2lzdGVyX2NhbGxiYWNrKCd0cnVfdGFnc19hZG1pbl90YWInLCAndHJ1X3RhZ3Mn KTsKCiAgICBpZiAoJHRydV90YWdzX3ByZWZzW1RBR1NfSU5fV1JJVEVfVEFCXS0+dmFsdWUg fHwgJHRydV90YWdzX3ByZWZzW0FVVE9DT01QTEVURV9JTl9XUklURV9UQUJdLT52YWx1ZSkg ewoJcmVnaXN0ZXJfY2FsbGJhY2soJ3RydV90YWdzX2FkbWluX3dyaXRlX3RhYl9oYW5kbGVy JywgJ2FydGljbGUnKTsKICAgIH0KfQoKCmZ1bmN0aW9uIHRydV90YWdzX2FkbWluX3RhYigk ZXZlbnQsICRzdGVwKSB7CiAgICByZXF1aXJlX3ByaXZzKCd0cnVfdGFncycpOwoKICAgICRy ZXN1bHRzID0gdHJ1X3RhZ3NfYWRtaW5fdGFiX2hhbmRsZV9pbnB1dCgpOwoKICAgICRhdHRz ID0gdHJ1X3RhZ3NfZ2V0X3N0YW5kYXJkX2Nsb3VkX2F0dHMoYXJyYXkoKSwgZmFsc2UsIGZh bHNlLCB0cnVlKTsKICAgICRhbGxfdGFncyA9IHRydV90YWdzX2Nsb3VkX3F1ZXJ5KCRhdHRz KTsKICAgICRjbG91ZCA9IHRydV90YWdzX3JlbmRlcl9jbG91ZCgkYXR0cywgJGFsbF90YWdz LCAkYWxsX3RhZ3MpOwoKICAgICRyZWRpcmVjdHMgPSB0cnVfdGFnc19sb2FkX3JlZGlyZWN0 cygpOwoKICAgIHRydV90YWdzX2FkbWluX3RhYl9yZW5kZXJfcGFnZSgkcmVzdWx0cywgJGNs b3VkLCAkcmVkaXJlY3RzKTsKfQoKCmZ1bmN0aW9uIHRydV90YWdzX2FkbWluX3RhYl9yZW5k ZXJfcGFnZSgkcmVzdWx0cywgJGNsb3VkLCAkcmVkaXJlY3RzKSB7CiAgICBnbG9iYWwgJGV2 ZW50OwogICAgcGFnZXRvcCgndHJ1X3RhZ3MnLCAnJyk7CgogICAgaW5jbHVkZV9vbmNlKHR4 cGF0aCAuICcvaW5jbHVkZS90eHBfcHJlZnMucGhwJyk7CiAgICBnbG9iYWwgJHRydV90YWdz X3ByZWZzOwoKICAgIGVjaG8gc3RhcnRUYWJsZSgnbGF5b3V0JywgJycsICcnLCAnMTBweCcp Lic8dHI+PHRkIHN0eWxlPSJib3JkZXItcmlnaHQ6MnB4IHNvbGlkIGdyYXkiPicuICAjIEkg a25vdywgSSBrbm93Li4uCglzdGFydFRhYmxlKCdsYXlvdXQnLCAnJywgJycsICcnLCAnMTBw eCcpLic8dHI+PHRkIHN0eWxlPSJib3JkZXItYm90dG9tOjJweCBzb2xpZCBncmF5Ij4nLgoJ ICAgIHN0YXJ0VGFibGUoJ2xpc3QnLCAnJywgJycsICcnLCAnMzAwcHgnKS4KCQl0cihoQ2Vs bChnVHh0KCdDdXJyZW50IHRhZ3MnKSkpLgoJCXRyKHRkKCRjbG91ZCkpLgoJICAgIGVuZFRh YmxlKCkuCgknPC90ZD48L3RyPjx0cj48dGQ+Jy4KCSAgICBzdGFydFRhYmxlKCdsaXN0Jywg JycsICcnLCAnJywgJzMwMHB4JykuCgkJdHIoaENlbGwoZ1R4dCgndHJ1X3RhZ3MgUmVmZXJl bmNlJykpKS4KCQl0cih0ZCgnPGEgaHJlZj0iaHR0cDovL3d3dy5yYWluc2tpdC5jb20vcmVm ZXJlbmNlLzQ5Ny90cnV0YWdzLXVzYWdlLWluc3RydWN0aW9ucyI+VXNhZ2UgaW5zdHJ1Y3Rp b25zPC9hPicuCgkJJzxicj48YSBocmVmPSJodHRwOi8vZm9ydW0udGV4dHBhdHRlcm4uY29t L3ZpZXd0b3BpYy5waHA/aWQ9MTUwODQiPkZvcnVtIHBhZ2VzPC9hPicuCgkJJzxicj48YSBo cmVmPSJodHRwOi8vd3d3LnJhaW5za2l0LmNvbS9yZWZlcmVuY2UvNTM3L3RydV90YWdzLXJl bGVhc2VzIj5SZWxlYXNlcyBwYWdlPC9hPicuCgkJJzxicj48YSBocmVmPSJodHRwOi8vd3d3 LnJhaW5za2l0LmNvbS9yZWZlcmVuY2UvNTU0L3RydV90YWdzLXJvYWRtYXAiPlJlbGVhc2Ug cm9hZG1hcDwvYT4nLgoJCSc8YnI+PGEgaHJlZj0iaHR0cDovL3d3dy5yYWluc2tpdC5jb20v cmVmZXJlbmNlLzQ5NS90cnV0YWdzLWZlYXR1cmUtbGlzdCI+RmVhdHVyZSBsaXN0PC9hPicu CgkJJzxicj48YnI+PGEgaHJlZj0iaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3RydS10YWdz L3NvdXJjZS9icm93c2UvdHJ1bmsvdHJ1X3RhZ3MucGhwIj50cnVfdGFncyBzb3VyY2UgY29k ZTwvYT4nLgoJCSc8YnI+PGEgaHJlZj0iaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3RydS10 YWdzL3NvdXJjZS9icm93c2UvdHJ1bmsvdHJ1X3RhZ3MtZG9jcy5odG1sIj5Tb3VyY2UgSFRN TCBmb3IgdGhlIHVzYWdlIGluc3RydWN0aW9uczwvYT4nLgoJCSc8YnI+PGJyPjxhIGhyZWY9 Imh0dHA6Ly93d3cucmFpbnNraXQuY29tL2Jsb2cvNDkzL3RydXRhZ3MtYS10YWdnaW5nLXBs dWdpbi1mb3ItdGV4dHBhdHRlcm4iPnRydV90YWdzPC9hPiwgYnkgPGEgaHJlZj0iaHR0cDov L3d3dy5yYWluc2tpdC5jb20vIj5OYXRoYW4gQXJ0aHVyPC9hPicuCgkJJzxicj48YnI+Jy4K CQknPGRpdiBpZD0icGF5cGFsIj48Zm9ybSBhY3Rpb249Imh0dHBzOi8vd3d3LnBheXBhbC5j b20vY2dpLWJpbi93ZWJzY3IiIG1ldGhvZD0icG9zdCI+PGlucHV0IHR5cGU9ImhpZGRlbiIg bmFtZT0iY21kIiB2YWx1ZT0iX3MteGNsaWNrIiAvPjxpbnB1dCB0eXBlPSJpbWFnZSIgc3Jj PSJodHRwczovL3d3dy5wYXlwYWwuY29tL2VuX1VTL2kvYnRuL3gtY2xpY2stYnV0MDQuZ2lm IiBuYW1lPSJzdWJtaXQiIGFsdD0iTWFrZSBhIGRvbmF0aW9uIHRvIE5hdGhhbiBBcnRodXIi IC8+PGltZyBhbHQ9IiIgYm9yZGVyPSIwIiBzcmM9Imh0dHBzOi8vd3d3LnBheXBhbC5jb20v ZW5fVVMvaS9zY3IvcGl4ZWwuZ2lmIiB3aWR0aD0iMSIgaGVpZ2h0PSIxIiAvPjxpbnB1dCB0 eXBlPSJoaWRkZW4iIG5hbWU9ImVuY3J5cHRlZCIgdmFsdWU9Ii0tLS0tQkVHSU4gUEtDUzct LS0tLU1JSUhUd1lKS29aSWh2Y05BUWNFb0lJSFFEQ0NCendDQVFFeGdnRXdNSUlCTEFJQkFE Q0JsRENCampFTE1Ba0dBMVVFQmhNQ1ZWTXhDekFKQmdOVkJBZ1RBa05CTVJZd0ZBWURWUVFI RXcxTmIzVnVkR0ZwYmlCV2FXVjNNUlF3RWdZRFZRUUtFd3RRWVhsUVlXd2dTVzVqTGpFVE1C RUdBMVVFQ3hRS2JHbDJaVjlqWlhKMGN6RVJNQThHQTFVRUF4UUliR2wyWlY5aGNHa3hIREFh QmdrcWhraUc5dzBCQ1FFV0RYSmxRSEJoZVhCaGJDNWpiMjBDQVFBd0RRWUpLb1pJaHZjTkFR RUJCUUFFZ1lDOGkxVDI3bGpLZnBOVEVRaTB3S0hjZEd1bHh4a01xd2RDTW1iR3ZzODduLzRU c0p0aUFzcU1vMmh5czdac0d5NVJGL083cytCMm9RNzZ6VWxUNTJXVzdRZVhVSzNHcDBucjJj UDNpb0JTdE51K1JaNmprYW0yRTBGR0xYeVY2K1VOVkVPd2g4bG1vSVNSb3R2U3ZJZ1F5VExu RWVESHFHOXF2VXpxdkYzU3FqRUxNQWtHQlNzT0F3SWFCUUF3Z2N3R0NTcUdTSWIzRFFFSEFU QVVCZ2dxaGtpRzl3MERCd1FJcG1QWnJsclpmWm1BZ2FpZVBWYituOXNWZHN1ZmdHcm1BdzJy WEF6UjM5a1lxUFVKN24wTGlORG1kQXE3M0pvUDUza1p5OGdTcG92dWNMMlMwakMxc1hyY3BF TEFwTEw4QkZTSGZkTGlab1pTVi9DWU9wcEg1K2R4MllxRklkeUNDZGpJWDdvT1BnUXlBdWdS YTJRcjNiK3l1dHVHMERGc2QrTEFKR2I4bDRDbm5yYm13ZFlLM05uVkRCUE9teEVPamxYVWdF emxGTFhtRTN3NStNb1BLUWNwMm44ZmRKTHNnRzE1eG9WUEZ6Q2QvSzJnZ2dPSE1JSURnekND QXV5Z0F3SUJBZ0lCQURBTkJna3Foa2lHOXcwQkFRVUZBRENCampFTE1Ba0dBMVVFQmhNQ1ZW TXhDekFKQmdOVkJBZ1RBa05CTVJZd0ZBWURWUVFIRXcxTmIzVnVkR0ZwYmlCV2FXVjNNUlF3 RWdZRFZRUUtFd3RRWVhsUVlXd2dTVzVqTGpFVE1CRUdBMVVFQ3hRS2JHbDJaVjlqWlhKMGN6 RVJNQThHQTFVRUF4UUliR2wyWlY5aGNHa3hIREFhQmdrcWhraUc5dzBCQ1FFV0RYSmxRSEJo ZVhCaGJDNWpiMjB3SGhjTk1EUXdNakV6TVRBeE16RTFXaGNOTXpVd01qRXpNVEF4TXpFMVdq Q0JqakVMTUFrR0ExVUVCaE1DVlZNeEN6QUpCZ05WQkFnVEFrTkJNUll3RkFZRFZRUUhFdzFO YjNWdWRHRnBiaUJXYVdWM01SUXdFZ1lEVlFRS0V3dFFZWGxRWVd3Z1NXNWpMakVUTUJFR0Ex VUVDeFFLYkdsMlpWOWpaWEowY3pFUk1BOEdBMVVFQXhRSWJHbDJaVjloY0dreEhEQWFCZ2tx aGtpRzl3MEJDUUVXRFhKbFFIQmhlWEJoYkM1amIyMHdnWjh3RFFZSktvWklodmNOQVFFQkJR QURnWTBBTUlHSkFvR0JBTUZIVHQzOFJNeExYSnlPMlNtUytOZGw3MlQ3b0tKNHU0dXcrNmF3 bnRBTFdoMDNQZXdtSUp1emJBTFNjc1RTNHNab1MxZktjaUJHb2gxMWdJZkh6eWx2a2ROZS9o Smw2Ni9SR3FyajVyRmIwOHNBQUJOVHpEVGlxcU5wSmVCc1lzL2MyYWlHb3pwdFgyUmxuQmt0 SCtTVU5wQWFqVzcyNE52Mld2aGlmNnNGQWdNQkFBR2pnZTR3Z2Vzd0hRWURWUjBPQkJZRUZK YWZmTHZHYnhlOVdUOVMxd29iN0JEV1pKUnJNSUc3QmdOVkhTTUVnYk13Z2JDQUZKYWZmTHZH YnhlOVdUOVMxd29iN0JEV1pKUnJvWUdVcElHUk1JR09NUXN3Q1FZRFZRUUdFd0pWVXpFTE1B a0dBMVVFQ0JNQ1EwRXhGakFVQmdOVkJBY1REVTF2ZFc1MFlXbHVJRlpwWlhjeEZEQVNCZ05W QkFvVEMxQmhlVkJoYkNCSmJtTXVNUk13RVFZRFZRUUxGQXBzYVhabFgyTmxjblJ6TVJFd0R3 WURWUVFERkFoc2FYWmxYMkZ3YVRFY01Cb0dDU3FHU0liM0RRRUpBUllOY21WQWNHRjVjR0Zz TG1OdmJZSUJBREFNQmdOVkhSTUVCVEFEQVFIL01BMEdDU3FHU0liM0RRRUJCUVVBQTRHQkFJ RmZPbGFhZ0ZybDcxK2pxNk9LaWRiV0ZTRStRNEZxUk92ZGdJT050aCs4a1NLLy9ZLzRpaHVF NFltdnpuNWNlRTNTL2lCU1FRTWp5dmIrczJUV2JRWUR3Y3AxMjlPUEliRDllcGRyNHRKT1VO aVNvanc3Qkh3WVJpUGg1OFMxeEdsRmdIRlh3ckVCYjNkZ05iTVVhK3U0cWVjdHNNQVhwVkhu RDl3SXlmbUhNWUlCbWpDQ0FaWUNBUUV3Z1pRd2dZNHhDekFKQmdOVkJBWVRBbFZUTVFzd0NR WURWUVFJRXdKRFFURVdNQlFHQTFVRUJ4TU5UVzkxYm5SaGFXNGdWbWxsZHpFVU1CSUdBMVVF Q2hNTFVHRjVVR0ZzSUVsdVl5NHhFekFSQmdOVkJBc1VDbXhwZG1WZlkyVnlkSE14RVRBUEJn TlZCQU1VQ0d4cGRtVmZZWEJwTVJ3d0dnWUpLb1pJaHZjTkFRa0JGZzF5WlVCd1lYbHdZV3d1 WTI5dEFnRUFNQWtHQlNzT0F3SWFCUUNnWFRBWUJna3Foa2lHOXcwQkNRTXhDd1lKS29aSWh2 Y05BUWNCTUJ3R0NTcUdTSWIzRFFFSkJURVBGdzB3T0RBM01ETXdOREUwTVRKYU1DTUdDU3FH U0liM0RRRUpCREVXQkJUMHRrajRkWkxlL0U0UXdiaWIyOVhFZEh4QVlqQU5CZ2txaGtpRzl3 MEJBUUVGQUFTQmdMNUpzUUhqUTlTZzRZM2VEV0tETzE2cit0ZkV6NFJZQUR0KzZoOTgxZmtW Q3hmTkhGRHhvZkRjeHl6Uk1Zcjd5OTVjZG5WaTRBTlF3TVVZNnlKVzVqbS9HRDE3cmpnU3ha TUV2c0FlNlljQ1NMSzVaYXBDdzFxbHlTcFBHWkJBM01UdDZPRCtvdlZvYS8xdjhDTnNFY0hw N2Y0dE94T1VTdzVQNG5IeUxQV2otLS0tLUVORCBQS0NTNy0tLS0tIj48L2Zvcm0+PC9kaXY+ JwoJCSkpLgoJICAgIGVuZFRhYmxlKCkuCgknPC90ZD48L3RyPicuZW5kVGFibGUoKS4KICAg ICc8L3RkPjx0ZD4nLgoJc3RhcnRUYWJsZSgnbGF5b3V0JywgJycsICcnLCAnMTBweCcpLic8 dHI+PHRkIHN0eWxlPSJib3JkZXItYm90dG9tOjJweCBzb2xpZCBncmF5O3dpZHRoOjQwMHB4 Ij4nOwoKCWlmICgkcmVzdWx0cykgewoJICAgIGVjaG8gc3RhcnRUYWJsZSgnbGlzdCcsICcn LCAnJywgJycsICcxMDAlJykuCgkJdHIoaENlbGwoZ1R4dCgnUmVzdWx0cycpKSkuCgkJdHIo dGRhKCRyZXN1bHRzKSwgJyBzdHlsZT0iY29sb3I6cmVkIicpLgoJICAgIGVuZFRhYmxlKCk7 CgkgICAgZWNobyAnPC90ZD48L3RyPjx0cj48dGQgc3R5bGU9ImJvcmRlci1ib3R0b206MnB4 IHNvbGlkIGdyYXkiPic7Cgl9CgoKCWVjaG8gc3RhcnRUYWJsZSgnbGlzdCcsICcnLCAnJywg JycsICcxMDAlJykuCgkgICAgdHIodGFnKGdUeHQoJ0FydGljbGUgVGFnIE1haW50ZW5hbmNl JykuJyAoJy5nVHh0KCdDYXNlIFNlbnNpdGl2ZScpLichKScsICd0aCcsICcgY29sc3Bhbj0i NSInKSkuCgkgICAgdHIoCgkJZm9ybSgKCQkgICAgdGRhKGdUeHQoJ1JlbmFtZScpLic6ICcs ICcgc3R5bGU9InZlcnRpY2FsLWFsaWduOm1pZGRsZSInKS4KCQkgICAgdGQodGV4dF9pbnB1 dCgnbWF0Y2h0YWcnLCAnJywgJzE1JykpLgoJCSAgICB0ZGEoZ1R4dCgndG8nKS4nOicsICcg c3R5bGU9InZlcnRpY2FsLWFsaWduOm1pZGRsZSInKS4KCQkgICAgdGQodGV4dF9pbnB1dCgn cmVwbGFjZXRhZycsICcnLCAnMTUnKSkuCgkJICAgIHRkKGZJbnB1dCgnc3VibWl0JywgJ3Jl cGxhY2UnLCBnVHh0KCdSdW4nKSwgJ3B1Ymxpc2gnKS5lSW5wdXQoJ3RydV90YWdzJykpLAoJ CSAgICAnJywgJyB2ZXJpZnkoXCcnIC4gZ1R4dCgnYXJlX3lvdV9zdXJlJykgLiAnXCcpIicK CQkpCgkgICAgKS4KCSAgICB0cigKCQlmb3JtKAoJCSAgICB0ZGEoZ1R4dCgnRGVsZXRlJyku JzogJywgJyBzdHlsZT0idmVydGljYWwtYWxpZ246bWlkZGxlIicpLgoJCSAgICB0ZCh0ZXh0 X2lucHV0KCdkZWxldGV0YWcnLCAnJywgJzE1JykpLgoJCSAgICB0ZGNzKCcnLCAyKS4KCQkg ICAgdGQoZklucHV0KCdzdWJtaXQnLCAnZGVsZXRlJywgZ1R4dCgnUnVuJyksICdwdWJsaXNo JykuZUlucHV0KCd0cnVfdGFncycpKSwKCQkgICAgJycsICcgdmVyaWZ5KFwnJyAuIGdUeHQo J2FyZV95b3Vfc3VyZScpIC4gJ1wnKSInCgkJKQoJICAgICkuCgllbmRUYWJsZSgpOwoKICAg IGVjaG8gJzwvdGQ+PC90cj48dHI+PHRkIHN0eWxlPSJib3JkZXItYm90dG9tOjJweCBzb2xp ZCBncmF5Ij4nOwoKCWVjaG8gc3RhcnRUYWJsZSgnbGlzdCcsICcnLCAnJywgJycsICcxMDAl JykuCgkgICAgdHIodGFnKGdUeHQoJ1JlZGlyZWN0aW9ucycpLCAndGgnLCAnIGNvbHNwYW49 IjQiJykpOwoJICAgIGZvcmVhY2ggKCRyZWRpcmVjdHMgYXMgJGxlZnR0YWcgPT4gJHJpZ2h0 dGFnKSB7CgkJZWNobyB0cigKCQkgICAgdGRhKGhyZWYoJGxlZnR0YWcsIHRydV90YWdzX2xp bmtpZnlfdGFnKCRsZWZ0dGFnKSksICcgc3R5bGU9InRleHQtYWxpZ246IGNlbnRlciInKS4K CQkgICAgdGRhKGh0bWxzcGVjaWFsY2hhcnMoJz0+JyksICcgc3R5bGU9InRleHQtYWxpZ246 IGNlbnRlciInKS4KCQkgICAgdGRhKGhyZWYoJHJpZ2h0dGFnLCB0cnVfdGFnc19saW5raWZ5 X3RhZygkcmlnaHR0YWcpKSwgJyBzdHlsZT0idGV4dC1hbGlnbjogY2VudGVyIicpLgoJCSAg ICB0ZCgnPGEgaHJlZj0iaW5kZXgucGhwP2V2ZW50PXRydV90YWdzJmFtcDtkZWxldGVfcmVk aXJlY3Q9Jy51cmxlbmNvZGUoJGxlZnR0YWcpLiciICBvbmNsaWNrPSJyZXR1cm4gdmVyaWZ5 KFwnJy5nVHh0KCdhcmVfeW91X3N1cmUnKS4nXCcpIj5EZWxldGU8L2E+JykKCQkpOwoJICAg IH0KCSAgICBlY2hvIHRyKAoJCSc8Zm9ybSBuYW1lPSJyZWRpcmVjdCIgaWQ9InJlZGlyZWN0 IiBtZXRob2Q9InBvc3QiIGFjdGlvbj0iaW5kZXgucGhwP2V2ZW50PXRydV90YWdzIiBvbnN1 Ym1pdD0icmV0dXJuIHZlcmlmeShcJycuZ1R4dCgnYXJlX3lvdV9zdXJlJykuJ1wnKSI+Jy4K CQkgICAgdGRhKHRleHRfaW5wdXQoJ2xlZnR0YWcnLCAnJywgJzE1JyksICcgc3R5bGU9InRl eHQtYWxpZ246Y2VudGVyIicpLgoJCSAgICB0ZGEoaHRtbHNwZWNpYWxjaGFycygnPT4nKSwg JyBzdHlsZT0idmVydGljYWwtYWxpZ246bWlkZGxlO3RleHQtYWxpZ246Y2VudGVyIicpLgoJ CSAgICB0ZGEodGV4dF9pbnB1dCgncmlnaHR0YWcnLCAnJywgJzE1JyksICcgc3R5bGU9InRl eHQtYWxpZ246Y2VudGVyIicpLgoJCSAgICB0ZGEoJzxhIGhyZWY9IiMiIG9uY2xpY2s9Imlm ICh2ZXJpZnkoXCcnLmdUeHQoJ2FyZV95b3Vfc3VyZScpLidcJykpIGRvY3VtZW50LmdldEVs ZW1lbnRCeUlkKFwncmVkaXJlY3RcJykuc3VibWl0KCk7IHJldHVybiBmYWxzZTsiPkFkZCBu ZXc8L2E+JywgJyBzdHlsZT0idmVydGljYWwtYWxpZ246bWlkZGxlIicpLgoJCSAgICBmSW5w dXQoJ2hpZGRlbicsICdyZWRpcmVjdCcsICcxJykuCgkJJzwvZm9ybT4nCgoJICAgICkuCgll bmRUYWJsZSgpOwoKICAgIGVjaG8gJzwvdGQ+PC90cj48dHI+PHRkPic7CgoJZWNobyBzdGFy dFRhYmxlKCdsaXN0JykuCgkgICAgdHIodGFnKGdUeHQoJ1ByZWZlcmVuY2VzJyksICd0aCcs ICcgY29sc3Bhbj0iMiInKSkuCgkgICAgZm9ybSgKCQl0cigKCQkgICAgdGRhKGdUeHQoJ1Vz ZSBjbGVhbiBVUkxzJykuJyAoJy5nVHh0KCdzaXRlIGRlZmF1bHQgaXMnKS4nICcuJHRydV90 YWdzX3ByZWZzW0NMRUFOX1VSTFNdLT5kZWZhdWx0X3ZhbHVlLicpOiAnLCAnIHN0eWxlPSJ2 ZXJ0aWNhbC1hbGlnbjptaWRkbGUiJykuCgkJICAgIHRkKHJhZGlvX2xpc3QoQ0xFQU5fVVJM UywKCQkJICAgIGFycmF5KCdjbGVhbic9PmdUeHQoJ2NsZWFuJyksICdtZXNzeSc9PmdUeHQo J21lc3N5JykpLAoJCQkgICAgJHRydV90YWdzX3ByZWZzW0NMRUFOX1VSTFNdLT52YWx1ZSkp CgkJKS4KCQl0cigKCQkgICAgdGRhKGdUeHQoJ1RhZyBzZWN0aW9uIG5hbWUnKS4nIChkZWZh dWx0IGlzICInLiR0cnVfdGFnc19wcmVmc1tUQUdfU0VDVElPTl0tPmRlZmF1bHRfdmFsdWUu JyIpOiAnLCAnIHN0eWxlPSJ2ZXJ0aWNhbC1hbGlnbjptaWRkbGUiJykuCgkJICAgIHRkKHRl eHRfaW5wdXQoVEFHX1NFQ1RJT04sICR0cnVfdGFnc19wcmVmc1tUQUdfU0VDVElPTl0tPnZh bHVlLCAnMTUnKSkKCQkpLgoJCXRyKAoJCSAgICB0ZGEoZ1R4dCgnVVJMIHBhcmFtZXRlciBm b3IgdGFnIHNlYXJjaCcpLicgKGRlZmF1bHQgaXMgIicuJHRydV90YWdzX3ByZWZzW1BBUk1f TkFNRV0tPmRlZmF1bHRfdmFsdWUuJyIpOiAnLgoJCQknPGJyPjxlbT4oeW91IHNob3VsZG5c J3QgY2hhbmdlIHRoaXMgdW5sZXNzIHlvdSByZWFsbHkga25vdyB3aGF0IHlvdSBhcmUgZG9p bmcpPC9lbT4nLCAnIHN0eWxlPSJ2ZXJ0aWNhbC1hbGlnbjptaWRkbGUiJykuCgkJICAgIHRk KHRleHRfaW5wdXQoUEFSTV9OQU1FLCAkdHJ1X3RhZ3NfcHJlZnNbUEFSTV9OQU1FXS0+dmFs dWUsICcxNScpKQoJCSkuCgkJdHIoCgkJICAgIHRkYShnVHh0KCdQdXQgdGFncyBpbnRvIFJT Uy9BdG9tIGZlZWRzLCBpbiAiQ2F0ZWdvcnkiIGVsZW1lbnRzJykuCgkJCSc6IDxicj48ZW0+ KHlvdSBwcm9iYWJseSB3YW50IHRoaXMpPC9lbT4nLCAnIHN0eWxlPSJ2ZXJ0aWNhbC1hbGln bjptaWRkbGUiJykuCgkJICAgIHRkKHllc25vUmFkaW8oVEFHU19JTl9GRUVEX0NBVEVHT1JJ RVMsICR0cnVfdGFnc19wcmVmc1tUQUdTX0lOX0ZFRURfQ0FURUdPUklFU10tPnZhbHVlKSkK CQkpLgoJCXRyKAoJCSAgICB0ZGEoJ0FwcGVuZCB0aGUgdGFnIGxpc3QgdG8gdGhlIGJvZHkg b2YgUlNTL0F0b20gZmVlZHMsICcuCgkJCSd3aXRoIGxpbmtzLCBhbmQgd2l0aCByZWw9InRh ZyI6Jy4KCQkJJzxicj48ZW0+KGlmIHRoaXMgaXMgdHVybmVkIG9uLCcuCgkJCSd5b3UgY2Fu IGRlZmluZSBhICJtaXNjIiBmb3JtIG5hbWVkIHRydV90YWdzX2ZlZWRfdGFncyAnLgoJCQkn dGhhdCB3aWxsIGJlIHVzZWQgdG8gcmVuZGVyIHRoZSB0YWdzIGluIHRoZSBmZWVkKTwvZW0+ JywKCQkJJyBzdHlsZT0idmVydGljYWwtYWxpZ246bWlkZGxlIicpLgoJCSAgICB0ZCh5ZXNu b1JhZGlvKFRBR1NfSU5fRkVFRF9CT0RZLCAkdHJ1X3RhZ3NfcHJlZnNbVEFHU19JTl9GRUVE X0JPRFldLT52YWx1ZSkpCgkJKS4KCQl0cigKCQkgICAgdGRhKGdUeHQoJ1Nob3cgYSBjbGlj a2FibGUgbGlzdCBvZiB0YWdzIG9uIHRoZSAiV3JpdGUiIHBhZ2UnKS4nOiAnLAoJCQknIHN0 eWxlPSJ2ZXJ0aWNhbC1hbGlnbjptaWRkbGUiJykuCgkJICAgIHRkKHllc25vUmFkaW8oVEFH U19JTl9XUklURV9UQUIsICR0cnVfdGFnc19wcmVmc1tUQUdTX0lOX1dSSVRFX1RBQl0tPnZh bHVlKSkKCQkpLgoJCXRyKAoJCSAgICB0ZGEoZ1R4dCgnQXV0b2NvbXBsZXRlIHRhZ3Mgb24g dGhlICJXcml0ZSIgcGFnZScpLic6IDxicj4nLgoJCQknPGVtPihyZXF1aXJlcyB0aGF0IHRo ZSA8YSBocmVmPSJodHRwOi8vYmFzc2lzdGFuY2UuZGUvanF1ZXJ5LXBsdWdpbnMvanF1ZXJ5 LXBsdWdpbi1hdXRvY29tcGxldGUvIj5qUXVlcnkgQXV0b2NvbXBsZXRlIHBsdWdpbjwvYT4g PGNvZGU+LmNzczwvY29kZT4gYW5kIDxjb2RlPi5taW4uanM8L2NvZGU+IGZpbGVzIGJlIHVw bG9hZGVkIGludG8gYSAiPGNvZGU+anM8L2NvZGU+IiBmb2xkZXIgb24geW91ciBzaXRlKTwv ZW0+JywKCQkJJyBzdHlsZT0idmVydGljYWwtYWxpZ246bWlkZGxlIicpLgoJCSAgICB0ZCh5 ZXNub1JhZGlvKEFVVE9DT01QTEVURV9JTl9XUklURV9UQUIsICR0cnVfdGFnc19wcmVmc1tB VVRPQ09NUExFVEVfSU5fV1JJVEVfVEFCXS0+dmFsdWUpKQoJCSkuCgkJdHIoCgkJICAgIHRk YShnVHh0KCdDb252ZXJ0IHRhZ3MgdG8gbG93ZXJjYXNlIGJ5IGRlZmF1bHQnKS4nOiA8YnI+ Jy4KCQkJJzxlbT4oeW91IHByb2JhYmx5IHdhbnQgdGhpcywgdW5sZXNzIHlvdSBhcmUgaGF2 aW5nIHByb2JsZW1zIHdpdGggdXRmLTggY2hhcmFjdGVycyk8L2VtPicsCgkJCScgc3R5bGU9 InZlcnRpY2FsLWFsaWduOm1pZGRsZSInKS4KCQkgICAgdGQoeWVzbm9SYWRpbyhVVEZfOF9D QVNFLCAkdHJ1X3RhZ3NfcHJlZnNbVVRGXzhfQ0FTRV0tPnZhbHVlKSkKCQkpLgoJCXRyKAoJ CSAgICB0ZCgnJykuCgkJICAgIHRkYShmSW5wdXQoJ3N1Ym1pdCcsICdwcmVmcycsIGdUeHQo J1NhdmUnKSwgJ3B1Ymxpc2gnKS5lSW5wdXQoJ3RydV90YWdzJyksICcgc3R5bGU9InRleHQt YWxpZ246cmlnaHQiJykKCQkpLAoJCScnLCAnIHZlcmlmeShcJycgLiBnVHh0KCdhcmVfeW91 X3N1cmUnKSAuICdcJykiJwoJICAgICkuCgllbmRUYWJsZSgpLic8L3RkPjwvdHI+Jy4KCWVu ZFRhYmxlKCk7CgogICAgZWNobyAnPC90ZD48L3RyPicuZW5kVGFibGUoKTsKfQoKCmZ1bmN0 aW9uIHRydV90YWdzX2FkbWluX3RhYl9oYW5kbGVfaW5wdXQoKSB7CiAgICBpZiAoZ3BzKCdw cmVmcycpKSB7CglyZXR1cm4gdHJ1X3RhZ3NfYWRtaW5fdXBkYXRlX3ByZWZzKCk7CiAgICB9 IGVsc2UgaWYgKGdwcygnZGVsZXRlJykpIHsKCXJldHVybiB0cnVfdGFnc19hZG1pbl9kZWxl dGVfdGFnKGdwcygnZGVsZXRldGFnJykpOwogICAgfSBlbHNlIGlmIChncHMoJ3JlcGxhY2Un KSkgewoJJHJlc3VsdCA9IHRydV90YWdzX2FkbWluX3JlcGxhY2VfdGFnKGdwcygnbWF0Y2h0 YWcnKSwgZ3BzKCdyZXBsYWNldGFnJyksIGZhbHNlKTsKCXJldHVybiAkcmVzdWx0IC4gJzxi cj4nIC4gdHJ1X3RhZ3NfYWRtaW5fcmVkaXJlY3RfdGFnKGdwcygnbWF0Y2h0YWcnKSwgZ3Bz KCdyZXBsYWNldGFnJykpOwogICAgfSBlbHNlIGlmIChncHMoJ3JlZGlyZWN0JykpIHsKCXJl dHVybiB0cnVfdGFnc19hZG1pbl9yZWRpcmVjdF90YWcoZ3BzKCdsZWZ0dGFnJyksIGdwcygn cmlnaHR0YWcnKSk7CiAgICB9IGVsc2UgaWYgKGdwcygnZGVsZXRlX3JlZGlyZWN0JykpIHsK CXJldHVybiB0cnVfdGFnc19hZG1pbl9kZWxldGVfcmVkaXJlY3QoZ3BzKCdkZWxldGVfcmVk aXJlY3QnKSk7CiAgICB9IGVsc2UgewoJcmV0dXJuICcnOwogICAgfQp9CgoKZnVuY3Rpb24g dHJ1X3RhZ3NfYWRtaW5fdXBkYXRlX3ByZWZzKCkgewogICAgZ2xvYmFsICR0cnVfdGFnc19w cmVmczsKICAgICRyZXN1bHRzID0gYXJyYXkoKTsKICAgIGZvcmVhY2ggKCR0cnVfdGFnc19w cmVmcyBhcyAkcHJlZikgewoJJHZhbGlkX3ZhbHVlID0gJHByZWYtPnZhbGlkYXRlX3ZhbHVl KGdwcygkcHJlZi0+bmFtZSkpOwoJaWYgKCR2YWxpZF92YWx1ZSAmJiAkdmFsaWRfdmFsdWUg PD4gZ3BzKCRwcmVmLT5uYW1lKSkgewoJICAgIHJldHVybiAkdmFsaWRfdmFsdWU7ICAjIyMg dGhpcyBpcyBhIHNuZWFreSB3YXkgdG8gaGFuZGxlIHZhbGlkYXRpb24gLSBzb3JyeSA7KQoJ fQoJaWYgKCR2YWxpZF92YWx1ZSA8PiAkcHJlZi0+dmFsdWUpIHsKCSAgICBpZiAoJHZhbGlk X3ZhbHVlID09ICRwcmVmLT5kZWZhdWx0X3ZhbHVlKSB7CgkJJHJlc3VsdCA9IHRydV90YWdz X2RlbGV0ZV9wcmVmKCRwcmVmLT5uYW1lKTsKCSAgICB9IGVsc2UgewoJCSRyZXN1bHQgPSB0 cnVfdGFnc191cHNlcnRfcHJlZigkcHJlZi0+bmFtZSwgJHZhbGlkX3ZhbHVlKTsKCSAgICB9 CgkgICAgaWYgKCRyZXN1bHQpIHsKCQkkcmVzdWx0c1tdID0gJ1VwZGF0ZWQgJyAuICRwcmVm LT5uYW1lOwoJCSRwcmVmLT52YWx1ZSA9ICR2YWxpZF92YWx1ZTsKCSAgICB9IGVsc2UgewoJ CSRyZXN1bHRzW10gPSAnRXJyb3IgdXBkYXRpbmcgJyAuICRwcmVmLT5uYW1lOwoJICAgIH0K CX0KICAgIH0KICAgIGlmIChjb3VudCgkcmVzdWx0cykgPT0gMCkgewoJcmV0dXJuICdObyBy ZWNvcmRzIG5lZWQgdXBkYXRpbmcnOwogICAgfSBlbHNlIHsKCXJldHVybiBqb2luKCc8YnI+ JywgJHJlc3VsdHMpOwogICAgfQp9CgoKZnVuY3Rpb24gdHJ1X3RhZ3NfdXBzZXJ0X3ByZWYo JG5hbWUsICR2YWx1ZSkgewogICAgaWYgKCFzYWZlX3F1ZXJ5KCdjcmVhdGUgdGFibGUgaWYg bm90IGV4aXN0cyAnIC4gc2FmZV9wZngoJ3RydV90YWdzX3ByZWZzJykuCgknIChuYW1lIHZh cmNoYXIoMjU1KSBwcmltYXJ5IGtleSwgJy4KCSd2YWx1ZSB2YXJjaGFyKDI1NSkgbm90IG51 bGwpJykpIHsKCXJldHVybiAnU2VyaW91cyBlcnJvciAtIHVuYWJsZSB0byBjcmVhdGUgdGhl ICcgLiBzYWZlX3BmeCgndHJ1X3RhZ3NfcHJlZnMnKSAuICcgdGFibGUuJzsKICAgIH0KCiAg ICByZXR1cm4gc2FmZV91cHNlcnQoJ3RydV90YWdzX3ByZWZzJywgJ3ZhbHVlPSInLiR2YWx1 ZS4nIicsICduYW1lPSInLiRuYW1lLiciJyk7Cn0KCgpmdW5jdGlvbiB0cnVfdGFnc19kZWxl dGVfcHJlZigkbmFtZSkgewogICAgaWYgKHNhZmVfZGVsZXRlKCd0cnVfdGFnc19wcmVmcycs ICduYW1lPSInLiRuYW1lLiciJykpIHsKCWlmIChzYWZlX2NvdW50KCd0cnVfdGFnc19wcmVm cycsICcxJykgPT0gMCAmJiAhc2FmZV9xdWVyeSgnZHJvcCB0YWJsZSAnIC4gc2FmZV9wZngo J3RydV90YWdzX3ByZWZzJykpKSB7CgkgICAgcmV0dXJuIGZhbHNlOwoJfQoJcmV0dXJuIHRy dWU7CiAgICB9IGVsc2UgewoJcmV0dXJuIGZhbHNlOwogICAgfQp9CgoKZnVuY3Rpb24gdHJ1 X3RhZ3NfYWRtaW5fZGVsZXRlX3RhZygkZGVsZXRldGFnKSB7CiAgICBpZiAodHJpbSgkZGVs ZXRldGFnKSkgewoJcmV0dXJuIHRydV90YWdzX2FkbWluX3JlcGxhY2VfdGFnKCRkZWxldGV0 YWcsICcnLCB0cnVlKTsKICAgIH0gZWxzZSB7CglyZXR1cm4gJ1BsZWFzZSBlbnRlciBhIHZh bHVlJzsKICAgIH0KfQoKCmZ1bmN0aW9uIHRydV90YWdzX2FkbWluX3JlcGxhY2VfdGFnKCRt YXRjaHRhZywgJHJlcGxhY2V0YWcsICRhbGxvd19ibGFua19yZXBsYWNldGFnKSB7CiAgICAk bWF0Y2h0YWcgPSB0cmltKCRtYXRjaHRhZyk7CiAgICAkcmVwbGFjZXRhZyA9IHRyaW0oJHJl cGxhY2V0YWcpOwogICAgaWYgKCRtYXRjaHRhZyAmJiAoJGFsbG93X2JsYW5rX3JlcGxhY2V0 YWcgfHwgJHJlcGxhY2V0YWcpKSB7CglpZiAoc2FmZV91cGRhdGUoJ3RleHRwYXR0ZXJuJywg VFJVX1RBR1NfRklFTEQuJz10cmltKGJvdGggXCcsXCcgZnJvbSByZXBsYWNlKGNvbmNhdCgi LCIsICcuVFJVX1RBR1NfRklFTEQuJywgIiwiKSwgY29uY2F0KCIsIiwgXCcnLmFkZHNsYXNo ZXMoJG1hdGNodGFnKS4nXCcsICIsIiksIFwnLCcuYWRkc2xhc2hlcygkcmVwbGFjZXRhZyku JyxcJykpJywgJzEnKSkgewoJICAgIHJldHVybiAnVXBkYXRlZCAnLm15c3FsX2FmZmVjdGVk X3Jvd3MoKS4nIHJvd3MgKCInLmh0bWxzcGVjaWFsY2hhcnMoJG1hdGNodGFnKS4nIj0+Iicu aHRtbHNwZWNpYWxjaGFycygkcmVwbGFjZXRhZykuJyIpJzsKCX0gZWxzZSB7CgkgICAgcmV0 dXJuICdFcnJvcjogJyAuIG15c3FsX2Vycm9yKCk7Cgl9CiAgICB9IGVsc2UgewoJcmV0dXJu ICdQbGVhc2UgZW50ZXIgYSB2YWx1ZSBpbiBib3RoIGZpZWxkcyc7CiAgICB9Cn0KCgpmdW5j dGlvbiB0cnVfdGFnc19hZG1pbl9yZWRpcmVjdF90YWcoJGxlZnR0YWcsICRyaWdodHRhZykg ewogICAgJGxlZnR0YWcgPSBhZGRzbGFzaGVzKHRydV90YWdzX3N0cnRvbG93ZXIodHJpbSgk bGVmdHRhZykpKTsKICAgICRyaWdodHRhZyA9IGFkZHNsYXNoZXModHJ1X3RhZ3Nfc3RydG9s b3dlcih0cmltKCRyaWdodHRhZykpKTsKICAgIGlmICghJGxlZnR0YWcgfHwgISRyaWdodHRh ZykgewoJcmV0dXJuICdQbGVhc2UgZW50ZXIgYSB2YWx1ZSBpbiBib3RoIGZpZWxkcyc7CiAg ICB9CgogICAgaWYgKCFzYWZlX3F1ZXJ5KCdjcmVhdGUgdGFibGUgaWYgbm90IGV4aXN0cyAn IC4gc2FmZV9wZngoJ3RydV90YWdzX3JlZGlyZWN0cycpLgoJJyAobGVmdHRhZyB2YXJjaGFy KDI1NSkgcHJpbWFyeSBrZXksICcuCgkncmlnaHR0YWcgdmFyY2hhcigyNTUpIG5vdCBudWxs KScpKSB7CglyZXR1cm4gJ1NlcmlvdXMgZXJyb3IgLSB1bmFibGUgdG8gY3JlYXRlIHRoZSAn IC4gc2FmZV9wZngoJ3RydV90YWdzX3JlZGlyZWN0cycpIC4gJyB0YWJsZS4nOwogICAgfQoK ICAgIGlmIChzYWZlX2luc2VydCgndHJ1X3RhZ3NfcmVkaXJlY3RzJywgJ2xlZnR0YWc9Iicu JGxlZnR0YWcuJyIscmlnaHR0YWc9IicuJHJpZ2h0dGFnLiciJykpIHsKCXJldHVybiAnUmVk aXJlY3QgYWRkZWQgKCInLmh0bWxzcGVjaWFsY2hhcnMoJGxlZnR0YWcpLiciPT4iJy5odG1s c3BlY2lhbGNoYXJzKCRyaWdodHRhZykuJyIpIC0gcGxlYXNlIHRlc3QgaXQhJzsKICAgIH0g ZWxzZSB7CglyZXR1cm4gJ0Vycm9yIGFkZGluZyByZWNvcmQgLSBkb2VzIGl0IGFscmVhZHkg ZXhpc3Q/JzsKICAgIH0KfQoKCmZ1bmN0aW9uIHRydV90YWdzX2FkbWluX2RlbGV0ZV9yZWRp cmVjdCgkbGVmdHRhZykgewogICAgaWYgKHNhZmVfZGVsZXRlKCd0cnVfdGFnc19yZWRpcmVj dHMnLCAnbGVmdHRhZz0iJy5hZGRzbGFzaGVzKCRsZWZ0dGFnKS4nIicpKSB7CglpZiAoc2Fm ZV9jb3VudCgndHJ1X3RhZ3NfcmVkaXJlY3RzJywgJzEnKSA9PSAwICYmICFzYWZlX3F1ZXJ5 KCdkcm9wIHRhYmxlICcgLiBzYWZlX3BmeCgndHJ1X3RhZ3NfcmVkaXJlY3RzJykpKSB7Cgkg ICAgcmV0dXJuICdSZWRpcmVjdCBkZWxldGVkLCBidXQgdW5hYmxlIHRvIGRyb3AgdGFibGUg JyAuIHNhZmVfcGZ4KCd0cnVfdGFnc19yZWRpcmVjdHMnKTsKCX0KCXJldHVybiAnUmVkaXJl Y3QgZGVsZXRlZCAoIicuaHRtbHNwZWNpYWxjaGFycygkbGVmdHRhZykuJyIpJzsKICAgIH0g ZWxzZSB7CglyZXR1cm4gJ0Vycm9yIGRlbGV0aW5nIHJlZGlyZWN0JzsKICAgIH0KfQoKCmZ1 bmN0aW9uIHRydV90YWdzX2FkbWluX3dyaXRlX3RhYl9oYW5kbGVyKCRldmVudCwgJHN0ZXAp IHsKICAgIGdsb2JhbCAkdHJ1X3RhZ3NfcHJlZnM7CiAgICAkYXR0cyA9IHRydV90YWdzX2dl dF9zdGFuZGFyZF9jbG91ZF9hdHRzKGFycmF5KCksIHRydWUsIHRydWUsIHRydWUpOwogICAg JGNsb3VkID0gYXJyYXlfdW5pcXVlKHRydV90YWdzX2Nsb3VkX3F1ZXJ5KCRhdHRzKSk7CiAg ICBuYXRjYXNlc29ydCgkY2xvdWQpOwoKICAgICRpZCA9IChlbXB0eSgkR0xPQkFMU1snSUQn XSkgPyBncHMoJ0lEJykgOiAkR0xPQkFMU1snSUQnXSk7CiAgICAkYXJ0aWNsZV90YWdzID0g KGVtcHR5KCRpZCkgPyBhcnJheSgpIDogdHJ1X3RhZ3NfZ2V0X3RhZ3NfZm9yX2FydGljbGUo JGlkKSk7CgogICAgJGxpbmtzID0gYXJyYXkoKTsKICAgICRyYXdfY2xvdWQgPSAnJzsKICAg IGZvcmVhY2ggKCRjbG91ZCBhcyAkdGFnKSB7Cgkkc3R5bGUgPSAoaW5fYXJyYXkoJHRhZywg JGFydGljbGVfdGFncykgPyAnIGNsYXNzPSJ0YWdfY2hvc2VuIicgOiAnJyk7CgkkbGlua3Nb XSA9ICc8YSBocmVmPSIjYWR2YW5jZWQiJy4kc3R5bGUuJyBvbmNsaWNrPSJ0b2dnbGVDbGFz cyh0aGlzLCB0b2dnbGVUYWcoXFxcJycuYWRkc2xhc2hlcyhhZGRzbGFzaGVzKGh0bWxzcGVj aWFsY2hhcnMoJHRhZykpKS4nXFxcJykpOyByZXR1cm4gZmFsc2U7Ij4nIC4gYWRkc2xhc2hl cyhodG1sc3BlY2lhbGNoYXJzKCR0YWcpKSAuICc8XC9hPic7CgkkcmF3X2Nsb3VkIC49ICci JyAuIGFkZFNsYXNoZXMoJHRhZykgLiAnIiwnOwogICAgfQogICAgJHJhd19jbG91ZCA9IHN1 YnN0cigkcmF3X2Nsb3VkLCAwLCBzdHJsZW4oJHJhd19jbG91ZCkgLSAxKTsKICAgICR0b19p bnNlcnQgPSBqb2luKCcsICcsICRsaW5rcyk7CgogICAgaWYgKCR0cnVfdGFnc19wcmVmc1tU QUdTX0lOX1dSSVRFX1RBQl0tPnZhbHVlKSB7CgkkanMgPSA8PDxFT0YKCSAgICB2YXIga2V5 d29yZHNGaWVsZCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdrZXl3b3JkcycpOwoJICAg IGtleXdvcmRzRmllbGQucGFyZW50Tm9kZS5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVF bGVtZW50KCdicicpKTsKCSAgICB2YXIgY2xvdWQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50 KCdzcGFuJyk7CgkgICAga2V5d29yZHNGaWVsZC5wYXJlbnROb2RlLmFwcGVuZENoaWxkKGNs b3VkKTsKCSAgICBjbG91ZC5zZXRBdHRyaWJ1dGUoJ2NsYXNzJywgJ3RydV90YWdzX2FkbWlu X3RhZ3MnKTsKCSAgICBjbG91ZC5pbm5lckhUTUwgPSAneyR0b19pbnNlcnR9JzsKCgkgICAg dmFyIHN0eWxlRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3N0eWxlJyk7Cgkg ICAgc3R5bGVFbGVtZW50LnNldEF0dHJpYnV0ZSgidHlwZSIsICJ0ZXh0L2NzcyIpOwoJICAg IHZhciBzdHlsZVRleHQgPSAnYS50YWdfY2hvc2Vue2JhY2tncm91bmQtY29sb3I6ICNGRUI7 IGNvbG9yOiBibGFjazt9JzsKCSAgICBpZiAoc3R5bGVFbGVtZW50LnN0eWxlU2hlZXQpIHsg Ly9JRQoJCXN0eWxlRWxlbWVudC5zdHlsZVNoZWV0LmNzc1RleHQgPSBzdHlsZVRleHQ7Cgkg ICAgfSBlbHNlIHsKCQl2YXIgdGV4dE5vZGUgPSBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShz dHlsZVRleHQpOwoJCXN0eWxlRWxlbWVudC5hcHBlbmRDaGlsZCh0ZXh0Tm9kZSk7CgkgICAg fQoJICAgIHZhciBoZWFkRWxlbWVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1l KCdoZWFkJylbMF07CgkgICAgaGVhZEVsZW1lbnQuYXBwZW5kQ2hpbGQoc3R5bGVFbGVtZW50 KTsKCgkgICAgZnVuY3Rpb24gdG9nZ2xlVGFnKHRhZ05hbWUpIHsKCQl2YXIgcmVnZXhUYWcg PSB0YWdOYW1lLnJlcGxhY2UoLyhbXFxcXFxeXFwkKitbXFxdP3t9Lj0hOih8KV0pL2csIlxc XFwkMSIpOwoJCXZhciB0YWdSZWdleCA9IG5ldyBSZWdFeHAoIigoXnwsKVxcXHMqKSIgKyBy ZWdleFRhZyArICJcXFxzKigsXFxccyp8JCkiKTsKCQl2YXIgdGV4dGFyZWEgPSBkb2N1bWVu dC5nZXRFbGVtZW50QnlJZCgna2V5d29yZHMnKTsKCQl2YXIgY3VydmFsID0gdGV4dGFyZWEu dmFsdWUucmVwbGFjZSgvLD9ccyskLywgJycpOwoJCWlmICgnJyA9PSBjdXJ2YWwpIHsKCQkg ICAgdGV4dGFyZWEudmFsdWUgPSB0YWdOYW1lOwoJCX0gZWxzZSBpZiAoY3VydmFsLm1hdGNo KHRhZ1JlZ2V4KSkgewoJCSAgICB0ZXh0YXJlYS52YWx1ZSA9IGN1cnZhbC5yZXBsYWNlKHRh Z1JlZ2V4LCAnJDEnKS5yZXBsYWNlKC8sP1xzKyQvLCAnJyk7CgkJICAgIHJldHVybiAnJzsK CQl9IGVsc2UgaWYgKCcsJyA9PSBjdXJ2YWwuY2hhckF0KGN1cnZhbC5sZW5ndGggLSAxKSkg ewoJCSAgICB0ZXh0YXJlYS52YWx1ZSArPSAnICcgKyB0YWdOYW1lOwoJCX0gZWxzZSB7CgkJ ICAgIHRleHRhcmVhLnZhbHVlICs9ICcsICcgKyB0YWdOYW1lOwoJCX0KCQlyZXR1cm4gJ3Rh Z19jaG9zZW4nOwoJICAgIH0KCgkgICAgZnVuY3Rpb24gdG9nZ2xlQ2xhc3MoZWxlbWVudCwg Y2xhc3NOYW1lKSB7CgkJZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2NsYXNzJywgY2xhc3NOYW1l KTsKCQllbGVtZW50LnNldEF0dHJpYnV0ZSgnY2xhc3NOYW1lJywgY2xhc3NOYW1lKTsgLyog Zm9yIElFICovCgkgICAgfQpFT0Y7CgllY2hvIHNjcmlwdF9qcygkanMpOwogICAgfQoKICAg IGlmICgkdHJ1X3RhZ3NfcHJlZnNbQVVUT0NPTVBMRVRFX0lOX1dSSVRFX1RBQl0tPnZhbHVl KSB7CgllY2hvIDw8PEVPRgoJICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4 dC9jc3MiIGhyZWY9Ii4uL2pzL2pxdWVyeS5hdXRvY29tcGxldGUuY3NzIiBtZWRpYT0icHJv amVjdGlvbiwgc2NyZWVuIiAvPgoJICAgIDxzY3JpcHQgc3JjPSIuLi9qcy9qcXVlcnkuYXV0 b2NvbXBsZXRlLm1pbi5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij48L3NjcmlwdD4KCSAg ICA8c2NyaXB0IGxhbmd1YWdlPSJKYXZhU2NyaXB0IiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQi PjwhLS0KCQkkKGRvY3VtZW50KS5yZWFkeShmdW5jdGlvbigpeyB2YXIgdGFncyA9IG5ldyBB cnJheSh7JHJhd19jbG91ZH0pOwoJCSAgICAkKCIja2V5d29yZHMiKS5hdXRvY29tcGxldGUo dGFncywgeyBtdWx0aXBsZTogdHJ1ZSwgbXVzdE1hdGNoOiBmYWxzZSwgYXV0b0ZpbGw6IGZh bHNlIH0pOwoJCX0pOwoJICAgIC8vLS0+PC9zY3JpcHQ+CkVPRjsKICAgIH0KCn0KCgojIyMg QVRPTS9SU1MgRkVFRCBGVU5DVElPTlMgIyMjCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj IyMjIyMKCnJlZ2lzdGVyX2NhbGxiYWNrKCd0cnVfdGFnc19hdG9tX2hhbmRsZXInLCAnYXRv bV9lbnRyeScpOwpmdW5jdGlvbiB0cnVfdGFnc19hdG9tX2hhbmRsZXIoJGV2ZW50LCAkc3Rl cCkgeyByZXR1cm4gdHJ1X3RhZ3NfZmVlZF9oYW5kbGVyKHRydWUpOyB9CnJlZ2lzdGVyX2Nh bGxiYWNrKCd0cnVfdGFnc19yc3NfaGFuZGxlcicsICdyc3NfZW50cnknKTsKZnVuY3Rpb24g dHJ1X3RhZ3NfcnNzX2hhbmRsZXIoJGV2ZW50LCAkc3RlcCkgeyByZXR1cm4gdHJ1X3RhZ3Nf ZmVlZF9oYW5kbGVyKGZhbHNlKTsgfQoKZnVuY3Rpb24gdHJ1X3RhZ3NfZmVlZF9oYW5kbGVy KCRhdG9tKSB7CiAgICBnbG9iYWwgJHRoaXNhcnRpY2xlLCAkdHJ1X3RhZ3NfcHJlZnM7CiAg ICBleHRyYWN0KCR0aGlzYXJ0aWNsZSk7CgogICAgJHRhZ3MgPSB0cnVfdGFnc19nZXRfdGFn c19mb3JfYXJ0aWNsZSgkdGhpc2lkKTsKCiAgICBpZiAoJHRydV90YWdzX3ByZWZzW1RBR1Nf SU5fRkVFRF9CT0RZXS0+dmFsdWUpIHsKCSRleHRyYWJvZHkgPSAnJzsKCSRGT1JNX05BTUUg PSAndHJ1X3RhZ3NfZmVlZF90YWdzJzsKCWlmIChmZXRjaCgnZm9ybScsICd0eHBfZm9ybScs ICduYW1lJywgJEZPUk1fTkFNRSkpIHsKCSAgICAkZm9ybSA9IGZldGNoX2Zvcm0oJEZPUk1f TkFNRSk7CgkgICAgJGV4dHJhYm9keSA9IHRyaW0ocGFyc2UoJGZvcm0pKTsKCX0gZWxzZSB7 CgkgICAgJGF0dHMgPSB0cnVfdGFnc19nZXRfc3RhbmRhcmRfY2xvdWRfYXR0cyhhcnJheSgp LCBmYWxzZSwgdHJ1ZSk7CgkgICAgJGV4dHJhYm9keSA9ICc8cD50YWdzOiAnIC4gdHJ1X3Rh Z3NfcmVuZGVyX2Nsb3VkKCRhdHRzLCAkdGFncywgJHRhZ3MpIC4gJzwvcD4nOwoJfQoJZ2xv YmFsICR0aGlzYXJ0aWNsZTsKCWlmICh0cmltKCR0aGlzYXJ0aWNsZVsnZXhjZXJwdCddKSkg ewoJICAgICR0aGlzYXJ0aWNsZVsnZXhjZXJwdCddID0gdHJpbSgkdGhpc2FydGljbGVbJ2V4 Y2VycHQnXSkubi4kZXh0cmFib2R5Lm47Cgl9CgkkdGhpc2FydGljbGVbJ2JvZHknXSA9IHRy aW0oJHRoaXNhcnRpY2xlWydib2R5J10pLm4uJGV4dHJhYm9keS5uOwogICAgfQoKICAgIGlm ICgkdHJ1X3RhZ3NfcHJlZnNbVEFHU19JTl9GRUVEX0NBVEVHT1JJRVNdLT52YWx1ZSkgewoJ JG91dHB1dCA9IGFycmF5KCk7Cglmb3JlYWNoICgkdGFncyBhcyAkdGFnKSB7CgkgICAgaWYg KCRhdG9tKSB7CgkJJG91dHB1dFtdID0gJzxjYXRlZ29yeSB0ZXJtPSInIC4gaHRtbHNwZWNp YWxjaGFycygkdGFnKSAuICciIC8+JzsKCSAgICB9IGVsc2UgewoJCSRvdXRwdXRbXSA9ICc8 Y2F0ZWdvcnk+JyAuIGh0bWxzcGVjaWFsY2hhcnMoJHRhZykgLiAnPC9jYXRlZ29yeT4nOwoJ ICAgIH0KCX0KCXJldHVybiBuLmpvaW4obiwgJG91dHB1dCkubjsKICAgIH0KfQoKCiMjIyBQ UkVGUyBGVU5DVElPTlMgLyBDTEFTU0VTICMjIwojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj IyMjIyMjIyMKCmNsYXNzIHRydV90YWdzX3ByZWYgewogICAgZnVuY3Rpb24gdHJ1X3RhZ3Nf cHJlZigkbmFtZSwgJGRlZmF1bHRfdmFsdWUsICR0eXBlKSB7CgkkdGhpcy0+bmFtZSA9ICRu YW1lOwoJJHRoaXMtPnZhbHVlID0gJGRlZmF1bHRfdmFsdWU7CgkkdGhpcy0+ZGVmYXVsdF92 YWx1ZSA9ICRkZWZhdWx0X3ZhbHVlOwoJJHRoaXMtPnR5cGUgPSAkdHlwZTsKICAgIH0KCiAg ICBmdW5jdGlvbiB2YWxpZGF0ZV92YWx1ZSgkdmFsdWUpIHsKCWlmICgkdmFsdWUpIHsKCSAg ICByZXR1cm4gJHZhbHVlOwoJfSBlbHNlIGlmICgkdGhpcy0+dHlwZSA9PSAnYm9vbGVhbicp IHsKCSAgICByZXR1cm4gJzAnOwoJfSBlbHNlIHsKCSAgICByZXR1cm4gJ1BsZWFzZSBlbnRl ciBhIHZhbHVlIGZvciAnIC4gJHRoaXMtPm5hbWU7Cgl9CiAgICB9Cn0KCmZ1bmN0aW9uIHRy dV90YWdzX2xvYWRfcHJlZnMoKSB7CiAgICAkcHJlZnMgPSBhcnJheSgpOwoKICAgIGdsb2Jh bCAkcGVybWxpbmtfbW9kZTsKICAgICRwcmVmc1tDTEVBTl9VUkxTXSA9IG5ldyB0cnVfdGFn c19wcmVmKENMRUFOX1VSTFMsICgkcGVybWxpbmtfbW9kZSAhPSAnbWVzc3knID8gJ2NsZWFu JyA6ICdtZXNzeScpLCAnc3RyaW5nJyk7CiAgICAkcHJlZnNbVEFHX1NFQ1RJT05dID0gbmV3 IHRydV90YWdzX3ByZWYoVEFHX1NFQ1RJT04sICd0YWcnLCAnc3RyaW5nJyk7CiAgICAkcHJl ZnNbUEFSTV9OQU1FXSA9IG5ldyB0cnVfdGFnc19wcmVmKFBBUk1fTkFNRSwgJ3QnLCAnc3Ry aW5nJyk7CiAgICAkcHJlZnNbVEFHU19JTl9GRUVEX0NBVEVHT1JJRVNdID0gbmV3IHRydV90 YWdzX3ByZWYoVEFHU19JTl9GRUVEX0NBVEVHT1JJRVMsICcxJywgJ2Jvb2xlYW4nKTsKICAg ICRwcmVmc1tUQUdTX0lOX0ZFRURfQk9EWV0gPSBuZXcgdHJ1X3RhZ3NfcHJlZihUQUdTX0lO X0ZFRURfQk9EWSwgJzAnLCAnYm9vbGVhbicpOwogICAgJHByZWZzW1RBR1NfSU5fV1JJVEVf VEFCXSA9IG5ldyB0cnVfdGFnc19wcmVmKFRBR1NfSU5fV1JJVEVfVEFCLCAnMScsICdib29s ZWFuJyk7CiAgICAkcHJlZnNbQVVUT0NPTVBMRVRFX0lOX1dSSVRFX1RBQl0gPSBuZXcgdHJ1 X3RhZ3NfcHJlZihBVVRPQ09NUExFVEVfSU5fV1JJVEVfVEFCLCAnMCcsICdib29sZWFuJyk7 CiAgICAkcHJlZnNbVVRGXzhfQ0FTRV0gPSBuZXcgdHJ1X3RhZ3NfcHJlZihVVEZfOF9DQVNF LCAnMScsICdib29sZWFuJyk7CgogICAgaWYgKG15c3FsX3F1ZXJ5KCJkZXNjcmliZSAiIC4g UEZYIC4gInRydV90YWdzX3ByZWZzIikpIHsKCSRycyA9IHNhZmVfcm93cygnKicsICd0cnVf dGFnc19wcmVmcycsICcxJyk7Cglmb3JlYWNoICgkcnMgYXMgJHJvdykgewoJICAgICRwcmVm c1skcm93WyduYW1lJ11dLT52YWx1ZSA9ICRyb3dbJ3ZhbHVlJ107Cgl9CiAgICB9CgogICAg cmV0dXJuICRwcmVmczsKfQoKCiMjIyBPVEhFUiBTVVBQT1JUIEZVTkNUSU9OUyAjIyMKIyMj IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwoKZnVuY3Rpb24gdHJ1X3RhZ3NfcmVkaXJl Y3RfaWZfbmVlZGVkKCR0YWdfcGFyYW1ldGVyKSB7CiAgICAkcmVkaXJlY3RzID0gdHJ1X3Rh Z3NfbG9hZF9yZWRpcmVjdHMoKTsKICAgIGZvcmVhY2ggKCRyZWRpcmVjdHMgYXMgJGxlZnR0 YWcgPT4gJHJpZ2h0dGFnKSB7CglpZiAoJGxlZnR0YWcgPT0gJHRhZ19wYXJhbWV0ZXIgfHwg JGxlZnR0YWcgPT0gc3RyX3JlcGxhY2UoJy0nLCAnICcsICR0YWdfcGFyYW1ldGVyKSkgewoJ ICAgIHRydV90YWdzX3JlZGlyZWN0KCRyaWdodHRhZywgZmFsc2UpOwoJICAgIHJldHVybiB0 cnVlOwoJfQogICAgfQoKICAgIHJldHVybiBmYWxzZTsKfQoKCmZ1bmN0aW9uIHRydV90YWdz X2xvYWRfcmVkaXJlY3RzKCkgewogICAgJHJlZGlyZWN0cyA9IGFycmF5KCk7CiAgICBpZiAo bXlzcWxfcXVlcnkoImRlc2NyaWJlICIgLiBQRlggLiAidHJ1X3RhZ3NfcmVkaXJlY3RzIikp IHsKCSRycyA9IHNhZmVfcm93cygnKicsICd0cnVfdGFnc19yZWRpcmVjdHMnLCAnMSBvcmRl ciBieSBsZWZ0dGFnJyk7Cglmb3JlYWNoICgkcnMgYXMgJHJvdykgewoJICAgICRyZWRpcmVj dHNbJHJvd1snbGVmdHRhZyddXSA9ICRyb3dbJ3JpZ2h0dGFnJ107Cgl9CiAgICB9CiAgICBy ZXR1cm4gJHJlZGlyZWN0czsKfQoKCmZ1bmN0aW9uIHRydV90YWdzX3JlZGlyZWN0KCRkZXN0 aW5hdGlvbiwgJGlzX2Z1bGxfdXJsKSB7CiAgICBnbG9iYWwgJHRydV90YWdzX3ByZWZzOwog ICAgaWYgKCRpc19mdWxsX3VybCkgewoJJHVybCA9ICRkZXN0aW5hdGlvbjsKCSRtZXNzYWdl ID0gJ1RoZSByZXNvdXJjZSB5b3UgcmVxdWVzdGVkIGhhcyBtb3ZlZCB0byAnIC4gJGRlc3Rp bmF0aW9uOwogICAgfSBlbHNlIHsKCSR1cmwgPSB0cnVfdGFnc19saW5raWZ5X3RhZygkZGVz dGluYXRpb24sIGZhbHNlKTsKCSRtZXNzYWdlID0gJ1RoZSByZXF1ZXN0ZWQgdGFnIGhhcyBi ZWVuIHJlcGxhY2VkIGJ5ICcgLiAkZGVzdGluYXRpb247CiAgICB9CgogICAgaGVhZGVyKCdM b2NhdGlvbjogJyAuICR1cmwpOwogICAgdHhwX2RpZSgkbWVzc2FnZSwgJzMwMScpOwp9CgoK ZnVuY3Rpb24gdHJ1X3RhZ3NfbGlua2lmeV90YWcoJHRhZywgJHVzZV9hbXAgPSB0cnVlKSB7 CiAgICBnbG9iYWwgJHRydV90YWdzX3ByZWZzOwogICAgaWYgKHRydV90YWdzX2NsZWFuX3Vy bHMoKSkgewoJJHVybHByZWZpeCA9IGh1IC4gJHRydV90YWdzX3ByZWZzW1RBR19TRUNUSU9O XS0+dmFsdWUgLiAnLyc7CiAgICB9IGVsc2UgewoJJHVybHByZWZpeCA9IGh1IC4gJz9zPScg LiAkdHJ1X3RhZ3NfcHJlZnNbVEFHX1NFQ1RJT05dLT52YWx1ZSAuICgkdXNlX2FtcCA/ICcm YW1wOycgOiAnJicpIC4gJHRydV90YWdzX3ByZWZzW1BBUk1fTkFNRV0tPnZhbHVlIC4gJz0n OwogICAgfQogICAgJHVybHN1ZmZpeCA9ICh0cnVfdGFnc19jbGVhbl91cmxzKCkgPyAnLycg OiAnJyk7CiAgICByZXR1cm4gJHVybHByZWZpeCAuIHVybGVuY29kZShzdHJfcmVwbGFjZSgn ICcsICctJywgJHRhZykpIC4gJHVybHN1ZmZpeDsKfQoKCmZ1bmN0aW9uIHRydV90YWdzX2dl dF90YWdzX2Zvcl9hcnRpY2xlKCRhcnRpY2xlSUQpIHsKICAgIGdsb2JhbCAkdGhpc2FydGlj bGUsICR0cnVfdGFnc19wcmVmczsKICAgIGlmIChpc3NldCgkdGhpc2FydGljbGUpKSB7Cgll eHRyYWN0KCR0aGlzYXJ0aWNsZSk7CiAgICB9CiAgICAka2V5d29yZHMgPSAnJzsKICAgIGlm IChpc3NldCgkdGhpc2lkKSAmJiAkdGhpc2lkID09ICRhcnRpY2xlSUQpIHsKCWlmIChpc3Nl dCgkdGhpc2FydGljbGVbJ2tleXdvcmRzJ10pKSB7CgkgICAgJGtleXdvcmRzID0gJHRoaXNh cnRpY2xlWydrZXl3b3JkcyddOwoJfQogICAgfSBlbHNlIHsKCSR0YWdzX2ZpZWxkID0gVFJV X1RBR1NfRklFTEQ7CgkkcnMgPSBzYWZlX3JvdygkdGFnc19maWVsZCwgInRleHRwYXR0ZXJu IiwgIklEPSckYXJ0aWNsZUlEJyBBTkQgJHRhZ3NfZmllbGQgPD4gJyciKTsKLy8JCWlmIChh cnJheV9rZXlfZXhpc3RzKCR0YWdzX2ZpZWxkLCAkcnMpKSB7CmlmIChpc3NldCgkcnNbJHRh Z3NfZmllbGRdKSkgewoJICAgICRrZXl3b3JkcyA9ICRyc1skdGFnc19maWVsZF07Cgl9CiAg ICB9CiAgICAkYWxsX3RhZ3MgPSBhcnJheSgpOwogICAgICAgICRhbGxfdGFncyA9IGV4cGxv ZGUoIiwiLCB0cmltKHRydV90YWdzX3N0cnRvbG93ZXIoJGtleXdvcmRzKSkpOwoKICAgIHJl dHVybiB0cnVfdGFnc190cmltX3RhZ3MoJGFsbF90YWdzKTsKCn0KCgojIGZpeGVzIGJ1ZyB3 aXRoIDQuMC40J3MgdmVyc2lvbiBvZiBkb1dyYXAgdGhhdCBjYXVzZWQgc3BhY2VzIHRvIHNo b3cgdXAgYmVmb3JlIHRoZSBjb21tYXMKZnVuY3Rpb24gdHJ1X3RhZ3NfZG9fd3JhcCgkbGlz dCwgJHdyYXB0YWcsICRicmVhaywgJGNsYXNzLCAkYnJlYWtjbGFzcykgewogICAgaWYgKCEk d3JhcHRhZyAmJiAhcHJlZ19tYXRjaCgnL15cdyskLycsICRicmVhaykpIHsKCXJldHVybiBq b2luKCRicmVhay5uLCAkbGlzdCk7CiAgICB9IGVsc2UgewoJcmV0dXJuIGRvV3JhcCgkbGlz dCwgJHdyYXB0YWcsICRicmVhaywgJGNsYXNzLCAkYnJlYWtjbGFzcyk7CiAgICB9Cn0KCgpm dW5jdGlvbiB0cnVfdGFnc190cmltX3RhZ3MoJHRhZ19hcnJheSkgewogICAgJHRyaW1tZWQg PSBhcnJheSgpOwogICAgZm9yZWFjaCAoJHRhZ19hcnJheSBhcyAkdGFnKSB7CglpZiAoIiIg IT0gdHJpbSgkdGFnKSkgewoJICAgICR0cmltbWVkW10gPSB0cmltKCR0YWcpOwoJfQogICAg fQogICAgcmV0dXJuICR0cmltbWVkOwp9CgoKZnVuY3Rpb24gdHJ1X3RhZ3NfZml4dXBfcXVl cnlfYXR0cygkYXR0cywgJHRhZ19wYXJhbWV0ZXIpIHsKICAgICRrZXl3b3JkcyA9IGV4cGxv ZGUoJywnLCAkdGFnX3BhcmFtZXRlcik7CiAgICBmb3JlYWNoICgka2V5d29yZHMgYXMgJGtl eXdvcmQpIHsKCWlmIChzdHJwb3MoJGtleXdvcmQsICctJykgIT09IGZhbHNlKSB7CgkgICAg JGtleXdvcmRzW10gPSBzdHJfcmVwbGFjZSgnLScsICcgJywgJGtleXdvcmQpOwoJfQogICAg fQogICAgJGF0dHNbJ2tleXdvcmRzJ10gPSBpbXBsb2RlKCcsJywgJGtleXdvcmRzKTsKCiAg ICBpZiAoaXNzZXQoJGF0dHNbJ3NlY3Rpb24nXSkgJiYgc3RycG9zKCRhdHRzWydzZWN0aW9u J10sICcsJykgIT09IGZhbHNlKSB7CgkkYXR0c1snc2VjdGlvbiddID0gJyc7CiAgICB9Cgog ICAgaWYgKGlzc2V0KCRhdHRzWydleGNsdWRlc2VjdGlvbiddKSkgewoJdW5zZXQoJGF0dHNb J2V4Y2x1ZGVzZWN0aW9uJ10pOwogICAgfQoKICAgIGlmIChpc3NldCgkYXR0c1snbm9hcnRp Y2xlcyddKSkgewoJdW5zZXQoJGF0dHNbJ25vYXJ0aWNsZXMnXSk7CiAgICB9CgogICAgaWYg KCFpc3NldCgkYXR0c1snbGltaXQnXSkpIHsKCSRhdHRzWydsaW1pdCddID0gJzEwMDAnOwog ICAgfQoKICAgIGlmICghaXNzZXQoJGF0dHNbJ2FsbG93b3ZlcnJpZGUnXSkpIHsKCSRhdHRz WydhbGxvd292ZXJyaWRlJ10gPSB0cnVlOwogICAgfQoKICAgIGlmIChpc3NldCgkYXR0c1sn c2VhcmNoZm9ybSddKSAmJiAhaXNzZXQoJGF0dHNbJ2xpc3Rmb3JtJ10pKSB7CgkkYXR0c1sn bGlzdGZvcm0nXSA9ICRhdHRzWydzZWFyY2hmb3JtJ107CiAgICB9CgogICAgaWYgKGlzc2V0 KCRhdHRzWydzaG93Y291bnRzJ10pKSB7Cgl1bnNldCgkYXR0c1snc2hvd2NvdW50cyddKTsK ICAgIH0KCiAgICBpZiAoaXNzZXQoJGF0dHNbJzQwNHJlZGlyZWN0J10pKSB7Cgl1bnNldCgk YXR0c1snNDA0cmVkaXJlY3QnXSk7CiAgICB9CgogICAgcmV0dXJuICRhdHRzOwp9CgoKZnVu Y3Rpb24gdHJ1X3RhZ3Nfc3RydG9sb3dlcigkc3RyKSB7CiAgICBnbG9iYWwgJHRydV90YWdz X3ByZWZzOwogICAgaWYgKCR0cnVfdGFnc19wcmVmc1tVVEZfOF9DQVNFXS0+dmFsdWUpIHsK CWlmIChmdW5jdGlvbl9leGlzdHMoJ21iX3N0cnRvbG93ZXInKSkgewoJICAgIHJldHVybiBt Yl9zdHJ0b2xvd2VyKCRzdHIsIEVOQ09ESU5HKTsKCX0gZWxzZSB7CgkgICAgcmV0dXJuIHN0 cnRvbG93ZXIoJHN0cik7Cgl9CiAgICB9IGVsc2UgewoJcmV0dXJuICRzdHI7CiAgICB9Cn0K CmZ1bmN0aW9uIHRydV90YWdzX3N0cnRvdXBwZXIoJHN0cikgewogICAgaWYgKGZ1bmN0aW9u X2V4aXN0cygnbWJfc3RydG91cHBlcicpKSB7CglyZXR1cm4gbWJfc3RydG91cHBlcigkc3Ry LCBFTkNPRElORyk7CiAgICB9IGVsc2UgewoJcmV0dXJuIHN0cnRvdXBwZXIoJHN0cik7CiAg ICB9Cn0KCmZ1bmN0aW9uIHRydV90YWdzX3VjZmlyc3QoJHN0cikgewogICAgaWYgKGZ1bmN0 aW9uX2V4aXN0cygnbWJfc3Vic3RyJykgJiYgZnVuY3Rpb25fZXhpc3RzKCdtYl9zdHJ0b3Vw cGVyJykgJiYgZnVuY3Rpb25fZXhpc3RzKCdtYl9zdHJsZW4nKSAmJiBtYl9zdHJsZW4oJHN0 ciwgRU5DT0RJTkcpID4gMSkgewoJcmV0dXJuIG1iX3N0cnRvdXBwZXIobWJfc3Vic3RyKCRz dHIsIDAsIDEsIEVOQ09ESU5HKSwgRU5DT0RJTkcpIC4gbWJfc3Vic3RyKCRzdHIsIDEsIG1i X3N0cmxlbigkc3RyLCBFTkNPRElORyksIEVOQ09ESU5HKTsKICAgIH0gZWxzZSB7CglyZXR1 cm4gdWNmaXJzdCgkc3RyKTsKICAgIH0KfQoKZnVuY3Rpb24gdHJ1X3RhZ3NfdWN3b3Jkcygk c3RyKSB7CiAgICBpZiAoZnVuY3Rpb25fZXhpc3RzKCdtYl9jb252ZXJ0X2Nhc2UnKSkgewoJ cmV0dXJuIG1iX2NvbnZlcnRfY2FzZSgkc3RyLCBNQl9DQVNFX1RJVExFLCBFTkNPRElORyk7 CiAgICB9IGVsc2UgewoJcmV0dXJuIHVjd29yZHMoJHN0cik7CiAgICB9Cn0KCgovL3RoZXNl IG5leHQgdHdvIGZ1bmN0aW9ucyBhcmUgZ3Jvc3MsIGJ1dCBJIGNhbid0IGZpZ3VyZSBvdXQg YW5vdGhlciB3YXkgdG8gZG8gaXQKZnVuY3Rpb24gdHJ1X3RhZ3Nfc29ydF90YWdzKCR0YWdz X3dlaWdodCwgJHNvcnRfYnlfY291bnQsICRzb3J0X2FzY2VuZGluZykgewogICAgZ2xvYmFs ICR0cnVfdGFnc190YWdzX3dlaWdodCwgJHRydV90YWdzX3NvcnRfYXNjZW5kaW5nOwoKICAg ICR0cnVfdGFnc190YWdzX3dlaWdodCA9ICR0YWdzX3dlaWdodDsKICAgICR0cnVfdGFnc19z b3J0X2FzY2VuZGluZyA9ICRzb3J0X2FzY2VuZGluZzsKCiAgICAkdGVtcF9hcnJheSA9IGFy cmF5X2tleXMoJHRhZ3Nfd2VpZ2h0KTsKICAgIGlmICgkc29ydF9ieV9jb3VudCkgewoJdXNv cnQoJHRlbXBfYXJyYXksICJ0cnVfdGFnc19zb3J0X3RhZ3NfY29tcGFyYXRvciIpOwogICAg fSBlbHNlIHsKCW5hdGNhc2Vzb3J0KCR0ZW1wX2FycmF5KTsKCSR0ZW1wX2FycmF5ID0gYXJy YXlfdmFsdWVzKCR0ZW1wX2FycmF5KTsKICAgIH0KCiAgICAkc29ydGVkX2FycmF5ID0gYXJy YXkoKTsKICAgIGZvcmVhY2ggKCR0ZW1wX2FycmF5IGFzICR0YWcpIHsKCSRzb3J0ZWRfYXJy YXlbJHRhZ10gPSAkdGFnc193ZWlnaHRbJHRhZ107CiAgICB9CgogICAgcmV0dXJuICRzb3J0 ZWRfYXJyYXk7Cn0KCgpmdW5jdGlvbiB0cnVfdGFnc19zb3J0X3RhZ3NfY29tcGFyYXRvcigk bGVmdCwgJHJpZ2h0KSB7CiAgICBnbG9iYWwgJHRydV90YWdzX3RhZ3Nfd2VpZ2h0LCAkdHJ1 X3RhZ3Nfc29ydF9hc2NlbmRpbmc7CgogICAgJGxlZnRfd2VpZ2h0ID0gJHRydV90YWdzX3Rh Z3Nfd2VpZ2h0WyRsZWZ0XTsKICAgICRyaWdodF93ZWlnaHQgPSAkdHJ1X3RhZ3NfdGFnc193 ZWlnaHRbJHJpZ2h0XTsKICAgIGlmICgkbGVmdF93ZWlnaHQgPT0gJHJpZ2h0X3dlaWdodCkg ewoJJHRlbXBfYXJyYXkgPSBhcnJheSgkbGVmdCwgJHJpZ2h0KTsKCW5hdGNhc2Vzb3J0KCR0 ZW1wX2FycmF5KTsKCSR0ZW1wX2FycmF5ID0gYXJyYXlfdmFsdWVzKCR0ZW1wX2FycmF5KTsK CXJldHVybiAoJHRlbXBfYXJyYXlbMF0gPT0gJGxlZnQgPyAtMSA6IDEpOwogICAgfSBlbHNl IGlmICgkdHJ1X3RhZ3Nfc29ydF9hc2NlbmRpbmcpIHsKCXJldHVybiAkbGVmdF93ZWlnaHQg LSAkcmlnaHRfd2VpZ2h0OwogICAgfSBlbHNlIHsKCXJldHVybiAkcmlnaHRfd2VpZ2h0IC0g JGxlZnRfd2VpZ2h0OwogICAgfQp9CgoKCiMjIyBCQVNUQVJEIEZVTkNUSU9OUyBUSEFUIFNI T1VMRE4nVCBIQVZFIFRPIEVYSVNUICMjIwojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKCgpmdW5jdGlvbiB0cnVfdGFnc19yZWRvX2Fy dGljbGVfc2VhcmNoKCRhdHRzKSB7CiAgICAkdGhlQXR0cyA9IGxBdHRzKGFycmF5KCdsaW1p dCcgICAgID0+IDEwMDAsCgkJJ2NhdGVnb3J5JyAgPT4gJycsCgkJJ3NlY3Rpb24nICAgPT4g JycsCgkJJ2V4Y2VycHRlZCcgPT4gJycsCgkJJ2F1dGhvcicgICAgPT4gJycsCgkJJ3NvcnRi eScgICAgPT4gJ1Bvc3RlZCcsCgkJJ3NvcnRkaXInICAgPT4gJ2Rlc2MnLAoJCSdtb250aCcg ICAgID0+ICcnLAoJCSdrZXl3b3JkcycgID0+ICcnLAoJCSdmcm9udHBhZ2UnID0+ICcnLAoJ CSdpZCcgICAgICAgID0+ICcnLAoJCSd0aW1lJyAgICAgID0+ICdwYXN0JywKCQknc3RhdHVz JyAgICA9PiAnNCcsCgkJJ29mZnNldCcgICAgPT4gMAoJICAgICksJGF0dHMsIDApOwogICAg ZXh0cmFjdCgkdGhlQXR0cyk7CgogICAgLy9CdWlsZGluZyBxdWVyeSBwYXJ0cwogICAgJGZy b250cGFnZSA9ICgkZnJvbnRwYWdlKSA/IGZpbHRlckZyb250UGFnZSgpIDogJyc7CiAgICAk Y2F0ZWdvcnkgID0gKCEkY2F0ZWdvcnkpICA/ICcnIDogIiBhbmQgKChDYXRlZ29yeTE9JyIu ZG9zbGFzaCgkY2F0ZWdvcnkpLiInKSBvciAoQ2F0ZWdvcnkyPSciLmRvU2xhc2goJGNhdGVn b3J5KS4iJykpICI7CiAgICAkc2VjdGlvbiAgID0gKCEkc2VjdGlvbikgICA/ICcnIDogIiBh bmQgU2VjdGlvbiA9ICciLmRvc2xhc2goJHNlY3Rpb24pLiInIjsKICAgICRleGNlcnB0ZWQg PSAoJGV4Y2VycHRlZD09J3knKSAgPyAiIGFuZCBFeGNlcnB0ICE9JyciIDogJyc7CiAgICAk YXV0aG9yICAgID0gKCEkYXV0aG9yKSAgICA/ICcnIDogIiBhbmQgQXV0aG9ySUQgPSAnIi5k b3NsYXNoKCRhdXRob3IpLiInIjsKICAgICRtb250aCAgICAgPSAoISRtb250aCkgICAgID8g JycgOiAiIGFuZCBQb3N0ZWQgbGlrZSAnIi5kb1NsYXNoKCRtb250aCkuIiUnIjsKICAgICRp ZCAgICAgICAgPSAoISRpZCkgICAgICAgID8gJycgOiAiIGFuZCBJRCA9ICciLmludHZhbCgk aWQpLiInIjsKICAgIHN3aXRjaCAoJHRpbWUpIHsKCWNhc2UgJ2FueSc6CgkgICAgJHRpbWUg PSAiIjsgYnJlYWs7CgljYXNlICdmdXR1cmUnOgoJICAgICR0aW1lID0gIiBhbmQgUG9zdGVk ID4gbm93KCkiOyBicmVhazsKCWRlZmF1bHQ6CgkgICAgJHRpbWUgPSAiIGFuZCBQb3N0ZWQg PCBub3coKSI7CiAgICB9CiAgICBpZiAoIWlzX251bWVyaWMoJHN0YXR1cykpCgkkc3RhdHVz ID0gZ2V0U3RhdHVzTnVtKCRzdGF0dXMpOwoKICAgICRjdXN0b20gPSAnJzsKICAgIC8vIHRy eWluZyBjdXN0b20gZmllbGRzIGhlcmUKICAgICRjdXN0b21GaWVsZHMgPSBnZXRDdXN0b21G aWVsZHMoKTsKICAgIGlmICgkY3VzdG9tRmllbGRzKSB7Cglmb3JlYWNoKCRjdXN0b21GaWVs ZHMgYXMgJGNGaWVsZCkgewoJICAgIGlmIChpc3NldCgkYXR0c1skY0ZpZWxkXSkpCgkJJGN1 c3RvbVBhaXJzWyRjRmllbGRdID0gJGF0dHNbJGNGaWVsZF07Cgl9CglpZighZW1wdHkoJGN1 c3RvbVBhaXJzKSkKCSAgICAkY3VzdG9tID0gIGJ1aWxkQ3VzdG9tU3FsKCRjdXN0b21GaWVs ZHMsJGN1c3RvbVBhaXJzKTsKCWVsc2UKCSAgICAkY3VzdG9tID0gJyc7CiAgICB9CgogICAg Ly9BbGxvdyBrZXl3b3JkcyBmb3Igbm8tY3VzdG9tIGFydGljbGVzLiBUaGF0IHRhZ2dpbmcg bW9kZSwgeW91IGtub3cKICAgIGlmICgka2V5d29yZHMpIHsKCSRrZXlzID0gZG9TbGFzaChh cnJheV9tYXAoJ3RyaW0nLCBleHBsb2RlKCcsJywgJGtleXdvcmRzKSkpOwoJZm9yZWFjaCAo JGtleXMgYXMgJGtleSkgewoJICAgICRrZXlwYXJ0c1tdID0gIkZJTkRfSU5fU0VUKCciLiRr ZXkuIicsS2V5d29yZHMpIjsKCX0KCSRrZXl3b3JkcyA9ICIgYW5kICgiIC4gam9pbignIG9y ICcsJGtleXBhcnRzKSAuICIpIjsKICAgIH0KCiAgICBpZiAoJGlkKQoJJHN0YXR1c3EgPSAi IGFuZCBTdGF0dXMgPj0gJzQnIjsKICAgIGVsc2UKCSRzdGF0dXNxID0gIiBhbmQgU3RhdHVz PSciLmRvU2xhc2goJHN0YXR1cykuIiciOwoKICAgICR3aGVyZSA9ICIxIiAuICRzdGF0dXNx LiAkdGltZS4KCSRpZCAuICRjYXRlZ29yeSAuICRzZWN0aW9uIC4gJGV4Y2VycHRlZCAuICRt b250aCAuICRhdXRob3IgLiAka2V5d29yZHMgLiAkY3VzdG9tIC4gJGZyb250cGFnZTsKCgkk cGdvZmZzZXQgPSAkb2Zmc2V0IC4gJywgJzsKCiAgICAkcnMgPSBzYWZlX3Jvd3Nfc3RhcnQo IiosIHVuaXhfdGltZXN0YW1wKFBvc3RlZCkgYXMgdVBvc3RlZCIsICd0ZXh0cGF0dGVybics Cgkkd2hlcmUuICcgb3JkZXIgYnkgJyAuIGRvc2xhc2goJHNvcnRieSkgLiAnICcgLiBkb1Ns YXNoKCRzb3J0ZGlyKSAuICcgbGltaXQgJyAuIGRvU2xhc2goJGxpbWl0KSk7CgogICAgcmV0 dXJuICRyczsKfQoKCgoiO3M6MzoibWQ1IjtzOjMyOiJkZjIwZjljZWRjYmNjNWI3MjhhZDc3 YTNmYTcwNjU5ZCI7fQ==