# Name: rah_plugin_installer v0.2 # Type: Admin/Client side plugin # Plugin installer for rah-prefixed plugins. # Author: Jukka Svahn # URL: http://rahforum.biz # Recommended load order: 5 # ..................................................................... # This is a plugin for Textpattern - http://textpattern.com/ # To install: textpattern > admin > plugins # Paste the following text into the 'Install plugin' box: # ..................................................................... YToxMTp7czo0OiJuYW1lIjtzOjIwOiJyYWhfcGx1Z2luX2luc3RhbGxlciI7czo2OiJhdXRo b3IiO3M6MTE6Ikp1a2thIFN2YWhuIjtzOjEwOiJhdXRob3JfdXJpIjtzOjE5OiJodHRwOi8v cmFoZm9ydW0uYml6IjtzOjc6InZlcnNpb24iO3M6MzoiMC4yIjtzOjExOiJkZXNjcmlwdGlv biI7czo0MjoiUGx1Z2luIGluc3RhbGxlciBmb3IgcmFoLXByZWZpeGVkIHBsdWdpbnMuIjtz OjQ6ImhlbHAiO3M6MjIzMDoiCTxoMT5yYWhfcGx1Z2luX2luc3RhbGxlcjwvaDE+CgoJPHA+ SW5zdGFsbCBhbmQgdXBkYXRlIHJhaC1wbHVnaW5zIGRpcmVjdGx5IGZyb20geW91ciA8YSBo cmVmPSJodHRwOi8vd3d3LnRleHRwYXR0ZXJuLmNvbSI+VGV4dHBhdHRlcm48L2E+IGluc3Rh bGxhdGlvbi4gQ2xpY2sgYW5kIGluc3RhbGwsIHJlYWR5IHRvIGdvLjwvcD4KCgk8dWw+CgkJ PGxpPlZlcnNpb246IDAuMjwvbGk+CgkJPGxpPlVwZGF0ZWQ6IDIwMTAvMDYvMDEgMDI6MzAg QU0gPHNwYW4gY2xhc3M9ImNhcHMiPlVUQzwvc3Bhbj48L2xpPgoJPC91bD4KCgk8aDM+VGFi bGUgb2YgQ29udGVudHM8L2gzPgoKCTx1bD4KCQk8bGk+PGEgaHJlZj0iI2ludHJvLWFuZC1k ZXNjcmlwdGlvbiI+SW50cm8gYW5kIGRlc2NyaXB0aW9uPC9hPjwvbGk+CgkJPGxpPjxhIGhy ZWY9IiNsaXN0LW9mLWZlYXR1cmVzIj5MaXN0IG9mIGZlYXR1cmVzPC9hPjwvbGk+CgkJPGxp PjxhIGhyZWY9IiNyZXF1aXJlbWVudHMiPlJlcXVpcmVtZW50czwvYT48L2xpPgoJCTxsaT48 YSBocmVmPSIjaW5zdGFsbGF0aW9uLWFuZC11c2FnZSI+SW5zdGFsbGF0aW9uIGFuZCB1c2Fn ZTwvYT48L2xpPgoJPC91bD4KCgk8aDMgaWQ9Imxpc3Qtb2YtZmVhdHVyZXMiPkxpc3Qgb2Yg ZmVhdHVyZXM8L2gzPgoKCTx1bD4KCQk8bGk+U2ltcGxlIGluc3RhbGw6IGp1c3QgcnVuIHRo ZSBhdXRvbWF0aWMgcGx1Z2luIGluc3RhbGwuIE5vIG5lZWQgdG8gdXBsb2FkIGFueSBmaWxl cyBub3Igc2V0IHBlcm1pc3Npb25zLjwvbGk+CgkJPGxpPkRvd25sb2FkIGFuZCBpbnN0YWxs IHJhaC1mYW1pbHkgcGx1Z2luIGRpcmVjdGx5IGZyb20geW91ciBUZXh0cGF0dGVybiBiYWNr ZW5kLjwvbGk+CgkJPGxpPlNlcnZlciBzaWRlIGNhY2hpbmcgb2YgdGhlIHVwZGF0ZSBsaXN0 LjwvbGk+CgkJPGxpPkFkbWluIHBhbmVsIHVuZGVyIFRleHRwYXR0ZXJuICZndDsgRXh0ZW5z aW9ucyAmZ3Q7IDxlbT5QbHVnaW4gSW5zdGFsbGVyPC9lbT4uPC9saT4KCTwvdWw+CgoJPGgz IGlkPSJyZXF1aXJlbWVudHMiPlJlcXVpcmVtZW50czwvaDM+CgoJPHVsPgoJCTxsaT5UZXh0 cGF0dGVybiA0LngueCs8L2xpPgoJCTxsaT48c3BhbiBjbGFzcz0iY2FwcyI+UEhQPC9zcGFu PiA0LjMuMCsKCTx1bD4KCQk8bGk+ZmlsZV9nZXRfY29udGVudHM8L2xpPgoJCTxsaT5hbGxv d191cmxfZm9wZW4gc2V0IHRydWU8L2xpPgoJCTxsaT5JbnRlcm5ldCBjb25uZWN0aW9uIGZv ciBjb21tdW5pY2F0aW9ucyB3aXRoIHRoZSBzZXJ2ZXI8L2xpPgoJPC91bD48L2xpPgoJCTxs aT5PcHRpb25hbDogWmxpYiBsaWJyYXJ5LjwvbGk+Cgk8L3VsPgoKCTxoMyBpZD0iaW5zdGFs bGF0aW9uLWFuZC11c2FnZSI+SW5zdGFsbGF0aW9uIGFuZCB1c2FnZTwvaDM+CgoJPHA+VGhl IGdlbmVyYWwgYmVoYXZpb3Igc3RhbmRzOiBwYXN0ZSBwbHVnaW4gY29kZSB0byB0aGUgcGx1 Z2luIGluc3RhbGxlciB0ZXh0YXJlYSBhbmQgcnVuIHRoZSBhdXRvbWF0aWMgc2V0dXAuIFRo ZW4ganVzdCBhY3RpdmF0ZSB0aGUgcGx1Z2luIGFuZCB5b3UgYXJlIHJlYWR5IHRvIHVzZSB0 aGUgZnVuY3Rpb25hbGl0aWVzLjwvcD4KCgk8cD5Zb3UgY2FuIGRvd25sb2FkIGFuZCBpbnN0 YWxsIHJhaC1wbHVnaW5zIGZyb20gVGV4dHBhdHRlcm4gJmd0OyBFeHRlbnNpb25zICZndDsg UGx1Z2luIEluc3RhbGxlci48L3A+CgoJPGgzIGlkPSJjaGFuZ2Vsb2ciPkNoYW5nZWxvZzwv aDM+CgoJPHA+PHN0cm9uZz5WZXJzaW9uIDAuMjwvc3Ryb25nPjwvcD4KCgk8dWw+CgkJPGxp PkFkZGVkIG1vcmUgdmFsaWRpdHkgYW5kIGVycm9yIGNoZWNrcy48L2xpPgoJCTxsaT5BZGRl ZCB0aW1lb3V0IHN1cHBvcnQgZm9yIHVwZGF0ZSBkb3dubG9hZHMuIDMgc2Vjb25kcyBmb3Ig dXBkYXRlIGNoZWNrcyBhbmQgMTAgc2Vjb25kcyBmb3IgYWN0dWFsIGZpbGVzLjwvbGk+CgkJ PGxpPkFkZGVkIG9wdGlvbiB0byB0dXJuIGF1dG9tYXRpYy11cGRhdGVzIG9mZi48L2xpPgoJ CTxsaT5DbGVhbmVkIHRoZSBhZG1pbiBwYW5lbC48L2xpPgoJCTxsaT5GaXhlZCBtYW51YWwg dXBkYXRlIGNoZWNrLjwvbGk+CgkJPGxpPkZpeGVkIGNvbmZsaWN0cyB3aXRoIG90aGVyIGV4 dGVuc2lvbiB0aGF0IGluY2x1ZGVkIDxjb2RlPnR4cF9wbHVnaW4ucGhwPC9jb2RlPi48L2xp PgoJPC91bD4KCgk8cD48c3Ryb25nPlZlcnNpb24gMC4xPC9zdHJvbmc+PC9wPgoKCTx1bD4K CQk8bGk+SW5pdGlhbCByZWxlYXNlLjwvbGk+Cgk8L3VsPiI7czo0OiJjb2RlIjtzOjExNDUw OiIJIyMjIyMjIyMjIyMjIyMjIyMjDQoJIw0KCSMJcmFoX3BsdWdpbl9pbnN0YWxsZXItcGx1 Z2luIGZvciBUZXh0cGF0dGVybg0KCSMJdmVyc2lvbiAwLjINCgkjCWJ5IEp1a2thIFN2YWhu DQoJIwlodHRwOi8vcmFoZm9ydW0uYml6DQoJIw0KCSMjIyMjIyMjIyMjIyMjIyMjIyMNCg0K CWlmIChAdHhwaW50ZXJmYWNlID09ICdhZG1pbicpIHsNCgkJYWRkX3ByaXZzKCdyYWhfcGx1 Z2luX2luc3RhbGxlcicsJzEnKTsNCgkJcmVnaXN0ZXJfdGFiKCdleHRlbnNpb25zJywgJ3Jh aF9wbHVnaW5faW5zdGFsbGVyJywgJ1BsdWdpbiBJbnN0YWxsZXInKTsNCgkJcmVnaXN0ZXJf Y2FsbGJhY2soJ3JhaF9wbHVnaW5faW5zdGFsbGVyJywgJ3JhaF9wbHVnaW5faW5zdGFsbGVy Jyk7DQoJfQ0KDQoJZnVuY3Rpb24gcmFoX3BsdWdpbl9pbnN0YWxsZXIoKSB7DQoJCXJlcXVp cmVfcHJpdnMoJ3JhaF9wbHVnaW5faW5zdGFsbGVyJyk7DQoJCWdsb2JhbCAkc3RlcDsNCgkJ cmFoX3BsdWdpbl9pbnN0YWxsZXJfaW5zdGFsbCgpOw0KCQlpZihpbl9hcnJheSgkc3RlcCxh cnJheSgNCgkJCSdyYWhfcGx1Z2luX2luc3RhbGxlcl9kb3dubG9hZCcsDQoJCQkncmFoX3Bs dWdpbl9pbnN0YWxsZXJfc2V0dGluZ3MnLA0KCQkJJ3JhaF9wbHVnaW5faW5zdGFsbGVyX3Nh dmUnLA0KCQkJJ3JhaF9wbHVnaW5faW5zdGFsbGVyX3VwZGF0ZScsDQoJCSkpKSAkc3RlcCgp Ow0KCQllbHNlIHJhaF9wbHVnaW5faW5zdGFsbGVyX2xpc3QoKTsNCgl9DQoNCglmdW5jdGlv biByYWhfcGx1Z2luX2luc3RhbGxlcl9zZXR0aW5ncygkbWVzc2FnZT0nJykgew0KCQkNCgkJ cGFnZXRvcCgnU2V0dGluZ3MnLCRtZXNzYWdlKTsNCgkJDQoJCWdsb2JhbCAkZXZlbnQ7DQoJ CQ0KCQkkcHJlZnMgPSByYWhfcGx1Z2luX2luc3RhbGxlcl9wcmVmcygpOw0KCQkNCgkJZWNo byANCgkJCW4uDQoJCQknCTxmb3JtIG1ldGhvZD0icG9zdCIgYWN0aW9uPSJpbmRleC5waHAi IHN0eWxlPSJ3aWR0aDo5NTBweDttYXJnaW46MCBhdXRvOyI+Jy5uLg0KCQkJDQoJCQknCQk8 aDE+PHN0cm9uZz5yYWhfcGx1Z2luX2luc3RhbGxlcjwvc3Ryb25nPiB8IFByZWZlcmVuY2Vz PC9oMT4nLm4uDQoJCQkNCgkJCScJCTxwPiYjMTg3OyA8YSBocmVmPSI/ZXZlbnQ9Jy4kZXZl bnQuJyI+QmFjayB0byB0aGUgbWFpbiBwYW5lbDwvYT48L3A+Jy5uLg0KCQkJDQoJCQknCQk8 aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJldmVudCIgdmFsdWU9IicuJGV2ZW50LiciIC8+ Jy5uLg0KCQkJJwkJPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0ic3RlcCIgdmFsdWU9InJh aF9wbHVnaW5faW5zdGFsbGVyX3NhdmUiIC8+Jy5uLg0KCQkJDQoJCQknCQk8cD4nLg0KCQkJ JwkJCTxsYWJlbCBmb3I9InJhaF9wbHVnaW5faW5zdGFsbGVyX2NvbXByZXNzIj4nLm4uDQoJ CQknCQkJCTxzdHJvbmc+RG93bmxvYWQgdW5jb21wcmVzc2VkIG9yIGNvbXByZXNzZWQgZmls ZXMuPC9zdHJvbmc+ICcuDQoJCQkJCQkJJ1RoaXMgc2V0dGluZyBkZWZpbmVzIHdoaWNoIHBh Y2thZ2VzIHlvdSBhcmUgZG93bmxvYWRpbmcgYW5kIGluc3RhbGxpbmcgd2hlbiB1cGRhdGlu ZyBvciBpbnN0YWxsaW5nLiAnLg0KCQkJCQkJCSdXaGlsZSB1bmNvbXByZXNzZWQgdmVyc2lv biByZXF1aXJlcyBtb3JlIGJhbmR3aWR0aCBhbmQgbWlnaHQgb3ZlcmNvbWUgeW91ciBzZXJ2 ZXJcJ3MgbWVtb3J5IHJlc3RyaWN0aW9ucywgJy4NCgkJCQkJCQknY29tcHJlc3NlZCB2ZXJz aW9uIHJlcXVpcmVzIHRoYXQgdGhlIHNlcnZlciB1bmNvbXByZXNzZXMgdGhlIGZpbGUgYW5k IGhhcyB6bGliIGluc3RhbGxlZC4gWW91IGRvblwndCBuZWVkIHRvIHdvcnJ5IGFib3V0IHRo aXMgc2V0dGluZyAnLg0KCQkJCQkJCSdpZiBldmVyeXRoaW5nIHdvcmtzIGZpbmUuJy5uLg0K CQkJJwkJCTwvbGFiZWw+Jy5uLg0KCQkJJwkJPC9wPicubi4NCgkJCScJCTxwPicubi4NCgkJ CScJCQk8c2VsZWN0IHN0eWxlPSJ3aWR0aDo2NTBweDsiIGlkPSJyYWhfcGx1Z2luX2luc3Rh bGxlcl9jb21wcmVzcyIgbmFtZT0iY29tcHJlc3MiPicubi4NCgkJCScJCQkJPG9wdGlvbiB2 YWx1ZT0iMCInLigoJHByZWZzWydjb21wcmVzcyddID09IDApID8gJyBzZWxlY3RlZD0ic2Vs ZWN0ZWQiJyA6ICcnKS4nPkRvd25sb2FkIGFuZCBpbnN0YWxsIG5vcm1hbCB1bmNvbXByZXNz ZWQgdmVyc2lvbnM8L29wdGlvbj4nLm4uDQoJCQknCQkJCTxvcHRpb24gdmFsdWU9IjEiJy4o KCRwcmVmc1snY29tcHJlc3MnXSA9PSAxKSA/ICcgc2VsZWN0ZWQ9InNlbGVjdGVkIicgOiAn JykuJz5Eb3dubG9hZCBhbmQgaW5zdGFsbCBjb21wcmVzc2VkIHZlcnNpb25zPC9vcHRpb24+ Jy5uLg0KCQkJJwkJCTwvc2VsZWN0Picubi4NCgkJCScJCTwvcD4nLm4uDQoJCQkNCgkJCScJ CTxwPicubi4NCgkJCScJCQk8bGFiZWwgZm9yPSJyYWhfcGx1Z2luX2luc3RhbGxlcl9hdXRv dXBkYXRlcyI+Jy5uLg0KCQkJJwkJCQk8c3Ryb25nPkF1dG8tdXBkYXRlci48L3N0cm9uZz4g VG9nZ2xlIGF1dG8tdXBkYXRlcyBvbiBvciBvZmYuIElmIGF1dG8tdXBkYXRlcyBhcmUgb2Zm LCB5b3UgY2FuIHN0aWxsIGNoZWNrIHVwZGF0ZXMgbWFudWFsbHkgd2l0aCB0aGUgPGVtPiJD aGVjayB1cGRhdGVzIG5vdyI8L2VtPiBmZWF0dXJlLicubi4NCgkJCScJCQk8L2xhYmVsPicu bi4NCgkJCScJCTwvcD4nLm4uDQoJCQknCQk8cD4nLm4uDQoJCQknCQkJPHNlbGVjdCBzdHls ZT0id2lkdGg6NjUwcHg7IiBpZD0icmFoX3BsdWdpbl9pbnN0YWxsZXJfYXV0b3VwZGF0ZXMi IG5hbWU9ImF1dG91cGRhdGVzIj4nLm4uDQoJCQknCQkJCTxvcHRpb24gdmFsdWU9IjEiJy4o KCRwcmVmc1snYXV0b3VwZGF0ZXMnXSA9PSAxKSA/ICcgc2VsZWN0ZWQ9InNlbGVjdGVkIicg OiAnJykuJz5DaGVjayBmb3IgdXBkYXRlcyBhdXRvbWF0aWNhbGx5IHRpbWUgdG8gdGltZTwv b3B0aW9uPicubi4NCgkJCScJCQkJPG9wdGlvbiB2YWx1ZT0iMCInLigoJHByZWZzWydhdXRv dXBkYXRlcyddID09IDApID8gJyBzZWxlY3RlZD0ic2VsZWN0ZWQiJyA6ICcnKS4nPlR1cm4g YXV0by11cGRhdGVyIG9mZiwgb25seSBjaGVjayB1cGRhdGVzIG1hbnVhbGx5PC9vcHRpb24+ Jy5uLg0KCQkJJwkJCTwvc2VsZWN0Picubi4NCgkJCQ0KCQkJJwkJPC9wPicubi4NCgkJCScJ CTxpbnB1dCB0eXBlPSJzdWJtaXQiIHZhbHVlPSJTYXZlIiBjbGFzcz0icHVibGlzaCIgLz4n Lm4uDQoJCQknCTwvZm9ybT4nLm47DQoJCTsNCgkJDQoJfQ0KDQoJZnVuY3Rpb24gcmFoX3Bs dWdpbl9pbnN0YWxsZXJfc2F2ZSgpIHsNCgkJDQoJCSRwcmVmcyA9IGFycmF5KA0KCQkJJ2F1 dG91cGRhdGVzJywNCgkJCSdjb21wcmVzcycNCgkJKTsNCgkJDQoJCWZvcmVhY2goJHByZWZz IGFzICR2YWwpIHsNCgkJCXNhZmVfdXBkYXRlKA0KCQkJCSdyYWhfcGx1Z2luX2luc3RhbGxl cicsDQoJCQkJImNvZGU9JyIuZG9TbGFzaChwcygkdmFsKSkuIiciLA0KCQkJCSJuYW1lPSci LmRvU2xhc2goJHZhbCkuIiciDQoJCQkpOw0KCQl9DQoJCQ0KCQlyYWhfcGx1Z2luX2luc3Rh bGxlcl9zZXR0aW5ncygnUHJlZmVyZW5jZXMgc2F2ZWQuJyk7DQoJfQ0KDQoJZnVuY3Rpb24g cmFoX3BsdWdpbl9pbnN0YWxsZXJfY2hlY2tfdXBkYXRlcygkcHJlZnMpIHsNCgkJZ2xvYmFs ICRzdGVwOw0KCQkNCgkJaWYoDQoJCQkoZW1wdHkoJHByZWZzWyd1cGRhdGVkJ10pIG9yIChz dHJ0b3RpbWUoJHByZWZzWyd1cGRhdGVkJ10uJyAnLiRwcmVmc1sndGltZV9pbnRlcnZhbCdd KSA8IHN0cnRvdGltZSgnbm93JykpKSAmJiANCgkJCSgkcHJlZnNbJ2F1dG91cGRhdGVzJ10g PT0gMSBvciAkc3RlcCA9PSAncmFoX3BsdWdpbl9pbnN0YWxsZXJfdXBkYXRlJykNCgkJKSB7 DQoNCgkJCSRjb250ZXh0ID0gDQoJCQkJc3RyZWFtX2NvbnRleHRfY3JlYXRlKGFycmF5KA0K CQkJCQknaHR0cCcgPT4gYXJyYXkoJ3RpbWVvdXQnID0+ICRwcmVmc1sndGltZW91dCddKQ0K CQkJCSkpOw0KDQoJCQlAJGNvbnRlbnQgPSANCgkJCQlmaWxlX2dldF9jb250ZW50cygkcHJl ZnNbJ3VwZGF0ZV9maWxlJ10sMCwkY29udGV4dCk7DQoJCQkNCgkJCWlmKGVtcHR5KCRjb250 ZW50KSkgDQoJCQkJcmV0dXJuIDE7DQoJCQkNCgkJCWVsc2Ugew0KCQkJCSRjb250ZW50ID0g YmFzZTY0X2RlY29kZSgkY29udGVudCk7DQoJCQkJDQoJCQkJaWYoJGNvbnRlbnQgIT0gJHBy ZWZzWydjb250ZW50J10pIHsNCgkJCQkJJHVwMSA9IA0KCQkJCQkJc2FmZV91cGRhdGUoDQoJ CQkJCQkJJ3JhaF9wbHVnaW5faW5zdGFsbGVyJywNCgkJCQkJCQkiY29kZT0nIi5kb1NsYXNo KCRjb250ZW50KS4iJyIsDQoJCQkJCQkJIm5hbWU9J2NvbnRlbnQnIg0KCQkJCQkJKTsNCgkJ CQl9DQoJCQkJDQoJCQkJJG5vdyA9IGRvU2xhc2goc2FmZV9zdHJmdGltZSgnJVktJW0tJWQg JUg6JU06JVMnKSk7DQoJCQkJDQoJCQkJJHVwMiA9IA0KCQkJCQlzYWZlX3VwZGF0ZSgNCgkJ CQkJCSdyYWhfcGx1Z2luX2luc3RhbGxlcicsDQoJCQkJCQkiY29kZT0nJG5vdyciLA0KCQkJ CQkJIm5hbWU9J3VwZGF0ZWQnIg0KCQkJCQkpOw0KCQkJCQ0KCQkJCWlmKChpc3NldCgkdXAx KSAmJiAkdXAxID09IGZhbHNlKSBvciAkdXAyID09IGZhbHNlKSANCgkJCQkJcmV0dXJuIDI7 DQoJCQkJaWYoJGNvbnRlbnQgIT0gJHByZWZzWydjb250ZW50J10pIA0KCQkJCQlyZXR1cm4g MzsNCgkJCQllbHNlIA0KCQkJCQlyZXR1cm4gNDsNCgkJCQkNCgkJCX0NCgkJfQ0KCQlyZXR1 cm47DQoJfQ0KDQoJZnVuY3Rpb24gcmFoX3BsdWdpbl9pbnN0YWxsZXJfbGlzdCgkbWVzc2Fn ZT0nJykgew0KCQlnbG9iYWwgJGV2ZW50Ow0KCQkNCgkJcGFnZXRvcCgnUGx1Z2luIEluc3Rh bGxlcicsJG1lc3NhZ2UpOw0KCQkNCgkJJHByZWZzID0gcmFoX3BsdWdpbl9pbnN0YWxsZXJf cHJlZnMoKTsNCgkJDQoJCS8qDQoJCQlDaGVjayBmb3IgbmV3IGNvbnRlbnQvdXBkYXRlcw0K CQkqLw0KCQkNCgkJJG1zZ3MgPSANCgkJCWFycmF5KA0KCQkJCSdDaGVja2luZyB1cGRhdGVz Li4uIEVycm9yOiBDYW5cJ3QgZmV0Y2ggdGhlIHVwZGF0ZXMgZnJvbSB0aGUgc2VydmVyLiBD aGVjayB5b3VyIHNlcnZlclwncyBjb25uZWN0aW9ucyBhbmQvb3IgdGhhdCB5b3VyIGhvc3Qg YWxsb3dzIG91dGdvaW5nIGNvbm5lY3Rpb25zLCBhbmQgdGhhdCBhbGxvd191cmxfZm9wZW4g aXMgc2V0IHRvIHRydWUuJywNCgkJCQknVXBkYXRlcyBjaGVja2VkLiBFcnJvciB3aGlsZSB3 cml0aW5nIHVwZGF0ZXMgdG8geW91ciBkYXRhYmFzZS4nLA0KCQkJCSdVcGRhdGVzIGNoZWNr ZWQgYW5kIGZvdW5kLicsDQoJCQkJJ1VwZGF0ZXMgY2hlY2tlZC4gTm8gbmV3IHVwZGF0ZXMg Zm91bmQuJw0KCQkJKTsNCgkJDQoJCSRtc2cgPSByYWhfcGx1Z2luX2luc3RhbGxlcl9jaGVj a191cGRhdGVzKCRwcmVmcyk7DQoJCQ0KCQlpZighZW1wdHkoJG1zZykpDQoJCQkkcHJlZnNb J2NvbnRlbnQnXSA9IA0KCQkJCWZldGNoKA0KCQkJCQknY29kZScsDQoJCQkJCSdyYWhfcGx1 Z2luX2luc3RhbGxlcicsDQoJCQkJCSduYW1lJywNCgkJCQkJJ2NvbnRlbnQnDQoJCQkJKTsN CgkJDQoJCSR0YWJsZSA9IA0KCQkJcmFoX3BsdWdpbl9pbnN0YWxsZXJfdGFibGUoDQoJCQkJ JHByZWZzDQoJCQkpOw0KCQkNCgkJZWNobyANCgkJCQ0KCQkJJwk8ZGl2IHN0eWxlPSJ3aWR0 aDo5NTBweDttYXJnaW46MCBhdXRvOyI+Jy5uLg0KCQkJJwkJPGgxPjxzdHJvbmc+cmFoX3Bs dWdpbl9pbnN0YWxsZXI8L3N0cm9uZz4gfCBJbnN0YWxsIHBsdWdpbnM8L2gxPicubi4NCgkJ CQ0KCQkJJwkJPHA+Jy4NCgkJCQkJCScgJiMxODc7IDxhIGhyZWY9Ij9ldmVudD0nLiRldmVu dC4nJmFtcDtzdGVwPXJhaF9wbHVnaW5faW5zdGFsbGVyX3VwZGF0ZSI+Q2hlY2sgZm9yIHVw ZGF0ZXM8L2E+ICcuDQoJCQkJCQknICYjMTg3OyA8YSBocmVmPSI/ZXZlbnQ9Jy4kZXZlbnQu JyZhbXA7c3RlcD1yYWhfcGx1Z2luX2luc3RhbGxlcl9zZXR0aW5ncyI+UHJlZmVyZW5jZXM8 L2E+ICcuDQoJCQkJCQknICYjMTg3OyA8YSBocmVmPSI/ZXZlbnQ9cGx1Z2luJmFtcDtzdGVw PXBsdWdpbl9oZWxwJmFtcDtuYW1lPXJhaF9wbHVnaW5faW5zdGFsbGVyIj5Eb2N1bWVudGF0 aW9uPC9hPiAnLg0KCQkJJwkJPC9wPicuDQoJCQkNCgkJCSgoJG1zZykgPyAnCQk8cCBpZD0i d2FybmluZyI+Jy4kbXNnc1skbXNnLTFdLic8L3A+JyA6ICcnKS4NCgkJCQ0KCQkJJwkJPHRh YmxlIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgY2xhc3M9Imxpc3QiIGlkPSJs aXN0IiBzdHlsZT0id2lkdGg6MTAwJTsiPicubi4NCgkJCScJCQk8dHI+Jy5uLg0KCQkJJwkJ CQk8dGg+Jy5nVHh0KCduYW1lJykuJzwvdGg+Jy5uLg0KCQkJJwkJCQk8dGg+Jy5nVHh0KCd2 ZXJzaW9uJykuJzwvdGg+Jy5uLg0KCQkJJwkJCQk8dGg+Jy5nVHh0KCdkZXNjcmlwdGlvbicp Lic8L3RoPicubi4NCgkJCScJCQkJPHRoPkluc3RhbGxlZDwvdGg+Jy5uLg0KCQkJJwkJCQk8 dGg+JiMxNjA7PC90aD4nLm4uDQoJCQknCQkJPC90cj4nLm47DQoJCQ0KCQlpZigkdGFibGUp DQoJCQllY2hvICR0YWJsZTsNCgkJZWxzZSANCgkJCWVjaG8gDQoJCQknCQkJPHRyPicubi4N CgkJCScJCQkJPHRkIGNvbHNwYW49IjUiPk5vIHBsdWdpbnMgZm91bmQuPC90ZD4nLm4uDQoJ CQknCQkJPC90cj4nLm47DQoJCQ0KCQllY2hvIA0KCQkJDQoJCQknCQk8L3RhYmxlPicubi4N CgkJCQ0KCQkJJwk8L2Rpdj4nLm47DQoJCQkNCgkJCQ0KCX0NCg0KCWZ1bmN0aW9uIHJhaF9w bHVnaW5faW5zdGFsbGVyX3VwZGF0ZSgpIHsNCgkJDQoJCSRwcmVmcyA9IHJhaF9wbHVnaW5f aW5zdGFsbGVyX3ByZWZzKCk7DQoJCQ0KCQlpZigNCgkJCSFlbXB0eSgkcHJlZnNbJ3VwZGF0 ZWQnXSkgJiYgKHN0cnRvdGltZSgkcHJlZnNbJ3VwZGF0ZWQnXS4nICcuJHByZWZzWydtdXBk X2ludGVydmFsJ10pIDwgc3RydG90aW1lKCdub3cnKSkNCgkJKSANCgkJCXNhZmVfdXBkYXRl KA0KCQkJCSJyYWhfcGx1Z2luX2luc3RhbGxlciIsDQoJCQkJImNvZGU9JyciLA0KCQkJCSJu YW1lPSd1cGRhdGVkJyINCgkJCSk7DQoJCQ0KCQlyYWhfcGx1Z2luX2luc3RhbGxlcl9saXN0 KCk7DQoJfQ0KDQoJZnVuY3Rpb24gcmFoX3BsdWdpbl9pbnN0YWxsZXJfaW5zdGFsbCgpIHsN CgkJc2FmZV9xdWVyeSgNCgkJCSJDUkVBVEUgVEFCTEUgSUYgTk9UIEVYSVNUUyAiLnNhZmVf cGZ4KCdyYWhfcGx1Z2luX2luc3RhbGxlcicpLiIgKA0KCQkJCWBuYW1lYCBWQVJDSEFSKDI1 NSkgTk9UIE5VTEwsDQoJCQkJYGNvZGVgIExPTkdURVhUIE5PVCBOVUxMLA0KCQkJUFJJTUFS WSBLRVkoYG5hbWVgKSkiDQoJCSk7DQoJCQ0KCQlyYWhfcGx1Z2luX2luc3RhbGxlcl9wcmVm c19pbnNlcnQoDQoJCQlhcnJheSgNCgkJCQknc2l0ZScgPT4gJ2h0dHA6Ly9yYWhmb3J1bS5i aXovJywNCgkJCQkndXBkYXRlX2ZpbGUnID0+ICdodHRwOi8vcmFoZm9ydW0uYml6Lz9yYWhf cGx1Z2luX2luc3RhbGxlcj0xJywNCgkJCQknZG93bmxvYWRfdXJpJyA9PiAnaHR0cDovL3Jh aGZvcnVtLmJpei8/cmFoX3BsdWdpbl9kb3dubG9hZD1bTkFNRV0nLA0KCQkJCSdkb3dubG9h ZF96aXAnID0+ICdodHRwOi8vcmFoZm9ydW0uYml6Lz9yYWhfcGx1Z2luX2Rvd25sb2FkPVtO QU1FXSZyYWhfdHlwZT16aXAnLA0KCQkJCSdkb3dubG9hZF90aW1lb3V0JyA9PiAnMTAnLA0K CQkJCSdpbmZvX3VyaScgPT4gJ2h0dHA6Ly9yYWhmb3J1bS5iaXovcGx1Z2lucy9bTkFNRV0n LA0KCQkJCSd0aW1lX2ludGVydmFsJyA9PiAnKzE0IGRheXMnLA0KCQkJCSdtdXBkX2ludGVy dmFsJyA9PiAnKzMwIG1pbnV0ZXMnLA0KCQkJCSd0aW1lb3V0JyA9PiAnMycsDQoJCQkJJ3Vw ZGF0ZWQnID0+ICcnLA0KCQkJCSdjb250ZW50JyA9PiAnJywNCgkJCQknY29tcHJlc3MnID0+ ICcwJywNCgkJCQknYXV0b3VwZGF0ZXMnID0+ICcxJw0KCQkJKQ0KCQkpOw0KCX0NCg0KCWZ1 bmN0aW9uIHJhaF9wbHVnaW5faW5zdGFsbGVyX3ByZWZzKCkgew0KCQkNCgkJJG91dCA9IGFy cmF5KCk7DQoJCQ0KCQkkcnMgPSANCgkJCXNhZmVfcm93cygNCgkJCQknbmFtZSxjb2RlJywN CgkJCQkncmFoX3BsdWdpbl9pbnN0YWxsZXInLA0KCQkJCScxPTEnDQoJCQkpOw0KCQkNCgkJ Zm9yZWFjaCgkcnMgYXMgJGEpIA0KCQkJJG91dFskYVsnbmFtZSddXSA9ICRhWydjb2RlJ107 DQoJCQ0KCQlyZXR1cm4gJG91dDsNCgkJDQoJfQ0KDQoJZnVuY3Rpb24gcmFoX3BsdWdpbl9p bnN0YWxsZXJfcHJlZnNfaW5zZXJ0KCRhcnJheSkgew0KCQkNCgkJZm9yZWFjaCgkYXJyYXkg YXMgJGtleSA9PiAkdmFsKSB7DQoJCQkNCgkJCWlmKA0KCQkJCXNhZmVfY291bnQoDQoJCQkJ CSdyYWhfcGx1Z2luX2luc3RhbGxlcicsDQoJCQkJCSJuYW1lPSciLmRvU2xhc2goJGtleSku IiciDQoJCQkJKSA9PSAwDQoJCQkpDQoJCQkJc2FmZV9pbnNlcnQoDQoJCQkJCSdyYWhfcGx1 Z2luX2luc3RhbGxlcicsDQoJCQkJCSJuYW1lPSciLmRvU2xhc2goJGtleSkuIicsY29kZT0n Ii5kb1NsYXNoKCR2YWwpLiInIg0KCQkJCSk7DQoJCQkNCgkJfQ0KCX0NCg0KCWZ1bmN0aW9u IHJhaF9wbHVnaW5faW5zdGFsbGVyX3RhYmxlKCRwcmVmcywkaW5zdGFsbGluZz0nJykgew0K CQkNCgkJaWYoZW1wdHkoJHByZWZzWydjb250ZW50J10pKQ0KCQkJcmV0dXJuICcnOw0KCQkN CgkJJHJvd3MgPSBleHBsb2RlKCdbcm93XScsJHByZWZzWydjb250ZW50J10pOw0KCQkNCgkJ JHJzID0gDQoJCQlzYWZlX3Jvd3MoDQoJCQkJJ3ZlcnNpb24sbmFtZScsDQoJCQkJJ3R4cF9w bHVnaW4nLA0KCQkJCScxPTEnDQoJCQkpOw0KCQkNCgkJZm9yZWFjaCgkcnMgYXMgJGEpDQoJ CQkkcGx1Z2luWyRhWyduYW1lJ11dID0gJGFbJ3ZlcnNpb24nXTsNCgkJDQoJCSRvdXQgPSBh cnJheSgpOw0KCQkNCgkJZm9yZWFjaCgkcm93cyBhcyAkcm93KSB7DQoJCQkNCgkJCSRmaWVs ZCA9IGV4cGxvZGUoJ3wnLCRyb3cpOw0KCQkJDQoJCQlpZighaXNzZXQoJGZpZWxkWzJdKSkN CgkJCQljb250aW51ZTsNCgkJCQ0KCQkJJG5hbWUgPSB0cmltKCRmaWVsZFswXSk7DQoJCQkk dmVyc2lvbiA9IHRyaW0oJGZpZWxkWzJdKTsNCgkJCSRkZXNjcmlwdGlvbiA9IHRyaW0oJGZp ZWxkWzFdKTsNCgkJCQ0KCQkJaWYoZW1wdHkoJG5hbWUpIG9yIGVtcHR5KCR2ZXJzaW9uKSBv ciBlbXB0eSgkZGVzY3JpcHRpb24pKQ0KCQkJCWNvbnRpbnVlOw0KCQkJDQoJCQkkaW5zdGFs bGVkID0gaXNzZXQoJHBsdWdpblskbmFtZV0pID8gKCgkcGx1Z2luWyRuYW1lXSkgPyAkcGx1 Z2luWyRuYW1lXSA6ICcwLjEnKSA6ICcnOw0KCQkJDQoJCQlpZighZW1wdHkoJGluc3RhbGxp bmcpICYmICRuYW1lID09ICRpbnN0YWxsaW5nICYmICRpbnN0YWxsZWQgIT0gJHZlcnNpb24p IHsNCgkJCQlyZXR1cm4gdHJ1ZTsNCgkJCX0NCgkJCQ0KCQkJaWYoIWVtcHR5KCRpbnN0YWxs aW5nKSkNCgkJCQljb250aW51ZTsNCgkJCQ0KCQkJJG5hbWUgPSBodG1sc3BlY2lhbGNoYXJz KCRuYW1lKTsNCgkJCQ0KCQkJaWYoJGluc3RhbGxlZCkgDQoJCQkJJGZvcm0gPSAoJGluc3Rh bGxlZCAhPSAkdmVyc2lvbikgPyByYWhfcGx1Z2luX2luc3RhbGxlcl9saW5rKGdUeHQoJ3Vw ZGF0ZScpLCRuYW1lKSA6ICcmIzE2MDsnOw0KCQkJZWxzZSANCgkJCQkkZm9ybSA9IHJhaF9w bHVnaW5faW5zdGFsbGVyX2xpbmsoZ1R4dCgnaW5zdGFsbCcpLCRuYW1lKTsNCgkJCQ0KCQkJ DQoJCQkkdXJsID0gDQoJCQkJc3RyX3JlcGxhY2UoDQoJCQkJCSdbTkFNRV0nLA0KCQkJCQkk bmFtZSwNCgkJCQkJJHByZWZzWydpbmZvX3VyaSddDQoJCQkJKTsNCgkJDQoJCQkkb3V0W10g PSANCgkJCQknCTx0cj4nLm4uDQoJCQkJJwkJPHRkPjxhIHRhcmdldD0iX2JsYW5rIiBocmVm PSInLiR1cmwuJyI+Jy4kbmFtZS4nPC9hPjwvdGQ+Jy5uLg0KCQkJCScJCTx0ZD4nLmh0bWxz cGVjaWFsY2hhcnMoJHZlcnNpb24pLic8L3RkPicubi4NCgkJCQknCQk8dGQ+Jy5odG1sc3Bl Y2lhbGNoYXJzKCRkZXNjcmlwdGlvbikuJzwvdGQ+Jy5uLg0KCQkJCScJCTx0ZD4nLigoJGlu c3RhbGxlZCkgPyAkaW5zdGFsbGVkIDogJyYjMTYwOycpLic8L3RkPicubi4NCgkJCQknCQk8 dGQ+Jy4kZm9ybS4nPC90ZD4nLm4uDQoJCQkJJwk8L3RyPicubjsNCgkJfQ0KCQkNCgkJcmV0 dXJuIGltcGxvZGUoJycsJG91dCk7DQoNCgl9DQoNCglmdW5jdGlvbiByYWhfcGx1Z2luX2lu c3RhbGxlcl9saW5rKCRsYWJlbD0nJywkcGx1Z2luPScnKSB7DQoJCWdsb2JhbCAkZXZlbnQ7 DQoJCXJldHVybiANCgkJCSc8YSBocmVmPSI/ZXZlbnQ9Jy4kZXZlbnQuJyZhbXA7c3RlcD1y YWhfcGx1Z2luX2luc3RhbGxlcl9kb3dubG9hZCZhbXA7cGx1Z2luX25hbWU9Jy4kcGx1Z2lu LiciPicuJGxhYmVsLic8L2E+Jw0KCQk7DQoJfQ0KDQoJZnVuY3Rpb24gcmFoX3BsdWdpbl9p bnN0YWxsZXJfZG93bmxvYWQoKSB7DQoJCQ0KCQkkbmFtZSA9IHRyaW0oZ3BzKCdwbHVnaW5f bmFtZScpKTsNCgkJJHByZWZzID0gcmFoX3BsdWdpbl9pbnN0YWxsZXJfcHJlZnMoKTsNCgkJ DQoJCWlmKGVtcHR5KCRuYW1lKSkgew0KCQkJcmFoX3BsdWdpbl9pbnN0YWxsZXJfbGlzdCgn SW5jb3JyZWN0IHNlbGVjdGlvbi4nKTsNCgkJCXJldHVybjsNCgkJfQ0KDQoJCWlmKHJhaF9w bHVnaW5faW5zdGFsbGVyX3RhYmxlKCRwcmVmcywkbmFtZSkgIT0gdHJ1ZSkgew0KCQkJcmFo X3BsdWdpbl9pbnN0YWxsZXJfbGlzdCgnQWxyZWFkeSBpbnN0YWxsZWQgb3IgZmFsc2Ugc2Vs ZWN0aW9uLicpOw0KCQkJcmV0dXJuOw0KCQl9DQoJCQ0KCQlpZigkcHJlZnNbJ2NvbXByZXNz J10gPT0gMSkNCgkJCSR1cmkgPSAkcHJlZnNbJ2Rvd25sb2FkX3ppcCddOw0KCQllbHNlIA0K CQkJJHVyaSA9ICRwcmVmc1snZG93bmxvYWRfdXJpJ107DQoNCgkJJHVybCA9IA0KCQkJc3Ry X3JlcGxhY2UoDQoJCQkJJ1tOQU1FXScsDQoJCQkJJG5hbWUsDQoJCQkJJHVyaQ0KCQkJKTsN CgkJDQoJCSRjb250ZXh0ID0gDQoJCQlzdHJlYW1fY29udGV4dF9jcmVhdGUoYXJyYXkoDQoJ CQkJJ2h0dHAnID0+IGFycmF5KCd0aW1lb3V0JyA9PiAkcHJlZnNbJ2Rvd25sb2FkX3RpbWVv dXQnXSkNCgkJCSkpOw0KDQoJCUAkcGx1Z2luID0gZmlsZV9nZXRfY29udGVudHMoJHVybCwg MCwgJGNvbnRleHQpOw0KCQkNCgkJaWYoZW1wdHkoJHBsdWdpbikpIHsNCgkJCXJhaF9wbHVn aW5faW5zdGFsbGVyX2xpc3QoJ0Rvd25sb2FkaW5nIHRoZSBwbHVnaW4gZmFpbGVkOiB1bmFi bGUgdG8gZ2V0IHRoZSBmaWxlLicpOw0KCQkJcmV0dXJuOw0KCQl9DQoNCgkJJF9QT1NUWydp bnN0YWxsX25ldyddID0gJ1VwbG9hZCc7CQ0KCQkkX1BPU1RbJ3BsdWdpbiddID0gJHBsdWdp bjsNCgkJJF9QT1NUWydwbHVnaW42NCddID0gJHBsdWdpbjsNCgkJJF9QT1NUWydldmVudCdd ID0gJ3BsdWdpbic7DQoJCSRfUE9TVFsnc3RlcCddID0gJ3BsdWdpbl92ZXJpZnknOw0KCQkk c3RlcCA9ICdwbHVnaW5fdmVyaWZ5JzsNCgkJJGV2ZW50ID0gJ3BsdWdpbic7DQoJCQ0KCQlp bmNsdWRlX29uY2UgdHhwYXRoLicvaW5jbHVkZS90eHBfcGx1Z2luLnBocCc7DQoJCWV4aXQ7 DQoJfSI7czo0OiJ0eXBlIjtzOjE6IjEiO3M6NToiZmxhZ3MiO3M6MToiMCI7czo1OiJvcmRl ciI7czoxOiI1IjtzOjM6Im1kNSI7czozMjoiNDUyZWM0MTU3Yjk4NTFlZjNhYzY4ZmI3MzYx OTZhMjciO30=