# tru_tags v3.7 # 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 NyI7czo2OiJhdXRob3IiO3M6MTM6Ik5hdGhhbiBBcnRodXIiO3M6MTA6ImF1dGhvcl91cmki 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+IjtzOjQ6ImNvZGUiO3M6NDQzNTU6 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 dWUpOwoJCQl9IGVsc2UgaWYgKGlzc2V0KCRhdHRzWyc0MDRyZWRpcmVjdCddKSAmJiAhJGF0 dHNbJzQwNHJlZGlyZWN0J10pIHsKCQkJCXJldHVybiAkcmVzdWx0OwoJCQl9IGVsc2UgewoJ CQkJdHhwX2RpZShnVHh0KCc0MDRfbm90X2ZvdW5kJyksICc0MDQnKTsKCQkJfQoJCX0gZWxz ZSB7CgkJCXJldHVybiAkcmVzdWx0OwoJCX0KCX0gZWxzZSB7CgkJcmV0dXJuIHRydV90YWdz X2Nsb3VkKCRhdHRzKTsKCX0KfQoKCmZ1bmN0aW9uIHRydV90YWdzX2FyY2hpdmUoJGF0dHMp IHsKCWdsb2JhbCAkdHJ1X3RhZ3NfY3VycmVudF9hcmNoaXZlX3RhZzsKCSR0YWdzID0gYXJy YXlfdW5pcXVlKHRydV90YWdzX2Nsb3VkX3F1ZXJ5KHRydV90YWdzX2dldF9zdGFuZGFyZF9j bG91ZF9hdHRzKCRhdHRzLCBmYWxzZSwgZmFsc2UpKSk7CgluYXRjYXNlc29ydCgkdGFncyk7 Cglmb3JlYWNoICgkdGFncyBhcyAkdGFnKSB7CgkJJHRydV90YWdzX2N1cnJlbnRfYXJjaGl2 ZV90YWcgPSAkdGFnOwoJCSRjbGVhbl9hdHRzID0gdHJ1X3RhZ3NfZml4dXBfcXVlcnlfYXR0 cygkYXR0cywgJHRhZyk7CgkJJHJlc3VsdHNbXSA9IGRvQXJ0aWNsZXMoJGNsZWFuX2F0dHMs IHRydWUpOwkJI2Z1bmN0aW9uIGluIFRYUCBjb2RlCgl9CglyZXR1cm4gam9pbignICcsICRy ZXN1bHRzKTsKfQoKCmZ1bmN0aW9uIHRydV90YWdzX2N1cnJlbnRfYXJjaGl2ZV90YWcoJGF0 dHMpIHsKCWdsb2JhbCAkdHJ1X3RhZ3NfY3VycmVudF9hcmNoaXZlX3RhZzsKCWV4dHJhY3Qo bEF0dHMoYXJyYXkoJ2xpbmsnID0+ICcwJyksICAkYXR0cywgMCkpOwoJaWYgKCRsaW5rKSB7 CgkJcmV0dXJuICc8YSBocmVmPSInIC4gdHJ1X3RhZ3NfbGlua2lmeV90YWcoJHRydV90YWdz X2N1cnJlbnRfYXJjaGl2ZV90YWcpIC4gJyI+JyAuICR0cnVfdGFnc19jdXJyZW50X2FyY2hp dmVfdGFnIC4gJzwvYT4nOwoJfSBlbHNlIHsKCQlyZXR1cm4gJHRydV90YWdzX2N1cnJlbnRf YXJjaGl2ZV90YWc7Cgl9Cn0KCgpmdW5jdGlvbiB0cnVfdGFnc19jbG91ZCgkYXR0cykgewoJ cmV0dXJuIHRydV90YWdzX2xpc3QodHJ1X3RhZ3NfZ2V0X3N0YW5kYXJkX2Nsb3VkX2F0dHMo JGF0dHMsIGZhbHNlLCBmYWxzZSkpOwp9CgoKZnVuY3Rpb24gdHJ1X3RhZ3NfbGlzdCgkYXR0 cykgewoJJGF0dHMgPSB0cnVfdGFnc19nZXRfc3RhbmRhcmRfY2xvdWRfYXR0cygkYXR0cywg dHJ1ZSwgZmFsc2UpOwoJJGFsbF90YWdzID0gdHJ1X3RhZ3NfY2xvdWRfcXVlcnkoJGF0dHMp OwoKCXJldHVybiB0cnVfdGFnc19yZW5kZXJfY2xvdWQoJGF0dHMsICRhbGxfdGFncywgJGFs bF90YWdzKTsKfQoKCmZ1bmN0aW9uIHRydV90YWdzX2Zyb21fYXJ0aWNsZSgkYXR0cykgewoJ Z2xvYmFsICR0aGlzYXJ0aWNsZTsKCWV4dHJhY3QoJHRoaXNhcnRpY2xlKTsKCgkkYWxsX3Rh Z3MgPSB0cnVfdGFnc19nZXRfdGFnc19mb3JfYXJ0aWNsZSgkdGhpc2lkKTsKCgkkYXR0cyA9 IHRydV90YWdzX2dldF9zdGFuZGFyZF9jbG91ZF9hdHRzKCRhdHRzLCBmYWxzZSwgdHJ1ZSk7 CgkkYWxsX3RhZ3NfZm9yX3dlaWdodCA9ICRhbGxfdGFnczsKCWlmICgkYXR0c1sndXNlb3Zl cmFsbGNvdW50cyddKSB7CgkJJGFsbF90YWdzX2Zvcl93ZWlnaHQgPSB0cnVfdGFnc19jbG91 ZF9xdWVyeSgkYXR0cyk7Cgl9CgoJcmV0dXJuIHRydV90YWdzX3JlbmRlcl9jbG91ZCgkYXR0 cywgJGFsbF90YWdzLCAkYWxsX3RhZ3NfZm9yX3dlaWdodCk7Cn0KCgpmdW5jdGlvbiB0cnVf dGFnc19pZl9oYXNfdGFncygkYXR0cywgJHRoaW5nKSB7CglnbG9iYWwgJHRoaXNhcnRpY2xl OwoJZXh0cmFjdCgkdGhpc2FydGljbGUpOwoKCSR0YWdzX2ZpZWxkID0gVFJVX1RBR1NfRklF TEQ7CgoJJHJzID0gc2FmZV9yb3coJHRhZ3NfZmllbGQsICJ0ZXh0cGF0dGVybiIsICJJRD0n JHRoaXNpZCcgQU5EICR0YWdzX2ZpZWxkIDw+ICcnIik7CglyZXR1cm4gcGFyc2UoRXZhbEVs c2UoJHRoaW5nLCAkcnMpKTsKfQoKCmZ1bmN0aW9uIHRydV90YWdzX2lmX3RhZ19zZWFyY2go JGF0dHMsICR0aGluZykgewoJZXh0cmFjdChsQXR0cyhhcnJheSgndGFnJyA9PiAnJyksICAk YXR0cywgMCkpOwoKCSR0YWdfcGFyYW1ldGVyID0gdHJ1X3RhZ3NfdGFnX3BhcmFtZXRlcihh cnJheSgnc3RyaXBoeXBoZW5zJyA9PiAxKSwgZmFsc2UpOwoJJGNvbmRpdGlvbiA9ICghZW1w dHkoJHRhZ19wYXJhbWV0ZXIpKSA/IHRydWUgOiBmYWxzZTsKCWlmICgkY29uZGl0aW9uICYm ICFlbXB0eSgkdGFnKSkgewoJCSRjb25kaXRpb24gPSAoJHRhZ19wYXJhbWV0ZXIgPT0gJHRh Zyk7Cgl9CglyZXR1cm4gcGFyc2UoRXZhbEVsc2UoJHRoaW5nLCAkY29uZGl0aW9uKSk7Cn0K CgpmdW5jdGlvbiB0cnVfdGFnc190YWdfcGFyYW1ldGVyKCRhdHRzLCAkc2FmZWh0bWwgPSB0 cnVlKSB7CglnbG9iYWwgJHRydV90YWdzX3ByZWZzOwoJZXh0cmFjdChsQXR0cyhhcnJheSgn c3RyaXBoeXBoZW5zJyA9PiAnMCcsICd1cmxlbmNvZGUnID0+IDApLCAgJGF0dHMsIDApKTsK CgkkcGFybSA9IHVybGRlY29kZShzdHJpcF90YWdzKGdwcygkdHJ1X3RhZ3NfcHJlZnNbUEFS TV9OQU1FXS0+dmFsdWUpKSk7CglpZiAoJ2xvb2t1cCcgPT0gJHN0cmlwaHlwaGVucykgewoJ CSRhdHRzID0gdHJ1X3RhZ3NfZ2V0X3N0YW5kYXJkX2Nsb3VkX2F0dHMoYXJyYXkoKSwgZmFs c2UsIGZhbHNlKTsKCQkkdGFnX2xpc3QgPSBhcnJheV91bmlxdWUodHJ1X3RhZ3NfY2xvdWRf cXVlcnkoJGF0dHMpKTsKCQlmb3JlYWNoICgkdGFnX2xpc3QgYXMgJGNsb3VkX3RhZykgewoJ CQlpZiAoJHBhcm0gPT0gc3RyX3JlcGxhY2UoJyAnLCAnLScsICRjbG91ZF90YWcpKSB7CgkJ CQkkcGFybSA9ICRjbG91ZF90YWc7CgkJCQlicmVhazsKCQkJfQoJCX0KCX0gZWxzZSBpZiAo JHN0cmlwaHlwaGVucykgewoJCSRwYXJtID0gc3RyX3JlcGxhY2UoJy0nLCAnICcsICRwYXJt KTsKCX0KCWlmICgkdXJsZW5jb2RlKSB7CgkJJHBhcm0gPSB1cmxlbmNvZGUoJHBhcm0pOwoJ IH0gZWxzZSBpZiAoJHNhZmVodG1sKSB7CgkJJHBhcm0gPSBodG1sc3BlY2lhbGNoYXJzKCRw YXJtKTsKCX0KCglyZXR1cm4gJHBhcm07Cn0KCgpmdW5jdGlvbiB0cnVfdGFnc19zZWFyY2hf cmVzdWx0X2V4Y2VycHQoJGF0dHMpIHsKCWdsb2JhbCAkcHJldGV4dDsKCgkkdGFnX3BhcmFt ZXRlciA9IHRydV90YWdzX3RhZ19wYXJhbWV0ZXIoYXJyYXkoKSwgZmFsc2UpOwoJaWYgKHRy aW0oJHRhZ19wYXJhbWV0ZXIpICE9ICcnKSB7CgkJJHEgPSAkcHJldGV4dFsncSddOwoJCSRw cmV0ZXh0WydxJ10gPSAkdGFnX3BhcmFtZXRlcjsKCQkkcmVzdWx0ID0gc2VhcmNoX3Jlc3Vs dF9leGNlcnB0KCRhdHRzKTsKCQkkcHJldGV4dFsncSddID0gJHE7Cgl9IGVsc2UgewoJCSRy ZXN1bHQgPSBzZWFyY2hfcmVzdWx0X2V4Y2VycHQoJGF0dHMpOwoJfQoJcmV0dXJuICRyZXN1 bHQ7Cn0KCgpmdW5jdGlvbiB0cnVfdGFnc19zZWFyY2hfcGFyYW1ldGVyKCkgewoJdHJpZ2dl cl9lcnJvcihnVHh0KCdkZXByZWNhdGVkX3RhZycpLCBFX1VTRVJfTk9USUNFKTsKCXJldHVy biBzdHJpcF90YWdzKGdwcygncScpKTsKfQoKCmZ1bmN0aW9uIHRydV90YWdzX3JlbGF0ZWRf dGFnc19mcm9tX3NlYXJjaCgkYXR0cykgewoJJHRhZ19wYXJhbWV0ZXIgPSB0cnVfdGFnc190 YWdfcGFyYW1ldGVyKGFycmF5KCksIGZhbHNlKTsKCWV4dHJhY3QobEF0dHMoYXJyYXkoJ3Rh Z19wYXJhbWV0ZXInID0+ICR0YWdfcGFyYW1ldGVyKSwgICRhdHRzLCAwKSk7CglpZiAoIWVt cHR5KCR0YWdfcGFyYW1ldGVyKSkgewogICAgICAgICR0YWdzX2ZpZWxkID0gVFJVX1RBR1Nf RklFTEQ7CgkJJGFsbF90YWdzID0gYXJyYXkoKTsKCgkJJHF1ZXJ5X2F0dHMgPSB0cnVfdGFn c19maXh1cF9xdWVyeV9hdHRzKCRhdHRzLCAkdGFnX3BhcmFtZXRlcik7CgkJJHJzID0gdHJ1 X3RhZ3NfcmVkb19hcnRpY2xlX3NlYXJjaCgkcXVlcnlfYXR0cyk7CgkJaWYgKCRycykgewoJ CQl3aGlsZSAoJGEgPSBuZXh0Um93KCRycykpIHsKCQkJCSRhcnRpY2xlX3RhZ3MgPSBhcnJh eSgpOwoJCQkJaWYgKGlzc2V0KCRhWyR0YWdzX2ZpZWxkXSkpIHsKCQkJCQkkYXJ0aWNsZV90 YWdzID0gZXhwbG9kZSgiLCIsIHRyaW0odHJ1X3RhZ3Nfc3RydG9sb3dlcigkYVskdGFnc19m aWVsZF0pKSk7CgkJCQl9CgkJCQkjIGZhc3RlciBpbXBsZW1lbnRhdGlvbiBvZiBhcnJheV9t ZXJnZSgpLCB0aGFua3MgdG8gd2hvY2FyZXoKCQkJCSMgKGh0dHA6Ly9mb3J1bS50ZXh0cGF0 dGVybi5jb20vdmlld3RvcGljLnBocD9waWQ9MjM4MzczI3AyMzgzNzMpCgkJCQlmb3JlYWNo KHRydV90YWdzX3RyaW1fdGFncygkYXJ0aWNsZV90YWdzKSBhcyAkaSkgeyRhbGxfdGFnc1td ID0gJGk7fQoJCQl9CgkJfQoKCQkkYWx0X3RhZ19wYXJhbWV0ZXIgPSBzdHJfcmVwbGFjZSgn LScsICcgJywgJHRhZ19wYXJhbWV0ZXIpOwoJCWZvcmVhY2ggKCRhbGxfdGFncyBhcyAka2V5 ID0+ICR0YWcpIHsKCQkJaWYgKCR0YWcgPT0gJHRhZ19wYXJhbWV0ZXIgfHwgJHRhZyA9PSAk YWx0X3RhZ19wYXJhbWV0ZXIpIHsKCQkJCXVuc2V0KCRhbGxfdGFnc1ska2V5XSk7CgkJCX0K CQl9CgoJCSRjbG91ZF9hdHRzID0gdHJ1X3RhZ3NfZ2V0X3N0YW5kYXJkX2Nsb3VkX2F0dHMo JGF0dHMsIGZhbHNlLCBmYWxzZSk7CgkJJGFsbF90YWdzX2Zvcl93ZWlnaHQgPSAkYWxsX3Rh Z3M7CgkJaWYgKCRjbG91ZF9hdHRzWyd1c2VvdmVyYWxsY291bnRzJ10pIHsKCQkJJGFsbF90 YWdzX2Zvcl93ZWlnaHQgPSB0cnVfdGFnc19jbG91ZF9xdWVyeSgkY2xvdWRfYXR0cyk7CgkJ fQoKCQlyZXR1cm4gdHJ1X3RhZ3NfcmVuZGVyX2Nsb3VkKCRjbG91ZF9hdHRzLCAkYWxsX3Rh Z3MsICRhbGxfdGFnc19mb3Jfd2VpZ2h0KTsKCX0gZWxzZSB7CgkJcmV0dXJuICcnOwoJfQp9 CgoKIyMjIENMT1VEIFNVUFBPUlQgRlVOQ1RJT05TICMjIwojIyMjIyMjIyMjIyMjIyMjIyMj IyMjIyMjIyMjIyMjCgpmdW5jdGlvbiB0cnVfdGFnc19nZXRfc3RhbmRhcmRfY2xvdWRfYXR0 cygkYXR0cywgJGlzTGlzdCwgJGlzQXJ0aWNsZSwgJHNob3dBbGw9ZmFsc2UpIHsKCXJldHVy biBsQXR0cyhhcnJheSgnd3JhcHRhZycJPT4gKCRpc0xpc3QgPyAndWwnIDogJycpLAoJCQkn YnJlYWsnCQk9PiAoJGlzTGlzdCA/ICdsaScgOiAnLCAnKSwKCQkJJ2NsYXNzJwkJPT4gJycs CgkJCSdicmVha2NsYXNzJwk9PiAnJywKCQkJJ3NlY3Rpb24nCT0+ICcnLAoJCQknbWlucGVy Y2VudCcJPT4gJzEwMCcsCgkJCSdtYXhwZXJjZW50Jwk9PiAoJGlzTGlzdCB8fCAkaXNBcnRp Y2xlID8gJzEwMCcgOiAnMjAwJyksCgkJCSdzaG93Y291bnRzJwk9PiAnJywKCQkJJ2NvdW50 d3JhcGNoYXJzJwk9PiAnW10nLAoJCQkndXNlcmVsdGFnJwk9PiAoJGlzQXJ0aWNsZSA/ICcx JyA6ICcnKSwKCQkJJ2dlbmVyYXRlbGlua3MnCT0+ICcxJywKCQkJJ21pbnRhZ2NvdW50Jwk9 PiAnMCcsCgkJCSdtYXh0YWdjb3VudCcJPT4gJzEwMDAnLAoJCQknc2V0c2l6ZXMnCT0+ICgk aXNBcnRpY2xlID8gJzAnIDogJzEnKSwKCQkJJ3VzZW5vZm9sbG93Jwk9PiAnJywKCQkJJ3Nv cnQnCQk9PiAnYWxwaGEnLAoJCQkndXNlb3ZlcmFsbGNvdW50cycJPT4gJycsCgkJCSdzZXRj bGFzc2VzJwk9PiAoJGlzQXJ0aWNsZSA/ICcwJyA6ICcxJyksCgkJCSd0aXRsZScJCT0+ICcn LAoJCQknbGlzdGxpbWl0Jwk9PiAnJywKCQkJJ2tlZXAnCQk9PiAnbGFyZ2VzdCcsCgkJCSdj dXRvZmYnCT0+ICdjaHVuaycsCgkJCSd0ZXh0dHJhbnNmb3JtJwk9PiAnbm9uZScsCgkJCSds aW5rcGF0aCcJPT4gJycsCgkJCSdsaW5rcGF0aHRhaWwnCT0+ICcnLAoJCQknZmlsdGVyc2Vh cmNoJwk9PiAoJHNob3dBbGwgPyAwIDogJzEnKSwKCQkJJ2V4Y2x1ZGVzZWN0aW9uJz0+ICcn LAoJCQknYWN0aXZlY2xhc3MnCT0+ICd0YWdBY3RpdmUnLAoJCQkndGltZScJCT0+ICgkc2hv d0FsbCA/ICdhbnknIDogJ3Bhc3QnKQoJCSksJGF0dHMsIDApOwp9CgoKZnVuY3Rpb24gdHJ1 X3RhZ3NfY2xvdWRfcXVlcnkoJGF0dHMpIHsKCWV4dHJhY3QoJGF0dHMpOwoKCSRzZWN0aW9u X2NsYXVzZSA9ICcnOwoJaWYgKCRzZWN0aW9uIDw+ICcnKSB7CgkJJGtleXMgPSBleHBsb2Rl KCcsJywgJHNlY3Rpb24pOwoJCWZvcmVhY2ggKCRrZXlzIGFzICRrZXkpIHsKCQkJJGtleXBh cnRzW10gPSAiIFNlY3Rpb24gPSAnIiAuIHRyaW0oJGtleSkgLiAiJyI7CgkJfQoJCSRzZWN0 aW9uX2NsYXVzZSA9ICIgQU5EICgiIC4gam9pbignIG9yICcsICRrZXlwYXJ0cykgLiAiKSI7 Cgl9CgoJJHRhZ3NfZmllbGQgPSBUUlVfVEFHU19GSUVMRDsKCWluY2x1ZGVfb25jZSB0eHBh dGguJy9wdWJsaXNoL3NlYXJjaC5waHAnOwoKCSRmaWx0ZXIgPSB0cnVfdGFnc19maWx0ZXJf c2VjdGlvbnMoJGV4Y2x1ZGVzZWN0aW9uKTsKCSRmaWx0ZXIgLj0gKCRmaWx0ZXJzZWFyY2gg PyBmaWx0ZXJTZWFyY2goKSA6ICcnKTsKCglzd2l0Y2ggKCR0aW1lKSB7CgkJY2FzZSAnYW55 JzoKCQkJJHRpbWUgPSAiIjsgYnJlYWs7CgkJY2FzZSAnZnV0dXJlJzoKCQkJJHRpbWUgPSAi IGFuZCBQb3N0ZWQgPiBub3coKSI7IGJyZWFrOwoJCWRlZmF1bHQ6CgkJCSR0aW1lID0gIiBh bmQgUG9zdGVkIDw9IG5vdygpIjsKCX0KCWdsb2JhbCAkcHJlZnM7CglleHRyYWN0KCRwcmVm cyk7CglpZiAoISRwdWJsaXNoX2V4cGlyZWRfYXJ0aWNsZXMpIHsKCQkkdGltZSAuPSAiIGFu ZCAobm93KCkgPD0gRXhwaXJlcyBvciBFeHBpcmVzID0gIi5OVUxMREFURVRJTUUuIikiOwoJ fQoKCSRhbGxfdGFncyA9IGFycmF5KCk7CgkkcnMgPSBzYWZlX3Jvd3MoIiR0YWdzX2ZpZWxk IiwgInRleHRwYXR0ZXJuIiwgIiR0YWdzX2ZpZWxkIDw+ICcnIiAuICRzZWN0aW9uX2NsYXVz ZSAuICRmaWx0ZXIgLiAiIGFuZCBTdGF0dXMgPj0gJzQnIiAuICR0aW1lKTsKCWZvcmVhY2gg KCRycyBhcyAkcm93KSB7CgkJJHRlbXBfYXJyYXkgPSBhcnJheSgpOwoJCWlmIChpc3NldCgk cm93WyR0YWdzX2ZpZWxkXSkpIHsKCQkJJHRlbXBfYXJyYXkgPSBleHBsb2RlKCIsIiwgdHJp bSh0cnVfdGFnc19zdHJ0b2xvd2VyKCRyb3dbJHRhZ3NfZmllbGRdKSkpOwoJCX0KCQkjIGZh c3RlciBpbXBsZW1lbnRhdGlvbiBvZiBhcnJheV9tZXJnZSgpLCB0aGFua3MgdG8gd2hvY2Fy ZXoKCQkjIChodHRwOi8vZm9ydW0udGV4dHBhdHRlcm4uY29tL3ZpZXd0b3BpYy5waHA/cGlk PTIzODM3MyNwMjM4MzczKQoJCWZvcmVhY2godHJ1X3RhZ3NfdHJpbV90YWdzKCR0ZW1wX2Fy cmF5KSBhcyAkaSkgeyRhbGxfdGFnc1tdID0gJGk7fQoJfQoKCXJldHVybiAkYWxsX3RhZ3M7 Cn0KCgpmdW5jdGlvbiB0cnVfdGFnc19maWx0ZXJfc2VjdGlvbnMoJGV4Y2x1ZGVzZWN0aW9u KSB7Cgkkc2VjdGlvbnMgPSBleHBsb2RlKCcsJywgJGV4Y2x1ZGVzZWN0aW9uKTsKCSRmaWx0 ZXJzID0gYXJyYXkoKTsKCWZvcmVhY2ggKCRzZWN0aW9ucyBhcyAkc2VjdGlvbikgewoJCSRm aWx0ZXJzW10gPSAiYW5kIFNlY3Rpb24gIT0gJyIuZG9TbGFzaCgkc2VjdGlvbikuIiciOwoJ fQoJcmV0dXJuIGpvaW4oJyAnLCAkZmlsdGVycyk7Cn0KCgpmdW5jdGlvbiB0cnVfdGFnc19y ZW5kZXJfY2xvdWQoJGF0dHMsICRhbGxfdGFncywgJGFsbF90YWdzX2Zvcl93ZWlnaHQpIHsK CWdsb2JhbCAkdHJ1X3RhZ3NfcHJlZnM7CglleHRyYWN0KCRhdHRzKTsKCgkkdGFnc193ZWln aHQgPSBhcnJheV9jb3VudF92YWx1ZXMoJGFsbF90YWdzX2Zvcl93ZWlnaHQpOwoKCWZvcmVh Y2ggKCR0YWdzX3dlaWdodCBhcyAkdGFnID0+ICR3ZWlnaHQpIHsKCQlpZiAoIWluX2FycmF5 KCR0YWcsICRhbGxfdGFncykKCQkgICB8fCAkdGFnc193ZWlnaHRbJHRhZ10gPCAkbWludGFn Y291bnQKCQkgICB8fCAkdGFnc193ZWlnaHRbJHRhZ10gPiAkbWF4dGFnY291bnQpIHsKCQkJ dW5zZXQoJHRhZ3Nfd2VpZ2h0WyR0YWddKTsKCQl9Cgl9CgoJJHNvcnRfYnlfY291bnQgPSAo c3RycG9zKCRzb3J0LCAnY291bnQnKSAhPT0gZmFsc2UpOwoJJHNvcnRfYXNjZW5kaW5nID0g KHN0cnBvcygkc29ydCwgJ2FzYycpICE9PSBmYWxzZSk7CgkkdGFnc193ZWlnaHQgPSB0cnVf dGFnc19zb3J0X3RhZ3MoJHRhZ3Nfd2VpZ2h0LCAkc29ydF9ieV9jb3VudCwgJHNvcnRfYXNj ZW5kaW5nKTsKCglpZiAoJGxpc3RsaW1pdCA+IDAgJiYgJGxpc3RsaW1pdCA8IGNvdW50KCR0 YWdzX3dlaWdodCkpIHsKCQkkcmVzb3J0ZWRfdGFncyA9IGFycmF5KCk7CgkJaWYgKCRrZWVw ID09ICdsYXJnZXN0JykgewoJCQkkcmVzb3J0ZWRfdGFncyA9IGFycmF5X2tleXModHJ1X3Rh Z3Nfc29ydF90YWdzKCR0YWdzX3dlaWdodCwgdHJ1ZSwgZmFsc2UpKTsKCQl9IGVsc2UgewoJ CQlpZiAoJGtlZXAgPT0gJ3JhbmRvbScpIHsKCQkJCWZvcmVhY2ggKCR0YWdzX3dlaWdodCBh cyAkdGFnID0+ICR3ZWlnaHQpIHsKCQkJCQkkcmVzb3J0ZWRfdGFnc1skdGFnXSA9IHJhbmQo MCwgJHdlaWdodCk7CgkJCQl9CgkJCQkkcmVzb3J0ZWRfdGFncyA9IGFycmF5X2tleXModHJ1 X3RhZ3Nfc29ydF90YWdzKCRyZXNvcnRlZF90YWdzLCB0cnVlLCBmYWxzZSkpOwoJCQl9IGVs c2UgaWYgKCRrZWVwID09ICdhbHBoYScpIHsKCQkJCSRyZXNvcnRlZF90YWdzID0gYXJyYXlf a2V5cygkdGFnc193ZWlnaHQpOwoJCQkJbmF0Y2FzZXNvcnQoJHJlc29ydGVkX3RhZ3MpOwoJ CQl9CgkJCSRjdXRvZmYgPSAnZXhhY3QnOwoJCX0KCgkJJGxhc3RfZ29vZF9pbmRleCA9ICRs aXN0bGltaXQgLSAxOwoJCWlmICgkY3V0b2ZmID09ICdjaHVuaycpIHsgLy9hbHRlcm5hdGl2 ZSBpcyAnZXhhY3QnCgkJCSRsYXN0X3dlaWdodCA9IC0xOwoJCQlmb3IgKCRpID0gMDsgJGkg PCAkbGlzdGxpbWl0ICsgMTsgJGkrKykgewoJCQkJJG5ld193ZWlnaHQgPSAkdGFnc193ZWln aHRbJHJlc29ydGVkX3RhZ3NbJGldXTsKCQkJCWlmICgkbmV3X3dlaWdodCAhPSAkbGFzdF93 ZWlnaHQpIHsKCQkJCQkkbGFzdF9nb29kX2luZGV4ID0gJGkgLSAxOwoJCQkJCSRsYXN0X3dl aWdodCA9ICRuZXdfd2VpZ2h0OwoJCQkJfQoJCQl9CgkJCWlmICgkbGFzdF9nb29kX2luZGV4 IDwgMCkgewoJCQkJJGxhc3RfZ29vZF9pbmRleCA9ICRsaXN0bGltaXQgLSAxOwoJCQl9CgkJ fQoKCQkkcmVzb3J0ZWRfdGFncyA9IGFycmF5X2NodW5rKCRyZXNvcnRlZF90YWdzLCAkbGFz dF9nb29kX2luZGV4ICsgMSk7CgkJJHJlc29ydGVkX3RhZ3MgPSAkcmVzb3J0ZWRfdGFnc1sw XTsKCgkJZm9yZWFjaCAoJHRhZ3Nfd2VpZ2h0IGFzICR0YWcgPT4gJHdlaWdodCkgewoJCQlp ZiAoIWluX2FycmF5KCR0YWcsICRyZXNvcnRlZF90YWdzKSkgewoJCQkJdW5zZXQoJHRhZ3Nf d2VpZ2h0WyR0YWddKTsKCQkJfQoJCX0KCX0KCglpZiAoJGdlbmVyYXRlbGlua3MpIHsKCQlp ZiAoJGxpbmtwYXRoKSB7CgkJCSR1cmxwcmVmaXggPSAkbGlua3BhdGg7CgkJCSR1cmxzdWZm aXggPSAkbGlua3BhdGh0YWlsOwoJCX0gZWxzZSB7CgkJCWlmICh0cnVfdGFnc19jbGVhbl91 cmxzKCkpIHsKCQkJCSR1cmxwcmVmaXggPSBodSAuICR0cnVfdGFnc19wcmVmc1tUQUdfU0VD VElPTl0tPnZhbHVlIC4gJy8nOwoJCQl9IGVsc2UgewoJCQkJJHVybHByZWZpeCA9IGh1IC4g Jz9zPScgLiAkdHJ1X3RhZ3NfcHJlZnNbVEFHX1NFQ1RJT05dLT52YWx1ZSAuICcmYW1wOycg LiAkdHJ1X3RhZ3NfcHJlZnNbUEFSTV9OQU1FXS0+dmFsdWUgLiAnPSc7CgkJCX0KCQkJJHVy bHN1ZmZpeCA9ICh0cnVfdGFnc19jbGVhbl91cmxzKCkgPyAnLycgOiAnJyk7CgkJfQoKCQlp ZiAoJHVzZXJlbHRhZykgewoJCQlpZiAoJHVzZW5vZm9sbG93KSB7CgkJCQkkdXJsc3VmZml4 IC49ICciIHJlbD0idGFnIG5vZm9sbG93JzsKCQkJfSBlbHNlIHsKCQkJCSR1cmxzdWZmaXgg Lj0gJyIgcmVsPSJ0YWcnOwoJCQl9CgkJfSBlbHNlIGlmICgkdXNlbm9mb2xsb3cpIHsKCQkJ JHVybHN1ZmZpeCAuPSAnIiByZWw9Im5vZm9sbG93JzsKCQl9Cgl9CgoJaWYgKGNvdW50KCR0 YWdzX3dlaWdodCkgPiAwKSB7CgkJJG1heCA9IG1heCgkdGFnc193ZWlnaHQpOwoJCSRtaW4g PSBtaW4oJHRhZ3Nfd2VpZ2h0KTsKCX0gZWxzZSB7CgkJJG1heCA9ICRtaW4gPSAwOwoJfQoJ JHN0ZXB2YWx1ZSA9ICgkbWF4ID09ICRtaW4pID8gMCA6ICgkbWF4cGVyY2VudCAtICRtaW5w ZXJjZW50KSAvICgkbWF4IC0gJG1pbik7CgoJJHRhZ3NfaHRtbCA9IGFycmF5KCk7CgkkdGFn X3NlYXJjaF90YWcgPSB0cnVfdGFnc190YWdfcGFyYW1ldGVyKGFycmF5KCdzdHJpcGh5cGhl bnMnID0+ICdsb29rdXAnKSk7CgkkdGFnX3NlYXJjaF90YWcgPSBmdW5jdGlvbl9leGlzdHMo Imh0bWxzcGVjaWFsY2hhcnNfZGVjb2RlIikgPyBodG1sc3BlY2lhbGNoYXJzX2RlY29kZSgk dGFnX3NlYXJjaF90YWcpIDogaHRtbF9lbnRpdHlfZGVjb2RlKCR0YWdfc2VhcmNoX3RhZyk7 Cglmb3JlYWNoICgkdGFnc193ZWlnaHQgYXMgJHRhZyA9PiAkd2VpZ2h0KSB7CgkJJHRhZ193 ZWlnaHQgPSBmbG9vcigkbWlucGVyY2VudCArICgkd2VpZ2h0IC0gJG1pbikgKiAkc3RlcHZh bHVlKTsKCgkJJHN0eWxlID0gJyc7CgkJaWYgKCRzZXRzaXplcykKCQkJJHN0eWxlID0gJyBz dHlsZT0iZm9udC1zaXplOiAnIC4gJHRhZ193ZWlnaHQgLiAnJTsiJzsKCgkJJHRhZ19jbGFz cyA9ICcnOwoJCWlmICgkc2V0Y2xhc3NlcykgewoJCQkkdGFnX2NsYXNzID0gJyBjbGFzcz0i JzsKCQkJaWYgKCR3ZWlnaHQgPT0gJG1pbikgewoJCQkJJHRhZ19jbGFzcyAuPSAidGFnU2l6 ZVNtYWxsZXN0IjsKCQkJfSBlbHNlIGlmICgkd2VpZ2h0ID09ICRtYXgpIHsKCQkJCSR0YWdf Y2xhc3MgLj0gInRhZ1NpemVMYXJnZXN0IjsKCQkJfSBlbHNlIHsKCQkJCSR0YWdfY2xhc3Mg Lj0gInRhZ1NpemVNZWRpdW0iOwoJCQl9CgkJCSR0YWdfY2xhc3MgLj0gJyB0YWdTaXplJyAu ICgkd2VpZ2h0ICsgMSAtICRtaW4pOwoJCQlpZiAoJHRhZyA9PSAkdGFnX3NlYXJjaF90YWcp IHsKCQkJCSR0YWdfY2xhc3MgLj0gJyAnIC4gJGFjdGl2ZWNsYXNzOwoJCQl9CgkJCSR0YWdf Y2xhc3MgLj0gJyInOwoJCX0KCgkJLy9hZGFwdGVkIGZyb20gY29kZSBieSBnZHRyb2lhbm8s IHNlZSBodHRwOi8vZm9ydW0udGV4dHBhdHRlcm4uY29tL3ZpZXd0b3BpYy5waHA/cGlkPTEw Mjg3NSNwMTAyODc1CgkJJHRpdGxlY291bnQgPSAnJzsKCQlpZiAoJHRpdGxlKQoJCQkkdGl0 bGVjb3VudCA9ICcgdGl0bGU9IicgLiAkdGl0bGUgLiAnIic7CgkJJGRpc3BsYXljb3VudD0g Jyc7CgkJJGNvdW50ID0gJGNvdW50d3JhcGNoYXJzezB9IC4gJHdlaWdodCAuICRjb3VudHdy YXBjaGFyc3sxfTsKCQlpZiAoJHNob3djb3VudHMgPT0gJ3RpdGxlJyB8fCAkc2hvd2NvdW50 cyA9PSAnYm90aCcpCgkJCSR0aXRsZWNvdW50ID0gJyB0aXRsZT0iJyAuICR0aXRsZSAuICRj b3VudCAuICciJzsKCQlpZiAoJHNob3djb3VudHMgJiYgJHNob3djb3VudHMgIT0gJ3RpdGxl JykKCQkJJGRpc3BsYXljb3VudCA9ICcgJyAuICRjb3VudDsKCgkJaWYgKCR0ZXh0dHJhbnNm b3JtID09ICdjYXBpdGFsaXplJykgewoJCQkkdGFnID0gdHJ1X3RhZ3NfdWN3b3JkcygkdGFn KTsKCQl9IGVsc2UgaWYgKCR0ZXh0dHJhbnNmb3JtID09ICd1cHBlcmNhc2UnKSB7CgkJCSR0 YWcgPSB0cnVfdGFnc19zdHJ0b3VwcGVyKCR0YWcpOwoJCX0gZWxzZSBpZiAoJHRleHR0cmFu c2Zvcm0gPT0gJ2xvd2VyY2FzZScpIHsKCQkJJHRhZyA9IHRydV90YWdzX3N0cnRvbG93ZXIo JHRhZyk7CgkJfSBlbHNlIGlmICgkdGV4dHRyYW5zZm9ybSA9PSAnY2FwZmlyc3QnKSB7CgkJ CSR0YWcgPSB0cnVfdGFnc191Y2ZpcnN0KCR0YWcpOwoJCX0KCgkJaWYgKCRnZW5lcmF0ZWxp bmtzKSB7CgkJCSR3aG9sZXVybCA9ICciJyAuICR1cmxwcmVmaXggLiB1cmxlbmNvZGUoJHRh ZykgLiAkdXJsc3VmZml4IC4gJyInOwoJCQkkdGFnc19odG1sW10gPSAnPGEgaHJlZj0nIC4g JHdob2xldXJsIC4gJHRhZ19jbGFzcyAuICRzdHlsZSAuICR0aXRsZWNvdW50IC4gJz4nIC4g aHRtbHNwZWNpYWxjaGFycygkdGFnKSAuICc8L2E+JyAuICRkaXNwbGF5Y291bnQ7CgkJfSBl bHNlIGlmICgkdGFnX2NsYXNzIHx8ICRzdHlsZSB8fCAkdGl0bGVjb3VudCkgewoJCQkkdGFn c19odG1sW10gPSAnPHNwYW4nIC4gJHRhZ19jbGFzcyAuICRzdHlsZSAuICR0aXRsZWNvdW50 IC4gJz4nIC4gaHRtbHNwZWNpYWxjaGFycygkdGFnKSAuICc8L3NwYW4+JyAuICRkaXNwbGF5 Y291bnQ7CgkJfSBlbHNlIHsKCQkJJHRhZ3NfaHRtbFtdID0gaHRtbHNwZWNpYWxjaGFycygk dGFnKSAuICRkaXNwbGF5Y291bnQ7CgkJfQoJfQoJcmV0dXJuIHRydV90YWdzX2RvX3dyYXAo JHRhZ3NfaHRtbCwgJHdyYXB0YWcsICRicmVhaywgJGNsYXNzLCAkYnJlYWtjbGFzcyk7Cn0K CgojIyMgQ0xFQU4gVVJMIEZVTkNUSU9OUyAjIyMKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj IyMjCgppZiAodHJ1X3RhZ3NfY2xlYW5fdXJscygpKSB7CglyZWdpc3Rlcl9jYWxsYmFjaygn dHJ1X3RhZ3NfY2xlYW5fdXJsX2hhbmRsZXInLCAncHJldGV4dCcpOwp9CgoKZnVuY3Rpb24g dHJ1X3RhZ3NfY2xlYW5fdXJsX2hhbmRsZXIoJGV2ZW50LCAkc3RlcCkgewoJZ2xvYmFsICR0 cnVfdGFnc19wcmVmczsKCSRzdWJwYXRoID0gcHJlZ19yZXBsYWNlKCIvaHR0cHM/OlwvXC8u KihcLy4qKS9VaSIsIiQxIixodSk7CgkkcmVnc2FmZXN1YnBhdGggPSBwcmVnX3F1b3RlKCRz dWJwYXRoLCAnLycpOwoJJHJlcSA9IHByZWdfcmVwbGFjZSgiL14kcmVnc2FmZXN1YnBhdGgv aSIsJy8nLCRfU0VSVkVSWydSRVFVRVNUX1VSSSddKTsKCgkkcXMgPSBzdHJwb3MoJHJlcSwg Jz8nKTsKCSRxYXR0cyA9ICgkcXMgPyAnJicuc3Vic3RyKCRyZXEsICRxcyArIDEpIDogJycp OwoJaWYgKCRxcykgJHJlcSA9IHN1YnN0cigkcmVxLCAwLCAkcXMpOwoKCSRwYXJ0cyA9IGFy cmF5X3ZhbHVlcyhhcnJheV9maWx0ZXIoZXhwbG9kZSgnLycsICRyZXEpKSk7CglpZiAoY291 bnQoJHBhcnRzKSA9PSAyICYmICRwYXJ0c1swXSA9PSAkdHJ1X3RhZ3NfcHJlZnNbVEFHX1NF Q1RJT05dLT52YWx1ZSkgewoJCSR0YWcgPSAkcGFydHNbMV07CgkJJF9TRVJWRVJbJ1FVRVJZ X1NUUklORyddID0gJHRydV90YWdzX3ByZWZzW1BBUk1fTkFNRV0tPnZhbHVlIC4gJz0nIC4g JHRhZyAuICRxYXR0czsKCQkkX1NFUlZFUlsnUkVRVUVTVF9VUkknXSA9ICRzdWJwYXRoIC4g JHRydV90YWdzX3ByZWZzW1RBR19TRUNUSU9OXS0+dmFsdWUgLiAnLz8nIC4gJF9TRVJWRVJb J1FVRVJZX1NUUklORyddOwoJCWlmIChjb3VudCgkX1BPU1QpID4gMCkgewoJCQkkX1BPU1Rb J3NlY3Rpb24nXSA9ICR0cnVfdGFnc19wcmVmc1tUQUdfU0VDVElPTl0tPnZhbHVlOwoJCQkk X1BPU1RbJHRydV90YWdzX3ByZWZzW1BBUk1fTkFNRV0tPnZhbHVlXSA9ICR0YWc7CgkJfSBl bHNlIHsKCQkJJF9HRVRbJ3NlY3Rpb24nXSA9ICR0cnVfdGFnc19wcmVmc1tUQUdfU0VDVElP Tl0tPnZhbHVlOwoJCQkkX0dFVFskdHJ1X3RhZ3NfcHJlZnNbUEFSTV9OQU1FXS0+dmFsdWVd ID0gJHRhZzsKCQl9Cgl9Cn0KCgpmdW5jdGlvbiB0cnVfdGFnc19jbGVhbl91cmxzKCkgewoJ Z2xvYmFsICR0cnVfdGFnc19wcmVmczsKCXJldHVybiAoJ2NsZWFuJyA9PSAkdHJ1X3RhZ3Nf cHJlZnNbQ0xFQU5fVVJMU10tPnZhbHVlKTsKfQoKCiMjIyBBRE1JTiBTSURFIEZVTkNUSU9O UyAjIyMKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwoKaWYgKEB0eHBpbnRlcmZhY2Ug PT0gJ2FkbWluJykgewoJYWRkX3ByaXZzKCd0cnVfdGFncycsICcxLDInKTsKCXJlZ2lzdGVy X3RhYignZXh0ZW5zaW9ucycsICd0cnVfdGFncycsICd0cnVfdGFncycpOwoJcmVnaXN0ZXJf Y2FsbGJhY2soJ3RydV90YWdzX2FkbWluX3RhYicsICd0cnVfdGFncycpOwoKCWlmICgkdHJ1 X3RhZ3NfcHJlZnNbVEFHU19JTl9XUklURV9UQUJdLT52YWx1ZSB8fCAkdHJ1X3RhZ3NfcHJl ZnNbQVVUT0NPTVBMRVRFX0lOX1dSSVRFX1RBQl0tPnZhbHVlKSB7CgkJcmVnaXN0ZXJfY2Fs bGJhY2soJ3RydV90YWdzX2FkbWluX3dyaXRlX3RhYl9oYW5kbGVyJywgJ2FydGljbGUnKTsK CX0KfQoKCmZ1bmN0aW9uIHRydV90YWdzX2FkbWluX3RhYigkZXZlbnQsICRzdGVwKSB7Cgly ZXF1aXJlX3ByaXZzKCd0cnVfdGFncycpOwoKCSRyZXN1bHRzID0gdHJ1X3RhZ3NfYWRtaW5f dGFiX2hhbmRsZV9pbnB1dCgpOwoKCSRhdHRzID0gdHJ1X3RhZ3NfZ2V0X3N0YW5kYXJkX2Ns b3VkX2F0dHMoYXJyYXkoKSwgZmFsc2UsIGZhbHNlLCB0cnVlKTsKCSRhbGxfdGFncyA9IHRy dV90YWdzX2Nsb3VkX3F1ZXJ5KCRhdHRzKTsKCSRjbG91ZCA9IHRydV90YWdzX3JlbmRlcl9j bG91ZCgkYXR0cywgJGFsbF90YWdzLCAkYWxsX3RhZ3MpOwoKCSRyZWRpcmVjdHMgPSB0cnVf dGFnc19sb2FkX3JlZGlyZWN0cygpOwoKCXRydV90YWdzX2FkbWluX3RhYl9yZW5kZXJfcGFn ZSgkcmVzdWx0cywgJGNsb3VkLCAkcmVkaXJlY3RzKTsKfQoKCmZ1bmN0aW9uIHRydV90YWdz X2FkbWluX3RhYl9yZW5kZXJfcGFnZSgkcmVzdWx0cywgJGNsb3VkLCAkcmVkaXJlY3RzKSB7 CglnbG9iYWwgJGV2ZW50OwoJcGFnZXRvcCgndHJ1X3RhZ3MnLCAnJyk7CgoJaW5jbHVkZV9v bmNlKHR4cGF0aCAuICcvaW5jbHVkZS90eHBfcHJlZnMucGhwJyk7CglnbG9iYWwgJHRydV90 YWdzX3ByZWZzOwoKCWVjaG8gc3RhcnRUYWJsZSgnbGF5b3V0JywgJycsICcnLCAnMTBweCcp Lic8dHI+PHRkIHN0eWxlPSJib3JkZXItcmlnaHQ6MnB4IHNvbGlkIGdyYXkiPicuICAjIEkg a25vdywgSSBrbm93Li4uCgkJc3RhcnRUYWJsZSgnbGF5b3V0JywgJycsICcnLCAnJywgJzEw cHgnKS4nPHRyPjx0ZCBzdHlsZT0iYm9yZGVyLWJvdHRvbToycHggc29saWQgZ3JheSI+Jy4K CQkJc3RhcnRUYWJsZSgnbGlzdCcsICcnLCAnJywgJycsICczMDBweCcpLgoJCQkJdHIoaENl bGwoZ1R4dCgnQ3VycmVudCB0YWdzJykpKS4KCQkJCXRyKHRkKCRjbG91ZCkpLgoJCQllbmRU YWJsZSgpLgoJCSc8L3RkPjwvdHI+PHRyPjx0ZD4nLgoJCQlzdGFydFRhYmxlKCdsaXN0Jywg JycsICcnLCAnJywgJzMwMHB4JykuCgkJCQl0cihoQ2VsbChnVHh0KCd0cnVfdGFncyBSZWZl cmVuY2UnKSkpLgoJCQkJdHIodGQoJzxhIGhyZWY9Imh0dHA6Ly93d3cucmFpbnNraXQuY29t L3JlZmVyZW5jZS80OTcvdHJ1dGFncy11c2FnZS1pbnN0cnVjdGlvbnMiPlVzYWdlIGluc3Ry dWN0aW9uczwvYT4nLgoJCQkJJzxicj48YSBocmVmPSJodHRwOi8vZm9ydW0udGV4dHBhdHRl cm4uY29tL3ZpZXd0b3BpYy5waHA/aWQ9MTUwODQiPkZvcnVtIHBhZ2VzPC9hPicuCgkJCQkn PGJyPjxhIGhyZWY9Imh0dHA6Ly93d3cucmFpbnNraXQuY29tL3JlZmVyZW5jZS81MzcvdHJ1 X3RhZ3MtcmVsZWFzZXMiPlJlbGVhc2VzIHBhZ2U8L2E+Jy4KCQkJCSc8YnI+PGEgaHJlZj0i aHR0cDovL3d3dy5yYWluc2tpdC5jb20vcmVmZXJlbmNlLzU1NC90cnVfdGFncy1yb2FkbWFw Ij5SZWxlYXNlIHJvYWRtYXA8L2E+Jy4KCQkJCSc8YnI+PGEgaHJlZj0iaHR0cDovL3d3dy5y YWluc2tpdC5jb20vcmVmZXJlbmNlLzQ5NS90cnV0YWdzLWZlYXR1cmUtbGlzdCI+RmVhdHVy ZSBsaXN0PC9hPicuCgkJCQknPGJyPjxicj48YSBocmVmPSJodHRwOi8vY29kZS5nb29nbGUu Y29tL3AvdHJ1LXRhZ3Mvc291cmNlL2Jyb3dzZS90cnVuay90cnVfdGFncy5waHAiPnRydV90 YWdzIHNvdXJjZSBjb2RlPC9hPicuCgkJCQknPGJyPjxhIGhyZWY9Imh0dHA6Ly9jb2RlLmdv b2dsZS5jb20vcC90cnUtdGFncy9zb3VyY2UvYnJvd3NlL3RydW5rL3RydV90YWdzLWRvY3Mu aHRtbCI+U291cmNlIEhUTUwgZm9yIHRoZSB1c2FnZSBpbnN0cnVjdGlvbnM8L2E+Jy4KCQkJ CSc8YnI+PGJyPjxhIGhyZWY9Imh0dHA6Ly93d3cucmFpbnNraXQuY29tL2Jsb2cvNDkzL3Ry dXRhZ3MtYS10YWdnaW5nLXBsdWdpbi1mb3ItdGV4dHBhdHRlcm4iPnRydV90YWdzPC9hPiwg YnkgPGEgaHJlZj0iaHR0cDovL3d3dy5yYWluc2tpdC5jb20vIj5OYXRoYW4gQXJ0aHVyPC9h PicuCgkJCQknPGJyPjxicj4nLgoJCQkJJzxkaXYgaWQ9InBheXBhbCI+PGZvcm0gYWN0aW9u PSJodHRwczovL3d3dy5wYXlwYWwuY29tL2NnaS1iaW4vd2Vic2NyIiBtZXRob2Q9InBvc3Qi PjxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9ImNtZCIgdmFsdWU9Il9zLXhjbGljayIgLz48 aW5wdXQgdHlwZT0iaW1hZ2UiIHNyYz0iaHR0cHM6Ly93d3cucGF5cGFsLmNvbS9lbl9VUy9p L2J0bi94LWNsaWNrLWJ1dDA0LmdpZiIgbmFtZT0ic3VibWl0IiBhbHQ9Ik1ha2UgYSBkb25h dGlvbiB0byBOYXRoYW4gQXJ0aHVyIiAvPjxpbWcgYWx0PSIiIGJvcmRlcj0iMCIgc3JjPSJo dHRwczovL3d3dy5wYXlwYWwuY29tL2VuX1VTL2kvc2NyL3BpeGVsLmdpZiIgd2lkdGg9IjEi IGhlaWdodD0iMSIgLz48aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJlbmNyeXB0ZWQiIHZh bHVlPSItLS0tLUJFR0lOIFBLQ1M3LS0tLS1NSUlIVHdZSktvWklodmNOQVFjRW9JSUhRREND Qnp3Q0FRRXhnZ0V3TUlJQkxBSUJBRENCbERDQmpqRUxNQWtHQTFVRUJoTUNWVk14Q3pBSkJn TlZCQWdUQWtOQk1SWXdGQVlEVlFRSEV3MU5iM1Z1ZEdGcGJpQldhV1YzTVJRd0VnWURWUVFL RXd0UVlYbFFZV3dnU1c1akxqRVRNQkVHQTFVRUN4UUtiR2wyWlY5alpYSjBjekVSTUE4R0Ex VUVBeFFJYkdsMlpWOWhjR2t4SERBYUJna3Foa2lHOXcwQkNRRVdEWEpsUUhCaGVYQmhiQzVq YjIwQ0FRQXdEUVlKS29aSWh2Y05BUUVCQlFBRWdZQzhpMVQyN2xqS2ZwTlRFUWkwd0tIY2RH dWx4eGtNcXdkQ01tYkd2czg3bi80VHNKdGlBc3FNbzJoeXM3WnNHeTVSRi9PN3MrQjJvUTc2 elVsVDUyV1c3UWVYVUszR3AwbnIyY1AzaW9CU3ROdStSWjZqa2FtMkUwRkdMWHlWNitVTlZF T3doOGxtb0lTUm90dlN2SWdReVRMbkVlREhxRzlxdlV6cXZGM1NxakVMTUFrR0JTc09Bd0lh QlFBd2djd0dDU3FHU0liM0RRRUhBVEFVQmdncWhraUc5dzBEQndRSXBtUFpybHJaZlptQWdh aWVQVmIrbjlzVmRzdWZnR3JtQXcyclhBelIzOWtZcVBVSjduMExpTkRtZEFxNzNKb1A1M2ta eThnU3BvdnVjTDJTMGpDMXNYcmNwRUxBcExMOEJGU0hmZExpWm9aU1YvQ1lPcHBINStkeDJZ cUZJZHlDQ2RqSVg3b09QZ1F5QXVnUmEyUXIzYit5dXR1RzBERnNkK0xBSkdiOGw0Q25ucmJt d2RZSzNOblZEQlBPbXhFT2psWFVnRXpsRkxYbUUzdzUrTW9QS1FjcDJuOGZkSkxzZ0cxNXhv VlBGekNkL0syZ2dnT0hNSUlEZ3pDQ0F1eWdBd0lCQWdJQkFEQU5CZ2txaGtpRzl3MEJBUVVG QURDQmpqRUxNQWtHQTFVRUJoTUNWVk14Q3pBSkJnTlZCQWdUQWtOQk1SWXdGQVlEVlFRSEV3 MU5iM1Z1ZEdGcGJpQldhV1YzTVJRd0VnWURWUVFLRXd0UVlYbFFZV3dnU1c1akxqRVRNQkVH QTFVRUN4UUtiR2wyWlY5alpYSjBjekVSTUE4R0ExVUVBeFFJYkdsMlpWOWhjR2t4SERBYUJn a3Foa2lHOXcwQkNRRVdEWEpsUUhCaGVYQmhiQzVqYjIwd0hoY05NRFF3TWpFek1UQXhNekUx V2hjTk16VXdNakV6TVRBeE16RTFXakNCampFTE1Ba0dBMVVFQmhNQ1ZWTXhDekFKQmdOVkJB Z1RBa05CTVJZd0ZBWURWUVFIRXcxTmIzVnVkR0ZwYmlCV2FXVjNNUlF3RWdZRFZRUUtFd3RR WVhsUVlXd2dTVzVqTGpFVE1CRUdBMVVFQ3hRS2JHbDJaVjlqWlhKMGN6RVJNQThHQTFVRUF4 UUliR2wyWlY5aGNHa3hIREFhQmdrcWhraUc5dzBCQ1FFV0RYSmxRSEJoZVhCaGJDNWpiMjB3 Z1o4d0RRWUpLb1pJaHZjTkFRRUJCUUFEZ1kwQU1JR0pBb0dCQU1GSFR0MzhSTXhMWEp5TzJT bVMrTmRsNzJUN29LSjR1NHV3KzZhd250QUxXaDAzUGV3bUlKdXpiQUxTY3NUUzRzWm9TMWZL Y2lCR29oMTFnSWZIenlsdmtkTmUvaEpsNjYvUkdxcmo1ckZiMDhzQUFCTlR6RFRpcXFOcEpl QnNZcy9jMmFpR296cHRYMlJsbkJrdEgrU1VOcEFhalc3MjROdjJXdmhpZjZzRkFnTUJBQUdq Z2U0d2dlc3dIUVlEVlIwT0JCWUVGSmFmZkx2R2J4ZTlXVDlTMXdvYjdCRFdaSlJyTUlHN0Jn TlZIU01FZ2JNd2diQ0FGSmFmZkx2R2J4ZTlXVDlTMXdvYjdCRFdaSlJyb1lHVXBJR1JNSUdP TVFzd0NRWURWUVFHRXdKVlV6RUxNQWtHQTFVRUNCTUNRMEV4RmpBVUJnTlZCQWNURFUxdmRX NTBZV2x1SUZacFpYY3hGREFTQmdOVkJBb1RDMUJoZVZCaGJDQkpibU11TVJNd0VRWURWUVFM RkFwc2FYWmxYMk5sY25Sek1SRXdEd1lEVlFRREZBaHNhWFpsWDJGd2FURWNNQm9HQ1NxR1NJ YjNEUUVKQVJZTmNtVkFjR0Y1Y0dGc0xtTnZiWUlCQURBTUJnTlZIUk1FQlRBREFRSC9NQTBH Q1NxR1NJYjNEUUVCQlFVQUE0R0JBSUZmT2xhYWdGcmw3MStqcTZPS2lkYldGU0UrUTRGcVJP dmRnSU9OdGgrOGtTSy8vWS80aWh1RTRZbXZ6bjVjZUUzUy9pQlNRUU1qeXZiK3MyVFdiUVlE d2NwMTI5T1BJYkQ5ZXBkcjR0Sk9VTmlTb2p3N0JId1lSaVBoNThTMXhHbEZnSEZYd3JFQmIz ZGdOYk1VYSt1NHFlY3RzTUFYcFZIbkQ5d0l5Zm1ITVlJQm1qQ0NBWllDQVFFd2daUXdnWTR4 Q3pBSkJnTlZCQVlUQWxWVE1Rc3dDUVlEVlFRSUV3SkRRVEVXTUJRR0ExVUVCeE1OVFc5MWJu UmhhVzRnVm1sbGR6RVVNQklHQTFVRUNoTUxVR0Y1VUdGc0lFbHVZeTR4RXpBUkJnTlZCQXNV Q214cGRtVmZZMlZ5ZEhNeEVUQVBCZ05WQkFNVUNHeHBkbVZmWVhCcE1Sd3dHZ1lKS29aSWh2 Y05BUWtCRmcxeVpVQndZWGx3WVd3dVkyOXRBZ0VBTUFrR0JTc09Bd0lhQlFDZ1hUQVlCZ2tx aGtpRzl3MEJDUU14Q3dZSktvWklodmNOQVFjQk1Cd0dDU3FHU0liM0RRRUpCVEVQRncwd09E QTNNRE13TkRFME1USmFNQ01HQ1NxR1NJYjNEUUVKQkRFV0JCVDB0a2o0ZFpMZS9FNFF3Ymli MjlYRWRIeEFZakFOQmdrcWhraUc5dzBCQVFFRkFBU0JnTDVKc1FIalE5U2c0WTNlRFdLRE8x NnIrdGZFejRSWUFEdCs2aDk4MWZrVkN4Zk5IRkR4b2ZEY3h5elJNWXI3eTk1Y2RuVmk0QU5R d01VWTZ5Slc1am0vR0QxN3JqZ1N4Wk1FdnNBZTZZY0NTTEs1WmFwQ3cxcWx5U3BQR1pCQTNN VHQ2T0Qrb3ZWb2EvMXY4Q05zRWNIcDdmNHRPeE9VU3c1UDRuSHlMUFdqLS0tLS1FTkQgUEtD UzctLS0tLSI+PC9mb3JtPjwvZGl2PicKCQkJCSkpLgoJCQllbmRUYWJsZSgpLgoJCSc8L3Rk PjwvdHI+Jy5lbmRUYWJsZSgpLgoJJzwvdGQ+PHRkPicuCgkJc3RhcnRUYWJsZSgnbGF5b3V0 JywgJycsICcnLCAnMTBweCcpLic8dHI+PHRkIHN0eWxlPSJib3JkZXItYm90dG9tOjJweCBz b2xpZCBncmF5O3dpZHRoOjQwMHB4Ij4nOwoKCQlpZiAoJHJlc3VsdHMpIHsKCQkJZWNobyBz dGFydFRhYmxlKCdsaXN0JywgJycsICcnLCAnJywgJzEwMCUnKS4KCQkJCXRyKGhDZWxsKGdU eHQoJ1Jlc3VsdHMnKSkpLgoJCQkJdHIodGRhKCRyZXN1bHRzKSwgJyBzdHlsZT0iY29sb3I6 cmVkIicpLgoJCQllbmRUYWJsZSgpOwoJCQllY2hvICc8L3RkPjwvdHI+PHRyPjx0ZCBzdHls ZT0iYm9yZGVyLWJvdHRvbToycHggc29saWQgZ3JheSI+JzsKCQl9CgoKCQllY2hvIHN0YXJ0 VGFibGUoJ2xpc3QnLCAnJywgJycsICcnLCAnMTAwJScpLgoJCQl0cih0YWcoZ1R4dCgnQXJ0 aWNsZSBUYWcgTWFpbnRlbmFuY2UnKS4nICgnLmdUeHQoJ0Nhc2UgU2Vuc2l0aXZlJykuJyEp JywgJ3RoJywgJyBjb2xzcGFuPSI1IicpKS4KCQkJdHIoCgkJCQlmb3JtKAoJCQkJCXRkYShn VHh0KCdSZW5hbWUnKS4nOiAnLCAnIHN0eWxlPSJ2ZXJ0aWNhbC1hbGlnbjptaWRkbGUiJyku CgkJCQkJdGQodGV4dF9pbnB1dCgnbWF0Y2h0YWcnLCAnJywgJzE1JykpLgoJCQkJCXRkYShn VHh0KCd0bycpLic6JywgJyBzdHlsZT0idmVydGljYWwtYWxpZ246bWlkZGxlIicpLgoJCQkJ CXRkKHRleHRfaW5wdXQoJ3JlcGxhY2V0YWcnLCAnJywgJzE1JykpLgoJCQkJCXRkKGZJbnB1 dCgnc3VibWl0JywgJ3JlcGxhY2UnLCBnVHh0KCdSdW4nKSwgJ3B1Ymxpc2gnKS5lSW5wdXQo J3RydV90YWdzJykpLAoJCQkJCScnLCAnIHZlcmlmeShcJycgLiBnVHh0KCdhcmVfeW91X3N1 cmUnKSAuICdcJykiJwoJCQkJKQoJCQkpLgoJCQl0cigKCQkJCWZvcm0oCgkJCQkJdGRhKGdU eHQoJ0RlbGV0ZScpLic6ICcsICcgc3R5bGU9InZlcnRpY2FsLWFsaWduOm1pZGRsZSInKS4K CQkJCQl0ZCh0ZXh0X2lucHV0KCdkZWxldGV0YWcnLCAnJywgJzE1JykpLgoJCQkJCXRkY3Mo JycsIDIpLgoJCQkJCXRkKGZJbnB1dCgnc3VibWl0JywgJ2RlbGV0ZScsIGdUeHQoJ1J1bicp LCAncHVibGlzaCcpLmVJbnB1dCgndHJ1X3RhZ3MnKSksCgkJCQkJJycsICcgdmVyaWZ5KFwn JyAuIGdUeHQoJ2FyZV95b3Vfc3VyZScpIC4gJ1wnKSInCgkJCQkpCgkJCSkuCgkJZW5kVGFi bGUoKTsKCgllY2hvICc8L3RkPjwvdHI+PHRyPjx0ZCBzdHlsZT0iYm9yZGVyLWJvdHRvbToy cHggc29saWQgZ3JheSI+JzsKCgkJZWNobyBzdGFydFRhYmxlKCdsaXN0JywgJycsICcnLCAn JywgJzEwMCUnKS4KCQkJdHIodGFnKGdUeHQoJ1JlZGlyZWN0aW9ucycpLCAndGgnLCAnIGNv bHNwYW49IjQiJykpOwoJCQlmb3JlYWNoICgkcmVkaXJlY3RzIGFzICRsZWZ0dGFnID0+ICRy aWdodHRhZykgewoJCQkJZWNobyB0cigKCQkJCQl0ZGEoaHJlZigkbGVmdHRhZywgdHJ1X3Rh Z3NfbGlua2lmeV90YWcoJGxlZnR0YWcpKSwgJyBzdHlsZT0idGV4dC1hbGlnbjogY2VudGVy IicpLgoJCQkJCXRkYShodG1sc3BlY2lhbGNoYXJzKCc9PicpLCAnIHN0eWxlPSJ0ZXh0LWFs aWduOiBjZW50ZXIiJykuCgkJCQkJdGRhKGhyZWYoJHJpZ2h0dGFnLCB0cnVfdGFnc19saW5r aWZ5X3RhZygkcmlnaHR0YWcpKSwgJyBzdHlsZT0idGV4dC1hbGlnbjogY2VudGVyIicpLgoJ CQkJCXRkKCc8YSBocmVmPSJpbmRleC5waHA/ZXZlbnQ9dHJ1X3RhZ3MmYW1wO2RlbGV0ZV9y ZWRpcmVjdD0nLnVybGVuY29kZSgkbGVmdHRhZykuJyIgIG9uY2xpY2s9InJldHVybiB2ZXJp ZnkoXCcnLmdUeHQoJ2FyZV95b3Vfc3VyZScpLidcJykiPkRlbGV0ZTwvYT4nKQoJCQkJKTsK CQkJfQoJCQllY2hvIHRyKAoJCQkJJzxmb3JtIG5hbWU9InJlZGlyZWN0IiBpZD0icmVkaXJl Y3QiIG1ldGhvZD0icG9zdCIgYWN0aW9uPSJpbmRleC5waHA/ZXZlbnQ9dHJ1X3RhZ3MiIG9u c3VibWl0PSJyZXR1cm4gdmVyaWZ5KFwnJy5nVHh0KCdhcmVfeW91X3N1cmUnKS4nXCcpIj4n LgoJCQkJCXRkYSh0ZXh0X2lucHV0KCdsZWZ0dGFnJywgJycsICcxNScpLCAnIHN0eWxlPSJ0 ZXh0LWFsaWduOmNlbnRlciInKS4KCQkJCQl0ZGEoaHRtbHNwZWNpYWxjaGFycygnPT4nKSwg JyBzdHlsZT0idmVydGljYWwtYWxpZ246bWlkZGxlO3RleHQtYWxpZ246Y2VudGVyIicpLgoJ CQkJCXRkYSh0ZXh0X2lucHV0KCdyaWdodHRhZycsICcnLCAnMTUnKSwgJyBzdHlsZT0idGV4 dC1hbGlnbjpjZW50ZXIiJykuCgkJCQkJdGRhKCc8YSBocmVmPSIjIiBvbmNsaWNrPSJpZiAo dmVyaWZ5KFwnJy5nVHh0KCdhcmVfeW91X3N1cmUnKS4nXCcpKSBkb2N1bWVudC5nZXRFbGVt ZW50QnlJZChcJ3JlZGlyZWN0XCcpLnN1Ym1pdCgpOyByZXR1cm4gZmFsc2U7Ij5BZGQgbmV3 PC9hPicsICcgc3R5bGU9InZlcnRpY2FsLWFsaWduOm1pZGRsZSInKS4KCQkJCQlmSW5wdXQo J2hpZGRlbicsICdyZWRpcmVjdCcsICcxJykuCgkJCQknPC9mb3JtPicKCgkJCSkuCgkJZW5k VGFibGUoKTsKCgllY2hvICc8L3RkPjwvdHI+PHRyPjx0ZD4nOwoKCQllY2hvIHN0YXJ0VGFi bGUoJ2xpc3QnKS4KCQkJdHIodGFnKGdUeHQoJ1ByZWZlcmVuY2VzJyksICd0aCcsICcgY29s c3Bhbj0iMiInKSkuCgkJCWZvcm0oCgkJCQl0cigKCQkJCQl0ZGEoZ1R4dCgnVXNlIGNsZWFu IFVSTHMnKS4nICgnLmdUeHQoJ3NpdGUgZGVmYXVsdCBpcycpLicgJy4kdHJ1X3RhZ3NfcHJl ZnNbQ0xFQU5fVVJMU10tPmRlZmF1bHRfdmFsdWUuJyk6ICcsICcgc3R5bGU9InZlcnRpY2Fs LWFsaWduOm1pZGRsZSInKS4KCQkJCQl0ZChyYWRpb19saXN0KENMRUFOX1VSTFMsCgkJCQkJ CQlhcnJheSgnY2xlYW4nPT5nVHh0KCdjbGVhbicpLCAnbWVzc3knPT5nVHh0KCdtZXNzeScp KSwKCQkJCQkJCSR0cnVfdGFnc19wcmVmc1tDTEVBTl9VUkxTXS0+dmFsdWUpKQoJCQkJKS4K CQkJCXRyKAoJCQkJCXRkYShnVHh0KCdUYWcgc2VjdGlvbiBuYW1lJykuJyAoZGVmYXVsdCBp cyAiJy4kdHJ1X3RhZ3NfcHJlZnNbVEFHX1NFQ1RJT05dLT5kZWZhdWx0X3ZhbHVlLiciKTog JywgJyBzdHlsZT0idmVydGljYWwtYWxpZ246bWlkZGxlIicpLgoJCQkJCXRkKHRleHRfaW5w dXQoVEFHX1NFQ1RJT04sICR0cnVfdGFnc19wcmVmc1tUQUdfU0VDVElPTl0tPnZhbHVlLCAn MTUnKSkKCQkJCSkuCgkJCQl0cigKCQkJCQl0ZGEoZ1R4dCgnVVJMIHBhcmFtZXRlciBmb3Ig dGFnIHNlYXJjaCcpLicgKGRlZmF1bHQgaXMgIicuJHRydV90YWdzX3ByZWZzW1BBUk1fTkFN RV0tPmRlZmF1bHRfdmFsdWUuJyIpOiAnLgoJCQkJCQknPGJyPjxlbT4oeW91IHNob3VsZG5c J3QgY2hhbmdlIHRoaXMgdW5sZXNzIHlvdSByZWFsbHkga25vdyB3aGF0IHlvdSBhcmUgZG9p bmcpPC9lbT4nLCAnIHN0eWxlPSJ2ZXJ0aWNhbC1hbGlnbjptaWRkbGUiJykuCgkJCQkJdGQo dGV4dF9pbnB1dChQQVJNX05BTUUsICR0cnVfdGFnc19wcmVmc1tQQVJNX05BTUVdLT52YWx1 ZSwgJzE1JykpCgkJCQkpLgoJCQkJdHIoCgkJCQkJdGRhKGdUeHQoJ1B1dCB0YWdzIGludG8g UlNTL0F0b20gZmVlZHMsIGluICJDYXRlZ29yeSIgZWxlbWVudHMnKS4KCQkJCQkJJzogPGJy PjxlbT4oeW91IHByb2JhYmx5IHdhbnQgdGhpcyk8L2VtPicsICcgc3R5bGU9InZlcnRpY2Fs LWFsaWduOm1pZGRsZSInKS4KCQkJCQl0ZCh5ZXNub1JhZGlvKFRBR1NfSU5fRkVFRF9DQVRF R09SSUVTLCAkdHJ1X3RhZ3NfcHJlZnNbVEFHU19JTl9GRUVEX0NBVEVHT1JJRVNdLT52YWx1 ZSkpCgkJCQkpLgoJCQkJdHIoCgkJCQkJdGRhKCdBcHBlbmQgdGhlIHRhZyBsaXN0IHRvIHRo ZSBib2R5IG9mIFJTUy9BdG9tIGZlZWRzLCAnLgoJCQkJCQknd2l0aCBsaW5rcywgYW5kIHdp dGggcmVsPSJ0YWciOicuCgkJCQkJCSc8YnI+PGVtPihpZiB0aGlzIGlzIHR1cm5lZCBvbiwn LgoJCQkJCQkneW91IGNhbiBkZWZpbmUgYSAibWlzYyIgZm9ybSBuYW1lZCB0cnVfdGFnc19m ZWVkX3RhZ3MgJy4KCQkJCQkJJ3RoYXQgd2lsbCBiZSB1c2VkIHRvIHJlbmRlciB0aGUgdGFn cyBpbiB0aGUgZmVlZCk8L2VtPicsCgkJCQkJCScgc3R5bGU9InZlcnRpY2FsLWFsaWduOm1p ZGRsZSInKS4KCQkJCQl0ZCh5ZXNub1JhZGlvKFRBR1NfSU5fRkVFRF9CT0RZLCAkdHJ1X3Rh Z3NfcHJlZnNbVEFHU19JTl9GRUVEX0JPRFldLT52YWx1ZSkpCgkJCQkpLgoJCQkJdHIoCgkJ CQkJdGRhKGdUeHQoJ1Nob3cgYSBjbGlja2FibGUgbGlzdCBvZiB0YWdzIG9uIHRoZSAiV3Jp dGUiIHBhZ2UnKS4nOiAnLAoJCQkJCQknIHN0eWxlPSJ2ZXJ0aWNhbC1hbGlnbjptaWRkbGUi JykuCgkJCQkJdGQoeWVzbm9SYWRpbyhUQUdTX0lOX1dSSVRFX1RBQiwgJHRydV90YWdzX3By ZWZzW1RBR1NfSU5fV1JJVEVfVEFCXS0+dmFsdWUpKQoJCQkJKS4KCQkJCXRyKAoJCQkJCXRk YShnVHh0KCdBdXRvY29tcGxldGUgdGFncyBvbiB0aGUgIldyaXRlIiBwYWdlJykuJzogPGJy PicuCgkJCQkJCSc8ZW0+KHJlcXVpcmVzIHRoYXQgdGhlIDxhIGhyZWY9Imh0dHA6Ly9iYXNz aXN0YW5jZS5kZS9qcXVlcnktcGx1Z2lucy9qcXVlcnktcGx1Z2luLWF1dG9jb21wbGV0ZS8i PmpRdWVyeSBBdXRvY29tcGxldGUgcGx1Z2luPC9hPiA8Y29kZT4uY3NzPC9jb2RlPiBhbmQg PGNvZGU+Lm1pbi5qczwvY29kZT4gZmlsZXMgYmUgdXBsb2FkZWQgaW50byBhICI8Y29kZT5q czwvY29kZT4iIGZvbGRlciBvbiB5b3VyIHNpdGUpPC9lbT4nLAoJCQkJCQknIHN0eWxlPSJ2 ZXJ0aWNhbC1hbGlnbjptaWRkbGUiJykuCgkJCQkJdGQoeWVzbm9SYWRpbyhBVVRPQ09NUExF VEVfSU5fV1JJVEVfVEFCLCAkdHJ1X3RhZ3NfcHJlZnNbQVVUT0NPTVBMRVRFX0lOX1dSSVRF X1RBQl0tPnZhbHVlKSkKCQkJCSkuCgkJCQl0cigKCQkJCQl0ZGEoZ1R4dCgnQ29udmVydCB0 YWdzIHRvIGxvd2VyY2FzZSBieSBkZWZhdWx0JykuJzogPGJyPicuCgkJCQkJCSc8ZW0+KHlv dSBwcm9iYWJseSB3YW50IHRoaXMsIHVubGVzcyB5b3UgYXJlIGhhdmluZyBwcm9ibGVtcyB3 aXRoIHV0Zi04IGNoYXJhY3RlcnMpPC9lbT4nLAoJCQkJCQknIHN0eWxlPSJ2ZXJ0aWNhbC1h bGlnbjptaWRkbGUiJykuCgkJCQkJdGQoeWVzbm9SYWRpbyhVVEZfOF9DQVNFLCAkdHJ1X3Rh Z3NfcHJlZnNbVVRGXzhfQ0FTRV0tPnZhbHVlKSkKCQkJCSkuCgkJCQl0cigKCQkJCQl0ZCgn JykuCgkJCQkJdGRhKGZJbnB1dCgnc3VibWl0JywgJ3ByZWZzJywgZ1R4dCgnU2F2ZScpLCAn cHVibGlzaCcpLmVJbnB1dCgndHJ1X3RhZ3MnKSwgJyBzdHlsZT0idGV4dC1hbGlnbjpyaWdo dCInKQoJCQkJKSwKCQkJCScnLCAnIHZlcmlmeShcJycgLiBnVHh0KCdhcmVfeW91X3N1cmUn KSAuICdcJykiJwoJCQkpLgoJCWVuZFRhYmxlKCkuJzwvdGQ+PC90cj4nLgoJCWVuZFRhYmxl KCk7CgoJZWNobyAnPC90ZD48L3RyPicuZW5kVGFibGUoKTsKfQoKCmZ1bmN0aW9uIHRydV90 YWdzX2FkbWluX3RhYl9oYW5kbGVfaW5wdXQoKSB7CglpZiAoZ3BzKCdwcmVmcycpKSB7CgkJ cmV0dXJuIHRydV90YWdzX2FkbWluX3VwZGF0ZV9wcmVmcygpOwoJfSBlbHNlIGlmIChncHMo J2RlbGV0ZScpKSB7CgkJcmV0dXJuIHRydV90YWdzX2FkbWluX2RlbGV0ZV90YWcoZ3BzKCdk ZWxldGV0YWcnKSk7Cgl9IGVsc2UgaWYgKGdwcygncmVwbGFjZScpKSB7CgkJJHJlc3VsdCA9 IHRydV90YWdzX2FkbWluX3JlcGxhY2VfdGFnKGdwcygnbWF0Y2h0YWcnKSwgZ3BzKCdyZXBs YWNldGFnJyksIGZhbHNlKTsKCQlyZXR1cm4gJHJlc3VsdCAuICc8YnI+JyAuIHRydV90YWdz X2FkbWluX3JlZGlyZWN0X3RhZyhncHMoJ21hdGNodGFnJyksIGdwcygncmVwbGFjZXRhZycp KTsKCX0gZWxzZSBpZiAoZ3BzKCdyZWRpcmVjdCcpKSB7CgkJcmV0dXJuIHRydV90YWdzX2Fk bWluX3JlZGlyZWN0X3RhZyhncHMoJ2xlZnR0YWcnKSwgZ3BzKCdyaWdodHRhZycpKTsKCX0g ZWxzZSBpZiAoZ3BzKCdkZWxldGVfcmVkaXJlY3QnKSkgewoJCXJldHVybiB0cnVfdGFnc19h ZG1pbl9kZWxldGVfcmVkaXJlY3QoZ3BzKCdkZWxldGVfcmVkaXJlY3QnKSk7Cgl9IGVsc2Ug ewoJCXJldHVybiAnJzsKCX0KfQoKCmZ1bmN0aW9uIHRydV90YWdzX2FkbWluX3VwZGF0ZV9w cmVmcygpIHsKCWdsb2JhbCAkdHJ1X3RhZ3NfcHJlZnM7CgkkcmVzdWx0cyA9IGFycmF5KCk7 Cglmb3JlYWNoICgkdHJ1X3RhZ3NfcHJlZnMgYXMgJHByZWYpIHsKCQkkdmFsaWRfdmFsdWUg PSAkcHJlZi0+dmFsaWRhdGVfdmFsdWUoZ3BzKCRwcmVmLT5uYW1lKSk7CgkJaWYgKCR2YWxp ZF92YWx1ZSAmJiAkdmFsaWRfdmFsdWUgPD4gZ3BzKCRwcmVmLT5uYW1lKSkgewoJCQlyZXR1 cm4gJHZhbGlkX3ZhbHVlOyAgIyMjIHRoaXMgaXMgYSBzbmVha3kgd2F5IHRvIGhhbmRsZSB2 YWxpZGF0aW9uIC0gc29ycnkgOykKCQl9CgkJaWYgKCR2YWxpZF92YWx1ZSA8PiAkcHJlZi0+ dmFsdWUpIHsKCQkJaWYgKCR2YWxpZF92YWx1ZSA9PSAkcHJlZi0+ZGVmYXVsdF92YWx1ZSkg ewoJCQkJJHJlc3VsdCA9IHRydV90YWdzX2RlbGV0ZV9wcmVmKCRwcmVmLT5uYW1lKTsKCQkJ fSBlbHNlIHsKCQkJCSRyZXN1bHQgPSB0cnVfdGFnc191cHNlcnRfcHJlZigkcHJlZi0+bmFt ZSwgJHZhbGlkX3ZhbHVlKTsKCQkJfQoJCQlpZiAoJHJlc3VsdCkgewoJCQkJJHJlc3VsdHNb XSA9ICdVcGRhdGVkICcgLiAkcHJlZi0+bmFtZTsKCQkJCSRwcmVmLT52YWx1ZSA9ICR2YWxp ZF92YWx1ZTsKCQkJfSBlbHNlIHsKCQkJCSRyZXN1bHRzW10gPSAnRXJyb3IgdXBkYXRpbmcg JyAuICRwcmVmLT5uYW1lOwoJCQl9CgkJfQoJfQoJaWYgKGNvdW50KCRyZXN1bHRzKSA9PSAw KSB7CgkJcmV0dXJuICdObyByZWNvcmRzIG5lZWQgdXBkYXRpbmcnOwoJfSBlbHNlIHsKCQly ZXR1cm4gam9pbignPGJyPicsICRyZXN1bHRzKTsKCX0KfQoKCmZ1bmN0aW9uIHRydV90YWdz X3Vwc2VydF9wcmVmKCRuYW1lLCAkdmFsdWUpIHsKCWlmICghc2FmZV9xdWVyeSgnY3JlYXRl IHRhYmxlIGlmIG5vdCBleGlzdHMgJyAuIHNhZmVfcGZ4KCd0cnVfdGFnc19wcmVmcycpLgoJ CScgKG5hbWUgdmFyY2hhcigyNTUpIHByaW1hcnkga2V5LCAnLgoJCSd2YWx1ZSB2YXJjaGFy KDI1NSkgbm90IG51bGwpJykpIHsKCQlyZXR1cm4gJ1NlcmlvdXMgZXJyb3IgLSB1bmFibGUg dG8gY3JlYXRlIHRoZSAnIC4gc2FmZV9wZngoJ3RydV90YWdzX3ByZWZzJykgLiAnIHRhYmxl Lic7Cgl9CgoJcmV0dXJuIHNhZmVfdXBzZXJ0KCd0cnVfdGFnc19wcmVmcycsICd2YWx1ZT0i Jy4kdmFsdWUuJyInLCAnbmFtZT0iJy4kbmFtZS4nIicpOwp9CgoKZnVuY3Rpb24gdHJ1X3Rh Z3NfZGVsZXRlX3ByZWYoJG5hbWUpIHsKCWlmIChzYWZlX2RlbGV0ZSgndHJ1X3RhZ3NfcHJl ZnMnLCAnbmFtZT0iJy4kbmFtZS4nIicpKSB7CgkJaWYgKHNhZmVfY291bnQoJ3RydV90YWdz X3ByZWZzJywgJzEnKSA9PSAwICYmICFzYWZlX3F1ZXJ5KCdkcm9wIHRhYmxlICcgLiBzYWZl X3BmeCgndHJ1X3RhZ3NfcHJlZnMnKSkpIHsKCQkJcmV0dXJuIGZhbHNlOwoJCX0KCQlyZXR1 cm4gdHJ1ZTsKCX0gZWxzZSB7CgkJcmV0dXJuIGZhbHNlOwoJfQp9CgoKZnVuY3Rpb24gdHJ1 X3RhZ3NfYWRtaW5fZGVsZXRlX3RhZygkZGVsZXRldGFnKSB7CglpZiAodHJpbSgkZGVsZXRl dGFnKSkgewoJCXJldHVybiB0cnVfdGFnc19hZG1pbl9yZXBsYWNlX3RhZygkZGVsZXRldGFn LCAnJywgdHJ1ZSk7Cgl9IGVsc2UgewoJCXJldHVybiAnUGxlYXNlIGVudGVyIGEgdmFsdWUn OwoJfQp9CgoKZnVuY3Rpb24gdHJ1X3RhZ3NfYWRtaW5fcmVwbGFjZV90YWcoJG1hdGNodGFn LCAkcmVwbGFjZXRhZywgJGFsbG93X2JsYW5rX3JlcGxhY2V0YWcpIHsKCSRtYXRjaHRhZyA9 IHRyaW0oJG1hdGNodGFnKTsKCSRyZXBsYWNldGFnID0gdHJpbSgkcmVwbGFjZXRhZyk7Cglp ZiAoJG1hdGNodGFnICYmICgkYWxsb3dfYmxhbmtfcmVwbGFjZXRhZyB8fCAkcmVwbGFjZXRh ZykpIHsKCQlpZiAoc2FmZV91cGRhdGUoJ3RleHRwYXR0ZXJuJywgVFJVX1RBR1NfRklFTEQu Jz10cmltKGJvdGggXCcsXCcgZnJvbSByZXBsYWNlKGNvbmNhdCgiLCIsICcuVFJVX1RBR1Nf RklFTEQuJywgIiwiKSwgY29uY2F0KCIsIiwgXCcnLmFkZHNsYXNoZXMoJG1hdGNodGFnKS4n XCcsICIsIiksIFwnLCcuYWRkc2xhc2hlcygkcmVwbGFjZXRhZykuJyxcJykpJywgJzEnKSkg ewoJCQlyZXR1cm4gJ1VwZGF0ZWQgJy5teXNxbF9hZmZlY3RlZF9yb3dzKCkuJyByb3dzICgi Jy5odG1sc3BlY2lhbGNoYXJzKCRtYXRjaHRhZykuJyI9PiInLmh0bWxzcGVjaWFsY2hhcnMo JHJlcGxhY2V0YWcpLiciKSc7CgkJfSBlbHNlIHsKCQkJcmV0dXJuICdFcnJvcjogJyAuIG15 c3FsX2Vycm9yKCk7CgkJfQoJfSBlbHNlIHsKCQlyZXR1cm4gJ1BsZWFzZSBlbnRlciBhIHZh bHVlIGluIGJvdGggZmllbGRzJzsKCX0KfQoKCmZ1bmN0aW9uIHRydV90YWdzX2FkbWluX3Jl ZGlyZWN0X3RhZygkbGVmdHRhZywgJHJpZ2h0dGFnKSB7CgkkbGVmdHRhZyA9IGFkZHNsYXNo ZXModHJ1X3RhZ3Nfc3RydG9sb3dlcih0cmltKCRsZWZ0dGFnKSkpOwoJJHJpZ2h0dGFnID0g YWRkc2xhc2hlcyh0cnVfdGFnc19zdHJ0b2xvd2VyKHRyaW0oJHJpZ2h0dGFnKSkpOwoJaWYg KCEkbGVmdHRhZyB8fCAhJHJpZ2h0dGFnKSB7CgkJcmV0dXJuICdQbGVhc2UgZW50ZXIgYSB2 YWx1ZSBpbiBib3RoIGZpZWxkcyc7Cgl9CgoJaWYgKCFzYWZlX3F1ZXJ5KCdjcmVhdGUgdGFi bGUgaWYgbm90IGV4aXN0cyAnIC4gc2FmZV9wZngoJ3RydV90YWdzX3JlZGlyZWN0cycpLgoJ CScgKGxlZnR0YWcgdmFyY2hhcigyNTUpIHByaW1hcnkga2V5LCAnLgoJCSdyaWdodHRhZyB2 YXJjaGFyKDI1NSkgbm90IG51bGwpJykpIHsKCQlyZXR1cm4gJ1NlcmlvdXMgZXJyb3IgLSB1 bmFibGUgdG8gY3JlYXRlIHRoZSAnIC4gc2FmZV9wZngoJ3RydV90YWdzX3JlZGlyZWN0cycp IC4gJyB0YWJsZS4nOwoJfQoKCWlmIChzYWZlX2luc2VydCgndHJ1X3RhZ3NfcmVkaXJlY3Rz JywgJ2xlZnR0YWc9IicuJGxlZnR0YWcuJyIscmlnaHR0YWc9IicuJHJpZ2h0dGFnLiciJykp IHsKCQlyZXR1cm4gJ1JlZGlyZWN0IGFkZGVkICgiJy5odG1sc3BlY2lhbGNoYXJzKCRsZWZ0 dGFnKS4nIj0+IicuaHRtbHNwZWNpYWxjaGFycygkcmlnaHR0YWcpLiciKSAtIHBsZWFzZSB0 ZXN0IGl0ISc7Cgl9IGVsc2UgewoJCXJldHVybiAnRXJyb3IgYWRkaW5nIHJlY29yZCAtIGRv ZXMgaXQgYWxyZWFkeSBleGlzdD8nOwoJfQp9CgoKZnVuY3Rpb24gdHJ1X3RhZ3NfYWRtaW5f ZGVsZXRlX3JlZGlyZWN0KCRsZWZ0dGFnKSB7CglpZiAoc2FmZV9kZWxldGUoJ3RydV90YWdz X3JlZGlyZWN0cycsICdsZWZ0dGFnPSInLmFkZHNsYXNoZXMoJGxlZnR0YWcpLiciJykpIHsK CQlpZiAoc2FmZV9jb3VudCgndHJ1X3RhZ3NfcmVkaXJlY3RzJywgJzEnKSA9PSAwICYmICFz YWZlX3F1ZXJ5KCdkcm9wIHRhYmxlICcgLiBzYWZlX3BmeCgndHJ1X3RhZ3NfcmVkaXJlY3Rz JykpKSB7CgkJCXJldHVybiAnUmVkaXJlY3QgZGVsZXRlZCwgYnV0IHVuYWJsZSB0byBkcm9w IHRhYmxlICcgLiBzYWZlX3BmeCgndHJ1X3RhZ3NfcmVkaXJlY3RzJyk7CgkJfQoJCXJldHVy biAnUmVkaXJlY3QgZGVsZXRlZCAoIicuaHRtbHNwZWNpYWxjaGFycygkbGVmdHRhZykuJyIp JzsKCX0gZWxzZSB7CgkJcmV0dXJuICdFcnJvciBkZWxldGluZyByZWRpcmVjdCc7Cgl9Cn0K CgpmdW5jdGlvbiB0cnVfdGFnc19hZG1pbl93cml0ZV90YWJfaGFuZGxlcigkZXZlbnQsICRz dGVwKSB7CglnbG9iYWwgJHRydV90YWdzX3ByZWZzOwoJJGF0dHMgPSB0cnVfdGFnc19nZXRf c3RhbmRhcmRfY2xvdWRfYXR0cyhhcnJheSgpLCB0cnVlLCB0cnVlLCB0cnVlKTsKCSRjbG91 ZCA9IGFycmF5X3VuaXF1ZSh0cnVfdGFnc19jbG91ZF9xdWVyeSgkYXR0cykpOwoJbmF0Y2Fz ZXNvcnQoJGNsb3VkKTsKCgkkaWQgPSAoZW1wdHkoJEdMT0JBTFNbJ0lEJ10pID8gZ3BzKCdJ RCcpIDogJEdMT0JBTFNbJ0lEJ10pOwoJJGFydGljbGVfdGFncyA9IChlbXB0eSgkaWQpID8g YXJyYXkoKSA6IHRydV90YWdzX2dldF90YWdzX2Zvcl9hcnRpY2xlKCRpZCkpOwoKCSRsaW5r cyA9IGFycmF5KCk7CgkkcmF3X2Nsb3VkID0gJyc7Cglmb3JlYWNoICgkY2xvdWQgYXMgJHRh ZykgewoJCSRzdHlsZSA9IChpbl9hcnJheSgkdGFnLCAkYXJ0aWNsZV90YWdzKSA/ICcgY2xh c3M9InRhZ19jaG9zZW4iJyA6ICcnKTsKCQkkbGlua3NbXSA9ICc8YSBocmVmPSIjYWR2YW5j ZWQiJy4kc3R5bGUuJyBvbmNsaWNrPSJ0b2dnbGVDbGFzcyh0aGlzLCB0b2dnbGVUYWcoXFxc JycuYWRkc2xhc2hlcyhhZGRzbGFzaGVzKGh0bWxzcGVjaWFsY2hhcnMoJHRhZykpKS4nXFxc JykpOyByZXR1cm4gZmFsc2U7Ij4nIC4gYWRkc2xhc2hlcyhodG1sc3BlY2lhbGNoYXJzKCR0 YWcpKSAuICc8XC9hPic7CgkJJHJhd19jbG91ZCAuPSAnIicgLiBhZGRTbGFzaGVzKCR0YWcp IC4gJyIsJzsKCX0KCSRyYXdfY2xvdWQgPSBzdWJzdHIoJHJhd19jbG91ZCwgMCwgc3RybGVu KCRyYXdfY2xvdWQpIC0gMSk7CgkkdG9faW5zZXJ0ID0gam9pbignLCAnLCAkbGlua3MpOwoK CWlmICgkdHJ1X3RhZ3NfcHJlZnNbVEFHU19JTl9XUklURV9UQUJdLT52YWx1ZSkgewoJCSRq cyA9IDw8PEVPRgoJCQl2YXIga2V5d29yZHNGaWVsZCA9IGRvY3VtZW50LmdldEVsZW1lbnRC eUlkKCdrZXl3b3JkcycpOwoJCQlrZXl3b3Jkc0ZpZWxkLnBhcmVudE5vZGUuYXBwZW5kQ2hp bGQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYnInKSk7CgkJCXZhciBjbG91ZCA9IGRvY3Vt ZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTsKCQkJa2V5d29yZHNGaWVsZC5wYXJlbnROb2Rl LmFwcGVuZENoaWxkKGNsb3VkKTsKCQkJY2xvdWQuc2V0QXR0cmlidXRlKCdjbGFzcycsICd0 cnVfdGFnc19hZG1pbl90YWdzJyk7CgkJCWNsb3VkLmlubmVySFRNTCA9ICd7JHRvX2luc2Vy dH0nOwoKCQkJdmFyIHN0eWxlRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3N0 eWxlJyk7CgkJCXN0eWxlRWxlbWVudC5zZXRBdHRyaWJ1dGUoInR5cGUiLCAidGV4dC9jc3Mi KTsKCQkJdmFyIHN0eWxlVGV4dCA9ICdhLnRhZ19jaG9zZW57YmFja2dyb3VuZC1jb2xvcjog I0ZFQjsgY29sb3I6IGJsYWNrO30nOwoJCQlpZiAoc3R5bGVFbGVtZW50LnN0eWxlU2hlZXQp IHsgLy9JRQoJCQkJc3R5bGVFbGVtZW50LnN0eWxlU2hlZXQuY3NzVGV4dCA9IHN0eWxlVGV4 dDsKCQkJfSBlbHNlIHsKCQkJCXZhciB0ZXh0Tm9kZSA9IGRvY3VtZW50LmNyZWF0ZVRleHRO b2RlKHN0eWxlVGV4dCk7CgkJCQlzdHlsZUVsZW1lbnQuYXBwZW5kQ2hpbGQodGV4dE5vZGUp OwoJCQl9CgkJCXZhciBoZWFkRWxlbWVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdO YW1lKCdoZWFkJylbMF07CgkJCWhlYWRFbGVtZW50LmFwcGVuZENoaWxkKHN0eWxlRWxlbWVu dCk7CgoJCQlmdW5jdGlvbiB0b2dnbGVUYWcodGFnTmFtZSkgewoJCQkJdmFyIHJlZ2V4VGFn ID0gdGFnTmFtZS5yZXBsYWNlKC8oW1xcXFxcXlxcJCorW1xcXT97fS49IToofCldKS9nLCJc XFxcJDEiKTsKCQkJCXZhciB0YWdSZWdleCA9IG5ldyBSZWdFeHAoIigoXnwsKVxcXHMqKSIg KyByZWdleFRhZyArICJcXFxzKigsXFxccyp8JCkiKTsKCQkJCXZhciB0ZXh0YXJlYSA9IGRv Y3VtZW50LmdldEVsZW1lbnRCeUlkKCdrZXl3b3JkcycpOwoJCQkJdmFyIGN1cnZhbCA9IHRl eHRhcmVhLnZhbHVlLnJlcGxhY2UoLyw/XHMrJC8sICcnKTsKCQkJCWlmICgnJyA9PSBjdXJ2 YWwpIHsKCQkJCQl0ZXh0YXJlYS52YWx1ZSA9IHRhZ05hbWU7CgkJCQl9IGVsc2UgaWYgKGN1 cnZhbC5tYXRjaCh0YWdSZWdleCkpIHsKCQkJCQl0ZXh0YXJlYS52YWx1ZSA9IGN1cnZhbC5y ZXBsYWNlKHRhZ1JlZ2V4LCAnJDEnKS5yZXBsYWNlKC8sP1xzKyQvLCAnJyk7CgkJCQkJcmV0 dXJuICcnOwoJCQkJfSBlbHNlIGlmICgnLCcgPT0gY3VydmFsLmNoYXJBdChjdXJ2YWwubGVu Z3RoIC0gMSkpIHsKCQkJCQl0ZXh0YXJlYS52YWx1ZSArPSAnICcgKyB0YWdOYW1lOwoJCQkJ fSBlbHNlIHsKCQkJCQl0ZXh0YXJlYS52YWx1ZSArPSAnLCAnICsgdGFnTmFtZTsKCQkJCX0K CQkJCXJldHVybiAndGFnX2Nob3Nlbic7CgkJCX0KCgkJCWZ1bmN0aW9uIHRvZ2dsZUNsYXNz KGVsZW1lbnQsIGNsYXNzTmFtZSkgewoJCQkJZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2NsYXNz JywgY2xhc3NOYW1lKTsKCQkJCWVsZW1lbnQuc2V0QXR0cmlidXRlKCdjbGFzc05hbWUnLCBj bGFzc05hbWUpOyAvKiBmb3IgSUUgKi8KCQkJfQpFT0Y7CgkJZWNobyBzY3JpcHRfanMoJGpz KTsKCX0KCglpZiAoJHRydV90YWdzX3ByZWZzW0FVVE9DT01QTEVURV9JTl9XUklURV9UQUJd LT52YWx1ZSkgewoJCWVjaG8gPDw8RU9GCgkJCTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlw ZT0idGV4dC9jc3MiIGhyZWY9Ii4uL2pzL2pxdWVyeS5hdXRvY29tcGxldGUuY3NzIiBtZWRp YT0icHJvamVjdGlvbiwgc2NyZWVuIiAvPgoJCQk8c2NyaXB0IHNyYz0iLi4vanMvanF1ZXJ5 LmF1dG9jb21wbGV0ZS5taW4uanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCI+PC9zY3JpcHQ+ CgkJCTxzY3JpcHQgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiIHR5cGU9InRleHQvamF2YXNjcmlw dCI+PCEtLQoJCQkJJChkb2N1bWVudCkucmVhZHkoZnVuY3Rpb24oKXsgdmFyIHRhZ3MgPSBu ZXcgQXJyYXkoeyRyYXdfY2xvdWR9KTsKCQkJCQkkKCIja2V5d29yZHMiKS5hdXRvY29tcGxl dGUodGFncywgeyBtdWx0aXBsZTogdHJ1ZSwgbXVzdE1hdGNoOiBmYWxzZSwgYXV0b0ZpbGw6 IGZhbHNlIH0pOwoJCQkJfSk7CgkJCS8vLS0+PC9zY3JpcHQ+CkVPRjsKCX0KCn0KCgojIyMg QVRPTS9SU1MgRkVFRCBGVU5DVElPTlMgIyMjCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj IyMjIyMKCnJlZ2lzdGVyX2NhbGxiYWNrKCd0cnVfdGFnc19hdG9tX2hhbmRsZXInLCAnYXRv bV9lbnRyeScpOwpmdW5jdGlvbiB0cnVfdGFnc19hdG9tX2hhbmRsZXIoJGV2ZW50LCAkc3Rl cCkgeyByZXR1cm4gdHJ1X3RhZ3NfZmVlZF9oYW5kbGVyKHRydWUpOyB9CnJlZ2lzdGVyX2Nh bGxiYWNrKCd0cnVfdGFnc19yc3NfaGFuZGxlcicsICdyc3NfZW50cnknKTsKZnVuY3Rpb24g dHJ1X3RhZ3NfcnNzX2hhbmRsZXIoJGV2ZW50LCAkc3RlcCkgeyByZXR1cm4gdHJ1X3RhZ3Nf ZmVlZF9oYW5kbGVyKGZhbHNlKTsgfQoKZnVuY3Rpb24gdHJ1X3RhZ3NfZmVlZF9oYW5kbGVy KCRhdG9tKSB7CglnbG9iYWwgJHRoaXNhcnRpY2xlLCAkdHJ1X3RhZ3NfcHJlZnM7CglleHRy YWN0KCR0aGlzYXJ0aWNsZSk7CgoJJHRhZ3MgPSB0cnVfdGFnc19nZXRfdGFnc19mb3JfYXJ0 aWNsZSgkdGhpc2lkKTsKCglpZiAoJHRydV90YWdzX3ByZWZzW1RBR1NfSU5fRkVFRF9CT0RZ XS0+dmFsdWUpIHsKCQkkZXh0cmFib2R5ID0gJyc7CgkJJEZPUk1fTkFNRSA9ICd0cnVfdGFn c19mZWVkX3RhZ3MnOwoJCWlmIChmZXRjaCgnZm9ybScsICd0eHBfZm9ybScsICduYW1lJywg JEZPUk1fTkFNRSkpIHsKCQkJJGZvcm0gPSBmZXRjaF9mb3JtKCRGT1JNX05BTUUpOwoJCQkk ZXh0cmFib2R5ID0gdHJpbShwYXJzZSgkZm9ybSkpOwoJCX0gZWxzZSB7CgkJCSRhdHRzID0g dHJ1X3RhZ3NfZ2V0X3N0YW5kYXJkX2Nsb3VkX2F0dHMoYXJyYXkoKSwgZmFsc2UsIHRydWUp OwoJCQkkZXh0cmFib2R5ID0gJzxwPnRhZ3M6ICcgLiB0cnVfdGFnc19yZW5kZXJfY2xvdWQo JGF0dHMsICR0YWdzLCAkdGFncykgLiAnPC9wPic7CgkJfQoJCWdsb2JhbCAkdGhpc2FydGlj bGU7CgkJaWYgKHRyaW0oJHRoaXNhcnRpY2xlWydleGNlcnB0J10pKSB7CgkJCSR0aGlzYXJ0 aWNsZVsnZXhjZXJwdCddID0gdHJpbSgkdGhpc2FydGljbGVbJ2V4Y2VycHQnXSkubi4kZXh0 cmFib2R5Lm47CgkJfQoJCSR0aGlzYXJ0aWNsZVsnYm9keSddID0gdHJpbSgkdGhpc2FydGlj bGVbJ2JvZHknXSkubi4kZXh0cmFib2R5Lm47Cgl9CgoJaWYgKCR0cnVfdGFnc19wcmVmc1tU QUdTX0lOX0ZFRURfQ0FURUdPUklFU10tPnZhbHVlKSB7CgkJJG91dHB1dCA9IGFycmF5KCk7 CgkJZm9yZWFjaCAoJHRhZ3MgYXMgJHRhZykgewoJCQlpZiAoJGF0b20pIHsKCQkJCSRvdXRw dXRbXSA9ICc8Y2F0ZWdvcnkgdGVybT0iJyAuIGh0bWxzcGVjaWFsY2hhcnMoJHRhZykgLiAn IiAvPic7CgkJCX0gZWxzZSB7CgkJCQkkb3V0cHV0W10gPSAnPGNhdGVnb3J5PicgLiBodG1s c3BlY2lhbGNoYXJzKCR0YWcpIC4gJzwvY2F0ZWdvcnk+JzsKCQkJfQoJCX0KCQlyZXR1cm4g bi5qb2luKG4sICRvdXRwdXQpLm47Cgl9Cn0KCgojIyMgUFJFRlMgRlVOQ1RJT05TIC8gQ0xB U1NFUyAjIyMKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgpjbGFzcyB0cnVf dGFnc19wcmVmIHsKCWZ1bmN0aW9uIHRydV90YWdzX3ByZWYoJG5hbWUsICRkZWZhdWx0X3Zh bHVlLCAkdHlwZSkgewoJCSR0aGlzLT5uYW1lID0gJG5hbWU7CgkJJHRoaXMtPnZhbHVlID0g JGRlZmF1bHRfdmFsdWU7CgkJJHRoaXMtPmRlZmF1bHRfdmFsdWUgPSAkZGVmYXVsdF92YWx1 ZTsKCQkkdGhpcy0+dHlwZSA9ICR0eXBlOwoJfQoKCWZ1bmN0aW9uIHZhbGlkYXRlX3ZhbHVl KCR2YWx1ZSkgewoJCWlmICgkdmFsdWUpIHsKCQkJcmV0dXJuICR2YWx1ZTsKCQl9IGVsc2Ug aWYgKCR0aGlzLT50eXBlID09ICdib29sZWFuJykgewoJCQlyZXR1cm4gJzAnOwoJCX0gZWxz ZSB7CgkJCXJldHVybiAnUGxlYXNlIGVudGVyIGEgdmFsdWUgZm9yICcgLiAkdGhpcy0+bmFt ZTsKCQl9Cgl9Cn0KCmZ1bmN0aW9uIHRydV90YWdzX2xvYWRfcHJlZnMoKSB7CgkkcHJlZnMg PSBhcnJheSgpOwoKCWdsb2JhbCAkcGVybWxpbmtfbW9kZTsKCSRwcmVmc1tDTEVBTl9VUkxT XSA9IG5ldyB0cnVfdGFnc19wcmVmKENMRUFOX1VSTFMsICgkcGVybWxpbmtfbW9kZSAhPSAn bWVzc3knID8gJ2NsZWFuJyA6ICdtZXNzeScpLCAnc3RyaW5nJyk7CgkkcHJlZnNbVEFHX1NF Q1RJT05dID0gbmV3IHRydV90YWdzX3ByZWYoVEFHX1NFQ1RJT04sICd0YWcnLCAnc3RyaW5n Jyk7CgkkcHJlZnNbUEFSTV9OQU1FXSA9IG5ldyB0cnVfdGFnc19wcmVmKFBBUk1fTkFNRSwg J3QnLCAnc3RyaW5nJyk7CgkkcHJlZnNbVEFHU19JTl9GRUVEX0NBVEVHT1JJRVNdID0gbmV3 IHRydV90YWdzX3ByZWYoVEFHU19JTl9GRUVEX0NBVEVHT1JJRVMsICcxJywgJ2Jvb2xlYW4n KTsKCSRwcmVmc1tUQUdTX0lOX0ZFRURfQk9EWV0gPSBuZXcgdHJ1X3RhZ3NfcHJlZihUQUdT X0lOX0ZFRURfQk9EWSwgJzAnLCAnYm9vbGVhbicpOwoJJHByZWZzW1RBR1NfSU5fV1JJVEVf VEFCXSA9IG5ldyB0cnVfdGFnc19wcmVmKFRBR1NfSU5fV1JJVEVfVEFCLCAnMScsICdib29s ZWFuJyk7CgkkcHJlZnNbQVVUT0NPTVBMRVRFX0lOX1dSSVRFX1RBQl0gPSBuZXcgdHJ1X3Rh Z3NfcHJlZihBVVRPQ09NUExFVEVfSU5fV1JJVEVfVEFCLCAnMCcsICdib29sZWFuJyk7Cgkk cHJlZnNbVVRGXzhfQ0FTRV0gPSBuZXcgdHJ1X3RhZ3NfcHJlZihVVEZfOF9DQVNFLCAnMScs ICdib29sZWFuJyk7CgoJaWYgKG15c3FsX3F1ZXJ5KCJkZXNjcmliZSAiIC4gUEZYIC4gInRy dV90YWdzX3ByZWZzIikpIHsKCQkkcnMgPSBzYWZlX3Jvd3MoJyonLCAndHJ1X3RhZ3NfcHJl ZnMnLCAnMScpOwoJCWZvcmVhY2ggKCRycyBhcyAkcm93KSB7CgkJCSRwcmVmc1skcm93Wydu YW1lJ11dLT52YWx1ZSA9ICRyb3dbJ3ZhbHVlJ107CgkJfQoJfQoKCXJldHVybiAkcHJlZnM7 Cn0KCgojIyMgT1RIRVIgU1VQUE9SVCBGVU5DVElPTlMgIyMjCiMjIyMjIyMjIyMjIyMjIyMj IyMjIyMjIyMjIyMjIyMKCmZ1bmN0aW9uIHRydV90YWdzX3JlZGlyZWN0X2lmX25lZWRlZCgk dGFnX3BhcmFtZXRlcikgewoJJHJlZGlyZWN0cyA9IHRydV90YWdzX2xvYWRfcmVkaXJlY3Rz KCk7Cglmb3JlYWNoICgkcmVkaXJlY3RzIGFzICRsZWZ0dGFnID0+ICRyaWdodHRhZykgewoJ CWlmICgkbGVmdHRhZyA9PSAkdGFnX3BhcmFtZXRlciB8fCAkbGVmdHRhZyA9PSBzdHJfcmVw bGFjZSgnLScsICcgJywgJHRhZ19wYXJhbWV0ZXIpKSB7CgkJCXRydV90YWdzX3JlZGlyZWN0 KCRyaWdodHRhZywgZmFsc2UpOwoJCQlyZXR1cm4gdHJ1ZTsKCQl9Cgl9CgoJcmV0dXJuIGZh bHNlOwp9CgoKZnVuY3Rpb24gdHJ1X3RhZ3NfbG9hZF9yZWRpcmVjdHMoKSB7CgkkcmVkaXJl Y3RzID0gYXJyYXkoKTsKCWlmIChteXNxbF9xdWVyeSgiZGVzY3JpYmUgIiAuIFBGWCAuICJ0 cnVfdGFnc19yZWRpcmVjdHMiKSkgewoJCSRycyA9IHNhZmVfcm93cygnKicsICd0cnVfdGFn c19yZWRpcmVjdHMnLCAnMSBvcmRlciBieSBsZWZ0dGFnJyk7CgkJZm9yZWFjaCAoJHJzIGFz ICRyb3cpIHsKCQkJJHJlZGlyZWN0c1skcm93WydsZWZ0dGFnJ11dID0gJHJvd1sncmlnaHR0 YWcnXTsKCQl9Cgl9CglyZXR1cm4gJHJlZGlyZWN0czsKfQoKCmZ1bmN0aW9uIHRydV90YWdz X3JlZGlyZWN0KCRkZXN0aW5hdGlvbiwgJGlzX2Z1bGxfdXJsKSB7CglnbG9iYWwgJHRydV90 YWdzX3ByZWZzOwoJaWYgKCRpc19mdWxsX3VybCkgewoJCSR1cmwgPSAkZGVzdGluYXRpb247 CgkJJG1lc3NhZ2UgPSAnVGhlIHJlc291cmNlIHlvdSByZXF1ZXN0ZWQgaGFzIG1vdmVkIHRv ICcgLiAkZGVzdGluYXRpb247Cgl9IGVsc2UgewoJCSR1cmwgPSB0cnVfdGFnc19saW5raWZ5 X3RhZygkZGVzdGluYXRpb24sIGZhbHNlKTsKCQkkbWVzc2FnZSA9ICdUaGUgcmVxdWVzdGVk IHRhZyBoYXMgYmVlbiByZXBsYWNlZCBieSAnIC4gJGRlc3RpbmF0aW9uOwoJfQoKCWhlYWRl cignTG9jYXRpb246ICcgLiAkdXJsKTsKCXR4cF9kaWUoJG1lc3NhZ2UsICczMDEnKTsKfQoK CmZ1bmN0aW9uIHRydV90YWdzX2xpbmtpZnlfdGFnKCR0YWcsICR1c2VfYW1wID0gdHJ1ZSkg ewoJZ2xvYmFsICR0cnVfdGFnc19wcmVmczsKCWlmICh0cnVfdGFnc19jbGVhbl91cmxzKCkp IHsKCQkkdXJscHJlZml4ID0gaHUgLiAkdHJ1X3RhZ3NfcHJlZnNbVEFHX1NFQ1RJT05dLT52 YWx1ZSAuICcvJzsKCX0gZWxzZSB7CgkJJHVybHByZWZpeCA9IGh1IC4gJz9zPScgLiAkdHJ1 X3RhZ3NfcHJlZnNbVEFHX1NFQ1RJT05dLT52YWx1ZSAuICgkdXNlX2FtcCA/ICcmYW1wOycg OiAnJicpIC4gJHRydV90YWdzX3ByZWZzW1BBUk1fTkFNRV0tPnZhbHVlIC4gJz0nOwoJfQoJ JHVybHN1ZmZpeCA9ICh0cnVfdGFnc19jbGVhbl91cmxzKCkgPyAnLycgOiAnJyk7CglyZXR1 cm4gJHVybHByZWZpeCAuIHVybGVuY29kZSgkdGFnKSAuICR1cmxzdWZmaXg7Cn0KCgpmdW5j dGlvbiB0cnVfdGFnc19nZXRfdGFnc19mb3JfYXJ0aWNsZSgkYXJ0aWNsZUlEKSB7CglnbG9i YWwgJHRoaXNhcnRpY2xlLCAkdHJ1X3RhZ3NfcHJlZnM7CglpZiAoaXNzZXQoJHRoaXNhcnRp Y2xlKSkgewoJCWV4dHJhY3QoJHRoaXNhcnRpY2xlKTsKCX0KCSRrZXl3b3JkcyA9ICcnOwoJ aWYgKGlzc2V0KCR0aGlzaWQpICYmICR0aGlzaWQgPT0gJGFydGljbGVJRCkgewoJCWlmIChp c3NldCgkdGhpc2FydGljbGVbJ2tleXdvcmRzJ10pKSB7CgkJCSRrZXl3b3JkcyA9ICR0aGlz YXJ0aWNsZVsna2V5d29yZHMnXTsKCQl9Cgl9IGVsc2UgewoJCSR0YWdzX2ZpZWxkID0gVFJV X1RBR1NfRklFTEQ7CgkJJHJzID0gc2FmZV9yb3coJHRhZ3NfZmllbGQsICJ0ZXh0cGF0dGVy biIsICJJRD0nJGFydGljbGVJRCcgQU5EICR0YWdzX2ZpZWxkIDw+ICcnIik7CgkJaWYgKGlz c2V0KCRyc1skdGFnc19maWVsZF0pKSB7CgkJCSRrZXl3b3JkcyA9ICRyc1skdGFnc19maWVs ZF07CgkJfQoJfQoJJGFsbF90YWdzID0gYXJyYXkoKTsKCSRhbGxfdGFncyA9IGV4cGxvZGUo IiwiLCB0cmltKHRydV90YWdzX3N0cnRvbG93ZXIoJGtleXdvcmRzKSkpOwoKCXJldHVybiB0 cnVfdGFnc190cmltX3RhZ3MoJGFsbF90YWdzKTsKfQoKCiMgZml4ZXMgYnVnIHdpdGggNC4w LjQncyB2ZXJzaW9uIG9mIGRvV3JhcCB0aGF0IGNhdXNlZCBzcGFjZXMgdG8gc2hvdyB1cCBi ZWZvcmUgdGhlIGNvbW1hcwpmdW5jdGlvbiB0cnVfdGFnc19kb193cmFwKCRsaXN0LCAkd3Jh cHRhZywgJGJyZWFrLCAkY2xhc3MsICRicmVha2NsYXNzKSB7CglpZiAoISR3cmFwdGFnICYm ICFwcmVnX21hdGNoKCcvXlx3KyQvJywgJGJyZWFrKSkgewoJCXJldHVybiBqb2luKCRicmVh ay5uLCAkbGlzdCk7Cgl9IGVsc2UgewoJCXJldHVybiBkb1dyYXAoJGxpc3QsICR3cmFwdGFn LCAkYnJlYWssICRjbGFzcywgJGJyZWFrY2xhc3MpOwoJfQp9CgoKZnVuY3Rpb24gdHJ1X3Rh Z3NfdHJpbV90YWdzKCR0YWdfYXJyYXkpIHsKCSR0cmltbWVkID0gYXJyYXkoKTsKCWZvcmVh Y2ggKCR0YWdfYXJyYXkgYXMgJHRhZykgewoJCWlmICgiIiAhPSB0cmltKCR0YWcpKSB7CgkJ CSR0cmltbWVkW10gPSB0cmltKCR0YWcpOwoJCX0KCX0KCXJldHVybiAkdHJpbW1lZDsKfQoK CmZ1bmN0aW9uIHRydV90YWdzX2ZpeHVwX3F1ZXJ5X2F0dHMoJGF0dHMsICR0YWdfcGFyYW1l dGVyKSB7Cgkka2V5d29yZHMgPSBleHBsb2RlKCcsJywgJHRhZ19wYXJhbWV0ZXIpOwoJZm9y ZWFjaCAoJGtleXdvcmRzIGFzICRrZXl3b3JkKSB7CgkJaWYgKHN0cnBvcygka2V5d29yZCwg Jy0nKSAhPT0gZmFsc2UpIHsKCQkJJGtleXdvcmRzW10gPSBzdHJfcmVwbGFjZSgnLScsICcg JywgJGtleXdvcmQpOwoJCX0KCX0KCSRhdHRzWydrZXl3b3JkcyddID0gaW1wbG9kZSgnLCcs ICRrZXl3b3Jkcyk7CgoJaWYgKGlzc2V0KCRhdHRzWydzZWN0aW9uJ10pICYmIHN0cnBvcygk YXR0c1snc2VjdGlvbiddLCAnLCcpICE9PSBmYWxzZSkgewoJCSRhdHRzWydzZWN0aW9uJ10g PSAnJzsKCX0KCglpZiAoaXNzZXQoJGF0dHNbJ2V4Y2x1ZGVzZWN0aW9uJ10pKSB7CgkJdW5z ZXQoJGF0dHNbJ2V4Y2x1ZGVzZWN0aW9uJ10pOwoJfQoKCWlmIChpc3NldCgkYXR0c1snbm9h cnRpY2xlcyddKSkgewoJCXVuc2V0KCRhdHRzWydub2FydGljbGVzJ10pOwoJfQoKCWlmICgh aXNzZXQoJGF0dHNbJ2xpbWl0J10pKSB7CgkJJGF0dHNbJ2xpbWl0J10gPSAnMTAwMCc7Cgl9 CgoJaWYgKCFpc3NldCgkYXR0c1snYWxsb3dvdmVycmlkZSddKSkgewoJCSRhdHRzWydhbGxv d292ZXJyaWRlJ10gPSB0cnVlOwoJfQoKCWlmIChpc3NldCgkYXR0c1snc2VhcmNoZm9ybSdd KSAmJiAhaXNzZXQoJGF0dHNbJ2xpc3Rmb3JtJ10pKSB7CgkJJGF0dHNbJ2xpc3Rmb3JtJ10g PSAkYXR0c1snc2VhcmNoZm9ybSddOwoJfQoKCWlmIChpc3NldCgkYXR0c1snc2hvd2NvdW50 cyddKSkgewoJCXVuc2V0KCRhdHRzWydzaG93Y291bnRzJ10pOwoJfQoKCWlmIChpc3NldCgk YXR0c1snNDA0cmVkaXJlY3QnXSkpIHsKCQl1bnNldCgkYXR0c1snNDA0cmVkaXJlY3QnXSk7 Cgl9CgoJcmV0dXJuICRhdHRzOwp9CgoKZnVuY3Rpb24gdHJ1X3RhZ3Nfc3RydG9sb3dlcigk c3RyKSB7CglnbG9iYWwgJHRydV90YWdzX3ByZWZzOwoJaWYgKCR0cnVfdGFnc19wcmVmc1tV VEZfOF9DQVNFXS0+dmFsdWUpIHsKCQlpZiAoZnVuY3Rpb25fZXhpc3RzKCdtYl9zdHJ0b2xv d2VyJykpIHsKCQkJcmV0dXJuIG1iX3N0cnRvbG93ZXIoJHN0ciwgRU5DT0RJTkcpOwoJCX0g ZWxzZSB7CgkJCXJldHVybiBzdHJ0b2xvd2VyKCRzdHIpOwoJCX0KCX0gZWxzZSB7CgkJcmV0 dXJuICRzdHI7Cgl9Cn0KCmZ1bmN0aW9uIHRydV90YWdzX3N0cnRvdXBwZXIoJHN0cikgewoJ aWYgKGZ1bmN0aW9uX2V4aXN0cygnbWJfc3RydG91cHBlcicpKSB7CgkJcmV0dXJuIG1iX3N0 cnRvdXBwZXIoJHN0ciwgRU5DT0RJTkcpOwoJfSBlbHNlIHsKCQlyZXR1cm4gc3RydG91cHBl cigkc3RyKTsKCX0KfQoKZnVuY3Rpb24gdHJ1X3RhZ3NfdWNmaXJzdCgkc3RyKSB7CglpZiAo ZnVuY3Rpb25fZXhpc3RzKCdtYl9zdWJzdHInKSAmJiBmdW5jdGlvbl9leGlzdHMoJ21iX3N0 cnRvdXBwZXInKSAmJiBmdW5jdGlvbl9leGlzdHMoJ21iX3N0cmxlbicpICYmIG1iX3N0cmxl bigkc3RyLCBFTkNPRElORykgPiAxKSB7CgkJcmV0dXJuIG1iX3N0cnRvdXBwZXIobWJfc3Vi c3RyKCRzdHIsIDAsIDEsIEVOQ09ESU5HKSwgRU5DT0RJTkcpIC4gbWJfc3Vic3RyKCRzdHIs IDEsIG1iX3N0cmxlbigkc3RyLCBFTkNPRElORyksIEVOQ09ESU5HKTsKCX0gZWxzZSB7CgkJ cmV0dXJuIHVjZmlyc3QoJHN0cik7Cgl9Cn0KCmZ1bmN0aW9uIHRydV90YWdzX3Vjd29yZHMo JHN0cikgewoJaWYgKGZ1bmN0aW9uX2V4aXN0cygnbWJfY29udmVydF9jYXNlJykpIHsKCQly ZXR1cm4gbWJfY29udmVydF9jYXNlKCRzdHIsIE1CX0NBU0VfVElUTEUsIEVOQ09ESU5HKTsK CX0gZWxzZSB7CgkJcmV0dXJuIHVjd29yZHMoJHN0cik7Cgl9Cn0KCgovL3RoZXNlIG5leHQg dHdvIGZ1bmN0aW9ucyBhcmUgZ3Jvc3MsIGJ1dCBJIGNhbid0IGZpZ3VyZSBvdXQgYW5vdGhl ciB3YXkgdG8gZG8gaXQKZnVuY3Rpb24gdHJ1X3RhZ3Nfc29ydF90YWdzKCR0YWdzX3dlaWdo dCwgJHNvcnRfYnlfY291bnQsICRzb3J0X2FzY2VuZGluZykgewoJZ2xvYmFsICR0cnVfdGFn c190YWdzX3dlaWdodCwgJHRydV90YWdzX3NvcnRfYXNjZW5kaW5nOwoKCSR0cnVfdGFnc190 YWdzX3dlaWdodCA9ICR0YWdzX3dlaWdodDsKCSR0cnVfdGFnc19zb3J0X2FzY2VuZGluZyA9 ICRzb3J0X2FzY2VuZGluZzsKCgkkdGVtcF9hcnJheSA9IGFycmF5X2tleXMoJHRhZ3Nfd2Vp Z2h0KTsKCWlmICgkc29ydF9ieV9jb3VudCkgewoJCXVzb3J0KCR0ZW1wX2FycmF5LCAidHJ1 X3RhZ3Nfc29ydF90YWdzX2NvbXBhcmF0b3IiKTsKCX0gZWxzZSB7CgkJbmF0Y2FzZXNvcnQo JHRlbXBfYXJyYXkpOwoJCSR0ZW1wX2FycmF5ID0gYXJyYXlfdmFsdWVzKCR0ZW1wX2FycmF5 KTsKCX0KCgkkc29ydGVkX2FycmF5ID0gYXJyYXkoKTsKCWZvcmVhY2ggKCR0ZW1wX2FycmF5 IGFzICR0YWcpIHsKCQkkc29ydGVkX2FycmF5WyR0YWddID0gJHRhZ3Nfd2VpZ2h0WyR0YWdd OwoJfQoKCXJldHVybiAkc29ydGVkX2FycmF5Owp9CgoKZnVuY3Rpb24gdHJ1X3RhZ3Nfc29y dF90YWdzX2NvbXBhcmF0b3IoJGxlZnQsICRyaWdodCkgewoJZ2xvYmFsICR0cnVfdGFnc190 YWdzX3dlaWdodCwgJHRydV90YWdzX3NvcnRfYXNjZW5kaW5nOwoKCSRsZWZ0X3dlaWdodCA9 ICR0cnVfdGFnc190YWdzX3dlaWdodFskbGVmdF07CgkkcmlnaHRfd2VpZ2h0ID0gJHRydV90 YWdzX3RhZ3Nfd2VpZ2h0WyRyaWdodF07CglpZiAoJGxlZnRfd2VpZ2h0ID09ICRyaWdodF93 ZWlnaHQpIHsKCQkkdGVtcF9hcnJheSA9IGFycmF5KCRsZWZ0LCAkcmlnaHQpOwoJCW5hdGNh c2Vzb3J0KCR0ZW1wX2FycmF5KTsKCQkkdGVtcF9hcnJheSA9IGFycmF5X3ZhbHVlcygkdGVt cF9hcnJheSk7CgkJcmV0dXJuICgkdGVtcF9hcnJheVswXSA9PSAkbGVmdCA/IC0xIDogMSk7 Cgl9IGVsc2UgaWYgKCR0cnVfdGFnc19zb3J0X2FzY2VuZGluZykgewoJCXJldHVybiAkbGVm dF93ZWlnaHQgLSAkcmlnaHRfd2VpZ2h0OwoJfSBlbHNlIHsKCQlyZXR1cm4gJHJpZ2h0X3dl aWdodCAtICRsZWZ0X3dlaWdodDsKCX0KfQoKCgojIyMgQkFTVEFSRCBGVU5DVElPTlMgVEhB VCBTSE9VTEROJ1QgSEFWRSBUTyBFWElTVCAjIyMKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgoKZnVuY3Rpb24gdHJ1X3RhZ3NfcmVk b19hcnRpY2xlX3NlYXJjaCgkYXR0cykgewoJJHRoZUF0dHMgPSBsQXR0cyhhcnJheSgnbGlt aXQnICAgICA9PiAxMDAwLAoJCQkJJ2NhdGVnb3J5JyAgPT4gJycsCgkJCQknc2VjdGlvbicg ICA9PiAnJywKCQkJCSdleGNlcnB0ZWQnID0+ICcnLAoJCQkJJ2F1dGhvcicgICAgPT4gJycs CgkJCQknc29ydGJ5JyAgICA9PiAnUG9zdGVkJywKCQkJCSdzb3J0ZGlyJyAgID0+ICdkZXNj JywKCQkJCSdtb250aCcgICAgID0+ICcnLAoJCQkJJ2tleXdvcmRzJyAgPT4gJycsCgkJCQkn ZnJvbnRwYWdlJyA9PiAnJywKCQkJCSdpZCcgICAgICAgID0+ICcnLAoJCQkJJ3RpbWUnICAg ICAgPT4gJ3Bhc3QnLAoJCQkJJ3N0YXR1cycgICAgPT4gJzQnLAoJCQkJJ29mZnNldCcgICAg PT4gMAoJCQkpLCRhdHRzLCAwKTsKCWV4dHJhY3QoJHRoZUF0dHMpOwoKCS8vQnVpbGRpbmcg cXVlcnkgcGFydHMKCSRmcm9udHBhZ2UgPSAoJGZyb250cGFnZSkgPyBmaWx0ZXJGcm9udFBh Z2UoKSA6ICcnOwoJJGNhdGVnb3J5ICA9ICghJGNhdGVnb3J5KSAgPyAnJyA6ICIgYW5kICgo Q2F0ZWdvcnkxPSciLmRvc2xhc2goJGNhdGVnb3J5KS4iJykgb3IgKENhdGVnb3J5Mj0nIi5k b1NsYXNoKCRjYXRlZ29yeSkuIicpKSAiOwoJJHNlY3Rpb24gICA9ICghJHNlY3Rpb24pICAg PyAnJyA6ICIgYW5kIFNlY3Rpb24gPSAnIi5kb3NsYXNoKCRzZWN0aW9uKS4iJyI7CgkkZXhj ZXJwdGVkID0gKCRleGNlcnB0ZWQ9PSd5JykgID8gIiBhbmQgRXhjZXJwdCAhPScnIiA6ICcn OwoJJGF1dGhvciAgICA9ICghJGF1dGhvcikgICAgPyAnJyA6ICIgYW5kIEF1dGhvcklEID0g JyIuZG9zbGFzaCgkYXV0aG9yKS4iJyI7CgkkbW9udGggICAgID0gKCEkbW9udGgpICAgICA/ ICcnIDogIiBhbmQgUG9zdGVkIGxpa2UgJyIuZG9TbGFzaCgkbW9udGgpLiIlJyI7CgkkaWQg ICAgICAgID0gKCEkaWQpICAgICAgICA/ICcnIDogIiBhbmQgSUQgPSAnIi5pbnR2YWwoJGlk KS4iJyI7Cglzd2l0Y2ggKCR0aW1lKSB7CgkJY2FzZSAnYW55JzoKCQkJJHRpbWUgPSAiIjsg YnJlYWs7CgkJY2FzZSAnZnV0dXJlJzoKCQkJJHRpbWUgPSAiIGFuZCBQb3N0ZWQgPiBub3co KSI7IGJyZWFrOwoJCWRlZmF1bHQ6CgkJCSR0aW1lID0gIiBhbmQgUG9zdGVkIDwgbm93KCki OwoJfQoJaWYgKCFpc19udW1lcmljKCRzdGF0dXMpKQoJCSRzdGF0dXMgPSBnZXRTdGF0dXNO dW0oJHN0YXR1cyk7CgoJJGN1c3RvbSA9ICcnOwoJLy8gdHJ5aW5nIGN1c3RvbSBmaWVsZHMg aGVyZQoJJGN1c3RvbUZpZWxkcyA9IGdldEN1c3RvbUZpZWxkcygpOwoJaWYgKCRjdXN0b21G aWVsZHMpIHsKCQlmb3JlYWNoKCRjdXN0b21GaWVsZHMgYXMgJGNGaWVsZCkgewoJCQlpZiAo aXNzZXQoJGF0dHNbJGNGaWVsZF0pKQoJCQkJJGN1c3RvbVBhaXJzWyRjRmllbGRdID0gJGF0 dHNbJGNGaWVsZF07CgkJfQoJCWlmKCFlbXB0eSgkY3VzdG9tUGFpcnMpKQoJCQkkY3VzdG9t ID0gIGJ1aWxkQ3VzdG9tU3FsKCRjdXN0b21GaWVsZHMsJGN1c3RvbVBhaXJzKTsKCQllbHNl CgkJCSRjdXN0b20gPSAnJzsKCX0KCgkvL0FsbG93IGtleXdvcmRzIGZvciBuby1jdXN0b20g YXJ0aWNsZXMuIFRoYXQgdGFnZ2luZyBtb2RlLCB5b3Uga25vdwoJaWYgKCRrZXl3b3Jkcykg ewoJCSRrZXlzID0gZG9TbGFzaChhcnJheV9tYXAoJ3RyaW0nLCBleHBsb2RlKCcsJywgJGtl eXdvcmRzKSkpOwoJCWZvcmVhY2ggKCRrZXlzIGFzICRrZXkpIHsKCQkJJGtleXBhcnRzW10g PSAiRklORF9JTl9TRVQoJyIuJGtleS4iJyxLZXl3b3JkcykiOwoJCX0KCQkka2V5d29yZHMg PSAiIGFuZCAoIiAuIGpvaW4oJyBvciAnLCRrZXlwYXJ0cykgLiAiKSI7Cgl9CgoJaWYgKCRp ZCkKCQkkc3RhdHVzcSA9ICIgYW5kIFN0YXR1cyA+PSAnNCciOwoJZWxzZQoJCSRzdGF0dXNx ID0gIiBhbmQgU3RhdHVzPSciLmRvU2xhc2goJHN0YXR1cykuIiciOwoKCSR3aGVyZSA9ICIx IiAuICRzdGF0dXNxLiAkdGltZS4KCQkkaWQgLiAkY2F0ZWdvcnkgLiAkc2VjdGlvbiAuICRl eGNlcnB0ZWQgLiAkbW9udGggLiAkYXV0aG9yIC4gJGtleXdvcmRzIC4gJGN1c3RvbSAuICRm cm9udHBhZ2U7CgoJCSRwZ29mZnNldCA9ICRvZmZzZXQgLiAnLCAnOwoKCSRycyA9IHNhZmVf cm93c19zdGFydCgiKiwgdW5peF90aW1lc3RhbXAoUG9zdGVkKSBhcyB1UG9zdGVkIiwgJ3Rl eHRwYXR0ZXJuJywKCQkkd2hlcmUuICcgb3JkZXIgYnkgJyAuIGRvc2xhc2goJHNvcnRieSkg LiAnICcgLiBkb1NsYXNoKCRzb3J0ZGlyKSAuICcgbGltaXQgJyAuIGRvU2xhc2goJGxpbWl0 KSk7CgoJcmV0dXJuICRyczsKfQoKCiI7czo4OiJoZWxwX3JhdyI7czo5NDY6IlRvIGxlYXJu IG1vcmUgYWJvdXQgdHJ1X3RhZ3MsIGNoZWNrIG91dCB0aGUgImludHJvZHVjdG9yeSBhcnRp Y2xlIjpodHRwOi8vd3d3LnJhaW5za2l0LmNvbS9ibG9nLzQ5My90cnV0YWdzLWEtdGFnZ2lu Zy1wbHVnaW4tZm9yLXRleHRwYXR0ZXJuLCAicmVsZWFzZXMgcGFnZSI6aHR0cDovL3d3dy5y YWluc2tpdC5jb20vcmVmZXJlbmNlLzUzNy90cnVfdGFncy1yZWxlYXNlcywgImZlYXR1cmUg bGlzdCI6aHR0cDovL3d3dy5yYWluc2tpdC5jb20vcmVmZXJlbmNlLzQ5NS90cnV0YWdzLWZl YXR1cmUtbGlzdCwgInJvYWRtYXAiOmh0dHA6Ly93d3cucmFpbnNraXQuY29tL3JlZmVyZW5j ZS81NTQvdHJ1X3RhZ3Mtcm9hZG1hcCwgYW5kICJ1c2FnZSBpbnN0cnVjdGlvbnMiOmh0dHA6 Ly93d3cucmFpbnNraXQuY29tL3JlZmVyZW5jZS80OTcvdHJ1dGFncy11c2FnZS1pbnN0cnVj dGlvbnMuCgpZb3UgY2FuIGFsc28gZmluZCB0aGUgc291cmNlIGNvZGUgYXQgImh0dHA6Ly9j b2RlLmdvb2dsZS5jb20vcC90cnUtdGFncy8iOmh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC90 cnUtdGFncy8uCgpJJ3ZlIHRha2VuIHRoZSBkZXRhaWxlZCBoZWxwIG91dCBvZiB0aGUgcGx1 Z2luOyBteSBhcG9sb2dpZXMuICBJdCB3YXMgdG9vIGJpZyBhbmQgdG9vIGRpZmZpY3VsdCB0 byBrZWVwIG1haW50YWluaW5nIG9uIG15IHNpdGUgYW5kIGluIHRoZSBwbHVnaW4uICBJZiwg bXkgc2l0ZSBpcyBldmVyIGRvd24sIGhvd2V2ZXIsIHRoZSBzb3VyY2UgSFRNTCBvZiB0aGUg dXNhZ2UgaW5zdHJ1Y3Rpb25zIGlzIGF2YWlsYWJsZSBhdCAiaHR0cDovL2NvZGUuZ29vZ2xl LmNvbS9wL3RydS10YWdzL3NvdXJjZS9icm93c2UvdHJ1bmsvdHJ1X3RhZ3MtZG9jcy5odG1s IjpodHRwOi8vY29kZS5nb29nbGUuY29tL3AvdHJ1LXRhZ3Mvc291cmNlL2Jyb3dzZS90cnVu ay90cnVfdGFncy1kb2NzLmh0bWwiO3M6MzoibWQ1IjtzOjMyOiJkODRjNDQ3OTExMjFiMDE2 YzM4YzdmOGY3MzE0NTMzOCI7fQ==