# smd_slimbox 0.29a # Image gallery lightbox wrapper using Christophe Beyl's Slimbox # Stef Dawson # http://stefdawson.com # ..................................................................... # This is a plugin for Textpattern - http://textpattern.com/ # To install: textpattern > admin > plugins # Paste the following text into the 'Install plugin' box: # ..................................................................... YTo5OntzOjQ6Im5hbWUiO3M6MTE6InNtZF9zbGltYm94IjtzOjY6ImF1dGhvciI7czoxMToiU3RlZiBEYXdzb24iO3M6MTA6ImF1dGhvcl91cmkiO3M6MjE6Imh0dHA6Ly9zdGVmZGF3c29uLmNvbSI7czo3OiJ2ZXJzaW9uIjtzOjU6IjAuMjlhIjtzOjExOiJkZXNjcmlwdGlvbiI7czo2MjoiSW1hZ2UgZ2FsbGVyeSBsaWdodGJveCB3cmFwcGVyIHVzaW5nIENocmlzdG9waGUgQmV5bCdzIFNsaW1ib3giO3M6NDoiaGVscCI7czo0MDk6IjxoMSBpZD0idG9wIj5zbWRfc2xpbWJveDwvaDE+DQo8cD5Gb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB1c2FnZSwgYnVncywgZmVhdHVyZXMgZXRjLCBwbGVhc2UgPGEgaHJlZj0iaHR0cDovL2ZvcnVtLnRleHRwYXR0ZXJuLmNvbS92aWV3dG9waWMucGhwP2lkPTIwNzE0Ij52aXNpdCB0aGUgZm9ydW0gdGhyZWFkPC9hPi48L3A+DQoNCjxwIGNsYXNzPSJyZXF1aXJlZCI+UmVxdWlyZXMgPGEgaHJlZj0iaHR0cDovL3N0ZWZkYXdzb24uY29tL2Rvd25sb2Fkcy9zbWRfbGliX3YwLjIyLnR4dCI+c21kX2xpYiB2MC4yMjwvYT4gdG8gYmUgaW5zdGFsbGVkIGFuZCBhY3RpdmF0ZWQuPHA+DQoNCjxwPlNlZSB0aGUgZG9jdW1lbnRhdGlvbiBkaXN0cmlidXRlZCB3aXRoIHRoZSBwbHVnaW4gZm9yIGRldGFpbGVkIHVzYWdlLjwvcD4iO3M6NDoiY29kZSI7czoxOTUwNToiLy8gdjAuMSAgIEluaXRpYWwgcHVibGljIHJlbGVhc2UNCi8vIHYwLjExIEFkZGVkICFjYXRlZ29yeSBzdXBwb3J0DQovLyB2MC4xMiBBZGRlZCB0ZXh0cG9zIG9wdGlvbiAodGhhbmtzIGxlZSkgYW5kIGltYWdlaWQgb3B0aW9uICh0aGFua3Mgd291YXJlbikNCi8vIHYwLjIgICBqcyBhbmQgY3NzIGNhbiBub3cgYmUgbG9hZGVkIGVsc2V3aGVyZSAodGhhbmtzIGpzdHViYnMpLiBBZGRlZCB3cmFwdGFnIGFuZCBjaGFuZ2VkIGRlZmF1bHRzIHRvIG1ha2Ugb3V0cHV0IGxlc3MgbGlrZSB0YWctc291cCAodGhhbmtzIHdvdWFyZW4pDQovLyB2MC4yMSBBZGRlZCBvcmRlcmJ5PSJmaXhlZCIgdG8gYWxsb3dlZCBmaXhlZCBpbWFnZWlkIG9yZGVyaW5nICh0aGFua3MgbGVlKS4gJHdoZXJlIHdhcm5pbmcgc3F1YXNoZWQgKHRoYW5rcyBiZW5qaWJvdCkNCi8vIHYwLjIyIE5vdyB1c2VzIHNtZF9saWIgYW5kIHN1YmNhdHMuIEFsc28gTUxQKE11bHRpLWxpbmd1YWwpLWF3YXJlLg0KLy8gdjAuMjMgRml4ZWQgb3JkZXJieSB3aGVuIHVzaW5nIHJhbmRvbSAodGhhbmtzIG1yZGFsZSkgYW5kIGFkZGVkIGFiaWxpdHkgdG8gb3ZlcnJpZGUgbWF4bGltaXQNCi8vIHYwLjI0IEFkZGVkIGxpYmNoZWNrICh0aGFua3MgcGFwdWFzcykuIE51bWVyaWMgcmFuZ2VzIG5vdyBhbGxvd2VkIGZvciBJRHMgKHNtZF9saWIpLiBGaXhlZCBlbXB0eSBmaWVsZC9pbWFnZWlkIG5lZ2F0aW9uIGJ1Z3MuIEZpeGVkIG5leHQvcHJldiBidXR0b25zIGZvciBNTFAuDQovLyB2MC4yNGIgRml4ZWQgcGFnaW5nIGluIHN1YmRpcmVjdG9yeSBpbnN0YWxsYXRpb25zICh0aGFua3MgdWx0cmFtZWdhIGFuZCBRd2VzdCkNCi8vIHYwLjI1IEV4dGVuZGVkIGdyb3VwbmFtZSAodGhhbmtzIFtBeGVsXSkNCi8vIHYwLjI1YSBCdW5kbGVkIGxhdGVzdCB2ZXJzaW9uIG9mIHNsaW1ib3ggaW4gdGhlIHBhY2thZ2UuIE1hZGUgdGhlIGRvY3MgZWFzaWVyIHRvIHJlYWQuDQovLyB2MC4yNiBBZGRlZCB0cnVlIG11bHRpcGxlIGdhbGxlcnkgc3VwcG9ydCAodGhhbmtzIHdoZWF0aWN1cykNCi8vIHYwLjI3IEFkZGVkIHRodW1iICh0aGFua3MgcHJvZ3JlNTUpDQovLyB2MC4yOCBBZGRlZCBpbWFnZWNhcHRpb24gKHRoYW5rcyBBZGFtX1YpDQovLyB2MC4yOSBBZGRlZCB0aHVtYnNpemUgKHRoYW5rcyBTaW1hbmVrKQ0KLy8gdjAuMjlhIEZpeGVkIHVuZGVmaW5lZCBpbmRleCB3YXJuaW5ncyAodGhhbmtzIEFtYml0aW91c2xlbW9uKQ0KDQpyZXF1aXJlX3BsdWdpbignc21kX2xpYicpOw0KcmVnaXN0ZXJfY2FsbGJhY2soJ3NtZF9zYm94X2VudW1fc3RyJywgJ2wxMG4uZW51bWVyYXRlX3N0cmluZ3MnKTsNCmdsb2JhbCAkc21kX3Nib3hfbGliczsNCmdsb2JhbCAkc21kX3Nib3hfc3RyOw0KJHNtZF9zYm94X3N0ciA9IGFycmF5KA0KCSdpbmNlcnInID0+ICdJZiB1c2luZyB0aGUgc2NyaXB0cyBvcHRpb24sIHNwZWNpZnkgdXAgdG8gdGhyZWUgcmVxdWlyZWQgc2NyaXB0cyBpbiB0aGlzIG9yZGVyOiAmbHQ7dHhwOnNtZF9zbGltYm94X2luYyBzY3JpcHRzPSJtb290b29sc0pTTG9jYXRpb24sIHNsaW1ib3hKU0xvY2F0aW9uLCBzbGltYm94Q1NTTG9jYXRpb24iIC8mZ3Q7LiBJZiBhbnkgcG9zaXRpb25zIGFyZSBsZWZ0IGVtcHR5LCB0aGUgbWlzc2luZyBzY3JpcHRzIG11c3QgYmUgc3VwcGxpZWQgdmlhIHRoZSBqc2Rpci9jc3NkaXIgb3B0aW9ucywgb3IgbG9hZGVkIGV4dGVybmFsbHkgYW5kIHRvbGQgdG8gc2tpcCB0aGlzIHN0ZXAuIFRoZSB0aHJlZSB2YWx1ZXMgY2FuIGVpdGhlciBiZSBhIGZ1bGwgWEhUTUwgc3RyaW5nIChlLmcuIGFzIHJldHVybmVkIGJ5IHR4cDpzdG1famF2YXNjcmlwdCBvciB0eHA6Y3NzLCBhbHRob3VnaCB0aGV5IG1heSBub3Qgd29yayBkaXJlY3RseSB3aXRoaW4gdGhlIHRhZzsgc2VlIHRoZSBkb2NzKSBvciBzaW1wbHkgcGF0aHMgdG8gdGhlIGZpbGVzLiBOb3RlIHRoYXQgbm8gdmFsaWRhdGlvbiBpcyBwZXJmb3JtZWQgdG8gY2hlY2sgaWYgdGhlIGZpbGVzIGV4aXN0LicsDQoJJ25vaW5jJyA9PiAnUmVxdWlyZWQgbGlicmFyaWVzIG5vdCBsb2FkZWQuIENhbGwgJmx0O3R4cDpzbWRfc2xpbWJveF9pbmMgLyZndDsgaW4gdGhlICZsdDtoZWFkJmd0OyBvZiB0aGlzIHBhZ2UuJywNCgknbmV4dF9sYmwnID0+ICdOZXh0JywNCgkncHJldl9sYmwnID0+ICdQcmV2JywNCik7DQoNCi8vIFVzZSB0aGlzIHRvIGluY2x1ZGUgdGhlIGxpYnJhcmllcyBpbiB0aGUgPGhlYWQ+IHNlY3Rpb24gb2YgdGhlIHBhZ2UNCmZ1bmN0aW9uIHNtZF9zbGltYm94X2luYygkYXR0cykgew0KCWdsb2JhbCAkc21kX3Nib3hfbGliczsNCglnbG9iYWwgJHNtZF9zYm94X3N0cjsNCg0KCWlmIChpc19hcnJheSgkYXR0cykpIGV4dHJhY3QoJGF0dHMpOw0KDQoJLy8gRnVuY3Rpb24gb3B0aW9ucw0KCSRqc2RpciA9IGlzc2V0KCRqc2RpcikgPyBkb1NsYXNoKCRqc2RpcikgOiAnJzsNCgkkY3NzZGlyID0gaXNzZXQoJGNzc2RpcikgPyBkb1NsYXNoKCRjc3NkaXIpIDogJyc7DQoJJHNjcmlwdHMgPSBpc3NldCgkc2NyaXB0cykgPyAkc2NyaXB0cyA6ICcnOw0KCSRza2lwID0gaXNzZXQoJHNraXApID8gJHNraXAgOiAiMCI7DQoNCgkkbW9kc1JlcXVpcmVkID0gMzsNCgkkbW9kc0xvYWRlZCA9IDA7DQoJJG91dFN0ciA9ICcnOw0KDQoJaWYgKCRza2lwID4gMCkgew0KCQkkbW9kc0xvYWRlZCA9ICRza2lwOw0KCX0NCg0KCS8vIEluY2x1ZGUgdGhlIGpzIGxpYnMgaWYgcmVxdWlyZWQNCglpZiAoJGpzZGlyICE9ICcnKSB7DQoJCSRvdXRTdHIgLj0gJzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9IicgLiRqc2Rpci4gJy9tb290b29scy5qcyI+PC9zY3JpcHQ+Jy5uOw0KCQkkb3V0U3RyIC49ICc8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSInIC4kanNkaXIuICcvc2xpbWJveC5qcyI+PC9zY3JpcHQ+Jy5uOw0KCQkkbW9kc0xvYWRlZCArPSAyOw0KCX0NCg0KCS8vIEZpbmQgd2hpY2ggc2NyaXB0cyB0byBhdXRvLWxvYWQNCglpZiAoKCRzY3JpcHRzICE9ICcnKSAmJiAoJG1vZHNMb2FkZWQgPCAkbW9kc1JlcXVpcmVkKSkgew0KCQkkbW9kc0xpc3QgPSBwcmVnX3NwbGl0KCcvWyxdKy8nLCRzY3JpcHRzLCRtb2RzUmVxdWlyZWQpOw0KCQkkanNwcmVmaXggPSAiPHNjcmlwdCI7DQoJCSRjc3NwcmVmaXggPSAiPGxpbmsiOw0KCQkkdHhwcHJlZml4ID0gIjx0eHAiOw0KCQlmb3JlYWNoICgkbW9kc0xpc3QgYXMgJGZpbGVvYmopIHsNCgkJCSRmaWxlb2JqID0gdHJpbSgkZmlsZW9iaik7DQoJCQlpZiAoJGZpbGVvYmogPT0gJycpIHsNCgkJCQkkbW9kc0xvYWRlZC0tOw0KCQkJfSBlbHNlIGlmIChzdWJzdHIoJGZpbGVvYmosIDAsIHN0cmxlbigkanNwcmVmaXgpKSA9PT0gJGpzcHJlZml4KSB7DQoJCQkJJG91dFN0ciAuPSAkZmlsZW9iai5uOw0KCQkJfSBlbHNlIGlmIChzdWJzdHIoJGZpbGVvYmosIDAsIHN0cmxlbigkY3NzcHJlZml4KSkgPT09ICRjc3NwcmVmaXgpIHsNCgkJCQkkb3V0U3RyIC49ICRmaWxlb2JqLm47DQoJCQl9IGVsc2UgaWYgKHN1YnN0cigkZmlsZW9iaiwgMCwgc3RybGVuKCR0eHBwcmVmaXgpKSA9PT0gJHR4cHByZWZpeCkgew0KCQkJCSRvdXRTdHIgLj0gcGFyc2UoJGZpbGVvYmopOw0KCQkJfSBlbHNlIHsNCgkJCQlpZiAoJG1vZHNMb2FkZWQgPCAyKSB7DQoJCQkJCSRvdXRTdHIgLj0gJzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9IicgLiRmaWxlb2JqLiAnIj48L3NjcmlwdD4nLm47DQoJCQkJfSBlbHNlIHsNCgkJCQkJJG91dFN0ciAuPSAnPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSInIC4kZmlsZW9iai4gJyIgdHlwZT0idGV4dC9jc3MiIG1lZGlhPSJzY3JlZW4iIC8+Jy5uOw0KCQkJCX0NCgkJCX0NCgkJCSRtb2RzTG9hZGVkKys7DQoJCX0NCgl9DQoNCgkvLyBJbmNsdWRlIHRoZSBjc3MgZmlsZSBpZiByZXF1aXJlZA0KCWlmICgkY3NzZGlyICE9ICcnKSB7DQoJCSRvdXRTdHIgLj0gJzxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iJyAuJGNzc2Rpci4gJy9zbGltYm94LmNzcyIgdHlwZT0idGV4dC9jc3MiIG1lZGlhPSJzY3JlZW4iIC8+Jy5uOw0KCQkkbW9kc0xvYWRlZCsrOw0KCX0NCg0KCS8vIFNldCB0aGUgZmxhZyB0byBzYXkgdGhlIGxpYnMgYXJlIG9rLiBTaGFtZSB0aGVyZSdzIG5vIGVhc3kgcHJvdmlzaW9uIGZvcg0KCS8vIGNoZWNraW5nIHRoZSBmaWxlcyBhY3R1YWxseSBleGlzdCBhdCB0aGUgZ2l2ZW4gbG9jYXRpb25zLCBidXQgaGV5DQoJaWYgKCRtb2RzTG9hZGVkID09ICRtb2RzUmVxdWlyZWQpIHsNCgkJJHNtZF9zYm94X2xpYnMgPSB0cnVlOw0KCX0gZWxzZSB7DQoJCSRzbWRfc2JveF9saWJzID0gZmFsc2U7DQoJCSRvdXRTdHIgPSBzbWRfZ1R4dCgkc21kX3Nib3hfc3RyLCdpbmNlcnInKS5uOw0KCX0NCg0KCXJldHVybiAkb3V0U3RyOw0KfQ0KDQpmdW5jdGlvbiBzbWRfc2xpbWJveCgkYXR0cykgew0KCWdsb2JhbCAkcHJldGV4dCwgJHRoaXNhcnRpY2xlLCAkaW1nX2RpcjsNCglnbG9iYWwgJHNtZF9zYm94X2xpYnMsICRzbWRfc2JveF9zdHI7DQoNCglpZiAoaXNfYXJyYXkoJGF0dHMpKSBleHRyYWN0KCRhdHRzKTsNCgkkY2F0aWRvcHRzID0gKGlzc2V0KCRjYXRlZ29yeSkgfHwgaXNzZXQoJGltYWdlaWQpKSA/IHRydWUgOiBmYWxzZTsNCg0KCS8vIFBsdWdpbiBvcHRpb25zDQoJJGxpYmNoZWNrID0gaXNzZXQoJGxpYmNoZWNrKSA/ICRsaWJjaGVjazogIjEiOw0KCSRpbWFnZWlkID0gaXNzZXQoJGltYWdlaWQpID8gZG9TbGFzaCgkaW1hZ2VpZCkgOiAnJzsNCgkkY2F0ZWdvcnkgPSBpc3NldCgkY2F0ZWdvcnkpID8gZG9TbGFzaCgkY2F0ZWdvcnkpIDogKCgkaW1hZ2VpZD09IiIpID8gJHByZXRleHRbJ2MnXTogJycpOw0KCSRzdWJjYXRzID0gaXNzZXQoJHN1YmNhdHMpID8gdHJ1ZSA6IGZhbHNlOw0KCSRjYXRsYWJlbCA9IGlzc2V0KCRjYXRsYWJlbCkgPyAkY2F0bGFiZWw6ICJhcnRpY2xlLSI7DQoJJGdyb3VwbmFtZSA9IGlzc2V0KCRncm91cG5hbWUpID8gJGdyb3VwbmFtZTogInNtZCI7DQoJJHRodW1iID0gaXNzZXQoJHRodW1iKSA/IHRydWUgOiBmYWxzZTsNCgkkbWF4bGltaXQgPSBpc3NldCgkbWF4bGltaXQpID8gJG1heGxpbWl0OiAiOTk5OTkiOw0KCSRsaW1pdCA9IGlzc2V0KCRsaW1pdCkgPyAkbGltaXQ6ICIwIjsNCgkkb3JkZXJieSA9IGlzc2V0KCRvcmRlcmJ5KSA/ICRvcmRlcmJ5OiAiY2F0ZWdvcnkiOw0KCSRzaG93cGFnZWxpbmtzID0gaXNzZXQoJHNob3dwYWdlbGlua3MpID8gJHNob3dwYWdlbGlua3M6ICIxIjsNCgkkZ2FsbGVyeWlkID0gaXNzZXQoJGdhbGxlcnlpZCkgPyAkZ2FsbGVyeWlkOiAiPzQ6NiI7DQoJJHRodW1ic2l6ZSA9IGlzc2V0KCR0aHVtYnNpemUpID8gJHRodW1ic2l6ZSA6ICIiOw0KCSRwcmV2bGFiZWw9IGlzc2V0KCRwcmV2bGFiZWwpID8gJHByZXZsYWJlbDogc21kX2dUeHQoJHNtZF9zYm94X3N0ciwgJ3ByZXZfbGJsJyk7DQoJJG5leHRsYWJlbD0gaXNzZXQoJG5leHRsYWJlbCkgPyAkbmV4dGxhYmVsOiBzbWRfZ1R4dCgkc21kX3Nib3hfc3RyLCAnbmV4dF9sYmwnKTsNCgkkaW1hZ2VjYXB0aW9uID0gaXNzZXQoJGltYWdlY2FwdGlvbikgPyAkaW1hZ2VjYXB0aW9uOiAiP2NhcHRpb24iOw0KCSRzaG93Y2FwdGlvbiA9IGlzc2V0KCRzaG93Y2FwdGlvbikgPyAkc2hvd2NhcHRpb246ICIwIjsNCgkkc2hvd2FsdCA9IGlzc2V0KCRzaG93YWx0KSA/ICRzaG93YWx0OiAiMCI7DQoJJHRleHRwb3MgPSBpc3NldCgkdGV4dHBvcykgPyAkdGV4dHBvczogImJlbG93IjsNCgkkd3JhcHRhZyA9IGlzc2V0KCR3cmFwdGFnKSA/ICR3cmFwdGFnOiAiIjsNCgkkY2VsbGNsYXNzID0gaXNzZXQoJGNlbGxjbGFzcykgPyAkY2VsbGNsYXNzOiAiIjsNCgkkaW1nY2xhc3MgPSBpc3NldCgkaW1nY2xhc3MpID8gJGltZ2NsYXNzOiAiIjsNCgkkbmF2Y2xhc3MgPSBpc3NldCgkbmF2Y2xhc3MpID8gJG5hdmNsYXNzOiAiIjsNCgkkcHJldmNsYXNzID0gaXNzZXQoJHByZXZjbGFzcykgPyAkcHJldmNsYXNzOiAic21kX3NsaW1ib3hfcHJldiI7DQoJJG5leHRjbGFzcyA9IGlzc2V0KCRuZXh0Y2xhc3MpID8gJG5leHRjbGFzczogInNtZF9zbGltYm94X25leHQiOw0KCSRjYXB0aW9uY2xhc3MgPSBpc3NldCgkY2FwdGlvbmNsYXNzKSA/ICRjYXB0aW9uY2xhc3M6ICIiOw0KCSRhbHRjbGFzcyA9IGlzc2V0KCRhbHRjbGFzcykgPyAkYWx0Y2xhc3M6ICIiOw0KDQoJJGZpeGVkT3JkZXIgPSBmYWxzZTsNCgkkZ2FsbElEID0gIiI7DQoJJGZpZWxkTWFwID0gYXJyYXkoIm5hbWUiID0+ICJuYW1lIiwNCgkJCQkJCQkiaWQiID0+ICJpZCIsDQoJCQkJCQkJImFsdCIgPT4gImFsdCIsDQoJCQkJCQkJImNhcHRpb24iID0+ICJjYXB0aW9uIiwNCgkJCQkJCQkiY2F0ZWdvcnkiID0+ICJjYXRlZ29yeSIsDQoJCQkJCQkJImF1dGhvciIgPT4gImF1dGhvciIsDQoJCQkJCQkJImRhdGUiID0+ICJkYXRlIiwNCgkJCQkJCQkiZXh0IiA9PiAiZXh0IiwNCgkJCQkJCQkidyIgPT4gIndpZHRoIiwNCgkJCQkJCQkiaCIgPT4gImhlaWdodCIpOw0KDQoJLy8gVGhlIGdhbGxlcnkgaWRlbnRpZmllciBpcyB1c2VkIGZvciBrZWVwaW5nIHRyYWNrIG9mIG5leHQvcHJldiB0aHVtYnBhZ2UgbGlua3MNCglpZiAoJGdhbGxlcnlpZCA9PSAiIiB8fCBzdWJzdHIoJGdhbGxlcnlpZCwwLDEpID09ICI/Iikgew0KCQkvLyBHZW5lcmF0ZSBhIHVuaXF1ZSBJRCBmb3IgdGhpcyBnYWxsZXJ5IGluc3RhbmNlDQoJCSRnYWxsVG1wID0gbWQ1KCRjYXRlZ29yeS4kaW1hZ2VpZC4kb3JkZXJieS4kbGltaXQuJG1heGxpbWl0LiR3cmFwdGFnKTsNCgkJbGlzdCgkZ2FsbExlbiwgJGdhbGxTa2lwKSA9IGV4cGxvZGUoIjoiLCBzdWJzdHIoJGdhbGxlcnlpZCwxKSk7DQoJCSRnYWxsTGVuID0gIChlbXB0eSgkZ2FsbExlbikpID8gIjQiIDogJGdhbGxMZW47DQoJCSRnYWxsU2tpcCA9ICAoZW1wdHkoJGdhbGxTa2lwKSkgPyAiMSIgOiAkZ2FsbFNraXA7DQoJCWZvciAoJGlkeCA9IDAsICRjbnQgPSAwOyAkY250IDwgJGdhbGxMZW47ICRjbnQrKywgJGlkeCA9ICgoJGlkeCskZ2FsbFNraXApICUgc3RybGVuKCRnYWxsVG1wKSkpIHsNCgkJCSRnYWxsSUQgLj0gJGdhbGxUbXBbJGlkeF07DQoJCX0NCgl9IGVsc2Ugew0KCQkkZ2FsbElEID0gJGdhbGxlcnlpZDsNCgl9DQoNCgkvLyBNYWluIGNvZGUgYm9keQ0KCWlmICgoJGxpYmNoZWNrID09IDEpICYmICgkc21kX3Nib3hfbGlicyA9PSBmYWxzZSkpIHsNCgkJJG91dFN0ciA9IHNtZF9nVHh0KCRzbWRfc2JveF9zdHIsJ25vaW5jJyk7DQoJfSBlbHNlIHsNCgkJLy8gVGhlIGRhdGFiYXNlIGZpZWxkcyByZXF1aXJlZA0KCQkkZmllbGRzID0gJ2lkLG5hbWUsY2FwdGlvbixhbHQsY2F0ZWdvcnksZGF0ZSxhdXRob3IsZXh0LHcsaCc7DQoNCgkJLy8gQ29udmVydCB0aGUgY2F0ZWdvcnkgKHBvc3NpYmx5IGEgY29tbWEtc2VwIGxpc3QpIGludG8gYW4gU1FMLXN0eWxlICdpbicgbGlzdC4NCgkJJGZ1bGxDYXRMaXN0ID0gYXJyYXkoKTsNCgkJJG5vdENhdExpc3QgPSBhcnJheSgpOw0KCQkkY2F0VmFycyA9IGFycmF5KCI/YyIsICIhYyIsICI/cyIsICIhcyIsICI/dCIsICIhdCIsICI/aWQiLCAiIWlkIiwgIj9maWVsZCIsICIhZmllbGQiKTsNCgkJJHJldEFycmF5ID0gc21kX2dldEF0dHMoJGNhdGVnb3J5LCAkY2F0VmFycywgJGNhdGxhYmVsKTsNCgkJJGZ1bGxDYXRMaXN0ID0gJHJldEFycmF5WzBdOw0KCQkkbm90Q2F0TGlzdCA9ICRyZXRBcnJheVsxXTsNCg0KCQkvLyBDb252ZXJ0IHRoZSBpbWFnZWlkIChwb3NzaWJseSBhIGNvbW1hLXNlcCBsaXN0KSBpbnRvIGFuIFNRTC1zdHlsZSAnaW4nIGxpc3QuDQoJCSRmdWxsSURMaXN0ID0gYXJyYXkoKTsNCgkJJG5vdElETGlzdCA9IGFycmF5KCk7DQoJCSRpZFZhcnMgPSBhcnJheSgiP2lkIiwgIiFpZCIsICI/ZmllbGQiLCAiIWZpZWxkIik7DQoJCSRyZXRBcnJheSA9IHNtZF9nZXRBdHRzKCRpbWFnZWlkLCAkaWRWYXJzKTsNCgkJJGZ1bGxJRExpc3QgPSAkcmV0QXJyYXlbMF07DQoJCSRub3RJRExpc3QgPSAkcmV0QXJyYXlbMV07DQoNCgkJLy8gTWFrZSB1cCB0aGUgV0hFUkUgc3RhdGVtZW50IGZyb20gdGhlIGNvbWJpbmVkIGxpc3RzLg0KCQkvLyBUaGUgY2F0ZWdvcmllcy9pbWFnZSBJRHMgYXJlIE9SZWQgdG9nZXRoZXIgaW4gYnJhY2tldHMgZmlyc3QNCgkJLy8gYmVmb3JlIHRoZSBuZWdhdGlvbiBvcHRpb25zIGFyZSB0YWNrZWQgb24gYXMgQU5EcyBhZnRlcndhcmRzDQoJCSR3aGVyZU9SID0gYXJyYXkoKTsNCgkJJHdoZXJlQU5EID0gYXJyYXkoKTsNCg0KCQkvLyBTdGFydCB0aGUgV0hFUkUgc3RhdGVtZW50IHdpdGggdGhlIGNvbWJpbmVkIGxpc3Qgb2YgaW1hZ2UgSURzDQoJCWlmIChjb3VudCgkZnVsbElETGlzdCkgPiAwKSB7DQoJCQlmb3IgKCRpZHggPSBjb3VudCgkZnVsbElETGlzdCk7ICRpZHggPj0wOyAkaWR4LS0pIHsNCgkJCQlpZiAoZW1wdHkoJGZ1bGxJRExpc3RbJGlkeF0pKSB7DQoJCQkJCXVuc2V0KCRmdWxsSURMaXN0WyRpZHhdKTsNCgkJCQl9IGVsc2Ugew0KCQkJCQkkZnVsbElETGlzdFskaWR4XSA9ICInIiAuICRmdWxsSURMaXN0WyRpZHhdIC4gIiciOw0KCQkJCX0NCgkJCX0NCgkJCWlmIChjb3VudCgkZnVsbElETGlzdCkgPiAwKSB7DQoJCQkJJHdoZXJlT1JbXSA9ICJpZCBJTiAoIiAuIGltcGxvZGUoIiwiLCAkZnVsbElETGlzdCkuICIpIjsNCgkJCX0NCgkJfQ0KDQoJCS8vIGluY2x1ZGVkIGNhdGVnb3JpZXMgLSBzb21lIG1heSBiZSBzdWJjYXRzDQoJCSR0bXBhID0gYXJyYXkoKTsNCgkJZm9yICgkaWR4ID0gMDsgJGlkeCA8IGNvdW50KCRmdWxsQ2F0TGlzdCk7ICRpZHgrKykgew0KCQkJaWYgKCRzdWJjYXRzKSB7DQoJCQkJJGNhdGVncyA9IHNtZF9nZXRTdWJDYXRzKCRmdWxsQ2F0TGlzdFskaWR4XSwnaW1hZ2UnKTsNCgkJCQlmb3IgKCRqZHggPSAwOyAkamR4IDwgY291bnQoJGNhdGVncyk7ICRqZHgrKykgew0KCQkJCQlpZiAoJGNhdGVnc1skamR4XVsnbmFtZSddICE9ICJyb290Iikgew0KCQkJCQkJJHRtcGFbXSA9ICInIiAuJGNhdGVnc1skamR4XVsnbmFtZSddLiAiJyI7DQoJCQkJCX0NCgkJCQl9DQoJCQl9IGVsc2Ugew0KCQkJCSR0bXBhW10gPSAiJyIgLiRmdWxsQ2F0TGlzdFskaWR4XS4gIiciOw0KCQkJfQ0KCQl9DQoJCWlmIChjb3VudCgkdG1wYSkgPiAwKSB7DQoJCQkkd2hlcmVPUltdID0gImNhdGVnb3J5IElOICgiIC5pbXBsb2RlKCIsIiwgJHRtcGEpLiAiKSI7DQoJCX0NCg0KCQlpZiAoY291bnQoJHdoZXJlT1IpID4gMCkgew0KCQkJJHdoZXJlID0gIigiIC4gaW1wbG9kZSgiIE9SICIsICR3aGVyZU9SKSAuICIpIjsNCgkJfSBlbHNlIHsNCgkJCSR3aGVyZSA9ICIiOw0KCQl9DQoNCgkJLy8gZXhjbHVkZWQgY2F0ZWdvcmllcw0KCQkkdG1wYSA9IGFycmF5KCk7DQoJCWZvciAoJGlkeCA9IDA7ICRpZHggPCBjb3VudCgkbm90Q2F0TGlzdCk7ICRpZHgrKykgew0KCQkJaWYgKCRzdWJjYXRzKSB7DQoJCQkJJGNhdGVncyA9IHNtZF9nZXRTdWJDYXRzKCRub3RDYXRMaXN0WyRpZHhdLCdpbWFnZScpOw0KCQkJCWZvciAoJGpkeCA9IDA7ICRqZHggPCBjb3VudCgkY2F0ZWdzKTsgJGpkeCsrKSB7DQoJCQkJCWlmICgkY2F0ZWdzWyRqZHhdWyduYW1lJ10gIT0gInJvb3QiKSB7DQoJCQkJCQkkdG1wYVtdID0gIiciIC4kY2F0ZWdzWyRqZHhdWyduYW1lJ10uICInIjsNCgkJCQkJfQ0KCQkJCX0NCgkJCX0gZWxzZSB7DQoJCQkJJHRtcGFbXSA9ICInIiAuJG5vdENhdExpc3RbJGlkeF0uICInIjsNCgkJCX0NCgkJfQ0KCQlpZiAoY291bnQoJHRtcGEpID4gMCkgew0KCQkJJHdoZXJlQU5EW10gPSAiY2F0ZWdvcnkgTk9UIElOICgiIC5pbXBsb2RlKCIsIiwgJHRtcGEpLiAiKSI7DQoJCX0NCg0KCQkvLyBBZGQgdG8gdGhlIFdIRVJFIHN0YXRlbWVudCB0aGUgY29tYmluZWQgbGlzdCBvZiBOT1QgaW1hZ2UgSURzDQoJCWlmIChjb3VudCgkbm90SURMaXN0KSA+IDApIHsNCgkJCWZvciAoJGlkeCA9IGNvdW50KCRub3RJRExpc3QpOyAkaWR4ID49MDsgJGlkeC0tKSB7DQoJCQkJaWYgKGVtcHR5KCRub3RJRExpc3RbJGlkeF0pKSB7DQoJCQkJCXVuc2V0KCRub3RJRExpc3RbJGlkeF0pOw0KCQkJCX0gZWxzZSB7DQoJCQkJCSRub3RJRExpc3RbJGlkeF0gPSAiJyIgLiAkbm90SURMaXN0WyRpZHhdIC4gIiciOw0KCQkJCX0NCgkJCX0NCgkJCWlmIChjb3VudCgkbm90SURMaXN0KSA+IDApIHsNCgkJCQkkd2hlcmVBTkRbXSA9ICJpZCBOT1QgSU4gKCIgLiBpbXBsb2RlKCIsIiwgJG5vdElETGlzdCkuICIpIjsNCgkJCX0NCgkJfQ0KDQoJCWlmIChjb3VudCgkd2hlcmVBTkQpID4gMCkgew0KCQkJJHdoZXJlIC49ICgoJHdoZXJlPT0iIikgPyAiIiA6ICIgQU5EICIpIC4gaW1wbG9kZSgiIEFORCAiLCAkd2hlcmVBTkQpOw0KCQl9DQoNCgkJLy8gSWYgdGhlIHJlYXNvbiBub3RoaW5nIHdhcyByZXR1cm5lZCBpcyBiZWNhdXNlIG5vIG9wdGlvbnMgd2VyZSBnaXZlbg0KCQlpZiAoJHdoZXJlID09ICIiICYmICEkY2F0aWRvcHRzKSB7DQoJCQkkd2hlcmUgPSAiMT0xIjsNCgkJfQ0KDQoJCS8vIENvbnZlcnQgdGhlIG9yZGVyYnkgaW50byBhIHZhbGlkIHNvcnRpbmcgaGllcmFyY2h5Lg0KCQkvLyBOb3RlIHRoYXQgcmFuZG9tIGlzIGEgc3BlY2lhbCBjYXNlIGFuZCB0aGUgZm9sbG93aW5nIHJ1bGVzIGFwcGx5Og0KCQkvLyAgMSkgQW55dGhpbmcgYXBwZWFyaW5nIGJlZm9yZSByYW5kb20gaXMgcGFzc2VkIHRvIHRoZSBkYXRhYmFzZSBxdWVyeSBmb3Igb3JkZXJpbmcNCgkJLy8gIDIpIEFzIHNvb24gYXMgcmFuZG9tIGlzIGVuY291bnRlcmVkLCB0aGUgb3JkZXJieSBzdHJpbmcgaXMgaWdub3JlZC4NCgkJLy8gICAgIFRoZSByZXN1bHRzZXQgd2lsbCBiZSBzb3J0ZWQgcmFuZG9tbHkgaW5zdGVhZA0KCQkvLyAgMykgSWYgcmFuZG9tIGFwcGVhcnMgZmlyc3QgaW4gdGhlIGxpc3QsIHRoZSBkYXRhIGlzIHJldHJpZXZlZCByYW5kb21seSB0aGVuIHRoZQ0KCQkvLyAgICAgcmVtYWluaW5nIG9wdGlvbnMgc29ydCB0aGUgcmVzdWx0c2V0DQoJCSR3aGVyZU9CID0gQXJyYXkoKTsNCgkJJHBvc3RPcmRlciA9IGFycmF5KCk7DQoJCSRydWxlID0gInNxbCI7DQoJCSRwb3N0UHJlZml4ID0gIlNPUlRfIjsNCgkJJHJhbmRzb3J0ID0gZmFsc2U7DQoJCSRvYkxpc3QgPSBwcmVnX3NwbGl0KCcvWyxcc10rLycsJG9yZGVyYnksLTEsUFJFR19TUExJVF9OT19FTVBUWSk7DQoJCWZvciAoJGlkeCA9IDA7ICRpZHggPCBjb3VudCgkb2JMaXN0KTsgJGlkeCsrKSB7DQoJCQkkb2JfZGlyID0gZXhwbG9kZSgnOicsJG9iTGlzdFskaWR4XSk7DQoJCQkkZGlyZWN0aW9uID0gJyc7DQoJCQkkY29sUmVmID0gJyc7DQoJCQlpZiAoY291bnQoJG9iX2RpcikgPD0gMSkgew0KCQkJCSRvYl9kaXJbMV0gPSAiYXNjIjsNCgkJCX0NCgkJCWlmICgkcnVsZSA9PSAic3FsIikgew0KCQkJCSRkaXJlY3Rpb24gPSAoJG9iX2RpclsxXSA9PSAiZGVzYyIpID8gJyBkZXNjJyA6ICcgYXNjJzsNCgkJCX0gZWxzZSB7DQoJCQkJJGRpcmVjdGlvbiA9ICgkb2JfZGlyWzFdID09ICJkZXNjIikgPyAkcG9zdFByZWZpeC4nREVTQycgOiAkcG9zdFByZWZpeC4nQVNDJzsNCgkJCX0NCg0KCQkJc3dpdGNoICgkb2JfZGlyWzBdKSB7DQoJCQkJY2FzZSAncmFuZG9tJzoNCgkJCQkJJHJ1bGUgPSAicG9zdCI7DQoJCQkJCWlmICgkaWR4ID09IDApIHsNCgkJCQkJCSR3aGVyZU9CW10gPSAncmFuZCgpJzsNCgkJCQkJfSBlbHNlIHsNCgkJCQkJCSRyYW5kc29ydCA9IHRydWU7DQoJCQkJCX0NCgkJCQkJYnJlYWs7DQoJCQkJY2FzZSAnZml4ZWQnOg0KCQkJCQkvLyAnZml4ZWQnIG9ubHkgd29ya3Mgb24gaW1hZ2UgaWRzDQoJCQkJCWlmICgkaW1hZ2VpZCAhPSAiIikgew0KCQkJCQkJJGZpeGVkT3JkZXIgPSB0cnVlOw0KCQkJCQl9DQoJCQkJCWJyZWFrOw0KCQkJCWRlZmF1bHQ6DQoJCQkJCSRjb2xSZWYgPSBhcnJheV9zZWFyY2goJG9iX2RpclswXSwgJGZpZWxkTWFwKTsNCgkJCQkJYnJlYWs7DQoJCQl9DQoJCQlpZiAoJHJ1bGUgPT0gInNxbCIpIHsNCgkJCQlpZiAoJGNvbFJlZiAhPSAiIikgew0KCQkJCQkkd2hlcmVPQltdID0gJGNvbFJlZi4kZGlyZWN0aW9uOw0KCQkJCX0NCgkJCX0gZWxzZSB7DQoJCQkJaWYgKCEkcmFuZHNvcnQpIHsNCgkJCQkJaWYgKCRjb2xSZWYgIT0gIiIpIHsNCgkJCQkJCSRwb3N0T3JkZXJbXSA9IGFycmF5KCJjb2wiID0+ICRjb2xSZWYsICJzb3J0IiA9PiAkZGlyZWN0aW9uKTsNCgkJCQkJfQ0KCQkJCX0NCgkJCX0NCgkJfQ0KDQoJCWlmIChjb3VudCgkd2hlcmVPQikgPiAwKSB7DQoJCQkkd2hlcmUgLj0gJyBPUkRFUiBCWSAnIC4gaW1wbG9kZSgiLCIsJHdoZXJlT0IpOw0KCQl9DQoNCgkJLy8gSGFuZGxlIHBhZ2luZw0KCQlpZiAoKCRsaW1pdCA+IDApICYmICRzaG93cGFnZWxpbmtzKSB7DQoJCQkkcnMgPSBzYWZlX3Jvd3MoJGZpZWxkcywgJ3R4cF9pbWFnZScsICR3aGVyZSAuJyBMSU1JVCAwLCcuJG1heGxpbWl0KTsNCgkJCSRudW10aHVtID0gY291bnQoJHJzKTsNCgkJCSRudW1QYWdlcyA9ICgkbnVtdGh1bSA+IDApID8gY2VpbCgkbnVtdGh1bS8kbGltaXQpIDogMTsNCgkJCSR0aHVtYnBhZ2UgPSAoIWdwcygkZ2FsbElEKSkgPyAxIDogZ3BzKCRnYWxsSUQpOw0KCQkJJG9mZnNldCA9ICgkdGh1bWJwYWdlIC0gMSkgKiAkbGltaXQ7DQoJCQkkcnMgPSBzYWZlX3Jvd3MoJGZpZWxkcywgJ3R4cF9pbWFnZScsICR3aGVyZSAuJyBMSU1JVCAnLiRvZmZzZXQuJywnLiRsaW1pdCk7DQoJCX0gZWxzZSB7DQoJCQkvLyBObyBwYWdpbmcgcmVxdWlyZWQNCgkJCSRudW1QYWdlcyA9IDE7DQoJCQkkdGh1bWJwYWdlID0gMTsNCgkJCSRycyA9IHNhZmVfcm93cygkZmllbGRzLCAndHhwX2ltYWdlJywgJHdoZXJlIC4nIExJTUlUIDAsJy4gKCgkbGltaXQ9PTApID8gJG1heGxpbWl0IDogJGxpbWl0KSk7DQoJCX0NCg0KCQkvLyBJcyBwb3N0LW9yZGVyaW5nIHJlcXVpcmVkPyBEbyBpdA0KCQlpZiAoJHJhbmRzb3J0KSB7DQoJCQlzaHVmZmxlKCRycyk7DQoJCX0gZWxzZSBpZiAoY291bnQoJHBvc3RPcmRlcikgPiAwKSB7DQoJCQkvLyBUcmFuc2xhdGUgdGhlIHJvd3MgaW50byBjb2x1bW5zIHRoYXQgY2FuIGJlIHNvcnRlZA0KCQkJZm9yZWFjaCgkcnMgYXMgJGtleSA9PiAkcm93KSB7DQoJCQkJJGNvbF9pZFska2V5XSA9ICRyb3dbJ2lkJ107DQoJCQkJJGNvbF9uYW1lWyRrZXldID0gJHJvd1snbmFtZSddOw0KCQkJCSRjb2xfY2FwdGlvblska2V5XSA9ICRyb3dbJ2NhcHRpb24nXTsNCgkJCQkkY29sX2FsdFska2V5XSA9ICRyb3dbJ2FsdCddOw0KCQkJCSRjb2xfY2F0ZWdvcnlbJGtleV0gPSAkcm93WydjYXRlZ29yeSddOw0KCQkJCSRjb2xfZGF0ZVska2V5XSA9ICRyb3dbJ2RhdGUnXTsNCgkJCQkkY29sX2V4dFska2V5XSA9ICRyb3dbJ2V4dCddOw0KCQkJCSRjb2xfYXV0aG9yWyRrZXldID0gJHJvd1snYXV0aG9yJ107DQoJCQkJJGNvbF93WyRrZXldID0gJHJvd1sndyddOw0KCQkJCSRjb2xfaFska2V5XSA9ICRyb3dbJ2gnXTsNCgkJCX0NCgkJCS8vIE1ha2UgdXAgYW4gYXJyYXlfbXVsdGlzb3J0IGFyZyBsaXN0IGFuZCBleGVjdXRlIGl0DQoJCQlmb3IgKCRpZHggPSAwOyAkaWR4IDwgY291bnQoJHBvc3RPcmRlcik7ICRpZHgrKykgew0KCQkJCSRzb3J0YXJnc1tdID0gJyRjb2xfJy4kcG9zdE9yZGVyWyRpZHhdWydjb2wnXTsNCgkJCQkkc29ydGFyZ3NbXSA9ICRwb3N0T3JkZXJbJGlkeF1bJ3NvcnQnXTsNCgkJCX0NCgkJCSRzb3J0aXQgPSAnYXJyYXlfbXVsdGlzb3J0KCcuaW1wbG9kZSgiLCAiLCRzb3J0YXJncykuJywgJHJzKTsnOw0KCQkJZXZhbCgkc29ydGl0KTsNCgkJfQ0KDQoJCS8vIElzIGZpeGVkLW9yZGVyIG91dHB1dCBkZXNpcmVkPyBJZiBzbywgcmUtb3JkZXIgdGhlICRycw0KCQlpZiAoJGZpeGVkT3JkZXIpIHsNCgkJCSRvcmRlcmVkUlMgPSBBcnJheSgpOw0KCQkJJGlnbm9yZUxpc3QgPSBBcnJheSgpOw0KCQkJJHJlbWFpbmluZ1JTID0gQXJyYXkoKTsNCgkJCS8vIFN1Y2sgb3V0IHRoZSBmaXhlZCBpdGVtcyBmaXJzdA0KCQkJZm9yICgkaWR4ID0gMDsgJGlkeCA8IGNvdW50KCRmdWxsSURMaXN0KTsgJGlkeCsrKSB7DQoJCQkJZm9yZWFjaCgkcnMgYXMgJHJvdykgew0KCQkJCQlpZiAoIiciLiRyb3dbJ2lkJ10uIiciID09ICRmdWxsSURMaXN0WyRpZHhdKSB7DQoJCQkJCQkkb3JkZXJlZFJTW10gPSAkcm93Ow0KCQkJCQkJJGlnbm9yZUxpc3RbXSA9ICRyb3dbJ2lkJ107DQoJCQkJCX0NCgkJCQl9DQoJCQl9DQoJCQkvLyBUYWNrIG9uIHRoZSByZW1haW5pbmcgcm93cw0KCQkJZm9yZWFjaCgkcnMgYXMgJHJvdykgew0KCQkJCWlmICghaW5fYXJyYXkoJHJvd1snaWQnXSwgJGlnbm9yZUxpc3QpKSB7DQoJCQkJCSRyZW1haW5pbmdSU1tdID0gJHJvdzsNCgkJCQl9DQoJCQl9DQoJCQkkcnMgPSBhcnJheV9tZXJnZSgkb3JkZXJlZFJTLCAkcmVtYWluaW5nUlMpOw0KCQl9DQoNCgkJLy8gSGFuZGxlIHRodW1ic2l6ZQ0KCQkkdGh1bWJXaWR0aCA9ICR0aHVtYkhlaWdodCA9ICIiOw0KCQkkdGh1bWJXVW5pdHMgPSAkdGh1bWJIVW5pdHMgPSAicHgiOw0KCQlpZiAoJHRodW1ic2l6ZSkgew0KCQkJJHRodW1iU2l6ZXMgPSBzbWRfc3BsaXRSYW5nZSgkdGh1bWJzaXplLCAiLFxzIiwgMCk7DQoJCQlpZiAoY291bnQoJHRodW1iU2l6ZXMpID09IDEpIHsNCgkJCQkkdGh1bWJXaWR0aCA9ICR0aHVtYkhlaWdodCA9IGVyZWdfcmVwbGFjZSgiW14wLTldIiwgIiIsICR0aHVtYlNpemVzWzBdKTsNCgkJCQkkdW5pdHMgPSBlcmVnX3JlcGxhY2UoIlswLTldIiwgIiIsICR0aHVtYlNpemVzWzBdKTsNCgkJCQkkdGh1bWJXVW5pdHMgPSAkdGh1bWJIVW5pdHMgPSAoJHVuaXRzID09ICIiKSA/ICR0aHVtYldVbml0cyA6ICR1bml0czsNCgkJCX0gZWxzZSB7DQoJCQkJJHRodW1iV2lkdGggPSBlcmVnX3JlcGxhY2UoIlteMC05XSIsICIiLCAkdGh1bWJTaXplc1swXSk7DQoJCQkJJHRodW1iSGVpZ2h0ID0gZXJlZ19yZXBsYWNlKCJbXjAtOV0iLCAiIiwgJHRodW1iU2l6ZXNbMV0pOw0KCQkJCSR1bml0cyA9IGVyZWdfcmVwbGFjZSgiWzAtOV0iLCAiIiwgJHRodW1iU2l6ZXNbMF0pOw0KCQkJCSR0aHVtYldVbml0cyA9ICgkdW5pdHMgPT0gIiIgJiYgJHRodW1iV2lkdGggIT0gIiIpID8gJHRodW1iV1VuaXRzIDogJHVuaXRzOw0KCQkJCSR1bml0cyA9IGVyZWdfcmVwbGFjZSgiWzAtOV0iLCAiIiwgJHRodW1iU2l6ZXNbMV0pOw0KCQkJCSR0aHVtYkhVbml0cyA9ICgkdW5pdHMgPT0gIiIgJiYgJHRodW1iSGVpZ2h0ICE9ICIiKSA/ICR0aHVtYkhVbml0cyA6ICR1bml0czsNCgkJCX0NCgkJfQ0KDQoJCS8vIENvbnN0cnVjdCB0aGUgb3V0cHV0DQoJCSRjYXB0aW9uSXRlbXMgPSBzbWRfc3BsaXRSYW5nZSgkaW1hZ2VjYXB0aW9uLCAiXHMiKTsNCgkJJG91dFN0ciA9ICcnOw0KCQlpZigkcnMpIHsNCgkJCWZvcmVhY2goJHJzIGFzICRyb3cpIHsNCgkJCQkkdGhlVGh1bWIgPSBodS4kaW1nX2Rpci4nLycgLiAkcm93WydpZCddIC4gJ3QnIC4gJHJvd1snZXh0J107DQoJCQkJJGZ1bGwgPSBodS4kaW1nX2Rpci4nLycgLiAkcm93WydpZCddIC4gKCgkdGh1bWIpID8gInQiIDogIiIpIC4kcm93WydleHQnXTsNCgkJCQlpZiAoJGdyb3VwbmFtZSA9PT0gIj9jIikgew0KCQkJCQkkZ3JwID0gJHJvd1snY2F0ZWdvcnknXTsNCgkJCQl9IGVsc2UgaWYgKCRncm91cG5hbWUgPT09ICI/aWQiKSB7DQoJCQkJCSRncnAgPSAkcm93WydpZCddOw0KCQkJCX0gZWxzZSBpZiAoJGdyb3VwbmFtZSA9PT0gIj9hdXRob3IiKSB7DQoJCQkJCSRncnAgPSAkcm93WydhdXRob3InXTsNCgkJCQl9IGVsc2UgaWYgKCRncm91cG5hbWUgPT09ICI/ZGF0ZSIpIHsNCgkJCQkJJGdycCA9ICRyb3dbJ2RhdGUnXTsNCgkJCQl9IGVsc2UgaWYgKCRncm91cG5hbWUgPT09ICI/YWx0Iikgew0KCQkJCQkkZ3JwID0gJHJvd1snYWx0J107DQoJCQkJfSBlbHNlIGlmICgkZ3JvdXBuYW1lID09PSAiP2NhcHRpb24iKSB7DQoJCQkJCSRncnAgPSAkcm93WydjYXB0aW9uJ107DQoJCQkJfSBlbHNlIGlmICgkZ3JvdXBuYW1lID09PSAiP2V4dCIpIHsNCgkJCQkJJGdycCA9ICRyb3dbJ2V4dCddOw0KCQkJCX0gZWxzZSBpZiAoJGdyb3VwbmFtZSA9PT0gIj9uYW1lIikgew0KCQkJCQkkZ3JwID0gJHJvd1snbmFtZSddOw0KCQkJCX0gZWxzZSBpZiAoJGdyb3VwbmFtZSA9PT0gIj93aWR0aCIpIHsNCgkJCQkJJGdycCA9ICRyb3dbJ3cnXTsNCgkJCQl9IGVsc2UgaWYgKCRncm91cG5hbWUgPT09ICI/aGVpZ2h0Iikgew0KCQkJCQkkZ3JwID0gJHJvd1snaCddOw0KCQkJCX0gZWxzZSBpZiAoc3Vic3RyKCRncm91cG5hbWUsMCwxKSA9PT0gIj8iKSB7DQoJCQkJCS8vIFNwbGl0IG9mZiB0aGUgZmllbGQgbmFtZSBmcm9tIHRoZSBxdWVzdGlvbiBtYXJrDQoJCQkJCSRmaWVsZG5hbWUgPSBzdWJzdHIoJGdyb3VwbmFtZSwxKTsNCgkJCQkJaWYgKGlzc2V0KCR0aGlzYXJ0aWNsZVskZmllbGRuYW1lXSkpIHsNCgkJCQkJCSRncnAgPSAkdGhpc2FydGljbGVbJGZpZWxkbmFtZV07DQoJCQkJCX0gZWxzZSB7DQoJCQkJCQkkZ3JwID0gJyc7DQoJCQkJCX0NCgkJCQl9IGVsc2Ugew0KCQkJCQkkZ3JwID0gJGdyb3VwbmFtZTsNCgkJCQl9DQoNCgkJCQkvLyBIYW5kbGUgaW1hZ2VjYXB0aW9uDQoJCQkJJGNhcHRpb25BcnJheSA9IGFycmF5KCk7DQoJCQkJZm9yZWFjaCAoJGNhcHRpb25JdGVtcyBhcyAkaXRlbSkgew0KCQkJCQlpZiAoc3Vic3RyKCRpdGVtLDAsMSkgPT09ICI/Iikgew0KCQkJCQkJJGZpZWxkbmFtZSA9IHN1YnN0cigkaXRlbSwxKTsNCgkJCQkJCSRrZXkgPSBhcnJheV9zZWFyY2goJGZpZWxkbmFtZSwgJGZpZWxkTWFwKTsNCgkJCQkJCWlmICgka2V5KSB7DQoJCQkJCQkJJGNhcHRpb25BcnJheVtdID0gJHJvd1ska2V5XTsNCgkJCQkJCX0gZWxzZSB7DQoJCQkJCQkJJGNhcHRpb25BcnJheVtdID0gJGZpZWxkbmFtZTsNCgkJCQkJCX0NCgkJCQkJfSBlbHNlIHsNCgkJCQkJCSRjYXB0aW9uQXJyYXlbXSA9ICRpdGVtOw0KCQkJCQl9DQoJCQkJfQ0KDQoJCQkJLy8gR2VuZXJhdGUgdGhlIGNhcHRpb24vYWx0IGlmIHJlcXVpcmVkDQoJCQkJJGNhcFN0ciA9ICgkc2hvd2FsdCAmJiAkcm93WydhbHQnXSkgPyAnPHNwYW4nIC4gKCgkYWx0Y2xhc3MgIT0gIiIpID8gJyBjbGFzcz0iJyAuJGFsdGNsYXNzLiAnIicgOiAnJykgLiAnPicgLiRyb3dbJ2FsdCddLiAnPC9zcGFuPicgOiAnJzsNCgkJCQkkY2FwU3RyIC49ICgkc2hvd2NhcHRpb24gJiYgJHJvd1snY2FwdGlvbiddKSA/ICc8c3BhbicgLiAoKCRjYXB0aW9uY2xhc3MgIT0gIiIpID8gJyBjbGFzcz0iJyAuJGNhcHRpb25jbGFzcy4gJyInIDogJycpIC4gJz4nIC4kcm93WydjYXB0aW9uJ10uICc8L3NwYW4+JyA6ICcnOw0KDQoJCQkJLy8gQ29uc3RydWN0IHRoZSBsaW5rIGFuZCBwdXQgY2FwdGlvbi9hbHQgaW4gdGhlIGFwcHJvcHJpYXRlIHBvc2l0aW9uDQoJCQkJJG91dFN0ciAuPSAoJHdyYXB0YWcgIT0gIiIpID8gJzwnIC4kd3JhcHRhZy4gKCgkY2VsbGNsYXNzICE9ICIiKSA/ICcgY2xhc3M9IicgLiRjZWxsY2xhc3MuICciJyA6ICcnKSAuICc+JyA6ICcnOw0KCQkJCSRvdXRTdHIgLj0gKCR0ZXh0cG9zID09ICJhYm92ZSIpID8gJGNhcFN0ciA6ICcnOw0KCQkJCSRvdXRTdHIgLj0gJzxhIGhyZWY9IicuJGZ1bGwuJyIgcmVsPSJsaWdodGJveC0nIC4kZ3JwLiAnIiB0aXRsZT0iJyAuaW1wbG9kZSgiICIsICRjYXB0aW9uQXJyYXkpLiAnIj4nIC4oKCR0ZXh0cG9zID09ICJiZWZvcmUiKSA/ICRjYXBTdHIgOiAnJykuICc8aW1nIHNyYz0iJyAuJHRoZVRodW1iLiAnIiBhbHQ9IicgLiRyb3dbJ2FsdCddLiAnIicgLiAoKCRpbWdjbGFzcyAhPSAiIikgPyAnIGNsYXNzPSInIC4kaW1nY2xhc3MuICciJyA6ICcnKSAuICgoJHRodW1iV2lkdGgpID8gJyB3aWR0aD0iJyAuICR0aHVtYldpZHRoLiR0aHVtYldVbml0cy4gJyInIDogJycpIC4gKCgkdGh1bWJIZWlnaHQpID8gJyBoZWlnaHQ9IicgLiAkdGh1bWJIZWlnaHQuJHRodW1iSFVuaXRzLiAnIicgOiAnJykgLiAnIC8+JyAuKCgkdGV4dHBvcyA9PSAiYWZ0ZXIiKSA/ICRjYXBTdHIgOiAnJykuICc8L2E+Jy5uOw0KCQkJCSRvdXRTdHIgLj0gKCR0ZXh0cG9zID09ICJiZWxvdyIpID8gJGNhcFN0ciA6ICcnOw0KCQkJCSRvdXRTdHIgLj0gKCR3cmFwdGFnICE9ICIiKSA/ICc8LycgLiR3cmFwdGFnLiAnPicgOiAnJzsNCgkJCQkkb3V0U3RyIC49IG47DQoJCQl9DQoNCgkJCS8vIEFkZCB0aGUgcGFnaW5nIGZlYXR1cmVzIGlmIHJlcXVpcmVkDQoJCQlpZiAoKCRsaW1pdCA+IDApICYmICRzaG93cGFnZWxpbmtzKSB7DQoJCQkJJG5leHQgPSAoJG51bVBhZ2VzID4gMSAmJiAkdGh1bWJwYWdlICE9ICRudW1QYWdlcyk7DQoJCQkJJHByZXYgPSAoJG51bVBhZ2VzID4gMSAmJiAkdGh1bWJwYWdlID4gMSk7DQoNCgkJCQkvLyBSZXBsYWNlIGFueSBwYWdpbmcgaW5mbyBpbiB0aGUgcXVlcnkgc3RyaW5nDQoJCQkJJHByZXZQYWdlID0gc21kX2FkZFFTVmFyKCRwcmV0ZXh0WydyZXF1ZXN0X3VyaSddLCAkZ2FsbElELCAkdGh1bWJwYWdlLTEpOw0KCQkJCSRuZXh0UGFnZSA9IHNtZF9hZGRRU1ZhcigkcHJldGV4dFsncmVxdWVzdF91cmknXSwgJGdhbGxJRCwgJHRodW1icGFnZSsxKTsNCg0KCQkJCSRvdXRTdHIgLj0gKCR3cmFwdGFnICE9ICIiKSA/ICc8JyAuJHdyYXB0YWcuICgoJG5hdmNsYXNzICE9ICIiKSA/ICcgY2xhc3M9IicgLiRuYXZjbGFzcy4gJyInIDogJycpIC4gJz4nIDogJyc7DQoJCQkJJG91dFN0ciAuPSAoJHByZXYpID8gJzxhJyAuICgoJHByZXZjbGFzcyAhPSAiIikgPyAnIGNsYXNzPSInIC4kcHJldmNsYXNzLiAnIicgOiAnJykgLiAnIGhyZWY9IicgLiRwcmV2UGFnZS4gJyI+JyAuJHByZXZsYWJlbC4gJzwvYT4nLm4gOiAnJzsNCgkJCQkkb3V0U3RyIC49ICgkbmV4dCkgPyAnPGEnIC4gKCgkbmV4dGNsYXNzICE9ICIiKSA/ICcgY2xhc3M9IicgLiRuZXh0Y2xhc3MuICciJyA6ICcnKSAuICcgaHJlZj0iJyAuJG5leHRQYWdlLiAnIj4nIC4kbmV4dGxhYmVsLiAnPC9hPicubiA6ICcnOw0KCQkJCSRvdXRTdHIgLj0gKCR3cmFwdGFnICE9ICIiKSA/ICc8LycgLiR3cmFwdGFnLiAnPicgOiAnJzsNCgkJCQkkb3V0U3RyIC49IG47DQoJCQl9DQoJCX0NCgl9DQoNCglyZXR1cm4gJG91dFN0cjsNCn0NCg0KLy8gQ2FsbGJhY2sgZm9yIE1MUCBzdHJpbmcgcmVwbGFjZW1lbnQNCmZ1bmN0aW9uIHNtZF9zYm94X2VudW1fc3RyKCRldmVudCwgJHN0ZXA9JycsICRwcmU9MCkgew0KCWdsb2JhbCAkc21kX3Nib3hfc3RyLCAkc21kTUxQOw0KCSRyID0gYXJyYXkJKA0KCQkJJ293bmVyJyA9PiAnc21kX3NsaW1ib3gnLA0KCQkJJ3ByZWZpeCcgPT4gJHNtZE1MUFsnc21kX3NsaW1ib3gnXSwNCgkJCSdsYW5nJyA9PiAnZW4tZ2InLCAvLyBEZWZhdWx0IGxhbmd1YWdlDQoJCQknZXZlbnQnID0+ICdwdWJsaWMnLCAvLyBwdWJsaWMvYWRtaW4vY29tbW9uID0gd2hpY2ggaW50ZXJmYWNlIHRoZSBzdHJpbmdzIHdpbGwgYmUgbG9hZGVkIGludG8NCgkJCSdzdHJpbmdzJyA9PiAkc21kX3Nib3hfc3RyLA0KCQkpOw0KCXJldHVybiAkcjsNCn0iO3M6NDoidHlwZSI7czoxOiIwIjtzOjM6Im1kNSI7czozMjoiODY0NzEwODdjOTc1ZTI0MDU2YTBjODY0NDNmNDEwNmIiO30=