# +--------------------------------------------------------------+ # | | # | bas_lightbox v0.5 | # | Lightbox is a simple, unobtrusive javascript script | # | used to to overlay images on the current page. | # | | # | by Bastian Sackermann | # | http://samisdat.org | # | | # +--------------------------------------------------------------+ # +--------------------------------------------------------------+ # | | # | This is a plugin for Textpattern - http://textpattern.com/ | # | To install: textpattern > admin > plugins | # | Paste this page's content into the 'Install plugin' box. | # | Activate the plugin and run the advanced install | # | which is located at the extensions tab | # | | # +--------------------------------------------------------------+ YTo5OntzOjQ6Im5hbWUiO3M6MTI6ImJhc19saWdodGJveCI7czo2OiJhdXRob3IiO3M6MTg6IkJhc3RpYW4gU2Fja2VybWFubiI7czoxMDoiYXV0aG9yX3VyaSI7czoyMDoiaHR0cDovL3NhbWlzZGF0Lm9yZy8iO3M6NzoidmVyc2lvbiI7czozOiIwLjUiO3M6MTE6ImRlc2NyaXB0aW9uIjtzOjI3MzoiVGhpcyBwbHVnaW4gYnJpbmdzIHRoZSA8YSBocmVmPSJodHRwOi8vd3d3Lmh1ZGRsZXRvZ2V0aGVyLmNvbS9wcm9qZWN0cy9saWdodGJveDIvIj5MaWdodGJveCBKUyB2Mi4wPC9hPiBieSA8YSBocmVmPSJodHRwOi8vd3d3Lmh1ZGRsZXRvZ2V0aGVyLmNvbS8iPkxva2VzaCBEaGFrYXIiPC9hPiB0byB0ZXh0cGF0dGVybi4gTGlnaHRib3ggSlMgaXMgYSBzaW1wbGUsIHVub2J0cnVzaXZlIHNjcmlwdCB1c2VkIHRvIHRvIG92ZXJsYXkgaW1hZ2VzIG9uIHRoZSBjdXJyZW50IHBhZ2UuIjtzOjQ6ImhlbHAiO3M6NDc1MDoiPGgxPjxzdHJvbmc+YmFzIExpZ2h0Ym94PC9zdHJvbmc+PC9oMT4NCjxwPmJ5IDxhIGhyZWY9Imh0dHA6Ly9zYW1pc2RhdC5vcmciPkJhc3RpYW4gU2Fja2VybWFubjwvYT48L3A+DQoJCQkJCQkNCjxwPlRoaXMgUGx1Z2luIGFkZHMgPGEgdGl0bGU9IiBbTGluayBvcGVucyBpbiBuZXcgd2luZG93XSIgdGFyZ2V0PSJfYmxhbmsiIGhyZWY9Imh0dHA6Ly93d3cuaHVkZGxldG9nZXRoZXIuY29tL3Byb2plY3RzL2xpZ2h0Ym94Mi8iPkxpZ2h0Ym94IEpTIDIuMDwvYT4gIGJ5IDxhIHRpdGxlPSIgW0xpbmsgb3BlbnMgaW4gbmV3IHdpbmRvd10iIHRhcmdldD0iX2JsYW5rIiBocmVmPSJodHRwOi8vd3d3Lmh1ZGRsZXRvZ2V0aGVyLmNvbS8iPkxva2VzaCBEaGFrYXI8L2E+IHRvIFRleHRwYXR0ZXJuLjwvcD4NCjxwPkxpZ2h0Ym94IGlzIGEgc2ltcGxlLCB1bm9idHJ1c2l2ZSBzY3JpcHQgdXNlZCB0byBvdmVybGF5IGltYWdlcyBvbiB0aGUgY3VycmVudCBwYWdlLjwvcD4NCjxwPldoaWxlIGl0IGlzIHZlcnkgZWFzeSB0byBjcmVhdGUgVGh1bWJuYWlscyB3aXRoIFRleHRwYXR0ZXJuLCBpdHMgZWFzeSB0byBjcmVhdGUgYW5kIG1hbmFnZSBpbWFnZSBnYWxsZXJ5IHdpdGggPHN0cm9uZz5iYXNfbGlnaHRib3g8L3N0cm9uZz4uIDwvcD4NCjxwPkxpZ2h0Ym94IHdvcmtzIHdpdGggPGEgdGl0bGU9IltMaW5rIG9wZW5zIGluIG5ldyB3aW5kb3ddIiB0YXJnZXQ9Il9ibGFuayIgaHJlZj0iaHR0cDovL3Byb3RvdHlwZS5jb25pby5uZXQvIj5Qcm90b3R5cGU8L2E+IGJ5IDxhIHRpdGxlPSJbTGluayBvcGVucyBpbiBuZXcgd2luZG93XSIgdGFyZ2V0PSJfYmxhbmsiIGhyZWY9Imh0dHA6Ly9jb25pby5uZXQvIj5TYW0gU3RlcGhlbnNvbjwvYT4gYW5kIDxhIHRpdGxlPSJbTGluayBvcGVucyBpbiBuZXcgd2luZG93XSIgdGFyZ2V0PSJfYmxhbmsiIGhyZWY9Imh0dHA6Ly9zY3JpcHQuYWN1bG8udXMvIj5zY3JpcHQuYWN1bG8udXM8L2E+IGJ5IDxhIHRpdGxlPSJbTGluayBvcGVucyBpbiBuZXcgd2luZG93XSIgdGFyZ2V0PSJfYmxhbmsiIGhyZWY9Imh0dHA6Ly9taXIuYWN1bG8udXMvIj5UaG9tYXMgRnVjaHM8L2E+LjwvcD4NCjxwPlRvIHNhdmUgYSBsaXR0bGUgc3BhY2UsIGkgdXNlIGNvbXByZXNzZWQgdmVyc2lvbiBvZiBwcm90b3R5cGUgYnkgPGEgdGl0bGU9IltMaW5rIG9wZW5zIGluIG5ldyB3aW5kb3ddIiB0YXJnZXQ9Il9ibGFuayIgaHJlZj0iaHR0cDovL2dyb3Vwcy5nb29nbGUuY29tL2dyb3VwL3Byb3RvdHlwZS1jb3JlL2Jyb3dzZV90aHJlYWQvdGhyZWFkL2VmMDVlZGU4MTk3MjdkNTIiPkpvaG4tRGF2aWQgRGFsdG9uPC9hPjwvcD4NCg0KPGgyPlBsdWdpbiBIZWxwPC9oMj4NCjxwPklmIHlvdSBkb24ndCBmaW5kIGFsbCBpbmZvcm1hdGlvbnMgaW4gdGhpcyBoZWxwLCBoYXZlIGEgbG9vayBhdCB0aGUgPGEgaHJlZj0naHR0cDovL3NhbWlzZGF0Lm9yZy9lbi9iYXNfbGlnaHRib3gnIHRpdGxlPSJbTGluayBvcGVucyBpbiBuZXcgd2luZG93XSIgdGFyZ2V0PSJfYmxhbmsiPmRldGFpbGVkIHBsdWdpbiBkZXNjcmlwdGlvbjwvYT48L3A+DQoNCg0KPGgyPkluc3RhbGxhdGlvbjwvaDI+DQoNCjxwPkJlZm9yZSB5b3UgY2FuIHVzZSB0aGlzIHBsdWdpbiwgeW91IGhhdmUgdG8gcnVuIHRoZSBhZHZhbmNlZCBpbnN0YWxsIGF0IGV4dGVuc2lvbiAtJmd0OyBiYXMgTGlnaHRib3guPGJyPg0KVGhlIHNjcmlwdCBpbXBvcnRzIGFsbCBmaWxlcyBhbmQgaW1hZ2VzIHlvdSBuZWVkIGZvciBsaWdodGJveGluZyBmcm9tIHNhbWlzZGF0Lm9yZy48L3A+DQoNCjxwPllvdSBjYW4gc2tpcCB0aGUgYXV0b21hdGljIGltcG9ydCBhbmQgZG93bmxvYWQgdGhlIGZpbGVzIGFzIDxhIGhyZWY9Imh0dHA6Ly9zYW1pc2RhdC5vcmcvcHVibGljLWZpbGVzL2xpZ2h0Ym94MDUvYmFzX2xpZ2h0Ym94LnppcCI+YmFzX2xpZ2h0Ym94LnppcDwvYT4gYW5kIHVwbG9hZCB0aGUgbWFudWFsLjxicj4NCg0KVXNlIHRoZSB0eHAgaW1hZ2UtbWFuYWdtZW50IGZvciBpbWFnZXMgYW5kIGZpbGUtbWFuYWdtZW50IGZvciBmaWxlcy4gRG9uYHQgcmVuYW1lIHRoZSBmaWxlcy48L3A+DQoNCjxwPklmIHlvdSB3YW50IHRvIHVzZSBhIGN1c3RvbS1maWVsZCB0byByZWZlciB0aGUgaW1hZ2UgY2F0ZWdvcnksIGp1c3QgcmVuYW1lIGFuIGN1c3RvbS1maWVsZCB0byBMaWdodGJveC48YnI+DQpZb3UgY2FuIHJlbmFtZSBjdXN0b20tZmllbGQgYXQgYWRtaW4gLSZndDsgYWR2YW5jZWQgcHJlZmVyZW5jZXM8L3A+DQoNCjxoMj5QbHVnaW4gQXR0cmlidXRlczwvaDI+DQoNCjx0YWJsZSBjbGFzcz0icGx1Z2luLXRhZyIgaWQ9InRhZy1iYXNfbGlnaHRib3giPjxjb2xncm91cD48Y29sIHdpZHRoPSIyMCUiPjxjb2wgd2lkdGg9IjIwJSI+PGNvbCB3aWR0aD0iMjAlIj48Y29sIHdpZHRoPSI0MCUiPjwvY29sZ3JvdXA+PGNhcHRpb24+Jmx0O3R4cDpiYXNfbGlnaHRib3ggLyZndDs8L2NhcHRpb24+PHRoZWFkPjx0cj48dGg+QXR0cmlidXRlPC90aD48dGg+VmFsdWU8L3RoPjx0aD5EZWZhdWx0PC90aD48dGg+RGVzY3JpcHRpb248L3RoPjwvdHI+PC90aGVhZD48dGJvZHk+DQo8dHIgc3R5bGU9J2JhY2tncm91bmQ6I0VFRUVFRTsnPjx0ZD5pbWc8L3RkPjx0ZD5JbWFnZSBJRDwvdGQ+PHRkPm5vbmU8L3RkPjx0ZD5PbmUgb3IgbW9yZSBUWFAgaW1hZ2UgSUQ/cy48YnI+Q29tbWEgc2VwZXJhdGVkPC90ZD48L3RyPg0KPHRyPjx0ZD5jYXQ8L3RkPjx0ZD5JbWFnZSBDYXRlZ29yeTwvdGQ+PHRkPm5vbmU8L3RkPjx0ZD5BZGQgVFhQIGltYWdlIGNhdGVnb3JpZS4gQ2FuIGJlIHVzZWQgPGVtPmluc3RlZDwvZW0+IG9mIDxzdHJvbmc+aW1nPC9zdHJvbmc+PC90ZD48L3RyPiAgDQo8dHIgc3R5bGU9J2JhY2tncm91bmQ6I0VFRUVFRTsnPjx0ZD5jYXB0aW9uPC90ZD48dGQ+W25hbWV8YWx0fGNhcHRpb25dPC90ZD48dGQ+Y2FwdGlvbjwvdGQ+PHRkPkNob29zZSBiZXR3ZWVuIG5hbWUsIGFsdCBvciBjYXB0aW9uIHRvIGRlZmluZSB3aGF0IHRleHQgd2lsbCBtZSBkaXNwbGF5ZWQuPC90ZD48L3RyPiANCjx0cj48dGQ+bGFiZWw8L3RkPjx0ZD5TdHJpbmc8L3RkPjx0ZD5iYXMgTGlnaHRib3g8L3RkPjx0ZD5UaGlzIHN0cmluZyB3aWxsIGJlIHByZXBlbmRlZCB0byB0aGUgb3V0cHV0PC90ZD48L3RyPiANCjx0ciBzdHlsZT0nYmFja2dyb3VuZDojRUVFRUVFOyc+PHRkPmxhYmVsdGFnPC90ZD48dGQ+PGEgdGl0bGU9IiBbTGluayBvcGVucyBpbiBuZXcgd2luZG93XSIgdGFyZ2V0PSJfYmxhbmsiIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2ludHJvL3NnbWx0dXQuaHRtbCNoLTMuMi4xIiBjbGFzcz0iZXgiPihYKUhUTUwgdGFnPC9hPjwvdGQ+PHRkPmgyPC90ZD48dGQ+dGFnIHRvIHdyYXAgbGFiZWw8L3RkPjwvdHI+IA0KPHRyPjx0ZD53cmFwdGFnPC90ZD48dGQ+PGEgdGl0bGU9IiBbTGluayBvcGVucyBpbiBuZXcgd2luZG93XSIgdGFyZ2V0PSJfYmxhbmsiIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2ludHJvL3NnbWx0dXQuaHRtbCNoLTMuMi4xIiBjbGFzcz0iZXgiPihYKUhUTUwgdGFnPC9hPjwvdGQ+PHRkPnVsPC90ZD48dGQ+SFRNTCB0YWcgc3Vycm91bmRpbmcgYWxsIGltYWdlczwvdGQ+PC90cj4gDQo8dHIgc3R5bGU9J2JhY2tncm91bmQ6I0VFRUVFRTsnPjx0ZD53cmFwY2xhc3M8L3RkPjx0ZD48YSB0aXRsZT0iIFtMaW5rIG9wZW5zIGluIG5ldyB3aW5kb3ddIiB0YXJnZXQ9Il9ibGFuayIgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvc3RydWN0L2dsb2JhbC5odG1sI2FkZWYtY2xhc3MiIGNsYXNzPSJleCI+KFgpSFRNTCBjbGFzczwvYT4gPC90ZD48dGQ+dWw8L3RkPjx0ZD5DbGFzcyBhcHBsaWVkIHRvIHdyYXB0YWc8L3RkPjwvdHI+IA0KPHRyPjx0ZD5icmVhazwvdGQ+PHRkPjxhIHRpdGxlPSIgW0xpbmsgb3BlbnMgaW4gbmV3IHdpbmRvd10iIHRhcmdldD0iX2JsYW5rIiBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9pbnRyby9zZ21sdHV0Lmh0bWwjaC0zLjIuMSIgY2xhc3M9ImV4Ij4oWClIVE1MIHRhZzwvYT48L3RkPjx0ZD5saTwvdGQ+PHRkPlRhZyBvciBzdHJpbmcgdXNlZCB0byBzZXBhcmF0ZSBldmVyeSBpbWFnZTwvdGQ+PC90cj4gDQo8dHIgc3R5bGU9J2JhY2tncm91bmQ6I0VFRUVFRTsnPjx0ZD5icmVha2NsYXNzPC90ZD48dGQ+PGEgdGl0bGU9IiBbTGluayBvcGVucyBpbiBuZXcgd2luZG93XSIgdGFyZ2V0PSJfYmxhbmsiIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L3N0cnVjdC9nbG9iYWwuaHRtbCNhZGVmLWNsYXNzIiBjbGFzcz0iZXgiPihYKUhUTUwgY2xhc3M8L2E+IDwvdGQ+PHRkPm5vbmU8L3RkPjx0ZD5DbGFzcyBhcHBsaWVkIHRvIGJyZWFrPC90ZD48L3RyPiANCjx0cj48dGQ+dXNlX2NhdDwvdGQ+PHRkPmJvb2xlYW4gPC90ZD48dGQ+ZmFsc2U8L3RkPjx0ZD5TZXQgdG8gdHJ1ZSwgaWYgdXNpbmcgPGNvZGU+Jmx0O2Jhc19saWdodGJveC8mZ3Q7PC9jb2RlPiBvdXRzaWRlIG9mIGFydGljbGVzIG9yIGFydGljbGUgZm9ybXMuIDwvdGQ+PC90cj4gDQo8dHIgc3R5bGU9J2JhY2tncm91bmQ6I0VFRUVFRTsnPjx0ZD51c2Vfc2VjdGlvbjwvdGQ+PHRkPmJvb2xhbjwvdGQ+PHRkPmZhbHNlPC90ZD48dGQ+U2V0IHRvIHRydWUsIGlmIHVzaW5nIDxjb2RlPiZsdDtiYXNfbGlnaHRib3gvJmd0OzwvY29kZT4gb3V0c2lkZSBvZiBhcnRpY2xlcyBvciBhcnRpY2xlIGZvcm1zLiA8L3RkPjwvdHI+IA0KPC90Ym9keT48L3RhYmxlPiI7czo0OiJjb2RlIjtzOjM1NjIwOiIvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoJZnVuY3Rpb24gYmFzX2xpZ2h0Ym94KCRhdHRzLCAkdGhpbmcpDQoJew0KCQlnbG9iYWwgJHByZWZzLCRwcmV0ZXh0LCR0aGlzYXJ0aWNsZSwkaW1nX2RpcjsNCg0KDQoJCQ0KCQlleHRyYWN0KGxBdHRzKGFycmF5KA0KCQkJJ2ltZycgICA9PiAnJywNCgkJCSdjYXQnID0+ICcnLA0KDQoJCQknbGFiZWwnICAgPT4gKGVtcHR5KCRwcmVmc1snYmFzX2xpZ2h0Ym94X2xhYmVsJ10pKT8nJzokcHJlZnNbJ2Jhc19saWdodGJveF9sYWJlbCddLA0KCQkJJ2xhYmVsdGFnJyA9PiAoZW1wdHkoJHByZWZzWydiYXNfbGlnaHRib3hfbGFiZWx0YWcnXSkpPycnOiRwcmVmc1snYmFzX2xpZ2h0Ym94X2xhYmVsdGFnJ10sDQoJCQknd3JhcHRhZycgPT4gKGVtcHR5KCRwcmVmc1snYmFzX2xpZ2h0Ym94X3dyYXB0YWcnXSkpPycnOiRwcmVmc1snYmFzX2xpZ2h0Ym94X3dyYXB0YWcnXSwNCgkJCSd3cmFwY2xhc3MnICAgID0+IChlbXB0eSgkcHJlZnNbJ2Jhc19saWdodGJveF93cmFwY2xhc3MnXSkpPycnOiRwcmVmc1snYmFzX2xpZ2h0Ym94X3dyYXBjbGFzcyddLA0KCQkJJ2JyZWFrJyAgID0+IChlbXB0eSgkcHJlZnNbJ2Jhc19saWdodGJveF9icmVhayddKSk/Jyc6JHByZWZzWydiYXNfbGlnaHRib3hfYnJlYWsnXSwNCgkJCSdicmVha2NsYXNzJyAgID0+IChlbXB0eSgkcHJlZnNbJ2Jhc19saWdodGJveF9icmVha2NsYXNzJ10pKT8nJzokcHJlZnNbJ2Jhc19saWdodGJveF9icmVha2NsYXNzJ10sDQoNCgkJCSd1c2Vfc2VjdGlvbicgPT4gKGVtcHR5KCRwcmVmc1snYmFzX2xpZ2h0Ym94X3VzZV9zZWN0aW9uJ10pKT8nZmFsc2UnOiRwcmVmc1snYmFzX2xpZ2h0Ym94X3VzZV9zZWN0aW9uJ10sDQoJCQkndXNlX2NhdCcgPT4gKGVtcHR5KCRwcmVmc1snYmFzX2xpZ2h0Ym94X3VzZV9jYXQnXSkpPydmYWxzZSc6JHByZWZzWydiYXNfbGlnaHRib3hfdXNlX2NhdCddLA0KDQoJCQknY2FwdGlvbicgPT4gKGVtcHR5KCRwcmVmc1snYmFzX2xpZ2h0Ym94X2NhcHRpb24nXSkpPydhbHQnOiRwcmVmc1snYmFzX2xpZ2h0Ym94X2NhcHRpb24nXSwNCg0KCQkpLCRhdHRzKSk7DQoNCgkJaWYoZW1wdHkoJHByZWZzWyJiYXNfbGlnaHRib3hfaW5zdGFsbCJdKSl7DQoJCQl0cmlnZ2VyX2Vycm9yKCdZb3UgZGlkIG5vdCBydW4gdGhlIGFkdmFuY2VkIGluc3RhbGwhIFBsZWFzZSBoYXZlIGEgbG9vayBpbnRvIHBsdWdpbiBoZWxwLicpOw0KCQkJcmV0dXJuICcnOw0KCQl9DQoJCQ0KCQlpZihlbXB0eSgkcHJlZnNbJ2Jhc19saWdodGJveF9oZWFkJ10pKXsNCgkJCXRyaWdnZXJfZXJyb3IoJ0FkZCA8c3Ryb25nPiZsdDt0eHA6YmFzX2xpZ2h0Ym94X2hlYWQvJmd0Ozwvc3Ryb25nPiB0byB5b3VyIHBhZ2VcJ3MgaGVhZCEgUGxlYXNlIGhhdmUgYSBsb29rIGludG8gcGx1Z2luIGhlbHAuJyk7DQoJCQlyZXR1cm4gJyc7DQoNCgkJfQ0KCQkvLyBXaGlsZSBpbiA0LjAuNSBjdXN0b21fZmllbGRzIGFyZSBzdHJ0b2xvd2VyKCkgDQoJCSRjdXN0b21fZmllbGQgPSAoJHByZWZzWyd2ZXJzaW9uJ10gPj0gJzQuMC41Jyk/J2xpZ2h0Ym94JzonTGlnaHRib3gnOwkJDQoJCQkNCgkJLy9HZXQgaW1hZ2VzDQoJCS8vY2hlY2tpbmcgYXJ0aWNsZSBpbWFnZXMNCgkJaWYoIWVtcHR5KCR0aGlzYXJ0aWNsZVsnYXJ0aWNsZV9pbWFnZSddKSkNCgkJCSRxdWVyeSA9IHNwbGl0KCcsJywkdGhpc2FydGljbGVbJ2FydGljbGVfaW1hZ2UnXSk7DQoNCgkJLy9jaGVja2luZyBjdXN0b20gZmllbGQgIkxpZ2h0Ym94Ig0KCQlpZighZW1wdHkoJHRoaXNhcnRpY2xlWyRjdXN0b21fZmllbGRdKSl7DQoJCQkkdGhpc2FydGljbGVbJGN1c3RvbV9maWVsZF0gPSAoJHRoaXNhcnRpY2xlWyRjdXN0b21fZmllbGRdID09ICdyb290Jyk/Jyc6JHRoaXNhcnRpY2xlWyRjdXN0b21fZmllbGRdOw0KCQkJJHF1ZXJ5ID0gJyBjYXRlZ29yeSA9ICInLiR0aGlzYXJ0aWNsZVskY3VzdG9tX2ZpZWxkXS4nICInOw0KCQl9DQoNCgkJLy9jaGVja2luZyBjYXRlZ29yaWUgZm9yIGFuIGltZyBjYXQNCgkJaWYoJHVzZV9jYXQgPT0gJ3RydWUnICYmICFlbXB0eSgkcHJldGV4dFsnYyddKSkNCgkJCSRxdWVyeSA9ICcgY2F0ZWdvcnkgPSAiJy4kcHJldGV4dFsnYyddLiciICc7DQoNCgkJLy9jaGVja2luZyBzZWN0aW9uIGZvciBhbiBpbWcgY2F0DQoJCWlmKCR1c2Vfc2VjdGlvbiA9PSAndHJ1ZScgJiYgIWVtcHR5KCRwcmV0ZXh0WydzJ10pKQ0KCQkJJHF1ZXJ5ID0gJyBjYXRlZ29yeSA9ICInLiRwcmV0ZXh0WydzJ10uJyIgJzsNCg0KCQkvL2NoZWNraW5nIHRhZyBhdHRyICJjYXQiDQoJCWlmKCFlbXB0eSgkY2F0KSkNCgkJCSRxdWVyeSAgPSAnIGNhdGVnb3J5ID0gIicuJGNhdC4nIiAnOw0KCQkJDQoJCS8vY2hlY2tpbmcgdGFnIGF0dHIgImltZyINCgkJaWYoIWVtcHR5KCRpbWcpKQ0KCQkJJHF1ZXJ5ID0gc3BsaXQoJywnLCRpbWcpOw0KDQoJCWlmKGVtcHR5KCRxdWVyeSkpew0KCQkJdHJpZ2dlcl9lcnJvcignTm8gaW1hZ2VzIHRvIHNob3cuJyk7DQoJCQlyZXR1cm4gJyc7DQoJCX0NCgkJaWYoaXNfYXJyYXkoJHF1ZXJ5KSl7DQoJCQlmb3JlYWNoKCRxdWVyeSBhcyAkcSl7DQoJCQkJJGRiW10gPSAiaWQgPSAnJHEnIjsNCgkJCX0NCgkJCSRxdWVyeSA9IGpvaW4oJyBPUiAnLCRkYik7CQkJDQoJCX0JDQoJCQkNCgkJJGdldEltZ3MgPSBzYWZlX3Jvd3MoIiosICRjYXB0aW9uIGFzIGFzQ2FwdGlvbiIsJ3R4cF9pbWFnZScsJHF1ZXJ5KTsJDQoNCgkJaWYoY291bnQoJGdldEltZ3MpID09IDEpew0KCQkJZXh0cmFjdCgkZ2V0SW1nc1swXSk7DQoJCQlpZihlbXB0eSgkdGh1bWJuYWlsKSkNCgkJCQlyZXR1cm4gKCRkZWJ1ZyAhPSB0cnVlKT8nJzoiXG48cHJlIHN0eWxlPVwicGFkZGluZy1sZWZ0OiAyZW07XCIgY2xhc3M9XCJiYWNrdHJhY2VcIj48Y29kZT5FcnJvciBiYXNfbGlnaHRib3hcbiBUaGVyZSBpcyBubyB0aHVtYm5haWwgZm9yIGltYWdlICRpZCRleHQuPC9jb2RlPjwvcHJlPiI7DQoJCQkkdGh1bWIgPSAnPGltZyBzcmM9IicuaHUuJGltZ19kaXIuJy8nLiRpZC4ndCcuJGV4dC4nIiBhbHQ9IicuJGFsdC4nIi8+JzsNCgkJCSRvdXRbXSA9IHRhZygkdGh1bWIsJ2EnLCcgaHJlZj0iJy5odS4kaW1nX2Rpci4nLycuJGlkLiRleHQuJyIgcmVsPSJsaWdodGJveCIgdGl0bGU9IicuJGFzQ2FwdGlvbi4nIicpOw0KCQl9DQoJCWVsc2V7DQoJCQkvL2dlbmVyYXRlIGFuIHJvYWR0cmlwIGlkDQoJCQkkcHJlZnNbJ2Jhc19saWdodGJveF9yb2FkdHJpcCddID0gKGVtcHR5KCRwcmVmc1snYmFzX2xpZ2h0Ym94X3JvYWR0cmlwJ10pKT8xOiRwcmVmc1snYmFzX2xpZ2h0Ym94X3JvYWR0cmlwJ10rMTsNCgkJCSRpc1RodW1iID0gZmFsc2U7DQoJCQlmb3JlYWNoKCRnZXRJbWdzIGFzICRnZXRJbWcpew0KCQkJCWV4dHJhY3QoJGdldEltZyk7DQoJCQkJaWYoIWVtcHR5KCR0aHVtYm5haWwpKXsNCgkJCQkJJGlzVGh1bWIgPSB0cnVlOw0KCQkJCQkkdGh1bWIgPSAnPGltZyBzcmM9IicuaHUuJGltZ19kaXIuJy8nLiRpZC4ndCcuJGV4dC4nIiBhbHQ9IicuJGFsdC4nIi8+JzsNCgkJCQkJJG91dFtdID0gdGFnKCR0aHVtYiwnYScsJyBocmVmPSInLmh1LiRpbWdfZGlyLicvJy4kaWQuJGV4dC4nIiByZWw9ImxpZ2h0Ym94WycuJHByZWZzWydiYXNfbGlnaHRib3hfcm9hZHRyaXAnXS4nXSIgdGl0bGU9IicuJGFzQ2FwdGlvbi4nIicpOw0KCQkJCX0JCQkJDQoJCQl9DQoJCQlpZigkaXNUaHVtYiA9PSBmYWxzZSl7DQoJCQkJdHJpZ2dlcl9lcnJvcignVGhlcmUgaXMgbm8gdGh1bWJuYWlsLicpOw0KCQkJCXJldHVybiAnJzsNCgkJCX0NCgkJCQ0KCQl9DQoJCXJldHVybiAgZG9MYWJlbCgkbGFiZWwsICRsYWJlbHRhZykuZG9XcmFwKCRvdXQsICR3cmFwdGFnLCAkYnJlYWssICR3cmFwY2xhc3MsJGJyZWFrY2xhc3MpOw0KDQoJfQ0KDQoNCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCglmdW5jdGlvbiBiYXNfbGlnaHRib3hfaGVhZCgpDQoJew0KCQlnbG9iYWwgJHByZWZzOw0KCQkkcHJvdG90eXBlID0gZmV0Y2goJ2ZpbGVuYW1lJywndHhwX2ZpbGUnLCdpZCcsJHByZWZzWyJiYXNfbGlnaHRib3hfYmFzX2xiMDVfcHJvdG90eXBlX2pzIl0pOw0KCQkkc2NyaXB0YWN1bG91cyA9IGZldGNoKCdmaWxlbmFtZScsJ3R4cF9maWxlJywnaWQnLCRwcmVmc1siYmFzX2xpZ2h0Ym94X2Jhc19sYjA1X3NjcmlwdGFjdWxvdXNfanMiXSk7DQoJCSRsaWdodGJveCA9IGZldGNoKCdmaWxlbmFtZScsJ3R4cF9maWxlJywnaWQnLCRwcmVmc1siYmFzX2xpZ2h0Ym94X2Jhc19sYjA1X2xpZ2h0Ym94X2pzIl0pOw0KCQkkY3NzID0gZmV0Y2goJ2ZpbGVuYW1lJywndHhwX2ZpbGUnLCdpZCcsJHByZWZzWyJiYXNfbGlnaHRib3hfYmFzX2xiMDVfbGlnaHRib3hfY3NzIl0pOw0KCQkkb3V0W10gPSAiPHNjcmlwdCB0eXBlPSd0ZXh0L2phdmFzY3JpcHQnIHNyYz0nIi5odS4iZmlsZXMvJHByb3RvdHlwZScgY2hhcnNldD0nSVNPLTg4NTktMSc+PC9zY3JpcHQ+IjsNCgkJJG91dFtdID0gIjxzY3JpcHQgdHlwZT0ndGV4dC9qYXZhc2NyaXB0JyBzcmM9JyIuaHUuImZpbGVzLyRzY3JpcHRhY3Vsb3VzP2xvYWQ9ZWZmZWN0cyc+PC9zY3JpcHQ+IjsNCgkJJG91dFtdID0gIjxzY3JpcHQgdHlwZT0ndGV4dC9qYXZhc2NyaXB0JyBzcmM9JyIuaHUuImZpbGVzLyRsaWdodGJveCc+PC9zY3JpcHQ+IjsNCgkJJG91dFtdID0gIjxsaW5rIHJlbD0nc3R5bGVzaGVldCcgaHJlZj0nIi5odS4iZmlsZXMvJGNzcycgdHlwZT0ndGV4dC9jc3MnIG1lZGlhPSdzY3JlZW4nIC8+IjsNCgkJJHByZWZzWydiYXNfbGlnaHRib3hfaGVhZCddID0gdHJ1ZTsNCgkJcmV0dXJuIGpvaW4obiwkb3V0KTsNCgl9DQoNCg0KLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLy8gQmx1Z2luJ3MgYmFja2VuZA0KLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KCWlmIChAdHhwaW50ZXJmYWNlID09ICdhZG1pbicpDQoJew0KCQlnbG9iYWwgJGV2ZW50Ow0KCQlpZigkZXZlbnQgPT0gJ2Jhc19saWdodGJveF9hZG1pbicpDQoJCQliYXNfbGlnaHRib3hfdGV4dCgpOw0KCQlhZGRfcHJpdnMoJ2Jhc19saWdodGJveF9hZG1pbicsICcxJyk7DQoJCWFkZF9wcml2cygnYmFzX2xpZ2h0Ym94X2N1c3RvbV9maWVsZCcsICcxJyk7DQoJCXJlZ2lzdGVyX3RhYigiZXh0ZW5zaW9ucyIsICdiYXNfbGlnaHRib3hfYWRtaW4nLCAnYmFzIExpZ2h0Ym94Jyk7DQoJCXJlZ2lzdGVyX2NhbGxiYWNrKCdiYXNfbGlnaHRib3hfYWRtaW4nLCJiYXNfbGlnaHRib3hfYWRtaW4iKTsNCgkJcmVnaXN0ZXJfY2FsbGJhY2soJ2Jhc19saWdodGJveF9jdXN0b21fZmllbGQnLCdhcnRpY2xlJywgJycsIDEpOw0KCX0NCg0KLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KCWZ1bmN0aW9uIGJhc19saWdodGJveF9jdXN0b21fZmllbGQoKQ0KCXsNCgkJZ2xvYmFsICRiYXNfZ2xvYmFsOyANCgkJJGJhc19nbG9iYWxbJ2Jhc19saWdodGJveCddWydjdXN0b21fZmllbGQnXSA9IHNhZmVfcm93KCduYW1lJywgJ3R4cF9wcmVmcycsICd2YWw9IkxpZ2h0Ym94IiBBTkQgZXZlbnQgPSJjdXN0b20iJyk7DQoJCWlmKCFlbXB0eSgkYmFzX2dsb2JhbFsnYmFzX2xpZ2h0Ym94J11bJ2N1c3RvbV9maWVsZCddKSl7DQoJCQkkYmFzX2dsb2JhbFsnYmFzX2xpZ2h0Ym94J11bJ2N1c3RvbV9maWVsZCddID0gc3RyX3JlcGxhY2UoJ19zZXQnLCcnLCRiYXNfZ2xvYmFsWydiYXNfbGlnaHRib3gnXVsnY3VzdG9tX2ZpZWxkJ11bJ25hbWUnXSk7DQoJCQkNCgkJCQ0KCQkJJGltZ19jYXRzID0gc2FmZV9yb3dzKCduYW1lLHRpdGxlJywndHhwX2NhdGVnb3J5JywndHlwZSA9ICJpbWFnZSInKTsNCgkJCSRpbWdfc2VsZWN0ID0gYXJyYXkoKTsNCgkJCWZvcmVhY2goJGltZ19jYXRzIGFzICRjYXQpew0KCQkJCWV4dHJhY3QoJGNhdCk7DQoJCQkJJGltZ19zZWxlY3RbJG5hbWVdID0gJHRpdGxlOw0KCQkJCQ0KCQkJfQ0KCQkJJGJhc19nbG9iYWxbJ2Jhc19saWdodGJveCddWydpbWdfY2F0cyddID0gJGltZ19zZWxlY3Q7DQoJCQkNCgkJCQ0KCQkJDQoJCQlvYl9zdGFydCgnYmFzX2xpZ2h0Ym94QnVmZmVyJyk7DQoJCX0NCg0KCX0NCi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCglmdW5jdGlvbiBiYXNfbGlnaHRib3hCdWZmZXIoJGJ1ZmZlcikNCgl7DQoJCWdsb2JhbCAkYmFzX2dsb2JhbDsgDQoJCQ0KCQkkY2F0ID0gJyc7DQoJCSRuZXcgPSBncHMoJ3B1Ymxpc2gnKTsNCgkJJG5ldyA9ICghZW1wdHkoJG5ldykpP3RydWU6ZmFsc2U7CQkNCgkJJHNhdmVkID0gZ3BzKCdzYXZlJyk7DQoJCSRzYXZlZCA9ICghZW1wdHkoJHNhdmVkKSk/dHJ1ZTpmYWxzZTsJCQ0KDQoJCWlmKCRuZXcgfHwgJHNhdmVkKXsNCgkJCSRjYXQgPSBncHMoJGJhc19nbG9iYWxbJ2Jhc19saWdodGJveCddWydjdXN0b21fZmllbGQnXSk7DQoNCgkJfQ0KCQllbHNlaWYocHJlZ19tYXRjaF9hbGwoIj08aW5wdXQoW15cPl0qPyluYW1lXD1cIiIuJGJhc19nbG9iYWxbJ2Jhc19saWdodGJveCddWydjdXN0b21fZmllbGQnXS4iXCIoW15cPl0qPyl2YWx1ZVw9XCIoW15cPl0qPylcIihbXlw+XSo/KT49bXNpIiwkYnVmZmVyLCR0aGlzRGVtbykpew0KCQkJJGNhdCA9ICR0aGlzRGVtb1szXVswXTsNCgkJfQ0KCQkNCgkJJGJ1ZmZlciA9IHByZWdfcmVwbGFjZSgiPTxpbnB1dChbXlw+XSo/KW5hbWVcPVwiIi4kYmFzX2dsb2JhbFsnYmFzX2xpZ2h0Ym94J11bJ2N1c3RvbV9maWVsZCddLiJcIihbXlw+XSo/KXZhbHVlXD1cIihbXlw+XSo/KVwiKFteXD5dKj8pPj1tc2kiLGJhc19saWdodGJveF9hZG1pbl9tYXJrdXAoJGNhdCksJGJ1ZmZlcik7DQoJCXJldHVybiAkYnVmZmVyOw0KCX0NCg0KLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KCWZ1bmN0aW9uIGJhc19saWdodGJveF9hZG1pbl9tYXJrdXAoJHZhbCl7DQoJCWdsb2JhbCAkYmFzX2dsb2JhbDsgDQoJCSRkcm9wX2Rvd25fbGlzdCA9IHNlbGVjdElucHV0KCRiYXNfZ2xvYmFsWydiYXNfbGlnaHRib3gnXVsnY3VzdG9tX2ZpZWxkJ10sICRiYXNfZ2xvYmFsWydiYXNfbGlnaHRib3gnXVsnaW1nX2NhdHMnXSwgJHZhbCx0cnVlKTsNCgkJcmV0dXJuICRkcm9wX2Rvd25fbGlzdDsNCg0KCX0NCg0KLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KCWZ1bmN0aW9uIGJhc19saWdodGJveF9hZG1pbigkZXZlbnQsJHN0ZXApDQoJew0KCQlnbG9iYWwgJHByZWZzOw0KCQlpZihlbXB0eSgkcHJlZnNbImJhc19saWdodGJveF9pbnN0YWxsIl0pKXsNCg0KCQkJaWYoISRzdGVwIG9yICFmdW5jdGlvbl9leGlzdHMoJ2Jhc19saWdodGJveF9pbnN0YWxsXycuJHN0ZXApIG9yICFpbl9hcnJheSgkc3RlcCwgYXJyYXkoJ3N0ZXAxJywnc3RlcDInLCdzdGVwMycsJ3N0ZXA0JywpKSkNCgkJCXsNCgkJCQllY2hvIGJhc19saWdodGJveF9pbnN0YWxsX3N0ZXAxKCk7DQoJCQl9DQoJCQllbHNlew0KCQkJCSRmdW5jdCA9ICdiYXNfbGlnaHRib3hfaW5zdGFsbF8nLiRzdGVwOw0KCQkJCWVjaG8gJGZ1bmN0KCk7DQoJCQl9DQoJCX0NCgkJZWxzZWlmKGluX2FycmF5KCRzdGVwLGFycmF5KCd1bmluc3RhbGxfc3RlcDEnLCd1bmluc3RhbGxfc3RlcDInKSkpew0KCQkJJGZ1bmN0ID0gJ2Jhc19saWdodGJveF8nLiRzdGVwOw0KCQkJZWNobyAkZnVuY3QoKTsNCgkJfQ0KCQllbHNlew0KCQkJaWYoaW5fYXJyYXkoJHN0ZXAsYXJyYXkoJ3ByZWZzJywncHJlZnNfc2F2ZScpKSl7DQoJCQkJJGZ1bmN0ID0gJ2Jhc19saWdodGJveF8nLiRzdGVwOw0KCQkJCWVjaG8gJGZ1bmN0KCk7DQoJCQl9DQoJCQllbHNlDQoJCQkJZWNobyBiYXNfbGlnaHRib3hfcHJlZnMoKTsNCgkJfQ0KDQoJfQ0KDQoNCglnbG9iYWwgJHZhcnM7DQoJJHZhcnMgPSBhcnJheSgnYmFzX2xpZ2h0Ym94X3VzZV9zZWN0aW9uJywnYmFzX2xpZ2h0Ym94X3VzZV9jYXQnLCdiYXNfbGlnaHRib3hfY2FwdGlvbicsJ2Jhc19saWdodGJveF9sYWJlbCcsJ2Jhc19saWdodGJveF9sYWJlbHRhZycsJ2Jhc19saWdodGJveF93cmFwdGFnJywnYmFzX2xpZ2h0Ym94X3dyYXBjbGFzcycsJ2Jhc19saWdodGJveF9icmVhaycsJ2Jhc19saWdodGJveF9icmVha2NsYXNzJyk7DQoNCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCglmdW5jdGlvbiBiYXNfbGlnaHRib3hfcHJlZnMoKXsNCgkJZ2xvYmFsICRwcmVmcywkdmFyczsNCgkJcGFnZXRvcCgnYmFzIExpZ2h0Ym94JyxnVHh0KCdiYXNfbGJfYWRtaW4nKSk7DQoJCSRvdXRbXSA9IHN0YXJ0VGFibGUoICdsaXN0JyApOw0KCQkkb3V0W10gPSB0cigNCgkJCQl0ZGEodGFnKGdUeHQoJ2Jhc19sYl9hZG1pbicpLCdoMScpLCcgY29sc3Bhbj0iMiInKQ0KCQkJKTsNCgkJZm9yZWFjaCgkdmFycyBhcyAkdmFyKXsNCgkJCSRvdXRbXSA9IHRyKHRkKHN0cl9yZXBsYWNlKCdiYXNfbGlnaHRib3hfJywnJywkdmFyKSkudGQoZklucHV0KCd0ZXh0JywkdmFyLCAkcHJlZnNbJHZhcl0sJ2VkaXQnKSkpOw0KCQl9DQoNCgkJJG91dFtdID0gdHIoDQoJCQkJdGRhKA0KCQkJCQlmSW5wdXQoICJzdWJtaXQiLCAnJywgZ1R4dCggJ2Jhc19sYl9hZG1pbl9zYXZlJyApLCAicHVibGlzaCIgKS4NCgkJCQkJZUlucHV0KCAnYmFzX2xpZ2h0Ym94X2FkbWluJyApLg0KCQkJCQlzSW5wdXQoJ3ByZWZzX3NhdmUnKQ0KCQkJCSwnIGNvbHNwYW49IjIiIHN0eWxlPSJ0ZXh0LWFsaWduOmNlbnRlcjsiJykNCgkJCSk7DQoJCSRvdXRbXSA9IGVuZFRhYmxlKCk7DQoJCSRvdXRbXSA9IGJhc19saWdodGJveF91bmluc3RhbGxfc3RhcnQoKTsNCgkJcmV0dXJuIGZvcm0oam9pbihuLCRvdXQpKTsNCgl9DQoNCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCglmdW5jdGlvbiBiYXNfbGlnaHRib3hfcHJlZnNfc2F2ZSgpew0KCQlnbG9iYWwgJHZhcnMsJHByZWZzOw0KCQlleHRyYWN0KGdwc2EoJHZhcnMpKTsNCgkJJGNoYW5nZXMgPSBmYWxzZTsNCgkJZm9yZWFjaCgkdmFycyBhcyAkdmFyKXsNCgkJCWlmKCRwcmVmc1skdmFyXSAhPSAkJHZhcikNCgkJCXsNCgkJCQkkcSA9IHNhZmVfdXBkYXRlKCJ0eHBfcHJlZnMiLCJ2YWwgPSAnIi4kJHZhci4iJyIsIm5hbWUgPSAnJHZhciciKTsNCgkJCQkkY2hhbmdlcyA9IHRydWU7DQoJCQl9DQoJCX0NCgkJaWYoJGNoYW5nZXMgPT0gdHJ1ZSkNCgkJCSRwcmVmcyA9IGdldF9wcmVmcygpOw0KCQlyZXR1cm4gYmFzX2xpZ2h0Ym94X3ByZWZzKCk7DQoJfQ0KDQovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoJZnVuY3Rpb24gYmFzX2xpZ2h0Ym94X2luc3RhbGxfc3RlcDEoKQ0KCXsNCgkJcGFnZXRvcCgnYmFzIExpZ2h0Ym94JyxnVHh0KCdiYXNfbGJfaW5zdGFsbCcpLicgLSAnLmdUeHQoJ2Jhc19sYl9pbl9zdGVwMScpKTsNCgkJJG91dFtdID0gc3RhcnRUYWJsZSggJ2VkaXQnICk7DQoJCSRvdXRbXSA9IHRyKA0KCQkJCXRkKA0KCQkJCQlnVHh0KCdiYXNfbGJfaW5fc3RlcDFfdGV4dCcpLg0KCQkJCQlmSW5wdXQoICJzdWJtaXQiLCAnJywgZ1R4dCggJ2Jhc19sYl9pbl9zdGFydCcgKSwgInB1Ymxpc2giICkuDQoJCQkJCWVJbnB1dCggJ2Jhc19saWdodGJveF9hZG1pbicgKS4NCgkJCQkJc0lucHV0KCdzdGVwMicpDQoJCQkJKQ0KCQkJKTsNCgkJJG91dFtdID0gZW5kVGFibGUoICdlZGl0JyApOw0KCQlyZXR1cm4gZm9ybShqb2luKG4sJG91dCkpOw0KCX0NCg0KLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KCWZ1bmN0aW9uIGJhc19saWdodGJveF9pbnN0YWxsX3N0ZXAyKCkNCgl7DQoJCWdsb2JhbCAkcHJlZnM7DQoJCSRpbXBvcnQgPSBncHMoJ3N0YXJ0X2ltcG9ydCcpOw0KCQlpZihlbXB0eSgkaW1wb3J0KSkNCgkJew0KCQkJcGFnZXRvcCgnYmFzIExpZ2h0Ym94JyxnVHh0KCdiYXNfbGJfaW5zdGFsbCcpLicgLSAnLmdUeHQoJ2Jhc19sYl9pbl9zdGVwMicpKTsNCgkJCSRvdXRbXSA9IHN0YXJ0VGFibGUoICdlZGl0JyApOw0KCQkJJG91dFtdID0gdHIoDQoJCQkJCXRkKA0KCQkJCQkJZ1R4dCgnYmFzX2xiX2luX3N0ZXAyX3N0YXJ0JykuDQoJCQkJCQlmb3JtKA0KCQkJCQkJCWZJbnB1dCggInN1Ym1pdCIsICcnLCBnVHh0KCAnYmFzX2xiX2luX3N0YXJ0X2ltcG9ydCcgKSwgInB1Ymxpc2giICkuDQoJCQkJCQkJZUlucHV0KCAnYmFzX2xpZ2h0Ym94X2FkbWluJyApLg0KCQkJCQkJCXNJbnB1dCgnc3RlcDInKS4NCgkJCQkJCQknPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0ic3RhcnRfaW1wb3J0InZhbHVlPSJ0cnVlIiAvPicNCgkJCQkJCSkNCgkJCQkJKQ0KCQkJCSk7DQoJCQkkb3V0W10gPSB0cigNCgkJCQkJdGQoDQoJCQkJCQlnVHh0KCdiYXNfbGJfaW5fc3RlcDJfc2tpcCcpLg0KCQkJCQkJZm9ybSgNCgkJCQkJCQlmSW5wdXQoICJzdWJtaXQiLCAnJywgZ1R4dCggJ2Jhc19sYl9pbl9za2lwJyApLCAicHVibGlzaCIgKS4NCgkJCQkJCQllSW5wdXQoICdiYXNfbGlnaHRib3hfYWRtaW4nICkuDQoJCQkJCQkJc0lucHV0KCdzdGVwMycpDQoJCQkJCQkpDQoJCQkJCSkNCgkJCQkpOw0KCQkJJG91dFtdID0gZW5kVGFibGUoICdlZGl0JyApOw0KDQoJCX0NCgkJZWxzZXsNCgkJCXBhZ2V0b3AoJ2JhcyBMaWdodGJveCcsZ1R4dCgnYmFzX2xiX2luc3RhbGwnKS4nIC0gJy5nVHh0KCdiYXNfbGJfaW5fc3RlcDInKSk7DQoNCgkJCWdsb2JhbCAkZmlsZXMsJGltYWdlczsNCg0KCQkJaWYoIXNhZmVfY29sdW1uKCdpZCcsJ3R4cF9jYXRlZ29yeScsJ25hbWUgPSJiYXNfbGlnaHRib3giIEFORCB0eXBlID0gImZpbGUiJykpew0KCQkJCSRxID0gc2FmZV9pbnNlcnQoInR4cF9jYXRlZ29yeSIsICJuYW1lPSdiYXNfbGlnaHRib3gnLCB0aXRsZT0nYmFzX2xpZ2h0Ym94JywgdHlwZT0nZmlsZScsIHBhcmVudD0ncm9vdCciKTsNCgkJCQlyZWJ1aWxkX3RyZWUoJ3Jvb3QnLCAxLCAnZmlsZScpOw0KCQkJfQ0KCQkJJG91dFtdID0gc3RhcnRUYWJsZSggJ2xpc3QnICk7DQoJCQkkb3V0W10gPSAnPHRyPjx0ZD4nOw0KCQkJJG91dFtdID0gZ1R4dCgnYmFzX2xiX2luX3N0ZXAyJyk7DQoJCQkkb3V0W10gPSAnPHVsPic7DQoJCQlmb3JlYWNoKCRmaWxlcyBhcyAkZmlsZSkNCgkJCQkkb3V0W10gPSB0YWcoYmFzX2xpZ2h0Ym94X2ltcG9ydF9maWxlKCRmaWxlLCdmaWxlJyksJ2xpJyk7DQoNCgkJCSRvdXRbXSA9ICc8L3VsPic7DQoJCQkkb3V0W10gPSAnPHVsPic7DQoNCgkJCWZvcmVhY2goJGltYWdlcyBhcyAkaW1nKQ0KCQkJCSRvdXRbXSA9IHRhZyhiYXNfbGlnaHRib3hfaW1wb3J0X2ZpbGUoJGltZywnaW1hZ2UnKSwnbGknKTsNCg0KCQkJJG91dFtdID0gJzwvdWw+JzsNCgkJCSRvdXRbXSA9IGZJbnB1dCggInN1Ym1pdCIsICcnLCBnVHh0KCAnYmFzX2xiX2luX25leHQnICksICJwdWJsaXNoIiApOw0KCQkJJG91dFtdID0gZUlucHV0KCAnYmFzX2xpZ2h0Ym94X2FkbWluJyApOw0KCQkJJG91dFtdID0gc0lucHV0KCdzdGVwMycpOw0KCQkJJG91dFtdID0gJzwvdGQ+PC90cj4nOw0KCQkJJG91dFtdID0gZW5kVGFibGUoICdlZGl0JyApOw0KCQl9DQoJCXJldHVybiBmb3JtKGpvaW4obiwkb3V0KSk7DQoNCgl9DQoNCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCglmdW5jdGlvbiBiYXNfbGlnaHRib3hfaW5zdGFsbF9zdGVwMygpDQoJew0KCQlnbG9iYWwgJGZpbGVzLCRpbWFnZXM7DQoJCXBhZ2V0b3AoJ2JhcyBMaWdodGJveCcsZ1R4dCgnYmFzX2xiX2luc3RhbGwnKS4nIC0gJy5nVHh0KCdiYXNfbGJfaW5fc3RlcDMnKSk7DQoJCSRzYXZlID0gZ3BzKCdzYXZlJyk7DQoJCWlmKGVtcHR5KCRzYXZlKSkNCgkJew0KCQkJJG91dFtdID0gc3RhcnRUYWJsZSggJ2xpc3QnICk7DQoJCQkkb3V0W10gPSB0cigNCgkJCQkJdGRhKA0KCQkJCQkJZ1R4dCgnYmFzX2xiX2luX3N0ZXAzX3RleHQnKSwnIGNvbHNwYW49IjIiJw0KCQkJCQkpDQoJCQkJKTsNCg0KCQkJJG91dFtdID0gdHIoIHRkKCAnPGI+RmlsZW5hbWU8L2I+JykgLiB0ZCggJzxiPnR4cCBpZDwvYj4nKSk7DQoNCgkJCWZvcmVhY2goJGZpbGVzIGFzICRmaWxlKQ0KCQkJew0KCQkJCWV4dHJhY3QoJGZpbGUpOw0KCQkJCSRvdXRbXSA9IHRyKCB0ZCggJGZpbGVuYW1lKSAuIHRkKGZJbnB1dCgndGV4dCcsJ2Jhc19saWdodGJveF8nLnN0cl9yZXBsYWNlKCcuJywnXycsJGZpbGVuYW1lKSwgZmV0Y2goJ2lkJywndHhwX2ZpbGUnLCdmaWxlbmFtZScsJGZpbGVuYW1lKSwnZWRpdCcpKSk7DQoJCQl9DQoJCQkkb3V0W10gPSB0ciggdGQoICdpbWFnZSBuYW1lJykgLiB0ZCggJ3R4cCBpZCcpKTsNCg0KCQkJZm9yZWFjaCgkaW1hZ2VzIGFzICRpbWcpDQoJCQl7DQoJCQkJZXh0cmFjdCgkaW1nKTsNCgkJCQkJICRvdXRbXSA9IHRyKCB0ZCggJG5hbWUpIC4gdGQoZklucHV0KCd0ZXh0JywnYmFzX2xpZ2h0Ym94Xycuc3RyX3JlcGxhY2UoJy4nLCdfJywkbmFtZSksIGZldGNoKCdpZCcsJ3R4cF9pbWFnZScsJ25hbWUnLCRuYW1lKSwnZWRpdCcpKSk7DQoJCQl9DQoNCgkJCSRvdXRbXSA9IHRyKA0KCQkJCQl0ZCgNCgkJCQkJCWZJbnB1dCggInN1Ym1pdCIsICcnLCBnVHh0KCAnc2F2ZScgKSwgInB1Ymxpc2giICkuDQoJCQkJCQllSW5wdXQoICdiYXNfbGlnaHRib3hfYWRtaW4nICkuDQoJCQkJCQlzSW5wdXQoJ3N0ZXAzJykuDQoJCQkJCQknPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0ic2F2ZSIgdmFsdWU9InRydWUiIC8+Jw0KCQkJCQkpDQoJCQkJKTsNCg0KCQkJJG91dFtdID0gZW5kVGFibGUoKTsNCgkJCXJldHVybiBmb3JtKGpvaW4obiwkb3V0KSk7DQoJCX0NCgkJZWxzZQ0KCQl7DQoJCQkkcG9zID0gMTA7DQoJCQlmb3JlYWNoKCRmaWxlcyBhcyAkZmlsZSkNCgkJCXsNCgkJCQkkZmlsZSA9ICRmaWxlWydmaWxlbmFtZSddOw0KCQkJCSR2YWx1ZSA9IGdwcygnYmFzX2xpZ2h0Ym94Xycuc3RyX3JlcGxhY2UoJy4nLCdfJywkZmlsZSkpOw0KCQkJCXNhZmVfaW5zZXJ0KCd0eHBfcHJlZnMnLCJwcmVmc19pZCA9ICcxJyxuYW1lID0gJ2Jhc19saWdodGJveF8iLnN0cl9yZXBsYWNlKCcuJywnXycsJGZpbGUpLiInLHZhbCA9ICciLiR2YWx1ZS4iJyx0eXBlID0gJzInLGV2ZW50ID0gJ2Jhc19saWdodGJveCcsaHRtbCA9ICd0ZXh0X2lucHV0Jyxwb3NpdGlvbiA9ICckcG9zJyIpOw0KCQkJCSRwb3MgPSAkcG9zICsgMTA7DQoJCQl9DQoJCQlmb3JlYWNoKCRpbWFnZXMgYXMgJGltZykNCgkJCXsNCgkJCQkkaW1nID0gJGltZ1snbmFtZSddOw0KCQkJCSR2YWx1ZSA9IGdwcygnYmFzX2xpZ2h0Ym94Xycuc3RyX3JlcGxhY2UoJy4nLCdfJywkaW1nKSk7DQoJCQkJc2FmZV9pbnNlcnQoJ3R4cF9wcmVmcycsInByZWZzX2lkID0gJzEnLG5hbWUgPSAnYmFzX2xpZ2h0Ym94XyIuc3RyX3JlcGxhY2UoJy4nLCdfJywkaW1nKS4iJyx2YWwgPSAnIi4kdmFsdWUuIicsdHlwZSA9ICcyJyxldmVudCA9ICdiYXNfbGlnaHRib3gnLGh0bWwgPSAndGV4dF9pbnB1dCcscG9zaXRpb24gPSAnJHBvcyciKTsNCgkJCQkkcG9zID0gJHBvcyArIDEwOw0KCQkJfQ0KDQoNCg0KCQkJJGxpZ2h0Ym94X2NzcyA9IGpvaW4oJycsZmlsZSgiLi4vZmlsZXMvYmFzX2xiMDVfbGlnaHRib3guY3NzIikpOw0KCQkJJGxpZ2h0Ym94X2NzcyA9IHN0cl9yZXBsYWNlKCcuLi9pbWFnZXMvYmxhbmsuZ2lmJyxodS4naW1hZ2VzLycuZ3BzKCdiYXNfbGlnaHRib3hfYmFzX2xiMDVfYmxhbmtfZ2lmJykuJy5naWYnLCRsaWdodGJveF9jc3MpOw0KCQkJJGxpZ2h0Ym94X2NzcyA9IHN0cl9yZXBsYWNlKCcuLi9pbWFnZXMvcHJldmxhYmVsLmdpZicsaHUuJ2ltYWdlcy8nLmdwcygnYmFzX2xpZ2h0Ym94X2Jhc19sYjA1X3ByZXZsYWJlbF9naWYnKS4nLmdpZicsJGxpZ2h0Ym94X2Nzcyk7DQoJCQkkbGlnaHRib3hfY3NzID0gc3RyX3JlcGxhY2UoJy4uL2ltYWdlcy9uZXh0bGFiZWwuZ2lmJyxodS4naW1hZ2VzLycuZ3BzKCdiYXNfbGlnaHRib3hfYmFzX2xiMDVfbmV4dGxhYmVsX2dpZicpLicuZ2lmJywkbGlnaHRib3hfY3NzKTsNCgkJCSRmcCA9IGZvcGVuKCIuLi9maWxlcy9iYXNfbGIwNV9saWdodGJveC5jc3MiLCJ3Iik7DQoJCQlpZiAoJGZwKXtmbG9jaygkZnAsMik7ZnB1dHMgKCRmcCwgJGxpZ2h0Ym94X2Nzcyk7ZmxvY2soJGZwLDMpO2ZjbG9zZSgkZnApO30NCg0KDQoNCgkJCSRsaWdodGJveF9qcyA9IGpvaW4oJycsZmlsZSgiLi4vZmlsZXMvYmFzX2xiMDVfbGlnaHRib3guanMiKSk7DQoJCQkkbGlnaHRib3hfanMgPSBzdHJfcmVwbGFjZSgnaW1hZ2VzL2xvYWRpbmcuZ2lmJyxodS4naW1hZ2VzLycuZ3BzKCdiYXNfbGlnaHRib3hfYmFzX2xiMDVfbG9hZGluZ19naWYnKS4nLmdpZicsJGxpZ2h0Ym94X2pzKTsNCgkJCSRsaWdodGJveF9qcyA9IHN0cl9yZXBsYWNlKCdpbWFnZXMvY2xvc2VsYWJlbC5naWYnLGh1LidpbWFnZXMvJy5ncHMoJ2Jhc19saWdodGJveF9iYXNfbGIwNV9jbG9zZWxhYmVsX2dpZicpLicuZ2lmJywkbGlnaHRib3hfanMpOw0KCQkJJGZwID0gZm9wZW4oIi4uL2ZpbGVzL2Jhc19sYjA1X2xpZ2h0Ym94LmpzIiwidyIpOw0KCQkJaWYgKCRmcCl7ZmxvY2soJGZwLDIpO2ZwdXRzICgkZnAsICRsaWdodGJveF9qcyk7ZmxvY2soJGZwLDMpO2ZjbG9zZSgkZnApO30NCg0KDQoJCQlzYWZlX2luc2VydCgndHhwX3ByZWZzJywicHJlZnNfaWQgPSAnMScsbmFtZSA9ICdiYXNfbGlnaHRib3hfdXNlX3NlY3Rpb24nLHZhbCA9ICdmYWxzZScsdHlwZSA9ICcyJyxldmVudCA9ICdiYXNfbGlnaHRib3gnLGh0bWwgPSAndGV4dF9pbnB1dCcscG9zaXRpb24gPSAnJyIpOw0KCQkJc2FmZV9pbnNlcnQoJ3R4cF9wcmVmcycsInByZWZzX2lkID0gJzEnLG5hbWUgPSAnYmFzX2xpZ2h0Ym94X3VzZV9jYXQnLHZhbCA9ICdmYWxzZScsdHlwZSA9ICcyJyxldmVudCA9ICdiYXNfbGlnaHRib3gnLGh0bWwgPSAndGV4dF9pbnB1dCcscG9zaXRpb24gPSAnJyIpOw0KCQkJc2FmZV9pbnNlcnQoJ3R4cF9wcmVmcycsInByZWZzX2lkID0gJzEnLG5hbWUgPSAnYmFzX2xpZ2h0Ym94X2NhcHRpb24nLHZhbCA9ICdjYXB0aW9uJyx0eXBlID0gJzInLGV2ZW50ID0gJ2Jhc19saWdodGJveCcsaHRtbCA9ICd0ZXh0X2lucHV0Jyxwb3NpdGlvbiA9ICcnIik7DQoJCQlzYWZlX2luc2VydCgndHhwX3ByZWZzJywicHJlZnNfaWQgPSAnMScsbmFtZSA9ICdiYXNfbGlnaHRib3hfbGFiZWwnLHZhbCA9ICdiYXMgTGlnaHRib3gnLHR5cGUgPSAnMicsZXZlbnQgPSAnYmFzX2xpZ2h0Ym94JyxodG1sID0gJ3RleHRfaW5wdXQnLHBvc2l0aW9uID0gJyciKTsNCgkJCXNhZmVfaW5zZXJ0KCd0eHBfcHJlZnMnLCJwcmVmc19pZCA9ICcxJyxuYW1lID0gJ2Jhc19saWdodGJveF9sYWJlbHRhZycsdmFsID0gJ2gyJyx0eXBlID0gJzInLGV2ZW50ID0gJ2Jhc19saWdodGJveCcsaHRtbCA9ICd0ZXh0X2lucHV0Jyxwb3NpdGlvbiA9ICcnIik7DQoJCQlzYWZlX2luc2VydCgndHhwX3ByZWZzJywicHJlZnNfaWQgPSAnMScsbmFtZSA9ICdiYXNfbGlnaHRib3hfd3JhcHRhZycsdmFsID0gJ3VsJyx0eXBlID0gJzInLGV2ZW50ID0gJ2Jhc19saWdodGJveCcsaHRtbCA9ICd0ZXh0X2lucHV0Jyxwb3NpdGlvbiA9ICcnIik7DQoJCQlzYWZlX2luc2VydCgndHhwX3ByZWZzJywicHJlZnNfaWQgPSAnMScsbmFtZSA9ICdiYXNfbGlnaHRib3hfd3JhcGNsYXNzJyx2YWwgPSAnbGlnaHRib3gnLHR5cGUgPSAnMicsZXZlbnQgPSAnYmFzX2xpZ2h0Ym94JyxodG1sID0gJ3RleHRfaW5wdXQnLHBvc2l0aW9uID0gJyciKTsNCgkJCXNhZmVfaW5zZXJ0KCd0eHBfcHJlZnMnLCJwcmVmc19pZCA9ICcxJyxuYW1lID0gJ2Jhc19saWdodGJveF9icmVhaycsdmFsID0gJ2xpJyx0eXBlID0gJzInLGV2ZW50ID0gJ2Jhc19saWdodGJveCcsaHRtbCA9ICd0ZXh0X2lucHV0Jyxwb3NpdGlvbiA9ICcnIik7DQoJCQlzYWZlX2luc2VydCgndHhwX3ByZWZzJywicHJlZnNfaWQgPSAnMScsbmFtZSA9ICdiYXNfbGlnaHRib3hfYnJlYWtjbGFzcycsdmFsID0gJycsdHlwZSA9ICcyJyxldmVudCA9ICdiYXNfbGlnaHRib3gnLGh0bWwgPSAndGV4dF9pbnB1dCcscG9zaXRpb24gPSAnJyIpOw0KCQkJc2FmZV9pbnNlcnQoJ3R4cF9wcmVmcycsInByZWZzX2lkID0gJzEnLG5hbWUgPSAnYmFzX2xpZ2h0Ym94X2luc3RhbGwnLHZhbCA9ICd0cnVlJyx0eXBlID0gJzInLGV2ZW50ID0gJ2Jhc19saWdodGJveCcsaHRtbCA9ICd0ZXh0X2lucHV0Jyxwb3NpdGlvbiA9ICcnIik7DQoJCQkkb3V0W10gPSBzdGFydFRhYmxlKCAnZWRpdCcgKTsNCgkJCSRvdXRbXSA9IHRyKA0KCQkJCQl0ZCgNCgkJCQkJCWdUeHQoJ2Jhc19sYl9pbl9kb25lJykuDQoJCQkJCQlmb3JtKA0KCQkJCQkJCWZJbnB1dCggInN1Ym1pdCIsICcnLCBnVHh0KCAnZG9uZScgKSwgInB1Ymxpc2giICkuDQoJCQkJCQkJZUlucHV0KCAnYmFzX2xpZ2h0Ym94X2FkbWluJyApDQoJCQkJCQkpDQoJCQkJCSkNCgkJCQkpOw0KCQkJJG91dFtdID0gZW5kVGFibGUoKTsNCgkJCXJldHVybiBqb2luKG4sJG91dCk7DQoJCX0NCg0KDQoJfQ0KDQovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoJZnVuY3Rpb24gYmFzX2xpZ2h0Ym94X2luc3RhbGxfc3RlcDQoKQ0KCXsNCgkJcGFnZXRvcCgnYmFzIExpZ2h0Ym94JyxnVHh0KCdiYXNfbGJfaW5zdGFsbCcpLicgLSAnLmdUeHQoJ2Jhc19sYl9zdGVwNCcpKTsNCg0KCQlzYWZlX2luc2VydCgndHhwX3ByZWZzJywicHJlZnNfaWQgPSAnMScsbmFtZSA9ICdiYXNfbGlnaHRib3hfaW5zdGFsbCcsdmFsID0gJ3RydWUnLHR5cGUgPSAnMicsZXZlbnQgPSAnYmFzX2xpZ2h0Ym94JyxodG1sID0gJ3RleHRfaW5wdXQnLHBvc2l0aW9uID0gJyciKTsNCgkJJG91dFtdID0gc3RhcnRUYWJsZSggJ2VkaXQnICk7DQoJCSRvdXRbXSA9IHRyKA0KCQkJCXRkKA0KCQkJCQlnVHh0KCdiYXNfbGJfc3RlcDRfdGV4dCcpLg0KCQkJCQlmb3JtKA0KCQkJCQkJZklucHV0KCAic3VibWl0IiwgJycsIGdUeHQoICdkb25lJyApLCAicHVibGlzaCIgKS4NCgkJCQkJCWVJbnB1dCggJ2Jhc19saWdodGJveF9hZG1pbicgKQ0KCQkJCQkpDQoJCQkJKQ0KCQkJKTsNCgkJJG91dFtdID0gZW5kVGFibGUoKTsNCgkJcmV0dXJuIGpvaW4obiwkb3V0KTsNCgl9DQoNCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCglmdW5jdGlvbiBiYXNfbGlnaHRib3hfdW5pbnN0YWxsX3N0YXJ0KCkNCgl7DQoJCXJldHVybiAnPGRpdiBzdHlsZT0idGV4dC1hbGlnbjpjZW50ZXI7bWFyZ2luOjUwcHg7Ij48aHIgc3R5bGU9ImJvcmRlcjpub25lO2JvcmRlci10b3A6MXB4IHNvbGlkIGdyZXkiIC8+PGEgaHJlZj0iP2V2ZW50PWJhc19saWdodGJveF9hZG1pbiZhbXA7c3RlcD11bmluc3RhbGxfc3RlcDEiPlVuaW5zdGFsbCBiYXMgTGlnaHRib3g8L2E+PC9kaXY+JzsNCgl9DQoNCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCglmdW5jdGlvbiBiYXNfbGlnaHRib3hfdW5pbnN0YWxsX3N0ZXAxKCkNCgl7DQoJCXBhZ2V0b3AoJ2JhcyBMaWdodGJveCcsZ1R4dCgnYmFzX2xiX3VuaW5zdGFsbCcpLicgLSAnLmdUeHQoJ2Jhc19sYl91bl9zdGVwMScpKTsNCgkJJG91dFtdID0gc3RhcnRUYWJsZSggJ2VkaXQnICk7DQoJCSRvdXRbXSA9IHRyKA0KCQkJCXRkKA0KCQkJCQlnVHh0KCdiYXNfbGJfdW5fc3RlcDFfdGV4dCcpLg0KCQkJCQlmb3JtKA0KCQkJCQkJZklucHV0KCAic3VibWl0IiwgJycsIGdUeHQoICdiYXNfbGJfdW5pbnN0YWxsX3N0YXJ0JyApLCAicHVibGlzaCIgKS4NCgkJCQkJCWVJbnB1dCggJ2Jhc19saWdodGJveF9hZG1pbicgKS4NCgkJCQkJCXNJbnB1dCgndW5pbnN0YWxsX3N0ZXAyJykNCgkJCQkJKQ0KCQkJCSkNCgkJCSk7DQoJCSRvdXRbXSA9IHRyKA0KCQkJCXRkKA0KCQkJCQlmb3JtKA0KCQkJCQkJZklucHV0KCAic3VibWl0IiwgJycsIGdUeHQoICdiYXNfbGJfdW5pbnN0YWxsX2Fib3J0JyApLCAicHVibGlzaCIgKS4NCgkJCQkJCWVJbnB1dCggJ2Jhc19saWdodGJveF9hZG1pbicgKQ0KDQoJCQkJCSkNCgkJCQkpDQoJCQkpOw0KCQkkb3V0W10gPSBlbmRUYWJsZSggJ2VkaXQnICk7DQoJCXJldHVybiBqb2luKG4sJG91dCk7DQoJfQ0KDQovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoJZnVuY3Rpb24gYmFzX2xpZ2h0Ym94X3VuaW5zdGFsbF9zdGVwMigpDQoJew0KCQlnbG9iYWwgJGZpbGVzLCRpbWFnZXM7DQoJCXBhZ2V0b3AoJ2JhcyBMaWdodGJveCcsZ1R4dCgnYmFzX2xiX3VuaW5zdGFsbCcpLicgLSAnLmdUeHQoJ2Jhc19sYl91bl9zdGVwMicpKTsNCgkJCSRvdXRbXSA9ICc8aDE+WW91IGNhbiBub3cgZGVsZXRlIHRoZSBwbHVnaW48L2gxPic7DQoJCQkkb3V0W10gPSAnPHVsPic7DQoJCQlmb3JlYWNoKCRmaWxlcyBhcyAkZmlsZSl7DQoJCQkJJGZpbGVJRCA9IGZldGNoKCdpZCcsJ3R4cF9maWxlJywnZmlsZW5hbWUnLCRmaWxlWydmaWxlbmFtZSddKTsNCgkJCQkkcSA9IHNhZmVfZGVsZXRlKCJ0eHBfZmlsZSIsImlkPSckZmlsZUlEJyIpOw0KCQkJCSRkZWxldGUgPSB1bmxpbmsoJy4uL2ZpbGVzLycuJGZpbGVbJ2ZpbGVuYW1lJ10pOw0KCQkJCSRvdXRbXSA9IHRhZyhnVHh0KCdmaWxlJykuJyAiJy4kZmlsZVsnZmlsZW5hbWUnXS4nIicgLmdUeHQoJ2RlbGV0ZWQnKSwnbGknKTsNCgkJCX0NCgkJCWZvcmVhY2goJGltYWdlcyBhcyAkaW1nKXsNCgkJCQkkaW1nSUQgPSBmZXRjaCgnaWQnLCd0eHBfaW1hZ2UnLCduYW1lJywkaW1nWyduYW1lJ10pOw0KCQkJCSRxID0gc2FmZV9kZWxldGUoInR4cF9pbWFnZSIsImlkPSckaW1nSUQnIik7DQoNCgkJCQkkZGVsZXRlID0gdW5saW5rKCcuLi9pbWFnZXMvJy4kaW1nSUQuJGltZ1snZXh0J10pOw0KCQkJCSRvdXRbXSA9IHRhZyhnVHh0KCdpbWFnZScpLicgIicuJGltZ0lELiRpbWdbJ2V4dCddLiciJyAuZ1R4dCgnZGVsZXRlZCcpLCdsaScpOw0KCQkJfQ0KDQoJCQkkcSA9IHNhZmVfZGVsZXRlKCJ0eHBfcHJlZnMiLCJldmVudD0nYmFzX2xpZ2h0Ym94JyIpOw0KCQkJJG91dFtdID0gdGFnKGdUeHQoJ2Jhc19sYl9wcmVmc19kZWxldGVkJyksJ2xpJyk7DQoJCQkkcSA9IHNhZmVfZGVsZXRlKCJ0eHBfY2F0ZWdvcnkiLCJuYW1lPSdiYXNfbGlnaHRib3gnIik7DQoJCQkkb3V0W10gPSB0YWcoZ1R4dCgnYmFzX2xiX2NhdF9kZWxldGVkJyksJ2xpJyk7DQoJCQkkb3V0W10gPSAnPC91bD4nOw0KCQkJJG91dFtdID0gdGFnKGdUeHQoJ2Jhc19sYl9yZW1vdmUnKSwncCcpOw0KCQkJcmV0dXJuICc8ZGl2IHN0eWxlPSJtYXJnaW46NTBweDsiPicuam9pbihuLCRvdXQpLic8L2Rpdj4nOw0KCX0NCg0KLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KCWZ1bmN0aW9uIGJhc19saWdodGJveF90ZXh0KCkNCgl7DQoJCWdsb2JhbCAkcHJlZnM7DQoJCSRhY3RMYW5nID0gc3RyX3JlcGxhY2UoJy0nLCdfJywkcHJlZnNbJ2xhbmd1YWdlJ10pOw0KCQkkbGFuZ0Z1bmN0ID0gJ2Jhc19saWdodGJveF9sYW5nXycuJGFjdExhbmc7DQoJCUBpbmNsdWRlX3BsdWdpbigkbGFuZ0Z1bmN0KTsNCgkJaWYoZnVuY3Rpb25fZXhpc3RzKCRsYW5nRnVuY3QpKXsNCgkJCSRiYXNUZXh0YXJyYXkgPSAkbGFuZ0Z1bmN0KCk7DQoJCQkkY2hlY2tIZWxwID0gZmV0Y2goJ2hlbHAnLCd0eHBfcGx1Z2luJywnbmFtZScsJ2Jhc19saWdodGJveCcpOw0KCQkJaWYoIXByZWdfbWF0Y2goIj1cPFwhXC1cLSBMYW5nXDokYWN0TGFuZyBcLVwtXD49IiwkY2hlY2tIZWxwKSl7DQoJCQkJCSRsYW5nRnVuY3QoJ3VwZGF0ZURCJyk7DQoJCQl9DQoJCX0NCgkJZWxzZXsNCgkJCSRiYXNUZXh0YXJyYXkgPSBiYXNfbGlnaHRib3hfbGFuZ19lbl9nYigpOw0KCQkJJGNoZWNrSGVscCA9IGZldGNoKCdoZWxwJywndHhwX3BsdWdpbicsJ25hbWUnLCdiYXNfbGlnaHRib3gnKTsNCgkJCWlmKCFwcmVnX21hdGNoKCI9XDxcIVwtXC0gTGFuZ1w6ZW5fZ2IgXC1cLVw+PSIsJGNoZWNrSGVscCkpew0KCQkJCQliYXNfbGlnaHRib3hfbGFuZ19lbl9nYigndXBkYXRlREInKTsNCg0KCQkJfQ0KDQoJCX0NCgkJZm9yZWFjaCgkYmFzVGV4dGFycmF5IGFzICRrZXkgPT4gJHZhbHVlKXsNCgkJCSRHTE9CQUxTWyd0ZXh0YXJyYXknXVska2V5XSA9ICR2YWx1ZTsNCgkJfQ0KCX0NCg0KLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KCWdsb2JhbCAkZmlsZVVSTDsNCgkkZmlsZVVSTCA9ICdodHRwOi8vc2FtaXNkYXQub3JnL3B1YmxpYy1maWxlcy9saWdodGJveDA1JzsNCgkvLyRmaWxlVVJMID0gJy4uL3B1YmxpYy1maWxlcy9saWdodGJveDA1JzsNCg0KCWdsb2JhbCAkZmlsZXM7DQoJJGZpbGVzW10gPSBhcnJheSgnZmlsZW5hbWUnPT4nYmFzX2xiMDVfcHJvdG90eXBlLmpzJywnY2F0ZWdvcnknPT4nYmFzX2xpZ2h0Ym94JywnZGVzY3JpcHRpb24nID0+ICdUaGlzIGZpbGUgaXMgdXNlZCBieSBiYXMgTGlnaHRib3guPGJyLz4gUHJvdG90eXBlIGJ5IFNhbSBTdGVwaGVuc29uLjxici8+IFZpc2l0IGh0dHA6Ly9wcm90b3R5cGUuY29uaW8ubmV0LycpOw0KCSRmaWxlc1tdID0gYXJyYXkoJ2ZpbGVuYW1lJz0+J2Jhc19sYjA1X3NjcmlwdGFjdWxvdXMuanMnLCdjYXRlZ29yeSc9PidiYXNfbGlnaHRib3gnLCdkZXNjcmlwdGlvbicgPT4gJ1RoaXMgZmlsZSBpcyB1c2VkIGJ5IGJhcyBMaWdodGJveC48YnIvPiBTY3JpcHRhY3Vsb3VzIGJ5IFRob21hcyBGdWNocy48YnIvPiBWaXNpdCBodHRwOi8vc2NyaXB0LmFjdWxvLnVzLycpOw0KCSRmaWxlc1tdID0gYXJyYXkoJ2ZpbGVuYW1lJz0+J2Jhc19sYjA1X2VmZmVjdHMuanMnLCdjYXRlZ29yeSc9PidiYXNfbGlnaHRib3gnLCdkZXNjcmlwdGlvbicgPT4gJ1RoaXMgZmlsZSBpcyB1c2VkIGJ5IGJhcyBMaWdodGJveC48YnIvPiBTY3JpcHRhY3Vsb3VzIGJ5IFRob21hcyBGdWNocy48YnIvPiBWaXNpdCBodHRwOi8vc2NyaXB0LmFjdWxvLnVzLycpOw0KCSRmaWxlc1tdID0gYXJyYXkoJ2ZpbGVuYW1lJz0+J2Jhc19sYjA1X2xpZ2h0Ym94LmpzJywnY2F0ZWdvcnknPT4nYmFzX2xpZ2h0Ym94JywnZGVzY3JpcHRpb24nID0+ICdUaGlzIGZpbGUgaXMgdXNlZCBieSBiYXMgTGlnaHRib3guPGJyLz4gTGlnaHRib3ggYnkgTG9rZXNoIERoYWthci4gPGJyLz4gVmlzaXQgaHR0cDovL3d3dy5odWRkbGV0b2dldGhlci5jb20vcHJvamVjdHMvbGlnaHRib3gyLycpOw0KCSRmaWxlc1tdID0gYXJyYXkoJ2ZpbGVuYW1lJz0+J2Jhc19sYjA1X2xpZ2h0Ym94LmNzcycsJ2NhdGVnb3J5Jz0+J2Jhc19saWdodGJveCcsJ2Rlc2NyaXB0aW9uJyA9PiAnVGhpcyBmaWxlIGlzIHVzZWQgYnkgYmFzIExpZ2h0Ym94Ljxici8+IExpZ2h0Ym94IGJ5IExva2VzaCBEaGFrYXIuPGJyLz4gVmlzaXQgaHR0cDovL3d3dy5odWRkbGV0b2dldGhlci5jb20vcHJvamVjdHMvbGlnaHRib3gyLycpOw0KDQoJZ2xvYmFsICRpbWFnZXM7DQoJJGltYWdlc1tdID0gYXJyYXkoJ25hbWUnPT4nYmFzX2xiMDVfYmxhbmsuZ2lmJywnZXh0Jz0+Jy5naWYnLCd3Jz0+JzEnLCdoJz0+JzEnLCdjYXRlZ29yeSc9PidiYXNfbGlnaHRib3gnLCdjYXB0aW9uJz0+J1RoaXMgaW1hZ2UgaXMgdXNlZCBieSBiYXMgTGlnaHRib3gnKTsNCgkkaW1hZ2VzW10gPSBhcnJheSgnbmFtZSc9PidiYXNfbGIwNV9jbG9zZS5naWYnLCdleHQnPT4nLmdpZicsJ3cnPT4nMjYnLCdoJz0+JzI2JywnY2F0ZWdvcnknPT4nYmFzX2xpZ2h0Ym94JywnY2FwdGlvbic9PidUaGlzIGltYWdlIGlzIHVzZWQgYnkgYmFzIExpZ2h0Ym94Jyk7DQoJJGltYWdlc1tdID0gYXJyYXkoJ25hbWUnPT4nYmFzX2xiMDVfY2xvc2VsYWJlbC5naWYnLCdleHQnPT4nLmdpZicsJ3cnPT4nNjYnLCdoJz0+JzIyJywnY2F0ZWdvcnknPT4nYmFzX2xpZ2h0Ym94JywnY2FwdGlvbic9PidUaGlzIGltYWdlIGlzIHVzZWQgYnkgYmFzIExpZ2h0Ym94Jyk7DQoJJGltYWdlc1tdID0gYXJyYXkoJ25hbWUnPT4nYmFzX2xiMDVfbG9hZGluZy5naWYnLCdleHQnPT4nLmdpZicsJ3cnPT4nMzInLCdoJz0+JzMyJywnY2F0ZWdvcnknPT4nYmFzX2xpZ2h0Ym94JywnY2FwdGlvbic9PidUaGlzIGltYWdlIGlzIHVzZWQgYnkgYmFzIExpZ2h0Ym94Jyk7DQoJJGltYWdlc1tdID0gYXJyYXkoJ25hbWUnPT4nYmFzX2xiMDVfbmV4dC5naWYnLCdleHQnPT4nLmdpZicsJ3cnPT4nNDUnLCdoJz0+JzQ1JywnY2F0ZWdvcnknPT4nYmFzX2xpZ2h0Ym94JywnY2FwdGlvbic9PidUaGlzIGltYWdlIGlzIHVzZWQgYnkgYmFzIExpZ2h0Ym94Jyk7DQoJJGltYWdlc1tdID0gYXJyYXkoJ25hbWUnPT4nYmFzX2xiMDVfbmV4dGxhYmVsLmdpZicsJ2V4dCc9PicuZ2lmJywndyc9Pic2MycsJ2gnPT4nMzInLCdjYXRlZ29yeSc9PidiYXNfbGlnaHRib3gnLCdjYXB0aW9uJz0+J1RoaXMgaW1hZ2UgaXMgdXNlZCBieSBiYXMgTGlnaHRib3gnKTsNCgkkaW1hZ2VzW10gPSBhcnJheSgnbmFtZSc9PidiYXNfbGIwNV9wcmV2LmdpZicsJ2V4dCc9PicuZ2lmJywndyc9Pic0NScsJ2gnPT4nNDUnLCdjYXRlZ29yeSc9PidiYXNfbGlnaHRib3gnLCdjYXB0aW9uJz0+J1RoaXMgaW1hZ2UgaXMgdXNlZCBieSBiYXMgTGlnaHRib3gnKTsNCgkkaW1hZ2VzW10gPSBhcnJheSgnbmFtZSc9PidiYXNfbGIwNV9wcmV2bGFiZWwuZ2lmJywnZXh0Jz0+Jy5naWYnLCd3Jz0+JzYzJywnaCc9PiczMicsJ2NhdGVnb3J5Jz0+J2Jhc19saWdodGJveCcsJ2NhcHRpb24nPT4nVGhpcyBpbWFnZSBpcyB1c2VkIGJ5IGJhcyBMaWdodGJveCcpOw0KDQoNCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCglmdW5jdGlvbiBiYXNfbGlnaHRib3hfaW1wb3J0X2ZpbGUoJGZpbGUsJHR5cGUpDQoJew0KCQlnbG9iYWwgJGZpbGVVUkw7DQoJCWV4dHJhY3QoJGZpbGUpOw0KCQlmb3JlYWNoKCRmaWxlIGFzICRrZXkgPT4gJHZhbHVlKQ0KCQl7DQoJCQkkYnVpbGRfcXVlcnkgW10gPSAiJGtleSA9ICckdmFsdWUnIjsNCgkJfQ0KCQkkYnVpbGRfcXVlcnkgPSBqb2luKCcsJywkYnVpbGRfcXVlcnkpOw0KDQoJCWlmKCR0eXBlID09ICdmaWxlJykNCgkJew0KCQkJaWYoIWZpbGVfZXhpc3RzKCIuLi9maWxlcy8kZmlsZW5hbWUiKSkNCgkJCXsNCgkJCQlpZihAY29weSgiJGZpbGVVUkwvJGZpbGVuYW1lIiwgIi4uL2ZpbGVzLyRmaWxlbmFtZSIpKQ0KCQkJCXsNCgkJCQkJJHF1ZXJ5ID0gc2FmZV9pbnNlcnQoInR4cF8kdHlwZSIsJGJ1aWxkX3F1ZXJ5KTsNCgkJCQkJcmV0dXJuIHRhZygkZmlsZW5hbWUsJ2InKS5nVHh0KCdiYXNfbGJfaW5fZmlsZV9pbXBvcnRlZCcpOw0KCQkJCX0NCgkJCQllbHNlDQoJCQkJCXJldHVybiB0YWcoJGZpbGVuYW1lLCdiJykuZ1R4dCgnYmFzX2xiX2luX2ZpbGVfaW1wb3J0X2Vycm9yJyk7Ow0KCQkJfQ0KCQkJZWxzZXsNCgkJCQlyZXR1cm4gdGFnKCRmaWxlbmFtZSwnYicpLmdUeHQoJ2Jhc19sYl9pbl9maWxlX2FscmVheWRfZXhpc3QnKTsNCgkJCX0NCg0KCQl9DQoJCWlmKCR0eXBlID09ICdpbWFnZScpew0KCQkJaWYoIWZldGNoKCdpZCcsJ3R4cF9pbWFnZScsJ25hbWUnLCRuYW1lKSl7DQoJCQkJaWYoQGNvcHkoIiRmaWxlVVJMLyRuYW1lIiwgIi4uL2ltYWdlcy8kbmFtZSIpKQ0KCQkJCXsNCgkJCQkJJHF1ZXJ5ID0gc2FmZV9pbnNlcnQoInR4cF8kdHlwZSIsJGJ1aWxkX3F1ZXJ5KTsNCgkJCQkJJGlkID0gbXlzcWxfaW5zZXJ0X2lkKCk7DQoJCQkJCXJlbmFtZSgiLi4vaW1hZ2VzLyRuYW1lIiwgIi4uL2ltYWdlcy8kaWQkZXh0Iik7DQoJCQkJCXJldHVybiB0YWcoJG5hbWUsJ2InKS5nVHh0KCdiYXNfbGJfaW5fZmlsZV9pbXBvcnRlZCcpOw0KCQkJCX0NCgkJCQllbHNlDQoJCQkJCXJldHVybiB0YWcoJG5hbWUsJ2InKS5nVHh0KCdiYXNfbGJfaW5fZmlsZV9pbXBvcnRfZXJyb3InKTs7DQoJCQl9DQoJCQllbHNlDQoJCQkJcmV0dXJuIHRhZygkbmFtZSwnYicpLmdUeHQoJ2Jhc19sYl9pbl9maWxlX2FscmVheWRfZXhpc3QnKTsNCgkJfQ0KCX0NCg0KLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KCWZ1bmN0aW9uIGJhc19saWdodGJveF9sYW5nX2VuX2diKCRhY3Rpb24gPSAndGV4dGFycmF5JykNCgl7DQoJCSRiYXNMYW5nWyd0ZXh0YXJyYXknXVsnYmFzX2xiX2FkbWluJ10gPSAnTGlnaHRib3ggcHJlZmVyZW5jZXMnOw0KCQkkYmFzTGFuZ1sndGV4dGFycmF5J11bJ2Jhc19sYl9hZG1pbl9zYXZlJ10gPSAnU2F2ZSBwcmVmZXJlbmNlcyc7DQoJCSRiYXNMYW5nWyd0ZXh0YXJyYXknXVsnYmFzX2xiX2luc3RhbGwnXSA9ICdJbnN0YWxsJzsNCgkJJGJhc0xhbmdbJ3RleHRhcnJheSddWydiYXNfbGJfaW5fc3RlcDEnXSA9ICdTdGFydCc7DQoJCSRiYXNMYW5nWyd0ZXh0YXJyYXknXVsnYmFzX2xiX2luX3N0ZXAxX3RleHQnXSA9ICcNCgkJCQkJCQk8aDI+QWR2YW5jZWQgSW5zdGFsbCBvZiBiYXMgTGlnaHRib3g8L2gyPg0KCQkJCQkJCTxwPlRoaXMgc2NyaXB0IGxlYWRzIHlvdSB0aG91Z2ggdGhlIGFkdmFjZWQgaW5zdGFsbCBvZiBiYXMgTGlnaHRib3guPC9wPg0KCQkJCQkJCTxwPkZvbGxvd2luZyBhY3Rpb25zIHdpbGwgYmUgZG9uZTo8L3A+DQoJCQkJCQkJPHVsPg0KCQkJCQkJCQk8bGk+SW1wb3J0IGltYWdlcyBhbmQgZmlsZXMuPC9saT4NCgkJCQkJCQkJPGxpPkNvbmZpZ3VyZSB0aGUgLmNzcyBhbmQgLmpzIGZpbGVzLjwvbGk+DQoJCQkJCQkJCTxsaT5BZGQgcGx1Z2luXCdzIHByZWZlcmVuY2VzIHRvIHR4cC48L2xpPg0KCQkJCQkJCQk8bGk+Q29uZmlndXJlIHBsdWdpbjwvbGk+DQoJCQkJCQkJPC91bD4NCgkJCQkJCQk8cD5NYWtlIHN1cmUgdGhhdCBhIGludGVybmV0IGNvbm5lY3Rpb24gaXMgb3BlbiB0byBpbXBvcnRpbmcgZmlsZXMgYW5kIGltYWdlcy48L3A+DQoJCQkJCQkJPHA+T2YgY291cnNlIHRoZXJlIGlzIGEgdW5pbnN0YWxsIHNjcmlwdCwgaWYgeW91IHdhbnQgdG8gcmVtb3ZlIHRoZSBwbHVnaW4gbGF0ZXIuPC9wPg0KCQkJCQkJCSc7DQoNCgkJJGJhc0xhbmdbJ3RleHRhcnJheSddWydiYXNfbGJfaW5fc3RhcnQnXSA9ICdTdGFydCBhZHZhbmRlZCBpbnN0YWxsJzsNCgkJJGJhc0xhbmdbJ3RleHRhcnJheSddWydiYXNfbGJfaW5fbmV4dCddID0gJ05leHQgU3RlcCc7DQoJCSRiYXNMYW5nWyd0ZXh0YXJyYXknXVsnYmFzX2xiX2luX3N0ZXAyJ10gPSAnSW1wb3J0aW5nIEZpbGVzJzsNCgkJJGJhc0xhbmdbJ3RleHRhcnJheSddWydiYXNfbGJfaW5fc3RlcDJfc3RhcnQnXSA9ICcNCgkJCQkJCQk8aDE+SW1wb3J0aW5nIGltYWdlcyBhbmQgZmlsZXM8L2gxPg0KCQkJCQkJCTxwPllvdSBjYW4gaW1wb3J0IGFsbCBuZWVkZWQgZmlsZXMgYW5kIGltYWdlcyBhdXRvbWF0aWNseSBieSBjbGlja2luZyAiSW1wb3J0Ii48L3A+DQoJCQkJCQkJPHA+VGhlIGZpbGVzIHdpbGwgYmUgY29waWVkIGZyb20gc2FtaXNkYXQub3JnIHRvIHlvdXIgdHhwLXN5c3RlbS48L3A+DQoJCQkJCQkJPHA+TWFrZSBzdXJlIHRoYXQgeW91IGFyZSBjb25uZWN0ZWQgdG8gdGhlIGludGVybmV0LjwvcD4NCgkJCQkJCQknOw0KCQkkYmFzTGFuZ1sndGV4dGFycmF5J11bJ2Jhc19sYl9pbl9zdGVwMl9za2lwJ10gPSAnDQoJCQkJCQkJPGgxPlNraXAgaW1wb3J0aW5nPC9oMT4NCgkJCQkJCQk8cD5JZiB0aGlzIGltcG9ydCBmdW5jdGlvbiBmYWlscyBvciB5b3Ugd2FudCB0byB1cGxvYWQgdG8gZmlsZXMgbWFudWFsLCBkb3dubG9hZDwvcD4NCgkJCQkJCQk8cD48YSBocmVmPSJodHRwOi8vc2FtaXNkYXQub3JnL3B1YmxpYy1maWxlcy9saWdodGJveDA1L2Jhc19saWdodGJveC56aXAiPmJhc19saWdodGJveC56aXA8L2E+PC9wPg0KCQkJCQkJCTxwPlVwbG9hZCBhbGwgaW1hZ2VzIHdpdGggdHhwLWltYWdlIG1hbmFnbWVudCBhbmQgYWxsIC5qcyBhbmQgLmNzcyBmaWxlIGJ5IHR4cCBmaWxlIG1hbmFnbWVudC48L3A+DQoJCQkJCQkJJzsNCgkJJGJhc0xhbmdbJ3RleHRhcnJheSddWydiYXNfbGJfaW5fc3RhcnRfaW1wb3J0J10gPSAnU3RhcnQgaW1wb3J0JzsNCgkJJGJhc0xhbmdbJ3RleHRhcnJheSddWydiYXNfbGJfaW5fc2tpcCddID0gJ1NraXAgSW1wb3J0JzsNCgkJJGJhc0xhbmdbJ3RleHRhcnJheSddWydiYXNfbGJfaW5fZmlsZV9pbXBvcnRlZCddID0gJyBoYXMgYmVlbiBpbXBvcnRlZC4nOw0KCQkkYmFzTGFuZ1sndGV4dGFycmF5J11bJ2Jhc19sYl9pbl9maWxlX2ltcG9ydF9lcnJvciddICA9ICcgaW1wb3J0IGZhaWxkLic7DQoJCSRiYXNMYW5nWyd0ZXh0YXJyYXknXVsnYmFzX2xiX2luX2ZpbGVfYWxyZWF5ZF9leGlzdCddID0gJyBhbHJlYWR5IGV4aXN0cy4nOw0KCQkkYmFzTGFuZ1sndGV4dGFycmF5J11bJ2Jhc19sYl9pbl9zdGVwMyddID0gJ0NvbmZpZ3VyZSc7DQoJCSRiYXNMYW5nWyd0ZXh0YXJyYXknXVsnYmFzX2xiX2luX3N0ZXAzX3RleHQnXSA9ICcNCgkJCQkJCQk8aDE+Q29uZmlndXJlIHBsdWdpbnMgcHJlZmVyZW5jZXM8L2gxPg0KCQkJCQkJCTxwPkluIHRoaXMgc3RlcCBhbGwgZmlsZSBhbmQgaW1hZ2VzIGlkXCdzIHdpbGwgYmUgc2F2ZWQgdG8gZGIuPC9wPg0KCQkJCQkJCTxwPklmIHlvdSBza2lwZWQgdGhlIGF1dG9tYXRpYyBpbXBvcnQsIG1ha2Ugc3VyZSwgdGhhdCB5b3UgdXBsb2FkZWQgYWxsIGZpbGVzIGFuZCBpbWFnZXMuPC9wPg0KCQkJCQkJCTxwPlRoZSBqYXZhc2NyaXB0IGFuZCBDU1MgZmlsZXMgd2lsbCBiZSB1cGRhdGVkIHRvIGZpdCB0byB5b3VyIHR4cC48L3A+DQoJCQkJCQkJJzsNCgkJJGJhc0xhbmdbJ3RleHRhcnJheSddWydiYXNfbGJfaW5fZG9uZSddID0gJw0KCQkJCQkJCTxoMT5JbnN0YWxsYXRpb24gY29tcGxldGVkPC9oMT4NCgkJCQkJCQk8cD5Zb3UgY2FuIHVzZSBiYXNfbGlnaHRib3ggbm93OjwvcD4NCgkJCQkJCQk8cD5JbmNsdWRlIDxjb2RlPiZsdDt0eHA6YmFzX2xpZ2h0Ym94X2hlYWQgLz48L2NvZGU+IGludG8geW91ciBoZWFkLjwvcD4NCgkJCQkJCQk8cD5JIHdvdWxkIHJlY29tbW9uIHRoYXQgeW91IG9ubHkgaW5jbHVkZSBpdCB0byBzZWN0aW9ucyB3aGVyZSB5b3UgdXNlIExpZ2h0Ym94LCBiZWNhdXNlIHRoZSBzY3JpcHRzIG5vdCBzbWFsbC48L3A+DQoJCQkJCQkJPHA+VXNlIDxjb2RlPiZsdDt0eHA6YmFzX2xpZ2h0Ym94IC8+PC9jb2RlPiBpbiB5b3VyIGFydGljbGUgb3IgYXJ0aWNsZSBmb3Jtcy48L3A+DQoJCQkJCQkJPHA+VXNlIDxjb2RlPiZsdDt0eHA6YmFzX2xpZ2h0Ym94IHVzZV9zZWN0aW9uPSJ0cnVlIi8+PC9jb2RlPiBvciA8Y29kZT4mbHQ7dHhwOmJhc19saWdodGJveCB1c2VfY2F0PSJ0cnVlIi8+PC9jb2RlPiBwYWdlcyBvciBmb3Jtcy48L3A+DQoJCQkJCQkJPHA+T24gdGhlIG5leHQgc2NyZWVuIHlvdSBjYW4gY29uZmlnIHRoZSBwbHVnaW4gdG8gbWFrZSBpdCBmaXR0aW5nIHRwIHlvdXIgcHJvcG9zYWxzLjwvcD4NCgkJCQkJCQk8cD5Gb3IgbW9yZSBpbmZvcm1hdGlvbnMgcmVhZCB0aGUgPGEgaHJlZj0iP2V2ZW50PXBsdWdpbiZzdGVwPXBsdWdpbl9oZWxwJm5hbWU9YmFzX2xpZ2h0Ym94Ij5wbHVnaW5cJ3MgaGVscDwvYT4gb3IgdmlzaXQgPGEgaHJlZj0iaHR0cDovL2xhYi5zYW1pc2RhdC5vcmcvYmFzLWxpZ2h0Ym94Ij5zYW1pc2RhdC5vcmc8L2E+LjwvcD4NCgkJCQkJCQknOw0KCQkkYmFzTGFuZ1sndGV4dGFycmF5J11bJ2Jhc19sYl91bmluc3RhbGwnXSA9ICdVbmluc3RhbGwnOw0KCQkkYmFzTGFuZ1sndGV4dGFycmF5J11bJ2Jhc19sYl91bl9zdGVwMSddID0gJ1N0YXJ0JzsNCgkJJGJhc0xhbmdbJ3RleHRhcnJheSddWydiYXNfbGJfdW5fc3RlcDInXSA9ICdSZW1vdmluZyBhbGwgZmlsZXMgYW5kIHByZWZzJzsNCgkJJGJhc0xhbmdbJ3RleHRhcnJheSddWydiYXNfbGJfdW5fc3RlcDFfdGV4dCddID0gJw0KCQkJCQkJCTxoMT5Vbmluc3RhbGwgYmFzIExpZ2h0Ym94PC9oMT4NCgkJCQkJCQk8cD5UaGlzIHNjcmlwdCB3aWxsIHJlbW92ZSBiYXMgTGlnaHRib3ggYW5kIHlvdSBjYW4gZGVsZXRlIGl0IGF0IHBsdWdpbnMgdGFiLjwvcD4NCgkJCQkJCQk8cD5Gb2xsb3dpbmcgYWN0aW9ucyB3aWxsIGJlIGRvbmU6PC9wPg0KCQkJCQkJCTx1bD4NCgkJCQkJCQkJPGxpPkRlbGV0ZSBhbGwgaW1hZ2VzIGFuZCBmaWxlcyB3amljaCB3aGVyZSBpbXBvcnRlZCBkdXJpbmcgdGhlIGFkdmFuY2VkIGluc3RhbGwuPC9saT4NCgkJCQkJCQkJPGxpPlJlbW92aW5nIGFsbCBwbHVnaW4gcHJlZnMgZnJvbSB0eHAuPC9saT4NCgkJCQkJCQk8L3VsPg0KCQkJCQkJCTxwPlRoaW5rIHR3aWNlLCBiZWZvcmUgeW91IHN0YXJ0IG9yIGFib3J0LjwvcD4NCgkJCQkJCQknOw0KCQkkYmFzTGFuZ1sndGV4dGFycmF5J11bJ2Jhc19sYl91bmluc3RhbGxfc3RhcnQnXSA9ICdTdGFydCB1bmluc3RhbGwnOw0KCQkkYmFzTGFuZ1sndGV4dGFycmF5J11bJ2Jhc19sYl91bmluc3RhbGxfYWJvcnQnXSA9ICdBYm9ydCB1bmluc3RhbGwnOw0KCQkkYmFzTGFuZ1sndGV4dGFycmF5J11bJ2Jhc19sYl91bl9zdGVwMiddID0gJ1N0ZXAgMic7DQoJCSRiYXNMYW5nWyd0ZXh0YXJyYXknXVsnYmFzX2xiX3ByZWZzX2RlbGV0ZWQnXSA9ICdBbGwgcGx1Z2luIHByZWZlcmVuY2VzIGhhdmUgYmVlbiByZW1vdmVkIGZyb20gZGInOw0KCQkkYmFzTGFuZ1sndGV4dGFycmF5J11bJ2Jhc19sYl9jYXRfZGVsZXRlZCddID0gJ1RoZSBmaWxlIGNhdCBiYXNfbGlnaHRib3ggaGFzIGJlZW4gZGVsZXRlZCc7DQoJCSRiYXNMYW5nWyd0ZXh0YXJyYXknXVsnYmFzX2xiX3JlbW92ZSddID0gJ1lvdSBjYW4gbm93IGRlbGV0ZSB0aGUgcGx1Z2luIGF0IDxhIGhyZWY9Ij9ldmVudD1wbHVnaW4iPnBsdWdpbnMgdGFiPC9hPi4nOw0KDQoJCSRiYXNMYW5nWydkYiddWydkZXNjcmlwdGlvbiddID0gJ1RoaXMgcGx1Z2luIGJyaW5ncyB0aGUgPGEgaHJlZj0iaHR0cDovL3d3dy5odWRkbGV0b2dldGhlci5jb20vcHJvamVjdHMvbGlnaHRib3gyLyI+TGlnaHRib3ggSlMgdjIuMDwvYT4gYnkgPGEgaHJlZj0iaHR0cDovL3d3dy5odWRkbGV0b2dldGhlci5jb20vIj5Mb2tlc2ggRGhha2FyIjwvYT4gdG8gdGV4dHBhdHRlcm4uIExpZ2h0Ym94IEpTIGlzIGEgc2ltcGxlLCB1bm9idHJ1c2l2ZSBzY3JpcHQgdXNlZCB0byB0byBvdmVybGF5IGltYWdlcyBvbiB0aGUgY3VycmVudCBwYWdlLic7DQoJCSRiYXNMYW5nWydkYiddWydoZWxwJ10gPSAnPCEtLSBMYW5nOmVuX2diIC0tPg0KCQkJCQkJPGgxPjxzdHJvbmc+YmFzIExpZ2h0Ym94PC9zdHJvbmc+PC9oMT4NCgkJCQkJCTxwPmJ5IDxhIGhyZWY9Imh0dHA6Ly9zYW1pc2RhdC5vcmciPkJhc3RpYW4gU2Fja2VybWFubjwvYT48L3A+DQoJCQkJCQk8cD5UaGlzIHBsdWdpbiBicmluZ3MgdGhlIDxhIGhyZWY9Imh0dHA6Ly93d3cuaHVkZGxldG9nZXRoZXIuY29tL3Byb2plY3RzL2xpZ2h0Ym94Mi8iPkxpZ2h0Ym94IEpTPC9hPiBieSA8YSBocmVmPSJodHRwOi8vd3d3Lmh1ZGRsZXRvZ2V0aGVyLmNvbS8iPkxva2VzaCBEaGFrYXI8L2E+IHRvIHRleHRwYXR0ZXJuLjxiciAvPg0KCQkJCQkJTGlnaHRib3ggSlMgaXMgYSBzaW1wbGUsIHVub2J0cnVzaXZlIHNjcmlwdCB1c2VkIHRvIHRvIG92ZXJsYXkgaW1hZ2VzIG9uIHRoZSBjdXJyZW50IHBhZ2UuPC9wPg0KCQkJCQkJPHA+TGlnaHRib3ggdXNlcyA8YSBocmVmPSJodHRwOi8vcHJvdG90eXBlLmNvbmlvLm5ldC8iPlByb3RvdHlwZTwvYT4gYnkgPGEgaHJlZj0iaHR0cDovL2NvbmlvLm5ldC8iPlNhbSBTdGVwaGVuc29uPC9hPiBhbmQgPGEgaHJlZj0iaHR0cDovL3NjcmlwdC5hY3Vsby51cy8iPlNjcmlwdGFjdWxvdXM8L2E+IGJ5IDxhIGhyZWY9Imh0dHA6Ly9taXIuYWN1bG8udXMvIj5UaG9tYXMgRnVjaHM8L2E+LjwvcD4NCg0KCQkJCQkJDQoJCQkJCQk8aDI+SW5zdGFsbGF0aW9uPC9oMj4NCgkJCQkJCTxwPkJlZm9yZSB5b3UgY2FuIHVzZSB0aGlzIHBsdWdpbiwgeW91IGhhdmUgdG8gcnVuIHRoZSBhZHZhbmNlZCBpbnN0YWxsIGF0IDxlbT5leHRlbnNpb248L2VtPiAtPiA8c3Ryb25nPjxlbT5iYXMgTGlnaHRib3g8L3N0cm9uZz48L2VtPi48YnIgLz4NCgkJCQkJCVRoZSBzY3JpcHQgaW1wb3J0cyBhbGwgZmlsZXMgYW5kIGltYWdlcyB5b3UgbmVlZCBmb3IgbGlnaHRib3hpbmcgZnJvbSA8YSBocmVmPSJodHRwOi8vc2FtaXNkYXQub3JnIj5zYW1pc2RhdC5vcmcuPC9hPjwvcD4NCgkJCQkJCTxwPllvdSBjYW4gc2tpcCB0aGUgYXV0b21hdGljIGltcG9ydCBhbmQgZG93bmxvYWQgdGhlIGZpbGVzIGFzIDxhIGhyZWY9Imh0dHA6Ly9zYW1pc2RhdC5vcmcvcHVibGljLWZpbGVzL2xpZ2h0Ym94MDUvYmFzX2xpZ2h0Ym94LnppcCI+YmFzX2xpZ2h0Ym94LnppcDwvYT4gYW5kIHVwbG9hZCB0aGUgbWFudWFsLjxiciAvPg0KCQkJCQkJVXNlIHRoZSB0eHAgaW1hZ2UtbWFuYWdtZW50IGZvciBpbWFnZXMgYW5kIGZpbGUtbWFuYWdtZW50IGZvciBmaWxlcy4gRG9uYHQgcmVuYW1lIHRoZSBmaWxlcy48L3A+DQoJCQkJCQk8cD5JZiB5b3Ugd2FudCB0byB1c2UgYSBjdXN0b20tZmllbGQgdG8gcmVmZXIgdGhlIGltYWdlIGNhdGVnb3J5LCBqdXN0IHJlbmFtZSBhbiBjdXN0b20tZmllbGQgdG8gPHN0cm9uZz5MaWdodGJveDwvc3Ryb25nPi48YnIgLz4NCgkJCQkJCVlvdSBjYW4gcmVuYW1lIGN1c3RvbS1maWVsZCBhdCBhZG1pbiAtPiBhZHZhbmNlZCBwcmVmZXJlbmNlczwvcD4NCg0KCQkJCQkJPGgyPkxvY2FsaXNhdGlvbjwvaDI+DQoJCQkJCQk8cD5UaGUgZGVmYXVsdCBsYW5ndWFnZSBvZiA8c3Ryb25nPmJhcyBMaWdoYm94PC9zdHJvbmc+IGlzIEVuZ2xpc2gsIGJ1dCB0aGVyZSBhcmUgc29tZSB0cmFuc2xhdGlvbnMuPGJyIC8+DQoJCQkJCQlGb3IgZXZlcnkgc3VwcG9ydGVkIGxhbmd1YWdlIHRoZXJlIGlzIGFuIGFkZGl0aW9uYWwgcGx1Z2luOjwvcD4NCgkJCQkJCTx1bD4NCgkJCQkJCQk8bGk+PGEgaHJlZj0iaHR0cDovL3NhbWlzZGF0Lm9yZy9maWxlcy9iYXNfbGlnaHRib3hfbGFuZ19ubF9ubC50eHQiPkR1dGNoOiBiYXNfbGlnaHRib3hfbGFuZ19ubF9ubDwvYT4gdHJhbnNsYXRlZCBieSA8YSBocmVmPSJodHRwOi8vc2VyZXBvLmNvbSI+U2ViYXN0aWFhbiBQb3V5ZXQ8L2E+PC9saT4NCgkJCQkJCQk8bGk+PGEgaHJlZj0iaHR0cDovL3NhbWlzZGF0Lm9yZy9maWxlcy9iYXNfbGlnaHRib3hfbGFuZ19kZV9kZS50eHQiPkdlcm1hbjogYmFzX2xpZ2h0Ym94X2xhbmdfZGVfZGU8L2E+IHRyYW5zbGF0ZWQgYnkgPGEgaHJlZj0iaHR0cDovL3NhbWlzZGF0Lm9yZyI+QmFzdGlhbiBTYWNrZXJtYW48L2E+PC9saT4NCgkJCQkJCQk8bGk+PGEgaHJlZj0iaHR0cDovL3NhbWlzZGF0Lm9yZy9maWxlcy9iYXNfbGlnaHRib3hfbGFuZ19wdF9wdC50eHQiPlBvcnR1Z3Vlc2U6IGJhc19saWdodGJveF9sYW5nX3B0X3B0PC9hPiB0cmFuc2xhdGVkIGJ5IDxhIGhyZWY9Imh0dHA6Ly93d3cucGFwZWxkaWdpdGFsLnB0Ij5SdWkgUGludG88L2E+PC9saT4NCgkJCQkJCTwvdWw+DQoJCQkJCQk8cD5Eb3dubG9hZCB0aGUgbGFuZ3VhZ2UgcGx1Z2luLCBpbnN0YWxsIGFuZCBhY3RpdmF0ZSBpdC48YnIgLz4NCgkJCQkJCTxzdHJvbmc+YmFzIExpZ2h0Ym94PC9zdHJvbmc+IHdpbGwgdXNlIHRoaXMgbGFuZ3VhZ2UgcGx1Z2luLCBpZiB5b3UgYWN0aXZlIHRoaXMgbGFuZ3VhZ2UgYXQgPGVtPmFkbWluPC9lbT4gLT4gPGVtPm1hbmFnZSBsYW5ndWFnZTwvZW0+LjwvcD4NCg0KCQkJCQkJPGgyPlBsdWdpbiBQZXJmZXJlbmNlczwvaDI+DQoJCQkJCQk8cD5BZnRlciB5b3UgcnVuIHRoZSBhZHZhbmNlZCBpbnN0YWxsLCB5b3UgY2FuIHNhdmUgc29tZSBwbHVnaW4gcHJlZmVyZW5jZXMuPGJyIC8+DQoJCQkJCQlUaGUgc2F2ZWQgcHJlZnMgYXJlIHVzZWQgYXMgZGVmYXVsdCB2YWx1ZXMgYW5kIGNhbiBiZSBvdmVyd3JpdHRlbiBieSBpbmNsdWRpbmcgdGhlIGF0dHJpYnV0ZSBpbnRhZyBwbHVnaW4mIzgyMTc7cyB0YWcuPC9wPg0KDQoJCQkJCQk8aDI+VXNhZ2U8L2gyPg0KCQkJCQkJPHA+UGxlYXNlIDxjb2RlPiZsdDt0eHA6YmFzX2xpZ2h0Ym94X2hlYWQgLyZndDs8L2NvZGU+IGludG8geW91ciBzaXRlcyBoZWFkLCB0aGlzIHRhZyB3aWxsIGFkZCBhbGwgc2NyaXB0IGFuZCBjc3MgdG8geW91ciBzaXRlLjxiciAvPg0KCQkJCQkJVGhlIGxpZ2h0Ym94IHNjcmlwdHMgYXJlIDEyNCBrQiBiaWcsIHNvIGluY2x1ZGUgaXQgb25seSB0byBzZWN0aW9ucyB3aGVyZSB5b3Ugd2FudCB0byB1c2UgaXQuPC9wPg0KDQoJCQkJCQk8aDI+VXNhZ2UgaW4gYXJ0aWNsZSYjODIxNztzIGJvZHkgb3IgZXhjZXJwdCBvciBpbiBhcnRpY2xlLWZvcm08L2gyPg0KCQkJCQkJPHA+SW5jbHVkZSA8Y29kZT4mbHQ7dHhwOmJhc19saWdodGJveCAvJmd0OzwvY29kZT4gdG8gYW4gYXJ0aWNsZSwgeW91IGNhbiBpbmNsdWRlIGl0IHRvIGJvZHkgYW5kL29yIGV4Y2VycHQuPC9wPg0KCQkJCQkJPHA+WW91IGNhbiByZWZlciB0aGUgaW1hZ2VzIHdpdGhpbiB0aGUgdGFnIGJ5IGF0cnJpYnV0ZXMgPHN0cm9uZz5pbWc8L3N0cm9uZz4gb3IgPHN0cm9uZz5jYXQ8L3N0cm9uZz48L3A+DQoJCQkJCQk8dWw+DQoJCQkJCQkJPGxpPjxjb2RlPiZsdDt0eHA6YmFzX2xpZ2h0Ym94IGltZz0iMiwzLDciLyZndDs8L2NvZGU+PC9saT4NCgkJCQkJCQk8bGk+PGNvZGU+Jmx0O3R4cDpiYXNfbGlnaHRib3ggY2F0PSJhLWNhdCIvJmd0OzwvY29kZT48L2xpPg0KCQkJCQkJPC91bD4NCgkJCQkJCTxwPk9yIHlvdSBpbmNsdWRlIGp1c3QgaW5jbHVkZSA8Y29kZT4mbHQ7dHhwOmJhc19saWdodGJveCAvJmd0OzwvY29kZT4gaW50byBhcnRpY2xlIGFuZCByZWZlciBpbWFnZXM6PC9wPg0KCQkJCQkJPHVsPg0KCQkJCQkJCTxsaT5Db21tYSBzZXBlcmF0ZWQgaW4gYXJ0aWNsZSYjODIxNztzIGltYWdlIGZpZWxkPC9saT4NCgkJCQkJCQk8bGk+UmVuYW1lIGEgY3VzdG9tLWZpZWxkIHRvIDxzdHJvbmc+TGlnaHRib3g8L3N0cm9uZz4uIFRoaXMgY3VzdG9tLWZpZWxkIHdpbGwgYmUgcmVwbGFjZWQgYnkgYSBkcm9wLWRvd24gbGlzdCBvZiBhbGwgaW1hZ2UgY2F0ZWdvcmllcy4gU2VsZWN0IGEgY2F0IGZyb20gdGhpcyBsaXN0LjwvbGk+DQoJCQkJCQk8L3VsPg0KCQkJCQkJPGgyPlVzYWdlIGluIHBhZ2Ugb3IgZm9ybXM8L2gyPg0KCQkJCQkJPHA+WW91IGNhbiBpbmNsdWRlIDxjb2RlPiZsdDt0eHA6YmFzX2xpZ2h0Ym94IC8mZ3Q7PC9jb2RlPiBpbnRvIHBhZ2UsIHRvby48YnIgLz4NCgkJCQkJCUZvciBleGFtcGxlIHBsYWNlIGl0IGludG8geW91ciBzaXJlYmFyIGFuZCBzaG93IHlvdXIgdGh1bWJzIHRoZXJlLjwvcD4NCgkJCQkJCTxwPkluIHBhZ2UgdGhlcmUgaXMgb25seSBhIGluZGlyZWN0IHdheSB0byByZWZlciB0aGUgaW1hZ2VzOjwvcD4NCgkJCQkJCTx1bD4NCgkJCQkJCQk8bGk+PGNvZGU+Jmx0O3R4cDpiYXNfbGlnaHRib3ggdXNlX3NlY3Rpb249InRydWUiLyZndDs8L2NvZGU+IFRoaXMgd2lsbCBzaG93IGFsbCB0aHVtYnMgZnJvbSB0aGUgY2F0ZWdvcnkgd2l0aCB0aGUgdmVyeSBzYW1lIG5hbWUgYXMgdGhlIGFjdHVhbCBzZWN0aW9uLiBGb3IgZXhhbXBsZSwgaWYgeW91IHdhbnQgdG8gc2hvdyBzb21lIGltYWdlcyBhdCBzZWN0aW9uICYjODIyMDthYm91dCYjODIyMTssIGFkZCBhbGwgdGhlc2UgaW1hZ2VzIHRvIGltZy1jYXQgJiM4MjIwO2Fib3V0JiM4MjIxOy4gUmVtZW1iZXIgdGhhdCBzZWN0aW9uJiM4MjE3O3MgbmFtZSBhbmQgc2VjdGlvbiYjODIxNztzIGl0bGUgbXVzdCBiZSB0aGUgc2FtZS48L2xpPg0KCQkJCQkJCTxsaT48Y29kZT4mbHQ7dHhwOmJhc19saWdodGJveCB1c2VfY2F0PSJ0cnVlIi8mZ3Q7PC9jb2RlPiBUaGlzIHdpbGwgc2hvdyBhbGwgdGh1bWJzIGZyb20gdGhlIGNhdGVnb3J5IHdpdGggdGhlIHZlcnkgc2FtZSBuYW1lIGFzIHRoZSBhY3R1YWwgY2F0ZWdvcnkuPC9saT4NCgkJCQkJCTwvdWw+DQoNCgkJCQkJCTxoMj5QbHVnaW5zIEF0dHJpYnV0ZXM8L2gyPg0KCQkJCQkJPHA+WW91IGNhbiBjdXN0b21pc2UgdGhlIHBsdWdpbiBieSBpbmNsdWRpbmcgYXR0cmlidXRlcyB0byB0YWcsIHlvdSBjYW4gZWRpdCB0aGUgZGVmYXVsdCB2YWx1ZXMgYXQgPGVtPmV4dGVuc2lvbjwvZW0+IC0+IDxlbT5iYXMgTGlnaHRib3g8L2VtPjwvcD4NCgkJCQkJCTx1bD4NCgkJCQkJCQk8bGk+PGNvZGU+Jmx0O3R4cDpiYXNfbGlnaHRib3ggY2FwdGlvbj0ibmFtZXxhbHR8Y2FwdGlvbiIgLyZndDs8L2NvZGU+IFVzZSBjYXB0aW9uIHRvIGRlZmluZSB3aGF0IHRleHQgaXMgZGlzcGxheWVkIGluIHRoZSBMaWdodGJveC4gQ2hvb3NlIGZyb20gPHN0cm9uZz5uYW1lPC9zdHJvbmc+LCA8c3Ryb25nPmFsdDwvc3Ryb25nPiBvciA8c3Ryb25nPmNhcHRpb248L3N0cm9uZz48L2xpPg0KCQkJCQkJCTxsaT48Y29kZT4mbHQ7dHhwOmJhc19saWdodGJveCBsYWJlbD0iTXkgcGljcyIgbGFiZWx0YWc9ImgyIiAvJmd0OzwvY29kZT4gRGVmaW5lIGEgbGFiZWw8L2xpPg0KCQkJCQkJCTxsaT48Y29kZT4mbHQ7dHhwOmJhc19saWdodGJveCB3cmFwdGFnPSJ1bCIgYnJlYWs9ImxpIiAvJmd0OzwvY29kZT48L2xpPg0KCQkJCQkJCTxsaT48Y29kZT4mbHQ7dHhwOmJhc19saWdodGJveCB3cmFwdGFnPSJ1bCIgd3JhcGNsYXNzPSJ0aHVtYmxpc3QiIGJyZWFrPSJsaSIgYnJlYWtjbGFzcz0iaW1nIiAvJmd0OzwvY29kZT4gQXNpZ24gY2xhc3NlcyB0byB3cmFwdGFnIGFuZCBicmVhayB0byBzdHlsZSB0aGVtIGJ5IENTUy48L2xpPg0KCQkJCQkJPC91bD4NCgkJCQkJCSc7DQoNCgkJaWYoJGFjdGlvbiA9PSAndGV4dGFycmF5JykNCgkJCXJldHVybiAkYmFzTGFuZ1sndGV4dGFycmF5J107DQoJCWlmKCRhY3Rpb24gPT0gJ3VwZGF0ZURCJyl7DQoJCQkJCXNhZmVfdXBkYXRlKCJ0eHBfcGx1Z2luIiwiaGVscCA9ICciLiRiYXNMYW5nWydkYiddWydoZWxwJ10uIiciLCJuYW1lPSdiYXNfbGlnaHRib3gnIik7DQoJCQkJCXNhZmVfdXBkYXRlKCJ0eHBfcGx1Z2luIiwiZGVzY3JpcHRpb24gPSAnIi4kYmFzTGFuZ1snZGInXVsnZGVzY3JpcHRpb24nXS4iJyIsIm5hbWU9J2Jhc19saWdodGJveCciKTsNCg0KCQkJfQ0KDQoJfQ0KIjtzOjQ6InR5cGUiO3M6MToiMSI7czozOiJtZDUiO3M6MzI6IjJiZGI3ZDhiODU4N2ZiMDhiNjAwOTE1NGMxMDI5ZjgyIjt9