# smd_slimbox 0.29 # 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: # ...................................................................... YTo5OntzOjQ6Im5hbWUiO3M6MTE6InNtZF9zbGltYm94IjtzOjY6ImF1dGhvciI7czoxMToiU3RlZiBEYXdzb24iO3M6MTA6ImF1dGhvcl91cmkiO3M6MjE6Imh0dHA6Ly9zdGVmZGF3c29uLmNvbSI7czo3OiJ2ZXJzaW9uIjtzOjQ6IjAuMjkiO3M6MTE6ImRlc2NyaXB0aW9uIjtzOjYyOiJJbWFnZSBnYWxsZXJ5IGxpZ2h0Ym94IHdyYXBwZXIgdXNpbmcgQ2hyaXN0b3BoZSBCZXlsJ3MgU2xpbWJveCI7czo0OiJoZWxwIjtzOjg5OiI8aDE+c21kX3NsaW1ib3g8L2gxPg0KDQo8cD5TZWUgdGhlIGF0dGFjaGVkIGhlbHAgZmlsZSBpbiB0aGUgemlwIGFyY2hpdmUgZm9yIHVzYWdlLjwvcD4NCiI7czo0OiJjb2RlIjtzOjE5NDE5OiIvLyB2MC4xICAgSW5pdGlhbCBwdWJsaWMgcmVsZWFzZQ0KLy8gdjAuMTEgQWRkZWQgIWNhdGVnb3J5IHN1cHBvcnQNCi8vIHYwLjEyIEFkZGVkIHRleHRwb3Mgb3B0aW9uICh0aGFua3MgbGVlKSBhbmQgaW1hZ2VpZCBvcHRpb24gKHRoYW5rcyB3b3VhcmVuKQ0KLy8gdjAuMiAgIGpzIGFuZCBjc3MgY2FuIG5vdyBiZSBsb2FkZWQgZWxzZXdoZXJlICh0aGFua3MganN0dWJicykuIEFkZGVkIHdyYXB0YWcgYW5kIGNoYW5nZWQgZGVmYXVsdHMgdG8gbWFrZSBvdXRwdXQgbGVzcyBsaWtlIHRhZy1zb3VwICh0aGFua3Mgd291YXJlbikNCi8vIHYwLjIxIEFkZGVkIG9yZGVyYnk9ImZpeGVkIiB0byBhbGxvd2VkIGZpeGVkIGltYWdlaWQgb3JkZXJpbmcgKHRoYW5rcyBsZWUpLiAkd2hlcmUgd2FybmluZyBzcXVhc2hlZCAodGhhbmtzIGJlbmppYm90KQ0KLy8gdjAuMjIgTm93IHVzZXMgc21kX2xpYiBhbmQgc3ViY2F0cy4gQWxzbyBNTFAoTXVsdGktbGluZ3VhbCktYXdhcmUuDQovLyB2MC4yMyBGaXhlZCBvcmRlcmJ5IHdoZW4gdXNpbmcgcmFuZG9tICh0aGFua3MgbXJkYWxlKSBhbmQgYWRkZWQgYWJpbGl0eSB0byBvdmVycmlkZSBtYXhsaW1pdA0KLy8gdjAuMjQgQWRkZWQgbGliY2hlY2sgKHRoYW5rcyBwYXB1YXNzKS4gTnVtZXJpYyByYW5nZXMgbm93IGFsbG93ZWQgZm9yIElEcyAoc21kX2xpYikuIEZpeGVkIGVtcHR5IGZpZWxkL2ltYWdlaWQgbmVnYXRpb24gYnVncy4gRml4ZWQgbmV4dC9wcmV2IGJ1dHRvbnMgZm9yIE1MUC4NCi8vIHYwLjI0YiBGaXhlZCBwYWdpbmcgaW4gc3ViZGlyZWN0b3J5IGluc3RhbGxhdGlvbnMgKHRoYW5rcyB1bHRyYW1lZ2EgYW5kIFF3ZXN0KQ0KLy8gdjAuMjUgRXh0ZW5kZWQgZ3JvdXBuYW1lICh0aGFua3MgW0F4ZWxdKQ0KLy8gdjAuMjVhIEJ1bmRsZWQgbGF0ZXN0IHZlcnNpb24gb2Ygc2xpbWJveCBpbiB0aGUgcGFja2FnZS4gTWFkZSB0aGUgZG9jcyBlYXNpZXIgdG8gcmVhZC4NCi8vIHYwLjI2IEFkZGVkIHRydWUgbXVsdGlwbGUgZ2FsbGVyeSBzdXBwb3J0ICh0aGFua3Mgd2hlYXRpY3VzKQ0KLy8gdjAuMjcgQWRkZWQgdGh1bWIgKHRoYW5rcyBwcm9ncmU1NSkNCi8vIHYwLjI4IEFkZGVkIGltYWdlY2FwdGlvbiAodGhhbmtzIEFkYW1fVikNCi8vIHYwLjI5IEFkZGVkIHRodW1ic2l6ZSAodGhhbmtzIFNpbWFuZWspDQoNCnJlcXVpcmVfcGx1Z2luKCdzbWRfbGliJyk7DQpyZWdpc3Rlcl9jYWxsYmFjaygnc21kX3Nib3hfZW51bV9zdHInLCAnbDEwbi5lbnVtZXJhdGVfc3RyaW5ncycpOw0KZ2xvYmFsICRzbWRfc2JveF9saWJzOw0KZ2xvYmFsICRzbWRfc2JveF9zdHI7DQokc21kX3Nib3hfc3RyID0gYXJyYXkoDQoJJ2luY2VycicgPT4gJ0lmIHVzaW5nIHRoZSBzY3JpcHRzIG9wdGlvbiwgc3BlY2lmeSB1cCB0byB0aHJlZSByZXF1aXJlZCBzY3JpcHRzIGluIHRoaXMgb3JkZXI6ICZsdDt0eHA6c21kX3NsaW1ib3hfaW5jIHNjcmlwdHM9Im1vb3Rvb2xzSlNMb2NhdGlvbiwgc2xpbWJveEpTTG9jYXRpb24sIHNsaW1ib3hDU1NMb2NhdGlvbiIgLyZndDsuIElmIGFueSBwb3NpdGlvbnMgYXJlIGxlZnQgZW1wdHksIHRoZSBtaXNzaW5nIHNjcmlwdHMgbXVzdCBiZSBzdXBwbGllZCB2aWEgdGhlIGpzZGlyL2Nzc2RpciBvcHRpb25zLCBvciBsb2FkZWQgZXh0ZXJuYWxseSBhbmQgdG9sZCB0byBza2lwIHRoaXMgc3RlcC4gVGhlIHRocmVlIHZhbHVlcyBjYW4gZWl0aGVyIGJlIGEgZnVsbCBYSFRNTCBzdHJpbmcgKGUuZy4gYXMgcmV0dXJuZWQgYnkgdHhwOnN0bV9qYXZhc2NyaXB0IG9yIHR4cDpjc3MsIGFsdGhvdWdoIHRoZXkgbWF5IG5vdCB3b3JrIGRpcmVjdGx5IHdpdGhpbiB0aGUgdGFnOyBzZWUgdGhlIGRvY3MpIG9yIHNpbXBseSBwYXRocyB0byB0aGUgZmlsZXMuIE5vdGUgdGhhdCBubyB2YWxpZGF0aW9uIGlzIHBlcmZvcm1lZCB0byBjaGVjayBpZiB0aGUgZmlsZXMgZXhpc3QuJywNCgknbm9pbmMnID0+ICdSZXF1aXJlZCBsaWJyYXJpZXMgbm90IGxvYWRlZC4gQ2FsbCAmbHQ7dHhwOnNtZF9zbGltYm94X2luYyAvJmd0OyBpbiB0aGUgJmx0O2hlYWQmZ3Q7IG9mIHRoaXMgcGFnZS4nLA0KCSduZXh0X2xibCcgPT4gJ05leHQnLA0KCSdwcmV2X2xibCcgPT4gJ1ByZXYnLA0KKTsNCg0KLy8gVXNlIHRoaXMgdG8gaW5jbHVkZSB0aGUgbGlicmFyaWVzIGluIHRoZSA8aGVhZD4gc2VjdGlvbiBvZiB0aGUgcGFnZQ0KZnVuY3Rpb24gc21kX3NsaW1ib3hfaW5jKCRhdHRzKSB7DQoJZ2xvYmFsICRzbWRfc2JveF9saWJzOw0KCWdsb2JhbCAkc21kX3Nib3hfc3RyOw0KDQoJaWYgKGlzX2FycmF5KCRhdHRzKSkgZXh0cmFjdCgkYXR0cyk7DQoNCgkvLyBGdW5jdGlvbiBvcHRpb25zDQoJJGpzZGlyID0gaXNzZXQoJGpzZGlyKSA/IGRvU2xhc2goJGpzZGlyKSA6ICcnOw0KCSRjc3NkaXIgPSBpc3NldCgkY3NzZGlyKSA/IGRvU2xhc2goJGNzc2RpcikgOiAnJzsNCgkkc2NyaXB0cyA9IGlzc2V0KCRzY3JpcHRzKSA/ICRzY3JpcHRzIDogJyc7DQoJJHNraXAgPSBpc3NldCgkc2tpcCkgPyAkc2tpcCA6ICIwIjsNCg0KCSRtb2RzUmVxdWlyZWQgPSAzOw0KCSRtb2RzTG9hZGVkID0gMDsNCgkkb3V0U3RyID0gJyc7DQoNCglpZiAoJHNraXAgPiAwKSB7DQoJCSRtb2RzTG9hZGVkID0gJHNraXA7DQoJfQ0KDQoJLy8gSW5jbHVkZSB0aGUganMgbGlicyBpZiByZXF1aXJlZA0KCWlmICgkanNkaXIgIT0gJycpIHsNCgkJJG91dFN0ciAuPSAnPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iJyAuJGpzZGlyLiAnL21vb3Rvb2xzLmpzIj48L3NjcmlwdD4nLm47DQoJCSRvdXRTdHIgLj0gJzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9IicgLiRqc2Rpci4gJy9zbGltYm94LmpzIj48L3NjcmlwdD4nLm47DQoJCSRtb2RzTG9hZGVkICs9IDI7DQoJfQ0KDQoJLy8gRmluZCB3aGljaCBzY3JpcHRzIHRvIGF1dG8tbG9hZA0KCWlmICgoJHNjcmlwdHMgIT0gJycpICYmICgkbW9kc0xvYWRlZCA8ICRtb2RzUmVxdWlyZWQpKSB7DQoJCSRtb2RzTGlzdCA9IHByZWdfc3BsaXQoJy9bLF0rLycsJHNjcmlwdHMsJG1vZHNSZXF1aXJlZCk7DQoJCSRqc3ByZWZpeCA9ICI8c2NyaXB0IjsNCgkJJGNzc3ByZWZpeCA9ICI8bGluayI7DQoJCSR0eHBwcmVmaXggPSAiPHR4cCI7DQoJCWZvcmVhY2ggKCRtb2RzTGlzdCBhcyAkZmlsZW9iaikgew0KCQkJJGZpbGVvYmogPSB0cmltKCRmaWxlb2JqKTsNCgkJCWlmICgkZmlsZW9iaiA9PSAnJykgew0KCQkJCSRtb2RzTG9hZGVkLS07DQoJCQl9IGVsc2UgaWYgKHN1YnN0cigkZmlsZW9iaiwgMCwgc3RybGVuKCRqc3ByZWZpeCkpID09PSAkanNwcmVmaXgpIHsNCgkJCQkkb3V0U3RyIC49ICRmaWxlb2JqLm47DQoJCQl9IGVsc2UgaWYgKHN1YnN0cigkZmlsZW9iaiwgMCwgc3RybGVuKCRjc3NwcmVmaXgpKSA9PT0gJGNzc3ByZWZpeCkgew0KCQkJCSRvdXRTdHIgLj0gJGZpbGVvYmoubjsNCgkJCX0gZWxzZSBpZiAoc3Vic3RyKCRmaWxlb2JqLCAwLCBzdHJsZW4oJHR4cHByZWZpeCkpID09PSAkdHhwcHJlZml4KSB7DQoJCQkJJG91dFN0ciAuPSBwYXJzZSgkZmlsZW9iaik7DQoJCQl9IGVsc2Ugew0KCQkJCWlmICgkbW9kc0xvYWRlZCA8IDIpIHsNCgkJCQkJJG91dFN0ciAuPSAnPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iJyAuJGZpbGVvYmouICciPjwvc2NyaXB0PicubjsNCgkJCQl9IGVsc2Ugew0KCQkJCQkkb3V0U3RyIC49ICc8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9IicgLiRmaWxlb2JqLiAnIiB0eXBlPSJ0ZXh0L2NzcyIgbWVkaWE9InNjcmVlbiIgLz4nLm47DQoJCQkJfQ0KCQkJfQ0KCQkJJG1vZHNMb2FkZWQrKzsNCgkJfQ0KCX0NCg0KCS8vIEluY2x1ZGUgdGhlIGNzcyBmaWxlIGlmIHJlcXVpcmVkDQoJaWYgKCRjc3NkaXIgIT0gJycpIHsNCgkJJG91dFN0ciAuPSAnPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSInIC4kY3NzZGlyLiAnL3NsaW1ib3guY3NzIiB0eXBlPSJ0ZXh0L2NzcyIgbWVkaWE9InNjcmVlbiIgLz4nLm47DQoJCSRtb2RzTG9hZGVkKys7DQoJfQ0KDQoJLy8gU2V0IHRoZSBmbGFnIHRvIHNheSB0aGUgbGlicyBhcmUgb2suIFNoYW1lIHRoZXJlJ3Mgbm8gZWFzeSBwcm92aXNpb24gZm9yDQoJLy8gY2hlY2tpbmcgdGhlIGZpbGVzIGFjdHVhbGx5IGV4aXN0IGF0IHRoZSBnaXZlbiBsb2NhdGlvbnMsIGJ1dCBoZXkNCglpZiAoJG1vZHNMb2FkZWQgPT0gJG1vZHNSZXF1aXJlZCkgew0KCQkkc21kX3Nib3hfbGlicyA9IHRydWU7DQoJfSBlbHNlIHsNCgkJJHNtZF9zYm94X2xpYnMgPSBmYWxzZTsNCgkJJG91dFN0ciA9IHNtZF9nVHh0KCRzbWRfc2JveF9zdHIsJ2luY2VycicpLm47DQoJfQ0KDQoJcmV0dXJuICRvdXRTdHI7DQp9DQoNCmZ1bmN0aW9uIHNtZF9zbGltYm94KCRhdHRzKSB7DQoJZ2xvYmFsICRwcmV0ZXh0LCAkdGhpc2FydGljbGUsICRpbWdfZGlyOw0KCWdsb2JhbCAkc21kX3Nib3hfbGlicywgJHNtZF9zYm94X3N0cjsNCg0KCWlmIChpc19hcnJheSgkYXR0cykpIGV4dHJhY3QoJGF0dHMpOw0KCSRjYXRpZG9wdHMgPSAoaXNzZXQoJGNhdGVnb3J5KSB8fCBpc3NldCgkaW1hZ2VpZCkpID8gdHJ1ZSA6IGZhbHNlOw0KDQoJLy8gUGx1Z2luIG9wdGlvbnMNCgkkbGliY2hlY2sgPSBpc3NldCgkbGliY2hlY2spID8gJGxpYmNoZWNrOiAiMSI7DQoJJGltYWdlaWQgPSBpc3NldCgkaW1hZ2VpZCkgPyBkb1NsYXNoKCRpbWFnZWlkKSA6ICcnOw0KCSRjYXRlZ29yeSA9IGlzc2V0KCRjYXRlZ29yeSkgPyBkb1NsYXNoKCRjYXRlZ29yeSkgOiAoKCRpbWFnZWlkPT0iIikgPyAkcHJldGV4dFsnYyddOiAnJyk7DQoJJHN1YmNhdHMgPSBpc3NldCgkc3ViY2F0cykgPyB0cnVlIDogZmFsc2U7DQoJJGNhdGxhYmVsID0gaXNzZXQoJGNhdGxhYmVsKSA/ICRjYXRsYWJlbDogImFydGljbGUtIjsNCgkkZ3JvdXBuYW1lID0gaXNzZXQoJGdyb3VwbmFtZSkgPyAkZ3JvdXBuYW1lOiAic21kIjsNCgkkdGh1bWIgPSBpc3NldCgkdGh1bWIpID8gdHJ1ZSA6IGZhbHNlOw0KCSRtYXhsaW1pdCA9IGlzc2V0KCRtYXhsaW1pdCkgPyAkbWF4bGltaXQ6ICI5OTk5OSI7DQoJJGxpbWl0ID0gaXNzZXQoJGxpbWl0KSA/ICRsaW1pdDogIjAiOw0KCSRvcmRlcmJ5ID0gaXNzZXQoJG9yZGVyYnkpID8gJG9yZGVyYnk6ICJjYXRlZ29yeSI7DQoJJHNob3dwYWdlbGlua3MgPSBpc3NldCgkc2hvd3BhZ2VsaW5rcykgPyAkc2hvd3BhZ2VsaW5rczogIjEiOw0KCSRnYWxsZXJ5aWQgPSBpc3NldCgkZ2FsbGVyeWlkKSA/ICRnYWxsZXJ5aWQ6ICI/NDo2IjsNCgkkdGh1bWJzaXplID0gaXNzZXQoJHRodW1ic2l6ZSkgPyAkdGh1bWJzaXplIDogIiI7DQoJJHByZXZsYWJlbD0gaXNzZXQoJHByZXZsYWJlbCkgPyAkcHJldmxhYmVsOiBzbWRfZ1R4dCgkc21kX3Nib3hfc3RyLCAncHJldl9sYmwnKTsNCgkkbmV4dGxhYmVsPSBpc3NldCgkbmV4dGxhYmVsKSA/ICRuZXh0bGFiZWw6IHNtZF9nVHh0KCRzbWRfc2JveF9zdHIsICduZXh0X2xibCcpOw0KCSRpbWFnZWNhcHRpb24gPSBpc3NldCgkaW1hZ2VjYXB0aW9uKSA/ICRpbWFnZWNhcHRpb246ICI/Y2FwdGlvbiI7DQoJJHNob3djYXB0aW9uID0gaXNzZXQoJHNob3djYXB0aW9uKSA/ICRzaG93Y2FwdGlvbjogIjAiOw0KCSRzaG93YWx0ID0gaXNzZXQoJHNob3dhbHQpID8gJHNob3dhbHQ6ICIwIjsNCgkkdGV4dHBvcyA9IGlzc2V0KCR0ZXh0cG9zKSA/ICR0ZXh0cG9zOiAiYmVsb3ciOw0KCSR3cmFwdGFnID0gaXNzZXQoJHdyYXB0YWcpID8gJHdyYXB0YWc6ICIiOw0KCSRjZWxsY2xhc3MgPSBpc3NldCgkY2VsbGNsYXNzKSA/ICRjZWxsY2xhc3M6ICIiOw0KCSRpbWdjbGFzcyA9IGlzc2V0KCRpbWdjbGFzcykgPyAkaW1nY2xhc3M6ICIiOw0KCSRuYXZjbGFzcyA9IGlzc2V0KCRuYXZjbGFzcykgPyAkbmF2Y2xhc3M6ICIiOw0KCSRwcmV2Y2xhc3MgPSBpc3NldCgkcHJldmNsYXNzKSA/ICRwcmV2Y2xhc3M6ICJzbWRfc2xpbWJveF9wcmV2IjsNCgkkbmV4dGNsYXNzID0gaXNzZXQoJG5leHRjbGFzcykgPyAkbmV4dGNsYXNzOiAic21kX3NsaW1ib3hfbmV4dCI7DQoJJGNhcHRpb25jbGFzcyA9IGlzc2V0KCRjYXB0aW9uY2xhc3MpID8gJGNhcHRpb25jbGFzczogIiI7DQoJJGFsdGNsYXNzID0gaXNzZXQoJGFsdGNsYXNzKSA/ICRhbHRjbGFzczogIiI7DQoNCgkkZml4ZWRPcmRlciA9IGZhbHNlOw0KCSRnYWxsSUQgPSAiIjsNCgkkZmllbGRNYXAgPSBhcnJheSgibmFtZSIgPT4gIm5hbWUiLA0KCQkJCQkJCSJpZCIgPT4gImlkIiwNCgkJCQkJCQkiYWx0IiA9PiAiYWx0IiwNCgkJCQkJCQkiY2FwdGlvbiIgPT4gImNhcHRpb24iLA0KCQkJCQkJCSJjYXRlZ29yeSIgPT4gImNhdGVnb3J5IiwNCgkJCQkJCQkiYXV0aG9yIiA9PiAiYXV0aG9yIiwNCgkJCQkJCQkiZGF0ZSIgPT4gImRhdGUiLA0KCQkJCQkJCSJleHQiID0+ICJleHQiLA0KCQkJCQkJCSJ3IiA9PiAid2lkdGgiLA0KCQkJCQkJCSJoIiA9PiAiaGVpZ2h0Iik7DQoNCgkvLyBUaGUgZ2FsbGVyeSBpZGVudGlmaWVyIGlzIHVzZWQgZm9yIGtlZXBpbmcgdHJhY2sgb2YgbmV4dC9wcmV2IHRodW1icGFnZSBsaW5rcw0KCWlmICgkZ2FsbGVyeWlkID09ICIiIHx8ICRnYWxsZXJ5aWRbMF0gPT0gIj8iKSB7DQoJCS8vIEdlbmVyYXRlIGEgdW5pcXVlIElEIGZvciB0aGlzIGdhbGxlcnkgaW5zdGFuY2UNCgkJJGdhbGxUbXAgPSBtZDUoJGNhdGVnb3J5LiRpbWFnZWlkLiRvcmRlcmJ5LiRsaW1pdC4kbWF4bGltaXQuJHdyYXB0YWcpOw0KCQlsaXN0KCRnYWxsTGVuLCAkZ2FsbFNraXApID0gZXhwbG9kZSgiOiIsIHN1YnN0cigkZ2FsbGVyeWlkLDEpKTsNCgkJJGdhbGxMZW4gPSAgKGVtcHR5KCRnYWxsTGVuKSkgPyAiNCIgOiAkZ2FsbExlbjsNCgkJJGdhbGxTa2lwID0gIChlbXB0eSgkZ2FsbFNraXApKSA/ICIxIiA6ICRnYWxsU2tpcDsNCgkJZm9yICgkaWR4ID0gMCwgJGNudCA9IDA7ICRjbnQgPCAkZ2FsbExlbjsgJGNudCsrLCAkaWR4ID0gKCgkaWR4KyRnYWxsU2tpcCkgJSBzdHJsZW4oJGdhbGxUbXApKSkgew0KCQkJJGdhbGxJRCAuPSAkZ2FsbFRtcFskaWR4XTsNCgkJfQ0KCX0gZWxzZSB7DQoJCSRnYWxsSUQgPSAkZ2FsbGVyeWlkOw0KCX0NCg0KCS8vIE1haW4gY29kZSBib2R5DQoJaWYgKCgkbGliY2hlY2sgPT0gMSkgJiYgKCRzbWRfc2JveF9saWJzID09IGZhbHNlKSkgew0KCQkkb3V0U3RyID0gc21kX2dUeHQoJHNtZF9zYm94X3N0ciwnbm9pbmMnKTsNCgl9IGVsc2Ugew0KCQkvLyBUaGUgZGF0YWJhc2UgZmllbGRzIHJlcXVpcmVkDQoJCSRmaWVsZHMgPSAnaWQsbmFtZSxjYXB0aW9uLGFsdCxjYXRlZ29yeSxkYXRlLGF1dGhvcixleHQsdyxoJzsNCg0KCQkvLyBDb252ZXJ0IHRoZSBjYXRlZ29yeSAocG9zc2libHkgYSBjb21tYS1zZXAgbGlzdCkgaW50byBhbiBTUUwtc3R5bGUgJ2luJyBsaXN0Lg0KCQkkZnVsbENhdExpc3QgPSBhcnJheSgpOw0KCQkkbm90Q2F0TGlzdCA9IGFycmF5KCk7DQoJCSRjYXRWYXJzID0gYXJyYXkoIj9jIiwgIiFjIiwgIj9zIiwgIiFzIiwgIj90IiwgIiF0IiwgIj9pZCIsICIhaWQiLCAiP2ZpZWxkIiwgIiFmaWVsZCIpOw0KCQkkcmV0QXJyYXkgPSBzbWRfZ2V0QXR0cygkY2F0ZWdvcnksICRjYXRWYXJzLCAkY2F0bGFiZWwpOw0KCQkkZnVsbENhdExpc3QgPSAkcmV0QXJyYXlbMF07DQoJCSRub3RDYXRMaXN0ID0gJHJldEFycmF5WzFdOw0KDQoJCS8vIENvbnZlcnQgdGhlIGltYWdlaWQgKHBvc3NpYmx5IGEgY29tbWEtc2VwIGxpc3QpIGludG8gYW4gU1FMLXN0eWxlICdpbicgbGlzdC4NCgkJJGZ1bGxJRExpc3QgPSBhcnJheSgpOw0KCQkkbm90SURMaXN0ID0gYXJyYXkoKTsNCgkJJGlkVmFycyA9IGFycmF5KCI/aWQiLCAiIWlkIiwgIj9maWVsZCIsICIhZmllbGQiKTsNCgkJJHJldEFycmF5ID0gc21kX2dldEF0dHMoJGltYWdlaWQsICRpZFZhcnMpOw0KCQkkZnVsbElETGlzdCA9ICRyZXRBcnJheVswXTsNCgkJJG5vdElETGlzdCA9ICRyZXRBcnJheVsxXTsNCg0KCQkvLyBNYWtlIHVwIHRoZSBXSEVSRSBzdGF0ZW1lbnQgZnJvbSB0aGUgY29tYmluZWQgbGlzdHMuDQoJCS8vIFRoZSBjYXRlZ29yaWVzL2ltYWdlIElEcyBhcmUgT1JlZCB0b2dldGhlciBpbiBicmFja2V0cyBmaXJzdA0KCQkvLyBiZWZvcmUgdGhlIG5lZ2F0aW9uIG9wdGlvbnMgYXJlIHRhY2tlZCBvbiBhcyBBTkRzIGFmdGVyd2FyZHMNCgkJJHdoZXJlT1IgPSBhcnJheSgpOw0KCQkkd2hlcmVBTkQgPSBhcnJheSgpOw0KDQoJCS8vIFN0YXJ0IHRoZSBXSEVSRSBzdGF0ZW1lbnQgd2l0aCB0aGUgY29tYmluZWQgbGlzdCBvZiBpbWFnZSBJRHMNCgkJaWYgKGNvdW50KCRmdWxsSURMaXN0KSA+IDApIHsNCgkJCWZvciAoJGlkeCA9IGNvdW50KCRmdWxsSURMaXN0KTsgJGlkeCA+PTA7ICRpZHgtLSkgew0KCQkJCWlmIChlbXB0eSgkZnVsbElETGlzdFskaWR4XSkpIHsNCgkJCQkJdW5zZXQoJGZ1bGxJRExpc3RbJGlkeF0pOw0KCQkJCX0gZWxzZSB7DQoJCQkJCSRmdWxsSURMaXN0WyRpZHhdID0gIiciIC4gJGZ1bGxJRExpc3RbJGlkeF0gLiAiJyI7DQoJCQkJfQ0KCQkJfQ0KCQkJaWYgKGNvdW50KCRmdWxsSURMaXN0KSA+IDApIHsNCgkJCQkkd2hlcmVPUltdID0gImlkIElOICgiIC4gaW1wbG9kZSgiLCIsICRmdWxsSURMaXN0KS4gIikiOw0KCQkJfQ0KCQl9DQoNCgkJLy8gaW5jbHVkZWQgY2F0ZWdvcmllcyAtIHNvbWUgbWF5IGJlIHN1YmNhdHMNCgkJJHRtcGEgPSBhcnJheSgpOw0KCQlmb3IgKCRpZHggPSAwOyAkaWR4IDwgY291bnQoJGZ1bGxDYXRMaXN0KTsgJGlkeCsrKSB7DQoJCQlpZiAoJHN1YmNhdHMpIHsNCgkJCQkkY2F0ZWdzID0gc21kX2dldFN1YkNhdHMoJGZ1bGxDYXRMaXN0WyRpZHhdLCdpbWFnZScpOw0KCQkJCWZvciAoJGpkeCA9IDA7ICRqZHggPCBjb3VudCgkY2F0ZWdzKTsgJGpkeCsrKSB7DQoJCQkJCWlmICgkY2F0ZWdzWyRqZHhdWyduYW1lJ10gIT0gInJvb3QiKSB7DQoJCQkJCQkkdG1wYVtdID0gIiciIC4kY2F0ZWdzWyRqZHhdWyduYW1lJ10uICInIjsNCgkJCQkJfQ0KCQkJCX0NCgkJCX0gZWxzZSB7DQoJCQkJJHRtcGFbXSA9ICInIiAuJGZ1bGxDYXRMaXN0WyRpZHhdLiAiJyI7DQoJCQl9DQoJCX0NCgkJaWYgKGNvdW50KCR0bXBhKSA+IDApIHsNCgkJCSR3aGVyZU9SW10gPSAiY2F0ZWdvcnkgSU4gKCIgLmltcGxvZGUoIiwiLCAkdG1wYSkuICIpIjsNCgkJfQ0KDQoJCWlmIChjb3VudCgkd2hlcmVPUikgPiAwKSB7DQoJCQkkd2hlcmUgPSAiKCIgLiBpbXBsb2RlKCIgT1IgIiwgJHdoZXJlT1IpIC4gIikiOw0KCQl9IGVsc2Ugew0KCQkJJHdoZXJlID0gIiI7DQoJCX0NCg0KCQkvLyBleGNsdWRlZCBjYXRlZ29yaWVzDQoJCSR0bXBhID0gYXJyYXkoKTsNCgkJZm9yICgkaWR4ID0gMDsgJGlkeCA8IGNvdW50KCRub3RDYXRMaXN0KTsgJGlkeCsrKSB7DQoJCQlpZiAoJHN1YmNhdHMpIHsNCgkJCQkkY2F0ZWdzID0gc21kX2dldFN1YkNhdHMoJG5vdENhdExpc3RbJGlkeF0sJ2ltYWdlJyk7DQoJCQkJZm9yICgkamR4ID0gMDsgJGpkeCA8IGNvdW50KCRjYXRlZ3MpOyAkamR4KyspIHsNCgkJCQkJaWYgKCRjYXRlZ3NbJGpkeF1bJ25hbWUnXSAhPSAicm9vdCIpIHsNCgkJCQkJCSR0bXBhW10gPSAiJyIgLiRjYXRlZ3NbJGpkeF1bJ25hbWUnXS4gIiciOw0KCQkJCQl9DQoJCQkJfQ0KCQkJfSBlbHNlIHsNCgkJCQkkdG1wYVtdID0gIiciIC4kbm90Q2F0TGlzdFskaWR4XS4gIiciOw0KCQkJfQ0KCQl9DQoJCWlmIChjb3VudCgkdG1wYSkgPiAwKSB7DQoJCQkkd2hlcmVBTkRbXSA9ICJjYXRlZ29yeSBOT1QgSU4gKCIgLmltcGxvZGUoIiwiLCAkdG1wYSkuICIpIjsNCgkJfQ0KDQoJCS8vIEFkZCB0byB0aGUgV0hFUkUgc3RhdGVtZW50IHRoZSBjb21iaW5lZCBsaXN0IG9mIE5PVCBpbWFnZSBJRHMNCgkJaWYgKGNvdW50KCRub3RJRExpc3QpID4gMCkgew0KCQkJZm9yICgkaWR4ID0gY291bnQoJG5vdElETGlzdCk7ICRpZHggPj0wOyAkaWR4LS0pIHsNCgkJCQlpZiAoZW1wdHkoJG5vdElETGlzdFskaWR4XSkpIHsNCgkJCQkJdW5zZXQoJG5vdElETGlzdFskaWR4XSk7DQoJCQkJfSBlbHNlIHsNCgkJCQkJJG5vdElETGlzdFskaWR4XSA9ICInIiAuICRub3RJRExpc3RbJGlkeF0gLiAiJyI7DQoJCQkJfQ0KCQkJfQ0KCQkJaWYgKGNvdW50KCRub3RJRExpc3QpID4gMCkgew0KCQkJCSR3aGVyZUFORFtdID0gImlkIE5PVCBJTiAoIiAuIGltcGxvZGUoIiwiLCAkbm90SURMaXN0KS4gIikiOw0KCQkJfQ0KCQl9DQoNCgkJaWYgKGNvdW50KCR3aGVyZUFORCkgPiAwKSB7DQoJCQkkd2hlcmUgLj0gKCgkd2hlcmU9PSIiKSA/ICIiIDogIiBBTkQgIikgLiBpbXBsb2RlKCIgQU5EICIsICR3aGVyZUFORCk7DQoJCX0NCg0KCQkvLyBJZiB0aGUgcmVhc29uIG5vdGhpbmcgd2FzIHJldHVybmVkIGlzIGJlY2F1c2Ugbm8gb3B0aW9ucyB3ZXJlIGdpdmVuDQoJCWlmICgkd2hlcmUgPT0gIiIgJiYgISRjYXRpZG9wdHMpIHsNCgkJCSR3aGVyZSA9ICIxPTEiOw0KCQl9DQoNCgkJLy8gQ29udmVydCB0aGUgb3JkZXJieSBpbnRvIGEgdmFsaWQgc29ydGluZyBoaWVyYXJjaHkuDQoJCS8vIE5vdGUgdGhhdCByYW5kb20gaXMgYSBzcGVjaWFsIGNhc2UgYW5kIHRoZSBmb2xsb3dpbmcgcnVsZXMgYXBwbHk6DQoJCS8vICAxKSBBbnl0aGluZyBhcHBlYXJpbmcgYmVmb3JlIHJhbmRvbSBpcyBwYXNzZWQgdG8gdGhlIGRhdGFiYXNlIHF1ZXJ5IGZvciBvcmRlcmluZw0KCQkvLyAgMikgQXMgc29vbiBhcyByYW5kb20gaXMgZW5jb3VudGVyZWQsIHRoZSBvcmRlcmJ5IHN0cmluZyBpcyBpZ25vcmVkLg0KCQkvLyAgICAgVGhlIHJlc3VsdHNldCB3aWxsIGJlIHNvcnRlZCByYW5kb21seSBpbnN0ZWFkDQoJCS8vICAzKSBJZiByYW5kb20gYXBwZWFycyBmaXJzdCBpbiB0aGUgbGlzdCwgdGhlIGRhdGEgaXMgcmV0cmlldmVkIHJhbmRvbWx5IHRoZW4gdGhlDQoJCS8vICAgICByZW1haW5pbmcgb3B0aW9ucyBzb3J0IHRoZSByZXN1bHRzZXQNCgkJJHdoZXJlT0IgPSBBcnJheSgpOw0KCQkkcG9zdE9yZGVyID0gYXJyYXkoKTsNCgkJJHJ1bGUgPSAic3FsIjsNCgkJJHBvc3RQcmVmaXggPSAiU09SVF8iOw0KCQkkcmFuZHNvcnQgPSBmYWxzZTsNCgkJJG9iTGlzdCA9IHByZWdfc3BsaXQoJy9bLFxzXSsvJywkb3JkZXJieSwtMSxQUkVHX1NQTElUX05PX0VNUFRZKTsNCgkJZm9yICgkaWR4ID0gMDsgJGlkeCA8IGNvdW50KCRvYkxpc3QpOyAkaWR4KyspIHsNCgkJCSRvYl9kaXIgPSBleHBsb2RlKCc6Jywkb2JMaXN0WyRpZHhdKTsNCgkJCSRkaXJlY3Rpb24gPSAnJzsNCgkJCSRjb2xSZWYgPSAnJzsNCgkJCWlmIChjb3VudCgkb2JfZGlyKSA8PSAxKSB7DQoJCQkJJG9iX2RpclsxXSA9ICJhc2MiOw0KCQkJfQ0KCQkJaWYgKCRydWxlID09ICJzcWwiKSB7DQoJCQkJJGRpcmVjdGlvbiA9ICgkb2JfZGlyWzFdID09ICJkZXNjIikgPyAnIGRlc2MnIDogJyBhc2MnOw0KCQkJfSBlbHNlIHsNCgkJCQkkZGlyZWN0aW9uID0gKCRvYl9kaXJbMV0gPT0gImRlc2MiKSA/ICRwb3N0UHJlZml4LidERVNDJyA6ICRwb3N0UHJlZml4LidBU0MnOw0KCQkJfQ0KDQoJCQlzd2l0Y2ggKCRvYl9kaXJbMF0pIHsNCgkJCQljYXNlICdyYW5kb20nOg0KCQkJCQkkcnVsZSA9ICJwb3N0IjsNCgkJCQkJaWYgKCRpZHggPT0gMCkgew0KCQkJCQkJJHdoZXJlT0JbXSA9ICdyYW5kKCknOw0KCQkJCQl9IGVsc2Ugew0KCQkJCQkJJHJhbmRzb3J0ID0gdHJ1ZTsNCgkJCQkJfQ0KCQkJCQlicmVhazsNCgkJCQljYXNlICdmaXhlZCc6DQoJCQkJCS8vICdmaXhlZCcgb25seSB3b3JrcyBvbiBpbWFnZSBpZHMNCgkJCQkJaWYgKCRpbWFnZWlkICE9ICIiKSB7DQoJCQkJCQkkZml4ZWRPcmRlciA9IHRydWU7DQoJCQkJCX0NCgkJCQkJYnJlYWs7DQoJCQkJZGVmYXVsdDoNCgkJCQkJJGNvbFJlZiA9IGFycmF5X3NlYXJjaCgkb2JfZGlyWzBdLCAkZmllbGRNYXApOw0KCQkJCQlicmVhazsNCgkJCX0NCgkJCWlmICgkcnVsZSA9PSAic3FsIikgew0KCQkJCWlmICgkY29sUmVmICE9ICIiKSB7DQoJCQkJCSR3aGVyZU9CW10gPSAkY29sUmVmLiRkaXJlY3Rpb247DQoJCQkJfQ0KCQkJfSBlbHNlIHsNCgkJCQlpZiAoISRyYW5kc29ydCkgew0KCQkJCQlpZiAoJGNvbFJlZiAhPSAiIikgew0KCQkJCQkJJHBvc3RPcmRlcltdID0gYXJyYXkoImNvbCIgPT4gJGNvbFJlZiwgInNvcnQiID0+ICRkaXJlY3Rpb24pOw0KCQkJCQl9DQoJCQkJfQ0KCQkJfQ0KCQl9DQoNCgkJaWYgKGNvdW50KCR3aGVyZU9CKSA+IDApIHsNCgkJCSR3aGVyZSAuPSAnIE9SREVSIEJZICcgLiBpbXBsb2RlKCIsIiwkd2hlcmVPQik7DQoJCX0NCg0KCQkvLyBIYW5kbGUgcGFnaW5nDQoJCWlmICgoJGxpbWl0ID4gMCkgJiYgJHNob3dwYWdlbGlua3MpIHsNCgkJCSRycyA9IHNhZmVfcm93cygkZmllbGRzLCAndHhwX2ltYWdlJywgJHdoZXJlIC4nIExJTUlUIDAsJy4kbWF4bGltaXQpOw0KCQkJJG51bXRodW0gPSBjb3VudCgkcnMpOw0KCQkJJG51bVBhZ2VzID0gKCRudW10aHVtID4gMCkgPyBjZWlsKCRudW10aHVtLyRsaW1pdCkgOiAxOw0KCQkJJHRodW1icGFnZSA9ICghZ3BzKCRnYWxsSUQpKSA/IDEgOiBncHMoJGdhbGxJRCk7DQoJCQkkb2Zmc2V0ID0gKCR0aHVtYnBhZ2UgLSAxKSAqICRsaW1pdDsNCgkJCSRycyA9IHNhZmVfcm93cygkZmllbGRzLCAndHhwX2ltYWdlJywgJHdoZXJlIC4nIExJTUlUICcuJG9mZnNldC4nLCcuJGxpbWl0KTsNCgkJfSBlbHNlIHsNCgkJCS8vIE5vIHBhZ2luZyByZXF1aXJlZA0KCQkJJG51bVBhZ2VzID0gMTsNCgkJCSR0aHVtYnBhZ2UgPSAxOw0KCQkJJHJzID0gc2FmZV9yb3dzKCRmaWVsZHMsICd0eHBfaW1hZ2UnLCAkd2hlcmUgLicgTElNSVQgMCwnLiAoKCRsaW1pdD09MCkgPyAkbWF4bGltaXQgOiAkbGltaXQpKTsNCgkJfQ0KDQoJCS8vIElzIHBvc3Qtb3JkZXJpbmcgcmVxdWlyZWQ/IERvIGl0DQoJCWlmICgkcmFuZHNvcnQpIHsNCgkJCXNodWZmbGUoJHJzKTsNCgkJfSBlbHNlIGlmIChjb3VudCgkcG9zdE9yZGVyKSA+IDApIHsNCgkJCS8vIFRyYW5zbGF0ZSB0aGUgcm93cyBpbnRvIGNvbHVtbnMgdGhhdCBjYW4gYmUgc29ydGVkDQoJCQlmb3JlYWNoKCRycyBhcyAka2V5ID0+ICRyb3cpIHsNCgkJCQkkY29sX2lkWyRrZXldID0gJHJvd1snaWQnXTsNCgkJCQkkY29sX25hbWVbJGtleV0gPSAkcm93WyduYW1lJ107DQoJCQkJJGNvbF9jYXB0aW9uWyRrZXldID0gJHJvd1snY2FwdGlvbiddOw0KCQkJCSRjb2xfYWx0WyRrZXldID0gJHJvd1snYWx0J107DQoJCQkJJGNvbF9jYXRlZ29yeVska2V5XSA9ICRyb3dbJ2NhdGVnb3J5J107DQoJCQkJJGNvbF9kYXRlWyRrZXldID0gJHJvd1snZGF0ZSddOw0KCQkJCSRjb2xfZXh0WyRrZXldID0gJHJvd1snZXh0J107DQoJCQkJJGNvbF9hdXRob3JbJGtleV0gPSAkcm93WydhdXRob3InXTsNCgkJCQkkY29sX3dbJGtleV0gPSAkcm93Wyd3J107DQoJCQkJJGNvbF9oWyRrZXldID0gJHJvd1snaCddOw0KCQkJfQ0KCQkJLy8gTWFrZSB1cCBhbiBhcnJheV9tdWx0aXNvcnQgYXJnIGxpc3QgYW5kIGV4ZWN1dGUgaXQNCgkJCWZvciAoJGlkeCA9IDA7ICRpZHggPCBjb3VudCgkcG9zdE9yZGVyKTsgJGlkeCsrKSB7DQoJCQkJJHNvcnRhcmdzW10gPSAnJGNvbF8nLiRwb3N0T3JkZXJbJGlkeF1bJ2NvbCddOw0KCQkJCSRzb3J0YXJnc1tdID0gJHBvc3RPcmRlclskaWR4XVsnc29ydCddOw0KCQkJfQ0KCQkJJHNvcnRpdCA9ICdhcnJheV9tdWx0aXNvcnQoJy5pbXBsb2RlKCIsICIsJHNvcnRhcmdzKS4nLCAkcnMpOyc7DQoJCQlldmFsKCRzb3J0aXQpOw0KCQl9DQoNCgkJLy8gSXMgZml4ZWQtb3JkZXIgb3V0cHV0IGRlc2lyZWQ/IElmIHNvLCByZS1vcmRlciB0aGUgJHJzDQoJCWlmICgkZml4ZWRPcmRlcikgew0KCQkJJG9yZGVyZWRSUyA9IEFycmF5KCk7DQoJCQkkaWdub3JlTGlzdCA9IEFycmF5KCk7DQoJCQkkcmVtYWluaW5nUlMgPSBBcnJheSgpOw0KCQkJLy8gU3VjayBvdXQgdGhlIGZpeGVkIGl0ZW1zIGZpcnN0DQoJCQlmb3IgKCRpZHggPSAwOyAkaWR4IDwgY291bnQoJGZ1bGxJRExpc3QpOyAkaWR4KyspIHsNCgkJCQlmb3JlYWNoKCRycyBhcyAkcm93KSB7DQoJCQkJCWlmICgiJyIuJHJvd1snaWQnXS4iJyIgPT0gJGZ1bGxJRExpc3RbJGlkeF0pIHsNCgkJCQkJCSRvcmRlcmVkUlNbXSA9ICRyb3c7DQoJCQkJCQkkaWdub3JlTGlzdFtdID0gJHJvd1snaWQnXTsNCgkJCQkJfQ0KCQkJCX0NCgkJCX0NCgkJCS8vIFRhY2sgb24gdGhlIHJlbWFpbmluZyByb3dzDQoJCQlmb3JlYWNoKCRycyBhcyAkcm93KSB7DQoJCQkJaWYgKCFpbl9hcnJheSgkcm93WydpZCddLCAkaWdub3JlTGlzdCkpIHsNCgkJCQkJJHJlbWFpbmluZ1JTW10gPSAkcm93Ow0KCQkJCX0NCgkJCX0NCgkJCSRycyA9IGFycmF5X21lcmdlKCRvcmRlcmVkUlMsICRyZW1haW5pbmdSUyk7DQoJCX0NCg0KCQkvLyBIYW5kbGUgdGh1bWJzaXplDQoJCSR0aHVtYldpZHRoID0gJHRodW1iSGVpZ2h0ID0gIiI7DQoJCSR0aHVtYldVbml0cyA9ICR0aHVtYkhVbml0cyA9ICJweCI7DQoJCWlmICgkdGh1bWJzaXplKSB7DQoJCQkkdGh1bWJTaXplcyA9IHNtZF9zcGxpdFJhbmdlKHRyaW0oJHRodW1ic2l6ZSksICIsXHMiLCAiIik7DQoJCQlpZiAoY291bnQoJHRodW1iU2l6ZXMpID09IDEpIHsNCgkJCQkkdGh1bWJXaWR0aCA9ICR0aHVtYkhlaWdodCA9IGVyZWdfcmVwbGFjZSgiW14wLTldIiwgIiIsICR0aHVtYlNpemVzWzBdKTsNCgkJCQkkdW5pdHMgPSBlcmVnX3JlcGxhY2UoIlswLTldIiwgIiIsICR0aHVtYlNpemVzWzBdKTsNCgkJCQkkdGh1bWJXVW5pdHMgPSAkdGh1bWJIVW5pdHMgPSAoJHVuaXRzID09ICIiKSA/ICR0aHVtYldVbml0cyA6ICR1bml0czsNCgkJCX0gZWxzZSB7DQoJCQkJJHRodW1iV2lkdGggPSBlcmVnX3JlcGxhY2UoIlteMC05XSIsICIiLCAkdGh1bWJTaXplc1swXSk7DQoJCQkJJHRodW1iSGVpZ2h0ID0gZXJlZ19yZXBsYWNlKCJbXjAtOV0iLCAiIiwgJHRodW1iU2l6ZXNbMV0pOw0KCQkJCSR1bml0cyA9IGVyZWdfcmVwbGFjZSgiWzAtOV0iLCAiIiwgJHRodW1iU2l6ZXNbMF0pOw0KCQkJCSR0aHVtYldVbml0cyA9ICgkdW5pdHMgPT0gIiIgJiYgJHRodW1iV2lkdGggIT0gIiIpID8gJHRodW1iV1VuaXRzIDogJHVuaXRzOw0KCQkJCSR1bml0cyA9IGVyZWdfcmVwbGFjZSgiWzAtOV0iLCAiIiwgJHRodW1iU2l6ZXNbMV0pOw0KCQkJCSR0aHVtYkhVbml0cyA9ICgkdW5pdHMgPT0gIiIgJiYgJHRodW1iSGVpZ2h0ICE9ICIiKSA/ICR0aHVtYkhVbml0cyA6ICR1bml0czsNCgkJCX0NCgkJfQ0KDQoJCS8vIENvbnN0cnVjdCB0aGUgb3V0cHV0DQoJCSRjYXB0aW9uSXRlbXMgPSBzbWRfc3BsaXRSYW5nZSgkaW1hZ2VjYXB0aW9uLCAiXHMiKTsNCgkJJG91dFN0ciA9ICcnOw0KCQlpZigkcnMpIHsNCgkJCWZvcmVhY2goJHJzIGFzICRyb3cpIHsNCgkJCQkkdGhlVGh1bWIgPSBodS4kaW1nX2Rpci4nLycgLiAkcm93WydpZCddIC4gJ3QnIC4gJHJvd1snZXh0J107DQoJCQkJJGZ1bGwgPSBodS4kaW1nX2Rpci4nLycgLiAkcm93WydpZCddIC4gKCgkdGh1bWIpID8gInQiIDogIiIpIC4kcm93WydleHQnXTsNCgkJCQlpZiAoJGdyb3VwbmFtZSA9PT0gIj9jIikgew0KCQkJCQkkZ3JwID0gJHJvd1snY2F0ZWdvcnknXTsNCgkJCQl9IGVsc2UgaWYgKCRncm91cG5hbWUgPT09ICI/aWQiKSB7DQoJCQkJCSRncnAgPSAkcm93WydpZCddOw0KCQkJCX0gZWxzZSBpZiAoJGdyb3VwbmFtZSA9PT0gIj9hdXRob3IiKSB7DQoJCQkJCSRncnAgPSAkcm93WydhdXRob3InXTsNCgkJCQl9IGVsc2UgaWYgKCRncm91cG5hbWUgPT09ICI/ZGF0ZSIpIHsNCgkJCQkJJGdycCA9ICRyb3dbJ2RhdGUnXTsNCgkJCQl9IGVsc2UgaWYgKCRncm91cG5hbWUgPT09ICI/YWx0Iikgew0KCQkJCQkkZ3JwID0gJHJvd1snYWx0J107DQoJCQkJfSBlbHNlIGlmICgkZ3JvdXBuYW1lID09PSAiP2NhcHRpb24iKSB7DQoJCQkJCSRncnAgPSAkcm93WydjYXB0aW9uJ107DQoJCQkJfSBlbHNlIGlmICgkZ3JvdXBuYW1lID09PSAiP2V4dCIpIHsNCgkJCQkJJGdycCA9ICRyb3dbJ2V4dCddOw0KCQkJCX0gZWxzZSBpZiAoJGdyb3VwbmFtZSA9PT0gIj9uYW1lIikgew0KCQkJCQkkZ3JwID0gJHJvd1snbmFtZSddOw0KCQkJCX0gZWxzZSBpZiAoJGdyb3VwbmFtZSA9PT0gIj93aWR0aCIpIHsNCgkJCQkJJGdycCA9ICRyb3dbJ3cnXTsNCgkJCQl9IGVsc2UgaWYgKCRncm91cG5hbWUgPT09ICI/aGVpZ2h0Iikgew0KCQkJCQkkZ3JwID0gJHJvd1snaCddOw0KCQkJCX0gZWxzZSBpZiAoJGdyb3VwbmFtZVswXSA9PT0gIj8iKSB7DQoJCQkJCS8vIFNwbGl0IG9mZiB0aGUgZmllbGQgbmFtZSBmcm9tIHRoZSBxdWVzdGlvbiBtYXJrDQoJCQkJCSRmaWVsZG5hbWUgPSBzdWJzdHIoJGdyb3VwbmFtZSwxKTsNCgkJCQkJaWYgKGlzc2V0KCR0aGlzYXJ0aWNsZVskZmllbGRuYW1lXSkpIHsNCgkJCQkJCSRncnAgPSAkdGhpc2FydGljbGVbJGZpZWxkbmFtZV07DQoJCQkJCX0gZWxzZSB7DQoJCQkJCQkkZ3JwID0gJyc7DQoJCQkJCX0NCgkJCQl9IGVsc2Ugew0KCQkJCQkkZ3JwID0gJGdyb3VwbmFtZTsNCgkJCQl9DQoNCgkJCQkvLyBIYW5kbGUgaW1hZ2VjYXB0aW9uDQoJCQkJJGNhcHRpb25BcnJheSA9IGFycmF5KCk7DQoJCQkJZm9yZWFjaCAoJGNhcHRpb25JdGVtcyBhcyAkaXRlbSkgew0KCQkJCQlpZiAoJGl0ZW1bMF0gPT09ICI/Iikgew0KCQkJCQkJJGZpZWxkbmFtZSA9IHN1YnN0cigkaXRlbSwxKTsNCgkJCQkJCSRrZXkgPSBhcnJheV9zZWFyY2goJGZpZWxkbmFtZSwgJGZpZWxkTWFwKTsNCgkJCQkJCWlmICgka2V5KSB7DQoJCQkJCQkJJGNhcHRpb25BcnJheVtdID0gJHJvd1ska2V5XTsNCgkJCQkJCX0gZWxzZSB7DQoJCQkJCQkJJGNhcHRpb25BcnJheVtdID0gJGZpZWxkbmFtZTsNCgkJCQkJCX0NCgkJCQkJfSBlbHNlIHsNCgkJCQkJCSRjYXB0aW9uQXJyYXlbXSA9ICRpdGVtOw0KCQkJCQl9DQoJCQkJfQ0KDQoJCQkJLy8gR2VuZXJhdGUgdGhlIGNhcHRpb24vYWx0IGlmIHJlcXVpcmVkDQoJCQkJJGNhcFN0ciA9ICgkc2hvd2FsdCAmJiAkcm93WydhbHQnXSkgPyAnPHNwYW4nIC4gKCgkYWx0Y2xhc3MgIT0gIiIpID8gJyBjbGFzcz0iJyAuJGFsdGNsYXNzLiAnIicgOiAnJykgLiAnPicgLiRyb3dbJ2FsdCddLiAnPC9zcGFuPicgOiAnJzsNCgkJCQkkY2FwU3RyIC49ICgkc2hvd2NhcHRpb24gJiYgJHJvd1snY2FwdGlvbiddKSA/ICc8c3BhbicgLiAoKCRjYXB0aW9uY2xhc3MgIT0gIiIpID8gJyBjbGFzcz0iJyAuJGNhcHRpb25jbGFzcy4gJyInIDogJycpIC4gJz4nIC4kcm93WydjYXB0aW9uJ10uICc8L3NwYW4+JyA6ICcnOw0KDQoJCQkJLy8gQ29uc3RydWN0IHRoZSBsaW5rIGFuZCBwdXQgY2FwdGlvbi9hbHQgaW4gdGhlIGFwcHJvcHJpYXRlIHBvc2l0aW9uDQoJCQkJJG91dFN0ciAuPSAoJHdyYXB0YWcgIT0gIiIpID8gJzwnIC4kd3JhcHRhZy4gKCgkY2VsbGNsYXNzICE9ICIiKSA/ICcgY2xhc3M9IicgLiRjZWxsY2xhc3MuICciJyA6ICcnKSAuICc+JyA6ICcnOw0KCQkJCSRvdXRTdHIgLj0gKCR0ZXh0cG9zID09ICJhYm92ZSIpID8gJGNhcFN0ciA6ICcnOw0KCQkJCSRvdXRTdHIgLj0gJzxhIGhyZWY9IicuJGZ1bGwuJyIgcmVsPSJsaWdodGJveC0nIC4kZ3JwLiAnIiB0aXRsZT0iJyAuaW1wbG9kZSgiICIsICRjYXB0aW9uQXJyYXkpLiAnIj4nIC4oKCR0ZXh0cG9zID09ICJiZWZvcmUiKSA/ICRjYXBTdHIgOiAnJykuICc8aW1nIHNyYz0iJyAuJHRoZVRodW1iLiAnIiBhbHQ9IicgLiRyb3dbJ2FsdCddLiAnIicgLiAoKCRpbWdjbGFzcyAhPSAiIikgPyAnIGNsYXNzPSInIC4kaW1nY2xhc3MuICciJyA6ICcnKSAuICgoJHRodW1iV2lkdGgpID8gJyB3aWR0aD0iJyAuICR0aHVtYldpZHRoLiR0aHVtYldVbml0cy4gJyInIDogJycpIC4gKCgkdGh1bWJIZWlnaHQpID8gJyBoZWlnaHQ9IicgLiAkdGh1bWJIZWlnaHQuJHRodW1iSFVuaXRzLiAnIicgOiAnJykgLiAnIC8+JyAuKCgkdGV4dHBvcyA9PSAiYWZ0ZXIiKSA/ICRjYXBTdHIgOiAnJykuICc8L2E+Jy5uOw0KCQkJCSRvdXRTdHIgLj0gKCR0ZXh0cG9zID09ICJiZWxvdyIpID8gJGNhcFN0ciA6ICcnOw0KCQkJCSRvdXRTdHIgLj0gKCR3cmFwdGFnICE9ICIiKSA/ICc8LycgLiR3cmFwdGFnLiAnPicgOiAnJzsNCgkJCQkkb3V0U3RyIC49IG47DQoJCQl9DQoNCgkJCS8vIEFkZCB0aGUgcGFnaW5nIGZlYXR1cmVzIGlmIHJlcXVpcmVkDQoJCQlpZiAoKCRsaW1pdCA+IDApICYmICRzaG93cGFnZWxpbmtzKSB7DQoJCQkJJG5leHQgPSAoJG51bVBhZ2VzID4gMSAmJiAkdGh1bWJwYWdlICE9ICRudW1QYWdlcyk7DQoJCQkJJHByZXYgPSAoJG51bVBhZ2VzID4gMSAmJiAkdGh1bWJwYWdlID4gMSk7DQoNCgkJCQkvLyBSZXBsYWNlIGFueSBwYWdpbmcgaW5mbyBpbiB0aGUgcXVlcnkgc3RyaW5nDQoJCQkJJHByZXZQYWdlID0gc21kX2FkZFFTVmFyKCRwcmV0ZXh0WydyZXF1ZXN0X3VyaSddLCAkZ2FsbElELCAkdGh1bWJwYWdlLTEpOw0KCQkJCSRuZXh0UGFnZSA9IHNtZF9hZGRRU1ZhcigkcHJldGV4dFsncmVxdWVzdF91cmknXSwgJGdhbGxJRCwgJHRodW1icGFnZSsxKTsNCg0KCQkJCSRvdXRTdHIgLj0gKCR3cmFwdGFnICE9ICIiKSA/ICc8JyAuJHdyYXB0YWcuICgoJG5hdmNsYXNzICE9ICIiKSA/ICcgY2xhc3M9IicgLiRuYXZjbGFzcy4gJyInIDogJycpIC4gJz4nIDogJyc7DQoJCQkJJG91dFN0ciAuPSAoJHByZXYpID8gJzxhJyAuICgoJHByZXZjbGFzcyAhPSAiIikgPyAnIGNsYXNzPSInIC4kcHJldmNsYXNzLiAnIicgOiAnJykgLiAnIGhyZWY9IicgLiRwcmV2UGFnZS4gJyI+JyAuJHByZXZsYWJlbC4gJzwvYT4nLm4gOiAnJzsNCgkJCQkkb3V0U3RyIC49ICgkbmV4dCkgPyAnPGEnIC4gKCgkbmV4dGNsYXNzICE9ICIiKSA/ICcgY2xhc3M9IicgLiRuZXh0Y2xhc3MuICciJyA6ICcnKSAuICcgaHJlZj0iJyAuJG5leHRQYWdlLiAnIj4nIC4kbmV4dGxhYmVsLiAnPC9hPicubiA6ICcnOw0KCQkJCSRvdXRTdHIgLj0gKCR3cmFwdGFnICE9ICIiKSA/ICc8LycgLiR3cmFwdGFnLiAnPicgOiAnJzsNCgkJCQkkb3V0U3RyIC49IG47DQoJCQl9DQoJCX0NCgl9DQoNCglyZXR1cm4gJG91dFN0cjsNCn0NCg0KLy8gQ2FsbGJhY2sgZm9yIE1MUCBzdHJpbmcgcmVwbGFjZW1lbnQNCmZ1bmN0aW9uIHNtZF9zYm94X2VudW1fc3RyKCRldmVudCwgJHN0ZXA9JycsICRwcmU9MCkgew0KCWdsb2JhbCAkc21kX3Nib3hfc3RyLCAkc21kTUxQOw0KCSRyID0gYXJyYXkJKA0KCQkJJ293bmVyJyA9PiAnc21kX3NsaW1ib3gnLA0KCQkJJ3ByZWZpeCcgPT4gJHNtZE1MUFsnc21kX3NsaW1ib3gnXSwNCgkJCSdsYW5nJyA9PiAnZW4tZ2InLCAvLyBEZWZhdWx0IGxhbmd1YWdlDQoJCQknZXZlbnQnID0+ICdwdWJsaWMnLCAvLyBwdWJsaWMvYWRtaW4vY29tbW9uID0gd2hpY2ggaW50ZXJmYWNlIHRoZSBzdHJpbmdzIHdpbGwgYmUgbG9hZGVkIGludG8NCgkJCSdzdHJpbmdzJyA9PiAkc21kX3Nib3hfc3RyLA0KCQkpOw0KCXJldHVybiAkcjsNCn0iO3M6NDoidHlwZSI7czoxOiIwIjtzOjM6Im1kNSI7czozMjoiMTVmZmUxZDFiN2M5MzBjYWI1NDEzOTc1NzkxNGRhY2YiO30=