# tru_tags v3.6 # 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 NiI7czo2OiJhdXRob3IiO3M6MTM6Ik5hdGhhbiBBcnRodXIiO3M6MTA6ImF1dGhvcl91cmki 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+IjtzOjQ6ImNvZGUiO3M6NDQxNzI6 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 eSgpOwoJCQkJaWYgKGFycmF5X2tleV9leGlzdHMoJHRhZ3NfZmllbGQsICRhKSkgewoJCQkJ CSRhcnRpY2xlX3RhZ3MgPSBleHBsb2RlKCIsIiwgdHJpbSh0cnVfdGFnc19zdHJ0b2xvd2Vy KCRhWyR0YWdzX2ZpZWxkXSkpKTsKCQkJCX0KCQkJCSRhbGxfdGFncyA9IGFycmF5X21lcmdl KCRhbGxfdGFncywgdHJ1X3RhZ3NfdHJpbV90YWdzKCRhcnRpY2xlX3RhZ3MpKTsKCQkJfQoJ CX0KCgkJJGFsdF90YWdfcGFyYW1ldGVyID0gc3RyX3JlcGxhY2UoJy0nLCAnICcsICR0YWdf cGFyYW1ldGVyKTsKCQlmb3JlYWNoICgkYWxsX3RhZ3MgYXMgJGtleSA9PiAkdGFnKSB7CgkJ CWlmICgkdGFnID09ICR0YWdfcGFyYW1ldGVyIHx8ICR0YWcgPT0gJGFsdF90YWdfcGFyYW1l dGVyKSB7CgkJCQl1bnNldCgkYWxsX3RhZ3NbJGtleV0pOwoJCQl9CgkJfQoKCQkkY2xvdWRf YXR0cyA9IHRydV90YWdzX2dldF9zdGFuZGFyZF9jbG91ZF9hdHRzKCRhdHRzLCBmYWxzZSwg ZmFsc2UpOwoJCSRhbGxfdGFnc19mb3Jfd2VpZ2h0ID0gJGFsbF90YWdzOwoJCWlmICgkY2xv dWRfYXR0c1sndXNlb3ZlcmFsbGNvdW50cyddKSB7CgkJCSRhbGxfdGFnc19mb3Jfd2VpZ2h0 ID0gdHJ1X3RhZ3NfY2xvdWRfcXVlcnkoJGNsb3VkX2F0dHMpOwoJCX0KCgkJcmV0dXJuIHRy dV90YWdzX3JlbmRlcl9jbG91ZCgkY2xvdWRfYXR0cywgJGFsbF90YWdzLCAkYWxsX3RhZ3Nf Zm9yX3dlaWdodCk7Cgl9IGVsc2UgewoJCXJldHVybiAnJzsKCX0KfQoKCiMjIyBDTE9VRCBT VVBQT1JUIEZVTkNUSU9OUyAjIyMKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwoK ZnVuY3Rpb24gdHJ1X3RhZ3NfZ2V0X3N0YW5kYXJkX2Nsb3VkX2F0dHMoJGF0dHMsICRpc0xp c3QsICRpc0FydGljbGUsICRzaG93QWxsPWZhbHNlKSB7CglyZXR1cm4gbEF0dHMoYXJyYXko J3dyYXB0YWcnCT0+ICgkaXNMaXN0ID8gJ3VsJyA6ICcnKSwKCQkJJ2JyZWFrJwkJPT4gKCRp c0xpc3QgPyAnbGknIDogJywgJyksCgkJCSdjbGFzcycJCT0+ICcnLAoJCQknYnJlYWtjbGFz cycJPT4gJycsCgkJCSdzZWN0aW9uJwk9PiAnJywKCQkJJ21pbnBlcmNlbnQnCT0+ICcxMDAn LAoJCQknbWF4cGVyY2VudCcJPT4gKCRpc0xpc3QgfHwgJGlzQXJ0aWNsZSA/ICcxMDAnIDog JzIwMCcpLAoJCQknc2hvd2NvdW50cycJPT4gJycsCgkJCSdjb3VudHdyYXBjaGFycycJPT4g J1tdJywKCQkJJ3VzZXJlbHRhZycJPT4gKCRpc0FydGljbGUgPyAnMScgOiAnJyksCgkJCSdn ZW5lcmF0ZWxpbmtzJwk9PiAnMScsCgkJCSdtaW50YWdjb3VudCcJPT4gJzAnLAoJCQknbWF4 dGFnY291bnQnCT0+ICcxMDAwJywKCQkJJ3NldHNpemVzJwk9PiAoJGlzQXJ0aWNsZSA/ICcw JyA6ICcxJyksCgkJCSd1c2Vub2ZvbGxvdycJPT4gJycsCgkJCSdzb3J0JwkJPT4gJ2FscGhh JywKCQkJJ3VzZW92ZXJhbGxjb3VudHMnCT0+ICcnLAoJCQknc2V0Y2xhc3NlcycJPT4gKCRp c0FydGljbGUgPyAnMCcgOiAnMScpLAoJCQkndGl0bGUnCQk9PiAnJywKCQkJJ2xpc3RsaW1p dCcJPT4gJycsCgkJCSdrZWVwJwkJPT4gJ2xhcmdlc3QnLAoJCQknY3V0b2ZmJwk9PiAnY2h1 bmsnLAoJCQkndGV4dHRyYW5zZm9ybScJPT4gJ25vbmUnLAoJCQknbGlua3BhdGgnCT0+ICcn LAoJCQknbGlua3BhdGh0YWlsJwk9PiAnJywKCQkJJ2ZpbHRlcnNlYXJjaCcJPT4gKCRzaG93 QWxsID8gMCA6ICcxJyksCgkJCSdleGNsdWRlc2VjdGlvbic9PiAnJywKCQkJJ2FjdGl2ZWNs YXNzJwk9PiAndGFnQWN0aXZlJywKCQkJJ3RpbWUnCQk9PiAoJHNob3dBbGwgPyAnYW55JyA6 ICdwYXN0JykKCQkpLCRhdHRzLCAwKTsKfQoKCmZ1bmN0aW9uIHRydV90YWdzX2Nsb3VkX3F1 ZXJ5KCRhdHRzKSB7CglleHRyYWN0KCRhdHRzKTsKCgkkc2VjdGlvbl9jbGF1c2UgPSAnJzsK CWlmICgkc2VjdGlvbiA8PiAnJykgewoJCSRrZXlzID0gZXhwbG9kZSgnLCcsICRzZWN0aW9u KTsKCQlmb3JlYWNoICgka2V5cyBhcyAka2V5KSB7CgkJCSRrZXlwYXJ0c1tdID0gIiBTZWN0 aW9uID0gJyIgLiB0cmltKCRrZXkpIC4gIiciOwoJCX0KCQkkc2VjdGlvbl9jbGF1c2UgPSAi IEFORCAoIiAuIGpvaW4oJyBvciAnLCAka2V5cGFydHMpIC4gIikiOwoJfQoKCSR0YWdzX2Zp ZWxkID0gVFJVX1RBR1NfRklFTEQ7CglpbmNsdWRlX29uY2UgdHhwYXRoLicvcHVibGlzaC9z ZWFyY2gucGhwJzsKCgkkZmlsdGVyID0gdHJ1X3RhZ3NfZmlsdGVyX3NlY3Rpb25zKCRleGNs dWRlc2VjdGlvbik7CgkkZmlsdGVyIC49ICgkZmlsdGVyc2VhcmNoID8gZmlsdGVyU2VhcmNo KCkgOiAnJyk7CgoJc3dpdGNoICgkdGltZSkgewoJCWNhc2UgJ2FueSc6CgkJCSR0aW1lID0g IiI7IGJyZWFrOwoJCWNhc2UgJ2Z1dHVyZSc6CgkJCSR0aW1lID0gIiBhbmQgUG9zdGVkID4g bm93KCkiOyBicmVhazsKCQlkZWZhdWx0OgoJCQkkdGltZSA9ICIgYW5kIFBvc3RlZCA8PSBu b3coKSI7Cgl9CglnbG9iYWwgJHByZWZzOwoJZXh0cmFjdCgkcHJlZnMpOwoJaWYgKCEkcHVi bGlzaF9leHBpcmVkX2FydGljbGVzKSB7CgkJJHRpbWUgLj0gIiBhbmQgKG5vdygpIDw9IEV4 cGlyZXMgb3IgRXhwaXJlcyA9ICIuTlVMTERBVEVUSU1FLiIpIjsKCX0KCgkkYWxsX3RhZ3Mg PSBhcnJheSgpOwoJJHJzID0gc2FmZV9yb3dzKCIkdGFnc19maWVsZCIsICJ0ZXh0cGF0dGVy biIsICIkdGFnc19maWVsZCA8PiAnJyIgLiAkc2VjdGlvbl9jbGF1c2UgLiAkZmlsdGVyIC4g IiBhbmQgU3RhdHVzID49ICc0JyIgLiAkdGltZSk7Cglmb3JlYWNoICgkcnMgYXMgJHJvdykg ewoJCSR0ZW1wX2FycmF5ID0gYXJyYXkoKTsKCQlpZiAoYXJyYXlfa2V5X2V4aXN0cygkdGFn c19maWVsZCwgJHJvdykpIHsKCQkJJHRlbXBfYXJyYXkgPSBleHBsb2RlKCIsIiwgdHJpbSh0 cnVfdGFnc19zdHJ0b2xvd2VyKCRyb3dbJHRhZ3NfZmllbGRdKSkpOwoJCX0KCQkkYWxsX3Rh Z3MgPSBhcnJheV9tZXJnZSgkYWxsX3RhZ3MsIHRydV90YWdzX3RyaW1fdGFncygkdGVtcF9h cnJheSkpOwoJfQoKCXJldHVybiAkYWxsX3RhZ3M7Cn0KCgpmdW5jdGlvbiB0cnVfdGFnc19m aWx0ZXJfc2VjdGlvbnMoJGV4Y2x1ZGVzZWN0aW9uKSB7Cgkkc2VjdGlvbnMgPSBleHBsb2Rl KCcsJywgJGV4Y2x1ZGVzZWN0aW9uKTsKCSRmaWx0ZXJzID0gYXJyYXkoKTsKCWZvcmVhY2gg KCRzZWN0aW9ucyBhcyAkc2VjdGlvbikgewoJCSRmaWx0ZXJzW10gPSAiYW5kIFNlY3Rpb24g IT0gJyIuZG9TbGFzaCgkc2VjdGlvbikuIiciOwoJfQoJcmV0dXJuIGpvaW4oJyAnLCAkZmls dGVycyk7Cn0KCgpmdW5jdGlvbiB0cnVfdGFnc19yZW5kZXJfY2xvdWQoJGF0dHMsICRhbGxf dGFncywgJGFsbF90YWdzX2Zvcl93ZWlnaHQpIHsKCWdsb2JhbCAkdHJ1X3RhZ3NfcHJlZnM7 CglleHRyYWN0KCRhdHRzKTsKCgkkdGFnc193ZWlnaHQgPSBhcnJheV9jb3VudF92YWx1ZXMo JGFsbF90YWdzX2Zvcl93ZWlnaHQpOwoKCWZvcmVhY2ggKCR0YWdzX3dlaWdodCBhcyAkdGFn ID0+ICR3ZWlnaHQpIHsKCQlpZiAoIWluX2FycmF5KCR0YWcsICRhbGxfdGFncykKCQkgICB8 fCAkdGFnc193ZWlnaHRbJHRhZ10gPCAkbWludGFnY291bnQKCQkgICB8fCAkdGFnc193ZWln aHRbJHRhZ10gPiAkbWF4dGFnY291bnQpIHsKCQkJdW5zZXQoJHRhZ3Nfd2VpZ2h0WyR0YWdd KTsKCQl9Cgl9CgoJJHNvcnRfYnlfY291bnQgPSAoc3RycG9zKCRzb3J0LCAnY291bnQnKSAh PT0gZmFsc2UpOwoJJHNvcnRfYXNjZW5kaW5nID0gKHN0cnBvcygkc29ydCwgJ2FzYycpICE9 PSBmYWxzZSk7CgkkdGFnc193ZWlnaHQgPSB0cnVfdGFnc19zb3J0X3RhZ3MoJHRhZ3Nfd2Vp Z2h0LCAkc29ydF9ieV9jb3VudCwgJHNvcnRfYXNjZW5kaW5nKTsKCglpZiAoJGxpc3RsaW1p dCA+IDAgJiYgJGxpc3RsaW1pdCA8IGNvdW50KCR0YWdzX3dlaWdodCkpIHsKCQkkcmVzb3J0 ZWRfdGFncyA9IGFycmF5KCk7CgkJaWYgKCRrZWVwID09ICdsYXJnZXN0JykgewoJCQkkcmVz b3J0ZWRfdGFncyA9IGFycmF5X2tleXModHJ1X3RhZ3Nfc29ydF90YWdzKCR0YWdzX3dlaWdo dCwgdHJ1ZSwgZmFsc2UpKTsKCQl9IGVsc2UgewoJCQlpZiAoJGtlZXAgPT0gJ3JhbmRvbScp IHsKCQkJCWZvcmVhY2ggKCR0YWdzX3dlaWdodCBhcyAkdGFnID0+ICR3ZWlnaHQpIHsKCQkJ CQkkcmVzb3J0ZWRfdGFnc1skdGFnXSA9IHJhbmQoMCwgJHdlaWdodCk7CgkJCQl9CgkJCQkk cmVzb3J0ZWRfdGFncyA9IGFycmF5X2tleXModHJ1X3RhZ3Nfc29ydF90YWdzKCRyZXNvcnRl ZF90YWdzLCB0cnVlLCBmYWxzZSkpOwoJCQl9IGVsc2UgaWYgKCRrZWVwID09ICdhbHBoYScp IHsKCQkJCSRyZXNvcnRlZF90YWdzID0gYXJyYXlfa2V5cygkdGFnc193ZWlnaHQpOwoJCQkJ bmF0Y2FzZXNvcnQoJHJlc29ydGVkX3RhZ3MpOwoJCQl9CgkJCSRjdXRvZmYgPSAnZXhhY3Qn OwoJCX0KCgkJJGxhc3RfZ29vZF9pbmRleCA9ICRsaXN0bGltaXQgLSAxOwoJCWlmICgkY3V0 b2ZmID09ICdjaHVuaycpIHsgLy9hbHRlcm5hdGl2ZSBpcyAnZXhhY3QnCgkJCSRsYXN0X3dl aWdodCA9IC0xOwoJCQlmb3IgKCRpID0gMDsgJGkgPCAkbGlzdGxpbWl0ICsgMTsgJGkrKykg ewoJCQkJJG5ld193ZWlnaHQgPSAkdGFnc193ZWlnaHRbJHJlc29ydGVkX3RhZ3NbJGldXTsK CQkJCWlmICgkbmV3X3dlaWdodCAhPSAkbGFzdF93ZWlnaHQpIHsKCQkJCQkkbGFzdF9nb29k X2luZGV4ID0gJGkgLSAxOwoJCQkJCSRsYXN0X3dlaWdodCA9ICRuZXdfd2VpZ2h0OwoJCQkJ fQoJCQl9CgkJCWlmICgkbGFzdF9nb29kX2luZGV4IDwgMCkgewoJCQkJJGxhc3RfZ29vZF9p bmRleCA9ICRsaXN0bGltaXQgLSAxOwoJCQl9CgkJfQoKCQkkcmVzb3J0ZWRfdGFncyA9IGFy cmF5X2NodW5rKCRyZXNvcnRlZF90YWdzLCAkbGFzdF9nb29kX2luZGV4ICsgMSk7CgkJJHJl c29ydGVkX3RhZ3MgPSAkcmVzb3J0ZWRfdGFnc1swXTsKCgkJZm9yZWFjaCAoJHRhZ3Nfd2Vp Z2h0IGFzICR0YWcgPT4gJHdlaWdodCkgewoJCQlpZiAoIWluX2FycmF5KCR0YWcsICRyZXNv cnRlZF90YWdzKSkgewoJCQkJdW5zZXQoJHRhZ3Nfd2VpZ2h0WyR0YWddKTsKCQkJfQoJCX0K CX0KCglpZiAoJGdlbmVyYXRlbGlua3MpIHsKCQlpZiAoJGxpbmtwYXRoKSB7CgkJCSR1cmxw cmVmaXggPSAkbGlua3BhdGg7CgkJCSR1cmxzdWZmaXggPSAkbGlua3BhdGh0YWlsOwoJCX0g ZWxzZSB7CgkJCWlmICh0cnVfdGFnc19jbGVhbl91cmxzKCkpIHsKCQkJCSR1cmxwcmVmaXgg PSBodSAuICR0cnVfdGFnc19wcmVmc1tUQUdfU0VDVElPTl0tPnZhbHVlIC4gJy8nOwoJCQl9 IGVsc2UgewoJCQkJJHVybHByZWZpeCA9IGh1IC4gJz9zPScgLiAkdHJ1X3RhZ3NfcHJlZnNb VEFHX1NFQ1RJT05dLT52YWx1ZSAuICcmYW1wOycgLiAkdHJ1X3RhZ3NfcHJlZnNbUEFSTV9O QU1FXS0+dmFsdWUgLiAnPSc7CgkJCX0KCQkJJHVybHN1ZmZpeCA9ICh0cnVfdGFnc19jbGVh bl91cmxzKCkgPyAnLycgOiAnJyk7CgkJfQoKCQlpZiAoJHVzZXJlbHRhZykgewoJCQlpZiAo JHVzZW5vZm9sbG93KSB7CgkJCQkkdXJsc3VmZml4IC49ICciIHJlbD0idGFnIG5vZm9sbG93 JzsKCQkJfSBlbHNlIHsKCQkJCSR1cmxzdWZmaXggLj0gJyIgcmVsPSJ0YWcnOwoJCQl9CgkJ fSBlbHNlIGlmICgkdXNlbm9mb2xsb3cpIHsKCQkJJHVybHN1ZmZpeCAuPSAnIiByZWw9Im5v Zm9sbG93JzsKCQl9Cgl9CgoJaWYgKGNvdW50KCR0YWdzX3dlaWdodCkgPiAwKSB7CgkJJG1h eCA9IG1heCgkdGFnc193ZWlnaHQpOwoJCSRtaW4gPSBtaW4oJHRhZ3Nfd2VpZ2h0KTsKCX0g ZWxzZSB7CgkJJG1heCA9ICRtaW4gPSAwOwoJfQoJJHN0ZXB2YWx1ZSA9ICgkbWF4ID09ICRt aW4pID8gMCA6ICgkbWF4cGVyY2VudCAtICRtaW5wZXJjZW50KSAvICgkbWF4IC0gJG1pbik7 CgoJJHRhZ3NfaHRtbCA9IGFycmF5KCk7CgkkdGFnX3NlYXJjaF90YWcgPSB0cnVfdGFnc190 YWdfcGFyYW1ldGVyKGFycmF5KCdzdHJpcGh5cGhlbnMnID0+ICdsb29rdXAnKSk7CgkkdGFn X3NlYXJjaF90YWcgPSBmdW5jdGlvbl9leGlzdHMoImh0bWxzcGVjaWFsY2hhcnNfZGVjb2Rl IikgPyBodG1sc3BlY2lhbGNoYXJzX2RlY29kZSgkdGFnX3NlYXJjaF90YWcpIDogaHRtbF9l bnRpdHlfZGVjb2RlKCR0YWdfc2VhcmNoX3RhZyk7Cglmb3JlYWNoICgkdGFnc193ZWlnaHQg YXMgJHRhZyA9PiAkd2VpZ2h0KSB7CgkJJHRhZ193ZWlnaHQgPSBmbG9vcigkbWlucGVyY2Vu dCArICgkd2VpZ2h0IC0gJG1pbikgKiAkc3RlcHZhbHVlKTsKCgkJJHN0eWxlID0gJyc7CgkJ aWYgKCRzZXRzaXplcykKCQkJJHN0eWxlID0gJyBzdHlsZT0iZm9udC1zaXplOiAnIC4gJHRh Z193ZWlnaHQgLiAnJTsiJzsKCgkJJHRhZ19jbGFzcyA9ICcnOwoJCWlmICgkc2V0Y2xhc3Nl cykgewoJCQkkdGFnX2NsYXNzID0gJyBjbGFzcz0iJzsKCQkJaWYgKCR3ZWlnaHQgPT0gJG1p bikgewoJCQkJJHRhZ19jbGFzcyAuPSAidGFnU2l6ZVNtYWxsZXN0IjsKCQkJfSBlbHNlIGlm ICgkd2VpZ2h0ID09ICRtYXgpIHsKCQkJCSR0YWdfY2xhc3MgLj0gInRhZ1NpemVMYXJnZXN0 IjsKCQkJfSBlbHNlIHsKCQkJCSR0YWdfY2xhc3MgLj0gInRhZ1NpemVNZWRpdW0iOwoJCQl9 CgkJCSR0YWdfY2xhc3MgLj0gJyB0YWdTaXplJyAuICgkd2VpZ2h0ICsgMSAtICRtaW4pOwoJ CQlpZiAoJHRhZyA9PSAkdGFnX3NlYXJjaF90YWcpIHsKCQkJCSR0YWdfY2xhc3MgLj0gJyAn IC4gJGFjdGl2ZWNsYXNzOwoJCQl9CgkJCSR0YWdfY2xhc3MgLj0gJyInOwoJCX0KCgkJLy9h ZGFwdGVkIGZyb20gY29kZSBieSBnZHRyb2lhbm8sIHNlZSBodHRwOi8vZm9ydW0udGV4dHBh dHRlcm4uY29tL3ZpZXd0b3BpYy5waHA/cGlkPTEwMjg3NSNwMTAyODc1CgkJJHRpdGxlY291 bnQgPSAnJzsKCQlpZiAoJHRpdGxlKQoJCQkkdGl0bGVjb3VudCA9ICcgdGl0bGU9IicgLiAk dGl0bGUgLiAnIic7CgkJJGRpc3BsYXljb3VudD0gJyc7CgkJJGNvdW50ID0gJGNvdW50d3Jh cGNoYXJzezB9IC4gJHdlaWdodCAuICRjb3VudHdyYXBjaGFyc3sxfTsKCQlpZiAoJHNob3dj b3VudHMgPT0gJ3RpdGxlJyB8fCAkc2hvd2NvdW50cyA9PSAnYm90aCcpCgkJCSR0aXRsZWNv dW50ID0gJyB0aXRsZT0iJyAuICR0aXRsZSAuICRjb3VudCAuICciJzsKCQlpZiAoJHNob3dj b3VudHMgJiYgJHNob3djb3VudHMgIT0gJ3RpdGxlJykKCQkJJGRpc3BsYXljb3VudCA9ICcg JyAuICRjb3VudDsKCgkJaWYgKCR0ZXh0dHJhbnNmb3JtID09ICdjYXBpdGFsaXplJykgewoJ CQkkdGFnID0gdHJ1X3RhZ3NfdWN3b3JkcygkdGFnKTsKCQl9IGVsc2UgaWYgKCR0ZXh0dHJh bnNmb3JtID09ICd1cHBlcmNhc2UnKSB7CgkJCSR0YWcgPSB0cnVfdGFnc19zdHJ0b3VwcGVy KCR0YWcpOwoJCX0gZWxzZSBpZiAoJHRleHR0cmFuc2Zvcm0gPT0gJ2xvd2VyY2FzZScpIHsK CQkJJHRhZyA9IHRydV90YWdzX3N0cnRvbG93ZXIoJHRhZyk7CgkJfSBlbHNlIGlmICgkdGV4 dHRyYW5zZm9ybSA9PSAnY2FwZmlyc3QnKSB7CgkJCSR0YWcgPSB0cnVfdGFnc191Y2ZpcnN0 KCR0YWcpOwoJCX0KCgkJaWYgKCRnZW5lcmF0ZWxpbmtzKSB7CgkJCSR3aG9sZXVybCA9ICci JyAuICR1cmxwcmVmaXggLiB1cmxlbmNvZGUoc3RyX3JlcGxhY2UoJyAnLCAnLScsICR0YWcp KSAuICR1cmxzdWZmaXggLiAnIic7CgkJCSR0YWdzX2h0bWxbXSA9ICc8YSBocmVmPScgLiAk d2hvbGV1cmwgLiAkdGFnX2NsYXNzIC4gJHN0eWxlIC4gJHRpdGxlY291bnQgLiAnPicgLiBo dG1sc3BlY2lhbGNoYXJzKCR0YWcpIC4gJzwvYT4nIC4gJGRpc3BsYXljb3VudDsKCQl9IGVs c2UgaWYgKCR0YWdfY2xhc3MgfHwgJHN0eWxlIHx8ICR0aXRsZWNvdW50KSB7CgkJCSR0YWdz X2h0bWxbXSA9ICc8c3BhbicgLiAkdGFnX2NsYXNzIC4gJHN0eWxlIC4gJHRpdGxlY291bnQg LiAnPicgLiBodG1sc3BlY2lhbGNoYXJzKCR0YWcpIC4gJzwvc3Bhbj4nIC4gJGRpc3BsYXlj b3VudDsKCQl9IGVsc2UgewoJCQkkdGFnc19odG1sW10gPSBodG1sc3BlY2lhbGNoYXJzKCR0 YWcpIC4gJGRpc3BsYXljb3VudDsKCQl9Cgl9CglyZXR1cm4gdHJ1X3RhZ3NfZG9fd3JhcCgk dGFnc19odG1sLCAkd3JhcHRhZywgJGJyZWFrLCAkY2xhc3MsICRicmVha2NsYXNzKTsKfQoK CiMjIyBDTEVBTiBVUkwgRlVOQ1RJT05TICMjIwojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj IyMKCmlmICh0cnVfdGFnc19jbGVhbl91cmxzKCkpIHsKCXJlZ2lzdGVyX2NhbGxiYWNrKCd0 cnVfdGFnc19jbGVhbl91cmxfaGFuZGxlcicsICdwcmV0ZXh0Jyk7Cn0KCgpmdW5jdGlvbiB0 cnVfdGFnc19jbGVhbl91cmxfaGFuZGxlcigkZXZlbnQsICRzdGVwKSB7CglnbG9iYWwgJHRy dV90YWdzX3ByZWZzOwoJJHN1YnBhdGggPSBwcmVnX3JlcGxhY2UoIi9odHRwcz86XC9cLy4q KFwvLiopL1VpIiwiJDEiLGh1KTsKCSRyZWdzYWZlc3VicGF0aCA9IHByZWdfcXVvdGUoJHN1 YnBhdGgsICcvJyk7CgkkcmVxID0gcHJlZ19yZXBsYWNlKCIvXiRyZWdzYWZlc3VicGF0aC9p IiwnLycsJF9TRVJWRVJbJ1JFUVVFU1RfVVJJJ10pOwoKCSRxcyA9IHN0cnBvcygkcmVxLCAn PycpOwoJJHFhdHRzID0gKCRxcyA/ICcmJy5zdWJzdHIoJHJlcSwgJHFzICsgMSkgOiAnJyk7 CglpZiAoJHFzKSAkcmVxID0gc3Vic3RyKCRyZXEsIDAsICRxcyk7CgoJJHBhcnRzID0gYXJy YXlfdmFsdWVzKGFycmF5X2ZpbHRlcihleHBsb2RlKCcvJywgJHJlcSkpKTsKCWlmIChjb3Vu dCgkcGFydHMpID09IDIgJiYgJHBhcnRzWzBdID09ICR0cnVfdGFnc19wcmVmc1tUQUdfU0VD VElPTl0tPnZhbHVlKSB7CgkJJHRhZyA9ICRwYXJ0c1sxXTsKCQkkX1NFUlZFUlsnUVVFUllf U1RSSU5HJ10gPSAkdHJ1X3RhZ3NfcHJlZnNbUEFSTV9OQU1FXS0+dmFsdWUgLiAnPScgLiAk dGFnIC4gJHFhdHRzOwoJCSRfU0VSVkVSWydSRVFVRVNUX1VSSSddID0gJHN1YnBhdGggLiAk dHJ1X3RhZ3NfcHJlZnNbVEFHX1NFQ1RJT05dLT52YWx1ZSAuICcvPycgLiAkX1NFUlZFUlsn UVVFUllfU1RSSU5HJ107CgkJaWYgKGNvdW50KCRfUE9TVCkgPiAwKSB7CgkJCSRfUE9TVFsn c2VjdGlvbiddID0gJHRydV90YWdzX3ByZWZzW1RBR19TRUNUSU9OXS0+dmFsdWU7CgkJCSRf UE9TVFskdHJ1X3RhZ3NfcHJlZnNbUEFSTV9OQU1FXS0+dmFsdWVdID0gJHRhZzsKCQl9IGVs c2UgewoJCQkkX0dFVFsnc2VjdGlvbiddID0gJHRydV90YWdzX3ByZWZzW1RBR19TRUNUSU9O XS0+dmFsdWU7CgkJCSRfR0VUWyR0cnVfdGFnc19wcmVmc1tQQVJNX05BTUVdLT52YWx1ZV0g PSAkdGFnOwoJCX0KCX0KfQoKCmZ1bmN0aW9uIHRydV90YWdzX2NsZWFuX3VybHMoKSB7Cgln bG9iYWwgJHRydV90YWdzX3ByZWZzOwoJcmV0dXJuICgnY2xlYW4nID09ICR0cnVfdGFnc19w cmVmc1tDTEVBTl9VUkxTXS0+dmFsdWUpOwp9CgoKIyMjIEFETUlOIFNJREUgRlVOQ1RJT05T ICMjIwojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgppZiAoQHR4cGludGVyZmFjZSA9 PSAnYWRtaW4nKSB7CglhZGRfcHJpdnMoJ3RydV90YWdzJywgJzEsMicpOwoJcmVnaXN0ZXJf dGFiKCdleHRlbnNpb25zJywgJ3RydV90YWdzJywgJ3RydV90YWdzJyk7CglyZWdpc3Rlcl9j YWxsYmFjaygndHJ1X3RhZ3NfYWRtaW5fdGFiJywgJ3RydV90YWdzJyk7CgoJaWYgKCR0cnVf dGFnc19wcmVmc1tUQUdTX0lOX1dSSVRFX1RBQl0tPnZhbHVlIHx8ICR0cnVfdGFnc19wcmVm c1tBVVRPQ09NUExFVEVfSU5fV1JJVEVfVEFCXS0+dmFsdWUpIHsKCQlyZWdpc3Rlcl9jYWxs YmFjaygndHJ1X3RhZ3NfYWRtaW5fd3JpdGVfdGFiX2hhbmRsZXInLCAnYXJ0aWNsZScpOwoJ fQp9CgoKZnVuY3Rpb24gdHJ1X3RhZ3NfYWRtaW5fdGFiKCRldmVudCwgJHN0ZXApIHsKCXJl cXVpcmVfcHJpdnMoJ3RydV90YWdzJyk7CgoJJHJlc3VsdHMgPSB0cnVfdGFnc19hZG1pbl90 YWJfaGFuZGxlX2lucHV0KCk7CgoJJGF0dHMgPSB0cnVfdGFnc19nZXRfc3RhbmRhcmRfY2xv dWRfYXR0cyhhcnJheSgpLCBmYWxzZSwgZmFsc2UsIHRydWUpOwoJJGFsbF90YWdzID0gdHJ1 X3RhZ3NfY2xvdWRfcXVlcnkoJGF0dHMpOwoJJGNsb3VkID0gdHJ1X3RhZ3NfcmVuZGVyX2Ns b3VkKCRhdHRzLCAkYWxsX3RhZ3MsICRhbGxfdGFncyk7CgoJJHJlZGlyZWN0cyA9IHRydV90 YWdzX2xvYWRfcmVkaXJlY3RzKCk7CgoJdHJ1X3RhZ3NfYWRtaW5fdGFiX3JlbmRlcl9wYWdl KCRyZXN1bHRzLCAkY2xvdWQsICRyZWRpcmVjdHMpOwp9CgoKZnVuY3Rpb24gdHJ1X3RhZ3Nf YWRtaW5fdGFiX3JlbmRlcl9wYWdlKCRyZXN1bHRzLCAkY2xvdWQsICRyZWRpcmVjdHMpIHsK CWdsb2JhbCAkZXZlbnQ7CglwYWdldG9wKCd0cnVfdGFncycsICcnKTsKCglpbmNsdWRlX29u Y2UodHhwYXRoIC4gJy9pbmNsdWRlL3R4cF9wcmVmcy5waHAnKTsKCWdsb2JhbCAkdHJ1X3Rh Z3NfcHJlZnM7CgoJZWNobyBzdGFydFRhYmxlKCdsYXlvdXQnLCAnJywgJycsICcxMHB4Jyku Jzx0cj48dGQgc3R5bGU9ImJvcmRlci1yaWdodDoycHggc29saWQgZ3JheSI+Jy4gICMgSSBr bm93LCBJIGtub3cuLi4KCQlzdGFydFRhYmxlKCdsYXlvdXQnLCAnJywgJycsICcnLCAnMTBw eCcpLic8dHI+PHRkIHN0eWxlPSJib3JkZXItYm90dG9tOjJweCBzb2xpZCBncmF5Ij4nLgoJ CQlzdGFydFRhYmxlKCdsaXN0JywgJycsICcnLCAnJywgJzMwMHB4JykuCgkJCQl0cihoQ2Vs bChnVHh0KCdDdXJyZW50IHRhZ3MnKSkpLgoJCQkJdHIodGQoJGNsb3VkKSkuCgkJCWVuZFRh YmxlKCkuCgkJJzwvdGQ+PC90cj48dHI+PHRkPicuCgkJCXN0YXJ0VGFibGUoJ2xpc3QnLCAn JywgJycsICcnLCAnMzAwcHgnKS4KCQkJCXRyKGhDZWxsKGdUeHQoJ3RydV90YWdzIFJlZmVy ZW5jZScpKSkuCgkJCQl0cih0ZCgnPGEgaHJlZj0iaHR0cDovL3d3dy5yYWluc2tpdC5jb20v cmVmZXJlbmNlLzQ5Ny90cnV0YWdzLXVzYWdlLWluc3RydWN0aW9ucyI+VXNhZ2UgaW5zdHJ1 Y3Rpb25zPC9hPicuCgkJCQknPGJyPjxhIGhyZWY9Imh0dHA6Ly9mb3J1bS50ZXh0cGF0dGVy bi5jb20vdmlld3RvcGljLnBocD9pZD0xNTA4NCI+Rm9ydW0gcGFnZXM8L2E+Jy4KCQkJCSc8 YnI+PGEgaHJlZj0iaHR0cDovL3d3dy5yYWluc2tpdC5jb20vcmVmZXJlbmNlLzUzNy90cnVf dGFncy1yZWxlYXNlcyI+UmVsZWFzZXMgcGFnZTwvYT4nLgoJCQkJJzxicj48YSBocmVmPSJo dHRwOi8vd3d3LnJhaW5za2l0LmNvbS9yZWZlcmVuY2UvNTU0L3RydV90YWdzLXJvYWRtYXAi PlJlbGVhc2Ugcm9hZG1hcDwvYT4nLgoJCQkJJzxicj48YSBocmVmPSJodHRwOi8vd3d3LnJh aW5za2l0LmNvbS9yZWZlcmVuY2UvNDk1L3RydXRhZ3MtZmVhdHVyZS1saXN0Ij5GZWF0dXJl IGxpc3Q8L2E+Jy4KCQkJCSc8YnI+PGJyPjxhIGhyZWY9Imh0dHA6Ly9jb2RlLmdvb2dsZS5j b20vcC90cnUtdGFncy9zb3VyY2UvYnJvd3NlL3RydW5rL3RydV90YWdzLnBocCI+dHJ1X3Rh Z3Mgc291cmNlIGNvZGU8L2E+Jy4KCQkJCSc8YnI+PGEgaHJlZj0iaHR0cDovL2NvZGUuZ29v Z2xlLmNvbS9wL3RydS10YWdzL3NvdXJjZS9icm93c2UvdHJ1bmsvdHJ1X3RhZ3MtZG9jcy5o dG1sIj5Tb3VyY2UgSFRNTCBmb3IgdGhlIHVzYWdlIGluc3RydWN0aW9uczwvYT4nLgoJCQkJ Jzxicj48YnI+PGEgaHJlZj0iaHR0cDovL3d3dy5yYWluc2tpdC5jb20vYmxvZy80OTMvdHJ1 dGFncy1hLXRhZ2dpbmctcGx1Z2luLWZvci10ZXh0cGF0dGVybiI+dHJ1X3RhZ3M8L2E+LCBi eSA8YSBocmVmPSJodHRwOi8vd3d3LnJhaW5za2l0LmNvbS8iPk5hdGhhbiBBcnRodXI8L2E+ Jy4KCQkJCSc8YnI+PGJyPicuCgkJCQknPGRpdiBpZD0icGF5cGFsIj48Zm9ybSBhY3Rpb249 Imh0dHBzOi8vd3d3LnBheXBhbC5jb20vY2dpLWJpbi93ZWJzY3IiIG1ldGhvZD0icG9zdCI+ PGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iY21kIiB2YWx1ZT0iX3MteGNsaWNrIiAvPjxp bnB1dCB0eXBlPSJpbWFnZSIgc3JjPSJodHRwczovL3d3dy5wYXlwYWwuY29tL2VuX1VTL2kv YnRuL3gtY2xpY2stYnV0MDQuZ2lmIiBuYW1lPSJzdWJtaXQiIGFsdD0iTWFrZSBhIGRvbmF0 aW9uIHRvIE5hdGhhbiBBcnRodXIiIC8+PGltZyBhbHQ9IiIgYm9yZGVyPSIwIiBzcmM9Imh0 dHBzOi8vd3d3LnBheXBhbC5jb20vZW5fVVMvaS9zY3IvcGl4ZWwuZ2lmIiB3aWR0aD0iMSIg aGVpZ2h0PSIxIiAvPjxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9ImVuY3J5cHRlZCIgdmFs dWU9Ii0tLS0tQkVHSU4gUEtDUzctLS0tLU1JSUhUd1lKS29aSWh2Y05BUWNFb0lJSFFEQ0NC endDQVFFeGdnRXdNSUlCTEFJQkFEQ0JsRENCampFTE1Ba0dBMVVFQmhNQ1ZWTXhDekFKQmdO VkJBZ1RBa05CTVJZd0ZBWURWUVFIRXcxTmIzVnVkR0ZwYmlCV2FXVjNNUlF3RWdZRFZRUUtF d3RRWVhsUVlXd2dTVzVqTGpFVE1CRUdBMVVFQ3hRS2JHbDJaVjlqWlhKMGN6RVJNQThHQTFV RUF4UUliR2wyWlY5aGNHa3hIREFhQmdrcWhraUc5dzBCQ1FFV0RYSmxRSEJoZVhCaGJDNWpi MjBDQVFBd0RRWUpLb1pJaHZjTkFRRUJCUUFFZ1lDOGkxVDI3bGpLZnBOVEVRaTB3S0hjZEd1 bHh4a01xd2RDTW1iR3ZzODduLzRUc0p0aUFzcU1vMmh5czdac0d5NVJGL083cytCMm9RNzZ6 VWxUNTJXVzdRZVhVSzNHcDBucjJjUDNpb0JTdE51K1JaNmprYW0yRTBGR0xYeVY2K1VOVkVP d2g4bG1vSVNSb3R2U3ZJZ1F5VExuRWVESHFHOXF2VXpxdkYzU3FqRUxNQWtHQlNzT0F3SWFC UUF3Z2N3R0NTcUdTSWIzRFFFSEFUQVVCZ2dxaGtpRzl3MERCd1FJcG1QWnJsclpmWm1BZ2Fp ZVBWYituOXNWZHN1ZmdHcm1BdzJyWEF6UjM5a1lxUFVKN24wTGlORG1kQXE3M0pvUDUza1p5 OGdTcG92dWNMMlMwakMxc1hyY3BFTEFwTEw4QkZTSGZkTGlab1pTVi9DWU9wcEg1K2R4Mllx RklkeUNDZGpJWDdvT1BnUXlBdWdSYTJRcjNiK3l1dHVHMERGc2QrTEFKR2I4bDRDbm5yYm13 ZFlLM05uVkRCUE9teEVPamxYVWdFemxGTFhtRTN3NStNb1BLUWNwMm44ZmRKTHNnRzE1eG9W UEZ6Q2QvSzJnZ2dPSE1JSURnekNDQXV5Z0F3SUJBZ0lCQURBTkJna3Foa2lHOXcwQkFRVUZB RENCampFTE1Ba0dBMVVFQmhNQ1ZWTXhDekFKQmdOVkJBZ1RBa05CTVJZd0ZBWURWUVFIRXcx TmIzVnVkR0ZwYmlCV2FXVjNNUlF3RWdZRFZRUUtFd3RRWVhsUVlXd2dTVzVqTGpFVE1CRUdB MVVFQ3hRS2JHbDJaVjlqWlhKMGN6RVJNQThHQTFVRUF4UUliR2wyWlY5aGNHa3hIREFhQmdr cWhraUc5dzBCQ1FFV0RYSmxRSEJoZVhCaGJDNWpiMjB3SGhjTk1EUXdNakV6TVRBeE16RTFX aGNOTXpVd01qRXpNVEF4TXpFMVdqQ0JqakVMTUFrR0ExVUVCaE1DVlZNeEN6QUpCZ05WQkFn VEFrTkJNUll3RkFZRFZRUUhFdzFOYjNWdWRHRnBiaUJXYVdWM01SUXdFZ1lEVlFRS0V3dFFZ WGxRWVd3Z1NXNWpMakVUTUJFR0ExVUVDeFFLYkdsMlpWOWpaWEowY3pFUk1BOEdBMVVFQXhR SWJHbDJaVjloY0dreEhEQWFCZ2txaGtpRzl3MEJDUUVXRFhKbFFIQmhlWEJoYkM1amIyMHdn Wjh3RFFZSktvWklodmNOQVFFQkJRQURnWTBBTUlHSkFvR0JBTUZIVHQzOFJNeExYSnlPMlNt UytOZGw3MlQ3b0tKNHU0dXcrNmF3bnRBTFdoMDNQZXdtSUp1emJBTFNjc1RTNHNab1MxZktj aUJHb2gxMWdJZkh6eWx2a2ROZS9oSmw2Ni9SR3FyajVyRmIwOHNBQUJOVHpEVGlxcU5wSmVC c1lzL2MyYWlHb3pwdFgyUmxuQmt0SCtTVU5wQWFqVzcyNE52Mld2aGlmNnNGQWdNQkFBR2pn ZTR3Z2Vzd0hRWURWUjBPQkJZRUZKYWZmTHZHYnhlOVdUOVMxd29iN0JEV1pKUnJNSUc3QmdO VkhTTUVnYk13Z2JDQUZKYWZmTHZHYnhlOVdUOVMxd29iN0JEV1pKUnJvWUdVcElHUk1JR09N UXN3Q1FZRFZRUUdFd0pWVXpFTE1Ba0dBMVVFQ0JNQ1EwRXhGakFVQmdOVkJBY1REVTF2ZFc1 MFlXbHVJRlpwWlhjeEZEQVNCZ05WQkFvVEMxQmhlVkJoYkNCSmJtTXVNUk13RVFZRFZRUUxG QXBzYVhabFgyTmxjblJ6TVJFd0R3WURWUVFERkFoc2FYWmxYMkZ3YVRFY01Cb0dDU3FHU0li M0RRRUpBUllOY21WQWNHRjVjR0ZzTG1OdmJZSUJBREFNQmdOVkhSTUVCVEFEQVFIL01BMEdD U3FHU0liM0RRRUJCUVVBQTRHQkFJRmZPbGFhZ0ZybDcxK2pxNk9LaWRiV0ZTRStRNEZxUk92 ZGdJT050aCs4a1NLLy9ZLzRpaHVFNFltdnpuNWNlRTNTL2lCU1FRTWp5dmIrczJUV2JRWUR3 Y3AxMjlPUEliRDllcGRyNHRKT1VOaVNvanc3Qkh3WVJpUGg1OFMxeEdsRmdIRlh3ckVCYjNk Z05iTVVhK3U0cWVjdHNNQVhwVkhuRDl3SXlmbUhNWUlCbWpDQ0FaWUNBUUV3Z1pRd2dZNHhD ekFKQmdOVkJBWVRBbFZUTVFzd0NRWURWUVFJRXdKRFFURVdNQlFHQTFVRUJ4TU5UVzkxYm5S aGFXNGdWbWxsZHpFVU1CSUdBMVVFQ2hNTFVHRjVVR0ZzSUVsdVl5NHhFekFSQmdOVkJBc1VD bXhwZG1WZlkyVnlkSE14RVRBUEJnTlZCQU1VQ0d4cGRtVmZZWEJwTVJ3d0dnWUpLb1pJaHZj TkFRa0JGZzF5WlVCd1lYbHdZV3d1WTI5dEFnRUFNQWtHQlNzT0F3SWFCUUNnWFRBWUJna3Fo a2lHOXcwQkNRTXhDd1lKS29aSWh2Y05BUWNCTUJ3R0NTcUdTSWIzRFFFSkJURVBGdzB3T0RB M01ETXdOREUwTVRKYU1DTUdDU3FHU0liM0RRRUpCREVXQkJUMHRrajRkWkxlL0U0UXdiaWIy OVhFZEh4QVlqQU5CZ2txaGtpRzl3MEJBUUVGQUFTQmdMNUpzUUhqUTlTZzRZM2VEV0tETzE2 cit0ZkV6NFJZQUR0KzZoOTgxZmtWQ3hmTkhGRHhvZkRjeHl6Uk1Zcjd5OTVjZG5WaTRBTlF3 TVVZNnlKVzVqbS9HRDE3cmpnU3haTUV2c0FlNlljQ1NMSzVaYXBDdzFxbHlTcFBHWkJBM01U dDZPRCtvdlZvYS8xdjhDTnNFY0hwN2Y0dE94T1VTdzVQNG5IeUxQV2otLS0tLUVORCBQS0NT Ny0tLS0tIj48L2Zvcm0+PC9kaXY+JwoJCQkJKSkuCgkJCWVuZFRhYmxlKCkuCgkJJzwvdGQ+ PC90cj4nLmVuZFRhYmxlKCkuCgknPC90ZD48dGQ+Jy4KCQlzdGFydFRhYmxlKCdsYXlvdXQn LCAnJywgJycsICcxMHB4JykuJzx0cj48dGQgc3R5bGU9ImJvcmRlci1ib3R0b206MnB4IHNv bGlkIGdyYXk7d2lkdGg6NDAwcHgiPic7CgoJCWlmICgkcmVzdWx0cykgewoJCQllY2hvIHN0 YXJ0VGFibGUoJ2xpc3QnLCAnJywgJycsICcnLCAnMTAwJScpLgoJCQkJdHIoaENlbGwoZ1R4 dCgnUmVzdWx0cycpKSkuCgkJCQl0cih0ZGEoJHJlc3VsdHMpLCAnIHN0eWxlPSJjb2xvcjpy ZWQiJykuCgkJCWVuZFRhYmxlKCk7CgkJCWVjaG8gJzwvdGQ+PC90cj48dHI+PHRkIHN0eWxl PSJib3JkZXItYm90dG9tOjJweCBzb2xpZCBncmF5Ij4nOwoJCX0KCgoJCWVjaG8gc3RhcnRU YWJsZSgnbGlzdCcsICcnLCAnJywgJycsICcxMDAlJykuCgkJCXRyKHRhZyhnVHh0KCdBcnRp Y2xlIFRhZyBNYWludGVuYW5jZScpLicgKCcuZ1R4dCgnQ2FzZSBTZW5zaXRpdmUnKS4nISkn LCAndGgnLCAnIGNvbHNwYW49IjUiJykpLgoJCQl0cigKCQkJCWZvcm0oCgkJCQkJdGRhKGdU eHQoJ1JlbmFtZScpLic6ICcsICcgc3R5bGU9InZlcnRpY2FsLWFsaWduOm1pZGRsZSInKS4K CQkJCQl0ZCh0ZXh0X2lucHV0KCdtYXRjaHRhZycsICcnLCAnMTUnKSkuCgkJCQkJdGRhKGdU eHQoJ3RvJykuJzonLCAnIHN0eWxlPSJ2ZXJ0aWNhbC1hbGlnbjptaWRkbGUiJykuCgkJCQkJ dGQodGV4dF9pbnB1dCgncmVwbGFjZXRhZycsICcnLCAnMTUnKSkuCgkJCQkJdGQoZklucHV0 KCdzdWJtaXQnLCAncmVwbGFjZScsIGdUeHQoJ1J1bicpLCAncHVibGlzaCcpLmVJbnB1dCgn dHJ1X3RhZ3MnKSksCgkJCQkJJycsICcgdmVyaWZ5KFwnJyAuIGdUeHQoJ2FyZV95b3Vfc3Vy ZScpIC4gJ1wnKSInCgkJCQkpCgkJCSkuCgkJCXRyKAoJCQkJZm9ybSgKCQkJCQl0ZGEoZ1R4 dCgnRGVsZXRlJykuJzogJywgJyBzdHlsZT0idmVydGljYWwtYWxpZ246bWlkZGxlIicpLgoJ CQkJCXRkKHRleHRfaW5wdXQoJ2RlbGV0ZXRhZycsICcnLCAnMTUnKSkuCgkJCQkJdGRjcygn JywgMikuCgkJCQkJdGQoZklucHV0KCdzdWJtaXQnLCAnZGVsZXRlJywgZ1R4dCgnUnVuJyks ICdwdWJsaXNoJykuZUlucHV0KCd0cnVfdGFncycpKSwKCQkJCQknJywgJyB2ZXJpZnkoXCcn IC4gZ1R4dCgnYXJlX3lvdV9zdXJlJykgLiAnXCcpIicKCQkJCSkKCQkJKS4KCQllbmRUYWJs ZSgpOwoKCWVjaG8gJzwvdGQ+PC90cj48dHI+PHRkIHN0eWxlPSJib3JkZXItYm90dG9tOjJw eCBzb2xpZCBncmF5Ij4nOwoKCQllY2hvIHN0YXJ0VGFibGUoJ2xpc3QnLCAnJywgJycsICcn LCAnMTAwJScpLgoJCQl0cih0YWcoZ1R4dCgnUmVkaXJlY3Rpb25zJyksICd0aCcsICcgY29s c3Bhbj0iNCInKSk7CgkJCWZvcmVhY2ggKCRyZWRpcmVjdHMgYXMgJGxlZnR0YWcgPT4gJHJp Z2h0dGFnKSB7CgkJCQllY2hvIHRyKAoJCQkJCXRkYShocmVmKCRsZWZ0dGFnLCB0cnVfdGFn c19saW5raWZ5X3RhZygkbGVmdHRhZykpLCAnIHN0eWxlPSJ0ZXh0LWFsaWduOiBjZW50ZXIi JykuCgkJCQkJdGRhKGh0bWxzcGVjaWFsY2hhcnMoJz0+JyksICcgc3R5bGU9InRleHQtYWxp Z246IGNlbnRlciInKS4KCQkJCQl0ZGEoaHJlZigkcmlnaHR0YWcsIHRydV90YWdzX2xpbmtp ZnlfdGFnKCRyaWdodHRhZykpLCAnIHN0eWxlPSJ0ZXh0LWFsaWduOiBjZW50ZXIiJykuCgkJ CQkJdGQoJzxhIGhyZWY9ImluZGV4LnBocD9ldmVudD10cnVfdGFncyZhbXA7ZGVsZXRlX3Jl ZGlyZWN0PScudXJsZW5jb2RlKCRsZWZ0dGFnKS4nIiAgb25jbGljaz0icmV0dXJuIHZlcmlm eShcJycuZ1R4dCgnYXJlX3lvdV9zdXJlJykuJ1wnKSI+RGVsZXRlPC9hPicpCgkJCQkpOwoJ CQl9CgkJCWVjaG8gdHIoCgkJCQknPGZvcm0gbmFtZT0icmVkaXJlY3QiIGlkPSJyZWRpcmVj dCIgbWV0aG9kPSJwb3N0IiBhY3Rpb249ImluZGV4LnBocD9ldmVudD10cnVfdGFncyIgb25z dWJtaXQ9InJldHVybiB2ZXJpZnkoXCcnLmdUeHQoJ2FyZV95b3Vfc3VyZScpLidcJykiPicu CgkJCQkJdGRhKHRleHRfaW5wdXQoJ2xlZnR0YWcnLCAnJywgJzE1JyksICcgc3R5bGU9InRl eHQtYWxpZ246Y2VudGVyIicpLgoJCQkJCXRkYShodG1sc3BlY2lhbGNoYXJzKCc9PicpLCAn IHN0eWxlPSJ2ZXJ0aWNhbC1hbGlnbjptaWRkbGU7dGV4dC1hbGlnbjpjZW50ZXIiJykuCgkJ CQkJdGRhKHRleHRfaW5wdXQoJ3JpZ2h0dGFnJywgJycsICcxNScpLCAnIHN0eWxlPSJ0ZXh0 LWFsaWduOmNlbnRlciInKS4KCQkJCQl0ZGEoJzxhIGhyZWY9IiMiIG9uY2xpY2s9ImlmICh2 ZXJpZnkoXCcnLmdUeHQoJ2FyZV95b3Vfc3VyZScpLidcJykpIGRvY3VtZW50LmdldEVsZW1l bnRCeUlkKFwncmVkaXJlY3RcJykuc3VibWl0KCk7IHJldHVybiBmYWxzZTsiPkFkZCBuZXc8 L2E+JywgJyBzdHlsZT0idmVydGljYWwtYWxpZ246bWlkZGxlIicpLgoJCQkJCWZJbnB1dCgn aGlkZGVuJywgJ3JlZGlyZWN0JywgJzEnKS4KCQkJCSc8L2Zvcm0+JwoKCQkJKS4KCQllbmRU YWJsZSgpOwoKCWVjaG8gJzwvdGQ+PC90cj48dHI+PHRkPic7CgoJCWVjaG8gc3RhcnRUYWJs ZSgnbGlzdCcpLgoJCQl0cih0YWcoZ1R4dCgnUHJlZmVyZW5jZXMnKSwgJ3RoJywgJyBjb2xz cGFuPSIyIicpKS4KCQkJZm9ybSgKCQkJCXRyKAoJCQkJCXRkYShnVHh0KCdVc2UgY2xlYW4g VVJMcycpLicgKCcuZ1R4dCgnc2l0ZSBkZWZhdWx0IGlzJykuJyAnLiR0cnVfdGFnc19wcmVm c1tDTEVBTl9VUkxTXS0+ZGVmYXVsdF92YWx1ZS4nKTogJywgJyBzdHlsZT0idmVydGljYWwt YWxpZ246bWlkZGxlIicpLgoJCQkJCXRkKHJhZGlvX2xpc3QoQ0xFQU5fVVJMUywKCQkJCQkJ CWFycmF5KCdjbGVhbic9PmdUeHQoJ2NsZWFuJyksICdtZXNzeSc9PmdUeHQoJ21lc3N5Jykp LAoJCQkJCQkJJHRydV90YWdzX3ByZWZzW0NMRUFOX1VSTFNdLT52YWx1ZSkpCgkJCQkpLgoJ CQkJdHIoCgkJCQkJdGRhKGdUeHQoJ1RhZyBzZWN0aW9uIG5hbWUnKS4nIChkZWZhdWx0IGlz ICInLiR0cnVfdGFnc19wcmVmc1tUQUdfU0VDVElPTl0tPmRlZmF1bHRfdmFsdWUuJyIpOiAn LCAnIHN0eWxlPSJ2ZXJ0aWNhbC1hbGlnbjptaWRkbGUiJykuCgkJCQkJdGQodGV4dF9pbnB1 dChUQUdfU0VDVElPTiwgJHRydV90YWdzX3ByZWZzW1RBR19TRUNUSU9OXS0+dmFsdWUsICcx NScpKQoJCQkJKS4KCQkJCXRyKAoJCQkJCXRkYShnVHh0KCdVUkwgcGFyYW1ldGVyIGZvciB0 YWcgc2VhcmNoJykuJyAoZGVmYXVsdCBpcyAiJy4kdHJ1X3RhZ3NfcHJlZnNbUEFSTV9OQU1F XS0+ZGVmYXVsdF92YWx1ZS4nIik6ICcuCgkJCQkJCSc8YnI+PGVtPih5b3Ugc2hvdWxkblwn dCBjaGFuZ2UgdGhpcyB1bmxlc3MgeW91IHJlYWxseSBrbm93IHdoYXQgeW91IGFyZSBkb2lu Zyk8L2VtPicsICcgc3R5bGU9InZlcnRpY2FsLWFsaWduOm1pZGRsZSInKS4KCQkJCQl0ZCh0 ZXh0X2lucHV0KFBBUk1fTkFNRSwgJHRydV90YWdzX3ByZWZzW1BBUk1fTkFNRV0tPnZhbHVl LCAnMTUnKSkKCQkJCSkuCgkJCQl0cigKCQkJCQl0ZGEoZ1R4dCgnUHV0IHRhZ3MgaW50byBS U1MvQXRvbSBmZWVkcywgaW4gIkNhdGVnb3J5IiBlbGVtZW50cycpLgoJCQkJCQknOiA8YnI+ PGVtPih5b3UgcHJvYmFibHkgd2FudCB0aGlzKTwvZW0+JywgJyBzdHlsZT0idmVydGljYWwt YWxpZ246bWlkZGxlIicpLgoJCQkJCXRkKHllc25vUmFkaW8oVEFHU19JTl9GRUVEX0NBVEVH T1JJRVMsICR0cnVfdGFnc19wcmVmc1tUQUdTX0lOX0ZFRURfQ0FURUdPUklFU10tPnZhbHVl KSkKCQkJCSkuCgkJCQl0cigKCQkJCQl0ZGEoJ0FwcGVuZCB0aGUgdGFnIGxpc3QgdG8gdGhl IGJvZHkgb2YgUlNTL0F0b20gZmVlZHMsICcuCgkJCQkJCSd3aXRoIGxpbmtzLCBhbmQgd2l0 aCByZWw9InRhZyI6Jy4KCQkJCQkJJzxicj48ZW0+KGlmIHRoaXMgaXMgdHVybmVkIG9uLCcu CgkJCQkJCSd5b3UgY2FuIGRlZmluZSBhICJtaXNjIiBmb3JtIG5hbWVkIHRydV90YWdzX2Zl ZWRfdGFncyAnLgoJCQkJCQkndGhhdCB3aWxsIGJlIHVzZWQgdG8gcmVuZGVyIHRoZSB0YWdz IGluIHRoZSBmZWVkKTwvZW0+JywKCQkJCQkJJyBzdHlsZT0idmVydGljYWwtYWxpZ246bWlk ZGxlIicpLgoJCQkJCXRkKHllc25vUmFkaW8oVEFHU19JTl9GRUVEX0JPRFksICR0cnVfdGFn c19wcmVmc1tUQUdTX0lOX0ZFRURfQk9EWV0tPnZhbHVlKSkKCQkJCSkuCgkJCQl0cigKCQkJ CQl0ZGEoZ1R4dCgnU2hvdyBhIGNsaWNrYWJsZSBsaXN0IG9mIHRhZ3Mgb24gdGhlICJXcml0 ZSIgcGFnZScpLic6ICcsCgkJCQkJCScgc3R5bGU9InZlcnRpY2FsLWFsaWduOm1pZGRsZSIn KS4KCQkJCQl0ZCh5ZXNub1JhZGlvKFRBR1NfSU5fV1JJVEVfVEFCLCAkdHJ1X3RhZ3NfcHJl ZnNbVEFHU19JTl9XUklURV9UQUJdLT52YWx1ZSkpCgkJCQkpLgoJCQkJdHIoCgkJCQkJdGRh KGdUeHQoJ0F1dG9jb21wbGV0ZSB0YWdzIG9uIHRoZSAiV3JpdGUiIHBhZ2UnKS4nOiA8YnI+ Jy4KCQkJCQkJJzxlbT4ocmVxdWlyZXMgdGhhdCB0aGUgPGEgaHJlZj0iaHR0cDovL2Jhc3Np c3RhbmNlLmRlL2pxdWVyeS1wbHVnaW5zL2pxdWVyeS1wbHVnaW4tYXV0b2NvbXBsZXRlLyI+ alF1ZXJ5IEF1dG9jb21wbGV0ZSBwbHVnaW48L2E+IDxjb2RlPi5jc3M8L2NvZGU+IGFuZCA8 Y29kZT4ubWluLmpzPC9jb2RlPiBmaWxlcyBiZSB1cGxvYWRlZCBpbnRvIGEgIjxjb2RlPmpz PC9jb2RlPiIgZm9sZGVyIG9uIHlvdXIgc2l0ZSk8L2VtPicsCgkJCQkJCScgc3R5bGU9InZl cnRpY2FsLWFsaWduOm1pZGRsZSInKS4KCQkJCQl0ZCh5ZXNub1JhZGlvKEFVVE9DT01QTEVU RV9JTl9XUklURV9UQUIsICR0cnVfdGFnc19wcmVmc1tBVVRPQ09NUExFVEVfSU5fV1JJVEVf VEFCXS0+dmFsdWUpKQoJCQkJKS4KCQkJCXRyKAoJCQkJCXRkYShnVHh0KCdDb252ZXJ0IHRh Z3MgdG8gbG93ZXJjYXNlIGJ5IGRlZmF1bHQnKS4nOiA8YnI+Jy4KCQkJCQkJJzxlbT4oeW91 IHByb2JhYmx5IHdhbnQgdGhpcywgdW5sZXNzIHlvdSBhcmUgaGF2aW5nIHByb2JsZW1zIHdp dGggdXRmLTggY2hhcmFjdGVycyk8L2VtPicsCgkJCQkJCScgc3R5bGU9InZlcnRpY2FsLWFs aWduOm1pZGRsZSInKS4KCQkJCQl0ZCh5ZXNub1JhZGlvKFVURl84X0NBU0UsICR0cnVfdGFn c19wcmVmc1tVVEZfOF9DQVNFXS0+dmFsdWUpKQoJCQkJKS4KCQkJCXRyKAoJCQkJCXRkKCcn KS4KCQkJCQl0ZGEoZklucHV0KCdzdWJtaXQnLCAncHJlZnMnLCBnVHh0KCdTYXZlJyksICdw dWJsaXNoJykuZUlucHV0KCd0cnVfdGFncycpLCAnIHN0eWxlPSJ0ZXh0LWFsaWduOnJpZ2h0 IicpCgkJCQkpLAoJCQkJJycsICcgdmVyaWZ5KFwnJyAuIGdUeHQoJ2FyZV95b3Vfc3VyZScp IC4gJ1wnKSInCgkJCSkuCgkJZW5kVGFibGUoKS4nPC90ZD48L3RyPicuCgkJZW5kVGFibGUo KTsKCgllY2hvICc8L3RkPjwvdHI+Jy5lbmRUYWJsZSgpOwp9CgoKZnVuY3Rpb24gdHJ1X3Rh Z3NfYWRtaW5fdGFiX2hhbmRsZV9pbnB1dCgpIHsKCWlmIChncHMoJ3ByZWZzJykpIHsKCQly ZXR1cm4gdHJ1X3RhZ3NfYWRtaW5fdXBkYXRlX3ByZWZzKCk7Cgl9IGVsc2UgaWYgKGdwcygn ZGVsZXRlJykpIHsKCQlyZXR1cm4gdHJ1X3RhZ3NfYWRtaW5fZGVsZXRlX3RhZyhncHMoJ2Rl bGV0ZXRhZycpKTsKCX0gZWxzZSBpZiAoZ3BzKCdyZXBsYWNlJykpIHsKCQkkcmVzdWx0ID0g dHJ1X3RhZ3NfYWRtaW5fcmVwbGFjZV90YWcoZ3BzKCdtYXRjaHRhZycpLCBncHMoJ3JlcGxh Y2V0YWcnKSwgZmFsc2UpOwoJCXJldHVybiAkcmVzdWx0IC4gJzxicj4nIC4gdHJ1X3RhZ3Nf YWRtaW5fcmVkaXJlY3RfdGFnKGdwcygnbWF0Y2h0YWcnKSwgZ3BzKCdyZXBsYWNldGFnJykp OwoJfSBlbHNlIGlmIChncHMoJ3JlZGlyZWN0JykpIHsKCQlyZXR1cm4gdHJ1X3RhZ3NfYWRt aW5fcmVkaXJlY3RfdGFnKGdwcygnbGVmdHRhZycpLCBncHMoJ3JpZ2h0dGFnJykpOwoJfSBl bHNlIGlmIChncHMoJ2RlbGV0ZV9yZWRpcmVjdCcpKSB7CgkJcmV0dXJuIHRydV90YWdzX2Fk bWluX2RlbGV0ZV9yZWRpcmVjdChncHMoJ2RlbGV0ZV9yZWRpcmVjdCcpKTsKCX0gZWxzZSB7 CgkJcmV0dXJuICcnOwoJfQp9CgoKZnVuY3Rpb24gdHJ1X3RhZ3NfYWRtaW5fdXBkYXRlX3By ZWZzKCkgewoJZ2xvYmFsICR0cnVfdGFnc19wcmVmczsKCSRyZXN1bHRzID0gYXJyYXkoKTsK CWZvcmVhY2ggKCR0cnVfdGFnc19wcmVmcyBhcyAkcHJlZikgewoJCSR2YWxpZF92YWx1ZSA9 ICRwcmVmLT52YWxpZGF0ZV92YWx1ZShncHMoJHByZWYtPm5hbWUpKTsKCQlpZiAoJHZhbGlk X3ZhbHVlICYmICR2YWxpZF92YWx1ZSA8PiBncHMoJHByZWYtPm5hbWUpKSB7CgkJCXJldHVy biAkdmFsaWRfdmFsdWU7ICAjIyMgdGhpcyBpcyBhIHNuZWFreSB3YXkgdG8gaGFuZGxlIHZh bGlkYXRpb24gLSBzb3JyeSA7KQoJCX0KCQlpZiAoJHZhbGlkX3ZhbHVlIDw+ICRwcmVmLT52 YWx1ZSkgewoJCQlpZiAoJHZhbGlkX3ZhbHVlID09ICRwcmVmLT5kZWZhdWx0X3ZhbHVlKSB7 CgkJCQkkcmVzdWx0ID0gdHJ1X3RhZ3NfZGVsZXRlX3ByZWYoJHByZWYtPm5hbWUpOwoJCQl9 IGVsc2UgewoJCQkJJHJlc3VsdCA9IHRydV90YWdzX3Vwc2VydF9wcmVmKCRwcmVmLT5uYW1l LCAkdmFsaWRfdmFsdWUpOwoJCQl9CgkJCWlmICgkcmVzdWx0KSB7CgkJCQkkcmVzdWx0c1td ID0gJ1VwZGF0ZWQgJyAuICRwcmVmLT5uYW1lOwoJCQkJJHByZWYtPnZhbHVlID0gJHZhbGlk X3ZhbHVlOwoJCQl9IGVsc2UgewoJCQkJJHJlc3VsdHNbXSA9ICdFcnJvciB1cGRhdGluZyAn IC4gJHByZWYtPm5hbWU7CgkJCX0KCQl9Cgl9CglpZiAoY291bnQoJHJlc3VsdHMpID09IDAp IHsKCQlyZXR1cm4gJ05vIHJlY29yZHMgbmVlZCB1cGRhdGluZyc7Cgl9IGVsc2UgewoJCXJl dHVybiBqb2luKCc8YnI+JywgJHJlc3VsdHMpOwoJfQp9CgoKZnVuY3Rpb24gdHJ1X3RhZ3Nf dXBzZXJ0X3ByZWYoJG5hbWUsICR2YWx1ZSkgewoJaWYgKCFzYWZlX3F1ZXJ5KCdjcmVhdGUg dGFibGUgaWYgbm90IGV4aXN0cyAnIC4gc2FmZV9wZngoJ3RydV90YWdzX3ByZWZzJykuCgkJ JyAobmFtZSB2YXJjaGFyKDI1NSkgcHJpbWFyeSBrZXksICcuCgkJJ3ZhbHVlIHZhcmNoYXIo MjU1KSBub3QgbnVsbCknKSkgewoJCXJldHVybiAnU2VyaW91cyBlcnJvciAtIHVuYWJsZSB0 byBjcmVhdGUgdGhlICcgLiBzYWZlX3BmeCgndHJ1X3RhZ3NfcHJlZnMnKSAuICcgdGFibGUu JzsKCX0KCglyZXR1cm4gc2FmZV91cHNlcnQoJ3RydV90YWdzX3ByZWZzJywgJ3ZhbHVlPSIn LiR2YWx1ZS4nIicsICduYW1lPSInLiRuYW1lLiciJyk7Cn0KCgpmdW5jdGlvbiB0cnVfdGFn c19kZWxldGVfcHJlZigkbmFtZSkgewoJaWYgKHNhZmVfZGVsZXRlKCd0cnVfdGFnc19wcmVm cycsICduYW1lPSInLiRuYW1lLiciJykpIHsKCQlpZiAoc2FmZV9jb3VudCgndHJ1X3RhZ3Nf cHJlZnMnLCAnMScpID09IDAgJiYgIXNhZmVfcXVlcnkoJ2Ryb3AgdGFibGUgJyAuIHNhZmVf cGZ4KCd0cnVfdGFnc19wcmVmcycpKSkgewoJCQlyZXR1cm4gZmFsc2U7CgkJfQoJCXJldHVy biB0cnVlOwoJfSBlbHNlIHsKCQlyZXR1cm4gZmFsc2U7Cgl9Cn0KCgpmdW5jdGlvbiB0cnVf dGFnc19hZG1pbl9kZWxldGVfdGFnKCRkZWxldGV0YWcpIHsKCWlmICh0cmltKCRkZWxldGV0 YWcpKSB7CgkJcmV0dXJuIHRydV90YWdzX2FkbWluX3JlcGxhY2VfdGFnKCRkZWxldGV0YWcs ICcnLCB0cnVlKTsKCX0gZWxzZSB7CgkJcmV0dXJuICdQbGVhc2UgZW50ZXIgYSB2YWx1ZSc7 Cgl9Cn0KCgpmdW5jdGlvbiB0cnVfdGFnc19hZG1pbl9yZXBsYWNlX3RhZygkbWF0Y2h0YWcs ICRyZXBsYWNldGFnLCAkYWxsb3dfYmxhbmtfcmVwbGFjZXRhZykgewoJJG1hdGNodGFnID0g dHJpbSgkbWF0Y2h0YWcpOwoJJHJlcGxhY2V0YWcgPSB0cmltKCRyZXBsYWNldGFnKTsKCWlm ICgkbWF0Y2h0YWcgJiYgKCRhbGxvd19ibGFua19yZXBsYWNldGFnIHx8ICRyZXBsYWNldGFn KSkgewoJCWlmIChzYWZlX3VwZGF0ZSgndGV4dHBhdHRlcm4nLCBUUlVfVEFHU19GSUVMRC4n PXRyaW0oYm90aCBcJyxcJyBmcm9tIHJlcGxhY2UoY29uY2F0KCIsIiwgJy5UUlVfVEFHU19G SUVMRC4nLCAiLCIpLCBjb25jYXQoIiwiLCBcJycuYWRkc2xhc2hlcygkbWF0Y2h0YWcpLidc JywgIiwiKSwgXCcsJy5hZGRzbGFzaGVzKCRyZXBsYWNldGFnKS4nLFwnKSknLCAnMScpKSB7 CgkJCXJldHVybiAnVXBkYXRlZCAnLm15c3FsX2FmZmVjdGVkX3Jvd3MoKS4nIHJvd3MgKCIn Lmh0bWxzcGVjaWFsY2hhcnMoJG1hdGNodGFnKS4nIj0+IicuaHRtbHNwZWNpYWxjaGFycygk cmVwbGFjZXRhZykuJyIpJzsKCQl9IGVsc2UgewoJCQlyZXR1cm4gJ0Vycm9yOiAnIC4gbXlz cWxfZXJyb3IoKTsKCQl9Cgl9IGVsc2UgewoJCXJldHVybiAnUGxlYXNlIGVudGVyIGEgdmFs dWUgaW4gYm90aCBmaWVsZHMnOwoJfQp9CgoKZnVuY3Rpb24gdHJ1X3RhZ3NfYWRtaW5fcmVk aXJlY3RfdGFnKCRsZWZ0dGFnLCAkcmlnaHR0YWcpIHsKCSRsZWZ0dGFnID0gYWRkc2xhc2hl cyh0cnVfdGFnc19zdHJ0b2xvd2VyKHRyaW0oJGxlZnR0YWcpKSk7CgkkcmlnaHR0YWcgPSBh ZGRzbGFzaGVzKHRydV90YWdzX3N0cnRvbG93ZXIodHJpbSgkcmlnaHR0YWcpKSk7CglpZiAo ISRsZWZ0dGFnIHx8ICEkcmlnaHR0YWcpIHsKCQlyZXR1cm4gJ1BsZWFzZSBlbnRlciBhIHZh bHVlIGluIGJvdGggZmllbGRzJzsKCX0KCglpZiAoIXNhZmVfcXVlcnkoJ2NyZWF0ZSB0YWJs ZSBpZiBub3QgZXhpc3RzICcgLiBzYWZlX3BmeCgndHJ1X3RhZ3NfcmVkaXJlY3RzJykuCgkJ JyAobGVmdHRhZyB2YXJjaGFyKDI1NSkgcHJpbWFyeSBrZXksICcuCgkJJ3JpZ2h0dGFnIHZh cmNoYXIoMjU1KSBub3QgbnVsbCknKSkgewoJCXJldHVybiAnU2VyaW91cyBlcnJvciAtIHVu YWJsZSB0byBjcmVhdGUgdGhlICcgLiBzYWZlX3BmeCgndHJ1X3RhZ3NfcmVkaXJlY3RzJykg LiAnIHRhYmxlLic7Cgl9CgoJaWYgKHNhZmVfaW5zZXJ0KCd0cnVfdGFnc19yZWRpcmVjdHMn LCAnbGVmdHRhZz0iJy4kbGVmdHRhZy4nIixyaWdodHRhZz0iJy4kcmlnaHR0YWcuJyInKSkg ewoJCXJldHVybiAnUmVkaXJlY3QgYWRkZWQgKCInLmh0bWxzcGVjaWFsY2hhcnMoJGxlZnR0 YWcpLiciPT4iJy5odG1sc3BlY2lhbGNoYXJzKCRyaWdodHRhZykuJyIpIC0gcGxlYXNlIHRl c3QgaXQhJzsKCX0gZWxzZSB7CgkJcmV0dXJuICdFcnJvciBhZGRpbmcgcmVjb3JkIC0gZG9l cyBpdCBhbHJlYWR5IGV4aXN0Pyc7Cgl9Cn0KCgpmdW5jdGlvbiB0cnVfdGFnc19hZG1pbl9k ZWxldGVfcmVkaXJlY3QoJGxlZnR0YWcpIHsKCWlmIChzYWZlX2RlbGV0ZSgndHJ1X3RhZ3Nf cmVkaXJlY3RzJywgJ2xlZnR0YWc9IicuYWRkc2xhc2hlcygkbGVmdHRhZykuJyInKSkgewoJ CWlmIChzYWZlX2NvdW50KCd0cnVfdGFnc19yZWRpcmVjdHMnLCAnMScpID09IDAgJiYgIXNh ZmVfcXVlcnkoJ2Ryb3AgdGFibGUgJyAuIHNhZmVfcGZ4KCd0cnVfdGFnc19yZWRpcmVjdHMn KSkpIHsKCQkJcmV0dXJuICdSZWRpcmVjdCBkZWxldGVkLCBidXQgdW5hYmxlIHRvIGRyb3Ag dGFibGUgJyAuIHNhZmVfcGZ4KCd0cnVfdGFnc19yZWRpcmVjdHMnKTsKCQl9CgkJcmV0dXJu ICdSZWRpcmVjdCBkZWxldGVkICgiJy5odG1sc3BlY2lhbGNoYXJzKCRsZWZ0dGFnKS4nIikn OwoJfSBlbHNlIHsKCQlyZXR1cm4gJ0Vycm9yIGRlbGV0aW5nIHJlZGlyZWN0JzsKCX0KfQoK CmZ1bmN0aW9uIHRydV90YWdzX2FkbWluX3dyaXRlX3RhYl9oYW5kbGVyKCRldmVudCwgJHN0 ZXApIHsKCWdsb2JhbCAkdHJ1X3RhZ3NfcHJlZnM7CgkkYXR0cyA9IHRydV90YWdzX2dldF9z dGFuZGFyZF9jbG91ZF9hdHRzKGFycmF5KCksIHRydWUsIHRydWUsIHRydWUpOwoJJGNsb3Vk ID0gYXJyYXlfdW5pcXVlKHRydV90YWdzX2Nsb3VkX3F1ZXJ5KCRhdHRzKSk7CgluYXRjYXNl c29ydCgkY2xvdWQpOwoKCSRpZCA9IChlbXB0eSgkR0xPQkFMU1snSUQnXSkgPyBncHMoJ0lE JykgOiAkR0xPQkFMU1snSUQnXSk7CgkkYXJ0aWNsZV90YWdzID0gKGVtcHR5KCRpZCkgPyBh cnJheSgpIDogdHJ1X3RhZ3NfZ2V0X3RhZ3NfZm9yX2FydGljbGUoJGlkKSk7CgoJJGxpbmtz ID0gYXJyYXkoKTsKCSRyYXdfY2xvdWQgPSAnJzsKCWZvcmVhY2ggKCRjbG91ZCBhcyAkdGFn KSB7CgkJJHN0eWxlID0gKGluX2FycmF5KCR0YWcsICRhcnRpY2xlX3RhZ3MpID8gJyBjbGFz cz0idGFnX2Nob3NlbiInIDogJycpOwoJCSRsaW5rc1tdID0gJzxhIGhyZWY9IiNhZHZhbmNl ZCInLiRzdHlsZS4nIG9uY2xpY2s9InRvZ2dsZUNsYXNzKHRoaXMsIHRvZ2dsZVRhZyhcXFwn Jy5hZGRzbGFzaGVzKGFkZHNsYXNoZXMoaHRtbHNwZWNpYWxjaGFycygkdGFnKSkpLidcXFwn KSk7IHJldHVybiBmYWxzZTsiPicgLiBhZGRzbGFzaGVzKGh0bWxzcGVjaWFsY2hhcnMoJHRh ZykpIC4gJzxcL2E+JzsKCQkkcmF3X2Nsb3VkIC49ICciJyAuIGFkZFNsYXNoZXMoJHRhZykg LiAnIiwnOwoJfQoJJHJhd19jbG91ZCA9IHN1YnN0cigkcmF3X2Nsb3VkLCAwLCBzdHJsZW4o JHJhd19jbG91ZCkgLSAxKTsKCSR0b19pbnNlcnQgPSBqb2luKCcsICcsICRsaW5rcyk7CgoJ aWYgKCR0cnVfdGFnc19wcmVmc1tUQUdTX0lOX1dSSVRFX1RBQl0tPnZhbHVlKSB7CgkJJGpz ID0gPDw8RU9GCgkJCXZhciBrZXl3b3Jkc0ZpZWxkID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5 SWQoJ2tleXdvcmRzJyk7CgkJCWtleXdvcmRzRmllbGQucGFyZW50Tm9kZS5hcHBlbmRDaGls ZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdicicpKTsKCQkJdmFyIGNsb3VkID0gZG9jdW1l bnQuY3JlYXRlRWxlbWVudCgnc3BhbicpOwoJCQlrZXl3b3Jkc0ZpZWxkLnBhcmVudE5vZGUu YXBwZW5kQ2hpbGQoY2xvdWQpOwoJCQljbG91ZC5zZXRBdHRyaWJ1dGUoJ2NsYXNzJywgJ3Ry dV90YWdzX2FkbWluX3RhZ3MnKTsKCQkJY2xvdWQuaW5uZXJIVE1MID0gJ3skdG9faW5zZXJ0 fSc7CgoJCQl2YXIgc3R5bGVFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3R5 bGUnKTsKCQkJc3R5bGVFbGVtZW50LnNldEF0dHJpYnV0ZSgidHlwZSIsICJ0ZXh0L2NzcyIp OwoJCQl2YXIgc3R5bGVUZXh0ID0gJ2EudGFnX2Nob3NlbntiYWNrZ3JvdW5kLWNvbG9yOiAj RkVCOyBjb2xvcjogYmxhY2s7fSc7CgkJCWlmIChzdHlsZUVsZW1lbnQuc3R5bGVTaGVldCkg eyAvL0lFCgkJCQlzdHlsZUVsZW1lbnQuc3R5bGVTaGVldC5jc3NUZXh0ID0gc3R5bGVUZXh0 OwoJCQl9IGVsc2UgewoJCQkJdmFyIHRleHROb2RlID0gZG9jdW1lbnQuY3JlYXRlVGV4dE5v ZGUoc3R5bGVUZXh0KTsKCQkJCXN0eWxlRWxlbWVudC5hcHBlbmRDaGlsZCh0ZXh0Tm9kZSk7 CgkJCX0KCQkJdmFyIGhlYWRFbGVtZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05h bWUoJ2hlYWQnKVswXTsKCQkJaGVhZEVsZW1lbnQuYXBwZW5kQ2hpbGQoc3R5bGVFbGVtZW50 KTsKCgkJCWZ1bmN0aW9uIHRvZ2dsZVRhZyh0YWdOYW1lKSB7CgkJCQl2YXIgcmVnZXhUYWcg PSB0YWdOYW1lLnJlcGxhY2UoLyhbXFxcXFxeXFwkKitbXFxdP3t9Lj0hOih8KV0pL2csIlxc XFwkMSIpOwoJCQkJdmFyIHRhZ1JlZ2V4ID0gbmV3IFJlZ0V4cCgiKChefCwpXFxccyopIiAr IHJlZ2V4VGFnICsgIlxcXHMqKCxcXFxzKnwkKSIpOwoJCQkJdmFyIHRleHRhcmVhID0gZG9j dW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2tleXdvcmRzJyk7CgkJCQl2YXIgY3VydmFsID0gdGV4 dGFyZWEudmFsdWUucmVwbGFjZSgvLD9ccyskLywgJycpOwoJCQkJaWYgKCcnID09IGN1cnZh bCkgewoJCQkJCXRleHRhcmVhLnZhbHVlID0gdGFnTmFtZTsKCQkJCX0gZWxzZSBpZiAoY3Vy dmFsLm1hdGNoKHRhZ1JlZ2V4KSkgewoJCQkJCXRleHRhcmVhLnZhbHVlID0gY3VydmFsLnJl cGxhY2UodGFnUmVnZXgsICckMScpLnJlcGxhY2UoLyw/XHMrJC8sICcnKTsKCQkJCQlyZXR1 cm4gJyc7CgkJCQl9IGVsc2UgaWYgKCcsJyA9PSBjdXJ2YWwuY2hhckF0KGN1cnZhbC5sZW5n dGggLSAxKSkgewoJCQkJCXRleHRhcmVhLnZhbHVlICs9ICcgJyArIHRhZ05hbWU7CgkJCQl9 IGVsc2UgewoJCQkJCXRleHRhcmVhLnZhbHVlICs9ICcsICcgKyB0YWdOYW1lOwoJCQkJfQoJ CQkJcmV0dXJuICd0YWdfY2hvc2VuJzsKCQkJfQoKCQkJZnVuY3Rpb24gdG9nZ2xlQ2xhc3Mo ZWxlbWVudCwgY2xhc3NOYW1lKSB7CgkJCQllbGVtZW50LnNldEF0dHJpYnV0ZSgnY2xhc3Mn LCBjbGFzc05hbWUpOwoJCQkJZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2NsYXNzTmFtZScsIGNs YXNzTmFtZSk7IC8qIGZvciBJRSAqLwoJCQl9CkVPRjsKCQllY2hvIHNjcmlwdF9qcygkanMp OwoJfQoKCWlmICgkdHJ1X3RhZ3NfcHJlZnNbQVVUT0NPTVBMRVRFX0lOX1dSSVRFX1RBQl0t PnZhbHVlKSB7CgkJZWNobyA8PDxFT0YKCQkJPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBl PSJ0ZXh0L2NzcyIgaHJlZj0iLi4vanMvanF1ZXJ5LmF1dG9jb21wbGV0ZS5jc3MiIG1lZGlh PSJwcm9qZWN0aW9uLCBzY3JlZW4iIC8+CgkJCTxzY3JpcHQgc3JjPSIuLi9qcy9qcXVlcnku YXV0b2NvbXBsZXRlLm1pbi5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij48L3NjcmlwdD4K CQkJPHNjcmlwdCBsYW5ndWFnZT0iSmF2YVNjcmlwdCIgdHlwZT0idGV4dC9qYXZhc2NyaXB0 Ij48IS0tCgkJCQkkKGRvY3VtZW50KS5yZWFkeShmdW5jdGlvbigpeyB2YXIgdGFncyA9IG5l dyBBcnJheSh7JHJhd19jbG91ZH0pOwoJCQkJCSQoIiNrZXl3b3JkcyIpLmF1dG9jb21wbGV0 ZSh0YWdzLCB7IG11bHRpcGxlOiB0cnVlLCBtdXN0TWF0Y2g6IGZhbHNlLCBhdXRvRmlsbDog ZmFsc2UgfSk7CgkJCQl9KTsKCQkJLy8tLT48L3NjcmlwdD4KRU9GOwoJfQoKfQoKCiMjIyBB VE9NL1JTUyBGRUVEIEZVTkNUSU9OUyAjIyMKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj IyMjIwoKcmVnaXN0ZXJfY2FsbGJhY2soJ3RydV90YWdzX2F0b21faGFuZGxlcicsICdhdG9t X2VudHJ5Jyk7CmZ1bmN0aW9uIHRydV90YWdzX2F0b21faGFuZGxlcigkZXZlbnQsICRzdGVw KSB7IHJldHVybiB0cnVfdGFnc19mZWVkX2hhbmRsZXIodHJ1ZSk7IH0KcmVnaXN0ZXJfY2Fs bGJhY2soJ3RydV90YWdzX3Jzc19oYW5kbGVyJywgJ3Jzc19lbnRyeScpOwpmdW5jdGlvbiB0 cnVfdGFnc19yc3NfaGFuZGxlcigkZXZlbnQsICRzdGVwKSB7IHJldHVybiB0cnVfdGFnc19m ZWVkX2hhbmRsZXIoZmFsc2UpOyB9CgpmdW5jdGlvbiB0cnVfdGFnc19mZWVkX2hhbmRsZXIo JGF0b20pIHsKCWdsb2JhbCAkdGhpc2FydGljbGUsICR0cnVfdGFnc19wcmVmczsKCWV4dHJh Y3QoJHRoaXNhcnRpY2xlKTsKCgkkdGFncyA9IHRydV90YWdzX2dldF90YWdzX2Zvcl9hcnRp Y2xlKCR0aGlzaWQpOwoKCWlmICgkdHJ1X3RhZ3NfcHJlZnNbVEFHU19JTl9GRUVEX0JPRFld LT52YWx1ZSkgewoJCSRleHRyYWJvZHkgPSAnJzsKCQkkRk9STV9OQU1FID0gJ3RydV90YWdz X2ZlZWRfdGFncyc7CgkJaWYgKGZldGNoKCdmb3JtJywgJ3R4cF9mb3JtJywgJ25hbWUnLCAk Rk9STV9OQU1FKSkgewoJCQkkZm9ybSA9IGZldGNoX2Zvcm0oJEZPUk1fTkFNRSk7CgkJCSRl eHRyYWJvZHkgPSB0cmltKHBhcnNlKCRmb3JtKSk7CgkJfSBlbHNlIHsKCQkJJGF0dHMgPSB0 cnVfdGFnc19nZXRfc3RhbmRhcmRfY2xvdWRfYXR0cyhhcnJheSgpLCBmYWxzZSwgdHJ1ZSk7 CgkJCSRleHRyYWJvZHkgPSAnPHA+dGFnczogJyAuIHRydV90YWdzX3JlbmRlcl9jbG91ZCgk YXR0cywgJHRhZ3MsICR0YWdzKSAuICc8L3A+JzsKCQl9CgkJZ2xvYmFsICR0aGlzYXJ0aWNs ZTsKCQlpZiAodHJpbSgkdGhpc2FydGljbGVbJ2V4Y2VycHQnXSkpIHsKCQkJJHRoaXNhcnRp Y2xlWydleGNlcnB0J10gPSB0cmltKCR0aGlzYXJ0aWNsZVsnZXhjZXJwdCddKS5uLiRleHRy YWJvZHkubjsKCQl9CgkJJHRoaXNhcnRpY2xlWydib2R5J10gPSB0cmltKCR0aGlzYXJ0aWNs ZVsnYm9keSddKS5uLiRleHRyYWJvZHkubjsKCX0KCglpZiAoJHRydV90YWdzX3ByZWZzW1RB R1NfSU5fRkVFRF9DQVRFR09SSUVTXS0+dmFsdWUpIHsKCQkkb3V0cHV0ID0gYXJyYXkoKTsK CQlmb3JlYWNoICgkdGFncyBhcyAkdGFnKSB7CgkJCWlmICgkYXRvbSkgewoJCQkJJG91dHB1 dFtdID0gJzxjYXRlZ29yeSB0ZXJtPSInIC4gaHRtbHNwZWNpYWxjaGFycygkdGFnKSAuICci IC8+JzsKCQkJfSBlbHNlIHsKCQkJCSRvdXRwdXRbXSA9ICc8Y2F0ZWdvcnk+JyAuIGh0bWxz cGVjaWFsY2hhcnMoJHRhZykgLiAnPC9jYXRlZ29yeT4nOwoJCQl9CgkJfQoJCXJldHVybiBu LmpvaW4obiwgJG91dHB1dCkubjsKCX0KfQoKCiMjIyBQUkVGUyBGVU5DVElPTlMgLyBDTEFT U0VTICMjIwojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKCmNsYXNzIHRydV90 YWdzX3ByZWYgewoJZnVuY3Rpb24gdHJ1X3RhZ3NfcHJlZigkbmFtZSwgJGRlZmF1bHRfdmFs dWUsICR0eXBlKSB7CgkJJHRoaXMtPm5hbWUgPSAkbmFtZTsKCQkkdGhpcy0+dmFsdWUgPSAk ZGVmYXVsdF92YWx1ZTsKCQkkdGhpcy0+ZGVmYXVsdF92YWx1ZSA9ICRkZWZhdWx0X3ZhbHVl OwoJCSR0aGlzLT50eXBlID0gJHR5cGU7Cgl9CgoJZnVuY3Rpb24gdmFsaWRhdGVfdmFsdWUo JHZhbHVlKSB7CgkJaWYgKCR2YWx1ZSkgewoJCQlyZXR1cm4gJHZhbHVlOwoJCX0gZWxzZSBp ZiAoJHRoaXMtPnR5cGUgPT0gJ2Jvb2xlYW4nKSB7CgkJCXJldHVybiAnMCc7CgkJfSBlbHNl IHsKCQkJcmV0dXJuICdQbGVhc2UgZW50ZXIgYSB2YWx1ZSBmb3IgJyAuICR0aGlzLT5uYW1l OwoJCX0KCX0KfQoKZnVuY3Rpb24gdHJ1X3RhZ3NfbG9hZF9wcmVmcygpIHsKCSRwcmVmcyA9 IGFycmF5KCk7CgoJZ2xvYmFsICRwZXJtbGlua19tb2RlOwoJJHByZWZzW0NMRUFOX1VSTFNd ID0gbmV3IHRydV90YWdzX3ByZWYoQ0xFQU5fVVJMUywgKCRwZXJtbGlua19tb2RlICE9ICdt ZXNzeScgPyAnY2xlYW4nIDogJ21lc3N5JyksICdzdHJpbmcnKTsKCSRwcmVmc1tUQUdfU0VD VElPTl0gPSBuZXcgdHJ1X3RhZ3NfcHJlZihUQUdfU0VDVElPTiwgJ3RhZycsICdzdHJpbmcn KTsKCSRwcmVmc1tQQVJNX05BTUVdID0gbmV3IHRydV90YWdzX3ByZWYoUEFSTV9OQU1FLCAn dCcsICdzdHJpbmcnKTsKCSRwcmVmc1tUQUdTX0lOX0ZFRURfQ0FURUdPUklFU10gPSBuZXcg dHJ1X3RhZ3NfcHJlZihUQUdTX0lOX0ZFRURfQ0FURUdPUklFUywgJzEnLCAnYm9vbGVhbicp OwoJJHByZWZzW1RBR1NfSU5fRkVFRF9CT0RZXSA9IG5ldyB0cnVfdGFnc19wcmVmKFRBR1Nf SU5fRkVFRF9CT0RZLCAnMCcsICdib29sZWFuJyk7CgkkcHJlZnNbVEFHU19JTl9XUklURV9U QUJdID0gbmV3IHRydV90YWdzX3ByZWYoVEFHU19JTl9XUklURV9UQUIsICcxJywgJ2Jvb2xl YW4nKTsKCSRwcmVmc1tBVVRPQ09NUExFVEVfSU5fV1JJVEVfVEFCXSA9IG5ldyB0cnVfdGFn c19wcmVmKEFVVE9DT01QTEVURV9JTl9XUklURV9UQUIsICcwJywgJ2Jvb2xlYW4nKTsKCSRw cmVmc1tVVEZfOF9DQVNFXSA9IG5ldyB0cnVfdGFnc19wcmVmKFVURl84X0NBU0UsICcxJywg J2Jvb2xlYW4nKTsKCglpZiAobXlzcWxfcXVlcnkoImRlc2NyaWJlICIgLiBQRlggLiAidHJ1 X3RhZ3NfcHJlZnMiKSkgewoJCSRycyA9IHNhZmVfcm93cygnKicsICd0cnVfdGFnc19wcmVm cycsICcxJyk7CgkJZm9yZWFjaCAoJHJzIGFzICRyb3cpIHsKCQkJJHByZWZzWyRyb3dbJ25h bWUnXV0tPnZhbHVlID0gJHJvd1sndmFsdWUnXTsKCQl9Cgl9CgoJcmV0dXJuICRwcmVmczsK fQoKCiMjIyBPVEhFUiBTVVBQT1JUIEZVTkNUSU9OUyAjIyMKIyMjIyMjIyMjIyMjIyMjIyMj IyMjIyMjIyMjIyMjIwoKZnVuY3Rpb24gdHJ1X3RhZ3NfcmVkaXJlY3RfaWZfbmVlZGVkKCR0 YWdfcGFyYW1ldGVyKSB7CgkkcmVkaXJlY3RzID0gdHJ1X3RhZ3NfbG9hZF9yZWRpcmVjdHMo KTsKCWZvcmVhY2ggKCRyZWRpcmVjdHMgYXMgJGxlZnR0YWcgPT4gJHJpZ2h0dGFnKSB7CgkJ aWYgKCRsZWZ0dGFnID09ICR0YWdfcGFyYW1ldGVyIHx8ICRsZWZ0dGFnID09IHN0cl9yZXBs YWNlKCctJywgJyAnLCAkdGFnX3BhcmFtZXRlcikpIHsKCQkJdHJ1X3RhZ3NfcmVkaXJlY3Qo JHJpZ2h0dGFnLCBmYWxzZSk7CgkJCXJldHVybiB0cnVlOwoJCX0KCX0KCglyZXR1cm4gZmFs c2U7Cn0KCgpmdW5jdGlvbiB0cnVfdGFnc19sb2FkX3JlZGlyZWN0cygpIHsKCSRyZWRpcmVj dHMgPSBhcnJheSgpOwoJaWYgKG15c3FsX3F1ZXJ5KCJkZXNjcmliZSAiIC4gUEZYIC4gInRy dV90YWdzX3JlZGlyZWN0cyIpKSB7CgkJJHJzID0gc2FmZV9yb3dzKCcqJywgJ3RydV90YWdz X3JlZGlyZWN0cycsICcxIG9yZGVyIGJ5IGxlZnR0YWcnKTsKCQlmb3JlYWNoICgkcnMgYXMg JHJvdykgewoJCQkkcmVkaXJlY3RzWyRyb3dbJ2xlZnR0YWcnXV0gPSAkcm93WydyaWdodHRh ZyddOwoJCX0KCX0KCXJldHVybiAkcmVkaXJlY3RzOwp9CgoKZnVuY3Rpb24gdHJ1X3RhZ3Nf cmVkaXJlY3QoJGRlc3RpbmF0aW9uLCAkaXNfZnVsbF91cmwpIHsKCWdsb2JhbCAkdHJ1X3Rh Z3NfcHJlZnM7CglpZiAoJGlzX2Z1bGxfdXJsKSB7CgkJJHVybCA9ICRkZXN0aW5hdGlvbjsK CQkkbWVzc2FnZSA9ICdUaGUgcmVzb3VyY2UgeW91IHJlcXVlc3RlZCBoYXMgbW92ZWQgdG8g JyAuICRkZXN0aW5hdGlvbjsKCX0gZWxzZSB7CgkJJHVybCA9IHRydV90YWdzX2xpbmtpZnlf dGFnKCRkZXN0aW5hdGlvbiwgZmFsc2UpOwoJCSRtZXNzYWdlID0gJ1RoZSByZXF1ZXN0ZWQg dGFnIGhhcyBiZWVuIHJlcGxhY2VkIGJ5ICcgLiAkZGVzdGluYXRpb247Cgl9CgoJaGVhZGVy KCdMb2NhdGlvbjogJyAuICR1cmwpOwoJdHhwX2RpZSgkbWVzc2FnZSwgJzMwMScpOwp9CgoK ZnVuY3Rpb24gdHJ1X3RhZ3NfbGlua2lmeV90YWcoJHRhZywgJHVzZV9hbXAgPSB0cnVlKSB7 CglnbG9iYWwgJHRydV90YWdzX3ByZWZzOwoJaWYgKHRydV90YWdzX2NsZWFuX3VybHMoKSkg ewoJCSR1cmxwcmVmaXggPSBodSAuICR0cnVfdGFnc19wcmVmc1tUQUdfU0VDVElPTl0tPnZh bHVlIC4gJy8nOwoJfSBlbHNlIHsKCQkkdXJscHJlZml4ID0gaHUgLiAnP3M9JyAuICR0cnVf dGFnc19wcmVmc1tUQUdfU0VDVElPTl0tPnZhbHVlIC4gKCR1c2VfYW1wID8gJyZhbXA7JyA6 ICcmJykgLiAkdHJ1X3RhZ3NfcHJlZnNbUEFSTV9OQU1FXS0+dmFsdWUgLiAnPSc7Cgl9Cgkk dXJsc3VmZml4ID0gKHRydV90YWdzX2NsZWFuX3VybHMoKSA/ICcvJyA6ICcnKTsKCXJldHVy biAkdXJscHJlZml4IC4gdXJsZW5jb2RlKHN0cl9yZXBsYWNlKCcgJywgJy0nLCAkdGFnKSkg LiAkdXJsc3VmZml4Owp9CgoKZnVuY3Rpb24gdHJ1X3RhZ3NfZ2V0X3RhZ3NfZm9yX2FydGlj bGUoJGFydGljbGVJRCkgewoJZ2xvYmFsICR0aGlzYXJ0aWNsZSwgJHRydV90YWdzX3ByZWZz OwoJaWYgKGlzc2V0KCR0aGlzYXJ0aWNsZSkpIHsKCQlleHRyYWN0KCR0aGlzYXJ0aWNsZSk7 Cgl9Cgkka2V5d29yZHMgPSAnJzsKCWlmIChpc3NldCgkdGhpc2lkKSAmJiAkdGhpc2lkID09 ICRhcnRpY2xlSUQpIHsKCQlpZiAoaXNzZXQoJHRoaXNhcnRpY2xlWydrZXl3b3JkcyddKSkg ewoJCQkka2V5d29yZHMgPSAkdGhpc2FydGljbGVbJ2tleXdvcmRzJ107CgkJfQoJfSBlbHNl IHsKCQkkdGFnc19maWVsZCA9IFRSVV9UQUdTX0ZJRUxEOwoJCSRycyA9IHNhZmVfcm93KCR0 YWdzX2ZpZWxkLCAidGV4dHBhdHRlcm4iLCAiSUQ9JyRhcnRpY2xlSUQnIEFORCAkdGFnc19m aWVsZCA8PiAnJyIpOwoJCWlmIChhcnJheV9rZXlfZXhpc3RzKCR0YWdzX2ZpZWxkLCAkcnMp KSB7CgkJCSRrZXl3b3JkcyA9ICRyc1skdGFnc19maWVsZF07CgkJfQoJfQoJJGFsbF90YWdz ID0gYXJyYXkoKTsKCSRhbGxfdGFncyA9IGV4cGxvZGUoIiwiLCB0cmltKHRydV90YWdzX3N0 cnRvbG93ZXIoJGtleXdvcmRzKSkpOwoKCXJldHVybiB0cnVfdGFnc190cmltX3RhZ3MoJGFs bF90YWdzKTsKfQoKCiMgZml4ZXMgYnVnIHdpdGggNC4wLjQncyB2ZXJzaW9uIG9mIGRvV3Jh cCB0aGF0IGNhdXNlZCBzcGFjZXMgdG8gc2hvdyB1cCBiZWZvcmUgdGhlIGNvbW1hcwpmdW5j dGlvbiB0cnVfdGFnc19kb193cmFwKCRsaXN0LCAkd3JhcHRhZywgJGJyZWFrLCAkY2xhc3Ms ICRicmVha2NsYXNzKSB7CglpZiAoISR3cmFwdGFnICYmICFwcmVnX21hdGNoKCcvXlx3KyQv JywgJGJyZWFrKSkgewoJCXJldHVybiBqb2luKCRicmVhay5uLCAkbGlzdCk7Cgl9IGVsc2Ug ewoJCXJldHVybiBkb1dyYXAoJGxpc3QsICR3cmFwdGFnLCAkYnJlYWssICRjbGFzcywgJGJy ZWFrY2xhc3MpOwoJfQp9CgoKZnVuY3Rpb24gdHJ1X3RhZ3NfdHJpbV90YWdzKCR0YWdfYXJy YXkpIHsKCSR0cmltbWVkID0gYXJyYXkoKTsKCWZvcmVhY2ggKCR0YWdfYXJyYXkgYXMgJHRh ZykgewoJCWlmICgiIiAhPSB0cmltKCR0YWcpKSB7CgkJCSR0cmltbWVkW10gPSB0cmltKCR0 YWcpOwoJCX0KCX0KCXJldHVybiAkdHJpbW1lZDsKfQoKCmZ1bmN0aW9uIHRydV90YWdzX2Zp eHVwX3F1ZXJ5X2F0dHMoJGF0dHMsICR0YWdfcGFyYW1ldGVyKSB7Cgkka2V5d29yZHMgPSBl eHBsb2RlKCcsJywgJHRhZ19wYXJhbWV0ZXIpOwoJZm9yZWFjaCAoJGtleXdvcmRzIGFzICRr ZXl3b3JkKSB7CgkJaWYgKHN0cnBvcygka2V5d29yZCwgJy0nKSAhPT0gZmFsc2UpIHsKCQkJ JGtleXdvcmRzW10gPSBzdHJfcmVwbGFjZSgnLScsICcgJywgJGtleXdvcmQpOwoJCX0KCX0K CSRhdHRzWydrZXl3b3JkcyddID0gaW1wbG9kZSgnLCcsICRrZXl3b3Jkcyk7CgoJaWYgKGlz c2V0KCRhdHRzWydzZWN0aW9uJ10pICYmIHN0cnBvcygkYXR0c1snc2VjdGlvbiddLCAnLCcp ICE9PSBmYWxzZSkgewoJCSRhdHRzWydzZWN0aW9uJ10gPSAnJzsKCX0KCglpZiAoaXNzZXQo JGF0dHNbJ2V4Y2x1ZGVzZWN0aW9uJ10pKSB7CgkJdW5zZXQoJGF0dHNbJ2V4Y2x1ZGVzZWN0 aW9uJ10pOwoJfQoKCWlmIChpc3NldCgkYXR0c1snbm9hcnRpY2xlcyddKSkgewoJCXVuc2V0 KCRhdHRzWydub2FydGljbGVzJ10pOwoJfQoKCWlmICghaXNzZXQoJGF0dHNbJ2xpbWl0J10p KSB7CgkJJGF0dHNbJ2xpbWl0J10gPSAnMTAwMCc7Cgl9CgoJaWYgKCFpc3NldCgkYXR0c1sn YWxsb3dvdmVycmlkZSddKSkgewoJCSRhdHRzWydhbGxvd292ZXJyaWRlJ10gPSB0cnVlOwoJ fQoKCWlmIChpc3NldCgkYXR0c1snc2VhcmNoZm9ybSddKSAmJiAhaXNzZXQoJGF0dHNbJ2xp c3Rmb3JtJ10pKSB7CgkJJGF0dHNbJ2xpc3Rmb3JtJ10gPSAkYXR0c1snc2VhcmNoZm9ybSdd OwoJfQoKCWlmIChpc3NldCgkYXR0c1snc2hvd2NvdW50cyddKSkgewoJCXVuc2V0KCRhdHRz WydzaG93Y291bnRzJ10pOwoJfQoKCWlmIChpc3NldCgkYXR0c1snNDA0cmVkaXJlY3QnXSkp IHsKCQl1bnNldCgkYXR0c1snNDA0cmVkaXJlY3QnXSk7Cgl9CgoJcmV0dXJuICRhdHRzOwp9 CgoKZnVuY3Rpb24gdHJ1X3RhZ3Nfc3RydG9sb3dlcigkc3RyKSB7CglnbG9iYWwgJHRydV90 YWdzX3ByZWZzOwoJaWYgKCR0cnVfdGFnc19wcmVmc1tVVEZfOF9DQVNFXS0+dmFsdWUpIHsK CQlpZiAoZnVuY3Rpb25fZXhpc3RzKCdtYl9zdHJ0b2xvd2VyJykpIHsKCQkJcmV0dXJuIG1i X3N0cnRvbG93ZXIoJHN0ciwgRU5DT0RJTkcpOwoJCX0gZWxzZSB7CgkJCXJldHVybiBzdHJ0 b2xvd2VyKCRzdHIpOwoJCX0KCX0gZWxzZSB7CgkJcmV0dXJuICRzdHI7Cgl9Cn0KCmZ1bmN0 aW9uIHRydV90YWdzX3N0cnRvdXBwZXIoJHN0cikgewoJaWYgKGZ1bmN0aW9uX2V4aXN0cygn bWJfc3RydG91cHBlcicpKSB7CgkJcmV0dXJuIG1iX3N0cnRvdXBwZXIoJHN0ciwgRU5DT0RJ TkcpOwoJfSBlbHNlIHsKCQlyZXR1cm4gc3RydG91cHBlcigkc3RyKTsKCX0KfQoKZnVuY3Rp b24gdHJ1X3RhZ3NfdWNmaXJzdCgkc3RyKSB7CglpZiAoZnVuY3Rpb25fZXhpc3RzKCdtYl9z dWJzdHInKSAmJiBmdW5jdGlvbl9leGlzdHMoJ21iX3N0cnRvdXBwZXInKSAmJiBmdW5jdGlv bl9leGlzdHMoJ21iX3N0cmxlbicpICYmIG1iX3N0cmxlbigkc3RyLCBFTkNPRElORykgPiAx KSB7CgkJcmV0dXJuIG1iX3N0cnRvdXBwZXIobWJfc3Vic3RyKCRzdHIsIDAsIDEsIEVOQ09E SU5HKSwgRU5DT0RJTkcpIC4gbWJfc3Vic3RyKCRzdHIsIDEsIG1iX3N0cmxlbigkc3RyLCBF TkNPRElORyksIEVOQ09ESU5HKTsKCX0gZWxzZSB7CgkJcmV0dXJuIHVjZmlyc3QoJHN0cik7 Cgl9Cn0KCmZ1bmN0aW9uIHRydV90YWdzX3Vjd29yZHMoJHN0cikgewoJaWYgKGZ1bmN0aW9u X2V4aXN0cygnbWJfY29udmVydF9jYXNlJykpIHsKCQlyZXR1cm4gbWJfY29udmVydF9jYXNl KCRzdHIsIE1CX0NBU0VfVElUTEUsIEVOQ09ESU5HKTsKCX0gZWxzZSB7CgkJcmV0dXJuIHVj d29yZHMoJHN0cik7Cgl9Cn0KCgovL3RoZXNlIG5leHQgdHdvIGZ1bmN0aW9ucyBhcmUgZ3Jv c3MsIGJ1dCBJIGNhbid0IGZpZ3VyZSBvdXQgYW5vdGhlciB3YXkgdG8gZG8gaXQKZnVuY3Rp b24gdHJ1X3RhZ3Nfc29ydF90YWdzKCR0YWdzX3dlaWdodCwgJHNvcnRfYnlfY291bnQsICRz b3J0X2FzY2VuZGluZykgewoJZ2xvYmFsICR0cnVfdGFnc190YWdzX3dlaWdodCwgJHRydV90 YWdzX3NvcnRfYXNjZW5kaW5nOwoKCSR0cnVfdGFnc190YWdzX3dlaWdodCA9ICR0YWdzX3dl aWdodDsKCSR0cnVfdGFnc19zb3J0X2FzY2VuZGluZyA9ICRzb3J0X2FzY2VuZGluZzsKCgkk dGVtcF9hcnJheSA9IGFycmF5X2tleXMoJHRhZ3Nfd2VpZ2h0KTsKCWlmICgkc29ydF9ieV9j b3VudCkgewoJCXVzb3J0KCR0ZW1wX2FycmF5LCAidHJ1X3RhZ3Nfc29ydF90YWdzX2NvbXBh cmF0b3IiKTsKCX0gZWxzZSB7CgkJbmF0Y2FzZXNvcnQoJHRlbXBfYXJyYXkpOwoJCSR0ZW1w X2FycmF5ID0gYXJyYXlfdmFsdWVzKCR0ZW1wX2FycmF5KTsKCX0KCgkkc29ydGVkX2FycmF5 ID0gYXJyYXkoKTsKCWZvcmVhY2ggKCR0ZW1wX2FycmF5IGFzICR0YWcpIHsKCQkkc29ydGVk X2FycmF5WyR0YWddID0gJHRhZ3Nfd2VpZ2h0WyR0YWddOwoJfQoKCXJldHVybiAkc29ydGVk X2FycmF5Owp9CgoKZnVuY3Rpb24gdHJ1X3RhZ3Nfc29ydF90YWdzX2NvbXBhcmF0b3IoJGxl ZnQsICRyaWdodCkgewoJZ2xvYmFsICR0cnVfdGFnc190YWdzX3dlaWdodCwgJHRydV90YWdz X3NvcnRfYXNjZW5kaW5nOwoKCSRsZWZ0X3dlaWdodCA9ICR0cnVfdGFnc190YWdzX3dlaWdo dFskbGVmdF07CgkkcmlnaHRfd2VpZ2h0ID0gJHRydV90YWdzX3RhZ3Nfd2VpZ2h0WyRyaWdo dF07CglpZiAoJGxlZnRfd2VpZ2h0ID09ICRyaWdodF93ZWlnaHQpIHsKCQkkdGVtcF9hcnJh eSA9IGFycmF5KCRsZWZ0LCAkcmlnaHQpOwoJCW5hdGNhc2Vzb3J0KCR0ZW1wX2FycmF5KTsK CQkkdGVtcF9hcnJheSA9IGFycmF5X3ZhbHVlcygkdGVtcF9hcnJheSk7CgkJcmV0dXJuICgk dGVtcF9hcnJheVswXSA9PSAkbGVmdCA/IC0xIDogMSk7Cgl9IGVsc2UgaWYgKCR0cnVfdGFn c19zb3J0X2FzY2VuZGluZykgewoJCXJldHVybiAkbGVmdF93ZWlnaHQgLSAkcmlnaHRfd2Vp Z2h0OwoJfSBlbHNlIHsKCQlyZXR1cm4gJHJpZ2h0X3dlaWdodCAtICRsZWZ0X3dlaWdodDsK CX0KfQoKCgojIyMgQkFTVEFSRCBGVU5DVElPTlMgVEhBVCBTSE9VTEROJ1QgSEFWRSBUTyBF WElTVCAjIyMKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj IyMjIyMjIyMjCgoKZnVuY3Rpb24gdHJ1X3RhZ3NfcmVkb19hcnRpY2xlX3NlYXJjaCgkYXR0 cykgewoJJHRoZUF0dHMgPSBsQXR0cyhhcnJheSgnbGltaXQnICAgICA9PiAxMDAwLAoJCQkJ J2NhdGVnb3J5JyAgPT4gJycsCgkJCQknc2VjdGlvbicgICA9PiAnJywKCQkJCSdleGNlcnB0 ZWQnID0+ICcnLAoJCQkJJ2F1dGhvcicgICAgPT4gJycsCgkJCQknc29ydGJ5JyAgICA9PiAn UG9zdGVkJywKCQkJCSdzb3J0ZGlyJyAgID0+ICdkZXNjJywKCQkJCSdtb250aCcgICAgID0+ ICcnLAoJCQkJJ2tleXdvcmRzJyAgPT4gJycsCgkJCQknZnJvbnRwYWdlJyA9PiAnJywKCQkJ CSdpZCcgICAgICAgID0+ICcnLAoJCQkJJ3RpbWUnICAgICAgPT4gJ3Bhc3QnLAoJCQkJJ3N0 YXR1cycgICAgPT4gJzQnLAoJCQkJJ29mZnNldCcgICAgPT4gMAoJCQkpLCRhdHRzLCAwKTsK CWV4dHJhY3QoJHRoZUF0dHMpOwoKCS8vQnVpbGRpbmcgcXVlcnkgcGFydHMKCSRmcm9udHBh Z2UgPSAoJGZyb250cGFnZSkgPyBmaWx0ZXJGcm9udFBhZ2UoKSA6ICcnOwoJJGNhdGVnb3J5 ICA9ICghJGNhdGVnb3J5KSAgPyAnJyA6ICIgYW5kICgoQ2F0ZWdvcnkxPSciLmRvc2xhc2go JGNhdGVnb3J5KS4iJykgb3IgKENhdGVnb3J5Mj0nIi5kb1NsYXNoKCRjYXRlZ29yeSkuIicp KSAiOwoJJHNlY3Rpb24gICA9ICghJHNlY3Rpb24pICAgPyAnJyA6ICIgYW5kIFNlY3Rpb24g PSAnIi5kb3NsYXNoKCRzZWN0aW9uKS4iJyI7CgkkZXhjZXJwdGVkID0gKCRleGNlcnB0ZWQ9 PSd5JykgID8gIiBhbmQgRXhjZXJwdCAhPScnIiA6ICcnOwoJJGF1dGhvciAgICA9ICghJGF1 dGhvcikgICAgPyAnJyA6ICIgYW5kIEF1dGhvcklEID0gJyIuZG9zbGFzaCgkYXV0aG9yKS4i JyI7CgkkbW9udGggICAgID0gKCEkbW9udGgpICAgICA/ICcnIDogIiBhbmQgUG9zdGVkIGxp a2UgJyIuZG9TbGFzaCgkbW9udGgpLiIlJyI7CgkkaWQgICAgICAgID0gKCEkaWQpICAgICAg ICA/ICcnIDogIiBhbmQgSUQgPSAnIi5pbnR2YWwoJGlkKS4iJyI7Cglzd2l0Y2ggKCR0aW1l KSB7CgkJY2FzZSAnYW55JzoKCQkJJHRpbWUgPSAiIjsgYnJlYWs7CgkJY2FzZSAnZnV0dXJl JzoKCQkJJHRpbWUgPSAiIGFuZCBQb3N0ZWQgPiBub3coKSI7IGJyZWFrOwoJCWRlZmF1bHQ6 CgkJCSR0aW1lID0gIiBhbmQgUG9zdGVkIDwgbm93KCkiOwoJfQoJaWYgKCFpc19udW1lcmlj KCRzdGF0dXMpKQoJCSRzdGF0dXMgPSBnZXRTdGF0dXNOdW0oJHN0YXR1cyk7CgoJJGN1c3Rv bSA9ICcnOwoJLy8gdHJ5aW5nIGN1c3RvbSBmaWVsZHMgaGVyZQoJJGN1c3RvbUZpZWxkcyA9 IGdldEN1c3RvbUZpZWxkcygpOwoJaWYgKCRjdXN0b21GaWVsZHMpIHsKCQlmb3JlYWNoKCRj dXN0b21GaWVsZHMgYXMgJGNGaWVsZCkgewoJCQlpZiAoaXNzZXQoJGF0dHNbJGNGaWVsZF0p KQoJCQkJJGN1c3RvbVBhaXJzWyRjRmllbGRdID0gJGF0dHNbJGNGaWVsZF07CgkJfQoJCWlm KCFlbXB0eSgkY3VzdG9tUGFpcnMpKQoJCQkkY3VzdG9tID0gIGJ1aWxkQ3VzdG9tU3FsKCRj dXN0b21GaWVsZHMsJGN1c3RvbVBhaXJzKTsKCQllbHNlCgkJCSRjdXN0b20gPSAnJzsKCX0K CgkvL0FsbG93IGtleXdvcmRzIGZvciBuby1jdXN0b20gYXJ0aWNsZXMuIFRoYXQgdGFnZ2lu ZyBtb2RlLCB5b3Uga25vdwoJaWYgKCRrZXl3b3JkcykgewoJCSRrZXlzID0gZG9TbGFzaChh cnJheV9tYXAoJ3RyaW0nLCBleHBsb2RlKCcsJywgJGtleXdvcmRzKSkpOwoJCWZvcmVhY2gg KCRrZXlzIGFzICRrZXkpIHsKCQkJJGtleXBhcnRzW10gPSAiRklORF9JTl9TRVQoJyIuJGtl eS4iJyxLZXl3b3JkcykiOwoJCX0KCQkka2V5d29yZHMgPSAiIGFuZCAoIiAuIGpvaW4oJyBv ciAnLCRrZXlwYXJ0cykgLiAiKSI7Cgl9CgoJaWYgKCRpZCkKCQkkc3RhdHVzcSA9ICIgYW5k IFN0YXR1cyA+PSAnNCciOwoJZWxzZQoJCSRzdGF0dXNxID0gIiBhbmQgU3RhdHVzPSciLmRv U2xhc2goJHN0YXR1cykuIiciOwoKCSR3aGVyZSA9ICIxIiAuICRzdGF0dXNxLiAkdGltZS4K CQkkaWQgLiAkY2F0ZWdvcnkgLiAkc2VjdGlvbiAuICRleGNlcnB0ZWQgLiAkbW9udGggLiAk YXV0aG9yIC4gJGtleXdvcmRzIC4gJGN1c3RvbSAuICRmcm9udHBhZ2U7CgoJCSRwZ29mZnNl dCA9ICRvZmZzZXQgLiAnLCAnOwoKCSRycyA9IHNhZmVfcm93c19zdGFydCgiKiwgdW5peF90 aW1lc3RhbXAoUG9zdGVkKSBhcyB1UG9zdGVkIiwgJ3RleHRwYXR0ZXJuJywKCQkkd2hlcmUu ICcgb3JkZXIgYnkgJyAuIGRvc2xhc2goJHNvcnRieSkgLiAnICcgLiBkb1NsYXNoKCRzb3J0 ZGlyKSAuICcgbGltaXQgJyAuIGRvU2xhc2goJGxpbWl0KSk7CgoJcmV0dXJuICRyczsKfQoK CiI7czo4OiJoZWxwX3JhdyI7czo5NDY6IlRvIGxlYXJuIG1vcmUgYWJvdXQgdHJ1X3RhZ3Ms IGNoZWNrIG91dCB0aGUgImludHJvZHVjdG9yeSBhcnRpY2xlIjpodHRwOi8vd3d3LnJhaW5z a2l0LmNvbS9ibG9nLzQ5My90cnV0YWdzLWEtdGFnZ2luZy1wbHVnaW4tZm9yLXRleHRwYXR0 ZXJuLCAicmVsZWFzZXMgcGFnZSI6aHR0cDovL3d3dy5yYWluc2tpdC5jb20vcmVmZXJlbmNl LzUzNy90cnVfdGFncy1yZWxlYXNlcywgImZlYXR1cmUgbGlzdCI6aHR0cDovL3d3dy5yYWlu c2tpdC5jb20vcmVmZXJlbmNlLzQ5NS90cnV0YWdzLWZlYXR1cmUtbGlzdCwgInJvYWRtYXAi Omh0dHA6Ly93d3cucmFpbnNraXQuY29tL3JlZmVyZW5jZS81NTQvdHJ1X3RhZ3Mtcm9hZG1h cCwgYW5kICJ1c2FnZSBpbnN0cnVjdGlvbnMiOmh0dHA6Ly93d3cucmFpbnNraXQuY29tL3Jl ZmVyZW5jZS80OTcvdHJ1dGFncy11c2FnZS1pbnN0cnVjdGlvbnMuCgpZb3UgY2FuIGFsc28g ZmluZCB0aGUgc291cmNlIGNvZGUgYXQgImh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC90cnUt dGFncy8iOmh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC90cnUtdGFncy8uCgpJJ3ZlIHRha2Vu IHRoZSBkZXRhaWxlZCBoZWxwIG91dCBvZiB0aGUgcGx1Z2luOyBteSBhcG9sb2dpZXMuICBJ dCB3YXMgdG9vIGJpZyBhbmQgdG9vIGRpZmZpY3VsdCB0byBrZWVwIG1haW50YWluaW5nIG9u IG15IHNpdGUgYW5kIGluIHRoZSBwbHVnaW4uICBJZiwgbXkgc2l0ZSBpcyBldmVyIGRvd24s IGhvd2V2ZXIsIHRoZSBzb3VyY2UgSFRNTCBvZiB0aGUgdXNhZ2UgaW5zdHJ1Y3Rpb25zIGlz IGF2YWlsYWJsZSBhdCAiaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3RydS10YWdzL3NvdXJj ZS9icm93c2UvdHJ1bmsvdHJ1X3RhZ3MtZG9jcy5odG1sIjpodHRwOi8vY29kZS5nb29nbGUu Y29tL3AvdHJ1LXRhZ3Mvc291cmNlL2Jyb3dzZS90cnVuay90cnVfdGFncy1kb2NzLmh0bWwi O3M6MzoibWQ1IjtzOjMyOiJhMGZmNzhjNWExOGQ1MWQwYWRmYTQ0ODJhZjJkYThjMCI7fQ==