LyoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogQ29weXJpZ2h0IChDKSAxOTk2LTIwMDAsIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycG9yYXRpb24gYW5kICAgICoKICogb3RoZXJzLiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoKICogJFNvdXJjZTogL3hzcmwvTnN2bi9pY3UvaWN1NGovc3JjL2NvbS9pYm0vaWN1L2Rldi90ZXN0L25vcm1hbGl6ZXIvVGVzdENhbm9uaWNhbEl0ZXJhdG9yLmphdmEsdiAkIAogKiAkRGF0ZTogMjAwMi8wNi8yMCAwMToxNjoyNCAkIAogKiAkUmV2aXNpb246IDEuOCAkCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKi8KcGFja2FnZSBjb20uaWJtLmljdS5kZXYudGVzdC5ub3JtYWxpemVyOwoKaW1wb3J0IGNvbS5pYm0uaWN1LmRldi50ZXN0Lio7CmltcG9ydCBjb20uaWJtLmljdS5sYW5nLio7CmltcG9ydCBjb20uaWJtLmljdS50ZXh0Lio7CmltcG9ydCBjb20uaWJtLmljdS5pbXBsLlV0aWxpdHk7CmltcG9ydCBqYXZhLnRleHQuQ2hhcmFjdGVySXRlcmF0b3I7CmltcG9ydCBqYXZhLnRleHQuU3RyaW5nQ2hhcmFjdGVySXRlcmF0b3I7CmltcG9ydCBqYXZhLnV0aWwuKjsKCi8vIFRPRE86IGZpdCBpbnRvIHRlc3QgZnJhbWV3b3JrCgpwdWJsaWMgY2xhc3MgVGVzdENhbm9uaWNhbEl0ZXJhdG9yIGV4dGVuZHMgVGVzdEZtd2sgewoJCiAgICBzdGF0aWMgZmluYWwgYm9vbGVhbiBTSE9XX05BTUVTID0gZmFsc2U7CgogICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgbmV3IFRlc3RDYW5vbmljYWxJdGVyYXRvcigpLnJ1bihhcmdzKTsKICAgIH0KCQogICAgc3RhdGljIGZpbmFsIFN0cmluZyB0ZXN0QXJyYXlbXVtdID0gewogICAgICAgIHsixWRcdTAzMDdcdTAzMjciLCAiQVx1MDMwQWRcdTAzMDdcdTAzMjcsIEFcdTAzMEFkXHUwMzI3XHUwMzA3LCBBXHUwMzBBXHUxRTBCXHUwMzI3LCAiCiAgICAgICAgCSsgIkFcdTAzMEFcdTFFMTFcdTAzMDcsIFx1MDBDNWRcdTAzMDdcdTAzMjcsIFx1MDBDNWRcdTAzMjdcdTAzMDcsICIKICAgICAgICAJKyAiXHUwMEM1XHUxRTBCXHUwMzI3LCBcdTAwQzVcdTFFMTFcdTAzMDcsIFx1MjEyQmRcdTAzMDdcdTAzMjcsICIKICAgICAgICAJKyAiXHUyMTJCZFx1MDMyN1x1MDMwNywgXHUyMTJCXHUxRTBCXHUwMzI3LCBcdTIxMkJcdTFFMTFcdTAzMDcifSwKICAgICAgICB7Ilx1MDEwZFx1MDE3RSIsICJjXHUwMzBDelx1MDMwQywgY1x1MDMwQ1x1MDE3RSwgXHUwMTBEelx1MDMwQywgXHUwMTBEXHUwMTdFIn0sCiAgICAgICAgeyJ4XHUwMzA3XHUwMzI3IiwgInhcdTAzMDdcdTAzMjcsIHhcdTAzMjdcdTAzMDcsIFx1MUU4Qlx1MDMyNyJ9LAogICAgfTsKICAgIAogICAgIAogICAgcHVibGljIHZvaWQgVGVzdEV4aGF1c3RpdmUoKSB7CiAgICAJaW50IGNvdW50ZXIgPSAwOwogICAgCWludCBtaXhlZENvdW50ZXIgPSAwOwogICAgCWludCBsYXN0TWl4ZWRDb3VudGVyID0gLTE7CiAgICAJQ2Fub25pY2FsSXRlcmF0b3IgaXQgPSBuZXcgQ2Fub25pY2FsSXRlcmF0b3IoIiIpOwogICAgCS8qCiAgICAJQ2Fub25pY2FsSXRlcmF0b3Igc2xvd0l0ID0gbmV3IENhbm9uaWNhbEl0ZXJhdG9yKCIiKTsKICAgIAlzbG93SXQuU0tJUF9aRVJPUyA9IGZhbHNlOwogICAgCSovCiAgICAJVHJhbnNsaXRlcmF0b3IgbmFtZSA9IFRyYW5zbGl0ZXJhdG9yLmdldEluc3RhbmNlKCJbXlxcdTAwMjAtXFx1MDA3Rl0gbmFtZSIpOwogICAgCVNldCBpdFNldCA9IG5ldyBUcmVlU2V0KCk7CiAgICAJU2V0IHNsb3dJdFNldCA9IG5ldyBUcmVlU2V0KCk7CiAgICAJCiAgICAJCiAgICAJZm9yIChpbnQgaSA9IDA7IGkgPCAweDEwRkZGRjsgKytpKSB7CiAgICAJCQogICAgCQkvLyBza2lwIGNoYXJhY3RlcnMgd2Uga25vdyBkb24ndCBoYXZlIGRlY29tcHMKICAgIAkJaW50IHR5cGUgPSBVQ2hhcmFjdGVyLmdldFR5cGUoaSk7CiAgICAJCWlmICh0eXBlID09IENoYXJhY3Rlci5VTkFTU0lHTkVEIHx8IHR5cGUgPT0gQ2hhcmFjdGVyLlBSSVZBVEVfVVNFCiAgICAJCQl8fCB0eXBlID09IENoYXJhY3Rlci5TVVJST0dBVEUpIGNvbnRpbnVlOwogICAgCQkJCiAgICAJCWlmICgoKytjb3VudGVyICUgNTAwMCkgPT0gMCkgbG9nbG4oIlRlc3RpbmcgIiArIFV0aWxpdHkuaGV4KGksMCkpOwogICAgCQkKICAgIAkJU3RyaW5nIHMgPSBVVEYxNi52YWx1ZU9mKGkpICsgIlx1MDM0NSI7CiAgICAJCVN0cmluZyBkZWNvbXAgPSBOb3JtYWxpemVyLmRlY29tcG9zZShzLCBmYWxzZSk7CiAgICAJCVN0cmluZyBjb21wID0gTm9ybWFsaXplci5jb21wb3NlKHMsIGZhbHNlKTsKICAgIAkJLy8gc2tpcCBjaGFyYWN0ZXJzIHRoYXQgZG9uJ3QgaGF2ZSBlaXRoZXIgZGVjb21wLgogICAgCQkvLyBuZWVkIHF1aWNrIHRlc3QgZm9yIHRoaXMhCiAgICAJCWlmIChzLmVxdWFscyhkZWNvbXApICYmIHMuZXF1YWxzKGNvbXApKSBjb250aW51ZTsKICAgIAkJCiAgICAJCWl0LnNldFNvdXJjZShzKTsKICAgIAkJYm9vbGVhbiBnb3REZWNvbXAgPSBmYWxzZTsKICAgIAkJYm9vbGVhbiBnb3RDb21wID0gZmFsc2U7CiAgICAJCWJvb2xlYW4gZ290U291cmNlID0gZmFsc2U7CiAgICAJCXdoaWxlICh0cnVlKSB7CiAgICAJCQlTdHJpbmcgaXRlbSA9IGl0Lm5leHQoKTsKICAgIAkJCWlmIChpdGVtID09IG51bGwpIGJyZWFrOwogICAgCQkJaWYgKGl0ZW0uZXF1YWxzKHMpKSBnb3RTb3VyY2UgPSB0cnVlOwogICAgCQkJaWYgKGl0ZW0uZXF1YWxzKGRlY29tcCkpIGdvdERlY29tcCA9IHRydWU7CiAgICAJCQlpZiAoaXRlbS5lcXVhbHMoY29tcCkpIGdvdENvbXAgPSB0cnVlOwogICAgCQkJaWYgKChtaXhlZENvdW50ZXIgJiAweDdGKSA9PSAwICYmIChpIDwgMHhBRDAwIHx8IGkgPiAweEFDMDAgKyAxMTE3MikpIHsKICAgIAkJCQlpZiAobGFzdE1peGVkQ291bnRlciAhPSBtaXhlZENvdW50ZXIpIHsKICAgIAkJCQkJbG9nbG4oIiIpOwogICAgCQkJCQlsYXN0TWl4ZWRDb3VudGVyID0gbWl4ZWRDb3VudGVyOwogICAgCQkJCX0KICAgIAkJCQlsb2dsbigiXHQiICsgbWl4ZWRDb3VudGVyICsgIlx0IiArIG5hbWUudHJhbnNsaXRlcmF0ZShpdGVtKQogICAgCQkJCSsgKGl0ZW0uZXF1YWxzKHMpID8gIlx0KCpvcmlnaW5hbCopIiA6ICIiKQogICAgCQkJCSsgKGl0ZW0uZXF1YWxzKGRlY29tcCkgPyAiXHQoKmRlY29tcCopIiA6ICIiKQogICAgCQkJCSsgKGl0ZW0uZXF1YWxzKGNvbXApID8gIlx0KCpjb21wKikiIDogIiIpCiAgICAJCQkJKTsKICAgIAkJCX0KICAgIAkJfQogICAgCQkKICAgIAkJLy8gY2hlY2sgdGhhdCB6ZXJvcyBvcHRpbWl6YXRpb24gZG9lc24ndCBtZXNzIHVwLgogICAgCQkvKgogICAgCQlpZiAodHJ1ZSkgewogICAgCQkJaXQucmVzZXQoKTsKICAgIAkJCWl0U2V0LmNsZWFyKCk7CiAgICAJCQl3aGlsZSAodHJ1ZSkgewogICAgCQkJCVN0cmluZyBpdGVtID0gaXQubmV4dCgpOwogICAgCQkJCWlmIChpdGVtID09IG51bGwpIGJyZWFrOwogICAgCQkJCWl0U2V0LmFkZChpdGVtKTsKICAgIAkJCX0KICAgIAkJCXNsb3dJdC5zZXRTb3VyY2Uocyk7CiAgICAJCQlzbG93SXRTZXQuY2xlYXIoKTsKICAgIAkJCXdoaWxlICh0cnVlKSB7CiAgICAJCQkJU3RyaW5nIGl0ZW0gPSBzbG93SXQubmV4dCgpOwogICAgCQkJCWlmIChpdGVtID09IG51bGwpIGJyZWFrOwogICAgCQkJCXNsb3dJdFNldC5hZGQoaXRlbSk7CiAgICAJCQl9CiAgICAJCQlpZiAoIWl0U2V0LmVxdWFscyhzbG93SXRTZXQpKSB7CiAgICAJCQkJZXJybG4oIlplcm8gb3B0aW1pemF0aW9uIGZhaWx1cmUgd2l0aCAiICsgZ2V0UmVhZGFibGUocykpOwogICAgCQkJfQogICAgCQl9CiAgICAJCSovCiAgICAJCQogICAgCQltaXhlZENvdW50ZXIrKzsKICAgIAkJaWYgKCFnb3RTb3VyY2UgfHwgIWdvdERlY29tcCB8fCAhZ290Q29tcCkgewogICAgCQkJZXJybG4oIkZBSUwgQ2Fub25pY2FsSXRlcmF0b3I6ICIgKyBzKTsKICAgIAkJfQogICAgCX0KICAgIH0KICAgIAogICAgcHVibGljIGludCBUZXN0U3BlZWQoKSB7CiAgICAgICAgIC8vIHNraXAgdW5sZXNzIHZlcmJvc2UKICAgICAgICBpZiAoIWlzVmVyYm9zZSgpKSByZXR1cm4gMDsKCiAgIAkJU3RyaW5nIHMgPSAiXHVBQzAxXHUwMzQ1IjsKICAgCQkKICAgIAlDYW5vbmljYWxJdGVyYXRvciBpdCA9IG5ldyBDYW5vbmljYWxJdGVyYXRvcihzKTsKICAgIAlkb3VibGUgc3RhcnQsIGVuZDsKICAgIAlpbnQgeCA9IDA7IC8vIGp1c3QgdG8ga2VlcCBjb2RlIGZyb20gb3B0aW1pemluZyBhd2F5LgogICAgCWludCBpdGVyYXRpb25zID0gMTAwMDA7CiAgICAJZG91YmxlIHNsb3dEZWx0YSA9IDA7CiAgICAJCiAgICAJLyoKICAgIAlDYW5vbmljYWxJdGVyYXRvciBzbG93SXQgPSBuZXcgQ2Fub25pY2FsSXRlcmF0b3Iocyk7CiAgICAJc2xvd0l0LlNLSVBfWkVST1MgPSBmYWxzZTsKCiAgICAJc3RhcnQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKICAgIAlmb3IgKGludCBpID0gMDsgaSA8IGl0ZXJhdGlvbnM7ICsraSkgewogICAgCQlzbG93SXQuc2V0U291cmNlKHMpOwogICAgCQl3aGlsZSAodHJ1ZSkgewogICAgCQkJU3RyaW5nIGl0ZW0gPSBzbG93SXQubmV4dCgpOwogICAgCQkJaWYgKGl0ZW0gPT0gbnVsbCkgYnJlYWs7CiAgICAJCQl4ICs9IGl0ZW0ubGVuZ3RoKCk7CiAgICAJCX0KICAgIAl9CiAgICAJZW5kID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CiAgICAJZG91YmxlIHNsb3dEZWx0YSA9IChlbmQtc3RhcnQpIC8gaXRlcmF0aW9uczsKICAgIAlsb2dsbigiU2xvdyBpdGVyYXRpb246ICIgKyBzbG93RGVsdGEpOwogICAgCSovCgogICAgCXN0YXJ0ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CiAgICAJZm9yIChpbnQgaSA9IDA7IGkgPCBpdGVyYXRpb25zOyArK2kpIHsKICAgIAkJaXQuc2V0U291cmNlKHMpOwogICAgCQl3aGlsZSAodHJ1ZSkgewogICAgCQkJU3RyaW5nIGl0ZW0gPSBpdC5uZXh0KCk7CiAgICAJCQlpZiAoaXRlbSA9PSBudWxsKSBicmVhazsKICAgIAkJCXggKz0gaXRlbS5sZW5ndGgoKTsKICAgIAkJfQogICAgCX0KICAgIAllbmQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKICAgIAlkb3VibGUgZmFzdERlbHRhID0gKGVuZC1zdGFydCkgLyBpdGVyYXRpb25zOwogICAgCWxvZ2xuKCJGYXN0IGl0ZXJhdGlvbjogIiArIGZhc3REZWx0YSArIChzbG93RGVsdGEgIT0gMCA/ICIsICIgKyAoZmFzdERlbHRhL3Nsb3dEZWx0YSkgOiAiIikpOwogICAgCQogICAgCQogICAgCXJldHVybiB4OwogICAgfQogICAgCiAgICBwdWJsaWMgdm9pZCBUZXN0QmFzaWMoKSB7Ci8vICAgICAgVGhpcyBpcyBub3QgaW50ZXJlc3RpbmcgYW55bW9yZSBhcyB0aGUgZGF0YSBpcyBhbHJlYWR5IGJ1aWx0IAovLyAgICAgIGJlZm9yZWhhbmQKCi8vICAgICAgICBjaGVjayBidWlsZAovLyAgICAgICAgVW5pY29kZVNldCBzcyA9IENhbm9uaWNhbEl0ZXJhdG9yLmdldFNhZmVTdGFydCgpOwovLyAgICAgICAgbG9nbG4oIlNhZmUgU3RhcnQ6ICIgKyBzcy50b1BhdHRlcm4odHJ1ZSkpOwovLyAgICAgICAgc3MgPSBDYW5vbmljYWxJdGVyYXRvci5nZXRTdGFydHMoJ2EnKTsKLy8gICAgICAgIGV4cGVjdEVxdWFsKCJDaGFyYWN0ZXJzIHdpdGggJ2EnIGF0IHRoZSBzdGFydCBvZiB0aGVpciBkZWNvbXBvc2l0aW9uOiAiLCAiIiwgQ2Fub25pY2FsSXRlcmF0b3IuZ2V0U3RhcnRzKCdhJyksCi8vICAgICAgICAJbmV3IFVuaWNvZGVTZXQoIltcdTAwRTAtXHUwMEU1XHUwMTAxXHUwMTAzXHUwMTA1XHUwMUNFXHUwMURGXHUwMUUxXHUwMUZCIgovLyAgICAgICAgCSsgIlx1MDIwMVx1MDIwM1x1MDIyN1x1MUUwMVx1MUVBMVx1MUVBM1x1MUVBNVx1MUVBN1x1MUVBOVx1MUVBQlx1MUVBRFx1MUVBRlx1MUVCMVx1MUVCM1x1MUVCNVx1MUVCN10iKQovLyAgICAgICAgCQkpOwogICAgICAgIAogICAgICAgIC8vIGNoZWNrIHBlcm11dGUKICAgICAgICAvLyBOT1RFOiB3ZSB1c2UgYSBUcmVlU2V0IGJlbG93IHRvIHNvcnQgdGhlIG91dHB1dCwgd2hpY2ggaXMgbm90IGd1YXJhbnRlZWQgdG8gYmUgc29ydGVkIQogICAgICAgIAogICAgICAgIFNldCByZXN1bHRzID0gbmV3IFRyZWVTZXQoKTsKICAgICAgICBDYW5vbmljYWxJdGVyYXRvci5wZXJtdXRlKCJBQkMiLCBmYWxzZSwgcmVzdWx0cyk7CiAgICAgICAgZXhwZWN0RXF1YWwoIlNpbXBsZSBwZXJtdXRhdGlvbiAiLCAiIiwgY29sbGVjdGlvblRvU3RyaW5nKHJlc3VsdHMpLCAiQUJDLCBBQ0IsIEJBQywgQkNBLCBDQUIsIENCQSIpOwogICAgICAgIAogICAgICAgIC8vIHRyeSBzYW1wbGVzCiAgICAgICAgU29ydGVkU2V0IHNldCA9IG5ldyBUcmVlU2V0KCk7CiAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0ZXN0QXJyYXkubGVuZ3RoOyArK2kpIHsKICAgICAgICAgICAgLy9sb2dsbigiUmVzdWx0cyBmb3I6ICIgKyBuYW1lLnRyYW5zbGl0ZXJhdGUodGVzdEFycmF5W2ldKSk7CiAgICAgICAgICAgIENhbm9uaWNhbEl0ZXJhdG9yIGl0ID0gbmV3IENhbm9uaWNhbEl0ZXJhdG9yKHRlc3RBcnJheVtpXVswXSk7CiAgICAgICAgICAgIGludCBjb3VudGVyID0gMDsKICAgICAgICAgICAgc2V0LmNsZWFyKCk7CiAgICAgICAgICAgIHdoaWxlICh0cnVlKSB7CiAgICAgICAgICAgICAgICBTdHJpbmcgcmVzdWx0ID0gaXQubmV4dCgpOwogICAgICAgICAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKSBicmVhazsKICAgICAgICAgICAgICAgIHNldC5hZGQocmVzdWx0KTsgLy8gc29ydCB0aGVtCiAgICAgICAgICAgICAgICAvL2xvZ2xuKCsrY291bnRlciArICI6ICIgKyBoZXgudHJhbnNsaXRlcmF0ZShyZXN1bHQpKTsKICAgICAgICAgICAgICAgIC8vbG9nbG4oIiA9ICIgKyBuYW1lLnRyYW5zbGl0ZXJhdGUocmVzdWx0KSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZXhwZWN0RXF1YWwoaSArICI6ICIsIHRlc3RBcnJheVtpXVswXSwgY29sbGVjdGlvblRvU3RyaW5nKHNldCksIHRlc3RBcnJheVtpXVsxXSk7CgogICAgICAgIH0KICAgIH0KICAgIAogICAgcHVibGljIHZvaWQgZXhwZWN0RXF1YWwoU3RyaW5nIG1lc3NhZ2UsIFN0cmluZyBpdGVtLCBPYmplY3QgYSwgT2JqZWN0IGIpIHsKICAgIAlpZiAoIWEuZXF1YWxzKGIpKSB7CiAgICAJCWVycmxuKCJGQUlMOiAiICsgbWVzc2FnZSArIGdldFJlYWRhYmxlKGl0ZW0pKTsKICAgIAkJZXJybG4oIlx0IiArIGdldFJlYWRhYmxlKGEpKTsKICAgIAkJZXJybG4oIlx0IiArIGdldFJlYWRhYmxlKGIpKTsKICAgIAl9IGVsc2UgewogICAgCQlsb2dsbigiQ2hlY2tlZDogIiArIG1lc3NhZ2UgKyBnZXRSZWFkYWJsZShpdGVtKSk7CiAgICAJCWxvZ2xuKCJcdCIgKyBnZXRSZWFkYWJsZShhKSk7CiAgICAJCWxvZ2xuKCJcdCIgKyBnZXRSZWFkYWJsZShiKSk7CiAgICAJfQogICAgfQogICAgCiAgICBUcmFuc2xpdGVyYXRvciBuYW1lID0gbnVsbDsKICAgIFRyYW5zbGl0ZXJhdG9yIGhleCA9IG51bGw7CiAgICAgICAgCiAgICBwdWJsaWMgU3RyaW5nIGdldFJlYWRhYmxlKE9iamVjdCBvYmopIHsKICAgIAlpZiAob2JqID09IG51bGwpIHJldHVybiAibnVsbCI7CiAgICAJU3RyaW5nIHMgPSBvYmoudG9TdHJpbmcoKTsKICAgIAlpZiAocy5sZW5ndGgoKSA9PSAwKSByZXR1cm4gIiI7CiAgICAgICAgLy8gc2V0IHVwIGZvciByZWFkYWJsZSBkaXNwbGF5CiAgICAgICAgaWYgKG5hbWUgPT0gbnVsbCkgbmFtZSA9IFRyYW5zbGl0ZXJhdG9yLmdldEluc3RhbmNlKCJbXlxcIC1cXHUwMDdGXSBuYW1lIik7CiAgICAgICAgaWYgKGhleCA9PSBudWxsKSBoZXggPSBUcmFuc2xpdGVyYXRvci5nZXRJbnN0YW5jZSgiW15cXCAtXFx1MDA3Rl0gaGV4Iik7CiAgICAgICAgcmV0dXJuICJbIiArIChTSE9XX05BTUVTID8gbmFtZS50cmFuc2xpdGVyYXRlKHMpICsgIjsgIiA6ICIiKSArIGhleC50cmFuc2xpdGVyYXRlKHMpICsgIl0iOwogICAgfQogICAgCiAgICBzdGF0aWMgU3RyaW5nIGNvbGxlY3Rpb25Ub1N0cmluZyhDb2xsZWN0aW9uIGNvbCkgewogICAgICAgIFN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CiAgICAgICAgSXRlcmF0b3IgaXQgPSBjb2wuaXRlcmF0b3IoKTsKICAgICAgICB3aGlsZSAoaXQuaGFzTmV4dCgpKSB7CiAgICAgICAgICAgIGlmIChyZXN1bHQubGVuZ3RoKCkgIT0gMCkgcmVzdWx0LmFwcGVuZCgiLCAiKTsKICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChpdC5uZXh0KCkudG9TdHJpbmcoKSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKICAgIH0KfQ==